diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000000..241a06879e7 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + root: true, + env: { + browser: true, + node: true, + }, + parserOptions: { + ecmaVersion: 2016, + project: './tsconfig.base.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + extends: ['eslint-config-base-web3/ts'], + settings: { + 'import/resolver': { + typescript: {}, // this loads tsconfig.json to eslint + }, + }, +}; diff --git a/.eslintrc.test.js b/.eslintrc.test.js new file mode 100644 index 00000000000..c7c7cc047b0 --- /dev/null +++ b/.eslintrc.test.js @@ -0,0 +1,7 @@ +module.exports = { + parserOptions: { + project: './tsconfig.base.json', + tsconfigRootDir: __dirname, + }, + extends: ['eslint-config-base-web3/ts-jest'], +}; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000000..ed6a5bfe2af --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,5 @@ +# For details about the contents of this file, see +# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners + +# Automatically assigns members of the web3.js team to new pending PRs as reviewers +* @avkos @jdevcs @luu-alex @Muhammad-Altabba diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..9ebc3e40d6c --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behaviour that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behaviour by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behaviour and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behaviour. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviours that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at info@chainsafe.io. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq \ No newline at end of file diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000000..2702e75d4d2 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,99 @@ +# Contributing + +Thank you for contributing to Web3.js! We appreciate your interest and welcome any contributions that can help improve our documentation, functionality, address bugs, or any other aspects that can contribute to the overall improvement of our project. Before you start contributing, please take a moment to review the guidelines below. + +## Help and Support + +If you face any issues while contributing or want any type of support, we encourage you to join our [Discord Community](https://discord.com/invite/3shNX8cqGR), ask any question in the `#web3js-general` channel, and/or submit a [new issue](https://github.com/web3/web3.js/issues/new). + +## Prerequisites + +- [NodeJS](https://nodejs.org/) (LTS) +- [Yarn](https://yarnpkg.com/) + +## Contributing to the docs + +1. **Fork the docs:** Start by forking our repository to your GitHub account. + +2. **Clone the repo:** Clone the forked repository to your local machine using the following command: +```bash +git clone https://github.com/your-username/web3.js.git +``` +3. **Create a Branch:** Create a new branch for your changes with a descriptive name. + **NOTE: The branch name must include the issue number (if there is no issue created for your contribution, please create one).** +```bash +git checkout -b issue-name-1234 +``` +4. **Navigate to the docs folder:** `cd web3.js/docs/docs` + +5. **Install dependencies:** +```bash +yarn +``` +6. **Make your changes:**... + +7. Check changes in the local environment: Run the command `yarn start` and you'll see a local environment in `localhost:3000` with the documents. + +8. **Commit your changes:** `git add .` and `git commit -m 'descriptive msg'` + +9. **Push your changes:** +```bash +git push origin branch-name +``` + +10. **Open a Pull Request (PR):** Provide a detailed description of your changes, the problem you are solving, and any additional context (you can use the PR template). + +11. **Wait for review**: Before merging any branch into the main branch, it must be approved by two devs, after it is successfully approved, you can `Squash and merge` your branch, Please be responsive to any feedback on your pull request and make necessary changes based on the review. + +## Guidelines for Pull Requests and Releases (Web3 4.x) + +This document provides some ground rules for contributors (including the maintainer(s) of +the project) about how to make, review and publish changes to 4.x. The most basic requirement is +that **Web3 not break**. + +### Pull Requests for substantive changes (e.g. everything except comments and docs) + +1. Any PR that introduces a logic change should include tests. (In many cases, the tests will take more time to write than the actual code). +1. All PRs should sit for 72 hours with the `please review` tag to garner feedback. +1. No PR should be merged until it has been reviewed, passes CI, and all reviews' comments are + addressed. +1. PRs should: + 1. have a narrow, well-defined focus. + 1. make the smallest set of changes possible to achieve their goal. + 1. include a clear description in the opening comment. + 1. preserve the conventions and stylistic consistency of any files they modify. +1. Given the choice between a conservative change that mostly works and an adventurous change that seems better but introduces uncertainty - prefer the conservative change. + +### Reviews + +The end goal of the review is to suggest useful improvements to the author. Reviews should finish with approval unless there are issues that would result in: + +1. Buggy behavior. +1. Undue maintenance burden. +1. Pessimisation (i.e. speed reduction or meaningful build-size increases). +1. Feature reduction (i.e. it removes some aspect of functionality that users rely on). +1. Avoidable risk (i.e. it's difficult to test or hard to anticipate the implications of, without + being strictly necessary to fix something broken). + +Read more in [Review Guidelines](./REVIEW.md). + +### Releases + +1. All releases should be proposed in a PR and subject to community review for a minimum of one week. +1. Release review periods should be accompanied by a published `rc` version which can be used for sanity checks / additional testing. +1. During release review, the code is frozen unless new changes are proposed, approved and merged. +1. Changes should trigger a new `rc` release and set the release clock back enough that reviewers have the time they need to test new changes. +1. Regular maintainers should manually test the `rc` against a Node project and the published + minified bundle in a browser context. An external reviewer should verify they've done the same. +1. A release PR must be approved at least by two known contributors to the web3.js project. + +Read more in the [Release Guidelines](./RELEASE.md). + +### Emergencies + +Emergency releases are allowed to shorten waiting periods depending on the severity of the issue. + +There is precedent set for this in the 1.2.6 release (see [#3351](https://github.com/ethereum/web3.js/pull/3351)), where the consensus view was to make the smallest change necessary to address the emergency while waiving the `rc` process (meaning many existing additions to master were excluded). + +This topic is under further org-wide discussion at [ethereum/js-organization#6](https://github.com/ethereum/js-organization/issues/6). + diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 5b5131e57e2..00000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,27 +0,0 @@ - - -#### Expected behavior - -#### Actual behavior - -#### Steps to reproduce the behavior - -1. [First step] -2. [Second step] -3. [and so on...] - -#### Logs - - - -#### Environment - - \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/issue-template.md b/.github/ISSUE_TEMPLATE/issue-template.md new file mode 100644 index 00000000000..e9fb9bed99a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-template.md @@ -0,0 +1,36 @@ +--- +name: Issue template +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + + + +#### Expected behavior + +#### Actual behavior + +#### Steps to reproduce the behavior + +1. [First step] +2. [Second step] +3. [and so on...] + +#### Logs + + + +#### Environment + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 03125db96c0..7ad07339c5c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ ## Description -Please include a summary of the changes and be sure to follow our [Contribution Guidelines](../CONTRIBUTIONS.md). +Please include a summary of the changes and be sure to follow our [Contribution Guidelines](https://github.com/web3/web3.js/blob/4.x/.github/CONTRIBUTING.md). + + //highlight-end + + + + +``` + +### 2. Create Button to Connect and Display Connected Address + +```html + + + + Metamask Connection + + + + + //highlight-start +

Metamask Connection

+ + + + + +

null

+ //highlight-end + + +``` + +### 3. Implement Script to Connect Metamask + +```html + + + + Metamask Connection + + + + +

Metamask Connection

+ + + + + +

null

+ + //highlight-start + + //highlight-end + + + +``` + + \ No newline at end of file diff --git a/docs/docs/guides/glossary/index.md b/docs/docs/guides/glossary/index.md new file mode 100644 index 00000000000..e8962c28966 --- /dev/null +++ b/docs/docs/guides/glossary/index.md @@ -0,0 +1,110 @@ +--- +sidebar_position: 14 +sidebar_label: '📖 Glossary' +title: Glossary +--- + + +## Provider + +In web3.js, a `provider` is an object responsible for enabling connectivity with the Ethereum network in various ways. Providers facilitate the connection of your web application to an Ethereum node, different provider types are available in web3.js(HTTP, WebSocket and IPC), each with its own features and use cases. **It's important to note that a provider itself only provides read-only access to the blockchain.** It does not use any private keys or accounts for interaction. This read-only functionality is particularly useful for querying data and making calls to the blockchain without the need for private key authorization. + +## Accounts + +In web3.js, an `account` allows you to perform operations on the blockchain, such as sending transactions, signing data, and interacting with contracts. It serves as the key component for **using a private key** directly to execute various blockchain operations. In other libraries, this concept is often referred to as a `signer`. This versatility in terminology doesn't change its fundamental purpose, providing a secure and straightforward means to manage Ethereum-related operations. + + +## Wallet + +A `wallet` in web3.js can store multiple `accounts`. This feature allows you to manage various private keys for different operations. When using methods such as `web3.eth.sendTransaction()` or `web3.eth.contract.methods.doSomething().send({})`, the web3.js library handles these transactions using the wallet accounts under the hood. Essentially, the wallet makes it easier to coordinate multiple accounts for smoother Ethereum operations. + + +## Contract + +The `Contract` class is an important class in the `web3-eth-contract` package, also available in the `web3` package. It serves as an abstraction representing a connection to a specific contract on the Ethereum Network, enabling applications to interact with it as a typical JavaScript object. Through the `Contract` class, you can execute functions and listen to events associated with the smart contract (e.g, `contract.methods.doSomething().call()`) + +## JSON Interface (ABI) + +The JSON interface is a `JSON` object describing the [Application Binary Interface (ABI)](https://docs.soliditylang.org/en/develop/abi-spec.html) for an Ethereum smart contract. + +Using this JSON interface, web3.js is able to create a JavaScript object representing the smart contract , its methods and events using the `web3.eth.Contract` object. + +### Functions + +- `type`: `"function"`, `"constructor"` (can be omitted, defaulting to `"function"`; `"fallback"` also possible but not relevant in web3.js); +- `name`: the name of the function (only present for function types); +- `constant`: `true` if function is specified to not modify the blockchain state; +- `payable`: `true` if function accepts ether, defaults to false; +- `stateMutability`: a `string` with one of the following values: `"pure"` (specified to not read blockchain state), `"view"` (same as constant above), `"non-payable"` and `"payable"` (same as payable above); +- `inputs`: an `Array of objects`, each of which contains: + -- `name`: the name of the parameter; + -- `type`: the canonical type of the parameter. +- `outputs`: an `Array of objects`, same as inputs, can be omitted if no outputs exist. + +### Events + +- `type`: always `"event"` +- `name`: the name of the event; +- `inputs`: an `Array of objects`, each of which contains: + + - `name`: the name of the parameter; + + - `type`: the canonical type of the parameter. + + - `indexed`: `true` if the field is part of the log’s topics, false if it is one of the log’s data segment. + + - `anonymous`: `true` if the event was declared as anonymous. + +#### Example + +```solidity title='Solidity Contract' +pragma solidity ^0.8.4; + +contract Test { + uint256 a; + address d = 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF; + + constructor(uint256 testInt) { + a = testInt; + } + + event Event(uint256 indexed b, bytes32 c); + + event Event2(uint256 indexed b, bytes32 c); + + function foo(uint256 b, bytes32 c) public returns (address) { + emit Event(b, c); + return d; + } +} + +``` + +```json title='Resulting JSON ABI' +[ + { + "type": "constructor", + "stateMutability": "nonpayable", + "inputs": [{"internalType":"uint256","name":"testInt","type":"uint256"}], + }, + { + "type": "event", + "name": "Event", + "inputs": [{"indexed":true,"internalType":"uint256","name":"b","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"c","type":"bytes32"}], + "anonymous": false, + }, + { + "type": "event", + "name": "Event2", + "inputs": [{"indexed":true,"internalType":"uint256","name":"b","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"c","type":"bytes32"}], + "anonymous": false, + }, + { + "type": "function", + "name": "foo", + "stateMutability": "nonpayable", + "inputs": [{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"bytes32","name":"c","type":"bytes32"}], + "outputs": [{"internalType":"address","name":"","type":"address"}], + } +] +``` diff --git a/docs/docs/guides/hardhat_tutorial/_category_.yml b/docs/docs/guides/hardhat_tutorial/_category_.yml new file mode 100644 index 00000000000..dfd158abb00 --- /dev/null +++ b/docs/docs/guides/hardhat_tutorial/_category_.yml @@ -0,0 +1,5 @@ +label: '⛑️ Hardhat Tutorial' +collapsible: true +collapsed: true +link: null +position: 2 diff --git a/docs/docs/guides/hardhat_tutorial/asset/artifacts.png b/docs/docs/guides/hardhat_tutorial/asset/artifacts.png new file mode 100644 index 00000000000..55271c0126f Binary files /dev/null and b/docs/docs/guides/hardhat_tutorial/asset/artifacts.png differ diff --git a/docs/docs/guides/hardhat_tutorial/asset/image_2.png b/docs/docs/guides/hardhat_tutorial/asset/image_2.png new file mode 100644 index 00000000000..1bcb5160790 Binary files /dev/null and b/docs/docs/guides/hardhat_tutorial/asset/image_2.png differ diff --git a/docs/docs/guides/hardhat_tutorial/asset/image_3.png b/docs/docs/guides/hardhat_tutorial/asset/image_3.png new file mode 100644 index 00000000000..9785cac83e0 Binary files /dev/null and b/docs/docs/guides/hardhat_tutorial/asset/image_3.png differ diff --git a/docs/docs/guides/hardhat_tutorial/index.md b/docs/docs/guides/hardhat_tutorial/index.md new file mode 100644 index 00000000000..9109004467c --- /dev/null +++ b/docs/docs/guides/hardhat_tutorial/index.md @@ -0,0 +1,304 @@ +--- +sidebar_position: 1 +sidebar_label: Web3.js v4 with Hardhat +--- + +# Using Web3 With Hardhat + +## Introduction +Following the recent compatibility update of Hardhat plugin [hardhat-web3-v4](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-web3-v4), `Web3.Js` is now available to use as plugin in Hardhat. + +This tutorial will guide you through using Web3js as a plugin to interact with the Blockchain. + +## Pre-requisite +This tutorial assumes you have previous knowledge of writing Smart contracts, and are convenient working with JavaScript/TypeScript. You should have [NodeJS](https://nodejs.org/en) version greater than v16 installed. + +:::note +To install dependencies, we will use `NPM`. +::: + +## Steps +- [Initiate a Hardhat project](#initiate-a-hardhat-project) +- [Install required dependencies (including `hardhat-web3-v4`)](#install-required-dependencies-including-hardhat-web3-v4) +- [Write the Smart Contract](#write-the-smart-contract) +- [Compile and deploying the contract](#compile-test-and-deploy-the-contract) +- [Testing and interacting with the contract](#testing-and-interacting-with-the-contract) + +### Initiate a Hardhat project +Create a new project folder and navigate into it. + +```bash +mkdir myproject +``` + +```bash +cd myproject +``` + +Install and instantiate Hardhat in the current project. + +```bash +npm install hardhat +``` + +```bash +npx hardhat init +``` + +![images](./asset/image_3.png) + +### Install required dependencies (including `hardhat-web3-v4`) + +Select `TypeScript` and `Yes` for the rest of the options. +You will be prompted to install the required dependencies. Reply `yes` to complete the installation. +To include the `Hardhat-web3-v4` plugin, we will install it via `npm`. + +```bash +npm install --save-dev @nomicfoundation/hardhat-web3-v4 'web3@4' +``` + +This will add Web3.Js to your project by including it in the 'node_modules' folder. To extend the Hardhat functionality with this plugin, we have to import the `web3-v4 plugin` in the Hardhat configuration file `hardhat.config.ts`. Import this at the top of the config file. + +```ts +import { HardhatUserConfig } from "hardhat/config"; +import "@nomicfoundation/hardhat-toolbox"; +import "@nomicfoundation/hardhat-web3-v4"; // <================ + +const config: HardhatUserConfig = { + solidity: "0.8.19", +}; + +export default config; + +``` + +By default, `hardhat-toolbox` is added to the file. You will need to explicitly invoke the plugin. This will modify the Hardhat Run-time Environment - HRE and to include both the Web3 class and an instantiated web3 object. With the latter, you get a modified ready-to-use web3 object can comes with an initialized local/Hardhat provider. The object will be available to use anywhere in the project such as testing and deployment files. + +### Write the Smart Contract +When you start a new project, Hardhat provides a sample `Lock` contracts. Please refer to the contract in `myproject/contracts/Lock.sol` file. + +```ts + // SPDX-License-Identifier: UNLICENSED + pragma solidity ^0.8.9; + + // Uncomment this line to use console.log + // import "hardhat/console.sol"; + + contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } + } + +``` + +`Lock.sol` is a simple timeLock contract capable of accepting any amount of `Ether` at deployment while expecting one parameter that will be assigned to a state variable when deployed. The `withdraw` function allows only the address marked as `owner` to withdraw the total contract balance only if the 'unlockTime' is not in the future. + +### Compile, test and deploy the contract +- Compile and deploying the contract + +```bash +npx hardhat compile +``` +Running the above command will generate a folder called `artifacts` containing the build information and the compiled contracts. From this directory, we will require the jasonInterface otherwise called the Application Binary Interface - ABI during testing and deployment. + +![images](./asset/artifacts.png) + +To deploy the contract, we will modify the `script/deploy.ts` file as shown below. + +First, we import the initialized web3 object from hardhat. Next we get the artifacts. + +```ts +import { web3 } from "hardhat"; +import artifacts from "../artifacts/contracts/Lock.sol/Lock.json"; + +async function main() { + +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); + +``` + +Inside the main function, we prepare the deployment using a few of the web3.Js functionalities such as the `.utils` and `.eth` modules. + +```ts +async function main() { + const currentTimestampInSeconds = Math.round(Date.now() / 1000); + const unlockTime = currentTimestampInSeconds + 60; + + const lockedAmount = web3.utils.toWei("0.001", 'ether'); + + const [deployer] = await web3.eth.getAccounts(); + const lockContract = new web3.eth.Contract(artifacts.abi); + const rawContract = lockContract.deploy({ + data: artifacts.bytecode, + arguments: [unlockTime], + }); + + const lock = await rawContract.send({ + from: deployer, + gasPrice: "10000000000", + value: lockedAmount.toString() + }); + + console.log( + `Lock with ${web3.utils.toWei( + lockedAmount, + 'ether' + )}ETH and unlock timestamp ${unlockTime} deployed to ${lock.options.address}` + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); +``` +Running the following command will deploy the `Lock` contract to a local Blockchain built into Hardhat. We use Web3.Js to talk to the Blockchain to broadcast our smart contract data to the network. + +```bash +npx hardhat run scripts/deploy.ts +``` + +### Testing and interacting with the contract + +In the previous steps, we compiled and deployed the contract to the local Blockchain network. It's time to test our contract ensuring it performs as expected. Since we used Web3.Js to talk to the Blockchain to broadcast and save our data, we will use same protocol to view and modify the data. + +In the `myproject/test/Lock.ts` file, replace the content with the code below. + +```ts + import { + time, + loadFixture, + } from "@nomicfoundation/hardhat-toolbox/network-helpers"; + import { expect } from "chai"; + import { web3 } from "hardhat"; + import artifacts from "../artifacts/contracts/Lock.sol/Lock.json"; + + describe("Lock", function () { + async function deployOneYearLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = ONE_GWEI; + const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; + + const lockContract = new web3.eth.Contract(artifacts.abi); + lockContract.handleRevert = true; + + const [deployer, otherAccount] = await web3.eth.getAccounts(); + const rawContract = lockContract.deploy({ + data: artifacts.bytecode, + arguments: [unlockTime], + }); + + // To know how much gas will be consumed, we can estimate it first. + const estimateGas = await rawContract.estimateGas({ + from: deployer, + value: lockedAmount.toString() + }); + + const lock = await rawContract.send({ + from: deployer, + gas: estimateGas.toString(), + gasPrice: "10000000000", + value: lockedAmount.toString() + }); + + console.log("Lock contract deployed to: ", lock.options.address); + return { lock, unlockTime, lockedAmount, deployer, otherAccount, rawContract }; + } + + describe("Deployment", function () { + it("Should set the right unlockTime", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + const setTime = await lock.methods.unlockTime().call(); + console.log("SetTime", setTime); + expect(setTime).to.equal(unlockTime); + }); + + it("Should set the right deployer", async function () { + const { lock, deployer } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.methods.owner().call()).to.equal(deployer); + }); + + it("Should receive and store the funds to lock", async function () { + const { lock, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + const balance = await web3.eth.getBalance(String(lock.options.address)); + expect(balance).to.equal(lockedAmount); + }); + + it("Shouldn't fail if the unlockTime has arrived and the deployer calls it", async function () { + const { lock, unlockTime, deployer } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + await expect(lock.methods.withdraw().send({from: deployer})).not.to.be.reverted; + }); + }); + }); + +``` + +in this file, we performed similar steps as in the deployment script to prepare and deploy the contract using the `ABI` and `bytecode` in `deployOneYearLockFixture()`. To read the `owner` data from the Blockchain, we used an instance of the deployed contract i.e `lock.methods.owner().call().`Invoking `.call()` does not change the state of the blockchain hence no wallet signature is required. + +To change the status of the data we previously saved, we have to access the `method` container for the function (s) we desire and invoke the `.send` to broadcast our intention to the network `lock.methods.withdraw().send({from: deployer})`. + +:::note +When using `.send()`, you must explicitly provide the `sender` of the transaction in the `from` field (in the above example is the address of the `deployer` account). +::: + + +To run the test you can use the command +```bash +npx hardhat test test/Lock.ts +``` + +And you'll get a similar result to this: +```js +/* +Lock + Deployment +Lock contract deployed to: 0x5FbDB2315678afecb367f032d93F642f64180aa3 +SetTime 1739193193n + ✔ Should set the right unlockTime (884ms) + ✔ Should set the right deployer (54ms) + ✔ Should receive and store the funds to lock + ✔ Shouldn't fail if the unlockTime has arrived and the deployer calls it +*/ +``` diff --git a/docs/docs/guides/migration_from_other_libs/_category_.yml b/docs/docs/guides/migration_from_other_libs/_category_.yml new file mode 100644 index 00000000000..dc10487c990 --- /dev/null +++ b/docs/docs/guides/migration_from_other_libs/_category_.yml @@ -0,0 +1,5 @@ +label: '🔄 Migration Guides' +collapsible: true +collapsed: true +link: null +position: 11 \ No newline at end of file diff --git a/docs/docs/guides/migration_from_other_libs/ethers.md b/docs/docs/guides/migration_from_other_libs/ethers.md new file mode 100644 index 00000000000..3d924499972 --- /dev/null +++ b/docs/docs/guides/migration_from_other_libs/ethers.md @@ -0,0 +1,476 @@ +--- +sidebar_position: 1 +sidebar_label: 'Migration from ethers.js' +title: 'Migration from ethers.js' +--- + +Follow this guide, if you're currently using the ethers.js library to interact with the Ethereum blockchain and want to migrate to web3.js. This guide is for ethers v5 and v6. And, if there are differences, code for both would be provided. And, if you find something missing, or worth adding, feel free to open a PR, please. + +However, migrating from a library to another would usually need careful changes. But, ethers.js have lots of similarities with web3.js and migration would usually be easy and straightforward. However, you still need to check your code for possible tweaks as needed. + +## Installation + +First, install the latest version of web3.js: + +```bash +npm install web3 +``` + +## Providers + +### Initialization and Calling RPC Methods + +With ethers.js, you would get the last block number from a provider like this: + +```typescript +import { ethers } from 'ethers'; + +// in v5: +const provider = new ethers.providers.JsonRpcProvider(url); + +// in v6: +const provider = new ethers.JsonRpcProvider(url); + +const blockNumber = provider.getBlockNumber(); + +// outputs something like: 18561956 +blockNumber.then(console.log); +``` + +With web3.js, you would get the last block number from a provider like this: + +```typescript +import { Web3 } from 'web3'; + +const web3 = new Web3(url); +const blockNumber = web3.eth.getBlockNumber(); + +// outputs something like: 18561956n +blockNumber.then(console.log); +``` + +:::tip +📝 web3.js uses `bigint` as the default type for all big numbers returned. For, this you see above the blocknumber has the `n` at its end (`18561956n`). However, you can change the returned type by passing an optional parameter like: +::: +```ts title='BigInt Tip' +import { Web3, DEFAULT_RETURN_FORMAT, FMT_NUMBER } from 'web3'; + +const blockNumber = web3.eth.getBlockNumber({ + ...DEFAULT_RETURN_FORMAT, + number: FMT_NUMBER.HEX, // to get the block number in hex format +}); +// outputs something like: 0x11B3BA4 +blockNumber.then(console.log); + + +const blockNumber = web3.eth.getBlockNumber({ + ...DEFAULT_RETURN_FORMAT, + number: FMT_NUMBER.STR, // to get the block number as a string +}); +// the value would like: '18561956' +blockNumber.then(console.log); +``` + +### Use browser-injected provider + +With ethers.js: + +```typescript +// in v5 +const provider = new ethers.providers.Web3Provider(window.ethereum); + +// in v6 +const provider = new ethers.BrowserProvider(window.ethereum); +``` + +With web3.js: + +```typescript +const web3 = new Web3(window.ethereum); +``` + + +## Wallets and Accounts + +### Generate Private Key + +With ethers.js: + +```typescript +// this would generate a private key similar to: +// '0x286f65c4191759fc5c7e6083b8c275ac2238cc7abb5915bd8c905ae4404215c9' +// (Be sure to store it encrypted in a safe place) +const privateKey = ethers.Wallet.createRandom().privateKey; +``` + +With web3.js: + +```typescript +// this would generate a private key similar to: +// '0x286f65c4191759fc5c7e6083b8c275ac2238cc7abb5915bd8c905ae4404215c9' +// (Be sure to store it encrypted in a safe place) +const privateKey = web3.eth.accounts.create().privateKey; +``` +### Create a wallet + +In ethers.js: + +```typescript +const wallet = new ethers.Wallet( + // A private key that you might had generated with: + // ethers.Wallet.createRandom().privateKey + privateKey, +); + +// outputs: 0x6f7D735dFB514AA1778E8D97EaCE72BfECE71865 +console.log(wallet.address); +``` + +With web3.js: + +```typescript +const web3 = new Web3(); +const wallet = web3.eth.accounts.wallet.add( + // you can generate a private key using web3.eth.accounts.create().privateKey + privateKey, +); + +// outputs: 0x6f7D735dFB514AA1778E8D97EaCE72BfECE71865 +console.log(wallet[0].address); +``` + +:::info + In web3.js, if you want to use a private key to later sign and send transactions, you first need to add this private key to the accounts with, for example, one of the methods: + `web3.eth.accounts.create()`, or `web3.eth.accounts.wallet.add(privateKey)`. + + And then whenever you provide the public address of that private key, web3.js will use that private key to sign. For example, you would pass the public key at `web3.eth.sendTransaction({from: publicAddress,...})` and web3.`eth.signTransaction({from: publicAddress,...})` then the privateKey of that publicAddress will be lookup and used to sign. + + However, it is not advised to use the privatekey directly. And you are advised to use a secret storage or a vault instead. +::: + +### Get unlocked account + +With ethers.js: + +```typescript +const signer = await provider.getSigner(); +``` + +With web3.js: + +```typescript +const account = (await web3.eth.getAccounts())[0]; +``` + + +### Signing a string message + +with ethers.js: + +```typescript +const signer = new ethers.Wallet(privateKey); + +const signature = await signer.signMessage('Some data'); +// Outputs something like: +// 0xb475e02218d7d6a16f3575de789996d0a57f900f240d73ed792672256d63913840c1da0dd3e7fe2e79485b7a1d81e8cc163f405c3df22d496f28f1dd148faebf1b +console.log(signature); + +``` + +With web3.js: + +```typescript + +// Sign with web3.js, using a private key: +const signature = web3.eth.accounts.sign('Some data', privateKey).signature; + +// Outputs something like: +// 0xb475e02218d7d6a16f3575de789996d0a57f900f240d73ed792672256d63913840c1da0dd3e7fe2e79485b7a1d81e8cc163f405c3df22d496f28f1dd148faebf1b +console.log(signature); + +// Sign using an account managed by the connected provider (for example the RPC client or a browser-injected provider) +const signature = await web3.eth.sign( + web3.utils.utf8ToHex('Some data'), // data to be signed (4.x only supports Hex Strings) + '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', // the address that its private key would be used to sign +); + +// Outputs something like: +// 0xb475e02218d7d6a16f3575de789996d0a57f900f240d73ed792672256d63913840c1da0dd3e7fe2e79485b7a1d81e8cc163f405c3df22d496f28f1dd148faebf1b +console.log(signature); +``` + +## Signing and Sending Transactions + +### Sending Transactions + +Sending a transaction with ethers.js: + +```typescript +const signer = new ethers.Wallet(privateKey, provider); + +const tx = await signer.sendTransaction({ + to: '0x92d3267215Ec56542b985473E73C8417403B15ac', + value: ethers.parseUnits('0.001', 'ether'), +}); +console.log(tx); +``` + +With web3.js: + +:::info +The method `web3.eth.sendTransaction` will use the account that you pass the public address at `from` to sign the transaction. + +So, the `from` needs to be the public address of a private key that you added previously to the web3.eth.accounts. Or, else, it would pass it to the provider where an unlocked account would be used. + +And for the case when you did not add the private key early, and so the `from` was just passed to the provider. Then if the provider was a browser-injected provider like metamask, for example, it will ask the user to sign. And, if you are using a local dev node as a provider, it should be one of the accounts that were already unlocked at the node. However, note that it is highly risky and not recommended to unlock an account at a production or even a test node. +::: + +```typescript +const web3 = new Web3(url); + +// The method web3.eth.sendTransaction is helpful if you are using a browser-injected provider like metamask. +// Or, if you are using a local dev node like ganache; and you have some accounts already unlocked at the node. +// And this is how you would get the first unlocked account from a local node (not advised for production or even on test node to use unlock accounts on the node). +const account = (await web3.eth.getAccounts())[0]; + +// Alternative to the above, here is how to add wallet to be used as a signer later: +const wallet = web3.eth.accounts.wallet.add(privateKey); +const account = wallet[0].address; + +const tx = await web3.eth.sendTransaction({ + from: account, + to: '0x92d3267215Ec56542b985473E73C8417403B15ac', + value: web3.utils.toWei('0.00000000001', 'ether'), +}); +console.log(tx); +``` + +### Sending a Signed Transactions + +Posting a signed transaction to the node with ethers.js: + +```typescript +// in v5 +provider.sendTransaction(signedTx) + +// in v6 +provider.broadcastTransaction(signedTx); +``` + +With web3.js: + +```typescript +const transaction: Transaction = { + from: senderPublicAddress, + to: receiverPublicAddress, + value: 1, + gas: 21000, + type: 0, +}; + +// you might also use below `web3.eth.personal.signMessage`, depending on your use case. +const signedTransaction = await web3.eth.accounts.signTransaction( + transaction, + privateKey, +); + +const tx = await web3.eth.sendSignedTransaction( + signedTransaction.rawTransaction, +); + +console.log(tx); +``` + + + +## Contracts + +### Contracts Deployment + +To deploy a contract in ethers.js you might have something like: + +```typescript +const signer = provider.getSigner(); +const factory = new ethers.ContractFactory(abi, bytecode, signer); +const contract = await factory.deploy('constructor param'); +console.log('contract address', contract.address); + +// wait for contract creation transaction to be mined +await contract.deployTransaction.wait(); +``` + +In web3.js: + +```typescript +const contractObject = new web3.eth.Contract(abi); +const deployedContract = await contractObject.deploy({ + data: bytecode, + arguments: ['constructor param'] +}).send({ + from: '0x12598d2Fd88B420ED571beFDA8dD112624B5E730', + gas: '1000000', + // other transaction's params +}); + +console.log('contract address', deployedContract.options.address) +``` + +:::tip +📝 To get the smart contract ABI, you are advised to check: [#Step 4: Compile the Solidity code using the Solidity Compiler and get its ABI and Bytecode](/guides/smart_contracts/smart_contracts_guide#step-4-compile-the-solidity-code-using-the-solidity-compiler-and-get-its-abi-and-bytecode) and [Infer Contract Types from JSON Artifact](/guides/smart_contracts/infer_contract_types/) +::: + + +### Calling Contracts' Methods + +To interact with contracts in ethers.js: + +```typescript +const contract = new ethers.Contract(CONTRACT_ADDRESS, ABI, providerOrSigner); +const result = await contract.someFunction(); +``` + +In web3.js: + +```typescript +const web3 = new Web3(provider); +const contract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS); + +// If the method was only to read form the Blockchain: +const result = await contract.methods.someFunction().call(); +// Or, if the method would need a transaction to be sent: +const result = await contract.methods.someFunction().send(); +``` + +#### Contracts Overloaded Methods + +In ethers.js: + +```typescript +// ethers +const abi = [ + 'function getMessage(string) public view returns (string)', + 'function getMessage() public view returns (string)' +] +const contract = new ethers.Contract(address, abi, signer); + +// for ambiguous functions (two functions with the same +// name), the signature must also be specified +message = await contract['getMessage(string)']('nice'); +// and to call the overladed method without a parameter: +message = await contract['getMessage()'](); + +// in v6 +contract.foo(Typed.string('nice')) +``` + +In web3.js: + +```typescript +// in web3.js the overloaded method implementation is automatically picked based on the passed datatype +message = await contract.methods.getMessage('nice').call(); +// To call the overladed method without a parameter: +message = await contract.methods.getMessage().call(); +``` + +### Gas Estimation + +To interact with contracts in ethers.js: + +```typescript +// Estimate the gas +contract.myMethod.estimateGas(123) +``` + +In web3.js: + +```typescript +// Estimate the gas +const gasAmount = await myContract.methods.myMethod(123).estimateGas( + { gas: 5000000, from: transactionSenderAddress } // optional +); +``` + + +### Handling Events + +Handling events with ethers.js: + +```typescript +contract.on('SomeEvent', (arg1, arg2, event) => { + // event handling +}); +``` + +With web3.js: + +```typescript +const event = contract.events.SomeEvent({ + filter: { + filter: { val: 100 }, + }, + fromBlock: 0, +}); + +event.on('data', resolve); +event.on('error', reject); +``` + + +## Utility methods + +### Hashing +Here is how to compute `keccak256` hash of a UTF-8 string with web3 and ethers. + + +With ethers.js: + +```typescript +// hash of a string +ethers.utils.id('hello world') +// hash of binary data +ethers.utils.keccak256('0x4242') +``` + +With web3.js: + +```typescript +// computes the Keccak-256 hash of the input and returns a hexstring: +// the `utils.sha3` accepts: string and Uint8Array +web3.utils.sha3('hello world'); +// the `utils.keccak256` accepts: string, Uint8Array, Numbers and ReadonlyArray +web3.utils.keccak256('hello world'); +``` + +### Ethers Conversion + +Here is how to convert from and to ether units. + +With ethers.js: + +```typescript +const fromWieToEther = ethers.formatEther('1000000000000000000'); +// outputs: 1.0 +console.log(fromWieToEther); + +const fromEtherToWie = ethers.parseEther('1.0'); +// outputs: 1000000000000000000n +console.log(fromEtherToWie); +``` + +With web3.js: + +```typescript +// the second parameter is 'the unit to convert to' +const fromWieToEther = Web3.utils.fromWei('1000000000000000000', 'ether'); +// outputs: 1 +console.log(fromWieToEther); + +// the second parameter is 'the unit of the number passed' +const fromEtherToWie = Web3.utils.toWei('1.0', 'ether'); +// outputs: 1000000000000000000 +console.log(fromEtherToWie); +``` + +## Conclusion + +This guide should provide a starting point for migrating from ethers.js to web3.js version 4.x. Remember to adapt the example code to your actual use case and verify the function arguments and setup as you migrate your application. And the official documentation of web3.js is your go-to resource for detailed information and updates. diff --git a/docs/docs/guides/resources/resources.md b/docs/docs/guides/resources/resources.md new file mode 100644 index 00000000000..0975f4ad3f2 --- /dev/null +++ b/docs/docs/guides/resources/resources.md @@ -0,0 +1,28 @@ +--- +sidebar_position: 16 +sidebar_label: '📚 Resources' +--- +# Resources + +## [Web3.js v4 course](https://www.youtube.com/watch?v=3ZO_t-Kyr1g&list=PLPn3rQCo3XrP4LbQcOyyHQR8McV7w3HZT) + +This comprehensive 14-part video course from ChainSafe equips you with the skills to conquer the blockchain using web3.js v4. Unlock the potential of web3.js v4 and build cutting-edge dApps. This course caters to all skill levels. + +[![Web3.js v4 course](https://img.youtube.com/vi/3ZO_t-Kyr1g/0.jpg)](https://www.youtube.com/watch?v=3ZO_t-Kyr1g&list=PLPn3rQCo3XrP4LbQcOyyHQR8McV7w3HZT) + + +## [Web3.js series](https://www.youtube.com/watch?v=BQ_bDH91S4k&list=PLPn3rQCo3XrNf__8irs4-MjMt4fJqW2I_) + +This series of 3 videos takes you on a journey through web3.js. Whether you're a complete beginner or want to refine your skills, these videos have something for you: + +1. Getting Started: Kick off your web3 adventure by learning the ropes of web3.js. Master the basics, from installation to making your first call to the blockchain. + +2. Essential Tools: Unleash the power of web3.js utilities! From generating random bytes to hashing and checksumming addresses, you'll gain mastery of essential tools for Ethereum development. + +3. Sending Transactions: Dive deep into wallets and accounts. Learn how to sign and send transactions to the network, empowering you to interact with the blockchain directly. + +[![Web3.js series](https://img.youtube.com/vi/BQ_bDH91S4k/0.jpg)](https://www.youtube.com/watch?v=BQ_bDH91S4k&list=PLPn3rQCo3XrNf__8irs4-MjMt4fJqW2I_) + +## Hackathons + +You'll find the latest hackathons opportunities by following [web3js](https://twitter.com/web3_js) on X. diff --git a/docs/docs/guides/smart_contracts/_category_.yml b/docs/docs/guides/smart_contracts/_category_.yml new file mode 100644 index 00000000000..6bf6e7694db --- /dev/null +++ b/docs/docs/guides/smart_contracts/_category_.yml @@ -0,0 +1,5 @@ +label: '📜 Smart Contracts' +collapsible: true +collapsed: true +link: null +position: 4 \ No newline at end of file diff --git a/docs/docs/guides/smart_contracts/index.md b/docs/docs/guides/smart_contracts/index.md new file mode 100644 index 00000000000..4cb6c9eed34 --- /dev/null +++ b/docs/docs/guides/smart_contracts/index.md @@ -0,0 +1,403 @@ +--- +sidebar_position: 1 +sidebar_label: 'Mastering Smart Contracts' +--- +# Mastering Smart Contracts + +## Live code editor + +### Deploy and Interact with smart contracts: + +This contract is deployed on the [mumbai testnet](https://mumbai.polygonscan.com/address/0xB9433C87349134892f6C9a9E342Ed6adce39F8dF). In this live code editor, you will find the following: + +In the code editor you'll find: +- `ContractCounter.sol`: the solidity code of the contract with: + - `uint256 number`: state variable of the contract. + - `increase()`: this function will increment by 1 the `number` variable. + - `getNumber()`: this function will return the current value of the `number` variable. +- `counterABI.json`: the ABI of the ContractCounter.sol +- `counterBytecode.json`: the compiled Bytecode of the ContractCounter.sol +- `main.js`: here you will find 3 funtions: + - `deploy()`: sample script to deploy the smart contract using the ABI and Bytecode + - `getNumber()`: sample script to call the reading function getNumber() of the smart contract + - `increase()`: sample script to interact with the increase() function of the smart contract + +- Contract address: +```bash +0xB9433C87349134892f6C9a9E342Ed6adce39F8dF +``` + + + + +## Contract class + +:::info +This guide expects you to have some basic knowledge. If you are just starting, it is recommended to first check out this [Tutorial: Deploying and Interacting with Smart Contracts](./smart_contracts_guide.md). +::: + +The `Contract` class is the main object exported by the `web3-eth-contract` package. It is also available in the `web3` package. + +### Importing the Contract Class + +To use the `Contract` class, you'll need to import it from one of two packages: directly from the `web3-eth-contract` package or from the `web3` package. + +Here's an example of importing from each: + +```ts +// Importing from web3-eth-contract package +import { Contract } from 'web3-eth-contract'; +const contract = new Contract(...); + +// Importing from the main web3 package +import { Contract } from 'web3'; +const contract = new Contract(...); + +// Importing from the main web3 package from inside `web3.eth` namespace +import { Web3 } from 'web3'; +const web3 = new Web3('http://127.0.0.1:8545'); +const contract = new web3.eth.Contract(...); + +// to set the provider for the contract instance: +contract.setProvider('http://127.0.0.1:7545'); +``` + + +### `Contract` vs `web3.eth.Contract` + +There is a way to create a contract object, other than the ones listed above. That is by accessing an instance of `Web3` object. And this instance of `Web3` is usually called `web3`. + +Actually, the `web3.eth.Contract` is typically how you access the class through a web3 instance that already has a provider setup and that may already has customized configurations. + +:::tip +1. Importing the `web3-eth-contract` module can be beneficial if you want to reduce the size of your application instead of importing the whole `Web3` module. + +2. Note the difference between `Web3.eth.Contract` and `web3instance.eth.Contract` (that is usually named `web3.eth.Contract`) is that the `Web3` (with capital `W`) is used to access the objects organized in namespaces. While `web3instance`, that is usually named `web3`, is to access the properties of this instance. +::: + +Examples: + +```ts +import { Contract } from 'web3-eth-contract'; + +// instantiating Contract directly with provider URL from Contract package +// alternatively, you can instantiate the Contract without a provider and set it later using contract.setProvider() +const abi = [{...}]; +const address = '0x...'; +const contract = new Contract(abi, address { provider: 'http://127.0.0.1:8545' }); + +// the provider can be set like this if not provided at the constructor: +contract.setProvider('http://127.0.0.1:7545'); + +// using Contract from a web3 instance +const web3 = new Web3('http://localhost:8545'); +const contract = new web3.eth.Contract(abi, address); +// no need to pass the provider to this contract instance. +// because it will have the same provider of the web3 instance. +``` + +### Constructor Parameters + +When you instantiate a `Contract`, you primarily provide one or two parameters, and sometimes 3 parameters: + +1. **ABI (Application Binary Interface):** The ABI tells the `Contract` how to format calls and transactions so that the contract can understand them. + +:::tip +If you do not know how to get the contract ABI, we recommend you to check the Step 4 at the [# Step 4: Deploying and Interacting with Smart Contracts](./smart_contracts_guide/#step-4-compile-the-solidity-code-using-the-solidity-compiler-and-get-its-abi-and-bytecode) tutorial. And to look into the guide: [Infer Contract Types from JSON Artifact](./infer_contract_types). +::: + +2. (optional) **Contract Address:** The Ethereum address at which your contract is deployed. If the contract is not deployed yet, do not pass a second parameter or pass `undefined` to it. + + +3. (optional) **Contract Options:** you can provide contract options as a third parameter. + +```ts +const abi = [{...}]; /* obtained ABI as an array */; +const address = '0x...'; // Deployed address of the contract + +const myContract = new Contract(abi, address, { + defaultGasPrice: '20000000000', // default gas price in wei, 20 gwei in this case + defaultGas: 5000000, // provide the gas limit for transactions + //...other optional properties +}); +``` + +### Contract Properties and Methods + +The `Contract` class comes equipped with a range of properties and methods for contract interaction. We encourage you to check them at the [Contract API Documentation section](/api/web3-eth-contract/class/Contract) + +#### Properties include + +- **config**: The set of configurations for the contract instance that is defaults to the same values as the `web3` object instance. But, it allows for using a different configurations for a specific contract instance. So, in most cases, you would use `web3.eth.Contract` and keep the configurations of the parent context (from the `web3` instance). Except if there is something you need to handle differently for only a specific contract instance. + +Here is an example on how to set a value of a specific config variable on a contract instance: + +```ts +import {Web3} from 'web3'; + +// Set up a connection to a testnet or Ethereum network +const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545')); //or new Web3('http://127.0.0.1:8545') + +// Create a new contract object using the ABI and bytecode +const abi = [{...}] +const myContract = new web3.eth.Contract(abi); +console.log(myContract.config.handleRevert); //false + +// This will set `handleRevert` to `true` only on `myContract` instance: +myContract.handleRevert = true; // same as: myContract.config.handleRevert +console.log(myContract.config.handleRevert); //true + +``` + +More on the `config` properties in the [API documentation](/api/web3/namespace/core/#Web3ConfigOptions) + + +- **options**: The set of options for the contract instance. + This options can be passed as the third parameter to the constructor. And can be accessed also later with contractInstance.options. + +```ts +myContract.options = { + address: '0x1234567890123456789012345678901234567891', + from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', + gasPrice: '10000000000000', + gas: 1000000 +} + +// If the smart contract is not deployed yet, the property `address` will be filled automatically after deployment succeed. +// If the smart contract is already deployed, you can set the `address`: +myContract.options.address = '0x1234567890123456789012345678901234567891'; +// this is the same as the second parameter in the constructor: +// new Contract(abi, `address`); + +// set default from address +myContract.options.from = '0x1234567890123456789012345678901234567891'; +// set default gas price in wei +myContract.options.gasPrice = '20000000000000'; +// set the gas limit +myContract.options.gas = 5000000; + +// you can also use this to update the ABI of the contract +myContract.options.jsonInterface = [{...}]; // ABI +// this is the same as the first parameter in the Contract constructor: +// new Contract(`abi`, address) +``` + +- **methods**: An object mapping your contract's methods for easy calling. + This property provide a strongly typed methods depending on the passed ABI. And here is how to use it: + +```ts +// note that the bellow METHOD_NAME and METHOD_PARAMETERS are +// according to the early provided ABI. +// And TypeScript intellisense will help you with. + +// to call a method by sending a transaction +contract.methods.METHOD_NAME(METHOD_PARAMETERS).send(); +// you need to specify the account (from) that will be used to sign and send the transaction +contract.methods.METHOD_NAME(METHOD_PARAMETERS).send({from: '0x...'}); + +// to call a view or pure method that does not send a transaction +contract.methods.METHOD_NAME(METHOD_PARAMETERS).call(); +``` + +- **events**: An object mapping your contract's events, allowing you to subscribe to them. + + And here is an example on how to use it: + +```ts +//If you want to filter events, create `options`: +const options: ContractEventOptions = { + // the following means all events where `myNumber` is `12` or `13` + filter: myNumber: [12,13]; + // you can specify the block from where you like to start + // listing to events + fromBlock: 'earliest'; + + // You can also manually set the topics for the event filter. + // If given the filter property and event signature, + // (topic[0]) will not be set automatically. + // Each topic can also be a nested array of topics that behaves + // as `or` operation between the given nested topics. + topics?: ['0x617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab']; +} + +// if you would like to not filter, don't pass `options`. +const event = await myContract.events.MyEvent(options); + +event.on('data', (data) => { + console.log(data) +}); +event.on('error', (err: Error) => { + console.log(err); +}); +``` + +To subscribe all events use the special `allEvents`: + +```ts +const event = await myContract.events.allEvents(options); +``` + +#### Methods include + +- **deploy**: For deploying a new contract instance. + +```ts +// this will give you the accounts from the connected provider +// For example, if you are using MetaMask, it will be the account available. +const providersAccounts = await web3.eth.getAccounts(); +const defaultAccount = providersAccounts[0]; +console.log('deployer account:', defaultAccount); + +// NOTE: If you want to manually unlock an account with a private key, you can use wallet.add(privateKey). +// however, exercise caution and ensure the security of your private keys. + +// this is how to obtain the deployer function, +// so you can estimate its needed gas and deploy it. +const contractDeployer = myContract.deploy({ + data: bytecode, // prefix the bytecode with '0x' if it is note already + arguments: [1], // provide the parameters in an array; in this case, it's the number `1`. +}); + +// optionally, estimate the gas that will be used for development and log it +const gas = await contractDeployer.estimateGas({ + from: defaultAccount, +}); +console.log('estimated gas:', gas); + +// Deploy the contract to the Ganache network +const tx = await contractDeployer.send({ + from: defaultAccount, + gas, + gasPrice: 10000000000, +}); +console.log('Contract deployed at address: ' + tx.options.address); +``` + +:::tip +If you do not know how to get the contract bytecode, we recommend you to check the Step 4 at the [Deploying and Interacting with Smart Contracts](./smart_contracts_guide#step-4-compile-the-solidity-code-using-the-solidity-compiler-and-get-its-abi-and-bytecode) tutorial. +::: + +- **getPastEvents**: Gets past events for this contract. It differs from `events` properties that it returns the past events as an array, rather than allowing to subscribe to them like when using `events` properties. More on the [API documentation](/api/web3-eth-contract/class/Contract#getPastEvents) + + +- **setProvider**: This allows you to set a specific provider for a contract instance. As highlighted early in this guide, this is especially handy if you are importing the `Contract` object from `web3-eth-contract` and then you will need to set the provider while there is no `web3` context to read the provider from. + +```ts +// Importing from web3-eth-contract package +import { Contract } from 'web3-eth-contract'; +const contract = new Contract(...); + +// to set the provider for the contract instance +contract.setProvider('yourProvider'); +``` + + +## ABI and Bytecode + +### ABI +The ABI is the Application Binary Interface ( ABI ) of a smart contract. Which defines the methods and variables that are available in a smart contract and which we can use to interact with that smart contract. + + For example, for the following solidity code: + +```ts +// SPDX-License-Identifier: MIT +pragma solidity 0.8.0; + +contract MyContract { + uint256 public myNumber; + + constructor(uint256 _myNumber) { + myNumber = _myNumber; + } + + function setMyNumber(uint256 _myNumber) public { + myNumber = _myNumber; + } +} +``` + +Its ABI would be: + +```ts +const abi = [ + { + inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'myNumber', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }], + name: 'setMyNumber', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const +``` + +### Bytecode +Bytecode results from the compilation of a Solidity code. Bytecode is generally compact numeric codes, constants, and other pieces of information. Where each instruction step is an operation which is referred to as “opcodes,” which are typically one-byte (eight-bits) long. This is why they’re called “bytecode”—one-byte opcodes. +And this bytecode is usually represented as a long hex string similar to the following; +```ts +const bytecode = '0x60806040523480156100115760006000fd5b50604051610224380380610224...' +``` + +:::info +And as mentioned in the tips inside previous sections: +If you do not know how to get the contract ABI and bytecode, we recommend you to check the Step 4 at the [Deploying and Interacting with Smart Contracts](./smart_contracts_guide#step-4-compile-the-solidity-code-using-the-solidity-compiler-and-get-its-abi-and-bytecode) tutorial. +::: + +### Do I always need the contract ByteCode? +The short answer is yes, only if you need to deploy the smart contract yourself. And below is more elaboration on this. + +Basically, with every Contract instance, there are 2 cases. First case is when you want to deploy a smart contract. And in this case, you will need to provide the bytecode of this smart contract. + +```ts +import {Contract} from 'web3-eth-contract'; + +const myContract = new Contract(abi, undefined, options); +// if there is no options to be passed you can write: +const myContract = new Contract(abi); + +await myContract.deploy({ + data: '0x' + bytecode, + + // the smart contract constructor arguments in an array + arguments: [arg1, arg2], +}).send({ + from: someAccount, + ... +}); + +// the contract address will be filled automatically here after deployment: +myContract.options.address +``` + +And the other case, is when you want to interact with an already deployed smart contract. In this scenario, you will need to provide the address of the already deployed smart contract. + +```ts +import {Contract} from 'web3-eth-contract'; + +const myContract = new Contract(abi, smartContractAddress, options); +// if there is no options to be passed you can write: +const myContract = new Contract(abi, smartContractAddress); +``` + +### Do I always need the contract ABI? +The answer is yes, you need the ABI, especially if you want to enjoy TypeScript IntelliSense, and we strongly recommend doing so. The ABI informs your development environment about the contract's structure, allowing for improved code suggestions and type checking. + +If you choose not to provide the ABI, you won't be able to interact with the contract's methods correctly, and you'll miss out on IntelliSense support. + + +```ts +const myContract = new Contract(abi, address || undefined, options); +// remember that address can be empty if the contract is not deployed yet. +// or you can set the address to directly interact with the contract. +``` diff --git a/docs/docs/guides/smart_contracts/infer_contract_types.md b/docs/docs/guides/smart_contracts/infer_contract_types.md new file mode 100644 index 00000000000..04ee5e49201 --- /dev/null +++ b/docs/docs/guides/smart_contracts/infer_contract_types.md @@ -0,0 +1,134 @@ +--- +sidebar_position: 3 +sidebar_label: 'Infer Contract Types from JSON Artifact (TypeScript)' +--- + +# Infer Contract Types from JSON Artifact + +:::tip +📝 This article is for **TypeScript** developers. So, if you are using JavaScript, you do not need to read this. +However, web3.js version 4.x has been rewritten in TypeScript. And we encorage you to use its strongly-typed features with TypeScript. +::: + +Web3.js is a popular library used for interacting with EVM blockchains. One of its key features is the ability to invoke EVM smart contracts deployed on the blockchain. In this blog post, we will show how to interact with the smart contract in **TypeScript**, with a special focus on how to infer types from JSON artifact files. + +Before we dive into the problem, let's take a quick look at the problem. Web3.js provides a simple and convenient way to interact with Solidity contracts. To use Web3.js to interact with a Solidity contract, you need to know the contract's address and the ABI (Application Binary Interface) of the contract. The ABI is JSON data that contains the definition of the functions in the contract, including their, name, input parameters and return values. + +Web3.js uses ABI type to dynamically load available methods and events but TypeScript currently [doesn't support loading JSON as const](https://github.com/microsoft/TypeScript/issues/32063). If you go to the [Playground Link](https://www.typescriptlang.org/play?#code/MYewdgzgLgBAhgIwJYwLwwNoCga5gbxz1wCIkwAHAVyghIC5MjjdCWWywoBTAJzDgAbACoBPCtwYwS0XuQDmJADTN20gQFtJjEpu4B9ZavYko47dNkKSxvAF8VagreKce-IWIlSZUOWEVHJ3U4LR8IUQ0EEEFDIKdTc3C-axcYO1sAXXi8XzgeAFkaRCRBJDMfMHAKOFFEQUkc0jNvHVBIPypgKBBeG2IHVTYOOCqwSJAqOkYAMyEIbibpcmpaKWwnYYTyABNuAA9uHalOxbTScncBESSdOB2d3m4IOiXXPR8QAHcwPiNg6QtCwke6PZ50NKDTbnZZgPaHY6MU5vXKXPjXLzA0FPF7-YK6ULAiASOF-FHNW7SbHg-pqKFqLZqTjwo5SOaCBbk2FXTyUkhUS4AJgArAA2PEJD46ABuQiojRhiVa0gFXBF4shWSWBLCOgAghQKLwQLLBBLckCfNxpdwuLTcPTWLYQWMJlM2fMziYVjRpkxoQDmQdWUjePKuW50bzlSCHjjXoqpdIZsaNOaTJa7nGaZCUYzvaSEScw178WiPDcY9TcRGk6YQOmOJmqdncbm0vmOLtg4iYOzOYryxi+aqoOrG+9CT5TfKJxaR0KxfaWBl2NlnXXhLxRhAZmTnc2SNbbVBl47nAXVn6NgzB1wo5Wsa2E4G699fn0I4fqxCnOfiJ2rhDtGT5gjWiZTjoxK2nsn6Kt+z7LgMWobpBVKCII3yjMAComJMUBXusHZ3jyj4+KO461mhJBzhSMYUUumprtq0D5NwRRQCUZQVDKSDcF8jZKsCMxUGA3RIOAZ45J2nCEYwN7sIBqL3hWmI+D+tEhLqlgkrBmlCepiHtgGZYqcO9GLuKVHaSCGiTHaX4LmqjF-ihJh1nAhrGjagn4XJ-q3oGwFkTo0QxPpdb6YeYVmkxLDriYrGFMUyDcaIlTVLU9S4U2fIiWJUASWAUlDM6PprPJxFBWZIGGWBL74h5wCgKJp6OVWRmucxqE2QgQjYdwADyMy+TQ-kKSwSkXDVIUqpZEXUVFTlji5dJuRwSXsSlpTlOlvH8YJh75eJkmqOeMnldeCUcHWezAEgGjzKNBG+kRJnbDNak6KOAAcC02UtFlcH9cXENdribRxXG7dOfECdqR2iSdxVndJZWUK9lXvUywVfS29X-USun7oGCEE8ZgWmaReP8vN1lElQCB+HA3RHAAanKOUJIeDEal18Xard3DAE8cALHqGFYWJXO5H5mMBYpJEPjTMWEz4gPAqroN4ODuSQ9taUZZQWUIA0h15UjhWnQMaOXvLE0AUrql8hp9PhMTcGky7nV0nmTvmcCvNq1mew7Bzgizu1gfzdruC66QdbkCL3Bi9wEuYV8A3PeNVVU8rfKq27Ogaz4Wv82DLGcclnGpTDOhjDUdSmzLdHCZbRUlY7dsVZg8dacCHzanLPcO3gU3cvnMZWAEwfSCXUEpDPscwH3eTV9DPHSNKcPmzGx1WyjNuld3V2C9RERROFQ9jfbucfdTfLT4EEEA1HyT+Ioy+r-rNc7ZvJDbwOgjC2BUO6o2Pl2DGI9V51h6JxQQABlKghpBDpWvi9Eed8cafWWpRF+wJ55zWcnzNa3VEpVy2r-Q2+14YHhAcjTuY90Y52xgWB+HUCZF0BA2N+Id4xIXsH7aq7Do7ENnrZeybV4K4NWuwVcAserAmZpAPcnsODD2vFgthk9NYgCvvg9WvDpBl1IQo8hbEoa13-g3E2ZtgF73btbQRECgJQM0awyBIi6r8K4SQFMIA0xGNjOTP8Qi87Ow4T4gxOgeiEOCfwimithE6PInTaJVI7KtTiUHL+Z8bLKN3HwAAYqmbOt8PGuK8aFPRZpfFxJMXI9aEMKGWL-ntdQmUm52LoQ40BTiHREEyPACAMB2jQAANxAA) and choose '.d.ts' you can check type difference with and without `as const`. + +```typescript +import { Contract, Web3 } from 'web3'; +import ERC20 from './node_modules/@openzeppelin/contracts/build/contracts/ERC20.json'; + +(async function () { + const web3 = new Web3('rpc url'); + + const contract = new Contract(ERC20.abi, '0x7af963cF6D228E564e2A0aA0DdBF06210B38615D', web3); + + const holder = '0xa8F6eB216e26C1F7d924A801E46eaE0CE8ed1A0A'; + + //Error because Contract doesn't know what methods exists + const balance = await contract.methods.balanceOf(holder).call(); +})(); +``` + +To work around it you need to copy abi into a TypeScript file like this: + +```typescript +import {Contract, Web3} from 'web3'; + +const ERC20 = [ + ... + // 'as const' is important part, without it typescript would create generic type and remove available methods from type +] as const; + +(async function () { + const web3 = new Web3('rpc url'); + + const contract = new Contract(ERC20, '0x7af963cF6D228E564e2A0aA0DdBF06210B38615D', web3); + + const holder = '0xa8F6eB216e26C1F7d924A801E46eaE0CE8ed1A0A'; + + //Works now + const balance = await contract.methods.balanceOf(holder).call(); +})(); +``` + +Now it's working but it also means that abi is no longer updated when you bump your npm dependencies. +To solve this problem, you can use a custom script that copies the JSON artifact of the contract into a TypeScript file as a const variable. This script can be run as part of your build process so that the TypeScript file is always up-to-date with the latest version of the contract's ABI. + +Script: + +```typescript title='gen.ts' +import fs from 'fs'; +import path from 'path'; + +//read destination directory submitted as first param +var destination = process.argv.slice(2)[0]; + +//read all contract artifacts from artifacts.json which should be in the directory from where script should be executed +const artifactContent = fs.readFileSync('./artifacts.json', 'utf-8'); + +const artifacts: string[] = JSON.parse(artifactContent); + +(async function () { + for (const artifact of artifacts) { + let content; + try { + //try to import from node_modules + content = JSON.stringify(await import(artifact)); + } catch (e) { + //try to read as path on disc + content = fs.readFileSync(artifact, 'utf-8'); + } + const filename = path.basename(artifact, '.json'); + //create and write typescript file + fs.writeFileSync(path.join(destination, filename + '.ts'), `const artifact = ${content.trimEnd()} as const; export default artifact;`); + } +})(); +``` + +To use this script, just create an `artifacts.json` file at the root of your project with all the artifacts you are using. + +```json title='artifacts.json' +[ + '@openzeppelin/contracts/build/contracts/ERC20.json', + '@openzeppelin/contracts/build/contracts/ERC1155.json', + './build/contracts/MyContract.json' +] +``` + +and run the script with +```bash +node -r ts-node/register + + + + + + + +``` + + +## Contract Deployment + +```typescript title='Deploy a contract' +// 1st step: initialize `web3` instance +import { Web3 } from 'web3'; + +const web3 = new Web3(/* PROVIDER*/); + +// 2nd step: add an account to wallet +const privateKey = '0x7b907534ec13b19c67c2a738fdaa69014298c71f2221d7e5dec280232e996610'; +const account = web3.eth.accounts.wallet.add(privateKey).get(0); +// Make sure the account has enough eth on balance to send the transaction + +// fill ContractAbi and ContractBytecode with your contract's abi and bytecode + +async function deploy() { + // 3rd step: sign and send the transaction + // In any function where you can pass from the address set address of the account that exists in a wallet, it will be automatically signed. + + try { + // deploy + const contract = new web3.eth.Contract(ContractAbi); + const contractDeployed = await contract + .deploy({ + input: ContractBytecode, + arguments: ['Constructor param1', 'Constructor param2'], + }) + .send({ + from: account?.address, + gas: '1000000', + // other transaction's params + }); + + // call method + await contractDeployed.methods.transfer('0xe2597eb05cf9a87eb1309e86750c903ec38e527e', '0x1').send({ + from: account?.address, + gas: '1000000', + // other transaction's params + }); + } catch (error) { + // catch transaction error + console.error(error); + } +} + +(async () => { + await deploy(); +})(); +``` + + +## Interacting with contract methods + +``` ts title='Interact with contracts using a wallet under the hood' +// 1st step: initialize `web3` instance +import { Web3 } from 'web3'; + +const web3 = new Web3(/* PROVIDER*/); + +// 2nd step: add an account to wallet +const privateKeyString = '0x4651f9c219fc6401fe0b3f82129467c717012287ccb61950d2a8ede0687857ba'; + +const wallet = web3.eth.accounts.wallet.add(privateKeyString); +// Make sure the account has enough eth on balance to send the transaction + +async function contractMethod() { + try { + // 3rd step: instantiate the contract with the ABI and contract address + const myContract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS); + + // 4th step: call contract method and send the tx + await myContract.methods.doSomething().send({ + from: wallet[0].address, + gas: '1000000', + // other transaction's params + }); + } catch (error) { + // catch transaction error + console.error(error); + } +} + +(async () => { + await contractMethod(); +})(); +``` + +## Sending a transaction and listening to the events + +```ts title='Transactions with Web3PromiEvent' +import { Web3 } from 'web3'; + +// 1st - initialize the provider +const web3 = new Web3(/* PROVIDER*/); + +// 2nd - add an account to wallet +const privateKey = '0x4651f9c219fc6401fe0b3f82129467c717012287ccb61950d2a8ede0687857ba'; +const account = web3.eth.accounts.wallet.add(privateKey).get(0); +// Make sure the account has enough eth on balance to send the transaction + +// 3rd - sign and send the transaction +// Magic happens behind sendTransaction. If a transaction is sent from an account that exists in a wallet, it will be automatically signed. +const transaction = web3.eth.sendTransaction({ + from: account?.address, + to: '0xe4beef667408b99053dc147ed19592ada0d77f59', + value: '0x1', + gas: '300000', + // other transaction's params +}); + +// highlight-start +// 4th - listen to the transaction events +transaction + .on('sending', (sending) => { + // Sending example + console.log('Sending:', sending); + }) + .on('sent', (sent) => { + // Sent example + console.log('Sent:', sent); + }) + .on('transactionHash', (transactionHash) => { + // Transaction hash example + console.log('Transaction Hash:', transactionHash); + }) + .on('confirmation', (confirmation) => { + // Confirmation example + console.log('Confirmation:', confirmation); + }) + .on('error', (error) => { + // Error example + console.error('Error:', error); + }); +// highlight-end +/* ↳ +Sending: { + from: '0xA3286628134baD128faeef82F44e99AA64085C94', + to: '0xe4beef667408b99053dc147ed19592ada0d77f59', + value: '0x1', + gas: '0x493e0', + gasPrice: undefined, + maxPriorityFeePerGas: '0x9502f900', + maxFeePerGas: '0x2b53cf7960' +} +Sent: { + from: '0xA3286628134baD128faeef82F44e99AA64085C94', + to: '0xe4beef667408b99053dc147ed19592ada0d77f59', + value: '0x1', + gas: '0x493e0', + gasPrice: undefined, + maxPriorityFeePerGas: '0x9502f900', + maxFeePerGas: '0x2b53cf7960' +} +Transaction Hash: 0xa7493bc3eb6e7f41b54291cfd19d90111e68ea2cd9718da937ca4dcc1f831dde +Receipt: { + blockHash: '0xe049c2cd2a473dad2af5ccf40c2df788cd42a237616cc84cc3861937f1aa2195', + blockNumber: 4972912n, + cumulativeGasUsed: 1018070n, + effectiveGasPrice: 100635626363n, + from: '0xa3286628134bad128faeef82f44e99aa64085c94', + gasUsed: 21000n, + logs: [], + logsBloom: '0x...00', + status: 1n, + to: '0xe4beef667408b99053dc147ed19592ada0d77f59', + transactionHash: '0xa7493bc3eb6e7f41b54291cfd19d90111e68ea2cd9718da937ca4dcc1f831dde', + transactionIndex: 15n, + type: 2n +} +Confirmation: { + confirmations: 1n, + receipt: { + blockHash: '0xe049c2cd2a473dad2af5ccf40c2df788cd42a237616cc84cc3861937f1aa2195', + blockNumber: 4972912n, + cumulativeGasUsed: 1018070n, + effectiveGasPrice: 100635626363n, + from: '0xa3286628134bad128faeef82f44e99aa64085c94', + gasUsed: 21000n, + logs: [], + logsBloom: '0x...000', + status: 1n, + to: '0xe4beef667408b99053dc147ed19592ada0d77f59', + transactionHash: '0xa7493bc3eb6e7f41b54291cfd19d90111e68ea2cd9718da937ca4dcc1f831dde', + transactionIndex: 15n, + type: 2n + }, + latestBlockHash: '0xe049c2cd2a473dad2af5ccf40c2df788cd42a237616cc84cc3861937f1aa2195' +} +Confirmation: { + confirmations: 2n, + receipt: {...}, + latestBlockHash: '0xf20261fc59d059c9dfd048e44c7fe1499d45822d9fe804bca70ac56559b54b1b' +} +Confirmation: { + confirmations: 3n, + receipt: {...}, + latestBlockHash: '0xb52380054ad2382620615ba7b7b40638021d85c5904a402cd11d00fd4db9fba9' +} +*/ +``` diff --git a/docs/docs/guides/web3_config/_category_.yml b/docs/docs/guides/web3_config/_category_.yml new file mode 100644 index 00000000000..4c1d5ddbd90 --- /dev/null +++ b/docs/docs/guides/web3_config/_category_.yml @@ -0,0 +1,5 @@ +label: '⚙️ Web3 config' +collapsible: true +collapsed: true +link: null +position: 9 \ No newline at end of file diff --git a/docs/docs/guides/web3_config/index.md b/docs/docs/guides/web3_config/index.md new file mode 100644 index 00000000000..ea061762968 --- /dev/null +++ b/docs/docs/guides/web3_config/index.md @@ -0,0 +1,201 @@ +--- +sidebar_position: 6 +sidebar_label: 'Web3 Config Guide' +--- + +# Web3.js Config Guide + +## Configuration parameters + +There is list of configuration params that can be set for modifying behavior of different functions in web3.js packages. Following is list of configuration options with details: + +- [handleRevert]( /api/web3-core/class/Web3Config#handleRevert) +- [defaultAccount](/api/web3-core/class/Web3Config#defaultAccount) +- [defaultBlock](/api/web3-core/class/Web3Config#defaultBlock) +- [transactionBlockTimeout](/api/web3-core/class/Web3Config#transactionBlockTimeout) +- [transactionConfirmationBlocks](/api/web3-core/class/Web3Config#transactionConfirmationBlocks) +- [transactionPollingInterval](/api/web3-core/class/Web3Config#transactionPollingInterval) +- [transactionPollingTimeout](/api/web3-core/class/Web3Config#transactionPollingTimeout) +- [transactionReceiptPollingInterval](/api/web3-core/class/Web3Config#transactionReceiptPollingInterval) +- [transactionSendTimeout](/api/web3-core/class/Web3Config#transactionSendTimeout) +- [transactionConfirmationPollingInterval](/api/web3-core/class/Web3Config#transactionConfirmationPollingInterval) +- [blockHeaderTimeout](/api/web3-core/class/Web3Config#blockHeaderTimeout) +- [maxListenersWarningThreshold](/api/web3-core/class/Web3Config#maxListenersWarningThreshold) +- [contractDataInputFill](/api/web3-core/class/Web3Config#contractDataInputFill) +- [defaultNetworkId](/api/web3-core/class/Web3Config#defaultNetworkId) +- [defaultChain](/api/web3-core/class/Web3Config#defaultChain) +- [defaultHardfork](/api/web3-core/class/Web3Config#defaultHardfork) +- [defaultCommon](/api/web3-core/class/Web3Config#defaultCommon) +- [defaultTransactionType](/api/web3-core/class/Web3Config#defaultTransactionType) + +## Global level Config + +There is option of modifying any of above-mentioned configuration parameter at global level when instantiating Web3, and it will be available to all packages. + +``` ts +import { Web3 } from 'web3'; + +const web3 = new Web3({ + provider: 'https://mainnet.infura.io/v3/YOURID', + config: { + defaultTransactionType: '0x0', + }, +}); + +//now default transaction type will be 0x0 so using following function in eth will send type 0x0 transaction + +web3.eth + .sendTransaction({ + from: '0x18532dF2Ab835d4E9D07a8b9B759bf5F8f890f49', + to: '0xB2f70d8965e754cc07D343a9b5332876D3070155', + value: 100, + gasLimit: 21000, + }) + .then((res) => console.log(res)); +``` + +For Advance Users: Global level config can also be set using `Web3Context` object. + +``` ts +import { Web3, Web3Context } from 'web3'; + +const context = new Web3Context('http://127.0.0.1:7545'); +context.setConfig({ defaultTransactionType: '0x0' }); + +const web3 = new Web3(context); + +//it will not default to 0x0 type transactions +web3.eth.sendTransaction({ + from: '0x18532dF2Ab835d4E9D07a8b9B759bf5F8f890f49', + to: '0x018e221145dE7cefAD09BD53F41c11A918Bf1Cb7', + value: 100, + gasLimit: 21000 +}).then(res => console.log(res)); +``` + +## Package level config + +### Setting config in Individual Package under Web3 instance +Some configuration options that effects selected packages can be modified using `setConfig(...)` function. + +``` ts +import { Web3 } from 'web3'; + +const web3 = new Web3('https://mainnet.infura.io/v3/YOURID'); + +web3.eth.setConfig({ defaultTransactionType: '0x0'}); + +web3.eth + .sendTransaction({ + from: '0x18532dF2Ab835d4E9D07a8b9B759bf5F8f890f49', + to: '0xB2f70d8965e754cc07D343a9b5332876D3070155', + value: 100, + gasLimit: 21000, + }) + .then((res) => console.log(res)); +``` + +### Setting config in Individually imported Packages + +If an individual package is being imported instead of whole web3.js, there is option of setting config params by passing config in constructors or by using `setConfig(...)` function: + +For example if only web3Eth package is installed using: + +```sh +npm i web3-eth +``` + +Configuration options can be set by passing in constructor: + +```ts title='setConfig in the constructor' +import { Web3Eth } from 'web3-eth'; + +const web3EthObj = new Web3Eth({ + provider: 'http://127.0.0.1:7545', + config: { + defaultTransactionType: 0x0, + }, +}); + +web3EthObj + .sendTransaction({ + from: '0x18532dF2Ab835d4E9D07a8b9B759bf5F8f890f49', + to: '0x018e221145dE7cefAD09BD53F41c11A918Bf1Cb7', + value: 100, + gasLimit: 21000, + }) + .then((res) => console.log(res)); +``` + +Another way of setting config for individually imported package is by using `setConfig(...)` function. + +```ts title='setConfig function' +import { Web3Eth } from 'web3-eth'; + +const web3EthObj = new Web3Eth('http://127.0.0.1:7545'); + +web3EthObj.setConfig({ defaultTransactionType: 0x0 }); + +web3EthObj + .sendTransaction({ + from: '0x18532dF2Ab835d4E9D07a8b9B759bf5F8f890f49', + to: '0x018e221145dE7cefAD09BD53F41c11A918Bf1Cb7', + value: 100, + gasLimit: 21000, + }) + .then((res) => console.log(res)); +``` + +## Getting Current Config + +For getting list of current config params `getContextObject().config` can be used as : + +``` ts title='getContextObject() in Web3 object' +import { Web3 } from 'web3'; + +const web3 = new Web3('http://127.0.0.1:7545'); + +console.log(web3.getContextObject().config) +/* ↳ + handleRevert: false, + defaultAccount: undefined, + defaultBlock: 'latest', + transactionBlockTimeout: 50, + transactionConfirmationBlocks: 24, + transactionPollingInterval: 1000, + transactionPollingTimeout: 750000, + transactionReceiptPollingInterval: undefined, + transactionSendTimeout: 750000, + transactionConfirmationPollingInterval: undefined, + blockHeaderTimeout: 10, + maxListenersWarningThreshold: 100, + contractDataInputFill: 'input', + defaultNetworkId: undefined, + defaultChain: 'mainnet', + defaultHardfork: 'london', + defaultCommon: undefined, + defaultTransactionType: '0x2', + defaultMaxPriorityFeePerGas: '0x9502f900', + ... +*/ +``` + +For individually imported packages same approach can be used to get current config params. + +```ts title='getContextObject() in an imported package' +import { Web3Eth } from 'web3'; + +const web3 = new Web3Eth('http://127.0.0.1:7545'); + +console.log(web3.getContextObject().config) +/* ↳ + handleRevert: false, + defaultAccount: undefined, + defaultBlock: 'latest', + transactionBlockTimeout: 50, + transactionConfirmationBlocks: 24, + transactionPollingInterval: 1000, + transactionPollingTimeout: 750000, + ... +*/ +``` \ No newline at end of file diff --git a/docs/docs/guides/web3_eth/_category_.yml b/docs/docs/guides/web3_eth/_category_.yml new file mode 100644 index 00000000000..f7e09e00d19 --- /dev/null +++ b/docs/docs/guides/web3_eth/_category_.yml @@ -0,0 +1,5 @@ +label: '📦 Web3Eth module' +collapsible: true +collapsed: true +link: null +position: 7 \ No newline at end of file diff --git a/docs/docs/guides/web3_eth/eth.md b/docs/docs/guides/web3_eth/eth.md new file mode 100644 index 00000000000..cce7370e9a0 --- /dev/null +++ b/docs/docs/guides/web3_eth/eth.md @@ -0,0 +1,700 @@ +--- +sidebar_position: 1 +sidebar_label: 'Mastering the Web3Eth package' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Getting Started with `eth` Package + +## Introduction + +The `web3-eth` package provides a set of powerful functionalities to interact with the Ethereum blockchain and smart contracts. In this tutorial, we will guide you through the basics of using the `web3-eth` package of web3.js version 4. We will be using TypeScript throughout the examples. + +## Overview + +Here is a high-level overview of the steps we will be taking in this tutorial: + +1. [Setting up the Environment](#step-1-setting-up-the-environment) +2. [Create a new project directory and initialize a new Node.js project](#step-2-create-a-new-project-directory-and-initialize-a-new-nodejs-project) +3. [Set up web3.js and connect to the Ganache network](#step-3-set-up-web3js-and-connect-to-the-ganache-network) +4. [Interact with the Ethereum blockchain using web3.js](#step-4-interact-with-the-ethereum-blockchain-using-web3js) +5. [Importing specific package](#step-5-importing-specific-package) +6. [Send different type of transactions](#step-6-send-different-type-of-transactions) + +## Step 1: Setting up the Environment + +Before we start writing and deploying our contract, we need to set up our environment. For that, we need to install the following: + +:::tip +You can also interact with a mainnet/testnet by using a node provider instead of ganache, you can use [Alchemy](https://www.alchemy.com/), [Infura](https://www.infura.io/), [QuickNode](https://www.quicknode.com/) or get a public endpoint from [Chainlist](https://chainlist.org/) +::: + +1. `Ganache` - Ganache is a personal blockchain for Ethereum development that allows you to see how your smart contracts function in real-world scenarios. You can download it from http://truffleframework.com/ganache +2. `Node.js` - Node.js is a JavaScript runtime environment that allows you to run JavaScript on the server-side. You can download it from https://nodejs.org/en/download/ +3. `npm` - Node Package Manager is used to publish and install packages to and from the public npm registry or a private npm registry. Here is how to install it https://docs.npmjs.com/downloading-and-installing-node-js-and-npm. (Alternatively, you can use yarn instead of npm https://classic.yarnpkg.com/lang/en/docs/getting-started/) + +## Step 2: Create a new project directory and initialize a new Node.js project + +First, create a new project directory for your project and navigate into it: + +```bash +mkdir web3-eth-tutorial +cd web3-eth-tutorial +``` + +Next, initialize a new Node.js project using npm: + +```bash +npm init -y +``` + +This will create a new `package.json` file in your project directory. + +```bash +npm i typescript @types/node +``` + +This will install typescript for our project and install the types for node. + +## Step 3: Set up web3.js and connect to the Ganache network + +In this step, we will set up the web3.js library and connect to the Ganache network. So, be sure to run Ganache if you did not already did. + +First, install the `web3` package using npm: + +```bash +npm i web3 +``` + +Next, create a new file called `index.ts` in your project directory and add the following code to it: + +```ts +import { Web3 } from 'web3'; + +// Set up a connection to the Ganache network +const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545')); +/* NOTE: +instead of using ganache, you can also interact with a testnet/mainnet using another provider +https://app.infura.io/ +https://dashboard.alchemy.com/ +or use a public provider https://chainlist.org/ +*/ + +// Log the current block number to the console +const block = await web3.eth.getBlockNumber(); + +console.log('Last block:', block); +// ↳ Last block: 4975299n +``` + +This code sets up a connection to the Ganache network and logs the current block number to the console. + +Run the following command to test the connection: + +``` +npx ts-node index.ts +``` + +If everything is working correctly, you should see the current block number logged to the console. However, if you got an error with the reason `connect ECONNREFUSED 127.0.0.1:7545` then double check that you are running Ganache locally on port `7545`. + +## Step 4: Interact with the Ethereum blockchain using web3.js + +In this step, we will use web3.js to interact with the Ganache network. + +In the first example, we are going to send a simple value transaction. +Create a file named `transaction.ts` and fill it with the following code: + +```typescript +import { Web3 } from 'web3'; +import fs from 'fs'; +import path from 'path'; + +// Set up a connection to the Ethereum network +const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545')); +web3.eth.Contract.handleRevert = true; + +async function interact() { + //fetch all the available accounts + const accounts = await web3.eth.getAccounts(); + console.log(accounts); + + let balance1, balance2; + //The initial balances of the accounts should be 100 Eth (10^18 wei) + balance1 = await web3.eth.getBalance(accounts[0]); + balance2 = await web3.eth.getBalance(accounts[1]); + + console.log(balance1, balance2); + + //create a transaction sending 1 Ether from account 0 to account 1 + const transaction = { + from: accounts[0], + to: accounts[1], + // value should be passed in wei. For easier use and to avoid mistakes, + // we utilize the auxiliary `toWei` function: + value: web3.utils.toWei('1', 'ether'), + }; + + //send the actual transaction + const transactionHash = await web3.eth.sendTransaction(transaction); + console.log('transactionHash', transactionHash); + + balance1 = await web3.eth.getBalance(accounts[0]); + balance2 = await web3.eth.getBalance(accounts[1]); + + // see the updated balances + console.log(balance1, balance2); + + // irrelevant with the actual transaction, just to know the gasPrice + const gasPrice = await web3.eth.getGasPrice(); + console.log(gasPrice); +} + +(async () => { + await interact(); +})(); +``` + +:::important +📝 When running a local development blockchain using Ganache, all accounts are typically unlocked by default, allowing easy access and transaction execution during development and testing. This means that the accounts are accessible without requiring a private key or passphrase. That's why we just indicate the accounts in the examples with the `from` field. +::: + +Run the following: + +```bash +npx ts-node transaction.ts +``` + +If everything is working correctly, you should see something like the following: + +```ts +[ + '0xc68863f36C48ec168AD45A86c96347D520eac1Cf', + '0x80c05939B307f9833d905A685575b45659d3EA70', + '0xA260Cf742e03B48ea1A2b76b0d20aaCfe6F85E5E', + '0xf457b8C0CBE41e2a85b6222A97b7b7bC6Df1C0c0', + '0x32dF9a0B365b6265Fb21893c551b0766084DDE21', + '0x8a6A2b8b00C1C8135F1B25DcE54f73Ee18bEF43d', + '0xAFc526Be4a2656f7E02501bdf660AbbaA8fb3d7A', + '0xc32618116370fF776Ecd18301c801e146A1746b3', + '0xDCCD49880dCf9603835B0f522c31Fcf0579b46Ff', + '0x036006084Cb62b7FAf40B979868c0c03672a59B5' +] +100000000000000000000n 100000000000000000000n + +transactionHash { + transactionHash: '0xf685b64ccf5930d3779a33335ca22195b68901dbdc439f79dfc65d87c7ae88b0', + transactionIndex: 0n, + blockHash: '0x5bc044ad949cfd32ea4cbb249f0292e7dded44c3b0f599236c6d20ddaa96cc06', + blockNumber: 1n, + from: '0xc68863f36c48ec168ad45a86c96347d520eac1cf', + to: '0x80c05939b307f9833d905a685575b45659d3ea70', + gasUsed: 21000n, + cumulativeGasUsed: 21000n, + logs: [], + status: 1n, + logsBloom: '0x......000' +} + +98999580000000000000n 101000000000000000000n + +20000000000n + +``` + +:::note +📝 In order to calculate the actual ether spent, we have to calculate the value sent plus the fees. Initial_balance = (Remaining_balance + value + gasUsed\*gasPrice). In our case: + +98999580000000000000 + 1000000000000000000 + (20000000000\*21000) = 100 Ether +::: + +In the next example, we are going to use `estimateGas` function to see the expected gas for contract deployment. (For more on contracts, please see the corresponding tutorial). Create a file named `estimate.ts` and fill it with the following code: + +```typescript +import { Web3, ETH_DATA_FORMAT, DEFAULT_RETURN_FORMAT } from 'web3'; + +async function estimate() { + // abi of our contract + const abi = [ + { + inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'myNumber', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }], + name: 'setMyNumber', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + ]; + + const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545')); + + //get the available accounts + const accounts = await web3.eth.getAccounts(); + let acc = await accounts[0]; + + let contract = new web3.eth.Contract(abi); + + const deployment = contract.deploy({ + data: '0x608060405234801561001057600080fd5b506040516101d93803806101d983398181016040528101906100329190610054565b806000819055505061009e565b60008151905061004e81610087565b92915050565b60006020828403121561006657600080fd5b60006100748482850161003f565b91505092915050565b6000819050919050565b6100908161007d565b811461009b57600080fd5b50565b61012c806100ad6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806323fd0e401460375780636ffd773c146051575b600080fd5b603d6069565b6040516048919060bf565b60405180910390f35b6067600480360381019060639190608c565b606f565b005b60005481565b8060008190555050565b60008135905060868160e2565b92915050565b600060208284031215609d57600080fd5b600060a9848285016079565b91505092915050565b60b98160d8565b82525050565b600060208201905060d2600083018460b2565b92915050565b6000819050919050565b60e98160d8565b811460f357600080fd5b5056fea2646970667358221220d28cf161457f7936995800eb9896635a02a559a0561bff6a09a40bfb81cd056564736f6c63430008000033', + // @ts-expect-error + arguments: [1], + }); + + let estimatedGas = await deployment.estimateGas({ from: acc }, DEFAULT_RETURN_FORMAT); + // the returned data will be formatted as a bigint + + console.log('Default format:', estimatedGas); + + estimatedGas = await deployment.estimateGas({ from: acc }, ETH_DATA_FORMAT); + // the returned data will be formatted as a hexstring + + console.log('Eth format:', estimatedGas); +} + +(async () => { + await estimate(); +})(); +``` + +Run the following: + +```bash +npx ts-node estimate.ts +``` + +If everything is working correctly, you should see something like the following: + +```bash +Default format: 140648n +Eth format: 0x22568 +``` + +:::note +📝 Note that numbers returned from web3.js are returned by default in the `BigInt` format. In this example we used `ETH_DATA_FORMAT` parameter, which, can be passed in most methods in web3.js in order to format the result in `hex`. +::: + +In the next example we are going to sign a transaction and use `sendSignedTransaction` to send the signed transaction. Create a file named `sendSigned.ts` and fill it with the following code: + +```typescript +import { Web3 } from 'web3'; +const web3 = new Web3('http://localhost:7545'); + +//make sure to copy the private key from ganache +const privateKey = '0x0fed6f64e01bc9fac9587b6e7245fd9d056c3c004ad546a17d3d029977f0930a'; +const value = web3.utils.toWei('1', 'ether'); + +async function sendSigned() { + const accounts = await web3.eth.getAccounts(); + const fromAddress = accounts[0]; + const toAddress = accounts[1]; + // Create a new transaction object + const tx = { + from: fromAddress, + to: toAddress, + value: value, + gas: 21000, + gasPrice: web3.utils.toWei('10', 'gwei'), + nonce: await web3.eth.getTransactionCount(fromAddress), + }; + + // Sign the transaction with the private key + const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey); + + // Send the signed transaction to the network + const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction); + + console.log('Transaction receipt:', receipt); +} +(async () => { + await sendSigned(); +})(); +``` + +Run the following: + +```bash +npx ts-node sendSigned.ts +``` + +If everything is working correctly, you should see something like the following: + +```ts +Transaction receipt: { + transactionHash: '0x742df8f1ad4d04f6e5632889109506dbb7cdc8a6a1c80af3dfdfc71a67a04ddc', + transactionIndex: 0n, + blockNumber: 1n, + blockHash: '0xab6678d76499b0ee383f182ab8f848ba27bd787e70e227524255c86b25224ed3', + from: '0x66ce32a5200aac57b258c4eac26bc1493fefddea', + to: '0x0afcfc43ac454348d8170c77b1f912b518b4ebe8', + cumulativeGasUsed: 21000n, + gasUsed: 21000n, + logs: [], + logsBloom: '0x...0000', + status: 1n, + effectiveGasPrice: 10000000000n, + type: 2n +} +``` + +## Step 5: Importing specific package + +To harness the capabilities of the web3-eth package, you can opt to import this package directly rather than depending on the global web3 package, which will result in a reduction in the build size. + +### Import web3-eth directly + +For example [getBalance](/api/web3-eth/function/getBalance) method: + +```typescript +import { Web3Eth } from 'web3-eth'; + +const eth = new Web3Eth('http://localhost:7545'); + +async function test() { + const accounts = await eth.getAccounts(); + const currentBalance = await eth.getBalance(accounts[0]); + console.log('Current balance:', currentBalance); + // 115792089237316195423570985008687907853269984665640564039437613106102441895127n +} + +(async () => { + await test(); +})(); +``` + +### Set config directly to web3-eth package + +```typescript +import { Web3Eth } from 'web3-eth'; + +const eth = new Web3Eth('http://localhost:8545'); + +console.log('defaultTransactionType before', eth.config.defaultTransactionType); +// defaultTransactionType before 0x0 + +eth.setConfig({ defaultTransactionType: '0x1' }); + +console.log('eth.config.defaultTransactionType after', eth.config.defaultTransactionType); +// defaultTransactionType before 0x1 +``` + +## Step 6: Send different type of transactions: + +### Legacy Transaction + +In Ethereum, a 'legacy transaction' typically refers to the traditional transactions, where gas fees are set explicitly by the sender and can fluctuate based on network demand. These legacy transactions were prevalent on the Ethereum network before the implementation of Ethereum Improvement Proposal (EIP) 1559. + +Key characteristics of legacy transactions include: + +1. Gas Price: In legacy transactions, the sender specifies a gas price (in Gwei) that they are willing to pay for each unit of gas consumed by the transaction. The gas price can be adjusted by the sender, and it determines the transaction's priority in getting processed by miners. Higher gas prices mean faster transaction confirmation. + +2. Gas Limit: The sender also sets a gas limit, which is the maximum amount of gas that the transaction can consume. Gas is the computational fuel used to execute transactions and smart contracts on the Ethereum network. The gas limit is primarily set to ensure that the sender doesn't run out of Ether while processing the transaction. It can also impact the success or failure of the transaction. + +3. Uncertainty in Fees: Legacy transactions are subject to fluctuating gas prices based on network congestion. During periods of high demand, gas prices can surge, causing users to pay more for their transactions to be processed promptly. Conversely, during quieter network periods, users can pay lower fees. + +4. Manual Fee Estimation: Users are responsible for manually estimating the appropriate gas price to include in their legacy transactions to ensure timely processing. This process can be challenging, as setting gas prices too low may result in slow confirmation, while setting them too high may lead to overpaying. + +5. EIP-1559, as described below, introduced changes to Ethereum's transaction fee system, making it more user-friendly and predictable. With EIP-1559, the concept of a 'base fee' replaces the manual setting of gas prices, which has reduced some of the uncertainties associated with legacy transactions. + +While EIP-1559 has significantly improved the user experience, legacy transactions are still supported on the Ethereum network, and users can continue to send transactions with manually specified gas prices and gas limits if they prefer. However, the EIP-1559 mechanism is now the recommended approach for most transactions, as it simplifies the process and reduces the likelihood of overpaying for fees. + +To send Legacy transaction use code below: + +```typescript +import { Web3 } from 'web3'; + +const web3 = new Web3('http://localhost:8545'); + +async function test() { + const privateKey = 'YOUR PRIVATE KEY HERE'; + // add private key to wallet to have auto-signing transactions feature + const account = web3.eth.accounts.privateKeyToAccount(privateKey); + web3.eth.accounts.wallet.add(account); + + // create transaction object + const tx = { + from: account.address, + to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab', + value: '0x1', + gas: BigInt(21000), + gasPrice: await web3.eth.getGasPrice(), + type: BigInt(0), // <- specify type + }; + + // send transaction + const receipt = await web3.eth.sendTransaction(tx); + + console.log('Receipt:', receipt); + // Receipt: { + // blockHash: '0xc0f2fea359233b0843fb53255b8a7f42aa7b1aff53da7cbe78c45b5bac187ad4', + // blockNumber: 21n, + // cumulativeGasUsed: 21000n, + // effectiveGasPrice: 2569891347n, + // from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e', + // gasUsed: 21000n, + // logs: [], + // logsBloom: '0x0...00000', + // status: 1n, + // to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab', + // transactionHash: '0x0ffe880776f5631e4b64caf521bd01cd816dd2cc29e533bc56f392211856cf9a', + // transactionIndex: 0n, + // type: 0n + // } +} +(async () => { + await test(); +})(); +``` + +### EIP-2930 Transaction + +Ethereum Improvement Proposal 2930 is a proposal for a change to the Ethereum network that was implemented as part of the Berlin hard fork, which was activated in April 2021. EIP-2930 introduces a feature called 'Transaction Type and Access List.' This improvement enhances the gas efficiency of certain smart contract interactions and provides more flexibility in specifying who can access specific resources within a smart contract. Here are the key components of EIP-2930: + +1. Transaction Type: EIP-2930 introduces a new transaction type called 'Access List Transaction.' This transaction type is designed to make certain interactions with smart contracts more efficient by allowing the sender to specify a list of addresses that may be accessed or modified during the transaction. + +2. Access List: The Access List is a structured data format included with the transaction. It contains a list of addresses and storage keys that are expected to be accessed or modified during the execution of the transaction. This helps in reducing the amount of gas required for these operations, as miners can check the Access List to optimize the execution. + +3. Gas Savings: EIP-2930 is intended to significantly reduce the gas costs for transactions that use the Access List feature. By specifying which storage slots and addresses are relevant to the transaction, it allows for a more efficient use of gas, especially in interactions with smart contracts that have a large state. + +4. Contract Interactions: This improvement is particularly useful when interacting with contracts that have complex state structures, as it minimizes the gas required to read from or write to specific storage slots. This can lead to cost savings for users and make certain interactions more practical. + +EIP-2930 is part of Ethereum's ongoing efforts to improve the network's efficiency and reduce transaction costs, making it more accessible and scalable for decentralized applications and users. It is especially beneficial for interactions with stateful contracts that rely on specific storage operations and access control mechanisms. + +To send EIP-2930 transaction use code below: + +```typescript +import {Web3} from 'web3'; + +const web3 = new Web3('http://localhost:8545'); + +async function test() { + const privateKey = 'YOUR PRIVATE KEY HERE'; + // add private key to wallet to have auto-signing transactions feature + const account = web3.eth.accounts.privateKeyToAccount(privateKey); + web3.eth.accounts.wallet.add(account); + + // create transaction object + const tx = { + from: account.address, + to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab', + value: '0x1', + gasLimit: BigInt(21000), + type: BigInt(1), // <- specify type + // gasPrice - you can specify this property directly or web3js will fill this field automatically + }; + + // send transaction + const receipt = await web3.eth.sendTransaction(tx); + + console.log('Receipt:', receipt); + // Receipt: { + // blockHash: '0xd8f6a3638112d17b476fd1b7c4369d473bc1a484408b6f39dbf64410df44adf6', + // blockNumber: 24n, + // cumulativeGasUsed: 21000n, + // effectiveGasPrice: 2546893579n, + // from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e', + // gasUsed: 21000n, + // logs: [], + // logsBloom: '0x...0000', + // status: 1n, + // to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab', + // transactionHash: '0xd1d682b6f6467897db5b8f0a99a6be2fb788d32fbc1329b568b8f6b2c15e809a', + // transactionIndex: 0n, + // type: 1n + // } +} +(async () => { + await test(); +})(); +``` + +Here is an example of how to use an access list in a transaction. + +:::note +The code of `Greeter` contract you can find [here](https://github.com/web3/web3.js/blob/4.x/fixtures/build/Greeter.ts) +::: + +```typescript +import {Web3} from 'web3'; + +import { GreeterAbi, GreeterBytecode } from './fixture/Greeter'; + +const web3 = new Web3('http://localhost:8545'); + +async function test() { + const privateKey = 'YOUR PRIVATE KEY HERE'; + // add private key to wallet to have auto-signing transactions feature + const account = web3.eth.accounts.privateKeyToAccount(privateKey); + web3.eth.accounts.wallet.add(account); + + // deploy contract + const contract = new web3.eth.Contract(GreeterAbi); + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send({ from: account.address }); + deployedContract.defaultAccount = account.address; + + const transaction = { + from: account.address, + to: deployedContract.options.address, + data: '0xcfae3217', // greet function call data encoded + }; + const { accessList } = await web3.eth.createAccessList(transaction, 'latest'); + + console.log('AccessList:', accessList); + // AccessList: [ + // { + // address: '0xce1f86f87bd3b8f32f0fb432f88e848f3a957ed7', + // storageKeys: [ + // '0x0000000000000000000000000000000000000000000000000000000000000001' + // ] + // } + // ] + + // create transaction object with accessList + const tx = { + from: account.address, + to: deployedContract.options.address, + gasLimit: BigInt(46000), + type: BigInt(1), // <- specify type + accessList, + data: '0xcfae3217', + // gasPrice - you can specify this property directly or web3js will fill this field automatically + }; + + // send transaction + const receipt = await web3.eth.sendTransaction(tx); + + console.log('Receipt:', receipt); + // Receipt: { + // blockHash: '0xc7b9561100c8ff6f1cde7a05916e86b7d037b2fdba86b0870e842d1814046e4b', + // blockNumber: 43n, + // cumulativeGasUsed: 26795n, + // effectiveGasPrice: 2504325716n, + // from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e', + // gasUsed: 26795n, + // logs: [], + // logsBloom: '0x...00000000000', + // status: 1n, + // to: '0xce1f86f87bd3b8f32f0fb432f88e848f3a957ed7', + // transactionHash: '0xa49753be1e2bd22c2a8e2530726614c808838bb0ebbed72809bbcb34f178799a', + // transactionIndex: 0n, + // type: 1n + // } +} +(async () => { + await test(); +})(); +``` + +### EIP-1559 Transaction + +Ethereum Improvement Proposal 1559 is a significant upgrade to the Ethereum network's fee market and transaction pricing mechanism. It was implemented as part of the Ethereum London hard fork, which occurred in August 2021. EIP-1559 introduces several changes to how transaction fees work on the Ethereum blockchain, with the primary goals of improving user experience and network efficiency. + +Here are some of the key features and changes introduced by EIP-1559: + +1. Base Fee: EIP-1559 introduces a concept called the 'base fee.' The base fee is the minimum fee required for a transaction to be included in a block. It is determined algorithmically by the network and adjusts dynamically based on network congestion. When the network is busy, the base fee increases, and when it's less congested, the base fee decreases. + +2. Inclusion Fee: In addition to the base fee, users can voluntarily include a 'tip' or 'inclusion fee' to incentivize miners to include their transactions in the next block. This allows users to expedite their transactions by offering a tip to miners. + +3. Predictable Fees: With EIP-1559, users have a more predictable way to estimate transaction fees. They can set the maximum fee they are willing to pay, which includes the base fee and the tip. This eliminates the need for users to guess the appropriate gas price. + +4. Burn Mechanism: EIP-1559 introduces a mechanism by which the base fee is 'burned' from circulation, reducing the overall supply of Ether (ETH). This deflationary mechanism can help address some of the concerns related to the increasing supply of ETH and potentially make it a better store of value. + +5. Improved Fee Auctions: Under EIP-1559, fee auctions are more efficient. Users specify the maximum fee they are willing to pay, and the protocol automatically adjusts the tip to ensure transactions get processed promptly without overpaying. + +6. Simpler Transaction Process: Users experience a simplified transaction process, as they don't have to set gas prices manually. Instead, they specify the maximum fee they are willing to pay, and the wallet software handles the rest. + +EIP-1559 has been well-received for its potential to create a more user-friendly and efficient transaction fee system, making the Ethereum network more accessible and predictable for users. It is also seen as an important step in the transition to Ethereum 2.0, which aims to address scalability and sustainability challenges on the network. + +To send EIP-1559 transaction use code below: + +```typescript +import { Web3 } from 'web3'; + +const web3 = new Web3('http://localhost:8545'); + +async function test() { + const privateKey = 'YOUR PRIVATE KEY HERE'; + // add private key to wallet to have auto-signing transactions feature + const account = web3.eth.accounts.privateKeyToAccount(privateKey); + web3.eth.accounts.wallet.add(account); + + // create transaction object + const tx = { + from: account.address, + to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab', + value: '0x1', + gasLimit: BigInt(21000), + type: BigInt(2), // <- specify type + // maxFeePerGas - you can specify this property directly or web3js will fill this field automatically + // maxPriorityFeePerGas - you can specify this property directly or web3js will fill this field automatically + }; + + // send transaction + const receipt = await web3.eth.sendTransaction(tx); + + console.log('Receipt:', receipt); + // Receipt: { + // blockHash: '0xfe472084d1471720b6887071d32a793f7c4576a489098e7d2a89aef205c977fb', + // blockNumber: 23n, + // cumulativeGasUsed: 21000n, + // effectiveGasPrice: 2546893579n, + // from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e', + // gasUsed: 21000n, + // logs: [], + // logsBloom: '0x0000...00000000000', + // status: 1n, + // to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab', + // transactionHash: '0x5c7a3d2965b426a5776e55f049ee379add44652322fb0b9fc2f7f57b38fafa2a', + // transactionIndex: 0n, + // type: 2n + // } +} +(async () => { + await test(); +})(); +``` + +## Conclusion + +In this tutorial, we learned how to use different methods provied by the `web3-eth` package. + +With this knowledge, you can start experimenting with the Ethereum blockchain. Keep in mind that this is just the beginning, and there is a lot more to learn about Ethereum and web3.js. So keep exploring and building, and have fun! + +Web3.js version 4.x provides a powerful and easy-to-use interface for interacting with the Ethereum network and building decentralized applications. And it has been rewritten in TypeScript but for simplicity of this tutorial we interacted with it in JavaScript. + +The Ethereum ecosystem is constantly evolving, and there is always more to learn and discover. As you continue to develop your skills and knowledge, keep exploring and experimenting with new technologies and tools to build innovative and decentralized solutions. + +## Additional Resources + +- [Official web3.js Documentation](https://docs.web3js.org/) +- [Solidity Documentation](https://solidity.readthedocs.io/) +- [Ganache](https://www.trufflesuite.com/ganache) +- [Truffle](https://trufflesuite.com/) +- [Remix IDE](https://remix.ethereum.org/) + +## Tips and Best Practices + +- Always test your smart contracts on a local network like Ganache or Hardhat before deploying them to the mainnet. +- Use the latest version of web3.js and Solidity to take advantage of the latest features and security patches. +- Keep your private keys secure and never share them with anyone. +- Use the gas limit and gas price parameters carefully to avoid spending too much on transaction fees. +- Use the `estimateGas` function in web3.js to estimate the gas required for a transaction before sending it to the network. +- Use events to notify the client application about state changes in the smart contract. +- Use a linter like Solhint to check for common Solidity coding errors. + diff --git a/docs/docs/guides/web3_eth/methods.md b/docs/docs/guides/web3_eth/methods.md new file mode 100644 index 00000000000..36125f0f253 --- /dev/null +++ b/docs/docs/guides/web3_eth/methods.md @@ -0,0 +1,120 @@ +--- +sidebar_position: 2 +sidebar_label: 'Web3Eth methods' +--- + +# Web3Eth methods + +## createAccessList + + +The [createAccessList](/api/web3-eth/function/createAccessList) method is used to create an access list. +Creating an access list in Ethereum is typically associated with Ethereum Improvement Proposal (EIP)-2930, which introduces a way to specify which accounts and storage keys a transaction expects to access. Access lists are used to optimize gas costs for transactions by providing explicit information about what the transaction needs to access. + +## estimateGas + +The [estimateGas](/api/web3-eth/function/estimateGas) function is used to estimate the amount of gas that will be consumed when executing a specific transaction or invoking a contract function. This can be very useful when you want to determine the potential cost of a transaction or function call before actually sending it to the Ethereum network. It helps users ensure that they have enough ether to cover the gas costs for the operation. + +## getBalance + +The [getBalance](/api/web3-eth/function/getBalance) function is used to retrieve the balance of an Ethereum address, which represents the amount of Ether (ETH) associated with that address. It's a fundamental and frequently used function when working with Ethereum applications. + +## getBlock + +The [getBlock](/api/web3-eth/function/getBlock) function is used to retrieve information about a specific Ethereum block. Ethereum blocks are the fundamental building blocks of the blockchain, containing a collection of transactions and other data. + +## getBlockNumber + +The [getBlockNumber](/api/web3-eth/function/getBlockNumber) function is used to retrieve the latest block number (also known as the block height) of the Ethereum blockchain. The block number is a crucial piece of information in Ethereum as it represents the current state of the blockchain, indicating the total number of blocks that have been mined up to the present. + +## getBlockTransactionCount + +The [getBlockTransactionCount](/api/web3-eth/function/getBlockTransactionCount) function is used to retrieve the number of transactions in a specific Ethereum block. It allows you to determine how many transactions were included in a particular block on the Ethereum blockchain. + +## getBlockUncleCount + +The [getBlockUncleCount](/api/web3-eth/function/getBlockUncleCount) function is used to retrieve the number of uncle blocks associated with a specific Ethereum block. In Ethereum, uncle blocks (also known as "stale blocks" or "ommer blocks") are blocks that were mined but not included in the main blockchain. They are referenced by other blocks as a way to reward miners for their efforts even if their blocks weren't part of the main chain. + +## getChainId + +The [getChainId](/api/web3-eth/function/getChainId) function is used to retrieve the chain ID of the connected Ethereum network. The chain ID is a unique identifier for a specific Ethereum network, and it's used to help prevent replay attacks when signing transactions. Different Ethereum networks, such as the mainnet, testnets, and private networks, have distinct chain IDs. + +## getCode + +The [getCode](/api/web3-eth/function/getCode) function library is used to retrieve the bytecode of a smart contract deployed on the Ethereum blockchain. Smart contracts on Ethereum are typically created by deploying bytecode to a specific address, and this function allows you to fetch the bytecode associated with a particular contract address. + +## getCoinbase + +The [getCoinbase](/api/web3-eth/function/getCoinbase) function is used to retrieve the address of the Ethereum account that is currently acting as the coinbase address for mining on the connected Ethereum node. The coinbase address is the address to which block rewards are sent when miners successfully mine a new block on the Ethereum blockchain. Miners configure their coinbase addresses to receive rewards for their mining efforts. + +## getGasPrice + +The [getGasPrice](/api/web3-eth/function/getGasPrice) function is used to retrieve the current gas price on the Ethereum network. Gas price is the amount of Ether (ETH) that users are willing to pay for each unit of gas when executing a transaction on the Ethereum network. Gas price is an important factor in determining the transaction fee (in ETH) for a transaction. + +## getPendingTransactions + +The [getPendingTransactions](/api/web3-eth/function/getPendingTransactions) function is used to retrieve information about pending transactions in the Ethereum network. Pending transactions are transactions that have been submitted to the network but have not yet been included in a mined block. This function allows you to access information about transactions that are waiting to be confirmed by miners. + +## getProof + +The [getProof](/api/web3-eth/function/getProof) function is used to obtain a Merkle proof or Patricia trie proof for a specific value or data in an Ethereum smart contract's storage. This function is typically used when you want to validate that a piece of data is stored in the contract's storage or to provide evidence for data inclusion without having to interact with the entire contract state. + +In Ethereum, storage proofs are used to demonstrate the existence of a value within a contract's storage without querying the entire storage of the contract, which can be computationally expensive. These proofs are essential for various applications, including decentralized exchanges, blockchain explorers, and certain cryptographic operations. + +## getProtocolVersion + +You can use the [getProtocolVersion](/api/web3-eth/function/getProtocolVersion) method to retrieve the current Ethereum protocol version of the connected Ethereum node. + +## getStorageAt + +The [getStorageAt](/api/web3-eth/function/getStorageAt) method is used to fetch the data stored at a specific storage slot of an Ethereum address. It is often used for inspecting the internal state of smart contracts, especially when you want to retrieve the value of a specific variable in a contract's storage. + +## getTransaction + +The [getTransaction](/api/web3-eth/function/getTransaction) method allows you to retrieve information about a transaction based on its transaction hash. You provide the transaction hash, and this method returns an object containing details about the transaction + +## getTransactionCount + +The [getTransactionCount](/api/web3-eth/function/getTransactionCount) method allows you to retrieve the transaction count (nonce) of a specific Ethereum address. + +## getTransactionReceipt + +The [getTransactionReceipt](/api/web3-eth/function/getTransactionReceipt) method allows you to retrieve the transaction receipt for a specific transaction based on its transaction hash. + +## getUncle + +The [getUncle](/api/web3-eth/function/getUncle) method allows you to retrieve information about an uncle block at a specific index within a given block. + +## isMining + +The [isMining](/api/web3-eth/function/isMining) function returns a boolean value, indicating whether the node is actively mining or not. + +## isSyncing + +The [isSyncing](/api/web3-eth/function/isSyncing) method allows you to check the current synchronization status of your Ethereum node. + +## sendTransaction + +The [sendTransaction](/api/web3-eth/function/sendTransaction) method is used to create and send a transaction to the Ethereum network. + +:::important +Please be cautious when sending transactions, especially when dealing with smart contracts, as they may execute specific functions that can have irreversible effects. Always ensure that the details in your transaction object are accurate and intended. + +[Here](guides/wallet/transactions) you can find more examples how to send transaction. +::: + +## sign + +The [sign](/api/web3-eth/function/sign) method is used to sign a message or data using a private key. This is often used to prove ownership or authorship of a specific piece of data or to provide cryptographic proof in various Ethereum-related operations. + +## signTransaction + +The [signTransaction](/api/web3-eth/function/signTransaction) method is used to sign an Ethereum transaction, creating a signed transaction object that can be broadcast to the Ethereum network. + +## sendSignedTransaction + +The [sendSignedTransaction](/api/web3-eth/function/sendSignedTransaction) method is used to send a signed Ethereum transaction to the Ethereum network. Before sending a transaction, you need to sign it using a private key, and then you can use this method to broadcast the signed transaction to the network. + +:::note +[Here](/guides/wallet/transactions) you can find more examples how to send transaction. +::: \ No newline at end of file diff --git a/docs/docs/guides/web3_plugin_guide/_category_.yml b/docs/docs/guides/web3_plugin_guide/_category_.yml new file mode 100644 index 00000000000..afd1de17e96 --- /dev/null +++ b/docs/docs/guides/web3_plugin_guide/_category_.yml @@ -0,0 +1,5 @@ +label: '🧩🛠️ Web3 Plugin' +collapsible: true +collapsed: true +link: null +position: 13 \ No newline at end of file diff --git a/docs/docs/guides/web3_plugin_guide/assets/web3_context_augmentation.png b/docs/docs/guides/web3_plugin_guide/assets/web3_context_augmentation.png new file mode 100644 index 00000000000..8ab373ec754 Binary files /dev/null and b/docs/docs/guides/web3_plugin_guide/assets/web3_context_augmentation.png differ diff --git a/docs/docs/guides/web3_plugin_guide/index.md b/docs/docs/guides/web3_plugin_guide/index.md new file mode 100644 index 00000000000..365ca7b82f1 --- /dev/null +++ b/docs/docs/guides/web3_plugin_guide/index.md @@ -0,0 +1,50 @@ +--- +sidebar_position: 1 +sidebar_label: 'Introduction' +--- + +# Introduction + +Welcome to the web3.js Plugins Guide, an exciting new feature introduced in web3.js v4! In addition to the core web3.js libraries, plugins bring specialized functionalities tailored for end-users (functionalities that you, as a developer, can create). These enhancements may involve creating wrappers for specific contracts, adding extra features to RPC methods, or extending the capabilities of web3.js methods. Dive in and explore this innovative addition to web3.js v4! + +- [Plugin Developer Guide (For Creators)](/guides/web3_plugin_guide/plugin_authors) +- [Plugin User Guide (Usage)](/guides/web3_plugin_guide/plugin_users) +- [Plugin List](https://web3js.org/plugins) + + +## Plugin Showcase + +### Chainlink Plugin +- [`npm i @chainsafe/web3-plugin-chainlink`](https://www.npmjs.com/package/@chainsafe/web3-plugin-chainlink) +- **Description**: A Web3.js 4.x Plugin for Interacting With Chainlink Smart Contracts +- **Author**: ChainSafe Systems + +### Tokens Plugin +- [`npm i @chainsafe/web3-plugin-tokens`](https://www.npmjs.com/package/@chainsafe/web3-plugin-tokens) +- **Description**: Plugin to extend web3.js with additional methods to interact with common token interfaces (ERC20, ERC721, ERC1155...) +- **Author**: Peter Grassberger & ChainSafe + +### Craftsman Plugin +- [`npm i web3-plugin-craftsman`](https://www.npmjs.com/package/web3-plugin-craftsman) +- **Description**: web3.js plugin allowing instantiation of contract objects directly from Solidity source code +- **Author**: Muhammad-Altabba + +### Optimism Plugin +- [`npm i @eth-optimism/web3.js-plugin`](https://www.npmjs.com/package/@eth-optimism/web3.js-plugin) +- **Description**: Web3.js plugin for OP-Chain gas estimation +- **Author**: Unknown + +### Near Protocol Plugin +- [`npm i @conx3/web3-plugin-near`](https://npmjs.com/package/@conx3/web3-plugin-near) +- **Description**: web3.js plugin for Near Protocol +- **Author**: Muhammad Altabba + +### Aurora Engine Plugin +- [`npm i @conx3/web3-plugin-aurora`](https://www.npmjs.com/package/@conx3/web3-plugin-aurora) +- **Description**: web3.js plugin for Aurora Engine, an EVM running atop NEAR protocol +- **Author**: Muhammad Altabba + +### Superfluid Plugin +- [`npm i web3-plugin-superfluid`](https://www.npmjs.com/package/web3-plugin-superfluid) +- **Description**: Superfluid Web3.js Plugin +- **Author**: Salman Dabbakuti diff --git a/docs/docs/guides/web3_plugin_guide/plugin_authors.md b/docs/docs/guides/web3_plugin_guide/plugin_authors.md new file mode 100644 index 00000000000..bde1e1e6558 --- /dev/null +++ b/docs/docs/guides/web3_plugin_guide/plugin_authors.md @@ -0,0 +1,329 @@ +--- +sidebar_position: 2 +sidebar_label: 'For Plugin Developers' +--- + +# Plugin Developer Guide + +This guide intends to provide the necessary context for developing plugins for web3.js. + +Feel free to explore some of [the already built plugins](https://web3js.org/plugins) and/or +use this [template](https://github.com/ChainSafe/web3.js-plugin-template) to start with development of your Web3.js plugin. + +:::caution +To provide type safety and IntelliSense for your plugin users, please refer to the [Setting Up Module Augmentation](#setting-up-module-augmentation) section for how to augment the `Web3Context` module to enable typing features for your plugin. +::: + +## Plugin Dependencies + +At the minimum, your plugin should depend on `web3` package version `4.0.2`. This will allow your plugin class to extend the provided `Web3PluginBase` abstract class. However, `web3` shouldn't be listed as a regular dependency, instead it should be listed in your plugin's `package.json` as a [peer dependency](https://nodejs.org/en/blog/npm/peer-dependencies/). + +:::important +It is important to note that the plugin name should be structured as `@/web3-plugin-` or `web3-plugin-`. +::: + +```json +{ + "name": "web3-plugin-custom-rpc-methods", + "version": "0.1.0", + "peerDependencies": { + "web3": ">= 4.0.2 < 5" + } +} +``` + +When your users install your plugin, this will allow the package manager to make use of the user installed `web3` if available and if the version satisfies the version constraints instead of installing its own version of `web3`. + +## Add New Transaction Type + +Furthermore, you have the flexibility to expand your range of transaction types, enhancing compatibility with the `web3.js` library. + + +```typescript +// create new TransactionType class which extends BaseTransaction class +import { BaseTransaction } from 'web3-eth-accounts'; +const TRANSACTION_TYPE = 15; +class SomeNewTxTypeTransaction extends BaseTransaction { + // ... +} + +// create new plugin and add `SomeNewTxTypeTransaction` to the library +import { Web3EthPluginBase } from 'web3'; + +class SomeNewTxTypeTransactionPlugin extends Web3PluginBase { + public pluginNamespace = 'someNewTxTypeTransaction'; + public constructor() { + super(); + TransactionFactory.registerTransactionType(TRANSACTION_TYPE, SomeNewTxTypeTransaction); + } +} +``` + +## Extending `Web3PluginBase` + +Your plugin class should `extend` the `Web3PluginBase` abstract class. This class `extends` [Web3Context](/api/web3-core/class/Web3Context) and when the user registers your plugin with a class, your plugin's `Web3Context` will point to the module's `Web3Context` giving your plugin access to things such as user configured [requestManager](/api/web3-core/class/Web3Context#requestManager) and [accountProvider](/api/web3-core/class/Web3Context#accountProvider). + +```typescript +import { Web3PluginBase } from 'web3'; + +export class CustomRpcMethodsPlugin extends Web3PluginBase { ... } +``` + +### Extending `Web3EthPluginBase` + +In addition to `Web3PluginBase`, you can choose to extend `Web3EthPluginBase` which will provide the [Ethereum JSON RPC API interface](/api/web3-types#EthExecutionAPI), which packages such as `Web3Eth` use, as a generic to your plugin's `requestManager`, giving it type support for the [Ethereum JSON RPC spec](https://ethereum.github.io/execution-apis/api-documentation/). This would be the recommended approach if your plugin makes Ethereum JSON RPC calls directly to a provider using web3's provided `requestManager`. + +```typescript +import { Web3EthPluginBase } from 'web3'; + +export class CustomRpcMethodsPlugin extends Web3EthPluginBase { ... } +``` + +### `pluginNamespace` + +After extending the `Web3PluginBase` class, your plugin will need a `public` `pluginNamespace` property that configures how your plugin will be accessed on the class, which your plugin was registered with. In the following example, the `pluginNamespace` is set to `customRpcMethods`, so when the user registers the plugin they will access your plugin as follows: + +The following represents your plugin code: + +```typescript +// custom_rpc_methods_plugin.ts +import { Web3PluginBase } from 'web3'; + +export class CustomRpcMethodsPlugin extends Web3PluginBase { + public pluginNamespace = 'customRpcMethods'; + + public someMethod() { + return 'someValue'; + } +} +``` + +The following represents the plugin user's code: + +```typescript +// registering_a_plugin.ts +import { Web3Context } from 'web3'; + +import { CustomRpcMethodsPlugin } from './custom_rpc_methods_plugin'; + +const web3Context = new Web3Context('http://127.0.0.1:8545'); +web3Context.registerPlugin(new CustomRpcMethodsPlugin()); + +await web3Context.customRpcMethods.someMethod(); +``` + +### Using the Inherited `Web3Context` + +Below is an example of `CustomRpcMethodsPlugin` making use of `this.requestManager` which will have access to an Ethereum provider if one was configured by the user. In the event that no `provider` was set by the user, the below code will throw a [ProviderError](/api/web3-errors/class/ProviderError) if `customRpcMethod` was to be called: + +```typescript +import { Web3PluginBase } from 'web3'; + +export class CustomRpcMethodsPlugin extends Web3PluginBase { + public pluginNamespace = 'customRpcMethods'; + + public async customRpcMethod() { + return this.requestManager.send({ + method: 'custom_rpc_method', + params: [], + }); + } +} +``` + +Below depicts a plugin user's code that does not configure an Ethereum provider, resulting in a thrown [ProviderError](/api/web3-errors/class/ProviderError) when calling `customRpcMethod`: + +```typescript +// registering_a_plugin.ts +import { Web3Context } from 'web3'; + +import { CustomRpcMethodsPlugin } from './custom_rpc_methods_plugin'; + +const web3Context = new Web3Context(); +web3Context.registerPlugin(new CustomRpcMethodsPlugin()); + +// The following would result in a thrown ProviderError when +// the plugin attempts to call this.requestManager.send(...) +await web3Context.customRpcMethods.customRpcMethod(); +``` + +Thrown [ProviderError](/api/web3-errors/class/ProviderError): + +```bash +ProviderError: Provider not available. Use `.setProvider` or `.provider=` to initialize the provider. +``` + +### Providing an API Generic to `Web3PluginBase` + +If needed, you can provide an API type (that follows the [Web3ApiSpec](/api/web3-types#Web3APISpec) pattern) as a generic to `Web3PluginBase` that will add type hinting to the `requestManager` when developing your plugin. In the below code, this is the `CustomRpcApi` type that's being passed as `Web3PluginBase` + +```typescript +import { Web3PluginBase } from 'web3'; + +type CustomRpcApi = { + custom_rpc_method_with_parameters: (parameter1: string, parameter2: number) => string; +}; + +export class CustomRpcMethodsPlugin extends Web3PluginBase { + public pluginNamespace = 'customRpcMethods'; + + public async customRpcMethodWithParameters(parameter1: string, parameter2: number) { + return this.requestManager.send({ + method: 'custom_rpc_method_with_parameters', + params: [parameter1, parameter2], + }); + } +} +``` + +## Using web3.js Packages within Your Plugin + +### Overriding `Web3Context`'s `.link` Method + +There currently exists [an issue](https://github.com/web3/web3.js/issues/5492) with certain web3.js packages not correctly linking their `Web3Context` with the context of the class the user has registered the plugin with. As mentioned in the issue, this can result in a bug where a plugin instantiates an instance of `Contract` (from `web3-eth-contract`) and attempts to call a method on the `Contract` instance (which uses the `requestManager` to make a call to the Ethereum provider), resulting in a [ProviderError](/api/web3-errors/class/ProviderError) even though the plugin user has set a provider and it should be available to the plugin. + +A workaround for this issue is available, below is an example of it: + +```typescript +import { Contract, ContractAbi, Web3Context, Web3PluginBase, types, utils } from 'web3'; + +import { ERC20TokenAbi } from './ERC20Token'; + +export class ContractMethodWrappersPlugin extends Web3PluginBase { + public pluginNamespace = 'contractMethodWrappersPlugin'; + + private readonly _contract: Contract; + + public constructor(abi: ContractAbi, address: types.Address) { + super(); + this._contract = new Contract(abi, address); + } + + /** + * This method overrides the inherited `link` method from + * `Web3PluginBase` to add a configured `RequestManager` + * to the Contract instance when `Web3.registerPlugin` + * is called. + * + * @param parentContext - The context to be added to the instance of `ChainlinkPlugin`, + * and by extension, the instance of `Contract`. + */ + public link(parentContext: Web3Context) { + super.link(parentContext); + this._contract.link(parentContext); + } + + public async getFormattedBalance(address: types.Address, returnFormat?: ReturnFormat) { + return utils.format({ eth: 'unit' }, await this._contract.methods.balanceOf(address).call(), returnFormat ?? types.DEFAULT_RETURN_FORMAT); + } +} +``` + +The workaround is overwriting the inherited `link` method (inherited from `Web3PluginBase` which inherits it from `Web3Context`) and explicitly calling `.link` on the `Contract` instance. The `parentContext` will get passed when the user calls `registerPlugin`, it will be the context of the class the user is registering your plugin with. + +The following is the workaround, and will probably need to be done for any instantiated web3.js package your plugin uses that makes use of `Web3Context`: + +```typescript +public link(parentContext: Web3Context) { + super.link(parentContext); + // This workaround will ensure the context of the Contract + // instance is linked to the context of the class the + // plugin user is registering the plugin with + this._contract.link(parentContext); +} +``` + +## Setting Up Module Augmentation + +In order to provide type safety and IntelliSense for your plugin when it's registered by the user, you must [augment](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation) the `Web3Context` module. In simpler terms, you will be making TypeScript aware that you are modifying the interface of the class `Web3Context`, and any class that extends it, to include the interface of your plugin (i.e. your plugin's added methods, properties, etc.). As a result, your plugin object will be accessible within a namespace of your choice, which will be available within any `Web3Context` object. + +A good tutorial that further explains Module Augmentation, in general, can be found [here](https://www.digitalocean.com/community/tutorials/typescript-module-augmentation). + +### Module Augmentation + +When registering a plugin, you're adding additional methods and/or classes to the module's interface and TypeScript needs a little help understanding what's going to be available within the module after the plugin is registered. + +```typescript +// custom_rpc_methods_plugin.ts +import { Web3PluginBase } from 'web3'; + +export class CustomRpcMethodsPlugin extends Web3PluginBase { + public pluginNamespace = 'customRpcMethods'; + + public someMethod() { + return 'someValue'; + } +} + +// Module Augmentation +declare module 'web3' { + // Here is where you're adding your plugin's + // class inside Web3Context class + interface Web3Context { + customRpcMethods: CustomRpcMethodsPlugin; + } +} +``` + +### Important points to consider + +1. By augmenting `Web3Context` (and, by extension, all the classes that extend it), your plugin's interface will show up in things like IntelliSense for **all** Web3 modules that extend `Web3Context`, even if your plugin isn't registered. + This is something worth making your users aware of, as they'll only be able to use your plugin if they register it with a Web3 class instance using `.registerPlugin`. + +:::danger + +The following represent what your **plugin users** would see, when they use the plugin `CustomRpcMethodsPlugin`, without calling `.registerPlugin`: + +![web3 context augmentation](./assets/web3_context_augmentation.png 'Web3Context augmentation') + +The above screenshot shows IntelliSense thinking `.customRpcMethods.someMethod` is available to call on the instance of `Web3`, regardless if the plugin user registered or did not register `CustomRpcMethodsPlugin`. +But, the user who does not call `.registerPlugin`, before accessing your plugin, would face an error. And you need to make it clear for them that they need to call `.registerPlugin`, before they can access any plugin functionality. + +::: + +2. The `registerPlugin` method exists on the `Web3Context` class, so any class that `extends Web3Context` has the ability to add your plugin's additional functionality to its interface. So, by augmenting `Web3Context` to include your plugin's interface, you're essentially providing a blanket augmentation that adds your plugin's interface to **all** Web3 modules that extend `Web3Context` (i.e. `web3`, `web3-eth`, `web3-eth-contract`, etc.). + +3. The value of the `pluginNamespace`, that we used `customRpcMethods` for it in our sample code, **MUST** have the exact same name at 2 places: The first place is in the augmentation. And the second is the value of the public `pluginNamespace` inside your plugin class. + + So, for example, kindly notice using `customRpcMethods` in the next 2 snippets: + + Module Augmentation: + +```typescript +// code written by the plugin **developer** + +declare module 'web3' { + // Here is where you're adding your plugin inside Web3Context + interface Web3Context { + customRpcMethods: CustomRpcMethodsPlugin; + } +} +``` + +Your the plugin class: + +```typescript +// code written by the plugin **developer** + +export class CustomRpcMethodsPlugin extends Web3PluginBase { + public pluginNamespace = 'customRpcMethods'; + + //... +} +``` + +This is because `.registerPlugin` will use the `pluginNamespace` property provided by the plugin as the property name when it registers the plugin with the class instance that the **plugin user** will call `.registerPlugin` on: + +```typescript +// code written by the plugin **user** + +const web3 = new Web3('http://127.0.0.1:8545'); +web3.registerPlugin(new CustomRpcMethodsPlugin()); +// Now customRpcMethods (i.e. the pluginNamespace) is available +// on the instance of Web3 +web3.customRpcMethods; +``` + +## Complete Example + +You may find it helpful to reference a complete example for developing and using a web3 plugin. The [Web3.js Chainlink Plugin](https://github.com/ChainSafe/web3.js-plugin-chainlink/) repository provides an excellent example which you can check out. diff --git a/docs/docs/guides/web3_plugin_guide/plugin_users.md b/docs/docs/guides/web3_plugin_guide/plugin_users.md new file mode 100644 index 00000000000..3c900d9e2a3 --- /dev/null +++ b/docs/docs/guides/web3_plugin_guide/plugin_users.md @@ -0,0 +1,129 @@ +--- +sidebar_position: 3 +sidebar_label: 'For Plugin Users' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Plugin User Guide + +This guide intends to provide the necessary context for registering plugins with web3.js packages. + +To help you get started, take a look at a list of useful plugins at [https://web3js.org/plugins](https://web3js.org/plugins) + +## Installing the Plugin + +Unless otherwise mentioned by the plugin author, installing a plugin should be as simple as `yarn add web3-plugin-example`. This should add the plugin as a dependency within your `package.json` and the plugin should be available to import within your code. + +```json +# package.json +{ + ... + "dependencies": { + "web3-plugin-example": "0.1.0" + } +} +``` + +## Registering the Plugin + +To add a plugin to an instance of a class sourced from web3.js' modules (such as `Web3` or `Web3Eth`), you will use the `.registerPlugin` method. It's important to note that this method is only available on classes that extend `Web3Context`, so it may not be available on every class you import from a Web3.js package. + +For illustration purposes, let's assume a plugin developer has the following code for their plugin. Please note that this code should not be touched by the plugin user: + + + + + +```typescript +// code written by the plugin **developer** + +const { Web3PluginBase } = require('web3'); + +export class PluginExample extends Web3PluginBase { + public pluginNamespace = 'pluginExample'; + + public sampleMethod() { + return 'simpleValue'; + } +} + +// Module Augmentation +declare module 'web3' { + interface Web3Context { + pluginExample: PluginExample; + } +} +``` + + + + + + +```typescript +// code written by the plugin **developer** + +import { Web3PluginBase } from 'web3'; + +export class PluginExample extends Web3PluginBase { + public pluginNamespace = 'pluginExample'; + + public sampleMethod() { + return 'simpleValue'; + } +} + +// Module Augmentation +declare module 'web3' { + interface Web3Context { + pluginExample: PluginExample; + } +} +``` + + + + +Here is an example of how to register the `PluginExample` onto an instance of `Web3`: + + + + + +```javascript +// code written by the plugin **user** + +const { Web3 } = require('web3'); +const { PluginExample } = require('web3-plugin-example'); + +const web3 = new Web3('http://127.0.0.1:8545'); +web3.registerPlugin(new PluginExample(any_parameters, if_needed)); + +web3.pluginExample.sampleMethod(); +``` + + + + + + +```typescript +// code written by the plugin **user** + +import { Web3 } from 'web3'; +import { PluginExample } from 'web3-plugin-example'; + +const web3 = new Web3('http://127.0.0.1:8545'); +web3.registerPlugin(new PluginExample(any_parameters, if_needed)); + +web3.pluginExample.sampleMethod(); +``` + + + \ No newline at end of file diff --git a/docs/docs/guides/web3_providers_guide/_category_.yml b/docs/docs/guides/web3_providers_guide/_category_.yml new file mode 100644 index 00000000000..3b85fe4849e --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/_category_.yml @@ -0,0 +1,5 @@ +label: '🔌 Providers' +collapsible: true +collapsed: true +link: null +position: 2 \ No newline at end of file diff --git a/docs/docs/guides/web3_providers_guide/eip6963.md b/docs/docs/guides/web3_providers_guide/eip6963.md new file mode 100644 index 00000000000..0965e440c9b --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/eip6963.md @@ -0,0 +1,67 @@ +--- +sidebar_position: 2 +sidebar_label: 'EIP-6963: Multi Injected Provider Discovery' +--- + +# EIP-6963: Multi Injected Provider Discovery + +## Introduction + +EIP-6963 proposes the "Multi Injected Provider Discovery" standard, which aims to enhance the discoverability and interaction with multiple injected Ethereum providers in a browser environment. Injected providers refer to browser extensions or other injected scripts that provide access to an Ethereum provider within the context of a web application. + +Web3.js library has utility functions for discovery of injected providers using `requestEIP6963Providers()` and `onNewProviderDiscovered(eventDetails)`. + +`onNewProviderDiscovered(eventDetails)` can be used to subscribe to events of provider discovery & providers map update and `requestEIP6963Providers()` returns Promise object that resolves to `Map` object containing list of providers. For updated providers `eip6963:providersMapUpdated` event is emitted and it has updated Map object. This event can be subscribed as mentioned earlier using `onNewProviderDiscovered(eventDetails)` + +`eip6963ProvidersMap` object has provider's `UUID` as keys and `EIP6963ProviderDetail` as values. `EIP6963ProviderDetail` is: + +```ts +export interface EIP6963ProviderDetail { + info: EIP6963ProviderInfo; + provider: EIP1193Provider; +} +``` + +where `info` has details of provider containing UUID, name, Icon and RDNS as defined in EIP-6963: + +```ts +export interface EIP6963ProviderInfo { + uuid: string; + name: string; + icon: string; + rdns: string; +} +``` + +`provider` in `EIP6963ProviderDetail` is `EIP1193Provider` and it contains actual provider that can be injected in web3 instance. + +Following code snippet demonstrates usage of `requestEIP6963Providers()` function for providers discovery. + +```ts +//Assuming multiple providers are installed in browser. + +import { Web3 } from 'web3'; + +// Following will subscribe to event that will be triggered when providers map is updated. + +Web3.onNewProviderDiscovered((provider) => { + console.log(provider.detail); // This will log the populated providers map object, provider.detail has Map of all providers yet discovered + // add logic here for updating UI of your DApp +}); + +// Call the function and wait for the promise to resolve +let providers = await Web3.requestEIP6963Providers(); +for (const [key, value] of providers) { + console.log(value); + +/* Based on your DApp's logic show use list of providers and get selected provider's UUID from user for injecting its EIP6963ProviderDetail.provider EIP1193 object into web3 object */ + + if (value.info.name === 'MetaMask') { + const web3 = new Web3(value.provider); + + // now you can use web3 object with injected provider + console.log(await web3.eth.getTransaction('0x82512812c11f56aa2474a16d5cc8916b73cd6ed96bf9b8defb3499ec2d9070cb')); + } +} + +``` \ No newline at end of file diff --git a/docs/docs/guides/web3_providers_guide/events_listening.md b/docs/docs/guides/web3_providers_guide/events_listening.md new file mode 100644 index 00000000000..a8e36a3cd22 --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/events_listening.md @@ -0,0 +1,68 @@ +--- +sidebar_position: 3 +sidebar_label: 'Providers Events Listening' +--- + +# Providers Events Listening + +Some providers are, by design, always connected. Therefor, they can communicate changes with the user through events. Actually, among the 3 providers, `HttpProvider` is the only one that does not support event. And the other 2: +[WebSocketProvider](/api/web3-providers-ws/class/WebSocketProvider) and [IpcProvider](/api/web3-providers-ipc/class/IpcProvider) enable the user to listen to emitted events. + +Actually, the events can be categorized as follows ([according to EIP 1193](https://eips.ethereum.org/EIPS/eip-1193#rationale)): + +- Communicate arbitrary messages: `message` +- Changes to the Provider’s ability to make RPC requests; + - `connect` + - `disconnect` +- Common Client and/or Wallet state changes that any non-trivial application must handle: + - `chainChanged` + - `accountsChanged` + +Below a sample code for listening and remove listening to EIP 1193 events: + +```ts title='Listening to EIP1193 events'import { Web3 } from 'web3'; +import { Web3 } from 'web3'; + +const web3 = new Web3(/* PROVIDER*/); + +web3.provider.on('message', () => { + // ... +}); + +web3.provider.on('connect', () => { + // ... +}); + +web3.provider.on('disconnect', () => { + // ... +}); + +web3.provider.on('accountsChanged', () => { + // ... +}); + +web3.provider.on('chainChanged', () => { + // ... +}); + +// it is possible to catch errors that could happen in the underlying connection Socket with the `error` event +// and it is also used to catch the error when max reconnection attempts is exceeded +// as in section: /docs/guides/web3_providers_guide/#error-message +web3.provider.on('error', () => { + // ... +}); + +// ... + +// for every event above `once` can be used to register to the event only once +web3.provider.once('SUPPORTED_EVENT_NAME', () => { + // ... +}); + +// And to unregister a listener `removeListener` could be called +web3.provider.removeListener('SUPPORTED_EVENT_NAME', () => { + // ... +}); +``` + +However, the underlying `SocketConnection` of both `WebSocketProvider` and `IpcProvider` could be accessed. This enables the user to access any special properties of the used Socket. As well as, registering to the custom server events directly. Actually the Socket used at `WebSocketProvider` is [isomorphic-ws](https://github.com/heineiuo/isomorphic-ws). And the Socket used at `IpcProvider` is [net.Server](https://nodejs.org/api/net.html#class-netserver) diff --git a/docs/docs/guides/web3_providers_guide/http.md b/docs/docs/guides/web3_providers_guide/http.md new file mode 100644 index 00000000000..06dbc0d8125 --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/http.md @@ -0,0 +1,113 @@ +--- +sidebar_position: 4 +sidebar_label: 'Tutorial: HTTP Provider' +--- + +# Tutorial: HTTP Provider + +The HTTP Provider is the simplest and most widely used provider, while the Websocket Provider and IPC Provider offer real-time communication and faster performance, respectively. With these providers, you can connect your web application to the Ethereum network and start building decentralized applications. + +## Prerequisites + +Before we get started, make sure you have a basic understanding of JavaScript and Ethereum. Additionally, we need to set up our environment by installing the following: + +1. **Ganache** + + Ganache is a personal blockchain for Ethereum development that allows you to test how your smart contracts function in real-world scenarios. You can download it from [http://truffleframework.com/ganache](http://truffleframework.com/ganache). + +2. **Node.js** + + Node.js is a JavaScript runtime environment that enables you to run JavaScript on the server-side. You can download it from [https://nodejs.org/en/download/](https://nodejs.org/en/download/). + +3. **npm** + + npm (Node Package Manager) is used to publish and install packages to and from the public npm registry or a private npm registry. You can install it by following the instructions here: [https://docs.npmjs.com/downloading-and-installing-node-js-and-npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). + + Alternatively, you can use **yarn** instead of **npm** by following the instructions here: [https://classic.yarnpkg.com/lang/en/docs/getting-started/](https://classic.yarnpkg.com/lang/en/docs/getting-started/). + +## HTTP Provider + +The HTTP Provider allows you to connect to a publicly available Ethereum node, making it easy and straightforward to communicate with the Ethereum network from your web application. + +To connect to the Ethereum network using the HTTP provider, follow these steps: + +1. Open a command prompt or terminal window and navigate to the directory where you want to create the folder for this example. +2. Create a new folder and navigate to it: + +```bash +mkdir web3-providers-tutorial +cd web3-providers-tutorial +``` + +3. Install web3.js using npm: + +```bash +npm i web3 +``` + +4. Create a new JavaScript file called `web3-http-provider.js` in your code editor. + +5. Copy and paste the following code into your `web3-http-provider.js` file and save it: + +```typescript title='HTTP Provider' +import { Web3 } from 'web3'; + +// Connect to the Ethereum network using the HTTP provider +const ganacheUrl = 'http://localhost:7545'; +const httpProvider = new Web3.providers.HttpProvider(ganacheUrl); +const web3 = new Web3(httpProvider); + +async function main() { + try { + // Get the current block number from the network + const currentBlockNumber = await web3.eth.getBlockNumber(); + console.log('Current block number:', currentBlockNumber); + + // Get the list of accounts in the connected node (e.g., Ganache) + const accounts = await web3.eth.getAccounts(); + + // Send a transaction to the network and wait for the transaction to be mined. + // Note that sending a transaction with Ganache will cause it, in its default configuration, to min a new block. + const transactionReceipt = await web3.eth.sendTransaction({ + from: accounts[0], + to: accounts[1], + value: web3.utils.toWei('0.001', 'ether'), + }); + console.log('Transaction Receipt:', transactionReceipt); + + // Get the updated block number + const updatedBlockNumber = await web3.eth.getBlockNumber(); + console.log('Updated block number:', updatedBlockNumber); + } catch (error) { + console.error('An error occurred:', error); + } +} + +main(); +``` + +6. Ensure that Ganache is running as mentioned in the [Prerequisites](#prerequisites) section. + +7. In the command prompt or terminal window, type `node web3-http-provider.js` and press Enter. This will run your JavaScript file and connect to the Ethereum network using the HTTP provider and Ganache. + +If everything is set up properly, you should see the current block number, the transaction receipt, and the updated block number printed in the console: + +```bash +Current block number: 0n +Transaction Receipt: { + transactionHash: '0x0578672e97d072b4b91773c8bfc710e4f777616398b82b276323408e59d11362', + transactionIndex: 0n, + blockNumber: 1n, + blockHash: '0x348a6706e7cce6547fae2c06b3e8eff1f58e4669aff88f0af7ca250ffdcdeef5', + from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + cumulativeGasUsed: 21000n, + gasUsed: 21000n, + logs: [], + logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: 1n, + effectiveGasPrice: 2000000000n, + type: 0n +} +Updated block number: 1n +``` diff --git a/docs/docs/guides/web3_providers_guide/index.md b/docs/docs/guides/web3_providers_guide/index.md new file mode 100644 index 00000000000..e3ecc880cb0 --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/index.md @@ -0,0 +1,382 @@ +--- +sidebar_position: 1 +sidebar_label: 'Mastering Providers' +--- + +# Web3js providers overview + + +## Live code editor + + + +## Introduction + +web3.js providers are objects responsible for enabling connectivity with the Ethereum network in various ways. Connecting your web application to an Ethereum node is necessary for sending transactions, querying data, and interacting with smart contracts on the network. In this guide, we will explore the different types of providers available in web3.js, how to set them up, and how to use them in your code. + +Connecting to a chain happens through a provider. You can pass the provider to the constructor as in the following example: + +:::tip +If you want to subscribe to live events in the blockchain, you should use [`WebSocket provider`](#websocket-provider) or [`IPC provider`](#ipc-provider) +::: + +```typescript title='Initialize a provider' +import { Web3 } from 'web3'; + +const web3 = new Web3(/* PROVIDER*/); + +//calling any method that interact with the network would use the previous passed provider. +await web3.eth.getBlockNumber(); +``` + +The created `Web3` instance will use the passed provider to interact with the blockchain network. This interaction happens when sending a request and receiving the response, and possibly when listening to provider events (if the provider support this). + +## Providers Types + +web3.js supports several types of providers, each with its own unique features or specific use cases. Here are the main types: + +1. [HTTP Provider](/api/web3-providers-http/class/HttpProvider) +2. [WebSocket Provider](/api/web3-providers-ws/class/WebSocketProvider) +3. [IPC Provider (for Node.js)](/api/web3-providers-ipc/class/IpcProvider) +4. [Third-party Providers (Compliant with EIP 1193)](https://eips.ethereum.org/EIPS/eip-1193) + +A string containing string url for `http`/`https` or `ws`/`wss` protocol. And when a string is passed, an instance of the compatible class above will be created accordingly. ex. WebSocketProvider instance will be created for string containing `ws` or `wss`. And you access this instance by calling `web3.provider` to read the provider and possibly register an event listener. + +:::tip +The passed provider can be either type `string` or one of the [`SupportedProviders`](/api/web3-core#SupportedProviders). And if it is passed as a string, then internally the compatible provider object will be created and used. +::: + +### HTTP Provider + +``` ts title='Initialize HTTP Provider' +import { Web3, HttpProvider } from 'web3'; + +//highlight-next-line +const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_ID'); + +await web3.eth.getBlockNumber() +// ↳ 18849658n + +// or + +//highlight-next-line +const web3_2 = new Web3(new HttpProvider('https://mainnet.infura.io/v3/YOUR_INFURA_ID')); + +await web3.eth.getBlockNumber() +// ↳ 18849658n +``` + +### WebSocket provider + +``` ts title='Initialize WS Provider' +import { Web3, WebSocketProvider } from 'web3'; + +//highlight-next-line +const web3 = new Web3('wss://mainnet.infura.io/ws/v3/YOUR_INFURA_ID'); + +await web3.eth.getBlockNumber(); +// ↳ 18849658n + +// or +//highlight-next-line +const web3_2 = new Web3(new WebSocketProvider('wss://mainnet.infura.io/ws/v3/YOUR_INFURA_ID')); + +await web3.eth.getBlockNumber(); +// ↳ 18849658n +``` + +### IPC Provider + +``` ts title='Initialize IPC Provider' +import { Web3 } from 'web3'; +//highlight-next-line +import { IpcProvider } from 'web3-providers-ipc'; + +//highlight-next-line +const web3 = new Web3(new IpcProvider('/users/myuser/.ethereum/geth.ipc')); + +await web3.eth.getBlockNumber(); +// ↳ 18849658n +``` + +## Providers Priorities + +There are multiple ways to set the provider. + +```ts title='Setting a provider' +web3.setProvider(myProvider); +web3.eth.setProvider(myProvider); +web3.Contract.setProvider(myProvider); +contractInstance.setProvider(myProvider); +``` + +The key rule for setting provider is as follows: + +1. Any provider set on the higher level will be applied to all lower levels. e.g. Any provider set using `web3.setProvider` will also be applied to `web3.eth` object. +2. For contracts `web3.Contract.setProvider` can be used to set provider for **all instances** of contracts created by `web3.eth.Contract`. + +--- + +## Usage Scenarios + +### Local Geth Node + +```typescript title='IPC, HTTP and WS provider' +import { Web3 } from 'web3'; +import { IpcProvider } from 'web3-providers-ipc'; + +//highlight-next-line +//IPC provider +const web3 = new Web3(new IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc'));//mac os path +// on windows the path is: '\\\\.\\pipe\\geth.ipc' +// on linux the path is: '/users/myuser/.ethereum/geth.ipc' + +//highlight-next-line +//HTTP provider +web3.setProvider('http://localhost:8545'); +// or +web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545')); + +//highlight-next-line +//WebSocket provider +web3.setProvider('ws://localhost:8546'); +// or +web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:8546')); +``` + +### Remote Node Provider + +```ts title='Alchemy, Infura, etc' +// like Alchemy (https://www.alchemyapi.io/supernode) +// or infura (https://mainnet.infura.io/v3/your_infura_key) +import { Web3 } from 'web3'; +const web3 = new Web3('https://eth-mainnet.alchemyapi.io/v2/your-api-key'); +``` + +### Injected Provider + +As stated above, the injected provider should be in compliance with [EIP-1193](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md). And it is tested with Ganache provider, Hardhat provider, and Incubed (IN3) as a provider. + +The web3.js 4.x Provider specifications are defined in [web3 base provider](https://github.com/ChainSafe/web3.js/blob/4.x/packages/web3-types/src/web3_base_provider.ts) for Injected Providers. + +```html title='E.g, Metamask' + + +``` + +Note that the above code should be hosted in a web server (that could be a simple local web server), because many browser does not support this feature for static files located on your machine. + +## Provider Options + +There are differences in the objects that could be passed in the Provider constructors. + +### HttpProvider + +The options is of type `HttpProviderOptions`, which is an object with a single key named `providerOptions` and its value is an object of type `RequestInit`. +Regarding `RequestInit` see [microsoft's github](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html). + +```ts title='HTTP Provider example' +const httpOptions = { + providerOptions: { + body: undefined, + cache: 'force-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json', + }, + integrity: 'foo', + keepalive: true, + method: 'GET', + mode: 'same-origin', + redirect: 'error', + referrer: 'foo', + referrerPolicy: 'same-origin', + signal: undefined, + window: undefined, + } as RequestInit, +}; +``` + +### WebSocketProvider + +Use WebSocketProvider to connect to a Node using a WebSocket connection, i.e. over the `ws` or `wss` protocol. + +The options object is of type `ClientRequestArgs` or of `ClientOptions`. See [here](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules__types_node_http_d_._http_.clientrequestargs.html) for `ClientRequestArgs` and [here](https://github.com/websockets/ws) for `ClientOptions`. + +The second option parameter can be given regarding reconnecting. And here is its type: + +```ts title='WebSocket Provider example' +// this is the same options interface used for both WebSocketProvider and IpcProvider +type ReconnectOptions = { + autoReconnect: boolean, // default: `true` + delay: number, // default: `5000` + maxAttempts: number, // default: `5` +}; + +``` + +```ts title='Instantiation of WebSocket Provider' +const provider = new WebSocketProvider( + `ws://localhost:8545`, + { + headers: { + // to provide the API key if the Node requires the key to be inside the `headers` for example: + 'x-api-key': '', + }, + }, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + } +); +``` + +The second and the third parameters are both optional. And, for example, the second parameter could be an empty object or undefined, like in the following example: + +```ts title='Instantiation of WebSocket Provider' +const provider = new WebSocketProvider( + `ws://localhost:8545`, + {}, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + } +); +``` + +Below is an example for the passed options: + +```ts title='WS Provider options example' +let clientOptions: ClientOptions = { + // Useful for credentialed urls, e.g: ws://username:password@localhost:8546 + headers: { + authorization: 'Basic username:password', + }, + maxPayload: 100000000, +}; + +const reconnectOptions: ReconnectOptions = { + autoReconnect: true, + delay: 5000, + maxAttempts: 5, +}; +``` + +### IpcProvider + +The IPC Provider could be used in node.js dapps when running a local node. And it provide the most secure connection. + +It accepts a second parameter called `socketOptions`. And, its type is `SocketConstructorOpts`. See [here](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules__types_node_net_d_._net_.socketconstructoropts.html) for full details. And here is its interface: + +```ts title='IPC Provider options' +// for more check https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules__types_node_net_d_._net_.socketconstructoropts.html +interface SocketConstructorOpts { + fd?: number | undefined; + allowHalfOpen?: boolean | undefined; + readable?: boolean | undefined; + writable?: boolean | undefined; +} +``` + +And, the third parameter is called `reconnectOptions` that is of the type `ReconnectOptions`. It can be given to control: auto-reconnecting, delay and max tries attempts. And here its type: + +```ts +// this is the same options interface used for both WebSocketProvider and IpcProvider +type ReconnectOptions = { + autoReconnect: boolean, // default: `true` + delay: number, // default: `5000` + maxAttempts: number, // default: `5` +}; +``` + +Below is an example for the passed options for each version: + +```ts title='Options Example' +let clientOptions: SocketConstructorOpts = { + allowHalfOpen: false; + readable: true; + writable: true; +}; + +const reconnectOptions: ReconnectOptions = { + autoReconnect: true, + delay: 5000, + maxAttempts: 5, +}; +``` + +And here is a sample instantiation for the `IpcProvider`: + +```ts title='IPC Provider example' +const provider = new IpcProvider( + `path.ipc`, + { + writable: false, + }, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + } +); +``` + +The second and the third parameters are both optional. And, for example, the second parameter could be an empty object or undefined. + +```ts title='IPC Provider example' +const provider = new IpcProvider( + `path.ipc`, + {}, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + } +); +``` + +:::info +This section applies for both `IpcProvider` and `WebSocketProvider`. +::: + +The error message, for the max reconnect attempts, will contain the value of the variable `maxAttempts` as follows: + +`` `Maximum number of reconnect attempts reached! (${maxAttempts})` `` + +And here is how to catch the error, if max attempts reached when there is auto reconnecting: + +```ts title='Error message for reconnect attempts' +provider.on('error', (error) => { + if (error.message.startsWith('Maximum number of reconnect attempts reached!')) { + // the `error.message` will be `Maximum number of reconnect attempts reached! (${maxAttempts})` + // the `maxAttempts` is equal to the provided value by the user, or the default value `5`. + } +}); +``` + + diff --git a/docs/docs/guides/web3_providers_guide/injected_provider.md b/docs/docs/guides/web3_providers_guide/injected_provider.md new file mode 100644 index 00000000000..e6971629c58 --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/injected_provider.md @@ -0,0 +1,126 @@ +--- +sidebar_position: 7 +sidebar_label: 'Tutorial: Injected provider' +--- + +# Browser Injected Ethereum Provider + +It is easy to connect to the Ethereum network using an Ethereum browser extension such as MetaMask, or an Ethereum-enabled browser like the browser inside TrustWallet. Because they inject their provider object into the browser's JavaScript context, enabling direct interaction with the Ethereum network from your web application. Moreover, the wallet management is conveniently handled by these extensions or browsers, making it the standard approach for DApp developers to facilitate user interactions with the Ethereum network. + +Technically, you use `window.ethereum` when it is injected by the Ethereum browser extension or the Ethereum-enabled browser. However, before using this provider, you need to check if it is available and then call `enable()` to request access to the user's MetaMask account. + +Before start coding you will need to setup and configure Ganache and MetaMask, if you have not already: + +- Ensure that Ganache is running as mentioned in the [Prerequisites](#prerequisites) section. +- Install the MetaMask extension for your browser. You can download MetaMask from their website: https://metamask.io/. + +Follow these steps to connect to the Ethereum network with MetaMask and web3.js, including the steps to create a local web server using Node.js: + +1. Open a command prompt or terminal window and navigate to where you would like to create the folder for this example. +2. Create a new folder and navigate to it: + +```bash +mkdir web3-browser-injected-providers +cd web3-browser-injected-providers +``` + +3. Use npm to initialize the folder. This will simply create a `package.json` file: + +```bash +npm init -y +``` + +4. Install the Express module and add it to your project's dependencies: + +```bash +npm i express +``` + +5. Create a new HTML file named `index.html` in your code editor (inside `web3-browser-injected-providers`). + +6. Copy and paste the following code into `index.html`, and save it after: + +```html + + + + + Connecting to the Ethereum network with Web3.js and MetaMask + + +

Connecting to the Ethereum network with Web3.js and MetaMask

+
+  You need to approve connecting this website to MetaMask.
+  Click on the MetaMask icon in the browser extension, if it did not show a popup already.
+  
+ + + + + +``` + +7. Create a new file called `server.js` (inside `web3-browser-injected-providers`). +8. Copy and paste the following code into `server.js`, and save it after: + +```js +const express = require('express'); +const app = express(); +const path = require('path'); + +app.use(express.static(path.join(__dirname, '.'))); + +app.listen(8097, () => { + console.log('Server started on port 8097'); +}); +``` + +9. Start the Node.js server by executing the following command. This will execute the content of `server.js` which will run the server on port 8097: + +```bash +node server.js +``` + +10. Open your web browser and navigate to `http://localhost:8097/`. MetaMask should ask for your approval to connect to your website. Follow the steps and give your consent. +11. If everything is set up properly, you should be able to connect to the Ethereum network with MetaMask and see the logged account address. + +Note that in the above steps you had created a local web server using Node.js and Express, serving your HTML file from the root directory of your project. You needs this local server because many browser does not allow extensions to inject objects for static files located on your machine. However, you can customize the port number and the root directory if needed. + +Now you can start building your Ethereum application with web3.js and MetaMask! diff --git a/docs/docs/guides/web3_providers_guide/ipc.md b/docs/docs/guides/web3_providers_guide/ipc.md new file mode 100644 index 00000000000..1b31eb44f2b --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/ipc.md @@ -0,0 +1,134 @@ +--- +sidebar_position: 6 +sidebar_label: 'Tutorial: IPC Provider' +--- + +# Tutorial: IPC Provider + +The IPC Provider offers high-performance local communication, providing a swift alternative to the straightforward HTTP Provider. Tailored for efficiency, it excels in local environments, enhancing the speed of your web application's connection to the Ethereum network for decentralized applications. + +## Prerequisites + +Before we get started, make sure you have a basic understanding of JavaScript and Ethereum. Additionally, we need to set up our environment by installing the following: + +1. **Node.js** + + Node.js is a JavaScript runtime environment that enables you to run JavaScript on the server-side. You can download it from [https://nodejs.org/en/download/](https://nodejs.org/en/download/). + +2. **npm** + + npm (Node Package Manager) is used to publish and install packages to and from the public npm registry or a private npm registry. You can install it by following the instructions here: [https://docs.npmjs.com/downloading-and-installing-node-js-and-npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). + + Alternatively, you can use **yarn** instead of **npm** by following the instructions here: [https://classic.yarnpkg.com/lang/en/docs/getting-started/](https://classic.yarnpkg.com/lang/en/docs/getting-started/). + +3. **Geth** (Optional, used only at the IPC provider example) + + Geth (go-ethereum) is an Ethereum execution client meaning it handles transactions, deployment and execution of smart contracts and contains an embedded computer known as the Ethereum Virtual Machine. You can install it by following the instructions here: [https://geth.ethereum.org/docs/getting-started/installing-geth](https://geth.ethereum.org/docs/getting-started/installing-geth) + +## IPC Provider (for Node.js) + +The IPC Provider allows you to connect to an Ethereum node using Inter-Process Communication (IPC) in a Node.js environment. This provider is useful when you have a local Ethereum node running on your machine and want to interact with it using Node.js. + +In the following steps you will run `geth` in development mode and you will run a piece of code that reads the Ethereum accounts and sends a transaction: + +To connect to the Ethereum network using the IPC provider, follow these steps: + +1. Start a `geth` node in development mode by opening a terminal window and navigating to the `geth` executable file. Then, run the following command to create a development chain: + +```bash +geth --dev --ipcpath +``` + +Make sure to replace `` with the desired IPC path. For example: + +```bash +geth --dev --ipcpath /Users/username/Library/Ethereum/geth.ipc +``` + +This will start a `geth` node in development mode with IPC enabled and an IPC path specified. If the command is successful, the `geth` node will be running, and you should see output similar to the following: + +```bash +INFO [12-10|15:10:37.121] IPC endpoint opened url= +INFO [12-10|15:10:37.122] HTTP endpoint opened url=http://localhost:8545 +INFO [12-10|15:10:37.122] WebSocket endpoint opened url=ws://localhost:8546 +INFO [12-10|15:10:37.127] Mapped network port proto=udp extport=0 intport=30303 interface=UPnP(UDP) +``` + +2. Open a command prompt or terminal window and navigate to where you would like to create the folder for this example. +3. Create a new folder and navigate to it: + +```bash +mkdir web3-providers-tutorial +cd web3-providers-tutorial +``` + +4. Install web3.js using npm: + +```bash +npm i web3 +``` + +5. Create a new JavaScript file called `web3-ipc-provider.js` in your code editor. + +6. Copy and paste the following code into your `web3-ipc-provider.js` file and save it: + +```typescript title='IPC Provider' +import { Web3 } from 'web3'; +import { IpcProvider } from 'web3-providers-ipc'; + +// Connect to the Ethereum network using IPC provider +const ipcPath = ''; // Replace with your actual IPC path +const ipcProvider = new IpcProvider(ipcPath); + +const web3 = new Web3(ipcProvider); + +async function main() { + try { + console.log('Does the provider support subscriptions?:', ipcProvider.supportsSubscriptions()); + + // Get the list of accounts in the connected node which is in this case: geth in dev mode. + const accounts = await web3.eth.getAccounts(); + console.log('Accounts:', accounts); + + // Send a transaction to the network + const transactionReceipt = await web3.eth.sendTransaction({ + from: accounts[0], + to: accounts[0], // sending a self-transaction + value: web3.utils.toWei('0.001', 'ether'), + }); + console.log('Transaction Receipt:', transactionReceipt); + } catch (error) { + console.error('An error occurred:', error); + } +} + +main(); +``` + +7. replace `` with the `ipcPath` that you had specified, when starting the `geth` node, in the first step. + +8. Type `node web3-ipc-provider.js` in the command prompt or terminal window and press Enter. This will run your JavaScript file. + +If everything is set up properly, you should see the list of accounts and transaction receipt printed in the console, similar to the following: + +```bash +Do the provider supports subscription?: true +Accounts: [ '0x82333ED0FAA7a883297C4d8e0FDE1E1CFABAeB7D' ] +Transaction Receipt: { + blockHash: '0xd1220a9b6f86083e420da025179593f5aad3732165a687019a89528a4ab2bcd8', + blockNumber: 1n, + cumulativeGasUsed: 21000n, + effectiveGasPrice: 1000000001n, + from: '0x82333ed0faa7a883297c4d8e0fde1e1cfabaeb7d', + gasUsed: 21000n, + logs: [], + logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: 1n, + to: '0x82333ed0faa7a883297c4d8e0fde1e1cfabaeb7d', + transactionHash: '0x76c05df78dc5dbfade0d11322b3cadc894c17efe36851856aca29488b47c3fbd', + transactionIndex: 0n, + type: 0n +} +``` + +Keep in mind that using IPC Provider with `geth` in development mode in a production environment is not recommended as it can pose a security risk. diff --git a/docs/docs/guides/web3_providers_guide/truffle.md b/docs/docs/guides/web3_providers_guide/truffle.md new file mode 100644 index 00000000000..ba98c3a3335 --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/truffle.md @@ -0,0 +1,84 @@ +--- +sidebar_position: 8 +sidebar_label: 'Tutorial: Third Party Provider' +--- + +# Truffle + +The Truffle HDWallet Provider will be used as an example of a third party provider that is EIP 1193 compatible. + +## Prerequisites + +Before we get started, make sure you have a basic understanding of JavaScript and Ethereum. Additionally, we need to set up our environment by installing the following: + +1. **Ganache** + + Ganache is a personal blockchain for Ethereum development that allows you to test how your smart contracts function in real-world scenarios. You can download it from [http://truffleframework.com/ganache](http://truffleframework.com/ganache). + +2. **Node.js** + + Node.js is a JavaScript runtime environment that enables you to run JavaScript on the server-side. You can download it from [https://nodejs.org/en/download/](https://nodejs.org/en/download/). + +3. **npm** + + npm (Node Package Manager) is used to publish and install packages to and from the public npm registry or a private npm registry. You can install it by following the instructions here: [https://docs.npmjs.com/downloading-and-installing-node-js-and-npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). + + Alternatively, you can use **yarn** instead of **npm** by following the instructions here: [https://classic.yarnpkg.com/lang/en/docs/getting-started/](https://classic.yarnpkg.com/lang/en/docs/getting-started/). + +## Third-party Providers (Compliant with EIP 1193) + +web3.js accepts any provider that is in compliance with [EIP-1193](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md). It has tests written to ensure compatibility with @truffle/hdwallet-provider, Ganache provider, Hardhat provider, and Incubed (IN3) as a provider. The following section, [Browser Injected Ethereum Provider](#browser-injected-ethereum-provider), in this tutorial explains how to use a special case of these third-party providers. + +Here is a step-by-step example and a code snippet to connect your web application to the Ethereum network using `@truffle/hdwallet-provider` as an example of an external provider compliant with EIP 1193. + +1. Open a command prompt or terminal window in a new folder. +2. Type `npm init -y` and press Enter. This will create a `package.json` file in the current directory. +3. Install web3.js and HTTP provider using npm: + +```bash +npm i web3 @truffle/hdwallet-provider bip39 +``` + +4. Create a new JavaScript file, called `index.js`, in your code editor. +5. Copy and paste the following code into your JavaScript file, and then save the file: + +```typescript title='EIP1193 Provider (Truffle)' +import { Web3 } from 'web3'; +import HDWalletProvider from '@truffle/hdwallet-provider'; +import bip39 from 'bip39'; + +const mnemonic: string = bip39.generateMnemonic(); // generates seed phrase +console.log('seed phrase:', mnemonic); + +// Connect to the Ethereum network using an HTTP provider and WalletProvider +const provider: HDWalletProvider = new HDWalletProvider(mnemonic, 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'); +const web3: Web3 = new Web3(provider); + +// Get the current block number from the network +web3.eth + .getBlockNumber() + .then(function (blockNumber: number) { + console.log('Current block number:', blockNumber); + }) + .catch(function (error: any) { + console.log('Error:', error); + }); +``` + +6. Replace `'YOUR_INFURA_PROJECT_ID'` with your own Infura project ID. You can obtain an Infura project ID by signing up for a free account at https://infura.io/register. Alternatively, you can use any other URL that is compatible with HDWalletProvider, such as a local Ganache accessible at `'http://localhost:7545'`. + +7. In the command prompt, run `node index.js` and press Enter. This will execute your JavaScript file and connect to the Ethereum network using HDWalletProvider with Infura. + +If everything is set up properly, you should see the current block number printed in the console similar to the following. + +```bash +seed phrase: remain climb clock valid budget cable tunnel force split level measure repair +Current block number: 17317844n +``` + +:::danger +Your seed phrase gives complete access to your Ethereum account and it should **never** be shared with anyone you don't want to give full access to your account. The seed phrase is `console.log`ed in the code example to show you what it looks like, but you should **never** do this with a seed phrase to an account you plan on using to send real money. +::: + +The sample above connected you to the Ethereum network using truffle HD Wallet-enabled Web3 provider. You can modify it to interact with the network, perform transactions, and read/write data from the Ethereum network. + diff --git a/docs/docs/guides/web3_providers_guide/websocket.md b/docs/docs/guides/web3_providers_guide/websocket.md new file mode 100644 index 00000000000..96288f4e031 --- /dev/null +++ b/docs/docs/guides/web3_providers_guide/websocket.md @@ -0,0 +1,142 @@ +--- +sidebar_position: 5 +sidebar_label: 'Tutorial: WebSocket Provider' +--- + +# Tutorial: WebSocket Provider + +The WebSocket Provider provides real-time communication and enhanced performance, offering a dynamic alternative to the simplicity of the HTTP Provider. In comparison to the widely used HTTP Provider, the WebSocket Provider enables your web application to establish a continuous, bidirectional connection, allowing for live updates and faster interactions with the Ethereum network. Incorporate the WebSocket Provider to empower your decentralized applications with real-time capabilities. + +## Prerequisites + +Before we get started, make sure you have a basic understanding of JavaScript and Ethereum. Additionally, we need to set up our environment by installing the following: + +1. **Ganache** + + Ganache is a personal blockchain for Ethereum development that allows you to test how your smart contracts function in real-world scenarios. You can download it from [http://truffleframework.com/ganache](http://truffleframework.com/ganache). + +2. **Node.js** + + Node.js is a JavaScript runtime environment that enables you to run JavaScript on the server-side. You can download it from [https://nodejs.org/en/download/](https://nodejs.org/en/download/). + +3. **npm** + + npm (Node Package Manager) is used to publish and install packages to and from the public npm registry or a private npm registry. You can install it by following the instructions here: [https://docs.npmjs.com/downloading-and-installing-node-js-and-npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). + + Alternatively, you can use **yarn** instead of **npm** by following the instructions here: [https://classic.yarnpkg.com/lang/en/docs/getting-started/](https://classic.yarnpkg.com/lang/en/docs/getting-started/). + +## WebSocket Provider + +WebSocket Provider allows us to communicate with the Ethereum node via WebSocket protocol, which is useful when we want continuous updates on our subscribed items. This provider is ideal for real-time applications that require constant updates from the Ethereum network. + +Follow these steps to connect to the Ethereum network using WebSocket provider: + +:::tip +The first 3 steps are the same as in the previous section. So, you may skip them if you already executed the previous section. +::: + +1. Open a command prompt or terminal window and navigate to where you would like to create the folder for this example. +2. Create a new folder and navigate to it: + +```bash +mkdir web3-providers-tutorial +cd web3-providers-tutorial +``` + +3. Install web3.js using npm: + +```bash +npm i web3 +``` + +4. Create a new JavaScript file called `web3-websocket-provider.js` in your code editor. + +5. Copy and paste the following code into your `web3-websocket-provider.js` file and save it: + +```typescript title='WebSocket Provider' +import { Web3 } from 'web3'; + +// Connect to the Ethereum network using WebSocket provider +const ganacheUrl = 'ws://localhost:8545'; +const wsProvider = new Web3.providers.WebsocketProvider(ganacheUrl); +const web3 = new Web3(wsProvider); + +async function main() { + try { + console.log('Does the provider support subscriptions?:', wsProvider.supportsSubscriptions()); + + // Subscribe to new block headers + const subscription = await web3.eth.subscribe('newBlockHeaders'); + + subscription.on('data', async (blockhead) => { + console.log('New block header: ', blockhead); + + // You do not need the next line if you like to keep being notified for every new block + await subscription.unsubscribe(); + console.log('Unsubscribed from new block headers.'); + }); + subscription.on('error', (error) => console.log('Error when subscribing to New block header: ', error)); + + // Get the list of accounts in the connected node which is in this case: Ganache. + const accounts = await web3.eth.getAccounts(); + // Send a transaction to the network + const transactionReceipt = await web3.eth.sendTransaction({ + from: accounts[0], + to: accounts[1], + value: web3.utils.toWei('0.001', 'ether'), + }); + console.log('Transaction Receipt:', transactionReceipt); + } catch (error) { + console.error(error); + } +} + +main(); +``` + +6. Ensure that Ganache is running as mentioned in the [Prerequisites](#prerequisites) section. + +7. Type `node web3-websocket-provider.js` in the command prompt or terminal window and press Enter. This will run your JavaScript file. + +If everything is set up properly, you should see the new block headers, transaction hash, and pending transaction printed in the console. The unique feature of WebSocket provider highlighted in this example is that it can subscribe to new block headers and pending transactions to get them in real-time. And by running the sample, you will get something similar to this in your console: + +```bash +Do the provider supports subscription?: true +New block header: { + logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + miner: '0x0000000000000000000000000000000000000000', + difficulty: '0', + totalDifficulty: '0', + extraData: '0x', + gasLimit: 6721975, + gasUsed: 21000, + hash: '0xd315cecf3336640bcd1301930805370b7fe7528c894b931dcf8a3b1c833b68c8', + mixHash: '0x1304070fde1c7bee383f3a59da8bb94d515cbd033b2638046520fb6fb596d827', + nonce: '0x0000000000000000', + number: 40, + parentHash: '0xeb7ce3260911db2596ac843df11dbcbef302e813e1922db413f6f0b2a54d584d', + receiptsRoot: '0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa', + stateRoot: '0x95e416eec0932e725ec253779a4e28b3d014d05e41e63c3369f5da42d26d1240', + timestamp: 1684165088, + transactionsRoot: '0x8f87380cc7acfb6d10633e10f72567136492cb8301f52a41742eaca9449bb378', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + baseFeePerGas: 4959456, + size: undefined +} +Transaction Receipt: { + transactionHash: '0x0578672e97d072b4b91773c8bfc710e4f777616398b82b276323408e59d11362', + transactionIndex: 0n, + blockNumber: 1n, + blockHash: '0x5c05248fe0fb8f45a8c9b9600904a36c0e5c74dce01495cfc72278c185fe7838', + from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + cumulativeGasUsed: 21000n, + gasUsed: 21000n, + logs: [], + logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: 1n, + effectiveGasPrice: 2000000000n, + type: 0n +} +Unsubscribed from new block headers. +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/_category_.yml b/docs/docs/guides/web3_upgrade_guide/1.x/_category_.yml new file mode 100644 index 00000000000..7723475cb40 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/_category_.yml @@ -0,0 +1,5 @@ +label: 'Upgrade from 1.x' +collapsible: true +collapsed: true +link: null +position: 1 \ No newline at end of file diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/abi_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/abi_migration_guide.md new file mode 100644 index 00000000000..a8df358dacd --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/abi_migration_guide.md @@ -0,0 +1,43 @@ +--- +sidebar_position: 6 +sidebar_label: web3.eth.abi +--- + +# web3.eth.abi Migration Guide + +## Breaking Changes + +- `AbiInput` has moved from `web3-eth-utils` to `web3-eth-abi` + +- type `AbiInput` attribute was renamed to `baseType` from `internalType`. + +In 1.x: + +``` +export interface AbiInput { + name: string; + type: string; + indexed?: boolean; + components?: AbiInput[]; + internalType?: string; +} +``` + +In 4.x: + +``` + +export type AbiInput = string | AbiParameter | { readonly [key: string]: unknown }; +// where AbiParameter is ... + +export type AbiParameter = { + readonly name: string; + readonly type: string; + readonly baseType?: string; + readonly indexed?: boolean; + readonly components?: ReadonlyArray; + readonly arrayLength?: number; + readonly arrayChildren?: ReadonlyArray; +}; + +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/accounts_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/accounts_migration_guide.md new file mode 100644 index 00000000000..f6505e460f8 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/accounts_migration_guide.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 5 +sidebar_label: web3.eth.accounts +--- + +# web3.eth.accounts Migration Guide + +## Breaking Changes + +### web3.eth.accounts.create and wallet.create + +In 1.x the create method has an optional parameter `entropy`. + +In 4.x the create method does not have `entropy` as a parameter. Instead 4.x uses an audited package [ethereum-cryptography/secp256k1](https://github.com/ethereum/js-ethereum-cryptography#secp256k1-curve) to generate private keys. + +Accounts: + +```typescript +// In 1.x +const account = web3.eth.accounts.create('optionalEntropy'); // entropy is an optional parameter + +// In 4.x +const account = web3.eth.accounts.create('optionalEntropy'); // will result in an error +const account = web3.eth.accounts.create(); // correct way +``` + +Wallets: + +```typescript +// In 1.x +const wallet = web3.eth.accounts.wallet.create(1, 'optionalEntropy'); // entropy is an optional parameter + +// In 4.x +const account = web3.eth.accounts.wallet.create(1, 'optionalEntropy'); // will result in an error +const account = web3.eth.accounts.wallet.create(); // correct way +``` + +## stripHexPrefix method + +In 1.x `stripHexPrefix` method is located in the `web3-utils` package, in 4.x this has been moved to `web3-eth-accounts` + +```typescript +import { stripHexPrefix } from 'web3-eth-accounts'; + +console.log(stripHexPrefix('0x123')); // "123" + +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/contracts_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/contracts_migration_guide.md new file mode 100644 index 00000000000..7df5a06d9bd --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/contracts_migration_guide.md @@ -0,0 +1,183 @@ +--- +sidebar_position: 4 +sidebar_label: web3.eth.Contract +--- + +# web3.eth.Contract Migration Guide + +## Breaking Changes + +### Receipt Status + +The `receipt.status` will now be an `unsigned integer` instead of `boolean` value to comply with the specification. + +```ts +// in 1.x +myContract.methods + .MyMethod() + .send() + .on('receipt', receipt => { + console.log(receipt.status); // true | false + }); + +// in 4.x +myContract.methods + .MyMethod() + .send() + .on('receipt', receipt => { + console.log(receipt.status); // BigInt(0) | BigInt(1) + }); +``` + +:::note +The `unsigned integer` type is dependent on the data format you specified. Default type is `BigInt`. +::: + +### Deploy `sending` and `sent` event will fire only the params + +In 1.x, when following was executed `deploy().send().on(‘sending’, payload => {})`. The `payload` was the complete the JSON-RPC Payload. In 4.x, it will just be the transaction which is about to be transmitted. Earlier it was accessible by from `payload.params[0]`, now will be available directly to event handler. + +```ts +// 1.x +myContract + .deploy() + .send() + .on('send', payload => { + console.log(payload); + // {id: <1>, jsonrpc: '2.0', method: 'eth_sendTransaction', params: [txObject] } + }); + +// 4.x +myContract + .deploy() + .send() + .on('send', txObject => { + console.log(txObject); + // {id: <>, gas: <>,...} + }); +``` + +### Deploy ’confirmations’ handler will be invoked with object + +In 1.x, the `confirmations` handler was invoked with multiple parameters. But in 4.x there will be one parameter as object but with all the same properties. + +```ts +//1.x +myContract .send().on(‘confirmation’, (confirmations: number, receipt: object, latestBlockHash: string) => {}) + +//4.x +myContract .send().on(‘confirmation’, ({confirmations: bigint, receipt: object, latestBlockHash: string}) => {}) +``` + +### Strict validation for `encodeABI` + +`encodeABI` now has strict validation for the ABI types. It's not limited to the mentioned use cases below, but applied in general. Some use cases are: + +- Earlier a `byte32` ABI type was successfully encoded even providing less bytes as input. Now it will throw an error. +- Earlier a `byte32` ABI type was successfully encoded even with an empty bytes. Now it will throw an error. + +### Different error message for creating object without `new` keyword + +The error message will be different if you try to create a contract object without a `new` keyword. + +```ts +// 1.x +const contract = Contract(jsonInterface, address); +// Please use the "new" keyword to instantiate a web3.eth.Contract() object! + +// 4.x +const contract = Contract(jsonInterface, address); +// Class constructor ContractBuilder cannot be invoked without 'new' +``` + +### No warning message when `toBlock` passed to event subscription + +In 1.x, if you pass the `toBlock` as event options you would get a warning message: + +> Invalid option: toBlock. Use getPastEvents for specific range. + +In 4.x, you will not get any warning but `toBlock` will still have no effect. + +### The contract `send` method will now resolve with the `receipt` object + +In 1.x, the contract `.send` method was always resolved with `transactionHash`. That enforces the user to make an extra call to get any further information. In 4.x the `.send` function will resolve with `receipt` object. + +```ts +// 1.x +const transactionHash = await myContract.method.MyMethod().send(); + +// 4.x +const receipt = await myContract.method.MyMethod().send(); +const transactionHash = receipt.transactionHash; +``` + +### `BigInt` is used when decoding functions' and events' parameters + +In 1.x, decoded functions' and events' parameters were of type `string`. In 4.x, the `BigInt` type is used instead. + +```ts +// Events +// 1.x +instance.events.BasicEvent().on('data', function (event) { + console.log(event); +}); + +await instance.methods.firesEvent(acc, 1).send(); +/** +{ address: '0x607A075cB7710AA8544c4E0F929e344Bf91AB631', + blockHash: .., + blockNumber: 9, logIndex: 0, removed: false, transactionHash: ..., transactionIndex: 0, + returnValues: {0: '0xd0731FAE14781104c42B8914b4cc6634b6038daC', 1: '1', addr: '0xd0731FAE14781104c42B8914b4cc6634b6038daC', val: '1'} // Note the value of val + ,event: 'BasicEvent', signature: ..., raw: ...} +*/ + +//4.x +instance.events + .MultiValueIndexedEvent({ + filter: { val: 100 }, + }) + .on('data', console.log); +await instance.methods.firesMultiValueIndexedEvent('value', 100, true).send(sendOptions); +/** + * { + address: '0x0c1b54fb6fdf63dee15e65cadba8f2e028e26bd0', + topics: [ + '0x553c4a49a36d26504ba0880f2f9bfe9ac7db4b81a893bde296546cd96ae0b33c', + '0x0000000000000000000000000000000000000000000000000000000000000064', + '0x0000000000000000000000000000000000000000000000000000000000000001' + ], + data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000576616c7565000000000000000000000000000000000000000000000000000000', + blockNumber: 23n, + transactionHash: '0xf7e56f38b0f75c0926862ef4195df779003a0e960162a65b214c40232ba17925', + transactionIndex: 0n, + blockHash: '0x15a77129afdcec739924c58fb3aba456428d8c3f5d181af559d50458d468eb33', + logIndex: 0n, + removed: false, + returnValues: { + '0': 'value', + '1': 100n, + '2': true, + __length__: 3, + str: 'value', + val: 100n, //Note that a BigInt is returned + flag: true + }, + event: 'MultiValueIndexedEvent', + signature: '0x553c4a49a36d26504ba0880f2f9bfe9ac7db4b81a893bde296546cd96ae0b33c', + raw: ... + } +*/ + +// Functions +//1.x +await instance.methods.setValue(1).send(); +var value = await instance.methods.getValue().call(); +console.log(value); +// > '1' + +//4.x +await instance.methods.setValue(10).send(); +var value = await instance.methods.getValue().call(); +console.log(value); +// 10n // Note that a BigInt is returned +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/index.md b/docs/docs/guides/web3_upgrade_guide/1.x/index.md new file mode 100644 index 00000000000..52530284ed2 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/index.md @@ -0,0 +1,240 @@ +--- +sidebar_position: 1 +sidebar_label: 'Introduction' +--- + + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Upgrade from 1.x + +This upgrade guide is for upgrading from web3.js 1.x to web3.js 4.x. + +## Breaking Changes + +### The `web3` package will return all web3.js exported objects + +`require('web3')` will now return all web3 exported-objects organized in namespaces (and few are available on top level). So, it is no longer supported to write the following code: + +```ts +// This will return the name space and the line after it will throw an error! +const Web3 = require('web3'); + +const web3 = new Web3(); +``` + +And the correct usage now is: + + + + + +```javascript +const { Web3 } = require('web3'); + +const web3 = new Web3(); +``` + + + + + +```typescript +import { Web3 } from 'web3'; + +const web3 = new Web3(); +``` + + + + +### Passing Callbacks to functions + +Passing callbacks to functions is no longer supported, except for event listeners. + +For example, the approach to subscribing-to and listening-for blockchain events has changed in version 4.x. Detailed instructions can be found in the [**`web3.eth.subscribe` Migration Guide**](./subscribe_migration_guide.md#subscribing-to-events). + +However, the approach to subscribing to Provider events remains the same, utilizing callbacks as explained in the [Providers Events Listening guide](../../web3_providers_guide/events_listening.md). It is important to note that Providers have undergone some breaking changes, including the renaming of the `on('close', ...)` to `on('disconnect', ...)`. + +### Not Available + + +- [web3.bzz](https://web3js.readthedocs.io/en/v1.7.3/web3-bzz.html) Package for interacting with Swarm is not implemented +- [web3.shh](https://web3js.readthedocs.io/en/v1.7.3/web3-shh.html) Package for interacting with Whisper is not implemented + +`const web3 = new Web3(Web3.givenProvider);` + +It will not have: + +```ts +// web3.bzz is NOT available +// web3.shh is NOT available +``` + +### Defaults and Configs + +- `givenProvider` default value is `undefined` instead of `null` +- `currentProvider` default value is `undefined` instead of `null` (if web3 is instantiated without a provider) + +### Web3 BatchRequest + +```ts +const batch = new web3.BatchRequest(); +``` + +#### batch.add() + +In 1.x nothing was returned, in 4.x returns a deferred promise which can be used to run specific code after completion of each respective request. + +```ts +// in 1.x +batch.add( + web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback), +); + +// in 4.x + +const request1 = { + jsonrpc: '2.0', + id: 10, + method: 'eth_getBalance', + params: ['0xf4ffff492596ac13fee6126846350433bf9a5021', 'latest'], +}; +const request2 = { + jsonrpc: '2.0', + id: 12, + method: 'eth_getBalance', + params: ['0xdc6bad79dab7ea733098f66f6c6f9dd008da3258', 'latest'], +}; +batch.add(request1); +const request2Promise = batch.add(request2); +request2Promise.then(response => { + console.log(response); +}); +``` + +#### batch.execute() + +In 4.x execute returns a promise, where 1.x was based on the callbacks of requests passed to `add`. + +```ts +// in 1.x +batch.execute(); + +// in 4.x +const responses = await batch.execute(); +``` + +### Types + +All the re-useable types which were earlier been exposed from `web3` package are now moved to independent package `web3-types` package. + +:::note +We don't encourage using the `@types/web3` package. +::: + +```ts +// Provider types +// in 1.x +import type { Provider, Callback, JsonRPCResponse } from 'web3/providers'; + +// in 4.x +import type { + Web3BaseProvider as Provider, + Web3ProviderRequestCallback as Callback, + JsonRpcResponse, +} from 'web3-types'; +``` + +Similarly some useable types from the old package `web3-core` are also moved to `web3-types` + +```ts +// in 1.x +import type { Transaction, TransactionReceipt } from 'web3-core'; + +// in 4.x +import type { Transaction, TransactionReceipt } from 'web3-types'; +``` + +### Web3 Extend + +`web3.extend` is available but methods.params , methods.inputFormatter and methods.outputFormatter are not available to set. In typescript +you will need to set module augmentation as mentioned in following example. + +```ts +// in 1.x +web3.extend({ + property: 'myModule', + methods: [ + { + name: 'getBalance', + call: 'eth_getBalance', + params: 2, + inputFormatter: [ + web3.extend.formatters.inputAddressFormatter, + web3.extend.formatters.inputDefaultBlockNumberFormatter, + ], + outputFormatter: web3.utils.hexToNumberString, + }, + { + name: 'getGasPriceSuperFunction', + call: 'eth_gasPriceSuper', + params: 2, + inputFormatter: [null, web3.utils.numberToHex], + }, + ], +}); + +// in 4.0.4+ +declare module 'web3' { + interface Web3Context { + myModule: { + getBalance(address: Address, blockTag: BlockTag): Promise; + getGasPriceSuperFunction(blockTag: BlockTag): Promise; + }; + } +} + +web3.extend({ + property: 'myModule', + methods: [ + { + name: 'getBalance', + call: 'eth_getBalance', + }, + { + name: 'getGasPriceSuperFunction', + call: 'eth_gasPriceSuper', + }, + ], +}); +``` + +### Formatters + +Starting 4.x releases, the package `web3-core-helpers` will not be maintained and the formatters are now moved to the `web3-core` package. + +```ts +// in 1.x +import { formatters } from 'web3-core-helpers'; + +// in 4.x +import { formatters } from 'web3-core'; +``` + +### PromiEvent + +Starting 4.x releases, the package `web3-core-promievent` will not be maintained and the class are now moved to the `web3-core` package. + +```ts +// in 1.x +import Web3PromiEvent from 'web3-core-promievent'; + +// in 4.x +import { Web3PromiEvent } from 'web3-core'; +``` + +The `PromiEvent` class does not support `removeEventListener` or `addEventListener`. Instead we recommend to use `on` and `off`. diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/net_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/net_migration_guide.md new file mode 100644 index 00000000000..1c35ae25981 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/net_migration_guide.md @@ -0,0 +1,25 @@ +--- +sidebar_position: 10 +sidebar_label: web3.*.net +--- + +# web3 Net Migration Guide + +## Breaking Changes + +### web3.\*.net.getId + +The `bzz` and `shh` package are deprecated, therefore `web3.bzz.net.getId` and `web3.shh.net.getId` functions are not available. + +### web3.\*.net.isListening + +The `bzz` and `shh` package are deprecated, therefore `web3.bzz.net.isListening` and `web3.shh.net.isListening` functions are not available. + +### web3.\*.net.getPeerCount + +The `bzz` and `shh` package are deprecated, therefore `web3.bzz.net.getPeerCount` and `web3.shh.net.getPeerCount` functions are not available. + +```typescript +// web3.bzz.net is NOT available +// web3.shh.net is NOT available +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/personal_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/personal_migration_guide.md new file mode 100644 index 00000000000..1e46f8fb623 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/personal_migration_guide.md @@ -0,0 +1,26 @@ +--- +sidebar_position: 8 +sidebar_label: web3.eth.personal +--- + +# web3.eth.personal Migration Guide + +## Breaking Changes + +### extend + +In 4.x the method `extend` is deprecated. + +web3 4.x will not have: + +```ts +// -> web3.extend +// -> web3.eth.extend +// -> web3.shh.extend +// -> web3.bzz.extend +``` + +### Defaults and Configs + +- `givenProvider` default value is `undefined` instead of `null` +- `currentProvider` default value is `undefined` instead of `null` (if web3 is instantiated without a provider) diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/providers_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/providers_migration_guide.md new file mode 100644 index 00000000000..46375cdd0df --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/providers_migration_guide.md @@ -0,0 +1,387 @@ +--- +title: web3.providers Migration Guide +sidebar_position: 2 +sidebar_label: web3.providers +--- + +For full description about the providers, their priorities and their types, you can check [web3.js Providers Guide](../../web3_providers_guide/). + +### Provider Options Changes + +There are differences in the objects that could be passed in the Provider constructors between version 1.x and 4.x. Below, you will find the difference for every Provider object type. + +#### HttpProvider + +In 1.x, options passed in the constructor should be of type [`HttpProviderOptions`](https://github.com/web3/web3.js/blob/1.x/packages/web3-core-helpers/types/index.d.ts#L173). The `HttpProviderOptions` interface consists of: + +```ts +interface HttpProviderOptions { + keepAlive?: boolean; + timeout?: number; + headers?: HttpHeader[]; + withCredentials?: boolean; + agent?: HttpAgent; +} + +interface HttpAgent { + http?: http.Agent; + https?: https.Agent; + baseUrl?: string; +} + +interface HttpHeader { + name: string; + value: string; +} +``` + +In 4.x, the options is of type `HttpProviderOptions`, which is an object with a `providerOptions` key and value a `RequestInit` object. +Regarding `RequestInit` see [microsoft's github](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html). + +For example: + +```ts +// in 1.x +let httpOptions = { + keepAlive: true, + withCredentials: false, + timeout: 20000, // ms + headers: [ + { + name: 'Access-Control-Allow-Origin', + value: '*' + }, + ], + agent: { + http: http.Agent(...), + baseUrl: '' + } +}; + +// in 4.x +let httpOptions = { + providerOptions: { + body: undefined, + cache: 'force-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json', + }, + integrity: 'foo', + keepalive: true, + method: 'GET', + mode: 'same-origin', + redirect: 'error', + referrer: 'foo', + referrerPolicy: 'same-origin', + signal: undefined, + window: undefined, + } as RequestInit, +}; +``` + +#### WebSocketProvider + +In 1.x, options passed in the constructor should be of type [`WebsocketProviderOptions`](https://github.com/web3/web3.js/blob/1.x/packages/web3-core-helpers/types/index.d.ts#L192). The `WebsocketProviderOptions` interface consists of: + +```ts +interface WebsocketProviderOptions { + host?: string; + timeout?: number; + reconnectDelay?: number; + headers?: any; + protocol?: string; + clientConfig?: object; + requestOptions?: any; + origin?: string; + reconnect?: ReconnectOptions; +} + +interface ReconnectOptions { + auto?: boolean; + delay?: number; + maxAttempts?: number; + onTimeout?: boolean; +} +``` + +In 4.x, the `socketOptions` parameter is of type `ClientRequestArgs` or of `ClientOptions`. See [here](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules__types_node_http_d_._http_.clientrequestargs.html) for `ClientRequestArgs` and [here](https://github.com/websockets/ws) for `ClientOptions`. + +In 4.x the `reconnectOptions` parameter can be given to control: auto-reconnecting, delay and max tries attempts. And here is its type: + +```ts +// this is the same options interface used for both WebSocketProvider and IpcProvider +type ReconnectOptions = { + autoReconnect: boolean; // default: `true` + delay: number; // default: `5000` + maxAttempts: number; // default: `5` +}; +``` + +##### Options examples + +Below is an example for the passed options for each version: + +```ts +// in 1.x +var options = { + timeout: 30000, // ms + + // Useful for credentialed urls, e.g: ws://username:password@localhost:8546 + headers: { + authorization: 'Basic username:password', + }, + + clientConfig: { + // Useful if requests are large + maxReceivedFrameSize: 100000000, // bytes - default: 1MiB + maxReceivedMessageSize: 100000000, // bytes - default: 8MiB + + // Useful to keep a connection alive + keepalive: true, + keepaliveInterval: 60000, // ms + }, + + // Enable auto reconnection + reconnect: { + auto: true, + delay: 5000, // ms + maxAttempts: 5, + onTimeout: false, + }, +}; +// in 4.x +let clientOptions: ClientOptions = { + // Useful for credentialed urls, e.g: ws://username:password@localhost:8546 + headers: { + authorization: 'Basic username:password', + }, + maxPayload: 100000000, +}; + +const reconnectOptions: ReconnectOptions = { + autoReconnect: true, + delay: 5000, + maxAttempts: 5, +}; +``` + +And here is a sample instantiation for the `WebSocketProvider`: + +```ts +const provider = new WebSocketProvider( + `ws://localhost:8545`, + { + headers: { + // to provide the API key if the Node requires the key to be inside the `headers` for example: + 'x-api-key': '', + }, + }, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + }, +); +``` + +The second and the third parameters are both optional. And you can for example, the second parameter could be an empty object or undefined, like in the following example: + +```ts +const provider = new WebSocketProvider( + `ws://localhost:8545`, + {}, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + }, +); +``` + +#### Legacy Event `close` has been deprecated + +Following EIP-1193, the `close` event has been deprecated and is superceded by `disconnect`. +In 1.x, we listen for a `close` event: + +```ts +const provider = new WebSocketProvider(host + port); +// we would use close to listen to the disconnect function +provider.on('close', function (err) { + console.log('closed'); + resolve(); +}); +provider.disconnect(1012); +// would eventually log closed +``` + +In 4.x, we listen for a `disconnect` event: + +```ts +const provider = new WebSocketProvider(host + port); +// we would use disconnect to listen to the disconnect function +provider.on('disconnect', function (err) { + console.log('closed'); + resolve(); +}); +provider.disconnect(1012); +// would eventually log 'closed' +``` + +#### IpcProvider + +The IPC provider is used in node.js dapps when running a local node. And it provide the most secure connection. + +In 1.x, it used to accept the path and an instance of net.Server as in the following example: + +```ts +import * as net from 'net'; + +const ipcProvider = new IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', new net.Server()); +``` + +In 4.x, it's no longer installed by default as its nodejs modules are impacting web3.js browser usage. +You can use it by installing `web3-providers-ipc` and creating a new instance. Since it's compatible with Eip1193Provider, +you can pass it on to the Web3 instance. + +```ts +import { IpcProvider } from 'web3-providers-ipc'; + +const ipcProvider = new IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc'); +``` + +It accepts a second parameter called `socketOptions`. And, its type is `SocketConstructorOpts`. See [here](https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules__types_node_net_d_._net_.socketconstructoropts.html) for full details. And here is its interface: + +```ts +interface SocketConstructorOpts { + fd?: number | undefined; + allowHalfOpen?: boolean | undefined; + readable?: boolean | undefined; + writable?: boolean | undefined; + signal?: AbortSignal; +} +``` + +In 4.x the third parameter is called `reconnectOptions` that is of the type `ReconnectOptions`. It can be given to control: auto-reconnecting, delay and max tries attempts. And here its type: + +```ts +// this is the same options interface used for both WebSocketProvider and IpcProvider +type ReconnectOptions = { + autoReconnect: boolean; // default: `true` + delay: number; // default: `5000` + maxAttempts: number; // default: `5` +}; +``` + +##### Options examples + +Below is an example for the passed options for each version: + +```ts +// in 1.x +var net = require('net'); + +new Web3.providers.IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', net); // mac os path +// on windows the path is: "\\\\.\\pipe\\geth.ipc" +// on linux the path is: "/users/myuser/.ethereum/geth.ipc" + +// in 4.x +let clientOptions: SocketConstructorOpts = { + allowHalfOpen: false; + readable: true; + writable: true; +}; + +const reconnectOptions: ReconnectOptions = { + autoReconnect: true, + delay: 5000, + maxAttempts: 5, +}; +``` + +And here is a sample instantiation for the `IpcProvider`: + +```ts +import { IpcProvider } from 'web3-providers-ipc'; + +const provider = new IpcProvider( + `path.ipc`, + { + writable: false, + }, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + }, +); +``` + +The second and the third parameters are both optional. And, for example, the second parameter could be an empty object or undefined. + +```ts +import { IpcProvider } from 'web3-providers-ipc'; + +const provider = new IpcProvider( + `path.ipc`, + {}, + { + delay: 500, + autoReconnect: true, + maxAttempts: 10, + }, +); +``` + +#### Error message for reconnect attempts + +:::note +This section applies for both `IpcProvider` and `WebSocketProvider`. +::: + +The error in, version 1.x, was an Error object that contains the message: +`'Maximum number of reconnect attempts reached!'` + +And, the error in version 4.x, is the same, but will also contain the value of the variable `maxAttempts` as follows: + +`` `Maximum number of reconnect attempts reached! (${maxAttempts})` `` + +And here is how to catch the error, in version 4.x, if max attempts reached when there is auto reconnecting: + +```ts +provider.on('error', error => { + if (error.message.startsWith('Maximum number of reconnect attempts reached!')) { + // the `error.message` will be `Maximum number of reconnect attempts reached! (${maxAttempts})` + // the `maxAttempts` is equal to the provided value by the user, or the default value `5`. + } +}); +``` + +#### Legacy Event `close` has been deprecated + +Following EIP-1193, the `close` event has been deprecated and is superseded by `disconnect`. +In 1.x, we listen for a `close` event: + +```ts +const provider = new IpcProvider(host + port); +// we would use close to listen to the disconnect function +provider.on('close', function (err) { + console.log('closed'); + resolve(); +}); +provider.disconnect(1012); +// would eventually log closed +``` + +In 4.x, we listen for a `disconnect` event: + +```ts +const provider = new IpcProvider(host + port); +// we would use disconnect to listen to the disconnect function +provider.on('disconnect', function (err) { + console.log('closed'); + resolve(); +}); +provider.disconnect(1012); +// would eventually log 'closed' +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/subscribe_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/subscribe_migration_guide.md new file mode 100644 index 00000000000..6ce6c2512a2 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/subscribe_migration_guide.md @@ -0,0 +1,86 @@ +--- +sidebar_position: 9 +sidebar_label: web3.eth.subscribe +--- + +# web3.eth.subscribe Migration Guide + +## Breaking Changes + +### Subscribing to events + +You subscribe to blockchain events using the `web3.eth.subscribe` API. + +However, in web3.js version 1.x, for example, you could subscribe to the `newBlockHeaders` event, in one step, with the following code snippet: + +```typescript +var subscription = web3.eth.subscribe('newBlockHeaders', function (error, result) { + if (!error) console.log(result); +}); +``` + +But, in web3.js Version 4.x, the function signature has changed for `web3.eth.subscribe`. In addition, the way you get notified for `data` and `error` has also changed. It is now in 2 steps: First you subscribe and then you listen to events. Here's an example of how you would subscribe to the same `newBlockHeaders` event in web3.js version 4.x: + +```typescript +// in 4.x +const subscription = await web3.eth.subscribe('newHeads'); + +// note that in version 4.x the way you get notified for `data` and `error` has changed +subscription.on('data', async blockhead => { + console.log('New block header: ', blockhead); +}); +subscription.on('error', error => + console.log('Error when subscribing to New block header: ', error), +); +``` + +#### Differences + +In summary, the differences you need to be aware of when subscribing to blockchain events in web3.js version 4.x are: + +- The `subscribe` function signature has changed: + - It does not accept a callback function. + - It returns a subscription object that you can use to listen to `data` and `error` events. +- You should now use the `on`, or `once`, method on the newly returned subscription object to listen to `data` and `error` events, instead of passing a callback function directly. +- You can have multiple event listeners, if you have, for example multiple `on` calls. And you can get the number of listeners in you code by calling `listenerCount(event_name)` or get the listeners with `listeners(event_name)`. + +Keep in mind that these differences apply to all blockchain event subscriptions, not just to the `newBlockHeaders` event. + +### New Block Headers event + +In 1.x, `web3.eth.subscribe('newBlockHeaders')` was used to subscribe to new block headers. + +In 4.x, either `web3.eth.subscribe('newHeads')` or `web3.eth.subscribe('newBlockHeaders')` can be used to subscribe to new block headers. + +### web3.eth.clearSubscriptions + +In 1.x, `web3.eth.clearSubscriptions` returns `true` on success. + +In 4.x, `web3.eth.clearSubscriptions` returns an `Array of subscription ids`. + +```typescript +// in 1.x +var subscription = web3.eth.subscribe('newBlockHeaders', function (error, result) { + if (!error) console.log(result); +}); +web3.eth.clearSubscriptions(function (error, success) { + console.log(success); // true +}); + +// in 4.x +const subscription = await web3.eth.subscribe('newHeads'); + +// note that in version 4.x the way you get notified for `data` and `error` has changed +newBlocksSubscription.on('data', async blockhead => { + console.log('New block header: ', blockhead); +}); +newBlocksSubscription.on('error', error => + console.log('Error when subscribing to New block header: ', error), +); + +const ids = await web3.eth.clearSubscriptions(); +console.log(ids); // [...] An array of subscription ids that were cleared + +// note that you can unsubscribe from a specific subscription by calling unsubscribe() +// on that subscription object: `await subscription.unsubscribe();` and this would return void if succeeded. +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_ens.md b/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_ens.md new file mode 100644 index 00000000000..10ba96391b7 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_ens.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 3 +sidebar_label: web3.eth.ens +--- + +# web3.eth.ens Migration Guide + +## Breaking Changes + +- All the API level interfaces returning or accepting `null` in 1.x, use `undefined` in 4.x. +- Functions don't accept a callback anymore. +- Functions that accepted an optional `TransactionConfig` as the last argument, now accept an optional `NonPayableCallOptions`. See `web3-eth-contract` package for more details. +- List of web3-eth-ens set functions are removed in 4.x + +#### receipt + +- The `receipt` object the event listener receives: + - Returns a `BigInt` instead of a number for the following properties: + - `transactionIndex` + - `blockNumber` + - `cumulativeGasUsed` + - `gasUsed` + - `effectiveGasPrice` + - Returns a `BigInt` instead of a boolean for the following properties: + - `status` + +#### web3.eth.ens.registryAddress + +- In 1.x ens was trying to find the registry address of the current network. In 4.x the default value is set to the address of registry address in the mainnet. + +#### web3.eth.ens.registry + +- `registry` was the way to get the ENS registry in 1.x. In 4.x the registry functionality is exposed directly through the `ens` class. + +#### resolver + +- `resolver` was already deprecated in the latest versions of 1.x. In 4.x it doesn't exist, use `getResolver` instead. + +#### setOwner + +- In 1.x documentation it is mentioned that `name`,`txConfig` and `callback` are the function arguments. This is wrong, since there is one more argument, `address`. So the right signature is `setOwner(name: string, address: string, txConfig?: TransactionConfig | undefined, callback?: ....)`. The same applies for 4.x, too. + +#### `getTTL` + +- In 4.x a `bigint` is returned instead of a `number`. + +### Removed functions + + - `getMultihash` is not supported in web3-eth-ens 4.x as it's deprecated in ENS public resolver + - Following functions are not supported in web3-eth-ens 4.x : + `setResolver` + `setSubnodeRecord` + `setApprovalForAll` + `isApprovedForAll` + `setSubnodeOwner` + `setTTL` + `setOwner` + `setRecord` + `setAddress` + `setPubkey` + `setContenthash` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_iban.md b/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_iban.md new file mode 100644 index 00000000000..33e60c93071 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_iban.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 7 +sidebar_label: web3.eth.iban +--- + +# web3.eth.iban Migration Guide + +## Breaking Changes + +### Iban class + +#### The Iban contractor + +##### In version 1.x + +It used to just accept the passed string without any check. + +##### In version 4.x + +If the provided string was not of either the length of a direct IBAN (34 or 35), or the length of an indirect IBAN (20), an Error will be thrown. The error will contain the message `'Invalid IBAN was provided'` + +#### Calling `toAddress` on an Iban that is not Direct + +##### In version 1.x + +It used to behave differently, if it was called on an instance of IBAN, from if it was called as a static method. However, this used to happen only if the provided address was not a Direct IBAN. More specifically, if the instance method `new Iban(address).toAddress()` was called, it will return an empty string (`''`) for that non Direct IBAN. And if the static method `Iban.toAddress(address)` was called, it used to throw an Error with the message `'IBAN is indirect and can\'t be converted'`, for that non Direct IBAN. + +##### In version 4.x + +If the provided IBAN was not a Direct one, an error will be thrown which contains the message: `'Iban is indirect and cannot be converted. Must be length of 34 or 35'`. And this behavior is now the same for the instance method `new Iban(address).toAddress()` and the static method `Iban.toAddress(address)`. + +#### Calling `fromAddress` on an invalid address + +##### In version 1.x + +If the provided IBAN was not a valid Ethereum Address, an error used be thrown which contains the message `'Provided address is not a valid address: '+ address`. + +##### In version 4.x + +If the provided IBAN was not a valid Ethereum Address, an error object will be thrown which contains the message: `'Invalid value given "${address}". Error: 'invalid ethereum address'` and the code `1005`. diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_migration_guide.md new file mode 100644 index 00000000000..10b57e1d261 --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/web3_eth_migration_guide.md @@ -0,0 +1,665 @@ +--- +sidebar_position: 3 +sidebar_label: web3.eth +--- + +# web3.eth Migration Guide + +## Breaking Changes + +All the API level interfaces returning or accepting `null` in 1.x, use `undefined` in 4.x. + +### Return Values + +#### Returns a `BigInt` instead of a number string + +- `web3.eth.getGasPrice` +- `web3.eth.getBalance` + +#### Returns a `BigInt` instead of a number + +- `web3.eth.getBlockNumber` +- `web3.eth.getBlockTransactionCount` +- `web3.eth.getBlockUncleCount` +- `web3.eth.getTransactionCount` +- `web3.eth.estimateGas` + +--- + +#### web3.eth.getBlock + +- Returns a `BigInt` instead of a number for the following properties: + - `baseFeePerGas` + - `gasLimit` + - `gasUsed` + - `number` + - `size` + - `timestamp` +- Returns a `BigInt` instead of a number string for the following properties: + - `difficulty` + - `totalDifficulty` + +#### web3.eth.getUncle + +- Returns a `BigInt` instead of a number for the following properties: + - `baseFeePerGas` + - `gasLimit` + - `gasUsed` + - `number` + - `size` + - `timestamp` +- Returns a `BigInt` instead of a number string for the following properties: + - `difficulty` + +#### web3.eth.getTransaction + +- Returns a `BigInt` instead of a number for the following properties: + - `blockNumber` + - `gas` + - `nonce` + - `transactionIndex` + - `type` +- Returns a `BigInt` instead of a number string for the following properties: + - `gasPrice` + - `maxFeePerGas` + - `maxPriorityFeePerGas` + - `value` + - `chainId` + +#### web3.eth.getPendingTransactions + +- Returns a `BigInt` instead of a number for the following properties: + - `blockNumber` + - `gas` + - `nonce` + - `transactionIndex` + - `type` +- Returns a `BigInt` instead of a number string for the following properties: + - `gasPrice` + - `maxFeePerGas` + - `maxPriorityFeePerGas` + - `value` + +#### web3.eth.getTransactionFromBlock + +- Returns a `BigInt` instead of a number for the following properties: + - `blockNumber` + - `gas` + - `nonce` + - `transactionIndex` + - `type` +- Returns a `BigInt` instead of a number string for the following properties: + - `gasPrice` + - `maxFeePerGas` + - `maxPriorityFeePerGas` + - `value` + +#### web3.eth.getTransactionReceipt + +- Returns a `BigInt` instead of a number for the following properties: + - `blockNumber` + - `cumulativeGasUsed` + - `effectiveGasPrice` + - `gasUsed` + - `transactionIndex` +- Returns a `BigInt` instead of a boolean for the following properties: + - `status` + +#### web3.eth.sendSignedTransaction + +- Returns a `BigInt` instead of a number for the following properties: + - `blockNumber` + - `cumulativeGasUsed` + - `effectiveGasPrice` + - `gasUsed` + - `transactionIndex` +- Returns a `BigInt` instead of a boolean for the following properties: + - `status` + +### Not Implemented + +- [extend](https://web3js.readthedocs.io/en/v1.7.3/web3-eth.html#extend) functionality not implemented + +### Defaults and Configs + +- In 1.x all default values that returned `null` now return `undefined` in 4.x, these include: + + - `givenProvider` + - `currentProvider` + - `web3.eth.defaultAccount` + - 1.x has `undefined` documented as default, but in implementation it's `null` + +- `web3.eth.defaultHardfork` default is `"london"` instead of `undefined` + - 1.x has `"london"` documented as default, but in implementation it's `undefined` +- `web3.eth.defaultChain` default is `"mainnet"` instead of `undefined` + - 1.x has `"mainnet"` documented as default, but in implementation it's `undefined` + +### Web3Eth Methods + +#### web3.eth.getHashrate + +4.x `getHashrate` is deprecated, and will be removed in a future release. Please use `getHashRate`. + +``` +web3.eth.getHashrate // -> deprecated, do not use +web3.eth.getHashRate // -> correct usage +``` + +#### web3.eth.getFeeHistory + +4.x returns a `BigInt` for `oldestBlock` instead of the hex string that's returned in 1.x. + +```typescript +// in 1.x +await web3.eth.getFeeHistory('0x1', 'latest', []); +// { +// oldestBlock: '0x0', +// baseFeePerGas: [ '0x3b9aca00', '0x342770c0' ], +// gasUsedRatio: [ 0 ] +// } + +// in 4.x +await web3.eth.getFeeHistory('0x1', 'latest', []); +// { +// oldestBlock: 0n, +// baseFeePerGas: [ '0x3b9aca00', '0x342770c0' ], +// gasUsedRatio: [ 0 ] +// } +``` + +#### web3.eth.sendTransaction + +- `userTransactionObject.chain` no longer defaults to `"mainnet"`, will be `undefined` if not provided +- `userTransactionObject.hardfork` no longer defaults to `"london"`, will be `undefined` if not provided + +### PromiEvents + +#### sending + +- In 1.x, the event listener would receive a `payload` object as an argument. In 4.x, just the sent transaction object is received + +```typescript +// in 1.x +web3.eth.sendTransaction({ ... }).on('sending', (payload) => { ... }); +// payload would be: +// { +// method: 'eth_sendTransaction', +// params: [ +// { +// from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// to: '0x0000000000000000000000000000000000000000', +// value: '0x1', +// maxPriorityFeePerGas: '0x9502F900', +// maxFeePerGas: '0xc3e17d20' +// } +// ], +// callback: undefined +// } + +// in 4.x +web3.eth.sendTransaction({ ... }).on('sending', (sendTransactionObject) => { ... }); +// sendTransactionObject would be: +// { +// from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// to: '0x0000000000000000000000000000000000000000', +// value: '0x1', +// gasPrice: '0x77359400', +// maxPriorityFeePerGas: undefined, +// maxFeePerGas: undefined +// } +``` + +#### sent + +- In 1.x, the event listener would receive a `payload` object as an argument. In 4.x just the sent transaction object is received + +```typescript +// in 1.x +web3.eth.sendTransaction({ ... }).on('sent', (payload) => { ... }); +// payload would be: +// { +// method: 'eth_sendTransaction', +// params: [ +// { +// from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// to: '0x0000000000000000000000000000000000000000', +// value: '0x1' +// } +// ], +// callback: undefined +// } + +// in 4.x +web3.eth.sendTransaction({ ... }).on('sent', (sentTransactionObject) => { ... }); +// sentTransactionObject would be: +// { +// from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', +// to: '0x0000000000000000000000000000000000000000', +// value: '0x1', +// gasPrice: '0x77359400', +// maxPriorityFeePerGas: undefined, +// maxFeePerGas: undefined +// } +``` + +#### receipt + +- The `receipt` object the event listener receives: + - Returns a `BigInt` instead of a number for the following properties: + - `transactionIndex` + - `blockNumber` + - `cumulativeGasUsed` + - `gasUsed` + - `effectiveGasPrice` + - Returns a `BigInt` instead of a boolean for the following properties: + - `status` + +```typescript +// in 1.x +web3.eth.sendTransaction({ ... }).on('receipt', (receipt) => { ... }); +// receipt would be: +// { +// blockHash: '0x55ff0699736027fd0eddf90e890294ba6765ecf699cefd2f6c255a2fdae06a5a', +// blockNumber: 14966017n, +// cumulativeGasUsed: 6992382n, +// effectiveGasPrice: 31200410061n, +// from: '0x3b7414be92e87837d6f95d01b8e3c93ac9d20804', +// gasUsed: 21000n, +// logs: [], +// logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +// status: 1n, +// to: '0x8b664e252b7c5c87c17e73c69f16e56454c9661f', +// transactionHash: '0x219f94fa188e6a0927c3c659537b5c76f4a750b948e7a73c80b28786227aa593', +// transactionIndex: 80n, +// type: 2n +// } + +// in 4.x +web3.eth.sendTransaction({ ... }).on('receipt', (receipt) => { ... }); +// receipt would be: +// { +// transactionHash: '0xef37e818889e7b40df24f8546ae15b16cda7e8fdc99ad76356611401cb4c4f93', +// transactionIndex: '0x0', +// blockNumber: '0xf', +// blockHash: '0x8a700d6665a5b91789f7525490c453d55208f7560662aa3ff2eaab8d297bfd07', +// from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// to: '0x0000000000000000000000000000000000000000', +// cumulativeGasUsed: '0x5208', +// gasUsed: '0x5208', +// logs: [], +// logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +// status: '0x1', +// effectiveGasPrice: '0x77359400', +// type: '0x0' +// } +``` + +#### confirmation + +- In 1.x, this event listener would receive `confirmationNumber` and `receipt` as arguments, in 4.x an object containing the properties: `confirmationNumber`, `receipt`, and `latestBlockHash` will be received +- `confirmationNumber` is returned as a `BigInt` instead of a number +- For the returned `receipt` object: + - Returns a `BigInt` instead of a number for the following properties: + - `transactionIndex` + - `blockNumber` + - `cumulativeGasUsed` + - `gasUsed` + - `effectiveGasPrice` + - Returns a `BigInt` instead of a boolean for the following properties: + - `status` + +```typescript +// in 1.x +web3.eth.sendTransaction({ ... }).on('confirmation', (confirmationNumber, receipt) => { ... }); +// confirmationNumber would be: 1 +// receipt would be: +// { +// transactionHash: '0x1e657e53a0e5a75fe36af8a05c89b8a8ea155c951ce43a7c42a77a48c4c89e2f', +// transactionIndex: 0, +// blockNumber: 2, +// blockHash: '0x940bfb359be8064d7c65408efaba3068bdd6995b810aae5fb355bd3d95d3079b', +// from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// to: '0x0000000000000000000000000000000000000000', +// cumulativeGasUsed: 21000, +// gasUsed: 21000, +// contractAddress: null, +// logs: [], +// logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +// status: true, +// effectiveGasPrice: 3265778125, +// type: '0x2' +// } + +// in 4.x +web3.eth.sendTransaction({ ... }).on('confirmation', (confirmationObject) => { ... }); +// confirmationObject would have the following structure: +// { +// confirmationNumber: 2n, +// receipt: { +// transactionHash: '0xd93fe25c2066cd8f15565bcff693507a3c70f5fb9387db57f939ae91f4080c6c', +// transactionIndex: 0n, +// blockNumber: 5n, +// blockHash: '0xe1775977a8041cb2709136804e4be609135f8367b49d38960f92a95b4c02189a', +// from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// to: '0x0000000000000000000000000000000000000000', +// cumulativeGasUsed: 5208n, +// gasUsed: 5208n, +// logs: [], +// logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +// status: 1n, +// effectiveGasPrice: 77359400n, +// type: '0x0' +// }, +// latestBlockHash: '0xb2ef3763190da82d8efa938f73efa5bb21e3d95c2ce25dd38ca21eea1a942260' +// } +``` + +- In 1.x, an event was emitted for each confirmation starting from `0` (the first block the transaction was included in), in 4.x confirmations start from `1` and the first event to be emitted will have a `confirmationNumber` of `2` + +```typescript +// in 1.x +web3.eth.sendTransaction({ ... }).on('confirmation', (confirmationNumber, receipt) => { + // confirmationNumber would equal 1 the first time the event was emitted + // confirmationNumber would then equal 2 the next time + // and so on until 12 (or whatever transactionConfirmationBlocks is set to) confirmations are found +}); + +// in 4.x +web3.eth.sendTransaction({ ... }).on('confirmation', (confirmationObject) => { + // confirmationNumber would equal 2 the first time the event was emitted + // confirmationNumber would then equal 3 the next time + // and so on until 12 (or whatever transactionConfirmationBlocks is set to) confirmations are found +}); +``` + +### web3.eth.sign + +- To-be-signed data must be provided as a `HexString` + +```typescript +// In 1.x, data can be provided as both a UTF-8 string and a hex string +await web3.eth.sign('Hello world', '0xd8c375f286c258521564da00ddee3945d1d057c4'); +// 0x7907ca312eb55a54673255dfa4e947d7533dcf746460c82b50e281fe88a6f0d17d602d2205b2d7c137cf7cb9b86a7ea976fd062e39bc08373dffa72f020776e11c +await web3.eth.sign( + web3.utils.utf8ToHex('Hello world'), + '0xd8c375f286c258521564da00ddee3945d1d057c4', +); +// 0x7907ca312eb55a54673255dfa4e947d7533dcf746460c82b50e281fe88a6f0d17d602d2205b2d7c137cf7cb9b86a7ea976fd062e39bc08373dffa72f020776e11c + +// 4.x only supports Hex Strings +await web3.eth.sign( + web3.utils.utf8ToHex('Hello world'), + '0xd8c375f286c258521564da00ddee3945d1d057c4', +); +// 0x7907ca312eb55a54673255dfa4e947d7533dcf746460c82b50e281fe88a6f0d17d602d2205b2d7c137cf7cb9b86a7ea976fd062e39bc08373dffa72f020776e11c +``` + +### web3.eth.signTransaction + +- In 1.x, for untyped, `0x0` and `0x1` typed transactions, `maxPriorityFeePerGas` and `maxFeePerGas` are set to `null`. For `0x2` typed transactions, `gasPrice` is set to `null`. In 4.x these properties are not present unless provided +- In 1.x contract deployment data is provided via the `input` property, while in 4.x it is provided using the `data` property +- In 1.x the hash of the transaction is included in the returned `transaction` object, while in 4.x it's not + +```typescript +// In 1.x - Legacy (type 0x0) transaction +await web3.eth.signTransaction({ + from: '0x95Cd1391888fe2460371c67cc3e45b9579c3E0dA', + to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + gas: '21000', + gasPrice: '0xc3e17d20', + nonce: '0x4', +}); +// { +// raw: '0x02f86c82053904849502f90084c3e17d20825208946e599da0bff7a6598ac1224e4985430bf16458a48080c080a0711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20a033d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// tx: { +// type: '0x2', +// nonce: '0x4', +// gasPrice: '0xc3e17d20, +// maxPriorityFeePerGas: null, +// maxFeePerGas: null, +// gas: '0x5208', +// value: '0x0', +// input: '0x', +// v: '0x0', +// r: '0x711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20', +// s: '0x33d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// to: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// chainId: '0x539', +// accessList: [], +// hash: '0x2ddb1224899bcbc07c89631870870c61195214bab64d60985cd6d8f1c2fd872b' +// } +// } + +// In 1.x - EIP-1559 (type 0x2) transaction +await web3.eth.signTransaction({ + from: '0x95Cd1391888fe2460371c67cc3e45b9579c3E0dA', + to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + gas: '21000', + maxPriorityFeePerGas: '0x9502F900', + maxFeePerGas: '0xc3e17d20', + nonce: '0x4', +}); +// { +// raw: '0x02f86c82053904849502f90084c3e17d20825208946e599da0bff7a6598ac1224e4985430bf16458a48080c080a0711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20a033d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// tx: { +// type: '0x2', +// nonce: '0x4', +// gasPrice: null, +// maxPriorityFeePerGas: '0x9502f900', +// maxFeePerGas: '0xc3e17d20', +// gas: '0x5208', +// value: '0x0', +// input: '0x', +// v: '0x0', +// r: '0x711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20', +// s: '0x33d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// to: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// chainId: '0x539', +// accessList: [], +// hash: '0x2ddb1224899bcbc07c89631870870c61195214bab64d60985cd6d8f1c2fd872b' +// } +// } + +// In 4.x - Legacy (type 0x0) transaction +await web3.eth.signTransaction({ + from: '0x95Cd1391888fe2460371c67cc3e45b9579c3E0dA', + to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + gas: '21000', + gasPrice: '0xc3e17d20', + nonce: '0x4', +}); +// { +// raw: '0x02f86c82053904849502f90084c3e17d20825208946e599da0bff7a6598ac1224e4985430bf16458a48080c080a0711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20a033d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// tx: { +// type: 2n, +// nonce: 4n, +// gasPrice: 3286334752n, +// gas: 21000n, +// value: 0n, +// v: 0n, +// r: '0x711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20', +// s: '0x33d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// to: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// chainId: 1337n, +// accessList: [], +// data: '0x' +// } +// } + +// In 4.x - EIP-1559 (type 0x2) transaction +await web3.eth.signTransaction({ + from: '0x95Cd1391888fe2460371c67cc3e45b9579c3E0dA', + to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + gas: '21000', + maxPriorityFeePerGas: '0x9502F900', + maxFeePerGas: '0xc3e17d20', + nonce: '0x4', +}); +// { +// raw: '0x02f86c82053904849502f90084c3e17d20825208946e599da0bff7a6598ac1224e4985430bf16458a48080c080a0711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20a033d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// tx: { +// type: 2n, +// nonce: 4n, +// maxPriorityFeePerGas: 2500000000n, +// maxFeePerGas: 3286334752n, +// gas: 21000n, +// value: 0n, +// v: 0n, +// r: '0x711c981b34204725019d9851ee0c127543b0c7caf4f8850024e26aefabf26f20', +// s: '0x33d8447d959bd596c90d57db90917a126b95a0f152c9c86b36d97b177f7ae85f', +// to: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', +// chainId: 1337n, +// accessList: [], +// data: '0x' +// } +// } +``` + +### web3.eth.getPastLogs + +- Returns a `BigInt` instead of a number for the following properties: + - `logIndex` + - `transactionIndex` + - `blockNumber` + +```typescript +//in 1.x +await web3.eth + .getPastLogs({ + address: '0xE012dB5CA859A3238DdC576c0092BA5E728B7268', + topics: ['0x617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab'], + }) + .then(console.log); +// [ +// { +// address: "0xe405df0ea854cd98df9f646559ce2001396e8f5b", +// topics: [ +// "0x617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab", +// ], +// data: "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000027431000000000000000000000000000000000000000000000000000000000000", +// blockNumber: 221, +// transactionHash: +// "0xc96bbd8308f70940aa465ecdf95c7ce8c687dede5c53e5ce5ce55434c6e406bd", +// transactionIndex: 0, +// blockHash: +// "0xfd1657fc5d2b18153aa569956718cd2d3a05285712208a9544dfc093966b9c5f", +// logIndex: 0, +// removed: false, +// }, +// ]; + +//in 4.x +await web3.eth + .getPastLogs({ + address: '0xE012dB5CA859A3238DdC576c0092BA5E728B7268', + topics: ['0x617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab'], + }) + .then(console.log); +// [ +// { +// address: "0xe405df0ea854cd98df9f646559ce2001396e8f5b", +// topics: [ +// "0x617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab", +// ], +// data: "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000027431000000000000000000000000000000000000000000000000000000000000", +// blockNumber: 221n, +// transactionHash: +// "0xc96bbd8308f70940aa465ecdf95c7ce8c687dede5c53e5ce5ce55434c6e406bd", +// transactionIndex: 0n, +// blockHash: +// "0xfd1657fc5d2b18153aa569956718cd2d3a05285712208a9544dfc093966b9c5f", +// logIndex: 0n, +// removed: false, +// }, +// ]; +``` + +### web3.eth.getChainId + +Returns a `BigInt` instead of a number string. + +```typescript +// in 1.x +web3.eth.getChainId().then(console.log); +// 1337 + +// in 4.x +web3.eth.getChainId().then(console.log); +// 1337n +``` + +### web3.eth.getProof + +- Returns a `BigInt` instead of a number string for the following properties: + - `balance` + - `nonce` + +In 1.x, `balance` and `nonce` were described as numbers. + +```typescript +// in 1.x +web3.eth + .getProof( + '0x10d53fb7D9C9EedC40A97B51663fFd8DcC651a6b', + [ + '0x0000000000000000000000000000000000000000000000000000000000000000', + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + 'latest', + ) + .then(console.log); +// { +// address: '0x10d53fb7D9C9EedC40A97B51663fFd8DcC651a6b', +// accountProof: [ +// '0xf90211a057107845987d38b07b52dd91268d5a41dc0c5d262feb2a21a27165387bca0447a063d1f4079378d594b3a02ac552c5d303fd0ddda203d674114468ee1908e3c61ba06e25ed79c830f5375e01e142f165f2cfd9c6c966e3755f62ae7eac87b6972dcba0e9d751f777e854f7c87fc590f20bd45d5142dd804904746fe0eec6969ef2904ca0e5eb80b4790935a22f416cbdf7abf5658c1b26d9aadcaddda80dfd30fb477605a06ebd45fd404417976368dfc3225139b9c475cd199f0e2ec9dc2bc66894c7b478a0389e57b4c2e590bd7fc4a42c5f8d1ae4f03f981c8d10fd028fe8a8cd21d4b9f6a063662eba9e6e5c1229f73d9b8123a35e837ab9b51c12bd2c21342860a850be5fa088a53f78919dddb7ec2eddb967b7d74eeab59c0352fe0a9fceeab86d3061a2aea06fec4053b58d1914ef325a74d9ad13658f19478091484935cbfb82f2ace45d07a099455c1fe3bc9c9c90668fcaf3996182b0ea32c36b16b757f877981e74265313a07afabdbb861f9c9c801a8be8b9a30fcad67b0468c1599f3150417df833b1ed15a0937108ade09abe0eb7a5d5abf7834cb4d5c6a42256071a203c97e219c9b35e4fa07333b514b144076aedef8232f460a65c5845fb7bee1dffa3d02a63d27ee103dda02a5f97f2acf28a2ef6098553188bb578f5699e5ddd86e750906427c04146638aa0b1ea877b1fb989471890e9e0eea1ca9ecabe4a501f5427dcc6122ac602ec5e5a80', +// '0xf8b1808080a01fcc2ac732952007a813f5d53b517a2f0c3b5faf38cd0654e564302e39e2fec68080a040cb340b7815612dc0705235c46f04565d5e7005b26b1544bd72d2a0cde1f7fb80a05902a1a7c70a64efedd39ed9ae25078e9054ab531c8fe4bdd7ff245ecd2bca0780a06117e0dc18ac6d32f46418eabf875a8cd21bf05b62013f87242824ca939cb776808080a0261eb1dc702fff2a022d7a2f0386224a760971187e3d6447958293f455aafbc78080', +// '0xf869a02032c2889a72d251d4f0bbf5eb448f4af962917185a86532af762ff82865ca68b846f8440180a0291bd0e0825fa92cfeb0d3b28529bae6709aa1db89a25f7e62ba5422bbb1e10ea09bbff76f89bb6a6e787eea245acb599900f2d58faab236e165e2b32df0198c84' +// ], +// balance: '0', +// codeHash: '0x9bbff76f89bb6a6e787eea245acb599900f2d58faab236e165e2b32df0198c84', +// nonce: '1', +// storageHash: '0x291bd0e0825fa92cfeb0d3b28529bae6709aa1db89a25f7e62ba5422bbb1e10e', +// storageProof: [ +// { +// key: '0x0', +// value: '0x736f6c79656e7420677265656e2069732070656f706c6500000000000000002e', +// proof: [Array] +// }, +// { key: '0x1', value: '0x0', proof: [Array] } +// ] +//} +// in 4.x +web3.eth + .getProof( + '0x10d53fb7D9C9EedC40A97B51663fFd8DcC651a6b', + [ + '0x0000000000000000000000000000000000000000000000000000000000000000', + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + 'latest', + ) + .then(console.log); + { +// accountProof: [ +// '0xf90211a057107845987d38b07b52dd91268d5a41dc0c5d262feb2a21a27165387bca0447a063d1f4079378d594b3a02ac552c5d303fd0ddda203d674114468ee1908e3c61ba06e25ed79c830f5375e01e142f165f2cfd9c6c966e3755f62ae7eac87b6972dcba0e9d751f777e854f7c87fc590f20bd45d5142dd804904746fe0eec6969ef2904ca0e5eb80b4790935a22f416cbdf7abf5658c1b26d9aadcaddda80dfd30fb477605a06ebd45fd404417976368dfc3225139b9c475cd199f0e2ec9dc2bc66894c7b478a0389e57b4c2e590bd7fc4a42c5f8d1ae4f03f981c8d10fd028fe8a8cd21d4b9f6a063662eba9e6e5c1229f73d9b8123a35e837ab9b51c12bd2c21342860a850be5fa088a53f78919dddb7ec2eddb967b7d74eeab59c0352fe0a9fceeab86d3061a2aea06fec4053b58d1914ef325a74d9ad13658f19478091484935cbfb82f2ace45d07a099455c1fe3bc9c9c90668fcaf3996182b0ea32c36b16b757f877981e74265313a07afabdbb861f9c9c801a8be8b9a30fcad67b0468c1599f3150417df833b1ed15a0937108ade09abe0eb7a5d5abf7834cb4d5c6a42256071a203c97e219c9b35e4fa07333b514b144076aedef8232f460a65c5845fb7bee1dffa3d02a63d27ee103dda02a5f97f2acf28a2ef6098553188bb578f5699e5ddd86e750906427c04146638aa0b1ea877b1fb989471890e9e0eea1ca9ecabe4a501f5427dcc6122ac602ec5e5a80', +// '0xf8b1808080a01fcc2ac732952007a813f5d53b517a2f0c3b5faf38cd0654e564302e39e2fec68080a040cb340b7815612dc0705235c46f04565d5e7005b26b1544bd72d2a0cde1f7fb80a05902a1a7c70a64efedd39ed9ae25078e9054ab531c8fe4bdd7ff245ecd2bca0780a06117e0dc18ac6d32f46418eabf875a8cd21bf05b62013f87242824ca939cb776808080a0261eb1dc702fff2a022d7a2f0386224a760971187e3d6447958293f455aafbc78080', +// '0xf869a02032c2889a72d251d4f0bbf5eb448f4af962917185a86532af762ff82865ca68b846f8440180a0291bd0e0825fa92cfeb0d3b28529bae6709aa1db89a25f7e62ba5422bbb1e10ea09bbff76f89bb6a6e787eea245acb599900f2d58faab236e165e2b32df0198c84' +// ], +// balance: 0n, +// codeHash: '0x9bbff76f89bb6a6e787eea245acb599900f2d58faab236e165e2b32df0198c84', +// nonce: 1n, +// storageHash: '0x291bd0e0825fa92cfeb0d3b28529bae6709aa1db89a25f7e62ba5422bbb1e10e', +// storageProof: [ +// { +// key: '0x0000000000000000000000000000000000000000000000000000000000000000', +// value: '0x736f6c79656e7420677265656e2069732070656f706c6500000000000000002e', +// proof: [Array] +// }, +// { +// key: '0x0000000000000000000000000000000000000000000000000000000000000001', +// value: '0x0', +// proof: [Array] +// } +// ] +// } +``` diff --git a/docs/docs/guides/web3_upgrade_guide/1.x/web3_utils_migration_guide.md b/docs/docs/guides/web3_upgrade_guide/1.x/web3_utils_migration_guide.md new file mode 100644 index 00000000000..0b977890e6e --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/1.x/web3_utils_migration_guide.md @@ -0,0 +1,104 @@ +--- +sidebar_position: 11 +sidebar_label: web3.utils +--- + +# web3 Utils Migration Guide + +## Import + +To make use you only import the utility functions which are needed by your app. We encourage the named import for `web3-utils` package. This change has no impact on the using the namespace `Web3.utils` or `web3.utils`. If you still want to import the full utils it can be done as following: + +```ts +// 1.x +import web3Utils from 'web3-utils'; + +// 4.x +import * as web3Utils from 'web3-utils'; +``` + +## Unit conversion functions + +The `toWei` does not have an optional second parameter. You have to pass the source unit explicitly. + +```ts +// 1.x +web3.utils.toWei('0.1'); + +// 4.x +web3.utils.toWei('0.1', 'ether'); +``` + +## Conversion to Hex + +The `toHex` behave exactly the same in both v1.x and 4.x, except for a string that contains only numbers. In 1.x if a number was provided inside a string like `123` it used to be treated as a number. While in 4.x it will be treated as a string, except if it was prefixed with `0x`. For more clarity, check below: + +```ts +// 1.x +new Web3().utils.toHex(0x1) // returns 0x1 +new Web3().utils.toHex('0x1') // returns 0x1 +new Web3().utils.toHex(1) // returns 0x1 +new Web3().utils.toHex('1') // returns 0x1 + +// 4.x +new Web3().utils.toHex(0x1) // returns 0x1 +new Web3().utils.toHex('0x1') // returns 0x1 +new Web3().utils.toHex(1) // returns 0x1 +new Web3().utils.toHex('1') // returns 0x31 +``` + +## Validation functions + +Validation functions has been moved to the new package `web3-validator`. Actually, you can still import them from `web3-util`. But they are marked as "deprecated" and you are encouraged to import them from `web3-validator`. + +However, there are changes for the following: + +### `isHex` and `isHexStrict` validation functions + +There is a fix, and some edge-cases-changes for those 2 functions but the overall functionality stayed the same. And here is exactly whet changed: + +#### `isHex` now returns `true` for all negative numbers + +```ts +isHex('-123'); // in 1.x used to return `false`. But changed in 4.x to return `true` +// `true` +``` + +#### `isHex` now returns `false` for an empty string + +```ts +isHex(''); // in 1.x used to return `true`. But changed in 4.x to return `false` +// `false` +``` + +#### `isHex` and `isHexStrict` now returns `false` for `'-0x'` + +```ts +isHex('-0x'); // in 1.x used to return `true`. But changed in 4.x to return `false` +// `false` + +isHexStrict('-0x'); // in 1.x used to return `true`. But changed in 4.x to return `false` +// `false` +``` +## stripHexPrefix method + +In 1.x `stripHexPrefix` method is located in the `web3-utils` package, in 4.x this has been moved to `web3-eth-accounts` + +```typescript +import { stripHexPrefix } from 'web3-eth-accounts'; + +console.log(stripHexPrefix('0x123')); // "123" + +``` + +## Other functions + +`compareBlockNumbers` now accepts either both block tags or both block numbers for comparison as parameters. The only exception is comparison of block tag `earliest` with numbers. + +```ts +compareBlockNumbers('earliest', 'safe'); // its valid comparison, and it will return `-1` + +compareBlockNumbers(8692, 2); // its valid comparison, and it will return `1` + +compareBlockNumbers('latest', 500); // in 1.x it used to return `1`, but now it will throw error InvalidBlockError +``` diff --git a/docs/docs/guides/web3_upgrade_guide/_category_.yml b/docs/docs/guides/web3_upgrade_guide/_category_.yml new file mode 100644 index 00000000000..e3022cfe8fd --- /dev/null +++ b/docs/docs/guides/web3_upgrade_guide/_category_.yml @@ -0,0 +1,5 @@ +label: '⬆️ Upgrading' +collapsible: true +collapsed: true +link: null +position: 10 \ No newline at end of file diff --git a/docs/docs/libdocs/.nojekyll b/docs/docs/libdocs/.nojekyll new file mode 100644 index 00000000000..e2ac6616add --- /dev/null +++ b/docs/docs/libdocs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 00000000000..4aa61896c30 --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,199 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const lightCodeTheme = require('prism-react-renderer').themes.github; +const darkCodeTheme = require('prism-react-renderer').themes.dracula; +const { join } = require('path'); + +const packages = [ + 'web3', + 'web3-eth', + 'web3-eth-contract', + 'web3-utils', + 'web3-validator', + 'web3-types', + 'web3-core', + 'web3-errors', + 'web3-net', + 'web3-eth-abi', + 'web3-eth-accounts', + 'web3-eth-ens', + 'web3-eth-iban', + 'web3-eth-personal', + 'web3-providers-http', + 'web3-providers-ws', + 'web3-providers-ipc', +]; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'web3.js', + tagline: 'Powerful TypeScript libraries for Ethereum interaction and utility functions', + url: 'https://docs.web3js.org', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'throw', + favicon: 'img/favicon.ico', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'ChainSafe', // Usually your GitHub org/user name. + projectName: 'web3.js', // Usually your repo name. + + // Even if you don't use internalization, you can use this field to set useful + // metadata like html lang. For example, if your site is Chinese, you may want + // to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + plugins: [ + '@docusaurus/theme-live-codeblock', + [ + 'docusaurus-plugin-typedoc-api', + { + projectRoot: join(__dirname, '..'), + // Monorepo + packages: packages.map(p => `packages/${p}`), + minimal: false, + debug: true, + changelogs: true, + readmes: false, + tsconfigName: 'docs/tsconfig.docs.json', + typedocOptions: { + plugin: [ + 'typedoc-monorepo-link-types', + 'typedoc-plugin-extras', + 'typedoc-plugin-mdn-links', + ], + }, + }, + ], + 'docusaurus-lunr-search', + ], + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: require.resolve('./sidebars.js'), + routeBasePath: '/', // Serve the docs at the site's root + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: 'https://github.com/web3/web3.js/tree/4.x/docs', + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + navbar: { + title: 'Web3.js Docs', + logo: { + src: 'img/web3js.svg', + }, + items: [ + { + to: '/', + activeBasePath: '/', + label: 'Guides & Tutorials', + position: 'left', + }, + { + to: '/libdocs/ABI', + activeBasePath: '/libdocs/', + label: 'Documentation', + position: 'left', + }, + { + to: 'api', // 'api' is the 'out' directory + label: 'API', + position: 'left', + }, + { + to: '/glossary/json_interface', + activeBasePath: '/glossary/', + label: 'Glossary', + position: 'left', + }, + { + href: 'https://github.com/ChainSafe/web3.js/tree/4.x/', + label: 'GitHub', + position: 'right', + }, + { + href: 'https://web3js.org/#/', + label: 'Web3js.org', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Community', + items: [ + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/web3js', + }, + { + label: 'Discord', + href: 'https://discord.com/invite/pb3U4zE8ca', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Web3.js . Built with Docusaurus.`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + liveCodeBlock: { + /** + * The position of the live playground, above or under the editor + * Possible values: "top" | "bottom" + */ + playgroundPosition: 'bottom', + }, + image:"https://pbs.twimg.com/profile_images/1746099108937363456/duG_Pqem_400x400.jpg", + metadata: [ + { name: 'keywords', content: 'web3.js, web3, web3js, ethereum, ethereum json rpc, blockchain development, smart contracts, dapps, dApp development' }, + { name: 'description', content: 'Collection of comprehensive TypeScript libraries for Interaction with the Ethereum JSON RPC API and utility functions.' }, + { name: 'og:title', content: 'Web3.js Documentation' }, + { name: 'og:description', content: 'Collection of comprehensive TypeScript libraries for Interaction with the Ethereum JSON RPC API and utility functions.' }, + { name: 'og:type', content: 'website' }, + { name: 'og:url', content: 'https://docs.web3js.org' }, + { name: 'og:image', content: 'https://pbs.twimg.com/profile_images/1746099108937363456/duG_Pqem_400x400.jpg' }, + { name: 'twitter:card', content: 'summary_large_image' }, + { name: 'twitter:title', content: 'Web3.js Documentation' }, + { name: 'twitter:description', content: 'Official documentation for web3.js, the Type/JavaScript library for interacting with the Ethereum blockchain.' }, + { name: 'twitter:image', content: 'https://raw.githubusercontent.com/web3/web3.js/4.x/assets/logo/web3js.jpg' }, + ], + }), +}; + +module.exports = config; diff --git a/docs/getting-started.rst b/docs/getting-started.rst deleted file mode 100644 index 303b22857cd..00000000000 --- a/docs/getting-started.rst +++ /dev/null @@ -1,42 +0,0 @@ - -=============== -Getting Started -=============== - -The web3.js library is a collection of modules that contain functionality for the ethereum ecosystem. - -- ``web3-eth`` is for the ethereum blockchain and smart contracts. -- ``web3-shh`` is for the whisper protocol, to communicate p2p and broadcast. -- ``web3-bzz`` is for the swarm protocol, the decentralized file storage. -- ``web3-utils`` contains useful helper functions for Dapp developers. - - -.. _adding-web3: - -Adding web3.js -============== - -.. index:: npm -.. index:: yarn - -First you need to get web3.js into your project. This can be done using the following methods: - -- npm: ``npm install web3`` -- yarn: ``yarn add web3`` -- pure js: link the ``dist/web3.min.js`` - -After that you need to create a web3 instance and set a provider. - -Most Ethereum-supported browsers like MetaMask have an `EIP-1193 `_ compliant provider available at ``window.ethereum``. - -For web3.js, check ``Web3.givenProvider``. - -If this property is ``null`` you should connect to a remote/local node. - -.. code-block:: javascript - - // In Node.js use: const Web3 = require('web3'); - - let web3 = new Web3(Web3.givenProvider || "ws://localhost:8545"); - -That's it! now you can use the ``web3`` object. diff --git a/docs/glossary.rst b/docs/glossary.rst deleted file mode 100644 index d3b1967b934..00000000000 --- a/docs/glossary.rst +++ /dev/null @@ -1,97 +0,0 @@ - -======== -Glossary -======== - - - -.. _glossary-json-interface: - ------------------------------------------------------------------------------- - -json interface -===================== - -The json interface is a json object describing the `Application Binary Interface (ABI) `_ for an Ethereum smart contract. - -Using this json interface web3.js is able to create JavaScript object representing the smart contract and its methods and events using the :ref:`web3.eth.Contract object `. - -------- -Specification -------- - -Functions: - -- ``type``: ``"function"``, ``"constructor"`` (can be omitted, defaulting to ``"function"``; ``"fallback"`` also possible but not relevant in web3.js); -- ``name``: the name of the function (only present for function types); -- ``constant``: ``true`` if function is specified to not modify the blockchain state; -- ``payable``: ``true`` if function accepts ether, defaults to ``false``; -- ``stateMutability``: a string with one of the following values: ``pure`` (specified to not read blockchain state), ``view`` (same as ``constant`` above), ``nonpayable`` and ``payable`` (same as ``payable`` above); -- ``inputs``: an array of objects, each of which contains: - - - ``name``: the name of the parameter; - - ``type``: the canonical type of the parameter. -- ``outputs``: an array of objects same as ``inputs``, can be omitted if no outputs exist. - -Events: - -- ``type``: always ``"event"`` -- ``name``: the name of the event; -- ``inputs``: an array of objects, each of which contains: - - - ``name``: the name of the parameter; - - ``type``: the canonical type of the parameter. - - ``indexed``: ``true`` if the field is part of the log's topics, ``false`` if it one of the log's data segment. -- ``anonymous``: ``true`` if the event was declared as ``anonymous``. - - -------- -Example -------- - -.. code-block:: javascript - - contract Test { - uint a; - address d = 0x12345678901234567890123456789012; - - function Test(uint testInt) { a = testInt;} - - event Event(uint indexed b, bytes32 c); - - event Event2(uint indexed b, bytes32 c); - - function foo(uint b, bytes32 c) returns(address) { - Event(b, c); - return d; - } - } - - // would result in the JSON: - [{ - "type":"constructor", - "payable":false, - "stateMutability":"nonpayable" - "inputs":[{"name":"testInt","type":"uint256"}], - },{ - "type":"function", - "name":"foo", - "constant":false, - "payable":false, - "stateMutability":"nonpayable", - "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}], - "outputs":[{"name":"","type":"address"}] - },{ - "type":"event", - "name":"Event", - "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}], - "anonymous":false - },{ - "type":"event", - "name":"Event2", - "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}], - "anonymous":false - }] - - ------------------------------------------------------------------------------- diff --git a/docs/include_package-core.rst b/docs/include_package-core.rst deleted file mode 100644 index 9cc0e9bc8c1..00000000000 --- a/docs/include_package-core.rst +++ /dev/null @@ -1,360 +0,0 @@ - - -setProvider -===================== - -.. code-block:: javascript - - web3.setProvider(myProvider) - web3.eth.setProvider(myProvider) - web3.shh.setProvider(myProvider) - web3.bzz.setProvider(myProvider) - ... - -Will change the provider for its module. - -.. note:: - When called on the umbrella package ``web3`` it will also set the provider for all sub modules ``web3.eth``, ``web3.shh``, etc. EXCEPT ``web3.bzz`` which needs a separate provider at all times. - ----------- -Parameters ----------- - -1. ``Object`` - ``myProvider``: :ref:`a valid provider `. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - var Web3 = require('web3'); - var web3 = new Web3('http://localhost:8545'); - // or - var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); - - // change provider - web3.setProvider('ws://localhost:8546'); - // or - web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:8546')); - - // Using the IPC provider in node.js - var net = require('net'); - var web3 = new Web3('/Users/myuser/Library/Ethereum/geth.ipc', net); // mac os path - // or - var web3 = new Web3(new Web3.providers.IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', net)); // mac os path - // on windows the path is: "\\\\.\\pipe\\geth.ipc" - // on linux the path is: "/users/myuser/.ethereum/geth.ipc" - - ------------------------------------------------------------------------------- - -providers -===================== - -.. code-block:: javascript - - web3.providers - web3.eth.providers - web3.shh.providers - web3.bzz.providers - ... - -Contains the current available :ref:`providers `. - ----------- -Value ----------- - -``Object`` with the following providers: - - - ``Object`` - ``HttpProvider``: The HTTP provider is **deprecated**, as it won't work for subscriptions. - - ``Object`` - ``WebsocketProvider``: The Websocket provider is the standard for usage in legacy browsers. - - ``Object`` - ``IpcProvider``: The IPC provider is used node.js dapps when running a local node. Gives the most secure connection. - -------- -Example -------- - -.. code-block:: javascript - - var Web3 = require('web3'); - // use the given Provider, e.g in Mist, or instantiate a new websocket provider - var web3 = new Web3(Web3.givenProvider || 'ws://remotenode.com:8546'); - // or - var web3 = new Web3(Web3.givenProvider || new Web3.providers.WebsocketProvider('ws://remotenode.com:8546')); - - // Using the IPC provider in node.js - var net = require('net'); - - var web3 = new Web3('/Users/myuser/Library/Ethereum/geth.ipc', net); // mac os path - // or - var web3 = new Web3(new Web3.providers.IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc', net)); // mac os path - // on windows the path is: "\\\\.\\pipe\\geth.ipc" - // on linux the path is: "/users/myuser/.ethereum/geth.ipc" - -------------- -Configuration -------------- - -.. code-block:: javascript - - // ==== - // Http - // ==== - - var Web3HttpProvider = require('web3-providers-http'); - - var options = { - keepAlive: true, - withCredentials: false, - timeout: 20000, // ms - headers: [ - { - name: 'Access-Control-Allow-Origin', - value: '*' - }, - { - ... - } - ], - agent: { - http: http.Agent(...), - baseUrl: '' - } - }; - - var provider = new Web3HttpProvider('http://localhost:8545', options); - - // ========== - // Websockets - // ========== - - var Web3WsProvider = require('web3-providers-ws'); - - var options = { - timeout: 30000, // ms - - // Useful for credentialed urls, e.g: ws://username:password@localhost:8546 - headers: { - authorization: 'Basic username:password' - }, - - clientConfig: { - // Useful if requests are large - maxReceivedFrameSize: 100000000, // bytes - default: 1MiB - maxReceivedMessageSize: 100000000, // bytes - default: 8MiB - - // Useful to keep a connection alive - keepalive: true, - keepaliveInterval: 60000 // ms - }, - - // Enable auto reconnection - reconnect: { - auto: true, - delay: 5000, // ms - maxAttempts: 5, - onTimeout: false - } - }; - - var ws = new Web3WsProvider('ws://localhost:8546', options); - - -More information for the Http and Websocket provider modules can be found here: - - - `HttpProvider `_ - - `WebsocketProvider `_ - ------------------------------------------------------------------------------- - -givenProvider -===================== - -.. code-block:: javascript - - web3.givenProvider - web3.eth.givenProvider - web3.shh.givenProvider - web3.bzz.givenProvider - ... - -When using web3.js in an Ethereum compatible browser, it will set with the current native provider by that browser. -Will return the given provider by the (browser) environment, otherwise ``null``. - - -------- -Returns -------- - -``Object``: The given provider set or ``null``; - -------- -Example -------- - -.. code-block:: javascript - web3.setProvider(web3.givenProvider || "ws://remotenode.com:8546"); - ------------------------------------------------------------------------------- - - -currentProvider -===================== - -.. code-block:: javascript - - web3.currentProvider - web3.eth.currentProvider - web3.shh.currentProvider - web3.bzz.currentProvider - ... - -Will return the current provider, otherwise ``null``. - - -------- -Returns -------- - -``Object``: The current provider set or ``null``. - -------- -Example -------- - -.. code-block:: javascript - if(!web3.currentProvider) { - web3.setProvider("http://localhost:8545"); - } - ------------------------------------------------------------------------------- - -BatchRequest -===================== - -.. code-block:: javascript - - new web3.BatchRequest() - new web3.eth.BatchRequest() - new web3.shh.BatchRequest() - new web3.bzz.BatchRequest() - -Class to create and execute batch requests. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Object``: With the following methods: - - - ``add(request)``: To add a request object to the batch call. - - ``execute()``: Will execute the batch request. - -------- -Example -------- - -.. code-block:: javascript - - var contract = new web3.eth.Contract(abi, address); - - var batch = new web3.BatchRequest(); - batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback)); - batch.add(contract.methods.balance(address).call.request({from: '0x0000000000000000000000000000000000000000'}, callback2)); - batch.execute(); - - ------------------------------------------------------------------------------- - -extend -===================== - -.. code-block:: javascript - - web3.extend(methods) - web3.eth.extend(methods) - web3.shh.extend(methods) - web3.bzz.extend(methods) - ... - -Allows extending the web3 modules. - -.. note:: You also have ``*.extend.formatters`` as additional formatter functions to be used for input and output formatting. Please see the `source file `_ for function details. - ----------- -Parameters ----------- - -1. ``methods`` - ``Object``: Extension object with array of methods description objects as follows: - - ``property`` - ``String``: (optional) The name of the property to add to the module. If no property is set it will be added to the module directly. - - ``methods`` - ``Array``: The array of method descriptions: - - ``name`` - ``String``: Name of the method to add. - - ``call`` - ``String``: The RPC method name. - - ``params`` - ``Number``: (optional) The number of parameters for that function. Default 0. - - ``inputFormatter`` - ``Array``: (optional) Array of inputformatter functions. Each array item responds to a function parameter, so if you want some parameters not to be formatted, add a ``null`` instead. - - ``outputFormatter - ``Function``: (optional) Can be used to format the output of the method. - - ----------- -Returns ----------- - -``Object``: The extended module. - -------- -Example -------- - -.. code-block:: javascript - - web3.extend({ - property: 'myModule', - methods: [{ - name: 'getBalance', - call: 'eth_getBalance', - params: 2, - inputFormatter: [web3.extend.formatters.inputAddressFormatter, web3.extend.formatters.inputDefaultBlockNumberFormatter], - outputFormatter: web3.utils.hexToNumberString - },{ - name: 'getGasPriceSuperFunction', - call: 'eth_gasPriceSuper', - params: 2, - inputFormatter: [null, web3.utils.numberToHex] - }] - }); - - web3.extend({ - methods: [{ - name: 'directCall', - call: 'eth_callForFun', - }] - }); - - console.log(web3); - > Web3 { - myModule: { - getBalance: function(){}, - getGasPriceSuperFunction: function(){} - }, - directCall: function(){}, - eth: Eth {...}, - bzz: Bzz {...}, - ... - } - - ------------------------------------------------------------------------------- diff --git a/docs/include_package-net.rst b/docs/include_package-net.rst deleted file mode 100644 index 3b0b0bc4ea8..00000000000 --- a/docs/include_package-net.rst +++ /dev/null @@ -1,106 +0,0 @@ - -.. _net-getid: - -getId -========= - -.. code-block:: javascript - - web3.eth.net.getId([callback]) - web3.bzz.net.getId([callback]) - web3.shh.net.getId([callback]) - -Gets the current network ID. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Promise`` returns ``Number``: The network ID. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.net.getId() - .then(console.log); - > 1 - ------------------------------------------------------------------------------- - - -isListening -========= - -.. code-block:: javascript - - web3.eth.net.isListening([callback]) - web3.bzz.net.isListening([callback]) - web3.shh.net.isListening([callback]) - -Checks if the node is listening for peers. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Promise`` returns ``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.net.isListening() - .then(console.log); - > true - ------------------------------------------------------------------------------- - -getPeerCount -========= - -.. code-block:: javascript - - web3.eth.net.getPeerCount([callback]) - web3.bzz.net.getPeerCount([callback]) - web3.shh.net.getPeerCount([callback]) - -Get the number of peers connected to. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Promise`` returns ``Number`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.net.getPeerCount() - .then(console.log); - > 25 diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index b1f3bbff733..00000000000 --- a/docs/index.rst +++ /dev/null @@ -1,43 +0,0 @@ - -================================= -web3.js - Ethereum JavaScript API -================================= - -web3.js is a collection of libraries that allow you to interact with a local or remote ethereum node using HTTP, IPC or WebSocket. - -The following documentation will guide you through :ref:`installing and running web3.js ` as well as providing an :ref:`API reference documentation <#id1>` with examples. - -Contents: - -:ref:`Keyword Index `, :ref:`Search Page ` - -.. toctree:: - :maxdepth: 2 - :caption: User Documentation - - getting-started - callbacks-promises-events - glossary - - -.. toctree:: - :maxdepth: 2 - :caption: API Reference - - web3 - web3-eth - web3-eth-subscribe - web3-eth-contract - web3-eth-accounts - web3-eth-personal - web3-eth-ens - web3-eth-iban - web3-eth-abi - web3-net - web3-bzz - web3-shh - web3-utils - web3-admin - - -Special thanks to `Netlify `_ for providing build and deploy services for our end-to-end integration tests. \ No newline at end of file diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 71cb5fa18ad..00000000000 --- a/docs/make.bat +++ /dev/null @@ -1,281 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. epub3 to make an epub3 - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - echo. dummy to check syntax errors of document sources - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 1>NUL 2>NUL -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\web3js.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\web3js.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "epub3" ( - %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -if "%1" == "dummy" ( - %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. Dummy builder generates no files. - goto end -) - -:end diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000000..4df7ece9893 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,47 @@ +{ + "name": "web3-docs", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc" + }, + "dependencies": { + "@docusaurus/core": "^3.0.1", + "@docusaurus/preset-classic": "^3.0.1", + "@docusaurus/theme-live-codeblock": "^3.0.1", + "@mdx-js/react": "^3.0.0", + "classnames": "^2.3.2", + "clsx": "^2.0.0", + "docusaurus-lunr-search": "^3.3.1", + "prism-react-renderer": "^2.3.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.0.0", + "@tsconfig/docusaurus": "^2.0.2", + "docusaurus-plugin-typedoc-api": "^4.0.1", + "typescript": "^4.6.4" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/docs/sidebars.js b/docs/sidebars.js new file mode 100644 index 00000000000..bc4f089bf8f --- /dev/null +++ b/docs/sidebars.js @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + guidesSidebar: [{ type: 'autogenerated', dirName: 'guides' }], + docSidebar: [{ type: 'autogenerated', dirName: 'libdocs' }], + glossarySidebar: [{ type: 'autogenerated', dirName: 'glossary' }], + apiSidebar: [ + { + type: 'autogenerated', + dirName: 'api', // 'api' is the 'out' directory + }, + ], +}; + +module.exports = sidebars; diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css new file mode 100644 index 00000000000..0edea9cdddc --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,72 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #F16822; + --ifm-color-primary-dark: #ab5124; + --ifm-color-primary-darker: #914723; + --ifm-color-primary-darkest: #9b4921; + --ifm-color-primary-light: #e78e61; + --ifm-color-primary-lighter: #e5956d; + --ifm-color-primary-lightest: #e99c76; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #e66626; + --ifm-color-primary-dark: #dc5e1f; + --ifm-color-primary-darker: #db5f21; + --ifm-color-primary-darkest: #d55b1e; + --ifm-color-primary-light: #ef6b29; + --ifm-color-primary-lighter: #ee7438; + --ifm-color-primary-lightest: #f1773a; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} + +li[role="tab"] { + border-radius: 0px; + border-top-right-radius: 10px; + border-top-left-radius: 10px; +} + +:root { + --javascript-official-color-black: #323330; + --javascript-official-color-yellow: #f7df1e; + --typescript-official-color-blue: #007acc; + --typescript-official-color-white: #ffffff; +} +.javascript-tab { + color: var(--javascript-official-color-black); +} + +.javascript-tab:hover { + border-bottom-color: var(--javascript-official-color-black); +} + +.javascript-tab[aria-selected='true'] { + color: var(--javascript-official-color-black); + background-color: var(--javascript-official-color-yellow); +} + +.typescript-tab { + color: var(--typescript-official-color-blue); +} + +.typescript-tab:hover { + border-bottom-color: var(--typescript-official-color-blue); +} + +.typescript-tab[aria-selected='true'] { + color: var(--typescript-official-color-white); + background-color: var(--typescript-official-color-blue); +} + +.tabs-container .margin-top--md { + margin-top: 0px !important; +} \ No newline at end of file diff --git a/docs/static/.nojekyll b/docs/static/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/static/img/docusaurus.png b/docs/static/img/docusaurus.png new file mode 100644 index 00000000000..f458149e3c8 Binary files /dev/null and b/docs/static/img/docusaurus.png differ diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico new file mode 100644 index 00000000000..eebd0cf4872 Binary files /dev/null and b/docs/static/img/favicon.ico differ diff --git a/docs/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 00000000000..af961c49a88 --- /dev/null +++ b/docs/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg new file mode 100644 index 00000000000..94b5cf08f88 --- /dev/null +++ b/docs/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 00000000000..d9161d33920 --- /dev/null +++ b/docs/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/web3js.svg b/docs/static/img/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/docs/static/img/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/docs/tsconfig.docs.json b/docs/tsconfig.docs.json new file mode 100644 index 00000000000..b11eca77af2 --- /dev/null +++ b/docs/tsconfig.docs.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "declarationDir": "dts", + "outDir": "dts", + "declaration": true, + "declarationMap": true + }, + "include": ["../packages/*/src/**/*", "../packages/*/types/**/*"] +} diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 00000000000..3d0923875f2 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,7 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@tsconfig/docusaurus/tsconfig.json", + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/docs/web3-bzz.rst b/docs/web3-bzz.rst deleted file mode 100644 index fdefefeb07f..00000000000 --- a/docs/web3-bzz.rst +++ /dev/null @@ -1,309 +0,0 @@ -.. _bzz: - -======== -web3.bzz -======== - -.. note:: This API might change over time. - - -The ``web3-bzz`` package allows you to interact with swarm, the decentralized file store. -For more see the `Swarm Docs `_. - - -.. code-block:: javascript - - var Bzz = require('web3-bzz'); - - // will autodetect if the "ethereum" object is present and will either connect to the local swarm node, or the swarm-gateways.net. - // Optional you can give your own provider URL; If no provider URL is given it will use "http://swarm-gateways.net" - var bzz = new Bzz(Bzz.givenProvider || 'http://swarm-gateways.net'); - - - // or using the web3 umbrella package - - var Web3 = require('web3'); - var web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); - - // -> web3.bzz.currentProvider // if Web3.givenProvider was an ethereum provider it will set: "http://localhost:8500" otherwise it will set: "http://swarm-gateways.net" - - // set the provider manually if necessary - web3.bzz.setProvider("http://localhost:8500"); - - ------------------------------------------------------------------------------- - - -setProvider -===================== - -.. code-block:: javascript - - web3.bzz.setProvider(myProvider) - -Will change the provider for its module. - -.. note:: When called on the umbrella package ``web3`` it will also set the provider for all sub modules ``web3.eth``, ``web3.shh``, etc. EXCEPT ``web3.bzz`` which needs a separate provider at all times. - ----------- -Parameters ----------- - -1. ``Object`` - ``myProvider``: :ref:`a valid provider `. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - var Bzz = require('web3-bzz'); - var bzz = new Bzz('http://localhost:8500'); - - // change provider - bzz.setProvider('http://swarm-gateways.net'); - - ------------------------------------------------------------------------------- - -givenProvider -===================== - -.. code-block:: javascript - - web3.bzz.givenProvider - -When using web3.js in an Ethereum compatible browser, it will set with the current native provider by that browser. -Returns the given provider by the (browser) environment, otherwise ``null``. - - -------- -Returns -------- - -``Object``: The given provider set or ``null``; - -------- -Example -------- - -.. code-block:: javascript - - bzz.givenProvider; - > { - send: function(), - on: function(), - bzz: "http://localhost:8500", - shh: true, - ... - } - - bzz.setProvider(bzz.givenProvider || "http://swarm-gateways.net"); - - ------------------------------------------------------------------------------- - - -currentProvider -===================== - -.. code-block:: javascript - - bzz.currentProvider - -Returns the current provider URL, otherwise ``null``. - - -------- -Returns -------- - -``Object``: The current provider URL or ``null``. - -------- -Example -------- - -.. code-block:: javascript - - bzz.currentProvider; - > "http://localhost:8500" - - - if(!bzz.currentProvider) { - bzz.setProvider("http://swarm-gateways.net"); - } - - ------------------------------------------------------------------------------- - - -upload -===================== - -.. code-block:: javascript - - web3.bzz.upload(mixed) - -Uploads files, folders or raw data to swarm. - ----------- -Parameters ----------- - -1. ``mixed`` - ``String|Buffer|Uint8Array|Object``: The data to upload, can be a file content, file Buffer/Uint8Array, multiple files, or a directory or file (only in node.js). The following types are allowed: - - ``String|Buffer|Uint8Array``: A file content, file Uint8Array or Buffer to upload, or: - - ``Object``: - 1. Multiple key values for files and directories. The paths will be kept the same: - - key must be the files path, or name, e.g. ``"/foo.txt"`` and its value is an object with: - - ``type``: The mime-type of the file, e.g. ``"text/html"``. - - ``data``: A file content, file Uint8Array or Buffer to upload. - 2. Upload a file or a directory from disk in Node.js. Requires and object with the following properties: - - ``path``: The path to the file or directory. - - ``kind``: The type of the source ``"directory"``, ``"file"`` or ``"data"``. - - ``defaultFile`` (optional): Path of the "defaultFile" when ``"kind": "directory"``, e.g. ``"/index.html"``. - 3. Upload file or folder in the browser. Requres and object with the following properties: - - ``pick``: The file picker to launch. Can be ``"file"``, ``"directory"`` or ``"data"``. - - -------- -Returns -------- - -``Promise`` returning ``String``: Returns the content hash of the manifest. - - -------- -Example -------- - -.. code-block:: javascript - - var bzz = web3.bzz; - - // raw data - bzz.upload("test file").then(function(hash) { - console.log("Uploaded file. Address:", hash); - }) - - // raw directory - var dir = { - "/foo.txt": {type: "text/plain", data: "sample file"}, - "/bar.txt": {type: "text/plain", data: "another file"} - }; - bzz.upload(dir).then(function(hash) { - console.log("Uploaded directory. Address:", hash); - }); - - // upload from disk in node.js - bzz.upload({ - path: "/path/to/thing", // path to data / file / directory - kind: "directory", // could also be "file" or "data" - defaultFile: "/index.html" // optional, and only for kind === "directory" - }) - .then(console.log) - .catch(console.log); - - // upload from disk in the browser - bzz.upload({pick: "file"}) // could also be "directory" or "data" - .then(console.log); - ------------------------------------------------------------------------------- - -download -===================== - -.. code-block:: javascript - - web3.bzz.download(bzzHash [, localpath]) - -Downloads files and folders from swarm as buffer or to disk (only node.js). - ----------- -Parameters ----------- - -1. ``bzzHash`` - ``String``: The file or directory to download. If the hash is a raw file it will return a Buffer, if a manifest file, it will return the directory structure. If the ``localpath`` is given, it will return that path where it downloaded the files to. -2. ``localpath`` - ``String``: The local folder to download the content into. (only node.js) - -------- -Returns -------- - -``Promise`` returning ``Buffer|Object|String``: The Buffer of the file downloaded, an object with the directory structure, or the path where it was downloaded to. - - -------- -Example -------- - -.. code-block:: javascript - - var bzz = web3.bzz; - - // download raw file - var fileHash = "a5c10851ef054c268a2438f10a21f6efe3dc3dcdcc2ea0e6a1a7a38bf8c91e23"; - bzz.download(fileHash).then(function(buffer) { - console.log("Downloaded file:", buffer.toString()); - }); - - // download directory, if the hash is manifest file. - var dirHash = "7e980476df218c05ecfcb0a2ca73597193a34c5a9d6da84d54e295ecd8e0c641"; - bzz.download(dirHash).then(function(dir) { - console.log("Downloaded directory:"); - > { - 'bar.txt': { type: 'text/plain', data: }, - 'foo.txt': { type: 'text/plain', data: } - } - }); - - // download file/directory to disk (only node.js) - var dirHash = "a5c10851ef054c268a2438f10a21f6efe3dc3dcdcc2ea0e6a1a7a38bf8c91e23"; - bzz.download(dirHash, "/target/dir") - .then(path => console.log(`Downloaded directory to ${path}.`)) - .catch(console.log); - - ------------------------------------------------------------------------------- - - -pick -===================== - -.. code-block:: javascript - - web3.bzz.pick.file() - web3.bzz.pick.directory() - web3.bzz.pick.data() - -Opens a file picker in the browser to select file(s), directory or data. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Promise`` returning ``Object``: Returns the file or multiple files. - -------- -Example -------- - -.. code-block:: javascript - - web3.bzz.pick.file() - .then(console.log); - > { - ... - } diff --git a/docs/web3-eth-abi.rst b/docs/web3-eth-abi.rst deleted file mode 100644 index c36e2995d52..00000000000 --- a/docs/web3-eth-abi.rst +++ /dev/null @@ -1,510 +0,0 @@ -.. _eth-abi: - -========= -web3.eth.abi -========= - -The ``web3.eth.abi`` functions let you encode and decode parameters to ABI (Application Binary Interface) for function calls to the EVM (Ethereum Virtual Machine). - - ------------------------------------------------------------------------------- - - -encodeFunctionSignature -===================== - -.. code-block:: javascript - - web3.eth.abi.encodeFunctionSignature(functionName); - -Encodes the function name to its ABI signature, which are the first 4 bytes of the sha3 hash of the function name including types. - ----------- -Parameters ----------- - -1. ``functionName`` - ``String|Object``: The function name to encode. -or the :ref:`JSON interface ` object of the function. If string it has to be in the form ``function(type,type,...)``, e.g: ``myFunction(uint256,uint32[],bytes10,bytes)`` - -------- -Returns -------- - -``String`` - The ABI signature of the function. - -------- -Example -------- - -.. code-block:: javascript - - // From a JSON interface object - web3.eth.abi.encodeFunctionSignature({ - name: 'myMethod', - type: 'function', - inputs: [{ - type: 'uint256', - name: 'myNumber' - },{ - type: 'string', - name: 'myString' - }] - }) - > 0x24ee0097 - - // Or string - web3.eth.abi.encodeFunctionSignature('myMethod(uint256,string)') - > '0x24ee0097' - - ------------------------------------------------------------------------------- - -encodeEventSignature -===================== - -.. code-block:: javascript - - web3.eth.abi.encodeEventSignature(eventName); - -Encodes the event name to its ABI signature, which are the sha3 hash of the event name including input types. - ----------- -Parameters ----------- - -1. ``eventName`` - ``String|Object``: The event name to encode. -or the :ref:`JSON interface ` object of the event. If string it has to be in the form ``event(type,type,...)``, e.g: ``myEvent(uint256,uint32[],bytes10,bytes)`` - -------- -Returns -------- - -``String`` - The ABI signature of the event. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.abi.encodeEventSignature('myEvent(uint256,bytes32)') - > 0xf2eeb729e636a8cb783be044acf6b7b1e2c5863735b60d6daae84c366ee87d97 - - // or from a json interface object - web3.eth.abi.encodeEventSignature({ - name: 'myEvent', - type: 'event', - inputs: [{ - type: 'uint256', - name: 'myNumber' - },{ - type: 'bytes32', - name: 'myBytes' - }] - }) - > 0xf2eeb729e636a8cb783be044acf6b7b1e2c5863735b60d6daae84c366ee87d97 - - ------------------------------------------------------------------------------- - -encodeParameter -===================== - -.. code-block:: javascript - - web3.eth.abi.encodeParameter(type, parameter); - -Encodes a parameter based on its type to its ABI representation. - ----------- -Parameters ----------- - -1. ``type`` - ``String|Object``: The type of the parameter, see the `solidity documentation `_ for a list of types. -2. ``parameter`` - ``Mixed``: The actual parameter to encode. - -------- -Returns -------- - -``String`` - The ABI encoded parameter. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.abi.encodeParameter('uint256', '2345675643'); - > "0x000000000000000000000000000000000000000000000000000000008bd02b7b" - - web3.eth.abi.encodeParameter('uint256', '2345675643'); - > "0x000000000000000000000000000000000000000000000000000000008bd02b7b" - - web3.eth.abi.encodeParameter('bytes32', '0xdf3234'); - > "0xdf32340000000000000000000000000000000000000000000000000000000000" - - web3.eth.abi.encodeParameter('bytes', '0xdf3234'); - > "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003df32340000000000000000000000000000000000000000000000000000000000" - - web3.eth.abi.encodeParameter('bytes32[]', ['0xdf3234', '0xfdfd']); - > "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000" - - web3.eth.abi.encodeParameter( - { - "ParentStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256', - "childStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256' - } - } - }, - { - "propertyOne": 42, - "propertyTwo": 56, - "childStruct": { - "propertyOne": 45, - "propertyTwo": 78 - } - } - ); - > "0x000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e" ------------------------------------------------------------------------------- - -encodeParameters -===================== - -.. code-block:: javascript - - web3.eth.abi.encodeParameters(typesArray, parameters); - -Encodes a function parameters based on its :ref:`JSON interface ` object. - ----------- -Parameters ----------- - -1. ``typesArray`` - ``Array|Object``: An array with types or a :ref:`JSON interface ` of a function. See the `solidity documentation `_ for a list of types. -2. ``parameters`` - ``Array``: The parameters to encode. - -------- -Returns -------- - -``String`` - The ABI encoded parameters. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.abi.encodeParameters(['uint256','string'], ['2345675643', 'Hello!%']); - > "0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000" - - web3.eth.abi.encodeParameters(['uint8[]','bytes32'], [['34','434'], '0x324567fff']); - > "0x0 - - web3.eth.abi.encodeParameters( - [ - 'uint8[]', - { - "ParentStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256', - "ChildStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256' - } - } - } - ], - [ - ['34','434'], - { - "propertyOne": '42', - "propertyTwo": '56', - "ChildStruct": { - "propertyOne": '45', - "propertyTwo": '78' - } - } - ] - ); - > "0x00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000018" - ------------------------------------------------------------------------------- - -encodeFunctionCall -===================== - -.. code-block:: javascript - - web3.eth.abi.encodeFunctionCall(jsonInterface, parameters); - -Encodes a function call using its :ref:`JSON interface ` object and given parameters. - ----------- -Parameters ----------- - -1. ``jsonInterface`` - ``Object``: The :ref:`JSON interface ` object of a function. -2. ``parameters`` - ``Array``: The parameters to encode. - -------- -Returns -------- - -``String`` - The ABI encoded function call. Means function signature + parameters. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.abi.encodeFunctionCall({ - name: 'myMethod', - type: 'function', - inputs: [{ - type: 'uint256', - name: 'myNumber' - },{ - type: 'string', - name: 'myString' - }] - }, ['2345675643', 'Hello!%']); - > "0x24ee0097000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000" - ------------------------------------------------------------------------------- - -decodeParameter -===================== - -.. code-block:: javascript - - web3.eth.abi.decodeParameter(type, hexString); - -Decodes an ABI encoded parameter to its JavaScript type. - ----------- -Parameters ----------- - -1. ``type`` - ``String|Object``: The type of the parameter, see the `solidity documentation `_ for a list of types. -2. ``hexString`` - ``String``: The ABI byte code to decode. - -------- -Returns -------- - -``Mixed`` - The decoded parameter. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.abi.decodeParameter('uint256', '0x0000000000000000000000000000000000000000000000000000000000000010'); - > "16" - - web3.eth.abi.decodeParameter('string', '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'); - > "Hello!%!" - - web3.eth.abi.decodeParameter('string', '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'); - > "Hello!%!" - - web3.eth.abi.decodeParameter( - { - "ParentStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256', - "childStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256' - } - } - }, - - , '0x000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e'); - > { - '0': { - '0': '42', - '1': '56', - '2': { - '0': '45', - '1': '78', - 'propertyOne': '45', - 'propertyTwo': '78' - }, - 'childStruct': { - '0': '45', - '1': '78', - 'propertyOne': '45', - 'propertyTwo': '78' - }, - 'propertyOne': '42', - 'propertyTwo': '56' - }, - 'ParentStruct': { - '0': '42', - '1': '56', - '2': { - '0': '45', - '1': '78', - 'propertyOne': '45', - 'propertyTwo': '78' - }, - 'childStruct': { - '0': '45', - '1': '78', - 'propertyOne': '45', - 'propertyTwo': '78' - }, - 'propertyOne': '42', - 'propertyTwo': '56' - } - } - ------------------------------------------------------------------------------- - -decodeParameters -===================== - -.. code-block:: javascript - - web3.eth.abi.decodeParameters(typesArray, hexString); - -Decodes ABI encoded parameters to its JavaScript types. - ----------- -Parameters ----------- - -1. ``typesArray`` - ``Array|Object``: An array with types or a :ref:`JSON interface ` outputs array. See the `solidity documentation `_ for a list of types. -2. ``hexString`` - ``String``: The ABI byte code to decode. - -------- -Returns -------- - -``Object`` - The result object containing the decoded parameters. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.abi.decodeParameters(['string', 'uint256'], '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'); - > Result { '0': 'Hello!%!', '1': '234' } - - web3.eth.abi.decodeParameters([{ - type: 'string', - name: 'myString' - },{ - type: 'uint256', - name: 'myNumber' - }], '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'); - > Result { - '0': 'Hello!%!', - '1': '234', - myString: 'Hello!%!', - myNumber: '234' - } - - web3.eth.abi.decodeParameters([ - 'uint8[]', - { - "ParentStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256', - "childStruct": { - "propertyOne": 'uint256', - "propertyTwo": 'uint256' - } - } - } - ], '0x00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000018'); - > Result { - '0': ['42', '24'], - '1': { - '0': '42', - '1': '56', - '2': - { - '0': '45', - '1': '78', - 'propertyOne': '45', - 'propertyTwo': '78' - }, - 'childStruct': - { - '0': '45', - '1': '78', - 'propertyOne': '45', - 'propertyTwo': '78' - }, - 'propertyOne': '42', - 'propertyTwo': '56' - } - } - ------------------------------------------------------------------------------- - - -decodeLog -===================== - -.. code-block:: javascript - - web3.eth.abi.decodeLog(inputs, hexString, topics); - -Decodes ABI-encoded log data and indexed topic data. - ----------- -Parameters ----------- - -1. ``inputs`` - ``Object``: A :ref:`JSON interface ` inputs array. See the `solidity documentation `_ for a list of types. -2. ``hexString`` - ``String``: The ABI byte code in the ``data`` field of a log. -3. ``topics`` - ``Array``: An array with the index parameter topics of the log, without the topic[0] if its a non-anonymous event, otherwise with topic[0]. - -------- -Returns -------- - -``Object`` - The result object containing the decoded parameters. - -------- -Example -------- - -.. code-block:: javascript - - - web3.eth.abi.decodeLog([{ - type: 'string', - name: 'myString' - },{ - type: 'uint256', - name: 'myNumber', - indexed: true - },{ - type: 'uint8', - name: 'mySmallNumber', - indexed: true - }], - '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000', - ['0x000000000000000000000000000000000000000000000000000000000000f310', '0x0000000000000000000000000000000000000000000000000000000000000010']); - > Result { - '0': 'Hello%!', - '1': '62224', - '2': '16', - myString: 'Hello%!', - myNumber: '62224', - mySmallNumber: '16' - } diff --git a/docs/web3-eth-accounts.rst b/docs/web3-eth-accounts.rst deleted file mode 100644 index 3cd2f111aae..00000000000 --- a/docs/web3-eth-accounts.rst +++ /dev/null @@ -1,971 +0,0 @@ -.. _eth-accounts: - -========= -web3.eth.accounts -========= - -The ``web3.eth.accounts`` contains functions to generate Ethereum accounts and sign transactions and data. - -.. note:: This package has NOT been audited and might potentially be unsafe. Take precautions to clear memory properly, store the private keys safely, and test transaction receiving and sending functionality properly before using in production! - -To use this package standalone use: - - -.. code-block:: javascript - - var Accounts = require('web3-eth-accounts'); - - // Passing in the eth or web3 package is necessary to allow retrieving chainId, gasPrice and nonce automatically - // for accounts.signTransaction(). - var accounts = new Accounts('ws://localhost:8546'); - - - ------------------------------------------------------------------------------- - -.. _accounts-create: - -create -===================== - -.. code-block:: javascript - - web3.eth.accounts.create([entropy]); - -Generates an account object with private key and public key. - ----------- -Parameters ----------- - -1. ``entropy`` - ``String`` (optional): A random string to increase entropy. If given it should be at least 32 characters. If none is given a random string will be generated using :ref:`randomhex `. - -.. _eth-accounts-create-return: - -------- -Returns -------- - -``Object`` - The account object with the following structure: - - - ``address`` - ``string``: The account address. - - ``privateKey`` - ``string``: The accounts private key. This should never be shared or stored unencrypted in localstorage! Also make sure to ``null`` the memory after usage. - - ``signTransaction(tx [, callback])`` - ``Function``: The function to sign transactions. See :ref:`web3.eth.accounts.signTransaction() ` for more. - - ``sign(data)`` - ``Function``: The function to sign transactions. See :ref:`web3.eth.accounts.sign() ` for more. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.create(); - > { - address: "0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01", - privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709", - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} - } - - web3.eth.accounts.create('2435@#@#@±±±±!!!!678543213456764321§34567543213456785432134567'); - > { - address: "0xF2CD2AA0c7926743B1D4310b2BC984a0a453c3d4", - privateKey: "0xd7325de5c2c1cf0009fac77d3d04a9c004b038883446b065871bc3e831dcd098", - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} - } - - web3.eth.accounts.create(web3.utils.randomHex(32)); - > { - address: "0xe78150FaCD36E8EB00291e251424a0515AA1FF05", - privateKey: "0xcc505ee6067fba3f6fc2050643379e190e087aeffe5d958ab9f2f3ed3800fa4e", - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} - } - ------------------------------------------------------------------------------- - - -privateKeyToAccount -===================== - -.. code-block:: javascript - - web3.eth.accounts.privateKeyToAccount(privateKey [, ignoreLength ]); - -Creates an account object from a private key. - -For more advanced hierarchial address derivation, see -[truffle-hd-wallet-provider](https://github.com/trufflesuite/truffle/tree/develop/packages/hdwallet-provider) -package. - ----------- -Parameters ----------- - -1. ``privateKey`` - ``String``: The private key to import. This is 32 bytes of random data. -If you are supplying a hexadecimal number, it must have `0x` prefix in order to be in line -with other Ethereum libraries. -2. ``ignoreLength`` - ``Boolean``: If set to true does the ``privateKey`` length not get validated. - -------- -Returns -------- - -``Object`` - The account object with the :ref:`structure seen here `. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.privateKeyToAccount('0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709'); - > { - address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01', - privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} - } - ------------------------------------------------------------------------------- - -.. _eth-accounts-signtransaction: - -signTransaction -===================== - -.. code-block:: javascript - - web3.eth.accounts.signTransaction(tx, privateKey [, callback]); - -Signs an Ethereum transaction with a given private key. - ----------- -Parameters ----------- - -1. ``tx`` - ``Object``: The transaction object as follows: - - ``nonce`` - ``String``: (optional) The nonce to use when signing this transaction. Default will use :ref:`web3.eth.getTransactionCount() `. - - ``chainId`` - ``String``: (optional) The chain id to use when signing this transaction. Default will use :ref:`web3.eth.net.getId() `. - - ``to`` - ``String``: (optional) The recevier of the transaction, can be empty when deploying a contract. - - ``data`` - ``String``: (optional) The call data of the transaction, can be empty for simple value transfers. - - ``value`` - ``String``: (optional) The value of the transaction in wei. - - ``gasPrice`` - ``String``: (optional) The gas price set by this transaction, if empty, it will use :ref:`web3.eth.getGasPrice() ` - - ``gas`` - ``String``: The gas provided by the transaction. - - ``chain`` - ``String``: (optional) Defaults to ``mainnet``. - - ``hardfork`` - ``String``: (optional) Defaults to ``petersburg``. - - ``common`` - ``Object``: (optional) The common object - - ``customChain`` - ``Object``: The custom chain properties - - ``name`` - ``string``: (optional) The name of the chain - - ``networkId`` - ``number``: Network ID of the custom chain - - ``chainId`` - ``number``: Chain ID of the custom chain - - ``baseChain`` - ``string``: (optional) ``mainnet``, ``goerli``, ``kovan``, ``rinkeby``, or ``ropsten`` - - ``hardfork`` - ``string``: (optional) ``chainstart``, ``homestead``, ``dao``, ``tangerineWhistle``, ``spuriousDragon``, ``byzantium``, ``constantinople``, ``petersburg``, or ``istanbul`` -2. ``privateKey`` - ``String``: The private key to sign with. -3. ``callback`` - ``Function``: (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - -``Promise`` returning ``Object``: The signed data RLP encoded transaction, or if ``returnSignature`` is ``true`` the signature values as follows: - - ``messageHash`` - ``String``: The hash of the given message. - - ``r`` - ``String``: First 32 bytes of the signature - - ``s`` - ``String``: Next 32 bytes of the signature - - ``v`` - ``String``: Recovery value + 27 - - ``rawTransaction`` - ``String``: The RLP encoded transaction, ready to be send using :ref:`web3.eth.sendSignedTransaction `. - - ``transactionHash`` - ``String``: The transaction hash for the RLP encoded transaction. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.signTransaction({ - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - value: '1000000000', - gas: 2000000 - }, '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318') - .then(console.log); - > { - messageHash: '0x31c2f03766b36f0346a850e78d4f7db2d9f4d7d54d5f272a750ba44271e370b1', - v: '0x25', - r: '0xc9cf86333bcb065d140032ecaab5d9281bde80f21b9687b3e94161de42d51895', - s: '0x727a108a0b8d101465414033c3f705a9c7b826e596766046ee1183dbc8aeaa68', - rawTransaction: '0xf869808504e3b29200831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a0c9cf86333bcb065d140032ecaab5d9281bde80f21b9687b3e94161de42d51895a0727a108a0b8d101465414033c3f705a9c7b826e596766046ee1183dbc8aeaa68' - transactionHash: '0xde8db924885b0803d2edc335f745b2b8750c8848744905684c20b987443a9593' - } - - web3.eth.accounts.signTransaction({ - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - value: '1000000000', - gas: 2000000, - gasPrice: '234567897654321', - nonce: 0, - chainId: 1 - }, '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318') - .then(console.log); - > { - messageHash: '0x6893a6ee8df79b0f5d64a180cd1ef35d030f3e296a5361cf04d02ce720d32ec5', - r: '0x9ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9c', - s: '0x440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428', - v: '0x25', - rawTransaction: '0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428' - transactionHash: '0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60' - } - - // or with a common - web3.eth.accounts.signTransaction({ - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - value: '1000000000', - gas: 2000000 - common: { - baseChain: 'mainnet', - hardfork: 'petersburg', - customChain: { - name: 'custom-chain', - chainId: 1, - networkId: 1 - } - } - }, '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318') - .then(console.log); - - - - ------------------------------------------------------------------------------- - - -recoverTransaction -===================== - -.. code-block:: javascript - - web3.eth.accounts.recoverTransaction(rawTransaction); - -Recovers the Ethereum address which was used to sign the given RLP encoded transaction. - ----------- -Parameters ----------- - -1. ``signature`` - ``String``: The RLP encoded transaction. - - -------- -Returns -------- - -``String``: The Ethereum address used to sign this transaction. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.recoverTransaction('0xf86180808401ef364594f0109fc8df283027b6285cc889f5aa624eac1f5580801ca031573280d608f75137e33fc14655f097867d691d5c4c44ebe5ae186070ac3d5ea0524410802cdc025034daefcdfa08e7d2ee3f0b9d9ae184b2001fe0aff07603d9'); - > "0xF0109fC8DF283027b6285cc889F5aA624EaC1F55" - - - ------------------------------------------------------------------------------- - -hashMessage -===================== - -.. code-block:: javascript - - web3.eth.accounts.hashMessage(message); - -Hashes the given message to be passed :ref:`web3.eth.accounts.recover() ` function. The data will be UTF-8 HEX decoded and enveloped as follows: ``"\x19Ethereum Signed Message:\n" + message.length + message`` and hashed using keccak256. - ----------- -Parameters ----------- - -1. ``message`` - ``String``: A message to hash, if its HEX it will be UTF8 decoded before. - - -------- -Returns -------- - -``String``: The hashed message - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.hashMessage("Hello World") - > "0xa1de988600a42c4b4ab089b619297c17d53cffae5d5120d82d8a92d0bb3b78f2" - - // the below results in the same hash - web3.eth.accounts.hashMessage(web3.utils.utf8ToHex("Hello World")) - > "0xa1de988600a42c4b4ab089b619297c17d53cffae5d5120d82d8a92d0bb3b78f2" - - - ------------------------------------------------------------------------------- - -.. _eth-accounts-sign: - -sign -===================== - -.. code-block:: javascript - - web3.eth.accounts.sign(data, privateKey); - -Signs arbitrary data. - ----------- -Parameters ----------- - -1. ``data`` - ``String``: The data to sign. -2. ``privateKey`` - ``String``: The private key to sign with. - -.. note:: The value passed as the `data` parameter will be UTF-8 HEX decoded and wrapped as follows: ``"\x19Ethereum Signed Message:\n" + message.length + message``. - -------- -Returns -------- - -``Object``: The signature object - - ``message`` - ``String``: The the given message. - - ``messageHash`` - ``String``: The hash of the given message. - - ``r`` - ``String``: First 32 bytes of the signature - - ``s`` - ``String``: Next 32 bytes of the signature - - ``v`` - ``String``: Recovery value + 27 - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.sign('Some data', '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318'); - > { - message: 'Some data', - messageHash: '0x1da44b586eb0729ff70a73c326926f6ed5a25f5b056e7f47fbc6e58d86871655', - v: '0x1c', - r: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd', - s: '0x6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a029', - signature: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c' - } - - - ------------------------------------------------------------------------------- - -.. _accounts-recover: - -recover -===================== - -.. code-block:: javascript - - web3.eth.accounts.recover(signatureObject); - web3.eth.accounts.recover(message, signature [, preFixed]); - web3.eth.accounts.recover(message, v, r, s [, preFixed]); - -Recovers the Ethereum address which was used to sign the given data. - ----------- -Parameters ----------- - -1. ``message|signatureObject`` - ``String|Object``: Either signed message or hash, or the signature object as following values: - - ``messageHash`` - ``String``: The hash of the given message already prefixed with ``"\x19Ethereum Signed Message:\n" + message.length + message``. - - ``r`` - ``String``: First 32 bytes of the signature - - ``s`` - ``String``: Next 32 bytes of the signature - - ``v`` - ``String``: Recovery value + 27 -2. ``signature`` - ``String``: The raw RLP encoded signature, OR parameter 2-4 as v, r, s values. -3. ``preFixed`` - ``Boolean`` (optional, default: ``false``): If the last parameter is ``true``, the given message will NOT automatically be prefixed with ``"\x19Ethereum Signed Message:\n" + message.length + message``, and assumed to be already prefixed. - - -------- -Returns -------- - -``String``: The Ethereum address used to sign this data. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.recover({ - messageHash: '0x1da44b586eb0729ff70a73c326926f6ed5a25f5b056e7f47fbc6e58d86871655', - v: '0x1c', - r: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd', - s: '0x6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a029' - }) - > "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23" - - // message, signature - web3.eth.accounts.recover('Some data', '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c'); - > "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23" - - // message, v, r, s - web3.eth.accounts.recover('Some data', '0x1c', '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd', '0x6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a029'); - > "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23" - - - ------------------------------------------------------------------------------- - - -encrypt -===================== - -.. code-block:: javascript - - web3.eth.accounts.encrypt(privateKey, password); - -Encrypts a private key to the web3 keystore v3 standard. - ----------- -Parameters ----------- - -1. ``privateKey`` - ``String``: The private key to encrypt. -2. ``password`` - ``String``: The password used for encryption. - - -------- -Returns -------- - -``Object``: The encrypted keystore v3 JSON. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.encrypt('0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', 'test!') - > { - version: 3, - id: '04e9bcbb-96fa-497b-94d1-14df4cd20af6', - address: '2c7536e3605d9c16a7a3d7b1898e529396a65c23', - crypto: { - ciphertext: 'a1c25da3ecde4e6a24f3697251dd15d6208520efc84ad97397e906e6df24d251', - cipherparams: { iv: '2885df2b63f7ef247d753c82fa20038a' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: { - dklen: 32, - salt: '4531b3c174cc3ff32a6a7a85d6761b410db674807b2d216d022318ceee50be10', - n: 262144, - r: 8, - p: 1 - }, - mac: 'b8b010fff37f9ae5559a352a185e86f9b9c1d7f7a9f1bd4e82a5dd35468fc7f6' - } - } - - - ------------------------------------------------------------------------------- - -decrypt -===================== - -.. code-block:: javascript - - web3.eth.accounts.decrypt(keystoreJsonV3, password); - -Decrypts a keystore v3 JSON, and creates the account. - ----------- -Parameters ----------- - -1. ``encryptedPrivateKey`` - ``String``: The encrypted private key to decrypt. -2. ``password`` - ``String``: The password used for encryption. - - -------- -Returns -------- - -``Object``: The decrypted account. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.decrypt({ - version: 3, - id: '04e9bcbb-96fa-497b-94d1-14df4cd20af6', - address: '2c7536e3605d9c16a7a3d7b1898e529396a65c23', - crypto: { - ciphertext: 'a1c25da3ecde4e6a24f3697251dd15d6208520efc84ad97397e906e6df24d251', - cipherparams: { iv: '2885df2b63f7ef247d753c82fa20038a' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: { - dklen: 32, - salt: '4531b3c174cc3ff32a6a7a85d6761b410db674807b2d216d022318ceee50be10', - n: 262144, - r: 8, - p: 1 - }, - mac: 'b8b010fff37f9ae5559a352a185e86f9b9c1d7f7a9f1bd4e82a5dd35468fc7f6' - } - }, 'test!'); - > { - address: "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23", - privateKey: "0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318", - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} - } - - - ------------------------------------------------------------------------------- -.. _eth-accounts-wallet: - -wallet -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet; - -Contains an in memory wallet with multiple accounts. These accounts can be used when using :ref:`web3.eth.sendTransaction() `. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet; - > Wallet { - 0: {...}, // account by index - "0xF0109fC8DF283027b6285cc889F5aA624EaC1F55": {...}, // same account by address - "0xf0109fc8df283027b6285cc889f5aa624eac1f55": {...}, // same account by address lowercase - 1: {...}, - "0xD0122fC8DF283027b6285cc889F5aA624EaC1d23": {...}, - "0xd0122fc8df283027b6285cc889f5aa624eac1d23": {...}, - - add: function(){}, - remove: function(){}, - save: function(){}, - load: function(){}, - clear: function(){}, - - length: 2, - } - - - ------------------------------------------------------------------------------- - -wallet.create -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.create(numberOfAccounts [, entropy]); - -Generates one or more accounts in the wallet. If wallets already exist they will not be overridden. - ----------- -Parameters ----------- - -1. ``numberOfAccounts`` - ``Number``: Number of accounts to create. Leave empty to create an empty wallet. -2. ``entropy`` - ``String`` (optional): A string with random characters as additional entropy when generating accounts. If given it should be at least 32 characters. - - -------- -Returns -------- - -``Object``: The wallet object. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet.create(2, '54674321§3456764321§345674321§3453647544±±±§±±±!!!43534534534534'); - > Wallet { - 0: {...}, - "0xF0109fC8DF283027b6285cc889F5aA624EaC1F55": {...}, - "0xf0109fc8df283027b6285cc889f5aa624eac1f55": {...}, - ... - } - - - ------------------------------------------------------------------------------- - -wallet.add -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.add(account); - -Adds an account using a private key or account object to the wallet. - ----------- -Parameters ----------- - -1. ``account`` - ``String|Object``: A private key or account object created with :ref:`web3.eth.accounts.create() `. - - -------- -Returns -------- - -``Object``: The added account. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet.add('0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318'); - > { - index: 0, - address: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', - privateKey: '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} - } - - web3.eth.accounts.wallet.add({ - privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', - address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01' - }); - > { - index: 0, - address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01', - privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} - } - - - ------------------------------------------------------------------------------- - -wallet.remove -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.remove(account); - -Removes an account from the wallet. - ----------- -Parameters ----------- - -1. ``account`` - ``String|Number``: The account address, or index in the wallet. - - -------- -Returns -------- - -``Boolean``: ``true`` if the wallet was removed. ``false`` if it couldn't be found. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet; - > Wallet { - 0: {...}, - "0xF0109fC8DF283027b6285cc889F5aA624EaC1F55": {...} - 1: {...}, - "0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01": {...} - ... - } - - web3.eth.accounts.wallet.remove('0xF0109fC8DF283027b6285cc889F5aA624EaC1F55'); - > true - - web3.eth.accounts.wallet.remove(3); - > false - - - ------------------------------------------------------------------------------- - - -wallet.clear -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.clear(); - -Securely empties the wallet and removes all its accounts. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Object``: The wallet object. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet.clear(); - > Wallet { - add: function(){}, - remove: function(){}, - save: function(){}, - load: function(){}, - clear: function(){}, - - length: 0 - } - - ------------------------------------------------------------------------------- - -wallet.encrypt -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.encrypt(password); - -Encrypts all wallet accounts to an array of encrypted keystore v3 objects. - ----------- -Parameters ----------- - -1. ``password`` - ``String``: The password which will be used for encryption. - - -------- -Returns -------- - -``Array``: The encrypted keystore v3. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet.encrypt('test'); - > [ { version: 3, - id: 'dcf8ab05-a314-4e37-b972-bf9b86f91372', - address: '06f702337909c06c82b09b7a22f0a2f0855d1f68', - crypto: - { ciphertext: '0de804dc63940820f6b3334e5a4bfc8214e27fb30bb7e9b7b74b25cd7eb5c604', - cipherparams: [Object], - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: [Object], - mac: 'b2aac1485bd6ee1928665642bf8eae9ddfbc039c3a673658933d320bac6952e3' } }, - { version: 3, - id: '9e1c7d24-b919-4428-b10e-0f3ef79f7cf0', - address: 'b5d89661b59a9af0b34f58d19138baa2de48baaf', - crypto: - { ciphertext: 'd705ebed2a136d9e4db7e5ae70ed1f69d6a57370d5fbe06281eb07615f404410', - cipherparams: [Object], - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: [Object], - mac: 'af9eca5eb01b0f70e909f824f0e7cdb90c350a802f04a9f6afe056602b92272b' } } - ] - ------------------------------------------------------------------------------- - - -wallet.decrypt -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.decrypt(keystoreArray, password); - -Decrypts keystore v3 objects. - ----------- -Parameters ----------- - -1. ``keystoreArray`` - ``Array``: The encrypted keystore v3 objects to decrypt. -2. ``password`` - ``String``: The password which will be used for encryption. - - -------- -Returns -------- - -``Object``: The wallet object. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet.decrypt([ - { version: 3, - id: '83191a81-aaca-451f-b63d-0c5f3b849289', - address: '06f702337909c06c82b09b7a22f0a2f0855d1f68', - crypto: - { ciphertext: '7d34deae112841fba86e3e6cf08f5398dda323a8e4d29332621534e2c4069e8d', - cipherparams: { iv: '497f4d26997a84d570778eae874b2333' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: - { dklen: 32, - salt: '208dd732a27aa4803bb760228dff18515d5313fd085bbce60594a3919ae2d88d', - n: 262144, - r: 8, - p: 1 }, - mac: '0062a853de302513c57bfe3108ab493733034bf3cb313326f42cf26ea2619cf9' } }, - { version: 3, - id: '7d6b91fa-3611-407b-b16b-396efb28f97e', - address: 'b5d89661b59a9af0b34f58d19138baa2de48baaf', - crypto: - { ciphertext: 'cb9712d1982ff89f571fa5dbef447f14b7e5f142232bd2a913aac833730eeb43', - cipherparams: { iv: '8cccb91cb84e435437f7282ec2ffd2db' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: - { dklen: 32, - salt: '08ba6736363c5586434cd5b895e6fe41ea7db4785bd9b901dedce77a1514e8b8', - n: 262144, - r: 8, - p: 1 }, - mac: 'd2eb068b37e2df55f56fa97a2bf4f55e072bef0dd703bfd917717d9dc54510f0' } } - ], 'test'); - > Wallet { - 0: {...}, - 1: {...}, - "0xF0109fC8DF283027b6285cc889F5aA624EaC1F55": {...}, - "0xD0122fC8DF283027b6285cc889F5aA624EaC1d23": {...} - ... - } - - - ------------------------------------------------------------------------------- - -wallet.save -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.save(password [, keyName]); - -Stores the wallet encrypted and as string in local storage. - -.. note:: Browser only. - ----------- -Parameters ----------- - -1. ``password`` - ``String``: The password to encrypt the wallet. -2. ``keyName`` - ``String``: (optional) The key used for the local storage position, defaults to ``"web3js_wallet"``. - - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet.save('test#!$'); - > true - - ------------------------------------------------------------------------------- - -wallet.load -===================== - -.. code-block:: javascript - - web3.eth.accounts.wallet.load(password [, keyName]); - -Loads a wallet from local storage and decrypts it. - -.. note:: Browser only. - ----------- -Parameters ----------- - -1. ``password`` - ``String``: The password to decrypt the wallet. -2. ``keyName`` - ``String``: (optional) The key used for the localstorage position, defaults to ``"web3js_wallet"``. - - -------- -Returns -------- - -``Object``: The wallet object. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.accounts.wallet.load('test#!$', 'myWalletKey'); - > Wallet { - 0: {...}, - 1: {...}, - "0xF0109fC8DF283027b6285cc889F5aA624EaC1F55": {...}, - "0xD0122fC8DF283027b6285cc889F5aA624EaC1d23": {...} - ... - } diff --git a/docs/web3-eth-contract.rst b/docs/web3-eth-contract.rst deleted file mode 100644 index a15a9b1025b..00000000000 --- a/docs/web3-eth-contract.rst +++ /dev/null @@ -1,1263 +0,0 @@ -.. _eth-contract: - -======== -web3.eth.Contract -======== - -The ``web3.eth.Contract`` object makes it easy to interact with smart contracts on the ethereum blockchain. -When you create a new contract object you give it the json interface of the respective smart contract -and web3 will auto convert all calls into low level ABI calls over RPC for you. - -This allows you to interact with smart contracts as if they were JavaScript objects. - -To use it standalone: - -.. code-block:: javascript - - var Contract = require('web3-eth-contract'); - - // set provider for all later instances to use - Contract.setProvider('ws://localhost:8546'); - - var contract = new Contract(jsonInterface, address); - - contract.methods.somFunc().send({from: ....}) - .on('receipt', function(){ - ... - }); - - ------------------------------------------------------------------------------- - - -new contract -========= - -.. index:: JSON interface - -.. code-block:: javascript - - new web3.eth.Contract(jsonInterface[, address][, options]) - -Creates a new contract instance with all its methods and events defined in its :ref:`json interface ` object. - ----------- -Parameters ----------- - -1. ``jsonInterface`` - ``Object``: The json interface for the contract to instantiate -2. ``address`` - ``String`` (optional): The address of the smart contract to call. -3. ``options`` - ``Object`` (optional): The options of the contract. Some are used as fallbacks for calls and transactions: - * ``from`` - ``String``: The address transactions should be made from. - * ``gasPrice`` - ``String``: The gas price in wei to use for transactions. - * ``gas`` - ``Number``: The maximum gas provided for a transaction (gas limit). - * ``data`` - ``String``: The byte code of the contract. Used when the contract gets :ref:`deployed `. - -------- -Returns -------- - -``Object``: The contract instance with all its methods and events. - - -------- -Example -------- - -.. code-block:: javascript - - var myContract = new web3.eth.Contract([...], '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', { - from: '0x1234567890123456789012345678901234567891', // default from address - gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case - }); - - ------------------------------------------------------------------------------- - - -= Properties = -========= - ------------------------------------------------------------------------------- - -.. _eth-contract-defaultaccount - -defaultAccount -===================== - -.. code-block:: javascript - - web3.eth.Contract.defaultAccount - contract.defaultAccount // on contract instance - -This default address is used as the default ``"from"`` property, if no ``"from"`` property is specified in for the following methods: - -- :ref:`web3.eth.sendTransaction() ` -- :ref:`web3.eth.call() ` -- :ref:`new web3.eth.Contract() -> myContract.methods.myMethod().call() ` -- :ref:`new web3.eth.Contract() -> myContract.methods.myMethod().send() ` - --------- -Property --------- - - -``String`` - 20 Bytes: Any ethereum address. You should have the private key for that address in your node or keystore. (Default is ``undefined``) - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.defaultAccount; - > undefined - - // set the default account - web3.eth.defaultAccount = '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'; - - ------------------------------------------------------------------------------- - -.. _eth-contract-defaultblock: - -defaultBlock -===================== - -.. code-block:: javascript - - web3.eth.Contract.defaultBlock - contract.defaultBlock // on contract instance - -The default block is used for certain methods. You can override it by passing in the defaultBlock as last parameter. The default value is ``"latest"``. - ----------- -Property ----------- - - -The default block parameters can be one of the following: - -- ``Number|BN|BigNumber``: A block number -- ``"earliest"`` - ``String``: The genesis block -- ``"latest"`` - ``String``: The latest block (current head of the blockchain) -- ``"pending"`` - ``String``: The currently mined block (including pending transactions) - -Default is ``"latest"``. - - -------- -Example -------- - -.. code-block:: javascript - - contract.defaultBlock; - > "latest" - - // set the default block - contract.defaultBlock = 231; - - - ------------------------------------------------------------------------------- - -.. _eth-contract-defaulthardfork: - -defaultHardfork -===================== - -.. code-block:: javascript - - contract.defaultHardfork - -The default hardfork property is used for signing transactions locally. - ----------- -Property ----------- - - -The default hardfork property can be one of the following: - -- ``"chainstart"`` - ``String`` -- ``"homestead"`` - ``String`` -- ``"dao"`` - ``String`` -- ``"tangerineWhistle"`` - ``String`` -- ``"spuriousDragon"`` - ``String`` -- ``"byzantium"`` - ``String`` -- ``"constantinople"`` - ``String`` -- ``"petersburg"`` - ``String`` -- ``"istanbul"`` - ``String`` - -Default is ``"petersburg"`` - - -------- -Example -------- - -.. code-block:: javascript - - contract.defaultHardfork; - > "petersburg" - - // set the default block - contract.defaultHardfork = 'istanbul'; - - ------------------------------------------------------------------------------- - -.. _eth-contract-defaultchain: - -defaultChain -===================== - -.. code-block:: javascript - - contract.defaultChain - -The default chain property is used for signing transactions locally. - ----------- -Property ----------- - - -The default chain property can be one of the following: - -- ``"mainnet"`` - ``String`` -- ``"goerli"`` - ``String`` -- ``"kovan"`` - ``String`` -- ``"rinkeby"`` - ``String`` -- ``"ropsten"`` - ``String`` - -Default is ``"mainnet"`` - - -------- -Example -------- - -.. code-block:: javascript - - contract.defaultChain; - > "mainnet" - - // set the default chain - contract.defaultChain = 'goerli'; - - ------------------------------------------------------------------------------- - -.. _eth-contract-defaultcommon: - -defaultCommon -===================== - -.. code-block:: javascript - - contract.defaultCommon - -The default common property is used for signing transactions locally. - ----------- -Property ----------- - - -The default common property does contain the following ``Common`` object: - -- ``customChain`` - ``Object``: The custom chain properties - - ``name`` - ``string``: (optional) The name of the chain - - ``networkId`` - ``number``: Network ID of the custom chain - - ``chainId`` - ``number``: Chain ID of the custom chain -- ``baseChain`` - ``string``: (optional) ``mainnet``, ``goerli``, ``kovan``, ``rinkeby``, or ``ropsten`` -- ``hardfork`` - ``string``: (optional) ``chainstart``, ``homestead``, ``dao``, ``tangerineWhistle``, ``spuriousDragon``, ``byzantium``, ``constantinople``, ``petersburg``, or ``istanbul`` - - -Default is ``undefined``. - - -------- -Example -------- - -.. code-block:: javascript - - contract.defaultCommon; - > {customChain: {name: 'custom-network', chainId: 1, networkId: 1}, baseChain: 'mainnet', hardfork: 'petersburg'} - - // set the default common - contract.defaultCommon = {customChain: {name: 'custom-network', chainId: 1, networkId: 1}, baseChain: 'mainnet', hardfork: 'petersburg'}; - - ------------------------------------------------------------------------------- - -.. _eth-contract-transactionblocktimeout: - -transactionBlockTimeout -===================== - -.. code-block:: javascript - - web3.eth.Contract.transcationBlockTimeout - contract.transactionBlockTimeout // on contract instance - -The ``transactionBlockTimeout`` is used over socket-based connections. This option defines the amount of new blocks it should wait until the first confirmation happens, otherwise the PromiEvent rejects with a timeout error. - - -------- -Returns -------- - -``number``: The current value of transactionBlockTimeout (default: 50) - ------------------------------------------------------------------------------- - -.. _eth-contract-module-transactionconfirmationblocks: - -transactionConfirmationBlocks -===================== - -.. code-block:: javascript - - web3.eth.Contract.transactionConfirmationBlocks - contract.transactionConfirmationBlocks // on contract instance - -This defines the number of blocks it requires until a transaction is considered confirmed. - - -------- -Returns -------- - -``number``: The current value of transactionConfirmationBlocks (default: 24) - ------------------------------------------------------------------------------- - -.. _eth-contract-module-transactionpollingtimeout: - -transactionPollingTimeout -===================== - -.. code-block:: javascript - - web3.eth.Contract.transactionPollingTimeout - contract.transactionPollingTimeout // on contract instance - -The ``transactionPollingTimeout`` is used over HTTP connections. This option defines the number of seconds Web3 will wait for a receipt which confirms that a transaction was mined by the network. Note: If this method times out, the transaction may still be pending. - - -------- -Returns -------- - -``number``: The current value of transactionPollingTimeout (default: 750) - ------------------------------------------------------------------------------- - -.. _eth-contract-module-handlerevert: - -handleRevert -============ - -.. code-block:: javascript - - web3.eth.Contract.handleRevert - contract.handleRevert // on contract instance - -The ``handleRevert`` options property defaults to ``false`` and returns the revert reason string if enabled on :ref:`send ` or :ref:`call ` of a contract method. - -.. note:: The revert reason string and signature are properties on the returned error. - -------- -Returns -------- - -``boolean``: The current value of ``handleRevert`` (default: false) - ------------------------------------------------------------------------------- - -options -========= - -.. code-block:: javascript - - myContract.options - -The options ``object`` for the contract instance. ``from``, ``gas`` and ``gasPrice`` are used as fallback values when sending transactions. - -------- -Properties -------- - -``Object`` - options: - -- ``address`` - ``String``: The address where the contract is deployed. See :ref:`options.address `. -- ``jsonInterface`` - ``Array``: The json interface of the contract. See :ref:`options.jsonInterface `. -- ``data`` - ``String``: The byte code of the contract. Used when the contract gets :ref:`deployed `. -- ``from`` - ``String``: The address transactions should be made from. -- ``gasPrice`` - ``String``: The gas price in wei to use for transactions. -- ``gas`` - ``Number``: The maximum gas provided for a transaction (gas limit). -- ``handleRevert`` - ``Boolean``: It will otherwise use the default value provided from the Eth module. See :ref:`handleRevert `. -- ``transactionBlockTimeout`` - ``Number``: It will otherwise use the default value provided from the Eth module. See :ref:`transactionBlockTimeout `. -- ``transactionConfirmationBlocks`` - ``Number``: It will otherwise use the default value provided from the Eth module. See :ref:`transactionConfirmationBlocks `. -- ``transactionPollingTimeout`` - ``Number``: It will otherwise use the default value provided from the Eth module. See :ref:`transactionPollingTimeout `. -- ``chain`` - ``Number``: It will otherwise use the default value provided from the Eth module. See :ref:`defaultChain `. -- ``hardfork`` - ``Number``: It will otherwise use the default value provided from the Eth module. See :ref:`defaultHardfork `. -- ``common`` - ``Number``: It will otherwise use the default value provided from the Eth module. See :ref:`defaultCommon `. - - -------- -Example -------- - -.. code-block:: javascript - - myContract.options; - > { - address: '0x1234567890123456789012345678901234567891', - jsonInterface: [...], - from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', - gasPrice: '10000000000000', - gas: 1000000 - } - - myContract.options.from = '0x1234567890123456789012345678901234567891'; // default from address - myContract.options.gasPrice = '20000000000000'; // default gas price in wei - myContract.options.gas = 5000000; // provide as fallback always 5M gas - - ------------------------------------------------------------------------------- - -.. _contract-address: - -options.address -========= - -.. code-block:: javascript - - myContract.options.address - -The address used for this contract instance. -All transactions generated by web3.js from this contract will contain this address as the ``"to"``. - -The address will be stored in lowercase. - - -------- -Property -------- - -``address`` - ``String|null``: The address for this contract, or ``null`` if not yet set. - - -------- -Example -------- - -.. code-block:: javascript - - myContract.options.address; - > '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae' - - // set a new address - myContract.options.address = '0x1234FFDD...'; - - ------------------------------------------------------------------------------- - -.. _contract-json-interface: - -options.jsonInterface -========= - -.. code-block:: javascript - - myContract.options.jsonInterface - -The :ref:`json interface ` object derived from the `ABI `_ of this contract. - - -------- -Property -------- - -``jsonInterface`` - ``Array``: The :ref:`json interface ` for this contract. Re-setting this will regenerate the methods and events of the contract instance. - - -------- -Example -------- - -.. code-block:: javascript - - myContract.options.jsonInterface; - > [{ - "type":"function", - "name":"foo", - "inputs": [{"name":"a","type":"uint256"}], - "outputs": [{"name":"b","type":"address"}] - },{ - "type":"event", - "name":"Event", - "inputs": [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"bytes32","indexed":false}], - }] - - // set a new interface - myContract.options.jsonInterface = [...]; - - ------------------------------------------------------------------------------- - - -= Methods = -========= - - ------------------------------------------------------------------------------- - -clone -===================== - -.. code-block:: javascript - - myContract.clone() - -Clones the current contract instance. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - - -``Object``: The new contract instance. - -------- -Example -------- - -.. code-block:: javascript - - var contract1 = new eth.Contract(abi, address, {gasPrice: '12345678', from: fromAddress}); - - var contract2 = contract1.clone(); - contract2.options.address = address2; - - (contract1.options.address !== contract2.options.address); - > true - ------------------------------------------------------------------------------- - - -.. _contract-deploy: - -.. index:: contract deploy - -deploy -===================== - -.. code-block:: javascript - - myContract.deploy(options) - -Call this function to deploy the contract to the blockchain. -After successful deployment the promise will resolve with a new contract instance. - ----------- -Parameters ----------- - -1. ``options`` - ``Object``: The options used for deployment. - * ``data`` - ``String``: The byte code of the contract. - * ``arguments`` - ``Array`` (optional): The arguments which get passed to the constructor on deployment. - -------- -Returns -------- - - -``Object``: The transaction object: - -- ``Array`` - arguments: The arguments passed to the method before. They can be changed. -- ``Function`` - :ref:`send `: Will deploy the contract. The promise will resolve with the new contract instance, instead of the receipt! -- ``Function`` - :ref:`estimateGas `: Will estimate the gas used for deploying. Note: You must specify a ``from`` address otherwise you may experience odd behavior. -- ``Function`` - :ref:`encodeABI `: Encodes the ABI of the deployment, which is contract data + constructor parameters - -------- -Example -------- - -.. code-block:: javascript - - myContract.deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .send({ - from: '0x1234567890123456789012345678901234567891', - gas: 1500000, - gasPrice: '30000000000000' - }, function(error, transactionHash){ ... }) - .on('error', function(error){ ... }) - .on('transactionHash', function(transactionHash){ ... }) - .on('receipt', function(receipt){ - console.log(receipt.contractAddress) // contains the new contract address - }) - .on('confirmation', function(confirmationNumber, receipt){ ... }) - .then(function(newContractInstance){ - console.log(newContractInstance.options.address) // instance with the new contract address - }); - - - // When the data is already set as an option to the contract itself - myContract.options.data = '0x12345...'; - - myContract.deploy({ - arguments: [123, 'My String'] - }) - .send({ - from: '0x1234567890123456789012345678901234567891', - gas: 1500000, - gasPrice: '30000000000000' - }) - .then(function(newContractInstance){ - console.log(newContractInstance.options.address) // instance with the new contract address - }); - - - // Simply encoding - myContract.deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .encodeABI(); - > '0x12345...0000012345678765432' - - - // Gas estimation - myContract.deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .estimateGas(function(err, gas){ - console.log(gas); - }); - ------------------------------------------------------------------------------- - - -methods -===================== - -.. code-block:: javascript - - myContract.methods.myMethod([param1[, param2[, ...]]]) - -Creates a transaction object for that method, which then can be :ref:`called `, :ref:`send `, :ref:`estimated `, or :ref:`ABI encoded `. - -The methods of this smart contract are available through: - -- The name: ``myContract.methods.myMethod(123)`` -- The name with parameters: ``myContract.methods['myMethod(uint256)'](123)`` -- The signature: ``myContract.methods['0x58cf5f10'](123)`` - -This allows calling functions with same name but different parameters from the JavaScript contract object. - ----------- -Parameters ----------- - -Parameters of any method depend on the smart contracts methods, defined in the :ref:`JSON interface `. - -------- -Returns -------- - -``Object``: The transaction object: - -- ``Array`` - arguments: The arguments passed to the method before. They can be changed. -- ``Function`` - :ref:`call `: Will call the "constant" method and execute its smart contract method in the EVM without sending a transaction (Can't alter the smart contract state). -- ``Function`` - :ref:`send `: Will send a transaction to the smart contract and execute its method (Can alter the smart contract state). -- ``Function`` - :ref:`estimateGas `: Will estimate the gas used when the method would be executed on chain. Note: You must specify a ``from`` address otherwise you may experience odd behavior. -- ``Function`` - :ref:`encodeABI `: Encodes the ABI for this method. This can be send using a transaction, call the method or passing into another smart contracts method as argument. - -------- -Example -------- - -.. code-block:: javascript - - // calling a method - - myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, function(error, result){ - ... - }); - - // or sending and using a promise - myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) - .then(function(receipt){ - // receipt can also be a new contract instance, when coming from a "contract.deploy({...}).send()" - }); - - // or sending and using the events - - myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) - .on('transactionHash', function(hash){ - ... - }) - .on('receipt', function(receipt){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ - ... - }) - .on('error', function(error, receipt) { - ... - }); - - ------------------------------------------------------------------------------- - - -.. _contract-call: - -methods.myMethod.call -===================== - -.. code-block:: javascript - - myContract.methods.myMethod([param1[, param2[, ...]]]).call(options [, defaultBlock] [, callback]) - -Will call a "constant" method and execute its smart contract method in the EVM without sending any transaction. Note calling cannot alter the smart contract state. - ----------- -Parameters ----------- - -1. ``options`` - ``Object`` (optional): The options used for calling. - * ``from`` - ``String`` (optional): The address the call "transaction" should be made from. For calls the ``from`` property is optional however it is highly recommended to explicitly set it or it may default to `address(0)` depending on your node or provider. - * ``gasPrice`` - ``String`` (optional): The gas price in wei to use for this call "transaction". - * ``gas`` - ``Number`` (optional): The maximum gas provided for this call "transaction" (gas limit). -2. ``defaultBlock`` - ``Number|String|BN|BigNumber`` (optional): If you pass this parameter it will not use the default block set with :ref:`contract.defaultBlock `. Pre-defined block numbers as ``"earliest"``, ``"latest"``, and ``"pending"`` can also be used. Useful for requesting data from or replaying transactions in past blocks. -3. ``callback`` - ``Function`` (optional): This callback will be fired with the result of the smart contract method execution as the second argument, or with an error object as the first argument. - -------- -Returns -------- - -``Promise`` returns ``Mixed``: The return value(s) of the smart contract method. -If it returns a single value, it's returned as is. If it has multiple return values they are returned as an object with properties and indices: - -------- -Example -------- - -.. code-block:: javascript - - // using the callback - myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, function(error, result){ - ... - }); - - // using the promise - myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) - .then(function(result){ - ... - }); - - - // MULTI-ARGUMENT RETURN: - - // Solidity - contract MyContract { - function myFunction() returns(uint256 myNumber, string myString) { - return (23456, "Hello!%"); - } - } - - // web3.js - var MyContract = new web3.eth.Contract(abi, address); - MyContract.methods.myFunction().call() - .then(console.log); - > Result { - myNumber: '23456', - myString: 'Hello!%', - 0: '23456', // these are here as fallbacks if the name is not know or given - 1: 'Hello!%' - } - - - // SINGLE-ARGUMENT RETURN: - - // Solidity - contract MyContract { - function myFunction() returns(string myString) { - return "Hello!%"; - } - } - - // web3.js - var MyContract = new web3.eth.Contract(abi, address); - MyContract.methods.myFunction().call() - .then(console.log); - > "Hello!%" - - - ------------------------------------------------------------------------------- - - -.. _contract-send: - -methods.myMethod.send -===================== - -.. code-block:: javascript - - myContract.methods.myMethod([param1[, param2[, ...]]]).send(options[, callback]) - -Will send a transaction to the smart contract and execute its method. Note this can alter the smart contract state. - ----------- -Parameters ----------- - -1. ``options`` - ``Object``: The options used for sending. - * ``from`` - ``String``: The address the transaction should be sent from. - * ``gasPrice`` - ``String`` (optional): The gas price in wei to use for this transaction. - * ``gas`` - ``Number`` (optional): The maximum gas provided for this transaction (gas limit). - * ``value`` - ``Number|String|BN|BigNumber``(optional): The value transferred for the transaction in wei. -2. ``callback`` - ``Function`` (optional): This callback will be fired first with the "transactionHash", or with an error object as the first argument. - -------- -Returns -------- - -The **callback** will return the 32 bytes transaction hash. - -``PromiEvent``: A :ref:`promise combined event emitter `. Resolves when the transaction *receipt* is available, OR if this ``send()`` is called from a ``someContract.deploy()``, then the promise will resolve with the *new contract instance*. Additionally the following events are available: - -- ``sending`` returns ``payload: Object``: Fired immediately before transmitting the transaction request. -- ``sent`` returns ``payload: Object``: Fired immediately after the request body has been written to the client, but before the transaction hash is received. -- ``"transactionHash"`` returns ``transactionHash: String``: Fired when the transaction hash is available. -- ``"receipt"`` returns ``receipt: Object``: Fired when the transaction *receipt* is available. Receipts from contracts will have no ``logs`` property, but instead an ``events`` property with event names as keys and events as properties. See :ref:`getPastEvents return values ` for details about the returned event object. -- ``"confirmation"`` returns ``confirmation: Number``, ``receipt: Object``, ``latestBlockHash: String``: Fired for every confirmation up to the 24th confirmation. -- ``"error"`` returns ``error: Error``: Fired if an error occurs during sending. If the transaction was rejected by the network with a receipt, the receipt will be available as a property on the error object. - - -------- -Example -------- - -.. code-block:: javascript - - // using the callback - myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, function(error, transactionHash){ - ... - }); - - // using the promise - myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) - .then(function(receipt){ - // receipt can also be a new contract instance, when coming from a "contract.deploy({...}).send()" - }); - - - // using the event emitter - myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) - .on('transactionHash', function(hash){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ - ... - }) - .on('receipt', function(receipt){ - // receipt example - console.log(receipt); - > { - "transactionHash": "0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b", - "transactionIndex": 0, - "blockHash": "0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46", - "blockNumber": 3, - "contractAddress": "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", - "cumulativeGasUsed": 314159, - "gasUsed": 30234, - "events": { - "MyEvent": { - returnValues: { - myIndexedParam: 20, - myOtherIndexedParam: '0x123456789...', - myNonIndexParam: 'My String' - }, - raw: { - data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] - }, - event: 'MyEvent', - signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - logIndex: 0, - transactionIndex: 0, - transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - blockNumber: 1234, - address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' - }, - "MyOtherEvent": { - ... - }, - "MyMultipleEvent":[{...}, {...}] // If there are multiple of the same event, they will be in an array - } - } - }) - .on('error', function(error, receipt) { // If the transaction was rejected by the network with a receipt, the second parameter will be the receipt. - ... - }); - ------------------------------------------------------------------------------- - - -.. _contract-estimateGas: - -methods.myMethod.estimateGas -===================== - -.. code-block:: javascript - - myContract.methods.myMethod([param1[, param2[, ...]]]).estimateGas(options[, callback]) - -Will call to estimate the gas a method execution will take when executed in the EVM. -The estimation can differ from the actual gas used when later sending a transaction, as the state of the smart contract can be different at that time. -Note: You must specify a ``from`` address otherwise you may experience odd behavior. - ----------- -Parameters ----------- - -1. ``options`` - ``Object`` (optional): The options used for calling. - * ``from`` - ``String`` (optional): The address the call "transaction" should be made from. - * ``gas`` - ``Number`` (optional): The maximum gas provided for this call "transaction" (gas limit). Setting a specific value helps to detect out of gas errors. If all gas is used it will return the same number. - * ``value`` - ``Number|String|BN|BigNumber`` (optional): The value transferred for the call "transaction" in wei. -2. ``callback`` - ``Function`` (optional): This callback will be fired with the result of the gas estimation as the second argument, or with an error object as the first argument. - -------- -Returns -------- - -``Promise`` returns ``Number``: The gas amount estimated. - -------- -Example -------- - -.. code-block:: javascript - - // using the callback - myContract.methods.myMethod(123).estimateGas({gas: 5000000}, function(error, gasAmount){ - if(gasAmount == 5000000) - console.log('Method ran out of gas'); - }); - - // using the promise - myContract.methods.myMethod(123).estimateGas({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) - .then(function(gasAmount){ - ... - }) - .catch(function(error){ - ... - }); - - ------------------------------------------------------------------------------- - - -.. _contract-encodeABI: - -methods.myMethod.encodeABI -===================== - -.. code-block:: javascript - - myContract.methods.myMethod([param1[, param2[, ...]]]).encodeABI() - -Encodes the ABI for this method. The resulting hex string is 32-bit function signature hash plus the passed parameters in Solidity tightly packed format. This can be used to send a transaction, call a method, or pass it into another smart contract's method as arguments. Set the `data` field on `web3.eth.sendTransaction` options as the `encodeABI()` result and it is the same as calling the contract method with `contract.myMethod.send()`. - -Some use cases for `encodeABI()` include: preparing a smart contract transaction for a multisignature wallet, working with offline wallets and cold storage and creating transaction payload for complex smart contract proxy calls. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``String``: The encoded ABI byte code to send via a transaction or call. - -------- -Example -------- - -.. code-block:: javascript - - myContract.methods.myMethod(123).encodeABI(); - > '0x58cf5f1000000000000000000000000000000000000000000000000000000000000007B' - - ------------------------------------------------------------------------------- - - -= Events = -========= - - ------------------------------------------------------------------------------- - - -once -===================== - -.. code-block:: javascript - - myContract.once(event[, options], callback) - -Subscribes to an event and unsubscribes immediately after the first event or error. Will only fire for a single event. - ----------- -Parameters ----------- - -1. ``event`` - ``String``: The name of the event in the contract, or ``"allEvents"`` to get all events. -2. ``options`` - ``Object`` (optional): The options used for deployment. - * ``filter`` - ``Object`` (optional): Lets you filter events by indexed parameters, e.g. ``{filter: {myNumber: [12,13]}}`` means all events where "myNumber" is 12 or 13. - * ``topics`` - ``Array`` (optional): This allows you to manually set the topics for the event filter. If given the filter property and event signature, (topic[0]) will not be set automatically. Each topic can also be a nested array of topics that behaves as “or” operation between the given nested topics. -3. ``callback`` - ``Function``: This callback will be fired for the first *event* as the second argument, or an error as the first argument. See :ref:`getPastEvents return values ` for details about the event structure. - -------- -Returns -------- - -``undefined`` - -------- -Example -------- - -.. code-block:: javascript - - myContract.once('MyEvent', { - filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23 - fromBlock: 0 - }, function(error, event){ console.log(event); }); - - // event output example - > { - returnValues: { - myIndexedParam: 20, - myOtherIndexedParam: '0x123456789...', - myNonIndexParam: 'My String' - }, - raw: { - data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] - }, - event: 'MyEvent', - signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - logIndex: 0, - transactionIndex: 0, - transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - blockNumber: 1234, - address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' - } - - ------------------------------------------------------------------------------- - -.. _contract-events: - -events -===================== - -.. code-block:: javascript - - myContract.events.MyEvent([options][, callback]) - -Subscribe to an event. - ----------- -Parameters ----------- - -1. ``options`` - ``Object`` (optional): The options used for deployment. - * ``filter`` - ``Object`` (optional): Let you filter events by indexed parameters, e.g. ``{filter: {myNumber: [12,13]}}`` means all events where "myNumber" is 12 or 13. - * ``fromBlock`` - ``Number|String|BN|BigNumber`` (optional): The block number (greater than or equal to) from which to get events on. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. For specific range use :ref:`getPastEvents `. - * ``topics`` - ``Array`` (optional): This allows to manually set the topics for the event filter. If given the filter property and event signature, (topic[0]) will not be set automatically. Each topic can also be a nested array of topics that behaves as “or” operation between the given nested topics. -2. ``callback`` - ``Function`` (optional): This callback will be fired for each *event* as the second argument, or an error as the first argument. - -.. _contract-events-return: - -------- -Returns -------- - -``EventEmitter``: The event emitter has the following events: - -- ``"data"`` returns ``Object``: Fires on each incoming event with the event object as argument. -- ``"changed"`` returns ``Object``: Fires on each event which was removed from the blockchain. The event will have the additional property ``"removed: true"``. -- ``"error"`` returns ``Object``: Fires when an error in the subscription occours. -- ``"connected"`` returns ``String``: Fires once after the subscription successfully connected. Returns the subscription id. - - -The structure of the returned event ``Object`` looks as follows: - -- ``event`` - ``String``: The event name. -- ``signature`` - ``String|Null``: The event signature, ``null`` if it's an anonymous event. -- ``address`` - ``String``: Address this event originated from. -- ``returnValues`` - ``Object``: The return values coming from the event, e.g. ``{myVar: 1, myVar2: '0x234...'}``. -- ``logIndex`` - ``Number``: Integer of the event index position in the block. -- ``transactionIndex`` - ``Number``: Integer of the transaction's index position the event was created in. -- ``transactionHash`` 32 Bytes - ``String``: Hash of the transaction this event was created in. -- ``blockHash`` 32 Bytes - ``String``: Hash of the block this event was created in. ``null`` when it's still pending. -- ``blockNumber`` - ``Number``: The block number this log was created in. ``null`` when still pending. -- ``raw.data`` - ``String``: The data containing non-indexed log parameter. -- ``raw.topics`` - ``Array``: An array with max 4 32 Byte topics, topic 1-3 contains indexed parameters of the event. - -------- -Example -------- - -.. code-block:: javascript - - myContract.events.MyEvent({ - filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23 - fromBlock: 0 - }, function(error, event){ console.log(event); }) - .on("connected", function(subscriptionId){ - console.log(subscriptionId); - }) - .on('data', function(event){ - console.log(event); // same results as the optional callback above - }) - .on('changed', function(event){ - // remove event from local database - }) - .on('error', function(error, receipt) { // If the transaction was rejected by the network with a receipt, the second parameter will be the receipt. - ... - }); - - // event output example - > { - returnValues: { - myIndexedParam: 20, - myOtherIndexedParam: '0x123456789...', - myNonIndexParam: 'My String' - }, - raw: { - data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] - }, - event: 'MyEvent', - signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - logIndex: 0, - transactionIndex: 0, - transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - blockNumber: 1234, - address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' - } - - ------------------------------------------------------------------------------- - -events.allEvents -===================== - -.. code-block:: javascript - - myContract.events.allEvents([options][, callback]) - -Same as :ref:`events ` but receives all events from this smart contract. -Optionally the filter property can filter those events. - - ------------------------------------------------------------------------------- - - -getPastEvents -===================== - -.. code-block:: javascript - - myContract.getPastEvents(event[, options][, callback]) - -Gets past events for this contract. - ----------- -Parameters ----------- - -1. ``event`` - ``String``: The name of the event in the contract, or ``"allEvents"`` to get all events. -2. ``options`` - ``Object`` (optional): The options used for deployment. - * ``filter`` - ``Object`` (optional): Lets you filter events by indexed parameters, e.g. ``{filter: {myNumber: [12,13]}}`` means all events where "myNumber" is 12 or 13. - * ``fromBlock`` - ``Number|String|BN|BigNumber`` (optional): The block number (greater than or equal to) from which to get events on. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. - * ``toBlock`` - ``Number|String|BN|BigNumber`` (optional): The block number (less than or equal to) to get events up to (Defaults to ``"latest"``). Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. - * ``topics`` - ``Array`` (optional): This allows manually setting the topics for the event filter. If given the filter property and event signature, (topic[0]) will not be set automatically. Each topic can also be a nested array of topics that behaves as “or” operation between the given nested topics. -3. ``callback`` - ``Function`` (optional): This callback will be fired with an array of event logs as the second argument, or an error as the first argument. - - -------- -Returns -------- - -``Promise`` returns ``Array``: An array with the past event ``Objects``, matching the given event name and filter. - -For the structure of a returned event ``Object`` see :ref:`getPastEvents return values `. - -------- -Example -------- - -.. code-block:: javascript - - myContract.getPastEvents('MyEvent', { - filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23 - fromBlock: 0, - toBlock: 'latest' - }, function(error, events){ console.log(events); }) - .then(function(events){ - console.log(events) // same results as the optional callback above - }); - - > [{ - returnValues: { - myIndexedParam: 20, - myOtherIndexedParam: '0x123456789...', - myNonIndexParam: 'My String' - }, - raw: { - data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] - }, - event: 'MyEvent', - signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - logIndex: 0, - transactionIndex: 0, - transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - blockNumber: 1234, - address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' - },{ - ... - }] diff --git a/docs/web3-eth-ens.rst b/docs/web3-eth-ens.rst deleted file mode 100644 index 6fc04caaa4d..00000000000 --- a/docs/web3-eth-ens.rst +++ /dev/null @@ -1,1319 +0,0 @@ -.. _eth-ens: - -============ -web3.eth.ens -============ - -The ``web3.eth.ens`` functions let you interact with ENS. -We recommend reading the `ENS documentation `_ to get deeper insights about the internals of the name service. - ------------------------------------------------------------------------------- - -registryAddress -===================== - -.. code-block:: javascript - - web3.eth.ens.registryAddress; - -The ``registryAddress`` property can be used to define a custom registry address when you are connected to an unknown chain. - -.. note:: - If no address is defined will it try to detect the registry on the chain you are currently connected with and on the call of ``setProvider`` in the Eth module will it keep the defined address and use it for the ENS module. - -------- -Returns -------- - -``String`` - The address of the custom registry. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.registryAddress; - > "0x314159265dD8dbb310642f98f50C066173C1259b" - ------------------------------------------------------------------------------- - -registry -======== - -.. code-block:: javascript - - web3.eth.ens.registry; - -Returns the network specific ENS registry. - -------- -Returns -------- - -``Registry`` - The current ENS registry. - -- ``contract: Contract`` - The ``Registry`` contract with the interface we know from the :ref:`Contract ` object. -- ``owner(name, callback): Promise`` - Deprecated please use ``getOwner`` -- ``getOwner(name, callback): Promise`` -- ``setOwner(name, address, txConfig, callback): PromiEvent`` -- ``resolver(name, callback): Promise`` - Deprecated please use ``getResolver`` -- ``getResolver(name, callback): Promise`` -- ``setResolver(name, address, txConfig, callback): PromiEvent`` -- ``getTTL(name, callback): Promise`` -- ``setTTL(name, ttl, txConfig, callback): PromiEvent`` -- ``setSubnodeOwner(name, label, address, txConfig, callback): PromiEvent`` -- ``setRecord(name, owner, resolver, ttl, txConfig, callback): PromiEvent`` -- ``setSubnodeRecord(name, label, owner, resolver, ttl, txConfig, callback): PromiEvent`` -- ``setApprovalForAll(operator, approved, txConfig, callback): PromiEvent`` -- ``isApprovedForAll(owner, operator, callback): Promise`` -- ``recordExists(name, callback): Promise`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.registry; - > { - contract: Contract, - owner: Function(name, callback), // Deprecated - getOwner: Function(name, callback), - setOwner: Function(name, address, txConfig, callback), - resolver: Function(name, callback), // Deprecated - getResolver: Function(name, callback), - setResolver: Function(name, address, txConfig, callback), - getTTL: Function(name, callback), - setTTL: Function(name, ttl, txConfig, callback), - setSubnodeOwner: Function(name, label, address, txConfig, callback), - setRecord(name, owner, resolver, ttl, txConfig, callback), - setSubnodeRecord(name, label, owner, resolver, ttl, txConfig, callback), - setApprovalForAll(operator, approved, txConfig, callback), - isApprovedForAll(owner, operator, txConfig, callback), - recordExists(name, callback) - } - ------------------------------------------------------------------------------- - -resolver -======== - -.. code-block:: javascript - - web3.eth.ens.resolver(name [, callback]); - -Returns the resolver contract to an Ethereum address. - -.. note:: - This method is deprecated please use ``getResolver`` - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - The ENS resolver for this name. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.resolver('ethereum.eth').then(function (contract) { - console.log(contract); - }); - > Contract - ------------------------------------------------------------------------------- - -getResolver -=========== - -.. code-block:: javascript - - web3.eth.ens.getResolver(name [, callback]); - -Returns the resolver contract to an Ethereum address. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - The ENS resolver for this name. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getResolver('ethereum.eth').then(function (contract) { - console.log(contract); - }); - > Contract - ------------------------------------------------------------------------------- - -setResolver -=========== - -.. code-block:: javascript - - web3.eth.ens.setResolver(name, address [, txConfig ] [, callback]); - -Sets the resolver contract address of a name. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``address`` - ``String``: The contract address of the deployed ``Resolver`` contract. -3. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -4. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setResolver('ethereum.eth', '0x...', {...}).then(function (receipt) { - console.log(receipt); - }); - > {...} - ------------------------------------------------------------------------------- - -getOwner -======== - -.. code-block:: javascript - - web3.eth.ens.getOwner(name [, callback]); - -Returns the owner of a name. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -`Promise`` - The address of the registrar (EOA or CA). - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getOwner('ethereum.eth').then(function (owner) { - console.log(owner); - }); - > '0x...' - - ------------------------------------------------------------------------------- - -setOwner -======== - -.. code-block:: javascript - - web3.eth.ens.setOwner(name [, txConfig ] [, callback]); - -Sets the owner of the given name. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -3. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setOwner('ethereum.eth', {...}).then(function (receipt) { - console.log(receipt); - }); - > {...} - ------------------------------------------------------------------------------- - -getTTL -====== - -.. code-block:: javascript - - web3.eth.ens.getTTL(name [, callback]); - -Returns the caching TTL (time-to-live) of a name. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getTTL('ethereum.eth').then(function (ttl) { - console.log(ttl); - }); - > 100000 - ------------------------------------------------------------------------------- - -setTTL -====== - -.. code-block:: javascript - - web3.eth.ens.setTTL(name, ttl [, txConfig ] [, callback]); - -Sets the caching TTL (time-to-live) of a name. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``ttl`` - ``Number``: The TTL value (uint64) -3. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -4. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setTTL('ethereum.eth', 10000, {...}).then(function (receipt) { - console.log(receipt); - }); - > {...} - ------------------------------------------------------------------------------- - -setSubnodeOwner -=============== - -.. code-block:: javascript - - web3.eth.ens.setSubnodeOwner(name, label, address [, txConfig ] [, callback]); - -Creates a new subdomain of the given node, assigning ownership of it to the specified owner. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``label`` - ``String``: The name of the sub-domain or the sha3 hash of it. -3. ``address`` - ``String``: The registrar of this sub-domain. -4. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here `. -5. ``callback`` - ``Function``: (optional) Optional callback. - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setSubnodeOwner('ethereum.eth', 'web3', '0x...', {...}).then(function (receipt) { - console.log(receipt); // successfully defined the owner of web3.ethereum.eth - }); - > {...} - ------------------------------------------------------------------------------- - -setRecord -========= - -.. code-block:: javascript - - web3.eth.ens.setRecord(name, owner, resolver, ttl, [, txConfig ] [, callback]); - -Sets the owner, resolver, and TTL for an ENS record in a single operation. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``owner`` - ``String``: The owner of the name record. -3. ``resolver`` - ``String``: The resolver address of the name record. -4. ``ttl`` - ``String | Number``: Time to live value (uint64). -5. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here `. -6. ``callback`` - ``Function``: (optional) Optional callback. - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setRecord('ethereum.eth', '0x...', '0x...', 1000000, {...}).then(function (receipt) { - console.log(receipt); // successfully registered ethereum.eth - }); - > {...} - ------------------------------------------------------------------------------- - -setSubnodeRecord -================ - -.. code-block:: javascript - - web3.eth.ens.setSubnodeRecord(name, label, owner, resolver, ttl, [, txConfig ] [, callback]); - -Sets the owner, resolver and TTL for a subdomain, creating it if necessary. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``label`` - ``String``: The name of the sub-domain or the sha3 hash of it. -3. ``owner`` - ``String``: The owner of the name record. -4. ``resolver`` - ``String``: The resolver address of the name record. -5. ``ttl`` - ``String | Number``: Time to live value (uint64). -6. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here `. -7. ``callback`` - ``Function``: (optional) Optional callback. - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setSubnodeRecord('ethereum.eth', 'web3', '0x...', '0x...', 1000000, {...}).then(function (receipt) { - console.log(receipt); // successfully registered web3.ethereum.eth - }); - > {...} - ------------------------------------------------------------------------------- - -setApprovalForAll -================= - -.. code-block:: javascript - - web3.eth.ens.setApprovalForAll(operator, approved, [, txConfig ] [, callback]); - -Sets or clears an approval. Approved accounts can execute all ENS registry operations on behalf of the caller. - ----------- -Parameters ----------- - -1. ``operator`` - ``String``: The operator address -2. ``approved`` - ``Boolean`` -3. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -4. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setApprovalForAll('0x...', true, {...}).then(function (receipt) { - console.log(receipt); - }); - > {...} - ------------------------------------------------------------------------------- - -isApprovedForAll -================ - -.. code-block:: javascript - - web3.eth.ens.isApprovedForAll(owner, operator [, callback]); - -Returns ``true`` if the operator is approved to make ENS registry operations on behalf of the owner. - ----------- -Parameters ----------- - -1. ``owner`` - ``String``: The owner address. -2. ``operator`` - ``String``: The operator address. -3. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.isApprovedForAll('0x0...', '0x0...').then(function (isApproved) { - console.log(isApproved); - }) - > true - ------------------------------------------------------------------------------- - -recordExists -============ - -.. code-block:: javascript - - web3.eth.ens.recordExists(name [, callback]); - -Returns ``true`` if node exists in this ENS registry. -This will return ``false`` for records that are in the legacy ENS registry but have not yet been migrated to the new one. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.recordExists('0x0...', '0x0...').then(function (isExisting) { - console.log(isExisting); - }) - > true - ------------------------------------------------------------------------------- - -getAddress -===================== - -.. code-block:: javascript - - web3.eth.ens.getAddress(ENSName [, callback]); - -Resolves an ENS name to an Ethereum address. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name to resolve. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``String`` - The Ethereum address of the given name. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getAddress('ethereum.eth').then(function (address) { - console.log(address); - }) - > 0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359 - ------------------------------------------------------------------------------- - -setAddress -===================== - -.. code-block:: javascript - - web3.eth.ens.setAddress(ENSName, address [, txConfig ] [, callback]); - -Sets the address of an ENS name in this resolver. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``address`` - ``String``: The address to set. -3. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -4. ``callback`` - ``Function``: (optional) Optional callback - -Emits an ``AddrChanged`` event. - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setAddress( - 'ethereum.eth', - '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ).then(function (result) { - console.log(result.events); - }); - > AddrChanged(...) - - // Or using the event emitter - - web3.eth.ens.setAddress( - 'ethereum.eth', - '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ) - .on('transactionHash', function(hash){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ - ... - }) - .on('receipt', function(receipt){ - ... - }) - .on('error', console.error); - - // Or listen to the AddrChanged event on the resolver - - web3.eth.ens.resolver('ethereum.eth').then(function (resolver) { - resolver.events.AddrChanged({fromBlock: 0}, function(error, event) { - console.log(event); - }) - .on('data', function(event){ - console.log(event); - }) - .on('changed', function(event){ - // remove event from local database - }) - .on('error', console.error); - }); - - -For further information on the handling of contract events please see :ref:`here `. - ------------------------------------------------------------------------------- - -getPubkey -===================== - -.. code-block:: javascript - - web3.eth.ens.getPubkey(ENSName [, callback]); - -Returns the X and Y coordinates of the curve point for the public key. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise>`` - The X and Y coordinates. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getPubkey('ethereum.eth').then(function (result) { - console.log(result) - }); - > { - "0": "0x0000000000000000000000000000000000000000000000000000000000000000", - "1": "0x0000000000000000000000000000000000000000000000000000000000000000", - "x": "0x0000000000000000000000000000000000000000000000000000000000000000", - "y": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ------------------------------------------------------------------------------- - -setPubkey -===================== - -.. code-block:: javascript - - web3.eth.ens.setPubkey(ENSName, x, y [, txConfig ] [, callback]); - -Sets the SECP256k1 public key associated with an ENS node. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``x`` - ``String``: The X coordinate of the public key. -3. ``y`` - ``String``: The Y coordinate of the public key. -4. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -5. ``callback`` - ``Function``: (optional) Optional callback - -Emits an ``PubkeyChanged`` event. - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setPubkey( - 'ethereum.eth', - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000000', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ).then(function (result) { - console.log(result.events); - }); - > PubkeyChanged(...) - - // Or using the event emitter - - web3.eth.ens.setPubkey( - 'ethereum.eth', - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000000', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ) - .on('transactionHash', function(hash){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ - ... - }) - .on('receipt', function(receipt){ - ... - }) - .on('error', console.error); - - // Or listen to the PubkeyChanged event on the resolver - - web3.eth.ens.resolver('ethereum.eth').then(function (resolver) { - resolver.events.PubkeyChanged({fromBlock: 0}, function(error, event) { - console.log(event); - }) - .on('data', function(event){ - console.log(event); - }) - .on('changed', function(event){ - // remove event from local database - }) - .on('error', console.error); - }); - - -For further information on the handling of contract events please see :ref:`here `. - ------------------------------------------------------------------------------- - -getContent -===================== - -.. code-block:: javascript - - web3.eth.ens.getContent(ENSName [, callback]); - -Returns the content hash associated with an ENS node. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - The content hash associated with an ENS node. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getContent('ethereum.eth').then(function (result) { - console.log(result); - }); - > "0x0000000000000000000000000000000000000000000000000000000000000000" - ------------------------------------------------------------------------------- - -setContent -===================== - -.. code-block:: javascript - - web3.eth.ens.setContent(ENSName, hash [, txConfig ] [, callback]); - -Sets the content hash associated with an ENS node. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``hash`` - ``String``: The content hash to set. -3. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -4. ``callback`` - ``Function``: (optional) Optional callback - -Emits an ``ContentChanged`` event. - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setContent( - 'ethereum.eth', - '0x0000000000000000000000000000000000000000000000000000000000000000', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ).then(function (result) { - console.log(result.events); - }); - > ContentChanged(...) - - // Or using the event emitter - - web3.eth.ens.setContent( - 'ethereum.eth', - '0x0000000000000000000000000000000000000000000000000000000000000000', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ) - .on('transactionHash', function(hash){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ - ... - }) - .on('receipt', function(receipt){ - ... - }) - .on('error', console.error); - - // Or listen to the ContentChanged event on the resolver - - web3.eth.ens.resolver('ethereum.eth').then(function (resolver) { - resolver.events.ContentChanged({fromBlock: 0}, function(error, event) { - console.log(event); - }) - .on('data', function(event){ - console.log(event); - }) - .on('changed', function(event){ - // remove event from local database - }) - .on('error', console.error); - }); - - -For further information on the handling of contract events please see :ref:`here `. - ------------------------------------------------------------------------------- - -getContenthash -===================== - -.. code-block:: javascript - - web3.eth.ens.getContenthash(ENSName [, callback]); - -Returns the content hash object associated with an ENS node. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - The content hash object associated with an ENS node. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getContenthash('ethereum.eth').then(function (result) { - console.log(result); - }); - > { - "protocolType": "ipfs", - "decoded": "QmaEBknbGT4bTQiQoe2VNgBJbRfygQGktnaW5TbuKixjYL" - } - ------------------------------------------------------------------------------- - -setContenthash -===================== - -.. code-block:: javascript - - web3.eth.ens.setContenthash(ENSName, hash [, txConfig ] [, callback]); - -Sets the content hash associated with an ENS node. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``hash`` - ``String``: The content hash to set. -3. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -4. ``callback`` - ``Function``: (optional) Optional callback - -Emits a ``ContenthashChanged`` event. - -Supports the following protocols as valid ``hash`` inputs: - -1. ``ipfs://`` - ipfs://QmaEBknbGT4bTQiQoe2VNgBJbRfygQGktnaW5TbuKixjYL -2. ``/ipfs/`` - /ipfs/QmaEBknbGT4bTQiQoe2VNgBJbRfygQGktnaW5TbuKixjYL -3. ``bzz://`` - bzz://d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162 -4. ``onion://`` - onion://3g2upl4pq6kufc4m -5. ``onion3://`` - onion3://p53lf57qovyuvwsc6xnrppyply3vtqm7l6pcobkmyqsiofyeznfu5uqd - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setContenthash( - 'ethereum.eth', - 'ipfs://QmaEBknbGT4bTQiQoe2VNgBJbRfygQGktnaW5TbuKixjYL', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ).then(function (result) { - console.log(result.events); - }); - > ContenthashChanged(...) - - // Or using the event emitter - - web3.eth.ens.setContenthash( - 'ethereum.eth', - 'ipfs://QmaEBknbGT4bTQiQoe2VNgBJbRfygQGktnaW5TbuKixjYL', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ) - .on('transactionHash', function(hash){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ - ... - }) - .on('receipt', function(receipt){ - ... - }) - .on('error', console.error); - - // Or listen to the ContenthashChanged event on the resolver - - web3.eth.ens.resolver('ethereum.eth').then(function (resolver) { - resolver.events.ContenthashChanged({fromBlock: 0}, function(error, event) { - console.log(event); - }) - .on('data', function(event){ - console.log(event); - }) - .on('changed', function(event){ - // remove event from local database - }) - .on('error', console.error); - }); - - -For further information on the handling of contract events please see :ref:`here `. - - -getMultihash -===================== - -.. code-block:: javascript - - web3.eth.ens.getMultihash(ENSName [, callback]); - -Returns the multihash associated with an ENS node. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - The associated multihash. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.getMultihash('ethereum.eth').then(function (result) { - console.log(result); - }); - > 'QmXpSwxdmgWaYrgMUzuDWCnjsZo5RxphE3oW7VhTMSCoKK' - ------------------------------------------------------------------------------- - -supportsInterface -================= - -.. code-block:: javascript - - web3.eth.ens.supportsInterface(name, interfaceId [, callback]); - -Returns ``true`` if the related ``Resolver`` does support the given signature or interfaceId. - ----------- -Parameters ----------- - -1. ``name`` - ``String``: The ENS name. -2. ``interfaceId`` - ``String``: The signature of the function or the interfaceId as described in the ENS documentation -3. ``callback`` - ``Function``: (optional) Optional callback - -------- -Returns -------- - -``Promise`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.supportsInterface('ethereum.eth', 'addr(bytes32').then(function (result) { - console.log(result); - }); - > true - ------------------------------------------------------------------------------- - -setMultihash -===================== - -.. code-block:: javascript - - web3.eth.ens.setMultihash(ENSName, hash [, txConfig ] [, callback]); - -Sets the multihash associated with an ENS node. - ----------- -Parameters ----------- - -1. ``ENSName`` - ``String``: The ENS name. -2. ``hash`` - ``String``: The multihash to set. -3. ``txConfig`` - ``Object``: (optional) The transaction options as described :ref:`here ` -4. ``callback`` - ``Function``: (optional) Optional callback - -Emits an ``MultihashChanged``event. - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.setMultihash( - 'ethereum.eth', - 'QmXpSwxdmgWaYrgMUzuDWCnjsZo5RxphE3oW7VhTMSCoKK', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ).then(function (result) { - console.log(result.events); - }); - > MultihashChanged(...) - - // Or using the event emitter - - web3.eth.ens.setMultihash( - 'ethereum.eth', - 'QmXpSwxdmgWaYrgMUzuDWCnjsZo5RxphE3oW7VhTMSCoKK', - { - from: '0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c' - } - ) - .on('transactionHash', function(hash){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ - ... - }) - .on('receipt', function(receipt){ - ... - }) - .on('error', console.error); - - -For further information on the handling of contract events please see :ref:`here `. - ------------------------------------------------------------------------------- - -ENS events -===================== - -The ENS API provides the possibility for listening to all ENS related events. - ------------- -Known resolver events ------------- - -1. AddrChanged(node bytes32, a address) -1. ContentChanged(node bytes32, hash bytes32) -1. NameChanged(node bytes32, name string) -1. ABIChanged(node bytes32, contentType uint256) -1. PubkeyChanged(node bytes32, x bytes32, y bytes32) - -------- -Returns -------- - -``PromiEvent`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.resolver('ethereum.eth').then(function (resolver) { - resolver.events.AddrChanged({fromBlock: 0}, function(error, event) { - console.log(event); - }) - .on('data', function(event){ - console.log(event); - }) - .on('changed', function(event){ - // remove event from local database - }) - .on('error', console.error); - }); - > { - returnValues: { - node: '0x123456789...', - a: '0x123456789...', - }, - raw: { - data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - topics: [ - '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385' - ] - }, - event: 'AddrChanged', - signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - logIndex: 0, - transactionIndex: 0, - transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - blockNumber: 1234, - address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' - } - ------------- -Known registry events ------------- - -1. Transfer(node bytes32, owner address) -1. NewOwner(node bytes32, label bytes32, owner address) -1. NewResolver(node bytes32, resolver address) -1. NewTTL(node bytes32, ttl uint64) - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.ens.resistry.then(function (registry) { - registry.events.Transfer({fromBlock: 0}, , function(error, event) { - console.log(event); - }) - .on('data', function(event){ - console.log(event); - }) - .on('changed', function(event){ - // remove event from local database - }) - .on('error', console.error); - }); - > { - returnValues: { - node: '0x123456789...', - owner: '0x123456789...', - }, - raw: { - data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - topics: [ - '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385' - ] - }, - event: 'Transfer', - signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - logIndex: 0, - transactionIndex: 0, - transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - blockNumber: 1234, - address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' - } - - -For further information on the handling of contract events please see :ref:`here `. diff --git a/docs/web3-eth-iban.rst b/docs/web3-eth-iban.rst deleted file mode 100644 index 6ef06e06a3f..00000000000 --- a/docs/web3-eth-iban.rst +++ /dev/null @@ -1,581 +0,0 @@ -.. _eth-iban: - -========= -web3.eth.Iban -========= - -The ``web3.eth.Iban`` function converts Ethereum addresses from and to IBAN and BBAN. - ------------------------------------------------------------------------------- - -Iban instance -===================== - -This instance of Iban. - -.. code-block:: javascript - - > Iban { _iban: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS' } - ------------------------------------------------------------------------------- - -Iban contructor -===================== - -.. code-block:: javascript - - new web3.eth.Iban(ibanAddress) - -Generates a iban object with conversion methods and validity checks. - -Also has singleton functions for conversion like: - -- :ref:`Iban.toAddress() ` -- :ref:`Iban.toIban() ` -- :ref:`Iban.fromAddress() ` -- :ref:`Iban.fromBban() ` -- :ref:`Iban.createIndirect() ` -- :ref:`Iban.isValid() ` - ----------- -Parameters ----------- - -1. ``String``: the IBAN address to instantiate an Iban instance from. - -------- -Returns -------- - -``Object`` - The Iban instance. - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban("XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"); - > Iban { _iban: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS' } - - ------------------------------------------------------------------------------- - -.. _eth-iban-toaddress: - -toAddress -===================== - -Static function. - -.. code-block:: javascript - - web3.eth.Iban.toAddress(ibanAddress) - -Singleton: Converts a direct IBAN address into an Ethereum address. - -.. note:: This method also exists on the IBAN instance. - ----------- -Parameters ----------- - -1. ``String``: the IBAN address to convert. - -------- -Returns -------- - -``String`` - The Ethereum address. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.Iban.toAddress("XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"); - > "0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8" - - ------------------------------------------------------------------------------- - -.. _eth-iban-toiban: - -toIban -===================== - -Static function. - -.. code-block:: javascript - - web3.eth.Iban.toIban(address) - -Singleton: Converts an Ethereum address to a direct IBAN address. - ----------- -Parameters ----------- - -1. ``String``: the Ethereum address to convert. - -------- -Returns -------- - -``String`` - The IBAN address. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.Iban.toIban("0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8"); - > "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS" - - ------------------------------------------------------------------------------- - -.. _eth-iban-fromaddress: - -fromAddress -===================== - -Static function, returns IBAN instance. - -.. code-block:: javascript - - web3.eth.Iban.fromAddress(address) - -Singleton: Converts an Ethereum address to a direct IBAN instance. - ----------- -Parameters ----------- - -1. ``String``: the Ethereum address to convert. - -------- -Returns -------- - -``Object`` - The IBAN instance. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.Iban.fromAddress("0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8"); - > Iban {_iban: "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"} - - ------------------------------------------------------------------------------- - -.. _eth-iban-frombban: - - static function, return IBAN instance - -fromBban -===================== - -.. code-block:: javascript - - web3.eth.Iban.fromBban(bbanAddress) - -Singleton: Converts an BBAN address to a direct IBAN instance. - ----------- -Parameters ----------- - -1. ``String``: the BBAN address to convert. - -------- -Returns -------- - -``Object`` - The IBAN instance. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.Iban.fromBban('ETHXREGGAVOFYORK'); - > Iban {_iban: "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"} - - ------------------------------------------------------------------------------- - -.. _eth-iban-createindirect: - - static function, return IBAN instance - -createIndirect -===================== - -.. code-block:: javascript - - web3.eth.Iban.createIndirect(options) - -Singleton: Creates an indirect IBAN address from an institution and identifier. - ----------- -Parameters ----------- - -1. ``Object``: the options object as follows: - - ``institution`` - ``String``: the institution to be assigned. - - ``identifier`` - ``String``: the identifier to be assigned. - -------- -Returns -------- - -``Object`` - The IBAN instance. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.Iban.createIndirect({ - institution: "XREG", - identifier: "GAVOFYORK" - }); - > Iban {_iban: "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"} - - ------------------------------------------------------------------------------- - -.. _eth-iban-isvalid: - -Static function, returns boolean. - -isValid -===================== - -.. code-block:: javascript - - web3.eth.Iban.isValid(ibanAddress) - -Singleton: Checks if an IBAN address is valid. - -.. note:: This method also exists on the IBAN instance. - ----------- -Parameters ----------- - -1. ``String``: the IBAN address to check. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.Iban.isValid("XE81ETHXREGGAVOFYORK"); - > true - - web3.eth.Iban.isValid("XE82ETHXREGGAVOFYORK"); - > false // because the checksum is incorrect - - ------------------------------------------------------------------------------- - -prototype.isValid -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.isValid() - -Singleton: Checks if an IBAN address is valid. - -.. note:: This method also exists on the IBAN instance. - ----------- -Parameters ----------- - -1. ``String``: the IBAN address to check. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); - iban.isValid(); - > true - - ------------------------------------------------------------------------------- - -prototype.isDirect -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.isDirect() - -Checks if the IBAN instance is direct. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); - iban.isDirect(); - > false - ------------------------------------------------------------------------------- - -prototype.isIndirect -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.isIndirect() - -Checks if the IBAN instance is indirect. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); - iban.isIndirect(); - > true - ------------------------------------------------------------------------------- - -prototype.checksum -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.checksum() - -Returns the checksum of the IBAN instance. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``String``: The checksum of the IBAN - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); - iban.checksum(); - > "81" - - ------------------------------------------------------------------------------- - -prototype.institution -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.institution() - -Returns the institution of the IBAN instance. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``String``: The institution of the IBAN - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); - iban.institution(); - > 'XREG' - - ------------------------------------------------------------------------------- - -prototype.client -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.client() - -Returns the client of the IBAN instance. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``String``: The client of the IBAN - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); - iban.client(); - > 'GAVOFYORK' - ------------------------------------------------------------------------------- - -prototype.toAddress -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.toString() - -Returns the Ethereum address of the IBAN instance. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``String``: The Ethereum address of the IBAN - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban('XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'); - iban.toAddress(); - > '0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8' - - ------------------------------------------------------------------------------- - -prototype.toString -===================== - -Method of Iban instance. - -.. code-block:: javascript - - web3.eth.Iban.prototype.toString() - -Returns the IBAN address of the IBAN instance. - ----------- -Parameters ----------- - -none - -------- -Returns -------- - -``String``: The IBAN address. - -------- -Example -------- - -.. code-block:: javascript - - var iban = new web3.eth.Iban('XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'); - iban.toString(); - > 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS' - diff --git a/docs/web3-eth-net.rst b/docs/web3-eth-net.rst deleted file mode 100644 index b32284c04e7..00000000000 --- a/docs/web3-eth-net.rst +++ /dev/null @@ -1,51 +0,0 @@ -.. _eth-net: - -========= -web3.eth.net -========= - - -Contains functions to get information about the current network. - - ------------------------------------------------------------------------------- - - -.. include:: include_package-net.rst - - ------------------------------------------------------------------------------- - -getNetworkType -===================== - -.. code-block:: javascript - - web3.eth.net.getNetworkType([callback]) - -Guesses the chain the node is connected by comparing the genesis hashes. - -.. note:: It's recommended to use the :ref:`web3.eth.getChainId ` method to detect the currently connected chain. - -------- -Returns -------- - -``Promise`` returns ``String``: - - ``"main"`` for main network - - ``"morden"`` for the morden test network - - ``"ropsten"`` for the morden test network - - ``"private"`` for undetectable networks. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.net.getNetworkType() - .then(console.log); - > "main" - - diff --git a/docs/web3-eth-personal.rst b/docs/web3-eth-personal.rst deleted file mode 100644 index acc91fb9122..00000000000 --- a/docs/web3-eth-personal.rst +++ /dev/null @@ -1,441 +0,0 @@ -.. _eth-personal: - -======== -web3.eth.personal -======== - - -The ``web3-eth-personal`` package allows you to interact with the Ethereum node's accounts. - -.. note:: Many of these functions send sensitive information like passwords. Never call these functions over a unsecured Websocket or HTTP provider, as your password will be sent in plain text! - - -.. code-block:: javascript - - var Personal = require('web3-eth-personal'); - - // "Personal.providers.givenProvider" will be set if in an Ethereum supported browser. - var personal = new Personal(Personal.givenProvider || 'ws://some.local-or-remote.node:8546'); - - - // or using the web3 umbrella package - - var Web3 = require('web3'); - var web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); - - // -> web3.eth.personal - - ------------------------------------------------------------------------------- - - -.. include:: include_package-core.rst - - - ------------------------------------------------------------------------------- - - - -newAccount -========= - -.. code-block:: javascript - - web3.eth.personal.newAccount(password, [callback]) - -Creates a new account. - -.. note:: Never call this function over a unsecured Websocket or HTTP provider, as your password will be sent in plain text! - ----------- -Parameters ----------- - -1. ``password`` - ``String``: The password to encrypt this account with. - -------- -Returns -------- - -``Promise`` returns ``String``: The address of the newly created account. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.personal.newAccount('!@superpassword') - .then(console.log); - > '0x1234567891011121314151617181920212223456' - ------------------------------------------------------------------------------- - - -sign -===================== - -.. code-block:: javascript - - web3.eth.personal.sign(dataToSign, address, password [, callback]) - -The sign method calculates an Ethereum specific signature with: - -.. code-block:: javascript - - sign(keccak256("\x19Ethereum Signed Message:\n" + dataToSign.length + dataToSign))) - -Adding a prefix to the message makes the calculated signature recognisable as an Ethereum specific signature. - -If you have the original message and the signed message, you can discover the signing account address -using :ref:`web3.eth.personal.ecRecover `. See example below. - - -.. note:: Sending your account password over an unsecured HTTP RPC connection is highly unsecure. - ----------- -Parameters ----------- - - -1. ``String`` - Data to sign. If String it will be converted using :ref:`web3.utils.utf8ToHex `. -2. ``String`` - Address to sign data with. -3. ``String`` - The password of the account to sign data with. -4. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` returns ``String`` - The signature. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.personal.sign("Hello world", "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", "test password!") - .then(console.log); - > "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400" - - // the below is the same - web3.eth.personal.sign(web3.utils.utf8ToHex("Hello world"), "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", "test password!") - .then(console.log); - > "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400" - - // recover the signing account address using original message and signed message - web3.eth.personal.ecRecover("Hello world", "0x30755ed65396...etc...") - .then(console.log); - > "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe" - - ------------------------------------------------------------------------------- - - -ecRecover -===================== - -.. code-block:: javascript - - web3.eth.personal.ecRecover(dataThatWasSigned, signature [, callback]) - -Recovers the account that signed the data. - ----------- -Parameters ----------- - - -1. ``String`` - Data that was signed. If String it will be converted using :ref:`web3.utils.utf8ToHex `. -2. ``String`` - The signature. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` returns ``String`` - The account. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.personal.ecRecover("Hello world", "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400").then(console.log); - > "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe" - ------------------------------------------------------------------------------- - -signTransaction -===================== - -.. code-block:: javascript - - web3.eth.personal.signTransaction(transaction, password [, callback]) - -Signs a transaction. This account needs to be unlocked. - -.. note:: Sending your account password over an unsecured HTTP RPC connection is highly unsecure. - ----------- -Parameters ----------- - - -1. ``Object`` - The transaction data to sign :ref:`web3.eth.sendTransaction() ` for more. -2. ``String`` - The password of the ``from`` account, to sign the transaction with. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` returns ``Object`` - The RLP encoded transaction. The ``raw`` property can be used to send the transaction using :ref:`web3.eth.sendSignedTransaction `. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.signTransaction({ - from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", - gasPrice: "20000000000", - gas: "21000", - to: '0x3535353535353535353535353535353535353535', - value: "1000000000000000000", - data: "" - }, 'MyPassword!').then(console.log); - > { - raw: '0xf86c808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a04f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88da07e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', - tx: { - nonce: '0x0', - gasPrice: '0x4a817c800', - gas: '0x5208', - to: '0x3535353535353535353535353535353535353535', - value: '0xde0b6b3a7640000', - input: '0x', - v: '0x25', - r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', - s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', - hash: '0xda3be87732110de6c1354c83770aae630ede9ac308d9f7b399ecfba23d923384' - } - } - ------------------------------------------------------------------------------- - -sendTransaction -===================== - -.. code-block:: javascript - - web3.eth.personal.sendTransaction(transactionOptions, password [, callback]) - -This method sends a transaction over the management API. - -.. note:: Sending your account password over an unsecured HTTP RPC connection is highly unsecure. - ----------- -Parameters ----------- - - -1. ``Object`` - The transaction options -2. ``String`` - The passphrase for the current account -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` - The transaction hash. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.sendTransaction({ - from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", - gasPrice: "20000000000", - gas: "21000", - to: '0x3535353535353535353535353535353535353535', - value: "1000000000000000000", - data: "" - }, 'MyPassword!').then(console.log); - > '0xda3be87732110de6c1354c83770aae630ede9ac308d9f7b399ecfba23d923384' - ------------------------------------------------------------------------------- - - -unlockAccount -===================== - -.. code-block:: javascript - - web3.eth.personal.unlockAccount(address, password, unlockDuraction [, callback]) - -Signs data using a specific account. - -.. note:: Sending your account password over an unsecured HTTP RPC connection is highly unsecure. - ----------- -Parameters ----------- - - -1. ``address`` - ``String``: The account address. -2. ``password`` - ``String`` - The password of the account. -3. ``unlockDuration`` - ``Number`` - The duration for the account to remain unlocked. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.personal.unlockAccount("0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", "test password!", 600) - .then(console.log('Account unlocked!')); - > "Account unlocked!" - ------------------------------------------------------------------------------- - -lockAccount -===================== - -.. code-block:: javascript - - web3.eth.personal.lockAccount(address [, callback]) - -Locks the given account. - -.. note:: Sending your account password over an unsecured HTTP RPC connection is highly unsecure. - ----------- -Parameters ----------- - - -1. ``address`` - ``String``: The account address. -4. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.personal.lockAccount("0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe") - .then(console.log('Account locked!')); - > "Account locked!" - ------------------------------------------------------------------------------- - -.. _personal-getaccounts: - -getAccounts -===================== - -.. code-block:: javascript - - web3.eth.personal.getAccounts([callback]) - -Returns a list of accounts the node controls by using the provider and calling -the RPC method ``personal_listAccounts``. Using :ref:`web3.eth.accounts.create() ` -will not add accounts into this list. For that use -:ref:`web3.eth.personal.newAccount() `. - -The results are the same as :ref:`web3.eth.getAccounts() ` except that calls the RPC method ``eth_accounts``. - -------- -Returns -------- - - -``Promise`` - An array of addresses controlled by node. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.personal.getAccounts() - .then(console.log); - > ["0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", "0xDCc6960376d6C6dEa93647383FfB245CfCed97Cf"] - ------------------------------------------------------------------------------- - -importRawKey -===================== - -.. code-block:: javascript - - web3.eth.personal.importRawKey(privateKey, password) - -Imports the given private key into the key store, encrypting it with the passphrase. - -Returns the address of the new account. - -.. note:: Sending your account password over an unsecured HTTP RPC connection is highly unsecure. - ----------- -Parameters ----------- - - -1. ``privateKey`` - ``String`` - An unencrypted private key (hex string). -2. ``password`` - ``String`` - The password of the account. - - -------- -Returns -------- - - -``Promise`` - The address of the account. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.personal.importRawKey("cd3376bb711cb332ee3fb2ca04c6a8b9f70c316fcdf7a1f44ef4c7999483295e", "password1234") - .then(console.log); - > "0x8f337bf484b2fc75e4b0436645dcc226ee2ac531" - - diff --git a/docs/web3-eth-subscribe.rst b/docs/web3-eth-subscribe.rst deleted file mode 100644 index 886754351c8..00000000000 --- a/docs/web3-eth-subscribe.rst +++ /dev/null @@ -1,386 +0,0 @@ -.. _eth-subscribe: - -========= -web3.eth.subscribe -========= - -The ``web3.eth.subscribe`` function lets you subscribe to specific events in the blockchain. - - -subscribe -===================== - -.. code-block:: javascript - - web3.eth.subscribe(type [, options] [, callback]); - ----------- -Parameters ----------- - -1. ``String`` - The subscription you want to subscribe to. -2. ``Mixed`` - (optional) Optional additional parameters, depending on the subscription type. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. Will be called for each incoming subscription, and the subscription itself as the 3rd parameter. - -.. _eth-subscription-return: - -------- -Returns -------- - -``EventEmitter`` - A Subscription instance - - - ``subscription.id``: The subscription id, used to identify and unsubscribing the subscription. - - ``subscription.subscribe([callback])``: Can be used to re-subscribe with the same parameters. - - ``subscription.unsubscribe([callback])``: Unsubscribes the subscription and returns `TRUE` in the callback if successful. - - ``subscription.arguments``: The subscription arguments, used when re-subscribing. - - ``on("data")`` returns ``Object``: Fires on each incoming log with the log object as argument. - - ``on("changed")`` returns ``Object``: Fires on each log which was removed from the blockchain. The log will have the additional property ``"removed: true"``. - - ``on("error")`` returns ``Object``: Fires when an error in the subscription occurs. - - ``on("connected")`` returns ``String``: Fires once after the subscription successfully connected. Returns the subscription id. - ----------------- -Notification returns ----------------- - -- ``Mixed`` - depends on the subscription, see the different subscriptions for more. - -------- -Example -------- - -.. code-block:: javascript - - var subscription = web3.eth.subscribe('logs', { - address: '0x123456..', - topics: ['0x12345...'] - }, function(error, result){ - if (!error) - console.log(result); - }); - - // unsubscribes the subscription - subscription.unsubscribe(function(error, success){ - if(success) - console.log('Successfully unsubscribed!'); - }); - - ------------------------------------------------------------------------------- - - -clearSubscriptions -===================== - -.. code-block:: javascript - - web3.eth.clearSubscriptions() - -Resets subscriptions. - -.. note:: This will not reset subscriptions from other packages like ``web3-shh``, as they use their own requestManager. - ----------- -Parameters ----------- - -1. ``Boolean``: If ``true`` it keeps the ``"syncing"`` subscription. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.subscribe('logs', {} ,function(){ ... }); - - ... - - web3.eth.clearSubscriptions(); - - ------------------------------------------------------------------------------- - - -subscribe("pendingTransactions") -===================== - -.. code-block:: javascript - - web3.eth.subscribe('pendingTransactions' [, callback]); - -Subscribes to incoming pending transactions. - ----------- -Parameters ----------- - -1. ``String`` - ``"pendingTransactions"``, the type of the subscription. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. Will be called for each incoming subscription. - -------- -Returns -------- - -``EventEmitter``: An :ref:`subscription instance ` as an event emitter with the following events: - -- ``"data"`` returns ``String``: Fires on each incoming pending transaction and returns the transaction hash. -- ``"error"`` returns ``Object``: Fires when an error in the subscription occurs. - ----------------- -Notification returns ----------------- - -1. ``Object|Null`` - First parameter is an error object if the subscription failed. -2. ``String`` - Second parameter is the transaction hash. - -------- -Example -------- - - -.. code-block:: javascript - - var subscription = web3.eth.subscribe('pendingTransactions', function(error, result){ - if (!error) - console.log(result); - }) - .on("data", function(transaction){ - console.log(transaction); - }); - - // unsubscribes the subscription - subscription.unsubscribe(function(error, success){ - if(success) - console.log('Successfully unsubscribed!'); - }); - - ------------------------------------------------------------------------------- - - -subscribe("newBlockHeaders") -===================== - -.. code-block:: javascript - - web3.eth.subscribe('newBlockHeaders' [, callback]); - -Subscribes to incoming block headers. This can be used as timer to check for changes on the blockchain. - ----------- -Parameters ----------- - -1. ``String`` - ``"newBlockHeaders"``, the type of the subscription. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. Will be called for each incoming subscription. - -------- -Returns -------- - -``EventEmitter``: An :ref:`subscription instance ` as an event emitter with the following events: - -- ``"data"`` returns ``Object``: Fires on each incoming block header. -- ``"error"`` returns ``Object``: Fires when an error in the subscription occurs. -- ``"connected"`` returns ``Number``: Fires once after the subscription successfully connected. Returns the subscription id. - -The structure of a returned block header is as follows: - - - ``number`` - ``Number``: The block number. ``null`` when its pending block. - - ``hash`` 32 Bytes - ``String``: Hash of the block. ``null`` when its pending block. - - ``parentHash`` 32 Bytes - ``String``: Hash of the parent block. - - ``nonce`` 8 Bytes - ``String``: Hash of the generated proof-of-work. ``null`` when its pending block. - - ``sha3Uncles`` 32 Bytes - ``String``: SHA3 of the uncles data in the block. - - ``logsBloom`` 256 Bytes - ``String``: The bloom filter for the logs of the block. ``null`` when its pending block. - - ``transactionsRoot`` 32 Bytes - ``String``: The root of the transaction trie of the block - - ``stateRoot`` 32 Bytes - ``String``: The root of the final state trie of the block. - - ``receiptsRoot`` 32 Bytes - ``String``: The root of the receipts. - - ``miner`` - ``String``: The address of the beneficiary to whom the mining rewards were given. - - ``extraData`` - ``String``: The "extra data" field of this block. - - ``gasLimit`` - ``Number``: The maximum gas allowed in this block. - - ``gasUsed`` - ``Number``: The total used gas by all transactions in this block. - - ``timestamp`` - ``Number``: The unix timestamp for when the block was collated. - ----------------- -Notification returns ----------------- - -1. ``Object|Null`` - First parameter is an error object if the subscription failed. -2. ``Object`` - The block header object like above. - -------- -Example -------- - - -.. code-block:: javascript - - var subscription = web3.eth.subscribe('newBlockHeaders', function(error, result){ - if (!error) { - console.log(result); - - return; - } - - console.error(error); - }) - .on("connected", function(subscriptionId){ - console.log(subscriptionId); - }) - .on("data", function(blockHeader){ - console.log(blockHeader); - }) - .on("error", console.error); - - // unsubscribes the subscription - subscription.unsubscribe(function(error, success){ - if (success) { - console.log('Successfully unsubscribed!'); - } - }); - ------------------------------------------------------------------------------- - - -subscribe("syncing") -===================== - -.. code-block:: javascript - - web3.eth.subscribe('syncing' [, callback]); - -Subscribe to syncing events. This will return an object when the node is syncing and when it's finished syncing will return ``FALSE``. - ----------- -Parameters ----------- - -1. ``String`` - ``"syncing"``, the type of the subscription. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. Will be called for each incoming subscription. - -------- -Returns -------- - -``EventEmitter``: An :ref:`subscription instance ` as an event emitter with the following events: - -- ``"data"`` returns ``Object``: Fires on each incoming sync object as argument. -- ``"changed"`` returns ``Object``: Fires when the synchronisation is started with ``true`` and when finished with ``false``. -- ``"error"`` returns ``Object``: Fires when an error in the subscription occurs. - -For the structure of a returned event ``Object`` see :ref:`web3.eth.isSyncing return values `. - ----------------- -Notification returns ----------------- - -1. ``Object|Null`` - First parameter is an error object if the subscription failed. -2. ``Object|Boolean`` - The syncing object, when started it will return ``true`` once or when finished it will return `false` once. - -------- -Example -------- - - -.. code-block:: javascript - - var subscription = web3.eth.subscribe('syncing', function(error, sync){ - if (!error) - console.log(sync); - }) - .on("data", function(sync){ - // show some syncing stats - }) - .on("changed", function(isSyncing){ - if(isSyncing) { - // stop app operation - } else { - // regain app operation - } - }); - - // unsubscribes the subscription - subscription.unsubscribe(function(error, success){ - if(success) - console.log('Successfully unsubscribed!'); - }); - ------------------------------------------------------------------------------- - - -subscribe("logs") -===================== - -.. code-block:: javascript - - web3.eth.subscribe('logs', options [, callback]); - -Subscribes to incoming logs, filtered by the given options. -If a valid numerical ``fromBlock`` options property is set, Web3 will retrieve logs beginning from this point, backfilling the response as necessary. - ----------- -Parameters ----------- - -1. ``"logs"`` - ``String``, the type of the subscription. -2. ``Object`` - The subscription options - - ``fromBlock`` - ``Number``: The number of the earliest block. By default ``null``. - - ``address`` - ``String|Array``: An address or a list of addresses to only get logs from particular account(s). - - ``topics`` - ``Array``: An array of values which must each appear in the log entries. The order is important, if you want to leave topics out use ``null``, e.g. ``[null, '0x00...']``. You can also pass another array for each topic with options for that topic e.g. ``[null, ['option1', 'option2']]`` -3. ``callback`` - ``Function``: (optional) Optional callback, returns an error object as first parameter and the result as second. Will be called for each incoming subscription. - -------- -Returns -------- - -``EventEmitter``: A :ref:`subscription instance ` as an event emitter with the following events: - -- ``"data"`` returns ``Object``: Fires on each incoming log with the log object as argument. -- ``"changed"`` returns ``Object``: Fires on each log which was removed from the blockchain. The log will have the additional property ``"removed: true"``. -- ``"error"`` returns ``Object``: Fires when an error in the subscription occurs. -- ``"connected"`` returns ``Number``: Fires once after the subscription successfully connected. Returns the subscription id. - -For the structure of a returned event ``Object`` see :ref:`web3.eth.getPastEvents return values `. - ----------------- -Notification returns ----------------- - -1. ``Object|Null`` - First parameter is an error object if the subscription failed. -2. ``Object`` - The log object like in :ref:`web3.eth.getPastEvents return values `. - -------- -Example -------- - - -.. code-block:: javascript - - var subscription = web3.eth.subscribe('logs', { - address: '0x123456..', - topics: ['0x12345...'] - }, function(error, result){ - if (!error) - console.log(result); - }) - .on("connected", function(subscriptionId){ - console.log(subscriptionId); - }) - .on("data", function(log){ - console.log(log); - }) - .on("changed", function(log){ - }); - - // unsubscribes the subscription - subscription.unsubscribe(function(error, success){ - if(success) - console.log('Successfully unsubscribed!'); - }); diff --git a/docs/web3-eth.rst b/docs/web3-eth.rst deleted file mode 100644 index 81c9b3771f8..00000000000 --- a/docs/web3-eth.rst +++ /dev/null @@ -1,2076 +0,0 @@ -.. _eth: - -======== -web3.eth -======== - -The ``web3-eth`` package allows you to interact with an Ethereum blockchain and Ethereum smart contracts. - - -.. code-block:: javascript - - var Eth = require('web3-eth'); - - // "Eth.providers.givenProvider" will be set if in an Ethereum supported browser. - var eth = new Eth(Eth.givenProvider || 'ws://some.local-or-remote.node:8546'); - - - // or using the web3 umbrella package - - var Web3 = require('web3'); - var web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); - - // -> web3.eth - - -Note on checksum addresses -======= - -All Ethereum addresses returned by functions of this package are returned as checksum addresses. -This means some letters are uppercase and some are lowercase. -Based on that it will calculate a checksum for the address and prove its correctness. -Incorrect checksum addresses will throw an error when passed into functions. -If you want to circumvent the checksum check you can make an address all lower- or uppercase. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.getAccounts(console.log); - > ["0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe" ,"0x85F43D8a49eeB85d32Cf465507DD71d507100C1d"] - - ------------------------------------------------------------------------------- - - -subscribe -===================== - -For ``web3.eth.subscribe`` see the :ref:`Subscribe reference documentation `. - - ------------------------------------------------------------------------------- - - -Contract -===================== - -For ``web3.eth.Contract`` see the :ref:`Contract reference documentation `. - - ------------------------------------------------------------------------------- - - -Iban -===================== - -For ``web3.eth.Iban`` see the :ref:`Iban reference documentation `. - - ------------------------------------------------------------------------------- - - -personal -===================== - -For ``web3.eth.personal`` see the :ref:`personal reference documentation `. - - ------------------------------------------------------------------------------- - -accounts -===================== - -For ``web3.eth.accounts`` see the :ref:`accounts reference documentation `. - - ------------------------------------------------------------------------------- - -ens -===================== - -For ``web3.eth.ens`` see the :ref:`ENS reference documentation `. - - - ------------------------------------------------------------------------------- - -abi -===================== - -For ``web3.eth.abi`` see the :ref:`ABI reference documentation `. - - ------------------------------------------------------------------------------- - - -net -===================== - -For ``web3.eth.net`` see the :ref:`net reference documentation `. - - ------------------------------------------------------------------------------- - - -.. include:: include_package-core.rst - - ------------------------------------------------------------------------------- - -.. _eth-defaultaccount - -defaultAccount -===================== - -.. code-block:: javascript - - web3.eth.defaultAccount - -This default address is used as the default ``"from"`` property, if no ``"from"`` property is specified in for the following methods: - -- :ref:`web3.eth.sendTransaction() ` -- :ref:`web3.eth.call() ` -- :ref:`new web3.eth.Contract() -> myContract.methods.myMethod().call() ` -- :ref:`new web3.eth.Contract() -> myContract.methods.myMethod().send() ` - --------- -Property --------- - - -``String`` - 20 Bytes: Any ethereum address. You should have the private key for that address in your node or keystore. (Default is ``undefined``) - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.defaultAccount; - > undefined - - // set the default account - web3.eth.defaultAccount = '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'; - - ------------------------------------------------------------------------------- - -.. _eth-defaultblock: - -defaultBlock -===================== - -.. code-block:: javascript - - web3.eth.defaultBlock - -The default block is used for certain methods. You can override it by passing in the defaultBlock as last parameter. -The default value is ``"latest"``. - -- :ref:`web3.eth.getBalance() ` -- :ref:`web3.eth.getCode() ` -- :ref:`web3.eth.getTransactionCount() ` -- :ref:`web3.eth.getStorageAt() ` -- :ref:`web3.eth.call() ` -- :ref:`new web3.eth.Contract() -> myContract.methods.myMethod().call() ` - ----------- -Property ----------- - - -Default block parameters can be one of the following: - -- ``Number|BN|BigNumber``: A block number -- ``"earliest"`` - ``String``: The genesis block -- ``"latest"`` - ``String``: The latest block (current head of the blockchain) -- ``"pending"`` - ``String``: The currently mined block (including pending transactions) - -Default is ``"latest"`` - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.defaultBlock; - > "latest" - - // set the default block - web3.eth.defaultBlock = 231; - - ------------------------------------------------------------------------------- -.. _eth-defaulthardfork: - -defaultHardfork -===================== - -.. code-block:: javascript - - web3.eth.defaultHardfork - -The default hardfork property is used for signing transactions locally. - ----------- -Property ----------- - - -The default hardfork property can be one of the following: - -- ``"chainstart"`` - ``String`` -- ``"homestead"`` - ``String`` -- ``"dao"`` - ``String`` -- ``"tangerineWhistle"`` - ``String`` -- ``"spuriousDragon"`` - ``String`` -- ``"byzantium"`` - ``String`` -- ``"constantinople"`` - ``String`` -- ``"petersburg"`` - ``String`` -- ``"istanbul"`` - ``String`` - -Default is ``"petersburg"`` - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.defaultHardfork; - > "petersburg" - - // set the default block - web3.eth.defaultHardfork = 'istanbul'; - - ------------------------------------------------------------------------------- -.. _eth-defaultchain: - -defaultChain -===================== - -.. code-block:: javascript - - web3.eth.defaultChain - -The default chain property is used for signing transactions locally. - ----------- -Property ----------- - - -The default chain property can be one of the following: - -- ``"mainnet"`` - ``String`` -- ``"goerli"`` - ``String`` -- ``"kovan"`` - ``String`` -- ``"rinkeby"`` - ``String`` -- ``"ropsten"`` - ``String`` - -Default is ``"mainnet"`` - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.defaultChain; - > "mainnet" - - // set the default chain - web3.eth.defaultChain = 'goerli'; - - ------------------------------------------------------------------------------- -.. _eth-defaultcommon: - -defaultCommon -===================== - -.. code-block:: javascript - - web3.eth.defaultCommon - -The default common property is used for signing transactions locally. - ----------- -Property ----------- - - -The default common property does contain the following ``Common`` object: - -- ``customChain`` - ``Object``: The custom chain properties - - ``name`` - ``string``: (optional) The name of the chain - - ``networkId`` - ``number``: Network ID of the custom chain - - ``chainId`` - ``number``: Chain ID of the custom chain -- ``baseChain`` - ``string``: (optional) ``mainnet``, ``goerli``, ``kovan``, ``rinkeby``, or ``ropsten`` -- ``hardfork`` - ``string``: (optional) ``chainstart``, ``homestead``, ``dao``, ``tangerineWhistle``, ``spuriousDragon``, ``byzantium``, ``constantinople``, ``petersburg``, or ``istanbul`` - - -Default is ``undefined``. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.defaultCommon; - > {customChain: {name: 'custom-network', chainId: 1, networkId: 1}, baseChain: 'mainnet', hardfork: 'petersburg'} - - // set the default common - web3.eth.defaultCommon = {customChain: {name: 'custom-network', chainId: 1, networkId: 1}, baseChain: 'mainnet', hardfork: 'petersburg'}; - - ------------------------------------------------------------------------------- - -.. _web3-module-transactionblocktimeout: - -transactionBlockTimeout -===================== - -.. code-block:: javascript - - web3.eth.transactionBlockTimeout - -The ``transactionBlockTimeout`` is used over socket-based connections. This option defines the amount of new blocks it should wait until the first confirmation happens, otherwise the PromiEvent rejects with a timeout error. - - -------- -Returns -------- - -``number``: The current value of transactionBlockTimeout (default: 50) - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.transactionBlockTimeout; - > 50 - - // set the transaction block timeout - web3.eth.transactionBlockTimeout = 100; - - ------------------------------------------------------------------------------- - -.. _web3-module-transactionconfirmationblocks: - -transactionConfirmationBlocks -===================== - -.. code-block:: javascript - - web3.eth.transactionConfirmationBlocks - -This defines the number of blocks it requires until a transaction is considered confirmed. - - -------- -Returns -------- - -``number``: The current value of transactionConfirmationBlocks (default: 24) - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.transactionConfirmationBlocks; - > 24 - - // set the transaction confirmations blocks - web3.eth.transactionConfirmationBlocks = 50; - - ------------------------------------------------------------------------------- - -.. _web3-module-transactionpollingtimeout: - -transactionPollingTimeout -===================== - -.. code-block:: javascript - - web3.eth.transactionPollingTimeout - -The ``transactionPollingTimeout`` is used over HTTP connections. This option defines the number of seconds Web3 will wait for a receipt which confirms that a transaction was mined by the network. Note: If this method times out, the transaction may still be pending. - - -------- -Returns -------- - -``number``: The current value of transactionPollingTimeout (default: 750) - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.transactionPollingTimeout; - > 750 - - // set the transaction polling timeout - web3.eth.transactionPollingTimeout = 1000; - - ------------------------------------------------------------------------------- - -.. _web3-module-handlerevert: - -handleRevert -============ - -.. code-block:: javascript - - web3.eth.handleRevert - -The ``handleRevert`` options property defaults to ``false`` and returns the revert reason string if enabled for the following methods: - -- :ref:`web3.eth.call() ` -- :ref:`web3.eth.sendTransaction() ` -- :ref:`contract.methods.myMethod(...).send(...) ` -- :ref:`contract.methods.myMethod(...).call(...) ` - -.. note:: The revert reason string and signature exist as a property on the returned error. - -------- -Returns -------- - -``boolean``: The current value of ``handleRevert`` (default: false) - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.handlRevert; - > false - - // turn revert handling on - web3.eth.handleRevert = true; - - ------------------------------------------------------------------------------- - -.. _web3-module-maxListenersWarningThreshold: - -maxListenersWarningThreshold -===================== - -.. code-block:: javascript - - web3.eth.maxListenersWarningThreshold - -This defines the threshold above which a warning about the number of event listeners -attached to a provider which supports sockets subscriptions will be written to the console. -You may see this warning if you call ``setProvider`` on large numbers of Web3 contract objects. - -------- -Returns -------- - -``number``: The current value of maxListenersWarningThreshold (default: 100) - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.maxListenersWarningThreshold; - > 100 - - // set the max listeners warning threshold - web3.eth.maxListenersWarningThreshold = 200; - ------------------------------------------------------------------------------- - -getProtocolVersion -===================== - -.. code-block:: javascript - - web3.eth.getProtocolVersion([callback]) - -Returns the ethereum protocol version of the node. - -------- -Returns -------- - -``Promise`` returns ``String``: the protocol version. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.getProtocolVersion() - .then(console.log); - > "63" - - ------------------------------------------------------------------------------- - - -isSyncing -===================== - -.. code-block:: javascript - - web3.eth.isSyncing([callback]) - -Checks if the node is currently syncing and returns either a syncing object, or ``false``. - -.. _eth-issyncing-return: - -------- -Returns -------- - -``Promise`` returns ``Object|Boolean`` - A sync object when the node is currently syncing or ``false``: - - - ``startingBlock`` - ``Number``: The block number where the sync started. - - ``currentBlock`` - ``Number``: The block number where the node is currently synced to. - - ``highestBlock`` - ``Number``: The estimated block number to sync to. - - ``knownStates`` - ``Number``: The number of estimated states to download. - - ``pulledStates`` - ``Number``: The number of already downloaded states. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.isSyncing() - .then(console.log); - - > { - startingBlock: 100, - currentBlock: 312, - highestBlock: 512, - knownStates: 234566, - pulledStates: 123455 - } - - ------------------------------------------------------------------------------- - - -getCoinbase -===================== - -.. code-block:: javascript - - getCoinbase([callback]) - -Returns the coinbase address to which mining rewards will go. - -------- -Returns -------- - -``Promise`` returns ``String`` - bytes 20: The coinbase address set in the node for mining rewards. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.getCoinbase() - .then(console.log); - > "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe" - - ------------------------------------------------------------------------------- - -isMining -===================== - -.. code-block:: javascript - - web3.eth.isMining([callback]) - - -Checks whether the node is mining or not. - -------- -Returns -------- - -``Promise`` returns ``Boolean``: ``true`` if the node is mining, otherwise ``false``. - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.isMining() - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -getHashrate -===================== - -.. code-block:: javascript - - web3.eth.getHashrate([callback]) - -Returns the number of hashes per second that the node is mining with. - -------- -Returns -------- - -``Promise`` returns ``Number``: Number of hashes per second. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getHashrate() - .then(console.log); - > 493736 - - ------------------------------------------------------------------------------- - -.. _eth-gasprice: - - -getGasPrice -===================== - -.. code-block:: javascript - - web3.eth.getGasPrice([callback]) - - -Returns the current gas price oracle. -The gas price is determined by the last few blocks median gas price. - -------- -Returns -------- - -``Promise`` returns ``String`` - Number string of the current gas price in :ref:`wei `. - -See the :ref:`A note on dealing with big numbers in JavaScript `. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getGasPrice() - .then(console.log); - > "20000000000" - - ------------------------------------------------------------------------------- - - -getAccounts -===================== - -.. code-block:: javascript - - web3.eth.getAccounts([callback]) - -Returns a list of accounts the node controls. - -------- -Returns -------- - - -``Promise`` returns ``Array`` - An array of addresses controlled by node. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getAccounts() - .then(console.log); - > ["0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", "0xDCc6960376d6C6dEa93647383FfB245CfCed97Cf"] - - ------------------------------------------------------------------------------- - - -getBlockNumber -===================== - -.. code-block:: javascript - - web3.eth.getBlockNumber([callback]) - -Returns the current block number. - -------- -Returns -------- - -``Promise`` returns ``Number`` - The number of the most recent block. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getBlockNumber() - .then(console.log); - > 2744 - - ------------------------------------------------------------------------------- - - - -getBalance -===================== - -.. code-block:: javascript - - web3.eth.getBalance(address [, defaultBlock] [, callback]) - -Get the balance of an address at a given block. - ----------- -Parameters ----------- - -1. ``String`` - The address to get the balance of. -2. ``Number|String|BN|BigNumber`` - (optional) If you pass this parameter it will not use the default block set with :ref:`web3.eth.defaultBlock `. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``Promise`` returns ``String`` - The current balance for the given address in :ref:`wei `. - -See the :ref:`A note on dealing with big numbers in JavaScript `. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getBalance("0x407d73d8a49eeb85d32cf465507dd71d507100c1") - .then(console.log); - > "1000000000000" - - ------------------------------------------------------------------------------- - -getStorageAt -===================== - -.. code-block:: javascript - - web3.eth.getStorageAt(address, position [, defaultBlock] [, callback]) - -Get the storage at a specific position of an address. - ----------- -Parameters ----------- - -1. ``String`` - The address to get the storage from. -2. ``Number|String|BN|BigNumber`` - The index position of the storage. -3. ``Number|String|BN|BigNumber`` - (optional) If you pass this parameter it will not use the default block set with :ref:`web3.eth.defaultBlock `. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. -4. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - -``Promise`` returns ``String`` - The value in storage at the given position. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getStorageAt("0x407d73d8a49eeb85d32cf465507dd71d507100c1", 0) - .then(console.log); - > "0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234" - - ------------------------------------------------------------------------------- - -getCode -===================== - -.. code-block:: javascript - - web3.eth.getCode(address [, defaultBlock] [, callback]) - -Get the code at a specific address. - ----------- -Parameters ----------- - -1. ``String`` - The address to get the code from. -2. ``Number|String|BN|BigNumber`` - (optional) If you pass this parameter it will not use the default block set with :ref:`web3.eth.defaultBlock `. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``Promise`` returns ``String`` - The data at given address ``address``. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getCode("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8") - .then(console.log); - > "0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056" - - ------------------------------------------------------------------------------- - -.. _eth-getblock: - -getBlock -===================== - -.. code-block:: javascript - - web3.eth.getBlock(blockHashOrBlockNumber [, returnTransactionObjects] [, callback]) - -Returns a block matching the block number or block hash. - ----------- -Parameters ----------- - -1. ``String|Number|BN|BigNumber`` - The block number or block hash. Or the string ``"earliest"``, ``"latest"`` or ``"pending"`` as in the :ref:`default block parameter `. -2. ``Boolean`` - (optional, default ``false``) If specified ``true``, the returned block will contain all transactions as objects. If ``false`` it will only contains the transaction hashes. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``Promise`` returns ``Object`` - The block object: - - - ``number`` - ``Number``: The block number. ``null`` if a pending block. - - ``hash`` 32 Bytes - ``String``: Hash of the block. ``null`` if a pending block. - - ``parentHash`` 32 Bytes - ``String``: Hash of the parent block. - - ``nonce`` 8 Bytes - ``String``: Hash of the generated proof-of-work. ``null`` if a pending block. - - ``sha3Uncles`` 32 Bytes - ``String``: SHA3 of the uncles data in the block. - - ``logsBloom`` 256 Bytes - ``String``: The bloom filter for the logs of the block. ``null`` if a pending block. - - ``transactionsRoot`` 32 Bytes - ``String``: The root of the transaction trie of the block. - - ``stateRoot`` 32 Bytes - ``String``: The root of the final state trie of the block. - - ``miner`` - ``String``: The address of the beneficiary to whom the mining rewards were given. - - ``difficulty`` - ``String``: Integer of the difficulty for this block. - - ``totalDifficulty`` - ``String``: Integer of the total difficulty of the chain until this block. - - ``extraData`` - ``String``: The "extra data" field of this block. - - ``size`` - ``Number``: Integer the size of this block in bytes. - - ``gasLimit`` - ``Number``: The maximum gas allowed in this block. - - ``gasUsed`` - ``Number``: The total used gas by all transactions in this block. - - ``timestamp`` - ``Number``: The unix timestamp for when the block was collated. - - ``transactions`` - ``Array``: Array of transaction objects, or 32 Bytes transaction hashes depending on the ``returnTransactionObjects`` parameter. - - ``uncles`` - ``Array``: Array of uncle hashes. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getBlock(3150) - .then(console.log); - - > { - "number": 3, - "hash": "0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46", - "parentHash": "0x2302e1c0b972d00932deb5dab9eb2982f570597d9d42504c05d9c2147eaf9c88", - "nonce": "0xfb6e1a62d119228b", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "transactionsRoot": "0x3a1b03875115b79539e5bd33fb00d8f7b7cd61929d5a3c574f507b8acf415bee", - "stateRoot": "0xf1133199d44695dfa8fd1bcfe424d82854b5cebef75bddd7e40ea94cda515bcb", - "miner": "0x8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty": '21345678965432', - "totalDifficulty": '324567845321', - "size": 616, - "extraData": "0x", - "gasLimit": 3141592, - "gasUsed": 21662, - "timestamp": 1429287689, - "transactions": [ - "0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b" - ], - "uncles": [] - } - - ------------------------------------------------------------------------------- - - -getBlockTransactionCount -===================== - -.. code-block:: javascript - - web3.eth.getBlockTransactionCount(blockHashOrBlockNumber [, callback]) - -Returns the number of transaction in a given block. - ----------- -Parameters ----------- - - -1. ``String|Number|BN|BigNumber`` - The block number or hash. Or the string ``"earliest"``, ``"latest"`` or ``"pending"`` as in the :ref:`default block parameter `. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``Promise`` returns ``Number`` - The number of transactions in the given block. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getBlockTransactionCount("0x407d73d8a49eeb85d32cf465507dd71d507100c1") - .then(console.log); - > 1 - - - ------------------------------------------------------------------------------- - - -getBlockUncleCount -===================== - -.. code-block:: javascript - - web3.eth.getBlockUncleCount(blockHashOrBlockNumber [, callback]) - -Returns the number of uncles in a block from a block matching the given block hash. - ----------- -Parameters ----------- - - -1. ``String|Number|BN|BigNumber`` - The block number or hash. Or the string ``"earliest"``, ``"latest"`` or ``"pending"`` as in the :ref:`default block parameter `. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``Promise`` returns ``Number`` - The number of transactions in the given block. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getBlockUncleCount("0x407d73d8a49eeb85d32cf465507dd71d507100c1") - .then(console.log); - > 1 - - ------------------------------------------------------------------------------- - -getUncle -===================== - -.. code-block:: javascript - - web3.eth.getUncle(blockHashOrBlockNumber, uncleIndex [, returnTransactionObjects] [, callback]) - -Returns a blocks uncle by a given uncle index position. - ----------- -Parameters ----------- - -1. ``String|Number|BN|BigNumber`` - The block number or hash. Or the string ``"earliest"``, ``"latest"`` or ``"pending"`` as in the :ref:`default block parameter `. -2. ``Number`` - The index position of the uncle. -3. ``Boolean`` - (optional, default ``false``) If specified ``true``, the returned block will contain all transactions as objects. By default it is ``false`` so, there is no need to explictly specify false. And, if ``false`` it will only contains the transaction hashes. -4. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` returns ``Object`` - the returned uncle. For a return value see :ref:`web3.eth.getBlock() `. - -.. note:: An uncle doesn't contain individual transactions. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getUncle(500, 0) - .then(console.log); - > // see web3.eth.getBlock - - - ------------------------------------------------------------------------------- - - -getTransaction -===================== - -.. code-block:: javascript - - web3.eth.getTransaction(transactionHash [, callback]) - -Returns a transaction matching the given transaction hash. - ----------- -Parameters ----------- - -1. ``String`` - The transaction hash. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -.. _eth-gettransaction-return: - -------- -Returns -------- - - -``Promise`` returns ``Object`` - A transaction object its hash ``transactionHash``: - - - ``hash`` 32 Bytes - ``String``: Hash of the transaction. - - ``nonce`` - ``Number``: The number of transactions made by the sender prior to this one. - - ``blockHash`` 32 Bytes - ``String``: Hash of the block where this transaction was in. ``null`` if pending. - - ``blockNumber`` - ``Number``: Block number where this transaction was in. ``null`` if pending. - - ``transactionIndex`` - ``Number``: Integer of the transactions index position in the block. ``null`` if pending. - - ``from`` - ``String``: Address of the sender. - - ``to`` - ``String``: Address of the receiver. ``null`` if it's a contract creation transaction. - - ``value`` - ``String``: Value transferred in :ref:`wei `. - - ``gasPrice`` - ``String``: Gas price provided by the sender in :ref:`wei `. - - ``gas`` - ``Number``: Gas provided by the sender. - - ``input`` - ``String``: The data sent along with the transaction. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getTransaction('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b§234') - .then(console.log); - - > { - "hash": "0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b", - "nonce": 2, - "blockHash": "0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46", - "blockNumber": 3, - "transactionIndex": 0, - "from": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "to": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f", - "value": '123450000000000000', - "gas": 314159, - "gasPrice": '2000000000000', - "input": "0x57cb2fc4" - } - ------------------------------------------------------------------------------- - -.. _eth-getpendingtransactions: - -getPendingTransactions -====================== - -.. code-block:: javascript - - web3.eth.getPendingTransactions([, callback]) - -Returns a list of pending transactions. - ----------- -Parameters ----------- - -1. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -.. _eth-getpendingtransactions-return: - -------- -Returns -------- - - -``Promise`` - Array of pending transactions: - - - ``hash`` 32 Bytes - ``String``: Hash of the transaction. - - ``nonce`` - ``Number``: The number of transactions made by the sender prior to this one. - - ``blockHash`` 32 Bytes - ``String``: Hash of the block where this transaction was in. ``null`` if pending. - - ``blockNumber`` - ``Number``: Block number where this transaction was in. ``null`` if pending. - - ``transactionIndex`` - ``Number``: Integer of the transactions index position in the block. ``null`` if pending. - - ``from`` - ``String``: Address of the sender. - - ``to`` - ``String``: Address of the receiver. ``null`` when it's a contract creation transaction. - - ``value`` - ``String``: Value transferred in :ref:`wei `. - - ``gasPrice`` - ``String``: The wei per unit of gas provided by the sender in :ref:`wei `. - - ``gas`` - ``Number``: Gas provided by the sender. - - ``input`` - ``String``: The data sent along with the transaction. - - - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.getPendingTransactions().then(console.log); - > [ - { - hash: '0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b', - nonce: 2, - blockHash: '0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46', - blockNumber: 3, - transactionIndex: 0, - from: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - to: '0x6295ee1b4f6dd65047762f924ecd367c17eabf8f', - value: '123450000000000000', - gas: 314159, - gasPrice: '2000000000000', - input: '0x57cb2fc4' - v: '0x3d', - r: '0xaabc9ddafffb2ae0bac4107697547d22d9383667d9e97f5409dd6881ce08f13f', - s: '0x69e43116be8f842dcd4a0b2f760043737a59534430b762317db21d9ac8c5034' - },....,{ - hash: '0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b', - nonce: 3, - blockHash: '0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46', - blockNumber: 4, - transactionIndex: 0, - from: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - to: '0x6295ee1b4f6dd65047762f924ecd367c17eabf8f', - value: '123450000000000000', - gas: 314159, - gasPrice: '2000000000000', - input: '0x57cb2fc4' - v: '0x3d', - r: '0xaabc9ddafffb2ae0bac4107697547d22d9383667d9e97f5409dd6881ce08f13f', - s: '0x69e43116be8f842dcd4a0b2f760043737a59534430b762317db21d9ac8c5034' - } - ] - ------------------------------------------------------------------------------- - -getTransactionFromBlock -===================== - -.. code-block:: javascript - - getTransactionFromBlock(hashStringOrNumber, indexNumber [, callback]) - -Returns a transaction based on a block hash or number and the transaction's index position. - ----------- -Parameters ----------- - - -1. ``String|Number|BN|BigNumber`` - A block number or hash. Or the string ``"earliest"``, ``"latest"`` or ``"pending"`` as in the :ref:`default block parameter `. -2. ``Number`` - The transaction's index position. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``Promise`` returns ``Object`` - A transaction object, see :ref:`web3.eth.getTransaction `: - - -------- -Example -------- - - -.. code-block:: javascript - - var transaction = web3.eth.getTransactionFromBlock('0x4534534534', 2) - .then(console.log); - > // see web3.eth.getTransaction - - - ------------------------------------------------------------------------------- - - -getTransactionReceipt -===================== - -.. code-block:: javascript - - web3.eth.getTransactionReceipt(hash [, callback]) - -Returns the receipt of a transaction by transaction hash. - -.. note:: The receipt is not available for pending transactions and returns ``null``. - - ----------- -Parameters ----------- - -1. ``String`` - The transaction hash. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -.. _eth-gettransactionreceipt-return: - -------- -Returns -------- - - -``Promise`` returns ``Object`` - A transaction receipt object, or ``null`` if no receipt was found: - - - ``status`` - ``Boolean``: ``TRUE`` if the transaction was successful, ``FALSE`` if the EVM reverted the transaction. - - ``blockHash`` 32 Bytes - ``String``: Hash of the block where this transaction was in. - - ``blockNumber`` - ``Number``: Block number where this transaction was in. - - ``transactionHash`` 32 Bytes - ``String``: Hash of the transaction. - - ``transactionIndex``- ``Number``: Integer of the transactions index position in the block. - - ``from`` - ``String``: Address of the sender. - - ``to`` - ``String``: Address of the receiver. ``null`` when it's a contract creation transaction. - - ``contractAddress`` - ``String``: The contract address created, if the transaction was a contract creation, otherwise ``null``. - - ``cumulativeGasUsed`` - ``Number``: The total amount of gas used when this transaction was executed in the block. - - ``gasUsed``- ``Number``: The amount of gas used by this specific transaction alone. - - ``logs`` - ``Array``: Array of log objects, which this transaction generated. - -------- -Example -------- - -.. code-block:: javascript - - var receipt = web3.eth.getTransactionReceipt('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b') - .then(console.log); - - > { - "status": true, - "transactionHash": "0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b", - "transactionIndex": 0, - "blockHash": "0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46", - "blockNumber": 3, - "contractAddress": "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", - "cumulativeGasUsed": 314159, - "gasUsed": 30234, - "logs": [{ - // logs as returned by getPastLogs, etc. - }, ...] - } - - ------------------------------------------------------------------------------- - - -.. _eth-gettransactioncount: - -getTransactionCount -===================== - -.. code-block:: javascript - - web3.eth.getTransactionCount(address [, defaultBlock] [, callback]) - -Get the number of transactions sent from this address. - ----------- -Parameters ----------- - -1. ``String`` - The address to get the numbers of transactions from. -2. ``Number|String|BN|BigNumber`` - (optional) If you pass this parameter it will not use the default block set with :ref:`web3.eth.defaultBlock `. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``Promise`` returns ``Number`` - The number of transactions sent from the given address. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getTransactionCount("0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe") - .then(console.log); - > 1 - - ------------------------------------------------------------------------------- - -.. _eth-sendtransaction: - -sendTransaction -===================== - -.. code-block:: javascript - - web3.eth.sendTransaction(transactionObject [, callback]) - -Sends a transaction to the network. - ----------- -Parameters ----------- - - -1. ``Object`` - The transaction object to send: - - ``from`` - ``String|Number``: The address for the sending account. Uses the :ref:`web3.eth.defaultAccount ` property, if not specified. Or an address or index of a local wallet in :ref:`web3.eth.accounts.wallet `. - - ``to`` - ``String``: (optional) The destination address of the message, left undefined for a contract-creation transaction. - - ``value`` - ``Number|String|BN|BigNumber``: (optional) The value transferred for the transaction in :ref:`wei `, also the endowment if it's a contract-creation transaction. - - ``gas`` - ``Number``: (optional, default: To-Be-Determined) The amount of gas to use for the transaction (unused gas is refunded). - - ``gasPrice`` - ``Number|String|BN|BigNumber``: (optional) The price of gas for this transaction in :ref:`wei `, defaults to :ref:`web3.eth.gasPrice `. - - ``data`` - ``String``: (optional) Either a `ABI byte string `_ containing the data of the function call on a contract, or in the case of a contract-creation transaction the initialisation code. - - ``nonce`` - ``Number``: (optional) Integer of the nonce. This allows to overwrite your own pending transactions that use the same nonce. - - ``chain`` - ``String``: (optional) Defaults to ``mainnet``. - - ``hardfork`` - ``String``: (optional) Defaults to ``petersburg``. - - ``common`` - ``Object``: (optional) The common object - - ``customChain`` - ``Object``: The custom chain properties - - ``name`` - ``string``: (optional) The name of the chain - - ``networkId`` - ``number``: Network ID of the custom chain - - ``chainId`` - ``number``: Chain ID of the custom chain - - ``baseChain`` - ``string``: (optional) ``mainnet``, ``goerli``, ``kovan``, ``rinkeby``, or ``ropsten`` - - ``hardfork`` - ``string``: (optional) ``chainstart``, ``homestead``, ``dao``, ``tangerineWhistle``, ``spuriousDragon``, ``byzantium``, ``constantinople``, ``petersburg``, or ``istanbul`` - -2. ``callback`` - ``Function``: (optional) Optional callback, returns an error object as first parameter and the result as second. - -.. note:: The ``from`` property can also be an address or index from the :ref:`web3.eth.accounts.wallet `. It will then sign locally using the private key of that account, and send the transaction via :ref:`web3.eth.sendSignedTransaction() `. If the properties ``chain`` and ``hardfork`` or ``common`` are not set, Web3 will try to set appropriate values by querying the network for its chainId and networkId. - -.. _eth-sendtransaction-return: - -------- -Returns -------- - -The **callback** will return the 32 bytes transaction hash. - -``PromiEvent``: A :ref:`promise combined event emitter `. Resolves when the transaction :ref:`receipt ` is available. The following events are also available: - -- ``sending`` returns ``payload: Object``: Fired immediately before transmitting the transaction request. -- ``sent`` returns ``payload: Object``: Fired immediately after the request body has been written to the client, but before the transaction hash is received. -- ``"transactionHash"`` returns ``transactionHash: String``: Fired when the transaction hash is available. -- ``"receipt"`` returns ``receipt: Object``: Fired when the transaction receipt is available. -- ``"confirmation"`` returns ``confirmationNumber: Number``, ``receipt: Object``, ``latestBlockHash: String``: Fired for every confirmation up to the 12th confirmation. Receives the confirmation number as the first and the :ref:`receipt ` as the second argument. Fired from confirmation 0 on, which is the block where it's mined. -``"error"`` returns ``error: Error``: Fired if an error occurs during sending. If the transaction was rejected by the network with a receipt, the receipt will be available as a property on the error object. - - -------- -Example -------- - -.. code-block:: javascript - - // compiled solidity source code using https://remix.ethereum.org - var code = "603d80600c6000396000f3007c01000000000000000000000000000000000000000000000000000000006000350463c6888fa18114602d57005b6007600435028060005260206000f3"; - - - // using the callback - web3.eth.sendTransaction({ - from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', - data: code // deploying a contract - }, function(error, hash){ - ... - }); - - // using the promise - web3.eth.sendTransaction({ - from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '1000000000000000' - }) - .then(function(receipt){ - ... - }); - - - // using the event emitter - web3.eth.sendTransaction({ - from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '1000000000000000' - }) - .on('transactionHash', function(hash){ - ... - }) - .on('receipt', function(receipt){ - ... - }) - .on('confirmation', function(confirmationNumber, receipt){ ... }) - .on('error', console.error); // If a out of gas error, the second parameter is the receipt. - - ------------------------------------------------------------------------------- - -.. _eth-sendsignedtransaction: - -sendSignedTransaction -===================== - -.. code-block:: javascript - - web3.eth.sendSignedTransaction(signedTransactionData [, callback]) - -Sends an already signed transaction, generated for example using :ref:`web3.eth.accounts.signTransaction `. - ----------- -Parameters ----------- - -1. ``String`` - Signed transaction data in HEX format -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - - -``PromiEvent``: A :ref:`promise combined event emitter `. Resolves when the transaction :ref:`receipt ` is available. - -Please see the return values for :ref:`web3.eth.sendTransaction ` for details. - -------- -Example -------- - - -.. code-block:: javascript - - var Tx = require('ethereumjs-tx').Transaction; - var privateKey = Buffer.from('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex'); - - var rawTx = { - nonce: '0x00', - gasPrice: '0x09184e72a000', - gasLimit: '0x2710', - to: '0x0000000000000000000000000000000000000000', - value: '0x00', - data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057' - } - - var tx = new Tx(rawTx, {'chain':'ropsten'}); - tx.sign(privateKey); - - var serializedTx = tx.serialize(); - - // console.log(serializedTx.toString('hex')); - // 0xf889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215f - - web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')) - .on('receipt', console.log); - - > // see eth.getTransactionReceipt() for details - -.. note:: When using `ethereumjs-tx@2.0.0` if you don't specify the parameter `chain` it will use `mainnet` by default. - - ------------------------------------------------------------------------------- - - -sign -===================== - -.. code-block:: javascript - - web3.eth.sign(dataToSign, address [, callback]) - -Signs data using a specific account. This account needs to be unlocked. - ----------- -Parameters ----------- - - -1. ``String`` - Data to sign. If it is a string it will be converted using :ref:`web3.utils.utf8ToHex `. -2. ``String|Number`` - Address to sign data with. Can be an address or the index of a local wallet in :ref:`web3.eth.accounts.wallet `. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` returns ``String`` - The signature. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.sign("Hello world", "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe") - .then(console.log); - > "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400" - - // the below is the same - web3.eth.sign(web3.utils.utf8ToHex("Hello world"), "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe") - .then(console.log); - > "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400" - - ------------------------------------------------------------------------------- - -signTransaction -===================== - -.. code-block:: javascript - - web3.eth.signTransaction(transactionObject, address [, callback]) - -Signs a transaction. This account needs to be unlocked. - ----------- -Parameters ----------- - - -1. ``Object`` - The transaction data to sign. See :ref:`web3.eth.sendTransaction() ` for more. -2. ``String`` - Address to sign transaction with. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise`` returns ``Object`` - The RLP encoded transaction. The ``raw`` property can be used to send the transaction using :ref:`web3.eth.sendSignedTransaction `. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.signTransaction({ - from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", - gasPrice: "20000000000", - gas: "21000", - to: '0x3535353535353535353535353535353535353535', - value: "1000000000000000000", - data: "" - }).then(console.log); - > { - raw: '0xf86c808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a04f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88da07e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', - tx: { - nonce: '0x0', - gasPrice: '0x4a817c800', - gas: '0x5208', - to: '0x3535353535353535353535353535353535353535', - value: '0xde0b6b3a7640000', - input: '0x', - v: '0x25', - r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', - s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', - hash: '0xda3be87732110de6c1354c83770aae630ede9ac308d9f7b399ecfba23d923384' - } - } - - ------------------------------------------------------------------------------- - - -call -===================== - -.. code-block:: javascript - - web3.eth.call(callObject [, defaultBlock] [, callback]) - -Executes a message call transaction, which is directly executed in the VM of the node, but never mined into the blockchain. - ----------- -Parameters ----------- - -1. ``Object`` - A transaction object, see :ref:`web3.eth.sendTransaction `. For calls the ``from`` property is optional however it is highly recommended to explicitly set it or it may default to `address(0)` depending on your node or provider. -2. ``Number|String|BN|BigNumber`` - (optional) If you pass this parameter it will not use the default block set with :ref:`web3.eth.defaultBlock `. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. -3. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - -``Promise`` returns ``String``: The returned data of the call, e.g. a smart contract functions return value. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.call({ - to: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", // contract address - data: "0xc6888fa10000000000000000000000000000000000000000000000000000000000000003" - }) - .then(console.log); - > "0x000000000000000000000000000000000000000000000000000000000000000a" - - ------------------------------------------------------------------------------- - - -estimateGas -===================== - -.. code-block:: javascript - - web3.eth.estimateGas(callObject [, callback]) - -Executes a message call or transaction and returns the amount of the gas used. -Note: You must specify a ``from`` address otherwise you may experience odd behavior. - ----------- -Parameters ----------- - - -1. ``Object`` - A transaction object, see :ref:`web3.eth.sendTransaction ` with the difference that for calls the ``from`` property is optional as well. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - -``Promise`` returns ``Number`` - the used gas for the simulated call/transaction. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.estimateGas({ - to: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", - data: "0xc6888fa10000000000000000000000000000000000000000000000000000000000000003" - }) - .then(console.log); - > "0x0000000000000000000000000000000000000000000000000000000000000015" - - ------------------------------------------------------------------------------- - - -getPastLogs -===================== - -.. code-block:: javascript - - web3.eth.getPastLogs(options [, callback]) - -Gets past logs, matching the given options. - ----------- -Parameters ----------- - -1. ``Object`` - The filter options as follows: - - ``fromBlock`` - ``Number|String``: The number of the earliest block (``"latest"`` may be given to mean the most recent and ``"pending"`` currently mining, block). By default ``"latest"``. - - ``toBlock`` - ``Number|String``: The number of the latest block (``"latest"`` may be given to mean the most recent and ``"pending"`` currently mining, block). By default ``"latest"``. - - ``address`` - ``String|Array``: An address or a list of addresses to only get logs from particular account(s). - - ``topics`` - ``Array``: An array of values which must each appear in the log entries. The order is important, if you want to leave topics out use ``null``, e.g. ``[null, '0x12...']``. You can also pass an array for each topic with options for that topic e.g. ``[null, ['option1', 'option2']]`` - - -.. _eth-getpastlogs-return: - -------- -Returns -------- - -``Promise`` returns ``Array`` - Array of log objects. - -The structure of the returned event ``Object`` in the ``Array`` looks as follows: - -- ``address`` - ``String``: From which this event originated from. -- ``data`` - ``String``: The data containing non-indexed log parameter. -- ``topics`` - ``Array``: An array with max 4 32 Byte topics, topic 1-3 contains indexed parameters of the log. -- ``logIndex`` - ``Number``: Integer of the event index position in the block. -- ``transactionIndex`` - ``Number``: Integer of the transaction's index position, the event was created in. -- ``transactionHash`` 32 Bytes - ``String``: Hash of the transaction this event was created in. -- ``blockHash`` 32 Bytes - ``String``: Hash of the block where this event was created in. ``null`` if still pending. -- ``blockNumber`` - ``Number``: The block number where this log was created in. ``null`` if still pending. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.getPastLogs({ - address: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", - topics: ["0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234"] - }) - .then(console.log); - - > [{ - data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] - logIndex: 0, - transactionIndex: 0, - transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', - blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', - blockNumber: 1234, - address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' - },{...}] - - ------------------------------------------------------------------------------- - -getWork -===================== - -.. code-block:: javascript - - web3.eth.getWork([callback]) - -Gets work for miners to mine on. Returns the hash of the current block, the seedHash, and the boundary condition to be met ("target"). - ----------- -Parameters ----------- - -1. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - -``Promise`` returns ``Array`` - the mining work with the following structure: - - - ``String`` 32 Bytes - at **index 0**: current block header pow-hash - - ``String`` 32 Bytes - at **index 1**: the seed hash used for the DAG. - - ``String`` 32 Bytes - at **index 2**: the boundary condition ("target"), 2^256 / difficulty. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getWork() - .then(console.log); - > [ - "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", - "0x5EED00000000000000000000000000005EED0000000000000000000000000000", - "0xd1ff1c01710000000000000000000000d1ff1c01710000000000000000000000" - ] - - ------------------------------------------------------------------------------- - -submitWork -===================== - -.. code-block:: javascript - - web3.eth.submitWork(nonce, powHash, digest, [callback]) - -Used for submitting a proof-of-work solution. - ----------- -Parameters ----------- - -1. ``String`` 8 Bytes: The nonce found (64 bits) -2. ``String`` 32 Bytes: The header's pow-hash (256 bits) -3. ``String`` 32 Bytes: The mix digest (256 bits) -4. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - -``Promise`` returns ``Boolean`` - Returns ``TRUE`` if the provided solution is valid, otherwise ``FALSE``. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.submitWork([ - "0x0000000000000001", - "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", - "0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000" - ]) - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -.. _eth-requestaccounts: - -requestAccounts -===================== - -.. code-block:: javascript - - web3.eth.requestAccounts([callback]) - -This method will request/enable the accounts from the current environment. This method will only work if you're using the injected provider from a application like Metamask, Status or TrustWallet. It doesn't work if you're connected to a node with a default Web3.js provider (WebsocketProvider, HttpProvidder and IpcProvider). - -For more information about the behavior of this method please read `EIP-1102: Opt-in account exposure `_. - ----------- -Parameters ----------- - -1. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - -``Promise`` - Returns an array of enabled accounts. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.requestAccounts().then(console.log); - > ['0aae0B295369a9FD31d5F28D9Ec85E40f4cb692BAf', '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'] - ------------------------------------------------------------------------------- - -.. _eth-chainId: - -getChainId -========== - -.. code-block:: javascript - - web3.eth.getChainId([callback]) - -Returns the chain ID of the current connected node as described in the `EIP-695 `_. - -------- -Returns -------- - -``Promise`` - Returns chain ID. - -------- -Example -------- - -.. code-block:: javascript - - web3.eth.getChainId().then(console.log); - > 61 - ------------------------------------------------------------------------------- - -.. _eth-getNodeInfo: - -getNodeInfo -=========== - -.. code-block:: javascript - - web3.eth.getNodeInfo([callback]) - -------- -Returns -------- - -``Promise`` - The current client version. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getNodeInfo().then(console.log); - > "Mist/v0.9.3/darwin/go1.4.1" - ------------------------------------------------------------------------------- - -.. _eth-getProof: - -getProof -======== - -.. code-block:: javascript - - web3.eth.getProof(address, storageKey, blockNumber, [callback]) - -Returns the account and storage-values of the specified account including the Merkle-proof as described in `EIP-1186 `_. - ----------- -Parameters ----------- - -1. ``String`` 20 Bytes: The Address of the account or contract. -2. ``Number[] | BigNumber[] | BN[] | String[]`` 32 Bytes: Array of storage-keys which should be proofed and included. See :ref:`web3.eth.getStorageAt `. -3. ``Number | String | BN | BigNumber``: Integer block number. Pre-defined block numbers as ``"earliest"``, ``"latest"`` and ``"pending"`` can also be used. -4. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - -------- -Returns -------- - -``Promise`` - A account object. - - - ``address`` - ``String``: The address of the account. - - ``balance`` - ``String``: The balance of the account. See :ref:`web3.eth.getBalance `. - - ``codeHash`` - ``String``: hash of the code of the account. For a simple account without code it will return ``"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"``. - - ``nonce`` - ``String``: Nonce of the account. - - ``storageHash`` - ``String``: SHA3 of the StorageRoot. All storage will deliver a MerkleProof starting with this rootHash. - - ``accountProof`` - ``String[]``:Array of rlp-serialized MerkleTree-Nodes, starting with the stateRoot-Node, following the path of the SHA3 (address) as key. - - ``storageProof`` - ``Object[]`` Array of storage-entries as requested. - - ``key`` - ``String`` The requested storage key. - - ``value`` - ``String`` The storage value. - -------- -Example -------- - - -.. code-block:: javascript - - web3.eth.getProof( - "0x1234567890123456789012345678901234567890", - ["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001"], - "latest" - ).then(console.log); - > { - "address": "0x1234567890123456789012345678901234567890", - "accountProof": [ - "0xf90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80", - "0xf90211a0395d87a95873cd98c21cf1df9421af03f7247880a2554e20738eec2c7507a494a0bcf6546339a1e7e14eb8fb572a968d217d2a0d1f3bc4257b22ef5333e9e4433ca012ae12498af8b2752c99efce07f3feef8ec910493be749acd63822c3558e6671a0dbf51303afdc36fc0c2d68a9bb05dab4f4917e7531e4a37ab0a153472d1b86e2a0ae90b50f067d9a2244e3d975233c0a0558c39ee152969f6678790abf773a9621a01d65cd682cc1be7c5e38d8da5c942e0a73eeaef10f387340a40a106699d494c3a06163b53d956c55544390c13634ea9aa75309f4fd866f312586942daf0f60fb37a058a52c1e858b1382a8893eb9c1f111f266eb9e21e6137aff0dddea243a567000a037b4b100761e02de63ea5f1fcfcf43e81a372dafb4419d126342136d329b7a7ba032472415864b08f808ba4374092003c8d7c40a9f7f9fe9cc8291f62538e1cc14a074e238ff5ec96b810364515551344100138916594d6af966170ff326a092fab0a0d31ac4eef14a79845200a496662e92186ca8b55e29ed0f9f59dbc6b521b116fea090607784fe738458b63c1942bba7c0321ae77e18df4961b2bc66727ea996464ea078f757653c1b63f72aff3dcc3f2a2e4c8cb4a9d36d1117c742833c84e20de994a0f78407de07f4b4cb4f899dfb95eedeb4049aeb5fc1635d65cf2f2f4dfd25d1d7a0862037513ba9d45354dd3e36264aceb2b862ac79d2050f14c95657e43a51b85c80", - "0xf90171a04ad705ea7bf04339fa36b124fa221379bd5a38ffe9a6112cb2d94be3a437b879a08e45b5f72e8149c01efcb71429841d6a8879d4bbe27335604a5bff8dfdf85dcea00313d9b2f7c03733d6549ea3b810e5262ed844ea12f70993d87d3e0f04e3979ea0b59e3cdd6750fa8b15164612a5cb6567cdfb386d4e0137fccee5f35ab55d0efda0fe6db56e42f2057a071c980a778d9a0b61038f269dd74a0e90155b3f40f14364a08538587f2378a0849f9608942cf481da4120c360f8391bbcc225d811823c6432a026eac94e755534e16f9552e73025d6d9c30d1d7682a4cb5bd7741ddabfd48c50a041557da9a74ca68da793e743e81e2029b2835e1cc16e9e25bd0c1e89d4ccad6980a041dda0a40a21ade3a20fcd1a4abb2a42b74e9a32b02424ff8db4ea708a5e0fb9a09aaf8326a51f613607a8685f57458329b41e938bb761131a5747e066b81a0a16808080a022e6cef138e16d2272ef58434ddf49260dc1de1f8ad6dfca3da5d2a92aaaadc58080", - "0xf851808080a009833150c367df138f1538689984b8a84fc55692d3d41fe4d1e5720ff5483a6980808080808080808080a0a319c1c415b271afc0adcb664e67738d103ac168e0bc0b7bd2da7966165cb9518080" - ], - "balance": 0, - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "nonce": 0, - "storageHash": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "storageProof": [ - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000000", - "value": '0', - "proof": [] - }, - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000001", - "value": '0', - "proof": [] - } - ] - } - ------------------------------------------------------------------------------- diff --git a/docs/web3-net.rst b/docs/web3-net.rst deleted file mode 100644 index d1ff4ad945e..00000000000 --- a/docs/web3-net.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _net: - -======== -web3.*.net -======== - - -The ``web3-net`` package allows you to interact with an Ethereum node's network properties. - - -.. code-block:: javascript - - var Net = require('web3-net'); - - // "Personal.providers.givenProvider" will be set if in an Ethereum supported browser. - var net = new Net(Net.givenProvider || 'ws://some.local-or-remote.node:8546'); - - - // or using the web3 umbrella package - - var Web3 = require('web3'); - var web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); - - // -> web3.eth.net - // -> web3.bzz.net - // -> web3.shh.net - - - ------------------------------------------------------------------------------- - - -.. include:: include_package-net.rst - - ------------------------------------------------------------------------------- diff --git a/docs/web3-shh.rst b/docs/web3-shh.rst deleted file mode 100644 index bb74e34e511..00000000000 --- a/docs/web3-shh.rst +++ /dev/null @@ -1,1025 +0,0 @@ -.. _shh: - -======== -web3.shh -======== - - -The ``web3-shh`` package allows you to interact with the whisper protocol for broadcasting. For more see `Whisper Overview `_. - - -.. code-block:: javascript - - var Shh = require('web3-shh'); - - // "Shh.providers.givenProvider" will be set if in an Ethereum supported browser. - var shh = new Shh(Shh.givenProvider || 'ws://some.local-or-remote.node:8546'); - - - // or using the web3 umbrella package - - var Web3 = require('web3'); - var web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); - - // -> web3.shh - - ------------------------------------------------------------------------------- - - -.. include:: include_package-core.rst - - - ------------------------------------------------------------------------------- - - -.. include:: include_package-net.rst - - ------------------------------------------------------------------------------- - -getVersion -===================== - -.. code-block:: javascript - - web3.shh.getVersion([callback]) - -Returns the version of the running whisper. - ----------- -Parameters ----------- - -1. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - The version of the current whisper running. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.getVersion() - .then(console.log); - > "5.0" - - ------------------------------------------------------------------------------- - -.. _shh-getinfo: - -getInfo -===================== - -.. code-block:: javascript - - web3.shh.getInfo([callback]) - -Gets information about the current whisper node. - ----------- -Parameters ----------- - -1. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Object`` - The information of the node with the following properties: - - - ``messages`` - ``Number``: Number of currently floating messages. - - ``maxMessageSize`` - ``Number``: The current message size limit in bytes. - - ``memory`` - ``Number``: The memory size of the floating messages in bytes. - - ``minPow`` - ``Number``: The current minimum PoW requirement. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.getInfo() - .then(console.log); - > { - "minPow": 0.8, - "maxMessageSize": 12345, - "memory": 1234335, - "messages": 20 - } - - ------------------------------------------------------------------------------- - -setMaxMessageSize -===================== - -.. code-block:: javascript - - web3.shh.setMaxMessageSize(size, [callback]) - -Sets the maximal message size allowed by this node. Incoming and outgoing messages with a larger size will be rejected. -Whisper message size can never exceed the limit imposed by the underlying P2P protocol (10 Mb). - ----------- -Parameters ----------- - -1. ``Number`` - Message size in bytes. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Boolean`` - ``true`` on success, error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.setMaxMessageSize(1234565) - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -setMinPoW -===================== - -.. code-block:: javascript - - web3.shh.setMinPoW(pow, [callback]) - -Sets the minimal PoW required by this node. - -This experimental function was introduced for the future dynamic adjustment of PoW requirement. -If the node is overwhelmed with messages, it should raise the PoW requirement and notify the peers. -The new value should be set relative to the old value (e.g. double). The old value can be obtained via :ref:`web3.shh.getInfo() `. - ----------- -Parameters ----------- - -1. ``Number`` - The new PoW requirement. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Boolean`` - ``true`` on success, error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.setMinPoW(0.9) - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -markTrustedPeer -===================== - -.. code-block:: javascript - - web3.shh.markTrustedPeer(enode, [callback]) - -Marks specific peer trusted, which will allow it to send historic (expired) messages. - -.. note:: This function is not adding new nodes, the node needs to be an existing peer. - ----------- -Parameters ----------- - -1. ``String`` - Enode of the trusted peer. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Boolean`` - ``true`` on success, error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.markTrustedPeer() - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -newKeyPair -===================== - -.. code-block:: javascript - - web3.shh.newKeyPair([callback]) - -Generates a new public and private key pair for message decryption and encryption. - ----------- -Parameters ----------- - -1. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - Key ID on success and an error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.newKeyPair() - .then(console.log); - > "5e57b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f" - - ------------------------------------------------------------------------------- - -addPrivateKey -===================== - -.. code-block:: javascript - - web3.shh.addPrivateKey(privateKey, [callback]) - -Stores a key pair derived from a private key, and returns its ID. - ----------- -Parameters ----------- - -1. ``String`` - The private key as HEX bytes to import. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - Key ID on success and an error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.addPrivateKey('0x8bda3abeb454847b515fa9b404cede50b1cc63cfdeddd4999d074284b4c21e15') - .then(console.log); - > "3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f" - - ------------------------------------------------------------------------------- - -deleteKeyPair -===================== - -.. code-block:: javascript - - web3.shh.deleteKeyPair(id, [callback]) - -Deletes the specifies key if it exists. - ----------- -Parameters ----------- - -1. ``String`` - The key pair ID, returned by the creation functions (``shh.newKeyPair`` and ``shh.addPrivateKey``). -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Boolean`` - ``true`` on success, error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.deleteKeyPair('3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f') - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -hasKeyPair -===================== - -.. code-block:: javascript - - web3.shh.hasKeyPair(id, [callback]) - -Checks if the whisper node has a private key of a key pair matching the given ID. - ----------- -Parameters ----------- - -1. ``String`` - The key pair ID, returned by the creation functions (``shh.newKeyPair`` and ``shh.addPrivateKey``). -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Boolean`` - ``true`` on if the key pair exist in the node, ``false`` if not. Error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.hasKeyPair('fe22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f') - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -getPublicKey -===================== - -.. code-block:: javascript - - web3.shh.getPublicKey(id, [callback]) - -Returns the public key for a key pair ID. - ----------- -Parameters ----------- - -1. ``String`` - The key pair ID, returned by the creation functions (``shh.newKeyPair`` and ``shh.addPrivateKey``). -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - Public key on success and an error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.getPublicKey('3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f') - .then(console.log); - > "0x04d1574d4eab8f3dde4d2dc7ed2c4d699d77cbbdd09167b8fffa099652ce4df00c4c6e0263eafe05007a46fdf0c8d32b11aeabcd3abbc7b2bc2bb967368a68e9c6" - - ------------------------------------------------------------------------------- - -getPrivateKey -===================== - -.. code-block:: javascript - - web3.shh.getPrivateKey(id, [callback]) - -Returns the private key for a key pair ID. - ----------- -Parameters ----------- - -1. ``String`` - The key pair ID, returned by the creation functions (``shh.newKeyPair`` and ``shh.addPrivateKey``). -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - Private key on success and an error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.getPrivateKey('3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f') - .then(console.log); - > "0x234234e22b9ffc2387e18636e0534534a3d0c56b0243567432453264c16e78a2adc" - - ------------------------------------------------------------------------------- - -newSymKey -===================== - -.. code-block:: javascript - - web3.shh.newSymKey([callback]) - -Generates a random symmetric key and stores it under an ID, which is then returned. -Will be used for encrypting and decrypting of messages where the sym key is known to both parties. - ----------- -Parameters ----------- - -1. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - Key ID on success and an error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.newSymKey() - .then(console.log); - > "cec94d139ff51d7df1d228812b90c23ec1f909afa0840ed80f1e04030bb681e4" - - ------------------------------------------------------------------------------- - -addSymKey -===================== - -.. code-block:: javascript - - web3.shh.addSymKey(symKey, [callback]) - -Stores the key, and returns its ID. - ----------- -Parameters ----------- - -1. ``String`` - The raw key for symmetric encryption as HEX bytes. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - Key ID on success and an error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.addSymKey('0x5e11b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f') - .then(console.log); - > "fea94d139ff51d7df1d228812b90c23ec1f909afa0840ed80f1e04030bb681e4" - - ------------------------------------------------------------------------------- - -generateSymKeyFromPassword -===================== - -.. code-block:: javascript - - web3.shh.generateSymKeyFromPassword(password, [callback]) - -Generates the key from password, stores it, and returns its ID. - ----------- -Parameters ----------- - -1. ``String`` - A password to generate the sym key from. -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Promise|undefined`` - Returns the Key ID as Promise or undefined if a callback is defined. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.generateSymKeyFromPassword('Never use this password - password!') - .then(console.log); - > "2e57b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f" - - ------------------------------------------------------------------------------- - -hasSymKey -===================== - -.. code-block:: javascript - - web3.shh.hasSymKey(id, [callback]) - -Checks if there is a symmetric key stored with the given ID. - ----------- -Parameters ----------- - -1. ``String`` - The key pair ID, returned by the creation functions (``shh.newSymKey``, ``shh.addSymKey`` or ``shh.generateSymKeyFromPassword``). -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Boolean`` - ``true`` on if the symmetric key exist in the node, ``false`` if not. Error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.hasSymKey('f6dcf21ed6a17bd78d8c4c63195ab997b3b65ea683705501eae82d32667adc92') - .then(console.log); - > true - - ------------------------------------------------------------------------------- - -getSymKey -===================== - -.. code-block:: javascript - - web3.shh.getSymKey(id, [callback]) - -Returns the symmetric key associated with the given ID. - ----------- -Parameters ----------- - -1. ``String`` - The key pair ID, returned by the creation functions (``shh.newKeyPair`` and ``shh.addPrivateKey``). -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``String`` - The raw symmetric key on success and an error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.getSymKey('af33b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f') - .then(console.log); - > "0xa82a520aff70f7a989098376e48ec128f25f767085e84d7fb995a9815eebff0a" - - ------------------------------------------------------------------------------- - -deleteSymKey -===================== - -.. code-block:: javascript - - web3.shh.deleteSymKey(id, [callback]) - -Deletes the symmetric key associated with the given ID. - ----------- -Parameters ----------- - -1. ``String`` - The key pair ID, returned by the creation functions (``shh.newKeyPair`` and ``shh.addPrivateKey``). -2. ``Function`` - (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - - -``Boolean`` - ``true`` on if the symmetric key was deleted, error on failure. - - -------- -Example -------- - - -.. code-block:: javascript - - web3.shh.deleteSymKey('bf31b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f') - .then(console.log); - > true - - ------------------------------------------------------------------------------- - - -post -===================== - -.. code-block:: javascript - - web3.shh.post(object [, callback]) - -This method should be called, when we want to post whisper a message to the network. - ----------- -Parameters ----------- - -1. ``Object`` - The post object: - - ``symKeyID`` - ``String`` (optional): ID of symmetric key for message encryption (Either ``symKeyID`` or ``pubKey`` must be present. Can not be both.). - - ``pubKey`` - ``String`` (optional): The public key for message encryption (Either ``symKeyID`` or ``pubKey`` must be present. Can not be both.). - - ``sig`` - ``String`` (optional): The ID of the signing key. - - ``ttl`` - ``Number``: Time-to-live in seconds. - - ``topic`` - ``String``: 4 Bytes (mandatory when key is symmetric): Message topic. - - ``payload`` - ``String``: The payload of the message to be encrypted. - - ``padding`` - ``Number`` (optional): Padding (byte array of arbitrary length). - - ``powTime`` - ``Number`` (optional)?: Maximal time in seconds to be spent on proof of work. - - ``powTarget`` - ``Number`` (optional)?: Minimal PoW target required for this message. - - ``targetPeer`` - ``Number`` (optional): Peer ID (for peer-to-peer message only). -2. ``callback`` - ``Function``: (optional) Optional callback, returns an error object as first parameter and the result as second. - - -------- -Returns -------- - -``Promise`` - returns a promise. Upon success, the ``then`` function will be passed a string representing the hash of the sent message. On error, the ``catch`` function will be passed a string containing the reason for the error. - - -------- -Example -------- - -.. code-block:: javascript - - var identities = {}; - var subscription = null; - - Promise.all([ - web3.shh.newSymKey().then((id) => {identities.symKey = id;}), - web3.shh.newKeyPair().then((id) => {identities.keyPair = id;}) - - ]).then(() => { - - // will receive also its own message send, below - subscription = web3.shh.subscribe("messages", { - symKeyID: identities.symKey, - topics: ['0xffaadd11'] - }).on('data', console.log); - - }).then(() => { - web3.shh.post({ - symKeyID: identities.symKey, // encrypts using the sym key ID - sig: identities.keyPair, // signs the message using the keyPair ID - ttl: 10, - topic: '0xffaadd11', - payload: '0xffffffdddddd1122', - powTime: 3, - powTarget: 0.5 - }).then(h => console.log(`Message with hash ${h} was successfuly sent`)) - .catch(err => console.log("Error: ", err)); - }); - - - ------------------------------------------------------------------------------- - - -subscribe -===================== - -.. code-block:: javascript - - web3.shh.subscribe('messages', options [, callback]) - -Subscribe for incoming whisper messages. - - -.. _shh-subscribeoptions: - ----------- -Parameters ----------- - -1. ``"messages"`` - ``String``: Type of the subscription. -2. ``Object`` - The subscription options: - - ``symKeyID`` - ``String``: ID of symmetric key for message decryption. - - ``privateKeyID`` - ``String``: ID of private (asymmetric) key for message decryption. - - ``sig`` - ``String`` (optional): Public key of the signature, to verify. - - ``topics``- ``Array`` (optional when "privateKeyID" key is given): Filters messages by this topic(s). Each topic must be a 4 bytes HEX string. - - ``minPow`` - ``Number`` (optional): Minimal PoW requirement for incoming messages. - - ``allowP2P`` - ``Boolean`` (optional): Indicates if this filter allows processing of direct peer-to-peer messages (which are not to be forwarded any further, because they might be expired). This might be the case in some very rare cases, e.g. if you intend to communicate to MailServers, etc. -3. ``callback`` - ``Function``: (optional) Optional callback, returns an error object as first parameter and the result as second. Will be called for each incoming subscription, and the subscription itself as 3 parameter. - - -.. _shh-subscribenotificationreturns: - ----------- -Notification Returns ----------- - -``Object`` - The incoming message: - - - ``hash`` - ``String``: Hash of the enveloped message. - - ``sig`` - ``String``: Public key which signed this message. - - ``recipientPublicKey`` - ``String``: The recipients public key. - - ``timestamp`` - ``String``: Unix timestamp of the message genertion. - - ``ttl`` - ``Number``: Time-to-live in seconds. - - ``topic`` - ``String``: 4 Bytes HEX string message topic. - - ``payload`` - ``String``: Decrypted payload. - - ``padding`` - ``Number``: Optional padding (byte array of arbitrary length). - - ``pow`` - ``Number``: Proof of work value. - - ----------- -Example ----------- - -.. code-block:: javascript - - web3.shh.subscribe('messages', { - symKeyID: 'bf31b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - sig: '0x04d1574d4eab8f3dde4d2dc7ed2c4d699d77cbbdd09167b8fffa099652ce4df00c4c6e0263eafe05007a46fdf0c8d32b11aeabcd3abbc7b2bc2bb967368a68e9c6', - ttl: 20, - topics: ['0xffddaa11'], - minPow: 0.8, - }, function(error, message, subscription){ - - console.log(message); - > { - "hash": "0x4158eb81ad8e30cfcee67f20b1372983d388f1243a96e39f94fd2797b1e9c78e", - "padding": "0xc15f786f34e5cef0fef6ce7c1185d799ecdb5ebca72b3310648c5588db2e99a0d73301c7a8d90115a91213f0bc9c72295fbaf584bf14dc97800550ea53577c9fb57c0249caeb081733b4e605cdb1a6011cee8b6d8fddb972c2b90157e23ba3baae6c68d4f0b5822242bb2c4cd821b9568d3033f10ec1114f641668fc1083bf79ebb9f5c15457b538249a97b22a4bcc4f02f06dec7318c16758f7c008001c2e14eba67d26218ec7502ad6ba81b2402159d7c29b068b8937892e3d4f0d4ad1fb9be5e66fb61d3d21a1c3163bce74c0a9d16891e2573146aa92ecd7b91ea96a6987ece052edc5ffb620a8987a83ac5b8b6140d8df6e92e64251bf3a2cec0cca", - "payload": "0xdeadbeaf", - "pow": 0.5371803278688525, - "recipientPublicKey": null, - "sig": null, - "timestamp": 1496991876, - "topic": "0x01020304", - "ttl": 50 - } - }) - // or - .on('data', function(message){ ... }); - - ------------------------------------------------------------------------------- - - -clearSubscriptions -===================== - -.. code-block:: javascript - - web3.shh.clearSubscriptions() - -Resets subscriptions. - -.. note:: This will not reset subscriptions from other packages like ``web3-eth``, as they use their own requestManager. - ----------- -Parameters ----------- - -1. ``Boolean``: If ``true`` it keeps the ``"syncing"`` subscription. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.shh.subscribe('messages', {...} ,function(){ ... }); - - ... - - web3.shh.clearSubscriptions(); - - ------------------------------------------------------------------------------- - - -newMessageFilter -===================== - -.. code-block:: javascript - - web3.shh.newMessageFilter(options) - -Create a new filter within the node. This filter can be used to poll for new messages that match the set of criteria. - - ----------- -Parameters ----------- - -1. ``Object``: See :ref:`web3.shh.subscribe() options ` for details. - -------- -Returns -------- - -``String``: The filter ID. - -------- -Example -------- - -.. code-block:: javascript - - web3.shh.newMessageFilter() - .then(console.log); - > "2b47fbafb3cce24570812a82e6e93cd9e2551bbc4823f6548ff0d82d2206b326" - ------------------------------------------------------------------------------- - - -deleteMessageFilter -===================== - -.. code-block:: javascript - - web3.shh.deleteMessageFilter(id) - -Deletes a message filter in the node. - ----------- -Parameters ----------- - -1. ``String``: The filter ID created with ``shh.newMessageFilter()``. - -------- -Returns -------- - -``Boolean``: ``true`` on success, error on failure. - -------- -Example -------- - -.. code-block:: javascript - - web3.shh.deleteMessageFilter('2b47fbafb3cce24570812a82e6e93cd9e2551bbc4823f6548ff0d82d2206b326') - .then(console.log); - > true - - ------------------------------------------------------------------------------- - - -getFilterMessages -===================== - -.. code-block:: javascript - - web3.shh.getFilterMessages(id) - -Retrieve messages that match the filter criteria and are received between the last time this function was called and now. - ----------- -Parameters ----------- - -1. ``String``: The filter ID created with ``shh.newMessageFilter()``. - -------- -Returns -------- - -``Array``: Returns an array of message objects like :ref:`web3.shh.subscribe() notification returns ` - -------- -Example -------- - -.. code-block:: javascript - - web3.shh.getFilterMessages('2b47fbafb3cce24570812a82e6e93cd9e2551bbc4823f6548ff0d82d2206b326') - .then(console.log); - > [{ - "hash": "0x4158eb81ad8e30cfcee67f20b1372983d388f1243a96e39f94fd2797b1e9c78e", - "padding": "0xc15f786f34e5cef0fef6ce7c1185d799ecdb5ebca72b3310648c5588db2e99a0d73301c7a8d90115a91213f0bc9c72295fbaf584bf14dc97800550ea53577c9fb57c0249caeb081733b4e605cdb1a6011cee8b6d8fddb972c2b90157e23ba3baae6c68d4f0b5822242bb2c4cd821b9568d3033f10ec1114f641668fc1083bf79ebb9f5c15457b538249a97b22a4bcc4f02f06dec7318c16758f7c008001c2e14eba67d26218ec7502ad6ba81b2402159d7c29b068b8937892e3d4f0d4ad1fb9be5e66fb61d3d21a1c3163bce74c0a9d16891e2573146aa92ecd7b91ea96a6987ece052edc5ffb620a8987a83ac5b8b6140d8df6e92e64251bf3a2cec0cca", - "payload": "0xdeadbeaf", - "pow": 0.5371803278688525, - "recipientPublicKey": null, - "sig": null, - "timestamp": 1496991876, - "topic": "0x01020304", - "ttl": 50 - },{...}] - - diff --git a/docs/web3-utils.rst b/docs/web3-utils.rst deleted file mode 100644 index 46ab23a07fb..00000000000 --- a/docs/web3-utils.rst +++ /dev/null @@ -1,1428 +0,0 @@ -.. _utils: - -======== -web3.utils -======== - -This package provides utility functions for Ethereum dapps and other web3.js packages. - ------------------------------------------------------------------------------- - -Bloom Filters -===================== - ------------------------ -What are bloom filters? ------------------------ - -A Bloom filter is a probabilistic, space-efficient data structure used for fast checks of set membership. That probably doesn’t mean much to you yet, and so let’s explore how bloom filters might be used. - -Imagine that we have some large set of data, and we want to be able to quickly test if some element is currently in that set. The naive way of checking might be to query the set to see if our element is in there. That’s probably fine if our data set is relatively small. Unfortunately, if our data set is really big, this search might take a while. Luckily, we have tricks to speed things up in the ethereum world! - -A bloom filter is one of these tricks. The basic idea behind the Bloom filter is to hash each new element that goes into the data set, take certain bits from this hash, and then use those bits to fill in parts of a fixed-size bit array (e.g. set certain bits to 1). This bit array is called a bloom filter. - -Later, when we want to check if an element is in the set, we simply hash the element and check that the right bits are in the bloom filter. If at least one of the bits is 0, then the element definitely isn’t in our data set! If all of the bits are 1, then the element might be in the data set, but we need to actually query the database to be sure. So we might have false positives, but we’ll never have false negatives. This can greatly reduce the number of database queries we have to make. - -**Real Life Example** - -An ethereum real life example in where this is useful is if you want to update a users balance on every new block so it stays as close to real time as possible. Without using a bloom filter on every new block you would have to force the balances even if that user may not of had any activity within that block. But if you use the logBlooms from the block you can test the bloom filter against the users ethereum address before you do any more slow operations, this will dramatically decrease the amount of calls you do as you will only be doing those extra operations if that ethereum address is within that block (minus the false positives outcome which will be negligible). This will be highly performant for your app. - ---------- -Functions ---------- - -- `web3.utils.isBloom `_ -- `web3.utils.isUserEthereumAddressInBloom `_ -- `web3.utils.isContractAddressInBloom `_ -- `web3.utils.isTopic `_ -- `web3.utils.isTopicInBloom `_ -- `web3.utils.isInBloom `_ - - -.. note:: Please raise any issues `here `_ - - ------------------------------------------------------------------------------- - -randomHex -===================== - -.. code-block:: javascript - - web3.utils.randomHex(size) - -The `randomHex `_ library to generate cryptographically strong pseudo-random HEX strings from a given byte size. - ----------- -Parameters ----------- - -1. ``size`` - ``Number``: The byte size for the HEX string, e.g. ``32`` will result in a 32 bytes HEX string with 64 characters preficed with "0x". - -------- -Returns -------- - -``String``: The generated random HEX string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.randomHex(32) - > "0xa5b9d60f32436310afebcfda832817a68921beb782fabf7915cc0460b443116a" - - web3.utils.randomHex(4) - > "0x6892ffc6" - - web3.utils.randomHex(2) - > "0x99d6" - - web3.utils.randomHex(1) - > "0x9a" - - web3.utils.randomHex(0) - > "0x" - - - - ------------------------------------------------------------------------------- - -_ -===================== - -.. code-block:: javascript - - web3.utils._() - -The `underscore `_ library for many convenience JavaScript functions. - -See the `underscore API reference `_ for details. - -------- -Example -------- - -.. code-block:: javascript - - var _ = web3.utils._; - - _.union([1,2],[3]); - > [1,2,3] - - _.each({my: 'object'}, function(value, key){ ... }) - - ... - - - ------------------------------------------------------------------------------- - -.. _utils-bn: - -BN -===================== - -.. code-block:: javascript - - web3.utils.BN(mixed) - -The `BN.js `_ library for calculating with big numbers in JavaScript. -See the `BN.js documentation `_ for details. - -.. note:: For safe conversion of many types, incl `BigNumber.js `_ use :ref:`utils.toBN ` - ----------- -Parameters ----------- - -1. ``mixed`` - ``String|Number``: A number, number string or HEX string to convert to a BN object. - -------- -Returns -------- - -``Object``: The `BN.js `_ instance. - -------- -Example -------- - -.. code-block:: javascript - - var BN = web3.utils.BN; - - new BN(1234).toString(); - > "1234" - - new BN('1234').add(new BN('1')).toString(); - > "1235" - - new BN('0xea').toString(); - > "234" - - ------------------------------------------------------------------------------- - -isBN -===================== - -.. code-block:: javascript - - web3.utils.isBN(bn) - - -Checks if a given value is a `BN.js `_ instance. - - ----------- -Parameters ----------- - -1. ``bn`` - ``Object``: An `BN.js `_ instance. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - var number = new BN(10); - - web3.utils.isBN(number); - > true - - ------------------------------------------------------------------------------- - -isBigNumber -===================== - -.. code-block:: javascript - - web3.utils.isBigNumber(bignumber) - - -Checks if a given value is a `BigNumber.js `_ instance. - - ----------- -Parameters ----------- - -1. ``bignumber`` - ``Object``: A `BigNumber.js `_ instance. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - var number = new BigNumber(10); - - web3.utils.isBigNumber(number); - > true - - ------------------------------------------------------------------------------- - -.. _utils-sha3: - -sha3 -===================== - -.. code-block:: javascript - - web3.utils.sha3(string) - web3.utils.keccak256(string) // ALIAS - -Will calculate the sha3 of the input. - -.. note:: To mimic the sha3 behaviour of solidity use :ref:`soliditySha3 ` - ----------- -Parameters ----------- - -1. ``string`` - ``String``: A string to hash. - -------- -Returns -------- - -``String``: the result hash. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.sha3('234'); // taken as string - > "0xc1912fee45d61c87cc5ea59dae311904cd86b84fee17cc96966216f811ce6a79" - - web3.utils.sha3(new BN('234')); - > "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a" - - web3.utils.sha3(234); - > null // can't calculate the hash of a number - - web3.utils.sha3(0xea); // same as above, just the HEX representation of the number - > null - - web3.utils.sha3('0xea'); // will be converted to a byte array first, and then hashed - > "0x2f20677459120677484f7104c76deb6846a2c071f9b3152c103bb12cd54d1a4a" - - ------------------------------------------------------------------------------- - - -sha3Raw -===================== - -.. code-block:: javascript - - web3.utils.sha3Raw(string) - -Will calculate the sha3 of the input but does return the hash value instead of ``null`` if for example a empty string is passed. - -.. note:: Further details about this function can be seen here :ref:`sha3 ` - - ------------------------------------------------------------------------------- - -.. _utils-soliditysha3: - - -soliditySha3 -===================== - -.. code-block:: javascript - - web3.utils.soliditySha3(param1 [, param2, ...]) - -Will calculate the sha3 of given input parameters in the same way solidity would. -This means arguments will be ABI converted and tightly packed before being hashed. - ----------- -Parameters ----------- - -1. ``paramX`` - ``Mixed``: Any type, or an object with ``{type: 'uint', value: '123456'}`` or ``{t: 'bytes', v: '0xfff456'}``. Basic types are autodetected as follows: - - - ``String`` non numerical UTF-8 string is interpreted as ``string``. - - ``String|Number|BN|HEX`` positive number is interpreted as ``uint256``. - - ``String|Number|BN`` negative number is interpreted as ``int256``. - - ``Boolean`` as ``bool``. - - ``String`` HEX string with leading ``0x`` is interpreted as ``bytes``. - - ``HEX`` HEX number representation is interpreted as ``uint256``. - -------- -Returns -------- - -``String``: the result hash. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.soliditySha3('234564535', '0xfff23243', true, -10); - // auto detects: uint256, bytes, bool, int256 - > "0x3e27a893dc40ef8a7f0841d96639de2f58a132be5ae466d40087a2cfa83b7179" - - - web3.utils.soliditySha3('Hello!%'); // auto detects: string - > "0x661136a4267dba9ccdf6bfddb7c00e714de936674c4bdb065a531cf1cb15c7fc" - - - web3.utils.soliditySha3('234'); // auto detects: uint256 - > "0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2" - - web3.utils.soliditySha3(0xea); // same as above - > "0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2" - - web3.utils.soliditySha3(new BN('234')); // same as above - > "0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2" - - web3.utils.soliditySha3({type: 'uint256', value: '234'})); // same as above - > "0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2" - - web3.utils.soliditySha3({t: 'uint', v: new BN('234')})); // same as above - > "0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2" - - - web3.utils.soliditySha3('0x407D73d8a49eeb85D32Cf465507dd71d507100c1'); - > "0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b" - - web3.utils.soliditySha3({t: 'bytes', v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1'}); - > "0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b" // same result as above - - - web3.utils.soliditySha3({t: 'address', v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1'}); - > "0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b" // same as above, but will do a checksum check, if its multi case - - - web3.utils.soliditySha3({t: 'bytes32', v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1'}); - > "0x3c69a194aaf415ba5d6afca734660d0a3d45acdc05d54cd1ca89a8988e7625b4" // different result as above - - - web3.utils.soliditySha3({t: 'string', v: 'Hello!%'}, {t: 'int8', v:-23}, {t: 'address', v: '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'}); - > "0xa13b31627c1ed7aaded5aecec71baf02fe123797fffd45e662eac8e06fbe4955" - - - ------------------------------------------------------------------------------- - -.. _utils-soliditysha3Raw: - - -soliditySha3Raw -===================== - -.. code-block:: javascript - - web3.utils.soliditySha3Raw(param1 [, param2, ...]) - -Will calculate the sha3 of given input parameters in the same way solidity would. -This means arguments will be ABI converted and tightly packed before being hashed. -The difference between this function and the ``soliditySha3`` function is that it will return the hash value instead of ``null`` if for example a empty string is given. - - -.. note:: Further details about this function can be seen here :ref:`soliditySha3 ` - - ------------------------------------------------------------------------------- - -isHex -===================== - -.. code-block:: javascript - - web3.utils.isHex(hex) - -Checks if a given string is a HEX string. - ----------- -Parameters ----------- - -1. ``hex`` - ``String|HEX``: The given HEX string. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.isHex('0xc1912'); - > true - - web3.utils.isHex(0xc1912); - > true - - web3.utils.isHex('c1912'); - > true - - web3.utils.isHex(345); - > true // this is tricky, as 345 can be a a HEX representation or a number, be careful when not having a 0x in front! - - web3.utils.isHex('0xZ1912'); - > false - - web3.utils.isHex('Hello'); - > false - ------------------------------------------------------------------------------- - -isHexStrict -===================== - -.. code-block:: javascript - - web3.utils.isHexStrict(hex) - -Checks if a given string is a HEX string. Difference to ``web3.utils.isHex()`` is that it expects HEX to be prefixed with ``0x``. - ----------- -Parameters ----------- - -1. ``hex`` - ``String|HEX``: The given HEX string. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.isHexStrict('0xc1912'); - > true - - web3.utils.isHexStrict(0xc1912); - > false - - web3.utils.isHexStrict('c1912'); - > false - - web3.utils.isHexStrict(345); - > false // this is tricky, as 345 can be a a HEX representation or a number, be careful when not having a 0x in front! - - web3.utils.isHexStrict('0xZ1912'); - > false - - web3.utils.isHex('Hello'); - > false - ------------------------------------------------------------------------------- - -isAddress -===================== - -.. code-block:: javascript - - web3.utils.isAddress(address) - -Checks if a given string is a valid Ethereum address. -It will also check the checksum, if the address has upper and lowercase letters. - ----------- -Parameters ----------- - -1. ``address`` - ``String``: An address string. - -------- -Returns -------- - -``Boolean`` - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.isAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d'); - > true - - web3.utils.isAddress('c1912fee45d61c87cc5ea59dae31190fffff232d'); - > true - - web3.utils.isAddress('0XC1912FEE45D61C87CC5EA59DAE31190FFFFF232D'); - > true // as all is uppercase, no checksum will be checked - - web3.utils.isAddress('0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d'); - > true - - web3.utils.isAddress('0xC1912fEE45d61C87Cc5EA59DaE31190FFFFf232d'); - > false // wrong checksum - ------------------------------------------------------------------------------- - - -toChecksumAddress -===================== - -.. code-block:: javascript - - web3.utils.toChecksumAddress(address) - -Will convert an upper or lowercase Ethereum address to a checksum address. - ----------- -Parameters ----------- - -1. ``address`` - ``String``: An address string. - -------- -Returns -------- - -``String``: The checksum address. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.toChecksumAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d'); - > "0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d" - - web3.utils.toChecksumAddress('0XC1912FEE45D61C87CC5EA59DAE31190FFFFF232D'); - > "0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d" // same as above - - ------------------------------------------------------------------------------- - - -checkAddressChecksum -===================== - -.. code-block:: javascript - - web3.utils.checkAddressChecksum(address) - -Checks the checksum of a given address. Will also return false on non-checksum addresses. - ----------- -Parameters ----------- - -1. ``address`` - ``String``: An address string. - -------- -Returns -------- - -``Boolean``: ``true`` when the checksum of the address is valid, ``false`` if its not a checksum address, or the checksum is invalid. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.checkAddressChecksum('0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d'); - > true - - ------------------------------------------------------------------------------- - - -toHex -===================== - -.. code-block:: javascript - - web3.utils.toHex(mixed) - -Will auto convert any given value to HEX. -Number strings will interpreted as numbers. -Text strings will be interpreted as UTF-8 strings. - ----------- -Parameters ----------- - -1. ``mixed`` - ``String|Number|BN|BigNumber``: The input to convert to HEX. - -------- -Returns -------- - -``String``: The resulting HEX string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.toHex('234'); - > "0xea" - - web3.utils.toHex(234); - > "0xea" - - web3.utils.toHex(new BN('234')); - > "0xea" - - web3.utils.toHex(new BigNumber('234')); - > "0xea" - - web3.utils.toHex('I have 100€'); - > "0x49206861766520313030e282ac" - ------------------------------------------------------------------------------- - -stripHexPrefix -===================== - -.. code-block:: javascript - web3.utils.stripHexPrefix(str) -Returns provided string without 0x prefix. - ----------- -Parameters ----------- - -1. ``str`` - ``string``: Input string - -------- -Returns -------- - -``String``: The input string without 0x prefix. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.stripHexPrefix('234'); - > "234" - - web3.utils.stripHexPrefix('0x234'); - > "234" - - web3.utils.stripHexPrefix(42); - > 42 - ------------------------------------------------------------------------------- - -.. _utils-tobn: - -toBN -===================== - -.. code-block:: javascript - - web3.utils.toBN(number) - -Will safely convert any given value (including `BigNumber.js `_ instances) into a `BN.js `_ instance, for handling big numbers in JavaScript. - -.. note:: For just the `BN.js `_ class use :ref:`utils.BN ` - ----------- -Parameters ----------- - -1. ``number`` - ``String|Number|HEX``: Number to convert to a big number. - -------- -Returns -------- - -``Object``: The `BN.js `_ instance. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.toBN(1234).toString(); - > "1234" - - web3.utils.toBN('1234').add(web3.utils.toBN('1')).toString(); - > "1235" - - web3.utils.toBN('0xea').toString(); - > "234" - - ------------------------------------------------------------------------------- - - -hexToNumberString -===================== - -.. code-block:: javascript - - web3.utils.hexToNumberString(hex) - -Returns the number representation of a given HEX value as a string. - ----------- -Parameters ----------- - -1. ``hexString`` - ``String|HEX``: A string to hash. - -------- -Returns -------- - -``String``: The number as a string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.hexToNumberString('0xea'); - > "234" - - ------------------------------------------------------------------------------- - -hexToNumber -===================== - -.. code-block:: javascript - - web3.utils.hexToNumber(hex) - web3.utils.toDecimal(hex) // ALIAS, deprecated - -Returns the number representation of a given HEX value. - -.. note:: This is not useful for big numbers, rather use :ref:`utils.toBN ` instead. - ----------- -Parameters ----------- - -1. ``hexString`` - ``String|HEX``: A string to hash. - -------- -Returns -------- - -``Number`` - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.hexToNumber('0xea'); - > 234 - - ------------------------------------------------------------------------------- - -numberToHex -===================== - -.. code-block:: javascript - - web3.utils.numberToHex(number) - web3.utils.fromDecimal(number) // ALIAS, deprecated - -Returns the HEX representation of a given number value. - ----------- -Parameters ----------- - -1. ``number`` - ``String|Number|BN|BigNumber``: A number as string or number. - -------- -Returns -------- - -``String``: The HEX value of the given number. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.numberToHex('234'); - > '0xea' - - ------------------------------------------------------------------------------- - - -hexToUtf8 -===================== - -.. code-block:: javascript - - web3.utils.hexToUtf8(hex) - web3.utils.hexToString(hex) // ALIAS - web3.utils.toUtf8(hex) // ALIAS, deprecated - -Returns the UTF-8 string representation of a given HEX value. - - ----------- -Parameters ----------- - -1. ``hex`` - ``String``: A HEX string to convert to a UTF-8 string. - -------- -Returns -------- - -``String``: The UTF-8 string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.hexToUtf8('0x49206861766520313030e282ac'); - > "I have 100€" - - ------------------------------------------------------------------------------- - -hexToAscii -===================== - -.. code-block:: javascript - - web3.utils.hexToAscii(hex) - web3.utils.toAscii(hex) // ALIAS, deprecated - -Returns the ASCII string representation of a given HEX value. - - ----------- -Parameters ----------- - -1. ``hex`` - ``String``: A HEX string to convert to a ASCII string. - -------- -Returns -------- - -``String``: The ASCII string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.hexToAscii('0x4920686176652031303021'); - > "I have 100!" - - ------------------------------------------------------------------------------- - -.. _utils-utf8tohex: - -utf8ToHex -===================== - -.. code-block:: javascript - - web3.utils.utf8ToHex(string) - web3.utils.stringToHex(string) // ALIAS - web3.utils.fromUtf8(string) // ALIAS, deprecated - -Returns the HEX representation of a given UTF-8 string. - - ----------- -Parameters ----------- - -1. ``string`` - ``String``: A UTF-8 string to convert to a HEX string. - -------- -Returns -------- - -``String``: The HEX string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.utf8ToHex('I have 100€'); - > "0x49206861766520313030e282ac" - - ------------------------------------------------------------------------------- - -asciiToHex -===================== - -.. code-block:: javascript - - web3.utils.asciiToHex(string) - web3.utils.fromAscii(string) // ALIAS, deprecated - - -Returns the HEX representation of a given ASCII string. - - ----------- -Parameters ----------- - -1. ``string`` - ``String``: A ASCII string to convert to a HEX string. - -------- -Returns -------- - -``String``: The HEX string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.asciiToHex('I have 100!'); - > "0x4920686176652031303021" - - ------------------------------------------------------------------------------- - -hexToBytes -===================== - -.. code-block:: javascript - - web3.utils.hexToBytes(hex) - -Returns a byte array from the given HEX string. - ----------- -Parameters ----------- - -1. ``hex`` - ``String|HEX``: A HEX to convert. - -------- -Returns -------- - -``Array``: The byte array. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.hexToBytes('0x000000ea'); - > [ 0, 0, 0, 234 ] - - web3.utils.hexToBytes(0x000000ea); - > [ 234 ] - - ------------------------------------------------------------------------------- - - -bytesToHex -===================== - -.. code-block:: javascript - - web3.utils.bytesToHex(byteArray) - -Returns a HEX string from a byte array. - ----------- -Parameters ----------- - -1. ``byteArray`` - ``Array``: A byte array to convert. - -------- -Returns -------- - -``String``: The HEX string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.bytesToHex([ 72, 101, 108, 108, 111, 33, 36 ]); - > "0x48656c6c6f2125" - - - ------------------------------------------------------------------------------- - -toWei -===================== - -.. code-block:: javascript - - web3.utils.toWei(number [, unit]) - - -Converts any `ether value `_ value into `wei `_. - -.. note:: "wei" are the smallest ether unit, and you should always make calculations in wei and convert only for display reasons. - ----------- -Parameters ----------- - -1. ``number`` - ``String|BN``: The value. -2. ``unit`` - ``String`` (optional, defaults to ``"ether"``): The ether to convert from. Possible units are: - - ``noether``: '0' - - ``wei``: '1' - - ``kwei``: '1000' - - ``Kwei``: '1000' - - ``babbage``: '1000' - - ``femtoether``: '1000' - - ``mwei``: '1000000' - - ``Mwei``: '1000000' - - ``lovelace``: '1000000' - - ``picoether``: '1000000' - - ``gwei``: '1000000000' - - ``Gwei``: '1000000000' - - ``shannon``: '1000000000' - - ``nanoether``: '1000000000' - - ``nano``: '1000000000' - - ``szabo``: '1000000000000' - - ``microether``: '1000000000000' - - ``micro``: '1000000000000' - - ``finney``: '1000000000000000' - - ``milliether``: '1000000000000000' - - ``milli``: '1000000000000000' - - ``ether``: '1000000000000000000' - - ``kether``: '1000000000000000000000' - - ``grand``: '1000000000000000000000' - - ``mether``: '1000000000000000000000000' - - ``gether``: '1000000000000000000000000000' - - ``tether``: '1000000000000000000000000000000' - -------- -Returns -------- - -``String|BN``: If a string is given it returns a number string, otherwise a `BN.js `_ instance. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.toWei('1', 'ether'); - > "1000000000000000000" - - web3.utils.toWei('1', 'finney'); - > "1000000000000000" - - web3.utils.toWei('1', 'szabo'); - > "1000000000000" - - web3.utils.toWei('1', 'shannon'); - > "1000000000" - - - ------------------------------------------------------------------------------- - -fromWei -===================== - -.. code-block:: javascript - - web3.utils.fromWei(number [, unit]) - - -Converts any `wei `_ value into a `ether value `_. - -.. note:: "wei" are the smallest ether unit, and you should always make calculations in wei and convert only for display reasons. - ----------- -Parameters ----------- - -1. ``number`` - ``String|BN``: The value in wei. -2. ``unit`` - ``String`` (optional, defaults to ``"ether"``): The ether to convert to. Possible units are: - - ``noether``: '0' - - ``wei``: '1' - - ``kwei``: '1000' - - ``Kwei``: '1000' - - ``babbage``: '1000' - - ``femtoether``: '1000' - - ``mwei``: '1000000' - - ``Mwei``: '1000000' - - ``lovelace``: '1000000' - - ``picoether``: '1000000' - - ``gwei``: '1000000000' - - ``Gwei``: '1000000000' - - ``shannon``: '1000000000' - - ``nanoether``: '1000000000' - - ``nano``: '1000000000' - - ``szabo``: '1000000000000' - - ``microether``: '1000000000000' - - ``micro``: '1000000000000' - - ``finney``: '1000000000000000' - - ``milliether``: '1000000000000000' - - ``milli``: '1000000000000000' - - ``ether``: '1000000000000000000' - - ``kether``: '1000000000000000000000' - - ``grand``: '1000000000000000000000' - - ``mether``: '1000000000000000000000000' - - ``gether``: '1000000000000000000000000000' - - ``tether``: '1000000000000000000000000000000' - -------- -Returns -------- - -``String``: It always returns a string number. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.fromWei('1', 'ether'); - > "0.000000000000000001" - - web3.utils.fromWei('1', 'finney'); - > "0.000000000000001" - - web3.utils.fromWei('1', 'szabo'); - > "0.000000000001" - - web3.utils.fromWei('1', 'shannon'); - > "0.000000001" - ------------------------------------------------------------------------------- - -unitMap -===================== - -.. code-block:: javascript - - web3.utils.unitMap - - -Shows all possible `ether value `_ and their amount in `wei `_. - ----------- -Return value ----------- - -- ``Object`` with the following properties: - - ``noether``: '0' - - ``wei``: '1' - - ``kwei``: '1000' - - ``Kwei``: '1000' - - ``babbage``: '1000' - - ``femtoether``: '1000' - - ``mwei``: '1000000' - - ``Mwei``: '1000000' - - ``lovelace``: '1000000' - - ``picoether``: '1000000' - - ``gwei``: '1000000000' - - ``Gwei``: '1000000000' - - ``shannon``: '1000000000' - - ``nanoether``: '1000000000' - - ``nano``: '1000000000' - - ``szabo``: '1000000000000' - - ``microether``: '1000000000000' - - ``micro``: '1000000000000' - - ``finney``: '1000000000000000' - - ``milliether``: '1000000000000000' - - ``milli``: '1000000000000000' - - ``ether``: '1000000000000000000' - - ``kether``: '1000000000000000000000' - - ``grand``: '1000000000000000000000' - - ``mether``: '1000000000000000000000000' - - ``gether``: '1000000000000000000000000000' - - ``tether``: '1000000000000000000000000000000' - - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.unitMap - > { - noether: '0', - wei: '1', - kwei: '1000', - Kwei: '1000', - babbage: '1000', - femtoether: '1000', - mwei: '1000000', - Mwei: '1000000', - lovelace: '1000000', - picoether: '1000000', - gwei: '1000000000', - Gwei: '1000000000', - shannon: '1000000000', - nanoether: '1000000000', - nano: '1000000000', - szabo: '1000000000000', - microether: '1000000000000', - micro: '1000000000000', - finney: '1000000000000000', - milliether: '1000000000000000', - milli: '1000000000000000', - ether: '1000000000000000000', - kether: '1000000000000000000000', - grand: '1000000000000000000000', - mether: '1000000000000000000000000', - gether: '1000000000000000000000000000', - tether: '1000000000000000000000000000000' - } - ------------------------------------------------------------------------------- - -padLeft -===================== - -.. code-block:: javascript - - web3.utils.padLeft(string, characterAmount [, sign]) - web3.utils.leftPad(string, characterAmount [, sign]) // ALIAS - - -Adds a padding on the left of a string, Useful for adding paddings to HEX strings. - - ----------- -Parameters ----------- - -1. ``string`` - ``String``: The string to add padding on the left. -2. ``characterAmount`` - ``Number``: The number of characters the total string should have. -3. ``sign`` - ``String`` (optional): The character sign to use, defaults to ``"0"``. - -------- -Returns -------- - -``String``: The padded string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.padLeft('0x3456ff', 20); - > "0x000000000000003456ff" - - web3.utils.padLeft(0x3456ff, 20); - > "0x000000000000003456ff" - - web3.utils.padLeft('Hello', 20, 'x'); - > "xxxxxxxxxxxxxxxHello" - ------------------------------------------------------------------------------- - -padRight -===================== - -.. code-block:: javascript - - web3.utils.padRight(string, characterAmount [, sign]) - web3.utils.rightPad(string, characterAmount [, sign]) // ALIAS - - -Adds a padding on the right of a string, Useful for adding paddings to HEX strings. - - ----------- -Parameters ----------- - -1. ``string`` - ``String``: The string to add padding on the right. -2. ``characterAmount`` - ``Number``: The number of characters the total string should have. -3. ``sign`` - ``String`` (optional): The character sign to use, defaults to ``"0"``. - -------- -Returns -------- - -``String``: The padded string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.padRight('0x3456ff', 20); - > "0x3456ff00000000000000" - - web3.utils.padRight(0x3456ff, 20); - > "0x3456ff00000000000000" - - web3.utils.padRight('Hello', 20, 'x'); - > "Helloxxxxxxxxxxxxxxx" - ------------------------------------------------------------------------------- - -toTwosComplement -===================== - -.. code-block:: javascript - - web3.utils.toTwosComplement(number) - - -Converts a negative numer into a two's complement. - - ----------- -Parameters ----------- - -1. ``number`` - ``Number|String|BigNumber``: The number to convert. - -------- -Returns -------- - -``String``: The converted hex string. - -------- -Example -------- - -.. code-block:: javascript - - web3.utils.toTwosComplement('-1'); - > "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - - web3.utils.toTwosComplement(-1); - > "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - - web3.utils.toTwosComplement('0x1'); - > "0x0000000000000000000000000000000000000000000000000000000000000001" - - web3.utils.toTwosComplement(-15); - > "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1" - - web3.utils.toTwosComplement('-0x1'); - > "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" diff --git a/docs/web3.rst b/docs/web3.rst deleted file mode 100644 index 5ae5666957f..00000000000 --- a/docs/web3.rst +++ /dev/null @@ -1,132 +0,0 @@ - -==== -Web3 -==== - -This is the main (or 'umbrella') class of the web3.js library. - -.. code-block:: javascript - - var Web3 = require('web3'); - - > Web3.utils - > Web3.version - > Web3.givenProvider - > Web3.providers - > Web3.modules - ------------------------------------------------------------------------------- - -Web3.modules -===================== - -.. code-block:: javascript - - Web3.modules - -Will return an object with the classes of all major sub modules, to be able to instantiate them manually. - -------- -Returns -------- - -``Object``: A list of module constructors: - - ``Eth`` - ``Constructor``: The Eth module for interacting with the Ethereum network (:ref:`web3.eth `). - - ``Net`` - ``Constructor``: The Net module for interacting with network properties (:ref:`web3.eth.net `). - - ``Personal`` - ``Constructor``: The Personal module for interacting with the Ethereum accounts (:ref:`web3.eth.personal `). - - ``Shh`` - ``Constructor``: The Shh module for interacting with the whisper protocol (:ref:`web3.shh `). - - ``Bzz`` - ``Constructor``: The Bzz module for interacting with the swarm network (:ref:`web3.bzz `). - -------- -Example -------- - -.. code-block:: javascript - - Web3.modules - > { - Eth: Eth(provider), - Net: Net(provider), - Personal: Personal(provider), - Shh: Shh(provider), - Bzz: Bzz(provider), - } - - ------------------------------------------------------------------------------- - -Web3 Instance -============= - -The Web3 class is an umbrella package to house all Ethereum related modules. - -.. code-block:: javascript - - var Web3 = require('web3'); - - // "Web3.providers.givenProvider" will be set if in an Ethereum supported browser. - var web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); - - > web3.eth - > web3.shh - > web3.bzz - > web3.utils - > web3.version - - ------------------------------------------------------------------------------- - -version -============ - -Static accessible property of the Web3 class and property of the instance as well. - -.. code-block:: javascript - - Web3.version - web3.version - -Contains the current package version of the web3.js library. - -------- -Returns -------- - -``String``: The current version. - -------- -Example -------- - -.. code-block:: javascript - - web3.version; - > "1.2.3" - - - ------------------------------------------------------------------------------- - - -utils -===================== - -Static accessible property of the Web3 class and property of the instance as well. - -.. code-block:: javascript - - Web3.utils - web3.utils - -Utility functions are also exposes on the ``Web3`` class object directly. - -See :ref:`web3.utils ` for more. - - ------------------------------------------------------------------------------- - - -.. include:: include_package-core.rst - - ------------------------------------------------------------------------------- diff --git a/docs/yarn.lock b/docs/yarn.lock new file mode 100644 index 00000000000..3fbad057881 --- /dev/null +++ b/docs/yarn.lock @@ -0,0 +1,9069 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" + integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-plugin-algolia-insights@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" + integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== + dependencies: + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-preset-algolia@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" + integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== + dependencies: + "@algolia/autocomplete-shared" "1.9.3" + +"@algolia/autocomplete-shared@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" + integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== + +"@algolia/cache-browser-local-storage@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz#548e3f9524988bbe0c14b7fc7b2a66335520eeb7" + integrity sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ== + dependencies: + "@algolia/cache-common" "4.22.0" + +"@algolia/cache-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.22.0.tgz#83d6111caac74a71bebe5fc050a3b64f3e45d037" + integrity sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA== + +"@algolia/cache-in-memory@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz#ff86b08d8c80a9402f39e5c64cef2ba8299bbe1d" + integrity sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA== + dependencies: + "@algolia/cache-common" "4.22.0" + +"@algolia/client-account@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.22.0.tgz#d7fa001dc062dca446f0620281fc0cec7c850487" + integrity sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/client-search" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-analytics@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.22.0.tgz#ea10e73d649aa1b9a1a25a786300d241fd4ad0d1" + integrity sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/client-search" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.22.0.tgz#4bf298acec78fa988a5b829748e6c488b8a6b570" + integrity sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag== + dependencies: + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-personalization@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.22.0.tgz#210c7d196b3c31da45e16db6ed98a7594fcf5e1c" + integrity sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/client-search@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.22.0.tgz#1113332cf973ce69067b741a17e8f798d71e07db" + integrity sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q== + dependencies: + "@algolia/client-common" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/transporter" "4.22.0" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/logger-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.22.0.tgz#f9498729ca5b0e9c0bd1b8dd729edd91ddd02b5c" + integrity sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ== + +"@algolia/logger-console@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.22.0.tgz#52e62b98fc01b40d6677b0ddf656b342e89f13c2" + integrity sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ== + dependencies: + "@algolia/logger-common" "4.22.0" + +"@algolia/requester-browser-xhr@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz#ca16e4c6860458477a00b440a407c81591f14b8a" + integrity sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg== + dependencies: + "@algolia/requester-common" "4.22.0" + +"@algolia/requester-common@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.22.0.tgz#d7a8283f5b77550eeab353c571a6566adf552fa7" + integrity sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ== + +"@algolia/requester-node-http@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz#41d5e7d5dc7adb930e7fe8dcd9d39bfc378cc5f5" + integrity sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA== + dependencies: + "@algolia/requester-common" "4.22.0" + +"@algolia/transporter@4.22.0": + version "4.22.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.22.0.tgz#733385f6457408228d2a4d7a4fe4e2b1599a5d33" + integrity sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA== + dependencies: + "@algolia/cache-common" "4.22.0" + "@algolia/logger-common" "4.22.0" + "@algolia/requester-common" "4.22.0" + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.8.3": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@^7.19.6", "@babel/core@^7.23.3": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" + integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.7" + "@babel/parser" "^7.23.6" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.23.3", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.6": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" + integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" + integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.7.tgz#eb543c36f81da2873e47b76ee032343ac83bba60" + integrity sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.7" + "@babel/types" "^7.23.6" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" + integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" + integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + +"@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5" + integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz#e7a75f815e0c534cc4c9a39c56636c84fc0d64f2" + integrity sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + +"@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143" + integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191" + integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d" + integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5" + integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e" + integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29" + integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83" + integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.23.3" + +"@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-optional-catch-binding@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017" + integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017" + integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5" + integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.18.12": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz#5efc001d07ef0f7da0d73c3a86c132f73d28e43c" + integrity sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-react-pure-annotations@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.22.9": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" + integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.23.3": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz#aa36a94e5da8d94339ae3a4e22d40ed287feb34c" + integrity sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.23.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.23.3" + +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.19.4", "@babel/preset-env@^7.22.9": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.7.tgz#e5d69b9f14db8a13bae4d8e5ce7f360973626241" + integrity sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.4" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.4" + "@babel/plugin-transform-classes" "^7.23.5" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.4" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.4" + "@babel/plugin-transform-for-of" "^7.23.6" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.4" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" + "@babel/plugin-transform-numeric-separator" "^7.23.4" + "@babel/plugin-transform-object-rest-spread" "^7.23.4" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.4" + "@babel/plugin-transform-optional-chaining" "^7.23.4" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.4" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.7" + babel-plugin-polyfill-corejs3 "^0.8.7" + babel-plugin-polyfill-regenerator "^0.5.4" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.23.3" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.23.3" + +"@babel/preset-typescript@^7.18.6", "@babel/preset-typescript@^7.22.5": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" + integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-typescript" "^7.23.3" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime-corejs3@^7.22.6": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.7.tgz#2c3d323d21569f2950c9126780bfa400632360bd" + integrity sha512-ER55qzLREVA5YxeyQ3Qu48tgsF2ZrFjFjUS6V6wF0cikSw+goBJgB9PBRM1T6+Ah4iiM+sxmfS/Sy/jdzFfhiQ== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" + integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.7": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" + integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.4.4": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@docsearch/css@3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.2.tgz#610f47b48814ca94041df969d9fcc47b91fc5aac" + integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA== + +"@docsearch/react@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.2.tgz#2e6bbee00eb67333b64906352734da6aef1232b9" + integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng== + dependencies: + "@algolia/autocomplete-core" "1.9.3" + "@algolia/autocomplete-preset-algolia" "1.9.3" + "@docsearch/css" "3.5.2" + algoliasearch "^4.19.1" + +"@docusaurus/core@3.0.1", "@docusaurus/core@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.0.1.tgz#ad9a66b20802ea81b25e65db75d4ca952eda7e01" + integrity sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ== + dependencies: + "@babel/core" "^7.23.3" + "@babel/generator" "^7.23.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/preset-react" "^7.22.5" + "@babel/preset-typescript" "^7.22.5" + "@babel/runtime" "^7.22.6" + "@babel/runtime-corejs3" "^7.22.6" + "@babel/traverse" "^7.22.8" + "@docusaurus/cssnano-preset" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" + "@svgr/webpack" "^6.5.1" + autoprefixer "^10.4.14" + babel-loader "^9.1.3" + babel-plugin-dynamic-import-node "^2.3.3" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + clean-css "^5.3.2" + cli-table3 "^0.6.3" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^11.0.0" + core-js "^3.31.1" + css-loader "^6.8.1" + css-minimizer-webpack-plugin "^4.2.2" + cssnano "^5.1.15" + del "^6.1.1" + detect-port "^1.5.1" + escape-html "^1.0.3" + eta "^2.2.0" + file-loader "^6.2.0" + fs-extra "^11.1.1" + html-minifier-terser "^7.2.0" + html-tags "^3.3.1" + html-webpack-plugin "^5.5.3" + leven "^3.1.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.7.6" + postcss "^8.4.26" + postcss-loader "^7.3.3" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.4" + react-router-config "^5.1.1" + react-router-dom "^5.3.4" + rtl-detect "^1.0.4" + semver "^7.5.4" + serve-handler "^6.1.5" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + update-notifier "^6.0.2" + url-loader "^4.1.1" + webpack "^5.88.1" + webpack-bundle-analyzer "^4.9.0" + webpack-dev-server "^4.15.1" + webpack-merge "^5.9.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz#22fbf2e97389e338747864baf011743846e8fd26" + integrity sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ== + dependencies: + cssnano-preset-advanced "^5.3.10" + postcss "^8.4.26" + postcss-sort-media-queries "^4.4.1" + tslib "^2.6.0" + +"@docusaurus/logger@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.0.1.tgz#06f512eef6c6ae4e2da63064257e01b1cdc41a82" + integrity sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ== + dependencies: + chalk "^4.1.2" + tslib "^2.6.0" + +"@docusaurus/mdx-loader@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz#89f221e5bcc570983fd61d7ab56d6fbe36810b59" + integrity sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ== + dependencies: + "@babel/parser" "^7.22.7" + "@babel/traverse" "^7.22.8" + "@docusaurus/logger" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@mdx-js/mdx" "^3.0.0" + "@slorber/remark-comment" "^1.0.0" + escape-html "^1.0.3" + estree-util-value-to-estree "^3.0.1" + file-loader "^6.2.0" + fs-extra "^11.1.1" + image-size "^1.0.2" + mdast-util-mdx "^3.0.0" + mdast-util-to-string "^4.0.0" + rehype-raw "^7.0.0" + remark-directive "^3.0.0" + remark-emoji "^4.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" + stringify-object "^3.3.0" + tslib "^2.6.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" + url-loader "^4.1.1" + vfile "^6.0.1" + webpack "^5.88.1" + +"@docusaurus/module-type-aliases@3.0.1", "@docusaurus/module-type-aliases@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz#d45990fe377d7ffaa68841cf89401188a5d65293" + integrity sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag== + dependencies: + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "3.0.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-content-blog@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.1.tgz#dee6147187c2d8b634252444d60312d12c9571a6" + integrity sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + cheerio "^1.0.0-rc.12" + feed "^4.2.2" + fs-extra "^11.1.1" + lodash "^4.17.21" + reading-time "^1.5.0" + srcset "^4.0.0" + tslib "^2.6.0" + unist-util-visit "^5.0.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-docs@3.0.1", "@docusaurus/plugin-content-docs@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz#d9b1884562186573d5c4521ac3546b68512c1126" + integrity sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/module-type-aliases" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@types/react-router-config" "^5.0.7" + combine-promises "^1.1.0" + fs-extra "^11.1.1" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.6.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-pages@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.1.tgz#27e6424c77173f867760efe53f848bbab8849ea6" + integrity sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + fs-extra "^11.1.1" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/plugin-debug@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.0.1.tgz#886b5dd03c066e970484ca251c1b79613df90700" + integrity sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + fs-extra "^11.1.1" + react-json-view-lite "^1.2.0" + tslib "^2.6.0" + +"@docusaurus/plugin-google-analytics@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.1.tgz#ec69902131ea3aad8b062eeb1d17bf0962986f80" + integrity sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + tslib "^2.6.0" + +"@docusaurus/plugin-google-gtag@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.1.tgz#bb5526377d3a324ebec235127846fda386562b05" + integrity sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@types/gtag.js" "^0.0.12" + tslib "^2.6.0" + +"@docusaurus/plugin-google-tag-manager@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.1.tgz#4e36d13279cf90c2614b62438aa1109dd4696ec8" + integrity sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + tslib "^2.6.0" + +"@docusaurus/plugin-sitemap@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.1.tgz#ab55857e90d4500f892e110b30e4bc3289202bd4" + integrity sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + fs-extra "^11.1.1" + sitemap "^7.1.1" + tslib "^2.6.0" + +"@docusaurus/preset-classic@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.0.1.tgz#d363ac837bba967095ed2a896d13c54f3717d6b5" + integrity sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/plugin-content-blog" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/plugin-content-pages" "3.0.1" + "@docusaurus/plugin-debug" "3.0.1" + "@docusaurus/plugin-google-analytics" "3.0.1" + "@docusaurus/plugin-google-gtag" "3.0.1" + "@docusaurus/plugin-google-tag-manager" "3.0.1" + "@docusaurus/plugin-sitemap" "3.0.1" + "@docusaurus/theme-classic" "3.0.1" + "@docusaurus/theme-common" "3.0.1" + "@docusaurus/theme-search-algolia" "3.0.1" + "@docusaurus/types" "3.0.1" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.0.1.tgz#3ba4dc77553d2c1608e433c0d01bed7c6db14eb9" + integrity sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/module-type-aliases" "3.0.1" + "@docusaurus/plugin-content-blog" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/plugin-content-pages" "3.0.1" + "@docusaurus/theme-common" "3.0.1" + "@docusaurus/theme-translations" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@mdx-js/react" "^3.0.0" + clsx "^2.0.0" + copy-text-to-clipboard "^3.2.0" + infima "0.2.0-alpha.43" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.26" + prism-react-renderer "^2.3.0" + prismjs "^1.29.0" + react-router-dom "^5.3.4" + rtlcss "^4.1.0" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.0.1.tgz#29a5bcb286296a52bc10afa5308e360cbed6b49c" + integrity sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag== + dependencies: + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/module-type-aliases" "3.0.1" + "@docusaurus/plugin-content-blog" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/plugin-content-pages" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^2.0.0" + parse-numeric-range "^1.3.0" + prism-react-renderer "^2.3.0" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-live-codeblock@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-3.0.1.tgz#55624fba479da9816419f80b40d070b67cab364a" + integrity sha512-1NfV6pi7uoFTq7Yj3Rc9NBWMVj3OZbwWxV5tcCY/TNvlJOWerSNZQIz0oF2cqU7QPfw/ZOCPz5imM1uQ4pKN2g== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/theme-common" "3.0.1" + "@docusaurus/theme-translations" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + "@philpl/buble" "^0.19.7" + clsx "^2.0.0" + fs-extra "^11.1.1" + react-live "^4.1.5" + tslib "^2.6.0" + +"@docusaurus/theme-search-algolia@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.1.tgz#d8fb6bddca8d8355e4706c4c7d30d3b800217cf4" + integrity sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA== + dependencies: + "@docsearch/react" "^3.5.2" + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/theme-common" "3.0.1" + "@docusaurus/theme-translations" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" + algoliasearch "^4.18.0" + algoliasearch-helper "^3.13.3" + clsx "^2.0.0" + eta "^2.2.0" + fs-extra "^11.1.1" + lodash "^4.17.21" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz#837a01a166ccd698a3eceaed0c2f798555bc024b" + integrity sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg== + dependencies: + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/types@3.0.1", "@docusaurus/types@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.0.1.tgz#4fe306aa10ef7c97dbc07588864f6676a40f3b6f" + integrity sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.9.2" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.88.1" + webpack-merge "^5.9.0" + +"@docusaurus/utils-common@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.0.1.tgz#111f450089d5f0a290c0c25f8a574a270d08436f" + integrity sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg== + dependencies: + tslib "^2.6.0" + +"@docusaurus/utils-validation@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz#3c5f12941b328a19fc9acb34d070219f3e865ec6" + integrity sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg== + dependencies: + "@docusaurus/logger" "3.0.1" + "@docusaurus/utils" "3.0.1" + joi "^17.9.2" + js-yaml "^4.1.0" + tslib "^2.6.0" + +"@docusaurus/utils@3.0.1", "@docusaurus/utils@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.0.1.tgz#c64f68980a90c5bc6d53a5b8f32deb9026b1e303" + integrity sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g== + dependencies: + "@docusaurus/logger" "3.0.1" + "@svgr/webpack" "^6.5.1" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^11.1.1" + github-slugger "^1.5.0" + globby "^11.1.0" + gray-matter "^4.0.3" + jiti "^1.20.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.6.0" + url-loader "^4.1.1" + webpack "^5.88.1" + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.0.tgz#37ef87685143fafedf1165f0a79e9fe95fbe5154" + integrity sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-build-jsx "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-to-js "^2.0.0" + estree-walker "^3.0.0" + hast-util-to-estree "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + periscopic "^3.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.0.0.tgz#eaccaa8d6a7736b19080aff5a70448a7ba692271" + integrity sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ== + dependencies: + "@types/mdx" "^2.0.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@philpl/buble@^0.19.7": + version "0.19.7" + resolved "https://registry.yarnpkg.com/@philpl/buble/-/buble-0.19.7.tgz#27231e6391393793b64bc1c982fc7b593198b893" + integrity sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA== + dependencies: + acorn "^6.1.1" + acorn-class-fields "^0.2.1" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.0.1" + chalk "^2.4.2" + magic-string "^0.25.2" + minimist "^1.2.0" + os-homedir "^1.0.1" + regexpu-core "^4.5.4" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.24" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.24.tgz#58601079e11784d20f82d0585865bb42305c4df3" + integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@slorber/remark-comment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a" + integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.1.0" + micromark-util-symbol "^1.0.1" + +"@slorber/static-site-generator-webpack-plugin@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" + integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== + dependencies: + eval "^0.1.8" + p-map "^4.0.0" + webpack-sources "^3.2.2" + +"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" + integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== + +"@svgr/babel-plugin-remove-jsx-attribute@*": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@*": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" + integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== + +"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" + integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== + +"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" + integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" + integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== + +"@svgr/babel-plugin-transform-svg-component@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" + integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== + +"@svgr/babel-preset@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" + integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" + "@svgr/babel-plugin-remove-jsx-attribute" "*" + "@svgr/babel-plugin-remove-jsx-empty-expression" "*" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" + "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" + "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" + "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" + "@svgr/babel-plugin-transform-svg-component" "^6.5.1" + +"@svgr/core@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" + integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" + integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== + dependencies: + "@babel/types" "^7.20.0" + entities "^4.4.0" + +"@svgr/plugin-jsx@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" + integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== + dependencies: + "@babel/core" "^7.19.6" + "@svgr/babel-preset" "^6.5.1" + "@svgr/hast-util-to-babel-ast" "^6.5.1" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" + integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.8.0" + +"@svgr/webpack@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" + integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== + dependencies: + "@babel/core" "^7.19.6" + "@babel/plugin-transform-react-constant-elements" "^7.18.12" + "@babel/preset-env" "^7.19.4" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@svgr/core" "^6.5.1" + "@svgr/plugin-jsx" "^6.5.1" + "@svgr/plugin-svgo" "^6.5.1" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@tsconfig/docusaurus@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/docusaurus/-/docusaurus-2.0.2.tgz#f96c7453ce9969ef938284eac74441e2d646efd7" + integrity sha512-12HWfYmgUl4M2o76/TFufGtI68wl2k/b8qPrIrG7ci9YJLrpAtadpy897Bz5v29Mlkr7a1Hq4KHdQTKtU+2rhQ== + +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.1.tgz#988cabb39c973e9200f35fdbb29d17992965bb08" + integrity sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.3.tgz#f8aa833ec986d82b8271a294a92ed1565bf2c66a" + integrity sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.41" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/gtag.js@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" + integrity sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg== + +"@types/hast@^2.0.0": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.9.tgz#a9a1b5bbce46e8a1312e977364bacabc8e93d2cf" + integrity sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw== + dependencies: + "@types/unist" "^2" + +"@types/hast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" + integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== + dependencies: + "@types/unist" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mdast@^4.0.0", "@types/mdast@^4.0.2": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.10.tgz#0d7b57fb1d83e27656156e4ee0dfba96532930e4" + integrity sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg== + +"@types/mime@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.10.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" + integrity sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw== + dependencies: + undici-types "~5.26.4" + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prismjs@^1.26.0": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.3.tgz#47fe8e784c2dee24fe636cab82e090d3da9b7dec" + integrity sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw== + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/qs@*": + version "6.9.11" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" + integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.7": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.11.tgz#2761a23acc7905a66a94419ee40294a65aaa483a" + integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "^5.1.0" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*", "@types/react-router@^5.1.0": + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react@*": + version "18.2.46" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.46.tgz#f04d6c528f8f136ea66333bc66abcae46e2680df" + integrity sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/sax@^1.2.1": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + +"@types/ws@^8.5.5": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vscode/codicons@^0.0.35": + version "0.0.35" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.35.tgz#7424a647f39c6e71c86c1edf12bfc27196c8fba1" + integrity sha512-7iiKdA5wHVYSbO7/Mm0hiHD3i4h+9hKUe1O4hISAe/nHhagMwb2ZbFC8jU6d7Cw+JNT2dWXN2j+WHbkhT5/l2w== + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-class-fields@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.2.1.tgz#748058bceeb0ef25164bbc671993984083f5a085" + integrity sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ== + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.0.0, acorn-jsx@^5.0.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" + integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== + +acorn@^6.1.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.2, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +algoliasearch-helper@^3.13.3: + version "3.16.1" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz#421e3554ec86e14e60e7e0bf796aef61cf4a06ec" + integrity sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.18.0, algoliasearch@^4.19.1: + version "4.22.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.22.0.tgz#9ece4446b5ab0af941ef97553c18ddcd1b8040a5" + integrity sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg== + dependencies: + "@algolia/cache-browser-local-storage" "4.22.0" + "@algolia/cache-common" "4.22.0" + "@algolia/cache-in-memory" "4.22.0" + "@algolia/client-account" "4.22.0" + "@algolia/client-analytics" "4.22.0" + "@algolia/client-common" "4.22.0" + "@algolia/client-personalization" "4.22.0" + "@algolia/client-search" "4.22.0" + "@algolia/logger-common" "4.22.0" + "@algolia/logger-console" "4.22.0" + "@algolia/requester-browser-xhr" "4.22.0" + "@algolia/requester-common" "4.22.0" + "@algolia/requester-node-http" "4.22.0" + "@algolia/transporter" "4.22.0" + +ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-sequence-parser@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +arg@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +astring@^1.8.0: + version "1.8.6" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" + integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autocomplete.js@^0.37.0: + version "0.37.1" + resolved "https://registry.yarnpkg.com/autocomplete.js/-/autocomplete.js-0.37.1.tgz#a29a048d827e7d2bf8f7df8b831766e5cc97df01" + integrity sha512-PgSe9fHYhZEsm/9jggbjtVsGXJkPLvd+9mC7gZJ662vVL5CRWEtm/mIrrzCx0MrNxHVwxD5d00UOn6NsmL2LUQ== + dependencies: + immediate "^3.2.3" + +autoprefixer@^10.4.12, autoprefixer@^10.4.14: + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +babel-loader@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-polyfill-corejs2@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" + integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.4" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" + integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.4" + core-js-compat "^3.33.1" + +babel-plugin-polyfill-regenerator@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" + integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.4" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bcp-47-match@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-1.0.3.tgz#cb8d03071389a10aff2062b862d6575ffd7cd7ef" + integrity sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.0.tgz#1c56da07a76e33b049ba7d865859abee5297f55a" + integrity sha512-xdzMA6JGckxyJzZByjEWRcfKmDxXaGXZWVftah3FkCqdlePNS9DjHSUN5zkP4oEfz/t0EXXlro88EIhzwMB4zA== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +call-bind@^1.0.0, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: + version "1.0.30001574" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz#fb4f1359c77f6af942510493672e1ec7ec80230c" + integrity sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.0.1, chalk@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +classnames@^2.3.2: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +clean-css@^5.2.2, clean-css@^5.3.2, clean-css@~5.3.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-table3@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combine-promises@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-control-strings@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-text-to-clipboard@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz#0202b2d9bdae30a49a53f898626dcc3b49ad960b" + integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.35.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.35.0.tgz#c149a3d1ab51e743bc1da61e39cb51f461a41873" + integrity sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw== + dependencies: + browserslist "^4.22.2" + +core-js-pure@^3.30.2: + version "3.35.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.35.0.tgz#4660033304a050215ae82e476bd2513a419fbb34" + integrity sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew== + +core-js@^3.31.1: + version "3.35.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.35.0.tgz#58e651688484f83c34196ca13f099574ee53d6b4" + integrity sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cosmiconfig@^8.3.5: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== + +css-loader@^6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== + dependencies: + cssnano "^5.1.8" + jest-worker "^29.1.2" + postcss "^8.4.17" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-selector-parser@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" + integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" + integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== + dependencies: + autoprefixer "^10.4.12" + cssnano-preset-default "^5.2.14" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.1.15, cssnano@^5.1.8: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +direction@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/direction/-/direction-1.0.4.tgz#2b86fb686967e987088caf8b89059370d4837442" + integrity sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ== + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +docusaurus-lunr-search@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/docusaurus-lunr-search/-/docusaurus-lunr-search-3.3.1.tgz#4ee77853b21c1f6a652c9545d8ba8dc3bd8b3ab9" + integrity sha512-EWUeHlTf+wVDLYLvgxeqavhww59elc9XfvlC9ZEHdeBT+kEbDdCdcC0CnHHeHVqePbMoHYfA8RhsXKYcLp6qgw== + dependencies: + autocomplete.js "^0.37.0" + clsx "^1.2.1" + gauge "^3.0.0" + hast-util-select "^4.0.0" + hast-util-to-text "^2.0.0" + hogan.js "^3.0.2" + lunr "^2.3.8" + lunr-languages "^1.4.0" + mark.js "^8.11.1" + minimatch "^3.0.4" + rehype-parse "^7.0.1" + to-vfile "^6.1.0" + unified "^9.0.0" + unist-util-is "^4.0.2" + +docusaurus-plugin-typedoc-api@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-typedoc-api/-/docusaurus-plugin-typedoc-api-4.0.1.tgz#c4051a112608046e7717d7238689c173b4a48d2b" + integrity sha512-mHHqvSz3qEPj1IPYa7Td75CWpWsVd6O0Fwex6XfZgj5kUDjeFCw50arc7j9n8xjXcqC1iIQ1ppz+AWwfSRZ0Kw== + dependencies: + "@docusaurus/plugin-content-docs" "^3.0.0" + "@docusaurus/types" "^3.0.0" + "@docusaurus/utils" "^3.0.0" + "@vscode/codicons" "^0.0.35" + marked "^9.1.5" + marked-smartypants "^1.1.3" + typedoc "^0.25.3" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.601: + version "1.4.620" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.620.tgz#a6481e0703f8df1e6821063fb43c9b818a7a2ef4" + integrity sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.0.1.tgz#2d2bbbf231ce3a5909e185bbb64a9da703a1e749" + integrity sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^1.2.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz#41ea21b43908fe6a287ffcbe4300f790555331f5" + integrity sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz#0b7b5d6b6a4aaad5c60999ffbc265a985df98ac5" + integrity sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA== + dependencies: + "@types/estree" "^1.0.0" + is-plain-obj "^4.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.0.0: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.3.6: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-slugger@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^8.0.0" + property-information "^6.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-has-property@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz#9f137565fad6082524b382c1e7d7d33ca5059f36" + integrity sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg== + +hast-util-is-element@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" + integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" + integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-select@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hast-util-select/-/hast-util-select-4.0.2.tgz#ae3ef2860e02cda2ad3a2e72b47c1f5e8f44e9e7" + integrity sha512-8EEG2//bN5rrzboPWD2HdS3ugLijNioS1pqOTIolXNf67xxShYw4SQEmVXd3imiBG+U2bC2nVTySr/iRAA7Cjg== + dependencies: + bcp-47-match "^1.0.0" + comma-separated-tokens "^1.0.0" + css-selector-parser "^1.0.0" + direction "^1.0.0" + hast-util-has-property "^1.0.0" + hast-util-is-element "^1.0.0" + hast-util-to-string "^1.0.0" + hast-util-whitespace "^1.0.0" + not "^0.1.0" + nth-check "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + unist-util-visit "^2.0.0" + zwitch "^1.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" + integrity sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" + integrity sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-string@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz#9b24c114866bdb9478927d7e9c36a485ac728378" + integrity sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w== + +hast-util-to-text@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-2.0.1.tgz#04f2e065642a0edb08341976084aa217624a0f8b" + integrity sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ== + dependencies: + hast-util-is-element "^1.0.0" + repeat-string "^1.0.0" + unist-util-find-after "^3.0.0" + +hast-util-whitespace@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" + integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hogan.js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" + integrity sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg== + dependencies: + mkdirp "0.3.0" + nopt "1.0.10" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-minifier-terser@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" + integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== + dependencies: + camel-case "^4.1.2" + clean-css "~5.3.2" + commander "^10.0.0" + entities "^4.4.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.15.1" + +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +html-webpack-plugin@^5.5.3: + version "5.6.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" + integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +image-size@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== + dependencies: + queue "6.0.2" + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immer@^9.0.7: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.43: + version "0.2.0-alpha.43" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" + integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +inline-style-parser@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz#d498b4e6de0373458fc610ff793f6b14ebf45633" + integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.0.0.tgz#b59e75e8915543ca5d881ecff864077cba095261" + integrity sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-reference@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== + dependencies: + "@types/estree" "*" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.1.2: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +joi@^17.9.2: + version "17.11.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + +lunr-languages@^1.4.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/lunr-languages/-/lunr-languages-1.14.0.tgz#6e97635f434631729dd0e5654daedd291cd6f2d0" + integrity sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA== + +lunr@^2.3.8, lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +magic-string@^0.25.2: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +mark.js@^8.11.1: + version "8.11.1" + resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== + +marked-smartypants@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/marked-smartypants/-/marked-smartypants-1.1.5.tgz#1ea079764ce47c963843c2f77b5a6cb85664f409" + integrity sha512-gp+IpDsthwcXJ/sWT8si7dGWL6Diag3Iy4+OOoMZnhjFAox9z77cWfqQUmwY9oP9XACWZeiBXvWW1TOjTbvwAw== + dependencies: + smartypants "^0.2.2" + +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +marked@^9.1.5: + version "9.1.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-9.1.6.tgz#5d2a3f8180abfbc5d62e3258a38a1c19c0381695" + integrity sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q== + +mdast-util-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" + integrity sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" + integrity sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz#f73631fa5bb7a36712ff1e9cedec0cafed03401c" + integrity sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^5.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz#468cbbb277375523de807248b8ad969feb02a5c7" + integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz#527869de497a6de9024138479091bc885dae076b" + integrity sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz#f1e50b42e67d441528f39a67133eddde2bbabfd9" + integrity sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz#91afad310065a94b636ab1e9dab2c60d1aab953c" + integrity sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz#6917db8e320da70e39ffbf97abdbff83e6783e61" + integrity sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz#2cf3fe352d9e089b7ef5fff003bdfe0da29649b7" + integrity sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz#ee8b208f1ced1eb9fb11c19a23666e59d86d4838" + integrity sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz#1407b9ce69916cf5e03a196ad9586889df25302a" + integrity sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz#4aba0797c25efb2366a3fd2d367c6b1c1159f4f5" + integrity sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz#f2a9724ce174f1751173beb2c1f88062d3373b1b" + integrity sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz#4275834f5453c088bd29cd72dfbf80e3327cec07" + integrity sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + +micromark-util-types@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +mini-css-extract-plugin@^2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1, minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew== + +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" + integrity sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA== + dependencies: + "@sindresorhus/is" "^4.6.0" + char-regex "^1.0.2" + emojilib "^2.4.0" + skin-tone "^2.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +nopt@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +not@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/not/-/not-0.1.0.tgz#c9691c1746c55dcfbe54cbd8bd4ff041bc2b519d" + integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.0, nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + dependencies: + "@types/unist" "^2.0.0" + character-entities "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +periscopic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^3.0.0" + is-reference "^3.0.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^7.3.3: + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== + dependencies: + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" + +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" + integrity sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" + integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== + dependencies: + sort-css-media-queries "2.1.0" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== + +postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.26: + version "8.4.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" + integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^2.0.6, prism-react-renderer@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz#e59e5450052ede17488f6bc85de1553f584ff8d5" + integrity sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^2.0.0" + +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +property-information@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pupa@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.1.0.tgz#f15610274376bbcc70c9a3aa8b505ea23f41c579" + integrity sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug== + dependencies: + escape-goat "^4.0.0" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-helmet-async@*: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.4.tgz#50a4377778f380ed1d0136303916b38eff1bf153" + integrity sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ== + dependencies: + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" + +react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view-lite@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz#c59a0bea4ede394db331d482ee02e293d38f8218" + integrity sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ== + +react-live@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/react-live/-/react-live-4.1.5.tgz#a4fa4cfdcad763503a209a29bace3339764fdfb1" + integrity sha512-ul3Zwvqvh6KTg8j7xGCT26+c8J9vQ+LFUrZCbrrrzEExuVB/39s1GKG3NsywnL+aGAjpfnUTaVCe7KlKIvVPiw== + dependencies: + prism-react-renderer "^2.0.6" + sucrase "^3.31.0" + use-editable "^2.3.3" + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4, react-router@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^4.5.4: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +rehype-parse@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-7.0.1.tgz#58900f6702b56767814afc2a9efa2d42b1c90c57" + integrity sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw== + dependencies: + hast-util-from-parse5 "^6.0.0" + parse5 "^6.0.0" + +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-directive@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.0.tgz#34452d951b37e6207d2e2a4f830dc33442923268" + integrity sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-directive "^3.0.0" + micromark-extension-directive "^3.0.0" + unified "^11.0.0" + +remark-emoji@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" + integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== + dependencies: + "@types/mdast" "^4.0.2" + emoticon "^4.0.1" + mdast-util-find-and-replace "^3.0.1" + node-emoji "^2.1.0" + unified "^11.0.4" + +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.0.tgz#146905a3925b078970e05fc89b0e16b9cc3bfddd" + integrity sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" + integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.14.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.1.2" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" + integrity sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ== + +rtlcss@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-4.1.1.tgz#f20409fcc197e47d1925996372be196fee900c0c" + integrity sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + postcss "^8.4.21" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" + integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.1.2" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shiki@^0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" + integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== + dependencies: + ansi-sequence-parser "^1.1.0" + jsonc-parser "^3.2.0" + vscode-oniguruma "^1.7.0" + vscode-textmate "^8.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +smartypants@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/smartypants/-/smartypants-0.2.2.tgz#ad7124d8eb9ab437906db1cd7bd7aaf49e5d9a42" + integrity sha512-TzobUYoEft/xBtb2voRPryAUIvYguG0V7Tt3de79I1WfXgCwelqVsGuZSnu3GFGRZhXR90AeEYIM+icuB/S06Q== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" + integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +std-env@^3.0.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-to-object@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== + dependencies: + inline-style-parser "0.1.1" + +style-to-object@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.5.tgz#5e918349bc3a39eee3a804497d97fcbbf2f0d7c0" + integrity sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ== + dependencies: + inline-style-parser "0.2.2" + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +sucrase@^3.31.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^2.7.0, svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.7, terser-webpack-plugin@^5.3.9: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: + version "5.26.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" + integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-vfile@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-6.1.0.tgz#5f7a3f65813c2c4e34ee1f7643a5646344627699" + integrity sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw== + dependencies: + is-buffer "^2.0.0" + vfile "^4.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^2.0.3, tslib@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.13.0, type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedoc@^0.25.3: + version "0.25.6" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.6.tgz#1505538aecea511dd669652c71d042a2427bd4fc" + integrity sha512-1rdionQMpOkpA58qfym1J+YD+ukyA1IEIa4VZahQI2ZORez7dhOvEyUotQL/8rSoMBopdzOS+vAIsORpQO4cTA== + dependencies: + lunr "^2.3.9" + marked "^4.3.0" + minimatch "^9.0.3" + shiki "^0.14.7" + +typescript@^4.6.4: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0, unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unified@^9.0.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +unist-util-find-after@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-3.0.0.tgz#5c65fcebf64d4f8f496db46fa8fd0fbf354b43e6" + integrity sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ== + dependencies: + unist-util-is "^4.0.0" + +unist-util-is@^4.0.0, unist-util-is@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" + is-installed-globally "^0.4.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +use-editable@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f" + integrity sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-location@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +vscode-oniguruma@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== + +vscode-textmate@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +webpack-bundle-analyzer@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" + integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + is-plain-object "^5.0.0" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.15.1: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.88.1: + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== + dependencies: + chalk "^4.1.0" + consola "^2.15.3" + pretty-time "^1.1.0" + std-env "^3.0.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/fixtures/build/Basic.json b/fixtures/build/Basic.json new file mode 100644 index 00000000000..13871960a67 --- /dev/null +++ b/fixtures/build/Basic.json @@ -0,0 +1,301 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_val", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_stringValue", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "str", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "val", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bool", + "name": "flag", + "type": "bool" + } + ], + "name": "MultiValueEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "str", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "val", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bool", + "name": "flag", + "type": "bool" + } + ], + "name": "MultiValueIndexedEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "string", + "name": "str", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "val", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "bool", + "name": "flag", + "type": "bool" + } + ], + "name": "MultiValueIndexedEventWithStringIndexed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "StringEvent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + }, + { + "internalType": "uint256", + "name": "val", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "flag", + "type": "bool" + } + ], + "name": "firesMultiValueEvent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + }, + { + "internalType": "uint256", + "name": "val", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "flag", + "type": "bool" + } + ], + "name": "firesMultiValueIndexedEvent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + }, + { + "internalType": "uint256", + "name": "val", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "flag", + "type": "bool" + } + ], + "name": "firesMultiValueIndexedEventWithStringIndexed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_str", + "type": "string" + } + ], + "name": "firesStringEvent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getBoolValue", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getIntValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStringValue", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getValues", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "requireWithReason", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "requireWithoutReason", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "reverts", + "outputs": [], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_value", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_stringValue", + "type": "string" + }, + { + "internalType": "bool", + "name": "_boolValue", + "type": "bool" + } + ], + "name": "setValues", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "60806040523480156200001157600080fd5b5060405162001068380380620010688339818101604052810190620000379190620002e7565b816000819055508060019080519060200190620000569291906200005f565b505050620003b1565b8280546200006d906200037c565b90600052602060002090601f016020900481019282620000915760008555620000dd565b82601f10620000ac57805160ff1916838001178555620000dd565b82800160010185558215620000dd579182015b82811115620000dc578251825591602001919060010190620000bf565b5b509050620000ec9190620000f0565b5090565b5b808211156200010b576000816000905550600101620000f1565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620001388162000123565b81146200014457600080fd5b50565b60008151905062000158816200012d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001b38262000168565b810181811067ffffffffffffffff82111715620001d557620001d462000179565b5b80604052505050565b6000620001ea6200010f565b9050620001f88282620001a8565b919050565b600067ffffffffffffffff8211156200021b576200021a62000179565b5b620002268262000168565b9050602081019050919050565b60005b838110156200025357808201518184015260208101905062000236565b8381111562000263576000848401525b50505050565b6000620002806200027a84620001fd565b620001de565b9050828152602081018484840111156200029f576200029e62000163565b5b620002ac84828562000233565b509392505050565b600082601f830112620002cc57620002cb6200015e565b5b8151620002de84826020860162000269565b91505092915050565b6000806040838503121562000301576200030062000119565b5b6000620003118582860162000147565b925050602083015167ffffffffffffffff8111156200033557620003346200011e565b5b6200034385828601620002b4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039557607f821691505b602082108103620003ab57620003aa6200034d565b5b50919050565b610ca780620003c16000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063844d6a3211610071578063844d6a3214610157578063939d7c4e14610161578063ae012ede1461017d578063b7a8238a14610187578063d7af8ac1146101a3578063e8256ea0146101bf576100b4565b806319eb4a90146100b95780632bfc4c69146100d95780633bccbbc9146100f75780635a018657146101015780637cfbdcf01461011d578063828909bd14610139575b600080fd5b6100c16101dd565b6040516100d093929190610680565b60405180910390f35b6100e161028e565b6040516100ee91906106be565b60405180910390f35b6100ff610320565b005b61011b60048036038101906101169190610881565b61035b565b005b61013760048036038101906101329190610950565b61039b565b005b6101416103e9565b60405161014e91906109c4565b60405180910390f35b61015f6103f2565b005b61017b60048036038101906101769190610881565b610435565b005b610185610475565b005b6101a1600480360381019061019c91906109df565b610482565b005b6101bd60048036038101906101b89190610a28565b6104bc565b005b6101c76104f9565b6040516101d49190610a97565b60405180910390f35b60006060600080546001600260009054906101000a900460ff1681805461020390610ae1565b80601f016020809104026020016040519081016040528092919081815260200182805461022f90610ae1565b801561027c5780601f106102515761010080835404028352916020019161027c565b820191906000526020600020905b81548152906001019060200180831161025f57829003601f168201915b50505050509150925092509250909192565b60606001805461029d90610ae1565b80601f01602080910402602001604051908101604052809291908181526020018280546102c990610ae1565b80156103165780601f106102eb57610100808354040283529160200191610316565b820191906000526020600020905b8154815290600101906020018083116102f957829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035290610b5e565b60405180910390fd5b7fa8297798732ff8a80a23cf22707934835a9d5b03536598708f7414646a1b95b383838360405161038e93929190610b7e565b60405180910390a1505050565b8015158285856040516103af929190610bec565b60405180910390207f5b5730af07e266d8b4845f404beb3b193085c686b0edd8e8e20cd4b3fc2b6cd560405160405180910390a450505050565b60008054905090565b6000610433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042a90610c51565b60405180910390fd5b565b801515827f553c4a49a36d26504ba0880f2f9bfe9ac7db4b81a893bde296546cd96ae0b33c8560405161046891906106be565b60405180910390a3505050565b600061048057600080fd5b565b7f617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab816040516104b191906106be565b60405180910390a150565b8260008190555081600190805190602001906104d9929190610510565b5080600260006101000a81548160ff021916908315150217905550505050565b6000600260009054906101000a900460ff16905090565b82805461051c90610ae1565b90600052602060002090601f01602090048101928261053e5760008555610585565b82601f1061055757805160ff1916838001178555610585565b82800160010185558215610585579182015b82811115610584578251825591602001919060010190610569565b5b5090506105929190610596565b5090565b5b808211156105af576000816000905550600101610597565b5090565b6000819050919050565b6105c6816105b3565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156106065780820151818401526020810190506105eb565b83811115610615576000848401525b50505050565b6000601f19601f8301169050919050565b6000610637826105cc565b61064181856105d7565b93506106518185602086016105e8565b61065a8161061b565b840191505092915050565b60008115159050919050565b61067a81610665565b82525050565b600060608201905061069560008301866105bd565b81810360208301526106a7818561062c565b90506106b66040830184610671565b949350505050565b600060208201905081810360008301526106d8818461062c565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6107368261061b565b810181811067ffffffffffffffff82111715610755576107546106fe565b5b80604052505050565b60006107686106e0565b9050610774828261072d565b919050565b600067ffffffffffffffff821115610794576107936106fe565b5b61079d8261061b565b9050602081019050919050565b82818337600083830152505050565b60006107cc6107c784610779565b61075e565b9050828152602081018484840111156107e8576107e76106f9565b5b6107f38482856107aa565b509392505050565b600082601f8301126108105761080f6106f4565b5b81356108208482602086016107b9565b91505092915050565b610832816105b3565b811461083d57600080fd5b50565b60008135905061084f81610829565b92915050565b61085e81610665565b811461086957600080fd5b50565b60008135905061087b81610855565b92915050565b60008060006060848603121561089a576108996106ea565b5b600084013567ffffffffffffffff8111156108b8576108b76106ef565b5b6108c4868287016107fb565b93505060206108d586828701610840565b92505060406108e68682870161086c565b9150509250925092565b600080fd5b600080fd5b60008083601f8401126109105761090f6106f4565b5b8235905067ffffffffffffffff81111561092d5761092c6108f0565b5b602083019150836001820283011115610949576109486108f5565b5b9250929050565b6000806000806060858703121561096a576109696106ea565b5b600085013567ffffffffffffffff811115610988576109876106ef565b5b610994878288016108fa565b945094505060206109a787828801610840565b92505060406109b88782880161086c565b91505092959194509250565b60006020820190506109d960008301846105bd565b92915050565b6000602082840312156109f5576109f46106ea565b5b600082013567ffffffffffffffff811115610a1357610a126106ef565b5b610a1f848285016107fb565b91505092915050565b600080600060608486031215610a4157610a406106ea565b5b6000610a4f86828701610840565b935050602084013567ffffffffffffffff811115610a7057610a6f6106ef565b5b610a7c868287016107fb565b9250506040610a8d8682870161086c565b9150509250925092565b6000602082019050610aac6000830184610671565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610af957607f821691505b602082108103610b0c57610b0b610ab2565b5b50919050565b7f5245564552544544205749544820524556455254000000000000000000000000600082015250565b6000610b486014836105d7565b9150610b5382610b12565b602082019050919050565b60006020820190508181036000830152610b7781610b3b565b9050919050565b60006060820190508181036000830152610b98818661062c565b9050610ba760208301856105bd565b610bb46040830184610671565b949350505050565b600081905092915050565b6000610bd38385610bbc565b9350610be08385846107aa565b82840190509392505050565b6000610bf9828486610bc7565b91508190509392505050565b7f5245564552544544205749544820524551554952450000000000000000000000600082015250565b6000610c3b6015836105d7565b9150610c4682610c05565b602082019050919050565b60006020820190508181036000830152610c6a81610c2e565b905091905056fea2646970667358221220ca8ff7a2edb3cb30dd9de0ed5a0665fd7ee39e4680760776b264f55d8f5ef51c64736f6c634300080d0033" + } + } +} diff --git a/fixtures/build/Basic.ts b/fixtures/build/Basic.ts new file mode 100644 index 00000000000..f0e46a36550 --- /dev/null +++ b/fixtures/build/Basic.ts @@ -0,0 +1,312 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const BasicAbi = [ + { + inputs: [ + { + internalType: 'uint256', + name: '_val', + type: 'uint256', + }, + { + internalType: 'string', + name: '_stringValue', + type: 'string', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'string', + name: 'str', + type: 'string', + }, + { + indexed: false, + internalType: 'uint256', + name: 'val', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bool', + name: 'flag', + type: 'bool', + }, + ], + name: 'MultiValueEvent', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'string', + name: 'str', + type: 'string', + }, + { + indexed: true, + internalType: 'uint256', + name: 'val', + type: 'uint256', + }, + { + indexed: true, + internalType: 'bool', + name: 'flag', + type: 'bool', + }, + ], + name: 'MultiValueIndexedEvent', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'string', + name: 'str', + type: 'string', + }, + { + indexed: true, + internalType: 'uint256', + name: 'val', + type: 'uint256', + }, + { + indexed: true, + internalType: 'bool', + name: 'flag', + type: 'bool', + }, + ], + name: 'MultiValueIndexedEventWithStringIndexed', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'string', + name: 'str', + type: 'string', + }, + ], + name: 'StringEvent', + type: 'event', + }, + { + inputs: [ + { + internalType: 'string', + name: 'str', + type: 'string', + }, + { + internalType: 'uint256', + name: 'val', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'flag', + type: 'bool', + }, + ], + name: 'firesMultiValueEvent', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: 'str', + type: 'string', + }, + { + internalType: 'uint256', + name: 'val', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'flag', + type: 'bool', + }, + ], + name: 'firesMultiValueIndexedEvent', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: 'str', + type: 'string', + }, + { + internalType: 'uint256', + name: 'val', + type: 'uint256', + }, + { + internalType: 'bool', + name: 'flag', + type: 'bool', + }, + ], + name: 'firesMultiValueIndexedEventWithStringIndexed', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: '_str', + type: 'string', + }, + ], + name: 'firesStringEvent', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'getBoolValue', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getIntValue', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getStringValue', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getValues', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + { + internalType: 'string', + name: '', + type: 'string', + }, + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'requireWithReason', + outputs: [], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [], + name: 'requireWithoutReason', + outputs: [], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [], + name: 'reverts', + outputs: [], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_value', + type: 'uint256', + }, + { + internalType: 'string', + name: '_stringValue', + type: 'string', + }, + { + internalType: 'bool', + name: '_boolValue', + type: 'bool', + }, + ], + name: 'setValues', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const BasicBytecode = + '0x60806040523480156200001157600080fd5b5060405162001068380380620010688339818101604052810190620000379190620002e7565b816000819055508060019080519060200190620000569291906200005f565b505050620003b1565b8280546200006d906200037c565b90600052602060002090601f016020900481019282620000915760008555620000dd565b82601f10620000ac57805160ff1916838001178555620000dd565b82800160010185558215620000dd579182015b82811115620000dc578251825591602001919060010190620000bf565b5b509050620000ec9190620000f0565b5090565b5b808211156200010b576000816000905550600101620000f1565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620001388162000123565b81146200014457600080fd5b50565b60008151905062000158816200012d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001b38262000168565b810181811067ffffffffffffffff82111715620001d557620001d462000179565b5b80604052505050565b6000620001ea6200010f565b9050620001f88282620001a8565b919050565b600067ffffffffffffffff8211156200021b576200021a62000179565b5b620002268262000168565b9050602081019050919050565b60005b838110156200025357808201518184015260208101905062000236565b8381111562000263576000848401525b50505050565b6000620002806200027a84620001fd565b620001de565b9050828152602081018484840111156200029f576200029e62000163565b5b620002ac84828562000233565b509392505050565b600082601f830112620002cc57620002cb6200015e565b5b8151620002de84826020860162000269565b91505092915050565b6000806040838503121562000301576200030062000119565b5b6000620003118582860162000147565b925050602083015167ffffffffffffffff8111156200033557620003346200011e565b5b6200034385828601620002b4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039557607f821691505b602082108103620003ab57620003aa6200034d565b5b50919050565b610ca780620003c16000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063844d6a3211610071578063844d6a3214610157578063939d7c4e14610161578063ae012ede1461017d578063b7a8238a14610187578063d7af8ac1146101a3578063e8256ea0146101bf576100b4565b806319eb4a90146100b95780632bfc4c69146100d95780633bccbbc9146100f75780635a018657146101015780637cfbdcf01461011d578063828909bd14610139575b600080fd5b6100c16101dd565b6040516100d093929190610680565b60405180910390f35b6100e161028e565b6040516100ee91906106be565b60405180910390f35b6100ff610320565b005b61011b60048036038101906101169190610881565b61035b565b005b61013760048036038101906101329190610950565b61039b565b005b6101416103e9565b60405161014e91906109c4565b60405180910390f35b61015f6103f2565b005b61017b60048036038101906101769190610881565b610435565b005b610185610475565b005b6101a1600480360381019061019c91906109df565b610482565b005b6101bd60048036038101906101b89190610a28565b6104bc565b005b6101c76104f9565b6040516101d49190610a97565b60405180910390f35b60006060600080546001600260009054906101000a900460ff1681805461020390610ae1565b80601f016020809104026020016040519081016040528092919081815260200182805461022f90610ae1565b801561027c5780601f106102515761010080835404028352916020019161027c565b820191906000526020600020905b81548152906001019060200180831161025f57829003601f168201915b50505050509150925092509250909192565b60606001805461029d90610ae1565b80601f01602080910402602001604051908101604052809291908181526020018280546102c990610ae1565b80156103165780601f106102eb57610100808354040283529160200191610316565b820191906000526020600020905b8154815290600101906020018083116102f957829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035290610b5e565b60405180910390fd5b7fa8297798732ff8a80a23cf22707934835a9d5b03536598708f7414646a1b95b383838360405161038e93929190610b7e565b60405180910390a1505050565b8015158285856040516103af929190610bec565b60405180910390207f5b5730af07e266d8b4845f404beb3b193085c686b0edd8e8e20cd4b3fc2b6cd560405160405180910390a450505050565b60008054905090565b6000610433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042a90610c51565b60405180910390fd5b565b801515827f553c4a49a36d26504ba0880f2f9bfe9ac7db4b81a893bde296546cd96ae0b33c8560405161046891906106be565b60405180910390a3505050565b600061048057600080fd5b565b7f617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab816040516104b191906106be565b60405180910390a150565b8260008190555081600190805190602001906104d9929190610510565b5080600260006101000a81548160ff021916908315150217905550505050565b6000600260009054906101000a900460ff16905090565b82805461051c90610ae1565b90600052602060002090601f01602090048101928261053e5760008555610585565b82601f1061055757805160ff1916838001178555610585565b82800160010185558215610585579182015b82811115610584578251825591602001919060010190610569565b5b5090506105929190610596565b5090565b5b808211156105af576000816000905550600101610597565b5090565b6000819050919050565b6105c6816105b3565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156106065780820151818401526020810190506105eb565b83811115610615576000848401525b50505050565b6000601f19601f8301169050919050565b6000610637826105cc565b61064181856105d7565b93506106518185602086016105e8565b61065a8161061b565b840191505092915050565b60008115159050919050565b61067a81610665565b82525050565b600060608201905061069560008301866105bd565b81810360208301526106a7818561062c565b90506106b66040830184610671565b949350505050565b600060208201905081810360008301526106d8818461062c565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6107368261061b565b810181811067ffffffffffffffff82111715610755576107546106fe565b5b80604052505050565b60006107686106e0565b9050610774828261072d565b919050565b600067ffffffffffffffff821115610794576107936106fe565b5b61079d8261061b565b9050602081019050919050565b82818337600083830152505050565b60006107cc6107c784610779565b61075e565b9050828152602081018484840111156107e8576107e76106f9565b5b6107f38482856107aa565b509392505050565b600082601f8301126108105761080f6106f4565b5b81356108208482602086016107b9565b91505092915050565b610832816105b3565b811461083d57600080fd5b50565b60008135905061084f81610829565b92915050565b61085e81610665565b811461086957600080fd5b50565b60008135905061087b81610855565b92915050565b60008060006060848603121561089a576108996106ea565b5b600084013567ffffffffffffffff8111156108b8576108b76106ef565b5b6108c4868287016107fb565b93505060206108d586828701610840565b92505060406108e68682870161086c565b9150509250925092565b600080fd5b600080fd5b60008083601f8401126109105761090f6106f4565b5b8235905067ffffffffffffffff81111561092d5761092c6108f0565b5b602083019150836001820283011115610949576109486108f5565b5b9250929050565b6000806000806060858703121561096a576109696106ea565b5b600085013567ffffffffffffffff811115610988576109876106ef565b5b610994878288016108fa565b945094505060206109a787828801610840565b92505060406109b88782880161086c565b91505092959194509250565b60006020820190506109d960008301846105bd565b92915050565b6000602082840312156109f5576109f46106ea565b5b600082013567ffffffffffffffff811115610a1357610a126106ef565b5b610a1f848285016107fb565b91505092915050565b600080600060608486031215610a4157610a406106ea565b5b6000610a4f86828701610840565b935050602084013567ffffffffffffffff811115610a7057610a6f6106ef565b5b610a7c868287016107fb565b9250506040610a8d8682870161086c565b9150509250925092565b6000602082019050610aac6000830184610671565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610af957607f821691505b602082108103610b0c57610b0b610ab2565b5b50919050565b7f5245564552544544205749544820524556455254000000000000000000000000600082015250565b6000610b486014836105d7565b9150610b5382610b12565b602082019050919050565b60006020820190508181036000830152610b7781610b3b565b9050919050565b60006060820190508181036000830152610b98818661062c565b9050610ba760208301856105bd565b610bb46040830184610671565b949350505050565b600081905092915050565b6000610bd38385610bbc565b9350610be08385846107aa565b82840190509392505050565b6000610bf9828486610bc7565b91508190509392505050565b7f5245564552544544205749544820524551554952450000000000000000000000600082015250565b6000610c3b6015836105d7565b9150610c4682610c05565b602082019050919050565b60006020820190508181036000830152610c6a81610c2e565b905091905056fea2646970667358221220ca8ff7a2edb3cb30dd9de0ed5a0665fd7ee39e4680760776b264f55d8f5ef51c64736f6c634300080d0033'; diff --git a/fixtures/build/DeployRevert.json b/fixtures/build/DeployRevert.json new file mode 100644 index 00000000000..a269cb96e51 --- /dev/null +++ b/fixtures/build/DeployRevert.json @@ -0,0 +1,14 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "evm": { + "bytecode": { + "object": "6080604052348015600f57600080fd5b506000601a57600080fd5b603f8060276000396000f3fe6080604052600080fdfea264697066735822122097fd7c0cdcb3a8015df4cce061a4d7f8c2919787475e0b07d1b0ec13223097ac64736f6c63430008100033" + } + } +} diff --git a/fixtures/build/DeployRevert.ts b/fixtures/build/DeployRevert.ts new file mode 100644 index 00000000000..9f18d1a3630 --- /dev/null +++ b/fixtures/build/DeployRevert.ts @@ -0,0 +1,21 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const DeployRevertAbi = [ + { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, +] as const; +export const DeployRevertBytecode = + '0x6080604052348015600f57600080fd5b506000601a57600080fd5b603f8060276000396000f3fe6080604052600080fdfea264697066735822122097fd7c0cdcb3a8015df4cce061a4d7f8c2919787475e0b07d1b0ec13223097ac64736f6c63430008100033'; diff --git a/fixtures/build/ERC20Token.json b/fixtures/build/ERC20Token.json new file mode 100644 index 00000000000..98469b057a6 --- /dev/null +++ b/fixtures/build/ERC20Token.json @@ -0,0 +1,290 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialSupply", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "60806040523480156200001157600080fd5b5060405162001990380380620019908339818101604052810190620000379190620002a4565b6040518060400160405280600481526020017f476f6c64000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474c4400000000000000000000000000000000000000000000000000000000008152508160039081620000b4919062000546565b508060049081620000c6919062000546565b505050620000db3382620000e260201b60201c565b5062000748565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014b906200068e565b60405180910390fd5b62000168600083836200025a60201b60201c565b80600260008282546200017c9190620006df565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001d39190620006df565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023a91906200072b565b60405180910390a362000256600083836200025f60201b60201c565b5050565b505050565b505050565b600080fd5b6000819050919050565b6200027e8162000269565b81146200028a57600080fd5b50565b6000815190506200029e8162000273565b92915050565b600060208284031215620002bd57620002bc62000264565b5b6000620002cd848285016200028d565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035857607f821691505b6020821081036200036e576200036d62000310565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000399565b620003e4868362000399565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000427620004216200041b8462000269565b620003fc565b62000269565b9050919050565b6000819050919050565b620004438362000406565b6200045b62000452826200042e565b848454620003a6565b825550505050565b600090565b6200047262000463565b6200047f81848462000438565b505050565b5b81811015620004a7576200049b60008262000468565b60018101905062000485565b5050565b601f821115620004f657620004c08162000374565b620004cb8462000389565b81016020851015620004db578190505b620004f3620004ea8562000389565b83018262000484565b50505b505050565b600082821c905092915050565b60006200051b60001984600802620004fb565b1980831691505092915050565b600062000536838362000508565b9150826002028217905092915050565b6200055182620002d6565b67ffffffffffffffff8111156200056d576200056c620002e1565b5b6200057982546200033f565b62000586828285620004ab565b600060209050601f831160018114620005be5760008415620005a9578287015190505b620005b5858262000528565b86555062000625565b601f198416620005ce8662000374565b60005b82811015620005f857848901518255600182019150602085019450602081019050620005d1565b8683101562000618578489015162000614601f89168262000508565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000676601f836200062d565b915062000683826200063e565b602082019050919050565b60006020820190508181036000830152620006a98162000667565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620006ec8262000269565b9150620006f98362000269565b9250828201905080821115620007145762000713620006b0565b5b92915050565b620007258162000269565b82525050565b60006020820190506200074260008301846200071a565b92915050565b61123880620007586000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b15565b60405180910390f35b6100e660048036038101906100e19190610bd0565b610308565b6040516100f39190610c2b565b60405180910390f35b61010461032b565b6040516101119190610c55565b60405180910390f35b610134600480360381019061012f9190610c70565b610335565b6040516101419190610c2b565b60405180910390f35b610152610364565b60405161015f9190610cdf565b60405180910390f35b610182600480360381019061017d9190610bd0565b61036d565b60405161018f9190610c2b565b60405180910390f35b6101b260048036038101906101ad9190610cfa565b6103a4565b6040516101bf9190610c55565b60405180910390f35b6101d06103ec565b6040516101dd9190610b15565b60405180910390f35b61020060048036038101906101fb9190610bd0565b61047e565b60405161020d9190610c2b565b60405180910390f35b610230600480360381019061022b9190610bd0565b6104f5565b60405161023d9190610c2b565b60405180910390f35b610260600480360381019061025b9190610d27565b610518565b60405161026d9190610c55565b60405180910390f35b60606003805461028590610d96565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d96565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610df6565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d96565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d96565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e9c565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fc0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c55565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df9061102c565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611150565b60405180910390fd5b6108e5838383610a7b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111e2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109fe9190610df6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a629190610c55565b60405180910390a3610a75848484610a80565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abf578082015181840152602081019050610aa4565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ae782610a85565b610af18185610a90565b9350610b01818560208601610aa1565b610b0a81610acb565b840191505092915050565b60006020820190508181036000830152610b2f8184610adc565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6782610b3c565b9050919050565b610b7781610b5c565b8114610b8257600080fd5b50565b600081359050610b9481610b6e565b92915050565b6000819050919050565b610bad81610b9a565b8114610bb857600080fd5b50565b600081359050610bca81610ba4565b92915050565b60008060408385031215610be757610be6610b37565b5b6000610bf585828601610b85565b9250506020610c0685828601610bbb565b9150509250929050565b60008115159050919050565b610c2581610c10565b82525050565b6000602082019050610c406000830184610c1c565b92915050565b610c4f81610b9a565b82525050565b6000602082019050610c6a6000830184610c46565b92915050565b600080600060608486031215610c8957610c88610b37565b5b6000610c9786828701610b85565b9350506020610ca886828701610b85565b9250506040610cb986828701610bbb565b9150509250925092565b600060ff82169050919050565b610cd981610cc3565b82525050565b6000602082019050610cf46000830184610cd0565b92915050565b600060208284031215610d1057610d0f610b37565b5b6000610d1e84828501610b85565b91505092915050565b60008060408385031215610d3e57610d3d610b37565b5b6000610d4c85828601610b85565b9250506020610d5d85828601610b85565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dae57607f821691505b602082108103610dc157610dc0610d67565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e0182610b9a565b9150610e0c83610b9a565b9250828201905080821115610e2457610e23610dc7565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e86602583610a90565b9150610e9182610e2a565b604082019050919050565b60006020820190508181036000830152610eb581610e79565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f18602483610a90565b9150610f2382610ebc565b604082019050919050565b60006020820190508181036000830152610f4781610f0b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610faa602283610a90565b9150610fb582610f4e565b604082019050919050565b60006020820190508181036000830152610fd981610f9d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611016601d83610a90565b915061102182610fe0565b602082019050919050565b6000602082019050818103600083015261104581611009565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006110a8602583610a90565b91506110b38261104c565b604082019050919050565b600060208201905081810360008301526110d78161109b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061113a602383610a90565b9150611145826110de565b604082019050919050565b600060208201905081810360008301526111698161112d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111cc602683610a90565b91506111d782611170565b604082019050919050565b600060208201905081810360008301526111fb816111bf565b905091905056fea26469706673582212200f5d4d388d874300a0683419c878ee355f87f7a6d61c24dc48ad65d7996e729964736f6c63430008100033" + } + } +} diff --git a/fixtures/build/ERC20Token.ts b/fixtures/build/ERC20Token.ts new file mode 100644 index 00000000000..4516af45e9f --- /dev/null +++ b/fixtures/build/ERC20Token.ts @@ -0,0 +1,141 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const ERC20TokenAbi = [ + { + inputs: [{ internalType: 'uint256', name: 'initialSupply', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'spender', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'address', name: 'spender', type: 'address' }, + ], + name: 'allowance', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'approve', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'decimals', + outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'subtractedValue', type: 'uint256' }, + ], + name: 'decreaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'addedValue', type: 'uint256' }, + ], + name: 'increaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const ERC20TokenBytecode = + '0x60806040523480156200001157600080fd5b5060405162001990380380620019908339818101604052810190620000379190620002a4565b6040518060400160405280600481526020017f476f6c64000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474c4400000000000000000000000000000000000000000000000000000000008152508160039081620000b4919062000546565b508060049081620000c6919062000546565b505050620000db3382620000e260201b60201c565b5062000748565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014b906200068e565b60405180910390fd5b62000168600083836200025a60201b60201c565b80600260008282546200017c9190620006df565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001d39190620006df565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023a91906200072b565b60405180910390a362000256600083836200025f60201b60201c565b5050565b505050565b505050565b600080fd5b6000819050919050565b6200027e8162000269565b81146200028a57600080fd5b50565b6000815190506200029e8162000273565b92915050565b600060208284031215620002bd57620002bc62000264565b5b6000620002cd848285016200028d565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035857607f821691505b6020821081036200036e576200036d62000310565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000399565b620003e4868362000399565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000427620004216200041b8462000269565b620003fc565b62000269565b9050919050565b6000819050919050565b620004438362000406565b6200045b62000452826200042e565b848454620003a6565b825550505050565b600090565b6200047262000463565b6200047f81848462000438565b505050565b5b81811015620004a7576200049b60008262000468565b60018101905062000485565b5050565b601f821115620004f657620004c08162000374565b620004cb8462000389565b81016020851015620004db578190505b620004f3620004ea8562000389565b83018262000484565b50505b505050565b600082821c905092915050565b60006200051b60001984600802620004fb565b1980831691505092915050565b600062000536838362000508565b9150826002028217905092915050565b6200055182620002d6565b67ffffffffffffffff8111156200056d576200056c620002e1565b5b6200057982546200033f565b62000586828285620004ab565b600060209050601f831160018114620005be5760008415620005a9578287015190505b620005b5858262000528565b86555062000625565b601f198416620005ce8662000374565b60005b82811015620005f857848901518255600182019150602085019450602081019050620005d1565b8683101562000618578489015162000614601f89168262000508565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000676601f836200062d565b915062000683826200063e565b602082019050919050565b60006020820190508181036000830152620006a98162000667565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620006ec8262000269565b9150620006f98362000269565b9250828201905080821115620007145762000713620006b0565b5b92915050565b620007258162000269565b82525050565b60006020820190506200074260008301846200071a565b92915050565b61123880620007586000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b15565b60405180910390f35b6100e660048036038101906100e19190610bd0565b610308565b6040516100f39190610c2b565b60405180910390f35b61010461032b565b6040516101119190610c55565b60405180910390f35b610134600480360381019061012f9190610c70565b610335565b6040516101419190610c2b565b60405180910390f35b610152610364565b60405161015f9190610cdf565b60405180910390f35b610182600480360381019061017d9190610bd0565b61036d565b60405161018f9190610c2b565b60405180910390f35b6101b260048036038101906101ad9190610cfa565b6103a4565b6040516101bf9190610c55565b60405180910390f35b6101d06103ec565b6040516101dd9190610b15565b60405180910390f35b61020060048036038101906101fb9190610bd0565b61047e565b60405161020d9190610c2b565b60405180910390f35b610230600480360381019061022b9190610bd0565b6104f5565b60405161023d9190610c2b565b60405180910390f35b610260600480360381019061025b9190610d27565b610518565b60405161026d9190610c55565b60405180910390f35b60606003805461028590610d96565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d96565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610df6565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d96565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d96565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e9c565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fc0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c55565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df9061102c565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611150565b60405180910390fd5b6108e5838383610a7b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111e2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109fe9190610df6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a629190610c55565b60405180910390a3610a75848484610a80565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abf578082015181840152602081019050610aa4565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ae782610a85565b610af18185610a90565b9350610b01818560208601610aa1565b610b0a81610acb565b840191505092915050565b60006020820190508181036000830152610b2f8184610adc565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6782610b3c565b9050919050565b610b7781610b5c565b8114610b8257600080fd5b50565b600081359050610b9481610b6e565b92915050565b6000819050919050565b610bad81610b9a565b8114610bb857600080fd5b50565b600081359050610bca81610ba4565b92915050565b60008060408385031215610be757610be6610b37565b5b6000610bf585828601610b85565b9250506020610c0685828601610bbb565b9150509250929050565b60008115159050919050565b610c2581610c10565b82525050565b6000602082019050610c406000830184610c1c565b92915050565b610c4f81610b9a565b82525050565b6000602082019050610c6a6000830184610c46565b92915050565b600080600060608486031215610c8957610c88610b37565b5b6000610c9786828701610b85565b9350506020610ca886828701610b85565b9250506040610cb986828701610bbb565b9150509250925092565b600060ff82169050919050565b610cd981610cc3565b82525050565b6000602082019050610cf46000830184610cd0565b92915050565b600060208284031215610d1057610d0f610b37565b5b6000610d1e84828501610b85565b91505092915050565b60008060408385031215610d3e57610d3d610b37565b5b6000610d4c85828601610b85565b9250506020610d5d85828601610b85565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dae57607f821691505b602082108103610dc157610dc0610d67565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e0182610b9a565b9150610e0c83610b9a565b9250828201905080821115610e2457610e23610dc7565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e86602583610a90565b9150610e9182610e2a565b604082019050919050565b60006020820190508181036000830152610eb581610e79565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f18602483610a90565b9150610f2382610ebc565b604082019050919050565b60006020820190508181036000830152610f4781610f0b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610faa602283610a90565b9150610fb582610f4e565b604082019050919050565b60006020820190508181036000830152610fd981610f9d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611016601d83610a90565b915061102182610fe0565b602082019050919050565b6000602082019050818103600083015261104581611009565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006110a8602583610a90565b91506110b38261104c565b604082019050919050565b600060208201905081810360008301526110d78161109b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061113a602383610a90565b9150611145826110de565b604082019050919050565b600060208201905081810360008301526111698161112d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111cc602683610a90565b91506111d782611170565b604082019050919050565b600060208201905081810360008301526111fb816111bf565b905091905056fea26469706673582212200f5d4d388d874300a0683419c878ee355f87f7a6d61c24dc48ad65d7996e729964736f6c63430008100033'; diff --git a/fixtures/build/ERC721Token.json b/fixtures/build/ERC721Token.json new file mode 100644 index 00000000000..805adc04d81 --- /dev/null +++ b/fixtures/build/ERC721Token.json @@ -0,0 +1,368 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "player", + "type": "address" + }, + { + "internalType": "string", + "name": "tokenURI", + "type": "string" + } + ], + "name": "awardItem", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "60806040523480156200001157600080fd5b506040518060400160405280600881526020017f47616d654974656d0000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f49544d000000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000324565b508060019081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b612a36806200041b6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063cf378343146102a7578063e985e9c5146102d7576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b610109600480360381019061010491906117b5565b610307565b60405161011691906117fd565b60405180910390f35b6101276103e9565b60405161013491906118a8565b60405180910390f35b61015760048036038101906101529190611900565b61047b565b604051610164919061196e565b60405180910390f35b610187600480360381019061018291906119b5565b6104c1565b005b6101a3600480360381019061019e91906119f5565b6105d8565b005b6101bf60048036038101906101ba91906119f5565b610638565b005b6101db60048036038101906101d69190611900565b610658565b6040516101e8919061196e565b60405180910390f35b61020b60048036038101906102069190611a48565b610709565b6040516102189190611a84565b60405180910390f35b6102296107c0565b60405161023691906118a8565b60405180910390f35b61025960048036038101906102549190611acb565b610852565b005b61027560048036038101906102709190611c40565b610868565b005b610291600480360381019061028c9190611900565b6108ca565b60405161029e91906118a8565b60405180910390f35b6102c160048036038101906102bc9190611d64565b6109dc565b6040516102ce9190611a84565b60405180910390f35b6102f160048036038101906102ec9190611dc0565b610a13565b6040516102fe91906117fd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103e257506103e182610aa7565b5b9050919050565b6060600080546103f890611e2f565b80601f016020809104026020016040519081016040528092919081815260200182805461042490611e2f565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b5050505050905090565b600061048682610b11565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104cc82610658565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053390611ed2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661055b610b5c565b73ffffffffffffffffffffffffffffffffffffffff16148061058a575061058981610584610b5c565b610a13565b5b6105c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c090611f64565b60405180910390fd5b6105d38383610b64565b505050565b6105e96105e3610b5c565b82610c1d565b610628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061f90611ff6565b60405180910390fd5b610633838383610cb2565b505050565b61065383838360405180602001604052806000815250610868565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f790612062565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610770906120f4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107cf90611e2f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb90611e2f565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b5050505050905090565b61086461085d610b5c565b8383610f18565b5050565b610879610873610b5c565b83610c1d565b6108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90611ff6565b60405180910390fd5b6108c484848484611084565b50505050565b60606108d582610b11565b60006006600084815260200190815260200160002080546108f590611e2f565b80601f016020809104026020016040519081016040528092919081815260200182805461092190611e2f565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b50505050509050600061097f6110e0565b905060008151036109945781925050506109d7565b6000825111156109c95780826040516020016109b1929190612150565b604051602081830303815290604052925050506109d7565b6109d2846110f7565b925050505b919050565b6000806109e9600761115f565b90506109f5848261116d565b6109ff8184611346565b610a0960076113b3565b8091505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610b1a816113c9565b610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090612062565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610bd783610658565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610c2983610658565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c6b5750610c6a8185610a13565b5b80610ca957508373ffffffffffffffffffffffffffffffffffffffff16610c918461047b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610cd282610658565b73ffffffffffffffffffffffffffffffffffffffff1614610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f906121e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90612278565b60405180910390fd5b610da2838383611435565b610dad600082610b64565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dfd91906122c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5491906122fb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f1383838361143a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d9061237b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161107791906117fd565b60405180910390a3505050565b61108f848484610cb2565b61109b8484848461143f565b6110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d19061240d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061110282610b11565b600061110c6110e0565b9050600081511161112c5760405180602001604052806000815250611157565b80611136846115c6565b604051602001611147929190612150565b6040516020818303038152906040525b915050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390612479565b60405180910390fd5b6111e5816113c9565b15611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906124e5565b60405180910390fd5b61123160008383611435565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461128191906122fb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113426000838361143a565b5050565b61134f826113c9565b61138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138590612577565b60405180910390fd5b806006600084815260200190815260200160002090816113ae9190612743565b505050565b6001816000016000828254019250508190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b60006114608473ffffffffffffffffffffffffffffffffffffffff16611726565b156115b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611489610b5c565b8786866040518563ffffffff1660e01b81526004016114ab949392919061286a565b6020604051808303816000875af19250505080156114e757506040513d601f19601f820116820180604052508101906114e491906128cb565b60015b611569573d8060008114611517576040519150601f19603f3d011682016040523d82523d6000602084013e61151c565b606091505b506000815103611561576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115589061240d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506115be565b600190505b949350505050565b60606000820361160d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611721565b600082905060005b6000821461163f578080611628906128f8565b915050600a82611638919061296f565b9150611615565b60008167ffffffffffffffff81111561165b5761165a611b15565b5b6040519080825280601f01601f19166020018201604052801561168d5781602001600182028036833780820191505090505b5090505b6000851461171a576001826116a691906122c7565b9150600a856116b591906129a0565b60306116c191906122fb565b60f81b8183815181106116d7576116d66129d1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611713919061296f565b9450611691565b8093505050505b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117928161175d565b811461179d57600080fd5b50565b6000813590506117af81611789565b92915050565b6000602082840312156117cb576117ca611753565b5b60006117d9848285016117a0565b91505092915050565b60008115159050919050565b6117f7816117e2565b82525050565b600060208201905061181260008301846117ee565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611852578082015181840152602081019050611837565b60008484015250505050565b6000601f19601f8301169050919050565b600061187a82611818565b6118848185611823565b9350611894818560208601611834565b61189d8161185e565b840191505092915050565b600060208201905081810360008301526118c2818461186f565b905092915050565b6000819050919050565b6118dd816118ca565b81146118e857600080fd5b50565b6000813590506118fa816118d4565b92915050565b60006020828403121561191657611915611753565b5b6000611924848285016118eb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119588261192d565b9050919050565b6119688161194d565b82525050565b6000602082019050611983600083018461195f565b92915050565b6119928161194d565b811461199d57600080fd5b50565b6000813590506119af81611989565b92915050565b600080604083850312156119cc576119cb611753565b5b60006119da858286016119a0565b92505060206119eb858286016118eb565b9150509250929050565b600080600060608486031215611a0e57611a0d611753565b5b6000611a1c868287016119a0565b9350506020611a2d868287016119a0565b9250506040611a3e868287016118eb565b9150509250925092565b600060208284031215611a5e57611a5d611753565b5b6000611a6c848285016119a0565b91505092915050565b611a7e816118ca565b82525050565b6000602082019050611a996000830184611a75565b92915050565b611aa8816117e2565b8114611ab357600080fd5b50565b600081359050611ac581611a9f565b92915050565b60008060408385031215611ae257611ae1611753565b5b6000611af0858286016119a0565b9250506020611b0185828601611ab6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b4d8261185e565b810181811067ffffffffffffffff82111715611b6c57611b6b611b15565b5b80604052505050565b6000611b7f611749565b9050611b8b8282611b44565b919050565b600067ffffffffffffffff821115611bab57611baa611b15565b5b611bb48261185e565b9050602081019050919050565b82818337600083830152505050565b6000611be3611bde84611b90565b611b75565b905082815260208101848484011115611bff57611bfe611b10565b5b611c0a848285611bc1565b509392505050565b600082601f830112611c2757611c26611b0b565b5b8135611c37848260208601611bd0565b91505092915050565b60008060008060808587031215611c5a57611c59611753565b5b6000611c68878288016119a0565b9450506020611c79878288016119a0565b9350506040611c8a878288016118eb565b925050606085013567ffffffffffffffff811115611cab57611caa611758565b5b611cb787828801611c12565b91505092959194509250565b600067ffffffffffffffff821115611cde57611cdd611b15565b5b611ce78261185e565b9050602081019050919050565b6000611d07611d0284611cc3565b611b75565b905082815260208101848484011115611d2357611d22611b10565b5b611d2e848285611bc1565b509392505050565b600082601f830112611d4b57611d4a611b0b565b5b8135611d5b848260208601611cf4565b91505092915050565b60008060408385031215611d7b57611d7a611753565b5b6000611d89858286016119a0565b925050602083013567ffffffffffffffff811115611daa57611da9611758565b5b611db685828601611d36565b9150509250929050565b60008060408385031215611dd757611dd6611753565b5b6000611de5858286016119a0565b9250506020611df6858286016119a0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e4757607f821691505b602082108103611e5a57611e59611e00565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ebc602183611823565b9150611ec782611e60565b604082019050919050565b60006020820190508181036000830152611eeb81611eaf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000611f4e603e83611823565b9150611f5982611ef2565b604082019050919050565b60006020820190508181036000830152611f7d81611f41565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000611fe0602e83611823565b9150611feb82611f84565b604082019050919050565b6000602082019050818103600083015261200f81611fd3565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061204c601883611823565b915061205782612016565b602082019050919050565b6000602082019050818103600083015261207b8161203f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006120de602983611823565b91506120e982612082565b604082019050919050565b6000602082019050818103600083015261210d816120d1565b9050919050565b600081905092915050565b600061212a82611818565b6121348185612114565b9350612144818560208601611834565b80840191505092915050565b600061215c828561211f565b9150612168828461211f565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006121d0602583611823565b91506121db82612174565b604082019050919050565b600060208201905081810360008301526121ff816121c3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612262602483611823565b915061226d82612206565b604082019050919050565b6000602082019050818103600083015261229181612255565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122d2826118ca565b91506122dd836118ca565b92508282039050818111156122f5576122f4612298565b5b92915050565b6000612306826118ca565b9150612311836118ca565b925082820190508082111561232957612328612298565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612365601983611823565b91506123708261232f565b602082019050919050565b6000602082019050818103600083015261239481612358565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006123f7603283611823565b91506124028261239b565b604082019050919050565b60006020820190508181036000830152612426816123ea565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612463602083611823565b915061246e8261242d565b602082019050919050565b6000602082019050818103600083015261249281612456565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124cf601c83611823565b91506124da82612499565b602082019050919050565b600060208201905081810360008301526124fe816124c2565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612561602e83611823565b915061256c82612505565b604082019050919050565b6000602082019050818103600083015261259081612554565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026125f97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826125bc565b61260386836125bc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061264061263b612636846118ca565b61261b565b6118ca565b9050919050565b6000819050919050565b61265a83612625565b61266e61266682612647565b8484546125c9565b825550505050565b600090565b612683612676565b61268e818484612651565b505050565b5b818110156126b2576126a760008261267b565b600181019050612694565b5050565b601f8211156126f7576126c881612597565b6126d1846125ac565b810160208510156126e0578190505b6126f46126ec856125ac565b830182612693565b50505b505050565b600082821c905092915050565b600061271a600019846008026126fc565b1980831691505092915050565b60006127338383612709565b9150826002028217905092915050565b61274c82611818565b67ffffffffffffffff81111561276557612764611b15565b5b61276f8254611e2f565b61277a8282856126b6565b600060209050601f8311600181146127ad576000841561279b578287015190505b6127a58582612727565b86555061280d565b601f1984166127bb86612597565b60005b828110156127e3578489015182556001820191506020850194506020810190506127be565b8683101561280057848901516127fc601f891682612709565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b600061283c82612815565b6128468185612820565b9350612856818560208601611834565b61285f8161185e565b840191505092915050565b600060808201905061287f600083018761195f565b61288c602083018661195f565b6128996040830185611a75565b81810360608301526128ab8184612831565b905095945050505050565b6000815190506128c581611789565b92915050565b6000602082840312156128e1576128e0611753565b5b60006128ef848285016128b6565b91505092915050565b6000612903826118ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361293557612934612298565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061297a826118ca565b9150612985836118ca565b92508261299557612994612940565b5b828204905092915050565b60006129ab826118ca565b91506129b6836118ca565b9250826129c6576129c5612940565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220646cbcc4f2750bbafd66aba1e32cf1d9d60ee7b67010014294621c87b820bc3364736f6c63430008100033" + } + } +} diff --git a/fixtures/build/ERC721Token.ts b/fixtures/build/ERC721Token.ts new file mode 100644 index 00000000000..b95c73b0e1c --- /dev/null +++ b/fixtures/build/ERC721Token.ts @@ -0,0 +1,174 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const ERC721TokenAbi = [ + { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'approved', type: 'address' }, + { indexed: true, internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'operator', type: 'address' }, + { indexed: false, internalType: 'bool', name: 'approved', type: 'bool' }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: true, internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'approve', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'player', type: 'address' }, + { internalType: 'string', name: 'tokenURI', type: 'string' }, + ], + name: 'awardItem', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'owner', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'getApproved', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'address', name: 'operator', type: 'address' }, + ], + name: 'isApprovedForAll', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'ownerOf', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + { internalType: 'bytes', name: 'data', type: 'bytes' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'operator', type: 'address' }, + { internalType: 'bool', name: 'approved', type: 'bool' }, + ], + name: 'setApprovalForAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }], + name: 'supportsInterface', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'tokenURI', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const ERC721TokenBytecode = + '0x60806040523480156200001157600080fd5b506040518060400160405280600881526020017f47616d654974656d0000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f49544d000000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000324565b508060019081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b612a36806200041b6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063cf378343146102a7578063e985e9c5146102d7576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b610109600480360381019061010491906117b5565b610307565b60405161011691906117fd565b60405180910390f35b6101276103e9565b60405161013491906118a8565b60405180910390f35b61015760048036038101906101529190611900565b61047b565b604051610164919061196e565b60405180910390f35b610187600480360381019061018291906119b5565b6104c1565b005b6101a3600480360381019061019e91906119f5565b6105d8565b005b6101bf60048036038101906101ba91906119f5565b610638565b005b6101db60048036038101906101d69190611900565b610658565b6040516101e8919061196e565b60405180910390f35b61020b60048036038101906102069190611a48565b610709565b6040516102189190611a84565b60405180910390f35b6102296107c0565b60405161023691906118a8565b60405180910390f35b61025960048036038101906102549190611acb565b610852565b005b61027560048036038101906102709190611c40565b610868565b005b610291600480360381019061028c9190611900565b6108ca565b60405161029e91906118a8565b60405180910390f35b6102c160048036038101906102bc9190611d64565b6109dc565b6040516102ce9190611a84565b60405180910390f35b6102f160048036038101906102ec9190611dc0565b610a13565b6040516102fe91906117fd565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103e257506103e182610aa7565b5b9050919050565b6060600080546103f890611e2f565b80601f016020809104026020016040519081016040528092919081815260200182805461042490611e2f565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b5050505050905090565b600061048682610b11565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104cc82610658565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053390611ed2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661055b610b5c565b73ffffffffffffffffffffffffffffffffffffffff16148061058a575061058981610584610b5c565b610a13565b5b6105c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c090611f64565b60405180910390fd5b6105d38383610b64565b505050565b6105e96105e3610b5c565b82610c1d565b610628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061f90611ff6565b60405180910390fd5b610633838383610cb2565b505050565b61065383838360405180602001604052806000815250610868565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f790612062565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610770906120f4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107cf90611e2f565b80601f01602080910402602001604051908101604052809291908181526020018280546107fb90611e2f565b80156108485780601f1061081d57610100808354040283529160200191610848565b820191906000526020600020905b81548152906001019060200180831161082b57829003601f168201915b5050505050905090565b61086461085d610b5c565b8383610f18565b5050565b610879610873610b5c565b83610c1d565b6108b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108af90611ff6565b60405180910390fd5b6108c484848484611084565b50505050565b60606108d582610b11565b60006006600084815260200190815260200160002080546108f590611e2f565b80601f016020809104026020016040519081016040528092919081815260200182805461092190611e2f565b801561096e5780601f106109435761010080835404028352916020019161096e565b820191906000526020600020905b81548152906001019060200180831161095157829003601f168201915b50505050509050600061097f6110e0565b905060008151036109945781925050506109d7565b6000825111156109c95780826040516020016109b1929190612150565b604051602081830303815290604052925050506109d7565b6109d2846110f7565b925050505b919050565b6000806109e9600761115f565b90506109f5848261116d565b6109ff8184611346565b610a0960076113b3565b8091505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610b1a816113c9565b610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090612062565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610bd783610658565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610c2983610658565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c6b5750610c6a8185610a13565b5b80610ca957508373ffffffffffffffffffffffffffffffffffffffff16610c918461047b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610cd282610658565b73ffffffffffffffffffffffffffffffffffffffff1614610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f906121e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90612278565b60405180910390fd5b610da2838383611435565b610dad600082610b64565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dfd91906122c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e5491906122fb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f1383838361143a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d9061237b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161107791906117fd565b60405180910390a3505050565b61108f848484610cb2565b61109b8484848461143f565b6110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d19061240d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061110282610b11565b600061110c6110e0565b9050600081511161112c5760405180602001604052806000815250611157565b80611136846115c6565b604051602001611147929190612150565b6040516020818303038152906040525b915050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390612479565b60405180910390fd5b6111e5816113c9565b15611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906124e5565b60405180910390fd5b61123160008383611435565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461128191906122fb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113426000838361143a565b5050565b61134f826113c9565b61138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138590612577565b60405180910390fd5b806006600084815260200190815260200160002090816113ae9190612743565b505050565b6001816000016000828254019250508190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b60006114608473ffffffffffffffffffffffffffffffffffffffff16611726565b156115b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611489610b5c565b8786866040518563ffffffff1660e01b81526004016114ab949392919061286a565b6020604051808303816000875af19250505080156114e757506040513d601f19601f820116820180604052508101906114e491906128cb565b60015b611569573d8060008114611517576040519150601f19603f3d011682016040523d82523d6000602084013e61151c565b606091505b506000815103611561576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115589061240d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506115be565b600190505b949350505050565b60606000820361160d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611721565b600082905060005b6000821461163f578080611628906128f8565b915050600a82611638919061296f565b9150611615565b60008167ffffffffffffffff81111561165b5761165a611b15565b5b6040519080825280601f01601f19166020018201604052801561168d5781602001600182028036833780820191505090505b5090505b6000851461171a576001826116a691906122c7565b9150600a856116b591906129a0565b60306116c191906122fb565b60f81b8183815181106116d7576116d66129d1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611713919061296f565b9450611691565b8093505050505b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117928161175d565b811461179d57600080fd5b50565b6000813590506117af81611789565b92915050565b6000602082840312156117cb576117ca611753565b5b60006117d9848285016117a0565b91505092915050565b60008115159050919050565b6117f7816117e2565b82525050565b600060208201905061181260008301846117ee565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611852578082015181840152602081019050611837565b60008484015250505050565b6000601f19601f8301169050919050565b600061187a82611818565b6118848185611823565b9350611894818560208601611834565b61189d8161185e565b840191505092915050565b600060208201905081810360008301526118c2818461186f565b905092915050565b6000819050919050565b6118dd816118ca565b81146118e857600080fd5b50565b6000813590506118fa816118d4565b92915050565b60006020828403121561191657611915611753565b5b6000611924848285016118eb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119588261192d565b9050919050565b6119688161194d565b82525050565b6000602082019050611983600083018461195f565b92915050565b6119928161194d565b811461199d57600080fd5b50565b6000813590506119af81611989565b92915050565b600080604083850312156119cc576119cb611753565b5b60006119da858286016119a0565b92505060206119eb858286016118eb565b9150509250929050565b600080600060608486031215611a0e57611a0d611753565b5b6000611a1c868287016119a0565b9350506020611a2d868287016119a0565b9250506040611a3e868287016118eb565b9150509250925092565b600060208284031215611a5e57611a5d611753565b5b6000611a6c848285016119a0565b91505092915050565b611a7e816118ca565b82525050565b6000602082019050611a996000830184611a75565b92915050565b611aa8816117e2565b8114611ab357600080fd5b50565b600081359050611ac581611a9f565b92915050565b60008060408385031215611ae257611ae1611753565b5b6000611af0858286016119a0565b9250506020611b0185828601611ab6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b4d8261185e565b810181811067ffffffffffffffff82111715611b6c57611b6b611b15565b5b80604052505050565b6000611b7f611749565b9050611b8b8282611b44565b919050565b600067ffffffffffffffff821115611bab57611baa611b15565b5b611bb48261185e565b9050602081019050919050565b82818337600083830152505050565b6000611be3611bde84611b90565b611b75565b905082815260208101848484011115611bff57611bfe611b10565b5b611c0a848285611bc1565b509392505050565b600082601f830112611c2757611c26611b0b565b5b8135611c37848260208601611bd0565b91505092915050565b60008060008060808587031215611c5a57611c59611753565b5b6000611c68878288016119a0565b9450506020611c79878288016119a0565b9350506040611c8a878288016118eb565b925050606085013567ffffffffffffffff811115611cab57611caa611758565b5b611cb787828801611c12565b91505092959194509250565b600067ffffffffffffffff821115611cde57611cdd611b15565b5b611ce78261185e565b9050602081019050919050565b6000611d07611d0284611cc3565b611b75565b905082815260208101848484011115611d2357611d22611b10565b5b611d2e848285611bc1565b509392505050565b600082601f830112611d4b57611d4a611b0b565b5b8135611d5b848260208601611cf4565b91505092915050565b60008060408385031215611d7b57611d7a611753565b5b6000611d89858286016119a0565b925050602083013567ffffffffffffffff811115611daa57611da9611758565b5b611db685828601611d36565b9150509250929050565b60008060408385031215611dd757611dd6611753565b5b6000611de5858286016119a0565b9250506020611df6858286016119a0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e4757607f821691505b602082108103611e5a57611e59611e00565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ebc602183611823565b9150611ec782611e60565b604082019050919050565b60006020820190508181036000830152611eeb81611eaf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000611f4e603e83611823565b9150611f5982611ef2565b604082019050919050565b60006020820190508181036000830152611f7d81611f41565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000611fe0602e83611823565b9150611feb82611f84565b604082019050919050565b6000602082019050818103600083015261200f81611fd3565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061204c601883611823565b915061205782612016565b602082019050919050565b6000602082019050818103600083015261207b8161203f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006120de602983611823565b91506120e982612082565b604082019050919050565b6000602082019050818103600083015261210d816120d1565b9050919050565b600081905092915050565b600061212a82611818565b6121348185612114565b9350612144818560208601611834565b80840191505092915050565b600061215c828561211f565b9150612168828461211f565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006121d0602583611823565b91506121db82612174565b604082019050919050565b600060208201905081810360008301526121ff816121c3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612262602483611823565b915061226d82612206565b604082019050919050565b6000602082019050818103600083015261229181612255565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122d2826118ca565b91506122dd836118ca565b92508282039050818111156122f5576122f4612298565b5b92915050565b6000612306826118ca565b9150612311836118ca565b925082820190508082111561232957612328612298565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612365601983611823565b91506123708261232f565b602082019050919050565b6000602082019050818103600083015261239481612358565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006123f7603283611823565b91506124028261239b565b604082019050919050565b60006020820190508181036000830152612426816123ea565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612463602083611823565b915061246e8261242d565b602082019050919050565b6000602082019050818103600083015261249281612456565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124cf601c83611823565b91506124da82612499565b602082019050919050565b600060208201905081810360008301526124fe816124c2565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000612561602e83611823565b915061256c82612505565b604082019050919050565b6000602082019050818103600083015261259081612554565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026125f97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826125bc565b61260386836125bc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061264061263b612636846118ca565b61261b565b6118ca565b9050919050565b6000819050919050565b61265a83612625565b61266e61266682612647565b8484546125c9565b825550505050565b600090565b612683612676565b61268e818484612651565b505050565b5b818110156126b2576126a760008261267b565b600181019050612694565b5050565b601f8211156126f7576126c881612597565b6126d1846125ac565b810160208510156126e0578190505b6126f46126ec856125ac565b830182612693565b50505b505050565b600082821c905092915050565b600061271a600019846008026126fc565b1980831691505092915050565b60006127338383612709565b9150826002028217905092915050565b61274c82611818565b67ffffffffffffffff81111561276557612764611b15565b5b61276f8254611e2f565b61277a8282856126b6565b600060209050601f8311600181146127ad576000841561279b578287015190505b6127a58582612727565b86555061280d565b601f1984166127bb86612597565b60005b828110156127e3578489015182556001820191506020850194506020810190506127be565b8683101561280057848901516127fc601f891682612709565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b600061283c82612815565b6128468185612820565b9350612856818560208601611834565b61285f8161185e565b840191505092915050565b600060808201905061287f600083018761195f565b61288c602083018661195f565b6128996040830185611a75565b81810360608301526128ab8184612831565b905095945050505050565b6000815190506128c581611789565b92915050565b6000602082840312156128e1576128e0611753565b5b60006128ef848285016128b6565b91505092915050565b6000612903826118ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361293557612934612298565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061297a826118ca565b9150612985836118ca565b92508261299557612994612940565b5b828204905092915050565b60006129ab826118ca565b91506129b6836118ca565b9250826129c6576129c5612940565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220646cbcc4f2750bbafd66aba1e32cf1d9d60ee7b67010014294621c87b820bc3364736f6c63430008100033'; diff --git a/fixtures/build/ErrorsContract.json b/fixtures/build/ErrorsContract.json new file mode 100644 index 00000000000..0a407d25c63 --- /dev/null +++ b/fixtures/build/ErrorsContract.json @@ -0,0 +1,44 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "CustomError", + "type": "error" + }, + { + "inputs": [], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "badRequire", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unauthorize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "608060405260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005157600080fd5b5061029e806100616000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063593b0df41461003b5780638ec6371414610045575b600080fd5b61004361004f565b005b61004d6100fd565b005b600260011015610094576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040161008b90610248565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156100fa573d6000803e3d6000fd5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610182576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156101e8573d6000803e3d6000fd5b50565b600082825260208201905092915050565b7f7265766572746564207573696e6720637573746f6d204572726f720000000000600082015250565b6000610232601b836101eb565b915061023d826101fc565b602082019050919050565b6000602082019050818103600083015261026181610225565b905091905056fea264697066735822122044b9ec500058314fc2322d787ecf6c99c1470d0ace05668c811cfe70fdd05c2764736f6c63430008100033" + } + } +} diff --git a/fixtures/build/ErrorsContract.ts b/fixtures/build/ErrorsContract.ts new file mode 100644 index 00000000000..06dfd115c11 --- /dev/null +++ b/fixtures/build/ErrorsContract.ts @@ -0,0 +1,41 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const ErrorsContractAbi = [ + { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, + { + inputs: [{ internalType: 'string', name: '', type: 'string' }], + name: 'CustomError', + type: 'error', + }, + { inputs: [], name: 'Unauthorized', type: 'error' }, + { + inputs: [], + name: 'badRequire', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'unauthorize', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const ErrorsContractBytecode = + '0x608060405260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005157600080fd5b5061029e806100616000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063593b0df41461003b5780638ec6371414610045575b600080fd5b61004361004f565b005b61004d6100fd565b005b600260011015610094576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040161008b90610248565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156100fa573d6000803e3d6000fd5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610182576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156101e8573d6000803e3d6000fd5b50565b600082825260208201905092915050565b7f7265766572746564207573696e6720637573746f6d204572726f720000000000600082015250565b6000610232601b836101eb565b915061023d826101fc565b602082019050919050565b6000602082019050818103600083015261026181610225565b905091905056fea264697066735822122044b9ec500058314fc2322d787ecf6c99c1470d0ace05668c811cfe70fdd05c2764736f6c63430008100033'; diff --git a/fixtures/build/Greeter.json b/fixtures/build/Greeter.json new file mode 100644 index 00000000000..ad25bbf5a68 --- /dev/null +++ b/fixtures/build/Greeter.json @@ -0,0 +1,96 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "greeting", + "type": "string" + } + ], + "name": "GREETING_CHANGED", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "from", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "to", + "type": "string" + } + ], + "name": "GREETING_CHANGING", + "type": "event" + }, + { + "inputs": [], + "name": "greet", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "increment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "name": "setGreeting", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c63430008100033" + } + } +} diff --git a/fixtures/build/Greeter.ts b/fixtures/build/Greeter.ts new file mode 100644 index 00000000000..3ce6ab1b3dd --- /dev/null +++ b/fixtures/build/Greeter.ts @@ -0,0 +1,58 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const GreeterAbi = [ + { + inputs: [{ internalType: 'string', name: '_greeting', type: 'string' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [{ indexed: false, internalType: 'string', name: 'greeting', type: 'string' }], + name: 'GREETING_CHANGED', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: false, internalType: 'string', name: 'from', type: 'string' }, + { indexed: false, internalType: 'string', name: 'to', type: 'string' }, + ], + name: 'GREETING_CHANGING', + type: 'event', + }, + { + inputs: [], + name: 'greet', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { inputs: [], name: 'increment', outputs: [], stateMutability: 'nonpayable', type: 'function' }, + { + inputs: [{ internalType: 'string', name: '_greeting', type: 'string' }], + name: 'setGreeting', + outputs: [ + { internalType: 'bool', name: '', type: 'bool' }, + { internalType: 'string', name: '', type: 'string' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const GreeterBytecode = + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c63430008100033'; diff --git a/fixtures/build/GreeterWithOverloading.json b/fixtures/build/GreeterWithOverloading.json new file mode 100644 index 00000000000..8f85cee2c6c --- /dev/null +++ b/fixtures/build/GreeterWithOverloading.json @@ -0,0 +1,125 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "greeting", + "type": "string" + } + ], + "name": "GREETING_CHANGED", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "from", + "type": "string" + }, + { + "indexed": false, + "internalType": "string", + "name": "to", + "type": "string" + } + ], + "name": "GREETING_CHANGING", + "type": "event" + }, + { + "inputs": [], + "name": "greet", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "increment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + }, + { + "internalType": "bool", + "name": "_raiseEvents", + "type": "bool" + } + ], + "name": "setGreeting", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "name": "setGreeting", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "608060405234801562000010575f80fd5b506040516200104d3803806200104d8339818101604052810190620000369190620001da565b806001908162000047919062000460565b505f80819055505062000544565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620000b6826200006e565b810181811067ffffffffffffffff82111715620000d857620000d76200007e565b5b80604052505050565b5f620000ec62000055565b9050620000fa8282620000ab565b919050565b5f67ffffffffffffffff8211156200011c576200011b6200007e565b5b62000127826200006e565b9050602081019050919050565b5f5b838110156200015357808201518184015260208101905062000136565b5f8484015250505050565b5f620001746200016e84620000ff565b620000e1565b9050828152602081018484840111156200019357620001926200006a565b5b620001a084828562000134565b509392505050565b5f82601f830112620001bf57620001be62000066565b5b8151620001d18482602086016200015e565b91505092915050565b5f60208284031215620001f257620001f16200005e565b5b5f82015167ffffffffffffffff81111562000212576200021162000062565b5b6200022084828501620001a8565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200027857607f821691505b6020821081036200028e576200028d62000233565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620002f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002b5565b620002fe8683620002b5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000348620003426200033c8462000316565b6200031f565b62000316565b9050919050565b5f819050919050565b620003638362000328565b6200037b62000372826200034f565b848454620002c1565b825550505050565b5f90565b6200039162000383565b6200039e81848462000358565b505050565b5b81811015620003c557620003b95f8262000387565b600181019050620003a4565b5050565b601f8211156200041457620003de8162000294565b620003e984620002a6565b81016020851015620003f9578190505b620004116200040885620002a6565b830182620003a3565b50505b505050565b5f82821c905092915050565b5f620004365f198460080262000419565b1980831691505092915050565b5f62000450838362000425565b9150826002028217905092915050565b6200046b8262000229565b67ffffffffffffffff8111156200048757620004866200007e565b5b62000493825462000260565b620004a0828285620003c9565b5f60209050601f831160018114620004d6575f8415620004c1578287015190505b620004cd858262000443565b8655506200053c565b601f198416620004e68662000294565b5f5b828110156200050f57848901518255600182019150602085019450602081019050620004e8565b868310156200052f57848901516200052b601f89168262000425565b8355505b6001600288020188555050505b505050505050565b610afb80620005525f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80634495ef8a1461004e578063a41368621461007f578063cfae3217146100b0578063d09de08a146100ce575b5f80fd5b61006860048036038101906100639190610545565b6100d8565b604051610076929190610628565b60405180910390f35b61009960048036038101906100949190610656565b610203565b6040516100a7929190610628565b60405180910390f35b6100b861031e565b6040516100c5919061069d565b60405180910390f35b6100d66103ae565b005b5f6060821561011c577f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001856040516101139291906107ad565b60405180910390a15b836001908161012b9190610976565b50821561016b577f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e60016040516101629190610a45565b60405180910390a15b60018080805461017a906106ea565b80601f01602080910402602001604051908101604052809291908181526020018280546101a6906106ea565b80156101f15780601f106101c8576101008083540402835291602001916101f1565b820191905f5260205f20905b8154815290600101906020018083116101d457829003601f168201915b50505050509050915091509250929050565b5f60607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516102389291906107ad565b60405180910390a1826001908161024f9190610976565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e60016040516102809190610a45565b60405180910390a1600180808054610297906106ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102c3906106ea565b801561030e5780601f106102e55761010080835404028352916020019161030e565b820191905f5260205f20905b8154815290600101906020018083116102f157829003601f168201915b5050505050905091509150915091565b60606001805461032d906106ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610359906106ea565b80156103a45780601f1061037b576101008083540402835291602001916103a4565b820191905f5260205f20905b81548152906001019060200180831161038757829003601f168201915b5050505050905090565b60015f546103bc9190610a92565b5f81905550565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610422826103dc565b810181811067ffffffffffffffff82111715610441576104406103ec565b5b80604052505050565b5f6104536103c3565b905061045f8282610419565b919050565b5f67ffffffffffffffff82111561047e5761047d6103ec565b5b610487826103dc565b9050602081019050919050565b828183375f83830152505050565b5f6104b46104af84610464565b61044a565b9050828152602081018484840111156104d0576104cf6103d8565b5b6104db848285610494565b509392505050565b5f82601f8301126104f7576104f66103d4565b5b81356105078482602086016104a2565b91505092915050565b5f8115159050919050565b61052481610510565b811461052e575f80fd5b50565b5f8135905061053f8161051b565b92915050565b5f806040838503121561055b5761055a6103cc565b5b5f83013567ffffffffffffffff811115610578576105776103d0565b5b610584858286016104e3565b925050602061059585828601610531565b9150509250929050565b6105a881610510565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156105e55780820151818401526020810190506105ca565b5f8484015250505050565b5f6105fa826105ae565b61060481856105b8565b93506106148185602086016105c8565b61061d816103dc565b840191505092915050565b5f60408201905061063b5f83018561059f565b818103602083015261064d81846105f0565b90509392505050565b5f6020828403121561066b5761066a6103cc565b5b5f82013567ffffffffffffffff811115610688576106876103d0565b5b610694848285016104e3565b91505092915050565b5f6020820190508181035f8301526106b581846105f0565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061070157607f821691505b602082108103610714576107136106bd565b5b50919050565b5f819050815f5260205f209050919050565b5f8154610738816106ea565b61074281866105b8565b9450600182165f811461075c5760018114610772576107a4565b60ff1983168652811515602002860193506107a4565b61077b8561071a565b5f5b8381101561079c5781548189015260018201915060208101905061077d565b808801955050505b50505092915050565b5f6040820190508181035f8301526107c5818561072c565b905081810360208301526107d981846105f0565b90509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261082c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826107f1565b61083686836107f1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61087a6108756108708461084e565b610857565b61084e565b9050919050565b5f819050919050565b61089383610860565b6108a761089f82610881565b8484546107fd565b825550505050565b5f90565b6108bb6108af565b6108c681848461088a565b505050565b5b818110156108e9576108de5f826108b3565b6001810190506108cc565b5050565b601f82111561092e576108ff8161071a565b610908846107e2565b81016020851015610917578190505b61092b610923856107e2565b8301826108cb565b50505b505050565b5f82821c905092915050565b5f61094e5f1984600802610933565b1980831691505092915050565b5f610966838361093f565b9150826002028217905092915050565b61097f826105ae565b67ffffffffffffffff811115610998576109976103ec565b5b6109a282546106ea565b6109ad8282856108ed565b5f60209050601f8311600181146109de575f84156109cc578287015190505b6109d6858261095b565b865550610a3d565b601f1984166109ec8661071a565b5f5b82811015610a13578489015182556001820191506020850194506020810190506109ee565b86831015610a305784890151610a2c601f89168261093f565b8355505b6001600288020188555050505b505050505050565b5f6020820190508181035f830152610a5d818461072c565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610a9c8261084e565b9150610aa78361084e565b9250828201905080821115610abf57610abe610a65565b5b9291505056fea2646970667358221220ca996f61ff5eed9f5836fc8d7c848be4c10bc5fff806ab49930b9c7947082dea64736f6c63430008140033" + } + } +} diff --git a/fixtures/build/GreeterWithOverloading.ts b/fixtures/build/GreeterWithOverloading.ts new file mode 100644 index 00000000000..4c5dceb90d2 --- /dev/null +++ b/fixtures/build/GreeterWithOverloading.ts @@ -0,0 +1,136 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const GreeterWithOverloadingAbi = [ + { + inputs: [ + { + internalType: 'string', + name: '_greeting', + type: 'string', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'string', + name: 'greeting', + type: 'string', + }, + ], + name: 'GREETING_CHANGED', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'string', + name: 'from', + type: 'string', + }, + { + indexed: false, + internalType: 'string', + name: 'to', + type: 'string', + }, + ], + name: 'GREETING_CHANGING', + type: 'event', + }, + { + inputs: [], + name: 'greet', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'increment', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: '_greeting', + type: 'string', + }, + { + internalType: 'bool', + name: '_raiseEvents', + type: 'bool', + }, + ], + name: 'setGreeting', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: '_greeting', + type: 'string', + }, + ], + name: 'setGreeting', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const GreeterWithOverloadingBytecode = + '608060405234801562000010575f80fd5b506040516200104d3803806200104d8339818101604052810190620000369190620001da565b806001908162000047919062000460565b505f80819055505062000544565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620000b6826200006e565b810181811067ffffffffffffffff82111715620000d857620000d76200007e565b5b80604052505050565b5f620000ec62000055565b9050620000fa8282620000ab565b919050565b5f67ffffffffffffffff8211156200011c576200011b6200007e565b5b62000127826200006e565b9050602081019050919050565b5f5b838110156200015357808201518184015260208101905062000136565b5f8484015250505050565b5f620001746200016e84620000ff565b620000e1565b9050828152602081018484840111156200019357620001926200006a565b5b620001a084828562000134565b509392505050565b5f82601f830112620001bf57620001be62000066565b5b8151620001d18482602086016200015e565b91505092915050565b5f60208284031215620001f257620001f16200005e565b5b5f82015167ffffffffffffffff81111562000212576200021162000062565b5b6200022084828501620001a8565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200027857607f821691505b6020821081036200028e576200028d62000233565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620002f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002b5565b620002fe8683620002b5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000348620003426200033c8462000316565b6200031f565b62000316565b9050919050565b5f819050919050565b620003638362000328565b6200037b62000372826200034f565b848454620002c1565b825550505050565b5f90565b6200039162000383565b6200039e81848462000358565b505050565b5b81811015620003c557620003b95f8262000387565b600181019050620003a4565b5050565b601f8211156200041457620003de8162000294565b620003e984620002a6565b81016020851015620003f9578190505b620004116200040885620002a6565b830182620003a3565b50505b505050565b5f82821c905092915050565b5f620004365f198460080262000419565b1980831691505092915050565b5f62000450838362000425565b9150826002028217905092915050565b6200046b8262000229565b67ffffffffffffffff8111156200048757620004866200007e565b5b62000493825462000260565b620004a0828285620003c9565b5f60209050601f831160018114620004d6575f8415620004c1578287015190505b620004cd858262000443565b8655506200053c565b601f198416620004e68662000294565b5f5b828110156200050f57848901518255600182019150602085019450602081019050620004e8565b868310156200052f57848901516200052b601f89168262000425565b8355505b6001600288020188555050505b505050505050565b610afb80620005525f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80634495ef8a1461004e578063a41368621461007f578063cfae3217146100b0578063d09de08a146100ce575b5f80fd5b61006860048036038101906100639190610545565b6100d8565b604051610076929190610628565b60405180910390f35b61009960048036038101906100949190610656565b610203565b6040516100a7929190610628565b60405180910390f35b6100b861031e565b6040516100c5919061069d565b60405180910390f35b6100d66103ae565b005b5f6060821561011c577f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001856040516101139291906107ad565b60405180910390a15b836001908161012b9190610976565b50821561016b577f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e60016040516101629190610a45565b60405180910390a15b60018080805461017a906106ea565b80601f01602080910402602001604051908101604052809291908181526020018280546101a6906106ea565b80156101f15780601f106101c8576101008083540402835291602001916101f1565b820191905f5260205f20905b8154815290600101906020018083116101d457829003601f168201915b50505050509050915091509250929050565b5f60607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516102389291906107ad565b60405180910390a1826001908161024f9190610976565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e60016040516102809190610a45565b60405180910390a1600180808054610297906106ea565b80601f01602080910402602001604051908101604052809291908181526020018280546102c3906106ea565b801561030e5780601f106102e55761010080835404028352916020019161030e565b820191905f5260205f20905b8154815290600101906020018083116102f157829003601f168201915b5050505050905091509150915091565b60606001805461032d906106ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610359906106ea565b80156103a45780601f1061037b576101008083540402835291602001916103a4565b820191905f5260205f20905b81548152906001019060200180831161038757829003601f168201915b5050505050905090565b60015f546103bc9190610a92565b5f81905550565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610422826103dc565b810181811067ffffffffffffffff82111715610441576104406103ec565b5b80604052505050565b5f6104536103c3565b905061045f8282610419565b919050565b5f67ffffffffffffffff82111561047e5761047d6103ec565b5b610487826103dc565b9050602081019050919050565b828183375f83830152505050565b5f6104b46104af84610464565b61044a565b9050828152602081018484840111156104d0576104cf6103d8565b5b6104db848285610494565b509392505050565b5f82601f8301126104f7576104f66103d4565b5b81356105078482602086016104a2565b91505092915050565b5f8115159050919050565b61052481610510565b811461052e575f80fd5b50565b5f8135905061053f8161051b565b92915050565b5f806040838503121561055b5761055a6103cc565b5b5f83013567ffffffffffffffff811115610578576105776103d0565b5b610584858286016104e3565b925050602061059585828601610531565b9150509250929050565b6105a881610510565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156105e55780820151818401526020810190506105ca565b5f8484015250505050565b5f6105fa826105ae565b61060481856105b8565b93506106148185602086016105c8565b61061d816103dc565b840191505092915050565b5f60408201905061063b5f83018561059f565b818103602083015261064d81846105f0565b90509392505050565b5f6020828403121561066b5761066a6103cc565b5b5f82013567ffffffffffffffff811115610688576106876103d0565b5b610694848285016104e3565b91505092915050565b5f6020820190508181035f8301526106b581846105f0565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061070157607f821691505b602082108103610714576107136106bd565b5b50919050565b5f819050815f5260205f209050919050565b5f8154610738816106ea565b61074281866105b8565b9450600182165f811461075c5760018114610772576107a4565b60ff1983168652811515602002860193506107a4565b61077b8561071a565b5f5b8381101561079c5781548189015260018201915060208101905061077d565b808801955050505b50505092915050565b5f6040820190508181035f8301526107c5818561072c565b905081810360208301526107d981846105f0565b90509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261082c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826107f1565b61083686836107f1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61087a6108756108708461084e565b610857565b61084e565b9050919050565b5f819050919050565b61089383610860565b6108a761089f82610881565b8484546107fd565b825550505050565b5f90565b6108bb6108af565b6108c681848461088a565b505050565b5b818110156108e9576108de5f826108b3565b6001810190506108cc565b5050565b601f82111561092e576108ff8161071a565b610908846107e2565b81016020851015610917578190505b61092b610923856107e2565b8301826108cb565b50505b505050565b5f82821c905092915050565b5f61094e5f1984600802610933565b1980831691505092915050565b5f610966838361093f565b9150826002028217905092915050565b61097f826105ae565b67ffffffffffffffff811115610998576109976103ec565b5b6109a282546106ea565b6109ad8282856108ed565b5f60209050601f8311600181146109de575f84156109cc578287015190505b6109d6858261095b565b865550610a3d565b601f1984166109ec8661071a565b5f5b82811015610a13578489015182556001820191506020850194506020810190506109ee565b86831015610a305784890151610a2c601f89168261093f565b8355505b6001600288020188555050505b505050505050565b5f6020820190508181035f830152610a5d818461072c565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610a9c8261084e565b9150610aa78361084e565b9250828201905080821115610abf57610abe610a65565b5b9291505056fea2646970667358221220ca996f61ff5eed9f5836fc8d7c848be4c10bc5fff806ab49930b9c7947082dea64736f6c63430008140033'; diff --git a/fixtures/build/MsgSender.json b/fixtures/build/MsgSender.json new file mode 100644 index 00000000000..6db015bbdbf --- /dev/null +++ b/fixtures/build/MsgSender.json @@ -0,0 +1,70 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_testString", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "from", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_testString", + "type": "string" + } + ], + "name": "setTestString", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "testString", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "60806040523480156200001157600080fd5b5060405162000d7538038062000d758339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b6107ff80620005766000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063315e2f1b14610046578063d5ce338914610077578063fb8f0f5914610095575b600080fd5b610060600480360381019061005b9190610350565b6100b3565b60405161006e929190610433565b60405180910390f35b61007f610160565b60405161008c91906104a4565b60405180910390f35b61009d610168565b6040516100aa91906104bf565b60405180910390f35b6000606082600090816100c691906106f7565b50600160008080546100d790610510565b80601f016020809104026020016040519081016040528092919081815260200182805461010390610510565b80156101505780601f1061012557610100808354040283529160200191610150565b820191906000526020600020905b81548152906001019060200180831161013357829003601f168201915b5050505050905091509150915091565b600033905090565b6000805461017590610510565b80601f01602080910402602001604051908101604052809291908181526020018280546101a190610510565b80156101ee5780601f106101c3576101008083540402835291602001916101ee565b820191906000526020600020905b8154815290600101906020018083116101d157829003601f168201915b505050505081565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61025d82610214565b810181811067ffffffffffffffff8211171561027c5761027b610225565b5b80604052505050565b600061028f6101f6565b905061029b8282610254565b919050565b600067ffffffffffffffff8211156102bb576102ba610225565b5b6102c482610214565b9050602081019050919050565b82818337600083830152505050565b60006102f36102ee846102a0565b610285565b90508281526020810184848401111561030f5761030e61020f565b5b61031a8482856102d1565b509392505050565b600082601f8301126103375761033661020a565b5b81356103478482602086016102e0565b91505092915050565b60006020828403121561036657610365610200565b5b600082013567ffffffffffffffff81111561038457610383610205565b5b61039084828501610322565b91505092915050565b60008115159050919050565b6103ae81610399565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156103ee5780820151818401526020810190506103d3565b60008484015250505050565b6000610405826103b4565b61040f81856103bf565b935061041f8185602086016103d0565b61042881610214565b840191505092915050565b600060408201905061044860008301856103a5565b818103602083015261045a81846103fa565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061048e82610463565b9050919050565b61049e81610483565b82525050565b60006020820190506104b96000830184610495565b92915050565b600060208201905081810360008301526104d981846103fa565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061052857607f821691505b60208210810361053b5761053a6104e1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610566565b6105ad8683610566565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006105f46105ef6105ea846105c5565b6105cf565b6105c5565b9050919050565b6000819050919050565b61060e836105d9565b61062261061a826105fb565b848454610573565b825550505050565b600090565b61063761062a565b610642818484610605565b505050565b5b818110156106665761065b60008261062f565b600181019050610648565b5050565b601f8211156106ab5761067c81610541565b61068584610556565b81016020851015610694578190505b6106a86106a085610556565b830182610647565b50505b505050565b600082821c905092915050565b60006106ce600019846008026106b0565b1980831691505092915050565b60006106e783836106bd565b9150826002028217905092915050565b610700826103b4565b67ffffffffffffffff81111561071957610718610225565b5b6107238254610510565b61072e82828561066a565b600060209050601f831160018114610761576000841561074f578287015190505b61075985826106db565b8655506107c1565b601f19841661076f86610541565b60005b8281101561079757848901518255600182019150602085019450602081019050610772565b868310156107b457848901516107b0601f8916826106bd565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220f5b52b9777b17d7a9f963ebe1aebfd28e8dbda53903b34c06791e2ba5acd46d964736f6c63430008100033" + } + } +} diff --git a/fixtures/build/MsgSender.ts b/fixtures/build/MsgSender.ts new file mode 100644 index 00000000000..a3020cdfba0 --- /dev/null +++ b/fixtures/build/MsgSender.ts @@ -0,0 +1,49 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const MsgSenderAbi = [ + { + inputs: [{ internalType: 'string', name: '_testString', type: 'string' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'from', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'string', name: '_testString', type: 'string' }], + name: 'setTestString', + outputs: [ + { internalType: 'bool', name: '', type: 'bool' }, + { internalType: 'string', name: '', type: 'string' }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'testString', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, +] as const; +export const MsgSenderBytecode = + '0x60806040523480156200001157600080fd5b5060405162000d7538038062000d758339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b6107ff80620005766000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063315e2f1b14610046578063d5ce338914610077578063fb8f0f5914610095575b600080fd5b610060600480360381019061005b9190610350565b6100b3565b60405161006e929190610433565b60405180910390f35b61007f610160565b60405161008c91906104a4565b60405180910390f35b61009d610168565b6040516100aa91906104bf565b60405180910390f35b6000606082600090816100c691906106f7565b50600160008080546100d790610510565b80601f016020809104026020016040519081016040528092919081815260200182805461010390610510565b80156101505780601f1061012557610100808354040283529160200191610150565b820191906000526020600020905b81548152906001019060200180831161013357829003601f168201915b5050505050905091509150915091565b600033905090565b6000805461017590610510565b80601f01602080910402602001604051908101604052809291908181526020018280546101a190610510565b80156101ee5780601f106101c3576101008083540402835291602001916101ee565b820191906000526020600020905b8154815290600101906020018083116101d157829003601f168201915b505050505081565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61025d82610214565b810181811067ffffffffffffffff8211171561027c5761027b610225565b5b80604052505050565b600061028f6101f6565b905061029b8282610254565b919050565b600067ffffffffffffffff8211156102bb576102ba610225565b5b6102c482610214565b9050602081019050919050565b82818337600083830152505050565b60006102f36102ee846102a0565b610285565b90508281526020810184848401111561030f5761030e61020f565b5b61031a8482856102d1565b509392505050565b600082601f8301126103375761033661020a565b5b81356103478482602086016102e0565b91505092915050565b60006020828403121561036657610365610200565b5b600082013567ffffffffffffffff81111561038457610383610205565b5b61039084828501610322565b91505092915050565b60008115159050919050565b6103ae81610399565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156103ee5780820151818401526020810190506103d3565b60008484015250505050565b6000610405826103b4565b61040f81856103bf565b935061041f8185602086016103d0565b61042881610214565b840191505092915050565b600060408201905061044860008301856103a5565b818103602083015261045a81846103fa565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061048e82610463565b9050919050565b61049e81610483565b82525050565b60006020820190506104b96000830184610495565b92915050565b600060208201905081810360008301526104d981846103fa565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061052857607f821691505b60208210810361053b5761053a6104e1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026105a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610566565b6105ad8683610566565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006105f46105ef6105ea846105c5565b6105cf565b6105c5565b9050919050565b6000819050919050565b61060e836105d9565b61062261061a826105fb565b848454610573565b825550505050565b600090565b61063761062a565b610642818484610605565b505050565b5b818110156106665761065b60008261062f565b600181019050610648565b5050565b601f8211156106ab5761067c81610541565b61068584610556565b81016020851015610694578190505b6106a86106a085610556565b830182610647565b50505b505050565b600082821c905092915050565b60006106ce600019846008026106b0565b1980831691505092915050565b60006106e783836106bd565b9150826002028217905092915050565b610700826103b4565b67ffffffffffffffff81111561071957610718610225565b5b6107238254610510565b61072e82828561066a565b600060209050601f831160018114610761576000841561074f578287015190505b61075985826106db565b8655506107c1565b601f19841661076f86610541565b60005b8281101561079757848901518255600182019150602085019450602081019050610772565b868310156107b457848901516107b0601f8916826106bd565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220f5b52b9777b17d7a9f963ebe1aebfd28e8dbda53903b34c06791e2ba5acd46d964736f6c63430008100033'; diff --git a/fixtures/build/MyContract.json b/fixtures/build/MyContract.json new file mode 100644 index 00000000000..7da2cedd55e --- /dev/null +++ b/fixtures/build/MyContract.json @@ -0,0 +1,22 @@ +{ + "abi": [ + { + "inputs": [], + "name": "getAttr", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "608060405234801561001057600080fd5b50610228806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f540c8ba14610030575b600080fd5b61003861004e565b6040516100459190610170565b60405180910390f35b60606000805461005d906101c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610089906101c1565b80156100d65780601f106100ab576101008083540402835291602001916100d6565b820191906000526020600020905b8154815290600101906020018083116100b957829003601f168201915b5050505050905090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561011a5780820151818401526020810190506100ff565b60008484015250505050565b6000601f19601f8301169050919050565b6000610142826100e0565b61014c81856100eb565b935061015c8185602086016100fc565b61016581610126565b840191505092915050565b6000602082019050818103600083015261018a8184610137565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806101d957607f821691505b6020821081036101ec576101eb610192565b5b5091905056fea264697066735822122061f485ab43edfa5bd740bc1f3dd0d643813a4bd2457119e6578414d7389fbd8964736f6c63430008100033" + } + } +} diff --git a/fixtures/build/MyContract.ts b/fixtures/build/MyContract.ts new file mode 100644 index 00000000000..468e35ead71 --- /dev/null +++ b/fixtures/build/MyContract.ts @@ -0,0 +1,27 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const MyContractAbi = [ + { + inputs: [], + name: 'getAttr', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, +] as const; +export const MyContractBytecode = + '0x608060405234801561001057600080fd5b50610228806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f540c8ba14610030575b600080fd5b61003861004e565b6040516100459190610170565b60405180910390f35b60606000805461005d906101c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610089906101c1565b80156100d65780601f106100ab576101008083540402835291602001916100d6565b820191906000526020600020905b8154815290600101906020018083116100b957829003601f168201915b5050505050905090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561011a5780820151818401526020810190506100ff565b60008484015250505050565b6000601f19601f8301169050919050565b6000610142826100e0565b61014c81856100eb565b935061015c8185602086016100fc565b61016581610126565b840191505092915050565b6000602082019050818103600083015261018a8184610137565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806101d957607f821691505b6020821081036101ec576101eb610192565b5b5091905056fea264697066735822122061f485ab43edfa5bd740bc1f3dd0d643813a4bd2457119e6578414d7389fbd8964736f6c63430008100033'; diff --git a/fixtures/build/NegativeNumbers.json b/fixtures/build/NegativeNumbers.json new file mode 100644 index 00000000000..fa33b6f147a --- /dev/null +++ b/fixtures/build/NegativeNumbers.json @@ -0,0 +1,201 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "int256", + "name": "number", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "int256", + "name": "one", + "type": "int256" + } + ], + "name": "OneNegativeNumber", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "one", + "type": "int256" + } + ], + "name": "OneNegativeNumberIndexed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "positive", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "negative", + "type": "int256" + }, + { + "indexed": false, + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "OtherNegativeNumbers", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "positive", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "int256", + "name": "negative", + "type": "int256" + }, + { + "indexed": false, + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "OtherNegativeNumbersIndexed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "int256", + "name": "one", + "type": "int256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "two", + "type": "int256" + } + ], + "name": "TwoNegativeNumbers", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "int256", + "name": "one", + "type": "int256" + }, + { + "indexed": true, + "internalType": "int256", + "name": "two", + "type": "int256" + } + ], + "name": "TwoNegativeNumbersIndexed", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "number", + "type": "int256" + } + ], + "name": "oneNegativeNumber", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "number", + "type": "int256" + }, + { + "internalType": "int256", + "name": "number2", + "type": "int256" + }, + { + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "otherNegativeNumbers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "storedNegativeNumber", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "number", + "type": "int256" + }, + { + "internalType": "int256", + "name": "number2", + "type": "int256" + } + ], + "name": "twoNegativeNumbers", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "object": "608060405234801561001057600080fd5b506040516105b93803806105b98339818101604052810190610032919061007a565b80600081905550506100a7565b600080fd5b6000819050919050565b61005781610044565b811461006257600080fd5b50565b6000815190506100748161004e565b92915050565b6000602082840312156100905761008f61003f565b5b600061009e84828501610065565b91505092915050565b610503806100b66000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806309872ebc1461005157806310e9b2b41461006f5780634a299b871461008b5780636119780b146100a7575b600080fd5b6100596100c3565b6040516100669190610232565b60405180910390f35b61008960048036038101906100849190610283565b6100c9565b005b6100a560048036038101906100a09190610315565b610130565b005b6100c160048036038101906100bc9190610389565b6101ae565b005b60005481565b7f5b53dc4e9e8fa2416d4e172bdad04be5a6d622643bc9ef45987b2caadd0d0c95816040516100f89190610232565b60405180910390a1807f33e7dccd3899498f4408d6468e5dfad650f32574dba2ec4f13399a82e62166d560405160405180910390a250565b7f2e1fb99ee1b27b6491b2d46a54ac8daca82f2da6810e4b8eed4d634f78fa6948848484846040516101659493929190610440565b60405180910390a182847f0e29b573959c1b6ffd5e16886385ec1732e187cc5ac10e8faceb5e02a1c7b50b84846040516101a0929190610480565b60405180910390a350505050565b7ffaa997e4b16dcde196bbb99868e16fa934a0b4c1f019e494d9fbffb5abc46fc282826040516101df9291906104a4565b60405180910390a180827f0204c97becd72594486cf753e30e8acfc9951ee663e404bc858e3d10b80da99b60405160405180910390a35050565b6000819050919050565b61022c81610219565b82525050565b60006020820190506102476000830184610223565b92915050565b600080fd5b600080fd5b61026081610219565b811461026b57600080fd5b50565b60008135905061027d81610257565b92915050565b6000602082840312156102995761029861024d565b5b60006102a78482850161026e565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126102d5576102d46102b0565b5b8235905067ffffffffffffffff8111156102f2576102f16102b5565b5b60208301915083600182028301111561030e5761030d6102ba565b5b9250929050565b6000806000806060858703121561032f5761032e61024d565b5b600061033d8782880161026e565b945050602061034e8782880161026e565b935050604085013567ffffffffffffffff81111561036f5761036e610252565b5b61037b878288016102bf565b925092505092959194509250565b600080604083850312156103a05761039f61024d565b5b60006103ae8582860161026e565b92505060206103bf8582860161026e565b9150509250929050565b6000819050919050565b6103dc816103c9565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061041f83856103e2565b935061042c8385846103f3565b61043583610402565b840190509392505050565b600060608201905061045560008301876103d3565b6104626020830186610223565b8181036040830152610475818486610413565b905095945050505050565b6000602082019050818103600083015261049b818486610413565b90509392505050565b60006040820190506104b96000830185610223565b6104c66020830184610223565b939250505056fea26469706673582212203eb052901c785465d43fe463b8123363abc0767d1df3b47a9c4cdc319870d8c264736f6c634300080d0033" + } + } +} diff --git a/fixtures/build/NegativeNumbers.ts b/fixtures/build/NegativeNumbers.ts new file mode 100644 index 00000000000..fd630ed48c2 --- /dev/null +++ b/fixtures/build/NegativeNumbers.ts @@ -0,0 +1,213 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const NegativeNumbersAbi = [ + { + inputs: [ + { + internalType: 'int256', + name: 'number', + type: 'int256', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'int256', + name: 'one', + type: 'int256', + }, + ], + name: 'OneNegativeNumber', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'int256', + name: 'one', + type: 'int256', + }, + ], + name: 'OneNegativeNumberIndexed', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'positive', + type: 'uint256', + }, + { + indexed: false, + internalType: 'int256', + name: 'negative', + type: 'int256', + }, + { + indexed: false, + internalType: 'string', + name: 'str', + type: 'string', + }, + ], + name: 'OtherNegativeNumbers', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'uint256', + name: 'positive', + type: 'uint256', + }, + { + indexed: true, + internalType: 'int256', + name: 'negative', + type: 'int256', + }, + { + indexed: false, + internalType: 'string', + name: 'str', + type: 'string', + }, + ], + name: 'OtherNegativeNumbersIndexed', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'int256', + name: 'one', + type: 'int256', + }, + { + indexed: false, + internalType: 'int256', + name: 'two', + type: 'int256', + }, + ], + name: 'TwoNegativeNumbers', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'int256', + name: 'one', + type: 'int256', + }, + { + indexed: true, + internalType: 'int256', + name: 'two', + type: 'int256', + }, + ], + name: 'TwoNegativeNumbersIndexed', + type: 'event', + }, + { + inputs: [ + { + internalType: 'int256', + name: 'number', + type: 'int256', + }, + ], + name: 'oneNegativeNumber', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'int256', + name: 'number', + type: 'int256', + }, + { + internalType: 'int256', + name: 'number2', + type: 'int256', + }, + { + internalType: 'string', + name: 'str', + type: 'string', + }, + ], + name: 'otherNegativeNumbers', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'storedNegativeNumber', + outputs: [ + { + internalType: 'int256', + name: '', + type: 'int256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'int256', + name: 'number', + type: 'int256', + }, + { + internalType: 'int256', + name: 'number2', + type: 'int256', + }, + ], + name: 'twoNegativeNumbers', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; + +export const NegativeNumbersBytecode = + '0x608060405234801561001057600080fd5b506040516105b93803806105b98339818101604052810190610032919061007a565b80600081905550506100a7565b600080fd5b6000819050919050565b61005781610044565b811461006257600080fd5b50565b6000815190506100748161004e565b92915050565b6000602082840312156100905761008f61003f565b5b600061009e84828501610065565b91505092915050565b610503806100b66000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806309872ebc1461005157806310e9b2b41461006f5780634a299b871461008b5780636119780b146100a7575b600080fd5b6100596100c3565b6040516100669190610232565b60405180910390f35b61008960048036038101906100849190610283565b6100c9565b005b6100a560048036038101906100a09190610315565b610130565b005b6100c160048036038101906100bc9190610389565b6101ae565b005b60005481565b7f5b53dc4e9e8fa2416d4e172bdad04be5a6d622643bc9ef45987b2caadd0d0c95816040516100f89190610232565b60405180910390a1807f33e7dccd3899498f4408d6468e5dfad650f32574dba2ec4f13399a82e62166d560405160405180910390a250565b7f2e1fb99ee1b27b6491b2d46a54ac8daca82f2da6810e4b8eed4d634f78fa6948848484846040516101659493929190610440565b60405180910390a182847f0e29b573959c1b6ffd5e16886385ec1732e187cc5ac10e8faceb5e02a1c7b50b84846040516101a0929190610480565b60405180910390a350505050565b7ffaa997e4b16dcde196bbb99868e16fa934a0b4c1f019e494d9fbffb5abc46fc282826040516101df9291906104a4565b60405180910390a180827f0204c97becd72594486cf753e30e8acfc9951ee663e404bc858e3d10b80da99b60405160405180910390a35050565b6000819050919050565b61022c81610219565b82525050565b60006020820190506102476000830184610223565b92915050565b600080fd5b600080fd5b61026081610219565b811461026b57600080fd5b50565b60008135905061027d81610257565b92915050565b6000602082840312156102995761029861024d565b5b60006102a78482850161026e565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126102d5576102d46102b0565b5b8235905067ffffffffffffffff8111156102f2576102f16102b5565b5b60208301915083600182028301111561030e5761030d6102ba565b5b9250929050565b6000806000806060858703121561032f5761032e61024d565b5b600061033d8782880161026e565b945050602061034e8782880161026e565b935050604085013567ffffffffffffffff81111561036f5761036e610252565b5b61037b878288016102bf565b925092505092959194509250565b600080604083850312156103a05761039f61024d565b5b60006103ae8582860161026e565b92505060206103bf8582860161026e565b9150509250929050565b6000819050919050565b6103dc816103c9565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061041f83856103e2565b935061042c8385846103f3565b61043583610402565b840190509392505050565b600060608201905061045560008301876103d3565b6104626020830186610223565b8181036040830152610475818486610413565b905095945050505050565b6000602082019050818103600083015261049b818486610413565b90509392505050565b60006040820190506104b96000830185610223565b6104c66020830184610223565b939250505056fea26469706673582212203eb052901c785465d43fe463b8123363abc0767d1df3b47a9c4cdc319870d8c264736f6c634300080d0033'; diff --git a/fixtures/contracts/Basic.sol b/fixtures/contracts/Basic.sol new file mode 100644 index 00000000000..89b3a1c8a65 --- /dev/null +++ b/fixtures/contracts/Basic.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +contract Basic { + uint256 intValue; + string stringValue; + bool boolValue; + + event StringEvent(string str); + event MultiValueEvent(string str, uint256 val, bool flag); + event MultiValueIndexedEvent(string str, uint256 indexed val, bool indexed flag); + event MultiValueIndexedEventWithStringIndexed(string indexed str, uint256 indexed val, bool indexed flag); + + constructor(uint256 _val, string memory _stringValue) { + intValue = _val; + stringValue = _stringValue; + } + + function getStringValue() public view returns (string memory) { + return stringValue; + } + + function getIntValue() public view returns (uint256) { + return intValue; + } + + function getBoolValue() public view returns (bool) { + return boolValue; + } + + function getValues() public view returns (uint256, string memory, bool) { + return (intValue, stringValue, boolValue); + } + + function setValues(uint256 _value, string memory _stringValue, bool _boolValue) public { + intValue = _value; + stringValue = _stringValue; + boolValue = _boolValue; + } + + function requireWithoutReason() public pure { + require(false); + } + + function requireWithReason() public pure { + require(false, 'REVERTED WITH REQUIRE'); + } + + function reverts() public pure { + revert('REVERTED WITH REVERT'); + } + + function firesMultiValueEvent(string memory str, uint256 val, bool flag) public { + emit MultiValueEvent(str, val, flag); + } + + function firesMultiValueIndexedEvent(string memory str, uint256 val, bool flag) public { + emit MultiValueIndexedEvent(str, val, flag); + } + + function firesStringEvent(string memory _str) public { + emit StringEvent(_str); + } + + function firesMultiValueIndexedEventWithStringIndexed(string calldata str, uint256 val, bool flag) public { + emit MultiValueIndexedEventWithStringIndexed(str, val, flag); + } +} diff --git a/fixtures/contracts/DeployRevert.sol b/fixtures/contracts/DeployRevert.sol new file mode 100644 index 00000000000..a04b0f1cbb1 --- /dev/null +++ b/fixtures/contracts/DeployRevert.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +contract DeployRevert { + constructor() public { + require(false); + } +} diff --git a/fixtures/contracts/ERC20Token.sol b/fixtures/contracts/ERC20Token.sol new file mode 100644 index 00000000000..7a94d0ff0e9 --- /dev/null +++ b/fixtures/contracts/ERC20Token.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; + +contract ERC20Token is ERC20 { + constructor(uint256 initialSupply) ERC20('Gold', 'GLD') { + _mint(msg.sender, initialSupply); + } +} diff --git a/fixtures/contracts/ERC721Token.sol b/fixtures/contracts/ERC721Token.sol new file mode 100644 index 00000000000..4fa7f445e79 --- /dev/null +++ b/fixtures/contracts/ERC721Token.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +import '@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol'; +import '@openzeppelin/contracts/utils/Counters.sol'; + +contract ERC721Token is ERC721URIStorage { + using Counters for Counters.Counter; + Counters.Counter private _tokenIds; + + constructor() ERC721('GameItem', 'ITM') {} + + function awardItem(address player, string memory tokenURI) public returns (uint256) { + uint256 newItemId = _tokenIds.current(); + _mint(player, newItemId); + _setTokenURI(newItemId, tokenURI); + + _tokenIds.increment(); + return newItemId; + } +} diff --git a/fixtures/contracts/ErrorsContract.sol b/fixtures/contracts/ErrorsContract.sol new file mode 100644 index 00000000000..d6b7bb7c0db --- /dev/null +++ b/fixtures/contracts/ErrorsContract.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +error Unauthorized(); +error CustomError(string); + +contract ErrorsContract { + address payable owner = payable(0x0); + + constructor() {} + + function unauthorize() public { + if (msg.sender != owner) revert Unauthorized(); + + owner.transfer(address(this).balance); + } + + function badRequire() public { + if (1 < 2) revert CustomError('reverted using custom Error'); + + owner.transfer(address(this).balance); + } +} diff --git a/fixtures/contracts/Greeter.sol b/fixtures/contracts/Greeter.sol new file mode 100644 index 00000000000..387ebe99fcd --- /dev/null +++ b/fixtures/contracts/Greeter.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +contract Greeter { + uint256 counter; + string private greeting; + + event GREETING_CHANGING(string from, string to); + event GREETING_CHANGED(string greeting); + + constructor(string memory _greeting) { + greeting = _greeting; + counter = 0; + } + + function greet() public view returns (string memory) { + return greeting; + } + + function setGreeting(string memory _greeting) public returns (bool, string memory) { + emit GREETING_CHANGING(greeting, _greeting); + greeting = _greeting; + emit GREETING_CHANGED(greeting); + return (true, greeting); + } + + function increment() public { + counter = counter + 1; + } +} diff --git a/fixtures/contracts/GreeterWithOverloading.sol b/fixtures/contracts/GreeterWithOverloading.sol new file mode 100644 index 00000000000..384709287b2 --- /dev/null +++ b/fixtures/contracts/GreeterWithOverloading.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +contract GreeterWithOverloading { + uint256 counter; + string private greeting; + + event GREETING_CHANGING(string from, string to); + event GREETING_CHANGED(string greeting); + + constructor(string memory _greeting) { + greeting = _greeting; + counter = 0; + } + + function greet() public view returns (string memory) { + return greeting; + } + + function setGreeting(string memory _greeting) public returns (bool, string memory) { + emit GREETING_CHANGING(greeting, _greeting); + greeting = _greeting; + emit GREETING_CHANGED(greeting); + return (true, greeting); + } + + // function overlading with additional parameter + function setGreeting(string memory _greeting, bool _raiseEvents) public returns (bool, string memory) { + if(_raiseEvents) { + emit GREETING_CHANGING(greeting, _greeting); + } + greeting = _greeting; + if(_raiseEvents) { + emit GREETING_CHANGED(greeting); + } + return (true, greeting); + } + + function increment() public { + counter = counter + 1; + } +} + \ No newline at end of file diff --git a/fixtures/contracts/MsgSender.sol b/fixtures/contracts/MsgSender.sol new file mode 100644 index 00000000000..bac6ab9ee4b --- /dev/null +++ b/fixtures/contracts/MsgSender.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +contract MsgSender { + string public testString; + + constructor(string memory _testString) { + testString = _testString; + } + + function from() public view returns (address) { + return msg.sender; + } + + function setTestString(string memory _testString) public returns (bool, string memory) { + testString = _testString; + return (true, testString); + } +} diff --git a/fixtures/contracts/MyContract.sol b/fixtures/contracts/MyContract.sol new file mode 100644 index 00000000000..b24fad18374 --- /dev/null +++ b/fixtures/contracts/MyContract.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GNU + +pragma solidity ^0.8.13; + +contract MyContract { + string private myAttribute; + + function getAttr() public view returns (string memory) { + return myAttribute; + } +} diff --git a/fixtures/contracts/NegativeNumbers.sol b/fixtures/contracts/NegativeNumbers.sol new file mode 100644 index 00000000000..4c11a6b5449 --- /dev/null +++ b/fixtures/contracts/NegativeNumbers.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.13; + +contract NegativeNumbers { + int256 public storedNegativeNumber; + + event OneNegativeNumber(int256 one); + event OneNegativeNumberIndexed(int256 indexed one); + event TwoNegativeNumbers(int256 one, int256 two); + event TwoNegativeNumbersIndexed(int256 indexed one, int256 indexed two); + event OtherNegativeNumbers(uint256 positive, int256 negative, string str); + event OtherNegativeNumbersIndexed( + uint256 indexed positive, + int256 indexed negative, + string str + ); + + constructor(int256 number) { + storedNegativeNumber = number; + } + + function oneNegativeNumber(int256 number) public { + emit OneNegativeNumber(number); + emit OneNegativeNumberIndexed(number); + } + + function twoNegativeNumbers(int256 number, int256 number2) public { + emit TwoNegativeNumbers(number, number2); + emit TwoNegativeNumbersIndexed(number, number2); + } + + function otherNegativeNumbers( + int256 number, + int256 number2, + string calldata str + ) public { + emit OtherNegativeNumbers(uint256(number), number2, str); + emit OtherNegativeNumbersIndexed(uint256(number), number2, str); + } +} diff --git a/fixtures/utils.ts b/fixtures/utils.ts new file mode 100644 index 00000000000..191aed2138e --- /dev/null +++ b/fixtures/utils.ts @@ -0,0 +1,69 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const processAsync = async ( + processFunc: ( + resolver: (value: unknown) => void, + reject: (value: unknown) => void, + ) => Promise | unknown, +) => + new Promise((resolve, reject) => { + (async () => { + await processFunc(resolve, reject); + })() as unknown; + }); + +export const sleep = async (ms: number) => + new Promise(resolve => { + const id = setTimeout(() => { + clearTimeout(id); + resolve(true); + }, ms); + }); + +type InObj = { + [key: string]: unknown; +}; +const getNameValue = ( + data: Partial, + obj: InObj, + keys: string[], + result: Array, +) => { + if (keys.length === 0) { + result.push(data as R); + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const key: keyof InObj = keys.pop()!; + if (obj[key]) { + (obj[key] as []).map(v => getNameValue({ ...data, [key]: v }, obj, [...keys], result)); + } +}; + +export const toAllVariants = (obj: InObj): R[] => { + const keys: string[] = Object.keys(obj); + const result: Array = []; + getNameValue({}, obj, keys, result); + return result; +}; + +export const toUpperCaseHex = (str: string) => { + if (str.startsWith('0x') || str.startsWith('0X')) { + return `0x${str.toUpperCase().slice(2)}`; + } + + return `0x${str.toUpperCase()}`; +}; diff --git a/hardhat.config.js b/hardhat.config.js new file mode 100644 index 00000000000..4120e7903da --- /dev/null +++ b/hardhat.config.js @@ -0,0 +1,13 @@ +/** @type import('hardhat/config').HardhatUserConfig */ + +module.exports = { + solidity: "0.8.17", + networks: { + hardhat: { + chainId: 1337, + accounts: { + + } + } + } +}; diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000000..04e695a8e3a --- /dev/null +++ b/jest.config.js @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const path = require('path'); +const { lstatSync, readdirSync } = require('fs'); +// get listing of packages in the mono repo +const basePath = path.resolve(__dirname, 'packages'); +const packages = readdirSync(basePath).filter(name => + lstatSync(path.join(basePath, name)).isDirectory(), +); +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + moduleNameMapper: { + ...packages.reduce( + (acc, name) => ({ + ...acc, + [`${name}(.*)$`]: `/packages/./${name}/$1`, + }), + {}, + ), + }, +}; diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 24aa753f59c..00000000000 --- a/karma.conf.js +++ /dev/null @@ -1,42 +0,0 @@ -// BROWSER_BUNDLE_TEST is set for an un-browserified check that both bundles load correctly. -// BROWSER_BUNDLE_TEST is not set for the e2e unit tests, which check that bundle internals are ok. -function getTestFiles() { - switch (process.env.BROWSER_BUNDLE_TEST) { - case 'publishedDist': - return ['packages/web3/dist/web3.min.js', 'test/e2e.minified.js']; - case 'gitRepoDist': - return ['dist/web3.min.js', 'test/e2e.minified.js']; - default: - return ['test/**/e2e*.js']; - } -} - -// Only loads browserified preprocessor for the logic unit tests so we can `require` stuff. -function getPreprocessors() { - if (!process.env.BROWSER_BUNDLE_TEST) { - return { 'test/**/e2e*.js': ['browserify'] }; - } -} - -module.exports = function (config) { - const configuration = { - frameworks: ['mocha', 'browserify'], - files: getTestFiles(), - preprocessors: getPreprocessors(), - plugins: [ - 'karma-chrome-launcher', - 'karma-firefox-launcher', - 'karma-mocha', - 'karma-browserify', - 'karma-spec-reporter', - ], - reporters: ['spec'], - port: 9876, // karma web server port - colors: true, - logLevel: config.LOG_INFO, - autoWatch: false, - browsers: ['ChromeHeadless', 'FirefoxHeadless'], - }; - - config.set(configuration); -}; diff --git a/lerna.json b/lerna.json index 535b6320ce7..b5104ac58aa 100644 --- a/lerna.json +++ b/lerna.json @@ -1,16 +1,7 @@ { - "version": "1.3.0", - "lerna": "2.0.0", - "command": { - "init": { - "exact": true - }, - "publish": { - "exact": true, - "skipGit": true - } - }, - "packages": [ - "packages/*" - ] + "lerna": "4.0.0", + "npmClient": "yarn", + "useWorkspaces": true, + "version": "independent", + "packages": ["packages/*", "tools/*"] } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index f04a8e93621..00000000000 --- a/package-lock.json +++ /dev/null @@ -1,21083 +0,0 @@ -{ - "name": "web3.js", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/cli": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.12.1.tgz", - "integrity": "sha512-eRJREyrfAJ2r42Iaxe8h3v6yyj1wu9OyosaUHW6UImjGf9ahGL9nsFNh7OCopvtcPL8WnEo7tp78wrZaZ6vG9g==", - "dev": true, - "requires": { - "@nicolo-ribaudo/chokidar-2": "^2.1.8", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", - "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", - "dev": true - }, - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", - "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", - "dev": true, - "requires": { - "@babel/types": "^7.6.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", - "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.12.0", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", - "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", - "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", - "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", - "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", - "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.12.1" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" - } - }, - "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" - } - }, - "@babel/traverse": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", - "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.3", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.3", - "@babel/types": "^7.6.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@chainsafe/geth-dev-assistant": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@chainsafe/geth-dev-assistant/-/geth-dev-assistant-0.1.5.tgz", - "integrity": "sha512-9q5SuFSU+RAcxutg3Fs6Sz1BH120Lg2rWGJON29VVLmzyKzGJbTu9760OT9Gvv1x1pOiyZBduQ3C62SQpCTv+Q==", - "dev": true, - "requires": { - "colors": "^1.3.3", - "node-emoji": "^1.10.0", - "web3": "^1.2.9", - "yargs": "^13.2.2" - } - }, - "@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "dev": true, - "requires": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" - } - }, - "@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "dev": true - }, - "@ethersproject/abi": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz", - "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/abstract-provider": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz", - "integrity": "sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/networks": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/web": "^5.0.6" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" - } - }, - "@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/abstract-signer": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.0.7.tgz", - "integrity": "sha512-8W8gy/QutEL60EoMEpvxZ8MFAEWs/JvH5nmZ6xeLXoZvmBCasGmxqHdYjo2cxg0nevkPkq9SeenSsBBZSCx+SQ==", - "dev": true, - "requires": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3" - }, - "dependencies": { - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - } - } - }, - "@ethersproject/address": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.2.tgz", - "integrity": "sha512-+rz26RKj7ujGfQynys4V9VJRbR+wpC6eL8F22q3raWMH3152Ha31GwJPWzxE/bEA+43M/zTNVwY0R53gn53L2Q==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/keccak256": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/rlp": "^5.0.0", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/base64": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.0.4.tgz", - "integrity": "sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - } - } - }, - "@ethersproject/basex": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.0.4.tgz", - "integrity": "sha512-ixIr/kKiAoSzOnSc777AGIOAhKai5Ivqr4HO/Gz+YG+xkfv6kqD6AW4ga9vM20Wwb0QBhh3LoRWTu4V1K+x9Ew==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/properties": "^5.0.3" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - } - } - }, - "@ethersproject/bignumber": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.5.tgz", - "integrity": "sha512-24ln7PV0g8ZzjcVZiLW9Wod0i+XCmK6zKkAaxw5enraTIT1p7gVOcSXFSzNQ9WYAwtiFQPvvA+TIO2oEITZNJA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.3.tgz", - "integrity": "sha512-AyPMAlY+Amaw4Zfp8OAivm1xYPI8mqiUYmEnSUk1CnS2NrQGHEMmFJFiOJdS3gDDpgSOFhWIjZwxKq2VZpqNTA==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.0" - } - }, - "@ethersproject/constants": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.2.tgz", - "integrity": "sha512-nNoVlNP6bgpog7pQ2EyD1xjlaXcy1Cl4kK5v1KoskHj58EtB6TK8M8AFGi3GgHTdMldfT4eN3OsoQ/CdOTVNFA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.0" - } - }, - "@ethersproject/contracts": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.0.5.tgz", - "integrity": "sha512-tFI255lFbmbqMkgnuyhDWHl3yWqttPlReplYuVvDCT/SuvBjLR4ad2uipBlh1fh5X1ipK9ettAoV4S0HKim4Kw==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.5", - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/hash": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.5.tgz", - "integrity": "sha512-GpI80/h2HDpfNKpCZoxQJCjOQloGnlD5hM1G+tZe8FQDJhEvFjJoPDuWv+NaYjJfOciKS2Axqc4Q4WamdLoUgg==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/strings": "^5.0.4" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/hdnode": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.0.5.tgz", - "integrity": "sha512-Ho4HZaK+KijE5adayvjAGusWMnT0mgwGa5hGMBofBOgX9nqiKf6Wxx68SXBGI1/L3rmKo6mlAjxUd8gefs0teQ==", - "dev": true, - "requires": { - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/basex": "^5.0.3", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/pbkdf2": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/wordlists": "^5.0.4" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" - } - }, - "@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/json-wallets": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.0.7.tgz", - "integrity": "sha512-dgOn9JtGgjT28mDXs4LYY2rT4CzS6bG/rxoYuPq3TLHIf6nmvBcr33Fee6RrM/y8UAx4gyIkf6wb2cXsOctvQQ==", - "dev": true, - "requires": { - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hdnode": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/pbkdf2": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" - } - }, - "@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/keccak256": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.2.tgz", - "integrity": "sha512-MbroXutc0gPNYIrUjS4Aw0lDuXabdzI7+l7elRWr1G6G+W0v00e/3gbikWkCReGtt2Jnt4lQSgnflhDwQGcIhA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.0", - "js-sha3": "0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/logger": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.4.tgz", - "integrity": "sha512-alA2LiAy1LdQ/L1SA9ajUC7MvGAEQLsICEfKK4erX5qhkXE1LwLSPIzobtOWFsMHf2yrXGKBLnnpuVHprI3sAw==", - "dev": true - }, - "@ethersproject/networks": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.0.4.tgz", - "integrity": "sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - }, - "dependencies": { - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - } - } - }, - "@ethersproject/pbkdf2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.0.4.tgz", - "integrity": "sha512-9jVBjHXQKfr9+3bkCg01a8Cd1H9e+7Kw3ZMIvAxD0lZtuzrXsJxm1hVwY9KA+PRUvgS/9tTP4viXQYwLAax7zg==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/sha2": "^5.0.3" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - } - } - }, - "@ethersproject/properties": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.2.tgz", - "integrity": "sha512-FxAisPGAOACQjMJzewl9OJG6lsGCPTm5vpUMtfeoxzAlAb2lv+kHzQPUh9h4jfAILzE8AR1jgXMzRmlhwyra1Q==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.0" - } - }, - "@ethersproject/providers": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.0.13.tgz", - "integrity": "sha512-5jsuk1FwXxmoQApGs8LSQyS43KP01pHA+6cQ1OPov5pT5Pcqe6ffh6UD1//BZ9Vjf+5e9AQqIk8w7FkGyROuCA==", - "dev": true, - "requires": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/basex": "^5.0.3", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/networks": "^5.0.3", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/strings": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/web": "^5.0.6", - "bech32": "1.1.4", - "ws": "7.2.3" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" - } - }, - "@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - }, - "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", - "dev": true - } - } - }, - "@ethersproject/random": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.0.4.tgz", - "integrity": "sha512-AIZJhqs6Ba4/+U3lOjt3QZbP6b/kuuGLJUYFUonAgWmkTHwqsCwYnFvnHKQSUuHbXHvErp7WFXFlztx+yMn3kQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - } - } - }, - "@ethersproject/rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.2.tgz", - "integrity": "sha512-oE0M5jqQ67fi2SuMcrpoewOpEuoXaD8M9JeR9md1bXRMvDYgKXUtDHs22oevpEOdnO2DPIRabp6MVHa4aDuWmw==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/logger": "^5.0.0" - } - }, - "@ethersproject/sha2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.0.4.tgz", - "integrity": "sha512-0yFhf1mspxAfWdXXoPtK94adUeu1R7/FzAa+DfEiZTc76sz/vHXf0LSIazoR3znYKFny6haBxME+usbvvEcF3A==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "hash.js": "1.1.3" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - } - } - }, - "@ethersproject/signing-key": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.3.tgz", - "integrity": "sha512-5QPZaBRGCLzfVMbFb3LcVjNR0UbTXnwDHASnQYfbzwUOnFYHKxHsrcbl/5ONGoppgi8yXgOocKqlPCFycJJVWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/properties": "^5.0.0", - "elliptic": "6.5.3" - }, - "dependencies": { - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - } - } - }, - "@ethersproject/solidity": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.0.5.tgz", - "integrity": "sha512-DMFQ0ouXmNVoKWbGEUFGi8Urli4SJip9jXafQyFHWPRr5oJUqDVkNfwcyC37k+mhBG93k7qrYXCH2xJnGEOxHg==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/sha2": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - }, - "dependencies": { - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/strings": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.0.5.tgz", - "integrity": "sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - }, - "dependencies": { - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - } - } - }, - "@ethersproject/transactions": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.2.tgz", - "integrity": "sha512-jZp0ZbbJlq4JLZY6qoMzNtp2HQsX6USQposi3ns0MPUdn3OdZJBDtrcO15r/2VS5t/K1e1GE5MI1HmMKlcTbbQ==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.0", - "@ethersproject/bignumber": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/constants": "^5.0.0", - "@ethersproject/keccak256": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/properties": "^5.0.0", - "@ethersproject/rlp": "^5.0.0", - "@ethersproject/signing-key": "^5.0.0" - } - }, - "@ethersproject/units": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.0.6.tgz", - "integrity": "sha512-tsJuy4mipppdmooukRfhXt8fGx9nxvfvG6Xdy0RDm7LzHsjghjwQ69m2bCpId6SDSR1Uq1cQ9irPiUBSyWolUA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - }, - "dependencies": { - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - } - } - }, - "@ethersproject/wallet": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.0.6.tgz", - "integrity": "sha512-dRqx3+Degc5pvjaeeTHuk2EuTRM3b6ce/TiV0HRZhRXYnKyyjg0iYXEZo/b6p3rnV+Xhwxkc0+I/ISPkNpictA==", - "dev": true, - "requires": { - "@ethersproject/abstract-provider": "^5.0.4", - "@ethersproject/abstract-signer": "^5.0.4", - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/hdnode": "^5.0.4", - "@ethersproject/json-wallets": "^5.0.6", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/random": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4", - "@ethersproject/transactions": "^5.0.5", - "@ethersproject/wordlists": "^5.0.4" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" - } - }, - "@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "@ethersproject/web": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.0.9.tgz", - "integrity": "sha512-//QNlv1MSkOII1hv3+HQwWoiVFS+BMVGI0KYeUww4cyrEktnx1QIez5bTSab9s9fWTFaWKNmQNBwMbxAqPuYDw==", - "dev": true, - "requires": { - "@ethersproject/base64": "^5.0.3", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - } - } - }, - "@ethersproject/wordlists": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.0.5.tgz", - "integrity": "sha512-XA3ycFltVrCTQt04w5nHu3Xq5Z6HjqWsXaAYQHFdqtugyUsIumaO9S5MOwFFuUYTNkZUoT3jCRa/OBS+K4tLfA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/hash": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/strings": "^5.0.4" - }, - "dependencies": { - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - } - } - }, - "@evocateur/libnpmaccess": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", - "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "@evocateur/libnpmpublish": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", - "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "@evocateur/npm-registry-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", - "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@evocateur/pacote": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", - "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "bluebird": "^3.5.3", - "cacache": "^12.0.3", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.5.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.4.4", - "npm-pick-manifest": "^3.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.3", - "safe-buffer": "^5.2.0", - "semver": "^5.7.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@lerna/add": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", - "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", - "dev": true, - "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/bootstrap": "3.21.0", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "npm-package-arg": "^6.1.0", - "p-map": "^2.1.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/bootstrap": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", - "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/has-npm-version": "3.16.5", - "@lerna/npm-install": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/symlink-binary": "3.17.0", - "@lerna/symlink-dependencies": "3.17.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "get-port": "^4.2.0", - "multimatch": "^3.0.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0", - "read-package-tree": "^5.1.6", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/changed": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", - "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", - "dev": true, - "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" - } - }, - "@lerna/check-working-tree": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", - "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", - "dev": true, - "requires": { - "@lerna/collect-uncommitted": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "@lerna/validation-error": "3.13.0" - } - }, - "@lerna/child-process": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", - "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", - "dev": true, - "requires": { - "chalk": "^2.3.1", - "execa": "^1.0.0", - "strong-log-transformer": "^2.0.0" - } - }, - "@lerna/clean": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", - "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0" - } - }, - "@lerna/cli": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", - "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", - "dev": true, - "requires": { - "@lerna/global-options": "3.13.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^14.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "@lerna/collect-uncommitted": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", - "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "chalk": "^2.3.1", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/collect-updates": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", - "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "@lerna/command": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", - "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/project": "3.21.0", - "@lerna/validation-error": "3.13.0", - "@lerna/write-log-file": "3.13.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^1.0.0", - "is-ci": "^2.0.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/conventional-commits": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", - "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", - "dev": true, - "requires": { - "@lerna/validation-error": "3.13.0", - "conventional-changelog-angular": "^5.0.3", - "conventional-changelog-core": "^3.1.6", - "conventional-recommended-bump": "^5.0.0", - "fs-extra": "^8.1.0", - "get-stream": "^4.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "semver": "^6.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/create": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", - "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", - "dev": true, - "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "camelcase": "^5.0.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "globby": "^9.2.0", - "init-package-json": "^1.10.3", - "npm-package-arg": "^6.1.0", - "p-reduce": "^1.0.0", - "pify": "^4.0.1", - "semver": "^6.2.0", - "slash": "^2.0.0", - "validate-npm-package-license": "^3.0.3", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "@lerna/create-symlink": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", - "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", - "dev": true, - "requires": { - "@zkochan/cmd-shim": "^3.1.0", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/describe-ref": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", - "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2" - } - }, - "@lerna/diff": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", - "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/validation-error": "3.13.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/exec": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", - "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - } - }, - "@lerna/filter-options": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", - "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", - "dev": true, - "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/filter-packages": "3.18.0", - "dedent": "^0.7.0", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/filter-packages": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", - "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", - "dev": true, - "requires": { - "@lerna/validation-error": "3.13.0", - "multimatch": "^3.0.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/get-npm-exec-opts": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", - "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/get-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", - "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "ssri": "^6.0.1", - "tar": "^4.4.8" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/github-client": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", - "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^16.28.4", - "git-url-parse": "^11.1.2", - "npmlog": "^4.1.2" - } - }, - "@lerna/gitlab-client": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", - "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", - "dev": true, - "requires": { - "node-fetch": "^2.5.0", - "npmlog": "^4.1.2", - "whatwg-url": "^7.0.0" - } - }, - "@lerna/global-options": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", - "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==", - "dev": true - }, - "@lerna/has-npm-version": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", - "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/import": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", - "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "p-map-series": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/info": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", - "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/output": "3.13.0", - "envinfo": "^7.3.1" - } - }, - "@lerna/init": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", - "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0", - "write-json-file": "^3.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/link": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", - "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/package-graph": "3.18.5", - "@lerna/symlink-dependencies": "3.17.0", - "p-map": "^2.1.0", - "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "@lerna/list": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", - "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" - } - }, - "@lerna/listable": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", - "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", - "dev": true, - "requires": { - "@lerna/query-graph": "3.18.5", - "chalk": "^2.3.1", - "columnify": "^1.5.4" - } - }, - "@lerna/log-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", - "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", - "dev": true, - "requires": { - "byte-size": "^5.0.1", - "columnify": "^1.5.4", - "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" - } - }, - "@lerna/npm-conf": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", - "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", - "dev": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^4.0.1" - } - }, - "@lerna/npm-dist-tag": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", - "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", - "dev": true, - "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "@lerna/otplease": "3.18.5", - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/npm-install": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", - "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "signal-exit": "^3.0.2", - "write-pkg": "^3.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/npm-publish": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", - "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", - "dev": true, - "requires": { - "@evocateur/libnpmpublish": "^1.2.2", - "@lerna/otplease": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "read-package-json": "^2.0.13" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/npm-run-script": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", - "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/otplease": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", - "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", - "dev": true, - "requires": { - "@lerna/prompt": "3.18.5", - "figgy-pudding": "^3.5.1" - } - }, - "@lerna/output": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", - "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/pack-directory": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", - "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", - "dev": true, - "requires": { - "@lerna/get-packed": "3.16.0", - "@lerna/package": "3.16.0", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "npm-packlist": "^1.4.4", - "npmlog": "^4.1.2", - "tar": "^4.4.10", - "temp-write": "^3.4.0" - } - }, - "@lerna/package": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", - "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", - "dev": true, - "requires": { - "load-json-file": "^5.3.0", - "npm-package-arg": "^6.1.0", - "write-pkg": "^3.1.0" - }, - "dependencies": { - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "@lerna/package-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", - "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", - "dev": true, - "requires": { - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/validation-error": "3.13.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/prerelease-id-from-version": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", - "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", - "dev": true, - "requires": { - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/profiler": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", - "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "upath": "^1.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/project": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", - "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", - "dev": true, - "requires": { - "@lerna/package": "3.16.0", - "@lerna/validation-error": "3.13.0", - "cosmiconfig": "^5.1.0", - "dedent": "^0.7.0", - "dot-prop": "^4.2.0", - "glob-parent": "^5.0.0", - "globby": "^9.2.0", - "load-json-file": "^5.3.0", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "resolve-from": "^4.0.0", - "write-json-file": "^3.2.0" - }, - "dependencies": { - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "@lerna/prompt": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", - "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", - "dev": true, - "requires": { - "inquirer": "^6.2.0", - "npmlog": "^4.1.2" - } - }, - "@lerna/publish": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", - "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", - "dev": true, - "requires": { - "@evocateur/libnpmaccess": "^3.1.2", - "@evocateur/npm-registry-fetch": "^4.0.0", - "@evocateur/pacote": "^9.6.3", - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/describe-ref": "3.16.5", - "@lerna/log-packed": "3.16.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/npm-dist-tag": "3.18.5", - "@lerna/npm-publish": "3.18.5", - "@lerna/otplease": "3.18.5", - "@lerna/output": "3.13.0", - "@lerna/pack-directory": "3.16.4", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "@lerna/version": "3.22.1", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "semver": "^6.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@lerna/pulse-till-done": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", - "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/query-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", - "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", - "dev": true, - "requires": { - "@lerna/package-graph": "3.18.5", - "figgy-pudding": "^3.5.1" - } - }, - "@lerna/resolve-symlink": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", - "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^1.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/rimraf-dir": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", - "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", - "dev": true, - "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2", - "path-exists": "^3.0.0", - "rimraf": "^2.6.2" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "@lerna/run": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", - "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", - "dev": true, - "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-run-script": "3.16.5", - "@lerna/output": "3.13.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/timer": "3.13.0", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" - } - }, - "@lerna/run-lifecycle": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", - "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", - "dev": true, - "requires": { - "@lerna/npm-conf": "3.16.0", - "figgy-pudding": "^3.5.1", - "npm-lifecycle": "^3.1.2", - "npmlog": "^4.1.2" - } - }, - "@lerna/run-topologically": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", - "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", - "dev": true, - "requires": { - "@lerna/query-graph": "3.18.5", - "figgy-pudding": "^3.5.1", - "p-queue": "^4.0.0" - } - }, - "@lerna/symlink-binary": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", - "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", - "dev": true, - "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/package": "3.16.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/symlink-dependencies": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", - "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", - "dev": true, - "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/resolve-symlink": "3.16.0", - "@lerna/symlink-binary": "3.17.0", - "fs-extra": "^8.1.0", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "@lerna/timer": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", - "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==", - "dev": true - }, - "@lerna/validation-error": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", - "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", - "dev": true, - "requires": { - "npmlog": "^4.1.2" - } - }, - "@lerna/version": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", - "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/conventional-commits": "3.22.0", - "@lerna/github-client": "3.22.0", - "@lerna/gitlab-client": "3.15.0", - "@lerna/output": "3.13.0", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "chalk": "^2.3.1", - "dedent": "^0.7.0", - "load-json-file": "^5.3.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "p-reduce": "^1.0.0", - "p-waterfall": "^1.0.0", - "semver": "^6.2.0", - "slash": "^2.0.0", - "temp-write": "^3.4.0", - "write-json-file": "^3.2.0" - }, - "dependencies": { - "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "@lerna/write-log-file": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", - "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", - "dev": true, - "requires": { - "npmlog": "^4.1.2", - "write-file-atomic": "^2.3.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8.tgz", - "integrity": "sha512-FohwULwAebCUKi/akMFyGi7jfc7JXTeMHzKxuP3umRd9mK/2Y7/SMBSI2jX+YLopPXi+PF9l307NmpfxTdCegA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "2.1.8" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - }, - "dependencies": { - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - } - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz", - "integrity": "sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.8.tgz", - "integrity": "sha512-MuRrgv+bM4Q+e9uEvxAB/Kf+Sj0O2JAOBA131uo1o6lgdq1iS8ejKwtqHgdfY91V3rN9R/hdGKFiQYMzVzVBEQ==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - } - } - }, - "@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", - "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.1.tgz", - "integrity": "sha512-d8vmiGAUGswxErdIGfpd0I2UHo2Cs7EaBDpFUZQ9UqYmA0s5/4XoMO4HBld73xGpCj2BvyVyQe2qd9e+/nvKwQ==", - "dev": true - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", - "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.1", - "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/request": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.9.tgz", - "integrity": "sha512-CzwVvRyimIM1h2n9pLVYfTDmX9m+KHSgCpqPsY8F1NdEK8IaWqXhSBXsdjOBFZSpEcxNEeg4p0UO9cQ8EnOCLA==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^5.0.0", - "deprecation": "^2.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "once": "^1.4.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/request-error": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.2.tgz", - "integrity": "sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw==", - "dev": true, - "requires": { - "@octokit/types": "^5.0.1", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - } - } - }, - "@octokit/request-error": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", - "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", - "dev": true, - "requires": { - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } - } - }, - "@octokit/rest": { - "version": "16.43.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz", - "integrity": "sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/plugin-paginate-rest": "^1.1.1", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "2.4.0", - "@octokit/request": "^5.2.0", - "@octokit/request-error": "^1.0.2", - "atob-lite": "^2.0.0", - "before-after-hook": "^2.0.0", - "btoa-lite": "^1.0.0", - "deprecation": "^2.0.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "octokit-pagination-methods": "^1.1.0", - "once": "^1.4.0", - "universal-user-agent": "^4.0.0" - } - }, - "@octokit/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", - "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", - "dev": true - }, - "@types/bignumber.js": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-4.0.3.tgz", - "integrity": "sha512-KoJPKjhlWBry4fk8qcIufXFOU+zcZBfkHQWKbnAMQTMoe2GDeLpjSQHS+22gv+dg7gKdTP2WCjSeCVnfj8e+Gw==", - "dev": true - }, - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", - "dev": true - }, - "@types/node": { - "version": "12.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.1.tgz", - "integrity": "sha512-/xaVmBBjOGh55WCqumLAHXU9VhjGtmyTGqJzFBXRWZzByOXI5JAJNx9xPVGEsNizrNwcec92fQMj458MWfjN1A==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", - "integrity": "sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/tapable": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", - "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", - "dev": true - }, - "@types/uglify-js": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.2.tgz", - "integrity": "sha512-d6dIfpPbF+8B7WiCi2ELY7m0w1joD8cRW4ms88Emdb2w062NeEpbNCeWwVCgzLRpVG+5e74VFSg4rgJ2xXjEiQ==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@types/underscore": { - "version": "1.10.24", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.24.tgz", - "integrity": "sha512-T3NQD8hXNW2sRsSbLNjF/aBo18MyJlbw0lSpQHB/eZZtScPdexN4HSa8cByYwTw9Wy7KuOFr81mlDQcQQaZ79w==", - "dev": true - }, - "@types/webpack": { - "version": "4.41.18", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.18.tgz", - "integrity": "sha512-mQm2R8vV2BZE/qIDVYqmBVLfX73a8muwjs74SpjEyJWJxeXBbsI9L65Pcia9XfYLYWzD1c1V8m+L0p30y2N7MA==", - "dev": true, - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@types/webpack-sources": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.0.tgz", - "integrity": "sha512-c88dKrpSle9BtTqR6ifdaxu1Lvjsl3C5OsfvuUbUwdXymshv1TkufUAXBajCCUM/f/TmnkZC/Esb03MinzSiXQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@zkochan/cmd-shim": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", - "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", - "dev": true, - "requires": { - "is-windows": "^1.0.0", - "mkdirp-promise": "^5.0.1", - "mz": "^2.5.0" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", - "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", - "dev": true - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.0.tgz", - "integrity": "sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==", - "dev": true - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", - "dev": true, - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } - } - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "dev": true, - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base-x": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", - "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true - }, - "before-after-hook": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", - "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", - "dev": true - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "blakejs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", - "dev": true - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "brotli-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-0.1.0.tgz", - "integrity": "sha512-5ny7BNvpe2TSmdafF1T9dnFYp3AIrJ8qJt29K0DQJzORlK38LBim/CmlY26JtreV6SWmXza7Oa+9m61SzvxR0Q==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "iltorb": "^2.4.3" - } - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "requires": { - "resolve": "^1.17.0" - }, - "dependencies": { - "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", - "dev": true, - "requires": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" - } - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz", - "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "bufferutil": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", - "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", - "dev": true, - "requires": { - "node-gyp-build": "~3.7.0" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "bundlesize": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/bundlesize/-/bundlesize-0.18.0.tgz", - "integrity": "sha512-GZURr25umfYxZYZUyOlOtJRbYjAn0VfbjbnS0NBcOiF8VcjmhoEhmx8Gw4va8HeQb8j7Ra0ZltY/IeHgSHFXFw==", - "dev": true, - "requires": { - "axios": "^0.19.0", - "brotli-size": "0.1.0", - "bytes": "^3.1.0", - "ci-env": "^1.4.0", - "commander": "^2.20.0", - "cosmiconfig": "^5.2.1", - "github-build": "^1.2.0", - "glob": "^7.1.4", - "gzip-size": "^4.0.0", - "prettycli": "^1.4.3" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "dev": true - }, - "byte-size": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", - "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001150", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001150.tgz", - "integrity": "sha512-kiNKvihW0m36UhAFnl7bOAv0i1K1f6wpfVtTF5O5O82XzgtBnb05V0XeV3oZ968vfg2sRNChsHw8ASH2hDfoYQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - }, - "dependencies": { - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-env": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/ci-env/-/ci-env-1.12.0.tgz", - "integrity": "sha512-4dS9YjX4kpaFmkJWZPuDPK3WlPKdMjx/3JH39vyHj+G4/ED2DCgHQLbh9tKBQjwAwR/sGHOqIVMTlMUZcfJPWw==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "dev": true, - "requires": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", - "dev": true, - "requires": { - "@types/webpack": "^4.4.31", - "del": "^4.1.1" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - } - } - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dev": true, - "requires": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "conventional-changelog-angular": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz", - "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", - "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", - "dev": true, - "requires": { - "conventional-changelog-writer": "^4.0.6", - "conventional-commits-parser": "^3.0.3", - "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^2.0.3", - "lodash": "^4.2.1", - "normalize-package-data": "^2.3.5", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } - } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz", - "integrity": "sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.6", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^7.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } - } - }, - "conventional-commits-filter": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz", - "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", - "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", - "trim-off-newlines": "^1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - } - } - }, - "conventional-recommended-bump": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", - "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.1.1", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.3", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^2.0.3", - "meow": "^4.0.0", - "q": "^1.5.1" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true - }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "dev": true, - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, - "decache": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.0.tgz", - "integrity": "sha512-PppOuLiz+DFeaUvFXEYZjLxAkKiMYH/do/b/MxpDe/8AgKBi5GhZxridoVIbBq72GDbL36e4p0Ce2jTGUwwU+w==", - "dev": true, - "requires": { - "callsite": "^1.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "dependency-check": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dependency-check/-/dependency-check-4.1.0.tgz", - "integrity": "sha512-nlw+PvhVQwg0gSNNlVUiuRv0765gah9pZEXdQlIFzeSnD85Eex0uM0bkrAWrHdeTzuMGZnR9daxkup/AqqgqzA==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "detective": "^5.0.2", - "globby": "^10.0.1", - "is-relative": "^1.0.0", - "micromatch": "^4.0.2", - "minimist": "^1.2.0", - "pkg-up": "^3.1.0", - "read-package-json": "^2.0.10", - "resolve": "^1.1.7" - }, - "dependencies": { - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fast-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz", - "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", - "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", - "dev": true - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true - } - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.583", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.583.tgz", - "integrity": "sha512-L9BwLwJohjZW9mQESI79HRzhicPk1DFgM+8hOCfGgGCFEcA3Otpv7QK6SGtYoZvfQfE3wKLh0Hd5ptqUFv3gvQ==", - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", - "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "0.3.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz", - "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true - }, - "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", - "dev": true, - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethereum-bloom-filters": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", - "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", - "dev": true, - "requires": { - "js-sha3": "^0.8.0" - }, - "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - } - } - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereumjs-common": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.3.2.tgz", - "integrity": "sha512-GkltYRIqBLzaZLmF/K3E+g9lZ4O4FL+TtpisAlD3N+UVlR+mrtoG+TvxavqVa6PwOY4nKIEMe5pl6MrTio3Lww==", - "dev": true - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "dev": true, - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", - "dev": true - } - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "ethers": { - "version": "5.0.18", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.18.tgz", - "integrity": "sha512-WCiKGfAt09hBS1HZspu+JTgeunFcUCVRhCXO8X+VadBJGTRlG722XXib79Vz2oyBperz90CcjkBPdNly61Ah4A==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.0.7", - "@ethersproject/abstract-provider": "5.0.5", - "@ethersproject/abstract-signer": "5.0.7", - "@ethersproject/address": "5.0.5", - "@ethersproject/base64": "5.0.4", - "@ethersproject/basex": "5.0.4", - "@ethersproject/bignumber": "5.0.8", - "@ethersproject/bytes": "5.0.5", - "@ethersproject/constants": "5.0.5", - "@ethersproject/contracts": "5.0.5", - "@ethersproject/hash": "5.0.6", - "@ethersproject/hdnode": "5.0.5", - "@ethersproject/json-wallets": "5.0.7", - "@ethersproject/keccak256": "5.0.4", - "@ethersproject/logger": "5.0.6", - "@ethersproject/networks": "5.0.4", - "@ethersproject/pbkdf2": "5.0.4", - "@ethersproject/properties": "5.0.4", - "@ethersproject/providers": "5.0.13", - "@ethersproject/random": "5.0.4", - "@ethersproject/rlp": "5.0.4", - "@ethersproject/sha2": "5.0.4", - "@ethersproject/signing-key": "5.0.5", - "@ethersproject/solidity": "5.0.5", - "@ethersproject/strings": "5.0.5", - "@ethersproject/transactions": "5.0.6", - "@ethersproject/units": "5.0.6", - "@ethersproject/wallet": "5.0.6", - "@ethersproject/web": "5.0.9", - "@ethersproject/wordlists": "5.0.5" - }, - "dependencies": { - "@ethersproject/address": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.0.5.tgz", - "integrity": "sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/rlp": "^5.0.3", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.0.8.tgz", - "integrity": "sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "bn.js": "^4.4.0" - } - }, - "@ethersproject/bytes": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.0.5.tgz", - "integrity": "sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/constants": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.0.5.tgz", - "integrity": "sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA==", - "dev": true, - "requires": { - "@ethersproject/bignumber": "^5.0.7" - } - }, - "@ethersproject/hash": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.0.6.tgz", - "integrity": "sha512-Gvh57v6BWhwnud6l7tMfQm32PRQ2DYx2WaAAQmAxAfYvmzUkpQCBstnGeNMXIL8/2wdkvcB2u+WZRWaZtsFuUQ==", - "dev": true, - "requires": { - "@ethersproject/abstract-signer": "^5.0.6", - "@ethersproject/address": "^5.0.5", - "@ethersproject/bignumber": "^5.0.8", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.4", - "@ethersproject/strings": "^5.0.4" - } - }, - "@ethersproject/keccak256": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.0.4.tgz", - "integrity": "sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "js-sha3": "0.5.7" - } - }, - "@ethersproject/logger": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.0.6.tgz", - "integrity": "sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ==", - "dev": true - }, - "@ethersproject/properties": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.0.4.tgz", - "integrity": "sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A==", - "dev": true, - "requires": { - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.0.4.tgz", - "integrity": "sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5" - } - }, - "@ethersproject/signing-key": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.0.5.tgz", - "integrity": "sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g==", - "dev": true, - "requires": { - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "elliptic": "6.5.3" - } - }, - "@ethersproject/transactions": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.0.6.tgz", - "integrity": "sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.0.4", - "@ethersproject/bignumber": "^5.0.7", - "@ethersproject/bytes": "^5.0.4", - "@ethersproject/constants": "^5.0.4", - "@ethersproject/keccak256": "^5.0.3", - "@ethersproject/logger": "^5.0.5", - "@ethersproject/properties": "^5.0.3", - "@ethersproject/rlp": "^5.0.3", - "@ethersproject/signing-key": "^5.0.4" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true - } - } - }, - "ethjs-signer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ethjs-signer/-/ethjs-signer-0.1.1.tgz", - "integrity": "sha1-Cvd5YeKe5FhgOqvTZguIaNM4ZEE=", - "dev": true, - "requires": { - "elliptic": "6.3.2", - "js-sha3": "0.5.5", - "number-to-bn": "1.1.0", - "rlp": "2.0.0", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "elliptic": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.2.tgz", - "integrity": "sha1-5MgeCCnPCmWrcOmYuCMnI7XBvEg=", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "number-to-bn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.1.0.tgz", - "integrity": "sha1-UaM4fFvGgDWrQFjGJhMvdn2dCL8=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "rlp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", - "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=", - "dev": true - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "dev": true - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, - "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", - "dev": true, - "requires": { - "reusify": "^1.0.0" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "ganache-cli": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.12.0.tgz", - "integrity": "sha512-WV354mOSCbVH+qR609ftpz/1zsZPRsHMaQ4jo9ioBQAkguYNVU5arfgIE0+0daU0Vl9WJ/OMhRyl0XRswd/j9A==", - "dev": true, - "requires": { - "ethereumjs-util": "6.2.1", - "source-map-support": "0.5.12", - "yargs": "13.2.4" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "bundled": true, - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "14.11.2", - "bundled": true, - "dev": true - }, - "@types/pbkdf2": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "base-x": { - "version": "3.0.8", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "blakejs": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "bn.js": { - "version": "4.11.9", - "bundled": true, - "dev": true - }, - "brorand": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "bs58": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer-from": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "bundled": true, - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cliui": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "color-convert": { - "version": "1.9.3", - "bundled": true, - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "create-hash": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "elliptic": { - "version": "6.5.3", - "bundled": true, - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "bundled": true, - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "ethereum-cryptography": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "bundled": true, - "dev": true, - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "ethjs-util": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "hash-base": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "hash.js": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-hex-prefixed": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "keccak": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "lcid": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "node-addon-api": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "node-gyp-build": { - "version": "4.2.3", - "bundled": true, - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "pbkdf2": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "randombytes": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "ripemd160": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.6", - "bundled": true, - "dev": true, - "requires": { - "bn.js": "^4.11.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "bundled": true, - "dev": true - }, - "scrypt-js": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "secp256k1": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "source-map-support": { - "version": "0.5.12", - "bundled": true, - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "string-width": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "13.2.4", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "dev": true, - "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "git-semver-tags": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", - "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", - "dev": true, - "requires": { - "meow": "^4.0.0", - "semver": "^6.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "git-up": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", - "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.0.tgz", - "integrity": "sha512-KlIa5jvMYLjXMQXkqpFzobsyD/V2K5DRHl5OAf+6oDFPlPLxrGDVQlIdI63c4/Kt6kai4kALENSALlzTGST3GQ==", - "dev": true, - "requires": { - "git-up": "^4.0.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "github-build": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/github-build/-/github-build-1.2.1.tgz", - "integrity": "sha512-VAT4NFU8hm9Ks5yNKuuczD2zMbmouAKHtxtwvmCj34Q2DpZsjgp3LLjtrKlm/YvGSzSNGmj22ccJQQei+f/vIw==", - "dev": true, - "requires": { - "axios": "0.19.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - }, - "dependencies": { - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "gzip-size": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", - "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dev": true, - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "iltorb": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-2.4.4.tgz", - "integrity": "sha512-7Qk6O7TK3rSWVRVRkPehcNTSN+P2i7MsG9pWmw6iVw/W6NcoNj0rFKOuBDM6fbZV6NNGuUW3JBRem6Ozn4KXhg==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "nan": "^2.14.0", - "npmlog": "^4.1.2", - "prebuild-install": "^5.3.2", - "which-pm-runs": "^1.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "init-package-json": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - } - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - } - } - }, - "insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, - "is-ssh": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.2.tgz", - "integrity": "sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ==", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=", - "dev": true - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "jshint": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.12.0.tgz", - "integrity": "sha512-TwuuaUDmra0JMkuqvqy+WGo2xGHSNjv1BA1nTIgtH2K5z1jHuAEeAgp7laaR+hLRmajRjcrM71+vByBDanCyYA==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.19", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "karma": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", - "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", - "dev": true, - "requires": { - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.4.2", - "colors": "^1.4.0", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.19", - "log4js": "^6.2.1", - "mime": "^2.4.5", - "minimatch": "^3.0.4", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^2.3.0", - "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.22", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "karma-browserify": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-7.0.0.tgz", - "integrity": "sha512-SLgh1dmF2eZEj3glrmTD2CMJRGZwEiKA6k2hBr2+2JDC4JMU1dlsvBKpV66Lvi/tbj3H9qA+Vl/FdIcfPRrJpA==", - "dev": true, - "requires": { - "convert-source-map": "^1.1.3", - "hat": "^0.0.3", - "js-string-escape": "^1.0.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.0", - "os-shim": "^0.1.3" - } - }, - "karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", - "dev": true, - "requires": { - "which": "^1.2.1" - } - }, - "karma-firefox-launcher": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.3.0.tgz", - "integrity": "sha512-Fi7xPhwrRgr+94BnHX0F5dCl1miIW4RHnzjIGxF8GaIEp7rNqX7LSi7ok63VXs3PS/5MQaQMhGxw+bvD+pibBQ==", - "dev": true, - "requires": { - "is-wsl": "^2.1.0" - } - }, - "karma-mocha": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", - "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", - "dev": true, - "requires": { - "minimist": "^1.2.3" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "karma-spec-reporter": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", - "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", - "dev": true, - "requires": { - "colors": "^1.1.2" - } - }, - "keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "dependencies": { - "node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", - "dev": true - } - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lerna": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz", - "integrity": "sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg==", - "dev": true, - "requires": { - "@lerna/add": "3.21.0", - "@lerna/bootstrap": "3.21.0", - "@lerna/changed": "3.21.0", - "@lerna/clean": "3.21.0", - "@lerna/cli": "3.18.5", - "@lerna/create": "3.22.0", - "@lerna/diff": "3.21.0", - "@lerna/exec": "3.21.0", - "@lerna/import": "3.22.0", - "@lerna/info": "3.21.0", - "@lerna/init": "3.21.0", - "@lerna/link": "3.21.0", - "@lerna/list": "3.21.0", - "@lerna/publish": "3.22.1", - "@lerna/run": "3.21.0", - "@lerna/version": "3.22.1", - "import-local": "^2.0.0", - "npmlog": "^4.1.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", - "dev": true, - "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - }, - "dependencies": { - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, - "requires": { - "mkdirp": "*" - } - }, - "mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "mock-fs": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", - "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==", - "dev": true - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "dev": true, - "requires": { - "varint": "^5.0.0" - } - }, - "multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "dev": true, - "requires": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - } - } - }, - "multimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", - "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", - "dev": true, - "requires": { - "array-differ": "^2.0.3", - "array-union": "^1.0.2", - "arrify": "^1.0.1", - "minimatch": "^3.0.4" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "napi-build-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", - "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-abi": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.13.0.tgz", - "integrity": "sha512-9HrZGFVTR5SOu3PZAnAY2hLO36aW1wmA+FDsVkr85BTST32TLCA1H/AEcatVRAsWLyXS3bqUDYCAjq5/QGuSTA==", - "dev": true, - "requires": { - "semver": "^5.4.1" - } - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true - }, - "node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", - "dev": true, - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true - }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-gyp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", - "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-gyp-build": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", - "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-releases": { - "version": "1.1.64", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.64.tgz", - "integrity": "sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg==", - "dev": true - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "dev": true - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-lifecycle": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", - "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", - "dev": true, - "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "octokit-pagination-methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", - "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-map-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", - "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", - "dev": true - }, - "p-queue": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-4.0.0.tgz", - "integrity": "sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg==", - "dev": true, - "requires": { - "eventemitter3": "^3.1.0" - }, - "dependencies": { - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - } - } - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "p-waterfall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-1.0.0.tgz", - "integrity": "sha1-ftlLPOszMngjU69qrhGqn8I1uwA=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, - "parse-headers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", - "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", - "dev": true, - "requires": { - "for-each": "^0.3.3", - "string.prototype.trim": "^1.1.2" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-path": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.2.tgz", - "integrity": "sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse-url": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.2.tgz", - "integrity": "sha512-Czj+GIit4cdWtxo3ISZCvLiUjErSo0iI3wJ+q9Oi3QuMYTI6OZu+7cewMWZ+C1YAnKhYTk6/TLuhIgCypLthPA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - }, - "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - } - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "mimic-response": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", - "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } - } - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "prettycli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prettycli/-/prettycli-1.4.3.tgz", - "integrity": "sha512-KLiwAXXfSWXZqGmZlnKPuGMTFp+0QbcySplL1ft9gfteT/BNsG64Xo8u2Qr9r+qnsIZWBQ66Zs8tg+8s2fmzvw==", - "dev": true, - "requires": { - "chalk": "2.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", - "dev": true, - "requires": { - "read": "1" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", - "dev": true - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", - "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "read-package-json": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.0.tgz", - "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", - "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", - "dev": true, - "requires": { - "bn.js": "^4.11.1" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sandboxed-module": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.4.tgz", - "integrity": "sha512-AwEPOdO8mg/wJjr876yCHP2DHqVN0MaggEXhp6IIf3bcI5cYoQl9QrrCHSrvToHjvdEiS5x4TVZRgjD2bEmNTA==", - "dev": true, - "requires": { - "require-like": "0.1.2", - "stack-trace": "0.0.9" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - } - } - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "dev": true, - "requires": { - "elliptic": "^6.5.2", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "dependencies": { - "node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", - "dev": true - } - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dev": true, - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "requires": { - "fast-safe-stringify": "^2.0.7" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "dev": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socket.io": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", - "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", - "dev": true, - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.4.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.3.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz", - "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "dev": true, - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - } - } - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spawn-wrap": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", - "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - } - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string.prototype.trim": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", - "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", - "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "string.prototype.trimstart": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", - "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - } - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - } - } - }, - "swarm-js": { - "version": "0.1.40", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz", - "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - } - } - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "tar-fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", - "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - }, - "dependencies": { - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "tar-stream": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", - "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - } - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", - "dev": true - }, - "temp-write": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", - "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "is-stream": "^1.1.0", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "dev": true - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", - "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", - "dev": true - }, - "uglify-js": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.3.tgz", - "integrity": "sha512-wDRziHG94mNj2n3R864CvYw/+pc9y/RNImiTyrrf8BzgWn75JgFSwYvXrtZQMnMnOp/4UTrf3iCSQxSStPiByA==", - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "umask": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", - "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", - "dev": true - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universal-user-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", - "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=", - "dev": true - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "utf-8-validate": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", - "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", - "dev": true, - "requires": { - "node-gyp-build": "~3.7.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "varint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "wait-port": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.9.tgz", - "integrity": "sha512-hQ/cVKsNqGZ/UbZB/oakOGFqic00YAMM5/PEj3Bt4vKarv2jWIWzDbqlwT94qMs/exAQAsvMOq99sZblV92zxQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "commander": "^3.0.2", - "debug": "^4.1.1" - }, - "dependencies": { - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - } - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "web3": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.11.tgz", - "integrity": "sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==", - "dev": true, - "requires": { - "web3-bzz": "1.2.11", - "web3-core": "1.2.11", - "web3-eth": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-shh": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-bzz": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.11.tgz", - "integrity": "sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - } - }, - "web3-core": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.11.tgz", - "integrity": "sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-requestmanager": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-core-helpers": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz", - "integrity": "sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-core-method": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.11.tgz", - "integrity": "sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==", - "dev": true, - "requires": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-core-promievent": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz", - "integrity": "sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4" - } - }, - "web3-core-requestmanager": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz", - "integrity": "sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "web3-providers-http": "1.2.11", - "web3-providers-ipc": "1.2.11", - "web3-providers-ws": "1.2.11" - } - }, - "web3-core-subscriptions": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz", - "integrity": "sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - } - }, - "web3-eth": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.11.tgz", - "integrity": "sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==", - "dev": true, - "requires": { - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-accounts": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-eth-ens": "1.2.11", - "web3-eth-iban": "1.2.11", - "web3-eth-personal": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-abi": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz", - "integrity": "sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.0.0-beta.153", - "underscore": "1.9.1", - "web3-utils": "1.2.11" - }, - "dependencies": { - "@ethersproject/abi": { - "version": "5.0.0-beta.153", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz", - "integrity": "sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==", - "dev": true, - "requires": { - "@ethersproject/address": ">=5.0.0-beta.128", - "@ethersproject/bignumber": ">=5.0.0-beta.130", - "@ethersproject/bytes": ">=5.0.0-beta.129", - "@ethersproject/constants": ">=5.0.0-beta.128", - "@ethersproject/hash": ">=5.0.0-beta.128", - "@ethersproject/keccak256": ">=5.0.0-beta.127", - "@ethersproject/logger": ">=5.0.0-beta.129", - "@ethersproject/properties": ">=5.0.0-beta.131", - "@ethersproject/strings": ">=5.0.0-beta.130" - } - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-accounts": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz", - "integrity": "sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==", - "dev": true, - "requires": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-contract": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz", - "integrity": "sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==", - "dev": true, - "requires": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-ens": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz", - "integrity": "sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==", - "dev": true, - "requires": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-promievent": "1.2.11", - "web3-eth-abi": "1.2.11", - "web3-eth-contract": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-iban": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz", - "integrity": "sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-eth-personal": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz", - "integrity": "sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==", - "dev": true, - "requires": { - "@types/node": "^12.12.6", - "web3-core": "1.2.11", - "web3-core-helpers": "1.2.11", - "web3-core-method": "1.2.11", - "web3-net": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-net": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.11.tgz", - "integrity": "sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==", - "dev": true, - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-utils": "1.2.11" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "web3-utils": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.11.tgz", - "integrity": "sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } - }, - "web3-providers-http": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.11.tgz", - "integrity": "sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.2.11", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz", - "integrity": "sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==", - "dev": true, - "requires": { - "oboe": "2.1.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11" - }, - "dependencies": { - "oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - } - } - }, - "web3-providers-ws": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz", - "integrity": "sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==", - "dev": true, - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.2.11", - "websocket": "^1.0.31" - } - }, - "web3-shh": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.11.tgz", - "integrity": "sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==", - "dev": true, - "requires": { - "web3-core": "1.2.11", - "web3-core-method": "1.2.11", - "web3-core-subscriptions": "1.2.11", - "web3-net": "1.2.11" - } - }, - "web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "enhanced-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz", - "integrity": "sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", - "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==", - "dev": true, - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - } - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", - "dev": true, - "requires": { - "execa": "^1.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - } - }, - "write-pkg": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", - "dev": true, - "requires": { - "sort-keys": "^2.0.0", - "write-json-file": "^2.2.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - } - } - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "dev": true, - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", - "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "dev": true, - "requires": { - "xhr-request": "^1.0.1" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "dev": true, - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index c36ec2338b5..1a3d5b6a5d5 100644 --- a/package.json +++ b/package.json @@ -1,142 +1,147 @@ { - "name": "web3.js", - "private": true, - "description": "Ethereum JavaScript API wrapper repository", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "main": "./packages/web3/src/index.js", - "bundlesize": [ - { - "path": "./packages/web3/dist/web3.min.js", - "maxSize": "1.5 mB", - "compression": "none" - } - ], - "scripts": { - "version": "npm run build", - "postinstall": "npm run bootstrap", - "build": "npm run bootstrap && lerna run tsc && webpack && cp -r ./dist ./packages/web3", - "publish": "lerna publish", - "bootstrap": "lerna bootstrap --hoist", - "lint": "jshint *.js packages", - "test": "mocha -R spec --require ts-node/register --grep E2E --invert", - "test:unit": "nyc --no-clean --silent _mocha -- -R spec --require ts-node/register --grep E2E --invert --exit", - "test:cov": "npm run cov:clean; npm run test:unit; npm run test:e2e:clients; npm run cov:merge_reports", - "dtslint": "lerna run dtslint", - "depcheck": "lerna exec dependency-check -- --missing --verbose .", - "bundlesize": "bundlesize || true", - "geth": "geth-dev-assistant --accounts 5 --tag stable --gasLimit 7000000", - "test:e2e:ganache": "./scripts/e2e.ganache.sh", - "test:e2e:geth:auto": "./scripts/e2e.geth.automine.sh", - "test:e2e:geth:insta": "./scripts/e2e.geth.instamine.sh", - "test:e2e:clients": "npm run test:e2e:ganache; npm run test:e2e:geth:insta; npm run test:e2e:geth:auto", - "test:e2e:chrome": "./scripts/e2e.chrome.sh", - "test:e2e:firefox": "./scripts/e2e.firefox.sh", - "test:e2e:min": "./scripts/e2e.min.sh", - "test:e2e:cdn": "./scripts/e2e.cdn.sh", - "test:e2e:browsers": "npm run build; npm run test:e2e:chrome; npm run test:e2e:firefox", - "test:e2e:publish": "./scripts/e2e.npm.publish.sh", - "test:e2e:truffle": "./scripts/e2e.truffle.sh", - "test:e2e:mosaic": "./scripts/e2e.mosaic.sh", - "test:e2e:ganache:core": "./scripts/e2e.ganache.core.sh", - "test:e2e:gnosis:dex": "./scripts/e2e.gnosis.dex.sh", - "ci": "./scripts/ci.sh", - "cov:clean": "rm -rf .nyc_output; rm -rf coverage", - "cov:merge_reports": "nyc report --reporter=lcov --reporter=html" - }, - "repository": { - "type": "git", - "url": "https://github.com/ethereum/web3.js.git" - }, - "homepage": "https://github.com/ethereum/web3.js", - "bugs": { - "url": "https://github.com/ethereum/web3.js/issues" - }, - "keywords": [ - "Ethereum", - "JavaScript", - "API" - ], - "author": "ethereum.org", - "authors": [ - { - "name": "Fabian Vogelsteller", - "email": "fabian@ethereum.org", - "homepage": "https://github.com/frozeman" - }, - { - "name": "Marek Kotewicz", - "email": "marek@parity.io", - "url": "https://github.com/debris" - }, - { - "name": "Marian Oancea", - "url": "https://github.com/cubedro" - }, - { - "name": "Gav Wood", - "email": "g@parity.io", - "homepage": "http://gavwood.com" - }, - { - "name": "Jeffery Wilcke", - "email": "jeffrey.wilcke@ethereum.org", - "url": "https://github.com/obscuren" - } - ], - "devDependencies": { - "@babel/cli": "^7.12.1", - "@babel/core": "^7.12.3", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-runtime": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-typescript": "^7.12.1", - "@babel/runtime": "^7.12.1", - "@chainsafe/geth-dev-assistant": "^0.1.5", - "@ensdomains/ens": "^0.4.5", - "@ensdomains/resolver": "^0.2.4", - "@types/bignumber.js": "^4.0.2", - "@types/bn.js": "^4.11.6", - "@types/node": "^12.12.68", - "@types/underscore": "^1.10.24", - "babel-loader": "^8.1.0", - "bignumber.js": "^9.0.1", - "bn.js": "^4.11.9", - "browserify": "^16.5.2", - "buffer": "^4.9.2", - "bundlesize": "^0.18.0", - "chai": "^4.2.0", - "clean-webpack-plugin": "^3.0.0", - "core-js": "^3.6.5", - "crypto-js": "^3.3.0", - "decache": "^4.6.0", - "dependency-check": "^4.1.0", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.2", - "ethers": "^5.0.18", - "ethjs-signer": "^0.1.1", - "ganache-cli": "^6.12.0", - "jshint": "^2.12.0", - "karma": "^5.2.3", - "karma-browserify": "^7.0.0", - "karma-chrome-launcher": "^3.1.0", - "karma-firefox-launcher": "^1.3.0", - "karma-mocha": "^2.0.1", - "karma-spec-reporter": "0.0.32", - "lerna": "^3.22.1", - "mocha": "^6.2.3", - "nyc": "^14.1.1", - "pify": "^4.0.1", - "sandboxed-module": "^2.0.4", - "ts-node": "^8.10.2", - "typescript": "^3.9.7", - "underscore": "1.9.1", - "wait-port": "^0.2.9", - "webpack": "^4.44.2", - "webpack-cli": "^3.3.12" - }, - "dependencies": {} + "name": "web3.js", + "private": true, + "description": "Ethereum API wrappers and utilities", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "keywords": [ + "ethereum", + "eth", + "web3", + "web3js", + "web3.js", + "blockchain" + ], + "homepage": "https://github.com/ChainSafe/web3.js#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/ChainSafe/web3.js.git" + }, + "bugs": { + "url": "https://github.com/ChainSafe/web3.js/issues" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "workspaces": { + "packages": [ + "packages/*", + "tools/*" + ] + }, + "scripts": { + "version": "yarn run bootstrap && yarn build", + "bootstrap": "lerna bootstrap", + "prebuild": "yarn clean && ts-node scripts/init.ts", + "build": "lerna run build --stream", + "build:types": "lerna run build:types --stream", + "build:cjs": "lerna run build:cjs --stream", + "build:esm": "lerna run build:esm --stream", + "build:web": "lerna run build:web --stream", + "build:web:analyze": "lerna run build:web:analyze --stream", + "generate:docs": "node ./scripts/docshelper/generatedoc.js", + "build:docs": "yarn generate:docs && cd docs && yarn install && yarn build", + "changelog": "ts-node -P scripts/changelog/tsconfig.json scripts/changelog/src/index.ts", + "clean": "lerna run clean --stream --parallel", + "geth:start": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth.sh start", + "geth:start:background": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth.sh start 1", + "geth:stop": "./scripts/geth.sh stop", + "geth-binary:start": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh start", + "geth-binary:start:background": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh start 1", + "geth-binary:stop": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh stop", + "hardhat:start": "WEB3_SYSTEM_TEST_BACKEND=hardhat && ./scripts/hardhat.sh start", + "hardhat:stop": "./scripts/hardhat.sh stop", + "geth-manual:start:background": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh manualStart 1", + "geth-manual:stop": "WEB3_SYSTEM_TEST_BACKEND=geth && ./scripts/geth_binary.sh stop", + "lint": "lerna run lint --stream --parallel", + "lint:fix": "lerna run lint:fix --stream --parallel", + "format": "lerna run format --stream --parallel && prettier --write ./scripts/**/*.ts", + "test": "lerna run test --stream --parallel", + "test:coverage:unit": "lerna run test:coverage:unit --stream --parallel", + "test:coverage:integration": "lerna run test:coverage:integration --stream --parallel", + "test:unit": "lerna run test:unit --stream --parallel && jest --config=./scripts/jest.config.js", + "test:integration": "lerna run test:integration --stream", + "test:benchmark": "lerna run test:benchmark", + "test:integration:stress": "lerna run test:integration:stress --stream", + "test:e2e:geth:http": "./scripts/test-runner.sh geth http", + "test:e2e:geth:ws": "./scripts/test-runner.sh geth ws", + "test:e2e:geth:ipc": "./scripts/test-runner.sh geth ipc", + "test:e2e:hardhat:http": "./scripts/test-runner.sh hardhat http", + "test:e2e:coverage": "./scripts/test-runner.sh coverage", + "test:e2e:mainnet:http": "./scripts/test-runner.sh mainnet http", + "test:e2e:mainnet:ws": "./scripts/test-runner.sh mainnet ws", + "test:e2e:sepolia:http": "./scripts/test-runner.sh sepolia http", + "test:e2e:sepolia:ws": "./scripts/test-runner.sh sepolia ws", + "test:stress:geth:ws": "./scripts/test-runner.sh geth-manual ws node manual", + "test:stress:geth:ipc": "./scripts/test-runner.sh geth-manual ipc node manual", + "test:stress:geth:http": "./scripts/test-runner.sh geth-manual http node manual", + "test:e2e:stress:geth:ws:chrome": "./scripts/test-runner.sh geth-manual ws chrome manual", + "generate:accounts": "node ./scripts/gen_accounts.js", + "pre-blackbox": "yarn config set registry http://localhost:4873 && git init && git config --global user.email \"ci@github.com\" && git config --global user.name \"CI\"", + "post-blackbox": "./scripts/verdaccio.sh stop", + "post-blackbox:geth": "yarn geth:stop && yarn post-blackbox", + "test:blackbox:geth:http": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:http --stream && yarn post-blackbox:geth", + "test:blackbox:geth:ws": "yarn pre-blackbox && yarn geth:start:background && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:geth:ws --stream && yarn post-blackbox:geth", + "test:e2e:geth:ws:electron": "./scripts/test-runner.sh hardhat ws electron", + "test:e2e:geth:ws:chrome": "./scripts/test-runner.sh hardhat ws chrome", + "test:e2e:geth:ws:firefox": "./scripts/test-runner.sh hardhat ws firefox", + "test:e2e:hardhat:ws:electron": "./scripts/test-runner.sh hardhat http electron", + "test:e2e:hardhat:ws:chrome": "./scripts/test-runner.sh hardhat http chrome", + "test:e2e:hardhat:ws:firefox": "./scripts/test-runner.sh hardhat http firefox", + "test:blackbox:infura:http": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:http --stream && yarn post-blackbox", + "test:blackbox:infura:ws": "yarn pre-blackbox && ./scripts/verdaccio.sh startBackgroundAndPublish && lerna run test:blackbox:infura:ws --stream && yarn post-blackbox", + "test:manual:long-connection-ws": "node packages/web3/test/stress/long_ws_tests/nodejs_test/long_connection_ws.js", + "test:stress": "yarn test:stress:geth:ws && yarn test:stress:geth:http && yarn test:stress:geth:ipc && yarn test:e2e:stress:geth:ws:chrome", + "husky:install": "husky install", + "husky:uninstall": "husky uninstall", + "postinstall": "yarn build", + "compile:contracts": "node ./scripts/compile_contracts.js && yarn format && yarn lint:fix", + "publish:canary": "lerna publish --canary --dist-tag dev --preid dev.$(git rev-parse --short HEAD) --exact --graph-type all --force-publish \"*\" --no-verify-access --yes" + }, + "devDependencies": { + "@cypress/webpack-preprocessor": "^5.12.0", + "@droppedcode/typedoc-plugin-relative-includes": "^1.0.2", + "@openzeppelin/contracts": "^4.7.1", + "@types/node": "^18.11.9", + "@types/webpack": "^5.28.0", + "assert": "^2.0.0", + "buffer": "^6.0.3", + "bufferutil": "^4.0.6", + "clean-webpack-plugin": "^4.0.0", + "concurrently": "^8.2.0", + "cypress-jest-adapter": "^0.1.1", + "declaration-bundler-webpack-plugin": "^1.0.3", + "eslint": "^8.20.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-require-extensions": "^0.1.3", + "http-browserify": "^1.7.0", + "https-browserify": "^1.0.0", + "husky": "^8.0.3", + "jest": "^29.7.0", + "lerna": "^6.6.2", + "npm-auth-to-token": "^1.0.0", + "prettier": "^2.7.1", + "prettier-plugin-solidity": "^1.0.0-beta.20", + "process": "^0.11.10", + "solc": "^0.8.15", + "ts-jest": "^29.1.1", + "ts-loader": "^9.3.1", + "ts-node": "^10.9.1", + "typedoc": "^0.25.6", + "typedoc-monorepo-link-types": "^0.0.4", + "typedoc-plugin-extras": "^2.2.5", + "typedoc-plugin-markdown": "^3.17.0", + "typedoc-plugin-mdn-links": "^2.0.0", + "typedoc-plugin-merge-modules": "^5.1.0", + "typescript": "^4.7.4", + "utf-8-validate": "^5.0.9", + "web3-hardhat-plugin": "^1.0.0", + "webpack": "^5.73.0", + "webpack-cli": "^4.10.0" + }, + "packageManager": "yarn@1.22.15", + "dependencies": { + "webpack-bundle-analyzer": "^4.7.0" + } } diff --git a/packages/web3-bzz/README.md b/packages/web3-bzz/README.md deleted file mode 100644 index 383dfddc7c3..00000000000 --- a/packages/web3-bzz/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# web3-bzz - -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] - -This is a sub-package of [web3.js][repo]. - -This is the swarm package. - -Please read the [documentation][docs] for more. - -## Installation - -### Node.js - -```bash -npm install web3-bzz -``` - -## Usage - -```js -const Web3Bzz = require('web3-bzz'); - -const bzz = new Web3Bzz('http://swarm-gateways.net'); -``` - -## Types - -All the TypeScript typings are placed in the `types` folder. - -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-bzz.svg -[npm-url]: https://npmjs.org/package/web3-bzz -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-bzz -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-bzz -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-bzz -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-bzz diff --git a/packages/web3-bzz/package-lock.json b/packages/web3-bzz/package-lock.json deleted file mode 100644 index 580dfdbee01..00000000000 --- a/packages/web3-bzz/package-lock.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "web3-bzz", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "12.12.68", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.68.tgz", - "integrity": "sha512-3RW2s24ewB7F9dAHvgb9FRvNHn6nO9IK6Eaknbz7HTOe2a5GVne5XbUh5+YA+kcCn67glyHhClUUdFP73LWrgQ==" - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-bzz/package.json b/packages/web3-bzz/package.json deleted file mode 100644 index e009353379a..00000000000 --- a/packages/web3-bzz/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "web3-bzz", - "version": "1.3.0", - "description": "Web3 module to interact with the Swarm network.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-bzz", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "@types/node": "^12.12.6", - "got": "9.6.0", - "swarm-js": "^0.1.40", - "underscore": "1.9.1" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } -} diff --git a/packages/web3-bzz/src/index.js b/packages/web3-bzz/src/index.js deleted file mode 100644 index 7f87381f838..00000000000 --- a/packages/web3-bzz/src/index.js +++ /dev/null @@ -1,88 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var _ = require('underscore'); -var swarm = require("swarm-js"); - - -var Bzz = function Bzz(provider) { - - this.givenProvider = Bzz.givenProvider; - - if (provider && provider._requestManager) { - provider = provider.currentProvider; - } - - // only allow file picker when in browser - if(typeof document !== 'undefined') { - this.pick = swarm.pick; - } - - this.setProvider(provider); -}; - -// set default ethereum provider -/* jshint ignore:start */ -Bzz.givenProvider = null; -if (typeof ethereum !== 'undefined' && ethereum.bzz) { - Bzz.givenProvider = ethereum.bzz; -} -/* jshint ignore:end */ - -Bzz.prototype.setProvider = function(provider) { - // is ethereum provider - if(_.isObject(provider) && _.isString(provider.bzz)) { - provider = provider.bzz; - // is no string, set default - } - // else if(!_.isString(provider)) { - // provider = 'http://swarm-gateways.net'; // default to gateway - // } - - - if(_.isString(provider)) { - this.currentProvider = provider; - } else { - this.currentProvider = null; - - var noProviderError = new Error('No provider set, please set one using bzz.setProvider().'); - - this.download = this.upload = this.isAvailable = function(){ - throw noProviderError; - }; - - return false; - } - - // add functions - this.download = swarm.at(provider).download; - this.upload = swarm.at(provider).upload; - this.isAvailable = swarm.at(provider).isAvailable; - - return true; -}; - - -module.exports = Bzz; - diff --git a/packages/web3-bzz/tsconfig.json b/packages/web3-bzz/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-bzz/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-bzz/types/index.d.ts b/packages/web3-bzz/types/index.d.ts deleted file mode 100644 index 340ee13b780..00000000000 --- a/packages/web3-bzz/types/index.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -export class Bzz { - constructor(); - constructor(provider: any); - - readonly givenProvider: any; - static readonly givenProvider: any; - readonly currentProvider: any; - setProvider(provider: any): boolean; - - upload(data: any): Promise; - - download(bzzHash: string, localPath?: string): Promise; - - pick: Pick; -} - -export interface Pick { - file: () => Promise; - directory: () => Promise; - data: () => Promise; -} diff --git a/packages/web3-bzz/types/tests/bzz-test.ts b/packages/web3-bzz/types/tests/bzz-test.ts deleted file mode 100644 index 286486e82ba..00000000000 --- a/packages/web3-bzz/types/tests/bzz-test.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file bzz-tests.ts - * @author Josh Stevens - * @date 2018 - */ - -import { Bzz } from 'web3-bzz'; - -// $ExpectType Bzz -const bzz_empty = new Bzz(); - -// $ExpectType Bzz -const bzz = new Bzz('http://swarm-gateways.net'); - -// $ExpectType any -Bzz.givenProvider; - -// $ExpectType boolean -bzz.setProvider('test.com'); - -// $ExpectType any -bzz.currentProvider; - -// $ExpectType any -bzz.givenProvider; - -// $ExpectType boolean -bzz.setProvider('https://localhost:2100'); - -// $ExpectType Promise -bzz.upload('test file'); - -const dir = { - '/foo.txt': { type: 'text/plain', data: 'sample file' }, - '/bar.txt': { type: 'text/plain', data: 'another file' } -}; - -// $ExpectType Promise -bzz.upload(dir); -// $ExpectType Promise -bzz.upload({ - path: '/path/to/thing', - kind: 'directory', - defaultFile: '/index.html' -}); - -// ExpectType Promise; -bzz.download('hash'); - -// ExpectType Promise; -bzz.download('hash', 'path'); - -// $ExpectType Promise -bzz.pick.file(); - -// $ExpectType Promise -bzz.pick.directory(); - -// $ExpectType Promise -bzz.pick.data(); diff --git a/packages/web3-bzz/types/tsconfig.json b/packages/web3-bzz/types/tsconfig.json deleted file mode 100644 index bf0cfa6d681..00000000000 --- a/packages/web3-bzz/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-bzz": ["."] - } - } -} diff --git a/packages/web3-bzz/types/tslint.json b/packages/web3-bzz/types/tslint.json deleted file mode 100644 index 2a4469808b0..00000000000 --- a/packages/web3-bzz/types/tslint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false, - "no-redundant-jsdoc": false - } -} diff --git a/packages/web3-core-helpers/README.md b/packages/web3-core-helpers/README.md deleted file mode 100644 index 777ba872783..00000000000 --- a/packages/web3-core-helpers/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# web3-core-helpers - -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] - -This is a sub-package of [web3.js][repo] with useful helper functions. - -Please read the [documentation][docs] for more. - -## Installation - -### Node.js - -```bash -npm install web3-core-helpers -``` - -## Usage - -```js -const helpers = require('web3-core-helpers'); - -helpers.formatters; -helpers.errors; -... -``` - -## Types - -All the TypeScript typings are placed in the `types` folder. - -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-core-helpers.svg -[npm-url]: https://npmjs.org/package/web3-core-helpers -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-core-helpers -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-core-helpers -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-core-helpers -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-core-helpers \ No newline at end of file diff --git a/packages/web3-core-helpers/package-lock.json b/packages/web3-core-helpers/package-lock.json deleted file mode 100644 index 1fc8d1c3692..00000000000 --- a/packages/web3-core-helpers/package-lock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "web3-core-helpers", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==", - "dev": true - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-core-helpers/package.json b/packages/web3-core-helpers/package.json deleted file mode 100644 index 52484d8f5de..00000000000 --- a/packages/web3-core-helpers/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "web3-core-helpers", - "version": "1.3.0", - "description": "Web3 core tools helper for sub packages. This is an internal package.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-core-helpers", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "@types/node": "^12.12.6", - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } -} diff --git a/packages/web3-core-helpers/src/errors.js b/packages/web3-core-helpers/src/errors.js deleted file mode 100644 index 9f16f677313..00000000000 --- a/packages/web3-core-helpers/src/errors.js +++ /dev/null @@ -1,137 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file errors.js - * @author Fabian Vogelsteller - * @author Marek Kotewicz - * @date 2017 - */ - -"use strict"; - -module.exports = { - ErrorResponse: function (result) { - var message = !!result && !!result.error && !!result.error.message ? result.error.message : JSON.stringify(result); - var data = (!!result.error && !!result.error.data) ? result.error.data : null; - var err = new Error('Returned error: ' + message); - err.data = data; - return err; - }, - InvalidNumberOfParams: function (got, expected, method) { - return new Error('Invalid number of parameters for "'+ method +'". Got '+ got +' expected '+ expected +'!'); - }, - InvalidConnection: function (host, event){ - return this.ConnectionError('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.', event); - }, - InvalidProvider: function () { - return new Error('Provider not set or invalid'); - }, - InvalidResponse: function (result){ - var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result); - return new Error(message); - }, - ConnectionTimeout: function (ms){ - return new Error('CONNECTION TIMEOUT: timeout of ' + ms + ' ms achived'); - }, - ConnectionNotOpenError: function (event){ - return this.ConnectionError('connection not open on send()', event); - }, - ConnectionCloseError: function (event){ - if (typeof event === 'object' && event.code && event.reason) { - return this.ConnectionError( - 'CONNECTION ERROR: The connection got closed with ' + - 'the close code `' + event.code + '` and the following ' + - 'reason string `' + event.reason + '`', - event - ); - } - - return new Error('CONNECTION ERROR: The connection closed unexpectedly'); - }, - MaxAttemptsReachedOnReconnectingError: function (){ - return new Error('Maximum number of reconnect attempts reached!'); - }, - PendingRequestsOnReconnectingError: function (){ - return new Error('CONNECTION ERROR: Provider started to reconnect before the response got received!'); - }, - ConnectionError: function (msg, event){ - const error = new Error(msg); - if (event) { - error.code = event.code; - error.reason = event.reason; - } - - return error; - }, - RevertInstructionError: function(reason, signature) { - var error = new Error('Your request got reverted with the following reason string: ' + reason); - error.reason = reason; - error.signature = signature; - - return error; - }, - TransactionRevertInstructionError: function(reason, signature, receipt) { - var error = new Error('Transaction has been reverted by the EVM:\n' + JSON.stringify(receipt, null, 2)); - error.reason = reason; - error.signature = signature; - error.receipt = receipt; - - return error; - }, - TransactionError: function(message, receipt) { - var error = new Error(message); - error.receipt = receipt; - - return error; - }, - NoContractAddressFoundError: function(receipt) { - return this.TransactionError('The transaction receipt didn\'t contain a contract address.', receipt); - }, - ContractCodeNotStoredError: function(receipt) { - return this.TransactionError('The contract code couldn\'t be stored, please check your gas limit.', receipt); - }, - TransactionRevertedWithoutReasonError: function(receipt) { - return this.TransactionError('Transaction has been reverted by the EVM:\n' + JSON.stringify(receipt, null, 2), receipt); - }, - TransactionOutOfGasError: function(receipt) { - return this.TransactionError('Transaction ran out of gas. Please provide more gas:\n' + JSON.stringify(receipt, null, 2), receipt); - }, - ResolverMethodMissingError: function(address, name) { - return new Error('The resolver at ' + address + 'does not implement requested method: "' + name + '".'); - }, - ContractMissingABIError: function() { - return new Error('You must provide the json interface of the contract when instantiating a contract object.'); - }, - ContractOnceRequiresCallbackError: function() { - return new Error('Once requires a callback as the second parameter.'); - }, - ContractEventDoesNotExistError: function(eventName) { - return new Error('Event "' + eventName + '" doesn\'t exist in this contract.'); - }, - ContractReservedEventError: function(type) { - return new Error('The event "'+ type +'" is a reserved event name, you can\'t use it.'); - }, - ContractMissingDeployDataError: function() { - return new Error('No "data" specified in neither the given options, nor the default options.'); - }, - ContractNoAddressDefinedError: function() { - return new Error('This contract object doesn\'t have address set yet, please set an address first.'); - }, - ContractNoFromAddressDefinedError: function() { - return new Error('No "from" address specified in neither the given options, nor the default options.'); - } -}; diff --git a/packages/web3-core-helpers/src/formatters.js b/packages/web3-core-helpers/src/formatters.js deleted file mode 100644 index 0b0e580cbf7..00000000000 --- a/packages/web3-core-helpers/src/formatters.js +++ /dev/null @@ -1,510 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file formatters.js - * @author Fabian Vogelsteller - * @author Marek Kotewicz - * @date 2017 - */ - -"use strict"; - -var _ = require('underscore'); -var utils = require('web3-utils'); -var Iban = require('web3-eth-iban'); - - -/** - * Will format the given storage key array values to hex strings. - * - * @method inputStorageKeysFormatter - * - * @param {Array} keys - * - * @returns {Array} - */ -var inputStorageKeysFormatter = function (keys) { - return keys.map(utils.numberToHex); -}; - -/** - * Will format the given proof response from the node. - * - * @method outputProofFormatter - * - * @param {object} proof - * - * @returns {object} - */ -var outputProofFormatter = function (proof) { - proof.address = utils.toChecksumAddress(proof.address); - proof.nonce = utils.hexToNumberString(proof.nonce); - proof.balance = utils.hexToNumberString(proof.balance); - - return proof; -}; - -/** - * Should the format output to a big number - * - * @method outputBigNumberFormatter - * - * @param {String|Number|BigNumber|BN} number - * - * @returns {BN} object - */ -var outputBigNumberFormatter = function (number) { - return utils.toBN(number).toString(10); -}; - -/** - * Returns true if the given blockNumber is 'latest', 'pending', or 'earliest. - * - * @method isPredefinedBlockNumber - * - * @param {String} blockNumber - * - * @returns {Boolean} - */ -var isPredefinedBlockNumber = function (blockNumber) { - return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest'; -}; - -/** - * Returns the given block number as hex string or does return the defaultBlock property of the current module - * - * @method inputDefaultBlockNumberFormatter - * - * @param {String|Number|BN|BigNumber} blockNumber - * - * @returns {String} - */ -var inputDefaultBlockNumberFormatter = function (blockNumber) { - if (this && (blockNumber === undefined || blockNumber === null)) { - return inputBlockNumberFormatter(this.defaultBlock); - } - - return inputBlockNumberFormatter(blockNumber); -}; - -/** - * Returns the given block number as hex string or the predefined block number 'latest', 'pending', 'earliest', 'genesis' - * - * @param {String|Number|BN|BigNumber} blockNumber - * - * @returns {String} - */ -var inputBlockNumberFormatter = function (blockNumber) { - if (blockNumber === undefined) { - return undefined; - } - - if (isPredefinedBlockNumber(blockNumber)) { - return blockNumber; - } - - if (blockNumber === 'genesis') { - return '0x0'; - } - - return (utils.isHexStrict(blockNumber)) ? ((_.isString(blockNumber)) ? blockNumber.toLowerCase() : blockNumber) : utils.numberToHex(blockNumber); -}; - -/** - * Formats the input of a transaction and converts all values to HEX - * - * @method _txInputFormatter - * @param {Object} transaction options - * @returns object - */ -var _txInputFormatter = function (options) { - - if (options.to) { // it might be contract creation - options.to = inputAddressFormatter(options.to); - } - - if (options.data && options.input) { - throw new Error('You can\'t have "data" and "input" as properties of transactions at the same time, please use either "data" or "input" instead.'); - } - - if (!options.data && options.input) { - options.data = options.input; - delete options.input; - } - - if (options.data && !options.data.startsWith('0x')) { - options.data = '0x' + options.data; - } - - if (options.data && !utils.isHex(options.data)) { - throw new Error('The data field must be HEX encoded data.'); - } - - // allow both - if (options.gas || options.gasLimit) { - options.gas = options.gas || options.gasLimit; - } - - ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { - return options[key] !== undefined; - }).forEach(function (key) { - options[key] = utils.numberToHex(options[key]); - }); - - return options; -}; - -/** - * Formats the input of a transaction and converts all values to HEX - * - * @method inputCallFormatter - * @param {Object} transaction options - * @returns object - */ -var inputCallFormatter = function (options) { - - options = _txInputFormatter(options); - - var from = options.from || (this ? this.defaultAccount : null); - - if (from) { - options.from = inputAddressFormatter(from); - } - - - return options; -}; - -/** - * Formats the input of a transaction and converts all values to HEX - * - * @method inputTransactionFormatter - * @param {Object} options - * @returns object - */ -var inputTransactionFormatter = function (options) { - - options = _txInputFormatter(options); - - // check from, only if not number, or object - if (!_.isNumber(options.from) && !_.isObject(options.from)) { - options.from = options.from || (this ? this.defaultAccount : null); - - if (!options.from && !_.isNumber(options.from)) { - throw new Error('The send transactions "from" field must be defined!'); - } - - options.from = inputAddressFormatter(options.from); - } - - return options; -}; - -/** - * Hex encodes the data passed to eth_sign and personal_sign - * - * @method inputSignFormatter - * @param {String} data - * @returns {String} - */ -var inputSignFormatter = function (data) { - return (utils.isHexStrict(data)) ? data : utils.utf8ToHex(data); -}; - -/** - * Formats the output of a transaction to its proper values - * - * @method outputTransactionFormatter - * @param {Object} tx - * @returns {Object} - */ -var outputTransactionFormatter = function (tx) { - if (tx.blockNumber !== null) - tx.blockNumber = utils.hexToNumber(tx.blockNumber); - if (tx.transactionIndex !== null) - tx.transactionIndex = utils.hexToNumber(tx.transactionIndex); - tx.nonce = utils.hexToNumber(tx.nonce); - tx.gas = utils.hexToNumber(tx.gas); - tx.gasPrice = outputBigNumberFormatter(tx.gasPrice); - tx.value = outputBigNumberFormatter(tx.value); - - if (tx.to && utils.isAddress(tx.to)) { // tx.to could be `0x0` or `null` while contract creation - tx.to = utils.toChecksumAddress(tx.to); - } else { - tx.to = null; // set to `null` if invalid address - } - - if (tx.from) { - tx.from = utils.toChecksumAddress(tx.from); - } - - return tx; -}; - -/** - * Formats the output of a transaction receipt to its proper values - * - * @method outputTransactionReceiptFormatter - * @param {Object} receipt - * @returns {Object} - */ -var outputTransactionReceiptFormatter = function (receipt) { - if (typeof receipt !== 'object') { - throw new Error('Received receipt is invalid: ' + receipt); - } - - if (receipt.blockNumber !== null) - receipt.blockNumber = utils.hexToNumber(receipt.blockNumber); - if (receipt.transactionIndex !== null) - receipt.transactionIndex = utils.hexToNumber(receipt.transactionIndex); - receipt.cumulativeGasUsed = utils.hexToNumber(receipt.cumulativeGasUsed); - receipt.gasUsed = utils.hexToNumber(receipt.gasUsed); - - if (_.isArray(receipt.logs)) { - receipt.logs = receipt.logs.map(outputLogFormatter); - } - - if (receipt.contractAddress) { - receipt.contractAddress = utils.toChecksumAddress(receipt.contractAddress); - } - - if (typeof receipt.status !== 'undefined' && receipt.status !== null) { - receipt.status = Boolean(parseInt(receipt.status)); - } - - return receipt; -}; - -/** - * Formats the output of a block to its proper values - * - * @method outputBlockFormatter - * @param {Object} block - * @returns {Object} - */ -var outputBlockFormatter = function (block) { - - // transform to number - block.gasLimit = utils.hexToNumber(block.gasLimit); - block.gasUsed = utils.hexToNumber(block.gasUsed); - block.size = utils.hexToNumber(block.size); - block.timestamp = utils.hexToNumber(block.timestamp); - if (block.number !== null) - block.number = utils.hexToNumber(block.number); - - if (block.difficulty) - block.difficulty = outputBigNumberFormatter(block.difficulty); - if (block.totalDifficulty) - block.totalDifficulty = outputBigNumberFormatter(block.totalDifficulty); - - if (_.isArray(block.transactions)) { - block.transactions.forEach(function (item) { - if (!_.isString(item)) - return outputTransactionFormatter(item); - }); - } - - if (block.miner) - block.miner = utils.toChecksumAddress(block.miner); - - return block; -}; - -/** - * Formats the input of a log - * - * @method inputLogFormatter - * @param {Object} log object - * @returns {Object} log - */ -var inputLogFormatter = function (options) { - var toTopic = function (value) { - - if (value === null || typeof value === 'undefined') - return null; - - value = String(value); - - if (value.indexOf('0x') === 0) - return value; - else - return utils.fromUtf8(value); - }; - - if (options.fromBlock || options.fromBlock === 0) - options.fromBlock = inputBlockNumberFormatter(options.fromBlock); - - if (options.toBlock || options.toBlock === 0) - options.toBlock = inputBlockNumberFormatter(options.toBlock); - - - // make sure topics, get converted to hex - options.topics = options.topics || []; - options.topics = options.topics.map(function (topic) { - return (_.isArray(topic)) ? topic.map(toTopic) : toTopic(topic); - }); - - toTopic = null; - - if (options.address) { - options.address = (_.isArray(options.address)) ? options.address.map(function (addr) { - return inputAddressFormatter(addr); - }) : inputAddressFormatter(options.address); - } - - return options; -}; - -/** - * Formats the output of a log - * - * @method outputLogFormatter - * @param {Object} log object - * @returns {Object} log - */ -var outputLogFormatter = function (log) { - - // generate a custom log id - if (typeof log.blockHash === 'string' && - typeof log.transactionHash === 'string' && - typeof log.logIndex === 'string') { - var shaId = utils.sha3(log.blockHash.replace('0x', '') + log.transactionHash.replace('0x', '') + log.logIndex.replace('0x', '')); - log.id = 'log_' + shaId.replace('0x', '').substr(0, 8); - } else if (!log.id) { - log.id = null; - } - - if (log.blockNumber !== null) - log.blockNumber = utils.hexToNumber(log.blockNumber); - if (log.transactionIndex !== null) - log.transactionIndex = utils.hexToNumber(log.transactionIndex); - if (log.logIndex !== null) - log.logIndex = utils.hexToNumber(log.logIndex); - - if (log.address) { - log.address = utils.toChecksumAddress(log.address); - } - - return log; -}; - -/** - * Formats the input of a whisper post and converts all values to HEX - * - * @method inputPostFormatter - * @param {Object} transaction object - * @returns {Object} - */ -var inputPostFormatter = function (post) { - - // post.payload = utils.toHex(post.payload); - - if (post.ttl) - post.ttl = utils.numberToHex(post.ttl); - if (post.workToProve) - post.workToProve = utils.numberToHex(post.workToProve); - if (post.priority) - post.priority = utils.numberToHex(post.priority); - - // fallback - if (!_.isArray(post.topics)) { - post.topics = post.topics ? [post.topics] : []; - } - - // format the following options - post.topics = post.topics.map(function (topic) { - // convert only if not hex - return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic); - }); - - return post; -}; - -/** - * Formats the output of a received post message - * - * @method outputPostFormatter - * @param {Object} - * @returns {Object} - */ -var outputPostFormatter = function (post) { - - post.expiry = utils.hexToNumber(post.expiry); - post.sent = utils.hexToNumber(post.sent); - post.ttl = utils.hexToNumber(post.ttl); - post.workProved = utils.hexToNumber(post.workProved); - // post.payloadRaw = post.payload; - // post.payload = utils.hexToAscii(post.payload); - - // if (utils.isJson(post.payload)) { - // post.payload = JSON.parse(post.payload); - // } - - // format the following options - if (!post.topics) { - post.topics = []; - } - post.topics = post.topics.map(function (topic) { - return utils.toUtf8(topic); - }); - - return post; -}; - -var inputAddressFormatter = function (address) { - var iban = new Iban(address); - if (iban.isValid() && iban.isDirect()) { - return iban.toAddress().toLowerCase(); - } else if (utils.isAddress(address)) { - return '0x' + address.toLowerCase().replace('0x', ''); - } - throw new Error(`Provided address ${address} is invalid, the capitalization checksum test failed, or it's an indirect IBAN address which can't be converted.`); -}; - - -var outputSyncingFormatter = function (result) { - - result.startingBlock = utils.hexToNumber(result.startingBlock); - result.currentBlock = utils.hexToNumber(result.currentBlock); - result.highestBlock = utils.hexToNumber(result.highestBlock); - if (result.knownStates) { - result.knownStates = utils.hexToNumber(result.knownStates); - result.pulledStates = utils.hexToNumber(result.pulledStates); - } - - return result; -}; - -module.exports = { - inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter, - inputBlockNumberFormatter: inputBlockNumberFormatter, - inputCallFormatter: inputCallFormatter, - inputTransactionFormatter: inputTransactionFormatter, - inputAddressFormatter: inputAddressFormatter, - inputPostFormatter: inputPostFormatter, - inputLogFormatter: inputLogFormatter, - inputSignFormatter: inputSignFormatter, - inputStorageKeysFormatter: inputStorageKeysFormatter, - outputProofFormatter: outputProofFormatter, - outputBigNumberFormatter: outputBigNumberFormatter, - outputTransactionFormatter: outputTransactionFormatter, - outputTransactionReceiptFormatter: outputTransactionReceiptFormatter, - outputBlockFormatter: outputBlockFormatter, - outputLogFormatter: outputLogFormatter, - outputPostFormatter: outputPostFormatter, - outputSyncingFormatter: outputSyncingFormatter -}; diff --git a/packages/web3-core-helpers/src/index.js b/packages/web3-core-helpers/src/index.js deleted file mode 100644 index b0f9a4db528..00000000000 --- a/packages/web3-core-helpers/src/index.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var errors = require('./errors'); -var formatters = require('./formatters'); - -module.exports = { - errors: errors, - formatters: formatters -}; - diff --git a/packages/web3-core-helpers/tsconfig.json b/packages/web3-core-helpers/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-core-helpers/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-core-helpers/types/index.d.ts b/packages/web3-core-helpers/types/index.d.ts deleted file mode 100644 index 2a072af3bc1..00000000000 --- a/packages/web3-core-helpers/types/index.d.ts +++ /dev/null @@ -1,252 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -import * as net from 'net'; -import * as http from 'http'; -import * as https from 'https'; - -export class formatters { - static outputBigNumberFormatter(number: number): number; - - static inputSignFormatter(data: string): string; - - static inputAddressFormatter(address: string): string; - - static isPredefinedBlockNumber(blockNumber: string): boolean; - - static inputDefaultBlockNumberFormatter(blockNumber: string): string; - - static inputBlockNumberFormatter(blockNumber: string | number): string | number; - - static outputBlockFormatter(block: any): any; // TODO: Create Block interface - - static txInputFormatter(txObject: any): any; - - static inputCallFormatter(txObject: any): any; - - static inputTransactionFormatter(txObject: any): any; - - static outputTransactionFormatter(receipt: any): any; - - static outputTransactionReceiptFormatter(receipt: any): any; - - static inputLogFormatter(log: any): any; - - static outputLogFormatter(log: any): any; - - static inputPostFormatter(post: any): any; // TODO: Create Post interface - - static outputPostFormatter(post: any): any; // TODO: Create Post interface - - static outputSyncingFormatter(result: any): any; // TODO: Create SyncLog interface -} - -export class errors { - static ErrorResponse(result: Error): Error; - static InvalidNumberOfParams( - got: number, - expected: number, - method: string - ): Error; - static InvalidConnection(host: string, event?: WebSocketEvent): ConnectionError; - static InvalidProvider(): Error; - static InvalidResponse(result: Error): Error; - static ConnectionTimeout(ms: string): Error; - static ConnectionNotOpenError(): Error; - static ConnectionCloseError(event: WebSocketEvent | boolean): Error | ConnectionError; - static MaxAttemptsReachedOnReconnectingError(): Error; - static PendingRequestsOnReconnectingError(): Error; - static ConnectionError(msg: string, event?: WebSocketEvent): ConnectionError; - static RevertInstructionError(reason: string, signature: string): RevertInstructionError - static TransactionRevertInstructionError(reason: string, signature: string, receipt: object): TransactionRevertInstructionError - static TransactionError(message: string, receipt: object): TransactionError - static NoContractAddressFoundError(receipt: object): TransactionError - static ContractCodeNotStoredError(receipt: object): TransactionError - static TransactionRevertedWithoutReasonError(receipt: object): TransactionError - static TransactionOutOfGasError(receipt: object): TransactionError - static ResolverMethodMissingError(address: string, name: string): Error - static ContractMissingABIError(): Error - static ContractOnceRequiresCallbackError(): Error - static ContractEventDoesNotExistError(eventName: string): Error - static ContractReservedEventError(type: string): Error - static ContractMissingDeployDataError(): Error - static ContractNoAddressDefinedError(): Error - static ContractNoFromAddressDefinedError(): Error -} - -export class WebsocketProviderBase { - constructor(host: string, options?: WebsocketProviderOptions); - - isConnecting(): boolean; - - requestQueue: Map; - responseQueue: Map; - connected: boolean; - connection: any; - - supportsSubscriptions(): boolean; - - send( - payload: JsonRpcPayload, - callback: (error: Error | null, result?: JsonRpcResponse) => void - ): void; - - on(type: string, callback: () => void): void; - - once(type: string, callback: () => void): void; - - removeListener(type: string, callback: () => void): void; - - removeAllListeners(type: string): void; - - reset(): void; - - disconnect(code: number, reason: string): void; - - connect(): void; - - reconnect(): void; -} - -export class IpcProviderBase { - constructor(path: string, net: net.Server); - - responseCallbacks: any; - notificationCallbacks: any; - connected: boolean; - connection: any; - - addDefaultEvents(): void; - - supportsSubscriptions(): boolean; - - send( - payload: JsonRpcPayload, - callback: (error: Error | null, result?: JsonRpcResponse) => void - ): void; - - on(type: string, callback: () => void): void; - - once(type: string, callback: () => void): void; - - removeListener(type: string, callback: () => void): void; - - removeAllListeners(type: string): void; - - reset(): void; - - reconnect(): void; -} - -export class HttpProviderBase { - constructor(host: string, options?: HttpProviderOptions); - - host: string; - connected: boolean; - - supportsSubscriptions(): boolean; - - send( - payload: JsonRpcPayload, - callback: (error: Error | null, result?: JsonRpcResponse) => void - ): void; - - disconnect(): boolean; -} - -export interface HttpProviderOptions { - keepAlive?: boolean; - timeout?: number; - headers?: HttpHeader[]; - withCredentials?: boolean; - agent?: HttpAgent -} - -export interface HttpAgent { - http?: http.Agent; - https?: https.Agent; - baseUrl?: string; -} - -export interface HttpHeader { - name: string; - value: string; -} - -export interface WebsocketProviderOptions { - host?: string; - timeout?: number; - reconnectDelay?: number; - headers?: any; - protocol?: string; - clientConfig?: object; - requestOptions?: any; - origin?: string; - reconnect?: ReconnectOptions; -} - -export interface ReconnectOptions { - auto?: boolean; - delay?: number; - maxAttempts?: number; - onTimeout?: boolean; -} - -export interface RequestItem { - payload: JsonRpcPayload; - callback: (error: any, result: any) => void; -} - -export interface JsonRpcPayload { - jsonrpc: string; - method: string; - params: any[]; - id?: string | number; -} - -export interface JsonRpcResponse { - jsonrpc: string; - id: number; - result?: any; - error?: string; -} - -export interface RevertInstructionError extends Error { - reason: string; - signature: string; -} - -export interface TransactionRevertInstructionError extends Error { - reason: string; - signature: string; -} - -export interface TransactionError extends Error { - receipt: object; -} - -export interface ConnectionError extends Error { - code: string | undefined; - reason: string | undefined; -} - -export interface WebSocketEvent { - code?: number; - reason?: string; -} diff --git a/packages/web3-core-helpers/types/tests/errors-test.ts b/packages/web3-core-helpers/types/tests/errors-test.ts deleted file mode 100644 index 48405346208..00000000000 --- a/packages/web3-core-helpers/types/tests/errors-test.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file errors-test.ts - * @author Josh Stevens - * @date 2019 - */ - -import { errors, WebSocketEvent } from 'web3-core-helpers'; - -// $ExpectType Error -errors.ErrorResponse(new Error('hey')); - -// $ExpectType Error -errors.InvalidNumberOfParams(1, 3, 'method'); - -// $ExpectType ConnectionError -errors.InvalidConnection('https://localhost:2345432'); - -// $ExpectType Error -errors.InvalidProvider(); - -// $ExpectType Error -errors.InvalidResponse(new Error('hey')); - -// $ExpectType Error -errors.ConnectionTimeout('timeout'); - -// $ExpectType Error -errors.ConnectionNotOpenError(); - -// $ExpectType Error -errors.MaxAttemptsReachedOnReconnectingError(); - -// $ExpectType Error -errors.PendingRequestsOnReconnectingError(); - -const event: WebSocketEvent = {code: 100, reason: 'reason'}; -// $ExpectType ConnectionError -errors.ConnectionError('msg', event); - -// $ExpectType Error | ConnectionError -errors.ConnectionCloseError(event); - -// $ExpectType Error | ConnectionError -errors.ConnectionCloseError(true); - -// $ExpectType RevertInstructionError -errors.RevertInstructionError('reason', 'signature'); - -// $ExpectType TransactionRevertInstructionError -errors.TransactionRevertInstructionError('reason', 'signature', {}); - -// $ExpectType TransactionError -errors.TransactionError('reason', {}); - -// $ExpectType TransactionError -errors.NoContractAddressFoundError({}); - -// $ExpectType TransactionError -errors.ContractCodeNotStoredError({}); - -// $ExpectType TransactionError -errors.TransactionRevertedWithoutReasonError({}); - -// $ExpectType TransactionError -errors.TransactionOutOfGasError({}); - -// $ExpectType Error -errors.ResolverMethodMissingError('0x0000000000000000000000000000000000000001', 'content'); - -// $ExpectType Error -errors.ContractMissingABIError(); - -// $ExpectType Error -errors.ContractOnceRequiresCallbackError(); - -// $ExpectType Error -errors.ContractEventDoesNotExistError('nonEvent'); - -// $ExpectType Error -errors.ContractReservedEventError('newListener'); - -// $ExpectType Error -errors.ContractMissingDeployDataError(); - -// $ExpectType Error -errors.ContractNoAddressDefinedError(); - -// $ExpectType Error -errors.ContractNoFromAddressDefinedError(); diff --git a/packages/web3-core-helpers/types/tests/formatters-test.ts b/packages/web3-core-helpers/types/tests/formatters-test.ts deleted file mode 100644 index 90c57c20a41..00000000000 --- a/packages/web3-core-helpers/types/tests/formatters-test.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file formatters-test.ts - * @author Samuel Furter - * @date 2018 - */ - -import { formatters } from 'web3-core-helpers'; - -// $ExpectType number -formatters.outputBigNumberFormatter(100); - -// $ExpectType string -formatters.inputSignFormatter('0x0'); - -// $ExpectType string -formatters.inputAddressFormatter('0x0'); - -// $ExpectType boolean -formatters.isPredefinedBlockNumber('latest'); - -// $ExpectType string | number -formatters.inputBlockNumberFormatter('0x0'); - -// $ExpectType any -formatters.outputBlockFormatter({}); - -// $ExpectType any -formatters.txInputFormatter({}); - -// $ExpectType any -formatters.inputCallFormatter({}); - -// $ExpectType any -formatters.inputTransactionFormatter({}); - -// $ExpectType any -formatters.outputTransactionFormatter({}); - -// $ExpectType any -formatters.outputTransactionReceiptFormatter({}); - -// $ExpectType any -formatters.inputLogFormatter({}); - -// $ExpectType any -formatters.outputLogFormatter({}); - -// $ExpectType any -formatters.inputPostFormatter({}); - -// $ExpectType any -formatters.outputPostFormatter({}); - -// $ExpectType any -formatters.outputSyncingFormatter({}); diff --git a/packages/web3-core-helpers/types/tsconfig.json b/packages/web3-core-helpers/types/tsconfig.json deleted file mode 100644 index fd847a8cabb..00000000000 --- a/packages/web3-core-helpers/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-core-helpers": ["."] - } - } -} diff --git a/packages/web3-core-helpers/types/tslint.json b/packages/web3-core-helpers/types/tslint.json deleted file mode 100644 index 6429b0c446e..00000000000 --- a/packages/web3-core-helpers/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false - } -} diff --git a/packages/web3-core-method/README.md b/packages/web3-core-method/README.md deleted file mode 100644 index c7394b92fad..00000000000 --- a/packages/web3-core-method/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# web3-core-method - -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] - -This is a sub-package of [web3.js][repo]. - -This method package is used within most [web3.js][repo] packages. - -Please read the [documentation][docs] for more. - -## Installation - -### Node.js - -```bash -npm install web3-core-method -``` - -## Usage - -```js -const Web3Method = require('web3-core-method'); - -const method = new Web3Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [inputTransactionFormatter] -}); -method.attachToObject(myCoolLib); - -myCoolLib.sendTransaction({...}, function(){ ... }); -``` - -## Types - -All the TypeScript typings are placed in the `types` folder. - -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-core-method.svg -[npm-url]: https://npmjs.org/package/web3-core-method -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-core-method -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-core-method -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-core-method -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-core-method diff --git a/packages/web3-core-method/package-lock.json b/packages/web3-core-method/package-lock.json deleted file mode 100644 index a31bc10d859..00000000000 --- a/packages/web3-core-method/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-core-method", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-core-method/package.json b/packages/web3-core-method/package.json deleted file mode 100644 index efff922e752..00000000000 --- a/packages/web3-core-method/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "web3-core-method", - "version": "1.3.0", - "description": "Creates the methods on the web3 modules. This is an internal package.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-core-method", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "@ethersproject/transactions": "^5.0.0-beta.135", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } -} diff --git a/packages/web3-core-method/src/index.js b/packages/web3-core-method/src/index.js deleted file mode 100644 index 63ce5acbc00..00000000000 --- a/packages/web3-core-method/src/index.js +++ /dev/null @@ -1,884 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @author Marek Kotewicz - * @date 2017 - */ - -'use strict'; - -var _ = require('underscore'); -var errors = require('web3-core-helpers').errors; -var formatters = require('web3-core-helpers').formatters; -var utils = require('web3-utils'); -var promiEvent = require('web3-core-promievent'); -var Subscriptions = require('web3-core-subscriptions').subscriptions; - -var EthersTransactionUtils = require('@ethersproject/transactions'); - -var Method = function Method(options) { - - if (!options.call || !options.name) { - throw new Error('When creating a method you need to provide at least the "name" and "call" property.'); - } - - this.name = options.name; - this.call = options.call; - this.params = options.params || 0; - this.inputFormatter = options.inputFormatter; - this.outputFormatter = options.outputFormatter; - this.transformPayload = options.transformPayload; - this.extraFormatters = options.extraFormatters; - this.abiCoder = options.abiCoder; // Will be used to encode the revert reason string - - this.requestManager = options.requestManager; - - // reference to eth.accounts - this.accounts = options.accounts; - - this.defaultBlock = options.defaultBlock || 'latest'; - this.defaultAccount = options.defaultAccount || null; - this.transactionBlockTimeout = options.transactionBlockTimeout || 50; - this.transactionConfirmationBlocks = options.transactionConfirmationBlocks || 24; - this.transactionPollingTimeout = options.transactionPollingTimeout || 750; - this.defaultCommon = options.defaultCommon; - this.defaultChain = options.defaultChain; - this.defaultHardfork = options.defaultHardfork; - this.handleRevert = options.handleRevert; -}; - -Method.prototype.setRequestManager = function (requestManager, accounts) { - this.requestManager = requestManager; - - // reference to eth.accounts - if (accounts) { - this.accounts = accounts; - } - -}; - -Method.prototype.createFunction = function (requestManager, accounts) { - var func = this.buildCall(); - func.call = this.call; - - this.setRequestManager(requestManager || this.requestManager, accounts || this.accounts); - - return func; -}; - -Method.prototype.attachToObject = function (obj) { - var func = this.buildCall(); - func.call = this.call; - var name = this.name.split('.'); - if (name.length > 1) { - obj[name[0]] = obj[name[0]] || {}; - obj[name[0]][name[1]] = func; - } else { - obj[name[0]] = func; - } -}; - -/** - * Should be used to determine name of the jsonrpc method based on arguments - * - * @method getCall - * @param {Array} arguments - * @return {String} name of jsonrpc method - */ -Method.prototype.getCall = function (args) { - return _.isFunction(this.call) ? this.call(args) : this.call; -}; - -/** - * Should be used to extract callback from array of arguments. Modifies input param - * - * @method extractCallback - * @param {Array} arguments - * @return {Function|Null} callback, if exists - */ -Method.prototype.extractCallback = function (args) { - if (_.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } -}; - -/** - * Should be called to check if the number of arguments is correct - * - * @method validateArgs - * @param {Array} arguments - * @throws {Error} if it is not - */ -Method.prototype.validateArgs = function (args) { - if (args.length !== this.params) { - throw errors.InvalidNumberOfParams(args.length, this.params, this.name); - } -}; - -/** - * Should be called to format input args of method - * - * @method formatInput - * @param {Array} - * @return {Array} - */ -Method.prototype.formatInput = function (args) { - var _this = this; - - if (!this.inputFormatter) { - return args; - } - - return this.inputFormatter.map(function (formatter, index) { - // bind this for defaultBlock, and defaultAccount - return formatter ? formatter.call(_this, args[index]) : args[index]; - }); -}; - -/** - * Should be called to format output(result) of method - * - * @method formatOutput - * @param {Object} - * @return {Object} - */ -Method.prototype.formatOutput = function (result) { - var _this = this; - - if (_.isArray(result)) { - return result.map(function (res) { - return _this.outputFormatter && res ? _this.outputFormatter(res) : res; - }); - } else { - return this.outputFormatter && result ? this.outputFormatter(result) : result; - } -}; - -/** - * Should create payload from given input args - * - * @method toPayload - * @param {Array} args - * @return {Object} - */ -Method.prototype.toPayload = function (args) { - var call = this.getCall(args); - var callback = this.extractCallback(args); - var params = this.formatInput(args); - this.validateArgs(params); - - var payload = { - method: call, - params: params, - callback: callback - }; - - if (this.transformPayload) { - payload = this.transformPayload(payload); - } - - return payload; -}; - - -Method.prototype._confirmTransaction = function (defer, result, payload) { - var method = this, - promiseResolved = false, - canUnsubscribe = true, - timeoutCount = 0, - confirmationCount = 0, - intervalId = null, - lastBlock = null, - receiptJSON = '', - gasProvided = (_.isObject(payload.params[0]) && payload.params[0].gas) ? payload.params[0].gas : null, - isContractDeployment = _.isObject(payload.params[0]) && - payload.params[0].data && - payload.params[0].from && - !payload.params[0].to, - hasBytecode = isContractDeployment && payload.params[0].data.length > 2; - - // add custom send Methods - var _ethereumCalls = [ - new Method({ - name: 'getBlockByNumber', - call: 'eth_getBlockByNumber', - params: 2, - inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { - return !!val; - }], - outputFormatter: formatters.outputBlockFormatter - }), - new Method({ - name: 'getTransactionReceipt', - call: 'eth_getTransactionReceipt', - params: 1, - inputFormatter: [null], - outputFormatter: formatters.outputTransactionReceiptFormatter - }), - new Method({ - name: 'getCode', - call: 'eth_getCode', - params: 2, - inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter] - }), - new Method({ - name: 'getTransactionByHash', - call: 'eth_getTransactionByHash', - params: 1, - inputFormatter: [null], - outputFormatter: formatters.outputTransactionFormatter - }), - new Subscriptions({ - name: 'subscribe', - type: 'eth', - subscriptions: { - 'newBlockHeaders': { - subscriptionName: 'newHeads', // replace subscription with this name - params: 0, - outputFormatter: formatters.outputBlockFormatter - } - } - }) - ]; - // attach methods to this._ethereumCall - var _ethereumCall = {}; - _.each(_ethereumCalls, function (mthd) { - mthd.attachToObject(_ethereumCall); - mthd.requestManager = method.requestManager; // assign rather than call setRequestManager() - }); - - - // fire "receipt" and confirmation events and resolve after - var checkConfirmation = function (existingReceipt, isPolling, err, blockHeader, sub) { - if (!err) { - // create fake unsubscribe - if (!sub) { - sub = { - unsubscribe: function () { - clearInterval(intervalId); - } - }; - } - // if we have a valid receipt we don't need to send a request - return (existingReceipt ? promiEvent.resolve(existingReceipt) : _ethereumCall.getTransactionReceipt(result)) - // catch error from requesting receipt - .catch(function (err) { - sub.unsubscribe(); - promiseResolved = true; - utils._fireError( - { - message: 'Failed to check for transaction receipt:', - data: err - }, - defer.eventEmitter, - defer.reject - ); - }) - // if CONFIRMATION listener exists check for confirmations, by setting canUnsubscribe = false - .then(async function (receipt) { - if (!receipt || !receipt.blockHash) { - throw new Error('Receipt missing or blockHash null'); - } - - // apply extra formatters - if (method.extraFormatters && method.extraFormatters.receiptFormatter) { - receipt = method.extraFormatters.receiptFormatter(receipt); - } - - // check if confirmation listener exists - if (defer.eventEmitter.listeners('confirmation').length > 0) { - var block; - - // If there was an immediately retrieved receipt, it's already - // been confirmed by the direct call to checkConfirmation needed - // for parity instant-seal - if (existingReceipt === undefined || confirmationCount !== 0) { - // Get latest block to emit with confirmation - var latestBlock = await _ethereumCall.getBlockByNumber('latest'); - var latestBlockHash = latestBlock ? latestBlock.hash : null; - - if (isPolling) { // Check if actually a new block is existing on polling - if (lastBlock) { - block = await _ethereumCall.getBlockByNumber(lastBlock.number + 1); - if (block) { - lastBlock = block; - defer.eventEmitter.emit('confirmation', confirmationCount, receipt, latestBlockHash); - } - } else { - block = await _ethereumCall.getBlockByNumber(receipt.blockNumber); - lastBlock = block; - defer.eventEmitter.emit('confirmation', confirmationCount, receipt, latestBlockHash); - } - } else { - defer.eventEmitter.emit('confirmation', confirmationCount, receipt, latestBlockHash); - } - } - - if ((isPolling && block) || !isPolling) { - confirmationCount++; - } - canUnsubscribe = false; - - if (confirmationCount === method.transactionConfirmationBlocks + 1) { // add 1 so we account for conf 0 - sub.unsubscribe(); - defer.eventEmitter.removeAllListeners(); - } - } - - return receipt; - }) - // CHECK for CONTRACT DEPLOYMENT - .then(async function (receipt) { - - if (isContractDeployment && !promiseResolved) { - - if (!receipt.contractAddress) { - - if (canUnsubscribe) { - sub.unsubscribe(); - promiseResolved = true; - } - - utils._fireError( - errors.NoContractAddressFoundError(receipt), - defer.eventEmitter, - defer.reject, - null, - receipt - ); - return; - } - - var code; - try { - code = await _ethereumCall.getCode(receipt.contractAddress); - } catch(err){ - // ignore; - } - - if (!code) { - return; - } - - // If deployment is status.true and there was a real - // bytecode string, assume it was successful. - var deploymentSuccess = receipt.status === true && hasBytecode; - - if (deploymentSuccess || code.length > 2) { - defer.eventEmitter.emit('receipt', receipt); - - // if contract, return instance instead of receipt - if (method.extraFormatters && method.extraFormatters.contractDeployFormatter) { - defer.resolve(method.extraFormatters.contractDeployFormatter(receipt)); - } else { - defer.resolve(receipt); - } - - // need to remove listeners, as they aren't removed automatically when succesfull - if (canUnsubscribe) { - defer.eventEmitter.removeAllListeners(); - } - - } else { - utils._fireError( - errors.ContractCodeNotStoredError(receipt), - defer.eventEmitter, - defer.reject, - null, - receipt - ); - } - - if (canUnsubscribe) { - sub.unsubscribe(); - } - promiseResolved = true; - } - - return receipt; - }) - // CHECK for normal tx check for receipt only - .then(async function (receipt) { - if (!isContractDeployment && !promiseResolved) { - if (!receipt.outOfGas && - (!gasProvided || gasProvided !== receipt.gasUsed) && - (receipt.status === true || receipt.status === '0x1' || typeof receipt.status === 'undefined')) { - defer.eventEmitter.emit('receipt', receipt); - defer.resolve(receipt); - - // need to remove listeners, as they aren't removed automatically when succesfull - if (canUnsubscribe) { - defer.eventEmitter.removeAllListeners(); - } - - } else { - receiptJSON = JSON.stringify(receipt, null, 2); - - if (receipt.status === false || receipt.status === '0x0') { - try { - var revertMessage = null; - - if ( method.handleRevert && - (method.call === 'eth_sendTransaction' || method.call === 'eth_sendRawTransaction')) - { - var txReplayOptions = payload.params[0]; - - // If send was raw, fetch the transaction and reconstitute the - // original params so they can be replayed with `eth_call` - if (method.call === 'eth_sendRawTransaction'){ - var rawTransactionHex = payload.params[0]; - - var parsedTx = EthersTransactionUtils.parse(rawTransactionHex); - - txReplayOptions = formatters.inputTransactionFormatter({ - data: parsedTx.data, - to: parsedTx.to, - from: parsedTx.from, - gas: parsedTx.gasLimit.toHexString(), - gasPrice: parsedTx.gasPrice.toHexString(), - value: parsedTx.value.toHexString() - }); - } - - // Get revert reason string with eth_call - revertMessage = await method.getRevertReason( - txReplayOptions, - receipt.blockNumber - ); - - if (revertMessage) { // Only throw a revert error if a revert reason is existing - utils._fireError( - errors.TransactionRevertInstructionError(revertMessage.reason, revertMessage.signature, receipt), - defer.eventEmitter, - defer.reject, - null, - receipt - ); - } else { - throw false; // Throw false and let the try/catch statement handle the error correctly after - } - } else { - throw false; // Throw false and let the try/catch statement handle the error correctly after - } - } catch (error) { - // Throw an normal revert error if no revert reason is given or the detection of it is disabled - utils._fireError( - errors.TransactionRevertedWithoutReasonError(receipt), - defer.eventEmitter, - defer.reject, - null, - receipt - ); - } - } else { - // Throw OOG if status is not existing and provided gas and used gas are equal - utils._fireError( - errors.TransactionOutOfGasError(receipt), - defer.eventEmitter, - defer.reject, - null, - receipt - ); - } - } - - if (canUnsubscribe) { - sub.unsubscribe(); - } - promiseResolved = true; - } - - }) - // time out the transaction if not mined after 50 blocks - .catch(function () { - timeoutCount++; - - // check to see if we are http polling - if (!!isPolling) { - // polling timeout is different than transactionBlockTimeout blocks since we are triggering every second - if (timeoutCount - 1 >= method.transactionPollingTimeout) { - sub.unsubscribe(); - promiseResolved = true; - utils._fireError( - errors.TransactionError('Transaction was not mined within ' + method.transactionPollingTimeout + ' seconds, please make sure your transaction was properly sent. Be aware that it might still be mined!'), - defer.eventEmitter, - defer.reject - ); - } - } else { - if (timeoutCount - 1 >= method.transactionBlockTimeout) { - sub.unsubscribe(); - promiseResolved = true; - utils._fireError( - errors.TransactionError('Transaction was not mined within ' + method.transactionBlockTimeout + ' blocks, please make sure your transaction was properly sent. Be aware that it might still be mined!'), - defer.eventEmitter, - defer.reject - ); - } - } - }); - - - } else { - sub.unsubscribe(); - promiseResolved = true; - utils._fireError({ - message: 'Failed to subscribe to new newBlockHeaders to confirm the transaction receipts.', - data: err - }, defer.eventEmitter, defer.reject); - } - }; - - // start watching for confirmation depending on the support features of the provider - var startWatching = function (existingReceipt) { - const startInterval = () => { - intervalId = setInterval(checkConfirmation.bind(null, existingReceipt, true), 1000); - }; - - if (!this.requestManager.provider.on) { - startInterval(); - } else { - _ethereumCall.subscribe('newBlockHeaders', function (err, blockHeader, sub) { - if (err || !blockHeader) { - // fall back to polling - startInterval(); - } else { - checkConfirmation(existingReceipt, false, err, blockHeader, sub); - } - }); - } - }.bind(this); - - - // first check if we already have a confirmed transaction - _ethereumCall.getTransactionReceipt(result) - .then(function (receipt) { - if (receipt && receipt.blockHash) { - if (defer.eventEmitter.listeners('confirmation').length > 0) { - // We must keep on watching for new Blocks, if a confirmation listener is present - startWatching(receipt); - } - checkConfirmation(receipt, false); - - } else if (!promiseResolved) { - startWatching(); - } - }) - .catch(function () { - if (!promiseResolved) startWatching(); - }); - -}; - - -var getWallet = function (from, accounts) { - var wallet = null; - - // is index given - if (_.isNumber(from)) { - wallet = accounts.wallet[from]; - - // is account given - } else if (_.isObject(from) && from.address && from.privateKey) { - wallet = from; - - // search in wallet for address - } else { - wallet = accounts.wallet[from.toLowerCase()]; - } - - return wallet; -}; - -Method.prototype.buildCall = function () { - var method = this, - isSendTx = (method.call === 'eth_sendTransaction' || method.call === 'eth_sendRawTransaction'), // || method.call === 'personal_sendTransaction' - isCall = (method.call === 'eth_call'); - - // actual send function - var send = function () { - var defer = promiEvent(!isSendTx), - payload = method.toPayload(Array.prototype.slice.call(arguments)); - - // CALLBACK function - var sendTxCallback = function (err, result) { - if (method.handleRevert && isCall && method.abiCoder) { - var reasonData; - - // Ganache / Geth <= 1.9.13 return the reason data as a successful eth_call response - // Geth >= 1.9.15 attaches the reason data to an error object. - // Geth 1.9.14 is missing revert reason (https://github.com/ethereum/web3.js/issues/3520) - if (!err && method.isRevertReasonString(result)){ - reasonData = result.substring(10); - } else if (err && err.data){ - reasonData = err.data.substring(10); - } - - if (reasonData){ - var reason = method.abiCoder.decodeParameter('string', '0x' + reasonData); - var signature = 'Error(String)'; - - utils._fireError( - errors.RevertInstructionError(reason, signature), - defer.eventEmitter, - defer.reject, - payload.callback, - { - reason: reason, - signature: signature - } - ); - - return; - } - } - - try { - result = method.formatOutput(result); - } catch (e) { - err = e; - } - - if (result instanceof Error) { - err = result; - } - - if (!err) { - if (payload.callback) { - payload.callback(null, result); - } - } else { - if (err.error) { - err = err.error; - } - - return utils._fireError(err, defer.eventEmitter, defer.reject, payload.callback); - } - - // return PROMISE - if (!isSendTx) { - if (!err) { - defer.resolve(result); - } - - // return PROMIEVENT - } else { - defer.eventEmitter.emit('transactionHash', result); - - method._confirmTransaction(defer, result, payload); - } - - }; - - // SENDS the SIGNED SIGNATURE - var sendSignedTx = function (sign) { - - var signedPayload = _.extend({}, payload, { - method: 'eth_sendRawTransaction', - params: [sign.rawTransaction] - }); - - method.requestManager.send(signedPayload, sendTxCallback); - }; - - - var sendRequest = function (payload, method) { - - if (method && method.accounts && method.accounts.wallet && method.accounts.wallet.length) { - var wallet; - - // ETH_SENDTRANSACTION - if (payload.method === 'eth_sendTransaction') { - var tx = payload.params[0]; - wallet = getWallet((_.isObject(tx)) ? tx.from : null, method.accounts); - - - // If wallet was found, sign tx, and send using sendRawTransaction - if (wallet && wallet.privateKey) { - var txOptions = _.omit(tx, 'from'); - - if (method.defaultChain && !txOptions.chain) { - txOptions.chain = method.defaultChain; - } - - if (method.defaultHardfork && !txOptions.hardfork) { - txOptions.hardfork = method.defaultHardfork; - } - - if (method.defaultCommon && !txOptions.common) { - txOptions.common = method.defaultCommon; - } - - method.accounts.signTransaction(txOptions, wallet.privateKey) - .then(sendSignedTx) - .catch(function (err) { - if (_.isFunction(defer.eventEmitter.listeners) && defer.eventEmitter.listeners('error').length) { - try { - defer.eventEmitter.emit('error', err); - } catch (err) { - // Ignore userland error prevent it to bubble up within web3. - } - defer.eventEmitter.removeAllListeners(); - defer.eventEmitter.catch(function () { - }); - } - defer.reject(err); - }); - return; - } - - // ETH_SIGN - } else if (payload.method === 'eth_sign') { - var data = payload.params[1]; - wallet = getWallet(payload.params[0], method.accounts); - - // If wallet was found, sign tx, and send using sendRawTransaction - if (wallet && wallet.privateKey) { - var sign = method.accounts.sign(data, wallet.privateKey); - - if (payload.callback) { - payload.callback(null, sign.signature); - } - - defer.resolve(sign.signature); - return; - } - - - } - } - - - return method.requestManager.send(payload, sendTxCallback); - }; - - // Send the actual transaction - if (isSendTx && _.isObject(payload.params[0]) && typeof payload.params[0].gasPrice === 'undefined') { - - var getGasPrice = (new Method({ - name: 'getGasPrice', - call: 'eth_gasPrice', - params: 0 - })).createFunction(method.requestManager); - - getGasPrice(function (err, gasPrice) { - - if (gasPrice) { - payload.params[0].gasPrice = gasPrice; - } - - if (isSendTx) { - setTimeout(() => { - defer.eventEmitter.emit('sending', payload); - }, 0); - } - - sendRequest(payload, method); - }); - - } else { - if (isSendTx) { - setTimeout(() => { - defer.eventEmitter.emit('sending', payload); - }, 0); - } - - sendRequest(payload, method); - } - - if (isSendTx) { - setTimeout(() => { - defer.eventEmitter.emit('sent', payload); - }, 0); - } - - return defer.eventEmitter; - }; - - // necessary to attach things to the method - send.method = method; - // necessary for batch requests - send.request = this.request.bind(this); - return send; -}; - -/** - * Returns the revert reason string if existing or otherwise false. - * - * @method getRevertReason - * - * @param {Object} txOptions - * @param {Number} blockNumber - * - * @returns {Promise} - */ -Method.prototype.getRevertReason = function (txOptions, blockNumber) { - var self = this; - - return new Promise(function (resolve, reject) { - (new Method({ - name: 'call', - call: 'eth_call', - params: 2, - abiCoder: self.abiCoder, - handleRevert: true - })) - .createFunction(self.requestManager)(txOptions, utils.numberToHex(blockNumber)) - .then(function () { - resolve(false); - }) - .catch(function (error) { - if (error.reason) { - resolve({ - reason: error.reason, - signature: error.signature - }); - } else { - reject(error); - } - }); - }); -}; - -/** - * Checks if the given hex string is a revert message from the EVM - * - * @method isRevertReasonString - * - * @param {String} data - Hex string prefixed with 0x - * - * @returns {Boolean} - */ -Method.prototype.isRevertReasonString = function (data) { - return _.isString(data) && ((data.length - 2) / 2) % 32 === 4 && data.substring(0, 10) === '0x08c379a0'; -}; - -/** - * Should be called to create the pure JSONRPC request which can be used in a batch request - * - * @method request - * @return {Object} jsonrpc request - */ -Method.prototype.request = function () { - var payload = this.toPayload(Array.prototype.slice.call(arguments)); - payload.format = this.formatOutput.bind(this); - return payload; -}; - -module.exports = Method; diff --git a/packages/web3-core-method/tsconfig.json b/packages/web3-core-method/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-core-method/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-core-method/types/index.d.ts b/packages/web3-core-method/types/index.d.ts deleted file mode 100644 index 438b315ef4c..00000000000 --- a/packages/web3-core-method/types/index.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Samuel Furter - * @date 2018 - */ - -import {JsonRpcPayload} from 'web3-core-helpers'; - -export interface Method { - name: string; - call: string; - params?: number; - inputFormatter?: Array<(() => void) | null>; - outputFormatter?: () => void; - transformPayload?: () => void; - extraFormatters?: any; - defaultBlock?: string; - defaultAccount?: string | null; - abiCoder?: any; - handleRevert?: boolean; -} diff --git a/packages/web3-core-method/types/tsconfig.json b/packages/web3-core-method/types/tsconfig.json deleted file mode 100644 index 17889c4b6ce..00000000000 --- a/packages/web3-core-method/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-core-method": ["."] - } - } -} diff --git a/packages/web3-core-method/types/tslint.json b/packages/web3-core-method/types/tslint.json deleted file mode 100644 index 6429b0c446e..00000000000 --- a/packages/web3-core-method/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false - } -} diff --git a/packages/web3-core-promievent/README.md b/packages/web3-core-promievent/README.md deleted file mode 100644 index 0f43a02bc4e..00000000000 --- a/packages/web3-core-promievent/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# web3-core-promievent - -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] - -This is a sub-package of [web3.js][repo]. - -This is the PromiEvent package used to return a EventEmitter mixed with a Promise to allow multiple final states as well as chaining. - -Please read the [documentation][docs] for more. - -## Installation - -### Node.js - -```bash -npm install web3-core-promievent -``` - -## Usage - -```js -const Web3PromiEvent = require('web3-core-promievent'); - -const myFunc = function(){ - const promiEvent = Web3PromiEvent(); - - setTimeout(function() { - promiEvent.eventEmitter.emit('done', 'Hello!'); - promiEvent.resolve('Hello!'); - }, 10); - - return promiEvent.eventEmitter; -}; - -// and run it -myFunc() -.on('done', console.log) -.then(console.log); -``` - -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-core-promievent.svg -[npm-url]: https://npmjs.org/package/web3-core-promievent -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-core-promievent -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-core-promievent -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-core-promievent -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-core-promievent diff --git a/packages/web3-core-promievent/package-lock.json b/packages/web3-core-promievent/package-lock.json deleted file mode 100644 index 81cf42a6772..00000000000 --- a/packages/web3-core-promievent/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "web3-core-promievent", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" - } - } -} diff --git a/packages/web3-core-promievent/package.json b/packages/web3-core-promievent/package.json deleted file mode 100644 index b69a0fd1ccf..00000000000 --- a/packages/web3-core-promievent/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "web3-core-promievent", - "version": "1.3.0", - "description": "This package extends the EventEmitter with the Promise class to allow chaining as well as multiple final states of a function.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-core-promievent", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "main": "lib/index.js", - "scripts": { - "tsc": "tsc -b tsconfig.json" - }, - "dependencies": { - "eventemitter3": "4.0.4" - } -} diff --git a/packages/web3-core-promievent/src/index.js b/packages/web3-core-promievent/src/index.js deleted file mode 100644 index e1468349c35..00000000000 --- a/packages/web3-core-promievent/src/index.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2016 - */ - -"use strict"; - -var EventEmitter = require('eventemitter3'); - -/** - * This function generates a defer promise and adds eventEmitter functionality to it - * - * @method eventifiedPromise - */ -var PromiEvent = function PromiEvent(justPromise) { - var resolve, reject, - eventEmitter = new Promise(function() { - resolve = arguments[0]; - reject = arguments[1]; - }); - - if(justPromise) { - return { - resolve: resolve, - reject: reject, - eventEmitter: eventEmitter - }; - } - - // get eventEmitter - var emitter = new EventEmitter(); - - // add eventEmitter to the promise - eventEmitter._events = emitter._events; - eventEmitter.emit = emitter.emit; - eventEmitter.on = emitter.on; - eventEmitter.once = emitter.once; - eventEmitter.off = emitter.off; - eventEmitter.listeners = emitter.listeners; - eventEmitter.addListener = emitter.addListener; - eventEmitter.removeListener = emitter.removeListener; - eventEmitter.removeAllListeners = emitter.removeAllListeners; - - return { - resolve: resolve, - reject: reject, - eventEmitter: eventEmitter - }; -}; - -PromiEvent.resolve = function(value) { - var promise = PromiEvent(true); - promise.resolve(value); - return promise.eventEmitter; -}; - -module.exports = PromiEvent; diff --git a/packages/web3-core-promievent/tsconfig.json b/packages/web3-core-promievent/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-core-promievent/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-core-requestmanager/README.md b/packages/web3-core-requestmanager/README.md deleted file mode 100644 index 7ca0d9288e9..00000000000 --- a/packages/web3-core-requestmanager/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# web3-core-requestmanager - -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] - -This is a sub-package of [web3.js][repo]. - -This requestmanager package is used by most [web3.js][repo] packages. - -Please read the [documentation][docs] for more. - -## Installation - -### Node.js - -```bash -npm install web3-core-requestmanager -``` - -## Usage - -```js -const Web3WsProvider = require('web3-providers-ws'); -const Web3RequestManager = require('web3-core-requestmanager'); - -const requestManager = new Web3RequestManager(new Web3WsProvider('ws://localhost:8546')); -``` - -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-core-requestmanager.svg -[npm-url]: https://npmjs.org/package/web3-core-requestmanager -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-core-requestmanager -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-core-requestmanager -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-core-requestmanager -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-core-requestmanager - diff --git a/packages/web3-core-requestmanager/package-lock.json b/packages/web3-core-requestmanager/package-lock.json deleted file mode 100644 index e1923792279..00000000000 --- a/packages/web3-core-requestmanager/package-lock.json +++ /dev/null @@ -1,713 +0,0 @@ -{ - "name": "web3-core-requestmanager", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "bufferutil": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", - "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", - "requires": { - "node-gyp-build": "~3.7.0" - } - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethereum-bloom-filters": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz", - "integrity": "sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ==", - "requires": { - "js-sha3": "^0.8.0" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node-gyp-build": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", - "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "object.entries": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "has": "^1.0.3" - } - }, - "oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", - "requires": { - "http-https": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "utf-8-validate": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", - "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", - "requires": { - "node-gyp-build": "~3.7.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "util": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.0.tgz", - "integrity": "sha512-pPSOFl7VLhZ7LO/SFABPraZEEurkJUWSMn3MuA/r3WQZc+Z1fqou2JqLSOZbCLl73EUIxuUVX8X4jkX2vfJeAA==", - "requires": { - "inherits": "2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "object.entries": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "web3-core-helpers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz", - "integrity": "sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw==", - "requires": { - "underscore": "1.9.1", - "web3-eth-iban": "1.3.0", - "web3-utils": "1.3.0" - } - }, - "web3-eth-iban": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz", - "integrity": "sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw==", - "requires": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.0" - } - }, - "web3-providers-http": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.3.0.tgz", - "integrity": "sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA==", - "requires": { - "web3-core-helpers": "1.3.0", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz", - "integrity": "sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og==", - "requires": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - } - }, - "web3-providers-ws": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz", - "integrity": "sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw==", - "requires": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "websocket": "^1.0.32" - } - }, - "web3-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.0.tgz", - "integrity": "sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA==", - "requires": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - }, - "websocket": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.32.tgz", - "integrity": "sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==", - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "requires": { - "xhr-request": "^1.1.0" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - } - } -} diff --git a/packages/web3-core-requestmanager/package.json b/packages/web3-core-requestmanager/package.json deleted file mode 100644 index 799b6abfacf..00000000000 --- a/packages/web3-core-requestmanager/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "web3-core-requestmanager", - "version": "1.3.0", - "description": "Web3 module to handle requests to external providers.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-core-requestmanager", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "main": "lib/index.js", - "scripts": { - "tsc": "tsc -b tsconfig.json" - }, - "dependencies": { - "underscore": "1.9.1", - "util": "^0.12.0", - "web3-core-helpers": "1.3.0", - "web3-providers-http": "1.3.0", - "web3-providers-ipc": "1.3.0", - "web3-providers-ws": "1.3.0" - } -} diff --git a/packages/web3-core-requestmanager/src/batch.js b/packages/web3-core-requestmanager/src/batch.js deleted file mode 100644 index c47aaf7b9dd..00000000000 --- a/packages/web3-core-requestmanager/src/batch.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file batch.js - * @author Marek Kotewicz - * @date 2015 - */ - -"use strict"; - -var Jsonrpc = require('./jsonrpc'); -var errors = require('web3-core-helpers').errors; - -var Batch = function (requestManager) { - this.requestManager = requestManager; - this.requests = []; -}; - -/** - * Should be called to add create new request to batch request - * - * @method add - * @param {Object} jsonrpc requet object - */ -Batch.prototype.add = function (request) { - this.requests.push(request); -}; - -/** - * Should be called to execute batch request - * - * @method execute - */ -Batch.prototype.execute = function () { - var requests = this.requests; - this.requestManager.sendBatch(requests, function (err, results) { - results = results || []; - requests.map(function (request, index) { - return results[index] || {}; - }).forEach(function (result, index) { - if (requests[index].callback) { - if (result && result.error) { - return requests[index].callback(errors.ErrorResponse(result)); - } - - if (!Jsonrpc.isValidResponse(result)) { - return requests[index].callback(errors.InvalidResponse(result)); - } - - try { - requests[index].callback(null, requests[index].format ? requests[index].format(result.result) : result.result); - } catch (err) { - requests[index].callback(err); - } - } - }); - }); -}; - -module.exports = Batch; - diff --git a/packages/web3-core-requestmanager/src/givenProvider.js b/packages/web3-core-requestmanager/src/givenProvider.js deleted file mode 100644 index 2f57f1a51ce..00000000000 --- a/packages/web3-core-requestmanager/src/givenProvider.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file givenProvider.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var givenProvider = null; - -// ADD GIVEN PROVIDER -/* jshint ignore:start */ -var global; -try { - global = Function('return this')(); -} catch (e) { - global = window; -} - -// EIP-1193: window.ethereum -if (typeof global.ethereum !== 'undefined') { - givenProvider = global.ethereum; - -// Legacy web3.currentProvider -} else if(typeof global.web3 !== 'undefined' && global.web3.currentProvider) { - - if(global.web3.currentProvider.sendAsync) { - global.web3.currentProvider.send = global.web3.currentProvider.sendAsync; - delete global.web3.currentProvider.sendAsync; - } - - // if connection is 'ipcProviderWrapper', add subscription support - if(!global.web3.currentProvider.on && - global.web3.currentProvider.connection && - global.web3.currentProvider.connection.constructor.name === 'ipcProviderWrapper') { - - global.web3.currentProvider.on = function (type, callback) { - - if(typeof callback !== 'function') - throw new Error('The second parameter callback must be a function.'); - - switch(type){ - case 'data': - this.connection.on('data', function(data) { - var result = ''; - - data = data.toString(); - - try { - result = JSON.parse(data); - } catch(e) { - return callback(new Error('Couldn\'t parse response data'+ data)); - } - - // notification - if(!result.id && result.method.indexOf('_subscription') !== -1) { - callback(null, result); - } - - }); - break; - - default: - this.connection.on(type, callback); - break; - } - }; - } - - givenProvider = global.web3.currentProvider; -} -/* jshint ignore:end */ - - -module.exports = givenProvider; diff --git a/packages/web3-core-requestmanager/src/index.js b/packages/web3-core-requestmanager/src/index.js deleted file mode 100644 index 635c57b1db0..00000000000 --- a/packages/web3-core-requestmanager/src/index.js +++ /dev/null @@ -1,350 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - - -const { callbackify } = require('util'); -var _ = require('underscore'); -var errors = require('web3-core-helpers').errors; -var Jsonrpc = require('./jsonrpc.js'); -var BatchManager = require('./batch.js'); -var givenProvider = require('./givenProvider.js'); - -/** - * It's responsible for passing messages to providers - * It's also responsible for polling the ethereum node for incoming messages - * Default poll timeout is 1 second - * Singleton - * - * @param {string|Object}provider - * @param {Net.Socket} net - * - * @constructor - */ -var RequestManager = function RequestManager(provider, net) { - this.provider = null; - this.providers = RequestManager.providers; - - this.setProvider(provider, net); - this.subscriptions = new Map(); -}; - - -RequestManager.givenProvider = givenProvider; - -RequestManager.providers = { - WebsocketProvider: require('web3-providers-ws'), - HttpProvider: require('web3-providers-http'), - IpcProvider: require('web3-providers-ipc') -}; - - -/** - * Should be used to set provider of request manager - * - * @method setProvider - * - * @param {Object} provider - * @param {net.Socket} net - * - * @returns void - */ -RequestManager.prototype.setProvider = function (provider, net) { - var _this = this; - - // autodetect provider - if (provider && typeof provider === 'string' && this.providers) { - - // HTTP - if (/^http(s)?:\/\//i.test(provider)) { - provider = new this.providers.HttpProvider(provider); - - // WS - } else if (/^ws(s)?:\/\//i.test(provider)) { - provider = new this.providers.WebsocketProvider(provider); - - // IPC - } else if (provider && typeof net === 'object' && typeof net.connect === 'function') { - provider = new this.providers.IpcProvider(provider, net); - - } else if (provider) { - throw new Error('Can\'t autodetect provider for "' + provider + '"'); - } - } - - - // reset the old one before changing, if still connected - if (this.provider && this.provider.connected) - this.clearSubscriptions(); - - this.provider = provider || null; - - // listen to incoming notifications - if (this.provider && this.provider.on) { - this.provider.on('data', function data(result, deprecatedResult) { - result = result || deprecatedResult; // this is for possible old providers, which may had the error first handler - - // if result is a subscription, call callback for that subscription - if (result.method && result.params && result.params.subscription && _this.subscriptions.has(result.params.subscription)) { - _this.subscriptions.get(result.params.subscription).callback(null, result.params.result); - } - }); - - // resubscribe if the provider has reconnected - this.provider.on('connect', function connect() { - _this.subscriptions.forEach(function (subscription) { - subscription.subscription.resubscribe(); - }); - }); - - // notify all subscriptions about the error condition - this.provider.on('error', function error(error) { - _this.subscriptions.forEach(function (subscription) { - subscription.callback(error); - }); - }); - - // notify all subscriptions about bad close conditions - const disconnect = function disconnect(event) { - if (!_this._isCleanCloseEvent(event) || _this._isIpcCloseError(event)) { - _this.subscriptions.forEach(function (subscription) { - subscription.callback(errors.ConnectionCloseError(event)); - _this.subscriptions.delete(subscription.subscription.id); - }); - - if (_this.provider && _this.provider.emit) { - _this.provider.emit('error', errors.ConnectionCloseError(event)); - } - } - if (_this.provider && _this.provider.emit) { - _this.provider.emit('end', event); - } - }; - // TODO: Remove close once the standard allows it - this.provider.on('close', disconnect); - this.provider.on('disconnect', disconnect); - - // TODO add end, timeout?? - } -}; - -/** - * Asynchronously send request to provider. - * Prefers to use the `request` method available on the provider as specified in [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193). - * If `request` is not available, falls back to `sendAsync` and `send` respectively. - * @method send - * @param {Object} data - * @param {Function} callback - */ -RequestManager.prototype.send = function (data, callback) { - callback = callback || function () { }; - - if (!this.provider) { - return callback(errors.InvalidProvider()); - } - - const { method, params } = data - - const jsonrpcPayload = Jsonrpc.toPayload(method, params); - const jsonrpcResultCallback = this._jsonrpcResultCallback(callback, jsonrpcPayload) - - if (this.provider.request) { - const callbackRequest = callbackify(this.provider.request.bind(this.provider)) - const requestArgs = { method, params } - callbackRequest(requestArgs, callback); - } else if (this.provider.sendAsync) { - this.provider.sendAsync(jsonrpcPayload, jsonrpcResultCallback); - } else if (this.provider.send) { - this.provider.send(jsonrpcPayload, jsonrpcResultCallback); - } else { - throw new Error('Provider does not have a request or send method to use.'); - } -}; - -/** - * Asynchronously send batch request. - * Only works if provider supports batch methods through `sendAsync` or `send`. - * @method sendBatch - * @param {Array} data - array of payload objects - * @param {Function} callback - */ -RequestManager.prototype.sendBatch = function (data, callback) { - if (!this.provider) { - return callback(errors.InvalidProvider()); - } - - var payload = Jsonrpc.toBatchPayload(data); - this.provider[this.provider.sendAsync ? 'sendAsync' : 'send'](payload, function (err, results) { - if (err) { - return callback(err); - } - - if (!_.isArray(results)) { - return callback(errors.InvalidResponse(results)); - } - - callback(null, results); - }); -}; - - -/** - * Waits for notifications - * - * @method addSubscription - * @param {Subscription} subscription the subscription - * @param {String} type the subscription namespace (eth, personal, etc) - * @param {Function} callback the callback to call for incoming notifications - */ -RequestManager.prototype.addSubscription = function (subscription, callback) { - if (this.provider.on) { - this.subscriptions.set( - subscription.id, - { - callback: callback, - subscription: subscription - } - ); - } else { - throw new Error('The provider doesn\'t support subscriptions: ' + this.provider.constructor.name); - } -}; - -/** - * Waits for notifications - * - * @method removeSubscription - * @param {String} id the subscription id - * @param {Function} callback fired once the subscription is removed - */ -RequestManager.prototype.removeSubscription = function (id, callback) { - if (this.subscriptions.has(id)) { - var type = this.subscriptions.get(id).subscription.options.type; - - // remove subscription first to avoid reentry - this.subscriptions.delete(id); - - // then, try to actually unsubscribe - this.send({ - method: type + '_unsubscribe', - params: [id] - }, callback); - - return; - } - - if (typeof callback === 'function') { - // call the callback if the subscription was already removed - callback(null); - } -}; - -/** - * Should be called to reset the subscriptions - * - * @method reset - * - * @returns {boolean} - */ -RequestManager.prototype.clearSubscriptions = function (keepIsSyncing) { - try { - var _this = this; - - // uninstall all subscriptions - if (this.subscriptions.size > 0) { - this.subscriptions.forEach(function (value, id) { - if (!keepIsSyncing || value.name !== 'syncing') - _this.removeSubscription(id); - }); - } - - // reset notification callbacks etc. - if (this.provider.reset) - this.provider.reset(); - - return true - } catch (e) { - throw new Error(`Error while clearing subscriptions: ${e}`) - } -}; - -/** - * Evaluates WS close event - * - * @method _isCleanClose - * - * @param {CloseEvent | boolean} event WS close event or exception flag - * - * @returns {boolean} - */ -RequestManager.prototype._isCleanCloseEvent = function (event) { - return typeof event === 'object' && ([1000].includes(event.code) || event.wasClean === true); -}; - -/** - * Detects Ipc close error. The node.net module emits ('close', isException) - * - * @method _isIpcCloseError - * - * @param {CloseEvent | boolean} event WS close event or exception flag - * - * @returns {boolean} - */ -RequestManager.prototype._isIpcCloseError = function (event) { - return typeof event === 'boolean' && event; -}; - -/** - * The jsonrpc result callback for RequestManager.send - * - * @method _jsonrpcResultCallback - * - * @param {Function} callback the callback to use - * @param {Object} payload the jsonrpc payload - * - * @returns {Function} return callback of form (err, result) - * - */ -RequestManager.prototype._jsonrpcResultCallback = function (callback, payload) { - return function (err, result) { - if (result && result.id && payload.id !== result.id) { - return callback(new Error(`Wrong response id ${result.id} (expected: ${payload.id}) in ${JSON.stringify(payload)}`)); - } - - if (err) { - return callback(err); - } - - if (result && result.error) { - return callback(errors.ErrorResponse(result)); - } - - if (!Jsonrpc.isValidResponse(result)) { - return callback(errors.InvalidResponse(result)); - } - - callback(null, result.result); - } -}; - -module.exports = { - Manager: RequestManager, - BatchManager: BatchManager -}; diff --git a/packages/web3-core-requestmanager/src/jsonrpc.js b/packages/web3-core-requestmanager/src/jsonrpc.js deleted file mode 100644 index dfb90184203..00000000000 --- a/packages/web3-core-requestmanager/src/jsonrpc.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file jsonrpc.js - * @authors: - * Fabian Vogelsteller - * Marek Kotewicz - * Aaron Kumavis - * @date 2015 - */ - -"use strict"; - -// Initialize Jsonrpc as a simple object with utility functions. -var Jsonrpc = { - messageId: 0 -}; - -/** - * Should be called to valid json create payload object - * - * @method toPayload - * @param {Function} method of jsonrpc call, required - * @param {Array} params, an array of method params, optional - * @returns {Object} valid jsonrpc payload object - */ -Jsonrpc.toPayload = function (method, params) { - if (!method) { - throw new Error('JSONRPC method should be specified for params: "'+ JSON.stringify(params) +'"!'); - } - - // advance message ID - Jsonrpc.messageId++; - - return { - jsonrpc: '2.0', - id: Jsonrpc.messageId, - method: method, - params: params || [] - }; -}; - -/** - * Should be called to check if jsonrpc response is valid - * - * @method isValidResponse - * @param {Object} - * @returns {Boolean} true if response is valid, otherwise false - */ -Jsonrpc.isValidResponse = function (response) { - return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response); - - function validateSingleMessage(message){ - return !!message && - !message.error && - message.jsonrpc === '2.0' && - (typeof message.id === 'number' || typeof message.id === 'string') && - message.result !== undefined; // only undefined is not valid json object - } -}; - -/** - * Should be called to create batch payload object - * - * @method toBatchPayload - * @param {Array} messages, an array of objects with method (required) and params (optional) fields - * @returns {Array} batch payload - */ -Jsonrpc.toBatchPayload = function (messages) { - return messages.map(function (message) { - return Jsonrpc.toPayload(message.method, message.params); - }); -}; - -module.exports = Jsonrpc; - diff --git a/packages/web3-core-requestmanager/tsconfig.json b/packages/web3-core-requestmanager/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-core-requestmanager/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-core-subscriptions/README.md b/packages/web3-core-subscriptions/README.md deleted file mode 100644 index c41b3ded74f..00000000000 --- a/packages/web3-core-subscriptions/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# web3-core-subscriptions - -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url]tus][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] - -This is a sub-package of [web3.js][repo] - -This subscriptions package is used within some [web3.js][repo] packages. - -Please read the [documentation][docs] for more. - -## Installation - -### Node.js - -```bash -npm install web3-core-subscriptions -``` - -## Usage - -```js -const Web3Subscriptions = require('web3-core-subscriptions'); - -const sub = new Web3Subscriptions({ - name: 'subscribe', - type: 'eth', - subscriptions: { - 'newBlockHeaders': { - subscriptionName: 'newHeads', - params: 0, - outputFormatter: formatters.outputBlockFormatter - }, - 'pendingTransactions': { - params: 0, - outputFormatter: formatters.outputTransactionFormatter - } - } -}); -sub.attachToObject(myCoolLib); - -myCoolLib.subscribe('newBlockHeaders', function(){ ... }); -``` - -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-core-subscriptions.svg -[npm-url]: https://npmjs.org/package/web3-core-subscriptions -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-core-subscriptions -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-core-subscriptions -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-core-subscriptions -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-core-subscriptions - diff --git a/packages/web3-core-subscriptions/package-lock.json b/packages/web3-core-subscriptions/package-lock.json deleted file mode 100644 index 3c4287dac77..00000000000 --- a/packages/web3-core-subscriptions/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-core-subscriptions", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-core-subscriptions/package.json b/packages/web3-core-subscriptions/package.json deleted file mode 100644 index 65031375d64..00000000000 --- a/packages/web3-core-subscriptions/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "web3-core-subscriptions", - "version": "1.3.0", - "description": "Manages web3 subscriptions. This is an internal package.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-core-subscriptions", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } -} diff --git a/packages/web3-core-subscriptions/src/index.js b/packages/web3-core-subscriptions/src/index.js deleted file mode 100644 index 113f6757fd9..00000000000 --- a/packages/web3-core-subscriptions/src/index.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var Subscription = require('./subscription.js'); - - -var Subscriptions = function Subscriptions(options) { - this.name = options.name; - this.type = options.type; - this.subscriptions = options.subscriptions || {}; - this.requestManager = null; -}; - - -Subscriptions.prototype.setRequestManager = function (rm) { - this.requestManager = rm; -}; - - -Subscriptions.prototype.attachToObject = function (obj) { - var func = this.buildCall(); - var name = this.name.split('.'); - if (name.length > 1) { - obj[name[0]] = obj[name[0]] || {}; - obj[name[0]][name[1]] = func; - } else { - obj[name[0]] = func; - } -}; - - -Subscriptions.prototype.buildCall = function() { - var _this = this; - - return function(){ - if(!_this.subscriptions[arguments[0]]) { - console.warn('Subscription '+ JSON.stringify(arguments[0]) +' doesn\'t exist. Subscribing anyway.'); - } - - var subscription = new Subscription({ - subscription: _this.subscriptions[arguments[0]] || {}, // Subscript might not exist - requestManager: _this.requestManager, - type: _this.type - }); - - return subscription.subscribe.apply(subscription, arguments); - }; -}; - - -module.exports = { - subscriptions: Subscriptions, - subscription: Subscription -}; diff --git a/packages/web3-core-subscriptions/src/subscription.js b/packages/web3-core-subscriptions/src/subscription.js deleted file mode 100644 index 9303b98401d..00000000000 --- a/packages/web3-core-subscriptions/src/subscription.js +++ /dev/null @@ -1,336 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file subscription.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var _ = require('underscore'); -var errors = require('web3-core-helpers').errors; -var EventEmitter = require('eventemitter3'); -var formatters = require('web3-core-helpers').formatters; - -function Subscription(options) { - EventEmitter.call(this); - - this.id = null; - this.callback = _.identity; - this.arguments = null; - this.lastBlock = null; // "from" block tracker for backfilling events on reconnection - - this.options = { - subscription: options.subscription, - type: options.type, - requestManager: options.requestManager - }; -} - -// INHERIT -Subscription.prototype = Object.create(EventEmitter.prototype); -Subscription.prototype.constructor = Subscription; - - -/** - * Should be used to extract callback from array of arguments. Modifies input param - * - * @method extractCallback - * @param {Array} arguments - * @return {Function|Null} callback, if exists - */ - -Subscription.prototype._extractCallback = function (args) { - if (_.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } -}; - -/** - * Should be called to check if the number of arguments is correct - * - * @method validateArgs - * @param {Array} arguments - * @throws {Error} if it is not - */ - -Subscription.prototype._validateArgs = function (args) { - var subscription = this.options.subscription; - - if(!subscription) - subscription = {}; - - if(!subscription.params) - subscription.params = 0; - - if (args.length !== subscription.params) { - throw errors.InvalidNumberOfParams( - args.length, - subscription.params, - subscription.subscriptionName - ); - } -}; - -/** - * Should be called to format input args of method - * - * @method formatInput - * @param {Array} - * @return {Array} - */ - -Subscription.prototype._formatInput = function (args) { - var subscription = this.options.subscription; - - if (!subscription) { - return args; - } - - if (!subscription.inputFormatter) { - return args; - } - - var formattedArgs = subscription.inputFormatter.map(function (formatter, index) { - return formatter ? formatter(args[index]) : args[index]; - }); - - return formattedArgs; -}; - -/** - * Should be called to format output(result) of method - * - * @method formatOutput - * @param result {Object} - * @return {Object} - */ - -Subscription.prototype._formatOutput = function (result) { - var subscription = this.options.subscription; - - return (subscription && subscription.outputFormatter && result) ? subscription.outputFormatter(result) : result; -}; - -/** - * Should create payload from given input args - * - * @method toPayload - * @param {Array} args - * @return {Object} - */ -Subscription.prototype._toPayload = function (args) { - var params = []; - this.callback = this._extractCallback(args) || _.identity; - - if (!this.subscriptionMethod) { - this.subscriptionMethod = args.shift(); - - // replace subscription with given name - if (this.options.subscription.subscriptionName) { - this.subscriptionMethod = this.options.subscription.subscriptionName; - } - } - - if (!this.arguments) { - this.arguments = this._formatInput(args); - this._validateArgs(this.arguments); - args = []; // make empty after validation - - } - - // re-add subscriptionName - params.push(this.subscriptionMethod); - params = params.concat(this.arguments); - - - if (args.length) { - throw new Error('Only a callback is allowed as parameter on an already instantiated subscription.'); - } - - return { - method: this.options.type + '_subscribe', - params: params - }; -}; - -/** - * Unsubscribes and clears callbacks - * - * @method unsubscribe - * @return {Object} - */ -Subscription.prototype.unsubscribe = function(callback) { - this.options.requestManager.removeSubscription(this.id, callback); - this.id = null; - this.lastBlock = null; - this.removeAllListeners(); -}; - -/** - * Subscribes and watches for changes - * - * @method subscribe - * @param {String} subscription the subscription - * @param {Object} options the options object with address topics and fromBlock - * @return {Object} - */ -Subscription.prototype.subscribe = function() { - var _this = this; - var args = Array.prototype.slice.call(arguments); - var payload = this._toPayload(args); - - if(!payload) { - return this; - } - - // throw error, if provider is not set - if(!this.options.requestManager.provider) { - setTimeout(function(){ - var err1 = new Error('No provider set.'); - _this.callback(err1, null, _this); - _this.emit('error', err1); - },0); - - return this; - } - - // throw error, if provider doesnt support subscriptions - if(!this.options.requestManager.provider.on) { - setTimeout(function(){ - var err2 = new Error( - 'The current provider doesn\'t support subscriptions: ' + - _this.options.requestManager.provider.constructor.name - ); - _this.callback(err2, null, _this); - _this.emit('error', err2); - },0); - - return this; - } - - // Re-subscription only: continue fetching from the last block we received. - // a dropped connection may have resulted in gaps in the logs... - if (this.lastBlock && _.isObject(this.options.params)){ - payload.params[1] = this.options.params; - payload.params[1].fromBlock = formatters.inputBlockNumberFormatter(this.lastBlock + 1); - } - - // if id is there unsubscribe first - if (this.id) { - this.unsubscribe(); - } - - // store the params in the options object - this.options.params = payload.params[1]; - - // get past logs, if fromBlock is available - if(payload.params[0] === 'logs' && _.isObject(payload.params[1]) && payload.params[1].hasOwnProperty('fromBlock') && isFinite(payload.params[1].fromBlock)) { - // send the subscription request - - // copy the params to avoid race-condition with deletion below this block - var blockParams = Object.assign({}, payload.params[1]); - - this.options.requestManager.send({ - method: 'eth_getLogs', - params: [blockParams] - }, function (err, logs) { - if(!err) { - logs.forEach(function(log){ - var output = _this._formatOutput(log); - _this.callback(null, output, _this); - _this.emit('data', output); - }); - - // TODO subscribe here? after the past logs? - - } else { - setTimeout(function(){ - _this.callback(err, null, _this); - _this.emit('error', err); - },0); - } - }); - } - - // create subscription - // TODO move to separate function? so that past logs can go first? - - if(typeof payload.params[1] === 'object') - delete payload.params[1].fromBlock; - - this.options.requestManager.send(payload, function (err, result) { - if(!err && result) { - _this.id = result; - _this.method = payload.params[0]; - _this.emit('connected', result); - - // call callback on notifications - _this.options.requestManager.addSubscription(_this, function(error, result) { - if (!error) { - if (!_.isArray(result)) { - result = [result]; - } - - result.forEach(function(resultItem) { - var output = _this._formatOutput(resultItem); - - // Track current block (for gaps introduced by dropped connections) - _this.lastBlock = _.isObject(output) ? output.blockNumber : null; - - if (_.isFunction(_this.options.subscription.subscriptionHandler)) { - return _this.options.subscription.subscriptionHandler.call(_this, output); - } else { - _this.emit('data', output); - } - - // call the callback, last so that unsubscribe there won't affect the emit above - _this.callback(null, output, _this); - }); - } else { - _this.callback(error, false, _this); - _this.emit('error', error); - } - }); - } else { - setTimeout(function(){ - _this.callback(err, false, _this); - _this.emit('error', err); - },0); - } - }); - - // return an object to cancel the subscription - return this; -}; - -/** - * Resubscribe - * - * @method resubscribe - * - * @returns {void} - */ -Subscription.prototype.resubscribe = function () { - this.options.requestManager.removeSubscription(this.id); // unsubscribe - this.id = null; - - this.subscribe(this.callback); -}; - -module.exports = Subscription; diff --git a/packages/web3-core-subscriptions/tsconfig.json b/packages/web3-core-subscriptions/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-core-subscriptions/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-core-subscriptions/types/index.d.ts b/packages/web3-core-subscriptions/types/index.d.ts deleted file mode 100644 index 634fc620868..00000000000 --- a/packages/web3-core-subscriptions/types/index.d.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Samuel Furter - * @date 2019 - */ - -export class Subscription { - constructor(options: SubscriptionOptions); - - id: string; - options: SubscriptionOptions; - callback: () => void; - arguments: any; - lastBlock: number; - - subscribe(callback?: (error: Error, result: T) => void): Subscription; - - unsubscribe( - callback?: (error: Error, result: boolean) => void - ): Promise; - - on(type: 'data', handler: (data: T) => void): Subscription; - - on(type: 'changed', handler: (data: T) => void): Subscription; - - on(type: 'connected', handler: (subscriptionId: string) => void): Subscription; - - on(type: 'error', handler: (data: Error) => void): Subscription; -} - -export class Subscriptions { - constructor(options: SubscriptionsOptions); - - name: string; - type: string; - subscriptions: SubscriptionsModel; - readonly requestManager: any; - - attachToObject(obj: any): void; - - setRequestManager(requestManager: any): void; - - buildCall(): () => any; -} - -export interface SubscriptionOptions { - subscription: string; - type: string; - requestManager: any; -} - -export interface SubscriptionsOptions { - name: string; - type: string; - subscriptions: SubscriptionsModel; -} - -export interface SubscriptionsModel { - [name: string]: SubscriptionModel; -} - -export interface SubscriptionModel { - subscriptionName: string; - params: number; - outputFormatter: () => void; - inputFormatter: Array<() => void>; - subscriptionHandler: () => void; -} diff --git a/packages/web3-core-subscriptions/types/tests/subscriptions.tests.ts b/packages/web3-core-subscriptions/types/tests/subscriptions.tests.ts deleted file mode 100644 index 0d4f8ce592f..00000000000 --- a/packages/web3-core-subscriptions/types/tests/subscriptions.tests.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file subscriptions-tests.ts - * @author Samuel Furter - * @date 2019 - */ - -import {Subscriptions, Subscription} from 'web3-core-subscriptions'; - -const subscriptions = new Subscriptions({ - name: '', - type: '', - subscriptions: - { - test: { - subscriptionName: '', - inputFormatter: [() => {}], - outputFormatter: () => {}, - params: 0, - subscriptionHandler: () => {} - } - } -}); - -// $ExpectType string -subscriptions.name; - -// $ExpectType string -subscriptions.type; - -// $ExpectType SubscriptionsModel -subscriptions.subscriptions; - -// $ExpectType void -subscriptions.setRequestManager({}); - -// $ExpectType void -subscriptions.attachToObject({}); - -// $ExpectType () => any -subscriptions.buildCall(); - -const subscription = new Subscription({subscription: '', type: '', requestManager: null}); - -// $ExpectType string -subscription.id; - -// $ExpectType () => void -subscription.callback; - -// $ExpectType any -subscription.arguments; - -// $ExpectType SubscriptionOptions -subscription.options; - -// $ExpectType number -subscription.lastBlock; - -// $ExpectType Subscription -subscription.subscribe(() => {}); - -// $ExpectType Promise -subscription.unsubscribe(() => {}); - -// $ExpectType Subscription -subscription.on('data', () => {}); - -// $ExpectType Subscription -subscription.on('changed', () => {}); - -// $ExpectType Subscription -subscription.on('error', () => {}); - -// $ExpectType Subscription -subscription.on('connected', () => {}); diff --git a/packages/web3-core-subscriptions/types/tsconfig.json b/packages/web3-core-subscriptions/types/tsconfig.json deleted file mode 100644 index 4fa0faa5998..00000000000 --- a/packages/web3-core-subscriptions/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-core-subscriptions": ["."] - } - } -} diff --git a/packages/web3-core-subscriptions/types/tslint.json b/packages/web3-core-subscriptions/types/tslint.json deleted file mode 100644 index 2a4469808b0..00000000000 --- a/packages/web3-core-subscriptions/types/tslint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false, - "no-redundant-jsdoc": false - } -} diff --git a/packages/web3-core/.eslintignore b/packages/web3-core/.eslintignore new file mode 100644 index 00000000000..e3d7e665285 --- /dev/null +++ b/packages/web3-core/.eslintignore @@ -0,0 +1,4 @@ +dist +lib +jest.config.js +.eslintrc.js diff --git a/packages/web3-core/.eslintrc.js b/packages/web3-core/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-core/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-core/.gitignore b/packages/web3-core/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-core/.npmignore b/packages/web3-core/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-core/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-core/.prettierignore b/packages/web3-core/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-core/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-core/.prettierrc.json b/packages/web3-core/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-core/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-core/CHANGELOG.md b/packages/web3-core/CHANGELOG.md new file mode 100644 index 00000000000..39d574bcd43 --- /dev/null +++ b/packages/web3-core/CHANGELOG.md @@ -0,0 +1,210 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Added + +- If the response error was `execution reverted`, raise `ContractExecutionError` and pass the response error to it in order to be set as `innerError` (this innerError will be decoded at web3-eth-contract if its ABI was provided according to EIP-838). (#5434) +- `registerPlugin` method to `Web3Context` (#5393) +- `Web3PluginBase` exported abstract class (#5393) +- `Web3EthPluginBase` exported abstract class (#5393) + +### Changed + +- Default value for `API` generic for `Web3ContextObject` from `any` to `unknown` (#5393) +- Default value for `API` generic for `Web3ContextInitOptions` from `any` to `unknown` (#5393) +- Added validation when `defaultHardfork` and `defaultCommon.hardfork` are different in web3config +- Added validation when `defaultChain` and `defaultCommon.basechain` are different in web3config +- Added a new configuration variable `enableExperimentalFeatures`. (#5481) + +## [4.0.1-alpha.2] + +### Fixed + +- Make the `request` method of `EIP1193Provider` class, compatible with EIP 1193 (#5591) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Added + +- Added rpc exception codes following eip-1474 as an experimental feature (if `useRpcCallSpecification` at `enableExperimentalFeatures` is `true`) (#5525) +- Added support of `safe` and `finalized` block tags (#5823) + +## [4.0.1-rc.1] + +### Added + +- Added hybrid build (ESM and CJS) of library (#5904) +- Added source files (#5956) + +### Changed + +- If a transaction object with a `data` property is passed to `txInputOptionsFormatter`, it will now be replaced with `input` (#5915) +- The types `TransactionTypeParser` and `TransactionBuilder` are now utilizing the type `Transaction` for the transaction object. (#5993) +- No need for polyfilling nodejs `net` and `fs` modules (#5978) +- Removed IPC provider dependency, IPC path is no longer viable provider. If you wanna use IPC, please install `web3-providers-ipc` and instantiate provider yourself (#5978) + +### Removed + +- `getConfig` method from `Web3Config` class, `config` is now public and accessible using `Web3Config.config` (#5950) +- Error param in the `messageListener` in subscription was removed (triggered by `.on('data')` or `.on('message')`) to properly support all providers. (#6082) + +## [4.0.1-rc.2] + +### Changed + +- Replaced Buffer for Uint8Array (#6004) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Added + +- Web3Subscription constructor accept a Subscription Manager (as an alternative to accepting Request Manager that is now marked marked as deprecated) (#6210) + +### Changed + +- Web3Subscription constructor overloading that accept a Request Manager is marked as deprecated (#6210) + +### Fixed + +- Fixed Batch requests erroring out on one request (#6164) +- Fixed the issue: Subscribing to multiple blockchain events causes every listener to be fired for every registered event (#6210) +- Fixed the issue: Unsubscribe at a Web3Subscription class will still have the id of the subscription at the Web3SubscriptionManager (#6210) +- Fixed the issue: A call to the provider is made for every subscription object (#6210) + +## [4.0.3] + +### Added + +- Expose `subscriptionManager` as a `protected get` at `Web3Subscription` to be able to use it inside custom subscriptions, if needed. (#6285) + +### Changed + +- Dependencies updated + +## [4.1.0] + +### Changed + +- No need to pass `CommonSubscriptionEvents &` at every child class of `Web3Subscription` (#6262) +- Implementation of `_processSubscriptionResult` and `_processSubscriptionError` has been written in the base class `Web3Subscription` and maid `public`. (#6262) +- A new optional protected method `formatSubscriptionResult` could be used to customize data formatting instead of re-implementing `_processSubscriptionResult`. (#6262) +- No more needed to pass `CommonSubscriptionEvents & ` for the first generic parameter of `Web3Subscription` when inheriting from it. (#6262) + +### Fixed + +- Fixed the issue: "Version 4.x does not fire connected event for subscriptions. #6252". (#6262) + +### Added + +- Added minimum support of web3.extend function + +## [4.1.1] + +### Fixed + +- Fixed rpc errors not being sent as an inner error when using the `send` method on request manager (#6300). + +### Added + +- To fix issue #6190, added the functionality to introduce different timeout value for Web3. (#6336) + +## [4.2.0] + +### Added + +- Added to `Web3Config` property `contractDataInputFill` allowing users to have the choice using property `data`, `input` or `both` for contract methods to be sent to the RPC provider when creating contracts. (#6377) (#6400) + +## [4.3.0] + +### Changed + +- defaultTransactionType is now type 0x2 instead of 0x0 (#6282) +- Allows formatter to parse large base fee (#6456) +- The package now uses `EventEmitter` from `web3-utils` that works in node envrioment as well as in the browser. (#6398) + +### Fixed + +- Fix the issue: "Uncaught TypeError: Class extends value undefined is not a constructor or null #6371". (#6398) + +## [4.3.1] + +### Fixed + +- Fix `Web3Config` to properly update within other web3 packages when `setConfig` is used (#6555) + +### Added + +- Added `isMetaMaskProvider` function to check if provider is metamask (#6534) + +## [4.3.2] + +### Changed + +- Web3config `contractDataInputFill` has been defaulted to `data`, istead of `input`. (#6622) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-core/README.md b/packages/web3-core/README.md index 7b1269b67e9..a5a2110742c 100644 --- a/packages/web3-core/README.md +++ b/packages/web3-core/README.md @@ -1,48 +1,59 @@ -# web3-core +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Web3 Core -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -The core package contains core functions for [web3.js][repo] packages. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-core` package contains core functions for [web3.js][repo] packages. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-core) or using [Yarn](https://yarnpkg.com/package/web3-core) + +### Using NPM ```bash npm install web3-core ``` -## Usage +### Using Yarn + +```bash +yarn add web3-core +``` + +## Getting Started -```js -const core = require('web3-core'); +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) -const CoolLib = function CoolLib() { - // sets _requestmanager and adds basic functions - core.packageInit(this, arguments); -}; +## Prerequisites -CoolLib.providers; -CoolLib.givenProvider; -CoolLib.setProvider(); -CoolLib.BatchRequest(); -CoolLib.extend(); -... -``` +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) -## Types +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-core.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-core +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-core%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-core -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-core -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-core -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-core -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-core +[downloads-image]: https://img.shields.io/npm/dm/web3-core?label=npm%20downloads diff --git a/packages/web3-core/assets/logo/web3js.ai b/packages/web3-core/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-core/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-core/assets/logo/web3js.jpg b/packages/web3-core/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-core/assets/logo/web3js.jpg differ diff --git a/packages/web3-core/assets/logo/web3js.svg b/packages/web3-core/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-core/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-core/package-lock.json b/packages/web3-core/package-lock.json deleted file mode 100644 index 61494941ead..00000000000 --- a/packages/web3-core/package-lock.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "web3-core", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==" - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" - }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - } - } -} diff --git a/packages/web3-core/package.json b/packages/web3-core/package.json index 66a822489ab..6552a6d8bf4 100644 --- a/packages/web3-core/package.json +++ b/packages/web3-core/package.json @@ -1,29 +1,73 @@ { - "name": "web3-core", - "version": "1.3.0", - "description": "Web3 core tools for sub-packages. This is an internal package.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-core", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "@types/bn.js": "^4.11.5", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-requestmanager": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-core", + "version": "4.3.2", + "description": "Web3 core tools for sub-packages. This is an internal package.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "dependencies": { + "web3-errors": "^1.1.4", + "web3-eth-iban": "^4.0.7", + "web3-eth-accounts": "^4.1.0", + "web3-providers-http": "^4.1.0", + "web3-providers-ws": "^4.0.7", + "web3-types": "^1.3.1", + "web3-utils": "^4.1.0", + "web3-validator": "^2.0.3" + }, + "optionalDependencies": { + "web3-providers-ipc": "^4.0.7" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@types/jest-when": "^3.5.2", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "jest-when": "^3.5.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + } } diff --git a/packages/web3-core/src/extend.js b/packages/web3-core/src/extend.js deleted file mode 100644 index c8b787848fd..00000000000 --- a/packages/web3-core/src/extend.js +++ /dev/null @@ -1,69 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file extend.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - - -var formatters = require('web3-core-helpers').formatters; -var Method = require('web3-core-method'); -var utils = require('web3-utils'); - - -var extend = function (pckg) { - /* jshint maxcomplexity:5 */ - var ex = function (extension) { - - var extendedObject; - if (extension.property) { - if (!pckg[extension.property]) { - pckg[extension.property] = {}; - } - extendedObject = pckg[extension.property]; - } else { - extendedObject = pckg; - } - - if (extension.methods) { - extension.methods.forEach(function (method) { - if(!(method instanceof Method)) { - method = new Method(method); - } - - method.attachToObject(extendedObject); - method.setRequestManager(pckg._requestManager); - }); - } - - return pckg; - }; - - ex.formatters = formatters; - ex.utils = utils; - ex.Method = Method; - - return ex; -}; - - - -module.exports = extend; - diff --git a/packages/web3-core/src/formatters.ts b/packages/web3-core/src/formatters.ts new file mode 100644 index 00000000000..b6d6af3bd3b --- /dev/null +++ b/packages/web3-core/src/formatters.ts @@ -0,0 +1,551 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { FormatterError } from 'web3-errors'; +import { Iban } from 'web3-eth-iban'; +import { + BlockTags, + Filter, + Numbers, + Topic, + BlockInput, + BlockOutput, + LogsInput, + LogsOutput, + Mutable, + PostInput, + PostOutput, + Proof, + ReceiptInput, + ReceiptOutput, + SyncInput, + SyncOutput, + TransactionInput, + TransactionOutput, +} from 'web3-types'; +import { + fromUtf8, + hexToNumber, + hexToNumberString, + isAddress, + isHexStrict, + mergeDeep, + numberToHex, + sha3Raw, + toChecksumAddress, + toNumber, + toUtf8, + utf8ToHex, +} from 'web3-utils'; +import { isBlockTag, isHex, isNullish } from 'web3-validator'; + +/* eslint-disable deprecation/deprecation */ +/** + * @deprecated Use format function from web3-utils package instead + * Will format the given storage key array values to hex strings. + */ +export const inputStorageKeysFormatter = (keys: Array) => keys.map(num => numberToHex(num)); + +/** + * @deprecated Use format function from web3-utils package instead + * Will format the given proof response from the node. + */ +export const outputProofFormatter = (proof: Proof): Proof => ({ + address: toChecksumAddress(proof.address), + nonce: hexToNumberString(proof.nonce), + balance: hexToNumberString(proof.balance), +}); + +/** + * @deprecated Use format function from web3-utils package instead + * Should the format output to a big number + */ +export const outputBigIntegerFormatter = (number: Numbers) => toNumber(number); + +/** + * @deprecated Use format function from web3-utils package instead + * Returns the given block number as hex string or the predefined block number 'latest', 'pending', 'earliest', 'genesis' + */ +export const inputBlockNumberFormatter = (blockNumber: Numbers | undefined) => { + if (isNullish(blockNumber)) { + return undefined; + } + + if (typeof blockNumber === 'string' && isBlockTag(blockNumber)) { + return blockNumber; + } + + if (blockNumber === 'genesis') { + return '0x0'; + } + + if (typeof blockNumber === 'string' && isHexStrict(blockNumber)) { + return blockNumber.toLowerCase(); + } + + return numberToHex(blockNumber); +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Returns the given block number as hex string or does return the defaultBlock property of the current module + */ +export const inputDefaultBlockNumberFormatter = ( + blockNumber: Numbers | undefined, + defaultBlock: Numbers, +) => { + if (!blockNumber) { + return inputBlockNumberFormatter(defaultBlock); + } + + return inputBlockNumberFormatter(blockNumber); +}; + +/** + * @deprecated Use format function from web3-utils package instead + * @param address + */ +export const inputAddressFormatter = (address: string): string | never => { + if (Iban.isValid(address) && Iban.isDirect(address)) { + const iban = new Iban(address); + + return iban.toAddress().toLowerCase(); + } + + if (isAddress(address)) { + return `0x${address.toLowerCase().replace('0x', '')}`; + } + + throw new FormatterError( + `Provided address ${address} is invalid, the capitalization checksum test failed, or it's an indirect IBAN address which can't be converted.`, + ); +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the input of a transaction and converts all values to HEX + */ +export const txInputOptionsFormatter = (options: TransactionInput): Mutable => { + const modifiedOptions = { ...options } as unknown as Mutable; + + if (options.to) { + // it might be contract creation + modifiedOptions.to = inputAddressFormatter(options.to); + } + + if (options.data && options.input) { + throw new FormatterError( + 'You can\'t have "data" and "input" as properties of transactions at the same time, please use either "data" or "input" instead.', + ); + } + + if (!options.input && options.data) { + modifiedOptions.input = options.data; + delete modifiedOptions.data; + } + + if (options.input && !options.input.startsWith('0x')) { + modifiedOptions.input = `0x${options.input}`; + } + + if (modifiedOptions.input && !isHexStrict(modifiedOptions.input)) { + throw new FormatterError('The input field must be HEX encoded data.'); + } + + // allow both + if (options.gas || options.gasLimit) { + modifiedOptions.gas = toNumber(options.gas ?? options.gasLimit); + } + + if (options.maxPriorityFeePerGas || options.maxFeePerGas) { + delete modifiedOptions.gasPrice; + } + + ['gasPrice', 'gas', 'value', 'maxPriorityFeePerGas', 'maxFeePerGas', 'nonce', 'chainId'] + .filter(key => !isNullish(modifiedOptions[key])) + .forEach(key => { + modifiedOptions[key] = numberToHex(modifiedOptions[key] as Numbers); + }); + + return modifiedOptions as TransactionOutput; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the input of a transaction and converts all values to HEX + */ +export const inputCallFormatter = (options: TransactionInput, defaultAccount?: string) => { + const opts = txInputOptionsFormatter(options); + + const from = opts.from ?? defaultAccount; + + if (from) { + opts.from = inputAddressFormatter(from); + } + + return opts; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the input of a transaction and converts all values to HEX + */ +export const inputTransactionFormatter = (options: TransactionInput, defaultAccount?: string) => { + const opts = txInputOptionsFormatter(options); + + // check from, only if not number, or object + if (!(typeof opts.from === 'number') && !(!!opts.from && typeof opts.from === 'object')) { + opts.from = opts.from ?? defaultAccount; + + if (!options.from && !(typeof options.from === 'number')) { + throw new FormatterError('The send transactions "from" field must be defined!'); + } + + opts.from = inputAddressFormatter(options.from); + } + + return opts; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Hex encodes the data passed to eth_sign and personal_sign + */ +export const inputSignFormatter = (data: string) => (isHexStrict(data) ? data : utf8ToHex(data)); + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the output of a transaction to its proper values + * @function outputTransactionFormatter + */ +export const outputTransactionFormatter = (tx: TransactionInput): TransactionOutput => { + const modifiedTx = { ...tx } as unknown as Mutable; + + if (tx.blockNumber) { + modifiedTx.blockNumber = hexToNumber(tx.blockNumber); + } + + if (tx.transactionIndex) { + modifiedTx.transactionIndex = hexToNumber(tx.transactionIndex); + } + + modifiedTx.nonce = hexToNumber(tx.nonce); + modifiedTx.gas = hexToNumber(tx.gas); + + if (tx.gasPrice) { + modifiedTx.gasPrice = outputBigIntegerFormatter(tx.gasPrice); + } + + if (tx.maxFeePerGas) { + modifiedTx.maxFeePerGas = outputBigIntegerFormatter(tx.maxFeePerGas); + } + + if (tx.maxPriorityFeePerGas) { + modifiedTx.maxPriorityFeePerGas = outputBigIntegerFormatter(tx.maxPriorityFeePerGas); + } + + if (tx.type) { + modifiedTx.type = hexToNumber(tx.type); + } + + modifiedTx.value = outputBigIntegerFormatter(tx.value); + + if (tx.to && isAddress(tx.to)) { + // tx.to could be `0x0` or `null` while contract creation + modifiedTx.to = toChecksumAddress(tx.to); + } else { + modifiedTx.to = undefined; // set to `null` if invalid address + } + + if (tx.from) { + modifiedTx.from = toChecksumAddress(tx.from); + } + + return modifiedTx; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * @param topic + */ +// To align with specification we use the type "null" here +// eslint-disable-next-line @typescript-eslint/ban-types +export const inputTopicFormatter = (topic: Topic): Topic | null => { + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + if (isNullish(topic)) return null; + + const value = String(topic); + + return isHex(value) ? value : fromUtf8(value); +}; + +/** + * @deprecated Use format function from web3-utils package instead + * @param filter + */ +export const inputLogFormatter = (filter: Filter) => { + const val: Mutable = isNullish(filter) + ? {} + : mergeDeep({}, filter as Record); + + // If options !== undefined, don't blow out existing data + if (isNullish(val.fromBlock)) { + val.fromBlock = BlockTags.LATEST; + } + + val.fromBlock = inputBlockNumberFormatter(val.fromBlock); + + if (!isNullish(val.toBlock)) { + val.toBlock = inputBlockNumberFormatter(val.toBlock); + } + + // make sure topics, get converted to hex + val.topics = val.topics ?? []; + val.topics = val.topics.map(topic => + Array.isArray(topic) + ? (topic.map(inputTopicFormatter) as Topic[]) + : inputTopicFormatter(topic as Topic), + ); + + if (val.address) { + val.address = Array.isArray(val.address) + ? val.address.map(addr => inputAddressFormatter(addr)) + : inputAddressFormatter(val.address); + } + + return val as Filter; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the output of a log + * @function outputLogFormatter + */ +export const outputLogFormatter = (log: Partial): LogsOutput => { + const modifiedLog = { ...log } as unknown as Mutable; + + const logIndex = + typeof log.logIndex === 'string' + ? log.logIndex + : numberToHex(log.logIndex as unknown as number); + + // generate a custom log id + if (typeof log.blockHash === 'string' && typeof log.transactionHash === 'string') { + const shaId = sha3Raw( + `${log.blockHash.replace('0x', '')}${log.transactionHash.replace( + '0x', + '', + )}${logIndex.replace('0x', '')}`, + ); + modifiedLog.id = `log_${shaId.replace('0x', '').slice(0, 8)}`; + } else if (!log.id) { + modifiedLog.id = undefined; + } + + if (log.blockNumber && isHexStrict(log.blockNumber)) { + modifiedLog.blockNumber = hexToNumber(log.blockNumber); + } + if (log.transactionIndex && isHexStrict(log.transactionIndex)) { + modifiedLog.transactionIndex = hexToNumber(log.transactionIndex); + } + + if (log.logIndex && isHexStrict(log.logIndex)) { + modifiedLog.logIndex = hexToNumber(log.logIndex); + } + + if (log.address) { + modifiedLog.address = toChecksumAddress(log.address); + } + + return modifiedLog; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the output of a transaction receipt to its proper values + */ +export const outputTransactionReceiptFormatter = (receipt: ReceiptInput): ReceiptOutput => { + if (typeof receipt !== 'object') { + throw new FormatterError(`Received receipt is invalid: ${String(receipt)}`); + } + const modifiedReceipt = { ...receipt } as unknown as Mutable; + + if (receipt.blockNumber) { + modifiedReceipt.blockNumber = hexToNumber(receipt.blockNumber); + } + + if (receipt.transactionIndex) { + modifiedReceipt.transactionIndex = hexToNumber(receipt.transactionIndex); + } + + modifiedReceipt.cumulativeGasUsed = hexToNumber(receipt.cumulativeGasUsed); + modifiedReceipt.gasUsed = hexToNumber(receipt.gasUsed); + + if (receipt.logs && Array.isArray(receipt.logs)) { + modifiedReceipt.logs = receipt.logs.map(outputLogFormatter); + } + + if (receipt.effectiveGasPrice) { + modifiedReceipt.effectiveGasPrice = hexToNumber(receipt.effectiveGasPrice); + } + + if (receipt.contractAddress) { + modifiedReceipt.contractAddress = toChecksumAddress(receipt.contractAddress); + } + + if (receipt.status) { + modifiedReceipt.status = Boolean(parseInt(receipt.status, 10)); + } + + return modifiedReceipt; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the output of a block to its proper values + * @function outputBlockFormatter + */ +export const outputBlockFormatter = (block: BlockInput): BlockOutput => { + const modifiedBlock = { ...block } as unknown as Mutable; + + // transform to number + modifiedBlock.gasLimit = hexToNumber(block.gasLimit); + modifiedBlock.gasUsed = hexToNumber(block.gasUsed); + modifiedBlock.size = hexToNumber(block.size); + modifiedBlock.timestamp = hexToNumber(block.timestamp); + + if (block.number) { + modifiedBlock.number = hexToNumber(block.number); + } + + if (block.difficulty) { + modifiedBlock.difficulty = outputBigIntegerFormatter(block.difficulty); + } + + if (block.totalDifficulty) { + modifiedBlock.totalDifficulty = outputBigIntegerFormatter(block.totalDifficulty); + } + + if (block.transactions && Array.isArray(block.transactions)) { + modifiedBlock.transactions = block.transactions.map(outputTransactionFormatter); + } + + if (block.miner) { + modifiedBlock.miner = toChecksumAddress(block.miner); + } + + if (block.baseFeePerGas) { + modifiedBlock.baseFeePerGas = outputBigIntegerFormatter(block.baseFeePerGas); + } + + return modifiedBlock; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the input of a whisper post and converts all values to HEX + */ +export const inputPostFormatter = (post: PostOutput): PostInput => { + const modifiedPost = { ...post } as unknown as Mutable; + + if (post.ttl) { + modifiedPost.ttl = numberToHex(post.ttl); + } + + if (post.workToProve) { + modifiedPost.workToProve = numberToHex(post.workToProve); + } + + if (post.priority) { + modifiedPost.priority = numberToHex(post.priority); + } + + // fallback + if (post.topics && !Array.isArray(post.topics)) { + modifiedPost.topics = post.topics ? [post.topics] : []; + } + + // format the following options + modifiedPost.topics = modifiedPost.topics?.map(topic => + topic.startsWith('0x') ? topic : fromUtf8(topic), + ); + + return modifiedPost; +}; + +/** + * @deprecated Use format function from web3-utils package instead + * Formats the output of a received post message + * @function outputPostFormatter + */ +export const outputPostFormatter = (post: PostInput): PostOutput => { + const modifiedPost = { ...post } as unknown as Mutable; + + if (post.expiry) { + modifiedPost.expiry = hexToNumber(post.expiry); + } + + if (post.sent) { + modifiedPost.sent = hexToNumber(post.sent); + } + + if (post.ttl) { + modifiedPost.ttl = hexToNumber(post.ttl); + } + + if (post.workProved) { + modifiedPost.workProved = hexToNumber(post.workProved); + } + + // post.payloadRaw = post.payload; + // post.payload = utils.hexToAscii(post.payload); + + // if (utils.isJson(post.payload)) { + // post.payload = JSON.parse(post.payload); + // } + + // format the following options + if (!post.topics) { + modifiedPost.topics = []; + } + + modifiedPost.topics = modifiedPost.topics?.map(toUtf8); + + return modifiedPost; +}; + +/** + * @deprecated Use format function from web3-utils package instead + */ +export const outputSyncingFormatter = (result: SyncInput): SyncOutput => { + const modifiedResult = { ...result } as unknown as Mutable; + + modifiedResult.startingBlock = hexToNumber(result.startingBlock); + modifiedResult.currentBlock = hexToNumber(result.currentBlock); + modifiedResult.highestBlock = hexToNumber(result.highestBlock); + + if (result.knownStates) { + modifiedResult.knownStates = hexToNumber(result.knownStates); + } + + if (result.pulledStates) { + modifiedResult.pulledStates = hexToNumber(result.pulledStates); + } + + return modifiedResult; +}; diff --git a/packages/web3-core/src/index.js b/packages/web3-core/src/index.js deleted file mode 100644 index ba98b80a35c..00000000000 --- a/packages/web3-core/src/index.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -const requestManager = require("web3-core-requestmanager"); -const extend = require("./extend"); - -const packageInit = (pkg, args) => { - args = Array.prototype.slice.call(args); - - if (!pkg) { - throw new Error('You need to instantiate using the "new" keyword.'); - } - - // make property of pkg._provider, which can properly set providers - Object.defineProperty(pkg, 'currentProvider', { - get: () => { - return pkg._provider; - }, - set: (value) => { - return pkg.setProvider(value); - }, - enumerable: true, - configurable: true - }); - - // inherit from parent package or create a new RequestManager - if (args[0] && args[0]._requestManager) { - pkg._requestManager = args[0]._requestManager; - } else { - pkg._requestManager = new requestManager.Manager(args[0], args[1]); - } - - // add givenProvider - pkg.givenProvider = requestManager.Manager.givenProvider; - pkg.providers = requestManager.Manager.providers; - - pkg._provider = pkg._requestManager.provider; - - // add SETPROVIDER function (don't overwrite if already existing) - if (!pkg.setProvider) { - pkg.setProvider = (provider, net) => { - pkg._requestManager.setProvider(provider, net); - pkg._provider = pkg._requestManager.provider; - return true; - }; - } - - pkg.setRequestManager = (manager) => { - pkg._requestManager = manager; - pkg._provider = manager.provider; - }; - - // attach batch request creation - pkg.BatchRequest = requestManager.BatchManager.bind(null, pkg._requestManager); - - // attach extend function - pkg.extend = extend(pkg); -} - -const addProviders = (pkg) => { - pkg.givenProvider = requestManager.Manager.givenProvider; - pkg.providers = requestManager.Manager.providers; -} - -module.exports = { - packageInit, - addProviders -} diff --git a/packages/web3-core/src/index.ts b/packages/web3-core/src/index.ts new file mode 100644 index 00000000000..88eb6c63151 --- /dev/null +++ b/packages/web3-core/src/index.ts @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './web3_config.js'; +export * from './web3_request_manager.js'; +export * from './web3_subscription_manager.js'; +export * from './web3_subscriptions.js'; +export * from './web3_context.js'; +export * from './web3_batch_request.js'; +export * from './utils.js'; +export * from './types.js'; +export * from './formatters.js'; +export * from './web3_promi_event.js'; +export * from './web3_event_emitter.js'; + +// For backward usability export as namespace +export * as formatters from './formatters.js'; diff --git a/packages/web3-core/src/types.ts b/packages/web3-core/src/types.ts new file mode 100644 index 00000000000..3f4e66d1f52 --- /dev/null +++ b/packages/web3-core/src/types.ts @@ -0,0 +1,32 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { HexString, Transaction } from 'web3-types'; + +export type TransactionTypeParser = ( + transaction: Transaction, +) => HexString | undefined; + +export interface Method { + name: string; + call: string; +} + +export interface ExtensionObject { + property?: string; + methods: Method[]; +} diff --git a/packages/web3-core/src/utils.ts b/packages/web3-core/src/utils.ts new file mode 100644 index 00000000000..34c5162c488 --- /dev/null +++ b/packages/web3-core/src/utils.ts @@ -0,0 +1,84 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + EIP1193Provider, + LegacyRequestProvider, + LegacySendAsyncProvider, + LegacySendProvider, + SupportedProviders, + Web3APISpec, + Web3BaseProvider, + MetaMaskProvider, +} from 'web3-types'; + +export const isWeb3Provider = ( + provider: SupportedProviders, +): provider is Web3BaseProvider => Web3BaseProvider.isWeb3Provider(provider); + +export const isMetaMaskProvider = ( + provider: SupportedProviders, +): provider is MetaMaskProvider => + typeof provider !== 'string' && +'request' in provider && +provider.request.constructor.name === 'AsyncFunction' && 'isMetaMask' in provider && provider.isMetaMask; + + +export const isLegacyRequestProvider = ( + provider: SupportedProviders, +): provider is LegacyRequestProvider => + typeof provider !== 'string' && + 'request' in provider && + provider.request.constructor.name === 'Function'; + +export const isEIP1193Provider = ( + provider: SupportedProviders, +): provider is EIP1193Provider => + typeof provider !== 'string' && + 'request' in provider && + provider.request.constructor.name === 'AsyncFunction'; + +export const isLegacySendProvider = ( + provider: SupportedProviders, +): provider is LegacySendProvider => typeof provider !== 'string' && 'send' in provider; + +export const isLegacySendAsyncProvider = ( + provider: SupportedProviders, +): provider is LegacySendAsyncProvider => typeof provider !== 'string' && 'sendAsync' in provider; + +export const isSupportedProvider = ( + provider: SupportedProviders, +): provider is SupportedProviders => + provider && + (isWeb3Provider(provider) || + isEIP1193Provider(provider) || + isLegacyRequestProvider(provider) || + isLegacySendAsyncProvider(provider) || + isLegacySendProvider(provider)); +export const isSupportSubscriptions = ( + provider: SupportedProviders, +): boolean => { + if (provider && 'supportsSubscriptions' in provider) { + return provider.supportsSubscriptions(); + } + + if (provider && typeof provider !== 'string' && 'on' in provider) { + return true; + } + + return false; +}; diff --git a/packages/web3-core/src/web3_batch_request.ts b/packages/web3-core/src/web3_batch_request.ts new file mode 100644 index 00000000000..10a3eaf4693 --- /dev/null +++ b/packages/web3-core/src/web3_batch_request.ts @@ -0,0 +1,128 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { JsonRpcBatchResponse, JsonRpcOptionalRequest, JsonRpcRequest } from 'web3-types'; +import { jsonRpc, Web3DeferredPromise } from 'web3-utils'; +import { OperationAbortError, OperationTimeoutError, ResponseError } from 'web3-errors'; +import { Web3RequestManager } from './web3_request_manager.js'; + +export const DEFAULT_BATCH_REQUEST_TIMEOUT = 1000; + +export class Web3BatchRequest { + private readonly _requestManager: Web3RequestManager; + private readonly _requests: Map< + number, + { payload: JsonRpcRequest; promise: Web3DeferredPromise } + >; + + public constructor(requestManager: Web3RequestManager) { + this._requestManager = requestManager; + this._requests = new Map(); + } + + public get requests() { + return [...this._requests.values()].map(r => r.payload); + } + + public add(request: JsonRpcOptionalRequest) { + const payload = jsonRpc.toPayload(request) as JsonRpcRequest; + const promise = new Web3DeferredPromise(); + + this._requests.set(payload.id as number, { payload, promise }); + + return promise; + } + + // eslint-disable-next-line class-methods-use-this + public async execute(options?: { + timeout?: number; + }): Promise> { + if (this.requests.length === 0) { + return Promise.resolve([]); + } + + const request = new Web3DeferredPromise>({ + timeout: options?.timeout ?? DEFAULT_BATCH_REQUEST_TIMEOUT, + eagerStart: true, + timeoutMessage: 'Batch request timeout', + }); + + this._processBatchRequest(request).catch(err => request.reject(err)); + + request.catch((err: Error) => { + if (err instanceof OperationTimeoutError) { + this._abortAllRequests('Batch request timeout'); + } + + request.reject(err); + }); + + return request; + } + + private async _processBatchRequest( + promise: Web3DeferredPromise>, + ) { + const response = await this._requestManager.sendBatch( + [...this._requests.values()].map(r => r.payload), + ); + + if (response.length !== this._requests.size) { + this._abortAllRequests('Invalid batch response'); + + throw new ResponseError( + response, + `Batch request size mismatch the results size. Requests: ${this._requests.size}, Responses: ${response.length}`, + ); + } + + const requestIds = this.requests + .map(r => r.id) + .map(Number) + .sort((a, b) => a - b); + + const responseIds = response + .map(r => r.id) + .map(Number) + .sort((a, b) => a - b); + + if (JSON.stringify(requestIds) !== JSON.stringify(responseIds)) { + this._abortAllRequests('Invalid batch response'); + + throw new ResponseError( + response, + `Batch request mismatch the results. Requests: [${requestIds.join()}], Responses: [${responseIds.join()}]`, + ); + } + + for (const res of response) { + if (jsonRpc.isResponseWithResult(res)) { + this._requests.get(res.id as number)?.promise.resolve(res.result); + } else if (jsonRpc.isResponseWithError(res)) { + this._requests.get(res.id as number)?.promise.reject(res.error); + } + } + + promise.resolve(response); + } + + private _abortAllRequests(msg: string) { + for (const { promise } of this._requests.values()) { + promise.reject(new OperationAbortError(msg)); + } + } +} diff --git a/packages/web3-core/src/web3_config.ts b/packages/web3-core/src/web3_config.ts new file mode 100644 index 00000000000..772653cfdeb --- /dev/null +++ b/packages/web3-core/src/web3_config.ts @@ -0,0 +1,506 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Numbers, HexString, BlockNumberOrTag, Common } from 'web3-types'; +import { ConfigHardforkMismatchError, ConfigChainMismatchError } from 'web3-errors'; +import { isNullish, toHex } from 'web3-utils'; +import { TransactionTypeParser } from './types.js'; +// eslint-disable-next-line import/no-cycle +import { TransactionBuilder } from './web3_context.js'; +import { Web3EventEmitter } from './web3_event_emitter.js'; + +// To avoid cycle dependency declare this +export interface Web3ConfigOptions { + handleRevert: boolean; + defaultAccount?: HexString; + defaultBlock: BlockNumberOrTag; + transactionSendTimeout: number; + transactionBlockTimeout: number; + transactionConfirmationBlocks: number; + transactionPollingInterval: number; + transactionPollingTimeout: number; + transactionReceiptPollingInterval?: number; + transactionConfirmationPollingInterval?: number; + blockHeaderTimeout: number; + maxListenersWarningThreshold: number; + contractDataInputFill: 'data' | 'input' | 'both'; + defaultNetworkId?: Numbers; + defaultChain: string; + defaultHardfork: string; + + defaultCommon?: Common; + defaultTransactionType: Numbers; + defaultMaxPriorityFeePerGas: Numbers; + enableExperimentalFeatures: { + useSubscriptionWhenCheckingBlockTimeout: boolean; + useRpcCallSpecification: boolean; // EIP-1474 https://eips.ethereum.org/EIPS/eip-1474 + // other experimental features... + }; + transactionBuilder?: TransactionBuilder; + transactionTypeParser?: TransactionTypeParser; +} + +type ConfigEvent = P extends unknown + ? { name: P; oldValue: T[P]; newValue: T[P] } + : never; + +export enum Web3ConfigEvent { + CONFIG_CHANGE = 'CONFIG_CHANGE', +} + +export abstract class Web3Config + extends Web3EventEmitter<{ [Web3ConfigEvent.CONFIG_CHANGE]: ConfigEvent }> + implements Web3ConfigOptions +{ + public config: Web3ConfigOptions = { + handleRevert: false, + defaultAccount: undefined, + defaultBlock: 'latest', + transactionBlockTimeout: 50, + transactionConfirmationBlocks: 24, + transactionPollingInterval: 1000, + transactionPollingTimeout: 750 * 1000, + transactionReceiptPollingInterval: undefined, + transactionSendTimeout: 750 * 1000, + transactionConfirmationPollingInterval: undefined, + blockHeaderTimeout: 10, + maxListenersWarningThreshold: 100, + contractDataInputFill: 'data', + defaultNetworkId: undefined, + defaultChain: 'mainnet', + defaultHardfork: 'london', + // TODO - Check if there is a default Common + defaultCommon: undefined, + defaultTransactionType: '0x2', + defaultMaxPriorityFeePerGas: toHex(2500000000), + enableExperimentalFeatures: { + useSubscriptionWhenCheckingBlockTimeout: false, + useRpcCallSpecification: false, + }, + transactionBuilder: undefined, + transactionTypeParser: undefined, + }; + + public constructor(options?: Partial) { + super(); + this.setConfig(options ?? {}); + } + + public setConfig(options: Partial) { + // TODO: Improve and add key check + const keys = Object.keys(options) as (keyof Web3ConfigOptions)[]; + for (const key of keys) { + this._triggerConfigChange(key, options[key]); + } + Object.assign(this.config, options); + } + + /** + * The `handleRevert` options property returns the revert reason string if enabled for the following methods: + * - web3.eth.sendTransaction() + * - web3.eth.call() + * - myContract.methods.myMethod().call() + * - myContract.methods.myMethod().send() + * Default is `false`. + * + * `Note`: At the moment `handleRevert` is only supported for `sendTransaction` and not for `sendSignedTransaction` + */ + public get handleRevert() { + return this.config.handleRevert; + } + + /** + * Will set the handleRevert + */ + public set handleRevert(val) { + this._triggerConfigChange('handleRevert', val); + this.config.handleRevert = val; + } + + /** + * The `contractDataInputFill` options property will allow you to set the hash of the method signature and encoded parameters to the property + * either `data`, `input` or both within your contract. + * This will affect the contracts send, call and estimateGas methods + * Default is `input`. + */ + public get contractDataInputFill() { + return this.config.contractDataInputFill; + } + + /** + * Will set the contractDataInputFill + */ + public set contractDataInputFill(val) { + this._triggerConfigChange('contractDataInputFill', val); + this.config.contractDataInputFill = val; + } + + /** + * This default address is used as the default `from` property, if no `from` property is specified in for the following methods: + * - web3.eth.sendTransaction() + * - web3.eth.call() + * - myContract.methods.myMethod().call() + * - myContract.methods.myMethod().send() + */ + public get defaultAccount() { + return this.config.defaultAccount; + } + /** + * Will set the default account. + */ + public set defaultAccount(val) { + this._triggerConfigChange('defaultAccount', val); + this.config.defaultAccount = val; + } + + /** + * The default block is used for certain methods. You can override it by passing in the defaultBlock as last parameter. The default value is `"latest"`. + * - web3.eth.getBalance() + * - web3.eth.getCode() + * - web3.eth.getTransactionCount() + * - web3.eth.getStorageAt() + * - web3.eth.call() + * - myContract.methods.myMethod().call() + */ + public get defaultBlock() { + return this.config.defaultBlock; + } + + /** + * Will set the default block. + * + * - A block number + * - `"earliest"` - String: The genesis block + * - `"latest"` - String: The latest block (current head of the blockchain) + * - `"pending"` - String: The currently mined block (including pending transactions) + * - `"finalized"` - String: (For POS networks) The finalized block is one which has been accepted as canonical by greater than 2/3 of validators + * - `"safe"` - String: (For POS networks) The safe head block is one which under normal network conditions, is expected to be included in the canonical chain. Under normal network conditions the safe head and the actual tip of the chain will be equivalent (with safe head trailing only by a few seconds). Safe heads will be less likely to be reorged than the proof of work network`s latest blocks. + */ + public set defaultBlock(val) { + this._triggerConfigChange('defaultBlock', val); + this.config.defaultBlock = val; + } + + /** + * The time used to wait for Ethereum Node to return the sent transaction result. + * Note: If the RPC call stuck at the Node and therefor timed-out, the transaction may still be pending or even mined by the Network. We recommend checking the pending transactions in such a case. + * Default is `750` seconds (12.5 minutes). + */ + public get transactionSendTimeout() { + return this.config.transactionSendTimeout; + } + + /** + * Will set the transactionSendTimeout. + */ + public set transactionSendTimeout(val) { + this._triggerConfigChange('transactionSendTimeout', val); + this.config.transactionSendTimeout = val; + } + + /** + * The `transactionBlockTimeout` is used over socket-based connections. This option defines the amount of new blocks it should wait until the first confirmation happens, otherwise the PromiEvent rejects with a timeout error. + * Default is `50`. + */ + public get transactionBlockTimeout() { + return this.config.transactionBlockTimeout; + } + + /** + * Will set the transactionBlockTimeout. + */ + public set transactionBlockTimeout(val) { + this._triggerConfigChange('transactionBlockTimeout', val); + this.config.transactionBlockTimeout = val; + } + + /** + * This defines the number of blocks it requires until a transaction is considered confirmed. + * Default is `24`. + */ + public get transactionConfirmationBlocks() { + return this.config.transactionConfirmationBlocks; + } + + /** + * Will set the transactionConfirmationBlocks. + */ + public set transactionConfirmationBlocks(val) { + this._triggerConfigChange('transactionConfirmationBlocks', val); + this.config.transactionConfirmationBlocks = val; + } + + /** + * Used over HTTP connections. This option defines the number of seconds between Web3 calls for a receipt which confirms that a transaction was mined by the network. + * Default is `1000` ms. + */ + public get transactionPollingInterval() { + return this.config.transactionPollingInterval; + } + + /** + * Will set the transactionPollingInterval. + */ + public set transactionPollingInterval(val) { + this._triggerConfigChange('transactionPollingInterval', val); + this.config.transactionPollingInterval = val; + + this.transactionReceiptPollingInterval = val; + this.transactionConfirmationPollingInterval = val; + } + /** + * Used over HTTP connections. This option defines the number of seconds Web3 will wait for a receipt which confirms that a transaction was mined by the network. Note: If this method times out, the transaction may still be pending. + * Default is `750` seconds (12.5 minutes). + */ + public get transactionPollingTimeout() { + return this.config.transactionPollingTimeout; + } + + /** + * Will set the transactionPollingTimeout. + */ + public set transactionPollingTimeout(val) { + this._triggerConfigChange('transactionPollingTimeout', val); + + this.config.transactionPollingTimeout = val; + } + + /** + * The `transactionPollingInterval` is used over HTTP connections. This option defines the number of seconds between Web3 calls for a receipt which confirms that a transaction was mined by the network. + * Default is `undefined` + */ + public get transactionReceiptPollingInterval() { + return this.config.transactionReceiptPollingInterval; + } + + /** + * Will set the transactionReceiptPollingInterval + */ + public set transactionReceiptPollingInterval(val) { + this._triggerConfigChange('transactionReceiptPollingInterval', val); + this.config.transactionReceiptPollingInterval = val; + } + + public get transactionConfirmationPollingInterval() { + return this.config.transactionConfirmationPollingInterval; + } + + public set transactionConfirmationPollingInterval(val) { + this._triggerConfigChange('transactionConfirmationPollingInterval', val); + this.config.transactionConfirmationPollingInterval = val; + } + + /** + * The blockHeaderTimeout is used over socket-based connections. This option defines the amount seconds it should wait for `'newBlockHeaders'` event before falling back to polling to fetch transaction receipt. + * Default is `10` seconds. + */ + public get blockHeaderTimeout() { + return this.config.blockHeaderTimeout; + } + + /** + * Will set the blockHeaderTimeout + */ + public set blockHeaderTimeout(val) { + this._triggerConfigChange('blockHeaderTimeout', val); + + this.config.blockHeaderTimeout = val; + } + + /** + * The enableExperimentalFeatures is used to enable trying new experimental features that are still not fully implemented or not fully tested or still have some related issues. + * Default is `false` for every feature. + */ + public get enableExperimentalFeatures() { + return this.config.enableExperimentalFeatures; + } + + /** + * Will set the enableExperimentalFeatures + */ + public set enableExperimentalFeatures(val) { + this._triggerConfigChange('enableExperimentalFeatures', val); + + this.config.enableExperimentalFeatures = val; + } + + public get maxListenersWarningThreshold() { + return this.config.maxListenersWarningThreshold; + } + + public set maxListenersWarningThreshold(val) { + this._triggerConfigChange('maxListenersWarningThreshold', val); + this.setMaxListenerWarningThreshold(val); + this.config.maxListenersWarningThreshold = val; + } + + public get defaultNetworkId() { + return this.config.defaultNetworkId; + } + + public set defaultNetworkId(val) { + this._triggerConfigChange('defaultNetworkId', val); + + this.config.defaultNetworkId = val; + } + + public get defaultChain() { + return this.config.defaultChain; + } + + public set defaultChain(val) { + if ( + !isNullish(this.config.defaultCommon) && + !isNullish(this.config.defaultCommon.baseChain) && + val !== this.config.defaultCommon.baseChain + ) + throw new ConfigChainMismatchError(this.config.defaultChain, val); + + this._triggerConfigChange('defaultChain', val); + + this.config.defaultChain = val; + } + + /** + * Will return the default hardfork. Default is `london` + * The default hardfork property can be one of the following: + * - `chainstart` + * - `homestead` + * - `dao` + * - `tangerineWhistle` + * - `spuriousDragon` + * - `byzantium` + * - `constantinople` + * - `petersburg` + * - `istanbul` + * - `berlin` + * - `london` + * - 'arrowGlacier', + * - 'tangerineWhistle', + * - 'muirGlacier' + * + */ + public get defaultHardfork() { + return this.config.defaultHardfork; + } + + /** + * Will set the default hardfork. + * + */ + public set defaultHardfork(val) { + if ( + !isNullish(this.config.defaultCommon) && + !isNullish(this.config.defaultCommon.hardfork) && + val !== this.config.defaultCommon.hardfork + ) + throw new ConfigHardforkMismatchError(this.config.defaultCommon.hardfork, val); + this._triggerConfigChange('defaultHardfork', val); + + this.config.defaultHardfork = val; + } + + /** + * + * Will get the default common property + * The default common property does contain the following Common object: + * - `customChain` - `Object`: The custom chain properties + * - `name` - `string`: (optional) The name of the chain + * - `networkId` - `number`: Network ID of the custom chain + * - `chainId` - `number`: Chain ID of the custom chain + * - `baseChain` - `string`: (optional) mainnet, goerli, kovan, rinkeby, or ropsten + * - `hardfork` - `string`: (optional) chainstart, homestead, dao, tangerineWhistle, spuriousDragon, byzantium, constantinople, petersburg, istanbul, berlin, or london + * Default is `undefined`. + * + */ + public get defaultCommon() { + return this.config.defaultCommon; + } + + /** + * Will set the default common property + * + */ + public set defaultCommon(val: Common | undefined) { + // validation check if default hardfork is set and matches defaultCommon hardfork + if ( + !isNullish(this.config.defaultHardfork) && + !isNullish(val) && + !isNullish(val.hardfork) && + this.config.defaultHardfork !== val.hardfork + ) + throw new ConfigHardforkMismatchError(this.config.defaultHardfork, val.hardfork); + if ( + !isNullish(this.config.defaultChain) && + !isNullish(val) && + !isNullish(val.baseChain) && + this.config.defaultChain !== val.baseChain + ) + throw new ConfigChainMismatchError(this.config.defaultChain, val.baseChain); + this._triggerConfigChange('defaultCommon', val); + + this.config.defaultCommon = val; + } + + public get defaultTransactionType() { + return this.config.defaultTransactionType; + } + + public set defaultTransactionType(val) { + this._triggerConfigChange('defaultTransactionType', val); + + this.config.defaultTransactionType = val; + } + + public get defaultMaxPriorityFeePerGas() { + return this.config.defaultMaxPriorityFeePerGas; + } + + public set defaultMaxPriorityFeePerGas(val) { + this._triggerConfigChange('defaultMaxPriorityFeePerGas', val); + this.config.defaultMaxPriorityFeePerGas = val; + } + + public get transactionBuilder() { + return this.config.transactionBuilder; + } + + public set transactionBuilder(val) { + this._triggerConfigChange('transactionBuilder', val); + this.config.transactionBuilder = val; + } + + public get transactionTypeParser() { + return this.config.transactionTypeParser; + } + + public set transactionTypeParser(val) { + this._triggerConfigChange('transactionTypeParser', val); + this.config.transactionTypeParser = val; + } + + private _triggerConfigChange( + config: K, + newValue: Web3ConfigOptions[K], + ) { + this.emit(Web3ConfigEvent.CONFIG_CHANGE, { + name: config, + oldValue: this.config[config], + newValue, + } as ConfigEvent); + } +} diff --git a/packages/web3-core/src/web3_context.ts b/packages/web3-core/src/web3_context.ts new file mode 100644 index 00000000000..76afcaf8875 --- /dev/null +++ b/packages/web3-core/src/web3_context.ts @@ -0,0 +1,453 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line max-classes-per-file +import { ExistingPluginNamespaceError } from 'web3-errors'; +import { + EthExecutionAPI, + HexString, Numbers, SupportedProviders, Transaction, Web3AccountProvider, Web3APISpec, Web3BaseProvider, Web3BaseWallet, + Web3BaseWalletAccount +} from 'web3-types'; +import { isNullish } from 'web3-utils'; +import { BaseTransaction, TransactionFactory } from 'web3-eth-accounts'; +import { isSupportedProvider } from './utils.js'; +// eslint-disable-next-line import/no-cycle +import { ExtensionObject } from './types.js'; +import { Web3BatchRequest } from './web3_batch_request.js'; +// eslint-disable-next-line import/no-cycle +import { Web3Config, Web3ConfigEvent, Web3ConfigOptions } from './web3_config.js'; +import { Web3RequestManager } from './web3_request_manager.js'; +import { Web3SubscriptionConstructor } from './web3_subscriptions.js'; +import { Web3SubscriptionManager } from './web3_subscription_manager.js'; + +// To avoid circular dependencies, we need to export type from here. +export type Web3ContextObject< + API extends Web3APISpec = unknown, + RegisteredSubs extends { + [key: string]: Web3SubscriptionConstructor; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } = any, +> = { + config: Web3ConfigOptions; + provider?: SupportedProviders | string; + requestManager: Web3RequestManager; + subscriptionManager?: Web3SubscriptionManager | undefined; + registeredSubscriptions?: RegisteredSubs; + providers: typeof Web3RequestManager.providers; + accountProvider?: Web3AccountProvider; + wallet?: Web3BaseWallet; +}; + +export type Web3ContextInitOptions< + API extends Web3APISpec = unknown, + RegisteredSubs extends { + [key: string]: Web3SubscriptionConstructor; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } = any, +> = { + config?: Partial; + provider?: SupportedProviders | string; + requestManager?: Web3RequestManager; + subscriptionManager?: Web3SubscriptionManager | undefined; + registeredSubscriptions?: RegisteredSubs; + accountProvider?: Web3AccountProvider; + wallet?: Web3BaseWallet; +}; + +// eslint-disable-next-line no-use-before-define +export type Web3ContextConstructor = new ( + ...args: [...extras: T2, context: Web3ContextObject] +) => T; + +// To avoid circular dependencies, we need to export type from here. +export type Web3ContextFactory< + // eslint-disable-next-line no-use-before-define + T extends Web3Context, + T2 extends unknown[], +> = Web3ContextConstructor & { + fromContextObject(this: Web3ContextConstructor, contextObject: Web3ContextObject): T; +}; + +export class Web3Context< + API extends Web3APISpec = unknown, + RegisteredSubs extends { + [key: string]: Web3SubscriptionConstructor; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } = any, +> extends Web3Config { + public static readonly providers = Web3RequestManager.providers; + public static givenProvider?: SupportedProviders; + public readonly providers = Web3RequestManager.providers; + protected _requestManager: Web3RequestManager; + protected _subscriptionManager: Web3SubscriptionManager; + protected _accountProvider?: Web3AccountProvider; + protected _wallet?: Web3BaseWallet; + + public constructor( + providerOrContext?: + | string + | SupportedProviders + | Web3ContextInitOptions, + ) { + super(); + + // If "providerOrContext" is provided as "string" or an objects matching "SupportedProviders" interface + if ( + isNullish(providerOrContext) || + (typeof providerOrContext === 'string' && providerOrContext.trim() !== '') || + isSupportedProvider(providerOrContext as SupportedProviders) + ) { + this._requestManager = new Web3RequestManager( + providerOrContext as undefined | string | SupportedProviders, + ); + this._subscriptionManager = new Web3SubscriptionManager( + this._requestManager, + {} as RegisteredSubs, + ); + + return; + } + + const { + config, + provider, + requestManager, + subscriptionManager, + registeredSubscriptions, + accountProvider, + wallet, + } = providerOrContext as Web3ContextInitOptions; + + this.setConfig(config ?? {}); + + this._requestManager = + requestManager ?? + new Web3RequestManager( + provider, + config?.enableExperimentalFeatures?.useSubscriptionWhenCheckingBlockTimeout, + ); + + if (subscriptionManager) { + this._subscriptionManager = subscriptionManager; + } else { + this._subscriptionManager = new Web3SubscriptionManager( + this.requestManager, + registeredSubscriptions ?? ({} as RegisteredSubs), + ); + } + + if (accountProvider) { + this._accountProvider = accountProvider; + } + + if (wallet) { + this._wallet = wallet; + } + } + + public get requestManager() { + return this._requestManager; + } + + /** + * Will return the current subscriptionManager ({@link Web3SubscriptionManager}) + */ + public get subscriptionManager() { + return this._subscriptionManager; + } + + public get wallet() { + return this._wallet; + } + + public get accountProvider() { + return this._accountProvider; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public static fromContextObject( + this: Web3ContextConstructor, + ...args: [Web3ContextObject, ...T3] + ) { + return new this(...(args.reverse() as [...T3, Web3ContextObject])); + } + + public getContextObject(): Web3ContextObject { + return { + config: this.config, + provider: this.provider, + requestManager: this.requestManager, + subscriptionManager: this.subscriptionManager, + registeredSubscriptions: this.subscriptionManager?.registeredSubscriptions, + providers: this.providers, + wallet: this.wallet, + accountProvider: this.accountProvider, + }; + } + + /** + * Use to create new object of any type extended by `Web3Context` + * and link it to current context. This can be used to initiate a global context object + * and then use it to create new objects of any type extended by `Web3Context`. + */ + public use( + ContextRef: Web3ContextConstructor, + ...args: [...T2] + ) { + const newContextChild: T = new ContextRef( + ...([...args, this.getContextObject()] as unknown as [...T2, Web3ContextObject]), + ); + + this.on(Web3ConfigEvent.CONFIG_CHANGE, event => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + newContextChild.setConfig({ [event.name]: event.newValue }); + }); + + return newContextChild; + } + + /** + * Link current context to another context. + */ + public link(parentContext: T) { + this.setConfig(parentContext.config); + this._requestManager = parentContext.requestManager; + this.provider = parentContext.provider; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + this._subscriptionManager = parentContext.subscriptionManager; + this._wallet = parentContext.wallet; + this._accountProvider = parentContext._accountProvider; + + parentContext.on(Web3ConfigEvent.CONFIG_CHANGE, event => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + this.setConfig({ [event.name]: event.newValue }); + }); + } + + // eslint-disable-next-line no-use-before-define + public registerPlugin(plugin: Web3PluginBase) { + // @ts-expect-error No index signature with a parameter of type 'string' was found on type 'Web3Context' + if (this[plugin.pluginNamespace] !== undefined) + throw new ExistingPluginNamespaceError(plugin.pluginNamespace); + + const _pluginObject = { + [plugin.pluginNamespace]: plugin, + }; + _pluginObject[plugin.pluginNamespace].link(this); + Object.assign(this, _pluginObject); + } + + /** + * Will return the current provider. + * + * @returns Returns the current provider + * @example + * ```ts + * const web3 = new Web3Context("http://localhost:8545"); + * console.log(web3.provider); + * > HttpProvider { + * clientUrl: 'http://localhost:8545', + * httpProviderOptions: undefined + * } + * ``` + */ + + public get provider(): Web3BaseProvider | undefined { + return this.currentProvider; + } + + /** + * Will set the current provider. + * + * @param provider - The provider to set + * + * Accepted providers are of type {@link SupportedProviders} + * @example + * ```ts + * const web3Context = new web3ContextContext("http://localhost:8545"); + * web3Context.provider = "ws://localhost:8545"; + * console.log(web3Context.provider); + * > WebSocketProvider { + * _eventEmitter: EventEmitter { + * _events: [Object: null prototype] {}, + * _eventsCount: 0, + * ... + * } + * ``` + */ + + public set provider(provider: SupportedProviders | string | undefined) { + this.requestManager.setProvider(provider); + } + + /** + * Will return the current provider. (The same as `provider`) + * + * @returns Returns the current provider + * @example + * ```ts + * const web3Context = new Web3Context("http://localhost:8545"); + * console.log(web3Context.provider); + * > HttpProvider { + * clientUrl: 'http://localhost:8545', + * httpProviderOptions: undefined + * } + * ``` + */ + public get currentProvider(): Web3BaseProvider | undefined { + return this.requestManager.provider as Web3BaseProvider; + } + + /** + * Will set the current provider. (The same as `provider`) + * + * @param provider - {@link SupportedProviders} The provider to set + * + * @example + * ```ts + * const web3Context = new Web3Context("http://localhost:8545"); + * web3Context.currentProvider = "ws://localhost:8545"; + * console.log(web3Context.provider); + * > WebSocketProvider { + * _eventEmitter: EventEmitter { + * _events: [Object: null prototype] {}, + * _eventsCount: 0, + * ... + * } + * ``` + */ + public set currentProvider(provider: SupportedProviders | string | undefined) { + this.requestManager.setProvider(provider); + } + + /** + * Will return the givenProvider if available. + * + * When using web3.js in an Ethereum compatible browser, it will set with the current native provider by that browser. Will return the given provider by the (browser) environment, otherwise `undefined`. + */ + // eslint-disable-next-line class-methods-use-this + public get givenProvider() { + return Web3Context.givenProvider; + } + /** + * Will set the provider. + * + * @param provider - {@link SupportedProviders} The provider to set + * @returns Returns true if the provider was set + */ + public setProvider(provider?: SupportedProviders | string): boolean { + this.provider = provider; + return true; + } + /** + * Will return the {@link Web3BatchRequest} constructor. + */ + public get BatchRequest(): new () => Web3BatchRequest { + return Web3BatchRequest.bind( + undefined, + this._requestManager as unknown as Web3RequestManager, + ); + } + + /** + * This method allows extending the web3 modules. + * Note: This method is only for backward compatibility, and It is recommended to use Web3 v4 Plugin feature for extending web3.js functionality if you are developing something new. + */ + public extend(extendObj: ExtensionObject) { + // @ts-expect-error No index signature with a parameter of type 'string' was found on type 'Web3Context' + if (extendObj.property && !this[extendObj.property]) + // @ts-expect-error No index signature with a parameter of type 'string' was found on type 'Web3Context' + this[extendObj.property] = {}; + + extendObj.methods?.forEach(element => { + const method = async (...givenParams: unknown[]) => + this.requestManager.send({ + method: element.call, + params: givenParams, + }); + + if (extendObj.property) + // @ts-expect-error No index signature with a parameter of type 'string' was found on type 'Web3Context' + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + this[extendObj.property][element.name] = method; + // @ts-expect-error No index signature with a parameter of type 'string' was found on type 'Web3Context' + else this[element.name] = method; + }); + return this; + } +} + +/** + * Extend this class when creating a plugin that either doesn't require {@link EthExecutionAPI}, + * or interacts with a RPC node that doesn't fully implement {@link EthExecutionAPI}. + * + * To add type support for RPC methods to the {@link Web3RequestManager}, + * define a {@link Web3APISpec} and pass it as a generic to Web3PluginBase like so: + * + * @example + * ```ts + * type CustomRpcApi = { + * custom_rpc_method: () => string; + * custom_rpc_method_with_parameters: (parameter1: string, parameter2: number) => string; + * }; + * + * class CustomPlugin extends Web3PluginBase {...} + * ``` + */ +export abstract class Web3PluginBase< + API extends Web3APISpec = Web3APISpec, +> extends Web3Context { + public abstract pluginNamespace: string; + + // eslint-disable-next-line class-methods-use-this + protected registerNewTransactionType>( + type: Numbers, + txClass: NewTxTypeClass, + ): void { + TransactionFactory.registerTransactionType(type, txClass); + } +} + +/** + * Extend this class when creating a plugin that makes use of {@link EthExecutionAPI}, + * or depends on other Web3 packages (such as `web3-eth-contract`) that depend on {@link EthExecutionAPI}. + * + * To add type support for RPC methods to the {@link Web3RequestManager} (in addition to {@link EthExecutionAPI}), + * define a {@link Web3APISpec} and pass it as a generic to Web3PluginBase like so: + * + * @example + * ```ts + * type CustomRpcApi = { + * custom_rpc_method: () => string; + * custom_rpc_method_with_parameters: (parameter1: string, parameter2: number) => string; + * }; + * + * class CustomPlugin extends Web3PluginBase {...} + * ``` + */ +export abstract class Web3EthPluginBase extends Web3PluginBase< + API & EthExecutionAPI +> {} + +// To avoid cycle dependency declare this type in this file +export type TransactionBuilder = < + ReturnType = Transaction, +>(options: { + transaction: Transaction; + web3Context: Web3Context; + privateKey?: HexString | Uint8Array; + fillGasPrice?: boolean; +}) => Promise; diff --git a/packages/web3-core/src/web3_event_emitter.ts b/packages/web3-core/src/web3_event_emitter.ts new file mode 100644 index 00000000000..36180c51df3 --- /dev/null +++ b/packages/web3-core/src/web3_event_emitter.ts @@ -0,0 +1,73 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EventEmitter } from 'web3-utils'; + +export type Web3EventMap = Record; +export type Web3EventKey = string & keyof T; +export type Web3EventCallback = (params: T) => void | Promise; +export interface Web3Emitter { + on>(eventName: K, fn: Web3EventCallback): void; + once>(eventName: K, fn: Web3EventCallback): void; + off>(eventName: K, fn: Web3EventCallback): void; + emit>(eventName: K, params: T[K]): void; +} + +export class Web3EventEmitter implements Web3Emitter { + private readonly _emitter = new EventEmitter(); + + public on>(eventName: K, fn: Web3EventCallback) { + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this._emitter.on(eventName, fn); + } + + public once>(eventName: K, fn: Web3EventCallback) { + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this._emitter.once(eventName, fn); + } + + public off>(eventName: K, fn: Web3EventCallback) { + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this._emitter.off(eventName, fn); + } + + public emit>(eventName: K, params: T[K]) { + this._emitter.emit(eventName, params); + } + + public listenerCount>(eventName: K) { + return this._emitter.listenerCount(eventName); + } + + public listeners>(eventName: K) { + return this._emitter.listeners(eventName); + } + + public eventNames() { + return this._emitter.eventNames(); + } + + public removeAllListeners() { + return this._emitter.removeAllListeners(); + } + public setMaxListenerWarningThreshold(maxListenersWarningThreshold: number) { + this._emitter.setMaxListeners(maxListenersWarningThreshold); + } + public getMaxListeners() { + return this._emitter.getMaxListeners(); + } +} diff --git a/packages/web3-core/src/web3_promi_event.ts b/packages/web3-core/src/web3_promi_event.ts new file mode 100644 index 00000000000..c907d1f1529 --- /dev/null +++ b/packages/web3-core/src/web3_promi_event.ts @@ -0,0 +1,79 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + Web3EventCallback, + Web3EventEmitter, + Web3EventKey, + Web3EventMap, +} from './web3_event_emitter.js'; + +export type PromiseExecutor = ( + resolve: (data: T) => void, + reject: (reason: unknown) => void, +) => void; + +export class Web3PromiEvent + extends Web3EventEmitter + implements Promise +{ + private readonly _promise: Promise; + + public constructor(executor: PromiseExecutor) { + super(); + this._promise = new Promise(executor); + } + + // public tag to treat object as promise by different libs + // eslint-disable-next-line @typescript-eslint/prefer-as-const + public [Symbol.toStringTag]: 'Promise' = 'Promise'; + + public async then( + onfulfilled?: ((value: ResolveType) => TResult1 | PromiseLike) | undefined, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | undefined, + ): Promise { + return this._promise.then(onfulfilled, onrejected); + } + + public async catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | undefined, + ): Promise { + return this._promise.catch(onrejected); + } + + public async finally(onfinally?: (() => void) | undefined): Promise { + return this._promise.finally(onfinally); + } + + public on>( + eventName: K, + fn: Web3EventCallback, + ): this { + super.on(eventName, fn); + + return this; + } + + public once>( + eventName: K, + fn: Web3EventCallback, + ): this { + super.once(eventName, fn); + + return this; + } +} diff --git a/packages/web3-core/src/web3_request_manager.ts b/packages/web3-core/src/web3_request_manager.ts new file mode 100644 index 00000000000..3c6cabd0182 --- /dev/null +++ b/packages/web3-core/src/web3_request_manager.ts @@ -0,0 +1,467 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + ContractExecutionError, + InvalidResponseError, + ProviderError, + ResponseError, + rpcErrorsMap, + RpcError, +} from 'web3-errors'; +import HttpProvider from 'web3-providers-http'; +import WSProvider from 'web3-providers-ws'; +import { + EthExecutionAPI, + JsonRpcBatchRequest, + JsonRpcBatchResponse, + JsonRpcPayload, + JsonRpcResponse, + JsonRpcError, + JsonRpcResponseWithResult, + JsonRpcResponseWithError, + SupportedProviders, + Web3APIMethod, + Web3APIPayload, + Web3APIRequest, + Web3APIReturnType, + Web3APISpec, + Web3BaseProvider, + Web3BaseProviderConstructor, +} from 'web3-types'; +import { isNullish, isPromise, jsonRpc, isResponseRpcError } from 'web3-utils'; +import { + isEIP1193Provider, + isLegacyRequestProvider, + isLegacySendAsyncProvider, + isLegacySendProvider, + isWeb3Provider, +} from './utils.js'; +import { Web3EventEmitter } from './web3_event_emitter.js'; + +export enum Web3RequestManagerEvent { + PROVIDER_CHANGED = 'PROVIDER_CHANGED', + BEFORE_PROVIDER_CHANGE = 'BEFORE_PROVIDER_CHANGE', +} + +const availableProviders: { + HttpProvider: Web3BaseProviderConstructor; + WebsocketProvider: Web3BaseProviderConstructor; +} = { + HttpProvider: HttpProvider as Web3BaseProviderConstructor, + WebsocketProvider: WSProvider as Web3BaseProviderConstructor, +}; + +export class Web3RequestManager< + API extends Web3APISpec = EthExecutionAPI, +> extends Web3EventEmitter<{ + [key in Web3RequestManagerEvent]: SupportedProviders | undefined; +}> { + private _provider?: SupportedProviders; + private readonly useRpcCallSpecification?: boolean; + public constructor( + provider?: SupportedProviders | string, + useRpcCallSpecification?: boolean, + ) { + super(); + + if (!isNullish(provider)) { + this.setProvider(provider); + } + this.useRpcCallSpecification = useRpcCallSpecification; + } + + /** + * Will return all available providers + */ + public static get providers() { + return availableProviders; + } + + /** + * Will return the current provider. + * + * @returns Returns the current provider + */ + public get provider() { + return this._provider; + } + + /** + * Will return all available providers + */ + // eslint-disable-next-line class-methods-use-this + public get providers() { + return availableProviders; + } + + /** + * Use to set provider. Provider can be a provider instance or a string. + * + * @param provider - The provider to set + */ + public setProvider(provider?: SupportedProviders | string): boolean { + let newProvider: SupportedProviders | undefined; + + // autodetect provider + if (provider && typeof provider === 'string' && this.providers) { + // HTTP + if (/^http(s)?:\/\//i.test(provider)) { + newProvider = new this.providers.HttpProvider(provider); + + // WS + } else if (/^ws(s)?:\/\//i.test(provider)) { + newProvider = new this.providers.WebsocketProvider(provider); + } else { + throw new ProviderError(`Can't autodetect provider for "${provider}"`); + } + } else if (isNullish(provider)) { + // In case want to unset the provider + newProvider = undefined; + } else { + newProvider = provider as SupportedProviders; + } + + this.emit(Web3RequestManagerEvent.BEFORE_PROVIDER_CHANGE, this._provider); + this._provider = newProvider; + this.emit(Web3RequestManagerEvent.PROVIDER_CHANGED, this._provider); + return true; + } + + /** + * + * Will execute a request + * + * @param request - {@link Web3APIRequest} The request to send + * + * @returns The response of the request {@link ResponseType}. If there is error + * in the response, will throw an error + */ + public async send< + Method extends Web3APIMethod, + ResponseType = Web3APIReturnType, + >(request: Web3APIRequest): Promise { + const response = await this._sendRequest(request); + if (jsonRpc.isResponseWithResult(response)) { + return response.result; + } + + throw new ResponseError(response); + } + + /** + * Same as send, but, will execute a batch of requests + * + * @param request {@link JsonRpcBatchRequest} The batch request to send + */ + public async sendBatch(request: JsonRpcBatchRequest): Promise> { + const response = await this._sendRequest(request); + + return response as JsonRpcBatchResponse; + } + + private async _sendRequest< + Method extends Web3APIMethod, + ResponseType = Web3APIReturnType, + >( + request: Web3APIRequest | JsonRpcBatchRequest, + ): Promise> { + const { provider } = this; + + if (isNullish(provider)) { + throw new ProviderError( + 'Provider not available. Use `.setProvider` or `.provider=` to initialize the provider.', + ); + } + + const payload = jsonRpc.isBatchRequest(request) + ? jsonRpc.toBatchPayload(request) + : jsonRpc.toPayload(request); + + if (isWeb3Provider(provider)) { + let response; + + try { + response = await provider.request( + payload as Web3APIPayload, + ); + } catch (error) { + // Check if the provider throw an error instead of reject with error + response = error as JsonRpcResponse; + } + return this._processJsonRpcResponse(payload, response, { legacy: false, error: false }); + } + + if (isEIP1193Provider(provider)) { + return (provider as Web3BaseProvider) + .request(payload as Web3APIPayload) + .then( + res => + this._processJsonRpcResponse(payload, res, { + legacy: true, + error: false, + }) as JsonRpcResponseWithResult, + ) + .catch(error => + this._processJsonRpcResponse( + payload, + error as JsonRpcResponse, + { legacy: true, error: true }, + ), + ); + } + + // TODO: This could be deprecated and removed. + if (isLegacyRequestProvider(provider)) { + return new Promise>((resolve, reject) => { + const rejectWithError = (err: unknown) => + reject( + this._processJsonRpcResponse( + payload, + err as JsonRpcResponse, + { + legacy: true, + error: true, + }, + ), + ); + const resolveWithResponse = (response: JsonRpcResponse) => + resolve( + this._processJsonRpcResponse(payload, response, { + legacy: true, + error: false, + }), + ); + const result = provider.request( + payload, + // a callback that is expected to be called after getting the response: + (err, response) => { + if (err) { + return rejectWithError(err); + } + + return resolveWithResponse(response); + }, + ); + // Some providers, that follow a previous drafted version of EIP1193, has a `request` function + // that is not defined as `async`, but it returns a promise. + // Such providers would not be picked with if(isEIP1193Provider(provider)) above + // because the `request` function was not defined with `async` and so the function definition is not `AsyncFunction`. + // Like this provider: https://github.dev/NomicFoundation/hardhat/blob/62bea2600785595ba36f2105564076cf5cdf0fd8/packages/hardhat-core/src/internal/core/providers/backwards-compatibility.ts#L19 + // So check if the returned result is a Promise, and resolve with it accordingly. + // Note: in this case we expect the callback provided above to never be called. + if (isPromise(result)) { + const responsePromise = result as unknown as Promise< + JsonRpcResponse + >; + responsePromise.then(resolveWithResponse).catch(rejectWithError); + } + }); + } + + // TODO: This could be deprecated and removed. + if (isLegacySendProvider(provider)) { + return new Promise>((resolve, reject): void => { + provider.send(payload, (err, response) => { + if (err) { + return reject( + this._processJsonRpcResponse( + payload, + err as unknown as JsonRpcResponse, + { + legacy: true, + error: true, + }, + ), + ); + } + + if (isNullish(response)) { + throw new ResponseError( + {} as never, + 'Got a "nullish" response from provider.', + ); + } + + return resolve( + this._processJsonRpcResponse(payload, response, { + legacy: true, + error: false, + }), + ); + }); + }); + } + + // TODO: This could be deprecated and removed. + if (isLegacySendAsyncProvider(provider)) { + return provider + .sendAsync(payload) + .then(response => + this._processJsonRpcResponse(payload, response, { legacy: true, error: false }), + ) + .catch(error => + this._processJsonRpcResponse(payload, error as JsonRpcResponse, { + legacy: true, + error: true, + }), + ); + } + + throw new ProviderError('Provider does not have a request or send method to use.'); + } + + // eslint-disable-next-line class-methods-use-this + private _processJsonRpcResponse( + payload: JsonRpcPayload, + response: JsonRpcResponse, + { legacy, error }: { legacy: boolean; error: boolean }, + ): JsonRpcResponse | never { + if (isNullish(response)) { + return this._buildResponse( + payload, + // Some providers uses "null" as valid empty response + // eslint-disable-next-line no-null/no-null + null as unknown as JsonRpcResponse, + error, + ); + } + + // This is the majority of the cases so check these first + // A valid JSON-RPC response with error object + if (jsonRpc.isResponseWithError(response)) { + // check if its an rpc error + if ( + this.useRpcCallSpecification && + isResponseRpcError(response as JsonRpcResponseWithError) + ) { + const rpcErrorResponse = response as JsonRpcResponseWithError; + // check if rpc error flag is on and response error code match an EIP-1474 or a standard rpc error code + if (rpcErrorsMap.get(rpcErrorResponse.error.code)) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const Err = rpcErrorsMap.get(rpcErrorResponse.error.code)!.error; + throw new Err(rpcErrorResponse); + } else { + throw new RpcError(rpcErrorResponse); + } + } else if (!Web3RequestManager._isReverted(response)) { + throw new InvalidResponseError(response, payload); + } + } + + // This is the majority of the cases so check these first + // A valid JSON-RPC response with result object + if (jsonRpc.isResponseWithResult(response)) { + return response; + } + + if ((response as unknown) instanceof Error) { + Web3RequestManager._isReverted(response); + throw response; + } + + if (!legacy && jsonRpc.isBatchRequest(payload) && jsonRpc.isBatchResponse(response)) { + return response as JsonRpcBatchResponse; + } + + if (legacy && !error && jsonRpc.isBatchRequest(payload)) { + return response as JsonRpcBatchResponse; + } + + if (legacy && error && jsonRpc.isBatchRequest(payload)) { + // In case of error batch response we don't want to throw Invalid response + throw response; + } + + if ( + legacy && + !jsonRpc.isResponseWithError(response) && + !jsonRpc.isResponseWithResult(response) + ) { + return this._buildResponse(payload, response, error); + } + + if (jsonRpc.isBatchRequest(payload) && !Array.isArray(response)) { + throw new ResponseError(response, 'Got normal response for a batch request.'); + } + + if (!jsonRpc.isBatchRequest(payload) && Array.isArray(response)) { + throw new ResponseError(response, 'Got batch response for a normal request.'); + } + + if ( + (jsonRpc.isResponseWithError(response) || jsonRpc.isResponseWithResult(response)) && + !jsonRpc.isBatchRequest(payload) + ) { + if (response.id && payload.id !== response.id) { + throw new InvalidResponseError(response); + } + } + + throw new ResponseError(response, 'Invalid response'); + } + + private static _isReverted( + response: JsonRpcResponse, + ): boolean { + let error: JsonRpcError | undefined; + + if (jsonRpc.isResponseWithError(response)) { + error = (response as JsonRpcResponseWithError).error; + } else if ((response as unknown) instanceof Error) { + error = response as unknown as JsonRpcError; + } + + // This message means that there was an error while executing the code of the smart contract + // However, more processing will happen at a higher level to decode the error data, + // according to the Error ABI, if it was available as of EIP-838. + if (error?.message.includes('revert')) throw new ContractExecutionError(error); + + return false; + } + // Need to use same types as _processJsonRpcResponse so have to declare as instance method + // eslint-disable-next-line class-methods-use-this + private _buildResponse( + payload: JsonRpcPayload, + response: JsonRpcResponse, + error: boolean, + ): JsonRpcResponse { + const res = { + jsonrpc: '2.0', + // eslint-disable-next-line no-nested-ternary + id: jsonRpc.isBatchRequest(payload) + ? payload[0].id + : 'id' in payload + ? payload.id + : // Have to use the null here explicitly + // eslint-disable-next-line no-null/no-null + null, + }; + + if (error) { + return { + ...res, + error: response as unknown, + } as JsonRpcResponse; + } + + return { + ...res, + result: response as unknown, + } as JsonRpcResponse; + } +} diff --git a/packages/web3-core/src/web3_subscription_manager.ts b/packages/web3-core/src/web3_subscription_manager.ts new file mode 100644 index 00000000000..8e76498e3c2 --- /dev/null +++ b/packages/web3-core/src/web3_subscription_manager.ts @@ -0,0 +1,266 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + DataFormat, + DEFAULT_RETURN_FORMAT, + EIP1193Provider, + JsonRpcNotification, + JsonRpcSubscriptionResult, + JsonRpcSubscriptionResultOld, + Log, + Web3APISpec, + Web3BaseProvider, +} from 'web3-types'; +import { ProviderError, SubscriptionError } from 'web3-errors'; +import { isNullish } from 'web3-utils'; +import { isSupportSubscriptions } from './utils.js'; +import { Web3RequestManager, Web3RequestManagerEvent } from './web3_request_manager.js'; +// eslint-disable-next-line import/no-cycle +import { Web3SubscriptionConstructor } from './web3_subscriptions.js'; + +type ShouldUnsubscribeCondition = ({ + id, + sub, +}: { + id: string; + sub: unknown; +}) => boolean | undefined; + +export class Web3SubscriptionManager< + API extends Web3APISpec = Web3APISpec, + RegisteredSubs extends { [key: string]: Web3SubscriptionConstructor } = { + [key: string]: Web3SubscriptionConstructor; + }, +> { + private readonly _subscriptions: Map< + string, + InstanceType + > = new Map(); + + /** + * + * @param - requestManager + * @param - registeredSubscriptions + * + * @example + * ```ts + * const requestManager = new Web3RequestManager("ws://localhost:8545"); + * const subscriptionManager = new Web3SubscriptionManager(requestManager, {}); + * ``` + */ + public constructor( + requestManager: Web3RequestManager, + registeredSubscriptions: RegisteredSubs, + ); + /** + * @deprecated This constructor overloading should not be used + */ + public constructor( + requestManager: Web3RequestManager, + registeredSubscriptions: RegisteredSubs, + tolerateUnlinkedSubscription: boolean, + ); + public constructor( + public readonly requestManager: Web3RequestManager, + public readonly registeredSubscriptions: RegisteredSubs, + private readonly tolerateUnlinkedSubscription: boolean = false, + ) { + this.requestManager.on(Web3RequestManagerEvent.BEFORE_PROVIDER_CHANGE, async () => { + await this.unsubscribe(); + }); + + this.requestManager.on(Web3RequestManagerEvent.PROVIDER_CHANGED, () => { + this.clear(); + this.listenToProviderEvents(); + }); + + this.listenToProviderEvents(); + } + + private listenToProviderEvents() { + const providerAsWebProvider = this.requestManager.provider as Web3BaseProvider; + if ( + !this.requestManager.provider || + (typeof providerAsWebProvider?.supportsSubscriptions === 'function' && + !providerAsWebProvider?.supportsSubscriptions()) + ) { + return; + } + + if (typeof (this.requestManager.provider as EIP1193Provider).on === 'function') { + if ( + typeof (this.requestManager.provider as EIP1193Provider).request === 'function' + ) { + // Listen to provider messages and data + (this.requestManager.provider as EIP1193Provider).on( + 'message', + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument + (message: any) => this.messageListener(message), + ); + } else { + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument + providerAsWebProvider.on('data', (data: any) => this.messageListener(data)); + } + } + } + + protected messageListener( + data?: + | JsonRpcSubscriptionResult + | JsonRpcSubscriptionResultOld + | JsonRpcNotification, + ) { + if (!data) { + throw new SubscriptionError('Should not call messageListener with no data. Type was'); + } + const subscriptionId = + (data as JsonRpcNotification).params?.subscription || + (data as JsonRpcSubscriptionResultOld).data?.subscription || + (data as JsonRpcSubscriptionResult).id?.toString(16); + + // Process if the received data is related to a subscription + if (subscriptionId) { + const sub = this._subscriptions.get(subscriptionId); + sub?.processSubscriptionData(data); + } + } + /** + * Will create a new subscription + * + * @param name - The subscription you want to subscribe to + * @param args - Optional additional parameters, depending on the subscription type + * @param returnFormat- ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the call should be formatted. + * + * Will subscribe to a specific topic (note: name) + * @returns The subscription object + */ + public async subscribe( + name: T, + args?: ConstructorParameters[0], + returnFormat: DataFormat = DEFAULT_RETURN_FORMAT, + ): Promise> { + const Klass: RegisteredSubs[T] = this.registeredSubscriptions[name]; + if (!Klass) { + throw new SubscriptionError('Invalid subscription type'); + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + const subscription = new Klass(args ?? undefined, { + subscriptionManager: this as Web3SubscriptionManager, + returnFormat, + } as any) as InstanceType; + + await this.addSubscription(subscription); + + return subscription; + } + + /** + * Will returns all subscriptions. + */ + public get subscriptions() { + return this._subscriptions; + } + + /** + * + * Adds an instance of {@link Web3Subscription} and subscribes to it + * + * @param sub - A {@link Web3Subscription} object + */ + public async addSubscription(sub: InstanceType) { + if (!this.requestManager.provider) { + throw new ProviderError('Provider not available'); + } + + if (!this.supportsSubscriptions()) { + throw new SubscriptionError('The current provider does not support subscriptions'); + } + + if (sub.id && this._subscriptions.has(sub.id)) { + throw new SubscriptionError(`Subscription with id "${sub.id}" already exists`); + } + + await sub.sendSubscriptionRequest(); + + if (isNullish(sub.id)) { + throw new SubscriptionError('Subscription is not subscribed yet.'); + } + + this._subscriptions.set(sub.id, sub); + + return sub.id; + } + + /** + * Will clear a subscription + * + * @param id - The subscription of type {@link Web3Subscription} to remove + */ + public async removeSubscription(sub: InstanceType) { + const { id } = sub; + + if (isNullish(id)) { + throw new SubscriptionError( + 'Subscription is not subscribed yet. Or, had already been unsubscribed but not through the Subscription Manager.', + ); + } + + if (!this._subscriptions.has(id) && !this.tolerateUnlinkedSubscription) { + throw new SubscriptionError(`Subscription with id "${id.toString()}" does not exists`); + } + + await sub.sendUnsubscribeRequest(); + this._subscriptions.delete(id); + return id; + } + /** + * Will unsubscribe all subscriptions that fulfill the condition + * + * @param condition - A function that access and `id` and a `subscription` and return `true` or `false` + * @returns An array of all the un-subscribed subscriptions + */ + public async unsubscribe(condition?: ShouldUnsubscribeCondition) { + const result = []; + for (const [id, sub] of this.subscriptions.entries()) { + if (!condition || (typeof condition === 'function' && condition({ id, sub }))) { + result.push(this.removeSubscription(sub)); + } + } + + return Promise.all(result); + } + + /** + * Clears all subscriptions + */ + public clear() { + this._subscriptions.clear(); + } + + /** + * Check whether the current provider supports subscriptions. + * + * @returns `true` or `false` depending on if the current provider supports subscriptions + */ + public supportsSubscriptions(): boolean { + return isNullish(this.requestManager.provider) + ? false + : isSupportSubscriptions(this.requestManager.provider); + } +} diff --git a/packages/web3-core/src/web3_subscriptions.ts b/packages/web3-core/src/web3_subscriptions.ts new file mode 100644 index 00000000000..3cf4cee9f50 --- /dev/null +++ b/packages/web3-core/src/web3_subscriptions.ts @@ -0,0 +1,218 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line max-classes-per-file +import { + BlockOutput, + DEFAULT_RETURN_FORMAT, + DataFormat, + EthExecutionAPI, + JsonRpcSubscriptionResult, + JsonRpcSubscriptionResultOld, + JsonRpcNotification, + Log, + HexString, + Web3APIParams, + Web3APISpec, +} from 'web3-types'; +import { jsonRpc } from 'web3-utils'; +import { SubscriptionError } from 'web3-errors'; + +// eslint-disable-next-line import/no-cycle +import { Web3SubscriptionManager } from './web3_subscription_manager.js'; +import { Web3EventEmitter, Web3EventMap } from './web3_event_emitter.js'; +import { Web3RequestManager } from './web3_request_manager.js'; + +type CommonSubscriptionEvents = { + data: unknown; // Fires on each incoming block header. + error: Error; // Fires when an error in the subscription occurs. + connected: string; // Fires once after the subscription successfully connected. Returns the subscription id. +}; + +export abstract class Web3Subscription< + EventMap extends Web3EventMap, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ArgsType = any, + API extends Web3APISpec = EthExecutionAPI, + // The following generic type is just to define the type `CombinedEventMap` and use it inside the class + // it combines the user passed `EventMap` with the `CommonSubscriptionEvents` + // However, this type definition could be refactored depending on the closure of + // [Permit type alias declarations inside a class](https://github.com/microsoft/TypeScript/issues/7061) + CombinedEventMap extends CommonSubscriptionEvents = EventMap & CommonSubscriptionEvents, +> extends Web3EventEmitter { + private readonly _subscriptionManager: Web3SubscriptionManager; + private readonly _lastBlock?: BlockOutput; + private readonly _returnFormat: DataFormat; + protected _id?: HexString; + + public constructor( + args: ArgsType, + options: { subscriptionManager: Web3SubscriptionManager; returnFormat?: DataFormat }, + ); + /** + * @deprecated This constructor overloading should not be used + */ + public constructor( + args: ArgsType, + options: { requestManager: Web3RequestManager; returnFormat?: DataFormat }, + ); + public constructor( + public readonly args: ArgsType, + options: ( + | { subscriptionManager: Web3SubscriptionManager } + | { requestManager: Web3RequestManager } + ) & { + returnFormat?: DataFormat; + }, + ) { + super(); + const { requestManager } = options as { requestManager: Web3RequestManager }; + const { subscriptionManager } = options as { subscriptionManager: Web3SubscriptionManager }; + if (requestManager && subscriptionManager) { + throw new SubscriptionError( + 'Only requestManager or subscriptionManager should be provided at Subscription constructor', + ); + } + if (!requestManager && !subscriptionManager) { + throw new SubscriptionError( + 'Either requestManager or subscriptionManager should be provided at Subscription constructor', + ); + } + if (requestManager) { + // eslint-disable-next-line deprecation/deprecation + this._subscriptionManager = new Web3SubscriptionManager(requestManager, {}, true); + } else { + this._subscriptionManager = subscriptionManager; + } + + this._returnFormat = options?.returnFormat ?? (DEFAULT_RETURN_FORMAT as DataFormat); + } + + public get id() { + return this._id; + } + + public get lastBlock() { + return this._lastBlock; + } + + public async subscribe(): Promise { + return this._subscriptionManager.addSubscription(this); + } + + public processSubscriptionData( + data: + | JsonRpcSubscriptionResult + | JsonRpcSubscriptionResultOld + | JsonRpcNotification, + ) { + if (data?.data) { + // for EIP-1193 provider + this._processSubscriptionResult(data?.data?.result ?? data?.data); + } else if ( + data && + jsonRpc.isResponseWithNotification( + data as unknown as JsonRpcSubscriptionResult | JsonRpcNotification, + ) + ) { + this._processSubscriptionResult(data?.params.result); + } + } + + public async sendSubscriptionRequest(): Promise { + this._id = await this._subscriptionManager.requestManager.send({ + method: 'eth_subscribe', + params: this._buildSubscriptionParams(), + }); + + this.emit('connected', this._id); + return this._id; + } + + protected get returnFormat() { + return this._returnFormat; + } + + protected get subscriptionManager() { + return this._subscriptionManager; + } + + public async resubscribe() { + await this.unsubscribe(); + await this.subscribe(); + } + + public async unsubscribe() { + if (!this.id) { + return; + } + + await this._subscriptionManager.removeSubscription(this); + } + + public async sendUnsubscribeRequest() { + await this._subscriptionManager.requestManager.send({ + method: 'eth_unsubscribe', + params: [this.id] as Web3APIParams, + }); + this._id = undefined; + } + + // eslint-disable-next-line class-methods-use-this + protected formatSubscriptionResult(data: CombinedEventMap['data']) { + return data; + } + + public _processSubscriptionResult(data: CombinedEventMap['data'] | unknown) { + this.emit('data', this.formatSubscriptionResult(data)); + } + + public _processSubscriptionError(error: Error) { + this.emit('error', error); + } + + // eslint-disable-next-line class-methods-use-this + protected _buildSubscriptionParams(): Web3APIParams { + // This should be overridden in the subclass + throw new Error('Implement in the child class'); + } +} + +export type Web3SubscriptionConstructor< + API extends Web3APISpec, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + SubscriptionType extends Web3Subscription = Web3Subscription, +> = + | (new ( + // We accept any type of arguments here and don't deal with this type internally + // eslint-disable-next-line @typescript-eslint/no-explicit-any + args: any, + options: + | { subscriptionManager: Web3SubscriptionManager; returnFormat?: DataFormat } + | { requestManager: Web3RequestManager; returnFormat?: DataFormat }, + ) => SubscriptionType) + | (new ( + args: any, + options: { + subscriptionManager: Web3SubscriptionManager; + returnFormat?: DataFormat; + }, + ) => SubscriptionType) + | (new ( + args: any, + options: { requestManager: Web3RequestManager; returnFormat?: DataFormat }, + ) => SubscriptionType); diff --git a/packages/web3-core/test/.eslintrc.js b/packages/web3-core/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-core/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-core/test/config/jest.config.js b/packages/web3-core/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3-core/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-core/test/config/setup.js b/packages/web3-core/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-core/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-core/test/integration/jest.config.js b/packages/web3-core/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-core/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-core/test/integration/setup.js b/packages/web3-core/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-core/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-core/test/tsconfig.json b/packages/web3-core/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-core/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-core/test/unit/__snapshots__/web3_context.test.ts.snap b/packages/web3-core/test/unit/__snapshots__/web3_context.test.ts.snap new file mode 100644 index 00000000000..7e9121c85d2 --- /dev/null +++ b/packages/web3-core/test/unit/__snapshots__/web3_context.test.ts.snap @@ -0,0 +1,113 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Web3Context getContextObject should return correct context object 1`] = ` +{ + "accountProvider": undefined, + "config": { + "blockHeaderTimeout": 10, + "contractDataInputFill": "data", + "defaultAccount": undefined, + "defaultBlock": "latest", + "defaultChain": "mainnet", + "defaultCommon": undefined, + "defaultHardfork": "london", + "defaultMaxPriorityFeePerGas": "0x9502f900", + "defaultNetworkId": undefined, + "defaultTransactionType": "0x2", + "enableExperimentalFeatures": { + "useRpcCallSpecification": false, + "useSubscriptionWhenCheckingBlockTimeout": false, + }, + "handleRevert": false, + "maxListenersWarningThreshold": 100, + "transactionBlockTimeout": 50, + "transactionBuilder": undefined, + "transactionConfirmationBlocks": 24, + "transactionConfirmationPollingInterval": undefined, + "transactionPollingInterval": 1000, + "transactionPollingTimeout": 750000, + "transactionReceiptPollingInterval": undefined, + "transactionSendTimeout": 750000, + "transactionTypeParser": undefined, + }, + "provider": HttpProvider { + "clientUrl": "http://test/abc", + "httpProviderOptions": undefined, + }, + "providers": { + "HttpProvider": [Function], + "WebsocketProvider": [Function], + }, + "registeredSubscriptions": {}, + "requestManager": Web3RequestManager { + "_emitter": { + "_events": { + "BEFORE_PROVIDER_CHANGE": EE { + "context": EventEmitter { + "_events": [Circular], + "_eventsCount": 2, + "maxListeners": 9007199254740991, + }, + "fn": [Function], + "once": false, + }, + "PROVIDER_CHANGED": EE { + "context": EventEmitter { + "_events": [Circular], + "_eventsCount": 2, + "maxListeners": 9007199254740991, + }, + "fn": [Function], + "once": false, + }, + }, + "_eventsCount": 2, + "maxListeners": 9007199254740991, + Symbol(shapeMode): false, + }, + "_provider": HttpProvider { + "clientUrl": "http://test/abc", + "httpProviderOptions": undefined, + }, + "useRpcCallSpecification": undefined, + }, + "subscriptionManager": Web3SubscriptionManager { + "_subscriptions": Map {}, + "registeredSubscriptions": {}, + "requestManager": Web3RequestManager { + "_emitter": { + "_events": { + "BEFORE_PROVIDER_CHANGE": EE { + "context": EventEmitter { + "_events": [Circular], + "_eventsCount": 2, + "maxListeners": 9007199254740991, + }, + "fn": [Function], + "once": false, + }, + "PROVIDER_CHANGED": EE { + "context": EventEmitter { + "_events": [Circular], + "_eventsCount": 2, + "maxListeners": 9007199254740991, + }, + "fn": [Function], + "once": false, + }, + }, + "_eventsCount": 2, + "maxListeners": 9007199254740991, + Symbol(shapeMode): false, + }, + "_provider": HttpProvider { + "clientUrl": "http://test/abc", + "httpProviderOptions": undefined, + }, + "useRpcCallSpecification": undefined, + }, + "tolerateUnlinkedSubscription": false, + }, + "wallet": undefined, +} +`; diff --git a/packages/web3-core/test/unit/fixtures/example_subscription.ts b/packages/web3-core/test/unit/fixtures/example_subscription.ts new file mode 100644 index 00000000000..ee23ce2311e --- /dev/null +++ b/packages/web3-core/test/unit/fixtures/example_subscription.ts @@ -0,0 +1,29 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Subscription } from '../../../src'; + +export class ExampleSubscription extends Web3Subscription< + { data: string }, + { param1: string }, + { eth_subscribe: (newHeads: string) => void } +> { + // eslint-disable-next-line class-methods-use-this + protected _buildSubscriptionParams() { + return ['newHeads']; + } +} diff --git a/packages/web3-core/test/unit/formatters.test.ts b/packages/web3-core/test/unit/formatters.test.ts new file mode 100644 index 00000000000..105fb4fcf45 --- /dev/null +++ b/packages/web3-core/test/unit/formatters.test.ts @@ -0,0 +1,708 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import * as utils from 'web3-utils'; +import { BlockTags } from 'web3-types'; +import { Iban } from 'web3-eth-iban'; +import { + inputAddressFormatter, + inputBlockNumberFormatter, + inputDefaultBlockNumberFormatter, + inputPostFormatter, + inputTopicFormatter, + outputBigIntegerFormatter, + outputBlockFormatter, + outputLogFormatter, + outputPostFormatter, + outputProofFormatter, + outputSyncingFormatter, + outputTransactionReceiptFormatter, + txInputOptionsFormatter, +} from '../../src/formatters'; + +import * as formatters from '../../src/formatters'; + +/* eslint-disable deprecation/deprecation */ +jest.mock('web3-eth-iban'); +jest.mock('web3-utils'); + +describe('formatters', () => { + const toNumberResult = 12345; + const numberToHexResult = '0xff'; + const hexToNumberResult = 123; + const sha3Result = 'sha3Result'; + const toChecksumAddressResult = 'toChecksumAddress'; + const hexToNumberStringResult = '1234'; + + beforeEach(() => { + jest.spyOn(utils, 'toChecksumAddress').mockReturnValue(toChecksumAddressResult); + jest.spyOn(utils, 'hexToNumberString').mockReturnValue(hexToNumberStringResult); + jest.spyOn(utils, 'toNumber').mockReturnValue(toNumberResult); + jest.spyOn(utils, 'numberToHex').mockReturnValue(numberToHexResult); + jest.spyOn(utils, 'hexToNumber').mockReturnValue(hexToNumberResult); + jest.spyOn(utils, 'isHexStrict').mockReturnValue(true); + jest.spyOn(utils, 'isAddress').mockReturnValue(true); + jest.spyOn(utils, 'sha3Raw').mockReturnValue(sha3Result); + jest.spyOn(Iban, 'isValid').mockImplementation(() => false); + jest.spyOn(Iban, 'isDirect').mockImplementation(() => false); + }); + + describe('outputProofFormatter', () => { + it('should format the values correctly', () => { + const result = outputProofFormatter({ + address: '0x09d7bD9E185fbC2d265D8DBe81e5e888E391688b', + nonce: '0xFF', + balance: '0xFA', + }); + + expect(utils.toChecksumAddress).toHaveBeenCalledWith( + '0x09d7bD9E185fbC2d265D8DBe81e5e888E391688b', + ); + expect(utils.hexToNumberString).toHaveBeenCalledWith('0xFF'); + expect(utils.hexToNumberString).toHaveBeenCalledWith('0xFA'); + + expect(result).toEqual({ + address: toChecksumAddressResult, + balance: hexToNumberStringResult, + nonce: hexToNumberStringResult, + }); + }); + }); + + describe('inputTopicFormatter', () => { + it('check params', () => { + expect(inputTopicFormatter('0x09d7bD9E185fbC2d265D8DBe81e5e888E391688b')).toBe( + '0x09d7bD9E185fbC2d265D8DBe81e5e888E391688b', + ); + // @ts-expect-error invalid param + // eslint-disable-next-line no-null/no-null + expect(inputTopicFormatter(null)).toBeNull(); + }); + }); + + describe('outputBigIntegerFormatter', () => { + it('should convert input to number', () => { + const result = outputBigIntegerFormatter(BigInt(12)); + + expect(utils.toNumber).toHaveBeenCalledWith(BigInt(12)); + expect(result).toEqual(toNumberResult); + }); + }); + + describe('inputBlockNumberFormatter', () => { + it('should return undefined if block number not given', () => { + expect(inputBlockNumberFormatter(undefined)).toBeUndefined(); + }); + + it.each([BlockTags.EARLIEST, BlockTags.LATEST, BlockTags.PENDING])( + 'should return "%s" values for "%s" block numbers', + blockNumber => { + expect(inputBlockNumberFormatter(blockNumber)).toEqual(blockNumber); + }, + ); + + it('should return valid genesis block number', () => { + expect(inputBlockNumberFormatter('genesis')).toBe('0x0'); + }); + + it('should return lower case hex value for a valid hex string', () => { + jest.spyOn(utils, 'isHexStrict').mockReturnValue(true); + const result = inputBlockNumberFormatter('0xAF0AF'); + + expect(utils.isHexStrict).toHaveBeenCalledWith('0xAF0AF'); + expect(utils.numberToHex).not.toHaveBeenCalled(); + expect(result).toBe('0xaf0af'); + }); + + it('should try parsing number if given value is not valid hex string', () => { + jest.spyOn(utils, 'isHexStrict').mockReturnValue(false); + const result = inputBlockNumberFormatter('0xAF0AF'); + + expect(utils.isHexStrict).toHaveBeenCalledWith('0xAF0AF'); + expect(utils.numberToHex).toHaveBeenCalledWith('0xAF0AF'); + expect(result).toEqual(numberToHexResult); + }); + }); + + describe('inputDefaultBlockNumberFormatter', () => { + it('should return default block if block number not provided', () => { + expect(inputDefaultBlockNumberFormatter(undefined, 255)).toBe('0xff'); + }); + + it('should return block number if block number provided', () => { + expect(inputDefaultBlockNumberFormatter(10, 255)).toEqual(numberToHexResult); + + expect(utils.numberToHex).toHaveBeenCalledWith(10); + }); + }); + + describe('inputAddressFormatter', () => { + it('should return lowercase address if given value is iban', () => { + const address = '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8'; + Iban.prototype.toAddress = jest.fn(() => address); + + jest.spyOn(Iban, 'isValid').mockImplementation(() => true); + jest.spyOn(Iban, 'isDirect').mockImplementation(() => true); + + expect(inputAddressFormatter('XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS')).toBe(address); + expect(Iban.prototype.toAddress).toHaveBeenCalled(); + }); + + it('should return lower case value if valid address', () => { + jest.spyOn(utils, 'isAddress').mockReturnValue(true); + + expect(inputAddressFormatter('0xAcb')).toBe('0xacb'); + }); + + it('should throw error if not a valid address or iban', () => { + jest.spyOn(utils, 'isAddress').mockReturnValue(false); + + expect(() => inputAddressFormatter('0xAcb')).toThrow( + 'Provided address 0xAcb is invalid', + ); + }); + }); + + describe('txInputOptionsFormatter', () => { + let txInput: any; + + beforeEach(() => { + jest.spyOn(utils, 'isAddress').mockReturnValue(true); + txInput = { + to: '0xabcd', + }; + }); + + it('should format "to" address if provided', () => { + expect(txInputOptionsFormatter({ ...txInput, to: '0xABCD' })).toEqual( + expect.objectContaining({ to: '0xabcd' }), + ); + }); + + it('should throw error if "data" and "input" both are provided', () => { + expect(() => + txInputOptionsFormatter({ ...txInput, input: '0xff0011', data: '0xff' }), + ).toThrow( + 'You can\'t have "data" and "input" as properties of transactions at the same time, please use either "data" or "input" instead.', + ); + }); + + it('should replace "input" with "data" if "data" is given and "input" is not', () => { + const result = txInputOptionsFormatter({ ...txInput, data: '0xff0011' }); + + expect(result).toEqual(expect.objectContaining({ input: '0xff0011' })); + expect(Object.keys(result)).not.toContain('data'); + }); + + it('should prefix "input" with "0x" if not already', () => { + expect(txInputOptionsFormatter({ ...txInput, input: 'ff0011' })).toEqual( + expect.objectContaining({ input: '0xff0011' }), + ); + }); + + it('should throw error if "input" is not a valid hex string', () => { + jest.spyOn(utils, 'isHexStrict').mockReturnValue(false); + + expect(() => txInputOptionsFormatter({ ...txInput, input: 'ff0011' })).toThrow( + 'The input field must be HEX encoded data.', + ); + expect(utils.isHexStrict).toHaveBeenCalledWith('0xff0011'); + }); + it('should set "gas" equal to "gas" if provided', () => { + expect(txInputOptionsFormatter({ ...txInput, data: '0xff0011', gas: '123' })).toEqual( + expect.objectContaining({ gas: numberToHexResult }), + ); + expect(utils.toNumber).toHaveBeenCalledWith('123'); + }); + + it('should set "gas" equal to "gasLimit" if "gas" not provided', () => { + expect( + txInputOptionsFormatter({ ...txInput, data: '0xff0011', gasLimit: '446' }), + ).toEqual(expect.objectContaining({ gas: numberToHexResult })); + expect(utils.toNumber).toHaveBeenCalledWith('446'); + }); + + it('should remove "gasPrice" if "maxPriorityFeePerGas" or "maxFeePerGas" is given', () => { + const result = txInputOptionsFormatter({ + ...txInput, + input: '0xff0011', + gasPrice: '123', + maxPriorityFeePerGas: '456', + }); + expect(Object.keys(result)).not.toContain('gasPrice'); + + const result2 = txInputOptionsFormatter({ + ...txInput, + input: '0xff0011', + gasPrice: '123', + maxFeePerGas: '456', + }); + expect(Object.keys(result2)).not.toContain('gasPrice'); + }); + + it.each(['gasPrice', 'gas', 'value', 'maxPriorityFeePerGas', 'maxFeePerGas', 'nonce'])( + 'should convert "%s" number value to hex', + attr => { + jest.spyOn(utils, 'toNumber').mockReturnValue(BigInt(5678)); + + expect( + txInputOptionsFormatter({ ...txInput, data: '0xff0011', [attr]: BigInt(5678) }), + ).toEqual(expect.objectContaining({ [attr]: numberToHexResult })); + + expect(utils.numberToHex).toHaveBeenCalledWith(BigInt(5678)); + }, + ); + }); + + describe('outputLogFormatter', () => { + it('should set log id from "blockHash", "transactionHash" and "logIndex"', () => { + const result = outputLogFormatter({ + blockHash: 'blockHash', + transactionHash: 'transactionHash', + logIndex: 'logIndex', + }); + + expect(utils.sha3Raw).toHaveBeenCalledWith('blockHashtransactionHashlogIndex'); + + expect(result.id).toBe(`log_${sha3Result.slice(0, 8)}`); + }); + + it('should convert "blockNumber" from hex to number', () => { + const result = outputLogFormatter({ + blockHash: 'blockHash', + transactionHash: 'transactionHash', + logIndex: 'logIndex', + blockNumber: '0xFF0011', + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('0xFF0011'); + expect(result.blockNumber).toEqual(hexToNumberResult); + }); + + it('should convert "transactionIndex" from hex to number', () => { + const result = outputLogFormatter({ + blockHash: 'blockHash', + transactionHash: 'transactionHash', + logIndex: 'logIndex', + transactionIndex: '0xFF0011', + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('0xFF0011'); + expect(result.transactionIndex).toEqual(hexToNumberResult); + }); + + it('should convert "logIndex" from hex to number', () => { + const result = outputLogFormatter({ + blockHash: 'blockHash', + transactionHash: 'transactionHash', + logIndex: '0xFF0011', + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('0xFF0011'); + expect(result.logIndex).toEqual(hexToNumberResult); + }); + + it('should convert "address" to checksum address', () => { + const result = outputLogFormatter({ + blockHash: 'blockHash', + transactionHash: 'transactionHash', + logIndex: '0xFF0011', + address: 'address', + }); + + expect(utils.toChecksumAddress).toHaveBeenCalledWith('address'); + expect(result.address).toEqual(toChecksumAddressResult); + }); + }); + + describe('outputTransactionReceiptFormatter', () => { + const validReceipt = { cumulativeGasUsed: '0x1234', gasUsed: '0x4567' }; + + it('should be FormatterError', () => { + // @ts-expect-error invalid param + expect(() => outputTransactionReceiptFormatter(1)).toThrow( + `Received receipt is invalid: 1`, + ); + }); + it('should convert "blockNumber" from hex to number', () => { + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + blockNumber: '0x12', + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('0x12'); + expect(result).toEqual(expect.objectContaining({ blockNumber: hexToNumberResult })); + }); + + it('should convert "transactionIndex" from hex to number', () => { + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + transactionIndex: '0x12', + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('0x12'); + expect(result).toEqual( + expect.objectContaining({ transactionIndex: hexToNumberResult }), + ); + }); + + it('should convert "cumulativeGasUsed" from hex to number', () => { + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith(validReceipt.cumulativeGasUsed); + expect(result).toEqual( + expect.objectContaining({ cumulativeGasUsed: hexToNumberResult }), + ); + }); + + it('should convert "gasUsed" from hex to number', () => { + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith(validReceipt.gasUsed); + expect(result).toEqual(expect.objectContaining({ gasUsed: hexToNumberResult })); + }); + + it('should format "logs" if available', () => { + const logs = ['0x12' as any, '0x456' as any]; + jest.spyOn(formatters, 'outputLogFormatter').mockReturnValue( + 'outputLogFormatterResult' as any, + ); + + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + logs, + }); + + expect(formatters.outputLogFormatter).toHaveBeenCalledTimes(logs.length); + + expect(formatters.outputLogFormatter).toHaveBeenCalledWith(logs[0], 0, logs); + + expect(formatters.outputLogFormatter).toHaveBeenCalledWith(logs[1], 1, logs); + expect(result.logs).toEqual(['outputLogFormatterResult', 'outputLogFormatterResult']); + }); + + it('when log doesn`t have id', () => { + const res = formatters.outputLogFormatter({ blockHash: '0x1', logIndex: '0x1' }); + expect(res.id).toBeUndefined(); + }); + + it('should convert "contractAddress" to checksum address', () => { + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + contractAddress: '0x12', + }); + + expect(utils.toChecksumAddress).toHaveBeenCalledWith('0x12'); + expect(result).toEqual( + expect.objectContaining({ contractAddress: toChecksumAddressResult }), + ); + }); + + it('should convert "status" to boolean value "true"', () => { + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + status: '10', + }); + + expect(result.status).toBeTruthy(); + }); + + it('should convert "status" to boolean value "false"', () => { + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + status: '0', + }); + + expect(result.status).toBeFalsy(); + }); + + it('should convert "effectiveGasPrice" from hex to number', () => { + const effectiveGasPrice = '0x80d9594d23495b'; + + const result = outputTransactionReceiptFormatter({ + ...validReceipt, + effectiveGasPrice, + }); + + expect(utils.hexToNumber).toHaveBeenCalledWith(effectiveGasPrice); + expect(result).toEqual( + expect.objectContaining({ effectiveGasPrice: hexToNumberResult }), + ); + }); + }); + + describe('outputBlockFormatter', () => { + const validBlock = { + gasLimit: 'gasLimit', + gasUsed: 'gasUsed', + size: 'size', + timestamp: 'timestamp', + }; + + it('should convert "gasLimit" from hex to number', () => { + const result = outputBlockFormatter({ ...validBlock } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('gasLimit'); + expect(result).toEqual(expect.objectContaining({ gasLimit: hexToNumberResult })); + }); + + it('should convert "gasUsed" from hex to number', () => { + const result = outputBlockFormatter({ ...validBlock } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('gasUsed'); + expect(result).toEqual(expect.objectContaining({ gasUsed: hexToNumberResult })); + }); + + it('should convert "size" from hex to number', () => { + const result = outputBlockFormatter({ ...validBlock } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('size'); + expect(result).toEqual(expect.objectContaining({ size: hexToNumberResult })); + }); + + it('should convert "timestamp" from hex to number', () => { + const result = outputBlockFormatter({ ...validBlock } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('timestamp'); + expect(result).toEqual(expect.objectContaining({ timestamp: hexToNumberResult })); + }); + + it('should convert "number" from hex to number', () => { + const result = outputBlockFormatter({ ...validBlock, number: 'number' } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('number'); + expect(result).toEqual(expect.objectContaining({ number: hexToNumberResult })); + }); + + it('should convert "difficulty" to bigint', () => { + jest.spyOn(formatters, 'outputBigIntegerFormatter').mockReturnValue( + 'outputBigIntegerFormatterResult' as any, + ); + const result = outputBlockFormatter({ ...validBlock, difficulty: 'difficulty' } as any); + + expect(formatters.outputBigIntegerFormatter).toHaveBeenCalledWith('difficulty'); + expect(result).toEqual( + expect.objectContaining({ difficulty: 'outputBigIntegerFormatterResult' }), + ); + }); + + it('should convert "totalDifficulty" to bigint', () => { + jest.spyOn(formatters, 'outputBigIntegerFormatter').mockReturnValue( + 'outputBigIntegerFormatterResult' as any, + ); + const result = outputBlockFormatter({ + ...validBlock, + totalDifficulty: 'totalDifficulty', + } as any); + + expect(formatters.outputBigIntegerFormatter).toHaveBeenCalledWith('totalDifficulty'); + expect(result).toEqual( + expect.objectContaining({ totalDifficulty: 'outputBigIntegerFormatterResult' }), + ); + }); + + it('should format "transactions" with correct formatter', () => { + const transactions = ['trs1', 'trs2']; + jest.spyOn(formatters, 'outputTransactionFormatter').mockReturnValue( + 'outputTransactionFormatterResult' as any, + ); + + const result = outputBlockFormatter({ ...validBlock, transactions } as any); + + expect(formatters.outputTransactionFormatter).toHaveBeenCalledTimes( + transactions.length, + ); + expect(formatters.outputTransactionFormatter).toHaveBeenCalledWith( + transactions[0], + + 0, + transactions, + ); + expect(formatters.outputTransactionFormatter).toHaveBeenCalledWith( + transactions[1], + + 1, + transactions, + ); + expect(result).toEqual( + expect.objectContaining({ + transactions: [ + 'outputTransactionFormatterResult', + 'outputTransactionFormatterResult', + ], + }), + ); + }); + + it('should convert "miner" to checksum address', () => { + const result = outputBlockFormatter({ ...validBlock, miner: 'miner' } as any); + + expect(utils.toChecksumAddress).toHaveBeenCalledWith('miner'); + expect(result).toEqual(expect.objectContaining({ miner: toChecksumAddressResult })); + }); + + it('should convert "baseFeePerGas" from hex to number', () => { + jest.spyOn(formatters, 'outputBigIntegerFormatter').mockReturnValue(123); + const result = outputBlockFormatter({ + ...validBlock, + baseFeePerGas: 'baseFeePerGas', + } as any); + + expect(outputBigIntegerFormatter).toHaveBeenCalledWith('baseFeePerGas'); + expect(result).toEqual(expect.objectContaining({ baseFeePerGas: hexToNumberResult })); + }); + }); + + describe('inputPostFormatter', () => { + it('should convert "ttl" from number to hex', () => { + const result = inputPostFormatter({ ttl: 'ttl' } as any); + + expect(utils.numberToHex).toHaveBeenCalledWith('ttl'); + expect(result).toEqual(expect.objectContaining({ ttl: numberToHexResult })); + }); + + it('should convert "workToProve" from number to hex', () => { + const result = inputPostFormatter({ workToProve: 'workToProve' } as any); + + expect(utils.numberToHex).toHaveBeenCalledWith('workToProve'); + expect(result).toEqual(expect.objectContaining({ workToProve: numberToHexResult })); + }); + + it('should convert "priority" from number to hex', () => { + const result = inputPostFormatter({ priority: 'priority' } as any); + + expect(utils.numberToHex).toHaveBeenCalledWith('priority'); + expect(result).toEqual(expect.objectContaining({ priority: numberToHexResult })); + }); + + it('should convert "topics" to array if single value provided', () => { + const result = inputPostFormatter({ topics: '0x123' } as any); + + expect(result).toEqual(expect.objectContaining({ topics: ['0x123'] })); + }); + + it('should convert "topics" to hex if not already', () => { + jest.spyOn(utils, 'fromUtf8').mockReturnValue('fromUtf8Result'); + const result = inputPostFormatter({ topics: ['0x123', 'non-hex-value'] } as any); + + expect(utils.fromUtf8).toHaveBeenCalledTimes(1); + expect(utils.fromUtf8).toHaveBeenCalledWith('non-hex-value'); + expect(result).toEqual( + expect.objectContaining({ topics: ['0x123', 'fromUtf8Result'] }), + ); + }); + }); + + describe('outputPostFormatter', () => { + it('should convert "expiry" from hex to number', () => { + const result = outputPostFormatter({ expiry: 'expiry' } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('expiry'); + expect(result).toEqual(expect.objectContaining({ expiry: hexToNumberResult })); + }); + + it('should convert "sent" from hex to number', () => { + const result = outputPostFormatter({ sent: 'sent' } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('sent'); + expect(result).toEqual(expect.objectContaining({ sent: hexToNumberResult })); + }); + + it('should convert "ttl" from hex to number', () => { + const result = outputPostFormatter({ ttl: 'ttl' } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('ttl'); + expect(result).toEqual(expect.objectContaining({ ttl: hexToNumberResult })); + }); + + it('should convert "workProved" from hex to number', () => { + const result = outputPostFormatter({ workProved: 'workProved' } as any); + + expect(utils.hexToNumber).toHaveBeenCalledWith('workProved'); + expect(result).toEqual(expect.objectContaining({ workProved: hexToNumberResult })); + }); + + it('should set "topics" to empty array if not provided', () => { + const result = outputPostFormatter({} as any); + + expect(result).toEqual(expect.objectContaining({ topics: [] })); + }); + + it('should convert "topics" from utf8 to hex', () => { + const topics = ['0x123', 'non-hex-value']; + jest.spyOn(utils, 'toUtf8').mockReturnValue('toUtf8Result'); + + const result = outputPostFormatter({ topics } as any); + + expect(utils.toUtf8).toHaveBeenCalledTimes(topics.length); + + expect(utils.toUtf8).toHaveBeenCalledWith(topics[0], 0, topics); + + expect(utils.toUtf8).toHaveBeenCalledWith(topics[1], 1, topics); + expect(result).toEqual( + expect.objectContaining({ topics: ['toUtf8Result', 'toUtf8Result'] }), + ); + }); + }); + + describe('outputSyncingFormatter', () => { + const validObject = { + startingBlock: 'startingBlock', + currentBlock: 'currentBlock', + highestBlock: 'highestBlock', + }; + + it('should convert "startingBlock" from hex to number', () => { + const result = outputSyncingFormatter({ ...validObject }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('startingBlock'); + expect(result).toEqual(expect.objectContaining({ startingBlock: hexToNumberResult })); + }); + + it('should convert "currentBlock" from hex to number', () => { + const result = outputSyncingFormatter({ ...validObject }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('currentBlock'); + expect(result).toEqual(expect.objectContaining({ currentBlock: hexToNumberResult })); + }); + + it('should convert "highestBlock" from hex to number', () => { + const result = outputSyncingFormatter({ ...validObject }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('highestBlock'); + expect(result).toEqual(expect.objectContaining({ highestBlock: hexToNumberResult })); + }); + + it('should convert "knownStates" from hex to number', () => { + const result = outputSyncingFormatter({ ...validObject, knownStates: 'knownStates' }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('highestBlock'); + expect(result).toEqual(expect.objectContaining({ knownStates: hexToNumberResult })); + }); + + it('should convert "pulledStates" from hex to number', () => { + const result = outputSyncingFormatter({ ...validObject, pulledStates: 'pulledStates' }); + + expect(utils.hexToNumber).toHaveBeenCalledWith('highestBlock'); + expect(result).toEqual(expect.objectContaining({ pulledStates: hexToNumberResult })); + }); + }); +}); diff --git a/packages/web3-core/test/unit/jest.config.js b/packages/web3-core/test/unit/jest.config.js new file mode 100644 index 00000000000..0d8c33a998a --- /dev/null +++ b/packages/web3-core/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-core-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-core/test/unit/reexported_web3_context.ts b/packages/web3-core/test/unit/reexported_web3_context.ts new file mode 100644 index 00000000000..b54881fd724 --- /dev/null +++ b/packages/web3-core/test/unit/reexported_web3_context.ts @@ -0,0 +1,19 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from '../../src/index'; + +export { Web3Context }; diff --git a/packages/web3-core/test/unit/web3_batch_request.test.ts b/packages/web3-core/test/unit/web3_batch_request.test.ts new file mode 100644 index 00000000000..53e12cfe782 --- /dev/null +++ b/packages/web3-core/test/unit/web3_batch_request.test.ts @@ -0,0 +1,201 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { JsonRpcBatchRequest, JsonRpcBatchResponse, JsonRpcOptionalRequest } from 'web3-types'; +import { jsonRpc, Web3DeferredPromise, Timeout } from 'web3-utils'; +import { OperationAbortError, OperationTimeoutError } from 'web3-errors'; +import { Web3BatchRequest } from '../../src/web3_batch_request'; + +describe('Web3BatchRequest', () => { + let requestManager: any; + let batchRequest: Web3BatchRequest; + let requestId = 0; + + beforeEach(() => { + requestManager = { + sendBatch: jest.fn(), + }; + + batchRequest = new Web3BatchRequest(requestManager); + + jest.spyOn(jsonRpc, 'toPayload').mockImplementation(request => { + // eslint-disable-next-line no-plusplus + return { ...request, id: request.id ?? ++requestId, jsonrpc: '2.0' }; + }); + }); + + describe('constructor', () => { + it('should create batch request object with empty list of requests', async () => { + expect(batchRequest).toBeInstanceOf(Web3BatchRequest); + expect(batchRequest.requests).toEqual([]); + expect(batchRequest.requests).toHaveLength(0); + expect(await batchRequest.execute()).toEqual([]); + }); + }); + + describe('add', () => { + it('should add request to the list', async () => { + jest.spyOn(requestManager, 'sendBatch').mockResolvedValue([ + { id: 1, jsonrpc: '2.0', result: 'result' }, + ]); + + // This catch should never trigger + batchRequest.add({ method: 'my_method', params: [], id: 1 }).catch(err => { + throw err; + }); + + expect(batchRequest.requests).toEqual([ + { method: 'my_method', params: [], id: 1, jsonrpc: '2.0' }, + ]); + + // Make sure request didn't timeout + await batchRequest.execute(); + }); + + it('should return a deferred promise', async () => { + jest.spyOn(requestManager, 'sendBatch').mockResolvedValue([ + { id: 1, jsonrpc: '2.0', result: 'result' }, + ]); + + const result = batchRequest.add({ id: 1, method: 'my_method', params: [] }); + expect(result).toBeInstanceOf(Web3DeferredPromise); + + // Make sure request didn't timeout + await batchRequest.execute(); + }); + }); + + describe('execute', () => { + let request1: JsonRpcOptionalRequest; + let request2: JsonRpcOptionalRequest; + let batchPayload: JsonRpcBatchRequest; + let response1: any; + let response2: any; + let batchResponse: JsonRpcBatchResponse; + + beforeEach(() => { + request1 = { id: 10, method: 'my_method', params: [] }; + request2 = { id: 11, method: 'my_method2', params: [] }; + response1 = { + id: 10, + jsonrpc: '2.0', + result: 'request-1-result', + }; + response2 = { + id: 11, + jsonrpc: '2.0', + result: 'request-2-result', + }; + batchPayload = jsonRpc.toBatchPayload([request1, request2]); + batchResponse = [response1, response2]; + + jest.spyOn(requestManager, 'sendBatch').mockResolvedValue(batchResponse); + }); + + it('should send batch request to request manager', async () => { + const res1 = batchRequest.add(request1); + const res2 = batchRequest.add(request2); + + await batchRequest.execute(); + + expect(requestManager.sendBatch).toHaveBeenCalledTimes(1); + expect(requestManager.sendBatch).toHaveBeenCalledWith(batchPayload); + await expect(res1).resolves.toBeDefined(); + await expect(res2).resolves.toBeDefined(); + }); + + it('should throw error if response size does not match', async () => { + jest.spyOn(requestManager, 'sendBatch').mockResolvedValue([response1]); + + const res1 = batchRequest.add(request1); + const res2 = batchRequest.add(request2); + + await expect(batchRequest.execute()).rejects.toThrow( + 'Batch request size mismatch the results size. Requests: 2, Responses: 1', + ); + await expect(res1).rejects.toThrow(new OperationAbortError('Invalid batch response')); + await expect(res2).rejects.toThrow(new OperationAbortError('Invalid batch response')); + }); + + it('should throw error if response ids does not match', async () => { + jest.spyOn(requestManager, 'sendBatch').mockResolvedValue([ + response1, + { ...response2, id: 1 }, + ]); + + const res1 = batchRequest.add(request1); + const res2 = batchRequest.add(request2); + + await expect(batchRequest.execute()).rejects.toThrow( + 'Batch request mismatch the results. Requests: [10,11], Responses: [1,10]', + ); + await expect(res1).rejects.toThrow(new OperationAbortError('Invalid batch response')); + await expect(res2).rejects.toThrow(new OperationAbortError('Invalid batch response')); + }); + + it('should resolve individual request on execution', async () => { + const res1 = batchRequest.add(request1); + const res2 = batchRequest.add(request2); + + await expect(batchRequest.execute()).resolves.toEqual([response1, response2]); + await expect(res1).resolves.toEqual(response1.result); + await expect(res2).resolves.toEqual(response2.result); + }); + + it('should resolve request with result and reject request with error', async () => { + const responseWithError = { + ...response2, + result: undefined, + error: { message: 'RPC responded with error response', code: 12 }, + }; + jest.spyOn(requestManager, 'sendBatch').mockResolvedValue([ + response1, + responseWithError, + ]); + + const res1 = batchRequest.add(request1); + const res2 = batchRequest.add(request2); + + await expect(batchRequest.execute()).resolves.toEqual([response1, responseWithError]); + await expect(res1).resolves.toEqual(response1.result); + await expect(res2).rejects.toEqual(responseWithError.error); + }); + + it('should timeout if request not executed in a particular time', async () => { + let timerId!: Timeout; + + jest.spyOn(requestManager, 'sendBatch').mockImplementation(async () => { + return new Promise(resolve => { + timerId = setTimeout(() => { + resolve(batchResponse); + }, 2000); + }); + }); + + const res1 = batchRequest.add(request1); + const res2 = batchRequest.add(request2); + + await expect(batchRequest.execute()).rejects.toThrow( + new OperationTimeoutError('Batch request timeout'), + ); + await expect(res1).rejects.toThrow(new OperationAbortError('Batch request timeout')); + await expect(res2).rejects.toThrow(new OperationAbortError('Batch request timeout')); + + clearTimeout(timerId); + }); + }); +}); diff --git a/packages/web3-core/test/unit/web3_config.test.ts b/packages/web3-core/test/unit/web3_config.test.ts new file mode 100644 index 00000000000..32a5fc17ddc --- /dev/null +++ b/packages/web3-core/test/unit/web3_config.test.ts @@ -0,0 +1,148 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { toHex } from 'web3-utils'; +import { Web3Config, Web3ConfigEvent } from '../../src/web3_config'; + +class MyConfigObject extends Web3Config {} + +const defaultConfig = { + blockHeaderTimeout: 10, + defaultAccount: undefined, + defaultBlock: 'latest', + defaultChain: 'mainnet', + defaultNetworkId: undefined, + defaultCommon: undefined, + defaultHardfork: 'london', + enableExperimentalFeatures: { + useSubscriptionWhenCheckingBlockTimeout: false, + useRpcCallSpecification: false, + }, + handleRevert: false, + contractDataInputFill: 'data', + maxListenersWarningThreshold: 100, + transactionBlockTimeout: 50, + transactionConfirmationBlocks: 24, + transactionPollingInterval: 1000, + transactionPollingTimeout: 750 * 1000, + transactionReceiptPollingInterval: undefined, + transactionSendTimeout: 750 * 1000, + transactionConfirmationPollingInterval: undefined, + defaultTransactionType: '0x2', + defaultMaxPriorityFeePerGas: toHex(2500000000), +}; +const setValue = { + string: 'newValue', + number: 99, +}; + +describe('Web3Config', () => { + it('should init default config values', () => { + const obj = new MyConfigObject(); + + expect(obj.config).toEqual(defaultConfig); + }); + + it.each(Object.keys(defaultConfig))('should expose a public getter for "%s"', key => { + const obj = new MyConfigObject(); + const getterSpy = jest.spyOn(obj, key as keyof MyConfigObject, 'get'); + + const result = obj[key as never]; + + expect(getterSpy).toHaveBeenCalledTimes(1); + expect(result).toEqual(defaultConfig[key as never]); + }); + + it.each(Object.keys(defaultConfig))('should expose a public setter for "%s"', key => { + const obj = new MyConfigObject(); + const setterSpy = jest.spyOn(obj, key as keyof MyConfigObject, 'set'); + obj[key as keyof MyConfigObject] = obj[key as never]; + expect(setterSpy).toHaveBeenCalledTimes(1); + }); + + it.each(Object.keys(defaultConfig))('should set new config for "%s"', key => { + const obj = new MyConfigObject(); + + const valueType = typeof obj[key as never]; + const newValue = setValue[valueType as never]; + obj[key as never] = newValue; + const result = obj[key as never]; + + expect(result).toBe(newValue); + }); + + it.each(Object.keys(defaultConfig))( + 'should trigger "configChange" event if "%s" is changed', + key => { + const obj = new MyConfigObject(); + const configChange = jest.fn(); + obj.on(Web3ConfigEvent.CONFIG_CHANGE, configChange); + const valueType = typeof obj[key as never]; + const newValue = setValue[valueType as never]; + obj[key as never] = newValue; + if (key === 'transactionPollingInterval') return; + + expect(configChange).toHaveBeenCalledTimes(1); + expect(configChange).toHaveBeenCalledWith({ + name: key, + oldValue: defaultConfig[key as never], + newValue, + }); + }, + ); + + it('set default chain error', () => { + const obj = new MyConfigObject(); + + obj.setConfig({ + // @ts-expect-error incorrect object + defaultCommon: { + baseChain: 'mainnet', + }, + }); + expect(() => { + obj.defaultChain = 'test'; + }).toThrow( + 'Web3Config chain doesnt match in defaultHardfork mainnet and common.hardfork test', + ); + }); + + it('Updating transactionPollingInterval should update transactionReceiptPollingInterval and transactionConfirmationPollingInterval', () => { + const obj = new MyConfigObject(); + const configChange = jest.fn(); + obj.on(Web3ConfigEvent.CONFIG_CHANGE, configChange); + + obj.transactionPollingInterval = 1500; + + expect(configChange).toHaveBeenCalledTimes(3); + expect(configChange).toHaveBeenCalledWith({ + name: 'transactionPollingInterval', + oldValue: defaultConfig.transactionPollingInterval, + newValue: 1500, + }); + expect(configChange).toHaveBeenCalledWith({ + name: 'transactionReceiptPollingInterval', + oldValue: defaultConfig.transactionReceiptPollingInterval, + newValue: 1500, + }); + expect(configChange).toHaveBeenCalledWith({ + name: 'transactionConfirmationPollingInterval', + oldValue: defaultConfig.transactionConfirmationPollingInterval, + newValue: 1500, + }); + }); +}); diff --git a/packages/web3-core/test/unit/web3_context.test.ts b/packages/web3-core/test/unit/web3_context.test.ts new file mode 100644 index 00000000000..3c433f7259a --- /dev/null +++ b/packages/web3-core/test/unit/web3_context.test.ts @@ -0,0 +1,244 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line max-classes-per-file +import { ExistingPluginNamespaceError } from 'web3-errors'; +import HttpProvider from 'web3-providers-http'; +import { Web3Context, Web3PluginBase } from '../../src/web3_context'; +import { Web3RequestManager } from '../../src/web3_request_manager'; + +// eslint-disable-next-line @typescript-eslint/ban-types +class Context1 extends Web3Context<{}> {} +// eslint-disable-next-line @typescript-eslint/ban-types +class Context2 extends Web3Context<{}> {} + +describe('Web3Context', () => { + describe('constructor()', () => { + it('should return providers on class level', () => { + expect(Web3Context.providers).toBeDefined(); + }); + + it('should return providers on instance level', () => { + const context = new Web3Context('http://test.com'); + expect(context.providers).toBeDefined(); + expect(context.providers).toEqual(Web3Context.providers); + }); + + it('should create instance of request manager', () => { + const context = new Web3Context('http://test.com'); + + expect(context.requestManager).toBeInstanceOf(Web3RequestManager); + }); + + it('should return current provider from request manager', () => { + const context = new Web3Context('http://test.com'); + + expect(context.currentProvider).toBe(context.requestManager.provider); + }); + + it('should initialize the provider from options', () => { + const context = new Web3Context({ provider: 'http://test.com' }); + + expect(context.currentProvider).toBeInstanceOf(HttpProvider); + }); + + it('should set return current provider for the request manager', () => { + const context = new Web3Context('http://test.com'); + + context.currentProvider = 'http://test/abc'; + + expect(context.currentProvider).toBeInstanceOf(HttpProvider); + }); + }); + + describe('getContextObject', () => { + it('should return correct context object', () => { + const context = new Context1('http://test/abc'); + + // The following is because a specific property is different in node 18 than it is in node 20 and 21 + // So the problematic property is removed from the object and then added to ensure its presence and its location + // And the snapshot is updated to reflect the change. + // Once node 18 is no longer supported, this can be removed. And the snapshot need to be updated then. + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const symbolForShapeMode = Object.getOwnPropertySymbols( + (context.getContextObject().requestManager as any)._emitter, + ).find(s => s.description === 'shapeMode'); + if (symbolForShapeMode) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + delete (context.getContextObject().requestManager as any)._emitter[symbolForShapeMode]; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (context.getContextObject().requestManager as any)._emitter = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...(context.getContextObject().requestManager as any)._emitter, + [Symbol.for('shapeMode')]: false, + }; + + expect(context.getContextObject()).toMatchSnapshot(); + }); + }); + + describe('use', () => { + it('should init child context with correct type', () => { + const parent = new Context1('http://test/abc'); + const child = parent.use(Context2); + + expect(child).toBeInstanceOf(Context2); + }); + + it('should init context with correct configuration', () => { + const parent = new Context1({ + provider: 'http://test/abc', + config: { defaultNetworkId: 'my-network-id', defaultHardfork: 'my-fork' }, + }); + const child = parent.use(Context2); + + expect(child.defaultNetworkId).toBe('my-network-id'); + expect(child.defaultHardfork).toBe('my-fork'); + }); + + it('should change config of child context', () => { + const parent = new Context1('http://test/abc'); + const child = parent.use(Context2); + + parent.defaultNetworkId = 'my-network-id'; + + expect(child.defaultNetworkId).toBe('my-network-id'); + }); + + it('should use same instance of request manager', () => { + const parent = new Context1('http://test/abc'); + const child = parent.use(Context2); + + expect(child.requestManager).toBe(parent.requestManager); + }); + + it('should use same instance of subscription manager', () => { + const parent = new Context1({ + provider: 'http://test/abc', + subscriptionManager: {} as any, + }); + const child = parent.use(Context2); + + expect(child.subscriptionManager).toBe(parent.subscriptionManager); + }); + + it('should use same instance of provider', () => { + const parent = new Context1('http://test/abc'); + const child = parent.use(Context2); + + expect(child.provider).toBe(parent.provider); + }); + + it('context should be using the default common', () => { + const parent = new Context1({ + provider: 'http://test/abc', + config: { + defaultCommon: { + customChain: { + name: 'foo', + networkId: 'my-network-id', + chainId: 1337, + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + }, + }); + const child = parent.use(Context2); + + expect(child.defaultCommon?.customChain.networkId).toBe('my-network-id'); + expect(child.defaultCommon?.customChain.chainId).toBe(1337); + }); + }); + + describe('link', () => { + it('should link context with correct configuration', () => { + const parent = new Context1({ + provider: 'http://test/abc', + config: { defaultNetworkId: 'my-network-id', defaultHardfork: 'my-fork' }, + }); + const child = new Context2('http://test/abc'); + + child.link(parent); + + expect(child.defaultNetworkId).toBe('my-network-id'); + expect(child.defaultHardfork).toBe('my-fork'); + }); + + it('should change config of child context', () => { + const parent = new Context1('http://test/abc'); + const child = new Context2('http://test/abc'); + + child.link(parent); + + parent.defaultNetworkId = 'my-network-id'; + + expect(child.defaultNetworkId).toBe('my-network-id'); + }); + + it('should use same instance of request manager', () => { + const parent = new Context1('http://test/abc'); + const child = new Context2('http://test/abc'); + + child.link(parent); + + expect(child.requestManager).toBe(parent.requestManager); + }); + + it('should use same instance of subscription manager', () => { + const parent = new Context1({ + provider: 'http://test/abc', + subscriptionManager: {} as any, + }); + const child = new Context2('http://test/abc'); + + child.link(parent); + + expect(child.subscriptionManager).toBe(parent.subscriptionManager); + }); + + it('should use same instance of provider', () => { + const parent = new Context1('http://test/abc'); + const child = new Context2('http://test/abc'); + + child.link(parent); + + expect(child.provider).toBe(parent.provider); + }); + }); + + describe('registerPlugin', () => { + it('should throw ExistingPluginNamespaceError', () => { + const context = new Context1('http://test/abc'); + const pluginNamespace = 'plugin'; + + class Plugin extends Web3PluginBase { + public pluginNamespace = pluginNamespace; + } + class Plugin2 extends Web3PluginBase { + public pluginNamespace = pluginNamespace; + } + + context.registerPlugin(new Plugin()); + expect(() => context.registerPlugin(new Plugin2())).toThrow( + new ExistingPluginNamespaceError(pluginNamespace), + ); + }); + }); +}); diff --git a/packages/web3-core/test/unit/web3_extend.test.ts b/packages/web3-core/test/unit/web3_extend.test.ts new file mode 100644 index 00000000000..f26978fb7c3 --- /dev/null +++ b/packages/web3-core/test/unit/web3_extend.test.ts @@ -0,0 +1,78 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address, BlockTag } from 'web3-types'; +import { Web3Context } from './reexported_web3_context'; + +declare module './reexported_web3_context' { + interface Web3Context { + L2Module: { + getL2Balance(address: Address, blockTag: BlockTag): Promise; + }; + + getL0Balance(address: Address, blockTag: BlockTag): Promise; + } +} + +describe('Web3Context extend tests', () => { + it('Web3Context extend should send correct rpc call', async () => { + const web3 = new Web3Context('http://127.0.0.1:7545'); + + const requestManagerSendSpy = jest.fn(); + web3.requestManager.send = requestManagerSendSpy; + + web3.extend({ + property: 'L2Module', + methods: [ + { + name: 'getL2Balance', + call: 'eth_getBalance', + }, + ], + }); + + await web3.L2Module.getL2Balance('0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBalance', + params: ['0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'], + }); + }); + + it('Web3Context extend should send correct rpc call without property field defined', async () => { + const web3 = new Web3Context('http://127.0.0.1:7545'); + + const requestManagerSendSpy = jest.fn(); + web3.requestManager.send = requestManagerSendSpy; + + web3.extend({ + methods: [ + { + name: 'getL0Balance', + call: 'eth_getBalance', + }, + ], + }); + + await web3.getL0Balance('0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBalance', + params: ['0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'], + }); + }); +}); diff --git a/packages/web3-core/test/unit/web3_promi_event.test.ts b/packages/web3-core/test/unit/web3_promi_event.test.ts new file mode 100644 index 00000000000..1f597505939 --- /dev/null +++ b/packages/web3-core/test/unit/web3_promi_event.test.ts @@ -0,0 +1,153 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3PromiEvent } from '../../src/web3_promi_event'; + +describe('Web3PromiEvent', () => { + it('should initialize and resolve promise', async () => { + const p = new Web3PromiEvent(resolve => { + resolve('Resolved Value'); + }); + + await expect(p).resolves.toBe('Resolved Value'); + expect(() => p.removeAllListeners()).not.toThrow(); + }); + + it('should initialize and reject promise', async () => { + const p = new Web3PromiEvent((_, reject) => { + reject(new Error('My Error')); + }); + + await expect(p).rejects.toThrow('My Error'); + }); + + it('should initialize and emit event', async () => { + return new Promise(done => { + const p = new Web3PromiEvent(resolve => { + resolve('resolved value'); + }); + + p.on('data', data => { + // eslint-disable-next-line jest/no-conditional-expect + expect(data).toBe('resolved value'); + done(undefined); + }) + .then(data => { + p.emit('data', data); + }) + .catch(e => done(e)); + + expect.assertions(1); + }); + }); + + it('should initialize and emit later', async () => { + return new Promise(done => { + const func = () => { + const p = new Web3PromiEvent(resolve => { + resolve('resolved value'); + }); + + setImmediate(() => { + p.emit('data', 'emitted data'); + }); + + return p; + }; + + const p = func(); + const eventFunc = (data: string) => { + expect(data).toBe('emitted data'); + done(undefined); + expect(() => p.off('data', eventFunc)).not.toThrow(); + }; + // eslint-disable-next-line no-void + void p.on('data', eventFunc); + expect(p.listenerCount('data')).toBe(1); + expect(p.listeners('data')).toHaveLength(1); + expect(p.eventNames()).toEqual(['data']); + }); + }); + + it('should return the promi-event object from "on" handler', async () => { + const p = new Web3PromiEvent(resolve => { + resolve('resolved value'); + }) + .on('event1', data => { + expect(data).toBe('string value'); + }) + .on('event2', data => { + expect(data).toBe(3); + }); + + p.emit('event1', 'string value'); + p.emit('event2', 3); + + await expect(p).resolves.toBe('resolved value'); + expect.assertions(3); + }); + + it('should return the promi-event object from "once" handler', async () => { + const p = new Web3PromiEvent(resolve => { + resolve('resolved value'); + }) + .once('event1', data => { + expect(data).toBe('string value'); + }) + .once('event2', data => { + expect(data).toBe(3); + }); + + p.emit('event1', 'string value'); + p.emit('event2', 3); + + await expect(p).resolves.toBe('resolved value'); + expect.assertions(3); + }); + + it('set and get maxListeners', () => { + const p = new Web3PromiEvent>(resolve => { + resolve('resolved value'); + }); + p.setMaxListenerWarningThreshold(3); + + expect(p.getMaxListeners()).toBe(3); + }); + + it('finally', async () => { + const p = new Web3PromiEvent(resolve => { + return resolve('reason'); + }); + + const f = jest.fn(); + p.finally(f); + await p; + expect(f).toHaveBeenCalled(); + }); + it('catch', async () => { + const f = jest.fn(); + const p = new Web3PromiEvent((_, reject) => { + return reject(new Error('reason')); + }); + + p.catch(f); + + await expect(p).rejects.toThrow('reason'); + + expect(f).toHaveBeenCalledWith(new Error('reason')); + }); +}); diff --git a/packages/web3-core/test/unit/web3_request_manager.test.ts b/packages/web3-core/test/unit/web3_request_manager.test.ts new file mode 100644 index 00000000000..375e27a5d1e --- /dev/null +++ b/packages/web3-core/test/unit/web3_request_manager.test.ts @@ -0,0 +1,1308 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + Web3BaseProvider, + JsonRpcPayload, + JsonRpcBatchRequest, + JsonRpcBatchResponse, + JsonRpcResponseWithError, + JsonRpcResponseWithResult, + JsonRpcIdentifier, +} from 'web3-types'; +import { jsonRpc } from 'web3-utils'; +import { + InvalidResponseError, + ParseError, + InvalidRequestError, + MethodNotFoundError, + InvalidParamsError, + InternalError, + InvalidInputError, + ResourcesNotFoundError, + TransactionRejectedError, + MethodNotSupported, + LimitExceededError, + VersionNotSupportedError, + RpcError, + ResourceUnavailableError, + ResponseError, +} from 'web3-errors'; +import HttpProvider from 'web3-providers-http'; +import WSProvider from 'web3-providers-ws'; +import { Web3RequestManager, Web3RequestManagerEvent } from '../../src/web3_request_manager'; +import * as utils from '../../src/utils'; + +describe('Web3RequestManager', () => { + describe('constructor', () => { + it('should create instance of request manager without any params', () => { + const manager = new Web3RequestManager(); + + expect(manager).toBeInstanceOf(Web3RequestManager); + }); + + it('should create instance of request manager without given provider', () => { + const provider = 'http://mydomain.com'; + jest.spyOn(Web3RequestManager.prototype, 'setProvider').mockReturnValue(true); + + const manager = new Web3RequestManager(provider); + + expect(manager.setProvider).toHaveBeenCalledTimes(1); + expect(manager.setProvider).toHaveBeenCalledWith(provider); + expect(manager).toBeInstanceOf(Web3RequestManager); + }); + }); + describe('isMetaMaskProvider', () => { + it('check params', () => { + const request = { + constructor: { + name: 'AsyncFunction', + }, + }; + + expect( + utils.isMetaMaskProvider({ + // @ts-expect-error incorrect param + request, + isMetaMask: true, + }), + ).toBe(true); + }); + }); + describe('isSupportSubscriptions', () => { + it('check params', () => { + // @ts-expect-error incorrect param + expect(utils.isSupportSubscriptions({ supportsSubscriptions: () => true })).toBe(true); + // @ts-expect-error incorrect param + expect(utils.isSupportSubscriptions({})).toBe(false); + }); + }); + describe('providers', () => { + it('should return providers on instance', () => { + const manager = new Web3RequestManager(); + + expect(Object.keys(manager.providers)).toEqual(['HttpProvider', 'WebsocketProvider']); + }); + + it('should return providers of particular instances', () => { + expect(Web3RequestManager.providers.HttpProvider).toBe(HttpProvider); + expect(Web3RequestManager.providers.WebsocketProvider).toBe(WSProvider); + }); + }); + + describe('setProvider()', () => { + let myProvider: Web3BaseProvider; + let emitSpy: jest.Mock; + + beforeEach(() => { + myProvider = { request: jest.fn() } as any; + emitSpy = jest.spyOn(Web3RequestManager.prototype, 'emit') as jest.Mock; + }); + + describe('http provider', () => { + beforeEach(() => { + jest.spyOn(Web3RequestManager.prototype, 'providers', 'get').mockReturnValue({ + ...Web3RequestManager.prototype.providers, + HttpProvider: jest.fn().mockImplementation(() => myProvider) as any, + }); + }); + + it('should unset provider', () => { + const manager = new Web3RequestManager(); + manager.setProvider(undefined); + expect(manager.provider).toBeUndefined(); + }); + it('should detect and set http provider', () => { + const providerString = 'http://mydomain.com'; + + const manager = new Web3RequestManager(); + manager.setProvider(providerString); + + expect(manager.providers.HttpProvider).toHaveBeenCalledTimes(1); + expect(manager.providers.HttpProvider).toHaveBeenCalledWith(providerString); + expect(manager.provider).toEqual(myProvider); + }); + + it('should emit events before changing the provider', () => { + const providerString = 'http://mydomain.com'; + + const manager = new Web3RequestManager(); + manager.setProvider(providerString); + + expect(emitSpy).toHaveBeenCalledTimes(2); + expect(emitSpy).toHaveBeenCalledWith( + Web3RequestManagerEvent.BEFORE_PROVIDER_CHANGE, + undefined, + ); + expect(emitSpy).toHaveBeenCalledWith( + Web3RequestManagerEvent.PROVIDER_CHANGED, + myProvider, + ); + }); + }); + + describe('https provider', () => { + beforeEach(() => { + jest.spyOn(Web3RequestManager.prototype, 'providers', 'get').mockReturnValue({ + ...Web3RequestManager.prototype.providers, + HttpProvider: jest.fn().mockImplementation(() => myProvider) as any, + }); + }); + + it('should detect and set http provider', () => { + const providerString = 'https://mydomain.com'; + + const manager = new Web3RequestManager(); + manager.setProvider(providerString); + + expect(manager.providers.HttpProvider).toHaveBeenCalledTimes(1); + expect(manager.providers.HttpProvider).toHaveBeenCalledWith(providerString); + expect(manager.provider).toEqual(myProvider); + }); + + it('should emit events before changing the provider', () => { + const providerString = 'https://mydomain.com'; + + const manager = new Web3RequestManager(); + manager.setProvider(providerString); + + expect(emitSpy).toHaveBeenCalledTimes(2); + expect(emitSpy).toHaveBeenCalledWith( + Web3RequestManagerEvent.BEFORE_PROVIDER_CHANGE, + undefined, + ); + expect(emitSpy).toHaveBeenCalledWith( + Web3RequestManagerEvent.PROVIDER_CHANGED, + myProvider, + ); + }); + }); + + describe('ws provider', () => { + beforeEach(() => { + jest.spyOn(Web3RequestManager.prototype, 'providers', 'get').mockReturnValue({ + ...Web3RequestManager.prototype.providers, + WebsocketProvider: jest.fn().mockImplementation(() => myProvider), + }); + }); + + it('should detect and set ws provider', () => { + const providerString = 'ws://mydomain.com'; + + const manager = new Web3RequestManager(); + manager.setProvider(providerString); + + expect(manager.providers.WebsocketProvider).toHaveBeenCalledTimes(1); + expect(manager.providers.WebsocketProvider).toHaveBeenCalledWith(providerString); + expect(manager.provider).toEqual(myProvider); + }); + + it('should emit events before changing the provider', () => { + const providerString = 'ws://mydomain.com'; + + const manager = new Web3RequestManager(); + manager.setProvider(providerString); + + expect(emitSpy).toHaveBeenCalledTimes(2); + expect(emitSpy).toHaveBeenCalledWith( + Web3RequestManagerEvent.BEFORE_PROVIDER_CHANGE, + undefined, + ); + expect(emitSpy).toHaveBeenCalledWith( + Web3RequestManagerEvent.PROVIDER_CHANGED, + myProvider, + ); + }); + }); + + it('should throw error if can not detect the provider', () => { + const providerString = 'pc://mydomain.com'; + const manager = new Web3RequestManager(); + + expect(() => manager.setProvider(providerString)).toThrow( + `Can't autodetect provider for "pc://mydomain.com"`, + ); + }); + }); + + describe('send()', () => { + let request: any; + let payload: JsonRpcPayload; + let errorResponse!: JsonRpcResponseWithError; + let successResponse!: JsonRpcResponseWithResult; + + beforeEach(() => { + request = { method: 'my_method', params: [] }; + payload = { method: 'my_method', params: [], id: 1, jsonrpc: '2.0' }; + errorResponse = { + id: 1, + jsonrpc: '2.0', + error: { code: 123, message: 'my-rejected-value' }, + }; + successResponse = { + id: 1, + jsonrpc: '2.0', + result: 'my-resolved-value', + }; + + jest.spyOn(jsonRpc, 'toPayload').mockReturnValue(payload); + }); + + it('should throw error if no provider is set', async () => { + const manager = new Web3RequestManager(); + await expect(manager.send(request)).rejects.toThrow('Provider not available'); + }); + + it('promise of legacy provider should be resolved', async () => { + const manager = new Web3RequestManager(undefined, undefined); + const pr = new Promise(resolve => { + resolve('test'); + }); + const myProvider = { + request: jest.fn().mockImplementation(async () => pr), + } as any; + manager.setProvider(myProvider); + await manager.send(request); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(await pr).toBe('test'); + }); + it('Got a "nullish" response from provider', async () => { + const manager = new Web3RequestManager(undefined, undefined); + const myProvider = { + send: jest.fn().mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, undefined); + }), + } as any; + manager.setProvider(myProvider); + + await expect(async () => manager.send(request)).rejects.toThrow( + 'Got a "nullish" response from provider', + ); + }); + it('Provider does not have a request or send method to use', async () => { + const manager = new Web3RequestManager(undefined, undefined); + const myProvider = {} as any; + manager.setProvider(myProvider); + + await expect(async () => manager.send(request)).rejects.toThrow( + 'Provider does not have a request or send method to use.', + ); + }); + describe('test rpc errors', () => { + it('should pass request to provider and reject with a generic rpc error when rpc call specification flag is undefined', async () => { + const parseErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32700, message: 'Parse error' }, + }; + const manager = new Web3RequestManager(undefined, undefined); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(parseErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidResponseError(parseErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a generic rpc error when rpc call specification flag is false', async () => { + const parseErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32700, message: 'Parse error' }, + }; + const manager = new Web3RequestManager(undefined, false); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(parseErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidResponseError(parseErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a parse rpc error when rpc call specification flag is true', async () => { + const parseErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32700, message: 'Parse error' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(parseErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new ParseError(parseErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with an invalid request rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32600, message: 'Invalid request' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidRequestError(rpcErrorResponse), + ); + // await expect(manager.send(request)).rejects.toThrow(parseErrorResponse.error.message); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with an invalid Method error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32601, message: 'Method not found' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new MethodNotFoundError(rpcErrorResponse), + ); + // await expect(manager.send(request)).rejects.toThrow(parseErrorResponse.error.message); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with an invalid method rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32602, message: 'Invalid params' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidParamsError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with an internal rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32603, message: 'Internal error' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InternalError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with an invalid input rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32000, message: 'Invalid input' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidInputError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a resource not found rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32001, message: 'Resource not found' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new ResourcesNotFoundError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a resource unavailable rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32002, message: 'Resource unavailable' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new ResourceUnavailableError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a transaction rejected rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32003, message: 'Transaction rejected' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new TransactionRejectedError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a method not supported rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32004, message: 'Method not supported' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new MethodNotSupported(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a limited exceeded rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32005, message: 'Limit exceeded' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new LimitExceededError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a JSON-RPC version not supported rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32006, message: 'JSON-RPC version not supported' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new VersionNotSupportedError(rpcErrorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject with a generic rpc error when rpc call specification flag is true', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: -32015, message: 'Custom rpc error' }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(rpcErrorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow(new RpcError(rpcErrorResponse)); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + it('should reject and include inner error when send method errors with an error property', async () => { + const rpcErrorResponse = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { + code: 4001, + message: 'MetaMask Tx Signature: User denied transaction signature.', + }, + }; + const manager = new Web3RequestManager(undefined, true); + const myProvider = { + request: jest.fn().mockImplementation(async () => { + return Promise.resolve(successResponse.result); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + // use any as a way to test private method '_sendRequest' + jest.spyOn(manager as any, '_sendRequest').mockReturnValue(rpcErrorResponse); + let err; + try { + await manager.send(request); + } catch (error: any) { + err = error; + } finally { + expect(err).toBeInstanceOf(ResponseError); + expect(err.cause).toEqual(rpcErrorResponse.error); + } + }); + }); + + describe('web3-provider', () => { + beforeEach(() => { + // isWeb3Provider uses instanceof to check if the provider is a Web3Provider + // So we have to mock the response + jest.spyOn(utils, 'isWeb3Provider').mockReturnValue(true); + }); + + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation(async () => Promise.resolve(successResponse)), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toEqual(successResponse.result); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider rejects it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation(async () => Promise.reject(new Error('my-error'))), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow('my-error'); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + }); + + describe('legacy-request-provider', () => { + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, successResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toEqual(successResponse.result); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject if provider throws error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow(errorResponse.error.message); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + // eslint-disable-next-line no-null/no-null + cb(null, errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidResponseError(errorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + }); + + describe('eip1193-provider', () => { + beforeEach(() => { + // isEIP1193Provider uses typeof to check if the provider is a EIP1193Provider + // So we have to mock the response + jest.spyOn(utils, 'isEIP1193Provider').mockReturnValue(true); + }); + + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async () => { + return Promise.resolve(successResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toEqual(successResponse.result); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider throws error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async () => { + return Promise.reject(errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow(errorResponse.error.message); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async () => { + return Promise.resolve(errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidResponseError(errorResponse), + ); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + }); + + describe('eip1193-provider - return non json-rpc compliance response', () => { + beforeEach(() => { + // isEIP1193Provider uses typeof to check if the provider is a EIP1193Provider + // So we have to mock the response + jest.spyOn(utils, 'isEIP1193Provider').mockReturnValue(true); + }); + + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async () => { + return Promise.resolve(successResponse.result); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toEqual(successResponse.result); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider throws error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async _ => { + return Promise.reject(errorResponse.error); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow(errorResponse.error.message); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and pass if provider returns "null', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async _ => { + // Explicitly used for test case + // eslint-disable-next-line no-null/no-null + return null; + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toBeNull(); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and pass if provider returns "undefined', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async _ => { + return undefined; + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toBeNull(); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + }); + + describe('legacy-send-provider', () => { + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + send: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, successResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toEqual(successResponse.result); + expect(myProvider.send).toHaveBeenCalledTimes(1); + expect(myProvider.send).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject if provider throws error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + send: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow(errorResponse.error.message); + expect(myProvider.send).toHaveBeenCalledTimes(1); + expect(myProvider.send).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + send: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow( + new InvalidResponseError(errorResponse), + ); + expect(myProvider.send).toHaveBeenCalledTimes(1); + expect(myProvider.send).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + }); + + describe('legacy-send-async-provider', () => { + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + sendAsync: jest + .fn() + .mockImplementation(async () => Promise.resolve(successResponse)), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).resolves.toEqual(successResponse.result); + expect(myProvider.sendAsync).toHaveBeenCalledTimes(1); + expect(myProvider.sendAsync).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider rejects it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + sendAsync: jest + .fn() + .mockImplementation(async () => Promise.reject(new Error('my-error'))), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.send(request)).rejects.toThrow('my-error'); + expect(myProvider.sendAsync).toHaveBeenCalledTimes(1); + expect(myProvider.sendAsync).toHaveBeenCalledWith(payload); + }); + }); + }); + + describe('sendBatch()', () => { + let request: JsonRpcBatchRequest; + let payload: JsonRpcPayload; + let errorResponse!: JsonRpcBatchResponse; + let successResponse!: JsonRpcBatchResponse; + + beforeEach(() => { + request = [ + { id: 1, jsonrpc: '2.0', method: 'my_method', params: [] }, + { id: 2, jsonrpc: '2.0', method: 'my_method', params: [] }, + ]; + payload = [...request]; + errorResponse = [ + { + id: 1, + jsonrpc: '2.0', + error: { code: 123, message: 'my-rejected-value-1' }, + }, + { + id: 2, + jsonrpc: '2.0', + error: { code: 123, message: 'my-rejected-value-2' }, + }, + ]; + successResponse = [ + { + id: 1, + jsonrpc: '2.0', + result: 'my-resolved-value1', + }, + { + id: 1, + jsonrpc: '2.0', + result: 'my-resolved-value1', + }, + ]; + + jest.spyOn(jsonRpc, 'toBatchPayload').mockReturnValue(payload); + }); + + it('should throw error if no provider is set', async () => { + const manager = new Web3RequestManager(); + + await expect(manager.sendBatch(request)).rejects.toThrow('Provider not available'); + }); + + describe('web3-provider', () => { + beforeEach(() => { + // isWeb3Provider is using `Symbol` to identify which get change with the + // mock implementation of the provider, so we have to mock it's response. + jest.spyOn(utils, 'isWeb3Provider').mockReturnValue(true); + }); + + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation(async () => Promise.resolve(successResponse)), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(successResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider rejects it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation(async () => Promise.reject(new Error('my-error'))), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).rejects.toThrow('my-error'); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and return response if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation(async () => Promise.resolve(errorResponse)), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(errorResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + }); + + describe('legacy-request-provider', () => { + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, successResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(successResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject if provider throws error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).rejects.toEqual(errorResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(errorResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + }); + + describe('eip1193-provider', () => { + beforeEach(() => { + // isEIP1193Provider is using `Symbol.toStringTag` which get change with the + // mock implementation of the provider, so we have to mock it's response. + jest.spyOn(utils, 'isEIP1193Provider').mockReturnValue(true); + }); + + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async _ => { + return Promise.resolve(successResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(successResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider throws error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async _ => { + throw errorResponse; + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).rejects.toEqual(errorResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest.fn().mockImplementation(async _ => { + return Promise.resolve(errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(errorResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload); + }); + }); + + describe('legacy-send-provider', () => { + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + send: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, successResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(successResponse); + expect(myProvider.send).toHaveBeenCalledTimes(1); + expect(myProvider.send).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and reject if provider throws error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + send: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).rejects.toEqual(errorResponse); + expect(myProvider.send).toHaveBeenCalledTimes(1); + expect(myProvider.send).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + + it('should pass request to provider and return response if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + send: jest + .fn() + .mockImplementation((_, cb: (error?: any, data?: any) => void) => { + cb(undefined, errorResponse); + }), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(errorResponse); + expect(myProvider.send).toHaveBeenCalledTimes(1); + expect(myProvider.send).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + }); + + describe('legacy-send-async-provider', () => { + it('should pass request to provider and resolve if provider resolves it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + sendAsync: jest + .fn() + .mockImplementation(async () => Promise.resolve(successResponse)), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(successResponse); + expect(myProvider.sendAsync).toHaveBeenCalledTimes(1); + expect(myProvider.sendAsync).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and reject if provider rejects it', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + sendAsync: jest + .fn() + .mockImplementation(async () => Promise.reject(new Error('my-error'))), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).rejects.toThrow('my-error'); + expect(myProvider.sendAsync).toHaveBeenCalledTimes(1); + expect(myProvider.sendAsync).toHaveBeenCalledWith(payload); + }); + + it('should pass request to provider and return response if provider returns error', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + sendAsync: jest + .fn() + .mockImplementation(async () => Promise.resolve(errorResponse)), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).resolves.toEqual(errorResponse); + expect(myProvider.sendAsync).toHaveBeenCalledTimes(1); + expect(myProvider.sendAsync).toHaveBeenCalledWith(payload); + }); + }); + }); +}); diff --git a/packages/web3-core/test/unit/web3_subscription.test.ts b/packages/web3-core/test/unit/web3_subscription.test.ts new file mode 100644 index 00000000000..cab940b0f00 --- /dev/null +++ b/packages/web3-core/test/unit/web3_subscription.test.ts @@ -0,0 +1,184 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3SubscriptionManager } from '../../src'; +import { ExampleSubscription } from './fixtures/example_subscription'; + +const subscriptions = { example: ExampleSubscription as never }; + +describe('Web3Subscription', () => { + let requestManager: any; + let subscriptionManager: Web3SubscriptionManager; + let sub: ExampleSubscription; + + beforeEach(() => { + requestManager = { + send: jest.fn().mockImplementation(async () => { + return 'sub-id'; + }), + on: jest.fn(), + provider: { on: jest.fn(), removeListener: jest.fn(), request: jest.fn() }, + }; + subscriptionManager = new Web3SubscriptionManager(requestManager, subscriptions); + }); + + describe('subscriptionManager', () => { + it('subscriptionManager is accessible in inherited subscription', async () => { + class InheritedExampleSubscription extends ExampleSubscription { + public verifyAccessToSubscriptionManager( + originalSubscriptionManager: Web3SubscriptionManager, + ) { + expect(this.subscriptionManager).toBe(originalSubscriptionManager); + } + } + new InheritedExampleSubscription( + { param1: 'value' }, + { subscriptionManager }, + ).verifyAccessToSubscriptionManager(subscriptionManager); + }); + }); + + describe('subscribe', () => { + beforeEach(() => { + sub = new ExampleSubscription({ param1: 'value' }, { subscriptionManager }); + }); + it('should invoke request manager for subscription', async () => { + await sub.subscribe(); + + expect(requestManager.send).toHaveBeenCalledTimes(1); + expect(requestManager.send).toHaveBeenCalledWith({ + method: 'eth_subscribe', + params: ['newHeads'], + }); + }); + + it('should set correct subscription id', async () => { + expect(sub.id).toBeUndefined(); + await sub.subscribe(); + expect(sub.id).toBe('sub-id'); + }); + + it('should start listening to the "message" event', async () => { + await sub.subscribe(); + + expect(requestManager.provider.on).toHaveBeenCalledTimes(1); + expect(requestManager.provider.on).toHaveBeenCalledWith( + 'message', + expect.any(Function), + ); + }); + }); + + describe('unsubscribe', () => { + beforeEach(() => { + sub = new ExampleSubscription({ param1: 'value' }, { subscriptionManager }); + sub['_id'] = 'sub-id'; + subscriptionManager.subscriptions.set('sub-id', sub); + }); + + it('should invoke request manager to unsubscribe', async () => { + await sub.unsubscribe(); + + expect(requestManager.send).toHaveBeenCalledTimes(1); + expect(requestManager.send).toHaveBeenCalledWith({ + method: 'eth_unsubscribe', + params: ['sub-id'], + }); + }); + + it('should remove the subscription id', async () => { + expect(sub.id).toBe('sub-id'); + await sub.unsubscribe(); + expect(sub.id).toBeUndefined(); + }); + }); +}); + +describe('Web3Subscription without subscription manager - (deprecated)', () => { + let requestManager: any; + let sub: ExampleSubscription; + + beforeEach(() => { + requestManager = { + send: jest.fn().mockImplementation(async () => { + return 'sub-id'; + }), + on: jest.fn(), + provider: { on: jest.fn(), removeListener: jest.fn(), request: jest.fn() }, + }; + }); + describe('subscribe', () => { + beforeEach(() => { + // eslint-disable-next-line deprecation/deprecation + sub = new ExampleSubscription({ param1: 'value' }, { requestManager }); + }); + + it('should invoke request manager for subscription', async () => { + (requestManager.send as jest.Mock).mockResolvedValue('sub-id'); + await sub.subscribe(); + + expect(requestManager.send).toHaveBeenCalledTimes(1); + expect(requestManager.send).toHaveBeenCalledWith({ + method: 'eth_subscribe', + params: ['newHeads'], + }); + }); + + it('should set correct subscription id', async () => { + (requestManager.send as jest.Mock).mockResolvedValue('sub-id'); + + expect(sub.id).toBeUndefined(); + await sub.subscribe(); + expect(sub.id).toBe('sub-id'); + }); + + it('should start listening to the "message" event', async () => { + // requestManager.provider.on.mockClear(); + await sub.subscribe(); + + expect(requestManager.provider.on).toHaveBeenCalledTimes(1); + expect(requestManager.provider.on).toHaveBeenCalledWith( + 'message', + expect.any(Function), + ); + }); + }); + + describe('unsubscribe', () => { + beforeEach(() => { + // eslint-disable-next-line deprecation/deprecation + sub = new ExampleSubscription({ param1: 'value' }, { requestManager }); + sub['_id'] = 'sub-id'; + }); + + it('should invoke request manager to unsubscribe', async () => { + await sub.unsubscribe(); + + expect(requestManager.provider.on).toHaveBeenCalledTimes(1); + expect(requestManager.provider.on).toHaveBeenCalledWith( + 'message', + expect.any(Function), + ); + }); + + it('should remove the subscription id', async () => { + expect(sub.id).toBe('sub-id'); + await sub.unsubscribe(); + expect(sub.id).toBeUndefined(); + }); + }); +}); diff --git a/packages/web3-core/test/unit/web3_subscription_manager.test.ts b/packages/web3-core/test/unit/web3_subscription_manager.test.ts new file mode 100644 index 00000000000..403719b292a --- /dev/null +++ b/packages/web3-core/test/unit/web3_subscription_manager.test.ts @@ -0,0 +1,224 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { DEFAULT_RETURN_FORMAT } from 'web3-types'; +import { Web3RequestManagerEvent } from '../../src/web3_request_manager'; +import { Web3SubscriptionManager } from '../../src/web3_subscription_manager'; +import { ExampleSubscription } from './fixtures/example_subscription'; + +jest.mock('./fixtures/example_subscription'); + +const subscriptions = { example: ExampleSubscription as never }; + +describe('Web3SubscriptionManager', () => { + let requestManager: any; + let subManager: Web3SubscriptionManager; + + beforeEach(() => { + requestManager = { + send: jest.fn().mockImplementation(async () => { + return 'sub-id'; + }), + on: jest.fn(), + provider: { on: jest.fn() }, + }; + subManager = new Web3SubscriptionManager(requestManager, subscriptions); + (ExampleSubscription as jest.Mock).mockClear(); + }); + + describe('constructor', () => { + it('should create subscription manager object', () => { + subManager = new Web3SubscriptionManager(requestManager, {}); + expect(subManager).toBeInstanceOf(Web3SubscriptionManager); + }); + + it('should create register events for request manager', () => { + const requestMan: any = { + send: jest.fn(), + on: jest.fn(), + provider: { + on: jest + .fn() + .mockImplementation((_: string, callback: (a: string) => unknown) => + callback('something'), + ), + }, + }; + const subscriptionMan = new Web3SubscriptionManager(requestMan, {}); + + expect(subscriptionMan).toBeDefined(); + expect(requestMan.on).toHaveBeenCalledTimes(2); + expect(requestMan.on).toHaveBeenCalledWith( + Web3RequestManagerEvent.BEFORE_PROVIDER_CHANGE, + expect.any(Function), + ); + expect(requestMan.on).toHaveBeenCalledWith( + Web3RequestManagerEvent.PROVIDER_CHANGED, + expect.any(Function), + ); + }); + + it('should register the subscription types', () => { + subManager = new Web3SubscriptionManager(requestManager, { + example: ExampleSubscription as never, + }); + + expect(subManager.registeredSubscriptions).toEqual(subscriptions); + }); + }); + + describe('subscribe', () => { + beforeEach(() => { + subManager = new Web3SubscriptionManager(requestManager, subscriptions); + + jest.spyOn(subManager, 'supportsSubscriptions').mockReturnValue(true); + }); + + it('should throw error if current provider not available', async () => { + delete requestManager.provider; + jest.spyOn(subManager, 'supportsSubscriptions').mockReturnValue(false); + + await expect(subManager.subscribe('example')).rejects.toThrow('Provider not available'); + }); + + it('should throw error if subscription is not supported', async () => { + jest.spyOn(subManager, 'supportsSubscriptions').mockReturnValue(false); + + await expect(subManager.subscribe('example')).rejects.toThrow( + 'The current provider does not support subscriptions', + ); + }); + + it('should throw error if invalid subscription type is called', async () => { + await expect(subManager.subscribe('example2')).rejects.toThrow( + 'Invalid subscription type', + ); + }); + + it('should return valid subscription type if subscribed', async () => { + jest.spyOn(subManager, 'addSubscription').mockResolvedValue('123'); + const result = await subManager.subscribe('example'); + + expect(result).toBeInstanceOf(ExampleSubscription); + }); + + it('should initialize subscription with valid args', async () => { + jest.spyOn(subManager, 'addSubscription').mockResolvedValue('456'); + const result = await subManager.subscribe('example', { test1: 'test1' }); + + expect(result).toBeInstanceOf(ExampleSubscription); + expect(ExampleSubscription).toHaveBeenCalledTimes(1); + expect(ExampleSubscription).toHaveBeenCalledWith( + { test1: 'test1' }, + { subscriptionManager: subManager, returnFormat: DEFAULT_RETURN_FORMAT }, + ); + }); + }); + + describe('addSubscription', () => { + let sub: ExampleSubscription; + + beforeEach(() => { + subManager = new Web3SubscriptionManager(requestManager, subscriptions); + jest.spyOn(subManager, 'supportsSubscriptions').mockReturnValue(true); + sub = new ExampleSubscription( + { param1: 'param1' }, + { subscriptionManager: subManager }, + ); + + (sub as any).id = '123'; + }); + + it('should throw error if a subscription already exists with same id', async () => { + await subManager.addSubscription(sub); + + await expect(subManager.addSubscription(sub)).rejects.toThrow( + 'Subscription with id "123" already exists', + ); + }); + + it('should try to subscribe the subscription', async () => { + sub = new ExampleSubscription( + { param1: 'param1' }, + { subscriptionManager: subManager }, + ); + jest.spyOn(sub, 'sendSubscriptionRequest').mockImplementation(async () => { + (sub as any).id = 'value'; + return Promise.resolve(sub.id as string); + }); + await subManager.addSubscription(sub); + + expect(sub.sendSubscriptionRequest).toHaveBeenCalledTimes(1); + expect(sub.sendSubscriptionRequest).toHaveBeenCalledWith(); + }); + + it('should set the subscription to the map', async () => { + expect(subManager.subscriptions).toEqual(new Map()); + + await subManager.addSubscription(sub); + + expect(subManager.subscriptions).toEqual(new Map([['123', sub]])); + }); + }); + + describe('removeSubscription', () => { + let sub: ExampleSubscription; + + beforeEach(async () => { + subManager = new Web3SubscriptionManager(requestManager, subscriptions); + jest.spyOn(subManager, 'supportsSubscriptions').mockReturnValue(true); + sub = new ExampleSubscription( + { param1: 'param1' }, + { subscriptionManager: subManager }, + ); + + (sub as any).id = '123'; + await subManager.addSubscription(sub); + }); + + it('should throw error if a subscription id does not exists', async () => { + delete (sub as any).id; + + await expect(subManager.removeSubscription(sub)).rejects.toThrow( + 'Subscription is not subscribed yet.', + ); + }); + + it('should throw error if a subscription does not exists', async () => { + (sub as any).id = '456'; + + await expect(subManager.removeSubscription(sub)).rejects.toThrow( + 'Subscription with id "456" does not exists', + ); + }); + + it('should try to unsubscribe the subscription', async () => { + await subManager.removeSubscription(sub); + + expect(sub.sendUnsubscribeRequest).toHaveBeenCalledTimes(1); + expect(sub.sendUnsubscribeRequest).toHaveBeenCalledWith(); + }); + + it('should remove the subscription to the map', async () => { + expect(subManager.subscriptions).toEqual(new Map([['123', sub]])); + + await subManager.removeSubscription(sub); + + expect(subManager.subscriptions).toEqual(new Map()); + }); + }); +}); diff --git a/packages/web3-core/test/unit/web3_subscription_old_providers.test.ts b/packages/web3-core/test/unit/web3_subscription_old_providers.test.ts new file mode 100644 index 00000000000..9cf2949fb23 --- /dev/null +++ b/packages/web3-core/test/unit/web3_subscription_old_providers.test.ts @@ -0,0 +1,124 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ExampleSubscription } from './fixtures/example_subscription'; +import { Web3EventEmitter } from '../../src/web3_event_emitter'; +import { Web3SubscriptionManager } from '../../src'; + +describe('Web3Subscription', () => { + let requestManager: any; + let subscriptionManager: Web3SubscriptionManager; + let eipRequestManager: any; + let subscriptionManagerWithEipReqMan: Web3SubscriptionManager; + let provider: Web3EventEmitter; + let eipProvider: Web3EventEmitter; + + beforeEach(() => { + provider = new Web3EventEmitter(); + eipProvider = new Web3EventEmitter(); + // @ts-expect-error add to test eip providers + eipProvider.request = jest.fn(); + requestManager = { + send: jest.fn().mockImplementation(async () => { + return 'sub-id'; + }), + on: jest.fn(), + provider, + }; + subscriptionManager = new Web3SubscriptionManager(requestManager, {}); + + eipRequestManager = { + send: jest.fn().mockImplementation(async () => { + return 'sub-id'; + }), + on: jest.fn(), + provider: eipProvider, + }; + subscriptionManagerWithEipReqMan = new Web3SubscriptionManager(eipRequestManager, {}); + }); + + describe('providers response for old provider', () => { + it('data with result', async () => { + const sub = new ExampleSubscription({ param1: 'param1' }, { subscriptionManager }); + await sub.subscribe(); + const testData = { + data: { + subscription: sub.id, + result: { + some: 1, + }, + }, + }; + const processResult = jest.spyOn(sub, '_processSubscriptionResult'); + provider.emit('data', testData); + expect(processResult).toHaveBeenCalledWith(testData.data.result); + }); + + it('data without result for old provider', async () => { + const sub = new ExampleSubscription({ param1: 'param1' }, { subscriptionManager }); + await sub.subscribe(); + const testData = { + data: { + subscription: sub.id, + other: { + some: 1, + }, + }, + }; + const processResult = jest.spyOn(sub, '_processSubscriptionResult'); + provider.emit('data', testData); + expect(processResult).toHaveBeenCalledWith(testData.data); + }); + it('data with result for eipProvider', async () => { + const sub = new ExampleSubscription( + { param1: 'param1' }, + { subscriptionManager: subscriptionManagerWithEipReqMan }, + ); + await sub.subscribe(); + const testData = { + data: { + subscription: sub.id, + result: { + some: 1, + }, + }, + }; + const processResult = jest.spyOn(sub, '_processSubscriptionResult'); + eipProvider.emit('message', testData); + expect(processResult).toHaveBeenCalledWith(testData.data.result); + }); + + it('data without result for eipProvider', async () => { + const sub = new ExampleSubscription( + { param1: 'param1' }, + { subscriptionManager: subscriptionManagerWithEipReqMan }, + ); + await sub.subscribe(); + const testData = { + data: { + subscription: sub.id, + other: { + some: 1, + }, + }, + }; + const processResult = jest.spyOn(sub, '_processSubscriptionResult'); + eipProvider.emit('message', testData); + expect(processResult).toHaveBeenCalledWith(testData.data); + }); + }); +}); diff --git a/packages/web3-core/tsconfig.cjs.json b/packages/web3-core/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-core/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-core/tsconfig.esm.json b/packages/web3-core/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-core/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-core/tsconfig.json b/packages/web3-core/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-core/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-core/tsconfig.types.json b/packages/web3-core/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-core/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-core/tsdoc.json b/packages/web3-core/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-core/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-core/types/index.d.ts b/packages/web3-core/types/index.d.ts deleted file mode 100644 index adc7692213f..00000000000 --- a/packages/web3-core/types/index.d.ts +++ /dev/null @@ -1,442 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @author Prince Sinha - * @date 2018 - */ - -import * as net from 'net'; -import { - HttpProviderBase, - HttpProviderOptions, - IpcProviderBase, - WebsocketProviderBase, - WebsocketProviderOptions, - JsonRpcPayload, - JsonRpcResponse -} from 'web3-core-helpers'; -import { Method } from 'web3-core-method'; -import BN = require('bn.js'); -import BigNumber from 'bignumber.js'; - -export interface SignedTransaction { - messageHash?: string; - r: string; - s: string; - v: string; - rawTransaction?: string; - transactionHash?: string; -} - -export interface Extension { - property?: string, - methods: Method[] -} - -export interface Providers { - HttpProvider: new ( - host: string, - options?: HttpProviderOptions - ) => HttpProvider; - WebsocketProvider: new ( - host: string, - options?: WebsocketProviderOptions - ) => WebsocketProvider; - IpcProvider: new (path: string, net: any) => IpcProvider; -} - -export interface PromiEvent extends Promise { - once( - type: 'sending', - handler: (payload: object) => void - ): PromiEvent; - - once( - type: 'sent', - handler: (payload: object) => void - ): PromiEvent; - - once( - type: 'transactionHash', - handler: (transactionHash: string) => void - ): PromiEvent; - - once( - type: 'receipt', - handler: (receipt: TransactionReceipt) => void - ): PromiEvent; - - once( - type: 'confirmation', - handler: (confirmationNumber: number, receipt: TransactionReceipt, latestBlockHash?: string) => void - ): PromiEvent; - - once(type: 'error', handler: (error: Error) => void): PromiEvent; - - once( - type: 'error' | 'confirmation' | 'receipt' | 'transactionHash', - handler: (error: Error | TransactionReceipt | string) => void - ): PromiEvent; - - on( - type: 'transactionHash', - handler: (receipt: string) => void - ): PromiEvent; - - on( - type: 'receipt', - handler: (receipt: TransactionReceipt) => void - ): PromiEvent; - - on( - type: 'confirmation', - handler: (confNumber: number, receipt: TransactionReceipt, latestBlockHash?: string) => void - ): PromiEvent; - - on(type: 'error', handler: (error: Error) => void): PromiEvent; - - on( - type: 'error' | 'confirmation' | 'receipt' | 'transactionHash', - handler: (error: Error | TransactionReceipt | string) => void - ): PromiEvent; -} - -export interface Transaction { - hash: string; - nonce: number; - blockHash: string | null; - blockNumber: number | null; - transactionIndex: number | null; - from: string; - to: string | null; - value: string; - gasPrice: string; - gas: number; - input: string; -} - -export interface TransactionConfig { - from?: string | number; - to?: string; - value?: number | string | BN; - gas?: number | string; - gasPrice?: number | string | BN; - data?: string; - nonce?: number; - chainId?: number; - common?: Common; - chain?: string; - hardfork?: string; -} - -export type chain = - | 'mainnet' - | 'goerli' - | 'kovan' - | 'rinkeby' - | 'ropsten'; - -export type hardfork = - | 'chainstart' - | 'homestead' - | 'dao' - | 'tangerineWhistle' - | 'spuriousDragon' - | 'byzantium' - | 'constantinople' - | 'petersburg' - | 'istanbul'; - -export interface Common { - customChain: CustomChainParams; - baseChain?: chain; - hardfork?: hardfork; -} - -export interface CustomChainParams { - name?: string; - networkId: number; - chainId: number; -} - -export interface RLPEncodedTransaction { - raw: string; - tx: { - nonce: string; - gasPrice: string; - gas: string; - to: string; - value: string; - input: string; - r: string; - s: string; - v: string; - hash: string; - }; -} - -export interface TransactionReceipt { - status: boolean; - transactionHash: string; - transactionIndex: number; - blockHash: string; - blockNumber: number; - from: string; - to: string; - contractAddress?: string; - cumulativeGasUsed: number; - gasUsed: number; - logs: Log[]; - logsBloom: string; - events?: { - [eventName: string]: EventLog; - }; -} - -export interface EventLog { - event: string; - address: string; - returnValues: any; - logIndex: number; - transactionIndex: number; - transactionHash: string; - blockHash: string; - blockNumber: number; - raw?: {data: string; topics: any[]}; -} - -export interface Log { - address: string; - data: string; - topics: string[]; - logIndex: number; - transactionIndex: number; - transactionHash: string; - blockHash: string; - blockNumber: number; -} - -// had to move `web3-net` due to other modules in `1.x` not referencing - -export class NetworkBase { - constructor(); - constructor(provider: provider); - constructor(provider: provider, net: net.Socket); - - readonly givenProvider: any; - readonly currentProvider: provider; - static readonly givenProvider: any; - static readonly providers: Providers; - BatchRequest: new () => BatchRequest; - - setProvider(provider: provider): boolean; - - extend(extension: Extension): any; - - getNetworkType( - callback?: (error: Error, returnValue: string) => void - ): Promise; - - getId(callback?: (error: Error, id: number) => void): Promise; - - isListening( - callback?: (error: Error, listening: boolean) => void - ): Promise; - - getPeerCount( - callback?: (error: Error, peerCount: number) => void - ): Promise; -} - -// had to move accounts from web3-eth-accounts due to other modules in 1.x not referencing - -export class AccountsBase { - constructor(); - constructor(provider: provider); - constructor(provider: provider, net: net.Socket); - - readonly givenProvider: any; - readonly currentProvider: provider; - - setProvider(provider: provider): boolean; - - create(entropy?: string): Account; - - privateKeyToAccount(privateKey: string, ignoreLength?: boolean): Account; - - signTransaction( - transactionConfig: TransactionConfig, - privateKey: string, - callback?: (error: Error, signedTransaction: SignedTransaction) => void - ): Promise; - - recoverTransaction(signature: string): string; - - hashMessage(message: string): string; - - sign(data: string, privateKey: string): Sign; - - recover(signatureObject: SignatureObject): string; - recover(message: string, signature: string, preFixed?: boolean): string; - recover( - message: string, - v: string, - r: string, - s: string, - preFixed?: boolean - ): string; - - encrypt(privateKey: string, password: string): EncryptedKeystoreV3Json; - - decrypt(keystoreJsonV3: EncryptedKeystoreV3Json, password: string): Account; - - wallet: WalletBase; -} - -export class WalletBase { - constructor(accounts: AccountsBase); - - length: number; - defaultKeyName: string; - - [key: number]: Account; - - create(numberOfAccounts: number, entropy?: string): WalletBase; - - add(account: string | AddAccount): AddedAccount; - - remove(account: string | number): boolean; - - clear(): WalletBase; - - encrypt(password: string): EncryptedKeystoreV3Json[]; - - decrypt( - keystoreArray: EncryptedKeystoreV3Json[], - password: string - ): WalletBase; - - save(password: string, keyName?: string): boolean; - - load(password: string, keyName?: string): WalletBase; -} - -export interface AddAccount { - address: string; - privateKey: string; -} - -export interface AddedAccount extends Account { - index: number; -} - -export interface Account { - address: string; - privateKey: string; - signTransaction: ( - transactionConfig: TransactionConfig, - callback?: (signTransaction: SignedTransaction) => void - ) => Promise; - sign: (data: string) => Sign; - encrypt: (password: string) => EncryptedKeystoreV3Json; -} - -export interface EncryptedKeystoreV3Json { - version: number; - id: string; - address: string; - crypto: { - ciphertext: string; - cipherparams: {iv: string}; - cipher: string; - kdf: string; - kdfparams: { - dklen: number; - salt: string; - n: number; - r: number; - p: number; - }; - mac: string; - }; -} - -export interface Sign extends SignedTransaction { - message: string; - signature: string; -} - -export interface SignatureObject { - messageHash: string; - r: string; - s: string; - v: string; -} - -// put all the `web3-provider` typings in here so we can get to them everywhere as this module does not exist in 1.x - -export class BatchRequest { - constructor(); - - add(method: Method): void; - - execute(): void; -} - -export class HttpProvider extends HttpProviderBase { - constructor(host: string, options?: HttpProviderOptions); -} - -export class IpcProvider extends IpcProviderBase { - constructor(path: string, net: net.Server); -} - -export class WebsocketProvider extends WebsocketProviderBase { - constructor(host: string, options?: WebsocketProviderOptions); -} - -export interface PastLogsOptions extends LogsOptions { - toBlock?: BlockNumber; -} - -export interface LogsOptions { - fromBlock?: BlockNumber; - address?: string | string[]; - topics?: Array; -} - -export type BlockNumber = string | number | BN | BigNumber | 'latest' | 'pending' | 'earliest' | 'genesis'; - -export interface RequestArguments { - method: string; - params?: any; - [key: string]: any; -} - -export interface AbstractProvider { - sendAsync(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void): void; - send?(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void): void; - request?(args: RequestArguments): Promise; - connected?: boolean; - } - -export type provider = - | HttpProvider - | IpcProvider - | WebsocketProvider - | AbstractProvider - | string - | null; diff --git a/packages/web3-core/types/tsconfig.json b/packages/web3-core/types/tsconfig.json deleted file mode 100644 index 9db422ea462..00000000000 --- a/packages/web3-core/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-core": ["."] - } - } -} diff --git a/packages/web3-core/types/tslint.json b/packages/web3-core/types/tslint.json deleted file mode 100644 index 2a4469808b0..00000000000 --- a/packages/web3-core/types/tslint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false, - "no-redundant-jsdoc": false - } -} diff --git a/packages/web3-errors/.eslintignore b/packages/web3-errors/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-errors/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-errors/.eslintrc.js b/packages/web3-errors/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-errors/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-errors/.gitignore b/packages/web3-errors/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-errors/.npmignore b/packages/web3-errors/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-errors/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-errors/.npmrc b/packages/web3-errors/.npmrc new file mode 120000 index 00000000000..5cc817c4313 --- /dev/null +++ b/packages/web3-errors/.npmrc @@ -0,0 +1 @@ +../../templates/.npmrc.tmpl \ No newline at end of file diff --git a/packages/web3-errors/.prettierignore b/packages/web3-errors/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-errors/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-errors/.prettierrc.json b/packages/web3-errors/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-errors/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-errors/CHANGELOG.md b/packages/web3-errors/CHANGELOG.md new file mode 100644 index 00000000000..06946bb65df --- /dev/null +++ b/packages/web3-errors/CHANGELOG.md @@ -0,0 +1,169 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.1-alpha.1] + +### Added + +- Add optional `innerError` property to the abstract class `Web3Error`. This `innerError` could be `Error`, `Error[]` or `undefined`. (#5435) (#5434) +- The class `Web3ContractError` is moved to this package from `web3-eth-contract`. (#5434) +- Added the error code `ERR_TX_SIGNING` and used it inside `TransactionSigningError` (#5462) +- Added the error code `ERR_TX_GAS_MISMATCH` and used it inside `TransactionGasMismatchError` (#5462) +- Added `SignatureError` to `web3-errors/src/errors/signature_errors.ts` (moved from `web3-eth/src/errors.ts`) (#5462) +- Added the errors' classes to `web3-errors/src/errors/transaction_errors.ts` from `web3-eth/src/errors.ts` (#5462) +- Added `TransactionBlockTimeoutError` class and its error code `ERR_TX_BLOCK_TIMEOUT` (#5294) +- `ExistingPluginNamespaceError` class and it's error code `ERR_EXISTING_PLUGIN_NAMESPACE` (#5393) + +### Changed + +- Corrected the error code for `JSONRPC_ERR_UNAUTHORIZED` to be `4100` (#5462) +- Moved `SignerError` from `web3-errors/src/errors/signature_errors.ts` to `web3-errors/src/errors/transaction_errors.ts`, and renamed it to `TransactionSigningError` (#5462) + +## [0.1.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [0.1.1-alpha.3] + +### Changed + +- `main` and `files` entries in `package.json` changed to `lib/` directory from `dist/` (#5739) + +## [0.1.1-alpha.4] + +### Changed + +- web3.js dependencies (#5757) + +## [1.0.0-rc.0] + +### Changed + +- The abstract class `Web3Error` is renamed to `BaseWeb3Error` (#5771) +- Renamed TransactionRevertError to TransactionRevertInstructionError to remain consistent with 1.x +- Using `MaxAttemptsReachedOnReconnectingError` with the same message for 1.x but also adding the `maxAttempts` (#5894) + +### Added + +- Added error class `InvalidMethodParamsError` and error code `ERR_INVALID_METHOD_PARAMS = 207` (#5824) +- `request` property to `ResponseError` (#5854) +- `data` property to `TransactionRevertInstructionError` (#5854) +- `TransactionRevertWithCustomError` was added to handle custom solidity errors (#5854) + +## [1.0.0-rc.1] + +### Added + +- Added hybrid build (ESM and CJS) of library (#5904) +- Added source files (#5956) + +### Changed + +- `gasLimit` is no longer accepted as a parameter for `MissingGasError` and `TransactionGasMismatchError, and is also no longer included in error message (#5915) + +## [1.0.0-rc.2] + +### Added + +- `InvalidPropertiesForTransactionTypeError` with error code `429` (#6102) + +### Changed + +- Nested Smart Contract error data is extracted at `Eip838ExecutionError` constructor and the nested error is set at `innerError` (#6045) + +## [1.0.0] + +Release Notes: + +Detailed List of change logs are mentioned under previous 1.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [1.0.1] + +### Changed + +- Dependencies updated + +## [1.0.2] + +### Changed + +- Dependencies updated + +## [1.1.0] + +### Added + +- `RpcErrorMessages` that contains mapping for standard RPC Errors and their messages. (#6230) +- created `TransactionGasMismatchInnerError` for clarity on the error in `TransactionGasMismatchError` (#6215) +- created `MissingGasInnerError` for clarity on the error in `MissingGasError` (#6215) + +### Fixed + +- Fixed: "'disconnect' in Eip1193 provider must emit ProviderRpcError #6003".(#6230) + +## [1.1.1] + +### Fixed + +- ESM import bug (#6359) + +## [1.1.2] + +### Changed + +- Dependencies updated + +## [1.1.3] + +### Fixed + +- Added new SchemaFormatError (#6434) + +## [1.1.4] + +### Fixed + +- Fixed grammar and spelling in `transactionTimeoutHint` (#6559) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-errors/README.md b/packages/web3-errors/README.md new file mode 100644 index 00000000000..9a68b9a7b8d --- /dev/null +++ b/packages/web3-errors/README.md @@ -0,0 +1,59 @@ +

+ web3.js +

+ +# web3.js - Web3-Errors + +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] + +This is a sub-package of [web3.js][repo]. + +`web3-errors` This package has web3 error classes. + +## Installation + +You can install the package either using [NPM](https://www.npmjs.com/package/web3-errors) or using [Yarn](https://yarnpkg.com/package/web3-errors) + +### Using NPM + +```bash +npm install web3-errors +``` + +### Using Yarn + +```bash +yarn add web3-errors +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-errors +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-errors%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-errors +[downloads-image]: https://img.shields.io/npm/dm/web3-errors?label=npm%20downloads diff --git a/packages/web3-errors/assets/logo/web3js.ai b/packages/web3-errors/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-errors/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-errors/assets/logo/web3js.jpg b/packages/web3-errors/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-errors/assets/logo/web3js.jpg differ diff --git a/packages/web3-errors/assets/logo/web3js.svg b/packages/web3-errors/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-errors/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-errors/package.json b/packages/web3-errors/package.json new file mode 100644 index 00000000000..89338006efd --- /dev/null +++ b/packages/web3-errors/package.json @@ -0,0 +1,60 @@ +{ + "name": "web3-errors", + "version": "1.1.4", + "description": "This package has web3 error classes", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "dependencies": { + "web3-types": "^1.3.1" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + } +} diff --git a/packages/web3-errors/src/error_codes.ts b/packages/web3-errors/src/error_codes.ts new file mode 100644 index 00000000000..1db99b30ea7 --- /dev/null +++ b/packages/web3-errors/src/error_codes.ts @@ -0,0 +1,183 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Response error +export const ERR_RESPONSE = 100; +export const ERR_INVALID_RESPONSE = 101; + +// Generic errors +export const ERR_PARAM = 200; +export const ERR_FORMATTERS = 201; +export const ERR_METHOD_NOT_IMPLEMENTED = 202; +export const ERR_OPERATION_TIMEOUT = 203; +export const ERR_OPERATION_ABORT = 204; +export const ERR_ABI_ENCODING = 205; +export const ERR_EXISTING_PLUGIN_NAMESPACE = 206; +export const ERR_INVALID_METHOD_PARAMS = 207; +export const ERR_MULTIPLE_ERRORS = 208; + +// Contract error codes +export const ERR_CONTRACT = 300; +export const ERR_CONTRACT_RESOLVER_MISSING = 301; +export const ERR_CONTRACT_ABI_MISSING = 302; +export const ERR_CONTRACT_REQUIRED_CALLBACK = 303; +export const ERR_CONTRACT_EVENT_NOT_EXISTS = 304; +export const ERR_CONTRACT_RESERVED_EVENT = 305; +export const ERR_CONTRACT_MISSING_DEPLOY_DATA = 306; +export const ERR_CONTRACT_MISSING_ADDRESS = 307; +export const ERR_CONTRACT_MISSING_FROM_ADDRESS = 308; +export const ERR_CONTRACT_INSTANTIATION = 309; +export const ERR_CONTRACT_EXECUTION_REVERTED = 310; +export const ERR_CONTRACT_TX_DATA_AND_INPUT = 311; + +// Transaction error codes +export const ERR_TX = 400; +export const ERR_TX_REVERT_INSTRUCTION = 401; +export const ERR_TX_REVERT_TRANSACTION = 402; +export const ERR_TX_NO_CONTRACT_ADDRESS = 403; +export const ERR_TX_CONTRACT_NOT_STORED = 404; +export const ERR_TX_REVERT_WITHOUT_REASON = 405; +export const ERR_TX_OUT_OF_GAS = 406; +export const ERR_RAW_TX_UNDEFINED = 407; + +export const ERR_TX_INVALID_SENDER = 408; +export const ERR_TX_INVALID_CALL = 409; +export const ERR_TX_MISSING_CUSTOM_CHAIN = 410; +export const ERR_TX_MISSING_CUSTOM_CHAIN_ID = 411; +export const ERR_TX_CHAIN_ID_MISMATCH = 412; +export const ERR_TX_INVALID_CHAIN_INFO = 413; +export const ERR_TX_MISSING_CHAIN_INFO = 414; +export const ERR_TX_MISSING_GAS = 415; +export const ERR_TX_INVALID_LEGACY_GAS = 416; +export const ERR_TX_INVALID_FEE_MARKET_GAS = 417; +export const ERR_TX_INVALID_FEE_MARKET_GAS_PRICE = 418; +export const ERR_TX_INVALID_LEGACY_FEE_MARKET = 419; +export const ERR_TX_INVALID_OBJECT = 420; +export const ERR_TX_INVALID_NONCE_OR_CHAIN_ID = 421; +export const ERR_TX_UNABLE_TO_POPULATE_NONCE = 422; +export const ERR_TX_UNSUPPORTED_EIP_1559 = 423; +export const ERR_TX_UNSUPPORTED_TYPE = 424; +export const ERR_TX_DATA_AND_INPUT = 425; +export const ERR_TX_POLLING_TIMEOUT = 426; +export const ERR_TX_RECEIPT_MISSING_OR_BLOCKHASH_NULL = 427; +export const ERR_TX_RECEIPT_MISSING_BLOCK_NUMBER = 428; + +export const ERR_TX_LOCAL_WALLET_NOT_AVAILABLE = 429; + +export const ERR_TX_NOT_FOUND = 430; +export const ERR_TX_SEND_TIMEOUT = 431; +export const ERR_TX_BLOCK_TIMEOUT = 432; + +export const ERR_TX_SIGNING = 433; +export const ERR_TX_GAS_MISMATCH = 434; + +export const ERR_TX_CHAIN_MISMATCH = 435; +export const ERR_TX_HARDFORK_MISMATCH = 436; +export const ERR_TX_INVALID_RECEIVER = 437; +export const ERR_TX_REVERT_TRANSACTION_CUSTOM_ERROR = 438; +export const ERR_TX_INVALID_PROPERTIES_FOR_TYPE = 439; + +export const ERR_TX_MISSING_GAS_INNER_ERROR = 440; +export const ERR_TX_GAS_MISMATCH_INNER_ERROR = 441; +// Connection error codes +export const ERR_CONN = 500; +export const ERR_CONN_INVALID = 501; +export const ERR_CONN_TIMEOUT = 502; +export const ERR_CONN_NOT_OPEN = 503; +export const ERR_CONN_CLOSE = 504; +export const ERR_CONN_MAX_ATTEMPTS = 505; +export const ERR_CONN_PENDING_REQUESTS = 506; +export const ERR_REQ_ALREADY_SENT = 507; + +// Provider error codes +export const ERR_PROVIDER = 600; +export const ERR_INVALID_PROVIDER = 601; +export const ERR_INVALID_CLIENT = 602; +export const ERR_SUBSCRIPTION = 603; +export const ERR_WS_PROVIDER = 604; + +// Account error codes +export const ERR_PRIVATE_KEY_LENGTH = 701; +export const ERR_INVALID_PRIVATE_KEY = 702; +export const ERR_UNSUPPORTED_KDF = 703; +export const ERR_KEY_DERIVATION_FAIL = 704; +export const ERR_KEY_VERSION_UNSUPPORTED = 705; +export const ERR_INVALID_PASSWORD = 706; +export const ERR_IV_LENGTH = 707; +export const ERR_INVALID_KEYSTORE = 708; +export const ERR_PBKDF2_ITERATIONS = 709; + +// Signature error codes +export const ERR_SIGNATURE_FAILED = 801; +export const ERR_INVALID_SIGNATURE = 802; + +export const GENESIS_BLOCK_NUMBER = '0x0'; + +// RPC error codes (EIP-1193) +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md#provider-errors +export const JSONRPC_ERR_REJECTED_REQUEST = 4001; +export const JSONRPC_ERR_UNAUTHORIZED = 4100; +export const JSONRPC_ERR_UNSUPPORTED_METHOD = 4200; +export const JSONRPC_ERR_DISCONNECTED = 4900; +export const JSONRPC_ERR_CHAIN_DISCONNECTED = 4901; + +// ENS error codes +export const ERR_ENS_CHECK_INTERFACE_SUPPORT = 901; +export const ERR_ENS_UNSUPPORTED_NETWORK = 902; +export const ERR_ENS_NETWORK_NOT_SYNCED = 903; + +// Utils error codes +export const ERR_INVALID_STRING = 1001; +export const ERR_INVALID_BYTES = 1002; +export const ERR_INVALID_NUMBER = 1003; +export const ERR_INVALID_UNIT = 1004; +export const ERR_INVALID_ADDRESS = 1005; +export const ERR_INVALID_HEX = 1006; +export const ERR_INVALID_TYPE = 1007; +export const ERR_INVALID_BOOLEAN = 1008; +export const ERR_INVALID_UNSIGNED_INTEGER = 1009; +export const ERR_INVALID_SIZE = 1010; +export const ERR_INVALID_LARGE_VALUE = 1011; +export const ERR_INVALID_BLOCK = 1012; +export const ERR_INVALID_TYPE_ABI = 1013; +export const ERR_INVALID_NIBBLE_WIDTH = 1014; + +// Validation error codes +export const ERR_VALIDATION = 1100; + + +// Core error codes +export const ERR_CORE_HARDFORK_MISMATCH = 1101; +export const ERR_CORE_CHAIN_MISMATCH = 1102; + +// Schema error codes +export const ERR_SCHEMA_FORMAT = 1200; + +// RPC error codes (EIP-1474) +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1474.md +export const ERR_RPC_INVALID_JSON = -32700; +export const ERR_RPC_INVALID_REQUEST = -32600; +export const ERR_RPC_INVALID_METHOD = -32601; +export const ERR_RPC_INVALID_PARAMS = -32602; +export const ERR_RPC_INTERNAL_ERROR = -32603; +export const ERR_RPC_INVALID_INPUT = -32000; +export const ERR_RPC_MISSING_RESOURCE = -32001; +export const ERR_RPC_UNAVAILABLE_RESOURCE = -32002; +export const ERR_RPC_TRANSACTION_REJECTED = -32003; +export const ERR_RPC_UNSUPPORTED_METHOD = -32004; +export const ERR_RPC_LIMIT_EXCEEDED = -32005; +export const ERR_RPC_NOT_SUPPORTED = -32006; diff --git a/packages/web3-errors/src/errors/account_errors.ts b/packages/web3-errors/src/errors/account_errors.ts new file mode 100644 index 00000000000..9d0d0c7580a --- /dev/null +++ b/packages/web3-errors/src/errors/account_errors.ts @@ -0,0 +1,94 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { + ERR_PRIVATE_KEY_LENGTH, + ERR_INVALID_PRIVATE_KEY, + ERR_INVALID_SIGNATURE, + ERR_UNSUPPORTED_KDF, + ERR_KEY_DERIVATION_FAIL, + ERR_KEY_VERSION_UNSUPPORTED, + ERR_INVALID_PASSWORD, + ERR_IV_LENGTH, + ERR_PBKDF2_ITERATIONS, +} from '../error_codes.js'; +import { BaseWeb3Error } from '../web3_error_base.js'; + +export class PrivateKeyLengthError extends BaseWeb3Error { + public code = ERR_PRIVATE_KEY_LENGTH; + public constructor() { + super(`Private key must be 32 bytes.`); + } +} + +export class InvalidPrivateKeyError extends BaseWeb3Error { + public code = ERR_INVALID_PRIVATE_KEY; + public constructor() { + super(`Invalid Private Key, Not a valid string or uint8Array`); + } +} + +export class InvalidSignatureError extends BaseWeb3Error { + public code = ERR_INVALID_SIGNATURE; + public constructor(errorDetails: string) { + super(`"${errorDetails}"`); + } +} + +export class InvalidKdfError extends BaseWeb3Error { + public code = ERR_UNSUPPORTED_KDF; + public constructor() { + super(`Invalid key derivation function`); + } +} + +export class KeyDerivationError extends BaseWeb3Error { + public code = ERR_KEY_DERIVATION_FAIL; + public constructor() { + super(`Key derivation failed - possibly wrong password`); + } +} + +export class KeyStoreVersionError extends BaseWeb3Error { + public code = ERR_KEY_VERSION_UNSUPPORTED; + public constructor() { + super('Unsupported key store version'); + } +} + +export class InvalidPasswordError extends BaseWeb3Error { + public code = ERR_INVALID_PASSWORD; + public constructor() { + super('Password cannot be empty'); + } +} + +export class IVLengthError extends BaseWeb3Error { + public code = ERR_IV_LENGTH; + public constructor() { + super('Initialization vector must be 16 bytes'); + } +} + +export class PBKDF2IterationsError extends BaseWeb3Error { + public code = ERR_PBKDF2_ITERATIONS; + public constructor() { + super('c > 1000, pbkdf2 is less secure with less iterations'); + } +} diff --git a/packages/web3-errors/src/errors/connection_errors.ts b/packages/web3-errors/src/errors/connection_errors.ts new file mode 100644 index 00000000000..d9d820898b0 --- /dev/null +++ b/packages/web3-errors/src/errors/connection_errors.ts @@ -0,0 +1,112 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { ConnectionEvent } from 'web3-types'; +import { + ERR_CONN, + ERR_CONN_INVALID, + ERR_CONN_TIMEOUT, + ERR_CONN_NOT_OPEN, + ERR_CONN_CLOSE, + ERR_CONN_MAX_ATTEMPTS, + ERR_CONN_PENDING_REQUESTS, + ERR_REQ_ALREADY_SENT, +} from '../error_codes.js'; +import { BaseWeb3Error } from '../web3_error_base.js'; + +export class ConnectionError extends BaseWeb3Error { + public code = ERR_CONN; + public errorCode?: number; + public errorReason?: string; + + public constructor(message: string, event?: ConnectionEvent) { + super(message); + + if (event) { + this.errorCode = event.code; + this.errorReason = event.reason; + } + } + + public toJSON() { + return { ...super.toJSON(), errorCode: this.errorCode, errorReason: this.errorReason }; + } +} + +export class InvalidConnectionError extends ConnectionError { + public constructor(public host: string, event?: ConnectionEvent) { + super(`CONNECTION ERROR: Couldn't connect to node ${host}.`, event); + this.code = ERR_CONN_INVALID; + } + + public toJSON() { + return { ...super.toJSON(), host: this.host }; + } +} + +export class ConnectionTimeoutError extends ConnectionError { + public constructor(public duration: number) { + super(`CONNECTION TIMEOUT: timeout of ${duration}ms achieved`); + this.code = ERR_CONN_TIMEOUT; + } + + public toJSON() { + return { ...super.toJSON(), duration: this.duration }; + } +} + +export class ConnectionNotOpenError extends ConnectionError { + public constructor(event?: ConnectionEvent) { + super('Connection not open', event); + this.code = ERR_CONN_NOT_OPEN; + } +} + +export class ConnectionCloseError extends ConnectionError { + public constructor(event?: ConnectionEvent) { + super( + `CONNECTION ERROR: The connection got closed with the close code ${ + event?.code ?? '' + } and the following reason string ${event?.reason ?? ''}`, + event, + ); + this.code = ERR_CONN_CLOSE; + } +} + +export class MaxAttemptsReachedOnReconnectingError extends ConnectionError { + public constructor(numberOfAttempts: number) { + super(`Maximum number of reconnect attempts reached! (${numberOfAttempts})`); + this.code = ERR_CONN_MAX_ATTEMPTS; + } +} + +export class PendingRequestsOnReconnectingError extends ConnectionError { + public constructor() { + super('CONNECTION ERROR: Provider started to reconnect before the response got received!'); + this.code = ERR_CONN_PENDING_REQUESTS; + } +} + +export class RequestAlreadySentError extends ConnectionError { + public constructor(id: number | string) { + super(`Request already sent with following id: ${id}`); + this.code = ERR_REQ_ALREADY_SENT; + } +} diff --git a/packages/web3-errors/src/errors/contract_errors.ts b/packages/web3-errors/src/errors/contract_errors.ts new file mode 100644 index 00000000000..3710d9f60f0 --- /dev/null +++ b/packages/web3-errors/src/errors/contract_errors.ts @@ -0,0 +1,236 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { JsonRpcError, TransactionReceipt, HexString } from 'web3-types'; +import { + ERR_CONTRACT, + ERR_CONTRACT_ABI_MISSING, + ERR_CONTRACT_EXECUTION_REVERTED, + ERR_CONTRACT_EVENT_NOT_EXISTS, + ERR_CONTRACT_INSTANTIATION, + ERR_CONTRACT_MISSING_ADDRESS, + ERR_CONTRACT_MISSING_DEPLOY_DATA, + ERR_CONTRACT_MISSING_FROM_ADDRESS, + ERR_CONTRACT_REQUIRED_CALLBACK, + ERR_CONTRACT_RESERVED_EVENT, + ERR_CONTRACT_RESOLVER_MISSING, + ERR_CONTRACT_TX_DATA_AND_INPUT, +} from '../error_codes.js'; +import { BaseWeb3Error, InvalidValueError } from '../web3_error_base.js'; + +export class Web3ContractError extends BaseWeb3Error { + public code = ERR_CONTRACT; + public receipt?: TransactionReceipt; + + public constructor(message: string, receipt?: TransactionReceipt) { + super(message); + + this.receipt = receipt; + } +} +export class ResolverMethodMissingError extends BaseWeb3Error { + public code = ERR_CONTRACT_RESOLVER_MISSING; + + public constructor(public address: string, public name: string) { + super(`The resolver at ${address} does not implement requested method: "${name}".`); + } + + public toJSON() { + return { ...super.toJSON(), address: this.address, name: this.name }; + } +} + +export class ContractMissingABIError extends BaseWeb3Error { + public code = ERR_CONTRACT_ABI_MISSING; + + public constructor() { + super( + 'You must provide the json interface of the contract when instantiating a contract object.', + ); + } +} + +export class ContractOnceRequiresCallbackError extends BaseWeb3Error { + public code = ERR_CONTRACT_REQUIRED_CALLBACK; + + public constructor() { + super('Once requires a callback as the second parameter.'); + } +} + +export class ContractEventDoesNotExistError extends BaseWeb3Error { + public code = ERR_CONTRACT_EVENT_NOT_EXISTS; + + public constructor(public eventName: string) { + super(`Event "${eventName}" doesn't exist in this contract.`); + } + + public toJSON() { + return { ...super.toJSON(), eventName: this.eventName }; + } +} + +export class ContractReservedEventError extends BaseWeb3Error { + public code = ERR_CONTRACT_RESERVED_EVENT; + + public constructor(public type: string) { + super(`Event "${type}" doesn't exist in this contract.`); + } + + public toJSON() { + return { ...super.toJSON(), type: this.type }; + } +} + +export class ContractMissingDeployDataError extends BaseWeb3Error { + public code = ERR_CONTRACT_MISSING_DEPLOY_DATA; + + public constructor() { + super(`No "data" specified in neither the given options, nor the default options.`); + } +} + +export class ContractNoAddressDefinedError extends BaseWeb3Error { + public code = ERR_CONTRACT_MISSING_ADDRESS; + + public constructor() { + super("This contract object doesn't have address set yet, please set an address first."); + } +} + +export class ContractNoFromAddressDefinedError extends BaseWeb3Error { + public code = ERR_CONTRACT_MISSING_FROM_ADDRESS; + + public constructor() { + super('No "from" address specified in neither the given options, nor the default options.'); + } +} + +export class ContractInstantiationError extends BaseWeb3Error { + public code = ERR_CONTRACT_INSTANTIATION; +} + +export type ProviderErrorData = + | HexString + | { data: HexString } + | { originalError: { data: HexString } }; + +/** + * This class is expected to be set as an `cause` inside ContractExecutionError + * The properties would be typically decoded from the `data` if it was encoded according to EIP-838 + */ +export class Eip838ExecutionError extends Web3ContractError { + public readonly name: string; + public code: number; + public data?: HexString; + public errorName?: string; + public errorSignature?: string; + public errorArgs?: { [K in string]: unknown }; + + // eslint-disable-next-line no-use-before-define + public cause: Eip838ExecutionError | undefined; + + public constructor(error: JsonRpcError | Eip838ExecutionError) { + super(error.message || 'Error'); + + this.name = ('name' in error && error.name) || this.constructor.name; + this.stack = ('stack' in error && error.stack) || undefined; + this.code = error.code; + + // get embedded error details got from some providers like MetaMask + // and set this.data from the inner error data for easier read. + // note: the data is a hex string inside either: + // error.data, error.data.data or error.data.originalError.data (https://github.com/web3/web3.js/issues/4454#issuecomment-1485953455) + if (typeof error.data === 'object') { + let originalError: { data: string }; + if ('originalError' in error.data) { + originalError = error.data.originalError; + } else { + // Ganache has no `originalError` sub-object unlike others + originalError = error.data; + } + this.data = originalError.data; + this.cause = new Eip838ExecutionError(originalError as JsonRpcError); + } else { + this.data = error.data; + } + } + + public setDecodedProperties( + errorName: string, + errorSignature?: string, + errorArgs?: { [K in string]: unknown }, + ) { + this.errorName = errorName; + this.errorSignature = errorSignature; + this.errorArgs = errorArgs; + } + + public toJSON() { + let json = { + ...super.toJSON(), + data: this.data, + } as { + name: string; + code: number; + message: string; + innerError: Eip838ExecutionError | undefined; + cause: Eip838ExecutionError | undefined; + data: string; + errorName?: string; + errorSignature?: string; + errorArgs?: { [K in string]: unknown }; + }; + + if (this.errorName) { + json = { + ...json, + errorName: this.errorName, + errorSignature: this.errorSignature, + errorArgs: this.errorArgs, + }; + } + return json; + } +} + +/** + * Used when an error is raised while executing a function inside a smart contract. + * The data is expected to be encoded according to EIP-848. + */ +export class ContractExecutionError extends Web3ContractError { + public cause: Eip838ExecutionError; + + public constructor(rpcError: JsonRpcError) { + super('Error happened while trying to execute a function inside a smart contract'); + this.code = ERR_CONTRACT_EXECUTION_REVERTED; + this.cause = new Eip838ExecutionError(rpcError as JsonRpcError); + } +} + +export class ContractTransactionDataAndInputError extends InvalidValueError { + public code = ERR_CONTRACT_TX_DATA_AND_INPUT; + + public constructor(value: { data: HexString | undefined; input: HexString | undefined }) { + super( + `data: ${value.data ?? 'undefined'}, input: ${value.input ?? 'undefined'}`, + 'You can\'t have "data" and "input" as properties of a contract at the same time, please use either "data" or "input" instead.', + ); + } +} diff --git a/packages/web3-errors/src/errors/core_errors.ts b/packages/web3-errors/src/errors/core_errors.ts new file mode 100644 index 00000000000..5adb6f732ec --- /dev/null +++ b/packages/web3-errors/src/errors/core_errors.ts @@ -0,0 +1,41 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { BaseWeb3Error } from '../web3_error_base.js'; +import { ERR_CORE_HARDFORK_MISMATCH } from '../error_codes.js'; + +export class ConfigHardforkMismatchError extends BaseWeb3Error { + public code = ERR_CORE_HARDFORK_MISMATCH; + + public constructor(defaultHardfork: string, commonHardFork: string) { + super( + `Web3Config hardfork doesnt match in defaultHardfork ${defaultHardfork} and common.hardfork ${commonHardFork}`, + ); + } +} + +export class ConfigChainMismatchError extends BaseWeb3Error { + public code = ERR_CORE_HARDFORK_MISMATCH; + + public constructor(defaultHardfork: string, commonHardFork: string) { + super( + `Web3Config chain doesnt match in defaultHardfork ${defaultHardfork} and common.hardfork ${commonHardFork}`, + ); + } +} diff --git a/packages/web3-errors/src/errors/ens_errors.ts b/packages/web3-errors/src/errors/ens_errors.ts new file mode 100644 index 00000000000..20a5796c931 --- /dev/null +++ b/packages/web3-errors/src/errors/ens_errors.ts @@ -0,0 +1,46 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { + ERR_ENS_CHECK_INTERFACE_SUPPORT, + ERR_ENS_NETWORK_NOT_SYNCED, + ERR_ENS_UNSUPPORTED_NETWORK, +} from '../error_codes.js'; +import { BaseWeb3Error } from '../web3_error_base.js'; + +export class ENSCheckInterfaceSupportError extends BaseWeb3Error { + public code = ERR_ENS_CHECK_INTERFACE_SUPPORT; + public constructor(errorDetails: string) { + super(`ENS resolver check interface support error. "${errorDetails}"`); + } +} + +export class ENSUnsupportedNetworkError extends BaseWeb3Error { + public code = ERR_ENS_UNSUPPORTED_NETWORK; + public constructor(networkType: string) { + super(`ENS is not supported on network ${networkType}`); + } +} + +export class ENSNetworkNotSyncedError extends BaseWeb3Error { + public code = ERR_ENS_NETWORK_NOT_SYNCED; + public constructor() { + super(`Network not synced`); + } +} diff --git a/packages/web3-errors/src/errors/generic_errors.ts b/packages/web3-errors/src/errors/generic_errors.ts new file mode 100644 index 00000000000..1e246bf88ff --- /dev/null +++ b/packages/web3-errors/src/errors/generic_errors.ts @@ -0,0 +1,100 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { + ERR_ABI_ENCODING, + ERR_FORMATTERS, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_OPERATION_ABORT, + ERR_OPERATION_TIMEOUT, + ERR_PARAM, + ERR_EXISTING_PLUGIN_NAMESPACE, + ERR_INVALID_METHOD_PARAMS, +} from '../error_codes.js'; +import { BaseWeb3Error } from '../web3_error_base.js'; + +export class InvalidNumberOfParamsError extends BaseWeb3Error { + public code = ERR_PARAM; + + public constructor(public got: number, public expected: number, public method: string) { + super(`Invalid number of parameters for "${method}". Got "${got}" expected "${expected}"!`); + } + + public toJSON() { + return { + ...super.toJSON(), + got: this.got, + expected: this.expected, + method: this.method, + }; + } +} + +export class InvalidMethodParamsError extends BaseWeb3Error { + public code = ERR_INVALID_METHOD_PARAMS; + + public constructor(public hint?: string) { + super(`Invalid parameters passed. "${typeof hint !== 'undefined' ? hint : ''}"`); + } + + public toJSON() { + return { + ...super.toJSON(), + hint: this.hint, + }; + } +} + +export class FormatterError extends BaseWeb3Error { + public code = ERR_FORMATTERS; +} + +export class MethodNotImplementedError extends BaseWeb3Error { + public code = ERR_METHOD_NOT_IMPLEMENTED; + + public constructor() { + super("The method you're trying to call is not implemented."); + } +} + +export class OperationTimeoutError extends BaseWeb3Error { + public code = ERR_OPERATION_TIMEOUT; +} + +export class OperationAbortError extends BaseWeb3Error { + public code = ERR_OPERATION_ABORT; +} + +export class AbiError extends BaseWeb3Error { + public code = ERR_ABI_ENCODING; + public readonly props: Record & { name?: string }; + + public constructor(message: string, props?: Record & { name?: string }) { + super(message); + this.props = props ?? {}; + } +} + +export class ExistingPluginNamespaceError extends BaseWeb3Error { + public code = ERR_EXISTING_PLUGIN_NAMESPACE; + + public constructor(pluginNamespace: string) { + super(`A plugin with the namespace: ${pluginNamespace} has already been registered.`); + } +} diff --git a/packages/web3-errors/src/errors/provider_errors.ts b/packages/web3-errors/src/errors/provider_errors.ts new file mode 100644 index 00000000000..bbaadf96c28 --- /dev/null +++ b/packages/web3-errors/src/errors/provider_errors.ts @@ -0,0 +1,55 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { + ERR_PROVIDER, + ERR_INVALID_PROVIDER, + ERR_INVALID_CLIENT, + ERR_SUBSCRIPTION, + ERR_WS_PROVIDER, +} from '../error_codes.js'; +import { BaseWeb3Error } from '../web3_error_base.js'; + +export class ProviderError extends BaseWeb3Error { + public code = ERR_PROVIDER; +} + +export class InvalidProviderError extends BaseWeb3Error { + public code = ERR_INVALID_PROVIDER; + + public constructor(public clientUrl: string) { + super(`Provider with url "${clientUrl}" is not set or invalid`); + } +} + +export class InvalidClientError extends BaseWeb3Error { + public code = ERR_INVALID_CLIENT; + + public constructor(clientUrl: string) { + super(`Client URL "${clientUrl}" is invalid.`); + } +} + +export class SubscriptionError extends BaseWeb3Error { + public code = ERR_SUBSCRIPTION; +} + +export class Web3WSProviderError extends BaseWeb3Error { + public code = ERR_WS_PROVIDER; // this had duplicate code with generic provider +} diff --git a/packages/web3-errors/src/errors/response_errors.ts b/packages/web3-errors/src/errors/response_errors.ts new file mode 100644 index 00000000000..9fb1f09e172 --- /dev/null +++ b/packages/web3-errors/src/errors/response_errors.ts @@ -0,0 +1,111 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line max-classes-per-file +import { + JsonRpcError, + JsonRpcPayload, + JsonRpcResponse, + JsonRpcResponseWithError, +} from 'web3-types'; +import { BaseWeb3Error, MultipleErrors } from '../web3_error_base.js'; +import { ERR_INVALID_RESPONSE, ERR_RESPONSE } from '../error_codes.js'; + +// To avoid circular package dependency, copied to code here. If you update this please update same function in `json_rpc.ts` +const isResponseWithError = ( + response: JsonRpcResponse, +): response is JsonRpcResponseWithError => + !Array.isArray(response) && + response.jsonrpc === '2.0' && + !!response && + // eslint-disable-next-line no-null/no-null + (response.result === undefined || response.result === null) && + // JSON RPC consider "null" as valid response + 'error' in response && + (typeof response.id === 'number' || typeof response.id === 'string'); + +const buildErrorMessage = (response: JsonRpcResponse): string => + isResponseWithError(response) ? response.error.message : ''; + +export class ResponseError extends BaseWeb3Error { + public code = ERR_RESPONSE; + public data?: ErrorType | ErrorType[]; + public request?: JsonRpcPayload; + + public constructor( + response: JsonRpcResponse, + message?: string, + request?: JsonRpcPayload, + ) { + super( + message ?? + `Returned error: ${ + Array.isArray(response) + ? response.map(r => buildErrorMessage(r)).join(',') + : buildErrorMessage(response) + }`, + ); + + if (!message) { + this.data = Array.isArray(response) + ? response.map(r => r.error?.data as ErrorType) + : response?.error?.data; + } + + this.request = request; + let errorOrErrors: JsonRpcError | JsonRpcError[] | undefined; + if (`error` in response) { + errorOrErrors = response.error as JsonRpcError; + } else if (response instanceof Array) { + errorOrErrors = response.filter(r => r.error).map(r => r.error) as JsonRpcError[]; + } + + if (Array.isArray(errorOrErrors) && errorOrErrors.length > 0) { + this.cause = new MultipleErrors(errorOrErrors as unknown as Error[]); + } else { + this.cause = errorOrErrors as Error | undefined; + } + } + + public toJSON() { + return { ...super.toJSON(), data: this.data, request: this.request }; + } +} + +export class InvalidResponseError extends ResponseError< + ErrorType, + RequestType +> { + public constructor( + result: JsonRpcResponse, + request?: JsonRpcPayload, + ) { + super(result, undefined, request); + this.code = ERR_INVALID_RESPONSE; + let errorOrErrors: JsonRpcError | JsonRpcError[] | undefined; + if (`error` in result) { + errorOrErrors = result.error as JsonRpcError; + } else if (result instanceof Array) { + errorOrErrors = result.map(r => r.error) as JsonRpcError[]; + } + if (Array.isArray(errorOrErrors)) { + this.cause = new MultipleErrors(errorOrErrors as unknown as Error[]); + } else { + this.cause = errorOrErrors as Error | undefined; + } + } +} \ No newline at end of file diff --git a/packages/web3-errors/src/errors/rpc_error_messages.ts b/packages/web3-errors/src/errors/rpc_error_messages.ts new file mode 100644 index 00000000000..f61c5a41ff0 --- /dev/null +++ b/packages/web3-errors/src/errors/rpc_error_messages.ts @@ -0,0 +1,221 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + ERR_RPC_INTERNAL_ERROR, + ERR_RPC_INVALID_INPUT, + ERR_RPC_INVALID_JSON, + ERR_RPC_INVALID_METHOD, + ERR_RPC_INVALID_PARAMS, + ERR_RPC_INVALID_REQUEST, + ERR_RPC_LIMIT_EXCEEDED, + ERR_RPC_MISSING_RESOURCE, + ERR_RPC_NOT_SUPPORTED, + ERR_RPC_TRANSACTION_REJECTED, + ERR_RPC_UNAVAILABLE_RESOURCE, + ERR_RPC_UNSUPPORTED_METHOD, + JSONRPC_ERR_CHAIN_DISCONNECTED, + JSONRPC_ERR_DISCONNECTED, + JSONRPC_ERR_REJECTED_REQUEST, + JSONRPC_ERR_UNAUTHORIZED, + JSONRPC_ERR_UNSUPPORTED_METHOD, +} from '../error_codes.js'; + +/** + * A template string for a generic Rpc Error. The `*code*` will be replaced with the code number. + * Note: consider in next version that a spelling mistake could be corrected for `occured` and the value could be: + * `An Rpc error has occurred with a code of *code*` + */ +export const genericRpcErrorMessageTemplate = 'An Rpc error has occured with a code of *code*'; + +/* eslint-disable @typescript-eslint/naming-convention */ +export const RpcErrorMessages: { + [key: number | string]: { name?: string; message: string; description?: string }; +} = { + // EIP-1474 & JSON RPC 2.0 + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1474.md + [ERR_RPC_INVALID_JSON]: { + message: 'Parse error', + description: 'Invalid JSON', + }, + [ERR_RPC_INVALID_REQUEST]: { + message: 'Invalid request', + description: 'JSON is not a valid request object ', + }, + [ERR_RPC_INVALID_METHOD]: { + message: 'Method not found', + description: 'Method does not exist ', + }, + [ERR_RPC_INVALID_PARAMS]: { + message: 'Invalid params', + description: 'Invalid method parameters', + }, + [ERR_RPC_INTERNAL_ERROR]: { + message: 'Internal error', + description: 'Internal JSON-RPC error', + }, + + [ERR_RPC_INVALID_INPUT]: { + message: 'Invalid input', + description: 'Missing or invalid parameters', + }, + [ERR_RPC_MISSING_RESOURCE]: { + message: 'Resource not found', + description: 'Requested resource not found', + }, + [ERR_RPC_UNAVAILABLE_RESOURCE]: { + message: 'Resource unavailable', + description: 'Requested resource not available', + }, + [ERR_RPC_TRANSACTION_REJECTED]: { + message: 'Transaction rejected', + description: 'Transaction creation failed', + }, + [ERR_RPC_UNSUPPORTED_METHOD]: { + message: 'Method not supported', + description: 'Method is not implemented', + }, + [ERR_RPC_LIMIT_EXCEEDED]: { + message: 'Limit exceeded', + description: 'Request exceeds defined limit', + }, + [ERR_RPC_NOT_SUPPORTED]: { + message: 'JSON-RPC version not supported', + description: 'Version of JSON-RPC protocol is not supported', + }, + + // EIP-1193 + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md#provider-errors + [JSONRPC_ERR_REJECTED_REQUEST]: { + name: 'User Rejected Request', + message: 'The user rejected the request.', + }, + [JSONRPC_ERR_UNAUTHORIZED]: { + name: 'Unauthorized', + message: 'The requested method and/or account has not been authorized by the user.', + }, + [JSONRPC_ERR_UNSUPPORTED_METHOD]: { + name: 'Unsupported Method', + message: 'The Provider does not support the requested method.', + }, + [JSONRPC_ERR_DISCONNECTED]: { + name: 'Disconnected', + message: 'The Provider is disconnected from all chains.', + }, + [JSONRPC_ERR_CHAIN_DISCONNECTED]: { + name: 'Chain Disconnected', + message: 'The Provider is not connected to the requested chain.', + }, + + // EIP-1193 - CloseEvent + // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code + '0-999': { + name: '', + message: 'Not used.', + }, + 1000: { + name: 'Normal Closure', + message: 'The connection successfully completed the purpose for which it was created.', + }, + 1001: { + name: 'Going Away', + message: + 'The endpoint is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.', + }, + 1002: { + name: 'Protocol error', + message: 'The endpoint is terminating the connection due to a protocol error.', + }, + 1003: { + name: 'Unsupported Data', + message: + 'The connection is being terminated because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)', + }, + 1004: { + name: 'Reserved', + message: 'Reserved. A meaning might be defined in the future.', + }, + 1005: { + name: 'No Status Rcvd', + message: + 'Reserved. Indicates that no status code was provided even though one was expected.', + }, + 1006: { + name: 'Abnormal Closure', + message: + 'Reserved. Indicates that a connection was closed abnormally (that is, with no close frame being sent) when a status code is expected.', + }, + 1007: { + name: 'Invalid frame payload data', + message: + 'The endpoint is terminating the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).', + }, + 1008: { + name: 'Policy Violation', + message: + 'The endpoint is terminating the connection because it received a message that violates its policy. This is a generic status code, used when codes 1003 and 1009 are not suitable.', + }, + 1009: { + name: 'Message Too Big', + message: + 'The endpoint is terminating the connection because a data frame was received that is too large.', + }, + 1010: { + name: 'Mandatory Ext.', + message: + "The client is terminating the connection because it expected the server to negotiate one or more extension, but the server didn't.", + }, + 1011: { + name: 'Internal Error', + message: + 'The server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request.', + }, + 1012: { + name: 'Service Restart', + message: 'The server is terminating the connection because it is restarting.', + }, + 1013: { + name: 'Try Again Later', + message: + 'The server is terminating the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.', + }, + 1014: { + name: 'Bad Gateway', + message: + 'The server was acting as a gateway or proxy and received an invalid response from the upstream server. This is similar to 502 HTTP Status Code.', + }, + 1015: { + name: 'TLS handshake', + message: + "Reserved. Indicates that the connection was closed due to a failure to perform a TLS handshake (e.g., the server certificate can't be verified).", + }, + '1016-2999': { + name: '', + message: + 'For definition by future revisions of the WebSocket Protocol specification, and for definition by extension specifications.', + }, + '3000-3999': { + name: '', + message: + 'For use by libraries, frameworks, and applications. These status codes are registered directly with IANA. The interpretation of these codes is undefined by the WebSocket protocol.', + }, + '4000-4999': { + name: '', + message: + "For private use, and thus can't be registered. Such codes can be used by prior agreements between WebSocket applications. The interpretation of these codes is undefined by the WebSocket protocol.", + }, +}; diff --git a/packages/web3-errors/src/errors/rpc_errors.ts b/packages/web3-errors/src/errors/rpc_errors.ts new file mode 100644 index 00000000000..d7f7e899e59 --- /dev/null +++ b/packages/web3-errors/src/errors/rpc_errors.ts @@ -0,0 +1,197 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { JsonRpcResponseWithError, JsonRpcId, JsonRpcError } from 'web3-types'; +import { BaseWeb3Error } from '../web3_error_base.js'; +import { + ERR_RPC_INTERNAL_ERROR, + ERR_RPC_INVALID_INPUT, + ERR_RPC_INVALID_JSON, + ERR_RPC_INVALID_METHOD, + ERR_RPC_INVALID_PARAMS, + ERR_RPC_INVALID_REQUEST, + ERR_RPC_LIMIT_EXCEEDED, + ERR_RPC_MISSING_RESOURCE, + ERR_RPC_NOT_SUPPORTED, + ERR_RPC_TRANSACTION_REJECTED, + ERR_RPC_UNAVAILABLE_RESOURCE, + ERR_RPC_UNSUPPORTED_METHOD, +} from '../error_codes.js'; +import { RpcErrorMessages, genericRpcErrorMessageTemplate } from './rpc_error_messages.js'; + +export class RpcError extends BaseWeb3Error { + public code: number; + public id: JsonRpcId; + public jsonrpc: string; + public jsonRpcError: JsonRpcError; + public constructor(rpcError: JsonRpcResponseWithError, message?: string) { + super( + message ?? + genericRpcErrorMessageTemplate.replace('*code*', rpcError.error.code.toString()), + ); + this.code = rpcError.error.code; + this.id = rpcError.id; + this.jsonrpc = rpcError.jsonrpc; + this.jsonRpcError = rpcError.error; + } + + public toJSON() { + return { ...super.toJSON(), error: this.jsonRpcError, id: this.id, jsonRpc: this.jsonrpc }; + } +} + +export class EIP1193ProviderRpcError extends BaseWeb3Error { + public code: number; + public data?: unknown; + + public constructor(code: number, data?: unknown) { + if (!code) { + // this case should ideally not happen + super(); + } else if (RpcErrorMessages[code]?.message) { + super(RpcErrorMessages[code].message); + } else { + // Retrieve the status code object for the given code from the table, by searching through the appropriate range + const statusCodeRange = Object.keys(RpcErrorMessages).find( + statusCode => + typeof statusCode === 'string' && + code >= parseInt(statusCode.split('-')[0], 10) && + code <= parseInt(statusCode.split('-')[1], 10), + ); + super( + RpcErrorMessages[statusCodeRange ?? '']?.message ?? + genericRpcErrorMessageTemplate.replace('*code*', code?.toString() ?? '""'), + ); + } + this.code = code; + this.data = data; + } +} + +export class ParseError extends RpcError { + public code = ERR_RPC_INVALID_JSON; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_INVALID_JSON].message); + } +} + +export class InvalidRequestError extends RpcError { + public code = ERR_RPC_INVALID_REQUEST; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_INVALID_REQUEST].message); + } +} + +export class MethodNotFoundError extends RpcError { + public code = ERR_RPC_INVALID_METHOD; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_INVALID_METHOD].message); + } +} + +export class InvalidParamsError extends RpcError { + public code = ERR_RPC_INVALID_PARAMS; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_INVALID_PARAMS].message); + } +} + +export class InternalError extends RpcError { + public code = ERR_RPC_INTERNAL_ERROR; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_INTERNAL_ERROR].message); + } +} + +export class InvalidInputError extends RpcError { + public code = ERR_RPC_INVALID_INPUT; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_INVALID_INPUT].message); + } +} + +export class MethodNotSupported extends RpcError { + public code = ERR_RPC_UNSUPPORTED_METHOD; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_UNSUPPORTED_METHOD].message); + } +} + +export class ResourceUnavailableError extends RpcError { + public code = ERR_RPC_UNAVAILABLE_RESOURCE; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_UNAVAILABLE_RESOURCE].message); + } +} + +export class ResourcesNotFoundError extends RpcError { + public code = ERR_RPC_MISSING_RESOURCE; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_MISSING_RESOURCE].message); + } +} + +export class VersionNotSupportedError extends RpcError { + public code = ERR_RPC_NOT_SUPPORTED; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_NOT_SUPPORTED].message); + } +} + +export class TransactionRejectedError extends RpcError { + public code = ERR_RPC_TRANSACTION_REJECTED; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_TRANSACTION_REJECTED].message); + } +} + +export class LimitExceededError extends RpcError { + public code = ERR_RPC_LIMIT_EXCEEDED; + public constructor(rpcError: JsonRpcResponseWithError) { + super(rpcError, RpcErrorMessages[ERR_RPC_LIMIT_EXCEEDED].message); + } +} + +export const rpcErrorsMap = new Map(); +rpcErrorsMap.set(ERR_RPC_INVALID_JSON, { error: ParseError }); +rpcErrorsMap.set(ERR_RPC_INVALID_REQUEST, { + error: InvalidRequestError, +}); +rpcErrorsMap.set(ERR_RPC_INVALID_METHOD, { + error: MethodNotFoundError, +}); +rpcErrorsMap.set(ERR_RPC_INVALID_PARAMS, { error: InvalidParamsError }); +rpcErrorsMap.set(ERR_RPC_INTERNAL_ERROR, { error: InternalError }); +rpcErrorsMap.set(ERR_RPC_INVALID_INPUT, { error: InvalidInputError }); +rpcErrorsMap.set(ERR_RPC_UNSUPPORTED_METHOD, { + error: MethodNotSupported, +}); +rpcErrorsMap.set(ERR_RPC_UNAVAILABLE_RESOURCE, { + error: ResourceUnavailableError, +}); +rpcErrorsMap.set(ERR_RPC_TRANSACTION_REJECTED, { + error: TransactionRejectedError, +}); +rpcErrorsMap.set(ERR_RPC_MISSING_RESOURCE, { + error: ResourcesNotFoundError, +}); +rpcErrorsMap.set(ERR_RPC_NOT_SUPPORTED, { + error: VersionNotSupportedError, +}); +rpcErrorsMap.set(ERR_RPC_LIMIT_EXCEEDED, { error: LimitExceededError }); diff --git a/packages/web3-errors/src/errors/schema_errors.ts b/packages/web3-errors/src/errors/schema_errors.ts new file mode 100644 index 00000000000..4d61684c616 --- /dev/null +++ b/packages/web3-errors/src/errors/schema_errors.ts @@ -0,0 +1,32 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ERR_SCHEMA_FORMAT } from '../error_codes.js'; +import { BaseWeb3Error } from '../web3_error_base.js'; + +export class SchemaFormatError extends BaseWeb3Error { + public code = ERR_SCHEMA_FORMAT; + + public constructor(public type: string) { + super(`Format for the type ${type} is unsupported`); + } + + public toJSON() { + return { ...super.toJSON(), type: this.type }; + } + +} diff --git a/packages/web3-errors/src/errors/signature_errors.ts b/packages/web3-errors/src/errors/signature_errors.ts new file mode 100644 index 00000000000..c5a07173e25 --- /dev/null +++ b/packages/web3-errors/src/errors/signature_errors.ts @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ERR_SIGNATURE_FAILED } from '../error_codes.js'; +import { InvalidValueError } from '../web3_error_base.js'; + +export class SignatureError extends InvalidValueError { + public code = ERR_SIGNATURE_FAILED; +} diff --git a/packages/web3-errors/src/errors/transaction_errors.ts b/packages/web3-errors/src/errors/transaction_errors.ts new file mode 100644 index 00000000000..9a62750142f --- /dev/null +++ b/packages/web3-errors/src/errors/transaction_errors.ts @@ -0,0 +1,589 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { + Bytes, + HexString, + Numbers, + TransactionReceipt, + Web3ValidationErrorObject, +} from 'web3-types'; +import { + ERR_RAW_TX_UNDEFINED, + ERR_TX, + ERR_TX_BLOCK_TIMEOUT, + ERR_TX_CONTRACT_NOT_STORED, + ERR_TX_CHAIN_ID_MISMATCH, + ERR_TX_DATA_AND_INPUT, + ERR_TX_GAS_MISMATCH, + ERR_TX_CHAIN_MISMATCH, + ERR_TX_HARDFORK_MISMATCH, + ERR_TX_INVALID_CALL, + ERR_TX_INVALID_CHAIN_INFO, + ERR_TX_INVALID_FEE_MARKET_GAS, + ERR_TX_INVALID_FEE_MARKET_GAS_PRICE, + ERR_TX_INVALID_LEGACY_FEE_MARKET, + ERR_TX_INVALID_LEGACY_GAS, + ERR_TX_INVALID_NONCE_OR_CHAIN_ID, + ERR_TX_INVALID_OBJECT, + ERR_TX_INVALID_SENDER, + ERR_TX_INVALID_RECEIVER, + ERR_TX_LOCAL_WALLET_NOT_AVAILABLE, + ERR_TX_MISSING_CHAIN_INFO, + ERR_TX_MISSING_CUSTOM_CHAIN, + ERR_TX_MISSING_CUSTOM_CHAIN_ID, + ERR_TX_MISSING_GAS, + ERR_TX_NO_CONTRACT_ADDRESS, + ERR_TX_NOT_FOUND, + ERR_TX_OUT_OF_GAS, + ERR_TX_POLLING_TIMEOUT, + ERR_TX_RECEIPT_MISSING_BLOCK_NUMBER, + ERR_TX_RECEIPT_MISSING_OR_BLOCKHASH_NULL, + ERR_TX_REVERT_INSTRUCTION, + ERR_TX_REVERT_TRANSACTION, + ERR_TX_REVERT_WITHOUT_REASON, + ERR_TX_SEND_TIMEOUT, + ERR_TX_SIGNING, + ERR_TX_UNABLE_TO_POPULATE_NONCE, + ERR_TX_UNSUPPORTED_EIP_1559, + ERR_TX_UNSUPPORTED_TYPE, + ERR_TX_REVERT_TRANSACTION_CUSTOM_ERROR, + ERR_TX_INVALID_PROPERTIES_FOR_TYPE, + ERR_TX_MISSING_GAS_INNER_ERROR, + ERR_TX_GAS_MISMATCH_INNER_ERROR, +} from '../error_codes.js'; +import { InvalidValueError, BaseWeb3Error } from '../web3_error_base.js'; + +export class TransactionError extends BaseWeb3Error { + public code = ERR_TX; + + public constructor(message: string, public receipt?: ReceiptType) { + super(message); + } + + public toJSON() { + return { ...super.toJSON(), receipt: this.receipt }; + } +} + +export class RevertInstructionError extends BaseWeb3Error { + public code = ERR_TX_REVERT_INSTRUCTION; + + public constructor(public reason: string, public signature: string) { + super(`Your request got reverted with the following reason string: ${reason}`); + } + + public toJSON() { + return { ...super.toJSON(), reason: this.reason, signature: this.signature }; + } +} + +export class TransactionRevertInstructionError< + ReceiptType = TransactionReceipt, +> extends BaseWeb3Error { + public code = ERR_TX_REVERT_TRANSACTION; + + public constructor( + public reason: string, + public signature?: string, + public receipt?: ReceiptType, + public data?: string, + ) { + super( + `Transaction has been reverted by the EVM${ + receipt === undefined ? '' : `:\n ${BaseWeb3Error.convertToString(receipt)}` + }`, + ); + } + + public toJSON() { + return { + ...super.toJSON(), + reason: this.reason, + signature: this.signature, + receipt: this.receipt, + data: this.data, + }; + } +} + +/** + * This error is used when a transaction to a smart contract fails and + * a custom user error (https://blog.soliditylang.org/2021/04/21/custom-errors/) + * is able to be parsed from the revert reason + */ +export class TransactionRevertWithCustomError< + ReceiptType = TransactionReceipt, +> extends TransactionRevertInstructionError { + public code = ERR_TX_REVERT_TRANSACTION_CUSTOM_ERROR; + + public constructor( + public reason: string, + public customErrorName: string, + public customErrorDecodedSignature: string, + public customErrorArguments: Record, + public signature?: string, + public receipt?: ReceiptType, + public data?: string, + ) { + super(reason); + } + + public toJSON() { + return { + ...super.toJSON(), + reason: this.reason, + customErrorName: this.customErrorName, + customErrorDecodedSignature: this.customErrorDecodedSignature, + customErrorArguments: this.customErrorArguments, + signature: this.signature, + receipt: this.receipt, + data: this.data, + }; + } +} + +export class NoContractAddressFoundError extends TransactionError { + public constructor(receipt: TransactionReceipt) { + super("The transaction receipt didn't contain a contract address.", receipt); + this.code = ERR_TX_NO_CONTRACT_ADDRESS; + } + + public toJSON() { + return { ...super.toJSON(), receipt: this.receipt }; + } +} + +export class ContractCodeNotStoredError extends TransactionError { + public constructor(receipt: TransactionReceipt) { + super("The contract code couldn't be stored, please check your gas limit.", receipt); + this.code = ERR_TX_CONTRACT_NOT_STORED; + } +} + +export class TransactionRevertedWithoutReasonError< + ReceiptType = TransactionReceipt, +> extends TransactionError { + public constructor(receipt?: ReceiptType) { + super( + `Transaction has been reverted by the EVM${ + receipt === undefined ? '' : `:\n ${BaseWeb3Error.convertToString(receipt)}` + }`, + receipt, + ); + this.code = ERR_TX_REVERT_WITHOUT_REASON; + } +} + +export class TransactionOutOfGasError extends TransactionError { + public constructor(receipt: TransactionReceipt) { + super( + `Transaction ran out of gas. Please provide more gas:\n ${JSON.stringify( + receipt, + undefined, + 2, + )}`, + receipt, + ); + this.code = ERR_TX_OUT_OF_GAS; + } +} + +export class UndefinedRawTransactionError extends TransactionError { + public constructor() { + super(`Raw transaction undefined`); + this.code = ERR_RAW_TX_UNDEFINED; + } +} +export class TransactionNotFound extends TransactionError { + public constructor() { + super('Transaction not found'); + this.code = ERR_TX_NOT_FOUND; + } +} + +export class InvalidTransactionWithSender extends InvalidValueError { + public code = ERR_TX_INVALID_SENDER; + + public constructor(value: unknown) { + super(value, 'invalid transaction with invalid sender'); + } +} +export class InvalidTransactionWithReceiver extends InvalidValueError { + public code = ERR_TX_INVALID_RECEIVER; + + public constructor(value: unknown) { + super(value, 'invalid transaction with invalid receiver'); + } +} +export class InvalidTransactionCall extends InvalidValueError { + public code = ERR_TX_INVALID_CALL; + + public constructor(value: unknown) { + super(value, 'invalid transaction call'); + } +} + +export class MissingCustomChainError extends InvalidValueError { + public code = ERR_TX_MISSING_CUSTOM_CHAIN; + + public constructor() { + super( + 'MissingCustomChainError', + 'If tx.common is provided it must have tx.common.customChain', + ); + } +} + +export class MissingCustomChainIdError extends InvalidValueError { + public code = ERR_TX_MISSING_CUSTOM_CHAIN_ID; + + public constructor() { + super( + 'MissingCustomChainIdError', + 'If tx.common is provided it must have tx.common.customChain and tx.common.customChain.chainId', + ); + } +} + +export class ChainIdMismatchError extends InvalidValueError { + public code = ERR_TX_CHAIN_ID_MISMATCH; + + public constructor(value: { txChainId: unknown; customChainId: unknown }) { + super( + JSON.stringify(value), + // https://github.com/ChainSafe/web3.js/blob/8783f4d64e424456bdc53b34ef1142d0a7cee4d7/packages/web3-eth-accounts/src/index.js#L176 + 'Chain Id doesnt match in tx.chainId tx.common.customChain.chainId', + ); + } +} + +export class ChainMismatchError extends InvalidValueError { + public code = ERR_TX_CHAIN_MISMATCH; + + public constructor(value: { txChain: unknown; baseChain: unknown }) { + super(JSON.stringify(value), 'Chain doesnt match in tx.chain tx.common.basechain'); + } +} + +export class HardforkMismatchError extends InvalidValueError { + public code = ERR_TX_HARDFORK_MISMATCH; + + public constructor(value: { txHardfork: unknown; commonHardfork: unknown }) { + super(JSON.stringify(value), 'hardfork doesnt match in tx.hardfork tx.common.hardfork'); + } +} + +export class CommonOrChainAndHardforkError extends InvalidValueError { + public code = ERR_TX_INVALID_CHAIN_INFO; + + public constructor() { + super( + 'CommonOrChainAndHardforkError', + 'Please provide the common object or the chain and hardfork property but not all together.', + ); + } +} + +export class MissingChainOrHardforkError extends InvalidValueError { + public code = ERR_TX_MISSING_CHAIN_INFO; + + public constructor(value: { chain: string | undefined; hardfork: string | undefined }) { + super( + 'MissingChainOrHardforkError', + `When specifying chain and hardfork, both values must be defined. Received "chain": ${ + value.chain ?? 'undefined' + }, "hardfork": ${value.hardfork ?? 'undefined'}`, + ); + } +} + +export class MissingGasInnerError extends BaseWeb3Error { + public code = ERR_TX_MISSING_GAS_INNER_ERROR; + + public constructor() { + super( + 'Missing properties in transaction, either define "gas" and "gasPrice" for type 0 transactions or "gas", "maxPriorityFeePerGas" and "maxFeePerGas" for type 2 transactions', + ); + } +} + +export class MissingGasError extends InvalidValueError { + public code = ERR_TX_MISSING_GAS; + + public constructor(value: { + gas: Numbers | undefined; + gasPrice: Numbers | undefined; + maxPriorityFeePerGas: Numbers | undefined; + maxFeePerGas: Numbers | undefined; + }) { + super( + `gas: ${value.gas ?? 'undefined'}, gasPrice: ${ + value.gasPrice ?? 'undefined' + }, maxPriorityFeePerGas: ${value.maxPriorityFeePerGas ?? 'undefined'}, maxFeePerGas: ${ + value.maxFeePerGas ?? 'undefined' + }`, + '"gas" is missing', + ); + this.cause = new MissingGasInnerError(); + } +} + +export class TransactionGasMismatchInnerError extends BaseWeb3Error { + public code = ERR_TX_GAS_MISMATCH_INNER_ERROR; + + public constructor() { + super( + 'Missing properties in transaction, either define "gas" and "gasPrice" for type 0 transactions or "gas", "maxPriorityFeePerGas" and "maxFeePerGas" for type 2 transactions, not both', + ); + } +} + +export class TransactionGasMismatchError extends InvalidValueError { + public code = ERR_TX_GAS_MISMATCH; + + public constructor(value: { + gas: Numbers | undefined; + gasPrice: Numbers | undefined; + maxPriorityFeePerGas: Numbers | undefined; + maxFeePerGas: Numbers | undefined; + }) { + super( + `gas: ${value.gas ?? 'undefined'}, gasPrice: ${ + value.gasPrice ?? 'undefined' + }, maxPriorityFeePerGas: ${value.maxPriorityFeePerGas ?? 'undefined'}, maxFeePerGas: ${ + value.maxFeePerGas ?? 'undefined' + }`, + 'transaction must specify legacy or fee market gas properties, not both', + ); + this.cause = new TransactionGasMismatchInnerError(); + } +} + +export class InvalidGasOrGasPrice extends InvalidValueError { + public code = ERR_TX_INVALID_LEGACY_GAS; + + public constructor(value: { gas: Numbers | undefined; gasPrice: Numbers | undefined }) { + super( + `gas: ${value.gas ?? 'undefined'}, gasPrice: ${value.gasPrice ?? 'undefined'}`, + 'Gas or gasPrice is lower than 0', + ); + } +} + +export class InvalidMaxPriorityFeePerGasOrMaxFeePerGas extends InvalidValueError { + public code = ERR_TX_INVALID_FEE_MARKET_GAS; + + public constructor(value: { + maxPriorityFeePerGas: Numbers | undefined; + maxFeePerGas: Numbers | undefined; + }) { + super( + `maxPriorityFeePerGas: ${value.maxPriorityFeePerGas ?? 'undefined'}, maxFeePerGas: ${ + value.maxFeePerGas ?? 'undefined' + }`, + 'maxPriorityFeePerGas or maxFeePerGas is lower than 0', + ); + } +} + +export class Eip1559GasPriceError extends InvalidValueError { + public code = ERR_TX_INVALID_FEE_MARKET_GAS_PRICE; + + public constructor(value: unknown) { + super(value, "eip-1559 transactions don't support gasPrice"); + } +} + +export class UnsupportedFeeMarketError extends InvalidValueError { + public code = ERR_TX_INVALID_LEGACY_FEE_MARKET; + + public constructor(value: { + maxPriorityFeePerGas: Numbers | undefined; + maxFeePerGas: Numbers | undefined; + }) { + super( + `maxPriorityFeePerGas: ${value.maxPriorityFeePerGas ?? 'undefined'}, maxFeePerGas: ${ + value.maxFeePerGas ?? 'undefined' + }`, + "pre-eip-1559 transaction don't support maxFeePerGas/maxPriorityFeePerGas", + ); + } +} + +export class InvalidTransactionObjectError extends InvalidValueError { + public code = ERR_TX_INVALID_OBJECT; + + public constructor(value: unknown) { + super(value, 'invalid transaction object'); + } +} + +export class InvalidNonceOrChainIdError extends InvalidValueError { + public code = ERR_TX_INVALID_NONCE_OR_CHAIN_ID; + + public constructor(value: { nonce: Numbers | undefined; chainId: Numbers | undefined }) { + super( + `nonce: ${value.nonce ?? 'undefined'}, chainId: ${value.chainId ?? 'undefined'}`, + 'Nonce or chainId is lower than 0', + ); + } +} + +export class UnableToPopulateNonceError extends InvalidValueError { + public code = ERR_TX_UNABLE_TO_POPULATE_NONCE; + + public constructor() { + super('UnableToPopulateNonceError', 'unable to populate nonce, no from address available'); + } +} + +export class Eip1559NotSupportedError extends InvalidValueError { + public code = ERR_TX_UNSUPPORTED_EIP_1559; + + public constructor() { + super('Eip1559NotSupportedError', "Network doesn't support eip-1559"); + } +} + +export class UnsupportedTransactionTypeError extends InvalidValueError { + public code = ERR_TX_UNSUPPORTED_TYPE; + + public constructor(value: unknown) { + super(value, 'unsupported transaction type'); + } +} + +export class TransactionDataAndInputError extends InvalidValueError { + public code = ERR_TX_DATA_AND_INPUT; + + public constructor(value: { data: HexString | undefined; input: HexString | undefined }) { + super( + `data: ${value.data ?? 'undefined'}, input: ${value.input ?? 'undefined'}`, + 'You can\'t have "data" and "input" as properties of transactions at the same time, please use either "data" or "input" instead.', + ); + } +} + +export class TransactionSendTimeoutError extends BaseWeb3Error { + public code = ERR_TX_SEND_TIMEOUT; + + public constructor(value: { numberOfSeconds: number; transactionHash?: Bytes }) { + super( + `The connected Ethereum Node did not respond within ${ + value.numberOfSeconds + } seconds, please make sure your transaction was properly sent and you are connected to a healthy Node. Be aware that transaction might still be pending or mined!\n\tTransaction Hash: ${ + value.transactionHash ? value.transactionHash.toString() : 'not available' + }`, + ); + } +} + +function transactionTimeoutHint(transactionHash?: Bytes) { + return `Please make sure your transaction was properly sent and there are no previous pending transaction for the same account. However, be aware that it might still be mined!\n\tTransaction Hash: ${ + transactionHash ? transactionHash.toString() : 'not available' + }`; +} + +export class TransactionPollingTimeoutError extends BaseWeb3Error { + public code = ERR_TX_POLLING_TIMEOUT; + + public constructor(value: { numberOfSeconds: number; transactionHash: Bytes }) { + super( + `Transaction was not mined within ${ + value.numberOfSeconds + } seconds. ${transactionTimeoutHint(value.transactionHash)}`, + ); + } +} + +export class TransactionBlockTimeoutError extends BaseWeb3Error { + public code = ERR_TX_BLOCK_TIMEOUT; + + public constructor(value: { + starterBlockNumber: number; + numberOfBlocks: number; + transactionHash?: Bytes; + }) { + super( + `Transaction started at ${value.starterBlockNumber} but was not mined within ${ + value.numberOfBlocks + } blocks. ${transactionTimeoutHint(value.transactionHash)}`, + ); + } +} + +export class TransactionMissingReceiptOrBlockHashError extends InvalidValueError { + public code = ERR_TX_RECEIPT_MISSING_OR_BLOCKHASH_NULL; + + public constructor(value: { + receipt: TransactionReceipt; + blockHash: Bytes; + transactionHash: Bytes; + }) { + super( + `receipt: ${JSON.stringify( + value.receipt, + )}, blockHash: ${value.blockHash?.toString()}, transactionHash: ${value.transactionHash?.toString()}`, + `Receipt missing or blockHash null`, + ); + } +} + +export class TransactionReceiptMissingBlockNumberError extends InvalidValueError { + public code = ERR_TX_RECEIPT_MISSING_BLOCK_NUMBER; + + public constructor(value: { receipt: TransactionReceipt }) { + super(`receipt: ${JSON.stringify(value.receipt)}`, `Receipt missing block number`); + } +} + +export class TransactionSigningError extends BaseWeb3Error { + public code = ERR_TX_SIGNING; + public constructor(errorDetails: string) { + super(`Invalid signature. "${errorDetails}"`); + } +} + +export class LocalWalletNotAvailableError extends InvalidValueError { + public code = ERR_TX_LOCAL_WALLET_NOT_AVAILABLE; + + public constructor() { + super( + 'LocalWalletNotAvailableError', + `Attempted to index account in local wallet, but no wallet is available`, + ); + } +} +export class InvalidPropertiesForTransactionTypeError extends BaseWeb3Error { + public code = ERR_TX_INVALID_PROPERTIES_FOR_TYPE; + + public constructor( + validationError: Web3ValidationErrorObject[], + txType: '0x0' | '0x1' | '0x2', + ) { + const invalidPropertyNames: string[] = []; + validationError.forEach(error => invalidPropertyNames.push(error.keyword)); + super( + `The following properties are invalid for the transaction type ${txType}: ${invalidPropertyNames.join( + ', ', + )}`, + ); + } +} diff --git a/packages/web3-errors/src/errors/utils_errors.ts b/packages/web3-errors/src/errors/utils_errors.ts new file mode 100644 index 00000000000..b93ff964f38 --- /dev/null +++ b/packages/web3-errors/src/errors/utils_errors.ts @@ -0,0 +1,148 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { + ERR_INVALID_BYTES, + ERR_INVALID_NUMBER, + ERR_INVALID_ADDRESS, + ERR_INVALID_BLOCK, + ERR_INVALID_BOOLEAN, + ERR_INVALID_HEX, + ERR_INVALID_LARGE_VALUE, + ERR_INVALID_NIBBLE_WIDTH, + ERR_INVALID_SIZE, + ERR_INVALID_STRING, + ERR_INVALID_TYPE, + ERR_INVALID_TYPE_ABI, + ERR_INVALID_UNIT, + ERR_INVALID_UNSIGNED_INTEGER, +} from '../error_codes.js'; +import { InvalidValueError } from '../web3_error_base.js'; + +export class InvalidBytesError extends InvalidValueError { + public code = ERR_INVALID_BYTES; + + public constructor(value: unknown) { + super(value, 'can not parse as byte data'); + } +} + +export class InvalidNumberError extends InvalidValueError { + public code = ERR_INVALID_NUMBER; + + public constructor(value: unknown) { + super(value, 'can not parse as number data'); + } +} + +export class InvalidAddressError extends InvalidValueError { + public code = ERR_INVALID_ADDRESS; + + public constructor(value: unknown) { + super(value, 'invalid ethereum address'); + } +} + +export class InvalidStringError extends InvalidValueError { + public code = ERR_INVALID_STRING; + + public constructor(value: unknown) { + super(value, 'not a valid string'); + } +} + +export class InvalidUnitError extends InvalidValueError { + public code = ERR_INVALID_UNIT; + + public constructor(value: unknown) { + super(value, 'invalid unit'); + } +} + +export class HexProcessingError extends InvalidValueError { + public code = ERR_INVALID_HEX; + + public constructor(value: unknown) { + super(value, 'can not be converted to hex'); + } +} + +export class NibbleWidthError extends InvalidValueError { + public code = ERR_INVALID_NIBBLE_WIDTH; + + public constructor(value: string) { + super(value, 'value greater than the nibble width'); + } +} + +export class InvalidTypeError extends InvalidValueError { + public code = ERR_INVALID_TYPE; + + public constructor(value: unknown) { + super(value, 'invalid type, type not supported'); + } +} + +export class InvalidBooleanError extends InvalidValueError { + public code = ERR_INVALID_BOOLEAN; + + public constructor(value: unknown) { + super(value, 'not a valid boolean.'); + } +} + +export class InvalidUnsignedIntegerError extends InvalidValueError { + public code = ERR_INVALID_UNSIGNED_INTEGER; + + public constructor(value: unknown) { + super(value, 'not a valid unsigned integer.'); + } +} + +export class InvalidSizeError extends InvalidValueError { + public code = ERR_INVALID_SIZE; + + public constructor(value: unknown) { + super(value, 'invalid size given.'); + } +} + +export class InvalidLargeValueError extends InvalidValueError { + public code = ERR_INVALID_LARGE_VALUE; + + public constructor(value: unknown) { + super(value, 'value is larger than size.'); + } +} + +export class InvalidBlockError extends InvalidValueError { + public code = ERR_INVALID_BLOCK; + + public constructor(value: string) { + super(value, 'invalid string given'); + } +} + +export class InvalidTypeAbiInputError extends InvalidValueError { + public code = ERR_INVALID_TYPE_ABI; + + public constructor(value: string) { + super(value, 'components found but type is not tuple'); + } +} diff --git a/packages/web3-errors/src/index.ts b/packages/web3-errors/src/index.ts new file mode 100644 index 00000000000..2e4ef7abca6 --- /dev/null +++ b/packages/web3-errors/src/index.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './error_codes.js'; +export * from './web3_error_base.js'; +export * from './errors/account_errors.js'; +export * from './errors/connection_errors.js'; +export * from './errors/contract_errors.js'; +export * from './errors/ens_errors.js'; +export * from './errors/generic_errors.js'; +export * from './errors/provider_errors.js'; +export * from './errors/signature_errors.js'; +export * from './errors/transaction_errors.js'; +export * from './errors/utils_errors.js'; +export * from './errors/response_errors.js'; +export * from './errors/core_errors.js'; +export * from './errors/rpc_errors.js'; +export * from './errors/rpc_error_messages.js'; +export * from './errors/schema_errors.js'; \ No newline at end of file diff --git a/packages/web3-errors/src/web3_error_base.ts b/packages/web3-errors/src/web3_error_base.ts new file mode 100644 index 00000000000..40e96c3eda6 --- /dev/null +++ b/packages/web3-errors/src/web3_error_base.ts @@ -0,0 +1,120 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable max-classes-per-file */ + +import { Web3Error } from 'web3-types'; +import { ERR_MULTIPLE_ERRORS } from './error_codes.js'; + +/** + * Base class for Web3 errors. + */ +export abstract class BaseWeb3Error extends Error implements Web3Error { + public readonly name: string; + public abstract readonly code: number; + public stack: string | undefined; + + public cause: Error | undefined; + + /** + * @deprecated Use the `cause` property instead. + */ + public get innerError(): Error | Error[] | undefined { + // eslint-disable-next-line no-use-before-define + if (this.cause instanceof MultipleErrors) { + return this.cause.errors; + } + return this.cause; + } + /** + * @deprecated Use the `cause` property instead. + */ + public set innerError(cause: Error | Error[] | undefined) { + if (Array.isArray(cause)) { + // eslint-disable-next-line no-use-before-define + this.cause = new MultipleErrors(cause); + } else { + this.cause = cause; + } + } + + public constructor(msg?: string, cause?: Error | Error[]) { + super(msg); + + if (Array.isArray(cause)) { + // eslint-disable-next-line no-use-before-define + this.cause = new MultipleErrors(cause); + } else { + this.cause = cause; + } + + this.name = this.constructor.name; + + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(new.target.constructor); + } else { + this.stack = new Error().stack; + } + } + + public static convertToString(value: unknown, unquotValue = false) { + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + if (value === null || value === undefined) return 'undefined'; + + const result = JSON.stringify( + value, + (_, v) => (typeof v === 'bigint' ? v.toString() : v) as unknown, + ); + + return unquotValue && ['bigint', 'string'].includes(typeof value) + ? result.replace(/['\\"]+/g, '') + : result; + } + + public toJSON() { + return { + name: this.name, + code: this.code, + message: this.message, + cause: this.cause, + // deprecated + innerError: this.cause, + }; + } +} + +export class MultipleErrors extends BaseWeb3Error { + public code = ERR_MULTIPLE_ERRORS; + public errors: Error[]; + + public constructor(errors: Error[]) { + super(`Multiple errors occurred: [${errors.map(e => e.message).join('], [')}]`); + this.errors = errors; + } +} + +export abstract class InvalidValueError extends BaseWeb3Error { + public readonly name: string; + + public constructor(value: unknown, msg: string) { + super( + `Invalid value given "${BaseWeb3Error.convertToString(value, true)}". Error: ${msg}.`, + ); + this.name = this.constructor.name; + } +} diff --git a/packages/web3-errors/test/.eslintrc.js b/packages/web3-errors/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-errors/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-errors/test/config/jest.config.js b/packages/web3-errors/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-errors/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-errors/test/config/setup.js b/packages/web3-errors/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-errors/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-errors/test/fixtures/accounts.json b/packages/web3-errors/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-errors/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-errors/test/fixtures/errors.ts b/packages/web3-errors/test/fixtures/errors.ts new file mode 100644 index 00000000000..10fb6893788 --- /dev/null +++ b/packages/web3-errors/test/fixtures/errors.ts @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const ConvertValueToString: [unknown, string][] = [ + [BigInt(9007199254740991), '9007199254740991'], + ['Invalid data', 'Invalid data'], + ['0x0', '0x0'], + [0, '0'], + [{ title: 'testObj', id: 1 }, '{"title":"testObj","id":1}'], +]; diff --git a/packages/web3-errors/test/integration/jest.config.js b/packages/web3-errors/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-errors/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-errors/test/integration/setup.js b/packages/web3-errors/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-errors/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-errors/test/tsconfig.json b/packages/web3-errors/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-errors/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-errors/test/unit/__snapshots__/errors.test.ts.snap b/packages/web3-errors/test/unit/__snapshots__/errors.test.ts.snap new file mode 100644 index 00000000000..2eefbaa0814 --- /dev/null +++ b/packages/web3-errors/test/unit/__snapshots__/errors.test.ts.snap @@ -0,0 +1,454 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`errors ConnectionCloseError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 504, + "errorCode": 10, + "errorReason": "reason", + "innerError": undefined, + "message": "CONNECTION ERROR: The connection got closed with the close code 10 and the following reason string reason", + "name": "ConnectionCloseError", +} +`; + +exports[`errors ConnectionError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 500, + "errorCode": 10, + "errorReason": "reason", + "innerError": undefined, + "message": "error message", + "name": "ConnectionError", +} +`; + +exports[`errors ConnectionNotOpenError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 503, + "errorCode": 10, + "errorReason": "reason", + "innerError": undefined, + "message": "Connection not open", + "name": "ConnectionNotOpenError", +} +`; + +exports[`errors ConnectionTimeoutError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 502, + "duration": 5000, + "errorCode": undefined, + "errorReason": undefined, + "innerError": undefined, + "message": "CONNECTION TIMEOUT: timeout of 5000ms achieved", + "name": "ConnectionTimeoutError", +} +`; + +exports[`errors ContractCodeNotStoredError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 404, + "innerError": undefined, + "message": "The contract code couldn't be stored, please check your gas limit.", + "name": "ContractCodeNotStoredError", + "receipt": { + "attr1": "attr1", + }, +} +`; + +exports[`errors ContractEventDoesNotExistError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 304, + "eventName": "eventName", + "innerError": undefined, + "message": "Event "eventName" doesn't exist in this contract.", + "name": "ContractEventDoesNotExistError", +} +`; + +exports[`errors ContractMissingABIError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 302, + "innerError": undefined, + "message": "You must provide the json interface of the contract when instantiating a contract object.", + "name": "ContractMissingABIError", +} +`; + +exports[`errors ContractMissingDeployDataError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 306, + "innerError": undefined, + "message": "No "data" specified in neither the given options, nor the default options.", + "name": "ContractMissingDeployDataError", +} +`; + +exports[`errors ContractNoAddressDefinedError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 307, + "innerError": undefined, + "message": "This contract object doesn't have address set yet, please set an address first.", + "name": "ContractNoAddressDefinedError", +} +`; + +exports[`errors ContractNoFromAddressDefinedError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 308, + "innerError": undefined, + "message": "No "from" address specified in neither the given options, nor the default options.", + "name": "ContractNoFromAddressDefinedError", +} +`; + +exports[`errors ContractOnceRequiresCallbackError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 303, + "innerError": undefined, + "message": "Once requires a callback as the second parameter.", + "name": "ContractOnceRequiresCallbackError", +} +`; + +exports[`errors ContractReservedEventError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 305, + "innerError": undefined, + "message": "Event "type" doesn't exist in this contract.", + "name": "ContractReservedEventError", + "type": "type", +} +`; + +exports[`errors Eip838ExecutionError should get the data from error.data.data 1`] = ` +{ + "cause": [Eip838ExecutionError: Error], + "code": undefined, + "data": "0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000", + "innerError": [Eip838ExecutionError: Error], + "message": "Error", + "name": "Eip838ExecutionError", +} +`; + +exports[`errors Eip838ExecutionError should get the data from error.data.originalError.data 1`] = ` +{ + "cause": [Eip838ExecutionError: Error], + "code": undefined, + "data": "0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000", + "innerError": [Eip838ExecutionError: Error], + "message": "Error", + "name": "Eip838ExecutionError", +} +`; + +exports[`errors InvalidConnectionError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 501, + "errorCode": 10, + "errorReason": "reason", + "host": "my host", + "innerError": undefined, + "message": "CONNECTION ERROR: Couldn't connect to node my host.", + "name": "InvalidConnectionError", +} +`; + +exports[`errors InvalidNumberOfParamsError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 200, + "expected": 20, + "got": 10, + "innerError": undefined, + "message": "Invalid number of parameters for "method". Got "10" expected "20"!", + "method": "method", + "name": "InvalidNumberOfParamsError", +} +`; + +exports[`errors InvalidPropertiesForTransactionTypeError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 439, + "innerError": undefined, + "message": "The following properties are invalid for the transaction type 0x0: property", + "name": "InvalidPropertiesForTransactionTypeError", +} +`; + +exports[`errors InvalidProviderError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 601, + "innerError": undefined, + "message": "Provider with url "my url" is not set or invalid", + "name": "InvalidProviderError", +} +`; + +exports[`errors InvalidResponseError should have valid json structure 1`] = ` +{ + "cause": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "code": 101, + "data": { + "a": "10", + "b": "20", + }, + "innerError": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "message": "Returned error: error message", + "name": "InvalidResponseError", + "request": undefined, +} +`; + +exports[`errors MaxAttemptsReachedOnReconnectingError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 505, + "errorCode": undefined, + "errorReason": undefined, + "innerError": undefined, + "message": "Maximum number of reconnect attempts reached! (5)", + "name": "MaxAttemptsReachedOnReconnectingError", +} +`; + +exports[`errors NoContractAddressFoundError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 403, + "innerError": undefined, + "message": "The transaction receipt didn't contain a contract address.", + "name": "NoContractAddressFoundError", + "receipt": { + "attr1": "attr1", + }, +} +`; + +exports[`errors PendingRequestsOnReconnectingError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 506, + "errorCode": undefined, + "errorReason": undefined, + "innerError": undefined, + "message": "CONNECTION ERROR: Provider started to reconnect before the response got received!", + "name": "PendingRequestsOnReconnectingError", +} +`; + +exports[`errors ResolverMethodMissingError should have valid json structure 1`] = ` +{ + "address": "address", + "cause": undefined, + "code": 301, + "innerError": undefined, + "message": "The resolver at address does not implement requested method: "name".", + "name": "name", +} +`; + +exports[`errors ResponseError should have valid json structure with data 1`] = ` +{ + "cause": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "code": 100, + "data": { + "a": "10", + "b": "20", + }, + "innerError": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "message": "Returned error: error message", + "name": "ResponseError", + "request": undefined, +} +`; + +exports[`errors ResponseError should have valid json structure without data 1`] = ` +{ + "cause": { + "code": 123, + "data": undefined, + "message": "error message", + }, + "code": 100, + "data": undefined, + "innerError": { + "code": 123, + "data": undefined, + "message": "error message", + }, + "message": "Returned error: error message", + "name": "ResponseError", + "request": undefined, +} +`; + +exports[`errors ResponseError should include the array of inner errors 1`] = ` +{ + "cause": [MultipleErrors: Multiple errors occurred: [error message], [error message]], + "code": 100, + "data": [ + { + "a": "10", + "b": "20", + }, + { + "c": "30", + "d": "40", + }, + ], + "innerError": [MultipleErrors: Multiple errors occurred: [error message], [error message]], + "message": "Returned error: error message,error message", + "name": "ResponseError", + "request": undefined, +} +`; + +exports[`errors RevertInstructionError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 401, + "innerError": undefined, + "message": "Your request got reverted with the following reason string: message", + "name": "RevertInstructionError", + "reason": "message", + "signature": "signature", +} +`; + +exports[`errors SchemaFormatError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 1200, + "innerError": undefined, + "message": "Format for the type unsupported is unsupported", + "name": "SchemaFormatError", + "type": "unsupported", +} +`; + +exports[`errors TransactionError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 400, + "innerError": undefined, + "message": "message", + "name": "TransactionError", + "receipt": { + "attr1": "attr1", + }, +} +`; + +exports[`errors TransactionOutOfGasError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 406, + "innerError": undefined, + "message": "Transaction ran out of gas. Please provide more gas: + { + "attr1": "attr1" +}", + "name": "TransactionOutOfGasError", + "receipt": { + "attr1": "attr1", + }, +} +`; + +exports[`errors TransactionRevertInstructionError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 402, + "data": undefined, + "innerError": undefined, + "message": "Transaction has been reverted by the EVM: + {"attr1":"attr1"}", + "name": "TransactionRevertInstructionError", + "reason": "message", + "receipt": { + "attr1": "attr1", + }, + "signature": "signature", +} +`; + +exports[`errors TransactionRevertWithCustomError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 438, + "customErrorArguments": { + "customErrorArgument": "customErrorArgument", + }, + "customErrorDecodedSignature": "customErrorDecodedSignature", + "customErrorName": "customErrorName", + "data": "data", + "innerError": undefined, + "message": "Transaction has been reverted by the EVM", + "name": "TransactionRevertWithCustomError", + "reason": "reason", + "receipt": { + "attr1": "attr1", + }, + "signature": "signature", +} +`; + +exports[`errors TransactionRevertedWithoutReasonError should have valid json structure 1`] = ` +{ + "cause": undefined, + "code": 405, + "innerError": undefined, + "message": "Transaction has been reverted by the EVM: + {"attr1":"attr1"}", + "name": "TransactionRevertedWithoutReasonError", + "receipt": { + "attr1": "attr1", + }, +} +`; diff --git a/packages/web3-errors/test/unit/__snapshots__/rpc-errors.test.ts.snap b/packages/web3-errors/test/unit/__snapshots__/rpc-errors.test.ts.snap new file mode 100644 index 00000000000..aea9bbf4c90 --- /dev/null +++ b/packages/web3-errors/test/unit/__snapshots__/rpc-errors.test.ts.snap @@ -0,0 +1,311 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`rpc errors EIP1193ProviderRpcError test constructor with a known code (1000) 1`] = ` +{ + "cause": undefined, + "code": 1000, + "innerError": undefined, + "message": "The connection successfully completed the purpose for which it was created.", + "name": "EIP1193ProviderRpcError", +} +`; + +exports[`rpc errors EIP1193ProviderRpcError test constructor with no code 1`] = ` +{ + "cause": undefined, + "code": undefined, + "innerError": undefined, + "message": "", + "name": "EIP1193ProviderRpcError", +} +`; + +exports[`rpc errors EIP1193ProviderRpcError test constructor with un registered code 1`] = ` +{ + "cause": undefined, + "code": 99999, + "innerError": undefined, + "message": "An Rpc error has occured with a code of 99999", + "name": "EIP1193ProviderRpcError", +} +`; + +exports[`rpc errors InternalError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32603, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Internal error", + "name": "InternalError", +} +`; + +exports[`rpc errors InvalidInputError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32000, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Invalid input", + "name": "InvalidInputError", +} +`; + +exports[`rpc errors InvalidParamsError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32602, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Invalid params", + "name": "InvalidParamsError", +} +`; + +exports[`rpc errors InvalidRequestError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32600, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Invalid request", + "name": "InvalidRequestError", +} +`; + +exports[`rpc errors LimitExceededError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32005, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Limit exceeded", + "name": "LimitExceededError", +} +`; + +exports[`rpc errors MethodNotFoundError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32601, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Method not found", + "name": "MethodNotFoundError", +} +`; + +exports[`rpc errors MethodNotSupported test constructor 1`] = ` +{ + "cause": undefined, + "code": -32004, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Method not supported", + "name": "MethodNotSupported", +} +`; + +exports[`rpc errors ParseError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32700, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Parse error", + "name": "ParseError", +} +`; + +exports[`rpc errors ResourceUnavailableError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32002, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Resource unavailable", + "name": "ResourceUnavailableError", +} +`; + +exports[`rpc errors ResourcesNotFoundError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32001, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Resource not found", + "name": "ResourcesNotFoundError", +} +`; + +exports[`rpc errors TransactionRejectedError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32003, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "Transaction rejected", + "name": "TransactionRejectedError", +} +`; + +exports[`rpc errors VersionNotSupportedError test constructor 1`] = ` +{ + "cause": undefined, + "code": -32006, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "JSON-RPC version not supported", + "name": "VersionNotSupportedError", +} +`; + +exports[`rpc errors rpcErrors.RpcError test constructor 1`] = ` +{ + "cause": undefined, + "code": 123, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "An Rpc error has occured with a code of 123", + "name": "RpcError", +} +`; + +exports[`rpc errors rpcErrors.RpcError test constructor with custom message 1`] = ` +{ + "cause": undefined, + "code": 123, + "error": { + "code": 123, + "data": { + "a": "10", + "b": "20", + }, + "message": "error message", + }, + "id": 1, + "innerError": undefined, + "jsonRpc": "2.0", + "message": "some message", + "name": "RpcError", +} +`; diff --git a/packages/web3-errors/test/unit/base-web3-error.test.ts b/packages/web3-errors/test/unit/base-web3-error.test.ts new file mode 100644 index 00000000000..dad318f30df --- /dev/null +++ b/packages/web3-errors/test/unit/base-web3-error.test.ts @@ -0,0 +1,50 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { BaseWeb3Error, MultipleErrors } from '../../src/web3_error_base'; + +class CustomError extends BaseWeb3Error { + public code = 0; +} +describe('BaseWeb3Error', () => { + it('innerError is readable from cause', () => { + const error = new CustomError('outer error'); + const innerError = new Error('inner error'); + error.cause = innerError; + // eslint-disable-next-line deprecation/deprecation + expect(error.innerError).toBe(innerError); + }); + it('case is set from innerError', () => { + const error = new CustomError('outer error'); + const cause = new Error('inner error'); + // eslint-disable-next-line deprecation/deprecation + error.innerError = cause; + expect(error.cause).toBe(cause); + }); + it('case is set from innerError array', () => { + const error = new CustomError('outer error'); + const innerErrors = [new Error('inner error1'), new Error('inner error2')]; + // eslint-disable-next-line deprecation/deprecation + error.innerError = innerErrors; + expect((error.cause as MultipleErrors).errors).toBe(innerErrors); + }); + it('case is set from array of errors at the constructor', () => { + const innerErrors = [new Error('inner error1'), new Error('inner error2')]; + const error = new CustomError('outer error', innerErrors); + expect((error.cause as MultipleErrors).errors).toBe(innerErrors); + }); +}); diff --git a/packages/web3-errors/test/unit/errors.test.ts b/packages/web3-errors/test/unit/errors.test.ts new file mode 100644 index 00000000000..7428cc9b6b3 --- /dev/null +++ b/packages/web3-errors/test/unit/errors.test.ts @@ -0,0 +1,393 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { JsonRpcError } from 'web3-types'; +import * as accountErrors from '../../src/errors/account_errors'; +import * as connectionErrors from '../../src/errors/connection_errors'; +import * as contractErrors from '../../src/errors/contract_errors'; +import * as ensErrors from '../../src/errors/ens_errors'; +import * as genericErrors from '../../src/errors/generic_errors'; +import * as providerErrors from '../../src/errors/provider_errors'; +import * as signatureErrors from '../../src/errors/signature_errors'; +import * as transactionErrors from '../../src/errors/transaction_errors'; +import * as utilsErrors from '../../src/errors/utils_errors'; +import * as responseErrors from '../../src/errors/response_errors'; +import * as schemaErrors from '../../src/errors/schema_errors'; + +import { ConvertValueToString } from '../fixtures/errors'; +import { BaseWeb3Error } from '../../src/web3_error_base'; + +describe('errors', () => { + describe('error convertToString', () => { + it.each(ConvertValueToString)('%s', (input, output) => { + expect(BaseWeb3Error.convertToString(input, true)).toEqual(output); + }); + }); + + it('should have unique codes for each error', () => { + const errorCodes: number[] = []; + + for (const ErrorClass of Object.values({ + ...accountErrors, + ...connectionErrors, + ...contractErrors, + ...ensErrors, + ...genericErrors, + ...providerErrors, + ...signatureErrors, + ...transactionErrors, + ...utilsErrors, + ...schemaErrors, + })) { + if (ErrorClass === transactionErrors.InvalidPropertiesForTransactionTypeError) break; + // To disable error for the abstract class + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + const err = new ErrorClass({} as never, {} as never, {} as never, {} as never); + errorCodes.push(err.code); + } + + expect(errorCodes.filter((x, y) => errorCodes.indexOf(x) === y)).toHaveLength( + errorCodes.length, + ); + }); + + describe('InvalidNumberOfParamsError', () => { + it('should have valid json structure', () => { + const got = 10; + const expected = 20; + + expect( + new genericErrors.InvalidNumberOfParamsError(got, expected, 'method').toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ConnectionError', () => { + it('should have valid json structure', () => { + expect( + new connectionErrors.ConnectionError('error message', { + code: 10, + reason: 'reason', + }).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('InvalidConnectionError', () => { + it('should have valid json structure', () => { + expect( + new connectionErrors.InvalidConnectionError('my host', { + code: 10, + reason: 'reason', + }).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ConnectionTimeoutError', () => { + it('should have valid json structure', () => { + const timeoutValue = 5000; + + expect( + new connectionErrors.ConnectionTimeoutError(timeoutValue).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ConnectionNotOpenError', () => { + it('should have valid json structure', () => { + expect( + new connectionErrors.ConnectionNotOpenError({ + code: 10, + reason: 'reason', + }).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ConnectionCloseError', () => { + it('should have valid json structure', () => { + expect( + new connectionErrors.ConnectionCloseError({ code: 10, reason: 'reason' }).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('MaxAttemptsReachedOnReconnectingError', () => { + it('should have valid json structure', () => { + expect( + new connectionErrors.MaxAttemptsReachedOnReconnectingError(5).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('PendingRequestsOnReconnectingError', () => { + it('should have valid json structure', () => { + expect( + new connectionErrors.PendingRequestsOnReconnectingError().toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('InvalidProviderError', () => { + it('should have valid json structure', () => { + expect(new providerErrors.InvalidProviderError('my url').toJSON()).toMatchSnapshot(); + }); + }); + + describe('TransactionError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.TransactionError('message', { attr1: 'attr1' }).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('RevertInstructionError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.RevertInstructionError('message', 'signature').toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('TransactionRevertInstructionError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.TransactionRevertInstructionError('message', 'signature', { + attr1: 'attr1', + } as any).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('TransactionRevertWithCustomError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.TransactionRevertWithCustomError( + 'reason', + 'customErrorName', + 'customErrorDecodedSignature', + { customErrorArgument: 'customErrorArgument' }, + 'signature', + { + attr1: 'attr1', + } as any, + 'data', + ).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('InvalidPropertiesForTransactionTypeError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.InvalidPropertiesForTransactionTypeError( + [ + { + keyword: 'property', + instancePath: '', + schemaPath: '', + params: {}, + }, + ], + '0x0', + ).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('NoContractAddressFoundError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.NoContractAddressFoundError({ + attr1: 'attr1', + } as any).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ContractCodeNotStoredError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.ContractCodeNotStoredError({ + attr1: 'attr1', + } as any).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('TransactionRevertedWithoutReasonError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.TransactionRevertedWithoutReasonError({ + attr1: 'attr1', + } as any).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('TransactionOutOfGasError', () => { + it('should have valid json structure', () => { + expect( + new transactionErrors.TransactionOutOfGasError({ attr1: 'attr1' } as any).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ResolverMethodMissingError', () => { + it('should have valid json structure', () => { + expect( + new contractErrors.ResolverMethodMissingError('address', 'name').toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ContractMissingABIError', () => { + it('should have valid json structure', () => { + expect(new contractErrors.ContractMissingABIError().toJSON()).toMatchSnapshot(); + }); + }); + + describe('ContractOnceRequiresCallbackError', () => { + it('should have valid json structure', () => { + expect( + new contractErrors.ContractOnceRequiresCallbackError().toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ContractEventDoesNotExistError', () => { + it('should have valid json structure', () => { + expect( + new contractErrors.ContractEventDoesNotExistError('eventName').toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ContractReservedEventError', () => { + it('should have valid json structure', () => { + expect( + new contractErrors.ContractReservedEventError('type').toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ContractMissingDeployDataError', () => { + it('should have valid json structure', () => { + expect(new contractErrors.ContractMissingDeployDataError().toJSON()).toMatchSnapshot(); + }); + }); + + describe('ContractNoAddressDefinedError', () => { + it('should have valid json structure', () => { + expect(new contractErrors.ContractNoAddressDefinedError().toJSON()).toMatchSnapshot(); + }); + }); + + describe('ContractNoFromAddressDefinedError', () => { + it('should have valid json structure', () => { + expect( + new contractErrors.ContractNoFromAddressDefinedError().toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('Eip838ExecutionError', () => { + it('should get the data from error.data.data', () => { + expect( + new contractErrors.Eip838ExecutionError({ + data: { + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + }, + } as JsonRpcError).toJSON(), + ).toMatchSnapshot(); + }); + it('should get the data from error.data.originalError.data', () => { + expect( + new contractErrors.Eip838ExecutionError({ + data: { + originalError: { + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + }, + }, + } as JsonRpcError).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ResponseError', () => { + it('should have valid json structure with data', () => { + expect( + new responseErrors.ResponseError({ + id: 1, + jsonrpc: '2.0', + error: { code: 123, message: 'error message', data: { a: '10', b: '20' } }, + }).toJSON(), + ).toMatchSnapshot(); + }); + + it('should have valid json structure without data', () => { + expect( + new responseErrors.ResponseError({ + id: 1, + jsonrpc: '2.0', + error: { code: 123, message: 'error message', data: undefined }, + }).toJSON(), + ).toMatchSnapshot(); + }); + + it('should include the array of inner errors', () => { + expect( + new responseErrors.ResponseError([ + { + id: 1, + jsonrpc: '2.0', + error: { code: 123, message: 'error message', data: { a: '10', b: '20' } }, + }, + { + id: 2, + jsonrpc: '2.0', + error: { code: 124, message: 'error message', data: { c: '30', d: '40' } }, + }, + ]).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('InvalidResponseError', () => { + it('should have valid json structure', () => { + expect( + new responseErrors.InvalidResponseError({ + id: 1, + jsonrpc: '2.0', + error: { code: 123, message: 'error message', data: { a: '10', b: '20' } }, + }).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('SchemaFormatError', () => { + it('should have valid json structure', () => { + expect( + new schemaErrors.SchemaFormatError("unsupported" + ).toJSON(), + ).toMatchSnapshot(); + }); + }); +}); diff --git a/packages/web3-errors/test/unit/jest.config.js b/packages/web3-errors/test/unit/jest.config.js new file mode 100644 index 00000000000..ba9d5b9b33c --- /dev/null +++ b/packages/web3-errors/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-errors-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-errors/test/unit/rpc-errors.test.ts b/packages/web3-errors/test/unit/rpc-errors.test.ts new file mode 100644 index 00000000000..584b9397216 --- /dev/null +++ b/packages/web3-errors/test/unit/rpc-errors.test.ts @@ -0,0 +1,149 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { JsonRpcIdentifier } from 'web3-types'; + +import * as rpcErrors from '../../src/errors/rpc_errors'; +import { RpcErrorMessages } from '../../src/errors/rpc_error_messages'; + +const rpcReturnedError = { + id: 1, + jsonrpc: '2.0' as JsonRpcIdentifier, + error: { code: 123, message: 'error message', data: { a: '10', b: '20' } }, +}; + +describe('rpc errors', () => { + describe('rpcErrorsMap', () => { + it('child RpcError classes should be also mapped inside `rpcErrorsMap`', () => { + expect( + Object.values(rpcErrors).filter( + err => + (err as any).prototype?.constructor?.prototype instanceof + rpcErrors.RpcError, + ), + ).toHaveLength(rpcErrors.rpcErrorsMap.size); + }); + }); + + describe('rpcErrors.RpcError', () => { + it('test constructor', () => { + expect(new rpcErrors.RpcError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + it('test constructor with custom message', () => { + expect( + new rpcErrors.RpcError(rpcReturnedError, `some message`).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('EIP1193ProviderRpcError', () => { + it('test constructor with no code', () => { + expect( + new rpcErrors.EIP1193ProviderRpcError(undefined as unknown as number).toJSON(), + ).toMatchSnapshot(); + }); + it('test constructor with a known code (1000)', () => { + const code = 1000; + const error = new rpcErrors.EIP1193ProviderRpcError(code); + expect(error.toJSON()).toMatchSnapshot(); + expect(error.message).toEqual(RpcErrorMessages[code].message); + }); + it('test constructor with un registered code', () => { + expect(new rpcErrors.EIP1193ProviderRpcError(99999).toJSON()).toMatchSnapshot(); + }); + }); + + describe('ParseError', () => { + it('test constructor', () => { + expect(new rpcErrors.ParseError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); + + describe('InvalidRequestError', () => { + it('test constructor', () => { + expect(new rpcErrors.InvalidRequestError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); + + describe('MethodNotFoundError', () => { + it('test constructor', () => { + expect(new rpcErrors.MethodNotFoundError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); + + describe('InvalidParamsError', () => { + it('test constructor', () => { + expect(new rpcErrors.InvalidParamsError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); + + describe('InternalError', () => { + it('test constructor', () => { + expect(new rpcErrors.InternalError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); + + describe('InvalidInputError', () => { + it('test constructor', () => { + expect(new rpcErrors.InvalidInputError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); + + describe('MethodNotSupported', () => { + it('test constructor', () => { + expect(new rpcErrors.MethodNotSupported(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); + + describe('ResourceUnavailableError', () => { + it('test constructor', () => { + expect( + new rpcErrors.ResourceUnavailableError(rpcReturnedError).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('ResourcesNotFoundError', () => { + it('test constructor', () => { + expect( + new rpcErrors.ResourcesNotFoundError(rpcReturnedError).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('VersionNotSupportedError', () => { + it('test constructor', () => { + expect( + new rpcErrors.VersionNotSupportedError(rpcReturnedError).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('TransactionRejectedError', () => { + it('test constructor', () => { + expect( + new rpcErrors.TransactionRejectedError(rpcReturnedError).toJSON(), + ).toMatchSnapshot(); + }); + }); + + describe('LimitExceededError', () => { + it('test constructor', () => { + expect(new rpcErrors.LimitExceededError(rpcReturnedError).toJSON()).toMatchSnapshot(); + }); + }); +}); diff --git a/packages/web3-errors/tsconfig.cjs.json b/packages/web3-errors/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-errors/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-errors/tsconfig.esm.json b/packages/web3-errors/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-errors/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-errors/tsconfig.types.json b/packages/web3-errors/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-errors/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-errors/tsdoc.json b/packages/web3-errors/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-errors/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth-abi/.eslintignore b/packages/web3-eth-abi/.eslintignore new file mode 100644 index 00000000000..e3d7e665285 --- /dev/null +++ b/packages/web3-eth-abi/.eslintignore @@ -0,0 +1,4 @@ +dist +lib +jest.config.js +.eslintrc.js diff --git a/packages/web3-eth-abi/.eslintrc.js b/packages/web3-eth-abi/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-eth-abi/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-abi/.gitignore b/packages/web3-eth-abi/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-eth-abi/.npmignore b/packages/web3-eth-abi/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-eth-abi/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-eth-abi/.prettierignore b/packages/web3-eth-abi/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-eth-abi/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-abi/.prettierrc.json b/packages/web3-eth-abi/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-eth-abi/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-eth-abi/CHANGELOG.md b/packages/web3-eth-abi/CHANGELOG.md new file mode 100644 index 00000000000..6fa52af5287 --- /dev/null +++ b/packages/web3-eth-abi/CHANGELOG.md @@ -0,0 +1,167 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Added + +- If an error happens when decoding a value, preserve that exception at `innerError` inside the error class `AbiError`. (#5435) +- Add basic functionality that is used, by `web3-eth-contract`, when decoding error data according to EIP-838. (#5434) + +### Fixed + +- Return `BigInt` instead of `string` when decoding function parameters for large numbers, such as `uint256`. (#5435) + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +### Fixed + +- Fix `ContractMethodOutputParameters` type to support output object types by index and string key. Also, it returns void if ABI doesn't have outputs and returns exactly one type if the output array has only one element. (#5631) + +## [4.0.1-alpha.3] + +### Fixed + +- Parameters decoding error for nested components (#5714) + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +## [4.0.1-rc.0] + +### Removed + +- Moved all types and interfaces to `web3-types` (#5771) + +### Added + +- `decodeErrorData` from `web3-eth-contract` is now exported from this package and was renamed to `decodeContractErrorData` (#5844) + +## [4.0.1-rc.1] + +### Added + +- Added hybrid build (ESM and CJS) of library (#5904) +- Added source files (#5956) + +### Removed + +- Removed `formatDecodedObject` function (#5934) + +## [4.0.1-rc.2] + +### Changed + +- Nested Smart Contract error data hex string is decoded when the error contains the data as object (when the data hex string is inside data.originalError.data or data.data) (#6045) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Fixed + +- Support for "decoding" indexed string event arguments (returns the keccak256 hash of the string value instead of the actual string value) (#6167) + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.1.0] + +### Added + +- A `getEncodedEip712Data` method that takes an EIP-712 typed data object and returns the encoded data with the option to also keccak256 hash it (#6286) + +## [4.1.1] + +### Changed + +- Dependencies updated + +## [4.1.2] + +### Changed + +- Dependencies updated + +## [4.1.3] + +### Fixed + +- Fix issue with default config with babel (and React): "TypeError: Cannot convert a BigInt value to a number #6187" (#6506) + +## [4.1.4] + +### Fixed + +- Bug fix of `ERR_UNSUPPORTED_DIR_IMPORT` in ABI (#6535) + +## [4.2.0] + +### Changed + +- Use `AbiError` instead of `Error` for errors at web3-eth-abi (#6641). + +### Fixed + +- Fixed an issue with detecting Uint8Array (#6486) + +## [Unreleased] diff --git a/packages/web3-eth-abi/README.md b/packages/web3-eth-abi/README.md index 46deccdc39b..bbeb96bf2c4 100644 --- a/packages/web3-eth-abi/README.md +++ b/packages/web3-eth-abi/README.md @@ -1,39 +1,59 @@ -# web3-eth-abi +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Web3-Eth-Abi -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This is the abi package used in the `web3-eth` package. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-eth-abi` contains functions for the encode and decode EVM in/output. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-eth-abi) or using [Yarn](https://yarnpkg.com/package/web3-eth-abi) + +### Using NPM ```bash npm install web3-eth-abi ``` -## Usage +### Using Yarn -```js -const Web3EthAbi = require('web3-eth-abi'); - -Web3EthAbi.encodeFunctionSignature('myMethod(uint256,string)'); -> '0x24ee0097' +```bash +yarn add web3-eth-abi ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-eth-abi.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-eth-abi +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-abi%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-eth-abi -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-eth-abi -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-eth-abi -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-eth-abi -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-eth-abi +[downloads-image]: https://img.shields.io/npm/dm/web3-eth-abi?label=npm%20downloads diff --git a/packages/web3-eth-abi/assets/logo/web3js.ai b/packages/web3-eth-abi/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth-abi/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth-abi/assets/logo/web3js.jpg b/packages/web3-eth-abi/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth-abi/assets/logo/web3js.jpg differ diff --git a/packages/web3-eth-abi/assets/logo/web3js.svg b/packages/web3-eth-abi/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth-abi/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth-abi/package-lock.json b/packages/web3-eth-abi/package-lock.json deleted file mode 100644 index e374fb36bf6..00000000000 --- a/packages/web3-eth-abi/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-eth-abi", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-eth-abi/package.json b/packages/web3-eth-abi/package.json index 34715a32424..47802dc53c1 100644 --- a/packages/web3-eth-abi/package.json +++ b/packages/web3-eth-abi/package.json @@ -1,25 +1,68 @@ { - "name": "web3-eth-abi", - "version": "1.3.0", - "description": "Web3 module encode and decode EVM in/output.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth-abi", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "@ethersproject/abi": "5.0.7", - "underscore": "1.9.1", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-eth-abi", + "version": "4.2.0", + "description": "Web3 module encode and decode EVM in/output.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ethereum/web3.js/tree/4.x/packages/web3-eth-abi", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "dependencies": { + "abitype": "0.7.1", + "web3-errors": "^1.1.4", + "web3-types": "^1.3.1", + "web3-utils": "^4.1.1", + "web3-validator": "^2.0.4" + }, + "devDependencies": { + "@humeris/espresso-shot": "^4.0.0", + "@types/jest": "^28.1.6", + "@types/jest-when": "^3.5.2", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "jest-when": "^3.5.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + } } diff --git a/packages/web3-eth-abi/src/api/errors_api.ts b/packages/web3-eth-abi/src/api/errors_api.ts new file mode 100644 index 00000000000..69933f5eb6e --- /dev/null +++ b/packages/web3-eth-abi/src/api/errors_api.ts @@ -0,0 +1,45 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * + * @module ABI + */ + +import { sha3Raw } from 'web3-utils'; +import { AbiError } from 'web3-errors'; +import { AbiErrorFragment } from 'web3-types'; +import { jsonInterfaceMethodToString, isAbiErrorFragment } from '../utils.js'; + +/** + * Encodes the error name to its ABI signature, which are the sha3 hash of the error name including input types. + */ +export const encodeErrorSignature = (functionName: string | AbiErrorFragment): string => { + if (typeof functionName !== 'string' && !isAbiErrorFragment(functionName)) { + throw new AbiError('Invalid parameter value in encodeErrorSignature'); + } + + let name: string; + + if (functionName && (typeof functionName === 'function' || typeof functionName === 'object')) { + name = jsonInterfaceMethodToString(functionName); + } else { + name = functionName; + } + + return sha3Raw(name); +}; diff --git a/packages/web3-eth-abi/src/api/events_api.ts b/packages/web3-eth-abi/src/api/events_api.ts new file mode 100644 index 00000000000..67bb1791432 --- /dev/null +++ b/packages/web3-eth-abi/src/api/events_api.ts @@ -0,0 +1,91 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * + * @module ABI + */ + +import { sha3Raw } from 'web3-utils'; +import { AbiError } from 'web3-errors'; +import { AbiEventFragment } from 'web3-types'; +import { jsonInterfaceMethodToString, isAbiEventFragment } from '../utils.js'; + +/** + * Encodes the event name to its ABI signature, which are the sha3 hash of the event name including input types. + * @param functionName - The event name to encode, or the {@link AbiEventFragment} object of the event. If string, it has to be in the form of `eventName(param1Type,param2Type,...)`. eg: myEvent(uint256,bytes32). + * @returns - The ABI signature of the event. + * + * @example + * ```ts + * const event = web3.eth.abi.encodeEventSignature({ + * name: "myEvent", + * type: "event", + * inputs: [ + * { + * type: "uint256", + * name: "myNumber", + * }, + * { + * type: "bytes32", + * name: "myBytes", + * }, + * ], + * }); + * console.log(event); + * > 0xf2eeb729e636a8cb783be044acf6b7b1e2c5863735b60d6daae84c366ee87d97 + * + * const event = web3.eth.abi.encodeEventSignature({ + * inputs: [ + * { + * indexed: true, + * name: "from", + * type: "address", + * }, + * { + * indexed: true, + * name: "to", + * type: "address", + * }, + * { + * indexed: false, + * name: "value", + * type: "uint256", + * }, + * ], + * name: "Transfer", + * type: "event", + * }); + * console.log(event); + * > 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef + * ``` + */ +export const encodeEventSignature = (functionName: string | AbiEventFragment): string => { + if (typeof functionName !== 'string' && !isAbiEventFragment(functionName)) { + throw new AbiError('Invalid parameter value in encodeEventSignature'); + } + + let name: string; + + if (functionName && (typeof functionName === 'function' || typeof functionName === 'object')) { + name = jsonInterfaceMethodToString(functionName); + } else { + name = functionName; + } + + return sha3Raw(name); +}; diff --git a/packages/web3-eth-abi/src/api/functions_api.ts b/packages/web3-eth-abi/src/api/functions_api.ts new file mode 100644 index 00000000000..776cb084940 --- /dev/null +++ b/packages/web3-eth-abi/src/api/functions_api.ts @@ -0,0 +1,145 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * + * @module ABI + */ +import { AbiError } from 'web3-errors'; +import { sha3Raw } from 'web3-utils'; +import { AbiFunctionFragment } from 'web3-types'; +import { isAbiFunctionFragment, jsonInterfaceMethodToString } from '../utils.js'; +import { encodeParameters } from './parameters_api.js'; + +/** + * Encodes the function name to its ABI representation, which are the first 4 bytes of the sha3 of the function name including types. + * The JSON interface spec documentation https://docs.soliditylang.org/en/latest/abi-spec.html#json + * @param functionName - The function name to encode or the `JSON interface` object of the function. + * If the passed parameter is a string, it has to be in the form of `functionName(param1Type,param2Type,...)`. eg: myFunction(uint256,uint32[],bytes10,bytes) + * @returns - The ABI signature of the function. + * @example + * ```ts + * const signature = web3.eth.abi.encodeFunctionSignature({ + * name: "myMethod", + * type: "function", + * inputs: [ + * { + * type: "uint256", + * name: "myNumber", + * }, + * { + * type: "string", + * name: "myString", + * }, + * ], + * }); + * console.log(signature); + * > 0x24ee0097 + * + * const signature = web3.eth.abi.encodeFunctionSignature('myMethod(uint256,string)') + * console.log(signature); + * > 0x24ee0097 + * + * const signature = web3.eth.abi.encodeFunctionSignature('safeTransferFrom(address,address,uint256,bytes)'); + * console.log(signature); + * > 0xb88d4fde + * ``` + */ +export const encodeFunctionSignature = (functionName: string | AbiFunctionFragment): string => { + if (typeof functionName !== 'string' && !isAbiFunctionFragment(functionName)) { + throw new AbiError('Invalid parameter value in encodeFunctionSignature'); + } + + let name: string; + + if (functionName && (typeof functionName === 'function' || typeof functionName === 'object')) { + name = jsonInterfaceMethodToString(functionName); + } else { + name = functionName; + } + + return sha3Raw(name).slice(0, 10); +}; + +/** + * Encodes a function call using its `JSON interface` object and given parameters. + * The JSON interface spec documentation https://docs.soliditylang.org/en/latest/abi-spec.html#json + * @param jsonInterface - The `JSON interface` object of the function. + * @param params - The parameters to encode + * @returns - The ABI encoded function call, which, means the function signature and the parameters passed. + * @example + * ```ts + * const sig = web3.eth.abi.encodeFunctionCall( + * { + * name: "myMethod", + * type: "function", + * inputs: [ + * { + * type: "uint256", + * name: "myNumber", + * }, + * { + * type: "string", + * name: "myString", + * }, + * ], + * }, + * ["2345675643", "Hello!%"] + * ); + * console.log(sig); + * > 0x24ee0097000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000 + * + * + * + * const sig = web3.eth.abi.encodeFunctionCall( + * { + * inputs: [ + * { + * name: "account", + * type: "address", + * }, + * ], + * name: "balanceOf", + * outputs: [ + * { + * name: "", + * type: "uint256", + * }, + * ], + * stateMutability: "view", + * type: "function", + * }, + * ["0x1234567890123456789012345678901234567890"] + * ); + * + * console.log(sig); + * > 0x70a082310000000000000000000000001234567890123456789012345678901234567890 + * ``` + */ +export const encodeFunctionCall = ( + jsonInterface: AbiFunctionFragment, + params: unknown[], +): string => { + if (!isAbiFunctionFragment(jsonInterface)) { + throw new AbiError('Invalid parameter value in encodeFunctionCall'); + } + + return `${encodeFunctionSignature(jsonInterface)}${encodeParameters( + jsonInterface.inputs ?? [], + params ?? [], + ).replace('0x', '')}`; +}; diff --git a/packages/web3-eth-abi/src/api/logs_api.ts b/packages/web3-eth-abi/src/api/logs_api.ts new file mode 100644 index 00000000000..f7ebd012d57 --- /dev/null +++ b/packages/web3-eth-abi/src/api/logs_api.ts @@ -0,0 +1,131 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * + * @module ABI + */ + +import { HexString, AbiParameter, DecodedParams } from 'web3-types'; +import { decodeParameter, decodeParametersWith } from './parameters_api.js'; + +const STATIC_TYPES = ['bool', 'string', 'int', 'uint', 'address', 'fixed', 'ufixed']; + +const _decodeParameter = (inputType: string, clonedTopic: string) => + inputType === 'string' ? clonedTopic : decodeParameter(inputType, clonedTopic); + +/** + * Decodes ABI-encoded log data and indexed topic data. + * @param inputs - A {@link AbiParameter} input array. See the [Solidity documentation](https://docs.soliditylang.org/en/develop/types.html) for a list of types. + * @param data - The ABI byte code in the `data` field of a log. + * @param topics - An array with the index parameter topics of the log, without the topic[0] if its a non-anonymous event, otherwise with topic[0] + * @returns - The result object containing the decoded parameters. + * + * @example + * ```ts + * let res = web3.eth.abi.decodeLog( + * [ + * { + * type: "string", + * name: "myString", + * }, + * { + * type: "uint256", + * name: "myNumber", + * indexed: true, + * }, + * { + * type: "uint8", + * name: "mySmallNumber", + * indexed: true, + * }, + * ], + * "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000", + * [ + * "0x000000000000000000000000000000000000000000000000000000000000f310", + * "0x0000000000000000000000000000000000000000000000000000000000000010", + * ] + * ); + * > { + * '0': 'Hello%!', + * '1': 62224n, + * '2': 16n, + * __length__: 3, + * myString: 'Hello%!', + * myNumber: 62224n, + * mySmallNumber: 16n + * } + * ``` + */ +export const decodeLog = ( + inputs: Array, + data: HexString, + topics: string | string[], +) => { + const clonedTopics = Array.isArray(topics) ? topics : [topics]; + + const indexedInputs: Record = {}; + const nonIndexedInputs: Record = {}; + + for (const [i, input] of inputs.entries()) { + if (input.indexed) { + indexedInputs[i] = input; + } else { + nonIndexedInputs[i] = input; + } + } + + const decodedNonIndexedInputs: DecodedParams = data + ? decodeParametersWith(Object.values(nonIndexedInputs), data, true) + : { __length__: 0 }; + + // If topics are more than indexed inputs, that means first topic is the event signature + const offset = clonedTopics.length - Object.keys(indexedInputs).length; + + const decodedIndexedInputs = Object.values(indexedInputs).map((input, index) => + STATIC_TYPES.some(s => input.type.startsWith(s)) + ? _decodeParameter(input.type, clonedTopics[index + offset]) + : clonedTopics[index + offset], + ); + + const returnValues: DecodedParams = { __length__: 0 }; + + let indexedCounter = 0; + let nonIndexedCounter = 0; + + for (const [i, res] of inputs.entries()) { + returnValues[i] = res.type === 'string' ? '' : undefined; + + if (indexedInputs[i]) { + returnValues[i] = decodedIndexedInputs[indexedCounter]; + indexedCounter += 1; + } + + if (nonIndexedInputs[i]) { + returnValues[i] = decodedNonIndexedInputs[String(nonIndexedCounter)]; + nonIndexedCounter += 1; + } + + if (res.name) { + returnValues[res.name] = returnValues[i]; + } + + returnValues.__length__ += 1; + } + + return returnValues as ReturnType; +}; diff --git a/packages/web3-eth-abi/src/api/parameters_api.ts b/packages/web3-eth-abi/src/api/parameters_api.ts new file mode 100644 index 00000000000..d9cbd106673 --- /dev/null +++ b/packages/web3-eth-abi/src/api/parameters_api.ts @@ -0,0 +1,288 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * + * @module ABI + */ + +import { AbiError } from 'web3-errors'; +import { AbiInput, HexString } from 'web3-types'; +import { decodeParameters as decodeParametersInternal } from '../coders/decode.js'; +import { encodeParameters } from '../coders/encode.js'; + +export { encodeParameters, inferTypesAndEncodeParameters } from '../coders/encode.js'; + + +/** + * Encodes a parameter based on its type to its ABI representation. + * @param abi - The type of the parameter. See the [Solidity documentation](https://docs.soliditylang.org/en/develop/types.html) for a list of types. + * @param param - The actual parameter to encode. + * @returns - The ABI encoded parameter + * @example + * ```ts + * const res = web3.eth.abi.encodeParameter("uint256", "2345675643"); + * console.log(res); + * 0x000000000000000000000000000000000000000000000000000000008bd02b7b + * + * const res = web3.eth.abi.encodeParameter("uint", "2345675643"); + * + * console.log(res); + * >0x000000000000000000000000000000000000000000000000000000008bd02b7b + * + * const res = web3.eth.abi.encodeParameter("bytes32", "0xdf3234"); + * + * console.log(res); + * >0xdf32340000000000000000000000000000000000000000000000000000000000 + * + * const res = web3.eth.abi.encodeParameter("bytes", "0xdf3234"); + * + * console.log(res); + * > 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003df32340000000000000000000000000000000000000000000000000000000000 + * + * const res = web3.eth.abi.encodeParameter("bytes32[]", ["0xdf3234", "0xfdfd"]); + * + * console.log(res); + * > 0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000 + * + * const res = web3.eth.abi.encodeParameter( + * { + * ParentStruct: { + * propertyOne: "uint256", + * propertyTwo: "uint256", + * childStruct: { + * propertyOne: "uint256", + * propertyTwo: "uint256", + * }, + * }, + * }, + * { + * propertyOne: 42, + * propertyTwo: 56, + * childStruct: { + * propertyOne: 45, + * propertyTwo: 78, + * }, + * } + * ); + * + * console.log(res); + * > 0x000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e + * ``` + */ +export const encodeParameter = (abi: AbiInput, param: unknown): string => + encodeParameters([abi], [param]); +/** + * Should be used to decode list of params + */ +export const decodeParametersWith = ( + abis: AbiInput[], + bytes: HexString, + loose: boolean, +): { [key: string]: unknown; __length__: number } => { + try { + if (abis.length > 0 && (!bytes || bytes === '0x' || bytes === '0X')) { + throw new AbiError( + "Returned values aren't valid, did it run Out of Gas? " + + 'You might also see this error if you are not using the ' + + 'correct ABI for the contract you are retrieving data from, ' + + 'requesting data from a block number that does not exist, ' + + 'or querying a node which is not fully synced.', + ); + } + return decodeParametersInternal(abis, `0x${bytes.replace(/0x/i, '')}`, loose); + } catch (err) { + throw new AbiError(`Parameter decoding error: ${(err as Error).message}`, { + internalErr: err, + }); + } +}; + +/** + * Should be used to decode list of params + */ +/** + * Decodes ABI encoded parameters to its JavaScript types. + * @param abi - An array of {@link AbiInput}. See the [Solidity documentation](https://docs.soliditylang.org/en/develop/types.html) for a list of types. + * @param bytes - The ABI byte code to decode + * @returns - The result object containing the decoded parameters. + * @example + * ```ts + * let res = web3.eth.abi.decodeParameters( + * ["string", "uint256"], + * "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000" + * ); + * console.log(res); + * > { '0': 'Hello!%!', '1': 234n, __length__: 2 } + * + * let res = web3.eth.abi.decodeParameters( + * [ + * { + * type: "string", + * name: "myString", + * }, + * { + * type: "uint256", + * name: "myNumber", + * }, + * ], + * "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000" + * ); + * console.log(res); + * > { + * '0': 'Hello!%!', + * '1': 234n, + * __length__: 2, + * myString: 'Hello!%!', + * myNumber: 234n + * } + * + * const res = web3.eth.abi.decodeParameters( + * [ + * "uint8[]", + * { + * ParentStruct: { + * propertyOne: "uint256", + * propertyTwo: "uint256", + * childStruct: { + * propertyOne: "uint256", + * propertyTwo: "uint256", + * }, + * }, + * }, + * ], + * "0x00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000018" + * ); + * console.log(res); + * > + * '0': [ 42n, 24n ], + * '1': { + * '0': 42n, + * '1': 56n, + * '2': { + * '0': 45n, + * '1': 78n, + * __length__: 2, + * propertyOne: 45n, + * propertyTwo: 78n + * }, + * __length__: 3, + * propertyOne: 42n, + * propertyTwo: 56n, + * childStruct: { + * '0': 45n, + * '1': 78n, + * __length__: 2, + * propertyOne: 45n, + * propertyTwo: 78n + * } + * }, + * __length__: 2, + * ParentStruct: { + * '0': 42n, + * '1': 56n, + * '2': { + * '0': 45n, + * '1': 78n, + * __length__: 2, + * propertyOne: 45n, + * propertyTwo: 78n + * }, + * __length__: 3, + * propertyOne: 42n, + * propertyTwo: 56n, + * childStruct: { + * '0': 45n, + * '1': 78n, + * __length__: 2, + * propertyOne: 45n, + * propertyTwo: 78n + * } + * } + *} + * ``` + */ +export const decodeParameters = ( + abi: AbiInput[], + bytes: HexString, +): { [key: string]: unknown; __length__: number } => decodeParametersWith(abi, bytes, false); + +/** + * Should be used to decode bytes to plain param + */ +/** + * Decodes an ABI encoded parameter to its JavaScript type. + * @param abi - The type of the parameter. See the [Solidity documentation](https://docs.soliditylang.org/en/develop/types.html) for a list of types. + * @param bytes - The ABI byte code to decode + * @returns - The decoded parameter + * @example + * ```ts + * const res = web3.eth.abi.decodeParameter( + * "uint256", + * "0x0000000000000000000000000000000000000000000000000000000000000010" + * ); + * console.log(res); + * > 16n + * + * const res = web3.eth.abi.decodeParameter( + * "string", + * "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000" + * ); + * + * console.log(res); + * > Hello!%! + * + * const res = web3.eth.abi.decodeParameter( + * { + * ParentStruct: { + * propertyOne: "uint256", + * propertyTwo: "uint256", + * childStruct: { + * propertyOne: "uint256", + * propertyTwo: "uint256", + * }, + * }, + * }, + * "0x000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e" + * ); + * + * console.log(res); + * { + * '0': 42n, + * '1': 56n, + * '2': { + * '0': 45n, + * '1': 78n, + * __length__: 2, + * propertyOne: 45n, + * propertyTwo: 78n + * }, + * __length__: 3, + * propertyOne: 42n, + * propertyTwo: 56n, + * childStruct: { + * '0': 45n, + * '1': 78n, + * __length__: 2, + * propertyOne: 45n, + * propertyTwo: 78n + * } + *} + * ``` + */ +export const decodeParameter = (abi: AbiInput, bytes: HexString): unknown => + decodeParameters([abi], bytes)['0']; diff --git a/packages/web3-eth-abi/src/coders/base/address.ts b/packages/web3-eth-abi/src/coders/base/address.ts new file mode 100644 index 00000000000..ae63744ebe3 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/address.ts @@ -0,0 +1,75 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiError } from 'web3-errors'; +import { AbiParameter } from 'web3-types'; +import { toChecksumAddress } from 'web3-utils'; +import { isAddress, utils } from 'web3-validator'; +import { DecoderResult, EncoderResult } from '../types.js'; +import { alloc, WORD_SIZE } from '../utils.js'; + +const ADDRESS_BYTES_COUNT = 20; +const ADDRESS_OFFSET = WORD_SIZE - ADDRESS_BYTES_COUNT; + +export function encodeAddress(param: AbiParameter, input: unknown): EncoderResult { + if (typeof input !== 'string') { + throw new AbiError('address type expects string as input type', { + value: input, + name: param.name, + type: param.type, + }); + } + let address = input.toLowerCase(); + if (!address.startsWith('0x')) { + address = `0x${address}`; + } + if (!isAddress(address)) { + throw new AbiError('provided input is not valid address', { + value: input, + name: param.name, + type: param.type, + }); + } + // for better performance, we could convert hex to destination bytes directly (encoded var) + const addressBytes = utils.hexToUint8Array(address); + // expand address to WORD_SIZE + const encoded = alloc(WORD_SIZE); + encoded.set(addressBytes, ADDRESS_OFFSET); + return { + dynamic: false, + encoded, + }; +} + +export function decodeAddress(_param: AbiParameter, bytes: Uint8Array): DecoderResult { + const addressBytes = bytes.subarray(ADDRESS_OFFSET, WORD_SIZE); + if (addressBytes.length !== ADDRESS_BYTES_COUNT) { + throw new AbiError('Invalid decoding input, not enough bytes to decode address', { bytes }); + } + const result = utils.uint8ArrayToHexString(addressBytes); + + // should we check is decoded value is valid address? + // if(!isAddress(result)) { + // throw new AbiError("encoded data is not valid address", { + // address: result, + // }); + // } + return { + result: toChecksumAddress(result), + encoded: bytes.subarray(WORD_SIZE), + consumed: WORD_SIZE, + }; +} diff --git a/packages/web3-eth-abi/src/coders/base/array.ts b/packages/web3-eth-abi/src/coders/base/array.ts new file mode 100644 index 00000000000..0c23ac4e287 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/array.ts @@ -0,0 +1,120 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiError } from 'web3-errors'; +import { AbiParameter } from 'web3-types'; +import { uint8ArrayConcat } from 'web3-utils'; +// eslint-disable-next-line import/no-cycle +import { decodeParamFromAbiParameter, encodeNumber, encodeParamFromAbiParameter } from './index.js'; +import { DecoderResult, EncoderResult } from '../types.js'; +import { extractArrayType, isDynamic, WORD_SIZE } from '../utils.js'; +import { decodeNumber } from './number.js'; +import { encodeDynamicParams } from './utils.js'; + +export function encodeArray(param: AbiParameter, values: unknown): EncoderResult { + if (!Array.isArray(values)) { + throw new AbiError('Expected value to be array', { abi: param, values }); + } + const { size, param: arrayItemParam } = extractArrayType(param); + const encodedParams = values.map(v => encodeParamFromAbiParameter(arrayItemParam, v)); + const dynamic = size === -1; + const dynamicItems = encodedParams.length > 0 && encodedParams[0].dynamic; + if (!dynamic && values.length !== size) { + throw new AbiError("Given arguments count doesn't match array length", { + arrayLength: size, + argumentsLength: values.length, + }); + } + if (dynamic || dynamicItems) { + const encodingResult = encodeDynamicParams(encodedParams); + if (dynamic) { + const encodedLength = encodeNumber( + { type: 'uint256', name: '' }, + encodedParams.length, + ).encoded; + return { + dynamic: true, + encoded: + encodedParams.length > 0 + ? uint8ArrayConcat(encodedLength, encodingResult) + : encodedLength, + }; + } + return { + dynamic: true, + encoded: encodingResult, + }; + } + + return { + dynamic: false, + encoded: uint8ArrayConcat(...encodedParams.map(p => p.encoded)), + }; +} + +export function decodeArray(param: AbiParameter, bytes: Uint8Array): DecoderResult { + // eslint-disable-next-line prefer-const + let { size, param: arrayItemParam } = extractArrayType(param); + const dynamic = size === -1; + + let consumed = 0; + const result: unknown[] = []; + let remaining = bytes; + // dynamic array, we need to decode length + if (dynamic) { + const lengthResult = decodeNumber({ type: 'uint32', name: '' }, bytes); + size = Number(lengthResult.result); + consumed = lengthResult.consumed; + remaining = lengthResult.encoded; + } + const hasDynamicChild = isDynamic(arrayItemParam); + if (hasDynamicChild) { + // known length but dynamic child, each child is actually head element with encoded offset + for (let i = 0; i < size; i += 1) { + const offsetResult = decodeNumber( + { type: 'uint32', name: '' }, + remaining.subarray(i * WORD_SIZE), + ); + consumed += offsetResult.consumed; + const decodedChildResult = decodeParamFromAbiParameter( + arrayItemParam, + remaining.subarray(Number(offsetResult.result)), + ); + consumed += decodedChildResult.consumed; + result.push(decodedChildResult.result); + } + return { + result, + encoded: remaining.subarray(consumed), + consumed, + }; + } + + for (let i = 0; i < size; i += 1) { + // decode static params + const decodedChildResult = decodeParamFromAbiParameter( + arrayItemParam, + bytes.subarray(consumed), + ); + consumed += decodedChildResult.consumed; + result.push(decodedChildResult.result); + } + return { + result, + encoded: bytes.subarray(consumed), + consumed, + }; +} diff --git a/packages/web3-eth-abi/src/coders/base/bool.ts b/packages/web3-eth-abi/src/coders/base/bool.ts new file mode 100644 index 00000000000..af0b95dcfe7 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/bool.ts @@ -0,0 +1,54 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiError, InvalidBooleanError } from 'web3-errors'; +import { AbiParameter } from 'web3-types'; +import { toBool } from 'web3-utils'; +import { DecoderResult, EncoderResult } from '../types.js'; +import { WORD_SIZE } from '../utils.js'; +import { decodeNumber, encodeNumber } from './number.js'; + +export function encodeBoolean(param: AbiParameter, input: unknown): EncoderResult { + let value; + try { + value = toBool(input); + } catch (e) { + if (e instanceof InvalidBooleanError) { + throw new AbiError('provided input is not valid boolean value', { + type: param.type, + value: input, + name: param.name, + }); + } + } + + return encodeNumber({ type: 'uint8', name: '' }, Number(value)); +} + +export function decodeBool(_param: AbiParameter, bytes: Uint8Array): DecoderResult { + const numberResult = decodeNumber({ type: 'uint8', name: '' }, bytes); + if (numberResult.result > 1 || numberResult.result < 0) { + throw new AbiError('Invalid boolean value encoded', { + boolBytes: bytes.subarray(0, WORD_SIZE), + numberResult, + }); + } + return { + result: numberResult.result === BigInt(1), + encoded: numberResult.encoded, + consumed: WORD_SIZE, + }; +} diff --git a/packages/web3-eth-abi/src/coders/base/bytes.ts b/packages/web3-eth-abi/src/coders/base/bytes.ts new file mode 100644 index 00000000000..714abbfdbd2 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/bytes.ts @@ -0,0 +1,106 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiError } from 'web3-errors'; +import { AbiParameter, Bytes } from 'web3-types'; +import { bytesToHex, bytesToUint8Array } from 'web3-utils'; +import { isBytes, ValidInputTypes } from 'web3-validator'; +import { DecoderResult, EncoderResult } from '../types.js'; +import { alloc, WORD_SIZE } from '../utils.js'; +import { decodeNumber, encodeNumber } from './number.js'; + +const MAX_STATIC_BYTES_COUNT = 32; + +export function encodeBytes(param: AbiParameter, input: unknown): EncoderResult { + // hack for odd length hex strings + if (typeof input === 'string' && input.length % 2 !== 0) { + // eslint-disable-next-line no-param-reassign + input += '0'; + } + if (!isBytes(input as ValidInputTypes)) { + throw new AbiError('provided input is not valid bytes value', { + type: param.type, + value: input, + name: param.name, + }); + } + const bytes = bytesToUint8Array(input as Bytes); + const [, size] = param.type.split('bytes'); + // fixed size + if (size) { + if (Number(size) > MAX_STATIC_BYTES_COUNT || Number(size) < 1) { + throw new AbiError( + 'invalid bytes type. Static byte type can have between 1 and 32 bytes', + { + type: param.type, + }, + ); + } + if (Number(size) < bytes.length) { + throw new AbiError('provided input size is different than type size', { + type: param.type, + value: input, + name: param.name, + }); + } + const encoded = alloc(WORD_SIZE); + encoded.set(bytes); + return { + dynamic: false, + encoded, + }; + } + + const partsLength = Math.ceil(bytes.length / WORD_SIZE); + // one word for length of data + WORD for each part of actual data + const encoded = alloc(WORD_SIZE + partsLength * WORD_SIZE); + + encoded.set(encodeNumber({ type: 'uint32', name: '' }, bytes.length).encoded); + encoded.set(bytes, WORD_SIZE); + return { + dynamic: true, + encoded, + }; +} + +export function decodeBytes(param: AbiParameter, bytes: Uint8Array): DecoderResult { + const [, sizeString] = param.type.split('bytes'); + let size = Number(sizeString); + let remainingBytes = bytes; + let partsCount = 1; + let consumed = 0; + if (!size) { + // dynamic bytes + const result = decodeNumber({ type: 'uint32', name: '' }, remainingBytes); + size = Number(result.result); + consumed += result.consumed; + remainingBytes = result.encoded; + partsCount = Math.ceil(size / WORD_SIZE); + } + if (size > bytes.length) { + throw new AbiError('there is not enough data to decode', { + type: param.type, + encoded: bytes, + size, + }); + } + + return { + result: bytesToHex(remainingBytes.subarray(0, size)), + encoded: remainingBytes.subarray(partsCount * WORD_SIZE), + consumed: consumed + partsCount * WORD_SIZE, + }; +} diff --git a/packages/web3-eth-abi/src/coders/base/index.ts b/packages/web3-eth-abi/src/coders/base/index.ts new file mode 100644 index 00000000000..007e3ebb4d6 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/index.ts @@ -0,0 +1,95 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiParameter } from 'web3-types'; +import { AbiError } from 'web3-errors'; +import { EncoderResult, DecoderResult } from '../types.js'; +import { decodeAddress, encodeAddress } from './address.js'; +import { decodeBool, encodeBoolean } from './bool.js'; +import { decodeBytes, encodeBytes } from './bytes.js'; +import { decodeNumber, encodeNumber } from './number.js'; +import { decodeString, encodeString } from './string.js'; +// eslint-disable-next-line import/no-cycle +import { decodeTuple, encodeTuple } from './tuple.js'; +// eslint-disable-next-line import/no-cycle +import { decodeArray, encodeArray } from './array.js'; + +export { encodeAddress, decodeAddress } from './address.js'; +export { encodeBoolean, decodeBool } from './bool.js'; +export { encodeBytes, decodeBytes } from './bytes.js'; +export { encodeNumber, decodeNumber } from './number.js'; +export { encodeString, decodeString } from './string.js'; +// eslint-disable-next-line import/no-cycle +export { encodeTuple, decodeTuple } from './tuple.js'; +// eslint-disable-next-line import/no-cycle +export { encodeArray, decodeArray } from './array.js'; + +export function encodeParamFromAbiParameter(param: AbiParameter, value: unknown): EncoderResult { + if (param.type === 'string') { + return encodeString(param, value); + } + if (param.type === 'bool') { + return encodeBoolean(param, value); + } + if (param.type === 'address') { + return encodeAddress(param, value); + } + if (param.type === 'tuple') { + return encodeTuple(param, value); + } + if (param.type.endsWith(']')) { + return encodeArray(param, value); + } + if (param.type.startsWith('bytes')) { + return encodeBytes(param, value); + } + if (param.type.startsWith('uint') || param.type.startsWith('int')) { + return encodeNumber(param, value); + } + throw new AbiError('Unsupported', { + param, + value, + }); +} + +export function decodeParamFromAbiParameter(param: AbiParameter, bytes: Uint8Array): DecoderResult { + if (param.type === 'string') { + return decodeString(param, bytes); + } + if (param.type === 'bool') { + return decodeBool(param, bytes); + } + if (param.type === 'address') { + return decodeAddress(param, bytes); + } + if (param.type === 'tuple') { + return decodeTuple(param, bytes); + } + if (param.type.endsWith(']')) { + return decodeArray(param, bytes); + } + if (param.type.startsWith('bytes')) { + return decodeBytes(param, bytes); + } + if (param.type.startsWith('uint') || param.type.startsWith('int')) { + return decodeNumber(param, bytes); + } + throw new AbiError('Unsupported', { + param, + bytes, + }); +} diff --git a/packages/web3-eth-abi/src/coders/base/number.ts b/packages/web3-eth-abi/src/coders/base/number.ts new file mode 100644 index 00000000000..a86ee4f6acd --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/number.ts @@ -0,0 +1,116 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import type { AbiParameter } from 'web3-types'; +import { padLeft, toBigInt } from 'web3-utils'; +import { utils } from 'web3-validator'; +import { DecoderResult, EncoderResult } from '../types.js'; +import { WORD_SIZE } from '../utils.js'; +import { numberLimits } from './numbersLimits.js'; + +// eslint-disable-next-line no-bitwise +const mask = BigInt(1) << BigInt(256); + +function bigIntToUint8Array(value: bigint, byteLength = WORD_SIZE): Uint8Array { + let hexValue; + if (value < 0) { + hexValue = (mask + value).toString(16); + } else { + hexValue = value.toString(16); + } + hexValue = padLeft(hexValue, byteLength * 2); + return utils.hexToUint8Array(hexValue); +} + +function uint8ArrayToBigInt(value: Uint8Array, max: bigint): bigint { + const hexValue = utils.uint8ArrayToHexString(value); + const result = BigInt(hexValue); + if (result <= max) return result; + return result - mask; +} + +export function encodeNumber(param: AbiParameter, input: unknown): EncoderResult { + let value; + try { + value = toBigInt(input); + } catch (e) { + throw new AbiError('provided input is not number value', { + type: param.type, + value: input, + name: param.name, + }); + } + const limit = numberLimits.get(param.type); + if (!limit) { + throw new AbiError('provided abi contains invalid number datatype', { type: param.type }); + } + if (value < limit.min) { + throw new AbiError('provided input is less then minimum for given type', { + type: param.type, + value: input, + name: param.name, + minimum: limit.min.toString(), + }); + } + if (value > limit.max) { + throw new AbiError('provided input is greater then maximum for given type', { + type: param.type, + value: input, + name: param.name, + maximum: limit.max.toString(), + }); + } + return { + dynamic: false, + encoded: bigIntToUint8Array(value), + }; +} + +export function decodeNumber(param: AbiParameter, bytes: Uint8Array): DecoderResult { + if (bytes.length < WORD_SIZE) { + throw new AbiError('Not enough bytes left to decode', { param, bytesLeft: bytes.length }); + } + const boolBytes = bytes.subarray(0, WORD_SIZE); + const limit = numberLimits.get(param.type); + if (!limit) { + throw new AbiError('provided abi contains invalid number datatype', { type: param.type }); + } + const numberResult = uint8ArrayToBigInt(boolBytes, limit.max); + + if (numberResult < limit.min) { + throw new AbiError('decoded value is less then minimum for given type', { + type: param.type, + value: numberResult, + name: param.name, + minimum: limit.min.toString(), + }); + } + if (numberResult > limit.max) { + throw new AbiError('decoded value is greater then maximum for given type', { + type: param.type, + value: numberResult, + name: param.name, + maximum: limit.max.toString(), + }); + } + return { + result: numberResult, + encoded: bytes.subarray(WORD_SIZE), + consumed: WORD_SIZE, + }; +} diff --git a/packages/web3-eth-abi/src/coders/base/numbersLimits.ts b/packages/web3-eth-abi/src/coders/base/numbersLimits.ts new file mode 100644 index 00000000000..29f11462843 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/numbersLimits.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* + * this variable contains the precalculated limits for all the numbers for uint and int types +*/ +export const numberLimits = new Map(); + +let base = BigInt(256); // 2 ^ 8 = 256 +for (let i = 8; i <= 256; i += 8) { + numberLimits.set(`uint${i}`, { + min: BigInt(0), + max: base - BigInt(1), + }); + numberLimits.set(`int${i}`, { + min: -base / BigInt(2), + max: base / BigInt(2) - BigInt(1), + }); + base *= BigInt(256); +} + +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +numberLimits.set(`int`, numberLimits.get('int256')!); +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +numberLimits.set(`uint`, numberLimits.get('uint256')!); diff --git a/packages/web3-eth-abi/src/coders/base/string.ts b/packages/web3-eth-abi/src/coders/base/string.ts new file mode 100644 index 00000000000..6ad69e23ef3 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/string.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiError } from 'web3-errors'; +import { AbiParameter } from 'web3-types'; +import { hexToUtf8, utf8ToBytes } from 'web3-utils'; +import { DecoderResult, EncoderResult } from '../types.js'; +import { decodeBytes, encodeBytes } from './bytes.js'; + +export function encodeString(_param: AbiParameter, input: unknown): EncoderResult { + if (typeof input !== 'string') { + throw new AbiError('invalid input, should be string', { input }); + } + const bytes = utf8ToBytes(input); + return encodeBytes({ type: 'bytes', name: '' }, bytes); +} + +export function decodeString(_param: AbiParameter, bytes: Uint8Array): DecoderResult { + const r = decodeBytes({ type: 'bytes', name: '' }, bytes); + return { + result: hexToUtf8(r.result), + encoded: r.encoded, + consumed: r.consumed, + }; +} diff --git a/packages/web3-eth-abi/src/coders/base/tuple.ts b/packages/web3-eth-abi/src/coders/base/tuple.ts new file mode 100644 index 00000000000..89ccff48cf3 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/tuple.ts @@ -0,0 +1,130 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiError } from 'web3-errors'; +import { AbiParameter } from 'web3-types'; +import { uint8ArrayConcat } from 'web3-utils'; +import { DecoderResult, EncoderResult } from '../types.js'; +// eslint-disable-next-line import/no-cycle +import { decodeParamFromAbiParameter, encodeParamFromAbiParameter } from './index.js'; +import { encodeDynamicParams } from './utils.js'; +import { isDynamic } from '../utils.js'; +import { decodeNumber } from './number.js'; + +export function encodeTuple(param: AbiParameter, input: unknown): EncoderResult { + let dynamic = false; + if (!Array.isArray(input) && typeof input !== 'object') { + throw new AbiError('param must be either Array or Object', { + param, + input, + }); + } + const narrowedInput = input as Array | Record; + const encoded: Array = []; + for (let i = 0; i < (param.components?.length ?? 0); i += 1) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const paramComponent = param.components![i]; + let result: EncoderResult; + if (Array.isArray(narrowedInput)) { + if (i >= narrowedInput.length) { + throw new AbiError('input param length missmatch', { + param, + input, + }); + } + result = encodeParamFromAbiParameter(paramComponent, narrowedInput[i]); + } else { + const paramInput = narrowedInput[paramComponent.name ?? '']; + // eslint-disable-next-line no-null/no-null + if (paramInput === undefined || paramInput === null) { + throw new AbiError('missing input defined in abi', { + param, + input, + paramName: paramComponent.name, + }); + } + result = encodeParamFromAbiParameter(paramComponent, paramInput); + } + if (result.dynamic) { + dynamic = true; + } + encoded.push(result); + } + + if (dynamic) { + return { + dynamic: true, + encoded: encodeDynamicParams(encoded), + }; + } + return { + dynamic: false, + encoded: uint8ArrayConcat(...encoded.map(e => e.encoded)), + }; +} + +export function decodeTuple( + param: AbiParameter, + bytes: Uint8Array, +): DecoderResult<{ [key: string]: unknown; __length__: number }> { + const result: { [key: string]: unknown; __length__: number } = { + __length__: 0, + }; + + // tracks how much static params consumed bytes + let consumed = 0; + + if (!param.components) { + return { + result, + encoded: bytes, + consumed, + }; + } + // track how much dynamic params consumed bytes + let dynamicConsumed = 0; + for (const [index, childParam] of param.components.entries()) { + let decodedResult: DecoderResult; + if (isDynamic(childParam)) { + // if dynamic, we will have offset encoded + const offsetResult = decodeNumber( + { type: 'uint32', name: '' }, + bytes.subarray(consumed), + ); + // offset counts from start of original byte sequence + decodedResult = decodeParamFromAbiParameter( + childParam, + bytes.subarray(Number(offsetResult.result)), + ); + consumed += offsetResult.consumed; + dynamicConsumed += decodedResult.consumed; + } else { + // static param, just decode + decodedResult = decodeParamFromAbiParameter(childParam, bytes.subarray(consumed)); + consumed += decodedResult.consumed; + } + result.__length__ += 1; + result[index] = decodedResult.result; + if (childParam.name && childParam.name !== '') { + result[childParam.name] = decodedResult.result; + } + } + return { + encoded: bytes.subarray(consumed + dynamicConsumed), + result, + consumed: consumed + dynamicConsumed, + }; +} diff --git a/packages/web3-eth-abi/src/coders/base/utils.ts b/packages/web3-eth-abi/src/coders/base/utils.ts new file mode 100644 index 00000000000..65a7f46aaf5 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/base/utils.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { uint8ArrayConcat } from 'web3-utils'; +import { EncoderResult } from '../types.js'; +import { WORD_SIZE } from '../utils.js'; +import { encodeNumber } from './number.js'; + +export function encodeDynamicParams(encodedParams: ReadonlyArray): Uint8Array { + let staticSize = 0; + let dynamicSize = 0; + const staticParams: EncoderResult[] = []; + const dynamicParams: EncoderResult[] = []; + // figure out static size + for (const encodedParam of encodedParams) { + if (encodedParam.dynamic) { + staticSize += WORD_SIZE; + } else { + staticSize += encodedParam.encoded.length; + } + } + + for (const encodedParam of encodedParams) { + if (encodedParam.dynamic) { + staticParams.push( + encodeNumber({ type: 'uint256', name: '' }, staticSize + dynamicSize), + ); + dynamicParams.push(encodedParam); + dynamicSize += encodedParam.encoded.length; + } else { + staticParams.push(encodedParam); + } + } + return uint8ArrayConcat( + ...staticParams.map(p => p.encoded), + ...dynamicParams.map(p => p.encoded), + ); +} diff --git a/packages/web3-eth-abi/src/coders/decode.ts b/packages/web3-eth-abi/src/coders/decode.ts new file mode 100644 index 00000000000..adc84ad93bb --- /dev/null +++ b/packages/web3-eth-abi/src/coders/decode.ts @@ -0,0 +1,32 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiInput, HexString } from 'web3-types'; +import { utils } from 'web3-validator'; +import { decodeTuple } from './base/tuple.js'; +import { toAbiParams } from './utils.js'; + +export function decodeParameters( + abis: AbiInput[], + bytes: HexString, + _loose: boolean, +): { [key: string]: unknown; __length__: number } { + const abiParams = toAbiParams(abis); + const bytesArray = utils.hexToUint8Array(bytes); + + return decodeTuple({ type: 'tuple', name: '', components: abiParams }, bytesArray).result; +} diff --git a/packages/web3-eth-abi/src/coders/encode.ts b/packages/web3-eth-abi/src/coders/encode.ts new file mode 100644 index 00000000000..791c86c827d --- /dev/null +++ b/packages/web3-eth-abi/src/coders/encode.ts @@ -0,0 +1,114 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiError } from 'web3-errors'; +import { AbiInput, AbiParameter } from 'web3-types'; +import { toHex } from 'web3-utils'; +import { utils } from 'web3-validator'; +import { encodeTuple } from './base/index.js'; +import { toAbiParams } from './utils.js'; + +/** + * @param params - The params to infer the ABI from + * @returns The inferred ABI + * @example + * ``` + * inferParamsAbi([1, -1, 'hello', '0x1234', ]) + * ``` + * > [{ type: 'int256' }, { type: 'uint256' }, { type: 'string' }, { type: 'bytes' }] + * ``` + */ +function inferParamsAbi(params: unknown[]): ReadonlyArray { + const abi: AbiParameter[] = []; + params.forEach(param => { + if (Array.isArray(param)) { + const inferredParams = inferParamsAbi(param); + abi.push({ + type: 'tuple', + components: inferredParams, + name: '', + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + } as AbiParameter); + } else { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + abi.push({ type: toHex(param as any, true) } as AbiParameter); + } + }); + return abi; +} + +/** + * Encodes a parameter based on its type to its ABI representation. + * @param abi - An array of {@link AbiInput}. See [Solidity's documentation](https://solidity.readthedocs.io/en/v0.5.3/abi-spec.html#json) for more details. + * @param params - The actual parameters to encode. + * @returns - The ABI encoded parameters + * @example + * ```ts + * const res = web3.eth.abi.encodeParameters( + * ["uint256", "string"], + * ["2345675643", "Hello!%"] + * ); + * + * console.log(res); + * > 0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000 + * ``` + */ +export function encodeParameters(abi: ReadonlyArray, params: unknown[]): string { + if (abi?.length !== params.length) { + throw new AbiError('Invalid number of values received for given ABI', { + expected: abi?.length, + received: params.length, + }); + } + + const abiParams = toAbiParams(abi); + return utils.uint8ArrayToHexString( + encodeTuple({ type: 'tuple', name: '', components: abiParams }, params).encoded, + ); +} + +/** + * Infer a smart contract method parameter type and then encode this parameter. + * @param params - The parameters to encode. + * @returns - The ABI encoded parameters + * + * @remarks + * This method is useful when you don't know the type of the parameters you want to encode. It will infer the type of the parameters and then encode them. + * However, it is not recommended to use this method when you know the type of the parameters you want to encode. In this case, use the {@link encodeParameters} method instead. + * The type inference is not perfect and can lead to unexpected results. Especially when you want to encode an array, uint that is not uint256 or bytes.... + * @example + * ```ts + * const res = web3.eth.abi.encodeParameters( + * ["2345675643", "Hello!%"] + * ); + * + * console.log(res); + * > 0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000 + * ``` + */ +export function inferTypesAndEncodeParameters(params: unknown[]): string { + try { + const abiParams = inferParamsAbi(params); + return utils.uint8ArrayToHexString( + encodeTuple({ type: 'tuple', name: '', components: abiParams }, params).encoded, + ); + } catch (e) { + // throws If the inferred params type caused an error + throw new AbiError('Could not infer types from given params', { + params, + }); + } +} diff --git a/packages/web3-eth-abi/src/coders/types.ts b/packages/web3-eth-abi/src/coders/types.ts new file mode 100644 index 00000000000..b99d85618d3 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/types.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export type EncoderResult = { + dynamic: boolean; + + encoded: Uint8Array; +}; +export type DecoderResult = { + result: T; + + // remaining bytes not yet decoded + encoded: Uint8Array; + + // number of bytes consumed + consumed: number; +}; + +export type NumberType = { + signed: boolean; + byteLength: number; +}; +export type BytesType = { + size?: number; +}; diff --git a/packages/web3-eth-abi/src/coders/utils.ts b/packages/web3-eth-abi/src/coders/utils.ts new file mode 100644 index 00000000000..82b557262a8 --- /dev/null +++ b/packages/web3-eth-abi/src/coders/utils.ts @@ -0,0 +1,128 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiParameter as ExternalAbiParameter, parseAbiParameter } from 'abitype'; +import { AbiError } from 'web3-errors'; +import { AbiInput, AbiParameter, AbiStruct } from 'web3-types'; +import { isNullish } from 'web3-utils'; +import { + isSimplifiedStructFormat, + mapStructNameAndType, + mapStructToCoderFormat, +} from '../utils.js'; + +export const WORD_SIZE = 32; + +export function alloc(size = 0): Uint8Array { + if (globalThis.Buffer?.alloc !== undefined) { + const buf = globalThis.Buffer.alloc(size); + return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); + } + + return new Uint8Array(size); +} + +/** + * Where possible returns a Uint8Array of the requested size that references + * uninitialized memory. Only use if you are certain you will immediately + * overwrite every value in the returned `Uint8Array`. + */ +export function allocUnsafe(size = 0): Uint8Array { + if (globalThis.Buffer?.allocUnsafe !== undefined) { + const buf = globalThis.Buffer.allocUnsafe(size); + return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); + } + + return new Uint8Array(size); +} + +export function convertExternalAbiParameter(abiParam: ExternalAbiParameter): AbiParameter { + return { + ...abiParam, + name: abiParam.name ?? '', + components: (abiParam as { components: readonly AbiParameter[] }).components?.map(c => + convertExternalAbiParameter(c), + ), + }; +} + +export function isAbiParameter(param: unknown): param is AbiParameter { + return ( + !isNullish(param) && + typeof param === 'object' && + !isNullish((param as { type: unknown }).type) && + typeof (param as { type: unknown }).type === 'string' + ); +} + +export function toAbiParams(abi: ReadonlyArray): ReadonlyArray { + return abi.map(input => { + if (isAbiParameter(input)) { + return input; + } + if (typeof input === 'string') { + return convertExternalAbiParameter(parseAbiParameter(input.replace(/tuple/, ''))); + } + + if (isSimplifiedStructFormat(input)) { + const structName = Object.keys(input)[0]; + const structInfo = mapStructNameAndType(structName); + structInfo.name = structInfo.name ?? ''; + return { + ...structInfo, + components: mapStructToCoderFormat( + input[structName as keyof typeof input] as unknown as AbiStruct, + ), + }; + } + throw new AbiError('Invalid abi'); + }); +} + +export function extractArrayType(param: AbiParameter): { size: number; param: AbiParameter } { + const arrayParenthesisStart = param.type.lastIndexOf('['); + const arrayParamType = param.type.substring(0, arrayParenthesisStart); + const sizeString = param.type.substring(arrayParenthesisStart); + let size = -1; + if (sizeString !== '[]') { + size = Number(sizeString.slice(1, -1)); + // eslint-disable-next-line no-restricted-globals + if (isNaN(size)) { + throw new AbiError('Invalid fixed array size', { size: sizeString }); + } + } + return { + param: { type: arrayParamType, name: '', components: param.components }, + size, + }; +} + +/** + * Param is dynamic if it's dynamic base type or if some of his children (components, array items) + * is of dynamic type + * @param param + */ +export function isDynamic(param: AbiParameter): boolean { + if (param.type === 'string' || param.type === 'bytes' || param.type.endsWith('[]')) return true; + if (param.type === 'tuple') { + return param.components?.some(isDynamic) ?? false; + } + if (param.type.endsWith(']')) { + return isDynamic(extractArrayType(param).param); + } + return false; +} diff --git a/packages/web3-eth-abi/src/decode_contract_error_data.ts b/packages/web3-eth-abi/src/decode_contract_error_data.ts new file mode 100644 index 00000000000..98eb02d4fd8 --- /dev/null +++ b/packages/web3-eth-abi/src/decode_contract_error_data.ts @@ -0,0 +1,50 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Eip838ExecutionError } from 'web3-errors'; +import { AbiErrorFragment } from 'web3-types'; + +import { encodeErrorSignature } from './api/errors_api.js'; +import { decodeParameters } from './api/parameters_api.js'; +import { jsonInterfaceMethodToString } from './utils.js'; + +export const decodeContractErrorData = ( + errorsAbi: AbiErrorFragment[], + error: Eip838ExecutionError, +) => { + if (error?.data) { + let errorName: string | undefined; + let errorSignature: string | undefined; + let errorArgs: { [K in string]: unknown } | undefined; + try { + const errorSha = error.data.slice(0, 10); + const errorAbi = errorsAbi.find(abi => encodeErrorSignature(abi).startsWith(errorSha)); + + if (errorAbi?.inputs) { + errorName = errorAbi.name; + errorSignature = jsonInterfaceMethodToString(errorAbi); + // decode abi.inputs according to EIP-838 + errorArgs = decodeParameters([...errorAbi.inputs], error.data.substring(10)); + } + } catch (err) { + console.error(err); + } + if (errorName) { + error.setDecodedProperties(errorName, errorSignature, errorArgs); + } + } +}; diff --git a/packages/web3-eth-abi/src/eip_712.ts b/packages/web3-eth-abi/src/eip_712.ts new file mode 100644 index 00000000000..5a46df80be4 --- /dev/null +++ b/packages/web3-eth-abi/src/eip_712.ts @@ -0,0 +1,253 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The web3.eth.abi functions let you encode and decode parameters to ABI (Application Binary Interface) for function calls to the EVM (Ethereum Virtual Machine). + * + * For using Web3 ABI functions, first install Web3 package using `npm i web3` or `yarn add web3`. + * After that, Web3 ABI functions will be available. + * ```ts + * import { Web3 } from 'web3'; + * + * const web3 = new Web3(); + * const encoded = web3.eth.abi.encodeFunctionSignature({ + * name: 'myMethod', + * type: 'function', + * inputs: [{ + * type: 'uint256', + * name: 'myNumber' + * },{ + * type: 'string', + * name: 'myString' + * }] + * }); + * + * ``` + * + * For using individual package install `web3-eth-abi` package using `npm i web3-eth-abi` or `yarn add web3-eth-abi` and only import required functions. + * This is more efficient approach for building lightweight applications. + * ```ts + * import { encodeFunctionSignature } from 'web3-eth-abi'; + * + * const encoded = encodeFunctionSignature({ + * name: 'myMethod', + * type: 'function', + * inputs: [{ + * type: 'uint256', + * name: 'myNumber' + * },{ + * type: 'string', + * name: 'myString' + * }] + * }); + * + * ``` + * + * @module ABI + */ + + +// This code was taken from: https://github.com/Mrtenz/eip-712/tree/master + +import { Eip712TypedData } from 'web3-types'; +import { isNullish, keccak256 } from 'web3-utils'; +import { AbiError } from 'web3-errors'; +import { encodeParameters } from './coders/encode.js'; + +const TYPE_REGEX = /^\w+/; +const ARRAY_REGEX = /^(.*)\[([0-9]*?)]$/; + +/** + * Get the dependencies of a struct type. If a struct has the same dependency multiple times, it's only included once + * in the resulting array. + */ +const getDependencies = ( + typedData: Eip712TypedData, + type: string, + dependencies: string[] = [], +): string[] => { + const match = type.match(TYPE_REGEX)!; + const actualType = match[0]; + if (dependencies.includes(actualType)) { + return dependencies; + } + + if (!typedData.types[actualType]) { + return dependencies; + } + + return [ + actualType, + ...typedData.types[actualType].reduce( + (previous, _type) => [ + ...previous, + ...getDependencies(typedData, _type.type, previous).filter( + dependency => !previous.includes(dependency), + ), + ], + [], + ), + ]; +}; + +/** + * Encode a type to a string. All dependant types are alphabetically sorted. + * + * @param {TypedData} typedData + * @param {string} type + * @param {Options} [options] + * @return {string} + */ +const encodeType = (typedData: Eip712TypedData, type: string): string => { + const [primary, ...dependencies] = getDependencies(typedData, type); + // eslint-disable-next-line @typescript-eslint/require-array-sort-compare + const types = [primary, ...dependencies.sort()]; + + return types + .map( + dependency => + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `${dependency}(${typedData.types[dependency].map( + _type => `${_type.type} ${_type.name}`, + )})`, + ) + .join(''); +}; + +/** + * Get a type string as hash. + */ +const getTypeHash = (typedData: Eip712TypedData, type: string) => + keccak256(encodeType(typedData, type)); + +/** + * Get encoded data as a hash. The data should be a key -> value object with all the required values. All dependant + * types are automatically encoded. + */ +const getStructHash = ( + typedData: Eip712TypedData, + type: string, + data: Record, + // eslint-disable-next-line no-use-before-define +): string => keccak256(encodeData(typedData, type, data)); + +/** + * Get the EIP-191 encoded message to sign, from the typedData object. If `hash` is enabled, the message will be hashed + * with Keccak256. + */ +export const getMessage = (typedData: Eip712TypedData, hash?: boolean): string => { + const EIP_191_PREFIX = '1901'; + const message = `0x${EIP_191_PREFIX}${getStructHash( + typedData, + 'EIP712Domain', + typedData.domain as Record, + ).substring(2)}${getStructHash(typedData, typedData.primaryType, typedData.message).substring( + 2, + )}`; + + if (hash) { + return keccak256(message); + } + + return message; +}; + +/** + * Encodes a single value to an ABI serialisable string, number or Buffer. Returns the data as tuple, which consists of + * an array of ABI compatible types, and an array of corresponding values. + */ +const encodeValue = ( + typedData: Eip712TypedData, + type: string, + data: unknown, +): [string, string | Uint8Array | number] => { + const match = type.match(ARRAY_REGEX); + + // Checks for array types + if (match) { + const arrayType = match[1]; + const length = Number(match[2]) || undefined; + + if (!Array.isArray(data)) { + throw new AbiError('Cannot encode data: value is not of array type', { + data, + }); + } + + if (length && data.length !== length) { + throw new AbiError( + `Cannot encode data: expected length of ${length}, but got ${data.length}`, + { + data, + }, + ); + } + + const encodedData = data.map(item => encodeValue(typedData, arrayType, item)); + const types = encodedData.map(item => item[0]); + const values = encodedData.map(item => item[1]); + + return ['bytes32', keccak256(encodeParameters(types, values))]; + } + + if (typedData.types[type]) { + return ['bytes32', getStructHash(typedData, type, data as Record)]; + } + + // Strings and arbitrary byte arrays are hashed to bytes32 + if (type === 'string') { + return ['bytes32', keccak256(data as string)]; + } + + if (type === 'bytes') { + return ['bytes32', keccak256(data as string)]; + } + + return [type, data as string]; +}; + +/** + * Encode the data to an ABI encoded Buffer. The data should be a key -> value object with all the required values. All + * dependant types are automatically encoded. + */ +const encodeData = ( + typedData: Eip712TypedData, + type: string, + data: Record, +): string => { + const [types, values] = typedData.types[type].reduce<[string[], unknown[]]>( + ([_types, _values], field) => { + if (isNullish(data[field.name]) || isNullish(data[field.name])) { + throw new AbiError(`Cannot encode data: missing data for '${field.name}'`, { + data, + field, + }); + } + + const value = data[field.name]; + const [_type, encodedValue] = encodeValue(typedData, field.type, value); + + return [ + [..._types, _type], + [..._values, encodedValue], + ]; + }, + [['bytes32'], [getTypeHash(typedData, type)]], + ); + + return encodeParameters(types, values); +}; diff --git a/packages/web3-eth-abi/src/index.js b/packages/web3-eth-abi/src/index.js deleted file mode 100644 index 34801939265..00000000000 --- a/packages/web3-eth-abi/src/index.js +++ /dev/null @@ -1,442 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file index.js - * @author Marek Kotewicz - * @author Fabian Vogelsteller - * @date 2018 - */ - -var Buffer = require('buffer').Buffer; -var _ = require('underscore'); -var utils = require('web3-utils'); - -var EthersAbiCoder = require('@ethersproject/abi').AbiCoder; -var ParamType = require('@ethersproject/abi').ParamType; -var ethersAbiCoder = new EthersAbiCoder(function (type, value) { - if (type.match(/^u?int/) && !_.isArray(value) && (!_.isObject(value) || value.constructor.name !== 'BN')) { - return value.toString(); - } - return value; -}); - -// result method -function Result() { -} - -/** - * ABICoder prototype should be used to encode/decode solidity params of any type - */ -var ABICoder = function () { -}; - -/** - * Encodes the function name to its ABI representation, which are the first 4 bytes of the sha3 of the function name including types. - * - * @method encodeFunctionSignature - * @param {String|Object} functionName - * @return {String} encoded function name - */ -ABICoder.prototype.encodeFunctionSignature = function (functionName) { - if (_.isObject(functionName)) { - functionName = utils._jsonInterfaceMethodToString(functionName); - } - - return utils.sha3(functionName).slice(0, 10); -}; - -/** - * Encodes the function name to its ABI representation, which are the first 4 bytes of the sha3 of the function name including types. - * - * @method encodeEventSignature - * @param {String|Object} functionName - * @return {String} encoded function name - */ -ABICoder.prototype.encodeEventSignature = function (functionName) { - if (_.isObject(functionName)) { - functionName = utils._jsonInterfaceMethodToString(functionName); - } - - return utils.sha3(functionName); -}; - -/** - * Should be used to encode plain param - * - * @method encodeParameter - * - * @param {String|Object} type - * @param {any} param - * - * @return {String} encoded plain param - */ -ABICoder.prototype.encodeParameter = function (type, param) { - return this.encodeParameters([type], [param]); -}; - -/** - * Should be used to encode list of params - * - * @method encodeParameters - * - * @param {Array} types - * @param {Array} params - * - * @return {String} encoded list of params - */ -ABICoder.prototype.encodeParameters = function (types, params) { - var self = this; - types = self.mapTypes(types); - - params = params.map(function (param, index) { - let type = types[index]; - if (typeof type === 'object' && type.type) { - // We may get a named type of shape {name, type} - type = type.type; - } - - param = self.formatParam(type, param); - - // Format params for tuples - if (typeof type === 'string' && type.includes('tuple')) { - const coder = ethersAbiCoder._getCoder(ParamType.from(type)); - const modifyParams = (coder, param) => { - if (coder.name === 'array') { - return param.map(p => - modifyParams( - ethersAbiCoder._getCoder(ParamType.from(coder.type.replace('[]', ''))), - p - ) - ); - } - coder.coders.forEach((c, i) => { - if (c.name === 'tuple') { - modifyParams(c, param[i]); - } else { - param[i] = self.formatParam(c.name, param[i]); - } - }); - }; - modifyParams(coder, param); - } - - return param; - }); - - return ethersAbiCoder.encode(types, params); -}; - -/** - * Map types if simplified format is used - * - * @method mapTypes - * @param {Array} types - * @return {Array} - */ -ABICoder.prototype.mapTypes = function (types) { - var self = this; - var mappedTypes = []; - types.forEach(function (type) { - // Remap `function` type params to bytes24 since Ethers does not - // recognize former type. Solidity docs say `Function` is a bytes24 - // encoding the contract address followed by the function selector hash. - if (typeof type === 'object' && type.type === 'function'){ - type = Object.assign({}, type, { type: "bytes24" }); - } - if (self.isSimplifiedStructFormat(type)) { - var structName = Object.keys(type)[0]; - mappedTypes.push( - Object.assign( - self.mapStructNameAndType(structName), - { - components: self.mapStructToCoderFormat(type[structName]) - } - ) - ); - - return; - } - - mappedTypes.push(type); - }); - - return mappedTypes; -}; - -/** - * Check if type is simplified struct format - * - * @method isSimplifiedStructFormat - * @param {string | Object} type - * @returns {boolean} - */ -ABICoder.prototype.isSimplifiedStructFormat = function (type) { - return typeof type === 'object' && typeof type.components === 'undefined' && typeof type.name === 'undefined'; -}; - -/** - * Maps the correct tuple type and name when the simplified format in encode/decodeParameter is used - * - * @method mapStructNameAndType - * @param {string} structName - * @return {{type: string, name: *}} - */ -ABICoder.prototype.mapStructNameAndType = function (structName) { - var type = 'tuple'; - - if (structName.indexOf('[]') > -1) { - type = 'tuple[]'; - structName = structName.slice(0, -2); - } - - return {type: type, name: structName}; -}; - -/** - * Maps the simplified format in to the expected format of the ABICoder - * - * @method mapStructToCoderFormat - * @param {Object} struct - * @return {Array} - */ -ABICoder.prototype.mapStructToCoderFormat = function (struct) { - var self = this; - var components = []; - Object.keys(struct).forEach(function (key) { - if (typeof struct[key] === 'object') { - components.push( - Object.assign( - self.mapStructNameAndType(key), - { - components: self.mapStructToCoderFormat(struct[key]) - } - ) - ); - - return; - } - - components.push({ - name: key, - type: struct[key] - }); - }); - - return components; -}; - -/** - * Handle some formatting of params for backwards compatability with Ethers V4 - * - * @method formatParam - * @param {String} - type - * @param {any} - param - * @return {any} - The formatted param - */ -ABICoder.prototype.formatParam = function (type, param) { - const paramTypeBytes = new RegExp(/^bytes([0-9]*)$/); - const paramTypeBytesArray = new RegExp(/^bytes([0-9]*)\[\]$/); - const paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/); - const paramTypeNumberArray = new RegExp(/^(u?int)([0-9]*)\[\]$/); - - // Format BN to string - if (utils.isBN(param) || utils.isBigNumber(param)) { - return param.toString(10); - } - - if (type.match(paramTypeBytesArray) || type.match(paramTypeNumberArray)) { - return param.map(p => this.formatParam(type.replace('[]', ''), p)); - } - - // Format correct width for u?int[0-9]* - let match = type.match(paramTypeNumber); - if (match) { - let size = parseInt(match[2] || "256"); - if (size / 8 < param.length) { - // pad to correct bit width - param = utils.leftPad(param, size); - } - } - - // Format correct length for bytes[0-9]+ - match = type.match(paramTypeBytes); - if (match) { - if (Buffer.isBuffer(param)) { - param = utils.toHex(param); - } - - // format to correct length - let size = parseInt(match[1]); - if (size) { - let maxSize = size * 2; - if (param.substring(0, 2) === '0x') { - maxSize += 2; - } - if (param.length < maxSize) { - // pad to correct length - param = utils.rightPad(param, size * 2); - } - } - - // format odd-length bytes to even-length - if (param.length % 2 === 1) { - param = '0x0' + param.substring(2); - } - } - - return param; -}; - -/** - * Encodes a function call from its json interface and parameters. - * - * @method encodeFunctionCall - * @param {Array} jsonInterface - * @param {Array} params - * @return {String} The encoded ABI for this function call - */ -ABICoder.prototype.encodeFunctionCall = function (jsonInterface, params) { - return this.encodeFunctionSignature(jsonInterface) + this.encodeParameters(jsonInterface.inputs, params).replace('0x', ''); -}; - -/** - * Should be used to decode bytes to plain param - * - * @method decodeParameter - * @param {String} type - * @param {String} bytes - * @return {Object} plain param - */ -ABICoder.prototype.decodeParameter = function (type, bytes) { - return this.decodeParameters([type], bytes)[0]; -}; - -/** - * Should be used to decode list of params - * - * @method decodeParameter - * @param {Array} outputs - * @param {String} bytes - * @return {Array} array of plain params - */ -ABICoder.prototype.decodeParameters = function (outputs, bytes) { - return this.decodeParametersWith(outputs, bytes, false); -} - -/** - * Should be used to decode list of params - * - * @method decodeParameter - * @param {Array} outputs - * @param {String} bytes - * @param {Boolean} loose - * @return {Array} array of plain params - */ -ABICoder.prototype.decodeParametersWith = function (outputs, bytes, loose) { - if (outputs.length > 0 && (!bytes || bytes === '0x' || bytes === '0X')) { - throw new Error( - 'Returned values aren\'t valid, did it run Out of Gas? ' + - 'You might also see this error if you are not using the ' + - 'correct ABI for the contract you are retrieving data from, ' + - 'requesting data from a block number that does not exist, ' + - 'or querying a node which is not fully synced.' - ); - } - - var res = ethersAbiCoder.decode(this.mapTypes(outputs), '0x' + bytes.replace(/0x/i, ''), loose); - var returnValue = new Result(); - returnValue.__length__ = 0; - - outputs.forEach(function (output, i) { - var decodedValue = res[returnValue.__length__]; - decodedValue = (decodedValue === '0x') ? null : decodedValue; - - returnValue[i] = decodedValue; - - if (_.isObject(output) && output.name) { - returnValue[output.name] = decodedValue; - } - - returnValue.__length__++; - }); - - return returnValue; -}; - -/** - * Decodes events non- and indexed parameters. - * - * @method decodeLog - * @param {Object} inputs - * @param {String} data - * @param {Array} topics - * @return {Array} array of plain params - */ -ABICoder.prototype.decodeLog = function (inputs, data, topics) { - var _this = this; - topics = _.isArray(topics) ? topics : [topics]; - - data = data || ''; - - var notIndexedInputs = []; - var indexedParams = []; - var topicCount = 0; - - // TODO check for anonymous logs? - - inputs.forEach(function (input, i) { - if (input.indexed) { - indexedParams[i] = (['bool', 'int', 'uint', 'address', 'fixed', 'ufixed'].find(function (staticType) { - return input.type.indexOf(staticType) !== -1; - })) ? _this.decodeParameter(input.type, topics[topicCount]) : topics[topicCount]; - topicCount++; - } else { - notIndexedInputs[i] = input; - } - }); - - - var nonIndexedData = data; - var notIndexedParams = (nonIndexedData) ? this.decodeParametersWith(notIndexedInputs, nonIndexedData, true) : []; - - var returnValue = new Result(); - returnValue.__length__ = 0; - - - inputs.forEach(function (res, i) { - returnValue[i] = (res.type === 'string') ? '' : null; - - if (typeof notIndexedParams[i] !== 'undefined') { - returnValue[i] = notIndexedParams[i]; - } - if (typeof indexedParams[i] !== 'undefined') { - returnValue[i] = indexedParams[i]; - } - - if (res.name) { - returnValue[res.name] = returnValue[i]; - } - - returnValue.__length__++; - }); - - return returnValue; -}; - -var coder = new ABICoder(); - -module.exports = coder; diff --git a/packages/web3-eth-abi/src/index.ts b/packages/web3-eth-abi/src/index.ts new file mode 100644 index 00000000000..50886679928 --- /dev/null +++ b/packages/web3-eth-abi/src/index.ts @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './api/errors_api.js'; +export * from './api/events_api.js'; +export * from './api/functions_api.js'; +export * from './api/logs_api.js'; +export * from './api/parameters_api.js'; +export * from './utils.js'; +export * from './decode_contract_error_data.js'; +export { getMessage as getEncodedEip712Data } from './eip_712.js'; diff --git a/packages/web3-eth-abi/src/utils.ts b/packages/web3-eth-abi/src/utils.ts new file mode 100644 index 00000000000..79c15b78d78 --- /dev/null +++ b/packages/web3-eth-abi/src/utils.ts @@ -0,0 +1,266 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { isNullish, isUint8Array, leftPad, rightPad, toHex } from 'web3-utils'; +import { + AbiInput, + AbiCoderStruct, + AbiFragment, + AbiParameter, + AbiStruct, + AbiEventFragment, + AbiFunctionFragment, + AbiConstructorFragment, +} from 'web3-types'; + +export const isAbiFragment = (item: unknown): item is AbiFragment => + !isNullish(item) && + typeof item === 'object' && + !isNullish((item as { type: string }).type) && + ['function', 'event', 'constructor', 'error'].includes((item as { type: string }).type); + +export const isAbiErrorFragment = (item: unknown): item is AbiEventFragment => + !isNullish(item) && + typeof item === 'object' && + !isNullish((item as { type: string }).type) && + (item as { type: string }).type === 'error'; + +export const isAbiEventFragment = (item: unknown): item is AbiEventFragment => + !isNullish(item) && + typeof item === 'object' && + !isNullish((item as { type: string }).type) && + (item as { type: string }).type === 'event'; + +export const isAbiFunctionFragment = (item: unknown): item is AbiFunctionFragment => + !isNullish(item) && + typeof item === 'object' && + !isNullish((item as { type: string }).type) && + (item as { type: string }).type === 'function'; + +export const isAbiConstructorFragment = (item: unknown): item is AbiConstructorFragment => + !isNullish(item) && + typeof item === 'object' && + !isNullish((item as { type: string }).type) && + (item as { type: string }).type === 'constructor'; + +/** + * Check if type is simplified struct format + */ +export const isSimplifiedStructFormat = ( + type: string | Partial | Partial, +): type is Omit => + typeof type === 'object' && + typeof (type as { components: unknown }).components === 'undefined' && + typeof (type as { name: unknown }).name === 'undefined'; + +/** + * Maps the correct tuple type and name when the simplified format in encode/decodeParameter is used + */ +export const mapStructNameAndType = (structName: string): AbiStruct => + structName.includes('[]') + ? { type: 'tuple[]', name: structName.slice(0, -2) } + : { type: 'tuple', name: structName }; + +/** + * Maps the simplified format in to the expected format of the ABICoder + */ +export const mapStructToCoderFormat = (struct: AbiStruct): Array => { + const components: Array = []; + + for (const key of Object.keys(struct)) { + const item = struct[key]; + + if (typeof item === 'object') { + components.push({ + ...mapStructNameAndType(key), + components: mapStructToCoderFormat(item as unknown as AbiStruct), + }); + } else { + components.push({ + name: key, + type: struct[key] as string, + }); + } + } + return components; +}; + +/** + * Map types if simplified format is used + */ +export const mapTypes = ( + types: AbiInput[], +): Array> => { + const mappedTypes: Array> = []; + + for (const type of types) { + let modifiedType = type; + + // Clone object + if (typeof type === 'object') { + modifiedType = { ...type }; + } + + // Remap `function` type params to bytes24 since Ethers does not + // recognize former type. Solidity docs say `Function` is a bytes24 + // encoding the contract address followed by the function selector hash. + if (typeof type === 'object' && type.type === 'function') { + modifiedType = { ...type, type: 'bytes24' }; + } + + if (isSimplifiedStructFormat(modifiedType)) { + const structName = Object.keys(modifiedType)[0] as unknown as keyof typeof modifiedType; + + mappedTypes.push({ + ...mapStructNameAndType(structName), + components: mapStructToCoderFormat( + modifiedType[structName] as unknown as AbiStruct, + ) as unknown as AbiParameter[], + }); + } else { + mappedTypes.push(modifiedType); + } + } + + return mappedTypes; +}; + +/** + * returns true if input is a hexstring and is odd-lengthed + */ +export const isOddHexstring = (param: unknown): boolean => + typeof param === 'string' && /^(-)?0x[0-9a-f]*$/i.test(param) && param.length % 2 === 1; + +/** + * format odd-length bytes to even-length + */ +export const formatOddHexstrings = (param: string): string => + isOddHexstring(param) ? `0x0${param.substring(2)}` : param; + +const paramTypeBytes = /^bytes([0-9]*)$/; +const paramTypeBytesArray = /^bytes([0-9]*)\[\]$/; +const paramTypeNumber = /^(u?int)([0-9]*)$/; +const paramTypeNumberArray = /^(u?int)([0-9]*)\[\]$/; +/** + * Handle some formatting of params for backwards compatibility with Ethers V4 + */ +export const formatParam = (type: string, _param: unknown): unknown => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + + // clone if _param is an object + const param = typeof _param === 'object' && !Array.isArray(_param) ? { ..._param } : _param; + + // Format BN to string + if (param instanceof BigInt || typeof param === 'bigint') { + return param.toString(10); + } + + if (paramTypeBytesArray.exec(type) || paramTypeNumberArray.exec(type)) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + const paramClone = [...(param as Array)]; + return paramClone.map(p => formatParam(type.replace('[]', ''), p)); + } + + // Format correct width for u?int[0-9]* + let match = paramTypeNumber.exec(type); + if (match) { + const size = parseInt(match[2] ? match[2] : '256', 10); + if (size / 8 < (param as { length: number }).length) { + // pad to correct bit width + return leftPad(param as string, size); + } + } + + // Format correct length for bytes[0-9]+ + match = paramTypeBytes.exec(type); + if (match) { + const hexParam = isUint8Array(param) ? toHex(param) : param; + + // format to correct length + const size = parseInt(match[1], 10); + if (size) { + let maxSize = size * 2; + + if ((param as string).startsWith('0x')) { + maxSize += 2; + } + // pad to correct length + const paddedParam = + (hexParam as string).length < maxSize + ? rightPad(param as string, size * 2) + : hexParam; + return formatOddHexstrings(paddedParam as string); + } + + return formatOddHexstrings(hexParam as string); + } + return param; +}; + +/** + * used to flatten json abi inputs/outputs into an array of type-representing-strings + */ + +export const flattenTypes = ( + includeTuple: boolean, + puts: ReadonlyArray, +): string[] => { + const types: string[] = []; + + puts.forEach(param => { + if (typeof param.components === 'object') { + if (!param.type.startsWith('tuple')) { + throw new AbiError( + `Invalid value given "${param.type}". Error: components found but type is not tuple.`, + ); + } + const arrayBracket = param.type.indexOf('['); + const suffix = arrayBracket >= 0 ? param.type.substring(arrayBracket) : ''; + const result = flattenTypes(includeTuple, param.components); + + if (Array.isArray(result) && includeTuple) { + types.push(`tuple(${result.join(',')})${suffix}`); + } else if (!includeTuple) { + types.push(`(${result.join(',')})${suffix}`); + } else { + types.push(`(${result.join()})`); + } + } else { + types.push(param.type); + } + }); + + return types; +}; + +/** + * Should be used to create full function/event name from json abi + * returns a string + */ +export const jsonInterfaceMethodToString = (json: AbiFragment): string => { + if (isAbiErrorFragment(json) || isAbiEventFragment(json) || isAbiFunctionFragment(json)) { + if (json.name?.includes('(')) { + return json.name; + } + + return `${json.name ?? ''}(${flattenTypes(false, json.inputs ?? []).join(',')})`; + } + + // Constructor fragment + return `(${flattenTypes(false, json.inputs ?? []).join(',')})`; +}; diff --git a/packages/web3-eth-abi/test/.eslintrc.js b/packages/web3-eth-abi/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-eth-abi/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-abi/test/config/jest.config.js b/packages/web3-eth-abi/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3-eth-abi/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-eth-abi/test/config/setup.js b/packages/web3-eth-abi/test/config/setup.js new file mode 100644 index 00000000000..d6d6c564527 --- /dev/null +++ b/packages/web3-eth-abi/test/config/setup.js @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-eth-abi/test/fixtures/abitestsdata.json b/packages/web3-eth-abi/test/fixtures/abitestsdata.json new file mode 100644 index 00000000000..14b1af0ccb0 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/abitestsdata.json @@ -0,0 +1,86632 @@ +[ + { + "name": "random-((string))", + "type": "((string))", + "value": [["Moo é🚀 éooM🚀🚀ooMoo🚀M🚀ooooMé🚀éé🚀é 🚀M 🚀 ooéoéM"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éooM🚀🚀ooMoo🚀M🚀ooooMé🚀éé🚀é 🚀M 🚀 ooéoéM" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610199806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ac565b60405180910390f35b60408051808201909152606060208201908152815260408051808201909152606060208201908152815260408051602081019091526060815260006040518060800160405280604f8152602001610115604f91398252508152919050565b600060208083528351818285015280519050816040850152805180606086015260005b818110156100eb578281018401518682016080015283016100cf565b818111156100fd576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a8020c3a96f6f4df09f9a80f09f9a806f6f4d6f6ff09f9a804df09f9a806f6f6f6f4dc3a9f09f9a80c3a9c3a9f09f9a80c3a920f09f9a804d20f09f9a80206f6fc3a96fc3a94da26469706673582212205c11039b5dafbaf421f0109e51e8f4662430f78a30191fd97c9dadd6dfa20b3664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_5ea5d66d {\n S_97fc4627 s_0;\n }\n\n function test () public pure returns (S_5ea5d66d memory) {\n S_5ea5d66d memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 éooM🚀🚀ooMoo🚀M🚀ooooMé🚀éé🚀é 🚀M 🚀 ooéoéM\";\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a8020c3a96f6f4df09f9a80f09f9a806f6f4d6f6ff09f9a804df09f9a806f6f6f6f4dc3a9f09f9a80c3a9c3a9f09f9a80c3a920f09f9a804d20f09f9a80206f6fc3a96fc3a94d0000000000000000000000000000000000" + }, + { + "name": "random-((uint16))", + "type": "((uint16))", + "value": [["16180"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "16180" + } + ] + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260006020808301828152909252825180840184528083019182529081528251918201909252613f348152815260405190515161ffff16815260200160405180910390f3fea2646970667358221220598ebe5e371d88deaa75b4d935f46cf5fe504fa1fd158c0c660afbc48055de4a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_267213ef {\n uint16 s_0;\n }\n\n struct S_92a3c0c7 {\n S_267213ef s_0;\n }\n\n function test () public pure returns (S_92a3c0c7 memory) {\n S_92a3c0c7 memory r;\n {\n S_267213ef memory r_0;\n {\n uint16 r_0_0 = 16180;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000003f34" + }, + { + "name": "random-(address)", + "type": "(address)", + "value": ["0xA85DE98436C142F3CB0F727669C1438481c6287E"], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA85DE98436C142F3CB0F727669C1438481c6287E" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060a28061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835273a85de98436c142f3cb0f727669c1438481c6287e9081905282519081529151918290030190f3fea264697066735822122047335b3e176fff1aab4b3ed5a4bb776911a5f963a936a8e38e01feb4ca5253ee64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n function test () public pure returns (S_421683f8 memory) {\n S_421683f8 memory r;\n {\n address r_0 = 0xA85DE98436C142F3CB0F727669C1438481c6287E;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000a85de98436c142f3cb0f727669c1438481c6287e" + }, + { + "name": "random-(bool)", + "type": "(bool)", + "value": [true], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608f8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835260019081905282519081529151918290030190f3fea26469706673582212201073a4e507b400849eb27b71c8bcbd3d72793bdb17bf93281a2f401a23c227f064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n function test () public pure returns (S_c1053bda memory) {\n S_c1053bda memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bytes1)", + "type": "(bytes1)", + "value": ["0x7e"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7e" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060928061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160208082018352600090915281518082018352603f60f91b9081905282519081529151918290030190f3fea2646970667358221220386f7afee78977eaeedc6b9c747c78cab135f8ccbeb6767b57e7687bad833c7f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_042b2302 {\n bytes1 s_0;\n }\n\n function test () public pure returns (S_042b2302 memory) {\n S_042b2302 memory r;\n {\n bytes1 r_0 = bytes1(0x7e);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x7e00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes10)", + "type": "(bytes10)", + "value": ["0x66797f01a6c8ae85d634"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x66797f01a6c8ae85d634" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b50609b8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835269199e5fc069b22ba1758d60b21b9081905282519081529151918290030190f3fea26469706673582212206118c83566b3bd1e76e7c21aa0461ac5325d8c9c4e73e1b33ab2557fb2ec368464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6ebf9ebb {\n bytes10 s_0;\n }\n\n function test () public pure returns (S_6ebf9ebb memory) {\n S_6ebf9ebb memory r;\n {\n bytes10 r_0 = bytes10(0x66797f01a6c8ae85d634);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x66797f01a6c8ae85d63400000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes14)", + "type": "(bytes14)", + "value": ["0xe12ab06442648cc40bb1f74fb803"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe12ab06442648cc40bb1f74fb803" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b50609f8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183526de12ab06442648cc40bb1f74fb80360901b9081905282519081529151918290030190f3fea264697066735822122075220b15dff30d0536923822109629e83cce5b7d4e0c72d19de09803ef72065064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d5bccb4a {\n bytes14 s_0;\n }\n\n function test () public pure returns (S_d5bccb4a memory) {\n S_d5bccb4a memory r;\n {\n bytes14 r_0 = bytes14(0xe12ab06442648cc40bb1f74fb803);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xe12ab06442648cc40bb1f74fb803000000000000000000000000000000000000" + }, + { + "name": "random-(bytes16)", + "type": "(bytes16)", + "value": ["0x1b192d259d4a003d63d4fa10cf5180a1"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x1b192d259d4a003d63d4fa10cf5180a1" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060a18061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183526f1b192d259d4a003d63d4fa10cf5180a160801b9081905282519081529151918290030190f3fea2646970667358221220622d271d37b9c44a1465479b9a46117bf2377bc480f1f92ddaa18e10d8a9ae2364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a1126f25 {\n bytes16 s_0;\n }\n\n function test () public pure returns (S_a1126f25 memory) {\n S_a1126f25 memory r;\n {\n bytes16 r_0 = bytes16(0x1b192d259d4a003d63d4fa10cf5180a1);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x1b192d259d4a003d63d4fa10cf5180a100000000000000000000000000000000" + }, + { + "name": "random-(bytes21)", + "type": "(bytes21)", + "value": ["0xf0ab471b24e8861217784778e5e988d2db7e116eb0"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf0ab471b24e8861217784778e5e988d2db7e116eb0" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060a68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160208082018352600090915281518082018352740f0ab471b24e8861217784778e5e988d2db7e116eb605c1b9081905282519081529151918290030190f3fea26469706673582212205b57d6db89296344bcbc9f0fa4ea6e7b2495de3540232363a7677cea32549dde64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_29c3139a {\n bytes21 s_0;\n }\n\n function test () public pure returns (S_29c3139a memory) {\n S_29c3139a memory r;\n {\n bytes21 r_0 = bytes21(0xf0ab471b24e8861217784778e5e988d2db7e116eb0);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xf0ab471b24e8861217784778e5e988d2db7e116eb00000000000000000000000" + }, + { + "name": "random-(bytes24)", + "type": "(bytes24)", + "value": ["0xdc342499cfae666808f0ee94fd4ff08931aad5be0e505d3c"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xdc342499cfae666808f0ee94fd4ff08931aad5be0e505d3c" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ae8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183527fdc342499cfae666808f0ee94fd4ff08931aad5be0e505d3c00000000000000009081905282519081529151918290030190f3fea2646970667358221220777cf6e52989ed92a7fadb9fbf8dfe440701fb51c482765f2de1d3ad360ad0e764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fce5fa1a {\n bytes24 s_0;\n }\n\n function test () public pure returns (S_fce5fa1a memory) {\n S_fce5fa1a memory r;\n {\n bytes24 r_0 = bytes24(0xdc342499cfae666808f0ee94fd4ff08931aad5be0e505d3c);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xdc342499cfae666808f0ee94fd4ff08931aad5be0e505d3c0000000000000000" + }, + { + "name": "random-(bytes25)", + "type": "(bytes25)", + "value": ["0xb223b86d8033db9687864c5442845456933d821b815db3e02d"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb223b86d8033db9687864c5442845456933d821b815db3e02d" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ae8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183527fb223b86d8033db9687864c5442845456933d821b815db3e02d000000000000009081905282519081529151918290030190f3fea2646970667358221220f15492c66d9aad3538ccf3088da4b19c34789eb2af150ec3df26e64d4e5fc12b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_28cc611d {\n bytes25 s_0;\n }\n\n function test () public pure returns (S_28cc611d memory) {\n S_28cc611d memory r;\n {\n bytes25 r_0 = bytes25(0xb223b86d8033db9687864c5442845456933d821b815db3e02d);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xb223b86d8033db9687864c5442845456933d821b815db3e02d00000000000000" + }, + { + "name": "random-(bytes6)", + "type": "(bytes6)", + "value": ["0x21f16141a002"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x21f16141a002" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060978061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183526510f8b0a0d00160d11b9081905282519081529151918290030190f3fea2646970667358221220c2e1644690044dcfd103a183df324067dfdbfe3de73ee4e4ece5fd279249d67964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a3f0fe8b {\n bytes6 s_0;\n }\n\n function test () public pure returns (S_a3f0fe8b memory) {\n S_a3f0fe8b memory r;\n {\n bytes6 r_0 = bytes6(0x21f16141a002);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x21f16141a0020000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes8)", + "type": "(bytes8)", + "value": ["0xe4092c7e602f2769"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe4092c7e602f2769" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835267e4092c7e602f276960c01b9081905282519081529151918290030190f3fea2646970667358221220cbecfe5100940c7413702264bac8b0d09e3b4fe6d6d3f8fb0f9d79816ffc227f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b915b7d0 {\n bytes8 s_0;\n }\n\n function test () public pure returns (S_b915b7d0 memory) {\n S_b915b7d0 memory r;\n {\n bytes8 r_0 = bytes8(0xe4092c7e602f2769);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xe4092c7e602f2769000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int16)", + "type": "(int16)", + "value": ["-27402"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-27402" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060918061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160208082018352600090915281518082018352616b09199081905282519081529151918290030190f3fea26469706673582212200800c35dc1dcb7ea848ec2194efefeeb42c3ba66763aa3f2f3f89cd4f4ac5c0564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_26007289 {\n int16 s_0;\n }\n\n function test () public pure returns (S_26007289 memory) {\n S_26007289 memory r;\n {\n int16 r_0 = -27402;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94f6" + }, + { + "name": "random-(int200)", + "type": "(int200)", + "value": ["-543743724524076305014218871275020539778907053744360586100627"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-543743724524076305014218871275020539778907053744360586100627" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060a88061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835278569f955e3df69009921503322d4ac3c079bab87b6b8df63f92199081905282519081529151918290030190f3fea2646970667358221220356641e67406ad07fdb771bd57c2df8ccadafecddd7d1958615ad07488c9c4ed64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_530fe426 {\n int200 s_0;\n }\n\n function test () public pure returns (S_530fe426 memory) {\n S_530fe426 memory r;\n {\n int200 r_0 = -543743724524076305014218871275020539778907053744360586100627;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffa9606aa1c2096ff66deafccdd2b53c3f86454784947209c06d" + }, + { + "name": "random-(int232)", + "type": "(int232)", + "value": ["-2618176276362370898099084067003760844264514476765138906113408408975639"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-2618176276362370898099084067003760844264514476765138906113408408975639" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ae8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183527fffffff9ee2ee0734d2824e1ee6d0bc473c5d6e23df3387cf1ee3a7da398886e99081905282519081529151918290030190f3fea2646970667358221220efaf284d7246228597fb0eb00f16e0d1153030d0521c4ad5bf360bb2ae5ca52b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f2e9ab46 {\n int232 s_0;\n }\n\n function test () public pure returns (S_f2e9ab46 memory) {\n S_f2e9ab46 memory r;\n {\n int232 r_0 = -2618176276362370898099084067003760844264514476765138906113408408975639;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffff9ee2ee0734d2824e1ee6d0bc473c5d6e23df3387cf1ee3a7da398886e9" + }, + { + "name": "random-(int24)", + "type": "(int24)", + "value": ["-17668"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-17668" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060918061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160208082018352600090915281518082018352614503199081905282519081529151918290030190f3fea26469706673582212203eb286356364c25876340972391eb8fc8db6eb84094f3893ae36ce89a4796aa064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a9554343 {\n int24 s_0;\n }\n\n function test () public pure returns (S_a9554343 memory) {\n S_a9554343 memory r;\n {\n int24 r_0 = -17668;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbafc" + }, + { + "name": "random-(int256)", + "type": "(int256)", + "value": ["27802518402575066607249769491585535785998548161249427099741273810538706891652"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "27802518402575066607249769491585535785998548161249427099741273810538706891652" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060b18061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160208082018352600090915281519081019091527f3d77aaf2a26292612f77f218a76f2bb30e4a7289d62dfe1930434ef806b5f38481526040519051815260200160405180910390f3fea2646970667358221220cbc7206b46315a30707e3f1303c033418de4fe1cc8afe45a0cb961586386e62a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f6107def {\n int256 s_0;\n }\n\n function test () public pure returns (S_f6107def memory) {\n S_f6107def memory r;\n {\n int256 r_0 = 27802518402575066607249769491585535785998548161249427099741273810538706891652;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x3d77aaf2a26292612f77f218a76f2bb30e4a7289d62dfe1930434ef806b5f384" + }, + { + "name": "random-(int56)", + "type": "(int56)", + "value": ["22658172671604279"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "22658172671604279" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060958061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835266507f7ced59b6379081905282519081529151918290030190f3fea264697066735822122086d7b676336d976f36731ab967758df117478dfdfab8eada0efb06e4227bcfb764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_14df74d1 {\n int56 s_0;\n }\n\n function test () public pure returns (S_14df74d1 memory) {\n S_14df74d1 memory r;\n {\n int56 r_0 = 22658172671604279;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000507f7ced59b637" + }, + { + "name": "random-(int80)", + "type": "(int80)", + "value": ["-597361723518518618222556"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-597361723518518618222556" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160208082018352600090915281518082018352697e7f0b3e560999cbefdb199081905282519081529151918290030190f3fea2646970667358221220472c195a8b23c759e2178f982f923b9ff71943e2567079518053960d4a86fe5964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5e77151a {\n int80 s_0;\n }\n\n function test () public pure returns (S_5e77151a memory) {\n S_5e77151a memory r;\n {\n int80 r_0 = -597361723518518618222556;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffff8180f4c1a9f666341024" + }, + { + "name": "random-(string)", + "type": "(string)", + "value": ["Moo é🚀Mo🚀M🚀éoo🚀Moo🚀🚀 🚀 oo o🚀M MoMoéoé🚀 o🚀M 🚀oo"], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo🚀M🚀éoo🚀Moo🚀🚀 🚀 oo o🚀M MoMoéoé🚀 o🚀M 🚀oo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610178806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061008f565b60405180910390f35b60408051602081019091526060815260408051602081019091526060815260006040518060800160405280605581526020016100ee60559139825250919050565b6000602080835283518182850152805180604086015260005b818110156100c4578281018401518682016060015283016100a8565b818111156100d6576000606083880101525b50601f01601f19169390930160600194935050505056fe4d6f6f20c3a9f09f9a804d6ff09f9a804df09f9a80c3a96f6ff09f9a804d6f6ff09f9a80f09f9a8020f09f9a802020206f6f206ff09f9a804d204d6f4d6fc3a96fc3a9f09f9a80206ff09f9a804d20f09f9a806f6fa2646970667358221220191e3a197d2921e20bd5c773ce3404e4c844fbbcd4dd6d022bb07d8fa132339764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n function test () public pure returns (S_97fc4627 memory) {\n S_97fc4627 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀Mo🚀M🚀éoo🚀Moo🚀🚀 🚀 oo o🚀M MoMoéoé🚀 o🚀M 🚀oo\";\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a804d6ff09f9a804df09f9a80c3a96f6ff09f9a804d6f6ff09f9a80f09f9a8020f09f9a802020206f6f206ff09f9a804d204d6f4d6fc3a96fc3a9f09f9a80206ff09f9a804d20f09f9a806f6f0000000000000000000000" + }, + { + "name": "random-(uint128)", + "type": "(uint128)", + "value": ["78162529404699341344790272052163598633"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "78162529404699341344790272052163598633" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b50609e8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183526f3acd8e3b35793d1e9c4b377005a159299081905282519081529151918290030190f3fea264697066735822122032d38ad66b0d24fa2ddfb068bc8d9eb98a9809c91c66359eaec8f322a6c6727f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_26255fcf {\n uint128 s_0;\n }\n\n function test () public pure returns (S_26255fcf memory) {\n S_26255fcf memory r;\n {\n uint128 r_0 = 78162529404699341344790272052163598633;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000003acd8e3b35793d1e9c4b377005a15929" + }, + { + "name": "random-(uint16)", + "type": "(uint16)", + "value": ["9275"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "9275" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060908061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835261243b9081905282519081529151918290030190f3fea264697066735822122003b3dffadacfb304679415e028c922e1d6bd00705e9780659ee79c9ec82010bf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_267213ef {\n uint16 s_0;\n }\n\n function test () public pure returns (S_267213ef memory) {\n S_267213ef memory r;\n {\n uint16 r_0 = 9275;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000243b" + }, + { + "name": "random-(uint216)", + "type": "(uint216)", + "value": ["3044574225585255785909769824617452177609355233879489853710262367"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "3044574225585255785909769824617452177609355233879489853710262367" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060a98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183527a0766a4a83bc88c18803900d1895e9b73eb25f63ed0845f34d9e05f9081905282519081529151918290030190f3fea26469706673582212205416f08a3481c848a8ffe35ee83c78612da518f03a0682b7f960a5ba0a64413064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_070be4eb {\n uint216 s_0;\n }\n\n function test () public pure returns (S_070be4eb memory) {\n S_070be4eb memory r;\n {\n uint216 r_0 = 3044574225585255785909769824617452177609355233879489853710262367;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000766a4a83bc88c18803900d1895e9b73eb25f63ed0845f34d9e05f" + }, + { + "name": "random-(uint224)", + "type": "(uint224)", + "value": ["1282084592987022422242522085630842818150387711887499434337293747163"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "1282084592987022422242522085630842818150387711887499434337293747163" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060aa8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183527b0c2c9333729075a2b70fc0b17606e5d0aca2fd6a68a4e81753e2c3db9081905282519081529151918290030190f3fea2646970667358221220e99453e1e827d2873f7546efefba22dd8d0431f3e7c5085ddebbc8147ec1302164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1fc0f737 {\n uint224 s_0;\n }\n\n function test () public pure returns (S_1fc0f737 memory) {\n S_1fc0f737 memory r;\n {\n uint224 r_0 = 1282084592987022422242522085630842818150387711887499434337293747163;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000c2c9333729075a2b70fc0b17606e5d0aca2fd6a68a4e81753e2c3db" + }, + { + "name": "random-(uint24)", + "type": "(uint24)", + "value": ["1174031"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "1174031" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060918061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183526211ea0f9081905282519081529151918290030190f3fea26469706673582212204b5652923cae9eb53f531ae6a9b7aa368a0fa6b2ff4ab863dcf9b5fc5d7ac6f764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5f492329 {\n uint24 s_0;\n }\n\n function test () public pure returns (S_5f492329 memory) {\n S_5f492329 memory r;\n {\n uint24 r_0 = 1174031;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000011ea0f" + }, + { + "name": "random-(uint40)", + "type": "(uint40)", + "value": ["975645451054"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "975645451054" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060938061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260009091528151808201835264e32900232e9081905282519081529151918290030190f3fea26469706673582212209c95221f6c7d8a8aee35ab6dd44a240198dd10320af0f9bec7969f188a2fc62164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9181b294 {\n uint40 s_0;\n }\n\n function test () public pure returns (S_9181b294 memory) {\n S_9181b294 memory r;\n {\n uint40 r_0 = 975645451054;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000e32900232e" + }, + { + "name": "random-(uint64)", + "type": "(uint64)", + "value": ["4247559938102816625"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "4247559938102816625" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160208082018352600090915281518082018352673af25d4258cc6f719081905282519081529151918290030190f3fea26469706673582212206fd7bc2f2124824af078aebef3e62b627e47e397aeca48c329a116472ac6ae4764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f1b7aa7b {\n uint64 s_0;\n }\n\n function test () public pure returns (S_f1b7aa7b memory) {\n S_f1b7aa7b memory r;\n {\n uint64 r_0 = 4247559938102816625;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000003af25d4258cc6f71" + }, + { + "name": "random-(uint72)", + "type": "(uint72)", + "value": ["2250494111447602377695"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "2250494111447602377695" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060978061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183526879ffe136bb96b333df9081905282519081529151918290030190f3fea26469706673582212206062c12fb307ce8110450b30bea5219bb730b25b8acdaf516041ac18cb971ab664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bdee8c4b {\n uint72 s_0;\n }\n\n function test () public pure returns (S_bdee8c4b memory) {\n S_bdee8c4b memory r;\n {\n uint72 r_0 = 2250494111447602377695;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000079ffe136bb96b333df" + }, + { + "name": "random-(uint80)", + "type": "(uint80)", + "value": ["122208858707769561411055"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "122208858707769561411055" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060988061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602080820183526000909152815180820183526919e0f49c006ecc136def9081905282519081529151918290030190f3fea264697066735822122059b341ad0690f963b924a810663383db317b1863e882d919d1818e49f27db01764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_54896afd {\n uint80 s_0;\n }\n\n function test () public pure returns (S_54896afd memory) {\n S_54896afd memory r;\n {\n uint80 r_0 = 122208858707769561411055;\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000019e0f49c006ecc136def" + }, + { + "name": "random-address", + "type": "address", + "value": "0x01010D8955e5cECc6705b73064baA37a703d65cB", + "verbose": { + "type": "address", + "value": "0x01010D8955e5cECc6705b73064baA37a703d65cB" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608a8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517301010d8955e5cecc6705b73064baa37a703d65cb815290519081900360200190f3fea2646970667358221220c10ff6617b6805e55dadad03258bca32e620f027e65e5738959badcf635a291864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address) {\n address r = 0x01010D8955e5cECc6705b73064baA37a703d65cB;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000001010d8955e5cecc6705b73064baa37a703d65cb" + }, + { + "name": "random-bool", + "type": "bool", + "value": false, + "verbose": { + "type": "boolean", + "value": false + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607780601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516000815290519081900360200190f3fea2646970667358221220284cde3c646ece15e9b9a8fc7672ad2026e2203570d0f7947e2e2eb79cd4beb064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool) {\n bool r = false;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes1", + "type": "bytes1", + "value": "0xe6", + "verbose": { + "type": "hexstring", + "value": "0xe6" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607a80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051607360f91b815290519081900360200190f3fea2646970667358221220215dfecec49ae4340c0d8ae821b33c44ffeaf99665a08cfd7e71de90179cbceb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes1) {\n bytes1 r = bytes1(0xe6);\n return r;\n }\n}", + "encoded": "0xe600000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes10", + "type": "bytes10", + "value": "0x40aea19dcc610d8b16d4", + "verbose": { + "type": "hexstring", + "value": "0x40aea19dcc610d8b16d4" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608380601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805169102ba86773184362c5b560b21b815290519081900360200190f3fea26469706673582212200024bf9b69cebc60bd86a6a218b11a0ccc86e7e51b71d446294d29b32819dd7164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes10) {\n bytes10 r = bytes10(0x40aea19dcc610d8b16d4);\n return r;\n }\n}", + "encoded": "0x40aea19dcc610d8b16d400000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes11", + "type": "bytes11", + "value": "0xd44e3a9fa2701442669492", + "verbose": { + "type": "hexstring", + "value": "0xd44e3a9fa2701442669492" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608480601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516a6a271d4fd1380a21334a4960a91b815290519081900360200190f3fea26469706673582212208df4350a579ca2373fa2cedce5ba3895cc881dab21679822fe94f48a7348f89064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes11) {\n bytes11 r = bytes11(0xd44e3a9fa2701442669492);\n return r;\n }\n}", + "encoded": "0xd44e3a9fa2701442669492000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes12", + "type": "bytes12", + "value": "0x877f9779d5743ea8b00feb67", + "verbose": { + "type": "hexstring", + "value": "0x877f9779d5743ea8b00feb67" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608580601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516b877f9779d5743ea8b00feb6760a01b815290519081900360200190f3fea26469706673582212201525cab12cabd5a1391872230de8f3bb7d2c179f0df77a1807bd05e6e91f8f1764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes12) {\n bytes12 r = bytes12(0x877f9779d5743ea8b00feb67);\n return r;\n }\n}", + "encoded": "0x877f9779d5743ea8b00feb670000000000000000000000000000000000000000" + }, + { + "name": "random-bytes13", + "type": "bytes13", + "value": "0xc04a4aab8c27dc824ddf2f31db", + "verbose": { + "type": "hexstring", + "value": "0xc04a4aab8c27dc824ddf2f31db" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608680601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516cc04a4aab8c27dc824ddf2f31db60981b815290519081900360200190f3fea2646970667358221220fe0b49566bbcbf839e067bebcba143e234af38333a3015a89b39ff2f65cd13b464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes13) {\n bytes13 r = bytes13(0xc04a4aab8c27dc824ddf2f31db);\n return r;\n }\n}", + "encoded": "0xc04a4aab8c27dc824ddf2f31db00000000000000000000000000000000000000" + }, + { + "name": "random-bytes14", + "type": "bytes14", + "value": "0x955b756fa187410677f35e34d7d2", + "verbose": { + "type": "hexstring", + "value": "0x955b756fa187410677f35e34d7d2" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060878061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516d4aadbab7d0c3a0833bf9af1a6be960911b815290519081900360200190f3fea26469706673582212207b418569108b134523ea12e966560e1fc00319c6a22bdb2cce436cc78e5e547664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes14) {\n bytes14 r = bytes14(0x955b756fa187410677f35e34d7d2);\n return r;\n }\n}", + "encoded": "0x955b756fa187410677f35e34d7d2000000000000000000000000000000000000" + }, + { + "name": "random-bytes15", + "type": "bytes15", + "value": "0xe4be19eca22678edf23dbbd8eaff7e", + "verbose": { + "type": "hexstring", + "value": "0xe4be19eca22678edf23dbbd8eaff7e" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060888061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516e725f0cf651133c76f91eddec757fbf60891b815290519081900360200190f3fea2646970667358221220b84705619b75be162ddcf86f87705424b0549dd9d256620f49a06b3c30da6d9b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes15) {\n bytes15 r = bytes15(0xe4be19eca22678edf23dbbd8eaff7e);\n return r;\n }\n}", + "encoded": "0xe4be19eca22678edf23dbbd8eaff7e0000000000000000000000000000000000" + }, + { + "name": "random-bytes16", + "type": "bytes16", + "value": "0xbce511e04fffbb632f04623d274c6900", + "verbose": { + "type": "hexstring", + "value": "0xbce511e04fffbb632f04623d274c6900" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060888061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516ebce511e04fffbb632f04623d274c6960881b815290519081900360200190f3fea2646970667358221220ac0b79a1c105e8594527a6869aae2859d9c69e8e18399f7578d3d30d65c40a7664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes16) {\n bytes16 r = bytes16(0xbce511e04fffbb632f04623d274c6900);\n return r;\n }\n}", + "encoded": "0xbce511e04fffbb632f04623d274c690000000000000000000000000000000000" + }, + { + "name": "random-bytes17", + "type": "bytes17", + "value": "0xcbcf179179cc5764c2a6fd3030a442dc1b", + "verbose": { + "type": "hexstring", + "value": "0xcbcf179179cc5764c2a6fd3030a442dc1b" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608a8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805170cbcf179179cc5764c2a6fd3030a442dc1b60781b815290519081900360200190f3fea26469706673582212200d84ab895135b978dbe45fa3e11f2b9caded378a658dc47931b447ec6a6b923664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes17) {\n bytes17 r = bytes17(0xcbcf179179cc5764c2a6fd3030a442dc1b);\n return r;\n }\n}", + "encoded": "0xcbcf179179cc5764c2a6fd3030a442dc1b000000000000000000000000000000" + }, + { + "name": "random-bytes18", + "type": "bytes18", + "value": "0xeb027976754eee5cf138ea8dd15773df192f", + "verbose": { + "type": "hexstring", + "value": "0xeb027976754eee5cf138ea8dd15773df192f" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608b8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805171eb027976754eee5cf138ea8dd15773df192f60701b815290519081900360200190f3fea2646970667358221220f5dfbc740691845d33042fff8cade63bdd255c65bd4402dfa7f4f91dda3607a764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes18) {\n bytes18 r = bytes18(0xeb027976754eee5cf138ea8dd15773df192f);\n return r;\n }\n}", + "encoded": "0xeb027976754eee5cf138ea8dd15773df192f0000000000000000000000000000" + }, + { + "name": "random-bytes19", + "type": "bytes19", + "value": "0x0bef39c3343414597f60ffb527b9de28b4daa7", + "verbose": { + "type": "hexstring", + "value": "0x0bef39c3343414597f60ffb527b9de28b4daa7" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608c8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051720bef39c3343414597f60ffb527b9de28b4daa760681b815290519081900360200190f3fea2646970667358221220bbb2913c82fc0594cf2f1787befb8e1c36b8ca56cd195642f5981ce49579192364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes19) {\n bytes19 r = bytes19(0x0bef39c3343414597f60ffb527b9de28b4daa7);\n return r;\n }\n}", + "encoded": "0x0bef39c3343414597f60ffb527b9de28b4daa700000000000000000000000000" + }, + { + "name": "random-bytes2", + "type": "bytes2", + "value": "0xcd3a", + "verbose": { + "type": "hexstring", + "value": "0xcd3a" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607b80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805161669d60f11b815290519081900360200190f3fea2646970667358221220d7b4b17ec91e305f3c7ef6f1269fdce284fbc2910a986069a76cce73108c2d5964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes2) {\n bytes2 r = bytes2(0xcd3a);\n return r;\n }\n}", + "encoded": "0xcd3a000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes20", + "type": "bytes20", + "value": "0x4603c7b2c7652fc2137dca1260b23024c318c8a2", + "verbose": { + "type": "hexstring", + "value": "0x4603c7b2c7652fc2137dca1260b23024c318c8a2" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608d8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051732301e3d963b297e109bee50930591812618c645160611b815290519081900360200190f3fea26469706673582212203df31b939df9f809b5b0e04737203e31d4f3ca5ea91ea797feeea91b512f614764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes20) {\n bytes20 r = bytes20(0x4603c7B2c7652fC2137dCa1260B23024C318C8a2);\n return r;\n }\n}", + "encoded": "0x4603c7b2c7652fc2137dca1260b23024c318c8a2000000000000000000000000" + }, + { + "name": "random-bytes21", + "type": "bytes21", + "value": "0x1484ff0c40b3ed2db0d25c9c38ad48ebdfd756f261", + "verbose": { + "type": "hexstring", + "value": "0x1484ff0c40b3ed2db0d25c9c38ad48ebdfd756f261" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608e8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051741484ff0c40b3ed2db0d25c9c38ad48ebdfd756f26160581b815290519081900360200190f3fea264697066735822122014add29ac6d286e0cdee4c0e928b29b20e29b07332d3c0fbb359858ec863999864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes21) {\n bytes21 r = bytes21(0x1484ff0c40b3ed2db0d25c9c38ad48ebdfd756f261);\n return r;\n }\n}", + "encoded": "0x1484ff0c40b3ed2db0d25c9c38ad48ebdfd756f2610000000000000000000000" + }, + { + "name": "random-bytes22", + "type": "bytes22", + "value": "0x6a37664d1028fa4ef06eaaf4f2cd150e34ea4b95733c", + "verbose": { + "type": "hexstring", + "value": "0x6a37664d1028fa4ef06eaaf4f2cd150e34ea4b95733c" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608f8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051751a8dd993440a3e93bc1baabd3cb345438d3a92e55ccf60521b815290519081900360200190f3fea26469706673582212203c4e6f1de07a8b3c584d0416cb8121de3f9da72b4c2d9ee3d9afac880e22f21d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes22) {\n bytes22 r = bytes22(0x6a37664d1028fa4ef06eaaf4f2cd150e34ea4b95733c);\n return r;\n }\n}", + "encoded": "0x6a37664d1028fa4ef06eaaf4f2cd150e34ea4b95733c00000000000000000000" + }, + { + "name": "random-bytes23", + "type": "bytes23", + "value": "0x96ea30c50c807fd0686d2800560835208f66a60144f672", + "verbose": { + "type": "hexstring", + "value": "0x96ea30c50c807fd0686d2800560835208f66a60144f672" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517f96ea30c50c807fd0686d2800560835208f66a60144f672000000000000000000815290519081900360200190f3fea26469706673582212204b6d3802911ea91de10d0666a45050b301eb2742369c221de07932b7a5a50c4e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes23) {\n bytes23 r = bytes23(0x96ea30c50c807fd0686d2800560835208f66a60144f672);\n return r;\n }\n}", + "encoded": "0x96ea30c50c807fd0686d2800560835208f66a60144f672000000000000000000" + }, + { + "name": "random-bytes24", + "type": "bytes24", + "value": "0x8fe567a1bb957458ac2ba8653556c06464d2e4d69be214b7", + "verbose": { + "type": "hexstring", + "value": "0x8fe567a1bb957458ac2ba8653556c06464d2e4d69be214b7" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517f8fe567a1bb957458ac2ba8653556c06464d2e4d69be214b70000000000000000815290519081900360200190f3fea2646970667358221220eed092774f3a74bcd58b7afb329313466677f866187a6b45bf03bc557e7c78a264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes24) {\n bytes24 r = bytes24(0x8fe567a1bb957458ac2ba8653556c06464d2e4d69be214b7);\n return r;\n }\n}", + "encoded": "0x8fe567a1bb957458ac2ba8653556c06464d2e4d69be214b70000000000000000" + }, + { + "name": "random-bytes25", + "type": "bytes25", + "value": "0xe1b7373a5b8f605fea4f2939656952ea26e60cf14f267c19dc", + "verbose": { + "type": "hexstring", + "value": "0xe1b7373a5b8f605fea4f2939656952ea26e60cf14f267c19dc" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fe1b7373a5b8f605fea4f2939656952ea26e60cf14f267c19dc00000000000000815290519081900360200190f3fea264697066735822122098953bf8506b43f2535675790cb96d5bde43ac2199f9f72eb8b81369f2e0889764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes25) {\n bytes25 r = bytes25(0xe1b7373a5b8f605fea4f2939656952ea26e60cf14f267c19dc);\n return r;\n }\n}", + "encoded": "0xe1b7373a5b8f605fea4f2939656952ea26e60cf14f267c19dc00000000000000" + }, + { + "name": "random-bytes26", + "type": "bytes26", + "value": "0xda703890717a7bdb0ee1a73714697c1b6d24f82f5cba04d87718", + "verbose": { + "type": "hexstring", + "value": "0xda703890717a7bdb0ee1a73714697c1b6d24f82f5cba04d87718" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fda703890717a7bdb0ee1a73714697c1b6d24f82f5cba04d87718000000000000815290519081900360200190f3fea2646970667358221220913628cc081cee66a8c957ee54c9d8c806723ace8708ad02ee4455c56b1c23da64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes26) {\n bytes26 r = bytes26(0xda703890717a7bdb0ee1a73714697c1b6d24f82f5cba04d87718);\n return r;\n }\n}", + "encoded": "0xda703890717a7bdb0ee1a73714697c1b6d24f82f5cba04d87718000000000000" + }, + { + "name": "random-bytes27", + "type": "bytes27", + "value": "0xdc72e3c4b9935700147080c2c164fb492e7787a933e55c01c4850c", + "verbose": { + "type": "hexstring", + "value": "0xdc72e3c4b9935700147080c2c164fb492e7787a933e55c01c4850c" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fdc72e3c4b9935700147080c2c164fb492e7787a933e55c01c4850c0000000000815290519081900360200190f3fea2646970667358221220006a28fcc598e4b7dbb203dbad00a6bfd4b2bd57278e1c703a96a937289515ca64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes27) {\n bytes27 r = bytes27(0xdc72e3c4b9935700147080c2c164fb492e7787a933e55c01c4850c);\n return r;\n }\n}", + "encoded": "0xdc72e3c4b9935700147080c2c164fb492e7787a933e55c01c4850c0000000000" + }, + { + "name": "random-bytes28", + "type": "bytes28", + "value": "0x633e51d725e1f444b9a724729fb8bd052ec4737eceba804e846a32b4", + "verbose": { + "type": "hexstring", + "value": "0x633e51d725e1f444b9a724729fb8bd052ec4737eceba804e846a32b4" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517f633e51d725e1f444b9a724729fb8bd052ec4737eceba804e846a32b400000000815290519081900360200190f3fea26469706673582212200747c0f1fb0cc0e21f58ef140d8491a7c49fee77ae40d798b70fff4eef2d044d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes28) {\n bytes28 r = bytes28(0x633e51d725e1f444b9a724729fb8bd052ec4737eceba804e846a32b4);\n return r;\n }\n}", + "encoded": "0x633e51d725e1f444b9a724729fb8bd052ec4737eceba804e846a32b400000000" + }, + { + "name": "random-bytes29", + "type": "bytes29", + "value": "0x5fe4cbc14ae9bbb97ade4a806927659dc69b19b83ec25266ae25b61aad", + "verbose": { + "type": "hexstring", + "value": "0x5fe4cbc14ae9bbb97ade4a806927659dc69b19b83ec25266ae25b61aad" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517f5fe4cbc14ae9bbb97ade4a806927659dc69b19b83ec25266ae25b61aad000000815290519081900360200190f3fea26469706673582212207e954eb63a8d77b0ca234248429c61a26fd979fd8bc7950452e923c3c394cca464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes29) {\n bytes29 r = bytes29(0x5fe4cbc14ae9bbb97ade4a806927659dc69b19b83ec25266ae25b61aad);\n return r;\n }\n}", + "encoded": "0x5fe4cbc14ae9bbb97ade4a806927659dc69b19b83ec25266ae25b61aad000000" + }, + { + "name": "random-bytes3", + "type": "bytes3", + "value": "0xc4a145", + "verbose": { + "type": "hexstring", + "value": "0xc4a145" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607c80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805162c4a14560e81b815290519081900360200190f3fea26469706673582212207e01f99d933fac98d3f0f06e286c6423659f0c2dd0c05c6529d90c3f4bdd726b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes3) {\n bytes3 r = bytes3(0xc4a145);\n return r;\n }\n}", + "encoded": "0xc4a1450000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes30", + "type": "bytes30", + "value": "0x30f241ca2691711b6289b07e9d60adcd530d82049e195a22202170b18328", + "verbose": { + "type": "hexstring", + "value": "0x30f241ca2691711b6289b07e9d60adcd530d82049e195a22202170b18328" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517f30f241ca2691711b6289b07e9d60adcd530d82049e195a22202170b183280000815290519081900360200190f3fea2646970667358221220ba9c09c709ac08e5bce49d016a0f174fae1b7f46d49057796de2a6b1dde077b764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes30) {\n bytes30 r = bytes30(0x30f241ca2691711b6289b07e9d60adcd530d82049e195a22202170b18328);\n return r;\n }\n}", + "encoded": "0x30f241ca2691711b6289b07e9d60adcd530d82049e195a22202170b183280000" + }, + { + "name": "random-bytes31", + "type": "bytes31", + "value": "0xd57fde2c0dae771d5cb66092b8905ba5691226740d7398459c60712a5793f0", + "verbose": { + "type": "hexstring", + "value": "0xd57fde2c0dae771d5cb66092b8905ba5691226740d7398459c60712a5793f0" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fd57fde2c0dae771d5cb66092b8905ba5691226740d7398459c60712a5793f000815290519081900360200190f3fea2646970667358221220359f5433d8e5dc6741aff8390d1c6f702e2b901ecdad1b30ca454a7b2847d47564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes31) {\n bytes31 r = bytes31(0xd57fde2c0dae771d5cb66092b8905ba5691226740d7398459c60712a5793f0);\n return r;\n }\n}", + "encoded": "0xd57fde2c0dae771d5cb66092b8905ba5691226740d7398459c60712a5793f000" + }, + { + "name": "random-bytes32", + "type": "bytes32", + "value": "0x2f858d197c64331bd6f5df571f1b82871ad380bb85031324bbed22bd71196ec6", + "verbose": { + "type": "hexstring", + "value": "0x2f858d197c64331bd6f5df571f1b82871ad380bb85031324bbed22bd71196ec6" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b7f2f858d197c64331bd6f5df571f1b82871ad380bb85031324bbed22bd71196ec660405190815260200160405180910390f3fea26469706673582212204bf98126419b04d9c54cc17aaaf7089ab3d1a58a879323e2eb532fa6cdcd7cce64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes32) {\n bytes32 r = bytes32(0x2f858d197c64331bd6f5df571f1b82871ad380bb85031324bbed22bd71196ec6);\n return r;\n }\n}", + "encoded": "0x2f858d197c64331bd6f5df571f1b82871ad380bb85031324bbed22bd71196ec6" + }, + { + "name": "random-bytes4", + "type": "bytes4", + "value": "0xa09ba3b1", + "verbose": { + "type": "hexstring", + "value": "0xa09ba3b1" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607d80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805163a09ba3b160e01b815290519081900360200190f3fea26469706673582212202f1078853dc16a29a78c1756d78a8193c398d4c2d4a7e66a8db8b024453acb6364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes4) {\n bytes4 r = bytes4(0xa09ba3b1);\n return r;\n }\n}", + "encoded": "0xa09ba3b100000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes5", + "type": "bytes5", + "value": "0x8eef2efdb1", + "verbose": { + "type": "hexstring", + "value": "0x8eef2efdb1" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607e80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051648eef2efdb160d81b815290519081900360200190f3fea2646970667358221220f2b5df6df7f402ab389cfb010e499cd4073a1bd5079db8736de7e2afbea52c0564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes5) {\n bytes5 r = bytes5(0x8eef2efdb1);\n return r;\n }\n}", + "encoded": "0x8eef2efdb1000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes6", + "type": "bytes6", + "value": "0x7d23c4ec970b", + "verbose": { + "type": "hexstring", + "value": "0x7d23c4ec970b" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607f80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051657d23c4ec970b60d01b815290519081900360200190f3fea26469706673582212209d39bb561c73cdef23580d1b2b3f5062004478dc7c64b38d30bd828950cf99da64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes6) {\n bytes6 r = bytes6(0x7d23c4ec970b);\n return r;\n }\n}", + "encoded": "0x7d23c4ec970b0000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes7", + "type": "bytes7", + "value": "0xee0456738cd294", + "verbose": { + "type": "hexstring", + "value": "0xee0456738cd294" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608080601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051663b81159ce334a560ca1b815290519081900360200190f3fea2646970667358221220ceb17ef7171070d6368eb4ffe3dbc2ddd4f37ee01df411badd89d2cd4b343cb064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes7) {\n bytes7 r = bytes7(0xee0456738cd294);\n return r;\n }\n}", + "encoded": "0xee0456738cd29400000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes8", + "type": "bytes8", + "value": "0xe7661e40caa66524", + "verbose": { + "type": "hexstring", + "value": "0xe7661e40caa66524" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608180601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516739d9879032a9994960c21b815290519081900360200190f3fea2646970667358221220ebccd36e6ee302e3704d01922326511a4438dcf1b2bf5417cc142a9bab3d832b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes8) {\n bytes8 r = bytes8(0xe7661e40caa66524);\n return r;\n }\n}", + "encoded": "0xe7661e40caa66524000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes9", + "type": "bytes9", + "value": "0x64c14141b98fdad31c", + "verbose": { + "type": "hexstring", + "value": "0x64c14141b98fdad31c" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608280601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805168193050506e63f6b4c760ba1b815290519081900360200190f3fea264697066735822122093185c32de39a7e6a67021b7af534d093429936154487ea71ebe992d3a288ccc64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes9) {\n bytes9 r = bytes9(0x64c14141b98fdad31c);\n return r;\n }\n}", + "encoded": "0x64c14141b98fdad31c0000000000000000000000000000000000000000000000" + }, + { + "name": "random-int", + "type": "int", + "value": "-26255925039512057524307572166989437894713560916285620166517646090861937311528", + "verbose": { + "type": "number", + "value": "-26255925039512057524307572166989437894713560916285620166517646090861937311528" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b7fc5f3ac4d83b8e4876858294faaf863b82ae7e8024600881b6fa10abc24e5c0d860405190815260200160405180910390f3fea2646970667358221220f4dbb475ec0a858a09bcbffeb4432cf87e81a162681e5009c59b44ced9f1718964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int) {\n int r = -26255925039512057524307572166989437894713560916285620166517646090861937311528;\n return r;\n }\n}", + "encoded": "0xc5f3ac4d83b8e4876858294faaf863b82ae7e8024600881b6fa10abc24e5c0d8" + }, + { + "name": "random-int104", + "type": "int104", + "value": "-8562581926942599809533268621101", + "verbose": { + "type": "number", + "value": "-8562581926942599809533268621101" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608480601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516c6c1331c36bd06ddabaa116772c19815290519081900360200190f3fea2646970667358221220c8160c93767b116a583c36623637c20b1a9eed1a6460590f4ab1ef5cf58e9de964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int104) {\n int104 r = -8562581926942599809533268621101;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffff93ecce3c942f9225455ee988d3" + }, + { + "name": "random-int112", + "type": "int112", + "value": "-8624528862358063573753019443579", + "verbose": { + "type": "number", + "value": "-8624528862358063573753019443579" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608480601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516c6cdb5b113da09f29611a5b297a19815290519081900360200190f3fea2646970667358221220f6ab81667531d2afa9849f87c3b7ae9f0b218fcd62a05cfef7cef42fc87f1cdf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int112) {\n int112 r = -8624528862358063573753019443579;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffff9324a4eec25f60d69ee5a4d685" + }, + { + "name": "random-int120", + "type": "int120", + "value": "-462766101327592648630431727750229060", + "verbose": { + "type": "number", + "value": "-462766101327592648630431727750229060" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608680601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516e5920215e9cef3f5d2c992b29d02c4319815290519081900360200190f3fea2646970667358221220bee2c18147e1d6360ff543d3d48b8dd895c8549ac05c45017566ea5cdb48f14864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int120) {\n int120 r = -462766101327592648630431727750229060;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffa6dfdea16310c0a2d366d4d62fd3bc" + }, + { + "name": "random-int128", + "type": "int128", + "value": "-55184947544049518631110762832686643522", + "verbose": { + "type": "number", + "value": "-55184947544049518631110762832686643522" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060878061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516f29843bfac96994bcecebe57b40d6794119815290519081900360200190f3fea2646970667358221220532b5aa8bf32fa9ea767e48012ac0db4f4fa28e30be3e4004e621876aa1b31e664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int128) {\n int128 r = -55184947544049518631110762832686643522;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffd67bc40536966b4313141a84bf2986be" + }, + { + "name": "random-int136", + "type": "int136", + "value": "2775798966944847613333829391810929523411", + "verbose": { + "type": "number", + "value": "2775798966944847613333829391810929523411" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060878061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051700828476f5c691c77b7877b024caf467ad3815290519081900360200190f3fea26469706673582212203ea1e73befc31c2548f83d004b3513b9a728c4a7b152b1f50381519ed98ee73d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int136) {\n int136 r = 2775798966944847613333829391810929523411;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000828476f5c691c77b7877b024caf467ad3" + }, + { + "name": "random-int144", + "type": "int144", + "value": "-363718379591518793727767879689219529367686", + "verbose": { + "type": "number", + "value": "-363718379591518793727767879689219529367686" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060898061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805171042cdf4bdba15c939427b4ae3f29d8c5e08519815290519081900360200190f3fea264697066735822122082289b5b4297836b267b88411210c42e407fcd28ff4967526e56cfd343bc8f3764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int144) {\n int144 r = -363718379591518793727767879689219529367686;\n return r;\n }\n}", + "encoded": "0xfffffffffffffffffffffffffffffbd320b4245ea36c6bd84b51c0d6273a1f7a" + }, + { + "name": "random-int152", + "type": "int152", + "value": "-147749319219988340932695550711932801186883833", + "verbose": { + "type": "number", + "value": "-147749319219988340932695550711932801186883833" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608a8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517206a01439a6dc43d91da2ac748342549fe968f819815290519081900360200190f3fea26469706673582212201faa4bb919c692cf590d6e09adbb65ddc3587078b3a723c89b4bce1e49feaaf864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int152) {\n int152 r = -147749319219988340932695550711932801186883833;\n return r;\n }\n}", + "encoded": "0xfffffffffffffffffffffffffff95febc65923bc26e25d538b7cbdab60169707" + }, + { + "name": "random-int16", + "type": "int16", + "value": "13823", + "verbose": { + "type": "number", + "value": "13823" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607880601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516135ff815290519081900360200190f3fea2646970667358221220cf151814d55a28c0d040906a3458ec3f236eb04c7c47a083db85256b8dfe304464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int16) {\n int16 r = 13823;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000035ff" + }, + { + "name": "random-int160", + "type": "int160", + "value": "151119732203137519047732454126318610094325788070", + "verbose": { + "type": "number", + "value": "151119732203137519047732454126318610094325788070" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608a8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051731a787172c1a442ff6874130ffc416c1f3d1c6da6815290519081900360200190f3fea26469706673582212204c9060b2d50998672974eb25db49c34cdd1a4ea064d0dca03daaa7b21cd785c564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int160) {\n int160 r = 151119732203137519047732454126318610094325788070;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000001a787172c1a442ff6874130ffc416c1f3d1c6da6" + }, + { + "name": "random-int168", + "type": "int168", + "value": "-49282786805534471400299016326292420482724598195631", + "verbose": { + "type": "number", + "value": "-49282786805534471400299016326292420482724598195631" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608c8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517421b87c974ab65c89d262412516ecd870fadfad25ae19815290519081900360200190f3fea26469706673582212203016950e8d0f6c37b999f938722cf8e7ed07ee7a36c2e0d93efa5bc7674bd85564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int168) {\n int168 r = -49282786805534471400299016326292420482724598195631;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffde478368b549a3762d9dbedae913278f052052da51" + }, + { + "name": "random-int176", + "type": "int176", + "value": "6647903707472561280319565962196032177978666206339670", + "verbose": { + "type": "number", + "value": "6647903707472561280319565962196032177978666206339670" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608c8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517511c4ae2833495783224afa4a98d4b89a6fe391d3a256815290519081900360200190f3fea26469706673582212202f7b7eece1a2383685cbe7c5e85853281b3ab000b600ae552bfa06aa1fce208864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int176) {\n int176 r = 6647903707472561280319565962196032177978666206339670;\n return r;\n }\n}", + "encoded": "0x0000000000000000000011c4ae2833495783224afa4a98d4b89a6fe391d3a256" + }, + { + "name": "random-int184", + "type": "int184", + "value": "-380751355982565965197402108514891290357791703621900548", + "verbose": { + "type": "number", + "value": "-380751355982565965197402108514891290357791703621900548" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608e8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517603f9a8a64db1dc2f8681bcb020c14bb5a61803be1f190319815290519081900360200190f3fea2646970667358221220ae281f464d09c7acd2ec5c87dd14a7653d1235978036a6bb86a4273ec0c9063c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int184) {\n int184 r = -380751355982565965197402108514891290357791703621900548;\n return r;\n }\n}", + "encoded": "0xfffffffffffffffffffc065759b24e23d0797e434fdf3eb44a59e7fc41e0e6fc" + }, + { + "name": "random-int192", + "type": "int192", + "value": "2724577381513482373522931652777613141929354012702272431296", + "verbose": { + "type": "number", + "value": "2724577381513482373522931652777613141929354012702272431296" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608e8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051776f1dea46751f2bbe88a44915d1f37ae6dc97a79311f0a4c0815290519081900360200190f3fea2646970667358221220cbbe9cd94eea24a799d8c98028019d5d490985e06e64f811b6f7bdf6e6f152b364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int192) {\n int192 r = 2724577381513482373522931652777613141929354012702272431296;\n return r;\n }\n}", + "encoded": "0x00000000000000006f1dea46751f2bbe88a44915d1f37ae6dc97a79311f0a4c0" + }, + { + "name": "random-int200", + "type": "int200", + "value": "199439548901092738437200165153811973647433862120145899508764", + "verbose": { + "type": "number", + "value": "199439548901092738437200165153811973647433862120145899508764" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608f8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051781fc5c60c197bf065881ce3a417a20d6de67c95ca3a6590541c815290519081900360200190f3fea264697066735822122029521bb1fe121d5e9c544c2592e77faede6614e082ccc790c168c329bce62ecb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int200) {\n int200 r = 199439548901092738437200165153811973647433862120145899508764;\n return r;\n }\n}", + "encoded": "0x000000000000001fc5c60c197bf065881ce3a417a20d6de67c95ca3a6590541c" + }, + { + "name": "random-int208", + "type": "int208", + "value": "-145081760657922645913317772039034132032200546213034639370012249", + "verbose": { + "type": "number", + "value": "-145081760657922645913317772039034132032200546213034639370012249" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060918061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051795a48dba1ac89b63618acd056621774dd60a7ef7f891f64c8c65819815290519081900360200190f3fea2646970667358221220568ca528e82550f3657434a9596643a897d1a3d3218cf5bfc990944d1266c5b164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int208) {\n int208 r = -145081760657922645913317772039034132032200546213034639370012249;\n return r;\n }\n}", + "encoded": "0xffffffffffffa5b7245e537649c9e7532fa99de88b229f58108076e09b3739a7" + }, + { + "name": "random-int216", + "type": "int216", + "value": "37231349733597917415470434925349371338876454545686076902114676815", + "verbose": { + "type": "number", + "value": "37231349733597917415470434925349371338876454545686076902114676815" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060918061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517a5a812035ca04fbbc5cdbc14a1a5ec1a941c5cb8ae25f28dec9504f815290519081900360200190f3fea2646970667358221220ca4385948500ae40e0276dd7ecc00e3a4fa9dea260634d845d844941ac5ba18864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int216) {\n int216 r = 37231349733597917415470434925349371338876454545686076902114676815;\n return r;\n }\n}", + "encoded": "0x00000000005a812035ca04fbbc5cdbc14a1a5ec1a941c5cb8ae25f28dec9504f" + }, + { + "name": "random-int224", + "type": "int224", + "value": "-2643979962046221639837115164504645921304153958933631827251227519824", + "verbose": { + "type": "number", + "value": "-2643979962046221639837115164504645921304153958933631827251227519824" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fffffffffe6e4d73aed41f3f8a1f9a907caaf1251323982198597f57347f814b0815290519081900360200190f3fea26469706673582212207a46acecbd41069c957d24c52a498f56283dd87f6f13653d62adb4129519d62a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int224) {\n int224 r = -2643979962046221639837115164504645921304153958933631827251227519824;\n return r;\n }\n}", + "encoded": "0xffffffffe6e4d73aed41f3f8a1f9a907caaf1251323982198597f57347f814b0" + }, + { + "name": "random-int232", + "type": "int232", + "value": "-1199739459909607425085838105297782153487991194393672195814284403310503", + "verbose": { + "type": "number", + "value": "-1199739459909607425085838105297782153487991194393672195814284403310503" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fffffffd37fcaed2728a32991e78079ccc5803270706e7eeef230bcc41c118059815290519081900360200190f3fea26469706673582212200775fb6a0376c2c86820c894872ebc5d2c07485d87f1f4acb665610d97b777bd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int232) {\n int232 r = -1199739459909607425085838105297782153487991194393672195814284403310503;\n return r;\n }\n}", + "encoded": "0xffffffd37fcaed2728a32991e78079ccc5803270706e7eeef230bcc41c118059" + }, + { + "name": "random-int24", + "type": "int24", + "value": "-4622596", + "verbose": { + "type": "number", + "value": "-4622596" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607a80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516246890319815290519081900360200190f3fea264697066735822122009df45c81689d8235e54894622cc72c4038568a09e1a7f1d3b7a11cd0bec2b7d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int24) {\n int24 r = -4622596;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb976fc" + }, + { + "name": "random-int240", + "type": "int240", + "value": "-112189086378421734275432940598331757030895011393237596929733524338085420", + "verbose": { + "type": "number", + "value": "-112189086378421734275432940598331757030895011393237596929733524338085420" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fffffefbeacee11c7a290df0ce4ce2c05c913612154fd6d3f3c2cdb7c6a1e71d4815290519081900360200190f3fea26469706673582212201cf422c1f294849404c456be79fcfec792868c581bf00b68bde361e722ec287c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int240) {\n int240 r = -112189086378421734275432940598331757030895011393237596929733524338085420;\n return r;\n }\n}", + "encoded": "0xffffefbeacee11c7a290df0ce4ce2c05c913612154fd6d3f3c2cdb7c6a1e71d4" + }, + { + "name": "random-int248", + "type": "int248", + "value": "-136391232753734294032458996424669437269638260940933792517004359432318895236", + "verbose": { + "type": "number", + "value": "-136391232753734294032458996424669437269638260940933792517004359432318895236" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517fffb2ce2801758fa72dc9ad2a6a1f706513e38a95031ca89d981b0b502041bb7c815290519081900360200190f3fea2646970667358221220e3d09025886e43f1d7a608f6b358a5814ff8f3228822256f04bdfe13d9ee9db764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int248) {\n int248 r = -136391232753734294032458996424669437269638260940933792517004359432318895236;\n return r;\n }\n}", + "encoded": "0xffb2ce2801758fa72dc9ad2a6a1f706513e38a95031ca89d981b0b502041bb7c" + }, + { + "name": "random-int256", + "type": "int256", + "value": "17341743117399148630397984039620022603237598144338917275043206886377469215133", + "verbose": { + "type": "number", + "value": "17341743117399148630397984039620022603237598144338917275043206886377469215133" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b7f2657142a58d3cc787e089ca7f20a6b66776ed5b04dc9d4dceef253d7b697819d60405190815260200160405180910390f3fea2646970667358221220c07cb2a46f789439dca44d9e5e9ff87983ada70d570b8dc5098510f920815a4d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int256) {\n int256 r = 17341743117399148630397984039620022603237598144338917275043206886377469215133;\n return r;\n }\n}", + "encoded": "0x2657142a58d3cc787e089ca7f20a6b66776ed5b04dc9d4dceef253d7b697819d" + }, + { + "name": "random-int32", + "type": "int32", + "value": "-141365570", + "verbose": { + "type": "number", + "value": "-141365570" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607b80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805163086d114119815290519081900360200190f3fea2646970667358221220f9b3a6e399835e1397e71a8ba3e0f9068639a783ce6016027130e8cd91318bba64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int32) {\n int32 r = -141365570;\n return r;\n }\n}", + "encoded": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffff792eebe" + }, + { + "name": "random-int40", + "type": "int40", + "value": "82472483236", + "verbose": { + "type": "number", + "value": "82472483236" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607b80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051641333be39a4815290519081900360200190f3fea264697066735822122041c1a61d3e60d7526f1f11c8fdf1ed50718379b668900ea9b2d40f0b4899740564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int40) {\n int40 r = 82472483236;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000001333be39a4" + }, + { + "name": "random-int48", + "type": "int48", + "value": "66155558158762", + "verbose": { + "type": "number", + "value": "66155558158762" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607c80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051653c2b0a8b41aa815290519081900360200190f3fea26469706673582212209b62f3489d6e4279747b5352eaa1aa0353cf50df2ecfba51f64311173a6651f864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int48) {\n int48 r = 66155558158762;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000003c2b0a8b41aa" + }, + { + "name": "random-int56", + "type": "int56", + "value": "-19966811269996487", + "verbose": { + "type": "number", + "value": "-19966811269996487" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607e80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516646efb5850b9fc619815290519081900360200190f3fea2646970667358221220225004e46102f9099fb621b2a47cde095bdeb292ad79a8eef4a57eb87b39c9b764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int56) {\n int56 r = -19966811269996487;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffb9104a7af46039" + }, + { + "name": "random-int64", + "type": "int64", + "value": "4255346393493761394", + "verbose": { + "type": "number", + "value": "4255346393493761394" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607e80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051673b0e06ffc46f6d72815290519081900360200190f3fea2646970667358221220f4a86958aa8b3d80c651ba824ab5993198c388c01f0f278aead8ec8a4f533c7264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int64) {\n int64 r = 4255346393493761394;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000003b0e06ffc46f6d72" + }, + { + "name": "random-int72", + "type": "int72", + "value": "2324338567697373784283", + "verbose": { + "type": "number", + "value": "2324338567697373784283" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607f80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051687e00ad6c727e32e8db815290519081900360200190f3fea264697066735822122066dd00a0f42314f1ad122ca83a919193735140793c33f8c48c2a1f5f5e0243b564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int72) {\n int72 r = 2324338567697373784283;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000007e00ad6c727e32e8db" + }, + { + "name": "random-int8", + "type": "int8", + "value": "-48", + "verbose": { + "type": "number", + "value": "-48" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607880601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051602f19815290519081900360200190f3fea2646970667358221220f9cf83a30e2bdb322d22425094f05b255f5c573663b263916c9f3378f7db11a264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int8) {\n int8 r = -48;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0" + }, + { + "name": "random-int80", + "type": "int80", + "value": "500244458024648396165024", + "verbose": { + "type": "number", + "value": "500244458024648396165024" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608080601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516969ee4e70c4b00dd6cfa0815290519081900360200190f3fea2646970667358221220627bdd8de7defce9a123fb526d9a8483e86208e19ae07bfcbdb7774c47f0553e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int80) {\n int80 r = 500244458024648396165024;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000069ee4e70c4b00dd6cfa0" + }, + { + "name": "random-int88", + "type": "int88", + "value": "-66461998403773885279080344", + "verbose": { + "type": "number", + "value": "-66461998403773885279080344" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608280601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516a36f9e027218129919b8f9719815290519081900360200190f3fea26469706673582212207db5cc1176bbb496f287c593dd6fa213acb56a78f1ce00226fa29b124c71435364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int88) {\n int88 r = -66461998403773885279080344;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffc9061fd8de7ed66e647068" + }, + { + "name": "random-int96", + "type": "int96", + "value": "-37552556857280689649601840143", + "verbose": { + "type": "number", + "value": "-37552556857280689649601840143" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608380601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516b7956bf3a5a3aa81b59e9840e19815290519081900360200190f3fea26469706673582212205b4a9dc3bf8ad84a7a1f4824334324483aa5e16bff24bca70ed6804c8b3989fd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int96) {\n int96 r = -37552556857280689649601840143;\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffff86a940c5a5c557e4a6167bf1" + }, + { + "name": "random-string", + "type": "string", + "value": "Moo é🚀oo🚀🚀oMo🚀o Moé MMMoooo🚀oo🚀 MoMo🚀🚀éooo🚀Moo🚀é🚀o oo🚀MM", + "verbose": { + "type": "string", + "value": "Moo é🚀oo🚀🚀oMo🚀o Moé MMMoooo🚀oo🚀 MoMo🚀🚀éooo🚀Moo🚀é🚀o oo🚀MM" + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610071565b60405180910390f35b606060006040518060a00160405280606281526020016100c76062913992915050565b600060208083528351808285015260005b8181101561009e57858101830151858201604001528201610082565b818111156100b0576000604083870101525b50601f01601f191692909201604001939250505056fe4d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a806f4d6ff09f9a806f204d6fc3a920204d4d4d6f6f6f6ff09f9a806f6ff09f9a8020204d6f4d6ff09f9a80f09f9a80c3a96f6f6ff09f9a804d6f6ff09f9a80c3a9f09f9a806f206f6ff09f9a804d4da2646970667358221220afea53f93ff3833ec3c36f66f37ba29d9549c8ba0f175477736daf405cd16f7764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string memory) {\n string memory r = unicode\"Moo é🚀oo🚀🚀oMo🚀o Moé MMMoooo🚀oo🚀 MoMo🚀🚀éooo🚀Moo🚀é🚀o oo🚀MM\";\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a806f4d6ff09f9a806f204d6fc3a920204d4d4d6f6f6f6ff09f9a806f6ff09f9a8020204d6f4d6ff09f9a80f09f9a80c3a96f6f6ff09f9a804d6f6ff09f9a80c3a9f09f9a806f206f6ff09f9a804d4d000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-uint", + "type": "uint", + "value": "37642957074023195853779734190782238456527330246074594528052195054167642887032", + "verbose": { + "type": "number", + "value": "37642957074023195853779734190782238456527330246074594528052195054167642887032" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b7f5339289f171d84cbf53f883826fece91d9b0c0b9b1f3cd6b43bc463cb2a0537860405190815260200160405180910390f3fea2646970667358221220694f0810955352cfaa102387ccea9928b1ba55a9fb6996d2c9804b3bfb1e8a8864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint) {\n uint r = 37642957074023195853779734190782238456527330246074594528052195054167642887032;\n return r;\n }\n}", + "encoded": "0x5339289f171d84cbf53f883826fece91d9b0c0b9b1f3cd6b43bc463cb2a05378" + }, + { + "name": "random-uint104", + "type": "uint104", + "value": "17913975601573238324443407088409", + "verbose": { + "type": "number", + "value": "17913975601573238324443407088409" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608380601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516ce21b2d4fb5e6bc3b44b6067b19815290519081900360200190f3fea2646970667358221220693f1d0f907c1b11d5493e415c08f5ac3f18233c6762361fb64595ad192bdae264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint104) {\n uint104 r = 17913975601573238324443407088409;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000e21b2d4fb5e6bc3b44b6067b19" + }, + { + "name": "random-uint112", + "type": "uint112", + "value": "1385922929925776929805341676396001", + "verbose": { + "type": "number", + "value": "1385922929925776929805341676396001" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608480601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516d4454ce82209624c8b7960d21dde1815290519081900360200190f3fea2646970667358221220ca584c8385c4bdef6972da6f8103f3fd93b7bea5f52847eaae0507cf4c425c2764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint112) {\n uint112 r = 1385922929925776929805341676396001;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000004454ce82209624c8b7960d21dde1" + }, + { + "name": "random-uint120", + "type": "uint120", + "value": "545352431828331262509167639268443853", + "verbose": { + "type": "number", + "value": "545352431828331262509167639268443853" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608580601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516e6907f368990ad57c20417aaaf046cd815290519081900360200190f3fea2646970667358221220e2de557e8d050ca8f662bbaa9e57ea38d7a506841065bc10d1b4f05a52273f3b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint120) {\n uint120 r = 545352431828331262509167639268443853;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000006907f368990ad57c20417aaaf046cd" + }, + { + "name": "random-uint128", + "type": "uint128", + "value": "111924611176033105071727486901084974225", + "verbose": { + "type": "number", + "value": "111924611176033105071727486901084974225" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608680601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516f5433e5616bde82d528e67a172b476c91815290519081900360200190f3fea26469706673582212206cd9cfec4600ddf9b4a5a5282cbbebce09eb09a03698479d099347a16f1c079f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint128) {\n uint128 r = 111924611176033105071727486901084974225;\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000005433e5616bde82d528e67a172b476c91" + }, + { + "name": "random-uint136", + "type": "uint136", + "value": "43986561248492894798711773167037158366224", + "verbose": { + "type": "number", + "value": "43986561248492894798711773167037158366224" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060878061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051708143cf8bc0bab67d76b9af34f2e5599c10815290519081900360200190f3fea2646970667358221220108820269592aa05f41f911a69478141c766ae2b6d094bd7a633d73b4dfae61764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint136) {\n uint136 r = 43986561248492894798711773167037158366224;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000008143cf8bc0bab67d76b9af34f2e5599c10" + }, + { + "name": "random-uint144", + "type": "uint144", + "value": "10346813070208734245737897105980978469392993", + "verbose": { + "type": "number", + "value": "10346813070208734245737897105980978469392993" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060888061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517176c68d0016d755e7ae74d0b1ef3323a1d261815290519081900360200190f3fea264697066735822122068a6dc983ce15e2b9af952933e49a748ab090fb5fc88884edfc04007c179c07264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint144) {\n uint144 r = 10346813070208734245737897105980978469392993;\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000076c68d0016d755e7ae74d0b1ef3323a1d261" + }, + { + "name": "random-uint152", + "type": "uint152", + "value": "3932965063127854836163531433723453859275816910", + "verbose": { + "type": "number", + "value": "3932965063127854836163531433723453859275816910" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060898061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805172b05c3988c2ad567eecfd863f44edc93e893fce815290519081900360200190f3fea26469706673582212203086deaf0d3e924703bec5474c27c9ec7de59cb8c7fad532d944c0fd7f89180564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint152) {\n uint152 r = 3932965063127854836163531433723453859275816910;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000b05c3988c2ad567eecfd863f44edc93e893fce" + }, + { + "name": "random-uint16", + "type": "uint16", + "value": "35129", + "verbose": { + "type": "number", + "value": "35129" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607880601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051618939815290519081900360200190f3fea2646970667358221220f5ee21d598ed3acdae43998ca80cdffa34c2f2781dcff5cc0866b9ea1d5c290164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint16) {\n uint16 r = 35129;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000008939" + }, + { + "name": "random-uint160", + "type": "uint160", + "value": "976868990350635167580094247999194416134506239198", + "verbose": { + "type": "number", + "value": "976868990350635167580094247999194416134506239198" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608a8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805173ab1c520d2069670d4871426a267b2f2a3d7554de815290519081900360200190f3fea26469706673582212209a19f9c8c6924f839ad946ab59183d948444042c891c8903adea7a305109734064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint160) {\n uint160 r = 976868990350635167580094247999194416134506239198;\n return r;\n }\n}", + "encoded": "0x000000000000000000000000ab1c520d2069670d4871426a267b2f2a3d7554de" + }, + { + "name": "random-uint168", + "type": "uint168", + "value": "48125002532792639775459255832607855817411527542796", + "verbose": { + "type": "number", + "value": "48125002532792639775459255832607855817411527542796" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608b8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517420edafbfa683db545d3051a20b7bf0bff94bcd880c815290519081900360200190f3fea26469706673582212205ffaab30858e47f2594ccc3180400e774ea1a89748cfbd17341153c5de11e08c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint168) {\n uint168 r = 48125002532792639775459255832607855817411527542796;\n return r;\n }\n}", + "encoded": "0x000000000000000000000020edafbfa683db545d3051a20b7bf0bff94bcd880c" + }, + { + "name": "random-uint176", + "type": "uint176", + "value": "30579399407103330424251442826479658805267727153132813", + "verbose": { + "type": "number", + "value": "30579399407103330424251442826479658805267727153132813" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608c8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517551bb462dbb96eeaa27746b8ee585d41602f9d074750d815290519081900360200190f3fea26469706673582212207ba6b042b05977dad47c2ef127b15242acd2b11fc5d34ffbb952515652330ca264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint176) {\n uint176 r = 30579399407103330424251442826479658805267727153132813;\n return r;\n }\n}", + "encoded": "0x0000000000000000000051bb462dbb96eeaa27746b8ee585d41602f9d074750d" + }, + { + "name": "random-uint184", + "type": "uint184", + "value": "5098096734486986820668146211327243391771838887503657737", + "verbose": { + "type": "number", + "value": "5098096734486986820668146211327243391771838887503657737" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608d8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805176353a0356a082e709dbe91490cb5d4a7e7e12445418fb09815290519081900360200190f3fea2646970667358221220aabacf171d1866e412eafd77853b17dd904810b0e15cd330b0c9e524846b1ac664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint184) {\n uint184 r = 5098096734486986820668146211327243391771838887503657737;\n return r;\n }\n}", + "encoded": "0x000000000000000000353a0356a082e709dbe91490cb5d4a7e7e12445418fb09" + }, + { + "name": "random-uint192", + "type": "uint192", + "value": "6060878314271660430611206175479316499921596300384474648780", + "verbose": { + "type": "number", + "value": "6060878314271660430611206175479316499921596300384474648780" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608e8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805177f72e85aba90ed74c1d9804f890870e4899456bb710ae50cc815290519081900360200190f3fea264697066735822122078873aad8334a176d8615b8aa324f3dab94ed71c2ef2384845c0cdacc5ef95b364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint192) {\n uint192 r = 6060878314271660430611206175479316499921596300384474648780;\n return r;\n }\n}", + "encoded": "0x0000000000000000f72e85aba90ed74c1d9804f890870e4899456bb710ae50cc" + }, + { + "name": "random-uint200", + "type": "uint200", + "value": "1123115900587354017922510028386880077312658173678492090643579", + "verbose": { + "type": "number", + "value": "1123115900587354017922510028386880077312658173678492090643579" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608f8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805178b2ec35206eec6335755ea0af70597226ce90905e9a1938347b815290519081900360200190f3fea2646970667358221220a7644461640e3b464a27fb3d6a3b4951fe495dc9e3703a6184c1d4024bdda96d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint200) {\n uint200 r = 1123115900587354017922510028386880077312658173678492090643579;\n return r;\n }\n}", + "encoded": "0x00000000000000b2ec35206eec6335755ea0af70597226ce90905e9a1938347b" + }, + { + "name": "random-uint208", + "type": "uint208", + "value": "46361431004407880768686670986179307842131091545485179376650393", + "verbose": { + "type": "number", + "value": "46361431004407880768686670986179307842131091545485179376650393" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060908061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051791cd9cd5499f49f98bf33c85fd389e9ec79fd483ab6cb59684899815290519081900360200190f3fea2646970667358221220549087332682249560fd86feeb63ceb8c67dec664545a9a73150484bc410c88964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint208) {\n uint208 r = 46361431004407880768686670986179307842131091545485179376650393;\n return r;\n }\n}", + "encoded": "0x0000000000001cd9cd5499f49f98bf33c85fd389e9ec79fd483ab6cb59684899" + }, + { + "name": "random-uint216", + "type": "uint216", + "value": "33004691470497468391251589798886032765906994717774989774465925829", + "verbose": { + "type": "number", + "value": "33004691470497468391251589798886032765906994717774989774465925829" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060918061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517a503adeb37bc2874cd79bffbe7383aa12562f832e17cdcf51ee02c5815290519081900360200190f3fea2646970667358221220039b1983e5c17e8ffab6cabdc42ce27f35c065437b1fc4dd7a010053d549704664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint216) {\n uint216 r = 33004691470497468391251589798886032765906994717774989774465925829;\n return r;\n }\n}", + "encoded": "0x0000000000503adeb37bc2874cd79bffbe7383aa12562f832e17cdcf51ee02c5" + }, + { + "name": "random-uint224", + "type": "uint224", + "value": "12406777805631668379618346086673256758342161881889570061767456465530", + "verbose": { + "type": "number", + "value": "12406777805631668379618346086673256758342161881889570061767456465530" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060928061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517b75cf34c88975356657ebef8d2c84447f51adb404b9c810755d2a227a815290519081900360200190f3fea264697066735822122007be3f1722167204a521e1b1b02d82739f6070253183c33ed92c1a2a7edee14b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint224) {\n uint224 r = 12406777805631668379618346086673256758342161881889570061767456465530;\n return r;\n }\n}", + "encoded": "0x0000000075cf34c88975356657ebef8d2c84447f51adb404b9c810755d2a227a" + }, + { + "name": "random-uint232", + "type": "uint232", + "value": "3257449474963252897887112977149379608168353209009584672586229872744221", + "verbose": { + "type": "number", + "value": "3257449474963252897887112977149379608168353209009584672586229872744221" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060938061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517c78d35508f4a9432f646d9bd9bf0bc8ee9ead7b42fcfa1bdc0dd922571d815290519081900360200190f3fea2646970667358221220e77adf4c511aa18544a5e831b75510c2aa7412e3f2c14480ed424f0da0c070db64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint232) {\n uint232 r = 3257449474963252897887112977149379608168353209009584672586229872744221;\n return r;\n }\n}", + "encoded": "0x00000078d35508f4a9432f646d9bd9bf0bc8ee9ead7b42fcfa1bdc0dd922571d" + }, + { + "name": "random-uint24", + "type": "uint24", + "value": "16386876", + "verbose": { + "type": "number", + "value": "16386876" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607980601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805162fa0b3c815290519081900360200190f3fea26469706673582212206e1c2cab0a55cb9c9bc4a84c7a441189e402a22d9d5ecb2c87b3c508ed0cda1864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint24) {\n uint24 r = 16386876;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000fa0b3c" + }, + { + "name": "random-uint240", + "type": "uint240", + "value": "1230369107383705889263297569125918636265812625102184716214592736346898326", + "verbose": { + "type": "number", + "value": "1230369107383705889263297569125918636265812625102184716214592736346898326" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060948061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517db244ed3621b7bdd490b49bd7ab5e864b5bb60e5d3fe67c853222aa05ff96815290519081900360200190f3fea2646970667358221220408cd467d721bbd6d5d5a4a59a1c31148c74590a58e373bdc129a766f9d37e2a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint240) {\n uint240 r = 1230369107383705889263297569125918636265812625102184716214592736346898326;\n return r;\n }\n}", + "encoded": "0x0000b244ed3621b7bdd490b49bd7ab5e864b5bb60e5d3fe67c853222aa05ff96" + }, + { + "name": "random-uint248", + "type": "uint248", + "value": "145756579769137467382998304930303074032901322972956568619289317474173521900", + "verbose": { + "type": "number", + "value": "145756579769137467382998304930303074032901322972956568619289317474173521900" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060958061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080517e527ecc05968cddc3006032a6fd3088e4313ceef7d2a95619e9089e09390fec815290519081900360200190f3fea2646970667358221220e0ecb58bd7fbe8b1c37bcf31a682ee960b00b2d60d8551464af85c5f79012ca364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint248) {\n uint248 r = 145756579769137467382998304930303074032901322972956568619289317474173521900;\n return r;\n }\n}", + "encoded": "0x00527ecc05968cddc3006032a6fd3088e4313ceef7d2a95619e9089e09390fec" + }, + { + "name": "random-uint256", + "type": "uint256", + "value": "101611154195520776335741463917853444671577865378275924493376429267637792638729", + "verbose": { + "type": "number", + "value": "101611154195520776335741463917853444671577865378275924493376429267637792638729" + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060968061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b7fe0a5e00d34699be3c391395b9f04e2df71c1078ebee0581d62c92eead133870960405190815260200160405180910390f3fea26469706673582212204543bb6c0df20ae860d231f005bbaa66f91016687fbced7bb05ca2d145f59cc864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint256) {\n uint256 r = 101611154195520776335741463917853444671577865378275924493376429267637792638729;\n return r;\n }\n}", + "encoded": "0xe0a5e00d34699be3c391395b9f04e2df71c1078ebee0581d62c92eead1338709" + }, + { + "name": "random-uint32", + "type": "uint32", + "value": "18052803", + "verbose": { + "type": "number", + "value": "18052803" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607a80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805163011376c3815290519081900360200190f3fea26469706673582212202a6ce292a4c8a71e3a4bf5f6853eae8d5b6b744c7db80a0c0e09ffbb04f6b7f164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint32) {\n uint32 r = 18052803;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000011376c3" + }, + { + "name": "random-uint40", + "type": "uint40", + "value": "574301773314", + "verbose": { + "type": "number", + "value": "574301773314" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607b80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516485b70d9e02815290519081900360200190f3fea264697066735822122090bdfd3f9e0b5f1c663c81adf83aabcb1ae79db40a92fbc23307f426ac56e01b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint40) {\n uint40 r = 574301773314;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000085b70d9e02" + }, + { + "name": "random-uint48", + "type": "uint48", + "value": "262423823815899", + "verbose": { + "type": "number", + "value": "262423823815899" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607c80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805165eeac4ecc94db815290519081900360200190f3fea26469706673582212208001be73b0cdebcde704e4326857eb3841ffd9a96971bedef049fb8dc9024ab764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint48) {\n uint48 r = 262423823815899;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000eeac4ecc94db" + }, + { + "name": "random-uint56", + "type": "uint56", + "value": "6375275489279484", + "verbose": { + "type": "number", + "value": "6375275489279484" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607d80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516616a6477ee23dfc815290519081900360200190f3fea264697066735822122078fb18839ef59792d1675a93bea80a444c1fa6dbd299c81ff012d9f9791227e564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint56) {\n uint56 r = 6375275489279484;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000016a6477ee23dfc" + }, + { + "name": "random-uint64", + "type": "uint64", + "value": "13321099036857048053", + "verbose": { + "type": "number", + "value": "13321099036857048053" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607e80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805167b8de0cfeeda99bf5815290519081900360200190f3fea2646970667358221220e57afe71c849b9e702b816d64359e0a359ddd12b6a51f9fe9a26b57ff5a6a8ba64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint64) {\n uint64 r = 13321099036857048053;\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000b8de0cfeeda99bf5" + }, + { + "name": "random-uint72", + "type": "uint72", + "value": "2819722053248274284385", + "verbose": { + "type": "number", + "value": "2819722053248274284385" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607f80601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516898db811be6ce7a3f61815290519081900360200190f3fea2646970667358221220354bc9c6eddc7ad8dd91268dbcf4bfad5011a4a086f51dab0d720d4b7b2b248564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint72) {\n uint72 r = 2819722053248274284385;\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000098db811be6ce7a3f61" + }, + { + "name": "random-uint8", + "type": "uint8", + "value": "138", + "verbose": { + "type": "number", + "value": "138" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50607780601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051608a815290519081900360200190f3fea26469706673582212202546f8b48b0e541f961da3492be3a1d6aed5ff522f57677efada0e37b7c3fb4064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint8) {\n uint8 r = 138;\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000008a" + }, + { + "name": "random-uint80", + "type": "uint80", + "value": "817716888934872342694660", + "verbose": { + "type": "number", + "value": "817716888934872342694660" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608080601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805169ad288578b48226c18b04815290519081900360200190f3fea2646970667358221220b2bdb7b644dc2f883e153d3fe686d8cc7ca30260f20d764d98cc5592a882029964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint80) {\n uint80 r = 817716888934872342694660;\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000ad288578b48226c18b04" + }, + { + "name": "random-uint88", + "type": "uint88", + "value": "154717455470646237453481833", + "verbose": { + "type": "number", + "value": "154717455470646237453481833" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608180601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516a7ffab2112fc5b44925f769815290519081900360200190f3fea26469706673582212207bd6d015b101b85b546277f475d2c9cf2817d63c7dd5055dcb639bfdcd179a9c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint88) {\n uint88 r = 154717455470646237453481833;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000007ffab2112fc5b44925f769" + }, + { + "name": "random-uint96", + "type": "uint96", + "value": "70655261155009064824419212005", + "verbose": { + "type": "number", + "value": "70655261155009064824419212005" + }, + "bytecode": "0x6080604052348015600f57600080fd5b50608280601d6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516be44ca98616ee629199215ae5815290519081900360200190f3fea2646970667358221220e2cc72bd98ddb41e8b7e5e5657f257f670a7eb57ebc06b732498ed56274d2fa564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint96) {\n uint96 r = 70655261155009064824419212005;\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000e44ca98616ee629199215ae5" + }, + { + "name": "random-((address,bool))", + "type": "((address,bool))", + "value": [["0xcBE2BC4C7147b773483F4BC2F5f0eAb8A3bEc647", false]], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xcBE2BC4C7147b773483F4BC2F5f0eAb8A3bEc647" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f18061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b609260408051606081018252600060208201818152928201529081526040805160608101825260006020820181815292820152908152604080518082019091526000602082015273cbe2bc4c7147b773483f4bc2f5f0eab8a3bec64781528152919050565b60408051915180516001600160a01b031683526020908101511515908301520160405180910390f3fea264697066735822122085e50b4e5d3f9167bb4efcd7f17871ee031fb3eef1fd09f7710a016525709e0564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5cde0d08 {\n address s_0;\n bool s_1;\n }\n\n struct S_d0b75772 {\n S_5cde0d08 s_0;\n }\n\n function test () public pure returns (S_d0b75772 memory) {\n S_d0b75772 memory r;\n {\n S_5cde0d08 memory r_0;\n {\n address r_0_0 = 0xcBE2BC4C7147b773483F4BC2F5f0eAb8A3bEc647;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000cbe2bc4c7147b773483f4bc2f5f0eab8a3bec6470000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((string,bytes1))", + "type": "((string,bytes1))", + "value": [["Moo é🚀🚀 oo ooé oéo🚀🚀ééMoo🚀Mo ooé 🚀oéooooM", "0x3b"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 oo ooé oéo🚀🚀ééMoo🚀Mo ooé 🚀oéooooM" + }, + { + "type": "hexstring", + "value": "0x3b" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ce565b60405180910390f35b604080516060808201835260208201908152600092820192909252908152604080516060808201835260208201908152600092820192909252908152604080518082019091526060815260006020820152600060405180608001604052806044815260200161014760449139825250603b60f81b60208201528152919050565b60006020808352835181828501528051604080860152805180608087015260005b8181101561010b5782810185015187820160a0015284016100ef565b8181111561011d57600060a083890101525b5091909201516001600160f81b0319166060850152601f01601f191690920160a001939250505056fe4d6f6f20c3a9f09f9a80f09f9a80206f6f20206f6fc3a9206fc3a96ff09f9a80f09f9a80c3a9c3a94d6f6ff09f9a804d6f20206f6fc3a920f09f9a806fc3a96f6f6f6f4da26469706673582212203a8d6ae0b6b53bd02b3ad2a4f0a150a3290dd42dd65c108a70d87974b78d96a564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2e44d04d {\n string s_0;\n bytes1 s_1;\n }\n\n struct S_ccb1aaf0 {\n S_2e44d04d s_0;\n }\n\n function test () public pure returns (S_ccb1aaf0 memory) {\n S_ccb1aaf0 memory r;\n {\n S_2e44d04d memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀🚀 oo ooé oéo🚀🚀ééMoo🚀Mo ooé 🚀oéooooM\";\n r_0.s_0 = r_0_0;\n }\n {\n bytes1 r_0_1 = bytes1(0x3b);\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000403b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a80f09f9a80206f6f20206f6fc3a9206fc3a96ff09f9a80f09f9a80c3a9c3a94d6f6ff09f9a804d6f20206f6fc3a920f09f9a806fc3a96f6f6f6f4d00000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((uint),bytes22)", + "type": "((uint),bytes22)", + "value": [ + ["31722712024044883318309071563085303055552253891348445219825010881989539700544"], + "0xfb1b67718377036b9b87314bf3d8aaf5b21ef4a0e672" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "31722712024044883318309071563085303055552253891348445219825010881989539700544" + } + ] + }, + { + "type": "hexstring", + "value": "0xfb1b67718377036b9b87314bf3d8aaf5b21ef4a0e672" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101068061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600082840181815283526020928301819052835191820184528184018181528252818301908152835180840185527f46226b318f8c110fa533bec605f128da474c55bfa1a9a7f6f0963963821a9f40815291829052757d8db3b8c1bb81b5cdc398a5f9ec557ad90f7a50733960511b81528351915182525169ffffffffffffffffffff19169181019190915281519081900390910190f3fea2646970667358221220bdb014f6deadce020e4684371a8a74e4677d0949856141ee85ea4724c264501c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ec13d6d1 {\n uint256 s_0;\n }\n\n struct S_4d14112c {\n S_ec13d6d1 s_0;\n bytes22 s_1;\n }\n\n function test () public pure returns (S_4d14112c memory) {\n S_4d14112c memory r;\n {\n S_ec13d6d1 memory r_0;\n {\n uint r_0_0 = 31722712024044883318309071563085303055552253891348445219825010881989539700544;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes22 r_1 = bytes22(0xfb1b67718377036b9b87314bf3d8aaf5b21ef4a0e672);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x46226b318f8c110fa533bec605f128da474c55bfa1a9a7f6f0963963821a9f40fb1b67718377036b9b87314bf3d8aaf5b21ef4a0e67200000000000000000000" + }, + { + "name": "random-(address,address)", + "type": "(address,address)", + "value": [ + "0xFca7D1FB3c078F21a7f7F1798928e8cEBd300237", + "0xb1d8C2E9FC502cc40c6c32EB1452343ae9B23A4f" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xFca7D1FB3c078F21a7f7F1798928e8cEBd300237" + }, + { + "type": "address", + "value": "0xb1d8C2E9FC502cc40c6c32EB1452343ae9B23A4f" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d48061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835273fca7d1fb3c078f21a7f7f1798928e8cebd30023780825273b1d8c2e9fc502cc40c6c32eb1452343ae9b23a4f918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea264697066735822122065179b442321f8af046a3e80511eb8773ba55894a9da83fa3808da6b474dbd1064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3b625bf6 {\n address s_0;\n address s_1;\n }\n\n function test () public pure returns (S_3b625bf6 memory) {\n S_3b625bf6 memory r;\n {\n address r_0 = 0xFca7D1FB3c078F21a7f7F1798928e8cEBd300237;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xb1d8C2E9FC502cc40c6c32EB1452343ae9B23A4f;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000fca7d1fb3c078f21a7f7f1798928e8cebd300237000000000000000000000000b1d8c2e9fc502cc40c6c32eb1452343ae9b23a4f" + }, + { + "name": "random-(address,bool)", + "type": "(address,bool)", + "value": ["0x6F9D3545C259E2c428bcFeA188Cad82D8a945265", true], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6F9D3545C259E2c428bcFeA188Cad82D8a945265" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ba8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352736f9d3545c259e2c428bcfea188cad82d8a94526580825260019183019182528351908152905115159181019190915281519081900390910190f3fea26469706673582212208ff2f6490f6a67acb5772ad5e6b7b22c2ec5ec0950bf6b47107fc2d75394863b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5cde0d08 {\n address s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_5cde0d08 memory) {\n S_5cde0d08 memory r;\n {\n address r_0 = 0x6F9D3545C259E2c428bcFeA188Cad82D8a945265;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000006f9d3545c259e2c428bcfea188cad82d8a9452650000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(address,bytes24)", + "type": "(address,bytes24)", + "value": [ + "0x0825dE986E921840d2d018FF0F958460bFc85CfF", + "0x886aea78ace7cd0232f599b5bb3339a82308787c59b5e1dc" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0825dE986E921840d2d018FF0F958460bFc85CfF" + }, + { + "type": "hexstring", + "value": "0x886aea78ace7cd0232f599b5bb3339a82308787c59b5e1dc" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e28061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352730825de986e921840d2d018ff0f958460bfc85cff8082527f886aea78ace7cd0232f599b5bb3339a82308787c59b5e1dc00000000000000009183019182528351908152905167ffffffffffffffff19169181019190915281519081900390910190f3fea26469706673582212206c0bc0b5728602b0f7d15cf760a38a1710c5ff777b995eeaa9efba87c0b0d64664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c0e29cb9 {\n address s_0;\n bytes24 s_1;\n }\n\n function test () public pure returns (S_c0e29cb9 memory) {\n S_c0e29cb9 memory r;\n {\n address r_0 = 0x0825dE986E921840d2d018FF0F958460bFc85CfF;\n r.s_0 = r_0;\n }\n {\n bytes24 r_1 = bytes24(0x886aea78ace7cd0232f599b5bb3339a82308787c59b5e1dc);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000825de986e921840d2d018ff0f958460bfc85cff886aea78ace7cd0232f599b5bb3339a82308787c59b5e1dc0000000000000000" + }, + { + "name": "random-(address,bytes5)", + "type": "(address,bytes5)", + "value": ["0xF662ECd8666B9f56225A499ab6c24DAbAc830015", "0xa7c6d6708a"], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF662ECd8666B9f56225A499ab6c24DAbAc830015" + }, + { + "type": "hexstring", + "value": "0xa7c6d6708a" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835273f662ecd8666b9f56225a499ab6c24dabac8300158082526453e36b384560d91b918301918252835190815290516001600160d81b0319169181019190915281519081900390910190f3fea264697066735822122057b27ebb848c9e7dc13d4708eb2c1bf7f29c52585fc79a9a4b856535d7ce72b164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9dc6833e {\n address s_0;\n bytes5 s_1;\n }\n\n function test () public pure returns (S_9dc6833e memory) {\n S_9dc6833e memory r;\n {\n address r_0 = 0xF662ECd8666B9f56225A499ab6c24DAbAc830015;\n r.s_0 = r_0;\n }\n {\n bytes5 r_1 = bytes5(0xa7c6d6708a);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000f662ecd8666b9f56225a499ab6c24dabac830015a7c6d6708a000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,int)", + "type": "(address,int)", + "value": [ + "0xcDc1da2760569BCccc488E0F4033e1f7c2B860D1", + "22529625887994294237558491374122388884021191001808361938647694649486330678162" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xcDc1da2760569BCccc488E0F4033e1f7c2B860D1" + }, + { + "type": "number", + "value": "22529625887994294237558491374122388884021191001808361938647694649486330678162" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d78061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835273cdc1da2760569bcccc488e0f4033e1f7c2b860d18082527f31cf50fd2a12d6715923a3ef88e86338c4d258d6b1865626cb427f195121cb92918301918252835190815290519181019190915281519081900390910190f3fea2646970667358221220c60820bf5c605880c7be52285e949a0b3a5faccfaa59e35618edfc010ed36bc864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5ad558fe {\n address s_0;\n int256 s_1;\n }\n\n function test () public pure returns (S_5ad558fe memory) {\n S_5ad558fe memory r;\n {\n address r_0 = 0xcDc1da2760569BCccc488E0F4033e1f7c2B860D1;\n r.s_0 = r_0;\n }\n {\n int r_1 = 22529625887994294237558491374122388884021191001808361938647694649486330678162;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000cdc1da2760569bcccc488e0f4033e1f7c2b860d131cf50fd2a12d6715923a3ef88e86338c4d258d6b1865626cb427f195121cb92" + }, + { + "name": "random-(address,int192)", + "type": "(address,int192)", + "value": [ + "0x6D55C2a2b62C0f564cd5F1F80711FcAa36Ca5240", + "-288124533153251206941489716571630506550342779909795549676" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6D55C2a2b62C0f564cd5F1F80711FcAa36Ca5240" + }, + { + "type": "number", + "value": "-288124533153251206941489716571630506550342779909795549676" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d38061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352736d55c2a2b62c0f564cd5f1f80711fcaa36ca5240808252770bc02915963e95959aa708762aabdc50b912ea4f5e9911eb199183019182528351908152905160170b9181019190915281519081900390910190f3fea2646970667358221220608194287605e659faa25f8590493ca1f8c5967ea77fba18fd1588d5f4fe5aae64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_432a42d1 {\n address s_0;\n int192 s_1;\n }\n\n function test () public pure returns (S_432a42d1 memory) {\n S_432a42d1 memory r;\n {\n address r_0 = 0x6D55C2a2b62C0f564cd5F1F80711FcAa36Ca5240;\n r.s_0 = r_0;\n }\n {\n int192 r_1 = -288124533153251206941489716571630506550342779909795549676;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000006d55c2a2b62c0f564cd5f1f80711fcaa36ca5240fffffffffffffffff43fd6ea69c16a6a6558f789d55423af46ed15b0a166ee14" + }, + { + "name": "random-(address,string)", + "type": "(address,string)", + "value": [ + "0x93Ad742A155A6dBBF1AC37F0B2F9C7C12762a0d1", + "Moo é🚀éMM oM oé🚀MoééMoooM🚀éMéoMoéoM🚀éoéé oo 🚀é oo🚀é o🚀oéo🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x93Ad742A155A6dBBF1AC37F0B2F9C7C12762a0d1" + }, + { + "type": "string", + "value": "Moo é🚀éMM oM oé🚀MoééMoooM🚀éMéoMoéoM🚀éoéé oo 🚀é oo🚀é o🚀oéo🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ac565b60405180910390f35b604080518082018252600080825260606020808401829052845180860186528082018390527393ad742a155a6dbbf1ac37f0b2f9c7c12762a0d181528551608081019096528286529394919061011c90830139602083015250919050565b6000602080835260018060a01b038451168184015280840151604080850152805180606086015260005b818110156100f2578281018401518682016080015283016100d6565b81811115610104576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a80c3a94d4d206f4d206fc3a9f09f9a804d6fc3a9c3a94d6f6f6f4df09f9a80c3a94dc3a96f4d6fc3a96f4df09f9a80c3a96fc3a9c3a9206f6f20f09f9a80c3a9206f6ff09f9a80c3a9206ff09f9a806fc3a96ff09f9a80a2646970667358221220f0b83aec3f17b770d4ebc7c1c740bd0ef55846a4a577569cd8c5512d0f73b67664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8090aaf4 {\n address s_0;\n string s_1;\n }\n\n function test () public pure returns (S_8090aaf4 memory) {\n S_8090aaf4 memory r;\n {\n address r_0 = 0x93Ad742A155A6dBBF1AC37F0B2F9C7C12762a0d1;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éMM oM oé🚀MoééMoooM🚀éMéoMoéoM🚀éoéé oo 🚀é oo🚀é o🚀oéo🚀\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000093ad742a155a6dbbf1ac37f0b2f9c7c12762a0d1000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a80c3a94d4d206f4d206fc3a9f09f9a804d6fc3a9c3a94d6f6f6f4df09f9a80c3a94dc3a96f4d6fc3a96f4df09f9a80c3a96fc3a9c3a9206f6f20f09f9a80c3a9206f6ff09f9a80c3a9206ff09f9a806fc3a96ff09f9a80" + }, + { + "name": "random-(address,uint208)", + "type": "(address,uint208)", + "value": [ + "0xF0C5AB155A255b8B542d1218A48c81D8d6992C07", + "66740310468053313184364306813255572937396422973552391636174513" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF0C5AB155A255b8B542d1218A48c81D8d6992C07" + }, + { + "type": "number", + "value": "66740310468053313184364306813255572937396422973552391636174513" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060da8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835273f0c5ab155a255b8b542d1218a48c81d8d6992c078082527929885849bf9c119fcff239ca6f86b948ca3048bc0f08b10cc6b1918301918252835190815290516001600160d01b03169181019190915281519081900390910190f3fea2646970667358221220d431751444b1855bf608511b12ea4f96d2096f923913c689f7b77bb13c6f250164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6d025777 {\n address s_0;\n uint208 s_1;\n }\n\n function test () public pure returns (S_6d025777 memory) {\n S_6d025777 memory r;\n {\n address r_0 = 0xF0C5AB155A255b8B542d1218A48c81D8d6992C07;\n r.s_0 = r_0;\n }\n {\n uint208 r_1 = 66740310468053313184364306813255572937396422973552391636174513;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000f0c5ab155a255b8b542d1218a48c81d8d6992c0700000000000029885849bf9c119fcff239ca6f86b948ca3048bc0f08b10cc6b1" + }, + { + "name": "random-(address,uint248)", + "type": "(address,uint248)", + "value": [ + "0x8784A0575D056ea6AB0A716B3cfd0A0812Ca5788", + "154743979034731572387730583035613718093947081363307515106590196508669198594" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x8784A0575D056ea6AB0A716B3cfd0A0812Ca5788" + }, + { + "type": "number", + "value": "154743979034731572387730583035613718093947081363307515106590196508669198594" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060df8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352738784a0575d056ea6ab0a716b3cfd0a0812ca57888082527e5794fd302c37e0d7373971f8ef697af4b024d2b133c9652260e44c752f4102918301918252835190815290516001600160f81b03169181019190915281519081900390910190f3fea2646970667358221220a5705a46d4b6208eff9968ccf2e4cafbe61fd2e90003374b9efea1c8ddb3be5864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_67df5764 {\n address s_0;\n uint248 s_1;\n }\n\n function test () public pure returns (S_67df5764 memory) {\n S_67df5764 memory r;\n {\n address r_0 = 0x8784A0575D056ea6AB0A716B3cfd0A0812Ca5788;\n r.s_0 = r_0;\n }\n {\n uint248 r_1 = 154743979034731572387730583035613718093947081363307515106590196508669198594;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000008784a0575d056ea6ab0a716b3cfd0a0812ca5788005794fd302c37e0d7373971f8ef697af4b024d2b133c9652260e44c752f4102" + }, + { + "name": "random-(address)[3]", + "type": "(address)[3]", + "value": [ + ["0x97077f92BDd737FAB412DADF719caa16dC5145B5"], + ["0xa62D60E07aa23A521251A3bE118e2F5A7E82A99f"], + ["0xDC039E2E2Eb0976c6566746C6f1D3279717B0Cc0"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x97077f92BDd737FAB412DADF719caa16dC5145B5" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa62D60E07aa23A521251A3bE118e2F5A7E82A99f" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xDC039E2E2Eb0976c6566746C6f1D3279717B0Cc0" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610171806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610100565b60405180910390f35b6100566100cc565b61005e6100cc565b60408051602080820183527397077f92bdd737fab412dadf719caa16dc5145b582529083528151808201835273a62d60e07aa23a521251a3be118e2f5a7e82a99f8152838201528151908101825273dc039e2e2eb0976c6566746c6f1d3279717b0cc0815290820152919050565b60405180606001604052806003905b6040805160208101909152600081528152602001906001900390816100db5790505090565b60608101818360005b6003811015610132578151516001600160a01b0316835260209283019290910190600101610109565b5050509291505056fea2646970667358221220aff74e1aa42c81913577d8ae418bd13218e119670c2b1e989d0865eec552bf1d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n function test () public pure returns (S_421683f8[3] memory) {\n S_421683f8[3] memory r;\n {\n S_421683f8 memory r_0;\n {\n address r_0_0 = 0x97077f92BDd737FAB412DADF719caa16dC5145B5;\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_421683f8 memory r_1;\n {\n address r_1_0 = 0xa62D60E07aa23A521251A3bE118e2F5A7E82A99f;\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_421683f8 memory r_2;\n {\n address r_2_0 = 0xDC039E2E2Eb0976c6566746C6f1D3279717B0Cc0;\n r_2.s_0 = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000097077f92bdd737fab412dadf719caa16dc5145b5000000000000000000000000a62d60e07aa23a521251a3be118e2f5a7e82a99f000000000000000000000000dc039e2e2eb0976c6566746c6f1d3279717b0cc0" + }, + { + "name": "random-(address[2])", + "type": "(address[2])", + "value": [ + [ + "0x4Dd619E0Bd36C127256eED954270dDb41047AF6F", + "0xE5a8B84E1E3e31F9865e21dC9a27d1e2A53ddCb6" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4Dd619E0Bd36C127256eED954270dDb41047AF6F" + }, + { + "type": "address", + "value": "0xE5a8B84E1E3e31F9865e21dC9a27d1e2A53ddCb6" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610146806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d4565b60405180910390f35b61005661009e565b61005e61009e565b6100666100b6565b734dd619e0bd36c127256eed954270ddb41047af6f815273e5a8b84e1e3e31f9865e21dc9a27d1e2a53ddcb660208201528152919050565b60405180602001604052806100b16100b6565b905290565b60405180604001604052806002906020820280368337509192915050565b815160408201908260005b60028110156101075782516001600160a01b03168252602092830192909101906001016100df565b5050509291505056fea2646970667358221220706211c13053ddb06401cf9d73169b0b6366d596bd768aa3ee38b1d78ed8c64964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6acf71d8 {\n address[2] s_0;\n }\n\n function test () public pure returns (S_6acf71d8 memory) {\n S_6acf71d8 memory r;\n {\n address[2] memory r_0;\n {\n address r_0_0 = 0x4Dd619E0Bd36C127256eED954270dDb41047AF6F;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xE5a8B84E1E3e31F9865e21dC9a27d1e2A53ddCb6;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000004dd619e0bd36c127256eed954270ddb41047af6f000000000000000000000000e5a8b84e1e3e31f9865e21dc9a27d1e2a53ddcb6" + }, + { + "name": "random-(address[4])", + "type": "(address[4])", + "value": [ + [ + "0x4cC16C0225227877A6E9B0331db2208Ab1564FF8", + "0xF1D75f95C81d77996883D4583b0AC62c07706B50", + "0xE311B9EaE0b076c9BbcafAcB95B5f1c7Ab8A582b", + "0xAe7CCfbDc459209d7999951baD5D18F18Fbfd8F7" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4cC16C0225227877A6E9B0331db2208Ab1564FF8" + }, + { + "type": "address", + "value": "0xF1D75f95C81d77996883D4583b0AC62c07706B50" + }, + { + "type": "address", + "value": "0xE311B9EaE0b076c9BbcafAcB95B5f1c7Ab8A582b" + }, + { + "type": "address", + "value": "0xAe7CCfbDc459209d7999951baD5D18F18Fbfd8F7" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610108565b60405180910390f35b6100566100d2565b61005e6100d2565b6100666100ea565b734cc16c0225227877a6e9b0331db2208ab1564ff8815273f1d75f95c81d77996883d4583b0ac62c07706b50602082015273e311b9eae0b076c9bbcafacb95b5f1c7ab8a582b604082015273ae7ccfbdc459209d7999951bad5d18f18fbfd8f760608201528152919050565b60405180602001604052806100e56100ea565b905290565b60405180608001604052806004906020820280368337509192915050565b815160808201908260005b600481101561013b5782516001600160a01b0316825260209283019290910190600101610113565b5050509291505056fea2646970667358221220d1ef960dccbf4a4c1a6f4c381e7e83ad97a06a13832a425e55828e0f8168ab4864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5a8b99b2 {\n address[4] s_0;\n }\n\n function test () public pure returns (S_5a8b99b2 memory) {\n S_5a8b99b2 memory r;\n {\n address[4] memory r_0;\n {\n address r_0_0 = 0x4cC16C0225227877A6E9B0331db2208Ab1564FF8;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xF1D75f95C81d77996883D4583b0AC62c07706B50;\n r_0[1] = r_0_1;\n }\n {\n address r_0_2 = 0xE311B9EaE0b076c9BbcafAcB95B5f1c7Ab8A582b;\n r_0[2] = r_0_2;\n }\n {\n address r_0_3 = 0xAe7CCfbDc459209d7999951baD5D18F18Fbfd8F7;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000004cc16c0225227877a6e9b0331db2208ab1564ff8000000000000000000000000f1d75f95c81d77996883d4583b0ac62c07706b50000000000000000000000000e311b9eae0b076c9bbcafacb95b5f1c7ab8a582b000000000000000000000000ae7ccfbdc459209d7999951bad5d18f18fbfd8f7" + }, + { + "name": "random-(bool,address)", + "type": "(bool,address)", + "value": [false, "0x6A6cc3B7288e08E58d1d810440DFf7199e28d035"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x6A6cc3B7288e08E58d1d810440DFf7199e28d035" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820181905282518084018452818152736a6cc3b7288e08e58d1d810440dff7199e28d0359083019081528351918252516001600160a01b03169181019190915281519081900390910190f3fea2646970667358221220b657ffa7f258ea1eb698ff62eec4888ea12b16986e792e1883ad865655c6d28164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e212a882 {\n bool s_0;\n address s_1;\n }\n\n function test () public pure returns (S_e212a882 memory) {\n S_e212a882 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x6A6cc3B7288e08E58d1d810440DFf7199e28d035;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a6cc3b7288e08e58d1d810440dff7199e28d035" + }, + { + "name": "random-(bool,bool)", + "type": "(bool,bool)", + "value": [true, false], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060a88061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201819052825180840184528083019182526001908190528351908152905115159181019190915281519081900390910190f3fea26469706673582212207e43c16418062f0a76dc2c086b1576cafcd0354a00676bae101f0e48af38e82d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_25e98821 {\n bool s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_25e98821 memory) {\n S_25e98821 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bytes21)", + "type": "(bool,bytes21)", + "value": [true, "0xd10b05bdad1415ee9d7a9877d3a0f44426daf9dd19"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xd10b05bdad1415ee9d7a9877d3a0f44426daf9dd19" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ca8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352600180825274d10b05bdad1415ee9d7a9877d3a0f44426daf9dd1960581b918301918252835190815290516affffffffffffffffffffff19169181019190915281519081900390910190f3fea264697066735822122033adab8daa1bb2cae45e8856fd8172a665333f0df34cfad0c58cf32c781b539664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_26afe313 {\n bool s_0;\n bytes21 s_1;\n }\n\n function test () public pure returns (S_26afe313 memory) {\n S_26afe313 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes21 r_1 = bytes21(0xd10b05bdad1415ee9d7a9877d3a0f44426daf9dd19);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001d10b05bdad1415ee9d7a9877d3a0f44426daf9dd190000000000000000000000" + }, + { + "name": "random-(bool,bytes28)", + "type": "(bool,bytes28)", + "value": [true, "0x7974461eb2cfd6d9a2218eaf321b755f538aa8945d3e0111715d1ce7"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x7974461eb2cfd6d9a2218eaf321b755f538aa8945d3e0111715d1ce7" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060cb8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835260018082527f7974461eb2cfd6d9a2218eaf321b755f538aa8945d3e0111715d1ce7000000009183019182528351908152905163ffffffff19169181019190915281519081900390910190f3fea2646970667358221220eafdcc0e591048e9bd16a3f1c395262abdf739a49c52293c5ac95d0a4033b2fd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c8850314 {\n bool s_0;\n bytes28 s_1;\n }\n\n function test () public pure returns (S_c8850314 memory) {\n S_c8850314 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes28 r_1 = bytes28(0x7974461eb2cfd6d9a2218eaf321b755f538aa8945d3e0111715d1ce7);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000017974461eb2cfd6d9a2218eaf321b755f538aa8945d3e0111715d1ce700000000" + }, + { + "name": "random-(bool,bytes6)", + "type": "(bool,bytes6)", + "value": [false, "0xbdcb13bac407"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xbdcb13bac407" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060b68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182018190528251808401845281815265bdcb13bac40760d01b9083019081528351918252516001600160d01b0319169181019190915281519081900390910190f3fea2646970667358221220683f0cb8156017e0fe07e95c9fdf029e4fc2aa8c1fa7860cdb7f682145435a0364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_402b8786 {\n bool s_0;\n bytes6 s_1;\n }\n\n function test () public pure returns (S_402b8786 memory) {\n S_402b8786 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bytes6 r_1 = bytes6(0xbdcb13bac407);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000bdcb13bac4070000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,int120)", + "type": "(bool,int120)", + "value": [false, "-200527602527694080353893121749080320"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-200527602527694080353893121749080320" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060b68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201819052825180840184528181526e269ec62d44a5e69ca9c7eae64ed8ff19908301908152835191825251600e0b9181019190915281519081900390910190f3fea2646970667358221220272f1e16608fa2e68219dd8181e24fded26d28b8766fb1f311480bb40e82242164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_77e98d28 {\n bool s_0;\n int120 s_1;\n }\n\n function test () public pure returns (S_77e98d28 memory) {\n S_77e98d28 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int120 r_1 = -200527602527694080353893121749080320;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffd96139d2bb5a196356381519b12700" + }, + { + "name": "random-(bool,int160)", + "type": "(bool,int160)", + "value": [true, "632259294245089831601225058049299569208381193221"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "632259294245089831601225058049299569208381193221" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060bb8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183526001808252736ebf7cbf9997e287902624c35691fad9fe98bc059183019182528351908152905160130b9181019190915281519081900390910190f3fea26469706673582212209dcbf0162ae3c5fd05bd029d4bd40fd945ab6b41d213e6b07d6f24e944c2a28b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5052fa0a {\n bool s_0;\n int160 s_1;\n }\n\n function test () public pure returns (S_5052fa0a memory) {\n S_5052fa0a memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n int160 r_1 = 632259294245089831601225058049299569208381193221;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000006ebf7cbf9997e287902624c35691fad9fe98bc05" + }, + { + "name": "random-(bool,int48)", + "type": "(bool,int48)", + "value": [true, "-74515521836893"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-74515521836893" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ae8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835260018082526543c57f35975c199183019182528351908152905160050b9181019190915281519081900390910190f3fea2646970667358221220b98d2321cdff5e49e240ef57376ca1c64c5b66ab8d5efbf5b26b21746b9b6fa864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bdb1bbf0 {\n bool s_0;\n int48 s_1;\n }\n\n function test () public pure returns (S_bdb1bbf0 memory) {\n S_bdb1bbf0 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n int48 r_1 = -74515521836893;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffbc3a80ca68a3" + }, + { + "name": "random-(bool,int72)", + "type": "(bool,int72)", + "value": [false, "-1140501498991239166401"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-1140501498991239166401" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820181905282518084018452818152683dd3a346b25556f9c01990830190815283519182525160080b9181019190915281519081900390910190f3fea2646970667358221220743e92489a594f4b6e88e2513bf6c68b5d59c7412550fdebff4605afbdee1c1a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6435281a {\n bool s_0;\n int72 s_1;\n }\n\n function test () public pure returns (S_6435281a memory) {\n S_6435281a memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int72 r_1 = -1140501498991239166401;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffc22c5cb94daaa9063f" + }, + { + "name": "random-(bool,string)", + "type": "(bool,string)", + "value": [false, "Moo é🚀oMoM o o é oMo Mééé🚀M🚀🚀 🚀éoo é🚀oo 🚀oooéooéoM"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oMoM o o é oMo Mééé🚀M🚀🚀 🚀éoo é🚀oo 🚀oooéooéoM" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610192806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100a0565b60405180910390f35b60408051808201909152600081526060602082015260408051808201909152600081526060602082015260008082526040805160808101909152605380825261010a6020830139602083015250919050565b60006020808352835115158184015280840151604080850152805180606086015260005b818110156100e0578281018401518682016080015283016100c4565b818111156100f2576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a806f4d6f4d206f206f2020c3a920206f4d6f204dc3a9c3a9c3a9f09f9a804df09f9a80f09f9a802020f09f9a80c3a96f6f20c3a9f09f9a806f6f20f09f9a806f6f6fc3a96f6fc3a96f4da2646970667358221220ccc9d2f8c12aab11c220e1ac6123a737d59786794ac20b761a56b7f1d29fc23364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0e00bb9b {\n bool s_0;\n string s_1;\n }\n\n function test () public pure returns (S_0e00bb9b memory) {\n S_0e00bb9b memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oMoM o o é oMo Mééé🚀M🚀🚀 🚀éoo é🚀oo 🚀oooéooéoM\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a806f4d6f4d206f206f2020c3a920206f4d6f204dc3a9c3a9c3a9f09f9a804df09f9a80f09f9a802020f09f9a80c3a96f6f20c3a9f09f9a806f6f20f09f9a806f6f6fc3a96f6fc3a96f4d00000000000000000000000000" + }, + { + "name": "random-(bool,uint16)", + "type": "(bool,uint16)", + "value": [false, "55978"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "55978" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060a98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182018190528251808401845281815261daaa90830190815283519182525161ffff169181019190915281519081900390910190f3fea264697066735822122072a1f81ef43361c1763024521e2d95361e3a457b45d153126023bc4cf9e0175964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_60827174 {\n bool s_0;\n uint16 s_1;\n }\n\n function test () public pure returns (S_60827174 memory) {\n S_60827174 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n uint16 r_1 = 55978;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000daaa" + }, + { + "name": "random-(bool,uint216)", + "type": "(bool,uint216)", + "value": [false, "87165202384040111766208478397873575359676544614498925030616085697"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "87165202384040111766208478397873575359676544614498925030616085697" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c78061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201819052825180840184528181527ad3e309e290ea87b5277f1f3cb03b19c95f2633bf7efefecd4434c19083019081528351918252516001600160d81b03169181019190915281519081900390910190f3fea26469706673582212202c739ef0f89fab3a853df3c46a66cfb179a4311692e7feca70ea7d7dc564213c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7758628d {\n bool s_0;\n uint216 s_1;\n }\n\n function test () public pure returns (S_7758628d memory) {\n S_7758628d memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n uint216 r_1 = 87165202384040111766208478397873575359676544614498925030616085697;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000d3e309e290ea87b5277f1f3cb03b19c95f2633bf7efefecd4434c1" + }, + { + "name": "random-(bool)[]", + "type": "(bool)[]", + "value": [[false], [false], [true]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101d4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610141565b60405180910390f35b6040805160038082526080820190925260609160009190816020015b60408051602081019091526000815281526020019060019003908161006a5750506040805160208101909152600080825282519293509091829184916100b2576100b2610188565b6020026020010181905250506100d660405180602001604052806000151581525090565b6000815281518190839060019081106100f1576100f1610188565b60200260200101819052505061011560405180602001604052806000151581525090565b60018152815181908390600290811061013057610130610188565b602090810291909101015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561017c5783515115158352928401929184019160010161015d565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220303b703f551cca033f2306f043d64d529e9f9760bb5a332969f21dfaad465fb264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n function test () public pure returns (S_c1053bda[] memory) {\n S_c1053bda[] memory r = new S_c1053bda[](3);\n {\n S_c1053bda memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_c1053bda memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_c1053bda memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool)[4]", + "type": "(bool)[4]", + "value": [[false], [false], [false], [true]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610144806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100da565b60405180910390f35b6100566100a6565b61005e6100a6565b60408051602080820183526000808352918452825180820184528281528482015282518082018452918252838301919091528151908101909152600181526060820152919050565b60405180608001604052806004905b6040805160208101909152600081528152602001906001900390816100b55790505090565b60808101818360005b60048110156101055781515115158352602092830192909101906001016100e3565b5050509291505056fea264697066735822122019ffe95336670cc7848d61c294aa7f39f9c24b2ec2aea77e2377eeef50630dfb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n function test () public pure returns (S_c1053bda[4] memory) {\n S_c1053bda[4] memory r;\n {\n S_c1053bda memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_c1053bda memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_c1053bda memory r_2;\n {\n bool r_2_0 = false;\n r_2.s_0 = r_2_0;\n }\n r[2] = r_2;\n }\n {\n S_c1053bda memory r_3;\n {\n bool r_3_0 = true;\n r_3.s_0 = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool[])", + "type": "(bool[])", + "value": [[true, true, true]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011a565b60405180910390f35b6040805160208082018352606080835283519182018452815282516003808252608082019094529192909160009181602001602082028036833701905050905060006001905080826000815181106100a8576100a861016c565b6020026020010190151590811515815250505060006001905080826001815181106100d5576100d561016c565b6020026020010190151590811515815250505060006001905080826002815181106101025761010261016c565b91151560209283029190910190910152508152919050565b6020808252825182820182905280516040840181905260009291820190839060608601905b808310156101615783511515825292840192600192909201919084019061013f565b509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220901be4cfdc4761324137bb00a86e72ed0cf907679b29bc724d16a87dfa36c02264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8761250c {\n bool[] s_0;\n }\n\n function test () public pure returns (S_8761250c memory) {\n S_8761250c memory r;\n {\n bool[] memory r_0 = new bool[](3);\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool[1])", + "type": "(bool[1])", + "value": [[false]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610101806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906098565b60405180910390f35b604d6064565b60536064565b6059607a565b600081528152919050565b60405180602001604052806075607a565b905290565b60405180602001604052806001906020820280368337509192915050565b81516020828101918360005b600181101560c157825115158252918301919083019060010160a4565b505050509291505056fea26469706673582212206ab2d548fa9d7d84c103753c4da0969c11105ff32ec03a3449ce32bf3981151564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d2d22cc7 {\n bool[1] s_0;\n }\n\n function test () public pure returns (S_d2d22cc7 memory) {\n S_d2d22cc7 memory r;\n {\n bool[1] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool[4])", + "type": "(bool[4])", + "value": [[true, false, true, false]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610118806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060af565b60405180910390f35b604d607b565b6053607b565b60596091565b6001808252600060208301819052604083019190915260608201528152919050565b6040518060200160405280608c6091565b905290565b60405180608001604052806004906020820280368337509192915050565b815160808201908260005b600481101560d9578251151582526020928301929091019060010160ba565b5050509291505056fea2646970667358221220b16b44ec8efe972fc9c951cf752f901dcfd1ce511bb91107e83ffe8bb986348364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4c932bca {\n bool[4] s_0;\n }\n\n function test () public pure returns (S_4c932bca memory) {\n S_4c932bca memory r;\n {\n bool[4] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes11,bytes10)", + "type": "(bytes11,bytes10)", + "value": ["0x81a07c335f1459acac732b", "0x23367496ee8b596a4776"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x81a07c335f1459acac732b" + }, + { + "type": "hexstring", + "value": "0x23367496ee8b596a4776" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c88061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183526a81a07c335f1459acac732b60a81b80825269119b3a4b7745acb523bb60b11b918301918252835190815290516001600160b01b0319169181019190915281519081900390910190f3fea264697066735822122008c5406962c34268e2fa28e3ac00adbdaf68e04ac448fd4578d0b9c306051ecf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_053c0310 {\n bytes11 s_0;\n bytes10 s_1;\n }\n\n function test () public pure returns (S_053c0310 memory) {\n S_053c0310 memory r;\n {\n bytes11 r_0 = bytes11(0x81a07c335f1459acac732b);\n r.s_0 = r_0;\n }\n {\n bytes10 r_1 = bytes10(0x23367496ee8b596a4776);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x81a07c335f1459acac732b00000000000000000000000000000000000000000023367496ee8b596a477600000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes11,bytes22)", + "type": "(bytes11,bytes22)", + "value": ["0xe43baebe6de636a2f1f758", "0xc71990f84820456303656d561deef26172af44ef4775"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe43baebe6de636a2f1f758" + }, + { + "type": "hexstring", + "value": "0xc71990f84820456303656d561deef26172af44ef4775" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d78061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183526a1c8775d7cdbcc6d45e3eeb60ab1b80825275c71990f84820456303656d561deef26172af44ef477560501b9183019182528351908152905169ffffffffffffffffffff19169181019190915281519081900390910190f3fea2646970667358221220d0db7026dc262526421edfc622d0e3a2de7e970b12fc68e1005d43220f47f9cb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_263b9e7f {\n bytes11 s_0;\n bytes22 s_1;\n }\n\n function test () public pure returns (S_263b9e7f memory) {\n S_263b9e7f memory r;\n {\n bytes11 r_0 = bytes11(0xe43baebe6de636a2f1f758);\n r.s_0 = r_0;\n }\n {\n bytes22 r_1 = bytes22(0xc71990f84820456303656d561deef26172af44ef4775);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xe43baebe6de636a2f1f758000000000000000000000000000000000000000000c71990f84820456303656d561deef26172af44ef477500000000000000000000" + }, + { + "name": "random-(bytes11)[1]", + "type": "(bytes11)[1]", + "value": [["0x4acc576b33c69bec461d21"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4acc576b33c69bec461d21" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061011a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a9565b60405180910390f35b604d6076565b60536076565b60408051602081019091526a4acc576b33c69bec461d2160a81b81528152919050565b60405180602001604052806001905b60408051602081019091526000815281526020019060019003908160855790505090565b602081810190828460005b600181101560da578151516001600160a81b0319168352918301919083019060010160b4565b505050509291505056fea26469706673582212203a663c5da91763fd9df1a367aeaef524841648537644717ff5897f1efb84a53c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1b4cf483 {\n bytes11 s_0;\n }\n\n function test () public pure returns (S_1b4cf483[1] memory) {\n S_1b4cf483[1] memory r;\n {\n S_1b4cf483 memory r_0;\n {\n bytes11 r_0_0 = bytes11(0x4acc576b33c69bec461d21);\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x4acc576b33c69bec461d21000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes13,address)", + "type": "(bytes13,address)", + "value": ["0x5862b76b3c90cb55940e9b6641", "0xf4eDBA6504A30b5618D22aD555D7bF086Eb00371"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5862b76b3c90cb55940e9b6641" + }, + { + "type": "address", + "value": "0xf4eDBA6504A30b5618D22aD555D7bF086Eb00371" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183526c5862b76b3c90cb55940e9b664160981b80825273f4edba6504a30b5618d22ad555d7bf086eb00371918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea264697066735822122097617cf3ffbf1f833d0e6d51cf6e1fe945c7805e373e655d5324a1778cff275664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ad52bcb9 {\n bytes13 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_ad52bcb9 memory) {\n S_ad52bcb9 memory r;\n {\n bytes13 r_0 = bytes13(0x5862b76b3c90cb55940e9b6641);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xf4eDBA6504A30b5618D22aD555D7bF086Eb00371;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x5862b76b3c90cb55940e9b664100000000000000000000000000000000000000000000000000000000000000f4edba6504a30b5618d22ad555d7bf086eb00371" + }, + { + "name": "random-(bytes16,bytes8)", + "type": "(bytes16,bytes8)", + "value": ["0xc4b0d3d23ad8250f10e1aa9d1d7f8022", "0x3a969acdc576e584"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc4b0d3d23ad8250f10e1aa9d1d7f8022" + }, + { + "type": "hexstring", + "value": "0x3a969acdc576e584" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060cb8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183526f625869e91d6c12878870d54e8ebfc01160811b808252670ea5a6b3715db96160c21b918301918252835190815290516001600160c01b0319169181019190915281519081900390910190f3fea26469706673582212201b19c17eef3c7b104983a813fd704c21efaa4d633810df6219f6e398a48922b664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f779c28d {\n bytes16 s_0;\n bytes8 s_1;\n }\n\n function test () public pure returns (S_f779c28d memory) {\n S_f779c28d memory r;\n {\n bytes16 r_0 = bytes16(0xc4b0d3d23ad8250f10e1aa9d1d7f8022);\n r.s_0 = r_0;\n }\n {\n bytes8 r_1 = bytes8(0x3a969acdc576e584);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xc4b0d3d23ad8250f10e1aa9d1d7f8022000000000000000000000000000000003a969acdc576e584000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes16[1])", + "type": "(bytes16[1])", + "value": [["0x69bb67dd1fa5bb4a9855a7f50b32b9cd"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x69bb67dd1fa5bb4a9855a7f50b32b9cd" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610124806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060aa565b60405180910390f35b604d6076565b60536076565b6059608c565b6f69bb67dd1fa5bb4a9855a7f50b32b9cd60801b81528152919050565b60405180602001604052806087608c565b905290565b60405180602001604052806001906020820280368337509192915050565b81516020828101918360005b600181101560e45782516fffffffffffffffffffffffffffffffff19168252918301919083019060010160b6565b505050509291505056fea26469706673582212206eea35adf35d647f934d8d31e02e8185d50ead2158b13b68982d11b6b082077364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_23989784 {\n bytes16[1] s_0;\n }\n\n function test () public pure returns (S_23989784 memory) {\n S_23989784 memory r;\n {\n bytes16[1] memory r_0;\n {\n bytes16 r_0_0 = bytes16(0x69bb67dd1fa5bb4a9855a7f50b32b9cd);\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x69bb67dd1fa5bb4a9855a7f50b32b9cd00000000000000000000000000000000" + }, + { + "name": "random-(bytes18,bool)", + "type": "(bytes18,bool)", + "value": ["0x21d679e8e6ca3c669bec01f2fc6f76ada5f4", true], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x21d679e8e6ca3c669bec01f2fc6f76ada5f4" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060bb8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183527108759e7a39b28f19a6fb007cbf1bddab697d60721b80825260019183019182528351908152905115159181019190915281519081900390910190f3fea26469706673582212204e1716e3a15d772dddb83671c7919751c92aba1cc571d09132f81f3ff1e32eb164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_897dc7d7 {\n bytes18 s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_897dc7d7 memory) {\n S_897dc7d7 memory r;\n {\n bytes18 r_0 = bytes18(0x21d679e8e6ca3c669bec01f2fc6f76ada5f4);\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x21d679e8e6ca3c669bec01f2fc6f76ada5f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bytes18,int128)", + "type": "(bytes18,int128)", + "value": [ + "0x9b7403c28aed20a70ef18150ecb47b2b36f1", + "-9906609592797879413297084991507254536" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9b7403c28aed20a70ef18150ecb47b2b36f1" + }, + { + "type": "number", + "value": "-9906609592797879413297084991507254536" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060cc8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352719b7403c28aed20a70ef18150ecb47b2b36f160701b8082526f0773f1902d3e3ffd023d2f533b97cd071991830191825283519081529051600f0b9181019190915281519081900390910190f3fea2646970667358221220317dfe751e35209b4b309bc9f8a5bfd55943ebc5bbe9c8018679d23e0054a46e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_506e5adc {\n bytes18 s_0;\n int128 s_1;\n }\n\n function test () public pure returns (S_506e5adc memory) {\n S_506e5adc memory r;\n {\n bytes18 r_0 = bytes18(0x9b7403c28aed20a70ef18150ecb47b2b36f1);\n r.s_0 = r_0;\n }\n {\n int128 r_1 = -9906609592797879413297084991507254536;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x9b7403c28aed20a70ef18150ecb47b2b36f10000000000000000000000000000fffffffffffffffffffffffffffffffff88c0e6fd2c1c002fdc2d0acc46832f8" + }, + { + "name": "random-(bytes18,uint144)", + "type": "(bytes18,uint144)", + "value": [ + "0x5bd597759ba21d3b0a959d312f32649c0884", + "6123384944193220257266146777339123214536772" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5bd597759ba21d3b0a959d312f32649c0884" + }, + { + "type": "number", + "value": "6123384944193220257266146777339123214536772" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060de8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183527116f565dd66e8874ec2a5674c4bcc9927022160721b80825271464b02d280cfa84caf9c1fabecbf6f7f50449183019182528351908152905171ffffffffffffffffffffffffffffffffffff169181019190915281519081900390910190f3fea26469706673582212201f16c117950b49c606fa0672b3d29806a5f4cabef4870be9696d7b01c149423264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c829e6cb {\n bytes18 s_0;\n uint144 s_1;\n }\n\n function test () public pure returns (S_c829e6cb memory) {\n S_c829e6cb memory r;\n {\n bytes18 r_0 = bytes18(0x5bd597759ba21d3b0a959d312f32649c0884);\n r.s_0 = r_0;\n }\n {\n uint144 r_1 = 6123384944193220257266146777339123214536772;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x5bd597759ba21d3b0a959d312f32649c088400000000000000000000000000000000000000000000000000000000464b02d280cfa84caf9c1fabecbf6f7f5044" + }, + { + "name": "random-(bytes19,address)", + "type": "(bytes19,address)", + "value": [ + "0xf3151fa9a097a8086b84d95cbf62097ba2b29d", + "0x5AC583595b0472ce2cBC320D3E5872625CC0634B" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf3151fa9a097a8086b84d95cbf62097ba2b29d" + }, + { + "type": "address", + "value": "0x5AC583595b0472ce2cBC320D3E5872625CC0634B" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835272f3151fa9a097a8086b84d95cbf62097ba2b29d60681b808252735ac583595b0472ce2cbc320d3e5872625cc0634b918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea26469706673582212205c0df11d9eb5db2e8f33946c5c40714b4d9bfceccc45986321218971428e778f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_284b0fd8 {\n bytes19 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_284b0fd8 memory) {\n S_284b0fd8 memory r;\n {\n bytes19 r_0 = bytes19(0xf3151fa9a097a8086b84d95cbf62097ba2b29d);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x5AC583595b0472ce2cBC320D3E5872625CC0634B;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xf3151fa9a097a8086b84d95cbf62097ba2b29d000000000000000000000000000000000000000000000000005ac583595b0472ce2cbc320d3e5872625cc0634b" + }, + { + "name": "random-(bytes20,string)", + "type": "(bytes20,string)", + "value": [ + "0x3fba4a06135661c87cffa6d91a7e249942876541", + "Moo é🚀oé🚀M🚀 éoéooé oéé o ooo🚀 🚀éoo🚀M 🚀o🚀🚀M ooMééooMé" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3fba4a06135661c87cffa6d91a7e249942876541" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀M🚀 éoéooé oéé o ooo🚀 🚀éoo🚀M 🚀o🚀🚀M ooMééooMé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101bf806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b9565b60405180910390f35b604080518082019091526000815260606020820152604080518082019091526000815260606020820152733fba4a06135661c87cffa6d91a7e24994287654160601b81526040805160808101909152605a808252600091906101306020830139602083015250919050565b600060208083526bffffffffffffffffffffffff198451168184015280840151604080850152805180606086015260005b81811015610106578281018401518682016080015283016100ea565b81811115610118576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a806fc3a9f09f9a804df09f9a8020c3a96fc3a96f6fc3a9206fc3a9c3a9206f206f6f6ff09f9a8020f09f9a80c3a96f6ff09f9a804d20f09f9a806ff09f9a80f09f9a804d206f6f4dc3a9c3a96f6f4dc3a9a264697066735822122010b284cd233e3de5440029bad60e3ff3d990d1aefe7cf58278890e3ca7e6239364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d0250507 {\n bytes20 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_d0250507 memory) {\n S_d0250507 memory r;\n {\n bytes20 r_0 = bytes20(0x3FBa4A06135661C87CffA6D91a7E249942876541);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oé🚀M🚀 éoéooé oéé o ooo🚀 🚀éoo🚀M 🚀o🚀🚀M ooMééooMé\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000203fba4a06135661c87cffa6d91a7e2499428765410000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806fc3a9f09f9a804df09f9a8020c3a96fc3a96f6fc3a9206fc3a9c3a9206f206f6f6ff09f9a8020f09f9a80c3a96f6ff09f9a804d20f09f9a806ff09f9a80f09f9a804d206f6f4dc3a9c3a96f6f4dc3a9000000000000" + }, + { + "name": "random-(bytes22)[2]", + "type": "(bytes22)[2]", + "value": [ + ["0xf58de9012784dd32599021ed4498d2501fe8a4085614"], + ["0xfbc332c4abe7a324d44bdcaa3915d34852f7c820b29d"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf58de9012784dd32599021ed4498d2501fe8a4085614" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfbc332c4abe7a324d44bdcaa3915d34852f7c820b29d" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e8565b60405180910390f35b6100566100b4565b61005e6100b4565b6040805160208082018352753d637a4049e1374c9664087b5126349407fa2902158560521b8252908352815180820190925275fbc332c4abe7a324d44bdcaa3915d34852f7c820b29d60501b8252820152919050565b60405180604001604052806002905b6040805160208101909152600081528152602001906001900390816100c35790505090565b60408101818360005b600281101561011e5781515169ffffffffffffffffffff19168352602092830192909101906001016100f1565b5050509291505056fea2646970667358221220e5377b64f00f02b46e611fc5ac39f5b624d17d3881d72d58c9b7e1e8efb49aaa64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_50006446 {\n bytes22 s_0;\n }\n\n function test () public pure returns (S_50006446[2] memory) {\n S_50006446[2] memory r;\n {\n S_50006446 memory r_0;\n {\n bytes22 r_0_0 = bytes22(0xf58de9012784dd32599021ed4498d2501fe8a4085614);\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_50006446 memory r_1;\n {\n bytes22 r_1_0 = bytes22(0xfbc332c4abe7a324d44bdcaa3915d34852f7c820b29d);\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xf58de9012784dd32599021ed4498d2501fe8a408561400000000000000000000fbc332c4abe7a324d44bdcaa3915d34852f7c820b29d00000000000000000000" + }, + { + "name": "random-(bytes23,bool)", + "type": "(bytes23,bool)", + "value": ["0x751643cd0516b872bb689e7882a4ed125925d960acecd7", true], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x751643cd0516b872bb689e7882a4ed125925d960acecd7" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183527f751643cd0516b872bb689e7882a4ed125925d960acecd700000000000000000080825260019183019182528351908152905115159181019190915281519081900390910190f3fea2646970667358221220d5d266b7917921f22b214c09b7cb7522670e5a1783d499a1dc0d883b97ead05c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c53fe6be {\n bytes23 s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_c53fe6be memory) {\n S_c53fe6be memory r;\n {\n bytes23 r_0 = bytes23(0x751643cd0516b872bb689e7882a4ed125925d960acecd7);\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x751643cd0516b872bb689e7882a4ed125925d960acecd70000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bytes27,bool)", + "type": "(bytes27,bool)", + "value": ["0xf39996b8563edc6a93d6fe473386aeb8af472fcb4f3976195fa640", false], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf39996b8563edc6a93d6fe473386aeb8af472fcb4f3976195fa640" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c78061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201819052825180840184528083019182527ff39996b8563edc6a93d6fe473386aeb8af472fcb4f3976195fa6400000000000908190528351908152905115159181019190915281519081900390910190f3fea2646970667358221220195ea6c3c38987184f342473851bcf424ce4e01a92e305415c90f800185f2d6c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a641c2dc {\n bytes27 s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_a641c2dc memory) {\n S_a641c2dc memory r;\n {\n bytes27 r_0 = bytes27(0xf39996b8563edc6a93d6fe473386aeb8af472fcb4f3976195fa640);\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xf39996b8563edc6a93d6fe473386aeb8af472fcb4f3976195fa64000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes27[])", + "type": "(bytes27[])", + "value": [[]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f48061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516020808201835260609182905282518082018452918252825160008152908101835281529051605f91906068565b60405180910390f35b6020808252825182820182905280516040840181905260009291820190839060608601905b8083101560b357835164ffffffffff19168252928401926001929092019190840190608d565b50969550505050505056fea2646970667358221220ffdd7f5a2d13a4fc3211efaf2779b42eafa99ef61696b0148eb1c4c553aec0ef64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0e795d26 {\n bytes27[] s_0;\n }\n\n function test () public pure returns (S_0e795d26 memory) {\n S_0e795d26 memory r;\n {\n bytes27[] memory r_0 = new bytes27[](0);\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes28,address)", + "type": "(bytes28,address)", + "value": [ + "0x5e56fee6cbbcc00228e34cdea75fece04be58a7911a7b2b2d4de2aff", + "0x00e04055f05167D69E38BA1607fF0bc7EbEf757E" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5e56fee6cbbcc00228e34cdea75fece04be58a7911a7b2b2d4de2aff" + }, + { + "type": "address", + "value": "0x00e04055f05167D69E38BA1607fF0bc7EbEf757E" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060df8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183527f5e56fee6cbbcc00228e34cdea75fece04be58a7911a7b2b2d4de2aff0000000080825272e04055f05167d69e38ba1607ff0bc7ebef757e918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea2646970667358221220006de0055b4a70888d651c091451781b14cd745493e9346e632e30bb9fe1ea4964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_113ad7c9 {\n bytes28 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_113ad7c9 memory) {\n S_113ad7c9 memory r;\n {\n bytes28 r_0 = bytes28(0x5e56fee6cbbcc00228e34cdea75fece04be58a7911a7b2b2d4de2aff);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x00e04055f05167D69E38BA1607fF0bc7EbEf757E;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x5e56fee6cbbcc00228e34cdea75fece04be58a7911a7b2b2d4de2aff0000000000000000000000000000000000e04055f05167d69e38ba1607ff0bc7ebef757e" + }, + { + "name": "random-(bytes3,address)", + "type": "(bytes3,address)", + "value": ["0x51fbfb", "0x02ac991fea474572f7BC1B23Fe96A8db7E49Ab7F"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x51fbfb" + }, + { + "type": "address", + "value": "0x02ac991fea474572f7BC1B23Fe96A8db7E49Ab7F" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183526251fbfb60e81b8082527302ac991fea474572f7bc1b23fe96a8db7e49ab7f918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea264697066735822122032c01969e1b03116af23a6676f61daf45f506d05c64f2bc5cb6151efaab72a9d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9e092c52 {\n bytes3 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_9e092c52 memory) {\n S_9e092c52 memory r;\n {\n bytes3 r_0 = bytes3(0x51fbfb);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x02ac991fea474572f7BC1B23Fe96A8db7E49Ab7F;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x51fbfb000000000000000000000000000000000000000000000000000000000000000000000000000000000002ac991fea474572f7bc1b23fe96a8db7e49ab7f" + }, + { + "name": "random-(bytes30[])", + "type": "(bytes30[])", + "value": [ + [ + "0x1ec9284335849ab092d4dbc3506b9f5bb67ce5599fbeafe6e7a2b88caf27", + "0x65a8801d2186311b21bc4617d485101a68871088a2cd2ef1d37c9e6e19c3" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1ec9284335849ab092d4dbc3506b9f5bb67ce5599fbeafe6e7a2b88caf27" + }, + { + "type": "hexstring", + "value": "0x65a8801d2186311b21bc4617d485101a68871088a2cd2ef1d37c9e6e19c3" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ce806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012d565b60405180910390f35b6040805160208082018352606080835283518083018552818152845160028082529281018652939490936000939092919083019080368337505081519192507f1ec9284335849ab092d4dbc3506b9f5bb67ce5599fbeafe6e7a2b88caf2700009182915083906000906100c3576100c3610182565b61ffff19909216602092830291909101909101525080517f65a8801d2186311b21bc4617d485101a68871088a2cd2ef1d37c9e6e19c300009081908390600190811061011157610111610182565b61ffff1990921660209283029190910190910152508152919050565b6020808252825182820182905280516040840181905260009291820190839060608601905b8083101561017757835161ffff19168252928401926001929092019190840190610152565b509695505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122031c39d6841221d584addb74a3207e539e8f3a625fc5d6a6be96f554317a8f8f964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_180840c8 {\n bytes30[] s_0;\n }\n\n function test () public pure returns (S_180840c8 memory) {\n S_180840c8 memory r;\n {\n bytes30[] memory r_0 = new bytes30[](2);\n {\n bytes30 r_0_0 = bytes30(0x1ec9284335849ab092d4dbc3506b9f5bb67ce5599fbeafe6e7a2b88caf27);\n r_0[0] = r_0_0;\n }\n {\n bytes30 r_0_1 = bytes30(0x65a8801d2186311b21bc4617d485101a68871088a2cd2ef1d37c9e6e19c3);\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000021ec9284335849ab092d4dbc3506b9f5bb67ce5599fbeafe6e7a2b88caf27000065a8801d2186311b21bc4617d485101a68871088a2cd2ef1d37c9e6e19c30000" + }, + { + "name": "random-(bytes4,address)", + "type": "(bytes4,address)", + "value": ["0xaf8e75d7", "0xb4d1fECB7dC89FC277D1Aff5B66d68208D7b2177"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xaf8e75d7" + }, + { + "type": "address", + "value": "0xb4d1fECB7dC89FC277D1Aff5B66d68208D7b2177" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c78061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835263af8e75d760e01b80825273b4d1fecb7dc89fc277d1aff5b66d68208d7b2177918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea26469706673582212209c701f81f4172ed8ab4ca1d2a9884268d7aac73f689f7687818f80a33a2caa2e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_dc9b5706 {\n bytes4 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_dc9b5706 memory) {\n S_dc9b5706 memory r;\n {\n bytes4 r_0 = bytes4(0xaf8e75d7);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xb4d1fECB7dC89FC277D1Aff5B66d68208D7b2177;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xaf8e75d700000000000000000000000000000000000000000000000000000000000000000000000000000000b4d1fecb7dc89fc277d1aff5b66d68208d7b2177" + }, + { + "name": "random-(bytes5)[1]", + "type": "(bytes5)[1]", + "value": [["0x382d85e020"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x382d85e020" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610114806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a3565b60405180910390f35b604d6070565b60536070565b60408051602081019091526401c16c2f0160dd1b81528152919050565b60405180602001604052806001905b604080516020810190915260008152815260200190600190039081607f5790505090565b602081810190828460005b600181101560d4578151516001600160d81b0319168352918301919083019060010160ae565b505050509291505056fea264697066735822122049dbf4909059c8eb5e8fac6ef5ee8db06d6ec55566614ad72ce19c0892f024f764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_167f749a {\n bytes5 s_0;\n }\n\n function test () public pure returns (S_167f749a[1] memory) {\n S_167f749a[1] memory r;\n {\n S_167f749a memory r_0;\n {\n bytes5 r_0_0 = bytes5(0x382d85e020);\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x382d85e020000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes7,bytes19)", + "type": "(bytes7,bytes19)", + "value": ["0xefa2d1ba6cd34d", "0x76882969d2017d92e37aa083c14a9c80fcdae9"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xefa2d1ba6cd34d" + }, + { + "type": "hexstring", + "value": "0x76882969d2017d92e37aa083c14a9c80fcdae9" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d38061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835266efa2d1ba6cd34d60c81b8082527276882969d2017d92e37aa083c14a9c80fcdae960681b918301918252835190815290516cffffffffffffffffffffffffff19169181019190915281519081900390910190f3fea2646970667358221220352d7140a4e0ef794146c8ac17d5f20569e2f5132cace6ba13567a80d9d3b09464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8357c12d {\n bytes7 s_0;\n bytes19 s_1;\n }\n\n function test () public pure returns (S_8357c12d memory) {\n S_8357c12d memory r;\n {\n bytes7 r_0 = bytes7(0xefa2d1ba6cd34d);\n r.s_0 = r_0;\n }\n {\n bytes19 r_1 = bytes19(0x76882969d2017d92e37aa083c14a9c80fcdae9);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xefa2d1ba6cd34d0000000000000000000000000000000000000000000000000076882969d2017d92e37aa083c14a9c80fcdae900000000000000000000000000" + }, + { + "name": "random-(bytes7,string)", + "type": "(bytes7,string)", + "value": [ + "0x8c9e8940818414", + "Moo é🚀 M🚀 oooé 🚀 M o é🚀éooo🚀oéoMé🚀🚀oéM🚀🚀oéo 🚀oooé o🚀🚀M🚀ooM o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8c9e8940818414" + }, + { + "type": "string", + "value": "Moo é🚀 M🚀 oooé 🚀 M o é🚀éooo🚀oéoMé🚀🚀oéM🚀🚀oéo 🚀oooé o🚀🚀M🚀ooM o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ac565b60405180910390f35b604080518082019091526000815260606020820152604080518082019091526000815260606020820152662327a25020610560ca1b81526040805160a08101909152606e808252600091906101206020830139602083015250919050565b6000602080835266ffffffffffffff60c81b8451168184015280840151604080850152805180606086015260005b818110156100f6578281018401518682016080015283016100da565b81811115610108576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a80204df09f9a80206f6f6fc3a9202020f09f9a80204d206f20c3a9f09f9a80c3a96f6f6ff09f9a806fc3a96f4dc3a9f09f9a80f09f9a806fc3a94df09f9a80f09f9a806fc3a96f20f09f9a806f6f6fc3a9206ff09f9a80f09f9a804df09f9a806f6f4d206fa264697066735822122058e4e1d7812247c4bfd509e0159872cb9374324e376977884e9efb778d4d8faf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_76f7d9be {\n bytes7 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_76f7d9be memory) {\n S_76f7d9be memory r;\n {\n bytes7 r_0 = bytes7(0x8c9e8940818414);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 M🚀 oooé 🚀 M o é🚀éooo🚀oéoMé🚀🚀oéM🚀🚀oéo 🚀oooé o🚀🚀M🚀ooM o\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000208c9e8940818414000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006e4d6f6f20c3a9f09f9a80204df09f9a80206f6f6fc3a9202020f09f9a80204d206f20c3a9f09f9a80c3a96f6f6ff09f9a806fc3a96f4dc3a9f09f9a80f09f9a806fc3a94df09f9a80f09f9a806fc3a96f20f09f9a806f6f6fc3a9206ff09f9a80f09f9a804df09f9a806f6f4d206f000000000000000000000000000000000000" + }, + { + "name": "random-(bytes7)[2]", + "type": "(bytes7)[2]", + "value": [["0x293ab54da0e44a"], ["0x5432e94139d0b0"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x293ab54da0e44a" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5432e94139d0b0" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060be565b60405180910390f35b604d608b565b6053608b565b604080516020808201835266149d5aa6d0722560c91b825290835281518082019092526605432e94139d0b60cc1b8252820152919050565b60405180604001604052806002905b604080516020810190915260008152815260200190600190039081609a5790505090565b60408101818360005b600281101560ef578151516001600160c81b03191683526020928301929091019060010160c7565b5050509291505056fea264697066735822122068307856ec9f601afe68fc21e10993687457b20ebe70d0b3dbd8585df5057ddd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_16e6ff5c {\n bytes7 s_0;\n }\n\n function test () public pure returns (S_16e6ff5c[2] memory) {\n S_16e6ff5c[2] memory r;\n {\n S_16e6ff5c memory r_0;\n {\n bytes7 r_0_0 = bytes7(0x293ab54da0e44a);\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_16e6ff5c memory r_1;\n {\n bytes7 r_1_0 = bytes7(0x5432e94139d0b0);\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x293ab54da0e44a000000000000000000000000000000000000000000000000005432e94139d0b000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int,address)", + "type": "(int,address)", + "value": [ + "-34846116124737989606570417020060979443781572848779555066736632306773150921265", + "0xB6581557115a69a2CB39Cf6C86786a392626a1c2" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-34846116124737989606570417020060979443781572848779555066736632306773150921265" + }, + { + "type": "address", + "value": "0xB6581557115a69a2CB39Cf6C86786a392626a1c2" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e38061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083019092527fb2f5cc156cf000e9b420dbac1285f7193a374a8840e155b2601824b45d840dcf825273b6581557115a69a2cb39cf6c86786a392626a1c29082015260408051825181526020928301516001600160a01b0316928101929092520160405180910390f3fea2646970667358221220e566c255a2c7828408b5d0a3de8d2730f0788557175e00b076eb0474f3a2dc6164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_90be0e5e {\n int256 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_90be0e5e memory) {\n S_90be0e5e memory r;\n {\n int r_0 = -34846116124737989606570417020060979443781572848779555066736632306773150921265;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xB6581557115a69a2CB39Cf6C86786a392626a1c2;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xb2f5cc156cf000e9b420dbac1285f7193a374a8840e155b2601824b45d840dcf000000000000000000000000b6581557115a69a2cb39cf6c86786a392626a1c2" + }, + { + "name": "random-(int120,string)", + "type": "(int120,string)", + "value": [ + "548451168830675719576564055181551657", + "Moo é🚀🚀é🚀é🚀M 🚀é🚀M🚀o M🚀oMo é 🚀🚀M oé🚀o o🚀MM🚀🚀 éé 🚀 oo🚀MMMMé" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "548451168830675719576564055181551657" + }, + { + "type": "string", + "value": "Moo é🚀🚀é🚀é🚀M 🚀é🚀M🚀o M🚀oMo é 🚀🚀M oé🚀o o🚀MM🚀🚀 éé 🚀 oo🚀MMMMé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b1565b60405180910390f35b6040805180820190915260008152606060208201526040805180820190915260008152606060208201526e69a0baf7dcc8477c1d48c03316e82981526040805160a0810190915260748082526000919061011c6020830139602083015250919050565b600060208083528351600e0b8184015280840151604080850152805180606086015260005b818110156100f2578281018401518682016080015283016100d6565b81811115610104576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a80c3a9f09f9a804d20f09f9a80c3a9f09f9a804df09f9a806f204df09f9a806f4d6f2020c3a920f09f9a80f09f9a804d206fc3a9f09f9a806f206ff09f9a804d4df09f9a80f09f9a802020c3a9c3a920f09f9a80206f6ff09f9a804d4d4d4dc3a9a2646970667358221220dca7037f6ccc14c1061464df56ba47d0f441e50a3c17f4aba695ce93aa52b38764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e8e70c1f {\n int120 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_e8e70c1f memory) {\n S_e8e70c1f memory r;\n {\n int120 r_0 = 548451168830675719576564055181551657;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀é🚀é🚀M 🚀é🚀M🚀o M🚀oMo é 🚀🚀M oé🚀o o🚀MM🚀🚀 éé 🚀 oo🚀MMMMé\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000069a0baf7dcc8477c1d48c03316e829000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000744d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a80c3a9f09f9a804d20f09f9a80c3a9f09f9a804df09f9a806f204df09f9a806f4d6f2020c3a920f09f9a80f09f9a804d206fc3a9f09f9a806f206ff09f9a804d4df09f9a80f09f9a802020c3a9c3a920f09f9a80206f6ff09f9a804d4d4d4dc3a9000000000000000000000000" + }, + { + "name": "random-(int144,string)", + "type": "(int144,string)", + "value": [ + "-7808036541300412537704962664470427716078122", + "Moo é🚀éoMo 🚀ooo ooé Mooo🚀🚀oo MM🚀oéM🚀oéMoMo oo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-7808036541300412537704962664470427716078122" + }, + { + "type": "string", + "value": "Moo é🚀éoMo 🚀ooo ooé Mooo🚀🚀oo MM🚀oéM🚀oéMoMo oo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061019b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b5565b60405180910390f35b6040805180820190915260008152606060208201526040805180820190915260008152606060208201527159a1c1d22d0fb47c89a1edb42cf5b68cca2919815260408051608081019091526046808252600091906101206020830139602083015250919050565b60006020808352835160110b8184015280840151604080850152805180606086015260005b818110156100f6578281018401518682016080015283016100da565b81811115610108576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a80c3a96f4d6f20f09f9a806f6f6f206f6fc3a920204d6f6f6ff09f9a80f09f9a806f6f20204d4df09f9a806fc3a94df09f9a806fc3a94d6f4d6f206f6fa26469706673582212201bec09d1c195d8392fcad57f1d23b86a40cf41bd6bd2731d15f57cb22ab235f264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fe2e0f55 {\n int144 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_fe2e0f55 memory) {\n S_fe2e0f55 memory r;\n {\n int144 r_0 = -7808036541300412537704962664470427716078122;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éoMo 🚀ooo ooé Mooo🚀🚀oo MM🚀oéM🚀oéMoMo oo\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffffffffffffffffffffffffffffa65e3e2dd2f04b83765e124bd30a497335d6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80c3a96f4d6f20f09f9a806f6f6f206f6fc3a920204d6f6f6ff09f9a80f09f9a806f6f20204d4df09f9a806fc3a94df09f9a806fc3a94d6f4d6f206f6f0000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int152,uint8)", + "type": "(int152,uint8)", + "value": ["805748428469249864158717424973018128977086139", "74"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "805748428469249864158717424973018128977086139" + }, + { + "type": "number", + "value": "74" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ba8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835272242189d08b304209cf5d95758642b5a371c6bb808252604a9183019182528351908152905160ff169181019190915281519081900390910190f3fea26469706673582212208371f78f0c844071d3fbc07ec1e5da8f1d54da817bee7e2b281ab70a3dc6ac1964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4fa66d49 {\n int152 s_0;\n uint8 s_1;\n }\n\n function test () public pure returns (S_4fa66d49 memory) {\n S_4fa66d49 memory r;\n {\n int152 r_0 = 805748428469249864158717424973018128977086139;\n r.s_0 = r_0;\n }\n {\n uint8 r_1 = 74;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000242189d08b304209cf5d95758642b5a371c6bb000000000000000000000000000000000000000000000000000000000000004a" + }, + { + "name": "random-(int192,address)", + "type": "(int192,address)", + "value": [ + "2245966586688525421536421762113386067370257321490881704112", + "0x483852683d549a6f8BeD0583102a46567344af71" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "2245966586688525421536421762113386067370257321490881704112" + }, + { + "type": "address", + "value": "0x483852683d549a6f8BeD0583102a46567344af71" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d88061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352775b98fc3ba26f6af7fdd122255bf8b6e2676014dd357bf0b080825273483852683d549a6f8bed0583102a46567344af71918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea2646970667358221220ba21882a31238e2be0ca0090be0fc18c3cd6e2c1aa0948b95ae391559e4747e064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_579e46e0 {\n int192 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_579e46e0 memory) {\n S_579e46e0 memory r;\n {\n int192 r_0 = 2245966586688525421536421762113386067370257321490881704112;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x483852683d549a6f8BeD0583102a46567344af71;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000005b98fc3ba26f6af7fdd122255bf8b6e2676014dd357bf0b0000000000000000000000000483852683d549a6f8bed0583102a46567344af71" + }, + { + "name": "random-(int224,bytes10)", + "type": "(int224,bytes10)", + "value": [ + "2083178206401540424357287433867286510629310333856451324887090557773", + "0xe8ad4f55bec363af165d" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "2083178206401540424357287433867286510629310333856451324887090557773" + }, + { + "type": "hexstring", + "value": "0xe8ad4f55bec363af165d" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183527b13c7ecfb01ae994befa8b44c11c2076c498e958e890509a0bfd3734d80825269e8ad4f55bec363af165d60b01b918301918252835190815290516001600160b01b0319169181019190915281519081900390910190f3fea264697066735822122056a9eaf5bff82bed6c672cfa525a60346dc0fd29f406cd86f5e7f73951f2283c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b88cbaaf {\n int224 s_0;\n bytes10 s_1;\n }\n\n function test () public pure returns (S_b88cbaaf memory) {\n S_b88cbaaf memory r;\n {\n int224 r_0 = 2083178206401540424357287433867286510629310333856451324887090557773;\n r.s_0 = r_0;\n }\n {\n bytes10 r_1 = bytes10(0xe8ad4f55bec363af165d);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000013c7ecfb01ae994befa8b44c11c2076c498e958e890509a0bfd3734de8ad4f55bec363af165d00000000000000000000000000000000000000000000" + }, + { + "name": "random-(int40,bytes16)", + "type": "(int40,bytes16)", + "value": ["333742210428", "0x7b92d08811cc1aa279005b32e2fa872e"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "333742210428" + }, + { + "type": "hexstring", + "value": "0x7b92d08811cc1aa279005b32e2fa872e" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ce8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352644db495fd7c8082526f3dc9684408e60d513c802d99717d439760811b918301918252835190815290516fffffffffffffffffffffffffffffffff19169181019190915281519081900390910190f3fea264697066735822122005d1f6301379bcb5152331305bb30706bf71b3f5421de6652665ea4bf959d74d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_83478cde {\n int40 s_0;\n bytes16 s_1;\n }\n\n function test () public pure returns (S_83478cde memory) {\n S_83478cde memory r;\n {\n int40 r_0 = 333742210428;\n r.s_0 = r_0;\n }\n {\n bytes16 r_1 = bytes16(0x7b92d08811cc1aa279005b32e2fa872e);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000004db495fd7c7b92d08811cc1aa279005b32e2fa872e00000000000000000000000000000000" + }, + { + "name": "random-(int72,address)", + "type": "(int72,address)", + "value": ["2101540123944091996660", "0x9024914BE1F9520C7fDEf80c55D5C6b07C03f275"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "2101540123944091996660" + }, + { + "type": "address", + "value": "0x9024914BE1F9520C7fDEf80c55D5C6b07C03f275" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060c98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183526871ecba584a55fd51f4808252739024914be1f9520c7fdef80c55d5c6b07c03f275918301918252835190815290516001600160a01b03169181019190915281519081900390910190f3fea26469706673582212204b753e498402617f1fe8c9af9083e202daf6010bd272dab93408bdeffbca2dd964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_daf741f6 {\n int72 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_daf741f6 memory) {\n S_daf741f6 memory r;\n {\n int72 r_0 = 2101540123944091996660;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x9024914BE1F9520C7fDEf80c55D5C6b07C03f275;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000071ecba584a55fd51f40000000000000000000000009024914be1f9520c7fdef80c55d5c6b07c03f275" + }, + { + "name": "random-(int80,uint152)", + "type": "(int80,uint152)", + "value": ["14535835307507290245493", "1196542907058947170858521440982141112934261130"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "14535835307507290245493" + }, + { + "type": "number", + "value": "1196542907058947170858521440982141112934261130" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d58061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352690313fd3cee0590fc89758082527235a7a391c4e5e0fcb11b1fe4a787fbad40e18a9183019182528351908152905172ffffffffffffffffffffffffffffffffffffff169181019190915281519081900390910190f3fea2646970667358221220c6a29b5d8a916061a2abd082b593896d5c097ae472ffedbac6b47a091bca4d6364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f78030fc {\n int80 s_0;\n uint152 s_1;\n }\n\n function test () public pure returns (S_f78030fc memory) {\n S_f78030fc memory r;\n {\n int80 r_0 = 14535835307507290245493;\n r.s_0 = r_0;\n }\n {\n uint152 r_1 = 1196542907058947170858521440982141112934261130;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000313fd3cee0590fc89750000000000000000000000000035a7a391c4e5e0fcb11b1fe4a787fbad40e18a" + }, + { + "name": "random-(string,address)", + "type": "(string,address)", + "value": [ + "Moo é🚀oo🚀🚀🚀oéoMé🚀oM🚀éMooMMM oM🚀o🚀o🚀oM éM MMo🚀Méooé ooM éo", + "0x4C77c7e0b5358e2fAaB54545C6d517E24c002744" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀🚀🚀oéoMé🚀oM🚀éMooMMM oM🚀o🚀o🚀oM éM MMo🚀Méooé ooM éo" + }, + { + "type": "address", + "value": "0x4C77c7e0b5358e2fAaB54545C6d517E24c002744" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101bb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b5565b60405180910390f35b60408051808201909152606081526000602082015260408051808201909152606081526000602082015260006040518060a001604052806061815260200161012560619139825250734c77c7e0b5358e2faab54545c6d517e24c0027446020820152919050565b600060208083528351604082850152805180606086015260005b818110156100eb578281018401518682016080015283016100cf565b818111156100fd576000608083880101525b5094909101516001600160a01b031660408401525050601f91909101601f1916016080019056fe4d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a80f09f9a806fc3a96f4dc3a9f09f9a806f4df09f9a80c3a94d6f6f4d4d4d20206f4df09f9a806ff09f9a806ff09f9a806f4d20c3a94d204d4d6ff09f9a804dc3a96f6fc3a920206f6f4d20c3a96fa2646970667358221220164ee3cc81424d6dc969c5daebda00b16fe3827bb7ee4bcca1c8ada709b09af164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e7028728 {\n string s_0;\n address s_1;\n }\n\n function test () public pure returns (S_e7028728 memory) {\n S_e7028728 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oo🚀🚀🚀oéoMé🚀oM🚀éMooMMM oM🚀o🚀o🚀oM éM MMo🚀Méooé ooM éo\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x4C77c7e0b5358e2fAaB54545C6d517E24c002744;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000004c77c7e0b5358e2faab54545c6d517e24c00274400000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a80f09f9a806fc3a96f4dc3a9f09f9a806f4df09f9a80c3a94d6f6f4d4d4d20206f4df09f9a806ff09f9a806ff09f9a806f4d20c3a94d204d4d6ff09f9a804dc3a96f6fc3a920206f6f4d20c3a96f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bool)", + "type": "(string,bool)", + "value": ["Moo é🚀Mo🚀 é", false], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo🚀 é" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610132806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252606080825260006020928301819052835180850185529182528183018181528451808601865260138152724d6f6f20c3a9f09f9a804d6ff09f9a8020c3a960681b948101949094529282529091529051608e91906097565b60405180910390f35b600060208083528351604082850152805180606086015260005b8181101560cb5782810184015186820160800152830160b1565b8181111560dc576000608083880101525b509490910151151560408401525050601f91909101601f1916016080019056fea2646970667358221220c227e052e8fa5c4d81dc992847c1784c0df94f8ff763362e6838ed6655bb6d3364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fc3be6c5 {\n string s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_fc3be6c5 memory) {\n S_fc3be6c5 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀Mo🚀 é\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a804d6ff09f9a8020c3a900000000000000000000000000" + }, + { + "name": "random-(string,bytes15)", + "type": "(string,bytes15)", + "value": [ + "Moo é🚀oMéé🚀oM oéMo🚀🚀oM MMooééMooo🚀oo o🚀o🚀Méooo 🚀M", + "0x0c60289108aff415b95634be7046b6" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMéé🚀oM oéMo🚀🚀oM MMooééMooo🚀oo o🚀o🚀Méooo 🚀M" + }, + { + "type": "hexstring", + "value": "0x0c60289108aff415b95634be7046b6" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b3565b60405180910390f35b604080518082019091526060815260006020820152604080518082019091526060815260006020820152600060405180608001604052806051815260200161012e605191398252506e063014488457fa0adcab1a5f38235b60891b6020820152919050565b600060208083528351604082850152805180606086015260005b818110156100e9578281018401518682016080015283016100cd565b818111156100fb576000608083880101525b50949091015170ffffffffffffffffffffffffffffffffff191660408401525050601f91909101601f1916016080019056fe4d6f6f20c3a9f09f9a806f4dc3a9c3a9f09f9a806f4d206fc3a94d6ff09f9a80f09f9a806f4d204d4d6f6fc3a9c3a94d6f6f6ff09f9a806f6f20206ff09f9a806ff09f9a804dc3a96f6f6f20f09f9a804da264697066735822122044f485729985f6db1315b1f88c4283b9cee17f3da94bdb0b59a77663f266c11b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e5e2a304 {\n string s_0;\n bytes15 s_1;\n }\n\n function test () public pure returns (S_e5e2a304 memory) {\n S_e5e2a304 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oMéé🚀oM oéMo🚀🚀oM MMooééMooo🚀oo o🚀o🚀Méooo 🚀M\";\n r.s_0 = r_0;\n }\n {\n bytes15 r_1 = bytes15(0x0c60289108aff415b95634be7046b6);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400c60289108aff415b95634be7046b6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a806f4dc3a9c3a9f09f9a806f4d206fc3a94d6ff09f9a80f09f9a806f4d204d4d6f6fc3a9c3a94d6f6f6ff09f9a806f6f20206ff09f9a806ff09f9a804dc3a96f6f6f20f09f9a804d000000000000000000000000000000" + }, + { + "name": "random-(string,bytes32)", + "type": "(string,bytes32)", + "value": [ + "Moo é🚀Mo 🚀 éMoooéoéoM M o🚀MMo oM ", + "0x4d215599c554aa476c459a8f2205255c86c3eb6a49a1aa0250856e7583f6b8f2" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo 🚀 éMoooéoéoM M o🚀MMo oM " + }, + { + "type": "hexstring", + "value": "0x4d215599c554aa476c459a8f2205255c86c3eb6a49a1aa0250856e7583f6b8f2" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061018d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c1565b60405180910390f35b6040805180820190915260608152600060208201526040805180820190915260608152600060208201526000604051806060016040528060308152602001610128603091398252507f4d215599c554aa476c459a8f2205255c86c3eb6a49a1aa0250856e7583f6b8f26020820152919050565b600060208083528351604082850152805180606086015260005b818110156100f7578281018401518682016080015283016100db565b81811115610109576000608083880101525b50949091015160408401525050601f91909101601f1916016080019056fe4d6f6f20c3a9f09f9a804d6f2020f09f9a8020c3a94d6f6f6fc3a96fc3a96f4d204d206ff09f9a804d4d6f206f4d2020a26469706673582212205d419b1b91203810c40336e06e5fc390dac8a4f78295c392d536faec29dfbfff64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_66f5afe1 {\n string s_0;\n bytes32 s_1;\n }\n\n function test () public pure returns (S_66f5afe1 memory) {\n S_66f5afe1 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀Mo 🚀 éMoooéoéoM M o🚀MMo oM \";\n r.s_0 = r_0;\n }\n {\n bytes32 r_1 = bytes32(0x4d215599c554aa476c459a8f2205255c86c3eb6a49a1aa0250856e7583f6b8f2);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000404d215599c554aa476c459a8f2205255c86c3eb6a49a1aa0250856e7583f6b8f200000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a804d6f2020f09f9a8020c3a94d6f6f6fc3a96fc3a96f4d204d206ff09f9a804d4d6f206f4d202000000000000000000000000000000000" + }, + { + "name": "random-(string,int96)", + "type": "(string,int96)", + "value": ["Moo é🚀 é🚀o🚀🚀🚀MMo MoMé M🚀éMé🚀o o", "10946347544471782848169065338"], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é🚀o🚀🚀🚀MMo MoMé M🚀éMé🚀o o" + }, + { + "type": "number", + "value": "10946347544471782848169065338" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610185806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ad565b60405180910390f35b6040805180820190915260608152600060208201526040805180820190915260608152600060208201526000604051806060016040528060398152602001610117603991398252506b235e9b416cc52d76ad9d3b7a6020820152919050565b600060208083528351604082850152805180606086015260005b818110156100e3578281018401518682016080015283016100c7565b818111156100f5576000608083880101525b509490910151600b0b60408401525050601f91909101601f1916016080019056fe4d6f6f20c3a9f09f9a8020c3a9f09f9a806ff09f9a80f09f9a80f09f9a804d4d6f204d6f4dc3a9204df09f9a80c3a94dc3a9f09f9a806f206fa264697066735822122047dd161369ec42d2d246718a7d6bc52d834616a42192c0d839d3894431ae83de64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e20af393 {\n string s_0;\n int96 s_1;\n }\n\n function test () public pure returns (S_e20af393 memory) {\n S_e20af393 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 é🚀o🚀🚀🚀MMo MoMé M🚀éMé🚀o o\";\n r.s_0 = r_0;\n }\n {\n int96 r_1 = 10946347544471782848169065338;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000235e9b416cc52d76ad9d3b7a00000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a8020c3a9f09f9a806ff09f9a80f09f9a80f09f9a804d4d6f204d6f4dc3a9204df09f9a80c3a94dc3a9f09f9a806f206f00000000000000" + }, + { + "name": "random-(string,string)", + "type": "(string,string)", + "value": [ + "Moo é🚀 M M éoé🚀🚀 oé🚀oo M oM éé🚀", + "Moo é🚀é éMMM oooM🚀🚀o éM oooéMo🚀 o o éMo 🚀o🚀 oMMo🚀oMoé" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M M éoé🚀🚀 oé🚀oo M oM éé🚀" + }, + { + "type": "string", + "value": "Moo é🚀é éMMM oooM🚀🚀o éM oooéMo🚀 o o éMo 🚀o🚀 oMMo🚀oMoé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061020a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610108565b60405180910390f35b60408051808201909152606080825260208201526040805180820190915260608082526020820152600060405180606001604052806036815260200161019f60369139825250604080516080810190915260548082526000919061014b6020830139602083015250919050565b6000815180845260005b818110156100e1576020818501810151868301820152016100c5565b818111156100f3576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516040602084015261012460608401826100bb565b90506020840151601f1984830301604085015261014182826100bb565b9594505050505056fe4d6f6f20c3a9f09f9a80c3a92020c3a94d4d4d206f6f6f4df09f9a80f09f9a806f2020c3a94d206f6f6fc3a94d6ff09f9a80206f206f20c3a94d6f2020f09f9a806ff09f9a80206f4d4d6ff09f9a806f4d6fc3a94d6f6f20c3a9f09f9a80204d204d20c3a96fc3a9f09f9a80f09f9a80206fc3a9f09f9a806f6f204d20206f4d2020c3a9c3a9f09f9a80a26469706673582212204dcfd4b56034ed273df0ceba6261ca51ae8ed963180353f012b2de0676c61aa964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fb587d32 {\n string s_0;\n string s_1;\n }\n\n function test () public pure returns (S_fb587d32 memory) {\n S_fb587d32 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 M M éoé🚀🚀 oé🚀oo M oM éé🚀\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀é éMMM oooM🚀🚀o éM oooéMo🚀 o o éMo 🚀o🚀 oMMo🚀oMoé\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80204d204d20c3a96fc3a9f09f9a80f09f9a80206fc3a9f09f9a806f6f204d20206f4d2020c3a9c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a80c3a92020c3a94d4d4d206f6f6f4df09f9a80f09f9a806f2020c3a94d206f6f6fc3a94d6ff09f9a80206f206f20c3a94d6f2020f09f9a806ff09f9a80206f4d4d6ff09f9a806f4d6fc3a9000000000000000000000000" + }, + { + "name": "random-(string)[]", + "type": "(string)[]", + "value": [ + ["Moo é🚀 🚀éMooo oMo🚀MMoooooo🚀o🚀 éooéo🚀🚀M🚀é🚀éé🚀 🚀🚀🚀🚀Mooooo🚀oéoo🚀"], + ["Moo é🚀🚀 é MéMo🚀oMo🚀M M 🚀éo🚀éo 🚀🚀MMMo🚀é🚀M Moo🚀"], + ["Moo é🚀oé🚀🚀é éo é 🚀🚀o"], + ["Moo é🚀oMé ooo ooéoéoé"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀éMooo oMo🚀MMoooooo🚀o🚀 éooéo🚀🚀M🚀é🚀éé🚀 🚀🚀🚀🚀Mooooo🚀oéoo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 é MéMo🚀oMo🚀M M 🚀éo🚀éo 🚀🚀MMMo🚀é🚀M Moo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé🚀🚀é éo é 🚀🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMé ooo ooéoéoé" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103e0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101fe565b60405180910390f35b60408051600480825260a0820190925260609160009190816020015b60408051602081019091526060815281526020019060019003908161006a57505060408051602081019091526060815290915060006040518060a00160405280607781526020016102df607791398252508151819083906000906100d0576100d06102a0565b6020026020010181905250506100f26040518060200160405280606081525090565b6000604051806080016040528060558152602001610356605591398252508151819083906001908110610127576101276102a0565b6020026020010181905250506101496040518060200160405280606081525090565b60006040518060600160405280602881526020016102b760289139825250815181908390600290811061017e5761017e6102a0565b6020026020010181905250506101a06040518060200160405280606081525090565b60408051808201909152601e81527f4d6f6f20c3a9f09f9a806f4dc3a920206f6f6f206f6fc3a96fc3a96fc3a900006020820152815281518190839060039081106101ed576101ed6102a0565b602090810291909101015250919050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561029157603f198a85030186528251518885528051808a870152835b81811015610261578281018b01518782018b01528a01610246565b8181111561027157848a83890101525b5096890196601f01601f1916949094018701935091870191600101610226565b50919998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a80c3a920c3a96f20c3a920f09f9a80f09f9a806f4d6f6f20c3a9f09f9a80202020f09f9a80c3a94d6f6f6f206f4d6ff09f9a804d4d6f6f6f6f6f6ff09f9a806ff09f9a8020c3a96f6fc3a96ff09f9a80f09f9a804df09f9a80c3a9f09f9a80c3a9c3a9f09f9a8020f09f9a80f09f9a80f09f9a80f09f9a804d6f6f6f6f6ff09f9a806fc3a96f6ff09f9a804d6f6f20c3a9f09f9a80f09f9a8020c3a9204dc3a94d6ff09f9a806f4d6ff09f9a804d20204d20f09f9a80c3a96ff09f9a80c3a96f20f09f9a80f09f9a804d4d4d6ff09f9a80c3a9f09f9a804d204d6f6ff09f9a80a2646970667358221220a4d805af25901e78bcfd8e075525506b901e1b1797e169ceeaebdd1c1120aa1564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n function test () public pure returns (S_97fc4627[] memory) {\n S_97fc4627[] memory r = new S_97fc4627[](4);\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 🚀éMooo oMo🚀MMoooooo🚀o🚀 éooéo🚀🚀M🚀é🚀éé🚀 🚀🚀🚀🚀Mooooo🚀oéoo🚀\";\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_97fc4627 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀 é MéMo🚀oMo🚀M M 🚀éo🚀éo 🚀🚀MMMo🚀é🚀M Moo🚀\";\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_97fc4627 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀oé🚀🚀é éo é 🚀🚀o\";\n r_2.s_0 = r_2_0;\n }\n r[2] = r_2;\n }\n {\n S_97fc4627 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀oMé ooo ooéoéoé\";\n r_3.s_0 = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000774d6f6f20c3a9f09f9a80202020f09f9a80c3a94d6f6f6f206f4d6ff09f9a804d4d6f6f6f6f6f6ff09f9a806ff09f9a8020c3a96f6fc3a96ff09f9a80f09f9a804df09f9a80c3a9f09f9a80c3a9c3a9f09f9a8020f09f9a80f09f9a80f09f9a80f09f9a804d6f6f6f6f6ff09f9a806fc3a96f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a80f09f9a8020c3a9204dc3a94d6ff09f9a806f4d6ff09f9a804d20204d20f09f9a80c3a96ff09f9a80c3a96f20f09f9a80f09f9a804d4d4d6ff09f9a80c3a9f09f9a804d204d6f6ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a80c3a920c3a96f20c3a920f09f9a80f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a806f4dc3a920206f6f6f206f6fc3a96fc3a96fc3a90000" + }, + { + "name": "random-(string)[1]", + "type": "(string)[1]", + "value": [["Moo é🚀 🚀Mé🚀 "]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀Mé🚀 " + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100dc565b60405180910390f35b6100566100a8565b61005e6100a8565b6040805160208082018352606082528251808401909352601783527f4d6f6f20c3a9f09f9a8020f09f9a804dc3a9f09f9a8020000000000000000000908301529081528152919050565b60405180602001604052806001905b6040805160208101909152606081528152602001906001900390816100b75790505090565b602080825260009060408382018185018685805b600181101561015c57601f19808a86030186528351518886528051808a880152845b8181101561012d578281018b01518882018b01528a01610112565b8181111561013d57858a838a0101525b5096890196601f019091169490940186019350918601916001016100f0565b50919897505050505050505056fea2646970667358221220691bb3d996946ea2da00dc80f7eefaa8aedd9e7d3c4629e193ef14741bd2eb7b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n function test () public pure returns (S_97fc4627[1] memory) {\n S_97fc4627[1] memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 🚀Mé🚀 \";\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a8020f09f9a804dc3a9f09f9a8020000000000000000000" + }, + { + "name": "random-(string)[2]", + "type": "(string)[2]", + "value": [ + ["Moo é🚀o🚀ooé🚀o🚀 🚀🚀ooéoMoéooé🚀M 🚀o é🚀 🚀M🚀🚀éM🚀oo🚀é🚀o MéM ooo"], + ["Moo é🚀 éMM🚀oo🚀MMoéMéoéoo oo é🚀éoéooo M oM "] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀ooé🚀o🚀 🚀🚀ooéoMoéooé🚀M 🚀o é🚀 🚀M🚀🚀éM🚀oo🚀é🚀o MéM ooo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éMM🚀oo🚀MMoéMéoéoo oo é🚀éoéooo M oM " + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f8565b60405180910390f35b6100566100c4565b61005e6100c4565b60408051602081019091526060815260006040518060a00160405280607081526020016101c660709139825250815260408051602081019091526060815260006040518060600160405280603e8152602001610188603e91398252506020820152919050565b60405180604001604052806002905b6040805160208101909152606081528152602001906001900390816100d35790505090565b6020808252600090606083018382018584805b600281101561017a57601f198089870301855283515187875280518089890152845b81811015610149578281018a015189820160400152890161012d565b8181111561015a57856040838b0101525b50601f01909116959095016040019450928501929185019160010161010b565b509297965050505050505056fe4d6f6f20c3a9f09f9a8020c3a94d4df09f9a806f6ff09f9a804d4d6fc3a94dc3a96fc3a96f6f206f6f20c3a9f09f9a80c3a96fc3a96f6f6f204d206f4d204d6f6f20c3a9f09f9a806ff09f9a806f6fc3a9f09f9a806ff09f9a8020f09f9a80f09f9a806f6fc3a96f4d6fc3a96f6fc3a9f09f9a804d20f09f9a806f20c3a9f09f9a8020f09f9a804df09f9a80f09f9a80c3a94df09f9a806f6ff09f9a80c3a9f09f9a806f204dc3a94d20206f6f6fa2646970667358221220740d26e89a616c4dd30ec23260b1a77e0f1edb62aea6cb43bf498fe0fc43510364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n function test () public pure returns (S_97fc4627[2] memory) {\n S_97fc4627[2] memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀o🚀ooé🚀o🚀 🚀🚀ooéoMoéooé🚀M 🚀o é🚀 🚀M🚀🚀éM🚀oo🚀é🚀o MéM ooo\";\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_97fc4627 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀 éMM🚀oo🚀MMoéMéoéoo oo é🚀éoéooo M oM \";\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000704d6f6f20c3a9f09f9a806ff09f9a806f6fc3a9f09f9a806ff09f9a8020f09f9a80f09f9a806f6fc3a96f4d6fc3a96f6fc3a9f09f9a804d20f09f9a806f20c3a9f09f9a8020f09f9a804df09f9a80f09f9a80c3a94df09f9a806f6ff09f9a80c3a9f09f9a806f204dc3a94d20206f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a8020c3a94d4df09f9a806f6ff09f9a804d4d6fc3a94dc3a96fc3a96f6f206f6f20c3a9f09f9a80c3a96fc3a96f6f6f204d206f4d200000" + }, + { + "name": "random-(string)[4]", + "type": "(string)[4]", + "value": [ + ["Moo é🚀"], + ["Moo é🚀oM🚀ooo 🚀M"], + ["Moo é🚀é🚀🚀🚀M oMo🚀"], + ["Moo é🚀oééooMM🚀 éoéM ooooooM 🚀oo🚀oooéoéééo 🚀o🚀🚀 oMoé o"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM🚀ooo 🚀M" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀🚀🚀M oMo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oééooMM🚀 éoéM ooooooM 🚀oo🚀oooéoéééo 🚀o🚀🚀 oMoé o" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102a1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610166565b60405180910390f35b610056610132565b61005e610132565b6040805160208082018352606080835283518085018552600a8152689adede418753e13f3560b71b8184015283529184528251808201845282815283518085018552601981527f4d6f6f20c3a9f09f9a806f4df09f9a806f6f6f20f09f9a804d000000000000008184015281528482015282518082018452828152835192830190935260218083526000929161024b908301398252506040808301919091528051602081019091526060815260006040518060800160405280605581526020016101f6605591398252506060820152919050565b60405180608001604052806004905b6040805160208101909152606081528152602001906001900390816101415790505090565b602080825260009060a083018382018584805b60048110156101e857601f198089870301855283515187875280518089890152845b818110156101b7578281018a015189820160400152890161019b565b818111156101c857856040838b0101525b50601f019091169590950160400194509285019291850191600101610179565b509297965050505050505056fe4d6f6f20c3a9f09f9a806fc3a9c3a96f6f4d4df09f9a8020c3a96fc3a94d206f6f6f6f6f6f4d20f09f9a806f6ff09f9a806f6f6fc3a96fc3a9c3a9c3a96f20f09f9a806ff09f9a80f09f9a80206f4d6fc3a920206f4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a804d206f4d6ff09f9a80a26469706673582212201d04a7153681e7eebf5fae84b3450ebc0063af98f311f80b756a5919682e46e364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n function test () public pure returns (S_97fc4627[4] memory) {\n S_97fc4627[4] memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_97fc4627 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀oM🚀ooo 🚀M\";\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_97fc4627 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀é🚀🚀🚀M oMo🚀\";\n r_2.s_0 = r_2_0;\n }\n r[2] = r_2;\n }\n {\n S_97fc4627 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀oééooMM🚀 éoéM ooooooM 🚀oo🚀oooéoéééo 🚀o🚀🚀 oMoé o\";\n r_3.s_0 = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a806f4df09f9a806f6f6f20f09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a804d206f4d6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806fc3a9c3a96f6f4d4df09f9a8020c3a96fc3a94d206f6f6f6f6f6f4d20f09f9a806f6ff09f9a806f6f6fc3a96fc3a9c3a9c3a96f20f09f9a806ff09f9a80f09f9a80206f4d6fc3a920206f0000000000000000000000" + }, + { + "name": "random-(string[1])", + "type": "(string[1])", + "value": [["Moo é🚀M🚀"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610199806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d3565b60405180910390f35b610056610094565b61005e610094565b6100666100ac565b60408051808201909152600f81526d9adede418753e13f35009be13f35608f1b602082015281528152919050565b60405180602001604052806100a76100ac565b905290565b60405180602001604052806001905b60608152602001906001900390816100bb5790505090565b602080825282518282018290526000919060608401906040850184805b600181101561015657878503603f1901835283518051808752835b81811015610126578281018901518882018a0152880161010b565b81811115610136578489838a0101525b50601f01601f1916959095018601945092850192918501916001016100f0565b509297965050505050505056fea264697066735822122089130d4d2f4f73a339b1196a72c332e8a1c3f03ba720311ef903d8907907cd2364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c6e6ec6b {\n string[1] s_0;\n }\n\n function test () public pure returns (S_c6e6ec6b memory) {\n S_c6e6ec6b memory r;\n {\n string[1] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀M🚀\";\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a804df09f9a800000000000000000000000000000000000" + }, + { + "name": "random-(string[2])", + "type": "(string[2])", + "value": [["Moo é🚀", "Moo é🚀é🚀 o🚀🚀Mooé oo oo🚀MéoooMM ééo🚀oo🚀oM🚀🚀o"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀é🚀 o🚀🚀Mooé oo oo🚀MéoooMM ééo🚀oo🚀oM🚀🚀o" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610203806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f1565b60405180910390f35b6100566100b2565b61005e6100b2565b6100666100ca565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160808101909252604c80835260009291610182908301396020830152508152919050565b60405180602001604052806100c56100ca565b905290565b60405180604001604052806002905b60608152602001906001900390816100d95790505090565b602080825282518282018290526000919060808401906040850184805b600281101561017457878503603f1901835283518051808752835b81811015610144578281018901518882018a01528801610129565b81811115610154578489838a0101525b50601f01601f19169590950186019450928501929185019160010161010e565b509297965050505050505056fe4d6f6f20c3a9f09f9a80c3a9f09f9a80206ff09f9a80f09f9a804d6f6fc3a9206f6f206f6ff09f9a804dc3a96f6f6f4d4d20c3a9c3a96ff09f9a806f6ff09f9a806f4df09f9a80f09f9a806fa2646970667358221220d3b52dc38cf08c8dd1ded37865211498ae5159503725678646af51071ff68be664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5f29438a {\n string[2] s_0;\n }\n\n function test () public pure returns (S_5f29438a memory) {\n S_5f29438a memory r;\n {\n string[2] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀é🚀 o🚀🚀Mooé oo oo🚀MéoooMM ééo🚀oo🚀oM🚀🚀o\";\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a80c3a9f09f9a80206ff09f9a80f09f9a804d6f6fc3a9206f6f206f6ff09f9a804dc3a96f6f6f4d4d20c3a9c3a96ff09f9a806f6ff09f9a806f4df09f9a80f09f9a806f0000000000000000000000000000000000000000" + }, + { + "name": "random-(uint184,bytes14)", + "type": "(uint184,bytes14)", + "value": [ + "7227927294891486602978494781534359488368119611076682856", + "0xf6dfbe81452d24074125978a7c71" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "7227927294891486602978494781534359488368119611076682856" + }, + { + "type": "hexstring", + "value": "0xf6dfbe81452d24074125978a7c71" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080518082018252600080825260209182015281518083018352764b768c8b52a6ddb851805f50e5ee67443ff0216414a4688082526df6dfbe81452d24074125978a7c7160901b9183019182528351908152905171ffffffffffffffffffffffffffffffffffff19169181019190915281519081900390910190f3fea26469706673582212205c719f94ee0719056258974725ce50282e5a0a58d59d9f43d99619be5fd56cc764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ee1caec9 {\n uint184 s_0;\n bytes14 s_1;\n }\n\n function test () public pure returns (S_ee1caec9 memory) {\n S_ee1caec9 memory r;\n {\n uint184 r_0 = 7227927294891486602978494781534359488368119611076682856;\n r.s_0 = r_0;\n }\n {\n bytes14 r_1 = bytes14(0xf6dfbe81452d24074125978a7c71);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000004b768c8b52a6ddb851805f50e5ee67443ff0216414a468f6dfbe81452d24074125978a7c71000000000000000000000000000000000000" + }, + { + "name": "random-(uint224,string)", + "type": "(uint224,string)", + "value": [ + "15616654165610835414476576888642467052788302249742079930808940347127", + "Moo é🚀 éoM MM Méé 🚀 o🚀 🚀oMoooooooMo🚀é MéMMooé" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "15616654165610835414476576888642467052788302249742079930808940347127" + }, + { + "type": "string", + "value": "Moo é🚀 éoM MM Méé 🚀 o🚀 🚀oMoooooooMo🚀é MéMMooé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100be565b60405180910390f35b6040805180820190915260008152606060208201526040805180820190915260008152606060208201527b9449fbbf04cd0c02c2acdfd3387b996551ed0e6c56f2df9374f7bef78152604080516080810190915260438082526000919061012e6020830139602083015250919050565b6000602080835260018060e01b038451168184015280840151604080850152805180606086015260005b81811015610104578281018401518682016080015283016100e8565b81811115610116576000608083880101525b50601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a8020c3a96f4d204d4d204dc3a9c3a920f09f9a80206ff09f9a8020f09f9a806f4d6f6f6f6f6f6f6f4d6ff09f9a80c3a9204dc3a94d4d6f6fc3a9a2646970667358221220b6c7e4b152074916bbddd18cbd74cdf21112fd83a4b371e726c92fd98cc9112e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_43a7be58 {\n uint224 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_43a7be58 memory) {\n S_43a7be58 memory r;\n {\n uint224 r_0 = 15616654165610835414476576888642467052788302249742079930808940347127;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 éoM MM Méé 🚀 o🚀 🚀oMoooooooMo🚀é MéMMooé\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000009449fbbf04cd0c02c2acdfd3387b996551ed0e6c56f2df9374f7bef7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a8020c3a96f4d204d4d204dc3a9c3a920f09f9a80206ff09f9a8020f09f9a806f4d6f6f6f6f6f6f6f4d6ff09f9a80c3a9204dc3a94d4d6f6fc3a90000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint232,bytes19)", + "type": "(uint232,bytes19)", + "value": [ + "6554091464863580137380998971458939607393840038583278903769845798795216", + "0xa4b555da560653054caaf1660263feadd6ec60" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "6554091464863580137380998971458939607393840038583278903769845798795216" + }, + { + "type": "hexstring", + "value": "0xa4b555da560653054caaf1660263feadd6ec60" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805180820182526000808252602091820152815180830183527cf31ad1cbd5a4368cea8962362162b330ed43a21418006c03ba1483f7d0808252720525aaaed2b032982a65578b30131ff56eb763606d1b918301918252835190815290516cffffffffffffffffffffffffff19169181019190915281519081900390910190f3fea26469706673582212203a8c8cd48b86b6809740f4a9e8b5c26080bd013cd206ecf4f29f92c3f506bbf464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4db76c78 {\n uint232 s_0;\n bytes19 s_1;\n }\n\n function test () public pure returns (S_4db76c78 memory) {\n S_4db76c78 memory r;\n {\n uint232 r_0 = 6554091464863580137380998971458939607393840038583278903769845798795216;\n r.s_0 = r_0;\n }\n {\n bytes19 r_1 = bytes19(0xa4b555da560653054caaf1660263feadd6ec60);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000f31ad1cbd5a4368cea8962362162b330ed43a21418006c03ba1483f7d0a4b555da560653054caaf1660263feadd6ec6000000000000000000000000000" + }, + { + "name": "random-(uint248[2])", + "type": "(uint248[2])", + "value": [ + [ + "151743307254606505398371909570460132778081802136731480788726010552949934452", + "329016319362451830327509458344305160456798636889448968824634104102993326819" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "151743307254606505398371909570460132778081802136731480788726010552949934452" + }, + { + "type": "number", + "value": "329016319362451830327509458344305160456798636889448968824634104102993326819" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ea565b60405180910390f35b6100566100b4565b61005e6100b4565b6100666100cc565b7e55e2381600735ec7e1c95539b346e6aeaf43a5b2f6b245b6e6e44d7e94097481527eba37758df779d4debfa55e45d734842951fff22492d2090059c7c57068f2e360208201528152919050565b60405180602001604052806100c76100cc565b905290565b60405180604001604052806002906020820280368337509192915050565b815160408201908260005b600281101561011d5782516001600160f81b03168252602092830192909101906001016100f5565b5050509291505056fea26469706673582212204796514c50516c6120cfad1095a61fade270893508518f053e08a5d80052134b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_402bd1ec {\n uint248[2] s_0;\n }\n\n function test () public pure returns (S_402bd1ec memory) {\n S_402bd1ec memory r;\n {\n uint248[2] memory r_0;\n {\n uint248 r_0_0 = 151743307254606505398371909570460132778081802136731480788726010552949934452;\n r_0[0] = r_0_0;\n }\n {\n uint248 r_0_1 = 329016319362451830327509458344305160456798636889448968824634104102993326819;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0055e2381600735ec7e1c95539b346e6aeaf43a5b2f6b245b6e6e44d7e94097400ba37758df779d4debfa55e45d734842951fff22492d2090059c7c57068f2e3" + }, + { + "name": "random-(uint40,string)", + "type": "(uint40,string)", + "value": ["25718273048", "Moo é🚀🚀oMM o🚀🚀 o"], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "25718273048" + }, + { + "type": "string", + "value": "Moo é🚀🚀oMM o🚀🚀 o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805180820182526000815260606020918201819052825180840184528083019182526405fcedb418815283518085018552601d81527f4d6f6f20c3a9f09f9a80f09f9a806f4d4d206ff09f9a80f09f9a80206f00000093810193909352919052905161009e91906100a7565b60405180910390f35b6000602080835264ffffffffff8451168184015280840151604080850152805180606086015260005b818110156100ec578281018401518682016080015283016100d0565b818111156100fe576000608083880101525b50601f01601f19169390930160800194935050505056fea2646970667358221220c713502c887fbcc8c47e723d7669190677078f6c3c2c412b1a23181d3404053264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6a76658b {\n uint40 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_6a76658b memory) {\n S_6a76658b memory r;\n {\n uint40 r_0 = 25718273048;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀oMM o🚀🚀 o\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000005fcedb4180000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a80f09f9a806f4d4d206ff09f9a80f09f9a80206f000000" + }, + { + "name": "random-(uint80,uint248)", + "type": "(uint80,uint248)", + "value": [ + "1107732160644933719780219", + "189958227958129851478958403379869309092072382924730966704016867228167752369" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "1107732160644933719780219" + }, + { + "type": "number", + "value": "189958227958129851478958403379869309092072382924730966704016867228167752369" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d58061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051808201825260008082526020918201528151808301835269ea9247df920ba1256b7b8082527e6b83364670df274a8d4c6dd1e93665bd6127028e37730e0cbf5167f408cab1918301918252835190815290516001600160f81b03169181019190915281519081900390910190f3fea2646970667358221220abd27cc9318811f073cdb983ee28e72292a006d7f64a040448d73ec71ac9c97364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_52878336 {\n uint80 s_0;\n uint248 s_1;\n }\n\n function test () public pure returns (S_52878336 memory) {\n S_52878336 memory r;\n {\n uint80 r_0 = 1107732160644933719780219;\n r.s_0 = r_0;\n }\n {\n uint248 r_1 = 189958227958129851478958403379869309092072382924730966704016867228167752369;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000ea9247df920ba1256b7b006b83364670df274a8d4c6dd1e93665bd6127028e37730e0cbf5167f408cab1" + }, + { + "name": "random-(uint88,(string))", + "type": "(uint88,(string))", + "value": [ + "26855447427035377974680490", + ["Moo é🚀🚀éo oo🚀🚀M🚀oéé🚀éMéo M MoMo MoéMééMMoMMoéoooo 🚀 "] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "26855447427035377974680490" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éo oo🚀🚀M🚀oéé🚀éMéo M MoMo MoéMééMMoMMoéoooo 🚀 " + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101e8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100dd565b60405180910390f35b6100566100a3565b61005e6100a3565b6a1636dcb8e0561814b09baa8152604080516020810190915260608152600060405180608001604052806057815260200161015c605791398252506020820152919050565b604051806040016040528060006affffffffffffffffffffff1681526020016100d86040518060200160405280606081525090565b905290565b600060208083526affffffffffffffffffffff845116818401528084015160408085015280519050816060850152805180608086015260005b818110156101325782810184015186820160a001528301610116565b8181111561014457600060a083880101525b50601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a96f206f6ff09f9a80f09f9a804df09f9a806fc3a9c3a9f09f9a80c3a94dc3a96f204d204d6f4d6f20204d6fc3a94dc3a9c3a94d4d6f4d4d6fc3a96f6f6f6f2020f09f9a80202020a264697066735822122006b7fcd935e7e7fecc704ef32d02c5bedef5667e2cc1247d07e3898601d7d93064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_3f587e71 {\n uint88 s_0;\n S_97fc4627 s_1;\n }\n\n function test () public pure returns (S_3f587e71 memory) {\n S_3f587e71 memory r;\n {\n uint88 r_0 = 26855447427035377974680490;\n r.s_0 = r_0;\n }\n {\n S_97fc4627 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀éo oo🚀🚀M🚀oéé🚀éMéo M MoMo MoéMééMMoMMoéoooo 🚀 \";\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000001636dcb8e0561814b09baa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80f09f9a80c3a96f206f6ff09f9a80f09f9a804df09f9a806fc3a9c3a9f09f9a80c3a94dc3a96f204d204d6f4d6f20204d6fc3a94dc3a9c3a94d4d6f4d4d6fc3a96f6f6f6f2020f09f9a80202020000000000000000000" + }, + { + "name": "random-address[]", + "type": "address[]", + "value": [ + "0x80e546aDaBfE36349909c701a66e6d6B19C6Fdb1", + "0xB4e0835BD24b34d0C845CEA3A782Cd1D03CfB307", + "0x0c7F98BEE4116317E3fa3f9dD12112ecb29e2Fcb", + "0xF4f21df9E49b88A4Dd513701A4F8E686CF36e009" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x80e546aDaBfE36349909c701a66e6d6B19C6Fdb1" + }, + { + "type": "address", + "value": "0xB4e0835BD24b34d0C845CEA3A782Cd1D03CfB307" + }, + { + "type": "address", + "value": "0x0c7F98BEE4116317E3fa3f9dD12112ecb29e2Fcb" + }, + { + "type": "address", + "value": "0xF4f21df9E49b88A4Dd513701A4F8E686CF36e009" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610243806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101aa565b60405180910390f35b60408051600480825260a08201909252606091600091906020820160808036833701905050905060007380e546adabfe36349909c701a66e6d6b19c6fdb1905080826000815181106100a2576100a26101f7565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073b4e0835bd24b34d0c845cea3a782cd1d03cfb307905080826001815181106100f0576100f06101f7565b60200260200101906001600160a01b031690816001600160a01b031681525050506000730c7f98bee4116317e3fa3f9dd12112ecb29e2fcb9050808260028151811061013e5761013e6101f7565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073f4f21df9e49b88a4dd513701a4f8e686cf36e0099050808260038151811061018c5761018c6101f7565b6001600160a01b039092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156101eb5783516001600160a01b0316835292840192918401916001016101c6565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212207eaa5fea312a359ea400132775b658e5b3958f5cf8eeea13fd5d5c8ca327ad8964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[] memory) {\n address[] memory r = new address[](4);\n {\n address r_0 = 0x80e546aDaBfE36349909c701a66e6d6B19C6Fdb1;\n r[0] = r_0;\n }\n {\n address r_1 = 0xB4e0835BD24b34d0C845CEA3A782Cd1D03CfB307;\n r[1] = r_1;\n }\n {\n address r_2 = 0x0c7F98BEE4116317E3fa3f9dD12112ecb29e2Fcb;\n r[2] = r_2;\n }\n {\n address r_3 = 0xF4f21df9E49b88A4Dd513701A4F8E686CF36e009;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000080e546adabfe36349909c701a66e6d6b19c6fdb1000000000000000000000000b4e0835bd24b34d0c845cea3a782cd1d03cfb3070000000000000000000000000c7f98bee4116317e3fa3f9dd12112ecb29e2fcb000000000000000000000000f4f21df9e49b88a4dd513701a4f8e686cf36e009" + }, + { + "name": "random-address[1]", + "type": "address[1]", + "value": ["0x6C23ED2EA8B4cDab8e0585A626248968A0F3a97d"], + "verbose": { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6C23ED2EA8B4cDab8e0585A626248968A0F3a97d" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608d565b60405180910390f35b604d606f565b6053606f565b736c23ed2ea8b4cdab8e0585a626248968a0f3a97d8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560bc5781516001600160a01b0316835291830191908301906001016098565b505050509291505056fea26469706673582212200f2c758270b159d574560d28e9191fd304a6ff1c1c668f03724a6160eaf6d53064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[1] memory) {\n address[1] memory r;\n {\n address r_0 = 0x6C23ED2EA8B4cDab8e0585A626248968A0F3a97d;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000006c23ed2ea8b4cdab8e0585a626248968a0f3a97d" + }, + { + "name": "random-address[2]", + "type": "address[2]", + "value": [ + "0xE8A675831d235e064a52f74344762aB16D844a2D", + "0xF1D5Ac3d0d9B437484615f725bfB599c713AA41E" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xE8A675831d235e064a52f74344762aB16D844a2D" + }, + { + "type": "address", + "value": "0xF1D5Ac3d0d9B437484615f725bfB599c713AA41E" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610115806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a7565b60405180910390f35b604d6089565b60536089565b73e8a675831d235e064a52f74344762ab16d844a2d815273f1d5ac3d0d9b437484615f725bfb599c713aa41e6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560d65781516001600160a01b031683526020928301929091019060010160b0565b5050509291505056fea26469706673582212206501a2128ebf5c5092904d7dc830893cc7063842beb510a3810ac6040a05b21764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[2] memory) {\n address[2] memory r;\n {\n address r_0 = 0xE8A675831d235e064a52f74344762aB16D844a2D;\n r[0] = r_0;\n }\n {\n address r_1 = 0xF1D5Ac3d0d9B437484615f725bfB599c713AA41E;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000e8a675831d235e064a52f74344762ab16d844a2d000000000000000000000000f1d5ac3d0d9b437484615f725bfb599c713aa41e" + }, + { + "name": "random-address[3]", + "type": "address[3]", + "value": [ + "0x5c1e1fb66117c6289A7fC0abBF5814916b435AeD", + "0xD05110F990B8a8C91643ad99F82f44075C7b2C31", + "0x76D9fd070B7854a45759a377d7c8F1e6684c1FF7" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x5c1e1fb66117c6289A7fC0abBF5814916b435AeD" + }, + { + "type": "address", + "value": "0xD05110F990B8a8C91643ad99F82f44075C7b2C31" + }, + { + "type": "address", + "value": "0x76D9fd070B7854a45759a377d7c8F1e6684c1FF7" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061012f806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060c1565b60405180910390f35b604d60a3565b605360a3565b735c1e1fb66117c6289a7fc0abbf5814916b435aed815273d05110f990b8a8c91643ad99f82f44075c7b2c3160208201527376d9fd070b7854a45759a377d7c8f1e6684c1ff76040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560f05781516001600160a01b031683526020928301929091019060010160ca565b5050509291505056fea2646970667358221220b87ae06ec99a6aaa1dba8184bf5a50f9371810e7861e255ebf44918cf1ad52b564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[3] memory) {\n address[3] memory r;\n {\n address r_0 = 0x5c1e1fb66117c6289A7fC0abBF5814916b435AeD;\n r[0] = r_0;\n }\n {\n address r_1 = 0xD05110F990B8a8C91643ad99F82f44075C7b2C31;\n r[1] = r_1;\n }\n {\n address r_2 = 0x76D9fd070B7854a45759a377d7c8F1e6684c1FF7;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000005c1e1fb66117c6289a7fc0abbf5814916b435aed000000000000000000000000d05110f990b8a8c91643ad99f82f44075c7b2c3100000000000000000000000076d9fd070b7854a45759a377d7c8f1e6684c1ff7" + }, + { + "name": "random-address[4]", + "type": "address[4]", + "value": [ + "0x0E6271D301AeDc2d2EACe8d5c39530cB69fa33c0", + "0x874EEE756A5C2CD1AA40fB2B0aE05EEA3E40b743", + "0x65927909AF95849EA0e6482D4979Aa97B6de4018", + "0x4C5A964560e6aFe698397A9A11B3A85c45a3f2a6" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x0E6271D301AeDc2d2EACe8d5c39530cB69fa33c0" + }, + { + "type": "address", + "value": "0x874EEE756A5C2CD1AA40fB2B0aE05EEA3E40b743" + }, + { + "type": "address", + "value": "0x65927909AF95849EA0e6482D4979Aa97B6de4018" + }, + { + "type": "address", + "value": "0x4C5A964560e6aFe698397A9A11B3A85c45a3f2a6" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610156806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e6565b60405180910390f35b6100566100c8565b61005e6100c8565b730e6271d301aedc2d2eace8d5c39530cb69fa33c0815273874eee756a5c2cd1aa40fb2b0ae05eea3e40b74360208201527365927909af95849ea0e6482d4979aa97b6de40186040820152734c5a964560e6afe698397a9a11b3a85c45a3f2a66060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b60048110156101175781516001600160a01b03168352602092830192909101906001016100ef565b5050509291505056fea2646970667358221220343e4de5977ef03fec633737df1518219d49da49d8077088df2737a5edd0a04764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[4] memory) {\n address[4] memory r;\n {\n address r_0 = 0x0E6271D301AeDc2d2EACe8d5c39530cB69fa33c0;\n r[0] = r_0;\n }\n {\n address r_1 = 0x874EEE756A5C2CD1AA40fB2B0aE05EEA3E40b743;\n r[1] = r_1;\n }\n {\n address r_2 = 0x65927909AF95849EA0e6482D4979Aa97B6de4018;\n r[2] = r_2;\n }\n {\n address r_3 = 0x4C5A964560e6aFe698397A9A11B3A85c45a3f2a6;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000e6271d301aedc2d2eace8d5c39530cb69fa33c0000000000000000000000000874eee756a5c2cd1aa40fb2b0ae05eea3e40b74300000000000000000000000065927909af95849ea0e6482d4979aa97b6de40180000000000000000000000004c5a964560e6afe698397a9a11b3a85c45a3f2a6" + }, + { + "name": "random-bool[]", + "type": "bool[]", + "value": [false, true], + "verbose": { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100cc565b60405180910390f35b604080516002808252606080830184529260009291906020830190803683370190505090506000808260008151811061008957610089610112565b6020026020010190151590811515815250505060006001905080826001815181106100b6576100b6610112565b9115156020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156101065783511515835292840192918401916001016100e8565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212209d5b4f51d75c59962293f6299d2a25a2f9640ebc68a1b0e0b7f9fbb7f4deb58a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[] memory) {\n bool[] memory r = new bool[](2);\n {\n bool r_0 = false;\n r[0] = r_0;\n }\n {\n bool r_1 = true;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bool[1]", + "type": "bool[1]", + "value": [true], + "verbose": { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060e28061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607a565b60405180910390f35b604d605c565b6053605c565b60018152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560a25781511515835291830191908301906001016085565b505050509291505056fea264697066735822122011bf4dea5af3a53f24a2b2be5d145a9239b14546bf3970a6f83501642f5ab78964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[1] memory) {\n bool[1] memory r;\n {\n bool r_0 = true;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bool[2]", + "type": "bool[2]", + "value": [false, false], + "verbose": { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060e78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906080565b60405180910390f35b604d6062565b60536062565b60008082526020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560a857815115158352602092830192909101906001016089565b5050509291505056fea26469706673582212206010a35fdbf5f41980ce90be5602d517135120a3540a9f8a1cb345e699c0a9d664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[2] memory) {\n bool[2] memory r;\n {\n bool r_0 = false;\n r[0] = r_0;\n }\n {\n bool r_1 = false;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[3]", + "type": "bool[3]", + "value": [true, false, false], + "verbose": { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ef8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906088565b60405180910390f35b604d606a565b6053606a565b600181526000602082018190526040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560b057815115158352602092830192909101906001016091565b5050509291505056fea2646970667358221220cc89ded65f44eaf782dbf740d59b9e66c154b917482856936364128f94ec5dcb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[3] memory) {\n bool[3] memory r;\n {\n bool r_0 = true;\n r[0] = r_0;\n }\n {\n bool r_1 = false;\n r[1] = r_1;\n }\n {\n bool r_2 = false;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[4]", + "type": "bool[4]", + "value": [true, true, true, false], + "verbose": { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f58061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608e565b60405180910390f35b604d6070565b60536070565b600180825260208201819052604082015260006060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560b657815115158352602092830192909101906001016097565b5050509291505056fea26469706673582212206086ecb4c4359b841e31a8cba520e7eeee939b3808b6b6f9905d5109e72be11564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[4] memory) {\n bool[4] memory r;\n {\n bool r_0 = true;\n r[0] = r_0;\n }\n {\n bool r_1 = true;\n r[1] = r_1;\n }\n {\n bool r_2 = true;\n r[2] = r_2;\n }\n {\n bool r_3 = false;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes1[]", + "type": "bytes1[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060cf8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b81811015608d5783516001600160f81b031916835292840192918401916001016069565b5090969550505050505056fea2646970667358221220b7982169ad94b7eb3b0030e90fa64e512bc7ebb8d6545be4b212d930b7eb781864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes1[] memory) {\n bytes1[] memory r = new bytes1[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes1[1]", + "type": "bytes1[1]", + "value": ["0xf4"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf4" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ed8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607d565b60405180910390f35b604d605f565b6053605f565b603d60fa1b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560ad5781516001600160f81b031916835291830191908301906001016088565b505050509291505056fea26469706673582212208067f4dcf7425bd1842bd77720d4d2c13ecbe01166d632ba656bf3acf9d6829e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes1[1] memory) {\n bytes1[1] memory r;\n {\n bytes1 r_0 = bytes1(0xf4);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xf400000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes1[2]", + "type": "bytes1[2]", + "value": ["0xec", "0xd8"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xec" + }, + { + "type": "hexstring", + "value": "0xd8" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906087565b60405180910390f35b604d6069565b60536069565b603b60fa1b8152601b60fb1b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560b75781516001600160f81b0319168352602092830192909101906001016090565b5050509291505056fea2646970667358221220bcdb07b837cb375f403e8f5fc83713d50ccb4e163aa34d8df750789b2eac924864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes1[2] memory) {\n bytes1[2] memory r;\n {\n bytes1 r_0 = bytes1(0xec);\n r[0] = r_0;\n }\n {\n bytes1 r_1 = bytes1(0xd8);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xec00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes1[4]", + "type": "bytes1[4]", + "value": ["0xe0", "0x79", "0xa1", "0x9e"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe0" + }, + { + "type": "hexstring", + "value": "0x79" + }, + { + "type": "hexstring", + "value": "0xa1" + }, + { + "type": "hexstring", + "value": "0x9e" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609b565b60405180910390f35b604d607d565b6053607d565b600760fd1b8152607960f81b602082015260a160f81b6040820152604f60f91b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560cb5781516001600160f81b03191683526020928301929091019060010160a4565b5050509291505056fea2646970667358221220d40fe2a47cf1ce454b5239ca380a8748a1875c8ec6fe54b25da561c5f07ee7b364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes1[4] memory) {\n bytes1[4] memory r;\n {\n bytes1 r_0 = bytes1(0xe0);\n r[0] = r_0;\n }\n {\n bytes1 r_1 = bytes1(0x79);\n r[1] = r_1;\n }\n {\n bytes1 r_2 = bytes1(0xa1);\n r[2] = r_2;\n }\n {\n bytes1 r_3 = bytes1(0x9e);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xe0000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes10[1]", + "type": "bytes10[1]", + "value": ["0x16e4242c5ace0794fe8c"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x16e4242c5ace0794fe8c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906086565b60405180910390f35b604d6068565b60536068565b6905b9090b16b381e53fa360b21b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560b65781516001600160b01b031916835291830191908301906001016091565b505050509291505056fea2646970667358221220055c1206b76ebb4db94f95412c18d5ef161b038243adb24ae3e0f62cc8bd01ca64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes10[1] memory) {\n bytes10[1] memory r;\n {\n bytes10 r_0 = bytes10(0x16e4242c5ace0794fe8c);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x16e4242c5ace0794fe8c00000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes10[3]", + "type": "bytes10[3]", + "value": ["0xfc62ca4b6d38ea298e54", "0xdce4371470ab37147a97", "0x9bb1c70575976af52192"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfc62ca4b6d38ea298e54" + }, + { + "type": "hexstring", + "value": "0xdce4371470ab37147a97" + }, + { + "type": "hexstring", + "value": "0x9bb1c70575976af52192" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061011b806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060ac565b60405180910390f35b604d608e565b6053608e565b693f18b292db4e3a8a639560b21b815269dce4371470ab37147a9760b01b6020820152694dd8e382bacbb57a90c960b11b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560dc5781516001600160b01b03191683526020928301929091019060010160b5565b5050509291505056fea2646970667358221220e4a5ef2decb51a3df5203e731beba5a9fca78d5fd4f2064f5ce80ab86345546364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes10[3] memory) {\n bytes10[3] memory r;\n {\n bytes10 r_0 = bytes10(0xfc62ca4b6d38ea298e54);\n r[0] = r_0;\n }\n {\n bytes10 r_1 = bytes10(0xdce4371470ab37147a97);\n r[1] = r_1;\n }\n {\n bytes10 r_2 = bytes10(0x9bb1c70575976af52192);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xfc62ca4b6d38ea298e5400000000000000000000000000000000000000000000dce4371470ab37147a97000000000000000000000000000000000000000000009bb1c70575976af5219200000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes10[4]", + "type": "bytes10[4]", + "value": [ + "0xe07d1dc2ac9c0f712d11", + "0xf1469e06e424b0e35d94", + "0x2b9d7edda4c3f7259a99", + "0x68c298b389927124ab00" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe07d1dc2ac9c0f712d11" + }, + { + "type": "hexstring", + "value": "0xf1469e06e424b0e35d94" + }, + { + "type": "hexstring", + "value": "0x2b9d7edda4c3f7259a99" + }, + { + "type": "hexstring", + "value": "0x68c298b389927124ab00" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061012d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060be565b60405180910390f35b604d60a0565b605360a0565b69e07d1dc2ac9c0f712d1160b01b8152693c51a781b9092c38d76560b21b6020820152692b9d7edda4c3f7259a9960b01b60408201526868c298b389927124ab60b81b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560ee5781516001600160b01b03191683526020928301929091019060010160c7565b5050509291505056fea2646970667358221220a8ea697fa0a82b3aa9642b0e5b78c9a7f3b34803e055cea46978d49eaabfb5d764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes10[4] memory) {\n bytes10[4] memory r;\n {\n bytes10 r_0 = bytes10(0xe07d1dc2ac9c0f712d11);\n r[0] = r_0;\n }\n {\n bytes10 r_1 = bytes10(0xf1469e06e424b0e35d94);\n r[1] = r_1;\n }\n {\n bytes10 r_2 = bytes10(0x2b9d7edda4c3f7259a99);\n r[2] = r_2;\n }\n {\n bytes10 r_3 = bytes10(0x68c298b389927124ab00);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xe07d1dc2ac9c0f712d1100000000000000000000000000000000000000000000f1469e06e424b0e35d94000000000000000000000000000000000000000000002b9d7edda4c3f7259a990000000000000000000000000000000000000000000068c298b389927124ab0000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes11[]", + "type": "bytes11[]", + "value": [ + "0xaa71049e2d6bad21d578a9", + "0xd1f39e2daa9de9421504c0", + "0x1071120c34bebf6befbe63", + "0xaf9b4024250a276fb73582" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xaa71049e2d6bad21d578a9" + }, + { + "type": "hexstring", + "value": "0xd1f39e2daa9de9421504c0" + }, + { + "type": "hexstring", + "value": "0x1071120c34bebf6befbe63" + }, + { + "type": "hexstring", + "value": "0xaf9b4024250a276fb73582" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610216806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017c565b60405180910390f35b60408051600480825260a082019092526060916000919060208201608080368337505081519192506aaa71049e2d6bad21d578a960a81b91829150839060009061009a5761009a6101ca565b6001600160a81b0319909216602092830291909101909101525080516a0347ce78b6aa77a508541360ae1b908190839060019081106100db576100db6101ca565b6001600160a81b0319909216602092830291909101909101525080516a1071120c34bebf6befbe6360a81b9081908390600290811061011c5761011c6101ca565b6001600160a81b0319909216602092830291909101909101525080516a57cda012128513b7db9ac160a91b9081908390600390811061015d5761015d6101ca565b6001600160a81b03199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156101be5783516001600160a81b03191683529284019291840191600101610198565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122017da9a1864c8e9818262ec6d792e7fee2a6e90071e62906b020db72a7fb849ec64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes11[] memory) {\n bytes11[] memory r = new bytes11[](4);\n {\n bytes11 r_0 = bytes11(0xaa71049e2d6bad21d578a9);\n r[0] = r_0;\n }\n {\n bytes11 r_1 = bytes11(0xd1f39e2daa9de9421504c0);\n r[1] = r_1;\n }\n {\n bytes11 r_2 = bytes11(0x1071120c34bebf6befbe63);\n r[2] = r_2;\n }\n {\n bytes11 r_3 = bytes11(0xaf9b4024250a276fb73582);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004aa71049e2d6bad21d578a9000000000000000000000000000000000000000000d1f39e2daa9de9421504c00000000000000000000000000000000000000000001071120c34bebf6befbe63000000000000000000000000000000000000000000af9b4024250a276fb73582000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes11[2]", + "type": "bytes11[2]", + "value": ["0xa58b6765b4d49e8ead8c14", "0x316dc64397e8dd0b922d3d"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa58b6765b4d49e8ead8c14" + }, + { + "type": "hexstring", + "value": "0x316dc64397e8dd0b922d3d" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609b565b60405180910390f35b604d607d565b6053607d565b6a2962d9d96d3527a3ab630560aa1b81526a316dc64397e8dd0b922d3d60a81b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560cb5781516001600160a81b03191683526020928301929091019060010160a4565b5050509291505056fea26469706673582212200df35318d58b7a8c1269cc812817d95452521a9c789fb933ececb623e05a381164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes11[2] memory) {\n bytes11[2] memory r;\n {\n bytes11 r_0 = bytes11(0xa58b6765b4d49e8ead8c14);\n r[0] = r_0;\n }\n {\n bytes11 r_1 = bytes11(0x316dc64397e8dd0b922d3d);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xa58b6765b4d49e8ead8c14000000000000000000000000000000000000000000316dc64397e8dd0b922d3d000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes11[4]", + "type": "bytes11[4]", + "value": [ + "0x295f96a01727c7057cedcb", + "0xa65cfa7948af0ce2b21c70", + "0xb09c0a560f8181d92d7c66", + "0x3d8fe11d57996d0039a95b" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x295f96a01727c7057cedcb" + }, + { + "type": "hexstring", + "value": "0xa65cfa7948af0ce2b21c70" + }, + { + "type": "hexstring", + "value": "0xb09c0a560f8181d92d7c66" + }, + { + "type": "hexstring", + "value": "0x3d8fe11d57996d0039a95b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610132806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060c3565b60405180910390f35b604d60a5565b605360a5565b6a295f96a01727c7057cedcb60a81b81526a0a65cfa7948af0ce2b21c760ac1b60208201526a584e052b07c0c0ec96be3360a91b60408201526a3d8fe11d57996d0039a95b60a81b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560f35781516001600160a81b03191683526020928301929091019060010160cc565b5050509291505056fea2646970667358221220967dcc6cea05158fbbaeae1b7cb341c4aeaba3bec0e36be9512770b2a478c0c664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes11[4] memory) {\n bytes11[4] memory r;\n {\n bytes11 r_0 = bytes11(0x295f96a01727c7057cedcb);\n r[0] = r_0;\n }\n {\n bytes11 r_1 = bytes11(0xa65cfa7948af0ce2b21c70);\n r[1] = r_1;\n }\n {\n bytes11 r_2 = bytes11(0xb09c0a560f8181d92d7c66);\n r[2] = r_2;\n }\n {\n bytes11 r_3 = bytes11(0x3d8fe11d57996d0039a95b);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x295f96a01727c7057cedcb000000000000000000000000000000000000000000a65cfa7948af0ce2b21c70000000000000000000000000000000000000000000b09c0a560f8181d92d7c660000000000000000000000000000000000000000003d8fe11d57996d0039a95b000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes12[]", + "type": "bytes12[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060cf8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b81811015608d5783516001600160a01b031916835292840192918401916001016069565b5090969550505050505056fea2646970667358221220d217b69a1da8d5d7d9e51976f3bebcf1578826817b30b6aee35fc8a5769a642e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes12[] memory) {\n bytes12[] memory r = new bytes12[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes12[1]", + "type": "bytes12[1]", + "value": ["0x55651c2e839c35f07e47f1b5"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x55651c2e839c35f07e47f1b5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f88061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906088565b60405180910390f35b604d606a565b6053606a565b6b55651c2e839c35f07e47f1b560a01b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560b85781516001600160a01b031916835291830191908301906001016093565b505050509291505056fea2646970667358221220a65e3b53c3bebd7b20e0464a13ea1743ec654bc0430024232ac9076755cc7ea764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes12[1] memory) {\n bytes12[1] memory r;\n {\n bytes12 r_0 = bytes12(0x55651c2e839c35f07e47f1b5);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x55651c2e839c35f07e47f1b50000000000000000000000000000000000000000" + }, + { + "name": "random-bytes13[]", + "type": "bytes13[]", + "value": ["0x3014860fdc9d42c5f0af7af406", "0xcadf2d6eaef72f0cf2423af310"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3014860fdc9d42c5f0af7af406" + }, + { + "type": "hexstring", + "value": "0xcadf2d6eaef72f0cf2423af310" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610196806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fc565b60405180910390f35b60408051600280825260608083018452926000929190602083019080368337505081519192506c180a4307ee4ea162f857bd7a0360991b91829150839060009061009a5761009a61014a565b6001600160981b0319909216602092830291909101909101525080516c0cadf2d6eaef72f0cf2423af31609c1b908190839060019081106100dd576100dd61014a565b6001600160981b03199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561013e5783516001600160981b03191683529284019291840191600101610118565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220a1a995ec51f6d1c60aadef57adc781b52cb73155d1e2624e2555b2449c4bea4964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes13[] memory) {\n bytes13[] memory r = new bytes13[](2);\n {\n bytes13 r_0 = bytes13(0x3014860fdc9d42c5f0af7af406);\n r[0] = r_0;\n }\n {\n bytes13 r_1 = bytes13(0xcadf2d6eaef72f0cf2423af310);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000023014860fdc9d42c5f0af7af40600000000000000000000000000000000000000cadf2d6eaef72f0cf2423af31000000000000000000000000000000000000000" + }, + { + "name": "random-bytes13[2]", + "type": "bytes13[2]", + "value": ["0x025d295788e4a595c35f415272", "0xbc4a6675d9271d65f3c4f02d6b"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x025d295788e4a595c35f415272" + }, + { + "type": "hexstring", + "value": "0xbc4a6675d9271d65f3c4f02d6b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061011a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609f565b60405180910390f35b604d6081565b60536081565b6c012e94abc47252cae1afa0a93960991b81526cbc4a6675d9271d65f3c4f02d6b60981b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560db57815172ffffffffffffffffffffffffffffffffffffff191683526020928301929091019060010160a8565b5050509291505056fea2646970667358221220af9756f20542d19f69a163451f0c7ad8d047b6e7d523117e8ed9610859b2b4f964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes13[2] memory) {\n bytes13[2] memory r;\n {\n bytes13 r_0 = bytes13(0x025d295788e4a595c35f415272);\n r[0] = r_0;\n }\n {\n bytes13 r_1 = bytes13(0xbc4a6675d9271d65f3c4f02d6b);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x025d295788e4a595c35f41527200000000000000000000000000000000000000bc4a6675d9271d65f3c4f02d6b00000000000000000000000000000000000000" + }, + { + "name": "random-bytes13[3]", + "type": "bytes13[3]", + "value": [ + "0x8649f981fe32b301b4b66f7dec", + "0x698f952a37d77d14d4043d891a", + "0xee9eff7d53fc2e06d44ab21ca5" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8649f981fe32b301b4b66f7dec" + }, + { + "type": "hexstring", + "value": "0x698f952a37d77d14d4043d891a" + }, + { + "type": "hexstring", + "value": "0xee9eff7d53fc2e06d44ab21ca5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610130806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b5565b60405180910390f35b604d6097565b60536097565b6c21927e607f8cacc06d2d9bdf7b609a1b81526c34c7ca951bebbe8a6a021ec48d60991b60208201526cee9eff7d53fc2e06d44ab21ca560981b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560f157815172ffffffffffffffffffffffffffffffffffffff191683526020928301929091019060010160be565b5050509291505056fea26469706673582212205efb02cc696e02eb0bb126cbd20f66202a55ee96d0445249dd1bbdf3cf0af69764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes13[3] memory) {\n bytes13[3] memory r;\n {\n bytes13 r_0 = bytes13(0x8649f981fe32b301b4b66f7dec);\n r[0] = r_0;\n }\n {\n bytes13 r_1 = bytes13(0x698f952a37d77d14d4043d891a);\n r[1] = r_1;\n }\n {\n bytes13 r_2 = bytes13(0xee9eff7d53fc2e06d44ab21ca5);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x8649f981fe32b301b4b66f7dec00000000000000000000000000000000000000698f952a37d77d14d4043d891a00000000000000000000000000000000000000ee9eff7d53fc2e06d44ab21ca500000000000000000000000000000000000000" + }, + { + "name": "random-bytes14[]", + "type": "bytes14[]", + "value": ["0xf577f4b17c08cbffef3f8d57aa9a", "0x5916f61d436a373e9689c85573bc"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf577f4b17c08cbffef3f8d57aa9a" + }, + { + "type": "hexstring", + "value": "0x5916f61d436a373e9689c85573bc" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610198806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fe565b60405180910390f35b60408051600280825260608083018452926000929190602083019080368337505081519192506d7abbfa58be0465fff79fc6abd54d60911b91829150839060009061009b5761009b61014c565b6001600160901b0319909216602092830291909101909101525080516d1645bd8750da8dcfa5a272155cef60921b908190839060019081106100df576100df61014c565b6001600160901b03199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156101405783516001600160901b0319168352928401929184019160010161011a565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220326a8edde76b46071f45a226ac89e4d9ead90877a4e4207a4871fbd4c35d713264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes14[] memory) {\n bytes14[] memory r = new bytes14[](2);\n {\n bytes14 r_0 = bytes14(0xf577f4b17c08cbffef3f8d57aa9a);\n r[0] = r_0;\n }\n {\n bytes14 r_1 = bytes14(0x5916f61d436a373e9689c85573bc);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002f577f4b17c08cbffef3f8d57aa9a0000000000000000000000000000000000005916f61d436a373e9689c85573bc000000000000000000000000000000000000" + }, + { + "name": "random-bytes14[2]", + "type": "bytes14[2]", + "value": ["0x7cc881f5f1fb879620cac2ee568d", "0x36155f66b2df9109808f4628d875"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7cc881f5f1fb879620cac2ee568d" + }, + { + "type": "hexstring", + "value": "0x36155f66b2df9109808f4628d875" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061011b806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a1565b60405180910390f35b604d6083565b60536083565b6d7cc881f5f1fb879620cac2ee568d60901b81526d36155f66b2df9109808f4628d87560901b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560dc57815171ffffffffffffffffffffffffffffffffffff191683526020928301929091019060010160aa565b5050509291505056fea264697066735822122033d6073b75174ccaa3ea2a51f2ee9e4b748258e2606ca0d5951b7de375bcaae764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes14[2] memory) {\n bytes14[2] memory r;\n {\n bytes14 r_0 = bytes14(0x7cc881f5f1fb879620cac2ee568d);\n r[0] = r_0;\n }\n {\n bytes14 r_1 = bytes14(0x36155f66b2df9109808f4628d875);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x7cc881f5f1fb879620cac2ee568d00000000000000000000000000000000000036155f66b2df9109808f4628d875000000000000000000000000000000000000" + }, + { + "name": "random-bytes14[3]", + "type": "bytes14[3]", + "value": [ + "0x2eb812799141276c059388e29942", + "0xf9643797460cc00cf96a4d33e51e", + "0xcf46f8d269dfdb0f16f23be9a172" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2eb812799141276c059388e29942" + }, + { + "type": "hexstring", + "value": "0xf9643797460cc00cf96a4d33e51e" + }, + { + "type": "hexstring", + "value": "0xcf46f8d269dfdb0f16f23be9a172" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610132806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b8565b60405180910390f35b604d609a565b6053609a565b6d175c093cc8a093b602c9c4714ca160911b81526d7cb21bcba30660067cb52699f28f60911b60208201526d67a37c6934efed878b791df4d0b960911b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560f357815171ffffffffffffffffffffffffffffffffffff191683526020928301929091019060010160c1565b5050509291505056fea2646970667358221220c4ea4a1c5364ebb4e712970c0934456a37948a3af5d01ff9498c0317d12f65c164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes14[3] memory) {\n bytes14[3] memory r;\n {\n bytes14 r_0 = bytes14(0x2eb812799141276c059388e29942);\n r[0] = r_0;\n }\n {\n bytes14 r_1 = bytes14(0xf9643797460cc00cf96a4d33e51e);\n r[1] = r_1;\n }\n {\n bytes14 r_2 = bytes14(0xcf46f8d269dfdb0f16f23be9a172);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x2eb812799141276c059388e29942000000000000000000000000000000000000f9643797460cc00cf96a4d33e51e000000000000000000000000000000000000cf46f8d269dfdb0f16f23be9a172000000000000000000000000000000000000" + }, + { + "name": "random-bytes14[4]", + "type": "bytes14[4]", + "value": [ + "0x85f738a2efc20f687b62d50cc77e", + "0x0f1405b4dd7d681de9fe57159e2b", + "0x486ca678cb74f92901fe929210b6", + "0xaa6e7699ebc80f467d3c480b42fd" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x85f738a2efc20f687b62d50cc77e" + }, + { + "type": "hexstring", + "value": "0x0f1405b4dd7d681de9fe57159e2b" + }, + { + "type": "hexstring", + "value": "0x486ca678cb74f92901fe929210b6" + }, + { + "type": "hexstring", + "value": "0xaa6e7699ebc80f467d3c480b42fd" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610156806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100da565b60405180910390f35b6100566100bc565b61005e6100bc565b6d42fb9c5177e107b43db16a8663bf60911b81526d0f1405b4dd7d681de9fe57159e2b60901b60208201526d2436533c65ba7c9480ff4949085b60911b60408201526daa6e7699ebc80f467d3c480b42fd60901b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561011757815171ffffffffffffffffffffffffffffffffffff19168352602092830192909101906001016100e3565b5050509291505056fea2646970667358221220a47bb492f74c1cbeaaf311a0775cbdc7bddebb4fb197ad1cf599090308f2d93064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes14[4] memory) {\n bytes14[4] memory r;\n {\n bytes14 r_0 = bytes14(0x85f738a2efc20f687b62d50cc77e);\n r[0] = r_0;\n }\n {\n bytes14 r_1 = bytes14(0x0f1405b4dd7d681de9fe57159e2b);\n r[1] = r_1;\n }\n {\n bytes14 r_2 = bytes14(0x486ca678cb74f92901fe929210b6);\n r[2] = r_2;\n }\n {\n bytes14 r_3 = bytes14(0xaa6e7699ebc80f467d3c480b42fd);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x85f738a2efc20f687b62d50cc77e0000000000000000000000000000000000000f1405b4dd7d681de9fe57159e2b000000000000000000000000000000000000486ca678cb74f92901fe929210b6000000000000000000000000000000000000aa6e7699ebc80f467d3c480b42fd000000000000000000000000000000000000" + }, + { + "name": "random-bytes15[]", + "type": "bytes15[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060d98061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b81811015609757835170ffffffffffffffffffffffffffffffffff1916835292840192918401916001016069565b5090969550505050505056fea2646970667358221220c44b9e36ae95402ebcba99600f2702eebe285c3b4e9ed6d138cf95a0a1af90fc64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes15[] memory) {\n bytes15[] memory r = new bytes15[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes15[3]", + "type": "bytes15[3]", + "value": [ + "0xf9460637d8a04b1f24fc9e91c5e54f", + "0x7f5ffd4f82e0d9e8f928b1069aff62", + "0x64cfa9c4a3df6f068b0f05474f342b" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf9460637d8a04b1f24fc9e91c5e54f" + }, + { + "type": "hexstring", + "value": "0x7f5ffd4f82e0d9e8f928b1069aff62" + }, + { + "type": "hexstring", + "value": "0x64cfa9c4a3df6f068b0f05474f342b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bb565b60405180910390f35b604d609d565b6053609d565b6ef9460637d8a04b1f24fc9e91c5e54f60881b81526e3faffea7c1706cf47c9458834d7fb160891b60208201526e64cfa9c4a3df6f068b0f05474f342b60881b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560f557815170ffffffffffffffffffffffffffffffffff191683526020928301929091019060010160c4565b5050509291505056fea264697066735822122079e2302255bf67fcdf7b6c89c4d6a83efab5242879bcb507751539174cbdbdd664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes15[3] memory) {\n bytes15[3] memory r;\n {\n bytes15 r_0 = bytes15(0xf9460637d8a04b1f24fc9e91c5e54f);\n r[0] = r_0;\n }\n {\n bytes15 r_1 = bytes15(0x7f5ffd4f82e0d9e8f928b1069aff62);\n r[1] = r_1;\n }\n {\n bytes15 r_2 = bytes15(0x64cfa9c4a3df6f068b0f05474f342b);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xf9460637d8a04b1f24fc9e91c5e54f00000000000000000000000000000000007f5ffd4f82e0d9e8f928b1069aff62000000000000000000000000000000000064cfa9c4a3df6f068b0f05474f342b0000000000000000000000000000000000" + }, + { + "name": "random-bytes16[]", + "type": "bytes16[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060d88061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b8181101560965783516fffffffffffffffffffffffffffffffff1916835292840192918401916001016069565b5090969550505050505056fea26469706673582212204937103084abe6c8dbff84b003bae8efaa66b475e81c9694737b835279fea9b564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes16[] memory) {\n bytes16[] memory r = new bytes16[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes16[1]", + "type": "bytes16[1]", + "value": ["0xc1ca7d91c3f78de791c426e905e635f6"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc1ca7d91c3f78de791c426e905e635f6" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610105806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608c565b60405180910390f35b604d606e565b6053606e565b6f60e53ec8e1fbc6f3c8e2137482f31afb60811b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c55781516fffffffffffffffffffffffffffffffff1916835291830191908301906001016097565b505050509291505056fea26469706673582212207ab100a43fd7e1b4dab98cbfdf12d68e8e9566053cda98e7973a7a02473d12a264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes16[1] memory) {\n bytes16[1] memory r;\n {\n bytes16 r_0 = bytes16(0xc1ca7d91c3f78de791c426e905e635f6);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xc1ca7d91c3f78de791c426e905e635f600000000000000000000000000000000" + }, + { + "name": "random-bytes16[3]", + "type": "bytes16[3]", + "value": [ + "0x8e1979d70054e446efdaaef0e20ba4dd", + "0x13a9d6a761bcd6cbec6346097871edb9", + "0x7efa8af954780d358649aca1b81ab345" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8e1979d70054e446efdaaef0e20ba4dd" + }, + { + "type": "hexstring", + "value": "0x13a9d6a761bcd6cbec6346097871edb9" + }, + { + "type": "hexstring", + "value": "0x7efa8af954780d358649aca1b81ab345" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610143806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c9565b60405180910390f35b6100566100ab565b61005e6100ab565b6f8e1979d70054e446efdaaef0e20ba4dd60801b81526f13a9d6a761bcd6cbec6346097871edb960801b60208201526f7efa8af954780d358649aca1b81ab34560801b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b60038110156101045781516fffffffffffffffffffffffffffffffff19168352602092830192909101906001016100d2565b5050509291505056fea26469706673582212207965be8f6dcabe4cfcadebabcab364cd7aa67dedb67255771168fe85f82a2e7164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes16[3] memory) {\n bytes16[3] memory r;\n {\n bytes16 r_0 = bytes16(0x8e1979d70054e446efdaaef0e20ba4dd);\n r[0] = r_0;\n }\n {\n bytes16 r_1 = bytes16(0x13a9d6a761bcd6cbec6346097871edb9);\n r[1] = r_1;\n }\n {\n bytes16 r_2 = bytes16(0x7efa8af954780d358649aca1b81ab345);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x8e1979d70054e446efdaaef0e20ba4dd0000000000000000000000000000000013a9d6a761bcd6cbec6346097871edb9000000000000000000000000000000007efa8af954780d358649aca1b81ab34500000000000000000000000000000000" + }, + { + "name": "random-bytes16[4]", + "type": "bytes16[4]", + "value": [ + "0x19b9b8e23cec1357bd62d14137436d4c", + "0xf6193ca5a13d2a44aa07c60d05cb058f", + "0x11528648484f38f63ceaef3d86fbe85e", + "0x742d81984e76defc5b3b6624fc5b27ce" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x19b9b8e23cec1357bd62d14137436d4c" + }, + { + "type": "hexstring", + "value": "0xf6193ca5a13d2a44aa07c60d05cb058f" + }, + { + "type": "hexstring", + "value": "0x11528648484f38f63ceaef3d86fbe85e" + }, + { + "type": "hexstring", + "value": "0x742d81984e76defc5b3b6624fc5b27ce" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e2565b60405180910390f35b6100566100c4565b61005e6100c4565b6f066e6e388f3b04d5ef58b4504dd0db5360821b81526ff6193ca5a13d2a44aa07c60d05cb058f60801b60208201526f08a9432424279c7b1e75779ec37df42f60811b60408201526f3a16c0cc273b6f7e2d9db3127e2d93e760811b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561011d5781516fffffffffffffffffffffffffffffffff19168352602092830192909101906001016100eb565b5050509291505056fea2646970667358221220a3b54a029a39ddfdaa52fbbcc59294d4083b5ac4b82738dd36bb8782a699facf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes16[4] memory) {\n bytes16[4] memory r;\n {\n bytes16 r_0 = bytes16(0x19b9b8e23cec1357bd62d14137436d4c);\n r[0] = r_0;\n }\n {\n bytes16 r_1 = bytes16(0xf6193ca5a13d2a44aa07c60d05cb058f);\n r[1] = r_1;\n }\n {\n bytes16 r_2 = bytes16(0x11528648484f38f63ceaef3d86fbe85e);\n r[2] = r_2;\n }\n {\n bytes16 r_3 = bytes16(0x742d81984e76defc5b3b6624fc5b27ce);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x19b9b8e23cec1357bd62d14137436d4c00000000000000000000000000000000f6193ca5a13d2a44aa07c60d05cb058f0000000000000000000000000000000011528648484f38f63ceaef3d86fbe85e00000000000000000000000000000000742d81984e76defc5b3b6624fc5b27ce00000000000000000000000000000000" + }, + { + "name": "random-bytes17[]", + "type": "bytes17[]", + "value": [ + "0xdbc1b6519578cf476e53a3bb6ee205532a", + "0x0e8557db553e0144fb100a08eebd23f2f4", + "0x74a3152d3f22fd469948a72173a79fd87f" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdbc1b6519578cf476e53a3bb6ee205532a" + }, + { + "type": "hexstring", + "value": "0x0e8557db553e0144fb100a08eebd23f2f4" + }, + { + "type": "hexstring", + "value": "0x74a3152d3f22fd469948a72173a79fd87f" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101e6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061014c565b60405180910390f35b604080516003808252608082019092526060916000919060208201848036833750508151919250706de0db28cabc67a3b729d1ddb77102a99560791b91829150839060009061009f5761009f61019a565b6001600160781b0319909216602092830291909101909101525080517003a155f6d54f80513ec402823baf48fcbd607a1b908190839060019081106100e6576100e661019a565b6001600160781b0319909216602092830291909101909101525080517074a3152d3f22fd469948a72173a79fd87f60781b9081908390600290811061012d5761012d61019a565b6001600160781b03199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561018e5783516001600160781b03191683529284019291840191600101610168565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122069c04136c04d9d6b92cb06213f3c0a5c83fd8d42675dea13cc1e8969dab4d76164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes17[] memory) {\n bytes17[] memory r = new bytes17[](3);\n {\n bytes17 r_0 = bytes17(0xdbc1b6519578cf476e53a3bb6ee205532a);\n r[0] = r_0;\n }\n {\n bytes17 r_1 = bytes17(0x0e8557db553e0144fb100a08eebd23f2f4);\n r[1] = r_1;\n }\n {\n bytes17 r_2 = bytes17(0x74a3152d3f22fd469948a72173a79fd87f);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003dbc1b6519578cf476e53a3bb6ee205532a0000000000000000000000000000000e8557db553e0144fb100a08eebd23f2f400000000000000000000000000000074a3152d3f22fd469948a72173a79fd87f000000000000000000000000000000" + }, + { + "name": "random-bytes17[2]", + "type": "bytes17[2]", + "value": ["0x14ccd0a2d136002cb191ba95cacdfe2303", "0x0b1c8a5bd98fdf9d6fc5d1feb07d07b187"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x14ccd0a2d136002cb191ba95cacdfe2303" + }, + { + "type": "hexstring", + "value": "0x0b1c8a5bd98fdf9d6fc5d1feb07d07b187" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061011e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a7565b60405180910390f35b604d6089565b60536089565b7014ccd0a2d136002cb191ba95cacdfe230360781b8152700b1c8a5bd98fdf9d6fc5d1feb07d07b18760781b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560df5781516effffffffffffffffffffffffffffff191683526020928301929091019060010160b0565b5050509291505056fea2646970667358221220e8ab40fc8c3fb3651a9ee90e0f7cc1a1b22960991c71da60a8cb58831955789f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes17[2] memory) {\n bytes17[2] memory r;\n {\n bytes17 r_0 = bytes17(0x14ccd0a2d136002cb191ba95cacdfe2303);\n r[0] = r_0;\n }\n {\n bytes17 r_1 = bytes17(0x0b1c8a5bd98fdf9d6fc5d1feb07d07b187);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x14ccd0a2d136002cb191ba95cacdfe23030000000000000000000000000000000b1c8a5bd98fdf9d6fc5d1feb07d07b187000000000000000000000000000000" + }, + { + "name": "random-bytes17[3]", + "type": "bytes17[3]", + "value": [ + "0x13aad17e690737d34fd3fdfaac2d5b6c17", + "0x424858b72dc8802d7976473ad0118bf4a1", + "0x10b7c98ccbd0ef4c80edcc4a42291244f1" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x13aad17e690737d34fd3fdfaac2d5b6c17" + }, + { + "type": "hexstring", + "value": "0x424858b72dc8802d7976473ad0118bf4a1" + }, + { + "type": "hexstring", + "value": "0x10b7c98ccbd0ef4c80edcc4a42291244f1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610145806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100cc565b60405180910390f35b6100566100ae565b61005e6100ae565b7013aad17e690737d34fd3fdfaac2d5b6c1760781b815270424858b72dc8802d7976473ad0118bf4a160781b60208201527010b7c98ccbd0ef4c80edcc4a42291244f160781b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b60038110156101065781516effffffffffffffffffffffffffffff19168352602092830192909101906001016100d5565b5050509291505056fea2646970667358221220f7dc4875f92bfdf09073e7119e1b01ca0850f7a120af9600d02db5eeda32fe4064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes17[3] memory) {\n bytes17[3] memory r;\n {\n bytes17 r_0 = bytes17(0x13aad17e690737d34fd3fdfaac2d5b6c17);\n r[0] = r_0;\n }\n {\n bytes17 r_1 = bytes17(0x424858b72dc8802d7976473ad0118bf4a1);\n r[1] = r_1;\n }\n {\n bytes17 r_2 = bytes17(0x10b7c98ccbd0ef4c80edcc4a42291244f1);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x13aad17e690737d34fd3fdfaac2d5b6c17000000000000000000000000000000424858b72dc8802d7976473ad0118bf4a100000000000000000000000000000010b7c98ccbd0ef4c80edcc4a42291244f1000000000000000000000000000000" + }, + { + "name": "random-bytes18[1]", + "type": "bytes18[1]", + "value": ["0xa1341cc1f8884332f185a6f3294e45b5f470"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa1341cc1f8884332f185a6f3294e45b5f470" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610105806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608e565b60405180910390f35b604d6070565b60536070565b710a1341cc1f8884332f185a6f3294e45b5f4760741b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c55781516dffffffffffffffffffffffffffff1916835291830191908301906001016099565b505050509291505056fea264697066735822122064969087ba46ae336b0f78bc9f3e66780338c9d9d60cedb46c1eac01cc4fdf3d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes18[1] memory) {\n bytes18[1] memory r;\n {\n bytes18 r_0 = bytes18(0xa1341cc1f8884332f185a6f3294e45b5f470);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xa1341cc1f8884332f185a6f3294e45b5f4700000000000000000000000000000" + }, + { + "name": "random-bytes19[3]", + "type": "bytes19[3]", + "value": [ + "0xc4f5fbb3c98aa31d24bfbff26c56b298e7dec9", + "0x7df430a8e9c2d6bb148def168828a44a74b493", + "0xfa0bf3d696397a99c4578142330a531fb7f1a2" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc4f5fbb3c98aa31d24bfbff26c56b298e7dec9" + }, + { + "type": "hexstring", + "value": "0x7df430a8e9c2d6bb148def168828a44a74b493" + }, + { + "type": "hexstring", + "value": "0xfa0bf3d696397a99c4578142330a531fb7f1a2" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610149806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d2565b60405180910390f35b6100566100b4565b61005e6100b4565b72c4f5fbb3c98aa31d24bfbff26c56b298e7dec960681b8152727df430a8e9c2d6bb148def168828a44a74b49360681b6020820152727d05f9eb4b1cbd4ce22bc0a11985298fdbf8d160691b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561010a5781516cffffffffffffffffffffffffff19168352602092830192909101906001016100db565b5050509291505056fea264697066735822122024213cef98d118239ee399ba20ceb7aacc3d07c3709b4cbc07cf40e1947485bb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes19[3] memory) {\n bytes19[3] memory r;\n {\n bytes19 r_0 = bytes19(0xc4f5fbb3c98aa31d24bfbff26c56b298e7dec9);\n r[0] = r_0;\n }\n {\n bytes19 r_1 = bytes19(0x7df430a8e9c2d6bb148def168828a44a74b493);\n r[1] = r_1;\n }\n {\n bytes19 r_2 = bytes19(0xfa0bf3d696397a99c4578142330a531fb7f1a2);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xc4f5fbb3c98aa31d24bfbff26c56b298e7dec9000000000000000000000000007df430a8e9c2d6bb148def168828a44a74b49300000000000000000000000000fa0bf3d696397a99c4578142330a531fb7f1a200000000000000000000000000" + }, + { + "name": "random-bytes2[4]", + "type": "bytes2[4]", + "value": ["0x8539", "0xe459", "0x7c59", "0x6096"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8539" + }, + { + "type": "hexstring", + "value": "0xe459" + }, + { + "type": "hexstring", + "value": "0x7c59" + }, + { + "type": "hexstring", + "value": "0x6096" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609f565b60405180910390f35b604d6081565b60536081565b61853960f01b815261e45960f01b6020820152617c5960f01b604082015261304b60f11b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560cf5781516001600160f01b03191683526020928301929091019060010160a8565b5050509291505056fea2646970667358221220670aa47106a4d13c6e7275d041a033598c7b96155c5c7bba8d744204490c3f2164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes2[4] memory) {\n bytes2[4] memory r;\n {\n bytes2 r_0 = bytes2(0x8539);\n r[0] = r_0;\n }\n {\n bytes2 r_1 = bytes2(0xe459);\n r[1] = r_1;\n }\n {\n bytes2 r_2 = bytes2(0x7c59);\n r[2] = r_2;\n }\n {\n bytes2 r_3 = bytes2(0x6096);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x8539000000000000000000000000000000000000000000000000000000000000e4590000000000000000000000000000000000000000000000000000000000007c590000000000000000000000000000000000000000000000000000000000006096000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes20[]", + "type": "bytes20[]", + "value": [ + "0x4d6b6cb8bd01e37151eb1d73b368f497feef8488", + "0xe454637fa14d1b7f5fa5bfdffa7f06c6ffbdb33f", + "0x7f296da916bcd5d852ccebaea015aab4d05e10e0", + "0x049f50e7785f77fb252e4b67b54643ef135e21f0" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4d6b6cb8bd01e37151eb1d73b368f497feef8488" + }, + { + "type": "hexstring", + "value": "0xe454637fa14d1b7f5fa5bfdffa7f06c6ffbdb33f" + }, + { + "type": "hexstring", + "value": "0x7f296da916bcd5d852ccebaea015aab4d05e10e0" + }, + { + "type": "hexstring", + "value": "0x049f50e7785f77fb252e4b67b54643ef135e21f0" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610239806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019f565b60405180910390f35b60408051600480825260a082019092526060916000919060208201608080368337505081519192507309ad6d9717a03c6e2a3d63ae766d1e92ffddf09160631b9182915083906000906100a3576100a36101ed565b6001600160601b03199092166020928302919091019091015250805173e454637fa14d1b7f5fa5bfdffa7f06c6ffbdb33f60601b908190839060019081106100ed576100ed6101ed565b6001600160601b0319909216602092830291909101909101525080517303f94b6d48b5e6aec296675d7500ad55a682f08760651b90819083906002908110610137576101376101ed565b6001600160601b0319909216602092830291909101909101525080517249f50e7785f77fb252e4b67b54643ef135e21f60641b90819083906003908110610180576101806101ed565b6001600160601b03199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156101e15783516001600160601b031916835292840192918401916001016101bb565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220e86797ad8068895d4858680bb075196b87fd6e473b234956c77b92253228337e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes20[] memory) {\n bytes20[] memory r = new bytes20[](4);\n {\n bytes20 r_0 = bytes20(0x4D6b6cb8Bd01E37151eb1d73B368f497FeEF8488);\n r[0] = r_0;\n }\n {\n bytes20 r_1 = bytes20(0xE454637FA14d1b7f5fA5BFdFfA7F06c6FfBdb33F);\n r[1] = r_1;\n }\n {\n bytes20 r_2 = bytes20(0x7F296da916BCD5d852CcebaEA015Aab4d05E10E0);\n r[2] = r_2;\n }\n {\n bytes20 r_3 = bytes20(0x049f50e7785f77fB252E4B67b54643eF135e21F0);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000044d6b6cb8bd01e37151eb1d73b368f497feef8488000000000000000000000000e454637fa14d1b7f5fa5bfdffa7f06c6ffbdb33f0000000000000000000000007f296da916bcd5d852ccebaea015aab4d05e10e0000000000000000000000000049f50e7785f77fb252e4b67b54643ef135e21f0000000000000000000000000" + }, + { + "name": "random-bytes20[3]", + "type": "bytes20[3]", + "value": [ + "0xbbdb6e5c3693eb873a13337c0cf01b1b11df1aa7", + "0xcff340c9f1b8cdf35b456e78ac478b982fadebfd", + "0x28b04b536b964cb2d5bc9a9b3ed311aeb0582b80" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbbdb6e5c3693eb873a13337c0cf01b1b11df1aa7" + }, + { + "type": "hexstring", + "value": "0xcff340c9f1b8cdf35b456e78ac478b982fadebfd" + }, + { + "type": "hexstring", + "value": "0x28b04b536b964cb2d5bc9a9b3ed311aeb0582b80" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d4565b60405180910390f35b6100566100b6565b61005e6100b6565b73bbdb6e5c3693eb873a13337c0cf01b1b11df1aa760601b815273cff340c9f1b8cdf35b456e78ac478b982fadebfd60601b602082015272516096a6d72c9965ab7935367da6235d60b05760671b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561010b5781516bffffffffffffffffffffffff19168352602092830192909101906001016100dd565b5050509291505056fea2646970667358221220e98ee2db51eb2bb8028992827ce2d458c0ae4e3e6c831bf2f04fc9251119723f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes20[3] memory) {\n bytes20[3] memory r;\n {\n bytes20 r_0 = bytes20(0xbbdB6E5c3693Eb873A13337C0CF01B1B11df1Aa7);\n r[0] = r_0;\n }\n {\n bytes20 r_1 = bytes20(0xcfF340C9f1B8cDF35b456e78AC478B982FAdEbFD);\n r[1] = r_1;\n }\n {\n bytes20 r_2 = bytes20(0x28b04B536b964cb2d5bC9A9b3Ed311Aeb0582b80);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xbbdb6e5c3693eb873a13337c0cf01b1b11df1aa7000000000000000000000000cff340c9f1b8cdf35b456e78ac478b982fadebfd00000000000000000000000028b04b536b964cb2d5bc9a9b3ed311aeb0582b80000000000000000000000000" + }, + { + "name": "random-bytes20[4]", + "type": "bytes20[4]", + "value": [ + "0xd0e59a714ba95ea02bd7fbc1a88bf59b0bb2eb36", + "0xd4e1d23c41093f37603a1413cbe30c4a1ba70923", + "0x2f8f029cafbc86e62d9d0d9970ee096ebe5cbdee", + "0x208b46eb382f4a8ef8007f4353d962d2c9a5a293" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd0e59a714ba95ea02bd7fbc1a88bf59b0bb2eb36" + }, + { + "type": "hexstring", + "value": "0xd4e1d23c41093f37603a1413cbe30c4a1ba70923" + }, + { + "type": "hexstring", + "value": "0x2f8f029cafbc86e62d9d0d9970ee096ebe5cbdee" + }, + { + "type": "hexstring", + "value": "0x208b46eb382f4a8ef8007f4353d962d2c9a5a293" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610168806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f2565b60405180910390f35b6100566100d4565b61005e6100d4565b736872cd38a5d4af5015ebfde0d445facd85d9759b60611b815273d4e1d23c41093f37603a1413cbe30c4a1ba7092360601b60208201527317c7814e57de437316ce86ccb87704b75f2e5ef760611b604082015273208b46eb382f4a8ef8007f4353d962d2c9a5a29360601b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b60048110156101295781516bffffffffffffffffffffffff19168352602092830192909101906001016100fb565b5050509291505056fea26469706673582212202135cc60c75774ad565863650b772df5bb4e0e5f76562c76be34c7e0d6053bc364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes20[4] memory) {\n bytes20[4] memory r;\n {\n bytes20 r_0 = bytes20(0xd0e59a714bA95ea02bD7FbC1A88BF59b0bB2eB36);\n r[0] = r_0;\n }\n {\n bytes20 r_1 = bytes20(0xd4E1D23C41093F37603a1413cBe30c4a1bA70923);\n r[1] = r_1;\n }\n {\n bytes20 r_2 = bytes20(0x2F8f029cafBc86E62D9D0d9970EE096ebe5cBDEE);\n r[2] = r_2;\n }\n {\n bytes20 r_3 = bytes20(0x208b46eb382F4a8EF8007F4353d962D2C9A5a293);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xd0e59a714ba95ea02bd7fbc1a88bf59b0bb2eb36000000000000000000000000d4e1d23c41093f37603a1413cbe30c4a1ba709230000000000000000000000002f8f029cafbc86e62d9d0d9970ee096ebe5cbdee000000000000000000000000208b46eb382f4a8ef8007f4353d962d2c9a5a293000000000000000000000000" + }, + { + "name": "random-bytes21[2]", + "type": "bytes21[2]", + "value": [ + "0x1a6307844c9a427b633acac7d1caadbfa5a4533195", + "0x7f61fbb0bcf64b8c605675906769e69e93e1f6f135" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1a6307844c9a427b633acac7d1caadbfa5a4533195" + }, + { + "type": "hexstring", + "value": "0x7f61fbb0bcf64b8c605675906769e69e93e1f6f135" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610122806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060af565b60405180910390f35b604d6091565b60536091565b741a6307844c9a427b633acac7d1caadbfa5a453319560581b8152747f61fbb0bcf64b8c605675906769e69e93e1f6f13560581b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e35781516affffffffffffffffffffff191683526020928301929091019060010160b8565b5050509291505056fea2646970667358221220703710cbe92f86707cd7a8fcc2e09ab68ab41c0ae096de0dea4ea9e808e554c964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes21[2] memory) {\n bytes21[2] memory r;\n {\n bytes21 r_0 = bytes21(0x1a6307844c9a427b633acac7d1caadbfa5a4533195);\n r[0] = r_0;\n }\n {\n bytes21 r_1 = bytes21(0x7f61fbb0bcf64b8c605675906769e69e93e1f6f135);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x1a6307844c9a427b633acac7d1caadbfa5a453319500000000000000000000007f61fbb0bcf64b8c605675906769e69e93e1f6f1350000000000000000000000" + }, + { + "name": "random-bytes22[]", + "type": "bytes22[]", + "value": [ + "0xad8f7003a7589b68e797eaa44003c751a60638c790af", + "0x1ed8334987dd34a7916821fcd50c77de17fd1f65333c" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xad8f7003a7589b68e797eaa44003c751a60638c790af" + }, + { + "type": "hexstring", + "value": "0x1ed8334987dd34a7916821fcd50c77de17fd1f65333c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610114565b60405180910390f35b604080516002808252606080830184529260009291906020830190803683375050815191925075ad8f7003a7589b68e797eaa44003c751a60638c790af60501b9182915083906000906100a3576100a3610165565b69ffffffffffffffffffff19909216602092830291909101909101525080517507b60cd261f74d29e45a087f35431df785ff47d94ccf60521b908190839060019081106100f2576100f2610165565b69ffffffffffffffffffff199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561015957835169ffffffffffffffffffff191683529284019291840191600101610130565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220057bb2347de60a7708a1d685b64bb94123ead0c7c7020c70a4f61cb264f6d6f564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes22[] memory) {\n bytes22[] memory r = new bytes22[](2);\n {\n bytes22 r_0 = bytes22(0xad8f7003a7589b68e797eaa44003c751a60638c790af);\n r[0] = r_0;\n }\n {\n bytes22 r_1 = bytes22(0x1ed8334987dd34a7916821fcd50c77de17fd1f65333c);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002ad8f7003a7589b68e797eaa44003c751a60638c790af000000000000000000001ed8334987dd34a7916821fcd50c77de17fd1f65333c00000000000000000000" + }, + { + "name": "random-bytes22[1]", + "type": "bytes22[1]", + "value": ["0x3848429eae753351930473c80965d3270264036313f1"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3848429eae753351930473c80965d3270264036313f1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610105806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906092565b60405180910390f35b604d6074565b60536074565b753848429eae753351930473c80965d3270264036313f160501b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c557815169ffffffffffffffffffff191683529183019190830190600101609d565b505050509291505056fea2646970667358221220d4363a02597bf393175df5de7cb9dc8973b157551ea2c2b439a5fddfbf68840864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes22[1] memory) {\n bytes22[1] memory r;\n {\n bytes22 r_0 = bytes22(0x3848429eae753351930473c80965d3270264036313f1);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x3848429eae753351930473c80965d3270264036313f100000000000000000000" + }, + { + "name": "random-bytes22[2]", + "type": "bytes22[2]", + "value": [ + "0x31ec681d2ab94ec4dd929f677f8f83c5c2d28fd0fab2", + "0xc7091eaa7992ce22ec3d2c9e7c6bd2bc34fad591bb96" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x31ec681d2ab94ec4dd929f677f8f83c5c2d28fd0fab2" + }, + { + "type": "hexstring", + "value": "0xc7091eaa7992ce22ec3d2c9e7c6bd2bc34fad591bb96" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610123806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b1565b60405180910390f35b604d6093565b60536093565b7518f6340e955ca7626ec94fb3bfc7c1e2e16947e87d5960511b81527563848f553cc96711761e964f3e35e95e1a7d6ac8ddcb60511b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e457815169ffffffffffffffffffff191683526020928301929091019060010160ba565b5050509291505056fea2646970667358221220bce9e73e91f473a7f3512790f261445901fdeeab4d66039df70725d6f6b6420764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes22[2] memory) {\n bytes22[2] memory r;\n {\n bytes22 r_0 = bytes22(0x31ec681d2ab94ec4dd929f677f8f83c5c2d28fd0fab2);\n r[0] = r_0;\n }\n {\n bytes22 r_1 = bytes22(0xc7091eaa7992ce22ec3d2c9e7c6bd2bc34fad591bb96);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x31ec681d2ab94ec4dd929f677f8f83c5c2d28fd0fab200000000000000000000c7091eaa7992ce22ec3d2c9e7c6bd2bc34fad591bb9600000000000000000000" + }, + { + "name": "random-bytes22[4]", + "type": "bytes22[4]", + "value": [ + "0xbdcb7f73310ba8c57fb00011195cdced33e2f95caf35", + "0xec2797222c90f5b1671ac44385d09d67c5da3e2032ec", + "0x1176650e45ebb8f26e0743c315d5ab2acdb4e720a694", + "0x0a507a61a0b23b53554fb8787e871cc028f46f4a83c1" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbdcb7f73310ba8c57fb00011195cdced33e2f95caf35" + }, + { + "type": "hexstring", + "value": "0xec2797222c90f5b1671ac44385d09d67c5da3e2032ec" + }, + { + "type": "hexstring", + "value": "0x1176650e45ebb8f26e0743c315d5ab2acdb4e720a694" + }, + { + "type": "hexstring", + "value": "0x0a507a61a0b23b53554fb8787e871cc028f46f4a83c1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061016e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fa565b60405180910390f35b6100566100dc565b61005e6100dc565b75bdcb7f73310ba8c57fb00011195cdced33e2f95caf3560501b8152753b09e5c88b243d6c59c6b110e1742759f1768f880cbb60521b602082015275045d9943917aee3c9b81d0f0c5756acab36d39c829a560521b6040820152750a507a61a0b23b53554fb8787e871cc028f46f4a83c160501b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561012f57815169ffffffffffffffffffff1916835260209283019290910190600101610103565b5050509291505056fea26469706673582212202d4a9ddd0036d9f43a78966c2c5263b24584f5109c006a7e75af3d1f763b1f7164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes22[4] memory) {\n bytes22[4] memory r;\n {\n bytes22 r_0 = bytes22(0xbdcb7f73310ba8c57fb00011195cdced33e2f95caf35);\n r[0] = r_0;\n }\n {\n bytes22 r_1 = bytes22(0xec2797222c90f5b1671ac44385d09d67c5da3e2032ec);\n r[1] = r_1;\n }\n {\n bytes22 r_2 = bytes22(0x1176650e45ebb8f26e0743c315d5ab2acdb4e720a694);\n r[2] = r_2;\n }\n {\n bytes22 r_3 = bytes22(0x0a507a61a0b23b53554fb8787e871cc028f46f4a83c1);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xbdcb7f73310ba8c57fb00011195cdced33e2f95caf3500000000000000000000ec2797222c90f5b1671ac44385d09d67c5da3e2032ec000000000000000000001176650e45ebb8f26e0743c315d5ab2acdb4e720a694000000000000000000000a507a61a0b23b53554fb8787e871cc028f46f4a83c100000000000000000000" + }, + { + "name": "random-bytes23[2]", + "type": "bytes23[2]", + "value": [ + "0x8201060db783330f8fb30e52d375b5553f9ebcc15a3af9", + "0xda12b8c0696f7360ff6cfdb260e7364b1a5bd1dbe7790a" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8201060db783330f8fb30e52d375b5553f9ebcc15a3af9" + }, + { + "type": "hexstring", + "value": "0xda12b8c0696f7360ff6cfdb260e7364b1a5bd1dbe7790a" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610130806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bf565b60405180910390f35b604d60a1565b605360a1565b7f8201060db783330f8fb30e52d375b5553f9ebcc15a3af900000000000000000081527fda12b8c0696f7360ff6cfdb260e7364b1a5bd1dbe7790a0000000000000000006020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560f157815168ffffffffffffffffff191683526020928301929091019060010160c8565b5050509291505056fea26469706673582212200a598f092bc893beb08a7c3e5dc498c85b831684c88f3a7b205eb0efc21b2e2864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes23[2] memory) {\n bytes23[2] memory r;\n {\n bytes23 r_0 = bytes23(0x8201060db783330f8fb30e52d375b5553f9ebcc15a3af9);\n r[0] = r_0;\n }\n {\n bytes23 r_1 = bytes23(0xda12b8c0696f7360ff6cfdb260e7364b1a5bd1dbe7790a);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x8201060db783330f8fb30e52d375b5553f9ebcc15a3af9000000000000000000da12b8c0696f7360ff6cfdb260e7364b1a5bd1dbe7790a000000000000000000" + }, + { + "name": "random-bytes23[3]", + "type": "bytes23[3]", + "value": [ + "0xeb871c79c892e87925bcb5e748487122eb03d631756f94", + "0xd212c036804dc83cba75df1aee09d100c2a9f9032a3564", + "0x3b3a505b1bd18e3407eed6f5c3bd35c2cc380a17263c07" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xeb871c79c892e87925bcb5e748487122eb03d631756f94" + }, + { + "type": "hexstring", + "value": "0xd212c036804dc83cba75df1aee09d100c2a9f9032a3564" + }, + { + "type": "hexstring", + "value": "0x3b3a505b1bd18e3407eed6f5c3bd35c2cc380a17263c07" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610163806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b6100566100d2565b61005e6100d2565b7feb871c79c892e87925bcb5e748487122eb03d631756f9400000000000000000081527fd212c036804dc83cba75df1aee09d100c2a9f9032a356400000000000000000060208201527f3b3a505b1bd18e3407eed6f5c3bd35c2cc380a17263c070000000000000000006040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561012457815168ffffffffffffffffff19168352602092830192909101906001016100f9565b5050509291505056fea2646970667358221220c058a141f67c3da88f6a76e6d0577c3f22df519d69c0af35377b3f07e05a5c8b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes23[3] memory) {\n bytes23[3] memory r;\n {\n bytes23 r_0 = bytes23(0xeb871c79c892e87925bcb5e748487122eb03d631756f94);\n r[0] = r_0;\n }\n {\n bytes23 r_1 = bytes23(0xd212c036804dc83cba75df1aee09d100c2a9f9032a3564);\n r[1] = r_1;\n }\n {\n bytes23 r_2 = bytes23(0x3b3a505b1bd18e3407eed6f5c3bd35c2cc380a17263c07);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xeb871c79c892e87925bcb5e748487122eb03d631756f94000000000000000000d212c036804dc83cba75df1aee09d100c2a9f9032a35640000000000000000003b3a505b1bd18e3407eed6f5c3bd35c2cc380a17263c07000000000000000000" + }, + { + "name": "random-bytes23[4]", + "type": "bytes23[4]", + "value": [ + "0x552c1e9efc149713334beab5119821c4e8513445fb2014", + "0xf544bfc5c637ddeee2dd289007fcd088c151a6f1afa8a5", + "0x97f51cb21574ab8c5b5748ec7f15468dba01bf1c1aea23", + "0x14cd66a24e83a2b8ba0230344e283dfdb9ffb5bee2795c" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x552c1e9efc149713334beab5119821c4e8513445fb2014" + }, + { + "type": "hexstring", + "value": "0xf544bfc5c637ddeee2dd289007fcd088c151a6f1afa8a5" + }, + { + "type": "hexstring", + "value": "0x97f51cb21574ab8c5b5748ec7f15468dba01bf1c1aea23" + }, + { + "type": "hexstring", + "value": "0x14cd66a24e83a2b8ba0230344e283dfdb9ffb5bee2795c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610189806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f552c1e9efc149713334beab5119821c4e8513445fb201400000000000000000081527ff544bfc5c637ddeee2dd289007fcd088c151a6f1afa8a500000000000000000060208201527f97f51cb21574ab8c5b5748ec7f15468dba01bf1c1aea2300000000000000000060408201527f14cd66a24e83a2b8ba0230344e283dfdb9ffb5bee2795c0000000000000000006060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561014a57815168ffffffffffffffffff191683526020928301929091019060010161011f565b5050509291505056fea26469706673582212200b5f2605758ff5c01d0e2efa881cda5e9bbfae165353264cd4e4254ac5184ef164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes23[4] memory) {\n bytes23[4] memory r;\n {\n bytes23 r_0 = bytes23(0x552c1e9efc149713334beab5119821c4e8513445fb2014);\n r[0] = r_0;\n }\n {\n bytes23 r_1 = bytes23(0xf544bfc5c637ddeee2dd289007fcd088c151a6f1afa8a5);\n r[1] = r_1;\n }\n {\n bytes23 r_2 = bytes23(0x97f51cb21574ab8c5b5748ec7f15468dba01bf1c1aea23);\n r[2] = r_2;\n }\n {\n bytes23 r_3 = bytes23(0x14cd66a24e83a2b8ba0230344e283dfdb9ffb5bee2795c);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x552c1e9efc149713334beab5119821c4e8513445fb2014000000000000000000f544bfc5c637ddeee2dd289007fcd088c151a6f1afa8a500000000000000000097f51cb21574ab8c5b5748ec7f15468dba01bf1c1aea2300000000000000000014cd66a24e83a2b8ba0230344e283dfdb9ffb5bee2795c000000000000000000" + }, + { + "name": "random-bytes24[1]", + "type": "bytes24[1]", + "value": ["0xcccb0d5262e9da79e5f448a674707179749757aba26c2d89"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xcccb0d5262e9da79e5f448a674707179749757aba26c2d89" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906099565b60405180910390f35b604d607b565b6053607b565b7fcccb0d5262e9da79e5f448a674707179749757aba26c2d8900000000000000008152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560ca57815167ffffffffffffffff19168352918301919083019060010160a4565b505050509291505056fea2646970667358221220f60919e9523bdc1d5db826e4165126c81926022ebd7ff779dacb58b89bf3b41564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes24[1] memory) {\n bytes24[1] memory r;\n {\n bytes24 r_0 = bytes24(0xcccb0d5262e9da79e5f448a674707179749757aba26c2d89);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xcccb0d5262e9da79e5f448a674707179749757aba26c2d890000000000000000" + }, + { + "name": "random-bytes24[2]", + "type": "bytes24[2]", + "value": [ + "0x9e79f08444008d2e8bca4e5ec85898a27daf94dd1085f21c", + "0x3af60ad43748642cf522720cdff5816cc9008127ed6221ca" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9e79f08444008d2e8bca4e5ec85898a27daf94dd1085f21c" + }, + { + "type": "hexstring", + "value": "0x3af60ad43748642cf522720cdff5816cc9008127ed6221ca" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061012f806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bf565b60405180910390f35b604d60a1565b605360a1565b7f9e79f08444008d2e8bca4e5ec85898a27daf94dd1085f21c000000000000000081527f3af60ad43748642cf522720cdff5816cc9008127ed6221ca00000000000000006020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560f057815167ffffffffffffffff191683526020928301929091019060010160c8565b5050509291505056fea264697066735822122072dcb8f6e27ad2d458776f3ec1966d3f576afd5288c225305f59ef357b4eb5e864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes24[2] memory) {\n bytes24[2] memory r;\n {\n bytes24 r_0 = bytes24(0x9e79f08444008d2e8bca4e5ec85898a27daf94dd1085f21c);\n r[0] = r_0;\n }\n {\n bytes24 r_1 = bytes24(0x3af60ad43748642cf522720cdff5816cc9008127ed6221ca);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x9e79f08444008d2e8bca4e5ec85898a27daf94dd1085f21c00000000000000003af60ad43748642cf522720cdff5816cc9008127ed6221ca0000000000000000" + }, + { + "name": "random-bytes24[3]", + "type": "bytes24[3]", + "value": [ + "0x7f9c7b4442af6efea86335bd032f9e70ed42660ef2bfe12e", + "0x5bad83b204492d0f1c31b115c620c224cf2989382d50e23d", + "0xbd8ed31b10fc2e9f55a639262c7fdf02139a029c66a7cbfa" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7f9c7b4442af6efea86335bd032f9e70ed42660ef2bfe12e" + }, + { + "type": "hexstring", + "value": "0x5bad83b204492d0f1c31b115c620c224cf2989382d50e23d" + }, + { + "type": "hexstring", + "value": "0xbd8ed31b10fc2e9f55a639262c7fdf02139a029c66a7cbfa" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610162806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b6100566100d2565b61005e6100d2565b7f7f9c7b4442af6efea86335bd032f9e70ed42660ef2bfe12e000000000000000081527f5bad83b204492d0f1c31b115c620c224cf2989382d50e23d000000000000000060208201527fbd8ed31b10fc2e9f55a639262c7fdf02139a029c66a7cbfa00000000000000006040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561012357815167ffffffffffffffff19168352602092830192909101906001016100f9565b5050509291505056fea26469706673582212201c5decc127cdbc01245ee7c341a362de100bc3f2e23252c8ec24e2466e14717564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes24[3] memory) {\n bytes24[3] memory r;\n {\n bytes24 r_0 = bytes24(0x7f9c7b4442af6efea86335bd032f9e70ed42660ef2bfe12e);\n r[0] = r_0;\n }\n {\n bytes24 r_1 = bytes24(0x5bad83b204492d0f1c31b115c620c224cf2989382d50e23d);\n r[1] = r_1;\n }\n {\n bytes24 r_2 = bytes24(0xbd8ed31b10fc2e9f55a639262c7fdf02139a029c66a7cbfa);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x7f9c7b4442af6efea86335bd032f9e70ed42660ef2bfe12e00000000000000005bad83b204492d0f1c31b115c620c224cf2989382d50e23d0000000000000000bd8ed31b10fc2e9f55a639262c7fdf02139a029c66a7cbfa0000000000000000" + }, + { + "name": "random-bytes25[4]", + "type": "bytes25[4]", + "value": [ + "0x58787b9e89bdcb1ef006da94039802c5c2da6d7d45c5947f2b", + "0xdcae2d2ce8536d7713db936971c12b587cd55dee28d7e2ec64", + "0x6b49ca586e2737b408356ec1f1eaef74b3cd7509ddaa1f9de3", + "0x0678ada39c9100dbe2c13940ee3f9259ef6b63e2aa6ce72001" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x58787b9e89bdcb1ef006da94039802c5c2da6d7d45c5947f2b" + }, + { + "type": "hexstring", + "value": "0xdcae2d2ce8536d7713db936971c12b587cd55dee28d7e2ec64" + }, + { + "type": "hexstring", + "value": "0x6b49ca586e2737b408356ec1f1eaef74b3cd7509ddaa1f9de3" + }, + { + "type": "hexstring", + "value": "0x0678ada39c9100dbe2c13940ee3f9259ef6b63e2aa6ce72001" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610187806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f58787b9e89bdcb1ef006da94039802c5c2da6d7d45c5947f2b0000000000000081527fdcae2d2ce8536d7713db936971c12b587cd55dee28d7e2ec640000000000000060208201527f6b49ca586e2737b408356ec1f1eaef74b3cd7509ddaa1f9de30000000000000060408201527f0678ada39c9100dbe2c13940ee3f9259ef6b63e2aa6ce72001000000000000006060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561014857815166ffffffffffffff191683526020928301929091019060010161011f565b5050509291505056fea264697066735822122013b54bfc1b9af9a0e9eaecca5795502b0063a10b8f8b0e743bdf4406e1a3f90a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes25[4] memory) {\n bytes25[4] memory r;\n {\n bytes25 r_0 = bytes25(0x58787b9e89bdcb1ef006da94039802c5c2da6d7d45c5947f2b);\n r[0] = r_0;\n }\n {\n bytes25 r_1 = bytes25(0xdcae2d2ce8536d7713db936971c12b587cd55dee28d7e2ec64);\n r[1] = r_1;\n }\n {\n bytes25 r_2 = bytes25(0x6b49ca586e2737b408356ec1f1eaef74b3cd7509ddaa1f9de3);\n r[2] = r_2;\n }\n {\n bytes25 r_3 = bytes25(0x0678ada39c9100dbe2c13940ee3f9259ef6b63e2aa6ce72001);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x58787b9e89bdcb1ef006da94039802c5c2da6d7d45c5947f2b00000000000000dcae2d2ce8536d7713db936971c12b587cd55dee28d7e2ec64000000000000006b49ca586e2737b408356ec1f1eaef74b3cd7509ddaa1f9de3000000000000000678ada39c9100dbe2c13940ee3f9259ef6b63e2aa6ce7200100000000000000" + }, + { + "name": "random-bytes26[]", + "type": "bytes26[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ce8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b81811015608c57835165ffffffffffff1916835292840192918401916001016069565b5090969550505050505056fea264697066735822122093c20e81733a7f2eb1ff49c2d10070c240de7a91c6e316330e574a07ead6fb2464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes26[] memory) {\n bytes26[] memory r = new bytes26[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes26[1]", + "type": "bytes26[1]", + "value": ["0x926cc3a45d9c45ce891f3a7292b1678fd4021c77ed4404417acf"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x926cc3a45d9c45ce891f3a7292b1678fd4021c77ed4404417acf" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610108806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906099565b60405180910390f35b604d607b565b6053607b565b7f926cc3a45d9c45ce891f3a7292b1678fd4021c77ed4404417acf0000000000008152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c857815165ffffffffffff19168352918301919083019060010160a4565b505050509291505056fea2646970667358221220d7099b7b4c4abc985c2f72f8649f1ff46a1254835a9066a872b47297ceeb3ce664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes26[1] memory) {\n bytes26[1] memory r;\n {\n bytes26 r_0 = bytes26(0x926cc3a45d9c45ce891f3a7292b1678fd4021c77ed4404417acf);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x926cc3a45d9c45ce891f3a7292b1678fd4021c77ed4404417acf000000000000" + }, + { + "name": "random-bytes27[]", + "type": "bytes27[]", + "value": [ + "0x4a7c9a37ca4e03c0bd95fb2fe207e7bd650fab1c6cc1700bc7df01", + "0xe621d9b4269498f3978e52f32299e44b4ea51598d4a256c04da248" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4a7c9a37ca4e03c0bd95fb2fe207e7bd650fab1c6cc1700bc7df01" + }, + { + "type": "hexstring", + "value": "0xe621d9b4269498f3978e52f32299e44b4ea51598d4a256c04da248" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610118565b60405180910390f35b60408051600280825260608083018452926000929190602083019080368337505081519192507f4a7c9a37ca4e03c0bd95fb2fe207e7bd650fab1c6cc1700bc7df0100000000009182915083906000906100aa576100aa610164565b64ffffffffff19909216602092830291909101909101525080517fe621d9b4269498f3978e52f32299e44b4ea51598d4a256c04da2480000000000908190839060019081106100fb576100fb610164565b64ffffffffff199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561015857835164ffffffffff191683529284019291840191600101610134565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220c09a616294bb155b68ddbfda9478235573af9cf55ba472b8ab2c11073e1750ff64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes27[] memory) {\n bytes27[] memory r = new bytes27[](2);\n {\n bytes27 r_0 = bytes27(0x4a7c9a37ca4e03c0bd95fb2fe207e7bd650fab1c6cc1700bc7df01);\n r[0] = r_0;\n }\n {\n bytes27 r_1 = bytes27(0xe621d9b4269498f3978e52f32299e44b4ea51598d4a256c04da248);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000024a7c9a37ca4e03c0bd95fb2fe207e7bd650fab1c6cc1700bc7df010000000000e621d9b4269498f3978e52f32299e44b4ea51598d4a256c04da2480000000000" + }, + { + "name": "random-bytes27[4]", + "type": "bytes27[4]", + "value": [ + "0x1011be8273020bd5599e6fc3213e7dc1a5d8820f9ee636d93eb683", + "0x66d68de46efcfd41fd3032988edcb738cabea0de0c2c5676266603", + "0x9687268b9c4f37861bbe5085f29cf6c3e26ffd309af2734ce28128", + "0x5fffe4be18a0d41eb3bb3117951ccf549ea143120c2df9ca742d0a" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1011be8273020bd5599e6fc3213e7dc1a5d8820f9ee636d93eb683" + }, + { + "type": "hexstring", + "value": "0x66d68de46efcfd41fd3032988edcb738cabea0de0c2c5676266603" + }, + { + "type": "hexstring", + "value": "0x9687268b9c4f37861bbe5085f29cf6c3e26ffd309af2734ce28128" + }, + { + "type": "hexstring", + "value": "0x5fffe4be18a0d41eb3bb3117951ccf549ea143120c2df9ca742d0a" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610185806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f1011be8273020bd5599e6fc3213e7dc1a5d8820f9ee636d93eb683000000000081527f66d68de46efcfd41fd3032988edcb738cabea0de0c2c5676266603000000000060208201527f9687268b9c4f37861bbe5085f29cf6c3e26ffd309af2734ce28128000000000060408201527f5fffe4be18a0d41eb3bb3117951ccf549ea143120c2df9ca742d0a00000000006060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561014657815164ffffffffff191683526020928301929091019060010161011f565b5050509291505056fea26469706673582212206e15ca7505491340ed50475d1bbe85407a3ae5ba35ade38d53feb568c37f1b7064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes27[4] memory) {\n bytes27[4] memory r;\n {\n bytes27 r_0 = bytes27(0x1011be8273020bd5599e6fc3213e7dc1a5d8820f9ee636d93eb683);\n r[0] = r_0;\n }\n {\n bytes27 r_1 = bytes27(0x66d68de46efcfd41fd3032988edcb738cabea0de0c2c5676266603);\n r[1] = r_1;\n }\n {\n bytes27 r_2 = bytes27(0x9687268b9c4f37861bbe5085f29cf6c3e26ffd309af2734ce28128);\n r[2] = r_2;\n }\n {\n bytes27 r_3 = bytes27(0x5fffe4be18a0d41eb3bb3117951ccf549ea143120c2df9ca742d0a);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x1011be8273020bd5599e6fc3213e7dc1a5d8820f9ee636d93eb683000000000066d68de46efcfd41fd3032988edcb738cabea0de0c2c567626660300000000009687268b9c4f37861bbe5085f29cf6c3e26ffd309af2734ce2812800000000005fffe4be18a0d41eb3bb3117951ccf549ea143120c2df9ca742d0a0000000000" + }, + { + "name": "random-bytes28[2]", + "type": "bytes28[2]", + "value": [ + "0x52c9f5f1408d40df90886dedad3dbd6454291e64dbbdaa1fd0946bcf", + "0xf72f5a3e4d3c47e0e3002fb18c1c4a7ec6adafa8924aed536904712f" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x52c9f5f1408d40df90886dedad3dbd6454291e64dbbdaa1fd0946bcf" + }, + { + "type": "hexstring", + "value": "0xf72f5a3e4d3c47e0e3002fb18c1c4a7ec6adafa8924aed536904712f" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061012b806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bf565b60405180910390f35b604d60a1565b605360a1565b7f52c9f5f1408d40df90886dedad3dbd6454291e64dbbdaa1fd0946bcf0000000081527ff72f5a3e4d3c47e0e3002fb18c1c4a7ec6adafa8924aed536904712f000000006020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560ec57815163ffffffff191683526020928301929091019060010160c8565b5050509291505056fea2646970667358221220e5d5193f7baa162f1b9e5317c7245a1f174561d26a88c8df3fa72673277cf56864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes28[2] memory) {\n bytes28[2] memory r;\n {\n bytes28 r_0 = bytes28(0x52c9f5f1408d40df90886dedad3dbd6454291e64dbbdaa1fd0946bcf);\n r[0] = r_0;\n }\n {\n bytes28 r_1 = bytes28(0xf72f5a3e4d3c47e0e3002fb18c1c4a7ec6adafa8924aed536904712f);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x52c9f5f1408d40df90886dedad3dbd6454291e64dbbdaa1fd0946bcf00000000f72f5a3e4d3c47e0e3002fb18c1c4a7ec6adafa8924aed536904712f00000000" + }, + { + "name": "random-bytes28[4]", + "type": "bytes28[4]", + "value": [ + "0xa7adf746d1efe634e4bb15f75ef2f414bff0c2f4ef3291797fd73acc", + "0xa52ce328030bc96360bd727324f0a6ec4b18226c4d487e5b7e69ecd9", + "0x2fd6787d8c6cdfe23eecaf955890b4c6063530a035e410b61e152c46", + "0x6b6212fcc346454abf7f88cd7869021b4df18406204e866fb8d26b8c" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa7adf746d1efe634e4bb15f75ef2f414bff0c2f4ef3291797fd73acc" + }, + { + "type": "hexstring", + "value": "0xa52ce328030bc96360bd727324f0a6ec4b18226c4d487e5b7e69ecd9" + }, + { + "type": "hexstring", + "value": "0x2fd6787d8c6cdfe23eecaf955890b4c6063530a035e410b61e152c46" + }, + { + "type": "hexstring", + "value": "0x6b6212fcc346454abf7f88cd7869021b4df18406204e866fb8d26b8c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610184806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7fa7adf746d1efe634e4bb15f75ef2f414bff0c2f4ef3291797fd73acc0000000081527fa52ce328030bc96360bd727324f0a6ec4b18226c4d487e5b7e69ecd90000000060208201527f2fd6787d8c6cdfe23eecaf955890b4c6063530a035e410b61e152c460000000060408201527f6b6212fcc346454abf7f88cd7869021b4df18406204e866fb8d26b8c000000006060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561014557815163ffffffff191683526020928301929091019060010161011f565b5050509291505056fea2646970667358221220623174316a2b0496013203c17c29000cb80885233bc63381d5274728d8b508bb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes28[4] memory) {\n bytes28[4] memory r;\n {\n bytes28 r_0 = bytes28(0xa7adf746d1efe634e4bb15f75ef2f414bff0c2f4ef3291797fd73acc);\n r[0] = r_0;\n }\n {\n bytes28 r_1 = bytes28(0xa52ce328030bc96360bd727324f0a6ec4b18226c4d487e5b7e69ecd9);\n r[1] = r_1;\n }\n {\n bytes28 r_2 = bytes28(0x2fd6787d8c6cdfe23eecaf955890b4c6063530a035e410b61e152c46);\n r[2] = r_2;\n }\n {\n bytes28 r_3 = bytes28(0x6b6212fcc346454abf7f88cd7869021b4df18406204e866fb8d26b8c);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xa7adf746d1efe634e4bb15f75ef2f414bff0c2f4ef3291797fd73acc00000000a52ce328030bc96360bd727324f0a6ec4b18226c4d487e5b7e69ecd9000000002fd6787d8c6cdfe23eecaf955890b4c6063530a035e410b61e152c46000000006b6212fcc346454abf7f88cd7869021b4df18406204e866fb8d26b8c00000000" + }, + { + "name": "random-bytes29[]", + "type": "bytes29[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060cb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b81811015608957835162ffffff1916835292840192918401916001016069565b5090969550505050505056fea264697066735822122009117a5ed8ccd913d35a024d1c42ebd05270f044d3ef144ed81b1478a1eef8dd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes29[] memory) {\n bytes29[] memory r = new bytes29[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes29[1]", + "type": "bytes29[1]", + "value": ["0x19f980af68a48902edea0d05f6d757457337f696c00b8aa7ecda8bb337"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x19f980af68a48902edea0d05f6d757457337f696c00b8aa7ecda8bb337" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610105806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906099565b60405180910390f35b604d607b565b6053607b565b7f19f980af68a48902edea0d05f6d757457337f696c00b8aa7ecda8bb3370000008152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c557815162ffffff19168352918301919083019060010160a4565b505050509291505056fea2646970667358221220ff574e653baea57b36ec3ad3c2fcbe800bc923a331ab15988185316b04276b6664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes29[1] memory) {\n bytes29[1] memory r;\n {\n bytes29 r_0 = bytes29(0x19f980af68a48902edea0d05f6d757457337f696c00b8aa7ecda8bb337);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x19f980af68a48902edea0d05f6d757457337f696c00b8aa7ecda8bb337000000" + }, + { + "name": "random-bytes29[3]", + "type": "bytes29[3]", + "value": [ + "0xca61a603528e4eae598fff58fd4a89a366c460e8a673af41c5df2ba4e4", + "0x0e178446feb2b32728219df16003cc5ca131b3f21c7191b12107124335", + "0xc495780afc2593a389119ecf9b6f62f168aaa1fa186664ddbc9a34e7a3" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xca61a603528e4eae598fff58fd4a89a366c460e8a673af41c5df2ba4e4" + }, + { + "type": "hexstring", + "value": "0x0e178446feb2b32728219df16003cc5ca131b3f21c7191b12107124335" + }, + { + "type": "hexstring", + "value": "0xc495780afc2593a389119ecf9b6f62f168aaa1fa186664ddbc9a34e7a3" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b6100566100d2565b61005e6100d2565b7fca61a603528e4eae598fff58fd4a89a366c460e8a673af41c5df2ba4e400000081527f0e178446feb2b32728219df16003cc5ca131b3f21c7191b1210712433500000060208201527fc495780afc2593a389119ecf9b6f62f168aaa1fa186664ddbc9a34e7a30000006040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561011e57815162ffffff19168352602092830192909101906001016100f9565b5050509291505056fea264697066735822122081ef8d8f03da48906fc01abbee46732ff86265c5f5a78caae93412dee8702eb564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes29[3] memory) {\n bytes29[3] memory r;\n {\n bytes29 r_0 = bytes29(0xca61a603528e4eae598fff58fd4a89a366c460e8a673af41c5df2ba4e4);\n r[0] = r_0;\n }\n {\n bytes29 r_1 = bytes29(0x0e178446feb2b32728219df16003cc5ca131b3f21c7191b12107124335);\n r[1] = r_1;\n }\n {\n bytes29 r_2 = bytes29(0xc495780afc2593a389119ecf9b6f62f168aaa1fa186664ddbc9a34e7a3);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xca61a603528e4eae598fff58fd4a89a366c460e8a673af41c5df2ba4e40000000e178446feb2b32728219df16003cc5ca131b3f21c7191b12107124335000000c495780afc2593a389119ecf9b6f62f168aaa1fa186664ddbc9a34e7a3000000" + }, + { + "name": "random-bytes3[1]", + "type": "bytes3[1]", + "value": ["0xb8582c"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb8582c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ef8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607f565b60405180910390f35b604d6061565b60536061565b622e160b60ea1b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560af5781516001600160e81b03191683529183019190830190600101608a565b505050509291505056fea26469706673582212205a775d4cc36988a5bbcdc180fbc95647d99f180a6741a50e870665f8d2bf483864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes3[1] memory) {\n bytes3[1] memory r;\n {\n bytes3 r_0 = bytes3(0xb8582c);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xb8582c0000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes3[2]", + "type": "bytes3[2]", + "value": ["0x3a99c3", "0x1f9a9c"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3a99c3" + }, + { + "type": "hexstring", + "value": "0x1f9a9c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fa8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608b565b60405180910390f35b604d606d565b6053606d565b623a99c360e81b81526207e6a760ea1b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560bb5781516001600160e81b0319168352602092830192909101906001016094565b5050509291505056fea2646970667358221220d25959faf7f00602aef1f8b6c96ed5d5c884041af51e76a27b163b4b79801a6964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes3[2] memory) {\n bytes3[2] memory r;\n {\n bytes3 r_0 = bytes3(0x3a99c3);\n r[0] = r_0;\n }\n {\n bytes3 r_1 = bytes3(0x1f9a9c);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x3a99c300000000000000000000000000000000000000000000000000000000001f9a9c0000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes3[3]", + "type": "bytes3[3]", + "value": ["0x706c56", "0xe9ac9f", "0xa0b278"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x706c56" + }, + { + "type": "hexstring", + "value": "0xe9ac9f" + }, + { + "type": "hexstring", + "value": "0xa0b278" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610106806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906097565b60405180910390f35b604d6079565b60536079565b6238362b60e91b815262e9ac9f60e81b60208201526214164f60eb1b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560c75781516001600160e81b03191683526020928301929091019060010160a0565b5050509291505056fea2646970667358221220feffb806aff5ac36471707e074109c8e00ec17f5dacb894651bb29cdc1a32f1c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes3[3] memory) {\n bytes3[3] memory r;\n {\n bytes3 r_0 = bytes3(0x706c56);\n r[0] = r_0;\n }\n {\n bytes3 r_1 = bytes3(0xe9ac9f);\n r[1] = r_1;\n }\n {\n bytes3 r_2 = bytes3(0xa0b278);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x706c560000000000000000000000000000000000000000000000000000000000e9ac9f0000000000000000000000000000000000000000000000000000000000a0b2780000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes30[3]", + "type": "bytes30[3]", + "value": [ + "0x8995dcc51d8c0b37fc11787c7028ed34559accf9791af16e7aeec9ab384e", + "0xae42caec92c2deb098809da2e29f0485c2614fa67e6bf1ac9d50cd1294b6", + "0x0f275ec4c206c47c3098d4cdda78a79f74514f8fcad3aef111afd13bb886" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8995dcc51d8c0b37fc11787c7028ed34559accf9791af16e7aeec9ab384e" + }, + { + "type": "hexstring", + "value": "0xae42caec92c2deb098809da2e29f0485c2614fa67e6bf1ac9d50cd1294b6" + }, + { + "type": "hexstring", + "value": "0x0f275ec4c206c47c3098d4cdda78a79f74514f8fcad3aef111afd13bb886" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b6100566100d2565b61005e6100d2565b7f8995dcc51d8c0b37fc11787c7028ed34559accf9791af16e7aeec9ab384e000081527fae42caec92c2deb098809da2e29f0485c2614fa67e6bf1ac9d50cd1294b6000060208201527f0f275ec4c206c47c3098d4cdda78a79f74514f8fcad3aef111afd13bb88600006040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561011d57815161ffff19168352602092830192909101906001016100f9565b5050509291505056fea2646970667358221220f582cd7c36c82453f1fd205ce65095124b2090894db32c79a1eafacf94cff72f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes30[3] memory) {\n bytes30[3] memory r;\n {\n bytes30 r_0 = bytes30(0x8995dcc51d8c0b37fc11787c7028ed34559accf9791af16e7aeec9ab384e);\n r[0] = r_0;\n }\n {\n bytes30 r_1 = bytes30(0xae42caec92c2deb098809da2e29f0485c2614fa67e6bf1ac9d50cd1294b6);\n r[1] = r_1;\n }\n {\n bytes30 r_2 = bytes30(0x0f275ec4c206c47c3098d4cdda78a79f74514f8fcad3aef111afd13bb886);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x8995dcc51d8c0b37fc11787c7028ed34559accf9791af16e7aeec9ab384e0000ae42caec92c2deb098809da2e29f0485c2614fa67e6bf1ac9d50cd1294b600000f275ec4c206c47c3098d4cdda78a79f74514f8fcad3aef111afd13bb8860000" + }, + { + "name": "random-bytes30[4]", + "type": "bytes30[4]", + "value": [ + "0x8a2492af4b1cfd6b6322c21ecaba15e76c656e3fc5d69ed353a0eb9ae49a", + "0x9c4ef0ed9f0b74bb9751c84f54254fadc15051904a3aaf01a63695b229c6", + "0xf717e0e79daf5a18eeea785f936e9d0b2f867e5adbf00c319da45f5db04d", + "0x42397d4b9439754f98bef9ea96a1f6b3d8517c9c272e7d7ba1dc6852c8ea" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8a2492af4b1cfd6b6322c21ecaba15e76c656e3fc5d69ed353a0eb9ae49a" + }, + { + "type": "hexstring", + "value": "0x9c4ef0ed9f0b74bb9751c84f54254fadc15051904a3aaf01a63695b229c6" + }, + { + "type": "hexstring", + "value": "0xf717e0e79daf5a18eeea785f936e9d0b2f867e5adbf00c319da45f5db04d" + }, + { + "type": "hexstring", + "value": "0x42397d4b9439754f98bef9ea96a1f6b3d8517c9c272e7d7ba1dc6852c8ea" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610182806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f8a2492af4b1cfd6b6322c21ecaba15e76c656e3fc5d69ed353a0eb9ae49a000081527f9c4ef0ed9f0b74bb9751c84f54254fadc15051904a3aaf01a63695b229c6000060208201527ff717e0e79daf5a18eeea785f936e9d0b2f867e5adbf00c319da45f5db04d000060408201527f42397d4b9439754f98bef9ea96a1f6b3d8517c9c272e7d7ba1dc6852c8ea00006060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561014357815161ffff191683526020928301929091019060010161011f565b5050509291505056fea264697066735822122060c8e190cfc13697ba675fafd472b9a2a58c678a5a8f729da7401093c01fddfa64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes30[4] memory) {\n bytes30[4] memory r;\n {\n bytes30 r_0 = bytes30(0x8a2492af4b1cfd6b6322c21ecaba15e76c656e3fc5d69ed353a0eb9ae49a);\n r[0] = r_0;\n }\n {\n bytes30 r_1 = bytes30(0x9c4ef0ed9f0b74bb9751c84f54254fadc15051904a3aaf01a63695b229c6);\n r[1] = r_1;\n }\n {\n bytes30 r_2 = bytes30(0xf717e0e79daf5a18eeea785f936e9d0b2f867e5adbf00c319da45f5db04d);\n r[2] = r_2;\n }\n {\n bytes30 r_3 = bytes30(0x42397d4b9439754f98bef9ea96a1f6b3d8517c9c272e7d7ba1dc6852c8ea);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x8a2492af4b1cfd6b6322c21ecaba15e76c656e3fc5d69ed353a0eb9ae49a00009c4ef0ed9f0b74bb9751c84f54254fadc15051904a3aaf01a63695b229c60000f717e0e79daf5a18eeea785f936e9d0b2f867e5adbf00c319da45f5db04d000042397d4b9439754f98bef9ea96a1f6b3d8517c9c272e7d7ba1dc6852c8ea0000" + }, + { + "name": "random-bytes31[]", + "type": "bytes31[]", + "value": [ + "0xb9cd340de138183f269b650f16a52d37baaa59cafd00438fab624d167fbf6d", + "0x9cb11d6a17d588c2363c50aeba4cef3870a9e51746c88f9e7acdeb02554f63" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb9cd340de138183f269b650f16a52d37baaa59cafd00438fab624d167fbf6d" + }, + { + "type": "hexstring", + "value": "0x9cb11d6a17d588c2363c50aeba4cef3870a9e51746c88f9e7acdeb02554f63" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610110565b60405180910390f35b60408051600280825260608083018452926000929190602083019080368337505081519192507fb9cd340de138183f269b650f16a52d37baaa59cafd00438fab624d167fbf6d009182915083906000906100aa576100aa610158565b60ff19909216602092830291909101909101525080517f9cb11d6a17d588c2363c50aeba4cef3870a9e51746c88f9e7acdeb02554f6300908190839060019081106100f7576100f7610158565b60ff199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561014c57835160ff19168352928401929184019160010161012c565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220027fb41fa11bd05c586225ce983200437176f1af66fec116ee2c785e5cdaf75664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes31[] memory) {\n bytes31[] memory r = new bytes31[](2);\n {\n bytes31 r_0 = bytes31(0xb9cd340de138183f269b650f16a52d37baaa59cafd00438fab624d167fbf6d);\n r[0] = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x9cb11d6a17d588c2363c50aeba4cef3870a9e51746c88f9e7acdeb02554f63);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002b9cd340de138183f269b650f16a52d37baaa59cafd00438fab624d167fbf6d009cb11d6a17d588c2363c50aeba4cef3870a9e51746c88f9e7acdeb02554f6300" + }, + { + "name": "random-bytes31[2]", + "type": "bytes31[2]", + "value": [ + "0xfe8258512ead80b83ac47f51f1e04cc1c9c0028fc5e577c72049fe315b86fb", + "0x5628e33c149bc31247560394ea19e4fab691985855ead4617e434e7ff69a79" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfe8258512ead80b83ac47f51f1e04cc1c9c0028fc5e577c72049fe315b86fb" + }, + { + "type": "hexstring", + "value": "0x5628e33c149bc31247560394ea19e4fab691985855ead4617e434e7ff69a79" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610128806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bf565b60405180910390f35b604d60a1565b605360a1565b7ffe8258512ead80b83ac47f51f1e04cc1c9c0028fc5e577c72049fe315b86fb0081527f5628e33c149bc31247560394ea19e4fab691985855ead4617e434e7ff69a79006020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e957815160ff191683526020928301929091019060010160c8565b5050509291505056fea26469706673582212206371e8a1711370357b76cfd8dcafc63ae886adeaa2e1a88c113eb7125d79795c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes31[2] memory) {\n bytes31[2] memory r;\n {\n bytes31 r_0 = bytes31(0xfe8258512ead80b83ac47f51f1e04cc1c9c0028fc5e577c72049fe315b86fb);\n r[0] = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x5628e33c149bc31247560394ea19e4fab691985855ead4617e434e7ff69a79);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xfe8258512ead80b83ac47f51f1e04cc1c9c0028fc5e577c72049fe315b86fb005628e33c149bc31247560394ea19e4fab691985855ead4617e434e7ff69a7900" + }, + { + "name": "random-bytes31[4]", + "type": "bytes31[4]", + "value": [ + "0x60b0632afb03a73a53e055b82fbcafb8c3f71c322ea374331e77919a8b10ef", + "0x89f496a946d175ee89be1f2e4b8b40c1205730a6d43b633036ebd968e385d7", + "0xd07f8b097df0689dbbd439db142296c4b5b9ce6e557694c594df159e52bd82", + "0x12302e711ab742131178245be4a6f7d61175cbbfcfc525b8f838ca99310c28" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x60b0632afb03a73a53e055b82fbcafb8c3f71c322ea374331e77919a8b10ef" + }, + { + "type": "hexstring", + "value": "0x89f496a946d175ee89be1f2e4b8b40c1205730a6d43b633036ebd968e385d7" + }, + { + "type": "hexstring", + "value": "0xd07f8b097df0689dbbd439db142296c4b5b9ce6e557694c594df159e52bd82" + }, + { + "type": "hexstring", + "value": "0x12302e711ab742131178245be4a6f7d61175cbbfcfc525b8f838ca99310c28" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610181806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f60b0632afb03a73a53e055b82fbcafb8c3f71c322ea374331e77919a8b10ef0081527f89f496a946d175ee89be1f2e4b8b40c1205730a6d43b633036ebd968e385d70060208201527fd07f8b097df0689dbbd439db142296c4b5b9ce6e557694c594df159e52bd820060408201527f12302e711ab742131178245be4a6f7d61175cbbfcfc525b8f838ca99310c28006060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561014257815160ff191683526020928301929091019060010161011f565b5050509291505056fea264697066735822122022ecc2f6099c1067f57b6608cedb6e41f34dc7269ff1785b8862237500aa0b1964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes31[4] memory) {\n bytes31[4] memory r;\n {\n bytes31 r_0 = bytes31(0x60b0632afb03a73a53e055b82fbcafb8c3f71c322ea374331e77919a8b10ef);\n r[0] = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x89f496a946d175ee89be1f2e4b8b40c1205730a6d43b633036ebd968e385d7);\n r[1] = r_1;\n }\n {\n bytes31 r_2 = bytes31(0xd07f8b097df0689dbbd439db142296c4b5b9ce6e557694c594df159e52bd82);\n r[2] = r_2;\n }\n {\n bytes31 r_3 = bytes31(0x12302e711ab742131178245be4a6f7d61175cbbfcfc525b8f838ca99310c28);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x60b0632afb03a73a53e055b82fbcafb8c3f71c322ea374331e77919a8b10ef0089f496a946d175ee89be1f2e4b8b40c1205730a6d43b633036ebd968e385d700d07f8b097df0689dbbd439db142296c4b5b9ce6e557694c594df159e52bd820012302e711ab742131178245be4a6f7d61175cbbfcfc525b8f838ca99310c2800" + }, + { + "name": "random-bytes32[]", + "type": "bytes32[]", + "value": [ + "0x23276f0d208b5c4f6752e0d7d1cfe56d056faa1931d02ff7a4dd49565750b3a2", + "0x4c8873cc325b290b887c48ce230a3344057920e399db2e4a67b2489eed6e409e", + "0xf899dca46d3f4907c2148afda021cae7a6f2ddc6943a13f3d751c3b6a7cbc6a3", + "0x9516131b237a1d1b59fb7dc2a38c93f10e518d98e4d96b80c8594f81e4ccfda0" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x23276f0d208b5c4f6752e0d7d1cfe56d056faa1931d02ff7a4dd49565750b3a2" + }, + { + "type": "hexstring", + "value": "0x4c8873cc325b290b887c48ce230a3344057920e399db2e4a67b2489eed6e409e" + }, + { + "type": "hexstring", + "value": "0xf899dca46d3f4907c2148afda021cae7a6f2ddc6943a13f3d751c3b6a7cbc6a3" + }, + { + "type": "hexstring", + "value": "0x9516131b237a1d1b59fb7dc2a38c93f10e518d98e4d96b80c8594f81e4ccfda0" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061021c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061018c565b60405180910390f35b60408051600480825260a082019092526060916000919060208201608080368337505081519192507f23276f0d208b5c4f6752e0d7d1cfe56d056faa1931d02ff7a4dd49565750b3a29182915083906000906100ac576100ac6101d0565b60209081029190910101525080517f4c8873cc325b290b887c48ce230a3344057920e399db2e4a67b2489eed6e409e908190839060019081106100f1576100f16101d0565b60209081029190910101525080517ff899dca46d3f4907c2148afda021cae7a6f2ddc6943a13f3d751c3b6a7cbc6a390819083906002908110610136576101366101d0565b60209081029190910101525080517f9516131b237a1d1b59fb7dc2a38c93f10e518d98e4d96b80c8594f81e4ccfda09081908390600390811061017b5761017b6101d0565b602090810291909101015250919050565b6020808252825182820181905260009190848201906040850190845b818110156101c4578351835292840192918401916001016101a8565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212204af74c5488149efa098c671e7d864e7b476f2758e1c816b0e87161d2f403d01c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes32[] memory) {\n bytes32[] memory r = new bytes32[](4);\n {\n bytes32 r_0 = bytes32(0x23276f0d208b5c4f6752e0d7d1cfe56d056faa1931d02ff7a4dd49565750b3a2);\n r[0] = r_0;\n }\n {\n bytes32 r_1 = bytes32(0x4c8873cc325b290b887c48ce230a3344057920e399db2e4a67b2489eed6e409e);\n r[1] = r_1;\n }\n {\n bytes32 r_2 = bytes32(0xf899dca46d3f4907c2148afda021cae7a6f2ddc6943a13f3d751c3b6a7cbc6a3);\n r[2] = r_2;\n }\n {\n bytes32 r_3 = bytes32(0x9516131b237a1d1b59fb7dc2a38c93f10e518d98e4d96b80c8594f81e4ccfda0);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000423276f0d208b5c4f6752e0d7d1cfe56d056faa1931d02ff7a4dd49565750b3a24c8873cc325b290b887c48ce230a3344057920e399db2e4a67b2489eed6e409ef899dca46d3f4907c2148afda021cae7a6f2ddc6943a13f3d751c3b6a7cbc6a39516131b237a1d1b59fb7dc2a38c93f10e518d98e4d96b80c8594f81e4ccfda0" + }, + { + "name": "random-bytes32[1]", + "type": "bytes32[1]", + "value": ["0x441a03f893e34c89f797c6e825b8247a74b540d1cc5790095479166c3499adec"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x441a03f893e34c89f797c6e825b8247a74b540d1cc5790095479166c3499adec" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ff8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906099565b60405180910390f35b604d607b565b6053607b565b7f441a03f893e34c89f797c6e825b8247a74b540d1cc5790095479166c3499adec8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560bf5781518352918301919083019060010160a4565b505050509291505056fea264697066735822122033b23f7b51cf284a9cd84557df2fcf7fd5183935bc9bd3bbe5c672ecf5903b5464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes32[1] memory) {\n bytes32[1] memory r;\n {\n bytes32 r_0 = bytes32(0x441a03f893e34c89f797c6e825b8247a74b540d1cc5790095479166c3499adec);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x441a03f893e34c89f797c6e825b8247a74b540d1cc5790095479166c3499adec" + }, + { + "name": "random-bytes32[2]", + "type": "bytes32[2]", + "value": [ + "0xa3f61daa628db80aeba911434d101ef132e82ca4df087338fceb09301c010ac9", + "0x9a19306ce1c7d4b9f066a2487a2f00fea10cea10d45ddfd1da9e9d4e719f22a2" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa3f61daa628db80aeba911434d101ef132e82ca4df087338fceb09301c010ac9" + }, + { + "type": "hexstring", + "value": "0x9a19306ce1c7d4b9f066a2487a2f00fea10cea10d45ddfd1da9e9d4e719f22a2" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610124806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bf565b60405180910390f35b604d60a1565b605360a1565b7fa3f61daa628db80aeba911434d101ef132e82ca4df087338fceb09301c010ac981527f9a19306ce1c7d4b9f066a2487a2f00fea10cea10d45ddfd1da9e9d4e719f22a26020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e557815183526020928301929091019060010160c8565b5050509291505056fea26469706673582212201f69b56a454887f1840d7037f3417232a9a31040bad697f293a49b686f892ed864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes32[2] memory) {\n bytes32[2] memory r;\n {\n bytes32 r_0 = bytes32(0xa3f61daa628db80aeba911434d101ef132e82ca4df087338fceb09301c010ac9);\n r[0] = r_0;\n }\n {\n bytes32 r_1 = bytes32(0x9a19306ce1c7d4b9f066a2487a2f00fea10cea10d45ddfd1da9e9d4e719f22a2);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xa3f61daa628db80aeba911434d101ef132e82ca4df087338fceb09301c010ac99a19306ce1c7d4b9f066a2487a2f00fea10cea10d45ddfd1da9e9d4e719f22a2" + }, + { + "name": "random-bytes32[4]", + "type": "bytes32[4]", + "value": [ + "0x6e5f343c04175c12df1e9a61d390c470482e461796e4140d225e764446dd1628", + "0x83e008776c9fd05ee36693ac1b468bc120f983ad2ae77a9c34ba287dcf1bd8f6", + "0x331ff6b1dbe2f3805ba133bf663247f196fece8f952a0d1de7a654769f52b494", + "0x5cfa64863f5f43be8cb8538f389213bd158aa3d669efc45a9b1dc40af4d8ee33" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6e5f343c04175c12df1e9a61d390c470482e461796e4140d225e764446dd1628" + }, + { + "type": "hexstring", + "value": "0x83e008776c9fd05ee36693ac1b468bc120f983ad2ae77a9c34ba287dcf1bd8f6" + }, + { + "type": "hexstring", + "value": "0x331ff6b1dbe2f3805ba133bf663247f196fece8f952a0d1de7a654769f52b494" + }, + { + "type": "hexstring", + "value": "0x5cfa64863f5f43be8cb8538f389213bd158aa3d669efc45a9b1dc40af4d8ee33" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f6e5f343c04175c12df1e9a61d390c470482e461796e4140d225e764446dd162881527f83e008776c9fd05ee36693ac1b468bc120f983ad2ae77a9c34ba287dcf1bd8f660208201527f331ff6b1dbe2f3805ba133bf663247f196fece8f952a0d1de7a654769f52b49460408201527f5cfa64863f5f43be8cb8538f389213bd158aa3d669efc45a9b1dc40af4d8ee336060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561013e57815183526020928301929091019060010161011f565b5050509291505056fea2646970667358221220a9b38e7efd6180499612af6207adedf4e8be0ea4ed5a60cbf7b97bda2e53b90d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes32[4] memory) {\n bytes32[4] memory r;\n {\n bytes32 r_0 = bytes32(0x6e5f343c04175c12df1e9a61d390c470482e461796e4140d225e764446dd1628);\n r[0] = r_0;\n }\n {\n bytes32 r_1 = bytes32(0x83e008776c9fd05ee36693ac1b468bc120f983ad2ae77a9c34ba287dcf1bd8f6);\n r[1] = r_1;\n }\n {\n bytes32 r_2 = bytes32(0x331ff6b1dbe2f3805ba133bf663247f196fece8f952a0d1de7a654769f52b494);\n r[2] = r_2;\n }\n {\n bytes32 r_3 = bytes32(0x5cfa64863f5f43be8cb8538f389213bd158aa3d669efc45a9b1dc40af4d8ee33);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x6e5f343c04175c12df1e9a61d390c470482e461796e4140d225e764446dd162883e008776c9fd05ee36693ac1b468bc120f983ad2ae77a9c34ba287dcf1bd8f6331ff6b1dbe2f3805ba133bf663247f196fece8f952a0d1de7a654769f52b4945cfa64863f5f43be8cb8538f389213bd158aa3d669efc45a9b1dc40af4d8ee33" + }, + { + "name": "random-bytes4[2]", + "type": "bytes4[2]", + "value": ["0x3ec394ca", "0x8d6f99e7"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3ec394ca" + }, + { + "type": "hexstring", + "value": "0x8d6f99e7" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608d565b60405180910390f35b604d606f565b6053606f565b631f61ca6560e11b8152638d6f99e760e01b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560bd5781516001600160e01b0319168352602092830192909101906001016096565b5050509291505056fea26469706673582212201c61f04256d485b509510c548e799532765eac2f647de139a3d78e220fe087be64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes4[2] memory) {\n bytes4[2] memory r;\n {\n bytes4 r_0 = bytes4(0x3ec394ca);\n r[0] = r_0;\n }\n {\n bytes4 r_1 = bytes4(0x8d6f99e7);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x3ec394ca000000000000000000000000000000000000000000000000000000008d6f99e700000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes4[4]", + "type": "bytes4[4]", + "value": ["0x4da36be5", "0x56f3b631", "0x521fae41", "0xf531a2cd"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4da36be5" + }, + { + "type": "hexstring", + "value": "0x56f3b631" + }, + { + "type": "hexstring", + "value": "0x521fae41" + }, + { + "type": "hexstring", + "value": "0xf531a2cd" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610116806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a7565b60405180910390f35b604d6089565b60536089565b634da36be560e01b81526356f3b63160e01b602082015263521fae4160e01b604082015263f531a2cd60e01b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560d75781516001600160e01b03191683526020928301929091019060010160b0565b5050509291505056fea2646970667358221220b5157ec26d57d1f95d7f55cca63ae1fc4a8e237dc3849d98ec3bec706a877f5a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes4[4] memory) {\n bytes4[4] memory r;\n {\n bytes4 r_0 = bytes4(0x4da36be5);\n r[0] = r_0;\n }\n {\n bytes4 r_1 = bytes4(0x56f3b631);\n r[1] = r_1;\n }\n {\n bytes4 r_2 = bytes4(0x521fae41);\n r[2] = r_2;\n }\n {\n bytes4 r_3 = bytes4(0xf531a2cd);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x4da36be50000000000000000000000000000000000000000000000000000000056f3b63100000000000000000000000000000000000000000000000000000000521fae4100000000000000000000000000000000000000000000000000000000f531a2cd00000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes5[3]", + "type": "bytes5[3]", + "value": ["0x57488bb56a", "0x5cfee4f57a", "0x0f8ad162fd"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x57488bb56a" + }, + { + "type": "hexstring", + "value": "0x5cfee4f57a" + }, + { + "type": "hexstring", + "value": "0x0f8ad162fd" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010c806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609d565b60405180910390f35b604d607f565b6053607f565b642ba445dab560d91b8152642e7f727abd60d91b6020820152640f8ad162fd60d81b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560cd5781516001600160d81b03191683526020928301929091019060010160a6565b5050509291505056fea2646970667358221220cd419492dc237170f250a857a183a462d6beddb33a96fce3b71479987c702bc964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes5[3] memory) {\n bytes5[3] memory r;\n {\n bytes5 r_0 = bytes5(0x57488bb56a);\n r[0] = r_0;\n }\n {\n bytes5 r_1 = bytes5(0x5cfee4f57a);\n r[1] = r_1;\n }\n {\n bytes5 r_2 = bytes5(0x0f8ad162fd);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x57488bb56a0000000000000000000000000000000000000000000000000000005cfee4f57a0000000000000000000000000000000000000000000000000000000f8ad162fd000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes6[]", + "type": "bytes6[]", + "value": ["0x7197b6cce7e5", "0xcbc9ad1b327b", "0x02d22903d0d9"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7197b6cce7e5" + }, + { + "type": "hexstring", + "value": "0xcbc9ad1b327b" + }, + { + "type": "hexstring", + "value": "0x02d22903d0d9" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012b565b60405180910390f35b604080516003808252608082019092526060916000919060208201848036833750508151919250657197b6cce7e560d01b91829150839060009061009457610094610179565b6001600160d01b03199092166020928302919091019091015250805165cbc9ad1b327b60d01b908190839060019081106100d0576100d0610179565b6001600160d01b0319909216602092830291909101909101525080516502d22903d0d960d01b9081908390600290811061010c5761010c610179565b6001600160d01b03199092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561016d5783516001600160d01b03191683529284019291840191600101610147565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ca309c0f11ddc39339b1042deb92be919b80e6f94746837c5c7878129fdda17564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes6[] memory) {\n bytes6[] memory r = new bytes6[](3);\n {\n bytes6 r_0 = bytes6(0x7197b6cce7e5);\n r[0] = r_0;\n }\n {\n bytes6 r_1 = bytes6(0xcbc9ad1b327b);\n r[1] = r_1;\n }\n {\n bytes6 r_2 = bytes6(0x02d22903d0d9);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000037197b6cce7e50000000000000000000000000000000000000000000000000000cbc9ad1b327b000000000000000000000000000000000000000000000000000002d22903d0d90000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes6[2]", + "type": "bytes6[2]", + "value": ["0x7274ede5329b", "0xdfc6308f61d2"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7274ede5329b" + }, + { + "type": "hexstring", + "value": "0xdfc6308f61d2" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610100806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906091565b60405180910390f35b604d6073565b60536073565b657274ede5329b60d01b8152656fe31847b0e960d11b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560c15781516001600160d01b031916835260209283019290910190600101609a565b5050509291505056fea26469706673582212209918f8667aa4b7ac9d1d71b19ba0508b18b2b464d0f63f31d1074090bbe53ef664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes6[2] memory) {\n bytes6[2] memory r;\n {\n bytes6 r_0 = bytes6(0x7274ede5329b);\n r[0] = r_0;\n }\n {\n bytes6 r_1 = bytes6(0xdfc6308f61d2);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x7274ede5329b0000000000000000000000000000000000000000000000000000dfc6308f61d20000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes7[]", + "type": "bytes7[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060cf8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b81811015608d5783516001600160c81b031916835292840192918401916001016069565b5090969550505050505056fea2646970667358221220e928ad707514d3c2ad03406d6a4691ed023a6674dc9cbdffab538148fa406ad464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes7[] memory) {\n bytes7[] memory r = new bytes7[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes7[1]", + "type": "bytes7[1]", + "value": ["0x9f0e628c453fbc"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9f0e628c453fbc" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f38061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906083565b60405180910390f35b604d6065565b60536065565b6627c398a3114fef60ca1b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560b35781516001600160c81b03191683529183019190830190600101608e565b505050509291505056fea26469706673582212206b3f537ba4c796ba5c44dfc7d3a942ce6b056db56e08678396924e678932d7a464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes7[1] memory) {\n bytes7[1] memory r;\n {\n bytes7 r_0 = bytes7(0x9f0e628c453fbc);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x9f0e628c453fbc00000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes7[2]", + "type": "bytes7[2]", + "value": ["0xd989692eb53cf3", "0xf6420dc6cf21ab"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd989692eb53cf3" + }, + { + "type": "hexstring", + "value": "0xf6420dc6cf21ab" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610102806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906093565b60405180910390f35b604d6075565b60536075565b66d989692eb53cf360c81b815266f6420dc6cf21ab60c81b6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560c35781516001600160c81b031916835260209283019290910190600101609c565b5050509291505056fea2646970667358221220b298587be6b1c4cc276733e861c23a2857966c64024fc09fbc42d5f42c26c1f764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes7[2] memory) {\n bytes7[2] memory r;\n {\n bytes7 r_0 = bytes7(0xd989692eb53cf3);\n r[0] = r_0;\n }\n {\n bytes7 r_1 = bytes7(0xf6420dc6cf21ab);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xd989692eb53cf300000000000000000000000000000000000000000000000000f6420dc6cf21ab00000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes7[3]", + "type": "bytes7[3]", + "value": ["0x666a6079467191", "0x067ffcebc2c14b", "0x91dc57ffc78208"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x666a6079467191" + }, + { + "type": "hexstring", + "value": "0x067ffcebc2c14b" + }, + { + "type": "hexstring", + "value": "0x91dc57ffc78208" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610112806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a3565b60405180910390f35b604d6085565b60536085565b66666a607946719160c81b815266067ffcebc2c14b60c81b602082015266123b8afff8f04160cb1b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560d35781516001600160c81b03191683526020928301929091019060010160ac565b5050509291505056fea2646970667358221220a2831c71e2abfd2f03131860fc10e87f4a4e73a98ef644daae27055c286ef89e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes7[3] memory) {\n bytes7[3] memory r;\n {\n bytes7 r_0 = bytes7(0x666a6079467191);\n r[0] = r_0;\n }\n {\n bytes7 r_1 = bytes7(0x067ffcebc2c14b);\n r[1] = r_1;\n }\n {\n bytes7 r_2 = bytes7(0x91dc57ffc78208);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x666a607946719100000000000000000000000000000000000000000000000000067ffcebc2c14b0000000000000000000000000000000000000000000000000091dc57ffc7820800000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes8[4]", + "type": "bytes8[4]", + "value": [ + "0x486e5adece6f656d", + "0xe39e5e7802489471", + "0x91633b477d608d30", + "0x7605b619d5b17a5a" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x486e5adece6f656d" + }, + { + "type": "hexstring", + "value": "0xe39e5e7802489471" + }, + { + "type": "hexstring", + "value": "0x91633b477d608d30" + }, + { + "type": "hexstring", + "value": "0x7605b619d5b17a5a" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610126806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b7565b60405180910390f35b604d6099565b60536099565b67486e5adece6f656d60c01b815267e39e5e780248947160c01b602082015267091633b477d608d360c41b6040820152673b02db0cead8bd2d60c11b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560e75781516001600160c01b03191683526020928301929091019060010160c0565b5050509291505056fea26469706673582212203b2d695afb612c69e3945ee81e38a80bbc31f8e445f413ae567a2685b939c0e164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes8[4] memory) {\n bytes8[4] memory r;\n {\n bytes8 r_0 = bytes8(0x486e5adece6f656d);\n r[0] = r_0;\n }\n {\n bytes8 r_1 = bytes8(0xe39e5e7802489471);\n r[1] = r_1;\n }\n {\n bytes8 r_2 = bytes8(0x91633b477d608d30);\n r[2] = r_2;\n }\n {\n bytes8 r_3 = bytes8(0x7605b619d5b17a5a);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x486e5adece6f656d000000000000000000000000000000000000000000000000e39e5e780248947100000000000000000000000000000000000000000000000091633b477d608d300000000000000000000000000000000000000000000000007605b619d5b17a5a000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes9[1]", + "type": "bytes9[1]", + "value": ["0xd182f9e84f4d89c32e"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd182f9e84f4d89c32e" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f58061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906085565b60405180910390f35b604d6067565b60536067565b6868c17cf427a6c4e19760b91b8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560b55781516001600160b81b031916835291830191908301906001016090565b505050509291505056fea264697066735822122067fc08f9f508eae4073f626ad544a777d36af7156fc4d962068e4cfa1ce8db0164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes9[1] memory) {\n bytes9[1] memory r;\n {\n bytes9 r_0 = bytes9(0xd182f9e84f4d89c32e);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xd182f9e84f4d89c32e0000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes9[3]", + "type": "bytes9[3]", + "value": ["0x8f6b37f2bae137fb84", "0xdd3b95290db4ece7f5", "0x9e2fc7acb87d7193ab"], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8f6b37f2bae137fb84" + }, + { + "type": "hexstring", + "value": "0xdd3b95290db4ece7f5" + }, + { + "type": "hexstring", + "value": "0x9e2fc7acb87d7193ab" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610118806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a9565b60405180910390f35b604d608b565b6053608b565b6823dacdfcaeb84dfee160ba1b815268dd3b95290db4ece7f560b81b6020820152689e2fc7acb87d7193ab60b81b6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560d95781516001600160b81b03191683526020928301929091019060010160b2565b5050509291505056fea2646970667358221220aae38e140bd9fa1987e637481ed5320d7274c8979c422ab1ddc2b1ebc038c8c864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes9[3] memory) {\n bytes9[3] memory r;\n {\n bytes9 r_0 = bytes9(0x8f6b37f2bae137fb84);\n r[0] = r_0;\n }\n {\n bytes9 r_1 = bytes9(0xdd3b95290db4ece7f5);\n r[1] = r_1;\n }\n {\n bytes9 r_2 = bytes9(0x9e2fc7acb87d7193ab);\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x8f6b37f2bae137fb840000000000000000000000000000000000000000000000dd3b95290db4ece7f500000000000000000000000000000000000000000000009e2fc7acb87d7193ab0000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes9[4]", + "type": "bytes9[4]", + "value": [ + "0x81e65ea2ccf00975f3", + "0xfb8e49508a720fd7bd", + "0xdf0b13ed9e2f315a36", + "0x7c3a21d5b1b4a71099" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x81e65ea2ccf00975f3" + }, + { + "type": "hexstring", + "value": "0xfb8e49508a720fd7bd" + }, + { + "type": "hexstring", + "value": "0xdf0b13ed9e2f315a36" + }, + { + "type": "hexstring", + "value": "0x7c3a21d5b1b4a71099" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061012a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bb565b60405180910390f35b604d609d565b6053609d565b6881e65ea2ccf00975f360b81b815268fb8e49508a720fd7bd60b81b6020820152686f8589f6cf1798ad1b60b91b6040820152687c3a21d5b1b4a7109960b81b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560eb5781516001600160b81b03191683526020928301929091019060010160c4565b5050509291505056fea2646970667358221220e4c694cc142b8a9fd19386596e52b938c263833f19a2338a209e79469715259664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes9[4] memory) {\n bytes9[4] memory r;\n {\n bytes9 r_0 = bytes9(0x81e65ea2ccf00975f3);\n r[0] = r_0;\n }\n {\n bytes9 r_1 = bytes9(0xfb8e49508a720fd7bd);\n r[1] = r_1;\n }\n {\n bytes9 r_2 = bytes9(0xdf0b13ed9e2f315a36);\n r[2] = r_2;\n }\n {\n bytes9 r_3 = bytes9(0x7c3a21d5b1b4a71099);\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x81e65ea2ccf00975f30000000000000000000000000000000000000000000000fb8e49508a720fd7bd0000000000000000000000000000000000000000000000df0b13ed9e2f315a3600000000000000000000000000000000000000000000007c3a21d5b1b4a710990000000000000000000000000000000000000000000000" + }, + { + "name": "random-int[3]", + "type": "int[3]", + "value": [ + "22144625395505013793541396894978047301879552760557550459710097639205924396256", + "49014605461735350270020130074585700878308928893996551478136032661948578830694", + "15439996497944648374711822534969745767433790445362253538804586678498669515301" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "22144625395505013793541396894978047301879552760557550459710097639205924396256" + }, + { + "type": "number", + "value": "49014605461735350270020130074585700878308928893996551478136032661948578830694" + }, + { + "type": "number", + "value": "15439996497944648374711822534969745767433790445362253538804586678498669515301" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610157806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b6100566100d2565b61005e6100d2565b7f30f569ef377da0d933b91d3518fe5e9e8ba10a184b91e2ce3f660ada3f7e5ce081527f6c5d48988598a477e664f50ae5279d0e85357f1f31c63ed8129099d28596996660208201527f2222ba73c48707167f1032c7f300b25c2a487b0b60956ab060d400a175de52256040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b60038110156101185781518352602092830192909101906001016100f9565b5050509291505056fea26469706673582212209fe5ab03cafe560813eda95175b2ad46f5abdead33811be7e4dfa84eadc8b0ea64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int256[3] memory) {\n int256[3] memory r;\n {\n int r_0 = 22144625395505013793541396894978047301879552760557550459710097639205924396256;\n r[0] = r_0;\n }\n {\n int r_1 = 49014605461735350270020130074585700878308928893996551478136032661948578830694;\n r[1] = r_1;\n }\n {\n int r_2 = 15439996497944648374711822534969745767433790445362253538804586678498669515301;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x30f569ef377da0d933b91d3518fe5e9e8ba10a184b91e2ce3f660ada3f7e5ce06c5d48988598a477e664f50ae5279d0e85357f1f31c63ed8129099d2859699662222ba73c48707167f1032c7f300b25c2a487b0b60956ab060d400a175de5225" + }, + { + "name": "random-int[4]", + "type": "int[4]", + "value": [ + "22115410909759580085104079082225199329279726707485709440101928788077317511080", + "36575820230254794295788427167637331362124264730907246248141762607092728898208", + "-16891896991555597872494739292669827698535305080530618674883531362911444584683", + "-2212994672247913932937484210823721111071782082375936284734565203577609838330" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "22115410909759580085104079082225199329279726707485709440101928788077317511080" + }, + { + "type": "number", + "value": "36575820230254794295788427167637331362124264730907246248141762607092728898208" + }, + { + "type": "number", + "value": "-16891896991555597872494739292669827698535305080530618674883531362911444584683" + }, + { + "type": "number", + "value": "-2212994672247913932937484210823721111071782082375936284734565203577609838330" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f30e4e105b6effbcc13886528530150475aa587575dadd60cb613978ab694d7a881527f50dd2e3da51dbcad87507fd2b61d65507240e019f64ce9f41a2c28ec4c60a2a060208201527fdaa7866dd249a5be44e3a8bd8e30482b0b1bc25e4593f3ce29af9453d75b371560408201527ffb1b7d4980aa182a5794646a34a55a24f246919b21a859ba5d66d129509121066060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561013e57815183526020928301929091019060010161011f565b5050509291505056fea26469706673582212204d846467a1f7f1052aae87300612bb7c9916fd62869aacdbd563a5180dc136d164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int256[4] memory) {\n int256[4] memory r;\n {\n int r_0 = 22115410909759580085104079082225199329279726707485709440101928788077317511080;\n r[0] = r_0;\n }\n {\n int r_1 = 36575820230254794295788427167637331362124264730907246248141762607092728898208;\n r[1] = r_1;\n }\n {\n int r_2 = -16891896991555597872494739292669827698535305080530618674883531362911444584683;\n r[2] = r_2;\n }\n {\n int r_3 = -2212994672247913932937484210823721111071782082375936284734565203577609838330;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x30e4e105b6effbcc13886528530150475aa587575dadd60cb613978ab694d7a850dd2e3da51dbcad87507fd2b61d65507240e019f64ce9f41a2c28ec4c60a2a0daa7866dd249a5be44e3a8bd8e30482b0b1bc25e4593f3ce29af9453d75b3715fb1b7d4980aa182a5794646a34a55a24f246919b21a859ba5d66d12950912106" + }, + { + "name": "random-int104[3]", + "type": "int104[3]", + "value": [ + "-4392404333541126996754862375651", + "1276343317130725175336123244656", + "329507068878279521281566513055" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-4392404333541126996754862375651" + }, + { + "type": "number", + "value": "1276343317130725175336123244656" + }, + { + "type": "number", + "value": "329507068878279521281566513055" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610115806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060ad565b60405180910390f35b604d608f565b6053608f565b6c37709fb50b006fced9d5a702e21981526c101c167267863d0e570968207060208201526c0428b1dbec5baa7cbb2567179f6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560d6578151600c0b83526020928301929091019060010160b6565b5050509291505056fea2646970667358221220a34ad056e18f420e5b87b67041c8b37d42fa71e0ad760f21762825c14e4761af64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int104[3] memory) {\n int104[3] memory r;\n {\n int104 r_0 = -4392404333541126996754862375651;\n r[0] = r_0;\n }\n {\n int104 r_1 = 1276343317130725175336123244656;\n r[1] = r_1;\n }\n {\n int104 r_2 = 329507068878279521281566513055;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffc88f604af4ff9031262a58fd1d00000000000000000000000000000000000000101c167267863d0e5709682070000000000000000000000000000000000000000428b1dbec5baa7cbb2567179f" + }, + { + "name": "random-int104[4]", + "type": "int104[4]", + "value": [ + "-1022390973953137416083317423317", + "-3863429289288940909077071701129", + "1004267059749980467718562858009", + "-7207195653516959481360323208786" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1022390973953137416083317423317" + }, + { + "type": "number", + "value": "-3863429289288940909077071701129" + }, + { + "type": "number", + "value": "1004267059749980467718562858009" + }, + { + "type": "number", + "value": "-7207195653516959481360323208786" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061012a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060c2565b60405180910390f35b604d60a4565b605360a4565b6c0ce785fdfa7a65f435dff37cd41981526c30c369ce5a8f55ff9650eca4881960208201526c0cacf63ddcd3f39521d821441960408201526c5af7b483f58f0192b5f15c6651196060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560eb578151600c0b83526020928301929091019060010160cb565b5050509291505056fea2646970667358221220771f31e6758853d057f135776f32c7c3409a4406e754726298d13b141943caa964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int104[4] memory) {\n int104[4] memory r;\n {\n int104 r_0 = -1022390973953137416083317423317;\n r[0] = r_0;\n }\n {\n int104 r_1 = -3863429289288940909077071701129;\n r[1] = r_1;\n }\n {\n int104 r_2 = 1004267059749980467718562858009;\n r[2] = r_2;\n }\n {\n int104 r_3 = -7207195653516959481360323208786;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xfffffffffffffffffffffffffffffffffffffff3187a0205859a0bca200c832bffffffffffffffffffffffffffffffffffffffcf3c9631a570aa0069af135b77000000000000000000000000000000000000000cacf63ddcd3f39521d8214419ffffffffffffffffffffffffffffffffffffffa5084b7c0a70fe6d4a0ea399ae" + }, + { + "name": "random-int112[2]", + "type": "int112[2]", + "value": ["-991505693955903070478668572230749", "-1255325926135171633312161897854142"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-991505693955903070478668572230749" + }, + { + "type": "number", + "value": "-1255325926135171633312161897854142" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610105806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609d565b60405180910390f35b604d607f565b6053607f565b6d30e28faf46b8e3bcce0af219845c1981526d3de470d488c08c350fa6260734bd196020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560c6578151600d0b83526020928301929091019060010160a6565b5050509291505056fea2646970667358221220ff3557c2319676541418c41d1b56f860c6e524f45ac8c45c79dc1304b286452b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int112[2] memory) {\n int112[2] memory r;\n {\n int112 r_0 = -991505693955903070478668572230749;\n r[0] = r_0;\n }\n {\n int112 r_1 = -1255325926135171633312161897854142;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffcf1d7050b9471c4331f50de67ba3ffffffffffffffffffffffffffffffffffffc21b8f2b773f73caf059d9f8cb42" + }, + { + "name": "random-int112[3]", + "type": "int112[3]", + "value": [ + "-515711449908318443167747691738998", + "-2280923904542902437331218990714964", + "1859805603342006369285760067480217" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-515711449908318443167747691738998" + }, + { + "type": "number", + "value": "-2280923904542902437331218990714964" + }, + { + "type": "number", + "value": "1859805603342006369285760067480217" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610119806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b1565b60405180910390f35b604d6093565b60536093565b6d196d3191092869a1f3e1f7cb77751981526d70754ea08bf0b53c4d5d563950531960208201526d5bb20c0233b5e1ae054d0e86aa996040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560da578151600d0b83526020928301929091019060010160ba565b5050509291505056fea26469706673582212202ec37558b703118d2fd6355ac70f17229b25bb41f3fcac8e073908ec259fb4f164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int112[3] memory) {\n int112[3] memory r;\n {\n int112 r_0 = -515711449908318443167747691738998;\n r[0] = r_0;\n }\n {\n int112 r_1 = -2280923904542902437331218990714964;\n r[1] = r_1;\n }\n {\n int112 r_2 = 1859805603342006369285760067480217;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffe692ce6ef6d7965e0c1e0834888affffffffffffffffffffffffffffffffffff8f8ab15f740f4ac3b2a2a9c6afac0000000000000000000000000000000000005bb20c0233b5e1ae054d0e86aa99" + }, + { + "name": "random-int120[]", + "type": "int120[]", + "value": ["499139571212881801404201224564574837", "-109537623894795105211341028131233854"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "499139571212881801404201224564574837" + }, + { + "type": "number", + "value": "-109537623894795105211341028131233854" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610185806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f2565b60405180910390f35b6040805160028082526060808301845292600092919060208301908036833701905050905060006e60217b1a8953bfec781042b8770a759050808260008151811061009b5761009b610139565b6020026020010190600e0b9081600e0b815250505060006e15189f2faee657bb9af868b51e603d19905080826001815181106100d9576100d9610139565b600e9290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561012d578351600e0b8352928401929184019160010161010e565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220075428fd27a27e4eae74f9a065a2b786145f106f8bc7478430875219800e4dc564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int120[] memory) {\n int120[] memory r = new int120[](2);\n {\n int120 r_0 = 499139571212881801404201224564574837;\n r[0] = r_0;\n }\n {\n int120 r_1 = -109537623894795105211341028131233854;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000060217b1a8953bfec781042b8770a75ffffffffffffffffffffffffffffffffffeae760d05119a8446507974ae19fc2" + }, + { + "name": "random-int120[1]", + "type": "int120[1]", + "value": ["71379271352118334705321841238096803"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "71379271352118334705321841238096803" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f18061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906088565b60405180910390f35b604d606a565b6053606a565b6e0dbf4510d8a24f66bc46dd018a3ba38152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560b1578151600e0b835291830191908301906001016093565b505050509291505056fea264697066735822122013a008b4e0a37056d300d91d96aa635a1776690680fc6163935e1349abb3756564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int120[1] memory) {\n int120[1] memory r;\n {\n int120 r_0 = 71379271352118334705321841238096803;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000dbf4510d8a24f66bc46dd018a3ba3" + }, + { + "name": "random-int128[]", + "type": "int128[]", + "value": ["76013687021938279277652178695822512301"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "76013687021938279277652178695822512301" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610149806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b6565b60405180910390f35b604080516001808252818301909252606091600091906020808301908036833701905050905060006f392fb41f40c5092edbe3c7adf82810ad9050808260008151811061009d5761009d6100fd565b600f9290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156100f1578351600f0b835292840192918401916001016100d2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212200f158d259934b30209a9f4708392adb106347c4bf4712042243faaa044cdd38b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int128[] memory) {\n int128[] memory r = new int128[](1);\n {\n int128 r_0 = 76013687021938279277652178695822512301;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000392fb41f40c5092edbe3c7adf82810ad" + }, + { + "name": "random-int128[3]", + "type": "int128[3]", + "value": [ + "-111052980438692015425520680371767947327", + "-36391923766136812611665103531350592661", + "-32019184073189540085954222397930863201" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-111052980438692015425520680371767947327" + }, + { + "type": "number", + "value": "-36391923766136812611665103531350592661" + }, + { + "type": "number", + "value": "-32019184073189540085954222397930863201" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610120806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b8565b60405180910390f35b604d609a565b6053609a565b6f538c06aad25ca94ece86e8242d23303e1981526f1b60d45ecc58226fa988f5206c2e8c941960208201526f1816aba884c5124c7c3fcc294c17fa60196040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560e1578151600f0b83526020928301929091019060010160c1565b5050509291505056fea26469706673582212207c94283a92addadf1d436447e63bc06e8e056f34c1a66ed7896dc6ad8a246c7364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int128[3] memory) {\n int128[3] memory r;\n {\n int128 r_0 = -111052980438692015425520680371767947327;\n r[0] = r_0;\n }\n {\n int128 r_1 = -36391923766136812611665103531350592661;\n r[1] = r_1;\n }\n {\n int128 r_2 = -32019184073189540085954222397930863201;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffac73f9552da356b1317917dbd2dccfc1ffffffffffffffffffffffffffffffffe49f2ba133a7dd9056770adf93d1736bffffffffffffffffffffffffffffffffe7e954577b3aedb383c033d6b3e8059f" + }, + { + "name": "random-int136[]", + "type": "int136[]", + "value": ["-37786573113935191847829374617629955040575"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-37786573113935191847829374617629955040575" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b8565b60405180910390f35b60408051600180825281830190925260609160009190602080830190803683370190505090506000706f0b7543fdbde6643ec8316b574145a53e199050808260008151811061009f5761009f6100ff565b60109290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156100f357835160100b835292840192918401916001016100d4565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212201fa41c46cd08de184e2c359a592976ebada3110cd1537655406dab8c6dba3dba64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int136[] memory) {\n int136[] memory r = new int136[](1);\n {\n int136 r_0 = -37786573113935191847829374617629955040575;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffff90f48abc0242199bc137ce94a8beba5ac1" + }, + { + "name": "random-int144[2]", + "type": "int144[2]", + "value": [ + "10228831767922725328325434942903101800226588", + "-9289461418414449821042561395993229474314428" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "10228831767922725328325434942903101800226588" + }, + { + "type": "number", + "value": "-9289461418414449821042561395993229474314428" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010c806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a4565b60405180910390f35b604d6086565b60536086565b71756bd5bbcb4f6b1b0ea74334daa951129f1c8152716aa346074ba16521a58cacfa5e4695aab8bb196020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560cd57815160110b83526020928301929091019060010160ad565b5050509291505056fea2646970667358221220ed3872ec08f05f330021f3e1afca0df614b13bb750ac9a20cc92538fac17cc0c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int144[2] memory) {\n int144[2] memory r;\n {\n int144 r_0 = 10228831767922725328325434942903101800226588;\n r[0] = r_0;\n }\n {\n int144 r_1 = -9289461418414449821042561395993229474314428;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000756bd5bbcb4f6b1b0ea74334daa951129f1cffffffffffffffffffffffffffff955cb9f8b45e9ade5a735305a1b96a554744" + }, + { + "name": "random-int152[4]", + "type": "int152[4]", + "value": [ + "-532535090558519196908268272401827423517831540", + "-1362488549081163538267883054245149263116906399", + "1906213382878233652600892318812750557158077901", + "244300831221418700930972831079965374758759844" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-532535090558519196908268272401827423517831540" + }, + { + "type": "number", + "value": "-1362488549081163538267883054245149263116906399" + }, + { + "type": "number", + "value": "1906213382878233652600892318812750557158077901" + }, + { + "type": "number", + "value": "244300831221418700930972831079965374758759844" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e4565b60405180910390f35b6100566100c6565b61005e6100c6565b7217e133f9f65caf370f57c18346ee3cfd8a7173198152723d1899fb34035a42e9c9ba3d866cd025002f9e19602082015272557a41a857b0290b3b503a84d971e1762075cd6040820152720af46f9e14cd5fac53dc574d70256713efada46060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561010f57815160120b8352602092830192909101906001016100ed565b5050509291505056fea2646970667358221220c1abe9ec885ab5ab8215eb305b0bd3b05da11f27794769c129954fedfa1d972b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int152[4] memory) {\n int152[4] memory r;\n {\n int152 r_0 = -532535090558519196908268272401827423517831540;\n r[0] = r_0;\n }\n {\n int152 r_1 = -1362488549081163538267883054245149263116906399;\n r[1] = r_1;\n }\n {\n int152 r_2 = 1906213382878233652600892318812750557158077901;\n r[2] = r_2;\n }\n {\n int152 r_3 = 244300831221418700930972831079965374758759844;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffe81ecc0609a350c8f0a83e7cb911c302758e8cffffffffffffffffffffffffffc2e76604cbfca5bd163645c279932fdaffd06100000000000000000000000000557a41a857b0290b3b503a84d971e1762075cd000000000000000000000000000af46f9e14cd5fac53dc574d70256713efada4" + }, + { + "name": "random-int160[1]", + "type": "int160[1]", + "value": ["-369495913871310093011061926405701053430107904573"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-369495913871310093011061926405701053430107904573" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608e565b60405180910390f35b604d6070565b60536070565b7340b8c51284e45048679c08be7c856db70b1a9a3c198152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560b757815160130b835291830191908301906001016099565b505050509291505056fea2646970667358221220ef07e7018ac142b5092b1cf48dad4cc2a0ec570ed81a9069533e77549394a62064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int160[1] memory) {\n int160[1] memory r;\n {\n int160 r_0 = -369495913871310093011061926405701053430107904573;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffbf473aed7b1bafb79863f741837a9248f4e565c3" + }, + { + "name": "random-int160[4]", + "type": "int160[4]", + "value": [ + "-595643760054306201255511195126915038349890371626", + "-635078449678107178911164267061727239219761697882", + "165975116388838444963924953270140526484484731738", + "628264277317637269731839202180811888575278321788" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-595643760054306201255511195126915038349890371626" + }, + { + "type": "number", + "value": "-635078449678107178911164267061727239219761697882" + }, + { + "type": "number", + "value": "165975116388838444963924953270140526484484731738" + }, + { + "type": "number", + "value": "628264277317637269731839202180811888575278321788" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610152806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e8565b60405180910390f35b6100566100ca565b61005e6100ca565b73685597079daf665dc829240c29e277eca72b4029198152736f3de710d060e4695948e52765d7e04cf054d459196020820152731d1294e53afa0ffb834a864e98eb4d3cf657335a6040820152736e0c5834069c683449f2ad8282737fdb4a39907c6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561011357815160130b8352602092830192909101906001016100f1565b5050509291505056fea2646970667358221220729e622b65b68d791a1f619884c31c3b59fdad78ac834af774fd797c26e7fc3a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int160[4] memory) {\n int160[4] memory r;\n {\n int160 r_0 = -595643760054306201255511195126915038349890371626;\n r[0] = r_0;\n }\n {\n int160 r_1 = -635078449678107178911164267061727239219761697882;\n r[1] = r_1;\n }\n {\n int160 r_2 = 165975116388838444963924953270140526484484731738;\n r[2] = r_2;\n }\n {\n int160 r_3 = 628264277317637269731839202180811888575278321788;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffff97aa68f8625099a237d6dbf3d61d881358d4bfd6ffffffffffffffffffffffff90c218ef2f9f1b96a6b71ad89a281fb30fab2ba60000000000000000000000001d1294e53afa0ffb834a864e98eb4d3cf657335a0000000000000000000000006e0c5834069c683449f2ad8282737fdb4a39907c" + }, + { + "name": "random-int176[3]", + "type": "int176[3]", + "value": [ + "-27072068939178901942223598355707164813761345429422083", + "-44851613884489251270184513472533272307604548137023684", + "6043042904751976500379190041169788286659779429570608" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-27072068939178901942223598355707164813761345429422083" + }, + { + "type": "number", + "value": "-44851613884489251270184513472533272307604548137023684" + }, + { + "type": "number", + "value": "6043042904751976500379190041169788286659779429570608" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610131806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060c9565b60405180910390f35b604d60ab565b605360ab565b75485b76142d9acadd5277954d9da5002bc224d933c0021981527577e0b8351516f92916ae05a364ce08fc34d70c6078c3196020820152751026d157c0bda356f43a1a92faa5327e1b43e4ba98306040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560f257815160150b83526020928301929091019060010160d2565b5050509291505056fea2646970667358221220ecec22c79630fe607da88f5d2d46207422547ecce7d987a013a825a76745c99b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int176[3] memory) {\n int176[3] memory r;\n {\n int176 r_0 = -27072068939178901942223598355707164813761345429422083;\n r[0] = r_0;\n }\n {\n int176 r_1 = -44851613884489251270184513472533272307604548137023684;\n r[1] = r_1;\n }\n {\n int176 r_2 = 6043042904751976500379190041169788286659779429570608;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffb7a489ebd2653522ad886ab2625affd43ddb26cc3ffdffffffffffffffffffff881f47caeae906d6e951fa5c9b31f703cb28f39f873c000000000000000000001026d157c0bda356f43a1a92faa5327e1b43e4ba9830" + }, + { + "name": "random-int184[]", + "type": "int184[]", + "value": [ + "4288908368240905706184088085997272968680665913128713874", + "-7224744918125311939051838438493611760563990947872037124", + "6289497421974135115545001492409769632399218313501892131" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "4288908368240905706184088085997272968680665913128713874" + }, + { + "type": "number", + "value": "-7224744918125311939051838438493611760563990947872037124" + }, + { + "type": "number", + "value": "6289497421974135115545001492409769632399218313501892131" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101db806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610148565b60405180910390f35b60408051600380825260808201909252606091600091906020820184803683370190505090506000762cc73e30c17781ad23825287d62c3ba39ac99b33e0fe92905080826000815181106100a4576100a461018f565b602002602001019060160b908160160b81525050506000764b6e0b12dd0a73ad4c4606148b3a2002426e322e32d90319905080826001815181106100ea576100ea61018f565b602002602001019060160b908160160b815250505060007641aa58c4d9312a170227975ebbe2644d489e703a9c5e239050808260028151811061012f5761012f61018f565b60169290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561018357835160160b83529284019291840191600101610164565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212207fe73207ba239c32dd39a833707616e6cbd25ce3988c9875afb848adf4b4860f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int184[] memory) {\n int184[] memory r = new int184[](3);\n {\n int184 r_0 = 4288908368240905706184088085997272968680665913128713874;\n r[0] = r_0;\n }\n {\n int184 r_1 = -7224744918125311939051838438493611760563990947872037124;\n r[1] = r_1;\n }\n {\n int184 r_2 = 6289497421974135115545001492409769632399218313501892131;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000002cc73e30c17781ad23825287d62c3ba39ac99b33e0fe92ffffffffffffffffffb491f4ed22f58c52b3b9f9eb74c5dffdbd91cdd1cd26fc00000000000000000041aa58c4d9312a170227975ebbe2644d489e703a9c5e23" + }, + { + "name": "random-int184[3]", + "type": "int184[3]", + "value": [ + "-1329367283968674148279988976824309169777592873932802198", + "-10829604536594459505086921907168525069291988896084773858", + "7037143502437275783398808310608205556502173056158645229" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1329367283968674148279988976824309169777592873932802198" + }, + { + "type": "number", + "value": "-10829604536594459505086921907168525069291988896084773858" + }, + { + "type": "number", + "value": "7037143502437275783398808310608205556502173056158645229" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060cc565b60405180910390f35b604d60ae565b605360ae565b760de11601b1910c5f9e58304e8dbd928a68905046c7c895198152767110fc1dcbff15ca60efce7efdfe54325a36782991cbe1196020820152764978a0f9e65be8443bbed1e31ca8021367ddd4076bbbed6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560f557815160160b83526020928301929091019060010160d5565b5050509291505056fea2646970667358221220fb2a27f4dcaadf65a2fcdbbabe34c6e6fc2cb1f13ee6d53525a68c3f2ac0359b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int184[3] memory) {\n int184[3] memory r;\n {\n int184 r_0 = -1329367283968674148279988976824309169777592873932802198;\n r[0] = r_0;\n }\n {\n int184 r_1 = -10829604536594459505086921907168525069291988896084773858;\n r[1] = r_1;\n }\n {\n int184 r_2 = 7037143502437275783398808310608205556502173056158645229;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xfffffffffffffffffff21ee9fe4e6ef3a061a7cfb172426d75976fafb938376affffffffffffffffff8eef03e23400ea359f1031810201abcda5c987d66e341e0000000000000000004978a0f9e65be8443bbed1e31ca8021367ddd4076bbbed" + }, + { + "name": "random-int192[1]", + "type": "int192[1]", + "value": ["2139755522748263143499509785067228362564976441816238653731"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "2139755522748263143499509785067228362564976441816238653731" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fa8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906091565b60405180910390f35b604d6073565b60536073565b775744170ca735fe8ce659da9805882b09e317fdb6834e01238152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560ba57815160170b83529183019190830190600101609c565b505050509291505056fea2646970667358221220cb982705624c64803b5050a58db1109965e0fc804d1c4141a6456a0cc573c24a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int192[1] memory) {\n int192[1] memory r;\n {\n int192 r_0 = 2139755522748263143499509785067228362564976441816238653731;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000005744170ca735fe8ce659da9805882b09e317fdb6834e0123" + }, + { + "name": "random-int192[3]", + "type": "int192[3]", + "value": [ + "1349893563972628379154175096768441987638528868230699849639", + "-294831557373083693818876973195304684204895676910348722128", + "-2457640737022538904291770024954844353798385341927146206132" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "1349893563972628379154175096768441987638528868230699849639" + }, + { + "type": "number", + "value": "-294831557373083693818876973195304684204895676910348722128" + }, + { + "type": "number", + "value": "-2457640737022538904291770024954844353798385341927146206132" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610144806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100da565b60405180910390f35b6100566100bc565b61005e6100bc565b77370d8be152998c28b7fca126a4bf6ea4d0aff75766f297a78152770c062f61c8acaf20dc3524edce02823a03e34100ea0adfcf19602082015277643af76e977973a2727b8557e293c77fc051f3ee0cf533b3196040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561010557815160170b8352602092830192909101906001016100e3565b5050509291505056fea26469706673582212200390cc300bf38cfa47e5f3141a09511bc67606fea8a2763e8eb13d3da12afce364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int192[3] memory) {\n int192[3] memory r;\n {\n int192 r_0 = 1349893563972628379154175096768441987638528868230699849639;\n r[0] = r_0;\n }\n {\n int192 r_1 = -294831557373083693818876973195304684204895676910348722128;\n r[1] = r_1;\n }\n {\n int192 r_2 = -2457640737022538904291770024954844353798385341927146206132;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000370d8be152998c28b7fca126a4bf6ea4d0aff75766f297a7fffffffffffffffff3f9d09e375350df23cadb1231fd7dc5fc1cbeff15f52030ffffffffffffffff9bc5089168868c5d8d847aa81d6c38803fae0c11f30acc4c" + }, + { + "name": "random-int200[4]", + "type": "int200[4]", + "value": [ + "720519778899839719257571589218860210909623500682669327361422", + "-538868171941289105062938874616627994841956081072026003765132", + "295892697730746539477248715216096675394288797910623567144313", + "-292141090040255933516891208708719174858529460288785299591997" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "720519778899839719257571589218860210909623500682669327361422" + }, + { + "type": "number", + "value": "-538868171941289105062938874616627994841956081072026003765132" + }, + { + "type": "number", + "value": "295892697730746539477248715216096675394288797910623567144313" + }, + { + "type": "number", + "value": "-292141090040255933516891208708719174858529460288785299591997" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610166806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fc565b60405180910390f35b6100566100de565b61005e6100de565b7872c9117df788443dfc7d563f196bd2a08f805dc13df6efa58e81527855d8be395b483cdfe047debcc7e8226cb6d6ef27c6ce3cf78b196020820152782f236fe877fdcd24adcccf3c529444bb2ee82dbc1b85fae5796040820152782e8a6f4bd3d49807ece249a7f74c045544cf56ebdb35c4d33c196060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561012757815160180b835260209283019290910190600101610105565b5050509291505056fea2646970667358221220a4fdcf2707e88c651c13397a8498deca3445bd10442fe590070d455720c288e464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int200[4] memory) {\n int200[4] memory r;\n {\n int200 r_0 = 720519778899839719257571589218860210909623500682669327361422;\n r[0] = r_0;\n }\n {\n int200 r_1 = -538868171941289105062938874616627994841956081072026003765132;\n r[1] = r_1;\n }\n {\n int200 r_2 = 295892697730746539477248715216096675394288797910623567144313;\n r[2] = r_2;\n }\n {\n int200 r_3 = -292141090040255933516891208708719174858529460288785299591997;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000072c9117df788443dfc7d563f196bd2a08f805dc13df6efa58effffffffffffffaa2741c6a4b7c3201fb821433817dd93492910d83931c30874000000000000002f236fe877fdcd24adcccf3c529444bb2ee82dbc1b85fae579ffffffffffffffd17590b42c2b67f8131db65808b3fbaabb30a91424ca3b2cc3" + }, + { + "name": "random-int208[]", + "type": "int208[]", + "value": [ + "-79117493776345339643394044646685661621667044493369933055218528", + "86286276878861317012860102046047436866239060145386197552584259" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-79117493776345339643394044646685661621667044493369933055218528" + }, + { + "type": "number", + "value": "86286276878861317012860102046047436866239060145386197552584259" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061019b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610108565b60405180910390f35b60408051600280825260608083018452926000929190602083019080368337019050509050600079313c24d9045ad09204f55d8bfa7dda5ec228a1ef8b3eb7ad535f19905080826000815181106100a7576100a761014f565b602002602001019060190b908160190b815250505060007935b2326cdf108faa1b64063adad9266f905c15ce0593892dd643905080826001815181106100ef576100ef61014f565b60199290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561014357835160190b83529284019291840191600101610124565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220b39d2de21701188d3a3e19a7e1d946bec8d6c05fc52b8b642803db3339dc00e464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int208[] memory) {\n int208[] memory r = new int208[](2);\n {\n int208 r_0 = -79117493776345339643394044646685661621667044493369933055218528;\n r[0] = r_0;\n }\n {\n int208 r_1 = 86286276878861317012860102046047436866239060145386197552584259;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002ffffffffffffcec3db26fba52f6dfb0aa274058225a13dd75e1074c14852aca000000000000035b2326cdf108faa1b64063adad9266f905c15ce0593892dd643" + }, + { + "name": "random-int208[3]", + "type": "int208[3]", + "value": [ + "-11173925404418682113032899089051422520091714612439825509533823", + "202565537407802568275133150254744755339063596153191453137442145", + "143631348028602688560257590284969222859622868780114362833859941" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-11173925404418682113032899089051422520091714612439825509533823" + }, + { + "type": "number", + "value": "202565537407802568275133150254744755339063596153191453137442145" + }, + { + "type": "number", + "value": "143631348028602688560257590284969222859622868780114362833859941" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610149806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100df565b60405180910390f35b6100566100c1565b61005e6100c1565b7906f41be8962206f8e950928676f93a23a42d985e2597fd94487e198152797e0e8d4a186f6c223e334af2b28f54dcd8f555ecc3a68c1215616020820152795961cb3b41d1cc29c480171deac8aa7de43a7584c4185bb475656040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101561010a57815160190b8352602092830192909101906001016100e8565b5050509291505056fea26469706673582212204f90c536fa8d4486816e3f40a1b795627d250e7bdecdf4d6653aff70362272f764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int208[3] memory) {\n int208[3] memory r;\n {\n int208 r_0 = -11173925404418682113032899089051422520091714612439825509533823;\n r[0] = r_0;\n }\n {\n int208 r_1 = 202565537407802568275133150254744755339063596153191453137442145;\n r[1] = r_1;\n }\n {\n int208 r_2 = 143631348028602688560257590284969222859622868780114362833859941;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xfffffffffffff90be41769ddf90716af6d798906c5dc5bd267a1da68026bb7810000000000007e0e8d4a186f6c223e334af2b28f54dcd8f555ecc3a68c1215610000000000005961cb3b41d1cc29c480171deac8aa7de43a7584c4185bb47565" + }, + { + "name": "random-int216[4]", + "type": "int216[4]", + "value": [ + "-24744684379905702942242365575982555093675157103044517078966399817", + "-4273212784758401169633837122243642328598696859017011675018459236", + "-22436338855518752095792060050846905709961870058688459768008514584", + "39536028154114218138765180149867498600107847851202444296864662884" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-24744684379905702942242365575982555093675157103044517078966399817" + }, + { + "type": "number", + "value": "-4273212784758401169633837122243642328598696859017011675018459236" + }, + { + "type": "number", + "value": "-22436338855518752095792060050846905709961870058688459768008514584" + }, + { + "type": "number", + "value": "39536028154114218138765180149867498600107847851202444296864662884" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061016f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610105565b60405180910390f35b6100566100e7565b61005e6100e7565b7a3c26a7a725758c51609085bbd86528bfb0c9ed22ce0e029296f3481981527a0a633a127b590d58c90c58647e8e4f770621745c4e0201040e78631960208201527a368a2afe9f1cd7940aa03a11f7331f4764c1c1928e4da993b39c171960408201527a601b54aa4187f9246c7b7b3292691baec2b47fd3b5d7d5813805646060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b6004811015610130578151601a0b83526020928301929091019060010161010e565b5050509291505056fea26469706673582212206ffa3932d3b553e877963321d6f9a5691d97ef6a727150baf1b8045610d17f7764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int216[4] memory) {\n int216[4] memory r;\n {\n int216 r_0 = -24744684379905702942242365575982555093675157103044517078966399817;\n r[0] = r_0;\n }\n {\n int216 r_1 = -4273212784758401169633837122243642328598696859017011675018459236;\n r[1] = r_1;\n }\n {\n int216 r_2 = -22436338855518752095792060050846905709961870058688459768008514584;\n r[2] = r_2;\n }\n {\n int216 r_3 = 39536028154114218138765180149867498600107847851202444296864662884;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffc3d95858da8a73ae9f6f7a44279ad7404f3612dd31f1fd6d690cb7fffffffffff59cc5ed84a6f2a736f3a79b8171b088f9de8ba3b1fdfefbf1879cffffffffffc975d50160e3286bf55fc5ee08cce0b89b3e3e6d71b2566c4c63e80000000000601b54aa4187f9246c7b7b3292691baec2b47fd3b5d7d581380564" + }, + { + "name": "random-int224[]", + "type": "int224[]", + "value": [ + "-4646884167045077322151355802979577120210033212523476949660672787066", + "1202581806054718845236498715366703848771722124595815172098057540247", + "1170974904438617327142284386516559213607710303808448288192352359325" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-4646884167045077322151355802979577120210033212523476949660672787066" + }, + { + "type": "number", + "value": "1202581806054718845236498715366703848771722124595815172098057540247" + }, + { + "type": "number", + "value": "1170974904438617327142284386516559213607710303808448288192352359325" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ed806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061015a565b60405180910390f35b604080516003808252608082019092526060916000919060208201848036833701905050905060007fffffffffd3e00ce226aea5dda5d451d41e757adbad843d4942f138cc1d0efd86905080826000815181106100ad576100ad6101a1565b6020026020010190601b0b9081601b0b815250505060007b0b6b507ec52425aa4853e5b8a350c52686ccc5d6be723082f4739297905080826001815181106100f7576100f76101a1565b6020026020010190601b0b9081601b0b815250505060007b0b1e7b78d70bed8a8626dcd28404f23c6cdc30cd096fdb6b0f2a139d90508082600281518110610141576101416101a1565b601b9290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b81811015610195578351601b0b83529284019291840191600101610176565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122095269c6651c6392802d1063a8fe7eae0637881c5015524ee37c84acf5eb21a3564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int224[] memory) {\n int224[] memory r = new int224[](3);\n {\n int224 r_0 = -4646884167045077322151355802979577120210033212523476949660672787066;\n r[0] = r_0;\n }\n {\n int224 r_1 = 1202581806054718845236498715366703848771722124595815172098057540247;\n r[1] = r_1;\n }\n {\n int224 r_2 = 1170974904438617327142284386516559213607710303808448288192352359325;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003ffffffffd3e00ce226aea5dda5d451d41e757adbad843d4942f138cc1d0efd86000000000b6b507ec52425aa4853e5b8a350c52686ccc5d6be723082f4739297000000000b1e7b78d70bed8a8626dcd28404f23c6cdc30cd096fdb6b0f2a139d" + }, + { + "name": "random-int224[1]", + "type": "int224[1]", + "value": ["-8443147258886072225170655361265274860721436494410830432273140456794"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-8443147258886072225170655361265274860721436494410830432273140456794" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610102806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906099565b60405180910390f35b604d607b565b6053607b565b7fffffffffafd3d88fbca1f2d43d46a941de2d28e330ea4aebdbaaa8bf0a8962a68152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c2578151601b0b8352918301919083019060010160a4565b505050509291505056fea2646970667358221220f0b1d472a8f69693a9ab95970ecb4b84954e0fa62e9e2d1e9a6d4378fa5485b964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int224[1] memory) {\n int224[1] memory r;\n {\n int224 r_0 = -8443147258886072225170655361265274860721436494410830432273140456794;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffffffafd3d88fbca1f2d43d46a941de2d28e330ea4aebdbaaa8bf0a8962a6" + }, + { + "name": "random-int232[2]", + "type": "int232[2]", + "value": [ + "2263848757437764465319968920062372913004524776686340361337116967285702", + "1726159796659750211106030299953852041761008832478898480112078391937923" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "2263848757437764465319968920062372913004524776686340361337116967285702" + }, + { + "type": "number", + "value": "1726159796659750211106030299953852041761008832478898480112078391937923" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610121806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b9565b60405180910390f35b604d609b565b6053609b565b7c53f8877c6e22b3eb27d924b057063d77380cfccd618ec092944e8fb3c681527c4006de06aa1194337440970f5f34616e1311c41d4384c454efd8750b836020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e2578151601c0b83526020928301929091019060010160c2565b5050509291505056fea2646970667358221220fe356902b427060d683b3e6c0bec9b29167a1aa60fb46f2b114bcd4eb4901c6164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int232[2] memory) {\n int232[2] memory r;\n {\n int232 r_0 = 2263848757437764465319968920062372913004524776686340361337116967285702;\n r[0] = r_0;\n }\n {\n int232 r_1 = 1726159796659750211106030299953852041761008832478898480112078391937923;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000053f8877c6e22b3eb27d924b057063d77380cfccd618ec092944e8fb3c60000004006de06aa1194337440970f5f34616e1311c41d4384c454efd8750b83" + }, + { + "name": "random-int24[]", + "type": "int24[]", + "value": ["-2307965", "851567", "6002622"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2307965" + }, + { + "type": "number", + "value": "851567" + }, + { + "type": "number", + "value": "6002622" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610198806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610105565b60405180910390f35b604080516003808252608082019092526060916000919060208201848036833701905050905060006223377c19905080826000815181106100915761009161014c565b602002602001019060020b908160020b81525050506000620cfe6f905080826001815181106100c2576100c261014c565b600292830b60209182029290920101528251625b97be92508291849181106100ec576100ec61014c565b60029290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561014057835160020b83529284019291840191600101610121565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212202cea4033ea8285a8d1e6382de2d2c2983bc00e38d19f3273d7399f09ea8d38d064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int24[] memory) {\n int24[] memory r = new int24[](3);\n {\n int24 r_0 = -2307965;\n r[0] = r_0;\n }\n {\n int24 r_1 = 851567;\n r[1] = r_1;\n }\n {\n int24 r_2 = 6002622;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdcc88300000000000000000000000000000000000000000000000000000000000cfe6f00000000000000000000000000000000000000000000000000000000005b97be" + }, + { + "name": "random-int24[2]", + "type": "int24[2]", + "value": ["7429085", "6026595"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "7429085" + }, + { + "type": "number", + "value": "6026595" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f18061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906085565b60405180910390f35b604d6067565b60536067565b62715bdd8152625bf5636020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b6002808210609b575060b2565b8251900b835260209283019290910190600101608e565b5050509291505056fea2646970667358221220b13a473b2d0cc39fce876f88ab4fec4a6300d6265a80e9ead525008715c60c0a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int24[2] memory) {\n int24[2] memory r;\n {\n int24 r_0 = 7429085;\n r[0] = r_0;\n }\n {\n int24 r_1 = 6026595;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000715bdd00000000000000000000000000000000000000000000000000000000005bf563" + }, + { + "name": "random-int240[2]", + "type": "int240[2]", + "value": [ + "-270437982907758555467529299404598553160434501423679947469811946758659277", + "655732589664657948579112012130039700646894431774473111175461197237315203" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-270437982907758555467529299404598553160434501423679947469811946758659277" + }, + { + "type": "number", + "value": "655732589664657948579112012130039700646894431774473111175461197237315203" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060bd565b60405180910390f35b604d609f565b6053609f565b7fffffd8d0e5cff11b589042af9c6b730f289513672a360bb4d5cef858c9eb233381527d5f02793a6f76349c36c91f495818855b0962b2331e010caf1d0c452de6836020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e6578151601d0b83526020928301929091019060010160c6565b5050509291505056fea2646970667358221220e0b0dd82a857dd3890b21166d79114d2e1cfb5a0c24ec0e3f3175f68494ca8ba64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int240[2] memory) {\n int240[2] memory r;\n {\n int240 r_0 = -270437982907758555467529299404598553160434501423679947469811946758659277;\n r[0] = r_0;\n }\n {\n int240 r_1 = 655732589664657948579112012130039700646894431774473111175461197237315203;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xffffd8d0e5cff11b589042af9c6b730f289513672a360bb4d5cef858c9eb233300005f02793a6f76349c36c91f495818855b0962b2331e010caf1d0c452de683" + }, + { + "name": "random-int240[4]", + "type": "int240[4]", + "value": [ + "-129189325327896820951133505629214283490994949277259836556640700887549688", + "-163522052724441299424116084952720606811228795554191532101191712531943319", + "-615576860888665678139129760559061082924397068841021645216050905182226192", + "-97446877132253911795992491061362223424568260044266864359174536521939775" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-129189325327896820951133505629214283490994949277259836556640700887549688" + }, + { + "type": "number", + "value": "-163522052724441299424116084952720606811228795554191532101191712531943319" + }, + { + "type": "number", + "value": "-615576860888665678139129760559061082924397068841021645216050905182226192" + }, + { + "type": "number", + "value": "-97446877132253911795992491061362223424568260044266864359174536521939775" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610180806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7fffffed481a0262cadf875d8e6a66ac5ee06afff81a26969b1d04d714b8a2b90881527fffffe84ea1453adbd18d9385c076ba7e05f0850188525e37cf50f6219921f06960208201527fffffa6cefc36f733fceb5ab8caa83e1e8b2e1bec18757c979c229a27e42238f060408201527ffffff1e17e939a9cd5e456a207f2d33d616b612022fab0bce47893c9ea7e84c16060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b6004811015610141578151601d0b83526020928301929091019060010161011f565b5050509291505056fea264697066735822122043ea2edba0d1f1bdee22a37f0782648b9aa9415eed8bfd333e842e541795f4f664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int240[4] memory) {\n int240[4] memory r;\n {\n int240 r_0 = -129189325327896820951133505629214283490994949277259836556640700887549688;\n r[0] = r_0;\n }\n {\n int240 r_1 = -163522052724441299424116084952720606811228795554191532101191712531943319;\n r[1] = r_1;\n }\n {\n int240 r_2 = -615576860888665678139129760559061082924397068841021645216050905182226192;\n r[2] = r_2;\n }\n {\n int240 r_3 = -97446877132253911795992491061362223424568260044266864359174536521939775;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xffffed481a0262cadf875d8e6a66ac5ee06afff81a26969b1d04d714b8a2b908ffffe84ea1453adbd18d9385c076ba7e05f0850188525e37cf50f6219921f069ffffa6cefc36f733fceb5ab8caa83e1e8b2e1bec18757c979c229a27e42238f0fffff1e17e939a9cd5e456a207f2d33d616b612022fab0bce47893c9ea7e84c1" + }, + { + "name": "random-int248[]", + "type": "int248[]", + "value": ["-170488689200170080261608908191931263666735666409014400976183043737082004013"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-170488689200170080261608908191931263666735666409014400976183043737082004013" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610159806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c6565b60405180910390f35b604080516001808252818301909252606091600091906020808301908036833701905050905060007fff9f81bf0dd0622d0599c95c45658075798a3ca95077ed270ff8fc08e39dfdd3905080826000815181106100ad576100ad61010d565b601e9290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b81811015610101578351601e0b835292840192918401916001016100e2565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122091027ad529dff7c887815aeb820002663fac85d43c39d3f23cbab7f26e8b654564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int248[] memory) {\n int248[] memory r = new int248[](1);\n {\n int248 r_0 = -170488689200170080261608908191931263666735666409014400976183043737082004013;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001ff9f81bf0dd0622d0599c95c45658075798a3ca95077ed270ff8fc08e39dfdd3" + }, + { + "name": "random-int248[4]", + "type": "int248[4]", + "value": [ + "31599971433904439480073453206409416918382765408336384283088439939207598655", + "-14765017428032932107591833299037473076947806441353432294231177736034258211", + "112817284373308101023546719817306564838934617697486919775248894602818313595", + "6734752053980451004228156967171569830009282554201010035620721985229254192" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "31599971433904439480073453206409416918382765408336384283088439939207598655" + }, + { + "type": "number", + "value": "-14765017428032932107591833299037473076947806441353432294231177736034258211" + }, + { + "type": "number", + "value": "112817284373308101023546719817306564838934617697486919775248894602818313595" + }, + { + "type": "number", + "value": "6734752053980451004228156967171569830009282554201010035620721985229254192" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610113565b60405180910390f35b6100566100f5565b61005e6100f5565b7e11e28c1583c44c2f70e2636d3ae943dfb88ce8c1cebe93b4d2f35243f9123f81527ffff7a4af10beaa811a99a4d8c80b48af42eef26733575c7a802d6f7ed7daf2dd60208201527e3fda31a6a8ce22a01fbc570200965e71966ce05ab2cb79972554e8119b5d7b60408201527e03cfcdd66124b482593e1c8e1025f96f8678fc9d5c69ffa16259cbe7c96e306060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561013e578151601e0b83526020928301929091019060010161011c565b5050509291505056fea2646970667358221220fb5ac9d6121a48c9197ff7e43a72d8406a13ebdaea3817813e2040e3329a8a6864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int248[4] memory) {\n int248[4] memory r;\n {\n int248 r_0 = 31599971433904439480073453206409416918382765408336384283088439939207598655;\n r[0] = r_0;\n }\n {\n int248 r_1 = -14765017428032932107591833299037473076947806441353432294231177736034258211;\n r[1] = r_1;\n }\n {\n int248 r_2 = 112817284373308101023546719817306564838934617697486919775248894602818313595;\n r[2] = r_2;\n }\n {\n int248 r_3 = 6734752053980451004228156967171569830009282554201010035620721985229254192;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0011e28c1583c44c2f70e2636d3ae943dfb88ce8c1cebe93b4d2f35243f9123ffff7a4af10beaa811a99a4d8c80b48af42eef26733575c7a802d6f7ed7daf2dd003fda31a6a8ce22a01fbc570200965e71966ce05ab2cb79972554e8119b5d7b0003cfcdd66124b482593e1c8e1025f96f8678fc9d5c69ffa16259cbe7c96e30" + }, + { + "name": "random-int256[4]", + "type": "int256[4]", + "value": [ + "18142005720347300466318991783864290359219306951999883839373602187793595219620", + "-37759052212053298606873329612916691863223003097775646815771067903333805797002", + "-13706962064111408111480990125180045713035902488810837883202337435027373159175", + "39448379620082481635352445141039342460386335014399205638170121739007352742574" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "18142005720347300466318991783864290359219306951999883839373602187793595219620" + }, + { + "type": "number", + "value": "-37759052212053298606873329612916691863223003097775646815771067903333805797002" + }, + { + "type": "number", + "value": "-13706962064111408111480990125180045713035902488810837883202337435027373159175" + }, + { + "type": "number", + "value": "39448379620082481635352445141039342460386335014399205638170121739007352742574" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f281c02e8098503d51c6c60f1cc16916531f47f84d77da37dac12ae828365bea481527fac852240e8c43a747557a6849e089aed7880595084e2cbc05447a6ef55e4d17660208201527fe1b222680baba9b7d2f06b0c00873afff06f1e81063f3892a6315644f6de0cf960408201527f5736fddb36f1826b2fc2a2a8d47c9edd793be22ec403c6d1fa1541a670b9a2ae6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561013e57815183526020928301929091019060010161011f565b5050509291505056fea26469706673582212206550ef48f0c9c84bf5f146fc41baacea674f06642ed187147b7f42336049bd8764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int256[4] memory) {\n int256[4] memory r;\n {\n int256 r_0 = 18142005720347300466318991783864290359219306951999883839373602187793595219620;\n r[0] = r_0;\n }\n {\n int256 r_1 = -37759052212053298606873329612916691863223003097775646815771067903333805797002;\n r[1] = r_1;\n }\n {\n int256 r_2 = -13706962064111408111480990125180045713035902488810837883202337435027373159175;\n r[2] = r_2;\n }\n {\n int256 r_3 = 39448379620082481635352445141039342460386335014399205638170121739007352742574;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x281c02e8098503d51c6c60f1cc16916531f47f84d77da37dac12ae828365bea4ac852240e8c43a747557a6849e089aed7880595084e2cbc05447a6ef55e4d176e1b222680baba9b7d2f06b0c00873afff06f1e81063f3892a6315644f6de0cf95736fddb36f1826b2fc2a2a8d47c9edd793be22ec403c6d1fa1541a670b9a2ae" + }, + { + "name": "random-int32[]", + "type": "int32[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060c88061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051600081526020810191829052604491604d565b60405180910390f35b6020808252825182820181905260009190848201906040850190845b81811015608657835160030b835292840192918401916001016069565b5090969550505050505056fea264697066735822122059396e035551662d9b52b1b7c5ff7d3c852c2a8738d57821f4d39f1960c4f58364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int32[] memory) {\n int32[] memory r = new int32[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-int32[1]", + "type": "int32[1]", + "value": ["-495262818"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-495262818" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060e78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607e565b60405180910390f35b604d6060565b60536060565b631d851c61198152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560a757815160030b835291830191908301906001016089565b505050509291505056fea264697066735822122053affa9315019c776228964ccf2f564806a4c91cf38bdeca8498b28ff5b910a064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int32[1] memory) {\n int32[1] memory r;\n {\n int32 r_0 = -495262818;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffe27ae39e" + }, + { + "name": "random-int40[]", + "type": "int40[]", + "value": ["463955905010"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "463955905010" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610132806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a1565b60405180910390f35b60408051600180825281830190925260609160009190602080830190803683370190505090506000646c05ed49f290508082600081518110608857608860e6565b60049290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101560da57835160040b8352928401929184019160010160bd565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212203d761265aacbd7bf426c9f2c0ae1be4b9f8c367fa144caf2c296fcb7aed2e9d364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int40[] memory) {\n int40[] memory r = new int40[](1);\n {\n int40 r_0 = 463955905010;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000006c05ed49f2" + }, + { + "name": "random-int40[3]", + "type": "int40[3]", + "value": ["78085376632", "-455043985292", "228565965259"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "78085376632" + }, + { + "type": "number", + "value": "-455043985292" + }, + { + "type": "number", + "value": "228565965259" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fd8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906095565b60405180910390f35b604d6077565b60536077565b64122e404a7881526469f2bc2f8b19602082015264353797d9cb6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560be57815160040b835260209283019290910190600101609e565b5050509291505056fea2646970667358221220f835639663fe624e687bb994e6dd8870b169fa8fcc104ffdb14c9d52da323b9764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int40[3] memory) {\n int40[3] memory r;\n {\n int40 r_0 = 78085376632;\n r[0] = r_0;\n }\n {\n int40 r_1 = -455043985292;\n r[1] = r_1;\n }\n {\n int40 r_2 = 228565965259;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000122e404a78ffffffffffffffffffffffffffffffffffffffffffffffffffffff960d43d074000000000000000000000000000000000000000000000000000000353797d9cb" + }, + { + "name": "random-int48[4]", + "type": "int48[4]", + "value": ["-67185771323167", "-37195460361073", "1954070775484", "-83219580491911"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-67185771323167" + }, + { + "type": "number", + "value": "-37195460361073" + }, + { + "type": "number", + "value": "1954070775484" + }, + { + "type": "number", + "value": "-83219580491911" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a6565b60405180910390f35b604d6088565b60536088565b653d1ae8089f1e1981526521d43e33bb701960208201526501c6f7b1c6bc6040820152654bb011889886196060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560cf57815160050b83526020928301929091019060010160af565b5050509291505056fea2646970667358221220ebee00adeb4cd2b92bda90b7705958e95a8f0864ec523261db0a8629a74854b964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int48[4] memory) {\n int48[4] memory r;\n {\n int48 r_0 = -67185771323167;\n r[0] = r_0;\n }\n {\n int48 r_1 = -37195460361073;\n r[1] = r_1;\n }\n {\n int48 r_2 = 1954070775484;\n r[2] = r_2;\n }\n {\n int48 r_3 = -83219580491911;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffc2e517f760e1ffffffffffffffffffffffffffffffffffffffffffffffffffffde2bc1cc448f000000000000000000000000000000000000000000000000000001c6f7b1c6bcffffffffffffffffffffffffffffffffffffffffffffffffffffb44fee776779" + }, + { + "name": "random-int56[]", + "type": "int56[]", + "value": ["-27438023170741394", "-35806554143254307"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-27438023170741394" + }, + { + "type": "number", + "value": "-35806554143254307" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610176806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e3565b60405180910390f35b60408051600280825260608083018452926000929190602083019080368337019050509050600066617abc986e549119905080826000815181106100945761009461012a565b602002602001019060060b908160060b81525050506000667f35df0c56e72219905080826001815181106100ca576100ca61012a565b60069290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561011e57835160060b835292840192918401916001016100ff565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220e38e6a07c071bf9f283b7474acc3b4acc96eaaaa88c8b725fe73965c88d883e264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int56[] memory) {\n int56[] memory r = new int56[](2);\n {\n int56 r_0 = -27438023170741394;\n r[0] = r_0;\n }\n {\n int56 r_1 = -35806554143254307;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffff9e85436791ab6effffffffffffffffffffffffffffffffffffffffffffffffff80ca20f3a918dd" + }, + { + "name": "random-int56[4]", + "type": "int56[4]", + "value": [ + "24730519983532447", + "-17157036331964271", + "877876979834657", + "-9881776583619671" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "24730519983532447" + }, + { + "type": "number", + "value": "-17157036331964271" + }, + { + "type": "number", + "value": "877876979834657" + }, + { + "type": "number", + "value": "-9881776583619671" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610111806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a9565b60405180910390f35b604d608b565b6053608b565b6657dc46e2baa99f8152663cf43bcff7176e19602082015266031e6ca98a1f21604082015266231b6c67043456196060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560d257815160060b83526020928301929091019060010160b2565b5050509291505056fea26469706673582212209201e2e4bdeb2dd4fd262604c4143ce8ecb1a27f826f7747ccefd71ee8bc218164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int56[4] memory) {\n int56[4] memory r;\n {\n int56 r_0 = 24730519983532447;\n r[0] = r_0;\n }\n {\n int56 r_1 = -17157036331964271;\n r[1] = r_1;\n }\n {\n int56 r_2 = 877876979834657;\n r[2] = r_2;\n }\n {\n int56 r_3 = -9881776583619671;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000057dc46e2baa99fffffffffffffffffffffffffffffffffffffffffffffffffffc30bc43008e89100000000000000000000000000000000000000000000000000031e6ca98a1f21ffffffffffffffffffffffffffffffffffffffffffffffffffdce49398fbcba9" + }, + { + "name": "random-int64[]", + "type": "int64[]", + "value": ["-3221430171614563757", "-1984920999378744122", "7913367232410699086"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-3221430171614563757" + }, + { + "type": "number", + "value": "-1984920999378744122" + }, + { + "type": "number", + "value": "7913367232410699086" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101af806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011c565b60405180910390f35b60408051600380825260808201909252606091600091906020820184803683370190505090506000672cb4d1ac57cfcdac199050808260008151811061009657610096610163565b602002602001019060070b908160070b81525050506000671b8bdb21e32ef33919905080826001815181106100cd576100cd610163565b602002602001019060070b908160070b81525050506000676dd1ed92310e454e9050808260028151811061010357610103610163565b60079290920b6020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561015757835160070b83529284019291840191600101610138565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122025a067332a34153882f53da5316a4e4f4839eaba7bdc5e6d88d7885aa27de0c564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int64[] memory) {\n int64[] memory r = new int64[](3);\n {\n int64 r_0 = -3221430171614563757;\n r[0] = r_0;\n }\n {\n int64 r_1 = -1984920999378744122;\n r[1] = r_1;\n }\n {\n int64 r_2 = 7913367232410699086;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffd34b2e53a8303253ffffffffffffffffffffffffffffffffffffffffffffffffe47424de1cd10cc60000000000000000000000000000000000000000000000006dd1ed92310e454e" + }, + { + "name": "random-int64[2]", + "type": "int64[2]", + "value": ["-5059615664941592411", "-4471030492347937020"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-5059615664941592411" + }, + { + "type": "number", + "value": "-4471030492347937020" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f98061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906091565b60405180910390f35b604d6073565b60536073565b6746375da3e8d86f5a198152673e0c4a8b5456b0fb196020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560ba57815160070b835260209283019290910190600101609a565b5050509291505056fea26469706673582212202a51fbf3297266087b5b3d9f315d2afb254eb6cce962166182436274bd85883664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int64[2] memory) {\n int64[2] memory r;\n {\n int64 r_0 = -5059615664941592411;\n r[0] = r_0;\n }\n {\n int64 r_1 = -4471030492347937020;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffb9c8a25c172790a5ffffffffffffffffffffffffffffffffffffffffffffffffc1f3b574aba94f04" + }, + { + "name": "random-int72[3]", + "type": "int72[3]", + "value": ["411922600202259082403", "2080509760170706122809", "99266288620767362469"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "411922600202259082403" + }, + { + "type": "number", + "value": "2080509760170706122809" + }, + { + "type": "number", + "value": "99266288620767362469" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610108806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060a0565b60405180910390f35b604d6082565b60536082565b681654930e6caae72ca381526870c8df7bdcb414b839602082015268056198b390b43d3da56040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560c957815160080b83526020928301929091019060010160a9565b5050509291505056fea26469706673582212204ffce7340b277cf7b77de343d10e1a6ca5eda67d6253d2df9dd4ab8bb87da20264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int72[3] memory) {\n int72[3] memory r;\n {\n int72 r_0 = 411922600202259082403;\n r[0] = r_0;\n }\n {\n int72 r_1 = 2080509760170706122809;\n r[1] = r_1;\n }\n {\n int72 r_2 = 99266288620767362469;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000001654930e6caae72ca3000000000000000000000000000000000000000000000070c8df7bdcb414b8390000000000000000000000000000000000000000000000056198b390b43d3da5" + }, + { + "name": "random-int8[1]", + "type": "int8[1]", + "value": ["66"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "66" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060e48061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607a565b60405180910390f35b604d605c565b6053605c565b60428152919050565b60405180602001604052806001906020820280368337509192915050565b60208181019082846000805b600181101560a3578251820b845292840192918401916001016086565b50505050509291505056fea26469706673582212209876cf8992be7b5aa2d77183453ea612c4978a83c0e2e1d48e346a8662aa4f9164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int8[1] memory) {\n int8[1] memory r;\n {\n int8 r_0 = 66;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000042" + }, + { + "name": "random-int80[4]", + "type": "int80[4]", + "value": [ + "293011020915502950586659", + "350017490047869560396500", + "483295739441890662577983", + "-128657358869524827143070" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "293011020915502950586659" + }, + { + "type": "number", + "value": "350017490047869560396500" + }, + { + "type": "number", + "value": "483295739441890662577983" + }, + { + "type": "number", + "value": "-128657358869524827143070" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061011c806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b4565b60405180910390f35b604d6096565b60536096565b693e0c28c60bba021719238152694a1e7c74b66560799ad4602082015269665783b86bd44518773f6040820152691b3e8786bbee5bacfb9d196060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560dd57815160090b83526020928301929091019060010160bd565b5050509291505056fea2646970667358221220f9017832280f9c4b8f05fd80f6403c4c80221b0c7f984f871b1912da661b079164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int80[4] memory) {\n int80[4] memory r;\n {\n int80 r_0 = 293011020915502950586659;\n r[0] = r_0;\n }\n {\n int80 r_1 = 350017490047869560396500;\n r[1] = r_1;\n }\n {\n int80 r_2 = 483295739441890662577983;\n r[2] = r_2;\n }\n {\n int80 r_3 = -128657358869524827143070;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000003e0c28c60bba02171923000000000000000000000000000000000000000000004a1e7c74b66560799ad400000000000000000000000000000000000000000000665783b86bd44518773fffffffffffffffffffffffffffffffffffffffffffffe4c178794411a4530462" + }, + { + "name": "random-int88[1]", + "type": "int88[1]", + "value": ["80935607150792488495448058"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "80935607150792488495448058" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ed8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906084565b60405180910390f35b604d6066565b60536066565b6a42f2c80e22a4e4780d7ffa8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560ad578151600a0b83529183019190830190600101608f565b505050509291505056fea2646970667358221220c53630489bddef58324053e0a9ad295f08809e7475313b38a41eb34d3ef555f564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int88[1] memory) {\n int88[1] memory r;\n {\n int88 r_0 = 80935607150792488495448058;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000042f2c80e22a4e4780d7ffa" + }, + { + "name": "random-int88[2]", + "type": "int88[2]", + "value": ["15409046335202403086285715", "-94354443271879631098513336"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "15409046335202403086285715" + }, + { + "type": "number", + "value": "-94354443271879631098513336" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fe8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906096565b60405180910390f35b604d6078565b60536078565b6a0cbefe135c58247468bb9381526a4e0c549e739cd7229687b7196020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560bf578151600a0b835260209283019290910190600101609f565b5050509291505056fea264697066735822122038eef306fd5e50dff3ea34a5fdd32c4623a76a63719270836552621cb6e91b5f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int88[2] memory) {\n int88[2] memory r;\n {\n int88 r_0 = 15409046335202403086285715;\n r[0] = r_0;\n }\n {\n int88 r_1 = -94354443271879631098513336;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000cbefe135c58247468bb93ffffffffffffffffffffffffffffffffffffffffffb1f3ab618c6328dd697848" + }, + { + "name": "random-int96[3]", + "type": "int96[3]", + "value": [ + "-6774744630693563321956799035", + "-27502617405254661756077350367", + "38377749546209837871066691038" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "-6774744630693563321956799035" + }, + { + "type": "number", + "value": "-27502617405254661756077350367" + }, + { + "type": "number", + "value": "38377749546209837871066691038" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060ab565b60405180910390f35b604d608d565b6053608d565b6b15e3effa54e54539d191923a1981526b58dda1c4fda0fa0823b21dde1960208201526b7c015493a7bf68827bc2b5de6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560d4578151600b0b83526020928301929091019060010160b4565b5050509291505056fea2646970667358221220e0fd6b76c2e96cdcbecc562426aae163d22da4a4edf717ad9b2b19ebec389d7e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int96[3] memory) {\n int96[3] memory r;\n {\n int96 r_0 = -6774744630693563321956799035;\n r[0] = r_0;\n }\n {\n int96 r_1 = -27502617405254661756077350367;\n r[1] = r_1;\n }\n {\n int96 r_2 = 38377749546209837871066691038;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffea1c1005ab1abac62e6e6dc5ffffffffffffffffffffffffffffffffffffffffa7225e3b025f05f7dc4de22100000000000000000000000000000000000000007c015493a7bf68827bc2b5de" + }, + { + "name": "random-string[]", + "type": "string[]", + "value": ["Moo é🚀M"], + "verbose": { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100cd565b60405180910390f35b60408051600180825281830190925260609160009190816020015b606081526020019060019003908161006957905050905060006040518060400160405280600b81526020016a4d6f6f20c3a9f09f9a804d60a81b815250905080826000815181106100bc576100bc610168565b602090810291909101015250919050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b8381101561015a57888603603f1901855282518051808852835b8181101561012a578281018a01518982018b0152890161010f565b8181111561013a57848a838b0101525b50601f01601f1916969096018701955093860193918601916001016100f5565b509398975050505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212205c2b3e379a6db24b5339eb96a01fea43ae5d8b89ccfe37ba50224d43fe50ba5964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[] memory) {\n string[] memory r = new string[](1);\n {\n string memory r_0 = unicode\"Moo é🚀M\";\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a804d000000000000000000000000000000000000000000" + }, + { + "name": "random-string[1]", + "type": "string[1]", + "value": ["Moo é🚀MMéoo oooéoooo oé MMéooMo 🚀🚀🚀ooo"], + "verbose": { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMéoo oooéoooo oé MMéooMo 🚀🚀🚀ooo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061019b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100a8565b60405180910390f35b610056610081565b61005e610081565b600060405180606001604052806037815260200161012f60379139825250919050565b60405180602001604052806001905b60608152602001906001900390816100905790505090565b6020808252600090604083018382018584805b600181101561012157601f198089870301855283518051808852845b818110156100f2578281018a01518982018b015289016100d7565b8181111561010257858a838b0101525b50601f01909116959095018601945092850192918501916001016100bb565b509297965050505050505056fe4d6f6f20c3a9f09f9a804d4dc3a96f6f206f6f6fc3a96f6f6f6f206fc3a9204d4dc3a96f6f4d6f20f09f9a80f09f9a80f09f9a806f6f6fa2646970667358221220ff3d4523a39d312b7eab0a57df776c2daf8781b84f01f37289ccd94ddd51578264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[1] memory) {\n string[1] memory r;\n {\n string memory r_0 = unicode\"Moo é🚀MMéoo oooéoooo oé MMéooMo 🚀🚀🚀ooo\";\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a804d4dc3a96f6f206f6f6fc3a96f6f6f6f206fc3a9204d4dc3a96f6f4d6f20f09f9a80f09f9a80f09f9a806f6f6f000000000000000000" + }, + { + "name": "random-string[2]", + "type": "string[2]", + "value": ["Moo é🚀 é🚀o ooéé🚀ooéoéoé M oo o🚀🚀MoMo", "Moo é🚀"], + "verbose": { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é🚀o ooéé🚀ooéoéoé M oo o🚀🚀MoMo" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100cf565b60405180910390f35b6100566100a8565b61005e6100a8565b60006040518060600160405280603c8152602001610156603c913982525060408051808201909152600a8152689adede418753e13f3560b71b602080830191909152820152919050565b60405180604001604052806002905b60608152602001906001900390816100b75790505090565b6020808252600090606083018382018584805b600281101561014857601f198089870301855283518051808852845b81811015610119578281018a01518982018b015289016100fe565b8181111561012957858a838b0101525b50601f01909116959095018601945092850192918501916001016100e2565b509297965050505050505056fe4d6f6f20c3a9f09f9a8020c3a9f09f9a806f206f6fc3a9c3a9f09f9a806f6fc3a96fc3a96fc3a9204d206f6f2020206ff09f9a80f09f9a804d6f4d6fa2646970667358221220179e8ce1c9f90faa49799ff25768ae76c78b48e8dc1a08c6060e8d239b86d51164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[2] memory) {\n string[2] memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 é🚀o ooéé🚀ooéoéoé M oo o🚀🚀MoMo\";\n r[0] = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a8020c3a9f09f9a806f206f6fc3a9c3a9f09f9a806f6fc3a96fc3a96fc3a9204d206f6f2020206ff09f9a80f09f9a804d6f4d6f00000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-string[3]", + "type": "string[3]", + "value": [ + "Moo é🚀 🚀oéo éMoo 🚀oééo🚀M oo🚀oéMoo🚀 🚀oo é ééMoéoMMoo🚀oooooooé ", + "Moo é🚀é🚀MMoM🚀oo🚀 o🚀🚀MM ooooM🚀 oMééM éé🚀🚀oMé 🚀 é ééo🚀 🚀o", + "Moo é🚀é 🚀oooo🚀🚀Mo" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀oéo éMoo 🚀oééo🚀M oo🚀oéMoo🚀 🚀oo é ééMoéoMMoo🚀oooooooé " + }, + { + "type": "string", + "value": "Moo é🚀é🚀MMoM🚀oo🚀 o🚀🚀MM ooooM🚀 oMééM éé🚀🚀oMé 🚀 é ééo🚀 🚀o" + }, + { + "type": "string", + "value": "Moo é🚀é 🚀oooo🚀🚀Mo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610106565b60405180910390f35b6100566100df565b61005e6100df565b60006040518060a001604052806062815260200161018d606291398252506040805160a081019091526066808252600091906101ef6020830139602083810191909152604080518082018252601f81527f4d6f6f20c3a9f09f9a80c3a920f09f9a806f6f6f6ff09f9a80f09f9a804d6f009281019290925283015250919050565b60405180606001604052806003905b60608152602001906001900390816100ee5790505090565b6020808252600090608083018382018584805b600381101561017f57601f198089870301855283518051808852845b81811015610150578281018a01518982018b01528901610135565b8181111561016057858a838b0101525b50601f0190911695909501860194509285019291850191600101610119565b509297965050505050505056fe4d6f6f20c3a9f09f9a8020f09f9a806fc3a96f2020c3a94d6f6f20f09f9a806fc3a9c3a96ff09f9a804d206f6ff09f9a806fc3a94d6f6ff09f9a8020f09f9a806f6f20c3a920c3a9c3a94d6fc3a96f4d4d6f6ff09f9a806f6f6f6f6f6f6fc3a920204d6f6f20c3a9f09f9a80c3a9f09f9a804d4d6f4df09f9a806f6ff09f9a80206ff09f9a80f09f9a804d4d206f6f6f6f4df09f9a80206f4dc3a9c3a94d20c3a9c3a9f09f9a80f09f9a806f4dc3a920f09f9a8020c3a92020c3a9c3a96ff09f9a8020f09f9a806fa264697066735822122016e0396f5190c2379cedbd7826000c15abf9ded03401f4e13d5f7a82d0e72cdd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[3] memory) {\n string[3] memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 🚀oéo éMoo 🚀oééo🚀M oo🚀oéMoo🚀 🚀oo é ééMoéoMMoo🚀oooooooé \";\n r[0] = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀é🚀MMoM🚀oo🚀 o🚀🚀MM ooooM🚀 oMééM éé🚀🚀oMé 🚀 é ééo🚀 🚀o\";\n r[1] = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀é 🚀oooo🚀🚀Mo\";\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a8020f09f9a806fc3a96f2020c3a94d6f6f20f09f9a806fc3a9c3a96ff09f9a804d206f6ff09f9a806fc3a94d6f6ff09f9a8020f09f9a806f6f20c3a920c3a9c3a94d6fc3a96f4d4d6f6ff09f9a806f6f6f6f6f6f6fc3a9202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a80c3a9f09f9a804d4d6f4df09f9a806f6ff09f9a80206ff09f9a80f09f9a804d4d206f6f6f6f4df09f9a80206f4dc3a9c3a94d20c3a9c3a9f09f9a80f09f9a806f4dc3a920f09f9a8020c3a92020c3a9c3a96ff09f9a8020f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a80c3a920f09f9a806f6f6f6ff09f9a80f09f9a804d6f00" + }, + { + "name": "random-string[4]", + "type": "string[4]", + "value": [ + "Moo é🚀oMM🚀🚀 🚀🚀 oééé🚀MéMoéoM🚀Moo🚀é MM 🚀Mé🚀🚀 o ooo", + "Moo é🚀🚀o🚀ooéé oéééM oMoo🚀éoo🚀ooo ooéééo🚀éMoo🚀o o oo 🚀oooM", + "Moo é🚀 Moé ooéo 🚀 M🚀🚀oo Méoo🚀o é🚀🚀oo", + "Moo é🚀o🚀🚀o🚀éooMoéMoMo🚀ééo Mé" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMM🚀🚀 🚀🚀 oééé🚀MéMoéoM🚀Moo🚀é MM 🚀Mé🚀🚀 o ooo" + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀ooéé oéééM oMoo🚀éoo🚀ooo ooéééo🚀éMoo🚀o o oo 🚀oooM" + }, + { + "type": "string", + "value": "Moo é🚀 Moé ooéo 🚀 M🚀🚀oo Méoo🚀o é🚀🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀o🚀éooMoéMoMo🚀ééo Mé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610117565b60405180910390f35b6100566100f0565b61005e6100f0565b60006040518060800160405280605981526020016101e0605991398252506040805160808101909152605d8082526000919061026a6020830139905080826001602002018190525050600060405180608001604052806042815260200161019e604291396040808401919091528051606081019091526031808252600092506102396020830139606083015250919050565b60405180608001604052806004905b60608152602001906001900390816100ff5790505090565b602080825260009060a083018382018584805b600481101561019057601f198089870301855283518051808852845b81811015610161578281018a01518982018b01528901610146565b8181111561017157858a838b0101525b50601f019091169590950186019450928501929185019160010161012a565b509297965050505050505056fe4d6f6f20c3a9f09f9a8020204d6fc3a9206f6fc3a96f2020f09f9a80204df09f9a80f09f9a806f6f20204dc3a96f6ff09f9a806f2020c3a9f09f9a80f09f9a806f6f4d6f6f20c3a9f09f9a806f4d4df09f9a80f09f9a8020f09f9a80f09f9a80206fc3a9c3a9c3a9f09f9a804dc3a94d6fc3a96f4df09f9a804d6f6ff09f9a80c3a9204d4d20f09f9a804dc3a9f09f9a80f09f9a80206f206f6f6f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806ff09f9a80c3a96f6f4d6fc3a94d6f4d6ff09f9a80c3a9c3a96f204dc3a94d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6fc3a9c3a9206fc3a9c3a9c3a94d206f4d6f6ff09f9a80c3a96f6ff09f9a806f6f6f206f6fc3a9c3a9c3a96ff09f9a80c3a94d6f6ff09f9a806f206f20206f6f20f09f9a806f6f6f4da2646970667358221220716d9552fd364f235a8b88beb5031073c4f2c72f874db27c3b3cb61d41c7a3d964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[4] memory) {\n string[4] memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oMM🚀🚀 🚀🚀 oééé🚀MéMoéoM🚀Moo🚀é MM 🚀Mé🚀🚀 o ooo\";\n r[0] = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀o🚀ooéé oéééM oMoo🚀éoo🚀ooo ooéééo🚀éMoo🚀o o oo 🚀oooM\";\n r[1] = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀 Moé ooéo 🚀 M🚀🚀oo Méoo🚀o é🚀🚀oo\";\n r[2] = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀o🚀🚀o🚀éooMoéMoMo🚀ééo Mé\";\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a806f4d4df09f9a80f09f9a8020f09f9a80f09f9a80206fc3a9c3a9c3a9f09f9a804dc3a94d6fc3a96f4df09f9a804d6f6ff09f9a80c3a9204d4d20f09f9a804dc3a9f09f9a80f09f9a80206f206f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6fc3a9c3a9206fc3a9c3a9c3a94d206f4d6f6ff09f9a80c3a96f6ff09f9a806f6f6f206f6fc3a9c3a9c3a96ff09f9a80c3a94d6f6ff09f9a806f206f20206f6f20f09f9a806f6f6f4d00000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a8020204d6fc3a9206f6fc3a96f2020f09f9a80204df09f9a80f09f9a806f6f20204dc3a96f6ff09f9a806f2020c3a9f09f9a80f09f9a806f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806ff09f9a80f09f9a806ff09f9a80c3a96f6f4d6fc3a94d6f4d6ff09f9a80c3a9c3a96f204dc3a9000000000000000000000000000000" + }, + { + "name": "random-uint[1]", + "type": "uint[1]", + "value": ["85278062354955196856548681280337422497994696305453898151610776625952312643983"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "85278062354955196856548681280337422497994696305453898151610776625952312643983" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ff8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906099565b60405180910390f35b604d607b565b6053607b565b7fbc89ac3e0e9b0049e9167d01dbbf804b84d9b623efcb896443ebb8371199d18f8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560bf5781518352918301919083019060010160a4565b505050509291505056fea264697066735822122096af353cc1dc9ea102610f3be39f1fcecd0ab1caabd348c2bfbbacf9d100442864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint256[1] memory) {\n uint256[1] memory r;\n {\n uint r_0 = 85278062354955196856548681280337422497994696305453898151610776625952312643983;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xbc89ac3e0e9b0049e9167d01dbbf804b84d9b623efcb896443ebb8371199d18f" + }, + { + "name": "random-uint[3]", + "type": "uint[3]", + "value": [ + "98393364321761373208654249527454193797295952995917213712613395288490053419721", + "88612540650132332205727238878279683016376639335773567842391964296007635009636", + "23797238281057386515491841886811405147248814370120343448918167108993365246578" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "98393364321761373208654249527454193797295952995917213712613395288490053419721" + }, + { + "type": "number", + "value": "88612540650132332205727238878279683016376639335773567842391964296007635009636" + }, + { + "type": "number", + "value": "23797238281057386515491841886811405147248814370120343448918167108993365246578" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610157806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b6100566100d2565b61005e6100d2565b7fd988abb14a829fdffda99e33c76c9d4a31bf94f38873556310327dc54de342c981527fc3e8ebb01339c0fde4afffb8991b5aa7b87d88ec845fd365e903d886e465806460208201527f349cc27203c4d50a320f0a6595e7770f6ceaf5d935daf97eb6684f8a4be702726040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b60038110156101185781518352602092830192909101906001016100f9565b5050509291505056fea2646970667358221220d00e84d3ba8caa45b4c8d8a87bf4734b5a213bc5868aa2427f18be4af03a469564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint256[3] memory) {\n uint256[3] memory r;\n {\n uint r_0 = 98393364321761373208654249527454193797295952995917213712613395288490053419721;\n r[0] = r_0;\n }\n {\n uint r_1 = 88612540650132332205727238878279683016376639335773567842391964296007635009636;\n r[1] = r_1;\n }\n {\n uint r_2 = 23797238281057386515491841886811405147248814370120343448918167108993365246578;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xd988abb14a829fdffda99e33c76c9d4a31bf94f38873556310327dc54de342c9c3e8ebb01339c0fde4afffb8991b5aa7b87d88ec845fd365e903d886e4658064349cc27203c4d50a320f0a6595e7770f6ceaf5d935daf97eb6684f8a4be70272" + }, + { + "name": "random-uint[4]", + "type": "uint[4]", + "value": [ + "57346974314348497832025048164229507860228206721417190654129115307041630375507", + "112358820360125404352722645092096125963662188685916991422224750821458080442606", + "81815546683028214628834496441602347529868608271479026934697953374598712865169", + "7547477982752107987132137646075851025286130866229091054848335142869507848848" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "57346974314348497832025048164229507860228206721417190654129115307041630375507" + }, + { + "type": "number", + "value": "112358820360125404352722645092096125963662188685916991422224750821458080442606" + }, + { + "type": "number", + "value": "81815546683028214628834496441602347529868608271479026934697953374598712865169" + }, + { + "type": "number", + "value": "7547477982752107987132137646075851025286130866229091054848335142869507848848" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7f7ec93cba803e455dfc382491706703757850dc422249a51d91c1e1c8749ece5381527ff868d6b3a339e5ee1725982e9a27ae908de81c043adecddd1d7b6d586ce028ee60208201527fb4e1f559c9115b94732521e47f4a736e6ab3990cf3e29a4ca889b1c4a32d319160408201527f10afb89d8eda67dbb6c5cef3df7e44591a128e1ce9b3420c25561455ba053a906060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561013e57815183526020928301929091019060010161011f565b5050509291505056fea2646970667358221220f45359371426400181aac57d638f50c891984c01be5e26739a0661067518547664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint256[4] memory) {\n uint256[4] memory r;\n {\n uint r_0 = 57346974314348497832025048164229507860228206721417190654129115307041630375507;\n r[0] = r_0;\n }\n {\n uint r_1 = 112358820360125404352722645092096125963662188685916991422224750821458080442606;\n r[1] = r_1;\n }\n {\n uint r_2 = 81815546683028214628834496441602347529868608271479026934697953374598712865169;\n r[2] = r_2;\n }\n {\n uint r_3 = 7547477982752107987132137646075851025286130866229091054848335142869507848848;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x7ec93cba803e455dfc382491706703757850dc422249a51d91c1e1c8749ece53f868d6b3a339e5ee1725982e9a27ae908de81c043adecddd1d7b6d586ce028eeb4e1f559c9115b94732521e47f4a736e6ab3990cf3e29a4ca889b1c4a32d319110afb89d8eda67dbb6c5cef3df7e44591a128e1ce9b3420c25561455ba053a90" + }, + { + "name": "random-uint104[2]", + "type": "uint104[2]", + "value": ["17975298040185105258323422246807", "1324837334398316441929784338109"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "17975298040185105258323422246807" + }, + { + "type": "number", + "value": "1324837334398316441929784338109" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061010d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906099565b60405180910390f35b604d607b565b6053607b565b6ce2e1520b3027f3e3c53380779781526c10b8c7c1ff3a5c3da8280da6bd6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560ce5781516cffffffffffffffffffffffffff1683526020928301929091019060010160a2565b5050509291505056fea26469706673582212207d0b6754f73fbc639f2278b0fe40d4cd35f0b8d63c832c2259ed41633e6911ad64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint104[2] memory) {\n uint104[2] memory r;\n {\n uint104 r_0 = 17975298040185105258323422246807;\n r[0] = r_0;\n }\n {\n uint104 r_1 = 1324837334398316441929784338109;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000e2e1520b3027f3e3c5338077970000000000000000000000000000000000000010b8c7c1ff3a5c3da8280da6bd" + }, + { + "name": "random-uint112[]", + "type": "uint112[]", + "value": ["1734002917639325815251826435653609"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "1734002917639325815251826435653609" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610152806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b9565b60405180910390f35b604080516001808252818301909252606091600091906020808301908036833701905050905060006d557e319b94e603699e8ab5837fe99050808260008151811061009b5761009b610106565b6001600160701b039092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156100fa5783516001600160701b0316835292840192918401916001016100d5565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220e20d6e692cd9cca9e02cb702aa44c85b4c040b385bd184075357d72f66b2bd0f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint112[] memory) {\n uint112[] memory r = new uint112[](1);\n {\n uint112 r_0 = 1734002917639325815251826435653609;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000557e319b94e603699e8ab5837fe9" + }, + { + "name": "random-uint120[2]", + "type": "uint120[2]", + "value": ["900520415123204281892415007713605193", "762361272231216916684115282506300537"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "900520415123204281892415007713605193" + }, + { + "type": "number", + "value": "762361272231216916684115282506300537" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609d565b60405180910390f35b604d607f565b6053607f565b6ead6f1598f61e6f39652f7b3e43364981526e92d3500d96ec6a4346773b5f043c796020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560d45781516effffffffffffffffffffffffffffff1683526020928301929091019060010160a6565b5050509291505056fea2646970667358221220edf27b439638ed0bf548c8f1562754b9e26352ae161219c2d2bc715ad49c441a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint120[2] memory) {\n uint120[2] memory r;\n {\n uint120 r_0 = 900520415123204281892415007713605193;\n r[0] = r_0;\n }\n {\n uint120 r_1 = 762361272231216916684115282506300537;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000ad6f1598f61e6f39652f7b3e433649000000000000000000000000000000000092d3500d96ec6a4346773b5f043c79" + }, + { + "name": "random-uint120[4]", + "type": "uint120[4]", + "value": [ + "1219281052564635083648712379502713405", + "93457656159301502433307418491713503", + "102719599917863107132050331138439500", + "685684355155884124688297312759859114" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "1219281052564635083648712379502713405" + }, + { + "type": "number", + "value": "93457656159301502433307418491713503" + }, + { + "type": "number", + "value": "102719599917863107132050331138439500" + }, + { + "type": "number", + "value": "685684355155884124688297312759859114" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d2565b60405180910390f35b6100566100b4565b61005e6100b4565b6eead3327a3eb7164521252b6df45a3d81526e11ffd175b59f0aab7fae35e4f577df60208201526e13c877a00d428b2db4e6ce5926b94c60408201526e840ed94c33df3c10f6110762d847aa6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561010b5781516effffffffffffffffffffffffffffff168352602092830192909101906001016100db565b5050509291505056fea2646970667358221220309bad2e4bcd265a07ddd90270d75f13e5f45d4141b839438b922ea14da427a264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint120[4] memory) {\n uint120[4] memory r;\n {\n uint120 r_0 = 1219281052564635083648712379502713405;\n r[0] = r_0;\n }\n {\n uint120 r_1 = 93457656159301502433307418491713503;\n r[1] = r_1;\n }\n {\n uint120 r_2 = 102719599917863107132050331138439500;\n r[2] = r_2;\n }\n {\n uint120 r_3 = 685684355155884124688297312759859114;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000ead3327a3eb7164521252b6df45a3d000000000000000000000000000000000011ffd175b59f0aab7fae35e4f577df000000000000000000000000000000000013c877a00d428b2db4e6ce5926b94c0000000000000000000000000000000000840ed94c33df3c10f6110762d847aa" + }, + { + "name": "random-uint128[]", + "type": "uint128[]", + "value": [ + "45666880403296733618174986307167854458", + "156110214377450824710234782852359668709", + "260076474189991163105982748342494105931", + "334513186501035354422550055226448553846" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "45666880403296733618174986307167854458" + }, + { + "type": "number", + "value": "156110214377450824710234782852359668709" + }, + { + "type": "number", + "value": "260076474189991163105982748342494105931" + }, + { + "type": "number", + "value": "334513186501035354422550055226448553846" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610233806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019a565b60405180910390f35b60408051600480825260a08201909252606091600091906020820160808036833701905050905060006f225b1f09d128d8fd9ef7c0126ed41f7a9050808260008151811061009e5761009e6101e7565b60200260200101906001600160801b031690816001600160801b0316815250505060006f7571bbd072dc3db6681e2a2d9e9843e5905080826001815181106100e8576100e86101e7565b60200260200101906001600160801b031690816001600160801b0316815250505060006fc3a8e82db3049517076710e190db114b90508082600281518110610132576101326101e7565b60200260200101906001600160801b031690816001600160801b0316815250505060006ffba8e571c8ff9ce3b25875dfbe6827769050808260038151811061017c5761017c6101e7565b6001600160801b039092166020928302919091019091015250919050565b6020808252825182820181905260009190848201906040850190845b818110156101db5783516001600160801b0316835292840192918401916001016101b6565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ce93974bde6d050095b3dc900e3c8f76755a2392e8d6cde8aea1edb9c56f279064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint128[] memory) {\n uint128[] memory r = new uint128[](4);\n {\n uint128 r_0 = 45666880403296733618174986307167854458;\n r[0] = r_0;\n }\n {\n uint128 r_1 = 156110214377450824710234782852359668709;\n r[1] = r_1;\n }\n {\n uint128 r_2 = 260076474189991163105982748342494105931;\n r[2] = r_2;\n }\n {\n uint128 r_3 = 334513186501035354422550055226448553846;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000225b1f09d128d8fd9ef7c0126ed41f7a000000000000000000000000000000007571bbd072dc3db6681e2a2d9e9843e500000000000000000000000000000000c3a8e82db3049517076710e190db114b00000000000000000000000000000000fba8e571c8ff9ce3b25875dfbe682776" + }, + { + "name": "random-uint152[4]", + "type": "uint152[4]", + "value": [ + "4220552356137429413566824177900599517854480051", + "5312239766907215008829542419366626735577463991", + "3653815666181609723642551470502014290202870459", + "3071496476582390265034125017396569260408755355" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "4220552356137429413566824177900599517854480051" + }, + { + "type": "number", + "value": "5312239766907215008829542419366626735577463991" + }, + { + "type": "number", + "value": "3653815666181609723642551470502014290202870459" + }, + { + "type": "number", + "value": "3071496476582390265034125017396569260408755355" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e2565b60405180910390f35b6100566100c4565b61005e6100c4565b72bd4190a145eaec4830bc25897fc16437beb6b3815272ee3585972d20a6272756665e6f24fe7fad7cb7602082015272a3d7bf2fb5092f01f0f07d54800b7305ae42bb60408201527289bb0ce458fdcac531da6c7ab3b9250344d49b6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561011f57815172ffffffffffffffffffffffffffffffffffffff168352602092830192909101906001016100eb565b5050509291505056fea2646970667358221220a1eab2e9439457db93839f9d6cb694967146ba2b0174c7fa3898c4e2e5fe9bc864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint152[4] memory) {\n uint152[4] memory r;\n {\n uint152 r_0 = 4220552356137429413566824177900599517854480051;\n r[0] = r_0;\n }\n {\n uint152 r_1 = 5312239766907215008829542419366626735577463991;\n r[1] = r_1;\n }\n {\n uint152 r_2 = 3653815666181609723642551470502014290202870459;\n r[2] = r_2;\n }\n {\n uint152 r_3 = 3071496476582390265034125017396569260408755355;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000bd4190a145eaec4830bc25897fc16437beb6b300000000000000000000000000ee3585972d20a6272756665e6f24fe7fad7cb700000000000000000000000000a3d7bf2fb5092f01f0f07d54800b7305ae42bb0000000000000000000000000089bb0ce458fdcac531da6c7ab3b9250344d49b" + }, + { + "name": "random-uint16[1]", + "type": "uint16[1]", + "value": ["18606"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "18606" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060e58061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607b565b60405180910390f35b604d605d565b6053605d565b6148ae8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560a557815161ffff16835291830191908301906001016086565b505050509291505056fea2646970667358221220d2f7208be658ffe80f9fe8a83b4a0c84b54eeb4ff84ccd45e60815678f5f501764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint16[1] memory) {\n uint16[1] memory r;\n {\n uint16 r_0 = 18606;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000048ae" + }, + { + "name": "random-uint16[2]", + "type": "uint16[2]", + "value": ["22538", "44929"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "22538" + }, + { + "type": "number", + "value": "44929" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060ec8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906083565b60405180910390f35b604d6065565b60536065565b61580a815261af816020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560ad57815161ffff16835260209283019290910190600101608c565b5050509291505056fea26469706673582212203a827bf6d1ac0b77c6e92ba29af92c0b572a6ddb0b954013ee4e1af8a630222464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint16[2] memory) {\n uint16[2] memory r;\n {\n uint16 r_0 = 22538;\n r[0] = r_0;\n }\n {\n uint16 r_1 = 44929;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000580a000000000000000000000000000000000000000000000000000000000000af81" + }, + { + "name": "random-uint16[4]", + "type": "uint16[4]", + "value": ["60274", "3135", "35849", "28479"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "60274" + }, + { + "type": "number", + "value": "3135" + }, + { + "type": "number", + "value": "35849" + }, + { + "type": "number", + "value": "28479" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906093565b60405180910390f35b604d6075565b60536075565b61eb728152610c3f6020820152618c096040820152616f3f6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560bd57815161ffff16835260209283019290910190600101609c565b5050509291505056fea264697066735822122079b9a559c580f224b84fb4e99062e7c7a7cdecb7134e07be5109a307d03cc39e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint16[4] memory) {\n uint16[4] memory r;\n {\n uint16 r_0 = 60274;\n r[0] = r_0;\n }\n {\n uint16 r_1 = 3135;\n r[1] = r_1;\n }\n {\n uint16 r_2 = 35849;\n r[2] = r_2;\n }\n {\n uint16 r_3 = 28479;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000eb720000000000000000000000000000000000000000000000000000000000000c3f0000000000000000000000000000000000000000000000000000000000008c090000000000000000000000000000000000000000000000000000000000006f3f" + }, + { + "name": "random-uint160[1]", + "type": "uint160[1]", + "value": ["900699532436376032247258387010855706147272699485"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "900699532436376032247258387010855706147272699485" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060fc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608d565b60405180910390f35b604d606f565b6053606f565b739dc4c38e6b07e7184220eb646ec954d13c16ae5d8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560bc5781516001600160a01b0316835291830191908301906001016098565b505050509291505056fea26469706673582212204f8ba9b16869940de9167be2f84b33c1f05a7739aeca21573683b3fb41ce6e6f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint160[1] memory) {\n uint160[1] memory r;\n {\n uint160 r_0 = 900699532436376032247258387010855706147272699485;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000009dc4c38e6b07e7184220eb646ec954d13c16ae5d" + }, + { + "name": "random-uint184[3]", + "type": "uint184[3]", + "value": [ + "413642680314259650780405274104799871794204752393583554", + "5487591858019660576937234907840755518967346196025008603", + "3378321539640535906629656316987399506039065831656761684" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "413642680314259650780405274104799871794204752393583554" + }, + { + "type": "number", + "value": "5487591858019660576937234907840755518967346196025008603" + }, + { + "type": "number", + "value": "3378321539640535906629656316987399506039065831656761684" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610145806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d5565b60405180910390f35b6100566100b7565b61005e6100b7565b76045191ce9683ac21bc14f75f462381a75fe0bd03f4bbc2815276394b0ab76f7f8c93b44d47d607443b8210678c7b1d61db602082015276234575662fccac79108878df5a202d57490ff9acc9a9546040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b60038110156101065781516001600160b81b03168352602092830192909101906001016100de565b5050509291505056fea2646970667358221220bb16a28bdb46cc0166943d99cfe6b67b8d3b1de564ae30bf816b63a3fe3bd81064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint184[3] memory) {\n uint184[3] memory r;\n {\n uint184 r_0 = 413642680314259650780405274104799871794204752393583554;\n r[0] = r_0;\n }\n {\n uint184 r_1 = 5487591858019660576937234907840755518967346196025008603;\n r[1] = r_1;\n }\n {\n uint184 r_2 = 3378321539640535906629656316987399506039065831656761684;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000045191ce9683ac21bc14f75f462381a75fe0bd03f4bbc2000000000000000000394b0ab76f7f8c93b44d47d607443b8210678c7b1d61db000000000000000000234575662fccac79108878df5a202d57490ff9acc9a954" + }, + { + "name": "random-uint192[1]", + "type": "uint192[1]", + "value": ["2498568177355823093363623225498144745700498743289031567873"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "2498568177355823093363623225498144745700498743289031567873" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610100806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906091565b60405180910390f35b604d6073565b60536073565b7765e644d9a6724e78bdad2dfcb5df8b4ad6446501b5e62a018152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c05781516001600160c01b031683529183019190830190600101609c565b505050509291505056fea26469706673582212206486d21eda1b693af4d770671502aaf8791701f330e2d3b46d160f12cb2783d664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint192[1] memory) {\n uint192[1] memory r;\n {\n uint192 r_0 = 2498568177355823093363623225498144745700498743289031567873;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000065e644d9a6724e78bdad2dfcb5df8b4ad6446501b5e62a01" + }, + { + "name": "random-uint208[4]", + "type": "uint208[4]", + "value": [ + "41203718104304195744329694122119311413477902644741402359646386", + "276938912565807513525244330610353216445242763101225651064745332", + "125208482440264421015103569648955929192834657823415577470889819", + "110318807980708436193008130039081969915467909257228631416340172" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "41203718104304195744329694122119311413477902644741402359646386" + }, + { + "type": "number", + "value": "276938912565807513525244330610353216445242763101225651064745332" + }, + { + "type": "number", + "value": "125208482440264421015103569648955929192834657823415577470889819" + }, + { + "type": "number", + "value": "110318807980708436193008130039081969915467909257228631416340172" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061016e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fe565b60405180910390f35b6100566100e0565b61005e6100e0565b7919a4218959c56a89f4768691805602b54878bcb75b75a31a48b2815279ac56ea05a532ccc0dd496cbff6182831cc1d1267899cb52b2d746020820152794deadcafd6897fae300d9fcaac6e1babe4272f5f3b462a90ef5b60408201527944a6ccd0fe46582b0bd72d1d0a0371a411bccfa5779728957ecc6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561012f5781516001600160d01b0316835260209283019290910190600101610107565b5050509291505056fea2646970667358221220b59ec4a88fc08359268157195c0d030ed2cfc89bfadcd53897511c22d27fa18864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint208[4] memory) {\n uint208[4] memory r;\n {\n uint208 r_0 = 41203718104304195744329694122119311413477902644741402359646386;\n r[0] = r_0;\n }\n {\n uint208 r_1 = 276938912565807513525244330610353216445242763101225651064745332;\n r[1] = r_1;\n }\n {\n uint208 r_2 = 125208482440264421015103569648955929192834657823415577470889819;\n r[2] = r_2;\n }\n {\n uint208 r_3 = 110318807980708436193008130039081969915467909257228631416340172;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000019a4218959c56a89f4768691805602b54878bcb75b75a31a48b2000000000000ac56ea05a532ccc0dd496cbff6182831cc1d1267899cb52b2d740000000000004deadcafd6897fae300d9fcaac6e1babe4272f5f3b462a90ef5b00000000000044a6ccd0fe46582b0bd72d1d0a0371a411bccfa5779728957ecc" + }, + { + "name": "random-uint216[2]", + "type": "uint216[2]", + "value": [ + "29822184318992408335079376645256154420789021837382915413095905583", + "96219170852115341359817153601070875733346207849309015102555742146" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "29822184318992408335079376645256154420789021837382915413095905583" + }, + { + "type": "number", + "value": "96219170852115341359817153601070875733346207849309015102555742146" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610123806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b5565b60405180910390f35b604d6097565b60536097565b7a487e640fa383c46e54ce9c8c67c1160b2e71b543b6aeaffaae792f81527ae9e556472d79807a27b9f90005620d8fc462926e78a36b0214dfc26020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e45781516001600160d81b031683526020928301929091019060010160be565b5050509291505056fea2646970667358221220785ba4f393f109c26c467c9bc3be4bdc88413a75ecda1675c8b5fe1f78860aa864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint216[2] memory) {\n uint216[2] memory r;\n {\n uint216 r_0 = 29822184318992408335079376645256154420789021837382915413095905583;\n r[0] = r_0;\n }\n {\n uint216 r_1 = 96219170852115341359817153601070875733346207849309015102555742146;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000487e640fa383c46e54ce9c8c67c1160b2e71b543b6aeaffaae792f0000000000e9e556472d79807a27b9f90005620d8fc462926e78a36b0214dfc2" + }, + { + "name": "random-uint216[3]", + "type": "uint216[3]", + "value": [ + "88190322406694430710395712534741453653707001601680073897198362232", + "48758932413002196192074694062914005811392162031452500736112894255", + "6976406859807583033475209359539552360665380622390650462911140403" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "88190322406694430710395712534741453653707001601680073897198362232" + }, + { + "type": "number", + "value": "48758932413002196192074694062914005811392162031452500736112894255" + }, + { + "type": "number", + "value": "6976406859807583033475209359539552360665380622390650462911140403" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610151806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e1565b60405180910390f35b6100566100c3565b61005e6100c3565b7ad660f8ed3769e7e9f966ad95433c4e0f7b957247c23399baea1e7881527a7686c2150f0ac6c30ae47836d3638a195d4281b1be5af68af8a12f60208201527a10f56dbbd49ad1d5445ba01b98fa93b9dcb12ab30f6cc35ca112336040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b60038110156101125781516001600160d81b03168352602092830192909101906001016100ea565b5050509291505056fea26469706673582212202479cef286080d6d0200c1771fb126fc2cab4f05ba2bc098723af6e6f61f208d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint216[3] memory) {\n uint216[3] memory r;\n {\n uint216 r_0 = 88190322406694430710395712534741453653707001601680073897198362232;\n r[0] = r_0;\n }\n {\n uint216 r_1 = 48758932413002196192074694062914005811392162031452500736112894255;\n r[1] = r_1;\n }\n {\n uint216 r_2 = 6976406859807583033475209359539552360665380622390650462911140403;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000d660f8ed3769e7e9f966ad95433c4e0f7b957247c23399baea1e7800000000007686c2150f0ac6c30ae47836d3638a195d4281b1be5af68af8a12f000000000010f56dbbd49ad1d5445ba01b98fa93b9dcb12ab30f6cc35ca11233" + }, + { + "name": "random-uint224[2]", + "type": "uint224[2]", + "value": [ + "21119040740797690320603773700257272911270273883663008584865809003937", + "14256245386038606091911503154178306494254127673938390365780898636799" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "21119040740797690320603773700257272911270273883663008584865809003937" + }, + { + "type": "number", + "value": "14256245386038606091911503154178306494254127673938390365780898636799" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610125806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060b7565b60405180910390f35b604d6099565b60536099565b7bc8898b5181100f8b9e51b6e1c91838557f8fb603de04be985bd975a181527b875f0348c301b4d0a0f40e43b2260f7a134e52ddbedeef7a2cf663ff6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560e65781516001600160e01b031683526020928301929091019060010160c0565b5050509291505056fea2646970667358221220cbe9ec93d9b03e043660bc25d9cd907d2da2697bb402c887f0edfbb92ae2700464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint224[2] memory) {\n uint224[2] memory r;\n {\n uint224 r_0 = 21119040740797690320603773700257272911270273883663008584865809003937;\n r[0] = r_0;\n }\n {\n uint224 r_1 = 14256245386038606091911503154178306494254127673938390365780898636799;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000c8898b5181100f8b9e51b6e1c91838557f8fb603de04be985bd975a100000000875f0348c301b4d0a0f40e43b2260f7a134e52ddbedeef7a2cf663ff" + }, + { + "name": "random-uint232[3]", + "type": "uint232[3]", + "value": [ + "4668521558413805909965103393359813388021067639593867520712648039639941", + "2662205064857164902199626993470803474734409443133080569861430854129464", + "4797992062173071897403983553172470522978930586099076246241474442331573" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "4668521558413805909965103393359813388021067639593867520712648039639941" + }, + { + "type": "number", + "value": "2662205064857164902199626993470803474734409443133080569861430854129464" + }, + { + "type": "number", + "value": "4797992062173071897403983553172470522978930586099076246241474442331573" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610157806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e7565b60405180910390f35b6100566100c9565b61005e6100c9565b7cad2a43424da683de8b0bedf1096121e49ddc7184aaf997a6f26fc0ab8581527c62bf260723fabfd95ce5abfc5c403c330b9cd7e36c373786c078a1973860208201527cb1f7a89e989040da05f83fda1d8567bd7cf081a1a38e73ce0da0aa85b56040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b60038110156101185781516001600160e81b03168352602092830192909101906001016100f0565b5050509291505056fea26469706673582212200b311a9245227e76656a5413ffdf2d0cbefddefc327b7604e79c1702784ee30b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint232[3] memory) {\n uint232[3] memory r;\n {\n uint232 r_0 = 4668521558413805909965103393359813388021067639593867520712648039639941;\n r[0] = r_0;\n }\n {\n uint232 r_1 = 2662205064857164902199626993470803474734409443133080569861430854129464;\n r[1] = r_1;\n }\n {\n uint232 r_2 = 4797992062173071897403983553172470522978930586099076246241474442331573;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000ad2a43424da683de8b0bedf1096121e49ddc7184aaf997a6f26fc0ab8500000062bf260723fabfd95ce5abfc5c403c330b9cd7e36c373786c078a19738000000b1f7a89e989040da05f83fda1d8567bd7cf081a1a38e73ce0da0aa85b5" + }, + { + "name": "random-uint24[3]", + "type": "uint24[3]", + "value": ["8344979", "15757226", "8562700"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "8344979" + }, + { + "type": "number", + "value": "15757226" + }, + { + "type": "number", + "value": "8562700" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f88061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608e565b60405180910390f35b604d6070565b60536070565b627f5593815262f06faa60208201526282a80c6040820152919050565b60405180606001604052806003906020820280368337509192915050565b60608101818360005b600381101560b957815162ffffff168352602092830192909101906001016097565b5050509291505056fea264697066735822122065de2703c1404bc2d2d609061a84efa0ede14b8ed1cde1e42e38f01386617f0964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint24[3] memory) {\n uint24[3] memory r;\n {\n uint24 r_0 = 8344979;\n r[0] = r_0;\n }\n {\n uint24 r_1 = 15757226;\n r[1] = r_1;\n }\n {\n uint24 r_2 = 8562700;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000007f55930000000000000000000000000000000000000000000000000000000000f06faa000000000000000000000000000000000000000000000000000000000082a80c" + }, + { + "name": "random-uint240[4]", + "type": "uint240[4]", + "value": [ + "514480607040960154401291872114618892073461297862846287960651314444366115", + "228516001026518288265775552216178745973401538511909912750428580089666972", + "175119565726077620885175450281984305191145113918028584240024980687480247", + "1177203938550527796094917503713397469270711462754137725396254756156296217" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "514480607040960154401291872114618892073461297862846287960651314444366115" + }, + { + "type": "number", + "value": "228516001026518288265775552216178745973401538511909912750428580089666972" + }, + { + "type": "number", + "value": "175119565726077620885175450281984305191145113918028584240024980687480247" + }, + { + "type": "number", + "value": "1177203938550527796094917503713397469270711462754137725396254756156296217" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6100566100f0565b61005e6100f0565b7d4a8b257541eabd5368d74203434ab2e1a2f0e89e9fd0d490cad2c253f12381527d211c212b32602505d6769dc6081f3ae4263d7e4766709713a04152eb9d9c60208201527d195f8bb33094355f189f2cb7766f023456a1dde4b89bd63a3022f2b8e5b760408201527daa90ebbfc3d3061dd66beeae4516f1da8a90c396272ff07bee09c1154c196060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561013f5781516001600160f01b0316835260209283019290910190600101610117565b5050509291505056fea2646970667358221220bb1f24204c7d013ea8ab4e4853e537b40f6ca0e13f37bfd9824f0621f074e90164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint240[4] memory) {\n uint240[4] memory r;\n {\n uint240 r_0 = 514480607040960154401291872114618892073461297862846287960651314444366115;\n r[0] = r_0;\n }\n {\n uint240 r_1 = 228516001026518288265775552216178745973401538511909912750428580089666972;\n r[1] = r_1;\n }\n {\n uint240 r_2 = 175119565726077620885175450281984305191145113918028584240024980687480247;\n r[2] = r_2;\n }\n {\n uint240 r_3 = 1177203938550527796094917503713397469270711462754137725396254756156296217;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00004a8b257541eabd5368d74203434ab2e1a2f0e89e9fd0d490cad2c253f1230000211c212b32602505d6769dc6081f3ae4263d7e4766709713a04152eb9d9c0000195f8bb33094355f189f2cb7766f023456a1dde4b89bd63a3022f2b8e5b70000aa90ebbfc3d3061dd66beeae4516f1da8a90c396272ff07bee09c1154c19" + }, + { + "name": "random-uint248[1]", + "type": "uint248[1]", + "value": ["59195936022490386012235769690349421751651891981772023621352212804491791917"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "59195936022490386012235769690349421751651891981772023621352212804491791917" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610107806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906098565b60405180910390f35b604d607a565b6053607a565b7e2180f34cc674d674705cc0b863d20457546aff19dfbb4f037c096b5307ce2d8152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560c75781516001600160f81b03168352918301919083019060010160a3565b505050509291505056fea2646970667358221220cf87a0c732929fafe6ba23b7dc1fb95487095e81f5f0c405e9911357ea902bab64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint248[1] memory) {\n uint248[1] memory r;\n {\n uint248 r_0 = 59195936022490386012235769690349421751651891981772023621352212804491791917;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x002180f34cc674d674705cc0b863d20457546aff19dfbb4f037c096b5307ce2d" + }, + { + "name": "random-uint256[]", + "type": "uint256[]", + "value": [ + "27017644089504856034854420775185329891797080391428430505235708978474084515908", + "27999462578369863326988120298556742218084853514083731877111140639222839153269", + "93876929988080399497146931895479910204051791862694130515536990526996679768735" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "27017644089504856034854420775185329891797080391428430505235708978474084515908" + }, + { + "type": "number", + "value": "27999462578369863326988120298556742218084853514083731877111140639222839153269" + }, + { + "type": "number", + "value": "93876929988080399497146931895479910204051791862694130515536990526996679768735" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101da806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061014a565b60405180910390f35b604080516003808252608082019092526060916000919060208201848036833701905050905060007f3bbb71d456b85d76654bf41bd876b117af1ea6658145f2ff5c01a79955a0c044905080826000815181106100ad576100ad61018e565b6020026020010181815250505060007f3de7225c1dc7016ca6271340a2d6c8984c76a45dc4be325ec0b62692784c9275905080826001815181106100f3576100f361018e565b6020026020010181815250505060007fcf8c759d31c45d5f65415212faef8722f499afd750cc5b0edef9bee5b8c83a9f905080826002815181106101395761013961018e565b602090810291909101015250919050565b6020808252825182820181905260009190848201906040850190845b8181101561018257835183529284019291840191600101610166565b50909695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212202844bfffe3603604054e312ffff6989d888527ef36de65b03a58be6f9e5cdba064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint256[] memory) {\n uint256[] memory r = new uint256[](3);\n {\n uint256 r_0 = 27017644089504856034854420775185329891797080391428430505235708978474084515908;\n r[0] = r_0;\n }\n {\n uint256 r_1 = 27999462578369863326988120298556742218084853514083731877111140639222839153269;\n r[1] = r_1;\n }\n {\n uint256 r_2 = 93876929988080399497146931895479910204051791862694130515536990526996679768735;\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000033bbb71d456b85d76654bf41bd876b117af1ea6658145f2ff5c01a79955a0c0443de7225c1dc7016ca6271340a2d6c8984c76a45dc4be325ec0b62692784c9275cf8c759d31c45d5f65415212faef8722f499afd750cc5b0edef9bee5b8c83a9f" + }, + { + "name": "random-uint256[4]", + "type": "uint256[4]", + "value": [ + "115533388616945167771676624227617874006047519974371728286849719448165158675980", + "39721604166577722091873079185350248360161250236324286497757331971646722744096", + "71939548414177730162830766342328229346753234847972979868076219585837008931888", + "40875488139423872168645088190646581834960526004867082913005499332228236954332" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "115533388616945167771676624227617874006047519974371728286849719448165158675980" + }, + { + "type": "number", + "value": "39721604166577722091873079185350248360161250236324286497757331971646722744096" + }, + { + "type": "number", + "value": "71939548414177730162830766342328229346753234847972979868076219585837008931888" + }, + { + "type": "number", + "value": "40875488139423872168645088190646581834960526004867082913005499332228236954332" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6100566100f8565b61005e6100f8565b7fff6d94a4ad6595f646fc1b54c067c5f341be96e69a976a929668aca3c7fae60c81527f57d1a198e5fe52bda5af7276573fd1443133fb550d045eaa7078cc2ddbbd1f2060208201527f9f0c576a8e31085f769ef35b163ccc3a35bcf8bfe99c040d75e244a19fcfcc3060408201527f5a5eb4d830e68903170b92e3b0ab88557961183c3fcc91e11eeb81cda08bcadc6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101561013e57815183526020928301929091019060010161011f565b5050509291505056fea2646970667358221220e26be59b5f6e379185ef7d64f11be6974340f64a9d6178230ba5743f8f5da10b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint256[4] memory) {\n uint256[4] memory r;\n {\n uint256 r_0 = 115533388616945167771676624227617874006047519974371728286849719448165158675980;\n r[0] = r_0;\n }\n {\n uint256 r_1 = 39721604166577722091873079185350248360161250236324286497757331971646722744096;\n r[1] = r_1;\n }\n {\n uint256 r_2 = 71939548414177730162830766342328229346753234847972979868076219585837008931888;\n r[2] = r_2;\n }\n {\n uint256 r_3 = 40875488139423872168645088190646581834960526004867082913005499332228236954332;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xff6d94a4ad6595f646fc1b54c067c5f341be96e69a976a929668aca3c7fae60c57d1a198e5fe52bda5af7276573fd1443133fb550d045eaa7078cc2ddbbd1f209f0c576a8e31085f769ef35b163ccc3a35bcf8bfe99c040d75e244a19fcfcc305a5eb4d830e68903170b92e3b0ab88557961183c3fcc91e11eeb81cda08bcadc" + }, + { + "name": "random-uint32[4]", + "type": "uint32[4]", + "value": ["3239031139", "3136279911", "3664140535", "1100954494"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "3239031139" + }, + { + "type": "number", + "value": "3136279911" + }, + { + "type": "number", + "value": "3664140535" + }, + { + "type": "number", + "value": "1100954494" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610106806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190609b565b60405180910390f35b604d607d565b6053607d565b63c10fb163815263baefd567602082015263da6658f7604082015263419f3b7e6060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560c757815163ffffffff1683526020928301929091019060010160a4565b5050509291505056fea2646970667358221220778bbb7779503c5d2201128b7f9fa8b4122d347d92347ab787ca5f841536fb1b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint32[4] memory) {\n uint32[4] memory r;\n {\n uint32 r_0 = 3239031139;\n r[0] = r_0;\n }\n {\n uint32 r_1 = 3136279911;\n r[1] = r_1;\n }\n {\n uint32 r_2 = 3664140535;\n r[2] = r_2;\n }\n {\n uint32 r_3 = 1100954494;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000c10fb16300000000000000000000000000000000000000000000000000000000baefd56700000000000000000000000000000000000000000000000000000000da6658f700000000000000000000000000000000000000000000000000000000419f3b7e" + }, + { + "name": "random-uint40[1]", + "type": "uint40[1]", + "value": ["222335918422"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "222335918422" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060eb8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607e565b60405180910390f35b604d6060565b60536060565b6433c440e1568152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560ab57815164ffffffffff16835291830191908301906001016089565b505050509291505056fea2646970667358221220605ea4fc3663603bc86e8d37a5462926a0c487dc62ae186937f018f459be6bce64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint40[1] memory) {\n uint40[1] memory r;\n {\n uint40 r_0 = 222335918422;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000033c440e156" + }, + { + "name": "random-uint72[2]", + "type": "uint72[2]", + "value": ["1955314549752961860144", "801276164215355966511"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "1955314549752961860144" + }, + { + "type": "number", + "value": "801276164215355966511" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610101806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e91906091565b60405180910390f35b604d6073565b60536073565b6869ff70bf4cc22682308152682b6ff0ca02c3db842f6020820152919050565b60405180604001604052806002906020820280368337509192915050565b60408101818360005b600281101560c257815168ffffffffffffffffff16835260209283019290910190600101609a565b5050509291505056fea2646970667358221220a9c3a12d8fe5619e2b732317513a6552b222faeeb475aa5fb977fac3d3965efa64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint72[2] memory) {\n uint72[2] memory r;\n {\n uint72 r_0 = 1955314549752961860144;\n r[0] = r_0;\n }\n {\n uint72 r_1 = 801276164215355966511;\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000069ff70bf4cc226823000000000000000000000000000000000000000000000002b6ff0ca02c3db842f" + }, + { + "name": "random-uint72[4]", + "type": "uint72[4]", + "value": [ + "4174641489652064450480", + "3220499808493533651786", + "4593240620151749612599", + "2159259748486513394081" + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "4174641489652064450480" + }, + { + "type": "number", + "value": "3220499808493533651786" + }, + { + "type": "number", + "value": "4593240620151749612599" + }, + { + "type": "number", + "value": "2159259748486513394081" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061011f806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e919060af565b60405180910390f35b604d6091565b60536091565b68e24ec9eca3d6dbf7b0815268ae9569b8e2b69be34a602082015268f90004c7ff07fa1437604082015268750dbfa50001ef81a16060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560e057815168ffffffffffffffffff1683526020928301929091019060010160b8565b5050509291505056fea26469706673582212206cb32bb5e6e4398105049272dc04acdc76a585b1e088148da855a0027dce62e864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint72[4] memory) {\n uint72[4] memory r;\n {\n uint72 r_0 = 4174641489652064450480;\n r[0] = r_0;\n }\n {\n uint72 r_1 = 3220499808493533651786;\n r[1] = r_1;\n }\n {\n uint72 r_2 = 4593240620151749612599;\n r[2] = r_2;\n }\n {\n uint72 r_3 = 2159259748486513394081;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000e24ec9eca3d6dbf7b00000000000000000000000000000000000000000000000ae9569b8e2b69be34a0000000000000000000000000000000000000000000000f90004c7ff07fa14370000000000000000000000000000000000000000000000750dbfa50001ef81a1" + }, + { + "name": "random-uint8[1]", + "type": "uint8[1]", + "value": ["70"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "70" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060e38061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190607a565b60405180910390f35b604d605c565b6053605c565b60468152919050565b60405180602001604052806001906020820280368337509192915050565b602081810190828460005b600181101560a357815160ff16835291830191908301906001016085565b505050509291505056fea264697066735822122017b056ce618038fb7e4bb8fa49841d7d6f310a8c8838f315b70bd78c4961882664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint8[1] memory) {\n uint8[1] memory r;\n {\n uint8 r_0 = 70;\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000046" + }, + { + "name": "random-uint8[4]", + "type": "uint8[4]", + "value": ["228", "127", "183", "39"], + "verbose": { + "type": "array", + "value": [ + { + "type": "number", + "value": "228" + }, + { + "type": "number", + "value": "127" + }, + { + "type": "number", + "value": "183" + }, + { + "type": "number", + "value": "39" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5060f78061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336047565b604051603e9190608f565b60405180910390f35b604d6071565b60536071565b60e48152607f602082015260b7604082015260276060820152919050565b60405180608001604052806004906020820280368337509192915050565b60808101818360005b600481101560b857815160ff168352602092830192909101906001016098565b5050509291505056fea26469706673582212204efb8340c8e04e725b475ceec1a08a0012ff5c86fbb3a5d92e629d1cfdb230f264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint8[4] memory) {\n uint8[4] memory r;\n {\n uint8 r_0 = 228;\n r[0] = r_0;\n }\n {\n uint8 r_1 = 127;\n r[1] = r_1;\n }\n {\n uint8 r_2 = 183;\n r[2] = r_2;\n }\n {\n uint8 r_3 = 39;\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000000000000000000027" + }, + { + "name": "random-((address,uint232,address))", + "type": "((address,uint232,address))", + "value": [ + [ + "0xd63a6204EfFCC524557B379Ebb728e6bd0Fcc72E", + "1202711231340597912750196706673581213733141612527951494039245154014462", + "0xbB74e998065C2C7364e41Ce2C0e863918023283B" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd63a6204EfFCC524557B379Ebb728e6bd0Fcc72E" + }, + { + "type": "number", + "value": "1202711231340597912750196706673581213733141612527951494039245154014462" + }, + { + "type": "address", + "value": "0xbB74e998065C2C7364e41Ce2C0e863918023283B" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6100dc6040805160808101825260006020820181815292820181905260608201529081526040805160808101825260006020820181815292820181905260608201529081526040805160608101825273d63a6204effcc524557b379ebb728e6bd0fcc72e81527c2c9c6d0cbfaf90fe97a1b952ea65a7dc291b5fd49a0054cc477c5dd4fe602082015273bb74e998065c2c7364e41ce2c0e863918023283b918101919091528152919050565b60408051915180516001600160a01b0390811684526020808301516001600160e81b03169085015290820151169082015260600160405180910390f3fea2646970667358221220fee4c796d564d674a1247098013138f4dc4b7578ab1eb88927d21b48a6a13eff64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_88bbf941 {\n address s_0;\n uint232 s_1;\n address s_2;\n }\n\n struct S_b9b4e408 {\n S_88bbf941 s_0;\n }\n\n function test () public pure returns (S_b9b4e408 memory) {\n S_b9b4e408 memory r;\n {\n S_88bbf941 memory r_0;\n {\n address r_0_0 = 0xd63a6204EfFCC524557B379Ebb728e6bd0Fcc72E;\n r_0.s_0 = r_0_0;\n }\n {\n uint232 r_0_1 = 1202711231340597912750196706673581213733141612527951494039245154014462;\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0xbB74e998065C2C7364e41Ce2C0e863918023283B;\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000d63a6204effcc524557b379ebb728e6bd0fcc72e0000002c9c6d0cbfaf90fe97a1b952ea65a7dc291b5fd49a0054cc477c5dd4fe000000000000000000000000bb74e998065c2c7364e41ce2c0e863918023283b" + }, + { + "name": "random-((address[4]),bytes31)", + "type": "((address[4]),bytes31)", + "value": [ + [ + [ + "0xAA0D21d578C29252ABf5189Bc8Ab92Dfbb8Ef9cE", + "0x90F169f622E80bf5e00C23A68FC3C68D454f6676", + "0x01B24a6383d81d78Dca10E16732f37E83BA9D7c9", + "0xf73C6F617C7bD92d752D0D579419c16DB0515268" + ] + ], + "0xaf61bac5d09bb10c4ff33db52d3ffd9a46c3f2964bfd4c659a57cebf93ff13" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xAA0D21d578C29252ABf5189Bc8Ab92Dfbb8Ef9cE" + }, + { + "type": "address", + "value": "0x90F169f622E80bf5e00C23A68FC3C68D454f6676" + }, + { + "type": "address", + "value": "0x01B24a6383d81d78Dca10E16732f37E83BA9D7c9" + }, + { + "type": "address", + "value": "0xf73C6F617C7bD92d752D0D579419c16DB0515268" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xaf61bac5d09bb10c4ff33db52d3ffd9a46c3f2964bfd4c659a57cebf93ff13" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101de806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061015d565b60405180910390f35b610056610107565b61005e610107565b610066610127565b61006e61013f565b73aa0d21d578c29252abf5189bc8ab92dfbb8ef9ce81527390f169f622e80bf5e00c23a68fc3c68d454f66766020808301919091527301b24a6383d81d78dca10e16732f37e83ba9d7c9604083015273f73c6f617c7bd92d752d0d579419c16db051526860608301529082529082527faf61bac5d09bb10c4ff33db52d3ffd9a46c3f2964bfd4c659a57cebf93ff130090820152919050565b604051806040016040528061011a610127565b8152600060209091015290565b604051806020016040528061013a61013f565b905290565b60405180608001604052806004906020820280368337509192915050565b81515160a08201908260005b60048110156101915782516001600160a01b0316825260209283019290910190600101610169565b50505060ff1960208401511660808301529291505056fea2646970667358221220303702ef67f08e2f49ebc995aace7eaf79e895a0af97906ddd5e9e836b6761ac64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5a8b99b2 {\n address[4] s_0;\n }\n\n struct S_48cf2aa9 {\n S_5a8b99b2 s_0;\n bytes31 s_1;\n }\n\n function test () public pure returns (S_48cf2aa9 memory) {\n S_48cf2aa9 memory r;\n {\n S_5a8b99b2 memory r_0;\n {\n address[4] memory r_0_0;\n {\n address r_0_0_0 = 0xAA0D21d578C29252ABf5189Bc8Ab92Dfbb8Ef9cE;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x90F169f622E80bf5e00C23A68FC3C68D454f6676;\n r_0_0[1] = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x01B24a6383d81d78Dca10E16732f37E83BA9D7c9;\n r_0_0[2] = r_0_0_2;\n }\n {\n address r_0_0_3 = 0xf73C6F617C7bD92d752D0D579419c16DB0515268;\n r_0_0[3] = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes31 r_1 = bytes31(0xaf61bac5d09bb10c4ff33db52d3ffd9a46c3f2964bfd4c659a57cebf93ff13);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000aa0d21d578c29252abf5189bc8ab92dfbb8ef9ce00000000000000000000000090f169f622e80bf5e00c23a68fc3c68d454f667600000000000000000000000001b24a6383d81d78dca10e16732f37e83ba9d7c9000000000000000000000000f73c6f617c7bd92d752d0d579419c16db0515268af61bac5d09bb10c4ff33db52d3ffd9a46c3f2964bfd4c659a57cebf93ff1300" + }, + { + "name": "random-((bool,bytes2),address)", + "type": "((bool,bytes2),address)", + "value": [[true, "0xa697"], "0x7325CF8De3A9D6DDd2319D73c691953eeA8fCe54"], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xa697" + } + ] + }, + { + "type": "address", + "value": "0x7325CF8De3A9D6DDd2319D73c691953eeA8fCe54" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101098061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160808082018352600082840181815260608085018390529084526020938401829052845192830185528285018281528382018390528352828401918252845180860186526001815261a69760f01b81860190815293819052737325cf8de3a9d6ddd2319d73c691953eea8fce548352855190511515815292516001600160f01b03191693830193909352516001600160a01b0316818401529151918290030190f3fea2646970667358221220aa0754a88f1ca5e54bee1cf4425346253b5b0902aee9c4a061473608ffcd93a164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2e66dfdd {\n bool s_0;\n bytes2 s_1;\n }\n\n struct S_1747f04b {\n S_2e66dfdd s_0;\n address s_1;\n }\n\n function test () public pure returns (S_1747f04b memory) {\n S_1747f04b memory r;\n {\n S_2e66dfdd memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n bytes2 r_0_1 = bytes2(0xa697);\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x7325CF8De3A9D6DDd2319D73c691953eeA8fCe54;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001a6970000000000000000000000000000000000000000000000000000000000000000000000000000000000007325cf8de3a9d6ddd2319d73c691953eea8fce54" + }, + { + "name": "random-((bool,uint64,bool))", + "type": "((bool,uint64,bool))", + "value": [[false, "10122368125911376255", false]], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "10122368125911376255" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ef8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160808082018352600060208084018281528486018390526060808601849052945284519283018552828101828152838601839052838501839052835284518085018652828152808601928352678c79e02e0eaf217f818301908152938190528551905115158152925167ffffffffffffffff1690830152511515818401529151918290030190f3fea26469706673582212204b16dde0e5d37eb141d309c0abbc967bbc8e6bd47d70092feaa00b479fa13dc664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_62b59dd3 {\n bool s_0;\n uint64 s_1;\n bool s_2;\n }\n\n struct S_27bcb218 {\n S_62b59dd3 s_0;\n }\n\n function test () public pure returns (S_27bcb218 memory) {\n S_27bcb218 memory r;\n {\n S_62b59dd3 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n uint64 r_0_1 = 10122368125911376255;\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c79e02e0eaf217f0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes18,bool,bytes27))", + "type": "((bytes18,bool,bytes27))", + "value": [ + [ + "0x9ff6bfcc5e829b3b8cccc4f189712f198499", + false, + "0x8e3e1895f53a15420ba68ae7cce7af58364560798d36e7dfee7b3d" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9ff6bfcc5e829b3b8cccc4f189712f198499" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x8e3e1895f53a15420ba68ae7cce7af58364560798d36e7dfee7b3d" + } + ] + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061012a8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160808082018352600060208084018281528486018390526060808601849052945284519283018552828101828152838601839052838501839052835284518085018652808201928352719ff6bfcc5e829b3b8cccc4f189712f19849960701b81527f8e3e1895f53a15420ba68ae7cce7af58364560798d36e7dfee7b3d000000000081870190815293819052855190516dffffffffffffffffffffffffffff191681529151151590820152905164ffffffffff1916818401529151918290030190f3fea264697066735822122012f4ca235c20c00e3eeed61bba4bd1a9f8e71d60775eba7d9ef76cd67b91610764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_59761edf {\n bytes18 s_0;\n bool s_1;\n bytes27 s_2;\n }\n\n struct S_040a1ce6 {\n S_59761edf s_0;\n }\n\n function test () public pure returns (S_040a1ce6 memory) {\n S_040a1ce6 memory r;\n {\n S_59761edf memory r_0;\n {\n bytes18 r_0_0 = bytes18(0x9ff6bfcc5e829b3b8cccc4f189712f198499);\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n bytes27 r_0_2 = bytes27(0x8e3e1895f53a15420ba68ae7cce7af58364560798d36e7dfee7b3d);\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x9ff6bfcc5e829b3b8cccc4f189712f198499000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e3e1895f53a15420ba68ae7cce7af58364560798d36e7dfee7b3d0000000000" + }, + { + "name": "random-((int16[3]),uint56)", + "type": "((int16[3]),uint56)", + "value": [[["2658", "28450", "-10"]], "3910011693527520"], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2658" + }, + { + "type": "number", + "value": "28450" + }, + { + "type": "number", + "value": "-10" + } + ] + } + ] + }, + { + "type": "number", + "value": "3910011693527520" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610174806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f4565b60405180910390f35b61005661009e565b61005e61009e565b6100666100be565b61006e6100d6565b610a628152616f226020808301919091526009196040830152908252908252660de4228a0f71e090820152919050565b60405180604001604052806100b16100be565b8152600060209091015290565b60405180602001604052806100d16100d6565b905290565b60405180606001604052806003906020820280368337509192915050565b81515160808201908260005b6003811015610122578251600190810b83526020938401939092019101610100565b50505066ffffffffffffff60208401511660608301529291505056fea264697066735822122046458b9df03cc43e806574c4dce0c7f4d037501641e2ad17b5dcf0b4051f172464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7946e555 {\n int16[3] s_0;\n }\n\n struct S_f3b2ca69 {\n S_7946e555 s_0;\n uint56 s_1;\n }\n\n function test () public pure returns (S_f3b2ca69 memory) {\n S_f3b2ca69 memory r;\n {\n S_7946e555 memory r_0;\n {\n int16[3] memory r_0_0;\n {\n int16 r_0_0_0 = 2658;\n r_0_0[0] = r_0_0_0;\n }\n {\n int16 r_0_0_1 = 28450;\n r_0_0[1] = r_0_0_1;\n }\n {\n int16 r_0_0_2 = -10;\n r_0_0[2] = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n uint56 r_1 = 3910011693527520;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000a620000000000000000000000000000000000000000000000000000000000006f22fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000000000000000000000000000000000000000000000000000de4228a0f71e0" + }, + { + "name": "random-((int72,int240),uint184)", + "type": "((int72,int240),uint184)", + "value": [ + [ + "2054931406418876879227", + "-522078630691396206035634848587365494504838641454358570106575967345500506" + ], + "3644028748840914670531209831611415350926741455808483988" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2054931406418876879227" + }, + { + "type": "number", + "value": "-522078630691396206035634848587365494504838641454358570106575967345500506" + } + ] + }, + { + "type": "number", + "value": "3644028748840914670531209831611415350926741455808483988" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101298061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516080808201835260008284018181526060808501839052908452602093840182905284519283018552828501828152838201839052835282840191825284518086018652686f65e6eaa50f04d17b81527fffffb45b06fe6042fc81134e6f72a72da0fb7768caf6297ef2fbef36f65f1ea68186019081529381905276260ba1a63699aae840497f4d05e7475c45238d032fd29483528551905160080b81529251601d0b93830193909352516001600160b81b0316818401529151918290030190f3fea2646970667358221220f55f60720566e41664d942a426515aa715798bd5342f1c40aa1f93d19daa9b3964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_aaf4d0e8 {\n int72 s_0;\n int240 s_1;\n }\n\n struct S_ac33bc48 {\n S_aaf4d0e8 s_0;\n uint184 s_1;\n }\n\n function test () public pure returns (S_ac33bc48 memory) {\n S_ac33bc48 memory r;\n {\n S_aaf4d0e8 memory r_0;\n {\n int72 r_0_0 = 2054931406418876879227;\n r_0.s_0 = r_0_0;\n }\n {\n int240 r_0_1 = -522078630691396206035634848587365494504838641454358570106575967345500506;\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n uint184 r_1 = 3644028748840914670531209831611415350926741455808483988;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000006f65e6eaa50f04d17bffffb45b06fe6042fc81134e6f72a72da0fb7768caf6297ef2fbef36f65f1ea6000000000000000000260ba1a63699aae840497f4d05e7475c45238d032fd294" + }, + { + "name": "random-((string,bytes24),int200)", + "type": "((string,bytes24),int200)", + "value": [ + [ + "Moo é🚀o M éo🚀 🚀🚀ééooooMé MéMo🚀 éMMé MooooéooMo🚀o🚀Méé o", + "0xfa7fcea83029ce3568855d7b238df6bd8a726a599c055f3e" + ], + "677259901820909917913219958219065613738756769035096129228202" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o M éo🚀 🚀🚀ééooooMé MéMo🚀 éMMé MooooéooMo🚀o🚀Méé o" + }, + { + "type": "hexstring", + "value": "0xfa7fcea83029ce3568855d7b238df6bd8a726a599c055f3e" + } + ] + }, + { + "type": "number", + "value": "677259901820909917913219958219065613738756769035096129228202" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610236806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610119565b60405180910390f35b60408051608081018252606091810182815260009282018390528152602081019190915260408051608081018252606091810182815260009282018390528152602081019190915260408051808201909152606081526000602082015260006040518060800160405280605681526020016101ab605691398252507ffa7fcea83029ce3568855d7b238df6bd8a726a599c055f3e0000000000000000602080830191909152908252786be4cb4d25be2e5b138d7738170d60f0c6577088c8b6274daa90820152919050565b60006020808352835160408285015280516040606086015280518060a087015260005b818110156101585782810185015187820160c00152840161013c565b8181111561016a57600060c083890101525b508284015167ffffffffffffffff191660808701529286015192610193604087018560180b9052565b601f01601f19169490940160c0019594505050505056fe4d6f6f20c3a9f09f9a806f204d20c3a96ff09f9a8020f09f9a80f09f9a80c3a9c3a96f6f6f6f4dc3a9204dc3a94d6ff09f9a8020c3a94d4dc3a9204d6f6f6f6fc3a96f6f4d6ff09f9a806ff09f9a804dc3a9c3a9206fa26469706673582212204aa4def073f9e3b99335410a3774ede939b3625ed16c8daa21e5c9f6e5da8fda64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_af191bbc {\n string s_0;\n bytes24 s_1;\n }\n\n struct S_3f6e9b4f {\n S_af191bbc s_0;\n int200 s_1;\n }\n\n function test () public pure returns (S_3f6e9b4f memory) {\n S_3f6e9b4f memory r;\n {\n S_af191bbc memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀o M éo🚀 🚀🚀ééooooMé MéMo🚀 éMMé MooooéooMo🚀o🚀Méé o\";\n r_0.s_0 = r_0_0;\n }\n {\n bytes24 r_0_1 = bytes24(0xfa7fcea83029ce3568855d7b238df6bd8a726a599c055f3e);\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n int200 r_1 = 677259901820909917913219958219065613738756769035096129228202;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000006be4cb4d25be2e5b138d7738170d60f0c6577088c8b6274daa0000000000000000000000000000000000000000000000000000000000000040fa7fcea83029ce3568855d7b238df6bd8a726a599c055f3e000000000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a806f204d20c3a96ff09f9a8020f09f9a80f09f9a80c3a9c3a96f6f6f6f4dc3a9204dc3a94d6ff09f9a8020c3a94d4dc3a9204d6f6f6f6fc3a96f6f4d6ff09f9a806ff09f9a804dc3a9c3a9206f00000000000000000000" + }, + { + "name": "random-((string),bool,string)", + "type": "((string),bool,string)", + "value": [ + ["Moo é🚀🚀🚀🚀éoéoMooMM oéo🚀oooo 🚀éoo🚀🚀o Méo🚀MoooM éo"], + true, + "Moo é🚀🚀 M Mo oé🚀éé🚀oéMéM🚀oéMooMé o🚀🚀é🚀MM oMo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀éoéoMooMM oéo🚀oooo 🚀éoo🚀🚀o Méo🚀MoooM éo" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀 M Mo oé🚀éé🚀oéMéM🚀oéMooMé o🚀🚀é🚀MM oMo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061013e565b60405180910390f35b604080516080810182526060808201818152825260006020830152918101919091526040805160808101825260608082018181528252600060208301529181019190915260408051602081019091526060815260006040518060800160405280605281526020016101e560529139825250815260016020808301919091526040805160808101909152604d80825260009261019890830139604083015250919050565b6000815180845260005b81811015610117576020818501810151868301820152016100fb565b81811115610129576000602083870101525b50601f01601f19169290920160200192915050565b602081526000825160606020840152805190506020608084015261016560a08401826100f1565b90506020840151151560408401526040840151601f1984830301606085015261018e82826100f1565b9594505050505056fe4d6f6f20c3a9f09f9a80f09f9a80204d204d6f206fc3a9f09f9a80c3a9c3a9f09f9a806fc3a94dc3a94df09f9a806fc3a94d6f6f4dc3a9206ff09f9a80f09f9a80c3a9f09f9a804d4d206f4d6f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80c3a96fc3a96f4d6f6f4d4d206fc3a96ff09f9a806f6f6f6f20f09f9a80c3a96f6ff09f9a80f09f9a806f204dc3a96ff09f9a804d6f6f6f4d20c3a96fa2646970667358221220e7db1ea62f22526fee582b45ea978cd09e39cf9e2d4559e8565ceb6d70c7c55e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_5b99133f {\n S_97fc4627 s_0;\n bool s_1;\n string s_2;\n }\n\n function test () public pure returns (S_5b99133f memory) {\n S_5b99133f memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀🚀🚀🚀éoéoMooMM oéo🚀oooo 🚀éoo🚀🚀o Méo🚀MoooM éo\";\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀🚀 M Mo oé🚀éé🚀oéMéM🚀oéMooMé o🚀🚀é🚀MM oMo\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80c3a96fc3a96f4d6f6f4d4d206fc3a96ff09f9a806f6f6f6f20f09f9a80c3a96f6ff09f9a80f09f9a806f204dc3a96ff09f9a804d6f6f6f4d20c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80f09f9a80204d204d6f206fc3a9f09f9a80c3a9c3a9f09f9a806fc3a94dc3a94df09f9a806fc3a94d6f6f4dc3a9206ff09f9a80f09f9a80c3a9f09f9a804d4d206f4d6f00000000000000000000000000000000000000" + }, + { + "name": "random-((string),int240[])", + "type": "((string),int240[])", + "value": [ + ["Moo é🚀"], + ["252523408532637469981311281040757655089179641198058228381679871412938339"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "252523408532637469981311281040757655089179641198058228381679871412938339" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610232806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610160565b60405180910390f35b6040805160608082018352818301818152825260208083018290528351808301855280850183815281528082018390528451808301865292835284518086018652600a8152689adede418753e13f3560b71b81840152835291825283516001808252818601909552929391926000929091828101908036833701905050905060007d24969d22139e0b183d02a4844ee59bc5daf76908b72dbe8fb2a7d4cc266390508082600081518110610104576101046101e6565b601d9290920b60209283029190910182015283019190915250919050565b600081518084526020808501945080840160005b83811015610155578151601d0b87529582019590820190600101610136565b509495945050505050565b60006020808352835160408285015280519050816060850152805180608086015260005b818110156101a05782810184015186820160a001528301610184565b818111156101b257600060a083880101525b5091850151601f92909201601f19168401848103608001604086015290506101dd60a0820183610122565b95945050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220f0f6c37670c501d11faaf48d4e5f40d651b6addd59e3ff768cdeb1f80bc86f0564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_1506b7e8 {\n S_97fc4627 s_0;\n int240[] s_1;\n }\n\n function test () public pure returns (S_1506b7e8 memory) {\n S_1506b7e8 memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n int240[] memory r_1 = new int240[](1);\n {\n int240 r_1_0 = 252523408532637469981311281040757655089179641198058228381679871412938339;\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000024969d22139e0b183d02a4844ee59bc5daf76908b72dbe8fb2a7d4cc2663" + }, + { + "name": "random-((uint152,bytes19,uint200))", + "type": "((uint152,bytes19,uint200))", + "value": [ + [ + "2830297792035068877125201956485875577552225635", + "0x76ab6ec6162b4f55ad50465f87ebc4b7535e1c", + "55376187233103788975733087636124019124977976343850725730404" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2830297792035068877125201956485875577552225635" + }, + { + "type": "hexstring", + "value": "0x76ab6ec6162b4f55ad50465f87ebc4b7535e1c" + }, + { + "type": "number", + "value": "55376187233103788975733087636124019124977976343850725730404" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610164806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6100d960408051608081018252600060208201818152928201819052606082015290815260408051608081018252600060208201818152928201819052606082015290815260408051606081018252727eea39aa095777375d69cf513dd5c9bf19c5638152721daadbb1858ad3d56b541197e1faf12dd4d787606a1b60208201527808d26a5f041efc2c1336ca579427e74727ee1e82d92e48e864918101919091528152919050565b604080519151805172ffffffffffffffffffffffffffffffffffffff1683526020808201516cffffffffffffffffffffffffff1916908401528101516001600160c81b03169082015260600160405180910390f3fea2646970667358221220352498a1028c8501fd09516e410b94f04bb2516b9f5b8d9a24a4c9764bbec01864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_456f96ed {\n uint152 s_0;\n bytes19 s_1;\n uint200 s_2;\n }\n\n struct S_0cdce7a2 {\n S_456f96ed s_0;\n }\n\n function test () public pure returns (S_0cdce7a2 memory) {\n S_0cdce7a2 memory r;\n {\n S_456f96ed memory r_0;\n {\n uint152 r_0_0 = 2830297792035068877125201956485875577552225635;\n r_0.s_0 = r_0_0;\n }\n {\n bytes19 r_0_1 = bytes19(0x76ab6ec6162b4f55ad50465f87ebc4b7535e1c);\n r_0.s_1 = r_0_1;\n }\n {\n uint200 r_0_2 = 55376187233103788975733087636124019124977976343850725730404;\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000007eea39aa095777375d69cf513dd5c9bf19c56376ab6ec6162b4f55ad50465f87ebc4b7535e1c000000000000000000000000000000000000000008d26a5f041efc2c1336ca579427e74727ee1e82d92e48e864" + }, + { + "name": "random-(address,(string[1]))", + "type": "(address,(string[1]))", + "value": [ + "0x4070009fa816BA62361f2991A6230F796B409D29", + [["Moo é🚀🚀M MéMoooMMM M🚀🚀 MoMoéM oMMoéMo🚀oé🚀Méé o oo 🚀oé🚀M o 🚀o"]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4070009fa816BA62361f2991A6230F796B409D29" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀M MéMoooMMM M🚀🚀 MoMoéM oMMoéMo🚀oé🚀Méé o oo 🚀oé🚀M o 🚀o" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061024c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010d565b60405180910390f35b6100566100af565b61005e6100af565b734070009fa816ba62361f2991a6230f796b409d29815261007d6100d7565b6100856100e6565b60006040518060a00160405280606181526020016101b66061913982525081526020820152919050565b604051806040016040528060006001600160a01b031681526020016100d26100d7565b905290565b60405180602001604052806100d25b60405180602001604052806001905b60608152602001906001900390816100f55790505090565b602080825282516001600160a01b0316828201528281015160408084015251606083018290526000919060a084016080850184805b60018110156101a857878403607f1901835284518051808652835b81811015610178578281018901518782018a0152880161015d565b8181111561018857848983890101525b5095870195601f01601f1916949094018601935091850191600101610142565b509197965050505050505056fe4d6f6f20c3a9f09f9a80f09f9a804d2020204dc3a94d6f6f6f4d4d4d204df09f9a80f09f9a80204d6f4d6fc3a94d206f4d4d6fc3a94d6ff09f9a806fc3a9f09f9a804dc3a9c3a9206f206f6f20f09f9a806fc3a9f09f9a804d206f20f09f9a806fa2646970667358221220096969914ecca7431c82ba1032f382e6d35c568363126f40908bf23dc5c17e6464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c6e6ec6b {\n string[1] s_0;\n }\n\n struct S_349b91a2 {\n address s_0;\n S_c6e6ec6b s_1;\n }\n\n function test () public pure returns (S_349b91a2 memory) {\n S_349b91a2 memory r;\n {\n address r_0 = 0x4070009fa816BA62361f2991A6230F796B409D29;\n r.s_0 = r_0;\n }\n {\n S_c6e6ec6b memory r_1;\n {\n string[1] memory r_1_0;\n {\n string memory r_1_0_0 = unicode\"Moo é🚀🚀M MéMoooMMM M🚀🚀 MoMoéM oMMoéMo🚀oé🚀Méé o oo 🚀oé🚀M o 🚀o\";\n r_1_0[0] = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000004070009fa816ba62361f2991a6230f796b409d2900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a80f09f9a804d2020204dc3a94d6f6f6f4d4d4d204df09f9a80f09f9a80204d6f4d6fc3a94d206f4d4d6fc3a94d6ff09f9a806fc3a9f09f9a804dc3a9c3a9206f206f6f20f09f9a806fc3a9f09f9a804d206f20f09f9a806f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,address,bool)", + "type": "(address,address,bool)", + "value": [ + "0xf0Cb095158D274ac266Cb70A4381459A835F3Be2", + "0xFE3D7d09aEf2b962F62f9C87306d9Db4a7972E9C", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xf0Cb095158D274ac266Cb70A4381459A835F3Be2" + }, + { + "type": "address", + "value": "0xFE3D7d09aEf2b962F62f9C87306d9Db4a7972E9C" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060eb8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284018190528351808301855280850191825273f0cb095158d274ac266cb70a4381459a835f3be280825273fe3d7d09aef2b962f62f9c87306d9db4a7972e9c918501918252855190815290516001600160a01b0316938101939093525115158284015291519081900390910190f3fea26469706673582212200c0ef59b78abd21ab307a4d4fb7845f25f817315d136d25764889ded1d5fae8364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e4bf9460 {\n address s_0;\n address s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_e4bf9460 memory) {\n S_e4bf9460 memory r;\n {\n address r_0 = 0xf0Cb095158D274ac266Cb70A4381459A835F3Be2;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xFE3D7d09aEf2b962F62f9C87306d9Db4a7972E9C;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000f0cb095158d274ac266cb70a4381459a835f3be2000000000000000000000000fe3d7d09aef2b962f62f9c87306d9db4a7972e9c0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,address,int256)", + "type": "(address,address,int256)", + "value": [ + "0x78Da65274297C7d93eaF41369c337bAc6Be41313", + "0x5475847eAbdc367e05fd2BC2DEF5967888463Ed8", + "36557931138438184980754714998928843767588762984944280455972475201632878571796" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x78Da65274297C7d93eaF41369c337bAc6Be41313" + }, + { + "type": "address", + "value": "0x5475847eAbdc367e05fd2BC2DEF5967888463Ed8" + }, + { + "type": "number", + "value": "36557931138438184980754714998928843767588762984944280455972475201632878571796" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101078061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184527378da65274297c7d93eaf41369c337bac6be41313808252735475847eabdc367e05fd2bc2def5967888463ed88285019081527f50d30e4659dc86a0e94c19cc96cea13453399a03edda8bc514919915e279b1149286019283528551918252516001600160a01b031693810193909352518284015291519081900390910190f3fea2646970667358221220c2102f852b580a58b22b6c1461f5a235d5d0c842c7715589f5d9b77ada33e7ef64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a3741ccb {\n address s_0;\n address s_1;\n int256 s_2;\n }\n\n function test () public pure returns (S_a3741ccb memory) {\n S_a3741ccb memory r;\n {\n address r_0 = 0x78Da65274297C7d93eaF41369c337bAc6Be41313;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x5475847eAbdc367e05fd2BC2DEF5967888463Ed8;\n r.s_1 = r_1;\n }\n {\n int256 r_2 = 36557931138438184980754714998928843767588762984944280455972475201632878571796;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000078da65274297c7d93eaf41369c337bac6be413130000000000000000000000005475847eabdc367e05fd2bc2def5967888463ed850d30e4659dc86a0e94c19cc96cea13453399a03edda8bc514919915e279b114" + }, + { + "name": "random-(address,bool,string)", + "type": "(address,bool,string)", + "value": ["0x236A91d37982Ad555ee719B069B40bF4B02638CE", true, "Moo é🚀oo"], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x236A91d37982Ad555ee719B069B40bF4B02638CE" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀oo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610164806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b604080516060808201835260008083526020808401919091529183018190528251808201845280840191825273236a91d37982ad555ee719b069b40bf4b02638ce815260018184015283518085018552600c81526b4d6f6f20c3a9f09f9a806f6f60a01b9381019390935291905290516100aa91906100b3565b60405180910390f35b6000602080835260018060a01b038451168184015280840151151560408401526040840151606080850152805180608086015260005b818110156101055782810184015186820160a0015283016100e9565b8181111561011757600060a083880101525b50601f01601f19169390930160a00194935050505056fea2646970667358221220730b2a417587782862055be1282144d606d212c0dc28a3b889e36b0a0b233d3e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5062cedd {\n address s_0;\n bool s_1;\n string s_2;\n }\n\n function test () public pure returns (S_5062cedd memory) {\n S_5062cedd memory r;\n {\n address r_0 = 0x236A91d37982Ad555ee719B069B40bF4B02638CE;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oo\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000236a91d37982ad555ee719b069b40bf4b02638ce00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a806f6f0000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bool)[1]", + "type": "(address,bool)[1]", + "value": [["0x761bc6d829BdBc0E78e7210b35C5146247E2D197", false]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x761bc6d829BdBc0E78e7210b35C5146247E2D197" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610145806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c6565b60405180910390f35b61005661008d565b61005e61008d565b604080518082019091526000602082015273761bc6d829bdbc0e78e7210b35c5146247e2d19781528152919050565b60405180602001604052806001905b604080518082019091526000808252602082015281526020019060019003908161009c5790505090565b604081810190828460005b600181101561010557815180516001600160a01b0316845260209081015115158185015292840192909101906001016100d1565b505050509291505056fea264697066735822122099945ff5fbe1a10f138b733c3c2a644d0be225fba0d70f988f4a7cb1c8b9cc4a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5cde0d08 {\n address s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_5cde0d08[1] memory) {\n S_5cde0d08[1] memory r;\n {\n S_5cde0d08 memory r_0;\n {\n address r_0_0 = 0x761bc6d829BdBc0E78e7210b35C5146247E2D197;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000761bc6d829bdbc0e78e7210b35c5146247e2d1970000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bytes24[1])", + "type": "(address,bytes24[1])", + "value": [ + "0xf8d8b25bbF74Dd0CB27872Ec8F8188773763c748", + ["0x225326c8af88067cd9867b7b86de0d5be650a45de9f6735b"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xf8d8b25bbF74Dd0CB27872Ec8F8188773763c748" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x225326c8af88067cd9867b7b86de0d5be650a45de9f6735b" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610177806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b6100566100aa565b61005e6100aa565b73f8d8b25bbf74dd0cb27872ec8f8188773763c748815261007d6100d2565b7f225326c8af88067cd9867b7b86de0d5be650a45de9f6735b000000000000000081526020820152919050565b604051806040016040528060006001600160a01b031681526020016100cd6100d2565b905290565b60405180602001604052806001906020820280368337509192915050565b81516001600160a01b0316815260208083015160408301919081840160005b600181101561013757825167ffffffffffffffff19168252918301919083019060010161010f565b505050509291505056fea2646970667358221220143c187cc426f668c0c1c26d9da0e0de75c78a5b1d0795ad6a37d0bfa185e7c964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_74677b20 {\n address s_0;\n bytes24[1] s_1;\n }\n\n function test () public pure returns (S_74677b20 memory) {\n S_74677b20 memory r;\n {\n address r_0 = 0xf8d8b25bbF74Dd0CB27872Ec8F8188773763c748;\n r.s_0 = r_0;\n }\n {\n bytes24[1] memory r_1;\n {\n bytes24 r_1_0 = bytes24(0x225326c8af88067cd9867b7b86de0d5be650a45de9f6735b);\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000f8d8b25bbf74dd0cb27872ec8f8188773763c748225326c8af88067cd9867b7b86de0d5be650a45de9f6735b0000000000000000" + }, + { + "name": "random-(address,int104,address)", + "type": "(address,int104,address)", + "value": [ + "0xAd5D3f55Fc995FdD5Cb598a1747F91d3E0F2C864", + "-5862027941565951016183945613344", + "0xcEc975C313B13506cdD1d244dF9ad26879D21Dcf" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xAd5D3f55Fc995FdD5Cb598a1747F91d3E0F2C864" + }, + { + "type": "number", + "value": "-5862027941565951016183945613344" + }, + { + "type": "address", + "value": "0xcEc975C313B13506cdD1d244dF9ad26879D21Dcf" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060f88061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516060808201835260008083526020808401829052928401528251808201845273ad5d3f55fc995fdd5cb598a1747f91d3e0f2c8648082526c49fd3bdd0ed3a1baba688dd01f1982850190815273cec975c313b13506cdd1d244df9ad26879d21dcf928601928352855191825251600c0b93810193909352516001600160a01b03168284015291519081900390910190f3fea2646970667358221220c06429c58a13b7b2f8730e829cbabbf3da3bcdc2f8f43d063782ddeb0784f77b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2f0618eb {\n address s_0;\n int104 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_2f0618eb memory) {\n S_2f0618eb memory r;\n {\n address r_0 = 0xAd5D3f55Fc995FdD5Cb598a1747F91d3E0F2C864;\n r.s_0 = r_0;\n }\n {\n int104 r_1 = -5862027941565951016183945613344;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xcEc975C313B13506cdD1d244dF9ad26879D21Dcf;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000ad5d3f55fc995fdd5cb598a1747f91d3e0f2c864ffffffffffffffffffffffffffffffffffffffb602c422f12c5e454597722fe0000000000000000000000000cec975c313b13506cdd1d244df9ad26879d21dcf" + }, + { + "name": "random-(address,int40,bytes27)", + "type": "(address,int40,bytes27)", + "value": [ + "0x323c5C00DCCb874F0FE6FCfEB0c8DFd2d3C59e93", + "315340144067", + "0x78889985bd598da9b8b120a4eef75818b349415a594f95fc2f9c40" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x323c5C00DCCb874F0FE6FCfEB0c8DFd2d3C59e93" + }, + { + "type": "number", + "value": "315340144067" + }, + { + "type": "hexstring", + "value": "0x78889985bd598da9b8b120a4eef75818b349415a594f95fc2f9c40" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060fa8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516060808201835260008083526020808401829052928401528251808201845273323c5c00dccb874f0fe6fcfeb0c8dfd2d3c59e9380825264496bbcbdc38285019081527f78889985bd598da9b8b120a4eef75818b349415a594f95fc2f9c40000000000092860192835285519182525160040b938101939093525164ffffffffff19168284015291519081900390910190f3fea26469706673582212209696fe5bea65449bd03a06bfa5d9ac6e17935cd90edb0dd24b7a9ce474e7fc4664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a13eaa97 {\n address s_0;\n int40 s_1;\n bytes27 s_2;\n }\n\n function test () public pure returns (S_a13eaa97 memory) {\n S_a13eaa97 memory r;\n {\n address r_0 = 0x323c5C00DCCb874F0FE6FCfEB0c8DFd2d3C59e93;\n r.s_0 = r_0;\n }\n {\n int40 r_1 = 315340144067;\n r.s_1 = r_1;\n }\n {\n bytes27 r_2 = bytes27(0x78889985bd598da9b8b120a4eef75818b349415a594f95fc2f9c40);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000323c5c00dccb874f0fe6fcfeb0c8dfd2d3c59e93000000000000000000000000000000000000000000000000000000496bbcbdc378889985bd598da9b8b120a4eef75818b349415a594f95fc2f9c400000000000" + }, + { + "name": "random-(address,int56,int72)", + "type": "(address,int56,int72)", + "value": [ + "0xa26cF64Dd8e063D776e57222022529265531e8Fd", + "31713823763577785", + "1095271230009679497321" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa26cF64Dd8e063D776e57222022529265531e8Fd" + }, + { + "type": "number", + "value": "31713823763577785" + }, + { + "type": "number", + "value": "1095271230009679497321" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516060808201835260008083526020808401829052928401528251808201845273a26cf64dd8e063d776e57222022529265531e8fd8082526670ab8dffe5bbb9828501908152683b5ff114b2b81b486992860192835285519182525160060b938101939093525160080b8284015291519081900390910190f3fea264697066735822122099ff434ec3c9ba36049a1de1b20870ae985c0d736cdaf6b720787a014fff4d0664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7f8d0a6a {\n address s_0;\n int56 s_1;\n int72 s_2;\n }\n\n function test () public pure returns (S_7f8d0a6a memory) {\n S_7f8d0a6a memory r;\n {\n address r_0 = 0xa26cF64Dd8e063D776e57222022529265531e8Fd;\n r.s_0 = r_0;\n }\n {\n int56 r_1 = 31713823763577785;\n r.s_1 = r_1;\n }\n {\n int72 r_2 = 1095271230009679497321;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000a26cf64dd8e063d776e57222022529265531e8fd0000000000000000000000000000000000000000000000000070ab8dffe5bbb900000000000000000000000000000000000000000000003b5ff114b2b81b4869" + }, + { + "name": "random-(address,string,address)", + "type": "(address,string,address)", + "value": [ + "0xF5aFCB071AB75192d1949d168240e4B16fEA7C8c", + "Moo é🚀", + "0x0FDAae7DC7eE1D7BB9C4e86b02BDda2Fb3B70C63" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF5aFCB071AB75192d1949d168240e4B16fEA7C8c" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0x0FDAae7DC7eE1D7BB9C4e86b02BDda2Fb3B70C63" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ec565b60405180910390f35b6100566100b9565b61005e6100b9565b73f5afcb071ab75192d1949d168240e4b16fea7c8c8152604080518082018252600a8152689adede418753e13f3560b71b602080830191909152830152730fdaae7dc7ee1d7bb9c4e86b02bdda2fb3b70c6390820152919050565b604051806060016040528060006001600160a01b031681526020016060815260200160006001600160a01b031681525090565b6000602080835260018060a01b03845116818401528084015160606040850152805180608086015260005b818110156101335782810184015186820160a001528301610117565b8181111561014557600060a083880101525b5060408601516001600160a01b03811660608701529250601f01601f19169390930160a00194935050505056fea26469706673582212203a64965ca2e0a987e56607100104d64e5ab2ae802e6b5aac6eddec5a197c53ac64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e32ad9fa {\n address s_0;\n string s_1;\n address s_2;\n }\n\n function test () public pure returns (S_e32ad9fa memory) {\n S_e32ad9fa memory r;\n {\n address r_0 = 0xF5aFCB071AB75192d1949d168240e4B16fEA7C8c;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x0FDAae7DC7eE1D7BB9C4e86b02BDda2Fb3B70C63;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f5afcb071ab75192d1949d168240e4b16fea7c8c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000fdaae7dc7ee1d7bb9c4e86b02bdda2fb3b70c63000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,string,int152)", + "type": "(address,string,int152)", + "value": [ + "0xB0D35c7e10E1d2B5BC1f5fA0Dd493817A50717dD", + "Moo é🚀ooé oééooé o🚀🚀Mo🚀MoéoM é é🚀M o🚀 o ééoé éMoo🚀 é ", + "-830794207441649821359002726163742903245621954" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xB0D35c7e10E1d2B5BC1f5fA0Dd493817A50717dD" + }, + { + "type": "string", + "value": "Moo é🚀ooé oééooé o🚀🚀Mo🚀MoéoM é é🚀M o🚀 o ééoé éMoo🚀 é " + }, + { + "type": "number", + "value": "-830794207441649821359002726163742903245621954" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061021c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610106565b60405180910390f35b61007e604051806060016040528060006001600160a01b0316815260200160608152602001600060120b81525090565b6100ae604051806060016040528060006001600160a01b0316815260200160608152602001600060120b81525090565b73b0d35c7e10e1d2b5bc1f5fa0dd493817a50717dd81526040805160808101909152605a8082526000919061018d60208301396020830152507225410cbe6d888f0c37855bca35f6ed104a4ac1196040820152919050565b6000602080835260018060a01b03845116818401528084015160606040850152805180608086015260005b8181101561014d5782810184015186820160a001528301610131565b8181111561015f57600060a083880101525b5060408601519250610176606086018460120b9052565b601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a806f6fc3a9206fc3a9c3a96f6fc3a9206ff09f9a80f09f9a804d6ff09f9a804d6fc3a96f4d20c3a920c3a9f09f9a804d206ff09f9a80206f2020c3a9c3a96fc3a9202020c3a94d6f6ff09f9a8020c3a920a2646970667358221220e04a16e590d98746e753b40f90afcfd11636bf3a2f7a492064cfb57ef369ea1b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_52385a12 {\n address s_0;\n string s_1;\n int152 s_2;\n }\n\n function test () public pure returns (S_52385a12 memory) {\n S_52385a12 memory r;\n {\n address r_0 = 0xB0D35c7e10E1d2B5BC1f5fA0Dd493817A50717dD;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀ooé oééooé o🚀🚀Mo🚀MoéoM é é🚀M o🚀 o ééoé éMoo🚀 é \";\n r.s_1 = r_1;\n }\n {\n int152 r_2 = -830794207441649821359002726163742903245621954;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b0d35c7e10e1d2b5bc1f5fa0dd493817a50717dd0000000000000000000000000000000000000000000000000000000000000060ffffffffffffffffffffffffffdabef341927770f3c87aa435ca0912efb5b53e000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806f6fc3a9206fc3a9c3a96f6fc3a9206ff09f9a80f09f9a804d6ff09f9a804d6fc3a96f4d20c3a920c3a9f09f9a804d206ff09f9a80206f2020c3a9c3a96fc3a9202020c3a94d6f6ff09f9a8020c3a920000000000000" + }, + { + "name": "random-(address,uint120)[2]", + "type": "(address,uint120)[2]", + "value": [ + ["0xE7961bBA0739D6f465039ac43D8338a61A974273", "17665720063500248284157095644479476"], + ["0x5B4bD46B87092b03c83c52f02dfCdcFD1159503b", "158265577808074869218355672702350318"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE7961bBA0739D6f465039ac43D8338a61A974273" + }, + { + "type": "number", + "value": "17665720063500248284157095644479476" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5B4bD46B87092b03c83c52f02dfCdcFD1159503b" + }, + { + "type": "number", + "value": "158265577808074869218355672702350318" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061019b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6100566100d5565b61005e6100d5565b60408051808201825273e7961bba0739d6f465039ac43d8338a61a97427381526e0366fcbc175102a06c16d1d2abbff46020808301919091529083528151808301909252735b4bd46b87092b03c83c52f02dfcdcfd1159503b82526e1e7b186e7d579c9b287b50b2d173ee82820152820152919050565b60405180604001604052806002905b60408051808201909152600080825260208201528152602001906001900390816100e45790505090565b60808101818360005b600281101561015c57815180516001600160a01b031684526020908101516effffffffffffffffffffffffffffff168185015260409093019290910190600101610117565b5050509291505056fea264697066735822122060634425ea54b022792922c3978f12834e8b95f3cb4804ae4ed0c63ebac77c5c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_aef3efbe {\n address s_0;\n uint120 s_1;\n }\n\n function test () public pure returns (S_aef3efbe[2] memory) {\n S_aef3efbe[2] memory r;\n {\n S_aef3efbe memory r_0;\n {\n address r_0_0 = 0xE7961bBA0739D6f465039ac43D8338a61A974273;\n r_0.s_0 = r_0_0;\n }\n {\n uint120 r_0_1 = 17665720063500248284157095644479476;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_aef3efbe memory r_1;\n {\n address r_1_0 = 0x5B4bD46B87092b03c83c52f02dfCdcFD1159503b;\n r_1.s_0 = r_1_0;\n }\n {\n uint120 r_1_1 = 158265577808074869218355672702350318;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000e7961bba0739d6f465039ac43d8338a61a97427300000000000000000000000000000000000366fcbc175102a06c16d1d2abbff40000000000000000000000005b4bd46b87092b03c83c52f02dfcdcfd1159503b00000000000000000000000000000000001e7b186e7d579c9b287b50b2d173ee" + }, + { + "name": "random-(address,uint128,int120)", + "type": "(address,uint128,int120)", + "value": [ + "0x39A96859D728145c3dEC52128858A6c9924d43b7", + "151907670483604861882525997696023917033", + "-521790228120126876734199000823764934" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x39A96859D728145c3dEC52128858A6c9924d43b7" + }, + { + "type": "number", + "value": "151907670483604861882525997696023917033" + }, + { + "type": "number", + "value": "-521790228120126876734199000823764934" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ff8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184527339a96859d728145c3dec52128858a6c9924d43b78082526f72485a6729d3c05d1dcc1f15aad5f1e98285019081526e647e3e964897314d5fda1be37c17c5199286019283528551918252516fffffffffffffffffffffffffffffffff169381019390935251600e0b8284015291519081900390910190f3fea26469706673582212200e814d1583cb4de2017a02551fae7d93f9268572d1910fa77e2da718a6c496b764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_865f3a60 {\n address s_0;\n uint128 s_1;\n int120 s_2;\n }\n\n function test () public pure returns (S_865f3a60 memory) {\n S_865f3a60 memory r;\n {\n address r_0 = 0x39A96859D728145c3dEC52128858A6c9924d43b7;\n r.s_0 = r_0;\n }\n {\n uint128 r_1 = 151907670483604861882525997696023917033;\n r.s_1 = r_1;\n }\n {\n int120 r_2 = -521790228120126876734199000823764934;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000039a96859d728145c3dec52128858a6c9924d43b70000000000000000000000000000000072485a6729d3c05d1dcc1f15aad5f1e9ffffffffffffffffffffffffffffffffff9b81c169b768ceb2a025e41c83e83a" + }, + { + "name": "random-(address,uint208,bool)", + "type": "(address,uint208,bool)", + "value": [ + "0xA70A36231cB9a07EbB3F4805B96BC8203a0b37fE", + "323429390427051529404789257349692114340230698951127655774662688", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA70A36231cB9a07EbB3F4805B96BC8203a0b37fE" + }, + { + "type": "number", + "value": "323429390427051529404789257349692114340230698951127655774662688" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060f18061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284018190528351808301855280850191825273a70a36231cb9a07ebb3f4805b96bc8203a0b37fe80825279c945464a4c0dceee7e84ece51771d0c45e46a056934cd8e7b020918501918252855190815290516001600160d01b0316938101939093525115158284015291519081900390910190f3fea2646970667358221220494e4d7f714e690c30e188c23cc7b994050a53ef2acf686ab02a71da7004e8f364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7cbef44c {\n address s_0;\n uint208 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_7cbef44c memory) {\n S_7cbef44c memory r;\n {\n address r_0 = 0xA70A36231cB9a07EbB3F4805B96BC8203a0b37fE;\n r.s_0 = r_0;\n }\n {\n uint208 r_1 = 323429390427051529404789257349692114340230698951127655774662688;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000a70a36231cb9a07ebb3f4805b96bc8203a0b37fe000000000000c945464a4c0dceee7e84ece51771d0c45e46a056934cd8e7b0200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,uint80,bytes18)", + "type": "(address,uint80,bytes18)", + "value": [ + "0x5b002a52b2ee99768BF418C197AC602b59E6aA36", + "535876505027722892420985", + "0x05d4e3d8652c7eb55a0c62dc29135cc092b6" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5b002a52b2ee99768BF418C197AC602b59E6aA36" + }, + { + "type": "number", + "value": "535876505027722892420985" + }, + { + "type": "hexstring", + "value": "0x05d4e3d8652c7eb55a0c62dc29135cc092b6" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101068061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284015282518082018452735b002a52b2ee99768bf418c197ac602b59e6aa36808252697179ec6d8f4ed34a27798285019081527102ea71ec32963f5aad06316e1489ae60495b60711b92860192835285519182525169ffffffffffffffffffff1693810193909352516dffffffffffffffffffffffffffff19168284015291519081900390910190f3fea26469706673582212200fc48f1608cee25b599a85e519b06524cd6dccae6860edb7f802205a0a7612f964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_28e62eb8 {\n address s_0;\n uint80 s_1;\n bytes18 s_2;\n }\n\n function test () public pure returns (S_28e62eb8 memory) {\n S_28e62eb8 memory r;\n {\n address r_0 = 0x5b002a52b2ee99768BF418C197AC602b59E6aA36;\n r.s_0 = r_0;\n }\n {\n uint80 r_1 = 535876505027722892420985;\n r.s_1 = r_1;\n }\n {\n bytes18 r_2 = bytes18(0x05d4e3d8652c7eb55a0c62dc29135cc092b6);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000005b002a52b2ee99768bf418c197ac602b59e6aa36000000000000000000000000000000000000000000007179ec6d8f4ed34a277905d4e3d8652c7eb55a0c62dc29135cc092b60000000000000000000000000000" + }, + { + "name": "random-(address[][])", + "type": "(address[][])", + "value": [ + [ + [ + "0x931F2278a5FAE3c6Bd08Ad0Ac5c5C46eb8234690", + "0x4dB039a62e7B4A306058b0C55669fb12745ed411", + "0x24b8c1B4c8149f992D50a59b18F6FDa9BCF80AAA", + "0x742b6a953dEdF2B9F7AF193adE638e58889044c5" + ], + [ + "0x6B3d919A128C7b6eda8087D80E2De2F623cA148e", + "0x24190097432922db868806812dDD3DFeae5eA426", + "0x7b09e01b84E145b719D90fd01c0A2146Da4979ad", + "0x11c0255C4EC400C74796F2043D7A8ef437C92211" + ], + [ + "0x24cfFEd82A753aaE1a37829073850768Aa51EFe0", + "0xC8c621dEee396747ffa21EdBF466AcE416EC08aE", + "0x5e7b307F152940AFe7AA81bCd28CC6e0DeC955fd", + "0x59fdB9324D8A3007EA88AC609F1C5B22009945E2" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x931F2278a5FAE3c6Bd08Ad0Ac5c5C46eb8234690" + }, + { + "type": "address", + "value": "0x4dB039a62e7B4A306058b0C55669fb12745ed411" + }, + { + "type": "address", + "value": "0x24b8c1B4c8149f992D50a59b18F6FDa9BCF80AAA" + }, + { + "type": "address", + "value": "0x742b6a953dEdF2B9F7AF193adE638e58889044c5" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6B3d919A128C7b6eda8087D80E2De2F623cA148e" + }, + { + "type": "address", + "value": "0x24190097432922db868806812dDD3DFeae5eA426" + }, + { + "type": "address", + "value": "0x7b09e01b84E145b719D90fd01c0A2146Da4979ad" + }, + { + "type": "address", + "value": "0x11c0255C4EC400C74796F2043D7A8ef437C92211" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x24cfFEd82A753aaE1a37829073850768Aa51EFe0" + }, + { + "type": "address", + "value": "0xC8c621dEee396747ffa21EdBF466AcE416EC08aE" + }, + { + "type": "address", + "value": "0x5e7b307F152940AFe7AA81bCd28CC6e0DeC955fd" + }, + { + "type": "address", + "value": "0x59fdB9324D8A3007EA88AC609F1C5B22009945E2" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105fe806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610515565b60405180910390f35b60408051602080820183526060808352835191820184528152825160038082526080820190945291929091600091816020015b606081526020019060019003908161008157505060408051600480825260a082019092529192506000919060208201608080368337019050509050600073931f2278a5fae3c6bd08ad0ac5c5c46eb8234690905080826000815181106100e9576100e96105b2565b60200260200101906001600160a01b031690816001600160a01b031681525050506000734db039a62e7b4a306058b0c55669fb12745ed41190508082600181518110610137576101376105b2565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007324b8c1b4c8149f992d50a59b18f6fda9bcf80aaa90508082600281518110610185576101856105b2565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073742b6a953dedf2b9f7af193ade638e58889044c5905080826003815181106101d3576101d36105b2565b60200260200101906001600160a01b031690816001600160a01b031681525050508082600081518110610208576102086105b2565b60209081029190910101525060408051600480825260a082019092526000918160200160208202803683370190505090506000736b3d919a128c7b6eda8087d80e2de2f623ca148e90508082600081518110610266576102666105b2565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007324190097432922db868806812ddd3dfeae5ea426905080826001815181106102b4576102b46105b2565b60200260200101906001600160a01b031690816001600160a01b031681525050506000737b09e01b84e145b719d90fd01c0a2146da4979ad90508082600281518110610302576103026105b2565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007311c0255c4ec400c74796f2043d7a8ef437c9221190508082600381518110610350576103506105b2565b60200260200101906001600160a01b031690816001600160a01b031681525050508082600181518110610385576103856105b2565b60209081029190910101525060408051600480825260a0820190925260009181602001602082028036833701905050905060007324cffed82a753aae1a37829073850768aa51efe0905080826000815181106103e3576103e36105b2565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073c8c621deee396747ffa21edbf466ace416ec08ae90508082600181518110610431576104316105b2565b60200260200101906001600160a01b031690816001600160a01b031681525050506000735e7b307f152940afe7aa81bcd28cc6e0dec955fd9050808260028151811061047f5761047f6105b2565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007359fdb9324d8a3007ea88ac609f1c5b22009945e2905080826003815181106104cd576104cd6105b2565b60200260200101906001600160a01b031690816001600160a01b031681525050508082600281518110610502576105026105b2565b6020908102919091010152508152919050565b60006020808352604083018451828386015281815180845260608701915060608160051b880101935084830192506000805b828110156105a457888603605f19018452845180518088529088019088880190845b8181101561058e5783516001600160a01b03168352928a0192918a0191600101610569565b5090975050509386019392860192600101610547565b509398975050505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220add21478bb59d0b9ae0ddc5146903af3976b3fcccd5f91d394e2c679fe16d73464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fe23aea4 {\n address[][] s_0;\n }\n\n function test () public pure returns (S_fe23aea4 memory) {\n S_fe23aea4 memory r;\n {\n address[][] memory r_0 = new address[][](3);\n {\n address[] memory r_0_0 = new address[](4);\n {\n address r_0_0_0 = 0x931F2278a5FAE3c6Bd08Ad0Ac5c5C46eb8234690;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x4dB039a62e7B4A306058b0C55669fb12745ed411;\n r_0_0[1] = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x24b8c1B4c8149f992D50a59b18F6FDa9BCF80AAA;\n r_0_0[2] = r_0_0_2;\n }\n {\n address r_0_0_3 = 0x742b6a953dEdF2B9F7AF193adE638e58889044c5;\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n address[] memory r_0_1 = new address[](4);\n {\n address r_0_1_0 = 0x6B3d919A128C7b6eda8087D80E2De2F623cA148e;\n r_0_1[0] = r_0_1_0;\n }\n {\n address r_0_1_1 = 0x24190097432922db868806812dDD3DFeae5eA426;\n r_0_1[1] = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x7b09e01b84E145b719D90fd01c0A2146Da4979ad;\n r_0_1[2] = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x11c0255C4EC400C74796F2043D7A8ef437C92211;\n r_0_1[3] = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n {\n address[] memory r_0_2 = new address[](4);\n {\n address r_0_2_0 = 0x24cfFEd82A753aaE1a37829073850768Aa51EFe0;\n r_0_2[0] = r_0_2_0;\n }\n {\n address r_0_2_1 = 0xC8c621dEee396747ffa21EdBF466AcE416EC08aE;\n r_0_2[1] = r_0_2_1;\n }\n {\n address r_0_2_2 = 0x5e7b307F152940AFe7AA81bCd28CC6e0DeC955fd;\n r_0_2[2] = r_0_2_2;\n }\n {\n address r_0_2_3 = 0x59fdB9324D8A3007EA88AC609F1C5B22009945E2;\n r_0_2[3] = r_0_2_3;\n }\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000931f2278a5fae3c6bd08ad0ac5c5c46eb82346900000000000000000000000004db039a62e7b4a306058b0c55669fb12745ed41100000000000000000000000024b8c1b4c8149f992d50a59b18f6fda9bcf80aaa000000000000000000000000742b6a953dedf2b9f7af193ade638e58889044c500000000000000000000000000000000000000000000000000000000000000040000000000000000000000006b3d919a128c7b6eda8087d80e2de2f623ca148e00000000000000000000000024190097432922db868806812ddd3dfeae5ea4260000000000000000000000007b09e01b84e145b719d90fd01c0a2146da4979ad00000000000000000000000011c0255c4ec400c74796f2043d7a8ef437c92211000000000000000000000000000000000000000000000000000000000000000400000000000000000000000024cffed82a753aae1a37829073850768aa51efe0000000000000000000000000c8c621deee396747ffa21edbf466ace416ec08ae0000000000000000000000005e7b307f152940afe7aa81bcd28cc6e0dec955fd00000000000000000000000059fdb9324d8a3007ea88ac609f1c5b22009945e2" + }, + { + "name": "random-(address[1],bytes19)", + "type": "(address[1],bytes19)", + "value": [ + ["0x9eA5619ECb0206cBa28deB8976e02B1427CAE07C"], + "0x8118989d2543b655adc67966de32a8ca789ad0" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9eA5619ECb0206cBa28deB8976e02B1427CAE07C" + } + ] + }, + { + "type": "hexstring", + "value": "0x8118989d2543b655adc67966de32a8ca789ad0" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610168806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100de565b60405180910390f35b6100566100a0565b61005e6100a0565b6100666100c0565b739ea5619ecb0206cba28deb8976e02b1427cae07c815281527208118989d2543b655adc67966de32a8ca789ad606c1b6020820152919050565b60405180604001604052806100b36100c0565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b815160408201908260005b60018110156101115782516001600160a01b03168252602092830192909101906001016100e9565b5050506020928301516cffffffffffffffffffffffffff191691909201529056fea26469706673582212202ecdf6f0609d449a12338fbb5c4729fb62cacd4412a257625ea66660d51acbe564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9bde3cfe {\n address[1] s_0;\n bytes19 s_1;\n }\n\n function test () public pure returns (S_9bde3cfe memory) {\n S_9bde3cfe memory r;\n {\n address[1] memory r_0;\n {\n address r_0_0 = 0x9eA5619ECb0206cBa28deB8976e02B1427CAE07C;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes19 r_1 = bytes19(0x8118989d2543b655adc67966de32a8ca789ad0);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000009ea5619ecb0206cba28deb8976e02b1427cae07c8118989d2543b655adc67966de32a8ca789ad000000000000000000000000000" + }, + { + "name": "random-(address[1],bytes25)", + "type": "(address[1],bytes25)", + "value": [ + ["0xca4717F973650512FeEe7906E047F7f92008c696"], + "0xc60f7e89d678940958eb7555a63dba195322f24e5af5cc0ce2" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xca4717F973650512FeEe7906E047F7f92008c696" + } + ] + }, + { + "type": "hexstring", + "value": "0xc60f7e89d678940958eb7555a63dba195322f24e5af5cc0ce2" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061016c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e8565b60405180910390f35b6100566100aa565b61005e6100aa565b6100666100ca565b73ca4717f973650512feee7906e047f7f92008c696815281527fc60f7e89d678940958eb7555a63dba195322f24e5af5cc0ce2000000000000006020820152919050565b60405180604001604052806100bd6100ca565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b815160408201908260005b600181101561011b5782516001600160a01b03168252602092830192909101906001016100f3565b50505060209283015166ffffffffffffff191691909201529056fea2646970667358221220d40a82955a630bcb18781b26f49641c5e5e09aff42307336dad53b31526f0a8f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ece5cb32 {\n address[1] s_0;\n bytes25 s_1;\n }\n\n function test () public pure returns (S_ece5cb32 memory) {\n S_ece5cb32 memory r;\n {\n address[1] memory r_0;\n {\n address r_0_0 = 0xca4717F973650512FeEe7906E047F7f92008c696;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes25 r_1 = bytes25(0xc60f7e89d678940958eb7555a63dba195322f24e5af5cc0ce2);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000ca4717f973650512feee7906e047f7f92008c696c60f7e89d678940958eb7555a63dba195322f24e5af5cc0ce200000000000000" + }, + { + "name": "random-(address[3])[]", + "type": "(address[3])[]", + "value": [ + [ + [ + "0x3B398C64AC2b592B8EdDB028feB2714c1a0647B6", + "0x6E73301053BD226d0AAc6B231794741A9f106e77", + "0x505d3c0174CcDd1F14997dBc4fd6ab20C2CC3DE1" + ] + ], + [ + [ + "0xA27e9628FB59b1c84edaf42F149e954b85c6aF6d", + "0x37F1F9d8977470549e4A894bA83A44201587550B", + "0xEacc29Dfc289Fee59a835a420780c0e85f7cce63" + ] + ], + [ + [ + "0x5e779DC925d07e0db594C126E720bB6F0010F5e5", + "0xe0E0A89d8F11e8c104a28DF7Ab1B2065915a0239", + "0x02b9e2F6Def1a9cB3Bb5064BCd1247C86fE43630" + ] + ], + [ + [ + "0x8308B6bbB2c2AD178AC547C0e8E644F9b49E0829", + "0xC4f5d2a5ace8C6e899105DE4Ad340E0405FC1918", + "0x7FE090E8E6f2ff82204B83d081A69E1f759aac62" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3B398C64AC2b592B8EdDB028feB2714c1a0647B6" + }, + { + "type": "address", + "value": "0x6E73301053BD226d0AAc6B231794741A9f106e77" + }, + { + "type": "address", + "value": "0x505d3c0174CcDd1F14997dBc4fd6ab20C2CC3DE1" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xA27e9628FB59b1c84edaf42F149e954b85c6aF6d" + }, + { + "type": "address", + "value": "0x37F1F9d8977470549e4A894bA83A44201587550B" + }, + { + "type": "address", + "value": "0xEacc29Dfc289Fee59a835a420780c0e85f7cce63" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x5e779DC925d07e0db594C126E720bB6F0010F5e5" + }, + { + "type": "address", + "value": "0xe0E0A89d8F11e8c104a28DF7Ab1B2065915a0239" + }, + { + "type": "address", + "value": "0x02b9e2F6Def1a9cB3Bb5064BCd1247C86fE43630" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8308B6bbB2c2AD178AC547C0e8E644F9b49E0829" + }, + { + "type": "address", + "value": "0xC4f5d2a5ace8C6e899105DE4Ad340E0405FC1918" + }, + { + "type": "address", + "value": "0x7FE090E8E6f2ff82204B83d081A69E1f759aac62" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610380806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c0565b60405180910390f35b60408051600480825260a0820190925260609160009190816020015b61007261028a565b81526020019060019003908161006a57905050905061008f61028a565b6100976102a2565b733b398c64ac2b592b8eddb028feb2714c1a0647b68152736e73301053bd226d0aac6b231794741a9f106e77602082015273505d3c0174ccdd1f14997dbc4fd6ab20c2cc3de1604082015281528151819083906000906100f9576100f9610334565b60200260200101819052505061010d61028a565b6101156102a2565b73a27e9628fb59b1c84edaf42f149e954b85c6af6d81527337f1f9d8977470549e4a894ba83a44201587550b602082015273eacc29dfc289fee59a835a420780c0e85f7cce6360408201528152815181908390600190811061017957610179610334565b60200260200101819052505061018d61028a565b6101956102a2565b735e779dc925d07e0db594c126e720bb6f0010f5e5815273e0e0a89d8f11e8c104a28df7ab1b2065915a023960208201527302b9e2f6def1a9cb3bb5064bcd1247c86fe436306040820152815281518190839060029081106101f9576101f9610334565b60200260200101819052505061020d61028a565b6102156102a2565b738308b6bbb2c2ad178ac547c0e8e644f9b49e0829815273c4f5d2a5ace8c6e899105de4ad340e0405fc19186020820152737fe090e8e6f2ff82204b83d081a69e1f759aac6260408201528152815181908390600390811061027957610279610334565b602090810291909101015250919050565b604051806020016040528061029d6102a2565b905290565b60405180606001604052806003906020820280368337509192915050565b602080825282518282018190526000919084820190604085019084805b828110156103275784515184835b60038110156103115782516001600160a01b0316825291880191908801906001016102eb565b50505093850193606093909301926001016102dd565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212207ed558389fff719684fc747872194d4d00b47baf3e9c21865b618d247caf8d8a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4b82385b {\n address[3] s_0;\n }\n\n function test () public pure returns (S_4b82385b[] memory) {\n S_4b82385b[] memory r = new S_4b82385b[](4);\n {\n S_4b82385b memory r_0;\n {\n address[3] memory r_0_0;\n {\n address r_0_0_0 = 0x3B398C64AC2b592B8EdDB028feB2714c1a0647B6;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x6E73301053BD226d0AAc6B231794741A9f106e77;\n r_0_0[1] = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x505d3c0174CcDd1F14997dBc4fd6ab20C2CC3DE1;\n r_0_0[2] = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_4b82385b memory r_1;\n {\n address[3] memory r_1_0;\n {\n address r_1_0_0 = 0xA27e9628FB59b1c84edaf42F149e954b85c6aF6d;\n r_1_0[0] = r_1_0_0;\n }\n {\n address r_1_0_1 = 0x37F1F9d8977470549e4A894bA83A44201587550B;\n r_1_0[1] = r_1_0_1;\n }\n {\n address r_1_0_2 = 0xEacc29Dfc289Fee59a835a420780c0e85f7cce63;\n r_1_0[2] = r_1_0_2;\n }\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_4b82385b memory r_2;\n {\n address[3] memory r_2_0;\n {\n address r_2_0_0 = 0x5e779DC925d07e0db594C126E720bB6F0010F5e5;\n r_2_0[0] = r_2_0_0;\n }\n {\n address r_2_0_1 = 0xe0E0A89d8F11e8c104a28DF7Ab1B2065915a0239;\n r_2_0[1] = r_2_0_1;\n }\n {\n address r_2_0_2 = 0x02b9e2F6Def1a9cB3Bb5064BCd1247C86fE43630;\n r_2_0[2] = r_2_0_2;\n }\n r_2.s_0 = r_2_0;\n }\n r[2] = r_2;\n }\n {\n S_4b82385b memory r_3;\n {\n address[3] memory r_3_0;\n {\n address r_3_0_0 = 0x8308B6bbB2c2AD178AC547C0e8E644F9b49E0829;\n r_3_0[0] = r_3_0_0;\n }\n {\n address r_3_0_1 = 0xC4f5d2a5ace8C6e899105DE4Ad340E0405FC1918;\n r_3_0[1] = r_3_0_1;\n }\n {\n address r_3_0_2 = 0x7FE090E8E6f2ff82204B83d081A69E1f759aac62;\n r_3_0[2] = r_3_0_2;\n }\n r_3.s_0 = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000003b398c64ac2b592b8eddb028feb2714c1a0647b60000000000000000000000006e73301053bd226d0aac6b231794741a9f106e77000000000000000000000000505d3c0174ccdd1f14997dbc4fd6ab20c2cc3de1000000000000000000000000a27e9628fb59b1c84edaf42f149e954b85c6af6d00000000000000000000000037f1f9d8977470549e4a894ba83a44201587550b000000000000000000000000eacc29dfc289fee59a835a420780c0e85f7cce630000000000000000000000005e779dc925d07e0db594c126e720bb6f0010f5e5000000000000000000000000e0e0a89d8f11e8c104a28df7ab1b2065915a023900000000000000000000000002b9e2f6def1a9cb3bb5064bcd1247c86fe436300000000000000000000000008308b6bbb2c2ad178ac547c0e8e644f9b49e0829000000000000000000000000c4f5d2a5ace8c6e899105de4ad340e0405fc19180000000000000000000000007fe090e8e6f2ff82204b83d081a69e1f759aac62" + }, + { + "name": "random-(bool,(bytes26),address)", + "type": "(bool,(bytes26),address)", + "value": [ + true, + ["0x8443e752c9bc6f845ba362c5844fa248edd0f9c64880b7dc75bf"], + "0x01994E0aDD9AA9B0a414A8A35415fAB74b23003b" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8443e752c9bc6f845ba362c5844fa248edd0f9c64880b7dc75bf" + } + ] + }, + { + "type": "address", + "value": "0x01994E0aDD9AA9B0a414A8A35415fAB74b23003b" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101278061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835283516020808201865282825280850191909152928401819052835180830185528181528451808501865282815281850190815281860192835260018252855180860187527f8443e752c9bc6f845ba362c5844fa248edd0f9c64880b7dc75bf000000000000815281527301994e0add9aa9b0a414a8a35415fab74b23003b83528551915115158252515165ffffffffffff191693810193909352516001600160a01b03168284015291519081900390910190f3fea2646970667358221220b9584745d47f251e595bf1f287450b55108e24fff761f315f9b93c8c864f355064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_da4d5856 {\n bytes26 s_0;\n }\n\n struct S_5ee5da55 {\n bool s_0;\n S_da4d5856 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_5ee5da55 memory) {\n S_5ee5da55 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n S_da4d5856 memory r_1;\n {\n bytes26 r_1_0 = bytes26(0x8443e752c9bc6f845ba362c5844fa248edd0f9c64880b7dc75bf);\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x01994E0aDD9AA9B0a414A8A35415fAB74b23003b;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000018443e752c9bc6f845ba362c5844fa248edd0f9c64880b7dc75bf00000000000000000000000000000000000001994e0add9aa9b0a414a8a35415fab74b23003b" + }, + { + "name": "random-(bool,address,address)", + "type": "(bool,address,address)", + "value": [ + true, + "0x671E243fc99fd38E07bC985Dda9f52E9E8DF6c8A", + "0x1e2b411A19D57b59A0e57CD6D7A35E293E9B985A" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x671E243fc99fd38E07bC985Dda9f52E9E8DF6c8A" + }, + { + "type": "address", + "value": "0x1e2b411A19D57b59A0e57CD6D7A35E293E9B985A" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060ee8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284015282518082018452600180825273671e243fc99fd38e07bc985dda9f52e9e8df6c8a828501908152731e2b411a19d57b59a0e57cd6d7a35e293e9b985a9286019283528551918252516001600160a01b039081169482019490945290519092168284015291519081900390910190f3fea2646970667358221220c7015b3c4fcc747ce0f545d00d08a95b7551dc2ae937bba09313dcc422dbccf764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2f7d42be {\n bool s_0;\n address s_1;\n address s_2;\n }\n\n function test () public pure returns (S_2f7d42be memory) {\n S_2f7d42be memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x671E243fc99fd38E07bC985Dda9f52E9E8DF6c8A;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x1e2b411A19D57b59A0e57CD6D7A35E293E9B985A;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000671e243fc99fd38e07bc985dda9f52e9e8df6c8a0000000000000000000000001e2b411a19d57b59a0e57cd6d7a35e293e9b985a" + }, + { + "name": "random-(bool,address,bytes31)", + "type": "(bool,address,bytes31)", + "value": [ + false, + "0xF7F5Baed1b55dEA8d098E0bb795797FAAA65c666", + "0x837329d9b01474f0fc2c72a5eed325ab32d690f78ef8ffe172de93b46f1057" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xF7F5Baed1b55dEA8d098E0bb795797FAAA65c666" + }, + { + "type": "hexstring", + "value": "0x837329d9b01474f0fc2c72a5eed325ab32d690f78ef8ffe172de93b46f1057" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060f98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284018190528351808301855281815273f7f5baed1b55dea8d098e0bb795797faaa65c6668185019081527f837329d9b01474f0fc2c72a5eed325ab32d690f78ef8ffe172de93b46f1057009186019182528551928352516001600160a01b031693820193909352915160ff19168284015291519081900390910190f3fea2646970667358221220723598d9ead6adf173102f453b9d23dec2d83e778a93cfc293f6ae0a9f3ab1f064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2e2817ec {\n bool s_0;\n address s_1;\n bytes31 s_2;\n }\n\n function test () public pure returns (S_2e2817ec memory) {\n S_2e2817ec memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xF7F5Baed1b55dEA8d098E0bb795797FAAA65c666;\n r.s_1 = r_1;\n }\n {\n bytes31 r_2 = bytes31(0x837329d9b01474f0fc2c72a5eed325ab32d690f78ef8ffe172de93b46f1057);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7f5baed1b55dea8d098e0bb795797faaa65c666837329d9b01474f0fc2c72a5eed325ab32d690f78ef8ffe172de93b46f105700" + }, + { + "name": "random-(bool,address,uint8)", + "type": "(bool,address,uint8)", + "value": [false, "0xc56AFe083901bbd755e411269b20692Cb982BecB", "48"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xc56AFe083901bbd755e411269b20692Cb982BecB" + }, + { + "type": "number", + "value": "48" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284018190528351808301855281815273c56afe083901bbd755e411269b20692cb982becb81850190815260309186019182528551928352516001600160a01b031693820193909352915160ff168284015291519081900390910190f3fea26469706673582212202fec8ece8cf00521b4ad00815c7c417c7bdfbd4f447321393e97633517b45b4864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_18dadf90 {\n bool s_0;\n address s_1;\n uint8 s_2;\n }\n\n function test () public pure returns (S_18dadf90 memory) {\n S_18dadf90 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xc56AFe083901bbd755e411269b20692Cb982BecB;\n r.s_1 = r_1;\n }\n {\n uint8 r_2 = 48;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c56afe083901bbd755e411269b20692cb982becb0000000000000000000000000000000000000000000000000000000000000030" + }, + { + "name": "random-(bool,bool,uint)", + "type": "(bool,bool,uint)", + "value": [ + false, + true, + "50499667844437398422199853677723133816377433368031916697126193746507944460442" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "50499667844437398422199853677723133816377433368031916697126193746507944460442" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060db8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284018190528351808301855281815260018185019081527f6fa5cc91c3391800bfb563d79e22fabaf3cff1f5d21cbebdabc5706dd758809a91860191825285519283525115159382019390935291518284015291519081900390910190f3fea2646970667358221220d3b92fb6db1284cc6411fe803cf14a8e6bfd2fcb1d0c20ecc0a553bd4480064b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_957a43a1 {\n bool s_0;\n bool s_1;\n uint256 s_2;\n }\n\n function test () public pure returns (S_957a43a1 memory) {\n S_957a43a1 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n uint r_2 = 50499667844437398422199853677723133816377433368031916697126193746507944460442;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016fa5cc91c3391800bfb563d79e22fabaf3cff1f5d21cbebdabc5706dd758809a" + }, + { + "name": "random-(bool,bool,uint112)", + "type": "(bool,bool,uint112)", + "value": [false, true, "2114098669735720975344836902082920"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "2114098669735720975344836902082920" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284018190528351808301855281815260018185019081526d683bad38a1292e682c0a2caf596891860191825285519283525115159382019390935291516dffffffffffffffffffffffffffff168284015291519081900390910190f3fea2646970667358221220577489bf9a16f9f8cec59f2077bd4bdfcea97a1bf1ee650b28075f797b55d9e664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1110cba8 {\n bool s_0;\n bool s_1;\n uint112 s_2;\n }\n\n function test () public pure returns (S_1110cba8 memory) {\n S_1110cba8 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n uint112 r_2 = 2114098669735720975344836902082920;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000683bad38a1292e682c0a2caf5968" + }, + { + "name": "random-(bool,bytes10,bool)", + "type": "(bool,bytes10,bool)", + "value": [false, "0xd332bf606db1fd4a1bd5", true], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xd332bf606db1fd4a1bd5" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d28061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284018190528351808301855281815269d332bf606db1fd4a1bd560b01b81850190815260019186019182528551928352516001600160b01b03191693820193909352915115158284015291519081900390910190f3fea264697066735822122093401baab4338ca46a13c38807e620c7dd47335dcff32dab8fabbddb9248012464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fd852488 {\n bool s_0;\n bytes10 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_fd852488 memory) {\n S_fd852488 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bytes10 r_1 = bytes10(0xd332bf606db1fd4a1bd5);\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000d332bf606db1fd4a1bd5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool,bytes15,address)", + "type": "(bool,bytes15,address)", + "value": [ + true, + "0x170b1a90e9fc9d33f254fc70804119", + "0x2e3Cd58B45E2A5355B547c6f141C3DB6D35bD4F2" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x170b1a90e9fc9d33f254fc70804119" + }, + { + "type": "address", + "value": "0x2e3Cd58B45E2A5355B547c6f141C3DB6D35bD4F2" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060fa8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516060808201835260008083526020808401829052928401528251808201845260018082526e170b1a90e9fc9d33f254fc7080411960881b828501908152732e3cd58b45e2a5355b547c6f141c3db6d35bd4f292860192835285519182525170ffffffffffffffffffffffffffffffffff191693810193909352516001600160a01b03168284015291519081900390910190f3fea2646970667358221220e6ee90fa89c0a2de89982356833ba4a2a185ae34d5c54ddaecf849e55dafb3f964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_de1f0cff {\n bool s_0;\n bytes15 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_de1f0cff memory) {\n S_de1f0cff memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes15 r_1 = bytes15(0x170b1a90e9fc9d33f254fc70804119);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x2e3Cd58B45E2A5355B547c6f141C3DB6D35bD4F2;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001170b1a90e9fc9d33f254fc7080411900000000000000000000000000000000000000000000000000000000002e3cd58b45e2a5355b547c6f141c3db6d35bd4f2" + }, + { + "name": "random-(bool,bytes18,bool)", + "type": "(bool,bytes18,bool)", + "value": [true, "0x5f1fd35369d0177b580ac1186b39d98cde2d", false], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x5f1fd35369d0177b580ac1186b39d98cde2d" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e18061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516060808201835260008083526020808401829052928401819052835180830185528085019182526001808252715f1fd35369d0177b580ac1186b39d98cde2d60701b918501918252855190815290516dffffffffffffffffffffffffffff1916938101939093525115158284015291519081900390910190f3fea26469706673582212209049fa1f36b4476108b3d21eecabf7f7e918e4456aad8663613383e484bbad1a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7daeb62a {\n bool s_0;\n bytes18 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_7daeb62a memory) {\n S_7daeb62a memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes18 r_1 = bytes18(0x5f1fd35369d0177b580ac1186b39d98cde2d);\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000015f1fd35369d0177b580ac1186b39d98cde2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bytes9,int112)", + "type": "(bool,bytes9,int112)", + "value": [true, "0x6aceec34e5498ba68e", "-1923769806661307105190482162636950"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x6aceec34e5498ba68e" + }, + { + "type": "number", + "value": "-1923769806661307105190482162636950" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060df8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184526001808252683567761a72a4c5d34760b91b8285019081526d5ed9637f15ca66701145c91a5895199286019283528551918252516001600160b81b0319169381019390935251600d0b8284015291519081900390910190f3fea2646970667358221220637d33c4b0a6164219b290a8915c0d8a3e5f9ae638b52e752d29c3bdba13dc3b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_dcbf9cb3 {\n bool s_0;\n bytes9 s_1;\n int112 s_2;\n }\n\n function test () public pure returns (S_dcbf9cb3 memory) {\n S_dcbf9cb3 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes9 r_1 = bytes9(0x6aceec34e5498ba68e);\n r.s_1 = r_1;\n }\n {\n int112 r_2 = -1923769806661307105190482162636950;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000016aceec34e5498ba68e0000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffa1269c80ea35998feeba36e5a76a" + }, + { + "name": "random-(bool,bytes9)[]", + "type": "(bool,bytes9)[]", + "value": [[false, "0xd8a093360a76603275"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xd8a093360a76603275" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d8565b60405180910390f35b60408051600180825281830190925260609160009190816020015b604080518082019091526000808252602082015281526020019060019003908161006957505060408051808201909152600080825268d8a093360a7660327560b81b602083015282519293509091829184916100c7576100c7610133565b602090810291909101015250919050565b602080825282518282018190526000919060409081850190868401855b828110156101265781518051151585528601516001600160b81b0319168685015292840192908501906001016100f5565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220fcd4cd0a68c42363f15333345223d6ccde4499e5e56251d138523a2f3b3325a664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9a4fafba {\n bool s_0;\n bytes9 s_1;\n }\n\n function test () public pure returns (S_9a4fafba[] memory) {\n S_9a4fafba[] memory r = new S_9a4fafba[](1);\n {\n S_9a4fafba memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n bytes9 r_0_1 = bytes9(0xd8a093360a76603275);\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000d8a093360a766032750000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,int232,bool)", + "type": "(bool,int232,bool)", + "value": [ + false, + "-2792001618025617186015248288663817140213907793933948319855094362710130", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-2792001618025617186015248288663817140213907793933948319855094362710130" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060dd8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516060808201835260008083526020808401829052928401819052835180830185528181528085018281527fffffff98705c07857790940cb5748bac977682f3dba9415df2f9b93f54795f8e91850191825285519283529051601c0b93820193909352915115158284015291519081900390910190f3fea2646970667358221220aef4a20b819a4c41fa4d5049550a2ae10abc8aad4c089425233d0ba14e6ca9a764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1282999 {\n bool s_0;\n int232 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_c1282999 memory) {\n S_c1282999 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int232 r_1 = -2792001618025617186015248288663817140213907793933948319855094362710130;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000ffffff98705c07857790940cb5748bac977682f3dba9415df2f9b93f54795f8e0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string,(string))", + "type": "(bool,string,(string))", + "value": [true, "Moo é🚀ééo", ["Moo é🚀 é🚀oMM oo"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀ééo" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é🚀oMM oo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ec806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061015e565b60405180910390f35b6100566100db565b61005e6100db565b60018152604080518082018252600f81526e4d6f6f20c3a9f09f9a80c3a9c3a96f60881b60208083019190915280840191909152815190810190915260608152604080518082018252601781527f4d6f6f20c3a9f09f9a8020c3a9f09f9a806f4d4d206f6f00000000000000000060208201528252820152919050565b60405180606001604052806000151581526020016060815260200161010c6040518060200160405280606081525090565b905290565b6000815180845260005b818110156101375760208185018101518683018201520161011b565b81811115610149576000602083870101525b50601f01601f19169290920160200192915050565b6020815281511515602082015260006020830151606060408401526101866080840182610111565b6040850151848203601f19016060860152516020808352919250906101ad90830182610111565b9594505050505056fea264697066735822122075e4a0329f559793f1366769d44b9cb1c829aaddcdce389e6e81608c852aed5e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_0cbff75b {\n bool s_0;\n string s_1;\n S_97fc4627 s_2;\n }\n\n function test () public pure returns (S_0cbff75b memory) {\n S_0cbff75b memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀ééo\";\n r.s_1 = r_1;\n }\n {\n S_97fc4627 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 é🚀oMM oo\";\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80c3a9c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a8020c3a9f09f9a806f4d4d206f6f000000000000000000" + }, + { + "name": "random-(bool,string,string)", + "type": "(bool,string,string)", + "value": [true, "Moo é🚀🚀é🚀oo🚀ooMéoéoéo oo éMM🚀ééoMoM ", "Moo é🚀o🚀"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀é🚀oo🚀ooMéoéoéo oo éMM🚀ééoMoM " + }, + { + "type": "string", + "value": "Moo é🚀o🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101fe806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061013f565b60405180910390f35b610074604051806060016040528060001515815260200160608152602001606081525090565b61009a604051806060016040528060001515815260200160608152602001606081525090565b600181526040805160608101909152603b8082526000919061018e6020830139602080840191909152604080518082018252600f81526d9adede418753e13f3500dfe13f35608f1b9281019290925283015250919050565b6000815180845260005b81811015610118576020818501810151868301820152016100fc565b8181111561012a576000602083870101525b50601f01601f19169290920160200192915050565b60208152815115156020820152600060208301516060604084015261016760808401826100f2565b90506040840151601f1984830301606085015261018482826100f2565b9594505050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a806f6ff09f9a806f6f4dc3a96fc3a96fc3a96f206f6f20c3a94d4df09f9a80c3a9c3a96f4d6f4d20a26469706673582212202de5c6e74efb386624495b0dcbdf309436a727138af826d4a2af4b3ed5acee9864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_21333ac5 {\n bool s_0;\n string s_1;\n string s_2;\n }\n\n function test () public pure returns (S_21333ac5 memory) {\n S_21333ac5 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀é🚀oo🚀ooMéoéoéo oo éMM🚀ééoMoM \";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀o🚀\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a806f6ff09f9a806f6f4dc3a96fc3a96fc3a96f206f6f20c3a94d4df09f9a80c3a9c3a96f4d6f4d200000000000000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806ff09f9a800000000000000000000000000000000000" + }, + { + "name": "random-(bool,string)[2]", + "type": "(bool,string)[2]", + "value": [ + [true, "Moo é🚀"], + [false, "Moo é🚀MMo🚀M oé🚀ooM🚀 éoo"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀MMo🚀M oé🚀ooM🚀 éoo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061020d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610112565b60405180910390f35b6100566100d8565b61005e6100d8565b604080518082018252606060208083018281526001845284518086018652600a8152689adede418753e13f3560b71b818401529052918452825180840190935260008352908201526000808252604080516060810190915260268082526101b2602083013960208301525080826001602002015250919050565b60405180604001604052806002905b6040805180820190915260008152606060208201528152602001906001900390816100e75790505090565b602080825260009060608382018185018685805b60028110156101a357601f198985038101865283518051151586528801516040898701819052815190870181905284905b80821015610174578282018b01518883018b0152908a0190610157565b8082111561018457858a828a0101525b978a0197601f0190921695909501870194505091860191600101610126565b50919897505050505050505056fe4d6f6f20c3a9f09f9a804d4d6ff09f9a804d206fc3a9f09f9a806f6f4df09f9a8020c3a96f6fa264697066735822122043c3a1cbd055ba953271b93efde4bdd2fcf878e22617c97a5d3609df70a04a2b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0e00bb9b {\n bool s_0;\n string s_1;\n }\n\n function test () public pure returns (S_0e00bb9b[2] memory) {\n S_0e00bb9b[2] memory r;\n {\n S_0e00bb9b memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀\";\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_0e00bb9b memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀MMo🚀M oé🚀ooM🚀 éoo\";\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a804d4d6ff09f9a804d206fc3a9f09f9a806f6f4df09f9a8020c3a96f6f0000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,uint,bool)", + "type": "(bool,uint,bool)", + "value": [ + true, + "69708608678490440857365536453926203506414074660423404690542697148509018727465", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "69708608678490440857365536453926203506414074660423404690542697148509018727465" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060d98061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516060808201835260008083526020808401829052928401528251808201845260018082527f9a1daca0a943f280de0f0f7f66cba0a62daa713329b53767e8e2b1e4f0b9242982850190815291850181815285519182529151938101939093525115158284015291519081900390910190f3fea26469706673582212205006ad04fa62e59e9a14697bf4dc608ba647fd817d245812a3b84a3b6210fe3164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_406249f4 {\n bool s_0;\n uint256 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_406249f4 memory) {\n S_406249f4 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n uint r_1 = 69708608678490440857365536453926203506414074660423404690542697148509018727465;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000019a1daca0a943f280de0f0f7f66cba0a62daa713329b53767e8e2b1e4f0b924290000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool,uint128,string)", + "type": "(bool,uint128,string)", + "value": [true, "191136244099948621809807683049257216549", "Moo é🚀"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "191136244099948621809807683049257216549" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610167806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160608082018352600080835260208084019190915291830181905282518082018452808401918252600181526f8fcb8068a8e085d73b98a3382b38aa258184015283518085018552600a8152689adede418753e13f3560b71b9381019390935291905290516100a391906100ac565b60405180910390f35b6000602080835283511515818401526fffffffffffffffffffffffffffffffff818501511660408401526040840151606080850152805180608086015260005b818110156101085782810184015186820160a0015283016100ec565b8181111561011a57600060a083880101525b50601f01601f19169390930160a00194935050505056fea264697066735822122079544a193a09c56140afeaf9e09f371909dbcee05109845d8da43e886d4b016764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_260ba4e5 {\n bool s_0;\n uint128 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_260ba4e5 memory) {\n S_260ba4e5 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n uint128 r_1 = 191136244099948621809807683049257216549;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000008fcb8068a8e085d73b98a3382b38aa250000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool)[2][2]", + "type": "(bool)[2][2]", + "value": [ + [[true], [true]], + [[true], [false]] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011f565b60405180910390f35b6100566100be565b61005e6100be565b6100666100eb565b60408051602080820183526001808352918452825180820190935290825282015281526100916100eb565b60408051602080820183526001825290835281518082019092526000825282810191909152820152919050565b60405180604001604052806002905b6100d56100eb565b8152602001906001900390816100cd5790505090565b60405180604001604052806002905b6040805160208101909152600081528152602001906001900390816100fa5790505090565b6080810181836000805b60028082106101385750610178565b835185845b8381101561015e57825151151582526020928301929091019060010161013d565b505050604094909401935060209290920191600101610129565b505050509291505056fea2646970667358221220f6155eb6df6b799bb75690ef49ed5fb1fa25fb2157c6310f3ad9919e158888d164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n function test () public pure returns (S_c1053bda[2][2] memory) {\n S_c1053bda[2][2] memory r;\n {\n S_c1053bda[2] memory r_0;\n {\n S_c1053bda memory r_0_0;\n {\n bool r_0_0_0 = true;\n r_0_0.s_0 = r_0_0_0;\n }\n r_0[0] = r_0_0;\n }\n {\n S_c1053bda memory r_0_1;\n {\n bool r_0_1_0 = true;\n r_0_1.s_0 = r_0_1_0;\n }\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_c1053bda[2] memory r_1;\n {\n S_c1053bda memory r_1_0;\n {\n bool r_1_0_0 = true;\n r_1_0.s_0 = r_1_0_0;\n }\n r_1[0] = r_1_0;\n }\n {\n S_c1053bda memory r_1_1;\n {\n bool r_1_1_0 = false;\n r_1_1.s_0 = r_1_1_0;\n }\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool[],string)", + "type": "(bool[],string)", + "value": [[false, true], "Moo é🚀"], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610206806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6040805180820182526060808252602080830182905283518085018552828152908101829052835160028082529281019094529192600091816020016020820280368337019050509050600080826000815181106100ae576100ae6101ba565b6020026020010190151590811515815250505060006001905080826001815181106100db576100db6101ba565b9115156020928302919091018201529183525060408051808201909152600a8152689adede418753e13f3560b71b8183015290820152919050565b6020808252825160408383015280516060840181905260009291820190839060808601905b8083101561015d5783511515825292840192600192909201919084019061013b565b50838701519250601f19915081868203016040870152825180825260005b8181101561019657848101860151838201870152850161017b565b818111156101a75760008683850101525b50601f0190911601909101949350505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212207c87c7f11801ff6b31225c116c00b819ecd6831824abe8e75daad2258066677664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a263437a {\n bool[] s_0;\n string s_1;\n }\n\n function test () public pure returns (S_a263437a memory) {\n S_a263437a memory r;\n {\n bool[] memory r_0 = new bool[](2);\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes10,uint160)[2]", + "type": "(bytes10,uint160)[2]", + "value": [ + ["0x63ce740bdc2864f1f306", "511310885699765645080179168431600971451155251076"], + ["0x9a7178deb88ed30b3744", "182514125013595480133632058057784051988677056645"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x63ce740bdc2864f1f306" + }, + { + "type": "number", + "value": "511310885699765645080179168431600971451155251076" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9a7178deb88ed30b3744" + }, + { + "type": "number", + "value": "182514125013595480133632058057784051988677056645" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610190806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010a565b60405180910390f35b6100566100d1565b61005e6100d1565b6040805180820182526931e73a05ee143278f98360b11b815273598ff91c2291cbb0a813669b2ff56120079e7f84602080830191909152908352815180830190925269269c5e37ae23b4c2cdd160b21b8252731ff837673f33e540b65dede59988a205e40cd88582820152820152919050565b60405180604001604052806002905b60408051808201909152600080825260208201528152602001906001900390816100e05790505090565b60808101818360005b600281101561015157815180516001600160b01b03191684526020908101516001600160a01b03168185015260409093019290910190600101610113565b5050509291505056fea2646970667358221220a92d5ad02114785fc176a17578a33af56bcebcd815b80a1b7a23d1a1cc846f3a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_318b435b {\n bytes10 s_0;\n uint160 s_1;\n }\n\n function test () public pure returns (S_318b435b[2] memory) {\n S_318b435b[2] memory r;\n {\n S_318b435b memory r_0;\n {\n bytes10 r_0_0 = bytes10(0x63ce740bdc2864f1f306);\n r_0.s_0 = r_0_0;\n }\n {\n uint160 r_0_1 = 511310885699765645080179168431600971451155251076;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_318b435b memory r_1;\n {\n bytes10 r_1_0 = bytes10(0x9a7178deb88ed30b3744);\n r_1.s_0 = r_1_0;\n }\n {\n uint160 r_1_1 = 182514125013595480133632058057784051988677056645;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x63ce740bdc2864f1f30600000000000000000000000000000000000000000000000000000000000000000000598ff91c2291cbb0a813669b2ff56120079e7f849a7178deb88ed30b3744000000000000000000000000000000000000000000000000000000000000000000001ff837673f33e540b65dede59988a205e40cd885" + }, + { + "name": "random-(bytes11,bytes31,bytes24)", + "type": "(bytes11,bytes31,bytes24)", + "value": [ + "0x16a6304c9e91f8936223cd", + "0x3989f87842061c347bfcd1e97f6f7e4b21023a1de8dced8d5184ca9bb2d484", + "0x12f004f347b35cc2812d268f1ade624950eec5fb4d21af4c" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x16a6304c9e91f8936223cd" + }, + { + "type": "hexstring", + "value": "0x3989f87842061c347bfcd1e97f6f7e4b21023a1de8dced8d5184ca9bb2d484" + }, + { + "type": "hexstring", + "value": "0x12f004f347b35cc2812d268f1ade624950eec5fb4d21af4c" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101138061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184526a16a6304c9e91f8936223cd60a81b8082527f3989f87842061c347bfcd1e97f6f7e4b21023a1de8dced8d5184ca9bb2d484008285019081527f12f004f347b35cc2812d268f1ade624950eec5fb4d21af4c000000000000000092860192835285519182525160ff1916938101939093525167ffffffffffffffff19168284015291519081900390910190f3fea2646970667358221220a79caac12a26a48136034f56eee6cb5b6be046b297d85f45270d4e2ab9effa7c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e71e8de8 {\n bytes11 s_0;\n bytes31 s_1;\n bytes24 s_2;\n }\n\n function test () public pure returns (S_e71e8de8 memory) {\n S_e71e8de8 memory r;\n {\n bytes11 r_0 = bytes11(0x16a6304c9e91f8936223cd);\n r.s_0 = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x3989f87842061c347bfcd1e97f6f7e4b21023a1de8dced8d5184ca9bb2d484);\n r.s_1 = r_1;\n }\n {\n bytes24 r_2 = bytes24(0x12f004f347b35cc2812d268f1ade624950eec5fb4d21af4c);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x16a6304c9e91f8936223cd0000000000000000000000000000000000000000003989f87842061c347bfcd1e97f6f7e4b21023a1de8dced8d5184ca9bb2d4840012f004f347b35cc2812d268f1ade624950eec5fb4d21af4c0000000000000000" + }, + { + "name": "random-(bytes11)[4][4]", + "type": "(bytes11)[4][4]", + "value": [ + [ + ["0xd82ba18d0921c9bf820c4e"], + ["0x92f687e011a303634cd717"], + ["0xe4c89be14e3a94e17335a0"], + ["0x3d077f1e62cce6d3e5a4f1"] + ], + [ + ["0xa585496b4c556fbe1fec64"], + ["0xab7bbf8b6500bbce29bd90"], + ["0x363f172cdbf393b88f9334"], + ["0x81ce7039af8f017c395545"] + ], + [ + ["0x0c33b87755a79bbc24adc0"], + ["0x5ac92684ead884e2174a36"], + ["0x66ce6858bb72dd5705cde8"], + ["0xc7427f09ca29060b50165d"] + ], + [ + ["0xcae1afc258cd3aaa04b5e1"], + ["0x569d53415a7b37fe577479"], + ["0x8d5cd54e22653485ad93c2"], + ["0xeb43c4b4fafc606ce413eb"] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd82ba18d0921c9bf820c4e" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x92f687e011a303634cd717" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe4c89be14e3a94e17335a0" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3d077f1e62cce6d3e5a4f1" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa585496b4c556fbe1fec64" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xab7bbf8b6500bbce29bd90" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x363f172cdbf393b88f9334" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x81ce7039af8f017c395545" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0c33b87755a79bbc24adc0" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5ac92684ead884e2174a36" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x66ce6858bb72dd5705cde8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc7427f09ca29060b50165d" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xcae1afc258cd3aaa04b5e1" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x569d53415a7b37fe577479" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8d5cd54e22653485ad93c2" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xeb43c4b4fafc606ce413eb" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061036a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c8565b60405180910390f35b610056610267565b61005e610267565b610066610294565b60408051602080820183526a6c15d0c68490e4dfc1062760a91b8252908352815180820183526a92f687e011a303634cd71760a81b815283820152815180820183526a072644df0a71d4a70b99ad60ad1b81528383015281519081019091526a3d077f1e62cce6d3e5a4f160a81b8152606082015281526100e5610294565b60408051602080820183526a2961525ad3155bef87fb1960aa1b8252908352815180820183526a0ab7bbf8b6500bbce29bd960ac1b815283820152815180820183526a0d8fc5cb36fce4ee23e4cd60aa1b81528383015281518082019092526a81ce7039af8f017c39554560a81b82526060830191909152820152610168610294565b60408051602080820183526930cee1dd569e6ef092b760ae1b8252908352815180820183526a2d649342756c42710ba51b60a91b815283820152815180820183526a0cd9cd0b176e5baae0b9bd60ab1b815283830152815190810182526ac7427f09ca29060b50165d60a81b815260608301528201526101e6610294565b60408051602080820183526acae1afc258cd3aaa04b5e160a81b8252908352815180820183526a569d53415a7b37fe57747960a81b815283820152815180820183526a46ae6aa711329a42d6c9e160a91b81528383015281519081019091526aeb43c4b4fafc606ce413eb60a81b8152606080830191909152820152919050565b60405180608001604052806004905b61027e610294565b8152602001906001900390816102765790505090565b60405180608001604052806004905b6040805160208101909152600081528152602001906001900390816102a35790505090565b610200810181836000805b60048082106102e2575061032a565b835185845b83811015610310578251516001600160a81b0319168252602092830192909101906001016102e7565b5050506080949094019350602092909201916001016102d3565b505050509291505056fea264697066735822122076a60a459b5e17b1ddcd6810bcac7837818c241653fe5f4a8b6a27bf2569e6f164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1b4cf483 {\n bytes11 s_0;\n }\n\n function test () public pure returns (S_1b4cf483[4][4] memory) {\n S_1b4cf483[4][4] memory r;\n {\n S_1b4cf483[4] memory r_0;\n {\n S_1b4cf483 memory r_0_0;\n {\n bytes11 r_0_0_0 = bytes11(0xd82ba18d0921c9bf820c4e);\n r_0_0.s_0 = r_0_0_0;\n }\n r_0[0] = r_0_0;\n }\n {\n S_1b4cf483 memory r_0_1;\n {\n bytes11 r_0_1_0 = bytes11(0x92f687e011a303634cd717);\n r_0_1.s_0 = r_0_1_0;\n }\n r_0[1] = r_0_1;\n }\n {\n S_1b4cf483 memory r_0_2;\n {\n bytes11 r_0_2_0 = bytes11(0xe4c89be14e3a94e17335a0);\n r_0_2.s_0 = r_0_2_0;\n }\n r_0[2] = r_0_2;\n }\n {\n S_1b4cf483 memory r_0_3;\n {\n bytes11 r_0_3_0 = bytes11(0x3d077f1e62cce6d3e5a4f1);\n r_0_3.s_0 = r_0_3_0;\n }\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_1b4cf483[4] memory r_1;\n {\n S_1b4cf483 memory r_1_0;\n {\n bytes11 r_1_0_0 = bytes11(0xa585496b4c556fbe1fec64);\n r_1_0.s_0 = r_1_0_0;\n }\n r_1[0] = r_1_0;\n }\n {\n S_1b4cf483 memory r_1_1;\n {\n bytes11 r_1_1_0 = bytes11(0xab7bbf8b6500bbce29bd90);\n r_1_1.s_0 = r_1_1_0;\n }\n r_1[1] = r_1_1;\n }\n {\n S_1b4cf483 memory r_1_2;\n {\n bytes11 r_1_2_0 = bytes11(0x363f172cdbf393b88f9334);\n r_1_2.s_0 = r_1_2_0;\n }\n r_1[2] = r_1_2;\n }\n {\n S_1b4cf483 memory r_1_3;\n {\n bytes11 r_1_3_0 = bytes11(0x81ce7039af8f017c395545);\n r_1_3.s_0 = r_1_3_0;\n }\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_1b4cf483[4] memory r_2;\n {\n S_1b4cf483 memory r_2_0;\n {\n bytes11 r_2_0_0 = bytes11(0x0c33b87755a79bbc24adc0);\n r_2_0.s_0 = r_2_0_0;\n }\n r_2[0] = r_2_0;\n }\n {\n S_1b4cf483 memory r_2_1;\n {\n bytes11 r_2_1_0 = bytes11(0x5ac92684ead884e2174a36);\n r_2_1.s_0 = r_2_1_0;\n }\n r_2[1] = r_2_1;\n }\n {\n S_1b4cf483 memory r_2_2;\n {\n bytes11 r_2_2_0 = bytes11(0x66ce6858bb72dd5705cde8);\n r_2_2.s_0 = r_2_2_0;\n }\n r_2[2] = r_2_2;\n }\n {\n S_1b4cf483 memory r_2_3;\n {\n bytes11 r_2_3_0 = bytes11(0xc7427f09ca29060b50165d);\n r_2_3.s_0 = r_2_3_0;\n }\n r_2[3] = r_2_3;\n }\n r[2] = r_2;\n }\n {\n S_1b4cf483[4] memory r_3;\n {\n S_1b4cf483 memory r_3_0;\n {\n bytes11 r_3_0_0 = bytes11(0xcae1afc258cd3aaa04b5e1);\n r_3_0.s_0 = r_3_0_0;\n }\n r_3[0] = r_3_0;\n }\n {\n S_1b4cf483 memory r_3_1;\n {\n bytes11 r_3_1_0 = bytes11(0x569d53415a7b37fe577479);\n r_3_1.s_0 = r_3_1_0;\n }\n r_3[1] = r_3_1;\n }\n {\n S_1b4cf483 memory r_3_2;\n {\n bytes11 r_3_2_0 = bytes11(0x8d5cd54e22653485ad93c2);\n r_3_2.s_0 = r_3_2_0;\n }\n r_3[2] = r_3_2;\n }\n {\n S_1b4cf483 memory r_3_3;\n {\n bytes11 r_3_3_0 = bytes11(0xeb43c4b4fafc606ce413eb);\n r_3_3.s_0 = r_3_3_0;\n }\n r_3[3] = r_3_3;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xd82ba18d0921c9bf820c4e00000000000000000000000000000000000000000092f687e011a303634cd717000000000000000000000000000000000000000000e4c89be14e3a94e17335a00000000000000000000000000000000000000000003d077f1e62cce6d3e5a4f1000000000000000000000000000000000000000000a585496b4c556fbe1fec64000000000000000000000000000000000000000000ab7bbf8b6500bbce29bd90000000000000000000000000000000000000000000363f172cdbf393b88f933400000000000000000000000000000000000000000081ce7039af8f017c3955450000000000000000000000000000000000000000000c33b87755a79bbc24adc00000000000000000000000000000000000000000005ac92684ead884e2174a3600000000000000000000000000000000000000000066ce6858bb72dd5705cde8000000000000000000000000000000000000000000c7427f09ca29060b50165d000000000000000000000000000000000000000000cae1afc258cd3aaa04b5e1000000000000000000000000000000000000000000569d53415a7b37fe5774790000000000000000000000000000000000000000008d5cd54e22653485ad93c2000000000000000000000000000000000000000000eb43c4b4fafc606ce413eb000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes12,bytes30)[2]", + "type": "(bytes12,bytes30)[2]", + "value": [ + [ + "0x5fe291869131b4de1190f005", + "0xc4ec3911258d07e48e741d5ae667cf5f95b7d7e2ec67a4368af58538eb3e" + ], + [ + "0x850975b96c99a51e000cafcf", + "0xfb89920b3cfc5532ea252d781e7a5b46cd0565fd063888c3558d1d15c9e9" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5fe291869131b4de1190f005" + }, + { + "type": "hexstring", + "value": "0xc4ec3911258d07e48e741d5ae667cf5f95b7d7e2ec67a4368af58538eb3e" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x850975b96c99a51e000cafcf" + }, + { + "type": "hexstring", + "value": "0xfb89920b3cfc5532ea252d781e7a5b46cd0565fd063888c3558d1d15c9e9" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610126565b60405180910390f35b6100566100ed565b61005e6100ed565b6040805180820182526b5fe291869131b4de1190f00560a01b81527fc4ec3911258d07e48e741d5ae667cf5f95b7d7e2ec67a4368af58538eb3e000060208083019190915290835281518083019092526b850975b96c99a51e000cafcf60a01b82527ffb89920b3cfc5532ea252d781e7a5b46cd0565fd063888c3558d1d15c9e9000082820152820152919050565b60405180604001604052806002905b60408051808201909152600080825260208201528152602001906001900390816100fc5790505090565b60808101818360005b600281101561016957815180516001600160a01b031916845260209081015161ffff1916818501526040909301929091019060010161012f565b5050509291505056fea2646970667358221220c83bf411bf6a6c26dfcb0851a90ecc346362d7796067c530a15a63fc8b56273f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_59f7f149 {\n bytes12 s_0;\n bytes30 s_1;\n }\n\n function test () public pure returns (S_59f7f149[2] memory) {\n S_59f7f149[2] memory r;\n {\n S_59f7f149 memory r_0;\n {\n bytes12 r_0_0 = bytes12(0x5fe291869131b4de1190f005);\n r_0.s_0 = r_0_0;\n }\n {\n bytes30 r_0_1 = bytes30(0xc4ec3911258d07e48e741d5ae667cf5f95b7d7e2ec67a4368af58538eb3e);\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_59f7f149 memory r_1;\n {\n bytes12 r_1_0 = bytes12(0x850975b96c99a51e000cafcf);\n r_1.s_0 = r_1_0;\n }\n {\n bytes30 r_1_1 = bytes30(0xfb89920b3cfc5532ea252d781e7a5b46cd0565fd063888c3558d1d15c9e9);\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x5fe291869131b4de1190f0050000000000000000000000000000000000000000c4ec3911258d07e48e741d5ae667cf5f95b7d7e2ec67a4368af58538eb3e0000850975b96c99a51e000cafcf0000000000000000000000000000000000000000fb89920b3cfc5532ea252d781e7a5b46cd0565fd063888c3558d1d15c9e90000" + }, + { + "name": "random-(bytes13,address,bool)", + "type": "(bytes13,address,bool)", + "value": [ + "0x267db4da7b7ae48ceb82728ff1", + "0x07bE4DaE07F3138d1c2E3b3602169cA127C417B8", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x267db4da7b7ae48ceb82728ff1" + }, + { + "type": "address", + "value": "0x07bE4DaE07F3138d1c2E3b3602169cA127C417B8" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e68061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184526c267db4da7b7ae48ceb82728ff160981b8082527307be4dae07f3138d1c2e3b3602169ca127c417b882850190815260019286019283528551918252516001600160a01b0316938101939093525115158284015291519081900390910190f3fea26469706673582212200299cd3069920f593845eefade6f9f36f8d85239b96ab45b85a39d49bc95eeef64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97d80f27 {\n bytes13 s_0;\n address s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_97d80f27 memory) {\n S_97d80f27 memory r;\n {\n bytes13 r_0 = bytes13(0x267db4da7b7ae48ceb82728ff1);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x07bE4DaE07F3138d1c2E3b3602169cA127C417B8;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x267db4da7b7ae48ceb82728ff10000000000000000000000000000000000000000000000000000000000000007be4dae07f3138d1c2e3b3602169ca127c417b80000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bytes14,address,bytes12)", + "type": "(bytes14,address,bytes12)", + "value": [ + "0xc54064ba7f318a129e849189b491", + "0x41c916645e5D9a84b941f2925011811044db3B06", + "0xc12dd98930415608a496efac" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc54064ba7f318a129e849189b491" + }, + { + "type": "address", + "value": "0x41c916645e5D9a84b941f2925011811044db3B06" + }, + { + "type": "hexstring", + "value": "0xc12dd98930415608a496efac" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060fd8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184526dc54064ba7f318a129e849189b49160901b8082527341c916645e5d9a84b941f2925011811044db3b068285019081526b304b76624c1055822925bbeb60a21b9286019283528551918252516001600160a01b031693810193909352516001600160a01b0319168284015291519081900390910190f3fea264697066735822122096fd0ce41da9c02d2e042b62ad56d0e392ac7bc21296fe2a5c54814c9c07d45c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_03ad034c {\n bytes14 s_0;\n address s_1;\n bytes12 s_2;\n }\n\n function test () public pure returns (S_03ad034c memory) {\n S_03ad034c memory r;\n {\n bytes14 r_0 = bytes14(0xc54064ba7f318a129e849189b491);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x41c916645e5D9a84b941f2925011811044db3B06;\n r.s_1 = r_1;\n }\n {\n bytes12 r_2 = bytes12(0xc12dd98930415608a496efac);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0xc54064ba7f318a129e849189b49100000000000000000000000000000000000000000000000000000000000041c916645e5d9a84b941f2925011811044db3b06c12dd98930415608a496efac0000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes17,uint8,bytes2)", + "type": "(bytes17,uint8,bytes2)", + "value": ["0x53ab6360118790fdafdb4b7748ca42489f", "64", "0xff6e"], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x53ab6360118790fdafdb4b7748ca42489f" + }, + { + "type": "number", + "value": "64" + }, + { + "type": "hexstring", + "value": "0xff6e" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060de8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184527053ab6360118790fdafdb4b7748ca42489f60781b8082528184018581526001604960f11b031992860192835285519182525160ff1693810193909352516001600160f01b0319168284015291519081900390910190f3fea264697066735822122094bb5aa6c772b167aab8207c9fc43de0bcd75f36551fda2b5c88d9a5a71dbdb664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_86dac446 {\n bytes17 s_0;\n uint8 s_1;\n bytes2 s_2;\n }\n\n function test () public pure returns (S_86dac446 memory) {\n S_86dac446 memory r;\n {\n bytes17 r_0 = bytes17(0x53ab6360118790fdafdb4b7748ca42489f);\n r.s_0 = r_0;\n }\n {\n uint8 r_1 = 64;\n r.s_1 = r_1;\n }\n {\n bytes2 r_2 = bytes2(0xff6e);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x53ab6360118790fdafdb4b7748ca42489f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040ff6e000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes19,string,bool)", + "type": "(bytes19,string,bool)", + "value": [ + "0x8443f58143913d844f417be8166c25249d9ea4", + "Moo é🚀MMoM 🚀🚀o 🚀ooé🚀 MééoéoM🚀éMoéooo oo", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8443f58143913d844f417be8166c25249d9ea4" + }, + { + "type": "string", + "value": "Moo é🚀MMoM 🚀🚀o 🚀ooé🚀 MééoéoM🚀éMoéooo oo" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c8565b60405180910390f35b6040805160608082018352600080835260208084018390528385018290528451808401865280820193909352828501829052722110fd6050e44f6113d05efa059b09492767a9606a1b8352845160808101909552604180865293949293919291906101509083013960208301525060016040820152919050565b600060208083526cffffffffffffffffffffffffff19845116818401528084015160606040850152805180608086015260005b818110156101175782810184015186820160a0015283016100fb565b8181111561012957600060a083880101525b50604086015180151560608701529250601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a804d4d6f4d20f09f9a80f09f9a806f2020f09f9a806f6fc3a9f09f9a80204dc3a9c3a96fc3a96f4df09f9a80c3a94d6fc3a96f6f6f206f6fa264697066735822122094dfe8300db8e30b5d6d0b855ad7554ca01bae296753af823adbb5c3e0a58c3d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b44bf2cd {\n bytes19 s_0;\n string s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_b44bf2cd memory) {\n S_b44bf2cd memory r;\n {\n bytes19 r_0 = bytes19(0x8443f58143913d844f417be8166c25249d9ea4);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀MMoM 🚀🚀o 🚀ooé🚀 MééoéoM🚀éMoéooo oo\";\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000208443f58143913d844f417be8166c25249d9ea4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a804d4d6f4d20f09f9a80f09f9a806f2020f09f9a806f6fc3a9f09f9a80204dc3a9c3a96fc3a96f4df09f9a80c3a94d6fc3a96f6f6f206f6f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes20,bytes18)[2]", + "type": "(bytes20,bytes18)[2]", + "value": [ + [ + "0xaf8012b0dd6ed166836cab6f6bedbedda0f2cfde", + "0x089ddcd3325fe46a705c4dcf81a1f07e5da4" + ], + ["0x7336d79dad762c4e2c9b617ff7cce18ca34d009d", "0x9cdeadbc2bb540d1890f975f1448785640e8"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xaf8012b0dd6ed166836cab6f6bedbedda0f2cfde" + }, + { + "type": "hexstring", + "value": "0x089ddcd3325fe46a705c4dcf81a1f07e5da4" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7336d79dad762c4e2c9b617ff7cce18ca34d009d" + }, + { + "type": "hexstring", + "value": "0x9cdeadbc2bb540d1890f975f1448785640e8" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610120565b60405180910390f35b6100566100e7565b61005e6100e7565b6040805180820182527357c009586eb768b341b655b7b5f6df6ed07967ef60611b81527102277734cc97f91a9c171373e0687c1f976960721b6020808301919091529083528151808301909252737336d79dad762c4e2c9b617ff7cce18ca34d009d60601b825271139bd5b78576a81a3121f2ebe2890f0ac81d60731b82820152820152919050565b60405180604001604052806002905b60408051808201909152600080825260208201528152602001906001900390816100f65790505090565b60808101818360005b600281101561017457815180516bffffffffffffffffffffffff191684526020908101516dffffffffffffffffffffffffffff19168185015260409093019290910190600101610129565b5050509291505056fea26469706673582212206750d46261195bf1f5e16bf03619685d0b0da4b91fd70660c3dbf0b0e8f1624364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9c3c339b {\n bytes20 s_0;\n bytes18 s_1;\n }\n\n function test () public pure returns (S_9c3c339b[2] memory) {\n S_9c3c339b[2] memory r;\n {\n S_9c3c339b memory r_0;\n {\n bytes20 r_0_0 = bytes20(0xaF8012b0Dd6eD166836CAb6f6bEDbedDa0F2cfde);\n r_0.s_0 = r_0_0;\n }\n {\n bytes18 r_0_1 = bytes18(0x089ddcd3325fe46a705c4dcf81a1f07e5da4);\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_9c3c339b memory r_1;\n {\n bytes20 r_1_0 = bytes20(0x7336d79dAd762C4e2c9B617Ff7CcE18ca34D009D);\n r_1.s_0 = r_1_0;\n }\n {\n bytes18 r_1_1 = bytes18(0x9cdeadbc2bb540d1890f975f1448785640e8);\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xaf8012b0dd6ed166836cab6f6bedbedda0f2cfde000000000000000000000000089ddcd3325fe46a705c4dcf81a1f07e5da400000000000000000000000000007336d79dad762c4e2c9b617ff7cce18ca34d009d0000000000000000000000009cdeadbc2bb540d1890f975f1448785640e80000000000000000000000000000" + }, + { + "name": "random-(bytes21,address,int32)", + "type": "(bytes21,address,int32)", + "value": [ + "0x9e2fa6bd2f4a9d6b2532bc78a53c76e439b2ab3713", + "0x0D912E342037D133d87da1f4b14922895a5d5879", + "-934573082" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9e2fa6bd2f4a9d6b2532bc78a53c76e439b2ab3713" + }, + { + "type": "address", + "value": "0x0D912E342037D133d87da1f4b14922895a5d5879" + }, + { + "type": "number", + "value": "-934573082" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060f38061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284015282518082018452749e2fa6bd2f4a9d6b2532bc78a53c76e439b2ab371360581b808252730d912e342037d133d87da1f4b14922895a5d58798285019081526337b47419199286019283528551918252516001600160a01b0316938101939093525160030b8284015291519081900390910190f3fea26469706673582212204161743440854f2f2cfe10105120173a7f9ed54fc028745eaad179917404e93464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_25f698f3 {\n bytes21 s_0;\n address s_1;\n int32 s_2;\n }\n\n function test () public pure returns (S_25f698f3 memory) {\n S_25f698f3 memory r;\n {\n bytes21 r_0 = bytes21(0x9e2fa6bd2f4a9d6b2532bc78a53c76e439b2ab3713);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x0D912E342037D133d87da1f4b14922895a5d5879;\n r.s_1 = r_1;\n }\n {\n int32 r_2 = -934573082;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x9e2fa6bd2f4a9d6b2532bc78a53c76e439b2ab371300000000000000000000000000000000000000000000000d912e342037d133d87da1f4b14922895a5d5879ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc84b8be6" + }, + { + "name": "random-(bytes22[3],bool)", + "type": "(bytes22[3],bool)", + "value": [ + [ + "0x9817e336e3c9114596028d68453083d49b1c780b1f0c", + "0xd23c4a6b28e8878f7957e95deb0832880fca929c7402", + "0xfe012d8a744ecdfa94d7eb4412a62262643ebe8678be" + ], + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9817e336e3c9114596028d68453083d49b1c780b1f0c" + }, + { + "type": "hexstring", + "value": "0xd23c4a6b28e8878f7957e95deb0832880fca929c7402" + }, + { + "type": "hexstring", + "value": "0xfe012d8a744ecdfa94d7eb4412a62262643ebe8678be" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610192806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610110565b60405180910390f35b6100566100d2565b61005e6100d2565b6100666100f2565b752605f8cdb8f244516580a35a114c20f526c71e02c7c360521b815275691e2535947443c7bcabf4aef584194407e5494e3a0160511b602080830191909152757f0096c53a2766fd4a6bf5a209531131321f5f433c5f60511b6040830152908252600090820152919050565b60405180604001604052806100e56100f2565b8152600060209091015290565b60405180606001604052806003906020820280368337509192915050565b815160808201908260005b600381101561014757825169ffffffffffffffffffff191682526020928301929091019060010161011b565b5050506020830151151560608301529291505056fea2646970667358221220a6c9ce28426b03d4e7e46a778aaceaa983c0e8b87f3a2b178df36aef279fa76764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8ad2c038 {\n bytes22[3] s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_8ad2c038 memory) {\n S_8ad2c038 memory r;\n {\n bytes22[3] memory r_0;\n {\n bytes22 r_0_0 = bytes22(0x9817e336e3c9114596028d68453083d49b1c780b1f0c);\n r_0[0] = r_0_0;\n }\n {\n bytes22 r_0_1 = bytes22(0xd23c4a6b28e8878f7957e95deb0832880fca929c7402);\n r_0[1] = r_0_1;\n }\n {\n bytes22 r_0_2 = bytes22(0xfe012d8a744ecdfa94d7eb4412a62262643ebe8678be);\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x9817e336e3c9114596028d68453083d49b1c780b1f0c00000000000000000000d23c4a6b28e8878f7957e95deb0832880fca929c740200000000000000000000fe012d8a744ecdfa94d7eb4412a62262643ebe8678be000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes22[4],bytes12)", + "type": "(bytes22[4],bytes12)", + "value": [ + [ + "0x629aab8d299e7ab346414d8cf7de2110a4d6e017e008", + "0x533cb78c5dc69b72e4793c1ad0b44dfd344aa11fbbb1", + "0x37dd6168cc48144a62542e53f7e599cd9c6d5907c052", + "0xbb0e5444fee621709284cb9a1d0e120c4d080b6d9676" + ], + "0x43ab7354a6334a31c46681d5" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x629aab8d299e7ab346414d8cf7de2110a4d6e017e008" + }, + { + "type": "hexstring", + "value": "0x533cb78c5dc69b72e4793c1ad0b44dfd344aa11fbbb1" + }, + { + "type": "hexstring", + "value": "0x37dd6168cc48144a62542e53f7e599cd9c6d5907c052" + }, + { + "type": "hexstring", + "value": "0xbb0e5444fee621709284cb9a1d0e120c4d080b6d9676" + } + ] + }, + { + "type": "hexstring", + "value": "0x43ab7354a6334a31c46681d5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061013d565b60405180910390f35b6100566100ff565b61005e6100ff565b61006661011f565b750c535571a533cf5668c829b19efbc422149adc02fc0160531b815275533cb78c5dc69b72e4793c1ad0b44dfd344aa11fbbb160501b602080830191909152751beeb0b466240a25312a1729fbf2cce6ce36ac83e02960511b6040830152755d872a227f7310b8494265cd0e870906268405b6cb3b60511b60608301529082526b43ab7354a6334a31c46681d560a01b90820152919050565b604051806040016040528061011261011f565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b815160a08201908260005b600481101561017457825169ffffffffffffffffffff1916825260209283019290910190600101610148565b505050602092909201516001600160a01b031916608091909101529056fea2646970667358221220ce3eaac54db9c420032b59935fb7cc057435567904cc5686cabed2a4388167df64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fb4f500e {\n bytes22[4] s_0;\n bytes12 s_1;\n }\n\n function test () public pure returns (S_fb4f500e memory) {\n S_fb4f500e memory r;\n {\n bytes22[4] memory r_0;\n {\n bytes22 r_0_0 = bytes22(0x629aab8d299e7ab346414d8cf7de2110a4d6e017e008);\n r_0[0] = r_0_0;\n }\n {\n bytes22 r_0_1 = bytes22(0x533cb78c5dc69b72e4793c1ad0b44dfd344aa11fbbb1);\n r_0[1] = r_0_1;\n }\n {\n bytes22 r_0_2 = bytes22(0x37dd6168cc48144a62542e53f7e599cd9c6d5907c052);\n r_0[2] = r_0_2;\n }\n {\n bytes22 r_0_3 = bytes22(0xbb0e5444fee621709284cb9a1d0e120c4d080b6d9676);\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bytes12 r_1 = bytes12(0x43ab7354a6334a31c46681d5);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x629aab8d299e7ab346414d8cf7de2110a4d6e017e00800000000000000000000533cb78c5dc69b72e4793c1ad0b44dfd344aa11fbbb10000000000000000000037dd6168cc48144a62542e53f7e599cd9c6d5907c05200000000000000000000bb0e5444fee621709284cb9a1d0e120c4d080b6d96760000000000000000000043ab7354a6334a31c46681d50000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes24,int216,bytes1)", + "type": "(bytes24,int216,bytes1)", + "value": [ + "0xb88ee50c8ae5d5e4c68206a6653e76262afb71a8d88fdd0c", + "-21728527175090028658729961033124805230496319242339630440533481814", + "0x47" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb88ee50c8ae5d5e4c68206a6653e76262afb71a8d88fdd0c" + }, + { + "type": "number", + "value": "-21728527175090028658729961033124805230496319242339630440533481814" + }, + { + "type": "hexstring", + "value": "0x47" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101038061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184527fb88ee50c8ae5d5e4c68206a6653e76262afb71a8d88fdd0c00000000000000008082527a34d1b2169dd3e530b6329c4710d200c9bc607c07da149e58d0595519828501908152604760f81b928601928352855191825251601a0b93810193909352516001600160f81b0319168284015291519081900390910190f3fea26469706673582212201ab47129f3eab3867568c8a514d6cb8da9e7498fc0b423578d0b41abd0e97b3364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6967692c {\n bytes24 s_0;\n int216 s_1;\n bytes1 s_2;\n }\n\n function test () public pure returns (S_6967692c memory) {\n S_6967692c memory r;\n {\n bytes24 r_0 = bytes24(0xb88ee50c8ae5d5e4c68206a6653e76262afb71a8d88fdd0c);\n r.s_0 = r_0;\n }\n {\n int216 r_1 = -21728527175090028658729961033124805230496319242339630440533481814;\n r.s_1 = r_1;\n }\n {\n bytes1 r_2 = bytes1(0x47);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0xb88ee50c8ae5d5e4c68206a6653e76262afb71a8d88fdd0c0000000000000000ffffffffffcb2e4de9622c1acf49cd63b8ef2dff36439f83f825eb61a72fa6aa4700000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes24,int56,address)", + "type": "(bytes24,int56,address)", + "value": [ + "0x50a5ecfe65a82eaac1141300923eb1b2a8240bcb11b6c969", + "-3899273644096060", + "0xa431E5C16A70fEb9Acf2ee180795834ccEe8C090" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x50a5ecfe65a82eaac1141300923eb1b2a8240bcb11b6c969" + }, + { + "type": "number", + "value": "-3899273644096060" + }, + { + "type": "address", + "value": "0xa431E5C16A70fEb9Acf2ee180795834ccEe8C090" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060fe8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184527f50a5ecfe65a82eaac1141300923eb1b2a8240bcb11b6c9690000000000000000808252660dda5e64703a3b1982850190815273a431e5c16a70feb9acf2ee180795834ccee8c09092860192835285519182525160060b93810193909352516001600160a01b03168284015291519081900390910190f3fea2646970667358221220c2cf0a63a65b200943762c8cec8e989ad671ec25d37a2c4502dc9574b461a66364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_eb86c502 {\n bytes24 s_0;\n int56 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_eb86c502 memory) {\n S_eb86c502 memory r;\n {\n bytes24 r_0 = bytes24(0x50a5ecfe65a82eaac1141300923eb1b2a8240bcb11b6c969);\n r.s_0 = r_0;\n }\n {\n int56 r_1 = -3899273644096060;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xa431E5C16A70fEb9Acf2ee180795834ccEe8C090;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x50a5ecfe65a82eaac1141300923eb1b2a8240bcb11b6c9690000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffff225a19b8fc5c4000000000000000000000000a431e5c16a70feb9acf2ee180795834ccee8c090" + }, + { + "name": "random-(bytes25,bytes20,bytes24)", + "type": "(bytes25,bytes20,bytes24)", + "value": [ + "0x15921a8f7cb3d8901cf43c63dd0e6a08998a50f9b2c9c271a7", + "0x1979743b744c8fb7a7986c44da00f07caac4cc9f", + "0x81985697e632307de12e3df8aa9f158813b6e1adc6bd7aec" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x15921a8f7cb3d8901cf43c63dd0e6a08998a50f9b2c9c271a7" + }, + { + "type": "hexstring", + "value": "0x1979743b744c8fb7a7986c44da00f07caac4cc9f" + }, + { + "type": "hexstring", + "value": "0x81985697e632307de12e3df8aa9f158813b6e1adc6bd7aec" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101278061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184527f15921a8f7cb3d8901cf43c63dd0e6a08998a50f9b2c9c271a700000000000000808252731979743b744c8fb7a7986c44da00f07caac4cc9f60601b8285019081527f81985697e632307de12e3df8aa9f158813b6e1adc6bd7aec00000000000000009286019283528551918252516bffffffffffffffffffffffff1916938101939093525167ffffffffffffffff19168284015291519081900390910190f3fea2646970667358221220c6b2c5b14cfbcbfe6c9a02a612d2669c4197b5bcdaea019daf2e4b4fb590a06064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_55f44d3e {\n bytes25 s_0;\n bytes20 s_1;\n bytes24 s_2;\n }\n\n function test () public pure returns (S_55f44d3e memory) {\n S_55f44d3e memory r;\n {\n bytes25 r_0 = bytes25(0x15921a8f7cb3d8901cf43c63dd0e6a08998a50f9b2c9c271a7);\n r.s_0 = r_0;\n }\n {\n bytes20 r_1 = bytes20(0x1979743B744c8FB7a7986c44Da00f07caaC4cc9f);\n r.s_1 = r_1;\n }\n {\n bytes24 r_2 = bytes24(0x81985697e632307de12e3df8aa9f158813b6e1adc6bd7aec);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x15921a8f7cb3d8901cf43c63dd0e6a08998a50f9b2c9c271a7000000000000001979743b744c8fb7a7986c44da00f07caac4cc9f00000000000000000000000081985697e632307de12e3df8aa9f158813b6e1adc6bd7aec0000000000000000" + }, + { + "name": "random-(bytes26,uint[2])", + "type": "(bytes26,uint[2])", + "value": [ + "0xa1e1d6c55f7eb30e18e32031e7ad1837dfa1b704909e486ec586", + [ + "3381454261040671250240097331609987267782800533360147441361472604434919432433", + "107032672466797636394218298275894145354182532628458639820435046562831394218514" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa1e1d6c55f7eb30e18e32031e7ad1837dfa1b704909e486ec586" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3381454261040671250240097331609987267782800533360147441361472604434919432433" + }, + { + "type": "number", + "value": "107032672466797636394218298275894145354182532628458639820435046562831394218514" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610197806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011b565b60405180910390f35b6100566100de565b61005e6100de565b7fa1e1d6c55f7eb30e18e32031e7ad1837dfa1b704909e486ec58600000000000081526100896100fd565b7f0779d5d56ee65b70bb2d5220f699e7df2bc67b11bb8fb56f8f95a4df4749a0f181527feca2588662324e7bd3825af7081743d81620cb99cd982d18f0f8d9a177692212602080830191909152820152919050565b6040805180820190915260008152602081016100f86100fd565b905290565b60405180604001604052806002906020820280368337509192915050565b815165ffffffffffff1916815260208083015160608301919081840160005b60028110156101575782518252918301919083019060010161013a565b505050509291505056fea2646970667358221220efd03f6654bec0af3f8690641563d8320fed593f914c78c33c0bbaee80940ed564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5fab7f9e {\n bytes26 s_0;\n uint256[2] s_1;\n }\n\n function test () public pure returns (S_5fab7f9e memory) {\n S_5fab7f9e memory r;\n {\n bytes26 r_0 = bytes26(0xa1e1d6c55f7eb30e18e32031e7ad1837dfa1b704909e486ec586);\n r.s_0 = r_0;\n }\n {\n uint256[2] memory r_1;\n {\n uint r_1_0 = 3381454261040671250240097331609987267782800533360147441361472604434919432433;\n r_1[0] = r_1_0;\n }\n {\n uint r_1_1 = 107032672466797636394218298275894145354182532628458639820435046562831394218514;\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xa1e1d6c55f7eb30e18e32031e7ad1837dfa1b704909e486ec5860000000000000779d5d56ee65b70bb2d5220f699e7df2bc67b11bb8fb56f8f95a4df4749a0f1eca2588662324e7bd3825af7081743d81620cb99cd982d18f0f8d9a177692212" + }, + { + "name": "random-(bytes27[2],int8)", + "type": "(bytes27[2],int8)", + "value": [ + [ + "0x14e4be810c61a5b320e0afa1331df35736cb5b5dba71c23d04adfb", + "0x87d4bb78aa7b8a5b480d6f41bd014a46919d7bce5d1fa15b92cf80" + ], + "7" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x14e4be810c61a5b320e0afa1331df35736cb5b5dba71c23d04adfb" + }, + { + "type": "hexstring", + "value": "0x87d4bb78aa7b8a5b480d6f41bd014a46919d7bce5d1fa15b92cf80" + } + ] + }, + { + "type": "number", + "value": "7" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ff565b60405180910390f35b6100566100c1565b61005e6100c1565b6100666100e1565b7f14e4be810c61a5b320e0afa1331df35736cb5b5dba71c23d04adfb000000000081527f87d4bb78aa7b8a5b480d6f41bd014a46919d7bce5d1fa15b92cf800000000000602080830191909152908252600790820152919050565b60405180604001604052806100d46100e1565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b815160608201908260005b600281101561013157825164ffffffffff191682526020928301929091019060010161010a565b505050602083015160000b60408301529291505056fea2646970667358221220db55ab20ffdeb1c1d7440bcfca844da67488c48688a533eabc1c0fc53defb52764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_89a56a03 {\n bytes27[2] s_0;\n int8 s_1;\n }\n\n function test () public pure returns (S_89a56a03 memory) {\n S_89a56a03 memory r;\n {\n bytes27[2] memory r_0;\n {\n bytes27 r_0_0 = bytes27(0x14e4be810c61a5b320e0afa1331df35736cb5b5dba71c23d04adfb);\n r_0[0] = r_0_0;\n }\n {\n bytes27 r_0_1 = bytes27(0x87d4bb78aa7b8a5b480d6f41bd014a46919d7bce5d1fa15b92cf80);\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n int8 r_1 = 7;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x14e4be810c61a5b320e0afa1331df35736cb5b5dba71c23d04adfb000000000087d4bb78aa7b8a5b480d6f41bd014a46919d7bce5d1fa15b92cf8000000000000000000000000000000000000000000000000000000000000000000000000007" + }, + { + "name": "random-(bytes28,address,bytes8)", + "type": "(bytes28,address,bytes8)", + "value": [ + "0xc1dd2b2a00de05803030740e4d7ccfb787525d04ada0027b42ec9e4e", + "0x4Ce6B14A2E22635ac25B6820e0eE74e1F81bC4fe", + "0x10dff2d98f20e2ad" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc1dd2b2a00de05803030740e4d7ccfb787525d04ada0027b42ec9e4e" + }, + { + "type": "address", + "value": "0x4Ce6B14A2E22635ac25B6820e0eE74e1F81bC4fe" + }, + { + "type": "hexstring", + "value": "0x10dff2d98f20e2ad" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101088061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051606080820183526000808352602080840182905292840152825180820184527fc1dd2b2a00de05803030740e4d7ccfb787525d04ada0027b42ec9e4e00000000808252734ce6b14a2e22635ac25b6820e0ee74e1f81bc4fe8285019081526710dff2d98f20e2ad60c01b9286019283528551918252516001600160a01b031693810193909352516001600160c01b0319168284015291519081900390910190f3fea2646970667358221220525d0b926e15a840acefea52d03bc22d22ce684f76df755033c5aa7ae28e000164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0dd58050 {\n bytes28 s_0;\n address s_1;\n bytes8 s_2;\n }\n\n function test () public pure returns (S_0dd58050 memory) {\n S_0dd58050 memory r;\n {\n bytes28 r_0 = bytes28(0xc1dd2b2a00de05803030740e4d7ccfb787525d04ada0027b42ec9e4e);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x4Ce6B14A2E22635ac25B6820e0eE74e1F81bC4fe;\n r.s_1 = r_1;\n }\n {\n bytes8 r_2 = bytes8(0x10dff2d98f20e2ad);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0xc1dd2b2a00de05803030740e4d7ccfb787525d04ada0027b42ec9e4e000000000000000000000000000000004ce6b14a2e22635ac25b6820e0ee74e1f81bc4fe10dff2d98f20e2ad000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes3,bool)[3]", + "type": "(bytes3,bool)[3]", + "value": [ + ["0xd7ab06", false], + ["0xb44d88", false], + ["0xd7eed7", true] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd7ab06" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb44d88" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd7eed7" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610172806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f3565b60405180910390f35b6100566100ba565b61005e6100ba565b60408051808201825260006020808301829052626bd58360e91b83529184528251808401845280830191909152621689b160eb1b8152838201528151808301835262d7eed760e81b815260019181019190915290820152919050565b60405180606001604052806003905b60408051808201909152600080825260208201528152602001906001900390816100c95790505090565b60c08101818360005b600381101561013357815180516001600160e81b0319168452602090810151151581850152604090930192909101906001016100fc565b5050509291505056fea2646970667358221220b5ac6255a32de15742ba162189722c87b2e7681cde6524f116af8dce8325d1a464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2c415720 {\n bytes3 s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_2c415720[3] memory) {\n S_2c415720[3] memory r;\n {\n S_2c415720 memory r_0;\n {\n bytes3 r_0_0 = bytes3(0xd7ab06);\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_2c415720 memory r_1;\n {\n bytes3 r_1_0 = bytes3(0xb44d88);\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_2c415720 memory r_2;\n {\n bytes3 r_2_0 = bytes3(0xd7eed7);\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xd7ab0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b44d8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d7eed700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bytes3[1],address)", + "type": "(bytes3[1],address)", + "value": [["0xd7d24c"], "0xd2Aa812E2D729F44Ee8807EBaf199a4e5b567F81"], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd7d24c" + } + ] + }, + { + "type": "address", + "value": "0xd2Aa812E2D729F44Ee8807EBaf199a4e5b567F81" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610152806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ce565b60405180910390f35b610056610090565b61005e610090565b6100666100b0565b6235f49360ea1b8152815273d2aa812e2d729f44ee8807ebaf199a4e5b567f816020820152919050565b60405180604001604052806100a36100b0565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b815160408201908260005b60018110156101025782516001600160e81b0319168252602092830192909101906001016100d9565b5050506020928301516001600160a01b031691909201529056fea26469706673582212204f3f47c86720e6f40f75f6072bb2ab8bfe7a651116d20d09f34bb5de4fc027a364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_12d82b5e {\n bytes3[1] s_0;\n address s_1;\n }\n\n function test () public pure returns (S_12d82b5e memory) {\n S_12d82b5e memory r;\n {\n bytes3[1] memory r_0;\n {\n bytes3 r_0_0 = bytes3(0xd7d24c);\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xd2Aa812E2D729F44Ee8807EBaf199a4e5b567F81;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xd7d24c0000000000000000000000000000000000000000000000000000000000000000000000000000000000d2aa812e2d729f44ee8807ebaf199a4e5b567f81" + }, + { + "name": "random-(bytes31,string,bytes27)", + "type": "(bytes31,string,bytes27)", + "value": [ + "0xf0102294aa7504efff4acc900cd276f94b4c8f0596fa0c1f42c29477816ac1", + "Moo é🚀 é", + "0x93e0773a190d4c7237f49615b9e16605e92b192ee29e802420ffe9" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf0102294aa7504efff4acc900cd276f94b4c8f0596fa0c1f42c29477816ac1" + }, + { + "type": "string", + "value": "Moo é🚀 é" + }, + { + "type": "hexstring", + "value": "0x93e0773a190d4c7237f49615b9e16605e92b192ee29e802420ffe9" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061019b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b604080516060808201835260008083526020808401839052928401819052835180830185528084019283528085019182527ff0102294aa7504efff4acc900cd276f94b4c8f0596fa0c1f42c29477816ac100815284518086018652600e81526d4d6f6f20c3a9f09f9a802020c3a960901b94810194909452929091527f93e0773a190d4c7237f49615b9e16605e92b192ee29e802420ffe90000000000905290516100db91906100e4565b60405180910390f35b6000602080835260ff19845116818401528084015160606040850152805180608086015260005b818110156101275782810184015186820160a00152830161010b565b8181111561013957600060a083880101525b50604086015164ffffffffff19811660608701529250601f01601f19169390930160a00194935050505056fea2646970667358221220c269b21ec15ceb006f28d3da3d9a021ddde63bf2746a3b0ecd507d88d95f462664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c559aeab {\n bytes31 s_0;\n string s_1;\n bytes27 s_2;\n }\n\n function test () public pure returns (S_c559aeab memory) {\n S_c559aeab memory r;\n {\n bytes31 r_0 = bytes31(0xf0102294aa7504efff4acc900cd276f94b4c8f0596fa0c1f42c29477816ac1);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 é\";\n r.s_1 = r_1;\n }\n {\n bytes27 r_2 = bytes27(0x93e0773a190d4c7237f49615b9e16605e92b192ee29e802420ffe9);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020f0102294aa7504efff4acc900cd276f94b4c8f0596fa0c1f42c29477816ac100000000000000000000000000000000000000000000000000000000000000006093e0773a190d4c7237f49615b9e16605e92b192ee29e802420ffe90000000000000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a802020c3a9000000000000000000000000000000000000" + }, + { + "name": "random-(bytes8[3][1])", + "type": "(bytes8[3][1])", + "value": [[["0xdfc864118c83f8e7", "0xb9a2181b1360df25", "0xab2c30308ba91d1b"]]], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdfc864118c83f8e7" + }, + { + "type": "hexstring", + "value": "0xb9a2181b1360df25" + }, + { + "type": "hexstring", + "value": "0xab2c30308ba91d1b" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ab806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010a565b60405180910390f35b6100566100a7565b61005e6100a7565b6100666100bf565b61006e6100ec565b67dfc864118c83f8e760c01b815267b9a2181b1360df2560c01b602082015267ab2c30308ba91d1b60c01b604082015281528152919050565b60405180602001604052806100ba6100bf565b905290565b60405180602001604052806001905b6100d66100ec565b8152602001906001900390816100ce5790505090565b60405180606001604052806003906020820280368337509192915050565b8151606082810191836000805b6001808210610126575061016a565b845184845b60038110156101535782516001600160c01b031916825260209283019290910190830161012b565b505050602094909401935091840191600101610117565b50505050509291505056fea2646970667358221220676862ea7fbd67ce2d5862be6954b9c8c3638c86979cb9f4bf3f8e03619ca12264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ddb818a7 {\n bytes8[3][1] s_0;\n }\n\n function test () public pure returns (S_ddb818a7 memory) {\n S_ddb818a7 memory r;\n {\n bytes8[3][1] memory r_0;\n {\n bytes8[3] memory r_0_0;\n {\n bytes8 r_0_0_0 = bytes8(0xdfc864118c83f8e7);\n r_0_0[0] = r_0_0_0;\n }\n {\n bytes8 r_0_0_1 = bytes8(0xb9a2181b1360df25);\n r_0_0[1] = r_0_0_1;\n }\n {\n bytes8 r_0_0_2 = bytes8(0xab2c30308ba91d1b);\n r_0_0[2] = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0xdfc864118c83f8e7000000000000000000000000000000000000000000000000b9a2181b1360df25000000000000000000000000000000000000000000000000ab2c30308ba91d1b000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes9[3],bool)", + "type": "(bytes9[3],bool)", + "value": [["0x92ec5cc62c18e77737", "0xc8ea37858cad5316fa", "0x1bd9369acfc6ad0d05"], false], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x92ec5cc62c18e77737" + }, + { + "type": "hexstring", + "value": "0xc8ea37858cad5316fa" + }, + { + "type": "hexstring", + "value": "0x1bd9369acfc6ad0d05" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610168806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e9565b60405180910390f35b6100566100ab565b61005e6100ab565b6100666100cb565b6892ec5cc62c18e7773760b81b81526864751bc2c656a98b7d60b91b602080830191909152681bd9369acfc6ad0d0560b81b6040830152908252600090820152919050565b60405180604001604052806100be6100cb565b8152600060209091015290565b60405180606001604052806003906020820280368337509192915050565b815160808201908260005b600381101561011d5782516001600160b81b0319168252602092830192909101906001016100f4565b5050506020830151151560608301529291505056fea2646970667358221220367946dac26edcf6a837d97ce2378c2a320da894644571877f67ae3ce0f7b9bf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5959da7a {\n bytes9[3] s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_5959da7a memory) {\n S_5959da7a memory r;\n {\n bytes9[3] memory r_0;\n {\n bytes9 r_0_0 = bytes9(0x92ec5cc62c18e77737);\n r_0[0] = r_0_0;\n }\n {\n bytes9 r_0_1 = bytes9(0xc8ea37858cad5316fa);\n r_0[1] = r_0_1;\n }\n {\n bytes9 r_0_2 = bytes9(0x1bd9369acfc6ad0d05);\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x92ec5cc62c18e777370000000000000000000000000000000000000000000000c8ea37858cad5316fa00000000000000000000000000000000000000000000001bd9369acfc6ad0d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int128,address,string)", + "type": "(int128,address,string)", + "value": [ + "137492000947346872274566097977901265657", + "0xC227Cff1416b9AE87174E0Ce1afbdB9F05375Cf9", + "Moo é🚀 oo oooéoééoooooééMoM o oo🚀🚀o ééooéo o " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "137492000947346872274566097977901265657" + }, + { + "type": "address", + "value": "0xC227Cff1416b9AE87174E0Ce1afbdB9F05375Cf9" + }, + { + "type": "string", + "value": "Moo é🚀 oo oooéoééoooooééMoM o oo🚀🚀o ééooéo o " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c7565b60405180910390f35b604080516060808201835260008083526020808401829052838501839052845180840186528086018490526f676fff053f5fd8e0e63516a5dce732f9815273c227cff1416b9ae87174e0ce1afbdb9f05375cf9818301528551938401865285845293949192919061014490830139604083015250919050565b600060208083528351600f0b8184015260018060a01b03818501511660408401526040840151606080850152805180608086015260005b8181101561011a5782810184015186820160a0015283016100fe565b8181111561012c57600060a083880101525b50601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a8020206f6f206f6f6fc3a96fc3a9c3a96f6f6f6f6fc3a9c3a94d6f4d206f206f6ff09f9a80f09f9a806f20c3a9c3a96f6fc3a96f206f20a26469706673582212208cba58380c57b8450fa1d83953b39103b6be8e23346d85aaea670ee50e5856da64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_273ceed5 {\n int128 s_0;\n address s_1;\n string s_2;\n }\n\n function test () public pure returns (S_273ceed5 memory) {\n S_273ceed5 memory r;\n {\n int128 r_0 = 137492000947346872274566097977901265657;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xC227Cff1416b9AE87174E0Ce1afbdB9F05375Cf9;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀 oo oooéoééoooooééMoM o oo🚀🚀o ééooéo o \";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000676fff053f5fd8e0e63516a5dce732f9000000000000000000000000c227cff1416b9ae87174e0ce1afbdb9f05375cf9000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a8020206f6f206f6f6fc3a96fc3a9c3a96f6f6f6f6fc3a9c3a94d6f4d206f206f6ff09f9a80f09f9a806f20c3a9c3a96f6fc3a96f206f20" + }, + { + "name": "random-(int136,address,bytes16)", + "type": "(int136,address,bytes16)", + "value": [ + "42268464344099993146060504224956208939822", + "0xd461858f94240Adc4D9811Dc86700A2Cd40E2285", + "0x21a0374031bdd28b0aad29a87440e86a" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "42268464344099993146060504224956208939822" + }, + { + "type": "address", + "value": "0xd461858f94240Adc4D9811Dc86700A2Cd40E2285" + }, + { + "type": "hexstring", + "value": "0x21a0374031bdd28b0aad29a87440e86a" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061010a8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284015282518082018452707c37421e4c9ed979f284d932d28568832e80825273d461858f94240adc4d9811dc86700a2cd40e22858285019081526f10d01ba018dee945855694d43a20743560811b9286019283528551918252516001600160a01b031693810193909352516fffffffffffffffffffffffffffffffff19168284015291519081900390910190f3fea2646970667358221220b72b57899537a7e268867c26efa9eba24f0130c62c5edab1e51363a533c1a51064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c6a0532a {\n int136 s_0;\n address s_1;\n bytes16 s_2;\n }\n\n function test () public pure returns (S_c6a0532a memory) {\n S_c6a0532a memory r;\n {\n int136 r_0 = 42268464344099993146060504224956208939822;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xd461858f94240Adc4D9811Dc86700A2Cd40E2285;\n r.s_1 = r_1;\n }\n {\n bytes16 r_2 = bytes16(0x21a0374031bdd28b0aad29a87440e86a);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000007c37421e4c9ed979f284d932d28568832e000000000000000000000000d461858f94240adc4d9811dc86700a2cd40e228521a0374031bdd28b0aad29a87440e86a00000000000000000000000000000000" + }, + { + "name": "random-(int144,uint136,string)", + "type": "(int144,uint136,string)", + "value": [ + "3001655819494298894465914335526795829869475", + "15766196183739325452686206951725169198000", + "Moo é🚀oooéo é MéM o🚀 M🚀éM oMMéoéo🚀ooMo o🚀 éo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "3001655819494298894465914335526795829869475" + }, + { + "type": "number", + "value": "15766196183739325452686206951725169198000" + }, + { + "type": "string", + "value": "Moo é🚀oooéo é MéM o🚀 M🚀éM oMMéoéo🚀ooMo o🚀 éo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101cf806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100cd565b60405180910390f35b604080516060808201835260008083526020808401829052838501839052845180840186528086019390935271227512da8d030cdca786fad63de0a7b87ba38352702e552aef1658be7e54b461c741ddd543b0838201528451608081019095526045808652939492939192919061015590830139604083015250919050565b60006020808352835160110b8184015270ffffffffffffffffffffffffffffffffff818501511660408401526040840151606080850152805180608086015260005b8181101561012b5782810184015186820160a00152830161010f565b8181111561013d57600060a083880101525b50601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a806f6f6fc3a96f2020c3a9204dc3a94d206ff09f9a80204df09f9a80c3a94d20206f4d4dc3a96fc3a96ff09f9a806f6f4d6f206ff09f9a8020c3a96fa2646970667358221220b97b91413eae57a05de43206b5e075678fa508b928f7fd13d0723586d853100964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_89883ddc {\n int144 s_0;\n uint136 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_89883ddc memory) {\n S_89883ddc memory r;\n {\n int144 r_0 = 3001655819494298894465914335526795829869475;\n r.s_0 = r_0;\n }\n {\n uint136 r_1 = 15766196183739325452686206951725169198000;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oooéo é MéM o🚀 M🚀éM oMMéoéo🚀ooMo o🚀 éo\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000227512da8d030cdca786fad63de0a7b87ba30000000000000000000000000000002e552aef1658be7e54b461c741ddd543b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a806f6f6fc3a96f2020c3a9204dc3a94d206ff09f9a80204df09f9a80c3a94d20206f4d4dc3a96fc3a96ff09f9a806f6f4d6f206ff09f9a8020c3a96f000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int200,string,(address))", + "type": "(int200,string,(address))", + "value": [ + "-150915452392088506841901255199558091642573915955461155753319", + "Moo é🚀ooooM🚀M🚀o🚀oM o🚀🚀éMoooé🚀🚀🚀o🚀oé éooM🚀éo oéMo ééé oooMo M ", + ["0xfb79Fbb05e6fbA6700DdaCC71C2467807f82525B"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-150915452392088506841901255199558091642573915955461155753319" + }, + { + "type": "string", + "value": "Moo é🚀ooooM🚀M🚀o🚀oM o🚀🚀éMoooé🚀🚀🚀o🚀oé éooM🚀éo oéMo ééé oooMo M " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xfb79Fbb05e6fbA6700DdaCC71C2467807f82525B" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061022a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610109565b60405180910390f35b6100566100c9565b61005e6100c9565b78180aced75c75d54c8923fc1eea3d8dddf446797e1137588d661981526040805160a0810190915260698082526000919061018c602083013960208381019190915260408051918201815273fb79fbb05e6fba6700ddacc71c2467807f82525b825283015250919050565b6040518060600160405280600060180b815260200160608152602001610104604051806020016040528060006001600160a01b031681525090565b905290565b60006020808352835160180b818401528084015160606040850152805180608086015260005b8181101561014b5782810184015186820160a00152830161012f565b8181111561015d57600060a083880101525b50604086015180516001600160a01b031660608701529250601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a806f6f6f6f4df09f9a804df09f9a806ff09f9a806f4d206ff09f9a80f09f9a80c3a94d6f6f6fc3a9f09f9a80f09f9a80f09f9a806ff09f9a806fc3a920c3a96f6f4df09f9a80c3a96f206fc3a94d6f20c3a9c3a9c3a920206f6f6f4d6f204d20a2646970667358221220aa0f77d215566830ba704446f8fb183a2a356dfd4121ffe04a1dcab7fdedecbf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_77829ea8 {\n int200 s_0;\n string s_1;\n S_421683f8 s_2;\n }\n\n function test () public pure returns (S_77829ea8 memory) {\n S_77829ea8 memory r;\n {\n int200 r_0 = -150915452392088506841901255199558091642573915955461155753319;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀ooooM🚀M🚀o🚀oM o🚀🚀éMoooé🚀🚀🚀o🚀oé éooM🚀éo oéMo ééé oooMo M \";\n r.s_1 = r_1;\n }\n {\n S_421683f8 memory r_2;\n {\n address r_2_0 = 0xfb79Fbb05e6fbA6700DdaCC71C2467807f82525B;\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffffffffffffffe7f53128a38a2ab376dc03e115c272220bb98681eec8a772990000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fb79fbb05e6fba6700ddacc71c2467807f82525b00000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a806f6f6f6f4df09f9a804df09f9a806ff09f9a806f4d206ff09f9a80f09f9a80c3a94d6f6f6fc3a9f09f9a80f09f9a80f09f9a806ff09f9a806fc3a920c3a96f6f4df09f9a80c3a96f206fc3a94d6f20c3a9c3a9c3a920206f6f6f4d6f204d200000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int208,int8[4])", + "type": "(int208,int8[4])", + "value": [ + "-177127991800222061415097344109375247770132103408970392127634213", + ["29", "18", "47", "-13"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-177127991800222061415097344109375247770132103408970392127634213" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "29" + }, + { + "type": "number", + "value": "18" + }, + { + "type": "number", + "value": "47" + }, + { + "type": "number", + "value": "-13" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610164806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ea565b60405180910390f35b6100566100aa565b61005e6100aa565b796e3a1dfa1522219fd75e53df2dc3f8ac88aaa07ab39ea0277b241981526100846100cc565b601d81526012602080830191909152602f6040830152600c196060830152820152919050565b6040518060400160405280600060190b81526020016100c76100cc565b905290565b60405180608001604052806004906020820280368337509192915050565b815160190b815260208083015160a0830191908184016000805b6004811015610123578351820b83529284019291840191600101610104565b50505050509291505056fea2646970667358221220b1f36bb892f4c89c77a8ea1e1b6aa054e07249f1cd3141df581a5bf3021cfe3564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f500dc86 {\n int208 s_0;\n int8[4] s_1;\n }\n\n function test () public pure returns (S_f500dc86 memory) {\n S_f500dc86 memory r;\n {\n int208 r_0 = -177127991800222061415097344109375247770132103408970392127634213;\n r.s_0 = r_0;\n }\n {\n int8[4] memory r_1;\n {\n int8 r_1_0 = 29;\n r_1[0] = r_1_0;\n }\n {\n int8 r_1_1 = 18;\n r_1[1] = r_1_1;\n }\n {\n int8 r_1_2 = 47;\n r_1[2] = r_1_2;\n }\n {\n int8 r_1_3 = -13;\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffff91c5e205eaddde6028a1ac20d23c075377555f854c615fd884db000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3" + }, + { + "name": "random-(int72,address,bool)", + "type": "(int72,address,bool)", + "value": ["-882374201143280438557", "0x3305744246f16c4d1B39F0ec4a7c1f0491826475", true], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-882374201143280438557" + }, + { + "type": "address", + "value": "0x3305744246f16c4d1B39F0ec4a7c1f0491826475" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284015282518082018452682fd566e4ebc24e8d1c19808252733305744246f16c4d1b39f0ec4a7c1f049182647582850190815260019286019283528551918252516001600160a01b0316938101939093525115158284015291519081900390910190f3fea2646970667358221220076e77928983ab7e5bfc82f99ab98611c3c2e0cd2155a9ac2792bafa3916f5cd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3c8d1b82 {\n int72 s_0;\n address s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_3c8d1b82 memory) {\n S_3c8d1b82 memory r;\n {\n int72 r_0 = -882374201143280438557;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x3305744246f16c4d1B39F0ec4a7c1f0491826475;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffd02a991b143db172e30000000000000000000000003305744246f16c4d1b39f0ec4a7c1f04918264750000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(string,(address[1]))", + "type": "(string,(address[1]))", + "value": [ + "Moo é🚀🚀 🚀🚀 🚀 é o M é🚀Mo é🚀🚀 oééo", + [["0xf7815C339Ad09cB55cFdC61Fa3848dD12e0A687b"]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 🚀🚀 🚀 é o M é🚀Mo é🚀🚀 oééo" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xf7815C339Ad09cB55cFdC61Fa3848dD12e0A687b" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610208806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fb565b60405180910390f35b6100566100af565b61005e6100af565b6000604051806060016040528060408152602001610193604091398252506100846100ce565b61008c6100dd565b73f7815c339ad09cb55cfdc61fa3848dd12e0a687b815281526020820152919050565b6040518060400160405280606081526020016100c96100ce565b905290565b60405180602001604052806100c95b60405180602001604052806001906020820280368337509192915050565b600060208083528351604082850152805180606086015260005b8181101561013157828101840151868201608001528301610115565b81811115610143576000608083880101525b50858301515191506000604086015b600182101561017a5783516001600160a01b0316815292840192600191909101908401610152565b5050601f01601f19169390930160800194935050505056fe4d6f6f20c3a9f09f9a80f09f9a8020f09f9a80f09f9a802020f09f9a8020c3a9206f20204d20c3a9f09f9a804d6f20c3a9f09f9a80f09f9a80206fc3a9c3a96fa26469706673582212203cefe73fc23fa85c5bcc2ed801a535840a46fd57414e662d73256a6e3d09bc5464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_32c4464b {\n address[1] s_0;\n }\n\n struct S_abd5d0e0 {\n string s_0;\n S_32c4464b s_1;\n }\n\n function test () public pure returns (S_abd5d0e0 memory) {\n S_abd5d0e0 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀 🚀🚀 🚀 é o M é🚀Mo é🚀🚀 oééo\";\n r.s_0 = r_0;\n }\n {\n S_32c4464b memory r_1;\n {\n address[1] memory r_1_0;\n {\n address r_1_0_0 = 0xf7815C339Ad09cB55cFdC61Fa3848dD12e0A687b;\n r_1_0[0] = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f7815c339ad09cb55cfdc61fa3848dd12e0a687b00000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a80f09f9a8020f09f9a80f09f9a802020f09f9a8020c3a9206f20204d20c3a9f09f9a804d6f20c3a9f09f9a80f09f9a80206fc3a9c3a96f" + }, + { + "name": "random-(string,(string,string))", + "type": "(string,(string,string))", + "value": [ + "Moo é🚀🚀o", + ["Moo é🚀🚀éé🚀M🚀MoMoéooéoo", "Moo é🚀éoé🚀🚀oMo🚀oMoM🚀éMo🚀Moé🚀o"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éé🚀M🚀MoMoéooéoo" + }, + { + "type": "string", + "value": "Moo é🚀éoé🚀🚀oMo🚀oMoM🚀éMo🚀Moé🚀o" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610266806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061016b565b60405180910390f35b6100566100ea565b61005e6100ea565b604080518082018252600f81526e4d6f6f20c3a9f09f9a80f09f9a806f60881b602080830191909152908352815180830190925260608083529082015260006040518060600160405280602781526020016101d36027913982525060408051606081019091526037808252600091906101fa602083013960208084019190915283019190915250919050565b604051806040016040528060608152602001610119604051806040016040528060608152602001606081525090565b905290565b6000815180845260005b8181101561014457602081850181015186830182015201610128565b81811115610156576000602083870101525b50601f01601f19169290920160200192915050565b602081526000825160406020840152610187606084018261011e565b90506020840151601f198483030160408501528051604083526101ad604084018261011e565b90506020820151915082810360208401526101c8818361011e565b969550505050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9f09f9a804df09f9a804d6f4d6fc3a96f6fc3a96f6f4d6f6f20c3a9f09f9a80c3a96fc3a9f09f9a80f09f9a806f4d6ff09f9a806f4d6f4df09f9a80c3a94d6ff09f9a804d6fc3a9f09f9a806fa2646970667358221220e361545d709e9020dc90c75a908e5717339f26cabbcb7b47aa658f3d308f9fac64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fb587d32 {\n string s_0;\n string s_1;\n }\n\n struct S_9164e5c7 {\n string s_0;\n S_fb587d32 s_1;\n }\n\n function test () public pure returns (S_9164e5c7 memory) {\n S_9164e5c7 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀o\";\n r.s_0 = r_0;\n }\n {\n S_fb587d32 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀éé🚀M🚀MoMoéooéoo\";\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀éoé🚀🚀oMo🚀oMoM🚀éMo🚀Moé🚀o\";\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9f09f9a804df09f9a804d6f4d6fc3a96f6fc3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80c3a96fc3a9f09f9a80f09f9a806f4d6ff09f9a806f4d6f4df09f9a80c3a94d6ff09f9a804d6fc3a9f09f9a806f000000000000000000" + }, + { + "name": "random-(string,address,bool)", + "type": "(string,address,bool)", + "value": [ + "Moo é🚀 é éMoMoéo🚀oM🚀o🚀éo oM", + "0x8eE6e8eFa3dC3D2a9D02974D6B40D0A662e540cB", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é éMoMoéo🚀oM🚀o🚀éo oM" + }, + { + "type": "address", + "value": "0x8eE6e8eFa3dC3D2a9D02974D6B40D0A662e540cB" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100cc565b60405180910390f35b6040805160608082018352815260006020820181905291810191909152604080516060808201835281526000602082018190529181019190915260006040518060600160405280602d815260200161014f602d9139825250738ee6e8efa3dc3d2a9d02974d6b40d0a662e540cb602082015260006040820152919050565b600060208083528351606082850152805180608086015260005b818110156101025782810184015186820160a0015283016100e6565b8181111561011457600060a083880101525b50918501516001600160a01b038116604086015291604086015180151560608701529250601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a8020c3a920c3a94d6f4d6fc3a96ff09f9a806f4df09f9a806ff09f9a80c3a96f20206f4da2646970667358221220b4f4366df16875900531c7cdfeb9fe3718688657d537d37fd294114168f8744364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d2385fb3 {\n string s_0;\n address s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_d2385fb3 memory) {\n S_d2385fb3 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 é éMoMoéo🚀oM🚀o🚀éo oM\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x8eE6e8eFa3dC3D2a9D02974D6B40D0A662e540cB;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000008ee6e8efa3dc3d2a9d02974d6b40d0a662e540cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a8020c3a920c3a94d6f4d6fc3a96ff09f9a806f4df09f9a806ff09f9a80c3a96f20206f4d00000000000000000000000000000000000000" + }, + { + "name": "random-(string,address,bytes30)", + "type": "(string,address,bytes30)", + "value": [ + "Moo é🚀oo 🚀Mééé🚀ooéo🚀oé é ooéoo🚀 oo MM🚀 🚀éoo Mé🚀", + "0x1dd8f9AB6Bc6295324dd62937274C2A365eE13fF", + "0xcc84ee342dc1a5c6aaeb55efe55c9618e7a54788b36b08331fd3ef6ac8a5" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo 🚀Mééé🚀ooéo🚀oé é ooéoo🚀 oo MM🚀 🚀éoo Mé🚀" + }, + { + "type": "address", + "value": "0x1dd8f9AB6Bc6295324dd62937274C2A365eE13fF" + }, + { + "type": "hexstring", + "value": "0xcc84ee342dc1a5c6aaeb55efe55c9618e7a54788b36b08331fd3ef6ac8a5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101fb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100eb565b60405180910390f35b60408051606080820183528152600060208201819052918101919091526040805160608082018352815260006020820181905291810191909152600060405180608001604052806055815260200161017160559139825250731dd8f9ab6bc6295324dd62937274c2a365ee13ff60208201527fcc84ee342dc1a5c6aaeb55efe55c9618e7a54788b36b08331fd3ef6ac8a500006040820152919050565b600060208083528351606082850152805180608086015260005b818110156101215782810184015186820160a001528301610105565b8181111561013357600060a083880101525b50918501516001600160a01b038116604086015291604086015161ffff19811660608701529250601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a806f6f20f09f9a804dc3a9c3a9c3a9f09f9a806f6fc3a96ff09f9a806fc3a920c3a920206f6fc3a96f6ff09f9a80206f6f204d4df09f9a8020202020f09f9a80c3a96f6f204dc3a9f09f9a80a2646970667358221220f6db917654a8ac1950241facb59716bbb77f665081435a9c34267af9d6667d7a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e3431749 {\n string s_0;\n address s_1;\n bytes30 s_2;\n }\n\n function test () public pure returns (S_e3431749 memory) {\n S_e3431749 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oo 🚀Mééé🚀ooéo🚀oé é ooéoo🚀 oo MM🚀 🚀éoo Mé🚀\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x1dd8f9AB6Bc6295324dd62937274C2A365eE13fF;\n r.s_1 = r_1;\n }\n {\n bytes30 r_2 = bytes30(0xcc84ee342dc1a5c6aaeb55efe55c9618e7a54788b36b08331fd3ef6ac8a5);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001dd8f9ab6bc6295324dd62937274c2a365ee13ffcc84ee342dc1a5c6aaeb55efe55c9618e7a54788b36b08331fd3ef6ac8a5000000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806f6f20f09f9a804dc3a9c3a9c3a9f09f9a806f6fc3a96ff09f9a806fc3a920c3a920206f6fc3a96f6ff09f9a80206f6f204d4df09f9a8020202020f09f9a80c3a96f6f204dc3a9f09f9a800000000000000000000000" + }, + { + "name": "random-(string,address,string)", + "type": "(string,address,string)", + "value": [ + "Moo é🚀éé🚀M MM🚀 oé🚀MéMoéoooéoooooM 🚀🚀oo🚀o M", + "0x183EAa445b04Be08880FED2508b84aa22Ac046aa", + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éé🚀M MM🚀 oé🚀MéMoéoooéoooooM 🚀🚀oo🚀o M" + }, + { + "type": "address", + "value": "0x183EAa445b04Be08880FED2508b84aa22Ac046aa" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061020c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610138565b60405180910390f35b604080516060808201835280825260006020830152918101919091526040805160608082018352808252600060208301529181019190915260006040518060800160405280604681526020016101916046913982525073183eaa445b04be08880fed2508b84aa22ac046aa602080830191909152604080518082018252600a8152689adede418753e13f3560b71b92810192909252820152919050565b6000815180845260005b81811015610111576020818501810151868301820152016100f5565b81811115610123576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516060602084015261015460808401826100eb565b60208501516001600160a01b0316604085810191909152850151848203601f1901606086015290915061018782826100eb565b9594505050505056fe4d6f6f20c3a9f09f9a80c3a9c3a9f09f9a804d204d4df09f9a80206fc3a9f09f9a804dc3a94d6fc3a96f6f6fc3a96f6f6f6f6f4d20f09f9a80f09f9a806f6ff09f9a806f204da26469706673582212206c14a7288ddfca37236b93d158aa9bb7f545490d4ca3c4376cadb0c901a3217c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7d8f2a5d {\n string s_0;\n address s_1;\n string s_2;\n }\n\n function test () public pure returns (S_7d8f2a5d memory) {\n S_7d8f2a5d memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éé🚀M MM🚀 oé🚀MéMoéoooéoooooM 🚀🚀oo🚀o M\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x183EAa445b04Be08880FED2508b84aa22Ac046aa;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000183eaa445b04be08880fed2508b84aa22ac046aa00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80c3a9c3a9f09f9a804d204d4df09f9a80206fc3a9f09f9a804dc3a94d6fc3a96f6f6fc3a96f6f6f6f6f4d20f09f9a80f09f9a806f6ff09f9a806f204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,address)[4]", + "type": "(string,address)[4]", + "value": [ + [ + "Moo é🚀 o🚀 Moo oMoooéo🚀 oM🚀é🚀éoé🚀 M ooo🚀🚀oéoM", + "0xAf839fa1F02dFAf94bDC774B3b7be25745E898a7" + ], + [ + "Moo é🚀o🚀🚀MM 🚀é🚀 éo🚀M oo🚀 M🚀MoM oo🚀oéé oéMooMé🚀🚀oéo oo o🚀Mé é🚀🚀o", + "0x66c8A1C555C46cd8cACFF1BF051D47982C8d1b6B" + ], + [ + "Moo é🚀oM oo🚀MMo🚀🚀é🚀o🚀é🚀éoMoMoooéo oMoMéMooééM 🚀Moo🚀🚀o", + "0x7423F8e574849D1Ba7f71Fc1E83cc78367A519CE" + ], + ["Moo é🚀", "0x87694369ef69e5Ce5AD639b5E25520Ae3CC26e3F"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o🚀 Moo oMoooéo🚀 oM🚀é🚀éoé🚀 M ooo🚀🚀oéoM" + }, + { + "type": "address", + "value": "0xAf839fa1F02dFAf94bDC774B3b7be25745E898a7" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀🚀MM 🚀é🚀 éo🚀M oo🚀 M🚀MoM oo🚀oéé oéMooMé🚀🚀oéo oo o🚀Mé é🚀🚀o" + }, + { + "type": "address", + "value": "0x66c8A1C555C46cd8cACFF1BF051D47982C8d1b6B" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM oo🚀MMo🚀🚀é🚀o🚀é🚀éoMoMoooéo oMoMéMooééM 🚀Moo🚀🚀o" + }, + { + "type": "address", + "value": "0x7423F8e574849D1Ba7f71Fc1E83cc78367A519CE" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0x87694369ef69e5Ce5AD639b5E25520Ae3CC26e3F" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610405806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061020e565b60405180910390f35b6100566101d4565b61005e6101d4565b60408051808201909152606081526000602082015260006040518060800160405280604c8152602001610384604c913982525073af839fa1f02dfaf94bdc774b3b7be25745e898a76020820152808260006020020152506100d060408051808201909152606081526000602082015290565b60006040518060a0016040528060738152602001610311607391398252507366c8a1c555c46cd8cacff1bf051d47982c8d1b6b60208201528082600160200201525061012d60408051808201909152606081526000602082015290565b60006040518060800160405280605e81526020016102b3605e9139825250737423f8e574849d1ba7f71fc1e83cc78367a519ce60208201528082600260200201525061018a60408051808201909152606081526000602082015290565b60408051808201909152600a8152689adede418753e13f3560b71b6020808301919091529082527387694369ef69e5ce5ad639b5e25520ae3cc26e3f908201526060820152919050565b60405180608001604052806004905b6040805180820190915260608152600060208201528152602001906001900390816101e35790505090565b602080825260009060a083018382018584805b60048110156102a557601f1980898703018552835160408151818952805180838b01528692505b80831015610266578183018b01518a840160600152918a0191610248565b8083111561027757866060828c0101525b928a01516001600160a01b0316898b01525050601f0116909401606001939285019291850191600101610221565b509297965050505050505056fe4d6f6f20c3a9f09f9a806f4d202020206f6ff09f9a804d4d6ff09f9a80f09f9a80c3a9f09f9a806ff09f9a80c3a9f09f9a80c3a96f4d6f4d6f6f6fc3a96f206f4d6f4dc3a94d6f6fc3a9c3a94d20f09f9a804d6f6ff09f9a80f09f9a806f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d4d20f09f9a80c3a9f09f9a8020c3a96ff09f9a804d206f6ff09f9a80204df09f9a804d6f4d206f6ff09f9a806fc3a9c3a9206fc3a94d6f6f4dc3a9f09f9a80f09f9a806fc3a96f206f6f206ff09f9a804dc3a920c3a9f09f9a80f09f9a806f4d6f6f20c3a9f09f9a8020206ff09f9a80204d6f6f206f4d6f6f6fc3a96ff09f9a8020206f4df09f9a80c3a9f09f9a80c3a96fc3a9f09f9a80204d206f6f6ff09f9a80f09f9a806fc3a96f4da2646970667358221220bd98b1594e57673450cfafd8c6e8174f8b362b0cf7647e027132f14b1edc86d064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e7028728 {\n string s_0;\n address s_1;\n }\n\n function test () public pure returns (S_e7028728[4] memory) {\n S_e7028728[4] memory r;\n {\n S_e7028728 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 o🚀 Moo oMoooéo🚀 oM🚀é🚀éoé🚀 M ooo🚀🚀oéoM\";\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0xAf839fa1F02dFAf94bDC774B3b7be25745E898a7;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_e7028728 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀o🚀🚀MM 🚀é🚀 éo🚀M oo🚀 M🚀MoM oo🚀oéé oéMooMé🚀🚀oéo oo o🚀Mé é🚀🚀o\";\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x66c8A1C555C46cd8cACFF1BF051D47982C8d1b6B;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_e7028728 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀oM oo🚀MMo🚀🚀é🚀o🚀é🚀éoMoMoooéo oMoMéMooééM 🚀Moo🚀🚀o\";\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x7423F8e574849D1Ba7f71Fc1E83cc78367A519CE;\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n {\n S_e7028728 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀\";\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0x87694369ef69e5Ce5AD639b5E25520Ae3CC26e3F;\n r_3.s_1 = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000af839fa1f02dfaf94bdc774b3b7be25745e898a7000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a8020206ff09f9a80204d6f6f206f4d6f6f6fc3a96ff09f9a8020206f4df09f9a80c3a9f09f9a80c3a96fc3a9f09f9a80204d206f6f6ff09f9a80f09f9a806fc3a96f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066c8a1c555c46cd8cacff1bf051d47982c8d1b6b00000000000000000000000000000000000000000000000000000000000000734d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d4d20f09f9a80c3a9f09f9a8020c3a96ff09f9a804d206f6ff09f9a80204df09f9a804d6f4d206f6ff09f9a806fc3a9c3a9206fc3a94d6f6f4dc3a9f09f9a80f09f9a806fc3a96f206f6f206ff09f9a804dc3a920c3a9f09f9a80f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000007423f8e574849d1ba7f71fc1e83cc78367a519ce000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a806f4d202020206f6ff09f9a804d4d6ff09f9a80f09f9a80c3a9f09f9a806ff09f9a80c3a9f09f9a80c3a96f4d6f4d6f6f6fc3a96f206f4d6f4dc3a94d6f6fc3a9c3a94d20f09f9a804d6f6ff09f9a80f09f9a806f0000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000087694369ef69e5ce5ad639b5e25520ae3cc26e3f000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bool,(bool))", + "type": "(string,bool,(bool))", + "value": ["Moo é🚀ooM ooo 🚀oéoéoMoéo🚀 o🚀o🚀o MoMM oMMéoMé Mo éooé MM", true, [true]], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooM ooo 🚀oéoéoMoéo🚀 o🚀o🚀o MoMM oMMéoMé Mo éooé MM" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101e6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e3565b60405180910390f35b61007a604080516060808201835281526000602080830182905283519081018452908152909182015290565b6100a6604080516060808201835281526000602080830182905283519081018452908152909182015290565b6000604051806080016040528060518152602001610160605191398252506001602080830182905260408051918201815291815290820152919050565b600060208083528351606082850152805180608086015260005b818110156101195782810184015186820160a0015283016100fd565b8181111561012b57600060a083880101525b509185015180151560408601529160408601518051151560608701529250601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a806f6f4d20206f6f6f2020f09f9a806fc3a96fc3a96f4d6fc3a96ff09f9a80206ff09f9a806ff09f9a806f204d6f4d4d206f4d4dc3a96f4dc3a9204d6f20c3a96f6fc3a920204d4da26469706673582212204cbf96b3f0d8574914e5aa4045623812d3def2e4ec7ff22639404e09234d3f8e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_e8f86d64 {\n string s_0;\n bool s_1;\n S_c1053bda s_2;\n }\n\n function test () public pure returns (S_e8f86d64 memory) {\n S_e8f86d64 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀ooM ooo 🚀oéoéoMoéo🚀 o🚀o🚀o MoMM oMMéoMé Mo éooé MM\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_c1053bda memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a806f6f4d20206f6f6f2020f09f9a806fc3a96fc3a96f4d6fc3a96ff09f9a80206ff09f9a806ff09f9a806f204d6f4d4d206f4d4dc3a96f4dc3a9204d6f20c3a96f6fc3a920204d4d000000000000000000000000000000" + }, + { + "name": "random-(string,bool,address)", + "type": "(string,bool,address)", + "value": ["Moo é🚀", true, "0x585A507863445bA39a12dFAE9FBe2EdEd8ac13aE"], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x585A507863445bA39a12dFAE9FBe2EdEd8ac13aE" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610170806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160608082018352808252600060208084018290529284018190528351808301855291825281830181815282850191825284518086018652600a8152689adede418753e13f3560b71b94810194909452928252600190925273585a507863445ba39a12dfae9fbe2eded8ac13ae90915290516100af91906100b8565b60405180910390f35b600060208083528351606082850152805180608086015260005b818110156100ee5782810184015186820160a0015283016100d2565b8181111561010057600060a083880101525b509185015180151560408601529160408601516001600160a01b03811660608701529250601f01601f19169390930160a00194935050505056fea26469706673582212202b93c1651fc71bd53ee768090c04d69f1de99374a3ea79484cc5d8054e1c13df64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7cfcd410 {\n string s_0;\n bool s_1;\n address s_2;\n }\n\n function test () public pure returns (S_7cfcd410 memory) {\n S_7cfcd410 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x585A507863445bA39a12dFAE9FBe2EdEd8ac13aE;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000585a507863445ba39a12dfae9fbe2eded8ac13ae000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bool,int232)", + "type": "(string,bool,int232)", + "value": [ + "Moo é🚀MMoéo o🚀 é🚀 MoMMé🚀é ooooéo ", + false, + "1542782299456912651875209265505829262370574430741737237295861786155365" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMoéo o🚀 é🚀 MoMMé🚀é ooooéo " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "1542782299456912651875209265505829262370574430741737237295861786155365" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d5565b60405180910390f35b60408051606080820183528152600060208201819052918101919091526040805160608082018352815260006020820181905291810191909152600060405180606001604052806034815260200161015860349139825250600060208201527c39399805fe502fa06feb8254bd99af63034b4150fd487a2a17a67319656040820152919050565b600060208083528351606082850152805180608086015260005b8181101561010b5782810184015186820160a0015283016100ef565b8181111561011d57600060a083880101525b5091850151801515604086015291604086015192506101416060860184601c0b9052565b601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a804d4d6fc3a96f206ff09f9a8020c3a9f09f9a80204d6f4d4dc3a9f09f9a80c3a9206f6f6f6fc3a96f2020a2646970667358221220799141d615dc431b337bf309718a3b51f6d3757efe4bc08e64659d50a428f73d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f611d70a {\n string s_0;\n bool s_1;\n int232 s_2;\n }\n\n function test () public pure returns (S_f611d70a memory) {\n S_f611d70a memory r;\n {\n string memory r_0 = unicode\"Moo é🚀MMoéo o🚀 é🚀 MoMMé🚀é ooooéo \";\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n int232 r_2 = 1542782299456912651875209265505829262370574430741737237295861786155365;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000039399805fe502fa06feb8254bd99af63034b4150fd487a2a17a673196500000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a804d4d6fc3a96f206ff09f9a8020c3a9f09f9a80204d6f4d4dc3a9f09f9a80c3a9206f6f6f6fc3a96f2020000000000000000000000000" + }, + { + "name": "random-(string,bool,uint)", + "type": "(string,bool,uint)", + "value": [ + "Moo é🚀", + false, + "103075987005760934046283649838662785784144281163748979098933822903802426382469" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "103075987005760934046283649838662785784144281163748979098933822903802426382469" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061019c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f0565b60405180910390f35b610074604051806060016040528060608152602001600015158152602001600081525090565b61009a604051806060016040528060608152602001600015158152602001600081525090565b604080518082018252600a8152689adede418753e13f3560b71b6020808301919091529083526000908301527fe3e2f0f1e64279197c31840963aeeec70e59240e29d4b3205898fefb97a5588590820152919050565b600060208083528351606082850152805180608086015260005b818110156101265782810184015186820160a00152830161010a565b8181111561013857600060a083880101525b5091850151801515604086015291604095909501516060850152505050601f91909101601f19160160a0019056fea26469706673582212207008d6f548746fd3d55719582f832994270ecf24185fb181ee52f2851018ae1764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1678058e {\n string s_0;\n bool s_1;\n uint256 s_2;\n }\n\n function test () public pure returns (S_1678058e memory) {\n S_1678058e memory r;\n {\n string memory r_0 = unicode\"Moo é🚀\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n uint r_2 = 103075987005760934046283649838662785784144281163748979098933822903802426382469;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000e3e2f0f1e64279197c31840963aeeec70e59240e29d4b3205898fefb97a55885000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bool)[3]", + "type": "(string,bool)[3]", + "value": [ + ["Moo é🚀 🚀 oé🚀éMéé🚀éé🚀 oo🚀 M", false], + ["Moo é🚀", true], + ["Moo é🚀éMoMMMMoo🚀MoMM Moéo o o🚀o Mé🚀", false] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀 oé🚀éMéé🚀éé🚀 oo🚀 M" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMoMMMMoo🚀MoMM Moéo o o🚀o Mé🚀" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610152565b60405180910390f35b610056610118565b61005e610118565b60408051808201909152606081526000602082015260006040518060600160405280603481526020016101f06034913982525060006020808301829052918352604080518082018252606080825281850184815283518085018552600a8152689adede418753e13f3560b71b81880152835260019052858501919091528151808301835281815280850184905282519182019092526033808252919390919061022490830139825250600060208201526040820152919050565b60405180606001604052806003905b6040805180820190915260608152600060208201528152602001906001900390816101275790505090565b6020808252600090608083018382018584805b60038110156101e257601f1980898703018552835160408151818952805180838b01528692505b808310156101aa578183018b01518a840160600152918a019161018c565b808311156101bb57866060828c0101525b928a01511515898b01525050601f0116909401606001939285019291850191600101610165565b509297965050505050505056fe4d6f6f20c3a9f09f9a802020f09f9a80206fc3a9f09f9a80c3a94dc3a9c3a9f09f9a80c3a9c3a9f09f9a80206f6ff09f9a80204d4d6f6f20c3a9f09f9a80c3a94d6f4d4d4d4d6f6ff09f9a804d6f4d4d204d6fc3a96f206f206ff09f9a806f204dc3a9f09f9a80a264697066735822122088bcefcca7204456e8b9ad7d6354ebd7a92304ca3df39cdb9df98f5b8ebc929664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fc3be6c5 {\n string s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_fc3be6c5[3] memory) {\n S_fc3be6c5[3] memory r;\n {\n S_fc3be6c5 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 🚀 oé🚀éMéé🚀éé🚀 oo🚀 M\";\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_fc3be6c5 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀\";\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_fc3be6c5 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀éMoMMMMoo🚀MoMM Moéo o o🚀o Mé🚀\";\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a802020f09f9a80206fc3a9f09f9a80c3a94dc3a9c3a9f09f9a80c3a9c3a9f09f9a80206f6ff09f9a80204d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80c3a94d6f4d4d4d4d6f6ff09f9a804d6f4d4d204d6fc3a96f206f206ff09f9a806f204dc3a9f09f9a8000000000000000000000000000" + }, + { + "name": "random-(string,bytes29,bool)", + "type": "(string,bytes29,bool)", + "value": ["Moo é🚀", "0x7ed1ab54e61a59de9271cf657d72cc1fed2256d52d003f3ca02ad8e407", false], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x7ed1ab54e61a59de9271cf657d72cc1fed2256d52d003f3ca02ad8e407" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610176806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160608082018352808252600060208084018290529284018190528351808301855291825281830181815282850182815285518087018752600a8152689adede418753e13f3560b71b958101959095529383527f7ed1ab54e61a59de9271cf657d72cc1fed2256d52d003f3ca02ad8e407000000905290915290516100b891906100c1565b60405180910390f35b600060208083528351606082850152805180608086015260005b818110156100f75782810184015186820160a0015283016100db565b8181111561010957600060a083880101525b509185015162ffffff198116604086015291604086015180151560608701529250601f01601f19169390930160a00194935050505056fea26469706673582212200087d82b3045b510853e72630d1b0be2bba4b607f2c7409adfaef05039de29b464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_35b1e60d {\n string s_0;\n bytes29 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_35b1e60d memory) {\n S_35b1e60d memory r;\n {\n string memory r_0 = unicode\"Moo é🚀\";\n r.s_0 = r_0;\n }\n {\n bytes29 r_1 = bytes29(0x7ed1ab54e61a59de9271cf657d72cc1fed2256d52d003f3ca02ad8e407);\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000607ed1ab54e61a59de9271cf657d72cc1fed2256d52d003f3ca02ad8e4070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,int56[3])", + "type": "(string,int56[3])", + "value": [ + "Moo é🚀 é🚀Mo oo🚀🚀ooéééoooéo 🚀Mo🚀🚀o🚀", + ["-1948300037630142", "13003491236077599", "-21484888451169022"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é🚀Mo oo🚀🚀ooéééoooéo 🚀Mo🚀🚀o🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1948300037630142" + }, + { + "type": "number", + "value": "13003491236077599" + }, + { + "type": "number", + "value": "-21484888451169022" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f3565b60405180910390f35b6100566100b6565b61005e6100b6565b6000604051806080016040528060418152602001610182604191398252506100846100d5565b6606ebf7f3a8a8bd198152662e329b3bf7601f602080830191909152664c5464682bbafd196040830152820152919050565b6040518060400160405280606081526020016100d06100d5565b905290565b60405180606001604052806003906020820280368337509192915050565b60006020808352835160808285015280518060a086015260005b818110156101295782810184015186820160c00152830161010d565b8181111561013b57600060c083880101525b508286015191506040850160005b600381101561016957835160060b82529284019290840190600101610149565b5050601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a8020c3a9f09f9a804d6f206f6ff09f9a80f09f9a806f6fc3a9c3a9c3a96f6f6fc3a96f2020f09f9a804d6ff09f9a80f09f9a806ff09f9a80a2646970667358221220f446782dbd49c8b810e5daa87bae9e7af60e4090094a95b0df61e92ec0f17b8064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_12125573 {\n string s_0;\n int56[3] s_1;\n }\n\n function test () public pure returns (S_12125573 memory) {\n S_12125573 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 é🚀Mo oo🚀🚀ooéééoooéo 🚀Mo🚀🚀o🚀\";\n r.s_0 = r_0;\n }\n {\n int56[3] memory r_1;\n {\n int56 r_1_0 = -1948300037630142;\n r_1[0] = r_1_0;\n }\n {\n int56 r_1_1 = 13003491236077599;\n r_1[1] = r_1_1;\n }\n {\n int56 r_1_2 = -21484888451169022;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080fffffffffffffffffffffffffffffffffffffffffffffffffff914080c575742000000000000000000000000000000000000000000000000002e329b3bf7601fffffffffffffffffffffffffffffffffffffffffffffffffffb3ab9b97d4450200000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a8020c3a9f09f9a804d6f206f6ff09f9a80f09f9a806f6fc3a9c3a9c3a96f6f6fc3a96f2020f09f9a804d6ff09f9a80f09f9a806ff09f9a8000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,int72,address)", + "type": "(string,int72,address)", + "value": [ + "Moo é🚀oM🚀Mo🚀é", + "2189178306521172816063", + "0x587E7db9247BCA8103E633c28fbf61851ca7566b" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM🚀Mo🚀é" + }, + { + "type": "number", + "value": "2189178306521172816063" + }, + { + "type": "address", + "value": "0x587E7db9247BCA8103E633c28fbf61851ca7566b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610193806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160608082018352808252600060208084018290529284018190528351808301855291825281830181815282850191825284518086018652601881527f4d6f6f20c3a9f09f9a806f4df09f9a804d6ff09f9a80c3a90000000000000000948101949094529282526876acf3b70469b830bf90925273587e7db9247bca8103e633c28fbf61851ca7566b90915290516100cb91906100d4565b60405180910390f35b600060208083528351606082850152805180608086015260005b8181101561010a5782810184015186820160a0015283016100ee565b8181111561011c57600060a083880101525b509185015191610131604086018460080b9052565b60408601516001600160a01b03811660608701529250601f01601f19169390930160a00194935050505056fea26469706673582212208af87f5f227d877dd83e4ab78f55344de4ce8e0174ae43a406ec45af4467bce764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ff4aa1fc {\n string s_0;\n int72 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_ff4aa1fc memory) {\n S_ff4aa1fc memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oM🚀Mo🚀é\";\n r.s_0 = r_0;\n }\n {\n int72 r_1 = 2189178306521172816063;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x587E7db9247BCA8103E633c28fbf61851ca7566b;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000076acf3b70469b830bf000000000000000000000000587e7db9247bca8103e633c28fbf61851ca7566b00000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a806f4df09f9a804d6ff09f9a80c3a90000000000000000" + }, + { + "name": "random-(string,string,bytes14)", + "type": "(string,string,bytes14)", + "value": [ + "Moo é🚀o🚀o🚀Mo éoo ooMooéoo oéM🚀o éo🚀 Méo 🚀🚀🚀🚀Méo🚀 ", + "Moo é🚀oéMéoo oo🚀🚀Mo 🚀oooéo é🚀éM🚀oM ", + "0xdb26e6948c15e677bd22714f806b" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀o🚀Mo éoo ooMooéoo oéM🚀o éo🚀 Méo 🚀🚀🚀🚀Méo🚀 " + }, + { + "type": "string", + "value": "Moo é🚀oéMéoo oo🚀🚀Mo 🚀oooéo é🚀éM🚀oM " + }, + { + "type": "hexstring", + "value": "0xdb26e6948c15e677bd22714f806b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061025c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012f565b60405180910390f35b60408051606080820183528082526020820152600091810191909152604080516060808201835280825260208201526000918101919091526000604051806080016040528060578152602001610195605791398252506040805160608101909152603b808252600091906101ec60208301396020830152506ddb26e6948c15e677bd22714f806b60901b6040820152919050565b6000815180845260005b81811015610108576020818501810151868301820152016100ec565b8181111561011a576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516060602084015261014b60808401826100e2565b90506020840151601f1984830301604085015261016882826100e2565b91505071ffffffffffffffffffffffffffffffffffff196040850151166060840152809150509291505056fe4d6f6f20c3a9f09f9a806ff09f9a806ff09f9a804d6f20c3a96f6f206f6f4d6f6fc3a96f6f20206fc3a94df09f9a806f20c3a96ff09f9a80204dc3a96f20f09f9a80f09f9a80f09f9a80f09f9a804dc3a96ff09f9a80204d6f6f20c3a9f09f9a806fc3a94dc3a96f6f206f6ff09f9a80f09f9a804d6f20f09f9a806f6f6fc3a96f20c3a9f09f9a80c3a94df09f9a806f4d20a26469706673582212207141a62be6e0b431b0a890db3303bf65968b503dc3ee9d8652a169638daeb40b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_025cdb28 {\n string s_0;\n string s_1;\n bytes14 s_2;\n }\n\n function test () public pure returns (S_025cdb28 memory) {\n S_025cdb28 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o🚀o🚀Mo éoo ooMooéoo oéM🚀o éo🚀 Méo 🚀🚀🚀🚀Méo🚀 \";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oéMéoo oo🚀🚀Mo 🚀oooéo é🚀éM🚀oM \";\n r.s_1 = r_1;\n }\n {\n bytes14 r_2 = bytes14(0xdb26e6948c15e677bd22714f806b);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0db26e6948c15e677bd22714f806b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806ff09f9a806ff09f9a804d6f20c3a96f6f206f6f4d6f6fc3a96f6f20206fc3a94df09f9a806f20c3a96ff09f9a80204dc3a96f20f09f9a80f09f9a80f09f9a80f09f9a804dc3a96ff09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a806fc3a94dc3a96f6f206f6ff09f9a80f09f9a804d6f20f09f9a806f6f6fc3a96f20c3a9f09f9a80c3a94df09f9a806f4d200000000000" + }, + { + "name": "random-(string,string,bytes18)", + "type": "(string,string,bytes18)", + "value": [ + "Moo é🚀o éééo o🚀Moééé 🚀 o🚀Mo oo oMooM M éM🚀éMMoooMM o🚀o éooo", + "Moo é🚀oo M 🚀éé éoé 🚀🚀 MM o🚀MMMéM🚀é🚀🚀 oéé 🚀MMo o o", + "0x4a41806a46ff5278fd8700956eb95ca194a1" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o éééo o🚀Moééé 🚀 o🚀Mo oo oMooM M éM🚀éMMoooMM o🚀o éooo" + }, + { + "type": "string", + "value": "Moo é🚀oo M 🚀éé éoé 🚀🚀 MM o🚀MMMéM🚀é🚀🚀 oéé 🚀MMo o o" + }, + { + "type": "hexstring", + "value": "0x4a41806a46ff5278fd8700956eb95ca194a1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610278806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610133565b60405180910390f35b604080516060808201835280825260208201526000918101919091526040805160608082018352808252602082015260009181019190915260006040518060800160405280605781526020016101ec6057913982525060408051608081019091526057808252600091906101956020830139602083015250714a41806a46ff5278fd8700956eb95ca194a160701b6040820152919050565b6000815180845260005b8181101561010c576020818501810151868301820152016100f0565b8181111561011e576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516060602084015261014f60808401826100e6565b90506020840151601f1984830301604085015261016c82826100e6565b9150506dffffffffffffffffffffffffffff196040850151166060840152809150509291505056fe4d6f6f20c3a9f09f9a806f6f204d20f09f9a80c3a9c3a920c3a96fc3a920f09f9a80f09f9a80204d4d206ff09f9a804d4d4dc3a94df09f9a80c3a9f09f9a80f09f9a80206fc3a9c3a920f09f9a804d4d6f2020206f206f4d6f6f20c3a9f09f9a806f20c3a9c3a9c3a96f206ff09f9a804d6fc3a9c3a9c3a920f09f9a80206ff09f9a804d6f206f6f206f4d6f6f4d204d20c3a94df09f9a80c3a94d4d6f6f6f4d4d206ff09f9a806f20c3a96f6f6fa2646970667358221220e1c8f2aca34a5bc22adfc90f72c016f8a278ec0fd0adcc19671aed24ca158d4c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2324a664 {\n string s_0;\n string s_1;\n bytes18 s_2;\n }\n\n function test () public pure returns (S_2324a664 memory) {\n S_2324a664 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o éééo o🚀Moééé 🚀 o🚀Mo oo oMooM M éM🚀éMMoooMM o🚀o éooo\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oo M 🚀éé éoé 🚀🚀 MM o🚀MMMéM🚀é🚀🚀 oéé 🚀MMo o o\";\n r.s_1 = r_1;\n }\n {\n bytes18 r_2 = bytes18(0x4a41806a46ff5278fd8700956eb95ca194a1);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e04a41806a46ff5278fd8700956eb95ca194a1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f20c3a9c3a9c3a96f206ff09f9a804d6fc3a9c3a9c3a920f09f9a80206ff09f9a804d6f206f6f206f4d6f6f4d204d20c3a94df09f9a80c3a94d4d6f6f6f4d4d206ff09f9a806f20c3a96f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f6f204d20f09f9a80c3a9c3a920c3a96fc3a920f09f9a80f09f9a80204d4d206ff09f9a804d4d4dc3a94df09f9a80c3a9f09f9a80f09f9a80206fc3a9c3a920f09f9a804d4d6f2020206f206f000000000000000000" + }, + { + "name": "random-(string,string[2])", + "type": "(string,string[2])", + "value": [ + "Moo é🚀 éMoéM🚀🚀🚀Méoo", + [ + "Moo é🚀MM o o🚀MM oMMMooooééo🚀ééMoMé🚀M Méo o 🚀éoo 🚀MééoéoMéé", + "Moo é🚀M éééMMééoooM🚀 oM MéooMo 🚀o ooMo éooéoooo🚀ooo oMo" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éMoéM🚀🚀🚀Méoo" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM o o🚀MM oMMMooooééo🚀ééMoMé🚀M Méo o 🚀éoo 🚀MééoéoMéé" + }, + { + "type": "string", + "value": "Moo é🚀M éééMMééoooM🚀 oM MéooMo 🚀o ooMo éooéoooo🚀ooo oMo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102d7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610166565b60405180910390f35b6100566100d3565b61005e6100d3565b60006040518060600160405280602381526020016101d7602391398252506100846100f2565b60006040518060800160405280605c81526020016101fa605c91398252506040805160808101909152604c80825260009190610256602083013960208084019190915283019190915250919050565b6040518060400160405280606081526020016100ed6100f2565b905290565b60405180604001604052806002905b60608152602001906001900390816101015790505090565b6000815180845260005b8181101561013f57602081850181015186830182015201610123565b81811115610151576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516040828501526101826060850182610119565b905081850151601f19858303016040860152818290506040830160005b60028110156101ca5784820383526101b8828551610119565b9386019392860192915060010161019f565b5097965050505050505056fe4d6f6f20c3a9f09f9a8020c3a94d6fc3a94df09f9a80f09f9a80f09f9a804dc3a96f6f4d6f6f20c3a9f09f9a804d4d206f206ff09f9a804d4d206f4d4d4d6f6f6f6fc3a9c3a96ff09f9a80c3a9c3a94d6f4dc3a9f09f9a804d20204dc3a96f20206f20f09f9a80c3a96f6f2020f09f9a804dc3a9c3a96fc3a96f4dc3a9c3a94d6f6f20c3a9f09f9a804d20c3a9c3a9c3a94d4dc3a9c3a96f6f6f4df09f9a80206f4d204dc3a96f6f4d6f20f09f9a806f206f6f4d6f20c3a96f6fc3a96f6f6f6ff09f9a806f6f6f206f4d6fa2646970667358221220feb99cc3a3eaf7646fcc13a945ca96b22f48cfcd3e2d01e6a3b5a5f4b4840b4264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0f073387 {\n string s_0;\n string[2] s_1;\n }\n\n function test () public pure returns (S_0f073387 memory) {\n S_0f073387 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 éMoéM🚀🚀🚀Méoo\";\n r.s_0 = r_0;\n }\n {\n string[2] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀MM o o🚀MM oMMMooooééo🚀ééMoMé🚀M Méo o 🚀éoo 🚀MééoéoMéé\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀M éééMMééoooM🚀 oM MéooMo 🚀o ooMo éooéoooo🚀ooo oMo\";\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a8020c3a94d6fc3a94df09f9a80f09f9a80f09f9a804dc3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a804d4d206f206ff09f9a804d4d206f4d4d4d6f6f6f6fc3a9c3a96ff09f9a80c3a9c3a94d6f4dc3a9f09f9a804d20204dc3a96f20206f20f09f9a80c3a96f6f2020f09f9a804dc3a9c3a96fc3a96f4dc3a9c3a900000000000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a804d20c3a9c3a9c3a94d4dc3a9c3a96f6f6f4df09f9a80206f4d204dc3a96f6f4d6f20f09f9a806f206f6f4d6f20c3a96f6fc3a96f6f6f6ff09f9a806f6f6f206f4d6f0000000000000000000000000000000000000000" + }, + { + "name": "random-(string,uint104,address)", + "type": "(string,uint104,address)", + "value": [ + "Moo é🚀 o é🚀 Mo 🚀o🚀o", + "9238346067840920805230365047847", + "0x64Cd9E2abc2D703383258deDfF42D9088b84Fb91" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o é🚀 Mo 🚀o🚀o" + }, + { + "type": "number", + "value": "9238346067840920805230365047847" + }, + { + "type": "address", + "value": "0x64Cd9E2abc2D703383258deDfF42D9088b84Fb91" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101bf806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d8565b60405180910390f35b604080516060808201835281526000602082018190529181019190915260408051606080820183528152600060208201819052918101919091526000604051806060016040528060228152602001610168602291398252506c749ab4c2664d5be2c8853afc2760208201527364cd9e2abc2d703383258dedff42d9088b84fb916040820152919050565b600060208083528351606082850152805180608086015260005b8181101561010e5782810184015186820160a0015283016100f2565b8181111561012057600060a083880101525b50918501516cffffffffffffffffffffffffff811660408601529160408601516001600160a01b03811660608701529250601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a80206f20c3a9f09f9a8020204d6f20f09f9a806ff09f9a806fa2646970667358221220c60cad0a85eb113eba4d9cd607ff52f6bf2907f13f6e78e637cb759b28c8a67f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ca08a75a {\n string s_0;\n uint104 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_ca08a75a memory) {\n S_ca08a75a memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 o é🚀 Mo 🚀o🚀o\";\n r.s_0 = r_0;\n }\n {\n uint104 r_1 = 9238346067840920805230365047847;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x64Cd9E2abc2D703383258deDfF42D9088b84Fb91;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000749ab4c2664d5be2c8853afc2700000000000000000000000064cd9e2abc2d703383258dedff42d9088b84fb9100000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80206f20c3a9f09f9a8020204d6f20f09f9a806ff09f9a806f000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,uint128,string)", + "type": "(string,uint128,string)", + "value": ["Moo é🚀o oéoM", "158810186134410791652917158332853204087", "Moo é🚀"], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oéoM" + }, + { + "type": "number", + "value": "158810186134410791652917158332853204087" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b604080516060808201835280825260006020808401829052928401829052835180830185528281528084019182528085019283528451808601865260118152704d6f6f20c3a9f09f9a806f206fc3a96f4d60781b8186015281526f7779bab313b242c934f610c1f591347790915283518085018552600a8152689adede418753e13f3560b71b9381019390935291905290516100cc9190610122565b60405180910390f35b6000815180845260005b818110156100fb576020818501810151868301820152016100df565b8181111561010d576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516060602084015261013e60808401826100d5565b90506fffffffffffffffffffffffffffffffff60208501511660408401526040840151601f1984830301606085015261017782826100d5565b9594505050505056fea2646970667358221220050d7f5af70818e999c2e2999e48b56083412951217e2c15a56315bafdd7ba0164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f9330b38 {\n string s_0;\n uint128 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_f9330b38 memory) {\n S_f9330b38 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o oéoM\";\n r.s_0 = r_0;\n }\n {\n uint128 r_1 = 158810186134410791652917158332853204087;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000007779bab313b242c934f610c1f591347700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a806f206fc3a96f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,uint176,bool)", + "type": "(string,uint176,bool)", + "value": [ + "Moo é🚀éMoéoé🚀 MMo oo🚀oM éooMoé ooéMo ooo o🚀oo ", + "84405130244436888951858077702886380653395139190870820", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMoéoé🚀 MMo oo🚀oM éooMoé ooéMo ooo o🚀oo " + }, + { + "type": "number", + "value": "84405130244436888951858077702886380653395139190870820" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ce565b60405180910390f35b6040805160608082018352815260006020820181905291810191909152604080516060808201835281526000602082018190529181019190915260006040518060800160405280604181526020016101516041913982525075e198556c90b76a4e4f25b1728f20d3b9ad998da05324602082015260016040820152919050565b600060208083528351606082850152805180608086015260005b818110156101045782810184015186820160a0015283016100e8565b8181111561011657600060a083880101525b50918501516001600160b01b038116604086015291604086015180151560608701529250601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a80c3a94d6fc3a96fc3a9f09f9a80204d4d6f206f6ff09f9a806f4d20c3a96f6f4d6fc3a9206f6fc3a94d6f206f6f6f206ff09f9a806f6f20a264697066735822122037a1b279ebb3b76cf4c8f427a5f59f6e7741955bc9a503f0c27db63362c565ac64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a0eb0c66 {\n string s_0;\n uint176 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_a0eb0c66 memory) {\n S_a0eb0c66 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éMoéoé🚀 MMo oo🚀oM éooMoé ooéMo ooo o🚀oo \";\n r.s_0 = r_0;\n }\n {\n uint176 r_1 = 84405130244436888951858077702886380653395139190870820;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000e198556c90b76a4e4f25b1728f20d3b9ad998da05324000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a80c3a94d6fc3a96fc3a9f09f9a80204d4d6f206f6ff09f9a806f4d20c3a96f6f4d6fc3a9206f6fc3a94d6f206f6f6f206ff09f9a806f6f2000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string[][4])", + "type": "(string[][4])", + "value": [ + [ + [ + "Moo é🚀MMoMoéé🚀oo é o🚀o éoM M", + "Moo é🚀M🚀o", + "Moo é🚀🚀é🚀🚀 é🚀o🚀o🚀o oéM🚀o 🚀 é🚀éo🚀🚀o oMooé", + "Moo é🚀🚀🚀 🚀🚀M " + ], + [], + ["Moo é🚀ooo ooéo🚀oééMé🚀🚀ééMéM", "Moo é🚀 M 🚀Mé🚀éooMMooo 🚀éooo🚀🚀🚀 MoMéoM"], + [] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMoMoéé🚀oo é o🚀o éoM M" + }, + { + "type": "string", + "value": "Moo é🚀M🚀o" + }, + { + "type": "string", + "value": "Moo é🚀🚀é🚀🚀 é🚀o🚀o🚀o oéM🚀o 🚀 é🚀éo🚀🚀o oMooé" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀 🚀🚀M " + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo ooéo🚀oééMé🚀🚀ééMéM" + }, + { + "type": "string", + "value": "Moo é🚀 M 🚀Mé🚀éooMMooo 🚀éooo🚀🚀🚀 MoMéoM" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061052e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610324565b60405180910390f35b6100566102e5565b61005e6102e5565b6100666102fd565b60408051600480825260a08201909252600091816020015b606081526020019060019003908161007e57905050905060006040518060600160405280602a815260200161047b602a9139905080826000815181106100c6576100c66103f6565b60200260200101819052505060006040518060400160405280601081526020016f4d6f6f20c3a9f09f9a804df09f9a806f60801b81525090508082600181518110610113576101136103f6565b60200260200101819052505060006040518060800160405280605481526020016104a56054913990508082600281518110610150576101506103f6565b60200260200101819052505060006040518060400160405280601d81526020017f4d6f6f20c3a9f09f9a80f09f9a80f09f9a8020f09f9a80f09f9a804d20000000815250905080826003815181106101aa576101aa6103f6565b60209081029190910181019190915291835250604080516000808252928101909152816101e7565b60608152602001906001900390816101d25790505b5060208301525060408051600280825260608201909252600091816020015b606081526020019060019003908161020657905050905060006040518060600160405280602f815260200161044c602f91399050808260008151811061024e5761024e6103f6565b60200260200101819052505060006040518060600160405280603f815260200161040d603f91399050808260018151811061028b5761028b6103f6565b602090810291909101015250808260026020020152506000806040519080825280602002602001820160405280156102d757816020015b60608152602001906001900390816102c25790505b506060830152508152919050565b60405180602001604052806102f86102fd565b905290565b60405180608001604052806004905b606081526020019060019003908161030c5790505090565b602080825282518282018290526000919060c084019060408501845b60048110156103ea57868403603f19018252825180518086529086019086860190600581901b8701880160005b828110156103d457601f19808a84030185528551805180855260005b818110156103a4578281018e01518682018f01528d01610389565b818111156103b55760008e83880101525b50968c0196958c0195601f01909116929092018a01915060010161036d565b5096505050928501925090840190600101610340565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80204d20f09f9a804dc3a9f09f9a80c3a96f6f4d4d6f6f6f20f09f9a80c3a96f6f6ff09f9a80f09f9a80f09f9a80204d6f4dc3a96f4d4d6f6f20c3a9f09f9a806f6f6f206f6fc3a96ff09f9a806fc3a9c3a94dc3a9f09f9a80f09f9a80c3a9c3a94dc3a94d4d6f6f20c3a9f09f9a804d4d6f4d6fc3a9c3a9f09f9a806f6f20c3a9206ff09f9a806f20c3a96f4d204d4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a80f09f9a8020c3a9f09f9a806ff09f9a806ff09f9a806f20206fc3a94df09f9a806f20f09f9a8020c3a9f09f9a80c3a96ff09f9a80f09f9a806f206f4d6f6fc3a9a26469706673582212208a3533e02bba569eefb2453b6241043d220fc7e61d5a9299b5784718e078099f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_38ce9ce6 {\n string[][4] s_0;\n }\n\n function test () public pure returns (S_38ce9ce6 memory) {\n S_38ce9ce6 memory r;\n {\n string[][4] memory r_0;\n {\n string[] memory r_0_0 = new string[](4);\n {\n string memory r_0_0_0 = unicode\"Moo é🚀MMoMoéé🚀oo é o🚀o éoM M\";\n r_0_0[0] = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀M🚀o\";\n r_0_0[1] = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀🚀é🚀🚀 é🚀o🚀o🚀o oéM🚀o 🚀 é🚀éo🚀🚀o oMooé\";\n r_0_0[2] = r_0_0_2;\n }\n {\n string memory r_0_0_3 = unicode\"Moo é🚀🚀🚀 🚀🚀M \";\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n string[] memory r_0_1 = new string[](0);\n r_0[1] = r_0_1;\n }\n {\n string[] memory r_0_2 = new string[](2);\n {\n string memory r_0_2_0 = unicode\"Moo é🚀ooo ooéo🚀oééMé🚀🚀ééMéM\";\n r_0_2[0] = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀 M 🚀Mé🚀éooMMooo 🚀éooo🚀🚀🚀 MoMéoM\";\n r_0_2[1] = r_0_2_1;\n }\n r_0[2] = r_0_2;\n }\n {\n string[] memory r_0_3 = new string[](0);\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a804d4d6f4d6fc3a9c3a9f09f9a806f6f20c3a9206ff09f9a806f20c3a96f4d204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a804df09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a80f09f9a8020c3a9f09f9a806ff09f9a806ff09f9a806f20206fc3a94df09f9a806f20f09f9a8020c3a9f09f9a80c3a96ff09f9a80f09f9a806f206f4d6f6fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a80f09f9a80f09f9a8020f09f9a80f09f9a804d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a806f6f6f206f6fc3a96ff09f9a806fc3a9c3a94dc3a9f09f9a80f09f9a80c3a9c3a94dc3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80204d20f09f9a804dc3a9f09f9a80c3a96f6f4d4d6f6f6f20f09f9a80c3a96f6f6ff09f9a80f09f9a80f09f9a80204d6f4dc3a96f4d000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string[2][])", + "type": "(string[2][])", + "value": [ + [ + [ + "Moo é🚀éM🚀oéoé🚀M éoooMoo🚀🚀oo🚀ooéoMo🚀🚀ééMo🚀éoéo M🚀ooMoo o", + "Moo é🚀o🚀🚀Mo é oo🚀Mo Mo ooo🚀o" + ], + [ + "Moo é🚀MéooMooéMoo MéMoM M éoMM ", + "Moo é🚀🚀 MM🚀o o🚀éMMoéM🚀🚀🚀Mo 🚀éooo 🚀🚀 o🚀 éMM🚀🚀oo M" + ], + [ + "Moo é🚀oooo🚀oMoéo🚀M🚀é", + "Moo é🚀é🚀🚀é MoM🚀🚀éMM éé ooM🚀éo🚀o🚀o🚀oéé oMé🚀o🚀oooMoo oMoéoM🚀 ooM" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éM🚀oéoé🚀M éoooMoo🚀🚀oo🚀ooéoMo🚀🚀ééMo🚀éoéo M🚀ooMoo o" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀Mo é oo🚀Mo Mo ooo🚀o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéooMooéMoo MéMoM M éoMM " + }, + { + "type": "string", + "value": "Moo é🚀🚀 MM🚀o o🚀éMMoéM🚀🚀🚀Mo 🚀éooo 🚀🚀 o🚀 éMM🚀🚀oo M" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooo🚀oMoéo🚀M🚀é" + }, + { + "type": "string", + "value": "Moo é🚀é🚀🚀é MoM🚀🚀éMM éé ooM🚀éo🚀o🚀o🚀oéé oMé🚀o🚀oooMoo oMoéoM🚀 ooM" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104cd806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061020b565b60405180910390f35b60408051602080820183526060808352835191820184528152825160038082526080820190945291929091600091816020015b6100896101e4565b8152602001906001900390816100815790505090506100a66101e4565b60006040518060800160405280605f81526020016103ed605f91398252506040805160608101909152602d808252600091906103c060208301396020830152508151819083906000906100fb576100fb6102de565b60200260200101819052505061010f6101e4565b600060405180606001604052806029815260200161046f602991398252506040805160808101909152605d8082526000919061036360208301396020830152508151819083906001908110610166576101666102de565b60200260200101819052505061017a6101e4565b600060405180606001604052806023815260200161044c602391398252506040805160a08101909152606e808252600091906102f5602083013960208301525081518190839060029081106101d1576101d16102de565b6020908102919091010152508152919050565b60405180604001604052806002905b60608152602001906001900390816101f35790505090565b6000602080835260408084018551838487015281815180845260608801915060608160051b8901019350858301925060005b818110156102d057888503605f1901835283518587810160005b60028110156102bb5788820383528351805180845260005b8181101561028a578281018e01518582018f01528d0161026f565b8181111561029b5760008e83870101525b50948c0194938c0193601f01601f1916929092018b019150600101610257565b5096505050928601929186019160010161023d565b509298975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80c3a9204d6f4df09f9a80f09f9a80c3a94d4d2020c3a9c3a9206f6f4df09f9a80c3a96ff09f9a806ff09f9a806ff09f9a806fc3a9c3a9206f4dc3a9f09f9a806ff09f9a806f6f6f4d6f6f206f4d6fc3a96f4df09f9a80206f6f4d4d6f6f20c3a9f09f9a80f09f9a80204d4df09f9a806f20206ff09f9a80c3a94d4d6fc3a94df09f9a80f09f9a80f09f9a804d6f20f09f9a80c3a96f6f6f20f09f9a80f09f9a80206ff09f9a8020c3a94d4df09f9a80f09f9a806f6f204d4d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d6f20c3a9206f6ff09f9a804d6f204d6f206f6f6ff09f9a806f4d6f6f20c3a9f09f9a80c3a94df09f9a806fc3a96fc3a9f09f9a804d20c3a96f6f6f4d6f6ff09f9a80f09f9a806f6ff09f9a806f6fc3a96f4d6ff09f9a80f09f9a80c3a9c3a94d6ff09f9a80c3a96fc3a96f204df09f9a806f6f4d6f6f206f4d6f6f20c3a9f09f9a806f6f6f6ff09f9a806f4d6fc3a96ff09f9a804df09f9a80c3a94d6f6f20c3a9f09f9a804dc3a96f6f4d6f6fc3a94d6f6f20204dc3a94d6f4d20204d20c3a96f4d4d20a2646970667358221220b47f6f267fc8e840783e7a98e35caacbb48200cd05b483962a985f4681497f1064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c02107cd {\n string[2][] s_0;\n }\n\n function test () public pure returns (S_c02107cd memory) {\n S_c02107cd memory r;\n {\n string[2][] memory r_0 = new string[2][](3);\n {\n string[2] memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀éM🚀oéoé🚀M éoooMoo🚀🚀oo🚀ooéoMo🚀🚀ééMo🚀éoéo M🚀ooMoo o\";\n r_0_0[0] = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀o🚀🚀Mo é oo🚀Mo Mo ooo🚀o\";\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n string[2] memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀MéooMooéMoo MéMoM M éoMM \";\n r_0_1[0] = r_0_1_0;\n }\n {\n string memory r_0_1_1 = unicode\"Moo é🚀🚀 MM🚀o o🚀éMMoéM🚀🚀🚀Mo 🚀éooo 🚀🚀 o🚀 éMM🚀🚀oo M\";\n r_0_1[1] = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n {\n string[2] memory r_0_2;\n {\n string memory r_0_2_0 = unicode\"Moo é🚀oooo🚀oMoéo🚀M🚀é\";\n r_0_2[0] = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀é🚀🚀é MoM🚀🚀éMM éé ooM🚀éo🚀o🚀o🚀oéé oMé🚀o🚀oooMoo oMoéoM🚀 ooM\";\n r_0_2[1] = r_0_2_1;\n }\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005f4d6f6f20c3a9f09f9a80c3a94df09f9a806fc3a96fc3a9f09f9a804d20c3a96f6f6f4d6f6ff09f9a80f09f9a806f6ff09f9a806f6fc3a96f4d6ff09f9a80f09f9a80c3a9c3a94d6ff09f9a80c3a96fc3a96f204df09f9a806f6f4d6f6f206f00000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d6f20c3a9206f6ff09f9a804d6f204d6f206f6f6ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a804dc3a96f6f4d6f6fc3a94d6f6f20204dc3a94d6f4d20204d20c3a96f4d4d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a80f09f9a80204d4df09f9a806f20206ff09f9a80c3a94d4d6fc3a94df09f9a80f09f9a80f09f9a804d6f20f09f9a80c3a96f6f6f20f09f9a80f09f9a80206ff09f9a8020c3a94d4df09f9a80f09f9a806f6f204d000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806f6f6f6ff09f9a806f4d6fc3a96ff09f9a804df09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80c3a9204d6f4df09f9a80f09f9a80c3a94d4d2020c3a9c3a9206f6f4df09f9a80c3a96ff09f9a806ff09f9a806ff09f9a806fc3a9c3a9206f4dc3a9f09f9a806ff09f9a806f6f6f4d6f6f206f4d6fc3a96f4df09f9a80206f6f4d000000000000000000000000000000000000" + }, + { + "name": "random-(string[4],bytes3)", + "type": "(string[4],bytes3)", + "value": [ + [ + "Moo é🚀", + "Moo é🚀Méo Mo oo oéMM🚀Mé🚀🚀o", + "Moo é🚀", + "Moo é🚀🚀o éo🚀M🚀oo éoééM🚀 MM Mo🚀é 🚀MM🚀o" + ], + "0x2843ff" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀Méo Mo oo oéMM🚀Mé🚀🚀o" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀o éo🚀M🚀oo éoééM🚀 MM Mo🚀é 🚀MM🚀o" + } + ] + }, + { + "type": "hexstring", + "value": "0x2843ff" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610294806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061014b565b60405180910390f35b610056610104565b61005e610104565b610066610124565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160608101909252602b808352600092916101ee90830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b81840152818501528051608081019091526046808252600093509091610219908301396060830152508152622843ff60e81b6020820152919050565b6040518060400160405280610117610124565b8152600060209091015290565b60405180608001604052806004905b60608152602001906001900390816101335790505090565b602080825282516040838301526000919060e08401906060850184805b60048110156101ce57878503605f1901835283518051808752835b8181101561019e578281018901518882018a01528801610183565b818111156101ae578489838a0101525b50601f01601f191695909501860194509285019291850191600101610168565b505050509301516001600160e81b03191660409290920191909152509056fe4d6f6f20c3a9f09f9a804dc3a96f20204d6f206f6f206fc3a94d4df09f9a804dc3a9f09f9a80f09f9a806f4d6f6f20c3a9f09f9a80f09f9a806f20c3a96ff09f9a804df09f9a806f6f20c3a96fc3a9c3a94df09f9a802020204d4d20204d6ff09f9a80c3a920f09f9a804d4df09f9a806fa2646970667358221220351ca812ad8f0e80d11a8d77a5ac7a02b3a7ba17cb7256d0e55349a548ea6aa064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8c9de1fc {\n string[4] s_0;\n bytes3 s_1;\n }\n\n function test () public pure returns (S_8c9de1fc memory) {\n S_8c9de1fc memory r;\n {\n string[4] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀Méo Mo oo oéMM🚀Mé🚀🚀o\";\n r_0[1] = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀\";\n r_0[2] = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀🚀o éo🚀M🚀oo éoééM🚀 MM Mo🚀é 🚀MM🚀o\";\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bytes3 r_1 = bytes3(0x2843ff);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000402843ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a804dc3a96f20204d6f206f6f206fc3a94d4df09f9a804dc3a9f09f9a80f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80f09f9a806f20c3a96ff09f9a804df09f9a806f6f20c3a96fc3a9c3a94df09f9a802020204d4d20204d6ff09f9a80c3a920f09f9a804d4df09f9a806f0000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint,string,string)", + "type": "(uint,string,string)", + "value": [ + "54524587287431397708840248605861744681409739267612620386551855565891580234006", + "Moo é🚀Mé 🚀o🚀🚀éo o o🚀 oé🚀ooé éMéo MMo🚀🚀🚀éoo", + "Moo é🚀ooé🚀éoM🚀MooMoo🚀 oééoo🚀🚀o🚀M🚀éoé Méooé M éo🚀 o🚀🚀 🚀🚀M ooo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "54524587287431397708840248605861744681409739267612620386551855565891580234006" + }, + { + "type": "string", + "value": "Moo é🚀Mé 🚀o🚀🚀éo o o🚀 oé🚀ooé éMéo MMo🚀🚀🚀éoo" + }, + { + "type": "string", + "value": "Moo é🚀ooé🚀éoM🚀MooMoo🚀 oééoo🚀🚀o🚀M🚀éoé Méooé M éo🚀 o🚀🚀 🚀🚀M ooo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610293806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610154565b60405180910390f35b61007260405180606001604052806000815260200160608152602001606081525090565b61009660405180606001604052806000815260200160608152602001606081525090565b7f788bd2a14d65f96bc408a1c39b8240e44f3b913879f203ce6a7da3077b10891681526040805160808101909152604e80825260009190610210602083013990508082602001819052505060006040518060a00160405280606f81526020016101a1606f9139604083015250919050565b6000815180845260005b8181101561012d57602081850181015186830182015201610111565b8181111561013f576000602083870101525b50601f01601f19169290920160200192915050565b6020815281516020820152600060208301516060604084015261017a6080840182610107565b90506040840151601f198483030160608501526101978282610107565b9594505050505056fe4d6f6f20c3a9f09f9a806f6fc3a9f09f9a80c3a96f4df09f9a804d6f6f4d6f6ff09f9a80206fc3a9c3a96f6ff09f9a80f09f9a806ff09f9a804df09f9a80c3a96fc3a9204dc3a96f6fc3a9204d20c3a96ff09f9a8020206ff09f9a80f09f9a8020f09f9a80f09f9a804d20206f6f6f4d6f6f20c3a9f09f9a804dc3a920f09f9a806ff09f9a80f09f9a80c3a96f206f206ff09f9a80206fc3a9f09f9a806f6fc3a92020c3a94dc3a96f204d4d6ff09f9a80f09f9a80f09f9a80c3a96f6fa2646970667358221220228801565ab97bbc8eeb54d8c4e47fc2655f599cb97a8138d4c05b8b9d7ff31664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_16fe4aa2 {\n uint256 s_0;\n string s_1;\n string s_2;\n }\n\n function test () public pure returns (S_16fe4aa2 memory) {\n S_16fe4aa2 memory r;\n {\n uint r_0 = 54524587287431397708840248605861744681409739267612620386551855565891580234006;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀Mé 🚀o🚀🚀éo o o🚀 oé🚀ooé éMéo MMo🚀🚀🚀éoo\";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀ooé🚀éoM🚀MooMoo🚀 oééoo🚀🚀o🚀M🚀éoé Méooé M éo🚀 o🚀🚀 🚀🚀M ooo\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020788bd2a14d65f96bc408a1c39b8240e44f3b913879f203ce6a7da3077b108916000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a804dc3a920f09f9a806ff09f9a80f09f9a80c3a96f206f206ff09f9a80206fc3a9f09f9a806f6fc3a92020c3a94dc3a96f204d4d6ff09f9a80f09f9a80f09f9a80c3a96f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f4d6f6f20c3a9f09f9a806f6fc3a9f09f9a80c3a96f4df09f9a804d6f6f4d6f6ff09f9a80206fc3a9c3a96f6ff09f9a80f09f9a806ff09f9a804df09f9a80c3a96fc3a9204dc3a96f6fc3a9204d20c3a96ff09f9a8020206ff09f9a80f09f9a8020f09f9a80f09f9a804d20206f6f6f0000000000000000000000000000000000" + }, + { + "name": "random-(uint112[3],string)", + "type": "(uint112[3],string)", + "value": [ + [ + "4830819422813516713667798302443816", + "5139560717576589715993819474146862", + "4477849769754517697082455873796077" + ], + "Moo é🚀éo Moéooéé🚀é🚀é MMMo🚀 MM 🚀oM 🚀 🚀oMé🚀M oM M🚀o🚀oMo🚀oo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4830819422813516713667798302443816" + }, + { + "type": "number", + "value": "5139560717576589715993819474146862" + }, + { + "type": "number", + "value": "4477849769754517697082455873796077" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éo Moéooéé🚀é🚀é MMMo🚀 MM 🚀oM 🚀 🚀oMé🚀M oM M🚀o🚀oMo🚀oo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061023f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010c565b60405180910390f35b6100566100ce565b61005e6100ce565b6100666100ee565b6dee2d83694bc3456570cb5b23c92881526dfd6660569e54d54b814d0d35b62e6020808301919091526ddcc668f3774a3212ebd6eab7b7ed604080840191909152918352815160a081019092526061808352600092916101a990830139602083015250919050565b60405180604001604052806100e16100ee565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b6020808252825160009190828483015b600382101561014b5782516dffffffffffffffffffffffffffff1681529183019160019190910190830161011c565b5050508084015160808085015280518060a086015260005b8181101561017f5782810184015186820160c001528301610163565b8181111561019157600060c083880101525b50601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a80c3a96f204d6fc3a96f6fc3a9c3a9f09f9a80c3a9f09f9a80c3a9204d4d4d6ff09f9a80204d4d20f09f9a806f4d20f09f9a8020f09f9a806f4dc3a9f09f9a804d206f4d204df09f9a806ff09f9a806f4d6ff09f9a806f6fa2646970667358221220005eb118b971ad590afa12392bc36f45de9acc6bc5eb9c383de4ca88a2b7104564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b8d2bf17 {\n uint112[3] s_0;\n string s_1;\n }\n\n function test () public pure returns (S_b8d2bf17 memory) {\n S_b8d2bf17 memory r;\n {\n uint112[3] memory r_0;\n {\n uint112 r_0_0 = 4830819422813516713667798302443816;\n r_0[0] = r_0_0;\n }\n {\n uint112 r_0_1 = 5139560717576589715993819474146862;\n r_0[1] = r_0_1;\n }\n {\n uint112 r_0_2 = 4477849769754517697082455873796077;\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éo Moéooéé🚀é🚀é MMMo🚀 MM 🚀oM 🚀 🚀oMé🚀M oM M🚀o🚀oMo🚀oo\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000ee2d83694bc3456570cb5b23c928000000000000000000000000000000000000fd6660569e54d54b814d0d35b62e000000000000000000000000000000000000dcc668f3774a3212ebd6eab7b7ed000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a80c3a96f204d6fc3a96f6fc3a9c3a9f09f9a80c3a9f09f9a80c3a9204d4d4d6ff09f9a80204d4d20f09f9a806f4d20f09f9a8020f09f9a806f4dc3a9f09f9a804d206f4d204df09f9a806ff09f9a806f4d6ff09f9a806f6f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint144,bytes18[4])", + "type": "(uint144,bytes18[4])", + "value": [ + "11834389873081563033314147946862770610627112", + [ + "0xe60b7482e31383236eed8742748f36666e79", + "0xf7ea63f8ecba4e28ff765164d2ab099b1a0e", + "0x3e454f9aea23eb11dd3dc22c48e16ac2dd05", + "0x1caaff77e3023f4170fe8c393602f65eef29" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "11834389873081563033314147946862770610627112" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe60b7482e31383236eed8742748f36666e79" + }, + { + "type": "hexstring", + "value": "0xf7ea63f8ecba4e28ff765164d2ab099b1a0e" + }, + { + "type": "hexstring", + "value": "0x3e454f9aea23eb11dd3dc22c48e16ac2dd05" + }, + { + "type": "hexstring", + "value": "0x1caaff77e3023f4170fe8c393602f65eef29" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610136565b60405180910390f35b6100566100f0565b61005e6100f0565b7187da25670317f2fed86d268675a4bcf5e228815261007b610118565b71e60b7482e31383236eed8742748f36666e7960701b8152717bf531fc765d27147fbb28b2695584cd8d0760711b602080830191909152713e454f9aea23eb11dd3dc22c48e16ac2dd0560701b6040830152711caaff77e3023f4170fe8c393602f65eef2960701b6060830152820152919050565b604051806040016040528060006001600160901b03168152602001610113610118565b905290565b60405180608001604052806004906020820280368337509192915050565b81516001600160901b0316815260208083015160a08301919081840160005b60048110156101835782516dffffffffffffffffffffffffffff191682529183019190830190600101610155565b505050509291505056fea2646970667358221220e48205a1a33a7cfd30367f7655bdf626cf70b39931ceb3c59eeeacf9bb14083e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f8445361 {\n uint144 s_0;\n bytes18[4] s_1;\n }\n\n function test () public pure returns (S_f8445361 memory) {\n S_f8445361 memory r;\n {\n uint144 r_0 = 11834389873081563033314147946862770610627112;\n r.s_0 = r_0;\n }\n {\n bytes18[4] memory r_1;\n {\n bytes18 r_1_0 = bytes18(0xe60b7482e31383236eed8742748f36666e79);\n r_1[0] = r_1_0;\n }\n {\n bytes18 r_1_1 = bytes18(0xf7ea63f8ecba4e28ff765164d2ab099b1a0e);\n r_1[1] = r_1_1;\n }\n {\n bytes18 r_1_2 = bytes18(0x3e454f9aea23eb11dd3dc22c48e16ac2dd05);\n r_1[2] = r_1_2;\n }\n {\n bytes18 r_1_3 = bytes18(0x1caaff77e3023f4170fe8c393602f65eef29);\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000087da25670317f2fed86d268675a4bcf5e228e60b7482e31383236eed8742748f36666e790000000000000000000000000000f7ea63f8ecba4e28ff765164d2ab099b1a0e00000000000000000000000000003e454f9aea23eb11dd3dc22c48e16ac2dd0500000000000000000000000000001caaff77e3023f4170fe8c393602f65eef290000000000000000000000000000" + }, + { + "name": "random-(uint192,(string,bytes6))", + "type": "(uint192,(string,bytes6))", + "value": [ + "531024955072740163537488200975830992725163050550575040565", + [ + "Moo é🚀éoMo o é MMé🚀 éoM🚀o🚀M🚀oé 🚀éM🚀🚀 é 🚀 ééoMoéoéMéMéooMo", + "0x729a97ba5090" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "531024955072740163537488200975830992725163050550575040565" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoMo o é MMé🚀 éoM🚀o🚀M🚀oé 🚀éM🚀🚀 é 🚀 ééoMoéoéMéMéooMo" + }, + { + "type": "hexstring", + "value": "0x729a97ba5090" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610231806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6100566100c7565b61005e6100c7565b7715a828c295b2bea094b70a05e96ae19c876417adf3a90835815260408051808201909152606081526000602082015260006040518060a001604052806063815260200161019960639139825250650729a97ba50960d41b602080830191909152820152919050565b604051806040016040528060006001600160c01b0316815260200161010960405180604001604052806060815260200160006001600160d01b03191681525090565b905290565b6000602080835260018060c01b03845116818401528084015160408085015280516040606086015280518060a087015260005b8181101561015d5782810185015187820160c001528401610141565b8181111561016f57600060c083890101525b5091909201516001600160d01b0319166080850152601f01601f191690920160c001939250505056fe4d6f6f20c3a9f09f9a80c3a96f4d6f206f20c3a9204d4dc3a9f09f9a802020c3a96f4df09f9a806ff09f9a804df09f9a806fc3a920f09f9a80c3a94df09f9a80f09f9a8020c3a920f09f9a8020c3a9c3a96f4d6fc3a96fc3a94dc3a94dc3a96f6f4d6fa26469706673582212209eb10303732655cea5594084cb37c148d4f400f0b9756553cdc2fb99121ef57a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_55549d31 {\n string s_0;\n bytes6 s_1;\n }\n\n struct S_a39e6a82 {\n uint192 s_0;\n S_55549d31 s_1;\n }\n\n function test () public pure returns (S_a39e6a82 memory) {\n S_a39e6a82 memory r;\n {\n uint192 r_0 = 531024955072740163537488200975830992725163050550575040565;\n r.s_0 = r_0;\n }\n {\n S_55549d31 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀éoMo o é MMé🚀 éoM🚀o🚀M🚀oé 🚀éM🚀🚀 é 🚀 ééoMoéoéMéMéooMo\";\n r_1.s_0 = r_1_0;\n }\n {\n bytes6 r_1_1 = bytes6(0x729a97ba5090);\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000015a828c295b2bea094b70a05e96ae19c876417adf3a9083500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040729a97ba5090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80c3a96f4d6f206f20c3a9204d4dc3a9f09f9a802020c3a96f4df09f9a806ff09f9a804df09f9a806fc3a920f09f9a80c3a94df09f9a80f09f9a8020c3a920f09f9a8020c3a9c3a96f4d6fc3a96fc3a94dc3a94dc3a96f6f4d6f0000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint216,string,bool)", + "type": "(uint216,string,bool)", + "value": [ + "32349080647745312507834488797901044360626179225197228709666423227", + "Moo é🚀 M", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "32349080647745312507834488797901044360626179225197228709666423227" + }, + { + "type": "string", + "value": "Moo é🚀 M" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610100565b60405180910390f35b61007d604051806060016040528060006001600160d81b03168152602001606081526020016000151581525090565b6100ac604051806060016040528060006001600160d81b03168152602001606081526020016000151581525090565b7a4ea2e1df0a340e85f025a3329ec5784f3a535ab6ec49b725f101bb8152604080518082018252600e81526d4d6f6f20c3a9f09f9a802020204d60901b602080830191909152830152600090820152919050565b6000602080835260018060d81b03845116818401528084015160606040850152805180608086015260005b818110156101475782810184015186820160a00152830161012b565b8181111561015957600060a083880101525b50604086015180151560608701529250601f01601f19169390930160a00194935050505056fea264697066735822122061bc567b8a63c725300668d80dc2de970c19e626289a25392c6e72f07796077964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2a7f241d {\n uint216 s_0;\n string s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_2a7f241d memory) {\n S_2a7f241d memory r;\n {\n uint216 r_0 = 32349080647745312507834488797901044360626179225197228709666423227;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 M\";\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000004ea2e1df0a340e85f025a3329ec5784f3a535ab6ec49b725f101bb00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a802020204d000000000000000000000000000000000000" + }, + { + "name": "random-(uint32,bytes30)[2]", + "type": "(uint32,bytes30)[2]", + "value": [ + ["883552914", "0xa6b9768f8ad295e48156e73a3de3a25e4d3b75b74bc51222e09362313597"], + ["1734695265", "0x8f440e21bc24bda793b117ed1b39cee429d28839dd6277248eedac80cb37"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "883552914" + }, + { + "type": "hexstring", + "value": "0xa6b9768f8ad295e48156e73a3de3a25e4d3b75b74bc51222e09362313597" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1734695265" + }, + { + "type": "hexstring", + "value": "0x8f440e21bc24bda793b117ed1b39cee429d28839dd6277248eedac80cb37" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061018e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610110565b60405180910390f35b6100566100d7565b61005e6100d7565b6040805180820182526334a9f29281527fa6b9768f8ad295e48156e73a3de3a25e4d3b75b74bc51222e0936231359700006020808301919091529083528151808301909252636765596182527f8f440e21bc24bda793b117ed1b39cee429d28839dd6277248eedac80cb37000082820152820152919050565b60405180604001604052806002905b60408051808201909152600080825260208201528152602001906001900390816100e65790505090565b60808101818360005b600281101561014f578151805163ffffffff16845260209081015161ffff19168185015260409093019290910190600101610119565b5050509291505056fea2646970667358221220195b80dc73160a5b14cc7c8ac6611b43bb6560ff586c4d52806e5bf92890cb6664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5f067a5b {\n uint32 s_0;\n bytes30 s_1;\n }\n\n function test () public pure returns (S_5f067a5b[2] memory) {\n S_5f067a5b[2] memory r;\n {\n S_5f067a5b memory r_0;\n {\n uint32 r_0_0 = 883552914;\n r_0.s_0 = r_0_0;\n }\n {\n bytes30 r_0_1 = bytes30(0xa6b9768f8ad295e48156e73a3de3a25e4d3b75b74bc51222e09362313597);\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_5f067a5b memory r_1;\n {\n uint32 r_1_0 = 1734695265;\n r_1.s_0 = r_1_0;\n }\n {\n bytes30 r_1_1 = bytes30(0x8f440e21bc24bda793b117ed1b39cee429d28839dd6277248eedac80cb37);\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000034a9f292a6b9768f8ad295e48156e73a3de3a25e4d3b75b74bc51222e09362313597000000000000000000000000000000000000000000000000000000000000676559618f440e21bc24bda793b117ed1b39cee429d28839dd6277248eedac80cb370000" + }, + { + "name": "random-(uint48,uint208,bool)", + "type": "(uint48,uint208,bool)", + "value": [ + "99283844081567", + "137543164278448981744152306726089870510475221155527627636178102", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "99283844081567" + }, + { + "type": "number", + "value": "137543164278448981744152306726089870510475221155527627636178102" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060e28061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160608082018352600080835260208084018290529284015282518082018452655a4c5242279f808252795597e3e70dda184557ab58319b05d48a1d694617e518a8377cb682850190815260019286019283528551918252516001600160d01b0316938101939093525115158284015291519081900390910190f3fea2646970667358221220aaa45225fb9d75232f4a9b4ccc0def06d70f08db5cbf45d40f4c8e4ddab7d57a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5716b1bb {\n uint48 s_0;\n uint208 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_5716b1bb memory) {\n S_5716b1bb memory r;\n {\n uint48 r_0 = 99283844081567;\n r.s_0 = r_0;\n }\n {\n uint208 r_1 = 137543164278448981744152306726089870510475221155527627636178102;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000005a4c5242279f0000000000005597e3e70dda184557ab58319b05d48a1d694617e518a8377cb60000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-address[][1]", + "type": "address[][1]", + "value": [ + [ + "0x779A135265588b65f21d5e55fA87385336d595b7", + "0xc18A68245BCB1590E503E2Bc8D74E1781755B303" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x779A135265588b65f21d5e55fA87385336d595b7" + }, + { + "type": "address", + "value": "0xc18A68245BCB1590E503E2Bc8D74E1781755B303" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610212806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610142565b60405180910390f35b61005661011b565b61005e61011b565b604080516002808252606082018352600092602083019080368337019050509050600073779a135265588b65f21d5e55fa87385336d595b7905080826000815181106100ac576100ac6101c6565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073c18a68245bcb1590e503e2bc8d74e1781755b303905080826001815181106100fa576100fa6101c6565b6001600160a01b039290921660209283029190910190910152508152919050565b60405180602001604052806001905b606081526020019060019003908161012a5790505090565b6020808252600090604083018382018584805b600180821061016457506101b9565b888603601f19018552835180518088529088019088880190855b818110156101a25783516001600160a01b03168352928a0192918a0191840161017e565b509097505050938601935091850191600101610155565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122074178fc4a07942cc3f417f2b8f229bd6567f1cb97c0c222bd11125ac4922462a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[][1] memory) {\n address[][1] memory r;\n {\n address[] memory r_0 = new address[](2);\n {\n address r_0_0 = 0x779A135265588b65f21d5e55fA87385336d595b7;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xc18A68245BCB1590E503E2Bc8D74E1781755B303;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000779a135265588b65f21d5e55fa87385336d595b7000000000000000000000000c18a68245bcb1590e503e2bc8d74e1781755b303" + }, + { + "name": "random-address[2][2]", + "type": "address[2][2]", + "value": [ + [ + "0x2C6804bF3505f3CA55624a8C90e0486D44bcCB0e", + "0xB7a5dBe59423ED573d4EDD675B5b024828e2Fa2c" + ], + [ + "0x9AD50273ef2AEde0C3327b0F5018E14E6AdC1024", + "0xe49d8d8199096f21B88B3799B18ed25FbBC199C8" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2C6804bF3505f3CA55624a8C90e0486D44bcCB0e" + }, + { + "type": "address", + "value": "0xB7a5dBe59423ED573d4EDD675B5b024828e2Fa2c" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9AD50273ef2AEde0C3327b0F5018E14E6AdC1024" + }, + { + "type": "address", + "value": "0xe49d8d8199096f21B88B3799B18ed25FbBC199C8" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610129565b60405180910390f35b6100566100de565b61005e6100de565b61006661010b565b732c6804bf3505f3ca55624a8c90e0486d44bccb0e815273b7a5dbe59423ed573d4edd675b5b024828e2fa2c602082015281526100a161010b565b739ad50273ef2aede0c3327b0f5018e14e6adc1024815273e49d8d8199096f21b88b3799b18ed25fbbc199c8602080830191909152820152919050565b60405180604001604052806002905b6100f561010b565b8152602001906001900390816100ed5790505090565b60405180604001604052806002906020820280368337509192915050565b6080810181836000805b60028082106101425750610188565b835185845b8381101561016e5782516001600160a01b0316825260209283019290910190600101610147565b505050604094909401935060209290920191600101610133565b505050509291505056fea26469706673582212202edb1d00188541a6ed14e8eb4cc6de550e66928c480b8b5932b132bf8a3fdaa864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[2][2] memory) {\n address[2][2] memory r;\n {\n address[2] memory r_0;\n {\n address r_0_0 = 0x2C6804bF3505f3CA55624a8C90e0486D44bcCB0e;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xB7a5dBe59423ED573d4EDD675B5b024828e2Fa2c;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n address[2] memory r_1;\n {\n address r_1_0 = 0x9AD50273ef2AEde0C3327b0F5018E14E6AdC1024;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0xe49d8d8199096f21B88B3799B18ed25FbBC199C8;\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000002c6804bf3505f3ca55624a8c90e0486d44bccb0e000000000000000000000000b7a5dbe59423ed573d4edd675b5b024828e2fa2c0000000000000000000000009ad50273ef2aede0c3327b0f5018e14e6adc1024000000000000000000000000e49d8d8199096f21b88b3799b18ed25fbbc199c8" + }, + { + "name": "random-address[2][3]", + "type": "address[2][3]", + "value": [ + [ + "0x8e07799674416e70b155be8dDed563637eAb5423", + "0xe6524158D4322290001879f6cB4FCc91b41c8bBF" + ], + [ + "0x92391E4F59491EB139002C820c3d7d787F7AD9ac", + "0xafF669ABF1e6A68c88422fEE35FFc3B885d5E0Ce" + ], + [ + "0x7A91d9C5925F9F452E35b1C606801D84D23FD762", + "0x44bf9e29538CA08BdBBF5E8f89363CFC22992C90" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8e07799674416e70b155be8dDed563637eAb5423" + }, + { + "type": "address", + "value": "0xe6524158D4322290001879f6cB4FCc91b41c8bBF" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x92391E4F59491EB139002C820c3d7d787F7AD9ac" + }, + { + "type": "address", + "value": "0xafF669ABF1e6A68c88422fEE35FFc3B885d5E0Ce" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x7A91d9C5925F9F452E35b1C606801D84D23FD762" + }, + { + "type": "address", + "value": "0x44bf9e29538CA08BdBBF5E8f89363CFC22992C90" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610200806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610167565b60405180910390f35b61005661011c565b61005e61011c565b610066610149565b738e07799674416e70b155be8dded563637eab5423815273e6524158d4322290001879f6cb4fcc91b41c8bbf602082015281526100a1610149565b7392391e4f59491eb139002c820c3d7d787f7ad9ac815273aff669abf1e6a68c88422fee35ffc3b885d5e0ce6020808301919091528201526100e1610149565b737a91d9c5925f9f452e35b1c606801d84d23fd76281527344bf9e29538ca08bdbbf5e8f89363cfc22992c9060208201526040820152919050565b60405180606001604052806003905b610133610149565b81526020019060019003908161012b5790505090565b60405180604001604052806002906020820280368337509192915050565b60c0810181836000805b60038110156101c057825184835b60028110156101a75782516001600160a01b031682526020928301929091019060010161017f565b5050506040939093019260209290920191600101610171565b505050509291505056fea264697066735822122033b9b1dadd11f838c6dc1fabfed85e4608026ff0358f6d8ed3ac3a017d63147d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[2][3] memory) {\n address[2][3] memory r;\n {\n address[2] memory r_0;\n {\n address r_0_0 = 0x8e07799674416e70b155be8dDed563637eAb5423;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xe6524158D4322290001879f6cB4FCc91b41c8bBF;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n address[2] memory r_1;\n {\n address r_1_0 = 0x92391E4F59491EB139002C820c3d7d787F7AD9ac;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0xafF669ABF1e6A68c88422fEE35FFc3B885d5E0Ce;\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n address[2] memory r_2;\n {\n address r_2_0 = 0x7A91d9C5925F9F452E35b1C606801D84D23FD762;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x44bf9e29538CA08BdBBF5E8f89363CFC22992C90;\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000008e07799674416e70b155be8dded563637eab5423000000000000000000000000e6524158d4322290001879f6cb4fcc91b41c8bbf00000000000000000000000092391e4f59491eb139002c820c3d7d787f7ad9ac000000000000000000000000aff669abf1e6a68c88422fee35ffc3b885d5e0ce0000000000000000000000007a91d9c5925f9f452e35b1c606801d84d23fd76200000000000000000000000044bf9e29538ca08bdbbf5e8f89363cfc22992c90" + }, + { + "name": "random-address[3][]", + "type": "address[3][]", + "value": [ + [ + "0xABf8098F2510F4B92E6965FaE6f6a4ce970540A4", + "0x80D34a4CEC5c1A027CAeE9dA928BecB2cA526B80", + "0x095A306dC19B34Bdb791285cE91aeAD6838FB9fE" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xABf8098F2510F4B92E6965FaE6f6a4ce970540A4" + }, + { + "type": "address", + "value": "0x80D34a4CEC5c1A027CAeE9dA928BecB2cA526B80" + }, + { + "type": "address", + "value": "0x095A306dC19B34Bdb791285cE91aeAD6838FB9fE" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101dc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011d565b60405180910390f35b60408051600180825281830190925260609160009190816020015b6100716100ff565b81526020019060019003908161006957905050905061008e6100ff565b73abf8098f2510f4b92e6965fae6f6a4ce970540a481527380d34a4cec5c1a027caee9da928becb2ca526b80602082015273095a306dc19b34bdb791285ce91aead6838fb9fe60408201528151819083906000906100ee576100ee610190565b602090810291909101015250919050565b60405180606001604052806003906020820280368337509192915050565b602080825282518282018190526000919084820190604085019084805b8281101561018357845184835b600381101561016d5782516001600160a01b031682529188019190880190600101610147565b505050938501936060939093019260010161013a565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212207c74cb79d90e3743d582886cd53e600ba305a020edfc64285c01bea61f31444d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[3][] memory) {\n address[3][] memory r = new address[3][](1);\n {\n address[3] memory r_0;\n {\n address r_0_0 = 0xABf8098F2510F4B92E6965FaE6f6a4ce970540A4;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0x80D34a4CEC5c1A027CAeE9dA928BecB2cA526B80;\n r_0[1] = r_0_1;\n }\n {\n address r_0_2 = 0x095A306dC19B34Bdb791285cE91aeAD6838FB9fE;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000abf8098f2510f4b92e6965fae6f6a4ce970540a400000000000000000000000080d34a4cec5c1a027caee9da928becb2ca526b80000000000000000000000000095a306dc19b34bdb791285ce91aead6838fb9fe" + }, + { + "name": "random-address[3][1]", + "type": "address[3][1]", + "value": [ + [ + "0xD1e11e38CBa3DC19Dd7720a98c65630294E6D418", + "0x599A0eA9c76054Ec166B0bd84C153Df8BD51c28A", + "0xDEC7D2cae182A857df8110D9aEb22c772df52C4D" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xD1e11e38CBa3DC19Dd7720a98c65630294E6D418" + }, + { + "type": "address", + "value": "0x599A0eA9c76054Ec166B0bd84C153Df8BD51c28A" + }, + { + "type": "address", + "value": "0xDEC7D2cae182A857df8110D9aEb22c772df52C4D" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610103565b60405180910390f35b6100566100b8565b61005e6100b8565b6100666100e5565b73d1e11e38cba3dc19dd7720a98c65630294e6d418815273599a0ea9c76054ec166b0bd84c153df8bd51c28a602082015273dec7d2cae182a857df8110d9aeb22c772df52c4d60408201528152919050565b60405180602001604052806001905b6100cf6100e5565b8152602001906001900390816100c75790505090565b60405180606001604052806003906020820280368337509192915050565b60608181019082846000805b600180821061011e5750610161565b835185845b600381101561014a5782516001600160a01b03168252602092830192909101908301610123565b50505093850193506020929092019160010161010f565b50505050509291505056fea264697066735822122033cbf9ce623b4112b7291295496a16626b76980c70962d3ae25256fbe480cc8864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[3][1] memory) {\n address[3][1] memory r;\n {\n address[3] memory r_0;\n {\n address r_0_0 = 0xD1e11e38CBa3DC19Dd7720a98c65630294E6D418;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0x599A0eA9c76054Ec166B0bd84C153Df8BD51c28A;\n r_0[1] = r_0_1;\n }\n {\n address r_0_2 = 0xDEC7D2cae182A857df8110D9aEb22c772df52C4D;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000d1e11e38cba3dc19dd7720a98c65630294e6d418000000000000000000000000599a0ea9c76054ec166b0bd84c153df8bd51c28a000000000000000000000000dec7d2cae182a857df8110d9aeb22c772df52c4d" + }, + { + "name": "random-address[3][3]", + "type": "address[3][3]", + "value": [ + [ + "0xF06bAd48eCd0C0B5e166e7c9F88459BC33b14542", + "0x63463250468bC9B9F41d68296f8f6495Ce3EFd79", + "0xAcF3c8F0d9248145a9191Cb0B7630Ba675C4968c" + ], + [ + "0xc58518F12C125E4DC01DC57c976eB742F7C907B8", + "0xBac16Eb3b767784361A504c803F68E800a01d30D", + "0xb0c9AF47Eec201109990ee497034DBAE2181c924" + ], + [ + "0x481bEC660E0D7b50Add48F90560C9769022e2979", + "0x969B8dece3f2929c0bf73152B3c47B70765c92E5", + "0xF5DdAd63d5ffCc4E02d53ebC82637B76383f7409" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xF06bAd48eCd0C0B5e166e7c9F88459BC33b14542" + }, + { + "type": "address", + "value": "0x63463250468bC9B9F41d68296f8f6495Ce3EFd79" + }, + { + "type": "address", + "value": "0xAcF3c8F0d9248145a9191Cb0B7630Ba675C4968c" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xc58518F12C125E4DC01DC57c976eB742F7C907B8" + }, + { + "type": "address", + "value": "0xBac16Eb3b767784361A504c803F68E800a01d30D" + }, + { + "type": "address", + "value": "0xb0c9AF47Eec201109990ee497034DBAE2181c924" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x481bEC660E0D7b50Add48F90560C9769022e2979" + }, + { + "type": "address", + "value": "0x969B8dece3f2929c0bf73152B3c47B70765c92E5" + }, + { + "type": "address", + "value": "0xF5DdAd63d5ffCc4E02d53ebC82637B76383f7409" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610257806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101b7565b60405180910390f35b61005661016c565b61005e61016c565b610066610199565b73f06bad48ecd0c0b5e166e7c9f88459bc33b1454281527363463250468bc9b9f41d68296f8f6495ce3efd79602082015273acf3c8f0d9248145a9191cb0b7630ba675c4968c604082015281526100bb610199565b73c58518f12c125e4dc01dc57c976eb742f7c907b8815273bac16eb3b767784361a504c803f68e800a01d30d60208083019190915273b0c9af47eec201109990ee497034dbae2181c9246040830152820152610115610199565b73481bec660e0d7b50add48f90560c9769022e2979815273969b8dece3f2929c0bf73152b3c47b70765c92e5602082015273f5ddad63d5ffcc4e02d53ebc82637b76383f7409604080830191909152820152919050565b60405180606001604052806003905b610183610199565b81526020019060019003908161017b5790505090565b60405180606001604052806003906020820280368337509192915050565b610120810181836000805b60038082106101d15750610217565b835185845b838110156101fd5782516001600160a01b03168252602092830192909101906001016101d6565b5050506060949094019350602092909201916001016101c2565b505050509291505056fea26469706673582212209eef429c8856563be1af3809b986494b19614897b487579798eb4ba70b66498864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[3][3] memory) {\n address[3][3] memory r;\n {\n address[3] memory r_0;\n {\n address r_0_0 = 0xF06bAd48eCd0C0B5e166e7c9F88459BC33b14542;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0x63463250468bC9B9F41d68296f8f6495Ce3EFd79;\n r_0[1] = r_0_1;\n }\n {\n address r_0_2 = 0xAcF3c8F0d9248145a9191Cb0B7630Ba675C4968c;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n address[3] memory r_1;\n {\n address r_1_0 = 0xc58518F12C125E4DC01DC57c976eB742F7C907B8;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0xBac16Eb3b767784361A504c803F68E800a01d30D;\n r_1[1] = r_1_1;\n }\n {\n address r_1_2 = 0xb0c9AF47Eec201109990ee497034DBAE2181c924;\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n address[3] memory r_2;\n {\n address r_2_0 = 0x481bEC660E0D7b50Add48F90560C9769022e2979;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x969B8dece3f2929c0bf73152B3c47B70765c92E5;\n r_2[1] = r_2_1;\n }\n {\n address r_2_2 = 0xF5DdAd63d5ffCc4E02d53ebC82637B76383f7409;\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000f06bad48ecd0c0b5e166e7c9f88459bc33b1454200000000000000000000000063463250468bc9b9f41d68296f8f6495ce3efd79000000000000000000000000acf3c8f0d9248145a9191cb0b7630ba675c4968c000000000000000000000000c58518f12c125e4dc01dc57c976eb742f7c907b8000000000000000000000000bac16eb3b767784361a504c803f68e800a01d30d000000000000000000000000b0c9af47eec201109990ee497034dbae2181c924000000000000000000000000481bec660e0d7b50add48f90560c9769022e2979000000000000000000000000969b8dece3f2929c0bf73152b3c47b70765c92e5000000000000000000000000f5ddad63d5ffcc4e02d53ebc82637b76383f7409" + }, + { + "name": "random-address[4][]", + "type": "address[4][]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610151806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100a8565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b60405180608001604052806004906020820280368337509192915050565b602080825282518282018190526000919084820190604085019084805b8281101561010e57845184835b60048110156100f85782516001600160a01b0316825291880191908801906001016100d2565b50505093850193608093909301926001016100c5565b509197965050505050505056fea264697066735822122000a189d0f03fbfaa4820e11eb5fae5a6514cacee2ba85ef919a6eddb910dd07f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[4][] memory) {\n address[4][] memory r = new address[4][](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[][1]", + "type": "bool[][1]", + "value": [[]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061009b565b60405180910390f35b610056610074565b61005e610074565b6040805160008152602081019091528152919050565b60405180602001604052806001905b60608152602001906001900390816100835790505090565b6020808252600090604083018382018584805b60018082106100bd575061010b565b888603601f19018552835180518088529088019088880190855b818110156100f457835115158352928a0192918a019184016100d7565b5090975050509386019350918501916001016100ae565b509297965050505050505056fea2646970667358221220361800f20a1274a4706cbe40bafa29c70629899a73c20c1281211d75d6d58a5264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[][1] memory) {\n bool[][1] memory r;\n {\n bool[] memory r_0 = new bool[](0);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[][2]", + "type": "bool[][2]", + "value": [[true, true, false], [false]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610243806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610180565b60405180910390f35b610056610159565b61005e610159565b6040805160038082526080820190925260009160208201606080368337019050509050600060019050808260008151811061009b5761009b6101f7565b6020026020010190151590811515815250505060006001905080826001815181106100c8576100c86101f7565b60200260200101901515908115158152505050600080826002815181106100f1576100f16101f7565b911515602092830291909101909101525081526040805160018082528183019092526000918160200160208202803683370190505090506000808260008151811061013e5761013e6101f7565b91151560209283029190910182015283019190915250919050565b60405180604001604052806002905b60608152602001906001900390816101685790505090565b6020808252600090606083018382018584805b60028110156101ea57878503601f19018452825180518087529087019087870190845b818110156101d45783511515835292890192918901916001016101b6565b5090965050509285019291850191600101610193565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220873cc614ce920f3a4ea3cd267697ff0518885ac05da7505ba9e4f556cf0e6fd164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[][2] memory) {\n bool[][2] memory r;\n {\n bool[] memory r_0 = new bool[](3);\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n bool[] memory r_1 = new bool[](1);\n {\n bool r_1_0 = false;\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[2][1]", + "type": "bool[2][1]", + "value": [[false, true]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c3565b60405180910390f35b610056610078565b61005e610078565b6100666100a5565b60008152600160208201528152919050565b60405180602001604052806001905b61008f6100a5565b8152602001906001900390816100875790505090565b60405180604001604052806002906020820280368337509192915050565b60408181019082846000805b60018082106100de575061011a565b835185845b6002811015610103578251151582526020928301929091019083016100e3565b5050509385019350602092909201916001016100cf565b50505050509291505056fea264697066735822122090db370187a0f245e27491a79f9744950b19621c8f5bb3b59de39ae8b80444c964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[2][1] memory) {\n bool[2][1] memory r;\n {\n bool[2] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bool[2][2]", + "type": "bool[2][2]", + "value": [ + [true, true], + [true, false] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610174806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100dc565b60405180910390f35b610056610091565b61005e610091565b6100666100be565b60018082526020820152815261007a6100be565b600181526000602080830191909152820152919050565b60405180604001604052806002905b6100a86100be565b8152602001906001900390816100a05790505090565b60405180604001604052806002906020820280368337509192915050565b6080810181836000805b60028082106100f55750610134565b835185845b8381101561011a57825115158252602092830192909101906001016100fa565b5050506040949094019350602092909201916001016100e6565b505050509291505056fea264697066735822122027f0e2add9a7e78db9636783192a004422ffb40e60daa60cca8b1d04bd345a4364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[2][2] memory) {\n bool[2][2] memory r;\n {\n bool[2] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n bool[2] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[2][3]", + "type": "bool[2][3]", + "value": [ + [false, true], + [false, true], + [true, false] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610187806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f5565b60405180910390f35b6100566100aa565b61005e6100aa565b6100666100d7565b6000815260016020820152815261007b6100d7565b6000815260016020808301919091528201526100956100d7565b60018152600060208201526040820152919050565b60405180606001604052806003905b6100c16100d7565b8152602001906001900390816100b95790505090565b60405180604001604052806002906020820280368337509192915050565b60c0810181836000805b600381101561014757825184835b600281101561012e578251151582526020928301929091019060010161010d565b50505060409390930192602092909201916001016100ff565b505050509291505056fea26469706673582212203f44857bba7f0bfecece380eebfb4ee976698a272c756f1ae0a04412ffe3154764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[2][3] memory) {\n bool[2][3] memory r;\n {\n bool[2] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n bool[2] memory r_1;\n {\n bool r_1_0 = false;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n bool[2] memory r_2;\n {\n bool r_2_0 = true;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[3][1]", + "type": "bool[3][1]", + "value": [[true, true, false]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610161806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c9565b60405180910390f35b61005661007e565b61005e61007e565b6100666100ab565b60018082526020820152600060408201528152919050565b60405180602001604052806001905b6100956100ab565b81526020019060019003908161008d5790505090565b60405180606001604052806003906020820280368337509192915050565b60608181019082846000805b60018082106100e45750610120565b835185845b6003811015610109578251151582526020928301929091019083016100e9565b5050509385019350602092909201916001016100d5565b50505050509291505056fea26469706673582212204de38c9e7946516112dbac3709b5690b05aac1305761446bb3448d6aaaa21b0264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[3][1] memory) {\n bool[3][1] memory r;\n {\n bool[3] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[3][2]", + "type": "bool[3][2]", + "value": [ + [false, false, true], + [false, false, false] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061017b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e9565b60405180910390f35b61005661009e565b61005e61009e565b6100666100cb565b600080825260208201526001604082015281526100816100cb565b600080825260208083018290526040830191909152820152919050565b60405180604001604052806002905b6100b56100cb565b8152602001906001900390816100ad5790505090565b60405180606001604052806003906020820280368337509192915050565b60c0810181836000805b600281101561013b57825184835b60038110156101225782511515825260209283019290910190600101610101565b50505060609390930192602092909201916001016100f3565b505050509291505056fea2646970667358221220a8383a899b56e53f1f16c431f0b18587122ce11b57e86d740e65779fbe17db2164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[3][2] memory) {\n bool[3][2] memory r;\n {\n bool[3] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n bool[3] memory r_1;\n {\n bool r_1_0 = false;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[3][3]", + "type": "bool[3][3]", + "value": [ + [true, false, false], + [true, false, true], + [true, false, false] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6100566100c3565b61005e6100c3565b6100666100f0565b60018152600060208201819052604082015281526100826100f0565b6001808252600060208084019190915260408301919091528201526100a56100f0565b60018152600060208201819052604080830191909152820152919050565b60405180606001604052806003905b6100da6100f0565b8152602001906001900390816100d25790505090565b60405180606001604052806003906020820280368337509192915050565b610120810181836000805b60038082106101285750610167565b835185845b8381101561014d578251151582526020928301929091019060010161012d565b505050606094909401935060209290920191600101610119565b505050509291505056fea26469706673582212207213bdeaa047f4d97a357d61817cf735f6226b06a2f4ce9acf9b9fab08956aef64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[3][3] memory) {\n bool[3][3] memory r;\n {\n bool[3] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n bool[3] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = true;\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n bool[3] memory r_2;\n {\n bool r_2_0 = true;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2[1] = r_2_1;\n }\n {\n bool r_2_2 = false;\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bool[4][2]", + "type": "bool[4][2]", + "value": [ + [false, true, true, true], + [false, false, true, true] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061018b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f8565b60405180910390f35b6100566100ad565b61005e6100ad565b6100666100da565b6000815260016020820181905260408201819052606082015281526100896100da565b60008082526020808301919091526001604083018190526060830152820152919050565b60405180604001604052806002905b6100c46100da565b8152602001906001900390816100bc5790505090565b60405180608001604052806004906020820280368337509192915050565b610100810181836000805b600281101561014b57825184835b60048110156101325782511515825260209283019290910190600101610111565b5050506080939093019260209290920191600101610103565b505050509291505056fea264697066735822122037a627be5503cd0b2c9012bdfebb401e21dc27289f639389acb34df20acf8f2d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[4][2] memory) {\n bool[4][2] memory r;\n {\n bool[4] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n bool[4] memory r_1;\n {\n bool r_1_0 = false;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = true;\n r_1[2] = r_1_2;\n }\n {\n bool r_1_3 = true;\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bool[4][3]", + "type": "bool[4][3]", + "value": [ + [true, false, true, false], + [true, false, false, true], + [true, false, true, true] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610124565b60405180910390f35b6100566100d9565b61005e6100d9565b610066610106565b600180825260006020830181905260408301919091526060820152815261008b610106565b600180825260006020808401829052604084019190915260608301919091528201526100b5610106565b60018082526000602083015260408083018290526060830191909152820152919050565b60405180606001604052806003905b6100f0610106565b8152602001906001900390816100e85790505090565b60405180608001604052806004906020820280368337509192915050565b610180810181836000805b600381101561017757825184835b600481101561015e578251151582526020928301929091019060010161013d565b505050608093909301926020929092019160010161012f565b505050509291505056fea2646970667358221220b5c8ff29b7103f1e4011da17779085c3bfb6ec4b92006df1fb10780b87ef752664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[4][3] memory) {\n bool[4][3] memory r;\n {\n bool[4] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n bool[4] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1[2] = r_1_2;\n }\n {\n bool r_1_3 = true;\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n {\n bool[4] memory r_2;\n {\n bool r_2_0 = true;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2[1] = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2[2] = r_2_2;\n }\n {\n bool r_2_3 = true;\n r_2[3] = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bytes11[2][2]", + "type": "bytes11[2][2]", + "value": [ + ["0x33ee0e72f9a76dbf443d12", "0xcb5bc4b9a9260d5f60ee32"], + ["0x50205e571ecbf8c2a77a2b", "0xb27b9bee240f0d39a46fa4"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x33ee0e72f9a76dbf443d12" + }, + { + "type": "hexstring", + "value": "0xcb5bc4b9a9260d5f60ee32" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x50205e571ecbf8c2a77a2b" + }, + { + "type": "hexstring", + "value": "0xb27b9bee240f0d39a46fa4" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610111565b60405180910390f35b6100566100c6565b61005e6100c6565b6100666100f3565b6a19f707397cd3b6dfa21e8960a91b81526a65ade25cd49306afb0771960a91b602082015281526100956100f3565b6a50205e571ecbf8c2a77a2b60a81b81526a2c9ee6fb8903c34e691be960aa1b602080830191909152820152919050565b60405180604001604052806002905b6100dd6100f3565b8152602001906001900390816100d55790505090565b60405180604001604052806002906020820280368337509192915050565b6080810181836000805b600280821061012a5750610171565b835185845b838110156101575782516001600160a81b03191682526020928301929091019060010161012f565b50505060409490940193506020929092019160010161011b565b505050509291505056fea264697066735822122054b85748ed17ea29319dae48849ca921d9cff7fb45da351b562999635246a90064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes11[2][2] memory) {\n bytes11[2][2] memory r;\n {\n bytes11[2] memory r_0;\n {\n bytes11 r_0_0 = bytes11(0x33ee0e72f9a76dbf443d12);\n r_0[0] = r_0_0;\n }\n {\n bytes11 r_0_1 = bytes11(0xcb5bc4b9a9260d5f60ee32);\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n bytes11[2] memory r_1;\n {\n bytes11 r_1_0 = bytes11(0x50205e571ecbf8c2a77a2b);\n r_1[0] = r_1_0;\n }\n {\n bytes11 r_1_1 = bytes11(0xb27b9bee240f0d39a46fa4);\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x33ee0e72f9a76dbf443d12000000000000000000000000000000000000000000cb5bc4b9a9260d5f60ee3200000000000000000000000000000000000000000050205e571ecbf8c2a77a2b000000000000000000000000000000000000000000b27b9bee240f0d39a46fa4000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes13[][4]", + "type": "bytes13[][4]", + "value": [ + ["0x34c827870868a5a9fa4b2dacdc", "0x51a57467381fa24e1af76fdf91"], + ["0x1d4780b24f29fcc0546c0a8ba0"], + ["0x542eb799b83422f59e83c833a4"], + ["0xf8d0fb00b6a80b95c82339f0c9", "0x138beee9ec2d7d396e0f1664d2"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x34c827870868a5a9fa4b2dacdc" + }, + { + "type": "hexstring", + "value": "0x51a57467381fa24e1af76fdf91" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1d4780b24f29fcc0546c0a8ba0" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x542eb799b83422f59e83c833a4" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf8d0fb00b6a80b95c82339f0c9" + }, + { + "type": "hexstring", + "value": "0x138beee9ec2d7d396e0f1664d2" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061037f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102b4565b60405180910390f35b61005661028d565b61005e61028d565b604080516002808252606082018352600092602083019080368337505081519192506c0d3209e1c21a296a7e92cb6b37609a1b9182915083906000906100a6576100a6610333565b6001600160981b0319909216602092830291909101909101525080516c51a57467381fa24e1af76fdf9160981b908190839060019081106100e9576100e9610333565b6001600160981b03199290921660209283029190910190910152508152604080516001808252818301909252600091816020016020820280368337505081519192506bea3c0592794fe602a360545d609d1b91829150839060009061015057610150610333565b6001600160981b03199290921660209283029190910182015283019190915250604080516001808252818301909252600091816020016020820280368337505081519192506c150bade66e0d08bd67a0f20ce9609a1b9182915083906000906101bb576101bb610333565b6001600160981b031992909216602092830291909101820152604084810193909352825160028082526060820185526000949193509183019080368337505081519192506cf8d0fb00b6a80b95c82339f0c960981b91829150839060009061022557610225610333565b6001600160981b0319909216602092830291909101909101525080516c09c5f774f616be9cb7078b326960991b9081908390600190811061026857610268610333565b6001600160981b03199290921660209283029190910190910152506060820152919050565b60405180608001604052806004905b606081526020019060019003908161029c5790505090565b602080825260009060a083018382018584805b600481101561032657878503601f19018452825180518087529087019087870190845b818110156103105783516001600160981b031916835292890192918901916001016102ea565b50909650505092850192918501916001016102c7565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212201ad22a8006513f699001adab125d9a4abf945538fa0d36f2f55070c9a60b86ed64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes13[][4] memory) {\n bytes13[][4] memory r;\n {\n bytes13[] memory r_0 = new bytes13[](2);\n {\n bytes13 r_0_0 = bytes13(0x34c827870868a5a9fa4b2dacdc);\n r_0[0] = r_0_0;\n }\n {\n bytes13 r_0_1 = bytes13(0x51a57467381fa24e1af76fdf91);\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n bytes13[] memory r_1 = new bytes13[](1);\n {\n bytes13 r_1_0 = bytes13(0x1d4780b24f29fcc0546c0a8ba0);\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n bytes13[] memory r_2 = new bytes13[](1);\n {\n bytes13 r_2_0 = bytes13(0x542eb799b83422f59e83c833a4);\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n {\n bytes13[] memory r_3 = new bytes13[](2);\n {\n bytes13 r_3_0 = bytes13(0xf8d0fb00b6a80b95c82339f0c9);\n r_3[0] = r_3_0;\n }\n {\n bytes13 r_3_1 = bytes13(0x138beee9ec2d7d396e0f1664d2);\n r_3[1] = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000234c827870868a5a9fa4b2dacdc0000000000000000000000000000000000000051a57467381fa24e1af76fdf910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011d4780b24f29fcc0546c0a8ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001542eb799b83422f59e83c833a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f8d0fb00b6a80b95c82339f0c900000000000000000000000000000000000000138beee9ec2d7d396e0f1664d200000000000000000000000000000000000000" + }, + { + "name": "random-bytes14[][4]", + "type": "bytes14[][4]", + "value": [ + [ + "0xabf8849895100528c857ea0ac642", + "0x5f72d5a145f2752029352e80e652", + "0x5f0918e8a17c2b21c264e336e8a2", + "0xb4e44d8f760e3c53335416ea4aee" + ], + ["0x9f6d1ab961b9e57bc9f8c164472c", "0xf424cecddc839674901cfb441d98"], + [], + ["0x64ce708d2801f4ba25508b1d6696", "0x6ce38d3648ae9d067261792e653c"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xabf8849895100528c857ea0ac642" + }, + { + "type": "hexstring", + "value": "0x5f72d5a145f2752029352e80e652" + }, + { + "type": "hexstring", + "value": "0x5f0918e8a17c2b21c264e336e8a2" + }, + { + "type": "hexstring", + "value": "0xb4e44d8f760e3c53335416ea4aee" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9f6d1ab961b9e57bc9f8c164472c" + }, + { + "type": "hexstring", + "value": "0xf424cecddc839674901cfb441d98" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x64ce708d2801f4ba25508b1d6696" + }, + { + "type": "hexstring", + "value": "0x6ce38d3648ae9d067261792e653c" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103fb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610330565b60405180910390f35b610056610309565b61005e610309565b60408051600480825260a0820190925260009160208201608080368337505081519192506d55fc424c4a880294642bf505632160911b9182915083906000906100a9576100a96103af565b6001600160901b0319909216602092830291909101909101525080516d2fb96ad0a2f93a90149a9740732960911b908190839060019081106100ed576100ed6103af565b6001600160901b0319909216602092830291909101909101525080516d2f848c7450be1590e132719b745160911b90819083906002908110610131576101316103af565b6001600160901b0319909216602092830291909101909101525080516d5a7226c7bb071e2999aa0b75257760911b90819083906003908110610175576101756103af565b6001600160901b0319929092166020928302919091019091015250815260408051600280825260608201909252600091816020016020820280368337505081519192506d27db46ae586e795ef27e305911cb60921b9182915083906000906101df576101df6103af565b6001600160901b0319909216602092830291909101909101525080516d1e8499d9bb9072ce92039f6883b360931b90819083906001908110610223576102236103af565b6001600160901b031992909216602092830291909101820152838101929092525060408051600080825281840183528285019190915281516002808252606082018452919390929083019080368337505081519192506d326738469400fa5d12a8458eb34b60911b9182915083906000906102a0576102a06103af565b6001600160901b0319909216602092830291909101909101525080516d1b38e34d922ba7419c985e4b994f60921b908190839060019081106102e4576102e46103af565b6001600160901b03199290921660209283029190910190910152506060820152919050565b60405180608001604052806004905b60608152602001906001900390816103185790505090565b602080825260009060a083018382018584805b60048110156103a257878503601f19018452825180518087529087019087870190845b8181101561038c5783516001600160901b03191683529289019291890191600101610366565b5090965050509285019291850191600101610343565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220be855ffc2dd36613f4a4189f59704146064770ced18c9be0573fd9fae53b689564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes14[][4] memory) {\n bytes14[][4] memory r;\n {\n bytes14[] memory r_0 = new bytes14[](4);\n {\n bytes14 r_0_0 = bytes14(0xabf8849895100528c857ea0ac642);\n r_0[0] = r_0_0;\n }\n {\n bytes14 r_0_1 = bytes14(0x5f72d5a145f2752029352e80e652);\n r_0[1] = r_0_1;\n }\n {\n bytes14 r_0_2 = bytes14(0x5f0918e8a17c2b21c264e336e8a2);\n r_0[2] = r_0_2;\n }\n {\n bytes14 r_0_3 = bytes14(0xb4e44d8f760e3c53335416ea4aee);\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n bytes14[] memory r_1 = new bytes14[](2);\n {\n bytes14 r_1_0 = bytes14(0x9f6d1ab961b9e57bc9f8c164472c);\n r_1[0] = r_1_0;\n }\n {\n bytes14 r_1_1 = bytes14(0xf424cecddc839674901cfb441d98);\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n bytes14[] memory r_2 = new bytes14[](0);\n r[2] = r_2;\n }\n {\n bytes14[] memory r_3 = new bytes14[](2);\n {\n bytes14 r_3_0 = bytes14(0x64ce708d2801f4ba25508b1d6696);\n r_3[0] = r_3_0;\n }\n {\n bytes14 r_3_1 = bytes14(0x6ce38d3648ae9d067261792e653c);\n r_3[1] = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000004abf8849895100528c857ea0ac6420000000000000000000000000000000000005f72d5a145f2752029352e80e6520000000000000000000000000000000000005f0918e8a17c2b21c264e336e8a2000000000000000000000000000000000000b4e44d8f760e3c53335416ea4aee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029f6d1ab961b9e57bc9f8c164472c000000000000000000000000000000000000f424cecddc839674901cfb441d980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264ce708d2801f4ba25508b1d66960000000000000000000000000000000000006ce38d3648ae9d067261792e653c000000000000000000000000000000000000" + }, + { + "name": "random-bytes18[1][3]", + "type": "bytes18[1][3]", + "value": [ + ["0x434c5127c15a8325790c7de417800741705f"], + ["0xdcc771c775a7bcee3cfb0f0b1964b673f976"], + ["0xd7e8e45be6d81369b603b9e32fe2ff10d462"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x434c5127c15a8325790c7de417800741705f" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdcc771c775a7bcee3cfb0f0b1964b673f976" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd7e8e45be6d81369b603b9e32fe2ff10d462" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011a565b60405180910390f35b6100566100cf565b61005e6100cf565b6100666100fc565b71434c5127c15a8325790c7de417800741705f60701b815281526100886100fc565b716e63b8e3bad3de771e7d87858cb25b39fcbb60711b815260208201526100ad6100fc565b716bf4722df36c09b4db01dcf197f17f886a3160711b81526040820152919050565b60405180606001604052806003905b6100e66100fc565b8152602001906001900390816100de5790505090565b60405180602001604052806001906020820280368337509192915050565b6060810181836000805b600381101561017857825184835b60018110156101625782516dffffffffffffffffffffffffffff1916825260209283019290910190600101610132565b5050506020938401939290920191600101610124565b505050509291505056fea26469706673582212207497d5cd3c13fdc3e17995a6fef8437e3be608c93d1ae10598397a245e58da3a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes18[1][3] memory) {\n bytes18[1][3] memory r;\n {\n bytes18[1] memory r_0;\n {\n bytes18 r_0_0 = bytes18(0x434c5127c15a8325790c7de417800741705f);\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n bytes18[1] memory r_1;\n {\n bytes18 r_1_0 = bytes18(0xdcc771c775a7bcee3cfb0f0b1964b673f976);\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n bytes18[1] memory r_2;\n {\n bytes18 r_2_0 = bytes18(0xd7e8e45be6d81369b603b9e32fe2ff10d462);\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x434c5127c15a8325790c7de417800741705f0000000000000000000000000000dcc771c775a7bcee3cfb0f0b1964b673f9760000000000000000000000000000d7e8e45be6d81369b603b9e32fe2ff10d4620000000000000000000000000000" + }, + { + "name": "random-bytes19[4][2]", + "type": "bytes19[4][2]", + "value": [ + [ + "0x5fa3f21ff804feef13bd1ce0d5ead9b0163f94", + "0xb9fc3285a22d333152fcbf3d003bb3cbddd303", + "0x4ce8f9e99c90d6505b84e60bad59564e07e32a", + "0x02b6d81bba9771a128ecb6f9fa560a4378ecd7" + ], + [ + "0x3a99a4e676dc7acceb07548ace0f59b8929ac1", + "0xf2b72b8070b3ce9d9233446c0001884feba479", + "0xdeb2d8d0bbfdb101d5df05d7202031687ff0c3", + "0x915a33c88b9f108425be46c7eec2ba0252be63" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5fa3f21ff804feef13bd1ce0d5ead9b0163f94" + }, + { + "type": "hexstring", + "value": "0xb9fc3285a22d333152fcbf3d003bb3cbddd303" + }, + { + "type": "hexstring", + "value": "0x4ce8f9e99c90d6505b84e60bad59564e07e32a" + }, + { + "type": "hexstring", + "value": "0x02b6d81bba9771a128ecb6f9fa560a4378ecd7" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3a99a4e676dc7acceb07548ace0f59b8929ac1" + }, + { + "type": "hexstring", + "value": "0xf2b72b8070b3ce9d9233446c0001884feba479" + }, + { + "type": "hexstring", + "value": "0xdeb2d8d0bbfdb101d5df05d7202031687ff0c3" + }, + { + "type": "hexstring", + "value": "0x915a33c88b9f108425be46c7eec2ba0252be63" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610242806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101a1565b60405180910390f35b610056610156565b61005e610156565b610066610183565b7217e8fc87fe013fbbc4ef4738357ab66c058fe5606a1b815272b9fc3285a22d333152fcbf3d003bb3cbddd30360681b60208201527226747cf4ce486b282dc27305d6acab2703f19560691b60408201527202b6d81bba9771a128ecb6f9fa560a4378ecd760681b606082015281526100dd610183565b723a99a4e676dc7acceb07548ace0f59b8929ac160681b815272f2b72b8070b3ce9d9233446c0001884feba47960681b60208083019190915272deb2d8d0bbfdb101d5df05d7202031687ff0c360681b604083015272915a33c88b9f108425be46c7eec2ba0252be6360681b6060830152820152919050565b60405180604001604052806002905b61016d610183565b8152602001906001900390816101655790505090565b60405180608001604052806004906020820280368337509192915050565b610100810181836000805b600281101561020257825184835b60048110156101e95782516cffffffffffffffffffffffffff19168252602092830192909101906001016101ba565b50505060809390930192602092909201916001016101ac565b505050509291505056fea264697066735822122031adfc3355f9fb28d2f456e1ea19639eb22c7219de29373244a030c7cf2dcfbf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes19[4][2] memory) {\n bytes19[4][2] memory r;\n {\n bytes19[4] memory r_0;\n {\n bytes19 r_0_0 = bytes19(0x5fa3f21ff804feef13bd1ce0d5ead9b0163f94);\n r_0[0] = r_0_0;\n }\n {\n bytes19 r_0_1 = bytes19(0xb9fc3285a22d333152fcbf3d003bb3cbddd303);\n r_0[1] = r_0_1;\n }\n {\n bytes19 r_0_2 = bytes19(0x4ce8f9e99c90d6505b84e60bad59564e07e32a);\n r_0[2] = r_0_2;\n }\n {\n bytes19 r_0_3 = bytes19(0x02b6d81bba9771a128ecb6f9fa560a4378ecd7);\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n bytes19[4] memory r_1;\n {\n bytes19 r_1_0 = bytes19(0x3a99a4e676dc7acceb07548ace0f59b8929ac1);\n r_1[0] = r_1_0;\n }\n {\n bytes19 r_1_1 = bytes19(0xf2b72b8070b3ce9d9233446c0001884feba479);\n r_1[1] = r_1_1;\n }\n {\n bytes19 r_1_2 = bytes19(0xdeb2d8d0bbfdb101d5df05d7202031687ff0c3);\n r_1[2] = r_1_2;\n }\n {\n bytes19 r_1_3 = bytes19(0x915a33c88b9f108425be46c7eec2ba0252be63);\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x5fa3f21ff804feef13bd1ce0d5ead9b0163f9400000000000000000000000000b9fc3285a22d333152fcbf3d003bb3cbddd303000000000000000000000000004ce8f9e99c90d6505b84e60bad59564e07e32a0000000000000000000000000002b6d81bba9771a128ecb6f9fa560a4378ecd7000000000000000000000000003a99a4e676dc7acceb07548ace0f59b8929ac100000000000000000000000000f2b72b8070b3ce9d9233446c0001884feba47900000000000000000000000000deb2d8d0bbfdb101d5df05d7202031687ff0c300000000000000000000000000915a33c88b9f108425be46c7eec2ba0252be6300000000000000000000000000" + }, + { + "name": "random-bytes26[1][4]", + "type": "bytes26[1][4]", + "value": [ + ["0x0d98f236094fff84fac215284310bf8a3b383f1f70559614f27a"], + ["0x64e2ae0d8c38e5191be6ce6f7517fd6639688c40ba52993542ba"], + ["0x4faaa4e14d301ca1f7c6eec15b9380426154315b75bc21130160"], + ["0x5ade5e3e77920b9b9fb23c9ba9d3b295d0cb8a463e72fcc1e410"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x0d98f236094fff84fac215284310bf8a3b383f1f70559614f27a" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x64e2ae0d8c38e5191be6ce6f7517fd6639688c40ba52993542ba" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4faaa4e14d301ca1f7c6eec15b9380426154315b75bc21130160" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5ade5e3e77920b9b9fb23c9ba9d3b295d0cb8a463e72fcc1e410" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610201806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061016b565b60405180910390f35b610056610120565b61005e610120565b61006661014d565b7f0d98f236094fff84fac215284310bf8a3b383f1f70559614f27a0000000000008152815261009361014d565b7f64e2ae0d8c38e5191be6ce6f7517fd6639688c40ba52993542ba000000000000815260208201526100c361014d565b7f4faaa4e14d301ca1f7c6eec15b9380426154315b75bc21130160000000000000815260408201526100f361014d565b7f5ade5e3e77920b9b9fb23c9ba9d3b295d0cb8a463e72fcc1e41000000000000081526060820152919050565b60405180608001604052806004905b61013761014d565b81526020019060019003908161012f5790505090565b60405180602001604052806001906020820280368337509192915050565b6080810181836000805b60048110156101c157825184835b60018110156101ab57825165ffffffffffff1916825260209283019290910190600101610183565b5050506020938401939290920191600101610175565b505050509291505056fea2646970667358221220dd6009a07430a4f54ba5aeb367b08bd70c3b8d28fef92031ad07e4169db7504e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes26[1][4] memory) {\n bytes26[1][4] memory r;\n {\n bytes26[1] memory r_0;\n {\n bytes26 r_0_0 = bytes26(0x0d98f236094fff84fac215284310bf8a3b383f1f70559614f27a);\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n bytes26[1] memory r_1;\n {\n bytes26 r_1_0 = bytes26(0x64e2ae0d8c38e5191be6ce6f7517fd6639688c40ba52993542ba);\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n bytes26[1] memory r_2;\n {\n bytes26 r_2_0 = bytes26(0x4faaa4e14d301ca1f7c6eec15b9380426154315b75bc21130160);\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n {\n bytes26[1] memory r_3;\n {\n bytes26 r_3_0 = bytes26(0x5ade5e3e77920b9b9fb23c9ba9d3b295d0cb8a463e72fcc1e410);\n r_3[0] = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0d98f236094fff84fac215284310bf8a3b383f1f70559614f27a00000000000064e2ae0d8c38e5191be6ce6f7517fd6639688c40ba52993542ba0000000000004faaa4e14d301ca1f7c6eec15b9380426154315b75bc211301600000000000005ade5e3e77920b9b9fb23c9ba9d3b295d0cb8a463e72fcc1e410000000000000" + }, + { + "name": "random-bytes28[1][1]", + "type": "bytes28[1][1]", + "value": [["0xc3c310d776ba107f599009a340dc8d25dbb47b6d4bb7bc2a29ca0ceb"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc3c310d776ba107f599009a340dc8d25dbb47b6d4bb7bc2a29ca0ceb" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610172806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100db565b60405180910390f35b610056610090565b61005e610090565b6100666100bd565b7fc3c310d776ba107f599009a340dc8d25dbb47b6d4bb7bc2a29ca0ceb0000000081528152919050565b60405180602001604052806001905b6100a76100bd565b81526020019060019003908161009f5790505090565b60405180602001604052806001906020820280368337509192915050565b60208181019082846000805b60018082106100f65750610131565b835185845b8381101561011d57825163ffffffff19168252918801919088019083016100fb565b5050509385019350918401916001016100e7565b50505050509291505056fea264697066735822122025807afbdf4e2d4468130c5e98d82342956a14e38e2222e8c31ed07660cf6ab664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes28[1][1] memory) {\n bytes28[1][1] memory r;\n {\n bytes28[1] memory r_0;\n {\n bytes28 r_0_0 = bytes28(0xc3c310d776ba107f599009a340dc8d25dbb47b6d4bb7bc2a29ca0ceb);\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0xc3c310d776ba107f599009a340dc8d25dbb47b6d4bb7bc2a29ca0ceb00000000" + }, + { + "name": "random-bytes3[1][2]", + "type": "bytes3[1][2]", + "value": [["0xcd6b21"], ["0x8af7cd"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xcd6b21" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8af7cd" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061016e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d7565b60405180910390f35b61005661008c565b61005e61008c565b6100666100b9565b62cd6b2160e81b815281526100796100b9565b628af7cd60e81b81526020820152919050565b60405180604001604052806002905b6100a36100b9565b81526020019060019003908161009b5790505090565b60405180602001604052806001906020820280368337509192915050565b6040810181836000805b600281101561012e57825184835b60018110156101185782516001600160e81b0319168252602092830192909101906001016100ef565b50505060209384019392909201916001016100e1565b505050509291505056fea26469706673582212206cb036cc7ce7222589f4ecd7253deab60c2c46818a0e726d68ff63434e60e04964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes3[1][2] memory) {\n bytes3[1][2] memory r;\n {\n bytes3[1] memory r_0;\n {\n bytes3 r_0_0 = bytes3(0xcd6b21);\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n bytes3[1] memory r_1;\n {\n bytes3 r_1_0 = bytes3(0x8af7cd);\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xcd6b2100000000000000000000000000000000000000000000000000000000008af7cd0000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-bytes30[2][3]", + "type": "bytes30[2][3]", + "value": [ + [ + "0xf3031d7c8c3cf7122e0251eebd8e755697df0125e7aff48a906c26b3c591", + "0x4cd622326ad2855067607f3cb75b20fa8ec040efe530a28acc9923e74613" + ], + [ + "0x9205311301e22591301b9144ad8c8c3f6a33ff9cb8938bf1a9c2433fd071", + "0xc9813b60aad9dbbf03fcb58aceb4654c6686b96d82b4b63932458b3bc8e3" + ], + [ + "0x2a0409e74acfd516bb447eda432a3d353e9f71e92026fd7d9d5ab90a9380", + "0x62317f5c52a0862e4c61004797106a827b2e25a46a91b8f40eb66003b80c" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf3031d7c8c3cf7122e0251eebd8e755697df0125e7aff48a906c26b3c591" + }, + { + "type": "hexstring", + "value": "0x4cd622326ad2855067607f3cb75b20fa8ec040efe530a28acc9923e74613" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9205311301e22591301b9144ad8c8c3f6a33ff9cb8938bf1a9c2433fd071" + }, + { + "type": "hexstring", + "value": "0xc9813b60aad9dbbf03fcb58aceb4654c6686b96d82b4b63932458b3bc8e3" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2a0409e74acfd516bb447eda432a3d353e9f71e92026fd7d9d5ab90a9380" + }, + { + "type": "hexstring", + "value": "0x62317f5c52a0862e4c61004797106a827b2e25a46a91b8f40eb66003b80c" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610244806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101af565b60405180910390f35b610056610164565b61005e610164565b610066610191565b7ff3031d7c8c3cf7122e0251eebd8e755697df0125e7aff48a906c26b3c591000081527f4cd622326ad2855067607f3cb75b20fa8ec040efe530a28acc9923e746130000602082015281526100b9610191565b7f9205311301e22591301b9144ad8c8c3f6a33ff9cb8938bf1a9c2433fd071000081527fc9813b60aad9dbbf03fcb58aceb4654c6686b96d82b4b63932458b3bc8e30000602080830191909152820152610111610191565b7f2a0409e74acfd516bb447eda432a3d353e9f71e92026fd7d9d5ab90a9380000081527f62317f5c52a0862e4c61004797106a827b2e25a46a91b8f40eb66003b80c000060208201526040820152919050565b60405180606001604052806003905b61017b610191565b8152602001906001900390816101735790505090565b60405180604001604052806002906020820280368337509192915050565b60c0810181836000805b600381101561020457825184835b60028110156101eb57825161ffff19168252602092830192909101906001016101c7565b50505060409390930192602092909201916001016101b9565b505050509291505056fea2646970667358221220544ff88f4dc1840051166b47d264830ca2fc458f0396953b2ee6b3cad30c6ec264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes30[2][3] memory) {\n bytes30[2][3] memory r;\n {\n bytes30[2] memory r_0;\n {\n bytes30 r_0_0 = bytes30(0xf3031d7c8c3cf7122e0251eebd8e755697df0125e7aff48a906c26b3c591);\n r_0[0] = r_0_0;\n }\n {\n bytes30 r_0_1 = bytes30(0x4cd622326ad2855067607f3cb75b20fa8ec040efe530a28acc9923e74613);\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n bytes30[2] memory r_1;\n {\n bytes30 r_1_0 = bytes30(0x9205311301e22591301b9144ad8c8c3f6a33ff9cb8938bf1a9c2433fd071);\n r_1[0] = r_1_0;\n }\n {\n bytes30 r_1_1 = bytes30(0xc9813b60aad9dbbf03fcb58aceb4654c6686b96d82b4b63932458b3bc8e3);\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n bytes30[2] memory r_2;\n {\n bytes30 r_2_0 = bytes30(0x2a0409e74acfd516bb447eda432a3d353e9f71e92026fd7d9d5ab90a9380);\n r_2[0] = r_2_0;\n }\n {\n bytes30 r_2_1 = bytes30(0x62317f5c52a0862e4c61004797106a827b2e25a46a91b8f40eb66003b80c);\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xf3031d7c8c3cf7122e0251eebd8e755697df0125e7aff48a906c26b3c59100004cd622326ad2855067607f3cb75b20fa8ec040efe530a28acc9923e7461300009205311301e22591301b9144ad8c8c3f6a33ff9cb8938bf1a9c2433fd0710000c9813b60aad9dbbf03fcb58aceb4654c6686b96d82b4b63932458b3bc8e300002a0409e74acfd516bb447eda432a3d353e9f71e92026fd7d9d5ab90a9380000062317f5c52a0862e4c61004797106a827b2e25a46a91b8f40eb66003b80c0000" + }, + { + "name": "random-bytes4[4][]", + "type": "bytes4[4][]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610152806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100a8565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b60405180608001604052806004906020820280368337509192915050565b602080825282518282018190526000919084820190604085019084805b8281101561010f57845184835b60048110156100f95782516001600160e01b031916825291880191908801906001016100d2565b50505093850193608093909301926001016100c5565b509197965050505050505056fea264697066735822122005f92c6cd8cd69cb18686c753a29733f6b4581977564a7f40967115c5b90136564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes4[4][] memory) {\n bytes4[4][] memory r = new bytes4[4][](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-int104[][2]", + "type": "int104[][2]", + "value": [["6312439677431055620753293958615", "-1863125265444003133615067259953"], []], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "6312439677431055620753293958615" + }, + { + "type": "number", + "value": "-1863125265444003133615067259953" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610135565b60405180910390f35b61005661010e565b61005e61010e565b60408051600280825260608201835260009260208301908036833701905050905060006c4fac97b815b8ed08bbafb5ddd7905080826000815181106100a5576100a56101ad565b6020026020010190600c0b9081600c0b815250505060006c178415192c59dc2eaf5702643019905080826001815181106100e1576100e16101ad565b600c9290920b60209283029190910182015291835250604080516000815280830190915290820152919050565b60405180604001604052806002905b606081526020019060019003908161011d5790505090565b6020808252600090606083018382018584805b60028110156101a057878503601f19018452825180518087529087019087870190845b8181101561018a578351600c0b8352928901929189019160010161016b565b5090965050509285019291850191600101610148565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ad6c1499286403fab9e9118e4a70c378fdcce9f70395f5d930491c73ac2a3bd164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int104[][2] memory) {\n int104[][2] memory r;\n {\n int104[] memory r_0 = new int104[](2);\n {\n int104 r_0_0 = 6312439677431055620753293958615;\n r_0[0] = r_0_0;\n }\n {\n int104 r_0_1 = -1863125265444003133615067259953;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n int104[] memory r_1 = new int104[](0);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000004fac97b815b8ed08bbafb5ddd7ffffffffffffffffffffffffffffffffffffffe87beae6d3a623d150a8fd9bcf0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-int136[1][1]", + "type": "int136[1][1]", + "value": [["13948834579662572067286299201345441153140"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "13948834579662572067286299201345441153140" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061015f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100cc565b60405180910390f35b610056610081565b61005e610081565b6100666100ae565b7028fdefd214a6fcabbe0cc82d1e88eec07481528152919050565b60405180602001604052806001905b6100986100ae565b8152602001906001900390816100905790505090565b60405180602001604052806001906020820280368337509192915050565b60208181019082846000805b60018082106100e7575061011e565b835185845b8381101561010a57825160100b8252918801919088019083016100ec565b5050509385019350918401916001016100d8565b50505050509291505056fea26469706673582212204ae03fc3baa9877bb7c4d8b3e48d18be190690c68270ca8a4b80bfd5ec0c6c3664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int136[1][1] memory) {\n int136[1][1] memory r;\n {\n int136[1] memory r_0;\n {\n int136 r_0_0 = 13948834579662572067286299201345441153140;\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000028fdefd214a6fcabbe0cc82d1e88eec074" + }, + { + "name": "random-int16[][2]", + "type": "int16[][2]", + "value": [ + ["-18023", "7224", "28456", "-26543"], + ["-15499", "-14058"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-18023" + }, + { + "type": "number", + "value": "7224" + }, + { + "type": "number", + "value": "28456" + }, + { + "type": "number", + "value": "-26543" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-15499" + }, + { + "type": "number", + "value": "-14058" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102b1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ed565b60405180910390f35b6100566101c6565b61005e6101c6565b60408051600480825260a08201909252600091602082016080803683370190505090506000614666199050808260008151811061009d5761009d610265565b600192830b60209182029290920101528251611c3892508291849181106100c6576100c6610265565b602002602001019060010b908160010b81525050506000616f28905080826002815181106100f6576100f6610265565b602002602001019060010b908160010b815250505060006167ae199050808260038151811061012757610127610265565b60019290920b60209283029190910190910152508152604080516002808252606082019092526000918160200160208202803683370190505090506000613c8a199050808260008151811061017e5761017e610265565b600192830b602091820292909201015282516136e91992508291849181106101a8576101a8610265565b60019290920b60209283029190910182015283019190915250919050565b60405180604001604052806002905b60608152602001906001900390816101d55790505090565b6020808252600090606083018382018584805b600281101561025857878503601f19018452825180518087529087019087870190845b81811015610242578351600190810b8452938a0193928a019201610223565b5090965050509285019291850191600101610200565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212202e67657790a4adb500947548001bcb1d2d930b7d7f49363cf07c2e56b27297bf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int16[][2] memory) {\n int16[][2] memory r;\n {\n int16[] memory r_0 = new int16[](4);\n {\n int16 r_0_0 = -18023;\n r_0[0] = r_0_0;\n }\n {\n int16 r_0_1 = 7224;\n r_0[1] = r_0_1;\n }\n {\n int16 r_0_2 = 28456;\n r_0[2] = r_0_2;\n }\n {\n int16 r_0_3 = -26543;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n int16[] memory r_1 = new int16[](2);\n {\n int16 r_1_0 = -15499;\n r_1[0] = r_1_0;\n }\n {\n int16 r_1_1 = -14058;\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb9990000000000000000000000000000000000000000000000000000000000001c380000000000000000000000000000000000000000000000000000000000006f28ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff98510000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc375ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc916" + }, + { + "name": "random-int184[][1]", + "type": "int184[][1]", + "value": [[]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061014f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061009b565b60405180910390f35b610056610074565b61005e610074565b6040805160008152602081019091528152919050565b60405180602001604052806001905b60608152602001906001900390816100835790505090565b6020808252600090604083018382018584805b60018082106100bd575061010c565b888603601f19018552835180518088529088019088880190855b818110156100f557835160160b8352928a0192918a019184016100d7565b5090975050509386019350918501916001016100ae565b509297965050505050505056fea26469706673582212200440d2c2fdea92ef6993a54977ca005a95ff1f130e60aff909eb3596f285059964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int184[][1] memory) {\n int184[][1] memory r;\n {\n int184[] memory r_0 = new int184[](0);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-int208[4][3]", + "type": "int208[4][3]", + "value": [ + [ + "89645778189831305326454189994460637476232346368198830990511729", + "112456855655064332650827278726277751546550941141819498247086855", + "170520710873603090817584122999003828225637152763647956621158335", + "30259421376934014477569035370178607331800689302762506556044612" + ], + [ + "136016345579925436369387871521057273999307805961784131351129348", + "8205919103596605330564747763014675876767930866494164289831037", + "48869862638635824592303290028831357725104475739744046174198468", + "-189119769093724714659230870148475475818243793407835175071479154" + ], + [ + "-195455657718888049754983367396852852591939061398237566584873914", + "-4405172832263127224862702460005307568890517384694160031560499", + "-191879126345070670341374123583341721844087364254035996740126337", + "-133648747518270316672465298230164208104068721005971295512621573" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "89645778189831305326454189994460637476232346368198830990511729" + }, + { + "type": "number", + "value": "112456855655064332650827278726277751546550941141819498247086855" + }, + { + "type": "number", + "value": "170520710873603090817584122999003828225637152763647956621158335" + }, + { + "type": "number", + "value": "30259421376934014477569035370178607331800689302762506556044612" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "136016345579925436369387871521057273999307805961784131351129348" + }, + { + "type": "number", + "value": "8205919103596605330564747763014675876767930866494164289831037" + }, + { + "type": "number", + "value": "48869862638635824592303290028831357725104475739744046174198468" + }, + { + "type": "number", + "value": "-189119769093724714659230870148475475818243793407835175071479154" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-195455657718888049754983367396852852591939061398237566584873914" + }, + { + "type": "number", + "value": "-4405172832263127224862702460005307568890517384694160031560499" + }, + { + "type": "number", + "value": "-191879126345070670341374123583341721844087364254035996740126337" + }, + { + "type": "number", + "value": "-133648747518270316672465298230164208104068721005971295512621573" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102e6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610252565b60405180910390f35b610056610207565b61005e610207565b610066610234565b7937c9657b2288a3754abfc2305400d015283c0dd771f8720f4e7181527945fb692442c9b4b3f77ae3ca67382447c7be621336c0df91e3076020820152796a1d843a7acd0664ad16d83c2d4129a4ca69a96bdb093c5b67bf60408201527912d49a9c041421045c5af84c0141593035548661037041b87544606082015281526100ed610234565b7954a4a76c0dbab3c603e24a288565ec6971684713a47ea21ead04815279051b4740f1f6e2510cb69c58e97a829dde64e4c0395e3d19c07d602080830191909152791e696b14d79951b63fdab75d5a216042ec6bd521f50aad785ac460408301527975b08476ce7dfb84881a98933cd8437e4fc44074185dd1af757119606083015282015261017a610234565b7979a1e1fa92e73ac4a69393d78fca2c7821c6f2bb9c5b3b35e3b91981527902bdc8d657ee05a521624915f93771c1896d0919d4b8990d33321960208201527977681bc0ba6d35039274e498dce457edc42124dba18ac06b86801960408083019190915279532b794eeadad52c8695cc43df828b6fd1116820dd990f04f204196060830152820152919050565b60405180606001604052806003905b61021e610234565b8152602001906001900390816102165790505090565b60405180608001604052806004906020820280368337509192915050565b610180810181836000805b60038110156102a657825184835b600481101561028d57825160190b82526020928301929091019060010161026b565b505050608093909301926020929092019160010161025d565b505050509291505056fea2646970667358221220f257c2e4d6d6cb9eeb1d2f3cdaab64f794f879c929aa6c7f92d81f4e57b1b69e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int208[4][3] memory) {\n int208[4][3] memory r;\n {\n int208[4] memory r_0;\n {\n int208 r_0_0 = 89645778189831305326454189994460637476232346368198830990511729;\n r_0[0] = r_0_0;\n }\n {\n int208 r_0_1 = 112456855655064332650827278726277751546550941141819498247086855;\n r_0[1] = r_0_1;\n }\n {\n int208 r_0_2 = 170520710873603090817584122999003828225637152763647956621158335;\n r_0[2] = r_0_2;\n }\n {\n int208 r_0_3 = 30259421376934014477569035370178607331800689302762506556044612;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n int208[4] memory r_1;\n {\n int208 r_1_0 = 136016345579925436369387871521057273999307805961784131351129348;\n r_1[0] = r_1_0;\n }\n {\n int208 r_1_1 = 8205919103596605330564747763014675876767930866494164289831037;\n r_1[1] = r_1_1;\n }\n {\n int208 r_1_2 = 48869862638635824592303290028831357725104475739744046174198468;\n r_1[2] = r_1_2;\n }\n {\n int208 r_1_3 = -189119769093724714659230870148475475818243793407835175071479154;\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n {\n int208[4] memory r_2;\n {\n int208 r_2_0 = -195455657718888049754983367396852852591939061398237566584873914;\n r_2[0] = r_2_0;\n }\n {\n int208 r_2_1 = -4405172832263127224862702460005307568890517384694160031560499;\n r_2[1] = r_2_1;\n }\n {\n int208 r_2_2 = -191879126345070670341374123583341721844087364254035996740126337;\n r_2[2] = r_2_2;\n }\n {\n int208 r_2_3 = -133648747518270316672465298230164208104068721005971295512621573;\n r_2[3] = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000037c9657b2288a3754abfc2305400d015283c0dd771f8720f4e7100000000000045fb692442c9b4b3f77ae3ca67382447c7be621336c0df91e3070000000000006a1d843a7acd0664ad16d83c2d4129a4ca69a96bdb093c5b67bf00000000000012d49a9c041421045c5af84c0141593035548661037041b8754400000000000054a4a76c0dbab3c603e24a288565ec6971684713a47ea21ead04000000000000051b4740f1f6e2510cb69c58e97a829dde64e4c0395e3d19c07d0000000000001e696b14d79951b63fdab75d5a216042ec6bd521f50aad785ac4ffffffffffff8a4f7b893182047b77e5676cc327bc81b03bbf8be7a22e508a8effffffffffff865e1e056d18c53b596c6c287035d387de390d4463a4c4ca1c46fffffffffffffd423729a811fa5ade9db6ea06c88e3e7692f6e62b4766f2cccdffffffffffff8897e43f4592cafc6d8b1b67231ba8123bdedb245e753f94797fffffffffffffacd486b115252ad3796a33bc207d74902eee97df2266f0fb0dfb" + }, + { + "name": "random-int224[][]", + "type": "int224[][]", + "value": [ + [ + "-2021071922088372645694553497502142329203132375019555858113421611389", + "9793254133698662902315416576085593519681491660660082694332402790482", + "-6324941830189574217422621231615357620295306290942984455661243469525", + "12427029182391355710338453869147901857274723675102633446826107824274" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2021071922088372645694553497502142329203132375019555858113421611389" + }, + { + "type": "number", + "value": "9793254133698662902315416576085593519681491660660082694332402790482" + }, + { + "type": "number", + "value": "-6324941830189574217422621231615357620295306290942984455661243469525" + }, + { + "type": "number", + "value": "12427029182391355710338453869147901857274723675102633446826107824274" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102d2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101f9565b60405180910390f35b60408051600180825281830190925260609160009190816020015b606081526020019060019003908161006957505060408051600480825260a08201909252919250600091906020820160808036833701905050905060007fffffffffeccf0bdae9109a0f3bb564dd4b169b2404cf5fa7f4395d83e7306e83905080826000815181106100dd576100dd610286565b6020026020010190601b0b9081601b0b815250505060007b5cfe150267ee3f5f46829e17b32f136184cebfbaf5ed0986d91e70529050808260018151811061012757610127610286565b6020026020010190601b0b9081601b0b815250505060007fffffffffc3f0eb0931b52152aa50e49bc020ff5f665d9fc3706f7c23d13df12b9050808260028151811061017557610175610286565b6020026020010190601b0b9081601b0b815250505060007b76006f3efcca2eefcd5f2fae15215d40f62a4b0d9db4ff3732f96892905080826003815181106101bf576101bf610286565b6020026020010190601b0b9081601b0b815250505080826000815181106101e8576101e8610286565b602090810291909101015250919050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b8381101561027857888603603f19018552825180518088529088019088880190845b81811015610262578351601b0b8352928a0192918a0191600101610243565b5090975050509386019391860191600101610221565b509398975050505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212205ab79077747489d91dcde3bf91c820c87ea589cf87ed339f144535fe9df38c3364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int224[][] memory) {\n int224[][] memory r = new int224[][](1);\n {\n int224[] memory r_0 = new int224[](4);\n {\n int224 r_0_0 = -2021071922088372645694553497502142329203132375019555858113421611389;\n r_0[0] = r_0_0;\n }\n {\n int224 r_0_1 = 9793254133698662902315416576085593519681491660660082694332402790482;\n r_0[1] = r_0_1;\n }\n {\n int224 r_0_2 = -6324941830189574217422621231615357620295306290942984455661243469525;\n r_0[2] = r_0_2;\n }\n {\n int224 r_0_3 = 12427029182391355710338453869147901857274723675102633446826107824274;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004ffffffffeccf0bdae9109a0f3bb564dd4b169b2404cf5fa7f4395d83e7306e83000000005cfe150267ee3f5f46829e17b32f136184cebfbaf5ed0986d91e7052ffffffffc3f0eb0931b52152aa50e49bc020ff5f665d9fc3706f7c23d13df12b0000000076006f3efcca2eefcd5f2fae15215d40f62a4b0d9db4ff3732f96892" + }, + { + "name": "random-int32[2][]", + "type": "int32[2][]", + "value": [ + ["1802170830", "1540451188"], + ["-1430551813", "-818428989"], + ["-1704335870", "-2037145084"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1802170830" + }, + { + "type": "number", + "value": "1540451188" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1430551813" + }, + { + "type": "number", + "value": "-818428989" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1704335870" + }, + { + "type": "number", + "value": "-2037145084" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610218806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610160565b60405180910390f35b6040805160038082526080820190925260609160009190816020015b610072610142565b81526020019060019003908161006a57905050905061008f610142565b636b6af1ce8152635bd16b7460208201528151819083906000906100b5576100b56101cc565b6020026020010181905250506100c9610142565b6355447d041981526330c83c3c19602082015281518190839060019081106100f3576100f36101cc565b602002602001018190525050610107610142565b63659619fd19815263796c5dfb1960208201528151819083906002908110610131576101316101cc565b602090810291909101015250919050565b60405180604001604052806002906020820280368337509192915050565b60208082528251828201819052600091906040908185019086840185805b838110156101be57825185835b60028110156101ab57825160030b8252918901919089019060010161018b565b505050938501939186019160010161017e565b509298975050505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220dca6f82ca64d4e639f2af59e92ef1948f0c601ce30c982225310f25d24b93a2164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int32[2][] memory) {\n int32[2][] memory r = new int32[2][](3);\n {\n int32[2] memory r_0;\n {\n int32 r_0_0 = 1802170830;\n r_0[0] = r_0_0;\n }\n {\n int32 r_0_1 = 1540451188;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n int32[2] memory r_1;\n {\n int32 r_1_0 = -1430551813;\n r_1[0] = r_1_0;\n }\n {\n int32 r_1_1 = -818428989;\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n int32[2] memory r_2;\n {\n int32 r_2_0 = -1704335870;\n r_2[0] = r_2_0;\n }\n {\n int32 r_2_1 = -2037145084;\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000006b6af1ce000000000000000000000000000000000000000000000000000000005bd16b74ffffffffffffffffffffffffffffffffffffffffffffffffffffffffaabb82fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf37c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9a69e602ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8693a204" + }, + { + "name": "random-int40[1][4]", + "type": "int40[1][4]", + "value": [["-529012798257"], ["95523777601"], ["241123609125"], ["-510988807696"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-529012798257" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "95523777601" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "241123609125" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-510988807696" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610197806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610101565b60405180910390f35b6100566100b6565b61005e6100b6565b6100666100e3565b647b2b9eb33019815281526100796100e3565b64163da92c418152602082015261008e6100e3565b643824164a25815260408201526100a36100e3565b6476f94e6e0f1981526060820152919050565b60405180608001604052806004905b6100cd6100e3565b8152602001906001900390816100c55790505090565b60405180602001604052806001906020820280368337509192915050565b6080810181836000805b600480821061011a5750610157565b835185845b6001811015610140578251840b82526020928301929091019060010161011f565b50505060209485019493909301925060010161010b565b505050509291505056fea2646970667358221220d1f6deda2bf1a925c3cbe236a0856f49c2c1eac4547ad950f1eff58890f3af4164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int40[1][4] memory) {\n int40[1][4] memory r;\n {\n int40[1] memory r_0;\n {\n int40 r_0_0 = -529012798257;\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n int40[1] memory r_1;\n {\n int40 r_1_0 = 95523777601;\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n int40[1] memory r_2;\n {\n int40 r_2_0 = 241123609125;\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n {\n int40[1] memory r_3;\n {\n int40 r_3_0 = -510988807696;\n r_3[0] = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffff84d4614ccf000000000000000000000000000000000000000000000000000000163da92c410000000000000000000000000000000000000000000000000000003824164a25ffffffffffffffffffffffffffffffffffffffffffffffffffffff8906b191f0" + }, + { + "name": "random-int72[2][2]", + "type": "int72[2][2]", + "value": [ + ["407611649518330326246", "306760877051977775583"], + ["-1591763529649730714983", "1513295958455295034492"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "407611649518330326246" + }, + { + "type": "number", + "value": "306760877051977775583" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1591763529649730714983" + }, + { + "type": "number", + "value": "1513295958455295034492" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610197806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fe565b60405180910390f35b6100566100b3565b61005e6100b3565b6100666100e0565b681618bf7b9e2b1a2ce681526810a1299063d669b9df6020820152815261008b6100e0565b68564a2810b11a297d6619815268520933406df226447c602080830191909152820152919050565b60405180604001604052806002905b6100ca6100e0565b8152602001906001900390816100c25790505090565b60405180604001604052806002906020820280368337509192915050565b6080810181836000805b60028082106101175750610157565b835185845b8381101561013d57825160080b82526020928301929091019060010161011c565b505050604094909401935060209290920191600101610108565b505050509291505056fea2646970667358221220281896f610f0bd48811165316c165d9164ffcc371f4bd8526772776eb4bb12ad64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (int72[2][2] memory) {\n int72[2][2] memory r;\n {\n int72[2] memory r_0;\n {\n int72 r_0_0 = 407611649518330326246;\n r_0[0] = r_0_0;\n }\n {\n int72 r_0_1 = 306760877051977775583;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n int72[2] memory r_1;\n {\n int72 r_1_0 = -1591763529649730714983;\n r_1[0] = r_1_0;\n }\n {\n int72 r_1_1 = 1513295958455295034492;\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000001618bf7b9e2b1a2ce6000000000000000000000000000000000000000000000010a1299063d669b9dfffffffffffffffffffffffffffffffffffffffffffffffa9b5d7ef4ee5d682990000000000000000000000000000000000000000000000520933406df226447c" + }, + { + "name": "random-string[][3]", + "type": "string[][3]", + "value": [ + ["Moo é🚀ooéoo🚀é 🚀🚀M oM🚀ooéoMéMoMM🚀o🚀o Mé🚀MoééMoM o oMoéo é", "Moo é🚀"], + [ + "Moo é🚀🚀MéMMMMo MoooM 🚀 éMoé🚀ééMo🚀 éo ooo MMéé🚀éééo Moooéo", + "Moo é🚀MMoé ééé🚀 MooM 🚀oo🚀🚀ooooooooo o", + "Moo é🚀M ooMoMéoo🚀oéoMMo éo🚀 ooMo ooéM🚀 ooééo o éo🚀🚀o éé ", + "Moo é🚀🚀o🚀🚀o 🚀 oéoo éo oéo 🚀o🚀oo 🚀éoM🚀é o🚀éé🚀oM" + ], + ["Moo é🚀ooM o🚀o🚀 Moo"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooéoo🚀é 🚀🚀M oM🚀ooéoMéMoMM🚀o🚀o Mé🚀MoééMoM o oMoéo é" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀MéMMMMo MoooM 🚀 éMoé🚀ééMo🚀 éo ooo MMéé🚀éééo Moooéo" + }, + { + "type": "string", + "value": "Moo é🚀MMoé ééé🚀 MooM 🚀oo🚀🚀ooooooooo o" + }, + { + "type": "string", + "value": "Moo é🚀M ooMoMéoo🚀oéoMMo éo🚀 ooMo ooéM🚀 ooééo o éo🚀🚀o éé " + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀🚀o 🚀 oéoo éo oéo 🚀o🚀oo 🚀éoM🚀é o🚀éé🚀oM" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooM o🚀o🚀 Moo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105a8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102f8565b60405180910390f35b6100566102d1565b61005e6102d1565b60408051600280825260608201909252600091816020015b606081526020019060019003908161007657905050905060006040518060800160405280605a815260200161046a605a9139905080826000815181106100be576100be6103be565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b81525090508082600181518110610104576101046103be565b602090810291909101015250815260408051600480825260a08201909252600091816020015b606081526020019060019003908161012a57905050905060006040518060800160405280605a8152602001610410605a913990508082600081518110610172576101726103be565b60200260200101819052505060006040518060600160405280603b81526020016103d5603b9139905080826001815181106101af576101af6103be565b602002602001018190525050600060405180608001604052806056815260200161051d60569139905080826002815181106101ec576101ec6103be565b60200260200101819052505060006040518060800160405280605981526020016104c46059913990508082600381518110610229576102296103be565b60209081029190910181019190915283019190915250604080516001808252818301909252600091816020015b606081526020019060019003908161025657905050905060006040518060400160405280601c81526020017f4d6f6f20c3a9f09f9a806f6f4d206ff09f9a806ff09f9a80204d6f6f00000000815250905080826000815181106102bb576102bb6103be565b6020908102919091010152506040820152919050565b60405180606001604052806003905b60608152602001906001900390816102e05790505090565b60208082526000906080830183820185845b60038110156103b257601f1987850381018452825180518087529087019087870190600581901b8801890160005b8281101561039b57858a83030184528451805180845260005b8181101561036c578281018e01518582018f01528d01610351565b8181111561037d5760008e83870101525b50958c0195948c0194601f018716929092018b019150600101610338565b50975050509386019350509084019060010161030a565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d4d6fc3a92020c3a9c3a9c3a9f09f9a80204d6f6f4d20f09f9a806f6ff09f9a80f09f9a806f6f6f6f6f6f6f6f6f20206f4d6f6f20c3a9f09f9a80f09f9a804dc3a94d4d4d4d6f20204d6f6f6f4d2020f09f9a8020c3a94d6fc3a9f09f9a80c3a9c3a94d6ff09f9a8020c3a96f206f6f6f204d4dc3a9c3a9f09f9a80c3a9c3a9c3a96f204d6f6f6fc3a96f4d6f6f20c3a9f09f9a806f6fc3a96f6ff09f9a80c3a920f09f9a80f09f9a804d206f4df09f9a806f6fc3a96f4dc3a94d6f4d4df09f9a806ff09f9a806f204dc3a9f09f9a804d6fc3a9c3a94d6f4d206f206f4d6fc3a96f20c3a94d6f6f20c3a9f09f9a80f09f9a806ff09f9a80f09f9a806f20f09f9a80206fc3a96f6f20c3a96f206fc3a96f20f09f9a806ff09f9a806f6f202020f09f9a80c3a96f4df09f9a80c3a9206ff09f9a80c3a9c3a9f09f9a806f4d4d6f6f20c3a9f09f9a804d206f6f4d6f4dc3a96f6ff09f9a806fc3a96f4d4d6f20c3a96ff09f9a80206f6f4d6f206f6fc3a94df09f9a80206f6fc3a9c3a96f2020206f20c3a96ff09f9a80f09f9a806f20c3a9c3a920a2646970667358221220e57c93b085652377c155bf62704eb67a7376471b67fd24614cd0dd46f1039ad864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[][3] memory) {\n string[][3] memory r;\n {\n string[] memory r_0 = new string[](2);\n {\n string memory r_0_0 = unicode\"Moo é🚀ooéoo🚀é 🚀🚀M oM🚀ooéoMéMoMM🚀o🚀o Mé🚀MoééMoM o oMoéo é\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀\";\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n string[] memory r_1 = new string[](4);\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀MéMMMMo MoooM 🚀 éMoé🚀ééMo🚀 éo ooo MMéé🚀éééo Moooéo\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀MMoé ééé🚀 MooM 🚀oo🚀🚀ooooooooo o\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀M ooMoMéoo🚀oéoMMo éo🚀 ooMo ooéM🚀 ooééo o éo🚀🚀o éé \";\n r_1[2] = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀🚀o🚀🚀o 🚀 oéoo éo oéo 🚀o🚀oo 🚀éoM🚀é o🚀éé🚀oM\";\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n {\n string[] memory r_2 = new string[](1);\n {\n string memory r_2_0 = unicode\"Moo é🚀ooM o🚀o🚀 Moo\";\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806f6fc3a96f6ff09f9a80c3a920f09f9a80f09f9a804d206f4df09f9a806f6fc3a96f4dc3a94d6f4d4df09f9a806ff09f9a806f204dc3a9f09f9a804d6fc3a9c3a94d6f4d206f206f4d6fc3a96f20c3a9000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a80f09f9a804dc3a94d4d4d4d6f20204d6f6f6f4d2020f09f9a8020c3a94d6fc3a9f09f9a80c3a9c3a94d6ff09f9a8020c3a96f206f6f6f204d4dc3a9c3a9f09f9a80c3a9c3a9c3a96f204d6f6f6fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a804d4d6fc3a92020c3a9c3a9c3a9f09f9a80204d6f6f4d20f09f9a806f6ff09f9a80f09f9a806f6f6f6f6f6f6f6f6f20206f000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a804d206f6f4d6f4dc3a96f6ff09f9a806fc3a96f4d4d6f20c3a96ff09f9a80206f6f4d6f206f6fc3a94df09f9a80206f6fc3a9c3a96f2020206f20c3a96ff09f9a80f09f9a806f20c3a9c3a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a806ff09f9a80f09f9a806f20f09f9a80206fc3a96f6f20c3a96f206fc3a96f20f09f9a806ff09f9a806f6f202020f09f9a80c3a96f4df09f9a80c3a9206ff09f9a80c3a9c3a9f09f9a806f4d0000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a806f6f4d206ff09f9a806ff09f9a80204d6f6f00000000" + }, + { + "name": "random-string[1][1]", + "type": "string[1][1]", + "value": [["Moo é🚀 éé🚀 ééooéoo ooo oo🚀Mé🚀MMoooMéoMo🚀🚀 oM🚀🚀o🚀M🚀éééoo é🚀o"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éé🚀 ééooéoo ooo oo🚀Mé🚀MMoooMéoMo🚀🚀 oM🚀🚀o🚀M🚀éééoo é🚀o" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610234806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100df565b60405180910390f35b61005661008b565b61005e61008b565b6100666100b8565b60006040518060a0016040528060688152602001610197606891398252508152919050565b60405180602001604052806001905b6100a26100b8565b81526020019060019003908161009a5790505090565b60405180602001604052806001905b60608152602001906001900390816100c75790505090565b60208082526000906040830183820185845b6001808210610100575061018a565b601f198886038101855283518688810160005b858110156101735789820383528351805180845260005b81811015610145578281018e01518582018f01528d0161012a565b818111156101565760008e83870101525b50948c0194938c0193601f018616929092018b0191508501610113565b5097505050938601935050908401906001016100f1565b5091969550505050505056fe4d6f6f20c3a9f09f9a8020c3a9c3a9f09f9a8020c3a9c3a96f6fc3a96f6f206f6f6f206f6ff09f9a804dc3a9f09f9a804d4d6f6f6f4dc3a96f4d6ff09f9a80f09f9a80206f4df09f9a80f09f9a806ff09f9a804df09f9a80c3a9c3a9c3a96f6f20c3a9f09f9a806fa264697066735822122035ae7ce4a89e0cf9aa2b8ee6830d09bcedc48cd8445b07bbf01762540114e13564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[1][1] memory) {\n string[1][1] memory r;\n {\n string[1] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 éé🚀 ééooéoo ooo oo🚀Mé🚀MMoooMéoMo🚀🚀 oM🚀🚀o🚀M🚀éééoo é🚀o\";\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a8020c3a9c3a9f09f9a8020c3a9c3a96f6fc3a96f6f206f6f6f206f6ff09f9a804dc3a9f09f9a804d4d6f6f6f4dc3a96f4d6ff09f9a80f09f9a80206f4df09f9a80f09f9a806ff09f9a804df09f9a80c3a9c3a9c3a96f6f20c3a9f09f9a806f000000000000000000000000000000000000000000000000" + }, + { + "name": "random-string[1][2]", + "type": "string[1][2]", + "value": [ + ["Moo é🚀"], + ["Moo é🚀🚀🚀🚀🚀é MMoé🚀oéoé oMo é🚀 o🚀Moéo🚀ooM🚀oMMoéo🚀 éM🚀oooo🚀oéoo🚀"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀🚀é MMoé🚀oéoé oMo é🚀 o🚀Moéo🚀ooM🚀oMMoéo🚀 éM🚀oooo🚀oéoo🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610267806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6100566100ba565b61005e6100ba565b6100666100e7565b60408051808201909152600a8152689adede418753e13f3560b71b6020820152815281526100926100e7565b60006040518060a00160405280607181526020016101c1607191398252506020820152919050565b60405180604001604052806002905b6100d16100e7565b8152602001906001900390816100c95790505090565b60405180602001604052806001905b60608152602001906001900390816100f65790505090565b60208082526000906060830183820185845b60028110156101b457601f198785038101845282518587810160005b600181101561019e5788820383528351805180845260005b8181101561016f578281018d01518582018e01528c01610154565b818111156101805760008d83870101525b50948b0194938b0193601f018616929092018a01915060010161013c565b5096505050928501925090840190600101610120565b5091969550505050505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80c3a9204d4d6fc3a9f09f9a806fc3a96fc3a9206f4d6f20c3a9f09f9a80206ff09f9a804d6fc3a96ff09f9a806f6f4df09f9a806f4d4d6fc3a96ff09f9a8020c3a94df09f9a806f6f6f6ff09f9a806fc3a96f6ff09f9a80a2646970667358221220f4b14140976706700433810eb254a7f758f969d8e454e6d389bf1f20660411f064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[1][2] memory) {\n string[1][2] memory r;\n {\n string[1] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n string[1] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀🚀🚀🚀é MMoé🚀oéoé oMo é🚀 o🚀Moéo🚀ooM🚀oMMoéo🚀 éM🚀oooo🚀oéoo🚀\";\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000714d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80c3a9204d4d6fc3a9f09f9a806fc3a96fc3a9206f4d6f20c3a9f09f9a80206ff09f9a804d6fc3a96ff09f9a806f6f4df09f9a806f4d4d6fc3a96ff09f9a8020c3a94df09f9a806f6f6f6ff09f9a806fc3a96f6ff09f9a80000000000000000000000000000000" + }, + { + "name": "random-string[1][3]", + "type": "string[1][3]", + "value": [ + ["Moo é🚀MéoMoéoo oé MM o éoo🚀éooé 🚀o🚀 Mé🚀oM oo 🚀o🚀M "], + ["Moo é🚀o🚀ééé🚀 🚀oo🚀🚀M éo🚀🚀MoM🚀éé🚀ooM🚀"], + ["Moo é🚀é o🚀oo 🚀o éo🚀éo🚀Moé éM oooo🚀Moéoé🚀MéoM🚀 Moéoo o Mo🚀"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéoMoéoo oé MM o éoo🚀éooé 🚀o🚀 Mé🚀oM oo 🚀o🚀M " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀ééé🚀 🚀oo🚀🚀M éo🚀🚀MoM🚀éé🚀ooM🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é o🚀oo 🚀o éo🚀éo🚀Moé éM oooo🚀Moéoé🚀MéoM🚀 Moéoo o Mo🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610317806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610135565b60405180910390f35b6100566100e1565b61005e6100e1565b61006661010e565b60006040518060800160405280604f8152602001610233604f9139825250815261008e61010e565b60006040518060800160405280604b81526020016101e8604b913982525060208201526100b961010e565b6000604051806080016040528060608152602001610282606091398252506040820152919050565b60405180606001604052806003905b6100f861010e565b8152602001906001900390816100f05790505090565b60405180602001604052806001905b606081526020019060019003908161011d5790505090565b60208082526000906080830183820185845b60038110156101db57601f198785038101845282518587810160005b60018110156101c55788820383528351805180845260005b81811015610196578281018d01518582018e01528c0161017b565b818111156101a75760008d83870101525b50948b0194938b0193601f018616929092018a019150600101610163565b5096505050928501925090840190600101610147565b5091969550505050505056fe4d6f6f20c3a9f09f9a806ff09f9a80c3a9c3a9c3a9f09f9a8020f09f9a806f6ff09f9a80f09f9a804d20c3a96ff09f9a80f09f9a804d6f4df09f9a80c3a9c3a9f09f9a806f6f4df09f9a804d6f6f20c3a9f09f9a804dc3a96f4d6fc3a96f6f206fc3a9204d4d206f20c3a96f6ff09f9a80c3a96f6fc3a920f09f9a806ff09f9a80204dc3a9f09f9a806f4d206f6f20f09f9a806ff09f9a804d204d6f6f20c3a9f09f9a80c3a9206ff09f9a806f6f20f09f9a806f20c3a96ff09f9a80c3a96ff09f9a804d6fc3a92020c3a94d206f6f6f6ff09f9a804d6fc3a96fc3a9f09f9a804dc3a96f4df09f9a80204d6fc3a96f6f20206f204d6ff09f9a80a264697066735822122097087d96df126723232b8073d1dc4266a7b64a82b12e590372618b6fe4fa92dd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[1][3] memory) {\n string[1][3] memory r;\n {\n string[1] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀MéoMoéoo oé MM o éoo🚀éooé 🚀o🚀 Mé🚀oM oo 🚀o🚀M \";\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n string[1] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀o🚀ééé🚀 🚀oo🚀🚀M éo🚀🚀MoM🚀éé🚀ooM🚀\";\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n string[1] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀é o🚀oo 🚀o éo🚀éo🚀Moé éM oooo🚀Moéoé🚀MéoM🚀 Moéoo o Mo🚀\";\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a804dc3a96f4d6fc3a96f6f206fc3a9204d4d206f20c3a96f6ff09f9a80c3a96f6fc3a920f09f9a806ff09f9a80204dc3a9f09f9a806f4d206f6f20f09f9a806ff09f9a804d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a806ff09f9a80c3a9c3a9c3a9f09f9a8020f09f9a806f6ff09f9a80f09f9a804d20c3a96ff09f9a80f09f9a804d6f4df09f9a80c3a9c3a9f09f9a806f6f4df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a80c3a9206ff09f9a806f6f20f09f9a806f20c3a96ff09f9a80c3a96ff09f9a804d6fc3a92020c3a94d206f6f6f6ff09f9a804d6fc3a96fc3a9f09f9a804dc3a96f4df09f9a80204d6fc3a96f6f20206f204d6ff09f9a80" + }, + { + "name": "random-string[1][4]", + "type": "string[1][4]", + "value": [ + ["Moo é🚀éoo oééé🚀MMo ooéo🚀 oM é🚀🚀MoMéoéMoo Moo o éo ééo oé🚀M "], + ["Moo é🚀oo🚀 Mo Mé o🚀M 🚀🚀 éééo M🚀M M 🚀MoéoéoM🚀 é🚀🚀 é M 🚀éo"], + ["Moo é🚀"], + ["Moo é🚀 oéM 🚀MooéééoMooo M Mé oooM oo"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoo oééé🚀MMo ooéo🚀 oM é🚀🚀MoMéoéMoo Moo o éo ééo oé🚀M " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀 Mo Mé o🚀M 🚀🚀 éééo M🚀M M 🚀MoéoéoM🚀 é🚀🚀 é M 🚀éo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oéM 🚀MooéééoMooo M Mé oooM oo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061033b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610161565b60405180910390f35b61005661010d565b61005e61010d565b61006661013a565b60006040518060800160405280605d81526020016102a9605d9139825250815261008e61013a565b60006040518060a00160405280606481526020016102456064913982525060208201526100b961013a565b604080518082018252600a8152689adede418753e13f3560b71b602082015282528201526100e561013a565b6000604051806060016040528060318152602001610214603191398252506060820152919050565b60405180608001604052806004905b61012461013a565b81526020019060019003908161011c5790505090565b60405180602001604052806001905b60608152602001906001900390816101495790505090565b602080825260009060a0830183820185845b600481101561020757601f198785038101845282518587810160005b60018110156101f15788820383528351805180845260005b818110156101c2578281018d01518582018e01528c016101a7565b818111156101d35760008d83870101525b50948b0194938b0193601f018616929092018a01915060010161018f565b5096505050928501925090840190600101610173565b5091969550505050505056fe4d6f6f20c3a9f09f9a80206fc3a94d20f09f9a804d6f6fc3a9c3a9c3a96f4d6f6f6f204d204dc3a9206f6f6f4d20206f6f4d6f6f20c3a9f09f9a806f6ff09f9a80204d6f204dc3a9206ff09f9a804d20f09f9a80f09f9a8020c3a9c3a9c3a96f204df09f9a804d204d2020f09f9a804d6fc3a96fc3a96f4df09f9a8020c3a9f09f9a80f09f9a8020c3a920204d20f09f9a80c3a96f4d6f6f20c3a9f09f9a80c3a96f6f206fc3a9c3a9c3a9f09f9a804d4d6f206f6fc3a96ff09f9a80206f4d20c3a9f09f9a80f09f9a804d6f4dc3a96fc3a94d6f6f204d6f6f206f20c3a96f20202020c3a9c3a96f206fc3a9f09f9a804d20a2646970667358221220a16cff9cfebcf99f442ae4bbd45e01b1df26210ee3a0b8b3f451fb867e20ff1564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[1][4] memory) {\n string[1][4] memory r;\n {\n string[1] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀éoo oééé🚀MMo ooéo🚀 oM é🚀🚀MoMéoéMoo Moo o éo ééo oé🚀M \";\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n string[1] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀oo🚀 Mo Mé o🚀M 🚀🚀 éééo M🚀M M 🚀MoéoéoM🚀 é🚀🚀 é M 🚀éo\";\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n string[1] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀\";\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n {\n string[1] memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀 oéM 🚀MooéééoMooo M Mé oooM oo\";\n r_3[0] = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a80c3a96f6f206fc3a9c3a9c3a9f09f9a804d4d6f206f6fc3a96ff09f9a80206f4d20c3a9f09f9a80f09f9a804d6f4dc3a96fc3a94d6f6f204d6f6f206f20c3a96f20202020c3a9c3a96f206fc3a9f09f9a804d20000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a806f6ff09f9a80204d6f204dc3a9206ff09f9a804d20f09f9a80f09f9a8020c3a9c3a9c3a96f204df09f9a804d204d2020f09f9a804d6fc3a96fc3a96f4df09f9a8020c3a9f09f9a80f09f9a8020c3a920204d20f09f9a80c3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a80206fc3a94d20f09f9a804d6f6fc3a9c3a9c3a96f4d6f6f6f204d204dc3a9206f6f6f4d20206f6f000000000000000000000000000000" + }, + { + "name": "random-string[2][]", + "type": "string[2][]", + "value": [["Moo é🚀oéo ooooMM o🚀oo🚀 ooM🚀éM", "Moo é🚀éMoo🚀 é"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéo ooooMM o🚀oo🚀 ooM🚀éM" + }, + { + "type": "string", + "value": "Moo é🚀éMoo🚀 é" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012d565b60405180910390f35b60408051600180825281830190925260609160009190816020015b610071610106565b81526020019060019003908161006957905050905061008e610106565b60006040518060600160405280602c815260200161020c602c91398252506040805180820190915260168152754d6f6f20c3a9f09f9a80c3a94d6f6ff09f9a8020c3a960501b6020808301919091528201528151819083906000906100f5576100f56101f5565b602090810291909101015250919050565b60405180604001604052806002905b60608152602001906001900390816101155790505090565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156101e757888303603f1901855281518387810160005b60028110156101d25786820383528351805180845260005b818110156101a1578281018e01518582018f01528d01610186565b818111156101b25760008e83870101525b50948c0194938c0193601f01601f1916929092018b01915060010161016e565b50968901969450505090860190600101610154565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806fc3a96f206f6f6f6f4d4d206ff09f9a806f6ff09f9a80206f6f4df09f9a80c3a94da2646970667358221220c745d927e4ef90f08518715484c79bffc0ba880815c1b6446d6b01f907deb3be64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[2][] memory) {\n string[2][] memory r = new string[2][](1);\n {\n string[2] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀oéo ooooMM o🚀oo🚀 ooM🚀éM\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀éMoo🚀 é\";\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a806fc3a96f206f6f6f6f4d4d206ff09f9a806f6ff09f9a80206f6f4df09f9a80c3a94d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80c3a94d6f6ff09f9a8020c3a900000000000000000000" + }, + { + "name": "random-string[2][3]", + "type": "string[2][3]", + "value": [ + ["Moo é🚀🚀o o oo🚀Mooooé é🚀éo o🚀M🚀o ooMéoM 🚀", "Moo é🚀M🚀o ooooéé🚀o"], + ["Moo é🚀", "Moo é🚀"], + ["Moo é🚀MMéoé 🚀oéé o🚀o 🚀M oo ", "Moo é🚀🚀 éoooooo o Mo🚀🚀o🚀🚀ooooo"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o o oo🚀Mooooé é🚀éo o🚀M🚀o ooMéoM 🚀" + }, + { + "type": "string", + "value": "Moo é🚀M🚀o ooooéé🚀o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMéoé 🚀oéé o🚀o 🚀M oo " + }, + { + "type": "string", + "value": "Moo é🚀🚀 éoooooo o Mo🚀🚀o🚀🚀ooooo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610338806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ae565b60405180910390f35b61005661015a565b61005e61015a565b610066610187565b60006040518060800160405280604281526020016102c16042913982525060408051808201909152601e81527f4d6f6f20c3a9f09f9a804df09f9a806f206f6f6f6fc3a9c3a9f09f9a806f000060208083019190915282015281526100c9610187565b604080518082018252600a808252689adede418753e13f3560b71b602080840182905292855283518085019094529083528282015282810191909152820152610110610187565b60006040518060600160405280602d8152602001610262602d9139825250604080516060810190915260328082526000919061028f60208301396020830152506040820152919050565b60405180606001604052806003905b610171610187565b8152602001906001900390816101695790505090565b60405180604001604052806002905b60608152602001906001900390816101965790505090565b60208082526000906080830183820185845b600381101561025557601f19878503810184528251856040810160005b600281101561023f5788820383528351805180845260005b81811015610210578281018d01518582018e01528c016101f5565b818111156102215760008d83870101525b50948b0194938b0193601f018616929092018a0191506001016101dd565b50965050509285019250908401906001016101c0565b5091969550505050505056fe4d6f6f20c3a9f09f9a804d4dc3a96fc3a920f09f9a806fc3a9c3a9206ff09f9a806f20f09f9a804d206f6f20204d6f6f20c3a9f09f9a80f09f9a8020c3a96f6f6f6f6f6f206f204d6ff09f9a80f09f9a806ff09f9a80f09f9a806f6f6f6f6f4d6f6f20c3a9f09f9a80f09f9a806f206f206f6ff09f9a804d6f6f6f6fc3a920c3a9f09f9a80c3a96f206ff09f9a804df09f9a806f206f6f4dc3a96f4d20f09f9a80a26469706673582212206a47b6731d1383e56f041cfdff529001dd87488b861111703fe6fc9608eba61964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[2][3] memory) {\n string[2][3] memory r;\n {\n string[2] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀🚀o o oo🚀Mooooé é🚀éo o🚀M🚀o ooMéoM 🚀\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀M🚀o ooooéé🚀o\";\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n string[2] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀\";\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n string[2] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀MMéoé 🚀oéé o🚀o 🚀M oo \";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀🚀 éoooooo o Mo🚀🚀o🚀🚀ooooo\";\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80f09f9a806f206f206f6ff09f9a804d6f6f6f6fc3a920c3a9f09f9a80c3a96f206ff09f9a804df09f9a806f206f6f4dc3a96f4d20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a804df09f9a806f206f6f6f6fc3a9c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a804d4dc3a96fc3a920f09f9a806fc3a9c3a9206ff09f9a806f20f09f9a804d206f6f20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80f09f9a8020c3a96f6f6f6f6f6f206f204d6ff09f9a80f09f9a806ff09f9a80f09f9a806f6f6f6f6f0000000000000000000000000000" + }, + { + "name": "random-string[3][]", + "type": "string[3][]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101af806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b1565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b60405180606001604052806003905b60608152602001906001900390816100995790505090565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561016c57878503603f190184528151856060810160005b60038110156101575788820383528351805180845260005b81811015610126578281018d01518582018e01528c0161010b565b818111156101375760008d83870101525b50948b0194938b0193601f01601f1916929092018a0191506001016100f3565b509650505092850192908501906001016100d8565b509297965050505050505056fea26469706673582212202990c55b0454b2fd8c3dbbb2c53864292fb42554ad4845ec1e100d6d84ac4da164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[3][] memory) {\n string[3][] memory r = new string[3][](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-string[3][1]", + "type": "string[3][1]", + "value": [ + [ + "Moo é🚀M oMM🚀 🚀🚀oéoMMMé 🚀o MMM Mé 🚀🚀oooMéoooo o🚀oéoo éM", + "Moo é🚀", + "Moo é🚀o🚀 o oé é🚀é🚀 é🚀🚀🚀o éoMMoMM oM🚀éooéé🚀oo" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M oMM🚀 🚀🚀oéoMMMé 🚀o MMM Mé 🚀🚀oooMéoooo o🚀oéoo éM" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀 o oé é🚀é🚀 é🚀🚀🚀o éoMMoMM oM🚀éooéé🚀oo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102c2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012d565b60405180910390f35b6100566100d9565b61005e6100d9565b610066610106565b60006040518060800160405280605581526020016101e76055913982525060408051808201909152600a8152689adede418753e13f3560b71b602082015280826001602002018190525050600060405180608001604052806051815260200161023c605191396040830152508152919050565b60405180602001604052806001905b6100f0610106565b8152602001906001900390816100e85790505090565b60405180606001604052806003905b60608152602001906001900390816101155790505090565b60208082526000906040830183820185845b600180821061014e57506101da565b601f19888603810185528351866060810160005b60038110156101c35789820383528351805180845260005b81811015610195578281018e01518582018f01528d0161017a565b818111156101a65760008e83870101525b50948c0194938c0193601f018616929092018b0191508501610162565b50975050509386019350509084019060010161013f565b5091969550505050505056fe4d6f6f20c3a9f09f9a804d206f4d4df09f9a8020f09f9a80f09f9a806fc3a96f4d4d4dc3a920f09f9a806f204d4d4d204dc3a920f09f9a80f09f9a806f6f6f4dc3a96f6f6f6f206ff09f9a806fc3a96f6f20c3a94d4d6f6f20c3a9f09f9a806ff09f9a80206f206fc3a92020c3a9f09f9a80c3a9f09f9a8020c3a9f09f9a80f09f9a80f09f9a806f20c3a96f4d4d6f4d4d206f4df09f9a80c3a96f6fc3a9c3a9f09f9a806f6fa2646970667358221220d0afc62b8a5a6d02aa7240f7fd6524ad6902477b445f815fb656d707c310e75064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[3][1] memory) {\n string[3][1] memory r;\n {\n string[3] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀M oMM🚀 🚀🚀oéoMMMé 🚀o MMM Mé 🚀🚀oooMéoooo o🚀oéoo éM\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀\";\n r_0[1] = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀o🚀 o oé é🚀é🚀 é🚀🚀🚀o éoMMoMM oM🚀éooéé🚀oo\";\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a804d206f4d4df09f9a8020f09f9a80f09f9a806fc3a96f4d4d4dc3a920f09f9a806f204d4d4d204dc3a920f09f9a80f09f9a806f6f6f4dc3a96f6f6f6f206ff09f9a806fc3a96f6f20c3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a806ff09f9a80206f206fc3a92020c3a9f09f9a80c3a9f09f9a8020c3a9f09f9a80f09f9a80f09f9a806f20c3a96f4d4d6f4d4d206f4df09f9a80c3a96f6fc3a9c3a9f09f9a806f6f000000000000000000000000000000" + }, + { + "name": "random-string[3][3]", + "type": "string[3][3]", + "value": [ + [ + "Moo é🚀o🚀ooo 🚀éoé🚀 M🚀ééo oM🚀ooo é🚀🚀oééo", + "Moo é🚀ooéMo🚀o 🚀é o 🚀oééé🚀oéooo é", + "Moo é🚀oé oé " + ], + [ + "Moo é🚀o oééMM🚀oMéMoMMé🚀ooéMéooo🚀éMéoM éooM Mo Moo🚀 🚀", + "Moo é🚀oooMooo 🚀oé🚀MooM 🚀 ", + "Moo é🚀" + ], + [ + "Moo é🚀oo oé🚀 oMo oooo ééo éo", + "Moo é🚀ooéo🚀 M éoéoMMMooéé M🚀🚀Mo🚀é oooééo🚀oo🚀🚀oo🚀M ééé🚀o🚀oMoéM", + "Moo é🚀 oMoo🚀🚀éo ooo M" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀ooo 🚀éoé🚀 M🚀ééo oM🚀ooo é🚀🚀oééo" + }, + { + "type": "string", + "value": "Moo é🚀ooéMo🚀o 🚀é o 🚀oééé🚀oéooo é" + }, + { + "type": "string", + "value": "Moo é🚀oé oé " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oééMM🚀oMéMoMMé🚀ooéMéooo🚀éMéoM éooM Mo Moo🚀 🚀" + }, + { + "type": "string", + "value": "Moo é🚀oooMooo 🚀oé🚀MooM 🚀 " + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo oé🚀 oMo oooo ééo éo" + }, + { + "type": "string", + "value": "Moo é🚀ooéo🚀 M éoéoMMMooéé M🚀🚀Mo🚀é oooééo🚀oo🚀🚀oo🚀M ééé🚀o🚀oMoéM" + }, + { + "type": "string", + "value": "Moo é🚀 oMoo🚀🚀éo ooo M" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104ab806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610234565b60405180910390f35b6100566101e0565b61005e6101e0565b61006661020d565b60006040518060800160405280604681526020016104306046913982525060408051606081019091526037808252600091906102ee60208301396020838101919091526040805180820182526013815272026b7b79061d4f84fcd4037e1d4901037e1d49606d1b928101929092528301525081526100e261020d565b60006040518060800160405280605181526020016103df6051913982525060408051606081019091526027808252600091906103b86020830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b81840152908401528301919091525061015661020d565b6000604051806060016040528060278152602001610325602791398252506040805160a08101909152606c8082526000919061034c60208301396020838101919091526040805180820182528281527f4d6f6f20c3a9f09f9a80206f4d6f6ff09f9a80f09f9a80c3a96f206f6f6f204d928101929092528084019190915283019190915250919050565b60405180606001604052806003905b6101f761020d565b8152602001906001900390816101ef5790505090565b60405180606001604052806003905b606081526020019060019003908161021c5790505090565b60208082526000906080830183820185845b600380821061025557506102e1565b601f19888603810185528351866060810160005b858110156102ca5789820383528351805180845260005b8181101561029b578281018e01518582018f01528d01610280565b818111156102ac5760008e83870101525b50948c0194938c0193601f018616929092018b019150600101610269565b509750505093860193505090840190600101610246565b5091969550505050505056fe4d6f6f20c3a9f09f9a806f6fc3a94d6ff09f9a806f20f09f9a80c3a9206f20f09f9a806fc3a9c3a9c3a9f09f9a806fc3a96f6f6f20c3a94d6f6f20c3a9f09f9a806f6f206fc3a9f09f9a80206f4d6f206f6f6f6f20c3a9c3a96f20c3a96f4d6f6f20c3a9f09f9a806f6fc3a96ff09f9a80204d20c3a96fc3a96f4d4d4d6f6fc3a9c3a9204df09f9a80f09f9a804d6ff09f9a80c3a9206f6f6fc3a9c3a96ff09f9a806f6ff09f9a80f09f9a806f6ff09f9a804d2020c3a9c3a9c3a9f09f9a806ff09f9a806f4d6fc3a94d4d6f6f20c3a9f09f9a806f6f6f4d6f6f6f20f09f9a806fc3a9f09f9a804d6f6f4d20f09f9a80204d6f6f20c3a9f09f9a806f20206fc3a9c3a94d4df09f9a806f4dc3a94d6f4d4dc3a9f09f9a806f6fc3a94dc3a96f6f6ff09f9a80c3a94dc3a96f4d20c3a96f6f4d204d6f204d6f6ff09f9a8020f09f9a804d6f6f20c3a9f09f9a806ff09f9a806f6f6f20f09f9a80c3a96fc3a9f09f9a80204df09f9a80c3a9c3a96f206f4df09f9a806f6f6f20c3a9f09f9a80f09f9a806fc3a9c3a96fa264697066735822122065e8b4940d495d3481c1cca7476ef5d21158f7a20c83df49762a715e3ac1ad7664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[3][3] memory) {\n string[3][3] memory r;\n {\n string[3] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀o🚀ooo 🚀éoé🚀 M🚀ééo oM🚀ooo é🚀🚀oééo\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀ooéMo🚀o 🚀é o 🚀oééé🚀oéooo é\";\n r_0[1] = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀oé oé \";\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n string[3] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀o oééMM🚀oMéMoMMé🚀ooéMéooo🚀éMéoM éooM Mo Moo🚀 🚀\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oooMooo 🚀oé🚀MooM 🚀 \";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀\";\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n string[3] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀oo oé🚀 oMo oooo ééo éo\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀ooéo🚀 M éoéoMMMooéé M🚀🚀Mo🚀é oooééo🚀oo🚀🚀oo🚀M ééé🚀o🚀oMoéM\";\n r_2[1] = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀 oMoo🚀🚀éo ooo M\";\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a806ff09f9a806f6f6f20f09f9a80c3a96fc3a9f09f9a80204df09f9a80c3a9c3a96f206f4df09f9a806f6f6f20c3a9f09f9a80f09f9a806fc3a9c3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a806f6fc3a94d6ff09f9a806f20f09f9a80c3a9206f20f09f9a806fc3a9c3a9c3a9f09f9a806fc3a96f6f6f20c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806fc3a920206fc3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a806f20206fc3a9c3a94d4df09f9a806f4dc3a94d6f4d4dc3a9f09f9a806f6fc3a94dc3a96f6f6ff09f9a80c3a94dc3a96f4d20c3a96f6f4d204d6f204d6f6ff09f9a8020f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806f6f6f4d6f6f6f20f09f9a806fc3a9f09f9a804d6f6f4d20f09f9a802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806f6f206fc3a9f09f9a80206f4d6f206f6f6f6f20c3a9c3a96f20c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c4d6f6f20c3a9f09f9a806f6fc3a96ff09f9a80204d20c3a96fc3a96f4d4d4d6f6fc3a9c3a9204df09f9a80f09f9a804d6ff09f9a80c3a9206f6f6fc3a9c3a96ff09f9a806f6ff09f9a80f09f9a806f6ff09f9a804d2020c3a9c3a9c3a9f09f9a806ff09f9a806f4d6fc3a94d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a80206f4d6f6ff09f9a80f09f9a80c3a96f206f6f6f204d" + }, + { + "name": "random-string[4][1]", + "type": "string[4][1]", + "value": [ + [ + "Moo é🚀 o🚀 🚀oé🚀M🚀oooé Mo 🚀o oo M éoooé", + "Moo é🚀ooooooééoMooMéM🚀🚀 éoo Mé🚀éMoo🚀M🚀🚀o🚀Méo", + "Moo é🚀o🚀🚀 o 🚀o🚀ooMooM🚀🚀oééé🚀 o ééM🚀", + "Moo é🚀oo🚀🚀Moéo🚀" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o🚀 🚀oé🚀M🚀oooé Mo 🚀o oo M éoooé" + }, + { + "type": "string", + "value": "Moo é🚀ooooooééoMooMéM🚀🚀 éoo Mé🚀éMoo🚀M🚀🚀o🚀Méo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀 o 🚀o🚀ooMooM🚀🚀oééé🚀 o ééM🚀" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀🚀Moéo🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610322806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610166565b60405180910390f35b610056610112565b61005e610112565b61006661013f565b60006040518060600160405280603c81526020016102b1603c91398252506040805160808101909152604c8082526000919061026560208301399050808260016020020181905250506000604051806080016040528060458152602001610220604591396040838101919091528051808201909152601d81527f4d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a804d6fc3a96ff09f9a8000000060208201526060830152508152919050565b60405180602001604052806001905b61012961013f565b8152602001906001900390816101215790505090565b60405180608001604052806004905b606081526020019060019003908161014e5790505090565b60208082526000906040830183820185845b60018082106101875750610213565b601f19888603810185528351866080810160005b60048110156101fc5789820383528351805180845260005b818110156101ce578281018e01518582018f01528d016101b3565b818111156101df5760008e83870101525b50948c0194938c0193601f018616929092018b019150850161019b565b509750505093860193505090840190600101610178565b5091969550505050505056fe4d6f6f20c3a9f09f9a806ff09f9a80f09f9a8020206f20f09f9a806ff09f9a806f6f4d6f6f4df09f9a80f09f9a806fc3a9c3a9c3a9f09f9a80206f20c3a9c3a94df09f9a804d6f6f20c3a9f09f9a806f6f6f6f6f6fc3a9c3a96f4d6f6f4dc3a94df09f9a80f09f9a8020c3a96f6f204dc3a9f09f9a80c3a94d6f6ff09f9a804df09f9a80f09f9a806ff09f9a804dc3a96f4d6f6f20c3a9f09f9a80206ff09f9a8020f09f9a806fc3a9f09f9a804df09f9a806f6f6fc3a9204d6f20f09f9a806f206f6f204d20c3a96f6f6fc3a9a2646970667358221220e849c9742e9e53fc2470459125d7a76534e8acbd990317e6b761a688413b1d9f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[4][1] memory) {\n string[4][1] memory r;\n {\n string[4] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 o🚀 🚀oé🚀M🚀oooé Mo 🚀o oo M éoooé\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀ooooooééoMooMéM🚀🚀 éoo Mé🚀éMoo🚀M🚀🚀o🚀Méo\";\n r_0[1] = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀o🚀🚀 o 🚀o🚀ooMooM🚀🚀oééé🚀 o ééM🚀\";\n r_0[2] = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀oo🚀🚀Moéo🚀\";\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a80206ff09f9a8020f09f9a806fc3a9f09f9a804df09f9a806f6f6fc3a9204d6f20f09f9a806f206f6f204d20c3a96f6f6fc3a900000000000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806f6f6f6f6f6fc3a9c3a96f4d6f6f4dc3a94df09f9a80f09f9a8020c3a96f6f204dc3a9f09f9a80c3a94d6f6ff09f9a804df09f9a80f09f9a806ff09f9a804dc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a806ff09f9a80f09f9a8020206f20f09f9a806ff09f9a806f6f4d6f6f4df09f9a80f09f9a806fc3a9c3a9c3a9f09f9a80206f20c3a9c3a94df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a804d6fc3a96ff09f9a80000000" + }, + { + "name": "random-uint[3][1]", + "type": "uint[3][1]", + "value": [ + [ + "40798607819321612597785029106880900573382461284920520503481689025581630761060", + "65228396324704908783622570033989090741607829272185385760219019355724449719779", + "26247818038887731535716684597345320081431200659065462250501004684156921748879" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "40798607819321612597785029106880900573382461284920520503481689025581630761060" + }, + { + "type": "number", + "value": "65228396324704908783622570033989090741607829272185385760219019355724449719779" + }, + { + "type": "number", + "value": "26247818038887731535716684597345320081431200659065462250501004684156921748879" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101bd806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610127565b60405180910390f35b6100566100dc565b61005e6100dc565b610066610109565b7f5a333196a10dc7603a7b6d86aa392b5019203fcf0ebcdd71517925456186286481527f9035f6c87881433e887bc25934819ab2d679249e6f767f3cffbd3823aebe25e360208201527f3a07bd111ea2726d4c4b6e4c4abb6e8bd30dd812b465a46831dca59b7a589d8f60408201528152919050565b60405180602001604052806001905b6100f3610109565b8152602001906001900390816100eb5790505090565b60405180606001604052806003906020820280368337509192915050565b60608181019082846000805b6001808210610142575061017c565b835185845b60038110156101655782518252602092830192909101908301610147565b505050938501935060209290920191600101610133565b50505050509291505056fea264697066735822122014b841c1b802ad0e8aabfd1a0ef1f94b2f28e98936c6985bdc1c5c8680dae34b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint256[3][1] memory) {\n uint256[3][1] memory r;\n {\n uint256[3] memory r_0;\n {\n uint r_0_0 = 40798607819321612597785029106880900573382461284920520503481689025581630761060;\n r_0[0] = r_0_0;\n }\n {\n uint r_0_1 = 65228396324704908783622570033989090741607829272185385760219019355724449719779;\n r_0[1] = r_0_1;\n }\n {\n uint r_0_2 = 26247818038887731535716684597345320081431200659065462250501004684156921748879;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x5a333196a10dc7603a7b6d86aa392b5019203fcf0ebcdd7151792545618628649035f6c87881433e887bc25934819ab2d679249e6f767f3cffbd3823aebe25e33a07bd111ea2726d4c4b6e4c4abb6e8bd30dd812b465a46831dca59b7a589d8f" + }, + { + "name": "random-uint128[][2]", + "type": "uint128[][2]", + "value": [ + [ + "77437962519124088402852799267646195815", + "286178840942263408423685796873182422486", + "104915009451835628669973945002930912617", + "155180540277567947348667431072616532716" + ], + [] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "77437962519124088402852799267646195815" + }, + { + "type": "number", + "value": "286178840942263408423685796873182422486" + }, + { + "type": "number", + "value": "104915009451835628669973945002930912617" + }, + { + "type": "number", + "value": "155180540277567947348667431072616532716" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102ac806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e2565b60405180910390f35b6100566101bb565b61005e6101bb565b60408051600480825260a082019092526000916020820160808036833701905050905060006f3a420253618376255f1ceb469acbc867905080826000815181106100aa576100aa610260565b60200260200101906001600160801b031690816001600160801b0316815250505060006fd74c0a385540ebfe48855887e258a5d6905080826001815181106100f4576100f4610260565b60200260200101906001600160801b031690816001600160801b0316815250505060006f4eede5553d381565b045998f964abd699050808260028151811061013e5761013e610260565b60200260200101906001600160801b031690816001600160801b0316815250505060006f74beaf579de4701c78cf3041f02dcaec9050808260038151811061018857610188610260565b6001600160801b039290921660209283029190910182015291835250604080516000815280830190915290820152919050565b60405180604001604052806002905b60608152602001906001900390816101ca5790505090565b6020808252600090606083018382018584805b600281101561025357878503601f19018452825180518087529087019087870190845b8181101561023d5783516001600160801b031683529289019291890191600101610218565b50909650505092850192918501916001016101f5565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220db6ed5892345ade9b0080a9a402a3690c303dd2c6572c8b0008f36ac8068f1c964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint128[][2] memory) {\n uint128[][2] memory r;\n {\n uint128[] memory r_0 = new uint128[](4);\n {\n uint128 r_0_0 = 77437962519124088402852799267646195815;\n r_0[0] = r_0_0;\n }\n {\n uint128 r_0_1 = 286178840942263408423685796873182422486;\n r_0[1] = r_0_1;\n }\n {\n uint128 r_0_2 = 104915009451835628669973945002930912617;\n r_0[2] = r_0_2;\n }\n {\n uint128 r_0_3 = 155180540277567947348667431072616532716;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n uint128[] memory r_1 = new uint128[](0);\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000003a420253618376255f1ceb469acbc86700000000000000000000000000000000d74c0a385540ebfe48855887e258a5d6000000000000000000000000000000004eede5553d381565b045998f964abd690000000000000000000000000000000074beaf579de4701c78cf3041f02dcaec0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-uint136[][3]", + "type": "uint136[][3]", + "value": [ + [ + "49657662364276864131745549676383780452517", + "33345589938175453843163279892721137675286", + "67999992352966917743280671935215134060436", + "81700705071511681112677625053117267207327" + ], + [ + "7762328707046870334531886547073890507061", + "74463726486030047054802905051271765724689", + "85946187445295441928629131971214764243280" + ], + [ + "22601915035848424676862067806609405590049", + "1081482639665916920507080097976953765158", + "38752211489554588119231270147590651547987" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "49657662364276864131745549676383780452517" + }, + { + "type": "number", + "value": "33345589938175453843163279892721137675286" + }, + { + "type": "number", + "value": "67999992352966917743280671935215134060436" + }, + { + "type": "number", + "value": "81700705071511681112677625053117267207327" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "7762328707046870334531886547073890507061" + }, + { + "type": "number", + "value": "74463726486030047054802905051271765724689" + }, + { + "type": "number", + "value": "85946187445295441928629131971214764243280" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "22601915035848424676862067806609405590049" + }, + { + "type": "number", + "value": "1081482639665916920507080097976953765158" + }, + { + "type": "number", + "value": "38752211489554588119231270147590651547987" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104a6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103dc565b60405180910390f35b6100566103b5565b61005e6103b5565b60408051600480825260a082019092526000916020820160808036833701905050905060007091ee45e43d7c2cf7807142d3fdca8bb8a5905080826000815181106100ab576100ab61045a565b60200260200101906001600160881b031690816001600160881b0316815250505060007061fe6f047c1fc024e317d5ef6b152cec16905080826001815181106100f6576100f661045a565b60200260200101906001600160881b031690816001600160881b03168152505050600070c7d58226295574b2666da19819fee42f94905080826002815181106101415761014161045a565b60200260200101906001600160881b031690816001600160881b03168152505050600070f018c76ffe85971be6873bf0a0ceea649f9050808260038151811061018c5761018c61045a565b6001600160881b0392909216602092830291909101909101525081526040805160038082526080820190925260009181602001602082028036833701905050905060007016cfba21276cb5832fd253550c1713d935905080826000815181106101f7576101f761045a565b60200260200101906001600160881b031690816001600160881b03168152505050600070dad4480f9e64554b4443e098aac1248e11905080826001815181106102425761024261045a565b60200260200101906001600160881b031690816001600160881b03168152505050600070fc92b999c63f9461dc4f250d791e4d79509050808260028151811061028d5761028d61045a565b6001600160881b03929092166020928302919091018201528301919091525060408051600380825260808201909252600091816020016020820280368337019050509050600070426bca7f2e864a6223d1a5efd5ec433a21905080826000815181106102fb576102fb61045a565b60200260200101906001600160881b031690816001600160881b03168152505050600070032d9dfae1b8fe76a642bf3528959a7d26905080826001815181106103465761034661045a565b60200260200101906001600160881b031690816001600160881b0316815250505060007071e1ec73af7541395c765f2e320d529153905080826002815181106103915761039161045a565b6001600160881b039290921660209283029190910190910152506040820152919050565b60405180606001604052806003905b60608152602001906001900390816103c45790505090565b6020808252600090608083018382018584805b600381101561044d57878503601f19018452825180518087529087019087870190845b818110156104375783516001600160881b031683529289019291890191600101610412565b50909650505092850192918501916001016103ef565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212203e692246550928df19c19193601f746a27cdf261bb256acc825f40f5c147e79b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint136[][3] memory) {\n uint136[][3] memory r;\n {\n uint136[] memory r_0 = new uint136[](4);\n {\n uint136 r_0_0 = 49657662364276864131745549676383780452517;\n r_0[0] = r_0_0;\n }\n {\n uint136 r_0_1 = 33345589938175453843163279892721137675286;\n r_0[1] = r_0_1;\n }\n {\n uint136 r_0_2 = 67999992352966917743280671935215134060436;\n r_0[2] = r_0_2;\n }\n {\n uint136 r_0_3 = 81700705071511681112677625053117267207327;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n uint136[] memory r_1 = new uint136[](3);\n {\n uint136 r_1_0 = 7762328707046870334531886547073890507061;\n r_1[0] = r_1_0;\n }\n {\n uint136 r_1_1 = 74463726486030047054802905051271765724689;\n r_1[1] = r_1_1;\n }\n {\n uint136 r_1_2 = 85946187445295441928629131971214764243280;\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n uint136[] memory r_2 = new uint136[](3);\n {\n uint136 r_2_0 = 22601915035848424676862067806609405590049;\n r_2[0] = r_2_0;\n }\n {\n uint136 r_2_1 = 1081482639665916920507080097976953765158;\n r_2[1] = r_2_1;\n }\n {\n uint136 r_2_2 = 38752211489554588119231270147590651547987;\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000091ee45e43d7c2cf7807142d3fdca8bb8a500000000000000000000000000000061fe6f047c1fc024e317d5ef6b152cec16000000000000000000000000000000c7d58226295574b2666da19819fee42f94000000000000000000000000000000f018c76ffe85971be6873bf0a0ceea649f000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000016cfba21276cb5832fd253550c1713d935000000000000000000000000000000dad4480f9e64554b4443e098aac1248e11000000000000000000000000000000fc92b999c63f9461dc4f250d791e4d79500000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000426bca7f2e864a6223d1a5efd5ec433a21000000000000000000000000000000032d9dfae1b8fe76a642bf3528959a7d2600000000000000000000000000000071e1ec73af7541395c765f2e320d529153" + }, + { + "name": "random-uint184[3][1]", + "type": "uint184[3][1]", + "value": [ + [ + "4537583828221827318658656949053772817642064580053173265", + "10975405633998423542684456241833481536730287993030433321", + "19959544559516647472095718948881518630353648040802357521" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4537583828221827318658656949053772817642064580053173265" + }, + { + "type": "number", + "value": "10975405633998423542684456241833481536730287993030433321" + }, + { + "type": "number", + "value": "19959544559516647472095718948881518630353648040802357521" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ab806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010c565b60405180910390f35b6100566100c1565b61005e6100c1565b6100666100ee565b762f5fe4d8476f95a529a4861e88676d8aadfeb45e9204118152767296ad4688722a53e0bb73ff1088103a2f45e6854fda29602082015276d0632a947bf32ef9df6d9ed5bf6e67c5cba78b1061911160408201528152919050565b60405180602001604052806001905b6100d86100ee565b8152602001906001900390816100d05790505090565b60405180606001604052806003906020820280368337509192915050565b60608181019082846000805b6001808210610127575061016a565b835185845b60038110156101535782516001600160b81b0316825260209283019290910190830161012c565b505050938501935060209290920191600101610118565b50505050509291505056fea2646970667358221220c172b9454a820d5b57e23c4025d35225e2c5f1ef2085ad7b5b71499424fabf0c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint184[3][1] memory) {\n uint184[3][1] memory r;\n {\n uint184[3] memory r_0;\n {\n uint184 r_0_0 = 4537583828221827318658656949053772817642064580053173265;\n r_0[0] = r_0_0;\n }\n {\n uint184 r_0_1 = 10975405633998423542684456241833481536730287993030433321;\n r_0[1] = r_0_1;\n }\n {\n uint184 r_0_2 = 19959544559516647472095718948881518630353648040802357521;\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000002f5fe4d8476f95a529a4861e88676d8aadfeb45e9204110000000000000000007296ad4688722a53e0bb73ff1088103a2f45e6854fda29000000000000000000d0632a947bf32ef9df6d9ed5bf6e67c5cba78b10619111" + }, + { + "name": "random-uint224[4][]", + "type": "uint224[4][]", + "value": [ + [ + "22685699683398016449077420485869959077089328827375086917456685442145", + "9734869638025398545244187324850335938392974827386648501400863533863", + "5312027844237176709233991998486903991313508146408639102532826484331", + "10560531085942708147557413039615984726907209418617787424379203918052" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "22685699683398016449077420485869959077089328827375086917456685442145" + }, + { + "type": "number", + "value": "9734869638025398545244187324850335938392974827386648501400863533863" + }, + { + "type": "number", + "value": "5312027844237176709233991998486903991313508146408639102532826484331" + }, + { + "type": "number", + "value": "10560531085942708147557413039615984726907209418617787424379203918052" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610216806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610157565b60405180910390f35b60408051600180825281830190925260609160009190816020015b610071610139565b81526020019060019003908161006957905050905061008e610139565b7bd769e192666fa9fd5374b2a2533ab519564cb73b286c8bb5f4e0246181527b5c70283fa0707fe96ac8b2bc82a8b8e38cb44d3700b45e9174786b2760208201527b3270d30b0955789e2e12978270554984fe51dabf9660d100b6ccce6b60408201527b64473aa1071ed267da6c8a36fb34e6c192b4f9a198991ddce43298e46060820152815181908390600090610128576101286101ca565b602090810291909101015250919050565b60405180608001604052806004906020820280368337509192915050565b602080825282518282018190526000919084820190604085019084805b828110156101bd57845184835b60048110156101a75782516001600160e01b031682529188019190880190600101610181565b5050509385019360809390930192600101610174565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212206dff7cd2afe0be550cf9621e5646a72219686630f443033a25e2203ffeba8eb264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint224[4][] memory) {\n uint224[4][] memory r = new uint224[4][](1);\n {\n uint224[4] memory r_0;\n {\n uint224 r_0_0 = 22685699683398016449077420485869959077089328827375086917456685442145;\n r_0[0] = r_0_0;\n }\n {\n uint224 r_0_1 = 9734869638025398545244187324850335938392974827386648501400863533863;\n r_0[1] = r_0_1;\n }\n {\n uint224 r_0_2 = 5312027844237176709233991998486903991313508146408639102532826484331;\n r_0[2] = r_0_2;\n }\n {\n uint224 r_0_3 = 10560531085942708147557413039615984726907209418617787424379203918052;\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000d769e192666fa9fd5374b2a2533ab519564cb73b286c8bb5f4e02461000000005c70283fa0707fe96ac8b2bc82a8b8e38cb44d3700b45e9174786b27000000003270d30b0955789e2e12978270554984fe51dabf9660d100b6ccce6b0000000064473aa1071ed267da6c8a36fb34e6c192b4f9a198991ddce43298e4" + }, + { + "name": "random-uint24[][]", + "type": "uint24[][]", + "value": [[]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610191806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100b6565b60405180910390f35b60408051600180825281830190925260609160009190816020015b6060815260200190600190039081610069575050604080516000808252602082019092529192505080826000815181106100a5576100a5610145565b602090810291909101015250919050565b6000602080830181845280855180835260408601915060408160051b87010192508387016000805b8381101561013757888603603f19018552825180518088529088019088880190845b8181101561012157835162ffffff168352928a0192918a0191600101610100565b50909750505093860193918601916001016100de565b509398975050505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212207aa65dc693375fe67019bc36197cc7c28af35ce2e343689679e3dca9240feb8a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint24[][] memory) {\n uint24[][] memory r = new uint24[][](1);\n {\n uint24[] memory r_0 = new uint24[](0);\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-uint24[2][1]", + "type": "uint24[2][1]", + "value": [["16173355", "8576254"]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "16173355" + }, + { + "type": "number", + "value": "8576254" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610162806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100c7565b60405180910390f35b61005661007c565b61005e61007c565b6100666100a9565b62f6c92b81526282dcfe60208201528152919050565b60405180602001604052806001905b6100936100a9565b81526020019060019003908161008b5790505090565b60405180604001604052806002906020820280368337509192915050565b60408181019082846000805b60018082106100e25750610121565b835185845b600281101561010a57825162ffffff1682526020928301929091019083016100e7565b5050509385019350602092909201916001016100d3565b50505050509291505056fea26469706673582212206de12f268455ebb5842244f801c7590153449c0bf9ee62d39fd8f59f7172fa2e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint24[2][1] memory) {\n uint24[2][1] memory r;\n {\n uint24[2] memory r_0;\n {\n uint24 r_0_0 = 16173355;\n r_0[0] = r_0_0;\n }\n {\n uint24 r_0_1 = 8576254;\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000f6c92b000000000000000000000000000000000000000000000000000000000082dcfe" + }, + { + "name": "random-((bool),string,address,string)", + "type": "((bool),string,address,string)", + "value": [ + [true], + "Moo é🚀", + "0xe23b5f13D3b44f1f7b3e9509E0E6A6E86a82bad5", + "Moo é🚀éoo🚀🚀Moé🚀M🚀 oM🚀M M" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0xe23b5f13D3b44f1f7b3e9509E0E6A6E86a82bad5" + }, + { + "type": "string", + "value": "Moo é🚀éoo🚀🚀Moé🚀M🚀 oM🚀M M" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610224806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061015c565b60405180910390f35b6040805160a081018252600060808201818152825260606020830181905292820152818101919091526040805160a0810182526000608082018181528252606060208301819052928201528181019190915260408051602080820183526001825290835281518083018352600a8152689adede418753e13f3560b71b818301528382015273e23b5f13d3b44f1f7b3e9509e0e6a6e86a82bad583830152815160608101909252602d808352600092916101c290830139606083015250919050565b6000815180845260005b8181101561013557602081850181015186830182015201610119565b81811115610147576000602083870101525b50601f01601f19169290920160200192915050565b6020815281515115156020820152600060208301516080604084015261018560a084018261010f565b60408501516001600160a01b0316606085810191909152850151848203601f190160808601529091506101b8828261010f565b9594505050505056fe4d6f6f20c3a9f09f9a80c3a96f6ff09f9a80f09f9a804d6fc3a9f09f9a804df09f9a80206f4df09f9a804d204da26469706673582212205bc41d41a56aefefacda1ffc80f0ee16ca7cbc5629991e16a85fac8cc4b046b664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_fd0486c8 {\n S_c1053bda s_0;\n string s_1;\n address s_2;\n string s_3;\n }\n\n function test () public pure returns (S_fd0486c8 memory) {\n S_fd0486c8 memory r;\n {\n S_c1053bda memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xe23b5f13D3b44f1f7b3e9509E0E6A6E86a82bad5;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀éoo🚀🚀Moé🚀M🚀 oM🚀M M\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e23b5f13d3b44f1f7b3e9509e0e6a6e86a82bad500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80c3a96f6ff09f9a80f09f9a804d6fc3a9f09f9a804df09f9a80206f4df09f9a804d204d00000000000000000000000000000000000000" + }, + { + "name": "random-((bytes12,string,bool,bool))", + "type": "((bytes12,string,bool,bool))", + "value": [ + [ + "0x9907cb97b5c306dc697b7932", + "Moo é🚀ooé MMo🚀oMoM🚀oo🚀o ooo oMMooM🚀oo", + false, + false + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9907cb97b5c306dc697b7932" + }, + { + "type": "string", + "value": "Moo é🚀ooé MMo🚀oMoM🚀oo🚀o ooo oMMooM🚀oo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061020d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610107565b60405180910390f35b6040805160a081018252600060208201818152606093830184905292820181905260808201529081526040805160a08101825260006020820181815260609383018490529282018190526080820152908152604080516080810182526060602080830182905260008385018190528284018190526b4c83e5cbdae1836e34bdbc9960a11b845284519283019094526037808352929392906101a19083013960208301525060006040820181905260608201528152919050565b60006020808352835181828501526bffffffffffffffffffffffff60a01b8151166040850152818101516080606086015280518060c087015260005b8181101561015f5782810185015187820160e001528401610143565b8181111561017157600060e083890101525b50604083015115156080870152606090920151151560a086015250601f01601f191690920160e001939250505056fe4d6f6f20c3a9f09f9a806f6fc3a9204d4d6ff09f9a806f4d6f4df09f9a806f6ff09f9a806f206f6f6f20206f4d4d6f6f4df09f9a806f6fa2646970667358221220c940d4960d3f625e8c44268197fe77b7caa7ef7733ac4ae00958496e6caba9e564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1427f51b {\n bytes12 s_0;\n string s_1;\n bool s_2;\n bool s_3;\n }\n\n struct S_bc4376ed {\n S_1427f51b s_0;\n }\n\n function test () public pure returns (S_bc4376ed memory) {\n S_bc4376ed memory r;\n {\n S_1427f51b memory r_0;\n {\n bytes12 r_0_0 = bytes12(0x9907cb97b5c306dc697b7932);\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀ooé MMo🚀oMoM🚀oo🚀o ooo oMMooM🚀oo\";\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000209907cb97b5c306dc697b7932000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a806f6fc3a9204d4d6ff09f9a806f4d6f4df09f9a806f6ff09f9a806f206f6f6f20206f4d4d6f6f4df09f9a806f6f000000000000000000" + }, + { + "name": "random-((bytes14,bytes16[2],string))", + "type": "((bytes14,bytes16[2],string))", + "value": [ + [ + "0x578272075d4767d5b5a6e2b04f63", + ["0xe4ed6e57589e3b0ed22977972da8d26f", "0x077f02d8568cdd880840f3a336b7e879"], + "Moo é🚀oooMoéé é éoM 🚀é é oo🚀oMooM🚀M🚀oMé M🚀" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x578272075d4767d5b5a6e2b04f63" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe4ed6e57589e3b0ed22977972da8d26f" + }, + { + "type": "hexstring", + "value": "0x077f02d8568cdd880840f3a336b7e879" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oooMoéé é éoM 🚀é é oo🚀oMooM🚀M🚀oMé M🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610280806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610141565b60405180910390f35b6100566100e3565b61005e6100e3565b6100666100fb565b6d578272075d4767d5b5a6e2b04f6360901b8152610082610123565b6fe4ed6e57589e3b0ed22977972da8d26f60801b81526f077f02d8568cdd880840f3a336b7e87960801b6020808301919091528281019190915260408051608081019091526045808252600092610206908301396040830152508152919050565b60405180602001604052806100f66100fb565b905290565b60408051606081019091526000815260208101610116610123565b8152602001606081525090565b60405180604001604052806002906020820280368337509192915050565b600060208083528351818285015271ffffffffffffffffffffffffffffffffffff198151166040850152818101516060850160005b60028110156101a65782516fffffffffffffffffffffffffffffffff191682529184019190840190600101610176565b50505060400151608060a0850152805160c0850181905260005b818110156101dc5782810184015186820160e0015283016101c0565b818111156101ee57600060e083880101525b50601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806f6f6f4d6fc3a9c3a920c3a920c3a96f4d20f09f9a80c3a92020c3a9206f6ff09f9a806f4d6f6f4df09f9a804df09f9a806f4dc3a9204df09f9a80a2646970667358221220e0967c6126c05543b45ccf0c5f27ff282d49e12f9ef7b342ad9345d06a8c518f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bb8c8d36 {\n bytes14 s_0;\n bytes16[2] s_1;\n string s_2;\n }\n\n struct S_5e7567af {\n S_bb8c8d36 s_0;\n }\n\n function test () public pure returns (S_5e7567af memory) {\n S_5e7567af memory r;\n {\n S_bb8c8d36 memory r_0;\n {\n bytes14 r_0_0 = bytes14(0x578272075d4767d5b5a6e2b04f63);\n r_0.s_0 = r_0_0;\n }\n {\n bytes16[2] memory r_0_1;\n {\n bytes16 r_0_1_0 = bytes16(0xe4ed6e57589e3b0ed22977972da8d26f);\n r_0_1[0] = r_0_1_0;\n }\n {\n bytes16 r_0_1_1 = bytes16(0x077f02d8568cdd880840f3a336b7e879);\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀oooMoéé é éoM 🚀é é oo🚀oMooM🚀M🚀oMé M🚀\";\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020578272075d4767d5b5a6e2b04f63000000000000000000000000000000000000e4ed6e57589e3b0ed22977972da8d26f00000000000000000000000000000000077f02d8568cdd880840f3a336b7e87900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a806f6f6f4d6fc3a9c3a920c3a920c3a96f4d20f09f9a80c3a92020c3a9206f6ff09f9a806f4d6f6f4df09f9a804df09f9a806f4dc3a9204df09f9a80000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes23,bool,string),address)", + "type": "((bytes23,bool,string),address)", + "value": [ + [ + "0xb2a231d207a187b5956c62d93c0157b002510512ff3943", + true, + "Moo é🚀o ooo🚀🚀o🚀oMo 🚀MoM🚀o🚀oé o🚀 ooM🚀éo🚀ooéMM🚀🚀oM" + ], + "0x22018C3791E9E850221D343B4692a97ED9037b6e" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb2a231d207a187b5956c62d93c0157b002510512ff3943" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀o ooo🚀🚀o🚀oMo 🚀MoM🚀o🚀oé o🚀 ooM🚀éo🚀ooéMM🚀🚀oM" + } + ] + }, + { + "type": "address", + "value": "0x22018C3791E9E850221D343B4692a97ED9037b6e" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610249806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610120565b60405180910390f35b6040805160a081018252600091810182815260608083018490526080830152815260208101919091526040805160a081018252600091810182815260608083018490526080830152815260208101919091526040805160608082018352818301527fb2a231d207a187b5956c62d93c0157b002510512ff3943000000000000000000815260016020808301919091528251608081019093526058808452919260009290916101bc9083013960408301525081527322018c3791e9e850221d343b4692a97ed9037b6e6020820152919050565b60006020808352835160408285015268ffffffffffffffffff198151166060850152818101511515608085015260408101519050606060a085015280518060c086015260005b818110156101825782810184015186820160e001528301610166565b8181111561019457600060e083880101525b5091909401516001600160a01b03166040840152601f01601f191690910160e0019291505056fe4d6f6f20c3a9f09f9a806f206f6f6ff09f9a80f09f9a806ff09f9a806f4d6f20f09f9a804d6f4df09f9a806ff09f9a806fc3a9206ff09f9a80206f6f4df09f9a80c3a96ff09f9a806f6fc3a94d4df09f9a80f09f9a806f4da26469706673582212203a0f6685a8f3614f84d874eddf33195287127ca22fb4cce78b08edc8d24b6a3964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_752a6d84 {\n bytes23 s_0;\n bool s_1;\n string s_2;\n }\n\n struct S_73aa98d8 {\n S_752a6d84 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_73aa98d8 memory) {\n S_73aa98d8 memory r;\n {\n S_752a6d84 memory r_0;\n {\n bytes23 r_0_0 = bytes23(0xb2a231d207a187b5956c62d93c0157b002510512ff3943);\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀o ooo🚀🚀o🚀oMo 🚀MoM🚀o🚀oé o🚀 ooM🚀éo🚀ooéMM🚀🚀oM\";\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x22018C3791E9E850221D343B4692a97ED9037b6e;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000022018c3791e9e850221d343b4692a97ed9037b6eb2a231d207a187b5956c62d93c0157b002510512ff39430000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806f206f6f6ff09f9a80f09f9a806ff09f9a806f4d6f20f09f9a804d6f4df09f9a806ff09f9a806fc3a9206ff09f9a80206f6f4df09f9a80c3a96ff09f9a806f6fc3a94d4df09f9a80f09f9a806f4d0000000000000000" + }, + { + "name": "random-((string,bool,string,bytes32))", + "type": "((string,bool,string,bytes32))", + "value": [ + [ + "Moo é🚀o🚀M MéoéééM MM ", + true, + "Moo é🚀é🚀o oMo o🚀MMooéoé🚀o 🚀🚀Mé ", + "0xbbfd5f5e2da8f7d077822402c19c4be3f55e03dd80168760cb3c84cd1c931903" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀M MéoéééM MM " + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀é🚀o oMo o🚀MMooéoé🚀o 🚀🚀Mé " + }, + { + "type": "hexstring", + "value": "0xbbfd5f5e2da8f7d077822402c19c4be3f55e03dd80168760cb3c84cd1c931903" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610270806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017d565b60405180910390f35b6040805160a0808201835260606020808401828152600085870181905283860184905260808087018290529186528651948501875284830184815285880182905285850185905285830182905285528651918201875283825281830181905281870184905281840181905286519384019096526021808452949593949093929161021a908301398252506001602080830191909152604080516060810190915260378082526000926101e3908301396040830152507fbbfd5f5e2da8f7d077822402c19c4be3f55e03dd80168760cb3c84cd1c93190360608201528152919050565b6000815180845260005b818110156101565760208185018101518683018201520161013a565b81811115610168576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516020808401528051608060408501526101a160c0850182610130565b90506020820151151560608501526040820151603f198583030160808601526101ca8282610130565b915050606082015160a085015280925050509291505056fe4d6f6f20c3a9f09f9a80c3a9f09f9a806f206f4d6f20206ff09f9a804d4d6f6fc3a96fc3a9f09f9a806f20f09f9a80f09f9a804dc3a9204d6f6f20c3a9f09f9a806ff09f9a804d204dc3a96fc3a9c3a9c3a94d20204d4d20a26469706673582212201e100affc880383c9b7b360c19b392d71023fbfa2218127bdc96590dfc228a2864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2f803c24 {\n string s_0;\n bool s_1;\n string s_2;\n bytes32 s_3;\n }\n\n struct S_6d445483 {\n S_2f803c24 s_0;\n }\n\n function test () public pure returns (S_6d445483 memory) {\n S_6d445483 memory r;\n {\n S_2f803c24 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀o🚀M MéoéééM MM \";\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀é🚀o oMo o🚀MMooéoé🚀o 🚀🚀Mé \";\n r_0.s_2 = r_0_2;\n }\n {\n bytes32 r_0_3 = bytes32(0xbbfd5f5e2da8f7d077822402c19c4be3f55e03dd80168760cb3c84cd1c931903);\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0bbfd5f5e2da8f7d077822402c19c4be3f55e03dd80168760cb3c84cd1c93190300000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a806ff09f9a804d204dc3a96fc3a9c3a9c3a94d20204d4d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80c3a9f09f9a806f206f4d6f20206ff09f9a804d4d6f6fc3a96fc3a9f09f9a806f20f09f9a80f09f9a804dc3a920000000000000000000" + }, + { + "name": "random-((string,bytes22),bool)[]", + "type": "((string,bytes22),bool)[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ae806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100a6565b60405180910390f35b60408051600080825260208201909252606091908161009f565b6040805160808101825260609181018281526000928201839052815260208101919091528152602001906001900390816100685790505b5092915050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561016957603f198a8503018652825180518886528051898a8801528051806080890152855b81811015610113578281018d015189820160a001528c016100f7565b81811115610124578660a0838b0101525b508b83015169ffffffffffffffffffff19166060890152928b0151801515888d015292988b0198601f01601f19169690960160a00195505050918701916001016100ce565b5091999850505050505050505056fea264697066735822122027cd79cc2c32df8ff56978ecb60b79873d3f92d15032466642f8199ef1171e2064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d32d9d87 {\n string s_0;\n bytes22 s_1;\n }\n\n struct S_e5c182a3 {\n S_d32d9d87 s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_e5c182a3[] memory) {\n S_e5c182a3[] memory r = new S_e5c182a3[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((uint,uint56,string)[1])", + "type": "((uint,uint56,string)[1])", + "value": [ + [ + [ + "113935195093937024167708208857267947740012715172719660231999025721166867011022", + "34890390939203934", + "Moo é🚀 éo oooé🚀🚀éoooMéo 🚀" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "113935195093937024167708208857267947740012715172719660231999025721166867011022" + }, + { + "type": "number", + "value": "34890390939203934" + }, + { + "type": "string", + "value": "Moo é🚀 éo oooé🚀🚀éoooMéo 🚀" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610246806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012d565b60405180910390f35b6100566100d4565b61005e6100d4565b6100666100ec565b60408051606080820183528183018190527ffbe5090038d6a5fce412eaa3e395dfbc4ee708f5b3ea7206884f8ea59bed15ce8252667bf4a02e01795e6020808401919091528351918201909352602a8082529192600092906101e79083013960408301525081528152919050565b60405180602001604052806100e76100ec565b905290565b60405180602001604052806001905b604080516060808201835260008083526020830152918101919091528152602001906001900390816100fb5790505090565b602080825282518282018290526000919060409060609082860182870186805b60018110156101d757898303603f190184528451805184528881015166ffffffffffffff16898501528701518784018790528051878501819052835b818110156101a5578281018b0151868201608001528a01610189565b818111156101b65784608083880101525b509589019594890194601f01601f191693909301608001925060010161014d565b5090999850505050505050505056fe4d6f6f20c3a9f09f9a8020c3a96f206f6f6fc3a9f09f9a80f09f9a80c3a96f6f6f4dc3a96f20f09f9a80a26469706673582212206f71d9fdee2bdb0d6e974cebbef8f14101b9df9ff62b71fe70feeb7f3f758a4664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_42eba8ba {\n uint256 s_0;\n uint56 s_1;\n string s_2;\n }\n\n struct S_43c1f29e {\n S_42eba8ba[1] s_0;\n }\n\n function test () public pure returns (S_43c1f29e memory) {\n S_43c1f29e memory r;\n {\n S_42eba8ba[1] memory r_0;\n {\n S_42eba8ba memory r_0_0;\n {\n uint r_0_0_0 = 113935195093937024167708208857267947740012715172719660231999025721166867011022;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n uint56 r_0_0_1 = 34890390939203934;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀 éo oooé🚀🚀éoooMéo 🚀\";\n r_0_0.s_2 = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fbe5090038d6a5fce412eaa3e395dfbc4ee708f5b3ea7206884f8ea59bed15ce000000000000000000000000000000000000000000000000007bf4a02e01795e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a8020c3a96f206f6f6fc3a9f09f9a80f09f9a80c3a96f6f6f4dc3a96f20f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,address,address,address)", + "type": "(address,address,address,address)", + "value": [ + "0x5BF7e2ddf1E0F068b436384b15d65eD7E9294250", + "0x3d735DdCFa030f10e97aDC399e6806eD58f3Ac3e", + "0x7B5B30215c9ECdD6Ef83eDe30a99c1811b0dD019", + "0x61ace60036fD45482339d58D0817DB186140F93e" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5BF7e2ddf1E0F068b436384b15d65eD7E9294250" + }, + { + "type": "address", + "value": "0x3d735DdCFa030f10e97aDC399e6806eD58f3Ac3e" + }, + { + "type": "address", + "value": "0x7B5B30215c9ECdD6Ef83eDe30a99c1811b0dD019" + }, + { + "type": "address", + "value": "0x61ace60036fD45482339d58D0817DB186140F93e" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101308061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051608080820183526000808352602080840182905283850182905260609384019190915283518083018552735bf7e2ddf1e0f068b436384b15d65ed7e9294250808252733d735ddcfa030f10e97adc399e6806ed58f3ac3e828401908152737b5b30215c9ecdd6ef83ede30a99c1811b0dd0198388019081527361ace60036fd45482339d58d0817db186140f93e938701938452875192835290516001600160a01b0390811694830194909452518316958101959095525116918301919091520160405180910390f3fea26469706673582212202e1a35191ff60cadf07d6c9be48bbf169c326de0858978003e519683bdefa74764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6849b1ab {\n address s_0;\n address s_1;\n address s_2;\n address s_3;\n }\n\n function test () public pure returns (S_6849b1ab memory) {\n S_6849b1ab memory r;\n {\n address r_0 = 0x5BF7e2ddf1E0F068b436384b15d65eD7E9294250;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x3d735DdCFa030f10e97aDC399e6806eD58f3Ac3e;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x7B5B30215c9ECdD6Ef83eDe30a99c1811b0dD019;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x61ace60036fD45482339d58D0817DB186140F93e;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000005bf7e2ddf1e0f068b436384b15d65ed7e92942500000000000000000000000003d735ddcfa030f10e97adc399e6806ed58f3ac3e0000000000000000000000007b5b30215c9ecdd6ef83ede30a99c1811b0dd01900000000000000000000000061ace60036fd45482339d58d0817db186140f93e" + }, + { + "name": "random-(address,address,string,bool)", + "type": "(address,address,string,bool)", + "value": [ + "0xD88FDE87db4Dd684Fda27E163Bf82b7B2015380d", + "0xDe67e9ec49bC924C30f0465a9207FDE01F12A854", + "Moo é🚀MM 🚀o🚀oM🚀oMooééooéMéo🚀é oMéo🚀o ooéMoéé o🚀o", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD88FDE87db4Dd684Fda27E163Bf82b7B2015380d" + }, + { + "type": "address", + "value": "0xDe67e9ec49bC924C30f0465a9207FDE01F12A854" + }, + { + "type": "string", + "value": "Moo é🚀MM 🚀o🚀oM🚀oMooééooéMéo🚀é oMéo🚀o ooéMoéé o🚀o" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e4565b60405180910390f35b60408051608080820183526000808352602080840182905260608486018190528085018390528551808501875280870182905290810183905273d88fde87db4dd684fda27e163bf82b7b2015380d815273de67e9ec49bc924c30f0465a9207fde01f12a8548183015285519384019095526052808452939493919291906101729083013960408301525060016060820152919050565b6000602080835260018060a01b03808551168285015280828601511660408501525060408401516080606085015280518060a086015260005b818110156101395782810184015186820160c00152830161011d565b8181111561014b57600060c083880101525b50606086015180151560808701529250601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a804d4d20f09f9a806ff09f9a806f4df09f9a806f4d6f6fc3a9c3a96f6fc3a94dc3a96ff09f9a80c3a92020206f4dc3a96ff09f9a806f20206f6fc3a94d6fc3a9c3a9206ff09f9a806fa26469706673582212202e2e92327d4e76fd26b8b9eb547d57772ed05dfd0aadf3db16f6a5458ff3996d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_00e15ec9 {\n address s_0;\n address s_1;\n string s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_00e15ec9 memory) {\n S_00e15ec9 memory r;\n {\n address r_0 = 0xD88FDE87db4Dd684Fda27E163Bf82b7B2015380d;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xDe67e9ec49bC924C30f0465a9207FDE01F12A854;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀MM 🚀o🚀oM🚀oMooééooéMéo🚀é oMéo🚀o ooéMoéé o🚀o\";\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000d88fde87db4dd684fda27e163bf82b7b2015380d000000000000000000000000de67e9ec49bc924c30f0465a9207fde01f12a8540000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a804d4d20f09f9a806ff09f9a806f4df09f9a806f4d6f6fc3a9c3a96f6fc3a94dc3a96ff09f9a80c3a92020206f4dc3a96ff09f9a806f20206f6fc3a94d6fc3a9c3a9206ff09f9a806f0000000000000000000000000000" + }, + { + "name": "random-(address,address,uint8,address)", + "type": "(address,address,uint8,address)", + "value": [ + "0x50Dae505678ab9f71CD3cd5f4c811d841D24a562", + "0x5a52a76fFe0E746c1dAA27D31750C6C88115c8b6", + "83", + "0x76d876aF753376FEa7cbc3803068bC337C1c8fa4" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x50Dae505678ab9f71CD3cd5f4c811d841D24a562" + }, + { + "type": "address", + "value": "0x5a52a76fFe0E746c1dAA27D31750C6C88115c8b6" + }, + { + "type": "number", + "value": "83" + }, + { + "type": "address", + "value": "0x76d876aF753376FEa7cbc3803068bC337C1c8fa4" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061011e8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516080808201835260008083526020808401829052838501829052606093840191909152835180830185527350dae505678ab9f71cd3cd5f4c811d841d24a562808252735a52a76ffe0e746c1daa27d31750c6c88115c8b682840190815260538388019081527376d876af753376fea7cbc3803068bc337c1c8fa4938701938452875192835290516001600160a01b03908116948301949094525160ff16958101959095525116918301919091520160405180910390f3fea26469706673582212206daad3cd91642ddd55618c1c902e882b1a885a84bae368f7fba2821c40b7acd664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_77681ad4 {\n address s_0;\n address s_1;\n uint8 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_77681ad4 memory) {\n S_77681ad4 memory r;\n {\n address r_0 = 0x50Dae505678ab9f71CD3cd5f4c811d841D24a562;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x5a52a76fFe0E746c1dAA27D31750C6C88115c8b6;\n r.s_1 = r_1;\n }\n {\n uint8 r_2 = 83;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x76d876aF753376FEa7cbc3803068bC337C1c8fa4;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000050dae505678ab9f71cd3cd5f4c811d841d24a5620000000000000000000000005a52a76ffe0e746c1daa27d31750c6c88115c8b6000000000000000000000000000000000000000000000000000000000000005300000000000000000000000076d876af753376fea7cbc3803068bc337c1c8fa4" + }, + { + "name": "random-(address,bool,bytes24,bytes12)", + "type": "(address,bool,bytes24,bytes12)", + "value": [ + "0x7342b48c91e91A52B8345Ec90429d7208c092722", + false, + "0x834d70b8c71e208294163a520fd72bd2201404dbd62378d2", + "0xe4c3262bb33c99f3844280f6" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x7342b48c91e91A52B8345Ec90429d7208c092722" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x834d70b8c71e208294163a520fd72bd2201404dbd62378d2" + }, + { + "type": "hexstring", + "value": "0xe4c3262bb33c99f3844280f6" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061012b8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516080808201835260008083526020808401829052838501829052606093840182905284518084018652808201928352737342b48c91e91a52b8345ec90429d7208c0927228082527f834d70b8c71e208294163a520fd72bd2201404dbd62378d200000000000000008288019081526b72619315d99e4cf9c221407b60a11b92870192835287519182529351151592810192909252915167ffffffffffffffff191694810194909452516001600160a01b031916918301919091520160405180910390f3fea2646970667358221220b258d7c5cfaa8bf810902fed9003b57e87750e9ab6868c39e4c40e4173d16ede64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6e661d27 {\n address s_0;\n bool s_1;\n bytes24 s_2;\n bytes12 s_3;\n }\n\n function test () public pure returns (S_6e661d27 memory) {\n S_6e661d27 memory r;\n {\n address r_0 = 0x7342b48c91e91A52B8345Ec90429d7208c092722;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n bytes24 r_2 = bytes24(0x834d70b8c71e208294163a520fd72bd2201404dbd62378d2);\n r.s_2 = r_2;\n }\n {\n bytes12 r_3 = bytes12(0xe4c3262bb33c99f3844280f6);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000007342b48c91e91a52b8345ec90429d7208c0927220000000000000000000000000000000000000000000000000000000000000000834d70b8c71e208294163a520fd72bd2201404dbd62378d20000000000000000e4c3262bb33c99f3844280f60000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bytes26,int200,int224)", + "type": "(address,bytes26,int200,int224)", + "value": [ + "0x953c96b0ab3582656049b4C3bA6Aa7A6e0626270", + "0xa7c1779fb8d04eaf3ea58d6ff7cf9c5288182e707598308ae046", + "624463661573559747678990746753958956225672355830250817356884", + "11991986327335951820696168084718317485997327090472874869450830134490" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x953c96b0ab3582656049b4C3bA6Aa7A6e0626270" + }, + { + "type": "hexstring", + "value": "0xa7c1779fb8d04eaf3ea58d6ff7cf9c5288182e707598308ae046" + }, + { + "type": "number", + "value": "624463661573559747678990746753958956225672355830250817356884" + }, + { + "type": "number", + "value": "11991986327335951820696168084718317485997327090472874869450830134490" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061014d8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160808082018352600080835260208084018290528385018290526060938401919091528351808301855273953c96b0ab3582656049b4c3ba6aa7a6e06262708082527fa7c1779fb8d04eaf3ea58d6ff7cf9c5288182e707598308ae04600000000000082840190815278637b98d5638631c19f15da19bbfd23662df97aa396116e84548388019081527b71dee769a6240144c14712e5c5c48c6e99a50de437c0e5b7ad323cda9387019384528751928352905165ffffffffffff191693820193909352915160180b8286015251601b0b9281019290925291519081900390910190f3fea264697066735822122042ed9e1279339e8e22b96e0da8adad84367d2ba1d5c3ace63d069e0282aa539d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_209f5f1c {\n address s_0;\n bytes26 s_1;\n int200 s_2;\n int224 s_3;\n }\n\n function test () public pure returns (S_209f5f1c memory) {\n S_209f5f1c memory r;\n {\n address r_0 = 0x953c96b0ab3582656049b4C3bA6Aa7A6e0626270;\n r.s_0 = r_0;\n }\n {\n bytes26 r_1 = bytes26(0xa7c1779fb8d04eaf3ea58d6ff7cf9c5288182e707598308ae046);\n r.s_1 = r_1;\n }\n {\n int200 r_2 = 624463661573559747678990746753958956225672355830250817356884;\n r.s_2 = r_2;\n }\n {\n int224 r_3 = 11991986327335951820696168084718317485997327090472874869450830134490;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000953c96b0ab3582656049b4c3ba6aa7a6e0626270a7c1779fb8d04eaf3ea58d6ff7cf9c5288182e707598308ae04600000000000000000000000000637b98d5638631c19f15da19bbfd23662df97aa396116e84540000000071dee769a6240144c14712e5c5c48c6e99a50de437c0e5b7ad323cda" + }, + { + "name": "random-(address,int56,int80,address)", + "type": "(address,int56,int80,address)", + "value": [ + "0xfaA1E9E1D3b87074a65cC8cfA00f0734EEbCEb2E", + "20696504722380892", + "336331999982851649811274", + "0xE9732D2Edd6ed271AE2d699e6796f20a142C9a9a" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xfaA1E9E1D3b87074a65cC8cfA00f0734EEbCEb2E" + }, + { + "type": "number", + "value": "20696504722380892" + }, + { + "type": "number", + "value": "336331999982851649811274" + }, + { + "type": "address", + "value": "0xE9732D2Edd6ed271AE2d699e6796f20a142C9a9a" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061011a8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160808082018352600080835260208084018290528385018290526060938401919091528351808301855273faa1e9e1d3b87074a65cc8cfa00f0734eebceb2e8082526649875c8411d85c8284019081526947389820f5189e5db34a83880190815273e9732d2edd6ed271ae2d699e6796f20a142c9a9a9387019384528751928352905160060b93820193909352915160090b82860152516001600160a01b03169281019290925291519081900390910190f3fea264697066735822122057064e9b81ddf41e7c21b52251aef9f543908c084dfa3bdbc066cffe9995f2e764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_42d68be1 {\n address s_0;\n int56 s_1;\n int80 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_42d68be1 memory) {\n S_42d68be1 memory r;\n {\n address r_0 = 0xfaA1E9E1D3b87074a65cC8cfA00f0734EEbCEb2E;\n r.s_0 = r_0;\n }\n {\n int56 r_1 = 20696504722380892;\n r.s_1 = r_1;\n }\n {\n int80 r_2 = 336331999982851649811274;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xE9732D2Edd6ed271AE2d699e6796f20a142C9a9a;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000faa1e9e1d3b87074a65cc8cfa00f0734eebceb2e0000000000000000000000000000000000000000000000000049875c8411d85c0000000000000000000000000000000000000000000047389820f5189e5db34a000000000000000000000000e9732d2edd6ed271ae2d699e6796f20a142c9a9a" + }, + { + "name": "random-(address,string,bool,address)", + "type": "(address,string,bool,address)", + "value": [ + "0x2dFdcA1F2E3e134B457Cfdb6a0E05e70b42DB8e5", + "Moo é🚀MoM M🚀M🚀oMMooooMo éooMoooo éooo🚀oo 🚀MoM", + true, + "0xc88771Aa50693440c6A08c1401647580224697C8" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2dFdcA1F2E3e134B457Cfdb6a0E05e70b42DB8e5" + }, + { + "type": "string", + "value": "Moo é🚀MoM M🚀M🚀oMMooooMo éooMoooo éooo🚀oo 🚀MoM" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xc88771Aa50693440c6A08c1401647580224697C8" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ed565b60405180910390f35b604080516080808201835260008083526060602080850182905284860183905281850183905285519384018652838101829052838601839052838201839052732dfdca1f2e3e134b457cfdb6a0e05e70b42db8e584528551918201909552603f808252939492939192909190610183908301396020830152506001604082015273c88771aa50693440c6a08c1401647580224697c86060820152919050565b6000602080835260018060a01b0384511681840152808401516080604085015280518060a086015260005b818110156101345782810184015186820160c001528301610118565b8181111561014657600060c083880101525b5060408601518015156060870152925060608601516001600160a01b03811660808701529250601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a804d6f4d204df09f9a804df09f9a806f4d4d6f6f6f6f4d6f20c3a96f6f4d6f6f6f6f20c3a96f6f6ff09f9a806f6f20f09f9a804d6f4da26469706673582212200dace405b70c710793e4b32e053274f68842f6470080b3376cd559e76909a4f464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8586db75 {\n address s_0;\n string s_1;\n bool s_2;\n address s_3;\n }\n\n function test () public pure returns (S_8586db75 memory) {\n S_8586db75 memory r;\n {\n address r_0 = 0x2dFdcA1F2E3e134B457Cfdb6a0E05e70b42DB8e5;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀MoM M🚀M🚀oMMooooMo éooMoooo éooo🚀oo 🚀MoM\";\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xc88771Aa50693440c6A08c1401647580224697C8;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000002dfdca1f2e3e134b457cfdb6a0e05e70b42db8e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c88771aa50693440c6a08c1401647580224697c8000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a804d6f4d204df09f9a804df09f9a806f4d4d6f6f6f6f4d6f20c3a96f6f4d6f6f6f6f20c3a96f6f6ff09f9a806f6f20f09f9a804d6f4d00" + }, + { + "name": "random-(address,string,string,string)", + "type": "(address,string,string,string)", + "value": [ + "0x35c27789D4f30765974aC6abe64aCb597F01897F", + "Moo é🚀ooo🚀 éMéo", + "Moo é🚀ééoooooooo🚀o o🚀o🚀oéM éé oéo ", + "Moo é🚀ééMMooo🚀🚀 🚀M🚀M oéMé 🚀o🚀🚀 oooo🚀éoM" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x35c27789D4f30765974aC6abe64aCb597F01897F" + }, + { + "type": "string", + "value": "Moo é🚀ooo🚀 éMéo" + }, + { + "type": "string", + "value": "Moo é🚀ééoooooooo🚀o o🚀o🚀oéM éé oéo " + }, + { + "type": "string", + "value": "Moo é🚀ééMMooo🚀🚀 🚀M🚀M oéMé 🚀o🚀🚀 oooo🚀éoM" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102c6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019f565b60405180910390f35b610082604051806080016040528060006001600160a01b031681526020016060815260200160608152602001606081525090565b6100b6604051806080016040528060006001600160a01b031681526020016060815260200160608152602001606081525090565b7335c27789d4f30765974ac6abe64acb597f01897f8152604080518082018252601881527f4d6f6f20c3a9f09f9a806f6f6ff09f9a8020c3a94dc3a96f00000000000000006020808301919091528084019190915281516060810190925260368083526000929161025b908301396040808401919091528051608081019091526048808252600092506102136020830139606083015250919050565b6000815180845260005b818110156101785760208185018101518683018201520161015c565b8181111561018a576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516001600160a01b031682820152820151608060408301526000906101cd60a0840182610152565b90506040840151601f19808584030160608601526101eb8383610152565b92506060860151915080858403016080860152506102098282610152565b9594505050505056fe4d6f6f20c3a9f09f9a80c3a9c3a94d4d6f6f6ff09f9a80f09f9a8020f09f9a804df09f9a804d206fc3a94dc3a920f09f9a806ff09f9a80f09f9a80206f6f6f6ff09f9a80c3a96f4d4d6f6f20c3a9f09f9a80c3a9c3a96f6f6f6f6f6f6f6ff09f9a806f206ff09f9a806ff09f9a806fc3a94d20c3a9c3a920206fc3a96f20a26469706673582212202f9e028c49d68df6046200458f567ff4b3aec7f249e94fc347c241a2927c4c0364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fe1f5ff5 {\n address s_0;\n string s_1;\n string s_2;\n string s_3;\n }\n\n function test () public pure returns (S_fe1f5ff5 memory) {\n S_fe1f5ff5 memory r;\n {\n address r_0 = 0x35c27789D4f30765974aC6abe64aCb597F01897F;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀ooo🚀 éMéo\";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀ééoooooooo🚀o o🚀o🚀oéM éé oéo \";\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀ééMMooo🚀🚀 🚀M🚀M oéMé 🚀o🚀🚀 oooo🚀éoM\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000035c27789d4f30765974ac6abe64acb597f01897f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a806f6f6ff09f9a8020c3a94dc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80c3a9c3a96f6f6f6f6f6f6f6ff09f9a806f206ff09f9a806ff09f9a806fc3a94d20c3a9c3a920206fc3a96f200000000000000000000000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a80c3a9c3a94d4d6f6f6ff09f9a80f09f9a8020f09f9a804df09f9a804d206fc3a94dc3a920f09f9a806ff09f9a80f09f9a80206f6f6f6ff09f9a80c3a96f4d000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,string,uint136,int32)", + "type": "(address,string,uint136,int32)", + "value": [ + "0xDd69c1924DF5E0CBB3C1F0Ac90AC989294FbD279", + "Moo é🚀oo éM é🚀o é🚀🚀oMMoéM 🚀🚀 MéMo🚀M🚀 é o🚀o", + "65740796100367119962059936296432917707467", + "515926523" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xDd69c1924DF5E0CBB3C1F0Ac90AC989294FbD279" + }, + { + "type": "string", + "value": "Moo é🚀oo éM é🚀o é🚀🚀oMMoéM 🚀🚀 MéMo🚀M🚀 é o🚀o" + }, + { + "type": "number", + "value": "65740796100367119962059936296432917707467" + }, + { + "type": "number", + "value": "515926523" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610214806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ec565b60405180910390f35b60408051608080820183526000808352606060208085018290528486018390528185018390528551808501875280820183905280870184905291820183905273dd69c1924df5e0cbb3c1f0ac90ac989294fbd27982528551938401909552604c80845293949093919291906101939083013960208301525070c131e0c71af8175393e6e75ebab8d27acb6040820152631ec069fb6060820152919050565b6000602080835260018060a01b0384511681840152808401516080604085015280518060a086015260005b818110156101335782810184015186820160c001528301610117565b8181111561014557600060c083880101525b50604086015170ffffffffffffffffffffffffffffffffff8116606087015292506060860151925061017c608086018460030b9052565b601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a806f6f20c3a94d20c3a9f09f9a806f20c3a9f09f9a80f09f9a806f4d4d6fc3a94d20f09f9a80f09f9a80204dc3a94d6ff09f9a804df09f9a8020c3a9206ff09f9a806fa26469706673582212208dac2b12f9ed87302d02a2cdfd09d58e4f40c9cbc70a85dca332afbd3eb093fe64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d5025c0f {\n address s_0;\n string s_1;\n uint136 s_2;\n int32 s_3;\n }\n\n function test () public pure returns (S_d5025c0f memory) {\n S_d5025c0f memory r;\n {\n address r_0 = 0xDd69c1924DF5E0CBB3C1F0Ac90AC989294FbD279;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oo éM é🚀o é🚀🚀oMMoéM 🚀🚀 MéMo🚀M🚀 é o🚀o\";\n r.s_1 = r_1;\n }\n {\n uint136 r_2 = 65740796100367119962059936296432917707467;\n r.s_2 = r_2;\n }\n {\n int32 r_3 = 515926523;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000dd69c1924df5e0cbb3c1f0ac90ac989294fbd2790000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000c131e0c71af8175393e6e75ebab8d27acb000000000000000000000000000000000000000000000000000000001ec069fb000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806f6f20c3a94d20c3a9f09f9a806f20c3a9f09f9a80f09f9a806f4d4d6fc3a94d20f09f9a80f09f9a80204dc3a94d6ff09f9a804df09f9a8020c3a9206ff09f9a806f0000000000000000000000000000000000000000" + }, + { + "name": "random-(address,string[3],bytes14)", + "type": "(address,string[3],bytes14)", + "value": [ + "0x5f35DdC6Bb6194332834E8f2f633810C79192842", + [ + "Moo é🚀🚀🚀oé🚀oMoo 🚀Méo🚀🚀 é🚀 🚀oé 🚀ooMM", + "Moo é🚀oMooé oM", + "Moo é🚀 MMooo🚀 oooMéo🚀oo🚀🚀M éM é🚀é🚀oéooMMoMoMoé🚀o é" + ], + "0xe66ffb1810db91000731db6461c9" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5f35DdC6Bb6194332834E8f2f633810C79192842" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀oé🚀oMoo 🚀Méo🚀🚀 é🚀 🚀oé 🚀ooMM" + }, + { + "type": "string", + "value": "Moo é🚀oMooé oM" + }, + { + "type": "string", + "value": "Moo é🚀 MMooo🚀 oooMéo🚀oo🚀🚀M éM é🚀é🚀oéooMMoMoMoé🚀o é" + } + ] + }, + { + "type": "hexstring", + "value": "0xe66ffb1810db91000731db6461c9" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610302806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610171565b60405180910390f35b61005661011a565b61005e61011a565b735f35ddc6bb6194332834e8f2f633810c79192842815261007d61014a565b6000604051806080016040528060468152602001610235604691398252506040805180820190915260138152724d6f6f20c3a9f09f9a806f4d6f6fc3a9206f4d60681b602082015280826001602002018190525050600060405180608001604052806052815260200161027b605291396040808401919091526020840192909252506de66ffb1810db91000731db6461c960901b90820152919050565b604051806060016040528060006001600160a01b0316815260200161013d61014a565b8152600060209091015290565b60405180606001604052806003905b60608152602001906001900390816101595790505090565b602080825282516001600160a01b03168282015282810151606060408401526000919060e08401906080850184805b600381101561020657878503607f1901835283518051808752835b818110156101d6578281018901518882018a015288016101bb565b818111156101e6578489838a0101525b50601f01601f1916959095018601945092850192918501916001016101a0565b50505050604085015171ffffffffffffffffffffffffffffffffffff1981166060860152915094935050505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a806fc3a9f09f9a806f4d6f6f20f09f9a804dc3a96ff09f9a80f09f9a8020c3a9f09f9a8020f09f9a806fc3a920f09f9a806f6f4d4d4d6f6f20c3a9f09f9a80204d4d6f6f6ff09f9a80206f6f6f4dc3a96ff09f9a806f6ff09f9a80f09f9a804d20c3a94d20c3a9f09f9a80c3a9f09f9a806fc3a96f6f4d4d6f4d6f4d6fc3a9f09f9a806f20c3a9a26469706673582212200356f926955d5f190bedd9d250f56aab0e60a0a118ebfaf96513bc370300d31164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_429cd3b1 {\n address s_0;\n string[3] s_1;\n bytes14 s_2;\n }\n\n function test () public pure returns (S_429cd3b1 memory) {\n S_429cd3b1 memory r;\n {\n address r_0 = 0x5f35DdC6Bb6194332834E8f2f633810C79192842;\n r.s_0 = r_0;\n }\n {\n string[3] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀🚀oé🚀oMoo 🚀Méo🚀🚀 é🚀 🚀oé 🚀ooMM\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oMooé oM\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀 MMooo🚀 oooMéo🚀oo🚀🚀M éM é🚀é🚀oéooMMoMoMoé🚀o é\";\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bytes14 r_2 = bytes14(0xe66ffb1810db91000731db6461c9);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000005f35ddc6bb6194332834e8f2f633810c791928420000000000000000000000000000000000000000000000000000000000000060e66ffb1810db91000731db6461c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80f09f9a80f09f9a806fc3a9f09f9a806f4d6f6f20f09f9a804dc3a96ff09f9a80f09f9a8020c3a9f09f9a8020f09f9a806fc3a920f09f9a806f6f4d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806f4d6f6fc3a9206f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80204d4d6f6f6ff09f9a80206f6f6f4dc3a96ff09f9a806f6ff09f9a80f09f9a804d20c3a94d20c3a9f09f9a80c3a9f09f9a806fc3a96f6f4d4d6f4d6f4d6fc3a9f09f9a806f20c3a90000000000000000000000000000" + }, + { + "name": "random-(address,uint232[1][2])", + "type": "(address,uint232[1][2])", + "value": [ + "0x965Ccd820E24062D2c8c1523b7FfD79D5C1da7cD", + [ + ["3771100022616029169101429379120294340480380192291573535795030591472775"], + ["239542713703516699379656664902710920092229383466179118996635807634391"] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x965Ccd820E24062D2c8c1523b7FfD79D5C1da7cD" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3771100022616029169101429379120294340480380192291573535795030591472775" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "239542713703516699379656664902710920092229383466179118996635807634391" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101fb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610153565b60405180910390f35b6100566100e0565b61005e6100e0565b73965ccd820e24062d2c8c1523b7ffd79d5c1da7cd815261007d610108565b610085610135565b7c8be0bc598219b33ec02747672a7c4d1558a6a1c4ff554cf048b1870487815281526100af610135565b7c08e29814b52dce40440a0f164fc6f2beecb978fa68250f1c1afff3d3d78152602082810191909152820152919050565b604051806040016040528060006001600160a01b03168152602001610103610108565b905290565b60405180604001604052806002905b61011f610135565b8152602001906001900390816101175790505090565b60405180602001604052806001906020820280368337509192915050565b81516001600160a01b031681526020808301516060830191908184016000805b60028110156101ba57835183835b60018110156101a75782516001600160e81b031682529187019190870190600101610181565b5050509284019291840191600101610173565b50505050509291505056fea2646970667358221220347bff9c6cbbb45cc60af9ba7c7fd75fd32308174976bc5e1c3496999b82cc7764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_040cda5c {\n address s_0;\n uint232[1][2] s_1;\n }\n\n function test () public pure returns (S_040cda5c memory) {\n S_040cda5c memory r;\n {\n address r_0 = 0x965Ccd820E24062D2c8c1523b7FfD79D5C1da7cD;\n r.s_0 = r_0;\n }\n {\n uint232[1][2] memory r_1;\n {\n uint232[1] memory r_1_0;\n {\n uint232 r_1_0_0 = 3771100022616029169101429379120294340480380192291573535795030591472775;\n r_1_0[0] = r_1_0_0;\n }\n r_1[0] = r_1_0;\n }\n {\n uint232[1] memory r_1_1;\n {\n uint232 r_1_1_0 = 239542713703516699379656664902710920092229383466179118996635807634391;\n r_1_1[0] = r_1_1_0;\n }\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000965ccd820e24062d2c8c1523b7ffd79d5c1da7cd0000008be0bc598219b33ec02747672a7c4d1558a6a1c4ff554cf048b187048700000008e29814b52dce40440a0f164fc6f2beecb978fa68250f1c1afff3d3d7" + }, + { + "name": "random-(address[],uint136)[3]", + "type": "(address[],uint136)[3]", + "value": [ + [ + [ + "0xeb10144F461478859Df085935C77865d334CF12e", + "0xF3170479dFE48cD5F5B24CE92D846B1Fbc8E2688", + "0x75dEb44f7919968a32cb5250aF2c48Cf4303288c" + ], + "20177843111760875391405552584010571048823" + ], + [ + ["0x68008F48FF2AE49FA53bc6FCFcC4ABb6d592a9E9"], + "38896563217589420844275421732036694903839" + ], + [ + [ + "0xa7748A3AF6CcEAa3D99E8587c94C05dE7f307f7c", + "0x08Cf53209E49d2Bc8dc6207f784988026c304fb7", + "0xBd390E17168B9A21B2490446DbA78efF261D51B1", + "0x85c86F2977f3d37C7B9F3E5f65829563c5335fe0" + ], + "45977561792698692593831752620466052013985" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xeb10144F461478859Df085935C77865d334CF12e" + }, + { + "type": "address", + "value": "0xF3170479dFE48cD5F5B24CE92D846B1Fbc8E2688" + }, + { + "type": "address", + "value": "0x75dEb44f7919968a32cb5250aF2c48Cf4303288c" + } + ] + }, + { + "type": "number", + "value": "20177843111760875391405552584010571048823" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x68008F48FF2AE49FA53bc6FCFcC4ABb6d592a9E9" + } + ] + }, + { + "type": "number", + "value": "38896563217589420844275421732036694903839" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xa7748A3AF6CcEAa3D99E8587c94C05dE7f307f7c" + }, + { + "type": "address", + "value": "0x08Cf53209E49d2Bc8dc6207f784988026c304fb7" + }, + { + "type": "address", + "value": "0xBd390E17168B9A21B2490446DbA78efF261D51B1" + }, + { + "type": "address", + "value": "0x85c86F2977f3d37C7B9F3E5f65829563c5335fe0" + } + ] + }, + { + "type": "number", + "value": "45977561792698692593831752620466052013985" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104f2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103fe565b60405180910390f35b6100566103c4565b61005e6103c4565b60408051808201909152606081526000602082015260408051600380825260808201909252600091816020016020820280368337019050509050600073eb10144f461478859df085935c77865d334cf12e905080826000815181106100c5576100c56104a6565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073f3170479dfe48cd5f5b24ce92d846b1fbc8e268890508082600181518110610113576101136104a6565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007375deb44f7919968a32cb5250af2c48cf4303288c90508082600281518110610161576101616104a6565b6001600160a01b039290921660209283029190910182015291835250703b4c1f39e8d1e2f6c47ea5733f7d39e77782820152908252604080518082018252606081526000818401819052825160018082528185019094529193909290828101908036833701905050905060007368008f48ff2ae49fa53bc6fcfcc4abb6d592a9e9905080826000815181106101f8576101f86104a6565b6001600160a01b039092166020928302919091018201529183525070724e85955d05be3724d13729f081860c1f908201528082600160200201525061024e60408051808201909152606081526000602082015290565b60408051600480825260a0820190925260009160208201608080368337019050509050600073a7748a3af6cceaa3d99e8587c94c05de7f307f7c9050808260008151811061029e5761029e6104a6565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007308cf53209e49d2bc8dc6207f784988026c304fb7905080826001815181106102ec576102ec6104a6565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073bd390e17168b9a21b2490446dba78eff261d51b19050808260028151811061033a5761033a6104a6565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007385c86f2977f3d37c7b9f3e5f65829563c5335fe090508082600381518110610388576103886104a6565b6001600160a01b03929092166020928302919091018201529183525070871dac4d7a4af1c40dfa70d7705bf41fa1908201526040820152919050565b60405180606001604052806003905b6040805180820190915260608152600060208201528152602001906001900390816103d35790505090565b6020808252600090608083018382018584805b600381101561049957878503601f190184528251805160408088528151908801819052606088019189019085905b808210156104685782516001600160a01b03168452928a0192918a01916001919091019061043f565b5050509087015170ffffffffffffffffffffffffffffffffff16958701959095529285019291850191600101610411565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220e6f29394e82bb4e0d3f46e4b26817b713aca8204cf01d2a39aa5efeb94737cea64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c7eae0bb {\n address[] s_0;\n uint136 s_1;\n }\n\n function test () public pure returns (S_c7eae0bb[3] memory) {\n S_c7eae0bb[3] memory r;\n {\n S_c7eae0bb memory r_0;\n {\n address[] memory r_0_0 = new address[](3);\n {\n address r_0_0_0 = 0xeb10144F461478859Df085935C77865d334CF12e;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0xF3170479dFE48cD5F5B24CE92D846B1Fbc8E2688;\n r_0_0[1] = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x75dEb44f7919968a32cb5250aF2c48Cf4303288c;\n r_0_0[2] = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n {\n uint136 r_0_1 = 20177843111760875391405552584010571048823;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_c7eae0bb memory r_1;\n {\n address[] memory r_1_0 = new address[](1);\n {\n address r_1_0_0 = 0x68008F48FF2AE49FA53bc6FCFcC4ABb6d592a9E9;\n r_1_0[0] = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n uint136 r_1_1 = 38896563217589420844275421732036694903839;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_c7eae0bb memory r_2;\n {\n address[] memory r_2_0 = new address[](4);\n {\n address r_2_0_0 = 0xa7748A3AF6CcEAa3D99E8587c94C05dE7f307f7c;\n r_2_0[0] = r_2_0_0;\n }\n {\n address r_2_0_1 = 0x08Cf53209E49d2Bc8dc6207f784988026c304fb7;\n r_2_0[1] = r_2_0_1;\n }\n {\n address r_2_0_2 = 0xBd390E17168B9A21B2490446DbA78efF261D51B1;\n r_2_0[2] = r_2_0_2;\n }\n {\n address r_2_0_3 = 0x85c86F2977f3d37C7B9F3E5f65829563c5335fe0;\n r_2_0[3] = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n uint136 r_2_1 = 45977561792698692593831752620466052013985;\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000003b4c1f39e8d1e2f6c47ea5733f7d39e7770000000000000000000000000000000000000000000000000000000000000003000000000000000000000000eb10144f461478859df085935c77865d334cf12e000000000000000000000000f3170479dfe48cd5f5b24ce92d846b1fbc8e268800000000000000000000000075deb44f7919968a32cb5250af2c48cf4303288c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000724e85955d05be3724d13729f081860c1f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000068008f48ff2ae49fa53bc6fcfcc4abb6d592a9e90000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000871dac4d7a4af1c40dfa70d7705bf41fa10000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a7748a3af6cceaa3d99e8587c94c05de7f307f7c00000000000000000000000008cf53209e49d2bc8dc6207f784988026c304fb7000000000000000000000000bd390e17168b9a21b2490446dba78eff261d51b100000000000000000000000085c86f2977f3d37c7b9f3e5f65829563c5335fe0" + }, + { + "name": "random-(address[1],address,string)", + "type": "(address[1],address,string)", + "value": [ + ["0x8D8039B745c787920e981744be685Cc6e626dCB0"], + "0xA9bF8DA33f02FB6de26Cd54c0e11F0440975aC39", + "Moo é🚀🚀M🚀oMoo🚀Moé éM 🚀 🚀 M é é 🚀oéé🚀o🚀ooooM 🚀é🚀o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8D8039B745c787920e981744be685Cc6e626dCB0" + } + ] + }, + { + "type": "address", + "value": "0xA9bF8DA33f02FB6de26Cd54c0e11F0440975aC39" + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀oMoo🚀Moé éM 🚀 🚀 M é é 🚀oéé🚀o🚀ooooM 🚀é🚀o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061023d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610107565b60405180910390f35b6100566100c2565b61005e6100c2565b6100666100e9565b738d8039b745c787920e981744be685cc6e626dcb08152815273a9bf8da33f02fb6de26cd54c0e11f0440975ac39602082810191909152604080516080810190915260598082526000926101af90830139604083015250919050565b60405180606001604052806100d56100e9565b815260006020820152606060409091015290565b60405180602001604052806001906020820280368337509192915050565b6020808252825160009190828483015b600182101561013f5782516001600160a01b0316815291830191600191909101908301610117565b50505060018060a01b03818501511660408401526040840151606080850152805180608086015260005b818110156101855782810184015186820160a001528301610169565b8181111561019757600060a083880101525b50601f01601f19169390930160a00194935050505056fe4d6f6f20c3a9f09f9a80f09f9a804df09f9a806f4d6f6ff09f9a804d6fc3a920c3a94d20f09f9a8020f09f9a80204d20c3a920c3a920f09f9a806fc3a9c3a9f09f9a806ff09f9a806f6f6f6f4d20f09f9a80c3a9f09f9a806fa26469706673582212204a0ba6e8071238741aa9816d2875bdd15f373b68b60b7f8ed5e60cce2c73132264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5848ad4a {\n address[1] s_0;\n address s_1;\n string s_2;\n }\n\n function test () public pure returns (S_5848ad4a memory) {\n S_5848ad4a memory r;\n {\n address[1] memory r_0;\n {\n address r_0_0 = 0x8D8039B745c787920e981744be685Cc6e626dCB0;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xA9bF8DA33f02FB6de26Cd54c0e11F0440975aC39;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀🚀M🚀oMoo🚀Moé éM 🚀 🚀 M é é 🚀oéé🚀o🚀ooooM 🚀é🚀o\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000008d8039b745c787920e981744be685cc6e626dcb0000000000000000000000000a9bf8da33f02fb6de26cd54c0e11f0440975ac39000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a804df09f9a806f4d6f6ff09f9a804d6fc3a920c3a94d20f09f9a8020f09f9a80204d20c3a920c3a920f09f9a806fc3a9c3a9f09f9a806ff09f9a806f6f6f6f4d20f09f9a80c3a9f09f9a806f00000000000000" + }, + { + "name": "random-(address[2],bytes16,string)", + "type": "(address[2],bytes16,string)", + "value": [ + [ + "0xfC156A78dE052Def9d71cb8F8990Fef41593e23b", + "0x7e3D393E619dC323Ed2Ca6EC5Da80f970161996f" + ], + "0xca181cb5e55c6e23425454ea179ceaa6", + "Moo é🚀éo🚀o oMéoo🚀o🚀Mé🚀oMMo 🚀oooéoo é" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xfC156A78dE052Def9d71cb8F8990Fef41593e23b" + }, + { + "type": "address", + "value": "0x7e3D393E619dC323Ed2Ca6EC5Da80f970161996f" + } + ] + }, + { + "type": "hexstring", + "value": "0xca181cb5e55c6e23425454ea179ceaa6" + }, + { + "type": "string", + "value": "Moo é🚀éo🚀o oMéoo🚀o🚀Mé🚀oMMo 🚀oooéoo é" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610246806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610120565b60405180910390f35b6100566100db565b61005e6100db565b610066610102565b73fc156a78de052def9d71cb8f8990fef41593e23b8152737e3d393e619dc323ed2ca6ec5da80f970161996f6020808301919091529082526f650c0e5af2ae3711a12a2a750bce755360811b828201526040805160608101909152603e8082526000926101d390830139604083015250919050565b60405180606001604052806100ee610102565b815260006020820152606060409091015290565b60405180604001604052806002906020820280368337509192915050565b6020808252825160009190828483015b60028210156101585782516001600160a01b0316815291830191600191909101908301610130565b5050506fffffffffffffffffffffffffffffffff1981850151166060840152604084015160808085015280518060a086015260005b818110156101a95782810184015186820160c00152830161018d565b818111156101bb57600060c083880101525b50601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a80c3a96ff09f9a806f2020206f4dc3a96f6ff09f9a806ff09f9a804dc3a9f09f9a806f4d4d6f20f09f9a806f6f6fc3a96f6f20c3a9a264697066735822122083f9d66ead16bca2e12fae35b6fe8e76891e3dfb88c7deca14f9caa81d82a15d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f3e9bc3f {\n address[2] s_0;\n bytes16 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_f3e9bc3f memory) {\n S_f3e9bc3f memory r;\n {\n address[2] memory r_0;\n {\n address r_0_0 = 0xfC156A78dE052Def9d71cb8F8990Fef41593e23b;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0x7e3D393E619dC323Ed2Ca6EC5Da80f970161996f;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n bytes16 r_1 = bytes16(0xca181cb5e55c6e23425454ea179ceaa6);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀éo🚀o oMéoo🚀o🚀Mé🚀oMMo 🚀oooéoo é\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000fc156a78de052def9d71cb8f8990fef41593e23b0000000000000000000000007e3d393e619dc323ed2ca6ec5da80f970161996fca181cb5e55c6e23425454ea179ceaa6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80c3a96ff09f9a806f2020206f4dc3a96f6ff09f9a806ff09f9a804dc3a9f09f9a806f4d4d6f20f09f9a806f6f6fc3a96f6f20c3a90000" + }, + { + "name": "random-(bool,(bytes1,address,string))", + "type": "(bool,(bytes1,address,string))", + "value": [ + false, + [ + "0x72", + "0x66FD68437fe6E2a07262814A38709087a6062513", + "Moo é🚀é🚀M🚀 ooM é MééM🚀ooMMooé🚀é 🚀ooMé oooéoooéoooMM🚀" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x72" + }, + { + "type": "address", + "value": "0x66FD68437fe6E2a07262814A38709087a6062513" + }, + { + "type": "string", + "value": "Moo é🚀é🚀M🚀 ooM é MééM🚀ooMMooé🚀é 🚀ooMé oooéoooéoooMM🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061022e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6100566100d3565b61005e6100d3565b600081526100846040805160608082018352600080835260208301529181019190915290565b603960f91b81527366fd68437fe6e2a07262814a38709087a6062513602080830191909152604080516080810190915260558082526000926101a4908301396040830152506020820152919050565b60405180604001604052806000151581526020016101096040805160608082018352600080835260208301529181019190915290565b905290565b6000602080835283511515818401528084015160408085015260ff60f81b815116606085015260018060a01b038282015116608085015260408101519050606060a085015280518060c086015260005b8181101561017a5782810184015186820160e00152830161015e565b8181111561018c57600060e083880101525b50601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a80c3a9f09f9a804df09f9a80206f6f4d2020c3a9204dc3a9c3a94df09f9a806f6f4d4d6f6fc3a9f09f9a80c3a92020f09f9a806f6f4dc3a9206f6f6fc3a96f6f6fc3a96f6f6f4d4df09f9a80a2646970667358221220bae35cbf4d2b3267be8063501fae5d3c2fe7848e626fbd6adeb94cffe68c16c764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b6f336d7 {\n bytes1 s_0;\n address s_1;\n string s_2;\n }\n\n struct S_172b0ac2 {\n bool s_0;\n S_b6f336d7 s_1;\n }\n\n function test () public pure returns (S_172b0ac2 memory) {\n S_172b0ac2 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n S_b6f336d7 memory r_1;\n {\n bytes1 r_1_0 = bytes1(0x72);\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x66FD68437fe6E2a07262814A38709087a6062513;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀é🚀M🚀 ooM é MééM🚀ooMMooé🚀é 🚀ooMé oooéoooéoooMM🚀\";\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040720000000000000000000000000000000000000000000000000000000000000000000000000000000000000066fd68437fe6e2a07262814a38709087a6062513000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a80c3a9f09f9a804df09f9a80206f6f4d2020c3a9204dc3a9c3a94df09f9a806f6f4d4d6f6fc3a9f09f9a80c3a92020f09f9a806f6f4dc3a9206f6f6fc3a96f6f6fc3a96f6f6f4d4df09f9a800000000000000000000000" + }, + { + "name": "random-(bool,(bytes29,bytes20),uint48)", + "type": "(bool,(bytes29,bytes20),uint48)", + "value": [ + false, + [ + "0xaa090ad98b5ad139303c3020ec2c57c549b84f296bf71eea193b546962", + "0xb45baff81c8b6cf46fd70ad3cef4db416adaad4b" + ], + "252600522296992" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xaa090ad98b5ad139303c3020ec2c57c549b84f296bf71eea193b546962" + }, + { + "type": "hexstring", + "value": "0xb45baff81c8b6cf46fd70ad3cef4db416adaad4b" + } + ] + }, + { + "type": "number", + "value": "252600522296992" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101548061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b60408051606080820183526000808352835180850185528181526020808201839052808501919091529284018190528351808301855281815284518086018652828152808501839052818501908152818601838152928252855180870187527faa090ad98b5ad139303c3020ec2c57c549b84f296bf71eea193b546962000000815273b45baff81c8b6cf46fd70ad3cef4db416adaad4b60601b81870152815265e5bd2466cea08352855191511515825251805162ffffff191682860152909301516bffffffffffffffffffffffff1916838501525165ffffffffffff169082015290519081900360800190f3fea26469706673582212200d0fb45e5cd320dc272f9f079b48e0dde762a090613d29963458baa05ab3757b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f628b69f {\n bytes29 s_0;\n bytes20 s_1;\n }\n\n struct S_223b25e1 {\n bool s_0;\n S_f628b69f s_1;\n uint48 s_2;\n }\n\n function test () public pure returns (S_223b25e1 memory) {\n S_223b25e1 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n S_f628b69f memory r_1;\n {\n bytes29 r_1_0 = bytes29(0xaa090ad98b5ad139303c3020ec2c57c549b84f296bf71eea193b546962);\n r_1.s_0 = r_1_0;\n }\n {\n bytes20 r_1_1 = bytes20(0xb45BaFF81c8b6cf46Fd70AD3CEF4Db416AdAad4b);\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n uint48 r_2 = 252600522296992;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000aa090ad98b5ad139303c3020ec2c57c549b84f296bf71eea193b546962000000b45baff81c8b6cf46fd70ad3cef4db416adaad4b0000000000000000000000000000000000000000000000000000000000000000000000000000e5bd2466cea0" + }, + { + "name": "random-(bool,address,address,bytes21)", + "type": "(bool,address,address,bytes21)", + "value": [ + false, + "0x5462482dEd9aa77B5fe59919813fD0Fa581DF975", + "0x9fdf9DC79d90b4403EEf9ac8c904557fa47d2663", + "0x43fc720efd4d6bd8a93bf55bb09fd37e98561bb5e3" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x5462482dEd9aa77B5fe59919813fD0Fa581DF975" + }, + { + "type": "address", + "value": "0x9fdf9DC79d90b4403EEf9ac8c904557fa47d2663" + }, + { + "type": "hexstring", + "value": "0x43fc720efd4d6bd8a93bf55bb09fd37e98561bb5e3" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061012b8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516080808201835260008083526020808401829052838501829052606093840182905284518084018652828152735462482ded9aa77b5fe59919813fd0fa581df975818301908152739fdf9dc79d90b4403eef9ac8c904557fa47d26638288019081527443fc720efd4d6bd8a93bf55bb09fd37e98561bb5e360581b928701928352875194855290516001600160a01b03908116938501939093525190911682860152516affffffffffffffffffffff19169281019290925291519081900390910190f3fea26469706673582212203cdcf175d11c03233fa958f7773d10355f0c8c9706f19e657a1c4c6a6b5613ee64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0972ca3d {\n bool s_0;\n address s_1;\n address s_2;\n bytes21 s_3;\n }\n\n function test () public pure returns (S_0972ca3d memory) {\n S_0972ca3d memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x5462482dEd9aa77B5fe59919813fD0Fa581DF975;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x9fdf9DC79d90b4403EEf9ac8c904557fa47d2663;\n r.s_2 = r_2;\n }\n {\n bytes21 r_3 = bytes21(0x43fc720efd4d6bd8a93bf55bb09fd37e98561bb5e3);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005462482ded9aa77b5fe59919813fd0fa581df9750000000000000000000000009fdf9dc79d90b4403eef9ac8c904557fa47d266343fc720efd4d6bd8a93bf55bb09fd37e98561bb5e30000000000000000000000" + }, + { + "name": "random-(bool,address,bool,address)", + "type": "(bool,address,bool,address)", + "value": [ + true, + "0xec3bc7fA0fC74fFaB3c6b61454805Fb801C67Dd4", + true, + "0xea9e271dc738f6655932AAa2a8f9C9b3cedD6279" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xec3bc7fA0fC74fFaB3c6b61454805Fb801C67Dd4" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xea9e271dc738f6655932AAa2a8f9C9b3cedD6279" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101088061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051608080820183526000808352602080840182905283850182905260609384019190915283518083018552600180825273ec3bc7fa0fc74ffab3c6b61454805fb801c67dd482840190815282870182815273ea9e271dc738f6655932aaa2a8f9c9b3cedd6279938701938452875192835290516001600160a01b0390811694830194909452511515958101959095525116918301919091520160405180910390f3fea2646970667358221220921da0a7717980733d069b6017c6189a3dc575a3bbb7912af867a806ec4779fe64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e430a33f {\n bool s_0;\n address s_1;\n bool s_2;\n address s_3;\n }\n\n function test () public pure returns (S_e430a33f memory) {\n S_e430a33f memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xec3bc7fA0fC74fFaB3c6b61454805Fb801C67Dd4;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xea9e271dc738f6655932AAa2a8f9C9b3cedD6279;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ec3bc7fa0fc74ffab3c6b61454805fb801c67dd40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ea9e271dc738f6655932aaa2a8f9c9b3cedd6279" + }, + { + "name": "random-(bool,address,bool[])", + "type": "(bool,address,bool[])", + "value": [true, "0xD29F22AE454903B4844ad5aa029768Ed2E649C0e", [false, true, true]], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xD29F22AE454903B4844ad5aa029768Ed2E649C0e" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610201806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610144565b60405180910390f35b604080516060808201835260008083526020808401829052838501839052845180840186528086018490526001815273d29f22ae454903b4844ad5aa029768ed2e649c0e818301528551600380825260808201909752949590949293909183019080368337019050509050600080826000815181106100cf576100cf6101b5565b6020026020010190151590811515815250505060006001905080826001815181106100fc576100fc6101b5565b602002602001019015159081151581525050506000600190508082600281518110610129576101296101b5565b91151560209283029190910190910152506040820152919050565b60208082528251151582820152828101516001600160a01b031660408084019190915283015160608084015280516080840181905260009291820190839060a08601905b808310156101aa57835115158252928401926001929092019190840190610188565b509695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212200c89345a46f1494190b2653f259ef5dcfbbc349847b23444ccca099743be242464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ced390fb {\n bool s_0;\n address s_1;\n bool[] s_2;\n }\n\n function test () public pure returns (S_ced390fb memory) {\n S_ced390fb memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xD29F22AE454903B4844ad5aa029768Ed2E649C0e;\n r.s_1 = r_1;\n }\n {\n bool[] memory r_2 = new bool[](3);\n {\n bool r_2_0 = false;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2[1] = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d29f22ae454903b4844ad5aa029768ed2e649c0e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool,address,bytes2,uint64)", + "type": "(bool,address,bytes2,uint64)", + "value": [ + true, + "0xCD48695d5c634acE01eCa1233E4610aF670C9654", + "0x6d4b", + "6369165484800289978" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xCD48695d5c634acE01eCa1233E4610aF670C9654" + }, + { + "type": "hexstring", + "value": "0x6d4b" + }, + { + "type": "number", + "value": "6369165484800289978" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101118061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051608080820183526000808352602080840182905283850182905260609384019190915283518083018552600180825273cd48695d5c634ace01eca1233e4610af670c9654828401908152616d4b60f01b838801908152675863d2435d332cba938701938452875192835290516001600160a01b03169382019390935291516001600160f01b031916828601525167ffffffffffffffff169281019290925291519081900390910190f3fea2646970667358221220c5b6109b78273c8766be6f8596bf5ef04d331e8c8ea62e5b48fc32a867bbf89164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_485c7500 {\n bool s_0;\n address s_1;\n bytes2 s_2;\n uint64 s_3;\n }\n\n function test () public pure returns (S_485c7500 memory) {\n S_485c7500 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xCD48695d5c634acE01eCa1233E4610aF670C9654;\n r.s_1 = r_1;\n }\n {\n bytes2 r_2 = bytes2(0x6d4b);\n r.s_2 = r_2;\n }\n {\n uint64 r_3 = 6369165484800289978;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cd48695d5c634ace01eca1233e4610af670c96546d4b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005863d2435d332cba" + }, + { + "name": "random-(bool,address,bytes9)[3]", + "type": "(bool,address,bytes9)[3]", + "value": [ + [false, "0xF9E60257d34e9B415AA3a8BAe91730bf1Dc66066", "0x1a0b17f67268a69810"], + [true, "0x17eB96049f846741f2f870ea6e88dE7CBc31CDB4", "0x25066586ac9e86f05d"], + [false, "0xfe2C6b71a49b035C330E8112EF33088B52BF547d", "0x0890f99e6e755152eb"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xF9E60257d34e9B415AA3a8BAe91730bf1Dc66066" + }, + { + "type": "hexstring", + "value": "0x1a0b17f67268a69810" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x17eB96049f846741f2f870ea6e88dE7CBc31CDB4" + }, + { + "type": "hexstring", + "value": "0x25066586ac9e86f05d" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xfe2C6b71a49b035C330E8112EF33088B52BF547d" + }, + { + "type": "hexstring", + "value": "0x0890f99e6e755152eb" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ed806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610157565b60405180910390f35b610056610118565b61005e610118565b6040805160608082018352600080835273f9e60257d34e9b415aa3a8bae91730bf1dc660666020808501919091526801a0b17f67268a698160bc1b8486015292855283518083018552600181527317eb96049f846741f2f870ea6e88de7cbc31cdb4818501526825066586ac9e86f05d60b81b818601528584015283519182018452815273fe2c6b71a49b035c330e8112ef33088b52bf547d91810191909152680890f99e6e755152eb60b81b8183015290820152919050565b60405180606001604052806003905b60408051606081018252600080825260208083018290529282015282526000199092019101816101275790505090565b6101208101818360005b60038110156101ae5781518051151584526020808201516001600160a01b0316818601526040918201516001600160b81b0319169185019190915260609093019290910190600101610161565b5050509291505056fea26469706673582212203357b78fa50c4ea0dbfd5ad9ed00e23b8487cfe81ba2f4979d4b775bfa69186f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1b15932c {\n bool s_0;\n address s_1;\n bytes9 s_2;\n }\n\n function test () public pure returns (S_1b15932c[3] memory) {\n S_1b15932c[3] memory r;\n {\n S_1b15932c memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0xF9E60257d34e9B415AA3a8BAe91730bf1Dc66066;\n r_0.s_1 = r_0_1;\n }\n {\n bytes9 r_0_2 = bytes9(0x1a0b17f67268a69810);\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_1b15932c memory r_1;\n {\n bool r_1_0 = true;\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x17eB96049f846741f2f870ea6e88dE7CBc31CDB4;\n r_1.s_1 = r_1_1;\n }\n {\n bytes9 r_1_2 = bytes9(0x25066586ac9e86f05d);\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_1b15932c memory r_2;\n {\n bool r_2_0 = false;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0xfe2C6b71a49b035C330E8112EF33088B52BF547d;\n r_2.s_1 = r_2_1;\n }\n {\n bytes9 r_2_2 = bytes9(0x0890f99e6e755152eb);\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9e60257d34e9b415aa3a8bae91730bf1dc660661a0b17f67268a698100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000017eb96049f846741f2f870ea6e88de7cbc31cdb425066586ac9e86f05d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe2c6b71a49b035c330e8112ef33088b52bf547d0890f99e6e755152eb0000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,address,string)[3]", + "type": "(bool,address,string)[3]", + "value": [ + [ + false, + "0x3ff1AB54931E2C62e348dfD4C21e92310eFDFCFc", + "Moo é🚀oo🚀oM MééMooMoo🚀 MééooMo éMMéoé🚀oM" + ], + [ + true, + "0xA3b978f4Ba46782f418199C188D697462cADeE5f", + "Moo é🚀é🚀 🚀 M o M🚀o🚀ooMMooéé ooo éoo" + ], + [ + false, + "0x8F04da46cd8C340Cc71CB6C6b2dff5873b70aB4B", + "Moo é🚀🚀🚀éMo é 🚀 MMo🚀 o éM🚀éoéoooéMo MM🚀éM o🚀🚀Mooo" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x3ff1AB54931E2C62e348dfD4C21e92310eFDFCFc" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀oM MééMooMoo🚀 MééooMo éMMéoé🚀oM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xA3b978f4Ba46782f418199C188D697462cADeE5f" + }, + { + "type": "string", + "value": "Moo é🚀é🚀 🚀 M o M🚀o🚀ooMMooéé ooo éoo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x8F04da46cd8C340Cc71CB6C6b2dff5873b70aB4B" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀éMo é 🚀 MMo🚀 o éM🚀éoéoooéMo MM🚀éM o🚀🚀Mooo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061037a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c7565b60405180910390f35b610056610186565b61005e610186565b60408051606080820183526000808352828401829052733ff1ab54931e2c62e348dfd4c21e92310efdfcfc6020808501919091528451928301909452603c808352929390929061027c90830139604083810191909152918352508051606080820183528183018190526001825273a3b978f4ba46782f418199c188d697462cadee5f602080840191909152835191820190935260398082529192600092906102b890830139604083015250808260016020020152506101356040805160608082018352600080835260208301529181019190915290565b6000808252738f04da46cd8c340cc71cb6c6b2dff5873b70ab4b6020808401919091526040805160808101909152605480825290916102f19083013960408301525080826002602002015250919050565b60405180606001604052806003905b604080516060808201835260008083526020830152918101919091528152602001906001900390816101955790505090565b602080825260009060808382018185018685805b600381101561026d57601f19898503810186528351805115158652888101516001600160a01b031689870152604090810151606091870182905280519187018290529084905b8082101561023e578282018b01518883018b0152908a0190610221565b8082111561024e57858a828a0101525b978a0197601f01909216959095018701945050918601916001016101db565b50919897505050505050505056fe4d6f6f20c3a9f09f9a806f6ff09f9a806f4d204dc3a9c3a94d6f6f4d6f6ff09f9a80204dc3a9c3a96f6f4d6f20c3a94d4dc3a96fc3a9f09f9a806f4d4d6f6f20c3a9f09f9a80c3a9f09f9a8020f09f9a80204d206f2020204df09f9a806ff09f9a806f6f4d4d6f6fc3a9c3a9206f6f6f20c3a96f6f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a94d6f20c3a920f09f9a80204d4d6ff09f9a80206f20c3a94df09f9a80c3a96fc3a96f6f6fc3a94d6f204d4df09f9a80c3a94d206ff09f9a80f09f9a804d6f6f6fa2646970667358221220517c094f24959cdbb2a7e5d2d2d58673abd3e2834b07d7626cbbce1bc4e82cbd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bacf6b24 {\n bool s_0;\n address s_1;\n string s_2;\n }\n\n function test () public pure returns (S_bacf6b24[3] memory) {\n S_bacf6b24[3] memory r;\n {\n S_bacf6b24 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x3ff1AB54931E2C62e348dfD4C21e92310eFDFCFc;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀oo🚀oM MééMooMoo🚀 MééooMo éMMéoé🚀oM\";\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_bacf6b24 memory r_1;\n {\n bool r_1_0 = true;\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0xA3b978f4Ba46782f418199C188D697462cADeE5f;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀é🚀 🚀 M o M🚀o🚀ooMMooéé ooo éoo\";\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_bacf6b24 memory r_2;\n {\n bool r_2_0 = false;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x8F04da46cd8C340Cc71CB6C6b2dff5873b70aB4B;\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀🚀🚀éMo é 🚀 MMo🚀 o éM🚀éoéoooéMo MM🚀éM o🚀🚀Mooo\";\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ff1ab54931e2c62e348dfd4c21e92310efdfcfc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806f6ff09f9a806f4d204dc3a9c3a94d6f6f4d6f6ff09f9a80204dc3a9c3a96f6f4d6f20c3a94d4dc3a96fc3a9f09f9a806f4d000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a3b978f4ba46782f418199c188d697462cadee5f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80c3a9f09f9a8020f09f9a80204d206f2020204df09f9a806ff09f9a806f6f4d4d6f6fc3a9c3a9206f6f6f20c3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f04da46cd8c340cc71cb6c6b2dff5873b70ab4b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a94d6f20c3a920f09f9a80204d4d6ff09f9a80206f20c3a94df09f9a80c3a96fc3a96f6f6fc3a94d6f204d4df09f9a80c3a94d206ff09f9a80f09f9a804d6f6f6f000000000000000000000000" + }, + { + "name": "random-(bool,bool,bytes15,bool)", + "type": "(bool,bool,bytes15,bool)", + "value": [false, true, "0x62d4eec5efbab350363994b902a26c", false], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x62d4eec5efbab350363994b902a26c" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060f88061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051608080820183526000808352602080840182905283850182905260609384018290528451808401865282815280850183815260018284019081526e18b53bb17beeacd40d8e652e40a89b608a1b9288019283528751948552511515928401929092525170ffffffffffffffffffffffffffffffffff1916828601525115159281019290925291519081900390910190f3fea2646970667358221220d462c40bf615bcdf318545d61499a582cc32aea77f28b9a219cffd788a6fe0a364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4b507b4e {\n bool s_0;\n bool s_1;\n bytes15 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_4b507b4e memory) {\n S_4b507b4e memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n bytes15 r_2 = bytes15(0x62d4eec5efbab350363994b902a26c);\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000162d4eec5efbab350363994b902a26c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bool,int104[3])", + "type": "(bool,bool,int104[3])", + "value": [ + true, + true, + [ + "5518274814891216922217645970378", + "-355324295323054119925943105214", + "-4525577951850840940589507681966" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "5518274814891216922217645970378" + }, + { + "type": "number", + "value": "-355324295323054119925943105214" + }, + { + "type": "number", + "value": "-4525577951850840940589507681966" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610179806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f6565b60405180910390f35b6100566100b4565b61005e6100b4565b600180825260208201526100706100d8565b6c45a681f10ddae88f340a7993ca81526c047c1d5e464e8b3aae6aa7f6bd1960208201526c391eee57a5758561bb32381ead19604080830191909152820152919050565b60408051606081018252600080825260208201529081016100d36100d8565b905290565b60405180606001604052806003906020820280368337509192915050565b81511515815260208083015115158183015260408084015160a084019291840160005b6003811015610139578251600c0b82529183019190830190600101610119565b505050509291505056fea264697066735822122088b69861f3e5c952d9019508078efdd22d9962498526f824c8ac2ab408d3e17d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_564f7ea7 {\n bool s_0;\n bool s_1;\n int104[3] s_2;\n }\n\n function test () public pure returns (S_564f7ea7 memory) {\n S_564f7ea7 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n int104[3] memory r_2;\n {\n int104 r_2_0 = 5518274814891216922217645970378;\n r_2[0] = r_2_0;\n }\n {\n int104 r_2_1 = -355324295323054119925943105214;\n r_2[1] = r_2_1;\n }\n {\n int104 r_2_2 = -4525577951850840940589507681966;\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000045a681f10ddae88f340a7993cafffffffffffffffffffffffffffffffffffffffb83e2a1b9b174c55195580942ffffffffffffffffffffffffffffffffffffffc6e111a85a8a7a9e44cdc7e152" + }, + { + "name": "random-(bool,bool[1],bytes13)", + "type": "(bool,bool[1],bytes13)", + "value": [true, [true], "0xaef6ffbd7d705b1f57154635dd"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xaef6ffbd7d705b1f57154635dd" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061016a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d5565b60405180910390f35b61005661008e565b61005e61008e565b6001815261006a6100b7565b6001815260208201526caef6ffbd7d705b1f57154635dd60981b6040820152919050565b60405180606001604052806000151581526020016100aa6100b7565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b81511515815260208083015160608301919081840160005b600181101561010c5782511515825291830191908301906001016100ed565b5050505060409283015172ffffffffffffffffffffffffffffffffffffff191691909201529056fea2646970667358221220b0cf8180785f7652375130d06f272c2c051a54f9744a62691d6bd9ddbc606a1464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bbff13cb {\n bool s_0;\n bool[1] s_1;\n bytes13 s_2;\n }\n\n function test () public pure returns (S_bbff13cb memory) {\n S_bbff13cb memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bool[1] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n bytes13 r_2 = bytes13(0xaef6ffbd7d705b1f57154635dd);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001aef6ffbd7d705b1f57154635dd00000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bytes13,string,bytes25)", + "type": "(bool,bytes13,string,bytes25)", + "value": [ + true, + "0xc93c695a4286f8eb4d151b663e", + "Moo é🚀Moo🚀ooooM", + "0xaf423a6449df997e4b8f8a5663be9ce2335aa1b8a8626b7bb1" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xc93c695a4286f8eb4d151b663e" + }, + { + "type": "string", + "value": "Moo é🚀Moo🚀ooooM" + }, + { + "type": "hexstring", + "value": "0xaf423a6449df997e4b8f8a5663be9ce2335aa1b8a8626b7bb1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101bd806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b604080516080808201835260008083526020808401829052606084860181905293840182905284519283018552828501848152938301918252600183526c649e34ad21437c75a68a8db31f60991b83820152845180860190955260168552754d6f6f20c3a9f09f9a804d6f6ff09f9a806f6f6f6f4d60501b90850152929091527faf423a6449df997e4b8f8a5663be9ce2335aa1b8a8626b7bb1000000000000009091526040516100e191906100ea565b60405180910390f35b6000602080835283511515818401526cffffffffffffffffffffffffff60981b8185015116604084015260408401516080606085015280518060a086015260005b818110156101475782810184015186820160c00152830161012b565b8181111561015957600060c083880101525b50606086015166ffffffffffffff19811660808701529250601f01601f19169390930160c00194935050505056fea2646970667358221220b4bc28e214ab12b4d0ccb8bb381db6dde57af494a07bb68974878c110ac83a3264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_34af8850 {\n bool s_0;\n bytes13 s_1;\n string s_2;\n bytes25 s_3;\n }\n\n function test () public pure returns (S_34af8850 memory) {\n S_34af8850 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes13 r_1 = bytes13(0xc93c695a4286f8eb4d151b663e);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀Moo🚀ooooM\";\n r.s_2 = r_2;\n }\n {\n bytes25 r_3 = bytes25(0xaf423a6449df997e4b8f8a5663be9ce2335aa1b8a8626b7bb1);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001c93c695a4286f8eb4d151b663e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080af423a6449df997e4b8f8a5663be9ce2335aa1b8a8626b7bb10000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a804d6f6ff09f9a806f6f6f6f4d00000000000000000000" + }, + { + "name": "random-(bool,bytes2,string[1])", + "type": "(bool,bytes2,string[1])", + "value": [ + true, + "0x88f6", + ["Moo é🚀 🚀Moo🚀oé🚀🚀éM o oMM 🚀🚀🚀 ooé🚀🚀🚀Mo o🚀Mo🚀éMo🚀🚀oéoM 🚀oM"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x88f6" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀Moo🚀oé🚀🚀éM o oMM 🚀🚀🚀 ooé🚀🚀🚀Mo o🚀Mo🚀éMo🚀🚀oéoM 🚀oM" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610240806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e8565b60405180910390f35b61005661009d565b61005e61009d565b6001815261447b60f11b60208201526100756100c1565b60006040518060a0016040528060728152602001610199607291398252506040820152919050565b60408051606081018252600080825260208201529081016100bc6100c1565b905290565b60405180602001604052806001905b60608152602001906001900390816100d05790505090565b60208082528251151582820152828101516001600160f01b0319166040808401919091528301516060808401526000919060a08401906080850184805b600181101561018b57878503607f1901835283518051808752835b8181101561015b578281018901518882018a01528801610140565b8181111561016b578489838a0101525b50601f01601f191695909501860194509285019291850191600101610125565b509297965050505050505056fe4d6f6f20c3a9f09f9a8020f09f9a804d6f6ff09f9a806fc3a9f09f9a80f09f9a80c3a94d206f206f4d4d20202020f09f9a80f09f9a80f09f9a80206f6fc3a9f09f9a80f09f9a80f09f9a804d6f206ff09f9a804d6ff09f9a80c3a94d6ff09f9a80f09f9a806fc3a96f4d2020f09f9a806f4da26469706673582212209ac7c8d0dad242bb11cf98f15c7542c14963a482cc9a8a42e2f74bad1b56780b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1b88010c {\n bool s_0;\n bytes2 s_1;\n string[1] s_2;\n }\n\n function test () public pure returns (S_1b88010c memory) {\n S_1b88010c memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes2 r_1 = bytes2(0x88f6);\n r.s_1 = r_1;\n }\n {\n string[1] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 🚀Moo🚀oé🚀🚀éM o oMM 🚀🚀🚀 ooé🚀🚀🚀Mo o🚀Mo🚀éMo🚀🚀oéoM 🚀oM\";\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000188f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000724d6f6f20c3a9f09f9a8020f09f9a804d6f6ff09f9a806fc3a9f09f9a80f09f9a80c3a94d206f206f4d4d20202020f09f9a80f09f9a80f09f9a80206f6fc3a9f09f9a80f09f9a80f09f9a804d6f206ff09f9a804d6ff09f9a80c3a94d6ff09f9a80f09f9a806fc3a96f4d2020f09f9a806f4d0000000000000000000000000000" + }, + { + "name": "random-(bool,bytes5,address,address)", + "type": "(bool,bytes5,address,address)", + "value": [ + true, + "0xf135be1b59", + "0x5e9881D485692b5c06C6196363d89F79532cc55f", + "0x43ea67Fe9580b4Ecda71Dc3ce17bfB31A34012C1" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xf135be1b59" + }, + { + "type": "address", + "value": "0x5e9881D485692b5c06C6196363d89F79532cc55f" + }, + { + "type": "address", + "value": "0x43ea67Fe9580b4Ecda71Dc3ce17bfB31A34012C1" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061011a8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60408051608080820183526000808352602080840182905283850182905260609384019190915283518083018552600180825264f135be1b5960d81b828401908152735e9881d485692b5c06c6196363d89f79532cc55f8388019081527343ea67fe9580b4ecda71dc3ce17bfb31a34012c1938701938452875192835290516001600160d81b0319169382019390935291516001600160a01b03908116838701529051169281019290925291519081900390910190f3fea264697066735822122031c635ec5d8006aeb9a975878ceae49081832867dad5e4d9d7720f6a2d839ee064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d02b0925 {\n bool s_0;\n bytes5 s_1;\n address s_2;\n address s_3;\n }\n\n function test () public pure returns (S_d02b0925 memory) {\n S_d02b0925 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes5 r_1 = bytes5(0xf135be1b59);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x5e9881D485692b5c06C6196363d89F79532cc55f;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x43ea67Fe9580b4Ecda71Dc3ce17bfB31A34012C1;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001f135be1b590000000000000000000000000000000000000000000000000000000000000000000000000000005e9881d485692b5c06c6196363d89f79532cc55f00000000000000000000000043ea67fe9580b4ecda71dc3ce17bfb31a34012c1" + }, + { + "name": "random-(bool,bytes6,bytes31,string)", + "type": "(bool,bytes6,bytes31,string)", + "value": [ + true, + "0x665c5be9c075", + "0x4cbd0773ee164c2d04920d53bc57bc70762939bd289e0e5231d22ada2c53d4", + "Moo é🚀oo MoéM M MMoéM o oé🚀🚀é M🚀oo🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x665c5be9c075" + }, + { + "type": "hexstring", + "value": "0x4cbd0773ee164c2d04920d53bc57bc70762939bd289e0e5231d22ada2c53d4" + }, + { + "type": "string", + "value": "Moo é🚀oo MoéM M MMoéM o oé🚀🚀é M🚀oo🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101da806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100df565b60405180910390f35b6040805160808082018352600080835260208084018290528385018290526060808501819052855193840186528381018190526001845265665c5be9c07560d01b848301527f4cbd0773ee164c2d04920d53bc57bc70762939bd289e0e5231d22ada2c53d4008487015285519081019095526039808652939492939192919061016c90830139606083015250919050565b60006020808352835115158184015265ffffffffffff60d01b8185015116604084015260ff196040850151166060840152606084015160808085015280518060a086015260005b818110156101425782810184015186820160c001528301610126565b8181111561015457600060c083880101525b50601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a806f6f20204d6fc3a94d204d204d4d6fc3a94d206f206fc3a9f09f9a80f09f9a80c3a920204df09f9a806f6ff09f9a80a264697066735822122008d694fcc699b73240b0839758625a9f6a9b523400ac018a745d5dd8e0e28c2064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b06595dd {\n bool s_0;\n bytes6 s_1;\n bytes31 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_b06595dd memory) {\n S_b06595dd memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes6 r_1 = bytes6(0x665c5be9c075);\n r.s_1 = r_1;\n }\n {\n bytes31 r_2 = bytes31(0x4cbd0773ee164c2d04920d53bc57bc70762939bd289e0e5231d22ada2c53d4);\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀oo MoéM M MMoéM o oé🚀🚀é M🚀oo🚀\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001665c5be9c07500000000000000000000000000000000000000000000000000004cbd0773ee164c2d04920d53bc57bc70762939bd289e0e5231d22ada2c53d400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f6f20204d6fc3a94d204d204d4d6fc3a94d206f206fc3a9f09f9a80f09f9a80c3a920204df09f9a806f6ff09f9a8000000000000000" + }, + { + "name": "random-(bool,int72[3][3])", + "type": "(bool,int72[3][3])", + "value": [ + false, + [ + ["-469523500842795952569", "1715605563778212810349", "1282964569406326277452"], + ["-2120292836351887402143", "991018991968929137160", "-2167241917488128487456"], + ["-839886152467685653407", "446823552623442692806", "-386855643523408721586"] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-469523500842795952569" + }, + { + "type": "number", + "value": "1715605563778212810349" + }, + { + "type": "number", + "value": "1282964569406326277452" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2120292836351887402143" + }, + { + "type": "number", + "value": "991018991968929137160" + }, + { + "type": "number", + "value": "-2167241917488128487456" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-839886152467685653407" + }, + { + "type": "number", + "value": "446823552623442692806" + }, + { + "type": "number", + "value": "-386855643523408721586" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610235806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610190565b60405180910390f35b610056610124565b61005e610124565b6000815261006a610145565b610072610172565b681973f2905fd8ac69b8198152685d00cf5a96a423ce6d602082015268458cb5c66ffc11854c604082015281526100a7610172565b6872f0f95cde7fb1e49e1981526835b926ba8d55b7420860208083019190915268757c86016a6856701f1960408301528201526100e2610172565b682d87c305c305f93b9e198152681838ec25bd065c8ac66020808301919091526814f8b35622afebf6b119604080840191909152830191909152820152919050565b6040518060400160405280600015158152602001610140610145565b905290565b60405180606001604052806003905b61015c610172565b8152602001906001900390816101545790505090565b60405180606001604052806003906020820280368337509192915050565b815115158152602080830151610140830191908184016000805b60038082106101b957506101f4565b845184845b838110156101dd57825160080b825291880191908801906001016101be565b5050509385019350606092909201916001016101aa565b50505050509291505056fea2646970667358221220d547ec7e9a3ca2c1f2a0933c59653ae5ae1cce1d4ff51c83a2ee34409a4277b264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6d27caff {\n bool s_0;\n int72[3][3] s_1;\n }\n\n function test () public pure returns (S_6d27caff memory) {\n S_6d27caff memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int72[3][3] memory r_1;\n {\n int72[3] memory r_1_0;\n {\n int72 r_1_0_0 = -469523500842795952569;\n r_1_0[0] = r_1_0_0;\n }\n {\n int72 r_1_0_1 = 1715605563778212810349;\n r_1_0[1] = r_1_0_1;\n }\n {\n int72 r_1_0_2 = 1282964569406326277452;\n r_1_0[2] = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n {\n int72[3] memory r_1_1;\n {\n int72 r_1_1_0 = -2120292836351887402143;\n r_1_1[0] = r_1_1_0;\n }\n {\n int72 r_1_1_1 = 991018991968929137160;\n r_1_1[1] = r_1_1_1;\n }\n {\n int72 r_1_1_2 = -2167241917488128487456;\n r_1_1[2] = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n {\n int72[3] memory r_1_2;\n {\n int72 r_1_2_0 = -839886152467685653407;\n r_1_2[0] = r_1_2_0;\n }\n {\n int72 r_1_2_1 = 446823552623442692806;\n r_1_2[1] = r_1_2_1;\n }\n {\n int72 r_1_2_2 = -386855643523408721586;\n r_1_2[2] = r_1_2_2;\n }\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffe68c0d6fa02753964700000000000000000000000000000000000000000000005d00cf5a96a423ce6d0000000000000000000000000000000000000000000000458cb5c66ffc11854cffffffffffffffffffffffffffffffffffffffffffffff8d0f06a321804e1b61000000000000000000000000000000000000000000000035b926ba8d55b74208ffffffffffffffffffffffffffffffffffffffffffffff8a8379fe9597a98fe0ffffffffffffffffffffffffffffffffffffffffffffffd2783cfa3cfa06c46100000000000000000000000000000000000000000000001838ec25bd065c8ac6ffffffffffffffffffffffffffffffffffffffffffffffeb074ca9dd5014094e" + }, + { + "name": "random-(bool,int80,address,(string))", + "type": "(bool,int80,address,(string))", + "value": [ + false, + "573446689183696551567915", + "0x3EdFA9e023Fb38c5815D2170A3478b954dd1E4A3", + ["Moo é🚀o é"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "573446689183696551567915" + }, + { + "type": "address", + "value": "0x3EdFA9e023Fb38c5815D2170A3478b954dd1E4A3" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o é" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101e1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610119565b60405180910390f35b6100566100d0565b61005e6100d0565b6000815269796e9b78b9cc964a622b602080830191909152733edfa9e023fb38c5815d2170a3478b954dd1e4a3604080840191909152805191820190526060815260408051808201909152600e81526d4d6f6f20c3a9f09f9a806f20c3a960901b602082015281526060820152919050565b6040518060800160405280600015158152602001600060090b815260200160006001600160a01b031681526020016101146040518060200160405280606081525090565b905290565b6000602080835283511515818401528084015160090b604084015260018060a01b0360408501511660608401526060840151608080850152805190508160a085015280518060c086015260005b818110156101825782810184015186820160e001528301610166565b8181111561019457600060e083880101525b50601f01601f19169390930160e00194935050505056fea2646970667358221220c8e8a8c9c2d240a403d1120e021f45b28a5491cf3a7c2cbacf49cee1e5fa2ae664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_030b0ee7 {\n bool s_0;\n int80 s_1;\n address s_2;\n S_97fc4627 s_3;\n }\n\n function test () public pure returns (S_030b0ee7 memory) {\n S_030b0ee7 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int80 r_1 = 573446689183696551567915;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x3EdFA9e023Fb38c5815D2170A3478b954dd1E4A3;\n r.s_2 = r_2;\n }\n {\n S_97fc4627 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀o é\";\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000796e9b78b9cc964a622b0000000000000000000000003edfa9e023fb38c5815d2170a3478b954dd1e4a300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a806f20c3a9000000000000000000000000000000000000" + }, + { + "name": "random-(bool,int80,uint128,bool)", + "type": "(bool,int80,uint128,bool)", + "value": [ + false, + "72467660412412256622728", + "206015650166593866837049100988678532182", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "72467660412412256622728" + }, + { + "type": "number", + "value": "206015650166593866837049100988678532182" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5060fe8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b604080516080808201835260008083526020808401829052838501829052606093840182905284518084018652828152808501838152690f587ad06af7fe3c98888284019081526f9afd2bc47b595f6adeefe5011081ec5692880192835287519485525160090b92840192909252516fffffffffffffffffffffffffffffffff16828601525115159281019290925291519081900390910190f3fea2646970667358221220fc530b8808a16daf282d4a75ad3fcc8f9cf899c9476752d4fdabd2967e09e11664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_909efdf8 {\n bool s_0;\n int80 s_1;\n uint128 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_909efdf8 memory) {\n S_909efdf8 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int80 r_1 = 72467660412412256622728;\n r.s_1 = r_1;\n }\n {\n uint128 r_2 = 206015650166593866837049100988678532182;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f587ad06af7fe3c9888000000000000000000000000000000009afd2bc47b595f6adeefe5011081ec560000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string,string)[3]", + "type": "(bool,string,string)[3]", + "value": [ + [false, "Moo é🚀M oo", "Moo é🚀M é oM M o🚀🚀M🚀MoM🚀é é🚀 oé🚀🚀éé🚀éoo🚀Mo🚀M o"], + [ + true, + "Moo é🚀oéoooéo🚀 🚀oo MMooM o ooM🚀 éMo🚀🚀oo🚀M🚀M🚀🚀 🚀éM🚀o", + "Moo é🚀ooo ooooé oMo🚀M o" + ], + [ + true, + "Moo é🚀o🚀🚀 Méooé 🚀 o🚀oMoMM M 🚀oooo🚀oM o🚀 ooo", + "Moo é🚀M🚀é🚀éoéo éooééo M🚀M o 🚀oo🚀🚀🚀🚀éooMoéo" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M oo" + }, + { + "type": "string", + "value": "Moo é🚀M é oM M o🚀🚀M🚀MoM🚀é é🚀 oé🚀🚀éé🚀éoo🚀Mo🚀M o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀oéoooéo🚀 🚀oo MMooM o ooM🚀 éMo🚀🚀oo🚀M🚀M🚀🚀 🚀éM🚀o" + }, + { + "type": "string", + "value": "Moo é🚀ooo ooooé oMo🚀M o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀 Méooé 🚀 o🚀oMoMM M 🚀oooo🚀oM o🚀 ooo" + }, + { + "type": "string", + "value": "Moo é🚀M🚀é🚀éoéo éooééo M🚀M o 🚀oo🚀🚀🚀🚀éooMoéo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610465806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610262565b60405180910390f35b6100566101ca565b61005e6101ca565b610084604051806060016040528060001515815260200160608152602001606081525090565b6000808252604080518082018252600e81526d4d6f6f20c3a9f09f9a804d206f6f60901b602080830191909152808501919091528151608081019092526059808352906102e39083013960408381019190915291835250805160608082018352600082526020820181905291810191909152600181526040805160808101909152605c8082526000919061038660208301396020838101919091526040805180820182528281527f4d6f6f20c3a9f09f9a806f6f6f206f6f6f6fc3a920206f4d6ff09f9a804d206f8184015281850152848201939093528251606080820185528183018190528185015260018152835160808101909452604a8085529093600093509161033c9083013990508082602001819052505060006040518060800160405280604e81526020016103e2604e913960408301525080826002602002015250919050565b60405180606001604052806003905b6101ff604051806060016040528060001515815260200160608152602001606081525090565b8152602001906001900390816101d95790505090565b6000815180845260005b8181101561023b5760208185018101518683018201520161021f565b8181111561024d576000602083870101525b50601f01601f19169290920160200192915050565b60208082526000906080830183820185845b60038110156102d657601f19878503018352815160608151151586528682015181888801526102a582880182610215565b915050604080830151925086820381880152506102c28183610215565b955050509184019190840190600101610274565b5091969550505050505056fe4d6f6f20c3a9f09f9a804d20c3a9206f4d20204d20206ff09f9a80f09f9a804df09f9a804d6f4df09f9a80c3a920c3a9f09f9a80206fc3a9f09f9a80f09f9a80c3a9c3a9f09f9a80c3a96f6ff09f9a804d6ff09f9a804d206f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80204dc3a96f6fc3a920f09f9a8020206ff09f9a806f4d6f4d4d204d2020f09f9a806f6f6f6ff09f9a806f4d2020206ff09f9a80206f6f6f4d6f6f20c3a9f09f9a806fc3a96f6f6fc3a96ff09f9a8020f09f9a806f6f204d4d6f6f4d206f206f6f4df09f9a8020c3a94d6ff09f9a80f09f9a806f6ff09f9a804df09f9a804df09f9a80f09f9a8020f09f9a80c3a94df09f9a806f4d6f6f20c3a9f09f9a804df09f9a80c3a9f09f9a80c3a96fc3a96f20c3a96f6fc3a9c3a96f204df09f9a804d206f20f09f9a806f6ff09f9a80f09f9a80f09f9a80f09f9a80c3a96f6f4d6fc3a96fa26469706673582212200df76f36d6476ec735549593ab66e559dd50918056736d268d00603dc777c17364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_21333ac5 {\n bool s_0;\n string s_1;\n string s_2;\n }\n\n function test () public pure returns (S_21333ac5[3] memory) {\n S_21333ac5[3] memory r;\n {\n S_21333ac5 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀M oo\";\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀M é oM M o🚀🚀M🚀MoM🚀é é🚀 oé🚀🚀éé🚀éoo🚀Mo🚀M o\";\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_21333ac5 memory r_1;\n {\n bool r_1_0 = true;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oéoooéo🚀 🚀oo MMooM o ooM🚀 éMo🚀🚀oo🚀M🚀M🚀🚀 🚀éM🚀o\";\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀ooo ooooé oMo🚀M o\";\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_21333ac5 memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀o🚀🚀 Méooé 🚀 o🚀oMoMM M 🚀oooo🚀oM o🚀 ooo\";\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀M🚀é🚀éoéo éooééo M🚀M o 🚀oo🚀🚀🚀🚀éooMoéo\";\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a804d206f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a804d20c3a9206f4d20204d20206ff09f9a80f09f9a804df09f9a804d6f4df09f9a80c3a920c3a9f09f9a80206fc3a9f09f9a80f09f9a80c3a9c3a9f09f9a80c3a96f6ff09f9a804d6ff09f9a804d206f000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806fc3a96f6f6fc3a96ff09f9a8020f09f9a806f6f204d4d6f6f4d206f206f6f4df09f9a8020c3a94d6ff09f9a80f09f9a806f6ff09f9a804df09f9a804df09f9a80f09f9a8020f09f9a80c3a94df09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a806f6f6f206f6f6f6fc3a920206f4d6ff09f9a804d206f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80204dc3a96f6fc3a920f09f9a8020206ff09f9a806f4d6f4d4d204d2020f09f9a806f6f6f6ff09f9a806f4d2020206ff09f9a80206f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a804df09f9a80c3a9f09f9a80c3a96fc3a96f20c3a96f6fc3a9c3a96f204df09f9a804d206f20f09f9a806f6ff09f9a80f09f9a80f09f9a80f09f9a80c3a96f6f4d6fc3a96f000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string,string)[4]", + "type": "(bool,string,string)[4]", + "value": [ + [ + false, + "Moo é🚀Mé oM 🚀M Moéé", + "Moo é🚀é é🚀M🚀 o oMéMo M é🚀ooooM🚀oo ooo🚀🚀 ééo🚀oo🚀🚀éoMé🚀Moé ooM" + ], + [ + true, + "Moo é🚀M🚀 🚀🚀 🚀éé🚀oMMooo oMMooéo🚀é 🚀éoMoo🚀MoéM oo🚀 o", + "Moo é🚀oé o🚀oéoM🚀🚀Moo M oMoooé ooo 🚀 éM🚀 MMéoéo Mo🚀oo🚀M🚀ooo" + ], + [true, "Moo é🚀", "Moo é🚀oéo é🚀M🚀ooéoMooéoé🚀éoo🚀Moo"], + [true, "Moo é🚀MéooooMéooo MéooMo ooooMéoooM o🚀oé MMooo🚀MooM", "Moo é🚀M "] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀Mé oM 🚀M Moéé" + }, + { + "type": "string", + "value": "Moo é🚀é é🚀M🚀 o oMéMo M é🚀ooooM🚀oo ooo🚀🚀 ééo🚀oo🚀🚀éoMé🚀Moé ooM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀M🚀 🚀🚀 🚀éé🚀oMMooo oMMooéo🚀é 🚀éoMoo🚀MoéM oo🚀 o" + }, + { + "type": "string", + "value": "Moo é🚀oé o🚀oéoM🚀🚀Moo M oMoooé ooo 🚀 éM🚀 MMéoéo Mo🚀oo🚀M🚀ooo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oéo é🚀M🚀ooéoMooéoé🚀éoo🚀Moo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀MéooooMéooo MéooMo ooooMéoooM o🚀oé MMooo🚀MooM" + }, + { + "type": "string", + "value": "Moo é🚀M " + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610537806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102ec565b60405180910390f35b610056610254565b61005e610254565b610084604051806060016040528060001515815260200160608152602001606081525090565b6000808252604080518082018252601d81527f4d6f6f20c3a9f09f9a804dc3a9206f4d20f09f9a804d204d6fc3a9c3a900000060208083019190915280850191909152815160a0810190925260688083529061040d9083013960408381019190915291835250805160608082018352600082526020820181905291810191909152600181526040805160808101909152605780825260009190610475602083013990508082602001819052505060006040518060800160405280605e815260200161036d605e913960408301525080826001602002018190525050610185604051806060016040528060001515815260200160608152602001606081525090565b60018152604080518082018252600a8152689adede418753e13f3560b71b602080830191909152808401919091528151606081019092526036808352600092916104cc9083013960408381019190915283810192909252508051606080820183526000825260208201819052918101919091526001815260408051608081019091526042808252600091906103cb6020830139602083810191909152604080518082018252600d81526c026b7b79061d4f84fcd4026901609d1b92810192909252830152506060820152919050565b60405180608001604052806004905b610289604051806060016040528060001515815260200160608152602001606081525090565b8152602001906001900390816102635790505090565b6000815180845260005b818110156102c5576020818501810151868301820152016102a9565b818111156102d7576000602083870101525b50601f01601f19169290920160200192915050565b602080825260009060a0830183820185845b600481101561036057601f198785030183528151606081511515865286820151818888015261032f8288018261029f565b9150506040808301519250868203818801525061034c818361029f565b9550505091840191908401906001016102fe565b5091969550505050505056fe4d6f6f20c3a9f09f9a806fc3a9206ff09f9a806fc3a96f4df09f9a80f09f9a804d6f6f204d20206f4d6f6f6fc3a9206f6f6f20f09f9a8020c3a94df09f9a80204d4dc3a96fc3a96f20204d6ff09f9a806f6ff09f9a804df09f9a806f6f6f4d6f6f20c3a9f09f9a804dc3a96f6f6f6f4dc3a96f6f6f204dc3a96f6f4d6f206f6f6f6f4dc3a96f6f6f4d206ff09f9a806fc3a9204d4d6f6f6ff09f9a804d6f6f4d4d6f6f20c3a9f09f9a80c3a920c3a9f09f9a804df09f9a80206f206f4dc3a94d6f204d20c3a9f09f9a806f6f6f6f4df09f9a806f6f20206f6f6ff09f9a80f09f9a8020c3a9c3a96ff09f9a806f6ff09f9a80f09f9a80c3a96f4dc3a9f09f9a804d6fc3a9206f6f4d4d6f6f20c3a9f09f9a804df09f9a8020f09f9a80f09f9a8020f09f9a80c3a9c3a9f09f9a806f4d4d6f6f6f206f4d4d6f6fc3a96ff09f9a80c3a920f09f9a80c3a96f4d6f6ff09f9a804d6fc3a94d206f6ff09f9a80206f4d6f6f20c3a9f09f9a806fc3a96f20c3a9f09f9a804df09f9a806f6fc3a96f4d6f6fc3a96fc3a9f09f9a80c3a96f6ff09f9a804d6f6fa264697066735822122022508cff67ff2096dcbf9999526ca7fdb7781cfd51db0db76f421aec9a850c0764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_21333ac5 {\n bool s_0;\n string s_1;\n string s_2;\n }\n\n function test () public pure returns (S_21333ac5[4] memory) {\n S_21333ac5[4] memory r;\n {\n S_21333ac5 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀Mé oM 🚀M Moéé\";\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀é é🚀M🚀 o oMéMo M é🚀ooooM🚀oo ooo🚀🚀 ééo🚀oo🚀🚀éoMé🚀Moé ooM\";\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_21333ac5 memory r_1;\n {\n bool r_1_0 = true;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀M🚀 🚀🚀 🚀éé🚀oMMooo oMMooéo🚀é 🚀éoMoo🚀MoéM oo🚀 o\";\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀oé o🚀oéoM🚀🚀Moo M oMoooé ooo 🚀 éM🚀 MMéoéo Mo🚀oo🚀M🚀ooo\";\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_21333ac5 memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀\";\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀oéo é🚀M🚀ooéoMooéoé🚀éoo🚀Moo\";\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_21333ac5 memory r_3;\n {\n bool r_3_0 = true;\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀MéooooMéooo MéooMo ooooMéoooM o🚀oé MMooo🚀MooM\";\n r_3.s_1 = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀M \";\n r_3.s_2 = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a804dc3a9206f4d20f09f9a804d204d6fc3a9c3a900000000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a80c3a920c3a9f09f9a804df09f9a80206f206f4dc3a94d6f204d20c3a9f09f9a806f6f6f6f4df09f9a806f6f20206f6f6ff09f9a80f09f9a8020c3a9c3a96ff09f9a806f6ff09f9a80f09f9a80c3a96f4dc3a9f09f9a804d6fc3a9206f6f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a804df09f9a8020f09f9a80f09f9a8020f09f9a80c3a9c3a9f09f9a806f4d4d6f6f6f206f4d4d6f6fc3a96ff09f9a80c3a920f09f9a80c3a96f4d6f6ff09f9a804d6fc3a94d206f6ff09f9a80206f000000000000000000000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a806fc3a9206ff09f9a806fc3a96f4df09f9a80f09f9a804d6f6f204d20206f4d6f6f6fc3a9206f6f6f20f09f9a8020c3a94df09f9a80204d4dc3a96fc3a96f20204d6ff09f9a806f6ff09f9a804df09f9a806f6f6f00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806fc3a96f20c3a9f09f9a804df09f9a806f6fc3a96f4d6f6fc3a96fc3a9f09f9a80c3a96f6ff09f9a804d6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a804dc3a96f6f6f6f4dc3a96f6f6f204dc3a96f6f4d6f206f6f6f6f4dc3a96f6f6f4d206ff09f9a806fc3a9204d4d6f6f6ff09f9a804d6f6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a804d202000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,uint104,int112)[2]", + "type": "(bool,uint104,int112)[2]", + "value": [ + [true, "10897960937677632658009027914659", "-2394508061600650218386443379130333"], + [false, "9623630749379145276203501536534", "1726005888073175465935752551617735"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "10897960937677632658009027914659" + }, + { + "type": "number", + "value": "-2394508061600650218386443379130333" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "9623630749379145276203501536534" + }, + { + "type": "number", + "value": "1726005888073175465935752551617735" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610115565b60405180910390f35b6100566100d6565b61005e6100d6565b6040805160608082018352600182526c898d3601069cdaf51c1f7e2ba36020808401919091526d760ef0d52871f3c5374f3547bfdc198385015291845282519081018352600081526c7977a0c73bc234ca143132c516818301526d551941cfc439765c332793fa54c792810192909252820152919050565b60405180604001604052806002905b60408051606081018252600080825260208083018290529282015282526000199092019101816100e55790505090565b60c08101818360005b600281101561016a5781518051151584526020808201516cffffffffffffffffffffffffff1681860152604091820151600d0b918501919091526060909301929091019060010161011e565b5050509291505056fea26469706673582212205c66438fbf1a2529a7b88d0a6f3f895e21bc80a24bad72b24f6f8b830874f7f564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c5e42c1b {\n bool s_0;\n uint104 s_1;\n int112 s_2;\n }\n\n function test () public pure returns (S_c5e42c1b[2] memory) {\n S_c5e42c1b[2] memory r;\n {\n S_c5e42c1b memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n uint104 r_0_1 = 10897960937677632658009027914659;\n r_0.s_1 = r_0_1;\n }\n {\n int112 r_0_2 = -2394508061600650218386443379130333;\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_c5e42c1b memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n uint104 r_1_1 = 9623630749379145276203501536534;\n r_1.s_1 = r_1_1;\n }\n {\n int112 r_1_2 = 1726005888073175465935752551617735;\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000898d3601069cdaf51c1f7e2ba3ffffffffffffffffffffffffffffffffffff89f10f2ad78e0c3ac8b0cab840230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007977a0c73bc234ca143132c516000000000000000000000000000000000000551941cfc439765c332793fa54c7" + }, + { + "name": "random-(bool[1],bool,bytes15)", + "type": "(bool[1],bool,bytes15)", + "value": [[false], false, "0xa3f5c43f26d42fadef5511241e072c"], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xa3f5c43f26d42fadef5511241e072c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061016a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d5565b60405180910390f35b610056610090565b61005e610090565b6100666100b7565b600080825290825260208201526e28fd710fc9b50beb7bd544490781cb608a1b6040820152919050565b60405180606001604052806100a36100b7565b815260006020820181905260409091015290565b60405180602001604052806001906020820280368337509192915050565b815160608201908260005b600181101561010157825115158252602092830192909101906001016100e0565b50505060208301511515602083015270ffffffffffffffffffffffffffffffffff1960408401511660408301529291505056fea26469706673582212206c162cda0cdda7511fdc608ed81dfe9e7cce7cb9e0dc782cd4e0df810489da8464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a7bf94ae {\n bool[1] s_0;\n bool s_1;\n bytes15 s_2;\n }\n\n function test () public pure returns (S_a7bf94ae memory) {\n S_a7bf94ae memory r;\n {\n bool[1] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n bytes15 r_2 = bytes15(0xa3f5c43f26d42fadef5511241e072c);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3f5c43f26d42fadef5511241e072c0000000000000000000000000000000000" + }, + { + "name": "random-(bytes1,int88,address)[]", + "type": "(bytes1,int88,address)[]", + "value": [ + ["0x81", "96689029473848888990791760", "0xe1877eE5EFda11f1ce8707D7C1190082AeF59851"], + ["0x80", "-25733286607684787728061739", "0x96037Ac61419eC955148dC2758bD1480D0E118f7"], + ["0xa5", "-53286608326278477675683081", "0x8B15f5751b99F08Fe39b70f91930Ff155b5aaA5c"], + ["0xee", "106315638705562431437430078", "0xc75e8C3C59D6FA8D4785584f8Ea8EA2859f4672f"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x81" + }, + { + "type": "number", + "value": "96689029473848888990791760" + }, + { + "type": "address", + "value": "0xe1877eE5EFda11f1ce8707D7C1190082AeF59851" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x80" + }, + { + "type": "number", + "value": "-25733286607684787728061739" + }, + { + "type": "address", + "value": "0x96037Ac61419eC955148dC2758bD1480D0E118f7" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa5" + }, + { + "type": "number", + "value": "-53286608326278477675683081" + }, + { + "type": "address", + "value": "0x8B15f5751b99F08Fe39b70f91930Ff155b5aaA5c" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xee" + }, + { + "type": "number", + "value": "106315638705562431437430078" + }, + { + "type": "address", + "value": "0xc75e8C3C59D6FA8D4785584f8Ea8EA2859f4672f" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610323806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610268565b60405180910390f35b60408051600480825260a0820190925260609160009190816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161006a57505060408051606081018252608160f81b81526a4ffab2ca61b01054767850602082015273e1877ee5efda11f1ce8707d7c1190082aef5985191810191909152815191925090819083906000906100ed576100ed6102d7565b60200260200101819052505061011c604080516060810182526000808252602082018190529181019190915290565b600160ff1b81526a15493c43239d906ec8952a1960208201527396037ac61419ec955148dc2758bd1480d0e118f760408201528151819083906001908110610166576101666102d7565b602002602001018190525050610195604080516060810182526000808252602082018190529181019190915290565b60a560f81b81526a2c13e0d359a77a90f6dd08196020820152738b15f5751b99f08fe39b70f91930ff155b5aaa5c604082015281518190839060029081106101df576101df6102d7565b60200260200101819052505061020e604080516060810182526000808252602082018190529181019190915290565b607760f91b81526a57f136529ba9e3d0c85d3e602082015273c75e8c3c59d6fa8d4785584f8ea8ea2859f4672f60408201528151819083906003908110610257576102576102d7565b602090810291909101015250919050565b602080825282518282018190526000919060409081850190868401855b828110156102ca57815180516001600160f81b031916855286810151600a0b878601528501516001600160a01b03168585015260609093019290850190600101610285565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212206a16ff614d76671fd070bf9e163f5fb60fd6843cd5acd3bbdc77e681eec0d8ec64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_64212798 {\n bytes1 s_0;\n int88 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_64212798[] memory) {\n S_64212798[] memory r = new S_64212798[](4);\n {\n S_64212798 memory r_0;\n {\n bytes1 r_0_0 = bytes1(0x81);\n r_0.s_0 = r_0_0;\n }\n {\n int88 r_0_1 = 96689029473848888990791760;\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0xe1877eE5EFda11f1ce8707D7C1190082AeF59851;\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_64212798 memory r_1;\n {\n bytes1 r_1_0 = bytes1(0x80);\n r_1.s_0 = r_1_0;\n }\n {\n int88 r_1_1 = -25733286607684787728061739;\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0x96037Ac61419eC955148dC2758bD1480D0E118f7;\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_64212798 memory r_2;\n {\n bytes1 r_2_0 = bytes1(0xa5);\n r_2.s_0 = r_2_0;\n }\n {\n int88 r_2_1 = -53286608326278477675683081;\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0x8B15f5751b99F08Fe39b70f91930Ff155b5aaA5c;\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_64212798 memory r_3;\n {\n bytes1 r_3_0 = bytes1(0xee);\n r_3.s_0 = r_3_0;\n }\n {\n int88 r_3_1 = 106315638705562431437430078;\n r_3.s_1 = r_3_1;\n }\n {\n address r_3_2 = 0xc75e8C3C59D6FA8D4785584f8Ea8EA2859f4672f;\n r_3.s_2 = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000481000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ffab2ca61b01054767850000000000000000000000000e1877ee5efda11f1ce8707d7c1190082aef598518000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffeab6c3bcdc626f91376ad500000000000000000000000096037ac61419ec955148dc2758bd1480d0e118f7a500000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffd3ec1f2ca658856f0922f70000000000000000000000008b15f5751b99f08fe39b70f91930ff155b5aaa5cee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057f136529ba9e3d0c85d3e000000000000000000000000c75e8c3c59d6fa8d4785584f8ea8ea2859f4672f" + }, + { + "name": "random-(bytes15,(bool[]))[4]", + "type": "(bytes15,(bool[]))[4]", + "value": [ + ["0x76ea9a2118b8e8b44b100354613c78", [[false]]], + ["0x521d2b5a20aef001aa1722cf09bb92", [[false]]], + ["0x5268bbd08e2c9c5e2e1a653eacc992", [[false, true, true]]], + ["0x96abde6d77951c8512311a136bb948", [[false]]] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x76ea9a2118b8e8b44b100354613c78" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x521d2b5a20aef001aa1722cf09bb92" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5268bbd08e2c9c5e2e1a653eacc992" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x96abde6d77951c8512311a136bb948" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610477806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061037f565b60405180910390f35b610056610334565b61005e610334565b610084604080518082018252600081528151602081810190935260608152909182015290565b6e0edd534423171d168962006a8c278f608b1b8152604080516020808201835260608252825160018082528185019094529192600092918281019080368337019050509050600080826000815181106100df576100df61042b565b911515602092830291909101820152918352508281019190915290825260408051808201825260008152815180840190925260608252918201526e290e95ad10577800d50b916784ddc960891b8152604080516020808201835260608252825160018082528185019094529192600092918281019080368337019050509050600080826000815181106101745761017461042b565b91151560209283029190910182015291835250820152808260016020020152506101ba604080518082018252600081528151602081810190935260608152909182015290565b6e29345de847164e2f170d329f5664c960891b815260408051602081018252606081528151600380825260808201909352909160009190816020016020820280368337019050509050600080826000815181106102195761021961042b565b6020026020010190151590811515815250505060006001905080826001815181106102465761024661042b565b6020026020010190151590811515815250505060006001905080826002815181106102735761027361042b565b91151560209283029190910182015291835250820152808260026020020152506102b9604080518082018252600081528151602081810190935260608152909182015290565b6e12d57bcdaef2a390a24623426d7729608b1b8152604080516020808201835260608252825160018082528185019094529192600092918281019080368337019050509050600080826000815181106103145761031461042b565b911515602092830291909101820152918352508201526060820152919050565b60405180608001604052806004905b610369604080518082018252600081528151602081810190935260608152909182015290565b8152602001906001900390816103435790505090565b602080825260009060a083018382018584805b600481101561041e57878503601f190184528251805170ffffffffffffffffffffffffffffffffff191686528601516040878701819052905190860187905280516060870181905290870190608087019084905b80821015610408578351151583529289019291890191600191909101906103e6565b5090965050509285019291850191600101610392565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220384bb9d92a4741326fd07869f2c46789419c74d6894edd83627960319b8abd5464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8761250c {\n bool[] s_0;\n }\n\n struct S_c73abf28 {\n bytes15 s_0;\n S_8761250c s_1;\n }\n\n function test () public pure returns (S_c73abf28[4] memory) {\n S_c73abf28[4] memory r;\n {\n S_c73abf28 memory r_0;\n {\n bytes15 r_0_0 = bytes15(0x76ea9a2118b8e8b44b100354613c78);\n r_0.s_0 = r_0_0;\n }\n {\n S_8761250c memory r_0_1;\n {\n bool[] memory r_0_1_0 = new bool[](1);\n {\n bool r_0_1_0_0 = false;\n r_0_1_0[0] = r_0_1_0_0;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_c73abf28 memory r_1;\n {\n bytes15 r_1_0 = bytes15(0x521d2b5a20aef001aa1722cf09bb92);\n r_1.s_0 = r_1_0;\n }\n {\n S_8761250c memory r_1_1;\n {\n bool[] memory r_1_1_0 = new bool[](1);\n {\n bool r_1_1_0_0 = false;\n r_1_1_0[0] = r_1_1_0_0;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_c73abf28 memory r_2;\n {\n bytes15 r_2_0 = bytes15(0x5268bbd08e2c9c5e2e1a653eacc992);\n r_2.s_0 = r_2_0;\n }\n {\n S_8761250c memory r_2_1;\n {\n bool[] memory r_2_1_0 = new bool[](3);\n {\n bool r_2_1_0_0 = false;\n r_2_1_0[0] = r_2_1_0_0;\n }\n {\n bool r_2_1_0_1 = true;\n r_2_1_0[1] = r_2_1_0_1;\n }\n {\n bool r_2_1_0_2 = true;\n r_2_1_0[2] = r_2_1_0_2;\n }\n r_2_1.s_0 = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n {\n S_c73abf28 memory r_3;\n {\n bytes15 r_3_0 = bytes15(0x96abde6d77951c8512311a136bb948);\n r_3.s_0 = r_3_0;\n }\n {\n S_8761250c memory r_3_1;\n {\n bool[] memory r_3_1_0 = new bool[](1);\n {\n bool r_3_1_0_0 = false;\n r_3_1_0[0] = r_3_1_0_0;\n }\n r_3_1.s_0 = r_3_1_0;\n }\n r_3.s_1 = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002a076ea9a2118b8e8b44b100354613c7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000521d2b5a20aef001aa1722cf09bb92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005268bbd08e2c9c5e2e1a653eacc992000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000196abde6d77951c8512311a136bb94800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes17,address,bytes16,bool)", + "type": "(bytes17,address,bytes16,bool)", + "value": [ + "0x48170a5c48afa3be449a40727fd5643079", + "0x94b6B060130928C8b377C14a7b94653145796F35", + "0xa9aa5ae79bf0bd24ef68dd3ef2bf9da2", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x48170a5c48afa3be449a40727fd5643079" + }, + { + "type": "address", + "value": "0x94b6B060130928C8b377C14a7b94653145796F35" + }, + { + "type": "hexstring", + "value": "0xa9aa5ae79bf0bd24ef68dd3ef2bf9da2" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101288061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160808082018352600080835260208084018290528385018290526060938401829052845180840186528085019283527048170a5c48afa3be449a40727fd564307960781b8082527394b6b060130928c8b377c14a7b94653145796f358284019081526f54d52d73cdf85e9277b46e9f795fced160811b9288019283528751918252516001600160a01b031692810192909252516fffffffffffffffffffffffffffffffff191694810194909452511515918301919091520160405180910390f3fea2646970667358221220ae3394d61938fe762200f97a62b8f244c755b22c48a8b6425d07f398805346a264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e7470650 {\n bytes17 s_0;\n address s_1;\n bytes16 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_e7470650 memory) {\n S_e7470650 memory r;\n {\n bytes17 r_0 = bytes17(0x48170a5c48afa3be449a40727fd5643079);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x94b6B060130928C8b377C14a7b94653145796F35;\n r.s_1 = r_1;\n }\n {\n bytes16 r_2 = bytes16(0xa9aa5ae79bf0bd24ef68dd3ef2bf9da2);\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x48170a5c48afa3be449a40727fd564307900000000000000000000000000000000000000000000000000000094b6b060130928c8b377c14a7b94653145796f35a9aa5ae79bf0bd24ef68dd3ef2bf9da2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes17,address,uint240,int192)", + "type": "(bytes17,address,uint240,int192)", + "value": [ + "0xa051f98fa586568b0cb29ae0670495a38d", + "0x3b00623d7d2B42B61d4064EECd30251F12dea20f", + "1526330976129365742050149646219554567058825406442603186021962681683462418", + "8785641400664625891243227832234213859652494747302520167" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa051f98fa586568b0cb29ae0670495a38d" + }, + { + "type": "address", + "value": "0x3b00623d7d2B42B61d4064EECd30251F12dea20f" + }, + { + "type": "number", + "value": "1526330976129365742050149646219554567058825406442603186021962681683462418" + }, + { + "type": "number", + "value": "8785641400664625891243227832234213859652494747302520167" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101478061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160808082018352600080835260208084018290528385018290526060938401919091528351808301855270a051f98fa586568b0cb29ae0670495a38d60781b808252733b00623d7d2b42b61d4064eecd30251f12dea20f8284019081527ddd26c32fb09344433b2a6781a3456ccaa0fd74b2d9ebcc2eeb087b96c912838801908152765bb9f3c95b8418e219548facea3a4c36c66684d0726567938701938452875192835290516001600160a01b03169382019390935291516001600160f01b0316828601525160170b9281019290925291519081900390910190f3fea264697066735822122005122ac6860fa083da4cb4b3d393758113e3061845eca8d1d910262aed66c74064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6b15d853 {\n bytes17 s_0;\n address s_1;\n uint240 s_2;\n int192 s_3;\n }\n\n function test () public pure returns (S_6b15d853 memory) {\n S_6b15d853 memory r;\n {\n bytes17 r_0 = bytes17(0xa051f98fa586568b0cb29ae0670495a38d);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x3b00623d7d2B42B61d4064EECd30251F12dea20f;\n r.s_1 = r_1;\n }\n {\n uint240 r_2 = 1526330976129365742050149646219554567058825406442603186021962681683462418;\n r.s_2 = r_2;\n }\n {\n int192 r_3 = 8785641400664625891243227832234213859652494747302520167;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0xa051f98fa586568b0cb29ae0670495a38d0000000000000000000000000000000000000000000000000000003b00623d7d2b42b61d4064eecd30251f12dea20f0000dd26c32fb09344433b2a6781a3456ccaa0fd74b2d9ebcc2eeb087b96c9120000000000000000005bb9f3c95b8418e219548facea3a4c36c66684d0726567" + }, + { + "name": "random-(bytes23,string[3],string)", + "type": "(bytes23,string[3],string)", + "value": [ + "0xefc795069c358388b3f891b191fae431455542adeab927", + ["Moo é🚀", "Moo é🚀oo oo MooM🚀é🚀🚀éo🚀", "Moo é🚀🚀o🚀ooooéoo"], + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xefc795069c358388b3f891b191fae431455542adeab927" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oo oo MooM🚀é🚀🚀éo🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀ooooéoo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102be806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101d6565b60405180910390f35b61005661013a565b61005e61013a565b7fefc795069c358388b3f891b191fae431455542adeab9270000000000000000008152610089610162565b604080518082018252600a8152689adede418753e13f3560b71b60208083019190915290835281516060810190925260298083526000929161026090830139602083810191909152604080518082018252601b81527f4d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6f6f6fc3a96f6f000000000081840152818501528482019390935282518084018452600a8152689adede418753e13f3560b71b918101919091529183019190915250919050565b60408051606081019091526000815260208101610155610162565b8152602001606081525090565b60405180606001604052806003905b60608152602001906001900390816101715790505090565b6000815180845260005b818110156101af57602081850181015186830182015201610193565b818111156101c1576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825168ffffffffffffffffff19168282015282810151606060408401526000919060e084019060808501845b600381101561023657607f19878503018252610224848451610189565b93509184019190840190600101610207565b5050506040850151848203601f1901606086015291506102568183610189565b9594505050505056fe4d6f6f20c3a9f09f9a806f6f206f6f204d6f6f4df09f9a80c3a9f09f9a80f09f9a80c3a96ff09f9a80a264697066735822122052f70258880499b9ef5423112182c4c90ac96fb781e42ead1c47e12c4fcca51064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a9504516 {\n bytes23 s_0;\n string[3] s_1;\n string s_2;\n }\n\n function test () public pure returns (S_a9504516 memory) {\n S_a9504516 memory r;\n {\n bytes23 r_0 = bytes23(0xefc795069c358388b3f891b191fae431455542adeab927);\n r.s_0 = r_0;\n }\n {\n string[3] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oo oo MooM🚀é🚀🚀éo🚀\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀🚀o🚀ooooéoo\";\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020efc795069c358388b3f891b191fae431455542adeab927000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a806f6f206f6f204d6f6f4df09f9a80c3a9f09f9a80f09f9a80c3a96ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6f6f6fc3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes24,int208,(string[]))", + "type": "(bytes24,int208,(string[]))", + "value": [ + "0x941a294625d2855ea66bd84f9b2f578d5e73285e3954cb34", + "189590163137027577438410203932861773866553110770191896897778427", + [[]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x941a294625d2855ea66bd84f9b2f578d5e73285e3954cb34" + }, + { + "type": "number", + "value": "189590163137027577438410203932861773866553110770191896897778427" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610232806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012c565b60405180910390f35b6100566100ea565b61005e6100ea565b7f941a294625d2855ea66bd84f9b2f578d5e73285e3954cb34000000000000000081527975fb749dc54503e832d83acd021f6c31ce24701c9ac75611f2fb60208083019190915260408051808301825260608152815160008082529381019092529190816100dc565b60608152602001906001900390816100c75790505b508252506040820152919050565b6040518060600160405280600067ffffffffffffffff19168152602001600060190b81526020016101276040518060200160405280606081525090565b905290565b6000602080835267ffffffffffffffff19845116818401528084015160190b6040840152604084015160608085015260a084018151915082608086015280825180835260c08701915060c08160051b880101925084840193506000805b828110156101ee5788850360bf1901845285518051808752835b818110156101be578281018a01518882018b015289016101a3565b818111156101ce57848a838a0101525b5096880196601f01601f1916959095018701945092860192600101610189565b50929897505050505050505056fea2646970667358221220a5ac951527f9ce57bad0ebd7a0b09a6e09578091eeaca4314d9bbdfd27f82c0164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a227fd7a {\n string[] s_0;\n }\n\n struct S_dc91c717 {\n bytes24 s_0;\n int208 s_1;\n S_a227fd7a s_2;\n }\n\n function test () public pure returns (S_dc91c717 memory) {\n S_dc91c717 memory r;\n {\n bytes24 r_0 = bytes24(0x941a294625d2855ea66bd84f9b2f578d5e73285e3954cb34);\n r.s_0 = r_0;\n }\n {\n int208 r_1 = 189590163137027577438410203932861773866553110770191896897778427;\n r.s_1 = r_1;\n }\n {\n S_a227fd7a memory r_2;\n {\n string[] memory r_2_0 = new string[](0);\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020941a294625d2855ea66bd84f9b2f578d5e73285e3954cb34000000000000000000000000000075fb749dc54503e832d83acd021f6c31ce24701c9ac75611f2fb000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes26,bytes19,bytes23,int64)", + "type": "(bytes26,bytes19,bytes23,int64)", + "value": [ + "0xe5022f13188479f0ba20b29547ed8d49e58a3317ab76847b81b9", + "0x5ba0fb1406861674b130dcbe81ea33d03aa125", + "0x0b7926b050b02dd2fa36aaa3860b3f487bad7c77a17377", + "-3571675893422183882" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe5022f13188479f0ba20b29547ed8d49e58a3317ab76847b81b9" + }, + { + "type": "hexstring", + "value": "0x5ba0fb1406861674b130dcbe81ea33d03aa125" + }, + { + "type": "hexstring", + "value": "0x0b7926b050b02dd2fa36aaa3860b3f487bad7c77a17377" + }, + { + "type": "number", + "value": "-3571675893422183882" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101538061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b604080516080808201835260008083526020808401829052838501829052606093840191909152835180830185527fe5022f13188479f0ba20b29547ed8d49e58a3317ab76847b81b9000000000000808252725ba0fb1406861674b130dcbe81ea33d03aa12560681b8284019081527f0b7926b050b02dd2fa36aaa3860b3f487bad7c77a17377000000000000000000838801908152673191244d304155c919938701938452875192835290516cffffffffffffffffffffffffff191693820193909352915168ffffffffffffffffff1916828601525160070b9281019290925291519081900390910190f3fea2646970667358221220a91f96c0907a5af2f7c882c88ac77f7010b5b6b6b828ed7ce69e6b79f57f056264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fd79e408 {\n bytes26 s_0;\n bytes19 s_1;\n bytes23 s_2;\n int64 s_3;\n }\n\n function test () public pure returns (S_fd79e408 memory) {\n S_fd79e408 memory r;\n {\n bytes26 r_0 = bytes26(0xe5022f13188479f0ba20b29547ed8d49e58a3317ab76847b81b9);\n r.s_0 = r_0;\n }\n {\n bytes19 r_1 = bytes19(0x5ba0fb1406861674b130dcbe81ea33d03aa125);\n r.s_1 = r_1;\n }\n {\n bytes23 r_2 = bytes23(0x0b7926b050b02dd2fa36aaa3860b3f487bad7c77a17377);\n r.s_2 = r_2;\n }\n {\n int64 r_3 = -3571675893422183882;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0xe5022f13188479f0ba20b29547ed8d49e58a3317ab76847b81b90000000000005ba0fb1406861674b130dcbe81ea33d03aa125000000000000000000000000000b7926b050b02dd2fa36aaa3860b3f487bad7c77a17377000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffce6edbb2cfbeaa36" + }, + { + "name": "random-(bytes28,bool,address,string)", + "type": "(bytes28,bool,address,string)", + "value": [ + "0xfcf07f14411a636c05c481490f9394431ea04ca54b0f34fd1adf89ca", + false, + "0x86Ed67ef76CBa7a30319320b4baeE4F6733b2097", + "Moo é🚀MMééM🚀éoéMé🚀 éoM 🚀 🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfcf07f14411a636c05c481490f9394431ea04ca54b0f34fd1adf89ca" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x86Ed67ef76CBa7a30319320b4baeE4F6733b2097" + }, + { + "type": "string", + "value": "Moo é🚀MMééM🚀éoéMé🚀 éoM 🚀 🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101dc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ea565b60405180910390f35b6040805160808082018352600080835260208084018290528385018290526060808501819052855193840186528382018390528381018190527ffcf07f14411a636c05c481490f9394431ea04ca54b0f34fd1adf89ca0000000084527386ed67ef76cba7a30319320b4baee4f6733b20978487015285519081019095526030808652939492939192919061017790830139606083015250919050565b6000602080835263ffffffff1984511681840152808401511515604084015260018060a01b036040850151166060840152606084015160808085015280518060a086015260005b8181101561014d5782810184015186820160c001528301610131565b8181111561015f57600060c083880101525b50601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a804d4dc3a9c3a94df09f9a80c3a96fc3a94dc3a9f09f9a8020c3a96f4d20f09f9a8020f09f9a80a26469706673582212201bffe3b3569d4e0a78f134d85a4f6880f648720ed71b4f5f3109a5b605c659b364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a247a084 {\n bytes28 s_0;\n bool s_1;\n address s_2;\n string s_3;\n }\n\n function test () public pure returns (S_a247a084 memory) {\n S_a247a084 memory r;\n {\n bytes28 r_0 = bytes28(0xfcf07f14411a636c05c481490f9394431ea04ca54b0f34fd1adf89ca);\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x86Ed67ef76CBa7a30319320b4baeE4F6733b2097;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀MMééM🚀éoéMé🚀 éoM 🚀 🚀\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020fcf07f14411a636c05c481490f9394431ea04ca54b0f34fd1adf89ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086ed67ef76cba7a30319320b4baee4f6733b2097000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a804d4dc3a9c3a94df09f9a80c3a96fc3a94dc3a9f09f9a8020c3a96f4d20f09f9a8020f09f9a8000000000000000000000000000000000" + }, + { + "name": "random-(bytes30[3],uint,string)", + "type": "(bytes30[3],uint,string)", + "value": [ + [ + "0xdeb38c4bab61d739d15c33ddda717d67d46ed52f4c8a5912fb59ee49df4c", + "0x521a95d0b40b3a0e12d13dff3e8b44754d1a918cfae799a1b2a988f80404", + "0xd04ce716fc95c983259d0b332867f316ec69e982b79663f2bd2d406ea92f" + ], + "83601943991791190751260659311319968790514293046447761627002213038811672800677", + "Moo é🚀M🚀M o 🚀ooM M🚀o 🚀🚀 " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdeb38c4bab61d739d15c33ddda717d67d46ed52f4c8a5912fb59ee49df4c" + }, + { + "type": "hexstring", + "value": "0x521a95d0b40b3a0e12d13dff3e8b44754d1a918cfae799a1b2a988f80404" + }, + { + "type": "hexstring", + "value": "0xd04ce716fc95c983259d0b332867f316ec69e982b79663f2bd2d406ea92f" + } + ] + }, + { + "type": "number", + "value": "83601943991791190751260659311319968790514293046447761627002213038811672800677" + }, + { + "type": "string", + "value": "Moo é🚀M🚀M o 🚀ooM M🚀o 🚀🚀 " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061016e565b60405180910390f35b610056610129565b61005e610129565b610066610150565b7fdeb38c4bab61d739d15c33ddda717d67d46ed52f4c8a5912fb59ee49df4c000081527f521a95d0b40b3a0e12d13dff3e8b44754d1a918cfae799a1b2a988f8040400006020808301919091527fd04ce716fc95c983259d0b332867f316ec69e982b79663f2bd2d406ea92f00006040808401919091529183527fb8d50600a345065743b6879a4777b1e982868cd0fbf0aff0fc92bf1966c8eda583820152815160608101909252602b8083526000929161020a90830139604083015250919050565b604051806060016040528061013c610150565b815260200160008152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b6020808252825160009190828483015b60038210156101a257825161ffff191681529183019160019190910190830161017e565b505050808401516080840152604084015160a08085015280518060c086015260005b818110156101e05782810184015186820160e0015283016101c4565b818111156101f257600060e083880101525b50601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a804df09f9a804d206f20f09f9a806f6f4d204df09f9a806f20f09f9a80f09f9a8020a264697066735822122002d36cfd2755e01f84943075ac1da94910d411e90d9f170ce0e01030f1f4131d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_04bdee04 {\n bytes30[3] s_0;\n uint256 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_04bdee04 memory) {\n S_04bdee04 memory r;\n {\n bytes30[3] memory r_0;\n {\n bytes30 r_0_0 = bytes30(0xdeb38c4bab61d739d15c33ddda717d67d46ed52f4c8a5912fb59ee49df4c);\n r_0[0] = r_0_0;\n }\n {\n bytes30 r_0_1 = bytes30(0x521a95d0b40b3a0e12d13dff3e8b44754d1a918cfae799a1b2a988f80404);\n r_0[1] = r_0_1;\n }\n {\n bytes30 r_0_2 = bytes30(0xd04ce716fc95c983259d0b332867f316ec69e982b79663f2bd2d406ea92f);\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n uint r_1 = 83601943991791190751260659311319968790514293046447761627002213038811672800677;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀M🚀M o 🚀ooM M🚀o 🚀🚀 \";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020deb38c4bab61d739d15c33ddda717d67d46ed52f4c8a5912fb59ee49df4c0000521a95d0b40b3a0e12d13dff3e8b44754d1a918cfae799a1b2a988f804040000d04ce716fc95c983259d0b332867f316ec69e982b79663f2bd2d406ea92f0000b8d50600a345065743b6879a4777b1e982868cd0fbf0aff0fc92bf1966c8eda500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a804df09f9a804d206f20f09f9a806f6f4d204df09f9a806f20f09f9a80f09f9a8020000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes31,bool,uint,bytes13)", + "type": "(bytes31,bool,uint,bytes13)", + "value": [ + "0x288264cc05468a8b41f4848f7fa61d731f9c25fbf2fa2a393517ccb7c8a289", + false, + "57203922513981131758827462774664008207019062522719308608141831734603472906100", + "0x8770c075d46c8c35b009589a78" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x288264cc05468a8b41f4848f7fa61d731f9c25fbf2fa2a393517ccb7c8a289" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "57203922513981131758827462774664008207019062522719308608141831734603472906100" + }, + { + "type": "hexstring", + "value": "0x8770c075d46c8c35b009589a78" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061013c8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160808082018352600080835260208084018290528385018290526060938401829052845180840186528082019283527f288264cc05468a8b41f4848f7fa61d731f9c25fbf2fa2a393517ccb7c8a289008082527f7e7845d452b3b7405b7c6922751281ac877d8243761f63a1221605d2cd7b27748288019081526c10ee180eba8d9186b6012b134f609b1b928701928352875191825293511515928101929092529151948101949094525172ffffffffffffffffffffffffffffffffffffff1916918301919091520160405180910390f3fea2646970667358221220a270b8d9d28ad2c22b815d2897578f3fd42f9ab74d273ee6f626f549330b26e564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fee85aa2 {\n bytes31 s_0;\n bool s_1;\n uint256 s_2;\n bytes13 s_3;\n }\n\n function test () public pure returns (S_fee85aa2 memory) {\n S_fee85aa2 memory r;\n {\n bytes31 r_0 = bytes31(0x288264cc05468a8b41f4848f7fa61d731f9c25fbf2fa2a393517ccb7c8a289);\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n uint r_2 = 57203922513981131758827462774664008207019062522719308608141831734603472906100;\n r.s_2 = r_2;\n }\n {\n bytes13 r_3 = bytes13(0x8770c075d46c8c35b009589a78);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x288264cc05468a8b41f4848f7fa61d731f9c25fbf2fa2a393517ccb7c8a2890000000000000000000000000000000000000000000000000000000000000000007e7845d452b3b7405b7c6922751281ac877d8243761f63a1221605d2cd7b27748770c075d46c8c35b009589a7800000000000000000000000000000000000000" + }, + { + "name": "random-(bytes32,(int256,bytes2[3]))", + "type": "(bytes32,(int256,bytes2[3]))", + "value": [ + "0xb5746450e46f484b2eaf074ddd79ec985cba539b9cb7c02b55134d71d8cc09ca", + [ + "-15687383081411469631591922402288513550348473779628729592897985303496168551130", + ["0x081c", "0xbba1", "0x57cc"] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb5746450e46f484b2eaf074ddd79ec985cba539b9cb7c02b55134d71d8cc09ca" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-15687383081411469631591922402288513550348473779628729592897985303496168551130" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x081c" + }, + { + "type": "hexstring", + "value": "0xbba1" + }, + { + "type": "hexstring", + "value": "0x57cc" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101bf806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610138565b60405180910390f35b6100566100e5565b61005e6100e5565b7fb5746450e46f484b2eaf074ddd79ec985cba539b9cb7c02b55134d71d8cc09ca8152610089610104565b7fdd51417ddcc572fdc0ce46402098075e954b5fb202f0d55d52a4327d1a884d2681526100b461011a565b61020760f21b815261bba160f01b6020808301919091526115f360f21b604083015282810191909152820152919050565b6040805180820190915260008152602081016100ff610104565b905290565b6040518060400160405280600081526020016100ff5b60405180606001604052806003906020820280368337509192915050565b8151815260208083015180518284015281015160a0830191906040840160005b600381101561017f5782516001600160f01b03191682529183019190830190600101610158565b505050509291505056fea2646970667358221220ee833a4da485089d74f914872b1823e78111662b8f6ecc48b2e84168233ae15564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_31a5480e {\n int256 s_0;\n bytes2[3] s_1;\n }\n\n struct S_edaca47e {\n bytes32 s_0;\n S_31a5480e s_1;\n }\n\n function test () public pure returns (S_edaca47e memory) {\n S_edaca47e memory r;\n {\n bytes32 r_0 = bytes32(0xb5746450e46f484b2eaf074ddd79ec985cba539b9cb7c02b55134d71d8cc09ca);\n r.s_0 = r_0;\n }\n {\n S_31a5480e memory r_1;\n {\n int256 r_1_0 = -15687383081411469631591922402288513550348473779628729592897985303496168551130;\n r_1.s_0 = r_1_0;\n }\n {\n bytes2[3] memory r_1_1;\n {\n bytes2 r_1_1_0 = bytes2(0x081c);\n r_1_1[0] = r_1_1_0;\n }\n {\n bytes2 r_1_1_1 = bytes2(0xbba1);\n r_1_1[1] = r_1_1_1;\n }\n {\n bytes2 r_1_1_2 = bytes2(0x57cc);\n r_1_1[2] = r_1_1_2;\n }\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xb5746450e46f484b2eaf074ddd79ec985cba539b9cb7c02b55134d71d8cc09cadd51417ddcc572fdc0ce46402098075e954b5fb202f0d55d52a4327d1a884d26081c000000000000000000000000000000000000000000000000000000000000bba100000000000000000000000000000000000000000000000000000000000057cc000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes6,uint48,uint,string)", + "type": "(bytes6,uint48,uint,string)", + "value": [ + "0xd3ebc83cc476", + "157409837898332", + "36033858113444933665224356829417971217918914769406914675501427076034298707041", + "Moo é🚀M MM🚀éo🚀ooM M éMé🚀oM MooooMMM " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd3ebc83cc476" + }, + { + "type": "number", + "value": "157409837898332" + }, + { + "type": "number", + "value": "36033858113444933665224356829417971217918914769406914675501427076034298707041" + }, + { + "type": "string", + "value": "Moo é🚀M MM🚀éo🚀ooM M éMé🚀oM MooooMMM " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101dc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e4565b60405180910390f35b6040805160808082018352600080835260208084018290528385018290526060808501819052855193840186528381018190526569f5e41e623b60d11b8452658f29d578da5c848301527f4faa70e179500ff05381133a5849a66fe3510f2779f764e7811ae6f38d08fc618487015285519081019095526034808652939492939192919061017390830139606083015250919050565b6000602080835265ffffffffffff60d01b8451168184015265ffffffffffff8185015116604084015260408401516060840152606084015160808085015280518060a086015260005b818110156101495782810184015186820160c00152830161012d565b8181111561015b57600060c083880101525b50601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a804d204d4df09f9a80c3a96ff09f9a806f6f4d204d20c3a94dc3a9f09f9a806f4d204d6f6f6f6f4d4d4d20a2646970667358221220ae9b2a07d3ca5c6adf16f5605da422a94fd1e34a18169681ca0cb55e26d0b26964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1d8b30cb {\n bytes6 s_0;\n uint48 s_1;\n uint256 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_1d8b30cb memory) {\n S_1d8b30cb memory r;\n {\n bytes6 r_0 = bytes6(0xd3ebc83cc476);\n r.s_0 = r_0;\n }\n {\n uint48 r_1 = 157409837898332;\n r.s_1 = r_1;\n }\n {\n uint r_2 = 36033858113444933665224356829417971217918914769406914675501427076034298707041;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀M MM🚀éo🚀ooM M éMé🚀oM MooooMMM \";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020d3ebc83cc476000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f29d578da5c4faa70e179500ff05381133a5849a66fe3510f2779f764e7811ae6f38d08fc61000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a804d204d4df09f9a80c3a96ff09f9a806f6f4d204d20c3a94dc3a9f09f9a806f4d204d6f6f6f6f4d4d4d20000000000000000000000000" + }, + { + "name": "random-(bytes9[2][1],bytes1)", + "type": "(bytes9[2][1],bytes1)", + "value": [[["0x2a8077e99bfca2808f", "0x0bd28b334b59433abb"]], "0xa3"], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2a8077e99bfca2808f" + }, + { + "type": "hexstring", + "value": "0x0bd28b334b59433abb" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xa3" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610112565b60405180910390f35b6100566100a7565b61005e6100a7565b6100666100c7565b61006e6100f4565b682a8077e99bfca2808f60b81b8152680bd28b334b59433abb60b81b60208083019190915290825290825260a360f81b90820152919050565b60405180604001604052806100ba6100c7565b8152600060209091015290565b60405180602001604052806001905b6100de6100f4565b8152602001906001900390816100d65790505090565b60405180604001604052806002906020820280368337509192915050565b81516060820190826000805b600180821061012d5750610174565b845184845b600281101561015a5782516001600160b81b0319168252602092830192909101908301610132565b50505060209490940193506040929092019160010161011e565b50505050602092909201516001600160f81b031916604091909101529056fea264697066735822122024544473b89650119f7611757b94323759fe750e94dd34f4e6f38cfdc2ced3b864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e8e2e5c2 {\n bytes9[2][1] s_0;\n bytes1 s_1;\n }\n\n function test () public pure returns (S_e8e2e5c2 memory) {\n S_e8e2e5c2 memory r;\n {\n bytes9[2][1] memory r_0;\n {\n bytes9[2] memory r_0_0;\n {\n bytes9 r_0_0_0 = bytes9(0x2a8077e99bfca2808f);\n r_0_0[0] = r_0_0_0;\n }\n {\n bytes9 r_0_0_1 = bytes9(0x0bd28b334b59433abb);\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes1 r_1 = bytes1(0xa3);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x2a8077e99bfca2808f00000000000000000000000000000000000000000000000bd28b334b59433abb0000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int,address,string,address)", + "type": "(int,address,string,address)", + "value": [ + "41910819814797536145085873155562024502954757412223679464763840141505256678917", + "0xc22f9518F8A86c859C8520784AC19705763e9630", + "Moo é🚀Mé éoé🚀é🚀o🚀éé 🚀é🚀éMM🚀🚀o🚀ééMMéo🚀oMMM🚀MM🚀M ooooé🚀🚀oM M ", + "0x81acAd216BDDDF64C139906ac17860db0F966Fa8" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "41910819814797536145085873155562024502954757412223679464763840141505256678917" + }, + { + "type": "address", + "value": "0xc22f9518F8A86c859C8520784AC19705763e9630" + }, + { + "type": "string", + "value": "Moo é🚀Mé éoé🚀é🚀o🚀éé 🚀é🚀éMM🚀🚀o🚀ééMMéo🚀oMMM🚀MM🚀M ooooé🚀🚀oM M " + }, + { + "type": "address", + "value": "0x81acAd216BDDDF64C139906ac17860db0F966Fa8" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610251806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610118565b60405180910390f35b6100566100de565b61005e6100de565b7f5ca8aef25fbdfd4d35564b722e6f2cfcf8bcbcc33da1a80156c0a1dbf5eee605815273c22f9518f8a86c859c8520784ac19705763e96306020808301919091526040805160a0810190915260738082526000926101a9908301396040830152507381acad216bdddf64c139906ac17860db0f966fa86060820152919050565b60405180608001604052806000815260200160006001600160a01b031681526020016060815260200160006001600160a01b031681525090565b6000602080835283518184015260018060a01b038185015116604084015260408401516080606085015280518060a086015260005b818110156101695782810184015186820160c00152830161014d565b8181111561017b57600060c083880101525b5060608601516001600160a01b03811660808701529250601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a804dc3a920c3a96fc3a9f09f9a80c3a9f09f9a806ff09f9a80c3a9c3a92020f09f9a80c3a9f09f9a80c3a94d4df09f9a80f09f9a806ff09f9a80c3a9c3a94d4dc3a96ff09f9a806f4d4d4df09f9a804d4df09f9a804d206f6f6f6fc3a9f09f9a80f09f9a806f4d204d20a2646970667358221220e8cd6112cab27ac63a4e1aea099d6a0f85237c2f4ae1275cf711d838ee8c6c4e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d509b83a {\n int256 s_0;\n address s_1;\n string s_2;\n address s_3;\n }\n\n function test () public pure returns (S_d509b83a memory) {\n S_d509b83a memory r;\n {\n int r_0 = 41910819814797536145085873155562024502954757412223679464763840141505256678917;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xc22f9518F8A86c859C8520784AC19705763e9630;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀Mé éoé🚀é🚀o🚀éé 🚀é🚀éMM🚀🚀o🚀ééMMéo🚀oMMM🚀MM🚀M ooooé🚀🚀oM M \";\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x81acAd216BDDDF64C139906ac17860db0F966Fa8;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000205ca8aef25fbdfd4d35564b722e6f2cfcf8bcbcc33da1a80156c0a1dbf5eee605000000000000000000000000c22f9518f8a86c859c8520784ac19705763e9630000000000000000000000000000000000000000000000000000000000000008000000000000000000000000081acad216bdddf64c139906ac17860db0f966fa800000000000000000000000000000000000000000000000000000000000000734d6f6f20c3a9f09f9a804dc3a920c3a96fc3a9f09f9a80c3a9f09f9a806ff09f9a80c3a9c3a92020f09f9a80c3a9f09f9a80c3a94d4df09f9a80f09f9a806ff09f9a80c3a9c3a94d4dc3a96ff09f9a806f4d4d4df09f9a804d4df09f9a804d206f6f6f6fc3a9f09f9a80f09f9a806f4d204d2000000000000000000000000000" + }, + { + "name": "random-(int128,address,bool)[2]", + "type": "(int128,address,bool)[2]", + "value": [ + [ + "-22672470265645353246491092127508054218", + "0x72011c367Faa9eb0877f90CF60d1982DCe96A13F", + false + ], + [ + "-82645767164493496893668748387570290862", + "0x425a6ED918FE231ba581B968909507A7310096f7", + true + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-22672470265645353246491092127508054218" + }, + { + "type": "address", + "value": "0x72011c367Faa9eb0877f90CF60d1982DCe96A13F" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-82645767164493496893668748387570290862" + }, + { + "type": "address", + "value": "0x425a6ED918FE231ba581B968909507A7310096f7" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610128565b60405180910390f35b6100566100e9565b61005e6100e9565b60408051606080820183526000828401526f110e8f16ad7ad452c573679f45d3c0c91982527372011c367faa9eb0877f90cf60d1982dce96a13f602080840191909152918452825190810183526f3e2cfeeb2b48a1c31d70cff7301210ad19815273425a6ed918fe231ba581b968909507a7310096f781830152600192810192909252820152919050565b60405180604001604052806002905b60408051606081018252600080825260208083018290529282015282526000199092019101816100f85790505090565b60c08101818360005b60028110156101775781518051600f0b84526020808201516001600160a01b03168186015260409182015115159185019190915260609093019290910190600101610131565b5050509291505056fea2646970667358221220c74fee7e0842aea1cbdebbc3267de74b292afea4e6438ffbe4b764606a996eac64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0693d211 {\n int128 s_0;\n address s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_0693d211[2] memory) {\n S_0693d211[2] memory r;\n {\n S_0693d211 memory r_0;\n {\n int128 r_0_0 = -22672470265645353246491092127508054218;\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x72011c367Faa9eb0877f90CF60d1982DCe96A13F;\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_0693d211 memory r_1;\n {\n int128 r_1_0 = -82645767164493496893668748387570290862;\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x425a6ED918FE231ba581B968909507A7310096f7;\n r_1.s_1 = r_1_1;\n }\n {\n bool r_1_2 = true;\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffeef170e952852bad3a8c9860ba2c3f3600000000000000000000000072011c367faa9eb0877f90cf60d1982dce96a13f0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffc1d30114d4b75e3ce28f3008cfedef52000000000000000000000000425a6ed918fe231ba581b968909507a7310096f70000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(int208,bytes12[1])[3]", + "type": "(int208,bytes12[1])[3]", + "value": [ + [ + "-36056231912988420069812482979287557783213465046737177957155324", + ["0x541f116bbc55130da9481062"] + ], + [ + "41553426542515715495297105468111876715437216871026223910431282", + ["0x104cfabce2e6deb837aab4f6"] + ], + [ + "-138827850512374257407466752487119055712365798839439503619853113", + ["0x1e8fbc5f8ab0c09109fdc649"] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-36056231912988420069812482979287557783213465046737177957155324" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x541f116bbc55130da9481062" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "41553426542515715495297105468111876715437216871026223910431282" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x104cfabce2e6deb837aab4f6" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-138827850512374257407466752487119055712365798839439503619853113" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1e8fbc5f8ab0c09109fdc649" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610252806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ac565b60405180910390f35b61005661013f565b61005e61013f565b61006661016c565b79167016d1ebef7acaa0e124bdf377eb1af2f6eec5fb7c78b4c1fb19815261008c61018e565b6b2a0f88b5de2a8986d4a4083160a11b8152602082015281526100ad61016c565b7919dbd7bfce3e8ea3b4acff39d96e8ebf7590b53e631ae8bb2a3281526100d261018e565b6b08267d5e71736f5c1bd55a7b60a11b81526020828101919091528201526100f861016c565b7956648d752b6dbc7541de517ab278f09b77b5650daad183890b3819815261011e61018e565b6b1e8fbc5f8ab0c09109fdc64960a01b815260208201526040820152919050565b60405180606001604052806003905b61015661016c565b81526020019060019003908161014e5790505090565b6040518060400160405280600060190b815260200161018961018e565b905290565b60405180602001604052806001906020820280368337509192915050565b60c0810181836000805b6003811015610212578251805160190b855260209081015190808601845b60018110156101fb5783516001600160a01b031916825292820192908201906001016101d4565b5050604095909501949390930192506001016101b6565b505050509291505056fea2646970667358221220233f587f416921d41da4988084165b89ba5958b60120b53e22d0d437ee61890264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_914529ac {\n int208 s_0;\n bytes12[1] s_1;\n }\n\n function test () public pure returns (S_914529ac[3] memory) {\n S_914529ac[3] memory r;\n {\n S_914529ac memory r_0;\n {\n int208 r_0_0 = -36056231912988420069812482979287557783213465046737177957155324;\n r_0.s_0 = r_0_0;\n }\n {\n bytes12[1] memory r_0_1;\n {\n bytes12 r_0_1_0 = bytes12(0x541f116bbc55130da9481062);\n r_0_1[0] = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_914529ac memory r_1;\n {\n int208 r_1_0 = 41553426542515715495297105468111876715437216871026223910431282;\n r_1.s_0 = r_1_0;\n }\n {\n bytes12[1] memory r_1_1;\n {\n bytes12 r_1_1_0 = bytes12(0x104cfabce2e6deb837aab4f6);\n r_1_1[0] = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_914529ac memory r_2;\n {\n int208 r_2_0 = -138827850512374257407466752487119055712365798839439503619853113;\n r_2.s_0 = r_2_0;\n }\n {\n bytes12[1] memory r_2_1;\n {\n bytes12 r_2_1_0 = bytes12(0x1e8fbc5f8ab0c09109fdc649);\n r_2_1[0] = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffe98fe92e141085355f1edb420c8814e50d09113a0483874b3e04541f116bbc55130da9481062000000000000000000000000000000000000000000000000000019dbd7bfce3e8ea3b4acff39d96e8ebf7590b53e631ae8bb2a32104cfabce2e6deb837aab4f60000000000000000000000000000000000000000ffffffffffffa99b728ad492438abe21ae854d870f64884a9af2552e7c76f4c71e8fbc5f8ab0c09109fdc6490000000000000000000000000000000000000000" + }, + { + "name": "random-(int224[2],int40,string)", + "type": "(int224[2],int40,string)", + "value": [ + [ + "-7117479749327792916839336837770841824643675495525447908936339284219", + "-10500952945950702529649778460192218216385080742665898396592850210940" + ], + "-437476089440", + "Moo é🚀oo🚀M" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-7117479749327792916839336837770841824643675495525447908936339284219" + }, + { + "type": "number", + "value": "-10500952945950702529649778460192218216385080742665898396592850210940" + } + ] + }, + { + "type": "number", + "value": "-437476089440" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀M" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610209806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610137565b60405180910390f35b6100566100f2565b61005e6100f2565b610066610119565b7fffffffffbc6a5d7a5ea3bc39ad6af81bd9b5472b9ccf1189f41ed92813521f0581527fffffffff9c4998f04328fabcb2a781533c2b567b12a77c3ab2f890d8b939ef846020808301919091529082526465db9b5e5f198282015260408051808201825260118152704d6f6f20c3a9f09f9a806f6ff09f9a804d60781b92810192909252820152919050565b6040518060600160405280610105610119565b815260006020820152606060409091015290565b60405180604001604052806002906020820280368337509192915050565b6020808252825160009190828483015b6002821015610169578251601b0b815291830191600191909101908301610147565b5050508084015160040b6060840152604084015160808085015280518060a086015260005b818110156101aa5782810184015186820160c00152830161018e565b818111156101bc57600060c083880101525b50601f01601f19169390930160c00194935050505056fea26469706673582212209e824d6aab6dd0d291d164b7f59f3907dafd169b4305ef6bd61c9e5ee7e01ae864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_38c45f8e {\n int224[2] s_0;\n int40 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_38c45f8e memory) {\n S_38c45f8e memory r;\n {\n int224[2] memory r_0;\n {\n int224 r_0_0 = -7117479749327792916839336837770841824643675495525447908936339284219;\n r_0[0] = r_0_0;\n }\n {\n int224 r_0_1 = -10500952945950702529649778460192218216385080742665898396592850210940;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n int40 r_1 = -437476089440;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oo🚀M\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffffffffbc6a5d7a5ea3bc39ad6af81bd9b5472b9ccf1189f41ed92813521f05ffffffff9c4998f04328fabcb2a781533c2b567b12a77c3ab2f890d8b939ef84ffffffffffffffffffffffffffffffffffffffffffffffffffffff9a2464a1a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a806f6ff09f9a804d000000000000000000000000000000" + }, + { + "name": "random-(int24,bool,(int88,int48))", + "type": "(int24,bool,(int88,int48))", + "value": ["-5079534", true, ["-84456644257282242815579388", "-123100485513621"]], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-5079534" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-84456644257282242815579388" + }, + { + "type": "number", + "value": "-123100485513621" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b610038610073565b60408051825160020b8152602080840151151581830152928201518051600a0b828401529092015160050b6060830152519081900360800190f35b6100a660408051606081018252600080825260208083018290528351808501855282815290810191909152909182015290565b6100d960408051606081018252600080825260208083018290528351808501855282815290810191909152909182015290565b624d81ed19815260016020808301919091526040805180820182526a45dc63dbf66f34aa99d4fb198152656ff590b5f194199281019290925282015291905056fea2646970667358221220797d55ce23a0168dd6e7595fc519f40781f388d2846be287bd804cb41254120364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_356b8fdf {\n int88 s_0;\n int48 s_1;\n }\n\n struct S_f7e408c0 {\n int24 s_0;\n bool s_1;\n S_356b8fdf s_2;\n }\n\n function test () public pure returns (S_f7e408c0 memory) {\n S_f7e408c0 memory r;\n {\n int24 r_0 = -5079534;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_356b8fdf memory r_2;\n {\n int88 r_2_0 = -84456644257282242815579388;\n r_2.s_0 = r_2_0;\n }\n {\n int48 r_2_1 = -123100485513621;\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb27e120000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffba239c240990cb55662b04ffffffffffffffffffffffffffffffffffffffffffffffffffff900a6f4a0e6b" + }, + { + "name": "random-(int32,address,address,string)", + "type": "(int32,address,address,string)", + "value": [ + "-879384961", + "0x5d5558122207EE895801ecB38a8795cC09fca9C0", + "0x0EBB115Fcd4dB4129aC538Dc9bA9D3cC5fFF7dAA", + "Moo é🚀🚀🚀o o 🚀ooooé🚀MoM🚀o MéoMM oM🚀é🚀Méo éoo oo🚀 🚀o🚀oéoo o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-879384961" + }, + { + "type": "address", + "value": "0x5d5558122207EE895801ecB38a8795cC09fca9C0" + }, + { + "type": "address", + "value": "0x0EBB115Fcd4dB4129aC538Dc9bA9D3cC5fFF7dAA" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀o o 🚀ooooé🚀MoM🚀o MéoMM oM🚀é🚀Méo éoo oo🚀 🚀o🚀oéoo o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610206806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e1565b60405180910390f35b6040805160808082018352600080835260208084018290528385018290526060808501819052855193840186528381015263346a5980198352735d5558122207ee895801ecb38a8795cc09fca9c083820152730ebb115fcd4db4129ac538dc9ba9d3cc5fff7daa83860152845160a081019095526063808652939492939192919061016e90830139606083015250919050565b60006020808352835160030b818401528084015160018060a01b0380821660408601528060408701511660608601525050606084015160808085015280518060a086015260005b818110156101445782810184015186820160c001528301610128565b8181111561015657600060c083880101525b50601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a806f206f20f09f9a806f6f6f6fc3a9f09f9a804d6f4df09f9a806f204dc3a96f4d4d20206f4df09f9a80c3a9f09f9a804dc3a96f20c3a96f6f206f6ff09f9a802020f09f9a806ff09f9a806fc3a96f6f206fa26469706673582212201436492fea99220165efed27bddb8019f2375206dacd5d88b9a600a4e704670e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f1e25c19 {\n int32 s_0;\n address s_1;\n address s_2;\n string s_3;\n }\n\n function test () public pure returns (S_f1e25c19 memory) {\n S_f1e25c19 memory r;\n {\n int32 r_0 = -879384961;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x5d5558122207EE895801ecB38a8795cC09fca9C0;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x0EBB115Fcd4dB4129aC538Dc9bA9D3cC5fFF7dAA;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀🚀🚀o o 🚀ooooé🚀MoM🚀o MéoMM oM🚀é🚀Méo éoo oo🚀 🚀o🚀oéoo o\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcb95a67f0000000000000000000000005d5558122207ee895801ecb38a8795cc09fca9c00000000000000000000000000ebb115fcd4db4129ac538dc9ba9d3cc5fff7daa000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a80f09f9a806f206f20f09f9a806f6f6f6fc3a9f09f9a804d6f4df09f9a806f204dc3a96f4d4d20206f4df09f9a80c3a9f09f9a804dc3a96f20c3a96f6f206f6ff09f9a802020f09f9a806ff09f9a806fc3a96f6f206f0000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int64,uint80,bytes5)[4]", + "type": "(int64,uint80,bytes5)[4]", + "value": [ + ["623945691870500941", "1016981996060928282315954", "0xba3de42b74"], + ["-1917124013388900514", "881528603561834415395716", "0x0732b05f1e"], + ["7842083194505920497", "167373721420772599886624", "0x50b621eea6"], + ["-1336875585270647599", "118152120589030764040838", "0x651b50d65b"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "623945691870500941" + }, + { + "type": "number", + "value": "1016981996060928282315954" + }, + { + "type": "hexstring", + "value": "0xba3de42b74" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1917124013388900514" + }, + { + "type": "number", + "value": "881528603561834415395716" + }, + { + "type": "hexstring", + "value": "0x0732b05f1e" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "7842083194505920497" + }, + { + "type": "number", + "value": "167373721420772599886624" + }, + { + "type": "hexstring", + "value": "0x50b621eea6" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1336875585270647599" + }, + { + "type": "number", + "value": "118152120589030764040838" + }, + { + "type": "hexstring", + "value": "0x651b50d65b" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610214806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017a565b60405180910390f35b61005661013b565b61005e61013b565b60408051606080820183526708a8b34d0b13984d825269d75ab4587fdf0a1dccb2602080840191909152642e8f790add60da1b8385015291845282518082018452671a9afe22006aa8a119815269baabc2e820c6c730138481840152640399582f8f60d91b818501528483015282518082018452676cd4ad1dc395fff1815269237158fd9035f37b73208184015264285b10f75360d91b81850152848401528251808201845267128d894300f30b2e1981526919050a0efef5a79fd2869281019290925264651b50d65b60d81b9282019290925290820152919050565b60405180608001604052806004905b604080516060810182526000808252602080830182905292820152825260001990920191018161014a5790505090565b6101808101818360005b60048110156101d5578151805160070b845260208082015169ffffffffffffffffffff16818601526040918201516001600160d81b0319169185019190915260609093019290910190600101610184565b5050509291505056fea2646970667358221220c52fc7e29006f50617a4a31b63f68512618f113eea6d1a4418b8367c3793d78b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2e7a760d {\n int64 s_0;\n uint80 s_1;\n bytes5 s_2;\n }\n\n function test () public pure returns (S_2e7a760d[4] memory) {\n S_2e7a760d[4] memory r;\n {\n S_2e7a760d memory r_0;\n {\n int64 r_0_0 = 623945691870500941;\n r_0.s_0 = r_0_0;\n }\n {\n uint80 r_0_1 = 1016981996060928282315954;\n r_0.s_1 = r_0_1;\n }\n {\n bytes5 r_0_2 = bytes5(0xba3de42b74);\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_2e7a760d memory r_1;\n {\n int64 r_1_0 = -1917124013388900514;\n r_1.s_0 = r_1_0;\n }\n {\n uint80 r_1_1 = 881528603561834415395716;\n r_1.s_1 = r_1_1;\n }\n {\n bytes5 r_1_2 = bytes5(0x0732b05f1e);\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_2e7a760d memory r_2;\n {\n int64 r_2_0 = 7842083194505920497;\n r_2.s_0 = r_2_0;\n }\n {\n uint80 r_2_1 = 167373721420772599886624;\n r_2.s_1 = r_2_1;\n }\n {\n bytes5 r_2_2 = bytes5(0x50b621eea6);\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_2e7a760d memory r_3;\n {\n int64 r_3_0 = -1336875585270647599;\n r_3.s_0 = r_3_0;\n }\n {\n uint80 r_3_1 = 118152120589030764040838;\n r_3.s_1 = r_3_1;\n }\n {\n bytes5 r_3_2 = bytes5(0x651b50d65b);\n r_3.s_2 = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000008a8b34d0b13984d00000000000000000000000000000000000000000000d75ab4587fdf0a1dccb2ba3de42b74000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffe56501ddff95575e00000000000000000000000000000000000000000000baabc2e820c6c73013840732b05f1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006cd4ad1dc395fff100000000000000000000000000000000000000000000237158fd9035f37b732050b621eea6000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffed7276bcff0cf4d10000000000000000000000000000000000000000000019050a0efef5a79fd286651b50d65b000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int88,bool,bool[2])", + "type": "(int88,bool,bool[2])", + "value": ["-96536943813754405125647274", false, [true, false]], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-96536943813754405125647274" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610156806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d3565b60405180910390f35b610056610091565b61005e610091565b6a4fda7e35dcb87e04486ba91981526000602082015261007c6100b5565b60018152600060208201526040820152919050565b60408051606081018252600080825260208201529081016100b06100b5565b905290565b60405180604001604052806002906020820280368337509192915050565b8151600a0b8152602080830151151581830152604080840151608084019291840160005b60028110156101165782511515825291830191908301906001016100f7565b505050509291505056fea2646970667358221220af0507e3919dde64e4c580aa1ccf6700096bd473719ecdd99b6fd6c7a92d891364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_43f37188 {\n int88 s_0;\n bool s_1;\n bool[2] s_2;\n }\n\n function test () public pure returns (S_43f37188 memory) {\n S_43f37188 memory r;\n {\n int88 r_0 = -96536943813754405125647274;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n bool[2] memory r_2;\n {\n bool r_2_0 = true;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2[1] = r_2_1;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffffffffffffffffffffb02581ca234781fbb79456000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int96,string,address,address)", + "type": "(int96,string,address,address)", + "value": [ + "39481779427109732141276805595", + "Moo é🚀 ", + "0xbCaBCf574FaC64c67A97862AafC0493fF26903C3", + "0xf4A1509a7Db9566Ab1C9da56D05538131d25E316" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "39481779427109732141276805595" + }, + { + "type": "string", + "value": "Moo é🚀 " + }, + { + "type": "address", + "value": "0xbCaBCf574FaC64c67A97862AafC0493fF26903C3" + }, + { + "type": "address", + "value": "0xf4A1509a7Db9566Ab1C9da56D05538131d25E316" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160808082018352600080835260606020808501829052848601839052938101829052845192830185528284018181528386018381529184019283526b7f928fff6c5cf35492eb39db84528551808701909652600b86526a026b7b79061d4f84fcd40160ad1b948601949094529390925273bcabcf574fac64c67a97862aafc0493ff26903c390925273f4a1509a7db9566ab1c9da56d05538131d25e31690526040516100e091906100e9565b60405180910390f35b600060208083528351600b0b81840152808401516080604085015280518060a086015260005b8181101561012b5782810184015186820160c00152830161010f565b8181111561013d57600060c083880101525b5060408601516001600160a01b0381166060870152925060608601516001600160a01b03811660808701529250601f01601f19169390930160c00194935050505056fea2646970667358221220080c7ff897b5b342b2a2218c41f4bba3a557090e55bea9441b4fc8e368d9374064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d6c71d32 {\n int96 s_0;\n string s_1;\n address s_2;\n address s_3;\n }\n\n function test () public pure returns (S_d6c71d32 memory) {\n S_d6c71d32 memory r;\n {\n int96 r_0 = 39481779427109732141276805595;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 \";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xbCaBCf574FaC64c67A97862AafC0493fF26903C3;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xf4A1509a7Db9566Ab1C9da56D05538131d25E316;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000007f928fff6c5cf35492eb39db0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000bcabcf574fac64c67a97862aafc0493ff26903c3000000000000000000000000f4a1509a7db9566ab1c9da56d05538131d25e316000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a8020000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,(uint240,bytes3,bytes29))", + "type": "(string,(uint240,bytes3,bytes29))", + "value": [ + "Moo é🚀o🚀Mo", + [ + "780805663838851314059130267912089829649296864778330838147100161122649790", + "0xc711d1", + "0x90cb1ba3e1de64e2fd2e6d759be2a63acdbec6437b22f28f2424004b81" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀Mo" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "780805663838851314059130267912089829649296864778330838147100161122649790" + }, + { + "type": "hexstring", + "value": "0xc711d1" + }, + { + "type": "hexstring", + "value": "0x90cb1ba3e1de64e2fd2e6d759be2a63acdbec6437b22f28f2424004b81" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012a565b60405180910390f35b6100566100f0565b61005e6100f0565b60408051808201825260118152704d6f6f20c3a9f09f9a806ff09f9a804d6f60781b60208083019190915290835281516060810183527d7121b113c6f7df55f22f0302cea481549d4910984f540899703667b646be815262c711d160e81b818301527f90cb1ba3e1de64e2fd2e6d759be2a63acdbec6437b22f28f2424004b8100000092810192909252820152919050565b604051806040016040528060608152602001610125604080516060810182526000808252602082018190529181019190915290565b905290565b60006020808352835160808285015280518060a086015260005b818110156101605782810184015186820160c001528301610144565b8181111561017257600060c083880101525b509482015180516001600160f01b0316604086810191909152928101516001600160e81b0319166060860152919091015162ffffff19166080840152505060c0601f909201601f191601019056fea2646970667358221220ee1d69d17db75213035ded369b1fe6cd8d37a00b51c32f22b2395c3ce7c82cec64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6d306272 {\n uint240 s_0;\n bytes3 s_1;\n bytes29 s_2;\n }\n\n struct S_711a7ea3 {\n string s_0;\n S_6d306272 s_1;\n }\n\n function test () public pure returns (S_711a7ea3 memory) {\n S_711a7ea3 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o🚀Mo\";\n r.s_0 = r_0;\n }\n {\n S_6d306272 memory r_1;\n {\n uint240 r_1_0 = 780805663838851314059130267912089829649296864778330838147100161122649790;\n r_1.s_0 = r_1_0;\n }\n {\n bytes3 r_1_1 = bytes3(0xc711d1);\n r_1.s_1 = r_1_1;\n }\n {\n bytes29 r_1_2 = bytes29(0x90cb1ba3e1de64e2fd2e6d759be2a63acdbec6437b22f28f2424004b81);\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000007121b113c6f7df55f22f0302cea481549d4910984f540899703667b646bec711d1000000000000000000000000000000000000000000000000000000000090cb1ba3e1de64e2fd2e6d759be2a63acdbec6437b22f28f2424004b8100000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a806ff09f9a804d6f000000000000000000000000000000" + }, + { + "name": "random-(string,address,bool,address)", + "type": "(string,address,bool,address)", + "value": [ + "Moo é🚀ééMo oo o MéMoo éo é 🚀🚀ooé o oo🚀éMMooéo", + "0x815113d2B12f7e13c6b4f093250F52b68ce4ed84", + true, + "0xfae06EEb59f15259cA6b81172D1342C99CCEbB3D" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééMo oo o MéMoo éo é 🚀🚀ooé o oo🚀éMMooéo" + }, + { + "type": "address", + "value": "0x815113d2B12f7e13c6b4f093250F52b68ce4ed84" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xfae06EEb59f15259cA6b81172D1342C99CCEbB3D" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610206806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100f4565b60405180910390f35b604080516080810182526060808252600060208301819052928201839052810191909152604080516080810182526060808252600060208301819052928201839052810191909152600060405180608001604052806044815260200161018d6044913982525073815113d2b12f7e13c6b4f093250f52b68ce4ed8460208201526001604082015273fae06eeb59f15259ca6b81172d1342c99ccebb3d6060820152919050565b60006020808352835160808285015280518060a086015260005b8181101561012a5782810184015186820160c00152830161010e565b8181111561013c57600060c083880101525b50918501516001600160a01b03811660408601529160408601518015156060870152925060608601516001600160a01b03811660808701529250601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a80c3a9c3a94d6f20206f6f206f204dc3a94d6f6f20c3a96f2020c3a920f09f9a80f09f9a806f6fc3a9206f206f6ff09f9a80c3a94d4d6f6fc3a96fa2646970667358221220f696debba79adb5088f149e87133e20da1538672ff3e6631d012200e351ba63264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_264fcfa1 {\n string s_0;\n address s_1;\n bool s_2;\n address s_3;\n }\n\n function test () public pure returns (S_264fcfa1 memory) {\n S_264fcfa1 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀ééMo oo o MéMoo éo é 🚀🚀ooé o oo🚀éMMooéo\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x815113d2B12f7e13c6b4f093250F52b68ce4ed84;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xfae06EEb59f15259cA6b81172D1342C99CCEbB3D;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000815113d2b12f7e13c6b4f093250f52b68ce4ed840000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fae06eeb59f15259ca6b81172d1342c99ccebb3d00000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a80c3a9c3a94d6f20206f6f206f204dc3a94d6f6f20c3a96f2020c3a920f09f9a80f09f9a806f6fc3a9206f206f6ff09f9a80c3a94d4d6f6fc3a96f00000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,address,bool,bytes31)", + "type": "(string,address,bool,bytes31)", + "value": [ + "Moo é🚀Moooo éoM 🚀é🚀oé MMo ooooooo 🚀o🚀", + "0x45Caa5A74DF4993d44734bB1a9dfbF7069604b94", + false, + "0x4f7be3e0a262647edd18862267ce16d3954d3133ee4d98607464c47b146add" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Moooo éoM 🚀é🚀oé MMo ooooooo 🚀o🚀" + }, + { + "type": "address", + "value": "0x45Caa5A74DF4993d44734bB1a9dfbF7069604b94" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x4f7be3e0a262647edd18862267ce16d3954d3133ee4d98607464c47b146add" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610201806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610100565b60405180910390f35b6040805160808101825260608082526000602083018190529282018390528101919091526040805160808101825260608082526000602083018190529282018390528101919091526000604051806060016040528060388152602001610194603891398252507345caa5a74df4993d44734bb1a9dfbf7069604b946020820152600060408201527f4f7be3e0a262647edd18862267ce16d3954d3133ee4d98607464c47b146add006060820152919050565b60006020808352835160808285015280518060a086015260005b818110156101365782810184015186820160c00152830161011a565b8181111561014857600060c083880101525b50918501516001600160a01b038116604086015291604086015180151560608701529250606086015160ff19811660808701529250601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a804d6f6f6f6f20c3a96f4d20f09f9a80c3a9f09f9a806fc3a9204d4d6f206f6f6f6f6f6f6f20f09f9a806ff09f9a80a2646970667358221220f7a187b78cf3985428a78af72a667775ed15ee92cf979e7a704713fa6807319764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_553b9736 {\n string s_0;\n address s_1;\n bool s_2;\n bytes31 s_3;\n }\n\n function test () public pure returns (S_553b9736 memory) {\n S_553b9736 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀Moooo éoM 🚀é🚀oé MMo ooooooo 🚀o🚀\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x45Caa5A74DF4993d44734bB1a9dfbF7069604b94;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bytes31 r_3 = bytes31(0x4f7be3e0a262647edd18862267ce16d3954d3133ee4d98607464c47b146add);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000045caa5a74df4993d44734bb1a9dfbf7069604b9400000000000000000000000000000000000000000000000000000000000000004f7be3e0a262647edd18862267ce16d3954d3133ee4d98607464c47b146add0000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a804d6f6f6f6f20c3a96f4d20f09f9a80c3a9f09f9a806fc3a9204d4d6f206f6f6f6f6f6f6f20f09f9a806ff09f9a800000000000000000" + }, + { + "name": "random-(string,address,bool,uint80)", + "type": "(string,address,bool,uint80)", + "value": [ + "Moo é🚀MoéM é", + "0x79a3D48D6F1BB514b7ebFB803e9342ee60B7a9D4", + false, + "128055676924077911187697" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MoéM é" + }, + { + "type": "address", + "value": "0x79a3D48D6F1BB514b7ebFB803e9342ee60B7a9D4" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "128055676924077911187697" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101aa806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160808082018352606080835260006020808501829052848601829052938201819052845192830185528183528284018181528386018281529284018281528651808801885260128152714d6f6f20c3a9f09f9a804d6fc3a94d20c3a960701b968101969096529484527379a3d48d6f1bb514b7ebfb803e9342ee60b7a9d490529052691b1de9830e650a4a20f190915290516100d091906100d9565b60405180910390f35b60006020808352835160808285015280518060a086015260005b8181101561010f5782810184015186820160c0015283016100f3565b8181111561012157600060c083880101525b50918501516001600160a01b038116604086015291604086015180151560608701529250606086015169ffffffffffffffffffff811660808701529250601f01601f19169390930160c00194935050505056fea2646970667358221220eb9eaffe3a8dd8358b79f8e485677e81b8837b134fc56f8102283c1c4c45979d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_daf24bb2 {\n string s_0;\n address s_1;\n bool s_2;\n uint80 s_3;\n }\n\n function test () public pure returns (S_daf24bb2 memory) {\n S_daf24bb2 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀MoéM é\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x79a3D48D6F1BB514b7ebFB803e9342ee60B7a9D4;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n uint80 r_3 = 128055676924077911187697;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000079a3d48d6f1bb514b7ebfb803e9342ee60b7a9d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b1de9830e650a4a20f100000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a804d6fc3a94d20c3a90000000000000000000000000000" + }, + { + "name": "random-(string,address,int,(bool))", + "type": "(string,address,int,(bool))", + "value": [ + "Moo é🚀 ooo oo🚀o🚀oé🚀🚀ooé🚀oM éM", + "0x0eD3F884279B454526cd3477361b7457cA186310", + "17078730012065088075576366009633964332361127036836211699359595261810398926122", + [false] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 ooo oo🚀o🚀oé🚀🚀ooé🚀oM éM" + }, + { + "type": "address", + "value": "0x0eD3F884279B454526cd3477361b7457cA186310" + }, + { + "type": "number", + "value": "17078730012065088075576366009633964332361127036836211699359595261810398926122" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061021b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011f565b60405180910390f35b6100566100d9565b61005e6100d9565b60006040518060600160405280603381526020016101b360339139825250730ed3f884279b454526cd3477361b7457ca1863106020808301919091527f25c237f8111ae869c19b54f2f80cf8354d417fb9e1d025f4dbe875e5644b152a60408084019190915280519182019052600081526060820152919050565b60405180608001604052806060815260200160006001600160a01b031681526020016000815260200161011a60405180602001604052806000151581525090565b905290565b60006020808352835160808285015280518060a086015260005b818110156101555782810184015186820160c001528301610139565b8181111561016757600060c083880101525b50918501516001600160a01b038116604086015291604086015160608601526060860151925061019c60808601845115159052565b601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a80206f6f6f206f6ff09f9a806ff09f9a806fc3a9f09f9a80f09f9a806f6fc3a9f09f9a806f4d20c3a94da264697066735822122087a39f7eb735b4bd9c3cedaae33b3081d325c791330331df39f1ed62c1880ff864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_af777dd8 {\n string s_0;\n address s_1;\n int256 s_2;\n S_c1053bda s_3;\n }\n\n function test () public pure returns (S_af777dd8 memory) {\n S_af777dd8 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 ooo oo🚀o🚀oé🚀🚀ooé🚀oM éM\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x0eD3F884279B454526cd3477361b7457cA186310;\n r.s_1 = r_1;\n }\n {\n int r_2 = 17078730012065088075576366009633964332361127036836211699359595261810398926122;\n r.s_2 = r_2;\n }\n {\n S_c1053bda memory r_3;\n {\n bool r_3_0 = false;\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000ed3f884279b454526cd3477361b7457ca18631025c237f8111ae869c19b54f2f80cf8354d417fb9e1d025f4dbe875e5644b152a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80206f6f6f206f6ff09f9a806ff09f9a806fc3a9f09f9a80f09f9a806f6fc3a9f09f9a806f4d20c3a94d00000000000000000000000000" + }, + { + "name": "random-(string,bool,address,bool)", + "type": "(string,bool,address,bool)", + "value": ["Moo é🚀 éoéoM ", false, "0x05d55F069dCB9D98AAF6C73b6f0893b017dC0C62", false], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éoéoM " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x05d55F069dCB9D98AAF6C73b6f0893b017dC0C62" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610198806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b604080516080808201835260608083526000602080850182905284860182905293820181905284519283018552818352828401818152838601828152928401828152865180880188526013815272026b7b79061d4f84fcd401061d4b7e1d4b7a69606d1b968101969096529484528190527305d55f069dcb9d98aaf6c73b6f0893b017dc0c6290915290915290516100c891906100d1565b60405180910390f35b60006020808352835160808285015280518060a086015260005b818110156101075782810184015186820160c0015283016100eb565b8181111561011957600060c083880101525b509185015180151560408601529160408601516001600160a01b03811660608701529250606086015180151560808701529250601f01601f19169390930160c00194935050505056fea264697066735822122061c2bce15cdcca794f11b58c7abb43b2e89ae75de597d7b6baeb3ac7bd85006864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1f6b4b96 {\n string s_0;\n bool s_1;\n address s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_1f6b4b96 memory) {\n S_1f6b4b96 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 éoéoM \";\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x05d55F069dCB9D98AAF6C73b6f0893b017dC0C62;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d55f069dcb9d98aaf6c73b6f0893b017dc0c62000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a8020c3a96fc3a96f4d2000000000000000000000000000" + }, + { + "name": "random-(string,bool,string)[4]", + "type": "(string,bool,string)[4]", + "value": [ + ["Moo é🚀oMoM éo🚀o o 🚀🚀oé ", false, "Moo é🚀 oM🚀🚀o🚀🚀 oo "], + ["Moo é🚀🚀🚀éoM🚀Mo oo oMoo oMMoM🚀 oM", true, "Moo é🚀"], + ["Moo é🚀 oo", false, "Moo é🚀é🚀🚀🚀MM ééé oéoMéMMé🚀🚀 o🚀oé éMM"], + ["Moo é🚀Mé🚀MoéMM🚀M🚀oMooM o", true, "Moo é🚀Mo"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMoM éo🚀o o 🚀🚀oé " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 oM🚀🚀o🚀🚀 oo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀éoM🚀Mo oo oMoo oMMoM🚀 oM" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀é🚀🚀🚀MM ééé oéoMéMMé🚀🚀 o🚀oé éMM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mé🚀MoéMM🚀M🚀oMooM o" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀Mo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610441806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102a4565b60405180910390f35b610056610216565b61005e610216565b60408051606080820183528082526000602083015291810191909152600060405180606001604052806027815260200161036960279139825250600060208083018290526040805160608101909152602380825290916103c2908301396040838101919091529183525080516060808201835280825260006020830152918101919091526000604051806060016040528060328152602001610390603291398252506001602080830191909152604080518082018252600a8152689adede418753e13f3560b71b81840152818401528382019290925281516060808201845280825260008284018181528386019290925284518086018652600d81526c4d6f6f20c3a9f09f9a80206f6f60981b81860152835290819052835160808101909452604480855291939092909190610325908301396040838101919091528381019290925250805160608082018352808252600060208301529181019190915260006040518060600160405280602781526020016103e5602791398252506001602080830191909152604080518082018252600c81526b4d6f6f20c3a9f09f9a804d6f60a01b928101929092528201526060820152919050565b60405180608001604052806004905b604080516060808201835280825260006020830152918101919091528152602001906001900390816102255790505090565b6000815180845260005b8181101561027d57602081850181015186830182015201610261565b8181111561028f576000602083870101525b50601f01601f19169290920160200192915050565b602080825260009060a0830183820185845b600481101561031857601f198785030183528151606081518187526102dd82880182610257565b91505086820151151587870152604080830151925086820381880152506103048183610257565b9550505091840191908401906001016102b6565b5091969550505050505056fe4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a804d4d20c3a9c3a9c3a9206fc3a96f4dc3a94d4dc3a9f09f9a80f09f9a8020206ff09f9a806fc3a920c3a94d4d4d6f6f20c3a9f09f9a806f4d6f4d20c3a96ff09f9a806f206f20f09f9a80f09f9a806fc3a920204d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a96f4df09f9a804d6f206f6f20206f4d6f6f206f4d4d6f4df09f9a80206f4d4d6f6f20c3a9f09f9a8020206f4df09f9a80f09f9a806ff09f9a80f09f9a80206f6f204d6f6f20c3a9f09f9a804dc3a9f09f9a804d6fc3a94d4df09f9a804df09f9a806f4d6f6f4d206fa26469706673582212200851663ab044a133caa3c06b48441903564c312ab83c018219c406d8f7ff691664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4351c0df {\n string s_0;\n bool s_1;\n string s_2;\n }\n\n function test () public pure returns (S_4351c0df[4] memory) {\n S_4351c0df[4] memory r;\n {\n S_4351c0df memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀oMoM éo🚀o o 🚀🚀oé \";\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀 oM🚀🚀o🚀🚀 oo \";\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_4351c0df memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀🚀éoM🚀Mo oo oMoo oMMoM🚀 oM\";\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀\";\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_4351c0df memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 oo\";\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀é🚀🚀🚀MM ééé oéoMéMMé🚀🚀 o🚀oé éMM\";\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_4351c0df memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀Mé🚀MoéMM🚀M🚀oMooM o\";\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3.s_1 = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀Mo\";\n r_3.s_2 = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806f4d6f4d20c3a96ff09f9a806f206f20f09f9a80f09f9a806fc3a920200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a8020206f4df09f9a80f09f9a806ff09f9a80f09f9a80206f6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a96f4df09f9a804d6f206f6f20206f4d6f6f206f4d4d6f4df09f9a80206f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a80206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a804d4d20c3a9c3a9c3a9206fc3a96f4dc3a94d4dc3a9f09f9a80f09f9a8020206ff09f9a806fc3a920c3a94d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a804dc3a9f09f9a804d6fc3a94d4df09f9a804df09f9a806f4d6f6f4d206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a804d6f0000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bool,uint224,bytes19)", + "type": "(string,bool,uint224,bytes19)", + "value": [ + "Moo é🚀éoéMoo🚀oo🚀ooéé", + true, + "7929352425546039302414623540843426162738876888310655861848363013696", + "0x674466ebad4210bfd90b6c82e975b8a5d30cf6" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoéMoo🚀oo🚀ooéé" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "7929352425546039302414623540843426162738876888310655861848363013696" + }, + { + "type": "hexstring", + "value": "0x674466ebad4210bfd90b6c82e975b8a5d30cf6" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fe565b60405180910390f35b604080516080810182526060808252600060208301819052928201839052810191909152604080516080810182526060808252600060208301819052928201839052810191909152600060405180606001604052806022815260200161019e60229139825250600160208201527b4b4b3020f730d0191e228321354a5a4c87f9eade71cef0117780964060408201527233a23375d6a1085fec85b64174badc52e9867b60691b6060820152919050565b60006020808352835160808285015280518060a086015260005b818110156101345782810184015186820160c001528301610118565b8181111561014657600060c083880101525b509185015180151560408601529160408601516001600160e01b0381166060870152925060608601516cffffffffffffffffffffffffff19811660808701529250601f01601f19169390930160c00194935050505056fe4d6f6f20c3a9f09f9a80c3a96fc3a94d6f6ff09f9a806f6ff09f9a806f6fc3a9c3a9a26469706673582212203764c3923d2963c4a4431775a5b587751fe46bffc6505cde959df0d6c572326564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c66d90ca {\n string s_0;\n bool s_1;\n uint224 s_2;\n bytes19 s_3;\n }\n\n function test () public pure returns (S_c66d90ca memory) {\n S_c66d90ca memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éoéMoo🚀oo🚀ooéé\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n uint224 r_2 = 7929352425546039302414623540843426162738876888310655861848363013696;\n r.s_2 = r_2;\n }\n {\n bytes19 r_3 = bytes19(0x674466ebad4210bfd90b6c82e975b8a5d30cf6);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000004b4b3020f730d0191e228321354a5a4c87f9eade71cef01177809640674466ebad4210bfd90b6c82e975b8a5d30cf60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80c3a96fc3a94d6f6ff09f9a806f6ff09f9a806f6fc3a9c3a9000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bool[],bool)", + "type": "(string,bool[],bool)", + "value": [ + "Moo é🚀M éooo🚀Mé🚀Mo Méé éo 🚀o o🚀ooo ooMoo🚀ooé🚀MMoMéoéM o oMo🚀o", + [true, false, false, true], + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M éooo🚀Mé🚀Mo Méé éo 🚀o o🚀ooo ooMoo🚀ooé🚀MMoMéoéM o oMo🚀o" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102fa806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101bf565b60405180910390f35b604080516060808201835280825260208201526000918101919091526040805160608082018352808252602082015260009181019190915260006040518060800160405280605e8152602001610267605e913982525060408051600480825260a082019092526000916020820160808036833701905050905060006001905080826000815181106100e1576100e1610250565b602002602001019015159081151581525050506000808260018151811061010a5761010a610250565b602002602001019015159081151581525050506000808260028151811061013357610133610250565b60200260200101901515908115158152505050600060019050808260038151811061016057610160610250565b9115156020928302919091018201528301919091525060006040820152919050565b600081518084526020808501945080840160005b838110156101b4578151151587529582019590820190600101610196565b509495945050505050565b600060208083528351606082850152805180608086015260005b818110156101f55782810184015186820160a0015283016101d9565b8181111561020757600060a083880101525b5091850151601f92909201601f191684018481036080016040860152905061023260a0820183610182565b9150506040840151610248606085018215159052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d20c3a96f6f6ff09f9a804dc3a9f09f9a804d6f204dc3a9c3a920c3a96f20f09f9a806f206ff09f9a806f6f6f206f6f4d6f6ff09f9a806f6fc3a9f09f9a804d4d6f4dc3a96fc3a94d206f206f4d6ff09f9a806fa2646970667358221220ddd2879786fc7c4be7073225a4448e6195ee54f7182b8662f3b2437b30f9575664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_77790179 {\n string s_0;\n bool[] s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_77790179 memory) {\n S_77790179 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀M éooo🚀Mé🚀Mo Méé éo 🚀o o🚀ooo ooMoo🚀ooé🚀MMoMéoéM o oMo🚀o\";\n r.s_0 = r_0;\n }\n {\n bool[] memory r_1 = new bool[](4);\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1[2] = r_1_2;\n }\n {\n bool r_1_3 = true;\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a804d20c3a96f6f6ff09f9a804dc3a9f09f9a804d6f204dc3a9c3a920c3a96f20f09f9a806f206ff09f9a806f6f6f206f6f4d6f6ff09f9a806f6fc3a9f09f9a804d4d6f4dc3a96fc3a94d206f206f4d6ff09f9a806f000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(string,bytes31,bool,uint256)", + "type": "(string,bytes31,bool,uint256)", + "value": [ + "Moo é🚀", + "0x26624d8559730c3973de75356d707ee94067a09f8d5845d25a81d422e04c54", + true, + "28432250438509216880414774208555470162261860695005405011511823559452788089260" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x26624d8559730c3973de75356d707ee94067a09f8d5845d25a81d422e04c54" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "28432250438509216880414774208555470162261860695005405011511823559452788089260" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b60408051608080820183526060808352600060208085018290528486018290529382018190528451928301855281835282840181815283860182815292840191825285518087018752600a8152689adede418753e13f3560b71b958101959095529383527f26624d8559730c3973de75356d707ee94067a09f8d5845d25a81d422e04c5400909352600190527f3edc155e0b45e43e46e547396aa3c214f64f616e8f3a7c32c0f4d90d295561ac90915290516100ec91906100f5565b60405180910390f35b60006020808352835160808285015280518060a086015260005b8181101561012b5782810184015186820160c00152830161010f565b8181111561013d57600060c083880101525b509185015160ff198116604086015291604086015180151560608701529250606095909501516080850152505050601f91909101601f19160160c0019056fea2646970667358221220ec4722983f43ffff654cf77f8f8f9d824984870215c0a101507274c41040cf9764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_197d5182 {\n string s_0;\n bytes31 s_1;\n bool s_2;\n uint256 s_3;\n }\n\n function test () public pure returns (S_197d5182 memory) {\n S_197d5182 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀\";\n r.s_0 = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x26624d8559730c3973de75356d707ee94067a09f8d5845d25a81d422e04c54);\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n uint256 r_3 = 28432250438509216880414774208555470162261860695005405011511823559452788089260;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008026624d8559730c3973de75356d707ee94067a09f8d5845d25a81d422e04c540000000000000000000000000000000000000000000000000000000000000000013edc155e0b45e43e46e547396aa3c214f64f616e8f3a7c32c0f4d90d295561ac000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,string,bytes23,bool)", + "type": "(string,string,bytes23,bool)", + "value": [ + "Moo é🚀oooMMéooM oo🚀éo🚀oMo🚀oéoo 🚀éoooo ", + "Moo é🚀 éM M o é🚀 oM🚀🚀ooMo 🚀MéMéM é🚀éo🚀 Méo🚀🚀ooM 🚀 o", + "0x3be07bc3327e08fe9e4a7ea15f12d6c7e3a7540eee94a9", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooMMéooM oo🚀éo🚀oMo🚀oéoo 🚀éoooo " + }, + { + "type": "string", + "value": "Moo é🚀 éM M o é🚀 oM🚀🚀ooMo 🚀MéMéM é🚀éo🚀 Méo🚀🚀ooM 🚀 o" + }, + { + "type": "hexstring", + "value": "0x3be07bc3327e08fe9e4a7ea15f12d6c7e3a7540eee94a9" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610286806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610155565b60405180910390f35b60408051608081018252606080825260208201819052600092820183905281019190915260408051608081018252606080825260208201819052600092820183905281019190915260006040518060600160405280603a81526020016101be603a913982525060408051608081019091526059808252600091906101f860208301396020830152507f3be07bc3327e08fe9e4a7ea15f12d6c7e3a7540eee94a9000000000000000000604082015260006060820152919050565b6000815180845260005b8181101561012e57602081850181015186830182015201610112565b81811115610140576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516080602084015261017160a0840182610108565b90506020840151601f1984830301604085015261018e8282610108565b91505068ffffffffffffffffff196040850151166060840152606084015115156080840152809150509291505056fe4d6f6f20c3a9f09f9a806f6f6f4d4dc3a96f6f4d206f6ff09f9a80c3a96ff09f9a806f4d6ff09f9a806fc3a96f6f20f09f9a80c3a96f6f6f6f204d6f6f20c3a9f09f9a8020c3a94d204d206f20c3a9f09f9a80206f4df09f9a80f09f9a806f6f4d6f20f09f9a804dc3a94dc3a94d20c3a9f09f9a80c3a96ff09f9a80204dc3a96ff09f9a80f09f9a806f6f4d20f09f9a80206fa2646970667358221220eb31af286bac89e0ec8defb0ef18f9ab01bf9919b33716ce486bc6539d2e2ec364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b05116ba {\n string s_0;\n string s_1;\n bytes23 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_b05116ba memory) {\n S_b05116ba memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oooMMéooM oo🚀éo🚀oMo🚀oéoo 🚀éoooo \";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 éM M o é🚀 oM🚀🚀ooMo 🚀MéMéM é🚀éo🚀 Méo🚀🚀ooM 🚀 o\";\n r.s_1 = r_1;\n }\n {\n bytes23 r_2 = bytes23(0x3be07bc3327e08fe9e4a7ea15f12d6c7e3a7540eee94a9);\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e03be07bc3327e08fe9e4a7ea15f12d6c7e3a7540eee94a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a806f6f6f4d4dc3a96f6f4d206f6ff09f9a80c3a96ff09f9a806f4d6ff09f9a806fc3a96f6f20f09f9a80c3a96f6f6f6f2000000000000000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a8020c3a94d204d206f20c3a9f09f9a80206f4df09f9a80f09f9a806f6f4d6f20f09f9a804dc3a94dc3a94d20c3a9f09f9a80c3a96ff09f9a80204dc3a96ff09f9a80f09f9a806f6f4d20f09f9a80206f00000000000000" + }, + { + "name": "random-(string,string,uint72,(int144))", + "type": "(string,string,uint72,(int144))", + "value": [ + "Moo é🚀 é ooéoooééoMoo🚀é oé 🚀ooMo🚀 o ", + "Moo é🚀", + "4696861604126051610964", + ["8405176063811492303893542841225740592083144"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é ooéoooééoMoo🚀é oé 🚀ooMo🚀 o " + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "4696861604126051610964" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "8405176063811492303893542841225740592083144" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610248806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610171565b60405180910390f35b6100566100db565b61005e6100db565b60006040518060600160405280603881526020016101db60389139825250604080518082018252600a8152689adede418753e13f3560b71b6020808301919091528084019190915268fe9e0c77e9d0b1315482840152815190810190915271607c97aaea05090805be968f104eccbff0c881526060820152919050565b60405180608001604052806060815260200160608152602001600068ffffffffffffffffff16815260200161011f6040518060200160405280600060110b81525090565b905290565b6000815180845260005b8181101561014a5760208185018101518683018201520161012e565b8181111561015c576000602083870101525b50601f01601f19169290920160200192915050565b60208152600082516080602084015261018d60a0840182610124565b90506020840151601f198483030160408501526101aa8282610124565b91505068ffffffffffffffffff604085015116606084015260608401515160110b6080840152809150509291505056fe4d6f6f20c3a9f09f9a8020c3a920206f6fc3a96f6f6fc3a9c3a96f4d6f6ff09f9a80c3a9206fc3a920f09f9a806f6f4d6ff09f9a80206f20a26469706673582212203b6205f7551fe79c0d3715911e9f8c0eb03219e4c216cc3cd840c44a4e04639164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f21f5033 {\n int144 s_0;\n }\n\n struct S_9a2e45f0 {\n string s_0;\n string s_1;\n uint72 s_2;\n S_f21f5033 s_3;\n }\n\n function test () public pure returns (S_9a2e45f0 memory) {\n S_9a2e45f0 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 é ooéoooééoMoo🚀é oé 🚀ooMo🚀 o \";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n uint72 r_2 = 4696861604126051610964;\n r.s_2 = r_2;\n }\n {\n S_f21f5033 memory r_3;\n {\n int144 r_3_0 = 8405176063811492303893542841225740592083144;\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000fe9e0c77e9d0b131540000000000000000000000000000607c97aaea05090805be968f104eccbff0c800000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a8020c3a920206f6fc3a96f6f6fc3a9c3a96f4d6f6ff09f9a80c3a9206fc3a920f09f9a806f6f4d6ff09f9a80206f200000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,uint48,int32)[4]", + "type": "(string,uint48,int32)[4]", + "value": [ + [ + "Moo é🚀o é🚀 ooé MéMoM🚀🚀oMMoMM🚀M é MMéooMé MoéMMM🚀M🚀oéMé o🚀o", + "192913503420933", + "-59377446" + ], + ["Moo é🚀é ééoo", "74822720784228", "-1102617257"], + ["Moo é🚀MMMééoo🚀Mo ", "42392804403717", "282475144"], + ["Moo é🚀🚀o🚀oo MéMo🚀M o🚀MMéooé 🚀oMo🚀🚀", "129126784630786", "-255185507"] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o é🚀 ooé MéMoM🚀🚀oMMoMM🚀M é MMéooMé MoéMMM🚀M🚀oéMé o🚀o" + }, + { + "type": "number", + "value": "192913503420933" + }, + { + "type": "number", + "value": "-59377446" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é ééoo" + }, + { + "type": "number", + "value": "74822720784228" + }, + { + "type": "number", + "value": "-1102617257" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMMééoo🚀Mo " + }, + { + "type": "number", + "value": "42392804403717" + }, + { + "type": "number", + "value": "282475144" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o🚀oo MéMo🚀M o🚀MMéooé 🚀oMo🚀🚀" + }, + { + "type": "number", + "value": "129126784630786" + }, + { + "type": "number", + "value": "-255185507" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610392806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610206565b60405180910390f35b6100566101c7565b61005e6101c7565b604080516060808201835281526000602082018190529181019190915260006040518060800160405280605f81526020016102fe605f913982525065af742cd8020560208083019190915263038a07251960408084019190915291835281516060808201845280825260008284018181528386018281528651808801885260148152734d6f6f20c3a9f09f9a80c3a92020c3a9c3a96f6f60601b81880152855265440d05b187649091526341b89aa8199052858401929092528351808201855281815280840183815281860184815286518088018852601a81527f4d6f6f20c3a9f09f9a804d4d4dc3a9c3a96f6ff09f9a804d6f2000000000000081880152835265268e580c2a059091526310d63a88905285850152835180820185528181528084018390528085018390528451918201909452603e80825291929091906102c090830139825250657570ac2100026020820152630f35d2621960408201526060820152919050565b60405180608001604052806004905b60408051606080820183528152600060208083018290529282015282526000199092019101816101d65790505090565b602080825260009060a083018382018584805b60048110156102b257601f1980898703018552835160608151818952805180838b01528692505b8083101561025e578183018b01518a840160800152918a0191610240565b8083111561026f57866080828c0101525b8a84015165ffffffffffff168a8c0152604093840151600381900b858c0152939250601f0190931697909701608001965050509285019291850191600101610219565b509297965050505050505056fe4d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6f204dc3a94d6ff09f9a804d206ff09f9a804d4dc3a96f6fc3a920f09f9a806f4d6ff09f9a80f09f9a804d6f6f20c3a9f09f9a806f20c3a9f09f9a80206f6fc3a92020204dc3a94d6f4df09f9a80f09f9a806f4d4d6f4d4df09f9a804d2020c3a9204d4dc3a96f6f4dc3a9204d6fc3a94d4d4df09f9a804df09f9a806fc3a94dc3a9206ff09f9a806fa2646970667358221220c911866e70f0e2c1142150f3132fd97ead5a2048206c09b09f599a249652b8d164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ca7996fc {\n string s_0;\n uint48 s_1;\n int32 s_2;\n }\n\n function test () public pure returns (S_ca7996fc[4] memory) {\n S_ca7996fc[4] memory r;\n {\n S_ca7996fc memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀o é🚀 ooé MéMoM🚀🚀oMMoMM🚀M é MMéooMé MoéMMM🚀M🚀oéMé o🚀o\";\n r_0.s_0 = r_0_0;\n }\n {\n uint48 r_0_1 = 192913503420933;\n r_0.s_1 = r_0_1;\n }\n {\n int32 r_0_2 = -59377446;\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_ca7996fc memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀é ééoo\";\n r_1.s_0 = r_1_0;\n }\n {\n uint48 r_1_1 = 74822720784228;\n r_1.s_1 = r_1_1;\n }\n {\n int32 r_1_2 = -1102617257;\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_ca7996fc memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀MMMééoo🚀Mo \";\n r_2.s_0 = r_2_0;\n }\n {\n uint48 r_2_1 = 42392804403717;\n r_2.s_1 = r_2_1;\n }\n {\n int32 r_2_2 = 282475144;\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_ca7996fc memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀🚀o🚀oo MéMo🚀M o🚀MMéooé 🚀oMo🚀🚀\";\n r_3.s_0 = r_3_0;\n }\n {\n uint48 r_3_1 = 129126784630786;\n r_3.s_1 = r_3_1;\n }\n {\n int32 r_3_2 = -255185507;\n r_3.s_2 = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000af742cd80205fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc75f8da000000000000000000000000000000000000000000000000000000000000005f4d6f6f20c3a9f09f9a806f20c3a9f09f9a80206f6fc3a92020204dc3a94d6f4df09f9a80f09f9a806f4d4d6f4d4df09f9a804d2020c3a9204d4dc3a96f6f4dc3a9204d6fc3a94d4d4df09f9a804df09f9a806fc3a94dc3a9206ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000440d05b18764ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe47655700000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a80c3a92020c3a9c3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000268e580c2a050000000000000000000000000000000000000000000000000000000010d63a88000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a804d4d4dc3a9c3a96f6ff09f9a804d6f20000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000007570ac210002fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0ca2d9d000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6f204dc3a94d6ff09f9a804d206ff09f9a804d4dc3a96f6fc3a920f09f9a806f4d6ff09f9a80f09f9a800000" + }, + { + "name": "random-(string[3][4][1])", + "type": "(string[3][4][1])", + "value": [ + [ + [ + [ + "Moo é🚀 🚀MM oo🚀oo oMéooo 🚀 Mooé🚀M 🚀éo🚀🚀é🚀o o 🚀", + "Moo é🚀Mo🚀🚀éoMoé🚀ooMooMMoo", + "Moo é🚀oo🚀éoo é🚀M🚀 o 🚀 ooMo oéoMMMMoMoMo 🚀o oo🚀oo" + ], + [ + "Moo é🚀oMé🚀éoM éé🚀Méo🚀 MéM oo oéé🚀 ooM Mé", + "Moo é🚀 Moo🚀oéo🚀éooé🚀🚀Mo🚀éooMé🚀oéo🚀o o 🚀Mo 🚀é🚀oéoo", + "Moo é🚀" + ], + [ + "Moo é🚀 oo o🚀oo🚀M🚀oM é🚀oooo🚀oo é", + "Moo é🚀o éM🚀🚀 oooM🚀 ooMo oMoooé é🚀é🚀éMéoooo é éMé éooé🚀ooM", + "Moo é🚀🚀🚀🚀M🚀oé" + ], + [ + "Moo é🚀oo o ooooo", + "Moo é🚀", + "Moo é🚀oMoM M éoéMooéM🚀🚀oMMéMo🚀oM🚀 🚀é🚀🚀oo 🚀 🚀MM🚀Méo o" + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀MM oo🚀oo oMéooo 🚀 Mooé🚀M 🚀éo🚀🚀é🚀o o 🚀" + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀🚀éoMoé🚀ooMooMMoo" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀éoo é🚀M🚀 o 🚀 ooMo oéoMMMMoMoMo 🚀o oo🚀oo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMé🚀éoM éé🚀Méo🚀 MéM oo oéé🚀 ooM Mé" + }, + { + "type": "string", + "value": "Moo é🚀 Moo🚀oéo🚀éooé🚀🚀Mo🚀éooMé🚀oéo🚀o o 🚀Mo 🚀é🚀oéoo" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oo o🚀oo🚀M🚀oM é🚀oooo🚀oo é" + }, + { + "type": "string", + "value": "Moo é🚀o éM🚀🚀 oooM🚀 ooMo oMoooé é🚀é🚀éMéoooo é éMé éooé🚀ooM" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀M🚀oé" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo o ooooo" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oMoM M éoéMooéM🚀🚀oMMéMo🚀oM🚀 🚀é🚀🚀oo 🚀 🚀MM🚀Méo o" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061067b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610303565b60405180910390f35b61005661026a565b61005e61026a565b610066610282565b61006e6102af565b6100766102dc565b60006040518060800160405280605381526020016105146053913982525060408051606081019091526028808252600091906105c2602083013990508082600160200201819052505060006040518060800160405280604981526020016104526049913960408301525081526100ea6102dc565b60006040518060800160405280604381526020016104d1604391398252506040805160808101909152605b808252600091906103f76020830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b81840152908401528301919091525061015e6102dc565b600060405180606001604052806036815260200161049b603691398252506040805160808101909152605b808252600091906105676020830139602083810191909152604080518082018252601e81527f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a804df09f9a806fc3a900009281019290925280840191909152830191909152506101ec6102dc565b60408051808201825260148152734d6f6f20c3a9f09f9a806f6f206f206f6f6f6f6f60601b60208083019190915290835281518083018352600a8152689adede418753e13f3560b71b8183015283820152815160808101909252605c808352600092916105ea90830139604083015250606082015281528152919050565b604051806020016040528061027d610282565b905290565b60405180602001604052806001905b6102996102af565b8152602001906001900390816102915790505090565b60405180608001604052806004905b6102c66102dc565b8152602001906001900390816102be5790505090565b60405180606001604052806003905b60608152602001906001900390816102eb5790505090565b6020815260008251602080840152604083016060840160005b60018110156103ec57858203603f190183528351826080810160005b60048110156103d45785820383528351826060810160005b60038110156103bc5785820383528351805180845260005b8181101561038457602081840181015186830182015201610368565b81811115610396576000602083870101525b5060209586019594850194601f91909101601f1916939093019092019150600101610350565b50602096870196959095019493505050600101610338565b5060209687019695909501949350505060010161031c565b509594505050505056fe4d6f6f20c3a9f09f9a80204d6f6ff09f9a806fc3a96ff09f9a80c3a96f6fc3a9f09f9a80f09f9a804d6ff09f9a80c3a96f6f4dc3a9f09f9a806fc3a96ff09f9a806f206f20f09f9a804d6f20f09f9a80c3a9f09f9a806fc3a96f6f4d6f6f20c3a9f09f9a806f6ff09f9a80c3a96f6f20c3a9f09f9a804df09f9a80206f20f09f9a80206f6f4d6f206fc3a96f4d4d4d4d6f4d6f4d6f20f09f9a806f206f6ff09f9a806f6f4d6f6f20c3a9f09f9a80206f6f2020206ff09f9a806f6ff09f9a804df09f9a806f4d20c3a9f09f9a806f6f6f6ff09f9a806f6f20c3a94d6f6f20c3a9f09f9a806f4dc3a9f09f9a80c3a96f4d2020c3a9c3a9f09f9a804dc3a96ff09f9a80204dc3a94d20206f6f206fc3a9c3a9f09f9a80206f6f4d204dc3a94d6f6f20c3a9f09f9a8020f09f9a804d4d206f6ff09f9a806f6f206f4dc3a96f6f6f202020f09f9a8020204d6f6fc3a9f09f9a804d20f09f9a80c3a96ff09f9a80f09f9a80c3a9f09f9a806f206f20f09f9a804d6f6f20c3a9f09f9a806f2020c3a94df09f9a80f09f9a80206f6f6f4df09f9a80206f6f4d6f206f4d6f6f6fc3a920c3a9f09f9a80c3a9f09f9a80c3a94dc3a96f6f6f6f20c3a920c3a94dc3a920c3a96f6fc3a9f09f9a806f6f4d4d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a80c3a96f4d6fc3a9f09f9a806f6f4d6f6f4d4d6f6f4d6f6f20c3a9f09f9a806f4d6f4d204d20c3a96fc3a94d6f6fc3a94df09f9a80f09f9a806f4d4dc3a94d6ff09f9a806f4df09f9a8020f09f9a80c3a9f09f9a80f09f9a806f6f20f09f9a8020f09f9a804d4df09f9a804dc3a96f206fa2646970667358221220fdcb776b044694abe47c9e302577425ce51983fe6df837cefec6acb6b591f20564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3a92734c {\n string[3][4][1] s_0;\n }\n\n function test () public pure returns (S_3a92734c memory) {\n S_3a92734c memory r;\n {\n string[3][4][1] memory r_0;\n {\n string[3][4] memory r_0_0;\n {\n string[3] memory r_0_0_0;\n {\n string memory r_0_0_0_0 = unicode\"Moo é🚀 🚀MM oo🚀oo oMéooo 🚀 Mooé🚀M 🚀éo🚀🚀é🚀o o 🚀\";\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n string memory r_0_0_0_1 = unicode\"Moo é🚀Mo🚀🚀éoMoé🚀ooMooMMoo\";\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n string memory r_0_0_0_2 = unicode\"Moo é🚀oo🚀éoo é🚀M🚀 o 🚀 ooMo oéoMMMMoMoMo 🚀o oo🚀oo\";\n r_0_0_0[2] = r_0_0_0_2;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n string[3] memory r_0_0_1;\n {\n string memory r_0_0_1_0 = unicode\"Moo é🚀oMé🚀éoM éé🚀Méo🚀 MéM oo oéé🚀 ooM Mé\";\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀 Moo🚀oéo🚀éooé🚀🚀Mo🚀éooMé🚀oéo🚀o o 🚀Mo 🚀é🚀oéoo\";\n r_0_0_1[1] = r_0_0_1_1;\n }\n {\n string memory r_0_0_1_2 = unicode\"Moo é🚀\";\n r_0_0_1[2] = r_0_0_1_2;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n string[3] memory r_0_0_2;\n {\n string memory r_0_0_2_0 = unicode\"Moo é🚀 oo o🚀oo🚀M🚀oM é🚀oooo🚀oo é\";\n r_0_0_2[0] = r_0_0_2_0;\n }\n {\n string memory r_0_0_2_1 = unicode\"Moo é🚀o éM🚀🚀 oooM🚀 ooMo oMoooé é🚀é🚀éMéoooo é éMé éooé🚀ooM\";\n r_0_0_2[1] = r_0_0_2_1;\n }\n {\n string memory r_0_0_2_2 = unicode\"Moo é🚀🚀🚀🚀M🚀oé\";\n r_0_0_2[2] = r_0_0_2_2;\n }\n r_0_0[2] = r_0_0_2;\n }\n {\n string[3] memory r_0_0_3;\n {\n string memory r_0_0_3_0 = unicode\"Moo é🚀oo o ooooo\";\n r_0_0_3[0] = r_0_0_3_0;\n }\n {\n string memory r_0_0_3_1 = unicode\"Moo é🚀\";\n r_0_0_3[1] = r_0_0_3_1;\n }\n {\n string memory r_0_0_3_2 = unicode\"Moo é🚀oMoM M éoéMooéM🚀🚀oMMéMo🚀oM🚀 🚀é🚀🚀oo 🚀 🚀MM🚀Méo o\";\n r_0_0_3[2] = r_0_0_3_2;\n }\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a8020f09f9a804d4d206f6ff09f9a806f6f206f4dc3a96f6f6f202020f09f9a8020204d6f6fc3a9f09f9a804d20f09f9a80c3a96ff09f9a80f09f9a80c3a9f09f9a806f206f20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a80c3a96f4d6fc3a9f09f9a806f6f4d6f6f4d4d6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a806f6ff09f9a80c3a96f6f20c3a9f09f9a804df09f9a80206f20f09f9a80206f6f4d6f206fc3a96f4d4d4d4d6f4d6f4d6f20f09f9a806f206f6ff09f9a806f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a806f4dc3a9f09f9a80c3a96f4d2020c3a9c3a9f09f9a804dc3a96ff09f9a80204dc3a94d20206f6f206fc3a9c3a9f09f9a80206f6f4d204dc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a80204d6f6ff09f9a806fc3a96ff09f9a80c3a96f6fc3a9f09f9a80f09f9a804d6ff09f9a80c3a96f6f4dc3a9f09f9a806fc3a96ff09f9a806f206f20f09f9a804d6f20f09f9a80c3a9f09f9a806fc3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80206f6f2020206ff09f9a806f6ff09f9a804df09f9a806f4d20c3a9f09f9a806f6f6f6ff09f9a806f6f20c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a806f2020c3a94df09f9a80f09f9a80206f6f6f4df09f9a80206f6f4d6f206f4d6f6f6fc3a920c3a9f09f9a80c3a9f09f9a80c3a94dc3a96f6f6f6f20c3a920c3a94dc3a920c3a96f6fc3a9f09f9a806f6f4d0000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a804df09f9a806fc3a90000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806f6f206f206f6f6f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806f4d6f4d204d20c3a96fc3a94d6f6fc3a94df09f9a80f09f9a806f4d4dc3a94d6ff09f9a806f4df09f9a8020f09f9a80c3a9f09f9a80f09f9a806f6f20f09f9a8020f09f9a804d4df09f9a804dc3a96f206f00000000" + }, + { + "name": "random-(uint,address[4],(bytes4))", + "type": "(uint,address[4],(bytes4))", + "value": [ + "70901747271732806004964044089535025384446225808902146118841308291816282569448", + [ + "0x321972D66cD706deDbFfe7c94B9C6cd1253FB6B6", + "0x941De6Bf1B33f04e4f72Bc5a85109EAC6CB66e8a", + "0xEbfB8884dc54991129d0096599C86a95cCeb9031", + "0x413012752d7C6050D508Ec0b9c50fB75A74f42Dd" + ], + ["0x6ed5e7b6"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "70901747271732806004964044089535025384446225808902146118841308291816282569448" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x321972D66cD706deDbFfe7c94B9C6cd1253FB6B6" + }, + { + "type": "address", + "value": "0x941De6Bf1B33f04e4f72Bc5a85109EAC6CB66e8a" + }, + { + "type": "address", + "value": "0xEbfB8884dc54991129d0096599C86a95cCeb9031" + }, + { + "type": "address", + "value": "0x413012752d7C6050D508Ec0b9c50fB75A74f42Dd" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6ed5e7b6" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610167565b60405180910390f35b610056610117565b61005e610117565b7f9cc0f782bf7a955f2179e686dfa7511a8d308dd7fe8f36669be7ba4ecbf2bae88152610089610149565b73321972d66cd706dedbffe7c94b9c6cd1253fb6b6815273941de6bf1b33f04e4f72bc5a85109eac6cb66e8a60208083019190915273ebfb8884dc54991129d0096599c86a95cceb903160408084019190915273413012752d7c6050d508ec0b9c50fb75a74f42dd6060840152838201929092528151908101825263376af3db60e11b815290820152919050565b604051806060016040528060008152602001610131610149565b81526040805160208181019092526000815291015290565b60405180608001604052806004906020820280368337509192915050565b8151815260208083015160c08301919081840160005b60048110156101a35782516001600160a01b03168252918301919083019060010161017d565b5050505060409290920151516001600160e01b03191660a091909101529056fea2646970667358221220bcfda59a9a5660c5eecaf4942d1b77960e9b495df686267245ce392d91e4bfbf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_55eba628 {\n bytes4 s_0;\n }\n\n struct S_f3b90052 {\n uint256 s_0;\n address[4] s_1;\n S_55eba628 s_2;\n }\n\n function test () public pure returns (S_f3b90052 memory) {\n S_f3b90052 memory r;\n {\n uint r_0 = 70901747271732806004964044089535025384446225808902146118841308291816282569448;\n r.s_0 = r_0;\n }\n {\n address[4] memory r_1;\n {\n address r_1_0 = 0x321972D66cD706deDbFfe7c94B9C6cd1253FB6B6;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0x941De6Bf1B33f04e4f72Bc5a85109EAC6CB66e8a;\n r_1[1] = r_1_1;\n }\n {\n address r_1_2 = 0xEbfB8884dc54991129d0096599C86a95cCeb9031;\n r_1[2] = r_1_2;\n }\n {\n address r_1_3 = 0x413012752d7C6050D508Ec0b9c50fB75A74f42Dd;\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n S_55eba628 memory r_2;\n {\n bytes4 r_2_0 = bytes4(0x6ed5e7b6);\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x9cc0f782bf7a955f2179e686dfa7511a8d308dd7fe8f36669be7ba4ecbf2bae8000000000000000000000000321972d66cd706dedbffe7c94b9c6cd1253fb6b6000000000000000000000000941de6bf1b33f04e4f72bc5a85109eac6cb66e8a000000000000000000000000ebfb8884dc54991129d0096599c86a95cceb9031000000000000000000000000413012752d7c6050d508ec0b9c50fb75a74f42dd6ed5e7b600000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint,bool,string,string)", + "type": "(uint,bool,string,string)", + "value": [ + "82765636726136641807061904958593716459615058397976371654824866368703923600900", + false, + "Moo é🚀 🚀🚀 oMé🚀🚀MMMM oM é🚀MoMo🚀éo ééo🚀Mo🚀é ", + "Moo é🚀ééoMé oo é🚀é🚀oooM oMooM🚀ééo 🚀éo o o é 🚀oooMooé 🚀é ooM " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "82765636726136641807061904958593716459615058397976371654824866368703923600900" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 🚀🚀 oMé🚀🚀MMMM oM é🚀MoMo🚀éo ééo🚀Mo🚀é " + }, + { + "type": "string", + "value": "Moo é🚀ééoMé oo é🚀é🚀oooM oMooM🚀ééo 🚀éo o o é 🚀oooMooé 🚀é ooM " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102a3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610169565b60405180910390f35b61007b60405180608001604052806000815260200160001515815260200160608152602001606081525090565b6100a860405180608001604052806000815260200160001515815260200160608152602001606081525090565b7fb6fbb0b819f9c8e2c402c35247efb07952615bfe522a1fd16d04f78e9381be048152600060208083018290526040805160808101909152604c8082529091610222908301396040808401919091528051608081019091526060808252600092506101c26020830139606083015250919050565b6000815180845260005b8181101561014257602081850181015186830182015201610126565b81811115610154576000602083870101525b50601f01601f19169290920160200192915050565b6020815281516020820152602082015115156040820152600060408301516080606084015261019b60a084018261011c565b90506060840151601f198483030160808501526101b8828261011c565b9594505050505056fe4d6f6f20c3a9f09f9a80c3a9c3a96f4dc3a920206f6f20c3a9f09f9a80c3a9f09f9a806f6f6f4d206f4d6f6f4df09f9a80c3a9c3a96f20f09f9a80c3a96f206f2020206f20c3a920f09f9a806f6f6f4d6f6fc3a920f09f9a80c3a9206f6f4d204d6f6f20c3a9f09f9a8020f09f9a80f09f9a80206f4dc3a9f09f9a80f09f9a804d4d4d4d206f4d20c3a9f09f9a804d6f4d6ff09f9a80c3a96f20c3a9c3a96ff09f9a804d6ff09f9a80c3a920a26469706673582212207ae24371f59d593a91cb4a03c9c4fea468dc223ed83edb25f1916d85ca01425864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c00b13ee {\n uint256 s_0;\n bool s_1;\n string s_2;\n string s_3;\n }\n\n function test () public pure returns (S_c00b13ee memory) {\n S_c00b13ee memory r;\n {\n uint r_0 = 82765636726136641807061904958593716459615058397976371654824866368703923600900;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀 🚀🚀 oMé🚀🚀MMMM oM é🚀MoMo🚀éo ééo🚀Mo🚀é \";\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀ééoMé oo é🚀é🚀oooM oMooM🚀ééo 🚀éo o o é 🚀oooMooé 🚀é ooM \";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020b6fbb0b819f9c8e2c402c35247efb07952615bfe522a1fd16d04f78e9381be04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a8020f09f9a80f09f9a80206f4dc3a9f09f9a80f09f9a804d4d4d4d206f4d20c3a9f09f9a804d6f4d6ff09f9a80c3a96f20c3a9c3a96ff09f9a804d6ff09f9a80c3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a80c3a9c3a96f4dc3a920206f6f20c3a9f09f9a80c3a9f09f9a806f6f6f4d206f4d6f6f4df09f9a80c3a9c3a96f20f09f9a80c3a96f206f2020206f20c3a920f09f9a806f6f6f4d6f6fc3a920f09f9a80c3a9206f6f4d20" + }, + { + "name": "random-(uint112,string[2])[2]", + "type": "(uint112,string[2])[2]", + "value": [ + [ + "2274159182948135245562043898993072", + ["Moo é🚀oé oo🚀M oé🚀🚀oo🚀oooé o🚀🚀é 🚀", "Moo é🚀ooooM🚀ooé🚀🚀🚀M éooMooM 🚀o"] + ], + [ + "3266559399751888075774399994023452", + [ + "Moo é🚀ooM MMoo o 🚀oM🚀oM 🚀oooéMéMo o Mé🚀oM🚀MooM", + "Moo é🚀o Mé 🚀éo MMoM🚀oo🚀 Mo o🚀 M ooMoo🚀oMMo🚀é éM" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2274159182948135245562043898993072" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé oo🚀M oé🚀🚀oo🚀oooé o🚀🚀é 🚀" + }, + { + "type": "string", + "value": "Moo é🚀ooooM🚀ooé🚀🚀🚀M éooMooM 🚀o" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3266559399751888075774399994023452" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooM MMoo o 🚀oM🚀oM 🚀oooéMéMo o Mé🚀oM🚀MooM" + }, + { + "type": "string", + "value": "Moo é🚀o Mé 🚀éo MMoM🚀oo🚀 Mo o🚀 M ooMoo🚀oMMo🚀é éM" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103c6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101bb565b60405180910390f35b61005661013f565b61005e61013f565b61006661016c565b6d701feca1fe7f65eef46b792719b0815261007f610194565b60006040518060600160405280603d8152602001610354603d913982525060408051606081019091526033808252600091906102dc60208301396020808401919091528301919091525081526100d361016c565b6da10dc6ad3a451e886cf013f64e1c81526100ec610194565b600060405180608001604052806045815260200161030f604591398252506040805160808101909152604a8082526000919061029260208301396020808401919091528381019290925250820152919050565b60405180604001604052806002905b61015661016c565b81526020019060019003908161014e5790505090565b604051806040016040528060006001600160701b0316815260200161018f610194565b905290565b60405180604001604052806002905b60608152602001906001900390816101a35790505090565b60208082526000906060830183820185845b60028082106101dc5750610285565b601f1988860381018552835180516001600160701b03168752870151604088880181905287016080880160005b8581101561026e57898203603f190183528351805180845260005b8181101561023f578281018e01518582018f01528d01610224565b818111156102505760008e83870101525b50948c0194938c0193601f018616929092018b019150600101610209565b5097505050938601935050908401906001016101cd565b5091969550505050505056fe4d6f6f20c3a9f09f9a806f204dc3a920f09f9a80c3a96f204d4d6f4df09f9a806f6ff09f9a8020204d6f206ff09f9a80204d206f6f4d6f6ff09f9a806f4d4d6ff09f9a80c3a920c3a94d4d6f6f20c3a9f09f9a806f6f6f6f4df09f9a806f6fc3a9f09f9a80f09f9a80f09f9a804d20c3a96f6f4d6f6f4d20f09f9a806f4d6f6f20c3a9f09f9a806f6f4d20204d4d6f6f206f20f09f9a806f4df09f9a806f4d20f09f9a806f6f6fc3a94dc3a94d6f206f204dc3a9f09f9a806f4df09f9a804d6f6f4d4d6f6f20c3a9f09f9a806fc3a9206f6ff09f9a804d206fc3a9f09f9a80f09f9a806f6ff09f9a806f6f6fc3a9206ff09f9a80f09f9a80c3a920f09f9a80a264697066735822122079a2b69411a3ecab0b931d90641ce672bbc42f4d8c9fd5470b7ff84dbe5bebca64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_dacd6a38 {\n uint112 s_0;\n string[2] s_1;\n }\n\n function test () public pure returns (S_dacd6a38[2] memory) {\n S_dacd6a38[2] memory r;\n {\n S_dacd6a38 memory r_0;\n {\n uint112 r_0_0 = 2274159182948135245562043898993072;\n r_0.s_0 = r_0_0;\n }\n {\n string[2] memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀oé oo🚀M oé🚀🚀oo🚀oooé o🚀🚀é 🚀\";\n r_0_1[0] = r_0_1_0;\n }\n {\n string memory r_0_1_1 = unicode\"Moo é🚀ooooM🚀ooé🚀🚀🚀M éooMooM 🚀o\";\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_dacd6a38 memory r_1;\n {\n uint112 r_1_0 = 3266559399751888075774399994023452;\n r_1.s_0 = r_1_0;\n }\n {\n string[2] memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀ooM MMoo o 🚀oM🚀oM 🚀oooéMéMo o Mé🚀oM🚀MooM\";\n r_1_1[0] = r_1_1_0;\n }\n {\n string memory r_1_1_1 = unicode\"Moo é🚀o Mé 🚀éo MMoM🚀oo🚀 Mo o🚀 M ooMoo🚀oMMo🚀é éM\";\n r_1_1[1] = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000701feca1fe7f65eef46b792719b00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806fc3a9206f6ff09f9a804d206fc3a9f09f9a80f09f9a806f6ff09f9a806f6f6fc3a9206ff09f9a80f09f9a80c3a920f09f9a8000000000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a806f6f6f6f4df09f9a806f6fc3a9f09f9a80f09f9a80f09f9a804d20c3a96f6f4d6f6f4d20f09f9a806f00000000000000000000000000000000000000000000000000000000000000a10dc6ad3a451e886cf013f64e1c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a806f6f4d20204d4d6f6f206f20f09f9a806f4df09f9a806f4d20f09f9a806f6f6fc3a94dc3a94d6f206f204dc3a9f09f9a806f4df09f9a804d6f6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f204dc3a920f09f9a80c3a96f204d4d6f4df09f9a806f6ff09f9a8020204d6f206ff09f9a80204d206f6f4d6f6ff09f9a806f4d4d6ff09f9a80c3a920c3a94d00000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint152,address,bytes17[3])", + "type": "(uint152,address,bytes17[3])", + "value": [ + "662786193711640578941712036003693834543457663", + "0xb9CfFD914eADFe791e8A3Ebb1F3e39d723e47aA7", + [ + "0x49abff1a77db39bd5a7b259715949dd47d", + "0x9e073d1260042693534dcf129d83c259b5", + "0x70830ee911f56fb0168356f2a8778cd38c" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "662786193711640578941712036003693834543457663" + }, + { + "type": "address", + "value": "0xb9CfFD914eADFe791e8A3Ebb1F3e39d723e47aA7" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x49abff1a77db39bd5a7b259715949dd47d" + }, + { + "type": "hexstring", + "value": "0x9e073d1260042693534dcf129d83c259b5" + }, + { + "type": "hexstring", + "value": "0x70830ee911f56fb0168356f2a8778cd38c" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101db806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012f565b60405180910390f35b6100566100ed565b61005e6100ed565b721db86990f7919ab5ea4264246ba88f33e2657f815273b9cffd914eadfe791e8a3ebb1f3e39d723e47aa76020820152610096610111565b7049abff1a77db39bd5a7b259715949dd47d60781b8152709e073d1260042693534dcf129d83c259b560781b6020820152701c20c3ba447d5bec05a0d5bcaa1de334e3607a1b604080830191909152820152919050565b604080516060810182526000808252602082015290810161010c610111565b905290565b60405180606001604052806003906020820280368337509192915050565b815172ffffffffffffffffffffffffffffffffffffff1681526020808301516001600160a01b03168183015260408084015160a084019291840160005b600381101561019b5782516effffffffffffffffffffffffffffff19168252918301919083019060010161016c565b505050509291505056fea2646970667358221220c0e2823a659aaff17aee8b26090ab9e14b77bdaff176f7fcf54da03d89e038d964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c510d85e {\n uint152 s_0;\n address s_1;\n bytes17[3] s_2;\n }\n\n function test () public pure returns (S_c510d85e memory) {\n S_c510d85e memory r;\n {\n uint152 r_0 = 662786193711640578941712036003693834543457663;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xb9CfFD914eADFe791e8A3Ebb1F3e39d723e47aA7;\n r.s_1 = r_1;\n }\n {\n bytes17[3] memory r_2;\n {\n bytes17 r_2_0 = bytes17(0x49abff1a77db39bd5a7b259715949dd47d);\n r_2[0] = r_2_0;\n }\n {\n bytes17 r_2_1 = bytes17(0x9e073d1260042693534dcf129d83c259b5);\n r_2[1] = r_2_1;\n }\n {\n bytes17 r_2_2 = bytes17(0x70830ee911f56fb0168356f2a8778cd38c);\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000001db86990f7919ab5ea4264246ba88f33e2657f000000000000000000000000b9cffd914eadfe791e8a3ebb1f3e39d723e47aa749abff1a77db39bd5a7b259715949dd47d0000000000000000000000000000009e073d1260042693534dcf129d83c259b500000000000000000000000000000070830ee911f56fb0168356f2a8778cd38c000000000000000000000000000000" + }, + { + "name": "random-(uint24[4],int,bytes19)", + "type": "(uint24[4],int,bytes19)", + "value": [ + ["13171223", "14434465", "15206170", "4652296"], + "15166889042131756821988097345128430929143788953795988450111149389163066964753", + "0x79372e1962760e38d22888c8988c43c43bf0b5" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "13171223" + }, + { + "type": "number", + "value": "14434465" + }, + { + "type": "number", + "value": "15206170" + }, + { + "type": "number", + "value": "4652296" + } + ] + }, + { + "type": "number", + "value": "15166889042131756821988097345128430929143788953795988450111149389163066964753" + }, + { + "type": "hexstring", + "value": "0x79372e1962760e38d22888c8988c43c43bf0b5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ad806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011c565b60405180910390f35b6100566100d7565b61005e6100d7565b6100666100fe565b62c8fa17815262dc40a160208083019190915262e8071a6040808401919091526246fd0860608401529183527f218827ad37fbea01d71e1a2a42ccafbe8070d5142d7b7e4299e32cdbfb823b11908301527279372e1962760e38d22888c8988c43c43bf0b560681b90820152919050565b60405180606001604052806100ea6100fe565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b815160c08201908260005b600481101561014b57825162ffffff16825260209283019290910190600101610127565b505050602083015160808301526040909201516cffffffffffffffffffffffffff191660a0909101529056fea2646970667358221220f8c75ad514b2f62850086863538177073e31904c845cc63992661a232a36db4a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e2a1d61a {\n uint24[4] s_0;\n int256 s_1;\n bytes19 s_2;\n }\n\n function test () public pure returns (S_e2a1d61a memory) {\n S_e2a1d61a memory r;\n {\n uint24[4] memory r_0;\n {\n uint24 r_0_0 = 13171223;\n r_0[0] = r_0_0;\n }\n {\n uint24 r_0_1 = 14434465;\n r_0[1] = r_0_1;\n }\n {\n uint24 r_0_2 = 15206170;\n r_0[2] = r_0_2;\n }\n {\n uint24 r_0_3 = 4652296;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n int r_1 = 15166889042131756821988097345128430929143788953795988450111149389163066964753;\n r.s_1 = r_1;\n }\n {\n bytes19 r_2 = bytes19(0x79372e1962760e38d22888c8988c43c43bf0b5);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000c8fa170000000000000000000000000000000000000000000000000000000000dc40a10000000000000000000000000000000000000000000000000000000000e8071a000000000000000000000000000000000000000000000000000000000046fd08218827ad37fbea01d71e1a2a42ccafbe8070d5142d7b7e4299e32cdbfb823b1179372e1962760e38d22888c8988c43c43bf0b500000000000000000000000000" + }, + { + "name": "random-(uint40,bytes21,address)[2]", + "type": "(uint40,bytes21,address)[2]", + "value": [ + [ + "641351479612", + "0x16ed29a2d8dacf3b4a1fe9eac32558b57b388b8502", + "0x4C11Fef206e37b945c09903D48e12b15F4686A6E" + ], + [ + "834482119382", + "0xd9a657f4bbcfbba9b2ebcc6c1b6d15c1c000f24bf1", + "0x51C92fCEC680b466e8F725517067ECbA2BfeBd21" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "641351479612" + }, + { + "type": "hexstring", + "value": "0x16ed29a2d8dacf3b4a1fe9eac32558b57b388b8502" + }, + { + "type": "address", + "value": "0x4C11Fef206e37b945c09903D48e12b15F4686A6E" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "834482119382" + }, + { + "type": "hexstring", + "value": "0xd9a657f4bbcfbba9b2ebcc6c1b6d15c1c000f24bf1" + }, + { + "type": "address", + "value": "0x51C92fCEC680b466e8F725517067ECbA2BfeBd21" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101dc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061013e565b60405180910390f35b6100566100ff565b61005e6100ff565b604080516060808201835264955386f13c8252740b7694d16c6d679da50ff4f56192ac5abd9c45c28160591b602080840191909152734c11fef206e37b945c09903d48e12b15f4686a6e838501529184528251908101835264c24b02a2d6815274d9a657f4bbcfbba9b2ebcc6c1b6d15c1c000f24bf160581b818301527351c92fcec680b466e8f725517067ecba2bfebd2192810192909252820152919050565b60405180604001604052806002905b604080516060810182526000808252602080830182905292820152825260001990920191018161010e5790505090565b60c08101818360005b600281101561019d578151805164ffffffffff1684526020808201516affffffffffffffffffffff1916818601526040918201516001600160a01b03169185019190915260609093019290910190600101610147565b5050509291505056fea2646970667358221220e537acd35fc609c33715a4d00cedc3e636c05ce09de521ab8463ed5cfc71288264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_59d52c88 {\n uint40 s_0;\n bytes21 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_59d52c88[2] memory) {\n S_59d52c88[2] memory r;\n {\n S_59d52c88 memory r_0;\n {\n uint40 r_0_0 = 641351479612;\n r_0.s_0 = r_0_0;\n }\n {\n bytes21 r_0_1 = bytes21(0x16ed29a2d8dacf3b4a1fe9eac32558b57b388b8502);\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x4C11Fef206e37b945c09903D48e12b15F4686A6E;\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_59d52c88 memory r_1;\n {\n uint40 r_1_0 = 834482119382;\n r_1.s_0 = r_1_0;\n }\n {\n bytes21 r_1_1 = bytes21(0xd9a657f4bbcfbba9b2ebcc6c1b6d15c1c000f24bf1);\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0x51C92fCEC680b466e8F725517067ECbA2BfeBd21;\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000955386f13c16ed29a2d8dacf3b4a1fe9eac32558b57b388b850200000000000000000000000000000000000000000000004c11fef206e37b945c09903d48e12b15f4686a6e000000000000000000000000000000000000000000000000000000c24b02a2d6d9a657f4bbcfbba9b2ebcc6c1b6d15c1c000f24bf1000000000000000000000000000000000000000000000051c92fcec680b466e8f725517067ecba2bfebd21" + }, + { + "name": "random-(uint48[][4],address)", + "type": "(uint48[][4],address)", + "value": [ + [ + ["77144456209300", "172262673469812", "193780840630978", "211208342991811"], + ["70430406203333", "204691879085032", "119089813958200", "160957922738151"], + ["272193273813983", "223924750254416", "142308756067516"], + ["127578642663335"] + ], + "0x0A7d46a5339e41f83B6CA5A38A3921Ba0422d53e" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "77144456209300" + }, + { + "type": "number", + "value": "172262673469812" + }, + { + "type": "number", + "value": "193780840630978" + }, + { + "type": "number", + "value": "211208342991811" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "70430406203333" + }, + { + "type": "number", + "value": "204691879085032" + }, + { + "type": "number", + "value": "119089813958200" + }, + { + "type": "number", + "value": "160957922738151" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "272193273813983" + }, + { + "type": "number", + "value": "223924750254416" + }, + { + "type": "number", + "value": "142308756067516" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "127578642663335" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x0A7d46a5339e41f83B6CA5A38A3921Ba0422d53e" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610528806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610444565b60405180910390f35b6100566103fd565b61005e6103fd565b61006661041d565b60408051600480825260a0820190925260009160208201608080368337019050509050600065462997e8a394905080826000815181106100a8576100a86104dc565b602002602001019065ffffffffffff16908165ffffffffffff1681525050506000659cac0775d174905080826001815181106100e6576100e66104dc565b602002602001019065ffffffffffff16908165ffffffffffff168152505050600065b03e1e2b8ac290508082600281518110610124576101246104dc565b602002602001019065ffffffffffff16908165ffffffffffff168152505050600065c017c641f3c390508082600381518110610162576101626104dc565b65ffffffffffff929092166020928302919091019091015250815260408051600480825260a08201909252600091816020016020820280368337019050509050600065400e5b57d7c5905080826000815181106101c1576101c16104dc565b602002602001019065ffffffffffff16908165ffffffffffff168152505050600065ba2a8abdc3e8905080826001815181106101ff576101ff6104dc565b602002602001019065ffffffffffff16908165ffffffffffff1681525050506000656c4fc20eae389050808260028151811061023d5761023d6104dc565b602002602001019065ffffffffffff16908165ffffffffffff1681525050506000659263efceffe79050808260038151811061027b5761027b6104dc565b65ffffffffffff929092166020928302919091018201528301919091525060408051600380825260808201909252600091816020016020820280368337019050509050600065f78eef655bdf905080826000815181106102dd576102dd6104dc565b602002602001019065ffffffffffff16908165ffffffffffff168152505050600065cba88b3201509050808260018151811061031b5761031b6104dc565b602002602001019065ffffffffffff16908165ffffffffffff168152505050600065816dd6da94bc90508082600281518110610359576103596104dc565b65ffffffffffff92909216602092830291909101909101525060408083019190915280516001808252818301909252600091816020016020820280368337019050509050600065740837ad47a7905080826000815181106103bc576103bc6104dc565b65ffffffffffff92909216602092830291909101820152606084019290925250908252730a7d46a5339e41f83b6ca5a38a3921ba0422d53e90820152919050565b604051806040016040528061041061041d565b8152600060209091015290565b60405180608001604052806004905b606081526020019060019003908161042c5790505090565b602080825282516040838301526000919060e08401906060850184805b60048110156104be57878503605f19018352835180518087529087019087870190845b818110156104a857835165ffffffffffff1683529289019291890191600101610484565b5090965050509285019291850191600101610461565b505050509301516001600160a01b0316604092909201919091525090565b634e487b7160e01b600052603260045260246000fdfea264697066735822122092bb33246eb44bce6864df7eaba031cb98442d29e3d7701f67849cee33b02ec364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e0d0551b {\n uint48[][4] s_0;\n address s_1;\n }\n\n function test () public pure returns (S_e0d0551b memory) {\n S_e0d0551b memory r;\n {\n uint48[][4] memory r_0;\n {\n uint48[] memory r_0_0 = new uint48[](4);\n {\n uint48 r_0_0_0 = 77144456209300;\n r_0_0[0] = r_0_0_0;\n }\n {\n uint48 r_0_0_1 = 172262673469812;\n r_0_0[1] = r_0_0_1;\n }\n {\n uint48 r_0_0_2 = 193780840630978;\n r_0_0[2] = r_0_0_2;\n }\n {\n uint48 r_0_0_3 = 211208342991811;\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n uint48[] memory r_0_1 = new uint48[](4);\n {\n uint48 r_0_1_0 = 70430406203333;\n r_0_1[0] = r_0_1_0;\n }\n {\n uint48 r_0_1_1 = 204691879085032;\n r_0_1[1] = r_0_1_1;\n }\n {\n uint48 r_0_1_2 = 119089813958200;\n r_0_1[2] = r_0_1_2;\n }\n {\n uint48 r_0_1_3 = 160957922738151;\n r_0_1[3] = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n {\n uint48[] memory r_0_2 = new uint48[](3);\n {\n uint48 r_0_2_0 = 272193273813983;\n r_0_2[0] = r_0_2_0;\n }\n {\n uint48 r_0_2_1 = 223924750254416;\n r_0_2[1] = r_0_2_1;\n }\n {\n uint48 r_0_2_2 = 142308756067516;\n r_0_2[2] = r_0_2_2;\n }\n r_0[2] = r_0_2;\n }\n {\n uint48[] memory r_0_3 = new uint48[](1);\n {\n uint48 r_0_3_0 = 127578642663335;\n r_0_3[0] = r_0_3_0;\n }\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x0A7d46a5339e41f83B6CA5A38A3921Ba0422d53e;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000a7d46a5339e41f83b6ca5a38a3921ba0422d53e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000462997e8a39400000000000000000000000000000000000000000000000000009cac0775d1740000000000000000000000000000000000000000000000000000b03e1e2b8ac20000000000000000000000000000000000000000000000000000c017c641f3c300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000400e5b57d7c50000000000000000000000000000000000000000000000000000ba2a8abdc3e800000000000000000000000000000000000000000000000000006c4fc20eae3800000000000000000000000000000000000000000000000000009263efceffe700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000f78eef655bdf0000000000000000000000000000000000000000000000000000cba88b3201500000000000000000000000000000000000000000000000000000816dd6da94bc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000740837ad47a7" + }, + { + "name": "random-(uint8,string,bytes5,string)", + "type": "(uint8,string,bytes5,string)", + "value": [ + "38", + "Moo é🚀 oMé🚀🚀o", + "0xd399f28745", + "Moo é🚀M ééooMo ooéMééMé🚀🚀 Moooo o🚀éo🚀o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "38" + }, + { + "type": "string", + "value": "Moo é🚀 oMé🚀🚀o" + }, + { + "type": "hexstring", + "value": "0xd399f28745" + }, + { + "type": "string", + "value": "Moo é🚀M ééooMo ooéMééMé🚀🚀 Moooo o🚀éo🚀o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061021b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610144565b60405180910390f35b6040805160808082018352600080835260606020808501829052848601839052818501829052855193840186528381018281528487018481528584018490526026865287518089018952601881527f4d6f6f20c3a9f09f9a80206f4dc3a9f09f9a80f09f9a806f00000000000000008185015290915264d399f2874560d81b90528551918201909552603e8082529394929391929091906101a890830139606083015250919050565b6000815180845260005b8181101561011d57602081850181015186830182015201610101565b8181111561012f576000602083870101525b50601f01601f19169290920160200192915050565b6020815260ff8251166020820152600060208301516080604084015261016d60a08401826100f7565b905064ffffffffff60d81b60408501511660608401526060840151601f1984830301608085015261019e82826100f7565b9594505050505056fe4d6f6f20c3a9f09f9a804d2020c3a9c3a96f6f4d6f206f6fc3a94dc3a9c3a94dc3a9f09f9a80f09f9a80204d6f6f6f6f206ff09f9a80c3a96ff09f9a806fa2646970667358221220687df2caf6596b4c7c7d2b37ef2d39b3c55fe6b62f6b1dea8f0493db3631ff4764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1295d13a {\n uint8 s_0;\n string s_1;\n bytes5 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_1295d13a memory) {\n S_1295d13a memory r;\n {\n uint8 r_0 = 38;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 oMé🚀🚀o\";\n r.s_1 = r_1;\n }\n {\n bytes5 r_2 = bytes5(0xd399f28745);\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀M ééooMo ooéMééMé🚀🚀 Moooo o🚀éo🚀o\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000080d399f2874500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80206f4dc3a9f09f9a80f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a804d2020c3a9c3a96f6f4d6f206f6fc3a94dc3a9c3a94dc3a9f09f9a80f09f9a80204d6f6f6f6f206ff09f9a80c3a96ff09f9a806f0000" + }, + { + "name": "random-address[2][3][3]", + "type": "address[2][3][3]", + "value": [ + [ + [ + "0x60925B68aB1EAd15bA8C6c4dcf4439F71CAC7733", + "0x72846D2d842B26A40BC58E4387ad6CaC3C0c37f7" + ], + [ + "0x912587a1488DAa86e7e93292956685FDBf9185b0", + "0x41dB8896198b352ecd4EC580A925A744068b1D6a" + ], + [ + "0xE9c8940C5B77123673084100950b9FeA05FBcF78", + "0xFE2B12cD95653bC48b7652272C954F82Cb5825E4" + ] + ], + [ + [ + "0x1ce1f2bCCbC3C5d1Ea68280944bE4a4a2E366d55", + "0x8A53624f62bC639ab18FdbE66F7b0d7C846B1baf" + ], + [ + "0xA5E9E5f220C1E158782E4423e27632ac367f3696", + "0xb195155718CbFcf95C68A4E907C7Aa579e2cC46d" + ], + [ + "0x63B4B005346c678e3354E4baAeCba3EEd451c521", + "0xDB25d2c599c7E83d466f3520Ef4b519fb9963726" + ] + ], + [ + [ + "0xe8e711b71a0547C294d40D5e99626Ad30E636AD4", + "0x71e0e3e3703D69c73BCFFf29f57620B5CA76A747" + ], + [ + "0x2eec47C0274AC09dB5B83bf1ee972eC9d305E21b", + "0x580C42df7f0eeb56455e4EC12550f3A43945C24B" + ], + [ + "0x3207A168cB3631D179E7d3Ae928F1eC3AfE7Fa11", + "0x5fdEc3Eb829407AaFc0E81436a851b69360fD4ac" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x60925B68aB1EAd15bA8C6c4dcf4439F71CAC7733" + }, + { + "type": "address", + "value": "0x72846D2d842B26A40BC58E4387ad6CaC3C0c37f7" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x912587a1488DAa86e7e93292956685FDBf9185b0" + }, + { + "type": "address", + "value": "0x41dB8896198b352ecd4EC580A925A744068b1D6a" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xE9c8940C5B77123673084100950b9FeA05FBcF78" + }, + { + "type": "address", + "value": "0xFE2B12cD95653bC48b7652272C954F82Cb5825E4" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1ce1f2bCCbC3C5d1Ea68280944bE4a4a2E366d55" + }, + { + "type": "address", + "value": "0x8A53624f62bC639ab18FdbE66F7b0d7C846B1baf" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xA5E9E5f220C1E158782E4423e27632ac367f3696" + }, + { + "type": "address", + "value": "0xb195155718CbFcf95C68A4E907C7Aa579e2cC46d" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x63B4B005346c678e3354E4baAeCba3EEd451c521" + }, + { + "type": "address", + "value": "0xDB25d2c599c7E83d466f3520Ef4b519fb9963726" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe8e711b71a0547C294d40D5e99626Ad30E636AD4" + }, + { + "type": "address", + "value": "0x71e0e3e3703D69c73BCFFf29f57620B5CA76A747" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2eec47C0274AC09dB5B83bf1ee972eC9d305E21b" + }, + { + "type": "address", + "value": "0x580C42df7f0eeb56455e4EC12550f3A43945C24B" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3207A168cB3631D179E7d3Ae928F1eC3AfE7Fa11" + }, + { + "type": "address", + "value": "0x5fdEc3Eb829407AaFc0E81436a851b69360fD4ac" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103f8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610331565b60405180910390f35b6100566102b9565b61005e6102b9565b6100666102e6565b61006e610313565b7360925b68ab1ead15ba8c6c4dcf4439f71cac773381527372846d2d842b26a40bc58e4387ad6cac3c0c37f7602082015281526100a9610313565b73912587a1488daa86e7e93292956685fdbf9185b081527341db8896198b352ecd4ec580a925a744068b1d6a6020808301919091528201526100e9610313565b73e9c8940c5b77123673084100950b9fea05fbcf78815273fe2b12cd95653bc48b7652272c954f82cb5825e46020820152604082015281526101296102e6565b610131610313565b731ce1f2bccbc3c5d1ea68280944be4a4a2e366d558152738a53624f62bc639ab18fdbe66f7b0d7c846b1baf6020820152815261016c610313565b73a5e9e5f220c1e158782e4423e27632ac367f3696815273b195155718cbfcf95c68a4e907c7aa579e2cc46d6020808301919091528201526101ac610313565b7363b4b005346c678e3354e4baaecba3eed451c521815273db25d2c599c7e83d466f3520ef4b519fb996372660208083019190915260408301919091528201526101f46102e6565b6101fc610313565b73e8e711b71a0547c294d40d5e99626ad30e636ad481527371e0e3e3703d69c73bcfff29f57620b5ca76a74760208201528152610237610313565b732eec47c0274ac09db5b83bf1ee972ec9d305e21b815273580c42df7f0eeb56455e4ec12550f3a43945c24b602080830191909152820152610277610313565b733207a168cb3631d179e7d3ae928f1ec3afe7fa118152735fdec3eb829407aafc0e81436a851b69360fd4ac6020820152604080830191909152820152919050565b60405180606001604052806003905b6102d06102e6565b8152602001906001900390816102c85790505090565b60405180606001604052806003905b6102fd610313565b8152602001906001900390816102f55790505090565b60405180604001604052806002906020820280368337509192915050565b6102408101818360005b600380821061034a57506103b9565b82518460005b8381101561039f5782518260005b60028110156103865782516001600160a01b031682526020928301929091019060010161035e565b5050506020929092019160409190910190600101610350565b50505060c09390930192506020919091019060010161033b565b5050509291505056fea2646970667358221220d42d834ec64b6f7879b2f73db0c85e2dd2d8e34c9a6bc4d82ca2d7d2e2fede8e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (address[2][3][3] memory) {\n address[2][3][3] memory r;\n {\n address[2][3] memory r_0;\n {\n address[2] memory r_0_0;\n {\n address r_0_0_0 = 0x60925B68aB1EAd15bA8C6c4dcf4439F71CAC7733;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x72846D2d842B26A40BC58E4387ad6CaC3C0c37f7;\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n address[2] memory r_0_1;\n {\n address r_0_1_0 = 0x912587a1488DAa86e7e93292956685FDBf9185b0;\n r_0_1[0] = r_0_1_0;\n }\n {\n address r_0_1_1 = 0x41dB8896198b352ecd4EC580A925A744068b1D6a;\n r_0_1[1] = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n {\n address[2] memory r_0_2;\n {\n address r_0_2_0 = 0xE9c8940C5B77123673084100950b9FeA05FBcF78;\n r_0_2[0] = r_0_2_0;\n }\n {\n address r_0_2_1 = 0xFE2B12cD95653bC48b7652272C954F82Cb5825E4;\n r_0_2[1] = r_0_2_1;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n address[2][3] memory r_1;\n {\n address[2] memory r_1_0;\n {\n address r_1_0_0 = 0x1ce1f2bCCbC3C5d1Ea68280944bE4a4a2E366d55;\n r_1_0[0] = r_1_0_0;\n }\n {\n address r_1_0_1 = 0x8A53624f62bC639ab18FdbE66F7b0d7C846B1baf;\n r_1_0[1] = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n {\n address[2] memory r_1_1;\n {\n address r_1_1_0 = 0xA5E9E5f220C1E158782E4423e27632ac367f3696;\n r_1_1[0] = r_1_1_0;\n }\n {\n address r_1_1_1 = 0xb195155718CbFcf95C68A4E907C7Aa579e2cC46d;\n r_1_1[1] = r_1_1_1;\n }\n r_1[1] = r_1_1;\n }\n {\n address[2] memory r_1_2;\n {\n address r_1_2_0 = 0x63B4B005346c678e3354E4baAeCba3EEd451c521;\n r_1_2[0] = r_1_2_0;\n }\n {\n address r_1_2_1 = 0xDB25d2c599c7E83d466f3520Ef4b519fb9963726;\n r_1_2[1] = r_1_2_1;\n }\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n address[2][3] memory r_2;\n {\n address[2] memory r_2_0;\n {\n address r_2_0_0 = 0xe8e711b71a0547C294d40D5e99626Ad30E636AD4;\n r_2_0[0] = r_2_0_0;\n }\n {\n address r_2_0_1 = 0x71e0e3e3703D69c73BCFFf29f57620B5CA76A747;\n r_2_0[1] = r_2_0_1;\n }\n r_2[0] = r_2_0;\n }\n {\n address[2] memory r_2_1;\n {\n address r_2_1_0 = 0x2eec47C0274AC09dB5B83bf1ee972eC9d305E21b;\n r_2_1[0] = r_2_1_0;\n }\n {\n address r_2_1_1 = 0x580C42df7f0eeb56455e4EC12550f3A43945C24B;\n r_2_1[1] = r_2_1_1;\n }\n r_2[1] = r_2_1;\n }\n {\n address[2] memory r_2_2;\n {\n address r_2_2_0 = 0x3207A168cB3631D179E7d3Ae928F1eC3AfE7Fa11;\n r_2_2[0] = r_2_2_0;\n }\n {\n address r_2_2_1 = 0x5fdEc3Eb829407AaFc0E81436a851b69360fD4ac;\n r_2_2[1] = r_2_2_1;\n }\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000060925b68ab1ead15ba8c6c4dcf4439f71cac773300000000000000000000000072846d2d842b26a40bc58e4387ad6cac3c0c37f7000000000000000000000000912587a1488daa86e7e93292956685fdbf9185b000000000000000000000000041db8896198b352ecd4ec580a925a744068b1d6a000000000000000000000000e9c8940c5b77123673084100950b9fea05fbcf78000000000000000000000000fe2b12cd95653bc48b7652272c954f82cb5825e40000000000000000000000001ce1f2bccbc3c5d1ea68280944be4a4a2e366d550000000000000000000000008a53624f62bc639ab18fdbe66f7b0d7c846b1baf000000000000000000000000a5e9e5f220c1e158782e4423e27632ac367f3696000000000000000000000000b195155718cbfcf95c68a4e907c7aa579e2cc46d00000000000000000000000063b4b005346c678e3354e4baaecba3eed451c521000000000000000000000000db25d2c599c7e83d466f3520ef4b519fb9963726000000000000000000000000e8e711b71a0547c294d40d5e99626ad30e636ad400000000000000000000000071e0e3e3703d69c73bcfff29f57620b5ca76a7470000000000000000000000002eec47c0274ac09db5b83bf1ee972ec9d305e21b000000000000000000000000580c42df7f0eeb56455e4ec12550f3a43945c24b0000000000000000000000003207a168cb3631d179e7d3ae928f1ec3afe7fa110000000000000000000000005fdec3eb829407aafc0e81436a851b69360fd4ac" + }, + { + "name": "random-bool[][1][3]", + "type": "bool[][1][3]", + "value": [[[false, false, false]], [[]], [[true, true, true, true]]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610353806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610260565b60405180910390f35b61005661020c565b61005e61020c565b610066610239565b60408051600380825260808201909252600091602082016060803683370190505090506000808260008151811061009f5761009f610307565b60200260200101901515908115158152505050600080826001815181106100c8576100c8610307565b60200260200101901515908115158152505050600080826002815181106100f1576100f1610307565b91151560209283029190910190910152508152815261010e610239565b60408051600081526020808201909252825282015261012b610239565b60408051600480825260a0820190925260009160208201608080368337019050509050600060019050808260008151811061016857610168610307565b60200260200101901515908115158152505050600060019050808260018151811061019557610195610307565b6020026020010190151590811515815250505060006001905080826002815181106101c2576101c2610307565b6020026020010190151590811515815250505060006001905080826003815181106101ef576101ef610307565b911515602092830291909101909101525081526040820152919050565b60405180606001604052806003905b610223610239565b81526020019060019003908161021b5790505090565b60405180602001604052806001905b60608152602001906001900390816102485790505090565b60208082526000906080830183820185845b60038110156102fb57868403601f1901835281518486810160005b600180821061029c57506102e6565b888303845284518051808552908b01908b85019060005b818110156102d057835115158352928d0192918d019184016102b3565b5050958b0195948b01949350505060010161028d565b50955050509184019190840190600101610272565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220e98af15ce47247f69cafa228a319ea43f6eb2ad20ed4f4599cde42072ff0795c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[][1][3] memory) {\n bool[][1][3] memory r;\n {\n bool[][1] memory r_0;\n {\n bool[] memory r_0_0 = new bool[](3);\n {\n bool r_0_0_0 = false;\n r_0_0[0] = r_0_0_0;\n }\n {\n bool r_0_0_1 = false;\n r_0_0[1] = r_0_0_1;\n }\n {\n bool r_0_0_2 = false;\n r_0_0[2] = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n bool[][1] memory r_1;\n {\n bool[] memory r_1_0 = new bool[](0);\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n bool[][1] memory r_2;\n {\n bool[] memory r_2_0 = new bool[](4);\n {\n bool r_2_0_0 = true;\n r_2_0[0] = r_2_0_0;\n }\n {\n bool r_2_0_1 = true;\n r_2_0[1] = r_2_0_1;\n }\n {\n bool r_2_0_2 = true;\n r_2_0[2] = r_2_0_2;\n }\n {\n bool r_2_0_3 = true;\n r_2_0[3] = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bool[3][3][3]", + "type": "bool[3][3][3]", + "value": [ + [ + [true, true, true], + [true, true, false], + [false, true, true] + ], + [ + [false, true, false], + [true, true, false], + [true, false, false] + ], + [ + [false, false, true], + [false, false, false], + [false, true, true] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102d8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610218565b60405180910390f35b6100566101a0565b61005e6101a0565b6100666101cd565b61006e6101fa565b600180825260208201819052604082015281526100896101fa565b6001808252602080830191909152600060408301528201526100a96101fa565b6000815260016020820181905260408083019190915282015281526100cc6101cd565b6100d46101fa565b600080825260016020830152604082015281526100ef6101fa565b60018082526020808301919091526000604083015282015261010f6101fa565b6001815260006020808301829052604080840192909252908301919091528201526101386101cd565b6101406101fa565b6000808252602082015260016040820152815261015b6101fa565b60008082526020808301829052604083019190915282015261017b6101fa565b6000815260016020820181905260408083019190915282810191909152820152919050565b60405180606001604052806003905b6101b76101cd565b8152602001906001900390816101af5790505090565b60405180606001604052806003905b6101e46101fa565b8152602001906001900390816101dc5790505090565b60405180606001604052806003906020820280368337509192915050565b6103608101818360005b60038082106102315750610299565b82518460005b8381101561027e5782518260005b868110156102655782511515825260209283019290910190600101610245565b5050506020929092019160609190910190600101610237565b50505061012093909301925060209190910190600101610222565b5050509291505056fea2646970667358221220b89d7d9c8f8cb3071ebc8ebd0a3d224ebff492da8ac164cef6b6ebc20d495e9d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[3][3][3] memory) {\n bool[3][3][3] memory r;\n {\n bool[3][3] memory r_0;\n {\n bool[3] memory r_0_0;\n {\n bool r_0_0_0 = true;\n r_0_0[0] = r_0_0_0;\n }\n {\n bool r_0_0_1 = true;\n r_0_0[1] = r_0_0_1;\n }\n {\n bool r_0_0_2 = true;\n r_0_0[2] = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n {\n bool[3] memory r_0_1;\n {\n bool r_0_1_0 = true;\n r_0_1[0] = r_0_1_0;\n }\n {\n bool r_0_1_1 = true;\n r_0_1[1] = r_0_1_1;\n }\n {\n bool r_0_1_2 = false;\n r_0_1[2] = r_0_1_2;\n }\n r_0[1] = r_0_1;\n }\n {\n bool[3] memory r_0_2;\n {\n bool r_0_2_0 = false;\n r_0_2[0] = r_0_2_0;\n }\n {\n bool r_0_2_1 = true;\n r_0_2[1] = r_0_2_1;\n }\n {\n bool r_0_2_2 = true;\n r_0_2[2] = r_0_2_2;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n bool[3][3] memory r_1;\n {\n bool[3] memory r_1_0;\n {\n bool r_1_0_0 = false;\n r_1_0[0] = r_1_0_0;\n }\n {\n bool r_1_0_1 = true;\n r_1_0[1] = r_1_0_1;\n }\n {\n bool r_1_0_2 = false;\n r_1_0[2] = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n {\n bool[3] memory r_1_1;\n {\n bool r_1_1_0 = true;\n r_1_1[0] = r_1_1_0;\n }\n {\n bool r_1_1_1 = true;\n r_1_1[1] = r_1_1_1;\n }\n {\n bool r_1_1_2 = false;\n r_1_1[2] = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n {\n bool[3] memory r_1_2;\n {\n bool r_1_2_0 = true;\n r_1_2[0] = r_1_2_0;\n }\n {\n bool r_1_2_1 = false;\n r_1_2[1] = r_1_2_1;\n }\n {\n bool r_1_2_2 = false;\n r_1_2[2] = r_1_2_2;\n }\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n bool[3][3] memory r_2;\n {\n bool[3] memory r_2_0;\n {\n bool r_2_0_0 = false;\n r_2_0[0] = r_2_0_0;\n }\n {\n bool r_2_0_1 = false;\n r_2_0[1] = r_2_0_1;\n }\n {\n bool r_2_0_2 = true;\n r_2_0[2] = r_2_0_2;\n }\n r_2[0] = r_2_0;\n }\n {\n bool[3] memory r_2_1;\n {\n bool r_2_1_0 = false;\n r_2_1[0] = r_2_1_0;\n }\n {\n bool r_2_1_1 = false;\n r_2_1[1] = r_2_1_1;\n }\n {\n bool r_2_1_2 = false;\n r_2_1[2] = r_2_1_2;\n }\n r_2[1] = r_2_1;\n }\n {\n bool[3] memory r_2_2;\n {\n bool r_2_2_0 = false;\n r_2_2[0] = r_2_2_0;\n }\n {\n bool r_2_2_1 = true;\n r_2_2[1] = r_2_2_1;\n }\n {\n bool r_2_2_2 = true;\n r_2_2[2] = r_2_2_2;\n }\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bool[4][2][4]", + "type": "bool[4][2][4]", + "value": [ + [ + [true, true, false, true], + [false, true, true, false] + ], + [ + [true, true, false, true], + [false, false, false, true] + ], + [ + [false, false, true, true], + [true, false, true, false] + ], + [ + [true, true, true, true], + [false, true, false, true] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610301806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610240565b60405180910390f35b6100566101c8565b61005e6101c8565b6100666101f5565b61006e610222565b6001808252602082018190526000604083015260608201528152610090610222565b6000808252600160208084018290526040840191909152606083019190915282015281526100bc6101f5565b6100c4610222565b60018082526020820181905260006040830152606082015281526100e6610222565b60008082526020808301829052604083019190915260016060830152828101919091528201526101146101f5565b61011c610222565b600080825260208201526001604082018190526060820152815261013e610222565b600180825260006020808401829052604080850193909352606084019190915283019190915282015261016f6101f5565b610177610222565b6001808252602082018190526040820181905260608201528152610199610222565b600080825260016020808401829052604084019290925260608084019190915290830191909152820152919050565b60405180608001604052806004905b6101df6101f5565b8152602001906001900390816101d75790505090565b60405180604001604052806002905b61020c610222565b8152602001906001900390816102045790505090565b60405180608001604052806004906020820280368337509192915050565b6104008101818360005b600480821061025957506102c2565b82518460005b60028110156102a75782518260005b8681101561028e578251151582526020928301929091019060010161026e565b505050602092909201916080919091019060010161025f565b5050506101009390930192506020919091019060010161024a565b5050509291505056fea2646970667358221220edf6e7528674ff2d12a4f88ceaf0380824a4accf46429e66b6f9e39030c1ed7064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bool[4][2][4] memory) {\n bool[4][2][4] memory r;\n {\n bool[4][2] memory r_0;\n {\n bool[4] memory r_0_0;\n {\n bool r_0_0_0 = true;\n r_0_0[0] = r_0_0_0;\n }\n {\n bool r_0_0_1 = true;\n r_0_0[1] = r_0_0_1;\n }\n {\n bool r_0_0_2 = false;\n r_0_0[2] = r_0_0_2;\n }\n {\n bool r_0_0_3 = true;\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n bool[4] memory r_0_1;\n {\n bool r_0_1_0 = false;\n r_0_1[0] = r_0_1_0;\n }\n {\n bool r_0_1_1 = true;\n r_0_1[1] = r_0_1_1;\n }\n {\n bool r_0_1_2 = true;\n r_0_1[2] = r_0_1_2;\n }\n {\n bool r_0_1_3 = false;\n r_0_1[3] = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n bool[4][2] memory r_1;\n {\n bool[4] memory r_1_0;\n {\n bool r_1_0_0 = true;\n r_1_0[0] = r_1_0_0;\n }\n {\n bool r_1_0_1 = true;\n r_1_0[1] = r_1_0_1;\n }\n {\n bool r_1_0_2 = false;\n r_1_0[2] = r_1_0_2;\n }\n {\n bool r_1_0_3 = true;\n r_1_0[3] = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n {\n bool[4] memory r_1_1;\n {\n bool r_1_1_0 = false;\n r_1_1[0] = r_1_1_0;\n }\n {\n bool r_1_1_1 = false;\n r_1_1[1] = r_1_1_1;\n }\n {\n bool r_1_1_2 = false;\n r_1_1[2] = r_1_1_2;\n }\n {\n bool r_1_1_3 = true;\n r_1_1[3] = r_1_1_3;\n }\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n bool[4][2] memory r_2;\n {\n bool[4] memory r_2_0;\n {\n bool r_2_0_0 = false;\n r_2_0[0] = r_2_0_0;\n }\n {\n bool r_2_0_1 = false;\n r_2_0[1] = r_2_0_1;\n }\n {\n bool r_2_0_2 = true;\n r_2_0[2] = r_2_0_2;\n }\n {\n bool r_2_0_3 = true;\n r_2_0[3] = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n {\n bool[4] memory r_2_1;\n {\n bool r_2_1_0 = true;\n r_2_1[0] = r_2_1_0;\n }\n {\n bool r_2_1_1 = false;\n r_2_1[1] = r_2_1_1;\n }\n {\n bool r_2_1_2 = true;\n r_2_1[2] = r_2_1_2;\n }\n {\n bool r_2_1_3 = false;\n r_2_1[3] = r_2_1_3;\n }\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n {\n bool[4][2] memory r_3;\n {\n bool[4] memory r_3_0;\n {\n bool r_3_0_0 = true;\n r_3_0[0] = r_3_0_0;\n }\n {\n bool r_3_0_1 = true;\n r_3_0[1] = r_3_0_1;\n }\n {\n bool r_3_0_2 = true;\n r_3_0[2] = r_3_0_2;\n }\n {\n bool r_3_0_3 = true;\n r_3_0[3] = r_3_0_3;\n }\n r_3[0] = r_3_0;\n }\n {\n bool[4] memory r_3_1;\n {\n bool r_3_1_0 = false;\n r_3_1[0] = r_3_1_0;\n }\n {\n bool r_3_1_1 = true;\n r_3_1[1] = r_3_1_1;\n }\n {\n bool r_3_1_2 = false;\n r_3_1[2] = r_3_1_2;\n }\n {\n bool r_3_1_3 = true;\n r_3_1[3] = r_3_1_3;\n }\n r_3[1] = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-bytes22[1][3][4]", + "type": "bytes22[1][3][4]", + "value": [ + [ + ["0x0194511bfcd6e802414114278764ac87a419d611e2cd"], + ["0x472e75635680ed2f6cdf9bd9b9c24aab1b678e46cd9b"], + ["0x7cdb84a243fd9eb490f95484e225c16a5c16e2a12c38"] + ], + [ + ["0x0321f059b6eb9528890a08f744deaf8229c673f25ff5"], + ["0x176d8c2606abac4d77e99a8aa8d47ec40c5eb2904f61"], + ["0xfc0c0270d2dadcc417aa607f4b56c021124bbffdac0a"] + ], + [ + ["0x8cc60121f2c99e257b8d0315f7963ec99c5d1c313c5f"], + ["0x7ad1b87750582e1e0f4305efbef2756d903fa927580b"], + ["0x779fff1447186e2414fd1c50cd37a281d69413ca3104"] + ], + [ + ["0x35333c45702f6488881d77f9a8e3f5baba37758750ec"], + ["0x5480d85fe7011c13de2dda52f84602ad13ca423d204f"], + ["0x91ed8faba7058d81a5cb909b097d256c1da2d9142811"] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x0194511bfcd6e802414114278764ac87a419d611e2cd" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x472e75635680ed2f6cdf9bd9b9c24aab1b678e46cd9b" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7cdb84a243fd9eb490f95484e225c16a5c16e2a12c38" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x0321f059b6eb9528890a08f744deaf8229c673f25ff5" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x176d8c2606abac4d77e99a8aa8d47ec40c5eb2904f61" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfc0c0270d2dadcc417aa607f4b56c021124bbffdac0a" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8cc60121f2c99e257b8d0315f7963ec99c5d1c313c5f" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7ad1b87750582e1e0f4305efbef2756d903fa927580b" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x779fff1447186e2414fd1c50cd37a281d69413ca3104" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x35333c45702f6488881d77f9a8e3f5baba37758750ec" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5480d85fe7011c13de2dda52f84602ad13ca423d204f" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x91ed8faba7058d81a5cb909b097d256c1da2d9142811" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103b0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102ee565b60405180910390f35b610056610276565b61005e610276565b6100666102a3565b61006e6102d0565b750194511bfcd6e802414114278764ac87a419d611e2cd60501b815281526100946102d0565b75472e75635680ed2f6cdf9bd9b9c24aab1b678e46cd9b60501b815260208201526100bd6102d0565b750f9b7094487fb3d6921f2a909c44b82d4b82dc54258760531b8152604082015281526100e86102a3565b6100f06102d0565b750321f059b6eb9528890a08f744deaf8229c673f25ff560501b815281526101166102d0565b75176d8c2606abac4d77e99a8aa8d47ec40c5eb2904f6160501b8152602082015261013f6102d0565b757e060138696d6e620bd5303fa5ab60108925dffed60560511b81526040820152602082015261016d6102a3565b6101756102d0565b758cc60121f2c99e257b8d0315f7963ec99c5d1c313c5f60501b8152815261019b6102d0565b757ad1b87750582e1e0f4305efbef2756d903fa927580b60501b815260208201526101c46102d0565b751de7ffc511c61b89053f4714334de8a075a504f28c4160521b81526040808301919091528201526101f46102a3565b6101fc6102d0565b750d4ccf115c0bd92222075dfe6a38fd6eae8ddd61d43b60521b815281526102226102d0565b755480d85fe7011c13de2dda52f84602ad13ca423d204f60501b8152602082015261024b6102d0565b7591ed8faba7058d81a5cb909b097d256c1da2d914281160501b815260408201526060820152919050565b60405180608001604052806004905b61028d6102a3565b8152602001906001900390816102855790505090565b60405180606001604052806003905b6102ba6102d0565b8152602001906001900390816102b25790505090565b60405180602001604052806001906020820280368337509192915050565b6101808101818360005b60048110156103715781518360005b60038110156103585782518260005b600181101561034257825169ffffffffffffffffffff1916825260209283019290910190600101610316565b5050506020928301929190910190600101610307565b50505060609290920191602091909101906001016102f8565b5050509291505056fea2646970667358221220ef83943d5d90c30f1babf097be7ee70437c3b32366607627f1e50bb3a0d8b3bb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (bytes22[1][3][4] memory) {\n bytes22[1][3][4] memory r;\n {\n bytes22[1][3] memory r_0;\n {\n bytes22[1] memory r_0_0;\n {\n bytes22 r_0_0_0 = bytes22(0x0194511bfcd6e802414114278764ac87a419d611e2cd);\n r_0_0[0] = r_0_0_0;\n }\n r_0[0] = r_0_0;\n }\n {\n bytes22[1] memory r_0_1;\n {\n bytes22 r_0_1_0 = bytes22(0x472e75635680ed2f6cdf9bd9b9c24aab1b678e46cd9b);\n r_0_1[0] = r_0_1_0;\n }\n r_0[1] = r_0_1;\n }\n {\n bytes22[1] memory r_0_2;\n {\n bytes22 r_0_2_0 = bytes22(0x7cdb84a243fd9eb490f95484e225c16a5c16e2a12c38);\n r_0_2[0] = r_0_2_0;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n bytes22[1][3] memory r_1;\n {\n bytes22[1] memory r_1_0;\n {\n bytes22 r_1_0_0 = bytes22(0x0321f059b6eb9528890a08f744deaf8229c673f25ff5);\n r_1_0[0] = r_1_0_0;\n }\n r_1[0] = r_1_0;\n }\n {\n bytes22[1] memory r_1_1;\n {\n bytes22 r_1_1_0 = bytes22(0x176d8c2606abac4d77e99a8aa8d47ec40c5eb2904f61);\n r_1_1[0] = r_1_1_0;\n }\n r_1[1] = r_1_1;\n }\n {\n bytes22[1] memory r_1_2;\n {\n bytes22 r_1_2_0 = bytes22(0xfc0c0270d2dadcc417aa607f4b56c021124bbffdac0a);\n r_1_2[0] = r_1_2_0;\n }\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n bytes22[1][3] memory r_2;\n {\n bytes22[1] memory r_2_0;\n {\n bytes22 r_2_0_0 = bytes22(0x8cc60121f2c99e257b8d0315f7963ec99c5d1c313c5f);\n r_2_0[0] = r_2_0_0;\n }\n r_2[0] = r_2_0;\n }\n {\n bytes22[1] memory r_2_1;\n {\n bytes22 r_2_1_0 = bytes22(0x7ad1b87750582e1e0f4305efbef2756d903fa927580b);\n r_2_1[0] = r_2_1_0;\n }\n r_2[1] = r_2_1;\n }\n {\n bytes22[1] memory r_2_2;\n {\n bytes22 r_2_2_0 = bytes22(0x779fff1447186e2414fd1c50cd37a281d69413ca3104);\n r_2_2[0] = r_2_2_0;\n }\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n {\n bytes22[1][3] memory r_3;\n {\n bytes22[1] memory r_3_0;\n {\n bytes22 r_3_0_0 = bytes22(0x35333c45702f6488881d77f9a8e3f5baba37758750ec);\n r_3_0[0] = r_3_0_0;\n }\n r_3[0] = r_3_0;\n }\n {\n bytes22[1] memory r_3_1;\n {\n bytes22 r_3_1_0 = bytes22(0x5480d85fe7011c13de2dda52f84602ad13ca423d204f);\n r_3_1[0] = r_3_1_0;\n }\n r_3[1] = r_3_1;\n }\n {\n bytes22[1] memory r_3_2;\n {\n bytes22 r_3_2_0 = bytes22(0x91ed8faba7058d81a5cb909b097d256c1da2d9142811);\n r_3_2[0] = r_3_2_0;\n }\n r_3[2] = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0194511bfcd6e802414114278764ac87a419d611e2cd00000000000000000000472e75635680ed2f6cdf9bd9b9c24aab1b678e46cd9b000000000000000000007cdb84a243fd9eb490f95484e225c16a5c16e2a12c38000000000000000000000321f059b6eb9528890a08f744deaf8229c673f25ff500000000000000000000176d8c2606abac4d77e99a8aa8d47ec40c5eb2904f6100000000000000000000fc0c0270d2dadcc417aa607f4b56c021124bbffdac0a000000000000000000008cc60121f2c99e257b8d0315f7963ec99c5d1c313c5f000000000000000000007ad1b87750582e1e0f4305efbef2756d903fa927580b00000000000000000000779fff1447186e2414fd1c50cd37a281d69413ca31040000000000000000000035333c45702f6488881d77f9a8e3f5baba37758750ec000000000000000000005480d85fe7011c13de2dda52f84602ad13ca423d204f0000000000000000000091ed8faba7058d81a5cb909b097d256c1da2d914281100000000000000000000" + }, + { + "name": "random-string[1][2][1]", + "type": "string[1][2][1]", + "value": [[["Moo é🚀🚀oo 🚀M🚀oooo o"], ["Moo é🚀🚀éMM MooooMéooo🚀ééo"]]], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oo 🚀M🚀oooo o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éMM MooooMéooo🚀ééo" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610159565b60405180910390f35b6100566100d8565b61005e6100d8565b610066610105565b61006e610132565b6040805180820190915260208082527f4d6f6f20c3a9f09f9a80f09f9a806f6f20f09f9a804df09f9a806f6f6f6f206f90820152815281526100ae610132565b60006040518060600160405280602781526020016102486027913982525060208201528152919050565b60405180602001604052806001905b6100ef610105565b8152602001906001900390816100e75790505090565b60405180604001604052806002905b61011c610132565b8152602001906001900390816101145790505090565b60405180602001604052806001905b60608152602001906001900390816101415790505090565b60208152600060208201604083018460005b600181101561023c57601f19868403810185528251846040810160005b60028110156102225787820383528351826020810160005b600181101561020a5785820383528351805180845260005b818110156101d4576020818401810151868301820152016101b8565b818111156101e6576000602083870101525b5060209586019594850194601f919091018b169390930190920191506001016101a0565b50602096870196959095019493505050600101610188565b50602097880197909650949094019350505060010161016b565b50909594505050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a94d4d204d6f6f6f6f4dc3a96f6f6ff09f9a80c3a9c3a96fa2646970667358221220b4c2a96a2d578e2570ff6680bb746e5306815a3881db6bcfa418390f6494c4fd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[1][2][1] memory) {\n string[1][2][1] memory r;\n {\n string[1][2] memory r_0;\n {\n string[1] memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀🚀oo 🚀M🚀oooo o\";\n r_0_0[0] = r_0_0_0;\n }\n r_0[0] = r_0_0;\n }\n {\n string[1] memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀🚀éMM MooooMéooo🚀ééo\";\n r_0_1[0] = r_0_1_0;\n }\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a80f09f9a806f6f20f09f9a804df09f9a806f6f6f6f206f000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a80f09f9a80c3a94d4d204d6f6f6f6f4dc3a96f6f6ff09f9a80c3a9c3a96f00000000000000000000000000000000000000000000000000" + }, + { + "name": "random-string[2][3][2]", + "type": "string[2][3][2]", + "value": [ + [ + ["Moo é🚀🚀🚀🚀oooé 🚀éo🚀🚀éoo🚀MM🚀 é 🚀 é🚀🚀oM🚀🚀o🚀🚀 ", "Moo é🚀"], + ["Moo é🚀é éM M", "Moo é🚀o o 🚀MMo oéM 🚀 🚀"], + ["Moo é🚀 oéo🚀ooM🚀🚀o🚀o🚀o oéoéoo oéééo M", "Moo é🚀oéo 🚀o🚀 🚀 Mo éo🚀éooMMo"] + ], + [ + [ + "Moo é🚀", + "Moo é🚀M MMo M🚀ooo éo🚀MéMo🚀oMM oo éééoo oMMo é🚀oo🚀🚀éo é M 🚀o" + ], + [ + "Moo é🚀 🚀M🚀éMo🚀 éooéo MM o M🚀 ooM🚀 🚀oéoo 🚀M 🚀", + "Moo é🚀 o éo 🚀🚀éo o" + ], + [ + "Moo é🚀Méoéo MM🚀é éooééMMoo🚀éMoMooo MMéo o éMo oo é🚀", + "Moo é🚀🚀éoo o🚀M🚀🚀M🚀éo 🚀oo 🚀M oéo é🚀M🚀M🚀🚀Mo" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀oooé 🚀éo🚀🚀éoo🚀MM🚀 é 🚀 é🚀🚀oM🚀🚀o🚀🚀 " + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é éM M" + }, + { + "type": "string", + "value": "Moo é🚀o o 🚀MMo oéM 🚀 🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oéo🚀ooM🚀🚀o🚀o🚀o oéoéoo oéééo M" + }, + { + "type": "string", + "value": "Moo é🚀oéo 🚀o🚀 🚀 Mo éo🚀éooMMo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀M MMo M🚀ooo éo🚀MéMo🚀oMM oo éééoo oMMo é🚀oo🚀🚀éo é M 🚀o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀M🚀éMo🚀 éooéo MM o M🚀 ooM🚀 🚀oéoo 🚀M 🚀" + }, + { + "type": "string", + "value": "Moo é🚀 o éo 🚀🚀éo o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Méoéo MM🚀é éooééMMoo🚀éMoMooo MMéo o éMo oo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀éoo o🚀M🚀🚀M🚀éo 🚀oo 🚀M oéo é🚀M🚀M🚀🚀Mo" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610663806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610302565b60405180910390f35b610056610281565b61005e610281565b6100666102ae565b61006e6102db565b60006040518060a001604052806061815260200161052d6061913982525060408051808201909152600a8152689adede418753e13f3560b71b60208083019190915282015281526100bd6102db565b60408051808201825260148152734d6f6f20c3a9f09f9a80c3a920c3a94d2020204d60601b60208083019190915290835281516060810190925260258083526000929161043c908301396020808401919091528301919091525061011f6102db565b60006040518060600160405280603d81526020016104f0603d91398252506040805160608101909152602f8082526000919061046160208301396020830152506040820152815261016e6102ae565b6101766102db565b604080518082018252600a8152689adede418753e13f3560b71b6020808301919091529083528151608081019092526060808352600092916104909083013960208301525081526101c56102db565b60006040518060800160405280604e815260200161058e604e913982525060408051808201909152601e81527f4d6f6f20c3a9f09f9a80206f20c3a96f20f09f9a80f09f9a80c3a96f206f00006020808301919091528083019190915282015261022d6102db565b60006040518060800160405280604b81526020016103f1604b913982525060408051608081019091526052808252600091906105dc6020830139602080840191909152604084019290925250820152919050565b60405180604001604052806002905b6102986102ae565b8152602001906001900390816102905790505090565b60405180606001604052806003905b6102c56102db565b8152602001906001900390816102bd5790505090565b60405180604001604052806002905b60608152602001906001900390816102ea5790505090565b60208152600060208201606083018460005b60028110156103e557601f19868403810185528251846060810160005b60038110156103cb5787820383528351826040810160005b60028110156103b35785820383528351805180845260005b8181101561037d57602081840181015186830182015201610361565b8181111561038f576000602083870101525b5060209586019594850194601f919091018b16939093019092019150600101610349565b50602096870196959095019493505050600101610331565b506020978801979096509490940193505050600101610314565b50909594505050505056fe4d6f6f20c3a9f09f9a804dc3a96fc3a96f204d4df09f9a80c3a920c3a96f6fc3a9c3a94d4d6f6ff09f9a80c3a94d6f4d6f6f6f20204d4dc3a96f206f20c3a94d6f206f6f20c3a9f09f9a804d6f6f20c3a9f09f9a806f206f20f09f9a804d4d6f206fc3a94d20f09f9a802020f09f9a804d6f6f20c3a9f09f9a806fc3a96f20f09f9a806ff09f9a8020f09f9a80204d6f20c3a96ff09f9a80c3a96f6f4d4d6f4d6f6f20c3a9f09f9a804d204d4d6f204df09f9a806f6f6f20c3a96ff09f9a804dc3a94d6ff09f9a806f4d4d206f6f20c3a9c3a9c3a96f6f20206f4d4d6f2020c3a9f09f9a806f6ff09f9a80f09f9a80c3a96f20c3a92020204d20f09f9a806f4d6f6f20c3a9f09f9a80206fc3a96ff09f9a806f6f4df09f9a80f09f9a806ff09f9a806ff09f9a806f206fc3a96fc3a96f6f206fc3a9c3a9c3a96f204d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f6f6fc3a920f09f9a80c3a96ff09f9a80f09f9a80c3a96f6ff09f9a804d4df09f9a802020c3a920f09f9a8020c3a9f09f9a80f09f9a806f4df09f9a80f09f9a806ff09f9a80f09f9a80204d6f6f20c3a9f09f9a8020f09f9a804df09f9a80c3a94d6ff09f9a8020c3a96f6fc3a96f204d4d206f2020204df09f9a80206f6f4df09f9a8020f09f9a806fc3a96f6f20f09f9a804d20f09f9a804d6f6f20c3a9f09f9a80f09f9a80c3a96f6f206ff09f9a804df09f9a80f09f9a804df09f9a80c3a96f20f09f9a806f6f20f09f9a804d206fc3a96f20c3a9f09f9a804df09f9a804df09f9a80f09f9a804d6fa26469706673582212200d9f74e06d5338d0346f7958650f6fe6f972587d1c784a34cce47c3121d9726d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[2][3][2] memory) {\n string[2][3][2] memory r;\n {\n string[2][3] memory r_0;\n {\n string[2] memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀🚀🚀🚀oooé 🚀éo🚀🚀éoo🚀MM🚀 é 🚀 é🚀🚀oM🚀🚀o🚀🚀 \";\n r_0_0[0] = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀\";\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n string[2] memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀é éM M\";\n r_0_1[0] = r_0_1_0;\n }\n {\n string memory r_0_1_1 = unicode\"Moo é🚀o o 🚀MMo oéM 🚀 🚀\";\n r_0_1[1] = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n {\n string[2] memory r_0_2;\n {\n string memory r_0_2_0 = unicode\"Moo é🚀 oéo🚀ooM🚀🚀o🚀o🚀o oéoéoo oéééo M\";\n r_0_2[0] = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀oéo 🚀o🚀 🚀 Mo éo🚀éooMMo\";\n r_0_2[1] = r_0_2_1;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n string[2][3] memory r_1;\n {\n string[2] memory r_1_0;\n {\n string memory r_1_0_0 = unicode\"Moo é🚀\";\n r_1_0[0] = r_1_0_0;\n }\n {\n string memory r_1_0_1 = unicode\"Moo é🚀M MMo M🚀ooo éo🚀MéMo🚀oMM oo éééoo oMMo é🚀oo🚀🚀éo é M 🚀o\";\n r_1_0[1] = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n {\n string[2] memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀 🚀M🚀éMo🚀 éooéo MM o M🚀 ooM🚀 🚀oéoo 🚀M 🚀\";\n r_1_1[0] = r_1_1_0;\n }\n {\n string memory r_1_1_1 = unicode\"Moo é🚀 o éo 🚀🚀éo o\";\n r_1_1[1] = r_1_1_1;\n }\n r_1[1] = r_1_1;\n }\n {\n string[2] memory r_1_2;\n {\n string memory r_1_2_0 = unicode\"Moo é🚀Méoéo MM🚀é éooééMMoo🚀éMoMooo MMéo o éMo oo é🚀\";\n r_1_2[0] = r_1_2_0;\n }\n {\n string memory r_1_2_1 = unicode\"Moo é🚀🚀éoo o🚀M🚀🚀M🚀éo 🚀oo 🚀M oéo é🚀M🚀M🚀🚀Mo\";\n r_1_2[1] = r_1_2_1;\n }\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f6f6fc3a920f09f9a80c3a96ff09f9a80f09f9a80c3a96f6ff09f9a804d4df09f9a802020c3a920f09f9a8020c3a9f09f9a80f09f9a806f4df09f9a80f09f9a806ff09f9a80f09f9a802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a80c3a920c3a94d2020204d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806f206f20f09f9a804d4d6f206fc3a94d20f09f9a802020f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a80206fc3a96ff09f9a806f6f4df09f9a80f09f9a806ff09f9a806ff09f9a806f206fc3a96fc3a96f6f206fc3a9c3a9c3a96f204d000000000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a806fc3a96f20f09f9a806ff09f9a8020f09f9a80204d6f20c3a96ff09f9a80c3a96f6f4d4d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a804d204d4d6f204df09f9a806f6f6f20c3a96ff09f9a804dc3a94d6ff09f9a806f4d4d206f6f20c3a9c3a9c3a96f6f20206f4d4d6f2020c3a9f09f9a806f6ff09f9a80f09f9a80c3a96f20c3a92020204d20f09f9a806f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a8020f09f9a804df09f9a80c3a94d6ff09f9a8020c3a96f6fc3a96f204d4d206f2020204df09f9a80206f6f4df09f9a8020f09f9a806fc3a96f6f20f09f9a804d20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80206f20c3a96f20f09f9a80f09f9a80c3a96f206f0000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a804dc3a96fc3a96f204d4df09f9a80c3a920c3a96f6fc3a9c3a94d4d6f6ff09f9a80c3a94d6f4d6f6f6f20204d4dc3a96f206f20c3a94d6f206f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80f09f9a80c3a96f6f206ff09f9a804df09f9a80f09f9a804df09f9a80c3a96f20f09f9a806f6f20f09f9a804d206fc3a96f20c3a9f09f9a804df09f9a804df09f9a80f09f9a804d6f0000000000000000000000000000" + }, + { + "name": "random-string[3][1][3]", + "type": "string[3][1][3]", + "value": [ + [ + [ + "Moo é🚀éMé", + "Moo é🚀🚀éMooéoo🚀oo oo🚀oo🚀🚀ooo ééooo oooooéo🚀 M é 🚀 🚀éM oMéo oéo", + "Moo é🚀oMooooé🚀ééé🚀 éoéooo🚀🚀Méoo" + ] + ], + [ + [ + "Moo é🚀 oooé🚀 🚀éoMo", + "Moo é🚀 ooéo ooé🚀Mé éo🚀Méé🚀Mo é🚀éo🚀🚀M🚀 ", + "Moo é🚀🚀🚀🚀 🚀MMo" + ] + ], + [ + [ + "Moo é🚀🚀 M ooo🚀🚀🚀", + "Moo é🚀o oMé🚀oéo🚀 o 🚀oéMoMMM o🚀ééo 🚀🚀oé🚀ooMoo 🚀o éoo oo🚀oo", + "Moo é🚀🚀o🚀ooo🚀 oéMéé🚀Moé🚀Mé 🚀éooooooo🚀MoM🚀oo M🚀MoM🚀ooééMé" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMé" + }, + { + "type": "string", + "value": "Moo é🚀🚀éMooéoo🚀oo oo🚀oo🚀🚀ooo ééooo oooooéo🚀 M é 🚀 🚀éM oMéo oéo" + }, + { + "type": "string", + "value": "Moo é🚀oMooooé🚀ééé🚀 éoéooo🚀🚀Méoo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oooé🚀 🚀éoMo" + }, + { + "type": "string", + "value": "Moo é🚀 ooéo ooé🚀Mé éo🚀Méé🚀Mo é🚀éo🚀🚀M🚀 " + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀 🚀MMo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 M ooo🚀🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀o oMé🚀oéo🚀 o 🚀oéMoMMM o🚀ééo 🚀🚀oé🚀ooMoo 🚀o éoo oo🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀ooo🚀 oéMéé🚀Moé🚀Mé 🚀éooooooo🚀MoM🚀oo M🚀MoM🚀ooééMé" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610585806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061029a565b60405180910390f35b610056610219565b61005e610219565b610066610246565b61006e610273565b604080518082018252600f81526e4d6f6f20c3a9f09f9a80c3a94dc3a960881b602080830191909152908352815160a081019092526064808352600092916104ec9083013990508082600160200201819052505060006040518060600160405280603681526020016104b660369139604083015250815281526100ef610246565b6100f7610273565b604080518082018252601f81527f4d6f6f20c3a9f09f9a8020206f6f6fc3a9f09f9a8020f09f9a80c3a96f4d6f0060208083019190915290835281516080810190925260478083526000929161038990830139602083810191909152604080518082018252601e81527f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a8020f09f9a804d4d6f0000818401529084015291835250820152610198610246565b6101a0610273565b6000604051806060016040528060218152602001610433602191398252506040805160a08101909152606280825260009190610454602083013990508082600160200201819052505060006040518060a00160405280606381526020016103d06063913960408084019190915291835250820152919050565b60405180606001604052806003905b610230610246565b8152602001906001900390816102285790505090565b60405180602001604052806001905b61025d610273565b8152602001906001900390816102555790505090565b60405180606001604052806003905b60608152602001906001900390816102825790505090565b60208152600060208201608083018460005b600381101561037d57601f19868403810185528251846020810160005b60018110156103635787820383528351826060810160005b600381101561034b5785820383528351805180845260005b81811015610315576020818401810151868301820152016102f9565b81811115610327576000602083870101525b5060209586019594850194601f919091018b169390930190920191506001016102e1565b506020968701969590950194935050506001016102c9565b5060209788019790965094909401935050506001016102ac565b50909594505050505056fe4d6f6f20c3a9f09f9a80206f6fc3a96f206f6fc3a9f09f9a804dc3a920c3a96ff09f9a804dc3a9c3a9f09f9a804d6f20c3a9f09f9a80c3a96ff09f9a80f09f9a804df09f9a80204d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6f6ff09f9a80206fc3a94dc3a9c3a9f09f9a804d6fc3a9f09f9a804dc3a920f09f9a80c3a96f6f6f6f6f6f6ff09f9a804d6f4df09f9a806f6f204df09f9a804d6f4df09f9a806f6fc3a9c3a94dc3a94d6f6f20c3a9f09f9a80f09f9a8020204d206f6f6ff09f9a80f09f9a80f09f9a804d6f6f20c3a9f09f9a806f206f4dc3a9f09f9a806fc3a96ff09f9a80206f2020f09f9a806fc3a94d6f4d4d4d20206ff09f9a80c3a9c3a96f20f09f9a80f09f9a806fc3a9f09f9a806f6f4d6f6f2020f09f9a806f20c3a96f6f206f6ff09f9a806f6f4d6f6f20c3a9f09f9a806f4d6f6f6f6fc3a9f09f9a80c3a9c3a9c3a9f09f9a8020c3a96fc3a96f6f6ff09f9a80f09f9a804dc3a96f6f4d6f6f20c3a9f09f9a80f09f9a80c3a94d6f6fc3a96f6ff09f9a806f6f206f6ff09f9a806f6ff09f9a80f09f9a806f6f6f20c3a9c3a96f6f6f206f6f6f6f6fc3a96ff09f9a80204d20c3a92020f09f9a8020f09f9a80c3a94d206f4dc3a96f206fc3a96fa26469706673582212202b7c264738c45812be2335f53c0e97f27a41890978b0b07ce8b2dcaef8aad0f364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[3][1][3] memory) {\n string[3][1][3] memory r;\n {\n string[3][1] memory r_0;\n {\n string[3] memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀éMé\";\n r_0_0[0] = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀🚀éMooéoo🚀oo oo🚀oo🚀🚀ooo ééooo oooooéo🚀 M é 🚀 🚀éM oMéo oéo\";\n r_0_0[1] = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀oMooooé🚀ééé🚀 éoéooo🚀🚀Méoo\";\n r_0_0[2] = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n string[3][1] memory r_1;\n {\n string[3] memory r_1_0;\n {\n string memory r_1_0_0 = unicode\"Moo é🚀 oooé🚀 🚀éoMo\";\n r_1_0[0] = r_1_0_0;\n }\n {\n string memory r_1_0_1 = unicode\"Moo é🚀 ooéo ooé🚀Mé éo🚀Méé🚀Mo é🚀éo🚀🚀M🚀 \";\n r_1_0[1] = r_1_0_1;\n }\n {\n string memory r_1_0_2 = unicode\"Moo é🚀🚀🚀🚀 🚀MMo\";\n r_1_0[2] = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n string[3][1] memory r_2;\n {\n string[3] memory r_2_0;\n {\n string memory r_2_0_0 = unicode\"Moo é🚀🚀 M ooo🚀🚀🚀\";\n r_2_0[0] = r_2_0_0;\n }\n {\n string memory r_2_0_1 = unicode\"Moo é🚀o oMé🚀oéo🚀 o 🚀oéMoMMM o🚀ééo 🚀🚀oé🚀ooMoo 🚀o éoo oo🚀oo\";\n r_2_0[1] = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀🚀o🚀ooo🚀 oéMéé🚀Moé🚀Mé 🚀éooooooo🚀MoM🚀oo M🚀MoM🚀ooééMé\";\n r_2_0[2] = r_2_0_2;\n }\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80c3a94dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a80f09f9a80c3a94d6f6fc3a96f6ff09f9a806f6f206f6ff09f9a806f6ff09f9a80f09f9a806f6f6f20c3a9c3a96f6f6f206f6f6f6f6fc3a96ff09f9a80204d20c3a92020f09f9a8020f09f9a80c3a94d206f4dc3a96f206fc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806f4d6f6f6f6fc3a9f09f9a80c3a9c3a9c3a9f09f9a8020c3a96fc3a96f6f6ff09f9a80f09f9a804dc3a96f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a8020206f6f6fc3a9f09f9a8020f09f9a80c3a96f4d6f0000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a80206f6fc3a96f206f6fc3a9f09f9a804dc3a920c3a96ff09f9a804dc3a9c3a9f09f9a804d6f20c3a9f09f9a80c3a96ff09f9a80f09f9a804df09f9a802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a8020f09f9a804d4d6f00000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80f09f9a8020204d206f6f6ff09f9a80f09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806f206f4dc3a9f09f9a806fc3a96ff09f9a80206f2020f09f9a806fc3a94d6f4d4d4d20206ff09f9a80c3a9c3a96f20f09f9a80f09f9a806fc3a9f09f9a806f6f4d6f6f2020f09f9a806f20c3a96f6f206f6ff09f9a806f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f6f6ff09f9a80206fc3a94dc3a9c3a9f09f9a804d6fc3a9f09f9a804dc3a920f09f9a80c3a96f6f6f6f6f6f6ff09f9a804d6f4df09f9a806f6f204df09f9a804d6f4df09f9a806f6fc3a9c3a94dc3a90000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-uint224[4][2][4]", + "type": "uint224[4][2][4]", + "value": [ + [ + [ + "5377312229897299535696019687406810013089099852755101091439757512680", + "18522154909321097802266265825651276784275675883595845086883647763201", + "12058336054582840951854927147905955754680706266328100852050408791167", + "23492719061496978739874177622027830482434981716258735142190425449108" + ], + [ + "18100020790030960321943247471394873994813620236636109335184896631979", + "21824938749583676118372319218823614342478491472211175165918743048202", + "22263036018111224546721594290232683579455602948987127356518146553606", + "22748992211465257697293035229826553915199734377443768278419154845886" + ] + ], + [ + [ + "7699845118881503057089946499173846883147144502989620147954556375852", + "20996916564276708400223345095243135952560777839306806884079602847925", + "18672325135799566643543625431188225864251177670867301843181122494338", + "4597340655837690870496971444234799551034223756552663123816041029295" + ], + [ + "23424611392081652253715277056274401163915218070898536397892050161984", + "14688467483563487675198993503650977286455923158568175148106565463920", + "25515162019250128132129320767301212867465966381098310490380431486860", + "1981116308711297786698759699724981991358908177770746810709204758438" + ] + ], + [ + [ + "8431240698375154038746226471669553079687803153725091016735712244229", + "14807580739603437631275120211038598377234576873017803300522139955994", + "20287171984628217456391595383909573027215910476496027836621977765248", + "18456290289566333218977479554682641592587387572332634609417484783849" + ], + [ + "13199947442456902507593853457678304855624344602361705770173200864003", + "1912217439790950948673357742266587791371015676267458417204650703372", + "8382247615196011385403079875120550216847127523271986497990853980509", + "24644874696145894687502700113744172909047145240716223168074391969402" + ] + ], + [ + [ + "6177907570234652601963152692732332635096935948899691362753344033436", + "12003237932543587871581407782194865071462824748929246326788191912141", + "19325179210680829176796249552510997673751060010608090145268937468622", + "15652708773599942269317775762725936466995535660810910010541606852765" + ], + [ + "22170160908098190116629798064727534141123441505854067365011736564557", + "24574506323149670154821092697287988781024901629311344135814833285539", + "15017046925822393734822924405937889839644459921287373118988637626850", + "14081164759054961644233462463074115214259962948364490039368988236136" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "5377312229897299535696019687406810013089099852755101091439757512680" + }, + { + "type": "number", + "value": "18522154909321097802266265825651276784275675883595845086883647763201" + }, + { + "type": "number", + "value": "12058336054582840951854927147905955754680706266328100852050408791167" + }, + { + "type": "number", + "value": "23492719061496978739874177622027830482434981716258735142190425449108" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "18100020790030960321943247471394873994813620236636109335184896631979" + }, + { + "type": "number", + "value": "21824938749583676118372319218823614342478491472211175165918743048202" + }, + { + "type": "number", + "value": "22263036018111224546721594290232683579455602948987127356518146553606" + }, + { + "type": "number", + "value": "22748992211465257697293035229826553915199734377443768278419154845886" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "7699845118881503057089946499173846883147144502989620147954556375852" + }, + { + "type": "number", + "value": "20996916564276708400223345095243135952560777839306806884079602847925" + }, + { + "type": "number", + "value": "18672325135799566643543625431188225864251177670867301843181122494338" + }, + { + "type": "number", + "value": "4597340655837690870496971444234799551034223756552663123816041029295" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "23424611392081652253715277056274401163915218070898536397892050161984" + }, + { + "type": "number", + "value": "14688467483563487675198993503650977286455923158568175148106565463920" + }, + { + "type": "number", + "value": "25515162019250128132129320767301212867465966381098310490380431486860" + }, + { + "type": "number", + "value": "1981116308711297786698759699724981991358908177770746810709204758438" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "8431240698375154038746226471669553079687803153725091016735712244229" + }, + { + "type": "number", + "value": "14807580739603437631275120211038598377234576873017803300522139955994" + }, + { + "type": "number", + "value": "20287171984628217456391595383909573027215910476496027836621977765248" + }, + { + "type": "number", + "value": "18456290289566333218977479554682641592587387572332634609417484783849" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "13199947442456902507593853457678304855624344602361705770173200864003" + }, + { + "type": "number", + "value": "1912217439790950948673357742266587791371015676267458417204650703372" + }, + { + "type": "number", + "value": "8382247615196011385403079875120550216847127523271986497990853980509" + }, + { + "type": "number", + "value": "24644874696145894687502700113744172909047145240716223168074391969402" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "6177907570234652601963152692732332635096935948899691362753344033436" + }, + { + "type": "number", + "value": "12003237932543587871581407782194865071462824748929246326788191912141" + }, + { + "type": "number", + "value": "19325179210680829176796249552510997673751060010608090145268937468622" + }, + { + "type": "number", + "value": "15652708773599942269317775762725936466995535660810910010541606852765" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "22170160908098190116629798064727534141123441505854067365011736564557" + }, + { + "type": "number", + "value": "24574506323149670154821092697287988781024901629311344135814833285539" + }, + { + "type": "number", + "value": "15017046925822393734822924405937889839644459921287373118988637626850" + }, + { + "type": "number", + "value": "14081164759054961644233462463074115214259962948364490039368988236136" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061066e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105a6565b60405180910390f35b61005661052e565b61005e61052e565b61006661055b565b61006e610588565b7b330f859db55321e61a8ab9cc126693afe5040aae5fc798fbc0004fe881527bafe0dd4c4736064ddbd80949d2f29c9c4971e42011a6bf70ba76b30160208201527b728030f306fb6126cec6a46eb48ae6a5e35e0cdee6f76c9c5bdc5c7f60408201527bdf13a2f6bce08af605fb7a6801de0c7458ff180b96bd8b6a7efe2294606082015281526100fd610588565b7babdeb697315855aaf48f81ad855652a44fa3012318b5a637c52724ab81527bcf3d7cba4ad3fd0d1ec604b4e2ff2d3a7109b2304cf79b3984db300a6020808301919091527bd3667153c53534d0690e472f9a2a99548f13e815f2fff8809100b70660408301527bd803bc9bd99c9c334af9457ea7f0bc00e2d2bba4bf57b6170ffec0be6060830152820152815261019361055b565b61019b610588565b7b491d49619616903d191d33b60dafc64ae7f249abadf96f522e98932c81527bc760ad41ba2b412d3ae577596a37167bc1d6dcda54b68493788d50b560208201527bb14de875967682706228751a8cfc2d38fbdc5fd8298cc6b87c1a1f8260408201527b2ba7841d274e527058402ecec918d35db74899d33230fc6b185a1eaf6060820152815261022a610588565b7bde6e137503bf44c3ddfe45f190631cf28d661ef09070c3539473114081527b8b79afc17fec97a73b9a2a4e8e00d810334512601ecadd02828aaf706020808301919091527bf247ec4e68fe95fbb8273ef93b1bcd543b981f0bc70bd0db36336f8c60408301527b12cfd3b4a45db899cacd0290d2982e9cc9e58b251dd33271c0036fa66060830152828101919091528201526102c561055b565b6102cd610588565b7b500f35f7bd3d6dbd51b4864ae6edb056b1387c46a072004e9f92720581527b8c9b3c1df86521f83947e1770ce35802807f3f0e4aa69cce7b4db31a60208201527bc0a3621ed8ae6704630d38886831a872235ab28442f98380c5fb458060408201527baf40c1a4fb67f63d8a0a76e98b1012e8d5f769abca57f342027c50e96060820152815261035c610588565b7b7d574b75cb8f8e66d4e15682a763f47cb48ba618c9c158c1daf8130381527b122857d590d425986aafa5905d81bb896a53d8057b8a566eacedfa0c6020808301919091527b4f981d7f49ad9db2db277b9ed5c8caca4caa10df4563e5a6a738f15d6040808401919091527bea045f2cee27567a9277c9245b10ce8702316f965a3ff86b52075e7a6060840152908301919091528201526103fb61055b565b610403610588565b7b3aa9a951c9568a12e9372d8a1ab078f87f0365f3b59cf7e6dfadd29c81527b71fa414dc5f9ac7a172ef84b80c2d2e249ced473ef91e5ac3a3b80cd60208201527bb780e88c2c0c80ae6f8efc73010bae2eb417f49fd919de0fd0f32ace60408201527b94a1a095741240f467523f8bcb830a51eb8f7a1f6e0107f3683e589d60608201528152610492610588565b7bd284ad011e9ef4118d31668bc96fd0252921de7dcc125cb2ad11134d81527be95950d4592a74ed4f72c7f381adddaccff4b5893537e2da443ca9a36020808301919091527b8e986b3ea993cc0bee8d482027d0f694f475b13e276737cdea6ee1e260408301527b85b56a57b2878884383e28bb9a2a123e3c9f3ac4119f5e695730196860608084019190915290830191909152820152919050565b60405180608001604052806004905b61054561055b565b81526020019060019003908161053d5790505090565b60405180604001604052806002905b610572610588565b81526020019060019003908161056a5790505090565b60405180608001604052806004906020820280368337509192915050565b6104008101818360005b60048082106105bf575061062f565b82518460005b60028110156106145782518260005b868110156105fb5782516001600160e01b03168252602092830192909101906001016105d4565b50505060209290920191608091909101906001016105c5565b505050610100939093019250602091909101906001016105b0565b5050509291505056fea2646970667358221220b2b637a48625ed8b3a3bb60b7a2f7679a02f4f054c1de8f1df676b522156225364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (uint224[4][2][4] memory) {\n uint224[4][2][4] memory r;\n {\n uint224[4][2] memory r_0;\n {\n uint224[4] memory r_0_0;\n {\n uint224 r_0_0_0 = 5377312229897299535696019687406810013089099852755101091439757512680;\n r_0_0[0] = r_0_0_0;\n }\n {\n uint224 r_0_0_1 = 18522154909321097802266265825651276784275675883595845086883647763201;\n r_0_0[1] = r_0_0_1;\n }\n {\n uint224 r_0_0_2 = 12058336054582840951854927147905955754680706266328100852050408791167;\n r_0_0[2] = r_0_0_2;\n }\n {\n uint224 r_0_0_3 = 23492719061496978739874177622027830482434981716258735142190425449108;\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n uint224[4] memory r_0_1;\n {\n uint224 r_0_1_0 = 18100020790030960321943247471394873994813620236636109335184896631979;\n r_0_1[0] = r_0_1_0;\n }\n {\n uint224 r_0_1_1 = 21824938749583676118372319218823614342478491472211175165918743048202;\n r_0_1[1] = r_0_1_1;\n }\n {\n uint224 r_0_1_2 = 22263036018111224546721594290232683579455602948987127356518146553606;\n r_0_1[2] = r_0_1_2;\n }\n {\n uint224 r_0_1_3 = 22748992211465257697293035229826553915199734377443768278419154845886;\n r_0_1[3] = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n {\n uint224[4][2] memory r_1;\n {\n uint224[4] memory r_1_0;\n {\n uint224 r_1_0_0 = 7699845118881503057089946499173846883147144502989620147954556375852;\n r_1_0[0] = r_1_0_0;\n }\n {\n uint224 r_1_0_1 = 20996916564276708400223345095243135952560777839306806884079602847925;\n r_1_0[1] = r_1_0_1;\n }\n {\n uint224 r_1_0_2 = 18672325135799566643543625431188225864251177670867301843181122494338;\n r_1_0[2] = r_1_0_2;\n }\n {\n uint224 r_1_0_3 = 4597340655837690870496971444234799551034223756552663123816041029295;\n r_1_0[3] = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n {\n uint224[4] memory r_1_1;\n {\n uint224 r_1_1_0 = 23424611392081652253715277056274401163915218070898536397892050161984;\n r_1_1[0] = r_1_1_0;\n }\n {\n uint224 r_1_1_1 = 14688467483563487675198993503650977286455923158568175148106565463920;\n r_1_1[1] = r_1_1_1;\n }\n {\n uint224 r_1_1_2 = 25515162019250128132129320767301212867465966381098310490380431486860;\n r_1_1[2] = r_1_1_2;\n }\n {\n uint224 r_1_1_3 = 1981116308711297786698759699724981991358908177770746810709204758438;\n r_1_1[3] = r_1_1_3;\n }\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n uint224[4][2] memory r_2;\n {\n uint224[4] memory r_2_0;\n {\n uint224 r_2_0_0 = 8431240698375154038746226471669553079687803153725091016735712244229;\n r_2_0[0] = r_2_0_0;\n }\n {\n uint224 r_2_0_1 = 14807580739603437631275120211038598377234576873017803300522139955994;\n r_2_0[1] = r_2_0_1;\n }\n {\n uint224 r_2_0_2 = 20287171984628217456391595383909573027215910476496027836621977765248;\n r_2_0[2] = r_2_0_2;\n }\n {\n uint224 r_2_0_3 = 18456290289566333218977479554682641592587387572332634609417484783849;\n r_2_0[3] = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n {\n uint224[4] memory r_2_1;\n {\n uint224 r_2_1_0 = 13199947442456902507593853457678304855624344602361705770173200864003;\n r_2_1[0] = r_2_1_0;\n }\n {\n uint224 r_2_1_1 = 1912217439790950948673357742266587791371015676267458417204650703372;\n r_2_1[1] = r_2_1_1;\n }\n {\n uint224 r_2_1_2 = 8382247615196011385403079875120550216847127523271986497990853980509;\n r_2_1[2] = r_2_1_2;\n }\n {\n uint224 r_2_1_3 = 24644874696145894687502700113744172909047145240716223168074391969402;\n r_2_1[3] = r_2_1_3;\n }\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n {\n uint224[4][2] memory r_3;\n {\n uint224[4] memory r_3_0;\n {\n uint224 r_3_0_0 = 6177907570234652601963152692732332635096935948899691362753344033436;\n r_3_0[0] = r_3_0_0;\n }\n {\n uint224 r_3_0_1 = 12003237932543587871581407782194865071462824748929246326788191912141;\n r_3_0[1] = r_3_0_1;\n }\n {\n uint224 r_3_0_2 = 19325179210680829176796249552510997673751060010608090145268937468622;\n r_3_0[2] = r_3_0_2;\n }\n {\n uint224 r_3_0_3 = 15652708773599942269317775762725936466995535660810910010541606852765;\n r_3_0[3] = r_3_0_3;\n }\n r_3[0] = r_3_0;\n }\n {\n uint224[4] memory r_3_1;\n {\n uint224 r_3_1_0 = 22170160908098190116629798064727534141123441505854067365011736564557;\n r_3_1[0] = r_3_1_0;\n }\n {\n uint224 r_3_1_1 = 24574506323149670154821092697287988781024901629311344135814833285539;\n r_3_1[1] = r_3_1_1;\n }\n {\n uint224 r_3_1_2 = 15017046925822393734822924405937889839644459921287373118988637626850;\n r_3_1[2] = r_3_1_2;\n }\n {\n uint224 r_3_1_3 = 14081164759054961644233462463074115214259962948364490039368988236136;\n r_3_1[3] = r_3_1_3;\n }\n r_3[1] = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000330f859db55321e61a8ab9cc126693afe5040aae5fc798fbc0004fe800000000afe0dd4c4736064ddbd80949d2f29c9c4971e42011a6bf70ba76b30100000000728030f306fb6126cec6a46eb48ae6a5e35e0cdee6f76c9c5bdc5c7f00000000df13a2f6bce08af605fb7a6801de0c7458ff180b96bd8b6a7efe229400000000abdeb697315855aaf48f81ad855652a44fa3012318b5a637c52724ab00000000cf3d7cba4ad3fd0d1ec604b4e2ff2d3a7109b2304cf79b3984db300a00000000d3667153c53534d0690e472f9a2a99548f13e815f2fff8809100b70600000000d803bc9bd99c9c334af9457ea7f0bc00e2d2bba4bf57b6170ffec0be00000000491d49619616903d191d33b60dafc64ae7f249abadf96f522e98932c00000000c760ad41ba2b412d3ae577596a37167bc1d6dcda54b68493788d50b500000000b14de875967682706228751a8cfc2d38fbdc5fd8298cc6b87c1a1f82000000002ba7841d274e527058402ecec918d35db74899d33230fc6b185a1eaf00000000de6e137503bf44c3ddfe45f190631cf28d661ef09070c35394731140000000008b79afc17fec97a73b9a2a4e8e00d810334512601ecadd02828aaf7000000000f247ec4e68fe95fbb8273ef93b1bcd543b981f0bc70bd0db36336f8c0000000012cfd3b4a45db899cacd0290d2982e9cc9e58b251dd33271c0036fa600000000500f35f7bd3d6dbd51b4864ae6edb056b1387c46a072004e9f927205000000008c9b3c1df86521f83947e1770ce35802807f3f0e4aa69cce7b4db31a00000000c0a3621ed8ae6704630d38886831a872235ab28442f98380c5fb458000000000af40c1a4fb67f63d8a0a76e98b1012e8d5f769abca57f342027c50e9000000007d574b75cb8f8e66d4e15682a763f47cb48ba618c9c158c1daf8130300000000122857d590d425986aafa5905d81bb896a53d8057b8a566eacedfa0c000000004f981d7f49ad9db2db277b9ed5c8caca4caa10df4563e5a6a738f15d00000000ea045f2cee27567a9277c9245b10ce8702316f965a3ff86b52075e7a000000003aa9a951c9568a12e9372d8a1ab078f87f0365f3b59cf7e6dfadd29c0000000071fa414dc5f9ac7a172ef84b80c2d2e249ced473ef91e5ac3a3b80cd00000000b780e88c2c0c80ae6f8efc73010bae2eb417f49fd919de0fd0f32ace0000000094a1a095741240f467523f8bcb830a51eb8f7a1f6e0107f3683e589d00000000d284ad011e9ef4118d31668bc96fd0252921de7dcc125cb2ad11134d00000000e95950d4592a74ed4f72c7f381adddaccff4b5893537e2da443ca9a3000000008e986b3ea993cc0bee8d482027d0f694f475b13e276737cdea6ee1e20000000085b56a57b2878884383e28bb9a2a123e3c9f3ac4119f5e6957301968" + }, + { + "name": "random-(((bool,bytes7),(uint144,uint232,int)))", + "type": "(((bool,bytes7),(uint144,uint232,int)))", + "value": [ + [ + [false, "0x1d3eed889a8712"], + [ + "14329902020018249662978933810479027112502716", + "3376477939983014499890580101026150584705047245656021126340470999085253", + "1433964434526466021610187632551076552415698336378822750633328280106652253120" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x1d3eed889a8712" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "14329902020018249662978933810479027112502716" + }, + { + "type": "number", + "value": "3376477939983014499890580101026150584705047245656021126340470999085253" + }, + { + "type": "number", + "value": "1433964434526466021610187632551076552415698336378822750633328280106652253120" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610201806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861009d565b60408051915180518051151584526020908101516001600160c81b0319168185015290810151805171ffffffffffffffffffffffffffffffffffff1684840152908101516001600160e81b031660608401520151608082015260a00160405180910390f35b6100a5610185565b6100ad610185565b6100f06040805160808101825260009181018281526060820192909252908190815260408051606081018252600080825260208281018290529282015291015290565b60408051808201825260008152660e9f76c44d438960c91b602080830191909152908352815160608101835271a47fcc140c800872a8522532b6eb99a5e5bc81527c7d3d933496691d8814f3a7ccc67b8a712447a8b99a7dff1da850dbf0c5818301527f032b9859010e6316e5c2936a55a94ba7bdf43f8b46fcb919345a6d892cd9bbc0928101929092528201528152919050565b6040805160a0810182526000606080830182815260808401839052602080850191825285519283018652838352820183905281850192909252928201929092529081529056fea26469706673582212205bac87024fbbf536e5b6730eb61e42275ed9263b03b7347eead91a969741348064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6a62bb34 {\n bool s_0;\n bytes7 s_1;\n }\n\n struct S_3589c251 {\n uint144 s_0;\n uint232 s_1;\n int256 s_2;\n }\n\n struct S_26786339 {\n S_6a62bb34 s_0;\n S_3589c251 s_1;\n }\n\n struct S_7f7eed4d {\n S_26786339 s_0;\n }\n\n function test () public pure returns (S_7f7eed4d memory) {\n S_7f7eed4d memory r;\n {\n S_26786339 memory r_0;\n {\n S_6a62bb34 memory r_0_0;\n {\n bool r_0_0_0 = false;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bytes7 r_0_0_1 = bytes7(0x1d3eed889a8712);\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n S_3589c251 memory r_0_1;\n {\n uint144 r_0_1_0 = 14329902020018249662978933810479027112502716;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n uint232 r_0_1_1 = 3376477939983014499890580101026150584705047245656021126340470999085253;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n int r_0_1_2 = 1433964434526466021610187632551076552415698336378822750633328280106652253120;\n r_0_1.s_2 = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000001d3eed889a8712000000000000000000000000000000000000000000000000000000000000000000000000000000a47fcc140c800872a8522532b6eb99a5e5bc0000007d3d933496691d8814f3a7ccc67b8a712447a8b99a7dff1da850dbf0c5032b9859010e6316e5c2936a55a94ba7bdf43f8b46fcb919345a6d892cd9bbc0" + }, + { + "name": "random-((bool,string,address,address)[4])", + "type": "((bool,string,address,address)[4])", + "value": [ + [ + [ + true, + "Moo é🚀o 🚀M🚀éMooM🚀 M🚀 é oo 🚀o MM🚀ooéooooMMééMo M", + "0x60F07A7c935BfAeDb233547b1191ddd5740EF1B6", + "0xb9f6c1e67f16872a61B6874578ed955A60d18Cb1" + ], + [ + false, + "Moo é🚀 🚀Mo🚀MoMé🚀 é o🚀o🚀🚀 éM🚀éoM🚀Mééo🚀 ooo ooo🚀 oé éé", + "0x737eAF3a4E226642c88F46E50007f7F21c5944bE", + "0x584CC690836b89EeCD0ce94b3a1Ff8b61F49c519" + ], + [ + false, + "Moo é🚀éooMooé🚀🚀M 🚀", + "0x74A5278b39A53B65C20fD40a188fa61EBdEfdDC7", + "0x63354E8F83ec2613B1bFB4532F80a888087B0339" + ], + [ + false, + "Moo é🚀🚀 ooM🚀 o🚀o 🚀 Moééoo é🚀🚀 ooéo🚀🚀éoo🚀🚀 Méoo🚀", + "0x5B4D64DC721ac8EDDa04A2f6c0D31C935822ac5c", + "0x994fE0Ee1cBd66827971190CFf475dE91C2D6982" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀o 🚀M🚀éMooM🚀 M🚀 é oo 🚀o MM🚀ooéooooMMééMo M" + }, + { + "type": "address", + "value": "0x60F07A7c935BfAeDb233547b1191ddd5740EF1B6" + }, + { + "type": "address", + "value": "0xb9f6c1e67f16872a61B6874578ed955A60d18Cb1" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 🚀Mo🚀MoMé🚀 é o🚀o🚀🚀 éM🚀éoM🚀Mééo🚀 ooo ooo🚀 oé éé" + }, + { + "type": "address", + "value": "0x737eAF3a4E226642c88F46E50007f7F21c5944bE" + }, + { + "type": "address", + "value": "0x584CC690836b89EeCD0ce94b3a1Ff8b61F49c519" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀éooMooé🚀🚀M 🚀" + }, + { + "type": "address", + "value": "0x74A5278b39A53B65C20fD40a188fa61EBdEfdDC7" + }, + { + "type": "address", + "value": "0x63354E8F83ec2613B1bFB4532F80a888087B0339" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀 ooM🚀 o🚀o 🚀 Moééoo é🚀🚀 ooéo🚀🚀éoo🚀🚀 Méoo🚀" + }, + { + "type": "address", + "value": "0x5B4D64DC721ac8EDDa04A2f6c0D31C935822ac5c" + }, + { + "type": "address", + "value": "0x994fE0Ee1cBd66827971190CFf475dE91C2D6982" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610528806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102f0565b60405180910390f35b610056610292565b61005e610292565b6100666102aa565b6040805160808082018352606060208084018290526000848601819052918401829052600184528451928301909452604a808352929390929061044b908301396020830152507360f07a7c935bfaedb233547b1191ddd5740ef1b6604082015273b9f6c1e67f16872a61b6874578ed955a60d18cb16060820152808260006020020152506101156040805160808101825260008082526060602083018190529282018190529181019190915290565b6000808252604080516080810190915260608082526103ca602083013960208301525073737eaf3a4e226642c88f46e50007f7f21c5944be604082015273584cc690836b89eecd0ce94b3a1ff8b61f49c5196060820152808260016020020152506101a16040805160808101825260008082526060602083018190529282018190529181019190915290565b60008082526040805160608101909152602180825261042a60208301396020830152507374a5278b39a53b65c20fd40a188fa61ebdefddc760408201527363354e8f83ec2613b1bfb4532f80a888087b033960608201528082600260200201525061022d6040805160808101825260008082526060602083018190529282018190529181019190915290565b60008082526040805160808101909152605e8082526104956020830139602083015250735b4d64dc721ac8edda04a2f6c0d31c935822ac5c604082015273994fe0ee1cbd66827971190cff475de91c2d69826060808301919091528201528152919050565b60405180602001604052806102a56102aa565b905290565b60405180608001604052806004905b6040805160808101825260008082526060602080840182905293830182905282015282526000199092019101816102b95790505090565b602080825282518282018290526000919060409060c085019082860185805b60048110156103bb57603f198986030183528351608081511515875288820151818a890152805180838a01528592505b8083101561035d578183018b015189840160a00152918a019161033f565b8083111561036e578560a0828b0101525b838a01516001600160a01b0381168a8c015292506060938401516001600160a01b0381168a860152939250601f01601f19169790970160a00196505050928601929186019160010161030f565b50929897505050505050505056fe4d6f6f20c3a9f09f9a8020f09f9a804d6ff09f9a804d6f4dc3a9f09f9a8020c3a9206ff09f9a806ff09f9a80f09f9a8020c3a94df09f9a80c3a96f4df09f9a804dc3a9c3a96ff09f9a80206f6f6f20206f6f6ff09f9a80206fc3a920c3a9c3a94d6f6f20c3a9f09f9a80c3a96f6f4d6f6fc3a9f09f9a80f09f9a804d20f09f9a804d6f6f20c3a9f09f9a806f20f09f9a804df09f9a80c3a94d6f6f4df09f9a80204df09f9a8020c3a9206f6f20f09f9a806f204d4df09f9a806f6fc3a96f6f6f6f4d4dc3a9c3a94d6f204d4d6f6f20c3a9f09f9a80f09f9a8020206f6f4df09f9a80206ff09f9a806f20f09f9a80204d6fc3a9c3a96f6f20c3a9f09f9a80f09f9a802020206f6fc3a96ff09f9a80f09f9a80c3a96f6ff09f9a80f09f9a8020204dc3a96f6ff09f9a80a264697066735822122053b2cb39bc660c835518e17f0f34b869a964c191e3a940cbdf508deaf3b652ee64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8aabdcec {\n bool s_0;\n string s_1;\n address s_2;\n address s_3;\n }\n\n struct S_29dcffb0 {\n S_8aabdcec[4] s_0;\n }\n\n function test () public pure returns (S_29dcffb0 memory) {\n S_29dcffb0 memory r;\n {\n S_8aabdcec[4] memory r_0;\n {\n S_8aabdcec memory r_0_0;\n {\n bool r_0_0_0 = true;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀o 🚀M🚀éMooM🚀 M🚀 é oo 🚀o MM🚀ooéooooMMééMo M\";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x60F07A7c935BfAeDb233547b1191ddd5740EF1B6;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n address r_0_0_3 = 0xb9f6c1e67f16872a61B6874578ed955A60d18Cb1;\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n S_8aabdcec memory r_0_1;\n {\n bool r_0_1_0 = false;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n string memory r_0_1_1 = unicode\"Moo é🚀 🚀Mo🚀MoMé🚀 é o🚀o🚀🚀 éM🚀éoM🚀Mééo🚀 ooo ooo🚀 oé éé\";\n r_0_1.s_1 = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x737eAF3a4E226642c88F46E50007f7F21c5944bE;\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x584CC690836b89EeCD0ce94b3a1Ff8b61F49c519;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n {\n S_8aabdcec memory r_0_2;\n {\n bool r_0_2_0 = false;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀éooMooé🚀🚀M 🚀\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n address r_0_2_2 = 0x74A5278b39A53B65C20fD40a188fa61EBdEfdDC7;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n address r_0_2_3 = 0x63354E8F83ec2613B1bFB4532F80a888087B0339;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0[2] = r_0_2;\n }\n {\n S_8aabdcec memory r_0_3;\n {\n bool r_0_3_0 = false;\n r_0_3.s_0 = r_0_3_0;\n }\n {\n string memory r_0_3_1 = unicode\"Moo é🚀🚀 ooM🚀 o🚀o 🚀 Moééoo é🚀🚀 ooéo🚀🚀éoo🚀🚀 Méoo🚀\";\n r_0_3.s_1 = r_0_3_1;\n }\n {\n address r_0_3_2 = 0x5B4D64DC721ac8EDDa04A2f6c0D31C935822ac5c;\n r_0_3.s_2 = r_0_3_2;\n }\n {\n address r_0_3_3 = 0x994fE0Ee1cBd66827971190CFf475dE91C2D6982;\n r_0_3.s_3 = r_0_3_3;\n }\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000060f07a7c935bfaedb233547b1191ddd5740ef1b6000000000000000000000000b9f6c1e67f16872a61b6874578ed955a60d18cb1000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f20f09f9a804df09f9a80c3a94d6f6f4df09f9a80204df09f9a8020c3a9206f6f20f09f9a806f204d4df09f9a806f6fc3a96f6f6f6f4d4dc3a9c3a94d6f204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000737eaf3a4e226642c88f46e50007f7f21c5944be000000000000000000000000584cc690836b89eecd0ce94b3a1ff8b61f49c51900000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a8020f09f9a804d6ff09f9a804d6f4dc3a9f09f9a8020c3a9206ff09f9a806ff09f9a80f09f9a8020c3a94df09f9a80c3a96f4df09f9a804dc3a9c3a96ff09f9a80206f6f6f20206f6f6ff09f9a80206fc3a920c3a9c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000074a5278b39a53b65c20fd40a188fa61ebdefddc700000000000000000000000063354e8f83ec2613b1bfb4532f80a888087b033900000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80c3a96f6f4d6f6fc3a9f09f9a80f09f9a804d20f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000005b4d64dc721ac8edda04a2f6c0d31c935822ac5c000000000000000000000000994fe0ee1cbd66827971190cff475de91c2d6982000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80f09f9a8020206f6f4df09f9a80206ff09f9a806f20f09f9a80204d6fc3a9c3a96f6f20c3a9f09f9a80f09f9a802020206f6fc3a96ff09f9a80f09f9a80c3a96f6ff09f9a80f09f9a8020204dc3a96f6ff09f9a800000" + }, + { + "name": "random-((bytes13,uint256),address,address,bool)", + "type": "((bytes13,uint256),address,address,bool)", + "value": [ + [ + "0xcd7f6a22cd0f7d9424ad45e337", + "63966365856958473304615365903717226686911980329353332296759373167177430721807" + ], + "0x91A7eDfD382f73D2B522008e8b0c2A6f14713660", + "0x24F667C505AdD4A3457fdA01047e287f93Be6790", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xcd7f6a22cd0f7d9424ad45e337" + }, + { + "type": "number", + "value": "63966365856958473304615365903717226686911980329353332296759373167177430721807" + } + ] + }, + { + "type": "address", + "value": "0x91A7eDfD382f73D2B522008e8b0c2A6f14713660" + }, + { + "type": "address", + "value": "0x24F667C505AdD4A3457fdA01047e287f93Be6790" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061018b8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160c080820183526000608080840182815260a0808601849052908552602080860184905285870184905260609586018490528651948501875284830184815285830185905285528481018481528588018581528688019586528851808a018a526ccd7f6a22cd0f7d9424ad45e33760981b81527f8d6bae18bcce44298d06333a0bbbe5b7fa5fc1af6b92e1c9fe92766dc313e50f818501908152978190527391a7edfd382f73d2b522008e8b0c2a6f1471366083527324f667c505add4a3457fda01047e287f93be67908252600187528951905172ffffffffffffffffffffffffffffffffffffff19168152965192870192909252516001600160a01b03908116868901529051169484019490945290511515908201529151918290030190f3fea2646970667358221220bb940bfc8a9dcb6eb6c1b77037b663f575723ae4e05faa41f0de20dcb588317d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_029d0978 {\n bytes13 s_0;\n uint256 s_1;\n }\n\n struct S_ec5d31c3 {\n S_029d0978 s_0;\n address s_1;\n address s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_ec5d31c3 memory) {\n S_ec5d31c3 memory r;\n {\n S_029d0978 memory r_0;\n {\n bytes13 r_0_0 = bytes13(0xcd7f6a22cd0f7d9424ad45e337);\n r_0.s_0 = r_0_0;\n }\n {\n uint256 r_0_1 = 63966365856958473304615365903717226686911980329353332296759373167177430721807;\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x91A7eDfD382f73D2B522008e8b0c2A6f14713660;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x24F667C505AdD4A3457fdA01047e287f93Be6790;\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0xcd7f6a22cd0f7d9424ad45e337000000000000000000000000000000000000008d6bae18bcce44298d06333a0bbbe5b7fa5fc1af6b92e1c9fe92766dc313e50f00000000000000000000000091a7edfd382f73d2b522008e8b0c2a6f1471366000000000000000000000000024f667c505add4a3457fda01047e287f93be67900000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-((bytes22,bool,int232,string,bytes6))", + "type": "((bytes22,bool,int232,string,bytes6))", + "value": [ + [ + "0x2a1b4ab0e1caca5feebc4901cfdcd262607b4f303d7c", + true, + "1988457561416589407512412632101673342788148023163537185187473900067525", + "Moo é🚀M Mo🚀🚀 é éo MéM oooo ooo🚀o M🚀 o o éM🚀oM éoéoM", + "0x8a4a9af37a1a" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2a1b4ab0e1caca5feebc4901cfdcd262607b4f303d7c" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "1988457561416589407512412632101673342788148023163537185187473900067525" + }, + { + "type": "string", + "value": "Moo é🚀M Mo🚀🚀 é éo MéM oooo ooo🚀o M🚀 o o éM🚀oM éoéoM" + }, + { + "type": "hexstring", + "value": "0x8a4a9af37a1a" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610276806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610143565b60405180910390f35b6040805160c0810182526000602082018181529282018190526060808301829052608083015260a08201529081526040805160c0810182526000602082018181529282018190526060808301829052608083015260a08201529081526040805160a08101825260608082015260006080808301829052750a86d2ac3872b297fbaf124073f73498981ed3cc0f5f60521b835260016020808501919091527c49c18892684b022aa825927bff94a09e349760a97a0239f966364e5ac5848601528451918201909452604d8082529293919290916101f4908301396060830152506545254d79bd0d60d11b60808201528152919050565b600060208083528351818285015269ffffffffffffffffffff19815116604085015281810151151560608501526040810151601c0b6080850152606081015160a08086015280518060e087015260005b818110156101b05782810185015187820161010001528401610193565b818111156101c357600061010083890101525b5060808301516001600160d01b0319811660c08801529350601f01601f191694909401610100019594505050505056fe4d6f6f20c3a9f09f9a804d204d6ff09f9a80f09f9a8020c3a920c3a96f204dc3a94d206f6f6f6f206f6f6ff09f9a806f204df09f9a80206f20206f20c3a94df09f9a806f4d20c3a96fc3a96f4da2646970667358221220e39a00ae162dd41a089f080f98cf1d229afa63d1bbb3f1e55409f81b8e10f77d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a465fe84 {\n bytes22 s_0;\n bool s_1;\n int232 s_2;\n string s_3;\n bytes6 s_4;\n }\n\n struct S_e754ebcc {\n S_a465fe84 s_0;\n }\n\n function test () public pure returns (S_e754ebcc memory) {\n S_e754ebcc memory r;\n {\n S_a465fe84 memory r_0;\n {\n bytes22 r_0_0 = bytes22(0x2a1b4ab0e1caca5feebc4901cfdcd262607b4f303d7c);\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n int232 r_0_2 = 1988457561416589407512412632101673342788148023163537185187473900067525;\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀M Mo🚀🚀 é éo MéM oooo ooo🚀o M🚀 o o éM🚀oM éoéoM\";\n r_0.s_3 = r_0_3;\n }\n {\n bytes6 r_0_4 = bytes6(0x8a4a9af37a1a);\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202a1b4ab0e1caca5feebc4901cfdcd262607b4f303d7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000100000049c18892684b022aa825927bff94a09e349760a97a0239f966364e5ac500000000000000000000000000000000000000000000000000000000000000a08a4a9af37a1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a804d204d6ff09f9a80f09f9a8020c3a920c3a96f204dc3a94d206f6f6f6f206f6f6ff09f9a806f204df09f9a80206f20206f20c3a94df09f9a806f4d20c3a96fc3a96f4d00000000000000000000000000000000000000" + }, + { + "name": "random-((bytes27,int144,address),bytes6[3])", + "type": "((bytes27,int144,address),bytes6[3])", + "value": [ + [ + "0xf68b6af1b8146b6e6f89af88b735855732a44863c26b7b56a39ffe", + "1945763548707736174787647123820377399685137", + "0x7877A855f7995df54967728EB15bdf865dB34a84" + ], + ["0x3abf27d40bf7", "0xf0e99e41567a", "0x81d4e1fa9357"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf68b6af1b8146b6e6f89af88b735855732a44863c26b7b56a39ffe" + }, + { + "type": "number", + "value": "1945763548707736174787647123820377399685137" + }, + { + "type": "address", + "value": "0x7877A855f7995df54967728EB15bdf865dB34a84" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3abf27d40bf7" + }, + { + "type": "hexstring", + "value": "0xf0e99e41567a" + }, + { + "type": "hexstring", + "value": "0x81d4e1fa9357" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101fa806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610152565b60405180910390f35b6100566100ff565b61005e6100ff565b604080516060810182527ff68b6af1b8146b6e6f89af88b735855732a44863c26b7b56a39ffe0000000000815271165615cc50ba20fd63030bcc0c76cc78f0116020820152737877a855f7995df54967728eb15bdf865db34a849181019190915281526100c9610134565b653abf27d40bf760d01b8152657874cf20ab3d60d11b6020808301919091526581d4e1fa935760d01b6040830152820152919050565b6040805160a08101825260009181018281526060820183905260808201929092529081526020810161012f610134565b905290565b60405180606001604052806003906020820280368337509192915050565b8151805164ffffffffff1916825260208082015160110b818401526040918201516001600160a01b0316918301919091528083015160c08301916060840160005b60038110156101ba5783516001600160d01b03191682529282019290820190600101610193565b505050509291505056fea2646970667358221220ccd8747db854bec0924273ae14ab71b8b77e961d3d78187cd296d49d16d61ede64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d157d0b1 {\n bytes27 s_0;\n int144 s_1;\n address s_2;\n }\n\n struct S_66e2cfc5 {\n S_d157d0b1 s_0;\n bytes6[3] s_1;\n }\n\n function test () public pure returns (S_66e2cfc5 memory) {\n S_66e2cfc5 memory r;\n {\n S_d157d0b1 memory r_0;\n {\n bytes27 r_0_0 = bytes27(0xf68b6af1b8146b6e6f89af88b735855732a44863c26b7b56a39ffe);\n r_0.s_0 = r_0_0;\n }\n {\n int144 r_0_1 = 1945763548707736174787647123820377399685137;\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x7877A855f7995df54967728EB15bdf865dB34a84;\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bytes6[3] memory r_1;\n {\n bytes6 r_1_0 = bytes6(0x3abf27d40bf7);\n r_1[0] = r_1_0;\n }\n {\n bytes6 r_1_1 = bytes6(0xf0e99e41567a);\n r_1[1] = r_1_1;\n }\n {\n bytes6 r_1_2 = bytes6(0x81d4e1fa9357);\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xf68b6af1b8146b6e6f89af88b735855732a44863c26b7b56a39ffe00000000000000000000000000000000000000165615cc50ba20fd63030bcc0c76cc78f0110000000000000000000000007877a855f7995df54967728eb15bdf865db34a843abf27d40bf70000000000000000000000000000000000000000000000000000f0e99e41567a000000000000000000000000000000000000000000000000000081d4e1fa93570000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes5,int48),(address,string,string))", + "type": "((bytes5,int48),(address,string,string))", + "value": [ + ["0xa83a386bf6", "-85828944472100"], + ["0xA7b147b8100dE466950561886161ed8FeFcfaCA7", "Moo é🚀oM🚀 oéo", "Moo é🚀🚀éoéMMM"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa83a386bf6" + }, + { + "type": "number", + "value": "-85828944472100" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA7b147b8100dE466950561886161ed8FeFcfaCA7" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀 oéo" + }, + { + "type": "string", + "value": "Moo é🚀🚀éoéMMM" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061025d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b60408051608080820183526000828401818152606080850183905290845284518082018652828152602080820183905281870183905294850152845192830185528285018281528382018390528352845180820186529182528184018190528185018190528284019182528451808601865264541d1c35fb60d91b8152654e0f9bbf2823198186015283528451808201865280850182815281870192835273a7b147b8100de466950561886161ed8fefcfaca782528651808801885260158152744d6f6f20c3a9f09f9a806f4df09f9a80206fc3a96f60581b818801529052855180870190965260168652754d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a94d4d4d60501b9486019490945293909352915260405161014f91906101a5565b60405180910390f35b6000815180845260005b8181101561017e57602081850181015186830182015201610162565b81811115610190576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825180516001600160d81b0319168383015281015160050b604083015282810151606080840181905281516001600160a01b031660808501529181015160a08401929092526000916101ff60e0850182610158565b905060408201519150607f198482030160c085015261021e8183610158565b9594505050505056fea2646970667358221220c8e78b101f32598112db6390fe0c5794526272519ed99f4308aa2383b5a8b85c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2193087f {\n bytes5 s_0;\n int48 s_1;\n }\n\n struct S_23fa3048 {\n address s_0;\n string s_1;\n string s_2;\n }\n\n struct S_f5018d24 {\n S_2193087f s_0;\n S_23fa3048 s_1;\n }\n\n function test () public pure returns (S_f5018d24 memory) {\n S_f5018d24 memory r;\n {\n S_2193087f memory r_0;\n {\n bytes5 r_0_0 = bytes5(0xa83a386bf6);\n r_0.s_0 = r_0_0;\n }\n {\n int48 r_0_1 = -85828944472100;\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_23fa3048 memory r_1;\n {\n address r_1_0 = 0xA7b147b8100dE466950561886161ed8FeFcfaCA7;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oM🚀 oéo\";\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀🚀éoéMMM\";\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020a83a386bf6000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffb1f06440d7dc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a7b147b8100de466950561886161ed8fefcfaca7000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a806f4df09f9a80206fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a94d4d4d00000000000000000000" + }, + { + "name": "random-((string,bool,uint),string,int24)", + "type": "((string,bool,uint),string,int24)", + "value": [ + [ + "Moo é🚀ééoé🚀oM🚀🚀M🚀éoéooooo Mo o Mo🚀Mo🚀M🚀🚀MéoM o🚀é é ", + false, + "19269444228524706621421412646797229491107099261458939473323542595229312890144" + ], + "Moo é🚀o o o🚀🚀Mééé🚀M🚀oMMo Mé🚀🚀oM éo oM oéoMoo🚀Mo oooMé🚀 éM ", + "-3562045" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééoé🚀oM🚀🚀M🚀éoéooooo Mo o Mo🚀Mo🚀M🚀🚀MéoM o🚀é é " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "19269444228524706621421412646797229491107099261458939473323542595229312890144" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o o o🚀🚀Mééé🚀M🚀oMMo Mé🚀🚀oM éo oM oéoMoo🚀Mo oooMé🚀 éM " + }, + { + "type": "number", + "value": "-3562045" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061031c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101b8565b60405180910390f35b6100886040805160c08101909152606080820190815260006080830181905260a08301528190815260606020820152600060409091015290565b6100c26040805160c08101909152606080820190815260006080830181905260a08301528190815260606020820152600060409091015290565b6100e8604051806060016040528060608152602001600015158152602001600081525090565b60006040518060800160405280605a815260200161022d605a9139825250600060208083018290527f2a9a1e728718b50ebd05dc549a47b95157c3a11e83bf523c478f9b36dfd035206040808501919091529284528251608081019093526060808452919291906102879083013960208301525062365a3c196040820152919050565b6000815180845260005b8181101561019157602081850181015186830182015201610175565b818111156101a3576000602083870101525b50601f01601f19169290920160200192915050565b6020815260008251606060208401528051606060808501526101dd60e085018261016b565b90506020820151151560a0850152604082015160c085015260208501519150601f19848203016040850152610212818361016b565b915050604084015160020b6060840152809150509291505056fe4d6f6f20c3a9f09f9a80c3a9c3a96fc3a9f09f9a806f4df09f9a80f09f9a804df09f9a80c3a96fc3a96f6f6f6f6f204d6f206f204d6ff09f9a804d6ff09f9a804df09f9a80f09f9a804dc3a96f4d206ff09f9a80c3a920c3a9204d6f6f20c3a9f09f9a806f206f206ff09f9a80f09f9a804dc3a9c3a9c3a9f09f9a804df09f9a806f4d4d6f204dc3a9f09f9a80f09f9a806f4d202020c3a96f206f4d206fc3a96f4d6f6ff09f9a804d6f206f6f6f4dc3a9f09f9a8020c3a94d20a26469706673582212200e527da2ffababfcc6addd24911dddfaa104a98aa20c33617dd7ff30b6fa671e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1678058e {\n string s_0;\n bool s_1;\n uint256 s_2;\n }\n\n struct S_b0b571e8 {\n S_1678058e s_0;\n string s_1;\n int24 s_2;\n }\n\n function test () public pure returns (S_b0b571e8 memory) {\n S_b0b571e8 memory r;\n {\n S_1678058e memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀ééoé🚀oM🚀🚀M🚀éoéooooo Mo o Mo🚀Mo🚀M🚀🚀MéoM o🚀é é \";\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n uint r_0_2 = 19269444228524706621421412646797229491107099261458939473323542595229312890144;\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀o o o🚀🚀Mééé🚀M🚀oMMo Mé🚀🚀oM éo oM oéoMoo🚀Mo oooMé🚀 éM \";\n r.s_1 = r_1;\n }\n {\n int24 r_2 = -3562045;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a5c3000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000002a9a1e728718b50ebd05dc549a47b95157c3a11e83bf523c478f9b36dfd03520000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a80c3a9c3a96fc3a9f09f9a806f4df09f9a80f09f9a804df09f9a80c3a96fc3a96f6f6f6f6f204d6f206f204d6ff09f9a804d6ff09f9a804df09f9a80f09f9a804dc3a96f4d206ff09f9a80c3a920c3a92000000000000000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a806f206f206ff09f9a80f09f9a804dc3a9c3a9c3a9f09f9a804df09f9a806f4d4d6f204dc3a9f09f9a80f09f9a806f4d202020c3a96f206f4d206fc3a96f4d6f6ff09f9a804d6f206f6f6f4dc3a9f09f9a8020c3a94d20" + }, + { + "name": "random-((string),((bytes26),address),string[])", + "type": "((string),((bytes26),address),string[])", + "value": [ + ["Moo é🚀éooo🚀🚀🚀 🚀oM🚀🚀oo🚀éoéM Mo🚀o🚀éo🚀éo MéMM o🚀o oéMo🚀éoM"], + [ + ["0x22fdfff55c37d7c1368f741a6cf21c0c3e162859c80c62ea50a0"], + "0x9b420c708F63aF89F49dA4E4E0f52290e2dd0892" + ], + [ + "Moo é🚀oM éMo🚀 🚀🚀o🚀Mo🚀é🚀o🚀oooMoMo oooé🚀éo", + "Moo é🚀🚀oooM o🚀🚀🚀oéoo🚀o🚀o oéooMMo ééM 🚀é M🚀oé o🚀o éé 🚀 o🚀oMMMM", + "Moo é🚀é🚀M🚀ooMé🚀ooM o", + "Moo é🚀éo🚀 o é🚀oo oooo o ooM" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooo🚀🚀🚀 🚀oM🚀🚀oo🚀éoéM Mo🚀o🚀éo🚀éo MéMM o🚀o oéMo🚀éoM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x22fdfff55c37d7c1368f741a6cf21c0c3e162859c80c62ea50a0" + } + ] + }, + { + "type": "address", + "value": "0x9b420c708F63aF89F49dA4E4E0f52290e2dd0892" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM éMo🚀 🚀🚀o🚀Mo🚀é🚀o🚀oooMoMo oooé🚀éo" + }, + { + "type": "string", + "value": "Moo é🚀🚀oooM o🚀🚀🚀oéoo🚀o🚀o oéooMMo ééM 🚀é M🚀oé o🚀o éé 🚀 o🚀oMMMM" + }, + { + "type": "string", + "value": "Moo é🚀é🚀M🚀ooMé🚀ooM o" + }, + { + "type": "string", + "value": "Moo é🚀éo🚀 o é🚀oo oooo o ooM" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061051c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102b2565b60405180910390f35b61005661021d565b61005e61021d565b60408051602081019091526060815260006040518060a001604052806068815260200161047f60689139825250815260408051606081018252600081830181815282526020808301828152845180830186527f22fdfff55c37d7c1368f741a6cf21c0c3e162859c80c62ea50a000000000000081528452739b420c708f63af89f49da4e4e0f52290e2dd08929052808501929092528251600480825260a082019094529092909182015b6060815260200190600190039081610108579050509050600060405180608001604052806048815260200161038160489139905080826000815181106101505761015061036a565b60200260200101819052505060006040518060a00160405280606b8152602001610414606b91399050808260018151811061018d5761018d61036a565b60200260200101819052505060006040518060600160405280602481526020016103c960249139905080826002815181106101ca576101ca61036a565b60200260200101819052505060006040518060600160405280602781526020016103ed60279139905080826003815181106102075761020761036a565b6020908102919091010152506040820152919050565b604080516080810190915260608082019081528152602081016102586040805160608101825260009181018281528152602081019190915290565b8152602001606081525090565b6000815180845260005b8181101561028b5760208185018101518683018201520161026f565b8181111561029d576000602083870101525b50601f01601f19169290920160200192915050565b600060208083528351608082850152805190508160a08501526102d860c0850182610265565b8583015180515165ffffffffffff1916604087810191909152908401516001600160a01b03166060870152860151858203601f19908101608088015281518084529293509084019184840190600581901b8501860160005b8281101561035c578487830301845261034a828751610265565b95880195938801939150600101610330565b509998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d20c3a94d6ff09f9a8020f09f9a80f09f9a806ff09f9a804d6ff09f9a80c3a9f09f9a806ff09f9a806f6f6f4d6f4d6f206f6f6fc3a9f09f9a80c3a96f4d6f6f20c3a9f09f9a80c3a9f09f9a804df09f9a806f6f4dc3a9f09f9a806f6f4d20206f4d6f6f20c3a9f09f9a80c3a96ff09f9a80206f20c3a9f09f9a806f6f206f6f6f6f206f206f6f4d4d6f6f20c3a9f09f9a80f09f9a806f6f6f4d206ff09f9a80f09f9a80f09f9a806fc3a96f6ff09f9a806ff09f9a806f206fc3a96f6f4d4d6f20c3a9c3a94d20f09f9a80c3a920204df09f9a806fc3a9206ff09f9a806f20c3a9c3a920f09f9a80206ff09f9a806f4d4d4d4d4d6f6f20c3a9f09f9a80c3a96f6f6ff09f9a80f09f9a80f09f9a8020f09f9a806f4df09f9a80f09f9a806f6ff09f9a80c3a96fc3a94d204d6ff09f9a806ff09f9a80c3a96ff09f9a80c3a96f204dc3a94d4d20206ff09f9a806f206fc3a94d6ff09f9a80c3a96f4da2646970667358221220b1c10580c01c347dad94361768b86127b893a180f301521dab7fed7a6124acbe64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_da4d5856 {\n bytes26 s_0;\n }\n\n struct S_664f6fdc {\n S_da4d5856 s_0;\n address s_1;\n }\n\n struct S_7c0ce60f {\n S_97fc4627 s_0;\n S_664f6fdc s_1;\n string[] s_2;\n }\n\n function test () public pure returns (S_7c0ce60f memory) {\n S_7c0ce60f memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀éooo🚀🚀🚀 🚀oM🚀🚀oo🚀éoéM Mo🚀o🚀éo🚀éo MéMM o🚀o oéMo🚀éoM\";\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n S_664f6fdc memory r_1;\n {\n S_da4d5856 memory r_1_0;\n {\n bytes26 r_1_0_0 = bytes26(0x22fdfff55c37d7c1368f741a6cf21c0c3e162859c80c62ea50a0);\n r_1_0.s_0 = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x9b420c708F63aF89F49dA4E4E0f52290e2dd0892;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n string[] memory r_2 = new string[](4);\n {\n string memory r_2_0 = unicode\"Moo é🚀oM éMo🚀 🚀🚀o🚀Mo🚀é🚀o🚀oooMoMo oooé🚀éo\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀🚀oooM o🚀🚀🚀oéoo🚀o🚀o oéooMMo ééM 🚀é M🚀oé o🚀o éé 🚀 o🚀oMMMM\";\n r_2[1] = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀é🚀M🚀ooMé🚀ooM o\";\n r_2[2] = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀éo🚀 o é🚀oo oooo o ooM\";\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008022fdfff55c37d7c1368f741a6cf21c0c3e162859c80c62ea50a00000000000000000000000000000000000009b420c708f63af89f49da4e4e0f52290e2dd08920000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a80c3a96f6f6ff09f9a80f09f9a80f09f9a8020f09f9a806f4df09f9a80f09f9a806f6ff09f9a80c3a96fc3a94d204d6ff09f9a806ff09f9a80c3a96ff09f9a80c3a96f204dc3a94d4d20206ff09f9a806f206fc3a94d6ff09f9a80c3a96f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a806f4d20c3a94d6ff09f9a8020f09f9a80f09f9a806ff09f9a804d6ff09f9a80c3a9f09f9a806ff09f9a806f6f6f4d6f4d6f206f6f6fc3a9f09f9a80c3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b4d6f6f20c3a9f09f9a80f09f9a806f6f6f4d206ff09f9a80f09f9a80f09f9a806fc3a96f6ff09f9a806ff09f9a806f206fc3a96f6f4d4d6f20c3a9c3a94d20f09f9a80c3a920204df09f9a806fc3a9206ff09f9a806f20c3a9c3a920f09f9a80206ff09f9a806f4d4d4d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a80c3a9f09f9a804df09f9a806f6f4dc3a9f09f9a806f6f4d20206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a80c3a96ff09f9a80206f20c3a9f09f9a806f6f206f6f6f6f206f206f6f4d00000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((string),bool,address,bytes6,bytes31)", + "type": "((string),bool,address,bytes6,bytes31)", + "value": [ + ["Moo é🚀oo 🚀"], + false, + "0xA9B6C55EAf8835472FF0Ea4117BADabBEE3C672c", + "0x126fbd8ec381", + "0x49ba65e5e31fb5a8365077f63812ab658c0cb16eb2024a8b9d194217a77b4f" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo 🚀" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xA9B6C55EAf8835472FF0Ea4117BADabBEE3C672c" + }, + { + "type": "hexstring", + "value": "0x126fbd8ec381" + }, + { + "type": "hexstring", + "value": "0x49ba65e5e31fb5a8365077f63812ab658c0cb16eb2024a8b9d194217a77b4f" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061020e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160c08082018352606060a0808401828152845260006020808601829052858701829052838601829052608095860182905286519485018752918401838152845283820181815284870182815285850183815296860183815288518086018a529586528851808a018a52601181526f9adede418753e13f3500dede41e13f35607f1b958101959095529385529385525273a9b6c55eaf8835472ff0ea4117badabbee3c672c90915265126fbd8ec38160d01b9092527f49ba65e5e31fb5a8365077f63812ab658c0cb16eb2024a8b9d194217a77b4f0090915290516101189190610121565b60405180910390f35b60006020808352835160a082850152805190508160c085015280518060e086015260005b818110156101625782810184015186820161010001528301610145565b8181111561017557600061010083880101525b509185015180151560408601529160408601516001600160a01b0381166060870152925060608601516001600160d01b0319811660808701529250608086015160ff19811660a08701529250601f01601f1916939093016101000194935050505056fea264697066735822122099df388cdcfe01a8a911a4e352664d04f8e2e06340b7b1946a534b2f2c17890f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_0f10658f {\n S_97fc4627 s_0;\n bool s_1;\n address s_2;\n bytes6 s_3;\n bytes31 s_4;\n }\n\n function test () public pure returns (S_0f10658f memory) {\n S_0f10658f memory r;\n {\n S_97fc4627 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀oo 🚀\";\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xA9B6C55EAf8835472FF0Ea4117BADabBEE3C672c;\n r.s_2 = r_2;\n }\n {\n bytes6 r_3 = bytes6(0x126fbd8ec381);\n r.s_3 = r_3;\n }\n {\n bytes31 r_4 = bytes31(0x49ba65e5e31fb5a8365077f63812ab658c0cb16eb2024a8b9d194217a77b4f);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9b6c55eaf8835472ff0ea4117badabbee3c672c126fbd8ec381000000000000000000000000000000000000000000000000000049ba65e5e31fb5a8365077f63812ab658c0cb16eb2024a8b9d194217a77b4f00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a806f6f20f09f9a80000000000000000000000000000000" + }, + { + "name": "random-((uint56,string,address,bool),bool)", + "type": "((uint56,string,address,bool),bool)", + "value": [ + [ + "36772389621677102", + "Moo é🚀oo oo M oMéMéM🚀M🚀🚀oéoé", + "0xca1D9620BBF873aDceDE14f13FCCf2987aDcCdf9", + true + ], + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "36772389621677102" + }, + { + "type": "string", + "value": "Moo é🚀oo oo M oMéMéM🚀M🚀🚀oéoé" + }, + { + "type": "address", + "value": "0xca1D9620BBF873aDceDE14f13FCCf2987aDcCdf9" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610232806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012b565b60405180910390f35b6040805160c08101825260009181018281526060808301526080820183905260a08201839052815260208101919091526040805160c08101825260009181018281526060808301526080820183905260a0820183905281526020810191909152604080516080810182526060602080830182905260008385018190528284018190526682a44b24f13c2e84528451928301909452602d808352929392906101d09083013960208084019190915273ca1d9620bbf873adcede14f13fccf2987adccdf960408401526001606084015291835250600090820152919050565b60006020808352835160408285015266ffffffffffffff81511660608501528181015160808086015280518060e087015260005b8181101561017c578281018501518782016101000152840161015f565b8181111561018f57600061010083890101525b506040838101516001600160a01b031660a0880152606090930151151560c087015295909201511515908401525050610100601f909201601f191601019056fe4d6f6f20c3a9f09f9a806f6f206f6f204d206f4dc3a94dc3a94df09f9a804df09f9a80f09f9a806fc3a96fc3a9a2646970667358221220f8f5e077574610b9705d1201e5823df24142b03abc1871985a378249c601a12d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9fc2c4c0 {\n uint56 s_0;\n string s_1;\n address s_2;\n bool s_3;\n }\n\n struct S_d37ec537 {\n S_9fc2c4c0 s_0;\n bool s_1;\n }\n\n function test () public pure returns (S_d37ec537 memory) {\n S_d37ec537 memory r;\n {\n S_9fc2c4c0 memory r_0;\n {\n uint56 r_0_0 = 36772389621677102;\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀oo oo M oMéMéM🚀M🚀🚀oéoé\";\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0xca1D9620BBF873aDceDE14f13FCCf2987aDcCdf9;\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082a44b24f13c2e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000ca1d9620bbf873adcede14f13fccf2987adccdf90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806f6f206f6f204d206f4dc3a94dc3a94df09f9a804df09f9a80f09f9a806fc3a96fc3a900000000000000000000000000000000000000" + }, + { + "name": "random-(address,(bytes32,bytes17),bytes18,address)", + "type": "(address,(bytes32,bytes17),bytes18,address)", + "value": [ + "0x4aC2d0e11a359F65fC76527B5b57ea3587573F73", + [ + "0x8d18c4b2c5f5329e8dd6f6831d1c704a984cbf339843587c9bb2e24115d62964", + "0xf0c651b7db4ed1b79b285cce5fee5e8b25" + ], + "0x1e239d93e28c11e162a3b524a6a84f48103d", + "0xaF5a54BCf61404D7Da7432520E270020f00CF36D" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4aC2d0e11a359F65fC76527B5b57ea3587573F73" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8d18c4b2c5f5329e8dd6f6831d1c704a984cbf339843587c9bb2e24115d62964" + }, + { + "type": "hexstring", + "value": "0xf0c651b7db4ed1b79b285cce5fee5e8b25" + } + ] + }, + { + "type": "hexstring", + "value": "0x1e239d93e28c11e162a3b524a6a84f48103d" + }, + { + "type": "address", + "value": "0xaF5a54BCf61404D7Da7432520E270020f00CF36D" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101b48061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b604080516080808201835260008083528351808501855281815260208082018390528085019190915283850182905260609384018290528451808401865282815285518087018752838152808301849052818301908152818701848152828701948552734ac2d0e11a359f65fc76527b5b57ea3587573f738352875180890189527f8d18c4b2c5f5329e8dd6f6831d1c704a984cbf339843587c9bb2e24115d62964815270f0c651b7db4ed1b79b285cce5fee5e8b2560781b818601528252711e239d93e28c11e162a3b524a6a84f48103d60701b815273af5a54bcf61404d7da7432520e270020f00cf36d8552875192516001600160a01b0390811684529151805184860152909301516effffffffffffffffffffffffffffff19168288015291516dffffffffffffffffffffffffffff1916948101949094529051169082015290519081900360a00190f3fea2646970667358221220f1b986ca03849ed0cff88bc7c26981ac8d7b15cf5bc8eb4edbf932e99be087d564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e8187cd6 {\n bytes32 s_0;\n bytes17 s_1;\n }\n\n struct S_1547bb5e {\n address s_0;\n S_e8187cd6 s_1;\n bytes18 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_1547bb5e memory) {\n S_1547bb5e memory r;\n {\n address r_0 = 0x4aC2d0e11a359F65fC76527B5b57ea3587573F73;\n r.s_0 = r_0;\n }\n {\n S_e8187cd6 memory r_1;\n {\n bytes32 r_1_0 = bytes32(0x8d18c4b2c5f5329e8dd6f6831d1c704a984cbf339843587c9bb2e24115d62964);\n r_1.s_0 = r_1_0;\n }\n {\n bytes17 r_1_1 = bytes17(0xf0c651b7db4ed1b79b285cce5fee5e8b25);\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n bytes18 r_2 = bytes18(0x1e239d93e28c11e162a3b524a6a84f48103d);\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xaF5a54BCf61404D7Da7432520E270020f00CF36D;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000004ac2d0e11a359f65fc76527b5b57ea3587573f738d18c4b2c5f5329e8dd6f6831d1c704a984cbf339843587c9bb2e24115d62964f0c651b7db4ed1b79b285cce5fee5e8b250000000000000000000000000000001e239d93e28c11e162a3b524a6a84f48103d0000000000000000000000000000000000000000000000000000af5a54bcf61404d7da7432520e270020f00cf36d" + }, + { + "name": "random-(address,(string,bool,bytes28),address)", + "type": "(address,(string,bool,bytes28),address)", + "value": [ + "0xF183C15d17b89eF02462E73a587cBB20AbffFF3B", + ["Moo é🚀oM é", false, "0x33f72a6e8cb48cf6c90c10e38142c4f192fbb368907dcc990b93554c"], + "0x57ACA9FaD3793cCD1053dD65017936445986A491" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF183C15d17b89eF02462E73a587cBB20AbffFF3B" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM é" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x33f72a6e8cb48cf6c90c10e38142c4f192fbb368907dcc990b93554c" + } + ] + }, + { + "type": "address", + "value": "0x57ACA9FaD3793cCD1053dD65017936445986A491" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610242806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610164565b60405180910390f35b610089604080516060808201835260008083528351808301855291825260208281018290529382015290918201908152600060209091015290565b6100c4604080516060808201835260008083528351808301855291825260208281018290529382015290918201908152600060209091015290565b73f183c15d17b89ef02462e73a587cbb20abffff3b8152604080516060808201835281526000602080830182815283850183815285518087018752600f81526e4d6f6f20c3a9f09f9a806f4d20c3a960881b8185015285529290527f33f72a6e8cb48cf6c90c10e38142c4f192fbb368907dcc990b93554c000000009091528301527357aca9fad3793ccd1053dd65017936445986a49190820152919050565b6000602080835260018060a01b0384511681840152808401516060604085015280516060608086015280518060e087015260005b818110156101b55782810185015187820161010001528401610198565b818111156101c857600061010083890101525b5092820151151560a08601525060409081015163ffffffff191660c085015293909301516001600160a01b0316606083015250610100601f909201601f191601019056fea2646970667358221220fd7eb7b08724545b41d72013bfd7823da7a6583115a5d66b1606bf9fe471d28c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bc210580 {\n string s_0;\n bool s_1;\n bytes28 s_2;\n }\n\n struct S_8fb2d1d1 {\n address s_0;\n S_bc210580 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_8fb2d1d1 memory) {\n S_8fb2d1d1 memory r;\n {\n address r_0 = 0xF183C15d17b89eF02462E73a587cBB20AbffFF3B;\n r.s_0 = r_0;\n }\n {\n S_bc210580 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀oM é\";\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n {\n bytes28 r_1_2 = bytes28(0x33f72a6e8cb48cf6c90c10e38142c4f192fbb368907dcc990b93554c);\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x57ACA9FaD3793cCD1053dD65017936445986A491;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f183c15d17b89ef02462e73a587cbb20abffff3b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000057aca9fad3793ccd1053dd65017936445986a4910000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000033f72a6e8cb48cf6c90c10e38142c4f192fbb368907dcc990b93554c00000000000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806f4d20c3a90000000000000000000000000000000000" + }, + { + "name": "random-(address,address,address,int40,uint)", + "type": "(address,address,address,int40,uint)", + "value": [ + "0x685E81B6e56f7fcA8C8Cb81398E96bC58DF917c0", + "0x08ee1D70Da9cbbb0a69249503C3Cf25cC20c3cCf", + "0x98857FFF3613B4F38826b7932d8CbA5afeFdc028", + "428693571068", + "110783680411565232822093917905364456864025309747620875461499404612573358527420" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x685E81B6e56f7fcA8C8Cb81398E96bC58DF917c0" + }, + { + "type": "address", + "value": "0x08ee1D70Da9cbbb0a69249503C3Cf25cC20c3cCf" + }, + { + "type": "address", + "value": "0x98857FFF3613B4F38826b7932d8CbA5afeFdc028" + }, + { + "type": "number", + "value": "428693571068" + }, + { + "type": "number", + "value": "110783680411565232822093917905364456864025309747620875461499404612573358527420" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061015f8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a080820183526000808352602080840182905283850182905260608085018390526080948501929092528451808401865273685e81b6e56f7fca8c8cb81398e96bc58df917c08082527308ee1d70da9cbbb0a69249503c3cf25cc20c3ccf8284019081527398857fff3613b4f38826b7932d8cba5afefdc0288389019081526463d020c5fc8487019081527ff4ed574fc89ed5e6960b61a84802bb56d5c3c3a92f2754805c02c060fbbd13bc948901948552895193845291516001600160a01b03908116958401959095525190931681880152915160040b9282019290925290519281019290925291519081900390910190f3fea2646970667358221220fe65c6fac13edb1989599ee8ec77cc95acad74b815398a63827a48defd5528ac64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4207f710 {\n address s_0;\n address s_1;\n address s_2;\n int40 s_3;\n uint256 s_4;\n }\n\n function test () public pure returns (S_4207f710 memory) {\n S_4207f710 memory r;\n {\n address r_0 = 0x685E81B6e56f7fcA8C8Cb81398E96bC58DF917c0;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x08ee1D70Da9cbbb0a69249503C3Cf25cC20c3cCf;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x98857FFF3613B4F38826b7932d8CbA5afeFdc028;\n r.s_2 = r_2;\n }\n {\n int40 r_3 = 428693571068;\n r.s_3 = r_3;\n }\n {\n uint r_4 = 110783680411565232822093917905364456864025309747620875461499404612573358527420;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000685e81b6e56f7fca8c8cb81398e96bc58df917c000000000000000000000000008ee1d70da9cbbb0a69249503c3cf25cc20c3ccf00000000000000000000000098857fff3613b4f38826b7932d8cba5afefdc02800000000000000000000000000000000000000000000000000000063d020c5fcf4ed574fc89ed5e6960b61a84802bb56d5c3c3a92f2754805c02c060fbbd13bc" + }, + { + "name": "random-(address,address,bool,address,bool)", + "type": "(address,address,bool,address,bool)", + "value": [ + "0xa48E0653d823eAc047e9B02b30aba5CDBdbF95E7", + "0xd545769773C849AB606c6B2644AeFAa0889DFA46", + false, + "0x1Aa34c925CAc87B9Daf1F133Ca74a7031682dA29", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa48E0653d823eAc047e9B02b30aba5CDBdbF95E7" + }, + { + "type": "address", + "value": "0xd545769773C849AB606c6B2644AeFAa0889DFA46" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x1Aa34c925CAc87B9Daf1F133Ca74a7031682dA29" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101388061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a0808201835260008083526020808401829052838501829052606080850183905260809485018390528551808501875280870193845273a48e0653d823eac047e9b02b30aba5cdbdbf95e780825273d545769773c849ab606c6b2644aefaa0889dfa46828501908152731aa34c925cac87b9daf1f133ca74a7031682da298385019081526001938901938452895192835290516001600160a01b03908116958301959095529451151597810197909752925190911690850152511515918301919091520160405180910390f3fea264697066735822122077e0a50d0d0d1767ecd7e0ef38b3e89f034dfd24ec3e0cb881f55029201afcc164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5e39c92c {\n address s_0;\n address s_1;\n bool s_2;\n address s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_5e39c92c memory) {\n S_5e39c92c memory r;\n {\n address r_0 = 0xa48E0653d823eAc047e9B02b30aba5CDBdbF95E7;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xd545769773C849AB606c6B2644AeFAa0889DFA46;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x1Aa34c925CAc87B9Daf1F133Ca74a7031682dA29;\n r.s_3 = r_3;\n }\n {\n bool r_4 = true;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000a48e0653d823eac047e9b02b30aba5cdbdbf95e7000000000000000000000000d545769773c849ab606c6b2644aefaa0889dfa4600000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aa34c925cac87b9daf1f133ca74a7031682da290000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(address,address,bytes13,bytes7,string)", + "type": "(address,address,bytes13,bytes7,string)", + "value": [ + "0x40FfcE9Acee5a2a2E59a3f7C6cB8B4FA22767FA0", + "0xa2766A84edF30e2504419bb75b1671Dd6E3AfB1C", + "0x3b01bf1573c9346431647bc10e", + "0xab7a21b8c05030", + "Moo é🚀 🚀éoéé🚀o🚀é🚀éo🚀🚀ooéé oéé" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x40FfcE9Acee5a2a2E59a3f7C6cB8B4FA22767FA0" + }, + { + "type": "address", + "value": "0xa2766A84edF30e2504419bb75b1671Dd6E3AfB1C" + }, + { + "type": "hexstring", + "value": "0x3b01bf1573c9346431647bc10e" + }, + { + "type": "hexstring", + "value": "0xab7a21b8c05030" + }, + { + "type": "string", + "value": "Moo é🚀 🚀éoéé🚀o🚀é🚀éo🚀🚀ooéé oéé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610224806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610103565b60405180910390f35b6040805160a0808201835260008083526020808401829052838501829052606080850183905260808086018290528651948501875284018190527340ffce9acee5a2a2e59a3f7c6cb8b4fa22767fa0845273a2766a84edf30e2504419bb75b1671dd6e3afb1c848301526c1d80df8ab9e49a3218b23de08760991b84870152660ab7a21b8c050360cc1b848201528551908101909552603c80865293949293919291906101b390830139608083015250919050565b6000602080835260018060a01b0380855116828501528082860151166040850152506cffffffffffffffffffffffffff60981b604085015116606084015266ffffffffffffff60c81b6060850151166080840152608084015160a08085015280518060c086015260005b818110156101895782810184015186820160e00152830161016d565b8181111561019b57600060e083880101525b50601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a8020f09f9a80c3a96fc3a9c3a9f09f9a806ff09f9a80c3a9f09f9a80c3a96ff09f9a80f09f9a806f6fc3a9c3a9206fc3a9c3a9a26469706673582212200688e393c0f21e1ac0071147a7e94901029e7e1f6dff1cacba0e54d1035b0bab64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6559cb5f {\n address s_0;\n address s_1;\n bytes13 s_2;\n bytes7 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_6559cb5f memory) {\n S_6559cb5f memory r;\n {\n address r_0 = 0x40FfcE9Acee5a2a2E59a3f7C6cB8B4FA22767FA0;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xa2766A84edF30e2504419bb75b1671Dd6E3AfB1C;\n r.s_1 = r_1;\n }\n {\n bytes13 r_2 = bytes13(0x3b01bf1573c9346431647bc10e);\n r.s_2 = r_2;\n }\n {\n bytes7 r_3 = bytes7(0xab7a21b8c05030);\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀 🚀éoéé🚀o🚀é🚀éo🚀🚀ooéé oéé\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000040ffce9acee5a2a2e59a3f7c6cb8b4fa22767fa0000000000000000000000000a2766a84edf30e2504419bb75b1671dd6e3afb1c3b01bf1573c9346431647bc10e00000000000000000000000000000000000000ab7a21b8c050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a8020f09f9a80c3a96fc3a9c3a9f09f9a806ff09f9a80c3a9f09f9a80c3a96ff09f9a80f09f9a806f6fc3a9c3a9206fc3a9c3a900000000" + }, + { + "name": "random-(address,bytes13,bool,bytes20,(string))", + "type": "(address,bytes13,bool,bytes20,(string))", + "value": [ + "0x61B8eaCa035C5A6725f48aBf054a7f47398386F9", + "0x7417329d9cb9d6d0eb5577bcb8", + false, + "0x26c66ab81b5a664a0643b020b01513371c863121", + ["Moo é🚀oéM"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x61B8eaCa035C5A6725f48aBf054a7f47398386F9" + }, + { + "type": "hexstring", + "value": "0x7417329d9cb9d6d0eb5577bcb8" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x26c66ab81b5a664a0643b020b01513371c863121" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéM" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610251806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061015e565b60405180910390f35b61008a6040805160a081018252600080825260208083018290528284018290526060808401929092528351908101909352825290608082015290565b6100c66040805160a081018252600080825260208083018290528284018290526060808401929092528351908101909352825290608082015290565b7361b8eaca035c5a6725f48abf054a7f47398386f981526c0e82e653b3973ada1d6aaef797609b1b60208083019190915260006040808401919091527326c66ab81b5a664a0643b020b01513371c86312160601b6060808501919091528151928301909152815260408051808201909152600e81526d4d6f6f20c3a9f09f9a806fc3a94d60901b602082015281526080820152919050565b6000602080835260018060a01b03845116818401526cffffffffffffffffffffffffff60981b818501511660408401526040840151151560608401526bffffffffffffffffffffffff196060850151166080840152608084015160a080850152805190508160c085015280518060e086015260005b818110156101f057828101840151868201610100015283016101d3565b8181111561020357600061010083880101525b50601f01601f1916939093016101000194935050505056fea26469706673582212207d67331c16e8b802dfe044e63138f67aca56de514d7f5ad762740596e551c3e764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_c77c8e2d {\n address s_0;\n bytes13 s_1;\n bool s_2;\n bytes20 s_3;\n S_97fc4627 s_4;\n }\n\n function test () public pure returns (S_c77c8e2d memory) {\n S_c77c8e2d memory r;\n {\n address r_0 = 0x61B8eaCa035C5A6725f48aBf054a7f47398386F9;\n r.s_0 = r_0;\n }\n {\n bytes13 r_1 = bytes13(0x7417329d9cb9d6d0eb5577bcb8);\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bytes20 r_3 = bytes20(0x26c66ab81b5A664A0643B020B01513371c863121);\n r.s_3 = r_3;\n }\n {\n S_97fc4627 memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀oéM\";\n r_4.s_0 = r_4_0;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000061b8eaca035c5a6725f48abf054a7f47398386f97417329d9cb9d6d0eb5577bcb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026c66ab81b5a664a0643b020b01513371c86312100000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a806fc3a94d000000000000000000000000000000000000" + }, + { + "name": "random-(address,bytes20,bool,bytes30,bool)", + "type": "(address,bytes20,bool,bytes30,bool)", + "value": [ + "0x5f6C0F689D7047da5c9b0626C43eB64eE6Fe2F6F", + "0xebf0bb85ff3b3e5c74adbaf37809d0e7a4027a9e", + true, + "0x202601e5b5d7da38afdf683752ccd1114ee278dd6ba5ff62d2413498ad1a", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5f6C0F689D7047da5c9b0626C43eB64eE6Fe2F6F" + }, + { + "type": "hexstring", + "value": "0xebf0bb85ff3b3e5c74adbaf37809d0e7a4027a9e" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x202601e5b5d7da38afdf683752ccd1114ee278dd6ba5ff62d2413498ad1a" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061014c8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a08082018352600080835260208084018290528385018290526060808501839052608094850183905285518085018752808601938452735f6c0f689d7047da5c9b0626c43eb64ee6fe2f6f8082527375f85dc2ff9d9f2e3a56dd79bc04e873d2013d4f60611b8285019081526001838a019081527f202601e5b5d7da38afdf683752ccd1114ee278dd6ba5ff62d2413498ad1a0000938501938452895192835290516bffffffffffffffffffffffff19169482019490945292511515838801525161ffff191690820152905115159281019290925291519081900390910190f3fea2646970667358221220cbbaf13639df23c2ae9951650ec28648b4838a7cda837b9014d4bb59e3d672e364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_889288ce {\n address s_0;\n bytes20 s_1;\n bool s_2;\n bytes30 s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_889288ce memory) {\n S_889288ce memory r;\n {\n address r_0 = 0x5f6C0F689D7047da5c9b0626C43eB64eE6Fe2F6F;\n r.s_0 = r_0;\n }\n {\n bytes20 r_1 = bytes20(0xEbF0bB85fF3B3e5C74aDbAF37809d0e7A4027a9e);\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n bytes30 r_3 = bytes30(0x202601e5b5d7da38afdf683752ccd1114ee278dd6ba5ff62d2413498ad1a);\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000005f6c0f689d7047da5c9b0626c43eb64ee6fe2f6febf0bb85ff3b3e5c74adbaf37809d0e7a4027a9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000001202601e5b5d7da38afdf683752ccd1114ee278dd6ba5ff62d2413498ad1a00000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bytes27,bytes19[3],string)", + "type": "(address,bytes27,bytes19[3],string)", + "value": [ + "0x4Ea3B93aBb480636A32D10854876bb0b3433729F", + "0x27de6f34643300365d7df882afab25568b962d6abea4630c23e499", + [ + "0x782414c0857556293c346eaae21fd8637f7ee4", + "0xf72cebce2bb820054164002363b5763f52133d", + "0x5be7724b68540da165eca677aff36ecf387048" + ], + "Moo é🚀🚀éMéo🚀 🚀 éM🚀MéoMMoooM🚀🚀Moéoo🚀o🚀🚀o🚀oé🚀ééMoéo oMéo🚀oM" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4Ea3B93aBb480636A32D10854876bb0b3433729F" + }, + { + "type": "hexstring", + "value": "0x27de6f34643300365d7df882afab25568b962d6abea4630c23e499" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x782414c0857556293c346eaae21fd8637f7ee4" + }, + { + "type": "hexstring", + "value": "0xf72cebce2bb820054164002363b5763f52133d" + }, + { + "type": "hexstring", + "value": "0x5be7724b68540da165eca677aff36ecf387048" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀éMéo🚀 🚀 éM🚀MéoMMoooM🚀🚀Moéoo🚀o🚀🚀o🚀oé🚀ééMoéo oMéo🚀oM" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102d2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610171565b60405180910390f35b610056610127565b61005e610127565b734ea3b93abb480636a32d10854876bb0b3433729f81527f27de6f34643300365d7df882afab25568b962d6abea4630c23e499000000000060208201526100a3610153565b721e090530215d558a4f0d1baab887f618dfdfb9606a1b815272f72cebce2bb820054164002363b5763f52133d60681b602080830191909152720b7cee496d0a81b42cbd94cef5fe6dd9e70e09606b1b60408084019190915283810192909252815160a08101909252606b8083526000929161023290830139606083015250919050565b6040805160808101825260008082526020820152908101610146610153565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b6000602080835260018060a01b038451168184015264ffffffffff198185015116604084015260408401516060840160005b60038110156101d05782516cffffffffffffffffffffffffff1916825291830191908301906001016101a3565b505050606084015160c08085015280518060e086015260005b8181101561020657828101840151868201610100015283016101e9565b8181111561021957600061010083880101525b50601f01601f1916939093016101000194935050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a94dc3a96ff09f9a8020f09f9a8020c3a94df09f9a804dc3a96f4d4d6f6f6f4df09f9a80f09f9a804d6fc3a96f6ff09f9a806ff09f9a80f09f9a806ff09f9a806fc3a9f09f9a80c3a9c3a94d6fc3a96f206f4dc3a96ff09f9a806f4da26469706673582212206360a5d46c4a468a1314ccbd75e895136d2a6688d57189e92dfdb0fe249e375864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_14a133b9 {\n address s_0;\n bytes27 s_1;\n bytes19[3] s_2;\n string s_3;\n }\n\n function test () public pure returns (S_14a133b9 memory) {\n S_14a133b9 memory r;\n {\n address r_0 = 0x4Ea3B93aBb480636A32D10854876bb0b3433729F;\n r.s_0 = r_0;\n }\n {\n bytes27 r_1 = bytes27(0x27de6f34643300365d7df882afab25568b962d6abea4630c23e499);\n r.s_1 = r_1;\n }\n {\n bytes19[3] memory r_2;\n {\n bytes19 r_2_0 = bytes19(0x782414c0857556293c346eaae21fd8637f7ee4);\n r_2[0] = r_2_0;\n }\n {\n bytes19 r_2_1 = bytes19(0xf72cebce2bb820054164002363b5763f52133d);\n r_2[1] = r_2_1;\n }\n {\n bytes19 r_2_2 = bytes19(0x5be7724b68540da165eca677aff36ecf387048);\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀🚀éMéo🚀 🚀 éM🚀MéoMMoooM🚀🚀Moéoo🚀o🚀🚀o🚀oé🚀ééMoéo oMéo🚀oM\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000004ea3b93abb480636a32d10854876bb0b3433729f27de6f34643300365d7df882afab25568b962d6abea4630c23e4990000000000782414c0857556293c346eaae21fd8637f7ee400000000000000000000000000f72cebce2bb820054164002363b5763f52133d000000000000000000000000005be7724b68540da165eca677aff36ecf3870480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000006b4d6f6f20c3a9f09f9a80f09f9a80c3a94dc3a96ff09f9a8020f09f9a8020c3a94df09f9a804dc3a96f4d4d6f6f6f4df09f9a80f09f9a804d6fc3a96f6ff09f9a806ff09f9a80f09f9a806ff09f9a806fc3a9f09f9a80c3a9c3a94d6fc3a96f206f4dc3a96ff09f9a806f4d000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bytes3[][2][1])", + "type": "(address,bytes3[][2][1])", + "value": [ + "0x9a775acF611205d18ab63DEb5D726bc982c37284", + [[["0x6c197b"], ["0x9dda2d", "0x8649b8", "0xdaebb0"]]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9a775acF611205d18ab63DEb5D726bc982c37284" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6c197b" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9dda2d" + }, + { + "type": "hexstring", + "value": "0x8649b8" + }, + { + "type": "hexstring", + "value": "0xdaebb0" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610355806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061023d565b60405180910390f35b6100566101c1565b61005e6101c1565b739a775acf611205d18ab63deb5d726bc982c37284815261007d6101e9565b610085610216565b6040805160018082528183019092526000916020808301908036833750508151919250626c197b60e81b9182915083906000906100c4576100c4610309565b6001600160e81b031992909216602092830291909101909101525081526040805160038082526080820190925260009181602001602082028036833750508151919250629dda2d60e81b91829150839060009061012357610123610309565b6001600160e81b0319909216602092830291909101909101525080516210c93760eb1b9081908390600190811061015c5761015c610309565b6001600160e81b031990921660209283029190910190910152508051620daebb60ec1b9081908390600290811061019557610195610309565b6001600160e81b0319929092166020928302919091018201528381019290925250908252820152919050565b604051806040016040528060006001600160a01b031681526020016101e46101e9565b905290565b60405180602001604052806001905b610200610216565b8152602001906001900390816101f85790505090565b60405180604001604052806002905b60608152602001906001900390816102255790505090565b602080825282516001600160a01b03168282015282810151604080840181905260009291608085019160608601855b600180821061027b57506102fc565b888603605f1901835284518685810160005b60028110156102e657898203835283518051808452908c01908c84019060005b818110156102d25783516001600160e81b0319168352928e0192918e019188016102ad565b5050948c0194938c0193925050840161028d565b509750505093860193509085019060010161026c565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212208be376f5158e1540ec861170617ea97c32d4a736128e06fe9146ac9aa56bd33064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8a7217ad {\n address s_0;\n bytes3[][2][1] s_1;\n }\n\n function test () public pure returns (S_8a7217ad memory) {\n S_8a7217ad memory r;\n {\n address r_0 = 0x9a775acF611205d18ab63DEb5D726bc982c37284;\n r.s_0 = r_0;\n }\n {\n bytes3[][2][1] memory r_1;\n {\n bytes3[][2] memory r_1_0;\n {\n bytes3[] memory r_1_0_0 = new bytes3[](1);\n {\n bytes3 r_1_0_0_0 = bytes3(0x6c197b);\n r_1_0_0[0] = r_1_0_0_0;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n bytes3[] memory r_1_0_1 = new bytes3[](3);\n {\n bytes3 r_1_0_1_0 = bytes3(0x9dda2d);\n r_1_0_1[0] = r_1_0_1_0;\n }\n {\n bytes3 r_1_0_1_1 = bytes3(0x8649b8);\n r_1_0_1[1] = r_1_0_1_1;\n }\n {\n bytes3 r_1_0_1_2 = bytes3(0xdaebb0);\n r_1_0_1[2] = r_1_0_1_2;\n }\n r_1_0[1] = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000009a775acf611205d18ab63deb5d726bc982c37284000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000016c197b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039dda2d00000000000000000000000000000000000000000000000000000000008649b80000000000000000000000000000000000000000000000000000000000daebb00000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,int88,string,uint160,address)", + "type": "(address,int88,string,uint160,address)", + "value": [ + "0x02575374096c10b1206BCADa8BcDB3F302daa5D2", + "86167916717732110344282820", + "Moo é🚀oooo ooé🚀🚀éM🚀 éooMéoo M Mé oooé🚀oo MoééMM🚀é oMM o oMoéM", + "757926264491365734317093947616404597483600402469", + "0xCc82551545e93Ce162BD1F6a4778895e26B2dEDD" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x02575374096c10b1206BCADa8BcDB3F302daa5D2" + }, + { + "type": "number", + "value": "86167916717732110344282820" + }, + { + "type": "string", + "value": "Moo é🚀oooo ooé🚀🚀éM🚀 éooMéoo M Mé oooé🚀oo MoééMM🚀é oMM o oMoéM" + }, + { + "type": "number", + "value": "757926264491365734317093947616404597483600402469" + }, + { + "type": "address", + "value": "0xCc82551545e93Ce162BD1F6a4778895e26B2dEDD" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610252806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610117565b60405180910390f35b6040805160a080820183526000808352602080840182905260608486018190528085018390526080808601849052865194850187528487018290529084018390528381018390527302575374096c10b1206bcada8bcdb3f302daa5d284526a4746c4200cd4487b2662c4848301528551908101909552605c80865293949293919291906101c1908301396040830152507384c296d19fa4245f18e37e5d2fb82eda1e84d825606082015273cc82551545e93ce162bd1f6a4778895e26b2dedd6080820152919050565b6000602080835260018060a01b038451168184015280840151600a0b6040840152604084015160a0606085015280518060c086015260005b8181101561016b5782810184015186820160e00152830161014f565b8181111561017d57600060e083880101525b5060608601516001600160a01b0381166080870152925060808601516001600160a01b03811660a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806f6f6f6f206f6fc3a9f09f9a80f09f9a80c3a94df09f9a80202020c3a96f6f4dc3a96f6f204d204dc3a9206f6f6fc3a9f09f9a806f6f204d6fc3a9c3a94d4df09f9a80c3a9206f4d4d206f206f4d6fc3a94da26469706673582212206d8e186ec07b988a5a74350cf5514479fadc7f712658e16554db37f418d7bc4164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_34f59bb6 {\n address s_0;\n int88 s_1;\n string s_2;\n uint160 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_34f59bb6 memory) {\n S_34f59bb6 memory r;\n {\n address r_0 = 0x02575374096c10b1206BCADa8BcDB3F302daa5D2;\n r.s_0 = r_0;\n }\n {\n int88 r_1 = 86167916717732110344282820;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oooo ooé🚀🚀éM🚀 éooMéoo M Mé oooé🚀oo MoééMM🚀é oMM o oMoéM\";\n r.s_2 = r_2;\n }\n {\n uint160 r_3 = 757926264491365734317093947616404597483600402469;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xCc82551545e93Ce162BD1F6a4778895e26B2dEDD;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000002575374096c10b1206bcada8bcdb3f302daa5d20000000000000000000000000000000000000000004746c4200cd4487b2662c400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000084c296d19fa4245f18e37e5d2fb82eda1e84d825000000000000000000000000cc82551545e93ce162bd1f6a4778895e26b2dedd000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806f6f6f6f206f6fc3a9f09f9a80f09f9a80c3a94df09f9a80202020c3a96f6f4dc3a96f6f204d204dc3a9206f6f6fc3a9f09f9a806f6f204d6fc3a9c3a94d4df09f9a80c3a9206f4d4d206f206f4d6fc3a94d00000000" + }, + { + "name": "random-(address,string,bytes8,bytes15,bytes21)", + "type": "(address,string,bytes8,bytes15,bytes21)", + "value": [ + "0xCe0cd96ac58BCb4D54fFC4915BA72Fb033d8FaA9", + "Moo é🚀o 🚀oé🚀o 🚀 oM o éo🚀ooéo🚀oéoMo", + "0xc71b0cb7bf220a07", + "0xb5eb2550864e455f6a046df7091ba6", + "0xe2d9c5825b23e85e2ab898ce494a3356bc6768b5a2" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xCe0cd96ac58BCb4D54fFC4915BA72Fb033d8FaA9" + }, + { + "type": "string", + "value": "Moo é🚀o 🚀oé🚀o 🚀 oM o éo🚀ooéo🚀oéoMo" + }, + { + "type": "hexstring", + "value": "0xc71b0cb7bf220a07" + }, + { + "type": "hexstring", + "value": "0xb5eb2550864e455f6a046df7091ba6" + }, + { + "type": "hexstring", + "value": "0xe2d9c5825b23e85e2ab898ce494a3356bc6768b5a2" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610252806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610120565b60405180910390f35b6040805160a08082018352600080835260606020808501829052848601839052818501839052608080860184905286519485018752848201839052848701849052848301849052840183905273ce0cd96ac58bcb4d54ffc4915ba72fb033d8faa98452855191820190955260398082529394929391929091906101e49083013960208301525067c71b0cb7bf220a0760c01b60408201526e5af592a8432722afb50236fb848dd360891b606082015274716ce2c12d91f42f155c4c6724a519ab5e33b45ad160591b6080820152919050565b6000602080835260018060a01b03845116818401528084015160a0604085015280518060c086015260005b818110156101675782810184015186820160e00152830161014b565b8181111561017957600060e083880101525b5060408601516001600160c01b0319811660608701529250606086015170ffffffffffffffffffffffffffffffffff1981166080870152925060808601516affffffffffffffffffffff19811660a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806f20f09f9a806fc3a9f09f9a806f20f09f9a80206f4d206f20c3a96ff09f9a806f6fc3a96ff09f9a806fc3a96f4d6fa2646970667358221220a3b0abf1e116756bff9885ed70ea6f6b217cf4155c38efbe82121a2d6328f58764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_71cd0e9f {\n address s_0;\n string s_1;\n bytes8 s_2;\n bytes15 s_3;\n bytes21 s_4;\n }\n\n function test () public pure returns (S_71cd0e9f memory) {\n S_71cd0e9f memory r;\n {\n address r_0 = 0xCe0cd96ac58BCb4D54fFC4915BA72Fb033d8FaA9;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀o 🚀oé🚀o 🚀 oM o éo🚀ooéo🚀oéoMo\";\n r.s_1 = r_1;\n }\n {\n bytes8 r_2 = bytes8(0xc71b0cb7bf220a07);\n r.s_2 = r_2;\n }\n {\n bytes15 r_3 = bytes15(0xb5eb2550864e455f6a046df7091ba6);\n r.s_3 = r_3;\n }\n {\n bytes21 r_4 = bytes21(0xe2d9c5825b23e85e2ab898ce494a3356bc6768b5a2);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000ce0cd96ac58bcb4d54ffc4915ba72fb033d8faa900000000000000000000000000000000000000000000000000000000000000a0c71b0cb7bf220a07000000000000000000000000000000000000000000000000b5eb2550864e455f6a046df7091ba60000000000000000000000000000000000e2d9c5825b23e85e2ab898ce494a3356bc6768b5a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f20f09f9a806fc3a9f09f9a806f20f09f9a80206f4d206f20c3a96ff09f9a806f6fc3a96ff09f9a806fc3a96f4d6f00000000000000" + }, + { + "name": "random-(address,string,string,string,uint32)", + "type": "(address,string,string,string,uint32)", + "value": [ + "0xcfE690f5C70039a976b06E9951D18B51129a6910", + "Moo é🚀🚀 o🚀ooo🚀o🚀🚀🚀ooé ", + "Moo é🚀M🚀é", + "Moo é🚀🚀 M🚀🚀🚀Moéo 🚀éé é 🚀é", + "1505442432" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xcfE690f5C70039a976b06E9951D18B51129a6910" + }, + { + "type": "string", + "value": "Moo é🚀🚀 o🚀ooo🚀o🚀🚀🚀ooé " + }, + { + "type": "string", + "value": "Moo é🚀M🚀é" + }, + { + "type": "string", + "value": "Moo é🚀🚀 M🚀🚀🚀Moéo 🚀éé é 🚀é" + }, + { + "type": "number", + "value": "1505442432" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061029f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017f565b60405180910390f35b6100566100f4565b61005e6100f4565b73cfe690f5c70039a976b06e9951d18b51129a691081526040805160608101909152602d8082526000919061023d602083013960208084019190915260408051808201825260118152704d6f6f20c3a9f09f9a804df09f9a80c3a960781b81840152818501528051606081019091526036808252600093509091610207908301396060830152506359bb3a806080820152919050565b6040518060a0016040528060006001600160a01b03168152602001606081526020016060815260200160608152602001600063ffffffff1681525090565b6000815180845260005b818110156101585760208185018101518683018201520161013c565b8181111561016a576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516001600160a01b03168282015282015160a060408301526000906101ad60c0840182610132565b90506040840151601f19808584030160608601526101cb8383610132565b92506060860151915080858403016080860152506101e98282610132565b91505063ffffffff60808501511660a0840152809150509291505056fe4d6f6f20c3a9f09f9a80f09f9a80204df09f9a80f09f9a80f09f9a804d6fc3a96f20f09f9a80c3a9c3a9202020c3a920f09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a80206ff09f9a806f6f6ff09f9a806ff09f9a80f09f9a80f09f9a806f6fc3a920a26469706673582212204b4b8a7fcceab4d06370e5449801682820740776ee5942e42792521d2e4e58e864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_53253d21 {\n address s_0;\n string s_1;\n string s_2;\n string s_3;\n uint32 s_4;\n }\n\n function test () public pure returns (S_53253d21 memory) {\n S_53253d21 memory r;\n {\n address r_0 = 0xcfE690f5C70039a976b06E9951D18B51129a6910;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀 o🚀ooo🚀o🚀🚀🚀ooé \";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀M🚀é\";\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀🚀 M🚀🚀🚀Moéo 🚀éé é 🚀é\";\n r.s_3 = r_3;\n }\n {\n uint32 r_4 = 1505442432;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000cfe690f5c70039a976b06e9951d18b51129a691000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000059bb3a80000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80f09f9a80206ff09f9a806f6f6ff09f9a806ff09f9a80f09f9a80f09f9a806f6fc3a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804df09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80f09f9a80204df09f9a80f09f9a80f09f9a804d6fc3a96f20f09f9a80c3a9c3a9202020c3a920f09f9a80c3a900000000000000000000" + }, + { + "name": "random-(address[2],string,(string,bytes25))", + "type": "(address[2],string,(string,bytes25))", + "value": [ + [ + "0x4141351963d1d3969819e0E79421F493cA9Af7fD", + "0xa5638b239251976b2C56Fd69DdDb19216F3534a3" + ], + "Moo é🚀", + [ + "Moo é🚀M 🚀M🚀 o🚀éo é🚀o oooM🚀M o🚀🚀ooéoéoéé🚀é🚀oéooooMo🚀ooM🚀o🚀 o🚀é ", + "0x56092049828096aaa663cf8d3299c0bb4fc4d86218a8e22e7b" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4141351963d1d3969819e0E79421F493cA9Af7fD" + }, + { + "type": "address", + "value": "0xa5638b239251976b2C56Fd69DdDb19216F3534a3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M 🚀M🚀 o🚀éo é🚀o oooM🚀M o🚀🚀ooéoéoéé🚀é🚀oéooooMo🚀ooM🚀o🚀 o🚀é " + }, + { + "type": "hexstring", + "value": "0x56092049828096aaa663cf8d3299c0bb4fc4d86218a8e22e7b" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610317806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101d7565b60405180910390f35b610056610121565b61005e610121565b61006661016c565b734141351963d1d3969819e0e79421f493ca9af7fd815273a5638b239251976b2c56fd69dddb19216f3534a3602080830191909152908252604080518082018252600a8152689adede418753e13f3560b71b818401528383015280518082018252606081526000818401819052825160a08101909352607380845291939092919061026f908301398252507f56092049828096aaa663cf8d3299c0bb4fc4d86218a8e22e7b0000000000000060208201526040820152919050565b604051806060016040528061013461016c565b815260200160608152602001610167604051806040016040528060608152602001600066ffffffffffffff191681525090565b905290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156101b057602081850181015186830182015201610194565b818111156101c2576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160009190828483015b600282101561020f5782516001600160a01b03168152918301916001919091019083016101e7565b505050808401516080606085015261022a60a085018261018a565b90506040850151601f19858303016080860152805160408352610250604084018261018a565b9184015166ffffffffffffff1916929093019190915294935050505056fe4d6f6f20c3a9f09f9a804d2020f09f9a804df09f9a80206ff09f9a80c3a96f20c3a9f09f9a806f206f6f6f4df09f9a804d206ff09f9a80f09f9a806f6fc3a96fc3a96fc3a9c3a9f09f9a80c3a9f09f9a806fc3a96f6f6f6f4d6ff09f9a806f6f4df09f9a806ff09f9a80206ff09f9a80c3a920a2646970667358221220c966bad689da974136b25dc032035dae6359e16ff9176732e1a79b4133b9809564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_62cfa513 {\n string s_0;\n bytes25 s_1;\n }\n\n struct S_a6b651b7 {\n address[2] s_0;\n string s_1;\n S_62cfa513 s_2;\n }\n\n function test () public pure returns (S_a6b651b7 memory) {\n S_a6b651b7 memory r;\n {\n address[2] memory r_0;\n {\n address r_0_0 = 0x4141351963d1d3969819e0E79421F493cA9Af7fD;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xa5638b239251976b2C56Fd69DdDb19216F3534a3;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n S_62cfa513 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀M 🚀M🚀 o🚀éo é🚀o oooM🚀M o🚀🚀ooéoéoéé🚀é🚀oéooooMo🚀ooM🚀o🚀 o🚀é \";\n r_2.s_0 = r_2_0;\n }\n {\n bytes25 r_2_1 = bytes25(0x56092049828096aaa663cf8d3299c0bb4fc4d86218a8e22e7b);\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000004141351963d1d3969819e0e79421f493ca9af7fd000000000000000000000000a5638b239251976b2c56fd69dddb19216f3534a3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004056092049828096aaa663cf8d3299c0bb4fc4d86218a8e22e7b0000000000000000000000000000000000000000000000000000000000000000000000000000734d6f6f20c3a9f09f9a804d2020f09f9a804df09f9a80206ff09f9a80c3a96f20c3a9f09f9a806f206f6f6f4df09f9a804d206ff09f9a80f09f9a806f6fc3a96fc3a96fc3a9c3a9f09f9a80c3a9f09f9a806fc3a96f6f6f6f4d6ff09f9a806f6f4df09f9a806ff09f9a80206ff09f9a80c3a92000000000000000000000000000" + }, + { + "name": "random-(address[4],bool[],int160)", + "type": "(address[4],bool[],int160)", + "value": [ + [ + "0xC471a0DE712033BC0dB66aa63D0d5Ce7Fe30CE9E", + "0xe333C319F59FF51eb2f4a4dad459202338B4FCd9", + "0xFfE0c4C295d3037fF70dcb0fCA69630e2727ffAE", + "0x07b42A13d43019Ed3De9f6f7A83A685246309561" + ], + [], + "-556715979670544194538409389648652506062203683011" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xC471a0DE712033BC0dB66aa63D0d5Ce7Fe30CE9E" + }, + { + "type": "address", + "value": "0xe333C319F59FF51eb2f4a4dad459202338B4FCd9" + }, + { + "type": "address", + "value": "0xFfE0c4C295d3037fF70dcb0fCA69630e2727ffAE" + }, + { + "type": "address", + "value": "0x07b42A13d43019Ed3De9f6f7A83A685246309561" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "number", + "value": "-556715979670544194538409389648652506062203683011" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061021f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610149565b60405180910390f35b610056610104565b61005e610104565b61006661012b565b73c471a0de712033bc0db66aa63d0d5ce7fe30ce9e815273e333c319f59ff51eb2f4a4dad459202338b4fcd960208083019190915273ffe0c4c295d3037ff70dcb0fca69630e2727ffae6040808401919091527307b42a13d43019ed3de9f6f7a83a68524630956160608401529183528151600081528082018352908301527361840206c9bdabaea24005b90f99bb03bab080c21990820152919050565b604051806060016040528061011761012b565b815260606020820152600060409091015290565b60405180608001604052806004906020820280368337509192915050565b602080825282516000919060e08401838584015b60048210156101855783516001600160a01b031681529284019260019190910190840161015d565b50508583015160c060a0870152805191829052830191506000906101008601905b808310156101c8578351151582529284019260019290920191908401906101a6565b50604087015193506101df60c087018560130b9052565b969550505050505056fea2646970667358221220228e8890fb275a2fba0183368a75f224d8298ca60695657f00f9af5de9dc86c564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_82c082c0 {\n address[4] s_0;\n bool[] s_1;\n int160 s_2;\n }\n\n function test () public pure returns (S_82c082c0 memory) {\n S_82c082c0 memory r;\n {\n address[4] memory r_0;\n {\n address r_0_0 = 0xC471a0DE712033BC0dB66aa63D0d5Ce7Fe30CE9E;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xe333C319F59FF51eb2f4a4dad459202338B4FCd9;\n r_0[1] = r_0_1;\n }\n {\n address r_0_2 = 0xFfE0c4C295d3037fF70dcb0fCA69630e2727ffAE;\n r_0[2] = r_0_2;\n }\n {\n address r_0_3 = 0x07b42A13d43019Ed3De9f6f7A83A685246309561;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bool[] memory r_1 = new bool[](0);\n r.s_1 = r_1;\n }\n {\n int160 r_2 = -556715979670544194538409389648652506062203683011;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c471a0de712033bc0db66aa63d0d5ce7fe30ce9e000000000000000000000000e333c319f59ff51eb2f4a4dad459202338b4fcd9000000000000000000000000ffe0c4c295d3037ff70dcb0fca69630e2727ffae00000000000000000000000007b42a13d43019ed3de9f6f7a83a68524630956100000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffff9e7bfdf9364254515dbffa46f06644fc454f7f3d0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,address,address,(bytes28,address))", + "type": "(bool,address,address,(bytes28,address))", + "value": [ + false, + "0xAa7DE6493DdEE0f461d10659F6Af58Cb2B97c7a4", + "0xd248723779521F1972b83b5A2b2eDb03a52983c3", + [ + "0xc88cda4f1dae64d84ec7010a438b33a8732d12d904a57fe902a34496", + "0xEf2787Ba77368F5f38b3418c95db39a86Ab03220" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xAa7DE6493DdEE0f461d10659F6Af58Cb2B97c7a4" + }, + { + "type": "address", + "value": "0xd248723779521F1972b83b5A2b2eDb03a52983c3" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc88cda4f1dae64d84ec7010a438b33a8732d12d904a57fe902a34496" + }, + { + "type": "address", + "value": "0xEf2787Ba77368F5f38b3418c95db39a86Ab03220" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101cc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b610038610097565b60405161008e91908151151581526020808301516001600160a01b0390811682840152604080850151821690840152606093840151805163ffffffff191694840194909452920151909116608082015260a00190565b60405180910390f35b6100ce6040805160808101825260008082526020808301829052828401829052835180850190945281845283015290606082015290565b6101056040805160808101825260008082526020808301829052828401829052835180850190945281845283015290606082015290565b6000815273aa7de6493ddee0f461d10659f6af58cb2b97c7a460208083019190915273d248723779521f1972b83b5a2b2edb03a52983c360408084019190915280518082019091527fc88cda4f1dae64d84ec7010a438b33a8732d12d904a57fe902a3449600000000815273ef2787ba77368f5f38b3418c95db39a86ab0322091810191909152606082015291905056fea2646970667358221220bf4a8e975fabe0162383e5984022d874db6fd6a8dada2b2ffa5fd2c36c2172b464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_113ad7c9 {\n bytes28 s_0;\n address s_1;\n }\n\n struct S_e41f8d72 {\n bool s_0;\n address s_1;\n address s_2;\n S_113ad7c9 s_3;\n }\n\n function test () public pure returns (S_e41f8d72 memory) {\n S_e41f8d72 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xAa7DE6493DdEE0f461d10659F6Af58Cb2B97c7a4;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xd248723779521F1972b83b5A2b2eDb03a52983c3;\n r.s_2 = r_2;\n }\n {\n S_113ad7c9 memory r_3;\n {\n bytes28 r_3_0 = bytes28(0xc88cda4f1dae64d84ec7010a438b33a8732d12d904a57fe902a34496);\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0xEf2787Ba77368F5f38b3418c95db39a86Ab03220;\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa7de6493ddee0f461d10659f6af58cb2b97c7a4000000000000000000000000d248723779521f1972b83b5a2b2edb03a52983c3c88cda4f1dae64d84ec7010a438b33a8732d12d904a57fe902a3449600000000000000000000000000000000ef2787ba77368f5f38b3418c95db39a86ab03220" + }, + { + "name": "random-(bool,address,int256,uint168,string)", + "type": "(bool,address,int256,uint168,string)", + "value": [ + true, + "0xe21e938265fa8C67E1cAf4AaB1F01b17Be03AE60", + "-49834626886411599797080129241252412221548574922567402409412494555958278883952", + "89967997321685748167516957060621049600170884080273", + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xe21e938265fa8C67E1cAf4AaB1F01b17Be03AE60" + }, + { + "type": "number", + "value": "-49834626886411599797080129241252412221548574922567402409412494555958278883952" + }, + { + "type": "number", + "value": "89967997321685748167516957060621049600170884080273" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101ff806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610132565b60405180910390f35b6100566100ef565b61005e6100ef565b6001815273e21e938265fa8c67e1caf4aab1f01b17be03ae606020808301919091527f91d299ca5b6a7b82123d990d583d1aa984ad1ad41a2cbc9662dbe4d4acabf590604080840191909152743d8f00870c1739b6e5f72d0109f2064fb32e6c229160608401528051808201909152600a8152689adede418753e13f3560b71b918101919091526080820152919050565b6040518060a0016040528060001515815260200160006001600160a01b031681526020016000815260200160006001600160a81b03168152602001606081525090565b60006020808352835115158184015260018060a01b03818501511660408401526040840151606084015260018060a81b036060850151166080840152608084015160a08085015280518060c086015260005b818110156101a05782810184015186820160e001528301610184565b818111156101b257600060e083880101525b50601f01601f19169390930160e00194935050505056fea2646970667358221220ad6bfb565ecf3e3399bdd0eece609c61302a20681261572781ef35c63d7bf5f864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7f1e9daf {\n bool s_0;\n address s_1;\n int256 s_2;\n uint168 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_7f1e9daf memory) {\n S_7f1e9daf memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xe21e938265fa8C67E1cAf4AaB1F01b17Be03AE60;\n r.s_1 = r_1;\n }\n {\n int256 r_2 = -49834626886411599797080129241252412221548574922567402409412494555958278883952;\n r.s_2 = r_2;\n }\n {\n uint168 r_3 = 89967997321685748167516957060621049600170884080273;\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e21e938265fa8c67e1caf4aab1f01b17be03ae6091d299ca5b6a7b82123d990d583d1aa984ad1ad41a2cbc9662dbe4d4acabf59000000000000000000000003d8f00870c1739b6e5f72d0109f2064fb32e6c229100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bool,int48,address,bool)", + "type": "(bool,bool,int48,address,bool)", + "value": [ + true, + false, + "112172682523107", + "0xa6F94EB3d41d71E384Fb91eE04532715C029f3c8", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "112172682523107" + }, + { + "type": "address", + "value": "0xa6F94EB3d41d71E384Fb91eE04532715C029f3c8" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061010f8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160a0808201835260008083526020808401829052838501829052606080850183905260809485018390528551808501875280830193845260018082526566053ce531e382890190815273a6f94eb3d41d71e384fb91ee04532715c029f3c883850190815292880182815289519283529551151594820194909452925160050b83880152516001600160a01b031690820152905115159281019290925291519081900390910190f3fea2646970667358221220b5f1e60f622959ba6494e88dd8f50eb00ad9e1f51a19827b6239425451c9ee3564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_063b63e5 {\n bool s_0;\n bool s_1;\n int48 s_2;\n address s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_063b63e5 memory) {\n S_063b63e5 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n int48 r_2 = 112172682523107;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xa6F94EB3d41d71E384Fb91eE04532715C029f3c8;\n r.s_3 = r_3;\n }\n {\n bool r_4 = true;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066053ce531e3000000000000000000000000a6f94eb3d41d71e384fb91ee04532715c029f3c80000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool,bytes22,string,bool,uint24)", + "type": "(bool,bytes22,string,bool,uint24)", + "value": [ + true, + "0x3fb675255eb3d1b5092c064d9422e33621bdcf221d62", + "Moo é🚀oM oéo ooo ooo é éMo🚀Mooo éo🚀Mo ooo oM éoMoM oo", + true, + "15192590" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x3fb675255eb3d1b5092c064d9422e33621bdcf221d62" + }, + { + "type": "string", + "value": "Moo é🚀oM oéo ooo ooo é éMo🚀Mooo éo🚀Mo ooo oM éoMoM oo" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "15192590" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061020b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100ee565b60405180910390f35b6040805160a0808201835260008083526020808401829052606084860181905280850183905260808086018490528651948501875284870182905290840183905283810183905260018452751fdb3a92af59e8da84960326ca11719b10dee7910eb160511b84830152855190810190955260458086529394929391929190610191908301396040830152506001606082015262e7d20e6080820152919050565b60006020808352835115158184015269ffffffffffffffffffff1981850151166040840152604084015160a0606085015280518060c086015260005b818110156101465782810184015186820160e00152830161012a565b8181111561015857600060e083880101525b50606086015180151560808701529250608086015162ffffff811660a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806f4d206fc3a96f206f6f6f20206f6f6f20c3a920c3a94d6ff09f9a804d6f6f6f20c3a96ff09f9a804d6f206f6f6f206f4d20c3a96f4d6f4d206f6fa26469706673582212208f3e557175f1da1d792978742f9c5725980a5052fda66f2676e0b902a5511ddb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ec8e4ea5 {\n bool s_0;\n bytes22 s_1;\n string s_2;\n bool s_3;\n uint24 s_4;\n }\n\n function test () public pure returns (S_ec8e4ea5 memory) {\n S_ec8e4ea5 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes22 r_1 = bytes22(0x3fb675255eb3d1b5092c064d9422e33621bdcf221d62);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oM oéo ooo ooo é éMo🚀Mooo éo🚀Mo ooo oM éoMoM oo\";\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n uint24 r_4 = 15192590;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000013fb675255eb3d1b5092c064d9422e33621bdcf221d620000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000e7d20e00000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a806f4d206fc3a96f206f6f6f20206f6f6f20c3a920c3a94d6ff09f9a804d6f6f6f20c3a96ff09f9a804d6f206f6f6f206f4d20c3a96f4d6f4d206f6f000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bytes7,bool,address,string)", + "type": "(bool,bytes7,bool,address,string)", + "value": [ + false, + "0x26fd047dd778ea", + true, + "0x62196AE41bD201Aa1bf06222D8Cf487c4bee9fD4", + "Moo é🚀oo Mo éooéoéMM 🚀oo oo🚀éooMééé o ooooMo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x26fd047dd778ea" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x62196AE41bD201Aa1bf06222D8Cf487c4bee9fD4" + }, + { + "type": "string", + "value": "Moo é🚀oo Mo éooéoéMM 🚀oo oo🚀éooMééé o ooooMo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100e4565b60405180910390f35b6040805160a0808201835260008083526020808401829052838501829052606080850183905260808086018290528651948501875283855284810182905266137e823eebbc7560c91b858401526001858801527362196ae41bd201aa1bf06222d8cf487c4bee9fd49185019190915285519081019095526042808652939492939192919061018290830139608083015250919050565b60006020808352835115158184015266ffffffffffffff60c81b8185015116604084015260408401511515606084015260018060a01b036060850151166080840152608084015160a08085015280518060c086015260005b818110156101585782810184015186820160e00152830161013c565b8181111561016a57600060e083880101525b50601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806f6f204d6f2020c3a96f6fc3a96fc3a94d4d2020f09f9a806f6f20206f6ff09f9a80c3a96f6f4dc3a9c3a9c3a92020206f206f6f6f6f4d6fa2646970667358221220e65d9c18c6a43fa5b39e1f26ba3649770cee2b15b38361e885395fefcb99671e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_163a6aa1 {\n bool s_0;\n bytes7 s_1;\n bool s_2;\n address s_3;\n string s_4;\n }\n\n function test () public pure returns (S_163a6aa1 memory) {\n S_163a6aa1 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bytes7 r_1 = bytes7(0x26fd047dd778ea);\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x62196AE41bD201Aa1bf06222D8Cf487c4bee9fD4;\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀oo Mo éooéoéMM 🚀oo oo🚀éooMééé o ooooMo\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000026fd047dd778ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000062196ae41bd201aa1bf06222d8cf487c4bee9fd400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a806f6f204d6f2020c3a96f6fc3a96fc3a94d4d2020f09f9a806f6f20206f6ff09f9a80c3a96f6f4dc3a9c3a9c3a92020206f206f6f6f6f4d6f000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,int64,bytes11,string[])", + "type": "(bool,int64,bytes11,string[])", + "value": [ + false, + "5258602195772154302", + "0x38799cd468b2ff2a95235f", + [ + "Moo é🚀🚀 o ééM éMMoé oMéoo Mo🚀oé🚀éo oMo", + "Moo é🚀🚀éoMMoM🚀éé🚀oo MMM🚀é é🚀MMo 🚀ooM oMooMoé 🚀o 🚀M oéMM🚀M", + "Moo é🚀oé🚀 🚀oMMMMooo ooé🚀 oéMooéooooM 🚀🚀🚀éM🚀M", + "Moo é🚀🚀 M" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "5258602195772154302" + }, + { + "type": "hexstring", + "value": "0x38799cd468b2ff2a95235f" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 o ééM éMMoé oMéoo Mo🚀oé🚀éo oMo" + }, + { + "type": "string", + "value": "Moo é🚀🚀éoMMoM🚀éé🚀oo MMM🚀é é🚀MMo 🚀ooM oMooMoé 🚀o 🚀M oéMM🚀M" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀 🚀oMMMMooo ooé🚀 oéMooéooooM 🚀🚀🚀éM🚀M" + }, + { + "type": "string", + "value": "Moo é🚀🚀 M" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103e9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e1565b60405180910390f35b604080516080808201835260008083526020808401829052838501829052606080850181905285519384018652828452838101526748fa4ed5f616a1be838201526a38799cd468b2ff2a95235f60a81b838601528451600480825260a082019096529394929391929082015b60608152602001906001900390816100ba57905050905060006040518060600160405280603b81526020016102cf603b913990508082600081518110610102576101026102b8565b602002602001018190525050600060405180608001604052806060815260200161030a606091399050808260018151811061013f5761013f6102b8565b60200260200101819052505060006040518060800160405280604a815260200161036a604a91399050808260028151811061017c5761017c6102b8565b6020026020010181905250506000604051806040016040528060128152602001714d6f6f20c3a9f09f9a80f09f9a802020204d60701b815250905080826003815181106101cb576101cb6102b8565b6020908102919091010152506060820152919050565b6000602080835260a0830184511515828501528185015160070b60408501526affffffffffffffffffffff60a81b6040860151166060850152606085015160808086015281815180845260c08701915060c08160051b880101935084830192506000805b828110156102aa5788860360bf1901845284518051808852835b8181101561027a578281018a01518982018b0152890161025f565b8181111561028a57848a838b0101525b50601f01601f191696909601870195509386019392860192600101610245565b509398975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a80206f20c3a9c3a94d20c3a94d4d6fc3a9206f4dc3a96f6f204d6ff09f9a806fc3a9f09f9a80c3a96f20206f4d6f4d6f6f20c3a9f09f9a80f09f9a80c3a96f4d4d6f4df09f9a80c3a9c3a9f09f9a806f6f204d4d4df09f9a80c3a920c3a9f09f9a804d4d6f2020f09f9a806f6f4d206f4d6f6f4d6fc3a920f09f9a806f20f09f9a804d206fc3a94d4df09f9a804d4d6f6f20c3a9f09f9a806fc3a9f09f9a8020f09f9a806f4d4d4d4d6f6f6f206f6fc3a9f09f9a80206fc3a94d6f6fc3a96f6f6f6f4d20f09f9a80f09f9a80f09f9a80c3a94df09f9a804da2646970667358221220f6d53a30ddcf02e93a022524d06c0a1390b1922f78070945102db656b9f1632e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fa6fa055 {\n bool s_0;\n int64 s_1;\n bytes11 s_2;\n string[] s_3;\n }\n\n function test () public pure returns (S_fa6fa055 memory) {\n S_fa6fa055 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int64 r_1 = 5258602195772154302;\n r.s_1 = r_1;\n }\n {\n bytes11 r_2 = bytes11(0x38799cd468b2ff2a95235f);\n r.s_2 = r_2;\n }\n {\n string[] memory r_3 = new string[](4);\n {\n string memory r_3_0 = unicode\"Moo é🚀🚀 o ééM éMMoé oMéoo Mo🚀oé🚀éo oMo\";\n r_3[0] = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀🚀éoMMoM🚀éé🚀oo MMM🚀é é🚀MMo 🚀ooM oMooMoé 🚀o 🚀M oéMM🚀M\";\n r_3[1] = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀oé🚀 🚀oMMMMooo ooé🚀 oéMooéooooM 🚀🚀🚀éM🚀M\";\n r_3[2] = r_3_2;\n }\n {\n string memory r_3_3 = unicode\"Moo é🚀🚀 M\";\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048fa4ed5f616a1be38799cd468b2ff2a95235f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a80f09f9a80206f20c3a9c3a94d20c3a94d4d6fc3a9206f4dc3a96f6f204d6ff09f9a806fc3a9f09f9a80c3a96f20206f4d6f000000000000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a80f09f9a80c3a96f4d4d6f4df09f9a80c3a9c3a9f09f9a806f6f204d4d4df09f9a80c3a920c3a9f09f9a804d4d6f2020f09f9a806f6f4d206f4d6f6f4d6fc3a920f09f9a806f20f09f9a804d206fc3a94d4df09f9a804d000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806fc3a9f09f9a8020f09f9a806f4d4d4d4d6f6f6f206f6fc3a9f09f9a80206fc3a94d6f6fc3a96f6f6f6f4d20f09f9a80f09f9a80f09f9a80c3a94df09f9a804d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a80f09f9a802020204d0000000000000000000000000000" + }, + { + "name": "random-(bool,string,int184,bytes32)[3]", + "type": "(bool,string,int184,bytes32)[3]", + "value": [ + [ + false, + "Moo é🚀 🚀 oM🚀 Mooo🚀oé éoMoo oo🚀o🚀o🚀M o o oéééé 🚀 M🚀🚀 ", + "-2355682185243814109792181213924941005316724947667662063", + "0x4a3236efb45f41736f8dd4bc6bd7c30d6417ddbbf675e89f9831b23151de902e" + ], + [ + false, + "Moo é🚀🚀🚀é🚀 🚀 oooo M🚀é🚀M🚀 éo ééo🚀🚀🚀", + "-3098723652200480385907393898084487824909372289653215355", + "0x351f2ebd24f0d17275417454488c04aef285ecdcc5fb993ec17d6d15e1cf0b0e" + ], + [ + true, + "Moo é🚀🚀M ooé o 🚀ooMo🚀éMoooMo 🚀ooéM M", + "9131177550595859543017832849951613072107026565031370986", + "0x06e8a179183b58ef92b536c2cc9711b8f2db8535f1c67f3243a2b99c04b71835" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 🚀 oM🚀 Mooo🚀oé éoMoo oo🚀o🚀o🚀M o o oéééé 🚀 M🚀🚀 " + }, + { + "type": "number", + "value": "-2355682185243814109792181213924941005316724947667662063" + }, + { + "type": "hexstring", + "value": "0x4a3236efb45f41736f8dd4bc6bd7c30d6417ddbbf675e89f9831b23151de902e" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀é🚀 🚀 oooo M🚀é🚀M🚀 éo ééo🚀🚀🚀" + }, + { + "type": "number", + "value": "-3098723652200480385907393898084487824909372289653215355" + }, + { + "type": "hexstring", + "value": "0x351f2ebd24f0d17275417454488c04aef285ecdcc5fb993ec17d6d15e1cf0b0e" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀M ooé o 🚀ooMo🚀éMoooMo 🚀ooéM M" + }, + { + "type": "number", + "value": "9131177550595859543017832849951613072107026565031370986" + }, + { + "type": "hexstring", + "value": "0x06e8a179183b58ef92b536c2cc9711b8f2db8535f1c67f3243a2b99c04b71835" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610446806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610276565b60405180910390f35b610056610230565b61005e610230565b6040805160808101825260008082526060602083018190529282018190529181019190915260008082526040805160808101909152605b8082526103b660208301396020830152507618982f2893d2d43aff032cd5e7e9048587983c685034ee1960408201527f4a3236efb45f41736f8dd4bc6bd7c30d6417ddbbf675e89f9831b23151de902e60608201528082600060200201525061011f6040805160808101825260008082526060602083018190529282018190529181019190915290565b60008082526040805160808101909152604b80825261036b602083013960208301525076205a28c2e641b6c6e4d4d6e9f5dc1a61a946adb59d107a1960408201527f351f2ebd24f0d17275417454488c04aef285ecdcc5fb993ec17d6d15e1cf0b0e6060820152808260016020020152506101bb6040805160808101825260008082526060602083018190529282018190529181019190915290565b6001815260408051606081019091526037808252600091906103346020830139602083015250765f557d36e4123525d4ada6db41e1294156dd95ae79a0ea6040808301919091527f06e8a179183b58ef92b536c2cc9711b8f2db8535f1c67f3243a2b99c04b718356060830152820152919050565b60405180606001604052806003905b60408051608081018252600080825260606020808401829052938301829052820152825260001990920191018161023f5790505090565b602080825260009060808382018185018685805b600381101561032557601f19808a8603018652835180511515865288810151888a8801528051808a890152855b818110156102d3578281018c015189820160a001528b016102b7565b818111156102e4578660a0838b0101525b5060409150818301516102fb838a018260160b9052565b50606092830151928801929092525095880195601f011690930160a001929186019160010161028a565b50919897505050505050505056fe4d6f6f20c3a9f09f9a80f09f9a804d206f6fc3a9206f20f09f9a806f6f4d6ff09f9a80c3a94d6f6f6f4d6f20f09f9a806f6fc3a94d204d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a9f09f9a8020f09f9a80206f6f6f6f204df09f9a80c3a9f09f9a804df09f9a8020c3a96f202020c3a9c3a96ff09f9a80f09f9a80f09f9a804d6f6f20c3a9f09f9a8020f09f9a80206f4df09f9a80204d6f6f6ff09f9a806fc3a920c3a96f4d6f6f20206f6ff09f9a806ff09f9a806ff09f9a804d206f206f206fc3a9c3a9c3a9c3a920f09f9a8020204df09f9a80f09f9a8020a26469706673582212200963025a971ce9bfb93154a983af691ddf73c6d7412e5b8f2bc503bf6f02285f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8f3fa6af {\n bool s_0;\n string s_1;\n int184 s_2;\n bytes32 s_3;\n }\n\n function test () public pure returns (S_8f3fa6af[3] memory) {\n S_8f3fa6af[3] memory r;\n {\n S_8f3fa6af memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀 🚀 oM🚀 Mooo🚀oé éoMoo oo🚀o🚀o🚀M o o oéééé 🚀 M🚀🚀 \";\n r_0.s_1 = r_0_1;\n }\n {\n int184 r_0_2 = -2355682185243814109792181213924941005316724947667662063;\n r_0.s_2 = r_0_2;\n }\n {\n bytes32 r_0_3 = bytes32(0x4a3236efb45f41736f8dd4bc6bd7c30d6417ddbbf675e89f9831b23151de902e);\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_8f3fa6af memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀🚀🚀é🚀 🚀 oooo M🚀é🚀M🚀 éo ééo🚀🚀🚀\";\n r_1.s_1 = r_1_1;\n }\n {\n int184 r_1_2 = -3098723652200480385907393898084487824909372289653215355;\n r_1.s_2 = r_1_2;\n }\n {\n bytes32 r_1_3 = bytes32(0x351f2ebd24f0d17275417454488c04aef285ecdcc5fb993ec17d6d15e1cf0b0e);\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_8f3fa6af memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀🚀M ooé o 🚀ooMo🚀éMoooMo 🚀ooéM M\";\n r_2.s_1 = r_2_1;\n }\n {\n int184 r_2_2 = 9131177550595859543017832849951613072107026565031370986;\n r_2.s_2 = r_2_2;\n }\n {\n bytes32 r_2_3 = bytes32(0x06e8a179183b58ef92b536c2cc9711b8f2db8535f1c67f3243a2b99c04b71835);\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffe767d0d76c2d2bc500fcd32a1816fb7a7867c397afcb114a3236efb45f41736f8dd4bc6bd7c30d6417ddbbf675e89f9831b23151de902e000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a8020f09f9a80206f4df09f9a80204d6f6f6ff09f9a806fc3a920c3a96f4d6f6f20206f6ff09f9a806ff09f9a806ff09f9a804d206f206f206fc3a9c3a9c3a9c3a920f09f9a8020204df09f9a80f09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffdfa5d73d19be49391b2b29160a23e59e56b9524a62ef85351f2ebd24f0d17275417454488c04aef285ecdcc5fb993ec17d6d15e1cf0b0e000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a9f09f9a8020f09f9a80206f6f6f6f204df09f9a80c3a9f09f9a804df09f9a8020c3a96f202020c3a9c3a96ff09f9a80f09f9a80f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000005f557d36e4123525d4ada6db41e1294156dd95ae79a0ea06e8a179183b58ef92b536c2cc9711b8f2db8535f1c67f3243a2b99c04b7183500000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80f09f9a804d206f6fc3a9206f20f09f9a806f6f4d6ff09f9a80c3a94d6f6f6f4d6f20f09f9a806f6fc3a94d204d000000000000000000" + }, + { + "name": "random-(bool,string,string,bool,address)", + "type": "(bool,string,string,bool,address)", + "value": [ + false, + "Moo é🚀éoooo 🚀éM 🚀 oéMMoooooé ooo o", + "Moo é🚀Mé🚀é🚀🚀M🚀oMo🚀o 🚀ooo🚀🚀oMé🚀🚀o🚀oo🚀é🚀 o M o🚀 ooé", + false, + "0xaB92CDD84623dD2FffAc6c438aB27D4008013F72" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀éoooo 🚀éM 🚀 oéMMoooooé ooo o" + }, + { + "type": "string", + "value": "Moo é🚀Mé🚀é🚀🚀M🚀oMo🚀o 🚀ooo🚀🚀oMé🚀🚀o🚀oo🚀é🚀 o M o🚀 ooé" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xaB92CDD84623dD2FffAc6c438aB27D4008013F72" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610157565b60405180910390f35b6100566100ce565b61005e6100ce565b6000808252604080516060810190915260308082526101cb602083013990508082602001819052505060006040518060a00160405280606781526020016101fb606791396040830152506000606082015273ab92cdd84623dd2fffac6c438ab27d4008013f726080820152919050565b6040518060a00160405280600015158152602001606081526020016060815260200160001515815260200160006001600160a01b031681525090565b6000815180845260005b8181101561013057602081850181015186830182015201610114565b81811115610142576000602083870101525b50601f01601f19169290920160200192915050565b602081528151151560208201526000602083015160a0604084015261017f60c084018261010a565b90506040840151601f1984830301606085015261019c828261010a565b60608601511515608086810191909152909501516001600160a01b031660a09094019390935250919291505056fe4d6f6f20c3a9f09f9a80c3a96f6f6f6f20f09f9a80c3a94d20f09f9a80206fc3a94d4d6f6f6f6f6fc3a9206f6f6f206f4d6f6f20c3a9f09f9a804dc3a9f09f9a80c3a9f09f9a80f09f9a804df09f9a806f4d6ff09f9a806f202020f09f9a806f6f6ff09f9a80f09f9a806f4dc3a9f09f9a80f09f9a806ff09f9a806f6ff09f9a80c3a9f09f9a80206f204d206ff09f9a8020206f6fc3a9a2646970667358221220d4d76dd4779a59a7441fb9bb913db03cd81f471f794c50fe50c37b26106da52464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b95b9387 {\n bool s_0;\n string s_1;\n string s_2;\n bool s_3;\n address s_4;\n }\n\n function test () public pure returns (S_b95b9387 memory) {\n S_b95b9387 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éoooo 🚀éM 🚀 oéMMoooooé ooo o\";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀Mé🚀é🚀🚀M🚀oMo🚀o 🚀ooo🚀🚀oMé🚀🚀o🚀oo🚀é🚀 o M o🚀 ooé\";\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xaB92CDD84623dD2FffAc6c438aB27D4008013F72;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab92cdd84623dd2fffac6c438ab27d4008013f7200000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80c3a96f6f6f6f20f09f9a80c3a94d20f09f9a80206fc3a94d4d6f6f6f6f6fc3a9206f6f6f206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a804dc3a9f09f9a80c3a9f09f9a80f09f9a804df09f9a806f4d6ff09f9a806f202020f09f9a806f6f6ff09f9a80f09f9a806f4dc3a9f09f9a80f09f9a806ff09f9a806f6ff09f9a80c3a9f09f9a80206f204d206ff09f9a8020206f6fc3a900000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string,uint192,uint96)[1]", + "type": "(bool,string,uint192,uint96)[1]", + "value": [ + [ + true, + "Moo é🚀oMMéo🚀ééMoM o🚀🚀oo 🚀o🚀oMM 🚀🚀 o", + "1719973027737116584387978042466882100443247099785247934393", + "7540142511990656111241834812" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀oMMéo🚀ééMoM o🚀🚀oo 🚀o🚀oMM 🚀🚀 o" + }, + { + "type": "number", + "value": "1719973027737116584387978042466882100443247099785247934393" + }, + { + "type": "number", + "value": "7540142511990656111241834812" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610121565b60405180910390f35b6100566100db565b61005e6100db565b6040805160808082018352606060208084018290526000848601819052918401829052600184528451928301909452604180835292939092906101f5908301396020830152507746255b35fa0414347a1689a8bff8708fd641f1852e5347b960408201526b185d0f489e165fc2967fb13c60608201528152919050565b60405180602001604052806001905b6040805160808101825260008082526060602080840182905293830182905282015282526000199092019101816100ea5790505090565b602080825260009060408382018185018685805b60018110156101e657601f19808a86030186528351608081511515875289820151818b890152805180838a01528692505b80831015610184578183018c015189840160a00152918b0191610166565b80831115610195578660a0828b0101525b838b01516001600160c01b0381168a8d015292506060938401516bffffffffffffffffffffffff81168a860152939250988b0198601f019093169690960160a0019550505091860191600101610135565b50919897505050505050505056fe4d6f6f20c3a9f09f9a806f4d4dc3a96ff09f9a80c3a9c3a94d6f4d20206ff09f9a80f09f9a806f6f20f09f9a806ff09f9a806f4d4d2020f09f9a80f09f9a80206fa26469706673582212206bc656726c10c54cf7a6144d9fd489c394d4bc4204c340b9cfa322abe4e3ceb364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_dca8d1f7 {\n bool s_0;\n string s_1;\n uint192 s_2;\n uint96 s_3;\n }\n\n function test () public pure returns (S_dca8d1f7[1] memory) {\n S_dca8d1f7[1] memory r;\n {\n S_dca8d1f7 memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀oMMéo🚀ééMoM o🚀🚀oo 🚀o🚀oMM 🚀🚀 o\";\n r_0.s_1 = r_0_1;\n }\n {\n uint192 r_0_2 = 1719973027737116584387978042466882100443247099785247934393;\n r_0.s_2 = r_0_2;\n }\n {\n uint96 r_0_3 = 7540142511990656111241834812;\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000046255b35fa0414347a1689a8bff8708fd641f1852e5347b90000000000000000000000000000000000000000185d0f489e165fc2967fb13c00000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a806f4d4dc3a96ff09f9a80c3a9c3a94d6f4d20206ff09f9a80f09f9a806f6f20f09f9a806ff09f9a806f4d4d2020f09f9a80f09f9a80206f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string[1],string,bytes8)", + "type": "(bool,string[1],string,bytes8)", + "value": [true, ["Moo é🚀"], "Moo é🚀🚀🚀", "0x8862131c5b41a1ed"], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀" + }, + { + "type": "hexstring", + "value": "0x8862131c5b41a1ed" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061024d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017b565b60405180910390f35b6100566100d7565b61005e6100d7565b6001815261006a610107565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352838101929092528051808201825260128152709adede418753e13f3501e13f3501e13f3560771b92810192909252820152678862131c5b41a1ed60c01b6060820152919050565b60405180608001604052806000151581526020016100f3610107565b815260606020820152600060409091015290565b60405180602001604052806001905b60608152602001906001900390816101165790505090565b6000815180845260005b8181101561015457602081850181015186830182015201610138565b81811115610166576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825115158282015282810151608060408401526000919060c084019060a08501845b60018110156101d157609f198785030182526101bf84845161012e565b935091840191908401906001016101a2565b5050506040850151848203601f1901606086015291506101f1818361012e565b915050606084015161020f60808501826001600160c01b0319169052565b50939250505056fea2646970667358221220b47966eaea7816f3813fa5da2a1ae60a72fd1cfaa049e4fca14ab00a06eaf6ea64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_18dd3ea4 {\n bool s_0;\n string[1] s_1;\n string s_2;\n bytes8 s_3;\n }\n\n function test () public pure returns (S_18dd3ea4 memory) {\n S_18dd3ea4 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n string[1] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀\";\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀🚀🚀\";\n r.s_2 = r_2;\n }\n {\n bytes8 r_3 = bytes8(0x8862131c5b41a1ed);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e08862131c5b41a1ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a80f09f9a80f09f9a800000000000000000000000000000" + }, + { + "name": "random-(bytes10,string,bytes4,(address,bool))", + "type": "(bytes10,string,bytes4,(address,bool))", + "value": [ + "0xc2e94ee6bd3bd036ec2a", + "Moo é🚀é🚀 Mo ééoMM MéMMo🚀🚀o🚀o 🚀", + "0xf216d829", + ["0x59F8DdDf8DE4ce294Ba243327C1bB5C1Bd7B7069", true] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc2e94ee6bd3bd036ec2a" + }, + { + "type": "string", + "value": "Moo é🚀é🚀 Mo ééoMM MéMMo🚀🚀o🚀o 🚀" + }, + { + "type": "hexstring", + "value": "0xf216d829" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x59F8DdDf8DE4ce294Ba243327C1bB5C1Bd7B7069" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610242806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610126565b60405180910390f35b60408051608080820183526000808352606060208085018290528486018390528551808701875283815280820184905282860152855193840186528284528381018290528386018390528551808701875283815280820184905284830152696174a7735e9de81b761560b11b8452855191820190955260358082529394929391929091906101d89083013960208381019190915263f216d82960e01b60408085019190915280518082019091527359f8dddf8de4ce294ba243327c1bb5c1bd7b70698152600191810191909152606083015250919050565b6000602080835269ffffffffffffffffffff60b01b845116818401528084015160a0604085015280518060c086015260005b818110156101745782810184015186820160e001528301610158565b8181111561018657600060e083880101525b5060408601516001600160e01b0319811660608701529250606086015180516001600160a01b031660808701526020810151151560a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a80c3a9f09f9a80204d6f20c3a9c3a96f4d4d204dc3a94d4d6ff09f9a80f09f9a806ff09f9a806f20f09f9a80a26469706673582212207bad7d5dc19cbfb91db2e5eff2fd23a5552265df196dd96c230552bb1dfe3b7e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5cde0d08 {\n address s_0;\n bool s_1;\n }\n\n struct S_661b564c {\n bytes10 s_0;\n string s_1;\n bytes4 s_2;\n S_5cde0d08 s_3;\n }\n\n function test () public pure returns (S_661b564c memory) {\n S_661b564c memory r;\n {\n bytes10 r_0 = bytes10(0xc2e94ee6bd3bd036ec2a);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀é🚀 Mo ééoMM MéMMo🚀🚀o🚀o 🚀\";\n r.s_1 = r_1;\n }\n {\n bytes4 r_2 = bytes4(0xf216d829);\n r.s_2 = r_2;\n }\n {\n S_5cde0d08 memory r_3;\n {\n address r_3_0 = 0x59F8DdDf8DE4ce294Ba243327C1bB5C1Bd7B7069;\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020c2e94ee6bd3bd036ec2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0f216d8290000000000000000000000000000000000000000000000000000000000000000000000000000000059f8dddf8de4ce294ba243327c1bb5c1bd7b7069000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a80c3a9f09f9a80204d6f20c3a9c3a96f4d4d204dc3a94d4d6ff09f9a80f09f9a806ff09f9a806f20f09f9a800000000000000000000000" + }, + { + "name": "random-(bytes11,bool,uint64,address,string)", + "type": "(bytes11,bool,uint64,address,string)", + "value": [ + "0xfa49df2809e552253c8019", + true, + "2479766837754982936", + "0x5D6c71b6886f275Cb5d4CC318e79d50da26Df991", + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfa49df2809e552253c8019" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "2479766837754982936" + }, + { + "type": "address", + "value": "0x5D6c71b6886f275Cb5d4CC318e79d50da26Df991" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101c4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a08082018352600080835260208084018290528385018290526060808501929092526080938401829052845192830185529282018181526afa49df2809e552253c801960a81b8352600183850152672269e6ccf22df21883860152735d6c71b6886f275cb5d4cc318e79d50da26df991918301919091528351808501909452600a8452689adede418753e13f3560b71b928401929092529190526040516100dc91906100e5565b60405180910390f35b600060208083526affffffffffffffffffffff60a81b84511681840152808401511515604084015267ffffffffffffffff604085015116606084015260018060a01b036060850151166080840152608084015160a08085015280518060c086015260005b818110156101655782810184015186820160e001528301610149565b8181111561017757600060e083880101525b50601f01601f19169390930160e00194935050505056fea26469706673582212205c02472652e5995a1d881f4945c5b7f57aff88921853bf3e35b201886c03088564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8e0b036e {\n bytes11 s_0;\n bool s_1;\n uint64 s_2;\n address s_3;\n string s_4;\n }\n\n function test () public pure returns (S_8e0b036e memory) {\n S_8e0b036e memory r;\n {\n bytes11 r_0 = bytes11(0xfa49df2809e552253c8019);\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n uint64 r_2 = 2479766837754982936;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x5D6c71b6886f275Cb5d4CC318e79d50da26Df991;\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020fa49df2809e552253c801900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000002269e6ccf22df2180000000000000000000000005d6c71b6886f275cb5d4cc318e79d50da26df99100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes13,int240,bool,address,bool)", + "type": "(bytes13,int240,bool,address,bool)", + "value": [ + "0x57adf218c76e026d9c63b7d834", + "324019450905474564599584975213104957372211815403909120373334937106086146", + true, + "0xd048A80C056229D1cf53431e3571dB4f6814A767", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x57adf218c76e026d9c63b7d834" + }, + { + "type": "number", + "value": "324019450905474564599584975213104957372211815403909120373334937106086146" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xd048A80C056229D1cf53431e3571dB4f6814A767" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061013b8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a080820183526000808352602080840182905283850182905260608085018390526080948501839052855180850187528086019384526c15eb7c8631db809b6718edf60d609a1b8082527d2ef28ca5a2e506dffeb7d3065f146e5541eb594e4117b5761b59747379028285019081526001838a0190815273d048a80c056229d1cf53431e3571db4f6814a76793850193845289519283529051601d0b948201949094529251151583880152516001600160a01b031690820152905115159281019290925291519081900390910190f3fea26469706673582212209dc661f0389c84e7da110530b86364e6a573cde8673743cfa3dbcafd801d0ecf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_48ead1e5 {\n bytes13 s_0;\n int240 s_1;\n bool s_2;\n address s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_48ead1e5 memory) {\n S_48ead1e5 memory r;\n {\n bytes13 r_0 = bytes13(0x57adf218c76e026d9c63b7d834);\n r.s_0 = r_0;\n }\n {\n int240 r_1 = 324019450905474564599584975213104957372211815403909120373334937106086146;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xd048A80C056229D1cf53431e3571dB4f6814A767;\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x57adf218c76e026d9c63b7d8340000000000000000000000000000000000000000002ef28ca5a2e506dffeb7d3065f146e5541eb594e4117b5761b59747379020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d048a80c056229d1cf53431e3571db4f6814a7670000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes13[2])[2][1][4]", + "type": "(bytes13[2])[2][1][4]", + "value": [ + [ + [ + [["0x4ca5b00e7c01eda53d7422d26a", "0xc170b44a2f7aaf88f44c1f84b4"]], + [["0x96cb6fb0cfce79bdbe072bb2ef", "0x928b22537a3cbdc481c2edb826"]] + ] + ], + [ + [ + [["0x03e37db0c7f37cde3e8eeb0a46", "0x49f47e755d4a7d0d6c87b7d07f"]], + [["0x7d11b8207d367187b18f60fc60", "0xd10e849f27c3ab6ea71e0d7250"]] + ] + ], + [ + [ + [["0x3c4f5f56f619229c4e7cffcba7", "0xc481efa7b09dec83cac3653ab3"]], + [["0xbea7bdb090b79643480d12edb8", "0x5afe4ab0dd76c49c12b52fbf39"]] + ] + ], + [ + [ + [["0xaccde71d949dedac047e9dc015", "0xf9f00338306e6dc47ced7fea6d"]], + [["0xf6866955ed2fef1a6e12247f10", "0x43cb596eddca6ad993f86228cd"]] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4ca5b00e7c01eda53d7422d26a" + }, + { + "type": "hexstring", + "value": "0xc170b44a2f7aaf88f44c1f84b4" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x96cb6fb0cfce79bdbe072bb2ef" + }, + { + "type": "hexstring", + "value": "0x928b22537a3cbdc481c2edb826" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x03e37db0c7f37cde3e8eeb0a46" + }, + { + "type": "hexstring", + "value": "0x49f47e755d4a7d0d6c87b7d07f" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7d11b8207d367187b18f60fc60" + }, + { + "type": "hexstring", + "value": "0xd10e849f27c3ab6ea71e0d7250" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3c4f5f56f619229c4e7cffcba7" + }, + { + "type": "hexstring", + "value": "0xc481efa7b09dec83cac3653ab3" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbea7bdb090b79643480d12edb8" + }, + { + "type": "hexstring", + "value": "0x5afe4ab0dd76c49c12b52fbf39" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xaccde71d949dedac047e9dc015" + }, + { + "type": "hexstring", + "value": "0xf9f00338306e6dc47ced7fea6d" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf6866955ed2fef1a6e12247f10" + }, + { + "type": "hexstring", + "value": "0x43cb596eddca6ad993f86228cd" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061047e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061037c565b60405180910390f35b6100566102bf565b61005e6102bf565b6100666102ec565b61006e610319565b610076610346565b61007e61035e565b6c2652d8073e00f6d29eba11693560991b81526c305c2d128bdeabe23d1307e12d609a1b6020820152815281526100b3610346565b6100bb61035e565b6c96cb6fb0cfce79bdbe072bb2ef60981b81526c49459129bd1e5ee240e176dc1360991b602080830191909152908252820152815281526100fa6102ec565b610102610319565b61010a610346565b61011261035e565b6c01f1bed863f9be6f1f4775852360991b81526c49f47e755d4a7d0d6c87b7d07f60981b602082015281528152610147610346565b61014f61035e565b6c03e88dc103e9b38c3d8c7b07e3609d1b81526c0d10e849f27c3ab6ea71e0d725609c1b602080830191909152908252828101919091529082528201526101946102ec565b61019c610319565b6101a4610346565b6101ac61035e565b6c3c4f5f56f619229c4e7cffcba760981b81526cc481efa7b09dec83cac3653ab360981b6020820152815281526101e1610346565b6101e961035e565b6c17d4f7b61216f2c86901a25db7609b1b81526c5afe4ab0dd76c49c12b52fbf3960981b6020808301919091529082528201528152604082015261022b6102ec565b610233610319565b61023b610346565b61024361035e565b6caccde71d949dedac047e9dc01560981b81526cf9f00338306e6dc47ced7fea6d60981b602082015281528152610278610346565b61028061035e565b6c0f6866955ed2fef1a6e12247f1609c1b81526c43cb596eddca6ad993f86228cd60981b60208083019190915290825282015281526060820152919050565b60405180608001604052806004905b6102d66102ec565b8152602001906001900390816102ce5790505090565b60405180602001604052806001905b610303610319565b8152602001906001900390816102fb5790505090565b60405180604001604052806002905b610330610346565b8152602001906001900390816103285790505090565b604051806020016040528061035961035e565b905290565b60405180604001604052806002906020820280368337509192915050565b6102008101818360005b600481101561043f5781518360005b60018082106103a45750610426565b83518360005b60028082106103b9575061040c565b8351518360005b838110156103f357825172ffffffffffffffffffffffffffffffffffffff191682526020928301929091019087016103c0565b50505060209390930192506040919091019083016103aa565b505050602093909301925060809190910190600101610395565b5050506080929092019160209190910190600101610386565b5050509291505056fea264697066735822122029c8da50c4ae1a505fbcbbf9e6ec0f84bd809d0e8bbac60eeb04ef3d257b58db64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4bd3a9e6 {\n bytes13[2] s_0;\n }\n\n function test () public pure returns (S_4bd3a9e6[2][1][4] memory) {\n S_4bd3a9e6[2][1][4] memory r;\n {\n S_4bd3a9e6[2][1] memory r_0;\n {\n S_4bd3a9e6[2] memory r_0_0;\n {\n S_4bd3a9e6 memory r_0_0_0;\n {\n bytes13[2] memory r_0_0_0_0;\n {\n bytes13 r_0_0_0_0_0 = bytes13(0x4ca5b00e7c01eda53d7422d26a);\n r_0_0_0_0[0] = r_0_0_0_0_0;\n }\n {\n bytes13 r_0_0_0_0_1 = bytes13(0xc170b44a2f7aaf88f44c1f84b4);\n r_0_0_0_0[1] = r_0_0_0_0_1;\n }\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_4bd3a9e6 memory r_0_0_1;\n {\n bytes13[2] memory r_0_0_1_0;\n {\n bytes13 r_0_0_1_0_0 = bytes13(0x96cb6fb0cfce79bdbe072bb2ef);\n r_0_0_1_0[0] = r_0_0_1_0_0;\n }\n {\n bytes13 r_0_0_1_0_1 = bytes13(0x928b22537a3cbdc481c2edb826);\n r_0_0_1_0[1] = r_0_0_1_0_1;\n }\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_4bd3a9e6[2][1] memory r_1;\n {\n S_4bd3a9e6[2] memory r_1_0;\n {\n S_4bd3a9e6 memory r_1_0_0;\n {\n bytes13[2] memory r_1_0_0_0;\n {\n bytes13 r_1_0_0_0_0 = bytes13(0x03e37db0c7f37cde3e8eeb0a46);\n r_1_0_0_0[0] = r_1_0_0_0_0;\n }\n {\n bytes13 r_1_0_0_0_1 = bytes13(0x49f47e755d4a7d0d6c87b7d07f);\n r_1_0_0_0[1] = r_1_0_0_0_1;\n }\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n S_4bd3a9e6 memory r_1_0_1;\n {\n bytes13[2] memory r_1_0_1_0;\n {\n bytes13 r_1_0_1_0_0 = bytes13(0x7d11b8207d367187b18f60fc60);\n r_1_0_1_0[0] = r_1_0_1_0_0;\n }\n {\n bytes13 r_1_0_1_0_1 = bytes13(0xd10e849f27c3ab6ea71e0d7250);\n r_1_0_1_0[1] = r_1_0_1_0_1;\n }\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n r_1_0[1] = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_4bd3a9e6[2][1] memory r_2;\n {\n S_4bd3a9e6[2] memory r_2_0;\n {\n S_4bd3a9e6 memory r_2_0_0;\n {\n bytes13[2] memory r_2_0_0_0;\n {\n bytes13 r_2_0_0_0_0 = bytes13(0x3c4f5f56f619229c4e7cffcba7);\n r_2_0_0_0[0] = r_2_0_0_0_0;\n }\n {\n bytes13 r_2_0_0_0_1 = bytes13(0xc481efa7b09dec83cac3653ab3);\n r_2_0_0_0[1] = r_2_0_0_0_1;\n }\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n S_4bd3a9e6 memory r_2_0_1;\n {\n bytes13[2] memory r_2_0_1_0;\n {\n bytes13 r_2_0_1_0_0 = bytes13(0xbea7bdb090b79643480d12edb8);\n r_2_0_1_0[0] = r_2_0_1_0_0;\n }\n {\n bytes13 r_2_0_1_0_1 = bytes13(0x5afe4ab0dd76c49c12b52fbf39);\n r_2_0_1_0[1] = r_2_0_1_0_1;\n }\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n r_2_0[1] = r_2_0_1;\n }\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n {\n S_4bd3a9e6[2][1] memory r_3;\n {\n S_4bd3a9e6[2] memory r_3_0;\n {\n S_4bd3a9e6 memory r_3_0_0;\n {\n bytes13[2] memory r_3_0_0_0;\n {\n bytes13 r_3_0_0_0_0 = bytes13(0xaccde71d949dedac047e9dc015);\n r_3_0_0_0[0] = r_3_0_0_0_0;\n }\n {\n bytes13 r_3_0_0_0_1 = bytes13(0xf9f00338306e6dc47ced7fea6d);\n r_3_0_0_0[1] = r_3_0_0_0_1;\n }\n r_3_0_0.s_0 = r_3_0_0_0;\n }\n r_3_0[0] = r_3_0_0;\n }\n {\n S_4bd3a9e6 memory r_3_0_1;\n {\n bytes13[2] memory r_3_0_1_0;\n {\n bytes13 r_3_0_1_0_0 = bytes13(0xf6866955ed2fef1a6e12247f10);\n r_3_0_1_0[0] = r_3_0_1_0_0;\n }\n {\n bytes13 r_3_0_1_0_1 = bytes13(0x43cb596eddca6ad993f86228cd);\n r_3_0_1_0[1] = r_3_0_1_0_1;\n }\n r_3_0_1.s_0 = r_3_0_1_0;\n }\n r_3_0[1] = r_3_0_1;\n }\n r_3[0] = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x4ca5b00e7c01eda53d7422d26a00000000000000000000000000000000000000c170b44a2f7aaf88f44c1f84b40000000000000000000000000000000000000096cb6fb0cfce79bdbe072bb2ef00000000000000000000000000000000000000928b22537a3cbdc481c2edb8260000000000000000000000000000000000000003e37db0c7f37cde3e8eeb0a460000000000000000000000000000000000000049f47e755d4a7d0d6c87b7d07f000000000000000000000000000000000000007d11b8207d367187b18f60fc6000000000000000000000000000000000000000d10e849f27c3ab6ea71e0d7250000000000000000000000000000000000000003c4f5f56f619229c4e7cffcba700000000000000000000000000000000000000c481efa7b09dec83cac3653ab300000000000000000000000000000000000000bea7bdb090b79643480d12edb8000000000000000000000000000000000000005afe4ab0dd76c49c12b52fbf3900000000000000000000000000000000000000accde71d949dedac047e9dc01500000000000000000000000000000000000000f9f00338306e6dc47ced7fea6d00000000000000000000000000000000000000f6866955ed2fef1a6e12247f100000000000000000000000000000000000000043cb596eddca6ad993f86228cd00000000000000000000000000000000000000" + }, + { + "name": "random-(bytes14,address,bool,bytes32)[4]", + "type": "(bytes14,address,bool,bytes32)[4]", + "value": [ + [ + "0xc599c9cae1569a7e05fc31603fef", + "0x82b3ac567c90740Fb1A7f3B2eF9FF6d5adAF4476", + false, + "0x92ec84952b4bd4a60f22f2d0a9bcd8d6f9237577e750d688fa7509dd13f7b6ac" + ], + [ + "0x28d113f46abef3a0489073c77d64", + "0x1EdAA122777632B4c21F60004b4c0DD5725f15C8", + false, + "0x06f9a40462c552a8bcc7272128d25dc68eb12fbf8aa74c10636c562ade99fe89" + ], + [ + "0xbbe74c501889f481faefa4d2d3f8", + "0x3905C24Fd36d9c7D230784E4fE987D8c7fD60a31", + true, + "0xe4438bfe53724608a325d0b04e767dae44e2d7187c7627da340570b0700b4caa" + ], + [ + "0x224da45e646486c182232f51ddad", + "0x99f17A7C4868A9acE4188fE5f6e63BfE6AaAdfeA", + false, + "0x42529bd61fe0b698ffbc414e49bc941b7c4fb1e2e2622ec549b6a7c436aab007" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc599c9cae1569a7e05fc31603fef" + }, + { + "type": "address", + "value": "0x82b3ac567c90740Fb1A7f3B2eF9FF6d5adAF4476" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x92ec84952b4bd4a60f22f2d0a9bcd8d6f9237577e750d688fa7509dd13f7b6ac" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x28d113f46abef3a0489073c77d64" + }, + { + "type": "address", + "value": "0x1EdAA122777632B4c21F60004b4c0DD5725f15C8" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x06f9a40462c552a8bcc7272128d25dc68eb12fbf8aa74c10636c562ade99fe89" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xbbe74c501889f481faefa4d2d3f8" + }, + { + "type": "address", + "value": "0x3905C24Fd36d9c7D230784E4fE987D8c7fD60a31" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xe4438bfe53724608a325d0b04e767dae44e2d7187c7627da340570b0700b4caa" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x224da45e646486c182232f51ddad" + }, + { + "type": "address", + "value": "0x99f17A7C4868A9acE4188fE5f6e63BfE6AaAdfeA" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x42529bd61fe0b698ffbc414e49bc941b7c4fb1e2e2622ec549b6a7c436aab007" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102ef806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610244565b60405180910390f35b6100566101fe565b61005e6101fe565b604080516080808201835260008284018190526dc599c9cae1569a7e05fc31603fef60901b83527382b3ac567c90740fb1a7f3b2ef9ff6d5adaf44766020808501919091527f92ec84952b4bd4a60f22f2d0a9bcd8d6f9237577e750d688fa7509dd13f7b6ac606080860191909152938652845180840186528086018390526d0a3444fd1aafbce812241cf1df5960921b8152731edaa122777632b4c21f60004b4c0dd5725f15c8818301527f06f9a40462c552a8bcc7272128d25dc68eb12fbf8aa74c10636c562ade99fe898186015286820152845180840186526d177ce98a03113e903f5df49a5a7f60931b8152733905c24fd36d9c7d230784e4fe987d8c7fd60a31818301526001818701527fe4438bfe53724608a325d0b04e767dae44e2d7187c7627da340570b0700b4caa818601528686015284519283018552938201526d224da45e646486c182232f51ddad60901b81527399f17a7c4868a9ace4188fe5f6e63bfe6aaadfea928101929092527f42529bd61fe0b698ffbc414e49bc941b7c4fb1e2e2622ec549b6a7c436aab00782820152820152919050565b60405180608001604052806004905b60408051608081018252600080825260208083018290529282018190526060820152825260001990920191018161020d5790505090565b6102008101818360005b60048110156102b0578151805171ffffffffffffffffffffffffffffffffffff191684526020808201516001600160a01b031681860152604080830151151590860152606091820151918501919091526080909301929091019060010161024e565b5050509291505056fea2646970667358221220d1bb1cef4269db95d1ba074be06876956d9a5ea019fb2110ef7129ee724ecde164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bbae13a7 {\n bytes14 s_0;\n address s_1;\n bool s_2;\n bytes32 s_3;\n }\n\n function test () public pure returns (S_bbae13a7[4] memory) {\n S_bbae13a7[4] memory r;\n {\n S_bbae13a7 memory r_0;\n {\n bytes14 r_0_0 = bytes14(0xc599c9cae1569a7e05fc31603fef);\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x82b3ac567c90740Fb1A7f3B2eF9FF6d5adAF4476;\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n {\n bytes32 r_0_3 = bytes32(0x92ec84952b4bd4a60f22f2d0a9bcd8d6f9237577e750d688fa7509dd13f7b6ac);\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_bbae13a7 memory r_1;\n {\n bytes14 r_1_0 = bytes14(0x28d113f46abef3a0489073c77d64);\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x1EdAA122777632B4c21F60004b4c0DD5725f15C8;\n r_1.s_1 = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1.s_2 = r_1_2;\n }\n {\n bytes32 r_1_3 = bytes32(0x06f9a40462c552a8bcc7272128d25dc68eb12fbf8aa74c10636c562ade99fe89);\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_bbae13a7 memory r_2;\n {\n bytes14 r_2_0 = bytes14(0xbbe74c501889f481faefa4d2d3f8);\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x3905C24Fd36d9c7D230784E4fE987D8c7fD60a31;\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2.s_2 = r_2_2;\n }\n {\n bytes32 r_2_3 = bytes32(0xe4438bfe53724608a325d0b04e767dae44e2d7187c7627da340570b0700b4caa);\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n {\n S_bbae13a7 memory r_3;\n {\n bytes14 r_3_0 = bytes14(0x224da45e646486c182232f51ddad);\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0x99f17A7C4868A9acE4188fE5f6e63BfE6AaAdfeA;\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = false;\n r_3.s_2 = r_3_2;\n }\n {\n bytes32 r_3_3 = bytes32(0x42529bd61fe0b698ffbc414e49bc941b7c4fb1e2e2622ec549b6a7c436aab007);\n r_3.s_3 = r_3_3;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xc599c9cae1569a7e05fc31603fef00000000000000000000000000000000000000000000000000000000000082b3ac567c90740fb1a7f3b2ef9ff6d5adaf4476000000000000000000000000000000000000000000000000000000000000000092ec84952b4bd4a60f22f2d0a9bcd8d6f9237577e750d688fa7509dd13f7b6ac28d113f46abef3a0489073c77d640000000000000000000000000000000000000000000000000000000000001edaa122777632b4c21f60004b4c0dd5725f15c8000000000000000000000000000000000000000000000000000000000000000006f9a40462c552a8bcc7272128d25dc68eb12fbf8aa74c10636c562ade99fe89bbe74c501889f481faefa4d2d3f80000000000000000000000000000000000000000000000000000000000003905c24fd36d9c7d230784e4fe987d8c7fd60a310000000000000000000000000000000000000000000000000000000000000001e4438bfe53724608a325d0b04e767dae44e2d7187c7627da340570b0700b4caa224da45e646486c182232f51ddad00000000000000000000000000000000000000000000000000000000000099f17a7c4868a9ace4188fe5f6e63bfe6aaadfea000000000000000000000000000000000000000000000000000000000000000042529bd61fe0b698ffbc414e49bc941b7c4fb1e2e2622ec549b6a7c436aab007" + }, + { + "name": "random-(bytes21[3],string,address,bool)", + "type": "(bytes21[3],string,address,bool)", + "value": [ + [ + "0x1140e217f2bcc3e363bdb905087f2a46afb742da9b", + "0x70a00b1e0d18f6121ebe01fb40f4b13dfbca59f4ae", + "0x606e4f32192bac1e71de22db31502fddc3a9c798af" + ], + "Moo é🚀🚀ooMéooMé 🚀Méo éM 🚀🚀oééo oMo🚀 oo 🚀🚀MéoooMoo MM ", + "0xbf1055e9E535723f3fe3F631B12f0484894942eb", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1140e217f2bcc3e363bdb905087f2a46afb742da9b" + }, + { + "type": "hexstring", + "value": "0x70a00b1e0d18f6121ebe01fb40f4b13dfbca59f4ae" + }, + { + "type": "hexstring", + "value": "0x606e4f32192bac1e71de22db31502fddc3a9c798af" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀ooMéooMé 🚀Méo éM 🚀🚀oééo oMo🚀 oo 🚀🚀MéoooMoo MM " + }, + { + "type": "address", + "value": "0xbf1055e9E535723f3fe3F631B12f0484894942eb" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061029e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610158565b60405180910390f35b61005661010d565b61005e61010d565b61006661013a565b741140e217f2bcc3e363bdb905087f2a46afb742da9b60581b8152743850058f068c7b090f5f00fda07a589efde52cfa5760591b60208083019190915274606e4f32192bac1e71de22db31502fddc3a9c798af60581b6040808401919091529183528151608081019092526055808352600092916102149083013960208301525073bf1055e9e535723f3fe3f631b12f0484894942eb604082015260006060820152919050565b604051806080016040528061012061013a565b815260606020820181905260006040830181905291015290565b60405180606001604052806003906020820280368337509192915050565b6020808252825160009190828483015b60038210156101955782516affffffffffffffffffffff1916815291830191600191909101908301610168565b5050508084015160c0608085015280518060e086015260005b818110156101cb57828101840151868201610100015283016101ae565b818111156101de57600061010083880101525b5060408601516001600160a01b031660a0860152606090950151151560c0850152505050601f909101601f191601610100019056fe4d6f6f20c3a9f09f9a80f09f9a806f6f4dc3a96f6f4dc3a920f09f9a804dc3a96f20c3a94d20f09f9a80f09f9a806fc3a9c3a96f206f4d6ff09f9a80206f6f20f09f9a80f09f9a804dc3a96f6f6f4d6f6f204d4d20a26469706673582212205d83e63703ecea782b8780b774102c3f05a2a8f4cebedc0202350c280496ebf564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f0eb260a {\n bytes21[3] s_0;\n string s_1;\n address s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_f0eb260a memory) {\n S_f0eb260a memory r;\n {\n bytes21[3] memory r_0;\n {\n bytes21 r_0_0 = bytes21(0x1140e217f2bcc3e363bdb905087f2a46afb742da9b);\n r_0[0] = r_0_0;\n }\n {\n bytes21 r_0_1 = bytes21(0x70a00b1e0d18f6121ebe01fb40f4b13dfbca59f4ae);\n r_0[1] = r_0_1;\n }\n {\n bytes21 r_0_2 = bytes21(0x606e4f32192bac1e71de22db31502fddc3a9c798af);\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀ooMéooMé 🚀Méo éM 🚀🚀oééo oMo🚀 oo 🚀🚀MéoooMoo MM \";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xbf1055e9E535723f3fe3F631B12f0484894942eb;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000201140e217f2bcc3e363bdb905087f2a46afb742da9b000000000000000000000070a00b1e0d18f6121ebe01fb40f4b13dfbca59f4ae0000000000000000000000606e4f32192bac1e71de22db31502fddc3a9c798af000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000bf1055e9e535723f3fe3f631b12f0484894942eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a80f09f9a806f6f4dc3a96f6f4dc3a920f09f9a804dc3a96f20c3a94d20f09f9a80f09f9a806fc3a9c3a96f206f4d6ff09f9a80206f6f20f09f9a80f09f9a804dc3a96f6f6f4d6f6f204d4d200000000000000000000000" + }, + { + "name": "random-(bytes23,string,string,string,string)", + "type": "(bytes23,string,string,string,string)", + "value": [ + "0x37c09fb5d774a5415957ffd3b0aabf243fa4a6fa567cfd", + "Moo é🚀éM", + "Moo é🚀", + "Moo é🚀o 🚀 🚀ooooM MM🚀oéooM🚀oMo🚀Méé 🚀ooéMé éoéo", + "Moo é🚀oM🚀🚀o oéoééMo 🚀 oo éM🚀🚀éo Mo🚀🚀oo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x37c09fb5d774a5415957ffd3b0aabf243fa4a6fa567cfd" + }, + { + "type": "string", + "value": "Moo é🚀éM" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o 🚀 🚀ooooM MM🚀oéooM🚀oMo🚀Méé 🚀ooéMé éoéo" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀🚀o oéoééMo 🚀 oo éM🚀🚀éo Mo🚀🚀oo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610326806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ce565b60405180910390f35b61008c6040518060a00160405280600068ffffffffffffffffff19168152602001606081526020016060815260200160608152602001606081525090565b6100ca6040518060a00160405280600068ffffffffffffffffff19168152602001606081526020016060815260200160608152602001606081525090565b7f37c09fb5d774a5415957ffd3b0aabf243fa4a6fa567cfd0000000000000000008152604080518082018252600d81526c4d6f6f20c3a9f09f9a80c3a94d60981b6020808301919091528084019190915281518083018352600a8152689adede418753e13f3560b71b8183015282840152815160808101909252604a808352600092916102639083013960608301525060408051608081019091526044808252600091906102ad6020830139608083015250919050565b6000815180845260005b818110156101a75760208185018101518683018201520161018b565b818111156101b9576000602083870101525b50601f01601f19169290920160200192915050565b6020815268ffffffffffffffffff1982511660208201526000602083015160a0604084015261020060c0840182610181565b90506040840151601f198085840301606086015261021e8383610181565b9250606086015191508085840301608086015261023b8383610181565b925060808601519150808584030160a0860152506102598282610181565b9594505050505056fe4d6f6f20c3a9f09f9a806f20f09f9a8020f09f9a806f6f6f6f4d204d4df09f9a806fc3a96f6f4df09f9a806f4d6ff09f9a804dc3a9c3a920f09f9a806f6fc3a94dc3a920c3a96fc3a96f4d6f6f20c3a9f09f9a806f4df09f9a80f09f9a806f206fc3a96fc3a9c3a94d6f20f09f9a80206f6f20c3a94df09f9a80f09f9a80c3a96f204d6ff09f9a80f09f9a806f6fa26469706673582212205e372c62f792d01365b7760e402001b8cdec69603c1a5b1b77bc49513cc19b5b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7af988e9 {\n bytes23 s_0;\n string s_1;\n string s_2;\n string s_3;\n string s_4;\n }\n\n function test () public pure returns (S_7af988e9 memory) {\n S_7af988e9 memory r;\n {\n bytes23 r_0 = bytes23(0x37c09fb5d774a5415957ffd3b0aabf243fa4a6fa567cfd);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éM\";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀o 🚀 🚀ooooM MM🚀oéooM🚀oMo🚀Méé 🚀ooéMé éoéo\";\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀oM🚀🚀o oéoééMo 🚀 oo éM🚀🚀éo Mo🚀🚀oo\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002037c09fb5d774a5415957ffd3b0aabf243fa4a6fa567cfd00000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a80c3a94d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f20f09f9a8020f09f9a806f6f6f6f4d204d4df09f9a806fc3a96f6f4df09f9a806f4d6ff09f9a804dc3a9c3a920f09f9a806f6fc3a94dc3a920c3a96fc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a806f4df09f9a80f09f9a806f206fc3a96fc3a9c3a94d6f20f09f9a80206f6f20c3a94df09f9a80f09f9a80c3a96f204d6ff09f9a80f09f9a806f6f00000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes28,(bytes10)[4],string,address)", + "type": "(bytes28,(bytes10)[4],string,address)", + "value": [ + "0x0f320fb4415aa668de724dcc5ea21ed90c7987faebb2f9cc932c2935", + [ + ["0x4fbccb84955a376728f8"], + ["0xf158032c7d0059e19300"], + ["0xc91921780ab90a820577"], + ["0x4aad0e55106915f85676"] + ], + "Moo é🚀oé🚀éoéMoéMMM ooé 🚀oMéoM🚀Mo🚀🚀oooo🚀🚀é oMoMo", + "0xdC6E99d224df3F04cCD425E172838B722E098692" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0f320fb4415aa668de724dcc5ea21ed90c7987faebb2f9cc932c2935" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4fbccb84955a376728f8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf158032c7d0059e19300" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc91921780ab90a820577" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4aad0e55106915f85676" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oé🚀éoéMoéMMM ooé 🚀oMéoM🚀Mo🚀🚀oooo🚀🚀é oMoMo" + }, + { + "type": "address", + "value": "0xdC6E99d224df3F04cCD425E172838B722E098692" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102e4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019f565b60405180910390f35b61005661013c565b61005e61013c565b7f0f320fb4415aa668de724dcc5ea21ed90c7987faebb2f9cc932c293500000000815261008961016b565b60408051602080820183526909f7997092ab46ece51f60b31b82529083528151808201835268f158032c7d0059e19360b81b8152838201528151808201835269c91921780ab90a82057760b01b81528383015281518082018352692556872a88348afc2b3b60b11b8152606084015283810192909252805160808101909152604f8082526000926102609083013960408301525073dc6e99d224df3f04ccd425e172838b722e0986926060820152919050565b6040805160808101909152600081526020810161015761016b565b815260606020820152600060409091015290565b60405180608001604052806004905b60408051602081019091526000815281526020019060019003908161017a5790505090565b6000602080835263ffffffff1984511681840152808401516040840160005b60048110156101e6578251516001600160b01b031916825291830191908301906001016101be565b505050604084015160e060c085015280518061010086015260005b8181101561021e5782810184015186820161012001528301610201565b8181111561023157600061012083880101525b5060608601516001600160a01b03811660e08701529250601f01601f1916939093016101200194935050505056fe4d6f6f20c3a9f09f9a806fc3a9f09f9a80c3a96fc3a94d6fc3a94d4d4d206f6fc3a920f09f9a806f4dc3a96f4df09f9a804d6ff09f9a80f09f9a806f6f6f6ff09f9a80f09f9a80c3a9206f4d6f4d6fa2646970667358221220718bee6e4a998fd8c133cdadf08439fb9d6be5c5d34de629813e45a207e765a164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6ebf9ebb {\n bytes10 s_0;\n }\n\n struct S_223b0547 {\n bytes28 s_0;\n S_6ebf9ebb[4] s_1;\n string s_2;\n address s_3;\n }\n\n function test () public pure returns (S_223b0547 memory) {\n S_223b0547 memory r;\n {\n bytes28 r_0 = bytes28(0x0f320fb4415aa668de724dcc5ea21ed90c7987faebb2f9cc932c2935);\n r.s_0 = r_0;\n }\n {\n S_6ebf9ebb[4] memory r_1;\n {\n S_6ebf9ebb memory r_1_0;\n {\n bytes10 r_1_0_0 = bytes10(0x4fbccb84955a376728f8);\n r_1_0.s_0 = r_1_0_0;\n }\n r_1[0] = r_1_0;\n }\n {\n S_6ebf9ebb memory r_1_1;\n {\n bytes10 r_1_1_0 = bytes10(0xf158032c7d0059e19300);\n r_1_1.s_0 = r_1_1_0;\n }\n r_1[1] = r_1_1;\n }\n {\n S_6ebf9ebb memory r_1_2;\n {\n bytes10 r_1_2_0 = bytes10(0xc91921780ab90a820577);\n r_1_2.s_0 = r_1_2_0;\n }\n r_1[2] = r_1_2;\n }\n {\n S_6ebf9ebb memory r_1_3;\n {\n bytes10 r_1_3_0 = bytes10(0x4aad0e55106915f85676);\n r_1_3.s_0 = r_1_3_0;\n }\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oé🚀éoéMoéMMM ooé 🚀oMéoM🚀Mo🚀🚀oooo🚀🚀é oMoMo\";\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xdC6E99d224df3F04cCD425E172838B722E098692;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200f320fb4415aa668de724dcc5ea21ed90c7987faebb2f9cc932c2935000000004fbccb84955a376728f800000000000000000000000000000000000000000000f158032c7d0059e1930000000000000000000000000000000000000000000000c91921780ab90a820577000000000000000000000000000000000000000000004aad0e55106915f856760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000dc6e99d224df3f04ccd425e172838b722e098692000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a806fc3a9f09f9a80c3a96fc3a94d6fc3a94d4d4d206f6fc3a920f09f9a806f4dc3a96f4df09f9a804d6ff09f9a80f09f9a806f6f6f6ff09f9a80f09f9a80c3a9206f4d6f4d6f0000000000000000000000000000000000" + }, + { + "name": "random-(bytes29,string,uint24,int32,address)", + "type": "(bytes29,string,uint24,int32,address)", + "value": [ + "0x3b35b83cab60e32863926252577aafcd498de218571e51cb28b56c3b02", + "Moo é🚀oM🚀MéMMoo🚀ééM🚀 o🚀ooo🚀oMo🚀o éoo o🚀oéMéo M ", + "12413609", + "691121706", + "0x163AC8c9B73BEc3B423Ce1cA3A6bDCc85e804CFd" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3b35b83cab60e32863926252577aafcd498de218571e51cb28b56c3b02" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀MéMMoo🚀ééM🚀 o🚀ooo🚀oMo🚀o éoo o🚀oéMéo M " + }, + { + "type": "number", + "value": "12413609" + }, + { + "type": "number", + "value": "691121706" + }, + { + "type": "address", + "value": "0x163AC8c9B73BEc3B423Ce1cA3A6bDCc85e804CFd" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061024f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011d565b60405180910390f35b6040805160a081018252600080825260606020830181905292820181905291810182905260808101919091526040805160a081018252600080825260606020830181905292820181905291810182905260808101919091527f3b35b83cab60e32863926252577aafcd498de218571e51cb28b56c3b02000000815260408051608081019091526050808252600091906101ca602083013960208301525062bd6aa96040820152632931ae2a606082015273163ac8c9b73bec3b423ce1ca3a6bdcc85e804cfd6080820152919050565b6000602080835262ffffff19845116818401528084015160a0604085015280518060c086015260005b818110156101625782810184015186820160e001528301610146565b8181111561017457600060e083880101525b50604086015162ffffff8116606087015292506060860151925061019d608086018460030b9052565b60808601516001600160a01b03811660a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806f4df09f9a804dc3a94d4d6f6ff09f9a80c3a9c3a94df09f9a80206ff09f9a806f6f6ff09f9a806f4d6ff09f9a806f20c3a96f6f206ff09f9a806fc3a94dc3a96f2020204d20a26469706673582212209fdd97238f78f044a63eb5eb613addd87ccc5fecbddf392802471f76a82e096164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e2840c1c {\n bytes29 s_0;\n string s_1;\n uint24 s_2;\n int32 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_e2840c1c memory) {\n S_e2840c1c memory r;\n {\n bytes29 r_0 = bytes29(0x3b35b83cab60e32863926252577aafcd498de218571e51cb28b56c3b02);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oM🚀MéMMoo🚀ééM🚀 o🚀ooo🚀oMo🚀o éoo o🚀oéMéo M \";\n r.s_1 = r_1;\n }\n {\n uint24 r_2 = 12413609;\n r.s_2 = r_2;\n }\n {\n int32 r_3 = 691121706;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x163AC8c9B73BEc3B423Ce1cA3A6bDCc85e804CFd;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000203b35b83cab60e32863926252577aafcd498de218571e51cb28b56c3b0200000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000bd6aa9000000000000000000000000000000000000000000000000000000002931ae2a000000000000000000000000163ac8c9b73bec3b423ce1ca3a6bdcc85e804cfd00000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a806f4df09f9a804dc3a94d4d6f6ff09f9a80c3a9c3a94df09f9a80206ff09f9a806f6f6ff09f9a806f4d6ff09f9a806f20c3a96f6f206ff09f9a806fc3a94dc3a96f2020204d2000000000000000000000000000000000" + }, + { + "name": "random-(bytes3,address,int144,string,int96)", + "type": "(bytes3,address,int144,string,int96)", + "value": [ + "0x8b5992", + "0xB18D8abd93C209f547A6f7aaD6E9c50D2C77223D", + "3552864244224561287885398794880727325626096", + "Moo é🚀o🚀é🚀MMo 🚀éo M é", + "-12602500443315503724777103930" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8b5992" + }, + { + "type": "address", + "value": "0xB18D8abd93C209f547A6f7aaD6E9c50D2C77223D" + }, + { + "type": "number", + "value": "3552864244224561287885398794880727325626096" + }, + { + "type": "string", + "value": "Moo é🚀o🚀é🚀MMo 🚀éo M é" + }, + { + "type": "number", + "value": "-12602500443315503724777103930" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610201806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610101565b60405180910390f35b6040805160a0808201835260008083526020808401829052838501829052606080850181905260808086018490528651948501875284820182905284018390526245acc960e91b845273b18d8abd93c209f547a6f7aad6e9c50d2c77223d848301527128c8edfba125a773a96d713e808822a44ef0848701528551908101909552602580865293949293919291906101a7908301396060830152506b28b88b45f8385df84532e239196080820152919050565b6000602080835262ffffff60e81b8451168184015260018060a01b0381850151166040840152604084015160110b6060840152606084015160a0608085015280518060c086015260005b818110156101675782810184015186820160e00152830161014b565b8181111561017957600060e083880101525b506080860151925061019060a0860184600b0b9052565b601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806ff09f9a80c3a9f09f9a804d4d6f20f09f9a80c3a96f204d20c3a9a26469706673582212208999a8ef46784b1c2a9abca2780ffff528c95f60fbeab7bc55a226bca4a2b36e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_db30f816 {\n bytes3 s_0;\n address s_1;\n int144 s_2;\n string s_3;\n int96 s_4;\n }\n\n function test () public pure returns (S_db30f816 memory) {\n S_db30f816 memory r;\n {\n bytes3 r_0 = bytes3(0x8b5992);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xB18D8abd93C209f547A6f7aaD6E9c50D2C77223D;\n r.s_1 = r_1;\n }\n {\n int144 r_2 = 3552864244224561287885398794880727325626096;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀o🚀é🚀MMo 🚀éo M é\";\n r.s_3 = r_3;\n }\n {\n int96 r_4 = -12602500443315503724777103930;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000208b59920000000000000000000000000000000000000000000000000000000000000000000000000000000000b18d8abd93c209f547a6f7aad6e9c50d2c77223d000000000000000000000000000028c8edfba125a773a96d713e808822a44ef000000000000000000000000000000000000000000000000000000000000000a0ffffffffffffffffffffffffffffffffffffffffd74774ba07c7a207bacd1dc600000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806ff09f9a80c3a9f09f9a804d4d6f20f09f9a80c3a96f204d20c3a9000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes5,string)[3][3][1]", + "type": "(bytes5,string)[3][3][1]", + "value": [ + [ + [ + ["0x6cb63ac549", "Moo é🚀éooM🚀🚀ooo o🚀oo é"], + [ + "0xf3c843d437", + "Moo é🚀 🚀ooé é 🚀oMMoé M🚀🚀éoé🚀o é o🚀oo é éMoé MoMoo🚀 oé" + ], + ["0x708210442b", "Moo é🚀éM o Mé ooé🚀🚀MéM 🚀éMo"] + ], + [ + ["0x8fd491cc26", "Moo é🚀o🚀o é oooo🚀oooMo éoo Mo🚀oo🚀o🚀"], + ["0xf0fa6d03b1", "Moo é🚀o M M 🚀M oMo🚀ooéMéoM Mo ooo🚀é "], + ["0x541bbce16f", "Moo é🚀M o🚀"] + ], + [ + ["0x7cc8ac97b4", "Moo é🚀ooééooMéoooo🚀MMoM🚀🚀🚀 MMé"], + ["0x8c174f34dc", "Moo é🚀o Mé🚀oo 🚀Mo"], + ["0xb2c4a284f5", "Moo é🚀ooééoooM 🚀oM oooé oMoé oééééo🚀éooo🚀🚀🚀Moo🚀é🚀"] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6cb63ac549" + }, + { + "type": "string", + "value": "Moo é🚀éooM🚀🚀ooo o🚀oo é" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf3c843d437" + }, + { + "type": "string", + "value": "Moo é🚀 🚀ooé é 🚀oMMoé M🚀🚀éoé🚀o é o🚀oo é éMoé MoMoo🚀 oé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x708210442b" + }, + { + "type": "string", + "value": "Moo é🚀éM o Mé ooé🚀🚀MéM 🚀éMo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8fd491cc26" + }, + { + "type": "string", + "value": "Moo é🚀o🚀o é oooo🚀oooMo éoo Mo🚀oo🚀o🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf0fa6d03b1" + }, + { + "type": "string", + "value": "Moo é🚀o M M 🚀M oMo🚀ooéMéoM Mo ooo🚀é " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x541bbce16f" + }, + { + "type": "string", + "value": "Moo é🚀M o🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7cc8ac97b4" + }, + { + "type": "string", + "value": "Moo é🚀ooééooMéoooo🚀MMoM🚀🚀🚀 MMé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8c174f34dc" + }, + { + "type": "string", + "value": "Moo é🚀o Mé🚀oo 🚀Mo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb2c4a284f5" + }, + { + "type": "string", + "value": "Moo é🚀ooééoooM 🚀oM oooé oMoé oééééo🚀éooo🚀🚀🚀Moo🚀é🚀" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506106f4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610410565b60405180910390f35b61005661037c565b61005e61037c565b6100666103a9565b61006e6103d6565b604080518082019091526000815260606020820152646cb63ac54960d81b815260408051606081019091526025808252600091906105dd6020830139602083015250808260006020020152506100d560408051808201909152600081526060602082015290565b64f3c843d43760d81b81526040805160808101909152605b8082526000919061058260208301396020830152508082600160200201525061012760408051808201909152600081526060602082015290565b64708210442b60d81b81526040805160608101909152602d808252600091906105556020830139602083015250604082015281526101636103d6565b6040805180820190915260008152606060208201526447ea48e61360d91b8152604080516060810190915260388082526000919061051d6020830139602083015250808260006020020152506101ca60408051808201909152600081526060602082015290565b64f0fa6d03b160d81b8152604080516060810190915260368082526000919061068960208301396020830152508082600160200201525061021c60408051808201909152600081526060602082015290565b64541bbce16f60d81b8152604080518082018252601181526f9adede418753e13f35009a40dfe13f35607f1b602080830191909152808401919091529083019190915282015261026a6103d6565b604080518082019091526000815260606020820152641f322b25ed60da1b815260408051606081019091526032808252600091906106026020830139602083015250808260006020020152506102d160408051808201909152600081526060602082015290565b642305d3cd3760da1b815260408051808201909152601c81527f4d6f6f20c3a9f09f9a806f204dc3a9f09f9a806f6f20f09f9a804d6f000000006020808301919091528201528082600160200201525061033c60408051808201909152600081526060602082015290565b64b2c4a284f560d81b8152604080516080810190915260558082526000919061063460208301396020830152506040808301919091528201528152919050565b60405180602001604052806001905b6103936103a9565b81526020019060019003908161038b5790505090565b60405180606001604052806003905b6103c06103d6565b8152602001906001900390816103b85790505090565b60405180606001604052806003905b6040805180820190915260008152606060208201528152602001906001900390816103e55790505090565b60208152600060208201604083018460005b600181101561051157601f19868403810185528251846060810160005b60038110156104f75787820383528351826060810160005b60038110156104df578582038352835164ffffffffff60d81b81511683526020810151905060406020840152805180604085015260005b818110156104ab576020818401810151606087840101520161048e565b818111156104bd576000606083870101525b506020958601959490940193601f018a16929092016060019150600101610457565b5060209687019695909501949350505060010161043f565b506020978801979096509490940193505050600101610422565b50909594505050505056fe4d6f6f20c3a9f09f9a806ff09f9a806f20c3a9206f6f6f6ff09f9a806f6f6f4d6f20c3a96f6f204d6ff09f9a806f6ff09f9a806ff09f9a804d6f6f20c3a9f09f9a80c3a94d206f204dc3a9206f6fc3a9f09f9a80f09f9a804dc3a94d20f09f9a80c3a94d6f4d6f6f20c3a9f09f9a8020f09f9a806f6fc3a920c3a92020f09f9a806f4d4d6fc3a9204df09f9a80f09f9a80c3a96fc3a9f09f9a806f2020c3a920206ff09f9a806f6f20c3a920c3a94d6fc3a9204d6f4d6f6ff09f9a80206fc3a94d6f6f20c3a9f09f9a80c3a96f6f4df09f9a80f09f9a806f6f6f206ff09f9a806f6f20c3a94d6f6f20c3a9f09f9a806f6fc3a9c3a96f6f4dc3a96f6f6f6ff09f9a804d4d6f4df09f9a80f09f9a80f09f9a80204d4dc3a94d6f6f20c3a9f09f9a806f6fc3a9c3a96f6f6f4d20f09f9a806f4d206f6f6fc3a9206f4d6fc3a920206fc3a9c3a9c3a9c3a96ff09f9a80c3a96f6f6ff09f9a80f09f9a80f09f9a804d6f6ff09f9a80c3a9f09f9a804d6f6f20c3a9f09f9a806f20204d204d20f09f9a804d20206f4d6ff09f9a806f6fc3a94dc3a96f4d204d6f206f6f6ff09f9a80c3a920a2646970667358221220beff344f2acba149067baf89c795ad0eab2eef63b478bdee544cc62201eef51c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b8c9ff5d {\n bytes5 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_b8c9ff5d[3][3][1] memory) {\n S_b8c9ff5d[3][3][1] memory r;\n {\n S_b8c9ff5d[3][3] memory r_0;\n {\n S_b8c9ff5d[3] memory r_0_0;\n {\n S_b8c9ff5d memory r_0_0_0;\n {\n bytes5 r_0_0_0_0 = bytes5(0x6cb63ac549);\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n string memory r_0_0_0_1 = unicode\"Moo é🚀éooM🚀🚀ooo o🚀oo é\";\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_b8c9ff5d memory r_0_0_1;\n {\n bytes5 r_0_0_1_0 = bytes5(0xf3c843d437);\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀 🚀ooé é 🚀oMMoé M🚀🚀éoé🚀o é o🚀oo é éMoé MoMoo🚀 oé\";\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n S_b8c9ff5d memory r_0_0_2;\n {\n bytes5 r_0_0_2_0 = bytes5(0x708210442b);\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n string memory r_0_0_2_1 = unicode\"Moo é🚀éM o Mé ooé🚀🚀MéM 🚀éMo\";\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n r_0_0[2] = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n {\n S_b8c9ff5d[3] memory r_0_1;\n {\n S_b8c9ff5d memory r_0_1_0;\n {\n bytes5 r_0_1_0_0 = bytes5(0x8fd491cc26);\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n string memory r_0_1_0_1 = unicode\"Moo é🚀o🚀o é oooo🚀oooMo éoo Mo🚀oo🚀o🚀\";\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n r_0_1[0] = r_0_1_0;\n }\n {\n S_b8c9ff5d memory r_0_1_1;\n {\n bytes5 r_0_1_1_0 = bytes5(0xf0fa6d03b1);\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n string memory r_0_1_1_1 = unicode\"Moo é🚀o M M 🚀M oMo🚀ooéMéoM Mo ooo🚀é \";\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n r_0_1[1] = r_0_1_1;\n }\n {\n S_b8c9ff5d memory r_0_1_2;\n {\n bytes5 r_0_1_2_0 = bytes5(0x541bbce16f);\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n string memory r_0_1_2_1 = unicode\"Moo é🚀M o🚀\";\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n r_0_1[2] = r_0_1_2;\n }\n r_0[1] = r_0_1;\n }\n {\n S_b8c9ff5d[3] memory r_0_2;\n {\n S_b8c9ff5d memory r_0_2_0;\n {\n bytes5 r_0_2_0_0 = bytes5(0x7cc8ac97b4);\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n string memory r_0_2_0_1 = unicode\"Moo é🚀ooééooMéoooo🚀MMoM🚀🚀🚀 MMé\";\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n r_0_2[0] = r_0_2_0;\n }\n {\n S_b8c9ff5d memory r_0_2_1;\n {\n bytes5 r_0_2_1_0 = bytes5(0x8c174f34dc);\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n {\n string memory r_0_2_1_1 = unicode\"Moo é🚀o Mé🚀oo 🚀Mo\";\n r_0_2_1.s_1 = r_0_2_1_1;\n }\n r_0_2[1] = r_0_2_1;\n }\n {\n S_b8c9ff5d memory r_0_2_2;\n {\n bytes5 r_0_2_2_0 = bytes5(0xb2c4a284f5);\n r_0_2_2.s_0 = r_0_2_2_0;\n }\n {\n string memory r_0_2_2_1 = unicode\"Moo é🚀ooééoooM 🚀oM oooé oMoé oééééo🚀éooo🚀🚀🚀Moo🚀é🚀\";\n r_0_2_2.s_1 = r_0_2_2_1;\n }\n r_0_2[2] = r_0_2_2;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c06cb63ac549000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a80c3a96f6f4df09f9a80f09f9a806f6f6f206ff09f9a806f6f20c3a9000000000000000000000000000000000000000000000000000000f3c843d4370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a8020f09f9a806f6fc3a920c3a92020f09f9a806f4d4d6fc3a9204df09f9a80f09f9a80c3a96fc3a9f09f9a806f2020c3a920206ff09f9a806f6f20c3a920c3a94d6fc3a9204d6f4d6f6ff09f9a80206fc3a90000000000708210442b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80c3a94d206f204dc3a9206f6fc3a9f09f9a80f09f9a804dc3a94d20f09f9a80c3a94d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a08fd491cc26000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a806ff09f9a806f20c3a9206f6f6f6ff09f9a806f6f6f4d6f20c3a96f6f204d6ff09f9a806f6ff09f9a806ff09f9a800000000000000000f0fa6d03b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806f20204d204d20f09f9a804d20206f4d6ff09f9a806f6fc3a94dc3a96f4d204d6f206f6f6ff09f9a80c3a92000000000000000000000541bbce16f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804d206ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001807cc8ac97b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a806f6fc3a9c3a96f6f4dc3a96f6f6f6ff09f9a804d4d6f4df09f9a80f09f9a80f09f9a80204d4dc3a900000000000000000000000000008c174f34dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a806f204dc3a9f09f9a806f6f20f09f9a804d6f00000000b2c4a284f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806f6fc3a9c3a96f6f6f4d20f09f9a806f4d206f6f6fc3a9206f4d6fc3a920206fc3a9c3a9c3a9c3a96ff09f9a80c3a96f6f6ff09f9a80f09f9a80f09f9a804d6f6ff09f9a80c3a9f09f9a800000000000000000000000" + }, + { + "name": "random-(bytes5,uint,bool,bytes22)[1]", + "type": "(bytes5,uint,bool,bytes22)[1]", + "value": [ + [ + "0x0be9281224", + "14013096960165215618075624220897168527255282550546504599819184245622546960435", + false, + "0x7a0cd267c9a78c3aa048471655faf5efffbd835a39a5" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0be9281224" + }, + { + "type": "number", + "value": "14013096960165215618075624220897168527255282550546504599819184245622546960435" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x7a0cd267c9a78c3aa048471655faf5efffbd835a39a5" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6100566100c8565b61005e6100c8565b604080516080810182526000918101919091526402fa4a048960da1b81527f1efb21be592645f2886259fd779227b90cf5deb663c8ea6a74c3d39c98a110336020820152757a0cd267c9a78c3aa048471655faf5efffbd835a39a560501b60608201528152919050565b60405180602001604052806001905b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816100d75790505090565b608081810190828460005b600181101561017257815180516001600160d81b03191684526020808201518186015260408083015115159086015260609182015169ffffffffffffffffffff1916918501919091529284019290910190600101610119565b505050509291505056fea2646970667358221220f7b9349bf31ef7bae3c9803ea006db232d60380312ef8861d601acf1dd64571564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_55475cac {\n bytes5 s_0;\n uint256 s_1;\n bool s_2;\n bytes22 s_3;\n }\n\n function test () public pure returns (S_55475cac[1] memory) {\n S_55475cac[1] memory r;\n {\n S_55475cac memory r_0;\n {\n bytes5 r_0_0 = bytes5(0x0be9281224);\n r_0.s_0 = r_0_0;\n }\n {\n uint r_0_1 = 14013096960165215618075624220897168527255282550546504599819184245622546960435;\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n {\n bytes22 r_0_3 = bytes22(0x7a0cd267c9a78c3aa048471655faf5efffbd835a39a5);\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0be92812240000000000000000000000000000000000000000000000000000001efb21be592645f2886259fd779227b90cf5deb663c8ea6a74c3d39c98a1103300000000000000000000000000000000000000000000000000000000000000007a0cd267c9a78c3aa048471655faf5efffbd835a39a500000000000000000000" + }, + { + "name": "random-(bytes7,bool[],string,bool)", + "type": "(bytes7,bool[],string,bool)", + "value": ["0x10f10e906628f6", [], "Moo é🚀oM🚀 🚀Méo MMoééo🚀🚀Mo", true], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x10f10e906628f6" + }, + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀oM🚀 🚀Méo MMoééo🚀🚀Mo" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610228806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061012d565b60405180910390f35b6100566100ac565b61005e6100ac565b660878874833147b60c91b81526040805160008082526020808301845280850192909252825160608101909352602d8084529092916101c69083013960408301525060016060820152919050565b604051806080016040528060006001600160c81b031916815260200160608152602001606081526020016000151581525090565b6000815180845260005b81811015610106576020818501810151868301820152016100ea565b81811115610118576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516001600160c81b031916828201528281015160806040840152805160a0840181905260009291820190839060c08601905b8083101561018757835115158252928401926001929092019190840190610165565b506040870151868203601f1901606088015293506101a581856100e0565b935050505060608401516101bd608085018215159052565b50939250505056fe4d6f6f20c3a9f09f9a806f4df09f9a802020f09f9a804dc3a96f204d4d6fc3a9c3a96ff09f9a80f09f9a804d6fa26469706673582212200bc3d1ddc312a6d485e4df0d832427ac877143298a481d8b295fb1b91462046064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_776878f7 {\n bytes7 s_0;\n bool[] s_1;\n string s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_776878f7 memory) {\n S_776878f7 memory r;\n {\n bytes7 r_0 = bytes7(0x10f10e906628f6);\n r.s_0 = r_0;\n }\n {\n bool[] memory r_1 = new bool[](0);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oM🚀 🚀Méo MMoééo🚀🚀Mo\";\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002010f10e906628f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806f4df09f9a802020f09f9a804dc3a96f204d4d6fc3a9c3a96ff09f9a80f09f9a804d6f00000000000000000000000000000000000000" + }, + { + "name": "random-(bytes9,bytes21,bytes31[4],int184)", + "type": "(bytes9,bytes21,bytes31[4],int184)", + "value": [ + "0x678995ceed7ec2f47a", + "0x123d43e78ac77406f5a9de267d30a5c55ff9041942", + [ + "0x55ebadeef1e9ce62c1092e40f040e50d3d17e13f8a47ff58349420e8e1839d", + "0xabacdca88f36f027a21c0b93cde950824801445736c0d9c283de9309622420", + "0xbc57cf0c1cd0450b541a1512109b4978e44654ef517fe017e0ec9c0af7dd13", + "0x29bbca53bcca1467114987cb3ecff7e84c8844b8286ecf6aae10d39928b4c8" + ], + "-2169982982432316923621529215027541619168876614860676698" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x678995ceed7ec2f47a" + }, + { + "type": "hexstring", + "value": "0x123d43e78ac77406f5a9de267d30a5c55ff9041942" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x55ebadeef1e9ce62c1092e40f040e50d3d17e13f8a47ff58349420e8e1839d" + }, + { + "type": "hexstring", + "value": "0xabacdca88f36f027a21c0b93cde950824801445736c0d9c283de9309622420" + }, + { + "type": "hexstring", + "value": "0xbc57cf0c1cd0450b541a1512109b4978e44654ef517fe017e0ec9c0af7dd13" + }, + { + "type": "hexstring", + "value": "0x29bbca53bcca1467114987cb3ecff7e84c8844b8286ecf6aae10d39928b4c8" + } + ] + }, + { + "type": "number", + "value": "-2169982982432316923621529215027541619168876614860676698" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610248806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101a3565b60405180910390f35b610056610159565b61005e610159565b6833c4cae776bf617a3d60b91b815274091ea1f3c563ba037ad4ef133e9852e2affc820ca160591b6020820152610093610185565b7f55ebadeef1e9ce62c1092e40f040e50d3d17e13f8a47ff58349420e8e1839d0081527fabacdca88f36f027a21c0b93cde950824801445736c0d9c283de93096224200060208201527fbc57cf0c1cd0450b541a1512109b4978e44654ef517fe017e0ec9c0af7dd13006040808301919091527f29bbca53bcca1467114987cb3ecff7e84c8844b8286ecf6aae10d39928b4c800606080840191909152908301919091527616a7da9b9c96ab400dfad0c37308adceb8852739901e591990820152919050565b6040805160808101825260008082526020820152908101610178610185565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b81516001600160b81b03191681526020808301516affffffffffffffffffffff19168183015260408084015160e084019291840160005b60048110156101fb57825160ff1916825291830191908301906001016101da565b50505050606083015160160b60c08301529291505056fea264697066735822122027beb406d12fb49287db2116d4009e85a4130fa6e7d7106ca68f98db3399204e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d0a22222 {\n bytes9 s_0;\n bytes21 s_1;\n bytes31[4] s_2;\n int184 s_3;\n }\n\n function test () public pure returns (S_d0a22222 memory) {\n S_d0a22222 memory r;\n {\n bytes9 r_0 = bytes9(0x678995ceed7ec2f47a);\n r.s_0 = r_0;\n }\n {\n bytes21 r_1 = bytes21(0x123d43e78ac77406f5a9de267d30a5c55ff9041942);\n r.s_1 = r_1;\n }\n {\n bytes31[4] memory r_2;\n {\n bytes31 r_2_0 = bytes31(0x55ebadeef1e9ce62c1092e40f040e50d3d17e13f8a47ff58349420e8e1839d);\n r_2[0] = r_2_0;\n }\n {\n bytes31 r_2_1 = bytes31(0xabacdca88f36f027a21c0b93cde950824801445736c0d9c283de9309622420);\n r_2[1] = r_2_1;\n }\n {\n bytes31 r_2_2 = bytes31(0xbc57cf0c1cd0450b541a1512109b4978e44654ef517fe017e0ec9c0af7dd13);\n r_2[2] = r_2_2;\n }\n {\n bytes31 r_2_3 = bytes31(0x29bbca53bcca1467114987cb3ecff7e84c8844b8286ecf6aae10d39928b4c8);\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n int184 r_3 = -2169982982432316923621529215027541619168876614860676698;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x678995ceed7ec2f47a0000000000000000000000000000000000000000000000123d43e78ac77406f5a9de267d30a5c55ff9041942000000000000000000000055ebadeef1e9ce62c1092e40f040e50d3d17e13f8a47ff58349420e8e1839d00abacdca88f36f027a21c0b93cde950824801445736c0d9c283de930962242000bc57cf0c1cd0450b541a1512109b4978e44654ef517fe017e0ec9c0af7dd130029bbca53bcca1467114987cb3ecff7e84c8844b8286ecf6aae10d39928b4c800ffffffffffffffffffe9582564636954bff2052f3c8cf75231477ad8c66fe1a6" + }, + { + "name": "random-(int192,string,string,address,bool)", + "type": "(int192,string,string,address,bool)", + "value": [ + "2413698920002083308521352010093782778699311555874054536396", + "Moo é🚀é", + "Moo é🚀oMéM🚀", + "0x82035DFda4B814f1c7D7d42Aa7D6f791AA9bFBE3", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "2413698920002083308521352010093782778699311555874054536396" + }, + { + "type": "string", + "value": "Moo é🚀é" + }, + { + "type": "string", + "value": "Moo é🚀oMéM🚀" + }, + { + "type": "address", + "value": "0x82035DFda4B814f1c7D7d42Aa7D6f791AA9bFBE3" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610229806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610182565b60405180910390f35b6100566100f8565b61005e6100f8565b776270314b4eac714c475c28ba3d026a3d9cd7d8c3e700fccc8152604080518082018252600c81526b4d6f6f20c3a9f09f9a80c3a960a01b602080830191909152808401919091528151808301835260138152719adede418753e13f3500de9b87529be13f35606f1b91810191909152908201527382035dfda4b814f1c7d7d42aa7d6f791aa9bfbe3606082015260006080820152919050565b6040518060a00160405280600060170b8152602001606081526020016060815260200160006001600160a01b031681526020016000151581525090565b6000815180845260005b8181101561015b5760208185018101518683018201520161013f565b8181111561016d576000602083870101525b50601f01601f19169290920160200192915050565b60208152815160170b60208201526000602083015160a060408401526101ab60c0840182610135565b90506040840151601f198483030160608501526101c88282610135565b91505060018060a01b0360608501511660808401526080840151151560a0840152809150509291505056fea26469706673582212208db060cdd5241dacc7dc16df2570c78d3b1822b6767bac479eaca1528922211b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d4fefa72 {\n int192 s_0;\n string s_1;\n string s_2;\n address s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_d4fefa72 memory) {\n S_d4fefa72 memory r;\n {\n int192 r_0 = 2413698920002083308521352010093782778699311555874054536396;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀é\";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀oMéM🚀\";\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x82035DFda4B814f1c7D7d42Aa7D6f791AA9bFBE3;\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000006270314b4eac714c475c28ba3d026a3d9cd7d8c3e700fccc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000082035dfda4b814f1c7d7d42aa7d6f791aa9bfbe30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806f4dc3a94df09f9a8000000000000000000000000000" + }, + { + "name": "random-(int200,int80,bytes6,bool,bytes32)", + "type": "(int200,int80,bytes6,bool,bytes32)", + "value": [ + "-9653272937910036029450260313048581350739564711395453278676", + "-88811839108312516779887", + "0x4f15d6a147be", + true, + "0x437a02d421d8a0d4a93733402b605aef99749796b88aa94eb168423f49d32cb7" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-9653272937910036029450260313048581350739564711395453278676" + }, + { + "type": "number", + "value": "-88811839108312516779887" + }, + { + "type": "hexstring", + "value": "0x4f15d6a147be" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x437a02d421d8a0d4a93733402b605aef99749796b88aa94eb168423f49d32cb7" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061014c8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a0808201835260008083526020808401829052838501829052606080850183905260809485019290925284518084018652780189b0df3ece34c223eda223a879ee4c52c9d1f212680799d3198082526912ce7fdba3b8506fdf6e1982840190815265278aeb50a3df60d11b83890190815260018487019081527f437a02d421d8a0d4a93733402b605aef99749796b88aa94eb168423f49d32cb79489019485528951938452915160090b9483019490945292516001600160d01b03191696810196909652905115159185019190915251918301919091520160405180910390f3fea2646970667358221220b348a774efdbf79486ae23e839cde99a2b3a50486b545dc3bbf6597174901c0364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ef5a24b9 {\n int200 s_0;\n int80 s_1;\n bytes6 s_2;\n bool s_3;\n bytes32 s_4;\n }\n\n function test () public pure returns (S_ef5a24b9 memory) {\n S_ef5a24b9 memory r;\n {\n int200 r_0 = -9653272937910036029450260313048581350739564711395453278676;\n r.s_0 = r_0;\n }\n {\n int80 r_1 = -88811839108312516779887;\n r.s_1 = r_1;\n }\n {\n bytes6 r_2 = bytes6(0x4f15d6a147be);\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n bytes32 r_4 = bytes32(0x437a02d421d8a0d4a93733402b605aef99749796b88aa94eb168423f49d32cb7);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0xfffffffffffffffe764f20c131cb3ddc125ddc578611b3ad362e0ded97f8662cffffffffffffffffffffffffffffffffffffffffffffed3180245c47af9020914f15d6a147be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001437a02d421d8a0d4a93733402b605aef99749796b88aa94eb168423f49d32cb7" + }, + { + "name": "random-(int224,bytes30,int208,string,(int112))", + "type": "(int224,bytes30,int208,string,(int112))", + "value": [ + "-9105719795106554047930746092665238712519127951244098609066012870448", + "0xb6ceccb496e64de88c59fec7f2524df003bd0c6fd2617a7871ba00849bdf", + "42175208086979716352911835331551109579647877915138719547545250", + "Moo é🚀ééMéMo🚀éééo🚀MM oo oM oM🚀 ", + ["-1303109308777311781220975718562221"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-9105719795106554047930746092665238712519127951244098609066012870448" + }, + { + "type": "hexstring", + "value": "0xb6ceccb496e64de88c59fec7f2524df003bd0c6fd2617a7871ba00849bdf" + }, + { + "type": "number", + "value": "42175208086979716352911835331551109579647877915138719547545250" + }, + { + "type": "string", + "value": "Moo é🚀ééMéMo🚀éééo🚀MM oo oM oM🚀 " + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1303109308777311781220975718562221" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610276806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610176565b60405180910390f35b6100876040805160a081018252600080825260208083018290528284018290526060808401528351908101909352825290608082015290565b6100c06040805160a081018252600080825260208083018290528284018290526060808401528351908101909352825290608082015290565b7fffffffffa98938a8f00dbfee4f5dbb9150b82e8b2370feede9e5138ee9fb78d081527fb6ceccb496e64de88c59fec7f2524df003bd0c6fd2617a7871ba00849bdf0000602080830191909152791a3ee5f607aca34f638dcf20f1e9124cf84845a2d18addca56a2604080840191909152805160608101909152603280825260009261020f9083013960608301525060408051602081019091526d403f8d44420a45b1f147e6e5f9ac1981526080820152919050565b600060208083528351601b0b8184015261ffff1981850151166040840152604084015160190b6060840152606084015160a0608085015280518060c086015260005b818110156101d45782810184015186820160e0015283016101b8565b818111156101e657600060e083880101525b5060808601518051600d0b60a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a80c3a9c3a94dc3a94d6ff09f9a80c3a9c3a9c3a96ff09f9a804d4d206f6f206f4d206f4df09f9a8020a26469706673582212200847792b9dc1c8dfe7e0c3e900e2a58dbdcb737d472ed1fcf9f1c69dfaaae0a264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_cc4fa54a {\n int112 s_0;\n }\n\n struct S_eb3731b4 {\n int224 s_0;\n bytes30 s_1;\n int208 s_2;\n string s_3;\n S_cc4fa54a s_4;\n }\n\n function test () public pure returns (S_eb3731b4 memory) {\n S_eb3731b4 memory r;\n {\n int224 r_0 = -9105719795106554047930746092665238712519127951244098609066012870448;\n r.s_0 = r_0;\n }\n {\n bytes30 r_1 = bytes30(0xb6ceccb496e64de88c59fec7f2524df003bd0c6fd2617a7871ba00849bdf);\n r.s_1 = r_1;\n }\n {\n int208 r_2 = 42175208086979716352911835331551109579647877915138719547545250;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀ééMéMo🚀éééo🚀MM oo oM oM🚀 \";\n r.s_3 = r_3;\n }\n {\n S_cc4fa54a memory r_4;\n {\n int112 r_4_0 = -1303109308777311781220975718562221;\n r_4.s_0 = r_4_0;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffffffffa98938a8f00dbfee4f5dbb9150b82e8b2370feede9e5138ee9fb78d0b6ceccb496e64de88c59fec7f2524df003bd0c6fd2617a7871ba00849bdf00000000000000001a3ee5f607aca34f638dcf20f1e9124cf84845a2d18addca56a200000000000000000000000000000000000000000000000000000000000000a0ffffffffffffffffffffffffffffffffffffbfc072bbbdf5ba4e0eb8191a065300000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80c3a9c3a94dc3a94d6ff09f9a80c3a9c3a9c3a96ff09f9a804d4d206f6f206f4d206f4df09f9a80200000000000000000000000000000" + }, + { + "name": "random-(string,((string),int256,uint232),bool)", + "type": "(string,((string),int256,uint232),bool)", + "value": [ + "Moo é🚀oé🚀o🚀éMo🚀M Méo🚀🚀Méooo🚀oMMé oooé M🚀MoééMé o🚀ooo🚀oMMooé🚀o", + [ + ["Moo é🚀oéMMoo éooooo o 🚀"], + "42563491640957900618994432655253760561004150816914814309927647005008245526532", + "5651519194610496945831788810263422329528309064093968274676720551146022" + ], + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé🚀o🚀éMo🚀M Méo🚀🚀Méooo🚀oMMé oooé M🚀MoééMé o🚀ooo🚀oMMooé🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéMMoo éooooo o 🚀" + } + ] + }, + { + "type": "number", + "value": "42563491640957900618994432655253760561004150816914814309927647005008245526532" + }, + { + "type": "number", + "value": "5651519194610496945831788810263422329528309064093968274676720551146022" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061030a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c8565b60405180910390f35b610056610132565b61005e610132565b60006040518060a001604052806069815260200161024b6069913982525060408051608081018252606080820190815281526000602082018190529181019190915260408051602081019091526060815260006040518060600160405280602181526020016102b46021913982525081527f5e1a1521e4cbf13b61725fbd18aba7faf97e16a2778f915427bf26539c9b90046020808301919091527cd1a062251e609db8346a37be4498748f9e5383b0c8aaf88302bec5322660408084019190915290830191909152600090820152919050565b60405180606001604052806060815260200161016e60408051608081018252606080820190815281526000602082018190529181019190915290565b8152600060209091015290565b6000815180845260005b818110156101a157602081850181015186830182015201610185565b818111156101b3576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516060828501526101e4608085018261017b565b905081850151601f1985830301604086015280516060835280519050836060840152610213608084018261017b565b8285015194840194909452506040908101516001600160e81b0316918101919091529390930151151560609290920191909152509056fe4d6f6f20c3a9f09f9a806fc3a9f09f9a806ff09f9a80c3a94d6ff09f9a804d204dc3a96ff09f9a80f09f9a804dc3a96f6f6ff09f9a806f4d4dc3a9206f6f6fc3a9204df09f9a804d6fc3a9c3a94dc3a9206ff09f9a806f6f6ff09f9a806f4d4d6f6fc3a9f09f9a806f4d6f6f20c3a9f09f9a806fc3a94d4d6f6f20c3a96f6f6f6f6f206f2020f09f9a80a2646970667358221220a44eeb63d6b79077f590c8d31e915c6068fda55a8a31699c80929e064a907d4f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_9dc6dc3a {\n S_97fc4627 s_0;\n int256 s_1;\n uint232 s_2;\n }\n\n struct S_ea3e45bc {\n string s_0;\n S_9dc6dc3a s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_ea3e45bc memory) {\n S_ea3e45bc memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oé🚀o🚀éMo🚀M Méo🚀🚀Méooo🚀oMMé oooé M🚀MoééMé o🚀ooo🚀oMMooé🚀o\";\n r.s_0 = r_0;\n }\n {\n S_9dc6dc3a memory r_1;\n {\n S_97fc4627 memory r_1_0;\n {\n string memory r_1_0_0 = unicode\"Moo é🚀oéMMoo éooooo o 🚀\";\n r_1_0.s_0 = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n int256 r_1_1 = 42563491640957900618994432655253760561004150816914814309927647005008245526532;\n r_1.s_1 = r_1_1;\n }\n {\n uint232 r_1_2 = 5651519194610496945831788810263422329528309064093968274676720551146022;\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a806fc3a9f09f9a806ff09f9a80c3a94d6ff09f9a804d204dc3a96ff09f9a80f09f9a804dc3a96f6f6ff09f9a806f4d4dc3a9206f6f6fc3a9204df09f9a804d6fc3a9c3a94dc3a9206ff09f9a806f6f6ff09f9a806f4d4d6f6fc3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000605e1a1521e4cbf13b61725fbd18aba7faf97e16a2778f915427bf26539c9b9004000000d1a062251e609db8346a37be4498748f9e5383b0c8aaf88302bec53226000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a806fc3a94d4d6f6f20c3a96f6f6f6f6f206f2020f09f9a8000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,(bool,(string,bool[3])))", + "type": "(string,(bool,(string,bool[3])))", + "value": [ + "Moo é🚀MéM oé🚀🚀o M🚀o🚀oM🚀é🚀éo Moéé🚀oMMéooM🚀 oooMo", + [ + false, + ["Moo é🚀oM🚀 🚀Mo o🚀Mo 🚀oooo o🚀éo Moéé éM🚀o o🚀🚀 o", [false, true, false]] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéM oé🚀🚀o M🚀o🚀oM🚀é🚀éo Moéé🚀oMMéooM🚀 oooMo" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM🚀 🚀Mo o🚀Mo 🚀oooo o🚀éo Moéé éM🚀o o🚀🚀 o" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610305806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019c565b60405180910390f35b6100566100e4565b61005e6100e4565b600060405180608001604052806052815260200161027e60529139825250610084610103565b6000815261009061011b565b600060405180608001604052806050815260200161022e605091398252506100b6610131565b6000808252600160208084019190915260408301919091528281019190915282810191909152820152919050565b6040518060400160405280606081526020016100fe610103565b905290565b60405180604001604052806000151581526020016100fe5b6040518060400160405280606081526020016100fe5b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b8181101561017557602081850181015186830182015201610159565b81811115610187576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516040828501526101b8606085018261014f565b905081850151601f198583030160408601528051151582528281015190506040838301528051608060408401526101f260c084018261014f565b905083820151915060608301925060005b6003811015610222578251151584529284019291840191600101610203565b50969550505050505056fe4d6f6f20c3a9f09f9a806f4df09f9a8020f09f9a804d6f20206ff09f9a804d6f20f09f9a806f6f6f6f206ff09f9a80c3a96f20204d6fc3a9c3a920c3a94df09f9a806f206ff09f9a80f09f9a8020206f4d6f6f20c3a9f09f9a804dc3a94d206fc3a9f09f9a80f09f9a806f204df09f9a806ff09f9a806f4df09f9a80c3a9f09f9a80c3a96f204d6fc3a9c3a9f09f9a806f4d4dc3a96f6f4df09f9a80206f6f6f4d6fa264697066735822122044f3c9d878ec34d46e8beac9afb16649dc9152f944a9b97996d855d83466960964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_62d24032 {\n string s_0;\n bool[3] s_1;\n }\n\n struct S_92e5878a {\n bool s_0;\n S_62d24032 s_1;\n }\n\n struct S_2e688b03 {\n string s_0;\n S_92e5878a s_1;\n }\n\n function test () public pure returns (S_2e688b03 memory) {\n S_2e688b03 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀MéM oé🚀🚀o M🚀o🚀oM🚀é🚀éo Moéé🚀oMMéooM🚀 oooMo\";\n r.s_0 = r_0;\n }\n {\n S_92e5878a memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n S_62d24032 memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀oM🚀 🚀Mo o🚀Mo 🚀oooo o🚀éo Moéé éM🚀o o🚀🚀 o\";\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bool[3] memory r_1_1_1;\n {\n bool r_1_1_1_0 = false;\n r_1_1_1[0] = r_1_1_1_0;\n }\n {\n bool r_1_1_1_1 = true;\n r_1_1_1[1] = r_1_1_1_1;\n }\n {\n bool r_1_1_1_2 = false;\n r_1_1_1[2] = r_1_1_1_2;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a804dc3a94d206fc3a9f09f9a80f09f9a806f204df09f9a806ff09f9a806f4df09f9a80c3a9f09f9a80c3a96f204d6fc3a9c3a9f09f9a806f4d4dc3a96f6f4df09f9a80206f6f6f4d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a806f4df09f9a8020f09f9a804d6f20206ff09f9a804d6f20f09f9a806f6f6f6f206ff09f9a80c3a96f20204d6fc3a9c3a920c3a94df09f9a806f206ff09f9a80f09f9a8020206f00000000000000000000000000000000" + }, + { + "name": "random-(string,address,bytes23,bytes28)[2]", + "type": "(string,address,bytes23,bytes28)[2]", + "value": [ + [ + "Moo é🚀é", + "0x612f850a1FE02793d0bea2C51c84A78149306609", + "0x937ccefbc49af20fe5889446f8d1be193886c7ed916c99", + "0xcb73a4a53ac2cfda321828a4756674205818d922ffd33deab333dc82" + ], + [ + "Moo é🚀 Moo🚀 o", + "0x5f45C5199059b1B57f3FA7C07758A1A9cFBf776B", + "0x0197eac79e2b40772173435a709e68e766e0950a7cb7b7", + "0x3293c15bb7ab5af5c342e5721dc8ef7f21801d0ef021d147a1261adf" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é" + }, + { + "type": "address", + "value": "0x612f850a1FE02793d0bea2C51c84A78149306609" + }, + { + "type": "hexstring", + "value": "0x937ccefbc49af20fe5889446f8d1be193886c7ed916c99" + }, + { + "type": "hexstring", + "value": "0xcb73a4a53ac2cfda321828a4756674205818d922ffd33deab333dc82" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Moo🚀 o" + }, + { + "type": "address", + "value": "0x5f45C5199059b1B57f3FA7C07758A1A9cFBf776B" + }, + { + "type": "hexstring", + "value": "0x0197eac79e2b40772173435a709e68e766e0950a7cb7b7" + }, + { + "type": "hexstring", + "value": "0x3293c15bb7ab5af5c342e5721dc8ef7f21801d0ef021d147a1261adf" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102fd806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101fc565b60405180910390f35b6100566101b5565b61005e6101b5565b60408051608080820183526060808352600060208085018281528587018381528487018481528851808a018a52600c81526b4d6f6f20c3a9f09f9a80c3a960a01b81860152885273612f850a1fe02793d0bea2c51c84a781493066099092527f937ccefbc49af20fe5889446f8d1be193886c7ed916c9900000000000000000090527fcb73a4a53ac2cfda321828a4756674205818d922ffd33deab333dc8200000000905293865284519283018552818352828401818152838601828152928401918252855180870190965260158652744d6f6f20c3a9f09f9a80204d6f6ff09f9a8020206f60581b86860152948352735f45c5199059b1b57f3fa7c07758a1a9cfbf776b9094527f0197eac79e2b40772173435a709e68e766e0950a7cb7b700000000000000000090527f3293c15bb7ab5af5c342e5721dc8ef7f21801d0ef021d147a1261adf00000000909252820152919050565b60405180604001604052806002905b604080516080810182526060808252600060208084018290529383018190529082015282526000199092019101816101c45790505090565b602080825260009060608382018185018685805b60028110156102b957601f19808a8603018652835160808151818852805180838a01528692505b80831015610255578183018c015189840160a00152918b0191610237565b80831115610266578660a0828b0101525b8b8401516001600160a01b0316898d015260408085015168ffffffffffffffffff1916908a0152928a015163ffffffff19168a890152505095880195601f011690930160a0019291860191600101610210565b50919897505050505050505056fea2646970667358221220c9813e07aebbe3dc4567c08f91e527c3cd991d7a12b9a5089c2771aa19751c3164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_22b40d82 {\n string s_0;\n address s_1;\n bytes23 s_2;\n bytes28 s_3;\n }\n\n function test () public pure returns (S_22b40d82[2] memory) {\n S_22b40d82[2] memory r;\n {\n S_22b40d82 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀é\";\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x612f850a1FE02793d0bea2C51c84A78149306609;\n r_0.s_1 = r_0_1;\n }\n {\n bytes23 r_0_2 = bytes23(0x937ccefbc49af20fe5889446f8d1be193886c7ed916c99);\n r_0.s_2 = r_0_2;\n }\n {\n bytes28 r_0_3 = bytes28(0xcb73a4a53ac2cfda321828a4756674205818d922ffd33deab333dc82);\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_22b40d82 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀 Moo🚀 o\";\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x5f45C5199059b1B57f3FA7C07758A1A9cFBf776B;\n r_1.s_1 = r_1_1;\n }\n {\n bytes23 r_1_2 = bytes23(0x0197eac79e2b40772173435a709e68e766e0950a7cb7b7);\n r_1.s_2 = r_1_2;\n }\n {\n bytes28 r_1_3 = bytes28(0x3293c15bb7ab5af5c342e5721dc8ef7f21801d0ef021d147a1261adf);\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000612f850a1fe02793d0bea2c51c84a78149306609937ccefbc49af20fe5889446f8d1be193886c7ed916c99000000000000000000cb73a4a53ac2cfda321828a4756674205818d922ffd33deab333dc8200000000000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000005f45c5199059b1b57f3fa7c07758a1a9cfbf776b0197eac79e2b40772173435a709e68e766e0950a7cb7b70000000000000000003293c15bb7ab5af5c342e5721dc8ef7f21801d0ef021d147a1261adf0000000000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a80204d6f6ff09f9a8020206f0000000000000000000000" + }, + { + "name": "random-(string,address[2][],string)", + "type": "(string,address[2][],string)", + "value": [ + "Moo é🚀éMoéé🚀🚀oMoo🚀o🚀MéMM oooo éM", + [ + [ + "0x934F194527b753B76C621eef23d5A54559B0dC20", + "0x619A52601bB11452cC7208504FB5B4cd930a78D6" + ] + ], + "Moo é🚀o🚀o🚀🚀o🚀o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMoéé🚀🚀oMoo🚀o🚀MéMM oooo éM" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x934F194527b753B76C621eef23d5A54559B0dC20" + }, + { + "type": "address", + "value": "0x619A52601bB11452cC7208504FB5B4cd930a78D6" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀o🚀🚀o🚀o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061032d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101f5565b60405180910390f35b61007260405180606001604052806060815260200160608152602001606081525090565b61009660405180606001604052806060815260200160608152602001606081525090565b60006040518060600160405280603781526020016102c160379139825250604080516001808252818301909252600091816020015b6100d361018a565b8152602001906001900390816100cb5790505090506100f061018a565b73934f194527b753b76c621eef23d5a54559b0dc20815273619a52601bb11452cc7208504fb5b4cd930a78d66020820152815181908390600090610136576101366102aa565b6020908102919091018101919091528381019290925250604080518082018252601e81527f4d6f6f20c3a9f09f9a806ff09f9a806ff09f9a80f09f9a806ff09f9a806f000092810192909252820152919050565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156101ce576020818501810151868301820152016101b2565b818111156101e0576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160608285015261021160808501826101a8565b905081850151601f1960408187850301818801528383518086528686019150868501955060009450845b8181101561028157865183875b600281101561026e5782516001600160a01b03168252918a0191908a0190600101610248565b505050958701959183019160010161023b565b50508189015195508288820301606089015261029d81876101a8565b9998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a94d6fc3a9c3a9f09f9a80f09f9a806f4d6f6ff09f9a806ff09f9a804dc3a94d4d20206f6f6f6f2020c3a94da2646970667358221220422d9adf5618e03cda6a508bde42d0f6366fae38f862f04824dee89d9331463f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_828bfc90 {\n string s_0;\n address[2][] s_1;\n string s_2;\n }\n\n function test () public pure returns (S_828bfc90 memory) {\n S_828bfc90 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éMoéé🚀🚀oMoo🚀o🚀MéMM oooo éM\";\n r.s_0 = r_0;\n }\n {\n address[2][] memory r_1 = new address[2][](1);\n {\n address[2] memory r_1_0;\n {\n address r_1_0_0 = 0x934F194527b753B76C621eef23d5A54559B0dC20;\n r_1_0[0] = r_1_0_0;\n }\n {\n address r_1_0_1 = 0x619A52601bB11452cC7208504FB5B4cd930a78D6;\n r_1_0[1] = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀o🚀o🚀🚀o🚀o\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80c3a94d6fc3a9c3a9f09f9a80f09f9a806f4d6f6ff09f9a806ff09f9a804dc3a94d4d20206f6f6f6f2020c3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000934f194527b753b76c621eef23d5a54559b0dc20000000000000000000000000619a52601bb11452cc7208504fb5b4cd930a78d6000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a806ff09f9a806ff09f9a80f09f9a806ff09f9a806f0000" + }, + { + "name": "random-(string,bool,address,bool[3])", + "type": "(string,bool,address,bool[3])", + "value": [ + "Moo é🚀🚀🚀oM 🚀MM oé oMoM🚀M 🚀oM🚀ooéo🚀o o🚀o", + false, + "0x61f066C4a5ce9671cf67CBe9CA2F20C767a36d1A", + [true, false, true] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀oM 🚀MM oé oMoM🚀M 🚀oM🚀ooéo🚀o o🚀o" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x61f066C4a5ce9671cf67CBe9CA2F20C767a36d1A" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610255806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610141565b60405180910390f35b6100566100c0565b61005e6100c0565b60006040518060800160405280604581526020016101db60459139825250600060208201527361f066c4a5ce9671cf67cbe9ca2f20c767a36d1a60408201526100a56100f8565b60018082526000602083015260408201526060820152919050565b60405180608001604052806060815260200160001515815260200160006001600160a01b031681526020016100f36100f8565b905290565b60405180606001604052806003906020820280368337509192915050565b8060005b600381101561013b578151151584526020938401939091019060010161011a565b50505050565b60006020808352835160c08285015280518060e086015260005b81811015610178578281018401518682016101000152830161015b565b8181111561018b57600061010083880101525b509185015180151560408601529160408601516001600160a01b03811660608701529250606086015192506101c36080860184610116565b601f01601f1916939093016101000194935050505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4d20f09f9a804d4d206fc3a9206f4d6f4df09f9a804d20f09f9a806f4df09f9a806f6fc3a96ff09f9a806f206ff09f9a806fa264697066735822122051e7bd17eb400c7615b8c786cbbf6c83aae37049b28f7771144cf65d8979bddf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c53a1a5f {\n string s_0;\n bool s_1;\n address s_2;\n bool[3] s_3;\n }\n\n function test () public pure returns (S_c53a1a5f memory) {\n S_c53a1a5f memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀🚀oM 🚀MM oé oMoM🚀M 🚀oM🚀ooéo🚀o o🚀o\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x61f066C4a5ce9671cf67CBe9CA2F20C767a36d1A;\n r.s_2 = r_2;\n }\n {\n bool[3] memory r_3;\n {\n bool r_3_0 = true;\n r_3[0] = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3[1] = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061f066c4a5ce9671cf67cbe9ca2f20c767a36d1a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4d20f09f9a804d4d206fc3a9206f4d6f4df09f9a804d20f09f9a806f4df09f9a806f6fc3a96ff09f9a806f206ff09f9a806f000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bytes10,string,uint160,address)", + "type": "(string,bytes10,string,uint160,address)", + "value": [ + "Moo é🚀 oéoooooé🚀M éo o", + "0x67032beae5cbde0fbe2a", + "Moo é🚀🚀o🚀o🚀o o o🚀oéM oMéoo 🚀é", + "1297638588894416710400113612346076169953945741751", + "0x7DbE1fbc8fb28B993dEA30f1d23fD0287d1e9129" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oéoooooé🚀M éo o" + }, + { + "type": "hexstring", + "value": "0x67032beae5cbde0fbe2a" + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀o🚀o o o🚀oéM oMéoo 🚀é" + }, + { + "type": "number", + "value": "1297638588894416710400113612346076169953945741751" + }, + { + "type": "address", + "value": "0x7DbE1fbc8fb28B993dEA30f1d23fD0287d1e9129" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017f565b60405180910390f35b6040805160a0810182526060808252600060208301819052928201819052810182905260808101919091526040805160a08101825260608082526000602083018190529282018190528101829052608081019190915260006040518060600160405280602181526020016102366021913982525069338195f572e5ef07df1560b11b602080830191909152604080516060810190915260338082526000926102039083013960408301525073e34c2074a2cf84aeab5fcb0ef9c493dfec2669b76060820152737dbe1fbc8fb28b993dea30f1d23fd0287d1e91296080820152919050565b6000815180845260005b818110156101585760208185018101518683018201520161013c565b8181111561016a576000602083870101525b50601f01601f19169290920160200192915050565b602081526000825160a0602084015261019b60c0840182610132565b905069ffffffffffffffffffff60b01b60208501511660408401526040840151601f198483030160608501526101d18282610132565b60608601516001600160a01b039081166080878101919091529096015190951660a09094019390935250919291505056fe4d6f6f20c3a9f09f9a80f09f9a806ff09f9a806ff09f9a806f206f206ff09f9a806fc3a94d206f4dc3a96f6f20f09f9a80c3a94d6f6f20c3a9f09f9a80206fc3a96f6f6f6f6fc3a9f09f9a804d20c3a96f20206fa2646970667358221220fe147e8ddb134bfb3be726827c2d18ae2744e613ab11082736306ab221486f1464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_32541f76 {\n string s_0;\n bytes10 s_1;\n string s_2;\n uint160 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_32541f76 memory) {\n S_32541f76 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 oéoooooé🚀M éo o\";\n r.s_0 = r_0;\n }\n {\n bytes10 r_1 = bytes10(0x67032beae5cbde0fbe2a);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀🚀o🚀o🚀o o o🚀oéM oMéoo 🚀é\";\n r.s_2 = r_2;\n }\n {\n uint160 r_3 = 1297638588894416710400113612346076169953945741751;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x7DbE1fbc8fb28B993dEA30f1d23fD0287d1e9129;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a067032beae5cbde0fbe2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e34c2074a2cf84aeab5fcb0ef9c493dfec2669b70000000000000000000000007dbe1fbc8fb28b993dea30f1d23fd0287d1e912900000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80206fc3a96f6f6f6f6fc3a9f09f9a804d20c3a96f20206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80f09f9a806ff09f9a806ff09f9a806f206f206ff09f9a806fc3a94d206f4dc3a96f6f20f09f9a80c3a900000000000000000000000000" + }, + { + "name": "random-(string,bytes31,int48,bool,bytes19)", + "type": "(string,bytes31,int48,bool,bytes19)", + "value": [ + "Moo é🚀éé éoooéM🚀Moo 🚀 oé🚀 🚀 éé oo🚀Mo oo éM🚀éoooMMMé🚀Mo", + "0x12c3f580db9e81d094a4305d8963be7dfe3c4a667e5dd86b8ef998c64f6fce", + "104016499172932", + true, + "0x9f047e9cb759f55cffcb8d6b1a28797b334011" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éé éoooéM🚀Moo 🚀 oé🚀 🚀 éé oo🚀Mo oo éM🚀éoooMMMé🚀Mo" + }, + { + "type": "hexstring", + "value": "0x12c3f580db9e81d094a4305d8963be7dfe3c4a667e5dd86b8ef998c64f6fce" + }, + { + "type": "number", + "value": "104016499172932" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x9f047e9cb759f55cffcb8d6b1a28797b334011" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061025d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011c565b60405180910390f35b6040805160a0810182526060808252600060208301819052928201839052810182905260808101919091526040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260006040518060800160405280605b81526020016101cd605b91398252507f12c3f580db9e81d094a4305d8963be7dfe3c4a667e5dd86b8ef998c64f6fce006020820152655e9a3a7be644604082015260016060820152729f047e9cb759f55cffcb8d6b1a28797b33401160681b6080820152919050565b60006020808352835160a08285015280518060c086015260005b818110156101525782810184015186820160e001528301610136565b8181111561016457600060e083880101525b509185015160ff1981166040860152916040860151925061018a606086018460050b9052565b60608601518015156080870152925060808601516cffffffffffffffffffffffffff19811660a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a80c3a9c3a920c3a96f6f6fc3a94df09f9a804d6f6f20f09f9a8020206fc3a9f09f9a8020f09f9a8020c3a9c3a9206f6ff09f9a804d6f206f6f2020c3a94df09f9a80c3a96f6f6f4d4d4dc3a9f09f9a804d6fa26469706673582212207397253f81bc1573a57bb69d97e47c52422f93a665d5e5715bbe5c32295dddb964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_53e60024 {\n string s_0;\n bytes31 s_1;\n int48 s_2;\n bool s_3;\n bytes19 s_4;\n }\n\n function test () public pure returns (S_53e60024 memory) {\n S_53e60024 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éé éoooéM🚀Moo 🚀 oé🚀 🚀 éé oo🚀Mo oo éM🚀éoooMMMé🚀Mo\";\n r.s_0 = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x12c3f580db9e81d094a4305d8963be7dfe3c4a667e5dd86b8ef998c64f6fce);\n r.s_1 = r_1;\n }\n {\n int48 r_2 = 104016499172932;\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n bytes19 r_4 = bytes19(0x9f047e9cb759f55cffcb8d6b1a28797b334011);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a012c3f580db9e81d094a4305d8963be7dfe3c4a667e5dd86b8ef998c64f6fce0000000000000000000000000000000000000000000000000000005e9a3a7be64400000000000000000000000000000000000000000000000000000000000000019f047e9cb759f55cffcb8d6b1a28797b33401100000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a80c3a9c3a920c3a96f6f6fc3a94df09f9a804d6f6f20f09f9a8020206fc3a9f09f9a8020f09f9a8020c3a9c3a9206f6ff09f9a804d6f206f6f2020c3a94df09f9a80c3a96f6f6f4d4d4dc3a9f09f9a804d6f0000000000" + }, + { + "name": "random-(string,bytes4,address,bytes5,address)", + "type": "(string,bytes4,address,bytes5,address)", + "value": [ + "Moo é🚀oé🚀 MooéoMoMMéoo🚀MMé🚀é🚀M oooMM🚀ooo", + "0x9efddfb7", + "0x231E52Adf011822aA10f00e58af1343a90C23080", + "0xc1a304724a", + "0xcf1B584C93DCed27f8Da20d478528742B3Bf6193" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé🚀 MooéoMoMMéoo🚀MMé🚀é🚀M oooMM🚀ooo" + }, + { + "type": "hexstring", + "value": "0x9efddfb7" + }, + { + "type": "address", + "value": "0x231E52Adf011822aA10f00e58af1343a90C23080" + }, + { + "type": "hexstring", + "value": "0xc1a304724a" + }, + { + "type": "address", + "value": "0xcf1B584C93DCed27f8Da20d478528742B3Bf6193" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610244806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610116565b60405180910390f35b6040805160a0810182526060808252600060208301819052928201839052810182905260808101919091526040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260006040518060800160405280604181526020016101ce60419139825250639efddfb760e01b602082015273231e52adf011822aa10f00e58af1343a90c2308060408201526460d182392560d91b606082015273cf1b584c93dced27f8da20d478528742b3bf61936080820152919050565b60006020808352835160a08285015280518060c086015260005b8181101561014c5782810184015186820160e001528301610130565b8181111561015e57600060e083880101525b50918501516001600160e01b0319811660408601529160408601516001600160a01b0381166060870152925060608601516001600160d81b031981166080870152925060808601516001600160a01b03811660a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806fc3a9f09f9a80204d6f6fc3a96f4d6f4d4dc3a96f6ff09f9a804d4dc3a9f09f9a80c3a9f09f9a804d20206f6f6f4d4df09f9a806f6f6fa26469706673582212201ba1e583af57c4d6615efdf83a8eca24fc3d4bc1f9cf09bb5daa0e479c7f613764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_088b9103 {\n string s_0;\n bytes4 s_1;\n address s_2;\n bytes5 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_088b9103 memory) {\n S_088b9103 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oé🚀 MooéoMoMMéoo🚀MMé🚀é🚀M oooMM🚀ooo\";\n r.s_0 = r_0;\n }\n {\n bytes4 r_1 = bytes4(0x9efddfb7);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x231E52Adf011822aA10f00e58af1343a90C23080;\n r.s_2 = r_2;\n }\n {\n bytes5 r_3 = bytes5(0xc1a304724a);\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xcf1B584C93DCed27f8Da20d478528742B3Bf6193;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a09efddfb700000000000000000000000000000000000000000000000000000000000000000000000000000000231e52adf011822aa10f00e58af1343a90c23080c1a304724a000000000000000000000000000000000000000000000000000000000000000000000000000000cf1b584c93dced27f8da20d478528742b3bf619300000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a806fc3a9f09f9a80204d6f6fc3a96f4d6f4d4dc3a96f6ff09f9a804d4dc3a9f09f9a80c3a9f09f9a804d20206f6f6f4d4df09f9a806f6f6f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,int112[][3],bytes27)", + "type": "(string,int112[][3],bytes27)", + "value": [ + "Moo é🚀", + [ + ["1560412903628584639421470229008497", "1000513340414760566480202528881242"], + [], + ["1705541380558832286780651953568760", "2495361629224451954021772841755002"] + ], + "0x1cf1280f23d9a374c650ef82a4538aba937e1e40472f6673d95c40" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1560412903628584639421470229008497" + }, + { + "type": "number", + "value": "1000513340414760566480202528881242" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1705541380558832286780651953568760" + }, + { + "type": "number", + "value": "2495361629224451954021772841755002" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x1cf1280f23d9a374c650ef82a4538aba937e1e40472f6673d95c40" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103a6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c3565b60405180910390f35b610056610205565b61005e610205565b60408051808201909152600a8152689adede418753e13f3560b71b6020820152815261008861022c565b60408051600280825260608201835260009260208301908036833701905050905060006d4cef2e05758a46cbc95abe621071905080826000815181106100d0576100d061035a565b6020026020010190600d0b9081600d0b815250505060006d315440f5cab09f5c76c5dfa67a5a9050808260018151811061010c5761010c61035a565b600d9290920b602092830291909101820152918352506040805160008082528184018352848401919091528151600280825260608201845291939092908301908036833701905050905060006d5416f56be7ba9f41253c91e5bbf89050808260008151811061017d5761017d61035a565b6020026020010190600d0b9081600d0b815250505060006d7b07e44900d1ee5461279c64a17a905080826001815181106101b9576101b961035a565b600d9290920b6020928302919091018201526040808501939093528401929092527f1cf1280f23d9a374c650ef82a4538aba937e1e40472f6673d95c4000000000009083015250919050565b60405180606001604052806060815260200161021f61022c565b8152600060209091015290565b60405180606001604052806003905b606081526020019060019003908161023b5790505090565b60008260608101836000805b60038110156102b7578484038852825180518086526020918201918087019190855b828110156102a0578451600d0b84529381019392810192600101610281565b509a8b019a9196505093909301925060010161025f565b50919695505050505050565b600060208083528351606082850152805180608086015260005b818110156102f95782810184015186820160a0015283016102dd565b8181111561030b57600060a083880101525b5091850151601f92909201601f191684018481036080016040860152905061033660a0820183610253565b9150506040840151610352606085018264ffffffffff19169052565b509392505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ecdacfee8f61ae041e3d9d919c0a973b27ed659bd668cc4662d70ac6211c1a8864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_850e6d50 {\n string s_0;\n int112[][3] s_1;\n bytes27 s_2;\n }\n\n function test () public pure returns (S_850e6d50 memory) {\n S_850e6d50 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀\";\n r.s_0 = r_0;\n }\n {\n int112[][3] memory r_1;\n {\n int112[] memory r_1_0 = new int112[](2);\n {\n int112 r_1_0_0 = 1560412903628584639421470229008497;\n r_1_0[0] = r_1_0_0;\n }\n {\n int112 r_1_0_1 = 1000513340414760566480202528881242;\n r_1_0[1] = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n {\n int112[] memory r_1_1 = new int112[](0);\n r_1[1] = r_1_1;\n }\n {\n int112[] memory r_1_2 = new int112[](2);\n {\n int112 r_1_2_0 = 1705541380558832286780651953568760;\n r_1_2[0] = r_1_2_0;\n }\n {\n int112 r_1_2_1 = 2495361629224451954021772841755002;\n r_1_2[1] = r_1_2_1;\n }\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bytes27 r_2 = bytes27(0x1cf1280f23d9a374c650ef82a4538aba937e1e40472f6673d95c40);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a01cf1280f23d9a374c650ef82a4538aba937e1e40472f6673d95c400000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000004cef2e05758a46cbc95abe621071000000000000000000000000000000000000315440f5cab09f5c76c5dfa67a5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000005416f56be7ba9f41253c91e5bbf80000000000000000000000000000000000007b07e44900d1ee5461279c64a17a" + }, + { + "name": "random-(string,int200,bool,bool,address)", + "type": "(string,int200,bool,bool,address)", + "value": [ + "Moo é🚀oo🚀Méé🚀o é MéM", + "723146089874690040200915350927046693277321411220483104326486", + false, + true, + "0xEbF8939C0Aa5936072D88983Fda7eBF12E9Df692" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀Méé🚀o é MéM" + }, + { + "type": "number", + "value": "723146089874690040200915350927046693277321411220483104326486" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xEbF8939C0Aa5936072D88983Fda7eBF12E9Df692" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061020d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061010e565b60405180910390f35b6040805160a0810182526060808252600060208301819052928201839052810182905260808101919091526040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260006040518060600160405280602281526020016101b6602291398252507873342d75421b699e4a9bfa2b2fe0f81f0ccba4d088d05043566020820152600060408201526001606082015273ebf8939c0aa5936072d88983fda7ebf12e9df6926080820152919050565b60006020808352835160a08285015280518060c086015260005b818110156101445782810184015186820160e001528301610128565b8181111561015657600060e083880101525b50918501519161016b604086018460180b9052565b60408601518015156060870152925060608601518015156080870152925060808601516001600160a01b03811660a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a806f6ff09f9a804dc3a9c3a9f09f9a806f20c3a9204dc3a94da26469706673582212200e41d6c9c01f4208fad46719c3933ad0c2bcbb18cc3075fbe937aab41156edc764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_40a4f307 {\n string s_0;\n int200 s_1;\n bool s_2;\n bool s_3;\n address s_4;\n }\n\n function test () public pure returns (S_40a4f307 memory) {\n S_40a4f307 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oo🚀Méé🚀o é MéM\";\n r.s_0 = r_0;\n }\n {\n int200 r_1 = 723146089874690040200915350927046693277321411220483104326486;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xEbF8939C0Aa5936072D88983Fda7eBF12E9Df692;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000073342d75421b699e4a9bfa2b2fe0f81f0ccba4d088d050435600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ebf8939c0aa5936072d88983fda7ebf12e9df69200000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806f6ff09f9a804dc3a9c3a9f09f9a806f20c3a9204dc3a94d000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,string,address,bool,uint)", + "type": "(string,string,address,bool,uint)", + "value": [ + "Moo é🚀🚀ééééoMoMM Moo 🚀🚀oooM M🚀🚀🚀oooo", + "Moo é🚀 é🚀oooé 🚀é🚀o éééMo éoM🚀 🚀🚀", + "0x303576c4BC3345b5A57A97aDD2a67Cd5b032079e", + false, + "57815014282739456352787702428941965328209798623339436184711548903201589580538" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ééééoMoMM Moo 🚀🚀oooM M🚀🚀🚀oooo" + }, + { + "type": "string", + "value": "Moo é🚀 é🚀oooé 🚀é🚀o éééMo éoM🚀 🚀🚀" + }, + { + "type": "address", + "value": "0x303576c4BC3345b5A57A97aDD2a67Cd5b032079e" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "57815014282739456352787702428941965328209798623339436184711548903201589580538" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610290806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610171565b60405180910390f35b6100566100ea565b61005e6100ea565b60006040518060600160405280603e81526020016101e0603e91398252506040805160608101909152603d8082526000919061021e602083013960208301525073303576c4bc3345b5a57a97add2a67cd5b032079e6040820152600060608201527f7fd22371cbd2a7706fdd7ddb98c99cb5f61748899d22268bf5144b66d08e52fa6080820152919050565b6040518060a00160405280606081526020016060815260200160006001600160a01b03168152602001600015158152602001600081525090565b6000815180845260005b8181101561014a5760208185018101518683018201520161012e565b8181111561015c576000602083870101525b50601f01601f19169290920160200192915050565b602081526000825160a0602084015261018d60c0840182610124565b90506020840151601f198483030160408501526101aa8282610124565b91505060018060a01b036040850151166060840152606084015115156080840152608084015160a0840152809150509291505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9c3a9c3a96f4d6f4d4d204d6f6f20f09f9a80f09f9a806f6f6f4d204df09f9a80f09f9a80f09f9a806f6f6f6f4d6f6f20c3a9f09f9a8020c3a9f09f9a806f6f6fc3a920f09f9a80c3a9f09f9a806f20c3a9c3a9c3a94d6f20c3a96f4df09f9a8020f09f9a80f09f9a80a264697066735822122019783c06f5420f63f37e5b5c7444be8e2232472b977c539e509fb061e0ba2f5364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_26ebd101 {\n string s_0;\n string s_1;\n address s_2;\n bool s_3;\n uint256 s_4;\n }\n\n function test () public pure returns (S_26ebd101 memory) {\n S_26ebd101 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀ééééoMoMM Moo 🚀🚀oooM M🚀🚀🚀oooo\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 é🚀oooé 🚀é🚀o éééMo éoM🚀 🚀🚀\";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x303576c4BC3345b5A57A97aDD2a67Cd5b032079e;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n uint r_4 = 57815014282739456352787702428941965328209798623339436184711548903201589580538;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000303576c4bc3345b5a57a97add2a67cd5b032079e00000000000000000000000000000000000000000000000000000000000000007fd22371cbd2a7706fdd7ddb98c99cb5f61748899d22268bf5144b66d08e52fa000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9c3a9c3a96f4d6f4d4d204d6f6f20f09f9a80f09f9a806f6f6f4d204df09f9a80f09f9a80f09f9a806f6f6f6f0000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a8020c3a9f09f9a806f6f6fc3a920f09f9a80c3a9f09f9a806f20c3a9c3a9c3a94d6f20c3a96f4df09f9a8020f09f9a80f09f9a80000000" + }, + { + "name": "random-(string,string[],address,uint88)", + "type": "(string,string[],address,uint88)", + "value": [ + "Moo é🚀 oé M o🚀éo🚀 é é🚀M🚀MoooMM🚀 ", + [], + "0xf9FA809d3203c530Cda074596d595963ac14dab2", + "201747260491567223322108355" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oé M o🚀éo🚀 é é🚀M🚀MoooMM🚀 " + }, + { + "type": "array", + "value": [] + }, + { + "type": "address", + "value": "0xf9FA809d3203c530Cda074596d595963ac14dab2" + }, + { + "type": "number", + "value": "201747260491567223322108355" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610289806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610169565b60405180910390f35b6100566100de565b61005e6100de565b600060405180606001604052806037815260200161021d6037913982525060408051600080825260208201909252816100a7565b60608152602001906001900390816100925790505b5060208301525073f9fa809d3203c530cda074596d595963ac14dab260408201526aa6e1a4e7e8eb3308c6e1c36060820152919050565b6040518060800160405280606081526020016060815260200160006001600160a01b0316815260200160006affffffffffffffffffffff1681525090565b6000815180845260005b8181101561014257602081850181015186830182015201610126565b81811115610154576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160808285015261018560a085018261011c565b82860151601f198683038101604088015281518084529293509084019183850190600581901b8501860160005b828110156101de57848783030184526101cc82875161011c565b958801959388019391506001016101b2565b5060408a01516001600160a01b03811660608b0152965060608a01516affffffffffffffffffffff811660808b01529650999850505050505050505056fe4d6f6f20c3a9f09f9a80206fc3a9204d206ff09f9a80c3a96ff09f9a8020c3a920c3a9f09f9a804df09f9a804d6f6f6f4d4df09f9a8020a2646970667358221220b1a952c5d893b9c91eaed6392000cf16894d53373911b6583247f6c0f94f49d764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a0ae3c2e {\n string s_0;\n string[] s_1;\n address s_2;\n uint88 s_3;\n }\n\n function test () public pure returns (S_a0ae3c2e memory) {\n S_a0ae3c2e memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 oé M o🚀éo🚀 é é🚀M🚀MoooMM🚀 \";\n r.s_0 = r_0;\n }\n {\n string[] memory r_1 = new string[](0);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xf9FA809d3203c530Cda074596d595963ac14dab2;\n r.s_2 = r_2;\n }\n {\n uint88 r_3 = 201747260491567223322108355;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000f9fa809d3203c530cda074596d595963ac14dab2000000000000000000000000000000000000000000a6e1a4e7e8eb3308c6e1c300000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80206fc3a9204d206ff09f9a80c3a96ff09f9a8020c3a920c3a9f09f9a804df09f9a804d6f6f6f4d4df09f9a80200000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,string[4],int88,bytes26)", + "type": "(string,string[4],int88,bytes26)", + "value": [ + "Moo é🚀ooM🚀 o🚀éé🚀éoooééMMMoM🚀", + [ + "Moo é🚀 oéMooMoéo🚀🚀🚀oM", + "Moo é🚀oéé🚀oé🚀éMé o", + "Moo é🚀 MMéoéoo🚀é", + "Moo é🚀 M🚀oooo ooMooo" + ], + "72847462964428875083598220", + "0xa64509771e3654956f6615589e9d88ceb0ab6b9e7075d96e09be" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooM🚀 o🚀éé🚀éoooééMMMoM🚀" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oéMooMoéo🚀🚀🚀oM" + }, + { + "type": "string", + "value": "Moo é🚀oéé🚀oé🚀éMé o" + }, + { + "type": "string", + "value": "Moo é🚀 MMéoéoo🚀é" + }, + { + "type": "string", + "value": "Moo é🚀 M🚀oooo ooMooo" + } + ] + }, + { + "type": "number", + "value": "72847462964428875083598220" + }, + { + "type": "hexstring", + "value": "0xa64509771e3654956f6615589e9d88ceb0ab6b9e7075d96e09be" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610363806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061021d565b60405180910390f35b61005661017b565b61005e61017b565b60006040518060600160405280603181526020016102fd603191398252506100846101a9565b60006040518060600160405280602481526020016102b86024913982525060408051606081019091526021808252600091906102dc6020830139602083810191909152604080518082018252601a81527f4d6f6f20c3a9f09f9a80204d4dc3a96fc3a96f6ff09f9a80c3a9000000000000818401528185015280518082018252601c81527f4d6f6f20c3a9f09f9a8020204df09f9a806f6f6f6f206f6f4d6f6f6f0000000081840152606080860191909152918501939093526a3c420ce15ba3acb054c98c92840192909252507fa64509771e3654956f6615589e9d88ceb0ab6b9e7075d96e09be00000000000090820152919050565b6040518060800160405280606081526020016101956101a9565b815260006020820181905260409091015290565b60405180608001604052806004905b60608152602001906001900390816101b85790505090565b6000815180845260005b818110156101f6576020818501810151868301820152016101da565b81811115610208576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160808285015261023960a08501826101d0565b85830151858203601f19016040870152909150816080810160005b600481101561027f57848203835261026d8285516101d0565b93860193928601929150600101610254565b50604088015194506102966060880186600a0b9052565b606088015165ffffffffffff1981166080890152945097965050505050505056fe4d6f6f20c3a9f09f9a80206fc3a94d6f6f4d6fc3a96ff09f9a80f09f9a80f09f9a806f4d4d6f6f20c3a9f09f9a806fc3a9c3a9f09f9a806fc3a9f09f9a80c3a94dc3a9206f4d6f6f20c3a9f09f9a806f6f4df09f9a80206ff09f9a80c3a9c3a9f09f9a80c3a96f6f6fc3a9c3a94d4d4d6f4df09f9a80a2646970667358221220da17020b2a9db92a3cbef2a52b4cb240a081d443831057c343f41aaa51f9f67664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_cb50affe {\n string s_0;\n string[4] s_1;\n int88 s_2;\n bytes26 s_3;\n }\n\n function test () public pure returns (S_cb50affe memory) {\n S_cb50affe memory r;\n {\n string memory r_0 = unicode\"Moo é🚀ooM🚀 o🚀éé🚀éoooééMMMoM🚀\";\n r.s_0 = r_0;\n }\n {\n string[4] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀 oéMooMoéo🚀🚀🚀oM\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oéé🚀oé🚀éMé o\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀 MMéoéoo🚀é\";\n r_1[2] = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀 M🚀oooo ooMooo\";\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n int88 r_2 = 72847462964428875083598220;\n r.s_2 = r_2;\n }\n {\n bytes26 r_3 = bytes26(0xa64509771e3654956f6615589e9d88ceb0ab6b9e7075d96e09be);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000003c420ce15ba3acb054c98ca64509771e3654956f6615589e9d88ceb0ab6b9e7075d96e09be00000000000000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806f6f4df09f9a80206ff09f9a80c3a9c3a9f09f9a80c3a96f6f6fc3a9c3a94d4d4d6f4df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a80206fc3a94d6f6f4d6fc3a96ff09f9a80f09f9a80f09f9a806f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a806fc3a9c3a9f09f9a806fc3a9f09f9a80c3a94dc3a9206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a80204d4dc3a96fc3a96f6ff09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a8020204df09f9a806f6f6f6f206f6f4d6f6f6f00000000" + }, + { + "name": "random-(string[2],bytes22,int128,bool)", + "type": "(string[2],bytes22,int128,bool)", + "value": [ + ["Moo é🚀MMéMoM🚀o🚀🚀o 🚀ééoooo é o🚀", "Moo é🚀o o🚀o "], + "0xb8f849843138be154746e6f3ce5b3ec548bbb7b5c6f4", + "-113137895541668566508653735889209596260", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMéMoM🚀o🚀🚀o 🚀ééoooo é o🚀" + }, + { + "type": "string", + "value": "Moo é🚀o o🚀o " + } + ] + }, + { + "type": "hexstring", + "value": "0xb8f849843138be154746e6f3ce5b3ec548bbb7b5c6f4" + }, + { + "type": "number", + "value": "-113137895541668566508653735889209596260" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610153565b60405180910390f35b6100566100fe565b61005e6100fe565b61006661012c565b6000604051806060016040528060388152602001610220603891398252506040805180820182526013815272026b7b79061d4f84fcd40379037f84fcd40379606d1b60208083019190915280840191909152918352752e3e12610c4e2f8551d1b9bcf396cfb1522eeded71bd60521b918301919091526f551d90eb119ddd18a0c7ba7461731963199082015260006060820152919050565b604051806080016040528061011161012c565b81526000602082018190526040820181905260609091015290565b60405180604001604052806002905b606081526020019060019003908161013b5790505090565b602080825282516080838301526000919060e084019060a0850184805b60028110156101d657878503609f1901835283518051808752835b818110156101a6578281018901518882018a0152880161018b565b818111156101b6578489838a0101525b50601f01601f191695909501860194509285019291850191600101610170565b505050509084015169ffffffffffffffffffff198116604085015290604085015191506102086060850183600f0b9052565b60608501518015156080860152915094935050505056fe4d6f6f20c3a9f09f9a804d4dc3a94d6f4df09f9a806ff09f9a80f09f9a806f2020f09f9a80c3a9c3a96f6f6f6f20c3a92020206ff09f9a80a2646970667358221220a700576bea0ebe9a5bb20ccb750fd0dea357819d7a20dcc61ff9b1bf4171105f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_50577ead {\n string[2] s_0;\n bytes22 s_1;\n int128 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_50577ead memory) {\n S_50577ead memory r;\n {\n string[2] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀MMéMoM🚀o🚀🚀o 🚀ééoooo é o🚀\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀o o🚀o \";\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n bytes22 r_1 = bytes22(0xb8f849843138be154746e6f3ce5b3ec548bbb7b5c6f4);\n r.s_1 = r_1;\n }\n {\n int128 r_2 = -113137895541668566508653735889209596260;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080b8f849843138be154746e6f3ce5b3ec548bbb7b5c6f400000000000000000000ffffffffffffffffffffffffffffffffaae26f14ee6222e75f38458b9e8ce69c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a804d4dc3a94d6f4df09f9a806ff09f9a80f09f9a806f2020f09f9a80c3a9c3a96f6f6f6f20c3a92020206ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806f206ff09f9a806f2000000000000000000000000000" + }, + { + "name": "random-(string[3],bool,bool,bytes8)", + "type": "(string[3],bool,bool,bytes8)", + "value": [ + [ + "Moo é🚀oo o🚀ééM Mé🚀ooooMooo🚀oo 🚀M", + "Moo é🚀éooo🚀Mo éo🚀ooéMoMM M é oéééo oMéé🚀oooéooé 🚀Moo🚀", + "Moo é🚀o🚀🚀MMééo Mo🚀éé🚀 o éMooéooo ooMéoMMé é éo🚀oo" + ], + true, + true, + "0x5688af0f830f47cc" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo o🚀ééM Mé🚀ooooMooo🚀oo 🚀M" + }, + { + "type": "string", + "value": "Moo é🚀éooo🚀Mo éo🚀ooéMoMM M é oéééo oMéé🚀oooéooé 🚀Moo🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀MMééo Mo🚀éé🚀 o éMooéooo ooMéoMMé é éo🚀oo" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x5688af0f830f47cc" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061031a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061014f565b60405180910390f35b6100566100fa565b61005e6100fa565b610066610128565b60006040518060600160405280603381526020016102b2603391398252506040805160808101909152605480825260009190610210602083013990508082600160200201819052505060006040518060800160405280604e8152602001610264604e913960408084019190915291835250600160208301819052908201526715a22bc3e0c3d1f360c21b6060820152919050565b604051806080016040528061010d610128565b81526000602082018190526040820181905260609091015290565b60405180606001604052806003905b60608152602001906001900390816101375790505090565b602080825282516080838301526000919061010084019060a0850184805b60038110156101d357878503609f1901835283518051808752835b818110156101a3578281018901518882018a01528801610188565b818111156101b3578489838a0101525b50601f01601f19169590950186019450928501929185019160010161016d565b505050509084015115156040848101919091528401511515606080850191909152909301516001600160c01b031916608090920191909152509056fe4d6f6f20c3a9f09f9a80c3a96f6f6ff09f9a804d6f20c3a96ff09f9a806f6fc3a94d6f4d4d204d20c3a920206fc3a9c3a9c3a96f206f4dc3a9c3a9f09f9a806f6f6fc3a96f6fc3a920f09f9a804d6f6ff09f9a804d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d4dc3a9c3a96f204d6ff09f9a80c3a9c3a9f09f9a80206f20c3a94d6f6fc3a96f6f6f206f6f4dc3a96f4d4dc3a920c3a920c3a96ff09f9a806f6f4d6f6f20c3a9f09f9a806f6f206ff09f9a80c3a9c3a94d204dc3a9f09f9a806f6f6f6f4d6f6f6ff09f9a806f6f20f09f9a804da2646970667358221220bda90a5de2c48cf7c750d9df5500cd3afce63ef9e9b18940a8aaa24d3d7747b164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fe73d664 {\n string[3] s_0;\n bool s_1;\n bool s_2;\n bytes8 s_3;\n }\n\n function test () public pure returns (S_fe73d664 memory) {\n S_fe73d664 memory r;\n {\n string[3] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀oo o🚀ééM Mé🚀ooooMooo🚀oo 🚀M\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀éooo🚀Mo éo🚀ooéMoMM M é oéééo oMéé🚀oooéooé 🚀Moo🚀\";\n r_0[1] = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀o🚀🚀MMééo Mo🚀éé🚀 o éMooéooo ooMéoMMé é éo🚀oo\";\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n bytes8 r_3 = bytes8(0x5688af0f830f47cc);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000015688af0f830f47cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a806f6f206ff09f9a80c3a9c3a94d204dc3a9f09f9a806f6f6f6f4d6f6f6ff09f9a806f6f20f09f9a804d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a80c3a96f6f6ff09f9a804d6f20c3a96ff09f9a806f6fc3a94d6f4d4d204d20c3a920206fc3a9c3a9c3a96f206f4dc3a9c3a9f09f9a806f6f6fc3a96f6fc3a920f09f9a804d6f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d4dc3a9c3a96f204d6ff09f9a80c3a9c3a9f09f9a80206f20c3a94d6f6fc3a96f6f6f206f6f4dc3a96f4d4dc3a920c3a920c3a96ff09f9a806f6f000000000000000000000000000000000000" + }, + { + "name": "random-(uint,address,bool,address,int8)", + "type": "(uint,address,bool,address,int8)", + "value": [ + "21616205022737158653482810610059754300000889367205823343318616388595957097225", + "0xB5A7cBf67D371892A7BCdE9d4704138ECD14c0b8", + true, + "0x955a074380517B2832177417fdB144a5bcf5C7f8", + "95" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "21616205022737158653482810610059754300000889367205823343318616388595957097225" + }, + { + "type": "address", + "value": "0xB5A7cBf67D371892A7BCdE9d4704138ECD14c0b8" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x955a074380517B2832177417fdB144a5bcf5C7f8" + }, + { + "type": "number", + "value": "95" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101458061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a080820183526000808352602080840182905283850182905260608085018390526080948501839052855180850187527f2fca56a63fa248a298e0a0e855ee9861b2301ad19dbceea4caba20b2df37e30980825273b5a7cbf67d371892a7bcde9d4704138ecd14c0b88285019081526001838a0190815273955a074380517b2832177417fdb144a5bcf5c7f8848601908152605f948a019485528a5193845291516001600160a01b03908116968401969096525115159882019890985296519092169086015251900b918301919091520160405180910390f3fea2646970667358221220e95642e551ebcf6958b5e5e3f51a2e63801c531245900e4a20c3b7fec67b0fe664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_54215f4e {\n uint256 s_0;\n address s_1;\n bool s_2;\n address s_3;\n int8 s_4;\n }\n\n function test () public pure returns (S_54215f4e memory) {\n S_54215f4e memory r;\n {\n uint r_0 = 21616205022737158653482810610059754300000889367205823343318616388595957097225;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xB5A7cBf67D371892A7BCdE9d4704138ECD14c0b8;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x955a074380517B2832177417fdB144a5bcf5C7f8;\n r.s_3 = r_3;\n }\n {\n int8 r_4 = 95;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x2fca56a63fa248a298e0a0e855ee9861b2301ad19dbceea4caba20b2df37e309000000000000000000000000b5a7cbf67d371892a7bcde9d4704138ecd14c0b80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000955a074380517b2832177417fdb144a5bcf5c7f8000000000000000000000000000000000000000000000000000000000000005f" + }, + { + "name": "random-(uint160[4],bool,bool)[3]", + "type": "(uint160[4],bool,bool)[3]", + "value": [ + [ + [ + "206812964373285716497200397865405157459298588425", + "398349588486513236206520564278341406936514505025", + "163392546508137641015941477323577944979880605638", + "377275273388274737486963631508708874290879224017" + ], + false, + true + ], + [ + [ + "1291443452519084660447859227986601659518541638460", + "112058630412344602580297230270401630924721837233", + "1310776432618434588878573426769822304643500563551", + "896249742481810554251029260932183625446607230611" + ], + true, + true + ], + [ + [ + "1170111064559699268427173911742174379072918272273", + "90922911130247568793550702700741138240793013800", + "1297149906220221980314137464340054443783182741895", + "526481228670254156918116039121105910508933210228" + ], + true, + true + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "206812964373285716497200397865405157459298588425" + }, + { + "type": "number", + "value": "398349588486513236206520564278341406936514505025" + }, + { + "type": "number", + "value": "163392546508137641015941477323577944979880605638" + }, + { + "type": "number", + "value": "377275273388274737486963631508708874290879224017" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1291443452519084660447859227986601659518541638460" + }, + { + "type": "number", + "value": "112058630412344602580297230270401630924721837233" + }, + { + "type": "number", + "value": "1310776432618434588878573426769822304643500563551" + }, + { + "type": "number", + "value": "896249742481810554251029260932183625446607230611" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1170111064559699268427173911742174379072918272273" + }, + { + "type": "number", + "value": "90922911130247568793550702700741138240793013800" + }, + { + "type": "number", + "value": "1297149906220221980314137464340054443783182741895" + }, + { + "type": "number", + "value": "526481228670254156918116039121105910508933210228" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610337806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610284565b60405180910390f35b610056610212565b61005e610212565b61006661023f565b61006e610266565b732439d0663e7827ac73b26759b3147af40e9b970981527345c69d034bb2df58b76920c68a639be1bde52941602080830191909152731c9ec672778aa330d0d4a3d05ed7edf051ccf7c66040808401919091527342159bbd6e9feab1c8168c57a0ece0fca41358d1606084015291835260009083015260019082015281526100f461023f565b6100fc610266565b73e23653c71b460f00a79645406d75b6e568702b3c81527313a0e1fd86c7aa6952f880ca95784f2b2f1354b160208083019190915273e5993f8155bc1cf5487f59091b9a8909c3a55c5f604080840191909152739cfd3a790882c918cfc01465c71736a7a44f1693606084015291835260018382018190529183019190915282015261018661023f565b61018e610266565b73ccf598458fbb1865472d444305808c57f5c639118152730fed1fd4fc1c542bc165e936ebe05e5a621cee2860208083019190915273e33636a7542e0835ad9f607204918291a0a5f187604080840191909152735c383c1b4a269e7ab94858eea49797bae395e0746060840152918352600190830181905282820152820152919050565b60405180606001604052806003905b61022961023f565b8152602001906001900390816102215790505090565b6040518060600160405280610252610266565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b610240810181836000805b60038110156102f7578251805185845b60048110156102c75782516001600160a01b031682526020928301929091019060010161029f565b50505060208181015115156080870152604090910151151560a086015260c090940193929092019160010161028f565b505050509291505056fea2646970667358221220aa80c18e8647f973a0df348d085c816edc0137244ca7c784990a3f0768db0a0d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_30d0eb74 {\n uint160[4] s_0;\n bool s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_30d0eb74[3] memory) {\n S_30d0eb74[3] memory r;\n {\n S_30d0eb74 memory r_0;\n {\n uint160[4] memory r_0_0;\n {\n uint160 r_0_0_0 = 206812964373285716497200397865405157459298588425;\n r_0_0[0] = r_0_0_0;\n }\n {\n uint160 r_0_0_1 = 398349588486513236206520564278341406936514505025;\n r_0_0[1] = r_0_0_1;\n }\n {\n uint160 r_0_0_2 = 163392546508137641015941477323577944979880605638;\n r_0_0[2] = r_0_0_2;\n }\n {\n uint160 r_0_0_3 = 377275273388274737486963631508708874290879224017;\n r_0_0[3] = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_30d0eb74 memory r_1;\n {\n uint160[4] memory r_1_0;\n {\n uint160 r_1_0_0 = 1291443452519084660447859227986601659518541638460;\n r_1_0[0] = r_1_0_0;\n }\n {\n uint160 r_1_0_1 = 112058630412344602580297230270401630924721837233;\n r_1_0[1] = r_1_0_1;\n }\n {\n uint160 r_1_0_2 = 1310776432618434588878573426769822304643500563551;\n r_1_0[2] = r_1_0_2;\n }\n {\n uint160 r_1_0_3 = 896249742481810554251029260932183625446607230611;\n r_1_0[3] = r_1_0_3;\n }\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n bool r_1_2 = true;\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_30d0eb74 memory r_2;\n {\n uint160[4] memory r_2_0;\n {\n uint160 r_2_0_0 = 1170111064559699268427173911742174379072918272273;\n r_2_0[0] = r_2_0_0;\n }\n {\n uint160 r_2_0_1 = 90922911130247568793550702700741138240793013800;\n r_2_0[1] = r_2_0_1;\n }\n {\n uint160 r_2_0_2 = 1297149906220221980314137464340054443783182741895;\n r_2_0[2] = r_2_0_2;\n }\n {\n uint160 r_2_0_3 = 526481228670254156918116039121105910508933210228;\n r_2_0[3] = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000002439d0663e7827ac73b26759b3147af40e9b970900000000000000000000000045c69d034bb2df58b76920c68a639be1bde529410000000000000000000000001c9ec672778aa330d0d4a3d05ed7edf051ccf7c600000000000000000000000042159bbd6e9feab1c8168c57a0ece0fca41358d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e23653c71b460f00a79645406d75b6e568702b3c00000000000000000000000013a0e1fd86c7aa6952f880ca95784f2b2f1354b1000000000000000000000000e5993f8155bc1cf5487f59091b9a8909c3a55c5f0000000000000000000000009cfd3a790882c918cfc01465c71736a7a44f169300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ccf598458fbb1865472d444305808c57f5c639110000000000000000000000000fed1fd4fc1c542bc165e936ebe05e5a621cee28000000000000000000000000e33636a7542e0835ad9f607204918291a0a5f1870000000000000000000000005c383c1b4a269e7ab94858eea49797bae395e07400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(uint200,address,string,bytes28,bool)", + "type": "(uint200,address,string,bytes28,bool)", + "value": [ + "1466685239523560880552795936968613163966722432732832348591912", + "0x30D346fA2e2f579959f7EFDC209D1e69D597BD36", + "Moo é🚀éoéééooM M🚀o🚀M🚀 🚀MMMM🚀🚀oé🚀 o🚀 ééoooM", + "0x81fbce4e01f533c53672a5243480939e094c136e04ed963c91f3348c", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "1466685239523560880552795936968613163966722432732832348591912" + }, + { + "type": "address", + "value": "0x30D346fA2e2f579959f7EFDC209D1e69D597BD36" + }, + { + "type": "string", + "value": "Moo é🚀éoéééooM M🚀o🚀M🚀 🚀MMMM🚀🚀oé🚀 o🚀 ééoooM" + }, + { + "type": "hexstring", + "value": "0x81fbce4e01f533c53672a5243480939e094c136e04ed963c91f3348c" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061024d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061011e565b60405180910390f35b6040805160a0808201835260008083526020808401829052606084860181905280850183905260808086018490528651948501875284870182905290840183905283810183905278e9a80c6502fe4b6e2afcb01fa38aafb9760e8ca1b31591572884527330d346fa2e2f579959f7efdc209d1e69d597bd36848301528551908101909552604d80865293949293919291906101cb908301396040830152507f81fbce4e01f533c53672a5243480939e094c136e04ed963c91f3348c00000000606082015260016080820152919050565b602080825282516001600160c81b031682820152828101516001600160a01b031660408084019190915283015160a06060840152805160c084018190526000929190835b8181101561017e5782810184015186820160e001528301610162565b8181111561019057600060e083880101525b50606086015163ffffffff19811660808701529250608086015180151560a08701529250601f01601f19169390930160e00194935050505056fe4d6f6f20c3a9f09f9a80c3a96fc3a9c3a9c3a96f6f4d204df09f9a806ff09f9a804df09f9a8020f09f9a804d4d4d4df09f9a80f09f9a806fc3a9f09f9a80206ff09f9a8020c3a9c3a96f6f6f4da2646970667358221220deb611e9ad0e3830476e3008e949b8bcb4e0c422b626f920a8bb1ad38703941f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3e342fcf {\n uint200 s_0;\n address s_1;\n string s_2;\n bytes28 s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_3e342fcf memory) {\n S_3e342fcf memory r;\n {\n uint200 r_0 = 1466685239523560880552795936968613163966722432732832348591912;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x30D346fA2e2f579959f7EFDC209D1e69D597BD36;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀éoéééooM M🚀o🚀M🚀 🚀MMMM🚀🚀oé🚀 o🚀 ééoooM\";\n r.s_2 = r_2;\n }\n {\n bytes28 r_3 = bytes28(0x81fbce4e01f533c53672a5243480939e094c136e04ed963c91f3348c);\n r.s_3 = r_3;\n }\n {\n bool r_4 = true;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000e9a80c6502fe4b6e2afcb01fa38aafb9760e8ca1b31591572800000000000000000000000030d346fa2e2f579959f7efdc209d1e69d597bd3600000000000000000000000000000000000000000000000000000000000000a081fbce4e01f533c53672a5243480939e094c136e04ed963c91f3348c000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80c3a96fc3a9c3a9c3a96f6f4d204df09f9a806ff09f9a804df09f9a8020f09f9a804d4d4d4df09f9a80f09f9a806fc3a9f09f9a80206ff09f9a8020c3a9c3a96f6f6f4d00000000000000000000000000000000000000" + }, + { + "name": "random-(uint216,(bool,string,string[]))", + "type": "(uint216,(bool,string,string[]))", + "value": [ + "37269259211678110413027565335925473115767764488750329966908393013", + [ + false, + "Moo é🚀o 🚀🚀éo o éoooM é🚀Mo🚀o MéMoo Mé oo🚀 éoééM🚀 Mo 🚀ooo", + [ + "Moo é🚀 é", + "Moo é🚀é🚀 é é Moooo", + "Moo é🚀 Mo🚀Méo🚀éoé 🚀 oMMoéooéoéMé oM oMMéo🚀🚀o", + "Moo é🚀é🚀M MooéooééMo🚀oo🚀oo🚀🚀 oé🚀Moé oMooMooMé🚀é🚀🚀🚀o🚀 oéo " + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "37269259211678110413027565335925473115767764488750329966908393013" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o 🚀🚀éo o éoooM é🚀Mo🚀o MéMoo Mé oo🚀 éoééM🚀 Mo 🚀ooo" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é" + }, + { + "type": "string", + "value": "Moo é🚀é🚀 é é Moooo" + }, + { + "type": "string", + "value": "Moo é🚀 Mo🚀Méo🚀éoé 🚀 oMMoéooéoéMé oM oMMéo🚀🚀o" + }, + { + "type": "string", + "value": "Moo é🚀é🚀M MooéooééMo🚀oo🚀oo🚀🚀 oé🚀Moé oMooMooMé🚀é🚀🚀🚀o🚀 oéo " + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104ad806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102b0565b60405180910390f35b61005661021d565b61005e61021d565b7a5a98b789d4bbbca09aa361253ea1066d99145c352df0d07907c635815260408051606080820183526000825260208201819052918101919091526000808252604080516080810190915260588082526103b7602083013960208301525060408051600480825260a08201909252600091816020015b60608152602001906001900390816100d457905050905060006040518060400160405280600d81526020016c4d6f6f20c3a9f09f9a8020c3a960981b8152509050808260008151811061012957610129610359565b60200260200101819052505060006040518060400160405280601c81526020017f4d6f6f20c3a9f09f9a80c3a9f09f9a8020c3a920c3a9204d6f6f6f6f000000008152509050808260018151811061018357610183610359565b602002602001018190525050600060405180608001604052806047815260200161037060479139905080826002815181106101c0576101c0610359565b60200260200101819052505060006040518060a001604052806069815260200161040f60699139905080826003815181106101fd576101fd610359565b602090810291909101810191909152604084019290925250820152919050565b604051806040016040528060006001600160d81b0316815260200161025e604051806060016040528060001515815260200160608152602001606081525090565b905290565b6000815180845260005b818110156102895760208185018101518683018201520161026d565b8181111561029b576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835260018060d81b03845116818401528084015160408085015280511515606085015281810151606060808601526102f060c0860182610263565b60409290920151858303605f190160a0870152805180845290840192915083820190600581901b8301850160005b8281101561034c57601f1985830301845261033a828751610263565b9587019593870193915060010161031e565b5098975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80204d6ff09f9a804dc3a96ff09f9a80c3a96fc3a920f09f9a80206f4d4d6fc3a96f6fc3a96fc3a94dc3a9206f4d206f4d4dc3a96ff09f9a80f09f9a806f4d6f6f20c3a9f09f9a806f20f09f9a80f09f9a80c3a96f206f20c3a96f6f6f4d20c3a9f09f9a804d6ff09f9a806f204dc3a94d6f6f204dc3a9206f6ff09f9a8020c3a96fc3a9c3a94df09f9a80204d6f20f09f9a806f6f6f4d6f6f20c3a9f09f9a80c3a9f09f9a804d204d6f6fc3a96f6fc3a9c3a94d6ff09f9a806f6ff09f9a806f6ff09f9a80f09f9a8020206fc3a9f09f9a804d6fc3a920206f4d6f6f4d6f6f4dc3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a806ff09f9a80206fc3a96f20a26469706673582212201883f6cea7da0eac5f2fa3dda1a067fdeda6f34c28e07ad1043dd86282b25bd564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_447cf756 {\n bool s_0;\n string s_1;\n string[] s_2;\n }\n\n struct S_4b3ee88e {\n uint216 s_0;\n S_447cf756 s_1;\n }\n\n function test () public pure returns (S_4b3ee88e memory) {\n S_4b3ee88e memory r;\n {\n uint216 r_0 = 37269259211678110413027565335925473115767764488750329966908393013;\n r.s_0 = r_0;\n }\n {\n S_447cf756 memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀o 🚀🚀éo o éoooM é🚀Mo🚀o MéMoo Mé oo🚀 éoééM🚀 Mo 🚀ooo\";\n r_1.s_1 = r_1_1;\n }\n {\n string[] memory r_1_2 = new string[](4);\n {\n string memory r_1_2_0 = unicode\"Moo é🚀 é\";\n r_1_2[0] = r_1_2_0;\n }\n {\n string memory r_1_2_1 = unicode\"Moo é🚀é🚀 é é Moooo\";\n r_1_2[1] = r_1_2_1;\n }\n {\n string memory r_1_2_2 = unicode\"Moo é🚀 Mo🚀Méo🚀éoé 🚀 oMMoéooéoéMé oM oMMéo🚀🚀o\";\n r_1_2[2] = r_1_2_2;\n }\n {\n string memory r_1_2_3 = unicode\"Moo é🚀é🚀M MooéooééMo🚀oo🚀oo🚀🚀 oé🚀Moé oMooMooMé🚀é🚀🚀🚀o🚀 oéo \";\n r_1_2[3] = r_1_2_3;\n }\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000005a98b789d4bbbca09aa361253ea1066d99145c352df0d07907c63500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806f20f09f9a80f09f9a80c3a96f206f20c3a96f6f6f4d20c3a9f09f9a804d6ff09f9a806f204dc3a94d6f6f204dc3a9206f6ff09f9a8020c3a96fc3a9c3a94df09f9a80204d6f20f09f9a806f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a8020c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80c3a9f09f9a8020c3a920c3a9204d6f6f6f6f0000000000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a80204d6ff09f9a804dc3a96ff09f9a80c3a96fc3a920f09f9a80206f4d4d6fc3a96f6fc3a96fc3a94dc3a9206f4d206f4d4dc3a96ff09f9a80f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a80c3a9f09f9a804d204d6f6fc3a96f6fc3a9c3a94d6ff09f9a806f6ff09f9a806f6ff09f9a80f09f9a8020206fc3a9f09f9a804d6fc3a920206f4d6f6f4d6f6f4dc3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a806ff09f9a80206fc3a96f200000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint48,bool,int8,int232,bytes8)", + "type": "(uint48,bool,int8,int232,bytes8)", + "value": [ + "8849554832167", + true, + "79", + "-1799200249094320311329176611620416148326036524086530161272121320254483", + "0x0ce77c85b8edc798" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "8849554832167" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "79" + }, + { + "type": "number", + "value": "-1799200249094320311329176611620416148326036524086530161272121320254483" + }, + { + "type": "hexstring", + "value": "0x0ce77c85b8edc798" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b5061012b8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160a0808201835260008083526020808401829052838501829052606080850183905260809485018390528551808501875265080c72927b278082526001828501908152604f838a019081527fffffffbd4392783208d56cf11327c05fb9c3b52812f0882d72f12e672dc053ed84860190815267019cef90b71db8f360c31b948a019485528a519384529151151595830195909552935190940b848801529151601c0b90830152516001600160c01b0319169281019290925291519081900390910190f3fea2646970667358221220ba0c21a84851a1fab90d5b49eb2178620afb9098d472ef181b47538d38394f7b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2a9a220f {\n uint48 s_0;\n bool s_1;\n int8 s_2;\n int232 s_3;\n bytes8 s_4;\n }\n\n function test () public pure returns (S_2a9a220f memory) {\n S_2a9a220f memory r;\n {\n uint48 r_0 = 8849554832167;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n int8 r_2 = 79;\n r.s_2 = r_2;\n }\n {\n int232 r_3 = -1799200249094320311329176611620416148326036524086530161272121320254483;\n r.s_3 = r_3;\n }\n {\n bytes8 r_4 = bytes8(0x0ce77c85b8edc798);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000080c72927b270000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004fffffffbd4392783208d56cf11327c05fb9c3b52812f0882d72f12e672dc053ed0ce77c85b8edc798000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint8,bool,bool,bytes30,bytes4)", + "type": "(uint8,bool,bool,bytes30,bytes4)", + "value": [ + "199", + true, + true, + "0x73ca0947c80591b6315ca332083686f248e8c7ef7a6722fd25889f23bf32", + "0x636d9291" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "199" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x73ca0947c80591b6315ca332083686f248e8c7ef7a6722fd25889f23bf32" + }, + { + "type": "hexstring", + "value": "0x636d9291" + } + ] + }, + "bytecode": "0x6080604052348015600f57600080fd5b506101258061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b6040805160a080820183526000808352602080840182905283850182905260608085018390526080948501929092528451808401865260c780825260018284018181528389019182527f73ca0947c80591b6315ca332083686f248e8c7ef7a6722fd25889f23bf32000084870190815263636d929160e01b9489019485528951938452905115159483019490945251151596810196909652905161ffff191691850191909152516001600160e01b031916918301919091520160405180910390f3fea26469706673582212206ae8c271479ec76395110cf604fff453efd228e867214bc93ea834259163f0e164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5cd358b1 {\n uint8 s_0;\n bool s_1;\n bool s_2;\n bytes30 s_3;\n bytes4 s_4;\n }\n\n function test () public pure returns (S_5cd358b1 memory) {\n S_5cd358b1 memory r;\n {\n uint8 r_0 = 199;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n bytes30 r_3 = bytes30(0x73ca0947c80591b6315ca332083686f248e8c7ef7a6722fd25889f23bf32);\n r.s_3 = r_3;\n }\n {\n bytes4 r_4 = bytes4(0x636d9291);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000c70000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000173ca0947c80591b6315ca332083686f248e8c7ef7a6722fd25889f23bf320000636d929100000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint88,bytes31,string[],string)", + "type": "(uint88,bytes31,string[],string)", + "value": [ + "131677411147996863364762453", + "0x0694b0fa39b82736d691dff7f1b82b8e11a9f47aebf74741322b546e3a1fd6", + ["Moo é🚀", "Moo é🚀ooééMéMo ééé o🚀o Moé🚀éM🚀 o M🚀MMo"], + "Moo é🚀o🚀éMo🚀éMoé o MéoM🚀 o éM🚀🚀ooo Mé🚀M éMM o🚀 é oéooMMéoéM" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "131677411147996863364762453" + }, + { + "type": "hexstring", + "value": "0x0694b0fa39b82736d691dff7f1b82b8e11a9f47aebf74741322b546e3a1fd6" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀ooééMéMo ééé o🚀o Moé🚀éM🚀 o M🚀MMo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀éMo🚀éMoé o MéoM🚀 o éM🚀🚀ooo Mé🚀M éMM o🚀 é oéooMMéoéM" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610384806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e9565b60405180910390f35b6040805160808082018352600080835260208084018290526060848601819052808501819052855193840186528386018190528381018190526a6cebc6c2fe86a9d2668b5584527f0694b0fa39b82736d691dff7f1b82b8e11a9f47aebf74741322b546e3a1fd6008483015285516002808252918101909652939492939192919082015b60608152602001906001900390816100d257905050905060006040518060400160405280600a8152602001689adede418753e13f3560b71b8152509050808260008151811061012357610123610297565b602002602001018190525050600060405180606001604052806040815260200161030f604091399050808260018151811061016057610160610297565b6020026020010181905250508082604001819052505060006040518060a00160405280606181526020016102ae60619139606083015250919050565b6000815180845260005b818110156101c2576020818501810151868301820152016101a6565b818111156101d4576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835260a083016affffffffffffffffffffff8551168285015260ff198286015116604085015260408501516080606086015281815180845260c08701915060c08160051b8801019350848301925060005b8181101561026d5760bf1988860301835261025b85855161019c565b9450928501929185019160010161023f565b505050506060850151848203601f19016080860152915061028e818361019c565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806ff09f9a80c3a94d6ff09f9a80c3a94d6fc3a9206f204dc3a96f4df09f9a80206f20c3a94df09f9a80f09f9a806f6f6f20204dc3a9f09f9a804d20c3a94d4d206ff09f9a8020c3a920206fc3a96f6f4d4dc3a96fc3a94d4d6f6f20c3a9f09f9a806f6fc3a9c3a94dc3a94d6f20c3a9c3a9c3a9206ff09f9a806f20204d6fc3a9f09f9a80c3a94df09f9a80206f20204df09f9a804d4d6fa2646970667358221220da7f3d697e6afed7d0f914db82378397d6705c87d5792c318f6680924addd80c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_780531b5 {\n uint88 s_0;\n bytes31 s_1;\n string[] s_2;\n string s_3;\n }\n\n function test () public pure returns (S_780531b5 memory) {\n S_780531b5 memory r;\n {\n uint88 r_0 = 131677411147996863364762453;\n r.s_0 = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x0694b0fa39b82736d691dff7f1b82b8e11a9f47aebf74741322b546e3a1fd6);\n r.s_1 = r_1;\n }\n {\n string[] memory r_2 = new string[](2);\n {\n string memory r_2_0 = unicode\"Moo é🚀\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀ooééMéMo ééé o🚀o Moé🚀éM🚀 o M🚀MMo\";\n r_2[1] = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀o🚀éMo🚀éMoé o MéoM🚀 o éM🚀🚀ooo Mé🚀M éMM o🚀 é oéooMMéoéM\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000006cebc6c2fe86a9d2668b550694b0fa39b82736d691dff7f1b82b8e11a9f47aebf74741322b546e3a1fd60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a806f6fc3a9c3a94dc3a94d6f20c3a9c3a9c3a9206ff09f9a806f20204d6fc3a9f09f9a80c3a94df09f9a80206f20204df09f9a804d4d6f00000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a806ff09f9a80c3a94d6ff09f9a80c3a94d6fc3a9206f204dc3a96f4df09f9a80206f20c3a94df09f9a80f09f9a806f6f6f20204dc3a9f09f9a804d20c3a94d4d206ff09f9a8020c3a920206fc3a96f6f4d4dc3a96fc3a94d00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,int,bytes21,string),bytes19,bytes29)", + "type": "((address,int,bytes21,string),bytes19,bytes29)", + "value": [ + [ + "0xf6273fc839400957A3875987319aeBd2640a517c", + "-35223253742223832305464814722052968728048465483048442976122005220664358439309", + "0x1a65cd983b46d2b011a76f389d1c6e88078d4bc0ce", + "Moo é🚀oéo ooo o oMoé🚀éMo🚀Moé🚀MMéo oééoo ooo" + ], + "0x2033ae3e9ca7481113a392c3a6a10d56c9502a", + "0x860cdd3813dd9379ea6e6bf9ac0068f7a0b68b3a69fecf03bf5b3f3e01" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xf6273fc839400957A3875987319aeBd2640a517c" + }, + { + "type": "number", + "value": "-35223253742223832305464814722052968728048465483048442976122005220664358439309" + }, + { + "type": "hexstring", + "value": "0x1a65cd983b46d2b011a76f389d1c6e88078d4bc0ce" + }, + { + "type": "string", + "value": "Moo é🚀oéo ooo o oMoé🚀éMo🚀Moé🚀MMéo oééoo ooo" + } + ] + }, + { + "type": "hexstring", + "value": "0x2033ae3e9ca7481113a392c3a6a10d56c9502a" + }, + { + "type": "hexstring", + "value": "0x860cdd3813dd9379ea6e6bf9ac0068f7a0b68b3a69fecf03bf5b3f3e01" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102cb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610187565b60405180910390f35b6040805160e0808201835260006060808401828152608080860184905260a080870185905260c080880185905292875260208088018690528789018690528851968701895286850186815287840187905291870186905292860184905285528482018490528487018490528651908101875280830183905273f6273fc839400957a3875987319aebd2640a517c81527fb2205849b8a051e005a16bb9c75864f622d338f26a97f8524daa550299c4767381830152740d32e6cc1da3695808d3b79c4e8e374403c6a5e06760591b818801528651928301909652603f8083529495939490610257908301396060830152508152721019d71f4e53a40889d1c961d35086ab64a81560691b60208201527f860cdd3813dd9379ea6e6bf9ac0068f7a0b68b3a69fecf03bf5b3f3e010000006040820152919050565b60006020808352835160608285015260018060a01b0381511660808501528181015160a08501526affffffffffffffffffffff1960408201511660c085015260608101519050608060e085015280518061010086015260005b818110156101fd57828101840151868201610120015283016101e0565b8181111561021057600061012083880101525b50918501516cffffffffffffffffffffffffff198116604086015291604086015162ffffff19811660608701529250601f01601f1916939093016101200194935050505056fe4d6f6f20c3a9f09f9a806fc3a96f206f6f6f206f206f4d6fc3a9f09f9a80c3a94d6ff09f9a804d6fc3a9f09f9a804d4dc3a96f206fc3a9c3a96f6f206f6f6fa26469706673582212205337104c32214f39b55c03bc74804b019b1c1f0c6c1c009c34db71ab72a47bff64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2877f29b {\n address s_0;\n int256 s_1;\n bytes21 s_2;\n string s_3;\n }\n\n struct S_9de16c4f {\n S_2877f29b s_0;\n bytes19 s_1;\n bytes29 s_2;\n }\n\n function test () public pure returns (S_9de16c4f memory) {\n S_9de16c4f memory r;\n {\n S_2877f29b memory r_0;\n {\n address r_0_0 = 0xf6273fc839400957A3875987319aeBd2640a517c;\n r_0.s_0 = r_0_0;\n }\n {\n int r_0_1 = -35223253742223832305464814722052968728048465483048442976122005220664358439309;\n r_0.s_1 = r_0_1;\n }\n {\n bytes21 r_0_2 = bytes21(0x1a65cd983b46d2b011a76f389d1c6e88078d4bc0ce);\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀oéo ooo o oMoé🚀éMo🚀Moé🚀MMéo oééoo ooo\";\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bytes19 r_1 = bytes19(0x2033ae3e9ca7481113a392c3a6a10d56c9502a);\n r.s_1 = r_1;\n }\n {\n bytes29 r_2 = bytes29(0x860cdd3813dd9379ea6e6bf9ac0068f7a0b68b3a69fecf03bf5b3f3e01);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000602033ae3e9ca7481113a392c3a6a10d56c9502a00000000000000000000000000860cdd3813dd9379ea6e6bf9ac0068f7a0b68b3a69fecf03bf5b3f3e01000000000000000000000000000000f6273fc839400957a3875987319aebd2640a517cb2205849b8a051e005a16bb9c75864f622d338f26a97f8524daa550299c476731a65cd983b46d2b011a76f389d1c6e88078d4bc0ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a806fc3a96f206f6f6f206f206f4d6fc3a9f09f9a80c3a94d6ff09f9a804d6fc3a9f09f9a804d4dc3a96f206fc3a9c3a96f6f206f6f6f00" + }, + { + "name": "random-((address),address,(string,int64),bool[3])", + "type": "((address),address,(string,int64),bool[3])", + "value": [ + ["0x89d73011D9A24859e8D2B555C8eC19C6F30CD487"], + "0xDFcb020660AfDc9402549A2860BBC63763238a34", + ["Moo é🚀🚀o 🚀🚀 🚀 Mo", "-4698641931345814331"], + [false, false, true] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x89d73011D9A24859e8D2B555C8eC19C6F30CD487" + } + ] + }, + { + "type": "address", + "value": "0xDFcb020660AfDc9402549A2860BBC63763238a34" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o 🚀🚀 🚀 Mo" + }, + { + "type": "number", + "value": "-4698641931345814331" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610295806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610191565b60405180910390f35b610056610104565b61005e610104565b60408051602080820183527389d73011d9a24859e8d2b555c8ec19c6f30cd487825290835273dfcb020660afdc9402549a2860bbc63763238a348382015281518083018352606080825260008284018190528451918201909452602180825291939290919061023f90830139825250674134edf12c9f633a19602082015260408201526100e9610148565b60008082526020820152600160408201526060820152919050565b6040805160a081018252600060808201818152825260208083018290528351808501855260608082529181019290925292820152908101610143610148565b905290565b60405180606001604052806003906020820280368337509192915050565b8060005b600381101561018b578151151584526020938401939091019060010161016a565b50505050565b6000602080835260018060a01b03808551511682850152808286015116604085015250604084015160c060608501528051604060e086015280518061012087015260005b818110156101f257828101850151878201610140015284016101d5565b8181111561020557600061014083890101525b509282015160070b6101008601526060860151926102266080870185610166565b601f01601f191694909401610140019594505050505056fe4d6f6f20c3a9f09f9a80f09f9a806f20f09f9a80f09f9a802020f09f9a80204d6fa2646970667358221220edd72f6d0bddc5e26ec0c576d0587720dc6d5758937e25f80bc8b4789797228f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_4d9b5297 {\n string s_0;\n int64 s_1;\n }\n\n struct S_7843ab3b {\n S_421683f8 s_0;\n address s_1;\n S_4d9b5297 s_2;\n bool[3] s_3;\n }\n\n function test () public pure returns (S_7843ab3b memory) {\n S_7843ab3b memory r;\n {\n S_421683f8 memory r_0;\n {\n address r_0_0 = 0x89d73011D9A24859e8D2B555C8eC19C6F30CD487;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xDFcb020660AfDc9402549A2860BBC63763238a34;\n r.s_1 = r_1;\n }\n {\n S_4d9b5297 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀🚀o 🚀🚀 🚀 Mo\";\n r_2.s_0 = r_2_0;\n }\n {\n int64 r_2_1 = -4698641931345814331;\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n bool[3] memory r_3;\n {\n bool r_3_0 = false;\n r_3[0] = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3[1] = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000089d73011d9a24859e8d2b555c8ec19c6f30cd487000000000000000000000000dfcb020660afdc9402549a2860bbc63763238a3400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040ffffffffffffffffffffffffffffffffffffffffffffffffbecb120ed3609cc500000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80f09f9a806f20f09f9a80f09f9a802020f09f9a80204d6f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address),address,bool,string[],string)", + "type": "((address),address,bool,string[],string)", + "value": [ + ["0xBc381872B1127623B94277197C82a69CfA8a79FD"], + "0xb79b5adDc7bBd3d5c6f3A163Ec8FFF8FD4A31bC7", + false, + [], + "Moo é🚀oo o oé" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xBc381872B1127623B94277197C82a69CfA8a79FD" + } + ] + }, + { + "type": "address", + "value": "0xb79b5adDc7bBd3d5c6f3A163Ec8FFF8FD4A31bC7" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀oo o oé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101a1565b60405180910390f35b6040805160c081018252600060a0820181815282526020820181905291810191909152606080820181905260808201526040805160c081018252600060a082018181528252602082018190529181019190915260608082018190526080820152604080516020808201835273bc381872b1127623b94277197c82a69cfa8a79fd825290835273b79b5addc7bbd3d5c6f3a163ec8fff8fd4a31bc783820152600083830181905282518181529182019092528161011a565b60608152602001906001900390816101055790505b506060830152506040805180820190915260128152714d6f6f20c3a9f09f9a806f6f206f206fc3a960701b60208201526080820152919050565b6000815180845260005b8181101561017a5760208185018101518683018201520161015e565b8181111561018c576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835260c0830160018060a01b03808651511683860152808387015116604086015250604085015115156060850152606085015160a0608086015281815180845260e08701915060e08160051b8801019350848301925060005b8181101561022d5760df1988860301835261021b858551610154565b945092850192918501916001016101ff565b505050506080850151848203601f190160a0860152915061024e8183610154565b9594505050505056fea264697066735822122093c0adfc234d44cd5efb5fd9440720a0dc95cb50edce9cbd8fb33ac69f43566d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_97a42852 {\n S_421683f8 s_0;\n address s_1;\n bool s_2;\n string[] s_3;\n string s_4;\n }\n\n function test () public pure returns (S_97a42852 memory) {\n S_97a42852 memory r;\n {\n S_421683f8 memory r_0;\n {\n address r_0_0 = 0xBc381872B1127623B94277197C82a69CfA8a79FD;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xb79b5adDc7bBd3d5c6f3A163Ec8FFF8FD4A31bC7;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n string[] memory r_3 = new string[](0);\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀oo o oé\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000bc381872b1127623b94277197c82a69cfa8a79fd000000000000000000000000b79b5addc7bbd3d5c6f3a163ec8fff8fd4a31bc7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a806f6f206f206fc3a90000000000000000000000000000" + }, + { + "name": "random-((address),string,bool[4],bool,bool)", + "type": "((address),string,bool[4],bool,bool)", + "value": [ + ["0x9518f66BcbA474113a9fe57AFC1d0232Ad9062d3"], + "Moo é🚀oéo", + [false, false, true, false], + false, + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9518f66BcbA474113a9fe57AFC1d0232Ad9062d3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oéo" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610249806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061016a565b60405180910390f35b6100566100e6565b61005e6100e6565b6040805160208082018352739518f66bcba474113a9fe57afc1d0232ad9062d382529083528151808301909252600e82526d4d6f6f20c3a9f09f9a806fc3a96f60901b828201528201526100b0610121565b60008082526020820181905260016040808401919091526060808401839052908401929092529082018190526080820152919050565b6040805160c081018252600060a0820190815281526060602082015290810161010d610121565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156101645781511515845260209384019390910190600101610143565b50505050565b6000602080835260018060a01b0384515116818401528084015161010080604086015281518061012087015260005b818110156101b65783810185015187820161014001528401610199565b818111156101c957600061014083890101525b50604087015193506101de606087018561013f565b606087015180151560e088015293506080870151801515878401529350601f01601f191694909401610140019594505050505056fea2646970667358221220a238a58cb21799bca521947cba6fa766b3b9bd9b8c6f6f41699564578af8069f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_79a76c03 {\n S_421683f8 s_0;\n string s_1;\n bool[4] s_2;\n bool s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_79a76c03 memory) {\n S_79a76c03 memory r;\n {\n S_421683f8 memory r_0;\n {\n address r_0_0 = 0x9518f66BcbA474113a9fe57AFC1d0232Ad9062d3;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oéo\";\n r.s_1 = r_1;\n }\n {\n bool[4] memory r_2;\n {\n bool r_2_0 = false;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2[1] = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2[2] = r_2_2;\n }\n {\n bool r_2_3 = false;\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000009518f66bcba474113a9fe57afc1d0232ad9062d30000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a806fc3a96f000000000000000000000000000000000000" + }, + { + "name": "random-((bool[]),address,address,address,address)", + "type": "((bool[]),address,address,address,address)", + "value": [ + [[false, false, false]], + "0xe1Fa257633F04205D4334372E98918F2a04c14fa", + "0xe8d4E929CB4944f971a9e7A42767873A076b5423", + "0x2EfF2A80A1ec1D410E62fA12230758C4Cb8f01D0", + "0xaC9128bf9AfcFf3aF995B16379583D7606d8a3C5" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "address", + "value": "0xe1Fa257633F04205D4334372E98918F2a04c14fa" + }, + { + "type": "address", + "value": "0xe8d4E929CB4944f971a9e7A42767873A076b5423" + }, + { + "type": "address", + "value": "0x2EfF2A80A1ec1D410E62fA12230758C4Cb8f01D0" + }, + { + "type": "address", + "value": "0xaC9128bf9AfcFf3aF995B16379583D7606d8a3C5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102cb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ce565b60405180910390f35b6040805160c081018252606060a082018181528252600060208301819052928201839052810182905260808101919091526040805160c081018252606060a0820181815282526000602083018190529282018390528101829052608081019190915260408051602081018252606081528151600380825260808201909352909160009190816020016020820280368337019050509050600080826000815181106100fa576100fa61027f565b60200260200101901515908115158152505050600080826001815181106101235761012361027f565b602002602001019015159081151581525050506000808260028151811061014c5761014c61027f565b9115156020928302919091018201529183525090825273e1fa257633f04205d4334372e98918f2a04c14fa9082015273e8d4e929cb4944f971a9e7a42767873a076b54236040820152732eff2a80a1ec1d410e62fa12230758c4cb8f01d0606082015273ac9128bf9afcff3af995b16379583d7606d8a3c56080820152919050565b6020808252825160a0838301525160c08301829052805160e084018190526000929182019083906101008601905b8083101561021e578351151582529284019260019290920191908401906101fc565b50928601516001600160a01b03811660408701529260408701516001600160a01b0381166060880152935060608701516001600160a01b0381166080880152935060808701516001600160a01b03811660a088015293509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220c7246989554419d90e660533d2f6bbe93476053849ac4912c22c0cbdc154558c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8761250c {\n bool[] s_0;\n }\n\n struct S_24340374 {\n S_8761250c s_0;\n address s_1;\n address s_2;\n address s_3;\n address s_4;\n }\n\n function test () public pure returns (S_24340374 memory) {\n S_24340374 memory r;\n {\n S_8761250c memory r_0;\n {\n bool[] memory r_0_0 = new bool[](3);\n {\n bool r_0_0_0 = false;\n r_0_0[0] = r_0_0_0;\n }\n {\n bool r_0_0_1 = false;\n r_0_0[1] = r_0_0_1;\n }\n {\n bool r_0_0_2 = false;\n r_0_0[2] = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xe1Fa257633F04205D4334372E98918F2a04c14fa;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xe8d4E929CB4944f971a9e7A42767873A076b5423;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x2EfF2A80A1ec1D410E62fA12230758C4Cb8f01D0;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xaC9128bf9AfcFf3aF995B16379583D7606d8a3C5;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e1fa257633f04205d4334372e98918f2a04c14fa000000000000000000000000e8d4e929cb4944f971a9e7a42767873a076b54230000000000000000000000002eff2a80a1ec1d410e62fa12230758c4cb8f01d0000000000000000000000000ac9128bf9afcff3af995b16379583d7606d8a3c500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes31[4],(address,string)),address)[3]", + "type": "((bytes31[4],(address,string)),address)[3]", + "value": [ + [ + [ + [ + "0xc5724535642e5edd37e57fcc202a5bf598687af0acbd75db6f446c82540a46", + "0x547c52feb2b42bd158163b61d6dca239669d6444c6b611fad19869a02979a7", + "0x442b3a8d2ae57a4c7e67a12f1e81d087d6a5c7507bf97f4b1410e0e16f564e", + "0x64bde36071b2afbc2071cf62126ae2090a6fda8a084f18cacd3dd81356c447" + ], + [ + "0x90E7d1F34513a709083fdD65b6cbB30aE5866BD4", + "Moo é🚀Moo🚀oMo🚀o ooé éMoo🚀🚀éMMéééMo🚀🚀MoMMéMMoMo🚀 ooM éM " + ] + ], + "0xfD6b8B8d60Bad4b8f08710E32a2Eceb94BC0cc49" + ], + [ + [ + [ + "0xdb0f2e8e5dabd877e920215097559cc99e588a51c6a7e0ad370d8bf35dd700", + "0x51318eb23baa59d556e145e90833c07fdf88269a988d154aa0407aed6cd231", + "0x15384ba4e63e004f8425b12053d8402b892567d7d099267cf05b5638580ae0", + "0xaab084bababcb468a8a3701e40eed01fac34be9b0f48633f82123d0af1b9ae" + ], + [ + "0xa95F82C1C6B30e0de596332Ce605B42A15731B1A", + "Moo é🚀 é🚀🚀ooo o oé 🚀oééMooo oé 🚀oMo🚀o🚀ooéoéoooé" + ] + ], + "0x0f88A409BB44017FB06740a462e136C82cBa6585" + ], + [ + [ + [ + "0xb04c8ba09dbfabebc6588fde7c8bc4403838f0c27215700f39d869fea2dc26", + "0xa394a0aa4e6c6c90f487f2e02f47756a9b13914a4f22f9fe47b5182c5225e4", + "0xa2994bdae24b95c2b3ceb436e4a0898c96b316e9bc5b26266bd8929ef2aa51", + "0xd8a668d70dd91d4956a8174ce0ec1fd6d7c82b0f232ffc0cc9e06d9ff0abbe" + ], + ["0x4Ea544DE1A39DECc8Fd81443769BD36458C3561F", "Moo é🚀M éM🚀é 🚀🚀ooé"] + ], + "0x3282720C21218CE753EEf9477ccd7DcC8794c819" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc5724535642e5edd37e57fcc202a5bf598687af0acbd75db6f446c82540a46" + }, + { + "type": "hexstring", + "value": "0x547c52feb2b42bd158163b61d6dca239669d6444c6b611fad19869a02979a7" + }, + { + "type": "hexstring", + "value": "0x442b3a8d2ae57a4c7e67a12f1e81d087d6a5c7507bf97f4b1410e0e16f564e" + }, + { + "type": "hexstring", + "value": "0x64bde36071b2afbc2071cf62126ae2090a6fda8a084f18cacd3dd81356c447" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x90E7d1F34513a709083fdD65b6cbB30aE5866BD4" + }, + { + "type": "string", + "value": "Moo é🚀Moo🚀oMo🚀o ooé éMoo🚀🚀éMMéééMo🚀🚀MoMMéMMoMo🚀 ooM éM " + } + ] + } + ] + }, + { + "type": "address", + "value": "0xfD6b8B8d60Bad4b8f08710E32a2Eceb94BC0cc49" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdb0f2e8e5dabd877e920215097559cc99e588a51c6a7e0ad370d8bf35dd700" + }, + { + "type": "hexstring", + "value": "0x51318eb23baa59d556e145e90833c07fdf88269a988d154aa0407aed6cd231" + }, + { + "type": "hexstring", + "value": "0x15384ba4e63e004f8425b12053d8402b892567d7d099267cf05b5638580ae0" + }, + { + "type": "hexstring", + "value": "0xaab084bababcb468a8a3701e40eed01fac34be9b0f48633f82123d0af1b9ae" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa95F82C1C6B30e0de596332Ce605B42A15731B1A" + }, + { + "type": "string", + "value": "Moo é🚀 é🚀🚀ooo o oé 🚀oééMooo oé 🚀oMo🚀o🚀ooéoéoooé" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x0f88A409BB44017FB06740a462e136C82cBa6585" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb04c8ba09dbfabebc6588fde7c8bc4403838f0c27215700f39d869fea2dc26" + }, + { + "type": "hexstring", + "value": "0xa394a0aa4e6c6c90f487f2e02f47756a9b13914a4f22f9fe47b5182c5225e4" + }, + { + "type": "hexstring", + "value": "0xa2994bdae24b95c2b3ceb436e4a0898c96b316e9bc5b26266bd8929ef2aa51" + }, + { + "type": "hexstring", + "value": "0xd8a668d70dd91d4956a8174ce0ec1fd6d7c82b0f232ffc0cc9e06d9ff0abbe" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4Ea544DE1A39DECc8Fd81443769BD36458C3561F" + }, + { + "type": "string", + "value": "Moo é🚀M éM🚀é 🚀🚀ooé" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x3282720C21218CE753EEf9477ccd7DcC8794c819" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061068a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610485565b60405180910390f35b6100566103e2565b61005e6103e2565b61006661040f565b61006e61042f565b610076610467565b7fc5724535642e5edd37e57fcc202a5bf598687af0acbd75db6f446c82540a460081527f547c52feb2b42bd158163b61d6dca239669d6444c6b611fad19869a02979a7006020808301919091527f442b3a8d2ae57a4c7e67a12f1e81d087d6a5c7507bf97f4b1410e0e16f564e006040808401919091527f64bde36071b2afbc2071cf62126ae2090a6fda8a084f18cacd3dd81356c4470060608085019190915292845280518082018252808301939093527390e7d1f34513a709083fdd65b6cbb30ae5866bd48352805160808101909152605980825260009261058990830139602083810191909152838101929092525090825273fd6b8b8d60bad4b8f08710e32a2eceb94bc0cc4990820152815261018e61040f565b61019661042f565b61019e610467565b7fdb0f2e8e5dabd877e920215097559cc99e588a51c6a7e0ad370d8bf35dd7000081527f51318eb23baa59d556e145e90833c07fdf88269a988d154aa0407aed6cd231006020808301919091527f15384ba4e63e004f8425b12053d8402b892567d7d099267cf05b5638580ae0006040808401919091527faab084bababcb468a8a3701e40eed01fac34be9b0f48633f82123d0af1b9ae00606080850191909152928452805180820182528083019390935273a95f82c1c6b30e0de596332ce605b42a15731b1a8352805160808101909152604f8082526000926105e2908301396020838101919091528381019290925250908252730f88a409bb44017fb06740a462e136c82cba6585828201528201526102b761040f565b6102bf61042f565b6102c7610467565b7fb04c8ba09dbfabebc6588fde7c8bc4403838f0c27215700f39d869fea2dc260081527fa394a0aa4e6c6c90f487f2e02f47756a9b13914a4f22f9fe47b5182c5225e4006020808301919091527fa2994bdae24b95c2b3ceb436e4a0898c96b316e9bc5b26266bd8929ef2aa51006040808401919091527fd8a668d70dd91d4956a8174ce0ec1fd6d7c82b0f232ffc0cc9e06d9ff0abbe0060608085019190915292845280518082018252808301849052734ea544de1a39decc8fd81443769bd36458c3561f8152815193840190915260248084529092600092909190610631908301396020838101919091528381019290925250908252733282720c21218ce753eef9477ccd7dcc8794c819908201526040820152919050565b60405180606001604052806003905b6103f961040f565b8152602001906001900390816103f15790505090565b604051806040016040528061042261042f565b8152600060209091015290565b6040518060400160405280610442610467565b815260200161046260408051808201909152600081526060602082015290565b905290565b60405180608001604052806004906020820280368337509192915050565b60208082526000906080830183820185845b600381101561057c57601f1987850381018452825180516040808852815190916000838a015b60048210156104e057835160ff19168152928b0192600191909101908b016104bd565b505089015160a060c08a015280516001600160a01b031660e08a015289015161010089019290925250805161012088018190529060005b82811015610534578181018a015189820161014001528901610517565b82811115610547576000610140848b0101525b5050908701516001600160a01b0381168789015290601f01909116949094016101400193509184019190840190600101610497565b5091969550505050505056fe4d6f6f20c3a9f09f9a804d6f6ff09f9a806f4d6ff09f9a806f206f6fc3a92020c3a94d6f6ff09f9a80f09f9a80c3a94d4dc3a9c3a9c3a94d6ff09f9a80f09f9a804d6f4d4dc3a94d4d6f4d6ff09f9a80206f6f4d20c3a94d204d6f6f20c3a9f09f9a8020c3a9f09f9a80f09f9a806f6f6f206f206fc3a92020f09f9a806fc3a9c3a94d6f6f6f206fc3a92020f09f9a806f4d6ff09f9a806ff09f9a806f6fc3a96fc3a96f6f6fc3a94d6f6f20c3a9f09f9a804d20c3a94df09f9a80c3a9202020f09f9a80f09f9a806f6fc3a9a2646970667358221220fd7edbefb320faaacdf48a94a18cf3c8ad3a9bf8af73f130ba445792ffb7c4c464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8090aaf4 {\n address s_0;\n string s_1;\n }\n\n struct S_2e300464 {\n bytes31[4] s_0;\n S_8090aaf4 s_1;\n }\n\n struct S_ad201063 {\n S_2e300464 s_0;\n address s_1;\n }\n\n function test () public pure returns (S_ad201063[3] memory) {\n S_ad201063[3] memory r;\n {\n S_ad201063 memory r_0;\n {\n S_2e300464 memory r_0_0;\n {\n bytes31[4] memory r_0_0_0;\n {\n bytes31 r_0_0_0_0 = bytes31(0xc5724535642e5edd37e57fcc202a5bf598687af0acbd75db6f446c82540a46);\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n bytes31 r_0_0_0_1 = bytes31(0x547c52feb2b42bd158163b61d6dca239669d6444c6b611fad19869a02979a7);\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n bytes31 r_0_0_0_2 = bytes31(0x442b3a8d2ae57a4c7e67a12f1e81d087d6a5c7507bf97f4b1410e0e16f564e);\n r_0_0_0[2] = r_0_0_0_2;\n }\n {\n bytes31 r_0_0_0_3 = bytes31(0x64bde36071b2afbc2071cf62126ae2090a6fda8a084f18cacd3dd81356c447);\n r_0_0_0[3] = r_0_0_0_3;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n S_8090aaf4 memory r_0_0_1;\n {\n address r_0_0_1_0 = 0x90E7d1F34513a709083fdD65b6cbB30aE5866BD4;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀Moo🚀oMo🚀o ooé éMoo🚀🚀éMMéééMo🚀🚀MoMMéMMoMo🚀 ooM éM \";\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0xfD6b8B8d60Bad4b8f08710E32a2Eceb94BC0cc49;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_ad201063 memory r_1;\n {\n S_2e300464 memory r_1_0;\n {\n bytes31[4] memory r_1_0_0;\n {\n bytes31 r_1_0_0_0 = bytes31(0xdb0f2e8e5dabd877e920215097559cc99e588a51c6a7e0ad370d8bf35dd700);\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n bytes31 r_1_0_0_1 = bytes31(0x51318eb23baa59d556e145e90833c07fdf88269a988d154aa0407aed6cd231);\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n bytes31 r_1_0_0_2 = bytes31(0x15384ba4e63e004f8425b12053d8402b892567d7d099267cf05b5638580ae0);\n r_1_0_0[2] = r_1_0_0_2;\n }\n {\n bytes31 r_1_0_0_3 = bytes31(0xaab084bababcb468a8a3701e40eed01fac34be9b0f48633f82123d0af1b9ae);\n r_1_0_0[3] = r_1_0_0_3;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n S_8090aaf4 memory r_1_0_1;\n {\n address r_1_0_1_0 = 0xa95F82C1C6B30e0de596332Ce605B42A15731B1A;\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n string memory r_1_0_1_1 = unicode\"Moo é🚀 é🚀🚀ooo o oé 🚀oééMooo oé 🚀oMo🚀o🚀ooéoéoooé\";\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x0f88A409BB44017FB06740a462e136C82cBa6585;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_ad201063 memory r_2;\n {\n S_2e300464 memory r_2_0;\n {\n bytes31[4] memory r_2_0_0;\n {\n bytes31 r_2_0_0_0 = bytes31(0xb04c8ba09dbfabebc6588fde7c8bc4403838f0c27215700f39d869fea2dc26);\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n bytes31 r_2_0_0_1 = bytes31(0xa394a0aa4e6c6c90f487f2e02f47756a9b13914a4f22f9fe47b5182c5225e4);\n r_2_0_0[1] = r_2_0_0_1;\n }\n {\n bytes31 r_2_0_0_2 = bytes31(0xa2994bdae24b95c2b3ceb436e4a0898c96b316e9bc5b26266bd8929ef2aa51);\n r_2_0_0[2] = r_2_0_0_2;\n }\n {\n bytes31 r_2_0_0_3 = bytes31(0xd8a668d70dd91d4956a8174ce0ec1fd6d7c82b0f232ffc0cc9e06d9ff0abbe);\n r_2_0_0[3] = r_2_0_0_3;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n S_8090aaf4 memory r_2_0_1;\n {\n address r_2_0_1_0 = 0x4Ea544DE1A39DECc8Fd81443769BD36458C3561F;\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n {\n string memory r_2_0_1_1 = unicode\"Moo é🚀M éM🚀é 🚀🚀ooé\";\n r_2_0_1.s_1 = r_2_0_1_1;\n }\n r_2_0.s_1 = r_2_0_1;\n }\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x3282720C21218CE753EEf9477ccd7DcC8794c819;\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000fd6b8b8d60bad4b8f08710e32a2eceb94bc0cc49c5724535642e5edd37e57fcc202a5bf598687af0acbd75db6f446c82540a4600547c52feb2b42bd158163b61d6dca239669d6444c6b611fad19869a02979a700442b3a8d2ae57a4c7e67a12f1e81d087d6a5c7507bf97f4b1410e0e16f564e0064bde36071b2afbc2071cf62126ae2090a6fda8a084f18cacd3dd81356c4470000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000090e7d1f34513a709083fdd65b6cbb30ae5866bd4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a804d6f6ff09f9a806f4d6ff09f9a806f206f6fc3a92020c3a94d6f6ff09f9a80f09f9a80c3a94d4dc3a9c3a9c3a94d6ff09f9a80f09f9a804d6f4d4dc3a94d4d6f4d6ff09f9a80206f6f4d20c3a94d200000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000f88a409bb44017fb06740a462e136c82cba6585db0f2e8e5dabd877e920215097559cc99e588a51c6a7e0ad370d8bf35dd7000051318eb23baa59d556e145e90833c07fdf88269a988d154aa0407aed6cd2310015384ba4e63e004f8425b12053d8402b892567d7d099267cf05b5638580ae000aab084bababcb468a8a3701e40eed01fac34be9b0f48633f82123d0af1b9ae0000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a95f82c1c6b30e0de596332ce605b42a15731b1a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a8020c3a9f09f9a80f09f9a806f6f6f206f206fc3a92020f09f9a806fc3a9c3a94d6f6f6f206fc3a92020f09f9a806f4d6ff09f9a806ff09f9a806f6fc3a96fc3a96f6f6fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000003282720c21218ce753eef9477ccd7dcc8794c819b04c8ba09dbfabebc6588fde7c8bc4403838f0c27215700f39d869fea2dc2600a394a0aa4e6c6c90f487f2e02f47756a9b13914a4f22f9fe47b5182c5225e400a2994bdae24b95c2b3ceb436e4a0898c96b316e9bc5b26266bd8929ef2aa5100d8a668d70dd91d4956a8174ce0ec1fd6d7c82b0f232ffc0cc9e06d9ff0abbe0000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000004ea544de1a39decc8fd81443769bd36458c3561f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a804d20c3a94df09f9a80c3a9202020f09f9a80f09f9a806f6fc3a900000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes32[4]),int240[4],(string))[2]", + "type": "((bytes32[4]),int240[4],(string))[2]", + "value": [ + [ + [ + [ + "0x9ac2b6d86f20c15c8ca1cbce586835ae758b2703bb5dc34594b08f4b9db39eb8", + "0x3d54a16ba8a98c9831f350ab16f0c828b8f353a0c2140eb60160dfec25233d04", + "0xe8669ef5623806006f63ebb4670d15b472bb0f5632f601a517ae18d2f5c602d5", + "0x1e64c1b8813267d14fa86ea35d017c881d490158c6c7cf224a43f07492b752de" + ] + ], + [ + "-281909976163766708859202487132284609161308462834805457759979390766339656", + "-395145398305942146338370900741320284849483999562078432368100861496791911", + "-785755335697109452521999558714205505537855012394636042278468700812390349", + "53070155706930836091305514122417589843560648171762433437532646370880959" + ], + ["Moo é🚀Méoo🚀oooMMéé🚀ooMMoéo🚀oMoooooMéo 🚀🚀M🚀oooo 🚀o"] + ], + [ + [ + [ + "0x7ccc3e3367aa3c63061ef26104ecd4f205eb0a9da338ff73f8b57a07150b7d11", + "0xa6447d74666a038ec1c1ba7889ac8d577c643347bd625f275b37bfe22a321bca", + "0xbee27ec3817e8aade127e77b969d253e4f826ed60ef3186d35675301ddbced18", + "0x722c537cb99843b57558458f1f07bafbccd1310df25e299a0a647a664a60bef6" + ] + ], + [ + "-571550444893376431884562817466751841619370600102424702940542359514232652", + "-58941531389304820070237731826916295200168556058259193969167452426457795", + "876325188552444323007920294448988090305874812581576581415479501632772458", + "-837621591890448105357355194955435804160870202256030384074597914728125312" + ], + ["Moo é🚀🚀MoéooMo🚀 o🚀o🚀🚀Mo🚀oMMMoMé🚀 Mooé 🚀Mo oéé"] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9ac2b6d86f20c15c8ca1cbce586835ae758b2703bb5dc34594b08f4b9db39eb8" + }, + { + "type": "hexstring", + "value": "0x3d54a16ba8a98c9831f350ab16f0c828b8f353a0c2140eb60160dfec25233d04" + }, + { + "type": "hexstring", + "value": "0xe8669ef5623806006f63ebb4670d15b472bb0f5632f601a517ae18d2f5c602d5" + }, + { + "type": "hexstring", + "value": "0x1e64c1b8813267d14fa86ea35d017c881d490158c6c7cf224a43f07492b752de" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-281909976163766708859202487132284609161308462834805457759979390766339656" + }, + { + "type": "number", + "value": "-395145398305942146338370900741320284849483999562078432368100861496791911" + }, + { + "type": "number", + "value": "-785755335697109452521999558714205505537855012394636042278468700812390349" + }, + { + "type": "number", + "value": "53070155706930836091305514122417589843560648171762433437532646370880959" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Méoo🚀oooMMéé🚀ooMMoéo🚀oMoooooMéo 🚀🚀M🚀oooo 🚀o" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7ccc3e3367aa3c63061ef26104ecd4f205eb0a9da338ff73f8b57a07150b7d11" + }, + { + "type": "hexstring", + "value": "0xa6447d74666a038ec1c1ba7889ac8d577c643347bd625f275b37bfe22a321bca" + }, + { + "type": "hexstring", + "value": "0xbee27ec3817e8aade127e77b969d253e4f826ed60ef3186d35675301ddbced18" + }, + { + "type": "hexstring", + "value": "0x722c537cb99843b57558458f1f07bafbccd1310df25e299a0a647a664a60bef6" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-571550444893376431884562817466751841619370600102424702940542359514232652" + }, + { + "type": "number", + "value": "-58941531389304820070237731826916295200168556058259193969167452426457795" + }, + { + "type": "number", + "value": "876325188552444323007920294448988090305874812581576581415479501632772458" + }, + { + "type": "number", + "value": "-837621591890448105357355194955435804160870202256030384074597914728125312" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀MoéooMo🚀 o🚀o🚀🚀Mo🚀oMMMoMé🚀 Mooé 🚀Mo oéé" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061046e565b60405180910390f35b61005661037c565b61005e61037c565b6100666103a9565b61006e6103e9565b6100766103f8565b7f9ac2b6d86f20c15c8ca1cbce586835ae758b2703bb5dc34594b08f4b9db39eb881527f3d54a16ba8a98c9831f350ab16f0c828b8f353a0c2140eb60160dfec25233d0460208201527fe8669ef5623806006f63ebb4670d15b472bb0f5632f601a517ae18d2f5c602d560408201527f1e64c1b8813267d14fa86ea35d017c881d490158c6c7cf224a43f07492b752de6060820152815281526101176103f8565b7fffffd72760b91f241528fa65c465942554807c01bcd282aa8d8b969a381d29b881527fffffc6bf3e19d88f416cd8dedcdb3088f8eecc2fb1b5d1bc2300d689a577ec996020808301919091527fffff8e26b6fa719907b940cf57f0856c295557a6b580b3f21dbc5028311b50336040808401919091527d07b07b424045205f8bd0a94c3e3abf14f5ef67888247863130063ff6adbf6060808501919091528483019390935280518083018252928352805160808101909152604f80825260009261052890830139825250604082015281526101f16103a9565b6101f96103e9565b6102016103f8565b7f7ccc3e3367aa3c63061ef26104ecd4f205eb0a9da338ff73f8b57a07150b7d1181527fa6447d74666a038ec1c1ba7889ac8d577c643347bd625f275b37bfe22a321bca60208201527fbee27ec3817e8aade127e77b969d253e4f826ed60ef3186d35675301ddbced1860408201527f722c537cb99843b57558458f1f07bafbccd1310df25e299a0a647a664a60bef66060820152815281526102a26103f8565b7fffffad300407c804c254885da428a3e1fa8a88d54a4ce4a9b3b28d1ae9ba48b481527ffffff775bcb21661e55af06b50a1c4f8cac723684db31b9fba58bd9c75fc2d3d6020808301919091527d7ef8b531f9a402fe233b000100f690458976e643fa69be3bca1e5d3b196a6040808401919091527fffff86a2e36dcbefe75fcce4fd7361e50254737b114f6e988c07ab26c2e52c80606080850191909152848301939093528051808301825292835280516080810190915260508082526000926105779083013982525060408201526020820152919050565b60405180604001604052806002905b6103936103a9565b81526020019060019003908161038b5790505090565b60405180606001604052806103bc6103e9565b81526020016103c96103f8565b81526020016103e46040518060200160405280606081525090565b905290565b60405180602001604052806103e45b60405180608001604052806004906020820280368337509192915050565b6000602082518185528051808387015260005b8181101561044557828101840151878201604001528301610429565b81811115610457576000604083890101525b50601f01601f191694909401604001949350505050565b60208082526000906060830183820185845b600281101561051b57868403601f190183528151805151610120908660005b60048110156104bc5782518252918901919089019060010161049f565b505050868201516080870160005b60048110156104ea578251601d0b825291890191908901906001016104ca565b505050604082015191508061010087015261050781870183610416565b955050509184019190840190600101610480565b5091969550505050505056fe4d6f6f20c3a9f09f9a804dc3a96f6ff09f9a806f6f6f4d4dc3a9c3a9f09f9a806f6f4d4d6fc3a96ff09f9a806f4d6f6f6f6f6f4dc3a96f20f09f9a80f09f9a804df09f9a806f6f6f6f20f09f9a806f4d6f6f20c3a9f09f9a80f09f9a804d6fc3a96f6f4d6ff09f9a8020206ff09f9a806ff09f9a80f09f9a804d6ff09f9a806f4d4d4d6f4dc3a9f09f9a80204d6f6fc3a92020f09f9a804d6f206fc3a9c3a9a2646970667358221220e08ec84e4e5b2572886a46de7ec829c768b2f53c52555a5f0c6415fa6aa91b9064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f29fc04d {\n bytes32[4] s_0;\n }\n\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_16f661a3 {\n S_f29fc04d s_0;\n int240[4] s_1;\n S_97fc4627 s_2;\n }\n\n function test () public pure returns (S_16f661a3[2] memory) {\n S_16f661a3[2] memory r;\n {\n S_16f661a3 memory r_0;\n {\n S_f29fc04d memory r_0_0;\n {\n bytes32[4] memory r_0_0_0;\n {\n bytes32 r_0_0_0_0 = bytes32(0x9ac2b6d86f20c15c8ca1cbce586835ae758b2703bb5dc34594b08f4b9db39eb8);\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n bytes32 r_0_0_0_1 = bytes32(0x3d54a16ba8a98c9831f350ab16f0c828b8f353a0c2140eb60160dfec25233d04);\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n bytes32 r_0_0_0_2 = bytes32(0xe8669ef5623806006f63ebb4670d15b472bb0f5632f601a517ae18d2f5c602d5);\n r_0_0_0[2] = r_0_0_0_2;\n }\n {\n bytes32 r_0_0_0_3 = bytes32(0x1e64c1b8813267d14fa86ea35d017c881d490158c6c7cf224a43f07492b752de);\n r_0_0_0[3] = r_0_0_0_3;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n r_0.s_0 = r_0_0;\n }\n {\n int240[4] memory r_0_1;\n {\n int240 r_0_1_0 = -281909976163766708859202487132284609161308462834805457759979390766339656;\n r_0_1[0] = r_0_1_0;\n }\n {\n int240 r_0_1_1 = -395145398305942146338370900741320284849483999562078432368100861496791911;\n r_0_1[1] = r_0_1_1;\n }\n {\n int240 r_0_1_2 = -785755335697109452521999558714205505537855012394636042278468700812390349;\n r_0_1[2] = r_0_1_2;\n }\n {\n int240 r_0_1_3 = 53070155706930836091305514122417589843560648171762433437532646370880959;\n r_0_1[3] = r_0_1_3;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_97fc4627 memory r_0_2;\n {\n string memory r_0_2_0 = unicode\"Moo é🚀Méoo🚀oooMMéé🚀ooMMoéo🚀oMoooooMéo 🚀🚀M🚀oooo 🚀o\";\n r_0_2.s_0 = r_0_2_0;\n }\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_16f661a3 memory r_1;\n {\n S_f29fc04d memory r_1_0;\n {\n bytes32[4] memory r_1_0_0;\n {\n bytes32 r_1_0_0_0 = bytes32(0x7ccc3e3367aa3c63061ef26104ecd4f205eb0a9da338ff73f8b57a07150b7d11);\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n bytes32 r_1_0_0_1 = bytes32(0xa6447d74666a038ec1c1ba7889ac8d577c643347bd625f275b37bfe22a321bca);\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n bytes32 r_1_0_0_2 = bytes32(0xbee27ec3817e8aade127e77b969d253e4f826ed60ef3186d35675301ddbced18);\n r_1_0_0[2] = r_1_0_0_2;\n }\n {\n bytes32 r_1_0_0_3 = bytes32(0x722c537cb99843b57558458f1f07bafbccd1310df25e299a0a647a664a60bef6);\n r_1_0_0[3] = r_1_0_0_3;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n int240[4] memory r_1_1;\n {\n int240 r_1_1_0 = -571550444893376431884562817466751841619370600102424702940542359514232652;\n r_1_1[0] = r_1_1_0;\n }\n {\n int240 r_1_1_1 = -58941531389304820070237731826916295200168556058259193969167452426457795;\n r_1_1[1] = r_1_1_1;\n }\n {\n int240 r_1_1_2 = 876325188552444323007920294448988090305874812581576581415479501632772458;\n r_1_1[2] = r_1_1_2;\n }\n {\n int240 r_1_1_3 = -837621591890448105357355194955435804160870202256030384074597914728125312;\n r_1_1[3] = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n {\n S_97fc4627 memory r_1_2;\n {\n string memory r_1_2_0 = unicode\"Moo é🚀🚀MoéooMo🚀 o🚀o🚀🚀Mo🚀oMMMoMé🚀 Mooé 🚀Mo oéé\";\n r_1_2.s_0 = r_1_2_0;\n }\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002009ac2b6d86f20c15c8ca1cbce586835ae758b2703bb5dc34594b08f4b9db39eb83d54a16ba8a98c9831f350ab16f0c828b8f353a0c2140eb60160dfec25233d04e8669ef5623806006f63ebb4670d15b472bb0f5632f601a517ae18d2f5c602d51e64c1b8813267d14fa86ea35d017c881d490158c6c7cf224a43f07492b752deffffd72760b91f241528fa65c465942554807c01bcd282aa8d8b969a381d29b8ffffc6bf3e19d88f416cd8dedcdb3088f8eecc2fb1b5d1bc2300d689a577ec99ffff8e26b6fa719907b940cf57f0856c295557a6b580b3f21dbc5028311b5033000007b07b424045205f8bd0a94c3e3abf14f5ef67888247863130063ff6adbf00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a804dc3a96f6ff09f9a806f6f6f4d4dc3a9c3a9f09f9a806f6f4d4d6fc3a96ff09f9a806f4d6f6f6f6f6f4dc3a96f20f09f9a80f09f9a804df09f9a806f6f6f6f20f09f9a806f00000000000000000000000000000000007ccc3e3367aa3c63061ef26104ecd4f205eb0a9da338ff73f8b57a07150b7d11a6447d74666a038ec1c1ba7889ac8d577c643347bd625f275b37bfe22a321bcabee27ec3817e8aade127e77b969d253e4f826ed60ef3186d35675301ddbced18722c537cb99843b57558458f1f07bafbccd1310df25e299a0a647a664a60bef6ffffad300407c804c254885da428a3e1fa8a88d54a4ce4a9b3b28d1ae9ba48b4fffff775bcb21661e55af06b50a1c4f8cac723684db31b9fba58bd9c75fc2d3d00007ef8b531f9a402fe233b000100f690458976e643fa69be3bca1e5d3b196affff86a2e36dcbefe75fcce4fd7361e50254737b114f6e988c07ab26c2e52c800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80f09f9a804d6fc3a96f6f4d6ff09f9a8020206ff09f9a806ff09f9a80f09f9a804d6ff09f9a806f4d4d4d6f4dc3a9f09f9a80204d6f6fc3a92020f09f9a804d6f206fc3a9c3a900000000000000000000000000000000" + }, + { + "name": "random-((int24),string,address[],address,uint160)", + "type": "((int24),string,address[],address,uint160)", + "value": [ + ["991869"], + "Moo é🚀", + ["0x1eB38693da7e6a28160EC83ef79B5336c8884E3E"], + "0xB0989137F3949F5A66063c18E3f82264A8D99490", + "118018019656086403137185267421563123995430489065" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "991869" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1eB38693da7e6a28160EC83ef79B5336c8884E3E" + } + ] + }, + { + "type": "address", + "value": "0xB0989137F3949F5A66063c18E3f82264A8D99490" + }, + { + "type": "number", + "value": "118018019656086403137185267421563123995430489065" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102c8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c1565b60405180910390f35b6040805160c08082018352600060a0808401828152845260606020808601829052858701829052818601849052608080870185905287519586018852928501848152855284810182815285880183905291850184905291840183905285518083018752620f227d8152845285518087018752600a8152689adede418753e13f3560b71b818401529052845160018082528187019096529394929391929082810190803683370190505090506000731eb38693da7e6a28160ec83ef79b5336c8884e3e905080826000815181106101265761012661027c565b6001600160a01b039092166020928302919091019091015250604082015273b0989137f3949f5a66063c18e3f82264a8d9949060608201527314ac1c6c809dd1c5511d4d13bb57f30c09760be96080820152919050565b600081518084526020808501945080840160005b838110156101b65781516001600160a01b031687529582019590820190600101610191565b509495945050505050565b6000602080835283515160020b818401528084015160a0604085015280518060c086015260005b818110156102045782810184015186820160e0015283016101e8565b8181111561021657600060e083880101525b50601f19601f820116850192505050604084015160c084830301606085015261024260e083018261017d565b915050606084015161025f60808501826001600160a01b03169052565b5060808401516001600160a01b03811660a0850152509392505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220337d6a23c4f04e20468c4385f7d76037460bb2ac1463f46dfd064d08cbcd09cf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a9554343 {\n int24 s_0;\n }\n\n struct S_aa5c2a4c {\n S_a9554343 s_0;\n string s_1;\n address[] s_2;\n address s_3;\n uint160 s_4;\n }\n\n function test () public pure returns (S_aa5c2a4c memory) {\n S_aa5c2a4c memory r;\n {\n S_a9554343 memory r_0;\n {\n int24 r_0_0 = 991869;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n address[] memory r_2 = new address[](1);\n {\n address r_2_0 = 0x1eB38693da7e6a28160EC83ef79B5336c8884E3E;\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xB0989137F3949F5A66063c18E3f82264A8D99490;\n r.s_3 = r_3;\n }\n {\n uint160 r_4 = 118018019656086403137185267421563123995430489065;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000f227d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000b0989137f3949f5a66063c18e3f82264a8d9949000000000000000000000000014ac1c6c809dd1c5511d4d13bb57f30c09760be9000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001eb38693da7e6a28160ec83ef79b5336c8884e3e" + }, + { + "name": "random-((int8[2])[1],(bytes25,bool),(uint216))", + "type": "((int8[2])[1],(bytes25,bool),(uint216))", + "value": [ + [[["72", "-116"]]], + ["0x8c7428e13fa280113e587b4227937a87202ef854d2c26f85c2", false], + ["50838420224133995782255399772884630604177307096988440383069238966"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "72" + }, + { + "type": "number", + "value": "-116" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8c7428e13fa280113e587b4227937a87202ef854d2c26f85c2" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "50838420224133995782255399772884630604177307096988440383069238966" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061027b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101aa565b60405180910390f35b6100566100f2565b61005e6100f2565b610066610150565b61006e61017d565b61007661018c565b604881526073196020808301919091529082529082529082526040805180820182526000818401527f8c7428e13fa280113e587b4227937a87202ef854d2c26f85c200000000000000815283830152805191820181527a7b94d39a773eb719ee6557342e6faa9a4ed522c02903b48ade36b68252820152919050565b6040518060600160405280610105610150565b81526020016101336040518060400160405280600066ffffffffffffff191681526020016000151581525090565b81526040805160208181019092526000815291015290565b905290565b60405180602001604052806001905b61016761017d565b81526020019060019003908161015f5790505090565b604051806020016040528061014b5b60405180604001604052806002906020820280368337509192915050565b815160a0820190826000805b60018082106101c55750610205565b84515184845b60028110156101eb578251860b82526020928301929091019083016101cb565b5050506020949094019350604092909201916001016101b6565b50505050602083810151805166ffffffffffffff19166040858101919091529101511515606084015290920151516001600160d81b03166080909101529056fea2646970667358221220d440431b8256f1ca075a6f762cf1b845020772df68d3e6a24991d1f7059a5b0564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_914a119e {\n int8[2] s_0;\n }\n\n struct S_52d13a1b {\n bytes25 s_0;\n bool s_1;\n }\n\n struct S_070be4eb {\n uint216 s_0;\n }\n\n struct S_6827f2a1 {\n S_914a119e[1] s_0;\n S_52d13a1b s_1;\n S_070be4eb s_2;\n }\n\n function test () public pure returns (S_6827f2a1 memory) {\n S_6827f2a1 memory r;\n {\n S_914a119e[1] memory r_0;\n {\n S_914a119e memory r_0_0;\n {\n int8[2] memory r_0_0_0;\n {\n int8 r_0_0_0_0 = 72;\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n int8 r_0_0_0_1 = -116;\n r_0_0_0[1] = r_0_0_0_1;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n S_52d13a1b memory r_1;\n {\n bytes25 r_1_0 = bytes25(0x8c7428e13fa280113e587b4227937a87202ef854d2c26f85c2);\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n S_070be4eb memory r_2;\n {\n uint216 r_2_0 = 50838420224133995782255399772884630604177307096988440383069238966;\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000048ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c8c7428e13fa280113e587b4227937a87202ef854d2c26f85c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b94d39a773eb719ee6557342e6faa9a4ed522c02903b48ade36b6" + }, + { + "name": "random-((uint112,bytes5,address,bytes9),int56)[]", + "type": "((uint112,bytes5,address,bytes9),int56)[]", + "value": [ + [ + [ + "4965796163749278931873180730292320", + "0xee65edc601", + "0xC0e30286bdbc62513E9BFeDf4683b6b01135EdA2", + "0xece0e6c435d17dbf2c" + ], + "6970112118955912" + ], + [ + [ + "3804464594975687933892110938278774", + "0xea7541e6c7", + "0xE0F3Cc94c03B7b1ec11072DCa6919B3a5150bcf0", + "0x065fbd6daace72a6dc" + ], + "26182627013438015" + ], + [ + [ + "565649644050795689706842579344120", + "0xa548844972", + "0x79f32f87F9AC317A07fab24484bFE9B91f93A5C6", + "0x2ea6a0dd310feab35d" + ], + "-7884678680126271" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4965796163749278931873180730292320" + }, + { + "type": "hexstring", + "value": "0xee65edc601" + }, + { + "type": "address", + "value": "0xC0e30286bdbc62513E9BFeDf4683b6b01135EdA2" + }, + { + "type": "hexstring", + "value": "0xece0e6c435d17dbf2c" + } + ] + }, + { + "type": "number", + "value": "6970112118955912" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3804464594975687933892110938278774" + }, + { + "type": "hexstring", + "value": "0xea7541e6c7" + }, + { + "type": "address", + "value": "0xE0F3Cc94c03B7b1ec11072DCa6919B3a5150bcf0" + }, + { + "type": "hexstring", + "value": "0x065fbd6daace72a6dc" + } + ] + }, + { + "type": "number", + "value": "26182627013438015" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "565649644050795689706842579344120" + }, + { + "type": "hexstring", + "value": "0xa548844972" + }, + { + "type": "address", + "value": "0x79f32f87F9AC317A07fab24484bFE9B91f93A5C6" + }, + { + "type": "hexstring", + "value": "0x2ea6a0dd310feab35d" + } + ] + }, + { + "type": "number", + "value": "-7884678680126271" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610365806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061027b565b60405180910390f35b6040805160038082526080820190925260609160009190816020015b610072610247565b81526020019060019003908161006a57905050905061008f610247565b604080516080810182526df4d528c88b2998cbf996bcdc7860815264ee65edc60160d81b60208083019190915273c0e30286bdbc62513e9bfedf4683b6b01135eda292820192909252683b3839b10d745f6fcb60ba1b606082015282526618c347b0e51f889082015281518190839060009061010d5761010d610319565b602002602001018190525050610121610247565b604080516080810182526dbb93181a1bb9475c2d3975c00b76815264ea7541e6c760d81b60208083019190915273e0f3cc94c03b7b1ec11072dca6919b3a5150bcf092820192909252680197ef5b6ab39ca9b760ba1b60608201528252665d04f5e66c2a3f9082015281518190839060019081106101a1576101a1610319565b6020026020010181905250506101b5610247565b604080516080810182526d1be380930e6c3faf5b76d1e51af881526452a44224b960d91b6020808301919091527379f32f87f9ac317a07fab24484bfe9b91f93a5c692820192909252682ea6a0dd310feab35d60b81b60608201528252661c0312cfe5a33e1990820152815181908390600290811061023657610236610319565b602090810291909101015250919050565b6040805160c0810182526000918101828152606082018390526080820183905260a082018390528152602081019190915290565b602080825282518282018190526000919060409081850190868401855b8281101561030c578151805180516dffffffffffffffffffffffffffff168652878101516001600160d81b03191688870152868101516001600160a01b0316878701526060908101516001600160b81b0319169086015286015160060b608085015260a09093019290850190600101610298565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212207775d0efc271782c1ad5f313b2a37a85c1304996e42290c92cf94fa035cfdea864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7453cb0f {\n uint112 s_0;\n bytes5 s_1;\n address s_2;\n bytes9 s_3;\n }\n\n struct S_efdb98a3 {\n S_7453cb0f s_0;\n int56 s_1;\n }\n\n function test () public pure returns (S_efdb98a3[] memory) {\n S_efdb98a3[] memory r = new S_efdb98a3[](3);\n {\n S_efdb98a3 memory r_0;\n {\n S_7453cb0f memory r_0_0;\n {\n uint112 r_0_0_0 = 4965796163749278931873180730292320;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bytes5 r_0_0_1 = bytes5(0xee65edc601);\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0xC0e30286bdbc62513E9BFeDf4683b6b01135EdA2;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n bytes9 r_0_0_3 = bytes9(0xece0e6c435d17dbf2c);\n r_0_0.s_3 = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n {\n int56 r_0_1 = 6970112118955912;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_efdb98a3 memory r_1;\n {\n S_7453cb0f memory r_1_0;\n {\n uint112 r_1_0_0 = 3804464594975687933892110938278774;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes5 r_1_0_1 = bytes5(0xea7541e6c7);\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0xE0F3Cc94c03B7b1ec11072DCa6919B3a5150bcf0;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n bytes9 r_1_0_3 = bytes9(0x065fbd6daace72a6dc);\n r_1_0.s_3 = r_1_0_3;\n }\n r_1.s_0 = r_1_0;\n }\n {\n int56 r_1_1 = 26182627013438015;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_efdb98a3 memory r_2;\n {\n S_7453cb0f memory r_2_0;\n {\n uint112 r_2_0_0 = 565649644050795689706842579344120;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bytes5 r_2_0_1 = bytes5(0xa548844972);\n r_2_0.s_1 = r_2_0_1;\n }\n {\n address r_2_0_2 = 0x79f32f87F9AC317A07fab24484bFE9B91f93A5C6;\n r_2_0.s_2 = r_2_0_2;\n }\n {\n bytes9 r_2_0_3 = bytes9(0x2ea6a0dd310feab35d);\n r_2_0.s_3 = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n int56 r_2_1 = -7884678680126271;\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000f4d528c88b2998cbf996bcdc7860ee65edc601000000000000000000000000000000000000000000000000000000000000000000000000000000c0e30286bdbc62513e9bfedf4683b6b01135eda2ece0e6c435d17dbf2c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018c347b0e51f88000000000000000000000000000000000000bb93181a1bb9475c2d3975c00b76ea7541e6c7000000000000000000000000000000000000000000000000000000000000000000000000000000e0f3cc94c03b7b1ec11072dca6919b3a5150bcf0065fbd6daace72a6dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d04f5e66c2a3f0000000000000000000000000000000000001be380930e6c3faf5b76d1e51af8a54884497200000000000000000000000000000000000000000000000000000000000000000000000000000079f32f87f9ac317a07fab24484bfe9b91f93a5c62ea6a0dd310feab35d0000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffe3fced301a5cc1" + }, + { + "name": "random-((uint200,address,bool[2],address)[2])", + "type": "((uint200,address,bool[2],address)[2])", + "value": [ + [ + [ + "1209406051087574454227062794089338874105378076242325758594115", + "0xdAeBEb700302Eb8Db56d8DF96D93817ac2c5894a", + [true, false], + "0xdbcD5Ebc9Af7ab78cC9F0AD761b207d66eB7c3BF" + ], + [ + "444111603586967893650681662777468816848669010732145499766126", + "0xE316D8187821C8c2E8fcD93d7C6C7eB5c5E1b4CB", + [false, false], + "0x66066Dd4F9879Fb71195711A3595b53a56e6122E" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1209406051087574454227062794089338874105378076242325758594115" + }, + { + "type": "address", + "value": "0xdAeBEb700302Eb8Db56d8DF96D93817ac2c5894a" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xdbcD5Ebc9Af7ab78cC9F0AD761b207d66eB7c3BF" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "444111603586967893650681662777468816848669010732145499766126" + }, + { + "type": "address", + "value": "0xE316D8187821C8c2E8fcD93d7C6C7eB5c5E1b4CB" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x66066Dd4F9879Fb71195711A3595b53a56e6122E" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e7565b60405180910390f35b610056610158565b61005e610158565b610066610170565b61006e61019d565b78c0ab645584d1eafc08651e6d85d5907d509d4941f17af8cc43815273daebeb700302eb8db56d8df96d93817ac2c5894a60208201526100ac6101c9565b6001815260006020820152604082015273dbcd5ebc9af7ab78cc9f0ad761b207d66eb7c3bf606082015281526100e061019d565b7846c0457d68e240f60242cf9e49fb47c0ba4a06d6f3ca84fd6e815273e316d8187821c8c2e8fcd93d7c6c7eb5c5e1b4cb602082015261011e6101c9565b600080825260208083019190915260408301919091527366066dd4f9879fb71195711a3595b53a56e6122e60608301528201528152919050565b604051806020016040528061016b610170565b905290565b60405180604001604052806002905b61018761019d565b81526020019060019003908161017f5790505090565b60408051608081018252600080825260208201529081016101bc6101c9565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b8151610140820190826000805b60028082106102035750610278565b845180516001600160c81b031685526020808201516001600160a01b03908116828801526040808401519088019190875b86811015610252578151151584529284019290840190600101610234565b50506060939093015190921660808701529590950194505060a0909201916001016101f4565b505050509291505056fea26469706673582212201454446f27c8454b7244ba310c123e9a90ba6c07b6efaf7cd1802fc0a0c250ec64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_22a03147 {\n uint200 s_0;\n address s_1;\n bool[2] s_2;\n address s_3;\n }\n\n struct S_feef6487 {\n S_22a03147[2] s_0;\n }\n\n function test () public pure returns (S_feef6487 memory) {\n S_feef6487 memory r;\n {\n S_22a03147[2] memory r_0;\n {\n S_22a03147 memory r_0_0;\n {\n uint200 r_0_0_0 = 1209406051087574454227062794089338874105378076242325758594115;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address r_0_0_1 = 0xdAeBEb700302Eb8Db56d8DF96D93817ac2c5894a;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bool[2] memory r_0_0_2;\n {\n bool r_0_0_2_0 = true;\n r_0_0_2[0] = r_0_0_2_0;\n }\n {\n bool r_0_0_2_1 = false;\n r_0_0_2[1] = r_0_0_2_1;\n }\n r_0_0.s_2 = r_0_0_2;\n }\n {\n address r_0_0_3 = 0xdbcD5Ebc9Af7ab78cC9F0AD761b207d66eB7c3BF;\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n S_22a03147 memory r_0_1;\n {\n uint200 r_0_1_0 = 444111603586967893650681662777468816848669010732145499766126;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n address r_0_1_1 = 0xE316D8187821C8c2E8fcD93d7C6C7eB5c5E1b4CB;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n bool[2] memory r_0_1_2;\n {\n bool r_0_1_2_0 = false;\n r_0_1_2[0] = r_0_1_2_0;\n }\n {\n bool r_0_1_2_1 = false;\n r_0_1_2[1] = r_0_1_2_1;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x66066Dd4F9879Fb71195711A3595b53a56e6122E;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000c0ab645584d1eafc08651e6d85d5907d509d4941f17af8cc43000000000000000000000000daebeb700302eb8db56d8df96d93817ac2c5894a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbcd5ebc9af7ab78cc9f0ad761b207d66eb7c3bf0000000000000046c0457d68e240f60242cf9e49fb47c0ba4a06d6f3ca84fd6e000000000000000000000000e316d8187821c8c2e8fcd93d7c6c7eb5c5e1b4cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066066dd4f9879fb71195711a3595b53a56e6122e" + }, + { + "name": "random-(address,((int[3],bool,string)),uint128)", + "type": "(address,((int[3],bool,string)),uint128)", + "value": [ + "0x5113E69A11210F1dBb54002e5f79De21485790Fd", + [ + [ + [ + "22664799257111789916953217217491518762589386491485502500465085277068089218936", + "-51924640377571728319306502403187620276723407628377476433469039038653288854189", + "-4898515888530216088669972360134461490243207641876914192971758755630160086204" + ], + true, + "Moo é🚀Moooé🚀oo oéMMoo oo Méé🚀 🚀 🚀o 🚀oooo🚀éo Mo🚀éooo" + ] + ], + "45124770665426269749264866103920223458" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5113E69A11210F1dBb54002e5f79De21485790Fd" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "22664799257111789916953217217491518762589386491485502500465085277068089218936" + }, + { + "type": "number", + "value": "-51924640377571728319306502403187620276723407628377476433469039038653288854189" + }, + { + "type": "number", + "value": "-4898515888530216088669972360134461490243207641876914192971758755630160086204" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀Moooé🚀oo oéMMoo oo Méé🚀 🚀 🚀o 🚀oooo🚀éo Mo🚀éooo" + } + ] + } + ] + }, + { + "type": "number", + "value": "45124770665426269749264866103920223458" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061034c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e2565b60405180910390f35b610056610155565b61005e610155565b735113e69a11210f1dbb54002e5f79de21485790fd815261007d610185565b61008561019d565b61008d6101c4565b7f321bd26015f38c58f192d214ef5f63b2366113677b6f54751e88455e8215d77881527f8d33b1ed648d914e07e2f1c860542ca683be83b9d7efcd3bfb40dc79ff614d536020808301919091527ff52b89cb5ec7d3fca7ee83a8b9ade2788097163862ea3327982b5d506eaefb446040808401919091529183526001838201528151608081019092526052808352600092916102c5908301396040808401919091529183525060208301919091526f21f2b6f6f5d632307b73edbe34e8e4e290820152919050565b604051806060016040528060006001600160a01b03168152602001610178610185565b8152600060209091015290565b604051806020016040528061019861019d565b905290565b60405180606001604052806101b06101c4565b815260006020820152606060409091015290565b60405180606001604052806003906020820280368337509192915050565b602080825282516001600160a01b03168282015282810151606060408401525160808301829052805160009291908360a086015b6003821015610235578251815291840191600191909101908401610216565b5050508082015115156101008501526040015160a06101208501528051610140850181905260005b8181101561027a578281018401518682016101600152830161025d565b8181111561028d57600061016083880101525b5060408601516fffffffffffffffffffffffffffffffff811660608701529250601f01601f1916939093016101600194935050505056fe4d6f6f20c3a9f09f9a804d6f6f6fc3a9f09f9a806f6f206fc3a94d4d6f6f206f6f204dc3a9c3a9f09f9a8020f09f9a8020f09f9a806f20f09f9a806f6f6f6ff09f9a80c3a96f204d6ff09f9a80c3a96f6f6fa2646970667358221220d44d7b6c2d68b2831c8d0b4a4e0f3ed01343cd6610e6d1f0f769de863e80d21264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_df5ded0e {\n int256[3] s_0;\n bool s_1;\n string s_2;\n }\n\n struct S_90bdaaef {\n S_df5ded0e s_0;\n }\n\n struct S_577f4cb9 {\n address s_0;\n S_90bdaaef s_1;\n uint128 s_2;\n }\n\n function test () public pure returns (S_577f4cb9 memory) {\n S_577f4cb9 memory r;\n {\n address r_0 = 0x5113E69A11210F1dBb54002e5f79De21485790Fd;\n r.s_0 = r_0;\n }\n {\n S_90bdaaef memory r_1;\n {\n S_df5ded0e memory r_1_0;\n {\n int256[3] memory r_1_0_0;\n {\n int r_1_0_0_0 = 22664799257111789916953217217491518762589386491485502500465085277068089218936;\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n int r_1_0_0_1 = -51924640377571728319306502403187620276723407628377476433469039038653288854189;\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n int r_1_0_0_2 = -4898515888530216088669972360134461490243207641876914192971758755630160086204;\n r_1_0_0[2] = r_1_0_0_2;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bool r_1_0_1 = true;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n string memory r_1_0_2 = unicode\"Moo é🚀Moooé🚀oo oéMMoo oo Méé🚀 🚀 🚀o 🚀oooo🚀éo Mo🚀éooo\";\n r_1_0.s_2 = r_1_0_2;\n }\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n uint128 r_2 = 45124770665426269749264866103920223458;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000005113e69a11210f1dbb54002e5f79de21485790fd00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000021f2b6f6f5d632307b73edbe34e8e4e20000000000000000000000000000000000000000000000000000000000000020321bd26015f38c58f192d214ef5f63b2366113677b6f54751e88455e8215d7788d33b1ed648d914e07e2f1c860542ca683be83b9d7efcd3bfb40dc79ff614d53f52b89cb5ec7d3fca7ee83a8b9ade2788097163862ea3327982b5d506eaefb44000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a804d6f6f6fc3a9f09f9a806f6f206fc3a94d4d6f6f206f6f204dc3a9c3a9f09f9a8020f09f9a8020f09f9a806f20f09f9a806f6f6f6ff09f9a80c3a96f204d6ff09f9a80c3a96f6f6f0000000000000000000000000000" + }, + { + "name": "random-(address,(string,bool),bytes22,bytes22,bytes6)", + "type": "(address,(string,bool),bytes22,bytes22,bytes6)", + "value": [ + "0xc830900DAcf108F36b2EB6AEb8d5bF01178b2C0C", + ["Moo é🚀ooMM ", true], + "0x5d5aab3188aaf77ff149310d0567f8e2dfb96cbb9b2c", + "0x1888d280c08e687c73c9a7b355fb5b094c032db42b40", + "0xb8c3db5b307c" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xc830900DAcf108F36b2EB6AEb8d5bF01178b2C0C" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooMM " + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x5d5aab3188aaf77ff149310d0567f8e2dfb96cbb9b2c" + }, + { + "type": "hexstring", + "value": "0x1888d280c08e687c73c9a7b355fb5b094c032db42b40" + }, + { + "type": "hexstring", + "value": "0xb8c3db5b307c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061025b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610163565b60405180910390f35b61005661010e565b61005e61010e565b73c830900dacf108f36b2eb6aeb8d5bf01178b2c0c815260408051808201825260608082526000602080840191825284518086018652600f81526e026b7b79061d4f84fcd4037b7a6a69608d1b8183015284526001909152840191909152751756aacc622abddffc524c434159fe38b7ee5b2ee6cb60521b918301919091527462234a030239a1f1cf269ecd57ed6c25300cb6d0ad60561b90820152652e30f6d6cc1f60d21b6080820152919050565b6040518060a0016040528060006001600160a01b031681526020016101486040518060400160405280606081526020016000151581525090565b81526000602082018190526040820181905260609091015290565b6000602080835260018060a01b03845116818401528084015160a060408501528051604060c086015280518061010087015260005b818110156101b55782810185015187820161012001528401610198565b818111156101c857600061012083890101525b509190920151151560e0850152604085015169ffffffffffffffffffff1990811660608087019190915286015116608080860191909152909401516001600160d01b03191660a08401525050610120601f909201601f191601019056fea2646970667358221220ed53a1f0f217535d8d0e495da826dd7b666ff860eb4f9d5f43c6d250ccf7ca3264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fc3be6c5 {\n string s_0;\n bool s_1;\n }\n\n struct S_26437d07 {\n address s_0;\n S_fc3be6c5 s_1;\n bytes22 s_2;\n bytes22 s_3;\n bytes6 s_4;\n }\n\n function test () public pure returns (S_26437d07 memory) {\n S_26437d07 memory r;\n {\n address r_0 = 0xc830900DAcf108F36b2EB6AEb8d5bF01178b2C0C;\n r.s_0 = r_0;\n }\n {\n S_fc3be6c5 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀ooMM \";\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n bytes22 r_2 = bytes22(0x5d5aab3188aaf77ff149310d0567f8e2dfb96cbb9b2c);\n r.s_2 = r_2;\n }\n {\n bytes22 r_3 = bytes22(0x1888d280c08e687c73c9a7b355fb5b094c032db42b40);\n r.s_3 = r_3;\n }\n {\n bytes6 r_4 = bytes6(0xb8c3db5b307c);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c830900dacf108f36b2eb6aeb8d5bf01178b2c0c00000000000000000000000000000000000000000000000000000000000000a05d5aab3188aaf77ff149310d0567f8e2dfb96cbb9b2c000000000000000000001888d280c08e687c73c9a7b355fb5b094c032db42b4000000000000000000000b8c3db5b307c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806f6f4d4d200000000000000000000000000000000000" + }, + { + "name": "random-(address,(uint176,int48,(uint48,bytes5)))[4]", + "type": "(address,(uint176,int48,(uint48,bytes5)))[4]", + "value": [ + [ + "0xe0Bd623b20911c49096b371E4bf1cdD065fB2Ca4", + [ + "83240504328455634059546708750128774569641395365583097", + "-97549210974822", + ["69851054414404", "0x0d0c2e8198"] + ] + ], + [ + "0x741a427e1234A9D6020aBc427666006A08B2709D", + [ + "64368112317555200644832536047584758947207423627926263", + "-25384490548395", + ["24735034647537", "0xb483abc066"] + ] + ], + [ + "0xe4A3Cb2601E1B3a6a80B33985ceABAa178d7dE36", + [ + "57613918711577183607313220231925471035485093950861479", + "-28772604903964", + ["113657273428368", "0x129ab7a27d"] + ] + ], + [ + "0xB083F5a350874A5d25e5EAe316f71d6ecD7eA943", + [ + "84630558749950124539239311808119333250115749565445824", + "-78903680646121", + ["157496488686722", "0x75c335e98e"] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xe0Bd623b20911c49096b371E4bf1cdD065fB2Ca4" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "83240504328455634059546708750128774569641395365583097" + }, + { + "type": "number", + "value": "-97549210974822" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "69851054414404" + }, + { + "type": "hexstring", + "value": "0x0d0c2e8198" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x741a427e1234A9D6020aBc427666006A08B2709D" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "64368112317555200644832536047584758947207423627926263" + }, + { + "type": "number", + "value": "-25384490548395" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "24735034647537" + }, + { + "type": "hexstring", + "value": "0xb483abc066" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xe4A3Cb2601E1B3a6a80B33985ceABAa178d7dE36" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "57613918711577183607313220231925471035485093950861479" + }, + { + "type": "number", + "value": "-28772604903964" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "113657273428368" + }, + { + "type": "hexstring", + "value": "0x129ab7a27d" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xB083F5a350874A5d25e5EAe316f71d6ecD7eA943" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "84630558749950124539239311808119333250115749565445824" + }, + { + "type": "number", + "value": "-78903680646121" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "157496488686722" + }, + { + "type": "hexstring", + "value": "0x75c335e98e" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103ed806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610332565b60405180910390f35b6100566102ac565b61005e6102ac565b6100666102d9565b73e0bd623b20911c49096b371e4bf1cdd065fb2ca48152610085610301565b75de7b76dc52a46c1d529a063ac465897d4899f27798f981526558b872117a651960208201526100c5604080518082019091526000808252602082015290565b653f8777491a4481526401a185d03360db1b602080830191909152604083019190915282015281526100f56102d9565b73741a427e1234a9d6020abc427666006a08b2709d8152610114610301565b75ac0a731e257f98dbc52fa00e38b461b50915ec0c9af78152651716498abcaa196020820152610154604080518082019091526000808252602082015290565b65167f12f423f18152645a41d5e03360d91b6020808301919091526040830191909152828101919091528201526101896102d9565b73e4a3cb2601e1b3a6a80b33985ceabaa178d7de3681526101a8610301565b7599fd0afa0e7ba951ab283ef2705acef39fd18bdf30a78152651a2b24e5021b1960208201526101e8604080518082019091526000808252602082015290565b65675ee568a990815264129ab7a27d60d81b60208083019190915260408381019290925283019190915282015261021d6102d9565b73b083f5a350874a5d25e5eae316f71d6ecd7ea943815261023c610301565b75e23294005c3636ace10dee8f49fc218c481fef0836c081526547c331db3be819602082015261027c604080518082019091526000808252602082015290565b658f3e0242f4828152643ae19af4c760d91b60208083019190915260408301919091528201526060820152919050565b60405180608001604052806004905b6102c36102d9565b8152602001906001900390816102bb5790505090565b604051806040016040528060006001600160a01b031681526020016102fc610301565b905290565b60408051606081018252600080825260208201529081016102fc604080518082019091526000808252602082015290565b6102808101818360005b60048110156103ae57815180516001600160a01b0316845260209081015180516001600160b01b0316828601528082015160050b6040808701919091520151805165ffffffffffff1660608601528101516001600160d81b031916608085015260a0909301929091019060010161033c565b5050509291505056fea2646970667358221220aee0e6295977e39dd950a5e4b06f9240568b714c375bb52e618b4450a6539bcd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_851cf15f {\n uint48 s_0;\n bytes5 s_1;\n }\n\n struct S_9e1c8372 {\n uint176 s_0;\n int48 s_1;\n S_851cf15f s_2;\n }\n\n struct S_a3ba2ff4 {\n address s_0;\n S_9e1c8372 s_1;\n }\n\n function test () public pure returns (S_a3ba2ff4[4] memory) {\n S_a3ba2ff4[4] memory r;\n {\n S_a3ba2ff4 memory r_0;\n {\n address r_0_0 = 0xe0Bd623b20911c49096b371E4bf1cdD065fB2Ca4;\n r_0.s_0 = r_0_0;\n }\n {\n S_9e1c8372 memory r_0_1;\n {\n uint176 r_0_1_0 = 83240504328455634059546708750128774569641395365583097;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n int48 r_0_1_1 = -97549210974822;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n S_851cf15f memory r_0_1_2;\n {\n uint48 r_0_1_2_0 = 69851054414404;\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n bytes5 r_0_1_2_1 = bytes5(0x0d0c2e8198);\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_a3ba2ff4 memory r_1;\n {\n address r_1_0 = 0x741a427e1234A9D6020aBc427666006A08B2709D;\n r_1.s_0 = r_1_0;\n }\n {\n S_9e1c8372 memory r_1_1;\n {\n uint176 r_1_1_0 = 64368112317555200644832536047584758947207423627926263;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n int48 r_1_1_1 = -25384490548395;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_851cf15f memory r_1_1_2;\n {\n uint48 r_1_1_2_0 = 24735034647537;\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n bytes5 r_1_1_2_1 = bytes5(0xb483abc066);\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_a3ba2ff4 memory r_2;\n {\n address r_2_0 = 0xe4A3Cb2601E1B3a6a80B33985ceABAa178d7dE36;\n r_2.s_0 = r_2_0;\n }\n {\n S_9e1c8372 memory r_2_1;\n {\n uint176 r_2_1_0 = 57613918711577183607313220231925471035485093950861479;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n int48 r_2_1_1 = -28772604903964;\n r_2_1.s_1 = r_2_1_1;\n }\n {\n S_851cf15f memory r_2_1_2;\n {\n uint48 r_2_1_2_0 = 113657273428368;\n r_2_1_2.s_0 = r_2_1_2_0;\n }\n {\n bytes5 r_2_1_2_1 = bytes5(0x129ab7a27d);\n r_2_1_2.s_1 = r_2_1_2_1;\n }\n r_2_1.s_2 = r_2_1_2;\n }\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n {\n S_a3ba2ff4 memory r_3;\n {\n address r_3_0 = 0xB083F5a350874A5d25e5EAe316f71d6ecD7eA943;\n r_3.s_0 = r_3_0;\n }\n {\n S_9e1c8372 memory r_3_1;\n {\n uint176 r_3_1_0 = 84630558749950124539239311808119333250115749565445824;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n int48 r_3_1_1 = -78903680646121;\n r_3_1.s_1 = r_3_1_1;\n }\n {\n S_851cf15f memory r_3_1_2;\n {\n uint48 r_3_1_2_0 = 157496488686722;\n r_3_1_2.s_0 = r_3_1_2_0;\n }\n {\n bytes5 r_3_1_2_1 = bytes5(0x75c335e98e);\n r_3_1_2.s_1 = r_3_1_2_1;\n }\n r_3_1.s_2 = r_3_1_2;\n }\n r_3.s_1 = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000e0bd623b20911c49096b371e4bf1cdd065fb2ca400000000000000000000de7b76dc52a46c1d529a063ac465897d4899f27798f9ffffffffffffffffffffffffffffffffffffffffffffffffffffa7478dee859a00000000000000000000000000000000000000000000000000003f8777491a440d0c2e8198000000000000000000000000000000000000000000000000000000000000000000000000000000741a427e1234a9d6020abc427666006a08b2709d00000000000000000000ac0a731e257f98dbc52fa00e38b461b50915ec0c9af7ffffffffffffffffffffffffffffffffffffffffffffffffffffe8e9b67543550000000000000000000000000000000000000000000000000000167f12f423f1b483abc066000000000000000000000000000000000000000000000000000000000000000000000000000000e4a3cb2601e1b3a6a80b33985ceabaa178d7de360000000000000000000099fd0afa0e7ba951ab283ef2705acef39fd18bdf30a7ffffffffffffffffffffffffffffffffffffffffffffffffffffe5d4db1afde40000000000000000000000000000000000000000000000000000675ee568a990129ab7a27d000000000000000000000000000000000000000000000000000000000000000000000000000000b083f5a350874a5d25e5eae316f71d6ecd7ea94300000000000000000000e23294005c3636ace10dee8f49fc218c481fef0836c0ffffffffffffffffffffffffffffffffffffffffffffffffffffb83cce24c41700000000000000000000000000000000000000000000000000008f3e0242f48275c335e98e000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,address,(string))[][3][3]", + "type": "(address,address,(string))[][3][3]", + "value": [ + [ + [ + [ + "0xdbAA9F6C2C943AF353620bF5e93DDD477Db1af22", + "0xA1A551566239178188B85703f3f5A1D295ae2e5e", + ["Moo é🚀MoéMoo o 🚀MooooMéoMéé M"] + ], + [ + "0x38A8A89E4e4ccEBD4917cECc82d83ca9aC482ABC", + "0xB3742eb0Ca9AF5Dd64c3152a5eF7B9DF60Fd0057", + ["Moo é🚀M🚀oMoéooé🚀MéoM MMo🚀Moééoé🚀éoMéoo🚀o oé é"] + ], + [ + "0x5a0cE98635b82ADc0FAF6e5DfBaD7bF7F0b8aeC8", + "0x093c67F526eab597D6517D9a133815F8eee251F8", + ["Moo é🚀éoo🚀o 🚀oooo🚀🚀 🚀 oé MMMooo ooMé"] + ] + ], + [ + [ + "0xA0489d70929FD1B9C6865B92C136635541C8cb69", + "0x81845041EbC9CbC4238FbAac0c86d30A6987dA6b", + ["Moo é🚀"] + ], + [ + "0xdCE6d2dF2cA31B9D529C28d9A451dfCec49bc6e0", + "0x8B5B3B89aD2532c8bdFDF96B9136b73D2c6FcFA8", + ["Moo é🚀é o oo é éooM oMMMo"] + ], + [ + "0x6244FCC2146522AbE14697aCd6da22EB1cbd3323", + "0x25892d288a5713a77f5cf4d283CaC5c9D3c797f4", + ["Moo é🚀 M🚀éé🚀🚀oéM🚀o🚀🚀🚀oo🚀oM🚀é🚀🚀🚀o oM"] + ], + [ + "0x9Ccda018D23888b2523A7237472D696f7C2F79A2", + "0xbbE58fB119987540EED61aC24499A93BAfA702a0", + ["Moo é🚀🚀ooééoéoM"] + ] + ], + [ + [ + "0x8BDFc210B432625378795889631E708aF5Ff9391", + "0xd7b08636de609E1044AF41C0D708cb38F0C787b0", + ["Moo é🚀M"] + ], + [ + "0x64C8C3dE86C7F9be2B7ACB71d846e67a303A9351", + "0x0aa51f27c1cff9E2322f4ce4fe96D7C8Cd57FafF", + ["Moo é🚀é🚀é🚀🚀éo🚀ooéooMéééé"] + ] + ] + ], + [ + [ + [ + "0x79518aF4820BC786291E6dB5D75827f85Ca2c91c", + "0xF4d04949F8BF39acBA095a882ACA02f4Eb44f719", + ["Moo é🚀éM éooo🚀🚀oéo🚀éMéM"] + ], + [ + "0x9580C20e335d0eb256e1Bda4df96745599ad21a6", + "0x935b4c4E584406c0aea7f6fe68b921FcdB723366", + ["Moo é🚀oM oMMééoéo🚀oMooMoé "] + ], + [ + "0xbf47a79dd5A60D0fE0BDE146462A93d67B27a553", + "0x0Da8c0FC2f289F956fb95659fC15d72f2E375Ce9", + ["Moo é🚀éo éo🚀Mo o🚀éMo🚀🚀🚀🚀 🚀é🚀MéMooo Mé🚀ooooMooMoooM"] + ], + [ + "0x2E4Af8e44dAd5f174E99BeB699e6F20AbD2b6bbD", + "0x68Db52f3787498511816a19eE85681002D8a5f32", + ["Moo é🚀Moo oM🚀ooooMMo"] + ] + ], + [ + [ + "0x429D188580cAe8099DBA7ff250e53705602741Bd", + "0x3304B482E2cB937e5942271C937A8c1980630ddD", + ["Moo é🚀"] + ], + [ + "0x253263e258cBD887D4d7d1C3Dc513370fdEfB8FF", + "0xeb840cd586aDcAC7136893aad2581d08D4a49a23", + ["Moo é🚀oo🚀🚀é"] + ], + [ + "0xeBCdDBB7BfcF7B9f127C9E1087f03fdC815dcb3d", + "0x41DF40F186250fD92127738aCde6FA24F2327bc8", + ["Moo é🚀éoé🚀oMoo🚀o oMé"] + ] + ], + [] + ], + [ + [ + [ + "0xdf475488B83Aa6AD42aEe5158E5169eb0844D99e", + "0x17241029996d81228a586f5A12D304046C851F88", + ["Moo é🚀"] + ], + [ + "0x6867105052fF2D087403F7F74cAb7DFa26FDc7Cd", + "0x1e69d214091A41f2aFC131909f8DbfAa02D3E78a", + ["Moo é🚀ééé🚀MéM éo🚀éoé M🚀M🚀 MM 🚀éoMMoo MoooéMoMéooooo🚀oM"] + ], + [ + "0x22C9537E69Ec250c54eD6cf06F567e18B4B5a9bE", + "0xCdadad2c1ec46E74FE776554d2f6BB1e075c573C", + ["Moo é🚀M"] + ] + ], + [], + [ + [ + "0xD0544c2E6Ed87E644ce486595a4C88629416bA8a", + "0x226A20ffd0792E62Ca75D38838B5D88d693d8e9C", + ["Moo é🚀 oéMé oM Méoo o 🚀ooo M o oM🚀MoMoMooé 🚀oooM🚀éM🚀"] + ], + [ + "0xBF1623AA8481F73634001eC7082C15243313555E", + "0x143d1848cC31400210EBe65D9e6674bcfcA67Af1", + ["Moo é🚀oMMooMM🚀é 🚀é 🚀🚀é éo oo 🚀 oé"] + ], + [ + "0xD87579255E77B97b7c382444E196d721b2BD6CB1", + "0xeabef4f324C748e84e0AC9Fec0f82045547b8f03", + ["Moo é🚀MMMM M Mo🚀 M🚀oo🚀M o🚀 🚀🚀Mé oéoééM"] + ] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdbAA9F6C2C943AF353620bF5e93DDD477Db1af22" + }, + { + "type": "address", + "value": "0xA1A551566239178188B85703f3f5A1D295ae2e5e" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MoéMoo o 🚀MooooMéoMéé M" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x38A8A89E4e4ccEBD4917cECc82d83ca9aC482ABC" + }, + { + "type": "address", + "value": "0xB3742eb0Ca9AF5Dd64c3152a5eF7B9DF60Fd0057" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M🚀oMoéooé🚀MéoM MMo🚀Moééoé🚀éoMéoo🚀o oé é" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5a0cE98635b82ADc0FAF6e5DfBaD7bF7F0b8aeC8" + }, + { + "type": "address", + "value": "0x093c67F526eab597D6517D9a133815F8eee251F8" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoo🚀o 🚀oooo🚀🚀 🚀 oé MMMooo ooMé" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA0489d70929FD1B9C6865B92C136635541C8cb69" + }, + { + "type": "address", + "value": "0x81845041EbC9CbC4238FbAac0c86d30A6987dA6b" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdCE6d2dF2cA31B9D529C28d9A451dfCec49bc6e0" + }, + { + "type": "address", + "value": "0x8B5B3B89aD2532c8bdFDF96B9136b73D2c6FcFA8" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é o oo é éooM oMMMo" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6244FCC2146522AbE14697aCd6da22EB1cbd3323" + }, + { + "type": "address", + "value": "0x25892d288a5713a77f5cf4d283CaC5c9D3c797f4" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M🚀éé🚀🚀oéM🚀o🚀🚀🚀oo🚀oM🚀é🚀🚀🚀o oM" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9Ccda018D23888b2523A7237472D696f7C2F79A2" + }, + { + "type": "address", + "value": "0xbbE58fB119987540EED61aC24499A93BAfA702a0" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ooééoéoM" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x8BDFc210B432625378795889631E708aF5Ff9391" + }, + { + "type": "address", + "value": "0xd7b08636de609E1044AF41C0D708cb38F0C787b0" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x64C8C3dE86C7F9be2B7ACB71d846e67a303A9351" + }, + { + "type": "address", + "value": "0x0aa51f27c1cff9E2322f4ce4fe96D7C8Cd57FafF" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀é🚀🚀éo🚀ooéooMéééé" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x79518aF4820BC786291E6dB5D75827f85Ca2c91c" + }, + { + "type": "address", + "value": "0xF4d04949F8BF39acBA095a882ACA02f4Eb44f719" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éM éooo🚀🚀oéo🚀éMéM" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9580C20e335d0eb256e1Bda4df96745599ad21a6" + }, + { + "type": "address", + "value": "0x935b4c4E584406c0aea7f6fe68b921FcdB723366" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM oMMééoéo🚀oMooMoé " + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xbf47a79dd5A60D0fE0BDE146462A93d67B27a553" + }, + { + "type": "address", + "value": "0x0Da8c0FC2f289F956fb95659fC15d72f2E375Ce9" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éo éo🚀Mo o🚀éMo🚀🚀🚀🚀 🚀é🚀MéMooo Mé🚀ooooMooMoooM" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2E4Af8e44dAd5f174E99BeB699e6F20AbD2b6bbD" + }, + { + "type": "address", + "value": "0x68Db52f3787498511816a19eE85681002D8a5f32" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Moo oM🚀ooooMMo" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x429D188580cAe8099DBA7ff250e53705602741Bd" + }, + { + "type": "address", + "value": "0x3304B482E2cB937e5942271C937A8c1980630ddD" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x253263e258cBD887D4d7d1C3Dc513370fdEfB8FF" + }, + { + "type": "address", + "value": "0xeb840cd586aDcAC7136893aad2581d08D4a49a23" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀🚀é" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xeBCdDBB7BfcF7B9f127C9E1087f03fdC815dcb3d" + }, + { + "type": "address", + "value": "0x41DF40F186250fD92127738aCde6FA24F2327bc8" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoé🚀oMoo🚀o oMé" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdf475488B83Aa6AD42aEe5158E5169eb0844D99e" + }, + { + "type": "address", + "value": "0x17241029996d81228a586f5A12D304046C851F88" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6867105052fF2D087403F7F74cAb7DFa26FDc7Cd" + }, + { + "type": "address", + "value": "0x1e69d214091A41f2aFC131909f8DbfAa02D3E78a" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééé🚀MéM éo🚀éoé M🚀M🚀 MM 🚀éoMMoo MoooéMoMéooooo🚀oM" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x22C9537E69Ec250c54eD6cf06F567e18B4B5a9bE" + }, + { + "type": "address", + "value": "0xCdadad2c1ec46E74FE776554d2f6BB1e075c573C" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD0544c2E6Ed87E644ce486595a4C88629416bA8a" + }, + { + "type": "address", + "value": "0x226A20ffd0792E62Ca75D38838B5D88d693d8e9C" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oéMé oM Méoo o 🚀ooo M o oM🚀MoMoMooé 🚀oooM🚀éM🚀" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xBF1623AA8481F73634001eC7082C15243313555E" + }, + { + "type": "address", + "value": "0x143d1848cC31400210EBe65D9e6674bcfcA67Af1" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMMooMM🚀é 🚀é 🚀🚀é éo oo 🚀 oé" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD87579255E77B97b7c382444E196d721b2BD6CB1" + }, + { + "type": "address", + "value": "0xeabef4f324C748e84e0AC9Fec0f82045547b8f03" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMMM M Mo🚀 M🚀oo🚀M o🚀 🚀🚀Mé oéoééM" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061147f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610fc1565b60405180910390f35b610056610f27565b61005e610f27565b610066610f54565b60408051600380825260808201909252600091816020015b610086610f7b565b81526020019060019003908161007e5790505090506100a3610f7b565b73dbaa9f6c2c943af353620bf5e93ddd477db1af22815273a1a551566239178188b85703f3f5a1d295ae2e5e60208083019190915260408051918201905260608152600060405180606001604052806029815260200161120460299139825250604082015281518190839060009061011d5761011d6110fa565b602002602001018190525050610131610f7b565b7338a8a89e4e4ccebd4917cecc82d83ca9ac482abc815273b3742eb0ca9af5dd64c3152a5ef7b9df60fd00576020808301919091526040805191820190526060815260006040518060800160405280604a8152602001611400604a9139825250604082015281518190839060019081106101ad576101ad6110fa565b6020026020010181905250506101c1610f7b565b735a0ce98635b82adc0faf6e5dfbad7bf7f0b8aec8815273093c67f526eab597d6517d9a133815f8eee251f86020808301919091526040805191820190526060815260006040518060600160405280603c815260200161134a603c91398252506040820152815181908390600290811061023d5761023d6110fa565b602090810291909101015250815260408051600480825260a08201909252600091816020015b61026b610f7b565b815260200190600190039081610263579050509050610288610f7b565b73a0489d70929fd1b9c6865b92c136635541c8cb6981527381845041ebc9cbc4238fbaac0c86d30a6987da6b60208083019190915260408051918201905260608152604080518082018252600a8152689adede418753e13f3560b71b60208201528252820152815181908390600090610303576103036110fa565b602002602001018190525050610317610f7b565b73dce6d2df2ca31b9d529c28d9a451dfcec49bc6e08152738b5b3b89ad2532c8bdfdf96b9136b73d2c6fcfa86020808301919091526040805191820190526060815260006040518060600160405280602381526020016113dd6023913982525060408201528151819083906001908110610393576103936110fa565b6020026020010181905250506103a7610f7b565b736244fcc2146522abe14697acd6da22eb1cbd332381527325892d288a5713a77f5cf4d283cac5c9d3c797f46020808301919091526040805191820190526060815260006040518060800160405280604f8152602001611111604f913982525060408201528151819083906002908110610423576104236110fa565b602002602001018190525050610437610f7b565b739ccda018d23888b2523a7237472d696f7c2f79a2815273bbe58fb119987540eed61ac24499a93bafa702a060208083019190915260408051918201905260608152604080518082018252601981527f4d6f6f20c3a9f09f9a80f09f9a806f6fc3a9c3a96fc3a96f4d000000000000006020820152825282015281518190839060039081106104c8576104c86110fa565b6020908102919091018101919091528301919091525060408051600280825260608201909252600091816020015b6104fe610f7b565b8152602001906001900390816104f657905050905061051b610f7b565b738bdfc210b432625378795889631e708af5ff9391815273d7b08636de609e1044af41c0d708cb38f0c787b060208083019190915260408051918201905260608152604080518082018252600b81526a4d6f6f20c3a9f09f9a804d60a81b60208201528252820152815181908390600090610598576105986110fa565b6020026020010181905250506105ac610f7b565b7364c8c3de86c7f9be2b7acb71d846e67a303a93518152730aa51f27c1cff9e2322f4ce4fe96d7c8cd57faff60208083019190915260408051918201905260608152600060405180606001604052806030815260200161124e6030913982525060408201528151819083906001908110610628576106286110fa565b60209081029190910101525060408201528152610643610f54565b60408051600480825260a08201909252600091816020015b610663610f7b565b81526020019060019003908161065b579050509050610680610f7b565b7379518af4820bc786291e6db5d75827f85ca2c91c815273f4d04949f8bf39acba095a882aca02f4eb44f7196020808301919091526040805191820190526060815260006040518060600160405280602981526020016111b66029913982525060408201528151819083906000906106fa576106fa6110fa565b60200260200101819052505061070e610f7b565b739580c20e335d0eb256e1bda4df96745599ad21a6815273935b4c4e584406c0aea7f6fe68b921fcdb7233666020808301919091526040805191820190526060815260006040518060600160405280602581526020016111df602591398252506040820152815181908390600190811061078a5761078a6110fa565b60200260200101819052505061079e610f7b565b73bf47a79dd5a60d0fe0bde146462a93d67b27a5538152730da8c0fc2f289f956fb95659fc15d72f2e375ce9602080830191909152604080519182019052606081526000604051806080016040528060578152602001611386605791398252506040820152815181908390600290811061081a5761081a6110fa565b60200260200101819052505061082e610f7b565b732e4af8e44dad5f174e99beb699e6f20abd2b6bbd81527368db52f3787498511816a19ee85681002d8a5f3260208083019190915260408051918201905260608152604080518082018252601b81527f4d6f6f20c3a9f09f9a804d6f6f206f4df09f9a806f6f6f6f4d4d6f00000000006020820152825282015281518190839060039081106108bf576108bf6110fa565b602090810291909101015250815260408051600380825260808201909252600091816020015b6108ed610f7b565b8152602001906001900390816108e557905050905061090a610f7b565b73429d188580cae8099dba7ff250e53705602741bd8152733304b482e2cb937e5942271c937a8c1980630ddd60208083019190915260408051918201905260608152604080518082018252600a8152689adede418753e13f3560b71b60208201528252820152815181908390600090610985576109856110fa565b602002602001018190525050610999610f7b565b73253263e258cbd887d4d7d1c3dc513370fdefb8ff815273eb840cd586adcac7136893aad2581d08d4a49a236020808301919091526040805191820190526060815260408051808201825260168152754d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a80c3a960501b602082015282528201528151819083906001908110610a2357610a236110fa565b602002602001018190525050610a37610f7b565b73ebcddbb7bfcf7b9f127c9e1087f03fdc815dcb3d81527341df40f186250fd92127738acde6fa24f2327bc860208083019190915260408051918201905260608152600060405180606001604052806021815260200161122d6021913982525060408201528151819083906002908110610ab357610ab36110fa565b602090810291909101810191909152838101929092525060408051600080825292810190915281610afa565b610ae7610f7b565b815260200190600190039081610adf5790505b506040830152506020820152610b0e610f54565b60408051600380825260808201909252600091816020015b610b2e610f7b565b815260200190600190039081610b26579050509050610b4b610f7b565b73df475488b83aa6ad42aee5158e5169eb0844d99e81527317241029996d81228a586f5a12d304046c851f8860208083019190915260408051918201905260608152604080518082018252600a8152689adede418753e13f3560b71b60208201528252820152815181908390600090610bc657610bc66110fa565b602002602001018190525050610bda610f7b565b736867105052ff2d087403f7f74cab7dfa26fdc7cd8152731e69d214091a41f2afc131909f8dbfaa02d3e78a6020808301919091526040805191820190526060815260006040518060800160405280605681526020016111606056913982525060408201528151819083906001908110610c5657610c566110fa565b602002602001018190525050610c6a610f7b565b7322c9537e69ec250c54ed6cf06f567e18b4b5a9be815273cdadad2c1ec46e74fe776554d2f6bb1e075c573c60208083019190915260408051918201905260608152604080518082018252600b81526a4d6f6f20c3a9f09f9a804d60a81b602082015282528201528151819083906002908110610ce957610ce96110fa565b6020908102919091018101919091529183525060408051600080825292810190915281610d2c565b610d19610f7b565b815260200190600190039081610d115790505b5060208301525060408051600380825260808201909252600091816020015b610d53610f7b565b815260200190600190039081610d4b579050509050610d70610f7b565b73d0544c2e6ed87e644ce486595a4c88629416ba8a815273226a20ffd0792e62ca75d38838b5d88d693d8e9c6020808301919091526040805191820190526060815260006040518060800160405280605181526020016112f9605191398252506040820152815181908390600090610dea57610dea6110fa565b602002602001018190525050610dfe610f7b565b73bf1623aa8481f73634001ec7082c15243313555e815273143d1848cc31400210ebe65d9e6674bcfca67af16020808301919091526040805191820190526060815260006040518060600160405280603981526020016112c06039913982525060408201528151819083906001908110610e7a57610e7a6110fa565b602002602001018190525050610e8e610f7b565b73d87579255e77b97b7c382444e196d721b2bd6cb1815273eabef4f324c748e84e0ac9fec0f82045547b8f0360208083019190915260408051918201905260608152600060405180608001604052806042815260200161127e6042913982525060408201528151819083906002908110610f0a57610f0a6110fa565b602090810291909101015250604080830191909152820152919050565b60405180606001604052806003905b610f3e610f54565b815260200190600190039081610f365790505090565b60405180606001604052806003905b6060815260200190600190039081610f635790505090565b604051806060016040528060006001600160a01b0316815260200160006001600160a01b03168152602001610fbc6040518060200160405280606081525090565b905290565b60208152600060208201608083018460005b60038110156110ef57601f19868403810185528251846060810160005b60038110156110d5578782038352835180518084526020918201918085019190600582901b86010160005b828110156110b8578682038a018452845180516001600160a01b039081168452602080830151909116818501526040918201516060928501839052519184015280516080840181905260005b8181101561108457602081840181015160a0878401015201611067565b8181111561109657600060a083870101525b506020968701969590950194601f018b169290920160a001915060010161101b565b506020978801979690960195945050506001919091019050610ff0565b506020978801979096509490940193505050600101610fd3565b509095945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80204df09f9a80c3a9c3a9f09f9a80f09f9a806fc3a94df09f9a806ff09f9a80f09f9a80f09f9a806f6ff09f9a806f4df09f9a80c3a9f09f9a80f09f9a80f09f9a806f206f4d4d6f6f20c3a9f09f9a80c3a9c3a9c3a9f09f9a804dc3a94d20c3a96ff09f9a80c3a96fc3a9204df09f9a804df09f9a80204d4d20f09f9a80c3a96f4d4d6f6f204d6f6f6fc3a94d6f4dc3a96f6f6f6f6ff09f9a806f4d4d6f6f20c3a9f09f9a80c3a94d20c3a96f6f6ff09f9a80f09f9a806fc3a96ff09f9a80c3a94dc3a94d4d6f6f20c3a9f09f9a806f4d206f4d4dc3a9c3a96fc3a96ff09f9a806f4d6f6f4d6fc3a9204d6f6f20c3a9f09f9a804d6fc3a94d6f6f206f2020f09f9a804d6f6f6f6f4dc3a96f4dc3a9c3a9204d4d6f6f20c3a9f09f9a80c3a96fc3a9f09f9a806f4d6f6ff09f9a806f206f4dc3a94d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9f09f9a80f09f9a80c3a96ff09f9a806f6fc3a96f6f4dc3a9c3a9c3a9c3a94d6f6f20c3a9f09f9a804d4d4d4d204d204d6ff09f9a80204df09f9a806f6ff09f9a804d206ff09f9a802020f09f9a80f09f9a804dc3a920206fc3a96fc3a9c3a94d4d6f6f20c3a9f09f9a806f4d4d6f6f4d4df09f9a80c3a920f09f9a80c3a920f09f9a80f09f9a80c3a920c3a96f206f6f20f09f9a80206fc3a94d6f6f20c3a9f09f9a80206fc3a94dc3a9206f4d20204dc3a96f6f206f2020f09f9a806f6f6f2020204d20206f206f4df09f9a804d6f4d6f4d6f6fc3a920f09f9a806f6f6f4df09f9a80c3a94df09f9a804d6f6f20c3a9f09f9a80c3a96f6ff09f9a806f2020f09f9a806f6f6f6ff09f9a80f09f9a802020f09f9a80206fc3a9204d4d4d6f6f6f206f6f4dc3a94d6f6f20c3a9f09f9a80c3a96f20c3a96ff09f9a804d6f206ff09f9a80c3a94d6ff09f9a80f09f9a80f09f9a80f09f9a8020f09f9a80c3a9f09f9a804dc3a94d6f6f6f204dc3a9f09f9a806f6f6f6f4d6f6f4d6f6f6f4d4d6f6f20c3a9f09f9a80c3a9206f206f6f2020c3a9202020c3a96f6f4d206f4d4d4d6f4d6f6f20c3a9f09f9a804df09f9a806f4d6fc3a96f6fc3a9f09f9a804dc3a96f4d204d4d6ff09f9a804d6fc3a9c3a96fc3a9f09f9a80c3a96f4dc3a96f6ff09f9a806f206fc3a920c3a9a26469706673582212202aac1623e3345d1194773891dd3e0d3b05719977b49aac9e3297fcb6d2fc297864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_3da469b1 {\n address s_0;\n address s_1;\n S_97fc4627 s_2;\n }\n\n function test () public pure returns (S_3da469b1[][3][3] memory) {\n S_3da469b1[][3][3] memory r;\n {\n S_3da469b1[][3] memory r_0;\n {\n S_3da469b1[] memory r_0_0 = new S_3da469b1[](3);\n {\n S_3da469b1 memory r_0_0_0;\n {\n address r_0_0_0_0 = 0xdbAA9F6C2C943AF353620bF5e93DDD477Db1af22;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n address r_0_0_0_1 = 0xA1A551566239178188B85703f3f5A1D295ae2e5e;\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n S_97fc4627 memory r_0_0_0_2;\n {\n string memory r_0_0_0_2_0 = unicode\"Moo é🚀MoéMoo o 🚀MooooMéoMéé M\";\n r_0_0_0_2.s_0 = r_0_0_0_2_0;\n }\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_3da469b1 memory r_0_0_1;\n {\n address r_0_0_1_0 = 0x38A8A89E4e4ccEBD4917cECc82d83ca9aC482ABC;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n address r_0_0_1_1 = 0xB3742eb0Ca9AF5Dd64c3152a5eF7B9DF60Fd0057;\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n S_97fc4627 memory r_0_0_1_2;\n {\n string memory r_0_0_1_2_0 = unicode\"Moo é🚀M🚀oMoéooé🚀MéoM MMo🚀Moééoé🚀éoMéoo🚀o oé é\";\n r_0_0_1_2.s_0 = r_0_0_1_2_0;\n }\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n S_3da469b1 memory r_0_0_2;\n {\n address r_0_0_2_0 = 0x5a0cE98635b82ADc0FAF6e5DfBaD7bF7F0b8aeC8;\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n address r_0_0_2_1 = 0x093c67F526eab597D6517D9a133815F8eee251F8;\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n {\n S_97fc4627 memory r_0_0_2_2;\n {\n string memory r_0_0_2_2_0 = unicode\"Moo é🚀éoo🚀o 🚀oooo🚀🚀 🚀 oé MMMooo ooMé\";\n r_0_0_2_2.s_0 = r_0_0_2_2_0;\n }\n r_0_0_2.s_2 = r_0_0_2_2;\n }\n r_0_0[2] = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n {\n S_3da469b1[] memory r_0_1 = new S_3da469b1[](4);\n {\n S_3da469b1 memory r_0_1_0;\n {\n address r_0_1_0_0 = 0xA0489d70929FD1B9C6865B92C136635541C8cb69;\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n address r_0_1_0_1 = 0x81845041EbC9CbC4238FbAac0c86d30A6987dA6b;\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n S_97fc4627 memory r_0_1_0_2;\n {\n string memory r_0_1_0_2_0 = unicode\"Moo é🚀\";\n r_0_1_0_2.s_0 = r_0_1_0_2_0;\n }\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n r_0_1[0] = r_0_1_0;\n }\n {\n S_3da469b1 memory r_0_1_1;\n {\n address r_0_1_1_0 = 0xdCE6d2dF2cA31B9D529C28d9A451dfCec49bc6e0;\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n address r_0_1_1_1 = 0x8B5B3B89aD2532c8bdFDF96B9136b73D2c6FcFA8;\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n S_97fc4627 memory r_0_1_1_2;\n {\n string memory r_0_1_1_2_0 = unicode\"Moo é🚀é o oo é éooM oMMMo\";\n r_0_1_1_2.s_0 = r_0_1_1_2_0;\n }\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n r_0_1[1] = r_0_1_1;\n }\n {\n S_3da469b1 memory r_0_1_2;\n {\n address r_0_1_2_0 = 0x6244FCC2146522AbE14697aCd6da22EB1cbd3323;\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n address r_0_1_2_1 = 0x25892d288a5713a77f5cf4d283CaC5c9D3c797f4;\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n S_97fc4627 memory r_0_1_2_2;\n {\n string memory r_0_1_2_2_0 = unicode\"Moo é🚀 M🚀éé🚀🚀oéM🚀o🚀🚀🚀oo🚀oM🚀é🚀🚀🚀o oM\";\n r_0_1_2_2.s_0 = r_0_1_2_2_0;\n }\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n r_0_1[2] = r_0_1_2;\n }\n {\n S_3da469b1 memory r_0_1_3;\n {\n address r_0_1_3_0 = 0x9Ccda018D23888b2523A7237472D696f7C2F79A2;\n r_0_1_3.s_0 = r_0_1_3_0;\n }\n {\n address r_0_1_3_1 = 0xbbE58fB119987540EED61aC24499A93BAfA702a0;\n r_0_1_3.s_1 = r_0_1_3_1;\n }\n {\n S_97fc4627 memory r_0_1_3_2;\n {\n string memory r_0_1_3_2_0 = unicode\"Moo é🚀🚀ooééoéoM\";\n r_0_1_3_2.s_0 = r_0_1_3_2_0;\n }\n r_0_1_3.s_2 = r_0_1_3_2;\n }\n r_0_1[3] = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n {\n S_3da469b1[] memory r_0_2 = new S_3da469b1[](2);\n {\n S_3da469b1 memory r_0_2_0;\n {\n address r_0_2_0_0 = 0x8BDFc210B432625378795889631E708aF5Ff9391;\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n address r_0_2_0_1 = 0xd7b08636de609E1044AF41C0D708cb38F0C787b0;\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n {\n S_97fc4627 memory r_0_2_0_2;\n {\n string memory r_0_2_0_2_0 = unicode\"Moo é🚀M\";\n r_0_2_0_2.s_0 = r_0_2_0_2_0;\n }\n r_0_2_0.s_2 = r_0_2_0_2;\n }\n r_0_2[0] = r_0_2_0;\n }\n {\n S_3da469b1 memory r_0_2_1;\n {\n address r_0_2_1_0 = 0x64C8C3dE86C7F9be2B7ACB71d846e67a303A9351;\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n {\n address r_0_2_1_1 = 0x0aa51f27c1cff9E2322f4ce4fe96D7C8Cd57FafF;\n r_0_2_1.s_1 = r_0_2_1_1;\n }\n {\n S_97fc4627 memory r_0_2_1_2;\n {\n string memory r_0_2_1_2_0 = unicode\"Moo é🚀é🚀é🚀🚀éo🚀ooéooMéééé\";\n r_0_2_1_2.s_0 = r_0_2_1_2_0;\n }\n r_0_2_1.s_2 = r_0_2_1_2;\n }\n r_0_2[1] = r_0_2_1;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_3da469b1[][3] memory r_1;\n {\n S_3da469b1[] memory r_1_0 = new S_3da469b1[](4);\n {\n S_3da469b1 memory r_1_0_0;\n {\n address r_1_0_0_0 = 0x79518aF4820BC786291E6dB5D75827f85Ca2c91c;\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n address r_1_0_0_1 = 0xF4d04949F8BF39acBA095a882ACA02f4Eb44f719;\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n S_97fc4627 memory r_1_0_0_2;\n {\n string memory r_1_0_0_2_0 = unicode\"Moo é🚀éM éooo🚀🚀oéo🚀éMéM\";\n r_1_0_0_2.s_0 = r_1_0_0_2_0;\n }\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n S_3da469b1 memory r_1_0_1;\n {\n address r_1_0_1_0 = 0x9580C20e335d0eb256e1Bda4df96745599ad21a6;\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n address r_1_0_1_1 = 0x935b4c4E584406c0aea7f6fe68b921FcdB723366;\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n {\n S_97fc4627 memory r_1_0_1_2;\n {\n string memory r_1_0_1_2_0 = unicode\"Moo é🚀oM oMMééoéo🚀oMooMoé \";\n r_1_0_1_2.s_0 = r_1_0_1_2_0;\n }\n r_1_0_1.s_2 = r_1_0_1_2;\n }\n r_1_0[1] = r_1_0_1;\n }\n {\n S_3da469b1 memory r_1_0_2;\n {\n address r_1_0_2_0 = 0xbf47a79dd5A60D0fE0BDE146462A93d67B27a553;\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n address r_1_0_2_1 = 0x0Da8c0FC2f289F956fb95659fC15d72f2E375Ce9;\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n {\n S_97fc4627 memory r_1_0_2_2;\n {\n string memory r_1_0_2_2_0 = unicode\"Moo é🚀éo éo🚀Mo o🚀éMo🚀🚀🚀🚀 🚀é🚀MéMooo Mé🚀ooooMooMoooM\";\n r_1_0_2_2.s_0 = r_1_0_2_2_0;\n }\n r_1_0_2.s_2 = r_1_0_2_2;\n }\n r_1_0[2] = r_1_0_2;\n }\n {\n S_3da469b1 memory r_1_0_3;\n {\n address r_1_0_3_0 = 0x2E4Af8e44dAd5f174E99BeB699e6F20AbD2b6bbD;\n r_1_0_3.s_0 = r_1_0_3_0;\n }\n {\n address r_1_0_3_1 = 0x68Db52f3787498511816a19eE85681002D8a5f32;\n r_1_0_3.s_1 = r_1_0_3_1;\n }\n {\n S_97fc4627 memory r_1_0_3_2;\n {\n string memory r_1_0_3_2_0 = unicode\"Moo é🚀Moo oM🚀ooooMMo\";\n r_1_0_3_2.s_0 = r_1_0_3_2_0;\n }\n r_1_0_3.s_2 = r_1_0_3_2;\n }\n r_1_0[3] = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n {\n S_3da469b1[] memory r_1_1 = new S_3da469b1[](3);\n {\n S_3da469b1 memory r_1_1_0;\n {\n address r_1_1_0_0 = 0x429D188580cAe8099DBA7ff250e53705602741Bd;\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n address r_1_1_0_1 = 0x3304B482E2cB937e5942271C937A8c1980630ddD;\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n S_97fc4627 memory r_1_1_0_2;\n {\n string memory r_1_1_0_2_0 = unicode\"Moo é🚀\";\n r_1_1_0_2.s_0 = r_1_1_0_2_0;\n }\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n r_1_1[0] = r_1_1_0;\n }\n {\n S_3da469b1 memory r_1_1_1;\n {\n address r_1_1_1_0 = 0x253263e258cBD887D4d7d1C3Dc513370fdEfB8FF;\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n {\n address r_1_1_1_1 = 0xeb840cd586aDcAC7136893aad2581d08D4a49a23;\n r_1_1_1.s_1 = r_1_1_1_1;\n }\n {\n S_97fc4627 memory r_1_1_1_2;\n {\n string memory r_1_1_1_2_0 = unicode\"Moo é🚀oo🚀🚀é\";\n r_1_1_1_2.s_0 = r_1_1_1_2_0;\n }\n r_1_1_1.s_2 = r_1_1_1_2;\n }\n r_1_1[1] = r_1_1_1;\n }\n {\n S_3da469b1 memory r_1_1_2;\n {\n address r_1_1_2_0 = 0xeBCdDBB7BfcF7B9f127C9E1087f03fdC815dcb3d;\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n address r_1_1_2_1 = 0x41DF40F186250fD92127738aCde6FA24F2327bc8;\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n {\n S_97fc4627 memory r_1_1_2_2;\n {\n string memory r_1_1_2_2_0 = unicode\"Moo é🚀éoé🚀oMoo🚀o oMé\";\n r_1_1_2_2.s_0 = r_1_1_2_2_0;\n }\n r_1_1_2.s_2 = r_1_1_2_2;\n }\n r_1_1[2] = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n {\n S_3da469b1[] memory r_1_2 = new S_3da469b1[](0);\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_3da469b1[][3] memory r_2;\n {\n S_3da469b1[] memory r_2_0 = new S_3da469b1[](3);\n {\n S_3da469b1 memory r_2_0_0;\n {\n address r_2_0_0_0 = 0xdf475488B83Aa6AD42aEe5158E5169eb0844D99e;\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n address r_2_0_0_1 = 0x17241029996d81228a586f5A12D304046C851F88;\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n S_97fc4627 memory r_2_0_0_2;\n {\n string memory r_2_0_0_2_0 = unicode\"Moo é🚀\";\n r_2_0_0_2.s_0 = r_2_0_0_2_0;\n }\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n S_3da469b1 memory r_2_0_1;\n {\n address r_2_0_1_0 = 0x6867105052fF2D087403F7F74cAb7DFa26FDc7Cd;\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n {\n address r_2_0_1_1 = 0x1e69d214091A41f2aFC131909f8DbfAa02D3E78a;\n r_2_0_1.s_1 = r_2_0_1_1;\n }\n {\n S_97fc4627 memory r_2_0_1_2;\n {\n string memory r_2_0_1_2_0 = unicode\"Moo é🚀ééé🚀MéM éo🚀éoé M🚀M🚀 MM 🚀éoMMoo MoooéMoMéooooo🚀oM\";\n r_2_0_1_2.s_0 = r_2_0_1_2_0;\n }\n r_2_0_1.s_2 = r_2_0_1_2;\n }\n r_2_0[1] = r_2_0_1;\n }\n {\n S_3da469b1 memory r_2_0_2;\n {\n address r_2_0_2_0 = 0x22C9537E69Ec250c54eD6cf06F567e18B4B5a9bE;\n r_2_0_2.s_0 = r_2_0_2_0;\n }\n {\n address r_2_0_2_1 = 0xCdadad2c1ec46E74FE776554d2f6BB1e075c573C;\n r_2_0_2.s_1 = r_2_0_2_1;\n }\n {\n S_97fc4627 memory r_2_0_2_2;\n {\n string memory r_2_0_2_2_0 = unicode\"Moo é🚀M\";\n r_2_0_2_2.s_0 = r_2_0_2_2_0;\n }\n r_2_0_2.s_2 = r_2_0_2_2;\n }\n r_2_0[2] = r_2_0_2;\n }\n r_2[0] = r_2_0;\n }\n {\n S_3da469b1[] memory r_2_1 = new S_3da469b1[](0);\n r_2[1] = r_2_1;\n }\n {\n S_3da469b1[] memory r_2_2 = new S_3da469b1[](3);\n {\n S_3da469b1 memory r_2_2_0;\n {\n address r_2_2_0_0 = 0xD0544c2E6Ed87E644ce486595a4C88629416bA8a;\n r_2_2_0.s_0 = r_2_2_0_0;\n }\n {\n address r_2_2_0_1 = 0x226A20ffd0792E62Ca75D38838B5D88d693d8e9C;\n r_2_2_0.s_1 = r_2_2_0_1;\n }\n {\n S_97fc4627 memory r_2_2_0_2;\n {\n string memory r_2_2_0_2_0 = unicode\"Moo é🚀 oéMé oM Méoo o 🚀ooo M o oM🚀MoMoMooé 🚀oooM🚀éM🚀\";\n r_2_2_0_2.s_0 = r_2_2_0_2_0;\n }\n r_2_2_0.s_2 = r_2_2_0_2;\n }\n r_2_2[0] = r_2_2_0;\n }\n {\n S_3da469b1 memory r_2_2_1;\n {\n address r_2_2_1_0 = 0xBF1623AA8481F73634001eC7082C15243313555E;\n r_2_2_1.s_0 = r_2_2_1_0;\n }\n {\n address r_2_2_1_1 = 0x143d1848cC31400210EBe65D9e6674bcfcA67Af1;\n r_2_2_1.s_1 = r_2_2_1_1;\n }\n {\n S_97fc4627 memory r_2_2_1_2;\n {\n string memory r_2_2_1_2_0 = unicode\"Moo é🚀oMMooMM🚀é 🚀é 🚀🚀é éo oo 🚀 oé\";\n r_2_2_1_2.s_0 = r_2_2_1_2_0;\n }\n r_2_2_1.s_2 = r_2_2_1_2;\n }\n r_2_2[1] = r_2_2_1;\n }\n {\n S_3da469b1 memory r_2_2_2;\n {\n address r_2_2_2_0 = 0xD87579255E77B97b7c382444E196d721b2BD6CB1;\n r_2_2_2.s_0 = r_2_2_2_0;\n }\n {\n address r_2_2_2_1 = 0xeabef4f324C748e84e0AC9Fec0f82045547b8f03;\n r_2_2_2.s_1 = r_2_2_2_1;\n }\n {\n S_97fc4627 memory r_2_2_2_2;\n {\n string memory r_2_2_2_2_0 = unicode\"Moo é🚀MMMM M Mo🚀 M🚀oo🚀M o🚀 🚀🚀Mé oéoééM\";\n r_2_2_2_2.s_0 = r_2_2_2_2_0;\n }\n r_2_2_2.s_2 = r_2_2_2_2;\n }\n r_2_2[2] = r_2_2_2;\n }\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001180000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000dbaa9f6c2c943af353620bf5e93ddd477db1af22000000000000000000000000a1a551566239178188b85703f3f5a1d295ae2e5e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a804d6fc3a94d6f6f206f2020f09f9a804d6f6f6f6f4dc3a96f4dc3a9c3a9204d000000000000000000000000000000000000000000000000000000000000000000000038a8a89e4e4ccebd4917cecc82d83ca9ac482abc000000000000000000000000b3742eb0ca9af5dd64c3152a5ef7b9df60fd005700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a804df09f9a806f4d6fc3a96f6fc3a9f09f9a804dc3a96f4d204d4d6ff09f9a804d6fc3a9c3a96fc3a9f09f9a80c3a96f4dc3a96f6ff09f9a806f206fc3a920c3a9000000000000000000000000000000000000000000000000000000000000000000005a0ce98635b82adc0faf6e5dfbad7bf7f0b8aec8000000000000000000000000093c67f526eab597d6517d9a133815f8eee251f800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a80c3a96f6ff09f9a806f2020f09f9a806f6f6f6ff09f9a80f09f9a802020f09f9a80206fc3a9204d4d4d6f6f6f206f6f4dc3a90000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000a0489d70929fd1b9c6865b92c136635541c8cb6900000000000000000000000081845041ebc9cbc4238fbaac0c86d30a6987da6b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000dce6d2df2ca31b9d529c28d9a451dfcec49bc6e00000000000000000000000008b5b3b89ad2532c8bdfdf96b9136b73d2c6fcfa80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80c3a9206f206f6f2020c3a9202020c3a96f6f4d206f4d4d4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000006244fcc2146522abe14697acd6da22eb1cbd332300000000000000000000000025892d288a5713a77f5cf4d283cac5c9d3c797f400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a80204df09f9a80c3a9c3a9f09f9a80f09f9a806fc3a94df09f9a806ff09f9a80f09f9a80f09f9a806f6ff09f9a806f4df09f9a80c3a9f09f9a80f09f9a80f09f9a806f206f4d00000000000000000000000000000000000000000000000000000000009ccda018d23888b2523a7237472d696f7c2f79a2000000000000000000000000bbe58fb119987540eed61ac24499a93bafa702a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a80f09f9a806f6fc3a9c3a96fc3a96f4d000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000008bdfc210b432625378795889631e708af5ff9391000000000000000000000000d7b08636de609e1044af41c0d708cb38f0c787b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a804d00000000000000000000000000000000000000000000000000000000000000000064c8c3de86c7f9be2b7acb71d846e67a303a93510000000000000000000000000aa51f27c1cff9e2322f4ce4fe96d7c8cd57faff0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9f09f9a80f09f9a80c3a96ff09f9a806f6fc3a96f6f4dc3a9c3a9c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000034000000000000000000000000079518af4820bc786291e6db5d75827f85ca2c91c000000000000000000000000f4d04949f8bf39acba095a882aca02f4eb44f7190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a80c3a94d20c3a96f6f6ff09f9a80f09f9a806fc3a96ff09f9a80c3a94dc3a94d00000000000000000000000000000000000000000000000000000000000000000000009580c20e335d0eb256e1bda4df96745599ad21a6000000000000000000000000935b4c4e584406c0aea7f6fe68b921fcdb7233660000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806f4d206f4d4dc3a9c3a96fc3a96ff09f9a806f4d6f6f4d6fc3a920000000000000000000000000000000000000000000000000000000000000000000000000000000bf47a79dd5a60d0fe0bde146462a93d67b27a5530000000000000000000000000da8c0fc2f289f956fb95659fc15d72f2e375ce90000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80c3a96f20c3a96ff09f9a804d6f206ff09f9a80c3a94d6ff09f9a80f09f9a80f09f9a80f09f9a8020f09f9a80c3a9f09f9a804dc3a94d6f6f6f204dc3a9f09f9a806f6f6f6f4d6f6f4d6f6f6f4d0000000000000000000000000000000000000000002e4af8e44dad5f174e99beb699e6f20abd2b6bbd00000000000000000000000068db52f3787498511816a19ee85681002d8a5f3200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a804d6f6f206f4df09f9a806f6f6f6f4d4d6f000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000429d188580cae8099dba7ff250e53705602741bd0000000000000000000000003304b482e2cb937e5942271c937a8c1980630ddd00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000253263e258cbd887d4d7d1c3dc513370fdefb8ff000000000000000000000000eb840cd586adcac7136893aad2581d08d4a49a230000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a80c3a900000000000000000000000000000000000000000000ebcddbb7bfcf7b9f127c9e1087f03fdc815dcb3d00000000000000000000000041df40f186250fd92127738acde6fa24f2327bc80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80c3a96fc3a9f09f9a806f4d6f6ff09f9a806f206f4dc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000220000000000000000000000000df475488b83aa6ad42aee5158e5169eb0844d99e00000000000000000000000017241029996d81228a586f5a12d304046c851f8800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000006867105052ff2d087403f7f74cab7dfa26fdc7cd0000000000000000000000001e69d214091a41f2afc131909f8dbfaa02d3e78a0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a80c3a9c3a9c3a9f09f9a804dc3a94d20c3a96ff09f9a80c3a96fc3a9204df09f9a804df09f9a80204d4d20f09f9a80c3a96f4d4d6f6f204d6f6f6fc3a94d6f4dc3a96f6f6f6f6ff09f9a806f4d0000000000000000000000000000000000000000000022c9537e69ec250c54ed6cf06f567e18b4b5a9be000000000000000000000000cdadad2c1ec46e74fe776554d2f6bb1e075c573c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000d0544c2e6ed87e644ce486595a4c88629416ba8a000000000000000000000000226a20ffd0792e62ca75d38838b5d88d693d8e9c0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80206fc3a94dc3a9206f4d20204dc3a96f6f206f2020f09f9a806f6f6f2020204d20206f206f4df09f9a804d6f4d6f4d6f6fc3a920f09f9a806f6f6f4df09f9a80c3a94df09f9a80000000000000000000000000000000000000000000000000000000bf1623aa8481f73634001ec7082c15243313555e000000000000000000000000143d1848cc31400210ebe65d9e6674bcfca67af10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f4d4d6f6f4d4df09f9a80c3a920f09f9a80c3a920f09f9a80f09f9a80c3a920c3a96f206f6f20f09f9a80206fc3a900000000000000000000000000000000000000d87579255e77b97b7c382444e196d721b2bd6cb1000000000000000000000000eabef4f324c748e84e0ac9fec0f82045547b8f030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a804d4d4d4d204d204d6ff09f9a80204df09f9a806f6ff09f9a804d206ff09f9a802020f09f9a80f09f9a804dc3a920206fc3a96fc3a9c3a94d000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,address[3],string,bool[3])", + "type": "(address,address[3],string,bool[3])", + "value": [ + "0xadCD7BF69bD0B891FD3C613d7A9aBa2cb1b77165", + [ + "0x0B8A6667525BAE6443d188d1b52c5F96C61D9fdc", + "0x8c00Ca88A08685959256C0Af9319cE3A972BB05B", + "0x4200F03403a1F43e4f39da7f2256138d1451CE2E" + ], + "Moo é🚀Mooo o éM🚀MM éooMoM🚀🚀M", + [true, false, true] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xadCD7BF69bD0B891FD3C613d7A9aBa2cb1b77165" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x0B8A6667525BAE6443d188d1b52c5F96C61D9fdc" + }, + { + "type": "address", + "value": "0x8c00Ca88A08685959256C0Af9319cE3A972BB05B" + }, + { + "type": "address", + "value": "0x4200F03403a1F43e4f39da7f2256138d1451CE2E" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mooo o éM🚀MM éooMoM🚀🚀M" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102bb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019e565b60405180910390f35b610056610119565b61005e610119565b73adcd7bf69bd0b891fd3c613d7a9aba2cb1b77165815261007d610155565b730b8a6667525bae6443d188d1b52c5f96c61d9fdc8152738c00ca88a08685959256c0af9319ce3a972bb05b602080830191909152734200f03403a1f43e4f39da7f2256138d1451ce2e60408084019190915283820192909252815160608101909252602e80835260009291610258908301396040830152506100fe610155565b60018082526000602083015260408201526060820152919050565b604051806080016040528060006001600160a01b0316815260200161013c610155565b815260200160608152602001610150610155565b905290565b60405180606001604052806003906020820280368337509192915050565b8060005b60038110156101985781511515845260209384019390910190600101610177565b50505050565b6000602080835260018060a01b038085511682850152818501516040850160005b60038110156101de5782518416825291840191908401906001016101bf565b50505050604084015161010060a085015280518061012086015260005b8181101561021857828101840151868201610140015283016101fb565b8181111561022b57600061014083880101525b506060860151925061024060c0860184610173565b601f01601f1916939093016101400194935050505056fe4d6f6f20c3a9f09f9a804d6f6f6f206f20c3a94df09f9a804d4d20202020c3a96f6f4d6f4df09f9a80f09f9a804da2646970667358221220b8d33d18a32b7f377f0e836f07257cf6972923d917ef861af05cae3d4a782e8164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0902dc4a {\n address s_0;\n address[3] s_1;\n string s_2;\n bool[3] s_3;\n }\n\n function test () public pure returns (S_0902dc4a memory) {\n S_0902dc4a memory r;\n {\n address r_0 = 0xadCD7BF69bD0B891FD3C613d7A9aBa2cb1b77165;\n r.s_0 = r_0;\n }\n {\n address[3] memory r_1;\n {\n address r_1_0 = 0x0B8A6667525BAE6443d188d1b52c5F96C61D9fdc;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0x8c00Ca88A08685959256C0Af9319cE3A972BB05B;\n r_1[1] = r_1_1;\n }\n {\n address r_1_2 = 0x4200F03403a1F43e4f39da7f2256138d1451CE2E;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀Mooo o éM🚀MM éooMoM🚀🚀M\";\n r.s_2 = r_2;\n }\n {\n bool[3] memory r_3;\n {\n bool r_3_0 = true;\n r_3[0] = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3[1] = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000adcd7bf69bd0b891fd3c613d7a9aba2cb1b771650000000000000000000000000b8a6667525bae6443d188d1b52c5f96c61d9fdc0000000000000000000000008c00ca88a08685959256c0af9319ce3a972bb05b0000000000000000000000004200f03403a1f43e4f39da7f2256138d1451ce2e0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a804d6f6f6f206f20c3a94df09f9a804d4d20202020c3a96f6f4d6f4df09f9a80f09f9a804d000000000000000000000000000000000000" + }, + { + "name": "random-(address,bool,(address,bytes31[4],bytes31))", + "type": "(address,bool,(address,bytes31[4],bytes31))", + "value": [ + "0xe09ABCf299D88b8Fd16D88534aF1d0e34d8f9d58", + false, + [ + "0xEd5d52C085FdBFAAc442c428ee67E6Bb1A93b39d", + [ + "0x528513a40ac0253eda682e7cdcb9ba64baedfee29a1559660393a73fc7b700", + "0x5d574ca37bb0882fbf1388d6eb0df851703a78da3b382ee11d73b0231523d0", + "0xd64db072563b6678db7c66849c2c0fb0d1070b45f12055722e00cebe201926", + "0x3963b12a12d2cecd3b4618861580809ed5289326cecbfc42d53536204a6f30" + ], + "0x8b8e62474df6de7e022798978b48d40834b99ef356f4ab421b12b30fe7979b" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xe09ABCf299D88b8Fd16D88534aF1d0e34d8f9d58" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xEd5d52C085FdBFAAc442c428ee67E6Bb1A93b39d" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x528513a40ac0253eda682e7cdcb9ba64baedfee29a1559660393a73fc7b700" + }, + { + "type": "hexstring", + "value": "0x5d574ca37bb0882fbf1388d6eb0df851703a78da3b382ee11d73b0231523d0" + }, + { + "type": "hexstring", + "value": "0xd64db072563b6678db7c66849c2c0fb0d1070b45f12055722e00cebe201926" + }, + { + "type": "hexstring", + "value": "0x3963b12a12d2cecd3b4618861580809ed5289326cecbfc42d53536204a6f30" + } + ] + }, + { + "type": "hexstring", + "value": "0x8b8e62474df6de7e022798978b48d40834b99ef356f4ab421b12b30fe7979b" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610294806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e6565b60405180910390f35b610056610174565b61005e610174565b73e09abcf299d88b8fd16d88534af1d0e34d8f9d58815260006020820152610084610198565b73ed5d52c085fdbfaac442c428ee67e6bb1a93b39d81526100a36101c8565b7f528513a40ac0253eda682e7cdcb9ba64baedfee29a1559660393a73fc7b7000081527f5d574ca37bb0882fbf1388d6eb0df851703a78da3b382ee11d73b0231523d0006020808301919091527fd64db072563b6678db7c66849c2c0fb0d1070b45f12055722e00cebe201926006040808401919091527f3963b12a12d2cecd3b4618861580809ed5289326cecbfc42d53536204a6f30006060840152908301919091527f8b8e62474df6de7e022798978b48d40834b99ef356f4ab421b12b30fe7979b0082820152820152919050565b6040805160608101825260008082526020820152908101610193610198565b905290565b604051806060016040528060006001600160a01b031681526020016101bb6101c8565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b81516001600160a01b039081168252602080840151151581840152604080850151805190931690840152818101516101008401929091906060850160005b600481101561024557845160ff191682529383019390830190600101610224565b505060ff1960408201511660e08601525050509291505056fea26469706673582212202f379a34f1797c35b8dcd9e66b29857f681308e740dee73dbde444539a741a2364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1cf3f50 {\n address s_0;\n bytes31[4] s_1;\n bytes31 s_2;\n }\n\n struct S_f62c5c04 {\n address s_0;\n bool s_1;\n S_c1cf3f50 s_2;\n }\n\n function test () public pure returns (S_f62c5c04 memory) {\n S_f62c5c04 memory r;\n {\n address r_0 = 0xe09ABCf299D88b8Fd16D88534aF1d0e34d8f9d58;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n S_c1cf3f50 memory r_2;\n {\n address r_2_0 = 0xEd5d52C085FdBFAAc442c428ee67E6Bb1A93b39d;\n r_2.s_0 = r_2_0;\n }\n {\n bytes31[4] memory r_2_1;\n {\n bytes31 r_2_1_0 = bytes31(0x528513a40ac0253eda682e7cdcb9ba64baedfee29a1559660393a73fc7b700);\n r_2_1[0] = r_2_1_0;\n }\n {\n bytes31 r_2_1_1 = bytes31(0x5d574ca37bb0882fbf1388d6eb0df851703a78da3b382ee11d73b0231523d0);\n r_2_1[1] = r_2_1_1;\n }\n {\n bytes31 r_2_1_2 = bytes31(0xd64db072563b6678db7c66849c2c0fb0d1070b45f12055722e00cebe201926);\n r_2_1[2] = r_2_1_2;\n }\n {\n bytes31 r_2_1_3 = bytes31(0x3963b12a12d2cecd3b4618861580809ed5289326cecbfc42d53536204a6f30);\n r_2_1[3] = r_2_1_3;\n }\n r_2.s_1 = r_2_1;\n }\n {\n bytes31 r_2_2 = bytes31(0x8b8e62474df6de7e022798978b48d40834b99ef356f4ab421b12b30fe7979b);\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000e09abcf299d88b8fd16d88534af1d0e34d8f9d580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed5d52c085fdbfaac442c428ee67e6bb1a93b39d528513a40ac0253eda682e7cdcb9ba64baedfee29a1559660393a73fc7b700005d574ca37bb0882fbf1388d6eb0df851703a78da3b382ee11d73b0231523d000d64db072563b6678db7c66849c2c0fb0d1070b45f12055722e00cebe201926003963b12a12d2cecd3b4618861580809ed5289326cecbfc42d53536204a6f30008b8e62474df6de7e022798978b48d40834b99ef356f4ab421b12b30fe7979b00" + }, + { + "name": "random-(address,bool,(string,address,address),uint160)", + "type": "(address,bool,(string,address,address),uint160)", + "value": [ + "0x26B12E324938361661B9bF9B362ab0A8248364f9", + true, + [ + "Moo é🚀🚀oMéé🚀Mé🚀 oééo", + "0x5cDD1B0a13028C678ae8232013e725a6d8Fa497a", + "0xDAC7DAf2Ce846097850770028864aC698857A19F" + ], + "131487646449837487408419117757168611056023111258" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x26B12E324938361661B9bF9B362ab0A8248364f9" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oMéé🚀Mé🚀 oééo" + }, + { + "type": "address", + "value": "0x5cDD1B0a13028C678ae8232013e725a6d8Fa497a" + }, + { + "type": "address", + "value": "0xDAC7DAf2Ce846097850770028864aC698857A19F" + } + ] + }, + { + "type": "number", + "value": "131487646449837487408419117757168611056023111258" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061015e565b60405180910390f35b610056610117565b61005e610117565b7326b12e324938361661b9bf9b362ab0a8248364f981526001602082015261009f604080516060808201835281526000602082018190529181019190915290565b600060405180606001604052806026815260200161021460269139825250735cdd1b0a13028c678ae8232013e725a6d8fa497a602082015273dac7daf2ce846097850770028864ac698857a19f6040808301919091528201527317081c2803026778d181e19208f79beb704a065a6060820152919050565b6040805160808101825260008082526020820152908101610151604080516060808201835281526000602082018190529181019190915290565b8152600060209091015290565b6000602080835260018060a01b038451168184015280840151151560408401526040840151608060608501528051606060a086015280518061010087015260005b818110156101bc578281018501518782016101200152840161019f565b818111156101cf57600061012083890101525b50928201516001600160a01b0390811660c0870152604090920151821660e08601525060609490940151909316608083015250610120601f909201601f191601019056fe4d6f6f20c3a9f09f9a80f09f9a806f4dc3a9c3a9f09f9a804dc3a9f09f9a80206fc3a9c3a96fa264697066735822122083f14d3d75e45f2d55f4ce2c114b99ef6285c242b5047397fb60d9fc9a2d899664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6ab35683 {\n string s_0;\n address s_1;\n address s_2;\n }\n\n struct S_887133a9 {\n address s_0;\n bool s_1;\n S_6ab35683 s_2;\n uint160 s_3;\n }\n\n function test () public pure returns (S_887133a9 memory) {\n S_887133a9 memory r;\n {\n address r_0 = 0x26B12E324938361661B9bF9B362ab0A8248364f9;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_6ab35683 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀🚀oMéé🚀Mé🚀 oééo\";\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x5cDD1B0a13028C678ae8232013e725a6d8Fa497a;\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0xDAC7DAf2Ce846097850770028864aC698857A19F;\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n uint160 r_3 = 131487646449837487408419117757168611056023111258;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000026b12e324938361661b9bf9b362ab0a8248364f90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000017081c2803026778d181e19208f79beb704a065a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000005cdd1b0a13028c678ae8232013e725a6d8fa497a000000000000000000000000dac7daf2ce846097850770028864ac698857a19f00000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80f09f9a806f4dc3a9c3a9f09f9a804dc3a9f09f9a80206fc3a9c3a96f0000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bool[3],address[],string)", + "type": "(address,bool[3],address[],string)", + "value": [ + "0xDA746E55dfd02B3b2be841542541d021EE56a1c1", + [false, true, true], + [ + "0x6972F4a2036292e64a038531e965987817C69BF5", + "0x8b16CCd05A825BAab14F23670955c62a0bC58CC2" + ], + "Moo é🚀🚀 oo🚀 🚀 🚀🚀oMMéoo🚀M 🚀 éo oM 🚀MMoo é oooé é" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xDA746E55dfd02B3b2be841542541d021EE56a1c1" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6972F4a2036292e64a038531e965987817C69BF5" + }, + { + "type": "address", + "value": "0x8b16CCd05A825BAab14F23670955c62a0bC58CC2" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 oo🚀 🚀 🚀🚀oMMéoo🚀M 🚀 éo oM 🚀MMoo é oooé é" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610390806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061026f565b60405180910390f35b610056610189565b61005e610189565b73da746e55dfd02b3b2be841542541d021ee56a1c1815261007d6101c0565b600080825260016020808401829052604080850192909252840192909252815160028082526060820190935290918160200160208202803683370190505090506000736972f4a2036292e64a038531e965987817c69bf5905080826000815181106100ea576100ea6102f3565b60200260200101906001600160a01b031690816001600160a01b031681525050506000738b16ccd05a825baab14f23670955c62a0bc58cc290508082600181518110610138576101386102f3565b60200260200101906001600160a01b031690816001600160a01b0316815250505080826040018190525050600060405180608001604052806051815260200161030a60519139606083015250919050565b604051806080016040528060006001600160a01b031681526020016101ac6101c0565b815260200160608152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b600081518084526020808501945080840160005b838110156102175781516001600160a01b0316875295820195908201906001016101f2565b509495945050505050565b6000815180845260005b818110156102485760208185018101518683018201520161022c565b8181111561025a576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516001600160a01b031682820152828101516000919060408401835b60038110156102b0578251151582529183019190830190600101610291565b50505050604083015160c060a08401526102cd60e08401826101de565b90506060840151601f198483030160c08501526102ea8282610222565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a80206f6ff09f9a8020f09f9a8020f09f9a80f09f9a806f4d4dc3a96f6ff09f9a804d20f09f9a802020c3a96f206f4d20f09f9a804d4d6f6f20c3a9206f6f6fc3a920c3a9a26469706673582212203e6c40360f23879ba790c6aa25733e85c573d39bf9aeadf76b16e3541156bf0664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f50800b0 {\n address s_0;\n bool[3] s_1;\n address[] s_2;\n string s_3;\n }\n\n function test () public pure returns (S_f50800b0 memory) {\n S_f50800b0 memory r;\n {\n address r_0 = 0xDA746E55dfd02B3b2be841542541d021EE56a1c1;\n r.s_0 = r_0;\n }\n {\n bool[3] memory r_1;\n {\n bool r_1_0 = false;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = true;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n address[] memory r_2 = new address[](2);\n {\n address r_2_0 = 0x6972F4a2036292e64a038531e965987817C69BF5;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x8b16CCd05A825BAab14F23670955c62a0bC58CC2;\n r_2[1] = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀🚀 oo🚀 🚀 🚀🚀oMMéoo🚀M 🚀 éo oM 🚀MMoo é oooé é\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000da746e55dfd02b3b2be841542541d021ee56a1c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006972f4a2036292e64a038531e965987817c69bf50000000000000000000000008b16ccd05a825baab14f23670955c62a0bc58cc200000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80f09f9a80206f6ff09f9a8020f09f9a8020f09f9a80f09f9a806f4d4dc3a96f6ff09f9a804d20f09f9a802020c3a96f206f4d20f09f9a804d4d6f6f20c3a9206f6f6fc3a920c3a9000000000000000000000000000000" + }, + { + "name": "random-(address,bytes10,string,address,uint8)[3]", + "type": "(address,bytes10,string,address,uint8)[3]", + "value": [ + [ + "0x123bF02F083e3b4991e933904a477c105EdDEA35", + "0x6be3e5bf82d74299a823", + "Moo é🚀 Mo oM🚀🚀é🚀o 🚀 éééM🚀🚀M🚀 oMoéo Méo🚀éM oo🚀éoMM", + "0xA6994b017cCFe0982702f14367fCEC0D6d449dab", + "162" + ], + [ + "0xBe8961f236cf50E28f3448AAF7e7ca14E2f8D5F8", + "0xdd12652e950645f95b18", + "Moo é🚀oo o 🚀🚀MéM éooéMM🚀🚀 éoé🚀é🚀Mo é🚀 🚀oé", + "0x16aA3b09ed0b0087Bd9B89C01b7fb92189a0cd70", + "89" + ], + [ + "0x120aAa3D2E6afE7Ff7e2ad2Aef52AcFc8aEeFC54", + "0xf0ff07378c64f9a02177", + "Moo é🚀éMéM", + "0x66d43912F418E9fD045f21B6DCC5F567db532820", + "248" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x123bF02F083e3b4991e933904a477c105EdDEA35" + }, + { + "type": "hexstring", + "value": "0x6be3e5bf82d74299a823" + }, + { + "type": "string", + "value": "Moo é🚀 Mo oM🚀🚀é🚀o 🚀 éééM🚀🚀M🚀 oMoéo Méo🚀éM oo🚀éoMM" + }, + { + "type": "address", + "value": "0xA6994b017cCFe0982702f14367fCEC0D6d449dab" + }, + { + "type": "number", + "value": "162" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xBe8961f236cf50E28f3448AAF7e7ca14E2f8D5F8" + }, + { + "type": "hexstring", + "value": "0xdd12652e950645f95b18" + }, + { + "type": "string", + "value": "Moo é🚀oo o 🚀🚀MéM éooéMM🚀🚀 éoé🚀é🚀Mo é🚀 🚀oé" + }, + { + "type": "address", + "value": "0x16aA3b09ed0b0087Bd9B89C01b7fb92189a0cd70" + }, + { + "type": "number", + "value": "89" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x120aAa3D2E6afE7Ff7e2ad2Aef52AcFc8aEeFC54" + }, + { + "type": "hexstring", + "value": "0xf0ff07378c64f9a02177" + }, + { + "type": "string", + "value": "Moo é🚀éMéM" + }, + { + "type": "address", + "value": "0x66d43912F418E9fD045f21B6DCC5F567db532820" + }, + { + "type": "number", + "value": "248" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610404806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061023d565b60405180910390f35b6100566101e1565b61005e6101e1565b61006661020e565b73123bf02f083e3b4991e933904a477c105eddea358152696be3e5bf82d74299a82360b01b602080830191909152604080516080810190915260598082526000926103289083013960408301525073a6994b017ccfe0982702f14367fcec0d6d449dab606082015260a2608082015281526100df61020e565b73be8961f236cf50e28f3448aaf7e7ca14e2f8d5f88152691ba24ca5d2a0c8bf2b6360b31b6020808301919091526040805160808101909152604e808252600092610381908301396040830152507316aa3b09ed0b0087bd9b89c01b7fb92189a0cd70606082015260596080820152602082015261015b61020e565b73120aaa3d2e6afe7ff7e2ad2aef52acfc8aeefc54815269f0ff07378c64f9a0217760b01b602080830191909152604080518082018252601081526f4d6f6f20c3a9f09f9a80c3a94dc3a94d60801b92810192909252808301919091527366d43912f418e9fd045f21b6dcc5f567db532820606083015260f86080830152820152919050565b60405180606001604052806003905b6101f861020e565b8152602001906001900390816101f05790505090565b6040805160a0810182526000808252602082018190526060928201839052918101829052608081019190915290565b602080825260009060808382018185018685805b600381101561031957601f1989850381018652835180516001600160a01b03168652888101516001600160b01b0319168987015260408082015160a091880182905280519188018290528591905b818310156102bd578083018c015189840160c00152918b019161029f565b50808211156102cf578560c0828a0101525b60609150818301516102eb838a01826001600160a01b03169052565b509189015160ff8116888b015291978a0197601f019092169590950160c00194505091860191600101610251565b50919897505050505050505056fe4d6f6f20c3a9f09f9a80204d6f206f4df09f9a80f09f9a80c3a9f09f9a806f20f09f9a8020c3a9c3a9c3a94df09f9a80f09f9a804df09f9a80206f4d6fc3a96f204dc3a96ff09f9a80c3a94d20206f6ff09f9a80c3a96f4d4d4d6f6f20c3a9f09f9a806f6f206f20f09f9a80f09f9a804dc3a94d20c3a96f6fc3a94d4df09f9a80f09f9a8020c3a96fc3a9f09f9a80c3a9f09f9a804d6f20c3a9f09f9a802020f09f9a806fc3a9a26469706673582212206d628c98e4a098a5f7aa50ff570bc2520dc260090b70067472c21721237ad25064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c962273a {\n address s_0;\n bytes10 s_1;\n string s_2;\n address s_3;\n uint8 s_4;\n }\n\n function test () public pure returns (S_c962273a[3] memory) {\n S_c962273a[3] memory r;\n {\n S_c962273a memory r_0;\n {\n address r_0_0 = 0x123bF02F083e3b4991e933904a477c105EdDEA35;\n r_0.s_0 = r_0_0;\n }\n {\n bytes10 r_0_1 = bytes10(0x6be3e5bf82d74299a823);\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀 Mo oM🚀🚀é🚀o 🚀 éééM🚀🚀M🚀 oMoéo Méo🚀éM oo🚀éoMM\";\n r_0.s_2 = r_0_2;\n }\n {\n address r_0_3 = 0xA6994b017cCFe0982702f14367fCEC0D6d449dab;\n r_0.s_3 = r_0_3;\n }\n {\n uint8 r_0_4 = 162;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_c962273a memory r_1;\n {\n address r_1_0 = 0xBe8961f236cf50E28f3448AAF7e7ca14E2f8D5F8;\n r_1.s_0 = r_1_0;\n }\n {\n bytes10 r_1_1 = bytes10(0xdd12652e950645f95b18);\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀oo o 🚀🚀MéM éooéMM🚀🚀 éoé🚀é🚀Mo é🚀 🚀oé\";\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0x16aA3b09ed0b0087Bd9B89C01b7fb92189a0cd70;\n r_1.s_3 = r_1_3;\n }\n {\n uint8 r_1_4 = 89;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_c962273a memory r_2;\n {\n address r_2_0 = 0x120aAa3D2E6afE7Ff7e2ad2Aef52AcFc8aEeFC54;\n r_2.s_0 = r_2_0;\n }\n {\n bytes10 r_2_1 = bytes10(0xf0ff07378c64f9a02177);\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀éMéM\";\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0x66d43912F418E9fD045f21B6DCC5F567db532820;\n r_2.s_3 = r_2_3;\n }\n {\n uint8 r_2_4 = 248;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000123bf02f083e3b4991e933904a477c105eddea356be3e5bf82d74299a8230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a6994b017ccfe0982702f14367fcec0d6d449dab00000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80204d6f206f4df09f9a80f09f9a80c3a9f09f9a806f20f09f9a8020c3a9c3a9c3a94df09f9a80f09f9a804df09f9a80206f4d6fc3a96f204dc3a96ff09f9a80c3a94d20206f6ff09f9a80c3a96f4d4d00000000000000000000000000000000000000be8961f236cf50e28f3448aaf7e7ca14e2f8d5f8dd12652e950645f95b180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000016aa3b09ed0b0087bd9b89c01b7fb92189a0cd700000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a806f6f206f20f09f9a80f09f9a804dc3a94d20c3a96f6fc3a94d4df09f9a80f09f9a8020c3a96fc3a9f09f9a80c3a9f09f9a804d6f20c3a9f09f9a802020f09f9a806fc3a9000000000000000000000000000000000000000000000000000000000000120aaa3d2e6afe7ff7e2ad2aef52acfc8aeefc54f0ff07378c64f9a021770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000066d43912f418e9fd045f21b6dcc5f567db53282000000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80c3a94dc3a94d00000000000000000000000000000000" + }, + { + "name": "random-(address,bytes25,bool,int120,address[])", + "type": "(address,bytes25,bool,int120,address[])", + "value": [ + "0x51ab601ec8EF720bC0d05ec5A71D2478B394f734", + "0x53a350b47187f5f5196f2864cf69115987b43956656a4d0412", + false, + "554735788168077247863183101157179703", + [] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x51ab601ec8EF720bC0d05ec5A71D2478B394f734" + }, + { + "type": "hexstring", + "value": "0x53a350b47187f5f5196f2864cf69115987b43956656a4d0412" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "554735788168077247863183101157179703" + }, + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101b0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6040805160a080820183526000808352602080840182905283850182905260608085018390526080948501819052855193840186528386018390529383018481527351ab601ec8ef720bc0d05ec5a71d2478b394f73484527f53a350b47187f5f5196f2864cf69115987b43956656a4d041200000000000000848301526e6ad6960425f4ece71b7eed083401379484019490945284519182528101845290915290516100dc91906100e5565b60405180910390f35b6000602080835260c0830160018060a01b03808651168386015266ffffffffffffff19838701511660408601526040860151151560608601526060860151600e0b6080860152608086015160a08087015282815180855260e0880191508583019450600092505b8083101561016e5784518416825293850193600192909201919085019061014c565b5097965050505050505056fea2646970667358221220b6b51ab5756775fd13270940dc99f699e7eef0b01cd0041de918335a1af3130764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_283fe536 {\n address s_0;\n bytes25 s_1;\n bool s_2;\n int120 s_3;\n address[] s_4;\n }\n\n function test () public pure returns (S_283fe536 memory) {\n S_283fe536 memory r;\n {\n address r_0 = 0x51ab601ec8EF720bC0d05ec5A71D2478B394f734;\n r.s_0 = r_0;\n }\n {\n bytes25 r_1 = bytes25(0x53a350b47187f5f5196f2864cf69115987b43956656a4d0412);\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n int120 r_3 = 554735788168077247863183101157179703;\n r.s_3 = r_3;\n }\n {\n address[] memory r_4 = new address[](0);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000051ab601ec8ef720bc0d05ec5a71d2478b394f73453a350b47187f5f5196f2864cf69115987b43956656a4d041200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ad6960425f4ece71b7eed0834013700000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,string,(bytes18[1]),uint72,uint32)", + "type": "(address,string,(bytes18[1]),uint72,uint32)", + "value": [ + "0x14B5C1E204d805977C68967ee1877533F91C41d3", + "Moo é🚀🚀 o Méo🚀éo", + [["0xa374aa49e08ee1f256ab15efa58d173f9aed"]], + "3418394330413995656611", + "3136413634" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x14B5C1E204d805977C68967ee1877533F91C41d3" + }, + { + "type": "string", + "value": "Moo é🚀🚀 o Méo🚀éo" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa374aa49e08ee1f256ab15efa58d173f9aed" + } + ] + } + ] + }, + { + "type": "number", + "value": "3418394330413995656611" + }, + { + "type": "number", + "value": "3136413634" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610289806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101a4565b60405180910390f35b6100566100fd565b61005e6100fd565b7314b5c1e204d805977c68967ee1877533f91c41d3815260408051808201909152601c81527f4d6f6f20c3a9f09f9a80f09f9a80206f204dc3a96ff09f9a80c3a96f000000006020808301919091528201526100b8610131565b6100c0610149565b71a374aa49e08ee1f256ab15efa58d173f9aed60701b81528152604082015268b94fc04c15078005a3606082015263baf1dfc26080820152919050565b6040805160a081018252600081526060602082015290810161011d610131565b815260006020820181905260409091015290565b6040518060200160405280610144610149565b905290565b60405180602001604052806001906020820280368337509192915050565b80518260005b600181101561019d5782516dffffffffffffffffffffffffffff191682526020928301929091019060010161016d565b5050505050565b6000602080835260018060a01b03845116818401528084015160a0604085015280518060c086015260005b818110156101eb5782810184015186820160e0015283016101cf565b818111156101fd57600060e083880101525b50604086015192506102126060860184610167565b606086015168ffffffffffffffffff811660808701529250608086015163ffffffff811660a08701529250601f01601f19169390930160e00194935050505056fea26469706673582212206e0bd4fad7049c5c32f2fa4e602ed8beaa080813e9d97ff685ef62a13124183464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d17fe8e2 {\n bytes18[1] s_0;\n }\n\n struct S_8838ae24 {\n address s_0;\n string s_1;\n S_d17fe8e2 s_2;\n uint72 s_3;\n uint32 s_4;\n }\n\n function test () public pure returns (S_8838ae24 memory) {\n S_8838ae24 memory r;\n {\n address r_0 = 0x14B5C1E204d805977C68967ee1877533F91C41d3;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀 o Méo🚀éo\";\n r.s_1 = r_1;\n }\n {\n S_d17fe8e2 memory r_2;\n {\n bytes18[1] memory r_2_0;\n {\n bytes18 r_2_0_0 = bytes18(0xa374aa49e08ee1f256ab15efa58d173f9aed);\n r_2_0[0] = r_2_0_0;\n }\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n uint72 r_3 = 3418394330413995656611;\n r.s_3 = r_3;\n }\n {\n uint32 r_4 = 3136413634;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000014b5c1e204d805977c68967ee1877533f91c41d300000000000000000000000000000000000000000000000000000000000000a0a374aa49e08ee1f256ab15efa58d173f9aed00000000000000000000000000000000000000000000000000000000000000000000000000b94fc04c15078005a300000000000000000000000000000000000000000000000000000000baf1dfc2000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80f09f9a80206f204dc3a96ff09f9a80c3a96f00000000" + }, + { + "name": "random-(address,string[3],bytes16,address,address)", + "type": "(address,string[3],bytes16,address,address)", + "value": [ + "0xF2be99A82Dc13eeca37B9eA2a53459DeB5848607", + [ + "Moo é🚀oéé🚀Mo é o🚀oéo🚀éMoéo🚀ooo ééMoé éoéooéo oo🚀o🚀MoéM🚀o oéoo ", + "Moo é🚀oéo🚀🚀é🚀Mééé🚀MMoooMMMo M éMo oMMo éoo o🚀oé🚀ééMoo🚀éM", + "Moo é🚀M 🚀🚀Mé🚀 M éMoM o oo🚀MoMo éoé" + ], + "0xcb854db99c35fc524ae81db52f5f40d4", + "0xE5cBEcD983F60dCF8B94B5681eb7A786898CFBc0", + "0xe5Eafd03972a640BB67b028194b47C2eff4642f4" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF2be99A82Dc13eeca37B9eA2a53459DeB5848607" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéé🚀Mo é o🚀oéo🚀éMoéo🚀ooo ééMoé éoéooéo oo🚀o🚀MoéM🚀o oéoo " + }, + { + "type": "string", + "value": "Moo é🚀oéo🚀🚀é🚀Mééé🚀MMoooMMMo M éMo oMMo éoo o🚀oé🚀ééMoo🚀éM" + }, + { + "type": "string", + "value": "Moo é🚀M 🚀🚀Mé🚀 M éMoM o oo🚀MoMo éoé" + } + ] + }, + { + "type": "hexstring", + "value": "0xcb854db99c35fc524ae81db52f5f40d4" + }, + { + "type": "address", + "value": "0xE5cBEcD983F60dCF8B94B5681eb7A786898CFBc0" + }, + { + "type": "address", + "value": "0xe5Eafd03972a640BB67b028194b47C2eff4642f4" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101a9565b60405180910390f35b610056610144565b61005e610144565b73f2be99a82dc13eeca37b9ea2a53459deb5848607815261007d610182565b60006040518060a0016040528060668152602001610298606691398252506040805160808101909152605d80825260009190610335602083013990508082600160200201819052505060006040518060600160405280603781526020016102fe603791396040808401919091526020840192909252506f32e1536e670d7f1492ba076d4bd7d03560821b9082015273e5cbecd983f60dcf8b94b5681eb7a786898cfbc0606082015273e5eafd03972a640bb67b028194b47c2eff4642f46080820152919050565b6040518060a0016040528060006001600160a01b03168152602001610167610182565b81526000602082018190526040820181905260609091015290565b60405180606001604052806003905b60608152602001906001900390816101915790505090565b602080825282516001600160a01b0316828201528281015160a060408401526000919061012084019060c0850184805b600381101561023f5787850360bf1901835283518051808752835b8181101561020f578281018901518882018a015288016101f4565b8181111561021f578489838a0101525b50601f01601f1916959095018601945092850192918501916001016101d9565b5050505060408501516fffffffffffffffffffffffffffffffff1981166060860152915060608501516001600160a01b0381166080860152915060808501516001600160a01b03811660a0860152915094935050505056fe4d6f6f20c3a9f09f9a806fc3a9c3a9f09f9a804d6f20c3a9206ff09f9a806fc3a96ff09f9a80c3a94d6fc3a96ff09f9a806f6f6f20c3a9c3a94d6fc3a920c3a96fc3a96f6fc3a96f20206f6ff09f9a806ff09f9a804d6fc3a94df09f9a806f206fc3a96f6f204d6f6f20c3a9f09f9a804d20f09f9a80f09f9a804dc3a9f09f9a8020204d20c3a94d6f4d206f206f6ff09f9a804d6f4d6f20c3a96fc3a94d6f6f20c3a9f09f9a806fc3a96ff09f9a80f09f9a80c3a9f09f9a804dc3a9c3a9c3a9f09f9a804d4d6f6f6f4d4d4d6f204d2020c3a94d6f206f4d4d6f20c3a96f6f206ff09f9a806fc3a9f09f9a80c3a9c3a94d6f6ff09f9a80c3a94da2646970667358221220f905beab0e4b88a853005ae695f96fbfa0c0eedfb4352aeafefd83a297c2e5a364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_abc7652a {\n address s_0;\n string[3] s_1;\n bytes16 s_2;\n address s_3;\n address s_4;\n }\n\n function test () public pure returns (S_abc7652a memory) {\n S_abc7652a memory r;\n {\n address r_0 = 0xF2be99A82Dc13eeca37B9eA2a53459DeB5848607;\n r.s_0 = r_0;\n }\n {\n string[3] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀oéé🚀Mo é o🚀oéo🚀éMoéo🚀ooo ééMoé éoéooéo oo🚀o🚀MoéM🚀o oéoo \";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oéo🚀🚀é🚀Mééé🚀MMoooMMMo M éMo oMMo éoo o🚀oé🚀ééMoo🚀éM\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀M 🚀🚀Mé🚀 M éMoM o oo🚀MoMo éoé\";\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bytes16 r_2 = bytes16(0xcb854db99c35fc524ae81db52f5f40d4);\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xE5cBEcD983F60dCF8B94B5681eb7A786898CFBc0;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xe5Eafd03972a640BB67b028194b47C2eff4642f4;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f2be99a82dc13eeca37b9ea2a53459deb584860700000000000000000000000000000000000000000000000000000000000000a0cb854db99c35fc524ae81db52f5f40d400000000000000000000000000000000000000000000000000000000e5cbecd983f60dcf8b94b5681eb7a786898cfbc0000000000000000000000000e5eafd03972a640bb67b028194b47c2eff4642f400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a806fc3a9c3a9f09f9a804d6f20c3a9206ff09f9a806fc3a96ff09f9a80c3a94d6fc3a96ff09f9a806f6f6f20c3a9c3a94d6fc3a920c3a96fc3a96f6fc3a96f20206f6ff09f9a806ff09f9a804d6fc3a94df09f9a806f206fc3a96f6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a806fc3a96ff09f9a80f09f9a80c3a9f09f9a804dc3a9c3a9c3a9f09f9a804d4d6f6f6f4d4d4d6f204d2020c3a94d6f206f4d4d6f20c3a96f6f206ff09f9a806fc3a9f09f9a80c3a9c3a94d6f6ff09f9a80c3a94d00000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a804d20f09f9a80f09f9a804dc3a9f09f9a8020204d20c3a94d6f4d206f206f6ff09f9a804d6f4d6f20c3a96fc3a9000000000000000000" + }, + { + "name": "random-(address[1],address,bool,bool[4])", + "type": "(address[1],address,bool,bool[4])", + "value": [ + ["0x9177C2062362938D582f771Bd7700043f44730A4"], + "0x72541242b3B98bd01f486676E6a02941E4015d90", + true, + [false, true, false, false] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9177C2062362938D582f771Bd7700043f44730A4" + } + ] + }, + { + "type": "address", + "value": "0x72541242b3B98bd01f486676E6a02941E4015d90" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101fb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061013b565b60405180910390f35b6100566100cc565b61005e6100cc565b6100666100ff565b739177c2062362938d582f771bd7700043f44730a4815281527372541242b3b98bd01f486676e6a02941e4015d906020820152600160408201526100a861011d565b60008082526001602083015260408201819052606080830191909152820152919050565b60405180608001604052806100df6100ff565b815260006020820181905260408201526060016100fa61011d565b905290565b60405180602001604052806001906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b815160e08201908260005b600181101561016e5782516001600160a01b0316825260209283019290910190600101610146565b5050506020838101516001600160a01b03168382015260408085015115159084015260608085015190840160005b60048110156101bb57825115158252918301919083019060010161019c565b505050509291505056fea2646970667358221220595670405264d1b11fd866d80cb36ba3b06f8aff91544abea23977272479216f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6694875e {\n address[1] s_0;\n address s_1;\n bool s_2;\n bool[4] s_3;\n }\n\n function test () public pure returns (S_6694875e memory) {\n S_6694875e memory r;\n {\n address[1] memory r_0;\n {\n address r_0_0 = 0x9177C2062362938D582f771Bd7700043f44730A4;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x72541242b3B98bd01f486676E6a02941E4015d90;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n bool[4] memory r_3;\n {\n bool r_3_0 = false;\n r_3[0] = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3[1] = r_3_1;\n }\n {\n bool r_3_2 = false;\n r_3[2] = r_3_2;\n }\n {\n bool r_3_3 = false;\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000009177c2062362938d582f771bd7700043f44730a400000000000000000000000072541242b3b98bd01f486676e6a02941e4015d9000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address[2],bytes22,bool,bytes14)[1]", + "type": "(address[2],bytes22,bool,bytes14)[1]", + "value": [ + [ + [ + "0x2cACb0d0aBC704BAbD4BE23767DBD42A25EDdEfC", + "0x9D91c60b77Ba8d7066344dfACa5feAA3f418FEdd" + ], + "0x9aeb442c4729ca0d8fe60262e53bbfb5796b05922402", + false, + "0x4a56a8f29f9b129b2f4329706e08" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2cACb0d0aBC704BAbD4BE23767DBD42A25EDdEfC" + }, + { + "type": "address", + "value": "0x9D91c60b77Ba8d7066344dfACa5feAA3f418FEdd" + } + ] + }, + { + "type": "hexstring", + "value": "0x9aeb442c4729ca0d8fe60262e53bbfb5796b05922402" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x4a56a8f29f9b129b2f4329706e08" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610249806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610162565b60405180910390f35b6100566100e9565b61005e6100e9565b610066610116565b61006e610144565b732cacb0d0abc704babd4be23767dbd42a25eddefc8152739d91c60b77ba8d7066344dfaca5feaa3f418fedd602080830191909152908252754d75a2162394e506c7f30131729ddfdabcb582c9120160511b90820152600060408201526d094ad51e53f3625365e8652e0dc160931b60608201528152919050565b60405180602001604052806001905b610100610116565b8152602001906001900390816100f85790505090565b6040518060800160405280610129610144565b81526000602082018190526040820181905260609091015290565b60405180604001604052806002906020820280368337509192915050565b60a08181019082846000805b600180821061017d5750610208565b8351805186855b60028110156101ab5782516001600160a01b03168252602092830192909101908401610184565b50505060208181015169ffffffffffffffffffff191660408881019190915282015115156060808901919091529091015171ffffffffffffffffffffffffffffffffffff191660808701529486019493909301925060010161016e565b50505050509291505056fea2646970667358221220a8db60922c8954097ff57c14637c3ed6b86dc2a7e3cd7b078d3bcab73be2642a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8351ec4e {\n address[2] s_0;\n bytes22 s_1;\n bool s_2;\n bytes14 s_3;\n }\n\n function test () public pure returns (S_8351ec4e[1] memory) {\n S_8351ec4e[1] memory r;\n {\n S_8351ec4e memory r_0;\n {\n address[2] memory r_0_0;\n {\n address r_0_0_0 = 0x2cACb0d0aBC704BAbD4BE23767DBD42A25EDdEfC;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x9D91c60b77Ba8d7066344dfACa5feAA3f418FEdd;\n r_0_0[1] = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bytes22 r_0_1 = bytes22(0x9aeb442c4729ca0d8fe60262e53bbfb5796b05922402);\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n {\n bytes14 r_0_3 = bytes14(0x4a56a8f29f9b129b2f4329706e08);\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000002cacb0d0abc704babd4be23767dbd42a25eddefc0000000000000000000000009d91c60b77ba8d7066344dfaca5feaa3f418fedd9aeb442c4729ca0d8fe60262e53bbfb5796b059224020000000000000000000000000000000000000000000000000000000000000000000000000000000000004a56a8f29f9b129b2f4329706e08000000000000000000000000000000000000" + }, + { + "name": "random-(bool,((bool,bytes31,address)),bool,(address))", + "type": "(bool,((bool,bytes31,address)),bool,(address))", + "value": [ + true, + [ + [ + false, + "0xfb0088422156546acd2894f1ad3688c07ec97233b081b58655890902aface6", + "0xd7aEaa4784bdA90a2e476CB726d1125A880af884" + ] + ], + true, + ["0xD19f4C2A7Afa063D3FED02D1aFB0A9fACA87Bc51"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xfb0088422156546acd2894f1ad3688c07ec97233b081b58655890902aface6" + }, + { + "type": "address", + "value": "0xd7aEaa4784bdA90a2e476CB726d1125A880af884" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD19f4C2A7Afa063D3FED02D1aFB0A9fACA87Bc51" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101e5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b610038610097565b604080518251151581526020808401515180511515828401529081015160ff1916828401528201516001600160a01b0390811660608084019190915292840151151560808301529190920151511660a082015260c00160405180910390f35b61009f610156565b6100a7610156565b600181526040805160808101825260006020820181815292820181905260608201529081526040805160608082018352600082527ffb0088422156546acd2894f1ad3688c07ec97233b081b58655890902aface60060208084019190915273d7aeaa4784bda90a2e476cb726d1125a880af8848385015291845284820193909352600184830152815190810190915273d19f4c2a7afa063d3fed02d1afb0a9faca87bc51815290820152919050565b604051806080016040528060001515815260200161019160408051608081018252600060208201818152928201819052606082015290815290565b8152600060208083018290526040805191820181529181529101529056fea264697066735822122062274087603249d43e4bfbf5b43ee58610167a2a97bb3539163fbec35390c42b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5be0f37a {\n bool s_0;\n bytes31 s_1;\n address s_2;\n }\n\n struct S_9805bf1d {\n S_5be0f37a s_0;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_75455d87 {\n bool s_0;\n S_9805bf1d s_1;\n bool s_2;\n S_421683f8 s_3;\n }\n\n function test () public pure returns (S_75455d87 memory) {\n S_75455d87 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n S_9805bf1d memory r_1;\n {\n S_5be0f37a memory r_1_0;\n {\n bool r_1_0_0 = false;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes31 r_1_0_1 = bytes31(0xfb0088422156546acd2894f1ad3688c07ec97233b081b58655890902aface6);\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0xd7aEaa4784bdA90a2e476CB726d1125A880af884;\n r_1_0.s_2 = r_1_0_2;\n }\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n S_421683f8 memory r_3;\n {\n address r_3_0 = 0xD19f4C2A7Afa063D3FED02D1aFB0A9fACA87Bc51;\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000fb0088422156546acd2894f1ad3688c07ec97233b081b58655890902aface600000000000000000000000000d7aeaa4784bda90a2e476cb726d1125a880af8840000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d19f4c2a7afa063d3fed02d1afb0a9faca87bc51" + }, + { + "name": "random-(bool,bool,bool,address,bytes9[1])", + "type": "(bool,bool,bool,address,bytes9[1])", + "value": [ + false, + true, + true, + "0xB4C5f4dd8E888A6679cbDF02a9d97894c8783412", + ["0xea8c9b0d4213f75c60"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xB4C5f4dd8E888A6679cbDF02a9d97894c8783412" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xea8c9b0d4213f75c60" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100fe565b60405180910390f35b6100566100ab565b61005e6100ab565b60008152600160208201819052604082015273b4c5f4dd8e888a6679cbdf02a9d97894c878341260608201526100926100e0565b68075464d86a109fbae360bd1b81526080820152919050565b6040805160a0810182526000808252602082018190529181018290526060810191909152608081016100db6100e0565b905290565b60405180602001604052806001906020820280368337509192915050565b8151151581526020808301511515818301526040808401511515908301526060808401516001600160a01b03169083015260808084015160a084019291840160005b60018110156101675782516001600160b81b03191682529183019190830190600101610140565b505050509291505056fea2646970667358221220f6e1b695a0da886bc3376d6ac40baa39075ab25de4ae6597dc24317017bdee3164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0f559a61 {\n bool s_0;\n bool s_1;\n bool s_2;\n address s_3;\n bytes9[1] s_4;\n }\n\n function test () public pure returns (S_0f559a61 memory) {\n S_0f559a61 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xB4C5f4dd8E888A6679cbDF02a9d97894c8783412;\n r.s_3 = r_3;\n }\n {\n bytes9[1] memory r_4;\n {\n bytes9 r_4_0 = bytes9(0xea8c9b0d4213f75c60);\n r_4[0] = r_4_0;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b4c5f4dd8e888a6679cbdf02a9d97894c8783412ea8c9b0d4213f75c600000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bool,bool,address,string[])", + "type": "(bool,bool,bool,address,string[])", + "value": [ + false, + true, + false, + "0x0C831994a7B4A5065086B945fAbA214D2C5A4CCC", + [ + "Moo é🚀oMoo🚀🚀", + "Moo é🚀ooM 🚀Mé🚀Moo🚀éo🚀éooM 🚀 é🚀🚀oo oM🚀M 🚀éo M oé🚀oM", + "Moo é🚀🚀o MéMooo oMéMo🚀oM🚀éooooooéMo o🚀oo🚀ooé éMo🚀éé éoo" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x0C831994a7B4A5065086B945fAbA214D2C5A4CCC" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMoo🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀ooM 🚀Mé🚀Moo🚀éo🚀éooM 🚀 é🚀🚀oo oM🚀M 🚀éo M oé🚀oM" + }, + { + "type": "string", + "value": "Moo é🚀🚀o MéMooo oMéMo🚀oM🚀éooooooéMo o🚀oo🚀ooé éMo🚀éé éoo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061038f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101b9565b60405180910390f35b6040805160a08082018352600080835260208084018290528385018290526060808501839052608080860182905286519485018752838552848701849052848101829052600185840152730c831994a7b4a5065086b945faba214d2c5a4ccc9185019190915285516003808252918101909652939492939192919082015b60608152602001906001900390816100cc5790505090506000604051806040016040528060168152602001749adede418753e13f3500de9adedfe13f3501e13f3560571b8152509050808260008151811061012957610129610293565b60200260200101819052505060006040518060800160405280605a81526020016102aa605a91399050808260018151811061016657610166610293565b602002602001018190525050600060405180608001604052806056815260200161030460569139905080826002815181106101a3576101a3610293565b6020908102919091010152506080820152919050565b6000602080835260c083018451151582850152818501511515604085015260408501511515606085015260018060a01b036060860151166080850152608085015160a08086015281815180845260e08701915060e08160051b880101935084830192506000805b828110156102855788860360df1901845284518051808852835b81811015610255578281018a01518982018b0152890161023a565b8181111561026557848a838b0101525b50601f01601f191696909601870195509386019392860192600101610220565b509398975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6f4d20f09f9a804dc3a9f09f9a804d6f6ff09f9a80c3a96ff09f9a80c3a96f6f4d20f09f9a8020c3a9f09f9a80f09f9a806f6f206f4df09f9a804d20f09f9a80c3a96f204d206fc3a9f09f9a806f4d4d6f6f20c3a9f09f9a80f09f9a806f204dc3a94d6f6f6f206f4dc3a94d6ff09f9a806f4df09f9a80c3a96f6f6f6f6f6fc3a94d6f206ff09f9a806f6ff09f9a806f6fc3a920c3a94d6ff09f9a80c3a9c3a920c3a96f6fa264697066735822122060cd6bd34a090a37cb5ff4e7d04484ccb19d1f093e6402a71e2b8e1aeee7ab1e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fda5ac99 {\n bool s_0;\n bool s_1;\n bool s_2;\n address s_3;\n string[] s_4;\n }\n\n function test () public pure returns (S_fda5ac99 memory) {\n S_fda5ac99 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x0C831994a7B4A5065086B945fAbA214D2C5A4CCC;\n r.s_3 = r_3;\n }\n {\n string[] memory r_4 = new string[](3);\n {\n string memory r_4_0 = unicode\"Moo é🚀oMoo🚀🚀\";\n r_4[0] = r_4_0;\n }\n {\n string memory r_4_1 = unicode\"Moo é🚀ooM 🚀Mé🚀Moo🚀éo🚀éooM 🚀 é🚀🚀oo oM🚀M 🚀éo M oé🚀oM\";\n r_4[1] = r_4_1;\n }\n {\n string memory r_4_2 = unicode\"Moo é🚀🚀o MéMooo oMéMo🚀oM🚀éooooooéMo o🚀oo🚀ooé éMo🚀éé éoo\";\n r_4[2] = r_4_2;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c831994a7b4a5065086b945faba214d2c5a4ccc00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806f4d6f6ff09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806f6f4d20f09f9a804dc3a9f09f9a804d6f6ff09f9a80c3a96ff09f9a80c3a96f6f4d20f09f9a8020c3a9f09f9a80f09f9a806f6f206f4df09f9a804d20f09f9a80c3a96f204d206fc3a9f09f9a806f4d00000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a80f09f9a806f204dc3a94d6f6f6f206f4dc3a94d6ff09f9a806f4df09f9a80c3a96f6f6f6f6f6fc3a94d6f206ff09f9a806f6ff09f9a806f6fc3a920c3a94d6ff09f9a80c3a9c3a920c3a96f6f00000000000000000000" + }, + { + "name": "random-(bool,bytes24[2],int176)[][4]", + "type": "(bool,bytes24[2],int176)[][4]", + "value": [ + [ + [ + true, + [ + "0xcb2f68d7b3d52135ac064a85b4bf46693751bb6ad1267182", + "0x8e0676044cea40e320e8cd6080972b3fed28a993f7e7f87a" + ], + "-9865452280504764652800544928124101089015979194227003" + ] + ], + [ + [ + true, + [ + "0xeb450aa7b99f2a6247748da24463ca8272c16d2ce45ac45e", + "0xdfdb0b1be1721941b3092ecb899b4ca28ce8bc4e7c05c499" + ], + "-29855009726676176929625385345253613021382390800198272" + ], + [ + false, + [ + "0x74ec5f34feae9eb7cb1c86a4205f25640e4b886b4d83bb89", + "0x513a7a86137a3d7ee166d6b15dda0c7a2420c76dc139edc9" + ], + "34650508649841102270779040959112881453213828873364610" + ] + ], + [ + [ + false, + [ + "0x723ffd54b6e377392464d19111974fb15a0dec1d507a2786", + "0xa24107d19367ee5697e6d082a3af48aa4c74f0e0163abebe" + ], + "12236012848273680385843419046900326468378622299055529" + ], + [ + false, + [ + "0x85ae906a078f5a48f9863b49ec4fd48db7e1c3add776bf8e", + "0x37236b308bbac2db36151eafee51e31c9aa61708bf018f2c" + ], + "-41211735914777533413909190634215671520705863955096157" + ] + ], + [ + [ + false, + [ + "0xaa03e0bf28e8bfb40ff8ec6e4c78983dd9fdb1af9837b5ad", + "0x2930f954cd3b788c428e87c0b5997f240031225224234844" + ], + "11918635024901288990883208339238295071056052744838973" + ], + [ + true, + [ + "0xc44e098c8cd76e73fd08f8937e05433699246fd5f1c83033", + "0x585b370abe95bc254978f4527d754ae97f6f68fbc5e3bea4" + ], + "41051515297019793287511706885186809903110478197652068" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xcb2f68d7b3d52135ac064a85b4bf46693751bb6ad1267182" + }, + { + "type": "hexstring", + "value": "0x8e0676044cea40e320e8cd6080972b3fed28a993f7e7f87a" + } + ] + }, + { + "type": "number", + "value": "-9865452280504764652800544928124101089015979194227003" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xeb450aa7b99f2a6247748da24463ca8272c16d2ce45ac45e" + }, + { + "type": "hexstring", + "value": "0xdfdb0b1be1721941b3092ecb899b4ca28ce8bc4e7c05c499" + } + ] + }, + { + "type": "number", + "value": "-29855009726676176929625385345253613021382390800198272" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x74ec5f34feae9eb7cb1c86a4205f25640e4b886b4d83bb89" + }, + { + "type": "hexstring", + "value": "0x513a7a86137a3d7ee166d6b15dda0c7a2420c76dc139edc9" + } + ] + }, + { + "type": "number", + "value": "34650508649841102270779040959112881453213828873364610" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x723ffd54b6e377392464d19111974fb15a0dec1d507a2786" + }, + { + "type": "hexstring", + "value": "0xa24107d19367ee5697e6d082a3af48aa4c74f0e0163abebe" + } + ] + }, + { + "type": "number", + "value": "12236012848273680385843419046900326468378622299055529" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x85ae906a078f5a48f9863b49ec4fd48db7e1c3add776bf8e" + }, + { + "type": "hexstring", + "value": "0x37236b308bbac2db36151eafee51e31c9aa61708bf018f2c" + } + ] + }, + { + "type": "number", + "value": "-41211735914777533413909190634215671520705863955096157" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xaa03e0bf28e8bfb40ff8ec6e4c78983dd9fdb1af9837b5ad" + }, + { + "type": "hexstring", + "value": "0x2930f954cd3b788c428e87c0b5997f240031225224234844" + } + ] + }, + { + "type": "number", + "value": "11918635024901288990883208339238295071056052744838973" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc44e098c8cd76e73fd08f8937e05433699246fd5f1c83033" + }, + { + "type": "hexstring", + "value": "0x585b370abe95bc254978f4527d754ae97f6f68fbc5e3bea4" + } + ] + }, + { + "type": "number", + "value": "41051515297019793287511706885186809903110478197652068" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610733806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061062c565b60405180910390f35b6100566105be565b61005e6105be565b604080516001808252818301909252600091816020015b61007d6105e5565b81526020019060019003908161007557905050905061009a6105e5565b600181526100a661060e565b7fcb2f68d7b3d52135ac064a85b4bf46693751bb6ad1267182000000000000000081527f8e0676044cea40e320e8cd6080972b3fed28a993f7e7f87a0000000000000000602080830191909152820152751a5e37642d6482aae99dc8c5de412f95185d3b28993a196040820152815181908390600090610128576101286106e7565b602090810291909101015250815260408051600280825260608201909252600091816020015b6101566105e5565b81526020019060019003908161014e5790505090506101736105e5565b6001815261017f61060e565b7feb450aa7b99f2a6247748da24463ca8272c16d2ce45ac45e000000000000000081527fdfdb0b1be1721941b3092ecb899b4ca28ce8bc4e7c05c4990000000000000000602080830191909152820152754fcba069095ebac1f89d2564e282e8326cefc7ac2a7f196040820152815181908390600090610201576102016106e7565b6020026020010181905250506102156105e5565b6000815261022161060e565b7f74ec5f34feae9eb7cb1c86a4205f25640e4b886b4d83bb89000000000000000081527f513a7a86137a3d7ee166d6b15dda0c7a2420c76dc139edc90000000000000000602080830191909152820152755c9cd711e41d8fb21c468931daa50adbad57116ea482604082015281518190839060019081106102a4576102a46106e7565b6020908102919091018101919091528301919091525060408051600280825260608201909252600091816020015b6102da6105e5565b8152602001906001900390816102d25790505090506102f76105e5565b6000815261030361060e565b7f723ffd54b6e377392464d19111974fb15a0dec1d507a2786000000000000000081527fa24107d19367ee5697e6d082a3af48aa4c74f0e0163abebe00000000000000006020808301919091528201527520b43840709898ff8c74311adaf5550e2c17545da5a96040820152815181908390600090610384576103846106e7565b6020026020010181905250506103986105e5565b600081526103a461060e565b7f85ae906a078f5a48f9863b49ec4fd48db7e1c3add776bf8e000000000000000081527f37236b308bbac2db36151eafee51e31c9aa61708bf018f2c0000000000000000602080830191909152820152756e2636c7fc366b4d518805ec0402ffbb35b756fda25c1960408201528151819083906001908110610428576104286106e7565b6020908102919091010152506040808301919091528051600280825260608201909252600091816020015b61045b6105e5565b8152602001906001900390816104535790505090506104786105e5565b6000815261048461060e565b7faa03e0bf28e8bfb40ff8ec6e4c78983dd9fdb1af9837b5ad000000000000000081527f2930f954cd3b788c428e87c0b5997f2400312252242348440000000000000000602080830191909152820152751fdb0f9ea1ba4c4b4978f90f1cf1e1d96a64cefb5f3d6040820152815181908390600090610505576105056106e7565b6020026020010181905250506105196105e5565b6001815261052561060e565b7fc44e098c8cd76e73fd08f8937e05433699246fd5f1c83033000000000000000081527f585b370abe95bc254978f4527d754ae97f6f68fbc5e3bea40000000000000000602080830191909152820152756db8962b0165b7b7d6cf28a4ac45f39bb602ce2b7a64604082015281518190839060019081106105a8576105a86106e7565b6020908102919091010152506060820152919050565b60405180608001604052806004905b60608152602001906001900390816105cd5790505090565b604051806060016040528060001515815260200161060161060e565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b602080825260009060a0830183820185845b60048110156106db57868403601f1901835281518051808652908601908686019060005b818110156106c5578351805115158452898101518a850160005b60028110156106a457825167ffffffffffffffff19168252918c0191908c019060010161067c565b5050506040015160150b606084015292880192608090920191600101610662565b509095505050918401919084019060010161063e565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220b789469bd57ac708e690b81cef2181f34a85ba1821235f64fc209071fafe719a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_aac2623d {\n bool s_0;\n bytes24[2] s_1;\n int176 s_2;\n }\n\n function test () public pure returns (S_aac2623d[][4] memory) {\n S_aac2623d[][4] memory r;\n {\n S_aac2623d[] memory r_0 = new S_aac2623d[](1);\n {\n S_aac2623d memory r_0_0;\n {\n bool r_0_0_0 = true;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bytes24[2] memory r_0_0_1;\n {\n bytes24 r_0_0_1_0 = bytes24(0xcb2f68d7b3d52135ac064a85b4bf46693751bb6ad1267182);\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n bytes24 r_0_0_1_1 = bytes24(0x8e0676044cea40e320e8cd6080972b3fed28a993f7e7f87a);\n r_0_0_1[1] = r_0_0_1_1;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n int176 r_0_0_2 = -9865452280504764652800544928124101089015979194227003;\n r_0_0.s_2 = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_aac2623d[] memory r_1 = new S_aac2623d[](2);\n {\n S_aac2623d memory r_1_0;\n {\n bool r_1_0_0 = true;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes24[2] memory r_1_0_1;\n {\n bytes24 r_1_0_1_0 = bytes24(0xeb450aa7b99f2a6247748da24463ca8272c16d2ce45ac45e);\n r_1_0_1[0] = r_1_0_1_0;\n }\n {\n bytes24 r_1_0_1_1 = bytes24(0xdfdb0b1be1721941b3092ecb899b4ca28ce8bc4e7c05c499);\n r_1_0_1[1] = r_1_0_1_1;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n {\n int176 r_1_0_2 = -29855009726676176929625385345253613021382390800198272;\n r_1_0.s_2 = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n {\n S_aac2623d memory r_1_1;\n {\n bool r_1_1_0 = false;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bytes24[2] memory r_1_1_1;\n {\n bytes24 r_1_1_1_0 = bytes24(0x74ec5f34feae9eb7cb1c86a4205f25640e4b886b4d83bb89);\n r_1_1_1[0] = r_1_1_1_0;\n }\n {\n bytes24 r_1_1_1_1 = bytes24(0x513a7a86137a3d7ee166d6b15dda0c7a2420c76dc139edc9);\n r_1_1_1[1] = r_1_1_1_1;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n int176 r_1_1_2 = 34650508649841102270779040959112881453213828873364610;\n r_1_1.s_2 = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_aac2623d[] memory r_2 = new S_aac2623d[](2);\n {\n S_aac2623d memory r_2_0;\n {\n bool r_2_0_0 = false;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bytes24[2] memory r_2_0_1;\n {\n bytes24 r_2_0_1_0 = bytes24(0x723ffd54b6e377392464d19111974fb15a0dec1d507a2786);\n r_2_0_1[0] = r_2_0_1_0;\n }\n {\n bytes24 r_2_0_1_1 = bytes24(0xa24107d19367ee5697e6d082a3af48aa4c74f0e0163abebe);\n r_2_0_1[1] = r_2_0_1_1;\n }\n r_2_0.s_1 = r_2_0_1;\n }\n {\n int176 r_2_0_2 = 12236012848273680385843419046900326468378622299055529;\n r_2_0.s_2 = r_2_0_2;\n }\n r_2[0] = r_2_0;\n }\n {\n S_aac2623d memory r_2_1;\n {\n bool r_2_1_0 = false;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n bytes24[2] memory r_2_1_1;\n {\n bytes24 r_2_1_1_0 = bytes24(0x85ae906a078f5a48f9863b49ec4fd48db7e1c3add776bf8e);\n r_2_1_1[0] = r_2_1_1_0;\n }\n {\n bytes24 r_2_1_1_1 = bytes24(0x37236b308bbac2db36151eafee51e31c9aa61708bf018f2c);\n r_2_1_1[1] = r_2_1_1_1;\n }\n r_2_1.s_1 = r_2_1_1;\n }\n {\n int176 r_2_1_2 = -41211735914777533413909190634215671520705863955096157;\n r_2_1.s_2 = r_2_1_2;\n }\n r_2[1] = r_2_1;\n }\n r[2] = r_2;\n }\n {\n S_aac2623d[] memory r_3 = new S_aac2623d[](2);\n {\n S_aac2623d memory r_3_0;\n {\n bool r_3_0_0 = false;\n r_3_0.s_0 = r_3_0_0;\n }\n {\n bytes24[2] memory r_3_0_1;\n {\n bytes24 r_3_0_1_0 = bytes24(0xaa03e0bf28e8bfb40ff8ec6e4c78983dd9fdb1af9837b5ad);\n r_3_0_1[0] = r_3_0_1_0;\n }\n {\n bytes24 r_3_0_1_1 = bytes24(0x2930f954cd3b788c428e87c0b5997f240031225224234844);\n r_3_0_1[1] = r_3_0_1_1;\n }\n r_3_0.s_1 = r_3_0_1;\n }\n {\n int176 r_3_0_2 = 11918635024901288990883208339238295071056052744838973;\n r_3_0.s_2 = r_3_0_2;\n }\n r_3[0] = r_3_0;\n }\n {\n S_aac2623d memory r_3_1;\n {\n bool r_3_1_0 = true;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bytes24[2] memory r_3_1_1;\n {\n bytes24 r_3_1_1_0 = bytes24(0xc44e098c8cd76e73fd08f8937e05433699246fd5f1c83033);\n r_3_1_1[0] = r_3_1_1_0;\n }\n {\n bytes24 r_3_1_1_1 = bytes24(0x585b370abe95bc254978f4527d754ae97f6f68fbc5e3bea4);\n r_3_1_1[1] = r_3_1_1_1;\n }\n r_3_1.s_1 = r_3_1_1;\n }\n {\n int176 r_3_1_2 = 41051515297019793287511706885186809903110478197652068;\n r_3_1.s_2 = r_3_1_2;\n }\n r_3[1] = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001cb2f68d7b3d52135ac064a85b4bf46693751bb6ad126718200000000000000008e0676044cea40e320e8cd6080972b3fed28a993f7e7f87a0000000000000000ffffffffffffffffffffe5a1c89bd29b7d551662373a21bed06ae7a2c4d766c500000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001eb450aa7b99f2a6247748da24463ca8272c16d2ce45ac45e0000000000000000dfdb0b1be1721941b3092ecb899b4ca28ce8bc4e7c05c4990000000000000000ffffffffffffffffffffb0345f96f6a1453e0762da9b1d7d17cd93103853d580000000000000000000000000000000000000000000000000000000000000000074ec5f34feae9eb7cb1c86a4205f25640e4b886b4d83bb890000000000000000513a7a86137a3d7ee166d6b15dda0c7a2420c76dc139edc90000000000000000000000000000000000005c9cd711e41d8fb21c468931daa50adbad57116ea48200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000723ffd54b6e377392464d19111974fb15a0dec1d507a27860000000000000000a24107d19367ee5697e6d082a3af48aa4c74f0e0163abebe00000000000000000000000000000000000020b43840709898ff8c74311adaf5550e2c17545da5a9000000000000000000000000000000000000000000000000000000000000000085ae906a078f5a48f9863b49ec4fd48db7e1c3add776bf8e000000000000000037236b308bbac2db36151eafee51e31c9aa61708bf018f2c0000000000000000ffffffffffffffffffff91d9c93803c994b2ae77fa13fbfd0044ca48a9025da300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000aa03e0bf28e8bfb40ff8ec6e4c78983dd9fdb1af9837b5ad00000000000000002930f954cd3b788c428e87c0b5997f2400312252242348440000000000000000000000000000000000001fdb0f9ea1ba4c4b4978f90f1cf1e1d96a64cefb5f3d0000000000000000000000000000000000000000000000000000000000000001c44e098c8cd76e73fd08f8937e05433699246fd5f1c830330000000000000000585b370abe95bc254978f4527d754ae97f6f68fbc5e3bea40000000000000000000000000000000000006db8962b0165b7b7d6cf28a4ac45f39bb602ce2b7a64" + }, + { + "name": "random-(bool,bytes4,(string,string,string),bool)", + "type": "(bool,bytes4,(string,string,string),bool)", + "value": [ + true, + "0xc3ab529b", + [ + "Moo é🚀 oéo é M🚀oMoMM 🚀🚀🚀🚀", + "Moo é🚀 🚀M🚀é🚀🚀🚀oéMoé M o🚀MM MoMoMéM🚀o Mo🚀", + "Moo é🚀 MMMé é🚀 éMé🚀🚀oMo🚀o🚀é🚀 é" + ], + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xc3ab529b" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oéo é M🚀oMoMM 🚀🚀🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀 🚀M🚀é🚀🚀🚀oéMoé M o🚀MM MoMoMéM🚀o Mo🚀" + }, + { + "type": "string", + "value": "Moo é🚀 MMMé é🚀 éMé🚀🚀oMo🚀o🚀é🚀 é" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610336806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ae565b60405180910390f35b61005661010b565b61005e61010b565b6001815263c3ab529b60e01b60208083019190915260408051606080820183528082529281018390529081019190915260006040518060600160405280602e81526020016102d3602e91398252506040805160808101909152604a8082526000919061024f602083013990508082602001819052505060006040518060600160405280603a8152602001610299603a91396040808401919091528301919091525060016060820152919050565b604051806080016040528060001515815260200160006001600160e01b031916815260200161015460405180606001604052806060815260200160608152602001606081525090565b8152600060209091015290565b6000815180845260005b818110156101875760208185018101518683018201520161016b565b81811115610199576000602083870101525b50601f01601f19169290920160200192915050565b6020815281511515602082015263ffffffff60e01b602083015116604082015260006040830151608060608401528051606060a08501526101f3610100850182610161565b90506020820151609f19808684030160c08701526102118383610161565b925060408401519350808684030160e087015250506102308183610161565b9150506060840151610246608085018215159052565b50939250505056fe4d6f6f20c3a9f09f9a802020f09f9a804df09f9a80c3a9f09f9a80f09f9a80f09f9a806fc3a94d6fc3a9204d206ff09f9a804d4d204d6f4d6f4dc3a94df09f9a806f20204d6ff09f9a804d6f6f20c3a9f09f9a80204d4d4dc3a920c3a9f09f9a8020c3a94dc3a9f09f9a80f09f9a806f4d6ff09f9a806ff09f9a80c3a9f09f9a8020c3a94d6f6f20c3a9f09f9a80206fc3a96f20c3a9204df09f9a806f4d6f4d4d20f09f9a80f09f9a80f09f9a80f09f9a80a2646970667358221220860eb130b7eb60d1fd1ff9ac05067183e284b04288354a43482d3a08237a303264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_061dfc07 {\n string s_0;\n string s_1;\n string s_2;\n }\n\n struct S_e4688901 {\n bool s_0;\n bytes4 s_1;\n S_061dfc07 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_e4688901 memory) {\n S_e4688901 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes4 r_1 = bytes4(0xc3ab529b);\n r.s_1 = r_1;\n }\n {\n S_061dfc07 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 oéo é M🚀oMoMM 🚀🚀🚀🚀\";\n r_2.s_0 = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀 🚀M🚀é🚀🚀🚀oéMoé M o🚀MM MoMoMéM🚀o Mo🚀\";\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀 MMMé é🚀 éMé🚀🚀oMo🚀o🚀é🚀 é\";\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001c3ab529b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80206fc3a96f20c3a9204df09f9a806f4d6f4d4d20f09f9a80f09f9a80f09f9a80f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a802020f09f9a804df09f9a80c3a9f09f9a80f09f9a80f09f9a806fc3a94d6fc3a9204d206ff09f9a804d4d204d6f4d6f4dc3a94df09f9a806f20204d6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a80204d4d4dc3a920c3a9f09f9a8020c3a94dc3a9f09f9a80f09f9a806f4d6ff09f9a806ff09f9a80c3a9f09f9a8020c3a9000000000000" + }, + { + "name": "random-(bool,bytes9,address,int56[],bytes28)", + "type": "(bool,bytes9,address,int56[],bytes28)", + "value": [ + true, + "0x5601d6740342a415a2", + "0x7474570F2060D68822F7021137403103a8DF9317", + ["1742993338197715", "-2092308588082830", "-22483177894051763", "35628518805901438"], + "0xe7d47de91c484eabde89fed6cc08c24c7325be97a6e3c6dbe8eb3845" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x5601d6740342a415a2" + }, + { + "type": "address", + "value": "0x7474570F2060D68822F7021137403103a8DF9317" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1742993338197715" + }, + { + "type": "number", + "value": "-2092308588082830" + }, + { + "type": "number", + "value": "-22483177894051763" + }, + { + "type": "number", + "value": "35628518805901438" + } + ] + }, + { + "type": "hexstring", + "value": "0xe7d47de91c484eabde89fed6cc08c24c7325be97a6e3c6dbe8eb3845" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102d0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e7565b60405180910390f35b6040805160a080820183526000808352602080840182905283850182905260608085018190526080808601849052865180860188528083019290925281810184905260018252682b00eb3a01a1520ad160b91b82840152737474570f2060d68822f7021137403103a8df93178288015286516004808252958101909752949590949293909290918301908036833701905050905060006606313e42c4e6d39050808260008151811061010257610102610284565b602002602001019060060b908160060b8152505050600066076ef18e27368d199050808260018151811061013857610138610284565b602002602001019060060b908160060b81525050506000664fe054c7cbffb2199050808260028151811061016e5761016e610284565b602002602001019060060b908160060b81525050506000667e93f2f74c907e905080826003815181106101a3576101a3610284565b60069290920b602092830291909101909101525060608201527fe7d47de91c484eabde89fed6cc08c24c7325be97a6e3c6dbe8eb3845000000006080820152919050565b60208082528251151582820152828101516001600160b81b0319166040808401919091528301516001600160a01b031660608084019190915283015160a06080840152805160c0840181905260009291820190839060e08601905b8083101561026557835160060b8252928401926001929092019190840190610242565b50608087015163ffffffff19811660a088015293509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220a33f39142cd7d7e3dcf31f1aac2d6babc00a2a8f328d764c8d4575b6f2f1658c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0e514402 {\n bool s_0;\n bytes9 s_1;\n address s_2;\n int56[] s_3;\n bytes28 s_4;\n }\n\n function test () public pure returns (S_0e514402 memory) {\n S_0e514402 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes9 r_1 = bytes9(0x5601d6740342a415a2);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x7474570F2060D68822F7021137403103a8DF9317;\n r.s_2 = r_2;\n }\n {\n int56[] memory r_3 = new int56[](4);\n {\n int56 r_3_0 = 1742993338197715;\n r_3[0] = r_3_0;\n }\n {\n int56 r_3_1 = -2092308588082830;\n r_3[1] = r_3_1;\n }\n {\n int56 r_3_2 = -22483177894051763;\n r_3[2] = r_3_2;\n }\n {\n int56 r_3_3 = 35628518805901438;\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n {\n bytes28 r_4 = bytes28(0xe7d47de91c484eabde89fed6cc08c24c7325be97a6e3c6dbe8eb3845);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000015601d6740342a415a200000000000000000000000000000000000000000000000000000000000000000000007474570f2060d68822f7021137403103a8df931700000000000000000000000000000000000000000000000000000000000000a0e7d47de91c484eabde89fed6cc08c24c7325be97a6e3c6dbe8eb38450000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000006313e42c4e6d3fffffffffffffffffffffffffffffffffffffffffffffffffff8910e71d8c972ffffffffffffffffffffffffffffffffffffffffffffffffffb01fab3834004d000000000000000000000000000000000000000000000000007e93f2f74c907e" + }, + { + "name": "random-(bool,int80,(bytes26,address),bool,string)", + "type": "(bool,int80,(bytes26,address),bool,string)", + "value": [ + false, + "-415239039735077208175627", + [ + "0x06e91a53c790c5434389e5ad32a82f171e44106c98c7b885c1bf", + "0x6729797956cB7856408Cf6AA29FA2FCDe64432dC" + ], + false, + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-415239039735077208175627" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x06e91a53c790c5434389e5ad32a82f171e44106c98c7b885c1bf" + }, + { + "type": "address", + "value": "0x6729797956cB7856408Cf6AA29FA2FCDe64432dC" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061024a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610168565b60405180910390f35b6100926040805160a0810182526000808252602080830182905283518085018552828152908101919091529091820190815260006020820152606060409091015290565b6100d66040805160a0810182526000808252602080830182905283518085018552828152908101919091529091820190815260006020820152606060409091015290565b60008082526957ee27487054c5d9b40a196020808401919091526040805180820182527f06e91a53c790c5434389e5ad32a82f171e44106c98c7b885c1bf0000000000008152736729797956cb7856408cf6aa29fa2fcde64432dc818401528185015260608401929092528151808301909252600a8252689adede418753e13f3560b71b908201526080820152919050565b6000602080835283511515818401528084015160090b6040840152604084015165ffffffffffff19815116606085015260018060a01b0382820151166080850152506060840151151560a0840152608084015160c08085015280518060e086015260005b818110156101e957828101840151868201610100015283016101cc565b818111156101fc57600061010083880101525b50601f01601f1916939093016101000194935050505056fea26469706673582212205d949e720c21b1bad8afcdba87062b7f0af8683f3ba465c23e6c8fd90b40ecc064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ec804f62 {\n bytes26 s_0;\n address s_1;\n }\n\n struct S_73bf646a {\n bool s_0;\n int80 s_1;\n S_ec804f62 s_2;\n bool s_3;\n string s_4;\n }\n\n function test () public pure returns (S_73bf646a memory) {\n S_73bf646a memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n int80 r_1 = -415239039735077208175627;\n r.s_1 = r_1;\n }\n {\n S_ec804f62 memory r_2;\n {\n bytes26 r_2_0 = bytes26(0x06e91a53c790c5434389e5ad32a82f171e44106c98c7b885c1bf);\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x6729797956cB7856408Cf6AA29FA2FCDe64432dC;\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffa811d8b78fab3a264bf506e91a53c790c5434389e5ad32a82f171e44106c98c7b885c1bf0000000000000000000000000000000000006729797956cb7856408cf6aa29fa2fcde64432dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string,address[4],bytes24,uint176)", + "type": "(bool,string,address[4],bytes24,uint176)", + "value": [ + false, + "Moo é🚀🚀MMoéé🚀MoooéMo🚀o oéoo oooo ooooMéo 🚀🚀o🚀 oM🚀🚀MM🚀éMMMMo", + [ + "0x44Bd425198544D2112F48d2323538e5b939Edaaf", + "0x2Be2c20ed3f4D548a584FAAC30705f3874085b30", + "0xfEE2684608669BAe92aA3FE1B283bBE919a40164", + "0xD1d565fd5caDCF154ef5637E8f08AF8fe1E2a7FF" + ], + "0xa24a151575d9d6b999b2885f28d9b32c9fe220cda517b5c1", + "8844453503664198782346908698199641115809402992742304" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀MMoéé🚀MoooéMo🚀o oéoo oooo ooooMéo 🚀🚀o🚀 oM🚀🚀MM🚀éMMMMo" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x44Bd425198544D2112F48d2323538e5b939Edaaf" + }, + { + "type": "address", + "value": "0x2Be2c20ed3f4D548a584FAAC30705f3874085b30" + }, + { + "type": "address", + "value": "0xfEE2684608669BAe92aA3FE1B283bBE919a40164" + }, + { + "type": "address", + "value": "0xD1d565fd5caDCF154ef5637E8f08AF8fe1E2a7FF" + } + ] + }, + { + "type": "hexstring", + "value": "0xa24a151575d9d6b999b2885f28d9b32c9fe220cda517b5c1" + }, + { + "type": "number", + "value": "8844453503664198782346908698199641115809402992742304" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610310806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c7565b60405180910390f35b610056610143565b61005e610143565b60008082526040805160a08101909152606180825261027a6020830139602083015250610089610177565b7344bd425198544d2112f48d2323538e5b939edaaf8152732be2c20ed3f4d548a584faac30705f3874085b30602082015273fee2684608669bae92aa3fe1b283bbe919a4016460408083019190915273d1d565fd5cadcf154ef5637e8f08af8fe1e2a7ff606080840191909152908301919091527fa24a151575d9d6b999b2885f28d9b32c9fe220cda517b5c10000000000000000908201527517a39ee39969224d4cafe462a955cd5fba2660cc4fa06080820152919050565b6040805160a0810182526000815260606020820152908101610163610177565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156101c15781516001600160a01b0316845260209384019390910190600101610199565b50505050565b6000602080835283511515818401528084015161010080604086015281518061012087015260005b8181101561020c57838101850151878201610140015284016101ef565b8181111561021f57600061014083890101525b50604087015193506102346060870185610195565b606087015167ffffffffffffffff19811660e0880152935060808701516001600160b01b038116878401529350601f01601f191694909401610140019594505050505056fe4d6f6f20c3a9f09f9a80f09f9a804d4d6fc3a9c3a9f09f9a804d6f6f6fc3a94d6ff09f9a806f206fc3a96f6f206f6f6f6f206f6f6f6f4dc3a96f20f09f9a80f09f9a806ff09f9a8020206f4df09f9a80f09f9a804d4df09f9a80c3a94d4d4d4d6fa2646970667358221220a13e0441609a087b4aa17a8eadf27bf4a0388d6a36d3c352f96c194a1700186664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2662b487 {\n bool s_0;\n string s_1;\n address[4] s_2;\n bytes24 s_3;\n uint176 s_4;\n }\n\n function test () public pure returns (S_2662b487 memory) {\n S_2662b487 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀MMoéé🚀MoooéMo🚀o oéoo oooo ooooMéo 🚀🚀o🚀 oM🚀🚀MM🚀éMMMMo\";\n r.s_1 = r_1;\n }\n {\n address[4] memory r_2;\n {\n address r_2_0 = 0x44Bd425198544D2112F48d2323538e5b939Edaaf;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x2Be2c20ed3f4D548a584FAAC30705f3874085b30;\n r_2[1] = r_2_1;\n }\n {\n address r_2_2 = 0xfEE2684608669BAe92aA3FE1B283bBE919a40164;\n r_2[2] = r_2_2;\n }\n {\n address r_2_3 = 0xD1d565fd5caDCF154ef5637E8f08AF8fe1E2a7FF;\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n bytes24 r_3 = bytes24(0xa24a151575d9d6b999b2885f28d9b32c9fe220cda517b5c1);\n r.s_3 = r_3;\n }\n {\n uint176 r_4 = 8844453503664198782346908698199641115809402992742304;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000044bd425198544d2112f48d2323538e5b939edaaf0000000000000000000000002be2c20ed3f4d548a584faac30705f3874085b30000000000000000000000000fee2684608669bae92aa3fe1b283bbe919a40164000000000000000000000000d1d565fd5cadcf154ef5637e8f08af8fe1e2a7ffa24a151575d9d6b999b2885f28d9b32c9fe220cda517b5c100000000000000000000000000000000000017a39ee39969224d4cafe462a955cd5fba2660cc4fa000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a80f09f9a804d4d6fc3a9c3a9f09f9a804d6f6f6fc3a94d6ff09f9a806f206fc3a96f6f206f6f6f6f206f6f6f6f4dc3a96f20f09f9a80f09f9a806ff09f9a8020206f4df09f9a80f09f9a804d4df09f9a80c3a94d4d4d4d6f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string[2],bytes19,int200,bytes29)", + "type": "(bool,string[2],bytes19,int200,bytes29)", + "value": [ + false, + [ + "Moo é🚀o é🚀oMo oé MoooMéooMéooMM🚀🚀é🚀🚀 M🚀🚀 MoM🚀🚀éo", + "Moo é🚀oMooé🚀ooooo Mo🚀Mo" + ], + "0x333016949051dfe7f5a9e53c02069c3e22c656", + "-132596317850777545747191866718901378758592590205884799857089", + "0x4d1720ee613ab3812195e3ea4d0d58469a2ba8d74b3f6a5f57f6e46284" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o é🚀oMo oé MoooMéooMéooMM🚀🚀é🚀🚀 M🚀🚀 MoM🚀🚀éo" + }, + { + "type": "string", + "value": "Moo é🚀oMooé🚀ooooo Mo🚀Mo" + } + ] + }, + { + "type": "hexstring", + "value": "0x333016949051dfe7f5a9e53c02069c3e22c656" + }, + { + "type": "number", + "value": "-132596317850777545747191866718901378758592590205884799857089" + }, + { + "type": "hexstring", + "value": "0x4d1720ee613ab3812195e3ea4d0d58469a2ba8d74b3f6a5f57f6e46284" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061030a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610179565b60405180910390f35b61005661011b565b61005e61011b565b6000815261006a610152565b600060405180608001604052806055815260200161028060559139825250604080516060810190915260258082526000919061025b6020830139602080840191909152830191909152507219980b4a4828eff3fad4f29e01034e1f11632b60691b604082015278151fb2270a2b7ceaa017a2dfa0cc019fc7916620f412d731c01960608201527f4d1720ee613ab3812195e3ea4d0d58469a2ba8d74b3f6a5f57f6e462840000006080820152919050565b6040518060a00160405280600015158152602001610137610152565b81526000602082018190526040820181905260609091015290565b60405180604001604052806002905b60608152602001906001900390816101615790505090565b602080825282511515828201528281015160a060408401526000919061010084019060c0850184805b60028110156102085787850360bf1901835283518051808752835b818110156101d8578281018901518882018a015288016101bd565b818111156101e8578489838a0101525b50601f01601f1916959095018601945092850192918501916001016101a2565b5050505060408501516cffffffffffffffffffffffffff198116606086015291506060850151915061023f608085018360180b9052565b608085015162ffffff19811660a0860152915094935050505056fe4d6f6f20c3a9f09f9a806f4d6f6fc3a9f09f9a806f6f6f6f6f202020204d6ff09f9a804d6f4d6f6f20c3a9f09f9a806f20c3a9f09f9a806f4d6f206fc3a9204d6f6f6f4dc3a96f6f4dc3a96f6f4d4df09f9a80f09f9a80c3a9f09f9a80f09f9a80204df09f9a80f09f9a80204d6f4df09f9a80f09f9a80c3a96fa2646970667358221220ad6b9e91eebd089fdf364af6323b788a56a72c33557b9fd7996a190c4970c9ea64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c53c1960 {\n bool s_0;\n string[2] s_1;\n bytes19 s_2;\n int200 s_3;\n bytes29 s_4;\n }\n\n function test () public pure returns (S_c53c1960 memory) {\n S_c53c1960 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n string[2] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀o é🚀oMo oé MoooMéooMéooMM🚀🚀é🚀🚀 M🚀🚀 MoM🚀🚀éo\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀oMooé🚀ooooo Mo🚀Mo\";\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n bytes19 r_2 = bytes19(0x333016949051dfe7f5a9e53c02069c3e22c656);\n r.s_2 = r_2;\n }\n {\n int200 r_3 = -132596317850777545747191866718901378758592590205884799857089;\n r.s_3 = r_3;\n }\n {\n bytes29 r_4 = bytes29(0x4d1720ee613ab3812195e3ea4d0d58469a2ba8d74b3f6a5f57f6e46284);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0333016949051dfe7f5a9e53c02069c3e22c65600000000000000000000000000ffffffffffffffeae04dd8f5d483155fe85d205f33fe60386e99df0bed28ce3f4d1720ee613ab3812195e3ea4d0d58469a2ba8d74b3f6a5f57f6e46284000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806f20c3a9f09f9a806f4d6f206fc3a9204d6f6f6f4dc3a96f6f4dc3a96f6f4d4df09f9a80f09f9a80c3a9f09f9a80f09f9a80204df09f9a80f09f9a80204d6f4df09f9a80f09f9a80c3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806f4d6f6fc3a9f09f9a806f6f6f6f6f202020204d6ff09f9a804d6f000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string[4],bool,string,bool)", + "type": "(bool,string[4],bool,string,bool)", + "value": [ + true, + [ + "Moo é🚀 🚀M🚀🚀oMéooMoM oMoMo🚀Mo MMo🚀oo oééoooéé éo🚀 oé🚀🚀 oM o🚀éoo", + "Moo é🚀MoM🚀é🚀ooo 🚀é é🚀ooéoéMM🚀oo🚀oé ooé🚀🚀 🚀o M", + "Moo é🚀 oMé🚀", + "Moo é🚀" + ], + false, + "Moo é🚀 ééMéMéoMéo", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀M🚀🚀oMéooMoM oMoMo🚀Mo MMo🚀oo oééoooéé éo🚀 oé🚀🚀 oM o🚀éoo" + }, + { + "type": "string", + "value": "Moo é🚀MoM🚀é🚀ooo 🚀é é🚀ooéoéMM🚀oo🚀oé ooé🚀🚀 🚀o M" + }, + { + "type": "string", + "value": "Moo é🚀 oMé🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 ééMéMéoMéo" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061038f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101fd565b60405180910390f35b610056610152565b61005e610152565b6001815261006a610189565b60006040518060a00160405280606581526020016102f56065913982525060408051608081019091526053808252600091906102a2602083013960208381019190915260408051808201825260138152719adede418753e13f350040de9b8753e13f35606f1b818401528185015280518082018252600a8152689adede418753e13f3560b71b818401526060808601919091528583019490945260008582018190528151808301909252601a82527f4d6f6f20c3a9f09f9a8020c3a9c3a94dc3a94dc3a96f4dc3a96f0000000000009282019290925292840192909252506080820152919050565b6040518060a0016040528060001515815260200161016e610189565b81526000602082018190526060604083018190529091015290565b60405180608001604052806004905b60608152602001906001900390816101985790505090565b6000815180845260005b818110156101d6576020818501810151868301820152016101ba565b818111156101e8576000602083870101525b50601f01601f19169290920160200192915050565b602080825282511515828201528281015160a060408401526000919061014084019060c08501845b60048110156102545760bf198785030182526102428484516101b0565b93509184019190840190600101610225565b5050506040850151801515606086015291506060850151848203601f19016080860152915061028381836101b0565b915050608084015161029960a085018215159052565b50939250505056fe4d6f6f20c3a9f09f9a804d6f4df09f9a80c3a9f09f9a806f6f6f20f09f9a80c3a920c3a9f09f9a806f6fc3a96fc3a94d4df09f9a806f6ff09f9a806fc3a9206f6fc3a9f09f9a80f09f9a8020f09f9a806f204d4d6f6f20c3a9f09f9a8020f09f9a804df09f9a80f09f9a806f4dc3a96f6f4d6f4d206f4d6f4d6ff09f9a804d6f204d4d6ff09f9a806f6f206fc3a9c3a96f6f6fc3a9c3a920c3a96ff09f9a80206fc3a9f09f9a80f09f9a80206f4d206ff09f9a80c3a96f6fa26469706673582212200f14df95a5aa5e46f9e7b6acd2ed4dd9dee899ba0df3287d865cbcf3b83ed96a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9515431b {\n bool s_0;\n string[4] s_1;\n bool s_2;\n string s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_9515431b memory) {\n S_9515431b memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n string[4] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀 🚀M🚀🚀oMéooMoM oMoMo🚀Mo MMo🚀oo oééoooéé éo🚀 oé🚀🚀 oM o🚀éoo\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀MoM🚀é🚀ooo 🚀é é🚀ooéoéMM🚀oo🚀oé ooé🚀🚀 🚀o M\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀 oMé🚀\";\n r_1[2] = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀\";\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀 ééMéMéoMéo\";\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a8020f09f9a804df09f9a80f09f9a806f4dc3a96f6f4d6f4d206f4d6f4d6ff09f9a804d6f204d4d6ff09f9a806f6f206fc3a9c3a96f6f6fc3a9c3a920c3a96ff09f9a80206fc3a9f09f9a80f09f9a80206f4d206ff09f9a80c3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a804d6f4df09f9a80c3a9f09f9a806f6f6f20f09f9a80c3a920c3a9f09f9a806f6fc3a96fc3a94d4df09f9a806f6ff09f9a806fc3a9206f6fc3a9f09f9a80f09f9a8020f09f9a806f204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80206f4dc3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a8020c3a9c3a94dc3a94dc3a96f4dc3a96f000000000000" + }, + { + "name": "random-(bool,string[4],int,string,bytes29)", + "type": "(bool,string[4],int,string,bytes29)", + "value": [ + true, + [ + "Moo é🚀o", + "Moo é🚀 é o ééé🚀éoéé oM🚀 ooooMoo éM 🚀oooooéooo", + "Moo é🚀", + "Moo é🚀ééMéoo🚀M🚀ooé🚀 ooM o éMéé MM🚀éoo o éo o oé oo" + ], + "-21273328644031080403563083679710067087022572976239358669718250663738340536767", + "Moo é🚀ooé🚀 ééoo🚀ooé 🚀oMMooo🚀🚀é 🚀 M ", + "0x5724403ac0c3c5b871aadb10e30e1220f50c624eaad5d73ff058310872" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o" + }, + { + "type": "string", + "value": "Moo é🚀 é o ééé🚀éoéé oM🚀 ooooMoo éM 🚀oooooéooo" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀ééMéoo🚀M🚀ooé🚀 ooM o éMéé MM🚀éoo o éo o oé oo" + } + ] + }, + { + "type": "number", + "value": "-21273328644031080403563083679710067087022572976239358669718250663738340536767" + }, + { + "type": "string", + "value": "Moo é🚀ooé🚀 ééoo🚀ooé 🚀oMMooo🚀🚀é 🚀 M " + }, + { + "type": "hexstring", + "value": "0x5724403ac0c3c5b871aadb10e30e1220f50c624eaad5d73ff058310872" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103ce806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610223565b60405180910390f35b610056610178565b61005e610178565b6001815261006a6101af565b604080518082018252600b81526a4d6f6f20c3a9f09f9a806f60a81b60208083019190915290835281516080810190925260468083526000929161035390830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b8184015281850152805160808101909152604d8082526000935090916102c7908301396060808401919091526020848101939093527fd0f7b9017aca5a1fc2bff3ba5fd8a505fc928fb11b39f82e232fab3a758c0e4160408086019190915280519182019052603f80825260009391925090610314908301396060830152507f5724403ac0c3c5b871aadb10e30e1220f50c624eaad5d73ff0583108720000006080820152919050565b6040518060a001604052806000151581526020016101946101af565b81526000602082018190526060604083018190529091015290565b60405180608001604052806004905b60608152602001906001900390816101be5790505090565b6000815180845260005b818110156101fc576020818501810151868301820152016101e0565b8181111561020e576000602083870101525b50601f01601f19169290920160200192915050565b602080825282511515828201528281015160a060408401526000919061014084019060c08501845b600481101561027a5760bf198785030182526102688484516101d6565b9350918401919084019060010161024b565b5050506040850151606085015260608501519150601f198482030160808501526102a481836101d6565b91505060808401516102be60a085018262ffffff19169052565b50939250505056fe4d6f6f20c3a9f09f9a80c3a9c3a94dc3a96f6ff09f9a804df09f9a806f6fc3a9f09f9a8020206f6f4d206f20c3a94dc3a9c3a9204d4df09f9a80c3a96f6f206f20c3a96f206f206fc3a9206f6f4d6f6f20c3a9f09f9a806f6fc3a9f09f9a802020c3a9c3a96f6ff09f9a806f6fc3a920f09f9a806f4d4d6f6f6ff09f9a80f09f9a80c3a920f09f9a80204d204d6f6f20c3a9f09f9a8020c3a9206f202020c3a9c3a9c3a9f09f9a80c3a96fc3a9c3a9206f4df09f9a80206f6f6f6f4d6f6f20c3a94d2020f09f9a806f6f6f6f6fc3a96f6f6fa26469706673582212201ed4a74c67c4d007891193a13a2e302648cef8cc50f08941d52148816b5e871364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9ded59ba {\n bool s_0;\n string[4] s_1;\n int256 s_2;\n string s_3;\n bytes29 s_4;\n }\n\n function test () public pure returns (S_9ded59ba memory) {\n S_9ded59ba memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n string[4] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀o\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀 é o ééé🚀éoéé oM🚀 ooooMoo éM 🚀oooooéooo\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀\";\n r_1[2] = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀ééMéoo🚀M🚀ooé🚀 ooM o éMéé MM🚀éoo o éo o oé oo\";\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n int r_2 = -21273328644031080403563083679710067087022572976239358669718250663738340536767;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀ooé🚀 ééoo🚀ooé 🚀oMMooo🚀🚀é 🚀 M \";\n r.s_3 = r_3;\n }\n {\n bytes29 r_4 = bytes29(0x5724403ac0c3c5b871aadb10e30e1220f50c624eaad5d73ff058310872);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0d0f7b9017aca5a1fc2bff3ba5fd8a505fc928fb11b39f82e232fab3a758c0e4100000000000000000000000000000000000000000000000000000000000002a05724403ac0c3c5b871aadb10e30e1220f50c624eaad5d73ff058310872000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a8020c3a9206f202020c3a9c3a9c3a9f09f9a80c3a96fc3a9c3a9206f4df09f9a80206f6f6f6f4d6f6f20c3a94d2020f09f9a806f6f6f6f6fc3a96f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80c3a9c3a94dc3a96f6ff09f9a804df09f9a806f6fc3a9f09f9a8020206f6f4d206f20c3a94dc3a9c3a9204d4df09f9a80c3a96f6f206f20c3a96f206f206fc3a9206f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a806f6fc3a9f09f9a802020c3a9c3a96f6ff09f9a806f6fc3a920f09f9a806f4d4d6f6f6ff09f9a80f09f9a80c3a920f09f9a80204d2000" + }, + { + "name": "random-(bool[1],bytes31,address,bytes31,address)", + "type": "(bool[1],bytes31,address,bytes31,address)", + "value": [ + [true], + "0x894da1f962b9060de99a657b3951c33e111ad86dbc6f8bb00807d77435ee7d", + "0xAB7899Aa467683B3314cA965c6168d1F4dB183d9", + "0x30d9b89de2f131742e3be7c9aa6544641c08f652530ee9f3429b85f179b512", + "0x148e25208FB2Cf4b676D8A42e0d901f2a6b7C4c5" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x894da1f962b9060de99a657b3951c33e111ad86dbc6f8bb00807d77435ee7d" + }, + { + "type": "address", + "value": "0xAB7899Aa467683B3314cA965c6168d1F4dB183d9" + }, + { + "type": "hexstring", + "value": "0x30d9b89de2f131742e3be7c9aa6544641c08f652530ee9f3429b85f179b512" + }, + { + "type": "address", + "value": "0x148e25208FB2Cf4b676D8A42e0d901f2a6b7C4c5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610202806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610144565b60405180910390f35b6100566100f1565b61005e6100f1565b610066610126565b6001815281527f894da1f962b9060de99a657b3951c33e111ad86dbc6f8bb00807d77435ee7d00602082015273ab7899aa467683b3314ca965c6168d1f4db183d960408201527f30d9b89de2f131742e3be7c9aa6544641c08f652530ee9f3429b85f179b51200606082015273148e25208fb2cf4b676d8a42e0d901f2a6b7c4c56080820152919050565b6040518060a00160405280610104610126565b8152600060208201819052604082018190526060820181905260809091015290565b60405180602001604052806001906020820280368337509192915050565b815160a08201908260005b6001811015610170578251151582526020928301929091019060010161014f565b50505060208381015160ff1916908301526040808401516001600160a01b031690830152606080840151906101aa9084018260ff19169052565b5060808301516101c560808401826001600160a01b03169052565b509291505056fea2646970667358221220147838b917a1a6d95c2e5d4186320e7fc518533db70a07bfd2ea1154f08af0fa64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_99cfac41 {\n bool[1] s_0;\n bytes31 s_1;\n address s_2;\n bytes31 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_99cfac41 memory) {\n S_99cfac41 memory r;\n {\n bool[1] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x894da1f962b9060de99a657b3951c33e111ad86dbc6f8bb00807d77435ee7d);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xAB7899Aa467683B3314cA965c6168d1F4dB183d9;\n r.s_2 = r_2;\n }\n {\n bytes31 r_3 = bytes31(0x30d9b89de2f131742e3be7c9aa6544641c08f652530ee9f3429b85f179b512);\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x148e25208FB2Cf4b676D8A42e0d901f2a6b7C4c5;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001894da1f962b9060de99a657b3951c33e111ad86dbc6f8bb00807d77435ee7d00000000000000000000000000ab7899aa467683b3314ca965c6168d1f4db183d930d9b89de2f131742e3be7c9aa6544641c08f652530ee9f3429b85f179b51200000000000000000000000000148e25208fb2cf4b676d8a42e0d901f2a6b7c4c5" + }, + { + "name": "random-(bytes1,string,bool,address)[1][3]", + "type": "(bytes1,string,bool,address)[1][3]", + "value": [ + [ + [ + "0xa2", + "Moo é🚀ooo ooo🚀 🚀o🚀oo🚀🚀🚀 éMéM éo éMo ", + false, + "0xE34E59Baeb093D18aceB1d48747675aAb4bEDDB1" + ] + ], + [["0x95", "Moo é🚀oéMé o ", false, "0x455eC9Dc650A303A234678027FFa533d8cbD7F90"]], + [["0x5e", "Moo é🚀 🚀o", true, "0xF3d51263108dFa096aA27A62bE659a94B6e56049"]] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa2" + }, + { + "type": "string", + "value": "Moo é🚀ooo ooo🚀 🚀o🚀oo🚀🚀🚀 éMéM éo éMo " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xE34E59Baeb093D18aceB1d48747675aAb4bEDDB1" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x95" + }, + { + "type": "string", + "value": "Moo é🚀oéMé o " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x455eC9Dc650A303A234678027FFa533d8cbD7F90" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5e" + }, + { + "type": "string", + "value": "Moo é🚀 🚀o" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xF3d51263108dFa096aA27A62bE659a94B6e56049" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610243565b60405180910390f35b6100566101d0565b61005e6101d0565b6100666101fd565b6040805160808082018352606060208084018290526000848601819052918401829052605160f91b845284519283019094526041808352929390929061033e908301396020830152506000604082015273e34e59baeb093d18aceb1d48747675aab4beddb16060820152815281526100dc6101fd565b60408051608081018252606060208083018281526000848601818152938501818152609560f81b865286518088019097526013875272026b7b79061d4f84fcd4037e1d4a6e1d490379606d1b878501529590915290915273455ec9dc650a303a234678027ffa533d8cbd7f9090925282528201526101586101fd565b60408051608081018252606060208083018281526000848601818152938501908152602f60f91b855285518087018752601081526f4d6f6f20c3a9f09f9a8020f09f9a806f60801b93810193909352919052600190915273f3d51263108dfa096aa27a62be659a94b6e5604990528252820152919050565b60405180606001604052806003905b6101e76101fd565b8152602001906001900390816101df5790505090565b60405180602001604052806001905b60408051608081018252600080825260606020808401829052938301829052820152825260001990920191018161020c5790505090565b6020808252600090608083820181850186855b600381101561033057601f198884038101855282518488810160005b600181101561031a578782038352835160ff60f81b81511683528b8101518b8d8501528051808d86015260005b818110156102bb578281018f015186820160a001528e0161029f565b818111156102cd57600060a083880101525b5060409150818301516102e38387018215159052565b506060928301516001600160a01b03811686850152929150958d0195948d0194601f0187169390930160a001925050600101610272565b5096890196955050509186019150600101610256565b509097965050505050505056fe4d6f6f20c3a9f09f9a806f6f6f20206f6f6ff09f9a8020f09f9a806ff09f9a806f6ff09f9a80f09f9a80f09f9a8020c3a94dc3a94d2020c3a96f2020c3a94d6f20a26469706673582212207d33273def74ef277a2524a6c7899ccc8dfd89a0f623a3d6e7d2067464d0891c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_95893ba8 {\n bytes1 s_0;\n string s_1;\n bool s_2;\n address s_3;\n }\n\n function test () public pure returns (S_95893ba8[1][3] memory) {\n S_95893ba8[1][3] memory r;\n {\n S_95893ba8[1] memory r_0;\n {\n S_95893ba8 memory r_0_0;\n {\n bytes1 r_0_0_0 = bytes1(0xa2);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀ooo ooo🚀 🚀o🚀oo🚀🚀🚀 éMéM éo éMo \";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bool r_0_0_2 = false;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n address r_0_0_3 = 0xE34E59Baeb093D18aceB1d48747675aAb4bEDDB1;\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_95893ba8[1] memory r_1;\n {\n S_95893ba8 memory r_1_0;\n {\n bytes1 r_1_0_0 = bytes1(0x95);\n r_1_0.s_0 = r_1_0_0;\n }\n {\n string memory r_1_0_1 = unicode\"Moo é🚀oéMé o \";\n r_1_0.s_1 = r_1_0_1;\n }\n {\n bool r_1_0_2 = false;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n address r_1_0_3 = 0x455eC9Dc650A303A234678027FFa533d8cbD7F90;\n r_1_0.s_3 = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_95893ba8[1] memory r_2;\n {\n S_95893ba8 memory r_2_0;\n {\n bytes1 r_2_0_0 = bytes1(0x5e);\n r_2_0.s_0 = r_2_0_0;\n }\n {\n string memory r_2_0_1 = unicode\"Moo é🚀 🚀o\";\n r_2_0.s_1 = r_2_0_1;\n }\n {\n bool r_2_0_2 = true;\n r_2_0.s_2 = r_2_0_2;\n }\n {\n address r_2_0_3 = 0xF3d51263108dFa096aA27A62bE659a94B6e56049;\n r_2_0.s_3 = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e34e59baeb093d18aceb1d48747675aab4beddb100000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a806f6f6f20206f6f6ff09f9a8020f09f9a806ff09f9a806f6ff09f9a80f09f9a80f09f9a8020c3a94dc3a94d2020c3a96f2020c3a94d6f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020950000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000455ec9dc650a303a234678027ffa533d8cbd7f9000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806fc3a94dc3a9206f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f3d51263108dfa096aa27a62be659a94b6e5604900000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a8020f09f9a806f00000000000000000000000000000000" + }, + { + "name": "random-(bytes15,string[],address,bytes20,address)", + "type": "(bytes15,string[],address,bytes20,address)", + "value": [ + "0x4b44bb06994737da68e44f52bd6302", + ["Moo é🚀🚀M🚀o o🚀Mo🚀MoMéMéoM éooéoooMo éMé🚀 MoooMo🚀o "], + "0x1ffB4Db2566e7A080180a0341548b6A12E447189", + "0x881c08fc45e365800b11cb388635db75a511c065", + "0x978DEBC743020A19f0B5027D50f379b1e81E3C29" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4b44bb06994737da68e44f52bd6302" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀M🚀o o🚀Mo🚀MoMéMéoM éooéoooMo éMé🚀 MoooMo🚀o " + } + ] + }, + { + "type": "address", + "value": "0x1ffB4Db2566e7A080180a0341548b6A12E447189" + }, + { + "type": "hexstring", + "value": "0x881c08fc45e365800b11cb388635db75a511c065" + }, + { + "type": "address", + "value": "0x978DEBC743020A19f0B5027D50f379b1e81E3C29" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610325806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017b565b60405180910390f35b6040805160a080820183526000808352606060208085018290528486018390528185018390526080808601849052865194850187528482018390528487018490529184018390529083018290526e25a25d834ca39bed347227a95eb18160891b8352845160018082528187019096529394929391929082015b60608152602001906001900390816100c757905050905060006040518060800160405280604e81526020016102a2604e91399050808260008151811061010f5761010f61028b565b60209081029190910181019190915283019190915250731ffb4db2566e7a080180a0341548b6a12e447189604082015273881c08fc45e365800b11cb388635db75a511c06560601b606082015273978debc743020a19f0b5027d50f379b1e81e3c296080820152919050565b6000602080835260c0830170ffffffffffffffffffffffffffffffffff19855116828501528185015160a0604086015281815180845260e08701915060e08160051b880101935084830192506000805b828110156102305788860360df1901845284518051808852835b81811015610200578281018a01518982018b015289016101e5565b8181111561021057848a838b0101525b50601f01601f1916969096018701955093860193928601926001016101cb565b50505050506040850151915061025160608501836001600160a01b03169052565b60608501516bffffffffffffffffffffffff1981166080860152915060808501516001600160a01b03811660a08601529150949350505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a804df09f9a806f206ff09f9a804d6ff09f9a804d6f4dc3a94dc3a96f4d2020c3a96f6fc3a96f6f6f4d6f20c3a94dc3a9f09f9a80204d6f6f6f4d6ff09f9a806f20a2646970667358221220a588e7d12f8098ca6e2ed7422ab3c56838dd3ce626600b1dc6d37011a947af3064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_99e0a53c {\n bytes15 s_0;\n string[] s_1;\n address s_2;\n bytes20 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_99e0a53c memory) {\n S_99e0a53c memory r;\n {\n bytes15 r_0 = bytes15(0x4b44bb06994737da68e44f52bd6302);\n r.s_0 = r_0;\n }\n {\n string[] memory r_1 = new string[](1);\n {\n string memory r_1_0 = unicode\"Moo é🚀🚀M🚀o o🚀Mo🚀MoMéMéoM éooéoooMo éMé🚀 MoooMo🚀o \";\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x1ffB4Db2566e7A080180a0341548b6A12E447189;\n r.s_2 = r_2;\n }\n {\n bytes20 r_3 = bytes20(0x881C08FC45E365800B11CB388635Db75A511c065);\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x978DEBC743020A19f0B5027D50f379b1e81E3C29;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000204b44bb06994737da68e44f52bd6302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000001ffb4db2566e7a080180a0341548b6a12e447189881c08fc45e365800b11cb388635db75a511c065000000000000000000000000000000000000000000000000978debc743020a19f0b5027d50f379b1e81e3c2900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a80f09f9a804df09f9a806f206ff09f9a804d6ff09f9a804d6f4dc3a94dc3a96f4d2020c3a96f6fc3a96f6f6f4d6f20c3a94dc3a9f09f9a80204d6f6f6f4d6ff09f9a806f20000000000000000000000000000000000000" + }, + { + "name": "random-(bytes16[4],bytes4,address[4],string)", + "type": "(bytes16[4],bytes4,address[4],string)", + "value": [ + [ + "0x4fe8ffe8f2da862a1e9bf0d621850774", + "0x66d51bdba3481fec6e8a47270c422b6b", + "0xd39891de9aa490eb8ef8b0645a8178fc", + "0xa484be8b889c4aa9fb8fbe9d629d8af2" + ], + "0x7b404c99", + [ + "0xBDA98a32290087af68918152bbB0F14Ae9dc840d", + "0x509F28473448e40FAFE18c36681608E9285DeC93", + "0x537F1AE19B41F2750CB74fB55234FaCf6Db39de8", + "0x8B69c74130fbAA447c0c684cB785dbAA748BD0f8" + ], + "Moo é🚀o🚀éMooéooo🚀oééooéoMo🚀 o🚀 oooooo🚀 éMMo🚀🚀🚀MM é oM" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4fe8ffe8f2da862a1e9bf0d621850774" + }, + { + "type": "hexstring", + "value": "0x66d51bdba3481fec6e8a47270c422b6b" + }, + { + "type": "hexstring", + "value": "0xd39891de9aa490eb8ef8b0645a8178fc" + }, + { + "type": "hexstring", + "value": "0xa484be8b889c4aa9fb8fbe9d629d8af2" + } + ] + }, + { + "type": "hexstring", + "value": "0x7b404c99" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xBDA98a32290087af68918152bbB0F14Ae9dc840d" + }, + { + "type": "address", + "value": "0x509F28473448e40FAFE18c36681608E9285DeC93" + }, + { + "type": "address", + "value": "0x537F1AE19B41F2750CB74fB55234FaCf6Db39de8" + }, + { + "type": "address", + "value": "0x8B69c74130fbAA447c0c684cB785dbAA748BD0f8" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀éMooéooo🚀oééooéoMo🚀 o🚀 oooooo🚀 éMMo🚀🚀🚀MM é oM" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610357806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610219565b60405180910390f35b61005661017a565b61005e61017a565b6100666101ae565b6f13fa3ffa3cb6a18a87a6fc35886141dd60821b81526f66d51bdba3481fec6e8a47270c422b6b60801b6020808301919091526f34e62477a6a9243ae3be2c1916a05e3f60821b60408301526f52425f45c44e2554fdc7df4eb14ec57960811b6060830152908252637b404c9960e01b908201526100e26101ae565b73bda98a32290087af68918152bbb0f14ae9dc840d815273509f28473448e40fafe18c36681608e9285dec9360208083019190915273537f1ae19b41f2750cb74fb55234facf6db39de8604080840191909152738b69c74130fbaa447c0c684cb785dbaa748bd0f86060840152838101929092528151608081019092526058808352600092916102ca90830139606083015250919050565b604051806080016040528061018d6101ae565b8152600060208201526040016101a16101ae565b8152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b818110156101f2576020818501810151868301820152016101d6565b81811115610204576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160009190828483015b600482101561025b5782516fffffffffffffffffffffffffffffffff1916815291830191600191909101908301610229565b505050838101516001600160e01b03191660a0840152604084015160c0840160005b60048110156102a35782516001600160a01b03168252918301919083019060010161027d565b505050506060830151610140838101526102c16101608401826101cc565b94935050505056fe4d6f6f20c3a9f09f9a806ff09f9a80c3a94d6f6fc3a96f6f6ff09f9a806fc3a9c3a96f6fc3a96f4d6ff09f9a80206ff09f9a80206f6f6f6f6f6ff09f9a8020c3a94d4d6ff09f9a80f09f9a80f09f9a804d4d20c3a9206f4da2646970667358221220e76cdf28cb895beef547f77a121bba9abc08a59a6b1aed2f58a2bdc950f555cd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e908b3b4 {\n bytes16[4] s_0;\n bytes4 s_1;\n address[4] s_2;\n string s_3;\n }\n\n function test () public pure returns (S_e908b3b4 memory) {\n S_e908b3b4 memory r;\n {\n bytes16[4] memory r_0;\n {\n bytes16 r_0_0 = bytes16(0x4fe8ffe8f2da862a1e9bf0d621850774);\n r_0[0] = r_0_0;\n }\n {\n bytes16 r_0_1 = bytes16(0x66d51bdba3481fec6e8a47270c422b6b);\n r_0[1] = r_0_1;\n }\n {\n bytes16 r_0_2 = bytes16(0xd39891de9aa490eb8ef8b0645a8178fc);\n r_0[2] = r_0_2;\n }\n {\n bytes16 r_0_3 = bytes16(0xa484be8b889c4aa9fb8fbe9d629d8af2);\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bytes4 r_1 = bytes4(0x7b404c99);\n r.s_1 = r_1;\n }\n {\n address[4] memory r_2;\n {\n address r_2_0 = 0xBDA98a32290087af68918152bbB0F14Ae9dc840d;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x509F28473448e40FAFE18c36681608E9285DeC93;\n r_2[1] = r_2_1;\n }\n {\n address r_2_2 = 0x537F1AE19B41F2750CB74fB55234FaCf6Db39de8;\n r_2[2] = r_2_2;\n }\n {\n address r_2_3 = 0x8B69c74130fbAA447c0c684cB785dbAA748BD0f8;\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀o🚀éMooéooo🚀oééooéoMo🚀 o🚀 oooooo🚀 éMMo🚀🚀🚀MM é oM\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000204fe8ffe8f2da862a1e9bf0d6218507740000000000000000000000000000000066d51bdba3481fec6e8a47270c422b6b00000000000000000000000000000000d39891de9aa490eb8ef8b0645a8178fc00000000000000000000000000000000a484be8b889c4aa9fb8fbe9d629d8af2000000000000000000000000000000007b404c9900000000000000000000000000000000000000000000000000000000000000000000000000000000bda98a32290087af68918152bbb0f14ae9dc840d000000000000000000000000509f28473448e40fafe18c36681608e9285dec93000000000000000000000000537f1ae19b41f2750cb74fb55234facf6db39de80000000000000000000000008b69c74130fbaa447c0c684cb785dbaa748bd0f8000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806ff09f9a80c3a94d6f6fc3a96f6f6ff09f9a806fc3a9c3a96f6fc3a96f4d6ff09f9a80206ff09f9a80206f6f6f6f6f6ff09f9a8020c3a94d4d6ff09f9a80f09f9a80f09f9a804d4d20c3a9206f4d0000000000000000" + }, + { + "name": "random-(bytes18,address[1],string,uint,string)", + "type": "(bytes18,address[1],string,uint,string)", + "value": [ + "0xdfa6037dedca92fd15f7fe0d6809cdd2c946", + ["0xf2Bba0c16080482086ec493e8cEE8f95f3B670f7"], + "Moo é🚀🚀éoM🚀o🚀éo ", + "29824036562092813953969284122698523368152000906635943331899744199813115955815", + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xdfa6037dedca92fd15f7fe0d6809cdd2c946" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xf2Bba0c16080482086ec493e8cEE8f95f3B670f7" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀éoM🚀o🚀éo " + }, + { + "type": "number", + "value": "29824036562092813953969284122698523368152000906635943331899744199813115955815" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610297806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c5565b60405180910390f35b610056610124565b61005e610124565b716fd301bef6e5497e8afbff06b404e6e964a360711b815261007e61015a565b73f2bba0c16080482086ec493e8cee8f95f3b670f78152602082810191909152604080518082018252601f81527f4d6f6f20c3a9f09f9a80f09f9a80c3a96f4df09f9a806ff09f9a80c3a96f200081840152818401527f41efce768b5e963569efe5db2f353f918be10bfaf4d1460d06b8007332bc4a6760608401528051808201909152600a8152689adede418753e13f3560b71b918101919091526080820152919050565b6040805160a08101909152600081526020810161013f61015a565b81526020016060815260200160008152602001606081525090565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b8181101561019e57602081850181015186830182015201610182565b818111156101b0576000602083870101525b50601f01601f19169290920160200192915050565b600060208083526dffffffffffffffffffffffffffff1984511681840152808401516040840160005b60018110156102145782516001600160a01b0316825291830191908301906001016101ee565b50505050604083015160a0606084015261023160c0840182610178565b9050606084015160808401526080840151601f198483030160a08501526102588282610178565b9594505050505056fea26469706673582212207526900014d53ab8533e37e70bbe8ca5fb273848d5b32ab096f5054da41a386a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f4345195 {\n bytes18 s_0;\n address[1] s_1;\n string s_2;\n uint256 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_f4345195 memory) {\n S_f4345195 memory r;\n {\n bytes18 r_0 = bytes18(0xdfa6037dedca92fd15f7fe0d6809cdd2c946);\n r.s_0 = r_0;\n }\n {\n address[1] memory r_1;\n {\n address r_1_0 = 0xf2Bba0c16080482086ec493e8cEE8f95f3B670f7;\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀🚀éoM🚀o🚀éo \";\n r.s_2 = r_2;\n }\n {\n uint r_3 = 29824036562092813953969284122698523368152000906635943331899744199813115955815;\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020dfa6037dedca92fd15f7fe0d6809cdd2c9460000000000000000000000000000000000000000000000000000f2bba0c16080482086ec493e8cee8f95f3b670f700000000000000000000000000000000000000000000000000000000000000a041efce768b5e963569efe5db2f353f918be10bfaf4d1460d06b8007332bc4a6700000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a80f09f9a80c3a96f4df09f9a806ff09f9a80c3a96f2000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes21,string[],address,bytes18)[3]", + "type": "(bytes21,string[],address,bytes18)[3]", + "value": [ + [ + "0x0696c84070907f4c36cab93d788f16777594cba9ed", + ["Moo é🚀 Moo🚀éMo🚀MooMé 🚀 éoooéoo", "Moo é🚀🚀éM"], + "0xB07B6d5F9493b9B80c28cc6F5CD6b8E8534eBDFc", + "0x8d6516c692d00049cca103dfdc3817a053ee" + ], + [ + "0x57520ebca95d52669d8208242611ca48fe7ee12661", + [ + "Moo é🚀Mooo 🚀 🚀🚀éé🚀o éoéoM o Mo", + "Moo é🚀 éoMM o🚀🚀oo 🚀ooMééMéoooMé🚀o MooMoM", + "Moo é🚀 M🚀ooM🚀oMéooooM🚀 ooM🚀M o🚀 ooéo🚀MooMo🚀oMoééo éM", + "Moo é🚀" + ], + "0x76D841994DB7b3Af9eA985E0c0Cc5e37Dc8c7B4F", + "0xe53683d04f54d715d6ddc623b2a07b559cbb" + ], + [ + "0x315499a73af0719f1fbb71611bdb3be59f75fb5687", + [ + "Moo é🚀M Moo🚀oéMMoéoMooM 🚀🚀é", + "Moo é🚀o Mé oéooééM 🚀éoéM oM🚀ooé🚀éo🚀oé🚀oo " + ], + "0x09D001f1497eCa3e6410D9Afb8870E1D1147CCD9", + "0x5bf7c5c335280961c9919bcf6c5298cf9963" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0696c84070907f4c36cab93d788f16777594cba9ed" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Moo🚀éMo🚀MooMé 🚀 éoooéoo" + }, + { + "type": "string", + "value": "Moo é🚀🚀éM" + } + ] + }, + { + "type": "address", + "value": "0xB07B6d5F9493b9B80c28cc6F5CD6b8E8534eBDFc" + }, + { + "type": "hexstring", + "value": "0x8d6516c692d00049cca103dfdc3817a053ee" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x57520ebca95d52669d8208242611ca48fe7ee12661" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mooo 🚀 🚀🚀éé🚀o éoéoM o Mo" + }, + { + "type": "string", + "value": "Moo é🚀 éoMM o🚀🚀oo 🚀ooMééMéoooMé🚀o MooMoM" + }, + { + "type": "string", + "value": "Moo é🚀 M🚀ooM🚀oMéooooM🚀 ooM🚀M o🚀 ooéo🚀MooMo🚀oMoééo éM" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "address", + "value": "0x76D841994DB7b3Af9eA985E0c0Cc5e37Dc8c7B4F" + }, + { + "type": "hexstring", + "value": "0xe53683d04f54d715d6ddc623b2a07b559cbb" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x315499a73af0719f1fbb71611bdb3be59f75fb5687" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M Moo🚀oéMMoéoMooM 🚀🚀é" + }, + { + "type": "string", + "value": "Moo é🚀o Mé oéooééM 🚀éoéM oM🚀ooé🚀éo🚀oé🚀oo " + } + ] + }, + { + "type": "address", + "value": "0x09D001f1497eCa3e6410D9Afb8870E1D1147CCD9" + }, + { + "type": "hexstring", + "value": "0x5bf7c5c335280961c9919bcf6c5298cf9963" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506107a3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104c9565b60405180910390f35b610056610483565b61005e610483565b60408051608081018252606060208083018290526000838501819052828401819052740696c84070907f4c36cab93d788f16777594cba9ed60581b8452845160028082529381019095529293919082015b60608152602001906001900390816100af57905050905060006040518060600160405280602f81526020016106a7602f9139905080826000815181106100f7576100f76105f1565b6020026020010181905250506000604051806040016040528060118152602001704d6f6f20c3a9f09f9a80f09f9a80c3a94d60781b81525090508082600181518110610145576101456105f1565b602090810291909101810191909152838101929092525073b07b6d5f9493b9b80c28cc6f5cd6b8e8534ebdfc6040808401919091527146b28b6349680024e65081efee1c0bd029f760711b60608085019190915292845280516080810182526000808252928101849052908101829052918201527457520ebca95d52669d8208242611ca48fe7ee1266160581b815260408051600480825260a08201909252600091816020015b60608152602001906001900390816101ec57905050905060006040518060600160405280603481526020016106086034913990508082600081518110610234576102346105f1565b60200260200101819052505060006040518060600160405280603f815260200161063c603f913990508082600181518110610271576102716105f1565b602002602001018190525050600060405180608001604052806052815260200161071c60529139905080826002815181106102ae576102ae6105f1565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b815250905080826003815181106102f4576102f46105f1565b602090810291909101810191909152830191909152507376d841994db7b3af9ea985e0c0cc5e37dc8c7b4f604082015271e53683d04f54d715d6ddc623b2a07b559cbb60701b6060820152808260016020020152506103746040805160808101825260008082526060602083018190529282018190529181019190915290565b74315499a73af0719f1fbb71611bdb3be59f75fb568760581b815260408051600280825260608201909252600091816020015b60608152602001906001900390816103a757905050905060006040518060600160405280602c815260200161067b602c9139905080826000815181106103ef576103ef6105f1565b60200260200101819052505060006040518060800160405280604681526020016106d6604691399050808260018151811061042c5761042c6105f1565b602090810291909101810191909152830191909152507309d001f1497eca3e6410d9afb8870e1d1147ccd9604080830191909152715bf7c5c335280961c9919bcf6c5298cf996360701b6060830152820152919050565b60405180606001604052806003905b6040805160808101825260008082526060602080840182905293830182905282015282526000199092019101816104925790505090565b60208082526000906080830183820185845b60038110156105e557601f1987850381018452825180516affffffffffffffffffffff19168652868101516080888801819052815190880181905260a0600582901b89018101928a01919089019060005b81811015610594578a8503609f190183528351805180875260005b81811015610565578e81840101518f828a0101528e81019050610547565b818111156105765760008f838a0101525b50601f018816959095018c019450928b0192918b019160010161052c565b5050505060409250828201516105b4848901826001600160a01b03169052565b506060918201516dffffffffffffffffffffffffffff191696909101959095525091840191908401906001016104db565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d6f6f6f20f09f9a80202020f09f9a80f09f9a80c3a9c3a9f09f9a806f20c3a96fc3a96f4d206f204d6f4d6f6f20c3a9f09f9a802020c3a96f4d4d206ff09f9a80f09f9a806f6f20f09f9a806f6f4dc3a9c3a94dc3a96f6f6f4dc3a9f09f9a806f20204d6f6f4d6f4d4d6f6f20c3a9f09f9a804d20204d6f6ff09f9a806fc3a94d4d6fc3a96f4d6f6f4d20f09f9a80f09f9a80c3a94d6f6f20c3a9f09f9a80204d6f6ff09f9a80c3a94d6ff09f9a804d6f6f4dc3a920f09f9a8020c3a96f6f6fc3a96f6f4d6f6f20c3a9f09f9a806f204dc3a9206fc3a96f6fc3a9c3a94d20f09f9a80c3a96fc3a94d206f4df09f9a806f6fc3a9f09f9a80c3a96ff09f9a806fc3a9f09f9a806f6f20204d6f6f20c3a9f09f9a80204df09f9a806f6f4df09f9a806f4dc3a96f6f6f6f4df09f9a80206f6f4df09f9a804d206ff09f9a80206f6fc3a96ff09f9a804d6f6f4d6ff09f9a806f4d6fc3a9c3a96f20c3a94da264697066735822122052d70bb6360443a7d2cee66d45e79eb5634342e02716341c6f373d051a9847e164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a7e0d24a {\n bytes21 s_0;\n string[] s_1;\n address s_2;\n bytes18 s_3;\n }\n\n function test () public pure returns (S_a7e0d24a[3] memory) {\n S_a7e0d24a[3] memory r;\n {\n S_a7e0d24a memory r_0;\n {\n bytes21 r_0_0 = bytes21(0x0696c84070907f4c36cab93d788f16777594cba9ed);\n r_0.s_0 = r_0_0;\n }\n {\n string[] memory r_0_1 = new string[](2);\n {\n string memory r_0_1_0 = unicode\"Moo é🚀 Moo🚀éMo🚀MooMé 🚀 éoooéoo\";\n r_0_1[0] = r_0_1_0;\n }\n {\n string memory r_0_1_1 = unicode\"Moo é🚀🚀éM\";\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0xB07B6d5F9493b9B80c28cc6F5CD6b8E8534eBDFc;\n r_0.s_2 = r_0_2;\n }\n {\n bytes18 r_0_3 = bytes18(0x8d6516c692d00049cca103dfdc3817a053ee);\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_a7e0d24a memory r_1;\n {\n bytes21 r_1_0 = bytes21(0x57520ebca95d52669d8208242611ca48fe7ee12661);\n r_1.s_0 = r_1_0;\n }\n {\n string[] memory r_1_1 = new string[](4);\n {\n string memory r_1_1_0 = unicode\"Moo é🚀Mooo 🚀 🚀🚀éé🚀o éoéoM o Mo\";\n r_1_1[0] = r_1_1_0;\n }\n {\n string memory r_1_1_1 = unicode\"Moo é🚀 éoMM o🚀🚀oo 🚀ooMééMéoooMé🚀o MooMoM\";\n r_1_1[1] = r_1_1_1;\n }\n {\n string memory r_1_1_2 = unicode\"Moo é🚀 M🚀ooM🚀oMéooooM🚀 ooM🚀M o🚀 ooéo🚀MooMo🚀oMoééo éM\";\n r_1_1[2] = r_1_1_2;\n }\n {\n string memory r_1_1_3 = unicode\"Moo é🚀\";\n r_1_1[3] = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0x76D841994DB7b3Af9eA985E0c0Cc5e37Dc8c7B4F;\n r_1.s_2 = r_1_2;\n }\n {\n bytes18 r_1_3 = bytes18(0xe53683d04f54d715d6ddc623b2a07b559cbb);\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_a7e0d24a memory r_2;\n {\n bytes21 r_2_0 = bytes21(0x315499a73af0719f1fbb71611bdb3be59f75fb5687);\n r_2.s_0 = r_2_0;\n }\n {\n string[] memory r_2_1 = new string[](2);\n {\n string memory r_2_1_0 = unicode\"Moo é🚀M Moo🚀oéMMoéoMooM 🚀🚀é\";\n r_2_1[0] = r_2_1_0;\n }\n {\n string memory r_2_1_1 = unicode\"Moo é🚀o Mé oéooééM 🚀éoéM oM🚀ooé🚀éo🚀oé🚀oo \";\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0x09D001f1497eCa3e6410D9Afb8870E1D1147CCD9;\n r_2.s_2 = r_2_2;\n }\n {\n bytes18 r_2_3 = bytes18(0x5bf7c5c335280961c9919bcf6c5298cf9963);\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000004800696c84070907f4c36cab93d788f16777594cba9ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000b07b6d5f9493b9b80c28cc6f5cd6b8e8534ebdfc8d6516c692d00049cca103dfdc3817a053ee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a80204d6f6ff09f9a80c3a94d6ff09f9a804d6f6f4dc3a920f09f9a8020c3a96f6f6fc3a96f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a80f09f9a80c3a94d00000000000000000000000000000057520ebca95d52669d8208242611ca48fe7ee126610000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000076d841994db7b3af9ea985e0c0cc5e37dc8c7b4fe53683d04f54d715d6ddc623b2a07b559cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a804d6f6f6f20f09f9a80202020f09f9a80f09f9a80c3a9c3a9f09f9a806f20c3a96fc3a96f4d206f204d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a802020c3a96f4d4d206ff09f9a80f09f9a806f6f20f09f9a806f6f4dc3a9c3a94dc3a96f6f6f4dc3a9f09f9a806f20204d6f6f4d6f4d0000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80204df09f9a806f6f4df09f9a806f4dc3a96f6f6f6f4df09f9a80206f6f4df09f9a804d206ff09f9a80206f6fc3a96ff09f9a804d6f6f4d6ff09f9a806f4d6fc3a9c3a96f20c3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000315499a73af0719f1fbb71611bdb3be59f75fb56870000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000009d001f1497eca3e6410d9afb8870e1d1147ccd95bf7c5c335280961c9919bcf6c5298cf996300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a804d20204d6f6ff09f9a806fc3a94d4d6fc3a96f4d6f6f4d20f09f9a80f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a806f204dc3a9206fc3a96f6fc3a9c3a94d20f09f9a80c3a96fc3a94d206f4df09f9a806f6fc3a9f09f9a80c3a96ff09f9a806fc3a9f09f9a806f6f20200000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes23[],string,int96,string,bytes9)", + "type": "(bytes23[],string,int96,string,bytes9)", + "value": [ + [ + "0x43affa1d5108d37775c0a9e3f37e7768a4647a22d718f1", + "0x5a08aa465b435726b0ad8004918469c9457e60df1da59e", + "0x7526a1fcc889ca6a0a09694986ada763d1df79dc8e14e9", + "0x8792abf7c2d65829287352b0727c1044f4f304ba48d2c6" + ], + "Moo é🚀 o oéM é🚀ooé🚀MMo ", + "-25648947920418256133829501371", + "Moo é🚀Mo🚀 🚀🚀ééo ooo", + "0x251c295d2bc017e5f1" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x43affa1d5108d37775c0a9e3f37e7768a4647a22d718f1" + }, + { + "type": "hexstring", + "value": "0x5a08aa465b435726b0ad8004918469c9457e60df1da59e" + }, + { + "type": "hexstring", + "value": "0x7526a1fcc889ca6a0a09694986ada763d1df79dc8e14e9" + }, + { + "type": "hexstring", + "value": "0x8792abf7c2d65829287352b0727c1044f4f304ba48d2c6" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 o oéM é🚀ooé🚀MMo " + }, + { + "type": "number", + "value": "-25648947920418256133829501371" + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀 🚀🚀ééo ooo" + }, + { + "type": "hexstring", + "value": "0x251c295d2bc017e5f1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610437806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102da565b60405180910390f35b6040805160a08101825260608082526020820181905260009282018390528082015260808101919091526040805160a081018252606080825260208201819052600092820183905280820152608081019190915260408051600480825260a08201909252600091816020016020820280368337505081519192507f43affa1d5108d37775c0a9e3f37e7768a4647a22d718f10000000000000000009182915083906000906100fe576100fe6103a4565b68ffffffffffffffffff19909216602092830291909101909101525080517f5a08aa465b435726b0ad8004918469c9457e60df1da59e00000000000000000090819083906001908110610153576101536103a4565b68ffffffffffffffffff19909216602092830291909101909101525080517f7526a1fcc889ca6a0a09694986ada763d1df79dc8e14e9000000000000000000908190839060029081106101a8576101a86103a4565b68ffffffffffffffffff19909216602092830291909101909101525080517f8792abf7c2d65829287352b0727c1044f4f304ba48d2c6000000000000000000908190839060039081106101fd576101fd6103a4565b68ffffffffffffffffff1990921660209283029190910182015291835250604080516060810190915260258082526000926103bb908301396020808401919091526b52e04ffcdd3f99c7234921ba1960408085019190915280516060810190915260228082526000935090916103e09083013960608301525068251c295d2bc017e5f160b81b6080820152919050565b6000815180845260005b818110156102b357602081850181015186830182015201610297565b818111156102c5576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160a083830152805160c0840181905260009291820190839060e08601905b8083101561032b57835168ffffffffffffffffff191682529284019260019290920191908401906102ff565b50838701519350601f1992508286820301604087015261034b818561028d565b9350505060408501516103636060860182600b0b9052565b5060608501518185840301608086015261037d838261028d565b92505050608084015161039c60a08501826001600160b81b0319169052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80206f206fc3a94d2020c3a9f09f9a806f6fc3a9f09f9a804d4d6f204d6f6f20c3a9f09f9a804d6ff09f9a8020f09f9a80f09f9a80c3a9c3a96f206f6f6fa2646970667358221220d194e72c76fe6a59792ca0cac42c897c44a5532d41a2c879b0172055d163e1b364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_18ca8a5a {\n bytes23[] s_0;\n string s_1;\n int96 s_2;\n string s_3;\n bytes9 s_4;\n }\n\n function test () public pure returns (S_18ca8a5a memory) {\n S_18ca8a5a memory r;\n {\n bytes23[] memory r_0 = new bytes23[](4);\n {\n bytes23 r_0_0 = bytes23(0x43affa1d5108d37775c0a9e3f37e7768a4647a22d718f1);\n r_0[0] = r_0_0;\n }\n {\n bytes23 r_0_1 = bytes23(0x5a08aa465b435726b0ad8004918469c9457e60df1da59e);\n r_0[1] = r_0_1;\n }\n {\n bytes23 r_0_2 = bytes23(0x7526a1fcc889ca6a0a09694986ada763d1df79dc8e14e9);\n r_0[2] = r_0_2;\n }\n {\n bytes23 r_0_3 = bytes23(0x8792abf7c2d65829287352b0727c1044f4f304ba48d2c6);\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 o oéM é🚀ooé🚀MMo \";\n r.s_1 = r_1;\n }\n {\n int96 r_2 = -25648947920418256133829501371;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀Mo🚀 🚀🚀ééo ooo\";\n r.s_3 = r_3;\n }\n {\n bytes9 r_4 = bytes9(0x251c295d2bc017e5f1);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140ffffffffffffffffffffffffffffffffffffffffad1fb00322c06638dcb6de4500000000000000000000000000000000000000000000000000000000000001a0251c295d2bc017e5f10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443affa1d5108d37775c0a9e3f37e7768a4647a22d718f10000000000000000005a08aa465b435726b0ad8004918469c9457e60df1da59e0000000000000000007526a1fcc889ca6a0a09694986ada763d1df79dc8e14e90000000000000000008792abf7c2d65829287352b0727c1044f4f304ba48d2c600000000000000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a80206f206fc3a94d2020c3a9f09f9a806f6fc3a9f09f9a804d4d6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a804d6ff09f9a8020f09f9a80f09f9a80c3a9c3a96f206f6f6f000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes25,bool,address,bool[][2])", + "type": "(bytes25,bool,address,bool[][2])", + "value": [ + "0x2aa99d8598dac6b568683570464f47006fa62bca88a3c4cf03", + false, + "0x953289966DaE43Cae8abDB6BAbb8c62F9567c8fE", + [[true, true, true], []] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2aa99d8598dac6b568683570464f47006fa62bca88a3c4cf03" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x953289966DaE43Cae8abDB6BAbb8c62F9567c8fE" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c5565b60405180910390f35b610056610170565b61005e610170565b7f2aa99d8598dac6b568683570464f47006fa62bca88a3c4cf030000000000000081526000602082015273953289966dae43cae8abdb6babb8c62f9567c8fe60408201526100aa61019e565b604080516003808252608082019092526000916020820160608036833701905050905060006001905080826000815181106100e7576100e761027b565b6020026020010190151590811515815250505060006001905080826001815181106101145761011461027b565b6020026020010190151590811515815250505060006001905080826002815181106101415761014161027b565b911515602092830291909101820152918352506040805160008152808301909152908201526060820152919050565b60408051608081018252600080825260208201819052918101919091526060810161019961019e565b905290565b60405180604001604052806002905b60608152602001906001900390816101ad5790505090565b6020808252825166ffffffffffffff1916828201528281015115156040808401919091528301516001600160a01b03166060808401919091528301516080808401526000919060e084019060a0850184805b600281101561026e57878503609f19018352835180518087529087019087870190845b8181101561025857835115158352928901929189019160010161023a565b5090965050509285019291850191600101610217565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122012c198d96ccfbb2e314e7fa936e6cbd895d94e9d1896354492e36523a8df927f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3b705bd7 {\n bytes25 s_0;\n bool s_1;\n address s_2;\n bool[][2] s_3;\n }\n\n function test () public pure returns (S_3b705bd7 memory) {\n S_3b705bd7 memory r;\n {\n bytes25 r_0 = bytes25(0x2aa99d8598dac6b568683570464f47006fa62bca88a3c4cf03);\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x953289966DaE43Cae8abDB6BAbb8c62F9567c8fE;\n r.s_2 = r_2;\n }\n {\n bool[][2] memory r_3;\n {\n bool[] memory r_3_0 = new bool[](3);\n {\n bool r_3_0_0 = true;\n r_3_0[0] = r_3_0_0;\n }\n {\n bool r_3_0_1 = true;\n r_3_0[1] = r_3_0_1;\n }\n {\n bool r_3_0_2 = true;\n r_3_0[2] = r_3_0_2;\n }\n r_3[0] = r_3_0;\n }\n {\n bool[] memory r_3_1 = new bool[](0);\n r_3[1] = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000202aa99d8598dac6b568683570464f47006fa62bca88a3c4cf03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000953289966dae43cae8abdb6babb8c62f9567c8fe0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes28[4],bytes9,bool,bool)[]", + "type": "(bytes28[4],bytes9,bool,bool)[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101a9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906100d6565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b604051806080016040528061009d6100b8565b81526000602082018190526040820181905260609091015290565b60405180608001604052806004906020820280368337509192915050565b60208082528251828201819052600091906040908185019086840185805b83811015610165578251805186845b600481101561012757825163ffffffff19168252918a0191908a0190600101610103565b505050808801516001600160b81b031916608087015286810151151560a087015260600151151560c086015260e090940193918601916001016100f4565b50929897505050505050505056fea2646970667358221220af9dbec05b04e98031388c0363b91fb55f0e80bf1cd0cc612f6f769d3ae4921364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_356103e3 {\n bytes28[4] s_0;\n bytes9 s_1;\n bool s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_356103e3[] memory) {\n S_356103e3[] memory r = new S_356103e3[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes32,(bytes16,bytes10),bool,string)[4]", + "type": "(bytes32,(bytes16,bytes10),bool,string)[4]", + "value": [ + [ + "0x4c309b1257999edb4c3b2add54e6e15938ab322b148a6bd1c9dbd7f845d9f3fc", + ["0x12e44cdf2bc7304a74069b452e95869f", "0x79fd757d30cd4175945b"], + true, + "Moo é🚀🚀o🚀🚀 o M" + ], + [ + "0xfcf0f2a80285793dd502c0d06511966e6a2003d6ee2c8839bb4749e2f69362dd", + ["0x4146961945f690d7cbccdf1a1e6d6b12", "0xa3637a7b3ffd414dabd4"], + true, + "Moo é🚀" + ], + [ + "0xce7b8f6cfb77936d02f4482fc39d60364a040cbe3fc0dd20e6a91c185eecc817", + ["0xcb923a9cf1131d773012366daef8626a", "0x1cb2a16aea6bf9f6a5e4"], + false, + "Moo é🚀oMé oo 🚀🚀M o M" + ], + [ + "0x11a579263a53eaac3c0319e1d919c0da741869ee43582e3af46bfc7f8014d6fe", + ["0xbb24b9641ecbf71f1d8cef0391c91937", "0x99be2b961e88ae83650a"], + true, + "Moo é🚀 Mo🚀🚀🚀MéM🚀🚀🚀oM🚀o🚀 MoéM o" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4c309b1257999edb4c3b2add54e6e15938ab322b148a6bd1c9dbd7f845d9f3fc" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x12e44cdf2bc7304a74069b452e95869f" + }, + { + "type": "hexstring", + "value": "0x79fd757d30cd4175945b" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀🚀 o M" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfcf0f2a80285793dd502c0d06511966e6a2003d6ee2c8839bb4749e2f69362dd" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4146961945f690d7cbccdf1a1e6d6b12" + }, + { + "type": "hexstring", + "value": "0xa3637a7b3ffd414dabd4" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xce7b8f6cfb77936d02f4482fc39d60364a040cbe3fc0dd20e6a91c185eecc817" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xcb923a9cf1131d773012366daef8626a" + }, + { + "type": "hexstring", + "value": "0x1cb2a16aea6bf9f6a5e4" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oMé oo 🚀🚀M o M" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x11a579263a53eaac3c0319e1d919c0da741869ee43582e3af46bfc7f8014d6fe" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xbb24b9641ecbf71f1d8cef0391c91937" + }, + { + "type": "hexstring", + "value": "0x99be2b961e88ae83650a" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀 Mo🚀🚀🚀MéM🚀🚀🚀oM🚀o🚀 MoéM o" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061049c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061034d565b60405180910390f35b6100566102df565b61005e6102df565b61006661030c565b7f4c309b1257999edb4c3b2add54e6e15938ab322b148a6bd1c9dbd7f845d9f3fc81526040805180820182526f12e44cdf2bc7304a74069b452e95869f60801b81526979fd757d30cd4175945b60b01b602080830191909152808401919091526001828401528151808301909252601b82527f4d6f6f20c3a9f09f9a80f09f9a806ff09f9a80f09f9a80206f204d0000000000908201526060820152815261010c61030c565b7ffcf0f2a80285793dd502c0d06511966e6a2003d6ee2c8839bb4749e2f69362dd81526040805180820182526f20a34b0ca2fb486be5e66f8d0f36b58960811b81526928d8de9ecfff50536af560b21b602080830191909152808401919091526001828401528151808301909252600a8252689adede418753e13f3560b71b8282015260608301919091528201526101a261030c565b7fce7b8f6cfb77936d02f4482fc39d60364a040cbe3fc0dd20e6a91c185eecc81781526040805180820182526f65c91d4e78898ebb98091b36d77c313560811b815269072ca85aba9afe7da97960b21b6020808301919091528084019190915260008284015281518083018352601f81527f4d6f6f20c3a9f09f9a806f4dc3a9206f6f20f09f9a80f09f9a804d206f204d0091810191909152606083015282015261024b61030c565b7f11a579263a53eaac3c0319e1d919c0da741869ee43582e3af46bfc7f8014d6fe81526040805180820182526fbb24b9641ecbf71f1d8cef0391c9193760801b8152694cdf15cb0f445741b28560b11b60208083019190915280840191909152600182840152815160608101909252603d8083526000929161042a9083013960608301525080826003602002015250919050565b60405180608001604052806004905b6102f661030c565b8152602001906001900390816102ee5790505090565b60408051608081019091526000815260208101610339604080518082019091526000808252602082015290565b815260006020820152606060409091015290565b602080825260009060a08382018185018685805b600481101561041b57601f19898503810186528351805186528881015180516fffffffffffffffffffffffffffffffff19168a8801528901516001600160b01b03191660408088019190915281015115156060808801919091520151608086018890528051888701819052845b818110156103ea578281018b015188820160c001528a016103ce565b818111156103fb578560c0838a0101525b5096890196601f019091169490940160c001935091860191600101610361565b50919897505050505050505056fe4d6f6f20c3a9f09f9a8020204d6ff09f9a80f09f9a80f09f9a804dc3a94df09f9a80f09f9a80f09f9a806f4df09f9a806ff09f9a80204d6fc3a94d206fa26469706673582212207dd0a0ff3a9d1f0ae5178fc64310a94379fd80a10e2b0cb3f9b6a39d1d9b1baf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_03b955f2 {\n bytes16 s_0;\n bytes10 s_1;\n }\n\n struct S_ab215509 {\n bytes32 s_0;\n S_03b955f2 s_1;\n bool s_2;\n string s_3;\n }\n\n function test () public pure returns (S_ab215509[4] memory) {\n S_ab215509[4] memory r;\n {\n S_ab215509 memory r_0;\n {\n bytes32 r_0_0 = bytes32(0x4c309b1257999edb4c3b2add54e6e15938ab322b148a6bd1c9dbd7f845d9f3fc);\n r_0.s_0 = r_0_0;\n }\n {\n S_03b955f2 memory r_0_1;\n {\n bytes16 r_0_1_0 = bytes16(0x12e44cdf2bc7304a74069b452e95869f);\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bytes10 r_0_1_1 = bytes10(0x79fd757d30cd4175945b);\n r_0_1.s_1 = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀🚀o🚀🚀 o M\";\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_ab215509 memory r_1;\n {\n bytes32 r_1_0 = bytes32(0xfcf0f2a80285793dd502c0d06511966e6a2003d6ee2c8839bb4749e2f69362dd);\n r_1.s_0 = r_1_0;\n }\n {\n S_03b955f2 memory r_1_1;\n {\n bytes16 r_1_1_0 = bytes16(0x4146961945f690d7cbccdf1a1e6d6b12);\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bytes10 r_1_1_1 = bytes10(0xa3637a7b3ffd414dabd4);\n r_1_1.s_1 = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n {\n bool r_1_2 = true;\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀\";\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_ab215509 memory r_2;\n {\n bytes32 r_2_0 = bytes32(0xce7b8f6cfb77936d02f4482fc39d60364a040cbe3fc0dd20e6a91c185eecc817);\n r_2.s_0 = r_2_0;\n }\n {\n S_03b955f2 memory r_2_1;\n {\n bytes16 r_2_1_0 = bytes16(0xcb923a9cf1131d773012366daef8626a);\n r_2_1.s_0 = r_2_1_0;\n }\n {\n bytes10 r_2_1_1 = bytes10(0x1cb2a16aea6bf9f6a5e4);\n r_2_1.s_1 = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = false;\n r_2.s_2 = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀oMé oo 🚀🚀M o M\";\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n {\n S_ab215509 memory r_3;\n {\n bytes32 r_3_0 = bytes32(0x11a579263a53eaac3c0319e1d919c0da741869ee43582e3af46bfc7f8014d6fe);\n r_3.s_0 = r_3_0;\n }\n {\n S_03b955f2 memory r_3_1;\n {\n bytes16 r_3_1_0 = bytes16(0xbb24b9641ecbf71f1d8cef0391c91937);\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bytes10 r_3_1_1 = bytes10(0x99be2b961e88ae83650a);\n r_3_1.s_1 = r_3_1_1;\n }\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3.s_2 = r_3_2;\n }\n {\n string memory r_3_3 = unicode\"Moo é🚀 Mo🚀🚀🚀MéM🚀🚀🚀oM🚀o🚀 MoéM o\";\n r_3.s_3 = r_3_3;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000003204c309b1257999edb4c3b2add54e6e15938ab322b148a6bd1c9dbd7f845d9f3fc12e44cdf2bc7304a74069b452e95869f0000000000000000000000000000000079fd757d30cd4175945b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80f09f9a806ff09f9a80f09f9a80206f204d0000000000fcf0f2a80285793dd502c0d06511966e6a2003d6ee2c8839bb4749e2f69362dd4146961945f690d7cbccdf1a1e6d6b1200000000000000000000000000000000a3637a7b3ffd414dabd400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000ce7b8f6cfb77936d02f4482fc39d60364a040cbe3fc0dd20e6a91c185eecc817cb923a9cf1131d773012366daef8626a000000000000000000000000000000001cb2a16aea6bf9f6a5e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a806f4dc3a9206f6f20f09f9a80f09f9a804d206f204d0011a579263a53eaac3c0319e1d919c0da741869ee43582e3af46bfc7f8014d6febb24b9641ecbf71f1d8cef0391c919370000000000000000000000000000000099be2b961e88ae83650a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a8020204d6ff09f9a80f09f9a80f09f9a804dc3a94df09f9a80f09f9a80f09f9a806f4df09f9a806ff09f9a80204d6fc3a94d206f000000" + }, + { + "name": "random-(bytes32,address,bool,string)[1][2]", + "type": "(bytes32,address,bool,string)[1][2]", + "value": [ + [ + [ + "0x03247f80a2fb8d5ef767924749fd777ca5d1c805f6d28bd35393c4239ab10a50", + "0x172Eb83128843DfF3A2fb9b49899ACee07fe281d", + false, + "Moo é🚀éoé M🚀é🚀🚀o oMé🚀🚀🚀 M MéMoMM🚀oo 🚀o M o🚀" + ] + ], + [ + [ + "0x104c7a3a3937fb91de554c68fc992213218d90d447a8c6ec66f5b0879a35896d", + "0x3073a2d668F041Bd8c91c0D235109e98C8996232", + true, + "Moo é🚀M M o🚀éoéooMMo🚀 ooé" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x03247f80a2fb8d5ef767924749fd777ca5d1c805f6d28bd35393c4239ab10a50" + }, + { + "type": "address", + "value": "0x172Eb83128843DfF3A2fb9b49899ACee07fe281d" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀éoé M🚀é🚀🚀o oMé🚀🚀🚀 M MéMoMM🚀oo 🚀o M o🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x104c7a3a3937fb91de554c68fc992213218d90d447a8c6ec66f5b0879a35896d" + }, + { + "type": "address", + "value": "0x3073a2d668F041Bd8c91c0D235109e98C8996232" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀M M o🚀éoéooMMo🚀 ooé" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610377806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e2565b60405180910390f35b610056610170565b61005e610170565b61006661019d565b604080516080808201835260008284018190526060808401527f03247f80a2fb8d5ef767924749fd777ca5d1c805f6d28bd35393c4239ab10a50835273172eb83128843dff3a2fb9b49899acee07fe281d6020808501919091528451928301909452605080835292939092906102cc90830139606083015250815281526100eb61019d565b6040805160808101825260608082018190527f104c7a3a3937fb91de554c68fc992213218d90d447a8c6ec66f5b0879a35896d8252733073a2d668f041bd8c91c0d235109e98c89962326020808401919091526001838501528351918201909352602680825291926000929061031c9083013960608301525081526020820152919050565b60405180604001604052806002905b61018761019d565b81526020019060019003908161017f5790505090565b60405180602001604052806001905b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816101ac5790505090565b6020808252600090606083820181850186855b60028110156102be57601f198884038101855282518488810160005b60018110156102a85787820383528351805183528b8101516001600160a01b03168c8401526040808201511515908401528a015160808b840181905281519084018190526000905b80821015610277578282018e015185830160a00152908d0190610259565b8082111561028957600060a082870101525b958d0195948d0194601f0187169390930160a001925050600101610211565b50968901969550505091860191506001016101f5565b509097965050505050505056fe4d6f6f20c3a9f09f9a80c3a96fc3a9204df09f9a80c3a9f09f9a80f09f9a806f206f4dc3a9f09f9a80f09f9a80f09f9a8020204d204dc3a94d6f4d4df09f9a806f6f20f09f9a806f204d206ff09f9a804d6f6f20c3a9f09f9a804d204d206ff09f9a80c3a96fc3a96f6f4d4d6ff09f9a80206f6fc3a9a2646970667358221220aede36fb30f7edd42a54f6e7f842d67babf2522604370afb9f4eb85b905c4ead64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c2175048 {\n bytes32 s_0;\n address s_1;\n bool s_2;\n string s_3;\n }\n\n function test () public pure returns (S_c2175048[1][2] memory) {\n S_c2175048[1][2] memory r;\n {\n S_c2175048[1] memory r_0;\n {\n S_c2175048 memory r_0_0;\n {\n bytes32 r_0_0_0 = bytes32(0x03247f80a2fb8d5ef767924749fd777ca5d1c805f6d28bd35393c4239ab10a50);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x172Eb83128843DfF3A2fb9b49899ACee07fe281d;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bool r_0_0_2 = false;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n string memory r_0_0_3 = unicode\"Moo é🚀éoé M🚀é🚀🚀o oMé🚀🚀🚀 M MéMoMM🚀oo 🚀o M o🚀\";\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_c2175048[1] memory r_1;\n {\n S_c2175048 memory r_1_0;\n {\n bytes32 r_1_0_0 = bytes32(0x104c7a3a3937fb91de554c68fc992213218d90d447a8c6ec66f5b0879a35896d);\n r_1_0.s_0 = r_1_0_0;\n }\n {\n address r_1_0_1 = 0x3073a2d668F041Bd8c91c0D235109e98C8996232;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n bool r_1_0_2 = true;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n string memory r_1_0_3 = unicode\"Moo é🚀M M o🚀éoéooMMo🚀 ooé\";\n r_1_0.s_3 = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002003247f80a2fb8d5ef767924749fd777ca5d1c805f6d28bd35393c4239ab10a50000000000000000000000000172eb83128843dff3a2fb9b49899acee07fe281d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80c3a96fc3a9204df09f9a80c3a9f09f9a80f09f9a806f206f4dc3a9f09f9a80f09f9a80f09f9a8020204d204dc3a94d6f4d4df09f9a806f6f20f09f9a806f204d206ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020104c7a3a3937fb91de554c68fc992213218d90d447a8c6ec66f5b0879a35896d0000000000000000000000003073a2d668f041bd8c91c0d235109e98c89962320000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a804d204d206ff09f9a80c3a96fc3a96f6f4d4d6ff09f9a80206f6fc3a90000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes32[],(string,bool),bool,address)", + "type": "(bytes32[],(string,bool),bool,address)", + "value": [ + [], + ["Moo é🚀 oM o 🚀 🚀ooo éMoo🚀🚀oéM🚀Méoé", false], + true, + "0xc5daaCe1cF7e54aa9317A242B23c7d8D3c66FE9D" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oM o 🚀 🚀ooo éMoo🚀🚀oéM🚀Méoé" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xc5daaCe1cF7e54aa9317A242B23c7d8D3c66FE9D" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610283806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061017f565b60405180910390f35b6100566100d8565b61005e6100d8565b6040805160008082526020820190925282525060408051808201909152606081526000602082015260006040518060600160405280603881526020016102166038913982525060006020808301919091528201526001604082015273c5daace1cf7e54aa9317a242b23c7d8d3c66fe9d6060820152919050565b6040518060800160405280606081526020016101096040518060400160405280606081526020016000151581525090565b815260006020820181905260409091015290565b6000815160408452805180604086015260005b8181101561014d5760208184018101516060888401015201610130565b8181111561015f576000606083880101525b506020938401511515938501939093525050601f01601f19160160600190565b60208082528251608083830152805160a0840181905260009291820190839060c08601905b808310156101c457835182529284019260019290920191908401906101a4565b5092860151858403601f19016040870152926101e0818561011d565b935050505060408401516101f8606085018215159052565b5060608401516001600160a01b038116608085015250939250505056fe4d6f6f20c3a9f09f9a80206f4d206f20f09f9a8020f09f9a806f6f6f20c3a94d6f6ff09f9a80f09f9a806fc3a94df09f9a804dc3a96fc3a9a2646970667358221220947b3c88ef99916f1ef9a42ad5c862966255b41be3216ab3e76c9111ee6d93e264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fc3be6c5 {\n string s_0;\n bool s_1;\n }\n\n struct S_918316a5 {\n bytes32[] s_0;\n S_fc3be6c5 s_1;\n bool s_2;\n address s_3;\n }\n\n function test () public pure returns (S_918316a5 memory) {\n S_918316a5 memory r;\n {\n bytes32[] memory r_0 = new bytes32[](0);\n r.s_0 = r_0;\n }\n {\n S_fc3be6c5 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀 oM o 🚀 🚀ooo éMoo🚀🚀oéM🚀Méoé\";\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xc5daaCe1cF7e54aa9317A242B23c7d8D3c66FE9D;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c5daace1cf7e54aa9317a242b23c7d8d3c66fe9d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a80206f4d206f20f09f9a8020f09f9a806f6f6f20c3a94d6f6ff09f9a80f09f9a806fc3a94df09f9a804dc3a96fc3a90000000000000000" + }, + { + "name": "random-(bytes5,int40,address,bool,address[4])", + "type": "(bytes5,int40,address,bool,address[4])", + "value": [ + "0xfc759af65e", + "259170818151", + "0x3355b650eE38c9E6fdD4DC7f5a61220A34E05590", + false, + [ + "0xCC6BeA011d74662A83b0e7c59C739e273e054335", + "0x2ABeCfAC541c820be3aE3096E8FBB6Fd65D5bFD1", + "0x2d5e6056e043711e7C767AFBaF82F56421C6B4b3", + "0x311Aa2393001e116D976d5781661c2ACf2245bfa" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfc759af65e" + }, + { + "type": "number", + "value": "259170818151" + }, + { + "type": "address", + "value": "0x3355b650eE38c9E6fdD4DC7f5a61220A34E05590" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xCC6BeA011d74662A83b0e7c59C739e273e054335" + }, + { + "type": "address", + "value": "0x2ABeCfAC541c820be3aE3096E8FBB6Fd65D5bFD1" + }, + { + "type": "address", + "value": "0x2d5e6056e043711e7C767AFBaF82F56421C6B4b3" + }, + { + "type": "address", + "value": "0x311Aa2393001e116D976d5781661c2ACf2245bfa" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610216806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061015f565b60405180910390f35b61005661010c565b61005e61010c565b647e3acd7b2f60d91b8152643c57c8d8676020820152733355b650ee38c9e6fdd4dc7f5a61220a34e0559060408201526000606082015261009d610141565b73cc6bea011d74662a83b0e7c59c739e273e0543358152732abecfac541c820be3ae3096e8fbb6fd65d5bfd16020820152732d5e6056e043711e7c767afbaf82f56421c6b4b3604082015273311aa2393001e116d976d5781661c2acf2245bfa60608201526080820152919050565b6040805160a08101825260008082526020820181905291810182905260608101919091526080810161013c610141565b905290565b60405180608001604052806004906020820280368337509192915050565b81516001600160d81b0319168152602080830151600490810b828401526040808501516001600160a01b03908116918501919091526060808601511515908501526080808601516101008601949390929091860160005b838110156101d45784518316825293850193908501906001016101b6565b5050505050509291505056fea26469706673582212202634a2862d4d52d95aef190537f90d041e9bb97760c0836dd028d9c7fe364d9f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e2c8e2cd {\n bytes5 s_0;\n int40 s_1;\n address s_2;\n bool s_3;\n address[4] s_4;\n }\n\n function test () public pure returns (S_e2c8e2cd memory) {\n S_e2c8e2cd memory r;\n {\n bytes5 r_0 = bytes5(0xfc759af65e);\n r.s_0 = r_0;\n }\n {\n int40 r_1 = 259170818151;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x3355b650eE38c9E6fdD4DC7f5a61220A34E05590;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n address[4] memory r_4;\n {\n address r_4_0 = 0xCC6BeA011d74662A83b0e7c59C739e273e054335;\n r_4[0] = r_4_0;\n }\n {\n address r_4_1 = 0x2ABeCfAC541c820be3aE3096E8FBB6Fd65D5bFD1;\n r_4[1] = r_4_1;\n }\n {\n address r_4_2 = 0x2d5e6056e043711e7C767AFBaF82F56421C6B4b3;\n r_4[2] = r_4_2;\n }\n {\n address r_4_3 = 0x311Aa2393001e116D976d5781661c2ACf2245bfa;\n r_4[3] = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0xfc759af65e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c57c8d8670000000000000000000000003355b650ee38c9e6fdd4dc7f5a61220a34e055900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc6bea011d74662a83b0e7c59c739e273e0543350000000000000000000000002abecfac541c820be3ae3096e8fbb6fd65d5bfd10000000000000000000000002d5e6056e043711e7c767afbaf82f56421c6b4b3000000000000000000000000311aa2393001e116d976d5781661c2acf2245bfa" + }, + { + "name": "random-(bytes9,(bytes3,address),int112,bytes20,uint104)", + "type": "(bytes9,(bytes3,address),int112,bytes20,uint104)", + "value": [ + "0xace36907e7b3d61eb0", + ["0xef1da0", "0x2b8D094D368208D2A7Bd540D5A0a7DAA85055397"], + "1129402433323912905501035610239601", + "0xc57a542f4f312d886a764b7727c020e5d23118b3", + "13438671187944251579857083283305" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xace36907e7b3d61eb0" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xef1da0" + }, + { + "type": "address", + "value": "0x2b8D094D368208D2A7Bd540D5A0a7DAA85055397" + } + ] + }, + { + "type": "number", + "value": "1129402433323912905501035610239601" + }, + { + "type": "hexstring", + "value": "0xc57a542f4f312d886a764b7727c020e5d23118b3" + }, + { + "type": "number", + "value": "13438671187944251579857083283305" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101d6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6100386100be565b6040805182516001600160b81b031916815260208084015180516001600160e81b0319168284015201516001600160a01b03168183015290820151600d0b6060808301919091528201516bffffffffffffffffffffffff1916608080830191909152909101516cffffffffffffffffffffffffff1660a082015260c00160405180910390f35b6100c6610158565b6100ce610158565b680ace36907e7b3d61eb60bc1b8152604080518082018252620778ed60ed1b8152732b8d094d368208d2a7bd540d5a0a7daa850553976020808301919091528301526d37af10149da2127158b70c6bf2719082015273c57a542f4f312d886a764b7727c020e5d23118b360601b60608201526ca99eb043e0602810821cb7b7696080820152919050565b6040805160a081019091526000815260208101610185604080518082019091526000808252602082015290565b8152600060208201819052604082018190526060909101529056fea2646970667358221220c1847ca4a9c5b614944e0c22fc5c5e51d94f1b13f32d8250235916318234025164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9e092c52 {\n bytes3 s_0;\n address s_1;\n }\n\n struct S_08328e5a {\n bytes9 s_0;\n S_9e092c52 s_1;\n int112 s_2;\n bytes20 s_3;\n uint104 s_4;\n }\n\n function test () public pure returns (S_08328e5a memory) {\n S_08328e5a memory r;\n {\n bytes9 r_0 = bytes9(0xace36907e7b3d61eb0);\n r.s_0 = r_0;\n }\n {\n S_9e092c52 memory r_1;\n {\n bytes3 r_1_0 = bytes3(0xef1da0);\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x2b8D094D368208D2A7Bd540D5A0a7DAA85055397;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n int112 r_2 = 1129402433323912905501035610239601;\n r.s_2 = r_2;\n }\n {\n bytes20 r_3 = bytes20(0xC57a542f4F312D886A764b7727c020E5d23118b3);\n r.s_3 = r_3;\n }\n {\n uint104 r_4 = 13438671187944251579857083283305;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0xace36907e7b3d61eb00000000000000000000000000000000000000000000000ef1da000000000000000000000000000000000000000000000000000000000000000000000000000000000002b8d094d368208d2a7bd540d5a0a7daa8505539700000000000000000000000000000000000037af10149da2127158b70c6bf271c57a542f4f312d886a764b7727c020e5d23118b300000000000000000000000000000000000000000000000000000000000000a99eb043e0602810821cb7b769" + }, + { + "name": "random-(int120,string,(address,string),bool[3])", + "type": "(int120,string,(address,string),bool[3])", + "value": [ + "-221161317840218054621014541690336966", + "Moo é🚀 éMé é🚀 Méo🚀éMéo éM éééoéo Mo", + [ + "0xa7b3bC2D6CDF7F7294e046142a0489C7dD45D038", + "Moo é🚀oé🚀🚀ééoooé o🚀🚀 ééooéoMo oé éoMéoo MM éMééooo🚀M🚀 o" + ], + [false, true, false] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-221161317840218054621014541690336966" + }, + { + "type": "string", + "value": "Moo é🚀 éMé é🚀 Méo🚀éMéo éM éééoéo Mo" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa7b3bC2D6CDF7F7294e046142a0489C7dD45D038" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀🚀ééoooé o🚀🚀 ééooéoMo oé éoMéoo MM éMééooo🚀M🚀 o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610314806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ad565b60405180910390f35b610056610105565b61005e610105565b6e2a9818473c1b3e35f73cec2925f6c51981526040805160608101909152603d808252600091906102a2602083013960208381019190915260408051808201825260608184015273a7b3bc2d6cdf7f7294e046142a0489c7dd45d0388152815160808101909252605b8083529093506000926102479083013960208301525060408201526100ea610142565b60008082526001602083015260408201526060820152919050565b60408051608081018252600080825260606020808401829052845180860186529283528201529091820190815260200161013d610142565b905290565b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b818110156101865760208185018101518683018201520161016a565b81811115610198576000602083870101525b50601f01601f19169290920160200192915050565b600060208083528351600e0b818401528084015160c060408501526101d560e0850182610160565b604086810151868303601f1901606088015280516001600160a01b0316835284015184830182905291925061020c90830182610160565b91505060608501516080850160005b600381101561023a57825115158252918401919084019060010161021b565b5091969550505050505056fe4d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a80c3a9c3a96f6f6fc3a920206ff09f9a80f09f9a8020c3a9c3a96f6fc3a96f4d6f206fc3a920c3a96f4dc3a96f6f204d4d20c3a94dc3a9c3a96f6f6ff09f9a804df09f9a80206f4d6f6f20c3a9f09f9a802020c3a94dc3a920c3a9f09f9a802020204dc3a96ff09f9a80c3a94dc3a96f20c3a94d2020c3a9c3a9c3a96fc3a96f20204d6fa2646970667358221220a885dde2e70062ff75a1cb95f5c6f16b53ea7845f2023dbe62a15df9a28c2e6164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8090aaf4 {\n address s_0;\n string s_1;\n }\n\n struct S_d5868a2d {\n int120 s_0;\n string s_1;\n S_8090aaf4 s_2;\n bool[3] s_3;\n }\n\n function test () public pure returns (S_d5868a2d memory) {\n S_d5868a2d memory r;\n {\n int120 r_0 = -221161317840218054621014541690336966;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 éMé é🚀 Méo🚀éMéo éM éééoéo Mo\";\n r.s_1 = r_1;\n }\n {\n S_8090aaf4 memory r_2;\n {\n address r_2_0 = 0xa7b3bC2D6CDF7F7294e046142a0489C7dD45D038;\n r_2.s_0 = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀oé🚀🚀ééoooé o🚀🚀 ééooéoMo oé éoMéoo MM éMééooo🚀M🚀 o\";\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n bool[3] memory r_3;\n {\n bool r_3_0 = false;\n r_3[0] = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3[1] = r_3_1;\n }\n {\n bool r_3_2 = false;\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffffffffffffffffffffffffffffffffffd567e7b8c3e4c1ca08c313d6da093a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a802020c3a94dc3a920c3a9f09f9a802020204dc3a96ff09f9a80c3a94dc3a96f20c3a94d2020c3a9c3a9c3a96fc3a96f20204d6f000000000000000000000000000000a7b3bc2d6cdf7f7294e046142a0489c7dd45d0380000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a80c3a9c3a96f6f6fc3a920206ff09f9a80f09f9a8020c3a9c3a96f6fc3a96f4d6f206fc3a920c3a96f4dc3a96f6f204d4d20c3a94dc3a9c3a96f6f6ff09f9a804df09f9a80206f0000000000" + }, + { + "name": "random-(int120,string,bool,bytes19[1],string)", + "type": "(int120,string,bool,bytes19[1],string)", + "value": [ + "301907582496543327254000170713017144", + "Moo é🚀Mo Mo🚀MMoM ooé🚀o🚀 oé🚀é oooMMoéoo oooo", + false, + ["0x691a067ae781193d74fd9b6f720e2bc59068db"], + "Moo é🚀oMoooMMéo🚀o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "301907582496543327254000170713017144" + }, + { + "type": "string", + "value": "Moo é🚀Mo Mo🚀MMoM ooé🚀o🚀 oé🚀é oooMMoéoo oooo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x691a067ae781193d74fd9b6f720e2bc59068db" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMoooMMéo🚀o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102ad806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019c565b60405180910390f35b6100566100fd565b61005e6100fd565b6e3a25316bcfe4fa64a6e88f6258eb38815260408051608081019091526043808252600091906102356020830139602083015250600060408201526100a1610131565b72691a067ae781193d74fd9b6f720e2bc59068db60681b8152606082015260408051808201909152601981527f4d6f6f20c3a9f09f9a806f4d6f6f6f4d4dc3a96ff09f9a806f0000000000000060208201526080820152919050565b6040805160a081018252600080825260606020830181905292820152908101610124610131565b8152602001606081525090565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b8181101561017557602081850181015186830182015201610159565b81811115610187576000602083870101525b50601f01601f19169290920160200192915050565b600060208083528351600e0b818401528084015160a060408501526101c460c085018261014f565b905060408501511515606085015260608501516080850160005b600181101561020b5782516cffffffffffffffffffffffffff1916825291840191908401906001016101de565b5050506080850151848203601f190160a0860152915061022b818361014f565b9594505050505056fe4d6f6f20c3a9f09f9a804d6f20204d6ff09f9a804d4d6f4d206f6fc3a9f09f9a806ff09f9a80202020206fc3a9f09f9a80c3a9206f6f6f4d4d6fc3a96f6f206f6f6f6fa2646970667358221220d5a6cbd43137c7f34cd597ff36dca751d96290eeae7d8dcb3fe586c736407f2864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b6e9282b {\n int120 s_0;\n string s_1;\n bool s_2;\n bytes19[1] s_3;\n string s_4;\n }\n\n function test () public pure returns (S_b6e9282b memory) {\n S_b6e9282b memory r;\n {\n int120 r_0 = 301907582496543327254000170713017144;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀Mo Mo🚀MMoM ooé🚀o🚀 oé🚀é oooMMoéoo oooo\";\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bytes19[1] memory r_3;\n {\n bytes19 r_3_0 = bytes19(0x691a067ae781193d74fd9b6f720e2bc59068db);\n r_3[0] = r_3_0;\n }\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀oMoooMMéo🚀o\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000003a25316bcfe4fa64a6e88f6258eb3800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000691a067ae781193d74fd9b6f720e2bc59068db00000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a804d6f20204d6ff09f9a804d4d6f4d206f6fc3a9f09f9a806ff09f9a80202020206fc3a9f09f9a80c3a9206f6f6f4d4d6fc3a96f6f206f6f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a806f4d6f6f6f4d4dc3a96ff09f9a806f00000000000000" + }, + { + "name": "random-(int152,(address[4],address,bytes25),bytes13)", + "type": "(int152,(address[4],address,bytes25),bytes13)", + "value": [ + "-2453718198802164681212404348048429447601769848", + [ + [ + "0xeC5EfD609373C7b2b6B4A1DB6c0eb729f0d7142A", + "0x5dC740b078892aA169e85B1fA242881Fc0F63F28", + "0x95Ee34947c3E28934112498cE83B7C5de11b6007", + "0x62F7177452c0F08ae8445c3fBBaDbA8410a5f289" + ], + "0xf733aAB4D81C8370dD25E967B43FDb233e4c9E64", + "0x0a4ecb313ca3f0651e1ea8c53ba131cc94a9044208c980de4d" + ], + "0x7d6d513b2230ad5ae226aa3b25" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-2453718198802164681212404348048429447601769848" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xeC5EfD609373C7b2b6B4A1DB6c0eb729f0d7142A" + }, + { + "type": "address", + "value": "0x5dC740b078892aA169e85B1fA242881Fc0F63F28" + }, + { + "type": "address", + "value": "0x95Ee34947c3E28934112498cE83B7C5de11b6007" + }, + { + "type": "address", + "value": "0x62F7177452c0F08ae8445c3fBBaDbA8410a5f289" + } + ] + }, + { + "type": "address", + "value": "0xf733aAB4D81C8370dD25E967B43FDb233e4c9E64" + }, + { + "type": "hexstring", + "value": "0x0a4ecb313ca3f0651e1ea8c53ba131cc94a9044208c980de4d" + } + ] + }, + { + "type": "hexstring", + "value": "0x7d6d513b2230ad5ae226aa3b25" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c2565b60405180910390f35b610056610153565b61005e610153565b726e074db3f819a3c47b489b1b847261d168cd7719815261007d61017d565b6100856101a4565b73ec5efd609373c7b2b6b4a1db6c0eb729f0d7142a8152735dc740b078892aa169e85b1fa242881fc0f63f286020808301919091527395ee34947c3e28934112498ce83b7c5de11b60076040808401919091527362f7177452c0f08ae8445c3fbbadba8410a5f289606084015291835273f733aab4d81c8370dd25e967b43fdb233e4c9e64838201527f0a4ecb313ca3f0651e1ea8c53ba131cc94a9044208c980de4d00000000000000838301528301919091526c7d6d513b2230ad5ae226aa3b2560981b90820152919050565b6040518060600160405280600060120b815260200161017061017d565b8152600060209091015290565b60405180606001604052806101906101a4565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b815160120b81526020808301518051610100840192919060008386015b60048210156102075782516001600160a01b03168152918401916001919091019084016101df565b505050908101516001600160a01b031660a084015260409081015166ffffffffffffff191660c0840152929092015172ffffffffffffffffffffffffffffffffffffff191660e0909101529056fea264697066735822122056ad3414c2aa95257a7f4345478e4f4c8e984e475b186950769421e90fdd0ba464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_73245b55 {\n address[4] s_0;\n address s_1;\n bytes25 s_2;\n }\n\n struct S_5862373d {\n int152 s_0;\n S_73245b55 s_1;\n bytes13 s_2;\n }\n\n function test () public pure returns (S_5862373d memory) {\n S_5862373d memory r;\n {\n int152 r_0 = -2453718198802164681212404348048429447601769848;\n r.s_0 = r_0;\n }\n {\n S_73245b55 memory r_1;\n {\n address[4] memory r_1_0;\n {\n address r_1_0_0 = 0xeC5EfD609373C7b2b6B4A1DB6c0eb729f0d7142A;\n r_1_0[0] = r_1_0_0;\n }\n {\n address r_1_0_1 = 0x5dC740b078892aA169e85B1fA242881Fc0F63F28;\n r_1_0[1] = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x95Ee34947c3E28934112498cE83B7C5de11b6007;\n r_1_0[2] = r_1_0_2;\n }\n {\n address r_1_0_3 = 0x62F7177452c0F08ae8445c3fBBaDbA8410a5f289;\n r_1_0[3] = r_1_0_3;\n }\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0xf733aAB4D81C8370dD25E967B43FDb233e4c9E64;\n r_1.s_1 = r_1_1;\n }\n {\n bytes25 r_1_2 = bytes25(0x0a4ecb313ca3f0651e1ea8c53ba131cc94a9044208c980de4d);\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bytes13 r_2 = bytes13(0x7d6d513b2230ad5ae226aa3b25);\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffffff91f8b24c07e65c3b84b764e47b8d9e2e973288000000000000000000000000ec5efd609373c7b2b6b4a1db6c0eb729f0d7142a0000000000000000000000005dc740b078892aa169e85b1fa242881fc0f63f2800000000000000000000000095ee34947c3e28934112498ce83b7c5de11b600700000000000000000000000062f7177452c0f08ae8445c3fbbadba8410a5f289000000000000000000000000f733aab4d81c8370dd25e967b43fdb233e4c9e640a4ecb313ca3f0651e1ea8c53ba131cc94a9044208c980de4d000000000000007d6d513b2230ad5ae226aa3b2500000000000000000000000000000000000000" + }, + { + "name": "random-(int256,address,address,int208,address)[4]", + "type": "(int256,address,address,int208,address)[4]", + "value": [ + [ + "-32517337656861816393800761574512885268816930430638612856723644878525268467450", + "0xcC74d324D75899ba94EBa0b3A9bA8C655B4dDFa8", + "0x92C533A97CaCadE70A0adC46559EE211B3D4Ea1F", + "-131145666202846258964901962026087889493320136493395794380140003", + "0x19430153F8c5cFfA56db1F3F0218c3c33e6E3397" + ], + [ + "-46699757622488021205975198484910198029894832052518122093531789591286511414501", + "0xE5D312433036e6884ed37D8C5dF76B7435906854", + "0x9828445dAdF90DE64AeB6087C4C5bDb9F07d638a", + "-137584836080352268424643397488685832332683003511842838251046732", + "0x6e8750E0A6c998D0c3Bd82E8549db58e07618eeF" + ], + [ + "-17000759915377003076552682825593605949755896572721321804408406665756599942650", + "0x165ED956ce900cd0c15A38bFBd847FD190eD9708", + "0x37b14201aC803e843Cc2F9E3a58fF03F42AeD0b9", + "193111218971785108166666253788379054575766460286164621001214525", + "0xa1b7E53bE7d8384Ca30597a39961F615C944EDD8" + ], + [ + "44926586942917090353474311838159048951723704322588463648163234588600766632586", + "0x73846A0C89A2833d86B3d5389c72c8dBa0db4ea6", + "0xC97F3349f09472bbF273fD8804B3eB9D97379ed4", + "127572433814151555192161874095507738894005666829516338641641131", + "0xEd0a46aeC3Aa6b2fc0f190c3415FfE6c6210360b" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-32517337656861816393800761574512885268816930430638612856723644878525268467450" + }, + { + "type": "address", + "value": "0xcC74d324D75899ba94EBa0b3A9bA8C655B4dDFa8" + }, + { + "type": "address", + "value": "0x92C533A97CaCadE70A0adC46559EE211B3D4Ea1F" + }, + { + "type": "number", + "value": "-131145666202846258964901962026087889493320136493395794380140003" + }, + { + "type": "address", + "value": "0x19430153F8c5cFfA56db1F3F0218c3c33e6E3397" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-46699757622488021205975198484910198029894832052518122093531789591286511414501" + }, + { + "type": "address", + "value": "0xE5D312433036e6884ed37D8C5dF76B7435906854" + }, + { + "type": "address", + "value": "0x9828445dAdF90DE64AeB6087C4C5bDb9F07d638a" + }, + { + "type": "number", + "value": "-137584836080352268424643397488685832332683003511842838251046732" + }, + { + "type": "address", + "value": "0x6e8750E0A6c998D0c3Bd82E8549db58e07618eeF" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-17000759915377003076552682825593605949755896572721321804408406665756599942650" + }, + { + "type": "address", + "value": "0x165ED956ce900cd0c15A38bFBd847FD190eD9708" + }, + { + "type": "address", + "value": "0x37b14201aC803e843Cc2F9E3a58fF03F42AeD0b9" + }, + { + "type": "number", + "value": "193111218971785108166666253788379054575766460286164621001214525" + }, + { + "type": "address", + "value": "0xa1b7E53bE7d8384Ca30597a39961F615C944EDD8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "44926586942917090353474311838159048951723704322588463648163234588600766632586" + }, + { + "type": "address", + "value": "0x73846A0C89A2833d86B3d5389c72c8dBa0db4ea6" + }, + { + "type": "address", + "value": "0xC97F3349f09472bbF273fD8804B3eB9D97379ed4" + }, + { + "type": "number", + "value": "127572433814151555192161874095507738894005666829516338641641131" + }, + { + "type": "address", + "value": "0xEd0a46aeC3Aa6b2fc0f190c3415FfE6c6210360b" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103e1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061033b565b60405180910390f35b6100566102e0565b61005e6102e0565b61006661030d565b7fb81bd6cf9785bdb4452210711fc289af145da15dbb86523af72d44b927ac6106815273cc74d324d75899ba94eba0b3a9ba8c655b4ddfa860208201527392c533a97cacade70a0adc46559ee211b3d4ea1f604082015279519cb5c29c7f8cc8d5194646262d16803c59019839040bd32de21960608201527319430153f8c5cffa56db1f3f0218c3c33e6e33976080820152815261010261030d565b7f98c0dfb5e91a39a0db5e6a28aa113392a2bea98f350df528e0d300714b32531b815273e5d312433036e6884ed37d8c5df76b7435906854602080830191909152739828445dadf90de64aeb6087c4c5bdb9f07d638a604083015279559e8768f7628eb902213a086452350405555ae6f1a971d4074b196060830152736e8750e0a6c998d0c3bd82e8549db58e07618eef60808301528201526101a361030d565b7fda69e92f8e23d9ec21816604b25204b62eccb68587353dc2fdeab74ce4ab8206815273165ed956ce900cd0c15a38bfbd847fd190ed970860208201527337b14201ac803e843cc2f9e3a58ff03f42aed0b960408083019190915279782c645ff6ac79fd786b086cb4e94a5a46c8620649101f7fca3d606083015273a1b7e53be7d8384ca30597a39961f615c944edd8608083015282015261024361030d565b7f63538c0e2e3ca1cc8cd5eca6fba2571308bdc2b6dde215b8940f17d591b9128a81527373846a0c89a2833d86b3d5389c72c8dba0db4ea6602082015273c97f3349f09472bbf273fd8804b3eb9d97379ed46040820152794f637613c7095e8127d3c591ba4eedd55734234f5d25ad661eab60608083019190915273ed0a46aec3aa6b2fc0f190c3415ffe6c6210360b6080830152820152919050565b60405180608001604052806004905b6102f761030d565b8152602001906001900390816102ef5790505090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6102808101818360005b60048110156103a2578151805184526020808201516001600160a01b039081168287015260408084015182169087015260608084015160190b90870152608092830151169185019190915260a09093019290910190600101610345565b5050509291505056fea26469706673582212206e63a0104cb5cd23df8b40327f66b4543e970f8921454d1ec9b9d2fd3e90a5ba64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6fefab69 {\n int256 s_0;\n address s_1;\n address s_2;\n int208 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_6fefab69[4] memory) {\n S_6fefab69[4] memory r;\n {\n S_6fefab69 memory r_0;\n {\n int256 r_0_0 = -32517337656861816393800761574512885268816930430638612856723644878525268467450;\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0xcC74d324D75899ba94EBa0b3A9bA8C655B4dDFa8;\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x92C533A97CaCadE70A0adC46559EE211B3D4Ea1F;\n r_0.s_2 = r_0_2;\n }\n {\n int208 r_0_3 = -131145666202846258964901962026087889493320136493395794380140003;\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x19430153F8c5cFfA56db1F3F0218c3c33e6E3397;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_6fefab69 memory r_1;\n {\n int256 r_1_0 = -46699757622488021205975198484910198029894832052518122093531789591286511414501;\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0xE5D312433036e6884ed37D8C5dF76B7435906854;\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0x9828445dAdF90DE64AeB6087C4C5bDb9F07d638a;\n r_1.s_2 = r_1_2;\n }\n {\n int208 r_1_3 = -137584836080352268424643397488685832332683003511842838251046732;\n r_1.s_3 = r_1_3;\n }\n {\n address r_1_4 = 0x6e8750E0A6c998D0c3Bd82E8549db58e07618eeF;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_6fefab69 memory r_2;\n {\n int256 r_2_0 = -17000759915377003076552682825593605949755896572721321804408406665756599942650;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x165ED956ce900cd0c15A38bFBd847FD190eD9708;\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0x37b14201aC803e843Cc2F9E3a58fF03F42AeD0b9;\n r_2.s_2 = r_2_2;\n }\n {\n int208 r_2_3 = 193111218971785108166666253788379054575766460286164621001214525;\n r_2.s_3 = r_2_3;\n }\n {\n address r_2_4 = 0xa1b7E53bE7d8384Ca30597a39961F615C944EDD8;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n {\n S_6fefab69 memory r_3;\n {\n int256 r_3_0 = 44926586942917090353474311838159048951723704322588463648163234588600766632586;\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0x73846A0C89A2833d86B3d5389c72c8dBa0db4ea6;\n r_3.s_1 = r_3_1;\n }\n {\n address r_3_2 = 0xC97F3349f09472bbF273fD8804B3eB9D97379ed4;\n r_3.s_2 = r_3_2;\n }\n {\n int208 r_3_3 = 127572433814151555192161874095507738894005666829516338641641131;\n r_3.s_3 = r_3_3;\n }\n {\n address r_3_4 = 0xEd0a46aeC3Aa6b2fc0f190c3415FfE6c6210360b;\n r_3.s_4 = r_3_4;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0xb81bd6cf9785bdb4452210711fc289af145da15dbb86523af72d44b927ac6106000000000000000000000000cc74d324d75899ba94eba0b3a9ba8c655b4ddfa800000000000000000000000092c533a97cacade70a0adc46559ee211b3d4ea1fffffffffffffae634a3d638073372ae6b9b9d9d2e97fc3a6fe67c6fbf42cd21d00000000000000000000000019430153f8c5cffa56db1f3f0218c3c33e6e339798c0dfb5e91a39a0db5e6a28aa113392a2bea98f350df528e0d300714b32531b000000000000000000000000e5d312433036e6884ed37d8c5df76b74359068540000000000000000000000009828445dadf90de64aeb6087c4c5bdb9f07d638affffffffffffaa617897089d7146fddec5f79badcafbfaaaa5190e568e2bf8b40000000000000000000000006e8750e0a6c998d0c3bd82e8549db58e07618eefda69e92f8e23d9ec21816604b25204b62eccb68587353dc2fdeab74ce4ab8206000000000000000000000000165ed956ce900cd0c15a38bfbd847fd190ed970800000000000000000000000037b14201ac803e843cc2f9e3a58ff03f42aed0b9000000000000782c645ff6ac79fd786b086cb4e94a5a46c8620649101f7fca3d000000000000000000000000a1b7e53be7d8384ca30597a39961f615c944edd863538c0e2e3ca1cc8cd5eca6fba2571308bdc2b6dde215b8940f17d591b9128a00000000000000000000000073846a0c89a2833d86b3d5389c72c8dba0db4ea6000000000000000000000000c97f3349f09472bbf273fd8804b3eb9d97379ed40000000000004f637613c7095e8127d3c591ba4eedd55734234f5d25ad661eab000000000000000000000000ed0a46aec3aa6b2fc0f190c3415ffe6c6210360b" + }, + { + "name": "random-(int40,string[],address,bytes12[])", + "type": "(int40,string[],address,bytes12[])", + "value": [ + "-17288832820", + [ + "Moo é🚀oM", + "Moo é🚀Mo oM🚀o éé o Méo🚀M MééMMoéo M ooMMooM oooMo", + "Moo é🚀🚀oMo M🚀🚀ooo🚀éMMoM🚀oo M ooMo🚀oo é🚀ooooéooMéoM🚀MoMM", + "Moo é🚀 é🚀 o🚀 ooo🚀M🚀é 🚀🚀ééé🚀éoooooéoéo" + ], + "0x5AAD216dDF653994b1F4F9243b4ad0f63638678e", + ["0x2988be9c736331c9a61f4e3e", "0x55b6e7e2e82ccac9acfddc6d"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-17288832820" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM" + }, + { + "type": "string", + "value": "Moo é🚀Mo oM🚀o éé o Méo🚀M MééMMoéo M ooMMooM oooMo" + }, + { + "type": "string", + "value": "Moo é🚀🚀oMo M🚀🚀ooo🚀éMMoM🚀oo M ooMo🚀oo é🚀ooooéooMéoM🚀MoMM" + }, + { + "type": "string", + "value": "Moo é🚀 é🚀 o🚀 ooo🚀M🚀é 🚀🚀ééé🚀éoooooéoéo" + } + ] + }, + { + "type": "address", + "value": "0x5AAD216dDF653994b1F4F9243b4ad0f63638678e" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2988be9c736331c9a61f4e3e" + }, + { + "type": "hexstring", + "value": "0x55b6e7e2e82ccac9acfddc6d" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610500806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102e8565b60405180910390f35b604080516080810182526000808252606060208301819052928201528181019190915260408051608081018252600080825260606020830181905292820152818101919091526404067ea73319815260408051600480825260a08201909252600091816020015b60608152602001906001900390816100b557905050905060006040518060400160405280600c81526020016b4d6f6f20c3a9f09f9a806f4d60a01b81525090508082600081518110610109576101096103d3565b60200260200101819052505060006040518060800160405280604481526020016103ea6044913990508082600181518110610146576101466103d3565b602002602001018190525050600060405180608001604052806057815260200161042e6057913990508082600281518110610183576101836103d3565b602002602001018190525050600060405180608001604052806046815260200161048560469139905080826003815181106101c0576101c06103d3565b60209081029190910181019190915283019190915250735aad216ddf653994b1f4f9243b4ad0f63638678e6040808301919091528051600280825260608201909252600091816020016020820280368337505081519192506b14c45f4e39b198e4d30fa71f60a11b91829150839060009061023d5761023d6103d3565b6001600160a01b0319909216602092830291909101909101525080516b55b6e7e2e82ccac9acfddc6d60a01b9081908390600190811061027f5761027f6103d3565b6001600160a01b031990921660209283029190910190910152506060820152919050565b600081518084526020808501945080840160005b838110156102dd5781516001600160a01b031916875295820195908201906001016102b7565b509495945050505050565b6000602080835260a08301845160040b82850152818501516080604086015281815180845260c08701915060c08160051b880101935084830192506000805b8281101561038c5788860360bf1901845284518051808852835b8181101561035c578281018a01518982018b01528901610341565b8181111561036c57848a838b0101525b50601f01601f191696909601870195509386019392860192600101610327565b5050505050604085015191506103ad60608501836001600160a01b03169052565b6060850151848203601f1901608086015291506103ca81836102a3565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d6f206f4df09f9a806f2020c3a9c3a9206f204dc3a96ff09f9a804d204dc3a9c3a94d4d6fc3a96f2020204d206f6f4d4d6f6f4d206f6f6f4d6f4d6f6f20c3a9f09f9a80f09f9a806f4d6f204df09f9a80f09f9a806f6f6ff09f9a80c3a94d4d6f4df09f9a806f6f204d206f6f4d6ff09f9a806f6f20c3a9f09f9a806f6f6f6fc3a96f6f4dc3a96f4df09f9a804d6f4d4d4d6f6f20c3a9f09f9a8020c3a9f09f9a80206ff09f9a80206f6f6ff09f9a804df09f9a80c3a920f09f9a80f09f9a80c3a9c3a9c3a9f09f9a80c3a96f6f6f6f6fc3a96fc3a96fa2646970667358221220783ed052ecfb45dd51fe820eb8090d98761326b6edbb89adad2bf42eaf2644eb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_179eecec {\n int40 s_0;\n string[] s_1;\n address s_2;\n bytes12[] s_3;\n }\n\n function test () public pure returns (S_179eecec memory) {\n S_179eecec memory r;\n {\n int40 r_0 = -17288832820;\n r.s_0 = r_0;\n }\n {\n string[] memory r_1 = new string[](4);\n {\n string memory r_1_0 = unicode\"Moo é🚀oM\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀Mo oM🚀o éé o Méo🚀M MééMMoéo M ooMMooM oooMo\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀🚀oMo M🚀🚀ooo🚀éMMoM🚀oo M ooMo🚀oo é🚀ooooéooMéoM🚀MoMM\";\n r_1[2] = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀 é🚀 o🚀 ooo🚀M🚀é 🚀🚀ééé🚀éoooooéoéo\";\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x5AAD216dDF653994b1F4F9243b4ad0f63638678e;\n r.s_2 = r_2;\n }\n {\n bytes12[] memory r_3 = new bytes12[](2);\n {\n bytes12 r_3_0 = bytes12(0x2988be9c736331c9a61f4e3e);\n r_3[0] = r_3_0;\n }\n {\n bytes12 r_3_1 = bytes12(0x55b6e7e2e82ccac9acfddc6d);\n r_3[1] = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffbf98158cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000005aad216ddf653994b1f4f9243b4ad0f63638678e00000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a806f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a804d6f206f4df09f9a806f2020c3a9c3a9206f204dc3a96ff09f9a804d204dc3a9c3a94d4d6fc3a96f2020204d206f6f4d4d6f6f4d206f6f6f4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80f09f9a806f4d6f204df09f9a80f09f9a806f6f6ff09f9a80c3a94d4d6f4df09f9a806f6f204d206f6f4d6ff09f9a806f6f20c3a9f09f9a806f6f6f6fc3a96f6f4dc3a96f4df09f9a804d6f4d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a8020c3a9f09f9a80206ff09f9a80206f6f6ff09f9a804df09f9a80c3a920f09f9a80f09f9a80c3a9c3a9c3a9f09f9a80c3a96f6f6f6f6fc3a96fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022988be9c736331c9a61f4e3e000000000000000000000000000000000000000055b6e7e2e82ccac9acfddc6d0000000000000000000000000000000000000000" + }, + { + "name": "random-(string,((address,bool),(address),string),bool)", + "type": "(string,((address,bool),(address),string),bool)", + "value": [ + "Moo é🚀o🚀oo Moo MMoo🚀éo", + [ + ["0x6B57e3f3aDb3a4F3Db591D88E95Fc4ac61808Edd", false], + ["0xAf662e7592b54A677C7b9D615Ecb264c71a413F4"], + "Moo é🚀 M M 🚀MoMo oMMMM🚀o🚀o🚀é🚀éo o ééoo🚀🚀🚀Moéé🚀MéooM o" + ], + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀oo Moo MMoo🚀éo" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6B57e3f3aDb3a4F3Db591D88E95Fc4ac61808Edd" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xAf662e7592b54A677C7b9D615Ecb264c71a413F4" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 M M 🚀MoMo oMMMM🚀o🚀o🚀é🚀éo o ééoo🚀🚀🚀Moéé🚀MéooM o" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061030a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101cd565b60405180910390f35b610056610130565b61005e610130565b60006040518060600160405280602281526020016102b3602291398252506040805160a0810182526000606080830182815260808085018490529084528451602080820187528482528086019182528587019390935285518087018752808401859052736b57e3f3adb3a4f3db591d88e95fc4ac61808edd815285528551808401875273af662e7592b54a677c7b9d615ecb264c71a413f4815290528451908101909452605b808552929391929061025890830139604080840191909152602084019290925250600090820152919050565b6040805160608082018352808252825160a0810184526000818301818152608083018290528252845160208181018752918152828201529381019190915290918201908152600060209091015290565b6000815180845260005b818110156101a65760208185018101518683018201520161018a565b818111156101b8576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516060828501526101e96080850182610180565b905081850151601f19858303016040860152805160018060a01b0380825116845284820151151585850152808584015151166040850152505060408101519250506080606082015261023e6080820183610180565b915050604084015115156060840152809150509291505056fe4d6f6f20c3a9f09f9a80204d204d20f09f9a804d6f4d6f206f4d4d4d4df09f9a806ff09f9a806ff09f9a80c3a9f09f9a80c3a96f206f20c3a9c3a96f6ff09f9a80f09f9a80f09f9a804d6fc3a9c3a9f09f9a804dc3a96f6f4d206f4d6f6f20c3a9f09f9a806ff09f9a806f6f20204d6f6f204d4d6f6ff09f9a80c3a96fa2646970667358221220e7e275da331f8d5a24d537780f2f05b2cab10f1a31dbc6e242b62b8dc9c2e88664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5cde0d08 {\n address s_0;\n bool s_1;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_faeb6e62 {\n S_5cde0d08 s_0;\n S_421683f8 s_1;\n string s_2;\n }\n\n struct S_6cf69093 {\n string s_0;\n S_faeb6e62 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_6cf69093 memory) {\n S_6cf69093 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o🚀oo Moo MMoo🚀éo\";\n r.s_0 = r_0;\n }\n {\n S_faeb6e62 memory r_1;\n {\n S_5cde0d08 memory r_1_0;\n {\n address r_1_0_0 = 0x6B57e3f3aDb3a4F3Db591D88E95Fc4ac61808Edd;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bool r_1_0_1 = false;\n r_1_0.s_1 = r_1_0_1;\n }\n r_1.s_0 = r_1_0;\n }\n {\n S_421683f8 memory r_1_1;\n {\n address r_1_1_0 = 0xAf662e7592b54A677C7b9D615Ecb264c71a413F4;\n r_1_1.s_0 = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀 M M 🚀MoMo oMMMM🚀o🚀o🚀é🚀éo o ééoo🚀🚀🚀Moéé🚀MéooM o\";\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806ff09f9a806f6f20204d6f6f204d4d6f6ff09f9a80c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000006b57e3f3adb3a4f3db591d88e95fc4ac61808edd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af662e7592b54a677c7b9d615ecb264c71a413f40000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a80204d204d20f09f9a804d6f4d6f206f4d4d4d4df09f9a806ff09f9a806ff09f9a80c3a9f09f9a80c3a96f206f20c3a9c3a96f6ff09f9a80f09f9a80f09f9a804d6fc3a9c3a9f09f9a804dc3a96f6f4d206f0000000000" + }, + { + "name": "random-(string,(bytes16,bytes22,uint80,address,bool))", + "type": "(string,(bytes16,bytes22,uint80,address,bool))", + "value": [ + "Moo é🚀 ", + [ + "0xfd406d940be78b2fc5f67460682a778f", + "0xc09b8429013106808eb96c9b335a14ac5e3bc260142d", + "342056864759034795286724", + "0x4C7A2194B858c798c8C5733D7D90B79DACC408da", + false + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 " + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfd406d940be78b2fc5f67460682a778f" + }, + { + "type": "hexstring", + "value": "0xc09b8429013106808eb96c9b335a14ac5e3bc260142d" + }, + { + "type": "number", + "value": "342056864759034795286724" + }, + { + "type": "address", + "value": "0x4C7A2194B858c798c8C5733D7D90B79DACC408da" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061024c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610145565b60405180910390f35b6100566100fd565b61005e6100fd565b604080518082018252600b81526a026b7b79061d4f84fcd40160ad1b602080830191909152908352815160a081018352600060808201526ffd406d940be78b2fc5f67460682a778f60801b815275c09b8429013106808eb96c9b335a14ac5e3bc260142d60501b8183015269486ef0965b66b4e860c492810192909252734c7a2194b858c798c8c5733d7d90b79dacc408da6060830152820152919050565b6040518060400160405280606081526020016101406040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b905290565b60006020808352835160c08285015280518060e086015260005b8181101561017c578281018401518682016101000152830161015f565b8181111561018f57600061010083880101525b509482015180516fffffffffffffffffffffffffffffffff19166040868101919091529281015169ffffffffffffffffffff19166060808701919091529281015169ffffffffffffffffffff16608080870191909152928101516001600160a01b031660a08601529190910151151560c08401525050610100601f909201601f191601019056fea264697066735822122051ca673939a11fdfc05f7a2b1677f2969cc816f7024b88716e36e417efe8b71164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_94300fc9 {\n bytes16 s_0;\n bytes22 s_1;\n uint80 s_2;\n address s_3;\n bool s_4;\n }\n\n struct S_77c6ae44 {\n string s_0;\n S_94300fc9 s_1;\n }\n\n function test () public pure returns (S_77c6ae44 memory) {\n S_77c6ae44 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 \";\n r.s_0 = r_0;\n }\n {\n S_94300fc9 memory r_1;\n {\n bytes16 r_1_0 = bytes16(0xfd406d940be78b2fc5f67460682a778f);\n r_1.s_0 = r_1_0;\n }\n {\n bytes22 r_1_1 = bytes22(0xc09b8429013106808eb96c9b335a14ac5e3bc260142d);\n r_1.s_1 = r_1_1;\n }\n {\n uint80 r_1_2 = 342056864759034795286724;\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0x4C7A2194B858c798c8C5733D7D90B79DACC408da;\n r_1.s_3 = r_1_3;\n }\n {\n bool r_1_4 = false;\n r_1.s_4 = r_1_4;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0fd406d940be78b2fc5f67460682a778f00000000000000000000000000000000c09b8429013106808eb96c9b335a14ac5e3bc260142d0000000000000000000000000000000000000000000000000000000000000000486ef0965b66b4e860c40000000000000000000000004c7a2194b858c798c8c5733d7d90b79dacc408da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a8020000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,(bytes25[2],bytes24,bool)[3])", + "type": "(string,(bytes25[2],bytes24,bool)[3])", + "value": [ + "Moo é🚀M Mo ", + [ + [ + [ + "0xfeb3f764cc7e352e4d47e4cfa819a33b1549ca0cf09c1f1873", + "0x8650b96ec3a9487d809f79d5028dd0cd7450463057301dd983" + ], + "0xa980b03b6e2fc0038d8ddc624334584e02d07f0ca2d30123", + true + ], + [ + [ + "0xee2941455d89a6a89d2cb1e6a61237ae6b4b28645141b32f38", + "0x01b3d076560ae6a7a8f2237332eecfd7a0479443ed43581bea" + ], + "0xdd0acdd3466ad0176b5b9e1a75e4162faefdd7b8387fe8aa", + true + ], + [ + [ + "0xa6800740a06b967c15a91b9a97adfeadef360993e9d02032e9", + "0xd4c95720a1f3f38a1f75b765ae2ae1e4964002f0bc81ee1c2c" + ], + "0x2ed6071425ef33dcd730f319f53c2244fefe54759928db89", + true + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M Mo " + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfeb3f764cc7e352e4d47e4cfa819a33b1549ca0cf09c1f1873" + }, + { + "type": "hexstring", + "value": "0x8650b96ec3a9487d809f79d5028dd0cd7450463057301dd983" + } + ] + }, + { + "type": "hexstring", + "value": "0xa980b03b6e2fc0038d8ddc624334584e02d07f0ca2d30123" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xee2941455d89a6a89d2cb1e6a61237ae6b4b28645141b32f38" + }, + { + "type": "hexstring", + "value": "0x01b3d076560ae6a7a8f2237332eecfd7a0479443ed43581bea" + } + ] + }, + { + "type": "hexstring", + "value": "0xdd0acdd3466ad0176b5b9e1a75e4162faefdd7b8387fe8aa" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa6800740a06b967c15a91b9a97adfeadef360993e9d02032e9" + }, + { + "type": "hexstring", + "value": "0xd4c95720a1f3f38a1f75b765ae2ae1e4964002f0bc81ee1c2c" + } + ] + }, + { + "type": "hexstring", + "value": "0x2ed6071425ef33dcd730f319f53c2244fefe54759928db89" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103ef806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102da565b60405180910390f35b610056610249565b61005e610249565b60408051808201909152600f81526e026b7b79061d4f84fcd40269026b79608d1b6020820152815261008e610268565b610096610295565b61009e6102bc565b7ffeb3f764cc7e352e4d47e4cfa819a33b1549ca0cf09c1f18730000000000000081527f8650b96ec3a9487d809f79d5028dd0cd7450463057301dd983000000000000006020808301919091529082527fa980b03b6e2fc0038d8ddc624334584e02d07f0ca2d30123000000000000000090820152600160408201528152610124610295565b61012c6102bc565b7fee2941455d89a6a89d2cb1e6a61237ae6b4b28645141b32f380000000000000081527f01b3d076560ae6a7a8f2237332eecfd7a0479443ed43581bea000000000000006020808301919091529082527fdd0acdd3466ad0176b5b9e1a75e4162faefdd7b8387fe8aa000000000000000082820152600160408301528201526101b3610295565b6101bb6102bc565b7fa6800740a06b967c15a91b9a97adfeadef360993e9d02032e90000000000000081527fd4c95720a1f3f38a1f75b765ae2ae1e4964002f0bc81ee1c2c000000000000006020808301919091529082527f2ed6071425ef33dcd730f319f53c2244fefe54759928db890000000000000000828201526001604080840191909152830191909152820152919050565b604051806040016040528060608152602001610263610268565b905290565b60405180606001604052806003905b61027f610295565b8152602001906001900390816102775790505090565b60405180606001604052806102a86102bc565b815260006020820181905260409091015290565b60405180604001604052806002906020820280368337509192915050565b6000602080835283516101a0828501528051806101c086015260005b81811015610313578281018401518682016101e0015283016102f6565b818111156103265760006101e083880101525b50828601519150604080860160005b600381101561039f57845180518360005b600281101561036d57825166ffffffffffffff191682529189019190890190600101610346565b5050508087015167ffffffffffffffff1916838501528301511515606083015293850193608090910190600101610335565b505050601f01601f1916939093016101e00194935050505056fea264697066735822122001371a93d80ab9e588a13e8a2cd58cf2b6c09fb0a344170b8428c537574395b964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_27aa8e61 {\n bytes25[2] s_0;\n bytes24 s_1;\n bool s_2;\n }\n\n struct S_a83614a4 {\n string s_0;\n S_27aa8e61[3] s_1;\n }\n\n function test () public pure returns (S_a83614a4 memory) {\n S_a83614a4 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀M Mo \";\n r.s_0 = r_0;\n }\n {\n S_27aa8e61[3] memory r_1;\n {\n S_27aa8e61 memory r_1_0;\n {\n bytes25[2] memory r_1_0_0;\n {\n bytes25 r_1_0_0_0 = bytes25(0xfeb3f764cc7e352e4d47e4cfa819a33b1549ca0cf09c1f1873);\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n bytes25 r_1_0_0_1 = bytes25(0x8650b96ec3a9487d809f79d5028dd0cd7450463057301dd983);\n r_1_0_0[1] = r_1_0_0_1;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes24 r_1_0_1 = bytes24(0xa980b03b6e2fc0038d8ddc624334584e02d07f0ca2d30123);\n r_1_0.s_1 = r_1_0_1;\n }\n {\n bool r_1_0_2 = true;\n r_1_0.s_2 = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n {\n S_27aa8e61 memory r_1_1;\n {\n bytes25[2] memory r_1_1_0;\n {\n bytes25 r_1_1_0_0 = bytes25(0xee2941455d89a6a89d2cb1e6a61237ae6b4b28645141b32f38);\n r_1_1_0[0] = r_1_1_0_0;\n }\n {\n bytes25 r_1_1_0_1 = bytes25(0x01b3d076560ae6a7a8f2237332eecfd7a0479443ed43581bea);\n r_1_1_0[1] = r_1_1_0_1;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bytes24 r_1_1_1 = bytes24(0xdd0acdd3466ad0176b5b9e1a75e4162faefdd7b8387fe8aa);\n r_1_1.s_1 = r_1_1_1;\n }\n {\n bool r_1_1_2 = true;\n r_1_1.s_2 = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n {\n S_27aa8e61 memory r_1_2;\n {\n bytes25[2] memory r_1_2_0;\n {\n bytes25 r_1_2_0_0 = bytes25(0xa6800740a06b967c15a91b9a97adfeadef360993e9d02032e9);\n r_1_2_0[0] = r_1_2_0_0;\n }\n {\n bytes25 r_1_2_0_1 = bytes25(0xd4c95720a1f3f38a1f75b765ae2ae1e4964002f0bc81ee1c2c);\n r_1_2_0[1] = r_1_2_0_1;\n }\n r_1_2.s_0 = r_1_2_0;\n }\n {\n bytes24 r_1_2_1 = bytes24(0x2ed6071425ef33dcd730f319f53c2244fefe54759928db89);\n r_1_2.s_1 = r_1_2_1;\n }\n {\n bool r_1_2_2 = true;\n r_1_2.s_2 = r_1_2_2;\n }\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a0feb3f764cc7e352e4d47e4cfa819a33b1549ca0cf09c1f1873000000000000008650b96ec3a9487d809f79d5028dd0cd7450463057301dd98300000000000000a980b03b6e2fc0038d8ddc624334584e02d07f0ca2d3012300000000000000000000000000000000000000000000000000000000000000000000000000000001ee2941455d89a6a89d2cb1e6a61237ae6b4b28645141b32f380000000000000001b3d076560ae6a7a8f2237332eecfd7a0479443ed43581bea00000000000000dd0acdd3466ad0176b5b9e1a75e4162faefdd7b8387fe8aa00000000000000000000000000000000000000000000000000000000000000000000000000000001a6800740a06b967c15a91b9a97adfeadef360993e9d02032e900000000000000d4c95720a1f3f38a1f75b765ae2ae1e4964002f0bc81ee1c2c000000000000002ed6071425ef33dcd730f319f53c2244fefe54759928db8900000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a804d204d6f200000000000000000000000000000000000" + }, + { + "name": "random-(string,address,(bool,address,bool[4]))", + "type": "(string,address,(bool,address,bool[4]))", + "value": [ + "Moo é🚀éééé oMééé éM 🚀 o oéoo o 🚀oéooéé🚀o🚀🚀é🚀oé ooé oo", + "0xa7b033CB0DEbEABf20B28ff93DF770dB383287ab", + [false, "0xADA6F53eA4b305e62BfaF938BCd673ccB91A6AA6", [false, false, false, false]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éééé oMééé éM 🚀 o oéoo o 🚀oéooéé🚀o🚀🚀é🚀oé ooé oo" + }, + { + "type": "address", + "value": "0xa7b033CB0DEbEABf20B28ff93DF770dB383287ab" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xADA6F53eA4b305e62BfaF938BCd673ccB91A6AA6" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610198565b60405180910390f35b6100566100ef565b61005e6100ef565b60006040518060800160405280605a8152602001610225605a913982525073a7b033cb0debeabf20b28ff93df770db383287ab602082015261009e610113565b6000815273ada6f53ea4b305e62bfaf938bcd673ccb91a6aa660208201526100c461012e565b6000808252602082018190526040808301829052606083019190915282810191909152820152919050565b604080516060808201835281526000602082015290810161010e610113565b905290565b604080516060810182526000808252602082015290810161010e5b60405180608001604052806004906020820280368337509192915050565b8051151582526020808201516001600160a01b03168184015260408083015190840160005b6004811015610190578251151582529183019190830190600101610171565b505050505050565b6000602080835283516101008285015280518061012086015260005b818110156101d157828101840151868201610140015283016101b4565b818111156101e457600061014083880101525b50918501516001600160a01b0381166040860152916040860151925061020d606086018461014c565b601f01601f1916939093016101400194935050505056fe4d6f6f20c3a9f09f9a80c3a9c3a9c3a9c3a9206f4dc3a9c3a9c3a920c3a94d20f09f9a80206f206fc3a96f6f206f20f09f9a806fc3a96f6fc3a9c3a9f09f9a806ff09f9a80f09f9a80c3a9f09f9a806fc3a9206f6fc3a9206f6fa26469706673582212202adb29d745971bcac90b9e8c71743fc66e26e165d4b7de65399fb6479342c3ab64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_af33f5a3 {\n bool s_0;\n address s_1;\n bool[4] s_2;\n }\n\n struct S_4c83e0af {\n string s_0;\n address s_1;\n S_af33f5a3 s_2;\n }\n\n function test () public pure returns (S_4c83e0af memory) {\n S_4c83e0af memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éééé oMééé éM 🚀 o oéoo o 🚀oéooéé🚀o🚀🚀é🚀oé ooé oo\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xa7b033CB0DEbEABf20B28ff93DF770dB383287ab;\n r.s_1 = r_1;\n }\n {\n S_af33f5a3 memory r_2;\n {\n bool r_2_0 = false;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0xADA6F53eA4b305e62BfaF938BCd673ccB91A6AA6;\n r_2.s_1 = r_2_1;\n }\n {\n bool[4] memory r_2_2;\n {\n bool r_2_2_0 = false;\n r_2_2[0] = r_2_2_0;\n }\n {\n bool r_2_2_1 = false;\n r_2_2[1] = r_2_2_1;\n }\n {\n bool r_2_2_2 = false;\n r_2_2[2] = r_2_2_2;\n }\n {\n bool r_2_2_3 = false;\n r_2_2[3] = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000a7b033cb0debeabf20b28ff93df770db383287ab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ada6f53ea4b305e62bfaf938bcd673ccb91a6aa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a80c3a9c3a9c3a9c3a9206f4dc3a9c3a9c3a920c3a94d20f09f9a80206f206fc3a96f6f206f20f09f9a806fc3a96f6fc3a9c3a9f09f9a806ff09f9a80f09f9a80c3a9f09f9a806fc3a9206f6fc3a9206f6f000000000000" + }, + { + "name": "random-(string,address,string[4],string,int208)", + "type": "(string,address,string[4],string,int208)", + "value": [ + "Moo é🚀o oM🚀é🚀 MMM🚀o🚀 oooooooo Moo🚀 ", + "0xAE90C3b662Cc7C8671114d150fA85dbEF7eD78Be", + [ + "Moo é🚀o oo", + "Moo é🚀oé ooo 🚀éoMoooo🚀🚀ooMé o🚀o🚀🚀oM éé o oéM🚀🚀éé oéoo", + "Moo é🚀", + "Moo é🚀Mé🚀oo🚀oé🚀🚀" + ], + "Moo é🚀Mé 🚀", + "-63829397614053949785470187103285593819945053143372368551782310" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oM🚀é🚀 MMM🚀o🚀 oooooooo Moo🚀 " + }, + { + "type": "address", + "value": "0xAE90C3b662Cc7C8671114d150fA85dbEF7eD78Be" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oo" + }, + { + "type": "string", + "value": "Moo é🚀oé ooo 🚀éoMoooo🚀🚀ooMé o🚀o🚀🚀oM éé o oéM🚀🚀éé oéoo" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀Mé🚀oo🚀oé🚀🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mé 🚀" + }, + { + "type": "number", + "value": "-63829397614053949785470187103285593819945053143372368551782310" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103da806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610236565b60405180910390f35b61005661018e565b61005e61018e565b60006040518060600160405280603981526020016102ef6039913982525073ae90c3b662cc7c8671114d150fa85dbef7ed78be602082015261009e6101c2565b604080518082018252600f81526e4d6f6f20c3a9f09f9a806f20206f6f60881b602080830191909152908352815160808101909252605b8083526000929161034a90830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b8184015281850152805160608101909152602280825260009350909161032890830139606080840191909152604084810193909352825180840190935260128352709adede418753e13f35009b875241e13f3560771b6020840152830191909152507927b89c15814950d3d198e498f4e4319b4bf4f27712d40976a7a5196080820152919050565b6040805160a08101825260608152600060208201529081016101ae6101c2565b815260606020820152600060409091015290565b60405180608001604052806004905b60608152602001906001900390816101d15790505090565b6000815180845260005b8181101561020f576020818501810151868301820152016101f3565b81811115610221576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160a08285015261025260c08501826101e9565b828601516001600160a01b0316604086810191909152860151601f198683038101606088015291925090826080810160005b60048110156102af57858203835261029d8286516101e9565b94870194928701929150600101610284565b5060608901519550828882030160808901526102cb81876101e9565b9550505050505060808401516102e660a085018260190b9052565b50939250505056fe4d6f6f20c3a9f09f9a806f206f4df09f9a80c3a9f09f9a80204d4d4df09f9a806ff09f9a80206f6f6f6f6f6f6f6f20204d6f6ff09f9a8020204d6f6f20c3a9f09f9a804dc3a9f09f9a806f6ff09f9a806fc3a9f09f9a80f09f9a804d6f6f20c3a9f09f9a806fc3a9206f6f6f2020f09f9a80c3a96f4d6f6f6f6ff09f9a80f09f9a806f6f4dc3a9206ff09f9a806ff09f9a80f09f9a806f4d20c3a9c3a9206f206fc3a94df09f9a80f09f9a80c3a9c3a9206fc3a96f6fa26469706673582212203b055b0d7ed02ac36b37be66d434391669cd4cb686f1c91dee8b0c7ee88321ca64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_68b0bec0 {\n string s_0;\n address s_1;\n string[4] s_2;\n string s_3;\n int208 s_4;\n }\n\n function test () public pure returns (S_68b0bec0 memory) {\n S_68b0bec0 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o oM🚀é🚀 MMM🚀o🚀 oooooooo Moo🚀 \";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xAE90C3b662Cc7C8671114d150fA85dbEF7eD78Be;\n r.s_1 = r_1;\n }\n {\n string[4] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀o oo\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀oé ooo 🚀éoMoooo🚀🚀ooMé o🚀o🚀🚀oM éé o oéM🚀🚀éé oéoo\";\n r_2[1] = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀\";\n r_2[2] = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀Mé🚀oo🚀oé🚀🚀\";\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀Mé 🚀\";\n r.s_3 = r_3;\n }\n {\n int208 r_4 = -63829397614053949785470187103285593819945053143372368551782310;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ae90c3b662cc7c8671114d150fa85dbef7ed78be000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002e0ffffffffffffd84763ea7eb6af2c2e671b670b1bce64b40b0d88ed2bf689585a00000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f206f4df09f9a80c3a9f09f9a80204d4d4df09f9a806ff09f9a80206f6f6f6f6f6f6f6f20204d6f6ff09f9a80202000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806f20206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a806fc3a9206f6f6f2020f09f9a80c3a96f4d6f6f6f6ff09f9a80f09f9a806f6f4dc3a9206ff09f9a806ff09f9a80f09f9a806f4d20c3a9c3a9206f206fc3a94df09f9a80f09f9a80c3a9c3a9206fc3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a804dc3a9f09f9a806f6ff09f9a806fc3a9f09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a804dc3a920f09f9a800000000000000000000000000000" + }, + { + "name": "random-(string,bool,bool,bytes24[4],address)", + "type": "(string,bool,bool,bytes24[4],address)", + "value": [ + "Moo é🚀 M 🚀éooo🚀oooo🚀Mooé🚀🚀 🚀ooééM🚀é é oooMo", + false, + false, + [ + "0xbe5ba7ba74cc98d9ada0622f17ba28f863840689758649ed", + "0xc24308ebef004895ef49fec372564a79c9983e9e4cfb443f", + "0xbe0dcf0efcd31b71dd611171c72a2e0aaafe789fbf1be6e1", + "0xf1c1575224aae5563008b36b52828fd75cb04a933d4c9de8" + ], + "0x42AC6FEfE16913F18b98202E19e6873A685a34c6" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M 🚀éooo🚀oooo🚀Mooé🚀🚀 🚀ooééM🚀é é oooMo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbe5ba7ba74cc98d9ada0622f17ba28f863840689758649ed" + }, + { + "type": "hexstring", + "value": "0xc24308ebef004895ef49fec372564a79c9983e9e4cfb443f" + }, + { + "type": "hexstring", + "value": "0xbe0dcf0efcd31b71dd611171c72a2e0aaafe789fbf1be6e1" + }, + { + "type": "hexstring", + "value": "0xf1c1575224aae5563008b36b52828fd75cb04a933d4c9de8" + } + ] + }, + { + "type": "address", + "value": "0x42AC6FEfE16913F18b98202E19e6873A685a34c6" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610305806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101d8565b60405180910390f35b61005661014d565b61005e61014d565b60006040518060800160405280604c8152602001610284604c91398252506000602082018190526040820152610092610186565b7fbe5ba7ba74cc98d9ada0622f17ba28f863840689758649ed000000000000000081527fc24308ebef004895ef49fec372564a79c9983e9e4cfb443f000000000000000060208201527fbe0dcf0efcd31b71dd611171c72a2e0aaafe789fbf1be6e1000000000000000060408201527ff1c1575224aae5563008b36b52828fd75cb04a933d4c9de800000000000000006060808301919091528201527342ac6fefe16913f18b98202e19e6873a685a34c66080820152919050565b6040518060a0016040528060608152602001600015158152602001600015158152602001610179610186565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156101d257815167ffffffffffffffff19168452602093840193909101906001016101a8565b50505050565b600060208083528351610100808386015281518061012087015260005b8181101561021257838101850151878201610140015284016101f5565b8181111561022557600061014083890101525b50928601518015156040870152926040870151801515606088015293506060870151935061025660808701856101a4565b60808701516001600160a01b038116878401529350601f01601f191694909401610140019594505050505056fe4d6f6f20c3a9f09f9a80204d2020f09f9a80c3a96f6f6ff09f9a806f6f6f6ff09f9a804d6f6fc3a9f09f9a80f09f9a8020f09f9a806f6fc3a9c3a94df09f9a80c3a920c3a920206f6f6f4d6fa26469706673582212200d2edac36422c5314355df4c30d8f3634846c9eb4ec5cde7df849f48994186ab64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_828f618d {\n string s_0;\n bool s_1;\n bool s_2;\n bytes24[4] s_3;\n address s_4;\n }\n\n function test () public pure returns (S_828f618d memory) {\n S_828f618d memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 M 🚀éooo🚀oooo🚀Mooé🚀🚀 🚀ooééM🚀é é oooMo\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bytes24[4] memory r_3;\n {\n bytes24 r_3_0 = bytes24(0xbe5ba7ba74cc98d9ada0622f17ba28f863840689758649ed);\n r_3[0] = r_3_0;\n }\n {\n bytes24 r_3_1 = bytes24(0xc24308ebef004895ef49fec372564a79c9983e9e4cfb443f);\n r_3[1] = r_3_1;\n }\n {\n bytes24 r_3_2 = bytes24(0xbe0dcf0efcd31b71dd611171c72a2e0aaafe789fbf1be6e1);\n r_3[2] = r_3_2;\n }\n {\n bytes24 r_3_3 = bytes24(0xf1c1575224aae5563008b36b52828fd75cb04a933d4c9de8);\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x42AC6FEfE16913F18b98202E19e6873A685a34c6;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be5ba7ba74cc98d9ada0622f17ba28f863840689758649ed0000000000000000c24308ebef004895ef49fec372564a79c9983e9e4cfb443f0000000000000000be0dcf0efcd31b71dd611171c72a2e0aaafe789fbf1be6e10000000000000000f1c1575224aae5563008b36b52828fd75cb04a933d4c9de8000000000000000000000000000000000000000042ac6fefe16913f18b98202e19e6873a685a34c6000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a80204d2020f09f9a80c3a96f6f6ff09f9a806f6f6f6ff09f9a804d6f6fc3a9f09f9a80f09f9a8020f09f9a806f6fc3a9c3a94df09f9a80c3a920c3a920206f6f6f4d6f0000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bytes17,bool,(bool),bool[])", + "type": "(string,bytes17,bool,(bool),bool[])", + "value": [ + "Moo é🚀Mo🚀ooM éo🚀 MéoéooéoM 🚀o oo oo🚀🚀o 🚀oMMMoé o", + "0xae7a27473dcb8d286a0629d1dd231e367b", + false, + [false], + [true, false, true, true] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo🚀ooM éo🚀 MéoéooéoM 🚀o oo oo🚀🚀o 🚀oMMMoé o" + }, + { + "type": "hexstring", + "value": "0xae7a27473dcb8d286a0629d1dd231e367b" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061036b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610216565b60405180910390f35b6040805160a0808201835260608083526000602080850182905284860182905285518082018752828152838601526080808601849052865194850187528385528482018390528487018390528651808301885283815285850152848101939093528551928301909552604b8083529394929390926102eb9083013982525070ae7a27473dcb8d286a0629d1dd231e367b60781b602080830191909152600060408084018290528051808401825282815260608501528051600480825260a0820190925291928201608080368337019050509050600060019050808260008151811061013b5761013b6102d4565b6020026020010190151590811515815250505060008082600181518110610164576101646102d4565b602002602001019015159081151581525050506000600190508082600281518110610191576101916102d4565b6020026020010190151590811515815250505060006001905080826003815181106101be576101be6102d4565b91151560209283029190910190910152506080820152919050565b600081518084526020808501945080840160005b8381101561020b5781511515875295820195908201906001016101ed565b509495945050505050565b60006020808352835160a08285015280518060c086015260005b8181101561024c5782810184015186820160e001528301610230565b8181111561025e57600060e083880101525b509185015191601f01601f19168401905061028d60408501836effffffffffffffffffffffffffffff19169052565b604085015180151560608601529150606085015180511515608086015291506080850151915060c08482030160a08501526102cb60e08201836101d9565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d6ff09f9a806f6f4d20c3a96ff09f9a80204dc3a96fc3a96f6fc3a96f4d20f09f9a806f206f6f206f6ff09f9a80f09f9a806f20f09f9a806f4d4d4d6fc3a9206fa26469706673582212200263f8be44d74687cabebfb9507dda7cb32753e13b991ab2e07a9c4db7cf956164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_d000155a {\n string s_0;\n bytes17 s_1;\n bool s_2;\n S_c1053bda s_3;\n bool[] s_4;\n }\n\n function test () public pure returns (S_d000155a memory) {\n S_d000155a memory r;\n {\n string memory r_0 = unicode\"Moo é🚀Mo🚀ooM éo🚀 MéoéooéoM 🚀o oo oo🚀🚀o 🚀oMMMoé o\";\n r.s_0 = r_0;\n }\n {\n bytes17 r_1 = bytes17(0xae7a27473dcb8d286a0629d1dd231e367b);\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n S_c1053bda memory r_3;\n {\n bool r_3_0 = false;\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n {\n bool[] memory r_4 = new bool[](4);\n {\n bool r_4_0 = true;\n r_4[0] = r_4_0;\n }\n {\n bool r_4_1 = false;\n r_4[1] = r_4_1;\n }\n {\n bool r_4_2 = true;\n r_4[2] = r_4_2;\n }\n {\n bool r_4_3 = true;\n r_4[3] = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0ae7a27473dcb8d286a0629d1dd231e367b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a804d6ff09f9a806f6f4d20c3a96ff09f9a80204dc3a96fc3a96f6fc3a96f4d20f09f9a806f206f6f206f6ff09f9a80f09f9a806f20f09f9a806f4d4d4d6fc3a9206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(string,bytes18[],string,string)[4]", + "type": "(string,bytes18[],string,string)[4]", + "value": [ + [ + "Moo é🚀oé", + [ + "0x15fe30d1b9a1020e03cd959511a66f54c66b", + "0xdc1022bf02b7456abca1f1ed7bd18c25601c" + ], + "Moo é🚀oo é Mé🚀🚀ooM", + "Moo é🚀" + ], + [ + "Moo é🚀", + ["0x21f92d6e725a72d7db2c53100efc9f6f5124"], + "Moo é🚀Mo🚀🚀é🚀🚀o🚀o oé M🚀 ", + "Moo é🚀ooé oMM oéMo🚀🚀🚀éé🚀oé🚀 o🚀 M🚀Mo 🚀🚀Mé 🚀🚀MM MM" + ], + [ + "Moo é🚀 éo🚀🚀éo MMMMéoé🚀", + [ + "0x94d0b9975931c8caca01c73de3973276ed9b", + "0x20fe1be40bdc062ca5a9797ae0692a4b8b73", + "0xe00d49e8ad8a2a265a6aad654ffad97d9f1b", + "0x593505b7cdd9b72924a5c9fe920dcd8e1b99" + ], + "Moo é🚀🚀M", + "Moo é🚀ooé🚀🚀o🚀é🚀éoM " + ], + [ + "Moo é🚀🚀éé éoééM🚀Méé", + ["0x0ec41a274ebb8eea6cbe45447da4cccaf5dd"], + "Moo é🚀o", + "Moo é🚀" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x15fe30d1b9a1020e03cd959511a66f54c66b" + }, + { + "type": "hexstring", + "value": "0xdc1022bf02b7456abca1f1ed7bd18c25601c" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo é Mé🚀🚀ooM" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x21f92d6e725a72d7db2c53100efc9f6f5124" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀🚀é🚀🚀o🚀o oé M🚀 " + }, + { + "type": "string", + "value": "Moo é🚀ooé oMM oéMo🚀🚀🚀éé🚀oé🚀 o🚀 M🚀Mo 🚀🚀Mé 🚀🚀MM MM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éo🚀🚀éo MMMMéoé🚀" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x94d0b9975931c8caca01c73de3973276ed9b" + }, + { + "type": "hexstring", + "value": "0x20fe1be40bdc062ca5a9797ae0692a4b8b73" + }, + { + "type": "hexstring", + "value": "0xe00d49e8ad8a2a265a6aad654ffad97d9f1b" + }, + { + "type": "hexstring", + "value": "0x593505b7cdd9b72924a5c9fe920dcd8e1b99" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀M" + }, + { + "type": "string", + "value": "Moo é🚀ooé🚀🚀o🚀é🚀éoM " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éé éoééM🚀Méé" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x0ec41a274ebb8eea6cbe45447da4cccaf5dd" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061086e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610649565b60405180910390f35b6100566105ac565b61005e6105ac565b6100896040518060800160405280606081526020016060815260200160608152602001606081525090565b604080518082018252600d81526c4d6f6f20c3a9f09f9a806fc3a960981b602082015282528051600280825260608201909252600091816020016020820280368337505081519192507115fe30d1b9a1020e03cd959511a66f54c66b60701b9182915083906000906100fd576100fd610725565b6001600160701b03199092166020928302919091019091015250805171370408afc0add15aaf287c7b5ef46309580760721b9081908390600190811061014557610145610725565b6001600160701b0319929092166020928302919091018201528381019290925250604080518082018252601f81527f4d6f6f20c3a9f09f9a806f6f20c3a920204dc3a9f09f9a80f09f9a806f6f4d00818401528184015280518082018252600a8152689adede418753e13f3560b71b818401526060808501919091529284528051608081018252838152918201839052810182905280820191909152604080518082018252600a8152689adede418753e13f3560b71b60208201528252805160018082528183019092526000918160200160208202803683375050815191925071087e4b5b9c969cb5f6cb14c403bf27dbd44960721b91829150839060009061025057610250610725565b6001600160701b031990921660209283029190910182015283810192909252506040805160608101909152602f80825260009261073c90830139604080840191909152805160808101909152605c808252600092506107dd6020830139606083015250808260016020020152506102e86040518060800160405280606081526020016060815260200160608152602001606081525090565b600060405180606001604052806028815260200161076b6028913982525060408051600480825260a0820190925260009160208201608080368337505081519192507194d0b9975931c8caca01c73de3973276ed9b60701b91829150839060009061035557610355610725565b6001600160701b0319909216602092830291909101909101525080517120fe1be40bdc062ca5a9797ae0692a4b8b7360701b9081908390600190811061039d5761039d610725565b6001600160701b03199092166020928302919091019091015250805171e00d49e8ad8a2a265a6aad654ffad97d9f1b60701b908190839060029081106103e5576103e5610725565b6001600160701b03199092166020928302919091019091015250805171593505b7cdd9b72924a5c9fe920dcd8e1b9960701b9081908390600390811061042d5761042d610725565b6001600160701b03199092166020928302919091018201528381019290925250604080518082018252600f81526e4d6f6f20c3a9f09f9a80f09f9a804d60881b8184015281840152805160608101909152602680825260009261079390830139606083015250808260026020020152506104c86040518060800160405280606081526020016060815260200160608152602001606081525090565b60006040518060600160405280602481526020016107b9602491398252506040805160018082528183019092526000916020808301908036833750508151919250710ec41a274ebb8eea6cbe45447da4cccaf5dd60701b91829150839060009061053457610534610725565b6001600160701b03199092166020928302919091018201528381019290925250604080518082018252600b81526a4d6f6f20c3a9f09f9a806f60a81b81840152818401528051808201909152600a8152689adede418753e13f3560b71b91810191909152606082015280826003602002015250919050565b60405180608001604052806004905b6105e66040518060800160405280606081526020016060815260200160608152602001606081525090565b8152602001906001900390816105bb5790505090565b6000815180845260005b8181101561062257602081850181015186830182015201610606565b81811115610634576000602083870101525b50601f01601f19169290920160200192915050565b602080825260009060a083018382018584805b600481101561071857601f19888603018452825160808151818852610683828901826105fc565b838a01518982038a8c01528051808352908b019350869250908a01905b808310156106ca5783516001600160701b0319168252928a019260019290920191908a01906106a0565b5060409250828401519150888103838a01526106e681836105fc565b925050506060808301519250878203818901525061070481836105fc565b96505050928501929185019160010161065c565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a80c3a9f09f9a80f09f9a806ff09f9a806f206fc3a9204df09f9a80204d6f6f20c3a9f09f9a8020c3a96ff09f9a80f09f9a80c3a96f20204d4d4d4dc3a96fc3a9f09f9a804d6f6f20c3a9f09f9a806f6fc3a9f09f9a80f09f9a806ff09f9a80c3a9f09f9a80c3a96f4d204d6f6f20c3a9f09f9a80f09f9a80c3a9c3a920c3a96fc3a9c3a94df09f9a804dc3a9c3a94d6f6f20c3a9f09f9a806f6fc3a920206f4d4d206fc3a94d6ff09f9a80f09f9a80f09f9a80c3a9c3a9f09f9a806fc3a9f09f9a80206ff09f9a80204df09f9a804d6f20f09f9a80f09f9a804dc3a920f09f9a80f09f9a804d4d204d4da2646970667358221220ad8dcdd22e61d717cba5a414bb04e288db60078914e0196f4c8f5d875c05613464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6085c217 {\n string s_0;\n bytes18[] s_1;\n string s_2;\n string s_3;\n }\n\n function test () public pure returns (S_6085c217[4] memory) {\n S_6085c217[4] memory r;\n {\n S_6085c217 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀oé\";\n r_0.s_0 = r_0_0;\n }\n {\n bytes18[] memory r_0_1 = new bytes18[](2);\n {\n bytes18 r_0_1_0 = bytes18(0x15fe30d1b9a1020e03cd959511a66f54c66b);\n r_0_1[0] = r_0_1_0;\n }\n {\n bytes18 r_0_1_1 = bytes18(0xdc1022bf02b7456abca1f1ed7bd18c25601c);\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀oo é Mé🚀🚀ooM\";\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀\";\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_6085c217 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀\";\n r_1.s_0 = r_1_0;\n }\n {\n bytes18[] memory r_1_1 = new bytes18[](1);\n {\n bytes18 r_1_1_0 = bytes18(0x21f92d6e725a72d7db2c53100efc9f6f5124);\n r_1_1[0] = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀Mo🚀🚀é🚀🚀o🚀o oé M🚀 \";\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀ooé oMM oéMo🚀🚀🚀éé🚀oé🚀 o🚀 M🚀Mo 🚀🚀Mé 🚀🚀MM MM\";\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_6085c217 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 éo🚀🚀éo MMMMéoé🚀\";\n r_2.s_0 = r_2_0;\n }\n {\n bytes18[] memory r_2_1 = new bytes18[](4);\n {\n bytes18 r_2_1_0 = bytes18(0x94d0b9975931c8caca01c73de3973276ed9b);\n r_2_1[0] = r_2_1_0;\n }\n {\n bytes18 r_2_1_1 = bytes18(0x20fe1be40bdc062ca5a9797ae0692a4b8b73);\n r_2_1[1] = r_2_1_1;\n }\n {\n bytes18 r_2_1_2 = bytes18(0xe00d49e8ad8a2a265a6aad654ffad97d9f1b);\n r_2_1[2] = r_2_1_2;\n }\n {\n bytes18 r_2_1_3 = bytes18(0x593505b7cdd9b72924a5c9fe920dcd8e1b99);\n r_2_1[3] = r_2_1_3;\n }\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀🚀M\";\n r_2.s_2 = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀ooé🚀🚀o🚀é🚀éoM \";\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n {\n S_6085c217 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀🚀éé éoééM🚀Méé\";\n r_3.s_0 = r_3_0;\n }\n {\n bytes18[] memory r_3_1 = new bytes18[](1);\n {\n bytes18 r_3_1_0 = bytes18(0x0ec41a274ebb8eea6cbe45447da4cccaf5dd);\n r_3_1[0] = r_3_1_0;\n }\n r_3.s_1 = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀o\";\n r_3.s_2 = r_3_2;\n }\n {\n string memory r_3_3 = unicode\"Moo é🚀\";\n r_3.s_3 = r_3_3;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a806fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000215fe30d1b9a1020e03cd959511a66f54c66b0000000000000000000000000000dc1022bf02b7456abca1f1ed7bd18c25601c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a806f6f20c3a920204dc3a9f09f9a80f09f9a806f6f4d00000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f92d6e725a72d7db2c53100efc9f6f51240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a80c3a9f09f9a80f09f9a806ff09f9a806f206fc3a9204df09f9a80200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806f6fc3a920206f4d4d206fc3a94d6ff09f9a80f09f9a80f09f9a80c3a9c3a9f09f9a806fc3a9f09f9a80206ff09f9a80204df09f9a804d6f20f09f9a80f09f9a804dc3a920f09f9a80f09f9a804d4d204d4d00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a8020c3a96ff09f9a80f09f9a80c3a96f20204d4d4d4dc3a96fc3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494d0b9975931c8caca01c73de3973276ed9b000000000000000000000000000020fe1be40bdc062ca5a9797ae0692a4b8b730000000000000000000000000000e00d49e8ad8a2a265a6aad654ffad97d9f1b0000000000000000000000000000593505b7cdd9b72924a5c9fe920dcd8e1b990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a806f6fc3a9f09f9a80f09f9a806ff09f9a80c3a9f09f9a80c3a96f4d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a80f09f9a80c3a9c3a920c3a96fc3a9c3a94df09f9a804dc3a9c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010ec41a274ebb8eea6cbe45447da4cccaf5dd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,string,int176,(string,uint64[4]))", + "type": "(string,string,int176,(string,uint64[4]))", + "value": [ + "Moo é🚀 oMooooéMoo🚀o🚀M o o🚀ooMo é🚀oooMoooooo🚀MMéMM", + "Moo é🚀Mo ooM o🚀ééo", + "12804057464827390402885656044500277138666410156826592", + [ + "Moo é🚀Mé🚀", + [ + "4471822217809271963", + "7061015261016167838", + "17270278726617973122", + "10676365809616942584" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oMooooéMoo🚀o🚀M o o🚀ooMo é🚀oooMoooooo🚀MMéMM" + }, + { + "type": "string", + "value": "Moo é🚀Mo ooM o🚀ééo" + }, + { + "type": "number", + "value": "12804057464827390402885656044500277138666410156826592" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mé🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4471822217809271963" + }, + { + "type": "number", + "value": "7061015261016167838" + }, + { + "type": "number", + "value": "17270278726617973122" + }, + { + "type": "number", + "value": "10676365809616942584" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610331806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610207565b60405180910390f35b610056610156565b61005e610156565b60006040518060800160405280604781526020016102b560479139825250604080518082018252601b81527f4d6f6f20c3a9f09f9a804d6f206f6f4d206ff09f9a80c3a9c3a96f0000000000602080830191909152830152752238e44200bb5818539b70b385dc89e2a285e3611fe0908201526100d9610186565b60408051808201909152601181526f9adede418753e13f35009b8753e13f35607f1b6020820152815261010a61019c565b673e0f1a9d47389c9b81526761fdc3f8127b159e60208083019190915267efac5b00000cc182604083015267942a12235657f5f860608084019190915290830191909152820152919050565b60405180608001604052806060815260200160608152602001600060150b8152602001610181610186565b905290565b6040518060400160405280606081526020016101815b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b818110156101e0576020818501810151868301820152016101c4565b818111156101f2576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160808285015261022360a08501826101ba565b905081850151601f198086840301604087015261024083836101ba565b9250604087015160150b6060870152606087015191508086840301608087015250805160a0835261027460a08401826101ba565b918401519284019291905060005b60048110156102a957825167ffffffffffffffff1684529284019291840191600101610282565b50969550505050505056fe4d6f6f20c3a9f09f9a80206f4d6f6f6f6fc3a94d6f6ff09f9a806ff09f9a804d206f206ff09f9a806f6f4d6f20c3a9f09f9a806f6f6f4d6f6f6f6f6f6ff09f9a804d4dc3a94d4da26469706673582212208b3bb9f0093f6c14dfcf46f0840320d5cdc84b84398112f7cddac31815811bbb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f2d6062a {\n string s_0;\n uint64[4] s_1;\n }\n\n struct S_3def3fea {\n string s_0;\n string s_1;\n int176 s_2;\n S_f2d6062a s_3;\n }\n\n function test () public pure returns (S_3def3fea memory) {\n S_3def3fea memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 oMooooéMoo🚀o🚀M o o🚀ooMo é🚀oooMoooooo🚀MMéMM\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀Mo ooM o🚀ééo\";\n r.s_1 = r_1;\n }\n {\n int176 r_2 = 12804057464827390402885656044500277138666410156826592;\n r.s_2 = r_2;\n }\n {\n S_f2d6062a memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀Mé🚀\";\n r_3.s_0 = r_3_0;\n }\n {\n uint64[4] memory r_3_1;\n {\n uint64 r_3_1_0 = 4471822217809271963;\n r_3_1[0] = r_3_1_0;\n }\n {\n uint64 r_3_1_1 = 7061015261016167838;\n r_3_1[1] = r_3_1_1;\n }\n {\n uint64 r_3_1_2 = 17270278726617973122;\n r_3_1[2] = r_3_1_2;\n }\n {\n uint64 r_3_1_3 = 10676365809616942584;\n r_3_1[3] = r_3_1_3;\n }\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000002238e44200bb5818539b70b385dc89e2a285e3611fe0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a80206f4d6f6f6f6fc3a94d6f6ff09f9a806ff09f9a804d206f206ff09f9a806f6f4d6f20c3a9f09f9a806f6f6f4d6f6f6f6f6f6ff09f9a804d4dc3a94d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a804d6f206f6f4d206ff09f9a80c3a9c3a96f000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000003e0f1a9d47389c9b00000000000000000000000000000000000000000000000061fdc3f8127b159e000000000000000000000000000000000000000000000000efac5b00000cc182000000000000000000000000000000000000000000000000942a12235657f5f800000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804dc3a9f09f9a80000000000000000000000000000000" + }, + { + "name": "random-(string,string,string,(bool,string,int112))", + "type": "(string,string,string,(bool,string,int112))", + "value": [ + "Moo é🚀🚀🚀🚀 M🚀oo🚀éé MoéoM🚀 MM🚀🚀 oMooooééM 🚀Moo Mooo MM🚀Mo🚀ooo", + "Moo é🚀ooé 🚀ooé o o M🚀ooMé🚀🚀éoé 🚀Mo 🚀ooMM🚀éo 🚀 🚀M ", + "Moo é🚀é", + [true, "Moo é🚀M 🚀", "1005502233197482535991544256738171"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀 M🚀oo🚀éé MoéoM🚀 MM🚀🚀 oMooooééM 🚀Moo Mooo MM🚀Mo🚀ooo" + }, + { + "type": "string", + "value": "Moo é🚀ooé 🚀ooé o o M🚀ooMé🚀🚀éoé 🚀Mo 🚀ooMM🚀éo 🚀 🚀M " + }, + { + "type": "string", + "value": "Moo é🚀é" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀M 🚀" + }, + { + "type": "number", + "value": "1005502233197482535991544256738171" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610357806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c2565b60405180910390f35b610056610127565b61005e610127565b60006040518060a00160405280606581526020016102666065913982525060408051608081019091526057808252600091906102cb6020830139602083810191909152604080518082018252600c81526b4d6f6f20c3a9f09f9a80c3a960a01b81840152818501528051606080820183528184018181526000838501908152600184528451808601909552601185526f9adede418753e13f35009a4041e13f35607f1b95850195909552929092526d319338f12e02d7d8ed517271337b90925283015250919050565b60405180608001604052806060815260200160608152602001606081526020016101706040518060600160405280600015158152602001606081526020016000600d0b81525090565b905290565b6000815180845260005b8181101561019b5760208185018101518683018201520161017f565b818111156101ad576000602083870101525b50601f01601f19169290920160200192915050565b6020815260008251608060208401526101de60a0840182610175565b90506020840151601f19808584030160408601526101fc8383610175565b925060408601519150808584030160608601526102198383610175565b925060608601519150808584030160808601525080511515825260208101516060602084015261024c6060840182610175565b604092830151600d0b939092019290925294935050505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80204df09f9a806f6ff09f9a80c3a9c3a9204d6fc3a96f4df09f9a80204d4df09f9a80f09f9a80206f4d6f6f6f6fc3a9c3a94d20f09f9a804d6f6f204d6f6f6f204d4df09f9a804d6ff09f9a806f6f6f4d6f6f20c3a9f09f9a806f6fc3a920f09f9a806f6fc3a920206f206f204df09f9a806f6f4dc3a9f09f9a80f09f9a80c3a96fc3a920f09f9a804d6f20f09f9a806f6f4d4df09f9a80c3a96f20f09f9a8020f09f9a804d20a2646970667358221220915843d0b09274c0d3ace71619aabf2f34f36b43858b47e62b634f5db0fa8a2c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_36431df6 {\n bool s_0;\n string s_1;\n int112 s_2;\n }\n\n struct S_d99218ea {\n string s_0;\n string s_1;\n string s_2;\n S_36431df6 s_3;\n }\n\n function test () public pure returns (S_d99218ea memory) {\n S_d99218ea memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀🚀🚀 M🚀oo🚀éé MoéoM🚀 MM🚀🚀 oMooooééM 🚀Moo Mooo MM🚀Mo🚀ooo\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀ooé 🚀ooé o o M🚀ooMé🚀🚀éoé 🚀Mo 🚀ooMM🚀éo 🚀 🚀M \";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀é\";\n r.s_2 = r_2;\n }\n {\n S_36431df6 memory r_3;\n {\n bool r_3_0 = true;\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀M 🚀\";\n r_3.s_1 = r_3_1;\n }\n {\n int112 r_3_2 = 1005502233197482535991544256738171;\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80204df09f9a806f6ff09f9a80c3a9c3a9204d6fc3a96f4df09f9a80204d4df09f9a80f09f9a80206f4d6f6f6f6fc3a9c3a94d20f09f9a804d6f6f204d6f6f6f204d4df09f9a804d6ff09f9a806f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f6fc3a920f09f9a806f6fc3a920206f206f204df09f9a806f6f4dc3a9f09f9a80f09f9a80c3a96fc3a920f09f9a804d6f20f09f9a806f6f4d4df09f9a80c3a96f20f09f9a8020f09f9a804d20000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000319338f12e02d7d8ed517271337b00000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804d2020f09f9a80000000000000000000000000000000" + }, + { + "name": "random-(string,uint56,string,address,address)[4]", + "type": "(string,uint56,string,address,address)[4]", + "value": [ + [ + "Moo é🚀M🚀ooM🚀 o 🚀ooMoMoM o🚀ééM 🚀🚀oMéM🚀éMMMooooé", + "35350920110089378", + "Moo é🚀ooM🚀oo🚀o🚀🚀oo🚀", + "0xF46a080e171ff7a65a25cCb3b17988bA0f4b632c", + "0x2C2e8fFeB760a9aA7AfC4993Fe5c7f1919adF06c" + ], + [ + "Moo é🚀oooéMo🚀🚀M 🚀oééooo🚀ooo 🚀éoééoé🚀 éooé🚀🚀é🚀Mo🚀MM🚀o🚀 ", + "33650598553652006", + "Moo é🚀MMéo🚀oM éMMéo 🚀o é 🚀é éoM o🚀éoééo🚀oé🚀Moooéo🚀o ooMMoo🚀oé", + "0x1d5Cd1675730F51D1eb23FD179596FA9Bb256754", + "0x85FcB663763daeBA1165F118b12568a104E285C6" + ], + [ + "Moo é🚀oo 🚀 o MMé🚀o🚀🚀é MMo o éo ooo ooMMé ooMé M oéMMo", + "34344355971860491", + "Moo é🚀🚀M🚀M 🚀M🚀 Moo", + "0x9DCE394EB829f7b88EFf6d8B680edF39d22576CC", + "0x777cF65415Fd5cd7746E8F9cBc75f27a21a844C7" + ], + [ + "Moo é🚀oo🚀 ", + "62540166557427811", + "Moo é🚀M🚀🚀o🚀MMo🚀o o🚀 oooééM Mo🚀o ", + "0x220E975FDAF41E3290AD885CC67091EE09FC3084", + "0x933639b38B2455316428F9FcC82D2F84fe1300CA" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M🚀ooM🚀 o 🚀ooMoMoM o🚀ééM 🚀🚀oMéM🚀éMMMooooé" + }, + { + "type": "number", + "value": "35350920110089378" + }, + { + "type": "string", + "value": "Moo é🚀ooM🚀oo🚀o🚀🚀oo🚀" + }, + { + "type": "address", + "value": "0xF46a080e171ff7a65a25cCb3b17988bA0f4b632c" + }, + { + "type": "address", + "value": "0x2C2e8fFeB760a9aA7AfC4993Fe5c7f1919adF06c" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooéMo🚀🚀M 🚀oééooo🚀ooo 🚀éoééoé🚀 éooé🚀🚀é🚀Mo🚀MM🚀o🚀 " + }, + { + "type": "number", + "value": "33650598553652006" + }, + { + "type": "string", + "value": "Moo é🚀MMéo🚀oM éMMéo 🚀o é 🚀é éoM o🚀éoééo🚀oé🚀Moooéo🚀o ooMMoo🚀oé" + }, + { + "type": "address", + "value": "0x1d5Cd1675730F51D1eb23FD179596FA9Bb256754" + }, + { + "type": "address", + "value": "0x85FcB663763daeBA1165F118b12568a104E285C6" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo 🚀 o MMé🚀o🚀🚀é MMo o éo ooo ooMMé ooMé M oéMMo" + }, + { + "type": "number", + "value": "34344355971860491" + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀M 🚀M🚀 Moo" + }, + { + "type": "address", + "value": "0x9DCE394EB829f7b88EFf6d8B680edF39d22576CC" + }, + { + "type": "address", + "value": "0x777cF65415Fd5cd7746E8F9cBc75f27a21a844C7" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀 " + }, + { + "type": "number", + "value": "62540166557427811" + }, + { + "type": "string", + "value": "Moo é🚀M🚀🚀o🚀MMo🚀o o🚀 oooééM Mo🚀o " + }, + { + "type": "address", + "value": "0x220E975FDAF41E3290AD885CC67091EE09FC3084" + }, + { + "type": "address", + "value": "0x933639b38B2455316428F9FcC82D2F84fe1300CA" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610622806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610359565b60405180910390f35b6100566102b1565b61005e6102b1565b6100666102de565b60006040518060800160405280604d81526020016104ef604d9139825250667d97797ba524a2602080830191909152604080516060810190915260268082526000926105a59083013960408301525073f46a080e171ff7a65a25ccb3b17988ba0f4b632c6060820152732c2e8ffeb760a9aa7afc4993fe5c7f1919adf06c608082015281526100f36102de565b60006040518060a001604052806069815260200161053c6069913982525066778d0a85450b266020808301919091526040805160a08101909152606580825260009261045090830139604083015250731d5cd1675730f51d1eb23fd179596fa9bb25675460608201527385fcb663763daeba1165f118b12568a104e285c6608082015260208201526101836102de565b60006040518060800160405280604d8152602001610403604d9139825250667a040281be080b602080830191909152604080516060810190915260228082526000926105cb90830139604083015250739dce394eb829f7b88eff6d8b680edf39d22576cc606082015273777cf65415fd5cd7746e8f9cbc75f27a21a844c76080820152808260026020020152506102186102de565b6040805180820182526011815270026b7b79061d4f84fcd4037b7f84fcd401607d1b60208083019190915290835266de2ff33bd9686383820152815160608101909252603a808352600092916104b59083013960408301525073220e975fdaf41e3290ad885cc67091ee09fc308460608083019190915273933639b38b2455316428f9fcc82d2f84fe1300ca6080830152820152919050565b60405180608001604052806004905b6102c86102de565b8152602001906001900390816102c05790505090565b6040805160a08101825260608082526000602083018190529282018190528101829052608081019190915290565b6000815180845260005b8181101561033257602081850181015186830182015201610316565b81811115610344576000602083870101525b50601f01601f19169290920160200192915050565b602080825260009060a083820181850186855b60048110156103f557878303601f19018452815180518685526103918786018261030c565b905066ffffffffffffff888301511688860152604080830151868303828801526103bb838261030c565b6060858101516001600160a01b03908116918a0191909152608095860151169490970193909352505050928501929085019060010161036c565b509097965050505050505056fe4d6f6f20c3a9f09f9a806f6f20f09f9a80206f204d4dc3a9f09f9a806ff09f9a80f09f9a80c3a9204d4d6f206f20c3a96f206f6f6f206f6f4d4dc3a9206f6f4dc3a92020204d206fc3a94d4d6f4d6f6f20c3a9f09f9a804d4dc3a96ff09f9a806f4d20c3a94d4dc3a96f20f09f9a806f20c3a920f09f9a80c3a920c3a96f4d206ff09f9a80c3a96fc3a9c3a96ff09f9a806fc3a9f09f9a804d6f6f6fc3a96ff09f9a806f206f6f4d4d6f6ff09f9a806fc3a94d6f6f20c3a9f09f9a804df09f9a80f09f9a806ff09f9a804d4d6ff09f9a806f206ff09f9a8020206f6f6fc3a9c3a94d204d6ff09f9a806f20204d6f6f20c3a9f09f9a804df09f9a806f6f4df09f9a80206f2020f09f9a806f6f4d6f4d6f4d206ff09f9a80c3a9c3a94d20f09f9a80f09f9a806f4dc3a94df09f9a80c3a94d4d4d6f6f6f6fc3a94d6f6f20c3a9f09f9a806f6f6fc3a94d6ff09f9a80f09f9a804d20f09f9a806fc3a9c3a96f6f6ff09f9a806f6f6f2020f09f9a80c3a96fc3a9c3a96fc3a9f09f9a8020c3a96f6fc3a9f09f9a80f09f9a80c3a9f09f9a804d6ff09f9a804d4df09f9a806ff09f9a80204d6f6f20c3a9f09f9a806f6f4df09f9a806f6ff09f9a806ff09f9a80f09f9a806f6ff09f9a804d6f6f20c3a9f09f9a80f09f9a804df09f9a804d20f09f9a804df09f9a80204d6f6fa26469706673582212209e8001a3e3a7b19fc7a064f76ac84c1b9706a72d7f0b6966b60459acb0777cf964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c6cdf0e3 {\n string s_0;\n uint56 s_1;\n string s_2;\n address s_3;\n address s_4;\n }\n\n function test () public pure returns (S_c6cdf0e3[4] memory) {\n S_c6cdf0e3[4] memory r;\n {\n S_c6cdf0e3 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀M🚀ooM🚀 o 🚀ooMoMoM o🚀ééM 🚀🚀oMéM🚀éMMMooooé\";\n r_0.s_0 = r_0_0;\n }\n {\n uint56 r_0_1 = 35350920110089378;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀ooM🚀oo🚀o🚀🚀oo🚀\";\n r_0.s_2 = r_0_2;\n }\n {\n address r_0_3 = 0xF46a080e171ff7a65a25cCb3b17988bA0f4b632c;\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x2C2e8fFeB760a9aA7AfC4993Fe5c7f1919adF06c;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_c6cdf0e3 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀oooéMo🚀🚀M 🚀oééooo🚀ooo 🚀éoééoé🚀 éooé🚀🚀é🚀Mo🚀MM🚀o🚀 \";\n r_1.s_0 = r_1_0;\n }\n {\n uint56 r_1_1 = 33650598553652006;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀MMéo🚀oM éMMéo 🚀o é 🚀é éoM o🚀éoééo🚀oé🚀Moooéo🚀o ooMMoo🚀oé\";\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0x1d5Cd1675730F51D1eb23FD179596FA9Bb256754;\n r_1.s_3 = r_1_3;\n }\n {\n address r_1_4 = 0x85FcB663763daeBA1165F118b12568a104E285C6;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_c6cdf0e3 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀oo 🚀 o MMé🚀o🚀🚀é MMo o éo ooo ooMMé ooMé M oéMMo\";\n r_2.s_0 = r_2_0;\n }\n {\n uint56 r_2_1 = 34344355971860491;\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀🚀M🚀M 🚀M🚀 Moo\";\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0x9DCE394EB829f7b88EFf6d8B680edF39d22576CC;\n r_2.s_3 = r_2_3;\n }\n {\n address r_2_4 = 0x777cF65415Fd5cd7746E8F9cBc75f27a21a844C7;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n {\n S_c6cdf0e3 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀oo🚀 \";\n r_3.s_0 = r_3_0;\n }\n {\n uint56 r_3_1 = 62540166557427811;\n r_3.s_1 = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀M🚀🚀o🚀MMo🚀o o🚀 oooééM Mo🚀o \";\n r_3.s_2 = r_3_2;\n }\n {\n address r_3_3 = 0x220E975FDAF41E3290AD885CC67091EE09FC3084;\n r_3.s_3 = r_3_3;\n }\n {\n address r_3_4 = 0x933639b38B2455316428F9FcC82D2F84fe1300CA;\n r_3.s_4 = r_3_4;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000007d97797ba524a20000000000000000000000000000000000000000000000000000000000000120000000000000000000000000f46a080e171ff7a65a25ccb3b17988ba0f4b632c0000000000000000000000002c2e8ffeb760a9aa7afc4993fe5c7f1919adf06c000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a804df09f9a806f6f4df09f9a80206f2020f09f9a806f6f4d6f4d6f4d206ff09f9a80c3a9c3a94d20f09f9a80f09f9a806f4dc3a94df09f9a80c3a94d4d4d6f6f6f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a806f6f4df09f9a806f6ff09f9a806ff09f9a80f09f9a806f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000778d0a85450b2600000000000000000000000000000000000000000000000000000000000001400000000000000000000000001d5cd1675730f51d1eb23fd179596fa9bb25675400000000000000000000000085fcb663763daeba1165f118b12568a104e285c600000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a806f6f6fc3a94d6ff09f9a80f09f9a804d20f09f9a806fc3a9c3a96f6f6ff09f9a806f6f6f2020f09f9a80c3a96fc3a9c3a96fc3a9f09f9a8020c3a96f6fc3a9f09f9a80f09f9a80c3a9f09f9a804d6ff09f9a804d4df09f9a806ff09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a804d4dc3a96ff09f9a806f4d20c3a94d4dc3a96f20f09f9a806f20c3a920f09f9a80c3a920c3a96f4d206ff09f9a80c3a96fc3a9c3a96ff09f9a806fc3a9f09f9a804d6f6f6fc3a96ff09f9a806f206f6f4d4d6f6ff09f9a806fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000007a040281be080b00000000000000000000000000000000000000000000000000000000000001200000000000000000000000009dce394eb829f7b88eff6d8b680edf39d22576cc000000000000000000000000777cf65415fd5cd7746e8f9cbc75f27a21a844c7000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a806f6f20f09f9a80206f204d4dc3a9f09f9a806ff09f9a80f09f9a80c3a9204d4d6f206f20c3a96f206f6f6f206f6f4d4dc3a9206f6f4dc3a92020204d206fc3a94d4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80f09f9a804df09f9a804d20f09f9a804df09f9a80204d6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000de2ff33bd9686300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000220e975fdaf41e3290ad885cc67091ee09fc3084000000000000000000000000933639b38b2455316428f9fcc82d2f84fe1300ca00000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a806f6ff09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a804df09f9a80f09f9a806ff09f9a804d4d6ff09f9a806f206ff09f9a8020206f6f6fc3a9c3a94d204d6ff09f9a806f2020000000000000" + }, + { + "name": "random-(uint184,bool,bool,address,uint104)[4]", + "type": "(uint184,bool,bool,address,uint104)[4]", + "value": [ + [ + "6987626028759386340270908306836047561416160772131084063", + false, + true, + "0xAF8D4965358c4b9189C37Bea0c11E81b15D65c34", + "10672171883696499352255625958418" + ], + [ + "4901816944695010386177939943611454378197482723584749422", + true, + false, + "0xe286f3d9e46EBf4dD9163e147cC0B973aa593d35", + "8695537810809525549716831999006" + ], + [ + "49841039802128389572932406069482510139342321857361532", + false, + false, + "0x2d441b17435F37f2957925974e844C44C82f668E", + "2427240455026751495184707377873" + ], + [ + "20759088698129552889899815245114862344753020557600868205", + false, + true, + "0x790C20c6ECd0491fd81706010107A9A9Dbd20528", + "8184944503852385063899215925470" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "6987626028759386340270908306836047561416160772131084063" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xAF8D4965358c4b9189C37Bea0c11E81b15D65c34" + }, + { + "type": "number", + "value": "10672171883696499352255625958418" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4901816944695010386177939943611454378197482723584749422" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xe286f3d9e46EBf4dD9163e147cC0B973aa593d35" + }, + { + "type": "number", + "value": "8695537810809525549716831999006" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "49841039802128389572932406069482510139342321857361532" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x2d441b17435F37f2957925974e844C44C82f668E" + }, + { + "type": "number", + "value": "2427240455026751495184707377873" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "20759088698129552889899815245114862344753020557600868205" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x790C20c6ECd0491fd81706010107A9A9Dbd20528" + }, + { + "type": "number", + "value": "8184944503852385063899215925470" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610302806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610248565b60405180910390f35b6100566101ed565b61005e6101ed565b61006661021a565b7648f447beec0d805d9b82dcc23329fef268518035d7571f8152600060208201526001604082015273af8d4965358c4b9189c37bea0c11e81b15d65c3460608201526c86b3a5ad101f85f5eb1b201412608082015281526100c561021a565b76332d6741a0145b0e276e8ac3d8a8199850d67038f3af6e815260016020808301919091526000604083015273e286f3d9e46ebf4dd9163e147cc0b973aa593d3560608301526c6dc0cc4af67a0bc59fc9d8141e608083015282015261012961021a565b7585369f911f54c2c59923d487738d97ddfeac73f4767c8152600060208201819052604080830191909152732d441b17435f37f2957925974e844c44c82f668e60608301526c1ea2d63f143c442203a56e5ad1608083015282015261018c61021a565b76d8bc28e12f176ac22b7840723fbc831ee8096d237dc76d8152600060208201526001604082015273790c20c6ecd0491fd81706010107a9a9dbd205286060808301919091526c674efb688d8093ca9f75c790de6080830152820152919050565b60405180608001604052806004905b61020461021a565b8152602001906001900390816101fc5790505090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6102808101818360005b60048110156102c357815180516001600160b81b031684526020808201511515818601526040808301511515908601526060808301516001600160a01b0316908601526080918201516cffffffffffffffffffffffffff169185019190915260a09093019290910190600101610252565b5050509291505056fea26469706673582212203613ae5a7826c6a8fde77c5c6400ecbccd434c142059e087cac38029ba123df064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e47282f6 {\n uint184 s_0;\n bool s_1;\n bool s_2;\n address s_3;\n uint104 s_4;\n }\n\n function test () public pure returns (S_e47282f6[4] memory) {\n S_e47282f6[4] memory r;\n {\n S_e47282f6 memory r_0;\n {\n uint184 r_0_0 = 6987626028759386340270908306836047561416160772131084063;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0.s_2 = r_0_2;\n }\n {\n address r_0_3 = 0xAF8D4965358c4b9189C37Bea0c11E81b15D65c34;\n r_0.s_3 = r_0_3;\n }\n {\n uint104 r_0_4 = 10672171883696499352255625958418;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_e47282f6 memory r_1;\n {\n uint184 r_1_0 = 4901816944695010386177939943611454378197482723584749422;\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0xe286f3d9e46EBf4dD9163e147cC0B973aa593d35;\n r_1.s_3 = r_1_3;\n }\n {\n uint104 r_1_4 = 8695537810809525549716831999006;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_e47282f6 memory r_2;\n {\n uint184 r_2_0 = 49841039802128389572932406069482510139342321857361532;\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = false;\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0x2d441b17435F37f2957925974e844C44C82f668E;\n r_2.s_3 = r_2_3;\n }\n {\n uint104 r_2_4 = 2427240455026751495184707377873;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n {\n S_e47282f6 memory r_3;\n {\n uint184 r_3_0 = 20759088698129552889899815245114862344753020557600868205;\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3.s_2 = r_3_2;\n }\n {\n address r_3_3 = 0x790C20c6ECd0491fd81706010107A9A9Dbd20528;\n r_3.s_3 = r_3_3;\n }\n {\n uint104 r_3_4 = 8184944503852385063899215925470;\n r_3.s_4 = r_3_4;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000048f447beec0d805d9b82dcc23329fef268518035d7571f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000af8d4965358c4b9189c37bea0c11e81b15d65c340000000000000000000000000000000000000086b3a5ad101f85f5eb1b201412000000000000000000332d6741a0145b0e276e8ac3d8a8199850d67038f3af6e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e286f3d9e46ebf4dd9163e147cc0b973aa593d35000000000000000000000000000000000000006dc0cc4af67a0bc59fc9d8141e0000000000000000000085369f911f54c2c59923d487738d97ddfeac73f4767c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d441b17435f37f2957925974e844c44c82f668e000000000000000000000000000000000000001ea2d63f143c442203a56e5ad1000000000000000000d8bc28e12f176ac22b7840723fbc831ee8096d237dc76d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000790c20c6ecd0491fd81706010107a9a9dbd2052800000000000000000000000000000000000000674efb688d8093ca9f75c790de" + }, + { + "name": "random-(uint56[],(bytes20,string,string[1]))", + "type": "(uint56[],(bytes20,string,string[1]))", + "value": [ + ["50757210905930403", "26426860011498859", "58033877176069121"], + [ + "0x1a151de90f531bfccc63b46a50ebbb6dbb7e1c74", + "Moo é🚀 o🚀oé éMo 🚀oooé 🚀 Mo🚀MoooM oM é Moo🚀é", + ["Moo é🚀Mo🚀🚀🚀é🚀oooo MMM é🚀Mo🚀🚀ooééMo🚀éo éo🚀é🚀oMM"] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "50757210905930403" + }, + { + "type": "number", + "value": "26426860011498859" + }, + { + "type": "number", + "value": "58033877176069121" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x1a151de90f531bfccc63b46a50ebbb6dbb7e1c74" + }, + { + "type": "string", + "value": "Moo é🚀 o🚀oé éMo 🚀oooé 🚀 Mo🚀MoooM oM é Moo🚀é" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo🚀🚀🚀é🚀oooo MMM é🚀Mo🚀🚀ooééMo🚀éo éo🚀é🚀oMM" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061042b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610265565b60405180910390f35b6100566101b7565b61005e6101b7565b6040805160038082526080820190925260009160208201606080368337019050509050600066b4536a15d66aa3905080826000815181106100a1576100a1610343565b602002602001019066ffffffffffffff16908166ffffffffffffff1681525050506000665de316d383ad6b905080826001815181106100e2576100e2610343565b602002602001019066ffffffffffffff16908166ffffffffffffff168152505050600066ce2d80fa04ac019050808260028151811061012357610123610343565b66ffffffffffffff909216602092830291909101909101525081526101466101d6565b730685477a43d4c6ff3318ed1a943aeedb6edf871d60621b8152604080516080810190915260458082526000919061035a602083013960208301525061018a6101f1565b600060405180608001604052806057815260200161039f6057913982525060408201526020820152919050565b6040518060400160405280606081526020016101d16101d6565b905290565b60408051606080820183526000825260208201529081016101d15b60405180602001604052806001905b60608152602001906001900390816102005790505090565b6000815180845260005b8181101561023e57602081850181015186830182015201610222565b81811115610250576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160408383015280516060840181905260009291820190839060808601905b808310156102b357835166ffffffffffffff16825292840192600192909201919084019061028a565b50838701519250601f198682030160408701526bffffffffffffffffffffffff1983511681528383015191506060848201526102f26060820183610218565b604093840151828203929094019190915290508083810160005b6001811015610337578382038352610325828651610218565b9486019492860192915060010161030c565b50979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80206ff09f9a806fc3a92020c3a94d6f20f09f9a806f6f6fc3a920f09f9a8020204d6ff09f9a804d6f6f6f4d206f4d20c3a9204d6f6ff09f9a80c3a94d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a80f09f9a80c3a9f09f9a806f6f6f6f204d4d4d20c3a9f09f9a804d6ff09f9a80f09f9a806f6fc3a9c3a94d6ff09f9a80c3a96f20c3a96ff09f9a80c3a9f09f9a806f4d4da26469706673582212202fec8cf8695dab0cc2801cd9bba6b82089d0b3d8d9f9c45ee8168a94428e943c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7e02d5ab {\n bytes20 s_0;\n string s_1;\n string[1] s_2;\n }\n\n struct S_10b90920 {\n uint56[] s_0;\n S_7e02d5ab s_1;\n }\n\n function test () public pure returns (S_10b90920 memory) {\n S_10b90920 memory r;\n {\n uint56[] memory r_0 = new uint56[](3);\n {\n uint56 r_0_0 = 50757210905930403;\n r_0[0] = r_0_0;\n }\n {\n uint56 r_0_1 = 26426860011498859;\n r_0[1] = r_0_1;\n }\n {\n uint56 r_0_2 = 58033877176069121;\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n S_7e02d5ab memory r_1;\n {\n bytes20 r_1_0 = bytes20(0x1a151dE90f531Bfccc63B46A50ebBB6DBB7E1c74);\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀 o🚀oé éMo 🚀oooé 🚀 Mo🚀MoooM oM é Moo🚀é\";\n r_1.s_1 = r_1_1;\n }\n {\n string[1] memory r_1_2;\n {\n string memory r_1_2_0 = unicode\"Moo é🚀Mo🚀🚀🚀é🚀oooo MMM é🚀Mo🚀🚀ooééMo🚀éo éo🚀é🚀oMM\";\n r_1_2[0] = r_1_2_0;\n }\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000b4536a15d66aa3000000000000000000000000000000000000000000000000005de316d383ad6b00000000000000000000000000000000000000000000000000ce2d80fa04ac011a151de90f531bfccc63b46a50ebbb6dbb7e1c74000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a80206ff09f9a806fc3a92020c3a94d6f20f09f9a806f6f6fc3a920f09f9a8020204d6ff09f9a804d6f6f6f4d206f4d20c3a9204d6f6ff09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a80f09f9a80c3a9f09f9a806f6f6f6f204d4d4d20c3a9f09f9a804d6ff09f9a80f09f9a806f6fc3a9c3a94d6ff09f9a80c3a96f20c3a96ff09f9a80c3a9f09f9a806f4d4d000000000000000000" + }, + { + "name": "random-string[2][3][4][1][4]", + "type": "string[2][3][4][1][4]", + "value": [ + [ + [ + [ + ["Moo é🚀🚀éM🚀o o oo oo 🚀o 🚀Moo🚀o o", "Moo é🚀"], + ["Moo é🚀🚀ooé oMo é MéMM ", "Moo é🚀"], + ["Moo é🚀Mo M o", "Moo é🚀"] + ], + [ + [ + "Moo é🚀o 🚀oM éoM éoMé MéMoéoéM🚀éM oo oooéMoo🚀 o🚀M 🚀ooéo M ", + "Moo é🚀o 🚀éé🚀 Moo 🚀ooM🚀Mooé🚀éMoMo o🚀 oéoMoo🚀🚀🚀🚀🚀🚀éo Mé🚀 oé M M" + ], + ["Moo é🚀🚀🚀o", "Moo é🚀"], + [ + "Moo é🚀o oMéo🚀Mé oMMéé 🚀 ooMM é🚀o🚀", + "Moo é🚀é🚀 Mo oM Mé ééé🚀o é oé oo" + ] + ], + [ + ["Moo é🚀MééMéM o🚀é MMMMéééMéoo", "Moo é🚀 oo🚀é"], + [ + "Moo é🚀é🚀o🚀oM oM🚀MM 🚀oooMééo🚀 ooé🚀oé🚀oo 🚀 oM", + "Moo é🚀 oo 🚀oM🚀M🚀 o 🚀oM🚀🚀é éMMo🚀oo M oMoé🚀oéo🚀🚀o🚀 ooo" + ], + ["Moo é🚀oo", "Moo é🚀o🚀 oo🚀Méooé oo oM "] + ], + [ + ["Moo é🚀ooMMéoMéo ooMMMoé", "Moo é🚀"], + [ + "Moo é🚀oooMMo🚀oo o 🚀oMM🚀o oooM🚀🚀oo🚀🚀MéoMMM 🚀 M oo🚀oo🚀oé🚀éo🚀 o", + "Moo é🚀MMMMMM🚀oéo oéé 🚀🚀é oo🚀éoo" + ], + ["Moo é🚀éoMoo🚀M o", "Moo é🚀 é🚀ooéé🚀ééoooo🚀 M é M 🚀oéoMoooéooooMMoMM"] + ] + ] + ], + [ + [ + [ + ["Moo é🚀", "Moo é🚀 Mo oéo🚀 M🚀oMMMéo"], + [ + "Moo é🚀🚀ooMooé🚀🚀o oo éoé ooMo🚀🚀🚀ooo🚀Méo🚀éMoé 🚀oooo MM", + "Moo é🚀ééoéoéoooM Mo Moéoéo🚀MéMé" + ], + ["Moo é🚀🚀éo🚀M🚀o ooéM🚀M", "Moo é🚀éooMo é ooo é "] + ], + [ + [ + "Moo é🚀Moooooo🚀oéoMMé M🚀🚀éoo 🚀Mééoo🚀o 🚀M oo", + "Moo é🚀o o🚀oMooo🚀oo🚀🚀MoM oMMo🚀oooM " + ], + ["Moo é🚀MéM ooooéooé ", "Moo é🚀"], + [ + "Moo é🚀 éo 🚀 🚀oo🚀éMoo🚀 oéé🚀M éMé oéoMéMoo🚀 🚀🚀oéoo ", + "Moo é🚀M🚀 éé" + ] + ], + [ + ["Moo é🚀Mo🚀oooMéé🚀", "Moo é🚀"], + [ + "Moo é🚀é🚀🚀🚀 🚀ooMMoé🚀 oMé éoééé🚀🚀Mo🚀 🚀oM", + "Moo é🚀éM🚀🚀éo M o 🚀 " + ], + ["Moo é🚀 ooo oo é🚀 🚀Mo 🚀é", "Moo é🚀o oooéoMo 🚀 M"] + ], + [ + ["Moo é🚀o🚀o 🚀o ooM 🚀oMoéooo oMoo🚀", "Moo é🚀🚀 🚀oé🚀MMM "], + [ + "Moo é🚀MoMé🚀o ooo oMé 🚀🚀é 🚀Mo MMMM🚀o🚀", + "Moo é🚀o🚀 é 🚀é🚀oMéoooM 🚀🚀🚀 oMoM o🚀é 🚀o M🚀éo🚀" + ], + ["Moo é🚀🚀M oé🚀oo🚀o", "Moo é🚀"] + ] + ] + ], + [ + [ + [ + ["Moo é🚀", "Moo é🚀o🚀🚀 é 🚀éo🚀🚀oéo MM🚀o🚀o éoooo🚀o ééé"], + ["Moo é🚀oo éooooooMo🚀o oo🚀M o ", "Moo é🚀"], + ["Moo é🚀 🚀Mo", "Moo é🚀oooMo🚀o🚀MM 🚀"] + ], + [ + [ + "Moo é🚀 🚀o M🚀 o ééM🚀oéooo🚀oM🚀M🚀MooMéoo🚀oMéooooo éM🚀", + "Moo é🚀éM🚀é 🚀🚀éoMMo éoéo 🚀MMéoo🚀 o🚀éé🚀M M🚀oéo🚀oM" + ], + ["Moo é🚀", "Moo é🚀 M🚀🚀é Méoo🚀 🚀Moo🚀éé🚀oé🚀"], + [ + "Moo é🚀🚀ooMo🚀oooéooMM🚀éM🚀éoooé o🚀Mo o🚀MM🚀é ééo 🚀oooMoo", + "Moo é🚀é🚀MMo 🚀oo o🚀éooMoé " + ] + ], + [ + ["Moo é🚀éoMoMoMééoé🚀🚀🚀🚀oéoéé🚀🚀é 🚀 Mo oMoMM", "Moo é🚀🚀 🚀"], + [ + "Moo é🚀ééMé🚀o🚀oéM🚀🚀oé M o oéé é🚀o🚀oé oooo🚀é ooo", + "Moo é🚀🚀o 🚀🚀🚀Moo é 🚀🚀o 🚀🚀é MMoMéoo 🚀oé o Moo" + ], + [ + "Moo é🚀🚀🚀éMoM oM 🚀o oMoéo M é oM🚀MM oMMooMoo", + "Moo é🚀 🚀oooMo🚀oéMMéoéooéo🚀éooé oooM MM🚀ééMé oo ooMM🚀éoo" + ] + ], + [ + ["Moo é🚀", "Moo é🚀"], + [ + "Moo é🚀ééoM oM🚀oMéoM🚀🚀MoMéooM🚀ooo oé 🚀🚀 oMMo", + "Moo é🚀 M🚀M🚀 🚀o🚀Méoo ééMoéééM oMMo" + ], + [ + "Moo é🚀M ooé Mo 🚀oéM🚀🚀MMMéo🚀 ooéo🚀🚀 o🚀ooo", + "Moo é🚀oéooééoM 🚀ooo🚀ooéé" + ] + ] + ] + ], + [ + [ + [ + [ + "Moo é🚀o 🚀MoéMMoé🚀", + "Moo é🚀ooo🚀🚀éoéMéoMéM Mo éMoM éM é 🚀 MM 🚀🚀M oé é" + ], + ["Moo é🚀🚀oo🚀oo", "Moo é🚀MMM"], + ["Moo é🚀oMé", "Moo é🚀Mo oMM o🚀🚀M🚀 éo o🚀 oé MoMéo🚀 oé o🚀é"] + ], + [ + ["Moo é🚀🚀MM🚀éMé", "Moo é🚀MM Mo🚀"], + ["Moo é🚀", "Moo é🚀MoM"], + [ + "Moo é🚀oo é oMoéoo🚀é🚀🚀ooéooé é MMM🚀🚀M 🚀🚀🚀🚀🚀 é MMM🚀 oM🚀🚀o Mo", + "Moo é🚀oMMooé é🚀🚀éo🚀o M éMo🚀🚀MooMoo🚀🚀oMo " + ] + ], + [ + [ + "Moo é🚀", + "Moo é🚀 ooM ooM🚀é M oéMé🚀éoéM🚀ooMoo MéMoMMMoé🚀🚀éM🚀 oM🚀oM ééM" + ], + [ + "Moo é🚀oo🚀M🚀o éé oéMMé🚀Moo🚀oéo🚀oo🚀🚀oMoo 🚀🚀 éé éo o o🚀", + "Moo é🚀 ééMéMMoo🚀ooMM🚀🚀ooéMé MoéoM éMoéoéo" + ], + ["Moo é🚀", "Moo é🚀M o🚀MM o🚀 Mo🚀é🚀oMo🚀Mo ooMoé🚀🚀oo🚀🚀 o oM oM 🚀"] + ], + [ + [ + "Moo é🚀", + "Moo é🚀o Moo oo é🚀ééo🚀oooooo éo oéoé éé🚀🚀 MoééMé oéo🚀MéM" + ], + [ + "Moo é🚀éoo🚀o🚀o éMo 🚀ooMo🚀🚀", + "Moo é🚀MéMoo🚀o🚀Méo M🚀 o🚀oM🚀o🚀 M 🚀 ooMoo MoM 🚀oéoéé" + ], + ["Moo é🚀 éooMMo ooMoé oéoo", "Moo é🚀oo é Moooé"] + ] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éM🚀o o oo oo 🚀o 🚀Moo🚀o o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ooé oMo é MéMM " + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo M o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀oM éoM éoMé MéMoéoéM🚀éM oo oooéMoo🚀 o🚀M 🚀ooéo M " + }, + { + "type": "string", + "value": "Moo é🚀o 🚀éé🚀 Moo 🚀ooM🚀Mooé🚀éMoMo o🚀 oéoMoo🚀🚀🚀🚀🚀🚀éo Mé🚀 oé M M" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oMéo🚀Mé oMMéé 🚀 ooMM é🚀o🚀" + }, + { + "type": "string", + "value": "Moo é🚀é🚀 Mo oM Mé ééé🚀o é oé oo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MééMéM o🚀é MMMMéééMéoo" + }, + { + "type": "string", + "value": "Moo é🚀 oo🚀é" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀o🚀oM oM🚀MM 🚀oooMééo🚀 ooé🚀oé🚀oo 🚀 oM" + }, + { + "type": "string", + "value": "Moo é🚀 oo 🚀oM🚀M🚀 o 🚀oM🚀🚀é éMMo🚀oo M oMoé🚀oéo🚀🚀o🚀 ooo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀 oo🚀Méooé oo oM " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooMMéoMéo ooMMMoé" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooMMo🚀oo o 🚀oMM🚀o oooM🚀🚀oo🚀🚀MéoMMM 🚀 M oo🚀oo🚀oé🚀éo🚀 o" + }, + { + "type": "string", + "value": "Moo é🚀MMMMMM🚀oéo oéé 🚀🚀é oo🚀éoo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoMoo🚀M o" + }, + { + "type": "string", + "value": "Moo é🚀 é🚀ooéé🚀ééoooo🚀 M é M 🚀oéoMoooéooooMMoMM" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀 Mo oéo🚀 M🚀oMMMéo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ooMooé🚀🚀o oo éoé ooMo🚀🚀🚀ooo🚀Méo🚀éMoé 🚀oooo MM" + }, + { + "type": "string", + "value": "Moo é🚀ééoéoéoooM Mo Moéoéo🚀MéMé" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éo🚀M🚀o ooéM🚀M" + }, + { + "type": "string", + "value": "Moo é🚀éooMo é ooo é " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Moooooo🚀oéoMMé M🚀🚀éoo 🚀Mééoo🚀o 🚀M oo" + }, + { + "type": "string", + "value": "Moo é🚀o o🚀oMooo🚀oo🚀🚀MoM oMMo🚀oooM " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéM ooooéooé " + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éo 🚀 🚀oo🚀éMoo🚀 oéé🚀M éMé oéoMéMoo🚀 🚀🚀oéoo " + }, + { + "type": "string", + "value": "Moo é🚀M🚀 éé" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo🚀oooMéé🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀🚀🚀 🚀ooMMoé🚀 oMé éoééé🚀🚀Mo🚀 🚀oM" + }, + { + "type": "string", + "value": "Moo é🚀éM🚀🚀éo M o 🚀 " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 ooo oo é🚀 🚀Mo 🚀é" + }, + { + "type": "string", + "value": "Moo é🚀o oooéoMo 🚀 M" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀o 🚀o ooM 🚀oMoéooo oMoo🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀 🚀oé🚀MMM " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MoMé🚀o ooo oMé 🚀🚀é 🚀Mo MMMM🚀o🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀 é 🚀é🚀oMéoooM 🚀🚀🚀 oMoM o🚀é 🚀o M🚀éo🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀M oé🚀oo🚀o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀 é 🚀éo🚀🚀oéo MM🚀o🚀o éoooo🚀o ééé" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo éooooooMo🚀o oo🚀M o " + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀Mo" + }, + { + "type": "string", + "value": "Moo é🚀oooMo🚀o🚀MM 🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀o M🚀 o ééM🚀oéooo🚀oM🚀M🚀MooMéoo🚀oMéooooo éM🚀" + }, + { + "type": "string", + "value": "Moo é🚀éM🚀é 🚀🚀éoMMo éoéo 🚀MMéoo🚀 o🚀éé🚀M M🚀oéo🚀oM" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀 M🚀🚀é Méoo🚀 🚀Moo🚀éé🚀oé🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ooMo🚀oooéooMM🚀éM🚀éoooé o🚀Mo o🚀MM🚀é ééo 🚀oooMoo" + }, + { + "type": "string", + "value": "Moo é🚀é🚀MMo 🚀oo o🚀éooMoé " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoMoMoMééoé🚀🚀🚀🚀oéoéé🚀🚀é 🚀 Mo oMoMM" + }, + { + "type": "string", + "value": "Moo é🚀🚀 🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééMé🚀o🚀oéM🚀🚀oé M o oéé é🚀o🚀oé oooo🚀é ooo" + }, + { + "type": "string", + "value": "Moo é🚀🚀o 🚀🚀🚀Moo é 🚀🚀o 🚀🚀é MMoMéoo 🚀oé o Moo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀éMoM oM 🚀o oMoéo M é oM🚀MM oMMooMoo" + }, + { + "type": "string", + "value": "Moo é🚀 🚀oooMo🚀oéMMéoéooéo🚀éooé oooM MM🚀ééMé oo ooMM🚀éoo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééoM oM🚀oMéoM🚀🚀MoMéooM🚀ooo oé 🚀🚀 oMMo" + }, + { + "type": "string", + "value": "Moo é🚀 M🚀M🚀 🚀o🚀Méoo ééMoéééM oMMo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M ooé Mo 🚀oéM🚀🚀MMMéo🚀 ooéo🚀🚀 o🚀ooo" + }, + { + "type": "string", + "value": "Moo é🚀oéooééoM 🚀ooo🚀ooéé" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀MoéMMoé🚀" + }, + { + "type": "string", + "value": "Moo é🚀ooo🚀🚀éoéMéoMéM Mo éMoM éM é 🚀 MM 🚀🚀M oé é" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oo🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀MMM" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMé" + }, + { + "type": "string", + "value": "Moo é🚀Mo oMM o🚀🚀M🚀 éo o🚀 oé MoMéo🚀 oé o🚀é" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀MM🚀éMé" + }, + { + "type": "string", + "value": "Moo é🚀MM Mo🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀MoM" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo é oMoéoo🚀é🚀🚀ooéooé é MMM🚀🚀M 🚀🚀🚀🚀🚀 é MMM🚀 oM🚀🚀o Mo" + }, + { + "type": "string", + "value": "Moo é🚀oMMooé é🚀🚀éo🚀o M éMo🚀🚀MooMoo🚀🚀oMo " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀 ooM ooM🚀é M oéMé🚀éoéM🚀ooMoo MéMoMMMoé🚀🚀éM🚀 oM🚀oM ééM" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀M🚀o éé oéMMé🚀Moo🚀oéo🚀oo🚀🚀oMoo 🚀🚀 éé éo o o🚀" + }, + { + "type": "string", + "value": "Moo é🚀 ééMéMMoo🚀ooMM🚀🚀ooéMé MoéoM éMoéoéo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀M o🚀MM o🚀 Mo🚀é🚀oMo🚀Mo ooMoé🚀🚀oo🚀🚀 o oM oM 🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o Moo oo é🚀ééo🚀oooooo éo oéoé éé🚀🚀 MoééMé oéo🚀MéM" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoo🚀o🚀o éMo 🚀ooMo🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀MéMoo🚀o🚀Méo M🚀 o🚀oM🚀o🚀 M 🚀 ooMoo MoM 🚀oéoéé" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éooMMo ooMoé oéoo" + }, + { + "type": "string", + "value": "Moo é🚀oo é Moooé" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061227f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906112e8565b60405180910390f35b61005661120d565b61005e61120d565b61006661123a565b61006e611267565b610076611294565b61007e6112c1565b60006040518060600160405280603381526020016122176033913982525060408051808201909152600a8152689adede418753e13f3560b71b60208083019190915282015281526100cd6112c1565b6000604051806060016040528060228152602001611e4c6022913982525060408051808201909152600a8152689adede418753e13f3560b71b602080830191909152808301919091528201526101216112c1565b604080518082018252601081526f4d6f6f20c3a9f09f9a804d6f204d206f60801b60208083019190915290835281518083018352600a8152689adede418753e13f3560b71b8183015290830152820152815261017b611294565b6101836112c1565b6000604051806080016040528060558152602001612040605591398252506040805160a08101909152607180825260009190611805602083013960208301525081526101cd6112c1565b60408051808201825260138152724d6f6f20c3a9f09f9a80f09f9a80f09f9a806f60681b6020808301919091529083528151808301909252600a8252689adede418753e13f3560b71b828201528281019190915282015261022c6112c1565b6000604051806060016040528060368152602001611da0603691398252506040805160608101909152603080825260009190611c0e6020830139602080840191909152604084019290925250820152610283611294565b61028b6112c1565b60006040518060600160405280602b8152602001611dd6602b91398252506040805180820190915260138152724d6f6f20c3a9f09f9a80206f6ff09f9a80c3a960681b60208083019190915282015281526102e46112c1565b60006040518060800160405280604c81526020016120cc604c91398252506040805160808101909152605e808252600091906115da6020830139602080840191909152830191909152506103366112c1565b604080518082018252600c81526b4d6f6f20c3a9f09f9a806f6f60a01b602080830191909152908352815160608101909252602480835260009291611d7c90830139602083015250604080830191909152820152610392611294565b61039a6112c1565b604080518082018252601e81527f4d6f6f20c3a9f09f9a806f6f4d4dc3a96f4dc3a96f206f6f4d4d4d6fc3a900006020808301919091529083528151808301909252600a8252689adede418753e13f3560b71b8282015282015281526103fe6112c1565b60006040518060a0016040528060698152602001611f766069913982525060408051606081019091526034808252600091906121e36020830139602080840191909152830191909152506104506112c1565b604080518082018252601781527f4d6f6f20c3a9f09f9a80c3a96f4d6f6ff09f9a804d206f000000000000000000602080830191909152908352815160808101909252604680835260009291611b829083013960208301525060408201526060820152815281526104bf61123a565b6104c7611267565b6104cf611294565b6104d76112c1565b604080518082018252600a8152689adede418753e13f3560b71b60208083019190915290835281516060810190925260238083526000929161148b9083013960208301525081526105266112c1565b60006040518060800160405280605e81526020016116c2605e91398252506040805160608101909152602e808252600091906118c36020830139602080840191909152830191909152506105786112c1565b600060405180606001604052806026815260200161216660269139825250604080518082018252601c81527f4d6f6f20c3a9f09f9a80c3a96f6f4d6f20c3a9206f6f6f2020c3a9200000000060208083019190915283015282015281526105dd611294565b6105e56112c1565b6000604051806080016040528060458152602001611e6e60459139825250604080516060810190915260358082526000919061177f6020830139602083015250815261062f6112c1565b604080518082018252601a81527f4d6f6f20c3a9f09f9a804dc3a94d206f6f6f6fc3a96f6fc3a9200000000000006020808301919091529083528151808301909252600a8252689adede418753e13f3560b71b82820152828101919091528201526106986112c1565b600060405180608001604052806057815260200161218c6057913982525060408051808201825260148152734d6f6f20c3a9f09f9a804df09f9a8020c3a9c3a960601b60208083019190915280840191909152908301919091528201526106fd611294565b6107056112c1565b604080518082018252601c81527f4d6f6f20c3a9f09f9a804d6ff09f9a806f6f6f4dc3a9c3a9f09f9a80000000006020808301919091529083528151808301909252600a8252689adede418753e13f3560b71b8282015282015281526107696112c1565b60006040518060800160405280604d8152602001611876604d91398252506040805160608101909152602380825260009190611ad76020830139602080840191909152830191909152506107bb6112c1565b6000604051806060016040528060268152602001611a0960269139825250604080518082018252601c81527f4d6f6f20c3a9f09f9a806f206f6f6fc3a96f4d6f20f09f9a8020204d0000000060208083019190915283015282810191909152820152610825611294565b61082d6112c1565b6000604051806060016040528060318152602001611afa6031913982525060408051808201909152601e81527f4d6f6f20c3a9f09f9a80f09f9a8020f09f9a806fc3a9f09f9a804d4d4d20000060208083019190915282015281526108906112c1565b60006040518060600160405280603e8152602001611945603e91398252506040805160808101909152605580825260009190611c976020830139602080840191909152830191909152506108e26112c1565b604080518082018252601e81527f4d6f6f20c3a9f09f9a80f09f9a804d206fc3a9f09f9a806f6ff09f9a806f000060208083019190915290835281518083018352600a8152689adede418753e13f3560b71b818301528382015290830191909152606083019190915290825282015261095961123a565b610961611267565b610969611294565b6109716112c1565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160808101909252604b80835260009291611e019083013960208301525081526109c06112c1565b600060405180606001604052806027815260200161213f6027913982525060408051808201909152600a8152689adede418753e13f3560b71b60208083019190915280830191909152820152610a146112c1565b60408051808201825260118152704d6f6f20c3a9f09f9a8020f09f9a804d6f60781b60208083019190915290835281518083018352601f81527f4d6f6f20c3a9f09f9a806f6f6f4d6ff09f9a806ff09f9a804d4d20f09f9a800081830152908301528201528152610a83611294565b610a8b6112c1565b6000604051806080016040528060548152602001611437605491398252506040805160808101909152605780825260009190611f1f60208301396020830152508152610ad56112c1565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160608101909252603c808352600092916114ae9083013960208084019190915283019190915250610b2c6112c1565b6000604051806080016040528060598152602001611c3e605991398252506040805160608101909152602c808252600091906115186020830139602080840191909152604084019290925250820152610b83611294565b610b8b6112c1565b60006040518060800160405280604a8152602001611cec604a91398252506040805180820190915260138152719adede418753e13f3501e13f350041e13f35606f1b6020808301919091528201528152610be36112c1565b60006040518060800160405280605181526020016117b4605191398252506040805160808101909152605080825260009190611544602083013960208084019190915283019190915250610c356112c1565b60006040518060600160405280603f8152602001611638603f913982525060408051608081019091526054808252600091906118f16020830139602083015250604080830191909152820152610c89611294565b610c916112c1565b604080518082018252600a808252689adede418753e13f3560b71b60208084018290529285528351808501909452908352828201528201528152610cd36112c1565b6000604051806080016040528060468152602001611d36604691398252506040805160608101909152603780825260009190612095602083013960208084019190915283019190915250610d256112c1565b600060405180608001604052806046815260200161159460469139825250604080516060810190915260278082526000919061211860208301396020830152506040808301919091526060830191909152908252820152610d8461123a565b610d8c611267565b610d94611294565b610d9c6112c1565b604080518082018252601e81527f4d6f6f20c3a9f09f9a806f2020f09f9a804d6fc3a94d4d6fc3a9f09f9a800000602080830191909152908352815160808101909252604b80835260009291611677908301396020830152508152610dff6112c1565b60408051808201825260168152754d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806f6f60501b6020808301919091529083528151808301909252600d82526c4d6f6f20c3a9f09f9a804d4d4d60981b8282015282810191909152820152610e656112c1565b604080518082018252600e81526d4d6f6f20c3a9f09f9a806f4dc3a960901b6020808301919091529083528151608081019092526045808352600092916119c49083013960208301525060408201528152610ebe611294565b610ec66112c1565b604080518082018252601981527f4d6f6f20c3a9f09f9a80f09f9a804d4df09f9a80c3a94dc3a900000000000000602080830191909152908352815180830190925260148252729adede418753e13f35009a9a40409adfe13f3560671b828201528201528152610f346112c1565b604080518082018252600a8152689adede418753e13f3560b71b6020808301919091529083528151808301909252600d82526c4d6f6f20c3a9f09f9a804d6f4d60981b8282015282810191909152820152610f8d6112c1565b60006040518060a00160405280606c8152602001611eb3606c91398252506040805160808101909152604680825260009190611bc86020830139602080840191909152604084019290925250820152610fe4611294565b610fec6112c1565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160808101909252605f8083526000929161172090830139602083015250815261103b6112c1565b60006040518060a0016040528060618152602001611fdf60619139825250604080516080810190915260418082526000919061198360208301396020808401919091528301919091525061108d6112c1565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160808101909252605580835260009291611a82908301396020830152506040808301919091528201526110e6611294565b6110ee6112c1565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160808101909252605780835260009291611b2b90830139602083015250815261113d6112c1565b60006040518060600160405280602e81526020016114ea602e91398252506040805160808101909152605380825260009190611a2f60208301396020808401919091528301919091525061118f6112c1565b604080518082018252601f81527f4d6f6f20c3a9f09f9a8020c3a96f6f4d4d6f206f6f4d6fc3a9206fc3a96f6f006020808301919091529083528151808301835260168152754d6f6f20c3a9f09f9a806f6f20c3a9204d6f6f6fc3a960501b8183015290830152820152606082810191909152908252820152919050565b60405180608001604052806004905b61122461123a565b81526020019060019003908161121c5790505090565b60405180602001604052806001905b611251611267565b8152602001906001900390816112495790505090565b60405180608001604052806004905b61127e611294565b8152602001906001900390816112765790505090565b60405180606001604052806003905b6112ab6112c1565b8152602001906001900390816112a35790505090565b60405180604001604052806002905b60608152602001906001900390816112d05790505090565b6020815260006020820160a083018460005b600481101561142b57858303601f190184528151836020810160005b60018110156114125786820383528351826080810160005b60048110156113fa5785820383528351826060810160005b60038110156113e25785820383528351826040810160005b60028110156113ca5785820383528351805180845260005b8181101561139257602081840181015186830182015201611376565b818111156113a4576000602083870101525b5060209586019594850194601f91909101601f191693909301909201915060010161135e565b50602096870196959095019493505050600101611346565b5060209687019695909501949350505060010161132e565b50602096870196959095019493505050600101611316565b50602096870196909550939093019250506001016112fa565b50909594505050505056fe4d6f6f20c3a9f09f9a8020f09f9a806f204df09f9a80206f20c3a9c3a94df09f9a806fc3a96f6f6ff09f9a806f4df09f9a804df09f9a804d6f6f4dc3a96f6ff09f9a806f4dc3a96f6f6f6f6f20c3a94df09f9a804d6f6f20c3a9f09f9a80204d6f206fc3a96ff09f9a80204df09f9a806f4d4d4dc3a96f4d6f6f20c3a9f09f9a80204df09f9a80f09f9a80c3a9204dc3a96f6ff09f9a802020f09f9a804d6f6ff09f9a80c3a9c3a9f09f9a806fc3a9f09f9a804d6f6f20c3a9f09f9a80c3a96f6ff09f9a806ff09f9a806f20c3a94d6f20f09f9a806f6f4d6ff09f9a80f09f9a804d6f6f20c3a9f09f9a80c3a9f09f9a804d4d6f2020f09f9a806f6f206ff09f9a80c3a96f6f4d6fc3a92020204d6f6f20c3a9f09f9a80f09f9a806f20f09f9a80f09f9a80f09f9a804d6f6f20c3a920f09f9a80f09f9a806f20f09f9a80f09f9a80c3a9204d4d6f4dc3a96f6f2020f09f9a806fc3a9206f20204d6f6f4d6f6f20c3a9f09f9a804d206f6fc3a9204d6f20f09f9a806fc3a94df09f9a80f09f9a804d4d4dc3a96ff09f9a80206f6fc3a96ff09f9a80f09f9a8020206ff09f9a806f6f6f4d6f6f20c3a9f09f9a80206f6f20f09f9a806f4df09f9a804df09f9a80206f2020f09f9a806f4df09f9a80f09f9a80c3a920c3a94d4d6ff09f9a806f6f204d206f4d6fc3a9f09f9a806fc3a96ff09f9a80f09f9a806ff09f9a80206f6f6f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a94d6f4d206f4d20f09f9a806f206f4d6fc3a96f204d2020c3a9206f4df09f9a804d4d206f4d4d6f6f4d6f6f4d6f6f20c3a9f09f9a806f6f6ff09f9a80f09f9a80c3a96fc3a94dc3a96f4dc3a94d204d6f20c3a94d6f4d20c3a94d20c3a920f09f9a80204d4d20f09f9a80f09f9a804d206fc3a920c3a94d6f6f20c3a9f09f9a80f09f9a806f6f4d6f6fc3a9f09f9a80f09f9a806f2020206f6f20c3a96fc3a9206f6f4d6ff09f9a80f09f9a80f09f9a806f6f6ff09f9a804dc3a96ff09f9a80c3a94d6fc3a920f09f9a806f6f6f6f202020204d4d4d6f6f20c3a9f09f9a80206f6f4d206f6f4df09f9a80c3a9204d20206fc3a94dc3a9f09f9a80c3a96fc3a94df09f9a806f6f4d6f6f204dc3a94d6f4d4d4d6fc3a9f09f9a80f09f9a80c3a94df09f9a80206f4df09f9a806f4d20c3a9c3a94d4d6f6f20c3a9f09f9a806f206ff09f9a806f4d6f6f6ff09f9a806f6ff09f9a80f09f9a804d6f4d206f4d4d6ff09f9a806f6f6f4d204d6f6f20c3a9f09f9a80c3a9c3a94dc3a9f09f9a806ff09f9a806fc3a94df09f9a80f09f9a806fc3a9204d206f206fc3a9c3a920c3a9f09f9a806ff09f9a806fc3a9206f6f6f6ff09f9a80c3a9206f6f6f4d6f6f20c3a9f09f9a806f20f09f9a80c3a9c3a9f09f9a80204d6f6f20f09f9a806f6f4df09f9a804d6f6fc3a9f09f9a80c3a94d6f4d6f206ff09f9a80206fc3a96f4d6f6ff09f9a80f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80c3a96f204dc3a9f09f9a80206fc3a9204d20204d4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a802020f09f9a806f6f4d4d6fc3a9f09f9a80206f4dc3a920c3a96fc3a9c3a9c3a9f09f9a80f09f9a804d6ff09f9a8020f09f9a806f4d4d6f6f20c3a9f09f9a80c3a9c3a96fc3a96fc3a96f6f6f4d204d6f204d6fc3a96fc3a96ff09f9a804dc3a94dc3a94d6f6f20c3a9f09f9a8020f09f9a806f6f6f4d6ff09f9a806fc3a94d4dc3a96fc3a96f6fc3a96ff09f9a80c3a96f6fc3a9206f6f6f4d204d4df09f9a80c3a9c3a94dc3a9206f6f206f6f4d4df09f9a80c3a96f6f4d6f6f20c3a9f09f9a804d6f4dc3a9f09f9a806f20206f6f6f206f4dc3a920f09f9a80f09f9a80c3a920f09f9a804d6f204d4d4d4df09f9a806ff09f9a804d6f6f20c3a9f09f9a8020c3a9c3a94dc3a94d4d6f6ff09f9a806f6f4d4df09f9a80f09f9a806f6fc3a94dc3a920204d6fc3a96f4d2020c3a94d6fc3a96fc3a96f4d6f6f20c3a9f09f9a804d6f206f4d4d206ff09f9a80f09f9a804df09f9a8020c3a96f206ff09f9a80206fc3a9204d6f4dc3a96ff09f9a8020206fc3a9206ff09f9a80c3a94d6f6f20c3a9f09f9a80206f6f6f206f6f20c3a9f09f9a8020f09f9a804d6f20f09f9a80c3a94d6f6f20c3a9f09f9a804dc3a94d6f6ff09f9a806ff09f9a804dc3a96f204df09f9a8020206ff09f9a806f4df09f9a806ff09f9a80204d20f09f9a80206f6f4d6f6f204d6f4d20f09f9a806fc3a96fc3a9c3a94d6f6f20c3a9f09f9a804d206ff09f9a804d4d206ff09f9a80204d6ff09f9a80c3a9f09f9a806f4d6ff09f9a804d6f206f6f4d6fc3a9f09f9a80f09f9a806f6ff09f9a80f09f9a80206f206f4d206f4d20f09f9a804d6f6f20c3a9f09f9a80c3a94df09f9a80f09f9a80c3a96f204d20206f20f09f9a80204d6f6f20c3a9f09f9a806ff09f9a806f20f09f9a806f206f6f4d2020f09f9a806f4d6fc3a96f6f6f206f4d6f6ff09f9a804d6f6f20c3a9f09f9a806f204d6f6f206f6f20c3a9f09f9a80c3a9c3a96ff09f9a806f6f6f6f6f6f20c3a96f206fc3a96fc3a920c3a9c3a9f09f9a80f09f9a80204d6fc3a9c3a94dc3a9206fc3a96ff09f9a804dc3a94d4d6f6f20c3a9f09f9a8020c3a9f09f9a806f6fc3a9c3a9f09f9a80c3a9c3a96f6f6f6ff09f9a80204d20c3a9204d20f09f9a806fc3a96f4d6f6f6fc3a96f6f6f6f4d4d6f4d4d4d6f6f20c3a9f09f9a806f4d4d6f6fc3a920c3a9f09f9a80f09f9a80c3a96ff09f9a806f204d2020c3a94d6ff09f9a80f09f9a804d6f6f4d6f6ff09f9a80f09f9a806f4d6f204d6f6f20c3a9f09f9a80c3a9f09f9a80204d6f206f4d204dc3a920c3a9c3a9c3a9f09f9a806f20c3a9206fc3a9206f6f4d6f6f20c3a9f09f9a80f09f9a806f6f4d6ff09f9a806f6f6fc3a96f6f4d4df09f9a80c3a94df09f9a80c3a96f6f6fc3a9206ff09f9a804d6f206ff09f9a804d4df09f9a80c3a92020c3a9c3a96f20f09f9a806f6f6f4d6f6f4d6f6f20c3a9f09f9a806ff09f9a8020c3a920f09f9a80c3a9f09f9a806f4dc3a96f6f6f4d20f09f9a80f09f9a80f09f9a80206f4d6f4d206ff09f9a80c3a92020f09f9a806f2020204df09f9a80c3a96ff09f9a804d6f6f20c3a9f09f9a80c3a96f4d6f4d6f4dc3a9c3a96fc3a9f09f9a80f09f9a80f09f9a80f09f9a806fc3a96fc3a9c3a9f09f9a80f09f9a80c3a92020f09f9a80204d6f206f4d6f4d4d4d6f6f20c3a9f09f9a80c3a9c3a96f4d206f4df09f9a806f4dc3a96f4df09f9a80f09f9a804d6f4dc3a96f6f4df09f9a806f6f6f206fc3a920f09f9a80f09f9a80206f4d4d6f4d6f6f20c3a9f09f9a806ff09f9a80206f6ff09f9a804dc3a96f6fc3a9206f6f206f4d204d6f6f20c3a9f09f9a806f206f4dc3a96ff09f9a804dc3a9206f4d4dc3a9c3a920f09f9a80206f6f4d4d20c3a9f09f9a806ff09f9a804d6f6f20c3a9f09f9a804dc3a9c3a94dc3a94d206ff09f9a80c3a9204d4d4d4dc3a9c3a9c3a94dc3a96f6f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a802020c3a920f09f9a80c3a96ff09f9a80f09f9a806fc3a96f204d4df09f9a806ff09f9a806f20c3a96f6f6f6ff09f9a806f20c3a9c3a9c3a94d6f6f20c3a9f09f9a80f09f9a806f6fc3a9206f4d6f20c3a9204dc3a94d4d2020204d6f6f20c3a9f09f9a804d6f6f6f6f6f6ff09f9a806fc3a96f4d4dc3a9204df09f9a80f09f9a80c3a96f6f20f09f9a804dc3a9c3a96f6ff09f9a806f20f09f9a804d206f6f4d6f6f20c3a9f09f9a806f6f20c3a9206f4d6fc3a96f6ff09f9a80c3a9f09f9a80f09f9a806f6fc3a96f6fc3a920c3a9204d4d4df09f9a80f09f9a804d20f09f9a80f09f9a80f09f9a80f09f9a80f09f9a8020c3a9204d4d4df09f9a80206f4df09f9a80f09f9a806f204d6f4d6f6f20c3a9f09f9a80c3a94df09f9a80c3a920f09f9a80f09f9a80c3a96f4d4d6f20c3a96fc3a96f20f09f9a804d4dc3a96f6ff09f9a80206ff09f9a80c3a9c3a9f09f9a804d204df09f9a806fc3a96ff09f9a806f4d4d6f6f20c3a9f09f9a806f6f6f4d4d6ff09f9a806f6f206f20f09f9a806f4d4df09f9a806f206f6f6f4df09f9a80f09f9a806f6ff09f9a80f09f9a804dc3a96f4d4d4d202020f09f9a80204d206f6ff09f9a806f6ff09f9a806fc3a9f09f9a80c3a96ff09f9a80206f4d6f6f20c3a9f09f9a806f6ff09f9a804df09f9a806f202020c3a9c3a9206fc3a94d4dc3a9f09f9a804d6f6ff09f9a806fc3a96ff09f9a806f6ff09f9a80f09f9a806f4d6f6f20f09f9a80f09f9a8020c3a9c3a92020c3a96f206f206ff09f9a804d6f6f20c3a9f09f9a806f20f09f9a806f4d20c3a96f4d20c3a96f4dc3a9204dc3a94d6fc3a96fc3a94df09f9a80c3a94d206f6f206f6f6fc3a94d6f6ff09f9a80206ff09f9a804d20f09f9a806f6fc3a96f204d204d6f6f20c3a9f09f9a80204df09f9a804df09f9a8020f09f9a806ff09f9a804dc3a96f6f20c3a9c3a94d6fc3a9c3a9c3a94d206f4d4d6f4d6f6f20c3a9f09f9a80c3a9f09f9a806ff09f9a806f4d206f4df09f9a804d4d20f09f9a806f6f6f4dc3a9c3a96ff09f9a80206f6fc3a9f09f9a806fc3a9f09f9a806f6f20f09f9a80206f4d4d6f6f20c3a9f09f9a806fc3a96f6fc3a9c3a96f4d20f09f9a806f6f6ff09f9a806f6fc3a9c3a94d6f6f20c3a9f09f9a806f6f20c3a96f6f6f6f6f6f4d6ff09f9a806f206f6ff09f9a804d206f204d6f6f20c3a9f09f9a80f09f9a80c3a96ff09f9a804df09f9a806f206f6fc3a94df09f9a804d4d6f6f20c3a9f09f9a8020c3a96f20f09f9a802020f09f9a806f6ff09f9a80c3a94d6f6ff09f9a80206fc3a9c3a9f09f9a804d20c3a94dc3a9206fc3a96f4dc3a94d6f6ff09f9a8020f09f9a80f09f9a806fc3a96f6f204d6f6f20c3a9f09f9a804d4d4d4d4d4df09f9a806fc3a96f206fc3a9c3a920f09f9a80f09f9a80c3a9206f6ff09f9a80c3a96f6f4d6f6f20c3a9f09f9a80f09f9a80c3a94df09f9a806f206f206f6f206f6f20f09f9a806f20f09f9a804d6f6ff09f9a806f206fa2646970667358221220468dbbc4bcaec17e6344b9d2b644d332bdb2e74a3868640b7fb6fbb1eadd897064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n function test () public pure returns (string[2][3][4][1][4] memory) {\n string[2][3][4][1][4] memory r;\n {\n string[2][3][4][1] memory r_0;\n {\n string[2][3][4] memory r_0_0;\n {\n string[2][3] memory r_0_0_0;\n {\n string[2] memory r_0_0_0_0;\n {\n string memory r_0_0_0_0_0 = unicode\"Moo é🚀🚀éM🚀o o oo oo 🚀o 🚀Moo🚀o o\";\n r_0_0_0_0[0] = r_0_0_0_0_0;\n }\n {\n string memory r_0_0_0_0_1 = unicode\"Moo é🚀\";\n r_0_0_0_0[1] = r_0_0_0_0_1;\n }\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n string[2] memory r_0_0_0_1;\n {\n string memory r_0_0_0_1_0 = unicode\"Moo é🚀🚀ooé oMo é MéMM \";\n r_0_0_0_1[0] = r_0_0_0_1_0;\n }\n {\n string memory r_0_0_0_1_1 = unicode\"Moo é🚀\";\n r_0_0_0_1[1] = r_0_0_0_1_1;\n }\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n string[2] memory r_0_0_0_2;\n {\n string memory r_0_0_0_2_0 = unicode\"Moo é🚀Mo M o\";\n r_0_0_0_2[0] = r_0_0_0_2_0;\n }\n {\n string memory r_0_0_0_2_1 = unicode\"Moo é🚀\";\n r_0_0_0_2[1] = r_0_0_0_2_1;\n }\n r_0_0_0[2] = r_0_0_0_2;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n string[2][3] memory r_0_0_1;\n {\n string[2] memory r_0_0_1_0;\n {\n string memory r_0_0_1_0_0 = unicode\"Moo é🚀o 🚀oM éoM éoMé MéMoéoéM🚀éM oo oooéMoo🚀 o🚀M 🚀ooéo M \";\n r_0_0_1_0[0] = r_0_0_1_0_0;\n }\n {\n string memory r_0_0_1_0_1 = unicode\"Moo é🚀o 🚀éé🚀 Moo 🚀ooM🚀Mooé🚀éMoMo o🚀 oéoMoo🚀🚀🚀🚀🚀🚀éo Mé🚀 oé M M\";\n r_0_0_1_0[1] = r_0_0_1_0_1;\n }\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n string[2] memory r_0_0_1_1;\n {\n string memory r_0_0_1_1_0 = unicode\"Moo é🚀🚀🚀o\";\n r_0_0_1_1[0] = r_0_0_1_1_0;\n }\n {\n string memory r_0_0_1_1_1 = unicode\"Moo é🚀\";\n r_0_0_1_1[1] = r_0_0_1_1_1;\n }\n r_0_0_1[1] = r_0_0_1_1;\n }\n {\n string[2] memory r_0_0_1_2;\n {\n string memory r_0_0_1_2_0 = unicode\"Moo é🚀o oMéo🚀Mé oMMéé 🚀 ooMM é🚀o🚀\";\n r_0_0_1_2[0] = r_0_0_1_2_0;\n }\n {\n string memory r_0_0_1_2_1 = unicode\"Moo é🚀é🚀 Mo oM Mé ééé🚀o é oé oo\";\n r_0_0_1_2[1] = r_0_0_1_2_1;\n }\n r_0_0_1[2] = r_0_0_1_2;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n string[2][3] memory r_0_0_2;\n {\n string[2] memory r_0_0_2_0;\n {\n string memory r_0_0_2_0_0 = unicode\"Moo é🚀MééMéM o🚀é MMMMéééMéoo\";\n r_0_0_2_0[0] = r_0_0_2_0_0;\n }\n {\n string memory r_0_0_2_0_1 = unicode\"Moo é🚀 oo🚀é\";\n r_0_0_2_0[1] = r_0_0_2_0_1;\n }\n r_0_0_2[0] = r_0_0_2_0;\n }\n {\n string[2] memory r_0_0_2_1;\n {\n string memory r_0_0_2_1_0 = unicode\"Moo é🚀é🚀o🚀oM oM🚀MM 🚀oooMééo🚀 ooé🚀oé🚀oo 🚀 oM\";\n r_0_0_2_1[0] = r_0_0_2_1_0;\n }\n {\n string memory r_0_0_2_1_1 = unicode\"Moo é🚀 oo 🚀oM🚀M🚀 o 🚀oM🚀🚀é éMMo🚀oo M oMoé🚀oéo🚀🚀o🚀 ooo\";\n r_0_0_2_1[1] = r_0_0_2_1_1;\n }\n r_0_0_2[1] = r_0_0_2_1;\n }\n {\n string[2] memory r_0_0_2_2;\n {\n string memory r_0_0_2_2_0 = unicode\"Moo é🚀oo\";\n r_0_0_2_2[0] = r_0_0_2_2_0;\n }\n {\n string memory r_0_0_2_2_1 = unicode\"Moo é🚀o🚀 oo🚀Méooé oo oM \";\n r_0_0_2_2[1] = r_0_0_2_2_1;\n }\n r_0_0_2[2] = r_0_0_2_2;\n }\n r_0_0[2] = r_0_0_2;\n }\n {\n string[2][3] memory r_0_0_3;\n {\n string[2] memory r_0_0_3_0;\n {\n string memory r_0_0_3_0_0 = unicode\"Moo é🚀ooMMéoMéo ooMMMoé\";\n r_0_0_3_0[0] = r_0_0_3_0_0;\n }\n {\n string memory r_0_0_3_0_1 = unicode\"Moo é🚀\";\n r_0_0_3_0[1] = r_0_0_3_0_1;\n }\n r_0_0_3[0] = r_0_0_3_0;\n }\n {\n string[2] memory r_0_0_3_1;\n {\n string memory r_0_0_3_1_0 = unicode\"Moo é🚀oooMMo🚀oo o 🚀oMM🚀o oooM🚀🚀oo🚀🚀MéoMMM 🚀 M oo🚀oo🚀oé🚀éo🚀 o\";\n r_0_0_3_1[0] = r_0_0_3_1_0;\n }\n {\n string memory r_0_0_3_1_1 = unicode\"Moo é🚀MMMMMM🚀oéo oéé 🚀🚀é oo🚀éoo\";\n r_0_0_3_1[1] = r_0_0_3_1_1;\n }\n r_0_0_3[1] = r_0_0_3_1;\n }\n {\n string[2] memory r_0_0_3_2;\n {\n string memory r_0_0_3_2_0 = unicode\"Moo é🚀éoMoo🚀M o\";\n r_0_0_3_2[0] = r_0_0_3_2_0;\n }\n {\n string memory r_0_0_3_2_1 = unicode\"Moo é🚀 é🚀ooéé🚀ééoooo🚀 M é M 🚀oéoMoooéooooMMoMM\";\n r_0_0_3_2[1] = r_0_0_3_2_1;\n }\n r_0_0_3[2] = r_0_0_3_2;\n }\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n string[2][3][4][1] memory r_1;\n {\n string[2][3][4] memory r_1_0;\n {\n string[2][3] memory r_1_0_0;\n {\n string[2] memory r_1_0_0_0;\n {\n string memory r_1_0_0_0_0 = unicode\"Moo é🚀\";\n r_1_0_0_0[0] = r_1_0_0_0_0;\n }\n {\n string memory r_1_0_0_0_1 = unicode\"Moo é🚀 Mo oéo🚀 M🚀oMMMéo\";\n r_1_0_0_0[1] = r_1_0_0_0_1;\n }\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n string[2] memory r_1_0_0_1;\n {\n string memory r_1_0_0_1_0 = unicode\"Moo é🚀🚀ooMooé🚀🚀o oo éoé ooMo🚀🚀🚀ooo🚀Méo🚀éMoé 🚀oooo MM\";\n r_1_0_0_1[0] = r_1_0_0_1_0;\n }\n {\n string memory r_1_0_0_1_1 = unicode\"Moo é🚀ééoéoéoooM Mo Moéoéo🚀MéMé\";\n r_1_0_0_1[1] = r_1_0_0_1_1;\n }\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n string[2] memory r_1_0_0_2;\n {\n string memory r_1_0_0_2_0 = unicode\"Moo é🚀🚀éo🚀M🚀o ooéM🚀M\";\n r_1_0_0_2[0] = r_1_0_0_2_0;\n }\n {\n string memory r_1_0_0_2_1 = unicode\"Moo é🚀éooMo é ooo é \";\n r_1_0_0_2[1] = r_1_0_0_2_1;\n }\n r_1_0_0[2] = r_1_0_0_2;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n string[2][3] memory r_1_0_1;\n {\n string[2] memory r_1_0_1_0;\n {\n string memory r_1_0_1_0_0 = unicode\"Moo é🚀Moooooo🚀oéoMMé M🚀🚀éoo 🚀Mééoo🚀o 🚀M oo\";\n r_1_0_1_0[0] = r_1_0_1_0_0;\n }\n {\n string memory r_1_0_1_0_1 = unicode\"Moo é🚀o o🚀oMooo🚀oo🚀🚀MoM oMMo🚀oooM \";\n r_1_0_1_0[1] = r_1_0_1_0_1;\n }\n r_1_0_1[0] = r_1_0_1_0;\n }\n {\n string[2] memory r_1_0_1_1;\n {\n string memory r_1_0_1_1_0 = unicode\"Moo é🚀MéM ooooéooé \";\n r_1_0_1_1[0] = r_1_0_1_1_0;\n }\n {\n string memory r_1_0_1_1_1 = unicode\"Moo é🚀\";\n r_1_0_1_1[1] = r_1_0_1_1_1;\n }\n r_1_0_1[1] = r_1_0_1_1;\n }\n {\n string[2] memory r_1_0_1_2;\n {\n string memory r_1_0_1_2_0 = unicode\"Moo é🚀 éo 🚀 🚀oo🚀éMoo🚀 oéé🚀M éMé oéoMéMoo🚀 🚀🚀oéoo \";\n r_1_0_1_2[0] = r_1_0_1_2_0;\n }\n {\n string memory r_1_0_1_2_1 = unicode\"Moo é🚀M🚀 éé\";\n r_1_0_1_2[1] = r_1_0_1_2_1;\n }\n r_1_0_1[2] = r_1_0_1_2;\n }\n r_1_0[1] = r_1_0_1;\n }\n {\n string[2][3] memory r_1_0_2;\n {\n string[2] memory r_1_0_2_0;\n {\n string memory r_1_0_2_0_0 = unicode\"Moo é🚀Mo🚀oooMéé🚀\";\n r_1_0_2_0[0] = r_1_0_2_0_0;\n }\n {\n string memory r_1_0_2_0_1 = unicode\"Moo é🚀\";\n r_1_0_2_0[1] = r_1_0_2_0_1;\n }\n r_1_0_2[0] = r_1_0_2_0;\n }\n {\n string[2] memory r_1_0_2_1;\n {\n string memory r_1_0_2_1_0 = unicode\"Moo é🚀é🚀🚀🚀 🚀ooMMoé🚀 oMé éoééé🚀🚀Mo🚀 🚀oM\";\n r_1_0_2_1[0] = r_1_0_2_1_0;\n }\n {\n string memory r_1_0_2_1_1 = unicode\"Moo é🚀éM🚀🚀éo M o 🚀 \";\n r_1_0_2_1[1] = r_1_0_2_1_1;\n }\n r_1_0_2[1] = r_1_0_2_1;\n }\n {\n string[2] memory r_1_0_2_2;\n {\n string memory r_1_0_2_2_0 = unicode\"Moo é🚀 ooo oo é🚀 🚀Mo 🚀é\";\n r_1_0_2_2[0] = r_1_0_2_2_0;\n }\n {\n string memory r_1_0_2_2_1 = unicode\"Moo é🚀o oooéoMo 🚀 M\";\n r_1_0_2_2[1] = r_1_0_2_2_1;\n }\n r_1_0_2[2] = r_1_0_2_2;\n }\n r_1_0[2] = r_1_0_2;\n }\n {\n string[2][3] memory r_1_0_3;\n {\n string[2] memory r_1_0_3_0;\n {\n string memory r_1_0_3_0_0 = unicode\"Moo é🚀o🚀o 🚀o ooM 🚀oMoéooo oMoo🚀\";\n r_1_0_3_0[0] = r_1_0_3_0_0;\n }\n {\n string memory r_1_0_3_0_1 = unicode\"Moo é🚀🚀 🚀oé🚀MMM \";\n r_1_0_3_0[1] = r_1_0_3_0_1;\n }\n r_1_0_3[0] = r_1_0_3_0;\n }\n {\n string[2] memory r_1_0_3_1;\n {\n string memory r_1_0_3_1_0 = unicode\"Moo é🚀MoMé🚀o ooo oMé 🚀🚀é 🚀Mo MMMM🚀o🚀\";\n r_1_0_3_1[0] = r_1_0_3_1_0;\n }\n {\n string memory r_1_0_3_1_1 = unicode\"Moo é🚀o🚀 é 🚀é🚀oMéoooM 🚀🚀🚀 oMoM o🚀é 🚀o M🚀éo🚀\";\n r_1_0_3_1[1] = r_1_0_3_1_1;\n }\n r_1_0_3[1] = r_1_0_3_1;\n }\n {\n string[2] memory r_1_0_3_2;\n {\n string memory r_1_0_3_2_0 = unicode\"Moo é🚀🚀M oé🚀oo🚀o\";\n r_1_0_3_2[0] = r_1_0_3_2_0;\n }\n {\n string memory r_1_0_3_2_1 = unicode\"Moo é🚀\";\n r_1_0_3_2[1] = r_1_0_3_2_1;\n }\n r_1_0_3[2] = r_1_0_3_2;\n }\n r_1_0[3] = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n string[2][3][4][1] memory r_2;\n {\n string[2][3][4] memory r_2_0;\n {\n string[2][3] memory r_2_0_0;\n {\n string[2] memory r_2_0_0_0;\n {\n string memory r_2_0_0_0_0 = unicode\"Moo é🚀\";\n r_2_0_0_0[0] = r_2_0_0_0_0;\n }\n {\n string memory r_2_0_0_0_1 = unicode\"Moo é🚀o🚀🚀 é 🚀éo🚀🚀oéo MM🚀o🚀o éoooo🚀o ééé\";\n r_2_0_0_0[1] = r_2_0_0_0_1;\n }\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n string[2] memory r_2_0_0_1;\n {\n string memory r_2_0_0_1_0 = unicode\"Moo é🚀oo éooooooMo🚀o oo🚀M o \";\n r_2_0_0_1[0] = r_2_0_0_1_0;\n }\n {\n string memory r_2_0_0_1_1 = unicode\"Moo é🚀\";\n r_2_0_0_1[1] = r_2_0_0_1_1;\n }\n r_2_0_0[1] = r_2_0_0_1;\n }\n {\n string[2] memory r_2_0_0_2;\n {\n string memory r_2_0_0_2_0 = unicode\"Moo é🚀 🚀Mo\";\n r_2_0_0_2[0] = r_2_0_0_2_0;\n }\n {\n string memory r_2_0_0_2_1 = unicode\"Moo é🚀oooMo🚀o🚀MM 🚀\";\n r_2_0_0_2[1] = r_2_0_0_2_1;\n }\n r_2_0_0[2] = r_2_0_0_2;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n string[2][3] memory r_2_0_1;\n {\n string[2] memory r_2_0_1_0;\n {\n string memory r_2_0_1_0_0 = unicode\"Moo é🚀 🚀o M🚀 o ééM🚀oéooo🚀oM🚀M🚀MooMéoo🚀oMéooooo éM🚀\";\n r_2_0_1_0[0] = r_2_0_1_0_0;\n }\n {\n string memory r_2_0_1_0_1 = unicode\"Moo é🚀éM🚀é 🚀🚀éoMMo éoéo 🚀MMéoo🚀 o🚀éé🚀M M🚀oéo🚀oM\";\n r_2_0_1_0[1] = r_2_0_1_0_1;\n }\n r_2_0_1[0] = r_2_0_1_0;\n }\n {\n string[2] memory r_2_0_1_1;\n {\n string memory r_2_0_1_1_0 = unicode\"Moo é🚀\";\n r_2_0_1_1[0] = r_2_0_1_1_0;\n }\n {\n string memory r_2_0_1_1_1 = unicode\"Moo é🚀 M🚀🚀é Méoo🚀 🚀Moo🚀éé🚀oé🚀\";\n r_2_0_1_1[1] = r_2_0_1_1_1;\n }\n r_2_0_1[1] = r_2_0_1_1;\n }\n {\n string[2] memory r_2_0_1_2;\n {\n string memory r_2_0_1_2_0 = unicode\"Moo é🚀🚀ooMo🚀oooéooMM🚀éM🚀éoooé o🚀Mo o🚀MM🚀é ééo 🚀oooMoo\";\n r_2_0_1_2[0] = r_2_0_1_2_0;\n }\n {\n string memory r_2_0_1_2_1 = unicode\"Moo é🚀é🚀MMo 🚀oo o🚀éooMoé \";\n r_2_0_1_2[1] = r_2_0_1_2_1;\n }\n r_2_0_1[2] = r_2_0_1_2;\n }\n r_2_0[1] = r_2_0_1;\n }\n {\n string[2][3] memory r_2_0_2;\n {\n string[2] memory r_2_0_2_0;\n {\n string memory r_2_0_2_0_0 = unicode\"Moo é🚀éoMoMoMééoé🚀🚀🚀🚀oéoéé🚀🚀é 🚀 Mo oMoMM\";\n r_2_0_2_0[0] = r_2_0_2_0_0;\n }\n {\n string memory r_2_0_2_0_1 = unicode\"Moo é🚀🚀 🚀\";\n r_2_0_2_0[1] = r_2_0_2_0_1;\n }\n r_2_0_2[0] = r_2_0_2_0;\n }\n {\n string[2] memory r_2_0_2_1;\n {\n string memory r_2_0_2_1_0 = unicode\"Moo é🚀ééMé🚀o🚀oéM🚀🚀oé M o oéé é🚀o🚀oé oooo🚀é ooo\";\n r_2_0_2_1[0] = r_2_0_2_1_0;\n }\n {\n string memory r_2_0_2_1_1 = unicode\"Moo é🚀🚀o 🚀🚀🚀Moo é 🚀🚀o 🚀🚀é MMoMéoo 🚀oé o Moo\";\n r_2_0_2_1[1] = r_2_0_2_1_1;\n }\n r_2_0_2[1] = r_2_0_2_1;\n }\n {\n string[2] memory r_2_0_2_2;\n {\n string memory r_2_0_2_2_0 = unicode\"Moo é🚀🚀🚀éMoM oM 🚀o oMoéo M é oM🚀MM oMMooMoo\";\n r_2_0_2_2[0] = r_2_0_2_2_0;\n }\n {\n string memory r_2_0_2_2_1 = unicode\"Moo é🚀 🚀oooMo🚀oéMMéoéooéo🚀éooé oooM MM🚀ééMé oo ooMM🚀éoo\";\n r_2_0_2_2[1] = r_2_0_2_2_1;\n }\n r_2_0_2[2] = r_2_0_2_2;\n }\n r_2_0[2] = r_2_0_2;\n }\n {\n string[2][3] memory r_2_0_3;\n {\n string[2] memory r_2_0_3_0;\n {\n string memory r_2_0_3_0_0 = unicode\"Moo é🚀\";\n r_2_0_3_0[0] = r_2_0_3_0_0;\n }\n {\n string memory r_2_0_3_0_1 = unicode\"Moo é🚀\";\n r_2_0_3_0[1] = r_2_0_3_0_1;\n }\n r_2_0_3[0] = r_2_0_3_0;\n }\n {\n string[2] memory r_2_0_3_1;\n {\n string memory r_2_0_3_1_0 = unicode\"Moo é🚀ééoM oM🚀oMéoM🚀🚀MoMéooM🚀ooo oé 🚀🚀 oMMo\";\n r_2_0_3_1[0] = r_2_0_3_1_0;\n }\n {\n string memory r_2_0_3_1_1 = unicode\"Moo é🚀 M🚀M🚀 🚀o🚀Méoo ééMoéééM oMMo\";\n r_2_0_3_1[1] = r_2_0_3_1_1;\n }\n r_2_0_3[1] = r_2_0_3_1;\n }\n {\n string[2] memory r_2_0_3_2;\n {\n string memory r_2_0_3_2_0 = unicode\"Moo é🚀M ooé Mo 🚀oéM🚀🚀MMMéo🚀 ooéo🚀🚀 o🚀ooo\";\n r_2_0_3_2[0] = r_2_0_3_2_0;\n }\n {\n string memory r_2_0_3_2_1 = unicode\"Moo é🚀oéooééoM 🚀ooo🚀ooéé\";\n r_2_0_3_2[1] = r_2_0_3_2_1;\n }\n r_2_0_3[2] = r_2_0_3_2;\n }\n r_2_0[3] = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n {\n string[2][3][4][1] memory r_3;\n {\n string[2][3][4] memory r_3_0;\n {\n string[2][3] memory r_3_0_0;\n {\n string[2] memory r_3_0_0_0;\n {\n string memory r_3_0_0_0_0 = unicode\"Moo é🚀o 🚀MoéMMoé🚀\";\n r_3_0_0_0[0] = r_3_0_0_0_0;\n }\n {\n string memory r_3_0_0_0_1 = unicode\"Moo é🚀ooo🚀🚀éoéMéoMéM Mo éMoM éM é 🚀 MM 🚀🚀M oé é\";\n r_3_0_0_0[1] = r_3_0_0_0_1;\n }\n r_3_0_0[0] = r_3_0_0_0;\n }\n {\n string[2] memory r_3_0_0_1;\n {\n string memory r_3_0_0_1_0 = unicode\"Moo é🚀🚀oo🚀oo\";\n r_3_0_0_1[0] = r_3_0_0_1_0;\n }\n {\n string memory r_3_0_0_1_1 = unicode\"Moo é🚀MMM\";\n r_3_0_0_1[1] = r_3_0_0_1_1;\n }\n r_3_0_0[1] = r_3_0_0_1;\n }\n {\n string[2] memory r_3_0_0_2;\n {\n string memory r_3_0_0_2_0 = unicode\"Moo é🚀oMé\";\n r_3_0_0_2[0] = r_3_0_0_2_0;\n }\n {\n string memory r_3_0_0_2_1 = unicode\"Moo é🚀Mo oMM o🚀🚀M🚀 éo o🚀 oé MoMéo🚀 oé o🚀é\";\n r_3_0_0_2[1] = r_3_0_0_2_1;\n }\n r_3_0_0[2] = r_3_0_0_2;\n }\n r_3_0[0] = r_3_0_0;\n }\n {\n string[2][3] memory r_3_0_1;\n {\n string[2] memory r_3_0_1_0;\n {\n string memory r_3_0_1_0_0 = unicode\"Moo é🚀🚀MM🚀éMé\";\n r_3_0_1_0[0] = r_3_0_1_0_0;\n }\n {\n string memory r_3_0_1_0_1 = unicode\"Moo é🚀MM Mo🚀\";\n r_3_0_1_0[1] = r_3_0_1_0_1;\n }\n r_3_0_1[0] = r_3_0_1_0;\n }\n {\n string[2] memory r_3_0_1_1;\n {\n string memory r_3_0_1_1_0 = unicode\"Moo é🚀\";\n r_3_0_1_1[0] = r_3_0_1_1_0;\n }\n {\n string memory r_3_0_1_1_1 = unicode\"Moo é🚀MoM\";\n r_3_0_1_1[1] = r_3_0_1_1_1;\n }\n r_3_0_1[1] = r_3_0_1_1;\n }\n {\n string[2] memory r_3_0_1_2;\n {\n string memory r_3_0_1_2_0 = unicode\"Moo é🚀oo é oMoéoo🚀é🚀🚀ooéooé é MMM🚀🚀M 🚀🚀🚀🚀🚀 é MMM🚀 oM🚀🚀o Mo\";\n r_3_0_1_2[0] = r_3_0_1_2_0;\n }\n {\n string memory r_3_0_1_2_1 = unicode\"Moo é🚀oMMooé é🚀🚀éo🚀o M éMo🚀🚀MooMoo🚀🚀oMo \";\n r_3_0_1_2[1] = r_3_0_1_2_1;\n }\n r_3_0_1[2] = r_3_0_1_2;\n }\n r_3_0[1] = r_3_0_1;\n }\n {\n string[2][3] memory r_3_0_2;\n {\n string[2] memory r_3_0_2_0;\n {\n string memory r_3_0_2_0_0 = unicode\"Moo é🚀\";\n r_3_0_2_0[0] = r_3_0_2_0_0;\n }\n {\n string memory r_3_0_2_0_1 = unicode\"Moo é🚀 ooM ooM🚀é M oéMé🚀éoéM🚀ooMoo MéMoMMMoé🚀🚀éM🚀 oM🚀oM ééM\";\n r_3_0_2_0[1] = r_3_0_2_0_1;\n }\n r_3_0_2[0] = r_3_0_2_0;\n }\n {\n string[2] memory r_3_0_2_1;\n {\n string memory r_3_0_2_1_0 = unicode\"Moo é🚀oo🚀M🚀o éé oéMMé🚀Moo🚀oéo🚀oo🚀🚀oMoo 🚀🚀 éé éo o o🚀\";\n r_3_0_2_1[0] = r_3_0_2_1_0;\n }\n {\n string memory r_3_0_2_1_1 = unicode\"Moo é🚀 ééMéMMoo🚀ooMM🚀🚀ooéMé MoéoM éMoéoéo\";\n r_3_0_2_1[1] = r_3_0_2_1_1;\n }\n r_3_0_2[1] = r_3_0_2_1;\n }\n {\n string[2] memory r_3_0_2_2;\n {\n string memory r_3_0_2_2_0 = unicode\"Moo é🚀\";\n r_3_0_2_2[0] = r_3_0_2_2_0;\n }\n {\n string memory r_3_0_2_2_1 = unicode\"Moo é🚀M o🚀MM o🚀 Mo🚀é🚀oMo🚀Mo ooMoé🚀🚀oo🚀🚀 o oM oM 🚀\";\n r_3_0_2_2[1] = r_3_0_2_2_1;\n }\n r_3_0_2[2] = r_3_0_2_2;\n }\n r_3_0[2] = r_3_0_2;\n }\n {\n string[2][3] memory r_3_0_3;\n {\n string[2] memory r_3_0_3_0;\n {\n string memory r_3_0_3_0_0 = unicode\"Moo é🚀\";\n r_3_0_3_0[0] = r_3_0_3_0_0;\n }\n {\n string memory r_3_0_3_0_1 = unicode\"Moo é🚀o Moo oo é🚀ééo🚀oooooo éo oéoé éé🚀🚀 MoééMé oéo🚀MéM\";\n r_3_0_3_0[1] = r_3_0_3_0_1;\n }\n r_3_0_3[0] = r_3_0_3_0;\n }\n {\n string[2] memory r_3_0_3_1;\n {\n string memory r_3_0_3_1_0 = unicode\"Moo é🚀éoo🚀o🚀o éMo 🚀ooMo🚀🚀\";\n r_3_0_3_1[0] = r_3_0_3_1_0;\n }\n {\n string memory r_3_0_3_1_1 = unicode\"Moo é🚀MéMoo🚀o🚀Méo M🚀 o🚀oM🚀o🚀 M 🚀 ooMoo MoM 🚀oéoéé\";\n r_3_0_3_1[1] = r_3_0_3_1_1;\n }\n r_3_0_3[1] = r_3_0_3_1;\n }\n {\n string[2] memory r_3_0_3_2;\n {\n string memory r_3_0_3_2_0 = unicode\"Moo é🚀 éooMMo ooMoé oéoo\";\n r_3_0_3_2[0] = r_3_0_3_2_0;\n }\n {\n string memory r_3_0_3_2_1 = unicode\"Moo é🚀oo é Moooé\";\n r_3_0_3_2[1] = r_3_0_3_2_1;\n }\n r_3_0_3[2] = r_3_0_3_2;\n }\n r_3_0[3] = r_3_0_3;\n }\n r_3[0] = r_3_0;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000001ba00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000a40000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80f09f9a80c3a94df09f9a806f206f206f6f206f6f20f09f9a806f20f09f9a804d6f6ff09f9a806f206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80f09f9a806f6fc3a9206f4d6f20c3a9204dc3a94d4d202020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a804d6f204d206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806f20f09f9a806f4d20c3a96f4d20c3a96f4dc3a9204dc3a94d6fc3a96fc3a94df09f9a80c3a94d206f6f206f6f6fc3a94d6f6ff09f9a80206ff09f9a804d20f09f9a806f6fc3a96f204d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000714d6f6f20c3a9f09f9a806f20f09f9a80c3a9c3a9f09f9a80204d6f6f20f09f9a806f6f4df09f9a804d6f6fc3a9f09f9a80c3a94d6f4d6f206ff09f9a80206fc3a96f4d6f6ff09f9a80f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80c3a96f204dc3a9f09f9a80206fc3a9204d20204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80f09f9a80f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806f206f4dc3a96ff09f9a804dc3a9206f4d4dc3a9c3a920f09f9a80206f6f4d4d20c3a9f09f9a806ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80c3a9f09f9a80204d6f206f4d204dc3a920c3a9c3a9c3a9f09f9a806f20c3a9206fc3a9206f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a804dc3a9c3a94dc3a94d206ff09f9a80c3a9204d4d4d4dc3a9c3a9c3a94dc3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80206f6ff09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a80c3a9f09f9a806ff09f9a806f4d206f4df09f9a804d4d20f09f9a806f6f6f4dc3a9c3a96ff09f9a80206f6fc3a9f09f9a806fc3a9f09f9a806f6f20f09f9a80206f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80206f6f20f09f9a806f4df09f9a804df09f9a80206f2020f09f9a806f4df09f9a80f09f9a80c3a920c3a94d4d6ff09f9a806f6f204d206f4d6fc3a9f09f9a806fc3a96ff09f9a80f09f9a806ff09f9a80206f6f6f000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a806ff09f9a80206f6ff09f9a804dc3a96f6fc3a9206f6f206f4d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a806f6f4d4dc3a96f4dc3a96f206f6f4d4d4d6fc3a90000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a806f6f6f4d4d6ff09f9a806f6f206f20f09f9a806f4d4df09f9a806f206f6f6f4df09f9a80f09f9a806f6ff09f9a80f09f9a804dc3a96f4d4d4d202020f09f9a80204d206f6ff09f9a806f6ff09f9a806fc3a9f09f9a80c3a96ff09f9a80206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a804d4d4d4d4d4df09f9a806fc3a96f206fc3a9c3a920f09f9a80f09f9a80c3a9206f6ff09f9a80c3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a80c3a96f4d6f6ff09f9a804d206f00000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a8020c3a9f09f9a806f6fc3a9c3a9f09f9a80c3a9c3a96f6f6f6ff09f9a80204d20c3a9204d20f09f9a806fc3a96f4d6f6f6fc3a96f6f6f6f4d4d6f4d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80204d6f206fc3a96ff09f9a80204df09f9a806f4d4d4dc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80f09f9a806f6f4d6f6fc3a9f09f9a80f09f9a806f2020206f6f20c3a96fc3a9206f6f4d6ff09f9a80f09f9a80f09f9a806f6f6ff09f9a804dc3a96ff09f9a80c3a94d6fc3a920f09f9a806f6f6f6f202020204d4d0000000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80c3a9c3a96fc3a96fc3a96f6f6f4d204d6f204d6fc3a96fc3a96ff09f9a804dc3a94dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80f09f9a80c3a96ff09f9a804df09f9a806f206f6fc3a94df09f9a804d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80c3a96f6f4d6f20c3a9206f6f6f2020c3a92000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a804d6f6f6f6f6f6ff09f9a806fc3a96f4d4dc3a9204df09f9a80f09f9a80c3a96f6f20f09f9a804dc3a9c3a96f6ff09f9a806f20f09f9a804d206f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a806f206ff09f9a806f4d6f6f6ff09f9a806f6ff09f9a80f09f9a804d6f4d206f4d4d6ff09f9a806f6f6f4d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a804dc3a94d206f6f6f6fc3a96f6fc3a920000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a8020c3a96f20f09f9a802020f09f9a806f6ff09f9a80c3a94d6f6ff09f9a80206fc3a9c3a9f09f9a804d20c3a94dc3a9206fc3a96f4dc3a94d6f6ff09f9a8020f09f9a80f09f9a806fc3a96f6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a804df09f9a8020c3a9c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a804d6ff09f9a806f6f6f4dc3a9c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a802020f09f9a806f6f4d4d6fc3a9f09f9a80206f4dc3a920c3a96fc3a9c3a9c3a9f09f9a80f09f9a804d6ff09f9a8020f09f9a806f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80c3a94df09f9a80f09f9a80c3a96f204d20206f20f09f9a80200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80206f6f6f206f6f20c3a9f09f9a8020f09f9a804d6f20f09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a806f206f6f6fc3a96f4d6f20f09f9a8020204d00000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806ff09f9a806f20f09f9a806f206f6f4d2020f09f9a806f4d6fc3a96f6f6f206f4d6f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80f09f9a8020f09f9a806fc3a9f09f9a804d4d4d200000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a804d6f4dc3a9f09f9a806f20206f6f6f206f4dc3a920f09f9a80f09f9a80c3a920f09f9a804d6f204d4d4d4df09f9a806ff09f9a80000000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806ff09f9a8020c3a920f09f9a80c3a9f09f9a806f4dc3a96f6f6f4d20f09f9a80f09f9a80f09f9a80206f4d6f4d206ff09f9a80c3a92020f09f9a806f2020204df09f9a80c3a96ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80f09f9a804d206fc3a9f09f9a806f6ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a806ff09f9a80f09f9a802020c3a920f09f9a80c3a96ff09f9a80f09f9a806fc3a96f204d4df09f9a806ff09f9a806f20c3a96f6f6f6ff09f9a806f20c3a9c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806f6f20c3a96f6f6f6f6f6f4d6ff09f9a806f206f6ff09f9a804d206f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a8020f09f9a804d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a806f6f6f4d6ff09f9a806ff09f9a804d4d20f09f9a8000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a8020f09f9a806f204df09f9a80206f20c3a9c3a94df09f9a806fc3a96f6f6ff09f9a806f4df09f9a804df09f9a804d6f6f4dc3a96f6ff09f9a806f4dc3a96f6f6f6f6f20c3a94df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80c3a94df09f9a80c3a920f09f9a80f09f9a80c3a96f4d4d6f20c3a96fc3a96f20f09f9a804d4dc3a96f6ff09f9a80206ff09f9a80c3a9c3a9f09f9a804d204df09f9a806fc3a96ff09f9a806f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a80204df09f9a80f09f9a80c3a9204dc3a96f6ff09f9a802020f09f9a804d6f6ff09f9a80c3a9c3a9f09f9a806fc3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a806f6f4d6ff09f9a806f6f6fc3a96f6f4d4df09f9a80c3a94df09f9a80c3a96f6f6fc3a9206ff09f9a804d6f206ff09f9a804d4df09f9a80c3a92020c3a9c3a96f20f09f9a806f6f6f4d6f6f00000000000000000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a80c3a9f09f9a804d4d6f2020f09f9a806f6f206ff09f9a80c3a96f6f4d6fc3a920202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a80c3a96f4d6f4d6f4dc3a9c3a96fc3a9f09f9a80f09f9a80f09f9a80f09f9a806fc3a96fc3a9c3a9f09f9a80f09f9a80c3a92020f09f9a80204d6f206f4d6f4d4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80f09f9a8020f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80c3a9c3a94dc3a9f09f9a806ff09f9a806fc3a94df09f9a80f09f9a806fc3a9204d206f206fc3a9c3a920c3a9f09f9a806ff09f9a806fc3a9206f6f6f6ff09f9a80c3a9206f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80f09f9a806f20f09f9a80f09f9a80f09f9a804d6f6f20c3a920f09f9a80f09f9a806f20f09f9a80f09f9a80c3a9204d4d6f4dc3a96f6f2020f09f9a806fc3a9206f20204d6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a94d6f4d206f4d20f09f9a806f206f4d6fc3a96f204d2020c3a9206f4df09f9a804d4d206f4d4d6f6f4d6f6f0000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a8020f09f9a806f6f6f4d6ff09f9a806fc3a94d4dc3a96fc3a96f6fc3a96ff09f9a80c3a96f6fc3a9206f6f6f4d204d4df09f9a80c3a9c3a94dc3a9206f6f206f6f4d4df09f9a80c3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80c3a9c3a96f4d206f4df09f9a806f4dc3a96f4df09f9a80f09f9a804d6f4dc3a96f6f4df09f9a806f6f6f206fc3a920f09f9a80f09f9a80206f4d4d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80204df09f9a804df09f9a8020f09f9a806ff09f9a804dc3a96f6f20c3a9c3a94d6fc3a9c3a9c3a94d206f4d4d6f000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a804d206f6fc3a9204d6f20f09f9a806fc3a94df09f9a80f09f9a804d4d4dc3a96ff09f9a80206f6fc3a96ff09f9a80f09f9a8020206ff09f9a806f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806fc3a96f6fc3a9c3a96f4d20f09f9a806f6f6ff09f9a806f6fc3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a806f2020f09f9a804d6fc3a94d4d6fc3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a806f6f6ff09f9a80f09f9a80c3a96fc3a94dc3a96f4dc3a94d204d6f20c3a94d6f4d20c3a94d20c3a920f09f9a80204d4d20f09f9a80f09f9a804d206fc3a920c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a804d4d4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a806f4dc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a804d6f206f4d4d206ff09f9a80f09f9a804df09f9a8020c3a96f206ff09f9a80206fc3a9204d6f4dc3a96ff09f9a8020206fc3a9206ff09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a80f09f9a804d4df09f9a80c3a94dc3a90000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a804d4d20204d6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a804d6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006c4d6f6f20c3a9f09f9a806f6f20c3a9206f4d6fc3a96f6ff09f9a80c3a9f09f9a80f09f9a806f6fc3a96f6fc3a920c3a9204d4d4df09f9a80f09f9a804d20f09f9a80f09f9a80f09f9a80f09f9a80f09f9a8020c3a9204d4d4df09f9a80206f4df09f9a80f09f9a806f204d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a806f4d4d6f6fc3a920c3a9f09f9a80f09f9a80c3a96ff09f9a806f204d2020c3a94d6ff09f9a80f09f9a804d6f6f4d6f6ff09f9a80f09f9a806f4d6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f4d6f6f20c3a9f09f9a80206f6f4d206f6f4df09f9a80c3a9204d20206fc3a94dc3a9f09f9a80c3a96fc3a94df09f9a806f6f4d6f6f204dc3a94d6f4d4d4d6fc3a9f09f9a80f09f9a80c3a94df09f9a80206f4df09f9a806f4d20c3a9c3a94d00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a806f6ff09f9a804df09f9a806f202020c3a9c3a9206fc3a94d4dc3a9f09f9a804d6f6ff09f9a806fc3a96ff09f9a806f6ff09f9a80f09f9a806f4d6f6f20f09f9a80f09f9a8020c3a9c3a92020c3a96f206f206ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a8020c3a9c3a94dc3a94d4d6f6ff09f9a806f6f4d4df09f9a80f09f9a806f6fc3a94dc3a920204d6fc3a96f4d2020c3a94d6fc3a96fc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a804d206ff09f9a804d4d206ff09f9a80204d6ff09f9a80c3a9f09f9a806f4d6ff09f9a804d6f206f6f4d6fc3a9f09f9a80f09f9a806f6ff09f9a80f09f9a80206f206f4d206f4d20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f204d6f6f206f6f20c3a9f09f9a80c3a9c3a96ff09f9a806f6f6f6f6f6f20c3a96f206fc3a96fc3a920c3a9c3a9f09f9a80f09f9a80204d6fc3a9c3a94dc3a9206fc3a96ff09f9a804dc3a94d000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80c3a96f6ff09f9a806ff09f9a806f20c3a94d6f20f09f9a806f6f4d6ff09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a804dc3a94d6f6ff09f9a806ff09f9a804dc3a96f204df09f9a8020206ff09f9a806f4df09f9a806ff09f9a80204d20f09f9a80206f6f4d6f6f204d6f4d20f09f9a806fc3a96fc3a9c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a8020c3a96f6f4d4d6f206f6f4d6fc3a9206fc3a96f6f0000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806f6f20c3a9204d6f6f6fc3a900000000000000000000" + }, + { + "name": "random-((((string,bool),address)),address,string,bytes7,string)", + "type": "((((string,bool),address)),address,string,bytes7,string)", + "value": [ + [[["Moo é🚀🚀🚀oMoo🚀o🚀Mé", false], "0xeCfC0A08F0701AB744dc0A4A2dD6AcD8FBA1dcA3"]], + "0x45Cf214be71915DCfDAeABA8a3EbCF5f2e21ef40", + "Moo é🚀🚀 🚀oéMo🚀ooé🚀ooo MMo🚀 o🚀é", + "0x7ed2d99971bdc9", + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀oMoo🚀o🚀Mé" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xeCfC0A08F0701AB744dc0A4A2dD6AcD8FBA1dcA3" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x45Cf214be71915DCfDAeABA8a3EbCF5f2e21ef40" + }, + { + "type": "string", + "value": "Moo é🚀🚀 🚀oéMo🚀ooé🚀ooo MMo🚀 o🚀é" + }, + { + "type": "hexstring", + "value": "0x7ed2d99971bdc9" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103a2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061023b565b60405180910390f35b610056610184565b61005e610184565b6040805160a08101825260608082019081526000608083018190526020830191825292820192909252908152604080516080810182526060918101828152600092820183905281526020810191909152604080518082019091526060815260006020820152600060405180606001604052806022815260200161034b602291398252506000602080830182905291835273ecfc0a08f0701ab744dc0a4a2dd6acd8fba1dca3838301529183529183527345cf214be71915dcfdaeaba8a3ebcf5f2e21ef408383015260408051606081019091526037808252919290919061031490830139604080840191909152667ed2d99971bdc960c81b60608401528051808201909152600a8152689adede418753e13f3560b71b6020820152608083015250919050565b604080516101408101909152606061010082019081526000610120830181905260c0830191825260e083015260a082019081528190815260200160006001600160a01b031681526020016060815260200160006001600160c81b0319168152602001606081525090565b6000815180845260005b81811015610214576020818501810151868301820152016101f8565b81811115610226576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160a082850152805190508160c08501528051604060e0860152805160406101208701526102756101608701826101ee565b828501511515610140880152838501516001600160a01b0316610100880152938701519390506102b060408701856001600160a01b03169052565b60408701519350601f199250828682030160608701526102d081856101ee565b9350505060608501516102ef60808601826001600160c81b0319169052565b506080850151818584030160a086015261030983826101ee565b969550505050505056fe4d6f6f20c3a9f09f9a80f09f9a8020f09f9a806fc3a94d6ff09f9a806f6fc3a9f09f9a806f6f6f204d4d6ff09f9a80206ff09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4d6f6ff09f9a806ff09f9a804dc3a9a264697066735822122051a86c4f52d32788e3c7a57d9b04fbaeb797e671f20a383ba358080227136d0764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fc3be6c5 {\n string s_0;\n bool s_1;\n }\n\n struct S_9657af3a {\n S_fc3be6c5 s_0;\n address s_1;\n }\n\n struct S_153d89ab {\n S_9657af3a s_0;\n }\n\n struct S_d8a3f6e6 {\n S_153d89ab s_0;\n address s_1;\n string s_2;\n bytes7 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_d8a3f6e6 memory) {\n S_d8a3f6e6 memory r;\n {\n S_153d89ab memory r_0;\n {\n S_9657af3a memory r_0_0;\n {\n S_fc3be6c5 memory r_0_0_0;\n {\n string memory r_0_0_0_0 = unicode\"Moo é🚀🚀🚀oMoo🚀o🚀Mé\";\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n bool r_0_0_0_1 = false;\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address r_0_0_1 = 0xeCfC0A08F0701AB744dc0A4A2dD6AcD8FBA1dcA3;\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x45Cf214be71915DCfDAeABA8a3EbCF5f2e21ef40;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀🚀 🚀oéMo🚀ooé🚀ooo MMo🚀 o🚀é\";\n r.s_2 = r_2;\n }\n {\n bytes7 r_3 = bytes7(0x7ed2d99971bdc9);\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000045cf214be71915dcfdaeaba8a3ebcf5f2e21ef4000000000000000000000000000000000000000000000000000000000000001a07ed2d99971bdc900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ecfc0a08f0701ab744dc0a4a2dd6acd8fba1dca30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4d6f6ff09f9a806ff09f9a804dc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80f09f9a8020f09f9a806fc3a94d6ff09f9a806f6fc3a9f09f9a806f6f6f204d4d6ff09f9a80206ff09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,address[1],address)[],bytes13,string)", + "type": "((address,address[1],address)[],bytes13,string)", + "value": [ + [ + [ + "0x15524882cB4b5acE09882DC326E71dE360f21FA3", + ["0x6bfC34Ed4bcEF55613c98F43dA902bd1550624B6"], + "0xbc36F5A3570fc4bAe08f1Ce55Ce432AC7FAaDB2f" + ] + ], + "0x45fb717b12c68cce2634378755", + "Moo é🚀o🚀 🚀🚀o M🚀🚀M🚀é🚀M Mo🚀Mo M🚀MMoo oo 🚀MM🚀ooMMé🚀🚀o ooéMo🚀M" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x15524882cB4b5acE09882DC326E71dE360f21FA3" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6bfC34Ed4bcEF55613c98F43dA902bd1550624B6" + } + ] + }, + { + "type": "address", + "value": "0xbc36F5A3570fc4bAe08f1Ce55Ce432AC7FAaDB2f" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x45fb717b12c68cce2634378755" + }, + { + "type": "string", + "value": "Moo é🚀o🚀 🚀🚀o M🚀🚀M🚀é🚀M Mo🚀Mo M🚀MMoo oo 🚀MM🚀ooMMé🚀🚀o ooéMo🚀M" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061039d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610212565b60405180910390f35b604080516060808201835280825260006020808401829052838501839052845180840186528381529081018290528085019290925283516001808252818601909552929391929091816020015b6100a3610177565b81526020019060019003908161009b5790505090506100c0610177565b7315524882cb4b5ace09882dc326e71de360f21fa381526100df6101a7565b736bfc34ed4bcef55613c98f43da902bd1550624b68152602082015273bc36f5a3570fc4bae08f1ce55ce432ac7faadb2f604082015281518190839060009061012a5761012a6102e4565b602090810291909101810191909152918352506c45fb717b12c68cce263437875560981b828201526040805160a08101909152606d8082526000926102fb90830139604083015250919050565b604051806060016040528060006001600160a01b0316815260200161019a6101a7565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156101eb576020818501810151868301820152016101cf565b818111156101fd576000602083870101525b50601f01601f19169290920160200192915050565b60208082528251606083830181905281516080850181905260009392830191849160a0870190835b8181101561029957855180516001600160a01b03908116855288820151898601885b600181101561027b57825184168252918b0191908b019060010161025c565b5050506040918201511690840152948601949183019160010161023a565b50509387015172ffffffffffffffffffffffffffffffffffffff1981166040880152936040880151878203601f19018389015294506102d881866101c5565b98975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806ff09f9a802020f09f9a80f09f9a806f204df09f9a80f09f9a804df09f9a80c3a9f09f9a804d204d6ff09f9a804d6f20204df09f9a804d4d6f6f206f6f20f09f9a804d4df09f9a806f6f4d4dc3a9f09f9a80f09f9a806f206f6fc3a94d6ff09f9a804da26469706673582212207fa93cea87cd36c7b71dbd4320ec598b590895cf2f0c8e2a8c7d92020eb0998964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2d4dca73 {\n address s_0;\n address[1] s_1;\n address s_2;\n }\n\n struct S_12c00745 {\n S_2d4dca73[] s_0;\n bytes13 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_12c00745 memory) {\n S_12c00745 memory r;\n {\n S_2d4dca73[] memory r_0 = new S_2d4dca73[](1);\n {\n S_2d4dca73 memory r_0_0;\n {\n address r_0_0_0 = 0x15524882cB4b5acE09882DC326E71dE360f21FA3;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address[1] memory r_0_0_1;\n {\n address r_0_0_1_0 = 0x6bfC34Ed4bcEF55613c98F43dA902bd1550624B6;\n r_0_0_1[0] = r_0_0_1_0;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0xbc36F5A3570fc4bAe08f1Ce55Ce432AC7FAaDB2f;\n r_0_0.s_2 = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes13 r_1 = bytes13(0x45fb717b12c68cce2634378755);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀o🚀 🚀🚀o M🚀🚀M🚀é🚀M Mo🚀Mo M🚀MMoo oo 🚀MM🚀ooMMé🚀🚀o ooéMo🚀M\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006045fb717b12c68cce26343787550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000015524882cb4b5ace09882dc326e71de360f21fa30000000000000000000000006bfc34ed4bcef55613c98f43da902bd1550624b6000000000000000000000000bc36f5a3570fc4bae08f1ce55ce432ac7faadb2f000000000000000000000000000000000000000000000000000000000000006d4d6f6f20c3a9f09f9a806ff09f9a802020f09f9a80f09f9a806f204df09f9a80f09f9a804df09f9a80c3a9f09f9a804d204d6ff09f9a804d6f20204df09f9a804d4d6f6f206f6f20f09f9a804d4df09f9a806f6f4d4dc3a9f09f9a80f09f9a806f206f6fc3a94d6ff09f9a804d00000000000000000000000000000000000000" + }, + { + "name": "random-((address,bytes28),bool[],(bytes22,int176,bytes7))", + "type": "((address,bytes28),bool[],(bytes22,int176,bytes7))", + "value": [ + [ + "0x114aCEDb2235409eE32dB88d147abc7472e679D6", + "0xf84ee0c22d372a59d1602c7b43898dd33234c47cf1c31d30880dff1e" + ], + [], + [ + "0xf1a5f8d336427a994c1424e62521a912f7e858824292", + "7142312980450937411831582157167165965679612098733190", + "0x9c65873ef9f65a" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x114aCEDb2235409eE32dB88d147abc7472e679D6" + }, + { + "type": "hexstring", + "value": "0xf84ee0c22d372a59d1602c7b43898dd33234c47cf1c31d30880dff1e" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf1a5f8d336427a994c1424e62521a912f7e858824292" + }, + { + "type": "number", + "value": "7142312980450937411831582157167165965679612098733190" + }, + { + "type": "hexstring", + "value": "0x9c65873ef9f65a" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610278806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610190565b60405180910390f35b6100946040805160a08101825260006060808301828152608084018390528352602080840182905284519182018552828252810182905280840191909152909182015290565b6100da6040805160a08101825260006060808301828152608084018390528352602080840182905284519182018552828252810182905280840191909152909182015290565b60408051808201825273114acedb2235409ee32db88d147abc7472e679d681527ff84ee0c22d372a59d1602c7b43898dd33234c47cf1c31d30880dff1e0000000060208083019190915290835281516000815280820183528382015281516060810183527578d2fc699b213d4ca60a12731290d4897bf42c41214960511b8152751316f806c26bee2868ce7c0253e33b42a193b0cf648691810191909152664e32c39f7cfb2d60c91b8183015290820152919050565b6020808252825180516001600160a01b03168383015281015163ffffffff191660408301528281015160c06060840152805160e084018190526000929182019083906101008601905b808310156101fb578351151582529284019260019290920191908401906101d9565b50604087810151805169ffffffffffffffffffff19166080890152602081015160150b60a0890152908101516001600160c81b03191660c08801529350969550505050505056fea2646970667358221220e8687eaa5c16208631f008f5ec78a9ecee795d2d18ca2a4624c2d062fa4a218864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2c654bc9 {\n address s_0;\n bytes28 s_1;\n }\n\n struct S_afd34ce8 {\n bytes22 s_0;\n int176 s_1;\n bytes7 s_2;\n }\n\n struct S_f0cdf32f {\n S_2c654bc9 s_0;\n bool[] s_1;\n S_afd34ce8 s_2;\n }\n\n function test () public pure returns (S_f0cdf32f memory) {\n S_f0cdf32f memory r;\n {\n S_2c654bc9 memory r_0;\n {\n address r_0_0 = 0x114aCEDb2235409eE32dB88d147abc7472e679D6;\n r_0.s_0 = r_0_0;\n }\n {\n bytes28 r_0_1 = bytes28(0xf84ee0c22d372a59d1602c7b43898dd33234c47cf1c31d30880dff1e);\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n bool[] memory r_1 = new bool[](0);\n r.s_1 = r_1;\n }\n {\n S_afd34ce8 memory r_2;\n {\n bytes22 r_2_0 = bytes22(0xf1a5f8d336427a994c1424e62521a912f7e858824292);\n r_2.s_0 = r_2_0;\n }\n {\n int176 r_2_1 = 7142312980450937411831582157167165965679612098733190;\n r_2.s_1 = r_2_1;\n }\n {\n bytes7 r_2_2 = bytes7(0x9c65873ef9f65a);\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000114acedb2235409ee32db88d147abc7472e679d6f84ee0c22d372a59d1602c7b43898dd33234c47cf1c31d30880dff1e0000000000000000000000000000000000000000000000000000000000000000000000c0f1a5f8d336427a994c1424e62521a912f7e85882429200000000000000000000000000000000000000001316f806c26bee2868ce7c0253e33b42a193b0cf64869c65873ef9f65a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,string),(int96,string,uint160,address),string)", + "type": "((address,string),(int96,string,uint160,address),string)", + "value": [ + ["0x8C1FF68E10EE3edE62094F3B7Ccd7F78c3ea2635", "Moo é🚀"], + [ + "18060538210133632160111209310", + "Moo é🚀 oM oMM 🚀🚀🚀ooé🚀éoMéoooM🚀é M Méo🚀o🚀🚀MMo é", + "580093291611518032644706393272175986486152184299", + "0xd79291EB719cCA45c6E87f3f51428a5C40ddca6e" + ], + "Moo é🚀 🚀M🚀é o🚀o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x8C1FF68E10EE3edE62094F3B7Ccd7F78c3ea2635" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "18060538210133632160111209310" + }, + { + "type": "string", + "value": "Moo é🚀 oM oMM 🚀🚀🚀ooé🚀éoMéoooM🚀é M Méo🚀o🚀🚀MMo é" + }, + { + "type": "number", + "value": "580093291611518032644706393272175986486152184299" + }, + { + "type": "address", + "value": "0xd79291EB719cCA45c6E87f3f51428a5C40ddca6e" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀M🚀é o🚀o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610349806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610215565b60405180910390f35b610056610178565b61005e610178565b60408051808201825260606020808301828152738c1ff68e10ee3ede62094f3b7ccd7f78c3ea2635845284518086018652600a8152689adede418753e13f3560b71b818401529052918452825160808101845260008082529281018290529283018290528201526b3a5b53ba2f28deed12472b5e815260408051608081019091526050808252600091906102c4602083013960208084019190915273659c4868191df39579b81423d0c71d2d183ec1eb60408085019190915273d79291eb719cca45c6e87f3f51428a5c40ddca6e60608501528482019390935282518084018452601e81527f4d6f6f20c3a9f09f9a8020f09f9a804df09f9a80c3a920206ff09f9a806f0000918101919091529183019190915250919050565b6040805160a0810190915260006060808301918252608083015281908152604080516080810182526000808252606060208381018290529383018290528201529101908152602001606081525090565b6000815180845260005b818110156101ee576020818501810151868301820152016101d2565b81811115610200576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160608383015280516001600160a01b03908116608085015290820151604060a08501526000929161025060c08601836101c8565b915082860151601f19808785030160408801528151600b0b84528482015160808686015261028160808601826101c8565b95505082604083015116604085015282606083015116606085015260408801519350808786030160608801525050506102ba82826101c8565b9594505050505056fe4d6f6f20c3a9f09f9a80206f4d206f4d4d20f09f9a80f09f9a80f09f9a806f6fc3a9f09f9a80c3a96f4dc3a96f6f6f4df09f9a80c3a9204d204dc3a96ff09f9a806ff09f9a80f09f9a804d4d6f20c3a9a2646970667358221220e004579305287e43d39f76d6d3794097f9f0892ff052d9482f7b3c14add8c1a664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8090aaf4 {\n address s_0;\n string s_1;\n }\n\n struct S_524227cf {\n int96 s_0;\n string s_1;\n uint160 s_2;\n address s_3;\n }\n\n struct S_1b84a80f {\n S_8090aaf4 s_0;\n S_524227cf s_1;\n string s_2;\n }\n\n function test () public pure returns (S_1b84a80f memory) {\n S_1b84a80f memory r;\n {\n S_8090aaf4 memory r_0;\n {\n address r_0_0 = 0x8C1FF68E10EE3edE62094F3B7Ccd7F78c3ea2635;\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀\";\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_524227cf memory r_1;\n {\n int96 r_1_0 = 18060538210133632160111209310;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀 oM oMM 🚀🚀🚀ooé🚀éoMéoooM🚀é M Méo🚀o🚀🚀MMo é\";\n r_1.s_1 = r_1_1;\n }\n {\n uint160 r_1_2 = 580093291611518032644706393272175986486152184299;\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0xd79291EB719cCA45c6E87f3f51428a5C40ddca6e;\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀 🚀M🚀é o🚀o\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000008c1ff68e10ee3ede62094f3b7ccd7f78c3ea26350000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000003a5b53ba2f28deed12472b5e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000659c4868191df39579b81423d0c71d2d183ec1eb000000000000000000000000d79291eb719cca45c6e87f3f51428a5c40ddca6e00000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80206f4d206f4d4d20f09f9a80f09f9a80f09f9a806f6fc3a9f09f9a80c3a96f4dc3a96f6f6f4df09f9a80c3a9204d204dc3a96ff09f9a806ff09f9a80f09f9a804d4d6f20c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a8020f09f9a804df09f9a80c3a920206ff09f9a806f0000" + }, + { + "name": "random-((bool,address),bytes17,uint168,bytes24[4])[3]", + "type": "((bool,address),bytes17,uint168,bytes24[4])[3]", + "value": [ + [ + [false, "0xee877EF9aDC39858146B5167165EB083bfCB26CE"], + "0x8a5c6c9a401db02d409aaf2c9465e24968", + "155019803731989543868359731982383477516399735206099", + [ + "0xf205764d64bb8cbe466efc7e77b3e79ed20b44c61d720955", + "0x71a5609de3e386655a7d237a83b6bf42ed59773d70337b5c", + "0x4df9a749eb8c767095aa39f80cdeb04b5a5331d69c378722", + "0x950076df2becc4c3537d5a77fcf24e57f9776386e65f1680" + ] + ], + [ + [false, "0xa6b647E86d0535bfB76D45f4BC71aEA07c2A8a46"], + "0x1640b886be54d3ee12c7bb8178453d56c6", + "322705214000919892095951181632479234372390665864455", + [ + "0xc31dd0c6a1c9440a4d777aa3866821d101bf1d00a706af45", + "0x51d7dbfa359dfa803ec837ee330fe81f52005a0591aaa859", + "0xed682bad03a7d879bc1cbd06196f828183502fabf27affdb", + "0xbb1a60e12cb5bcd906b0b45ad7584c270a33f440272bb5a4" + ] + ], + [ + [true, "0x76aF2F33F750058FE6d27F10f9e1bc514BcC6A8F"], + "0xf88664dccb4db406918141b54d76b21ebd", + "97298934101129615644257411678119072237071744867988", + [ + "0x990af3ea8c3ceddce6bcd5725d596b1e66861331e4bf76b7", + "0x7cb1a2912e89a423402b8830319fbe956a41911666de2c93", + "0x4533eed6f3cd3292788661f4c4432f4b19ab4f376949cbe6", + "0x81a2b5e86924196ac9baa97ccaf33f4d2cbc7c016233ff31" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xee877EF9aDC39858146B5167165EB083bfCB26CE" + } + ] + }, + { + "type": "hexstring", + "value": "0x8a5c6c9a401db02d409aaf2c9465e24968" + }, + { + "type": "number", + "value": "155019803731989543868359731982383477516399735206099" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf205764d64bb8cbe466efc7e77b3e79ed20b44c61d720955" + }, + { + "type": "hexstring", + "value": "0x71a5609de3e386655a7d237a83b6bf42ed59773d70337b5c" + }, + { + "type": "hexstring", + "value": "0x4df9a749eb8c767095aa39f80cdeb04b5a5331d69c378722" + }, + { + "type": "hexstring", + "value": "0x950076df2becc4c3537d5a77fcf24e57f9776386e65f1680" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xa6b647E86d0535bfB76D45f4BC71aEA07c2A8a46" + } + ] + }, + { + "type": "hexstring", + "value": "0x1640b886be54d3ee12c7bb8178453d56c6" + }, + { + "type": "number", + "value": "322705214000919892095951181632479234372390665864455" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc31dd0c6a1c9440a4d777aa3866821d101bf1d00a706af45" + }, + { + "type": "hexstring", + "value": "0x51d7dbfa359dfa803ec837ee330fe81f52005a0591aaa859" + }, + { + "type": "hexstring", + "value": "0xed682bad03a7d879bc1cbd06196f828183502fabf27affdb" + }, + { + "type": "hexstring", + "value": "0xbb1a60e12cb5bcd906b0b45ad7584c270a33f440272bb5a4" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x76aF2F33F750058FE6d27F10f9e1bc514BcC6A8F" + } + ] + }, + { + "type": "hexstring", + "value": "0xf88664dccb4db406918141b54d76b21ebd" + }, + { + "type": "number", + "value": "97298934101129615644257411678119072237071744867988" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x990af3ea8c3ceddce6bcd5725d596b1e66861331e4bf76b7" + }, + { + "type": "hexstring", + "value": "0x7cb1a2912e89a423402b8830319fbe956a41911666de2c93" + }, + { + "type": "hexstring", + "value": "0x4533eed6f3cd3292788661f4c4432f4b19ab4f376949cbe6" + }, + { + "type": "hexstring", + "value": "0x81a2b5e86924196ac9baa97ccaf33f4d2cbc7c016233ff31" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610517806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610426565b60405180910390f35b6100566103a0565b61005e6103a0565b6100666103cd565b6040805180820182526000815273ee877ef9adc39858146b5167165eb083bfcb26ce60208083019190915290835270114b8d934803b605a81355e5928cbc492d607b1b90830152746a11a069c1556beabe9087ca4bced6bb292ffff0d3908201526100cf610408565b7ff205764d64bb8cbe466efc7e77b3e79ed20b44c61d720955000000000000000081527f71a5609de3e386655a7d237a83b6bf42ed59773d70337b5c000000000000000060208201527f4df9a749eb8c767095aa39f80cdeb04b5a5331d69c378722000000000000000060408201527f950076df2becc4c3537d5a77fcf24e57f9776386e65f1680000000000000000060608083019190915282015281526101756103cd565b6040805180820182526000815273a6b647e86d0535bfb76d45f4bc71aea07c2a8a46602080830191909152908352700b205c435f2a69f70963ddc0bc229eab6360791b9083015274dccdca4411725d4196f98f63425b358490cee84507908201526101de610408565b7fc31dd0c6a1c9440a4d777aa3866821d101bf1d00a706af45000000000000000081527f51d7dbfa359dfa803ec837ee330fe81f52005a0591aaa85900000000000000006020808301919091527fed682bad03a7d879bc1cbd06196f828183502fabf27affdb000000000000000060408301527fbb1a60e12cb5bcd906b0b45ad7584c270a33f440272bb5a4000000000000000060608084019190915283019190915282015261028c6103cd565b604080518082018252600181527376af2f33f750058fe6d27f10f9e1bc514bcc6a8f60208083019190915290835270f88664dccb4db406918141b54d76b21ebd60781b908301527442931b1a1a450cac9c22e518358b8f1f4fb7339e94908201526102f5610408565b7f990af3ea8c3ceddce6bcd5725d596b1e66861331e4bf76b7000000000000000081527f7cb1a2912e89a423402b8830319fbe956a41911666de2c93000000000000000060208201527f4533eed6f3cd3292788661f4c4432f4b19ab4f376949cbe600000000000000006040808301919091527f81a2b5e86924196ac9baa97ccaf33f4d2cbc7c016233ff310000000000000000606080840191909152830191909152820152919050565b60405180606001604052806003905b6103b76103cd565b8152602001906001900390816103af5790505090565b6040805160c08101825260006080820181815260a083018290528252602082018190529181019190915260608101610403610408565b905290565b60405180608001604052806004906020820280368337509192915050565b610300810181836000805b60038110156104d757825180518051151586526020908101516001600160a01b031681870152808201516effffffffffffffffffffffffffffff19166040808801919091528201516001600160a81b031660608088019190915290910151906080860190845b60048110156104bf57835167ffffffffffffffff191683529281019291810191600101610497565b50610100969096019594909401935050600101610431565b505050509291505056fea26469706673582212207c53a15871a7cb7ae536dee771f63ac7eaee411968e267a3d5b369c62c71b8fa64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e212a882 {\n bool s_0;\n address s_1;\n }\n\n struct S_d8e0d878 {\n S_e212a882 s_0;\n bytes17 s_1;\n uint168 s_2;\n bytes24[4] s_3;\n }\n\n function test () public pure returns (S_d8e0d878[3] memory) {\n S_d8e0d878[3] memory r;\n {\n S_d8e0d878 memory r_0;\n {\n S_e212a882 memory r_0_0;\n {\n bool r_0_0_0 = false;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address r_0_0_1 = 0xee877EF9aDC39858146B5167165EB083bfCB26CE;\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bytes17 r_0_1 = bytes17(0x8a5c6c9a401db02d409aaf2c9465e24968);\n r_0.s_1 = r_0_1;\n }\n {\n uint168 r_0_2 = 155019803731989543868359731982383477516399735206099;\n r_0.s_2 = r_0_2;\n }\n {\n bytes24[4] memory r_0_3;\n {\n bytes24 r_0_3_0 = bytes24(0xf205764d64bb8cbe466efc7e77b3e79ed20b44c61d720955);\n r_0_3[0] = r_0_3_0;\n }\n {\n bytes24 r_0_3_1 = bytes24(0x71a5609de3e386655a7d237a83b6bf42ed59773d70337b5c);\n r_0_3[1] = r_0_3_1;\n }\n {\n bytes24 r_0_3_2 = bytes24(0x4df9a749eb8c767095aa39f80cdeb04b5a5331d69c378722);\n r_0_3[2] = r_0_3_2;\n }\n {\n bytes24 r_0_3_3 = bytes24(0x950076df2becc4c3537d5a77fcf24e57f9776386e65f1680);\n r_0_3[3] = r_0_3_3;\n }\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_d8e0d878 memory r_1;\n {\n S_e212a882 memory r_1_0;\n {\n bool r_1_0_0 = false;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n address r_1_0_1 = 0xa6b647E86d0535bfB76D45f4BC71aEA07c2A8a46;\n r_1_0.s_1 = r_1_0_1;\n }\n r_1.s_0 = r_1_0;\n }\n {\n bytes17 r_1_1 = bytes17(0x1640b886be54d3ee12c7bb8178453d56c6);\n r_1.s_1 = r_1_1;\n }\n {\n uint168 r_1_2 = 322705214000919892095951181632479234372390665864455;\n r_1.s_2 = r_1_2;\n }\n {\n bytes24[4] memory r_1_3;\n {\n bytes24 r_1_3_0 = bytes24(0xc31dd0c6a1c9440a4d777aa3866821d101bf1d00a706af45);\n r_1_3[0] = r_1_3_0;\n }\n {\n bytes24 r_1_3_1 = bytes24(0x51d7dbfa359dfa803ec837ee330fe81f52005a0591aaa859);\n r_1_3[1] = r_1_3_1;\n }\n {\n bytes24 r_1_3_2 = bytes24(0xed682bad03a7d879bc1cbd06196f828183502fabf27affdb);\n r_1_3[2] = r_1_3_2;\n }\n {\n bytes24 r_1_3_3 = bytes24(0xbb1a60e12cb5bcd906b0b45ad7584c270a33f440272bb5a4);\n r_1_3[3] = r_1_3_3;\n }\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_d8e0d878 memory r_2;\n {\n S_e212a882 memory r_2_0;\n {\n bool r_2_0_0 = true;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n address r_2_0_1 = 0x76aF2F33F750058FE6d27F10f9e1bc514BcC6A8F;\n r_2_0.s_1 = r_2_0_1;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bytes17 r_2_1 = bytes17(0xf88664dccb4db406918141b54d76b21ebd);\n r_2.s_1 = r_2_1;\n }\n {\n uint168 r_2_2 = 97298934101129615644257411678119072237071744867988;\n r_2.s_2 = r_2_2;\n }\n {\n bytes24[4] memory r_2_3;\n {\n bytes24 r_2_3_0 = bytes24(0x990af3ea8c3ceddce6bcd5725d596b1e66861331e4bf76b7);\n r_2_3[0] = r_2_3_0;\n }\n {\n bytes24 r_2_3_1 = bytes24(0x7cb1a2912e89a423402b8830319fbe956a41911666de2c93);\n r_2_3[1] = r_2_3_1;\n }\n {\n bytes24 r_2_3_2 = bytes24(0x4533eed6f3cd3292788661f4c4432f4b19ab4f376949cbe6);\n r_2_3[2] = r_2_3_2;\n }\n {\n bytes24 r_2_3_3 = bytes24(0x81a2b5e86924196ac9baa97ccaf33f4d2cbc7c016233ff31);\n r_2_3[3] = r_2_3_3;\n }\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee877ef9adc39858146b5167165eb083bfcb26ce8a5c6c9a401db02d409aaf2c9465e2496800000000000000000000000000000000000000000000000000006a11a069c1556beabe9087ca4bced6bb292ffff0d3f205764d64bb8cbe466efc7e77b3e79ed20b44c61d720955000000000000000071a5609de3e386655a7d237a83b6bf42ed59773d70337b5c00000000000000004df9a749eb8c767095aa39f80cdeb04b5a5331d69c3787220000000000000000950076df2becc4c3537d5a77fcf24e57f9776386e65f168000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6b647e86d0535bfb76d45f4bc71aea07c2a8a461640b886be54d3ee12c7bb8178453d56c60000000000000000000000000000000000000000000000000000dccdca4411725d4196f98f63425b358490cee84507c31dd0c6a1c9440a4d777aa3866821d101bf1d00a706af45000000000000000051d7dbfa359dfa803ec837ee330fe81f52005a0591aaa8590000000000000000ed682bad03a7d879bc1cbd06196f828183502fabf27affdb0000000000000000bb1a60e12cb5bcd906b0b45ad7584c270a33f440272bb5a40000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000076af2f33f750058fe6d27f10f9e1bc514bcc6a8ff88664dccb4db406918141b54d76b21ebd000000000000000000000000000000000000000000000000000042931b1a1a450cac9c22e518358b8f1f4fb7339e94990af3ea8c3ceddce6bcd5725d596b1e66861331e4bf76b700000000000000007cb1a2912e89a423402b8830319fbe956a41911666de2c9300000000000000004533eed6f3cd3292788661f4c4432f4b19ab4f376949cbe6000000000000000081a2b5e86924196ac9baa97ccaf33f4d2cbc7c016233ff310000000000000000" + }, + { + "name": "random-((bytes11[2],bytes20,bool,bool,address),string)", + "type": "((bytes11[2],bytes20,bool,bool,address),string)", + "value": [ + [ + ["0x8e12c5663640f58105e42a", "0xd0182cd4f660bd199b69e8"], + "0xc490ab7f05adc32ebe0824da389085129154afef", + true, + true, + "0x3C813ABDF77bC9c3067982bC8F21ede44F9Feb9c" + ], + "Moo é🚀oooé🚀o🚀ooéo " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8e12c5663640f58105e42a" + }, + { + "type": "hexstring", + "value": "0xd0182cd4f660bd199b69e8" + } + ] + }, + { + "type": "hexstring", + "value": "0xc490ab7f05adc32ebe0824da389085129154afef" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x3C813ABDF77bC9c3067982bC8F21ede44F9Feb9c" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oooé🚀o🚀ooéo " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101de565b60405180910390f35b61005661011e565b61005e61011e565b61006661013e565b61006e610173565b6a470962b31b207ac082f21560a91b81526a1a03059a9ecc17a3336d3d60ab1b60208083019190915290825273c490ab7f05adc32ebe0824da389085129154afef60601b82820152600160408084018290526060840191909152733c813abdf77bc9c3067982bc8f21ede44f9feb9c60808401529183528151808301909252601e82527f4d6f6f20c3a9f09f9a806f6f6fc3a9f09f9a806ff09f9a806f6fc3a96f20000082820152820152919050565b604051806040016040528061013161013e565b8152602001606081525090565b6040518060a00160405280610151610173565b8152600060208201819052604082018190526060820181905260809091015290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156101b75760208185018101518683018201520161019b565b818111156101c9576000602083870101525b50601f01601f19169290920160200192915050565b60208082528251805160009291838584015b60028210156102195783516001600160a81b0319168152928401926001919091019084016101f0565b5050808301516bffffffffffffffffffffffff19166060868101919091526040820151151560808088019190915290820151151560a087015201516001600160a01b031660c08501525083015160e08084015261027a610100840182610191565b94935050505056fea26469706673582212207161030ea2744ccab2023be9a76be973c199005e6db87976bd95989570ba1a9b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_974c8eb5 {\n bytes11[2] s_0;\n bytes20 s_1;\n bool s_2;\n bool s_3;\n address s_4;\n }\n\n struct S_5861cf8b {\n S_974c8eb5 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_5861cf8b memory) {\n S_5861cf8b memory r;\n {\n S_974c8eb5 memory r_0;\n {\n bytes11[2] memory r_0_0;\n {\n bytes11 r_0_0_0 = bytes11(0x8e12c5663640f58105e42a);\n r_0_0[0] = r_0_0_0;\n }\n {\n bytes11 r_0_0_1 = bytes11(0xd0182cd4f660bd199b69e8);\n r_0_0[1] = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bytes20 r_0_1 = bytes20(0xC490ab7f05ADc32eBe0824dA389085129154afef);\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x3C813ABDF77bC9c3067982bC8F21ede44F9Feb9c;\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oooé🚀o🚀ooéo \";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000208e12c5663640f58105e42a000000000000000000000000000000000000000000d0182cd4f660bd199b69e8000000000000000000000000000000000000000000c490ab7f05adc32ebe0824da389085129154afef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000003c813abdf77bc9c3067982bc8f21ede44f9feb9c00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a806f6f6fc3a9f09f9a806ff09f9a806f6fc3a96f200000" + }, + { + "name": "random-((bytes24),(address,bool,string),(address),bool,bool)", + "type": "((bytes24),(address,bool,string),(address),bool,bool)", + "value": [ + ["0x439504d88a6198d686681baa13855ef0114d1689faab75a8"], + [ + "0x88901DC4E78763ea8a6BBF1C451DA6c000803e0c", + false, + "Moo é🚀é🚀🚀o🚀M o éo🚀Moéé🚀o Mo🚀 🚀🚀o éMM🚀oMM🚀o" + ], + ["0xDea75c12f4a6b74A2Dfa30a22597b988B7943550"], + false, + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x439504d88a6198d686681baa13855ef0114d1689faab75a8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x88901DC4E78763ea8a6BBF1C451DA6c000803e0c" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀é🚀🚀o🚀M o éo🚀Moéé🚀o Mo🚀 🚀🚀o éMM🚀oMM🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xDea75c12f4a6b74A2Dfa30a22597b988B7943550" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102d9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610179565b60405180910390f35b610056610124565b61005e610124565b60408051602080820183527f439504d88a6198d686681baa13855ef0114d1689faab75a8000000000000000082529083528151606080820184526000828401819052828501919091527388901dc4e78763ea8a6bbf1c451da6c000803e0c8252835160808101909452605180855291939092909190610253908301396040838101919091526020848101939093528051928301815273dea75c12f4a6b74a2dfa30a22597b988b79435508352830191909152506000606082015260016080820152919050565b6040805160c081018252600060a0820181815282528251606080820185528282526020808301849052828601829052808501929092528451918201855282825293830152918101829052608081019190915290565b602080825282515167ffffffffffffffff1916828201528281015160a060408085019190915281516001600160a01b031660c085015281830151151560e085015201516060610100840152805161012084018190526000929190835b818110156101f257828101840151868201610140015283016101d5565b8181111561020557600061014083880101525b50604086015180516001600160a01b031660608701529250606086015180151560808701529250608086015180151560a08701529250601f01601f1916939093016101400194935050505056fe4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a806ff09f9a804d206f20c3a96ff09f9a804d6fc3a9c3a9f09f9a806f204d6ff09f9a8020f09f9a80f09f9a806f20c3a94d4df09f9a806f4d4df09f9a806fa2646970667358221220f57e7ff126efdcd2175fbe0dbd2f4ad3d5502280775ebb6bd7041eda06dd490e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fce5fa1a {\n bytes24 s_0;\n }\n\n struct S_5062cedd {\n address s_0;\n bool s_1;\n string s_2;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_4185bf82 {\n S_fce5fa1a s_0;\n S_5062cedd s_1;\n S_421683f8 s_2;\n bool s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_4185bf82 memory) {\n S_4185bf82 memory r;\n {\n S_fce5fa1a memory r_0;\n {\n bytes24 r_0_0 = bytes24(0x439504d88a6198d686681baa13855ef0114d1689faab75a8);\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n S_5062cedd memory r_1;\n {\n address r_1_0 = 0x88901DC4E78763ea8a6BBF1C451DA6c000803e0c;\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀é🚀🚀o🚀M o éo🚀Moéé🚀o Mo🚀 🚀🚀o éMM🚀oMM🚀o\";\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n S_421683f8 memory r_2;\n {\n address r_2_0 = 0xDea75c12f4a6b74A2Dfa30a22597b988B7943550;\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n bool r_4 = true;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020439504d88a6198d686681baa13855ef0114d1689faab75a8000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000dea75c12f4a6b74a2dfa30a22597b988b79435500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000088901dc4e78763ea8a6bbf1c451da6c000803e0c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a806ff09f9a804d206f20c3a96ff09f9a804d6fc3a9c3a9f09f9a806f204d6ff09f9a8020f09f9a80f09f9a806f20c3a94d4df09f9a806f4d4df09f9a806f000000000000000000000000000000" + }, + { + "name": "random-((int168,address)[2],(bytes14,int176),bool,bytes29)", + "type": "((int168,address)[2],(bytes14,int176),bool,bytes29)", + "value": [ + [ + [ + "-40306235290679555254373358764110803070746151831627", + "0x7a1F8900845BfEcfA95a54F592AfB348729d2d8E" + ], + [ + "53598139176210223688429018735947430304533342212195", + "0x6D9F73728E175de54d5eef0cE2d72c15129CC473" + ] + ], + [ + "0x9e4602d9450c741f1b5b7e1f5d73", + "-7846810676312797034915239255265163595578824470856274" + ], + true, + "0x53cdc829518354d5641e3e6fc6b07a9927d1a2a1ddacb919c0b58aeef6" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-40306235290679555254373358764110803070746151831627" + }, + { + "type": "address", + "value": "0x7a1F8900845BfEcfA95a54F592AfB348729d2d8E" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "53598139176210223688429018735947430304533342212195" + }, + { + "type": "address", + "value": "0x6D9F73728E175de54d5eef0cE2d72c15129CC473" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9e4602d9450c741f1b5b7e1f5d73" + }, + { + "type": "number", + "value": "-7846810676312797034915239255265163595578824470856274" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x53cdc829518354d5641e3e6fc6b07a9927d1a2a1ddacb919c0b58aeef6" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102ba806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101f1565b60405180910390f35b610056610157565b61005e610157565b6100666101b8565b604080518082018252741b94221985c4f3e5de7ce2ad7671b676e3ba5b484a198152737a1f8900845bfecfa95a54f592afb348729d2d8e602080830191909152908352815180830183527424ac5faf0c8dfc56b265e188f0563f0687f56650638152736d9f73728e175de54d5eef0ce2d72c15129cc4738183015283820152918352805180820182526d9e4602d9450c741f1b5b7e1f5d7360901b81527514f9017804a043ee9847869450f84f615ff6cba082511981840152918301919091526001908201527f53cdc829518354d5641e3e6fc6b07a9927d1a2a1ddacb919c0b58aeef60000006060820152919050565b604051806080016040528061016a6101b8565b81526020016101a46040518060400160405280600071ffffffffffffffffffffffffffffffffffff19168152602001600060150b81525090565b815260006020820181905260409091015290565b60405180604001604052806002905b60408051808201909152600080825260208201528152602001906001900390816101c75790505090565b81516101008201908260005b6002811015610234578251805160140b83526020908101516001600160a01b031681840152909201916040909101906001016101fd565b505050602083810151805171ffffffffffffffffffffffffffffffffffff19166080850152015160150b60a08301526040830151151560c083015260609092015162ffffff191660e0909101529056fea2646970667358221220606e20c0cf85ee7d0efba1491cfac04fce278d5ac0ae84a768db146cc1d8cc2a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4984f0cb {\n int168 s_0;\n address s_1;\n }\n\n struct S_3c929952 {\n bytes14 s_0;\n int176 s_1;\n }\n\n struct S_34c78424 {\n S_4984f0cb[2] s_0;\n S_3c929952 s_1;\n bool s_2;\n bytes29 s_3;\n }\n\n function test () public pure returns (S_34c78424 memory) {\n S_34c78424 memory r;\n {\n S_4984f0cb[2] memory r_0;\n {\n S_4984f0cb memory r_0_0;\n {\n int168 r_0_0_0 = -40306235290679555254373358764110803070746151831627;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x7a1F8900845BfEcfA95a54F592AfB348729d2d8E;\n r_0_0.s_1 = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n S_4984f0cb memory r_0_1;\n {\n int168 r_0_1_0 = 53598139176210223688429018735947430304533342212195;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n address r_0_1_1 = 0x6D9F73728E175de54d5eef0cE2d72c15129CC473;\n r_0_1.s_1 = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_3c929952 memory r_1;\n {\n bytes14 r_1_0 = bytes14(0x9e4602d9450c741f1b5b7e1f5d73);\n r_1.s_0 = r_1_0;\n }\n {\n int176 r_1_1 = -7846810676312797034915239255265163595578824470856274;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n bytes29 r_3 = bytes29(0x53cdc829518354d5641e3e6fc6b07a9927d1a2a1ddacb919c0b58aeef6);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0xffffffffffffffffffffffe46bdde67a3b0c1a21831d52898e49891c45a4b7b50000000000000000000000007a1f8900845bfecfa95a54f592afb348729d2d8e000000000000000000000024ac5faf0c8dfc56b265e188f0563f0687f56650630000000000000000000000006d9f73728e175de54d5eef0ce2d72c15129cc4739e4602d9450c741f1b5b7e1f5d73000000000000000000000000000000000000ffffffffffffffffffffeb06fe87fb5fbc1167b8796baf07b09ea009345f7dae000000000000000000000000000000000000000000000000000000000000000153cdc829518354d5641e3e6fc6b07a9927d1a2a1ddacb919c0b58aeef6000000" + }, + { + "name": "random-((string,bytes9[1][3],bytes4),address)[]", + "type": "((string,bytes9[1][3],bytes4),address)[]", + "value": [ + [ + [ + "Moo é🚀éMoooo🚀o", + [["0x1bd869a457a934d5f9"], ["0x1d6daa4cfeae7974c0"], ["0xe09d9fd42b98a12a50"]], + "0xc5384ba8" + ], + "0xb072f7Fa593ba88747320e4E8f8b9A4FE48e5dEC" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMoooo🚀o" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1bd869a457a934d5f9" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1d6daa4cfeae7974c0" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe09d9fd42b98a12a50" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xc5384ba8" + } + ] + }, + { + "type": "address", + "value": "0xb072f7Fa593ba88747320e4E8f8b9A4FE48e5dEC" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061038d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610252565b60405180910390f35b60408051600180825281830190925260609160009190816020015b610071610178565b81526020019060019003908161006957905050905061008e610178565b610096610198565b6040805180820190915260168152754d6f6f20c3a9f09f9a80c3a94d6f6f6f6ff09f9a806f60501b602082015281526100cd6101ae565b6100d56101db565b681bd869a457a934d5f960b81b815281526100ee6101db565b6775b6a933fab9e5d360be1b815260208201526101096101db565b680e09d9fd42b98a12a560bc1b81526040808301919091526020838101929092526318a7097560e31b9083015290825273b072f7fa593ba88747320e4e8f8b9a4fe48e5dec9082015281518190839060009061016757610167610341565b602090810291909101015250919050565b604051806040016040528061018b610198565b8152600060209091015290565b60405180606001604052806060815260200161018b5b60405180606001604052806003905b6101c56101db565b8152602001906001900390816101bd5790505090565b60405180602001604052806001906020820280368337509192915050565b806000805b600381101561024b57825185835b60018110156102355782516001600160b81b03191682526020928301929091019060010161020c565b50505060209485019492909201916001016101fe565b5050505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561033257603f198a850301865282518051888652805160a08a88015280518060e0890152855b818110156102c1578281018d015189820161010001528c016102a4565b818111156102d35786610100838b0101525b508b83015191506102e760608901836101f9565b918a01516001600160e01b0319811660c089015291928b01516001600160a01b038116888d015292988b0198601f01601f19169690960161010001955050509187019160010161027a565b50919998505050505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212203d937073bef25c0ceb21f356023af0a1fea70531a33507528a7ba05826b8349b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b013855e {\n string s_0;\n bytes9[1][3] s_1;\n bytes4 s_2;\n }\n\n struct S_26305f92 {\n S_b013855e s_0;\n address s_1;\n }\n\n function test () public pure returns (S_26305f92[] memory) {\n S_26305f92[] memory r = new S_26305f92[](1);\n {\n S_26305f92 memory r_0;\n {\n S_b013855e memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀éMoooo🚀o\";\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bytes9[1][3] memory r_0_0_1;\n {\n bytes9[1] memory r_0_0_1_0;\n {\n bytes9 r_0_0_1_0_0 = bytes9(0x1bd869a457a934d5f9);\n r_0_0_1_0[0] = r_0_0_1_0_0;\n }\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n bytes9[1] memory r_0_0_1_1;\n {\n bytes9 r_0_0_1_1_0 = bytes9(0x1d6daa4cfeae7974c0);\n r_0_0_1_1[0] = r_0_0_1_1_0;\n }\n r_0_0_1[1] = r_0_0_1_1;\n }\n {\n bytes9[1] memory r_0_0_1_2;\n {\n bytes9 r_0_0_1_2_0 = bytes9(0xe09d9fd42b98a12a50);\n r_0_0_1_2[0] = r_0_0_1_2_0;\n }\n r_0_0_1[2] = r_0_0_1_2;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bytes4 r_0_0_2 = bytes4(0xc5384ba8);\n r_0_0.s_2 = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0xb072f7Fa593ba88747320e4E8f8b9A4FE48e5dEC;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000b072f7fa593ba88747320e4e8f8b9a4fe48e5dec00000000000000000000000000000000000000000000000000000000000000a01bd869a457a934d5f900000000000000000000000000000000000000000000001d6daa4cfeae7974c00000000000000000000000000000000000000000000000e09d9fd42b98a12a500000000000000000000000000000000000000000000000c5384ba80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80c3a94d6f6f6f6ff09f9a806f00000000000000000000" + }, + { + "name": "random-((uint56,(int184),bytes5),string,string[4],address)", + "type": "((uint56,(int184),bytes5),string,string[4],address)", + "value": [ + [ + "16151844343436938", + ["4364755589461348538764249853165449333310642892354549925"], + "0xa637c1874f" + ], + "Moo é🚀", + [ + "Moo é🚀 éM🚀oééoo🚀é🚀 🚀 oMo oéoo éM ooé 🚀oMoé🚀 🚀oéoMéM oMéMoo", + "Moo é🚀🚀é éoéoo oM🚀MoMMééé 🚀🚀 oéo 🚀éooo o🚀MééoMoooMoMéo o é🚀oo", + "Moo é🚀oéoo🚀ooM", + "Moo é🚀" + ], + "0x3C456C2d7087b83e7573B16f4F44b21df6260654" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "16151844343436938" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4364755589461348538764249853165449333310642892354549925" + } + ] + }, + { + "type": "hexstring", + "value": "0xa637c1874f" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éM🚀oééoo🚀é🚀 🚀 oMo oéoo éM ooé 🚀oMoé🚀 🚀oéoMéM oMéMoo" + }, + { + "type": "string", + "value": "Moo é🚀🚀é éoéoo oM🚀MoMMééé 🚀🚀 oéo 🚀éooo o🚀MééoMoooMoMéo o é🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀oéoo🚀ooM" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "address", + "value": "0x3C456C2d7087b83e7573B16f4F44b21df6260654" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610424806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610270565b60405180910390f35b6100566101ac565b61005e6101ac565b60408051606081018252600080825282516020808201855282825280840191825283850192835266396204508ed68a845284518082018652762d91f6f7154a8ade3d433e5507f8cfa36e1c36d37ef8a5815290915264a637c1874f60d81b9091529083528151808301909252600a8252689adede418753e13f3560b71b828201528201526100ea6101fc565b600060405180608001604052806060815260200161038f606091398252506040805160a0810190915260638082526000919061032c602083013960208381019190915260408051808201825260168152754d6f6f20c3a9f09f9a806fc3a96f6ff09f9a806f6f4d60501b81840152818501528051808201909152600a8152689adede418753e13f3560b71b918101919091529050808260036020020152506040820152733c456c2d7087b83e7573b16f4f44b21df62606546060820152919050565b6040805160e08101825260006080820181815283516020810190945281845260a083019390935260c08201529081908152602001606081526020016101ef6101fc565b8152600060209091015290565b60405180608001604052806004905b606081526020019060019003908161020b5790505090565b6000815180845260005b818110156102495760208185018101518683018201520161022d565b8181111561025b576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835166ffffffffffffff81511682850152818101515160160b604085015264ffffffffff60d81b6040820151166060850152508084015160c060808501526102c260e0850182610223565b6040860151858203601f190160a0870152909150816080810160005b60048110156103095784820383526102f7828551610223565b938601939286019291506001016102de565b5060608801516001600160a01b03811660c0890152945097965050505050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a92020c3a96fc3a96f6f206f4df09f9a804d6f4d4dc3a9c3a9c3a920f09f9a80f09f9a80206fc3a96f20f09f9a80c3a96f6f6f206ff09f9a804dc3a9c3a96f4d6f6f6f4d6f4dc3a96f206f20c3a9f09f9a806f6f4d6f6f20c3a9f09f9a8020c3a94df09f9a806fc3a9c3a96f6ff09f9a80c3a9f09f9a8020f09f9a8020206f4d6f20206fc3a96f6f20c3a94d206f6fc3a920f09f9a806f4d6fc3a9f09f9a8020f09f9a806fc3a96f4dc3a94d206f4dc3a94d6f6fa26469706673582212201112110ea7f164c4edfc3703c348b3e41646188240d79ad2659e47cc9d2e28fb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_46877d46 {\n int184 s_0;\n }\n\n struct S_9751e6c2 {\n uint56 s_0;\n S_46877d46 s_1;\n bytes5 s_2;\n }\n\n struct S_5716c56f {\n S_9751e6c2 s_0;\n string s_1;\n string[4] s_2;\n address s_3;\n }\n\n function test () public pure returns (S_5716c56f memory) {\n S_5716c56f memory r;\n {\n S_9751e6c2 memory r_0;\n {\n uint56 r_0_0 = 16151844343436938;\n r_0.s_0 = r_0_0;\n }\n {\n S_46877d46 memory r_0_1;\n {\n int184 r_0_1_0 = 4364755589461348538764249853165449333310642892354549925;\n r_0_1.s_0 = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n bytes5 r_0_2 = bytes5(0xa637c1874f);\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n string[4] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 éM🚀oééoo🚀é🚀 🚀 oMo oéoo éM ooé 🚀oMoé🚀 🚀oéoMéM oMéMoo\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀🚀é éoéoo oM🚀MoMMééé 🚀🚀 oéo 🚀éooo o🚀MééoMoooMoMéo o é🚀oo\";\n r_2[1] = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀oéoo🚀ooM\";\n r_2[2] = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀\";\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x3C456C2d7087b83e7573B16f4F44b21df6260654;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000396204508ed68a0000000000000000002d91f6f7154a8ade3d433e5507f8cfa36e1c36d37ef8a5a637c1874f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000003c456c2d7087b83e7573b16f4f44b21df6260654000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a8020c3a94df09f9a806fc3a9c3a96f6ff09f9a80c3a9f09f9a8020f09f9a8020206f4d6f20206fc3a96f6f20c3a94d206f6fc3a920f09f9a806f4d6fc3a9f09f9a8020f09f9a806fc3a96f4dc3a94d206f4dc3a94d6f6f00000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a80c3a92020c3a96fc3a96f6f206f4df09f9a804d6f4d4dc3a9c3a9c3a920f09f9a80f09f9a80206fc3a96f20f09f9a80c3a96f6f6f206ff09f9a804dc3a9c3a96f4d6f6f6f4d6f4dc3a96f206f20c3a9f09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806fc3a96f6ff09f9a806f6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,(address),(int[],bool),bytes25,string)", + "type": "(address,(address),(int[],bool),bytes25,string)", + "value": [ + "0x63a53Bcc877841D7A558F58B01e50352365D1c8d", + ["0x68497e04529FbE62A9Af9F2BD52986Cd51f48a08"], + [[], true], + "0x0327f14a7225e6df175961d592e483dfb2bd000276dd2d5732", + "Moo é🚀oéoo🚀 " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x63a53Bcc877841D7A558F58B01e50352365D1c8d" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x68497e04529FbE62A9Af9F2BD52986Cd51f48a08" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x0327f14a7225e6df175961d592e483dfb2bd000276dd2d5732" + }, + { + "type": "string", + "value": "Moo é🚀oéoo🚀 " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102b0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101bb565b60405180910390f35b610056610121565b61005e610121565b7363a53bcc877841d7a558f58b01e50352365d1c8d815260408051602080820183527368497e04529fbe62a9af9f2bd52986cd51f48a0882528084019190915281518083018352606080825260008284018181528551918252818501865290835260019052838501919091527f0327f14a7225e6df175961d592e483dfb2bd000276dd2d5732000000000000009084015281518083019092526014825273026b7b79061d4f84fcd4037e1d4b7b7f84fcd40160651b908201526080820152919050565b6040805160a0810182526000808252825160208082018552828252808401919091528351808501855260608152908101919091529091820190815260006020820152606060409091015290565b6000815180845260005b8181101561019457602081850181015186830182015201610178565b818111156101a6576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516001600160a01b03908116838301528382015151166040808401919091528084015160a06060850152805160c0850192909252815161010085018190526000939283019084906101208701905b8083101561022f578351825292850192600192909201919085019061020f565b5093830151151560e0870152606087015166ffffffffffffff1981166080880152936080880151878203601f190160a0890152945061026e818661016e565b9897505050505050505056fea26469706673582212200f99b6981bac4fb633c8690ffb5214a2fa28b6b5b655c5d2aeacc459201ffadb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_d39327fa {\n int256[] s_0;\n bool s_1;\n }\n\n struct S_dff460c3 {\n address s_0;\n S_421683f8 s_1;\n S_d39327fa s_2;\n bytes25 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_dff460c3 memory) {\n S_dff460c3 memory r;\n {\n address r_0 = 0x63a53Bcc877841D7A558F58B01e50352365D1c8d;\n r.s_0 = r_0;\n }\n {\n S_421683f8 memory r_1;\n {\n address r_1_0 = 0x68497e04529FbE62A9Af9F2BD52986Cd51f48a08;\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n S_d39327fa memory r_2;\n {\n int256[] memory r_2_0 = new int256[](0);\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n bytes25 r_3 = bytes25(0x0327f14a7225e6df175961d592e483dfb2bd000276dd2d5732);\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀oéoo🚀 \";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000063a53bcc877841d7a558f58b01e50352365d1c8d00000000000000000000000068497e04529fbe62a9af9f2bd52986cd51f48a0800000000000000000000000000000000000000000000000000000000000000a00327f14a7225e6df175961d592e483dfb2bd000276dd2d573200000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806fc3a96f6ff09f9a8020000000000000000000000000" + }, + { + "name": "random-(address,(bool,bool,uint24,uint64),string[1])", + "type": "(address,(bool,bool,uint24,uint64),string[1])", + "value": [ + "0xc7D95CD2aB3E9606B369c6f907EA5831d0959F3a", + [false, true, "14652657", "2059790946621060573"], + ["Moo é🚀ooMo🚀 oo🚀oéoo MMo"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xc7D95CD2aB3E9606B369c6f907EA5831d0959F3a" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "14652657" + }, + { + "type": "number", + "value": "2059790946621060573" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooMo🚀 oo🚀oéoo MMo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610280806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6100566100db565b61005e6100db565b73c7d95cd2ab3e9606b369c6f907ea5831d0959f3a81526040805160808101825260008152600160208083019190915262df94f192820192909252671c95d8f3e4e9f5dd6060820152908201526100b361011f565b6000604051806060016040528060228152602001610229602291398252506040820152919050565b6040805160608082018352600080835283516080810185528181526020818101839052948101829052918201529091820190815260200161011a61011f565b905290565b60405180602001604052806001905b606081526020019060019003908161012e5790505090565b602080825282516001600160a01b03168282015282810151805115156040808501919091528183015115156060808601919091528183015162ffffff1660808601529091015167ffffffffffffffff1660a084015283015160c0808401526000919061010084019060e0850184805b600181101561021b5787850360df1901835283518051808752835b818110156101eb578281018901518882018a015288016101d0565b818111156101fb578489838a0101525b50601f01601f1916959095018601945092850192918501916001016101b5565b509297965050505050505056fe4d6f6f20c3a9f09f9a806f6f4d6ff09f9a80206f6ff09f9a806fc3a96f6f204d4d6fa2646970667358221220fa73c3a8b021c7675c10a25dd970bd8f21cf1163a594c7bf79bf783cd5dd3dd564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c79c899f {\n bool s_0;\n bool s_1;\n uint24 s_2;\n uint64 s_3;\n }\n\n struct S_f4eff544 {\n address s_0;\n S_c79c899f s_1;\n string[1] s_2;\n }\n\n function test () public pure returns (S_f4eff544 memory) {\n S_f4eff544 memory r;\n {\n address r_0 = 0xc7D95CD2aB3E9606B369c6f907EA5831d0959F3a;\n r.s_0 = r_0;\n }\n {\n S_c79c899f memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n uint24 r_1_2 = 14652657;\n r_1.s_2 = r_1_2;\n }\n {\n uint64 r_1_3 = 2059790946621060573;\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n string[1] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀ooMo🚀 oo🚀oéoo MMo\";\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c7d95cd2ab3e9606b369c6f907ea5831d0959f3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000df94f10000000000000000000000000000000000000000000000001c95d8f3e4e9f5dd00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806f6f4d6ff09f9a80206f6ff09f9a806fc3a96f6f204d4d6f000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,address,bool,bytes17,bytes20[][3])", + "type": "(address,address,bool,bytes17,bytes20[][3])", + "value": [ + "0x49F0b631621836Ff9195E76cfc08Dcc278977697", + "0xd413F02F7Ed9C92e20De40b7666eAdE827914402", + false, + "0xa2c60751ca08ae3d3f855ad02b124cbc09", + [ + [ + "0xe8c548bcda9cae9035edaf52b6e0d321b417b768", + "0x4c0e3bed50fa00c8a60934fbb91e4b23b1b54f8a", + "0xa0c27acf2298b4aaa38c33ceda7cba970e6886b7" + ], + ["0x50a23e5f63c36bd24ef7f12bd566d3d3e9677f0d"], + [ + "0x2cf011b3044b094e5fab8e5c32e3e3ff0387eeab", + "0x6b61dfb8ec85e7991cf0d9b2ec678369e1cc90a1" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x49F0b631621836Ff9195E76cfc08Dcc278977697" + }, + { + "type": "address", + "value": "0xd413F02F7Ed9C92e20De40b7666eAdE827914402" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xa2c60751ca08ae3d3f855ad02b124cbc09" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe8c548bcda9cae9035edaf52b6e0d321b417b768" + }, + { + "type": "hexstring", + "value": "0x4c0e3bed50fa00c8a60934fbb91e4b23b1b54f8a" + }, + { + "type": "hexstring", + "value": "0xa0c27acf2298b4aaa38c33ceda7cba970e6886b7" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x50a23e5f63c36bd24ef7f12bd566d3d3e9677f0d" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2cf011b3044b094e5fab8e5c32e3e3ff0387eeab" + }, + { + "type": "hexstring", + "value": "0x6b61dfb8ec85e7991cf0d9b2ec678369e1cc90a1" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061046f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061034f565b60405180910390f35b6100566102f3565b61005e6102f3565b7349f0b631621836ff9195e76cfc08dcc278977697815273d413f02f7ed9c92e20de40b7666eade82791440260208201526000604082015270a2c60751ca08ae3d3f855ad02b124cbc0960781b60608201526100b8610328565b604080516003808252608082019092526000916020820160608036833750508151919250731d18a9179b5395d206bdb5ea56dc1a643682f6ed60631b91829150839060009061010957610109610423565b6001600160601b0319909216602092830291909101909101525080517326071df6a87d006453049a7ddc8f2591d8daa7c560611b9081908390600190811061015357610153610423565b6001600160601b03199092166020928302919091019091015250805173a0c27acf2298b4aaa38c33ceda7cba970e6886b760601b9081908390600290811061019d5761019d610423565b6001600160601b03199290921660209283029190910190910152508152604080516001808252818301909252600091816020016020820280368337505081519192507350a23e5f63c36bd24ef7f12bd566d3d3e9677f0d60601b91829150839060009061020c5761020c610423565b6001600160601b031992909216602092830291909101820152830191909152506040805160028082526060820190925260009181602001602082028036833750508151919250732cf011b3044b094e5fab8e5c32e3e3ff0387eeab60601b91829150839060009061027f5761027f610423565b6001600160601b031990921660209283029190910190910152508051736b61dfb8ec85e7991cf0d9b2ec678369e1cc90a160601b908190839060019081106102c9576102c9610423565b6001600160601b031992909216602092830291909101909101525060408201526080820152919050565b6040805160a081018252600080825260208201819052918101829052606081019190915260808101610323610328565b905290565b60405180606001604052806003905b60608152602001906001900390816103375790505090565b6000602080835260c0830160018060a01b0380865116838601528083870151166040860152506040850151151560608501526effffffffffffffffffffffffffffff196060860151166080850152608085015160a08086015281829050610120860192506000805b60038110156104165787850360bf19018352835180518087529087019087870190845b818110156104005783516001600160601b031916835292890192918901916001016103da565b50909650505092850192918501916001016103b7565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220fbd3e4c32b7d6d9d2de3cbdfcb967a4cf83d66a3f209b2887b1b4bbd1103676c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_614ee634 {\n address s_0;\n address s_1;\n bool s_2;\n bytes17 s_3;\n bytes20[][3] s_4;\n }\n\n function test () public pure returns (S_614ee634 memory) {\n S_614ee634 memory r;\n {\n address r_0 = 0x49F0b631621836Ff9195E76cfc08Dcc278977697;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xd413F02F7Ed9C92e20De40b7666eAdE827914402;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bytes17 r_3 = bytes17(0xa2c60751ca08ae3d3f855ad02b124cbc09);\n r.s_3 = r_3;\n }\n {\n bytes20[][3] memory r_4;\n {\n bytes20[] memory r_4_0 = new bytes20[](3);\n {\n bytes20 r_4_0_0 = bytes20(0xe8c548bCDA9CaE9035eDAf52B6E0D321b417B768);\n r_4_0[0] = r_4_0_0;\n }\n {\n bytes20 r_4_0_1 = bytes20(0x4C0E3Bed50fA00C8a60934fBB91e4b23b1b54F8a);\n r_4_0[1] = r_4_0_1;\n }\n {\n bytes20 r_4_0_2 = bytes20(0xA0C27AcF2298b4aAa38c33ceDa7Cba970e6886b7);\n r_4_0[2] = r_4_0_2;\n }\n r_4[0] = r_4_0;\n }\n {\n bytes20[] memory r_4_1 = new bytes20[](1);\n {\n bytes20 r_4_1_0 = bytes20(0x50A23E5F63c36bd24Ef7f12bd566d3D3e9677f0D);\n r_4_1[0] = r_4_1_0;\n }\n r_4[1] = r_4_1;\n }\n {\n bytes20[] memory r_4_2 = new bytes20[](2);\n {\n bytes20 r_4_2_0 = bytes20(0x2Cf011b3044b094E5fab8e5C32e3E3fF0387EeaB);\n r_4_2[0] = r_4_2_0;\n }\n {\n bytes20 r_4_2_1 = bytes20(0x6b61dFB8EC85e7991CF0d9b2ec678369E1Cc90a1);\n r_4_2[1] = r_4_2_1;\n }\n r_4[2] = r_4_2;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000049f0b631621836ff9195e76cfc08dcc278977697000000000000000000000000d413f02f7ed9c92e20de40b7666eade8279144020000000000000000000000000000000000000000000000000000000000000000a2c60751ca08ae3d3f855ad02b124cbc0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000003e8c548bcda9cae9035edaf52b6e0d321b417b7680000000000000000000000004c0e3bed50fa00c8a60934fbb91e4b23b1b54f8a000000000000000000000000a0c27acf2298b4aaa38c33ceda7cba970e6886b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000150a23e5f63c36bd24ef7f12bd566d3d3e9677f0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000022cf011b3044b094e5fab8e5c32e3e3ff0387eeab0000000000000000000000006b61dfb8ec85e7991cf0d9b2ec678369e1cc90a1000000000000000000000000" + }, + { + "name": "random-(address,int144,(int64,bool,bytes20,address,bytes10))", + "type": "(address,int144,(int64,bool,bytes20,address,bytes10))", + "value": [ + "0xC4283Eea246fbb41D2195d0084C0dC1933b92945", + "-275142182847016368334327504854516287165810", + [ + "-8298704982421087129", + false, + "0x1d6110c7b79748c9e9813c76aa9cb1ab47feffd5", + "0x2149b2AF810c0E0f51df267b906f82BeF4BEEf26", + "0x6417b07511a2a6f11191" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xC4283Eea246fbb41D2195d0084C0dC1933b92945" + }, + { + "type": "number", + "value": "-275142182847016368334327504854516287165810" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-8298704982421087129" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x1d6110c7b79748c9e9813c76aa9cb1ab47feffd5" + }, + { + "type": "address", + "value": "0x2149b2AF810c0E0f51df267b906f82BeF4BEEf26" + }, + { + "type": "hexstring", + "value": "0x6417b07511a2a6f11191" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610215806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6100386100b8565b6040805182516001600160a01b03908116825260208085015160110b8184015293830151805160070b83850152938401511515606080840191909152928401516bffffffffffffffffffffffff1916608080840191909152928401511660a08201529101516001600160b01b03191660c082015260e00160405180910390f35b6100c0610192565b6100c8610192565b73c4283eea246fbb41d2195d0084c0dc1933b92945815271032891f8e412eb6f925d489e5510f00855711960208201526101296040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b67732aec368cf9239819815260006020820152731d6110c7b79748c9e9813c76aa9cb1ab47feffd560601b604080830191909152732149b2af810c0e0f51df267b906f82bef4beef266060830152696417b07511a2a6f1119160b01b6080830152820152919050565b60408051606081018252600080825260208201529081016101da6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b90529056fea2646970667358221220a093e683190ced2fe1209b913b402263cf2149482ccbc41b2f58327d7b550b2964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6fa10cfb {\n int64 s_0;\n bool s_1;\n bytes20 s_2;\n address s_3;\n bytes10 s_4;\n }\n\n struct S_984fe987 {\n address s_0;\n int144 s_1;\n S_6fa10cfb s_2;\n }\n\n function test () public pure returns (S_984fe987 memory) {\n S_984fe987 memory r;\n {\n address r_0 = 0xC4283Eea246fbb41D2195d0084C0dC1933b92945;\n r.s_0 = r_0;\n }\n {\n int144 r_1 = -275142182847016368334327504854516287165810;\n r.s_1 = r_1;\n }\n {\n S_6fa10cfb memory r_2;\n {\n int64 r_2_0 = -8298704982421087129;\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2.s_1 = r_2_1;\n }\n {\n bytes20 r_2_2 = bytes20(0x1D6110C7B79748C9E9813C76aA9CB1ab47feffd5);\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0x2149b2AF810c0E0f51df267b906f82BeF4BEEf26;\n r_2.s_3 = r_2_3;\n }\n {\n bytes10 r_2_4 = bytes10(0x6417b07511a2a6f11191);\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000c4283eea246fbb41d2195d0084c0dc1933b92945fffffffffffffffffffffffffffffcd76e071bed14906da2b761aaef0ff7aa8effffffffffffffffffffffffffffffffffffffffffffffff8cd513c97306dc6700000000000000000000000000000000000000000000000000000000000000001d6110c7b79748c9e9813c76aa9cb1ab47feffd50000000000000000000000000000000000000000000000002149b2af810c0e0f51df267b906f82bef4beef266417b07511a2a6f1119100000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,(bool,bool,string,(address)),bool[])", + "type": "(bool,(bool,bool,string,(address)),bool[])", + "value": [ + true, + [ + false, + false, + "Moo é🚀oMoM oéééM 🚀M o MM o M🚀oéoM🚀o🚀Mo🚀 MoMéooo oMoo Mé🚀o🚀é", + ["0xE47ba5407cF8b9097e6403554a5D18C9085F43e0"] + ], + [false, true] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oMoM oéééM 🚀M o MM o M🚀oéoM🚀o🚀Mo🚀 MoMéooo oMoo Mé🚀o🚀é" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE47ba5407cF8b9097e6403554a5D18C9085F43e0" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061036d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101f9565b60405180910390f35b61005661014b565b61005e61014b565b6001815261006a610174565b600080825260208083018290526040805160808101909152605c80825290916102dc9083013960408381019190915280516020808201835273e47ba5407cf8b9097e6403554a5d18c9085f43e082526060808601929092528501939093528051600280825293810190915260009290915081602001602082028036833701905050905060008082600081518110610103576101036102c5565b602002602001019015159081151581525050506000600190508082600181518110610130576101306102c5565b91151560209283029190910190910152506040820152919050565b6040518060600160405280600015158152602001610167610174565b8152602001606081525090565b6040518060800160405280600015158152602001600015158152602001606081526020016101b7604051806020016040528060006001600160a01b031681525090565b905290565b600081518084526020808501945080840160005b838110156101ee5781511515875295820195908201906001016101d0565b509495945050505050565b600060208083528351151581840152808401516060604085015261010081511515608086015282820151151560a08601526040820151608060c08701528051808388015260005b8181101561025d5782810186015188820161012001528501610240565b81811115610270576000610120838a0101525b50601f19601f8201168701945050506060820151915061029c60e0860183516001600160a01b03169052565b6040860151915080858403016060860152506102bc6101208301826101bc565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d6f4d206fc3a9c3a9c3a94d20f09f9a804d206f204d4d206f20204df09f9a806fc3a96f4df09f9a806ff09f9a804d6ff09f9a80204d6f4dc3a96f6f6f206f4d6f6f204dc3a9f09f9a806ff09f9a80c3a9a26469706673582212207decb06962d58dfbfeb17679bec21c578b4c09be89dbc4f0ac7ed4f1aaf6433664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_2813e380 {\n bool s_0;\n bool s_1;\n string s_2;\n S_421683f8 s_3;\n }\n\n struct S_3302dd52 {\n bool s_0;\n S_2813e380 s_1;\n bool[] s_2;\n }\n\n function test () public pure returns (S_3302dd52 memory) {\n S_3302dd52 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n S_2813e380 memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀oMoM oéééM 🚀M o MM o M🚀oéoM🚀o🚀Mo🚀 MoMéooo oMoo Mé🚀o🚀é\";\n r_1.s_2 = r_1_2;\n }\n {\n S_421683f8 memory r_1_3;\n {\n address r_1_3_0 = 0xE47ba5407cF8b9097e6403554a5D18C9085F43e0;\n r_1_3.s_0 = r_1_3_0;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bool[] memory r_2 = new bool[](2);\n {\n bool r_2_0 = false;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2[1] = r_2_1;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e47ba5407cf8b9097e6403554a5d18c9085f43e0000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806f4d6f4d206fc3a9c3a9c3a94d20f09f9a804d206f204d4d206f20204df09f9a806fc3a96f4df09f9a806ff09f9a804d6ff09f9a80204d6f4dc3a96f6f6f206f4d6f6f204dc3a9f09f9a806ff09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool,(bytes23,bool,bool[1],uint64,address))", + "type": "(bool,(bytes23,bool,bool[1],uint64,address))", + "value": [ + false, + [ + "0x9225af5e794886f4a274f51418e3ac6bf9beec49d13b8b", + true, + [false], + "16197001691930113412", + "0x609c771f8f09f7f8e8A4D1393B554533D46F0Ab7" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9225af5e794886f4a274f51418e3ac6bf9beec49d13b8b" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "16197001691930113412" + }, + { + "type": "address", + "value": "0x609c771f8f09f7f8e8A4D1393B554533D46F0Ab7" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610211806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610149565b60405180910390f35b6100566100d7565b61005e6100d7565b6000815261006a6100f8565b7f9225af5e794886f4a274f51418e3ac6bf9beec49d13b8b00000000000000000081526001602082015261009c61012b565b60008152604082015267e0c74f3931e53584606082015273609c771f8f09f7f8e8a4d1393b554533d46f0ab760808201526020820152919050565b60405180604001604052806000151581526020016100f36100f8565b905290565b6040805160a0810182526000808252602082015290810161011761012b565b815260006020820181905260409091015290565b60405180602001604052806001906020820280368337509192915050565b600060c08201905082511515825260208084015168ffffffffffffffffff1981511682850152818101511515604085015260408101516060850160005b60018110156101a5578251151582529184019190840190600101610186565b505050606081015167ffffffffffffffff811660808601529150608001516001600160a01b03811660a08501529050509291505056fea26469706673582212205e8ca376af22bde1991bb79ca77c88d6f0a765b91e43ea3ae388f7812255287864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6fd7b65a {\n bytes23 s_0;\n bool s_1;\n bool[1] s_2;\n uint64 s_3;\n address s_4;\n }\n\n struct S_fd9eb70f {\n bool s_0;\n S_6fd7b65a s_1;\n }\n\n function test () public pure returns (S_fd9eb70f memory) {\n S_fd9eb70f memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n S_6fd7b65a memory r_1;\n {\n bytes23 r_1_0 = bytes23(0x9225af5e794886f4a274f51418e3ac6bf9beec49d13b8b);\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n bool[1] memory r_1_2;\n {\n bool r_1_2_0 = false;\n r_1_2[0] = r_1_2_0;\n }\n r_1.s_2 = r_1_2;\n }\n {\n uint64 r_1_3 = 16197001691930113412;\n r_1.s_3 = r_1_3;\n }\n {\n address r_1_4 = 0x609c771f8f09f7f8e8A4D1393B554533D46F0Ab7;\n r_1.s_4 = r_1_4;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000009225af5e794886f4a274f51418e3ac6bf9beec49d13b8b00000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0c74f3931e53584000000000000000000000000609c771f8f09f7f8e8a4d1393b554533d46f0ab7" + }, + { + "name": "random-(bool,bool,bool[1],string,bool)[]", + "type": "(bool,bool,bool[1],string,bool)[]", + "value": [ + [false, true, [false], "Moo é🚀o MoooMMé oM🚀o é🚀MM🚀o MMo🚀MMMo🚀 M🚀o🚀oé ", true] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o MoooMMé oM🚀o é🚀MM🚀o MMo🚀MMMo🚀 M🚀o🚀oé " + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102f9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610199565b60405180910390f35b60408051600180825281830190925260609160009190816020015b6100716100fb565b81526020019060019003908161006957905050905061008e6100fb565b60008152600160208201526100a161012e565b6000808252604080840192909252815160808101909252604980835290919061027b6020830139606083015250600160808201528151819083906000906100ea576100ea610264565b602090810291909101015250919050565b6040805160a0810182526000808252602082015290810161011a61012e565b815260606020820152600060409091015290565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b8181101561017257602081850181015186830182015201610156565b81811115610184576000602083870101525b50601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561025557603f198a8503018652825160a08151151586528982015115158a87015288820151898701855b600181101561020e57825115158252918c0191908c01906001016101ef565b50505060608083015182828901526102288389018261014c565b9250505060808083015192506102418188018415159052565b5096890196945050918701916001016101c1565b50919998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f204d6f6f6f4d4dc3a9206f4df09f9a806f20c3a9f09f9a804d4df09f9a806f204d4d6ff09f9a804d4d4d6ff09f9a80204df09f9a806ff09f9a806fc3a920a2646970667358221220d3c61fa39a65c9a85176364e7f851797b8ba642bdcd3d9fd9c83e883f5c8989c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_baa6a1e5 {\n bool s_0;\n bool s_1;\n bool[1] s_2;\n string s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_baa6a1e5[] memory) {\n S_baa6a1e5[] memory r = new S_baa6a1e5[](1);\n {\n S_baa6a1e5 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n bool[1] memory r_0_2;\n {\n bool r_0_2_0 = false;\n r_0_2[0] = r_0_2_0;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀o MoooMMé oM🚀o é🚀MM🚀o MMo🚀MMMo🚀 M🚀o🚀oé \";\n r_0.s_3 = r_0_3;\n }\n {\n bool r_0_4 = true;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a806f204d6f6f6f4d4dc3a9206f4df09f9a806f20c3a9f09f9a804d4df09f9a806f204d4d6ff09f9a804d4d4d6ff09f9a80204df09f9a806ff09f9a806fc3a9200000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bool[1],bytes27,bytes6,uint224)[2]", + "type": "(bool,bool[1],bytes27,bytes6,uint224)[2]", + "value": [ + [ + true, + [false], + "0xe4e0f5aeba830cd0728fb2434526b68b7708ce9bc382ae52da5bb3", + "0x9394b48615f4", + "8605156320040708254228406838259977889959586445641519193995606308711" + ], + [ + false, + [false], + "0xa053c7f40b35788ec5074922e67a0d6eb80ce9c456f8a561efe133", + "0xa6f48653ddaf", + "14720916725764379239621359321805408247212348029973214612087968303453" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xe4e0f5aeba830cd0728fb2434526b68b7708ce9bc382ae52da5bb3" + }, + { + "type": "hexstring", + "value": "0x9394b48615f4" + }, + { + "type": "number", + "value": "8605156320040708254228406838259977889959586445641519193995606308711" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xa053c7f40b35788ec5074922e67a0d6eb80ce9c456f8a561efe133" + }, + { + "type": "hexstring", + "value": "0xa6f48653ddaf" + }, + { + "type": "number", + "value": "14720916725764379239621359321805408247212348029973214612087968303453" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102ae806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101d6565b60405180910390f35b610056610154565b61005e610154565b610066610181565b600181526100726101b8565b6000815260208201527fe4e0f5aeba830cd0728fb2434526b68b7708ce9bc382ae52da5bb3000000000060408201526524e52d21857d60d21b60608201527b51b5f9ecbfabccbb7cda94513af5bf3bddef4f9dc59c60e82d253767608082015281526100dc610181565b600081526100e86101b8565b600081526020828101919091527fa053c7f40b35788ec5074922e67a0d6eb80ce9c456f8a561efe1330000000000604083015265a6f48653ddaf60d01b60608301527b8bc890f806e73909393a5fe7446d1a6b6a369654283d7706bf0f095d6080830152820152919050565b60405180604001604052806002905b61016b610181565b8152602001906001900390816101635790505090565b6040518060a0016040528060001515815260200161019d6101b8565b81526000602082018190526040820181905260609091015290565b60405180602001604052806001906020820280368337509192915050565b610140810181836000805b600281101561026e578251805115158552602080820151818701855b600181101561021c5782511515825291830191908301906001016101fd565b50505060408281015164ffffffffff1916908701526060808301516001600160d01b031916908701526080918201516001600160e01b03169186019190915260a09094019392909201916001016101e1565b505050509291505056fea2646970667358221220274134f2d87db8a13f92139330e56f82571205b44a02ecc9ba7b2794cb38ca3b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_804cd5c9 {\n bool s_0;\n bool[1] s_1;\n bytes27 s_2;\n bytes6 s_3;\n uint224 s_4;\n }\n\n function test () public pure returns (S_804cd5c9[2] memory) {\n S_804cd5c9[2] memory r;\n {\n S_804cd5c9 memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n bool[1] memory r_0_1;\n {\n bool r_0_1_0 = false;\n r_0_1[0] = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n bytes27 r_0_2 = bytes27(0xe4e0f5aeba830cd0728fb2434526b68b7708ce9bc382ae52da5bb3);\n r_0.s_2 = r_0_2;\n }\n {\n bytes6 r_0_3 = bytes6(0x9394b48615f4);\n r_0.s_3 = r_0_3;\n }\n {\n uint224 r_0_4 = 8605156320040708254228406838259977889959586445641519193995606308711;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_804cd5c9 memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n bool[1] memory r_1_1;\n {\n bool r_1_1_0 = false;\n r_1_1[0] = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n {\n bytes27 r_1_2 = bytes27(0xa053c7f40b35788ec5074922e67a0d6eb80ce9c456f8a561efe133);\n r_1.s_2 = r_1_2;\n }\n {\n bytes6 r_1_3 = bytes6(0xa6f48653ddaf);\n r_1.s_3 = r_1_3;\n }\n {\n uint224 r_1_4 = 14720916725764379239621359321805408247212348029973214612087968303453;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000e4e0f5aeba830cd0728fb2434526b68b7708ce9bc382ae52da5bb300000000009394b48615f400000000000000000000000000000000000000000000000000000000000051b5f9ecbfabccbb7cda94513af5bf3bddef4f9dc59c60e82d25376700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a053c7f40b35788ec5074922e67a0d6eb80ce9c456f8a561efe1330000000000a6f48653ddaf0000000000000000000000000000000000000000000000000000000000008bc890f806e73909393a5fe7446d1a6b6a369654283d7706bf0f095d" + }, + { + "name": "random-(bool,bytes7,bytes3,string,bool[][])", + "type": "(bool,bytes7,bytes3,string,bool[][])", + "value": [ + false, + "0x08e42a9d080e75", + "0x922926", + "Moo é🚀oMoé 🚀éo oééMoé éM o oéo o ", + [[false], [false, false, false, false], [false, false]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x08e42a9d080e75" + }, + { + "type": "hexstring", + "value": "0x922926" + }, + { + "type": "string", + "value": "Moo é🚀oMoé 🚀éo oééMoé éM o oéo o " + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061049f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610373565b60405180910390f35b6040805160a0808201835260008083526020808401829052838501829052606080850181905260808086018290528651948501875283855284820182905284018190526608e42a9d080e7560c81b848301526249149360e91b8487015285519081019095526030808652939492939192919061043a9083013960608301525060408051600380825260808201909252600091816020015b60608152602001906001900390816100e557505060408051600180825281830190925291925060009190602080830190803683370190505090506000808260008151811061013557610135610423565b60200260200101901515908115158152505050808260008151811061015c5761015c610423565b60209081029190910101525060408051600480825260a08201909252600091816020016020820280368337019050509050600080826000815181106101a3576101a3610423565b60200260200101901515908115158152505050600080826001815181106101cc576101cc610423565b60200260200101901515908115158152505050600080826002815181106101f5576101f5610423565b602002602001019015159081151581525050506000808260038151811061021e5761021e610423565b60200260200101901515908115158152505050808260018151811061024557610245610423565b602090810291909101015250604080516002808252606082019092526000918160200160208202803683370190505090506000808260008151811061028c5761028c610423565b60200260200101901515908115158152505050600080826001815181106102b5576102b5610423565b6020026020010190151590811515815250505080826002815181106102dc576102dc610423565b6020908102919091010152506080820152919050565b600082825180855260208086019550808260051b8401018186016000805b8581101561036557868403601f19018a52825180518086529086019086860190845b81811015610350578351151583529288019291880191600101610332565b50509a86019a94505091840191600101610310565b509198975050505050505050565b60006020808352835115158184015266ffffffffffffff60c81b8185015116604084015262ffffff60e81b6040850151166060840152606084015160a0608085015280518060c086015260005b818110156103dc5782810184015186820160e0015283016103c0565b818111156103ee57600060e083880101525b50601f19601f820116850192505050608084015160c08483030160a085015261041a60e08301826102f2565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d6fc3a920f09f9a80c3a96f206fc3a9c3a94d6fc3a920c3a94d206f206fc3a96f20206f20a264697066735822122030c805220f7a4fb6b537ed7cd73178e95d9fd1960f33f9398f3ed1da8fe9337064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a347a3da {\n bool s_0;\n bytes7 s_1;\n bytes3 s_2;\n string s_3;\n bool[][] s_4;\n }\n\n function test () public pure returns (S_a347a3da memory) {\n S_a347a3da memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bytes7 r_1 = bytes7(0x08e42a9d080e75);\n r.s_1 = r_1;\n }\n {\n bytes3 r_2 = bytes3(0x922926);\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀oMoé 🚀éo oééMoé éM o oéo o \";\n r.s_3 = r_3;\n }\n {\n bool[][] memory r_4 = new bool[][](3);\n {\n bool[] memory r_4_0 = new bool[](1);\n {\n bool r_4_0_0 = false;\n r_4_0[0] = r_4_0_0;\n }\n r_4[0] = r_4_0;\n }\n {\n bool[] memory r_4_1 = new bool[](4);\n {\n bool r_4_1_0 = false;\n r_4_1[0] = r_4_1_0;\n }\n {\n bool r_4_1_1 = false;\n r_4_1[1] = r_4_1_1;\n }\n {\n bool r_4_1_2 = false;\n r_4_1[2] = r_4_1_2;\n }\n {\n bool r_4_1_3 = false;\n r_4_1[3] = r_4_1_3;\n }\n r_4[1] = r_4_1;\n }\n {\n bool[] memory r_4_2 = new bool[](2);\n {\n bool r_4_2_0 = false;\n r_4_2[0] = r_4_2_0;\n }\n {\n bool r_4_2_1 = false;\n r_4_2[1] = r_4_2_1;\n }\n r_4[2] = r_4_2;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000008e42a9d080e7500000000000000000000000000000000000000000000000000922926000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a806f4d6fc3a920f09f9a80c3a96f206fc3a9c3a94d6fc3a920c3a94d206f206fc3a96f20206f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string,address[1],(string,(string),string))", + "type": "(bool,string,address[1],(string,(string),string))", + "value": [ + false, + "Moo é🚀🚀 ooéoM🚀oo🚀oooo é🚀", + ["0xDd1aE127751b13502e4De4463730FC550f6f895A"], + [ + "Moo é🚀🚀ooo oé éo🚀ooéoMééoMooéooéoooMo", + ["Moo é🚀"], + "Moo é🚀o🚀éo🚀🚀ooooM M🚀oé🚀 MoM MéM ooMM oMo🚀" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀 ooéoM🚀oo🚀oooo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xDd1aE127751b13502e4De4463730FC550f6f895A" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ooo oé éo🚀ooéoMééoMooéooéoooMo" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀éo🚀🚀ooooM M🚀oé🚀 MoM MéM ooMM oMo🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103a6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610252565b60405180910390f35b610056610128565b61005e610128565b60008082526040805160608101909152602b808252610346602083013960208301525061008961015a565b73dd1ae127751b13502e4de4463730fc550f6f895a815260408201526100ad610178565b60006040518060600160405280603681526020016102ce6036913982525060408051602080820183526060825282518084018452600a8152689adede418753e13f3560b71b81830152825280840191909152815160808101909252604280835260009291610304908301396040830152506060820152919050565b60408051608081018252600081526060602082015290810161014861015a565b8152602001610155610178565b905290565b60405180602001604052806001906020820280368337509192915050565b6040518060600160405280606081526020016101a06040518060200160405280606081525090565b8152602001606081525090565b6000815180845260005b818110156101d3576020818501810151868301820152016101b7565b818111156101e5576000602083870101525b50601f01601f19169290920160200192915050565b600081516060845261020f60608501826101ad565b602084810151868303878301525181835291925061022f908301826101ad565b9150506040830151848203604086015261024982826101ad565b95945050505050565b600060208083528351151581840152808401516080604085015261027960a08501826101ad565b905060408501516060850160005b60018110156102ad5782516001600160a01b031682529184019190840190600101610287565b5050506060850151848203601f19016080860152915061024981836101fa56fe4d6f6f20c3a9f09f9a80f09f9a806f6f6f206fc3a920c3a96ff09f9a806f6fc3a96f4dc3a9c3a96f4d6f6fc3a96f6fc3a96f6f6f4d6f4d6f6f20c3a9f09f9a806ff09f9a80c3a96ff09f9a80f09f9a806f6f6f6f4d204df09f9a806fc3a9f09f9a80204d6f4d204dc3a94d206f6f4d4d206f4d6ff09f9a804d6f6f20c3a9f09f9a80f09f9a8020206f6fc3a96f4df09f9a806f6ff09f9a806f6f6f6f20c3a9f09f9a80a2646970667358221220716929179cbf8a773232e4ae9270329efaef7c015d5c3a34b37915afb78ec0bb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_3310a6ff {\n string s_0;\n S_97fc4627 s_1;\n string s_2;\n }\n\n struct S_8dc150ef {\n bool s_0;\n string s_1;\n address[1] s_2;\n S_3310a6ff s_3;\n }\n\n function test () public pure returns (S_8dc150ef memory) {\n S_8dc150ef memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀 ooéoM🚀oo🚀oooo é🚀\";\n r.s_1 = r_1;\n }\n {\n address[1] memory r_2;\n {\n address r_2_0 = 0xDd1aE127751b13502e4De4463730FC550f6f895A;\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n S_3310a6ff memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀🚀ooo oé éo🚀ooéoMééoMooéooéoooMo\";\n r_3.s_0 = r_3_0;\n }\n {\n S_97fc4627 memory r_3_1;\n {\n string memory r_3_1_0 = unicode\"Moo é🚀\";\n r_3_1.s_0 = r_3_1_0;\n }\n r_3.s_1 = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀o🚀éo🚀🚀ooooM M🚀oé🚀 MoM MéM ooMM oMo🚀\";\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000dd1ae127751b13502e4de4463730fc550f6f895a00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a80f09f9a8020206f6fc3a96f4df09f9a806f6ff09f9a806f6f6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80f09f9a806f6f6f206fc3a920c3a96ff09f9a806f6fc3a96f4dc3a9c3a96f4d6f6fc3a96f6fc3a96f6f6f4d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a806ff09f9a80c3a96ff09f9a80f09f9a806f6f6f6f4d204df09f9a806fc3a9f09f9a80204d6f4d204dc3a94d206f6f4d4d206f4d6ff09f9a80000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool[3],uint72,bool,(int224,uint184),address)", + "type": "(bool[3],uint72,bool,(int224,uint184),address)", + "value": [ + [true, false, true], + "4535964348441548969180", + true, + [ + "-6418820650046693556843976800617405097575301875889565642671844506808", + "24438828902981147049337716815967054393051721840592518229" + ], + "0xB67FdCefD1f7a3DBC7107f3a58c2d55a54a8E736" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "4535964348441548969180" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-6418820650046693556843976800617405097575301875889565642671844506808" + }, + { + "type": "number", + "value": "24438828902981147049337716815967054393051721840592518229" + } + ] + }, + { + "type": "address", + "value": "0xB67FdCefD1f7a3DBC7107f3a58c2d55a54a8E736" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061024f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610188565b60405180910390f35b610056610101565b61005e610101565b61006661016a565b60018082526000602080840191909152604080840183905292845268f5e5269656a6b654dc848201528383019190915281518083019092527fffffffffc30cb61a570e964ab2dd7ed64a4c15429c879349196e0f74c6c3c348825276ff273d4c749f3692c42cc16ff9ed393d8a0ead1ce97c5590820152606082015273b67fdcefd1f7a3dbc7107f3a58c2d55a54a8e7366080820152919050565b6040518060a0016040528061011461016a565b8152602001600068ffffffffffffffffff16815260200160001515815260200161015d60405180604001604052806000601b0b815260200160006001600160b81b031681525090565b8152600060209091015290565b60405180606001604052806003906020820280368337509192915050565b81516101008201908260005b60038110156101b55782511515825260209283019290910190600101610194565b505050602083015168ffffffffffffffffff166060830152604083015180151560808401525060608301518051601b0b60a084015260208101516001600160b81b031660c08401525060808301516001600160a01b03811660e0840152509291505056fea2646970667358221220014ab270cc45da15ebae710faa6ce5fee56256bef5bccb497e464610a6de90a264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bc6be5a1 {\n int224 s_0;\n uint184 s_1;\n }\n\n struct S_e4f69676 {\n bool[3] s_0;\n uint72 s_1;\n bool s_2;\n S_bc6be5a1 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_e4f69676 memory) {\n S_e4f69676 memory r;\n {\n bool[3] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n uint72 r_1 = 4535964348441548969180;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n S_bc6be5a1 memory r_3;\n {\n int224 r_3_0 = -6418820650046693556843976800617405097575301875889565642671844506808;\n r_3.s_0 = r_3_0;\n }\n {\n uint184 r_3_1 = 24438828902981147049337716815967054393051721840592518229;\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xB67FdCefD1f7a3DBC7107f3a58c2d55a54a8E736;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000f5e5269656a6b654dc0000000000000000000000000000000000000000000000000000000000000001ffffffffc30cb61a570e964ab2dd7ed64a4c15429c879349196e0f74c6c3c348000000000000000000ff273d4c749f3692c42cc16ff9ed393d8a0ead1ce97c55000000000000000000000000b67fdcefd1f7a3dbc7107f3a58c2d55a54a8e736" + }, + { + "name": "random-(bool[4],((string),uint128,string,bytes17[3]))", + "type": "(bool[4],((string),uint128,string,bytes17[3]))", + "value": [ + [true, true, true, false], + [ + ["Moo é🚀o🚀oo🚀o éoéo oooMo é🚀Mo oMé🚀oMooo 🚀 éo"], + "132696753919735664446618760930288562956", + "Moo é🚀 oo🚀é🚀éoMéoMéooo🚀oooo ", + [ + "0x6dc48cb068f0f771d9a2a49418d7216581", + "0x58b803f65e241c49d627ee038d2165316e", + "0x59527bfb5496208e04ed9d24daa29131db" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀oo🚀o éoéo oooMo é🚀Mo oMé🚀oMooo 🚀 éo" + } + ] + }, + { + "type": "number", + "value": "132696753919735664446618760930288562956" + }, + { + "type": "string", + "value": "Moo é🚀 oo🚀é🚀éoMéoMéooo🚀oooo " + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6dc48cb068f0f771d9a2a49418d7216581" + }, + { + "type": "hexstring", + "value": "0x58b803f65e241c49d627ee038d2165316e" + }, + { + "type": "hexstring", + "value": "0x59527bfb5496208e04ed9d24daa29131db" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103b8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061022f565b60405180910390f35b610056610158565b61005e610158565b61006661017d565b600180825260208201819052604082015260006060820152815261008861019b565b60408051602081019091526060815260006040518060800160405280604381526020016103406043913982525081526f63d47716ac1552b544075c5d10f5730c6020808301919091526040805160608101909152602d808252600092610313908301396040830152506100f96101c4565b706dc48cb068f0f771d9a2a49418d721658160781b8152702c5c01fb2f120e24eb13f701c690b298b760791b6020808301919091527059527bfb5496208e04ed9d24daa29131db60781b60408301526060830191909152820152919050565b604051806040016040528061016b61017d565b815260200161017861019b565b905290565b60405180608001604052806004906020820280368337509192915050565b6040805160a0810182526060608082018181528252600060208301529181018290529081016101785b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b81811015610208576020818501810151868301820152016101ec565b8181111561021a576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160009190828483015b6004821015610260578251151581529183019160019190910190830161023f565b5050508381015160a084810152805160c08086015251610180850183905261028c6101a08601826101e2565b90506fffffffffffffffffffffffffffffffff838301511660e0860152604082015160bf19868303016101008701526102c582826101e2565b91505060608201519150610120850160005b60038110156103065783516effffffffffffffffffffffffffffff1916825292840192908401906001016102d7565b5090969550505050505056fe4d6f6f20c3a9f09f9a80206f6ff09f9a80c3a9f09f9a80c3a96f4dc3a96f4dc3a96f6f6ff09f9a806f6f6f6f204d6f6f20c3a9f09f9a806ff09f9a806f6ff09f9a806f20c3a96fc3a96f206f6f6f4d6f20c3a9f09f9a804d6f206f4dc3a9f09f9a806f4d6f6f6f20f09f9a8020c3a96fa264697066735822122060b42ffe09eb9667e1d780d49211afd6f6e798d5043f098f278c903edb8febc364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_73eb10c5 {\n S_97fc4627 s_0;\n uint128 s_1;\n string s_2;\n bytes17[3] s_3;\n }\n\n struct S_8d75cce2 {\n bool[4] s_0;\n S_73eb10c5 s_1;\n }\n\n function test () public pure returns (S_8d75cce2 memory) {\n S_8d75cce2 memory r;\n {\n bool[4] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n S_73eb10c5 memory r_1;\n {\n S_97fc4627 memory r_1_0;\n {\n string memory r_1_0_0 = unicode\"Moo é🚀o🚀oo🚀o éoéo oooMo é🚀Mo oMé🚀oMooo 🚀 éo\";\n r_1_0.s_0 = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n uint128 r_1_1 = 132696753919735664446618760930288562956;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀 oo🚀é🚀éoMéoMéooo🚀oooo \";\n r_1.s_2 = r_1_2;\n }\n {\n bytes17[3] memory r_1_3;\n {\n bytes17 r_1_3_0 = bytes17(0x6dc48cb068f0f771d9a2a49418d7216581);\n r_1_3[0] = r_1_3_0;\n }\n {\n bytes17 r_1_3_1 = bytes17(0x58b803f65e241c49d627ee038d2165316e);\n r_1_3[1] = r_1_3_1;\n }\n {\n bytes17 r_1_3_2 = bytes17(0x59527bfb5496208e04ed9d24daa29131db);\n r_1_3[2] = r_1_3_2;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000063d47716ac1552b544075c5d10f5730c00000000000000000000000000000000000000000000000000000000000001606dc48cb068f0f771d9a2a49418d721658100000000000000000000000000000058b803f65e241c49d627ee038d2165316e00000000000000000000000000000059527bfb5496208e04ed9d24daa29131db000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a806ff09f9a806f6ff09f9a806f20c3a96fc3a96f206f6f6f4d6f20c3a9f09f9a804d6f206f4dc3a9f09f9a806f4d6f6f6f20f09f9a8020c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80206f6ff09f9a80c3a9f09f9a80c3a96f4dc3a96f4dc3a96f6f6ff09f9a806f6f6f6f2000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes1[1],bool,int,bytes32,bytes28)[4]", + "type": "(bytes1[1],bool,int,bytes32,bytes28)[4]", + "value": [ + [ + ["0x53"], + false, + "45951035850761741965938828097863677845433677283782871747441761503185887793087", + "0xfb5d1c7a9c81eabbf42191832ba31e25d8584440e8a13f8ce5494a8f2255956c", + "0x6324bc19045215def69183cc0c332a10709151d4e80bf13130c683fc" + ], + [ + ["0x9c"], + true, + "16346745290562006938829453866745602442043982381133115153767474438870192303222", + "0x1174b364fab3e249dc5087fb6024e2166923f536d076963634182b1a93449614", + "0x1dae7064361a0b547254011252182950dfb831fbd8fb14c97e7de80e" + ], + [ + ["0xe9"], + true, + "15842128826463895113386789355409754023168105186916834079232232404897208207349", + "0x4af2b78fb9044a44c27ba7a42e614e81f76a42584408ffdbfcc73658b6dcbdff", + "0x4d03e9852b670b46e3f8e99d437838a4edec4d2137b1b5e482a3f5a6" + ], + [ + ["0x11"], + false, + "-25028951373181890396189930937898868506744737527323695993236592248656798334265", + "0x9b17ae824b8d94e2c6891c58031f88df91046b580d88538e9b00c343012d383e", + "0x6dece94707ebe38a5dad62fb473370a58962c1f9e3ebf8d55148048e" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x53" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "45951035850761741965938828097863677845433677283782871747441761503185887793087" + }, + { + "type": "hexstring", + "value": "0xfb5d1c7a9c81eabbf42191832ba31e25d8584440e8a13f8ce5494a8f2255956c" + }, + { + "type": "hexstring", + "value": "0x6324bc19045215def69183cc0c332a10709151d4e80bf13130c683fc" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9c" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "16346745290562006938829453866745602442043982381133115153767474438870192303222" + }, + { + "type": "hexstring", + "value": "0x1174b364fab3e249dc5087fb6024e2166923f536d076963634182b1a93449614" + }, + { + "type": "hexstring", + "value": "0x1dae7064361a0b547254011252182950dfb831fbd8fb14c97e7de80e" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe9" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "15842128826463895113386789355409754023168105186916834079232232404897208207349" + }, + { + "type": "hexstring", + "value": "0x4af2b78fb9044a44c27ba7a42e614e81f76a42584408ffdbfcc73658b6dcbdff" + }, + { + "type": "hexstring", + "value": "0x4d03e9852b670b46e3f8e99d437838a4edec4d2137b1b5e482a3f5a6" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x11" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-25028951373181890396189930937898868506744737527323695993236592248656798334265" + }, + { + "type": "hexstring", + "value": "0x9b17ae824b8d94e2c6891c58031f88df91046b580d88538e9b00c343012d383e" + }, + { + "type": "hexstring", + "value": "0x6dece94707ebe38a5dad62fb473370a58962c1f9e3ebf8d55148048e" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610410806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610342565b60405180910390f35b6100566102c2565b61005e6102c2565b6100666102ef565b61006e610324565b605360f81b81528152600060208201527f65975d5814bed094729298644b9b029cc97e551501ad96385c1ecf7b194f8fbf60408201527ffb5d1c7a9c81eabbf42191832ba31e25d8584440e8a13f8ce5494a8f2255956c60608201527f6324bc19045215def69183cc0c332a10709151d4e80bf13130c683fc00000000608082015281526100fa6102ef565b610102610324565b602760fa1b8152815260016020828101919091527f2423ee11c13623b9646194c4da1ef58cdeea10e66675df3cbacea03932af2c7660408301527f1174b364fab3e249dc5087fb6024e2166923f536d076963634182b1a9344961460608301527f1dae7064361a0b547254011252182950dfb831fbd8fb14c97e7de80e0000000060808301528201526101936102ef565b61019b610324565b60e960f81b81528152600160208201527f230653c0d4bdf9e779510cb142f07ada4c7fd02fb133b48a4d9ad946562807f56040808301919091527f4af2b78fb9044a44c27ba7a42e614e81f76a42584408ffdbfcc73658b6dcbdff60608301527f4d03e9852b670b46e3f8e99d437838a4edec4d2137b1b5e482a3f5a600000000608083015282015261022c6102ef565b610234610324565b601160f81b81528152600060208201527fc8aa1d94369fa567b639a644ce79a91a6640d78e0b23a195cc2cdc5c9f0542c760408201527f9b17ae824b8d94e2c6891c58031f88df91046b580d88538e9b00c343012d383e6060808301919091527f6dece94707ebe38a5dad62fb473370a58962c1f9e3ebf8d55148048e000000006080830152820152919050565b60405180608001604052806004905b6102d96102ef565b8152602001906001900390816102d15790505090565b6040518060a00160405280610302610324565b8152600060208201819052604082018190526060820181905260809091015290565b60405180602001604052806001906020820280368337509192915050565b610280810181836000805b60048110156103d0578251805185845b60018110156103865782516001600160f81b03191682526020928301929091019060010161035d565b505050602081810151151586820152604080830151908701526060808301519087015260809182015163ffffffff19169186019190915260a090940193929092019160010161034d565b505050509291505056fea264697066735822122093038474b6a36699ea8b81670d0b3e81fada94f9fb2b073514e8722c174a22c664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5327395f {\n bytes1[1] s_0;\n bool s_1;\n int256 s_2;\n bytes32 s_3;\n bytes28 s_4;\n }\n\n function test () public pure returns (S_5327395f[4] memory) {\n S_5327395f[4] memory r;\n {\n S_5327395f memory r_0;\n {\n bytes1[1] memory r_0_0;\n {\n bytes1 r_0_0_0 = bytes1(0x53);\n r_0_0[0] = r_0_0_0;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n int r_0_2 = 45951035850761741965938828097863677845433677283782871747441761503185887793087;\n r_0.s_2 = r_0_2;\n }\n {\n bytes32 r_0_3 = bytes32(0xfb5d1c7a9c81eabbf42191832ba31e25d8584440e8a13f8ce5494a8f2255956c);\n r_0.s_3 = r_0_3;\n }\n {\n bytes28 r_0_4 = bytes28(0x6324bc19045215def69183cc0c332a10709151d4e80bf13130c683fc);\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_5327395f memory r_1;\n {\n bytes1[1] memory r_1_0;\n {\n bytes1 r_1_0_0 = bytes1(0x9c);\n r_1_0[0] = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n int r_1_2 = 16346745290562006938829453866745602442043982381133115153767474438870192303222;\n r_1.s_2 = r_1_2;\n }\n {\n bytes32 r_1_3 = bytes32(0x1174b364fab3e249dc5087fb6024e2166923f536d076963634182b1a93449614);\n r_1.s_3 = r_1_3;\n }\n {\n bytes28 r_1_4 = bytes28(0x1dae7064361a0b547254011252182950dfb831fbd8fb14c97e7de80e);\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_5327395f memory r_2;\n {\n bytes1[1] memory r_2_0;\n {\n bytes1 r_2_0_0 = bytes1(0xe9);\n r_2_0[0] = r_2_0_0;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n int r_2_2 = 15842128826463895113386789355409754023168105186916834079232232404897208207349;\n r_2.s_2 = r_2_2;\n }\n {\n bytes32 r_2_3 = bytes32(0x4af2b78fb9044a44c27ba7a42e614e81f76a42584408ffdbfcc73658b6dcbdff);\n r_2.s_3 = r_2_3;\n }\n {\n bytes28 r_2_4 = bytes28(0x4d03e9852b670b46e3f8e99d437838a4edec4d2137b1b5e482a3f5a6);\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n {\n S_5327395f memory r_3;\n {\n bytes1[1] memory r_3_0;\n {\n bytes1 r_3_0_0 = bytes1(0x11);\n r_3_0[0] = r_3_0_0;\n }\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3.s_1 = r_3_1;\n }\n {\n int r_3_2 = -25028951373181890396189930937898868506744737527323695993236592248656798334265;\n r_3.s_2 = r_3_2;\n }\n {\n bytes32 r_3_3 = bytes32(0x9b17ae824b8d94e2c6891c58031f88df91046b580d88538e9b00c343012d383e);\n r_3.s_3 = r_3_3;\n }\n {\n bytes28 r_3_4 = bytes28(0x6dece94707ebe38a5dad62fb473370a58962c1f9e3ebf8d55148048e);\n r_3.s_4 = r_3_4;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065975d5814bed094729298644b9b029cc97e551501ad96385c1ecf7b194f8fbffb5d1c7a9c81eabbf42191832ba31e25d8584440e8a13f8ce5494a8f2255956c6324bc19045215def69183cc0c332a10709151d4e80bf13130c683fc000000009c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012423ee11c13623b9646194c4da1ef58cdeea10e66675df3cbacea03932af2c761174b364fab3e249dc5087fb6024e2166923f536d076963634182b1a934496141dae7064361a0b547254011252182950dfb831fbd8fb14c97e7de80e00000000e9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001230653c0d4bdf9e779510cb142f07ada4c7fd02fb133b48a4d9ad946562807f54af2b78fb9044a44c27ba7a42e614e81f76a42584408ffdbfcc73658b6dcbdff4d03e9852b670b46e3f8e99d437838a4edec4d2137b1b5e482a3f5a60000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8aa1d94369fa567b639a644ce79a91a6640d78e0b23a195cc2cdc5c9f0542c79b17ae824b8d94e2c6891c58031f88df91046b580d88538e9b00c343012d383e6dece94707ebe38a5dad62fb473370a58962c1f9e3ebf8d55148048e00000000" + }, + { + "name": "random-(bytes12[4],bool,address[4],uint144,bytes13)", + "type": "(bytes12[4],bool,address[4],uint144,bytes13)", + "value": [ + [ + "0x7bc1bf64310bc9d9432f20ce", + "0x54bdc4ad8a36bf7759670e4f", + "0x8bd7c6ec8f8abcbe5c8aefdd", + "0xe0989126437ec60ceeccdcf8" + ], + false, + [ + "0x1AC6eb8A246a9E4fCA2061E4307E8698e99B0F1c", + "0x710D6593B0ab0C9A8054f46E81fcbF4A00DaaFa7", + "0x4E917A3E226ed7ffdF2a88f909e75dFD15395D20", + "0xEe37f6D2E1A26030FD36A67B6840522c4943D7A6" + ], + "8416196836672454983981591962733681215185208", + "0xdfaabaf6fc9199a17c4b589789" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7bc1bf64310bc9d9432f20ce" + }, + { + "type": "hexstring", + "value": "0x54bdc4ad8a36bf7759670e4f" + }, + { + "type": "hexstring", + "value": "0x8bd7c6ec8f8abcbe5c8aefdd" + }, + { + "type": "hexstring", + "value": "0xe0989126437ec60ceeccdcf8" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1AC6eb8A246a9E4fCA2061E4307E8698e99B0F1c" + }, + { + "type": "address", + "value": "0x710D6593B0ab0C9A8054f46E81fcbF4A00DaaFa7" + }, + { + "type": "address", + "value": "0x4E917A3E226ed7ffdF2a88f909e75dFD15395D20" + }, + { + "type": "address", + "value": "0xEe37f6D2E1A26030FD36A67B6840522c4943D7A6" + } + ] + }, + { + "type": "number", + "value": "8416196836672454983981591962733681215185208" + }, + { + "type": "hexstring", + "value": "0xdfaabaf6fc9199a17c4b589789" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102cf806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101fd565b60405180910390f35b610056610172565b61005e610172565b6100666101ad565b6b3de0dfb21885e4eca197906760a11b81526b54bdc4ad8a36bf7759670e4f60a01b6020808301919091526b8bd7c6ec8f8abcbe5c8aefdd60a01b60408301526b1c131224c86fd8c19dd99b9f60a31b60608301529082526000908201526100cc6101ad565b731ac6eb8a246a9e4fca2061e4307e8698e99b0f1c815273710d6593b0ab0c9a8054f46e81fcbf4a00daafa76020820152734e917a3e226ed7ffdf2a88f909e75dfd15395d2060408083019190915273ee37f6d2e1a26030fd36a67b6840522c4943d7a66060808401919091529083019190915271609cfac68f7a61d509941b909d74dc1ea138908201526cdfaabaf6fc9199a17c4b58978960981b6080820152919050565b6040518060a001604052806101856101ad565b8152600060208201526040016101996101ad565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156101f75781516001600160a01b03168452602093840193909101906001016101cf565b50505050565b81516101608201908260005b60048110156102325782516001600160a01b031916825260209283019290910190600101610209565b505050602083015115156080830152604083015161025360a08401826101cb565b50606083015171ffffffffffffffffffffffffffffffffffff1661012083015260809092015172ffffffffffffffffffffffffffffffffffffff1916610140909101529056fea2646970667358221220d7c9ca3855363aabf80ff905589eb40cfca7986195eb412b71ac4f4166489e9b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5519549a {\n bytes12[4] s_0;\n bool s_1;\n address[4] s_2;\n uint144 s_3;\n bytes13 s_4;\n }\n\n function test () public pure returns (S_5519549a memory) {\n S_5519549a memory r;\n {\n bytes12[4] memory r_0;\n {\n bytes12 r_0_0 = bytes12(0x7bc1bf64310bc9d9432f20ce);\n r_0[0] = r_0_0;\n }\n {\n bytes12 r_0_1 = bytes12(0x54bdc4ad8a36bf7759670e4f);\n r_0[1] = r_0_1;\n }\n {\n bytes12 r_0_2 = bytes12(0x8bd7c6ec8f8abcbe5c8aefdd);\n r_0[2] = r_0_2;\n }\n {\n bytes12 r_0_3 = bytes12(0xe0989126437ec60ceeccdcf8);\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n address[4] memory r_2;\n {\n address r_2_0 = 0x1AC6eb8A246a9E4fCA2061E4307E8698e99B0F1c;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x710D6593B0ab0C9A8054f46E81fcbF4A00DaaFa7;\n r_2[1] = r_2_1;\n }\n {\n address r_2_2 = 0x4E917A3E226ed7ffdF2a88f909e75dFD15395D20;\n r_2[2] = r_2_2;\n }\n {\n address r_2_3 = 0xEe37f6D2E1A26030FD36A67B6840522c4943D7A6;\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n uint144 r_3 = 8416196836672454983981591962733681215185208;\n r.s_3 = r_3;\n }\n {\n bytes13 r_4 = bytes13(0xdfaabaf6fc9199a17c4b589789);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x7bc1bf64310bc9d9432f20ce000000000000000000000000000000000000000054bdc4ad8a36bf7759670e4f00000000000000000000000000000000000000008bd7c6ec8f8abcbe5c8aefdd0000000000000000000000000000000000000000e0989126437ec60ceeccdcf8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac6eb8a246a9e4fca2061e4307e8698e99b0f1c000000000000000000000000710d6593b0ab0c9a8054f46e81fcbf4a00daafa70000000000000000000000004e917a3e226ed7ffdf2a88f909e75dfd15395d20000000000000000000000000ee37f6d2e1a26030fd36a67b6840522c4943d7a60000000000000000000000000000609cfac68f7a61d509941b909d74dc1ea138dfaabaf6fc9199a17c4b58978900000000000000000000000000000000000000" + }, + { + "name": "random-(bytes16,address[3],int24,bool,(address,uint128))", + "type": "(bytes16,address[3],int24,bool,(address,uint128))", + "value": [ + "0x985c3b4bed66c68d724558ca9d0c5a41", + [ + "0x3825D99556dFDC66E5195Af4585dA92870988a71", + "0xC74d25a2880d1a29D96e7A44E67E52a43f52903A", + "0x3F16de2fA11bD2e9da9aD4c4365f2072f967d0Fa" + ], + "-7265032", + true, + ["0xcB7017382824d46cFA576e8Abe3D567eA0C046F0", "42647682971370966884211330932430589296"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x985c3b4bed66c68d724558ca9d0c5a41" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3825D99556dFDC66E5195Af4585dA92870988a71" + }, + { + "type": "address", + "value": "0xC74d25a2880d1a29D96e7A44E67E52a43f52903A" + }, + { + "type": "address", + "value": "0x3F16de2fA11bD2e9da9aD4c4365f2072f967d0Fa" + } + ] + }, + { + "type": "number", + "value": "-7265032" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xcB7017382824d46cFA576e8Abe3D567eA0C046F0" + }, + { + "type": "number", + "value": "42647682971370966884211330932430589296" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061018f565b60405180910390f35b610056610124565b61005e610124565b6f985c3b4bed66c68d724558ca9d0c5a4160801b815261007c610171565b733825d99556dfdc66e5195af4585da92870988a71815273c74d25a2880d1a29d96e7a44e67e52a43f52903a602080830191909152733f16de2fa11bd2e9da9ad4c4365f2072f967d0fa60408084019190915283820192909252626edb07198383015260016060840152815180830190925273cb7017382824d46cfa576e8abe3d567ea0c046f082526f2015a51cb5c1f6bcd13d00cc44a3cd70908201526080820152919050565b6040805160a08101909152600081526020810161013f610171565b8152600060208201819052604082015260600161016c604080518082019091526000808252602082015290565b905290565b60405180606001604052806003906020820280368337509192915050565b81516fffffffffffffffffffffffffffffffff191681526020808301516101008301919081840160005b60038110156101df5782516001600160a01b0316825291830191908301906001016101b9565b5050505060408301516101f7608084018260020b9052565b506060830151151560a083015260809092015180516001600160a01b031660c0830152602001516fffffffffffffffffffffffffffffffff1660e0909101529056fea2646970667358221220bf24baa7fda7f4c4d3270af9f7d36cc2a4adbdca03b2d9b39fef9b87caf1d9fe64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f76eed88 {\n address s_0;\n uint128 s_1;\n }\n\n struct S_c59e4e80 {\n bytes16 s_0;\n address[3] s_1;\n int24 s_2;\n bool s_3;\n S_f76eed88 s_4;\n }\n\n function test () public pure returns (S_c59e4e80 memory) {\n S_c59e4e80 memory r;\n {\n bytes16 r_0 = bytes16(0x985c3b4bed66c68d724558ca9d0c5a41);\n r.s_0 = r_0;\n }\n {\n address[3] memory r_1;\n {\n address r_1_0 = 0x3825D99556dFDC66E5195Af4585dA92870988a71;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0xC74d25a2880d1a29D96e7A44E67E52a43f52903A;\n r_1[1] = r_1_1;\n }\n {\n address r_1_2 = 0x3F16de2fA11bD2e9da9aD4c4365f2072f967d0Fa;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n int24 r_2 = -7265032;\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n S_f76eed88 memory r_4;\n {\n address r_4_0 = 0xcB7017382824d46cFA576e8Abe3D567eA0C046F0;\n r_4.s_0 = r_4_0;\n }\n {\n uint128 r_4_1 = 42647682971370966884211330932430589296;\n r_4.s_1 = r_4_1;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x985c3b4bed66c68d724558ca9d0c5a41000000000000000000000000000000000000000000000000000000003825d99556dfdc66e5195af4585da92870988a71000000000000000000000000c74d25a2880d1a29d96e7a44e67e52a43f52903a0000000000000000000000003f16de2fa11bd2e9da9ad4c4365f2072f967d0faffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9124f80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cb7017382824d46cfa576e8abe3d567ea0c046f0000000000000000000000000000000002015a51cb5c1f6bcd13d00cc44a3cd70" + }, + { + "name": "random-(bytes26,address[3],string,int192)[2][]", + "type": "(bytes26,address[3],string,int192)[2][]", + "value": [ + [ + [ + "0x69e4238d005717fb39a83c584a253c85708aa091593b0472c33d", + [ + "0xb1b5D23075adB417e0774021F4115865196A33eA", + "0x615B8d88F8A5E3ea8D3C0f1f7f877cF69C6B6c2D", + "0x2FDC6501Ffd5E285c3E70386Af0C59a9fbFAACa5" + ], + "Moo é🚀o M éoMéM oMMoM o🚀éééoooMé🚀🚀éMéM🚀 Mé", + "-1021907047724614775470328826193003201333357222658790453133" + ], + [ + "0x8427160f1fcac9cf085ed9a3f2ba2e2d00a29d0eecd3b5b05250", + [ + "0xD0B8Ef0f7e3E94275FF59Db6aF5F2206a673fce9", + "0x955F332634e0Ee8040F61391e2810471f27E3942", + "0xF0fA70aC82D3ce9553f080DEdfC006942A16ECb3" + ], + "Moo é🚀 o🚀oMo🚀Moé🚀🚀MM MooMé🚀🚀🚀🚀oéoé", + "-1274066705594859911105920028043902126077249796309245150864" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x69e4238d005717fb39a83c584a253c85708aa091593b0472c33d" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xb1b5D23075adB417e0774021F4115865196A33eA" + }, + { + "type": "address", + "value": "0x615B8d88F8A5E3ea8D3C0f1f7f877cF69C6B6c2D" + }, + { + "type": "address", + "value": "0x2FDC6501Ffd5E285c3E70386Af0C59a9fbFAACa5" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o M éoMéM oMMoM o🚀éééoooMé🚀🚀éMéM🚀 Mé" + }, + { + "type": "number", + "value": "-1021907047724614775470328826193003201333357222658790453133" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8427160f1fcac9cf085ed9a3f2ba2e2d00a29d0eecd3b5b05250" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xD0B8Ef0f7e3E94275FF59Db6aF5F2206a673fce9" + }, + { + "type": "address", + "value": "0x955F332634e0Ee8040F61391e2810471f27E3942" + }, + { + "type": "address", + "value": "0xF0fA70aC82D3ce9553f080DEdfC006942A16ECb3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 o🚀oMo🚀Moé🚀🚀MM MooMé🚀🚀🚀🚀oéoé" + }, + { + "type": "number", + "value": "-1274066705594859911105920028043902126077249796309245150864" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104e1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610318565b60405180910390f35b60408051600180825281830190925260609160009190816020015b610071610251565b81526020019060019003908161006957905050905061008e610251565b61009661027e565b7f69e4238d005717fb39a83c584a253c85708aa091593b0472c33d00000000000081526100c16102ad565b73b1b5d23075adb417e0774021f4115865196a33ea815273615b8d88f8a5e3ea8d3c0f1f7f877cf69c6b6c2d602080830191909152732fdc6501ffd5e285c3e70386af0c59a9fbfaaca560408084019190915283820192909252815160808101909252604380835260009291610427908301396040830152507729ad35181a66ba3c5a460378bed5e552e088d06066a0ef8c196060820152815261016361027e565b7f8427160f1fcac9cf085ed9a3f2ba2e2d00a29d0eecd3b5b05250000000000000815261018e6102ad565b73d0b8ef0f7e3e94275ff59db6af5f2206a673fce9815273955f332634e0ee8040f61391e2810471f27e394260208083019190915273f0fa70ac82d3ce9553f080dedfc006942a16ecb36040808401919091528382019290925281516080810190925260428083526000929161046a908301396040830152507733f5e0876dae97ad30ab764a008d24c7b81213f7a096c68f196060820152602082015281518190839060009061024057610240610410565b602090810291909101015250919050565b60405180604001604052806002905b61026861027e565b8152602001906001900390816102605790505090565b604080516080810190915260008152602081016102996102ad565b815260606020820152600060409091015290565b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b818110156102f1576020818501810151868301820152016102d5565b81811115610303576000602083870101525b50601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561040257888303603f1901855281518387810160005b60028110156103ed578682038352835160c065ffffffffffff1982511684528c8201518d850160005b60038110156103a85782516001600160a01b03168252918f0191908f0190600101610382565b5050508b8201518160808601526103c1828601826102cb565b915050606082015191506103da60a085018360170b9052565b948c0194938c0193925050600101610359565b5096890196945050509086019060010161033f565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f204d20c3a96f4dc3a94d206f4d4d6f4d206ff09f9a80c3a9c3a9c3a96f6f6f4dc3a9f09f9a80f09f9a80c3a94dc3a94df09f9a80204dc3a94d6f6f20c3a9f09f9a80206ff09f9a806f4d6ff09f9a804d6fc3a9f09f9a80f09f9a804d4d204d6f6f4dc3a9f09f9a80f09f9a80f09f9a80f09f9a806fc3a96fc3a9a2646970667358221220341ca73aedf1ba506ebec7d75163cc881713e7f2fe467d50c6729728c7e6093664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7c504d38 {\n bytes26 s_0;\n address[3] s_1;\n string s_2;\n int192 s_3;\n }\n\n function test () public pure returns (S_7c504d38[2][] memory) {\n S_7c504d38[2][] memory r = new S_7c504d38[2][](1);\n {\n S_7c504d38[2] memory r_0;\n {\n S_7c504d38 memory r_0_0;\n {\n bytes26 r_0_0_0 = bytes26(0x69e4238d005717fb39a83c584a253c85708aa091593b0472c33d);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address[3] memory r_0_0_1;\n {\n address r_0_0_1_0 = 0xb1b5D23075adB417e0774021F4115865196A33eA;\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n address r_0_0_1_1 = 0x615B8d88F8A5E3ea8D3C0f1f7f877cF69C6B6c2D;\n r_0_0_1[1] = r_0_0_1_1;\n }\n {\n address r_0_0_1_2 = 0x2FDC6501Ffd5E285c3E70386Af0C59a9fbFAACa5;\n r_0_0_1[2] = r_0_0_1_2;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀o M éoMéM oMMoM o🚀éééoooMé🚀🚀éMéM🚀 Mé\";\n r_0_0.s_2 = r_0_0_2;\n }\n {\n int192 r_0_0_3 = -1021907047724614775470328826193003201333357222658790453133;\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n S_7c504d38 memory r_0_1;\n {\n bytes26 r_0_1_0 = bytes26(0x8427160f1fcac9cf085ed9a3f2ba2e2d00a29d0eecd3b5b05250);\n r_0_1.s_0 = r_0_1_0;\n }\n {\n address[3] memory r_0_1_1;\n {\n address r_0_1_1_0 = 0xD0B8Ef0f7e3E94275FF59Db6aF5F2206a673fce9;\n r_0_1_1[0] = r_0_1_1_0;\n }\n {\n address r_0_1_1_1 = 0x955F332634e0Ee8040F61391e2810471f27E3942;\n r_0_1_1[1] = r_0_1_1_1;\n }\n {\n address r_0_1_1_2 = 0xF0fA70aC82D3ce9553f080DEdfC006942A16ECb3;\n r_0_1_1[2] = r_0_1_1_2;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n string memory r_0_1_2 = unicode\"Moo é🚀 o🚀oMo🚀Moé🚀🚀MM MooMé🚀🚀🚀🚀oéoé\";\n r_0_1.s_2 = r_0_1_2;\n }\n {\n int192 r_0_1_3 = -1274066705594859911105920028043902126077249796309245150864;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018069e4238d005717fb39a83c584a253c85708aa091593b0472c33d000000000000000000000000000000000000b1b5d23075adb417e0774021f4115865196a33ea000000000000000000000000615b8d88f8a5e3ea8d3c0f1f7f877cf69c6b6c2d0000000000000000000000002fdc6501ffd5e285c3e70386af0c59a9fbfaaca500000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffd652cae7e59945c3a5b9fc87412a1aad1f772f9f995f107300000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a806f204d20c3a96f4dc3a94d206f4d4d6f4d206ff09f9a80c3a9c3a9c3a96f6f6f4dc3a9f09f9a80f09f9a80c3a94dc3a94df09f9a80204dc3a900000000000000000000000000000000000000000000000000000000008427160f1fcac9cf085ed9a3f2ba2e2d00a29d0eecd3b5b05250000000000000000000000000000000000000d0b8ef0f7e3e94275ff59db6af5f2206a673fce9000000000000000000000000955f332634e0ee8040f61391e2810471f27e3942000000000000000000000000f0fa70ac82d3ce9553f080dedfc006942a16ecb300000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffcc0a1f7892516852cf5489b5ff72db3847edec085f69397000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80206ff09f9a806f4d6ff09f9a804d6fc3a9f09f9a80f09f9a804d4d204d6f6f4dc3a9f09f9a80f09f9a80f09f9a80f09f9a806fc3a96fc3a9000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes32,uint80,(bool,bytes3,int128),uint8,bytes13)", + "type": "(bytes32,uint80,(bool,bytes3,int128),uint8,bytes13)", + "value": [ + "0xf4db03d4d6b9342bc3c16d8366d808906b19f86def6f1d94bca8ca4fcf0e6a4c", + "1124397358595071752727641", + [true, "0x86cac5", "-113034173788378755860950846655611737109"], + "211", + "0x0ff65cfd9d5b4e3e92a99a4e62" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf4db03d4d6b9342bc3c16d8366d808906b19f86def6f1d94bca8ca4fcf0e6a4c" + }, + { + "type": "number", + "value": "1124397358595071752727641" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x86cac5" + }, + { + "type": "number", + "value": "-113034173788378755860950846655611737109" + } + ] + }, + { + "type": "number", + "value": "211" + }, + { + "type": "hexstring", + "value": "0x0ff65cfd9d5b4e3e92a99a4e62" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101f8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6100386100be565b604080518251815260208084015169ffffffffffffffffffff1681830152838301518051151583850152908101516001600160e81b031916606080840191909152920151600f0b6080808301919091529183015160ff1660a082015291015172ffffffffffffffffffffffffffffffffffffff191660c082015260e00160405180910390f35b6100c6610174565b6100ce610174565b7ff4db03d4d6b9342bc3c16d8366d808906b19f86def6f1d94bca8ca4fcf0e6a4c815269ee19b3f449b16a9aec596020820152610124604080516060810182526000808252602082018190529181019190915290565b600181526286cac560e81b60208201526f5509970a7d608629961cbf1fd76b14141960408083019190915282015260d360608201526c07fb2e7eceada71f4954cd273160991b6080820152919050565b6040805160a081018252600080825260208201529081016101ae604080516060810182526000808252602082018190529181019190915290565b81526000602082018190526040909101529056fea2646970667358221220349df7b877a1b5f84a325862ad2cdeed528351e405bf097705aa209985e2c90064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9241f058 {\n bool s_0;\n bytes3 s_1;\n int128 s_2;\n }\n\n struct S_9c106a0e {\n bytes32 s_0;\n uint80 s_1;\n S_9241f058 s_2;\n uint8 s_3;\n bytes13 s_4;\n }\n\n function test () public pure returns (S_9c106a0e memory) {\n S_9c106a0e memory r;\n {\n bytes32 r_0 = bytes32(0xf4db03d4d6b9342bc3c16d8366d808906b19f86def6f1d94bca8ca4fcf0e6a4c);\n r.s_0 = r_0;\n }\n {\n uint80 r_1 = 1124397358595071752727641;\n r.s_1 = r_1;\n }\n {\n S_9241f058 memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n {\n bytes3 r_2_1 = bytes3(0x86cac5);\n r_2.s_1 = r_2_1;\n }\n {\n int128 r_2_2 = -113034173788378755860950846655611737109;\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n uint8 r_3 = 211;\n r.s_3 = r_3;\n }\n {\n bytes13 r_4 = bytes13(0x0ff65cfd9d5b4e3e92a99a4e62);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0xf4db03d4d6b9342bc3c16d8366d808906b19f86def6f1d94bca8ca4fcf0e6a4c00000000000000000000000000000000000000000000ee19b3f449b16a9aec59000000000000000000000000000000000000000000000000000000000000000186cac50000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffaaf668f5829f79d669e340e02894ebeb00000000000000000000000000000000000000000000000000000000000000d30ff65cfd9d5b4e3e92a99a4e6200000000000000000000000000000000000000" + }, + { + "name": "random-(bytes6,(string,(string,bool,address,bool,string)))", + "type": "(bytes6,(string,(string,bool,address,bool,string)))", + "value": [ + "0x1f6c4c36a38f", + [ + "Moo é🚀ooooéoéM 🚀oéM oooé", + ["Moo é🚀é", true, "0x9D6017ff643243d10C35a1004F02bA89D8ff44E2", false, "Moo é🚀🚀"] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x1f6c4c36a38f" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooooéoéM 🚀oéM oooé" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x9D6017ff643243d10C35a1004F02bA89D8ff44E2" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610319806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610213565b60405180910390f35b610056610156565b61005e610156565b651f6c4c36a38f60d01b8152610072610175565b60006040518060600160405280602381526020016102c1602391398252506100cf6040518060a001604052806060815260200160001515815260200160006001600160a01b03168152602001600015158152602001606081525090565b604080518082018252600c81526b4d6f6f20c3a9f09f9a80c3a960a01b602080830191909152908352600183820152739d6017ff643243d10c35a1004f02ba89d8ff44e283830152600060608401528151808301909252600e82526c9adede418753e13f3501e13f3560971b82820152608083019190915282810191909152820152919050565b604080518082019091526000815260208101610170610175565b905290565b6040518060400160405280606081526020016101706040518060a001604052806060815260200160001515815260200160006001600160a01b03168152602001600015158152602001606081525090565b6000815180845260005b818110156101ec576020818501810151868301820152016101d0565b818111156101fe576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835265ffffffffffff60d01b845116818401528084015160408085015280516040606086015261024b60a08601826101c6565b9050828201519150605f19858203016080860152815160a0825261027260a08301826101c6565b90508383015115158483015260018060a01b0360408401511660408301526060830151151560608301526080830151935081810360808301526102b581856101c6565b97965050505050505056fe4d6f6f20c3a9f09f9a806f6f6f6fc3a96fc3a94d20f09f9a806fc3a94d206f6f6fc3a9a264697066735822122004649d352da844e6a07c88c606b528d7b114b5ea3938f64383eefd66feaf182464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_abaa67d9 {\n string s_0;\n bool s_1;\n address s_2;\n bool s_3;\n string s_4;\n }\n\n struct S_eafb422d {\n string s_0;\n S_abaa67d9 s_1;\n }\n\n struct S_a023d82d {\n bytes6 s_0;\n S_eafb422d s_1;\n }\n\n function test () public pure returns (S_a023d82d memory) {\n S_a023d82d memory r;\n {\n bytes6 r_0 = bytes6(0x1f6c4c36a38f);\n r.s_0 = r_0;\n }\n {\n S_eafb422d memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀ooooéoéM 🚀oéM oooé\";\n r_1.s_0 = r_1_0;\n }\n {\n S_abaa67d9 memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀é\";\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bool r_1_1_1 = true;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x9D6017ff643243d10C35a1004F02bA89D8ff44E2;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bool r_1_1_3 = false;\n r_1_1.s_3 = r_1_1_3;\n }\n {\n string memory r_1_1_4 = unicode\"Moo é🚀🚀\";\n r_1_1.s_4 = r_1_1_4;\n }\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000201f6c4c36a38f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806f6f6f6fc3a96fc3a94d20f09f9a806fc3a94d206f6f6fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009d6017ff643243d10c35a1004f02ba89d8ff44e2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a80f09f9a80000000000000000000000000000000000000" + }, + { + "name": "random-(bytes6,uint184,bytes18[4],uint144,int24)[1]", + "type": "(bytes6,uint184,bytes18[4],uint144,int24)[1]", + "value": [ + [ + "0x938a82c9a5ab", + "17270088492792718346187344585004383680559687214840759410", + [ + "0x4b5cd33c28523068278264224eaaec2bbda0", + "0x9726774e21f63aef5b311526d12860cadc26", + "0xb4b0c223a72fc24078562d9ddcd01ffe955f", + "0x43b6b21929e943d41aa59857c61f24f11d36" + ], + "7573823839277259259465427662952716633404520", + "5721690" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x938a82c9a5ab" + }, + { + "type": "number", + "value": "17270088492792718346187344585004383680559687214840759410" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4b5cd33c28523068278264224eaaec2bbda0" + }, + { + "type": "hexstring", + "value": "0x9726774e21f63aef5b311526d12860cadc26" + }, + { + "type": "hexstring", + "value": "0xb4b0c223a72fc24078562d9ddcd01ffe955f" + }, + { + "type": "hexstring", + "value": "0x43b6b21929e943d41aa59857c61f24f11d36" + } + ] + }, + { + "type": "number", + "value": "7573823839277259259465427662952716633404520" + }, + { + "type": "number", + "value": "5721690" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102ae806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101b4565b60405180910390f35b610056610136565b61005e610136565b610066610163565b65938a82c9a5ab60d01b815276b44ee21076883d6a61eb0e0fd4f1e1e4cc9963d8e944726020820152610097610196565b71025ae699e1429183413c1321127557615ded60751b8152714b933ba710fb1d77ad988a93689430656e1360711b602082015271b4b0c223a72fc24078562d9ddcd01ffe955f60701b6040808301919091527121db590c94f4a1ea0d52cc2be30f92788e9b60711b606080840191909152908301919091527156f177c48ecbcde3a5ff5b9ebd43293c74689082015262574e5a60808201528152919050565b60405180602001604052806001905b61014d610163565b8152602001906001900390816101455790505090565b6040805160a08101825260008082526020820152908101610182610196565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b6101008181019082846000805b60018082106101d0575061026d565b835180516001600160d01b03191686526020808201516001600160b81b03168188015260408083015190880190865b600481101561022c5781516dffffffffffffffffffffffffffff19168352918301919083019085016101ff565b505050606082015171ffffffffffffffffffffffffffffffffffff1660c088015260809091015160020b60e0870152948601949390930192506001016101c1565b50505050509291505056fea2646970667358221220ef4c35704b249e6d5b4a04d70edbfa541207c951d26068b9ee3c00476fb392b964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a506a038 {\n bytes6 s_0;\n uint184 s_1;\n bytes18[4] s_2;\n uint144 s_3;\n int24 s_4;\n }\n\n function test () public pure returns (S_a506a038[1] memory) {\n S_a506a038[1] memory r;\n {\n S_a506a038 memory r_0;\n {\n bytes6 r_0_0 = bytes6(0x938a82c9a5ab);\n r_0.s_0 = r_0_0;\n }\n {\n uint184 r_0_1 = 17270088492792718346187344585004383680559687214840759410;\n r_0.s_1 = r_0_1;\n }\n {\n bytes18[4] memory r_0_2;\n {\n bytes18 r_0_2_0 = bytes18(0x4b5cd33c28523068278264224eaaec2bbda0);\n r_0_2[0] = r_0_2_0;\n }\n {\n bytes18 r_0_2_1 = bytes18(0x9726774e21f63aef5b311526d12860cadc26);\n r_0_2[1] = r_0_2_1;\n }\n {\n bytes18 r_0_2_2 = bytes18(0xb4b0c223a72fc24078562d9ddcd01ffe955f);\n r_0_2[2] = r_0_2_2;\n }\n {\n bytes18 r_0_2_3 = bytes18(0x43b6b21929e943d41aa59857c61f24f11d36);\n r_0_2[3] = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n uint144 r_0_3 = 7573823839277259259465427662952716633404520;\n r_0.s_3 = r_0_3;\n }\n {\n int24 r_0_4 = 5721690;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x938a82c9a5ab0000000000000000000000000000000000000000000000000000000000000000000000b44ee21076883d6a61eb0e0fd4f1e1e4cc9963d8e944724b5cd33c28523068278264224eaaec2bbda000000000000000000000000000009726774e21f63aef5b311526d12860cadc260000000000000000000000000000b4b0c223a72fc24078562d9ddcd01ffe955f000000000000000000000000000043b6b21929e943d41aa59857c61f24f11d360000000000000000000000000000000000000000000000000000000056f177c48ecbcde3a5ff5b9ebd43293c74680000000000000000000000000000000000000000000000000000000000574e5a" + }, + { + "name": "random-(int104,uint56[1],string,uint104[3])[3]", + "type": "(int104,uint56[1],string,uint104[3])[3]", + "value": [ + [ + "2589279836675230486275273568934", + ["34377812200731039"], + "Moo é🚀ooM🚀oo", + [ + "9813029604587526615587255616662", + "16968318955088392511890701372805", + "15402542126476461375238041356262" + ] + ], + [ + "-731180393699636484657456037431", + ["3612662620177843"], + "Moo é🚀oM éMM🚀é🚀oo", + [ + "6874896636793593592351130254953", + "542772171424139799892428682802", + "7215407990770200009178488422981" + ] + ], + [ + "-8656102279325418887790468142175", + ["66805701959560511"], + "Moo é🚀MM🚀 o 🚀🚀éM🚀o o🚀 🚀o 🚀M🚀éMMéooooéoM🚀Moo🚀 Mo M", + [ + "10289730038753838620338516719340", + "15162214780193569294131489094472", + "16367028307179440842434718879293" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2589279836675230486275273568934" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "34377812200731039" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooM🚀oo" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "9813029604587526615587255616662" + }, + { + "type": "number", + "value": "16968318955088392511890701372805" + }, + { + "type": "number", + "value": "15402542126476461375238041356262" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-731180393699636484657456037431" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3612662620177843" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oM éMM🚀é🚀oo" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "6874896636793593592351130254953" + }, + { + "type": "number", + "value": "542772171424139799892428682802" + }, + { + "type": "number", + "value": "7215407990770200009178488422981" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-8656102279325418887790468142175" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "66805701959560511" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MM🚀 o 🚀🚀éM🚀o o🚀 🚀o 🚀M🚀éMMéooooéoM🚀Moo🚀 Mo M" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "10289730038753838620338516719340" + }, + { + "type": "number", + "value": "15162214780193569294131489094472" + }, + { + "type": "number", + "value": "16367028307179440842434718879293" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104b6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061033a565b60405180910390f35b610056610263565b61005e610263565b610066610290565b6c20ae6a14d4cf524ed9f174b2a6815261007e6102c6565b667a22702461319f815260208281019190915260408051808201825260138152724d6f6f20c3a9f09f9a806f6f4df09f9a806f6f60681b928101929092528201526100c76102e4565b6c7bdb9bd6ddeb18ac747c5a049681526cd62b98779eb0a2de826e9f4d8560208201526cc2684c3b2643978f3d624dc7e660408201526060820152815261010c610290565b6c093a923ef665ca25b8f6533e361981526101256102c6565b660cd5b2902b45b38152602082810191909152604080518082018252601d81527f4d6f6f20c3a9f09f9a806f4d20c3a94d4df09f9a80c3a9f09f9a806f6f000000928101929092528201526101786102e4565b6c56c5fd36153ebf2a50d8c5fe6981526c06d9ca9e0322e7d588965976326020808301919091526c5b123d9a041db02133bc26c245604083015260608301919091528201526101c5610290565b6c6d415ffc59113a3705a7ee145e1981526101de6102c6565b66ed576e96452d3f815260208281019190915260408051608081019091526058808252600092610429908301396040830152506102196102e4565b6c81dfe9324b503300151d98f6ec81526cbf5fc21c0ae278243bb8033b4860208201526cce94b88034c8ee73b60c224e3d6040808301919091526060830191909152820152919050565b60405180606001604052806003905b61027a610290565b8152602001906001900390816102725790505090565b60405180608001604052806000600c0b81526020016102ad6102c6565b8152602001606081526020016102c16102e4565b905290565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b8060005b60038110156103345781516cffffffffffffffffffffffffff16845260209384019390910190600101610306565b50505050565b60208082526000906080830183820185845b600381101561041c57601f1980888603018452825160c08151600c0b87528782015188880160005b600181101561039a57825166ffffffffffffff168252918a0191908a0190600101610374565b50505060408083015182828a01528051915081838a0152600092505b818310156103d4578083018a015189840160e00152918901916103b6565b50808211156103e757600060e0828a0101525b6060928301519291506103fc88830184610302565b601f019092169590950160e001945050918401919084019060010161034c565b5091969550505050505056fe4d6f6f20c3a9f09f9a804d4df09f9a80206f20f09f9a80f09f9a80c3a94df09f9a806f206ff09f9a8020f09f9a806f20f09f9a804df09f9a80c3a94d4dc3a96f6f6f6fc3a96f4df09f9a804d6f6ff09f9a8020204d6f204da2646970667358221220c637aca75f04dbded7f882c14c6215ef62216c8092647468953b872285b37d9564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c8af67bc {\n int104 s_0;\n uint56[1] s_1;\n string s_2;\n uint104[3] s_3;\n }\n\n function test () public pure returns (S_c8af67bc[3] memory) {\n S_c8af67bc[3] memory r;\n {\n S_c8af67bc memory r_0;\n {\n int104 r_0_0 = 2589279836675230486275273568934;\n r_0.s_0 = r_0_0;\n }\n {\n uint56[1] memory r_0_1;\n {\n uint56 r_0_1_0 = 34377812200731039;\n r_0_1[0] = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀ooM🚀oo\";\n r_0.s_2 = r_0_2;\n }\n {\n uint104[3] memory r_0_3;\n {\n uint104 r_0_3_0 = 9813029604587526615587255616662;\n r_0_3[0] = r_0_3_0;\n }\n {\n uint104 r_0_3_1 = 16968318955088392511890701372805;\n r_0_3[1] = r_0_3_1;\n }\n {\n uint104 r_0_3_2 = 15402542126476461375238041356262;\n r_0_3[2] = r_0_3_2;\n }\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_c8af67bc memory r_1;\n {\n int104 r_1_0 = -731180393699636484657456037431;\n r_1.s_0 = r_1_0;\n }\n {\n uint56[1] memory r_1_1;\n {\n uint56 r_1_1_0 = 3612662620177843;\n r_1_1[0] = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀oM éMM🚀é🚀oo\";\n r_1.s_2 = r_1_2;\n }\n {\n uint104[3] memory r_1_3;\n {\n uint104 r_1_3_0 = 6874896636793593592351130254953;\n r_1_3[0] = r_1_3_0;\n }\n {\n uint104 r_1_3_1 = 542772171424139799892428682802;\n r_1_3[1] = r_1_3_1;\n }\n {\n uint104 r_1_3_2 = 7215407990770200009178488422981;\n r_1_3[2] = r_1_3_2;\n }\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_c8af67bc memory r_2;\n {\n int104 r_2_0 = -8656102279325418887790468142175;\n r_2.s_0 = r_2_0;\n }\n {\n uint56[1] memory r_2_1;\n {\n uint56 r_2_1_0 = 66805701959560511;\n r_2_1[0] = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀MM🚀 o 🚀🚀éM🚀o o🚀 🚀o 🚀M🚀éMMéooooéoM🚀Moo🚀 Mo M\";\n r_2.s_2 = r_2_2;\n }\n {\n uint104[3] memory r_2_3;\n {\n uint104 r_2_3_0 = 10289730038753838620338516719340;\n r_2_3[0] = r_2_3_0;\n }\n {\n uint104 r_2_3_1 = 15162214780193569294131489094472;\n r_2_3[1] = r_2_3_1;\n }\n {\n uint104 r_2_3_2 = 16367028307179440842434718879293;\n r_2_3[2] = r_2_3_2;\n }\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000020ae6a14d4cf524ed9f174b2a6000000000000000000000000000000000000000000000000007a22702461319f00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000007bdb9bd6ddeb18ac747c5a049600000000000000000000000000000000000000d62b98779eb0a2de826e9f4d8500000000000000000000000000000000000000c2684c3b2643978f3d624dc7e600000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806f6f4df09f9a806f6f00000000000000000000000000fffffffffffffffffffffffffffffffffffffff6c56dc1099a35da4709acc1c9000000000000000000000000000000000000000000000000000cd5b2902b45b300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000056c5fd36153ebf2a50d8c5fe690000000000000000000000000000000000000006d9ca9e0322e7d58896597632000000000000000000000000000000000000005b123d9a041db02133bc26c245000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f4d20c3a94d4df09f9a80c3a9f09f9a806f6f000000ffffffffffffffffffffffffffffffffffffff92bea003a6eec5c8fa5811eba100000000000000000000000000000000000000000000000000ed576e96452d3f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000081dfe9324b503300151d98f6ec00000000000000000000000000000000000000bf5fc21c0ae278243bb8033b4800000000000000000000000000000000000000ce94b88034c8ee73b60c224e3d00000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a804d4df09f9a80206f20f09f9a80f09f9a80c3a94df09f9a806f206ff09f9a8020f09f9a806f20f09f9a804df09f9a80c3a94d4dc3a96f6f6f6fc3a96f4df09f9a804d6f6ff09f9a8020204d6f204d0000000000000000" + }, + { + "name": "random-(int232,(bytes6,bool),bool[2],bytes31,string)", + "type": "(int232,(bytes6,bool),bool[2],bytes31,string)", + "value": [ + "-388718591577181893126499119793698939294536183866792025030470513107803", + ["0x2586bad4be18", false], + [true, true], + "0xb87ca8954c25ffcfc1fade9152e65ff0af8496d634765614388c640ff10e1a", + "Moo é🚀🚀oooMMMoMééé🚀 ooM🚀éo🚀 oé " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-388718591577181893126499119793698939294536183866792025030470513107803" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2586bad4be18" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xb87ca8954c25ffcfc1fade9152e65ff0af8496d634765614388c640ff10e1a" + }, + { + "type": "string", + "value": "Moo é🚀🚀oooMMMoMééé🚀 ooM🚀éo🚀 oé " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102bb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101c1565b60405180910390f35b610056610111565b61005e610111565b7ffffffff194e5729528c231154cdb935d0ab8ad11bbd89c391deb598b22e15ca581526040805180820190915260006020808301919091526504b0d75a97c360d31b82528201526100ad610156565b60018082526020808301919091526040838101929092527fb87ca8954c25ffcfc1fade9152e65ff0af8496d634765614388c640ff10e1a00606080850191909152825190810190925260348083526000929161025290830139608083015250919050565b6040805160a08101825260008082528251808401845281815260208082019290925290820152908101610142610156565b815260006020820152606060409091015290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561019a5760208185018101518683018201520161017e565b818111156101ac576000602083870101525b50601f01601f19169290920160200192915050565b600060208083528351601c0b818401528084015165ffffffffffff60d01b815116604085015281810151151560608501525060408401516080840160005b600281101561021e5782511515825291830191908301906001016101ff565b50505050606083015160ff191660c0830152608083015160e080840152610249610100840182610174565b94935050505056fe4d6f6f20c3a9f09f9a80f09f9a806f6f6f4d4d4d6f4dc3a9c3a9c3a9f09f9a80206f6f4df09f9a80c3a96ff09f9a80206fc3a920a26469706673582212200002f1fc246bcea79aa4d574b88fb08dd8ba7fed868536f6cafe22254942c57b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2a1fc9de {\n bytes6 s_0;\n bool s_1;\n }\n\n struct S_6ee9aa29 {\n int232 s_0;\n S_2a1fc9de s_1;\n bool[2] s_2;\n bytes31 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_6ee9aa29 memory) {\n S_6ee9aa29 memory r;\n {\n int232 r_0 = -388718591577181893126499119793698939294536183866792025030470513107803;\n r.s_0 = r_0;\n }\n {\n S_2a1fc9de memory r_1;\n {\n bytes6 r_1_0 = bytes6(0x2586bad4be18);\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n bool[2] memory r_2;\n {\n bool r_2_0 = true;\n r_2[0] = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2[1] = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n bytes31 r_3 = bytes31(0xb87ca8954c25ffcfc1fade9152e65ff0af8496d634765614388c640ff10e1a);\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀🚀oooMMMoMééé🚀 ooM🚀éo🚀 oé \";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020fffffff194e5729528c231154cdb935d0ab8ad11bbd89c391deb598b22e15ca52586bad4be180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001b87ca8954c25ffcfc1fade9152e65ff0af8496d634765614388c640ff10e1a0000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a80f09f9a806f6f6f4d4d4d6f4dc3a9c3a9c3a9f09f9a80206f6f4df09f9a80c3a96ff09f9a80206fc3a920000000000000000000000000" + }, + { + "name": "random-(int40[2][3],int136,string,bool,address)", + "type": "(int40[2][3],int136,string,bool,address)", + "value": [ + [ + ["313244336375", "-442147183760"], + ["302311189667", "-372650219225"], + ["-7137976940", "-177200813992"] + ], + "-43061664135280586696080821243599194567339", + "Moo é🚀éoM MM 🚀oooé🚀éM🚀éM 🚀Moé", + false, + "0x532De0a9F45F1A48A64f182328abD18E3c88f7B4" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "313244336375" + }, + { + "type": "number", + "value": "-442147183760" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "302311189667" + }, + { + "type": "number", + "value": "-372650219225" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-7137976940" + }, + { + "type": "number", + "value": "-177200813992" + } + ] + } + ] + }, + { + "type": "number", + "value": "-43061664135280586696080821243599194567339" + }, + { + "type": "string", + "value": "Moo é🚀éoM MM 🚀oooé🚀éM🚀éM 🚀Moé" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x532De0a9F45F1A48A64f182328abD18E3c88f7B4" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610322806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101fc565b60405180910390f35b61005661012f565b61005e61012f565b610066610164565b61006e610191565b6448eed140f781526466f2069c8f196020820152815261008c610191565b64466326aca381526456c3af16d8196020808301919091528201526100af610191565b6401a974e26b198152642941fdd7a719602080830191909152604080840192909252918352707e8bfed7614a3a7ce12d949025684e32aa198383015280516060810190915260338082526000926102ba908301396040830152506000606082015273532de0a9f45f1a48a64f182328abd18e3c88f7b46080820152919050565b6040518060a00160405280610142610164565b8152600060208201819052606060408301819052820181905260809091015290565b60405180606001604052806003905b61017b610191565b8152602001906001900390816101735790505090565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156101d5576020818501810151868301820152016101b9565b818111156101e7576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516000919082848301815b600381101561025157835182845b600281101561023b57825160040b8252918701919087019060010161021b565b505050928401926040919091019060010161020d565b5050505083015161026760e084018260100b9052565b506040830151610140806101008501526102856101608501836101af565b9150606085015161029b61012086018215159052565b5060808501516001600160a01b03811685830152509094935050505056fe4d6f6f20c3a9f09f9a80c3a96f4d204d4d2020f09f9a806f6f6fc3a9f09f9a80c3a94df09f9a80c3a94d20f09f9a804d6fc3a9a26469706673582212201f98d60e216e2958c5f8e29e91f38c2cc41fb7b6dbbebea439150161d160146564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_cc298b8a {\n int40[2][3] s_0;\n int136 s_1;\n string s_2;\n bool s_3;\n address s_4;\n }\n\n function test () public pure returns (S_cc298b8a memory) {\n S_cc298b8a memory r;\n {\n int40[2][3] memory r_0;\n {\n int40[2] memory r_0_0;\n {\n int40 r_0_0_0 = 313244336375;\n r_0_0[0] = r_0_0_0;\n }\n {\n int40 r_0_0_1 = -442147183760;\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n int40[2] memory r_0_1;\n {\n int40 r_0_1_0 = 302311189667;\n r_0_1[0] = r_0_1_0;\n }\n {\n int40 r_0_1_1 = -372650219225;\n r_0_1[1] = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n {\n int40[2] memory r_0_2;\n {\n int40 r_0_2_0 = -7137976940;\n r_0_2[0] = r_0_2_0;\n }\n {\n int40 r_0_2_1 = -177200813992;\n r_0_2[1] = r_0_2_1;\n }\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n int136 r_1 = -43061664135280586696080821243599194567339;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀éoM MM 🚀oooé🚀éM🚀éM 🚀Moé\";\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x532De0a9F45F1A48A64f182328abD18E3c88f7B4;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000048eed140f7ffffffffffffffffffffffffffffffffffffffffffffffffffffff990df96370000000000000000000000000000000000000000000000000000000466326aca3ffffffffffffffffffffffffffffffffffffffffffffffffffffffa93c50e927fffffffffffffffffffffffffffffffffffffffffffffffffffffffe568b1d94ffffffffffffffffffffffffffffffffffffffffffffffffffffffd6be022858ffffffffffffffffffffffffffffff817401289eb5c5831ed26b6fda97b1cd5500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000532de0a9f45f1a48a64f182328abd18e3c88f7b400000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80c3a96f4d204d4d2020f09f9a806f6f6fc3a9f09f9a80c3a94df09f9a80c3a94d20f09f9a804d6fc3a900000000000000000000000000" + }, + { + "name": "random-(string,bytes13,string,(bytes24,bool,string),address)", + "type": "(string,bytes13,string,(bytes24,bool,string),address)", + "value": [ + "Moo é🚀", + "0x2623f67ec3491d5812ddc5b89e", + "Moo é🚀ééoM o o🚀 o🚀oMoM M", + [ + "0xa9574fb5c55aea146b6747b898ef78c091c9aec2909082b3", + true, + "Moo é🚀o ooéé🚀ooéM 🚀oo" + ], + "0xFD0dE298fe537647Be121A319E440356E69Bb349" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x2623f67ec3491d5812ddc5b89e" + }, + { + "type": "string", + "value": "Moo é🚀ééoM o o🚀 o🚀oMoM M" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa9574fb5c55aea146b6747b898ef78c091c9aec2909082b3" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀o ooéé🚀ooéM 🚀oo" + } + ] + }, + { + "type": "address", + "value": "0xFD0dE298fe537647Be121A319E440356E69Bb349" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610342806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610200565b60405180910390f35b61005661013f565b61005e61013f565b604080518082018252600a8152689adede418753e13f3560b71b6020808301919091529083526c1311fb3f61a48eac096ee2dc4f60991b838201528151606081019092526024808352600092916102e9908301396040838101919091528051606080820183528183018190527fa9574fb5c55aea146b6747b898ef78c091c9aec2909082b3000000000000000082526001602080840191909152835191820190935260238082529193506000929091906102c690830139604083015250606082015273fd0de298fe537647be121a319e440356e69bb3496080820152919050565b6040518060a0016040528060608152602001600072ffffffffffffffffffffffffffffffffffffff19168152602001606081526020016101a66040518060600160405280600067ffffffffffffffff19168152602001600015158152602001606081525090565b8152600060209091015290565b6000815180845260005b818110156101d9576020818501810151868301820152016101bd565b818111156101eb576000602083870101525b50601f01601f19169290920160200192915050565b602081526000825160a0602084015261021c60c08401826101b3565b90506cffffffffffffffffffffffffff60981b60208501511660408401526040840151601f198085840301606086015261025683836101b3565b925060608601519150808584030160808601525067ffffffffffffffff19815116825260208101511515602083015260408101519050606060408301526102a060608301826101b3565b91505060808401516102bd60a08501826001600160a01b03169052565b50939250505056fe4d6f6f20c3a9f09f9a806f206f6fc3a9c3a9f09f9a806f6fc3a94d2020f09f9a806f6f4d6f6f20c3a9f09f9a80c3a9c3a96f4d206f206ff09f9a80206ff09f9a806f4d6f4d204da26469706673582212209dcbc73f2def962de8984879cdda87c90606872411443b7842e3e56cf8e60f0264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fb2af206 {\n bytes24 s_0;\n bool s_1;\n string s_2;\n }\n\n struct S_e8110b30 {\n string s_0;\n bytes13 s_1;\n string s_2;\n S_fb2af206 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_e8110b30 memory) {\n S_e8110b30 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀\";\n r.s_0 = r_0;\n }\n {\n bytes13 r_1 = bytes13(0x2623f67ec3491d5812ddc5b89e);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀ééoM o o🚀 o🚀oMoM M\";\n r.s_2 = r_2;\n }\n {\n S_fb2af206 memory r_3;\n {\n bytes24 r_3_0 = bytes24(0xa9574fb5c55aea146b6747b898ef78c091c9aec2909082b3);\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3.s_1 = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀o ooéé🚀ooéM 🚀oo\";\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xFD0dE298fe537647Be121A319E440356E69Bb349;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a02623f67ec3491d5812ddc5b89e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000fd0de298fe537647be121a319e440356e69bb349000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a80c3a9c3a96f4d206f206ff09f9a80206ff09f9a806f4d6f4d204d00000000000000000000000000000000000000000000000000000000a9574fb5c55aea146b6747b898ef78c091c9aec2909082b300000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806f206f6fc3a9c3a9f09f9a806f6fc3a94d2020f09f9a806f6f0000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,int112,bytes19,bytes1,bool[4])[]", + "type": "(string,int112,bytes19,bytes1,bool[4])[]", + "value": [ + [ + "Moo é🚀Moo🚀 oo🚀 🚀M🚀M🚀🚀oé 🚀ééoMé🚀MéoM 🚀🚀éé🚀 é🚀oMoMo éM", + "-529008550519665022624762648309803", + "0x6ce3eac6ce9558c109fca997372a20214dd5a3", + "0x02", + [true, true, true, true] + ], + [ + "Moo é🚀éoo🚀é oo oéooo é", + "-2064952730313589115723510712138432", + "0x845064f01d6271d9e83d0f092ba7bd01a965e2", + "0x4b", + [false, false, true, true] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Moo🚀 oo🚀 🚀M🚀M🚀🚀oé 🚀ééoMé🚀MéoM 🚀🚀éé🚀 é🚀oMoMo éM" + }, + { + "type": "number", + "value": "-529008550519665022624762648309803" + }, + { + "type": "hexstring", + "value": "0x6ce3eac6ce9558c109fca997372a20214dd5a3" + }, + { + "type": "hexstring", + "value": "0x02" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoo🚀é oo oéooo é" + }, + { + "type": "number", + "value": "-2064952730313589115723510712138432" + }, + { + "type": "hexstring", + "value": "0x845064f01d6271d9e83d0f092ba7bd01a965e2" + }, + { + "type": "hexstring", + "value": "0x4b" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610439806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061025a565b60405180910390f35b604080516002808252606082810190935260009190816020015b6100706101dc565b81526020019060019003908161006857905050905061008d6101dc565b60006040518060a001604052806066815260200161037d606691398252506d1a1506d0dd596d5a2f6b9bebb02a196020820152726ce3eac6ce9558c109fca997372a20214dd5a360681b6040820152600160f91b60608201526100ee610211565b600180825260208201819052604082018190526060820152608082015281518190839060009061012057610120610366565b6020026020010181905250506101346101dc565b60006040518060600160405280602181526020016103e3602191398252506d65cf5e205a955d0464f0a8dc7abf19602082015272422832780eb138ecf41e878495d3de80d4b2f160691b6040820152604b60f81b6060820152610195610211565b6000808252602082015260016040820181905260608201819052608083019190915282518291849181106101cb576101cb610366565b602090810291909101015250919050565b6040805160a08101825260608082526000602083018190529282018390528101919091526080810161020c610211565b905290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156102545781511515845260209384019390910190600101610233565b50505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561035757603f198a850301865282516101008151818752805180838901528592505b808310156102c7578183018c01518884016101200152918b01916102a8565b808311156102d95785610120828a0101525b8b84015192506102ed8c890184600d0b9052565b8a8401516cffffffffffffffffffffffffff1916888c01526060808501516001600160f81b03198116828b015290935091506080938401519392506103348884018561022f565b988b0198601f01601f191696909601610120019550505091870191600101610282565b50919998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d6f6ff09f9a80206f6ff09f9a8020f09f9a804df09f9a804df09f9a80f09f9a806fc3a920f09f9a80c3a9c3a96f4dc3a9f09f9a804dc3a96f4d20f09f9a80f09f9a80c3a9c3a9f09f9a802020c3a9f09f9a806f4d6f4d6f20c3a94d4d6f6f20c3a9f09f9a80c3a96f6ff09f9a80c3a9206f6f206fc3a96f6f6f20c3a9a2646970667358221220ef38c6dd6d6a6c65e316af558d9b337852e10b86a0876f2f247bbffdd0dcaaae64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0fcf2e63 {\n string s_0;\n int112 s_1;\n bytes19 s_2;\n bytes1 s_3;\n bool[4] s_4;\n }\n\n function test () public pure returns (S_0fcf2e63[] memory) {\n S_0fcf2e63[] memory r = new S_0fcf2e63[](2);\n {\n S_0fcf2e63 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀Moo🚀 oo🚀 🚀M🚀M🚀🚀oé 🚀ééoMé🚀MéoM 🚀🚀éé🚀 é🚀oMoMo éM\";\n r_0.s_0 = r_0_0;\n }\n {\n int112 r_0_1 = -529008550519665022624762648309803;\n r_0.s_1 = r_0_1;\n }\n {\n bytes19 r_0_2 = bytes19(0x6ce3eac6ce9558c109fca997372a20214dd5a3);\n r_0.s_2 = r_0_2;\n }\n {\n bytes1 r_0_3 = bytes1(0x02);\n r_0.s_3 = r_0_3;\n }\n {\n bool[4] memory r_0_4;\n {\n bool r_0_4_0 = true;\n r_0_4[0] = r_0_4_0;\n }\n {\n bool r_0_4_1 = true;\n r_0_4[1] = r_0_4_1;\n }\n {\n bool r_0_4_2 = true;\n r_0_4[2] = r_0_4_2;\n }\n {\n bool r_0_4_3 = true;\n r_0_4[3] = r_0_4_3;\n }\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_0fcf2e63 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀éoo🚀é oo oéooo é\";\n r_1.s_0 = r_1_0;\n }\n {\n int112 r_1_1 = -2064952730313589115723510712138432;\n r_1.s_1 = r_1_1;\n }\n {\n bytes19 r_1_2 = bytes19(0x845064f01d6271d9e83d0f092ba7bd01a965e2);\n r_1.s_2 = r_1_2;\n }\n {\n bytes1 r_1_3 = bytes1(0x4b);\n r_1.s_3 = r_1_3;\n }\n {\n bool[4] memory r_1_4;\n {\n bool r_1_4_0 = false;\n r_1_4[0] = r_1_4_0;\n }\n {\n bool r_1_4_1 = false;\n r_1_4[1] = r_1_4_1;\n }\n {\n bool r_1_4_2 = true;\n r_1_4[2] = r_1_4_2;\n }\n {\n bool r_1_4_3 = true;\n r_1_4[3] = r_1_4_3;\n }\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000100ffffffffffffffffffffffffffffffffffffe5eaf92f22a692a5d09464144fd56ce3eac6ce9558c109fca997372a20214dd5a3000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a804d6f6ff09f9a80206f6ff09f9a8020f09f9a804df09f9a804df09f9a80f09f9a806fc3a920f09f9a80c3a9c3a96f4dc3a9f09f9a804dc3a96f4d20f09f9a80f09f9a80c3a9c3a9f09f9a802020c3a9f09f9a806f4d6f4d6f20c3a94d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100ffffffffffffffffffffffffffffffffffff9a30a1dfa56aa2fb9b0f57238540845064f01d6271d9e83d0f092ba7bd01a965e2000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80c3a96f6ff09f9a80c3a9206f6f206fc3a96f6f6f20c3a900000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,string,uint96,bytes30[2],((string,int256)))", + "type": "(string,string,uint96,bytes30[2],((string,int256)))", + "value": [ + "Moo é🚀oM🚀ooé🚀 oo MoM🚀ooo o M o🚀🚀oéM🚀🚀ooooMoooéé MM🚀oé🚀M MMo", + "Moo é🚀", + "9912946544265705875702982721", + [ + "0x035a9eb2fe19f4f2aed068308447f529273972ff4ea36570329b76bd3607", + "0x73e40bafe6e1d5cee98cafe1d27624153d2d5643f892f87499afad3061f5" + ], + [ + [ + "Moo é🚀🚀ooooo🚀 MéMM🚀éM🚀é🚀é", + "38287460701774510094563660343528723795651984025351312338329046862811635586873" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM🚀ooé🚀 oo MoM🚀ooo o M o🚀🚀oéM🚀🚀ooooMoooéé MM🚀oé🚀M MMo" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "9912946544265705875702982721" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x035a9eb2fe19f4f2aed068308447f529273972ff4ea36570329b76bd3607" + }, + { + "type": "hexstring", + "value": "0x73e40bafe6e1d5cee98cafe1d27624153d2d5643f892f87499afad3061f5" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ooooo🚀 MéMM🚀éM🚀é🚀é" + }, + { + "type": "number", + "value": "38287460701774510094563660343528723795651984025351312338329046862811635586873" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103f8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610286565b60405180910390f35b610056610176565b61005e610176565b60006040518060a001604052806061815260200161033260619139825250604080518082018252600a8152689adede418753e13f3560b71b6020808301919091528301526b2007cc14f386edbc27c2a841908201526100bb6101be565b7f035a9eb2fe19f4f2aed068308447f529273972ff4ea36570329b76bd3607000081527f73e40bafe6e1d5cee98cafe1d27624153d2d5643f892f87499afad3061f50000602082015260608201526101116101dc565b6040805180820190915260608152600060208201526000604051806060016040528060308152602001610393603091398252507f54a5ef4f4ad0dca8ec91f4fb7aa9fcf5afffd377a8b1732e7804823b377b1739602082015281526080820152919050565b6040518060a00160405280606081526020016060815260200160006bffffffffffffffffffffffff1681526020016101ac6101be565b81526020016101b96101dc565b905290565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806101b9604051806040016040528060608152602001600081525090565b6000815180845260005b8181101561022a5760208185018101518683018201520161020e565b8181111561023c576000602083870101525b50601f01601f19169290920160200192915050565b600081516020845280516040602086015261026f6060860182610204565b905060208201516040860152809250505092915050565b60006020808352835160c0828501526102a260e0850182610204565b905081850151601f19808684030160408701526102bf8383610204565b92506bffffffffffffffffffffffff6040880151166060870152606087015191506080860160005b600281101561030957835161ffff1916825292850192908501906001016102e7565b505060808701519350808684030160c087015250506103288183610251565b9594505050505056fe4d6f6f20c3a9f09f9a806f4df09f9a806f6fc3a9f09f9a80206f6f204d6f4df09f9a806f6f6f206f204d20206ff09f9a80f09f9a806fc3a94df09f9a80f09f9a806f6f6f6f4d6f6f6fc3a9c3a920204d4df09f9a806fc3a9f09f9a804d204d4d6f4d6f6f20c3a9f09f9a80f09f9a806f6f6f6f6ff09f9a80204dc3a94d4df09f9a80c3a94df09f9a80c3a9f09f9a80c3a9a26469706673582212200953ab1fc34d65e1c9349c416c6c65af4877b4da376747edb1594b95ab771f9164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9b2d018b {\n string s_0;\n int256 s_1;\n }\n\n struct S_6e5cb10c {\n S_9b2d018b s_0;\n }\n\n struct S_76cbb50b {\n string s_0;\n string s_1;\n uint96 s_2;\n bytes30[2] s_3;\n S_6e5cb10c s_4;\n }\n\n function test () public pure returns (S_76cbb50b memory) {\n S_76cbb50b memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oM🚀ooé🚀 oo MoM🚀ooo o M o🚀🚀oéM🚀🚀ooooMoooéé MM🚀oé🚀M MMo\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n uint96 r_2 = 9912946544265705875702982721;\n r.s_2 = r_2;\n }\n {\n bytes30[2] memory r_3;\n {\n bytes30 r_3_0 = bytes30(0x035a9eb2fe19f4f2aed068308447f529273972ff4ea36570329b76bd3607);\n r_3[0] = r_3_0;\n }\n {\n bytes30 r_3_1 = bytes30(0x73e40bafe6e1d5cee98cafe1d27624153d2d5643f892f87499afad3061f5);\n r_3[1] = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n S_6e5cb10c memory r_4;\n {\n S_9b2d018b memory r_4_0;\n {\n string memory r_4_0_0 = unicode\"Moo é🚀🚀ooooo🚀 MéMM🚀éM🚀é🚀é\";\n r_4_0.s_0 = r_4_0_0;\n }\n {\n int256 r_4_0_1 = 38287460701774510094563660343528723795651984025351312338329046862811635586873;\n r_4_0.s_1 = r_4_0_1;\n }\n r_4.s_0 = r_4_0;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000002007cc14f386edbc27c2a841035a9eb2fe19f4f2aed068308447f529273972ff4ea36570329b76bd3607000073e40bafe6e1d5cee98cafe1d27624153d2d5643f892f87499afad3061f5000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a806f4df09f9a806f6fc3a9f09f9a80206f6f204d6f4df09f9a806f6f6f206f204d20206ff09f9a80f09f9a806fc3a94df09f9a80f09f9a806f6f6f6f4d6f6f6fc3a9c3a920204d4df09f9a806fc3a9f09f9a804d204d4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004054a5ef4f4ad0dca8ec91f4fb7aa9fcf5afffd377a8b1732e7804823b377b173900000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80f09f9a806f6f6f6f6ff09f9a80204dc3a94d4df09f9a80c3a94df09f9a80c3a9f09f9a80c3a900000000000000000000000000000000" + }, + { + "name": "random-(string,uint200,bytes29,(bool[4],int32[3]))", + "type": "(string,uint200,bytes29,(bool[4],int32[3]))", + "value": [ + "Moo é🚀o 🚀M ooé🚀🚀éoooMooéMé🚀oo🚀 oo éééMéé🚀éoéM é", + "210401685285126508950366606020216005780808848621337723208274", + "0xc78d03b2e3644dfedb5920f2e65f6dc7033d750aa615228887dbd4af22", + [ + [false, true, true, true], + ["-722924620", "1766681642", "-165743615"] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀M ooé🚀🚀éoooMooéMé🚀oo🚀 oo éééMéé🚀éoéM é" + }, + { + "type": "number", + "value": "210401685285126508950366606020216005780808848621337723208274" + }, + { + "type": "hexstring", + "value": "0xc78d03b2e3644dfedb5920f2e65f6dc7033d750aa615228887dbd4af22" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-722924620" + }, + { + "type": "number", + "value": "1766681642" + }, + { + "type": "number", + "value": "-165743615" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610345806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061021e565b60405180910390f35b610056610122565b61005e610122565b60006040518060800160405280605281526020016102be60529139825250782184d8175fbf279f15c60a2aee1742200b044fea67cfef025260208201527fc78d03b2e3644dfedb5920f2e65f6dc7033d750aa615228887dbd4af2200000060408201526100c961015e565b6100d161017e565b6000815260016020820181905260408201819052606082015281526100f461019c565b632b16f44b19815263694d6c2a6020808301919091526309e10bfe1960408301528201526060820152919050565b60405180608001604052806060815260200160006001600160c81b03168152602001600062ffffff1916815260200161015961015e565b905290565b604051806040016040528061017161017e565b815260200161015961019c565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b80518260005b60048110156101e157825115158252602092830192909101906001016101c0565b5050506020808201516080840160005b60038082106102005750610216565b8351900b825291830191908301906001016101f1565b505050505050565b6000602080835283516101408285015280518061016086015260005b81811015610257578281018401518682016101800152830161023a565b8181111561026a57600061018083880101525b50918501516001600160c81b038116604086015291604086015162ffffff19811660608701529250606086015192506102a660808601846101ba565b601f01601f1916939093016101800194935050505056fe4d6f6f20c3a9f09f9a806f2020f09f9a804d206f6fc3a9f09f9a80f09f9a80c3a96f6f6f4d6f6fc3a94dc3a9f09f9a806f6ff09f9a80206f6f20c3a9c3a9c3a94dc3a9c3a9f09f9a80c3a96fc3a94d20c3a9a2646970667358221220011eaacf61f09824fa885ae93c11bbe7266c3b23607288f9d5f225844d53c09c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0a28a628 {\n bool[4] s_0;\n int32[3] s_1;\n }\n\n struct S_71df7a37 {\n string s_0;\n uint200 s_1;\n bytes29 s_2;\n S_0a28a628 s_3;\n }\n\n function test () public pure returns (S_71df7a37 memory) {\n S_71df7a37 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o 🚀M ooé🚀🚀éoooMooéMé🚀oo🚀 oo éééMéé🚀éoéM é\";\n r.s_0 = r_0;\n }\n {\n uint200 r_1 = 210401685285126508950366606020216005780808848621337723208274;\n r.s_1 = r_1;\n }\n {\n bytes29 r_2 = bytes29(0xc78d03b2e3644dfedb5920f2e65f6dc7033d750aa615228887dbd4af22);\n r.s_2 = r_2;\n }\n {\n S_0a28a628 memory r_3;\n {\n bool[4] memory r_3_0;\n {\n bool r_3_0_0 = false;\n r_3_0[0] = r_3_0_0;\n }\n {\n bool r_3_0_1 = true;\n r_3_0[1] = r_3_0_1;\n }\n {\n bool r_3_0_2 = true;\n r_3_0[2] = r_3_0_2;\n }\n {\n bool r_3_0_3 = true;\n r_3_0[3] = r_3_0_3;\n }\n r_3.s_0 = r_3_0;\n }\n {\n int32[3] memory r_3_1;\n {\n int32 r_3_1_0 = -722924620;\n r_3_1[0] = r_3_1_0;\n }\n {\n int32 r_3_1_1 = 1766681642;\n r_3_1[1] = r_3_1_1;\n }\n {\n int32 r_3_1_2 = -165743615;\n r_3_1[2] = r_3_1_2;\n }\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000140000000000000002184d8175fbf279f15c60a2aee1742200b044fea67cfef0252c78d03b2e3644dfedb5920f2e65f6dc7033d750aa615228887dbd4af220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd4e90bb400000000000000000000000000000000000000000000000000000000694d6c2afffffffffffffffffffffffffffffffffffffffffffffffffffffffff61ef40100000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a806f2020f09f9a804d206f6fc3a9f09f9a80f09f9a80c3a96f6f6f4d6f6fc3a94dc3a9f09f9a806f6ff09f9a80206f6f20c3a9c3a9c3a94dc3a9c3a9f09f9a80c3a96fc3a94d20c3a90000000000000000000000000000" + }, + { + "name": "random-(string[2],address[2],string,string)[]", + "type": "(string[2],address[2],string,string)[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061029d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610182565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b604051806080016040528061009d6100be565b81526020016100aa6100e5565b815260200160608152602001606081525090565b60405180604001604052806002905b60608152602001906001900390816100cd5790505090565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156101295760208185018101518683018201520161010d565b8181111561013b576000602083870101525b50601f01601f19169290920160200192915050565b8060005b600281101561017c5781516001600160a01b0316845260209384019390910190600101610154565b50505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561025857898403603f190186528251805160a080875286019060e0870190855b60028110156101fd57609f198984030184526101eb838351610103565b938d01939250908c01906001016101ce565b50508a83015191506102118b880183610150565b89830151915060608782038189015261022a8284610103565b930151878403608089015292915061024490508183610103565b978a019795505050918701916001016101aa565b5091999850505050505050505056fea2646970667358221220f926a24a4995a2a923fb1734524302b9e03e7636030c2972fd6735de5ba2500664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_382a40a6 {\n string[2] s_0;\n address[2] s_1;\n string s_2;\n string s_3;\n }\n\n function test () public pure returns (S_382a40a6[] memory) {\n S_382a40a6[] memory r = new S_382a40a6[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint104,address[3],address[1],uint208,address)", + "type": "(uint104,address[3],address[1],uint208,address)", + "value": [ + "10149042650981933076777309965975", + [ + "0x9bd09eCDF161EDDd7077559DD354d8Eb7153524A", + "0x37804F3B4194b34859167d18cE91A3364e6a9252", + "0x1AB13436304bA1F211BcF67aa26C0E6DB9e5827f" + ], + ["0xffbD90aEDE83E28D747e37AE6c070E834364fC38"], + "35062305038665610026834406591896702568625265675902613988727584", + "0x2e76f54B21c8692C77237202012656c88722E48d" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "10149042650981933076777309965975" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9bd09eCDF161EDDd7077559DD354d8Eb7153524A" + }, + { + "type": "address", + "value": "0x37804F3B4194b34859167d18cE91A3364e6a9252" + }, + { + "type": "address", + "value": "0x1AB13436304bA1F211BcF67aa26C0E6DB9e5827f" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xffbD90aEDE83E28D747e37AE6c070E834364fC38" + } + ] + }, + { + "type": "number", + "value": "35062305038665610026834406591896702568625265675902613988727584" + }, + { + "type": "address", + "value": "0x2e76f54B21c8692C77237202012656c88722E48d" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102a6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101e3565b60405180910390f35b61005661012b565b61005e61012b565b6c801953511e21fbd8d04a2e0e978152610076610175565b739bd09ecdf161eddd7077559dd354d8eb7153524a81527337804f3b4194b34859167d18ce91a3364e6a9252602080830191909152731ab13436304ba1f211bcf67aa26c0e6db9e5827f60408301528201526100d0610193565b73ffbd90aede83e28d747e37ae6c070e834364fc38815260408201527915d1bf5929d54de5350007ec5db913882671c1d5587cdcb25b206060820152732e76f54b21c8692c77237202012656c88722e48d6080820152919050565b6040518060a0016040528060006cffffffffffffffffffffffffff168152602001610154610175565b8152602001610161610193565b815260006020820181905260409091015290565b60405180606001604052806003906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b8060005b60018110156101dd5781516001600160a01b03168452602093840193909101906001016101b5565b50505050565b81516cffffffffffffffffffffffffff16815260208083015160e08301919081840160005b600381101561022e5782516001600160a01b031682529183019190830190600101610208565b50505050604083015161024460808401826101b1565b5060608301516001600160d01b031660a08301526080909201516001600160a01b031660c0909101529056fea2646970667358221220f684d27447bc4d53f67308712c84d6071f222112f28d54685b11027afc09598664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1c1ed6e2 {\n uint104 s_0;\n address[3] s_1;\n address[1] s_2;\n uint208 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_1c1ed6e2 memory) {\n S_1c1ed6e2 memory r;\n {\n uint104 r_0 = 10149042650981933076777309965975;\n r.s_0 = r_0;\n }\n {\n address[3] memory r_1;\n {\n address r_1_0 = 0x9bd09eCDF161EDDd7077559DD354d8Eb7153524A;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0x37804F3B4194b34859167d18cE91A3364e6a9252;\n r_1[1] = r_1_1;\n }\n {\n address r_1_2 = 0x1AB13436304bA1F211BcF67aa26C0E6DB9e5827f;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n address[1] memory r_2;\n {\n address r_2_0 = 0xffbD90aEDE83E28D747e37AE6c070E834364fC38;\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n uint208 r_3 = 35062305038665610026834406591896702568625265675902613988727584;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x2e76f54B21c8692C77237202012656c88722E48d;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000801953511e21fbd8d04a2e0e970000000000000000000000009bd09ecdf161eddd7077559dd354d8eb7153524a00000000000000000000000037804f3b4194b34859167d18ce91a3364e6a92520000000000000000000000001ab13436304ba1f211bcf67aa26c0e6db9e5827f000000000000000000000000ffbd90aede83e28d747e37ae6c070e834364fc3800000000000015d1bf5929d54de5350007ec5db913882671c1d5587cdcb25b200000000000000000000000002e76f54b21c8692c77237202012656c88722e48d" + }, + { + "name": "random-(uint112,bytes20,((string[3])[]),address,string)", + "type": "(uint112,bytes20,((string[3])[]),address,string)", + "value": [ + "150545402797194471280812696349010", + "0xd1296ce4aaae6f47b69fbce7537c21b69dc134d3", + [ + [ + [ + [ + "Moo é🚀ooo🚀oé", + "Moo é🚀oM🚀M ooé oéo🚀MoMMé🚀🚀M🚀 MéMéoé🚀🚀éoMMM🚀 Mé ", + "Moo é🚀oM o🚀🚀M🚀ooMMé oéoo🚀o o" + ] + ], + [["Moo é🚀🚀M", "Moo é🚀oo 🚀o", "Moo é🚀oM o"]], + [ + [ + "Moo é🚀é🚀", + "Moo é🚀🚀🚀🚀 🚀o oééooo 🚀éoéé o oM 🚀o é", + "Moo é🚀 o 🚀 o🚀 ooéMoéo🚀oooo🚀éé🚀 oo " + ] + ] + ] + ], + "0x4a9A1F53de057578C1A32c3252358372F4c1A05C", + "Moo é🚀ooooéMooéoéé ooo MMo 🚀o🚀oooé" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "150545402797194471280812696349010" + }, + { + "type": "hexstring", + "value": "0xd1296ce4aaae6f47b69fbce7537c21b69dc134d3" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo🚀oé" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀M ooé oéo🚀MoMMé🚀🚀M🚀 MéMéoé🚀🚀éoMMM🚀 Mé " + }, + { + "type": "string", + "value": "Moo é🚀oM o🚀🚀M🚀ooMMé oéoo🚀o o" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀M" + }, + { + "type": "string", + "value": "Moo é🚀oo 🚀o" + }, + { + "type": "string", + "value": "Moo é🚀oM o" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀 🚀o oééooo 🚀éoéé o oM 🚀o é" + }, + { + "type": "string", + "value": "Moo é🚀 o 🚀 o🚀 ooéMoéo🚀oooo🚀éé🚀 oo " + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x4a9A1F53de057578C1A32c3252358372F4c1A05C" + }, + { + "type": "string", + "value": "Moo é🚀ooooéMooéoéé ooo MMo 🚀o🚀oooé" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610698806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061040c565b60405180910390f35b6040805160a08101825260008082526020808301829052835190810184526060808252938301528282015260808101919091526040805160a08101825260008082526020808301829052835190810184526060808252938301528282015260808101919091526d076c266e80b92dd8fea422212952815273d1296ce4aaae6f47b69fbce7537c21b69dc134d360601b602080830191909152604080519182018152606082528051600380825260808201909252600091816020015b610111610380565b81526020019060019003908161010957905050905061012e610380565b610136610398565b60408051808201825260148152734d6f6f20c3a9f09f9a806f6f6ff09f9a806fc3a960601b6020808301919091529083528151608081019092526054808352600092916105639083013990508082600160200201819052505060006040518060600160405280602e8152602001610535602e913960408301525081528151819083906000906101c7576101c761051e565b6020026020010181905250506101db610380565b6101e3610398565b604080518082018252600f81526e4d6f6f20c3a9f09f9a80f09f9a804d60881b6020808301919091529083528151808301835260128152714d6f6f20c3a9f09f9a806f6f20f09f9a806f60701b818301528382015281518083018352600e81526d4d6f6f20c3a9f09f9a806f4d206f60901b9181019190915290820152815281518190839060019081106102795761027961051e565b60200260200101819052505061028d610380565b610295610398565b604080518082018252601081526e9adede418753e13f35018753e13f3560871b6020808301919091529083528151608081019092526042808352600092916105e890830139905080826001602002018190525050600060405180606001604052806039815260200161062a60399139604083015250815281518190839060029081106103235761032361051e565b60209081029190910181019190915291835250604080840192909252734a9a1f53de057578c1a32c3252358372f4c1a05c60608085019190915282519081019092526031808352600092916105b790830139608083015250919050565b6040518060200160405280610393610398565b905290565b60405180606001604052806003905b60608152602001906001900390816103a75790505090565b6000815180845260005b818110156103e5576020818501810151868301820152016103c9565b818111156103f7576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516dffffffffffffffffffffffffffff1682820152828101516bffffffffffffffffffffffff191660408084019190915283015160a060608401525160c08301829052805160e0840181905260009291820190610100600582901b86018101919086019085805b828110156104dd5788850360ff1901845285515187865260808601888701845b60038110156104c857601f198984030182526104b68385516103bf565b938b01939250908a0190600101610499565b50509688019695505092860192600101610479565b5050505060608601516001600160a01b038116608087015292506080860151858203601f190160a0870152925061051481846103bf565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d206ff09f9a80f09f9a804df09f9a806f6f4d4dc3a9206fc3a96f6ff09f9a806f206f4d6f6f20c3a9f09f9a806f4df09f9a804d206f6fc3a920206fc3a96ff09f9a804d6f4d4dc3a9f09f9a80f09f9a804df09f9a80204dc3a94dc3a96fc3a9f09f9a80f09f9a80c3a96f4d4d4df09f9a80204dc3a9204d6f6f20c3a9f09f9a806f6f6f6fc3a94d6f6fc3a96fc3a9c3a9206f6f6f204d4d6f20f09f9a806ff09f9a806f6f6fc3a94d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a802020f09f9a806f2020206fc3a9c3a96f6f6f20f09f9a80c3a96fc3a9c3a9206f206f4d20f09f9a806f20c3a94d6f6f20c3a9f09f9a80206f20f09f9a80206ff09f9a80206f6fc3a94d6fc3a96ff09f9a806f6f6f6ff09f9a80c3a9c3a9f09f9a80206f6f20a264697066735822122015020706c628110d36357ebbec1e71ca3d8738b8f68d0f167517322340aa9cc964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e9182f36 {\n string[3] s_0;\n }\n\n struct S_668321bc {\n S_e9182f36[] s_0;\n }\n\n struct S_499e6899 {\n uint112 s_0;\n bytes20 s_1;\n S_668321bc s_2;\n address s_3;\n string s_4;\n }\n\n function test () public pure returns (S_499e6899 memory) {\n S_499e6899 memory r;\n {\n uint112 r_0 = 150545402797194471280812696349010;\n r.s_0 = r_0;\n }\n {\n bytes20 r_1 = bytes20(0xd1296CE4aAAE6F47b69fBce7537c21b69dc134D3);\n r.s_1 = r_1;\n }\n {\n S_668321bc memory r_2;\n {\n S_e9182f36[] memory r_2_0 = new S_e9182f36[](3);\n {\n S_e9182f36 memory r_2_0_0;\n {\n string[3] memory r_2_0_0_0;\n {\n string memory r_2_0_0_0_0 = unicode\"Moo é🚀ooo🚀oé\";\n r_2_0_0_0[0] = r_2_0_0_0_0;\n }\n {\n string memory r_2_0_0_0_1 = unicode\"Moo é🚀oM🚀M ooé oéo🚀MoMMé🚀🚀M🚀 MéMéoé🚀🚀éoMMM🚀 Mé \";\n r_2_0_0_0[1] = r_2_0_0_0_1;\n }\n {\n string memory r_2_0_0_0_2 = unicode\"Moo é🚀oM o🚀🚀M🚀ooMMé oéoo🚀o o\";\n r_2_0_0_0[2] = r_2_0_0_0_2;\n }\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n S_e9182f36 memory r_2_0_1;\n {\n string[3] memory r_2_0_1_0;\n {\n string memory r_2_0_1_0_0 = unicode\"Moo é🚀🚀M\";\n r_2_0_1_0[0] = r_2_0_1_0_0;\n }\n {\n string memory r_2_0_1_0_1 = unicode\"Moo é🚀oo 🚀o\";\n r_2_0_1_0[1] = r_2_0_1_0_1;\n }\n {\n string memory r_2_0_1_0_2 = unicode\"Moo é🚀oM o\";\n r_2_0_1_0[2] = r_2_0_1_0_2;\n }\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n r_2_0[1] = r_2_0_1;\n }\n {\n S_e9182f36 memory r_2_0_2;\n {\n string[3] memory r_2_0_2_0;\n {\n string memory r_2_0_2_0_0 = unicode\"Moo é🚀é🚀\";\n r_2_0_2_0[0] = r_2_0_2_0_0;\n }\n {\n string memory r_2_0_2_0_1 = unicode\"Moo é🚀🚀🚀🚀 🚀o oééooo 🚀éoéé o oM 🚀o é\";\n r_2_0_2_0[1] = r_2_0_2_0_1;\n }\n {\n string memory r_2_0_2_0_2 = unicode\"Moo é🚀 o 🚀 o🚀 ooéMoéo🚀oooo🚀éé🚀 oo \";\n r_2_0_2_0[2] = r_2_0_2_0_2;\n }\n r_2_0_2.s_0 = r_2_0_2_0;\n }\n r_2_0[2] = r_2_0_2;\n }\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x4a9A1F53de057578C1A32c3252358372F4c1A05C;\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀ooooéMooéoéé ooo MMo 🚀o🚀oooé\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000076c266e80b92dd8fea422212952d1296ce4aaae6f47b69fbce7537c21b69dc134d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000004a9a1f53de057578c1a32c3252358372f4c1a05c00000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806f6f6ff09f9a806fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a806f4df09f9a804d206f6fc3a920206fc3a96ff09f9a804d6f4d4dc3a9f09f9a80f09f9a804df09f9a80204dc3a94dc3a96fc3a9f09f9a80f09f9a80c3a96f4d4d4df09f9a80204dc3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a806f4d206ff09f9a80f09f9a804df09f9a806f6f4d4dc3a9206fc3a96f6ff09f9a806f206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a806f6f20f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a806f4d206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a802020f09f9a806f2020206fc3a9c3a96f6f6f20f09f9a80c3a96fc3a9c3a9206f206f4d20f09f9a806f20c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80206f20f09f9a80206ff09f9a80206f6fc3a94d6fc3a96ff09f9a806f6f6f6ff09f9a80c3a9c3a9f09f9a80206f6f200000000000000000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806f6f6f6fc3a94d6f6fc3a96fc3a9c3a9206f6f6f204d4d6f20f09f9a806ff09f9a806f6f6fc3a9000000000000000000000000000000" + }, + { + "name": "random-(uint24,uint208,address,(int112,bytes15,bool),string)", + "type": "(uint24,uint208,address,(int112,bytes15,bool),string)", + "value": [ + "12524572", + "139333957479695069850148263573300471095519134905621125637770007", + "0x229CA9f98282C77F37459FF9aBbC72222bAe8623", + ["-1783647021687525461437659481437058", "0xd12df13559bc4c09bee6338c1f3558", false], + "Moo é🚀o🚀ooééMMM o oM🚀🚀o🚀 🚀M🚀oo🚀🚀ooéMo M o🚀 éo 🚀🚀é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "12524572" + }, + { + "type": "number", + "value": "139333957479695069850148263573300471095519134905621125637770007" + }, + { + "type": "address", + "value": "0x229CA9f98282C77F37459FF9aBbC72222bAe8623" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1783647021687525461437659481437058" + }, + { + "type": "hexstring", + "value": "0xd12df13559bc4c09bee6338c1f3558" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀ooééMMM o oM🚀🚀o🚀 🚀M🚀oo🚀🚀ooéMo M o🚀 éo 🚀🚀é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102c4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061019d565b60405180910390f35b610056610107565b61005e610107565b62bf1c1c81527956b52e1875372b9094b27860112487049fdbd51b7b6022728b1760208083019190915273229ca9f98282c77f37459ff9abbc72222bae862360408084019190915280516060808201835260008284018190526d57f0ca5bfa55bcc7537a47d4f3811983526e1a25be26ab37898137dcc67183e6ab608b1b8386015281860192909252825160808101909352808352909261022f90830139608083015250919050565b6040805160a08101825260008082526020808301829052828401829052835160608181018652838252918101839052938401919091529091908201908152602001606081525090565b6000815180845260005b818110156101765760208185018101518683018201520161015a565b81811115610188576000602083870101525b50601f01601f19169290920160200192915050565b6020815262ffffff825116602082015260018060d01b03602083015116604082015260018060a01b036040830151166060820152600060608301518051600d0b608084015270ffffffffffffffffffffffffffffffffff1960208201511660a08401526040810151151560c084015250608083015160e080840152610226610100840182610150565b94935050505056fe4d6f6f20c3a9f09f9a806ff09f9a806f6fc3a9c3a94d4d4d206f206f4df09f9a80f09f9a806ff09f9a8020f09f9a804df09f9a806f6ff09f9a80f09f9a806f6fc3a94d6f204d206ff09f9a8020c3a96f2020f09f9a80f09f9a80c3a9f09f9a80a26469706673582212204219bf6b68e15baf1993043ecb21431b0ee4f711712687ccd4198807856dffb164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_25e1da51 {\n int112 s_0;\n bytes15 s_1;\n bool s_2;\n }\n\n struct S_7f71dfb5 {\n uint24 s_0;\n uint208 s_1;\n address s_2;\n S_25e1da51 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_7f71dfb5 memory) {\n S_7f71dfb5 memory r;\n {\n uint24 r_0 = 12524572;\n r.s_0 = r_0;\n }\n {\n uint208 r_1 = 139333957479695069850148263573300471095519134905621125637770007;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x229CA9f98282C77F37459FF9aBbC72222bAe8623;\n r.s_2 = r_2;\n }\n {\n S_25e1da51 memory r_3;\n {\n int112 r_3_0 = -1783647021687525461437659481437058;\n r_3.s_0 = r_3_0;\n }\n {\n bytes15 r_3_1 = bytes15(0xd12df13559bc4c09bee6338c1f3558);\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = false;\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀o🚀ooééMMM o oM🚀🚀o🚀 🚀M🚀oo🚀🚀ooéMo M o🚀 éo 🚀🚀é🚀\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000bf1c1c00000000000056b52e1875372b9094b27860112487049fdbd51b7b6022728b17000000000000000000000000229ca9f98282c77f37459ff9abbc72222bae8623ffffffffffffffffffffffffffffffffffffa80f35a405aa4338ac85b82b0c7ed12df13559bc4c09bee6338c1f35580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a806ff09f9a806f6fc3a9c3a94d4d4d206f206f4df09f9a80f09f9a806ff09f9a8020f09f9a804df09f9a806f6ff09f9a80f09f9a806f6fc3a94d6f204d206ff09f9a8020c3a96f2020f09f9a80f09f9a80c3a9f09f9a80" + }, + { + "name": "random-(uint88,string[1],bool,uint216[1],bytes11)", + "type": "(uint88,string[1],bool,uint216[1],bytes11)", + "value": [ + "14755847060875931202127844", + ["Moo é🚀 MéoM éMoMé oMM ééo🚀oMoMoéoMo oooé 🚀éoo o"], + false, + ["65624637158559784116817983435501774681522401771321123865494291079"], + "0x08ce54fb69632ee76ba38b" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "14755847060875931202127844" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 MéoM éMoMé oMM ééo🚀oMoMoéoMo oooé 🚀éoo o" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "65624637158559784116817983435501774681522401771321123865494291079" + } + ] + }, + { + "type": "hexstring", + "value": "0x08ce54fb69632ee76ba38b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102f9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101a1565b60405180910390f35b6100566100e2565b61005e6100e2565b6a0c34ac126f764b726887e4815261007461012a565b6000604051806080016040528060438152602001610281604391398252506020820152600060408201526100a6610151565b7a9f864fdce273923cab06b7a3efed593a7e7c405e3d5b86187c0287815260608201526a08ce54fb69632ee76ba38b60a81b6080820152919050565b6040518060a0016040528060006affffffffffffffffffffff16815260200161010961012a565b81526000602082015260400161011d610151565b8152600060209091015290565b60405180602001604052806001905b60608152602001906001900390816101395790505090565b60405180602001604052806001906020820280368337509192915050565b8060005b600181101561019b5781516001600160d81b0316845260209384019390910190600101610173565b50505050565b602080825282516affffffffffffffffffffff16828201528281015160a060408401526000919060e084019060c0850184805b600181101561023a5787850360bf1901835283518051808752835b8181101561020a578281018901518882018a015288016101ef565b8181111561021a578489838a0101525b50601f01601f1916959095018601945092850192918501916001016101d4565b5050505060408501518015156060860152915060608501519150610261608085018361016f565b60808501516001600160a81b0319811660a0860152915094935050505056fe4d6f6f20c3a9f09f9a80204dc3a96f4d202020c3a94d6f4dc3a9206f4d4d20c3a9c3a96ff09f9a806f4d6f4d6fc3a96f4d6f206f6f6fc3a920f09f9a80c3a96f6f206fa2646970667358221220d97c51922a6a7b54272f3c9e8191a0e1a7247345f296a6fe7cd0b7a2261debb764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_266d5c62 {\n uint88 s_0;\n string[1] s_1;\n bool s_2;\n uint216[1] s_3;\n bytes11 s_4;\n }\n\n function test () public pure returns (S_266d5c62 memory) {\n S_266d5c62 memory r;\n {\n uint88 r_0 = 14755847060875931202127844;\n r.s_0 = r_0;\n }\n {\n string[1] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀 MéoM éMoMé oMM ééo🚀oMoMoéoMo oooé 🚀éoo o\";\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n uint216[1] memory r_3;\n {\n uint216 r_3_0 = 65624637158559784116817983435501774681522401771321123865494291079;\n r_3[0] = r_3_0;\n }\n r.s_3 = r_3;\n }\n {\n bytes11 r_4 = bytes11(0x08ce54fb69632ee76ba38b);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000c34ac126f764b726887e400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000009f864fdce273923cab06b7a3efed593a7e7c405e3d5b86187c028708ce54fb69632ee76ba38b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80204dc3a96f4d202020c3a94d6f4dc3a9206f4d4d20c3a9c3a96ff09f9a806f4d6f4d6fc3a96f4d6f206f6f6fc3a920f09f9a80c3a96f6f206f0000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,bytes18[],(bool,string,string,address)),bytes31)", + "type": "((address,bytes18[],(bool,string,string,address)),bytes31)", + "value": [ + [ + "0x05a777D1F9E8ad5Fb66fdac4d3CcEAC717333A66", + [], + [ + true, + "Moo é🚀🚀 🚀 oM éoM🚀o🚀éMéoM 🚀éoMMooéoooM🚀 é🚀oM é🚀o🚀Moé🚀 o", + "Moo é🚀🚀", + "0xE1f5b4eA4A9C11ffda74116826f1D596454f082C" + ] + ], + "0x7c87f0f563b7a2b05a26438b26cc7e544d40530d92ae66bb4133bf7dff3537" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x05a777D1F9E8ad5Fb66fdac4d3CcEAC717333A66" + }, + { + "type": "array", + "value": [] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀 🚀 oM éoM🚀o🚀éMéoM 🚀éoMMooéoooM🚀 é🚀oM é🚀o🚀Moé🚀 o" + }, + { + "type": "string", + "value": "Moo é🚀🚀" + }, + { + "type": "address", + "value": "0xE1f5b4eA4A9C11ffda74116826f1D596454f082C" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x7c87f0f563b7a2b05a26438b26cc7e544d40530d92ae66bb4133bf7dff3537" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103bc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061026f565b60405180910390f35b61005661017f565b61005e61017f565b61009c604080516060808201835260008083526020808401839052845160808101865282815290810183905280850183905291820152909182015290565b7305a777d1f9e8ad5fb66fdac4d3cceac717333a668152604080516000808252602080830184528085019290925282516080810184526060818401819052818501819052810182905260018152835160a0810190945260638085529093919261032490830139602080840191909152604080518082018252600e81526c9adede418753e13f3501e13f3560971b818401528185015273e1f5b4ea4a9c11ffda74116826f1d596454f082c6060850152840192909252509082527f7c87f0f563b7a2b05a26438b26cc7e544d40530d92ae66bb4133bf7dff35370090820152919050565b6040805160a0810182526000818301818152606080840181905284516080808201875284825260208083018490529682018390529181018490529084015282529181019190915290565b6000815180845260005b818110156101ef576020818501810151868301820152016101d3565b81811115610201576000602083870101525b50601f01601f19169290920160200192915050565b805115158252600060208201516080602085015261023760808501826101c9565b90506040830151848203604086015261025082826101c9565b6060948501516001600160a01b03169590940194909452509092915050565b60006020808352835160408285015260c0840160018060a01b038251166060860152828201516060608087015281815180845260e0880191508583019350600092505b808310156102e35783516dffffffffffffffffffffffffffff191682529285019260019290920191908501906102b2565b5060408401519350605f198782030160a08801526103018185610216565b9488015160ff198116604089015294935061031b92505050565b94935050505056fe4d6f6f20c3a9f09f9a80f09f9a802020f09f9a80206f4d2020c3a96f4df09f9a806ff09f9a80c3a94dc3a96f4d20f09f9a80c3a96f4d4d6f6fc3a96f6f6f4df09f9a8020c3a9f09f9a806f4d2020c3a9f09f9a806ff09f9a804d6fc3a9f09f9a80206fa26469706673582212204b14f270c22ca44b14bfca03588fa89d9878fdd45904331d1a2f8ccce1b8d26d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e779621a {\n bool s_0;\n string s_1;\n string s_2;\n address s_3;\n }\n\n struct S_7c7b7561 {\n address s_0;\n bytes18[] s_1;\n S_e779621a s_2;\n }\n\n struct S_76d6c287 {\n S_7c7b7561 s_0;\n bytes31 s_1;\n }\n\n function test () public pure returns (S_76d6c287 memory) {\n S_76d6c287 memory r;\n {\n S_7c7b7561 memory r_0;\n {\n address r_0_0 = 0x05a777D1F9E8ad5Fb66fdac4d3CcEAC717333A66;\n r_0.s_0 = r_0_0;\n }\n {\n bytes18[] memory r_0_1 = new bytes18[](0);\n r_0.s_1 = r_0_1;\n }\n {\n S_e779621a memory r_0_2;\n {\n bool r_0_2_0 = true;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀🚀 🚀 oM éoM🚀o🚀éMéoM 🚀éoMMooéoooM🚀 é🚀oM é🚀o🚀Moé🚀 o\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n string memory r_0_2_2 = unicode\"Moo é🚀🚀\";\n r_0_2.s_2 = r_0_2_2;\n }\n {\n address r_0_2_3 = 0xE1f5b4eA4A9C11ffda74116826f1D596454f082C;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bytes31 r_1 = bytes31(0x7c87f0f563b7a2b05a26438b26cc7e544d40530d92ae66bb4133bf7dff3537);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000407c87f0f563b7a2b05a26438b26cc7e544d40530d92ae66bb4133bf7dff35370000000000000000000000000005a777d1f9e8ad5fb66fdac4d3cceac717333a66000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000e1f5b4ea4a9c11ffda74116826f1d596454f082c00000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a802020f09f9a80206f4d2020c3a96f4df09f9a806ff09f9a80c3a94dc3a96f4d20f09f9a80c3a96f4d4d6f6fc3a96f6f6f4df09f9a8020c3a9f09f9a806f4d2020c3a9f09f9a806ff09f9a804d6fc3a9f09f9a80206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a80f09f9a80000000000000000000000000000000000000" + }, + { + "name": "random-((bool,int216,address[]),string,uint144,string[3])", + "type": "((bool,int216,address[]),string,uint144,string[3])", + "value": [ + [ + true, + "42204045905085308419103050240057281769683195809522584554469202494", + ["0x407882b3e1e33B4069612cc2D683490E8b466cb0"] + ], + "Moo é🚀", + "17883702168831998796434501326742622877380170", + ["Moo é🚀o Mo🚀🚀🚀", "Moo é🚀", "Moo é🚀🚀é🚀 oéééé MM🚀o🚀oMMé"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "42204045905085308419103050240057281769683195809522584554469202494" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x407882b3e1e33B4069612cc2D683490E8b466cb0" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "17883702168831998796434501326742622877380170" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o Mo🚀🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀é🚀 oéééé MM🚀o🚀oMMé" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061041d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c5565b60405180910390f35b6100566101cb565b61005e6101cb565b60408051606080820183528183015260018082527a6697a46a334f0d1915a0347c36ddb6b6f47b4c1bf853a270221a3e602083015282518181528084019093529091600091816020016020820280368337019050509050600073407882b3e1e33b4069612cc2d683490e8b466cb0905080826000815181106100e2576100e26103a2565b6001600160a01b039092166020928302919091018201526040808501939093529284525080518082018252600a8152689adede418753e13f3560b71b818401529183019190915271cd4b7a28587c85ce23cf64e3d15fff89ee4a9082015261014861020c565b604080518082018252601b81527f4d6f6f20c3a9f09f9a806f20204d6ff09f9a80f09f9a80f09f9a80000000000060208083019190915290835281518083018352600a8152689adede418753e13f3560b71b8183015283820152815160608101909252602f808352600092916103b9908301396040830152506060820152919050565b6040805160e08101825260006080820181815260a08301829052606060c08401819052908352602083018190529282015290810161020761020c565b905290565b60405180606001604052806003905b606081526020019060019003908161021b5790505090565b6000815180845260005b818110156102595760208185018101518683018201520161023d565b8181111561026b576000602083870101525b50601f01601f19169290920160200192915050565b600082606081018360005b60038110156102ba5783830387526102a4838351610233565b602097880197909350919091019060010161028b565b509095945050505050565b602080825282516080838301528051151560a084015280820151601a0b60c084015260400151606060e0840152805161010084018190526000929182019083906101208601905b808310156103355783516001600160a01b0316825292840192600192909201919084019061030c565b50838701519350601f199250828682030160408701526103558185610233565b93505050604085015161037e606086018271ffffffffffffffffffffffffffffffffffff169052565b506060850151818584030160808601526103988382610280565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a80206fc3a9c3a9c3a9c3a9204d4df09f9a806ff09f9a806f4d4dc3a9a26469706673582212204d3af652c852c384c4c43cb6dd37b21f084b5beb51061b3c99f3e616a7b4c80164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_20ec47d2 {\n bool s_0;\n int216 s_1;\n address[] s_2;\n }\n\n struct S_bd85d441 {\n S_20ec47d2 s_0;\n string s_1;\n uint144 s_2;\n string[3] s_3;\n }\n\n function test () public pure returns (S_bd85d441 memory) {\n S_bd85d441 memory r;\n {\n S_20ec47d2 memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n int216 r_0_1 = 42204045905085308419103050240057281769683195809522584554469202494;\n r_0.s_1 = r_0_1;\n }\n {\n address[] memory r_0_2 = new address[](1);\n {\n address r_0_2_0 = 0x407882b3e1e33B4069612cc2D683490E8b466cb0;\n r_0_2[0] = r_0_2_0;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n uint144 r_2 = 17883702168831998796434501326742622877380170;\n r.s_2 = r_2;\n }\n {\n string[3] memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀o Mo🚀🚀🚀\";\n r_3[0] = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀\";\n r_3[1] = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀🚀é🚀 oéééé MM🚀o🚀oMMé\";\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000cd4b7a28587c85ce23cf64e3d15fff89ee4a0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000100000000006697a46a334f0d1915a0347c36ddb6b6f47b4c1bf853a270221a3e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000407882b3e1e33b4069612cc2d683490e8b466cb0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a806f20204d6ff09f9a80f09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a80206fc3a9c3a9c3a9c3a9204d4df09f9a806ff09f9a806f4d4dc3a90000000000000000000000000000000000" + }, + { + "name": "random-((bytes25[3][3],int128,address,bool,bool),int152)", + "type": "((bytes25[3][3],int128,address,bool,bool),int152)", + "value": [ + [ + [ + [ + "0xb2b2617b858f242cf685e68f8435b420d6e72a2193dc0a5118", + "0x9cc64a0b9d35c828bd62627ff8fce6635cae4c8678bef6c498", + "0xb6250cd949eb0df2d27f78b358aab3b9c34f0560e6df9bbe7c" + ], + [ + "0xd6707490e08a16f052258e60cca2b1bbc2f1f5c9a6e27ce842", + "0xd58df897f39ed3e54a6c5ec8e9ec1339e765496a834afa8a2c", + "0x38632d965f4adffaf0904de20b11ba6e25d0a7e23f388ef8a9" + ], + [ + "0x8d0612ef4e32ceac436fdb0dd1bd5571e6af614ba28d1bf31b", + "0xa92f9e426fb15eb1107ef696c754bced563a7e4361b199cb87", + "0xc2004816c24d362db4bffa3376144ad02c162b6a6e3afe407b" + ] + ], + "-58364042150315514239455006206289389368", + "0xF7508c412844DF82CF1Fcfa353Ad1272855f0bA2", + true, + false + ], + "1095237326575093977667050319572383273325964782" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb2b2617b858f242cf685e68f8435b420d6e72a2193dc0a5118" + }, + { + "type": "hexstring", + "value": "0x9cc64a0b9d35c828bd62627ff8fce6635cae4c8678bef6c498" + }, + { + "type": "hexstring", + "value": "0xb6250cd949eb0df2d27f78b358aab3b9c34f0560e6df9bbe7c" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd6707490e08a16f052258e60cca2b1bbc2f1f5c9a6e27ce842" + }, + { + "type": "hexstring", + "value": "0xd58df897f39ed3e54a6c5ec8e9ec1339e765496a834afa8a2c" + }, + { + "type": "hexstring", + "value": "0x38632d965f4adffaf0904de20b11ba6e25d0a7e23f388ef8a9" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8d0612ef4e32ceac436fdb0dd1bd5571e6af614ba28d1bf31b" + }, + { + "type": "hexstring", + "value": "0xa92f9e426fb15eb1107ef696c754bced563a7e4361b199cb87" + }, + { + "type": "hexstring", + "value": "0xc2004816c24d362db4bffa3376144ad02c162b6a6e3afe407b" + } + ] + } + ] + }, + { + "type": "number", + "value": "-58364042150315514239455006206289389368" + }, + { + "type": "address", + "value": "0xF7508c412844DF82CF1Fcfa353Ad1272855f0bA2" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "1095237326575093977667050319572383273325964782" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103e2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102eb565b60405180910390f35b61005661024b565b61005e61024b565b61006661026b565b61006e6102a0565b6100766102cd565b7fb2b2617b858f242cf685e68f8435b420d6e72a2193dc0a51180000000000000081527f9cc64a0b9d35c828bd62627ff8fce6635cae4c8678bef6c4980000000000000060208201527fb6250cd949eb0df2d27f78b358aab3b9c34f0560e6df9bbe7c00000000000000604082015281526100ef6102cd565b7fd6707490e08a16f052258e60cca2b1bbc2f1f5c9a6e27ce8420000000000000081527fd58df897f39ed3e54a6c5ec8e9ec1339e765496a834afa8a2c000000000000006020808301919091527f38632d965f4adffaf0904de20b11ba6e25d0a7e23f388ef8a900000000000000604083015282015261016d6102cd565b7f8d0612ef4e32ceac436fdb0dd1bd5571e6af614ba28d1bf31b0000000000000081527fa92f9e426fb15eb1107ef696c754bced563a7e4361b199cb87000000000000006020808301919091527fc2004816c24d362db4bffa3376144ad02c162b6a6e3afe407b00000000000000604080840191909152838101929092529183526f2be88171f808b6adb6e9cb19af162737198383015273f7508c412844df82cf1fcfa353ad1272855f0ba290830152600160608301526000608083015290825272311cb539ba28d9088858d1c1c43e1425d42dee90820152919050565b604051806040016040528061025e61026b565b8152600060209091015290565b6040518060a0016040528061027e6102a0565b8152600060208201819052604082018190526060820181905260809091015290565b60405180606001604052806003905b6102b76102cd565b8152602001906001900390816102af5790505090565b60405180606001604052806003906020820280368337509192915050565b815180516101c083019190836000805b600380821061030a5750610351565b845184845b8381101561033757825166ffffffffffffff191682526020928301929091019060010161030f565b5050506020949094019350606092909201916001016102fb565b50505050602081015161036a610120850182600f0b9052565b5060408101516001600160a01b0316610140840152606081015115156101608401526080015115156101808301526020929092015160120b6101a0909101529056fea2646970667358221220e722ec003b06dd3782ab52cd501ba5e84b47f03237c00b16beab3fe0207b048e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_158113f7 {\n bytes25[3][3] s_0;\n int128 s_1;\n address s_2;\n bool s_3;\n bool s_4;\n }\n\n struct S_b70b5b32 {\n S_158113f7 s_0;\n int152 s_1;\n }\n\n function test () public pure returns (S_b70b5b32 memory) {\n S_b70b5b32 memory r;\n {\n S_158113f7 memory r_0;\n {\n bytes25[3][3] memory r_0_0;\n {\n bytes25[3] memory r_0_0_0;\n {\n bytes25 r_0_0_0_0 = bytes25(0xb2b2617b858f242cf685e68f8435b420d6e72a2193dc0a5118);\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n bytes25 r_0_0_0_1 = bytes25(0x9cc64a0b9d35c828bd62627ff8fce6635cae4c8678bef6c498);\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n bytes25 r_0_0_0_2 = bytes25(0xb6250cd949eb0df2d27f78b358aab3b9c34f0560e6df9bbe7c);\n r_0_0_0[2] = r_0_0_0_2;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n bytes25[3] memory r_0_0_1;\n {\n bytes25 r_0_0_1_0 = bytes25(0xd6707490e08a16f052258e60cca2b1bbc2f1f5c9a6e27ce842);\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n bytes25 r_0_0_1_1 = bytes25(0xd58df897f39ed3e54a6c5ec8e9ec1339e765496a834afa8a2c);\n r_0_0_1[1] = r_0_0_1_1;\n }\n {\n bytes25 r_0_0_1_2 = bytes25(0x38632d965f4adffaf0904de20b11ba6e25d0a7e23f388ef8a9);\n r_0_0_1[2] = r_0_0_1_2;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n bytes25[3] memory r_0_0_2;\n {\n bytes25 r_0_0_2_0 = bytes25(0x8d0612ef4e32ceac436fdb0dd1bd5571e6af614ba28d1bf31b);\n r_0_0_2[0] = r_0_0_2_0;\n }\n {\n bytes25 r_0_0_2_1 = bytes25(0xa92f9e426fb15eb1107ef696c754bced563a7e4361b199cb87);\n r_0_0_2[1] = r_0_0_2_1;\n }\n {\n bytes25 r_0_0_2_2 = bytes25(0xc2004816c24d362db4bffa3376144ad02c162b6a6e3afe407b);\n r_0_0_2[2] = r_0_0_2_2;\n }\n r_0_0[2] = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n {\n int128 r_0_1 = -58364042150315514239455006206289389368;\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0xF7508c412844DF82CF1Fcfa353Ad1272855f0bA2;\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0.s_3 = r_0_3;\n }\n {\n bool r_0_4 = false;\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n int152 r_1 = 1095237326575093977667050319572383273325964782;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0xb2b2617b858f242cf685e68f8435b420d6e72a2193dc0a5118000000000000009cc64a0b9d35c828bd62627ff8fce6635cae4c8678bef6c49800000000000000b6250cd949eb0df2d27f78b358aab3b9c34f0560e6df9bbe7c00000000000000d6707490e08a16f052258e60cca2b1bbc2f1f5c9a6e27ce84200000000000000d58df897f39ed3e54a6c5ec8e9ec1339e765496a834afa8a2c0000000000000038632d965f4adffaf0904de20b11ba6e25d0a7e23f388ef8a9000000000000008d0612ef4e32ceac436fdb0dd1bd5571e6af614ba28d1bf31b00000000000000a92f9e426fb15eb1107ef696c754bced563a7e4361b199cb8700000000000000c2004816c24d362db4bffa3376144ad02c162b6a6e3afe407b00000000000000ffffffffffffffffffffffffffffffffd4177e8e07f74952491634e650e9d8c8000000000000000000000000f7508c412844df82cf1fcfa353ad1272855f0ba20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000311cb539ba28d9088858d1c1c43e1425d42dee" + }, + { + "name": "random-((bytes3),(int88,uint128,string[1],bool[][3]))", + "type": "((bytes3),(int88,uint128,string[1],bool[][3]))", + "value": [ + ["0x571282"], + [ + "138520999858898201197970597", + "286422112591566059720456561011869362493", + ["Moo é🚀éoo🚀🚀M oéooo🚀oM é é🚀Moo🚀éoéoo o🚀 o ooo🚀ooo 🚀é🚀🚀Mé"], + [[true, false], [false, false], [false]] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x571282" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "138520999858898201197970597" + }, + { + "type": "number", + "value": "286422112591566059720456561011869362493" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoo🚀🚀M oéooo🚀oM é é🚀Moo🚀éoéoo o🚀 o ooo🚀ooo 🚀é🚀🚀Mé" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104ce806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610328565b60405180910390f35b610056610226565b61005e610226565b6040805160208101909152622b894160e91b8152815261007c61024c565b6a7294f672f7d4743adc84a581526fd77ae4703a8fdfd091c3ec88e8e4293d60208201526100a8610278565b60006040518060a00160405280606581526020016104346065913982525060408201526100d361029f565b604080516002808252606082018352600092602083019080368337019050509050600060019050808260008151811061010e5761010e61041d565b60200260200101901515908115158152505050600080826001815181106101375761013761041d565b9115156020928302919091019091015250815260408051600280825260608201909252600091816020016020820280368337019050509050600080826000815181106101855761018561041d565b60200260200101901515908115158152505050600080826001815181106101ae576101ae61041d565b91151560209283029190910182015283019190915250604080516001808252818301909252600091816020016020820280368337019050509050600080826000815181106101fe576101fe61041d565b9115156020928302919091018201526040840192909252506060830191909152820152919050565b6040805160608101825260009181019182529081526020810161024761024c565b905290565b604080516080810182526000808252602082015290810161026b610278565b815260200161024761029f565b60405180602001604052806001905b60608152602001906001900390816102875790505090565b604080516060808201909252908152600260208201610287565b60008260608101836000805b600381101561031c578484038852825180518086526020918201918087019190855b828110156103055784511515845293810193928101926001016102e7565b509a8b019a919650509390930192506001016102c5565b50919695505050505050565b6000602080835262ffffff60e81b84515116818401528084015160408085015260e084018151600a0b60608601526fffffffffffffffffffffffffffffffff838301511660808601526040820151608060a087015281829050610100870192506000805b60018110156103f25788850360df1901835283518051808752835b818110156103c2578281018a01518882018b015289016103a7565b818111156103d257848a838a0101525b50601f01601f19169590950187019450928601929186019160010161038c565b505050506060820151858203605f190160c0870152925061041381846102b9565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a96f6ff09f9a80f09f9a804d206fc3a96f6f6ff09f9a806f4d20c3a920202020c3a9f09f9a804d6f6ff09f9a80c3a96fc3a96f6f20206ff09f9a80206f206f6f6ff09f9a806f6f6f20f09f9a80c3a9f09f9a80f09f9a804dc3a9a2646970667358221220a427262e28f19498772fbe1d873297fbdd3d1740dea0c0ad4022544e70ea9a6064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f9135bc5 {\n bytes3 s_0;\n }\n\n struct S_1e16b9ff {\n int88 s_0;\n uint128 s_1;\n string[1] s_2;\n bool[][3] s_3;\n }\n\n struct S_4974cb00 {\n S_f9135bc5 s_0;\n S_1e16b9ff s_1;\n }\n\n function test () public pure returns (S_4974cb00 memory) {\n S_4974cb00 memory r;\n {\n S_f9135bc5 memory r_0;\n {\n bytes3 r_0_0 = bytes3(0x571282);\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n S_1e16b9ff memory r_1;\n {\n int88 r_1_0 = 138520999858898201197970597;\n r_1.s_0 = r_1_0;\n }\n {\n uint128 r_1_1 = 286422112591566059720456561011869362493;\n r_1.s_1 = r_1_1;\n }\n {\n string[1] memory r_1_2;\n {\n string memory r_1_2_0 = unicode\"Moo é🚀éoo🚀🚀M oéooo🚀oM é é🚀Moo🚀éoéoo o🚀 o ooo🚀ooo 🚀é🚀🚀Mé\";\n r_1_2[0] = r_1_2_0;\n }\n r_1.s_2 = r_1_2;\n }\n {\n bool[][3] memory r_1_3;\n {\n bool[] memory r_1_3_0 = new bool[](2);\n {\n bool r_1_3_0_0 = true;\n r_1_3_0[0] = r_1_3_0_0;\n }\n {\n bool r_1_3_0_1 = false;\n r_1_3_0[1] = r_1_3_0_1;\n }\n r_1_3[0] = r_1_3_0;\n }\n {\n bool[] memory r_1_3_1 = new bool[](2);\n {\n bool r_1_3_1_0 = false;\n r_1_3_1[0] = r_1_3_1_0;\n }\n {\n bool r_1_3_1_1 = false;\n r_1_3_1[1] = r_1_3_1_1;\n }\n r_1_3[1] = r_1_3_1;\n }\n {\n bool[] memory r_1_3_2 = new bool[](1);\n {\n bool r_1_3_2_0 = false;\n r_1_3_2[0] = r_1_3_2_0;\n }\n r_1_3[2] = r_1_3_2;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020571282000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000007294f672f7d4743adc84a500000000000000000000000000000000d77ae4703a8fdfd091c3ec88e8e4293d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a80c3a96f6ff09f9a80f09f9a804d206fc3a96f6f6ff09f9a806f4d20c3a920202020c3a9f09f9a804d6f6ff09f9a80c3a96fc3a96f6f20206ff09f9a80206f206f6f6ff09f9a806f6f6f20f09f9a80c3a9f09f9a80f09f9a804dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes4,string,address,(address,bytes27)[1],bytes5),uint72)", + "type": "((bytes4,string,address,(address,bytes27)[1],bytes5),uint72)", + "value": [ + [ + "0xa749dd80", + "Moo é🚀Mo M🚀🚀éo oo M", + "0x3Fa70Add2C72F221102B63D85754411f844492a1", + [ + [ + "0x8156C57C609b0D568E86A93d033661952A14Aa3f", + "0x5a92e9561f8bee7fb9e41464923d8290a1c9d05b229577da711df7" + ] + ], + "0xb778ff69d6" + ], + "4115082777522003183056" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa749dd80" + }, + { + "type": "string", + "value": "Moo é🚀Mo M🚀🚀éo oo M" + }, + { + "type": "address", + "value": "0x3Fa70Add2C72F221102B63D85754411f844492a1" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x8156C57C609b0D568E86A93d033661952A14Aa3f" + }, + { + "type": "hexstring", + "value": "0x5a92e9561f8bee7fb9e41464923d8290a1c9d05b229577da711df7" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xb778ff69d6" + } + ] + }, + { + "type": "number", + "value": "4115082777522003183056" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610317806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610207565b60405180910390f35b610056610145565b61005e610145565b610066610165565b63014e93bb60e71b8152604080518082018252601e81527f4d6f6f20c3a9f09f9a804d6f204df09f9a80f09f9a80c3a96f206f6f204d0000602080830191909152830152733fa70add2c72f221102b63d85754411f844492a1908201526100cb610188565b60408051808201909152738156c57c609b0d568e86a93d033661952a14aa3f81527f5a92e9561f8bee7fb9e41464923d8290a1c9d05b229577da711df700000000006020808301919091529082526060830191909152645bbc7fb4eb60d91b608083015290825268df143edf8366cf05d090820152919050565b6040518060400160405280610158610165565b8152600060209091015290565b6040805160a0810182526000808252606060208301819052928201529081016101585b60405180602001604052806001905b60408051808201909152600080825260208201528152602001906001900390816101975790505090565b8060005b600181101561020157815180516001600160a01b0316855260209081015164ffffffffff191681860152604090940193909101906001016101c5565b50505050565b60006020808352835160408285015263ffffffff60e01b81511660608501528181015160c0608086015280518061012087015260005b8181101561025a578281018501518782016101400152840161023d565b8181111561026d57600061014083890101525b5060408301516001600160a01b031660a08701526060830151915061029560c08701836101c1565b608083015192506102b36101008701846001600160d81b0319169052565b9286015168ffffffffffffffffff8116604087015292601f01601f191694909401610140019594505050505056fea2646970667358221220ba4772d11550b7c7d92b1310be821c57bf30568f54adf5d6568b34509193ccc564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9c631d09 {\n address s_0;\n bytes27 s_1;\n }\n\n struct S_5c343c8c {\n bytes4 s_0;\n string s_1;\n address s_2;\n S_9c631d09[1] s_3;\n bytes5 s_4;\n }\n\n struct S_123aa41e {\n S_5c343c8c s_0;\n uint72 s_1;\n }\n\n function test () public pure returns (S_123aa41e memory) {\n S_123aa41e memory r;\n {\n S_5c343c8c memory r_0;\n {\n bytes4 r_0_0 = bytes4(0xa749dd80);\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀Mo M🚀🚀éo oo M\";\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x3Fa70Add2C72F221102B63D85754411f844492a1;\n r_0.s_2 = r_0_2;\n }\n {\n S_9c631d09[1] memory r_0_3;\n {\n S_9c631d09 memory r_0_3_0;\n {\n address r_0_3_0_0 = 0x8156C57C609b0D568E86A93d033661952A14Aa3f;\n r_0_3_0.s_0 = r_0_3_0_0;\n }\n {\n bytes27 r_0_3_0_1 = bytes27(0x5a92e9561f8bee7fb9e41464923d8290a1c9d05b229577da711df7);\n r_0_3_0.s_1 = r_0_3_0_1;\n }\n r_0_3[0] = r_0_3_0;\n }\n r_0.s_3 = r_0_3;\n }\n {\n bytes5 r_0_4 = bytes5(0xb778ff69d6);\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n uint72 r_1 = 4115082777522003183056;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000df143edf8366cf05d0a749dd800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000003fa70add2c72f221102b63d85754411f844492a10000000000000000000000008156c57c609b0d568e86a93d033661952a14aa3f5a92e9561f8bee7fb9e41464923d8290a1c9d05b229577da711df70000000000b778ff69d6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a804d6f204df09f9a80f09f9a80c3a96f206f6f204d0000" + }, + { + "name": "random-((string,address,uint232,bytes13,(bytes11[2],address)),bytes11)", + "type": "((string,address,uint232,bytes13,(bytes11[2],address)),bytes11)", + "value": [ + [ + "Moo é🚀 Mé o🚀🚀éoMé🚀", + "0x8d22979c57D4e80eF0802835236030ea80240d95", + "2838412900522199062529706644270819314209494485025480226848652156286937", + "0xb879bec8eff3c289d3886ee508", + [ + ["0xe096dc94be5a910bc78491", "0x47ca26206dbd21c8610735"], + "0x06De5c24744896b2C311431968dBf925b85288bf" + ] + ], + "0x4c12b082be579d59b4276a" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Mé o🚀🚀éoMé🚀" + }, + { + "type": "address", + "value": "0x8d22979c57D4e80eF0802835236030ea80240d95" + }, + { + "type": "number", + "value": "2838412900522199062529706644270819314209494485025480226848652156286937" + }, + { + "type": "hexstring", + "value": "0xb879bec8eff3c289d3886ee508" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe096dc94be5a910bc78491" + }, + { + "type": "hexstring", + "value": "0x47ca26206dbd21c8610735" + } + ] + }, + { + "type": "address", + "value": "0x06De5c24744896b2C311431968dBf925b85288bf" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x4c12b082be579d59b4276a" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610351806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610219565b60405180910390f35b61005661014f565b61005e61014f565b61006661016f565b60006040518060600160405280602381526020016102f960239139825250738d22979c57d4e80ef0802835236030ea80240d9560208201527c6948578c7b977b514d404053e0ced4da3bb5ccdfe2b39efc3e3fad37d960408201526c170f37d91dfe78513a710ddca1609b1b60608201526100df6101a4565b6100e76101b3565b6ae096dc94be5a910bc7849160a81b81526a47ca26206dbd21c861073560a81b6020808301919091529082527306de5c24744896b2c311431968dbf925b85288bf8282015260808301919091529082526a260958415f2bceacda13b560a91b90820152919050565b604051806040016040528061016261016f565b8152600060209091015290565b6040805160a08101825260608082526000602083018190529282018390528101919091526080810161019f6101a4565b905290565b60405180604001604052806101625b60405180604001604052806002906020820280368337509192915050565b80518260005b60028110156102005782516001600160a81b0319168252602092830192909101906001016101d7565b505050602001516001600160a01b031660409190910152565b600060208083528351604082850152805160e0606086015280518061014087015260005b8181101561025a578281018501518782016101600152840161023d565b8181111561026d57600061016083890101525b50838301516001600160a01b031660808781019190915260408401516001600160e81b031660a0880152606084015172ffffffffffffffffffffffffffffffffffffff19811660c08901529301519291506102cb60e08701846101d1565b928601516001600160a81b03198116604087015292601f01601f191694909401610160019594505050505056fe4d6f6f20c3a9f09f9a8020204dc3a9206ff09f9a80f09f9a80c3a96f4dc3a9f09f9a80a26469706673582212208ac9a6ce4a42469256a1e8835a849c2f51544e0f90c17dd54a94777a8131f7ce64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d6618894 {\n bytes11[2] s_0;\n address s_1;\n }\n\n struct S_bf4d6bbf {\n string s_0;\n address s_1;\n uint232 s_2;\n bytes13 s_3;\n S_d6618894 s_4;\n }\n\n struct S_30995e7e {\n S_bf4d6bbf s_0;\n bytes11 s_1;\n }\n\n function test () public pure returns (S_30995e7e memory) {\n S_30995e7e memory r;\n {\n S_bf4d6bbf memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 Mé o🚀🚀éoMé🚀\";\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x8d22979c57D4e80eF0802835236030ea80240d95;\n r_0.s_1 = r_0_1;\n }\n {\n uint232 r_0_2 = 2838412900522199062529706644270819314209494485025480226848652156286937;\n r_0.s_2 = r_0_2;\n }\n {\n bytes13 r_0_3 = bytes13(0xb879bec8eff3c289d3886ee508);\n r_0.s_3 = r_0_3;\n }\n {\n S_d6618894 memory r_0_4;\n {\n bytes11[2] memory r_0_4_0;\n {\n bytes11 r_0_4_0_0 = bytes11(0xe096dc94be5a910bc78491);\n r_0_4_0[0] = r_0_4_0_0;\n }\n {\n bytes11 r_0_4_0_1 = bytes11(0x47ca26206dbd21c8610735);\n r_0_4_0[1] = r_0_4_0_1;\n }\n r_0_4.s_0 = r_0_4_0;\n }\n {\n address r_0_4_1 = 0x06De5c24744896b2C311431968dBf925b85288bf;\n r_0_4.s_1 = r_0_4_1;\n }\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n bytes11 r_1 = bytes11(0x4c12b082be579d59b4276a);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000404c12b082be579d59b4276a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000008d22979c57d4e80ef0802835236030ea80240d950000006948578c7b977b514d404053e0ced4da3bb5ccdfe2b39efc3e3fad37d9b879bec8eff3c289d3886ee50800000000000000000000000000000000000000e096dc94be5a910bc7849100000000000000000000000000000000000000000047ca26206dbd21c861073500000000000000000000000000000000000000000000000000000000000000000006de5c24744896b2c311431968dbf925b85288bf00000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a8020204dc3a9206ff09f9a80f09f9a80c3a96f4dc3a9f09f9a800000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((string,uint,address,address),bytes27,(string,int48),address)", + "type": "((string,uint,address,address),bytes27,(string,int48),address)", + "value": [ + [ + "Moo é🚀éo é M 🚀 🚀oé🚀🚀🚀M oMM🚀éMo éooooé 🚀éo🚀ééooMo 🚀o", + "66768853966608907939440017916308411990285636279724856577728652067134078908906", + "0xb406250e2FC6f17d7039ba448F2A6A0846d69C04", + "0x2afcB9F6f6D1698b79c87d509790Ba8A99E257de" + ], + "0xe7b1c09a84913a27a7613fcdd57d826382b56a2d673523b17a9db0", + ["Moo é🚀 o🚀 oooo🚀o oMoMMééé", "-16932806685125"], + "0x78838654D6beb1569E8116E9ec15F889A700bB31" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éo é M 🚀 🚀oé🚀🚀🚀M oMM🚀éMo éooooé 🚀éo🚀ééooMo 🚀o" + }, + { + "type": "number", + "value": "66768853966608907939440017916308411990285636279724856577728652067134078908906" + }, + { + "type": "address", + "value": "0xb406250e2FC6f17d7039ba448F2A6A0846d69C04" + }, + { + "type": "address", + "value": "0x2afcB9F6f6D1698b79c87d509790Ba8A99E257de" + } + ] + }, + { + "type": "hexstring", + "value": "0xe7b1c09a84913a27a7613fcdd57d826382b56a2d673523b17a9db0" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o🚀 oooo🚀o oMoMMééé" + }, + { + "type": "number", + "value": "-16932806685125" + } + ] + }, + { + "type": "address", + "value": "0x78838654D6beb1569E8116E9ec15F889A700bB31" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103cf806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610263565b60405180910390f35b610056610172565b61005e610172565b6100666101b0565b60006040518060800160405280605e815260200161033c605e91398252507f939dd50612ad80b0229a9698f7a067613292c883720b994cb924573f8b7af9ea60208083019190915273b406250e2fc6f17d7039ba448f2a6a0846d69c04604080840191909152732afcb9f6f6d1698b79c87d509790ba8a99e257de6060808501919091529284527fe7b1c09a84913a27a7613fcdd57d826382b56a2d673523b17a9db00000000000848301528051808201909152918252600090820152600060405180606001604052806026815260200161031660269139825250650f6679ed71c419602082015260408201527378838654d6beb1569e8116e9ec15f889a700bb316060820152919050565b60405180608001604052806101856101b0565b8152600060208083018290526040805180820182526060808252928101849052908401529091015290565b6040518060800160405280606081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b6000815180845260005b81811015610210576020818501810151868301820152016101f4565b81811115610222576000602083870101525b50601f01601f19169290920160200192915050565b600081516040845261024c60408501826101ea565b60209384015160050b949093019390935250919050565b6020815260008251608060208401528051608060a08501526102896101208501826101ea565b60208381015160c08701526040808501516001600160a01b0390811660e0890152606090950151909416610100870152860151929091506102d39085018364ffffffffff19169052565b6040850151848203601f1901606086015291506102f08183610237565b915050606084015161030d60808501826001600160a01b03169052565b50939250505056fe4d6f6f20c3a9f09f9a80206ff09f9a80206f6f6f6ff09f9a806f206f4d6f4d4dc3a9c3a9c3a94d6f6f20c3a9f09f9a80c3a96f20c3a92020204d2020f09f9a8020f09f9a806fc3a9f09f9a80f09f9a80f09f9a804d206f4d4df09f9a80c3a94d6f20c3a96f6f6f6fc3a920f09f9a80c3a96ff09f9a80c3a9c3a96f6f4d6f20f09f9a806fa264697066735822122033322ea1a1c3488fa6ea824a13891cdbb3eae6ec3e583d176ac0ac005a352dad64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6f52caaa {\n string s_0;\n uint256 s_1;\n address s_2;\n address s_3;\n }\n\n struct S_cf620c3e {\n string s_0;\n int48 s_1;\n }\n\n struct S_11b43133 {\n S_6f52caaa s_0;\n bytes27 s_1;\n S_cf620c3e s_2;\n address s_3;\n }\n\n function test () public pure returns (S_11b43133 memory) {\n S_11b43133 memory r;\n {\n S_6f52caaa memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀éo é M 🚀 🚀oé🚀🚀🚀M oMM🚀éMo éooooé 🚀éo🚀ééooMo 🚀o\";\n r_0.s_0 = r_0_0;\n }\n {\n uint r_0_1 = 66768853966608907939440017916308411990285636279724856577728652067134078908906;\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0xb406250e2FC6f17d7039ba448F2A6A0846d69C04;\n r_0.s_2 = r_0_2;\n }\n {\n address r_0_3 = 0x2afcB9F6f6D1698b79c87d509790Ba8A99E257de;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bytes27 r_1 = bytes27(0xe7b1c09a84913a27a7613fcdd57d826382b56a2d673523b17a9db0);\n r.s_1 = r_1;\n }\n {\n S_cf620c3e memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 o🚀 oooo🚀o oMoMMééé\";\n r_2.s_0 = r_2_0;\n }\n {\n int48 r_2_1 = -16932806685125;\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x78838654D6beb1569E8116E9ec15F889A700bB31;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080e7b1c09a84913a27a7613fcdd57d826382b56a2d673523b17a9db00000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000078838654d6beb1569e8116e9ec15f889a700bb310000000000000000000000000000000000000000000000000000000000000080939dd50612ad80b0229a9698f7a067613292c883720b994cb924573f8b7af9ea000000000000000000000000b406250e2fc6f17d7039ba448f2a6a0846d69c040000000000000000000000002afcb9f6f6d1698b79c87d509790ba8a99e257de000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80c3a96f20c3a92020204d2020f09f9a8020f09f9a806fc3a9f09f9a80f09f9a80f09f9a804d206f4d4df09f9a80c3a94d6f20c3a96f6f6f6fc3a920f09f9a80c3a96ff09f9a80c3a9c3a96f6f4d6f20f09f9a806f00000000000000000000000000000000000000000000000000000000000000000040fffffffffffffffffffffffffffffffffffffffffffffffffffff09986128e3b00000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80206ff09f9a80206f6f6f6ff09f9a806f206f4d6f4d4dc3a9c3a9c3a90000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((uint144,bool,bytes20),string,int,int16)[1][1]", + "type": "((uint144,bool,bytes20),string,int,int16)[1][1]", + "value": [ + [ + [ + [ + "9067031755659053629863433810711894300579225", + true, + "0x40aa6de8ac26d649a170a275baea07a619d16a67" + ], + "Moo é🚀🚀oééé o oMMéoo 🚀", + "28567295210658483976346150023327666654338466931537304496409687859866850055607", + "-17301" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "9067031755659053629863433810711894300579225" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x40aa6de8ac26d649a170a275baea07a619d16a67" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oééé o oMMéoo 🚀" + }, + { + "type": "number", + "value": "28567295210658483976346150023327666654338466931537304496409687859866850055607" + }, + { + "type": "number", + "value": "-17301" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610341806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101be565b60405180910390f35b610056610137565b61005e610137565b610066610164565b6040805160e08101825260006080820181815260a0830182905260c08301829052825260606020808401829052838501839052818401839052845180830186527168159c8c7e4dc68eb5677214f97d257c559981526001818301527340aa6de8ac26d649a170a275baea07a619d16a6760601b818701528452845191820190945260248082529293919290916102e8908301396020830152507f3f28841f09ed54d68b78c0498add0a099b4a78a053e3a3ce658d2c79e79c55b7604082015261439419606082015281528152919050565b60405180602001604052806001905b61014e610164565b8152602001906001900390816101465790505090565b60405180602001604052806001905b6040805160e08101825260006080820181815260a0830182905260c0830182905282526060602080840182905293830182905282015282526000199092019101816101735790505090565b6020808252600090604083820181850186855b60018082106101e057506102da565b601f198985038101865283518589810160005b858110156102c35788820383528351805171ffffffffffffffffffffffffffffffffffff81511684528d81015115158e8501526bffffffffffffffffffffffff198d820151168d850152508c81015160c0606085015280518060c086015260005b81811015610273578f818401015160e082880101528f81019050610254565b8181111561028557600060e083880101525b508d8301516080860152606083015192506102a560a086018460010b9052565b958e0195948e0194601f0187169390930160e00192505085016101f3565b50978a0197965050509287019250506001016101d1565b509097965050505050505056fe4d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a9c3a9206f206f4d4dc3a96f6f20f09f9a80a2646970667358221220271698aa28d08e89e77d3227004956f1ed61e185e3d674cac6526cbece7e691964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_85819eb0 {\n uint144 s_0;\n bool s_1;\n bytes20 s_2;\n }\n\n struct S_f43f3659 {\n S_85819eb0 s_0;\n string s_1;\n int256 s_2;\n int16 s_3;\n }\n\n function test () public pure returns (S_f43f3659[1][1] memory) {\n S_f43f3659[1][1] memory r;\n {\n S_f43f3659[1] memory r_0;\n {\n S_f43f3659 memory r_0_0;\n {\n S_85819eb0 memory r_0_0_0;\n {\n uint144 r_0_0_0_0 = 9067031755659053629863433810711894300579225;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n bool r_0_0_0_1 = true;\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n bytes20 r_0_0_0_2 = bytes20(0x40aa6De8aC26D649A170A275BaEA07A619d16A67);\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀🚀oééé o oMMéoo 🚀\";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n int r_0_0_2 = 28567295210658483976346150023327666654338466931537304496409687859866850055607;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n int16 r_0_0_3 = -17301;\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000068159c8c7e4dc68eb5677214f97d257c5599000000000000000000000000000000000000000000000000000000000000000140aa6de8ac26d649a170a275baea07a619d16a6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c03f28841f09ed54d68b78c0498add0a099b4a78a053e3a3ce658d2c79e79c55b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc6b00000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a9c3a9206f206f4d4dc3a96f6f20f09f9a8000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((uint88,(address,bytes9),string),bool,address,bytes31,address)", + "type": "((uint88,(address,bytes9),string),bool,address,bytes31,address)", + "value": [ + [ + "194094331012047082963149864", + ["0xE8a4Fd8f48821a64deB241dcF147F78D9d9E3B3D", "0xe41b93499f9154ec0a"], + "Moo é🚀" + ], + true, + "0xB64C741ecB6dAfFcD30e6Fb5Ac0D41e4555c332B", + "0x1ff17aa091d42e8fb3f2a866c114a033a7a0d1ae3982ff754ed099fc8e0be5", + "0x1AFf2C5cDbA799c293F1e11B039D4D0a05f9ef44" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "194094331012047082963149864" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE8a4Fd8f48821a64deB241dcF147F78D9d9E3B3D" + }, + { + "type": "hexstring", + "value": "0xe41b93499f9154ec0a" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xB64C741ecB6dAfFcD30e6Fb5Ac0D41e4555c332B" + }, + { + "type": "hexstring", + "value": "0x1ff17aa091d42e8fb3f2a866c114a033a7a0d1ae3982ff754ed099fc8e0be5" + }, + { + "type": "address", + "value": "0x1AFf2C5cDbA799c293F1e11B039D4D0a05f9ef44" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102e3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101b6565b60405180910390f35b61005661013b565b61005e61013b565b610066610170565b6aa08d12c47c21c743a52428815260408051808201825273e8a4fd8f48821a64deb241dcf147f78d9d9e3b3d815268720dc9a4cfc8aa760560b91b6020808301919091528084019190915281518083018352600a8152689adede418753e13f3560b71b818301528284015291835260019183019190915273b64c741ecb6daffcd30e6fb5ac0d41e4555c332b908201527f1ff17aa091d42e8fb3f2a866c114a033a7a0d1ae3982ff754ed099fc8e0be5006060820152731aff2c5cdba799c293f1e11b039d4d0a05f9ef446080820152919050565b6040518060a0016040528061014e610170565b8152600060208201819052604082018190526060820181905260809091015290565b604051806060016040528060006affffffffffffffffffffff1681526020016101a9604080518082019091526000808252602082015290565b8152602001606081525090565b6020808252825160a08383015280516affffffffffffffffffffff1660c08401528082015180516001600160a01b031660e08501528201516001600160b81b031916610100840152604001516080610120840152805161014084018190526000929190835b81811015610238578281018401518682016101600152830161021b565b8181111561024b57600061016083880101525b509185015180151560408601529160408601516001600160a01b03811660608701529250606086015160ff1981166080870152925060808601516001600160a01b03811660a08701529250601f01601f1916939093016101600194935050505056fea2646970667358221220e11d8d5511bc4c1386d6e797c347fda0512852c0dc82ab5697bf5529a9fb5c1d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_001e72ea {\n address s_0;\n bytes9 s_1;\n }\n\n struct S_c146c6d7 {\n uint88 s_0;\n S_001e72ea s_1;\n string s_2;\n }\n\n struct S_8ff10bdd {\n S_c146c6d7 s_0;\n bool s_1;\n address s_2;\n bytes31 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_8ff10bdd memory) {\n S_8ff10bdd memory r;\n {\n S_c146c6d7 memory r_0;\n {\n uint88 r_0_0 = 194094331012047082963149864;\n r_0.s_0 = r_0_0;\n }\n {\n S_001e72ea memory r_0_1;\n {\n address r_0_1_0 = 0xE8a4Fd8f48821a64deB241dcF147F78D9d9E3B3D;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bytes9 r_0_1_1 = bytes9(0xe41b93499f9154ec0a);\n r_0_1.s_1 = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀\";\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xB64C741ecB6dAfFcD30e6Fb5Ac0D41e4555c332B;\n r.s_2 = r_2;\n }\n {\n bytes31 r_3 = bytes31(0x1ff17aa091d42e8fb3f2a866c114a033a7a0d1ae3982ff754ed099fc8e0be5);\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x1AFf2C5cDbA799c293F1e11B039D4D0a05f9ef44;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b64c741ecb6daffcd30e6fb5ac0d41e4555c332b1ff17aa091d42e8fb3f2a866c114a033a7a0d1ae3982ff754ed099fc8e0be5000000000000000000000000001aff2c5cdba799c293f1e11b039d4d0a05f9ef44000000000000000000000000000000000000000000a08d12c47c21c743a52428000000000000000000000000e8a4fd8f48821a64deb241dcf147f78d9d9e3b3de41b93499f9154ec0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,(((uint24),bytes9,bool),string[1])[4],bool)", + "type": "(address,(((uint24),bytes9,bool),string[1])[4],bool)", + "value": [ + "0x66bA5a206957cf524c500F1135b1e78f48bd04e7", + [ + [ + [["13339457"], "0x67b983826b98c2a99d", false], + ["Moo é🚀é ééo🚀🚀 🚀o M🚀🚀🚀éM🚀éééM 🚀🚀o🚀o🚀MMé éoMooMoMM🚀 oo o"] + ], + [ + [["13131039"], "0x0fb45b08971f7387ec", false], + ["Moo é🚀oMoMMéé oM🚀oéMo éoM oé M ééé🚀Mooéé🚀ooooooM"] + ], + [ + [["15844835"], "0xf654473c9801e41980", false], + ["Moo é🚀 🚀éMooM 🚀MM🚀oMo🚀M MoééMoéMMéMMM o🚀 éoo"] + ], + [ + [["5994685"], "0x3e56bea3ba21d5b9e0", false], + ["Moo é🚀oééo🚀 é🚀 oé🚀oooMM🚀 Mé🚀o oM🚀🚀éMoMoMo éo🚀🚀M é🚀oo Mo oo o🚀 "] + ] + ], + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x66bA5a206957cf524c500F1135b1e78f48bd04e7" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "13339457" + } + ] + }, + { + "type": "hexstring", + "value": "0x67b983826b98c2a99d" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é ééo🚀🚀 🚀o M🚀🚀🚀éM🚀éééM 🚀🚀o🚀o🚀MMé éoMooMoMM🚀 oo o" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "13131039" + } + ] + }, + { + "type": "hexstring", + "value": "0x0fb45b08971f7387ec" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMoMMéé oM🚀oéMo éoM oé M ééé🚀Mooéé🚀ooooooM" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "15844835" + } + ] + }, + { + "type": "hexstring", + "value": "0xf654473c9801e41980" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀éMooM 🚀MM🚀oMo🚀M MoééMoéMMéMMM o🚀 éoo" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5994685" + } + ] + }, + { + "type": "hexstring", + "value": "0x3e56bea3ba21d5b9e0" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oééo🚀 é🚀 oé🚀oooMM🚀 Mé🚀o oM🚀🚀éMoMoMo éo🚀🚀M é🚀oo Mo oo o🚀 " + } + ] + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061060f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061034f565b60405180910390f35b610056610292565b61005e610292565b7366ba5a206957cf524c500f1135b1e78f48bd04e7815261007d6102c2565b6100856102ef565b6040805160808101825260006060820181815282526020808301828152838501838152855192830190955262cb8b4182529083526867b983826b98c2a99d60b81b905290915281526100d5610328565b60006040518060a001604052806067815260200161057360679139825250602082015281526101026102ef565b6040805160808101825260006060820181815282526020808301828152838501838152855192830190955262c85d1f82529083526803ed16c225c7dce1fb60ba1b90529091528152610152610328565b60006040518060800160405280604c8152602001610475604c91398252506020828101919091528201526101846102ef565b6040805160808101825260006060820181815282526020808301828152838501838152855192830190955262f1c5e382529083526801eca88e793003c83360bf1b905290915281526101d4610328565b600060405180608001604052806046815260200161052d60469139825250602082015260408201526102046102ef565b60408051608081018252600060608201818152825260208083018281528385018381528551928301909552625b78bd82529083526801f2b5f51dd10eadcf60bd1b90529091528152610254610328565b60006040518060a00160405280606c81526020016104c1606c9139825250602082810191909152606083019190915282015260016040820152919050565b604051806060016040528060006001600160a01b031681526020016102b56102c2565b8152600060209091015290565b60405180608001604052806004905b6102d96102ef565b8152602001906001900390816102d15790505090565b6040805160c081018252600060a0820181815292820192835260608201819052608082015290815260208101610323610328565b905290565b60405180602001604052806001905b60608152602001906001900390816103375790505090565b602080825282516001600160a01b0316828201528281015160606040808501919091526000929160809161010086019190838701865b600481101561045557607f19898603810183528451805180515162ffffff168852898101516001600160b81b0319168a8901528501511515858801528801516060870188905260a0870188880160005b600181101561043e57848a84030182528351805180855260005b8181101561040d578e81840101518f82880101528e810190506103ef565b8181111561041e5760008f83880101525b50948d0194601f01601f1916939093018c019250908b01906001016103d5565b509097505050938701935090860190600101610385565b50508701518015156060880152935061046b9050565b9594505050505056fe4d6f6f20c3a9f09f9a806f4d6f4d4dc3a9c3a9206f4df09f9a806fc3a94d6f2020c3a96f4d206fc3a920204d20202020c3a9c3a9c3a9f09f9a804d6f6fc3a9c3a9f09f9a806f6f6f6f6f6f4d4d6f6f20c3a9f09f9a806fc3a9c3a96ff09f9a8020c3a9f09f9a8020206fc3a9f09f9a806f6f6f4d4df09f9a80204dc3a9f09f9a806f206f4df09f9a80f09f9a80c3a94d6f4d6f4d6f20c3a96ff09f9a80f09f9a804d20c3a9f09f9a806f6f204d6f206f6f206ff09f9a80204d6f6f20c3a9f09f9a8020f09f9a80c3a94d6f6f4d20f09f9a804d4df09f9a806f4d6ff09f9a804d204d6fc3a9c3a94d6fc3a94d4dc3a94d4d4d206ff09f9a802020c3a96f6f4d6f6f20c3a9f09f9a80c3a920c3a9c3a96ff09f9a80f09f9a8020f09f9a806f204df09f9a80f09f9a80f09f9a80c3a94df09f9a80c3a9c3a9c3a94d20f09f9a80f09f9a806ff09f9a806ff09f9a804d4dc3a920c3a96f4d6f6f4d6f4d4df09f9a80206f6f206fa264697066735822122062d429ecb7cd1b7a5609a99cd696f1db39dfba2e48bdfa69481da0d4d59dded964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5f492329 {\n uint24 s_0;\n }\n\n struct S_91d79ad1 {\n S_5f492329 s_0;\n bytes9 s_1;\n bool s_2;\n }\n\n struct S_7a2cbdac {\n S_91d79ad1 s_0;\n string[1] s_1;\n }\n\n struct S_68c90567 {\n address s_0;\n S_7a2cbdac[4] s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_68c90567 memory) {\n S_68c90567 memory r;\n {\n address r_0 = 0x66bA5a206957cf524c500F1135b1e78f48bd04e7;\n r.s_0 = r_0;\n }\n {\n S_7a2cbdac[4] memory r_1;\n {\n S_7a2cbdac memory r_1_0;\n {\n S_91d79ad1 memory r_1_0_0;\n {\n S_5f492329 memory r_1_0_0_0;\n {\n uint24 r_1_0_0_0_0 = 13339457;\n r_1_0_0_0.s_0 = r_1_0_0_0_0;\n }\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n bytes9 r_1_0_0_1 = bytes9(0x67b983826b98c2a99d);\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n bool r_1_0_0_2 = false;\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n string[1] memory r_1_0_1;\n {\n string memory r_1_0_1_0 = unicode\"Moo é🚀é ééo🚀🚀 🚀o M🚀🚀🚀éM🚀éééM 🚀🚀o🚀o🚀MMé éoMooMoMM🚀 oo o\";\n r_1_0_1[0] = r_1_0_1_0;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n {\n S_7a2cbdac memory r_1_1;\n {\n S_91d79ad1 memory r_1_1_0;\n {\n S_5f492329 memory r_1_1_0_0;\n {\n uint24 r_1_1_0_0_0 = 13131039;\n r_1_1_0_0.s_0 = r_1_1_0_0_0;\n }\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n bytes9 r_1_1_0_1 = bytes9(0x0fb45b08971f7387ec);\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n bool r_1_1_0_2 = false;\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n string[1] memory r_1_1_1;\n {\n string memory r_1_1_1_0 = unicode\"Moo é🚀oMoMMéé oM🚀oéMo éoM oé M ééé🚀Mooéé🚀ooooooM\";\n r_1_1_1[0] = r_1_1_1_0;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n r_1[1] = r_1_1;\n }\n {\n S_7a2cbdac memory r_1_2;\n {\n S_91d79ad1 memory r_1_2_0;\n {\n S_5f492329 memory r_1_2_0_0;\n {\n uint24 r_1_2_0_0_0 = 15844835;\n r_1_2_0_0.s_0 = r_1_2_0_0_0;\n }\n r_1_2_0.s_0 = r_1_2_0_0;\n }\n {\n bytes9 r_1_2_0_1 = bytes9(0xf654473c9801e41980);\n r_1_2_0.s_1 = r_1_2_0_1;\n }\n {\n bool r_1_2_0_2 = false;\n r_1_2_0.s_2 = r_1_2_0_2;\n }\n r_1_2.s_0 = r_1_2_0;\n }\n {\n string[1] memory r_1_2_1;\n {\n string memory r_1_2_1_0 = unicode\"Moo é🚀 🚀éMooM 🚀MM🚀oMo🚀M MoééMoéMMéMMM o🚀 éoo\";\n r_1_2_1[0] = r_1_2_1_0;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n r_1[2] = r_1_2;\n }\n {\n S_7a2cbdac memory r_1_3;\n {\n S_91d79ad1 memory r_1_3_0;\n {\n S_5f492329 memory r_1_3_0_0;\n {\n uint24 r_1_3_0_0_0 = 5994685;\n r_1_3_0_0.s_0 = r_1_3_0_0_0;\n }\n r_1_3_0.s_0 = r_1_3_0_0;\n }\n {\n bytes9 r_1_3_0_1 = bytes9(0x3e56bea3ba21d5b9e0);\n r_1_3_0.s_1 = r_1_3_0_1;\n }\n {\n bool r_1_3_0_2 = false;\n r_1_3_0.s_2 = r_1_3_0_2;\n }\n r_1_3.s_0 = r_1_3_0;\n }\n {\n string[1] memory r_1_3_1;\n {\n string memory r_1_3_1_0 = unicode\"Moo é🚀oééo🚀 é🚀 oé🚀oooMM🚀 Mé🚀o oM🚀🚀éMoMoMo éo🚀🚀M é🚀oo Mo oo o🚀 \";\n r_1_3_1[0] = r_1_3_1_0;\n }\n r_1_3.s_1 = r_1_3_1;\n }\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000066ba5a206957cf524c500f1135b1e78f48bd04e700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000cb8b4167b983826b98c2a99d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a80c3a920c3a9c3a96ff09f9a80f09f9a8020f09f9a806f204df09f9a80f09f9a80f09f9a80c3a94df09f9a80c3a9c3a9c3a94d20f09f9a80f09f9a806ff09f9a806ff09f9a804d4dc3a920c3a96f4d6f6f4d6f4d4df09f9a80206f6f206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c85d1f0fb45b08971f7387ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806f4d6f4d4dc3a9c3a9206f4df09f9a806fc3a94d6f2020c3a96f4d206fc3a920204d20202020c3a9c3a9c3a9f09f9a804d6f6fc3a9c3a9f09f9a806f6f6f6f6f6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c5e3f654473c9801e41980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a8020f09f9a80c3a94d6f6f4d20f09f9a804d4df09f9a806f4d6ff09f9a804d204d6fc3a9c3a94d6fc3a94d4dc3a94d4d4d206ff09f9a802020c3a96f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b78bd3e56bea3ba21d5b9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006c4d6f6f20c3a9f09f9a806fc3a9c3a96ff09f9a8020c3a9f09f9a8020206fc3a9f09f9a806f6f6f4d4df09f9a80204dc3a9f09f9a806f206f4df09f9a80f09f9a80c3a94d6f4d6f4d6f20c3a96ff09f9a80f09f9a804d20c3a9f09f9a806f6f204d6f206f6f206ff09f9a80200000000000000000000000000000000000000000" + }, + { + "name": "random-(address,(int216,uint200,uint96,uint200),bytes29,string[3])", + "type": "(address,(int216,uint200,uint96,uint200),bytes29,string[3])", + "value": [ + "0x678df334Ba8da0FD78688dcf7f8c3fBe23860677", + [ + "46290399045905366554812474880761640464388286707512864326073909930", + "1080570127304895424951836995658967530290187129649985549116866", + "66272978557032210643106346708", + "615014293309735869342754942219306179503794230942824001229351" + ], + "0x8350ed9a0e52228929fcc0bc778925beff10a9496328719a6727da5f50", + [ + "Moo é🚀oo é o 🚀o🚀🚀oéMo🚀o🚀MéoM 🚀é éMooM", + "Moo é🚀🚀MM🚀 éo o🚀oo M oé", + "Moo é🚀o🚀éé oMMMoo éo" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x678df334Ba8da0FD78688dcf7f8c3fBe23860677" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "46290399045905366554812474880761640464388286707512864326073909930" + }, + { + "type": "number", + "value": "1080570127304895424951836995658967530290187129649985549116866" + }, + { + "type": "number", + "value": "66272978557032210643106346708" + }, + { + "type": "number", + "value": "615014293309735869342754942219306179503794230942824001229351" + } + ] + }, + { + "type": "hexstring", + "value": "0x8350ed9a0e52228929fcc0bc778925beff10a9496328719a6727da5f50" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo é o 🚀o🚀🚀oéMo🚀o🚀MéoM 🚀é éMooM" + }, + { + "type": "string", + "value": "Moo é🚀🚀MM🚀 éo o🚀oo M oé" + }, + { + "type": "string", + "value": "Moo é🚀o🚀éé oMMMoo éo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103c7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610299565b60405180910390f35b6100566101a5565b61005e6101a5565b73678df334ba8da0fd78688dcf7f8c3fbe238606778152604080516080810182527a708696073f7d4e96131cec14cc38c68dc1134f6d70957fa98702aa815278ac250e870a54c15ae2d7351ff8b431c4ae0350b719371625c26020808301919091526bd623b9166e549e67582b36d4828401527861fa38d35c4d2fb89ae84a011daf0df023766c0b89978cd22760608301528301527f8350ed9a0e52228929fcc0bc778925beff10a9496328719a6727da5f50000000908201526101206101f0565b600060405180606001604052806040815260200161032a60409139825250604080516060810190915260288082526000919061036a60208301396020838101919091526040805180820182528281527f4d6f6f20c3a9f09f9a806ff09f9a80c3a9c3a920206f4d4d4d6f6f2020c3a96f92810192909252830152506060820152919050565b60408051608080820183526000808352835191820184528082526020828101829052938201819052606082015290918201908152600060208201526040016101eb6101f0565b905290565b60405180606001604052806003905b60608152602001906001900390816101ff5790505090565b60008260608101836000805b600381101561028d57848403885282518051808652835b818110156102565760208184018101518883018201520161023a565b818111156102675784602083890101525b506020998a0199601f91909101601f191695909501850194939093019250600101610223565b50919695505050505050565b602080825282516001600160a01b031682820152828101518051601a0b604080850191909152918101516001600160c81b03908116606080860191909152838301516bffffffffffffffffffffffff166080860152918201511660a08401529083015162ffffff191660c083015282015160e080830152600090610321610100840182610217565b94935050505056fe4d6f6f20c3a9f09f9a806f6f20c3a9206f20f09f9a806ff09f9a80f09f9a806fc3a94d6ff09f9a806ff09f9a804dc3a96f4d20f09f9a80c3a920c3a94d6f6f4d4d6f6f20c3a9f09f9a80f09f9a804d4df09f9a80202020c3a96f206ff09f9a806f6f204d206fc3a9a2646970667358221220194296423836e83bd21062c0f91c289d1045a99c87a49d2feb6763580f66701264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e3a4b216 {\n int216 s_0;\n uint200 s_1;\n uint96 s_2;\n uint200 s_3;\n }\n\n struct S_f79c2ea7 {\n address s_0;\n S_e3a4b216 s_1;\n bytes29 s_2;\n string[3] s_3;\n }\n\n function test () public pure returns (S_f79c2ea7 memory) {\n S_f79c2ea7 memory r;\n {\n address r_0 = 0x678df334Ba8da0FD78688dcf7f8c3fBe23860677;\n r.s_0 = r_0;\n }\n {\n S_e3a4b216 memory r_1;\n {\n int216 r_1_0 = 46290399045905366554812474880761640464388286707512864326073909930;\n r_1.s_0 = r_1_0;\n }\n {\n uint200 r_1_1 = 1080570127304895424951836995658967530290187129649985549116866;\n r_1.s_1 = r_1_1;\n }\n {\n uint96 r_1_2 = 66272978557032210643106346708;\n r_1.s_2 = r_1_2;\n }\n {\n uint200 r_1_3 = 615014293309735869342754942219306179503794230942824001229351;\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bytes29 r_2 = bytes29(0x8350ed9a0e52228929fcc0bc778925beff10a9496328719a6727da5f50);\n r.s_2 = r_2;\n }\n {\n string[3] memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀oo é o 🚀o🚀🚀oéMo🚀o🚀MéoM 🚀é éMooM\";\n r_3[0] = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀🚀MM🚀 éo o🚀oo M oé\";\n r_3[1] = r_3_1;\n }\n {\n string memory r_3_2 = unicode\"Moo é🚀o🚀éé oMMMoo éo\";\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000678df334ba8da0fd78688dcf7f8c3fbe238606770000000000708696073f7d4e96131cec14cc38c68dc1134f6d70957fa98702aa00000000000000ac250e870a54c15ae2d7351ff8b431c4ae0350b719371625c20000000000000000000000000000000000000000d623b9166e549e67582b36d40000000000000061fa38d35c4d2fb89ae84a011daf0df023766c0b89978cd2278350ed9a0e52228929fcc0bc778925beff10a9496328719a6727da5f5000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a806f6f20c3a9206f20f09f9a806ff09f9a80f09f9a806fc3a94d6ff09f9a806ff09f9a804dc3a96f4d20f09f9a80c3a920c3a94d6f6f4d00000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a80f09f9a804d4df09f9a80202020c3a96f206ff09f9a806f6f204d206fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a806ff09f9a80c3a9c3a920206f4d4d4d6f6f2020c3a96f" + }, + { + "name": "random-(address,address,bool[1],address,address[4])[3]", + "type": "(address,address,bool[1],address,address[4])[3]", + "value": [ + [ + "0x7ADcB8f70108492f1bf0a57984d266b9925a3DDa", + "0x8f0dDb76a929b33dd474988932cAa87d18a7a843", + [false], + "0x11904dEf965341dF82c34Af362439f18dAfC7e1E", + [ + "0x71C820ca0D4ee70dB5486A1d8271F97521501f23", + "0x3fCb4aA745472633921eA4a52bdfd28De73848f1", + "0x8Bb622E3114709d0E184558CF92B71f70a2f3b5b", + "0x41466EB5a2101Eac5C8796b80C6A2eE11c94BE87" + ] + ], + [ + "0xBFD64142737151eBdd34d9B500d591B93e98053E", + "0x8EED4Ec330B95eff212d5A6cAbf5bbfC78C9505b", + [true], + "0x8FceA37b332DFb49c312e09421C29370cF627Dde", + [ + "0x27ce5F5D2035F5d0d2edf35c5572B79F2E9D24B5", + "0x2A5cc186c0819F380770F6b413E0eF050696196A", + "0x52660Fb2E6c0fd0c5645926de8488935B305C52C", + "0x45Cb277888a15B24Fa4712a3E247650A126FbE1d" + ] + ], + [ + "0xdd998a25e81b2Fd8f5779D895E0D62aC206AB3CF", + "0x466360bD8D745E59FA4F834A0Ae027E55762968d", + [true], + "0xeAb861a90e2513bA57E5ef3d20e396C694b2Ec57", + [ + "0x5b7918F7B4962B1100245e073585dCC44A0CD66F", + "0x34bb9A405401DEDF14548029411b72ee6Ab4e8A4", + "0x7b6d866a8D19dD9e2a5386A6E2367C7D58ef4D17", + "0x8e76BF0cE5C99Fd803cDb5407096D45980644AE4" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x7ADcB8f70108492f1bf0a57984d266b9925a3DDa" + }, + { + "type": "address", + "value": "0x8f0dDb76a929b33dd474988932cAa87d18a7a843" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x11904dEf965341dF82c34Af362439f18dAfC7e1E" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x71C820ca0D4ee70dB5486A1d8271F97521501f23" + }, + { + "type": "address", + "value": "0x3fCb4aA745472633921eA4a52bdfd28De73848f1" + }, + { + "type": "address", + "value": "0x8Bb622E3114709d0E184558CF92B71f70a2f3b5b" + }, + { + "type": "address", + "value": "0x41466EB5a2101Eac5C8796b80C6A2eE11c94BE87" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xBFD64142737151eBdd34d9B500d591B93e98053E" + }, + { + "type": "address", + "value": "0x8EED4Ec330B95eff212d5A6cAbf5bbfC78C9505b" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x8FceA37b332DFb49c312e09421C29370cF627Dde" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x27ce5F5D2035F5d0d2edf35c5572B79F2E9D24B5" + }, + { + "type": "address", + "value": "0x2A5cc186c0819F380770F6b413E0eF050696196A" + }, + { + "type": "address", + "value": "0x52660Fb2E6c0fd0c5645926de8488935B305C52C" + }, + { + "type": "address", + "value": "0x45Cb277888a15B24Fa4712a3E247650A126FbE1d" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdd998a25e81b2Fd8f5779D895E0D62aC206AB3CF" + }, + { + "type": "address", + "value": "0x466360bD8D745E59FA4F834A0Ae027E55762968d" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xeAb861a90e2513bA57E5ef3d20e396C694b2Ec57" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x5b7918F7B4962B1100245e073585dCC44A0CD66F" + }, + { + "type": "address", + "value": "0x34bb9A405401DEDF14548029411b72ee6Ab4e8A4" + }, + { + "type": "address", + "value": "0x7b6d866a8D19dD9e2a5386A6E2367C7D58ef4D17" + }, + { + "type": "address", + "value": "0x8e76BF0cE5C99Fd803cDb5407096D45980644AE4" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104b7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103ce565b60405180910390f35b6100566102fb565b61005e6102fb565b610066610328565b737adcb8f70108492f1bf0a57984d266b9925a3dda8152738f0ddb76a929b33dd474988932caa87d18a7a843602082015261009f610360565b6000815260408201527311904def965341df82c34af362439f18dafc7e1e60608201526100ca61037e565b7371c820ca0d4ee70db5486a1d8271f97521501f238152733fcb4aa745472633921ea4a52bdfd28de73848f16020820152738bb622e3114709d0e184558cf92b71f70a2f3b5b60408201527341466eb5a2101eac5c8796b80c6a2ee11c94be8760608201526080820152815261013e610328565b73bfd64142737151ebdd34d9b500d591b93e98053e8152738eed4ec330b95eff212d5a6cabf5bbfc78c9505b6020820152610177610360565b600181526040820152738fcea37b332dfb49c312e09421c29370cf627dde60608201526101a261037e565b7327ce5f5d2035f5d0d2edf35c5572b79f2e9d24b58152732a5cc186c0819f380770f6b413e0ef050696196a6020808301919091527352660fb2e6c0fd0c5645926de8488935b305c52c60408301527345cb277888a15b24fa4712a3e247650a126fbe1d6060830152608083019190915282015261021e610328565b73dd998a25e81b2fd8f5779d895e0d62ac206ab3cf815273466360bd8d745e59fa4f834a0ae027e55762968d6020820152610257610360565b60018152604082015273eab861a90e2513ba57e5ef3d20e396c694b2ec57606082015261028261037e565b735b7918f7b4962b1100245e073585dcc44a0cd66f81527334bb9a405401dedf14548029411b72ee6ab4e8a46020820152737b6d866a8d19dd9e2a5386a6e2367c7d58ef4d17604080830191909152738e76bf0ce5c99fd803cdb5407096d45980644ae460608301526080830191909152820152919050565b60405180606001604052806003905b610312610328565b81526020019060019003908161030a5790505090565b6040805160a08101825260008082526020820152908101610347610360565b81526000602082015260400161035b61037e565b905290565b60405180602001604052806001906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156103c85781516001600160a01b03168452602093840193909101906001016103a0565b50505050565b610300810181836000805b600381101561047757825180516001600160a01b039081168652602080830151909116818701526040808301519087019190855b600181101561042c57815115158452928201929082019060010161040d565b5050606091508183015161044a838901826001600160a01b03169052565b506080928301519291506104608783018461039c565b6101009690960195949094019350506001016103d9565b505050509291505056fea26469706673582212207b030266c8e91a115445b83312fb9734218da39b89534377b10c03e23fc5b04164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7ad34f60 {\n address s_0;\n address s_1;\n bool[1] s_2;\n address s_3;\n address[4] s_4;\n }\n\n function test () public pure returns (S_7ad34f60[3] memory) {\n S_7ad34f60[3] memory r;\n {\n S_7ad34f60 memory r_0;\n {\n address r_0_0 = 0x7ADcB8f70108492f1bf0a57984d266b9925a3DDa;\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x8f0dDb76a929b33dd474988932cAa87d18a7a843;\n r_0.s_1 = r_0_1;\n }\n {\n bool[1] memory r_0_2;\n {\n bool r_0_2_0 = false;\n r_0_2[0] = r_0_2_0;\n }\n r_0.s_2 = r_0_2;\n }\n {\n address r_0_3 = 0x11904dEf965341dF82c34Af362439f18dAfC7e1E;\n r_0.s_3 = r_0_3;\n }\n {\n address[4] memory r_0_4;\n {\n address r_0_4_0 = 0x71C820ca0D4ee70dB5486A1d8271F97521501f23;\n r_0_4[0] = r_0_4_0;\n }\n {\n address r_0_4_1 = 0x3fCb4aA745472633921eA4a52bdfd28De73848f1;\n r_0_4[1] = r_0_4_1;\n }\n {\n address r_0_4_2 = 0x8Bb622E3114709d0E184558CF92B71f70a2f3b5b;\n r_0_4[2] = r_0_4_2;\n }\n {\n address r_0_4_3 = 0x41466EB5a2101Eac5C8796b80C6A2eE11c94BE87;\n r_0_4[3] = r_0_4_3;\n }\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_7ad34f60 memory r_1;\n {\n address r_1_0 = 0xBFD64142737151eBdd34d9B500d591B93e98053E;\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x8EED4Ec330B95eff212d5A6cAbf5bbfC78C9505b;\n r_1.s_1 = r_1_1;\n }\n {\n bool[1] memory r_1_2;\n {\n bool r_1_2_0 = true;\n r_1_2[0] = r_1_2_0;\n }\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0x8FceA37b332DFb49c312e09421C29370cF627Dde;\n r_1.s_3 = r_1_3;\n }\n {\n address[4] memory r_1_4;\n {\n address r_1_4_0 = 0x27ce5F5D2035F5d0d2edf35c5572B79F2E9D24B5;\n r_1_4[0] = r_1_4_0;\n }\n {\n address r_1_4_1 = 0x2A5cc186c0819F380770F6b413E0eF050696196A;\n r_1_4[1] = r_1_4_1;\n }\n {\n address r_1_4_2 = 0x52660Fb2E6c0fd0c5645926de8488935B305C52C;\n r_1_4[2] = r_1_4_2;\n }\n {\n address r_1_4_3 = 0x45Cb277888a15B24Fa4712a3E247650A126FbE1d;\n r_1_4[3] = r_1_4_3;\n }\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_7ad34f60 memory r_2;\n {\n address r_2_0 = 0xdd998a25e81b2Fd8f5779D895E0D62aC206AB3CF;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x466360bD8D745E59FA4F834A0Ae027E55762968d;\n r_2.s_1 = r_2_1;\n }\n {\n bool[1] memory r_2_2;\n {\n bool r_2_2_0 = true;\n r_2_2[0] = r_2_2_0;\n }\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0xeAb861a90e2513bA57E5ef3d20e396C694b2Ec57;\n r_2.s_3 = r_2_3;\n }\n {\n address[4] memory r_2_4;\n {\n address r_2_4_0 = 0x5b7918F7B4962B1100245e073585dCC44A0CD66F;\n r_2_4[0] = r_2_4_0;\n }\n {\n address r_2_4_1 = 0x34bb9A405401DEDF14548029411b72ee6Ab4e8A4;\n r_2_4[1] = r_2_4_1;\n }\n {\n address r_2_4_2 = 0x7b6d866a8D19dD9e2a5386A6E2367C7D58ef4D17;\n r_2_4[2] = r_2_4_2;\n }\n {\n address r_2_4_3 = 0x8e76BF0cE5C99Fd803cDb5407096D45980644AE4;\n r_2_4[3] = r_2_4_3;\n }\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000007adcb8f70108492f1bf0a57984d266b9925a3dda0000000000000000000000008f0ddb76a929b33dd474988932caa87d18a7a843000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011904def965341df82c34af362439f18dafc7e1e00000000000000000000000071c820ca0d4ee70db5486a1d8271f97521501f230000000000000000000000003fcb4aa745472633921ea4a52bdfd28de73848f10000000000000000000000008bb622e3114709d0e184558cf92b71f70a2f3b5b00000000000000000000000041466eb5a2101eac5c8796b80c6a2ee11c94be87000000000000000000000000bfd64142737151ebdd34d9b500d591b93e98053e0000000000000000000000008eed4ec330b95eff212d5a6cabf5bbfc78c9505b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000008fcea37b332dfb49c312e09421c29370cf627dde00000000000000000000000027ce5f5d2035f5d0d2edf35c5572b79f2e9d24b50000000000000000000000002a5cc186c0819f380770f6b413e0ef050696196a00000000000000000000000052660fb2e6c0fd0c5645926de8488935b305c52c00000000000000000000000045cb277888a15b24fa4712a3e247650a126fbe1d000000000000000000000000dd998a25e81b2fd8f5779d895e0d62ac206ab3cf000000000000000000000000466360bd8d745e59fa4f834a0ae027e55762968d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000eab861a90e2513ba57e5ef3d20e396c694b2ec570000000000000000000000005b7918f7b4962b1100245e073585dcc44a0cd66f00000000000000000000000034bb9a405401dedf14548029411b72ee6ab4e8a40000000000000000000000007b6d866a8d19dd9e2a5386a6e2367c7d58ef4d170000000000000000000000008e76bf0ce5c99fd803cdb5407096d45980644ae4" + }, + { + "name": "random-(address,bytes13[4],(int224,int48,string,address)[3])", + "type": "(address,bytes13[4],(int224,int48,string,address)[3])", + "value": [ + "0x0Ab7f4c6136b548CB879794bBA7705EE97eCa4b0", + [ + "0x413852dafbc99e9b3ff5e2f676", + "0xe3207d8450f7053eb7ae18f37b", + "0xc86e1d81f0c9fda8ba09e492a4", + "0x2805819342c571073243efb1c5" + ], + [ + [ + "-9126611069876381136405307087252671529711504088487379034355811254555", + "22648470963180", + "Moo é🚀Moé🚀🚀M", + "0x668B02c4aBebe4EaA8c40E248F2973198A86de60" + ], + [ + "-6847962842297952587977242037022751437766005526662635720830195357826", + "56716923755462", + "Moo é🚀oM🚀 ééMoo 🚀MoéoMMéM🚀 ooo🚀éMM🚀é🚀oooo ", + "0x2C388C7e57AbE7F0632Cc4E262D704FA2F288d34" + ], + [ + "9396533063052311062202573379054850815756278619986607236313145615487", + "-131765720050511", + "Moo é🚀 o🚀oé 🚀", + "0x355Bde9CDF9d696498e0ccec29d1d82f7926991E" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0Ab7f4c6136b548CB879794bBA7705EE97eCa4b0" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x413852dafbc99e9b3ff5e2f676" + }, + { + "type": "hexstring", + "value": "0xe3207d8450f7053eb7ae18f37b" + }, + { + "type": "hexstring", + "value": "0xc86e1d81f0c9fda8ba09e492a4" + }, + { + "type": "hexstring", + "value": "0x2805819342c571073243efb1c5" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-9126611069876381136405307087252671529711504088487379034355811254555" + }, + { + "type": "number", + "value": "22648470963180" + }, + { + "type": "string", + "value": "Moo é🚀Moé🚀🚀M" + }, + { + "type": "address", + "value": "0x668B02c4aBebe4EaA8c40E248F2973198A86de60" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-6847962842297952587977242037022751437766005526662635720830195357826" + }, + { + "type": "number", + "value": "56716923755462" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀 ééMoo 🚀MoéoMMéM🚀 ooo🚀éMM🚀é🚀oooo " + }, + { + "type": "address", + "value": "0x2C388C7e57AbE7F0632Cc4E262D704FA2F288d34" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "9396533063052311062202573379054850815756278619986607236313145615487" + }, + { + "type": "number", + "value": "-131765720050511" + }, + { + "type": "string", + "value": "Moo é🚀 o🚀oé 🚀" + }, + { + "type": "address", + "value": "0x355Bde9CDF9d696498e0ccec29d1d82f7926991E" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610358565b60405180910390f35b6100566102be565b61005e6102be565b730ab7f4c6136b548cb879794bba7705ee97eca4b0815261007d6102f3565b6c209c296d7de4cf4d9ffaf17b3b60991b81526ce3207d8450f7053eb7ae18f37b60981b6020808301919091526c321b87607c327f6a2e827924a9609a1b60408301526c2805819342c571073243efb1c560981b60608301528201526100e1610311565b6040805160808082018352606082840181815260008285018181527fffffffffa9566ffcda515ea1a66ac6083119dc7a448297515184b7f971f77ee58652651499421103ec60208088019190915287518089018952601781527f4d6f6f20c3a9f09f9a804d6fc3a9f09f9a80f09f9a804d0000000000000000008183015290935273668b02c4abebe4eaa8c40e248f2973198a86de609052938652845180840186528086018390529182018490527fffffffffbef98642d1e878a89a9d05f520991af1688bf6a287a5b82c0d8ba77e82526533957017dbc68282015284519283019094526048808352909361047f90830139604083015250732c388c7e57abe7f0632cc4e262d704fa2f288d346060820152808260016020020152506102286040805160808101825260008082526020820181905260609282018390529181019190915290565b7b5939b4e18b31c55406a9d344a7be443c825e244aafb956595dcb247f81526577d718efeb4e19602080830191909152604080518082018252601881527f4d6f6f20c3a9f09f9a80206ff09f9a806fc3a920f09f9a8000000000000000009281019290925282015273355bde9cdf9d696498e0ccec29d1d82f7926991e6060820152808260026020020152506040820152919050565b604051806060016040528060006001600160a01b031681526020016102e16102f3565b81526020016102ee610311565b905290565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003905b604080516080810182526000808252602080830182905260609383018490529282015282526000199092019101816103205790505090565b602080825282516001600160a01b031682820152828101516000919060e08401906040808601855b60048110156103b357835172ffffffffffffffffffffffffffffffffffffff191682529285019290850190600101610380565b50508681015160c08781015261014087019390925060005b60038110156104715760df19888603018252835160808151601b0b87528782015160050b88880152848201518186890152805180838a0152600092505b80831015610426578183018a015189840160a0015291890191610408565b8083111561043857600060a0828b0101525b6060938401516001600160a01b0381168a860152939250601f01601f19169790970160a0019650505092850192908501906001016103cb565b509297965050505050505056fe4d6f6f20c3a9f09f9a806f4df09f9a8020c3a9c3a94d6f6f20f09f9a804d6fc3a96f4d4dc3a94df09f9a80206f6f6ff09f9a80c3a94d4df09f9a80c3a9f09f9a806f6f6f6f202020a264697066735822122023afbc090a2bb33131268414e3e42648ec9f24b8d90b1f382ade6279833e963864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_769da6ae {\n int224 s_0;\n int48 s_1;\n string s_2;\n address s_3;\n }\n\n struct S_574855bd {\n address s_0;\n bytes13[4] s_1;\n S_769da6ae[3] s_2;\n }\n\n function test () public pure returns (S_574855bd memory) {\n S_574855bd memory r;\n {\n address r_0 = 0x0Ab7f4c6136b548CB879794bBA7705EE97eCa4b0;\n r.s_0 = r_0;\n }\n {\n bytes13[4] memory r_1;\n {\n bytes13 r_1_0 = bytes13(0x413852dafbc99e9b3ff5e2f676);\n r_1[0] = r_1_0;\n }\n {\n bytes13 r_1_1 = bytes13(0xe3207d8450f7053eb7ae18f37b);\n r_1[1] = r_1_1;\n }\n {\n bytes13 r_1_2 = bytes13(0xc86e1d81f0c9fda8ba09e492a4);\n r_1[2] = r_1_2;\n }\n {\n bytes13 r_1_3 = bytes13(0x2805819342c571073243efb1c5);\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n S_769da6ae[3] memory r_2;\n {\n S_769da6ae memory r_2_0;\n {\n int224 r_2_0_0 = -9126611069876381136405307087252671529711504088487379034355811254555;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n int48 r_2_0_1 = 22648470963180;\n r_2_0.s_1 = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀Moé🚀🚀M\";\n r_2_0.s_2 = r_2_0_2;\n }\n {\n address r_2_0_3 = 0x668B02c4aBebe4EaA8c40E248F2973198A86de60;\n r_2_0.s_3 = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n {\n S_769da6ae memory r_2_1;\n {\n int224 r_2_1_0 = -6847962842297952587977242037022751437766005526662635720830195357826;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n int48 r_2_1_1 = 56716923755462;\n r_2_1.s_1 = r_2_1_1;\n }\n {\n string memory r_2_1_2 = unicode\"Moo é🚀oM🚀 ééMoo 🚀MoéoMMéM🚀 ooo🚀éMM🚀é🚀oooo \";\n r_2_1.s_2 = r_2_1_2;\n }\n {\n address r_2_1_3 = 0x2C388C7e57AbE7F0632Cc4E262D704FA2F288d34;\n r_2_1.s_3 = r_2_1_3;\n }\n r_2[1] = r_2_1;\n }\n {\n S_769da6ae memory r_2_2;\n {\n int224 r_2_2_0 = 9396533063052311062202573379054850815756278619986607236313145615487;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n int48 r_2_2_1 = -131765720050511;\n r_2_2.s_1 = r_2_2_1;\n }\n {\n string memory r_2_2_2 = unicode\"Moo é🚀 o🚀oé 🚀\";\n r_2_2.s_2 = r_2_2_2;\n }\n {\n address r_2_2_3 = 0x355Bde9CDF9d696498e0ccec29d1d82f7926991E;\n r_2_2.s_3 = r_2_2_3;\n }\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000ab7f4c6136b548cb879794bba7705ee97eca4b0413852dafbc99e9b3ff5e2f67600000000000000000000000000000000000000e3207d8450f7053eb7ae18f37b00000000000000000000000000000000000000c86e1d81f0c9fda8ba09e492a4000000000000000000000000000000000000002805819342c571073243efb1c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000220ffffffffa9566ffcda515ea1a66ac6083119dc7a448297515184b7f971f77ee500000000000000000000000000000000000000000000000000001499421103ec0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000668b02c4abebe4eaa8c40e248f2973198a86de6000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a804d6fc3a9f09f9a80f09f9a804d000000000000000000ffffffffbef98642d1e878a89a9d05f520991af1688bf6a287a5b82c0d8ba77e000000000000000000000000000000000000000000000000000033957017dbc600000000000000000000000000000000000000000000000000000000000000800000000000000000000000002c388c7e57abe7f0632cc4e262d704fa2f288d3400000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a806f4df09f9a8020c3a9c3a94d6f6f20f09f9a804d6fc3a96f4d4dc3a94df09f9a80206f6f6ff09f9a80c3a94d4df09f9a80c3a9f09f9a806f6f6f6f202020000000000000000000000000000000000000000000000000000000005939b4e18b31c55406a9d344a7be443c825e244aafb956595dcb247fffffffffffffffffffffffffffffffffffffffffffffffffffff8828e71014b10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000355bde9cdf9d696498e0ccec29d1d82f7926991e00000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80206ff09f9a806fc3a920f09f9a800000000000000000" + }, + { + "name": "random-(address,bytes30[1],(bool,bytes27,address,bytes12,bytes25))", + "type": "(address,bytes30[1],(bool,bytes27,address,bytes12,bytes25))", + "value": [ + "0xc7e079395B0597Aa1eB58508F341Ceeff3d7F429", + ["0x2e6506e38535aa293c97441f5d01c682a15c2ab2a91de0a3587bf5d8624f"], + [ + true, + "0x8c9fcacc88d97217c627e8658b5fb0517555c4296b4078e42ab7d7", + "0x8DC0a8751C03E3Cf909321d05AC89E6e788Fc56D", + "0xaab60fd703c5b4b49bd9a4d5", + "0x2bc4c71191380556f8f6524e7004ad53556fc97ea8b4a7c150" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xc7e079395B0597Aa1eB58508F341Ceeff3d7F429" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2e6506e38535aa293c97441f5d01c682a15c2ab2a91de0a3587bf5d8624f" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x8c9fcacc88d97217c627e8658b5fb0517555c4296b4078e42ab7d7" + }, + { + "type": "address", + "value": "0x8DC0a8751C03E3Cf909321d05AC89E6e788Fc56D" + }, + { + "type": "hexstring", + "value": "0xaab60fd703c5b4b49bd9a4d5" + }, + { + "type": "hexstring", + "value": "0x2bc4c71191380556f8f6524e7004ad53556fc97ea8b4a7c150" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ad565b60405180910390f35b61005661013b565b61005e61013b565b73c7e079395b0597aa1eb58508f341ceeff3d7f429815261007d61018f565b7f2e6506e38535aa293c97441f5d01c682a15c2ab2a91de0a3587bf5d8624f000081526020828101919091526040805160a081018252600181527f8c9fcacc88d97217c627e8658b5fb0517555c4296b4078e42ab7d7000000000092810192909252738dc0a8751c03e3cf909321d05ac89e6e788fc56d828201526baab60fd703c5b4b49bd9a4d560a01b60608301527f2bc4c71191380556f8f6524e7004ad53556fc97ea8b4a7c150000000000000006080830152820152919050565b604051806060016040528060006001600160a01b0316815260200161015e61018f565b81526040805160a0810182526000808252602082810182905292820181905260608201819052608082015291015290565b60405180602001604052806001906020820280368337509192915050565b81516001600160a01b03908116825260208084015160e0840192919081850160005b60018110156101f157825161ffff1916825291830191908301906001016101cf565b505050604085015180511515604086015264ffffffffff19828201511660608601528260408201511660808601526bffffffffffffffffffffffff60a01b60608201511660a086015266ffffffffffffff1960808201511660c08601525050509291505056fea264697066735822122025cbab7d1ae7d0abc58aeaf6b0187bf0887d663136c597d5702b43281f569ed564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f0c922af {\n bool s_0;\n bytes27 s_1;\n address s_2;\n bytes12 s_3;\n bytes25 s_4;\n }\n\n struct S_f19bba17 {\n address s_0;\n bytes30[1] s_1;\n S_f0c922af s_2;\n }\n\n function test () public pure returns (S_f19bba17 memory) {\n S_f19bba17 memory r;\n {\n address r_0 = 0xc7e079395B0597Aa1eB58508F341Ceeff3d7F429;\n r.s_0 = r_0;\n }\n {\n bytes30[1] memory r_1;\n {\n bytes30 r_1_0 = bytes30(0x2e6506e38535aa293c97441f5d01c682a15c2ab2a91de0a3587bf5d8624f);\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n S_f0c922af memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n {\n bytes27 r_2_1 = bytes27(0x8c9fcacc88d97217c627e8658b5fb0517555c4296b4078e42ab7d7);\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0x8DC0a8751C03E3Cf909321d05AC89E6e788Fc56D;\n r_2.s_2 = r_2_2;\n }\n {\n bytes12 r_2_3 = bytes12(0xaab60fd703c5b4b49bd9a4d5);\n r_2.s_3 = r_2_3;\n }\n {\n bytes25 r_2_4 = bytes25(0x2bc4c71191380556f8f6524e7004ad53556fc97ea8b4a7c150);\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000c7e079395b0597aa1eb58508f341ceeff3d7f4292e6506e38535aa293c97441f5d01c682a15c2ab2a91de0a3587bf5d8624f000000000000000000000000000000000000000000000000000000000000000000018c9fcacc88d97217c627e8658b5fb0517555c4296b4078e42ab7d700000000000000000000000000000000008dc0a8751c03e3cf909321d05ac89e6e788fc56daab60fd703c5b4b49bd9a4d500000000000000000000000000000000000000002bc4c71191380556f8f6524e7004ad53556fc97ea8b4a7c15000000000000000" + }, + { + "name": "random-(address[4],bytes2[3][],string[1],address)", + "type": "(address[4],bytes2[3][],string[1],address)", + "value": [ + [ + "0x429F85938ca127e4EcC8f1a34Dc526fa09C6B733", + "0x4237fdeb5C7C35DC55d9c1Bc2fEfE92DD971F2C3", + "0xd9f5eb7E674A820b7385650277FAf4fE937a5113", + "0xFf0f32FA02FA4568Df239E024d91a8396AeEdBde" + ], + [ + ["0x343e", "0xfd19", "0x6815"], + ["0xd90f", "0x2ec3", "0x04b5"], + ["0x7b98", "0x7204", "0xd31a"] + ], + ["Moo é🚀Mé🚀🚀MMM🚀🚀M🚀éMoo o🚀 ooo🚀M o🚀🚀éééM🚀🚀ooéoo🚀éMéo🚀🚀🚀o 🚀 Mé"], + "0x788820d6fb04A8329163eFFb01b103D5cDa887A1" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x429F85938ca127e4EcC8f1a34Dc526fa09C6B733" + }, + { + "type": "address", + "value": "0x4237fdeb5C7C35DC55d9c1Bc2fEfE92DD971F2C3" + }, + { + "type": "address", + "value": "0xd9f5eb7E674A820b7385650277FAf4fE937a5113" + }, + { + "type": "address", + "value": "0xFf0f32FA02FA4568Df239E024d91a8396AeEdBde" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x343e" + }, + { + "type": "hexstring", + "value": "0xfd19" + }, + { + "type": "hexstring", + "value": "0x6815" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd90f" + }, + { + "type": "hexstring", + "value": "0x2ec3" + }, + { + "type": "hexstring", + "value": "0x04b5" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7b98" + }, + { + "type": "hexstring", + "value": "0x7204" + }, + { + "type": "hexstring", + "value": "0xd31a" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mé🚀🚀MMM🚀🚀M🚀éMoo o🚀 ooo🚀M o🚀🚀éééM🚀🚀ooéoo🚀éMéo🚀🚀🚀o 🚀 Mé" + } + ] + }, + { + "type": "address", + "value": "0x788820d6fb04A8329163eFFb01b103D5cDa887A1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610509806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103b0565b60405180910390f35b610056610232565b61005e610232565b610066610266565b73429f85938ca127e4ecc8f1a34dc526fa09c6b7338152734237fdeb5c7c35dc55d9c1bc2fefe92dd971f2c3602082015273d9f5eb7e674a820b7385650277faf4fe937a511360408083019190915273ff0f32fa02fa4568df239e024d91a8396aeedbde60608301529082528051600380825260808201909252600091816020015b6100f0610284565b8152602001906001900390816100e857905050905061010d610284565b611a1f60f11b815261fd1960f01b602082015261681560f01b604082015281518190839060009061014057610140610445565b602002602001018190525050610154610284565b61d90f60f01b8152612ec360f01b60208201526104b560f01b6040820152815181908390600190811061018957610189610445565b60200260200101819052505061019d610284565b610f7360f31b8152611c8160f21b602082015261698d60f11b604082015281518190839060029081106101d2576101d2610445565b602002602001018190525050808260200181905250506101f06102a2565b60006040518060a001604052806078815260200161045c60789139825250604082015273788820d6fb04a8329163effb01b103d5cda887a16060820152919050565b6040518060800160405280610245610266565b8152602001606081526020016102596102a2565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b60405180602001604052806001905b60608152602001906001900390816102b15790505090565b60008151808452602080850194508084016000805b8481101561032857825188835b60038110156103125782516001600160f01b031916825291860191908601906001016102eb565b50505060609790970196918301916001016102de565b50959695505050505050565b6000826020808201846000805b60018110156103a357858403895282518051808652835b81811015610373578281018801518782018901528701610358565b8181111561038357848883890101525b5099860199601f01601f1916949094018501935091840191600101610341565b5091979650505050505050565b6020808252825160009190828483015b60048210156103e85782516001600160a01b03168152918301916001919091019083016103c0565b50505083015160e060a08401526104036101008401826102c9565b90506040840151601f198483030160c08501526104208282610334565b915050606084015161043d60e08501826001600160a01b03169052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804dc3a9f09f9a80f09f9a804d4d4df09f9a80f09f9a804df09f9a80c3a94d6f6f206ff09f9a80206f6f6ff09f9a804d206ff09f9a80f09f9a80c3a9c3a9c3a94df09f9a80f09f9a806f6fc3a96f6ff09f9a80c3a94dc3a96ff09f9a80f09f9a80f09f9a806f20f09f9a80204dc3a9a2646970667358221220eb4f363d5b28537b9202dad420c8efc7b15e74f6135cd3c113962d89c1b3545e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d24730a1 {\n address[4] s_0;\n bytes2[3][] s_1;\n string[1] s_2;\n address s_3;\n }\n\n function test () public pure returns (S_d24730a1 memory) {\n S_d24730a1 memory r;\n {\n address[4] memory r_0;\n {\n address r_0_0 = 0x429F85938ca127e4EcC8f1a34Dc526fa09C6B733;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0x4237fdeb5C7C35DC55d9c1Bc2fEfE92DD971F2C3;\n r_0[1] = r_0_1;\n }\n {\n address r_0_2 = 0xd9f5eb7E674A820b7385650277FAf4fE937a5113;\n r_0[2] = r_0_2;\n }\n {\n address r_0_3 = 0xFf0f32FA02FA4568Df239E024d91a8396AeEdBde;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bytes2[3][] memory r_1 = new bytes2[3][](3);\n {\n bytes2[3] memory r_1_0;\n {\n bytes2 r_1_0_0 = bytes2(0x343e);\n r_1_0[0] = r_1_0_0;\n }\n {\n bytes2 r_1_0_1 = bytes2(0xfd19);\n r_1_0[1] = r_1_0_1;\n }\n {\n bytes2 r_1_0_2 = bytes2(0x6815);\n r_1_0[2] = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n {\n bytes2[3] memory r_1_1;\n {\n bytes2 r_1_1_0 = bytes2(0xd90f);\n r_1_1[0] = r_1_1_0;\n }\n {\n bytes2 r_1_1_1 = bytes2(0x2ec3);\n r_1_1[1] = r_1_1_1;\n }\n {\n bytes2 r_1_1_2 = bytes2(0x04b5);\n r_1_1[2] = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n {\n bytes2[3] memory r_1_2;\n {\n bytes2 r_1_2_0 = bytes2(0x7b98);\n r_1_2[0] = r_1_2_0;\n }\n {\n bytes2 r_1_2_1 = bytes2(0x7204);\n r_1_2[1] = r_1_2_1;\n }\n {\n bytes2 r_1_2_2 = bytes2(0xd31a);\n r_1_2[2] = r_1_2_2;\n }\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n string[1] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀Mé🚀🚀MMM🚀🚀M🚀éMoo o🚀 ooo🚀M o🚀🚀éééM🚀🚀ooéoo🚀éMéo🚀🚀🚀o 🚀 Mé\";\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x788820d6fb04A8329163eFFb01b103D5cDa887A1;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000429f85938ca127e4ecc8f1a34dc526fa09c6b7330000000000000000000000004237fdeb5c7c35dc55d9c1bc2fefe92dd971f2c3000000000000000000000000d9f5eb7e674a820b7385650277faf4fe937a5113000000000000000000000000ff0f32fa02fa4568df239e024d91a8396aeedbde00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000788820d6fb04a8329163effb01b103d5cda887a10000000000000000000000000000000000000000000000000000000000000003343e000000000000000000000000000000000000000000000000000000000000fd190000000000000000000000000000000000000000000000000000000000006815000000000000000000000000000000000000000000000000000000000000d90f0000000000000000000000000000000000000000000000000000000000002ec300000000000000000000000000000000000000000000000000000000000004b50000000000000000000000000000000000000000000000000000000000007b980000000000000000000000000000000000000000000000000000000000007204000000000000000000000000000000000000000000000000000000000000d31a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000784d6f6f20c3a9f09f9a804dc3a9f09f9a80f09f9a804d4d4df09f9a80f09f9a804df09f9a80c3a94d6f6f206ff09f9a80206f6f6ff09f9a804d206ff09f9a80f09f9a80c3a9c3a9c3a94df09f9a80f09f9a806f6fc3a96f6ff09f9a80c3a94dc3a96ff09f9a80f09f9a80f09f9a806f20f09f9a80204dc3a90000000000000000" + }, + { + "name": "random-(bool,address,int88,uint48,(bytes31,bytes19,address[2]))", + "type": "(bool,address,int88,uint48,(bytes31,bytes19,address[2]))", + "value": [ + true, + "0xeDE8ba7fcDC88130acb0ca58a5AeFBE76f3A7Cd2", + "-31190037530491657538974414", + "121518225299482", + [ + "0xf34e1b5a19e8a2211ea407c8bbbce2a4b8101acaee87329f4e7d93c5eb81d5", + "0xe1fdb9ac537983c0317cfbb9defc1a2180b8ce", + [ + "0xB0F0AD8eb7638e8c47d6e16de32B64A509d8788F", + "0x9986954cba6fAa32Ba6eCC1678aDEA5e4AA681cd" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xeDE8ba7fcDC88130acb0ca58a5AeFBE76f3A7Cd2" + }, + { + "type": "number", + "value": "-31190037530491657538974414" + }, + { + "type": "number", + "value": "121518225299482" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf34e1b5a19e8a2211ea407c8bbbce2a4b8101acaee87329f4e7d93c5eb81d5" + }, + { + "type": "hexstring", + "value": "0xe1fdb9ac537983c0317cfbb9defc1a2180b8ce" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB0F0AD8eb7638e8c47d6e16de32B64A509d8788F" + }, + { + "type": "address", + "value": "0x9986954cba6fAa32Ba6eCC1678aDEA5e4AA681cd" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061026d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610197565b60405180910390f35b610056610129565b61005e610129565b6001815273ede8ba7fcdc88130acb0ca58a5aefbe76f3a7cd260208201526a19ccbf5290e0f2ff1f32cd196040820152656e852aa7181a60608201526100a261015e565b7ff34e1b5a19e8a2211ea407c8bbbce2a4b8101acaee87329f4e7d93c5eb81d50081527270fedcd629bcc1e018be7ddcef7e0d10c05c6760691b60208201526100e9610179565b73b0f0ad8eb7638e8c47d6e16de32b64a509d8788f8152739986954cba6faa32ba6ecc1678adea5e4aa681cd602082015260408201526080820152919050565b6040805160a08101825260008082526020820181905291810182905260608101919091526080810161015961015e565b905290565b60408051606081018252600080825260208201529081016101595b60405180604001604052806002906020820280368337509192915050565b8151151581526020808301516001600160a01b0390811682840152604080850151600a0b8185015260608086015165ffffffffffff1690850152608080860151805160ff191691860191909152808401516cffffffffffffffffffffffffff191660a086015201516101008401929160c0850160005b600281101561022c57835183168252928401929084019060010161020d565b50505050509291505056fea26469706673582212207a55f33f2ac64f2b54e7297afdee24ba22ba7c30c99c7af201adc1925423795064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1ab75875 {\n bytes31 s_0;\n bytes19 s_1;\n address[2] s_2;\n }\n\n struct S_6d1cd1af {\n bool s_0;\n address s_1;\n int88 s_2;\n uint48 s_3;\n S_1ab75875 s_4;\n }\n\n function test () public pure returns (S_6d1cd1af memory) {\n S_6d1cd1af memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xeDE8ba7fcDC88130acb0ca58a5AeFBE76f3A7Cd2;\n r.s_1 = r_1;\n }\n {\n int88 r_2 = -31190037530491657538974414;\n r.s_2 = r_2;\n }\n {\n uint48 r_3 = 121518225299482;\n r.s_3 = r_3;\n }\n {\n S_1ab75875 memory r_4;\n {\n bytes31 r_4_0 = bytes31(0xf34e1b5a19e8a2211ea407c8bbbce2a4b8101acaee87329f4e7d93c5eb81d5);\n r_4.s_0 = r_4_0;\n }\n {\n bytes19 r_4_1 = bytes19(0xe1fdb9ac537983c0317cfbb9defc1a2180b8ce);\n r_4.s_1 = r_4_1;\n }\n {\n address[2] memory r_4_2;\n {\n address r_4_2_0 = 0xB0F0AD8eb7638e8c47d6e16de32B64A509d8788F;\n r_4_2[0] = r_4_2_0;\n }\n {\n address r_4_2_1 = 0x9986954cba6fAa32Ba6eCC1678aDEA5e4AA681cd;\n r_4_2[1] = r_4_2_1;\n }\n r_4.s_2 = r_4_2;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ede8ba7fcdc88130acb0ca58a5aefbe76f3a7cd2ffffffffffffffffffffffffffffffffffffffffffe63340ad6f1f0d00e0cd3200000000000000000000000000000000000000000000000000006e852aa7181af34e1b5a19e8a2211ea407c8bbbce2a4b8101acaee87329f4e7d93c5eb81d500e1fdb9ac537983c0317cfbb9defc1a2180b8ce00000000000000000000000000000000000000000000000000b0f0ad8eb7638e8c47d6e16de32b64a509d8788f0000000000000000000000009986954cba6faa32ba6ecc1678adea5e4aa681cd" + }, + { + "name": "random-(bool,bool,address,(int232),(string,bool,address,string))", + "type": "(bool,bool,address,(int232),(string,bool,address,string))", + "value": [ + false, + false, + "0x06f59f18B7fEa5Fd52E4B2E5f03f77221c105aD7", + ["-2191239826171463835999864260595782095282645182998350600573926518541796"], + [ + "Moo é🚀 éMMoéMéoooo ééé🚀🚀éo éoMo🚀M é é Moé M🚀oMéoMé o", + true, + "0x183F69d4Bf76d7445edbD86d4CeCa9852a281DF5", + "Moo é🚀🚀oo éoo🚀éé🚀ooMM🚀 🚀oéé ééoéoé M" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x06f59f18B7fEa5Fd52E4B2E5f03f77221c105aD7" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-2191239826171463835999864260595782095282645182998350600573926518541796" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éMMoéMéoooo ééé🚀🚀éo éoMo🚀M é é Moé M🚀oMéoMé o" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x183F69d4Bf76d7445edbD86d4CeCa9852a281DF5" + }, + { + "type": "string", + "value": "Moo é🚀🚀oo éoo🚀éé🚀ooMM🚀 🚀oéé ééoéoé M" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610361806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101f5565b60405180910390f35b610056610152565b61005e610152565b600080825260208083018290527306f59f18b7fea5fd52e4b2e5f03f77221c105ad7604080850191909152805191820190529081527fffffffaeb8ef0c6d7efae679bfa1c338508bbacda261fdc0b27ef4abe408321c815260608083019190915260408051608081018252828152600060208201819052918101919091528082019190915260006040518060800160405280605181526020016102db60519139825250600160208083019190915273183f69d4bf76d7445edbd86d4ceca9852a281df5604080840191909152805160808101909152604180825260009261029a908301396060830152506080820152919050565b6040805160a0810182526000808252602080830182905282840182905283519081019093528252906060820190815260408051608081018252606080825260006020838101829052938301528082015291015290565b6000815180845260005b818110156101ce576020818501810151868301820152016101b2565b818111156101e0576000602083870101525b50601f01601f19169290920160200192915050565b602081528151151560208201526020820151151560408201526000604083015160018060a01b038082166060850152606085015151601c0b60808501526080850151915060a0808501528151608060c08601526102566101408601826101a8565b6020840151151560e08701526040840151831661010087015260609093015185840360bf190161012087015292905061028f81846101a8565b969550505050505056fe4d6f6f20c3a9f09f9a80f09f9a806f6f2020c3a96f6ff09f9a80c3a9c3a9f09f9a806f6f4d4df09f9a8020f09f9a806fc3a9c3a920c3a9c3a96fc3a96fc3a9204d4d6f6f20c3a9f09f9a8020c3a94d4d6fc3a94dc3a96f6f6f6f20c3a9c3a9c3a9f09f9a80f09f9a80c3a96f20c3a96f4d6ff09f9a804d20c3a920c3a9204d6fc3a9204df09f9a806f4dc3a96f4dc3a9206fa2646970667358221220873b0a72acba5c8e2137d20e83c63376e534742f757329d98a66ce5a013835b064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f2e9ab46 {\n int232 s_0;\n }\n\n struct S_a98a43f0 {\n string s_0;\n bool s_1;\n address s_2;\n string s_3;\n }\n\n struct S_5736ac91 {\n bool s_0;\n bool s_1;\n address s_2;\n S_f2e9ab46 s_3;\n S_a98a43f0 s_4;\n }\n\n function test () public pure returns (S_5736ac91 memory) {\n S_5736ac91 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x06f59f18B7fEa5Fd52E4B2E5f03f77221c105aD7;\n r.s_2 = r_2;\n }\n {\n S_f2e9ab46 memory r_3;\n {\n int232 r_3_0 = -2191239826171463835999864260595782095282645182998350600573926518541796;\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n {\n S_a98a43f0 memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀 éMMoéMéoooo ééé🚀🚀éo éoMo🚀M é é Moé M🚀oMéoMé o\";\n r_4.s_0 = r_4_0;\n }\n {\n bool r_4_1 = true;\n r_4.s_1 = r_4_1;\n }\n {\n address r_4_2 = 0x183F69d4Bf76d7445edbD86d4CeCa9852a281DF5;\n r_4.s_2 = r_4_2;\n }\n {\n string memory r_4_3 = unicode\"Moo é🚀🚀oo éoo🚀éé🚀ooMM🚀 🚀oéé ééoéoé M\";\n r_4.s_3 = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f59f18b7fea5fd52e4b2e5f03f77221c105ad7ffffffaeb8ef0c6d7efae679bfa1c338508bbacda261fdc0b27ef4abe408321c00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000183f69d4bf76d7445edbd86d4ceca9852a281df5000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a8020c3a94d4d6fc3a94dc3a96f6f6f6f20c3a9c3a9c3a9f09f9a80f09f9a80c3a96f20c3a96f4d6ff09f9a804d20c3a920c3a9204d6fc3a9204df09f9a806f4dc3a96f4dc3a9206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a80f09f9a806f6f2020c3a96f6ff09f9a80c3a9c3a9f09f9a806f6f4d4df09f9a8020f09f9a806fc3a9c3a920c3a9c3a96fc3a96fc3a9204d00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bool[4],bytes9,bool)[2][3][]", + "type": "(bool,bool[4],bytes9,bool)[2][3][]", + "value": [ + [ + [ + [false, [true, false, true, false], "0x96ad8ddaa9a0e39367", false], + [true, [true, false, true, true], "0x1133fe51ca1ec1dbee", true] + ], + [ + [true, [true, false, false, true], "0xb6869372b52f0ff435", false], + [false, [true, false, false, false], "0x8ec0cdce6a313bd580", true] + ], + [ + [false, [false, false, false, false], "0x3003c73ff9ae620622", false], + [true, [true, true, true, false], "0xe86f0d491f0b0122b2", true] + ] + ], + [ + [ + [false, [false, true, true, true], "0x21cbbb42532a4c86e5", false], + [false, [true, true, true, false], "0xff89c052b39a4884cd", true] + ], + [ + [true, [false, false, false, true], "0xa9c8b16e41efe4b497", false], + [false, [true, false, true, false], "0x2c803d726547d4d821", false] + ], + [ + [false, [true, true, false, true], "0x56f06cf467fb3f0898", false], + [false, [false, true, true, true], "0xe6a02c2290461fb337", false] + ] + ], + [ + [ + [false, [false, false, false, false], "0x8543d39ae5f81cfa96", false], + [true, [false, true, true, false], "0x24847046fded161afb", true] + ], + [ + [true, [true, true, false, false], "0x0e6fd069560e3f6047", true], + [false, [false, false, false, true], "0xb24d5885d6c01dc32c", false] + ], + [ + [false, [true, true, false, true], "0x7608da01a146ca8419", true], + [true, [false, true, true, true], "0x2ade9bed32ddfcf160", false] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x96ad8ddaa9a0e39367" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x1133fe51ca1ec1dbee" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xb6869372b52f0ff435" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x8ec0cdce6a313bd580" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x3003c73ff9ae620622" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xe86f0d491f0b0122b2" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x21cbbb42532a4c86e5" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xff89c052b39a4884cd" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xa9c8b16e41efe4b497" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x2c803d726547d4d821" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x56f06cf467fb3f0898" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xe6a02c2290461fb337" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x8543d39ae5f81cfa96" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x24847046fded161afb" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x0e6fd069560e3f6047" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xb24d5885d6c01dc32c" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x7608da01a146ca8419" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x2ade9bed32ddfcf160" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610947806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610819565b60405180910390f35b6040805160038082526080820190925260609160009190816020015b610072610771565b81526020019060019003908161006a57905050905061008f610771565b61009761079e565b61009f6107cb565b600081526100ab6107fb565b6001808252600060208084018290526040808501939093526060808501839052908501939093526896ad8ddaa9a0e3936760b81b918401919091529082015281526100f46107cb565b600181526101006107fb565b600180825260006020808401919091526040808401839052606080850184905285830194909452680899ff28e50f60edf760b91b9085015291830152820152815261014961079e565b6101516107cb565b6001815261015d6107fb565b60018082526000602080840182905260408085018390526060808601949094529085019390935268b6869372b52f0ff43560b81b9284019290925282015281526101a56107cb565b600081526101b16107fb565b60018082526000602080840182905260408085018390526060808601939093528582019490945268011d819b9cd46277ab60bf1b938501939093528301528281019190915282015261020161079e565b6102096107cb565b600081526102156107fb565b600080825260208083018290526040808401839052606080850184905291850193909352681801e39ffcd731031160b91b9284019290925290820152815261025b6107cb565b600181526102676107fb565b600180825260208083018290526040808401839052600060608086018290528684019590955268743786a48f8580915960b91b8683015293850192909252840192909252908301919091528251829184916102c4576102c46108fb565b6020026020010181905250506102d8610771565b6102e061079e565b6102e86107cb565b600081526102f46107fb565b6000808252600160208084018290526040808501839052606080860193909352908501939093526821cbbb42532a4c86e560b81b9284019290925290820152815261033d6107cb565b600081526103496107fb565b600180825260208083018290526040808401839052600060608086019190915285830194909452600167763fad4c65b77b3360b81b03199085015291830152820152815261039561079e565b61039d6107cb565b600181526103a96107fb565b60008082526020808301829052604080840183905260016060808601919091529185019390935268a9c8b16e41efe4b49760b81b928401929092529082015281526103f26107cb565b600081526103fe6107fb565b600180825260006020808401829052604080850193909352606080850183905285820194909452682c803d726547d4d82160b81b92850192909252918301919091528281019190915282015261045261079e565b61045a6107cb565b600081526104666107fb565b600180825260208083018290526000604080850182905260608086019490945291850193909352680ade0d9e8cff67e11360bb1b9084015282015281526104ab6107cb565b600081526104b76107fb565b600080825260016020808401829052604080850183905260608086018490528683019590955268e6a02c2290461fb33760b81b8682015293850192909252908401929092528301919091528251829184918110610516576105166108fb565b60200260200101819052505061052a610771565b61053261079e565b61053a6107cb565b600081526105466107fb565b6000808252602080830182905260408084018390526060808501849052918501939093526842a1e9cd72fc0e7d4b60b91b9284019290925290820152815261058c6107cb565b600181526105986107fb565b6000808252600160208084018290526040808501839052606080860194909452858201949094526824847046fded161afb60b81b938501939093529083015282015281526105e461079e565b6105ec6107cb565b600181526105f86107fb565b600180825260208083018290526000604080850182905260608086019290925291850193909352680e6fd069560e3f604760b81b9084015290820152815261063e6107cb565b6000815261064a6107fb565b600080825260208083018290526040808401839052600160608086019190915285830194909452682c93562175b00770cb60ba1b90850152918301528281019190915282015261069861079e565b6106a06107cb565b600081526106ac6107fb565b600180825260208083018290526000604080850191909152606080850184905291850193909352687608da01a146ca841960b81b928401929092529082015281526106f56107cb565b600181526107016107fb565b600080825260016020808401829052604080850183905260608086019390935285820194909452680156f4df6996efe78b60bd1b85850152908401919091528301919091528201528151819083906002908110610760576107606108fb565b602090810291909101015250919050565b60405180606001604052806003905b61078861079e565b8152602001906001900390816107805790505090565b60405180604001604052806002905b6107b56107cb565b8152602001906001900390816107ad5790505090565b60405180608001604052806000151581526020016107e76107fb565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b602080825282518282018190526000919060409081850190868401855b828110156108ee5781518460005b60038110156108d75782518260005b60028110156108c05782518051151583528c8101518d840160005b600481101561088d57825115158252918f0191908f019060010161086e565b505050808c01516001600160b81b03191660a084015260600151151560c0830152918b019160e090910190600101610853565b505050918801916101c09190910190600101610844565b505050610540939093019290850190600101610836565b5091979650505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212205dbf65779448669f7e245f4d63648ef8b88a8fee70126bfd28791ae8a3b52bd364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8a3363e1 {\n bool s_0;\n bool[4] s_1;\n bytes9 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_8a3363e1[2][3][] memory) {\n S_8a3363e1[2][3][] memory r = new S_8a3363e1[2][3][](3);\n {\n S_8a3363e1[2][3] memory r_0;\n {\n S_8a3363e1[2] memory r_0_0;\n {\n S_8a3363e1 memory r_0_0_0;\n {\n bool r_0_0_0_0 = false;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n bool[4] memory r_0_0_0_1;\n {\n bool r_0_0_0_1_0 = true;\n r_0_0_0_1[0] = r_0_0_0_1_0;\n }\n {\n bool r_0_0_0_1_1 = false;\n r_0_0_0_1[1] = r_0_0_0_1_1;\n }\n {\n bool r_0_0_0_1_2 = true;\n r_0_0_0_1[2] = r_0_0_0_1_2;\n }\n {\n bool r_0_0_0_1_3 = false;\n r_0_0_0_1[3] = r_0_0_0_1_3;\n }\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n bytes9 r_0_0_0_2 = bytes9(0x96ad8ddaa9a0e39367);\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n {\n bool r_0_0_0_3 = false;\n r_0_0_0.s_3 = r_0_0_0_3;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_8a3363e1 memory r_0_0_1;\n {\n bool r_0_0_1_0 = true;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n bool[4] memory r_0_0_1_1;\n {\n bool r_0_0_1_1_0 = true;\n r_0_0_1_1[0] = r_0_0_1_1_0;\n }\n {\n bool r_0_0_1_1_1 = false;\n r_0_0_1_1[1] = r_0_0_1_1_1;\n }\n {\n bool r_0_0_1_1_2 = true;\n r_0_0_1_1[2] = r_0_0_1_1_2;\n }\n {\n bool r_0_0_1_1_3 = true;\n r_0_0_1_1[3] = r_0_0_1_1_3;\n }\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n bytes9 r_0_0_1_2 = bytes9(0x1133fe51ca1ec1dbee);\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n {\n bool r_0_0_1_3 = true;\n r_0_0_1.s_3 = r_0_0_1_3;\n }\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n S_8a3363e1[2] memory r_0_1;\n {\n S_8a3363e1 memory r_0_1_0;\n {\n bool r_0_1_0_0 = true;\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n bool[4] memory r_0_1_0_1;\n {\n bool r_0_1_0_1_0 = true;\n r_0_1_0_1[0] = r_0_1_0_1_0;\n }\n {\n bool r_0_1_0_1_1 = false;\n r_0_1_0_1[1] = r_0_1_0_1_1;\n }\n {\n bool r_0_1_0_1_2 = false;\n r_0_1_0_1[2] = r_0_1_0_1_2;\n }\n {\n bool r_0_1_0_1_3 = true;\n r_0_1_0_1[3] = r_0_1_0_1_3;\n }\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n bytes9 r_0_1_0_2 = bytes9(0xb6869372b52f0ff435);\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n {\n bool r_0_1_0_3 = false;\n r_0_1_0.s_3 = r_0_1_0_3;\n }\n r_0_1[0] = r_0_1_0;\n }\n {\n S_8a3363e1 memory r_0_1_1;\n {\n bool r_0_1_1_0 = false;\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n bool[4] memory r_0_1_1_1;\n {\n bool r_0_1_1_1_0 = true;\n r_0_1_1_1[0] = r_0_1_1_1_0;\n }\n {\n bool r_0_1_1_1_1 = false;\n r_0_1_1_1[1] = r_0_1_1_1_1;\n }\n {\n bool r_0_1_1_1_2 = false;\n r_0_1_1_1[2] = r_0_1_1_1_2;\n }\n {\n bool r_0_1_1_1_3 = false;\n r_0_1_1_1[3] = r_0_1_1_1_3;\n }\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n bytes9 r_0_1_1_2 = bytes9(0x8ec0cdce6a313bd580);\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n {\n bool r_0_1_1_3 = true;\n r_0_1_1.s_3 = r_0_1_1_3;\n }\n r_0_1[1] = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n {\n S_8a3363e1[2] memory r_0_2;\n {\n S_8a3363e1 memory r_0_2_0;\n {\n bool r_0_2_0_0 = false;\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n bool[4] memory r_0_2_0_1;\n {\n bool r_0_2_0_1_0 = false;\n r_0_2_0_1[0] = r_0_2_0_1_0;\n }\n {\n bool r_0_2_0_1_1 = false;\n r_0_2_0_1[1] = r_0_2_0_1_1;\n }\n {\n bool r_0_2_0_1_2 = false;\n r_0_2_0_1[2] = r_0_2_0_1_2;\n }\n {\n bool r_0_2_0_1_3 = false;\n r_0_2_0_1[3] = r_0_2_0_1_3;\n }\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n {\n bytes9 r_0_2_0_2 = bytes9(0x3003c73ff9ae620622);\n r_0_2_0.s_2 = r_0_2_0_2;\n }\n {\n bool r_0_2_0_3 = false;\n r_0_2_0.s_3 = r_0_2_0_3;\n }\n r_0_2[0] = r_0_2_0;\n }\n {\n S_8a3363e1 memory r_0_2_1;\n {\n bool r_0_2_1_0 = true;\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n {\n bool[4] memory r_0_2_1_1;\n {\n bool r_0_2_1_1_0 = true;\n r_0_2_1_1[0] = r_0_2_1_1_0;\n }\n {\n bool r_0_2_1_1_1 = true;\n r_0_2_1_1[1] = r_0_2_1_1_1;\n }\n {\n bool r_0_2_1_1_2 = true;\n r_0_2_1_1[2] = r_0_2_1_1_2;\n }\n {\n bool r_0_2_1_1_3 = false;\n r_0_2_1_1[3] = r_0_2_1_1_3;\n }\n r_0_2_1.s_1 = r_0_2_1_1;\n }\n {\n bytes9 r_0_2_1_2 = bytes9(0xe86f0d491f0b0122b2);\n r_0_2_1.s_2 = r_0_2_1_2;\n }\n {\n bool r_0_2_1_3 = true;\n r_0_2_1.s_3 = r_0_2_1_3;\n }\n r_0_2[1] = r_0_2_1;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_8a3363e1[2][3] memory r_1;\n {\n S_8a3363e1[2] memory r_1_0;\n {\n S_8a3363e1 memory r_1_0_0;\n {\n bool r_1_0_0_0 = false;\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n bool[4] memory r_1_0_0_1;\n {\n bool r_1_0_0_1_0 = false;\n r_1_0_0_1[0] = r_1_0_0_1_0;\n }\n {\n bool r_1_0_0_1_1 = true;\n r_1_0_0_1[1] = r_1_0_0_1_1;\n }\n {\n bool r_1_0_0_1_2 = true;\n r_1_0_0_1[2] = r_1_0_0_1_2;\n }\n {\n bool r_1_0_0_1_3 = true;\n r_1_0_0_1[3] = r_1_0_0_1_3;\n }\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n bytes9 r_1_0_0_2 = bytes9(0x21cbbb42532a4c86e5);\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n {\n bool r_1_0_0_3 = false;\n r_1_0_0.s_3 = r_1_0_0_3;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n S_8a3363e1 memory r_1_0_1;\n {\n bool r_1_0_1_0 = false;\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n bool[4] memory r_1_0_1_1;\n {\n bool r_1_0_1_1_0 = true;\n r_1_0_1_1[0] = r_1_0_1_1_0;\n }\n {\n bool r_1_0_1_1_1 = true;\n r_1_0_1_1[1] = r_1_0_1_1_1;\n }\n {\n bool r_1_0_1_1_2 = true;\n r_1_0_1_1[2] = r_1_0_1_1_2;\n }\n {\n bool r_1_0_1_1_3 = false;\n r_1_0_1_1[3] = r_1_0_1_1_3;\n }\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n {\n bytes9 r_1_0_1_2 = bytes9(0xff89c052b39a4884cd);\n r_1_0_1.s_2 = r_1_0_1_2;\n }\n {\n bool r_1_0_1_3 = true;\n r_1_0_1.s_3 = r_1_0_1_3;\n }\n r_1_0[1] = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n {\n S_8a3363e1[2] memory r_1_1;\n {\n S_8a3363e1 memory r_1_1_0;\n {\n bool r_1_1_0_0 = true;\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n bool[4] memory r_1_1_0_1;\n {\n bool r_1_1_0_1_0 = false;\n r_1_1_0_1[0] = r_1_1_0_1_0;\n }\n {\n bool r_1_1_0_1_1 = false;\n r_1_1_0_1[1] = r_1_1_0_1_1;\n }\n {\n bool r_1_1_0_1_2 = false;\n r_1_1_0_1[2] = r_1_1_0_1_2;\n }\n {\n bool r_1_1_0_1_3 = true;\n r_1_1_0_1[3] = r_1_1_0_1_3;\n }\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n bytes9 r_1_1_0_2 = bytes9(0xa9c8b16e41efe4b497);\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n {\n bool r_1_1_0_3 = false;\n r_1_1_0.s_3 = r_1_1_0_3;\n }\n r_1_1[0] = r_1_1_0;\n }\n {\n S_8a3363e1 memory r_1_1_1;\n {\n bool r_1_1_1_0 = false;\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n {\n bool[4] memory r_1_1_1_1;\n {\n bool r_1_1_1_1_0 = true;\n r_1_1_1_1[0] = r_1_1_1_1_0;\n }\n {\n bool r_1_1_1_1_1 = false;\n r_1_1_1_1[1] = r_1_1_1_1_1;\n }\n {\n bool r_1_1_1_1_2 = true;\n r_1_1_1_1[2] = r_1_1_1_1_2;\n }\n {\n bool r_1_1_1_1_3 = false;\n r_1_1_1_1[3] = r_1_1_1_1_3;\n }\n r_1_1_1.s_1 = r_1_1_1_1;\n }\n {\n bytes9 r_1_1_1_2 = bytes9(0x2c803d726547d4d821);\n r_1_1_1.s_2 = r_1_1_1_2;\n }\n {\n bool r_1_1_1_3 = false;\n r_1_1_1.s_3 = r_1_1_1_3;\n }\n r_1_1[1] = r_1_1_1;\n }\n r_1[1] = r_1_1;\n }\n {\n S_8a3363e1[2] memory r_1_2;\n {\n S_8a3363e1 memory r_1_2_0;\n {\n bool r_1_2_0_0 = false;\n r_1_2_0.s_0 = r_1_2_0_0;\n }\n {\n bool[4] memory r_1_2_0_1;\n {\n bool r_1_2_0_1_0 = true;\n r_1_2_0_1[0] = r_1_2_0_1_0;\n }\n {\n bool r_1_2_0_1_1 = true;\n r_1_2_0_1[1] = r_1_2_0_1_1;\n }\n {\n bool r_1_2_0_1_2 = false;\n r_1_2_0_1[2] = r_1_2_0_1_2;\n }\n {\n bool r_1_2_0_1_3 = true;\n r_1_2_0_1[3] = r_1_2_0_1_3;\n }\n r_1_2_0.s_1 = r_1_2_0_1;\n }\n {\n bytes9 r_1_2_0_2 = bytes9(0x56f06cf467fb3f0898);\n r_1_2_0.s_2 = r_1_2_0_2;\n }\n {\n bool r_1_2_0_3 = false;\n r_1_2_0.s_3 = r_1_2_0_3;\n }\n r_1_2[0] = r_1_2_0;\n }\n {\n S_8a3363e1 memory r_1_2_1;\n {\n bool r_1_2_1_0 = false;\n r_1_2_1.s_0 = r_1_2_1_0;\n }\n {\n bool[4] memory r_1_2_1_1;\n {\n bool r_1_2_1_1_0 = false;\n r_1_2_1_1[0] = r_1_2_1_1_0;\n }\n {\n bool r_1_2_1_1_1 = true;\n r_1_2_1_1[1] = r_1_2_1_1_1;\n }\n {\n bool r_1_2_1_1_2 = true;\n r_1_2_1_1[2] = r_1_2_1_1_2;\n }\n {\n bool r_1_2_1_1_3 = true;\n r_1_2_1_1[3] = r_1_2_1_1_3;\n }\n r_1_2_1.s_1 = r_1_2_1_1;\n }\n {\n bytes9 r_1_2_1_2 = bytes9(0xe6a02c2290461fb337);\n r_1_2_1.s_2 = r_1_2_1_2;\n }\n {\n bool r_1_2_1_3 = false;\n r_1_2_1.s_3 = r_1_2_1_3;\n }\n r_1_2[1] = r_1_2_1;\n }\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_8a3363e1[2][3] memory r_2;\n {\n S_8a3363e1[2] memory r_2_0;\n {\n S_8a3363e1 memory r_2_0_0;\n {\n bool r_2_0_0_0 = false;\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n bool[4] memory r_2_0_0_1;\n {\n bool r_2_0_0_1_0 = false;\n r_2_0_0_1[0] = r_2_0_0_1_0;\n }\n {\n bool r_2_0_0_1_1 = false;\n r_2_0_0_1[1] = r_2_0_0_1_1;\n }\n {\n bool r_2_0_0_1_2 = false;\n r_2_0_0_1[2] = r_2_0_0_1_2;\n }\n {\n bool r_2_0_0_1_3 = false;\n r_2_0_0_1[3] = r_2_0_0_1_3;\n }\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n bytes9 r_2_0_0_2 = bytes9(0x8543d39ae5f81cfa96);\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n {\n bool r_2_0_0_3 = false;\n r_2_0_0.s_3 = r_2_0_0_3;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n S_8a3363e1 memory r_2_0_1;\n {\n bool r_2_0_1_0 = true;\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n {\n bool[4] memory r_2_0_1_1;\n {\n bool r_2_0_1_1_0 = false;\n r_2_0_1_1[0] = r_2_0_1_1_0;\n }\n {\n bool r_2_0_1_1_1 = true;\n r_2_0_1_1[1] = r_2_0_1_1_1;\n }\n {\n bool r_2_0_1_1_2 = true;\n r_2_0_1_1[2] = r_2_0_1_1_2;\n }\n {\n bool r_2_0_1_1_3 = false;\n r_2_0_1_1[3] = r_2_0_1_1_3;\n }\n r_2_0_1.s_1 = r_2_0_1_1;\n }\n {\n bytes9 r_2_0_1_2 = bytes9(0x24847046fded161afb);\n r_2_0_1.s_2 = r_2_0_1_2;\n }\n {\n bool r_2_0_1_3 = true;\n r_2_0_1.s_3 = r_2_0_1_3;\n }\n r_2_0[1] = r_2_0_1;\n }\n r_2[0] = r_2_0;\n }\n {\n S_8a3363e1[2] memory r_2_1;\n {\n S_8a3363e1 memory r_2_1_0;\n {\n bool r_2_1_0_0 = true;\n r_2_1_0.s_0 = r_2_1_0_0;\n }\n {\n bool[4] memory r_2_1_0_1;\n {\n bool r_2_1_0_1_0 = true;\n r_2_1_0_1[0] = r_2_1_0_1_0;\n }\n {\n bool r_2_1_0_1_1 = true;\n r_2_1_0_1[1] = r_2_1_0_1_1;\n }\n {\n bool r_2_1_0_1_2 = false;\n r_2_1_0_1[2] = r_2_1_0_1_2;\n }\n {\n bool r_2_1_0_1_3 = false;\n r_2_1_0_1[3] = r_2_1_0_1_3;\n }\n r_2_1_0.s_1 = r_2_1_0_1;\n }\n {\n bytes9 r_2_1_0_2 = bytes9(0x0e6fd069560e3f6047);\n r_2_1_0.s_2 = r_2_1_0_2;\n }\n {\n bool r_2_1_0_3 = true;\n r_2_1_0.s_3 = r_2_1_0_3;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n S_8a3363e1 memory r_2_1_1;\n {\n bool r_2_1_1_0 = false;\n r_2_1_1.s_0 = r_2_1_1_0;\n }\n {\n bool[4] memory r_2_1_1_1;\n {\n bool r_2_1_1_1_0 = false;\n r_2_1_1_1[0] = r_2_1_1_1_0;\n }\n {\n bool r_2_1_1_1_1 = false;\n r_2_1_1_1[1] = r_2_1_1_1_1;\n }\n {\n bool r_2_1_1_1_2 = false;\n r_2_1_1_1[2] = r_2_1_1_1_2;\n }\n {\n bool r_2_1_1_1_3 = true;\n r_2_1_1_1[3] = r_2_1_1_1_3;\n }\n r_2_1_1.s_1 = r_2_1_1_1;\n }\n {\n bytes9 r_2_1_1_2 = bytes9(0xb24d5885d6c01dc32c);\n r_2_1_1.s_2 = r_2_1_1_2;\n }\n {\n bool r_2_1_1_3 = false;\n r_2_1_1.s_3 = r_2_1_1_3;\n }\n r_2_1[1] = r_2_1_1;\n }\n r_2[1] = r_2_1;\n }\n {\n S_8a3363e1[2] memory r_2_2;\n {\n S_8a3363e1 memory r_2_2_0;\n {\n bool r_2_2_0_0 = false;\n r_2_2_0.s_0 = r_2_2_0_0;\n }\n {\n bool[4] memory r_2_2_0_1;\n {\n bool r_2_2_0_1_0 = true;\n r_2_2_0_1[0] = r_2_2_0_1_0;\n }\n {\n bool r_2_2_0_1_1 = true;\n r_2_2_0_1[1] = r_2_2_0_1_1;\n }\n {\n bool r_2_2_0_1_2 = false;\n r_2_2_0_1[2] = r_2_2_0_1_2;\n }\n {\n bool r_2_2_0_1_3 = true;\n r_2_2_0_1[3] = r_2_2_0_1_3;\n }\n r_2_2_0.s_1 = r_2_2_0_1;\n }\n {\n bytes9 r_2_2_0_2 = bytes9(0x7608da01a146ca8419);\n r_2_2_0.s_2 = r_2_2_0_2;\n }\n {\n bool r_2_2_0_3 = true;\n r_2_2_0.s_3 = r_2_2_0_3;\n }\n r_2_2[0] = r_2_2_0;\n }\n {\n S_8a3363e1 memory r_2_2_1;\n {\n bool r_2_2_1_0 = true;\n r_2_2_1.s_0 = r_2_2_1_0;\n }\n {\n bool[4] memory r_2_2_1_1;\n {\n bool r_2_2_1_1_0 = false;\n r_2_2_1_1[0] = r_2_2_1_1_0;\n }\n {\n bool r_2_2_1_1_1 = true;\n r_2_2_1_1[1] = r_2_2_1_1_1;\n }\n {\n bool r_2_2_1_1_2 = true;\n r_2_2_1_1[2] = r_2_2_1_1_2;\n }\n {\n bool r_2_2_1_1_3 = true;\n r_2_2_1_1[3] = r_2_2_1_1_3;\n }\n r_2_2_1.s_1 = r_2_2_1_1;\n }\n {\n bytes9 r_2_2_1_2 = bytes9(0x2ade9bed32ddfcf160);\n r_2_2_1.s_2 = r_2_2_1_2;\n }\n {\n bool r_2_2_1_3 = false;\n r_2_2_1.s_3 = r_2_2_1_3;\n }\n r_2_2[1] = r_2_2_1;\n }\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000096ad8ddaa9a0e3936700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000011133fe51ca1ec1dbee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b6869372b52f0ff43500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ec0cdce6a313bd58000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003003c73ff9ae6206220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000e86f0d491f0b0122b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000121cbbb42532a4c86e50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ff89c052b39a4884cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a9c8b16e41efe4b49700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002c803d726547d4d821000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000156f06cf467fb3f08980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001e6a02c2290461fb33700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008543d39ae5f81cfa96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000024847046fded161afb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6fd069560e3f60470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b24d5885d6c01dc32c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017608da01a146ca841900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012ade9bed32ddfcf16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bytes3,int136,bool,(bool,bool,uint136,uint))", + "type": "(bool,bytes3,int136,bool,(bool,bool,uint136,uint))", + "value": [ + true, + "0x339e63", + "12374745748996048229977306144222629440027", + false, + [ + false, + true, + "67295978687557300844875719912787490823192", + "10736773593506676465983813895005541221188707826064891186456915474231039337997" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x339e63" + }, + { + "type": "number", + "value": "12374745748996048229977306144222629440027" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "67295978687557300844875719912787490823192" + }, + { + "type": "number", + "value": "10736773593506676465983813895005541221188707826064891186456915474231039337997" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506101e3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b6100386100ba565b604080518251151581526020808401516001600160e81b031916818301528383015160100b82840152606080850151151581840152608094850151805115159584019590955290840151151560a08301529183015170ffffffffffffffffffffffffffffffffff1660c082015291015160e08201526101000160405180910390f35b6100c2610161565b6100ca610161565b600180825262339e6360e81b60208084019190915270245db956d6ed1e6ddc87ce3ba031a1aa1b604080850191909152600060608086018290528251608080820185529281529384019490945270c5c3de0c9334b7850b97186307fdf2dc18918301919091527f17bccc6a84070beb491faae19d812e50f75ac858f821b085de9aedb63b7fa60d9282019290925290820152919050565b6040805160a0810182526000808252602080830182905282840182905260608084018390528451608081810187528482529281018490529485018390528401919091529091908201529056fea2646970667358221220cb2fd958b4c956956b446acb56c0c4f4087cd2c48eea26150065f4d613f9f93c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d85d73d4 {\n bool s_0;\n bool s_1;\n uint136 s_2;\n uint256 s_3;\n }\n\n struct S_281ee545 {\n bool s_0;\n bytes3 s_1;\n int136 s_2;\n bool s_3;\n S_d85d73d4 s_4;\n }\n\n function test () public pure returns (S_281ee545 memory) {\n S_281ee545 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes3 r_1 = bytes3(0x339e63);\n r.s_1 = r_1;\n }\n {\n int136 r_2 = 12374745748996048229977306144222629440027;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n S_d85d73d4 memory r_4;\n {\n bool r_4_0 = false;\n r_4.s_0 = r_4_0;\n }\n {\n bool r_4_1 = true;\n r_4.s_1 = r_4_1;\n }\n {\n uint136 r_4_2 = 67295978687557300844875719912787490823192;\n r_4.s_2 = r_4_2;\n }\n {\n uint r_4_3 = 10736773593506676465983813895005541221188707826064891186456915474231039337997;\n r_4.s_3 = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001339e630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000245db956d6ed1e6ddc87ce3ba031a1aa1b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000c5c3de0c9334b7850b97186307fdf2dc1817bccc6a84070beb491faae19d812e50f75ac858f821b085de9aedb63b7fa60d" + }, + { + "name": "random-(bool[1],bytes19,bytes21,(address,bool,bytes8),bytes22)", + "type": "(bool[1],bytes19,bytes21,(address,bool,bytes8),bytes22)", + "value": [ + [true], + "0x032d82af63c2d077790354598cd194d920dadc", + "0xf9996b63587cb52c1c1c757ca7e8e302bb125a1f76", + ["0xf3a6D46e00d2c478C7277AcA05B03C06ae3649e4", true, "0x5b94c2c532f0f188"], + "0x9c0ee7d477f6df2fe3cbc09169bb6fe55edef1607e89" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x032d82af63c2d077790354598cd194d920dadc" + }, + { + "type": "hexstring", + "value": "0xf9996b63587cb52c1c1c757ca7e8e302bb125a1f76" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xf3a6D46e00d2c478C7277AcA05B03C06ae3649e4" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x5b94c2c532f0f188" + } + ] + }, + { + "type": "hexstring", + "value": "0x9c0ee7d477f6df2fe3cbc09169bb6fe55edef1607e89" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061027a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610181565b60405180910390f35b61005661010d565b61005e61010d565b610066610163565b600180825290825271cb60abd8f0b41dde40d516633465364836b7606a1b602080840191909152747cccb5b1ac3e5a960e0e3abe53f471815d892d0fbb60591b60408085019190915280516060808201835273f3a6d46e00d2c478c7277aca05b03c06ae3649e4825292810193909352670b729858a65e1e3160c31b90830152820152759c0ee7d477f6df2fe3cbc09169bb6fe55edef1607e8960501b6080820152919050565b6040518060a00160405280610120610163565b81526000602082018190526040820152606001610156604080516060810182526000808252602082018190529181019190915290565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b815160e08201908260005b60018110156101ad578251151582526020928301929091019060010161018c565b5050506cffffffffffffffffffffffffff19602084015116602083015260408301516101e960408401826affffffffffffffffffffff19169052565b506060830151610225606084018280516001600160a01b031682526020808201511515908301526040908101516001600160c01b031916910152565b506080929092015169ffffffffffffffffffff191660c091909101529056fea264697066735822122033d227157d32543749b9173f29f830fcd74805977461befd0ad42d7e7c7e0d7864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f30aa879 {\n address s_0;\n bool s_1;\n bytes8 s_2;\n }\n\n struct S_89433ce8 {\n bool[1] s_0;\n bytes19 s_1;\n bytes21 s_2;\n S_f30aa879 s_3;\n bytes22 s_4;\n }\n\n function test () public pure returns (S_89433ce8 memory) {\n S_89433ce8 memory r;\n {\n bool[1] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n bytes19 r_1 = bytes19(0x032d82af63c2d077790354598cd194d920dadc);\n r.s_1 = r_1;\n }\n {\n bytes21 r_2 = bytes21(0xf9996b63587cb52c1c1c757ca7e8e302bb125a1f76);\n r.s_2 = r_2;\n }\n {\n S_f30aa879 memory r_3;\n {\n address r_3_0 = 0xf3a6D46e00d2c478C7277AcA05B03C06ae3649e4;\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3.s_1 = r_3_1;\n }\n {\n bytes8 r_3_2 = bytes8(0x5b94c2c532f0f188);\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n bytes22 r_4 = bytes22(0x9c0ee7d477f6df2fe3cbc09169bb6fe55edef1607e89);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000001032d82af63c2d077790354598cd194d920dadc00000000000000000000000000f9996b63587cb52c1c1c757ca7e8e302bb125a1f760000000000000000000000000000000000000000000000f3a6d46e00d2c478c7277aca05b03c06ae3649e400000000000000000000000000000000000000000000000000000000000000015b94c2c532f0f1880000000000000000000000000000000000000000000000009c0ee7d477f6df2fe3cbc09169bb6fe55edef1607e8900000000000000000000" + }, + { + "name": "random-(bool[2],bool,int248[4],address)[3][]", + "type": "(bool[2],bool,int248[4],address)[3][]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061023e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610127565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b60405180606001604052806003905b6100a16100b7565b8152602001906001900390816100995790505090565b60405180608001604052806100ca6100eb565b8152600060208201526040016100de610109565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b602080825282518282018190526000919060409081850190868401855b828110156101fb5781518460005b60038110156101e457825180518360005b600281101561018257825115158252918c0191908c0190600101610163565b5050508981015115158984015288810151606080850160005b60048110156101bb578351601e0b8252928d0192908d019060010161019b565b505091909101516001600160a01b031660e0840152509188019161010090910190600101610152565b505050610300939093019290850190600101610144565b509197965050505050505056fea264697066735822122033728e4496db6f27ee51257cc5449e39892cfda77c7d3096a2d410301044903264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0d7596de {\n bool[2] s_0;\n bool s_1;\n int248[4] s_2;\n address s_3;\n }\n\n function test () public pure returns (S_0d7596de[3][] memory) {\n S_0d7596de[3][] memory r = new S_0d7596de[3][](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool[4],string,(int216,string,bool,uint160),string)", + "type": "(bool[4],string,(int216,string,bool,uint160),string)", + "value": [ + [false, false, true, true], + "Moo é🚀", + [ + "-47110147712483538455214712437420425960422641744322046966066497571", + "Moo é🚀 MoMMoééMoéMo🚀M oéo 🚀Moooo é éo🚀é 🚀 Mooo", + false, + "207378436866086318699213319981775126356624066991" + ], + "Moo é🚀éooéoM🚀🚀éé 🚀 é 🚀Mo🚀oo🚀o ééMé o oMéoé🚀🚀o " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-47110147712483538455214712437420425960422641744322046966066497571" + }, + { + "type": "string", + "value": "Moo é🚀 MoMMoééMoéMo🚀M oéo 🚀Moooo é éo🚀é 🚀 Mooo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "207378436866086318699213319981775126356624066991" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éooéoM🚀🚀éé 🚀 é 🚀Mo🚀oo🚀o ééMé o oMéoé🚀🚀o " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103c9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610260565b60405180910390f35b610056610152565b61005e610152565b6100666101a9565b600080825260208083018290526001604080850182905260608086019290925293855283518085018552600a8152689adede418753e13f3560b71b81840152858301528351608080820186528184018390528186018590529181018490527a7284b7867a24941baa930fb65fbe945b0731d3c996574cf4a2c8221981528451918201909452604b80825290916102f290830139602080840191909152600060408085018290527324532bb48bcd5a3e994141b645e1a9cd4f32c9af6060860152858101949094528351608081019094526057808552909392509061033d90830139606083015250919050565b60405180608001604052806101656101a9565b81526020016060815260200161019c6040805160808101825260008082526060602083018190529282018190529181019190915290565b8152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b818110156101ed576020818501810151868301820152016101d1565b818111156101ff576000602083870101525b50601f01601f19169290920160200192915050565b8051601a0b8252600060208201516080602085015261023660808501826101c7565b6040848101511515908601526060938401516001600160a01b031693909401929092525090919050565b6020808252825160009190828483015b60048210156102915782511515815291830191600191909101908301610270565b50505083015160e060a08401526102ac6101008401826101c7565b90506040840151601f19808584030160c08601526102ca8383610214565b925060608601519150808584030160e0860152506102e882826101c7565b9594505050505056fe4d6f6f20c3a9f09f9a802020204d6f4d4d6fc3a9c3a94d6fc3a94d6ff09f9a804d206fc3a96f20202020f09f9a804d6f6f6f6f20c3a92020c3a96ff09f9a80c3a920f09f9a80204d6f6f6f4d6f6f20c3a9f09f9a80c3a96f6fc3a96f4df09f9a80f09f9a80c3a9c3a92020f09f9a8020c3a920f09f9a804d6ff09f9a806f6ff09f9a806f20c3a9c3a94dc3a9206f206f4dc3a96fc3a9f09f9a80f09f9a806f202020a26469706673582212200d7a0260391c7ed4a00d9ada2ecd7f72461bc0ae40767a3e62f3748ef3fdd4ef64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d0637027 {\n int216 s_0;\n string s_1;\n bool s_2;\n uint160 s_3;\n }\n\n struct S_d45ff205 {\n bool[4] s_0;\n string s_1;\n S_d0637027 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_d45ff205 memory) {\n S_d45ff205 memory r;\n {\n bool[4] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n S_d0637027 memory r_2;\n {\n int216 r_2_0 = -47110147712483538455214712437420425960422641744322046966066497571;\n r_2.s_0 = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀 MoMMoééMoéMo🚀M oéo 🚀Moooo é éo🚀é 🚀 Mooo\";\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = false;\n r_2.s_2 = r_2_2;\n }\n {\n uint160 r_2_3 = 207378436866086318699213319981775126356624066991;\n r_2.s_3 = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀éooéoM🚀🚀éé 🚀 é 🚀Mo🚀oo🚀o ééMé o oMéoé🚀🚀o \";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000ffffffffff8d7b487985db6be4556cf049a0416ba4f8ce2c3669a8b30b5d37dd0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024532bb48bcd5a3e994141b645e1a9cd4f32c9af000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a802020204d6f4d4d6fc3a9c3a94d6fc3a94d6ff09f9a804d206fc3a96f20202020f09f9a804d6f6f6f6f20c3a92020c3a96ff09f9a80c3a920f09f9a80204d6f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80c3a96f6fc3a96f4df09f9a80f09f9a80c3a9c3a92020f09f9a8020c3a920f09f9a804d6ff09f9a806f6ff09f9a806f20c3a9c3a94dc3a9206f206f4dc3a96fc3a9f09f9a80f09f9a806f202020000000000000000000" + }, + { + "name": "random-(bytes17[2][],bytes9,bool,int56[2][1])", + "type": "(bytes17[2][],bytes9,bool,int56[2][1])", + "value": [ + [ + ["0xf15a23b16ae0eeab08a6e5403786a76444", "0xa14c9f3614241a4dba94de2eff3a681d9d"], + ["0x0b3c1640dc361500a3d4bc41ba5460fb58", "0xa1a91cced57f52a9913f6077b496a3b589"] + ], + "0x0b1cead6bf4b50c513", + false, + [["-29465293627874190", "6017574275827652"]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf15a23b16ae0eeab08a6e5403786a76444" + }, + { + "type": "hexstring", + "value": "0xa14c9f3614241a4dba94de2eff3a681d9d" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x0b3c1640dc361500a3d4bc41ba5460fb58" + }, + { + "type": "hexstring", + "value": "0xa1a91cced57f52a9913f6077b496a3b589" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x0b1cead6bf4b50c513" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-29465293627874190" + }, + { + "type": "number", + "value": "6017574275827652" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610383806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061027b565b60405180910390f35b61005661019c565b61005e61019c565b60408051600280825260608201909252600091816020015b61007e6101d5565b81526020019060019003908161007657905050905061009b6101d5565b703c5688ec5ab83baac229b9500de1a9d911607a1b815270a14c9f3614241a4dba94de2eff3a681d9d60781b60208201528151819083906000906100e1576100e1610337565b6020026020010181905250506100f56101d5565b70016782c81b86c2a0147a9788374a8c1f6b607b1b815270a1a91cced57f52a9913f6077b496a3b58960781b6020820152815181908390600190811061013d5761013d610337565b60209081029190910181019190915291835250680b1cead6bf4b50c51360b81b90820152600060408201526101706101f3565b6101786101d5565b6668ae8747e45b8d198152661560f3b11ec7c4602082015281526060820152919050565b60405180608001604052806060815260200160006001600160b81b03191681526020016000151581526020016101d06101f3565b905290565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001905b61020a6101d5565b8152602001906001900390816102025790505090565b806000805b60018082106102345750610274565b835186845b600281101561025a57825160060b8252602092830192909101908301610239565b505050604095909501945060209290920191600101610225565b5050505050565b6020808252825160a083830152805160c0840181905260009291820190839060e0860190825b818110156102f357845183855b60028110156102dd5782516effffffffffffffffffffffffffffff1916825291880191908801906001016102ae565b50505093850193604092909201916001016102a1565b5050928601516001600160b81b031981166040870152926040870151801515606088015293506060870151935061032d6080870185610220565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212206bef9d0db46c08c1797a89f78cebeb41316e2145ea811dc2b12ff9d776a8ae5f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6a87dc33 {\n bytes17[2][] s_0;\n bytes9 s_1;\n bool s_2;\n int56[2][1] s_3;\n }\n\n function test () public pure returns (S_6a87dc33 memory) {\n S_6a87dc33 memory r;\n {\n bytes17[2][] memory r_0 = new bytes17[2][](2);\n {\n bytes17[2] memory r_0_0;\n {\n bytes17 r_0_0_0 = bytes17(0xf15a23b16ae0eeab08a6e5403786a76444);\n r_0_0[0] = r_0_0_0;\n }\n {\n bytes17 r_0_0_1 = bytes17(0xa14c9f3614241a4dba94de2eff3a681d9d);\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n bytes17[2] memory r_0_1;\n {\n bytes17 r_0_1_0 = bytes17(0x0b3c1640dc361500a3d4bc41ba5460fb58);\n r_0_1[0] = r_0_1_0;\n }\n {\n bytes17 r_0_1_1 = bytes17(0xa1a91cced57f52a9913f6077b496a3b589);\n r_0_1[1] = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n bytes9 r_1 = bytes9(0x0b1cead6bf4b50c513);\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n int56[2][1] memory r_3;\n {\n int56[2] memory r_3_0;\n {\n int56 r_3_0_0 = -29465293627874190;\n r_3_0[0] = r_3_0_0;\n }\n {\n int56 r_3_0_1 = 6017574275827652;\n r_3_0[1] = r_3_0_1;\n }\n r_3[0] = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00b1cead6bf4b50c51300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff975178b81ba472000000000000000000000000000000000000000000000000001560f3b11ec7c40000000000000000000000000000000000000000000000000000000000000002f15a23b16ae0eeab08a6e5403786a76444000000000000000000000000000000a14c9f3614241a4dba94de2eff3a681d9d0000000000000000000000000000000b3c1640dc361500a3d4bc41ba5460fb58000000000000000000000000000000a1a91cced57f52a9913f6077b496a3b589000000000000000000000000000000" + }, + { + "name": "random-(bytes27,(bool,bytes14,bool[1]),bytes13,bool[3])", + "type": "(bytes27,(bool,bytes14,bool[1]),bytes13,bool[3])", + "value": [ + "0x7cbd065b5c832e2dfdd940b647b5ff69e6922967ca943c2ff5a9ea", + [true, "0x84f337e28229b6ce08ca206fa93f", [false]], + "0x65ec67bda87234d25aed7c91fc", + [false, true, true] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7cbd065b5c832e2dfdd940b647b5ff69e6922967ca943c2ff5a9ea" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x84f337e28229b6ce08ca206fa93f" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x65ec67bda87234d25aed7c91fc" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061028e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101b0565b60405180910390f35b6100566100fa565b61005e6100fa565b7f7cbd065b5c832e2dfdd940b647b5ff69e6922967ca943c2ff5a9ea0000000000815261008961012e565b600181526d84f337e28229b6ce08ca206fa93f60901b60208201526100ac610149565b6000815260408281019190915260208301919091526c197b19ef6a1c8d3496bb5f247f609a1b908201526100de610167565b6000815260016020820181905260408201526060820152919050565b6040805160808101909152600081526020810161011561012e565b815260006020820152604001610129610167565b905290565b60408051606081018252600080825260208201529081016101295b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b8060005b60038110156101aa5781511515845260209384019390910190600101610189565b50505050565b815164ffffffffff1916815260208083015180511515828401528082015171ffffffffffffffffffffffffffffffffffff19166040808501919091520151610100830191906060840160005b600181101561021b5782511515825291830191908301906001016101fc565b50505050604083015172ffffffffffffffffffffffffffffffffffffff19166080830152606083015161025160a0840182610185565b509291505056fea264697066735822122043202246f371c3dcf35e00a642fdc9b5b1fc1501edbabd2b1f6e2103257932e664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c9242aab {\n bool s_0;\n bytes14 s_1;\n bool[1] s_2;\n }\n\n struct S_31affa19 {\n bytes27 s_0;\n S_c9242aab s_1;\n bytes13 s_2;\n bool[3] s_3;\n }\n\n function test () public pure returns (S_31affa19 memory) {\n S_31affa19 memory r;\n {\n bytes27 r_0 = bytes27(0x7cbd065b5c832e2dfdd940b647b5ff69e6922967ca943c2ff5a9ea);\n r.s_0 = r_0;\n }\n {\n S_c9242aab memory r_1;\n {\n bool r_1_0 = true;\n r_1.s_0 = r_1_0;\n }\n {\n bytes14 r_1_1 = bytes14(0x84f337e28229b6ce08ca206fa93f);\n r_1.s_1 = r_1_1;\n }\n {\n bool[1] memory r_1_2;\n {\n bool r_1_2_0 = false;\n r_1_2[0] = r_1_2_0;\n }\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bytes13 r_2 = bytes13(0x65ec67bda87234d25aed7c91fc);\n r.s_2 = r_2;\n }\n {\n bool[3] memory r_3;\n {\n bool r_3_0 = false;\n r_3[0] = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3[1] = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x7cbd065b5c832e2dfdd940b647b5ff69e6922967ca943c2ff5a9ea0000000000000000000000000000000000000000000000000000000000000000000000000184f337e28229b6ce08ca206fa93f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065ec67bda87234d25aed7c91fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(int16,address[3][2],address,int,bool)[3]", + "type": "(int16,address[3][2],address,int,bool)[3]", + "value": [ + [ + "24826", + [ + [ + "0xF7BDB6D8D06E3b70174Eef2d133053d0B952aDa3", + "0x15b294147c755e776bB9C663b69cd5de85108A96", + "0x93C14F53b90d606a5D4C8824Eea1B0Bc6aD28211" + ], + [ + "0x05Bc6b2b7BcB71DF5303807F1734b6F5E16F516d", + "0xDAFd72D478E89515A5A6a0b8F20C2Dff8b152a5E", + "0x39219e181e2e3a86d4Db08D0538c673446ee82Be" + ] + ], + "0x133EED9b33b34DC7fD88B0e3BC9F70a138AB272e", + "17312802487066422789384657957268660823471000355805738865025483367106340816921", + true + ], + [ + "5885", + [ + [ + "0x658fC5d68617B260205c9F1F2Ab4739A29793DdE", + "0xC91C328a1E53708230EAB6EDaf4297E530a142b1", + "0x61c2D54C9E4490A260A3F5df27D4CE50d46457a0" + ], + [ + "0xB693F389BA79a9181727a1892d3A3Acc724e0DfB", + "0xB50c3b5F9E53eca2b7bFD62bab11FAEeE1471570", + "0x546A4d62a5bC839b146805E57972412878d50448" + ] + ], + "0x597B09CdacC31098B1608d59568761B2F727699E", + "55770194155942698025815999335542802608364125773158823757034984929260061030658", + true + ], + [ + "-13850", + [ + [ + "0xF3bB1E3625f815CCa668290C5551d2Ca69dDB799", + "0x93b8Aa5eD10a75a76b6612E81626BFF81497cc51", + "0x5bd3038D0f4e65B92398d5Bea735c836B2159D09" + ], + [ + "0x1d9E4Fd513dD5fe332Cb5Ddd1F0C331f152Ccc2E", + "0x6e0c9825893B783aCca30D9f40a889632D9d2158", + "0xa05947cEd92eAdd1c6d8eF5bEf08c514e3BFdA54" + ] + ], + "0xd0D41C6c082359C86DFFAB45cE0804CAB5c8C4C8", + "32118151576892511276758968248724335403813420771703519179618247057235501408466", + true + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "24826" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xF7BDB6D8D06E3b70174Eef2d133053d0B952aDa3" + }, + { + "type": "address", + "value": "0x15b294147c755e776bB9C663b69cd5de85108A96" + }, + { + "type": "address", + "value": "0x93C14F53b90d606a5D4C8824Eea1B0Bc6aD28211" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x05Bc6b2b7BcB71DF5303807F1734b6F5E16F516d" + }, + { + "type": "address", + "value": "0xDAFd72D478E89515A5A6a0b8F20C2Dff8b152a5E" + }, + { + "type": "address", + "value": "0x39219e181e2e3a86d4Db08D0538c673446ee82Be" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x133EED9b33b34DC7fD88B0e3BC9F70a138AB272e" + }, + { + "type": "number", + "value": "17312802487066422789384657957268660823471000355805738865025483367106340816921" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5885" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x658fC5d68617B260205c9F1F2Ab4739A29793DdE" + }, + { + "type": "address", + "value": "0xC91C328a1E53708230EAB6EDaf4297E530a142b1" + }, + { + "type": "address", + "value": "0x61c2D54C9E4490A260A3F5df27D4CE50d46457a0" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB693F389BA79a9181727a1892d3A3Acc724e0DfB" + }, + { + "type": "address", + "value": "0xB50c3b5F9E53eca2b7bFD62bab11FAEeE1471570" + }, + { + "type": "address", + "value": "0x546A4d62a5bC839b146805E57972412878d50448" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x597B09CdacC31098B1608d59568761B2F727699E" + }, + { + "type": "number", + "value": "55770194155942698025815999335542802608364125773158823757034984929260061030658" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-13850" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xF3bB1E3625f815CCa668290C5551d2Ca69dDB799" + }, + { + "type": "address", + "value": "0x93b8Aa5eD10a75a76b6612E81626BFF81497cc51" + }, + { + "type": "address", + "value": "0x5bd3038D0f4e65B92398d5Bea735c836B2159D09" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1d9E4Fd513dD5fe332Cb5Ddd1F0C331f152Ccc2E" + }, + { + "type": "address", + "value": "0x6e0c9825893B783aCca30D9f40a889632D9d2158" + }, + { + "type": "address", + "value": "0xa05947cEd92eAdd1c6d8eF5bEf08c514e3BFdA54" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xd0D41C6c082359C86DFFAB45cE0804CAB5c8C4C8" + }, + { + "type": "number", + "value": "32118151576892511276758968248724335403813420771703519179618247057235501408466" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610563806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610465565b60405180910390f35b6100566103b5565b61005e6103b5565b6100666103e2565b6160fa815261007361041a565b61007b610447565b73f7bdb6d8d06e3b70174eef2d133053d0b952ada381527315b294147c755e776bb9c663b69cd5de85108a9660208201527393c14f53b90d606a5d4c8824eea1b0bc6ad28211604082015281526100d0610447565b7305bc6b2b7bcb71df5303807f1734b6f5e16f516d815273dafd72d478e89515a5a6a0b8f20c2dff8b152a5e6020808301919091527339219e181e2e3a86d4db08d0538c673446ee82be6040808401919091528382019290925283019190915273133eed9b33b34dc7fd88b0e3bc9f70a138ab272e908201527f2646b2eeb4e5e005a9ee93fee03302ba9459c136bb781fb6ee5e41497af1881960608201526001608082015281526101806103e2565b6116fd815261018d61041a565b610195610447565b73658fc5d68617b260205c9f1f2ab4739a29793dde815273c91c328a1e53708230eab6edaf4297e530a142b160208201527361c2d54c9e4490a260a3f5df27d4ce50d46457a0604082015281526101ea610447565b73b693f389ba79a9181727a1892d3a3acc724e0dfb815273b50c3b5f9e53eca2b7bfd62bab11faeee147157060208083019190915273546a4d62a5bc839b146805e57972412878d50448604080840191909152838201929092528381019290925273597b09cdacc31098b1608d59568761b2f727699e908301527f7b4ccfafe1ee5d0912f4fbd1e684d934aa63b5a82fbaa62a4b27ba66243b790260608301526001608083015282015261029c6103e2565b6136191981526102aa61041a565b6102b2610447565b73f3bb1e3625f815cca668290c5551d2ca69ddb79981527393b8aa5ed10a75a76b6612e81626bff81497cc516020820152735bd3038d0f4e65b92398d5bea735c836b2159d0960408201528152610307610447565b731d9e4fd513dd5fe332cb5ddd1f0c331f152ccc2e8152736e0c9825893b783acca30d9f40a889632d9d215860208083019190915273a05947ced92eadd1c6d8ef5bef08c514e3bfda546040808401919091528382019290925283019190915273d0d41c6c082359c86dffab45ce0804cab5c8c4c8828201527f47023ac5c6f6f9c62e0eccd0a248a786fbc4053ba426342c0693f785298860d2606083015260016080830152820152919050565b60405180606001604052806003905b6103cc6103e2565b8152602001906001900390816103c45790505090565b6040518060a00160405280600060010b81526020016103ff61041a565b81526000602082018190526040820181905260609091015290565b60405180604001604052806002905b610431610447565b8152602001906001900390816104295790505090565b60405180606001604052806003906020820280368337509192915050565b6103c08101818360005b600380821061047e5750610524565b82518051600181810b8752602091508183015182880160005b60028110156104df5782518260005b898110156104ca5782516001600160a01b03168252918701919087019086016104a6565b50505091840191606091909101908301610497565b5050505060408201516001600160a01b031660e0870152606082015161010087015260809091015115156101208601526101409094019392909201915060010161046f565b5050509291505056fea26469706673582212208ef644a64dc2752057999497cd8ef55ddccc7e676b557e471f0284d880cd182464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bf804ccc {\n int16 s_0;\n address[3][2] s_1;\n address s_2;\n int256 s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_bf804ccc[3] memory) {\n S_bf804ccc[3] memory r;\n {\n S_bf804ccc memory r_0;\n {\n int16 r_0_0 = 24826;\n r_0.s_0 = r_0_0;\n }\n {\n address[3][2] memory r_0_1;\n {\n address[3] memory r_0_1_0;\n {\n address r_0_1_0_0 = 0xF7BDB6D8D06E3b70174Eef2d133053d0B952aDa3;\n r_0_1_0[0] = r_0_1_0_0;\n }\n {\n address r_0_1_0_1 = 0x15b294147c755e776bB9C663b69cd5de85108A96;\n r_0_1_0[1] = r_0_1_0_1;\n }\n {\n address r_0_1_0_2 = 0x93C14F53b90d606a5D4C8824Eea1B0Bc6aD28211;\n r_0_1_0[2] = r_0_1_0_2;\n }\n r_0_1[0] = r_0_1_0;\n }\n {\n address[3] memory r_0_1_1;\n {\n address r_0_1_1_0 = 0x05Bc6b2b7BcB71DF5303807F1734b6F5E16F516d;\n r_0_1_1[0] = r_0_1_1_0;\n }\n {\n address r_0_1_1_1 = 0xDAFd72D478E89515A5A6a0b8F20C2Dff8b152a5E;\n r_0_1_1[1] = r_0_1_1_1;\n }\n {\n address r_0_1_1_2 = 0x39219e181e2e3a86d4Db08D0538c673446ee82Be;\n r_0_1_1[2] = r_0_1_1_2;\n }\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x133EED9b33b34DC7fD88B0e3BC9F70a138AB272e;\n r_0.s_2 = r_0_2;\n }\n {\n int r_0_3 = 17312802487066422789384657957268660823471000355805738865025483367106340816921;\n r_0.s_3 = r_0_3;\n }\n {\n bool r_0_4 = true;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_bf804ccc memory r_1;\n {\n int16 r_1_0 = 5885;\n r_1.s_0 = r_1_0;\n }\n {\n address[3][2] memory r_1_1;\n {\n address[3] memory r_1_1_0;\n {\n address r_1_1_0_0 = 0x658fC5d68617B260205c9F1F2Ab4739A29793DdE;\n r_1_1_0[0] = r_1_1_0_0;\n }\n {\n address r_1_1_0_1 = 0xC91C328a1E53708230EAB6EDaf4297E530a142b1;\n r_1_1_0[1] = r_1_1_0_1;\n }\n {\n address r_1_1_0_2 = 0x61c2D54C9E4490A260A3F5df27D4CE50d46457a0;\n r_1_1_0[2] = r_1_1_0_2;\n }\n r_1_1[0] = r_1_1_0;\n }\n {\n address[3] memory r_1_1_1;\n {\n address r_1_1_1_0 = 0xB693F389BA79a9181727a1892d3A3Acc724e0DfB;\n r_1_1_1[0] = r_1_1_1_0;\n }\n {\n address r_1_1_1_1 = 0xB50c3b5F9E53eca2b7bFD62bab11FAEeE1471570;\n r_1_1_1[1] = r_1_1_1_1;\n }\n {\n address r_1_1_1_2 = 0x546A4d62a5bC839b146805E57972412878d50448;\n r_1_1_1[2] = r_1_1_1_2;\n }\n r_1_1[1] = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0x597B09CdacC31098B1608d59568761B2F727699E;\n r_1.s_2 = r_1_2;\n }\n {\n int r_1_3 = 55770194155942698025815999335542802608364125773158823757034984929260061030658;\n r_1.s_3 = r_1_3;\n }\n {\n bool r_1_4 = true;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_bf804ccc memory r_2;\n {\n int16 r_2_0 = -13850;\n r_2.s_0 = r_2_0;\n }\n {\n address[3][2] memory r_2_1;\n {\n address[3] memory r_2_1_0;\n {\n address r_2_1_0_0 = 0xF3bB1E3625f815CCa668290C5551d2Ca69dDB799;\n r_2_1_0[0] = r_2_1_0_0;\n }\n {\n address r_2_1_0_1 = 0x93b8Aa5eD10a75a76b6612E81626BFF81497cc51;\n r_2_1_0[1] = r_2_1_0_1;\n }\n {\n address r_2_1_0_2 = 0x5bd3038D0f4e65B92398d5Bea735c836B2159D09;\n r_2_1_0[2] = r_2_1_0_2;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n address[3] memory r_2_1_1;\n {\n address r_2_1_1_0 = 0x1d9E4Fd513dD5fe332Cb5Ddd1F0C331f152Ccc2E;\n r_2_1_1[0] = r_2_1_1_0;\n }\n {\n address r_2_1_1_1 = 0x6e0c9825893B783aCca30D9f40a889632D9d2158;\n r_2_1_1[1] = r_2_1_1_1;\n }\n {\n address r_2_1_1_2 = 0xa05947cEd92eAdd1c6d8eF5bEf08c514e3BFdA54;\n r_2_1_1[2] = r_2_1_1_2;\n }\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0xd0D41C6c082359C86DFFAB45cE0804CAB5c8C4C8;\n r_2.s_2 = r_2_2;\n }\n {\n int r_2_3 = 32118151576892511276758968248724335403813420771703519179618247057235501408466;\n r_2.s_3 = r_2_3;\n }\n {\n bool r_2_4 = true;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000060fa000000000000000000000000f7bdb6d8d06e3b70174eef2d133053d0b952ada300000000000000000000000015b294147c755e776bb9c663b69cd5de85108a9600000000000000000000000093c14f53b90d606a5d4c8824eea1b0bc6ad2821100000000000000000000000005bc6b2b7bcb71df5303807f1734b6f5e16f516d000000000000000000000000dafd72d478e89515a5a6a0b8f20c2dff8b152a5e00000000000000000000000039219e181e2e3a86d4db08d0538c673446ee82be000000000000000000000000133eed9b33b34dc7fd88b0e3bc9f70a138ab272e2646b2eeb4e5e005a9ee93fee03302ba9459c136bb781fb6ee5e41497af18819000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000016fd000000000000000000000000658fc5d68617b260205c9f1f2ab4739a29793dde000000000000000000000000c91c328a1e53708230eab6edaf4297e530a142b100000000000000000000000061c2d54c9e4490a260a3f5df27d4ce50d46457a0000000000000000000000000b693f389ba79a9181727a1892d3a3acc724e0dfb000000000000000000000000b50c3b5f9e53eca2b7bfd62bab11faeee1471570000000000000000000000000546a4d62a5bc839b146805e57972412878d50448000000000000000000000000597b09cdacc31098b1608d59568761b2f727699e7b4ccfafe1ee5d0912f4fbd1e684d934aa63b5a82fbaa62a4b27ba66243b79020000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9e6000000000000000000000000f3bb1e3625f815cca668290c5551d2ca69ddb79900000000000000000000000093b8aa5ed10a75a76b6612e81626bff81497cc510000000000000000000000005bd3038d0f4e65b92398d5bea735c836b2159d090000000000000000000000001d9e4fd513dd5fe332cb5ddd1f0c331f152ccc2e0000000000000000000000006e0c9825893b783acca30d9f40a889632d9d2158000000000000000000000000a05947ced92eadd1c6d8ef5bef08c514e3bfda54000000000000000000000000d0d41c6c082359c86dffab45ce0804cab5c8c4c847023ac5c6f6f9c62e0eccd0a248a786fbc4053ba426342c0693f785298860d20000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(int248[2],(uint112,address[3],address,string),address)", + "type": "(int248[2],(uint112,address[3],address,string),address)", + "value": [ + [ + "-109595436330552087481982157014484607307988036114875605199073492951239166046", + "-136501913633045434865938279333778612990941016146748986722019983651688599506" + ], + [ + "5056451206752722485552853939679128", + [ + "0x547B77d272454295e738CEA8f2Ca0fc97829E882", + "0x5af7744d704F1C8750D181d7b0137e14e711423E", + "0x0786585b82c2521D8e5852f7eA450B0C3E9540FF" + ], + "0x5F46A1FD96F313FBC4956a478B1674d8C701Ff5a", + "Moo é🚀ooé🚀oé" + ], + "0xD9E3524015D4feCCab8b5A73B67bdaF4a8Cf40f5" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-109595436330552087481982157014484607307988036114875605199073492951239166046" + }, + { + "type": "number", + "value": "-136501913633045434865938279333778612990941016146748986722019983651688599506" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5056451206752722485552853939679128" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x547B77d272454295e738CEA8f2Ca0fc97829E882" + }, + { + "type": "address", + "value": "0x5af7744d704F1C8750D181d7b0137e14e711423E" + }, + { + "type": "address", + "value": "0x0786585b82c2521D8e5852f7eA450B0C3E9540FF" + } + ] + }, + { + "type": "address", + "value": "0x5F46A1FD96F313FBC4956a478B1674d8C701Ff5a" + }, + { + "type": "string", + "value": "Moo é🚀ooé🚀oé" + } + ] + }, + { + "type": "address", + "value": "0xD9E3524015D4feCCab8b5A73B67bdaF4a8Cf40f5" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610391806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610283565b60405180910390f35b610056610196565b61005e610196565b6100666101c3565b7fffc1f89f55b277a237a9b80e21ba27ca32953b9ba926cdcfd2742fb90208f7a281527fffb2be1e9fabeb9e9d2fc2422946d9023c746b25eecbbbae86e810db3b81302e602082015281526100b96101e1565b6df94d63068bd49d04689fd6c86f9881526100d2610218565b73547b77d272454295e738cea8f2ca0fc97829e8828152735af7744d704f1c8750d181d7b0137e14e711423e602080830191909152730786585b82c2521d8e5852f7ea450b0c3e9540ff60408084019190915283820192909252735f46a1fd96f313fbc4956a478b1674d8c701ff5a838301528151808301835260158152744d6f6f20c3a9f09f9a806f6fc3a9f09f9a806fc3a960581b81830152606084015283019190915273d9e3524015d4feccab8b5a73b67bdaf4a8cf40f590820152919050565b60405180606001604052806101a96101c3565b81526020016101b66101e1565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b604051806080016040528060006001600160701b03168152602001610204610218565b815260006020820152606060409091015290565b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b8181101561025c57602081850181015186830182015201610240565b8181111561026e576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160009190828483015b60028210156102b5578251601e0b815291830191600191909101908301610293565b50505080840151608060608501526001600160701b0381511660a08501528181015160c0850160005b60038110156103045782516001600160a01b0316825291840191908401906001016102de565b50505060408101516001600160a01b03166101208501526060015160c06101408501529050610337610160840182610236565b9050604084015161035360808501826001600160a01b03169052565b50939250505056fea2646970667358221220f8f007749f466231b72d3cc556ae62ffbeadedb8e87a75c1cace8417c36b6d3f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b18c50ab {\n uint112 s_0;\n address[3] s_1;\n address s_2;\n string s_3;\n }\n\n struct S_74ccb9ae {\n int248[2] s_0;\n S_b18c50ab s_1;\n address s_2;\n }\n\n function test () public pure returns (S_74ccb9ae memory) {\n S_74ccb9ae memory r;\n {\n int248[2] memory r_0;\n {\n int248 r_0_0 = -109595436330552087481982157014484607307988036114875605199073492951239166046;\n r_0[0] = r_0_0;\n }\n {\n int248 r_0_1 = -136501913633045434865938279333778612990941016146748986722019983651688599506;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_b18c50ab memory r_1;\n {\n uint112 r_1_0 = 5056451206752722485552853939679128;\n r_1.s_0 = r_1_0;\n }\n {\n address[3] memory r_1_1;\n {\n address r_1_1_0 = 0x547B77d272454295e738CEA8f2Ca0fc97829E882;\n r_1_1[0] = r_1_1_0;\n }\n {\n address r_1_1_1 = 0x5af7744d704F1C8750D181d7b0137e14e711423E;\n r_1_1[1] = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x0786585b82c2521D8e5852f7eA450B0C3E9540FF;\n r_1_1[2] = r_1_1_2;\n }\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0x5F46A1FD96F313FBC4956a478B1674d8C701Ff5a;\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀ooé🚀oé\";\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xD9E3524015D4feCCab8b5A73B67bdaF4a8Cf40f5;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffc1f89f55b277a237a9b80e21ba27ca32953b9ba926cdcfd2742fb90208f7a2ffb2be1e9fabeb9e9d2fc2422946d9023c746b25eecbbbae86e810db3b81302e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000d9e3524015d4feccab8b5a73b67bdaf4a8cf40f5000000000000000000000000000000000000f94d63068bd49d04689fd6c86f98000000000000000000000000547b77d272454295e738cea8f2ca0fc97829e8820000000000000000000000005af7744d704f1c8750d181d7b0137e14e711423e0000000000000000000000000786585b82c2521d8e5852f7ea450b0c3e9540ff0000000000000000000000005f46a1fd96f313fbc4956a478b1674d8c701ff5a00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a806f6fc3a9f09f9a806fc3a90000000000000000000000" + }, + { + "name": "random-(string,address,address,(string[],address,int240),bytes24)", + "type": "(string,address,address,(string[],address,int240),bytes24)", + "value": [ + "Moo é🚀MM🚀é o🚀oooMéoMM é Mo MoMM o🚀🚀o🚀é🚀MoM🚀oooooé éM o", + "0x6225af9Df605b4D3A3273D0C075C5dC2254b1D69", + "0xFabCfFb9Cb191CB7253e55c547f8627A7925083E", + [ + [ + "Moo é🚀🚀oé 🚀éooooé 🚀 🚀 Moo oMM🚀M🚀oéMM🚀 oM 🚀M 🚀🚀ooooooo🚀", + "Moo é🚀Mééooo Mééo " + ], + "0x3d07A89179EF2774f76E64135079903457B7a799", + "464996287794987070514589851137391336834764148366790480853506462626212904" + ], + "0x43771aeee34beaff5727081888ad2e7367f88c14eec961fc" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM🚀é o🚀oooMéoMM é Mo MoMM o🚀🚀o🚀é🚀MoM🚀oooooé éM o" + }, + { + "type": "address", + "value": "0x6225af9Df605b4D3A3273D0C075C5dC2254b1D69" + }, + { + "type": "address", + "value": "0xFabCfFb9Cb191CB7253e55c547f8627A7925083E" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oé 🚀éooooé 🚀 🚀 Moo oMM🚀M🚀oéMM🚀 oM 🚀M 🚀🚀ooooooo🚀" + }, + { + "type": "string", + "value": "Moo é🚀Mééooo Mééo " + } + ] + }, + { + "type": "address", + "value": "0x3d07A89179EF2774f76E64135079903457B7a799" + }, + { + "type": "number", + "value": "464996287794987070514589851137391336834764148366790480853506462626212904" + } + ] + }, + { + "type": "hexstring", + "value": "0x43771aeee34beaff5727081888ad2e7367f88c14eec961fc" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061048d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061029d565b60405180910390f35b61005661020a565b61005e61020a565b60006040518060800160405280605581526020016103a260559139825250736225af9df605b4d3a3273d0c075c5dc2254b1d6960208083019190915273fabcffb9cb191cb7253e55c547f8627a7925083e60408084019190915280516060808201835280825260009382018490528183018490528251600280825291810190935290929190816020015b60608152602001906001900390816100e857905050905060006040518060a00160405280606181526020016103f760619139905080826000815181106101305761013061038b565b60200260200101819052505060006040518060400160405280601b81526020017f4d6f6f20c3a9f09f9a804dc3a9c3a96f6f6f204dc3a9c3a96f202000000000008152509050808260018151811061018a5761018a61038b565b60209081029190910181019190915291835250733d07a89179ef2774f76e64135079903457b7a799908201527d435fabc095b12caf67e311027aa01ac411f8c004f4ea493a982f3995ec28604082015260608201527f43771aeee34beaff5727081888ad2e7367f88c14eec961fc00000000000000006080820152919050565b6040805160a08101825260608082526000602080840182905283850182905284518084018652838152908101829052938401529091908201908152600060209091015290565b6000815180845260005b818110156102765760208185018101518683018201520161025a565b81811115610288576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160a0828501526102b960c0850182610250565b90508185015160018060a01b03808216604087015280604088015116606087015260608701519150601f198684030160808701526060830182516060855281815180845260808701915060808160051b8801019350878301925060005b8181101561034457607f19888603018352610332858551610250565b94509288019291880191600101610316565b5050505081858401511685850152604083015194506103686040850186601d0b9052565b608088015167ffffffffffffffff19811660a08901529450979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d4df09f9a80c3a9206ff09f9a806f6f6f4dc3a96f4d4d20c3a9204d6f204d6f4d4d206ff09f9a80f09f9a806ff09f9a80c3a9f09f9a804d6f4df09f9a806f6f6f6f6fc3a920c3a94d206f4d6f6f20c3a9f09f9a80f09f9a806fc3a92020f09f9a80c3a96f6f6f6fc3a920f09f9a8020f09f9a80204d6f6f206f4d4df09f9a804df09f9a806fc3a94d4df09f9a8020206f4d20f09f9a804d20f09f9a80f09f9a806f6f6f6f6f6f6ff09f9a80a2646970667358221220451e151ef93522022bb51358ef00d99ff8abc23ba56812ad87a0b64d6ec4cc2164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5ac933ff {\n string[] s_0;\n address s_1;\n int240 s_2;\n }\n\n struct S_e4c302d1 {\n string s_0;\n address s_1;\n address s_2;\n S_5ac933ff s_3;\n bytes24 s_4;\n }\n\n function test () public pure returns (S_e4c302d1 memory) {\n S_e4c302d1 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀MM🚀é o🚀oooMéoMM é Mo MoMM o🚀🚀o🚀é🚀MoM🚀oooooé éM o\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x6225af9Df605b4D3A3273D0C075C5dC2254b1D69;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xFabCfFb9Cb191CB7253e55c547f8627A7925083E;\n r.s_2 = r_2;\n }\n {\n S_5ac933ff memory r_3;\n {\n string[] memory r_3_0 = new string[](2);\n {\n string memory r_3_0_0 = unicode\"Moo é🚀🚀oé 🚀éooooé 🚀 🚀 Moo oMM🚀M🚀oéMM🚀 oM 🚀M 🚀🚀ooooooo🚀\";\n r_3_0[0] = r_3_0_0;\n }\n {\n string memory r_3_0_1 = unicode\"Moo é🚀Mééooo Mééo \";\n r_3_0[1] = r_3_0_1;\n }\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0x3d07A89179EF2774f76E64135079903457B7a799;\n r_3.s_1 = r_3_1;\n }\n {\n int240 r_3_2 = 464996287794987070514589851137391336834764148366790480853506462626212904;\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n bytes24 r_4 = bytes24(0x43771aeee34beaff5727081888ad2e7367f88c14eec961fc);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006225af9df605b4d3a3273d0c075c5dc2254b1d69000000000000000000000000fabcffb9cb191cb7253e55c547f8627a7925083e000000000000000000000000000000000000000000000000000000000000012043771aeee34beaff5727081888ad2e7367f88c14eec961fc000000000000000000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a804d4df09f9a80c3a9206ff09f9a806f6f6f4dc3a96f4d4d20c3a9204d6f204d6f4d4d206ff09f9a80f09f9a806ff09f9a80c3a9f09f9a804d6f4df09f9a806f6f6f6f6fc3a920c3a94d206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003d07a89179ef2774f76e64135079903457b7a7990000435fabc095b12caf67e311027aa01ac411f8c004f4ea493a982f3995ec280000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a80f09f9a806fc3a92020f09f9a80c3a96f6f6f6fc3a920f09f9a8020f09f9a80204d6f6f206f4d4df09f9a804df09f9a806fc3a94d4df09f9a8020206f4d20f09f9a804d20f09f9a80f09f9a806f6f6f6f6f6f6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a804dc3a9c3a96f6f6f204dc3a9c3a96f20200000000000" + }, + { + "name": "random-(string,address,bool[][2][],bytes15,address)", + "type": "(string,address,bool[][2][],bytes15,address)", + "value": [ + "Moo é🚀🚀🚀🚀o🚀éoM", + "0xA17BD900692d0467B0A11AF7caD0f1A69B0b4a6A", + [ + [ + [false, false], + [false, true, false, true] + ], + [[false, false, false, true], [true]], + [[false, false, true], [true]], + [[true], []] + ], + "0x6f45fa0694913a4c23f39e3bfba1a8", + "0xA59E0dFa5d01679bb8d1511c0E0FBF6dDFDA671e" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀o🚀éoM" + }, + { + "type": "address", + "value": "0xA17BD900692d0467B0A11AF7caD0f1A69B0b4a6A" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x6f45fa0694913a4c23f39e3bfba1a8" + }, + { + "type": "address", + "value": "0xA59E0dFa5d01679bb8d1511c0E0FBF6dDFDA671e" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506107ae806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610690565b60405180910390f35b6040805160a0808201835260608083526000602080850182905284860183905282850182905260808086018390528651808601885284815280830184815281890186905294810184905290810183905286518088018852601f81527f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806ff09f9a80c3a96f4d0081840152815273a17bd900692d0467b0a11af7cad0f1a69b0b4a6a909352855160048082529481019096529394919390929082015b6101076105bf565b8152602001906001900390816100ff5790505090506101246105bf565b6040805160028082526060820183526000926020830190803683370190505090506000808260008151811061015b5761015b610762565b602002602001019015159081151581525050506000808260018151811061018457610184610762565b9115156020928302919091019091015250815260408051600480825260a08201909252600091816020016020820280368337019050509050600080826000815181106101d2576101d2610762565b6020026020010190151590811515815250505060006001905080826001815181106101ff576101ff610762565b602002602001019015159081151581525050506000808260028151811061022857610228610762565b60200260200101901515908115158152505050600060019050808260038151811061025557610255610762565b9115156020928302919091018201528301919091525081518190839060009061028057610280610762565b6020026020010181905250506102946105bf565b60408051600480825260a0820190925260009160208201608080368337019050509050600080826000815181106102cd576102cd610762565b60200260200101901515908115158152505050600080826001815181106102f6576102f6610762565b602002602001019015159081151581525050506000808260028151811061031f5761031f610762565b60200260200101901515908115158152505050600060019050808260038151811061034c5761034c610762565b91151560209283029190910190910152508152604080516001808252818301909252600091816020016020820280368337019050509050600060019050808260008151811061039d5761039d610762565b9115156020928302919091018201528301919091525081518190839060019081106103ca576103ca610762565b6020026020010181905250506103de6105bf565b60408051600380825260808201909252600091602082016060803683370190505090506000808260008151811061041757610417610762565b602002602001019015159081151581525050506000808260018151811061044057610440610762565b60200260200101901515908115158152505050600060019050808260028151811061046d5761046d610762565b9115156020928302919091019091015250815260408051600180825281830190925260009181602001602082028036833701905050905060006001905080826000815181106104be576104be610762565b9115156020928302919091018201528301919091525081518190839060029081106104eb576104eb610762565b6020026020010181905250506104ff6105bf565b60408051600180825281830190925260009160208083019080368337019050509050600060019050808260008151811061053b5761053b610762565b91151560209283029190910182015291835250604080516000815280830190915290820152815181908390600390811061057757610577610762565b60209081029190910101525060408201526e0de8bf40d2922749847e73c77f7435608b1b606082015273a59e0dfa5d01679bb8d1511c0e0fbf6ddfda671e6080820152919050565b60405180604001604052806002905b60608152602001906001900390816105ce5790505090565b600081518084526020808501808196508360051b8101915082860160005b858110156106835782840389528151846040810160005b600281101561066e57878203835283518051808452908a01908a84019060005b8181101561065957835115158352928c0192918c019160010161063b565b5050948a0194938a019392505060010161061b565b509a87019a9550505090840190600101610604565b5091979650505050505050565b60006020808352835160a08285015280518060c086015260005b818110156106c65782810184015186820160e0015283016106aa565b818111156106d857600060e083880101525b509185015191601f01601f1916840190506106fe60408501836001600160a01b03169052565b6040850151915060c084820301606085015261071d60e08201836105e6565b9150506060840151610745608085018270ffffffffffffffffffffffffffffffffff19169052565b5060808401516001600160a01b03811660a0850152509392505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220035a8044a8646a2960ef5a4b6026c2af496b924b4d47c83e5a751c9416d39e2964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d07ed103 {\n string s_0;\n address s_1;\n bool[][2][] s_2;\n bytes15 s_3;\n address s_4;\n }\n\n function test () public pure returns (S_d07ed103 memory) {\n S_d07ed103 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀🚀🚀o🚀éoM\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xA17BD900692d0467B0A11AF7caD0f1A69B0b4a6A;\n r.s_1 = r_1;\n }\n {\n bool[][2][] memory r_2 = new bool[][2][](4);\n {\n bool[][2] memory r_2_0;\n {\n bool[] memory r_2_0_0 = new bool[](2);\n {\n bool r_2_0_0_0 = false;\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n bool r_2_0_0_1 = false;\n r_2_0_0[1] = r_2_0_0_1;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n bool[] memory r_2_0_1 = new bool[](4);\n {\n bool r_2_0_1_0 = false;\n r_2_0_1[0] = r_2_0_1_0;\n }\n {\n bool r_2_0_1_1 = true;\n r_2_0_1[1] = r_2_0_1_1;\n }\n {\n bool r_2_0_1_2 = false;\n r_2_0_1[2] = r_2_0_1_2;\n }\n {\n bool r_2_0_1_3 = true;\n r_2_0_1[3] = r_2_0_1_3;\n }\n r_2_0[1] = r_2_0_1;\n }\n r_2[0] = r_2_0;\n }\n {\n bool[][2] memory r_2_1;\n {\n bool[] memory r_2_1_0 = new bool[](4);\n {\n bool r_2_1_0_0 = false;\n r_2_1_0[0] = r_2_1_0_0;\n }\n {\n bool r_2_1_0_1 = false;\n r_2_1_0[1] = r_2_1_0_1;\n }\n {\n bool r_2_1_0_2 = false;\n r_2_1_0[2] = r_2_1_0_2;\n }\n {\n bool r_2_1_0_3 = true;\n r_2_1_0[3] = r_2_1_0_3;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n bool[] memory r_2_1_1 = new bool[](1);\n {\n bool r_2_1_1_0 = true;\n r_2_1_1[0] = r_2_1_1_0;\n }\n r_2_1[1] = r_2_1_1;\n }\n r_2[1] = r_2_1;\n }\n {\n bool[][2] memory r_2_2;\n {\n bool[] memory r_2_2_0 = new bool[](3);\n {\n bool r_2_2_0_0 = false;\n r_2_2_0[0] = r_2_2_0_0;\n }\n {\n bool r_2_2_0_1 = false;\n r_2_2_0[1] = r_2_2_0_1;\n }\n {\n bool r_2_2_0_2 = true;\n r_2_2_0[2] = r_2_2_0_2;\n }\n r_2_2[0] = r_2_2_0;\n }\n {\n bool[] memory r_2_2_1 = new bool[](1);\n {\n bool r_2_2_1_0 = true;\n r_2_2_1[0] = r_2_2_1_0;\n }\n r_2_2[1] = r_2_2_1;\n }\n r_2[2] = r_2_2;\n }\n {\n bool[][2] memory r_2_3;\n {\n bool[] memory r_2_3_0 = new bool[](1);\n {\n bool r_2_3_0_0 = true;\n r_2_3_0[0] = r_2_3_0_0;\n }\n r_2_3[0] = r_2_3_0;\n }\n {\n bool[] memory r_2_3_1 = new bool[](0);\n r_2_3[1] = r_2_3_1;\n }\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n bytes15 r_3 = bytes15(0x6f45fa0694913a4c23f39e3bfba1a8);\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xA59E0dFa5d01679bb8d1511c0E0FBF6dDFDA671e;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a17bd900692d0467b0a11af7cad0f1a69b0b4a6a00000000000000000000000000000000000000000000000000000000000000e06f45fa0694913a4c23f39e3bfba1a80000000000000000000000000000000000000000000000000000000000a59e0dfa5d01679bb8d1511c0e0fbf6ddfda671e000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806ff09f9a80c3a96f4d000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint240,uint120,address[3],(bytes14,int72[3]),bytes21)", + "type": "(uint240,uint120,address[3],(bytes14,int72[3]),bytes21)", + "value": [ + "1355980741517577913160860340569676467320416167718293726967956658967097287", + "1327204401565703450677530794506335106", + [ + "0x0407C90864A2699Ae60A3925F70551Bf8dd750DB", + "0x6077d56e8e38A12477B4F3ba2f389E67797df3CA", + "0x8Dafb85DC0f2ecafd5E3BF7354a370Ec0185C00A" + ], + [ + "0xbd38b670ee4550b3c92abe96a74b", + ["-259218121275710665361", "1915863743377424143431", "1793280211035028619732"] + ], + "0x76ffdb455d968e835bfe6bcc9d019b3d0874d90942" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "1355980741517577913160860340569676467320416167718293726967956658967097287" + }, + { + "type": "number", + "value": "1327204401565703450677530794506335106" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x0407C90864A2699Ae60A3925F70551Bf8dd750DB" + }, + { + "type": "address", + "value": "0x6077d56e8e38A12477B4F3ba2f389E67797df3CA" + }, + { + "type": "address", + "value": "0x8Dafb85DC0f2ecafd5E3BF7354a370Ec0185C00A" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xbd38b670ee4550b3c92abe96a74b" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-259218121275710665361" + }, + { + "type": "number", + "value": "1915863743377424143431" + }, + { + "type": "number", + "value": "1793280211035028619732" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x76ffdb455d968e835bfe6bcc9d019b3d0874d90942" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061022f565b60405180910390f35b61005661016c565b61005e61016c565b7dc4781efe36efcc264621019707128c5cbf78bbf6acfefab38ff5586d2fc781526eff9c3aa66e316f2fb414324f183382602082015261009c6101a5565b730407c90864a2699ae60a3925f70551bf8dd750db8152736077d56e8e38a12477b4f3ba2f389e67797df3ca6020820152738dafb85dc0f2ecafd5e3bf7354a370ec0185c00a6040808301919091528201526100f66101c3565b6dbd38b670ee4550b3c92abe96a74b60901b81526101126101a5565b680e0d5fc3e75edc72901981526867dbf353ebad825447602080830191909152686136c322bb086a81d460408301528201526060820152743b7feda2aecb4741adff35e64e80cd9e843a6c84a160591b6080820152919050565b6040805160a0810182526000808252602082015290810161018b6101a5565b81526020016101986101c3565b8152600060209091015290565b60405180606001604052806003906020820280368337509192915050565b6040805180820190915260008152602081016101dd6101a5565b905290565b805171ffffffffffffffffffffffffffffffffffff1916825260208082015181840160005b600381101561022757825160080b82529183019190830190600101610207565b505050505050565b81516001600160f01b031681526020808301516effffffffffffffffffffffffffffff168183015260408084015161014084019291840160005b600381101561028f5782516001600160a01b031682529183019190830190600101610269565b5050505060608301516102a560a08401826101e2565b50608092909201516affffffffffffffffffffff191661012091909101529056fea264697066735822122084d9a383612887a29a162009791dae408e80be6508b93f5d8cbfab0c17b1a15964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_abf4b11b {\n bytes14 s_0;\n int72[3] s_1;\n }\n\n struct S_e9ff81ba {\n uint240 s_0;\n uint120 s_1;\n address[3] s_2;\n S_abf4b11b s_3;\n bytes21 s_4;\n }\n\n function test () public pure returns (S_e9ff81ba memory) {\n S_e9ff81ba memory r;\n {\n uint240 r_0 = 1355980741517577913160860340569676467320416167718293726967956658967097287;\n r.s_0 = r_0;\n }\n {\n uint120 r_1 = 1327204401565703450677530794506335106;\n r.s_1 = r_1;\n }\n {\n address[3] memory r_2;\n {\n address r_2_0 = 0x0407C90864A2699Ae60A3925F70551Bf8dd750DB;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x6077d56e8e38A12477B4F3ba2f389E67797df3CA;\n r_2[1] = r_2_1;\n }\n {\n address r_2_2 = 0x8Dafb85DC0f2ecafd5E3BF7354a370Ec0185C00A;\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n S_abf4b11b memory r_3;\n {\n bytes14 r_3_0 = bytes14(0xbd38b670ee4550b3c92abe96a74b);\n r_3.s_0 = r_3_0;\n }\n {\n int72[3] memory r_3_1;\n {\n int72 r_3_1_0 = -259218121275710665361;\n r_3_1[0] = r_3_1_0;\n }\n {\n int72 r_3_1_1 = 1915863743377424143431;\n r_3_1[1] = r_3_1_1;\n }\n {\n int72 r_3_1_2 = 1793280211035028619732;\n r_3_1[2] = r_3_1_2;\n }\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n bytes21 r_4 = bytes21(0x76ffdb455d968e835bfe6bcc9d019b3d0874d90942);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000c4781efe36efcc264621019707128c5cbf78bbf6acfefab38ff5586d2fc70000000000000000000000000000000000ff9c3aa66e316f2fb414324f1833820000000000000000000000000407c90864a2699ae60a3925f70551bf8dd750db0000000000000000000000006077d56e8e38a12477b4f3ba2f389e67797df3ca0000000000000000000000008dafb85dc0f2ecafd5e3bf7354a370ec0185c00abd38b670ee4550b3c92abe96a74b000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffff1f2a03c18a1238d6f000000000000000000000000000000000000000000000067dbf353ebad82544700000000000000000000000000000000000000000000006136c322bb086a81d476ffdb455d968e835bfe6bcc9d019b3d0874d909420000000000000000000000" + }, + { + "name": "random-(uint72,(int248,bytes9[2]),int176,uint184,bytes1)[2]", + "type": "(uint72,(int248,bytes9[2]),int176,uint184,bytes1)[2]", + "value": [ + [ + "2816335769437180712383", + [ + "52094913547565067777325627634400376523592317841688775895957437119649116619", + ["0x5e41141a184dfb961b", "0xec806782fbad12806e"] + ], + "11955372035418426354226866904903826664524600328100482", + "22528477265115730073868643292085680617795237242350052656", + "0x3f" + ], + [ + "4193187163687710794086", + [ + "112572797729910889076200937451147553572631734845060601698868476772844671422", + ["0x0a40c3318edb618649", "0xbf1550820e3a712b8f"] + ], + "-47067547447713796655653659145651355894319770533425747", + "6503994272034294090049957618003510939015959322475909839", + "0xed" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2816335769437180712383" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "52094913547565067777325627634400376523592317841688775895957437119649116619" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5e41141a184dfb961b" + }, + { + "type": "hexstring", + "value": "0xec806782fbad12806e" + } + ] + } + ] + }, + { + "type": "number", + "value": "11955372035418426354226866904903826664524600328100482" + }, + { + "type": "number", + "value": "22528477265115730073868643292085680617795237242350052656" + }, + { + "type": "hexstring", + "value": "0x3f" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4193187163687710794086" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "112572797729910889076200937451147553572631734845060601698868476772844671422" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x0a40c3318edb618649" + }, + { + "type": "hexstring", + "value": "0xbf1550820e3a712b8f" + } + ] + } + ] + }, + { + "type": "number", + "value": "-47067547447713796655653659145651355894319770533425747" + }, + { + "type": "number", + "value": "6503994272034294090049957618003510939015959322475909839" + }, + { + "type": "hexstring", + "value": "0xed" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610387806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061028a565b60405180910390f35b6100566101dd565b61005e6101dd565b61006661020a565b6898ac829cb77996d5bf815261007a61024a565b7e1d7c13bccce74750776b395690a3ed12a2835e6a6fa5bf33a2fab0187171cb81526100a461026c565b685e41141a184dfb961b60b81b815268764033c17dd689403760b91b60208083019190915282810191909152820152751ff4328f2840c8695ebf9ae540c867b54da2a2189a82604082015276eb3551aa65dcff91096cb755a2f1b46f7cceda9c73a5306060820152603f60f81b6080820152815261012061020a565b68e3502964ea8dbea166815261013461024a565b7e3fb6c5232c90c05a57576aefa9ee4caa81876063a846da22e778a9155d91be815261015e61026c565b680a40c3318edb61864960b81b815268bf1550820e3a712b8f60b81b6020808301919091528281019190915282810191909152757dccec3ea812dc98d26578eead779026fd22b7ccf2521960408301527643e7a5782c214860912f1a695e6a57318c5e20049452cf606083015260ed60f81b6080830152820152919050565b60405180604001604052806002905b6101f461020a565b8152602001906001900390816101ec5790505090565b6040518060a00160405280600068ffffffffffffffffff16815260200161022f61024a565b81526000602082018190526040820181905260609091015290565b60405180604001604052806000601e0b815260200161026761026c565b905290565b60405180604001604052806002906020820280368337509192915050565b6101c0810181836000805b60028082106102a45750610347565b8351805168ffffffffffffffffff1686526020808201518051601e0b828901528101516040808901875b868110156102f45783516001600160b81b031916825292840192908401906001016102ce565b505083015193506080905061030d8882018560150b9052565b60608301516001600160b81b031660a0890152909101516001600160f81b03191660c087015260e090950194939093019250600101610295565b505050509291505056fea26469706673582212200368b5edab192dce7b5b60089a66f0d0223565c180d59963aa42d4f6f450a23164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fc5cfa8f {\n int248 s_0;\n bytes9[2] s_1;\n }\n\n struct S_476e651b {\n uint72 s_0;\n S_fc5cfa8f s_1;\n int176 s_2;\n uint184 s_3;\n bytes1 s_4;\n }\n\n function test () public pure returns (S_476e651b[2] memory) {\n S_476e651b[2] memory r;\n {\n S_476e651b memory r_0;\n {\n uint72 r_0_0 = 2816335769437180712383;\n r_0.s_0 = r_0_0;\n }\n {\n S_fc5cfa8f memory r_0_1;\n {\n int248 r_0_1_0 = 52094913547565067777325627634400376523592317841688775895957437119649116619;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bytes9[2] memory r_0_1_1;\n {\n bytes9 r_0_1_1_0 = bytes9(0x5e41141a184dfb961b);\n r_0_1_1[0] = r_0_1_1_0;\n }\n {\n bytes9 r_0_1_1_1 = bytes9(0xec806782fbad12806e);\n r_0_1_1[1] = r_0_1_1_1;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n int176 r_0_2 = 11955372035418426354226866904903826664524600328100482;\n r_0.s_2 = r_0_2;\n }\n {\n uint184 r_0_3 = 22528477265115730073868643292085680617795237242350052656;\n r_0.s_3 = r_0_3;\n }\n {\n bytes1 r_0_4 = bytes1(0x3f);\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_476e651b memory r_1;\n {\n uint72 r_1_0 = 4193187163687710794086;\n r_1.s_0 = r_1_0;\n }\n {\n S_fc5cfa8f memory r_1_1;\n {\n int248 r_1_1_0 = 112572797729910889076200937451147553572631734845060601698868476772844671422;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bytes9[2] memory r_1_1_1;\n {\n bytes9 r_1_1_1_0 = bytes9(0x0a40c3318edb618649);\n r_1_1_1[0] = r_1_1_1_0;\n }\n {\n bytes9 r_1_1_1_1 = bytes9(0xbf1550820e3a712b8f);\n r_1_1_1[1] = r_1_1_1_1;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n {\n int176 r_1_2 = -47067547447713796655653659145651355894319770533425747;\n r_1.s_2 = r_1_2;\n }\n {\n uint184 r_1_3 = 6503994272034294090049957618003510939015959322475909839;\n r_1.s_3 = r_1_3;\n }\n {\n bytes1 r_1_4 = bytes1(0xed);\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000098ac829cb77996d5bf001d7c13bccce74750776b395690a3ed12a2835e6a6fa5bf33a2fab0187171cb5e41141a184dfb961b0000000000000000000000000000000000000000000000ec806782fbad12806e0000000000000000000000000000000000000000000000000000000000000000001ff4328f2840c8695ebf9ae540c867b54da2a2189a82000000000000000000eb3551aa65dcff91096cb755a2f1b46f7cceda9c73a5303f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3502964ea8dbea166003fb6c5232c90c05a57576aefa9ee4caa81876063a846da22e778a9155d91be0a40c3318edb6186490000000000000000000000000000000000000000000000bf1550820e3a712b8f0000000000000000000000000000000000000000000000ffffffffffffffffffff823313c157ed23672d9a871152886fd902dd48330dad00000000000000000043e7a5782c214860912f1a695e6a57318c5e20049452cfed00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,bool,bytes9,bytes16[3],bytes22[]),(address))[3]", + "type": "((address,bool,bytes9,bytes16[3],bytes22[]),(address))[3]", + "value": [ + [ + [ + "0x7BC37ff0D2123a7Ecc8eb0027B2Ce1128d33BB94", + false, + "0xc27d09d26a0ef64751", + [ + "0xf57c4078b23b2877082c6bae8c472ff5", + "0xce1d910182d88d60b88378792137a920", + "0x49f184dc4d7c7b0abd01a17f2d46f65d" + ], + [ + "0xb0ce90808d72886642bafd4332058a69085410a9944e", + "0xcfa5c590ad55984218096a974e315ad208ea52e14a0e" + ] + ], + ["0xa2DE2476137808b7191608eC4eB89324F4d5274d"] + ], + [ + [ + "0x91C3C8AC61820558b022A8D649db08DCF6e59C79", + true, + "0xaf71c49c9f1e30eb89", + [ + "0x04cf71be406565d2d8516090f185a82d", + "0x9775dbc7f9212dfb7eef490b58024bc1", + "0x22537899b960344bf736720776822cc8" + ], + [ + "0xeac5d381eb658ade3441fc91f474658ecdca81b0da00", + "0x191571ca71753578150d91fecee9a8f06ea4edd5a761", + "0x94e2fb200be982c087588ca1a8da7a8a2f024cdaa428" + ] + ], + ["0x6239acFa786F15DDec501D273aB6cf2358DB16C5"] + ], + [ + [ + "0x0207846b1da979F46aaeF3cF4fA0e3c5db04FE13", + true, + "0xa5c36855624a4932cf", + [ + "0x731e1e2ceee6fd8b1056daf47d9f8f4c", + "0xb0438cbf54701460d78d9e8a070dd80a", + "0x31da97809e4251fa20ed97ed64dad2fe" + ], + [ + "0xba0d6f6229e4e5a01c5948348726724df1032b9e1ada", + "0x1b26a3bf01fd9381954ce976903f06f125f5d01adb0f", + "0x77634ca7fcf2281938f24d3ff850efd825582fb4b8cf" + ] + ], + ["0x323597F04386BeF8171F67BF8d35bAa5d6e763A7"] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x7BC37ff0D2123a7Ecc8eb0027B2Ce1128d33BB94" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xc27d09d26a0ef64751" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf57c4078b23b2877082c6bae8c472ff5" + }, + { + "type": "hexstring", + "value": "0xce1d910182d88d60b88378792137a920" + }, + { + "type": "hexstring", + "value": "0x49f184dc4d7c7b0abd01a17f2d46f65d" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb0ce90808d72886642bafd4332058a69085410a9944e" + }, + { + "type": "hexstring", + "value": "0xcfa5c590ad55984218096a974e315ad208ea52e14a0e" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa2DE2476137808b7191608eC4eB89324F4d5274d" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x91C3C8AC61820558b022A8D649db08DCF6e59C79" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xaf71c49c9f1e30eb89" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x04cf71be406565d2d8516090f185a82d" + }, + { + "type": "hexstring", + "value": "0x9775dbc7f9212dfb7eef490b58024bc1" + }, + { + "type": "hexstring", + "value": "0x22537899b960344bf736720776822cc8" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xeac5d381eb658ade3441fc91f474658ecdca81b0da00" + }, + { + "type": "hexstring", + "value": "0x191571ca71753578150d91fecee9a8f06ea4edd5a761" + }, + { + "type": "hexstring", + "value": "0x94e2fb200be982c087588ca1a8da7a8a2f024cdaa428" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6239acFa786F15DDec501D273aB6cf2358DB16C5" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0207846b1da979F46aaeF3cF4fA0e3c5db04FE13" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xa5c36855624a4932cf" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x731e1e2ceee6fd8b1056daf47d9f8f4c" + }, + { + "type": "hexstring", + "value": "0xb0438cbf54701460d78d9e8a070dd80a" + }, + { + "type": "hexstring", + "value": "0x31da97809e4251fa20ed97ed64dad2fe" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xba0d6f6229e4e5a01c5948348726724df1032b9e1ada" + }, + { + "type": "hexstring", + "value": "0x1b26a3bf01fd9381954ce976903f06f125f5d01adb0f" + }, + { + "type": "hexstring", + "value": "0x77634ca7fcf2281938f24d3ff850efd825582fb4b8cf" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x323597F04386BeF8171F67BF8d35bAa5d6e763A7" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506107c1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610684565b60405180910390f35b610056610593565b61005e610593565b6100666105c0565b61006e6105eb565b737bc37ff0d2123a7ecc8eb0027b2ce1128d33bb9481526000602082015268c27d09d26a0ef6475160b81b60408201526100a6610621565b6ff57c4078b23b2877082c6bae8c472ff560801b81526f0670ec880c16c46b05c41bc3c909bd4960851b60208201526f49f184dc4d7c7b0abd01a17f2d46f65d60801b6040808301919091526060838101929092528051600280825292810190915260009181602001602082028036833750508151919250755867484046b94433215d7ea19902c534842a0854ca2760511b91829150839060009061014d5761014d610775565b6001600160501b0319909216602092830291909101909101525080517567d2e2c856aacc210c04b54ba718ad6904752970a50760511b9081908390600190811061019957610199610775565b6001600160501b0319929092166020928302919091018201526080840192909252509082526040805180830190915273a2de2476137808b7191608ec4eb89324f4d5274d81529082015281526101ed6105c0565b6101f56105eb565b7391c3c8ac61820558b022a8d649db08dcf6e59c7981526001602082015268af71c49c9f1e30eb8960b81b604082015261022d610621565b6f04cf71be406565d2d8516090f185a82d60801b81526f9775dbc7f9212dfb7eef490b58024bc160801b60208201526f044a6f13372c06897ee6ce40eed0459960831b6040808301919091526060830191909152805160038082526080820190925260009181602001602082028036833750508151919250747562e9c0f5b2c56f1a20fe48fa3a32c766e540d86d60591b9182915083906000906102d3576102d3610775565b6001600160501b03199092166020928302919091019091015250805175191571ca71753578150d91fecee9a8f06ea4edd5a76160501b9081908390600190811061031f5761031f610775565b6001600160501b03199092166020928302919091019091015250805175129c5f64017d305810eb1194351b4f5145e0499b548560531b9081908390600290811061036b5761036b610775565b6001600160501b03199290921660209283029190910182015260808401929092525090825260408051808301909152736239acfa786f15ddec501d273ab6cf2358db16c58152828201528201526103c06105c0565b6103c86105eb565b730207846b1da979f46aaef3cf4fa0e3c5db04fe1381526001602082015268a5c36855624a4932cf60b81b6040820152610400610621565b6f1cc7878b3bb9bf62c415b6bd1f67e3d360821b81526f5821c65faa380a306bc6cf450386ec0560811b60208201526f18ed4bc04f2128fd1076cbf6b26d697f60811b6040808301919091526060830191909152805160038082526080820190925260009181602001602082028036833750508151919250755d06b7b114f272d00e2ca41a43933926f88195cf0d6d60511b9182915083906000906104a7576104a7610775565b6001600160501b031990921660209283029190910190910152508051751b26a3bf01fd9381954ce976903f06f125f5d01adb0f60501b908190839060019081106104f3576104f3610775565b6001600160501b0319909216602092830291909101909101525080517577634ca7fcf2281938f24d3ff850efd825582fb4b8cf60501b9081908390600290811061053f5761053f610775565b6001600160501b03199290921660209283029190910182015260808401929092525090825260408051808301825273323597f04386bef8171f67bf8d35baa5d6e763a7815291830191909152820152919050565b60405180606001604052806003905b6105aa6105c0565b8152602001906001900390816105a25790505090565b60405180604001604052806105d36105eb565b81526040805160208181019092526000815291015290565b6040805160a0810182526000808252602082018190529181019190915260608101610614610621565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b600081518084526020808501945080840160005b838110156106795781516001600160501b03191687529582019590820190600101610653565b509495945050505050565b602080825260009060808382018185018685805b60038082106106a75750610767565b898503601f1901865283518051604080885281516001600160a01b0316818901528a82015115156060808a0191909152908201516001600160b81b0319168a8901528101519060a08801865b858110156107225783516fffffffffffffffffffffffffffffffff19168252928c0192908c01906001016106f3565b505089015160e06101008901529250610741905061012087018361063f565b90890151516001600160a01b031695890195909552509386019391860191600101610698565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220feb3f8da92482851c32ddafa8bff778dd63bc9d0541e1210a0c26311d2874c4a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_772f1b9b {\n address s_0;\n bool s_1;\n bytes9 s_2;\n bytes16[3] s_3;\n bytes22[] s_4;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_dfd27276 {\n S_772f1b9b s_0;\n S_421683f8 s_1;\n }\n\n function test () public pure returns (S_dfd27276[3] memory) {\n S_dfd27276[3] memory r;\n {\n S_dfd27276 memory r_0;\n {\n S_772f1b9b memory r_0_0;\n {\n address r_0_0_0 = 0x7BC37ff0D2123a7Ecc8eb0027B2Ce1128d33BB94;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bool r_0_0_1 = false;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bytes9 r_0_0_2 = bytes9(0xc27d09d26a0ef64751);\n r_0_0.s_2 = r_0_0_2;\n }\n {\n bytes16[3] memory r_0_0_3;\n {\n bytes16 r_0_0_3_0 = bytes16(0xf57c4078b23b2877082c6bae8c472ff5);\n r_0_0_3[0] = r_0_0_3_0;\n }\n {\n bytes16 r_0_0_3_1 = bytes16(0xce1d910182d88d60b88378792137a920);\n r_0_0_3[1] = r_0_0_3_1;\n }\n {\n bytes16 r_0_0_3_2 = bytes16(0x49f184dc4d7c7b0abd01a17f2d46f65d);\n r_0_0_3[2] = r_0_0_3_2;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n {\n bytes22[] memory r_0_0_4 = new bytes22[](2);\n {\n bytes22 r_0_0_4_0 = bytes22(0xb0ce90808d72886642bafd4332058a69085410a9944e);\n r_0_0_4[0] = r_0_0_4_0;\n }\n {\n bytes22 r_0_0_4_1 = bytes22(0xcfa5c590ad55984218096a974e315ad208ea52e14a0e);\n r_0_0_4[1] = r_0_0_4_1;\n }\n r_0_0.s_4 = r_0_0_4;\n }\n r_0.s_0 = r_0_0;\n }\n {\n S_421683f8 memory r_0_1;\n {\n address r_0_1_0 = 0xa2DE2476137808b7191608eC4eB89324F4d5274d;\n r_0_1.s_0 = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_dfd27276 memory r_1;\n {\n S_772f1b9b memory r_1_0;\n {\n address r_1_0_0 = 0x91C3C8AC61820558b022A8D649db08DCF6e59C79;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bool r_1_0_1 = true;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n bytes9 r_1_0_2 = bytes9(0xaf71c49c9f1e30eb89);\n r_1_0.s_2 = r_1_0_2;\n }\n {\n bytes16[3] memory r_1_0_3;\n {\n bytes16 r_1_0_3_0 = bytes16(0x04cf71be406565d2d8516090f185a82d);\n r_1_0_3[0] = r_1_0_3_0;\n }\n {\n bytes16 r_1_0_3_1 = bytes16(0x9775dbc7f9212dfb7eef490b58024bc1);\n r_1_0_3[1] = r_1_0_3_1;\n }\n {\n bytes16 r_1_0_3_2 = bytes16(0x22537899b960344bf736720776822cc8);\n r_1_0_3[2] = r_1_0_3_2;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n {\n bytes22[] memory r_1_0_4 = new bytes22[](3);\n {\n bytes22 r_1_0_4_0 = bytes22(0xeac5d381eb658ade3441fc91f474658ecdca81b0da00);\n r_1_0_4[0] = r_1_0_4_0;\n }\n {\n bytes22 r_1_0_4_1 = bytes22(0x191571ca71753578150d91fecee9a8f06ea4edd5a761);\n r_1_0_4[1] = r_1_0_4_1;\n }\n {\n bytes22 r_1_0_4_2 = bytes22(0x94e2fb200be982c087588ca1a8da7a8a2f024cdaa428);\n r_1_0_4[2] = r_1_0_4_2;\n }\n r_1_0.s_4 = r_1_0_4;\n }\n r_1.s_0 = r_1_0;\n }\n {\n S_421683f8 memory r_1_1;\n {\n address r_1_1_0 = 0x6239acFa786F15DDec501D273aB6cf2358DB16C5;\n r_1_1.s_0 = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_dfd27276 memory r_2;\n {\n S_772f1b9b memory r_2_0;\n {\n address r_2_0_0 = 0x0207846b1da979F46aaeF3cF4fA0e3c5db04FE13;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bool r_2_0_1 = true;\n r_2_0.s_1 = r_2_0_1;\n }\n {\n bytes9 r_2_0_2 = bytes9(0xa5c36855624a4932cf);\n r_2_0.s_2 = r_2_0_2;\n }\n {\n bytes16[3] memory r_2_0_3;\n {\n bytes16 r_2_0_3_0 = bytes16(0x731e1e2ceee6fd8b1056daf47d9f8f4c);\n r_2_0_3[0] = r_2_0_3_0;\n }\n {\n bytes16 r_2_0_3_1 = bytes16(0xb0438cbf54701460d78d9e8a070dd80a);\n r_2_0_3[1] = r_2_0_3_1;\n }\n {\n bytes16 r_2_0_3_2 = bytes16(0x31da97809e4251fa20ed97ed64dad2fe);\n r_2_0_3[2] = r_2_0_3_2;\n }\n r_2_0.s_3 = r_2_0_3;\n }\n {\n bytes22[] memory r_2_0_4 = new bytes22[](3);\n {\n bytes22 r_2_0_4_0 = bytes22(0xba0d6f6229e4e5a01c5948348726724df1032b9e1ada);\n r_2_0_4[0] = r_2_0_4_0;\n }\n {\n bytes22 r_2_0_4_1 = bytes22(0x1b26a3bf01fd9381954ce976903f06f125f5d01adb0f);\n r_2_0_4[1] = r_2_0_4_1;\n }\n {\n bytes22 r_2_0_4_2 = bytes22(0x77634ca7fcf2281938f24d3ff850efd825582fb4b8cf);\n r_2_0_4[2] = r_2_0_4_2;\n }\n r_2_0.s_4 = r_2_0_4;\n }\n r_2.s_0 = r_2_0;\n }\n {\n S_421683f8 memory r_2_1;\n {\n address r_2_1_0 = 0x323597F04386BeF8171F67BF8d35bAa5d6e763A7;\n r_2_1.s_0 = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a2de2476137808b7191608ec4eb89324f4d5274d0000000000000000000000007bc37ff0d2123a7ecc8eb0027b2ce1128d33bb940000000000000000000000000000000000000000000000000000000000000000c27d09d26a0ef647510000000000000000000000000000000000000000000000f57c4078b23b2877082c6bae8c472ff500000000000000000000000000000000ce1d910182d88d60b88378792137a9200000000000000000000000000000000049f184dc4d7c7b0abd01a17f2d46f65d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000002b0ce90808d72886642bafd4332058a69085410a9944e00000000000000000000cfa5c590ad55984218096a974e315ad208ea52e14a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000006239acfa786f15ddec501d273ab6cf2358db16c500000000000000000000000091c3c8ac61820558b022a8d649db08dcf6e59c790000000000000000000000000000000000000000000000000000000000000001af71c49c9f1e30eb89000000000000000000000000000000000000000000000004cf71be406565d2d8516090f185a82d000000000000000000000000000000009775dbc7f9212dfb7eef490b58024bc10000000000000000000000000000000022537899b960344bf736720776822cc80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003eac5d381eb658ade3441fc91f474658ecdca81b0da0000000000000000000000191571ca71753578150d91fecee9a8f06ea4edd5a7610000000000000000000094e2fb200be982c087588ca1a8da7a8a2f024cdaa428000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000323597f04386bef8171f67bf8d35baa5d6e763a70000000000000000000000000207846b1da979f46aaef3cf4fa0e3c5db04fe130000000000000000000000000000000000000000000000000000000000000001a5c36855624a4932cf0000000000000000000000000000000000000000000000731e1e2ceee6fd8b1056daf47d9f8f4c00000000000000000000000000000000b0438cbf54701460d78d9e8a070dd80a0000000000000000000000000000000031da97809e4251fa20ed97ed64dad2fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003ba0d6f6229e4e5a01c5948348726724df1032b9e1ada000000000000000000001b26a3bf01fd9381954ce976903f06f125f5d01adb0f0000000000000000000077634ca7fcf2281938f24d3ff850efd825582fb4b8cf00000000000000000000" + }, + { + "name": "random-((bytes10,(address),bytes22,bool),(bytes5,int96,string,string[4]))", + "type": "((bytes10,(address),bytes22,bool),(bytes5,int96,string,string[4]))", + "value": [ + [ + "0x3d085b626aeb0604a121", + ["0x5378237c845f71BCD71998D74A8E5C74EB435D27"], + "0x4eed7da01940f0553aef95df2c92080d6c9380e02b8f", + false + ], + [ + "0xd2ec968b40", + "-38323611183370714572395854187", + "Moo é🚀MéoMo o🚀🚀🚀oooM éM oMoMMMoo 🚀oéMMoooo o🚀oMMMM ooéMo 🚀 ééM", + [ + "Moo é🚀", + "Moo é🚀oMMoo🚀é ooéé 🚀ééo", + "Moo é🚀🚀oooM🚀 M🚀🚀Méoooéo 🚀o", + "Moo é🚀oM éééo oéo🚀Moo🚀Mé🚀M MMéoMé🚀Mooé🚀🚀é éMoé" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3d085b626aeb0604a121" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5378237c845f71BCD71998D74A8E5C74EB435D27" + } + ] + }, + { + "type": "hexstring", + "value": "0x4eed7da01940f0553aef95df2c92080d6c9380e02b8f" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd2ec968b40" + }, + { + "type": "number", + "value": "-38323611183370714572395854187" + }, + { + "type": "string", + "value": "Moo é🚀MéoMo o🚀🚀🚀oooM éM oMoMMMoo 🚀oéMMoooo o🚀oMMMM ooéMo 🚀 ééM" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oMMoo🚀é ooéé 🚀ééo" + }, + { + "type": "string", + "value": "Moo é🚀🚀oooM🚀 M🚀🚀Méoooéo 🚀o" + }, + { + "type": "string", + "value": "Moo é🚀oM éééo oéo🚀Moo🚀Mé🚀M MMéoMé🚀Mooé🚀🚀é éMoé" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104d3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102b2565b60405180910390f35b6100566101d6565b61005e6101d6565b60408051608081018252600080825282516020808201855282825280840191825283850183815260608501848152693d085b626aeb0604a12160b01b86528651928301909652735378237c845f71bcd71998d74a8e5c74eb435d2782529152754eed7da01940f0553aef95df2c92080d6c9380e02b8f60501b905290915281526100e661021b565b64034bb25a2d60de1b81526b7bd48c552000fd7c1413396a196020808301919091526040805160808101909152605a80825260009261039f9083013960408301525061013061023e565b604080518082018252600a8152689adede418753e13f3560b71b6020808301919091529083528151606081019092526026808352600092916103f99083013990508082600160200201819052505060006040518060600160405280602f815260200161041f602f913960408084019190915280516080810190915260508082526000925061044e6020830139606080840191909152830191909152506020820152919050565b6040805160c08101825260008183018181528351602080820190955282815260608401526080830182905260a0830191909152815290810161021661021b565b905290565b604080516080810182526000808252602082015260609181018290529081016102165b60405180608001604052806004905b606081526020019060019003908161024d5790505090565b6000815180845260005b8181101561028b5760208185018101518683018201520161026f565b8181111561029d576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835169ffffffffffffffffffff60b01b8151168285015260018060a01b03828201515116604085015269ffffffffffffffffffff196040820151166060850152606081015115156080850152508084015160a08085015264ffffffffff60d81b81511660c085015281810151600b0b60e085015260408101516080610100860152610348610140860182610265565b6060929092015185830360bf1901610120870152919050806080810160005b6004811015610392578382038352610380828651610265565b94860194928601929150600101610367565b5097965050505050505056fe4d6f6f20c3a9f09f9a804dc3a96f4d6f206ff09f9a80f09f9a80f09f9a806f6f6f4d20c3a94d206f4d6f4d4d4d6f6f20f09f9a806fc3a94d4d6f6f6f6f206ff09f9a806f4d4d4d4d206f6fc3a94d6f20f09f9a8020c3a9c3a94d4d6f6f20c3a9f09f9a806f4d4d6f6ff09f9a80c3a9206f6fc3a9c3a920f09f9a80c3a9c3a96f4d6f6f20c3a9f09f9a80f09f9a806f6f6f4df09f9a80204df09f9a80f09f9a804dc3a96f6f6fc3a96f20f09f9a806f4d6f6f20c3a9f09f9a806f4d2020c3a9c3a9c3a96f206fc3a96ff09f9a804d6f6ff09f9a804dc3a9f09f9a804d204d4dc3a96f4dc3a9f09f9a804d6f6fc3a9f09f9a80f09f9a80c3a920c3a94d6fc3a9a26469706673582212205857037291f317121ee49ee58441d76a82df9d49278204ded393807af29c9ce264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_5ab00cf2 {\n bytes10 s_0;\n S_421683f8 s_1;\n bytes22 s_2;\n bool s_3;\n }\n\n struct S_4b130a11 {\n bytes5 s_0;\n int96 s_1;\n string s_2;\n string[4] s_3;\n }\n\n struct S_ec656b34 {\n S_5ab00cf2 s_0;\n S_4b130a11 s_1;\n }\n\n function test () public pure returns (S_ec656b34 memory) {\n S_ec656b34 memory r;\n {\n S_5ab00cf2 memory r_0;\n {\n bytes10 r_0_0 = bytes10(0x3d085b626aeb0604a121);\n r_0.s_0 = r_0_0;\n }\n {\n S_421683f8 memory r_0_1;\n {\n address r_0_1_0 = 0x5378237c845f71BCD71998D74A8E5C74EB435D27;\n r_0_1.s_0 = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n bytes22 r_0_2 = bytes22(0x4eed7da01940f0553aef95df2c92080d6c9380e02b8f);\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n S_4b130a11 memory r_1;\n {\n bytes5 r_1_0 = bytes5(0xd2ec968b40);\n r_1.s_0 = r_1_0;\n }\n {\n int96 r_1_1 = -38323611183370714572395854187;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀MéoMo o🚀🚀🚀oooM éM oMoMMMoo 🚀oéMMoooo o🚀oMMMM ooéMo 🚀 ééM\";\n r_1.s_2 = r_1_2;\n }\n {\n string[4] memory r_1_3;\n {\n string memory r_1_3_0 = unicode\"Moo é🚀\";\n r_1_3[0] = r_1_3_0;\n }\n {\n string memory r_1_3_1 = unicode\"Moo é🚀oMMoo🚀é ooéé 🚀ééo\";\n r_1_3[1] = r_1_3_1;\n }\n {\n string memory r_1_3_2 = unicode\"Moo é🚀🚀oooM🚀 M🚀🚀Méoooéo 🚀o\";\n r_1_3[2] = r_1_3_2;\n }\n {\n string memory r_1_3_3 = unicode\"Moo é🚀oM éééo oéo🚀Moo🚀Mé🚀M MMéoMé🚀Mooé🚀🚀é éMoé\";\n r_1_3[3] = r_1_3_3;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000203d085b626aeb0604a121000000000000000000000000000000000000000000000000000000000000000000005378237c845f71bcd71998d74a8e5c74eb435d274eed7da01940f0553aef95df2c92080d6c9380e02b8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0d2ec968b40000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff842b73aadfff0283ebecc69500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a804dc3a96f4d6f206ff09f9a80f09f9a80f09f9a806f6f6f4d20c3a94d206f4d6f4d4d4d6f6f20f09f9a806fc3a94d4d6f6f6f6f206ff09f9a806f4d4d4d4d206f6fc3a94d6f20f09f9a8020c3a9c3a94d000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a806f4d4d6f6ff09f9a80c3a9206f6fc3a9c3a920f09f9a80c3a9c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a80f09f9a806f6f6f4df09f9a80204df09f9a80f09f9a804dc3a96f6f6fc3a96f20f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a806f4d2020c3a9c3a9c3a96f206fc3a96ff09f9a804d6f6ff09f9a804dc3a9f09f9a804d204d4dc3a96f4dc3a9f09f9a804d6f6fc3a9f09f9a80f09f9a80c3a920c3a94d6fc3a900000000000000000000000000000000" + }, + { + "name": "random-((bytes20[][],(string),(bytes12,bool,bool,int232),string))", + "type": "((bytes20[][],(string),(bytes12,bool,bool,int232),string))", + "value": [ + [ + [ + [ + "0x2b751b3cffd436f96b6655a92f2b64d4f7fa3827", + "0xd8b406369a9049d7b8360ab68d7f031ce029b5e3", + "0x70c0b2f043d863509314bb5e8baf2d60a2239c8c", + "0x7ffa80ebb975aa2d20201068ba62ee578de660c0" + ], + ["0x2442891fdad5e05da17922e97dff61427e58fe4c"] + ], + ["Moo é🚀M 🚀oo oo"], + [ + "0x35bc7c7302722fbd0d264df5", + false, + true, + "-1230495026499905292590638413903629821495046673257734864151832135122449" + ], + "Moo é🚀M M🚀 oMééM🚀 oMo🚀 🚀MéMM🚀 🚀🚀o🚀éé M🚀ooooo🚀🚀M o🚀 o M oM" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2b751b3cffd436f96b6655a92f2b64d4f7fa3827" + }, + { + "type": "hexstring", + "value": "0xd8b406369a9049d7b8360ab68d7f031ce029b5e3" + }, + { + "type": "hexstring", + "value": "0x70c0b2f043d863509314bb5e8baf2d60a2239c8c" + }, + { + "type": "hexstring", + "value": "0x7ffa80ebb975aa2d20201068ba62ee578de660c0" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2442891fdad5e05da17922e97dff61427e58fe4c" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M 🚀oo oo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x35bc7c7302722fbd0d264df5" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-1230495026499905292590638413903629821495046673257734864151832135122449" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M M🚀 oMééM🚀 oMo🚀 🚀MéMM🚀 🚀🚀o🚀éé M🚀ooooo🚀🚀M o🚀 o M oM" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610611806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610439565b60405180910390f35b61005661035b565b61005e61035b565b610066610373565b60408051600280825260608201909252600091816020015b606081526020019060019003908161007e57505060408051600480825260a08201909252919250600091906020820160808036833750508151919250732b751b3cffd436f96b6655a92f2b64d4f7fa382760601b9182915083906000906100e7576100e761055d565b6001600160601b03199092166020928302919091019091015250805173d8b406369a9049d7b8360ab68d7f031ce029b5e360601b908190839060019081106101315761013161055d565b6001600160601b031990921660209283029190910190910152508051731c302cbc10f618d424c52ed7a2ebcb582888e72360621b9081908390600290811061017b5761017b61055d565b6001600160601b0319909216602092830291909101909101525080517301ffea03aee5d6a8b4808041a2e98bb95e37998360661b908190839060039081106101c5576101c561055d565b60200260200101906001600160601b03191690816001600160601b031916815250505080826000815181106101fc576101fc61055d565b60209081029190910101525060408051600180825281830190925260009181602001602082028036833750508151919250730910a247f6b57817685e48ba5f7fd8509f963f9360621b91829150839060009061025a5761025a61055d565b60200260200101906001600160601b03191690816001600160601b031916815250505080826001815181106102915761029161055d565b6020908102919091018101919091529183525060408051808301825260608082528251808401845260158152744d6f6f20c3a9f09f9a804d20f09f9a806f6f206f6f60581b81860152825284840191909152815160808101835260008185018190526b35bc7c7302722fbd0d264df560a01b82526001828501527fffffffd25bc049136dc83f94a4f1e60b5daf4457628ee814532e5544953d41ef9282019290925282850152815160a0810190925260688083529092610574908301396060830152508152919050565b604051806020016040528061036e610373565b905290565b60405180608001604052806060815260200161039b6040518060200160405280606081525090565b8152604080516080810182526000808252602082810182905292820181905260608201529101908152602001606081525090565b6000815180845260005b818110156103f5576020818501810151868301820152016103d9565b81811115610407576000602083870101525b50601f01601f19169290920160200192915050565b600081516020845261043160208501826103cf565b949350505050565b60006020808352835181828501526101208401815160e0604087015281815180845261014093508388019150838160051b890101935085830192506000805b828110156104d75789860361013f19018452845180518088529089019089880190845b818110156104c15783516001600160601b0319168352928b0192918b019160010161049b565b5090975050509387019392870192600101610478565b5050505050828201519250603f19808683030160608701526104f9828561041c565b60408481015180516001600160a01b03191660808a01526020810151151560a08a015290810151151560c0890152606090810151601c0b60e089015290930151868403909101610100870152919250610554905082826103cf565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d20204df09f9a80206f4dc3a9c3a94df09f9a80206f4d6ff09f9a802020f09f9a804dc3a94d4df09f9a8020f09f9a80f09f9a806ff09f9a80c3a9c3a9204df09f9a806f6f6f6f6ff09f9a80f09f9a804d206ff09f9a80206f204d206f4da2646970667358221220859b435fe9f257db2c5e8192600fb5584f323c7921221e7e871cd9159df9c98d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_4cb03c13 {\n bytes12 s_0;\n bool s_1;\n bool s_2;\n int232 s_3;\n }\n\n struct S_04001719 {\n bytes20[][] s_0;\n S_97fc4627 s_1;\n S_4cb03c13 s_2;\n string s_3;\n }\n\n struct S_c72a3c2f {\n S_04001719 s_0;\n }\n\n function test () public pure returns (S_c72a3c2f memory) {\n S_c72a3c2f memory r;\n {\n S_04001719 memory r_0;\n {\n bytes20[][] memory r_0_0 = new bytes20[][](2);\n {\n bytes20[] memory r_0_0_0 = new bytes20[](4);\n {\n bytes20 r_0_0_0_0 = bytes20(0x2B751b3cFfD436f96B6655A92F2B64D4f7FA3827);\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n bytes20 r_0_0_0_1 = bytes20(0xd8B406369A9049d7B8360ab68d7f031Ce029B5e3);\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n bytes20 r_0_0_0_2 = bytes20(0x70C0b2F043D863509314BB5e8bAF2D60a2239C8c);\n r_0_0_0[2] = r_0_0_0_2;\n }\n {\n bytes20 r_0_0_0_3 = bytes20(0x7FFA80eBb975aA2d20201068BA62EE578DE660C0);\n r_0_0_0[3] = r_0_0_0_3;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n bytes20[] memory r_0_0_1 = new bytes20[](1);\n {\n bytes20 r_0_0_1_0 = bytes20(0x2442891fdAD5E05da17922E97DfF61427E58fE4c);\n r_0_0_1[0] = r_0_0_1_0;\n }\n r_0_0[1] = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n S_97fc4627 memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀M 🚀oo oo\";\n r_0_1.s_0 = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_4cb03c13 memory r_0_2;\n {\n bytes12 r_0_2_0 = bytes12(0x35bc7c7302722fbd0d264df5);\n r_0_2.s_0 = r_0_2_0;\n }\n {\n bool r_0_2_1 = false;\n r_0_2.s_1 = r_0_2_1;\n }\n {\n bool r_0_2_2 = true;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n int232 r_0_2_3 = -1230495026499905292590638413903629821495046673257734864151832135122449;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀M M🚀 oMééM🚀 oMo🚀 🚀MéMM🚀 🚀🚀o🚀éé M🚀ooooo🚀🚀M o🚀 o M oM\";\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000022035bc7c7302722fbd0d264df5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffd25bc049136dc83f94a4f1e60b5daf4457628ee814532e5544953d41ef00000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000042b751b3cffd436f96b6655a92f2b64d4f7fa3827000000000000000000000000d8b406369a9049d7b8360ab68d7f031ce029b5e300000000000000000000000070c0b2f043d863509314bb5e8baf2d60a2239c8c0000000000000000000000007ffa80ebb975aa2d20201068ba62ee578de660c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012442891fdad5e05da17922e97dff61427e58fe4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a804d20f09f9a806f6f206f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a804d20204df09f9a80206f4dc3a9c3a94df09f9a80206f4d6ff09f9a802020f09f9a804dc3a94d4df09f9a8020f09f9a80f09f9a806ff09f9a80c3a9c3a9204df09f9a806f6f6f6f6ff09f9a80f09f9a804d206ff09f9a80206f204d206f4d000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes6,bool)[1],address,string,(bytes20,bytes15,bool[3]))", + "type": "((bytes6,bool)[1],address,string,(bytes20,bytes15,bool[3]))", + "value": [ + [["0xc21b144974d5", true]], + "0x701eEb11438443EECb8484f36e516a667938A647", + "Moo é🚀 🚀 é oo Mo Mé o MM🚀oéo", + [ + "0xde71067c990c4d5ebd3374da97ee6a51c77def90", + "0x705c59baa8643e6cd3bc2a4ce2d943", + [true, true, true] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc21b144974d5" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "address", + "value": "0x701eEb11438443EECb8484f36e516a667938A647" + }, + { + "type": "string", + "value": "Moo é🚀 🚀 é oo Mo Mé o MM🚀oéo" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xde71067c990c4d5ebd3374da97ee6a51c77def90" + }, + { + "type": "hexstring", + "value": "0x705c59baa8643e6cd3bc2a4ce2d943" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061036f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061027d565b60405180910390f35b610056610127565b61005e610127565b61006661015a565b60408051808201825265c21b144974d560d01b8152600160208083019190915290835291835273701eeb11438443eecb8484f36e516a667938a64783830152805160608101909152602c80825260009261030e908301396040830152506100cb610193565b730de71067c990c4d5ebd3374da97ee6a51c77def960641b81526e705c59baa8643e6cd3bc2a4ce2d94360881b60208201526101056101ae565b6001808252602082018190526040808301919091528201526060820152919050565b604051806080016040528061013a61015a565b81526000602082015260606040820181905201610155610193565b905290565b60405180602001604052806001905b60408051808201909152600080825260208201528152602001906001900390816101695790505090565b60408051606081018252600080825260208201529081016101555b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b818110156101f2576020818501810151868301820152016101d6565b81811115610204576000602083870101525b50601f01601f19169290920160200192915050565b80516bffffffffffffffffffffffff1916825260208082015170ffffffffffffffffffffffffffffffffff19168184015260408083015190840160005b6003811015610275578251151582529183019190830190600101610256565b505050505050565b6020808252825160009190828483015b60018210156102c257825180516001600160d01b0319168252840151151584820152918301916001919091019060400161028d565b5050508301516001600160a01b03166060830152604083015161012060808401526102f16101408401826101cc565b9050606084015161030560a0850182610219565b50939250505056fe4d6f6f20c3a9f09f9a8020f09f9a802020c3a92020206f6f204d6f204dc3a9206f204d4df09f9a806fc3a96fa264697066735822122062755393f2564684a74a37e8342f4e5266cd2e81fc592cc1a36ae6a772117eb064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2a1fc9de {\n bytes6 s_0;\n bool s_1;\n }\n\n struct S_f0122cfc {\n bytes20 s_0;\n bytes15 s_1;\n bool[3] s_2;\n }\n\n struct S_9090bfc6 {\n S_2a1fc9de[1] s_0;\n address s_1;\n string s_2;\n S_f0122cfc s_3;\n }\n\n function test () public pure returns (S_9090bfc6 memory) {\n S_9090bfc6 memory r;\n {\n S_2a1fc9de[1] memory r_0;\n {\n S_2a1fc9de memory r_0_0;\n {\n bytes6 r_0_0_0 = bytes6(0xc21b144974d5);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bool r_0_0_1 = true;\n r_0_0.s_1 = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x701eEb11438443EECb8484f36e516a667938A647;\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀 🚀 é oo Mo Mé o MM🚀oéo\";\n r.s_2 = r_2;\n }\n {\n S_f0122cfc memory r_3;\n {\n bytes20 r_3_0 = bytes20(0xDE71067c990c4d5EbD3374Da97eE6a51c77DeF90);\n r_3.s_0 = r_3_0;\n }\n {\n bytes15 r_3_1 = bytes15(0x705c59baa8643e6cd3bc2a4ce2d943);\n r_3.s_1 = r_3_1;\n }\n {\n bool[3] memory r_3_2;\n {\n bool r_3_2_0 = true;\n r_3_2[0] = r_3_2_0;\n }\n {\n bool r_3_2_1 = true;\n r_3_2[1] = r_3_2_1;\n }\n {\n bool r_3_2_2 = true;\n r_3_2[2] = r_3_2_2;\n }\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020c21b144974d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000701eeb11438443eecb8484f36e516a667938a6470000000000000000000000000000000000000000000000000000000000000120de71067c990c4d5ebd3374da97ee6a51c77def90000000000000000000000000705c59baa8643e6cd3bc2a4ce2d9430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a8020f09f9a802020c3a92020206f6f204d6f204dc3a9206f204d4df09f9a806fc3a96f0000000000000000000000000000000000000000" + }, + { + "name": "random-((string,string,bool,address)[2],string,bool,bool,address)", + "type": "((string,string,bool,address)[2],string,bool,bool,address)", + "value": [ + [ + [ + "Moo é🚀é🚀ééooM oo 🚀 o🚀MMo ", + "Moo é🚀", + false, + "0x7917e63C2C317b1dcA2e463E767C0E9ad5833Ce6" + ], + [ + "Moo é🚀🚀oéo", + "Moo é🚀M 🚀 🚀MMo o🚀oéMoMé", + true, + "0x0Bc5d14c3D77dFc315230932Abd0602d77BAA3F3" + ] + ], + "Moo é🚀o o 🚀Moooo", + false, + false, + "0xFF5B6E6121A40dbCD3f2D442877e60d4DF7D6221" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀ééooM oo 🚀 o🚀MMo " + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x7917e63C2C317b1dcA2e463E767C0E9ad5833Ce6" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oéo" + }, + { + "type": "string", + "value": "Moo é🚀M 🚀 🚀MMo o🚀oéMoMé" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x0Bc5d14c3D77dFc315230932Abd0602d77BAA3F3" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o o 🚀Moooo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xFF5B6E6121A40dbCD3f2D442877e60d4DF7D6221" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610417806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102a2565b60405180910390f35b6100566101bf565b61005e6101bf565b6100666101f5565b61006e610222565b60006040518060600160405280602981526020016103b960299139825250604080518082018252600a8152689adede418753e13f3560b71b602080830191909152830152600090820152737917e63c2c317b1dca2e463e767c0e9ad5833ce6606082015281526100dc610222565b60408051808201825260128152714d6f6f20c3a9f09f9a80f09f9a806fc3a96f60701b602080830191909152908352815160608101909252602680835260009291610393908301396020838101919091526001604080850191909152730bc5d14c3d77dfc315230932abd0602d77baa3f36060808601919091528583019490945293855283518085018552601781527f4d6f6f20c3a9f09f9a806f206f20f09f9a804d6f6f6f6f000000000000000000818301529085015250600091830182905282015273ff5b6e6121a40dbcd3f2d442877e60d4df7d62216080820152919050565b6040518060a001604052806101d26101f5565b815260606020820181905260006040830181905290820181905260809091015290565b60405180604001604052806002905b61020c610222565b8152602001906001900390816102045790505090565b6040518060800160405280606081526020016060815260200160001515815260200160006001600160a01b031681525090565b6000815180845260005b8181101561027b5760208185018101518683018201520161025f565b8181111561028d576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825160a0838301526000919061010084019060c08501845b60028110156103335760bf198785030182528251608081518187526102e682880182610255565b91505086820151868203888801526102fe8282610255565b6040848101511515908901526060938401516001600160a01b03169390970192909252505091840191908401906001016102bf565b50505090840151838203601f19016040850152906103518183610255565b9150506040840151610367606085018215159052565b50606084015180151560808501525060808401516001600160a01b03811660a085015250939250505056fe4d6f6f20c3a9f09f9a804d20f09f9a8020f09f9a804d4d6f206ff09f9a806fc3a94d6f4dc3a94d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9c3a96f6f4d206f6f20f09f9a80206ff09f9a804d4d6f20a26469706673582212205897497a4540516c22f51017daf14873d4d1ce72a4652ee5b7c4937426a01b5964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ef299eca {\n string s_0;\n string s_1;\n bool s_2;\n address s_3;\n }\n\n struct S_558d29da {\n S_ef299eca[2] s_0;\n string s_1;\n bool s_2;\n bool s_3;\n address s_4;\n }\n\n function test () public pure returns (S_558d29da memory) {\n S_558d29da memory r;\n {\n S_ef299eca[2] memory r_0;\n {\n S_ef299eca memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀é🚀ééooM oo 🚀 o🚀MMo \";\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀\";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bool r_0_0_2 = false;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n address r_0_0_3 = 0x7917e63C2C317b1dcA2e463E767C0E9ad5833Ce6;\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n S_ef299eca memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀🚀oéo\";\n r_0_1.s_0 = r_0_1_0;\n }\n {\n string memory r_0_1_1 = unicode\"Moo é🚀M 🚀 🚀MMo o🚀oéMoMé\";\n r_0_1.s_1 = r_0_1_1;\n }\n {\n bool r_0_1_2 = true;\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x0Bc5d14c3D77dFc315230932Abd0602d77BAA3F3;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀o o 🚀Moooo\";\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xFF5B6E6121A40dbCD3f2D442877e60d4DF7D6221;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff5b6e6121a40dbcd3f2d442877e60d4df7d622100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007917e63c2c317b1dca2e463e767c0e9ad5833ce600000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9c3a96f6f4d206f6f20f09f9a80206ff09f9a804d4d6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000bc5d14c3d77dfc315230932abd0602d77baa3f300000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a80f09f9a806fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a804d20f09f9a8020f09f9a804d4d6f206ff09f9a806fc3a94d6f4dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806f206f20f09f9a804d6f6f6f6f000000000000000000" + }, + { + "name": "random-((uint200[2],bytes20,uint16),int176[2],bool,uint160,bool)", + "type": "((uint200[2],bytes20,uint16),int176[2],bool,uint160,bool)", + "value": [ + [ + [ + "253878955058213251608442499459315762991619067030695132612212", + "955496208067671215683343587904721043899117763595340713939529" + ], + "0x5d11e0f945d66e39b5e9394e235eff341bace71f", + "10948" + ], + [ + "-12089694410970776102697867858883943687635022755859588", + "-29824163311969341174979510466405237543379240151306587" + ], + true, + "90824256095498148182557652342801113584775544654", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "253878955058213251608442499459315762991619067030695132612212" + }, + { + "type": "number", + "value": "955496208067671215683343587904721043899117763595340713939529" + } + ] + }, + { + "type": "hexstring", + "value": "0x5d11e0f945d66e39b5e9394e235eff341bace71f" + }, + { + "type": "number", + "value": "10948" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-12089694410970776102697867858883943687635022755859588" + }, + { + "type": "number", + "value": "-29824163311969341174979510466405237543379240151306587" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "90824256095498148182557652342801113584775544654" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102d1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101f5565b60405180910390f35b610056610149565b61005e610149565b610066610184565b61006e6101ab565b782871fbf7b6f4ef50cf71aac327331dc4cc790824cfe2994674815278983825e18cd8b1fd5b5c7d7aa07bd6936f09b5d0666af9d249602080830191909152908252735d11e0f945d66e39b5e9394e235eff341bace71f60601b90820152612ac4604082015281526100de6101ab565b7520501ac6cabfd3355a3593a2d89b651356a4ffb70c83198152754fb68547f675364e104aea1823132098e739683e515a19602080830191909152820152600160408201819052730fe8b353e50d7b46a7c56f8113cd20a971613f4e60608301526080820152919050565b6040518060a0016040528061015c610184565b81526020016101696101ab565b81526000602082018190526040820181905260609091015290565b60405180606001604052806101976101ab565b815260006020820181905260409091015290565b60405180604001604052806002906020820280368337509192915050565b8060005b60028110156101ef57815160150b8452602093840193909101906001016101cd565b50505050565b81518051610120830191908360005b600281101561022c5782516001600160c81b0316825260209283019290910190600101610204565b5050506bffffffffffffffffffffffff19602082015116604084015261ffff604082015116606084015250602083015161026960808401826101c9565b506040830151151560c083015260608301516001600160a01b031660e08301526080909201511515610100909101529056fea26469706673582212203116e4aa076e1cdb73d9a2642784beee8d77100bd5f7fcd691801118c5dc120964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b1d7e5c3 {\n uint200[2] s_0;\n bytes20 s_1;\n uint16 s_2;\n }\n\n struct S_8df4de6d {\n S_b1d7e5c3 s_0;\n int176[2] s_1;\n bool s_2;\n uint160 s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_8df4de6d memory) {\n S_8df4de6d memory r;\n {\n S_b1d7e5c3 memory r_0;\n {\n uint200[2] memory r_0_0;\n {\n uint200 r_0_0_0 = 253878955058213251608442499459315762991619067030695132612212;\n r_0_0[0] = r_0_0_0;\n }\n {\n uint200 r_0_0_1 = 955496208067671215683343587904721043899117763595340713939529;\n r_0_0[1] = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bytes20 r_0_1 = bytes20(0x5D11E0F945d66E39B5e9394E235EFF341bAcE71f);\n r_0.s_1 = r_0_1;\n }\n {\n uint16 r_0_2 = 10948;\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n int176[2] memory r_1;\n {\n int176 r_1_0 = -12089694410970776102697867858883943687635022755859588;\n r_1[0] = r_1_0;\n }\n {\n int176 r_1_1 = -29824163311969341174979510466405237543379240151306587;\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n uint160 r_3 = 90824256095498148182557652342801113584775544654;\n r.s_3 = r_3;\n }\n {\n bool r_4 = true;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000002871fbf7b6f4ef50cf71aac327331dc4cc790824cfe299467400000000000000983825e18cd8b1fd5b5c7d7aa07bd6936f09b5d0666af9d2495d11e0f945d66e39b5e9394e235eff341bace71f0000000000000000000000000000000000000000000000000000000000000000000000000000000000002ac4ffffffffffffffffffffdfafe53935402ccaa5ca6c5d27649aeca95b0048f37cffffffffffffffffffffb0497ab8098ac9b1efb515e7dcecdf6718c697c1aea500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000fe8b353e50d7b46a7c56f8113cd20a971613f4e0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-((uint248,bool,bytes6[4],bool,address),address,uint96,int224)", + "type": "((uint248,bool,bytes6[4],bool,address),address,uint96,int224)", + "value": [ + [ + "99602940391286750557904513903661447258084559118647769796622685540395054819", + false, + ["0xd1461a2388eb", "0x51a867adbfad", "0x5e85f4858f14", "0x96893bb7bc7c"], + true, + "0x66c1E06D32b2657a6b9A6B8332966a3FBB63281E" + ], + "0xfFc57910e425632F55063AD0b47535E85612C07a", + "43545786764963067146990346372", + "-7487339056905709324895045442282257461691714737378107329306905464035" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "99602940391286750557904513903661447258084559118647769796622685540395054819" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd1461a2388eb" + }, + { + "type": "hexstring", + "value": "0x51a867adbfad" + }, + { + "type": "hexstring", + "value": "0x5e85f4858f14" + }, + { + "type": "hexstring", + "value": "0x96893bb7bc7c" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x66c1E06D32b2657a6b9A6B8332966a3FBB63281E" + } + ] + }, + { + "type": "address", + "value": "0xfFc57910e425632F55063AD0b47535E85612C07a" + }, + { + "type": "number", + "value": "43545786764963067146990346372" + }, + { + "type": "number", + "value": "-7487339056905709324895045442282257461691714737378107329306905464035" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102c3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101dc565b60405180910390f35b61005661015d565b61005e61015d565b61006661018b565b7e385f8e64298f01584a84043380042463dc1a66e96d924b875d253ffa94f6e38152600060208201526100976101be565b65d1461a2388eb60d01b81526551a867adbfad60d01b6020808301919091526517a17d2163c560d21b6040808401919091526525a24eedef1f60d21b606080850191909152848201939093526001848401527366c1e06d32b2657a6b9a6b8332966a3fbb63281e608085015292845273ffc57910e425632f55063ad0b47535e85612c07a908401526b8cb43b06a87e1a4385e56084918301919091527fffffffffb8e7497740f54e41b5a497966f21cb5bcd2445fc4e2e18fccda1331d90820152919050565b604051806080016040528061017061018b565b81526000602082018190526040820181905260609091015290565b6040805160a081018252600080825260208201529081016101aa6101be565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b815180516001600160f81b031682526020808201511515818401526040808301516101608501939291850160005b60048110156102315782516001600160d01b0319168252918301919083019060010161020a565b505050606082810151151560c08601526080909201516001600160a01b0390811660e0860152908501511661010084015260408401516bffffffffffffffffffffffff166101208401529290920151601b0b610140909101529056fea26469706673582212202b8d945f16cc82b32a8228753f1df5f5de626ddbbe24c8f29c36338fabe1e24864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f6081e44 {\n uint248 s_0;\n bool s_1;\n bytes6[4] s_2;\n bool s_3;\n address s_4;\n }\n\n struct S_dc2d6193 {\n S_f6081e44 s_0;\n address s_1;\n uint96 s_2;\n int224 s_3;\n }\n\n function test () public pure returns (S_dc2d6193 memory) {\n S_dc2d6193 memory r;\n {\n S_f6081e44 memory r_0;\n {\n uint248 r_0_0 = 99602940391286750557904513903661447258084559118647769796622685540395054819;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n bytes6[4] memory r_0_2;\n {\n bytes6 r_0_2_0 = bytes6(0xd1461a2388eb);\n r_0_2[0] = r_0_2_0;\n }\n {\n bytes6 r_0_2_1 = bytes6(0x51a867adbfad);\n r_0_2[1] = r_0_2_1;\n }\n {\n bytes6 r_0_2_2 = bytes6(0x5e85f4858f14);\n r_0_2[2] = r_0_2_2;\n }\n {\n bytes6 r_0_2_3 = bytes6(0x96893bb7bc7c);\n r_0_2[3] = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x66c1E06D32b2657a6b9A6B8332966a3FBB63281E;\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xfFc57910e425632F55063AD0b47535E85612C07a;\n r.s_1 = r_1;\n }\n {\n uint96 r_2 = 43545786764963067146990346372;\n r.s_2 = r_2;\n }\n {\n int224 r_3 = -7487339056905709324895045442282257461691714737378107329306905464035;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00385f8e64298f01584a84043380042463dc1a66e96d924b875d253ffa94f6e30000000000000000000000000000000000000000000000000000000000000000d1461a2388eb000000000000000000000000000000000000000000000000000051a867adbfad00000000000000000000000000000000000000000000000000005e85f4858f14000000000000000000000000000000000000000000000000000096893bb7bc7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000066c1e06d32b2657a6b9a6b8332966a3fbb63281e000000000000000000000000ffc57910e425632f55063ad0b47535e85612c07a00000000000000000000000000000000000000008cb43b06a87e1a4385e56084ffffffffb8e7497740f54e41b5a497966f21cb5bcd2445fc4e2e18fccda1331d" + }, + { + "name": "random-(address,(bool,((address,address),bool,uint16)),string,address)[]", + "type": "(address,(bool,((address,address),bool,uint16)),string,address)[]", + "value": [ + [ + "0x9dad9C027718d9759edd7e1e98Fd55C5c8A8a655", + [ + true, + [ + [ + "0xe5e3D05962E5BC2AB7dfe7EE01C5F752a2b4F7b6", + "0x154EBbd2D37c1d31c89Bff237DcB59Ba8fc02a0B" + ], + true, + "48540" + ] + ], + "Moo é🚀 o", + "0xC22127ca9aeC166F785758943Eb269d56439c725" + ], + [ + "0xafD52Be94282658987BCE2bcff25eAD1010D8415", + [ + true, + [ + [ + "0x133FC77665E472e4f9B6998dbc18A9Fb90B0530A", + "0x24a915C14b46E1fA7B9E77B57B06556b01690566" + ], + true, + "58926" + ] + ], + "Moo é🚀 éoo 🚀o🚀M oo ooooo🚀oMMo ooéMo🚀oo🚀MMooéo🚀 éMMéo🚀M", + "0xCbEcb2468751D6d45e8e1BF16D9dBbBd25E564BA" + ], + [ + "0xC4b48e4c2483178862981E5E422dFe05242075B9", + [ + true, + [ + [ + "0xd263A09C7Ac0eF62774084133FdA8E8De534Af3D", + "0x144c5c2956Ae5AF5597CcfFe31DB5327e7B079cD" + ], + false, + "41816" + ] + ], + "Moo é🚀oo ooooMoéo🚀é🚀éé🚀M 🚀o🚀🚀 oMoo🚀", + "0x52dBf1130234d265C1eC88CC0d1dAf91BC3b32CC" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9dad9C027718d9759edd7e1e98Fd55C5c8A8a655" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xe5e3D05962E5BC2AB7dfe7EE01C5F752a2b4F7b6" + }, + { + "type": "address", + "value": "0x154EBbd2D37c1d31c89Bff237DcB59Ba8fc02a0B" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "48540" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 o" + }, + { + "type": "address", + "value": "0xC22127ca9aeC166F785758943Eb269d56439c725" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xafD52Be94282658987BCE2bcff25eAD1010D8415" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x133FC77665E472e4f9B6998dbc18A9Fb90B0530A" + }, + { + "type": "address", + "value": "0x24a915C14b46E1fA7B9E77B57B06556b01690566" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "58926" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 éoo 🚀o🚀M oo ooooo🚀oMMo ooéMo🚀oo🚀MMooéo🚀 éMMéo🚀M" + }, + { + "type": "address", + "value": "0xCbEcb2468751D6d45e8e1BF16D9dBbBd25E564BA" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xC4b48e4c2483178862981E5E422dFe05242075B9" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd263A09C7Ac0eF62774084133FdA8E8De534Af3D" + }, + { + "type": "address", + "value": "0x144c5c2956Ae5AF5597CcfFe31DB5327e7B079cD" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "41816" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo ooooMoéo🚀é🚀éé🚀M 🚀o🚀🚀 oMoo🚀" + }, + { + "type": "address", + "value": "0x52dBf1130234d265C1eC88CC0d1dAf91BC3b32CC" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610624806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061045e565b60405180910390f35b6040805160038082526080820190925260609160009190816020015b610072610391565b81526020019060019003908161006a57905050905061008f610391565b739dad9c027718d9759edd7e1e98fd55c5c8a8a65581526100ae6103c8565b60018082526040805160a0810182526000606080830182815260808401839052835260208084018381528486018481528651808801885273e5e3d05962e5bc2ab7dfe7ee01c5f752a2b4f7b6815273154ebbd2d37c1d31c89bff237dcb59ba8fc02a0b81850152865296905261bd9c909552848601929092528584019490945281518083018352600c81526b4d6f6f20c3a9f09f9a80206f60a01b938101939093529084019190915273c22127ca9aec166f785758943eb269d56439c7259083015282518291849161018257610182610544565b602002602001018190525050610196610391565b73afd52be94282658987bce2bcff25ead1010d841581526101b56103c8565b60018082526040805160a081018252600060608201818152608080840183905290835260208084018381528486018481528651808801885273133fc77665e472e4f9b6998dbc18a9fb90b0530a81527324a915c14b46e1fa7b9e77b57b06556b0169056681850152865296905261e62e909552848601929092528584019490945281519081019091526054808252909161055b9083013960408301525073cbecb2468751d6d45e8e1bf16d9dbbbd25e564ba6060820152815181908390600190811061028357610283610544565b602002602001018190525050610297610391565b73c4b48e4c2483178862981e5e422dfe05242075b981526102b66103c8565b600181526040805160a0810182526000606080830182815260808401839052835260208084018381528486018481528651808801885273d263a09c7ac0ef62774084133fda8e8de534af3d815273144c5c2956ae5af5597ccffe31db5327e7b079cd8185015286529084905261a35890528086019390935285830194909452825193840183528284529291906105af908301396040830152507352dbf1130234d265c1ec88cc0d1daf91bc3b32cc6060820152815181908390600290811061038057610380610544565b602090810291909101015250919050565b604051806080016040528060006001600160a01b031681526020016103b46103c8565b815260606020820152600060409091015290565b604051806040016040528060001515815260200161040c6040805160a081018252600060608201818152608083018290528252602082018190529181019190915290565b905290565b6000815180845260005b818110156104375760208185018101518683018201520161041b565b81811115610449576000602083870101525b50601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561053657888303603f19018552815180516001600160a01b03908116855288820151805115158a8701528901518051805183168a8801528a0151918216606080880191909152818b0151151560808801528982015161ffff1660a08801528984015161010060c0890181905293909291610505858a0185610411565b9501516001600160a01b03811660e08a015294935061052392505050565b9588019593505090860190600101610485565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a8020c3a96f6f20f09f9a806ff09f9a804d206f6f206f6f6f6f6ff09f9a806f4d4d6f206f6fc3a94d6ff09f9a806f6ff09f9a804d4d6f6fc3a96ff09f9a8020c3a94d4dc3a96ff09f9a804d4d6f6f20c3a9f09f9a806f6f206f6f6f6f4d6fc3a96ff09f9a80c3a9f09f9a80c3a9c3a9f09f9a804d20f09f9a806ff09f9a80f09f9a80206f4d6f6ff09f9a80a2646970667358221220a7e5810084bc4fcc863687b5e8a2ffe9679c92f25e214dbb4aa0d8345d26916a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3b625bf6 {\n address s_0;\n address s_1;\n }\n\n struct S_9e869568 {\n S_3b625bf6 s_0;\n bool s_1;\n uint16 s_2;\n }\n\n struct S_fb839f57 {\n bool s_0;\n S_9e869568 s_1;\n }\n\n struct S_d57c4fe5 {\n address s_0;\n S_fb839f57 s_1;\n string s_2;\n address s_3;\n }\n\n function test () public pure returns (S_d57c4fe5[] memory) {\n S_d57c4fe5[] memory r = new S_d57c4fe5[](3);\n {\n S_d57c4fe5 memory r_0;\n {\n address r_0_0 = 0x9dad9C027718d9759edd7e1e98Fd55C5c8A8a655;\n r_0.s_0 = r_0_0;\n }\n {\n S_fb839f57 memory r_0_1;\n {\n bool r_0_1_0 = true;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n S_9e869568 memory r_0_1_1;\n {\n S_3b625bf6 memory r_0_1_1_0;\n {\n address r_0_1_1_0_0 = 0xe5e3D05962E5BC2AB7dfe7EE01C5F752a2b4F7b6;\n r_0_1_1_0.s_0 = r_0_1_1_0_0;\n }\n {\n address r_0_1_1_0_1 = 0x154EBbd2D37c1d31c89Bff237DcB59Ba8fc02a0B;\n r_0_1_1_0.s_1 = r_0_1_1_0_1;\n }\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n bool r_0_1_1_1 = true;\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n uint16 r_0_1_1_2 = 48540;\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀 o\";\n r_0.s_2 = r_0_2;\n }\n {\n address r_0_3 = 0xC22127ca9aeC166F785758943Eb269d56439c725;\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_d57c4fe5 memory r_1;\n {\n address r_1_0 = 0xafD52Be94282658987BCE2bcff25eAD1010D8415;\n r_1.s_0 = r_1_0;\n }\n {\n S_fb839f57 memory r_1_1;\n {\n bool r_1_1_0 = true;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_9e869568 memory r_1_1_1;\n {\n S_3b625bf6 memory r_1_1_1_0;\n {\n address r_1_1_1_0_0 = 0x133FC77665E472e4f9B6998dbc18A9Fb90B0530A;\n r_1_1_1_0.s_0 = r_1_1_1_0_0;\n }\n {\n address r_1_1_1_0_1 = 0x24a915C14b46E1fA7B9E77B57B06556b01690566;\n r_1_1_1_0.s_1 = r_1_1_1_0_1;\n }\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n {\n bool r_1_1_1_1 = true;\n r_1_1_1.s_1 = r_1_1_1_1;\n }\n {\n uint16 r_1_1_1_2 = 58926;\n r_1_1_1.s_2 = r_1_1_1_2;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀 éoo 🚀o🚀M oo ooooo🚀oMMo ooéMo🚀oo🚀MMooéo🚀 éMMéo🚀M\";\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0xCbEcb2468751D6d45e8e1BF16D9dBbBd25E564BA;\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_d57c4fe5 memory r_2;\n {\n address r_2_0 = 0xC4b48e4c2483178862981E5E422dFe05242075B9;\n r_2.s_0 = r_2_0;\n }\n {\n S_fb839f57 memory r_2_1;\n {\n bool r_2_1_0 = true;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n S_9e869568 memory r_2_1_1;\n {\n S_3b625bf6 memory r_2_1_1_0;\n {\n address r_2_1_1_0_0 = 0xd263A09C7Ac0eF62774084133FdA8E8De534Af3D;\n r_2_1_1_0.s_0 = r_2_1_1_0_0;\n }\n {\n address r_2_1_1_0_1 = 0x144c5c2956Ae5AF5597CcfFe31DB5327e7B079cD;\n r_2_1_1_0.s_1 = r_2_1_1_0_1;\n }\n r_2_1_1.s_0 = r_2_1_1_0;\n }\n {\n bool r_2_1_1_1 = false;\n r_2_1_1.s_1 = r_2_1_1_1;\n }\n {\n uint16 r_2_1_1_2 = 41816;\n r_2_1_1.s_2 = r_2_1_1_2;\n }\n r_2_1.s_1 = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀oo ooooMoéo🚀é🚀éé🚀M 🚀o🚀🚀 oMoo🚀\";\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0x52dBf1130234d265C1eC88CC0d1dAf91BC3b32CC;\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000003200000000000000000000000009dad9c027718d9759edd7e1e98fd55c5c8a8a6550000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e5e3d05962e5bc2ab7dfe7ee01c5f752a2b4f7b6000000000000000000000000154ebbd2d37c1d31c89bff237dcb59ba8fc02a0b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000bd9c0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c22127ca9aec166f785758943eb269d56439c725000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a80206f0000000000000000000000000000000000000000000000000000000000000000afd52be94282658987bce2bcff25ead1010d84150000000000000000000000000000000000000000000000000000000000000001000000000000000000000000133fc77665e472e4f9b6998dbc18a9fb90b0530a00000000000000000000000024a915c14b46e1fa7b9e77b57b06556b016905660000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000e62e0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000cbecb2468751d6d45e8e1bf16d9dbbbd25e564ba00000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a8020c3a96f6f20f09f9a806ff09f9a804d206f6f206f6f6f6f6ff09f9a806f4d4d6f206f6fc3a94d6ff09f9a806f6ff09f9a804d4d6f6fc3a96ff09f9a8020c3a94d4dc3a96ff09f9a804d000000000000000000000000000000000000000000000000c4b48e4c2483178862981e5e422dfe05242075b90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d263a09c7ac0ef62774084133fda8e8de534af3d000000000000000000000000144c5c2956ae5af5597ccffe31db5327e7b079cd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a358000000000000000000000000000000000000000000000000000000000000010000000000000000000000000052dbf1130234d265c1ec88cc0d1daf91bc3b32cc00000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a806f6f206f6f6f6f4d6fc3a96ff09f9a80c3a9f09f9a80c3a9c3a9f09f9a804d20f09f9a806ff09f9a80f09f9a80206f4d6f6ff09f9a80" + }, + { + "name": "random-(address,(uint136,int112,string),(bytes5,uint256,int120),address,bool)", + "type": "(address,(uint136,int112,string),(bytes5,uint256,int120),address,bool)", + "value": [ + "0x22e5F3cfe77619b8eD55839672BF47CeE02bEF29", + [ + "6843086358873741979853087704205261977670", + "1358718478852931231120119085615776", + "Moo é🚀 oéMo o oM🚀🚀oMooMo é M o o oo🚀Mé🚀é " + ], + [ + "0x190caeb527", + "37474951617961320889277165096939669819235052587430698714357622185654945595872", + "456312468100962624098114849940908139" + ], + "0x6499946868BFd16a05BE3115e2668CE9fEA1E2ae", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x22e5F3cfe77619b8eD55839672BF47CeE02bEF29" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "6843086358873741979853087704205261977670" + }, + { + "type": "number", + "value": "1358718478852931231120119085615776" + }, + { + "type": "string", + "value": "Moo é🚀 oéMo o oM🚀🚀oMooMo é M o o oo🚀Mé🚀é " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x190caeb527" + }, + { + "type": "number", + "value": "37474951617961320889277165096939669819235052587430698714357622185654945595872" + }, + { + "type": "number", + "value": "456312468100962624098114849940908139" + } + ] + }, + { + "type": "address", + "value": "0x6499946868BFd16a05BE3115e2668CE9fEA1E2ae" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610355806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ec565b60405180910390f35b61005661016d565b61005e61016d565b7322e5f3cfe77619b8ed55839672bf47cee02bef298152604080516060808201835281830181905270141c2a7e391131a8dcabb67df95b06b84682526d42fd702f9feb65d43f8d91b74aa06020808401919091528351918201909352603e8082529192600092906102e29083013960408301525060208201526100fa604080516060810182526000808252602082018190529181019190915290565b64190caeb52760d81b81527f52da122a616c29214afab6c4f7be7dc1dd5f0de136bb37491f268485461441e060208201526e57e1f110ff5691f1d785df46eb286b604080830191909152820152736499946868bfd16a05be3115e2668ce9fea1e2ae606082015260006080820152919050565b6040518060a0016040528060006001600160a01b031681526020016101b8604051806060016040528060006001600160881b031681526020016000600d0b8152602001606081525090565b8152604080516060810182526000808252602082810182905292820152910190815260006020820181905260409091015290565b6000602080835260018060a01b03845116818401528084015160e060408501526001600160881b0381511661010085015281810151600d0b61012085015260408101519050606061014085015280518061016086015260005b818110156102625782810184015186820161018001528301610245565b8181111561027557600061018083880101525b5060408681015180516001600160d81b03191660608801526020810151608088015290810151600e0b60a0870152925060608601516001600160a01b03811660c08701529250608086015180151560e08701529250601f01601f1916939093016101800194935050505056fe4d6f6f20c3a9f09f9a80206fc3a94d6f206f20206f4df09f9a80f09f9a806f4d6f6f4d6f20c3a9204d206f206f206f6ff09f9a804dc3a9f09f9a80c3a920a2646970667358221220553d7d5f33b7b70138c5ef064d2f1a7efcee3721464f0ebd2d813234a0d1822564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4c8d97ce {\n uint136 s_0;\n int112 s_1;\n string s_2;\n }\n\n struct S_e088f480 {\n bytes5 s_0;\n uint256 s_1;\n int120 s_2;\n }\n\n struct S_3a9f78e7 {\n address s_0;\n S_4c8d97ce s_1;\n S_e088f480 s_2;\n address s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_3a9f78e7 memory) {\n S_3a9f78e7 memory r;\n {\n address r_0 = 0x22e5F3cfe77619b8eD55839672BF47CeE02bEF29;\n r.s_0 = r_0;\n }\n {\n S_4c8d97ce memory r_1;\n {\n uint136 r_1_0 = 6843086358873741979853087704205261977670;\n r_1.s_0 = r_1_0;\n }\n {\n int112 r_1_1 = 1358718478852931231120119085615776;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀 oéMo o oM🚀🚀oMooMo é M o o oo🚀Mé🚀é \";\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n S_e088f480 memory r_2;\n {\n bytes5 r_2_0 = bytes5(0x190caeb527);\n r_2.s_0 = r_2_0;\n }\n {\n uint256 r_2_1 = 37474951617961320889277165096939669819235052587430698714357622185654945595872;\n r_2.s_1 = r_2_1;\n }\n {\n int120 r_2_2 = 456312468100962624098114849940908139;\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x6499946868BFd16a05BE3115e2668CE9fEA1E2ae;\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000022e5f3cfe77619b8ed55839672bf47cee02bef2900000000000000000000000000000000000000000000000000000000000000e0190caeb52700000000000000000000000000000000000000000000000000000052da122a616c29214afab6c4f7be7dc1dd5f0de136bb37491f268485461441e0000000000000000000000000000000000057e1f110ff5691f1d785df46eb286b0000000000000000000000006499946868bfd16a05be3115e2668ce9fea1e2ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141c2a7e391131a8dcabb67df95b06b84600000000000000000000000000000000000042fd702f9feb65d43f8d91b74aa00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80206fc3a94d6f206f20206f4df09f9a80f09f9a806f4d6f6f4d6f20c3a9204d206f206f206f6ff09f9a804dc3a9f09f9a80c3a9200000" + }, + { + "name": "random-(address,address,(string,address,bytes26,bool,uint8[4][3]))", + "type": "(address,address,(string,address,bytes26,bool,uint8[4][3]))", + "value": [ + "0x82BECf40d84f7bF9d952C588D4FDCd4d766398b4", + "0xbEF85a4D884E29378978f6112ca7f80d2521Ed2e", + [ + "Moo é🚀M é🚀oéoMMMM 🚀éooooéoéoo🚀 Mo éM🚀 MM", + "0x80D5b853522885910d95D4031730C785ba7904A9", + "0xfdae75f0e7f1d7d181cf04c41f0686cbc1f812c139de03d197b4", + true, + [ + ["147", "104", "29", "175"], + ["170", "254", "18", "228"], + ["181", "94", "189", "91"] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x82BECf40d84f7bF9d952C588D4FDCd4d766398b4" + }, + { + "type": "address", + "value": "0xbEF85a4D884E29378978f6112ca7f80d2521Ed2e" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M é🚀oéoMMMM 🚀éooooéoéoo🚀 Mo éM🚀 MM" + }, + { + "type": "address", + "value": "0x80D5b853522885910d95D4031730C785ba7904A9" + }, + { + "type": "hexstring", + "value": "0xfdae75f0e7f1d7d181cf04c41f0686cbc1f812c139de03d197b4" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "147" + }, + { + "type": "number", + "value": "104" + }, + { + "type": "number", + "value": "29" + }, + { + "type": "number", + "value": "175" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "170" + }, + { + "type": "number", + "value": "254" + }, + { + "type": "number", + "value": "18" + }, + { + "type": "number", + "value": "228" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "181" + }, + { + "type": "number", + "value": "94" + }, + { + "type": "number", + "value": "189" + }, + { + "type": "number", + "value": "91" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103c1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061027b565b60405180910390f35b61005661018b565b61005e61018b565b7382becf40d84f7bf9d952c588d4fdcd4d766398b4815273bef85a4d884e29378978f6112ca7f80d2521ed2e60208201526100976101af565b60006040518060600160405280603f815260200161034d603f91398252507380d5b853522885910d95d4031730c785ba7904a960208201527ffdae75f0e7f1d7d181cf04c41f0686cbc1f812c139de03d197b40000000000006040820152600160608201526101046101db565b61010c610208565b6093815260686020820152601d604082015260af6060820152815261012f610208565b60aa815260fe6020808301919091526012604083015260e46060830152820152610157610208565b60b58152605e602082015260bd604080830191909152605b6060830152828101919091526080830191909152820152919050565b60408051606081018252600080825260208201529081016101aa6101af565b905290565b6040805160a0810182526060808252600060208301819052928201839052810191909152608081016101aa5b60405180606001604052806003905b6101f2610208565b8152602001906001900390816101ea5790505090565b60405180608001604052806004906020820280368337509192915050565b806000805b600381101561027457825185835b600481101561025b57825160ff16825260209283019290910190600101610239565b505050608094909401936020929092019160010161022b565b5050505050565b6000602080835260018060a01b03808551168285015280828601511660408501525060408401516060808501528051610200608086015280518061028087015260005b818110156102db578281018501518782016102a0015284016102be565b818111156102ee5760006102a083890101525b50928201516001600160a01b031660a0860152604082015165ffffffffffff191660c08601526060820151151560e0860152608082015192610334610100870185610226565b601f01601f1916949094016102a0019594505050505056fe4d6f6f20c3a9f09f9a804d2020c3a9f09f9a806fc3a96f4d4d4d4d20f09f9a80c3a96f6f6f6fc3a96fc3a96f6ff09f9a80204d6f20c3a94df09f9a80204d4da2646970667358221220e9f6e4f00b04090ee5a6c16adbdba526f566033c35921fb64997ea7ece5a234d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_bdf3e8c9 {\n string s_0;\n address s_1;\n bytes26 s_2;\n bool s_3;\n uint8[4][3] s_4;\n }\n\n struct S_035c0409 {\n address s_0;\n address s_1;\n S_bdf3e8c9 s_2;\n }\n\n function test () public pure returns (S_035c0409 memory) {\n S_035c0409 memory r;\n {\n address r_0 = 0x82BECf40d84f7bF9d952C588D4FDCd4d766398b4;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xbEF85a4D884E29378978f6112ca7f80d2521Ed2e;\n r.s_1 = r_1;\n }\n {\n S_bdf3e8c9 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀M é🚀oéoMMMM 🚀éooooéoéoo🚀 Mo éM🚀 MM\";\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x80D5b853522885910d95D4031730C785ba7904A9;\n r_2.s_1 = r_2_1;\n }\n {\n bytes26 r_2_2 = bytes26(0xfdae75f0e7f1d7d181cf04c41f0686cbc1f812c139de03d197b4);\n r_2.s_2 = r_2_2;\n }\n {\n bool r_2_3 = true;\n r_2.s_3 = r_2_3;\n }\n {\n uint8[4][3] memory r_2_4;\n {\n uint8[4] memory r_2_4_0;\n {\n uint8 r_2_4_0_0 = 147;\n r_2_4_0[0] = r_2_4_0_0;\n }\n {\n uint8 r_2_4_0_1 = 104;\n r_2_4_0[1] = r_2_4_0_1;\n }\n {\n uint8 r_2_4_0_2 = 29;\n r_2_4_0[2] = r_2_4_0_2;\n }\n {\n uint8 r_2_4_0_3 = 175;\n r_2_4_0[3] = r_2_4_0_3;\n }\n r_2_4[0] = r_2_4_0;\n }\n {\n uint8[4] memory r_2_4_1;\n {\n uint8 r_2_4_1_0 = 170;\n r_2_4_1[0] = r_2_4_1_0;\n }\n {\n uint8 r_2_4_1_1 = 254;\n r_2_4_1[1] = r_2_4_1_1;\n }\n {\n uint8 r_2_4_1_2 = 18;\n r_2_4_1[2] = r_2_4_1_2;\n }\n {\n uint8 r_2_4_1_3 = 228;\n r_2_4_1[3] = r_2_4_1_3;\n }\n r_2_4[1] = r_2_4_1;\n }\n {\n uint8[4] memory r_2_4_2;\n {\n uint8 r_2_4_2_0 = 181;\n r_2_4_2[0] = r_2_4_2_0;\n }\n {\n uint8 r_2_4_2_1 = 94;\n r_2_4_2[1] = r_2_4_2_1;\n }\n {\n uint8 r_2_4_2_2 = 189;\n r_2_4_2[2] = r_2_4_2_2;\n }\n {\n uint8 r_2_4_2_3 = 91;\n r_2_4_2[3] = r_2_4_2_3;\n }\n r_2_4[2] = r_2_4_2;\n }\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000082becf40d84f7bf9d952c588d4fdcd4d766398b4000000000000000000000000bef85a4d884e29378978f6112ca7f80d2521ed2e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000020000000000000000000000000080d5b853522885910d95d4031730c785ba7904a9fdae75f0e7f1d7d181cf04c41f0686cbc1f812c139de03d197b4000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a804d2020c3a9f09f9a806fc3a96f4d4d4d4d20f09f9a80c3a96f6f6f6fc3a96fc3a96f6ff09f9a80204d6f20c3a94df09f9a80204d4d00" + }, + { + "name": "random-(address,address,bytes25,(uint72,address,int216,address)[2],address)", + "type": "(address,address,bytes25,(uint72,address,int216,address)[2],address)", + "value": [ + "0xDfB03e76a127760Fa32bF6dE7381b538535ec874", + "0x6b94a6a48AA481B830A9075F5B92281263481D8D", + "0x3b205fcae1de15c8a4da4739ffb7b7b516fc9809a7a2ff6ecc", + [ + [ + "3692717907909319521814", + "0x13ea4b4c99c714105E367c01c142e07c805951FC", + "10669334262183701124233687440340846381739856249053860273281701505", + "0x3C17c4AbB1635083F9DfFCF6d9F51019C030889F" + ], + [ + "1703011203831543143230", + "0x64Bfbd2E981F15b2d5BE7545B8E95901217970E7", + "24809658015167646081161513227366217590539939179414939113365314645", + "0x7ac379e98D482e32b9429765aF5eA7A4aA9f2842" + ] + ], + "0x904E47E55497b39A98F09E45D9a30abF99E0E204" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xDfB03e76a127760Fa32bF6dE7381b538535ec874" + }, + { + "type": "address", + "value": "0x6b94a6a48AA481B830A9075F5B92281263481D8D" + }, + { + "type": "hexstring", + "value": "0x3b205fcae1de15c8a4da4739ffb7b7b516fc9809a7a2ff6ecc" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3692717907909319521814" + }, + { + "type": "address", + "value": "0x13ea4b4c99c714105E367c01c142e07c805951FC" + }, + { + "type": "number", + "value": "10669334262183701124233687440340846381739856249053860273281701505" + }, + { + "type": "address", + "value": "0x3C17c4AbB1635083F9DfFCF6d9F51019C030889F" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1703011203831543143230" + }, + { + "type": "address", + "value": "0x64Bfbd2E981F15b2d5BE7545B8E95901217970E7" + }, + { + "type": "number", + "value": "24809658015167646081161513227366217590539939179414939113365314645" + }, + { + "type": "address", + "value": "0x7ac379e98D482e32b9429765aF5eA7A4aA9f2842" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x904E47E55497b39A98F09E45D9a30abF99E0E204" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061032f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610241565b60405180910390f35b6100566101c5565b61005e6101c5565b73dfb03e76a127760fa32bf6de7381b538535ec8748152736b94a6a48aa481b830a9075f5b92281263481d8d60208201527f3b205fcae1de15c8a4da4739ffb7b7b516fc9809a7a2ff6ecc0000000000000060408201526100bd6101fb565b604080516080808201835268c82ec16c62b29ef61682527313ea4b4c99c714105e367c01c142e07c805951fc6020808401919091527a19ef8b02d28e266adf1e3beacdacfed7458a1089853704daba168183850152733c17c4abb1635083f9dffcf6d9f51019c030889f60608085019190915292855283518083018552685c520732f1d97c9b3e81527364bfbd2e981f15b2d5be7545b8e95901217970e7818301527a3c4f168cd96c1256644515c95e35c83cbb7ee0375c8b8f625a1c5594810194909452737ac379e98d482e32b9429765af5ea7a4aa9f28428484015284019290925283019190915273904e47e55497b39a98f09e45d9a30abf99e0e20490820152919050565b6040805160a08101825260008082526020820181905291810191909152606081016101ee6101fb565b8152600060209091015290565b60405180604001604052806002905b60408051608081018252600080825260208083018290529282018190526060820152825260001990920191018161020a5790505090565b81516001600160a01b03908116825260208084015182168184015260408085015166ffffffffffffff1916818501526060808601516101808601949392919081870160005b60028110156102d0578251805168ffffffffffffffffff1683528681015188168784015285810151601a0b8684015284015187168483015291850191608090910190600101610286565b5050505050505060808301516102f26101608401826001600160a01b03169052565b509291505056fea2646970667358221220da0534d2acf5193faaf2f88c6953d0914cb8dca5878e823c180c114c3db44dc364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_749d20f8 {\n uint72 s_0;\n address s_1;\n int216 s_2;\n address s_3;\n }\n\n struct S_b001601a {\n address s_0;\n address s_1;\n bytes25 s_2;\n S_749d20f8[2] s_3;\n address s_4;\n }\n\n function test () public pure returns (S_b001601a memory) {\n S_b001601a memory r;\n {\n address r_0 = 0xDfB03e76a127760Fa32bF6dE7381b538535ec874;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x6b94a6a48AA481B830A9075F5B92281263481D8D;\n r.s_1 = r_1;\n }\n {\n bytes25 r_2 = bytes25(0x3b205fcae1de15c8a4da4739ffb7b7b516fc9809a7a2ff6ecc);\n r.s_2 = r_2;\n }\n {\n S_749d20f8[2] memory r_3;\n {\n S_749d20f8 memory r_3_0;\n {\n uint72 r_3_0_0 = 3692717907909319521814;\n r_3_0.s_0 = r_3_0_0;\n }\n {\n address r_3_0_1 = 0x13ea4b4c99c714105E367c01c142e07c805951FC;\n r_3_0.s_1 = r_3_0_1;\n }\n {\n int216 r_3_0_2 = 10669334262183701124233687440340846381739856249053860273281701505;\n r_3_0.s_2 = r_3_0_2;\n }\n {\n address r_3_0_3 = 0x3C17c4AbB1635083F9DfFCF6d9F51019C030889F;\n r_3_0.s_3 = r_3_0_3;\n }\n r_3[0] = r_3_0;\n }\n {\n S_749d20f8 memory r_3_1;\n {\n uint72 r_3_1_0 = 1703011203831543143230;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n address r_3_1_1 = 0x64Bfbd2E981F15b2d5BE7545B8E95901217970E7;\n r_3_1.s_1 = r_3_1_1;\n }\n {\n int216 r_3_1_2 = 24809658015167646081161513227366217590539939179414939113365314645;\n r_3_1.s_2 = r_3_1_2;\n }\n {\n address r_3_1_3 = 0x7ac379e98D482e32b9429765aF5eA7A4aA9f2842;\n r_3_1.s_3 = r_3_1_3;\n }\n r_3[1] = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x904E47E55497b39A98F09E45D9a30abF99E0E204;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000dfb03e76a127760fa32bf6de7381b538535ec8740000000000000000000000006b94a6a48aa481b830a9075f5b92281263481d8d3b205fcae1de15c8a4da4739ffb7b7b516fc9809a7a2ff6ecc000000000000000000000000000000000000000000000000000000000000c82ec16c62b29ef61600000000000000000000000013ea4b4c99c714105e367c01c142e07c805951fc000000000019ef8b02d28e266adf1e3beacdacfed7458a1089853704daba16810000000000000000000000003c17c4abb1635083f9dffcf6d9f51019c030889f00000000000000000000000000000000000000000000005c520732f1d97c9b3e00000000000000000000000064bfbd2e981f15b2d5be7545b8e95901217970e700000000003c4f168cd96c1256644515c95e35c83cbb7ee0375c8b8f625a1c550000000000000000000000007ac379e98d482e32b9429765af5ea7a4aa9f2842000000000000000000000000904e47e55497b39a98f09e45d9a30abf99e0e204" + }, + { + "name": "random-(address,bool,(int120,(string[]),int96[4],bool,string))", + "type": "(address,bool,(int120,(string[]),int96[4],bool,string))", + "value": [ + "0x4a02671298D4Bd64bA890f35DAD7B66ACEa69BB6", + false, + [ + "-342740983664008083600573359238865747", + [ + [ + "Moo é🚀ooo o🚀MM o🚀 🚀M M MooM🚀🚀🚀🚀oo o🚀oMé o🚀🚀ooMé🚀ooo o oMo🚀o ", + "Moo é🚀Mo🚀éoMoooéooéMoMMo M o 🚀Moooo🚀 M MMééoMo🚀MéoMoMMo ", + "Moo é🚀o ooo ooM é🚀oMMM🚀oMo", + "Moo é🚀 é oMMMoooéo éoo é🚀 🚀 éMo🚀ooMé" + ] + ], + [ + "-35393757136970844383315485102", + "32839747911182099092588091051", + "-21527227785575933408595745655", + "34774979357630408063090019509" + ], + false, + "Moo é🚀o oo🚀🚀🚀M 🚀🚀o🚀M oé oMMééMéooMoMM o🚀oM" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4a02671298D4Bd64bA890f35DAD7B66ACEa69BB6" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-342740983664008083600573359238865747" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo o🚀MM o🚀 🚀M M MooM🚀🚀🚀🚀oo o🚀oMé o🚀🚀ooMé🚀ooo o oMo🚀o " + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀éoMoooéooéMoMMo M o 🚀Moooo🚀 M MMééoMo🚀MéoMoMMo " + }, + { + "type": "string", + "value": "Moo é🚀o ooo ooM é🚀oMMM🚀oMo" + }, + { + "type": "string", + "value": "Moo é🚀 é oMMMoooéo éoo é🚀 🚀 éMo🚀ooMé" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-35393757136970844383315485102" + }, + { + "type": "number", + "value": "32839747911182099092588091051" + }, + { + "type": "number", + "value": "-21527227785575933408595745655" + }, + { + "type": "number", + "value": "34774979357630408063090019509" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o oo🚀🚀🚀M 🚀🚀o🚀M oé oMMééMéooMoMM o🚀oM" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105ff806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061036b565b60405180910390f35b610056610264565b61005e610264565b734a02671298d4bd64ba890f35dad7b66acea69bb6815260006020820152610084610288565b6e42026f66ee38b17ccd9f6d756ae35219815260408051602081018252606081528151600480825260a08201909352909160009190816020015b60608152602001906001900390816100be57905050905060006040518060a0016040528060688152602001610562606891399050808260008151811061010657610106610457565b60200260200101819052505060006040518060800160405280604f815260200161046e604f91399050808260018151811061014357610143610457565b60200260200101819052505060006040518060600160405280602581526020016104bd602591399050808260028151811061018057610180610457565b602002602001018190525050600060405180606001604052806038815260200161052a60389139905080826003815181106101bd576101bd610457565b602090810291909101810191909152918352508201526101db6102d4565b6b725d079b04332c7ec4f3e1ad1981526b6a1c671d7580d241e05e56ab6020808301919091526b458ee7cca2b5d5e862251b76196040808401919091526b705d305062529b917a59ccb5606080850191909152848201939093526000928401839052805160808101909152604880825290916104e2908301396080830152506040820152919050565b6040805160608101825260008082526020820152908101610283610288565b905290565b6040518060a001604052806000600e0b81526020016102b36040518060200160405280606081525090565b81526020016102c06102d4565b815260006020820152606060409091015290565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b81811015610318576020818501810151868301820152016102fc565b8181111561032a576000602083870101525b50601f01601f19169290920160200192915050565b8060005b6004811015610365578151600b0b845260209384019390910190600101610343565b50505050565b602080825282516001600160a01b0316828201528281015115156040808401919091528301516060808401528051600e0b60808401528082015161010060a085015251610180840183905280516101a0850181905260009392918301906101c0600582901b870181019190870190865b8181101561040a576101bf198985030183526103f88486516102f2565b948701949350918601916001016103db565b5050506040830151935061042160c087018561033f565b606083015115156101408701526080830151607f1987830301610160880152935061044c81856102f2565b979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d6ff09f9a80c3a96f4d6f6f6fc3a96f6fc3a94d6f4d4d6f204d206f2020f09f9a804d6f6f6f6ff09f9a80204d204d4dc3a9c3a96f4d6ff09f9a804dc3a96f4d6f4d4d6f204d6f6f20c3a9f09f9a806f206f6f6f206f6f4d20c3a9f09f9a806f4d4d4df09f9a806f4d6f4d6f6f20c3a9f09f9a806f206f6ff09f9a80f09f9a80f09f9a804d2020f09f9a80f09f9a806ff09f9a804d206fc3a9206f4d4dc3a9c3a94dc3a96f6f4d6f4d4d206ff09f9a806f4d4d6f6f20c3a9f09f9a8020c3a9206f4d4d4d6f6f6fc3a96f20c3a96f6f20c3a9f09f9a802020f09f9a8020c3a94d6ff09f9a806f6f4dc3a94d6f6f20c3a9f09f9a806f6f6f206ff09f9a804d4d20206ff09f9a8020f09f9a804d204d204d6f6f4df09f9a80f09f9a80f09f9a80f09f9a806f6f20206ff09f9a806f4dc3a9206ff09f9a80f09f9a806f6f4dc3a9f09f9a806f6f6f206f206f4d6ff09f9a806f20a2646970667358221220b0b34c1479b933b90a731476c8fc751b9ff1ee0242b3cb0e3c6477905eb625b764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a227fd7a {\n string[] s_0;\n }\n\n struct S_e3505db6 {\n int120 s_0;\n S_a227fd7a s_1;\n int96[4] s_2;\n bool s_3;\n string s_4;\n }\n\n struct S_ea61bba6 {\n address s_0;\n bool s_1;\n S_e3505db6 s_2;\n }\n\n function test () public pure returns (S_ea61bba6 memory) {\n S_ea61bba6 memory r;\n {\n address r_0 = 0x4a02671298D4Bd64bA890f35DAD7B66ACEa69BB6;\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n S_e3505db6 memory r_2;\n {\n int120 r_2_0 = -342740983664008083600573359238865747;\n r_2.s_0 = r_2_0;\n }\n {\n S_a227fd7a memory r_2_1;\n {\n string[] memory r_2_1_0 = new string[](4);\n {\n string memory r_2_1_0_0 = unicode\"Moo é🚀ooo o🚀MM o🚀 🚀M M MooM🚀🚀🚀🚀oo o🚀oMé o🚀🚀ooMé🚀ooo o oMo🚀o \";\n r_2_1_0[0] = r_2_1_0_0;\n }\n {\n string memory r_2_1_0_1 = unicode\"Moo é🚀Mo🚀éoMoooéooéMoMMo M o 🚀Moooo🚀 M MMééoMo🚀MéoMoMMo \";\n r_2_1_0[1] = r_2_1_0_1;\n }\n {\n string memory r_2_1_0_2 = unicode\"Moo é🚀o ooo ooM é🚀oMMM🚀oMo\";\n r_2_1_0[2] = r_2_1_0_2;\n }\n {\n string memory r_2_1_0_3 = unicode\"Moo é🚀 é oMMMoooéo éoo é🚀 🚀 éMo🚀ooMé\";\n r_2_1_0[3] = r_2_1_0_3;\n }\n r_2_1.s_0 = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n {\n int96[4] memory r_2_2;\n {\n int96 r_2_2_0 = -35393757136970844383315485102;\n r_2_2[0] = r_2_2_0;\n }\n {\n int96 r_2_2_1 = 32839747911182099092588091051;\n r_2_2[1] = r_2_2_1;\n }\n {\n int96 r_2_2_2 = -21527227785575933408595745655;\n r_2_2[2] = r_2_2_2;\n }\n {\n int96 r_2_2_3 = 34774979357630408063090019509;\n r_2_2[3] = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n {\n bool r_2_3 = false;\n r_2.s_3 = r_2_3;\n }\n {\n string memory r_2_4 = unicode\"Moo é🚀o oo🚀🚀🚀M 🚀🚀o🚀M oé oMMééMéooMoMM o🚀oM\";\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000004a02671298d4bd64ba890f35dad7b66acea69bb600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060ffffffffffffffffffffffffffffffffffbdfd909911c74e833260928a951cad0000000000000000000000000000000000000000000000000000000000000100ffffffffffffffffffffffffffffffffffffffff8da2f864fbccd3813b0c1e5200000000000000000000000000000000000000006a1c671d7580d241e05e56abffffffffffffffffffffffffffffffffffffffffba7118335d4a2a179ddae4890000000000000000000000000000000000000000705d305062529b917a59ccb5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a806f6f6f206ff09f9a804d4d20206ff09f9a8020f09f9a804d204d204d6f6f4df09f9a80f09f9a80f09f9a80f09f9a806f6f20206ff09f9a806f4dc3a9206ff09f9a80f09f9a806f6f4dc3a9f09f9a806f6f6f206f206f4d6ff09f9a806f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a804d6ff09f9a80c3a96f4d6f6f6fc3a96f6fc3a94d6f4d4d6f204d206f2020f09f9a804d6f6f6f6ff09f9a80204d204d4dc3a9c3a96f4d6ff09f9a804dc3a96f4d6f4d4d6f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806f206f6f6f206f6f4d20c3a9f09f9a806f4d4d4df09f9a806f4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a8020c3a9206f4d4d4d6f6f6fc3a96f20c3a96f6f20c3a9f09f9a802020f09f9a8020c3a94d6ff09f9a806f6f4dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a806f206f6ff09f9a80f09f9a80f09f9a804d2020f09f9a80f09f9a806ff09f9a804d206fc3a9206f4d4dc3a9c3a94dc3a96f6f4d6f4d4d206ff09f9a806f4d000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,uint256[],address,(uint224[3][1],bool)[])", + "type": "(bool,uint256[],address,(uint224[3][1],bool)[])", + "value": [ + false, + [], + "0x7401E64eAcf2E89592f883BfDc29A07007655041", + [ + [ + [ + [ + "3665792924886486706395148864108103151715164442541023350299227423068", + "1438304417306487162635914423297439381530222489498886127364350061494", + "12255773174587558902021710215000274305151450508310768616354548800122" + ] + ], + false + ], + [ + [ + [ + "7277201430181717106404435747192108841822452929345930680254618780182", + "1243330844000495586956486211452132989160591235893043583972494226105", + "12573446197010984063385595380850908472488399026082223500810707151614" + ] + ], + false + ], + [ + [ + [ + "25861718082459565365078137080766635254659018946056216371384956302258", + "20299967070612523552149757330951295432386331384727574354202934870662", + "14854739284931674878547989318627917930882858402958036947429170250061" + ] + ], + true + ], + [ + [ + [ + "16506184985993955909713661827778470551924320576671290986571772963307", + "20258812640594799922528026732885190784399270915075222077547368418445", + "4892045323356677764744713343335843887511078449125656665735866635586" + ] + ], + true + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [] + }, + { + "type": "address", + "value": "0x7401E64eAcf2E89592f883BfDc29A07007655041" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3665792924886486706395148864108103151715164442541023350299227423068" + }, + { + "type": "number", + "value": "1438304417306487162635914423297439381530222489498886127364350061494" + }, + { + "type": "number", + "value": "12255773174587558902021710215000274305151450508310768616354548800122" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "7277201430181717106404435747192108841822452929345930680254618780182" + }, + { + "type": "number", + "value": "1243330844000495586956486211452132989160591235893043583972494226105" + }, + { + "type": "number", + "value": "12573446197010984063385595380850908472488399026082223500810707151614" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "25861718082459565365078137080766635254659018946056216371384956302258" + }, + { + "type": "number", + "value": "20299967070612523552149757330951295432386331384727574354202934870662" + }, + { + "type": "number", + "value": "14854739284931674878547989318627917930882858402958036947429170250061" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "16506184985993955909713661827778470551924320576671290986571772963307" + }, + { + "type": "number", + "value": "20258812640594799922528026732885190784399270915075222077547368418445" + }, + { + "type": "number", + "value": "4892045323356677764744713343335843887511078449125656665735866635586" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061058e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104b3565b60405180910390f35b60408051608080820183526000808352606060208085018290528486018390528185018290528551938401865282845283810182815284870184815285840193909352865184815280830188529052737401e64eacf2e89592f883bfdc29a070076550419091528451600480825260a082019096529394929391929082015b6100d56103a9565b8152602001906001900390816100cd5790505090506100f26103a9565b6100fa6103c9565b6101026103f6565b7b22cf0c89a6feac9272d00962f773ba34d78cfea50e82398d2d6d815c81527b0da853094bb3418c26728e40a28cc3f2ba5d2eaac43f4797a7feabb66020808301919091527b7460225ee934412a47765afde6ae244c4a7974ce74769e9f2007da7a6040830152908252908252600090820181905282518291849161018957610189610542565b60200260200101819052505061019d6103a9565b6101a56103c9565b6101ad6103f6565b7b4519e591691004a83b152b51c6594a6c80afe9243c317951a469c21681527b0bce5eaf0b3ae5849248b50c0a8dd28fa5b8a89be9257a3f921f32b96020808301919091527b77645ac726d7baaeef1db4574ae8f3f8216c895a28fcb368067e2afe6040830152908252908252600090820152815181908390600190811061023757610237610542565b60200260200101819052505061024b6103a9565b6102536103c9565b61025b6103f6565b7bf5925aac83f29e1e5eeb8f10d9afa1ac015d3c6a4edff4b6270133b281527bc0c27c85a5114f9d6c79a9c5fa5238348c52fbec4fad7570092b82866020808301919091527b8d0ddef3ae3c95a9c77b21f75e3393b9ba9c58b32951a1c52086814d604083015290825290825260019082015281518190839060029081106102e5576102e5610542565b6020026020010181905250506102f96103a9565b6103016103c9565b6103096103f6565b7b9cbc50227bfa7004d528d66b47d4b9cae61f249015460f61d40ba9eb81527bc05e720eb01d2cf6c10f25f6bf50d4974d37cf23a0de2be471a80c8d6020808301919091527b2e73e7475a70fc5a1bd21ae84b82edfe31dbbf2b0f5a89c20af455426040830152908252908252600190820152815181908390600390811061039357610393610542565b6020908102919091010152506060820152919050565b60405180604001604052806103bc6103c9565b8152600060209091015290565b60405180602001604052806001905b6103e06103f6565b8152602001906001900390816103d85790505090565b60405180606001604052806003906020820280368337509192915050565b600081518084526020808501945080840160005b838110156104a857815180518860005b60018082106104475750610489565b83518360005b60038110156104725782516001600160e01b03168252918a0191908a0190830161044d565b505050928701925060609190910190600101610438565b5050508301511515606088015260809096019590820190600101610428565b509495945050505050565b602080825282511515828201528281015160806040840152805160a0840181905260009291820190839060c08601905b8083101561050357835182529284019260019290920191908401906104e3565b5060408701516001600160a01b038116606088015293506060870151868203601f1901608088015293506105378185610414565b979650505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220524f08b5e516c0c60f23c5ad6b738e49c343fe7d984919fb4cdc67c0a3e3808b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0ce7a73b {\n uint224[3][1] s_0;\n bool s_1;\n }\n\n struct S_aeea6376 {\n bool s_0;\n uint256[] s_1;\n address s_2;\n S_0ce7a73b[] s_3;\n }\n\n function test () public pure returns (S_aeea6376 memory) {\n S_aeea6376 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n uint256[] memory r_1 = new uint256[](0);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x7401E64eAcf2E89592f883BfDc29A07007655041;\n r.s_2 = r_2;\n }\n {\n S_0ce7a73b[] memory r_3 = new S_0ce7a73b[](4);\n {\n S_0ce7a73b memory r_3_0;\n {\n uint224[3][1] memory r_3_0_0;\n {\n uint224[3] memory r_3_0_0_0;\n {\n uint224 r_3_0_0_0_0 = 3665792924886486706395148864108103151715164442541023350299227423068;\n r_3_0_0_0[0] = r_3_0_0_0_0;\n }\n {\n uint224 r_3_0_0_0_1 = 1438304417306487162635914423297439381530222489498886127364350061494;\n r_3_0_0_0[1] = r_3_0_0_0_1;\n }\n {\n uint224 r_3_0_0_0_2 = 12255773174587558902021710215000274305151450508310768616354548800122;\n r_3_0_0_0[2] = r_3_0_0_0_2;\n }\n r_3_0_0[0] = r_3_0_0_0;\n }\n r_3_0.s_0 = r_3_0_0;\n }\n {\n bool r_3_0_1 = false;\n r_3_0.s_1 = r_3_0_1;\n }\n r_3[0] = r_3_0;\n }\n {\n S_0ce7a73b memory r_3_1;\n {\n uint224[3][1] memory r_3_1_0;\n {\n uint224[3] memory r_3_1_0_0;\n {\n uint224 r_3_1_0_0_0 = 7277201430181717106404435747192108841822452929345930680254618780182;\n r_3_1_0_0[0] = r_3_1_0_0_0;\n }\n {\n uint224 r_3_1_0_0_1 = 1243330844000495586956486211452132989160591235893043583972494226105;\n r_3_1_0_0[1] = r_3_1_0_0_1;\n }\n {\n uint224 r_3_1_0_0_2 = 12573446197010984063385595380850908472488399026082223500810707151614;\n r_3_1_0_0[2] = r_3_1_0_0_2;\n }\n r_3_1_0[0] = r_3_1_0_0;\n }\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bool r_3_1_1 = false;\n r_3_1.s_1 = r_3_1_1;\n }\n r_3[1] = r_3_1;\n }\n {\n S_0ce7a73b memory r_3_2;\n {\n uint224[3][1] memory r_3_2_0;\n {\n uint224[3] memory r_3_2_0_0;\n {\n uint224 r_3_2_0_0_0 = 25861718082459565365078137080766635254659018946056216371384956302258;\n r_3_2_0_0[0] = r_3_2_0_0_0;\n }\n {\n uint224 r_3_2_0_0_1 = 20299967070612523552149757330951295432386331384727574354202934870662;\n r_3_2_0_0[1] = r_3_2_0_0_1;\n }\n {\n uint224 r_3_2_0_0_2 = 14854739284931674878547989318627917930882858402958036947429170250061;\n r_3_2_0_0[2] = r_3_2_0_0_2;\n }\n r_3_2_0[0] = r_3_2_0_0;\n }\n r_3_2.s_0 = r_3_2_0;\n }\n {\n bool r_3_2_1 = true;\n r_3_2.s_1 = r_3_2_1;\n }\n r_3[2] = r_3_2;\n }\n {\n S_0ce7a73b memory r_3_3;\n {\n uint224[3][1] memory r_3_3_0;\n {\n uint224[3] memory r_3_3_0_0;\n {\n uint224 r_3_3_0_0_0 = 16506184985993955909713661827778470551924320576671290986571772963307;\n r_3_3_0_0[0] = r_3_3_0_0_0;\n }\n {\n uint224 r_3_3_0_0_1 = 20258812640594799922528026732885190784399270915075222077547368418445;\n r_3_3_0_0[1] = r_3_3_0_0_1;\n }\n {\n uint224 r_3_3_0_0_2 = 4892045323356677764744713343335843887511078449125656665735866635586;\n r_3_3_0_0[2] = r_3_3_0_0_2;\n }\n r_3_3_0[0] = r_3_3_0_0;\n }\n r_3_3.s_0 = r_3_3_0;\n }\n {\n bool r_3_3_1 = true;\n r_3_3.s_1 = r_3_3_1;\n }\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000007401e64eacf2e89592f883bfdc29a0700765504100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000022cf0c89a6feac9272d00962f773ba34d78cfea50e82398d2d6d815c000000000da853094bb3418c26728e40a28cc3f2ba5d2eaac43f4797a7feabb6000000007460225ee934412a47765afde6ae244c4a7974ce74769e9f2007da7a0000000000000000000000000000000000000000000000000000000000000000000000004519e591691004a83b152b51c6594a6c80afe9243c317951a469c216000000000bce5eaf0b3ae5849248b50c0a8dd28fa5b8a89be9257a3f921f32b90000000077645ac726d7baaeef1db4574ae8f3f8216c895a28fcb368067e2afe000000000000000000000000000000000000000000000000000000000000000000000000f5925aac83f29e1e5eeb8f10d9afa1ac015d3c6a4edff4b6270133b200000000c0c27c85a5114f9d6c79a9c5fa5238348c52fbec4fad7570092b8286000000008d0ddef3ae3c95a9c77b21f75e3393b9ba9c58b32951a1c52086814d0000000000000000000000000000000000000000000000000000000000000001000000009cbc50227bfa7004d528d66b47d4b9cae61f249015460f61d40ba9eb00000000c05e720eb01d2cf6c10f25f6bf50d4974d37cf23a0de2be471a80c8d000000002e73e7475a70fc5a1bd21ae84b82edfe31dbbf2b0f5a89c20af455420000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool[],(uint232,bytes25,(bytes1,address,bool,bytes17,bytes31)))", + "type": "(bool[],(uint232,bytes25,(bytes1,address,bool,bytes17,bytes31)))", + "value": [ + [true, true], + [ + "5408742522785646425148029581182813623326896630270817566656441118176318", + "0xc4da06f301fba722c6e9abe4726d30ea4866cbfb4e64edd86b", + [ + "0x79", + "0x46dFE3D2d90209e4b99c4718acc6c2a19c2401Ee", + true, + "0x2c3b90c302aa3f286344677a27f59ff416", + "0xf1ec232c481b20aa3bd262def1fc4d623498ff451ba7f5db2ad4bdb64828b5" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5408742522785646425148029581182813623326896630270817566656441118176318" + }, + { + "type": "hexstring", + "value": "0xc4da06f301fba722c6e9abe4726d30ea4866cbfb4e64edd86b" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x79" + }, + { + "type": "address", + "value": "0x46dFE3D2d90209e4b99c4718acc6c2a19c2401Ee" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x2c3b90c302aa3f286344677a27f59ff416" + }, + { + "type": "hexstring", + "value": "0xf1ec232c481b20aa3bd262def1fc4d623498ff451ba7f5db2ad4bdb64828b5" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061036f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061023d565b60405180910390f35b6100566101d6565b61005e6101d6565b604080516002808252606082018352600092602083019080368337019050509050600060019050808260008151811061009957610099610323565b6020026020010190151590811515815250505060006001905080826001815181106100c6576100c6610323565b911515602092830291909101909101525081526100e16101f5565b7cc89f14bf54cb6ff35e8c46c30472d799dded20c6fa8db8697ba36d343e81527fc4da06f301fba722c6e9abe4726d30ea4866cbfb4e64edd86b0000000000000060208201526101586040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b607960f81b81527346dfe3d2d90209e4b99c4718acc6c2a19c2401ee602080830191909152600160408084019190915270161dc86181551f9431a233bd13facffa0b60791b60608401527ff1ec232c481b20aa3bd262def1fc4d623498ff451ba7f5db2ad4bdb64828b5006080840152830191909152820152919050565b6040518060400160405280606081526020016101f06101f5565b905290565b60408051606081018252600080825260208201529081016101f06040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60208082528251610100838301819052815161012085018190526000939283019184916101408701905b8084101561028957845115158252938501936001939093019290850190610267565b509684015180516001600160e81b03166040888101919091528186015166ffffffffffffff19166060808a01919091529181015180516001600160f81b0319166080808b0191909152968101516001600160a01b031660a08a015290810151151560c0890152908101516effffffffffffffffffffffffffffff191660e0880152939093015160ff19169290940191909152509192915050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212201a6f07ffb86a3718bb8716f17d8603217b2f1fa95d37143f5ca9c3b1d5b8903e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_36a5bb9e {\n bytes1 s_0;\n address s_1;\n bool s_2;\n bytes17 s_3;\n bytes31 s_4;\n }\n\n struct S_82e02bee {\n uint232 s_0;\n bytes25 s_1;\n S_36a5bb9e s_2;\n }\n\n struct S_4e2c7ac7 {\n bool[] s_0;\n S_82e02bee s_1;\n }\n\n function test () public pure returns (S_4e2c7ac7 memory) {\n S_4e2c7ac7 memory r;\n {\n bool[] memory r_0 = new bool[](2);\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_82e02bee memory r_1;\n {\n uint232 r_1_0 = 5408742522785646425148029581182813623326896630270817566656441118176318;\n r_1.s_0 = r_1_0;\n }\n {\n bytes25 r_1_1 = bytes25(0xc4da06f301fba722c6e9abe4726d30ea4866cbfb4e64edd86b);\n r_1.s_1 = r_1_1;\n }\n {\n S_36a5bb9e memory r_1_2;\n {\n bytes1 r_1_2_0 = bytes1(0x79);\n r_1_2.s_0 = r_1_2_0;\n }\n {\n address r_1_2_1 = 0x46dFE3D2d90209e4b99c4718acc6c2a19c2401Ee;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n bool r_1_2_2 = true;\n r_1_2.s_2 = r_1_2_2;\n }\n {\n bytes17 r_1_2_3 = bytes17(0x2c3b90c302aa3f286344677a27f59ff416);\n r_1_2.s_3 = r_1_2_3;\n }\n {\n bytes31 r_1_2_4 = bytes31(0xf1ec232c481b20aa3bd262def1fc4d623498ff451ba7f5db2ad4bdb64828b5);\n r_1_2.s_4 = r_1_2_4;\n }\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000c89f14bf54cb6ff35e8c46c30472d799dded20c6fa8db8697ba36d343ec4da06f301fba722c6e9abe4726d30ea4866cbfb4e64edd86b00000000000000790000000000000000000000000000000000000000000000000000000000000000000000000000000000000046dfe3d2d90209e4b99c4718acc6c2a19c2401ee00000000000000000000000000000000000000000000000000000000000000012c3b90c302aa3f286344677a27f59ff416000000000000000000000000000000f1ec232c481b20aa3bd262def1fc4d623498ff451ba7f5db2ad4bdb64828b500000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bytes27,(int144[1]),string,string,(string,string[4][3]))", + "type": "(bytes27,(int144[1]),string,string,(string,string[4][3]))", + "value": [ + "0xffc0f85e56f23c72c4afe36ea3f937f572519d278322ca8823f727", + [["-4949272209416967456395171097689467361093336"]], + "Moo é🚀M🚀o🚀🚀oéo🚀o🚀MéoM M🚀o éMooo éoooééo oMM M🚀éMo oo🚀", + "Moo é🚀oMo🚀o 🚀M🚀 MéoMo oéé oo🚀ééo🚀é🚀oMo🚀🚀M ooMo", + [ + "Moo é🚀 ééo oo🚀oM ooMéMoéMo Mo🚀🚀oMoo oMMé ", + [ + [ + "Moo é🚀", + "Moo é🚀 é oMo é🚀éo🚀oéMéé 🚀🚀oo oé 🚀oM M🚀M🚀é 🚀éé ", + "Moo é🚀🚀éooM o🚀o🚀é", + "Moo é🚀 M🚀ooéo🚀🚀éo 🚀🚀🚀Mo ooMoéMMooM🚀ooé 🚀é🚀o" + ], + [ + "Moo é🚀oé🚀Méo 🚀🚀o ooooMoo", + "Moo é🚀oMo🚀🚀o 🚀", + "Moo é🚀Moooo🚀 M Mo ooMMo 🚀o", + "Moo é🚀" + ], + [ + "Moo é🚀🚀MoooMoé éMM 🚀M o o🚀éooooé o oooé", + "Moo é🚀oooMMMéoo ooéo o oo", + "Moo é🚀🚀🚀é oo🚀M 🚀 éMéééo🚀o", + "Moo é🚀o o🚀oMooooé🚀 🚀oé oMoMMé oéo oo " + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xffc0f85e56f23c72c4afe36ea3f937f572519d278322ca8823f727" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-4949272209416967456395171097689467361093336" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M🚀o🚀🚀oéo🚀o🚀MéoM M🚀o éMooo éoooééo oMM M🚀éMo oo🚀" + }, + { + "type": "string", + "value": "Moo é🚀oMo🚀o 🚀M🚀 MéoMo oéé oo🚀ééo🚀é🚀oMo🚀🚀M ooMo" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 ééo oo🚀oM ooMéMoéMo Mo🚀🚀oMoo oMMé " + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀 é oMo é🚀éo🚀oéMéé 🚀🚀oo oé 🚀oM M🚀M🚀é 🚀éé " + }, + { + "type": "string", + "value": "Moo é🚀🚀éooM o🚀o🚀é" + }, + { + "type": "string", + "value": "Moo é🚀 M🚀ooéo🚀🚀éo 🚀🚀🚀Mo ooMoéMMooM🚀ooé 🚀é🚀o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé🚀Méo 🚀🚀o ooooMoo" + }, + { + "type": "string", + "value": "Moo é🚀oMo🚀🚀o 🚀" + }, + { + "type": "string", + "value": "Moo é🚀Moooo🚀 M Mo ooMMo 🚀o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀MoooMoé éMM 🚀M o o🚀éooooé o oooé" + }, + { + "type": "string", + "value": "Moo é🚀oooMMMéoo ooéo o oo" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀é oo🚀M 🚀 éMéééo🚀o" + }, + { + "type": "string", + "value": "Moo é🚀o o🚀oMooooé🚀 🚀oé oMoMMé oéo oo " + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610849806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104f3565b60405180910390f35b610056610340565b61005e610340565b7fffc0f85e56f23c72c4afe36ea3f937f572519d278322ca8823f7270000000000815261008961037b565b61009161038a565b7138d09a931a9ddb5e0b69ffddd1060106e6d719815281526020828101919091526040805160808101909152605b8082526000926107b99083013960408084019190915280516080810190915260508082526000925061066e60208301396060830152506100fd6103a8565b60006040518060600160405280603c81526020016106be603c91398252506101236103be565b61012b6103eb565b604080518082018252600a8152689adede418753e13f3560b71b60208083019190915290835281516080810190925260588083526000929161072b908301396020838101919091526040805180820182528281527f4d6f6f20c3a9f09f9a80f09f9a80c3a96f6f4d206ff09f9a806ff09f9a80c3a98184015281850152805160808101909152604f8082526000935090916105fa9083013960608301525081526101d36103eb565b600060405180606001604052806027815260200161059a6027913982525060408051808201909152601c81527f4d6f6f20c3a9f09f9a806f4d6ff09f9a80f09f9a806f2020f09f9a80000000006020820152808260016020020181905250506000604051806060016040528060258152602001610649602591396040808401919091528051808201909152600a8152689adede418753e13f3560b71b6020820152905080826003602002015250808260016020020152506102926103eb565b60006040518060600160405280603981526020016105c16039913982525060408051808201825260208082527f4d6f6f20c3a9f09f9a806f6f6f4d4d4dc3a96f6f20206f6fc3a96f206f206f6f81830152808401919091528151606081019092526031808352600092916106fa908301396040808401919091528051606081019091526036808252600092506107836020830139606083015250604082015260208201526080820152919050565b6040805160a08101909152600081526020810161035b61037b565b815260200160608152602001606081526020016103766103a8565b905290565b60405180602001604052806103765b60405180602001604052806001906020820280368337509192915050565b6040518060400160405280606081526020016103765b60405180606001604052806003905b6103d56103eb565b8152602001906001900390816103cd5790505090565b60405180608001604052806004905b60608152602001906001900390816103fa5790505090565b6000815180845260005b818110156104385760208185018101518683018201520161041c565b8181111561044a576000602083870101525b50601f01601f19169290920160200192915050565b60008151604084526104746040850182610412565b602084810151868303878301529192509082606081016000805b60038110156104e557868303845284518360808101845b60048110156104d05786820383526104be828551610412565b938a0193928a019291506001016104a5565b5096880196958801959450505060010161048e565b509098975050505050505050565b6020808252825164ffffffffff19168282015282810151516000919082604085015b600182101561053757825160110b815291830191600191909101908301610515565b50505050604083015160a0606084015261055460c0840182610412565b90506060840151601f19808584030160808601526105728383610412565b925060808601519150808584030160a086015250610590828261045f565b9594505050505056fe4d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a96f20f09f9a80f09f9a806f206f6f6f6f4d6f6f4d6f6f20c3a9f09f9a80f09f9a804d6f6f6f4d6fc3a920c3a94d4d20f09f9a804d206f206ff09f9a80c3a96f6f6f6fc3a9206f206f6f6fc3a94d6f6f20c3a9f09f9a80204df09f9a806f6fc3a96ff09f9a80f09f9a80c3a96f20f09f9a80f09f9a80f09f9a804d6f206f6f4d6fc3a94d4d6f6f4df09f9a806f6fc3a920f09f9a80c3a9f09f9a806f4d6f6f20c3a9f09f9a804d6f6f6f6ff09f9a8020204d204d6f206f6f4d4d6f20f09f9a806f4d6f6f20c3a9f09f9a806f4d6ff09f9a806f20f09f9a804df09f9a80204dc3a96f4d6f206fc3a9c3a9206f6ff09f9a80c3a9c3a96ff09f9a80c3a9f09f9a806f4d6ff09f9a80f09f9a804d206f6f4d6f4d6f6f20c3a9f09f9a8020c3a9c3a96f20206f6ff09f9a806f4d206f6f4dc3a94d6fc3a94d6f204d6ff09f9a80f09f9a806f4d6f6f206f4d4dc3a9204d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a9206f6ff09f9a804d20f09f9a8020c3a94dc3a9c3a9c3a96ff09f9a806f4d6f6f20c3a9f09f9a802020c3a9206f4d6f2020c3a9f09f9a80c3a96ff09f9a806fc3a94dc3a9c3a920f09f9a80f09f9a806f6f206fc3a92020f09f9a806f4d204df09f9a804df09f9a80c3a920f09f9a80c3a9c3a920204d6f6f20c3a9f09f9a806f206ff09f9a806f4d6f6f6f6fc3a9f09f9a8020f09f9a806fc3a9206f4d6f4d4dc3a9206fc3a96f206f6f204d6f6f20c3a9f09f9a804df09f9a806ff09f9a80f09f9a806fc3a96ff09f9a806ff09f9a804dc3a96f4d204df09f9a806f20c3a94d6f6f6f20c3a96f6f6fc3a9c3a96f206f4d4d2020204df09f9a80c3a94d6f20206f6ff09f9a80a26469706673582212200cc00ab0be3a34e5e8616c6866b36f8dd30dc89eb1d0778ff5b491131f61150964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f7cfb985 {\n int144[1] s_0;\n }\n\n struct S_90151b34 {\n string s_0;\n string[4][3] s_1;\n }\n\n struct S_7584be9d {\n bytes27 s_0;\n S_f7cfb985 s_1;\n string s_2;\n string s_3;\n S_90151b34 s_4;\n }\n\n function test () public pure returns (S_7584be9d memory) {\n S_7584be9d memory r;\n {\n bytes27 r_0 = bytes27(0xffc0f85e56f23c72c4afe36ea3f937f572519d278322ca8823f727);\n r.s_0 = r_0;\n }\n {\n S_f7cfb985 memory r_1;\n {\n int144[1] memory r_1_0;\n {\n int144 r_1_0_0 = -4949272209416967456395171097689467361093336;\n r_1_0[0] = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀M🚀o🚀🚀oéo🚀o🚀MéoM M🚀o éMooo éoooééo oMM M🚀éMo oo🚀\";\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀oMo🚀o 🚀M🚀 MéoMo oéé oo🚀ééo🚀é🚀oMo🚀🚀M ooMo\";\n r.s_3 = r_3;\n }\n {\n S_90151b34 memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀 ééo oo🚀oM ooMéMoéMo Mo🚀🚀oMoo oMMé \";\n r_4.s_0 = r_4_0;\n }\n {\n string[4][3] memory r_4_1;\n {\n string[4] memory r_4_1_0;\n {\n string memory r_4_1_0_0 = unicode\"Moo é🚀\";\n r_4_1_0[0] = r_4_1_0_0;\n }\n {\n string memory r_4_1_0_1 = unicode\"Moo é🚀 é oMo é🚀éo🚀oéMéé 🚀🚀oo oé 🚀oM M🚀M🚀é 🚀éé \";\n r_4_1_0[1] = r_4_1_0_1;\n }\n {\n string memory r_4_1_0_2 = unicode\"Moo é🚀🚀éooM o🚀o🚀é\";\n r_4_1_0[2] = r_4_1_0_2;\n }\n {\n string memory r_4_1_0_3 = unicode\"Moo é🚀 M🚀ooéo🚀🚀éo 🚀🚀🚀Mo ooMoéMMooM🚀ooé 🚀é🚀o\";\n r_4_1_0[3] = r_4_1_0_3;\n }\n r_4_1[0] = r_4_1_0;\n }\n {\n string[4] memory r_4_1_1;\n {\n string memory r_4_1_1_0 = unicode\"Moo é🚀oé🚀Méo 🚀🚀o ooooMoo\";\n r_4_1_1[0] = r_4_1_1_0;\n }\n {\n string memory r_4_1_1_1 = unicode\"Moo é🚀oMo🚀🚀o 🚀\";\n r_4_1_1[1] = r_4_1_1_1;\n }\n {\n string memory r_4_1_1_2 = unicode\"Moo é🚀Moooo🚀 M Mo ooMMo 🚀o\";\n r_4_1_1[2] = r_4_1_1_2;\n }\n {\n string memory r_4_1_1_3 = unicode\"Moo é🚀\";\n r_4_1_1[3] = r_4_1_1_3;\n }\n r_4_1[1] = r_4_1_1;\n }\n {\n string[4] memory r_4_1_2;\n {\n string memory r_4_1_2_0 = unicode\"Moo é🚀🚀MoooMoé éMM 🚀M o o🚀éooooé o oooé\";\n r_4_1_2[0] = r_4_1_2_0;\n }\n {\n string memory r_4_1_2_1 = unicode\"Moo é🚀oooMMMéoo ooéo o oo\";\n r_4_1_2[1] = r_4_1_2_1;\n }\n {\n string memory r_4_1_2_2 = unicode\"Moo é🚀🚀🚀é oo🚀M 🚀 éMéééo🚀o\";\n r_4_1_2[2] = r_4_1_2_2;\n }\n {\n string memory r_4_1_2_3 = unicode\"Moo é🚀o o🚀oMooooé🚀 🚀oé oMoMMé oéo oo \";\n r_4_1_2[3] = r_4_1_2_3;\n }\n r_4_1[2] = r_4_1_2;\n }\n r_4.s_1 = r_4_1;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffc0f85e56f23c72c4afe36ea3f937f572519d278322ca8823f7270000000000ffffffffffffffffffffffffffffc72f656ce56224a1f49600222ef9fef9192800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a804df09f9a806ff09f9a80f09f9a806fc3a96ff09f9a806ff09f9a804dc3a96f4d204df09f9a806f20c3a94d6f6f6f20c3a96f6f6fc3a9c3a96f206f4d4d2020204df09f9a80c3a94d6f20206f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a806f4d6ff09f9a806f20f09f9a804df09f9a80204dc3a96f4d6f206fc3a9c3a9206f6ff09f9a80c3a9c3a96ff09f9a80c3a9f09f9a806f4d6ff09f9a80f09f9a804d206f6f4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a8020c3a9c3a96f20206f6ff09f9a806f4d206f6f4dc3a94d6fc3a94d6f204d6ff09f9a80f09f9a806f4d6f6f206f4d4dc3a92000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a802020c3a9206f4d6f2020c3a9f09f9a80c3a96ff09f9a806fc3a94dc3a9c3a920f09f9a80f09f9a806f6f206fc3a92020f09f9a806f4d204df09f9a804df09f9a80c3a920f09f9a80c3a9c3a92020000000000000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a80f09f9a80c3a96f6f4d206ff09f9a806ff09f9a80c3a9000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a80204df09f9a806f6fc3a96ff09f9a80f09f9a80c3a96f20f09f9a80f09f9a80f09f9a804d6f206f6f4d6fc3a94d4d6f6f4df09f9a806f6fc3a920f09f9a80c3a9f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a96f20f09f9a80f09f9a806f206f6f6f6f4d6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a806f4d6ff09f9a80f09f9a806f2020f09f9a800000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a804d6f6f6f6ff09f9a8020204d204d6f206f6f4d4d6f20f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80f09f9a804d6f6f6f4d6fc3a920c3a94d4d20f09f9a804d206f206ff09f9a80c3a96f6f6f6fc3a9206f206f6f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a806f6f6f4d4d4dc3a96f6f20206f6fc3a96f206f206f6f00000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a9206f6ff09f9a804d20f09f9a8020c3a94dc3a9c3a9c3a96ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806f206ff09f9a806f4d6f6f6f6fc3a9f09f9a8020f09f9a806fc3a9206f4d6f4d4dc3a9206fc3a96f206f6f2000000000000000000000" + }, + { + "name": "random-(int168[2],bytes25,(bytes14,bytes9[1][4],int32),address)", + "type": "(int168[2],bytes25,(bytes14,bytes9[1][4],int32),address)", + "value": [ + [ + "122789717904430100999888653513187995910898682291032", + "108211756095258806527231799689414910649894850737403" + ], + "0xace62f296950dad94885a5579cd99a2da66c33676cb8ed218d", + [ + "0x52b5e456dea0b94849c1a1981e91", + [ + ["0x103accbe336a16299e"], + ["0x239a3e769335990049"], + ["0x968aaefefe90b83dd1"], + ["0xaec0dfbcfe3c00af6a"] + ], + "-828411452" + ], + "0x4e31EC2DCe4BA9cDb81b1215BAb51F19Df5Cd618" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "122789717904430100999888653513187995910898682291032" + }, + { + "type": "number", + "value": "108211756095258806527231799689414910649894850737403" + } + ] + }, + { + "type": "hexstring", + "value": "0xace62f296950dad94885a5579cd99a2da66c33676cb8ed218d" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x52b5e456dea0b94849c1a1981e91" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x103accbe336a16299e" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x239a3e769335990049" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x968aaefefe90b83dd1" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xaec0dfbcfe3c00af6a" + } + ] + } + ] + }, + { + "type": "number", + "value": "-828411452" + } + ] + }, + { + "type": "address", + "value": "0x4e31EC2DCe4BA9cDb81b1215BAb51F19Df5Cd618" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061036f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610249565b60405180910390f35b610056610195565b61005e610195565b6100666101c9565b74540421615b4cb84b0118a4e00c4881bdbe2191e3588152744a0a9ef6e457045c3adc2fc7c0d223be4aa0ab34fb6020808301919091529082527face62f296950dad94885a5579cd99a2da66c33676cb8ed218d00000000000000908201526100cd6101e7565b6d52b5e456dea0b94849c1a1981e9160901b81526100e96101fe565b6100f161022b565b68081d665f19b50b14cf60b91b8152815261010a61022b565b68239a3e76933599004960b81b8152602082015261012661022b565b68968aaefefe90b83dd160b81b8152604082015261014261022b565b6857606fde7f1e0057b560b91b815260608083019190915260208301919091526331608e3b19604080840191909152830191909152734e31ec2dce4ba9cdb81b1215bab51f19df5cd61890820152919050565b60405180608001604052806101a86101c9565b8152600060208201526040016101bc6101e7565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b604080516060810190915260008152602081016101bc5b60405180608001604052806004905b61021561022b565b81526020019060019003908161020d5790505090565b60405180602001604052806001906020820280368337509192915050565b81516101408201908260005b600281101561027757825160140b825260209283019290910190600101610255565b505050602066ffffffffffffff1981850151166040840152604084015171ffffffffffffffffffffffffffffffffffff198151166060850152818101516080850160005b60048110156103045782518260005b60018110156102f15782516001600160b81b031916825291870191908701906001016102ca565b50505091840191908401906001016102bb565b50505060400151905061031d61010084018260030b9052565b50606092909201516001600160a01b031661012091909101529056fea2646970667358221220973048377a8e9faf7663895401306612b7bcf544c5550f95c9a9f4f8759b835a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fbdd8160 {\n bytes14 s_0;\n bytes9[1][4] s_1;\n int32 s_2;\n }\n\n struct S_e55ee111 {\n int168[2] s_0;\n bytes25 s_1;\n S_fbdd8160 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_e55ee111 memory) {\n S_e55ee111 memory r;\n {\n int168[2] memory r_0;\n {\n int168 r_0_0 = 122789717904430100999888653513187995910898682291032;\n r_0[0] = r_0_0;\n }\n {\n int168 r_0_1 = 108211756095258806527231799689414910649894850737403;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n bytes25 r_1 = bytes25(0xace62f296950dad94885a5579cd99a2da66c33676cb8ed218d);\n r.s_1 = r_1;\n }\n {\n S_fbdd8160 memory r_2;\n {\n bytes14 r_2_0 = bytes14(0x52b5e456dea0b94849c1a1981e91);\n r_2.s_0 = r_2_0;\n }\n {\n bytes9[1][4] memory r_2_1;\n {\n bytes9[1] memory r_2_1_0;\n {\n bytes9 r_2_1_0_0 = bytes9(0x103accbe336a16299e);\n r_2_1_0[0] = r_2_1_0_0;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n bytes9[1] memory r_2_1_1;\n {\n bytes9 r_2_1_1_0 = bytes9(0x239a3e769335990049);\n r_2_1_1[0] = r_2_1_1_0;\n }\n r_2_1[1] = r_2_1_1;\n }\n {\n bytes9[1] memory r_2_1_2;\n {\n bytes9 r_2_1_2_0 = bytes9(0x968aaefefe90b83dd1);\n r_2_1_2[0] = r_2_1_2_0;\n }\n r_2_1[2] = r_2_1_2;\n }\n {\n bytes9[1] memory r_2_1_3;\n {\n bytes9 r_2_1_3_0 = bytes9(0xaec0dfbcfe3c00af6a);\n r_2_1_3[0] = r_2_1_3_0;\n }\n r_2_1[3] = r_2_1_3;\n }\n r_2.s_1 = r_2_1;\n }\n {\n int32 r_2_2 = -828411452;\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x4e31EC2DCe4BA9cDb81b1215BAb51F19Df5Cd618;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000540421615b4cb84b0118a4e00c4881bdbe2191e35800000000000000000000004a0a9ef6e457045c3adc2fc7c0d223be4aa0ab34fbace62f296950dad94885a5579cd99a2da66c33676cb8ed218d0000000000000052b5e456dea0b94849c1a1981e91000000000000000000000000000000000000103accbe336a16299e0000000000000000000000000000000000000000000000239a3e7693359900490000000000000000000000000000000000000000000000968aaefefe90b83dd10000000000000000000000000000000000000000000000aec0dfbcfe3c00af6a0000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffce9f71c40000000000000000000000004e31ec2dce4ba9cdb81b1215bab51f19df5cd618" + }, + { + "name": "random-(int32,bytes28,(string,(bytes15,address),bytes6,address),string)[3]", + "type": "(int32,bytes28,(string,(bytes15,address),bytes6,address),string)[3]", + "value": [ + [ + "-2010042003", + "0xc87fc24ad5a7f97424d40650b9780ddb600e49ff7f78585edd113cf3", + [ + "Moo é🚀é ooéMo", + [ + "0xc7227df689098afdc9e67887d5a52a", + "0x82310000c35B66Ea991db17802bE3691ca091B79" + ], + "0x11f9604788e5", + "0x4DB2f5675125acA5F77FBB060760a3ea86D037Cb" + ], + "Moo é🚀 Moéé🚀 🚀M🚀M🚀oooM🚀éoooooé🚀o🚀éoMéé🚀M o" + ], + [ + "-1478746324", + "0xaa860beee206d250bb5f5cb99682f780d8d8a9676d1bc4acc31b7839", + [ + "Moo é🚀oé🚀ooéMo🚀o Mo🚀Mooo🚀 Mo o🚀 éoooooMMé oéMé🚀MéMéo", + [ + "0x71a59a84c1aef905a6bb4c2047538a", + "0x9d0a33c5A3c3D8B29F61cDdF13D6dD2A1C3EC721" + ], + "0x39c0620b1d63", + "0xBF457B37d1d458E0bB431797A439c26E2A2173F1" + ], + "Moo é🚀" + ], + [ + "801126499", + "0x1b4d9d1d75298d9fbac6e3649679a10c795208b2c7f1172710965bb9", + [ + "Moo é🚀oo🚀🚀M🚀🚀Mo Moo ooo🚀éo🚀é é🚀éMéooM ", + [ + "0x63cd10a65630a1c903d378ed55b355", + "0x58ED2526c933295508D1482518B4dd23053B056f" + ], + "0x4ffdbc59d4d7", + "0xC1a5A315B347B7dF840Ad7A1e8e416D43a285278" + ], + "Moo é🚀ooo oéoéé🚀ééoM 🚀 ooMM🚀🚀oMé🚀🚀o🚀M 🚀éoooéoooM oéoéé o🚀 é" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-2010042003" + }, + { + "type": "hexstring", + "value": "0xc87fc24ad5a7f97424d40650b9780ddb600e49ff7f78585edd113cf3" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é ooéMo" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc7227df689098afdc9e67887d5a52a" + }, + { + "type": "address", + "value": "0x82310000c35B66Ea991db17802bE3691ca091B79" + } + ] + }, + { + "type": "hexstring", + "value": "0x11f9604788e5" + }, + { + "type": "address", + "value": "0x4DB2f5675125acA5F77FBB060760a3ea86D037Cb" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 Moéé🚀 🚀M🚀M🚀oooM🚀éoooooé🚀o🚀éoMéé🚀M o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1478746324" + }, + { + "type": "hexstring", + "value": "0xaa860beee206d250bb5f5cb99682f780d8d8a9676d1bc4acc31b7839" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé🚀ooéMo🚀o Mo🚀Mooo🚀 Mo o🚀 éoooooMMé oéMé🚀MéMéo" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x71a59a84c1aef905a6bb4c2047538a" + }, + { + "type": "address", + "value": "0x9d0a33c5A3c3D8B29F61cDdF13D6dD2A1C3EC721" + } + ] + }, + { + "type": "hexstring", + "value": "0x39c0620b1d63" + }, + { + "type": "address", + "value": "0xBF457B37d1d458E0bB431797A439c26E2A2173F1" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "801126499" + }, + { + "type": "hexstring", + "value": "0x1b4d9d1d75298d9fbac6e3649679a10c795208b2c7f1172710965bb9" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀🚀M🚀🚀Mo Moo ooo🚀éo🚀é é🚀éMéooM " + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x63cd10a65630a1c903d378ed55b355" + }, + { + "type": "address", + "value": "0x58ED2526c933295508D1482518B4dd23053B056f" + } + ] + }, + { + "type": "hexstring", + "value": "0x4ffdbc59d4d7" + }, + { + "type": "address", + "value": "0xC1a5A315B347B7dF840Ad7A1e8e416D43a285278" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooo oéoéé🚀ééoM 🚀 ooMM🚀🚀oMé🚀🚀o🚀M 🚀éoooéoooM oéoéé o🚀 é" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506106bc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610442565b60405180910390f35b61005661035c565b61005e61035c565b610066610389565b6377cece921981527fc87fc24ad5a7f97424d40650b9780ddb600e49ff7f78585edd113cf300000000602082015261009c6103b5565b6040805180820190915260138152724d6f6f20c3a9f09f9a80c3a9206f6fc3a94d6f60681b602082015281526100e2604080518082019091526000808252602082015290565b6e63913efb4484c57ee4f33c43ead29560891b81527382310000c35b66ea991db17802be3691ca091b79602080830191909152828101919091526511f9604788e560d01b604080840191909152734db2f5675125aca5f77fbb060760a3ea86d037cb60608401528381019290925281516080810190925260508083526000929161057f908301396060830152508152610179610389565b635823e0d31981527faa860beee206d250bb5f5cb99682f780d8d8a9676d1bc4acc31b78390000000060208201526101af6103b5565b6000604051806080016040528060528152602001610635605291398252506040805180820182526e38d2cd4260d77c82d35da61023a9c560891b8152739d0a33c5a3c3d8b29f61cddf13d6dd2a1c3ec721602080830191909152808401919091526539c0620b1d6360d01b8284015273bf457b37d1d458e0bb431797a439c26e2a2173f1606080850191909152848301939093528151808301909252600a8252689adede418753e13f3560b71b828201529183015282015261026f610389565b632fc0386381527f1b4d9d1d75298d9fbac6e3649679a10c795208b2c7f1172710965bb90000000060208201526102a46103b5565b600060405180608001604052806044815260200161053b604491398252506040805180820182526e63cd10a65630a1c903d378ed55b35560881b81527358ed2526c933295508d1482518b4dd23053b056f60208083019190915280840191909152654ffdbc59d4d760d01b8284015273c1a5a315b347b7df840ad7a1e8e416d43a285278606084015283820192909252805160a0810190915260668082526000926105cf908301396060830152506040820152919050565b60405180606001604052806003905b610373610389565b81526020019060019003908161036b5790505090565b60408051608081018252600080825260208201529081016103a86103b5565b8152602001606081525090565b6040518060800160405280606081526020016103e1604080518082019091526000808252602082015290565b815260006020820181905260409091015290565b6000815180845260005b8181101561041b576020818501810151868301820152016103ff565b8181111561042d576000602083870101525b50601f01601f19169290920160200192915050565b6020808252600090608083820181850186855b6003808210610464575061052d565b601f1989850301855282518051820b855263ffffffff1988820151168886015260409150818101518783870152805160a0808a8901526104a86101208901836103f5565b838c0151805170ffffffffffffffffffffffffffffffffff1916928a0192909252908b01516001600160a01b0390811660c08a0152948301516001600160d01b03191660e0890152606080840151909516610100890152928401518784038589015292905061051781846103f5565b978a019796505050928701925050600101610455565b509097965050505050505056fe4d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a804df09f9a80f09f9a804d6f204d6f6f206f6f6ff09f9a80c3a96ff09f9a80c3a920c3a9f09f9a80c3a94dc3a96f6f4d204d6f6f20c3a9f09f9a8020204d6fc3a9c3a9f09f9a80202020f09f9a804df09f9a804df09f9a806f6f6f4df09f9a80c3a96f6f6f6f6fc3a9f09f9a806ff09f9a80c3a96f4dc3a9c3a9f09f9a804d206f4d6f6f20c3a9f09f9a806f6f6f206fc3a96fc3a9c3a9f09f9a80c3a9c3a96f4d20f09f9a80206f6f4d4df09f9a80f09f9a806f4dc3a9f09f9a80f09f9a806ff09f9a804d20f09f9a80c3a96f6f6fc3a96f6f6f4d206fc3a96fc3a9c3a9206ff09f9a8020c3a94d6f6f20c3a9f09f9a806fc3a9f09f9a806f6fc3a94d6ff09f9a806f204d6ff09f9a804d6f6f6ff09f9a80204d6f206ff09f9a8020c3a96f6f6f6f6f4d4dc3a9206fc3a94dc3a9f09f9a804dc3a94dc3a96fa2646970667358221220c9e3778f32742b5f96a46b87f839733715e990643c9dc3a3bb4a3b815970146b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_12087693 {\n bytes15 s_0;\n address s_1;\n }\n\n struct S_0dd26f89 {\n string s_0;\n S_12087693 s_1;\n bytes6 s_2;\n address s_3;\n }\n\n struct S_0efb18b9 {\n int32 s_0;\n bytes28 s_1;\n S_0dd26f89 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_0efb18b9[3] memory) {\n S_0efb18b9[3] memory r;\n {\n S_0efb18b9 memory r_0;\n {\n int32 r_0_0 = -2010042003;\n r_0.s_0 = r_0_0;\n }\n {\n bytes28 r_0_1 = bytes28(0xc87fc24ad5a7f97424d40650b9780ddb600e49ff7f78585edd113cf3);\n r_0.s_1 = r_0_1;\n }\n {\n S_0dd26f89 memory r_0_2;\n {\n string memory r_0_2_0 = unicode\"Moo é🚀é ooéMo\";\n r_0_2.s_0 = r_0_2_0;\n }\n {\n S_12087693 memory r_0_2_1;\n {\n bytes15 r_0_2_1_0 = bytes15(0xc7227df689098afdc9e67887d5a52a);\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n {\n address r_0_2_1_1 = 0x82310000c35B66Ea991db17802bE3691ca091B79;\n r_0_2_1.s_1 = r_0_2_1_1;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n {\n bytes6 r_0_2_2 = bytes6(0x11f9604788e5);\n r_0_2.s_2 = r_0_2_2;\n }\n {\n address r_0_2_3 = 0x4DB2f5675125acA5F77FBB060760a3ea86D037Cb;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀 Moéé🚀 🚀M🚀M🚀oooM🚀éoooooé🚀o🚀éoMéé🚀M o\";\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_0efb18b9 memory r_1;\n {\n int32 r_1_0 = -1478746324;\n r_1.s_0 = r_1_0;\n }\n {\n bytes28 r_1_1 = bytes28(0xaa860beee206d250bb5f5cb99682f780d8d8a9676d1bc4acc31b7839);\n r_1.s_1 = r_1_1;\n }\n {\n S_0dd26f89 memory r_1_2;\n {\n string memory r_1_2_0 = unicode\"Moo é🚀oé🚀ooéMo🚀o Mo🚀Mooo🚀 Mo o🚀 éoooooMMé oéMé🚀MéMéo\";\n r_1_2.s_0 = r_1_2_0;\n }\n {\n S_12087693 memory r_1_2_1;\n {\n bytes15 r_1_2_1_0 = bytes15(0x71a59a84c1aef905a6bb4c2047538a);\n r_1_2_1.s_0 = r_1_2_1_0;\n }\n {\n address r_1_2_1_1 = 0x9d0a33c5A3c3D8B29F61cDdF13D6dD2A1C3EC721;\n r_1_2_1.s_1 = r_1_2_1_1;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n {\n bytes6 r_1_2_2 = bytes6(0x39c0620b1d63);\n r_1_2.s_2 = r_1_2_2;\n }\n {\n address r_1_2_3 = 0xBF457B37d1d458E0bB431797A439c26E2A2173F1;\n r_1_2.s_3 = r_1_2_3;\n }\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀\";\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_0efb18b9 memory r_2;\n {\n int32 r_2_0 = 801126499;\n r_2.s_0 = r_2_0;\n }\n {\n bytes28 r_2_1 = bytes28(0x1b4d9d1d75298d9fbac6e3649679a10c795208b2c7f1172710965bb9);\n r_2.s_1 = r_2_1;\n }\n {\n S_0dd26f89 memory r_2_2;\n {\n string memory r_2_2_0 = unicode\"Moo é🚀oo🚀🚀M🚀🚀Mo Moo ooo🚀éo🚀é é🚀éMéooM \";\n r_2_2.s_0 = r_2_2_0;\n }\n {\n S_12087693 memory r_2_2_1;\n {\n bytes15 r_2_2_1_0 = bytes15(0x63cd10a65630a1c903d378ed55b355);\n r_2_2_1.s_0 = r_2_2_1_0;\n }\n {\n address r_2_2_1_1 = 0x58ED2526c933295508D1482518B4dd23053B056f;\n r_2_2_1.s_1 = r_2_2_1_1;\n }\n r_2_2.s_1 = r_2_2_1;\n }\n {\n bytes6 r_2_2_2 = bytes6(0x4ffdbc59d4d7);\n r_2_2.s_2 = r_2_2_2;\n }\n {\n address r_2_2_3 = 0xC1a5A315B347B7dF840Ad7A1e8e416D43a285278;\n r_2_2.s_3 = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀ooo oéoéé🚀ééoM 🚀 ooMM🚀🚀oMé🚀🚀o🚀M 🚀éoooéoooM oéoéé o🚀 é\";\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000420ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8831316dc87fc24ad5a7f97424d40650b9780ddb600e49ff7f78585edd113cf3000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000a0c7227df689098afdc9e67887d5a52a000000000000000000000000000000000000000000000000000000000082310000c35b66ea991db17802be3691ca091b7911f9604788e500000000000000000000000000000000000000000000000000000000000000000000000000004db2f5675125aca5f77fbb060760a3ea86d037cb00000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80c3a9206f6fc3a94d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a8020204d6fc3a9c3a9f09f9a80202020f09f9a804df09f9a804df09f9a806f6f6f4df09f9a80c3a96f6f6f6f6fc3a9f09f9a806ff09f9a80c3a96f4dc3a9c3a9f09f9a804d206f00000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa7dc1f2caa860beee206d250bb5f5cb99682f780d8d8a9676d1bc4acc31b783900000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000a071a59a84c1aef905a6bb4c2047538a00000000000000000000000000000000000000000000000000000000009d0a33c5a3c3d8b29f61cddf13d6dd2a1c3ec72139c0620b1d630000000000000000000000000000000000000000000000000000000000000000000000000000bf457b37d1d458e0bb431797a439c26e2a2173f100000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a806fc3a9f09f9a806f6fc3a94d6ff09f9a806f204d6ff09f9a804d6f6f6ff09f9a80204d6f206ff09f9a8020c3a96f6f6f6f6f4d4dc3a9206fc3a94dc3a9f09f9a804dc3a94dc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fc038631b4d9d1d75298d9fbac6e3649679a10c795208b2c7f1172710965bb900000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000a063cd10a65630a1c903d378ed55b355000000000000000000000000000000000000000000000000000000000058ed2526c933295508d1482518b4dd23053b056f4ffdbc59d4d70000000000000000000000000000000000000000000000000000000000000000000000000000c1a5a315b347b7df840ad7a1e8e416d43a28527800000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a804df09f9a80f09f9a804d6f204d6f6f206f6f6ff09f9a80c3a96ff09f9a80c3a920c3a9f09f9a80c3a94dc3a96f6f4d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a806f6f6f206fc3a96fc3a9c3a9f09f9a80c3a9c3a96f4d20f09f9a80206f6f4d4df09f9a80f09f9a806f4dc3a9f09f9a80f09f9a806ff09f9a804d20f09f9a80c3a96f6f6fc3a96f6f6f4d206fc3a96fc3a9c3a9206ff09f9a8020c3a90000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,address,bool,string,(uint104,bytes22,bool,int168)[2])", + "type": "(string,address,bool,string,(uint104,bytes22,bool,int168)[2])", + "value": [ + "Moo é🚀ooMoé Moo 🚀M ", + "0x71F8A49a217BF58D623750e9c129A63cfDb755E2", + false, + "Moo é🚀MM ooMMMooéé🚀éo🚀éoo 🚀é o ooéoMoMMéo", + [ + [ + "8436208439823765038737094695416", + "0x06bd9a60819c5ef4b2f9588a444f926e11829abd5c96", + false, + "-50165394041472913698663122351856971591263904890556" + ], + [ + "4353803811991138534791371279189", + "0xb7c860617d0b9b0a8406081fd1a715f2d2d2ac3a5182", + true, + "46794375638780681212702982372449992806074039544368" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooMoé Moo 🚀M " + }, + { + "type": "address", + "value": "0x71F8A49a217BF58D623750e9c129A63cfDb755E2" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀MM ooMMMooéé🚀éo🚀éoo 🚀é o ooéoMoMMéo" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "8436208439823765038737094695416" + }, + { + "type": "hexstring", + "value": "0x06bd9a60819c5ef4b2f9588a444f926e11829abd5c96" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-50165394041472913698663122351856971591263904890556" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4353803811991138534791371279189" + }, + { + "type": "hexstring", + "value": "0xb7c860617d0b9b0a8406081fd1a715f2d2d2ac3a5182" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "46794375638780681212702982372449992806074039544368" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103c9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610282565b60405180910390f35b6100566101b0565b61005e6101b0565b604080518082018252601b81527f4d6f6f20c3a9f09f9a806f6f4d6fc3a9204d6f6f20f09f9a804d2000000000006020808301919091529083527371f8a49a217bf58d623750e9c129a63cfdb755e2838201526000838301819052825160608101909352603d808452909291610357908301396060830152506100df6101ef565b60408051608080820183526000828401526c6a7adc109bdfaaa8ad6acd59f8825275035ecd3040ce2f7a597cac452227c93708c14d5eae4b60511b602080840191909152742253161178504a26b9c69a88d2ee5842775dac7ebb19606080850191909152928552835180830185526c36f3e61aa8d2ba48fad0b3cb558152755be43030be85cd854203040fe8d38af96969561d28c160511b818301526001948101949094527420049c60061b5e28102ca521c33e6382601ade2a309284019290925290830191909152820152919050565b6040518060a001604052806060815260200160006001600160a01b03168152602001600015158152602001606081526020016101ea6101ef565b905290565b60405180604001604052806002905b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816101fe5790505090565b6000815180845260005b8181101561025b5760208185018101518683018201520161023f565b8181111561026d576000602083870101525b50601f01601f19169290920160200192915050565b600060208083528351610180828501526102a06101a0850182610235565b905081850151604060018060a01b038216818701528087015191506060821515818801528088015192506080601f1988860301818901526102e18585610235565b945080890151935060a0880160005b600281101561034757855180516cffffffffffffffffffffffffff1683528881015169ffffffffffffffffffff1916898401528581015115158684015284015160140b8483015294870194908201906001016102f0565b5094999850505050505050505056fe4d6f6f20c3a9f09f9a804d4d206f6f4d4d4d6f6fc3a9c3a9f09f9a80c3a96ff09f9a80c3a96f6f20f09f9a80c3a9206f206f6fc3a96f4d6f4d4dc3a96fa2646970667358221220c98429d8bb7a9daf230e7e2f3a6bc542e97071b5124497db956ffd2ed84a8cb764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_de46c5a9 {\n uint104 s_0;\n bytes22 s_1;\n bool s_2;\n int168 s_3;\n }\n\n struct S_20526d53 {\n string s_0;\n address s_1;\n bool s_2;\n string s_3;\n S_de46c5a9[2] s_4;\n }\n\n function test () public pure returns (S_20526d53 memory) {\n S_20526d53 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀ooMoé Moo 🚀M \";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x71F8A49a217BF58D623750e9c129A63cfDb755E2;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀MM ooMMMooéé🚀éo🚀éoo 🚀é o ooéoMoMMéo\";\n r.s_3 = r_3;\n }\n {\n S_de46c5a9[2] memory r_4;\n {\n S_de46c5a9 memory r_4_0;\n {\n uint104 r_4_0_0 = 8436208439823765038737094695416;\n r_4_0.s_0 = r_4_0_0;\n }\n {\n bytes22 r_4_0_1 = bytes22(0x06bd9a60819c5ef4b2f9588a444f926e11829abd5c96);\n r_4_0.s_1 = r_4_0_1;\n }\n {\n bool r_4_0_2 = false;\n r_4_0.s_2 = r_4_0_2;\n }\n {\n int168 r_4_0_3 = -50165394041472913698663122351856971591263904890556;\n r_4_0.s_3 = r_4_0_3;\n }\n r_4[0] = r_4_0;\n }\n {\n S_de46c5a9 memory r_4_1;\n {\n uint104 r_4_1_0 = 4353803811991138534791371279189;\n r_4_1.s_0 = r_4_1_0;\n }\n {\n bytes22 r_4_1_1 = bytes22(0xb7c860617d0b9b0a8406081fd1a715f2d2d2ac3a5182);\n r_4_1.s_1 = r_4_1_1;\n }\n {\n bool r_4_1_2 = true;\n r_4_1.s_2 = r_4_1_2;\n }\n {\n int168 r_4_1_3 = 46794375638780681212702982372449992806074039544368;\n r_4_1.s_3 = r_4_1_3;\n }\n r_4[1] = r_4_1;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000018000000000000000000000000071f8a49a217bf58d623750e9c129a63cfdb755e2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000006a7adc109bdfaaa8ad6acd59f806bd9a60819c5ef4b2f9588a444f926e11829abd5c96000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffddace9ee87afb5d9463965772d11a7bd88a25381440000000000000000000000000000000000000036f3e61aa8d2ba48fad0b3cb55b7c860617d0b9b0a8406081fd1a715f2d2d2ac3a5182000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000020049c60061b5e28102ca521c33e6382601ade2a30000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a806f6f4d6fc3a9204d6f6f20f09f9a804d200000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a804d4d206f6f4d4d4d6f6fc3a9c3a9f09f9a80c3a96ff09f9a80c3a96f6f20f09f9a80c3a9206f206f6fc3a96f4d6f4d4dc3a96f000000" + }, + { + "name": "random-(string,uint72,address[4],(bool,(address,address,bool),address))", + "type": "(string,uint72,address[4],(bool,(address,address,bool),address))", + "value": [ + "Moo é🚀", + "2344458320461069735765", + [ + "0x6679FEfe2bd14bA70A35eD5Dd1CF706F8654f144", + "0x0eC09a3A94Ac61999e75A1035DC9bE7A697051AB", + "0xf28778D7bDdCDf5969a961DfC8bCdB280708fBb2", + "0xF032703D6ca4e2064FA9E59B2425DEA8b5C5DC29" + ], + [ + true, + [ + "0x5bAc54E4696E1e1CE7a6A4954734B4362e3Dd18E", + "0x17A417A8CDE045c578f5517139Dca1C666f0A1d9", + false + ], + "0xd49699B13f2C697975De9D799dd8B53c536d5540" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "2344458320461069735765" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6679FEfe2bd14bA70A35eD5Dd1CF706F8654f144" + }, + { + "type": "address", + "value": "0x0eC09a3A94Ac61999e75A1035DC9bE7A697051AB" + }, + { + "type": "address", + "value": "0xf28778D7bDdCDf5969a961DfC8bCdB280708fBb2" + }, + { + "type": "address", + "value": "0xF032703D6ca4e2064FA9E59B2425DEA8b5C5DC29" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5bAc54E4696E1e1CE7a6A4954734B4362e3Dd18E" + }, + { + "type": "address", + "value": "0x17A417A8CDE045c578f5517139Dca1C666f0A1d9" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xd49699B13f2C697975De9D799dd8B53c536d5540" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061037c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061026b565b60405180910390f35b6100566101b6565b61005e6101b6565b60408051808201909152600a8152689adede418753e13f3560b71b602080830191909152908252687f17e524fc9efad7559082015261009b61021b565b736679fefe2bd14ba70a35ed5dd1cf706f8654f1448152730ec09a3a94ac61999e75a1035dc9be7a697051ab602082015273f28778d7bddcdf5969a961dfc8bcdb280708fbb260408083019190915273f032703d6ca4e2064fa9e59b2425dea8b5c5dc296060830152820152610142604080516060808201835260008083528351918201845280825260208281018290529382015290918201908152600060209091015290565b600181526040805160608082018352600082840152735bac54e4696e1e1ce7a6a4954734b4362e3dd18e82527317a417a8cde045c578f5517139dca1c666f0a1d960208084019190915284019190915273d49699b13f2c697975de9d799dd8b53c536d554091830191909152820152919050565b6040805160808101825260608152600060208201529081016101d661021b565b8152602001610216604080516060808201835260008083528351918201845280825260208281018290529382015290918201908152600060209091015290565b905290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156102655781516001600160a01b031684526020938401939091019060010161023d565b50505050565b6000602080835283516101608285015280518061018086015260005b818110156102a4578281018401518682016101a001528301610287565b818111156102b75760006101a083880101525b509185015168ffffffffffffffffff8116604086015291604086015192506102e26060860184610239565b60608601518051151560e087015260208082015180516001600160a01b039081166101008a01529181015182166101208901526040908101511515610140890152820151166101608701529250601f01601f1916939093016101a00194935050505056fea2646970667358221220d1e3ce6c42ed959d3e6d2d5770d04d79d9a6533a665895e24240532a4d088f3c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e4bf9460 {\n address s_0;\n address s_1;\n bool s_2;\n }\n\n struct S_e2377e7b {\n bool s_0;\n S_e4bf9460 s_1;\n address s_2;\n }\n\n struct S_ccc24524 {\n string s_0;\n uint72 s_1;\n address[4] s_2;\n S_e2377e7b s_3;\n }\n\n function test () public pure returns (S_ccc24524 memory) {\n S_ccc24524 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀\";\n r.s_0 = r_0;\n }\n {\n uint72 r_1 = 2344458320461069735765;\n r.s_1 = r_1;\n }\n {\n address[4] memory r_2;\n {\n address r_2_0 = 0x6679FEfe2bd14bA70A35eD5Dd1CF706F8654f144;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x0eC09a3A94Ac61999e75A1035DC9bE7A697051AB;\n r_2[1] = r_2_1;\n }\n {\n address r_2_2 = 0xf28778D7bDdCDf5969a961DfC8bCdB280708fBb2;\n r_2[2] = r_2_2;\n }\n {\n address r_2_3 = 0xF032703D6ca4e2064FA9E59B2425DEA8b5C5DC29;\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n S_e2377e7b memory r_3;\n {\n bool r_3_0 = true;\n r_3.s_0 = r_3_0;\n }\n {\n S_e4bf9460 memory r_3_1;\n {\n address r_3_1_0 = 0x5bAc54E4696E1e1CE7a6A4954734B4362e3Dd18E;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n address r_3_1_1 = 0x17A417A8CDE045c578f5517139Dca1C666f0A1d9;\n r_3_1.s_1 = r_3_1_1;\n }\n {\n bool r_3_1_2 = false;\n r_3_1.s_2 = r_3_1_2;\n }\n r_3.s_1 = r_3_1;\n }\n {\n address r_3_2 = 0xd49699B13f2C697975De9D799dd8B53c536d5540;\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000007f17e524fc9efad7550000000000000000000000006679fefe2bd14ba70a35ed5dd1cf706f8654f1440000000000000000000000000ec09a3a94ac61999e75a1035dc9be7a697051ab000000000000000000000000f28778d7bddcdf5969a961dfc8bcdb280708fbb2000000000000000000000000f032703d6ca4e2064fa9e59b2425dea8b5c5dc2900000000000000000000000000000000000000000000000000000000000000010000000000000000000000005bac54e4696e1e1ce7a6a4954734b4362e3dd18e00000000000000000000000017a417a8cde045c578f5517139dca1c666f0a1d90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d49699b13f2c697975de9d799dd8b53c536d5540000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string[],string,address,address,(address[2]))[3][4]", + "type": "(string[],string,address,address,(address[2]))[3][4]", + "value": [ + [ + [ + ["Moo é🚀 é🚀oéo🚀"], + "Moo é🚀oo Moooé🚀é 🚀oMoo🚀o🚀é oé", + "0xE62deBc583a0244862B2FD16d993Ffdb0BCe95B4", + "0xA99f5C0B57Ca15bD1Abce702F38c69696C10fc27", + [ + [ + "0xDAFe6C73555CB714a9dAcdcF5fceB9907ce03624", + "0x65F4002d3065280c4EE77d6b7B96B650e8036c6f" + ] + ] + ], + [ + [], + "Moo é🚀🚀o 🚀oéMoééo 🚀", + "0x6028379d641C906e74F82004af18e274206263d3", + "0x465dE44ae1b4943eB8a37243a402A05a2F38a92f", + [ + [ + "0x2D2984b6B6b34579D72Dc75F879ce95B246e5B38", + "0x81b77B2E40c3DF01e033B7362f0466603ceC836A" + ] + ] + ], + [ + [ + "Moo é🚀🚀🚀🚀oooéoooo🚀M oéo🚀éoo", + "Moo é🚀🚀M éé é🚀 🚀éM Méoooooé éoé🚀🚀🚀 é🚀éooM🚀", + "Moo é🚀MMoé🚀oéMMMooM oMo 🚀Méé Mo🚀 🚀M éoéoMooéoo ", + "Moo é🚀ooé M🚀ooo🚀o Moooo🚀M éo oé MéMMo oo" + ], + "Moo é🚀Moo🚀 MMé🚀🚀🚀", + "0xf46415895AcD4d5c129b8e030e01506A6E84C9a8", + "0x33AD16b10c7F9dD6061968Cb2ED987c97D921Bd7", + [ + [ + "0x824a7164A0e1Fcf345d031B7cD033591f3B16431", + "0x508B0a49A0826c995176F953Af8e78F5bdD87fE7" + ] + ] + ] + ], + [ + [ + [ + "Moo é🚀o🚀", + "Moo é🚀 🚀M 🚀 é MMéoMoéé oé 🚀🚀 MMéé🚀ééooMMoo é é🚀🚀🚀o🚀 🚀🚀Mo🚀 🚀🚀Mé", + "Moo é🚀 ooM🚀MoMo🚀🚀 éé MM🚀🚀é 🚀🚀o🚀o🚀éé🚀M 🚀Moé oM🚀🚀ééMéééé", + "Moo é🚀oo🚀oMoooéoM éMoo o🚀 oM🚀oé🚀🚀oéoMo MooMM o MM🚀M" + ], + "Moo é🚀", + "0x1B84514dfEb9A987B7Bff11e5dF24725D55D8287", + "0x41702e39f74B667c255E128856f8f6CD64d1A97D", + [ + [ + "0x42e76C831BC4646644721503E29baEF52Ddc3FD8", + "0x8deEA3cd686180C3040C18f0303A2d007804a516" + ] + ] + ], + [ + ["Moo é🚀🚀oooéoM🚀oo", "Moo é🚀Mo 🚀oo🚀ééM éMoo🚀 🚀🚀éMéééo o M"], + "Moo é🚀oo", + "0x9535f2B8EdF91A774CB6BD67FFeC790C4D3Be621", + "0xA9f1E0C1C3eE52B0d527B3E146b4F72D2cC23f77", + [ + [ + "0x518564fE0810BbEc78C2314C247510c35b0DC9DA", + "0xcB2Dc21ed1241A5DAa92Fdd6972296a20363C702" + ] + ] + ], + [ + [], + "Moo é🚀o 🚀M🚀éo🚀🚀 🚀MMoooo éé🚀o🚀ooMééM", + "0x1b5ad49aCEdb3887C11A86AF30FB46EEB2E4890F", + "0x742fcF4b0430Ed1ce02c3cb32076712bbCC94309", + [ + [ + "0xe63C67c20097b06E5173bc1702b3bA8e0400450c", + "0x29612B7Fe5aaac235344698a529efD1f5B4023fB" + ] + ] + ] + ], + [ + [ + [ + "Moo é🚀ooo🚀o o o🚀o éM🚀éé ooéé 🚀oo é🚀 o 🚀é🚀oéMo🚀é oo ", + "Moo é🚀M 🚀oé" + ], + "Moo é🚀ooo 🚀Moo oMMooMMooMM🚀éoéooo🚀o", + "0x2fDb690Cfb9F28A5B716BA66F81Fb956E8cDB034", + "0x6d99fAB91ba476a31695110f2E5da2f8555219D5", + [ + [ + "0x8f3fef2d0FFe6352A6237647B3d81E63F9ba9406", + "0x05A3c9BbDc7Df3c32Fa5c662Af3d5aA1b5D08A31" + ] + ] + ], + [ + ["Moo é🚀🚀oMooo🚀oMé🚀o🚀MMM ooMo o 🚀oooooo oMoM🚀M🚀oéooooé ooooooo"], + "Moo é🚀oooooo oooéoM🚀é🚀o oo🚀🚀oéé oo🚀o", + "0x935eD275d8746877542Ee2B1d164c52952B8B8d9", + "0xb8a3c597355457624aE75db015EfAd777484a9ce", + [ + [ + "0x26E7541F0E5185D4804549a27273580231C06Ae2", + "0xa837156d2A80a843BCedc26C0F8d8dA4b4A72663" + ] + ] + ], + [ + ["Moo é🚀ooooo 🚀🚀Mo🚀Mo 🚀M éoééo🚀🚀oMéM 🚀oo"], + "Moo é🚀", + "0xf39e45B79F0EF15b830f59378C1e2eeEEE04f9CF", + "0x1b0BFF129a203e4cE00E1F2db29e67c5D3B28b9a", + [ + [ + "0xE61e2dDDFD646b44B89e2CDf5fd6c66bEe0A441A", + "0x110b806e6fe5DC2669bFB20bBEC23DD5C52b3795" + ] + ] + ] + ], + [ + [ + [], + "Moo é🚀 Moé ooo🚀Mo🚀 🚀o🚀ooMoéé🚀o🚀M oéoM🚀🚀🚀o o🚀o", + "0x2D0ced94DE035F6b19f3D25d9eE9431b7a6edf54", + "0x3F52479F887B40cBAEDf26Dad1c3765995DA22B0", + [ + [ + "0x77C9011d0856C66d7ccD5F0fC9837f78cB8B721f", + "0x718bB8b4818538a098eE32829Fe0b71258FF914E" + ] + ] + ], + [ + [ + "Moo é🚀🚀🚀Mo🚀🚀oMoM o🚀Mo oo", + "Moo é🚀🚀🚀M🚀é🚀oo🚀M🚀é", + "Moo é🚀oé🚀🚀 éoMMoM éo oééoMo éMMoo Moéoé M🚀ooM oéé", + "Moo é🚀oéM🚀o🚀 🚀 Méé oooooMo🚀 oééo🚀🚀oééMoéo éoé🚀oMo" + ], + "Moo é🚀oé🚀é é", + "0x50720aE2b088EDB8a48f88346C2c6C454BBC5631", + "0x27d8DF4050ae871ab855be3CDfb04C6cb5ACa049", + [ + [ + "0xeA7601631A31e83FeD017e8108d7bBEa1Df32399", + "0x462F096FEB2Dc5a9485f05C9C0620B2bDBDfCC53" + ] + ] + ], + [ + [ + "Moo é🚀MMM🚀ooooo🚀o🚀🚀ooMoéoooM ooé 🚀éoo o oééoM", + "Moo é🚀 🚀oé oéMMMo🚀MM MM MMo🚀Mo", + "Moo é🚀M oM🚀MMéo🚀 o🚀é", + "Moo é🚀 o🚀 éoo🚀ooMééo🚀MéoM🚀🚀🚀🚀 ooo🚀 ooMo🚀o éé🚀éo🚀 🚀 " + ], + "Moo é🚀éoo🚀oMoéé", + "0x401dB8a431d9066dDF407BE513Ba2DD0A53526c3", + "0x07b13ae026A0a9A1d9039bd8aCDc9A7EB83e2cb8", + [ + [ + "0x4068F4f99B4630D16226C7ACcF400c0d26BCfA1d", + "0x1913E411f8E3AD5d18dCC64c7C337174617BCF79" + ] + ] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é🚀oéo🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo Moooé🚀é 🚀oMoo🚀o🚀é oé" + }, + { + "type": "address", + "value": "0xE62deBc583a0244862B2FD16d993Ffdb0BCe95B4" + }, + { + "type": "address", + "value": "0xA99f5C0B57Ca15bD1Abce702F38c69696C10fc27" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xDAFe6C73555CB714a9dAcdcF5fceB9907ce03624" + }, + { + "type": "address", + "value": "0x65F4002d3065280c4EE77d6b7B96B650e8036c6f" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀🚀o 🚀oéMoééo 🚀" + }, + { + "type": "address", + "value": "0x6028379d641C906e74F82004af18e274206263d3" + }, + { + "type": "address", + "value": "0x465dE44ae1b4943eB8a37243a402A05a2F38a92f" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2D2984b6B6b34579D72Dc75F879ce95B246e5B38" + }, + { + "type": "address", + "value": "0x81b77B2E40c3DF01e033B7362f0466603ceC836A" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀oooéoooo🚀M oéo🚀éoo" + }, + { + "type": "string", + "value": "Moo é🚀🚀M éé é🚀 🚀éM Méoooooé éoé🚀🚀🚀 é🚀éooM🚀" + }, + { + "type": "string", + "value": "Moo é🚀MMoé🚀oéMMMooM oMo 🚀Méé Mo🚀 🚀M éoéoMooéoo " + }, + { + "type": "string", + "value": "Moo é🚀ooé M🚀ooo🚀o Moooo🚀M éo oé MéMMo oo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Moo🚀 MMé🚀🚀🚀" + }, + { + "type": "address", + "value": "0xf46415895AcD4d5c129b8e030e01506A6E84C9a8" + }, + { + "type": "address", + "value": "0x33AD16b10c7F9dD6061968Cb2ED987c97D921Bd7" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x824a7164A0e1Fcf345d031B7cD033591f3B16431" + }, + { + "type": "address", + "value": "0x508B0a49A0826c995176F953Af8e78F5bdD87fE7" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀" + }, + { + "type": "string", + "value": "Moo é🚀 🚀M 🚀 é MMéoMoéé oé 🚀🚀 MMéé🚀ééooMMoo é é🚀🚀🚀o🚀 🚀🚀Mo🚀 🚀🚀Mé" + }, + { + "type": "string", + "value": "Moo é🚀 ooM🚀MoMo🚀🚀 éé MM🚀🚀é 🚀🚀o🚀o🚀éé🚀M 🚀Moé oM🚀🚀ééMéééé" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀oMoooéoM éMoo o🚀 oM🚀oé🚀🚀oéoMo MooMM o MM🚀M" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0x1B84514dfEb9A987B7Bff11e5dF24725D55D8287" + }, + { + "type": "address", + "value": "0x41702e39f74B667c255E128856f8f6CD64d1A97D" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x42e76C831BC4646644721503E29baEF52Ddc3FD8" + }, + { + "type": "address", + "value": "0x8deEA3cd686180C3040C18f0303A2d007804a516" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oooéoM🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀Mo 🚀oo🚀ééM éMoo🚀 🚀🚀éMéééo o M" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo" + }, + { + "type": "address", + "value": "0x9535f2B8EdF91A774CB6BD67FFeC790C4D3Be621" + }, + { + "type": "address", + "value": "0xA9f1E0C1C3eE52B0d527B3E146b4F72D2cC23f77" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x518564fE0810BbEc78C2314C247510c35b0DC9DA" + }, + { + "type": "address", + "value": "0xcB2Dc21ed1241A5DAa92Fdd6972296a20363C702" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀o 🚀M🚀éo🚀🚀 🚀MMoooo éé🚀o🚀ooMééM" + }, + { + "type": "address", + "value": "0x1b5ad49aCEdb3887C11A86AF30FB46EEB2E4890F" + }, + { + "type": "address", + "value": "0x742fcF4b0430Ed1ce02c3cb32076712bbCC94309" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe63C67c20097b06E5173bc1702b3bA8e0400450c" + }, + { + "type": "address", + "value": "0x29612B7Fe5aaac235344698a529efD1f5B4023fB" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo🚀o o o🚀o éM🚀éé ooéé 🚀oo é🚀 o 🚀é🚀oéMo🚀é oo " + }, + { + "type": "string", + "value": "Moo é🚀M 🚀oé" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooo 🚀Moo oMMooMMooMM🚀éoéooo🚀o" + }, + { + "type": "address", + "value": "0x2fDb690Cfb9F28A5B716BA66F81Fb956E8cDB034" + }, + { + "type": "address", + "value": "0x6d99fAB91ba476a31695110f2E5da2f8555219D5" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8f3fef2d0FFe6352A6237647B3d81E63F9ba9406" + }, + { + "type": "address", + "value": "0x05A3c9BbDc7Df3c32Fa5c662Af3d5aA1b5D08A31" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oMooo🚀oMé🚀o🚀MMM ooMo o 🚀oooooo oMoM🚀M🚀oéooooé ooooooo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oooooo oooéoM🚀é🚀o oo🚀🚀oéé oo🚀o" + }, + { + "type": "address", + "value": "0x935eD275d8746877542Ee2B1d164c52952B8B8d9" + }, + { + "type": "address", + "value": "0xb8a3c597355457624aE75db015EfAd777484a9ce" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x26E7541F0E5185D4804549a27273580231C06Ae2" + }, + { + "type": "address", + "value": "0xa837156d2A80a843BCedc26C0F8d8dA4b4A72663" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooooo 🚀🚀Mo🚀Mo 🚀M éoééo🚀🚀oMéM 🚀oo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0xf39e45B79F0EF15b830f59378C1e2eeEEE04f9CF" + }, + { + "type": "address", + "value": "0x1b0BFF129a203e4cE00E1F2db29e67c5D3B28b9a" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xE61e2dDDFD646b44B89e2CDf5fd6c66bEe0A441A" + }, + { + "type": "address", + "value": "0x110b806e6fe5DC2669bFB20bBEC23DD5C52b3795" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀 Moé ooo🚀Mo🚀 🚀o🚀ooMoéé🚀o🚀M oéoM🚀🚀🚀o o🚀o" + }, + { + "type": "address", + "value": "0x2D0ced94DE035F6b19f3D25d9eE9431b7a6edf54" + }, + { + "type": "address", + "value": "0x3F52479F887B40cBAEDf26Dad1c3765995DA22B0" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x77C9011d0856C66d7ccD5F0fC9837f78cB8B721f" + }, + { + "type": "address", + "value": "0x718bB8b4818538a098eE32829Fe0b71258FF914E" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀Mo🚀🚀oMoM o🚀Mo oo" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀M🚀é🚀oo🚀M🚀é" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀🚀 éoMMoM éo oééoMo éMMoo Moéoé M🚀ooM oéé" + }, + { + "type": "string", + "value": "Moo é🚀oéM🚀o🚀 🚀 Méé oooooMo🚀 oééo🚀🚀oééMoéo éoé🚀oMo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oé🚀é é" + }, + { + "type": "address", + "value": "0x50720aE2b088EDB8a48f88346C2c6C454BBC5631" + }, + { + "type": "address", + "value": "0x27d8DF4050ae871ab855be3CDfb04C6cb5ACa049" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xeA7601631A31e83FeD017e8108d7bBEa1Df32399" + }, + { + "type": "address", + "value": "0x462F096FEB2Dc5a9485f05C9C0620B2bDBDfCC53" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMM🚀ooooo🚀o🚀🚀ooMoéoooM ooé 🚀éoo o oééoM" + }, + { + "type": "string", + "value": "Moo é🚀 🚀oé oéMMMo🚀MM MM MMo🚀Mo" + }, + { + "type": "string", + "value": "Moo é🚀M oM🚀MMéo🚀 o🚀é" + }, + { + "type": "string", + "value": "Moo é🚀 o🚀 éoo🚀ooMééo🚀MéoM🚀🚀🚀🚀 ooo🚀 ooMo🚀o éé🚀éo🚀 🚀 " + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éoo🚀oMoéé" + }, + { + "type": "address", + "value": "0x401dB8a431d9066dDF407BE513Ba2DD0A53526c3" + }, + { + "type": "address", + "value": "0x07b13ae026A0a9A1d9039bd8aCDc9A7EB83e2cb8" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4068F4f99B4630D16226C7ACcF400c0d26BCfA1d" + }, + { + "type": "address", + "value": "0x1913E411f8E3AD5d18dCC64c7C337174617BCF79" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611acd806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061127b565b60405180910390f35b61005661112c565b61005e61112c565b610066611159565b61006e611186565b604080516001808252818301909252600091816020015b606081526020019060019003908161008557905050905060006040518060400160405280601981526020017f4d6f6f20c3a9f09f9a8020c3a9f09f9a806fc3a96ff09f9a8000000000000000815250905080826000815181106100ea576100ea6113a7565b6020026020010181905250508082600001819052505060006040518060600160405280603281526020016114926032913960208301525073e62debc583a0244862b2fd16d993ffdb0bce95b4604082015273a99f5c0b57ca15bd1abce702f38c69696c10fc27606082015261015d6111cc565b6101656111db565b73dafe6c73555cb714a9dacdcf5fceb9907ce0362481527365f4002d3065280c4ee77d6b7b96b650e8036c6f60208201528152608082015281526101a7611186565b60408051600080825260208201909252816101d2565b60608152602001906001900390816101bd5790505b5082525060408051606081019091526023808252600091906119e56020830139602083015250736028379d641c906e74f82004af18e274206263d3604082015273465de44ae1b4943eb8a37243a402a05a2f38a92f60608201526102346111cc565b61023c6111db565b732d2984b6b6b34579d72dc75f879ce95b246e5b3881527381b77b2e40c3df01e033b7362f0466603cec836a6020808301919091529082526080830191909152820152610287611186565b60408051600480825260a08201909252600091816020015b606081526020019060019003908161029f579050509050600060405180606001604052806031815260200161195f60319139905080826000815181106102e7576102e76113a7565b60200260200101819052505060006040518060800160405280605181526020016117f36051913990508082600181518110610324576103246113a7565b60200260200101819052505060006040518060800160405280604881526020016118446048913990508082600281518110610361576103616113a7565b60200260200101819052505060006040518060600160405280603e815260200161158f603e91399050808260038151811061039e5761039e6113a7565b602002602001018190525050808260000181905250506000604051806060016040528060228152602001611a086022913960208301525073f46415895acd4d5c129b8e030e01506a6e84c9a860408201527333ad16b10c7f9dd6061968cb2ed987c97d921bd760608201526104116111cc565b6104196111db565b73824a7164a0e1fcf345d031b7cd033591f3b16431815273508b0a49a0826c995176f953af8e78f5bdd87fe760208201528152608082015260408201528152610460611159565b610468611186565b60408051600480825260a08201909252600091816020015b606081526020019060019003908161048057905050905060006040518060400160405280600f81526020016d9adede418753e13f3500dfe13f35608f1b815250905080826000815181106104d6576104d66113a7565b60200260200101819052505060006040518060a00160405280607981526020016116596079913990508082600181518110610513576105136113a7565b60200260200101819052505060006040518060a00160405280606e8152602001611a2a606e913990508082600281518110610550576105506113a7565b60200260200101819052505060006040518060800160405280604e815260200161175c604e91399050808260038151811061058d5761058d6113a7565b60209081029190910181019190915291835250604080518082018252600a8152689adede418753e13f3560b71b8184015291830191909152731b84514dfeb9a987b7bff11e5df24725d55d8287908201527341702e39f74b667c255e128856f8f6cd64d1a97d60608201526106006111cc565b6106086111db565b7342e76c831bc4646644721503e29baef52ddc3fd88152738deea3cd686180c3040c18f0303a2d007804a516602082015281526080820152815261064a611186565b60408051600280825260608201909252600091816020015b606081526020019060019003908161066257905050905060006040518060400160405280601b81526020017f4d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a96f4df09f9a806f6f0000000000815250905080826000815181106106c7576106c76113a7565b60200260200101819052505060006040518060600160405280603d8152602001611402603d913990508082600181518110610704576107046113a7565b60209081029190910181019190915291835250604080518082018252600c81526b4d6f6f20c3a9f09f9a806f6f60a01b8184015291830191909152739535f2b8edf91a774cb6bd67ffec790c4d3be6219082015273a9f1e0c1c3ee52b0d527b3e146b4f72d2cc23f77606082015261077a6111cc565b6107826111db565b73518564fe0810bbec78c2314c247510c35b0dc9da815273cb2dc21ed1241a5daa92fdd6972296a20363c70260208083019190915290825260808301919091528201526107cd611186565b60408051600080825260208201909252816107f8565b60608152602001906001900390816107e35790505b50825250604080516080810190915260418082526000919061191e6020830139602083015250731b5ad49acedb3887c11a86af30fb46eeb2e4890f604082015273742fcf4b0430ed1ce02c3cb32076712bbcc94309606082015261085a6111cc565b6108626111db565b73e63c67c20097b06e5173bc1702b3ba8e0400450c81527329612b7fe5aaac235344698a529efd1f5b4023fb602080830191909152908252608083019190915260408301919091528201526108b5611159565b6108bd611186565b60408051600280825260608201909252600091816020015b60608152602001906001900390816108d55790505090506000604051806080016040528060588152602001611704605891399050808260008151811061091d5761091d6113a7565b6020026020010181905250506000604051806040016040528060148152602001734d6f6f20c3a9f09f9a804d2020f09f9a806fc3a960601b8152509050808260018151811061096e5761096e6113a7565b6020026020010181905250508082600001819052505060006040518060600160405280603281526020016116d260329139602083015250732fdb690cfb9f28a5b716ba66f81fb956e8cdb0346040820152736d99fab91ba476a31695110f2e5da2f8555219d560608201526109e16111cc565b6109e96111db565b738f3fef2d0ffe6352a6237647b3d81e63f9ba940681527305a3c9bbdc7df3c32fa5c662af3d5aa1b5d08a316020820152815260808201528152610a2b611186565b604080516001808252818301909252600091816020015b6060815260200190600190039081610a4257905050905060006040518060800160405280605981526020016115096059913990508082600081518110610a8a57610a8a6113a7565b6020026020010181905250508082600001819052505060006040518060600160405280603c81526020016118e2603c913960208301525073935ed275d8746877542ee2b1d164c52952b8b8d9604082015273b8a3c597355457624ae75db015efad777484a9ce6060820152610afd6111cc565b610b056111db565b7326e7541f0e5185d4804549a27273580231c06ae2815273a837156d2a80a843bcedc26c0f8d8da4b4a726636020808301919091529082526080830191909152820152610b50611186565b604080516001808252818301909252600091816020015b6060815260200190600190039081610b6757905050905060006040518060800160405280604481526020016113be6044913990508082600081518110610baf57610baf6113a7565b60209081029190910181019190915291835250604080518082018252600a8152689adede418753e13f3560b71b818401529183019190915273f39e45b79f0ef15b830f59378c1e2eeeee04f9cf90820152731b0bff129a203e4ce00e1f2db29e67c5d3b28b9a6060820152610c226111cc565b610c2a6111db565b73e61e2dddfd646b44b89e2cdf5fd6c66bee0a441a815273110b806e6fe5dc2669bfb20bbec23dd5c52b3795602082015281526080820152604080830191909152820152610c76611159565b610c7e611186565b6040805160008082526020820190925281610ca9565b6060815260200190600190039081610c945790505b50825250604080516080810190915260538082526000919061143f6020830139602083015250732d0ced94de035f6b19f3d25d9ee9431b7a6edf546040820152733f52479f887b40cbaedf26dad1c3765995da22b06060820152610d0b6111cc565b610d136111db565b7377c9011d0856c66d7ccd5f0fc9837f78cb8b721f815273718bb8b4818538a098ee32829fe0b71258ff914e6020820152815260808201528152610d55611186565b60408051600480825260a08201909252600091816020015b6060815260200190600190039081610d6d57905050905060006040518060600160405280602b81526020016119ba602b913990508082600081518110610db557610db56113a7565b60200260200101819052505060006040518060600160405280602a8152602001611990602a913990508082600181518110610df257610df26113a7565b60200260200101819052505060006040518060800160405280604981526020016117aa6049913990508082600281518110610e2f57610e2f6113a7565b602002602001018190525050600060405180608001604052806056815260200161188c6056913990508082600381518110610e6c57610e6c6113a7565b6020908102919091018101919091529183525060408051808201825260168152754d6f6f20c3a9f09f9a806fc3a9f09f9a80c3a920c3a960501b81840152918301919091527350720ae2b088edb8a48f88346c2c6c454bbc5631908201527327d8df4050ae871ab855be3cdfb04c6cb5aca0496060820152610eec6111cc565b610ef46111db565b73ea7601631a31e83fed017e8108d7bbea1df32399815273462f096feb2dc5a9485f05c9c0620b2bdbdfcc536020808301919091529082526080830191909152820152610f3f611186565b60408051600480825260a08201909252600091816020015b6060815260200190600190039081610f5757905050905060006040518060800160405280604581526020016114c46045913990508082600081518110610f9f57610f9f6113a7565b60200260200101819052505060006040518060600160405280602d8152602001611562602d913990508082600181518110610fdc57610fdc6113a7565b60200260200101819052505060006040518060600160405280602481526020016115cd6024913990508082600281518110611019576110196113a7565b60200260200101819052505060006040518060a00160405280606881526020016115f16068913990508082600381518110611056576110566113a7565b60209081029190910181019190915291835250604080518082018252601981527f4d6f6f20c3a9f09f9a80c3a96f6ff09f9a806f4d6fc3a9c3a900000000000000818401529183019190915273401db8a431d9066ddf407be513ba2dd0a53526c3908201527307b13ae026a0a9a1d9039bd8acdc9a7eb83e2cb860608201526110dd6111cc565b6110e56111db565b734068f4f99b4630d16226c7accf400c0d26bcfa1d8152731913e411f8e3ad5d18dcc64c7c337174617bcf7960208201528152608082015260408201526060820152919050565b60405180608001604052806004905b611143611159565b81526020019060019003908161113b5790505090565b60405180606001604052806003905b611170611186565b8152602001906001900390816111685790505090565b6040518060a00160405280606081526020016060815260200160006001600160a01b0316815260200160006001600160a01b031681526020016111c76111cc565b905290565b60405180602001604052806111c75b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561121f57602081850181015186830182015201611203565b81811115611231576000602083870101525b50601f01601f19169290920160200192915050565b80518260005b60028110156112745782516001600160a01b031682526020928301929091019060010161124c565b5050505050565b602080825260009060a0830183820185845b600481101561139b57868403601f19018352815184606080820160005b60038110156113855788820384528451805160c0808552815190850181905260e080860192600583901b870190910191908e019060005b818110156113145760df198885030185526112fd8484516111f9565b93508f830192508f850194506001810190506112e1565b5050508c83015191508481038d86015261132e81836111f9565b91505060408083015161134b828701826001600160a01b03169052565b5050848201516001600160a01b0316848601526080918201519161137181860184611246565b50958b0195948b01949250506001016112aa565b509650505092850192509084019060010161128d565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6f6f6f6f20f09f9a80f09f9a804d6ff09f9a804d6f2020f09f9a804d20c3a96fc3a9c3a96ff09f9a80f09f9a806f4dc3a94d20f09f9a806f6f4d6f6f20c3a9f09f9a804d6f20f09f9a806f6ff09f9a80c3a9c3a94d20c3a94d6f6ff09f9a8020f09f9a80f09f9a80c3a94dc3a9c3a9c3a96f206f204d4d6f6f20c3a9f09f9a80204d6fc3a9206f6f6ff09f9a804d6ff09f9a8020f09f9a806ff09f9a806f6f4d6fc3a9c3a9f09f9a806ff09f9a804d206fc3a96f4df09f9a80f09f9a80f09f9a806f206ff09f9a806f4d6f6f20c3a9f09f9a806f6f204d6f6f6fc3a9f09f9a80c3a92020f09f9a806f4d6f6ff09f9a806ff09f9a80c3a9206fc3a94d6f6f20c3a9f09f9a804d4d4df09f9a806f6f6f6f6ff09f9a806ff09f9a80f09f9a806f6f4d6fc3a96f6f6f4d206f6fc3a920f09f9a80c3a96f6f206f206fc3a9c3a96f4d4d6f6f20c3a9f09f9a80f09f9a806f4d6f6f6ff09f9a806f4dc3a9f09f9a806ff09f9a804d4d4d206f6f4d6f206f2020f09f9a806f6f6f6f6f6f206f4d6f4df09f9a804df09f9a806fc3a96f6f6f6fc3a9206f6f6f6f6f6f6f4d6f6f20c3a9f09f9a8020f09f9a806fc3a9206fc3a94d4d4d6ff09f9a804d4d204d4d204d4d6ff09f9a804d6f4d6f6f20c3a9f09f9a806f6fc3a9204df09f9a806f6f6ff09f9a806f204d6f6f6f6ff09f9a804d20c3a96f20202020206fc3a920204dc3a94d4d6f206f6f4d6f6f20c3a9f09f9a804d20206f4df09f9a804d4dc3a96ff09f9a80206ff09f9a80c3a94d6f6f20c3a9f09f9a802020206ff09f9a80202020c3a96f6ff09f9a806f6f4dc3a9c3a96ff09f9a804dc3a96f4df09f9a80f09f9a80f09f9a80f09f9a8020206f6f6ff09f9a80206f6f4d6ff09f9a806f20c3a9c3a9f09f9a80c3a96ff09f9a8020f09f9a8020204d6f6f20c3a9f09f9a8020f09f9a804d20f09f9a8020c3a9204d4dc3a96f4d6fc3a9c3a9206fc3a920f09f9a80f09f9a80204d4dc3a9c3a9f09f9a80c3a9c3a96f6f4d4d6f6f20c3a920c3a9f09f9a80f09f9a80f09f9a806ff09f9a802020f09f9a80f09f9a804d6ff09f9a8020f09f9a80f09f9a804dc3a94d6f6f20c3a9f09f9a806f6f6f20f09f9a804d6f6f206f4d4d6f6f4d4d6f6f4d4df09f9a80c3a96fc3a96f6f6ff09f9a806f4d6f6f20c3a9f09f9a806f6f6ff09f9a806f206f206ff09f9a806f20c3a94df09f9a80c3a9c3a9206f6fc3a9c3a920f09f9a806f6f20c3a9f09f9a80206f20f09f9a80c3a9f09f9a806fc3a94d6ff09f9a80c3a9206f6f204d6f6f20c3a9f09f9a806f6ff09f9a806f4d6f6f6fc3a96f4d20c3a94d6f6f206ff09f9a80206f4df09f9a806fc3a9f09f9a80f09f9a806fc3a96f4d6f204d6f6f4d4d206f20204d4df09f9a804d4d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a8020c3a96f4d4d6f4d20c3a96f206fc3a9c3a96f4d6f20c3a94d4d6f6f204d6fc3a96fc3a920204df09f9a806f6f4d206fc3a9c3a94d6f6f20c3a9f09f9a80f09f9a804d20c3a9c3a920c3a9f09f9a8020f09f9a80c3a94d20204dc3a96f6f6f6f6fc3a920c3a96fc3a9f09f9a80f09f9a80f09f9a8020c3a9f09f9a80c3a96f6f4df09f9a804d6f6f20c3a9f09f9a804d4d6fc3a9f09f9a806fc3a94d4d4d6f6f4d206f4d6f2020f09f9a804dc3a9c3a9204d6ff09f9a8020f09f9a804d2020c3a96fc3a96f4d6f6fc3a96f6f204d6f6f20c3a9f09f9a806fc3a94df09f9a806ff09f9a8020f09f9a80204dc3a9c3a920206f6f6f6f6f4d6ff09f9a80206fc3a9c3a96ff09f9a80f09f9a806fc3a9c3a94d6fc3a96f2020c3a96fc3a9f09f9a806f4d6f4d6f6f20c3a9f09f9a806f6f6f6f6f6f206f6f6fc3a96f4df09f9a80c3a9f09f9a806f206f6ff09f9a80f09f9a806fc3a9c3a920206f6ff09f9a806f4d6f6f20c3a9f09f9a806f20f09f9a804df09f9a80c3a96ff09f9a80f09f9a8020f09f9a804d4d6f6f6f6f20c3a9c3a9f09f9a806ff09f9a806f6f4dc3a9c3a94d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f6f6fc3a96f6f6f6ff09f9a804d206fc3a96ff09f9a80c3a96f6f4d6f6f20c3a9f09f9a80f09f9a80f09f9a804df09f9a80c3a9f09f9a806f6ff09f9a804df09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a80f09f9a804d6ff09f9a80f09f9a806f4d6f4d206ff09f9a804d6f206f6f4d6f6f20c3a9f09f9a80f09f9a806f20f09f9a806fc3a94d6fc3a9c3a96f20f09f9a804d6f6f20c3a9f09f9a804d6f6ff09f9a80204d4dc3a9f09f9a80f09f9a80f09f9a804d6f6f20c3a9f09f9a80206f6f4df09f9a804d6f4d6ff09f9a80f09f9a8020c3a9c3a9204d4df09f9a80f09f9a80c3a92020f09f9a80f09f9a806ff09f9a806ff09f9a80c3a9c3a9f09f9a804d20f09f9a804d6fc3a9206f4df09f9a80f09f9a80c3a9c3a94dc3a9c3a9c3a9c3a9a2646970667358221220110ffe06a816dfc74cf0f26abd031426a358a5eaa2c4e5e2f2c47452a1a3610264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6acf71d8 {\n address[2] s_0;\n }\n\n struct S_3d1884dd {\n string[] s_0;\n string s_1;\n address s_2;\n address s_3;\n S_6acf71d8 s_4;\n }\n\n function test () public pure returns (S_3d1884dd[3][4] memory) {\n S_3d1884dd[3][4] memory r;\n {\n S_3d1884dd[3] memory r_0;\n {\n S_3d1884dd memory r_0_0;\n {\n string[] memory r_0_0_0 = new string[](1);\n {\n string memory r_0_0_0_0 = unicode\"Moo é🚀 é🚀oéo🚀\";\n r_0_0_0[0] = r_0_0_0_0;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀oo Moooé🚀é 🚀oMoo🚀o🚀é oé\";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0xE62deBc583a0244862B2FD16d993Ffdb0BCe95B4;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n address r_0_0_3 = 0xA99f5C0B57Ca15bD1Abce702F38c69696C10fc27;\n r_0_0.s_3 = r_0_0_3;\n }\n {\n S_6acf71d8 memory r_0_0_4;\n {\n address[2] memory r_0_0_4_0;\n {\n address r_0_0_4_0_0 = 0xDAFe6C73555CB714a9dAcdcF5fceB9907ce03624;\n r_0_0_4_0[0] = r_0_0_4_0_0;\n }\n {\n address r_0_0_4_0_1 = 0x65F4002d3065280c4EE77d6b7B96B650e8036c6f;\n r_0_0_4_0[1] = r_0_0_4_0_1;\n }\n r_0_0_4.s_0 = r_0_0_4_0;\n }\n r_0_0.s_4 = r_0_0_4;\n }\n r_0[0] = r_0_0;\n }\n {\n S_3d1884dd memory r_0_1;\n {\n string[] memory r_0_1_0 = new string[](0);\n r_0_1.s_0 = r_0_1_0;\n }\n {\n string memory r_0_1_1 = unicode\"Moo é🚀🚀o 🚀oéMoééo 🚀\";\n r_0_1.s_1 = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x6028379d641C906e74F82004af18e274206263d3;\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x465dE44ae1b4943eB8a37243a402A05a2F38a92f;\n r_0_1.s_3 = r_0_1_3;\n }\n {\n S_6acf71d8 memory r_0_1_4;\n {\n address[2] memory r_0_1_4_0;\n {\n address r_0_1_4_0_0 = 0x2D2984b6B6b34579D72Dc75F879ce95B246e5B38;\n r_0_1_4_0[0] = r_0_1_4_0_0;\n }\n {\n address r_0_1_4_0_1 = 0x81b77B2E40c3DF01e033B7362f0466603ceC836A;\n r_0_1_4_0[1] = r_0_1_4_0_1;\n }\n r_0_1_4.s_0 = r_0_1_4_0;\n }\n r_0_1.s_4 = r_0_1_4;\n }\n r_0[1] = r_0_1;\n }\n {\n S_3d1884dd memory r_0_2;\n {\n string[] memory r_0_2_0 = new string[](4);\n {\n string memory r_0_2_0_0 = unicode\"Moo é🚀🚀🚀🚀oooéoooo🚀M oéo🚀éoo\";\n r_0_2_0[0] = r_0_2_0_0;\n }\n {\n string memory r_0_2_0_1 = unicode\"Moo é🚀🚀M éé é🚀 🚀éM Méoooooé éoé🚀🚀🚀 é🚀éooM🚀\";\n r_0_2_0[1] = r_0_2_0_1;\n }\n {\n string memory r_0_2_0_2 = unicode\"Moo é🚀MMoé🚀oéMMMooM oMo 🚀Méé Mo🚀 🚀M éoéoMooéoo \";\n r_0_2_0[2] = r_0_2_0_2;\n }\n {\n string memory r_0_2_0_3 = unicode\"Moo é🚀ooé M🚀ooo🚀o Moooo🚀M éo oé MéMMo oo\";\n r_0_2_0[3] = r_0_2_0_3;\n }\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀Moo🚀 MMé🚀🚀🚀\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n address r_0_2_2 = 0xf46415895AcD4d5c129b8e030e01506A6E84C9a8;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n address r_0_2_3 = 0x33AD16b10c7F9dD6061968Cb2ED987c97D921Bd7;\n r_0_2.s_3 = r_0_2_3;\n }\n {\n S_6acf71d8 memory r_0_2_4;\n {\n address[2] memory r_0_2_4_0;\n {\n address r_0_2_4_0_0 = 0x824a7164A0e1Fcf345d031B7cD033591f3B16431;\n r_0_2_4_0[0] = r_0_2_4_0_0;\n }\n {\n address r_0_2_4_0_1 = 0x508B0a49A0826c995176F953Af8e78F5bdD87fE7;\n r_0_2_4_0[1] = r_0_2_4_0_1;\n }\n r_0_2_4.s_0 = r_0_2_4_0;\n }\n r_0_2.s_4 = r_0_2_4;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_3d1884dd[3] memory r_1;\n {\n S_3d1884dd memory r_1_0;\n {\n string[] memory r_1_0_0 = new string[](4);\n {\n string memory r_1_0_0_0 = unicode\"Moo é🚀o🚀\";\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n string memory r_1_0_0_1 = unicode\"Moo é🚀 🚀M 🚀 é MMéoMoéé oé 🚀🚀 MMéé🚀ééooMMoo é é🚀🚀🚀o🚀 🚀🚀Mo🚀 🚀🚀Mé\";\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n string memory r_1_0_0_2 = unicode\"Moo é🚀 ooM🚀MoMo🚀🚀 éé MM🚀🚀é 🚀🚀o🚀o🚀éé🚀M 🚀Moé oM🚀🚀ééMéééé\";\n r_1_0_0[2] = r_1_0_0_2;\n }\n {\n string memory r_1_0_0_3 = unicode\"Moo é🚀oo🚀oMoooéoM éMoo o🚀 oM🚀oé🚀🚀oéoMo MooMM o MM🚀M\";\n r_1_0_0[3] = r_1_0_0_3;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n string memory r_1_0_1 = unicode\"Moo é🚀\";\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x1B84514dfEb9A987B7Bff11e5dF24725D55D8287;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n address r_1_0_3 = 0x41702e39f74B667c255E128856f8f6CD64d1A97D;\n r_1_0.s_3 = r_1_0_3;\n }\n {\n S_6acf71d8 memory r_1_0_4;\n {\n address[2] memory r_1_0_4_0;\n {\n address r_1_0_4_0_0 = 0x42e76C831BC4646644721503E29baEF52Ddc3FD8;\n r_1_0_4_0[0] = r_1_0_4_0_0;\n }\n {\n address r_1_0_4_0_1 = 0x8deEA3cd686180C3040C18f0303A2d007804a516;\n r_1_0_4_0[1] = r_1_0_4_0_1;\n }\n r_1_0_4.s_0 = r_1_0_4_0;\n }\n r_1_0.s_4 = r_1_0_4;\n }\n r_1[0] = r_1_0;\n }\n {\n S_3d1884dd memory r_1_1;\n {\n string[] memory r_1_1_0 = new string[](2);\n {\n string memory r_1_1_0_0 = unicode\"Moo é🚀🚀oooéoM🚀oo\";\n r_1_1_0[0] = r_1_1_0_0;\n }\n {\n string memory r_1_1_0_1 = unicode\"Moo é🚀Mo 🚀oo🚀ééM éMoo🚀 🚀🚀éMéééo o M\";\n r_1_1_0[1] = r_1_1_0_1;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n string memory r_1_1_1 = unicode\"Moo é🚀oo\";\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x9535f2B8EdF91A774CB6BD67FFeC790C4D3Be621;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n address r_1_1_3 = 0xA9f1E0C1C3eE52B0d527B3E146b4F72D2cC23f77;\n r_1_1.s_3 = r_1_1_3;\n }\n {\n S_6acf71d8 memory r_1_1_4;\n {\n address[2] memory r_1_1_4_0;\n {\n address r_1_1_4_0_0 = 0x518564fE0810BbEc78C2314C247510c35b0DC9DA;\n r_1_1_4_0[0] = r_1_1_4_0_0;\n }\n {\n address r_1_1_4_0_1 = 0xcB2Dc21ed1241A5DAa92Fdd6972296a20363C702;\n r_1_1_4_0[1] = r_1_1_4_0_1;\n }\n r_1_1_4.s_0 = r_1_1_4_0;\n }\n r_1_1.s_4 = r_1_1_4;\n }\n r_1[1] = r_1_1;\n }\n {\n S_3d1884dd memory r_1_2;\n {\n string[] memory r_1_2_0 = new string[](0);\n r_1_2.s_0 = r_1_2_0;\n }\n {\n string memory r_1_2_1 = unicode\"Moo é🚀o 🚀M🚀éo🚀🚀 🚀MMoooo éé🚀o🚀ooMééM\";\n r_1_2.s_1 = r_1_2_1;\n }\n {\n address r_1_2_2 = 0x1b5ad49aCEdb3887C11A86AF30FB46EEB2E4890F;\n r_1_2.s_2 = r_1_2_2;\n }\n {\n address r_1_2_3 = 0x742fcF4b0430Ed1ce02c3cb32076712bbCC94309;\n r_1_2.s_3 = r_1_2_3;\n }\n {\n S_6acf71d8 memory r_1_2_4;\n {\n address[2] memory r_1_2_4_0;\n {\n address r_1_2_4_0_0 = 0xe63C67c20097b06E5173bc1702b3bA8e0400450c;\n r_1_2_4_0[0] = r_1_2_4_0_0;\n }\n {\n address r_1_2_4_0_1 = 0x29612B7Fe5aaac235344698a529efD1f5B4023fB;\n r_1_2_4_0[1] = r_1_2_4_0_1;\n }\n r_1_2_4.s_0 = r_1_2_4_0;\n }\n r_1_2.s_4 = r_1_2_4;\n }\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_3d1884dd[3] memory r_2;\n {\n S_3d1884dd memory r_2_0;\n {\n string[] memory r_2_0_0 = new string[](2);\n {\n string memory r_2_0_0_0 = unicode\"Moo é🚀ooo🚀o o o🚀o éM🚀éé ooéé 🚀oo é🚀 o 🚀é🚀oéMo🚀é oo \";\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n string memory r_2_0_0_1 = unicode\"Moo é🚀M 🚀oé\";\n r_2_0_0[1] = r_2_0_0_1;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n string memory r_2_0_1 = unicode\"Moo é🚀ooo 🚀Moo oMMooMMooMM🚀éoéooo🚀o\";\n r_2_0.s_1 = r_2_0_1;\n }\n {\n address r_2_0_2 = 0x2fDb690Cfb9F28A5B716BA66F81Fb956E8cDB034;\n r_2_0.s_2 = r_2_0_2;\n }\n {\n address r_2_0_3 = 0x6d99fAB91ba476a31695110f2E5da2f8555219D5;\n r_2_0.s_3 = r_2_0_3;\n }\n {\n S_6acf71d8 memory r_2_0_4;\n {\n address[2] memory r_2_0_4_0;\n {\n address r_2_0_4_0_0 = 0x8f3fef2d0FFe6352A6237647B3d81E63F9ba9406;\n r_2_0_4_0[0] = r_2_0_4_0_0;\n }\n {\n address r_2_0_4_0_1 = 0x05A3c9BbDc7Df3c32Fa5c662Af3d5aA1b5D08A31;\n r_2_0_4_0[1] = r_2_0_4_0_1;\n }\n r_2_0_4.s_0 = r_2_0_4_0;\n }\n r_2_0.s_4 = r_2_0_4;\n }\n r_2[0] = r_2_0;\n }\n {\n S_3d1884dd memory r_2_1;\n {\n string[] memory r_2_1_0 = new string[](1);\n {\n string memory r_2_1_0_0 = unicode\"Moo é🚀🚀oMooo🚀oMé🚀o🚀MMM ooMo o 🚀oooooo oMoM🚀M🚀oéooooé ooooooo\";\n r_2_1_0[0] = r_2_1_0_0;\n }\n r_2_1.s_0 = r_2_1_0;\n }\n {\n string memory r_2_1_1 = unicode\"Moo é🚀oooooo oooéoM🚀é🚀o oo🚀🚀oéé oo🚀o\";\n r_2_1.s_1 = r_2_1_1;\n }\n {\n address r_2_1_2 = 0x935eD275d8746877542Ee2B1d164c52952B8B8d9;\n r_2_1.s_2 = r_2_1_2;\n }\n {\n address r_2_1_3 = 0xb8a3c597355457624aE75db015EfAd777484a9ce;\n r_2_1.s_3 = r_2_1_3;\n }\n {\n S_6acf71d8 memory r_2_1_4;\n {\n address[2] memory r_2_1_4_0;\n {\n address r_2_1_4_0_0 = 0x26E7541F0E5185D4804549a27273580231C06Ae2;\n r_2_1_4_0[0] = r_2_1_4_0_0;\n }\n {\n address r_2_1_4_0_1 = 0xa837156d2A80a843BCedc26C0F8d8dA4b4A72663;\n r_2_1_4_0[1] = r_2_1_4_0_1;\n }\n r_2_1_4.s_0 = r_2_1_4_0;\n }\n r_2_1.s_4 = r_2_1_4;\n }\n r_2[1] = r_2_1;\n }\n {\n S_3d1884dd memory r_2_2;\n {\n string[] memory r_2_2_0 = new string[](1);\n {\n string memory r_2_2_0_0 = unicode\"Moo é🚀ooooo 🚀🚀Mo🚀Mo 🚀M éoééo🚀🚀oMéM 🚀oo\";\n r_2_2_0[0] = r_2_2_0_0;\n }\n r_2_2.s_0 = r_2_2_0;\n }\n {\n string memory r_2_2_1 = unicode\"Moo é🚀\";\n r_2_2.s_1 = r_2_2_1;\n }\n {\n address r_2_2_2 = 0xf39e45B79F0EF15b830f59378C1e2eeEEE04f9CF;\n r_2_2.s_2 = r_2_2_2;\n }\n {\n address r_2_2_3 = 0x1b0BFF129a203e4cE00E1F2db29e67c5D3B28b9a;\n r_2_2.s_3 = r_2_2_3;\n }\n {\n S_6acf71d8 memory r_2_2_4;\n {\n address[2] memory r_2_2_4_0;\n {\n address r_2_2_4_0_0 = 0xE61e2dDDFD646b44B89e2CDf5fd6c66bEe0A441A;\n r_2_2_4_0[0] = r_2_2_4_0_0;\n }\n {\n address r_2_2_4_0_1 = 0x110b806e6fe5DC2669bFB20bBEC23DD5C52b3795;\n r_2_2_4_0[1] = r_2_2_4_0_1;\n }\n r_2_2_4.s_0 = r_2_2_4_0;\n }\n r_2_2.s_4 = r_2_2_4;\n }\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_3d1884dd[3] memory r_3;\n {\n S_3d1884dd memory r_3_0;\n {\n string[] memory r_3_0_0 = new string[](0);\n r_3_0.s_0 = r_3_0_0;\n }\n {\n string memory r_3_0_1 = unicode\"Moo é🚀 Moé ooo🚀Mo🚀 🚀o🚀ooMoéé🚀o🚀M oéoM🚀🚀🚀o o🚀o\";\n r_3_0.s_1 = r_3_0_1;\n }\n {\n address r_3_0_2 = 0x2D0ced94DE035F6b19f3D25d9eE9431b7a6edf54;\n r_3_0.s_2 = r_3_0_2;\n }\n {\n address r_3_0_3 = 0x3F52479F887B40cBAEDf26Dad1c3765995DA22B0;\n r_3_0.s_3 = r_3_0_3;\n }\n {\n S_6acf71d8 memory r_3_0_4;\n {\n address[2] memory r_3_0_4_0;\n {\n address r_3_0_4_0_0 = 0x77C9011d0856C66d7ccD5F0fC9837f78cB8B721f;\n r_3_0_4_0[0] = r_3_0_4_0_0;\n }\n {\n address r_3_0_4_0_1 = 0x718bB8b4818538a098eE32829Fe0b71258FF914E;\n r_3_0_4_0[1] = r_3_0_4_0_1;\n }\n r_3_0_4.s_0 = r_3_0_4_0;\n }\n r_3_0.s_4 = r_3_0_4;\n }\n r_3[0] = r_3_0;\n }\n {\n S_3d1884dd memory r_3_1;\n {\n string[] memory r_3_1_0 = new string[](4);\n {\n string memory r_3_1_0_0 = unicode\"Moo é🚀🚀🚀Mo🚀🚀oMoM o🚀Mo oo\";\n r_3_1_0[0] = r_3_1_0_0;\n }\n {\n string memory r_3_1_0_1 = unicode\"Moo é🚀🚀🚀M🚀é🚀oo🚀M🚀é\";\n r_3_1_0[1] = r_3_1_0_1;\n }\n {\n string memory r_3_1_0_2 = unicode\"Moo é🚀oé🚀🚀 éoMMoM éo oééoMo éMMoo Moéoé M🚀ooM oéé\";\n r_3_1_0[2] = r_3_1_0_2;\n }\n {\n string memory r_3_1_0_3 = unicode\"Moo é🚀oéM🚀o🚀 🚀 Méé oooooMo🚀 oééo🚀🚀oééMoéo éoé🚀oMo\";\n r_3_1_0[3] = r_3_1_0_3;\n }\n r_3_1.s_0 = r_3_1_0;\n }\n {\n string memory r_3_1_1 = unicode\"Moo é🚀oé🚀é é\";\n r_3_1.s_1 = r_3_1_1;\n }\n {\n address r_3_1_2 = 0x50720aE2b088EDB8a48f88346C2c6C454BBC5631;\n r_3_1.s_2 = r_3_1_2;\n }\n {\n address r_3_1_3 = 0x27d8DF4050ae871ab855be3CDfb04C6cb5ACa049;\n r_3_1.s_3 = r_3_1_3;\n }\n {\n S_6acf71d8 memory r_3_1_4;\n {\n address[2] memory r_3_1_4_0;\n {\n address r_3_1_4_0_0 = 0xeA7601631A31e83FeD017e8108d7bBEa1Df32399;\n r_3_1_4_0[0] = r_3_1_4_0_0;\n }\n {\n address r_3_1_4_0_1 = 0x462F096FEB2Dc5a9485f05C9C0620B2bDBDfCC53;\n r_3_1_4_0[1] = r_3_1_4_0_1;\n }\n r_3_1_4.s_0 = r_3_1_4_0;\n }\n r_3_1.s_4 = r_3_1_4;\n }\n r_3[1] = r_3_1;\n }\n {\n S_3d1884dd memory r_3_2;\n {\n string[] memory r_3_2_0 = new string[](4);\n {\n string memory r_3_2_0_0 = unicode\"Moo é🚀MMM🚀ooooo🚀o🚀🚀ooMoéoooM ooé 🚀éoo o oééoM\";\n r_3_2_0[0] = r_3_2_0_0;\n }\n {\n string memory r_3_2_0_1 = unicode\"Moo é🚀 🚀oé oéMMMo🚀MM MM MMo🚀Mo\";\n r_3_2_0[1] = r_3_2_0_1;\n }\n {\n string memory r_3_2_0_2 = unicode\"Moo é🚀M oM🚀MMéo🚀 o🚀é\";\n r_3_2_0[2] = r_3_2_0_2;\n }\n {\n string memory r_3_2_0_3 = unicode\"Moo é🚀 o🚀 éoo🚀ooMééo🚀MéoM🚀🚀🚀🚀 ooo🚀 ooMo🚀o éé🚀éo🚀 🚀 \";\n r_3_2_0[3] = r_3_2_0_3;\n }\n r_3_2.s_0 = r_3_2_0;\n }\n {\n string memory r_3_2_1 = unicode\"Moo é🚀éoo🚀oMoéé\";\n r_3_2.s_1 = r_3_2_1;\n }\n {\n address r_3_2_2 = 0x401dB8a431d9066dDF407BE513Ba2DD0A53526c3;\n r_3_2.s_2 = r_3_2_2;\n }\n {\n address r_3_2_3 = 0x07b13ae026A0a9A1d9039bd8aCDc9A7EB83e2cb8;\n r_3_2.s_3 = r_3_2_3;\n }\n {\n S_6acf71d8 memory r_3_2_4;\n {\n address[2] memory r_3_2_4_0;\n {\n address r_3_2_4_0_0 = 0x4068F4f99B4630D16226C7ACcF400c0d26BCfA1d;\n r_3_2_4_0[0] = r_3_2_4_0_0;\n }\n {\n address r_3_2_4_0_1 = 0x1913E411f8E3AD5d18dCC64c7C337174617BCF79;\n r_3_2_4_0[1] = r_3_2_4_0_1;\n }\n r_3_2_4.s_0 = r_3_2_4_0;\n }\n r_3_2.s_4 = r_3_2_4;\n }\n r_3[2] = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000e62debc583a0244862b2fd16d993ffdb0bce95b4000000000000000000000000a99f5c0b57ca15bd1abce702f38c69696c10fc27000000000000000000000000dafe6c73555cb714a9dacdcf5fceb9907ce0362400000000000000000000000065f4002d3065280c4ee77d6b7b96b650e8036c6f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a8020c3a9f09f9a806fc3a96ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a806f6f204d6f6f6fc3a9f09f9a80c3a92020f09f9a806f4d6f6ff09f9a806ff09f9a80c3a9206fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006028379d641c906e74f82004af18e274206263d3000000000000000000000000465de44ae1b4943eb8a37243a402a05a2f38a92f0000000000000000000000002d2984b6b6b34579d72dc75f879ce95b246e5b3800000000000000000000000081b77b2e40c3df01e033b7362f0466603cec836a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80f09f9a806f20f09f9a806fc3a94d6fc3a9c3a96f20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000f46415895acd4d5c129b8e030e01506a6e84c9a800000000000000000000000033ad16b10c7f9dd6061968cb2ed987c97d921bd7000000000000000000000000824a7164a0e1fcf345d031b7cd033591f3b16431000000000000000000000000508b0a49a0826c995176f953af8e78f5bdd87fe70000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f6f6fc3a96f6f6f6ff09f9a804d206fc3a96ff09f9a80c3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80f09f9a804d20c3a9c3a920c3a9f09f9a8020f09f9a80c3a94d20204dc3a96f6f6f6f6fc3a920c3a96fc3a9f09f9a80f09f9a80f09f9a8020c3a9f09f9a80c3a96f6f4df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a804d4d6fc3a9f09f9a806fc3a94d4d4d6f6f4d206f4d6f2020f09f9a804dc3a9c3a9204d6ff09f9a8020f09f9a804d2020c3a96fc3a96f4d6f6fc3a96f6f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a806f6fc3a9204df09f9a806f6f6ff09f9a806f204d6f6f6f6ff09f9a804d20c3a96f20202020206fc3a920204dc3a94d4d6f206f6f000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a804d6f6ff09f9a80204d4dc3a9f09f9a80f09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000003600000000000000000000000001b84514dfeb9a987b7bff11e5df24725d55d828700000000000000000000000041702e39f74b667c255e128856f8f6cd64d1a97d00000000000000000000000042e76c831bc4646644721503e29baef52ddc3fd80000000000000000000000008deea3cd686180c3040c18f0303a2d007804a5160000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000794d6f6f20c3a9f09f9a8020f09f9a804d20f09f9a8020c3a9204d4dc3a96f4d6fc3a9c3a9206fc3a920f09f9a80f09f9a80204d4dc3a9c3a9f09f9a80c3a9c3a96f6f4d4d6f6f20c3a920c3a9f09f9a80f09f9a80f09f9a806ff09f9a802020f09f9a80f09f9a804d6ff09f9a8020f09f9a80f09f9a804dc3a900000000000000000000000000000000000000000000000000000000000000000000000000006e4d6f6f20c3a9f09f9a80206f6f4df09f9a804d6f4d6ff09f9a80f09f9a8020c3a9c3a9204d4df09f9a80f09f9a80c3a92020f09f9a80f09f9a806ff09f9a806ff09f9a80c3a9c3a9f09f9a804d20f09f9a804d6fc3a9206f4df09f9a80f09f9a80c3a9c3a94dc3a9c3a9c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a806f6ff09f9a806f4d6f6f6fc3a96f4d20c3a94d6f6f206ff09f9a80206f4df09f9a806fc3a9f09f9a80f09f9a806fc3a96f4d6f204d6f6f4d4d206f20204d4df09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000009535f2b8edf91a774cb6bd67ffec790c4d3be621000000000000000000000000a9f1e0c1c3ee52b0d527b3e146b4f72d2cc23f77000000000000000000000000518564fe0810bbec78c2314c247510c35b0dc9da000000000000000000000000cb2dc21ed1241a5daa92fdd6972296a20363c702000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a96f4df09f9a806f6f0000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a804d6f20f09f9a806f6ff09f9a80c3a9c3a94d20c3a94d6f6ff09f9a8020f09f9a80f09f9a80c3a94dc3a9c3a9c3a96f206f204d000000000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000001b5ad49acedb3887c11a86af30fb46eeb2e4890f000000000000000000000000742fcf4b0430ed1ce02c3cb32076712bbcc94309000000000000000000000000e63c67c20097b06e5173bc1702b3ba8e0400450c00000000000000000000000029612b7fe5aaac235344698a529efd1f5b4023fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a806f20f09f9a804df09f9a80c3a96ff09f9a80f09f9a8020f09f9a804d4d6f6f6f6f20c3a9c3a9f09f9a806ff09f9a806f6f4dc3a9c3a94d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000002fdb690cfb9f28a5b716ba66f81fb956e8cdb0340000000000000000000000006d99fab91ba476a31695110f2e5da2f8555219d50000000000000000000000008f3fef2d0ffe6352a6237647b3d81e63f9ba940600000000000000000000000005a3c9bbdc7df3c32fa5c662af3d5aa1b5d08a310000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806f6f6ff09f9a806f206f206ff09f9a806f20c3a94df09f9a80c3a9c3a9206f6fc3a9c3a920f09f9a806f6f20c3a9f09f9a80206f20f09f9a80c3a9f09f9a806fc3a94d6ff09f9a80c3a9206f6f20000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a804d2020f09f9a806fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a806f6f6f20f09f9a804d6f6f206f4d4d6f6f4d4d6f6f4d4df09f9a80c3a96fc3a96f6f6ff09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000935ed275d8746877542ee2b1d164c52952b8b8d9000000000000000000000000b8a3c597355457624ae75db015efad777484a9ce00000000000000000000000026e7541f0e5185d4804549a27273580231c06ae2000000000000000000000000a837156d2a80a843bcedc26c0f8d8da4b4a726630000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a806f4d6f6f6ff09f9a806f4dc3a9f09f9a806ff09f9a804d4d4d206f6f4d6f206f2020f09f9a806f6f6f6f6f6f206f4d6f4df09f9a804df09f9a806fc3a96f6f6f6fc3a9206f6f6f6f6f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806f6f6f6f6f6f206f6f6fc3a96f4df09f9a80c3a9f09f9a806f206f6ff09f9a80f09f9a806fc3a9c3a920206f6ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000f39e45b79f0ef15b830f59378c1e2eeeee04f9cf0000000000000000000000001b0bff129a203e4ce00e1f2db29e67c5d3b28b9a000000000000000000000000e61e2dddfd646b44b89e2cdf5fd6c66bee0a441a000000000000000000000000110b806e6fe5dc2669bfb20bbec23dd5c52b37950000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a806f6f6f6f6f20f09f9a80f09f9a804d6ff09f9a804d6f2020f09f9a804d20c3a96fc3a9c3a96ff09f9a80f09f9a806f4dc3a94d20f09f9a806f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000002d0ced94de035f6b19f3d25d9ee9431b7a6edf540000000000000000000000003f52479f887b40cbaedf26dad1c3765995da22b000000000000000000000000077c9011d0856c66d7ccd5f0fc9837f78cb8b721f000000000000000000000000718bb8b4818538a098ee32829fe0b71258ff914e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a80204d6fc3a9206f6f6ff09f9a804d6ff09f9a8020f09f9a806ff09f9a806f6f4d6fc3a9c3a9f09f9a806ff09f9a804d206fc3a96f4df09f9a80f09f9a80f09f9a806f206ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000050720ae2b088edb8a48f88346c2c6c454bbc563100000000000000000000000027d8df4050ae871ab855be3cdfb04c6cb5aca049000000000000000000000000ea7601631a31e83fed017e8108d7bbea1df32399000000000000000000000000462f096feb2dc5a9485f05c9c0620b2bdbdfcc530000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a80f09f9a80f09f9a804d6ff09f9a80f09f9a806f4d6f4d206ff09f9a804d6f206f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a80f09f9a80f09f9a804df09f9a80c3a9f09f9a806f6ff09f9a804df09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a8020c3a96f4d4d6f4d20c3a96f206fc3a9c3a96f4d6f20c3a94d4d6f6f204d6fc3a96fc3a920204df09f9a806f6f4d206fc3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a806fc3a94df09f9a806ff09f9a8020f09f9a80204dc3a9c3a920206f6f6f6f6f4d6ff09f9a80206fc3a9c3a96ff09f9a80f09f9a806fc3a9c3a94d6fc3a96f2020c3a96fc3a9f09f9a806f4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806fc3a9f09f9a80c3a920c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000340000000000000000000000000401db8a431d9066ddf407be513ba2dd0a53526c300000000000000000000000007b13ae026a0a9a1d9039bd8acdc9a7eb83e2cb80000000000000000000000004068f4f99b4630d16226c7accf400c0d26bcfa1d0000000000000000000000001913e411f8e3ad5d18dcc64c7c337174617bcf79000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a804d4d4df09f9a806f6f6f6f6ff09f9a806ff09f9a80f09f9a806f6f4d6fc3a96f6f6f4d206f6fc3a920f09f9a80c3a96f6f206f206fc3a9c3a96f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a8020f09f9a806fc3a9206fc3a94d4d4d6ff09f9a804d4d204d4d204d4d6ff09f9a804d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a804d20206f4df09f9a804d4dc3a96ff09f9a80206ff09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a802020206ff09f9a80202020c3a96f6ff09f9a806f6f4dc3a9c3a96ff09f9a804dc3a96f4df09f9a80f09f9a80f09f9a80f09f9a8020206f6f6ff09f9a80206f6f4d6ff09f9a806f20c3a9c3a9f09f9a80c3a96ff09f9a8020f09f9a80202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a80c3a96f6ff09f9a806f4d6fc3a9c3a900000000000000" + }, + { + "name": "random-(uint152,bool[4],bool,bytes32[][3],bytes20)[1]", + "type": "(uint152,bool[4],bool,bytes32[][3],bytes20)[1]", + "value": [ + [ + "1093619153911926145854287132013361905377813783", + [true, true, true, false], + true, + [ + [ + "0xcfa74f599b54fb302aaa7bf77bfa2887b555e4350a884076d02495ccc4bdd550", + "0xfa11d4b54769add1733d2d7c6fcecc136486b8b8f27a35bfb883caf7ab17082d", + "0xe3503d98f956c3996cc989a8495f556eef5010a438d276a95b2b58d782b94495" + ], + [], + [ + "0x5e83efeff5dbe9f0b25cdc1e32f4110f0e15e1238b4f39c47660454b0154ef45", + "0x663b20bdc0f487333ed924771cb9b5796fcffa48f6a7109f6eb312809c63d4f9", + "0xe22d5359d98c55de6d4ae43bb733fd15a8d580803e95c4ecf6174f7cfcbc9abf", + "0xcf13029937220f507006877ffab6f11ca6d7fdd4da19721b99c74470e6ef8a25" + ] + ], + "0xa0736dd9205435e519a9ec46d396590eb559d989" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1093619153911926145854287132013361905377813783" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xcfa74f599b54fb302aaa7bf77bfa2887b555e4350a884076d02495ccc4bdd550" + }, + { + "type": "hexstring", + "value": "0xfa11d4b54769add1733d2d7c6fcecc136486b8b8f27a35bfb883caf7ab17082d" + }, + { + "type": "hexstring", + "value": "0xe3503d98f956c3996cc989a8495f556eef5010a438d276a95b2b58d782b94495" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5e83efeff5dbe9f0b25cdc1e32f4110f0e15e1238b4f39c47660454b0154ef45" + }, + { + "type": "hexstring", + "value": "0x663b20bdc0f487333ed924771cb9b5796fcffa48f6a7109f6eb312809c63d4f9" + }, + { + "type": "hexstring", + "value": "0xe22d5359d98c55de6d4ae43bb733fd15a8d580803e95c4ecf6174f7cfcbc9abf" + }, + { + "type": "hexstring", + "value": "0xcf13029937220f507006877ffab6f11ca6d7fdd4da19721b99c74470e6ef8a25" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xa0736dd9205435e519a9ec46d396590eb559d989" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610566806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610447565b60405180910390f35b610056610324565b61005e610324565b610066610351565b72310a21d7eb70f17e5d4cdcf4abfb3bea8125178152610084610395565b6001808252602080830182905260408084018390526000606085015290840192909252908201526100b36103b3565b6040805160038082526080820190925260009160208201606080368337505081519192507fcfa74f599b54fb302aaa7bf77bfa2887b555e4350a884076d02495ccc4bdd55091829150839060009061010d5761010d61051a565b60209081029190910101525080517ffa11d4b54769add1733d2d7c6fcecc136486b8b8f27a35bfb883caf7ab17082d908190839060019081106101525761015261051a565b60209081029190910101525080517fe3503d98f956c3996cc989a8495f556eef5010a438d276a95b2b58d782b94495908190839060029081106101975761019761051a565b6020908102919091018101919091529183525060408051600080825292810190915260208301525060408051600480825260a08201909252600091816020016020820280368337505081519192507f5e83efeff5dbe9f0b25cdc1e32f4110f0e15e1238b4f39c47660454b0154ef4591829150839060009061021b5761021b61051a565b60209081029190910101525080517f663b20bdc0f487333ed924771cb9b5796fcffa48f6a7109f6eb312809c63d4f9908190839060019081106102605761026061051a565b60209081029190910101525080517fe22d5359d98c55de6d4ae43bb733fd15a8d580803e95c4ecf6174f7cfcbc9abf908190839060029081106102a5576102a561051a565b60209081029190910101525080517fcf13029937220f507006877ffab6f11ca6d7fdd4da19721b99c74470e6ef8a25908190839060039081106102ea576102ea61051a565b6020908102919091010152506040820152606082015273a0736dd9205435e519a9ec46d396590eb559d98960601b60808201528152919050565b60405180602001604052806001905b61033b610351565b8152602001906001900390816103335790505090565b6040518060a0016040528060006001600160981b03168152602001610374610395565b8152600060208201526040016103886103b3565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003905b60608152602001906001900390816103c25790505090565b60008260608101836000805b600381101561043b578484038852825180518086526020918201918087019190855b8281101561042457845184529381019392810192600101610408565b509a8b019a919650509390930192506001016103e6565b50919695505050505050565b602080825260009060408382018185018685805b600180821061046a575061050c565b601f198a860301865283516101006001600160981b038251168752898201518a8801865b60048110156104ac57825115158252918c0191908c0190850161048e565b50505088820151151560a0880152606082015160c0880182905292506104d4818801846103da565b925050608081015190506104f960e08701826bffffffffffffffffffffffff19169052565b509487019493509186019160010161045b565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ad02844f9b26fe9eb5be3645da83b751c6cfb6abdb59e59f1217b7423f099cb364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a82b8aae {\n uint152 s_0;\n bool[4] s_1;\n bool s_2;\n bytes32[][3] s_3;\n bytes20 s_4;\n }\n\n function test () public pure returns (S_a82b8aae[1] memory) {\n S_a82b8aae[1] memory r;\n {\n S_a82b8aae memory r_0;\n {\n uint152 r_0_0 = 1093619153911926145854287132013361905377813783;\n r_0.s_0 = r_0_0;\n }\n {\n bool[4] memory r_0_1;\n {\n bool r_0_1_0 = true;\n r_0_1[0] = r_0_1_0;\n }\n {\n bool r_0_1_1 = true;\n r_0_1[1] = r_0_1_1;\n }\n {\n bool r_0_1_2 = true;\n r_0_1[2] = r_0_1_2;\n }\n {\n bool r_0_1_3 = false;\n r_0_1[3] = r_0_1_3;\n }\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0.s_2 = r_0_2;\n }\n {\n bytes32[][3] memory r_0_3;\n {\n bytes32[] memory r_0_3_0 = new bytes32[](3);\n {\n bytes32 r_0_3_0_0 = bytes32(0xcfa74f599b54fb302aaa7bf77bfa2887b555e4350a884076d02495ccc4bdd550);\n r_0_3_0[0] = r_0_3_0_0;\n }\n {\n bytes32 r_0_3_0_1 = bytes32(0xfa11d4b54769add1733d2d7c6fcecc136486b8b8f27a35bfb883caf7ab17082d);\n r_0_3_0[1] = r_0_3_0_1;\n }\n {\n bytes32 r_0_3_0_2 = bytes32(0xe3503d98f956c3996cc989a8495f556eef5010a438d276a95b2b58d782b94495);\n r_0_3_0[2] = r_0_3_0_2;\n }\n r_0_3[0] = r_0_3_0;\n }\n {\n bytes32[] memory r_0_3_1 = new bytes32[](0);\n r_0_3[1] = r_0_3_1;\n }\n {\n bytes32[] memory r_0_3_2 = new bytes32[](4);\n {\n bytes32 r_0_3_2_0 = bytes32(0x5e83efeff5dbe9f0b25cdc1e32f4110f0e15e1238b4f39c47660454b0154ef45);\n r_0_3_2[0] = r_0_3_2_0;\n }\n {\n bytes32 r_0_3_2_1 = bytes32(0x663b20bdc0f487333ed924771cb9b5796fcffa48f6a7109f6eb312809c63d4f9);\n r_0_3_2[1] = r_0_3_2_1;\n }\n {\n bytes32 r_0_3_2_2 = bytes32(0xe22d5359d98c55de6d4ae43bb733fd15a8d580803e95c4ecf6174f7cfcbc9abf);\n r_0_3_2[2] = r_0_3_2_2;\n }\n {\n bytes32 r_0_3_2_3 = bytes32(0xcf13029937220f507006877ffab6f11ca6d7fdd4da19721b99c74470e6ef8a25);\n r_0_3_2[3] = r_0_3_2_3;\n }\n r_0_3[2] = r_0_3_2;\n }\n r_0.s_3 = r_0_3;\n }\n {\n bytes20 r_0_4 = bytes20(0xA0736Dd9205435e519A9ec46D396590eB559D989);\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000310a21d7eb70f17e5d4cdcf4abfb3bea812517000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100a0736dd9205435e519a9ec46d396590eb559d989000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000003cfa74f599b54fb302aaa7bf77bfa2887b555e4350a884076d02495ccc4bdd550fa11d4b54769add1733d2d7c6fcecc136486b8b8f27a35bfb883caf7ab17082de3503d98f956c3996cc989a8495f556eef5010a438d276a95b2b58d782b94495000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045e83efeff5dbe9f0b25cdc1e32f4110f0e15e1238b4f39c47660454b0154ef45663b20bdc0f487333ed924771cb9b5796fcffa48f6a7109f6eb312809c63d4f9e22d5359d98c55de6d4ae43bb733fd15a8d580803e95c4ecf6174f7cfcbc9abfcf13029937220f507006877ffab6f11ca6d7fdd4da19721b99c74470e6ef8a25" + }, + { + "name": "random-(((((int56),int192,int32)[4],address[4],string)[3]),address)[3]", + "type": "(((((int56),int192,int32)[4],address[4],string)[3]),address)[3]", + "value": [ + [ + [ + [ + [ + [ + [ + ["7565822975552719"], + "763808304684542502743182157709469281986476775316847314703", + "1883526535" + ], + [ + ["8280795569131885"], + "-2665064345076665770326926671043864946622895657988282527307", + "-2042932697" + ], + [ + ["19352089222962830"], + "850615461475663698356080201323667724892949021745361826597", + "-1545249528" + ], + [ + ["12448077416526128"], + "-252607150705595700226146231900854080808595658563209139079", + "-1492674580" + ] + ], + [ + "0xB13A2c96dB0B93B955736a032f78BC412cdff52A", + "0x23b49e40372Be1d29ea88Db074527f8AFcc1b4fa", + "0xe3CD0cA3A4344fce4E2773103EE5D6D963c2D2d6", + "0xa1428dDbC8BD4F29b6f9882585d801f1cF884C53" + ], + "Moo é🚀oMM🚀🚀oéoM o🚀oéMoo Moo🚀" + ], + [ + [ + [ + ["-4468568507435821"], + "-1063239882420995536677203650191128740106442279556938630330", + "-500087289" + ], + [ + ["-34883194371107692"], + "-2803665010141791364163953170835773196016133814523576430245", + "846929197" + ], + [ + ["10147585125523121"], + "-2779873030155308681934832870419621999395479809057500296328", + "-463278235" + ], + [ + ["-22733041165857004"], + "-721633697823436758504882013696035510607681731679239504665", + "1970122849" + ] + ], + [ + "0x40849bc2AcCbfF11f2BcbD827C224f999a77B4E6", + "0x1E9eC57BDBfFBec27E75DD4A376B5Ab18a752184", + "0xc695c6fA9aAdBB699a426F53f9616280E29BaFED", + "0x54e0Ed0F941631bF7cB7C6B42a1FD3D88D83c654" + ], + "Moo é🚀Méo Mooé 🚀M é é🚀M🚀🚀éoo éMo🚀" + ], + [ + [ + [ + ["-3017345592797417"], + "1309381901980577314433186117547559999207784395044465716197", + "-878637779" + ], + [ + ["16314306657384783"], + "-2893895698359147333866280511750672968936865158819263987106", + "825621486" + ], + [ + ["-5789266336627722"], + "-2679104681157297884460582032883900289772146566387992778241", + "-1385283026" + ], + [ + ["8677736844171223"], + "-1204134636963125630076575729438158955138439547368426494302", + "-9255642" + ] + ], + [ + "0x93FCcB581eCf7c2Af093de25A74b78007bEAC25e", + "0xa462f7b3d8C02bB7454D33275aAA14BB64D341B2", + "0x3B42c465bbCcb784A1dc63c1cc0fCc36b9244202", + "0x5690753C2b4557388BC5de653Aca38c117cEde22" + ], + "Moo é🚀🚀🚀🚀o oM éoMo🚀o" + ] + ] + ], + "0xB3cC0929CE011AeEFD5e7481d2aFFe926C4B41D8" + ], + [ + [ + [ + [ + [ + [ + ["23281314006002050"], + "-1078944298310412639080150777540911711151375967182380349499", + "-769700546" + ], + [ + ["-22873401954895450"], + "1413850709218422494740038325216188258674967605031666790007", + "-1146070675" + ], + [ + ["-32821962766197214"], + "-80190196916209351729112901151440529724710765512577322423", + "1545730715" + ], + [ + ["-22810689955484040"], + "850918814148863368705439716078229528524342835350179656225", + "98926954" + ] + ], + [ + "0x122590A3351629e39d472453c302D553a6bb5AbE", + "0x30ecbe5C93BbFDdbaf0F295da08311D483Dcb510", + "0x0b350fcdC8FDe2db4D5624A50d305027CA3729dc", + "0x8aA066D11Bc9B752143C797e225c641622a5DD91" + ], + "Moo é🚀oo🚀ooMMoo🚀M éMo🚀🚀o" + ], + [ + [ + [ + ["-32042862929788282"], + "2603899819898477210657560142622102185118010245535397350333", + "-1995661980" + ], + [ + ["-10056556792085241"], + "-2492291202495877727687805730532535552432619415155093360040", + "1208568177" + ], + [ + ["-19399278290947438"], + "1063135826917562614376931844938258621170403285787272215248", + "855890345" + ], + [ + ["-19463370243233104"], + "1030799798091876611016639600343341243648831311172911166875", + "465874764" + ] + ], + [ + "0x8d7FE0ac167bE6ecdcA434Cbd2644Fd7EA0E7a87", + "0xeBE7c70E9307351C7069D57365d5eB90B355f4D3", + "0x1266B35909d0e3639AAC2657b98Cc56C8881De35", + "0xC34E6833B223ebe20674a848603cb59407AA5431" + ], + "Moo é🚀🚀MéMoéé🚀 éoéooé🚀🚀 éM🚀M🚀ooéM M" + ], + [ + [ + [ + ["-11753802284653141"], + "-199763565511122050349974315878941624335627271595391776545", + "597954525" + ], + [ + ["22602833334264112"], + "2828316515682751905828670341251447074361823374232374159551", + "1640403838" + ], + [ + ["-13942300933792374"], + "2839930250798414661531499206888100308389799626153707389633", + "996445074" + ], + [ + ["32547961484778419"], + "1629999289311468287529557947852515268838601340840037611061", + "919153637" + ] + ], + [ + "0x42Cd74066F3b72b338E8e4E3766D68f48C47DC33", + "0x016D450BF5243681f0927bABDe6B90b080E0646D", + "0xE20d1773FCCa7234872F818eC4598d102D1F4C02", + "0xa38ca6CBd94e5361d242fc7ffA95Cb7b81B9Ec1C" + ], + "Moo é🚀o🚀é M 🚀o🚀o🚀 éoMo 🚀🚀oo🚀🚀oooooo🚀🚀" + ] + ] + ], + "0x0C97B35bb0B2b696d9652e6DBb1b9D35A89d2c71" + ], + [ + [ + [ + [ + [ + [ + ["-21591543933069159"], + "2252824927820877503145152899891141242204973190486289706538", + "-1455958590" + ], + [ + ["34603657943548194"], + "-1511089918744345713837258884959740637875986695554303103089", + "1564688144" + ], + [ + ["-19594904696482284"], + "2349786227666435407315732870680591711519093690361464538392", + "-684545224" + ], + [ + ["4959687490109630"], + "199356796803910550091059421704216859561049087143703225408", + "-73746415" + ] + ], + [ + "0xBd553Bf894d988f6d5Df075540eEC34D21B4e95A", + "0xCAa2D5f42854dA84f7BCf393d171fD5703ecE403", + "0x11773114d9f49bdc6C9909200304175a32749eEb", + "0x9846E60C0911D711c976dDe22165c6a51909F0d3" + ], + "Moo é🚀o oéM🚀o🚀oM🚀🚀 🚀MMo🚀éMo🚀oé éo o " + ], + [ + [ + [ + ["5908220507039595"], + "-508585400579408089109053672852126487494521641570469894593", + "1227762368" + ], + [ + ["6004956187265209"], + "73775672659601078168916585951707376031920718672347027433", + "1473789968" + ], + [ + ["16016490746387454"], + "2132373353892504150694462614830992417579078860518779567875", + "-1128997231" + ], + [ + ["-35739625347395923"], + "1159849174197563990556592321955819442812601903770361434551", + "-1189140657" + ] + ], + [ + "0xdF320C85B875f3D5F9226eF71d738342706720c6", + "0xEb94f430a0345E22C83B513ABefc17F42d9195D7", + "0x9f24Ab538fd2A937B84bb160319710Ce0FC3316F", + "0xFC5592b162388BcC0a4488A3000d173b56dA1AC2" + ], + "Moo é🚀é🚀o é MooooMMoo🚀🚀 MM" + ], + [ + [ + [ + ["-6565989801617046"], + "1534604465317063736108220184621113982013914343520136754289", + "-1366928012" + ], + [ + ["29465648336070225"], + "1482113964397174789241619419160118886863804230347317648606", + "1627878877" + ], + [ + ["27179369318718028"], + "635946567756576973439750041740985017279531138213852644524", + "-2099439419" + ], + [ + ["25553371565296073"], + "-1555305043261312817301316874614419357925233059329136266856", + "-1572159740" + ] + ], + [ + "0xe1e6d064a788276c0Ac027F562d11a47620A0CAE", + "0x88C04d6Be1e7FbF518849f339901e8e6895bfb52", + "0xFcDD91852C53002eb9626025Fcc574385df32d5C", + "0x68e935c26d60cDaa61585F0f27d1342b577A77B3" + ], + "Moo é🚀 🚀oMoooéo🚀o MM🚀oooooo 🚀o oo" + ] + ] + ], + "0xA6Ae09F3752170c0Bf3cB021E93e4E83Ac7534d4" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "7565822975552719" + } + ] + }, + { + "type": "number", + "value": "763808304684542502743182157709469281986476775316847314703" + }, + { + "type": "number", + "value": "1883526535" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "8280795569131885" + } + ] + }, + { + "type": "number", + "value": "-2665064345076665770326926671043864946622895657988282527307" + }, + { + "type": "number", + "value": "-2042932697" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "19352089222962830" + } + ] + }, + { + "type": "number", + "value": "850615461475663698356080201323667724892949021745361826597" + }, + { + "type": "number", + "value": "-1545249528" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "12448077416526128" + } + ] + }, + { + "type": "number", + "value": "-252607150705595700226146231900854080808595658563209139079" + }, + { + "type": "number", + "value": "-1492674580" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB13A2c96dB0B93B955736a032f78BC412cdff52A" + }, + { + "type": "address", + "value": "0x23b49e40372Be1d29ea88Db074527f8AFcc1b4fa" + }, + { + "type": "address", + "value": "0xe3CD0cA3A4344fce4E2773103EE5D6D963c2D2d6" + }, + { + "type": "address", + "value": "0xa1428dDbC8BD4F29b6f9882585d801f1cF884C53" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMM🚀🚀oéoM o🚀oéMoo Moo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-4468568507435821" + } + ] + }, + { + "type": "number", + "value": "-1063239882420995536677203650191128740106442279556938630330" + }, + { + "type": "number", + "value": "-500087289" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-34883194371107692" + } + ] + }, + { + "type": "number", + "value": "-2803665010141791364163953170835773196016133814523576430245" + }, + { + "type": "number", + "value": "846929197" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "10147585125523121" + } + ] + }, + { + "type": "number", + "value": "-2779873030155308681934832870419621999395479809057500296328" + }, + { + "type": "number", + "value": "-463278235" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-22733041165857004" + } + ] + }, + { + "type": "number", + "value": "-721633697823436758504882013696035510607681731679239504665" + }, + { + "type": "number", + "value": "1970122849" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x40849bc2AcCbfF11f2BcbD827C224f999a77B4E6" + }, + { + "type": "address", + "value": "0x1E9eC57BDBfFBec27E75DD4A376B5Ab18a752184" + }, + { + "type": "address", + "value": "0xc695c6fA9aAdBB699a426F53f9616280E29BaFED" + }, + { + "type": "address", + "value": "0x54e0Ed0F941631bF7cB7C6B42a1FD3D88D83c654" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Méo Mooé 🚀M é é🚀M🚀🚀éoo éMo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-3017345592797417" + } + ] + }, + { + "type": "number", + "value": "1309381901980577314433186117547559999207784395044465716197" + }, + { + "type": "number", + "value": "-878637779" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "16314306657384783" + } + ] + }, + { + "type": "number", + "value": "-2893895698359147333866280511750672968936865158819263987106" + }, + { + "type": "number", + "value": "825621486" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-5789266336627722" + } + ] + }, + { + "type": "number", + "value": "-2679104681157297884460582032883900289772146566387992778241" + }, + { + "type": "number", + "value": "-1385283026" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "8677736844171223" + } + ] + }, + { + "type": "number", + "value": "-1204134636963125630076575729438158955138439547368426494302" + }, + { + "type": "number", + "value": "-9255642" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x93FCcB581eCf7c2Af093de25A74b78007bEAC25e" + }, + { + "type": "address", + "value": "0xa462f7b3d8C02bB7454D33275aAA14BB64D341B2" + }, + { + "type": "address", + "value": "0x3B42c465bbCcb784A1dc63c1cc0fCc36b9244202" + }, + { + "type": "address", + "value": "0x5690753C2b4557388BC5de653Aca38c117cEde22" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀o oM éoMo🚀o" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xB3cC0929CE011AeEFD5e7481d2aFFe926C4B41D8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "23281314006002050" + } + ] + }, + { + "type": "number", + "value": "-1078944298310412639080150777540911711151375967182380349499" + }, + { + "type": "number", + "value": "-769700546" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-22873401954895450" + } + ] + }, + { + "type": "number", + "value": "1413850709218422494740038325216188258674967605031666790007" + }, + { + "type": "number", + "value": "-1146070675" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-32821962766197214" + } + ] + }, + { + "type": "number", + "value": "-80190196916209351729112901151440529724710765512577322423" + }, + { + "type": "number", + "value": "1545730715" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-22810689955484040" + } + ] + }, + { + "type": "number", + "value": "850918814148863368705439716078229528524342835350179656225" + }, + { + "type": "number", + "value": "98926954" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x122590A3351629e39d472453c302D553a6bb5AbE" + }, + { + "type": "address", + "value": "0x30ecbe5C93BbFDdbaf0F295da08311D483Dcb510" + }, + { + "type": "address", + "value": "0x0b350fcdC8FDe2db4D5624A50d305027CA3729dc" + }, + { + "type": "address", + "value": "0x8aA066D11Bc9B752143C797e225c641622a5DD91" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo🚀ooMMoo🚀M éMo🚀🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-32042862929788282" + } + ] + }, + { + "type": "number", + "value": "2603899819898477210657560142622102185118010245535397350333" + }, + { + "type": "number", + "value": "-1995661980" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-10056556792085241" + } + ] + }, + { + "type": "number", + "value": "-2492291202495877727687805730532535552432619415155093360040" + }, + { + "type": "number", + "value": "1208568177" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-19399278290947438" + } + ] + }, + { + "type": "number", + "value": "1063135826917562614376931844938258621170403285787272215248" + }, + { + "type": "number", + "value": "855890345" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-19463370243233104" + } + ] + }, + { + "type": "number", + "value": "1030799798091876611016639600343341243648831311172911166875" + }, + { + "type": "number", + "value": "465874764" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8d7FE0ac167bE6ecdcA434Cbd2644Fd7EA0E7a87" + }, + { + "type": "address", + "value": "0xeBE7c70E9307351C7069D57365d5eB90B355f4D3" + }, + { + "type": "address", + "value": "0x1266B35909d0e3639AAC2657b98Cc56C8881De35" + }, + { + "type": "address", + "value": "0xC34E6833B223ebe20674a848603cb59407AA5431" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀MéMoéé🚀 éoéooé🚀🚀 éM🚀M🚀ooéM M" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-11753802284653141" + } + ] + }, + { + "type": "number", + "value": "-199763565511122050349974315878941624335627271595391776545" + }, + { + "type": "number", + "value": "597954525" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "22602833334264112" + } + ] + }, + { + "type": "number", + "value": "2828316515682751905828670341251447074361823374232374159551" + }, + { + "type": "number", + "value": "1640403838" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-13942300933792374" + } + ] + }, + { + "type": "number", + "value": "2839930250798414661531499206888100308389799626153707389633" + }, + { + "type": "number", + "value": "996445074" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "32547961484778419" + } + ] + }, + { + "type": "number", + "value": "1629999289311468287529557947852515268838601340840037611061" + }, + { + "type": "number", + "value": "919153637" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x42Cd74066F3b72b338E8e4E3766D68f48C47DC33" + }, + { + "type": "address", + "value": "0x016D450BF5243681f0927bABDe6B90b080E0646D" + }, + { + "type": "address", + "value": "0xE20d1773FCCa7234872F818eC4598d102D1F4C02" + }, + { + "type": "address", + "value": "0xa38ca6CBd94e5361d242fc7ffA95Cb7b81B9Ec1C" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀é M 🚀o🚀o🚀 éoMo 🚀🚀oo🚀🚀oooooo🚀🚀" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x0C97B35bb0B2b696d9652e6DBb1b9D35A89d2c71" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-21591543933069159" + } + ] + }, + { + "type": "number", + "value": "2252824927820877503145152899891141242204973190486289706538" + }, + { + "type": "number", + "value": "-1455958590" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "34603657943548194" + } + ] + }, + { + "type": "number", + "value": "-1511089918744345713837258884959740637875986695554303103089" + }, + { + "type": "number", + "value": "1564688144" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-19594904696482284" + } + ] + }, + { + "type": "number", + "value": "2349786227666435407315732870680591711519093690361464538392" + }, + { + "type": "number", + "value": "-684545224" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4959687490109630" + } + ] + }, + { + "type": "number", + "value": "199356796803910550091059421704216859561049087143703225408" + }, + { + "type": "number", + "value": "-73746415" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xBd553Bf894d988f6d5Df075540eEC34D21B4e95A" + }, + { + "type": "address", + "value": "0xCAa2D5f42854dA84f7BCf393d171fD5703ecE403" + }, + { + "type": "address", + "value": "0x11773114d9f49bdc6C9909200304175a32749eEb" + }, + { + "type": "address", + "value": "0x9846E60C0911D711c976dDe22165c6a51909F0d3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o oéM🚀o🚀oM🚀🚀 🚀MMo🚀éMo🚀oé éo o " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5908220507039595" + } + ] + }, + { + "type": "number", + "value": "-508585400579408089109053672852126487494521641570469894593" + }, + { + "type": "number", + "value": "1227762368" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "6004956187265209" + } + ] + }, + { + "type": "number", + "value": "73775672659601078168916585951707376031920718672347027433" + }, + { + "type": "number", + "value": "1473789968" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "16016490746387454" + } + ] + }, + { + "type": "number", + "value": "2132373353892504150694462614830992417579078860518779567875" + }, + { + "type": "number", + "value": "-1128997231" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-35739625347395923" + } + ] + }, + { + "type": "number", + "value": "1159849174197563990556592321955819442812601903770361434551" + }, + { + "type": "number", + "value": "-1189140657" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xdF320C85B875f3D5F9226eF71d738342706720c6" + }, + { + "type": "address", + "value": "0xEb94f430a0345E22C83B513ABefc17F42d9195D7" + }, + { + "type": "address", + "value": "0x9f24Ab538fd2A937B84bb160319710Ce0FC3316F" + }, + { + "type": "address", + "value": "0xFC5592b162388BcC0a4488A3000d173b56dA1AC2" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é🚀o é MooooMMoo🚀🚀 MM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-6565989801617046" + } + ] + }, + { + "type": "number", + "value": "1534604465317063736108220184621113982013914343520136754289" + }, + { + "type": "number", + "value": "-1366928012" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "29465648336070225" + } + ] + }, + { + "type": "number", + "value": "1482113964397174789241619419160118886863804230347317648606" + }, + { + "type": "number", + "value": "1627878877" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "27179369318718028" + } + ] + }, + { + "type": "number", + "value": "635946567756576973439750041740985017279531138213852644524" + }, + { + "type": "number", + "value": "-2099439419" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "25553371565296073" + } + ] + }, + { + "type": "number", + "value": "-1555305043261312817301316874614419357925233059329136266856" + }, + { + "type": "number", + "value": "-1572159740" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe1e6d064a788276c0Ac027F562d11a47620A0CAE" + }, + { + "type": "address", + "value": "0x88C04d6Be1e7FbF518849f339901e8e6895bfb52" + }, + { + "type": "address", + "value": "0xFcDD91852C53002eb9626025Fcc574385df32d5C" + }, + { + "type": "address", + "value": "0x68e935c26d60cDaa61585F0f27d1342b577A77B3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀oMoooéo🚀o MM🚀oooooo 🚀o oo" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xA6Ae09F3752170c0Bf3cB021E93e4E83Ac7534d4" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506116df806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906113b3565b60405180910390f35b610056611204565b61005e611204565b610066611231565b61006e611251565b610076611269565b61007e611296565b6100866112c3565b61008e6112f0565b6040805160208082018352661ae1136ee42ccf8252908352771f2687e1cd1fb97755fb9431472cd495e130feffb823c70f9083015263704455879082015281526100d66112f0565b6040805160208082018352661d6b56f65b116d8252908352776cb091ee805831f9de28dbc0e006d3b6d6c6a4a7600a2e4a19838201526379c4add819918301919091528201526101246112f0565b60408051602080820183526644c09f63cbde8e82529083527722b0d6fcbf19615fef79240f9e53507f7f8d0b1c2059b32590830152635c1aa2f7198282015282015261016e6112f0565b6040805160208082018352662c3975e08c71308252908352770a4d577a5927011c9f4e64a3501878454b06b8370720138619908301526358f868131990820152606082015281526101bd611316565b73b13a2c96db0b93b955736a032f78bc412cdff52a81527323b49e40372be1d29ea88db074527f8afcc1b4fa60208083019190915273e3cd0ca3a4344fce4e2773103ee5d6d963c2d2d660408084019190915273a1428ddbc8bd4f29b6f9882585d801f1cf884c53606080850191909152848301939093528051928301905260318083526000929161156590830139604083015250815261025c611296565b6102646112c3565b61026c6112f0565b6040805160208082018352660fe023ae8a4b2c198252908352772b5cbe093dae1564120cddd285e038cb7379188ad8a684b91990830152631dceb9f8199082015281526102b76112f0565b6040805160208082018352667bee14991eeb6b198252908352777257a0e5e51d47008e2df4e35ab2f3c4c4c5b57aed4faea4198382015263327b1d2d918301919091528201526103056112f0565b604080516020808201835266240d2cc6bc1eb1825290835277715f3a8895d384bb64005f9af08002614835afbb7efdf4871990830152631b9d109a19828201528201526103506112f0565b60408051602080820183526650c3949b5af0eb198252908352771d6e3514c6a0ac2ba2c0ba89b8817a8d5a86c172190f8318199083015263756db061908201526060820152815261039f611316565b7340849bc2accbff11f2bcbd827c224f999a77b4e68152731e9ec57bdbffbec27e75dd4a376b5ab18a75218460208083019190915273c695c6fa9aadbb699a426f53f9616280e29bafed6040808401919091527354e0ed0f941631bf7cb7c6b42a1fd3d88d83c6546060808501919091528483019390935280519283019052603b808352600092916115d7908301396040830152506020820152610441611296565b6104496112c3565b6104516112f0565b6040805160208082018352660ab842843928e819825290835277356695bd5982eaa4088c6d9d62e558f54bc47af8b830abe59083015263345ef2d21990820152815261049b6112f0565b60408051602080820183526639f5c68511f94f8252908352777605ae4c195bc021c1a46fff7359b8c2b1aabec6a326bda11983820152633135fbee918301919091528201526104e86112f0565b60408051602080820183526614914e9b813c09198252908352776d43287249e4ce76c435ba04527cff49d18179c1cc8256001990830152635291bdd119828201528201526105346112f0565b6040805160208082018352661ed45b0e0d17d7825290835277311bc0905a17f843f4c50c1a79d4b60532a07e22fdccd95d1990830152628d3ad9199082015260608201528152610582611316565b7393fccb581ecf7c2af093de25a74b78007beac25e815273a462f7b3d8c02bb7454d33275aaa14bb64d341b2602080830191909152733b42c465bbccb784a1dc63c1cc0fcc36b9244202604080840191909152735690753c2b4557388bc5de653aca38c117cede22606080850191909152848301939093528051928301905260258083526000929161161290830139604083810191909152830191909152508152815273b3cc0929ce011aeefd5e7481d2affe926c4b41d860208201528152610649611231565b610651611251565b610659611269565b610661611296565b6106696112c3565b6106716112f0565b60408051602080820183526652b63b533b69828252908352772c00b43ea34cc0f241505158757cff82d9a79d1faa58383a1990830152632de0b2c1199082015281526106bb6112f0565b60408051602080820183526651433ce65386591982529083527739a94a47eb8a869501d5c17cf74d2f3246a3d314a1e92e778382015263444fa69219918301919091528201526107096112f0565b604080516020808201835266749b66b782a1dd19825290835277034539874612d7d3e6b63075bed20714abb42bab07350db61990830152635c21fa9b828201528201526107546112f0565b604080516020808201835266510a339fe0d1871982529083527722b401c7117cb17603738332f9f6b03bc866ca45bf97b221908301526305e5816a90820152606082015281526107a2611316565b73122590a3351629e39d472453c302d553a6bb5abe81527330ecbe5c93bbfddbaf0f295da08311d483dcb510602080830191909152730b350fcdc8fde2db4d5624a50d305027ca3729dc604080840191909152738aa066d11bc9b752143c797e225c641622a5dd916060808501919091528483019390935280519283019052602980835260009291611681908301396040830152508152610841611296565b6108496112c3565b6108516112f0565b60408051602080820183526671d6d066843d79198252908352776a31fb8c17ecec73973884144394208bbf59ca98f99c8bbd908301526376f3629b1990820152815261089b6112f0565b60408051602080820183526623ba6297417af81982529083527765a4bbf92a7734770d2e524c7382322debb609a9d8954da719838201526348094971918301919091528201526108e96112f0565b60408051602080820183526644eb8a736e4d6d198252908352772b5ba7eb9388cce4cc91482a48cf177c286a3962f1dafad090830152633303d9a9828201528201526109336112f0565b6040805160208082018352664525d5057ad54f198252908352772a0a0d52d18f4d63d64e6a4c931761dd31feec4bcb2ef59b90830152631bc4af4c9082015260608201528152610981611316565b738d7fe0ac167be6ecdca434cbd2644fd7ea0e7a87815273ebe7c70e9307351c7069d57365d5eb90b355f4d3602080830191909152731266b35909d0e3639aac2657b98cc56c8881de3560408084019190915273c34e6833b223ebe20674a848603cb59407aa5431606084015283820192909252815160808101909252604180835260009291611596908301396040830152506020820152610a21611296565b610a296112c3565b610a316112f0565b60408051602080820183526629c20559efda54198252908352770825a1021d59215808e56dfb2a54a39777a7270d3be0f72019908301526323a40fdd908201528152610a7b6112f0565b604080516020808201835266504d283bce61308252908352777359009274583e9cf3ca997969cadb8dee582f20bb2328bf838201526361c6937e91830191909152820152610ac76112f0565b604080516020808201835266318872e682a2751982529083527773d2415a7c2d2770cdc2121801fbd019080f0e92644b42c190830152633b648b9282820152820152610b116112f0565b60408051602080820183526673a232d2769bb38252908352774279fc93f45684e77c1a2a338601ddd9007e74259b387635908301526336c92be59082015260608201528152610b5e611316565b7342cd74066f3b72b338e8e4e3766d68f48c47dc33815273016d450bf5243681f0927babde6b90b080e0646d60208083019190915273e20d1773fcca7234872f818ec4598d102d1f4c0260408084019190915273a38ca6cbd94e5361d242fc7ffa95cb7b81b9ec1c606084015283820192909252815160808101909252604a80835260009291611637908301396040838101919091528301919091525081528152730c97b35bb0b2b696d9652e6dbb1b9d35a89d2c71602082810191909152820152610c28611231565b610c30611251565b610c38611269565b610c40611296565b610c486112c3565b610c506112f0565b6040805160208082018352664cb56512486766198252908352775be096f71082000df1395bbfd90bdfe274a7b3c90e066e2a908301526356c82a3d19908201528152610c9a6112f0565b6040805160208082018352667aefd7f3a781228252908352773da083cf0025419ba890b6ab9c817ed81f539da0929d90701983820152635d433f1091830191909152820152610ce76112f0565b604080516020808201835266459d7645d769eb198252908352775fd4e9b4a01296e65de0b60a0e237b5caf3060e54314c518908301526328cd54c71982820152820152610d326112f0565b604080516020808201835266119ecf3b0b80be825290835277082161cfabc11a3ef1e348579d9c4ef1aecb625a307c24409083015263046547ee199082015260608201528152610d80611316565b73bd553bf894d988f6d5df075540eec34d21b4e95a815273caa2d5f42854da84f7bcf393d171fd5703ece4036020808301919091527311773114d9f49bdc6c9909200304175a32749eeb604080840191909152739846e60c0911d711c976dde22165c6a51909f0d36060840152838201929092528151608081019092526042808352600092916114c3908301396040830152508152610e1d611296565b610e256112c3565b610e2d6112f0565b60408051602080820183526614fd7ec893a76b82529083527714bde11c593e499bcf2d028f839696e555ec74497f4759c0199083015263492e2ac0908201528152610e766112f0565b604080516020808201835266155579d06f08b982529083527703024103ac4dbd82a754091961a8b8c36b510b3b166c57e9838201526357d8401091830191909152820152610ec26112f0565b60408051602080820183526638e6e9d97c9bfe82529083527756f7043fc01739614f6b740c8dcfcdeb094181662274bf039083015263434b216e1982820152820152610f0c6112f0565b6040805160208082018352667ef8fff93cb152198252908352772f4d63f11b6e846a5545f6968257b9b228ca4ccd61cc91b7908301526346e0d8b0199082015260608201528152610f5b611316565b73df320c85b875f3d5f9226ef71d738342706720c6815273eb94f430a0345e22c83b513abefc17f42d9195d7602080830191909152739f24ab538fd2a937b84bb160319710ce0fc3316f60408084019190915273fc5592b162388bcc0a4488a3000d173b56da1ac26060808501919091528483019390935280519283019052602a80835260009291611505908301396040830152506020820152610ffd611296565b6110056112c3565b61100d6112f0565b6040805160208082018352661753bba1b96695198252908352773e9604a8aa59de86b88e2312da880e48a5af0f12a342747190830152635179aa8b199082015281526110576112f0565b60408051602080820183526668aed9de25e6518252908352773c71fde67f04159590801e7e1c0640862f37176d27511cde8382015263610775dd918301919091528201526110a36112f0565b604080516020808201835266608f7e0d761a4c82529083527719ef978b36bdbecb0d06aa25ca33073966a2ac72c2ee84ac90830152637d22e73a19828201528201526110ed6112f0565b6040805160208082018352665ac8a7f2f689c98252908352773f6e246edcd7110a2fe4a89dc4de7dfcb81e2bb659360e671990830152635db540fb19908201526060820152815261113c611316565b73e1e6d064a788276c0ac027f562d11a47620a0cae81527388c04d6be1e7fbf518849f339901e8e6895bfb5260208083019190915273fcdd91852c53002eb9626025fcc574385df32d5c6040808401919091527368e935c26d60cdaa61585f0f27d1342b577a77b3606080850191909152848301939093528051928301905260368083526000929161152f90830139604083810191909152838101929092525090825290825273a6ae09f3752170c0bf3cb021e93e4e83ac7534d46020830152820152919050565b60405180606001604052806003905b61121b611231565b8152602001906001900390816112135790505090565b6040518060400160405280611244611251565b8152600060209091015290565b6040518060200160405280611264611269565b905290565b60405180606001604052806003905b611280611296565b8152602001906001900390816112785790505090565b60405180606001604052806112a96112c3565b81526020016112b6611316565b8152602001606081525090565b60405180608001604052806004905b6112da6112f0565b8152602001906001900390816112d25790505090565b604080516080810182526000606082018181528252602082018190529181019190915290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156113605781516001600160a01b0316845260209384019390910190600101611338565b50505050565b6000815180845260005b8181101561138c57602081850181015186830182015201611370565b8181111561139e576000602083870101525b50601f01601f19169290920160200192915050565b60208082526000906080830183820185845b60038110156114b657868403601f19018352815180516040808752905190860187905260c086016060870160005b600381101561148e57888303605f19018252835180518460005b600481101561144a57825180515160060b83528e81015160170b8f84015260409081015160030b90830152918d019160609091019060010161140d565b5050508a81015161145f610180860182611334565b5060400151610220610200850181905261147b90850182611366565b948b0194935050908901906001016113f3565b5050918701516001600160a01b031695870195909552935091840191908401906001016113c5565b5091969550505050505056fe4d6f6f20c3a9f09f9a806f20206fc3a94df09f9a806ff09f9a806f4df09f9a80f09f9a8020f09f9a804d4d6ff09f9a80c3a94d6ff09f9a806fc3a920c3a96f206f204d6f6f20c3a9f09f9a80c3a9f09f9a806f20c3a920204d6f6f6f6f4d4d6f6ff09f9a80f09f9a80204d4d4d6f6f20c3a9f09f9a802020f09f9a806f4d6f6f6fc3a96ff09f9a806f204d4df09f9a806f6f6f6f6f6f20f09f9a806f202020206f6f4d6f6f20c3a9f09f9a806f4d4df09f9a80f09f9a806fc3a96f4d20206ff09f9a806fc3a94d6f6f2020204d6f6ff09f9a804d6f6f20c3a9f09f9a80f09f9a804dc3a94d6fc3a9c3a9f09f9a8020c3a96fc3a96f6fc3a9f09f9a80f09f9a8020c3a94df09f9a804df09f9a806f6fc3a94d204d4d6f6f20c3a9f09f9a804dc3a96f204d6f6fc3a92020f09f9a804d20c3a920c3a9f09f9a804df09f9a80f09f9a80c3a96f6f20c3a94d6ff09f9a804d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f206f4d20c3a96f4d6ff09f9a806f4d6f6f20c3a9f09f9a806ff09f9a80c3a9204d20f09f9a806ff09f9a806ff09f9a802020c3a96f4d6f20f09f9a80f09f9a806f6ff09f9a80f09f9a806f6f6f6f6f6ff09f9a80f09f9a804d6f6f20c3a9f09f9a806f6ff09f9a806f6f4d4d6f6ff09f9a804d20c3a94d6ff09f9a80f09f9a806fa2646970667358221220eca76113442f5097d5c320e91ad763c5e168d4a3a1d3804eff1d92929207b7e964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_14df74d1 {\n int56 s_0;\n }\n\n struct S_e72c145f {\n S_14df74d1 s_0;\n int192 s_1;\n int32 s_2;\n }\n\n struct S_6ae83230 {\n S_e72c145f[4] s_0;\n address[4] s_1;\n string s_2;\n }\n\n struct S_cc61e3dd {\n S_6ae83230[3] s_0;\n }\n\n struct S_d3eb2c12 {\n S_cc61e3dd s_0;\n address s_1;\n }\n\n function test () public pure returns (S_d3eb2c12[3] memory) {\n S_d3eb2c12[3] memory r;\n {\n S_d3eb2c12 memory r_0;\n {\n S_cc61e3dd memory r_0_0;\n {\n S_6ae83230[3] memory r_0_0_0;\n {\n S_6ae83230 memory r_0_0_0_0;\n {\n S_e72c145f[4] memory r_0_0_0_0_0;\n {\n S_e72c145f memory r_0_0_0_0_0_0;\n {\n S_14df74d1 memory r_0_0_0_0_0_0_0;\n {\n int56 r_0_0_0_0_0_0_0_0 = 7565822975552719;\n r_0_0_0_0_0_0_0.s_0 = r_0_0_0_0_0_0_0_0;\n }\n r_0_0_0_0_0_0.s_0 = r_0_0_0_0_0_0_0;\n }\n {\n int192 r_0_0_0_0_0_0_1 = 763808304684542502743182157709469281986476775316847314703;\n r_0_0_0_0_0_0.s_1 = r_0_0_0_0_0_0_1;\n }\n {\n int32 r_0_0_0_0_0_0_2 = 1883526535;\n r_0_0_0_0_0_0.s_2 = r_0_0_0_0_0_0_2;\n }\n r_0_0_0_0_0[0] = r_0_0_0_0_0_0;\n }\n {\n S_e72c145f memory r_0_0_0_0_0_1;\n {\n S_14df74d1 memory r_0_0_0_0_0_1_0;\n {\n int56 r_0_0_0_0_0_1_0_0 = 8280795569131885;\n r_0_0_0_0_0_1_0.s_0 = r_0_0_0_0_0_1_0_0;\n }\n r_0_0_0_0_0_1.s_0 = r_0_0_0_0_0_1_0;\n }\n {\n int192 r_0_0_0_0_0_1_1 = -2665064345076665770326926671043864946622895657988282527307;\n r_0_0_0_0_0_1.s_1 = r_0_0_0_0_0_1_1;\n }\n {\n int32 r_0_0_0_0_0_1_2 = -2042932697;\n r_0_0_0_0_0_1.s_2 = r_0_0_0_0_0_1_2;\n }\n r_0_0_0_0_0[1] = r_0_0_0_0_0_1;\n }\n {\n S_e72c145f memory r_0_0_0_0_0_2;\n {\n S_14df74d1 memory r_0_0_0_0_0_2_0;\n {\n int56 r_0_0_0_0_0_2_0_0 = 19352089222962830;\n r_0_0_0_0_0_2_0.s_0 = r_0_0_0_0_0_2_0_0;\n }\n r_0_0_0_0_0_2.s_0 = r_0_0_0_0_0_2_0;\n }\n {\n int192 r_0_0_0_0_0_2_1 = 850615461475663698356080201323667724892949021745361826597;\n r_0_0_0_0_0_2.s_1 = r_0_0_0_0_0_2_1;\n }\n {\n int32 r_0_0_0_0_0_2_2 = -1545249528;\n r_0_0_0_0_0_2.s_2 = r_0_0_0_0_0_2_2;\n }\n r_0_0_0_0_0[2] = r_0_0_0_0_0_2;\n }\n {\n S_e72c145f memory r_0_0_0_0_0_3;\n {\n S_14df74d1 memory r_0_0_0_0_0_3_0;\n {\n int56 r_0_0_0_0_0_3_0_0 = 12448077416526128;\n r_0_0_0_0_0_3_0.s_0 = r_0_0_0_0_0_3_0_0;\n }\n r_0_0_0_0_0_3.s_0 = r_0_0_0_0_0_3_0;\n }\n {\n int192 r_0_0_0_0_0_3_1 = -252607150705595700226146231900854080808595658563209139079;\n r_0_0_0_0_0_3.s_1 = r_0_0_0_0_0_3_1;\n }\n {\n int32 r_0_0_0_0_0_3_2 = -1492674580;\n r_0_0_0_0_0_3.s_2 = r_0_0_0_0_0_3_2;\n }\n r_0_0_0_0_0[3] = r_0_0_0_0_0_3;\n }\n r_0_0_0_0.s_0 = r_0_0_0_0_0;\n }\n {\n address[4] memory r_0_0_0_0_1;\n {\n address r_0_0_0_0_1_0 = 0xB13A2c96dB0B93B955736a032f78BC412cdff52A;\n r_0_0_0_0_1[0] = r_0_0_0_0_1_0;\n }\n {\n address r_0_0_0_0_1_1 = 0x23b49e40372Be1d29ea88Db074527f8AFcc1b4fa;\n r_0_0_0_0_1[1] = r_0_0_0_0_1_1;\n }\n {\n address r_0_0_0_0_1_2 = 0xe3CD0cA3A4344fce4E2773103EE5D6D963c2D2d6;\n r_0_0_0_0_1[2] = r_0_0_0_0_1_2;\n }\n {\n address r_0_0_0_0_1_3 = 0xa1428dDbC8BD4F29b6f9882585d801f1cF884C53;\n r_0_0_0_0_1[3] = r_0_0_0_0_1_3;\n }\n r_0_0_0_0.s_1 = r_0_0_0_0_1;\n }\n {\n string memory r_0_0_0_0_2 = unicode\"Moo é🚀oMM🚀🚀oéoM o🚀oéMoo Moo🚀\";\n r_0_0_0_0.s_2 = r_0_0_0_0_2;\n }\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n S_6ae83230 memory r_0_0_0_1;\n {\n S_e72c145f[4] memory r_0_0_0_1_0;\n {\n S_e72c145f memory r_0_0_0_1_0_0;\n {\n S_14df74d1 memory r_0_0_0_1_0_0_0;\n {\n int56 r_0_0_0_1_0_0_0_0 = -4468568507435821;\n r_0_0_0_1_0_0_0.s_0 = r_0_0_0_1_0_0_0_0;\n }\n r_0_0_0_1_0_0.s_0 = r_0_0_0_1_0_0_0;\n }\n {\n int192 r_0_0_0_1_0_0_1 = -1063239882420995536677203650191128740106442279556938630330;\n r_0_0_0_1_0_0.s_1 = r_0_0_0_1_0_0_1;\n }\n {\n int32 r_0_0_0_1_0_0_2 = -500087289;\n r_0_0_0_1_0_0.s_2 = r_0_0_0_1_0_0_2;\n }\n r_0_0_0_1_0[0] = r_0_0_0_1_0_0;\n }\n {\n S_e72c145f memory r_0_0_0_1_0_1;\n {\n S_14df74d1 memory r_0_0_0_1_0_1_0;\n {\n int56 r_0_0_0_1_0_1_0_0 = -34883194371107692;\n r_0_0_0_1_0_1_0.s_0 = r_0_0_0_1_0_1_0_0;\n }\n r_0_0_0_1_0_1.s_0 = r_0_0_0_1_0_1_0;\n }\n {\n int192 r_0_0_0_1_0_1_1 = -2803665010141791364163953170835773196016133814523576430245;\n r_0_0_0_1_0_1.s_1 = r_0_0_0_1_0_1_1;\n }\n {\n int32 r_0_0_0_1_0_1_2 = 846929197;\n r_0_0_0_1_0_1.s_2 = r_0_0_0_1_0_1_2;\n }\n r_0_0_0_1_0[1] = r_0_0_0_1_0_1;\n }\n {\n S_e72c145f memory r_0_0_0_1_0_2;\n {\n S_14df74d1 memory r_0_0_0_1_0_2_0;\n {\n int56 r_0_0_0_1_0_2_0_0 = 10147585125523121;\n r_0_0_0_1_0_2_0.s_0 = r_0_0_0_1_0_2_0_0;\n }\n r_0_0_0_1_0_2.s_0 = r_0_0_0_1_0_2_0;\n }\n {\n int192 r_0_0_0_1_0_2_1 = -2779873030155308681934832870419621999395479809057500296328;\n r_0_0_0_1_0_2.s_1 = r_0_0_0_1_0_2_1;\n }\n {\n int32 r_0_0_0_1_0_2_2 = -463278235;\n r_0_0_0_1_0_2.s_2 = r_0_0_0_1_0_2_2;\n }\n r_0_0_0_1_0[2] = r_0_0_0_1_0_2;\n }\n {\n S_e72c145f memory r_0_0_0_1_0_3;\n {\n S_14df74d1 memory r_0_0_0_1_0_3_0;\n {\n int56 r_0_0_0_1_0_3_0_0 = -22733041165857004;\n r_0_0_0_1_0_3_0.s_0 = r_0_0_0_1_0_3_0_0;\n }\n r_0_0_0_1_0_3.s_0 = r_0_0_0_1_0_3_0;\n }\n {\n int192 r_0_0_0_1_0_3_1 = -721633697823436758504882013696035510607681731679239504665;\n r_0_0_0_1_0_3.s_1 = r_0_0_0_1_0_3_1;\n }\n {\n int32 r_0_0_0_1_0_3_2 = 1970122849;\n r_0_0_0_1_0_3.s_2 = r_0_0_0_1_0_3_2;\n }\n r_0_0_0_1_0[3] = r_0_0_0_1_0_3;\n }\n r_0_0_0_1.s_0 = r_0_0_0_1_0;\n }\n {\n address[4] memory r_0_0_0_1_1;\n {\n address r_0_0_0_1_1_0 = 0x40849bc2AcCbfF11f2BcbD827C224f999a77B4E6;\n r_0_0_0_1_1[0] = r_0_0_0_1_1_0;\n }\n {\n address r_0_0_0_1_1_1 = 0x1E9eC57BDBfFBec27E75DD4A376B5Ab18a752184;\n r_0_0_0_1_1[1] = r_0_0_0_1_1_1;\n }\n {\n address r_0_0_0_1_1_2 = 0xc695c6fA9aAdBB699a426F53f9616280E29BaFED;\n r_0_0_0_1_1[2] = r_0_0_0_1_1_2;\n }\n {\n address r_0_0_0_1_1_3 = 0x54e0Ed0F941631bF7cB7C6B42a1FD3D88D83c654;\n r_0_0_0_1_1[3] = r_0_0_0_1_1_3;\n }\n r_0_0_0_1.s_1 = r_0_0_0_1_1;\n }\n {\n string memory r_0_0_0_1_2 = unicode\"Moo é🚀Méo Mooé 🚀M é é🚀M🚀🚀éoo éMo🚀\";\n r_0_0_0_1.s_2 = r_0_0_0_1_2;\n }\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n S_6ae83230 memory r_0_0_0_2;\n {\n S_e72c145f[4] memory r_0_0_0_2_0;\n {\n S_e72c145f memory r_0_0_0_2_0_0;\n {\n S_14df74d1 memory r_0_0_0_2_0_0_0;\n {\n int56 r_0_0_0_2_0_0_0_0 = -3017345592797417;\n r_0_0_0_2_0_0_0.s_0 = r_0_0_0_2_0_0_0_0;\n }\n r_0_0_0_2_0_0.s_0 = r_0_0_0_2_0_0_0;\n }\n {\n int192 r_0_0_0_2_0_0_1 = 1309381901980577314433186117547559999207784395044465716197;\n r_0_0_0_2_0_0.s_1 = r_0_0_0_2_0_0_1;\n }\n {\n int32 r_0_0_0_2_0_0_2 = -878637779;\n r_0_0_0_2_0_0.s_2 = r_0_0_0_2_0_0_2;\n }\n r_0_0_0_2_0[0] = r_0_0_0_2_0_0;\n }\n {\n S_e72c145f memory r_0_0_0_2_0_1;\n {\n S_14df74d1 memory r_0_0_0_2_0_1_0;\n {\n int56 r_0_0_0_2_0_1_0_0 = 16314306657384783;\n r_0_0_0_2_0_1_0.s_0 = r_0_0_0_2_0_1_0_0;\n }\n r_0_0_0_2_0_1.s_0 = r_0_0_0_2_0_1_0;\n }\n {\n int192 r_0_0_0_2_0_1_1 = -2893895698359147333866280511750672968936865158819263987106;\n r_0_0_0_2_0_1.s_1 = r_0_0_0_2_0_1_1;\n }\n {\n int32 r_0_0_0_2_0_1_2 = 825621486;\n r_0_0_0_2_0_1.s_2 = r_0_0_0_2_0_1_2;\n }\n r_0_0_0_2_0[1] = r_0_0_0_2_0_1;\n }\n {\n S_e72c145f memory r_0_0_0_2_0_2;\n {\n S_14df74d1 memory r_0_0_0_2_0_2_0;\n {\n int56 r_0_0_0_2_0_2_0_0 = -5789266336627722;\n r_0_0_0_2_0_2_0.s_0 = r_0_0_0_2_0_2_0_0;\n }\n r_0_0_0_2_0_2.s_0 = r_0_0_0_2_0_2_0;\n }\n {\n int192 r_0_0_0_2_0_2_1 = -2679104681157297884460582032883900289772146566387992778241;\n r_0_0_0_2_0_2.s_1 = r_0_0_0_2_0_2_1;\n }\n {\n int32 r_0_0_0_2_0_2_2 = -1385283026;\n r_0_0_0_2_0_2.s_2 = r_0_0_0_2_0_2_2;\n }\n r_0_0_0_2_0[2] = r_0_0_0_2_0_2;\n }\n {\n S_e72c145f memory r_0_0_0_2_0_3;\n {\n S_14df74d1 memory r_0_0_0_2_0_3_0;\n {\n int56 r_0_0_0_2_0_3_0_0 = 8677736844171223;\n r_0_0_0_2_0_3_0.s_0 = r_0_0_0_2_0_3_0_0;\n }\n r_0_0_0_2_0_3.s_0 = r_0_0_0_2_0_3_0;\n }\n {\n int192 r_0_0_0_2_0_3_1 = -1204134636963125630076575729438158955138439547368426494302;\n r_0_0_0_2_0_3.s_1 = r_0_0_0_2_0_3_1;\n }\n {\n int32 r_0_0_0_2_0_3_2 = -9255642;\n r_0_0_0_2_0_3.s_2 = r_0_0_0_2_0_3_2;\n }\n r_0_0_0_2_0[3] = r_0_0_0_2_0_3;\n }\n r_0_0_0_2.s_0 = r_0_0_0_2_0;\n }\n {\n address[4] memory r_0_0_0_2_1;\n {\n address r_0_0_0_2_1_0 = 0x93FCcB581eCf7c2Af093de25A74b78007bEAC25e;\n r_0_0_0_2_1[0] = r_0_0_0_2_1_0;\n }\n {\n address r_0_0_0_2_1_1 = 0xa462f7b3d8C02bB7454D33275aAA14BB64D341B2;\n r_0_0_0_2_1[1] = r_0_0_0_2_1_1;\n }\n {\n address r_0_0_0_2_1_2 = 0x3B42c465bbCcb784A1dc63c1cc0fCc36b9244202;\n r_0_0_0_2_1[2] = r_0_0_0_2_1_2;\n }\n {\n address r_0_0_0_2_1_3 = 0x5690753C2b4557388BC5de653Aca38c117cEde22;\n r_0_0_0_2_1[3] = r_0_0_0_2_1_3;\n }\n r_0_0_0_2.s_1 = r_0_0_0_2_1;\n }\n {\n string memory r_0_0_0_2_2 = unicode\"Moo é🚀🚀🚀🚀o oM éoMo🚀o\";\n r_0_0_0_2.s_2 = r_0_0_0_2_2;\n }\n r_0_0_0[2] = r_0_0_0_2;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0xB3cC0929CE011AeEFD5e7481d2aFFe926C4B41D8;\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_d3eb2c12 memory r_1;\n {\n S_cc61e3dd memory r_1_0;\n {\n S_6ae83230[3] memory r_1_0_0;\n {\n S_6ae83230 memory r_1_0_0_0;\n {\n S_e72c145f[4] memory r_1_0_0_0_0;\n {\n S_e72c145f memory r_1_0_0_0_0_0;\n {\n S_14df74d1 memory r_1_0_0_0_0_0_0;\n {\n int56 r_1_0_0_0_0_0_0_0 = 23281314006002050;\n r_1_0_0_0_0_0_0.s_0 = r_1_0_0_0_0_0_0_0;\n }\n r_1_0_0_0_0_0.s_0 = r_1_0_0_0_0_0_0;\n }\n {\n int192 r_1_0_0_0_0_0_1 = -1078944298310412639080150777540911711151375967182380349499;\n r_1_0_0_0_0_0.s_1 = r_1_0_0_0_0_0_1;\n }\n {\n int32 r_1_0_0_0_0_0_2 = -769700546;\n r_1_0_0_0_0_0.s_2 = r_1_0_0_0_0_0_2;\n }\n r_1_0_0_0_0[0] = r_1_0_0_0_0_0;\n }\n {\n S_e72c145f memory r_1_0_0_0_0_1;\n {\n S_14df74d1 memory r_1_0_0_0_0_1_0;\n {\n int56 r_1_0_0_0_0_1_0_0 = -22873401954895450;\n r_1_0_0_0_0_1_0.s_0 = r_1_0_0_0_0_1_0_0;\n }\n r_1_0_0_0_0_1.s_0 = r_1_0_0_0_0_1_0;\n }\n {\n int192 r_1_0_0_0_0_1_1 = 1413850709218422494740038325216188258674967605031666790007;\n r_1_0_0_0_0_1.s_1 = r_1_0_0_0_0_1_1;\n }\n {\n int32 r_1_0_0_0_0_1_2 = -1146070675;\n r_1_0_0_0_0_1.s_2 = r_1_0_0_0_0_1_2;\n }\n r_1_0_0_0_0[1] = r_1_0_0_0_0_1;\n }\n {\n S_e72c145f memory r_1_0_0_0_0_2;\n {\n S_14df74d1 memory r_1_0_0_0_0_2_0;\n {\n int56 r_1_0_0_0_0_2_0_0 = -32821962766197214;\n r_1_0_0_0_0_2_0.s_0 = r_1_0_0_0_0_2_0_0;\n }\n r_1_0_0_0_0_2.s_0 = r_1_0_0_0_0_2_0;\n }\n {\n int192 r_1_0_0_0_0_2_1 = -80190196916209351729112901151440529724710765512577322423;\n r_1_0_0_0_0_2.s_1 = r_1_0_0_0_0_2_1;\n }\n {\n int32 r_1_0_0_0_0_2_2 = 1545730715;\n r_1_0_0_0_0_2.s_2 = r_1_0_0_0_0_2_2;\n }\n r_1_0_0_0_0[2] = r_1_0_0_0_0_2;\n }\n {\n S_e72c145f memory r_1_0_0_0_0_3;\n {\n S_14df74d1 memory r_1_0_0_0_0_3_0;\n {\n int56 r_1_0_0_0_0_3_0_0 = -22810689955484040;\n r_1_0_0_0_0_3_0.s_0 = r_1_0_0_0_0_3_0_0;\n }\n r_1_0_0_0_0_3.s_0 = r_1_0_0_0_0_3_0;\n }\n {\n int192 r_1_0_0_0_0_3_1 = 850918814148863368705439716078229528524342835350179656225;\n r_1_0_0_0_0_3.s_1 = r_1_0_0_0_0_3_1;\n }\n {\n int32 r_1_0_0_0_0_3_2 = 98926954;\n r_1_0_0_0_0_3.s_2 = r_1_0_0_0_0_3_2;\n }\n r_1_0_0_0_0[3] = r_1_0_0_0_0_3;\n }\n r_1_0_0_0.s_0 = r_1_0_0_0_0;\n }\n {\n address[4] memory r_1_0_0_0_1;\n {\n address r_1_0_0_0_1_0 = 0x122590A3351629e39d472453c302D553a6bb5AbE;\n r_1_0_0_0_1[0] = r_1_0_0_0_1_0;\n }\n {\n address r_1_0_0_0_1_1 = 0x30ecbe5C93BbFDdbaf0F295da08311D483Dcb510;\n r_1_0_0_0_1[1] = r_1_0_0_0_1_1;\n }\n {\n address r_1_0_0_0_1_2 = 0x0b350fcdC8FDe2db4D5624A50d305027CA3729dc;\n r_1_0_0_0_1[2] = r_1_0_0_0_1_2;\n }\n {\n address r_1_0_0_0_1_3 = 0x8aA066D11Bc9B752143C797e225c641622a5DD91;\n r_1_0_0_0_1[3] = r_1_0_0_0_1_3;\n }\n r_1_0_0_0.s_1 = r_1_0_0_0_1;\n }\n {\n string memory r_1_0_0_0_2 = unicode\"Moo é🚀oo🚀ooMMoo🚀M éMo🚀🚀o\";\n r_1_0_0_0.s_2 = r_1_0_0_0_2;\n }\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n S_6ae83230 memory r_1_0_0_1;\n {\n S_e72c145f[4] memory r_1_0_0_1_0;\n {\n S_e72c145f memory r_1_0_0_1_0_0;\n {\n S_14df74d1 memory r_1_0_0_1_0_0_0;\n {\n int56 r_1_0_0_1_0_0_0_0 = -32042862929788282;\n r_1_0_0_1_0_0_0.s_0 = r_1_0_0_1_0_0_0_0;\n }\n r_1_0_0_1_0_0.s_0 = r_1_0_0_1_0_0_0;\n }\n {\n int192 r_1_0_0_1_0_0_1 = 2603899819898477210657560142622102185118010245535397350333;\n r_1_0_0_1_0_0.s_1 = r_1_0_0_1_0_0_1;\n }\n {\n int32 r_1_0_0_1_0_0_2 = -1995661980;\n r_1_0_0_1_0_0.s_2 = r_1_0_0_1_0_0_2;\n }\n r_1_0_0_1_0[0] = r_1_0_0_1_0_0;\n }\n {\n S_e72c145f memory r_1_0_0_1_0_1;\n {\n S_14df74d1 memory r_1_0_0_1_0_1_0;\n {\n int56 r_1_0_0_1_0_1_0_0 = -10056556792085241;\n r_1_0_0_1_0_1_0.s_0 = r_1_0_0_1_0_1_0_0;\n }\n r_1_0_0_1_0_1.s_0 = r_1_0_0_1_0_1_0;\n }\n {\n int192 r_1_0_0_1_0_1_1 = -2492291202495877727687805730532535552432619415155093360040;\n r_1_0_0_1_0_1.s_1 = r_1_0_0_1_0_1_1;\n }\n {\n int32 r_1_0_0_1_0_1_2 = 1208568177;\n r_1_0_0_1_0_1.s_2 = r_1_0_0_1_0_1_2;\n }\n r_1_0_0_1_0[1] = r_1_0_0_1_0_1;\n }\n {\n S_e72c145f memory r_1_0_0_1_0_2;\n {\n S_14df74d1 memory r_1_0_0_1_0_2_0;\n {\n int56 r_1_0_0_1_0_2_0_0 = -19399278290947438;\n r_1_0_0_1_0_2_0.s_0 = r_1_0_0_1_0_2_0_0;\n }\n r_1_0_0_1_0_2.s_0 = r_1_0_0_1_0_2_0;\n }\n {\n int192 r_1_0_0_1_0_2_1 = 1063135826917562614376931844938258621170403285787272215248;\n r_1_0_0_1_0_2.s_1 = r_1_0_0_1_0_2_1;\n }\n {\n int32 r_1_0_0_1_0_2_2 = 855890345;\n r_1_0_0_1_0_2.s_2 = r_1_0_0_1_0_2_2;\n }\n r_1_0_0_1_0[2] = r_1_0_0_1_0_2;\n }\n {\n S_e72c145f memory r_1_0_0_1_0_3;\n {\n S_14df74d1 memory r_1_0_0_1_0_3_0;\n {\n int56 r_1_0_0_1_0_3_0_0 = -19463370243233104;\n r_1_0_0_1_0_3_0.s_0 = r_1_0_0_1_0_3_0_0;\n }\n r_1_0_0_1_0_3.s_0 = r_1_0_0_1_0_3_0;\n }\n {\n int192 r_1_0_0_1_0_3_1 = 1030799798091876611016639600343341243648831311172911166875;\n r_1_0_0_1_0_3.s_1 = r_1_0_0_1_0_3_1;\n }\n {\n int32 r_1_0_0_1_0_3_2 = 465874764;\n r_1_0_0_1_0_3.s_2 = r_1_0_0_1_0_3_2;\n }\n r_1_0_0_1_0[3] = r_1_0_0_1_0_3;\n }\n r_1_0_0_1.s_0 = r_1_0_0_1_0;\n }\n {\n address[4] memory r_1_0_0_1_1;\n {\n address r_1_0_0_1_1_0 = 0x8d7FE0ac167bE6ecdcA434Cbd2644Fd7EA0E7a87;\n r_1_0_0_1_1[0] = r_1_0_0_1_1_0;\n }\n {\n address r_1_0_0_1_1_1 = 0xeBE7c70E9307351C7069D57365d5eB90B355f4D3;\n r_1_0_0_1_1[1] = r_1_0_0_1_1_1;\n }\n {\n address r_1_0_0_1_1_2 = 0x1266B35909d0e3639AAC2657b98Cc56C8881De35;\n r_1_0_0_1_1[2] = r_1_0_0_1_1_2;\n }\n {\n address r_1_0_0_1_1_3 = 0xC34E6833B223ebe20674a848603cb59407AA5431;\n r_1_0_0_1_1[3] = r_1_0_0_1_1_3;\n }\n r_1_0_0_1.s_1 = r_1_0_0_1_1;\n }\n {\n string memory r_1_0_0_1_2 = unicode\"Moo é🚀🚀MéMoéé🚀 éoéooé🚀🚀 éM🚀M🚀ooéM M\";\n r_1_0_0_1.s_2 = r_1_0_0_1_2;\n }\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n S_6ae83230 memory r_1_0_0_2;\n {\n S_e72c145f[4] memory r_1_0_0_2_0;\n {\n S_e72c145f memory r_1_0_0_2_0_0;\n {\n S_14df74d1 memory r_1_0_0_2_0_0_0;\n {\n int56 r_1_0_0_2_0_0_0_0 = -11753802284653141;\n r_1_0_0_2_0_0_0.s_0 = r_1_0_0_2_0_0_0_0;\n }\n r_1_0_0_2_0_0.s_0 = r_1_0_0_2_0_0_0;\n }\n {\n int192 r_1_0_0_2_0_0_1 = -199763565511122050349974315878941624335627271595391776545;\n r_1_0_0_2_0_0.s_1 = r_1_0_0_2_0_0_1;\n }\n {\n int32 r_1_0_0_2_0_0_2 = 597954525;\n r_1_0_0_2_0_0.s_2 = r_1_0_0_2_0_0_2;\n }\n r_1_0_0_2_0[0] = r_1_0_0_2_0_0;\n }\n {\n S_e72c145f memory r_1_0_0_2_0_1;\n {\n S_14df74d1 memory r_1_0_0_2_0_1_0;\n {\n int56 r_1_0_0_2_0_1_0_0 = 22602833334264112;\n r_1_0_0_2_0_1_0.s_0 = r_1_0_0_2_0_1_0_0;\n }\n r_1_0_0_2_0_1.s_0 = r_1_0_0_2_0_1_0;\n }\n {\n int192 r_1_0_0_2_0_1_1 = 2828316515682751905828670341251447074361823374232374159551;\n r_1_0_0_2_0_1.s_1 = r_1_0_0_2_0_1_1;\n }\n {\n int32 r_1_0_0_2_0_1_2 = 1640403838;\n r_1_0_0_2_0_1.s_2 = r_1_0_0_2_0_1_2;\n }\n r_1_0_0_2_0[1] = r_1_0_0_2_0_1;\n }\n {\n S_e72c145f memory r_1_0_0_2_0_2;\n {\n S_14df74d1 memory r_1_0_0_2_0_2_0;\n {\n int56 r_1_0_0_2_0_2_0_0 = -13942300933792374;\n r_1_0_0_2_0_2_0.s_0 = r_1_0_0_2_0_2_0_0;\n }\n r_1_0_0_2_0_2.s_0 = r_1_0_0_2_0_2_0;\n }\n {\n int192 r_1_0_0_2_0_2_1 = 2839930250798414661531499206888100308389799626153707389633;\n r_1_0_0_2_0_2.s_1 = r_1_0_0_2_0_2_1;\n }\n {\n int32 r_1_0_0_2_0_2_2 = 996445074;\n r_1_0_0_2_0_2.s_2 = r_1_0_0_2_0_2_2;\n }\n r_1_0_0_2_0[2] = r_1_0_0_2_0_2;\n }\n {\n S_e72c145f memory r_1_0_0_2_0_3;\n {\n S_14df74d1 memory r_1_0_0_2_0_3_0;\n {\n int56 r_1_0_0_2_0_3_0_0 = 32547961484778419;\n r_1_0_0_2_0_3_0.s_0 = r_1_0_0_2_0_3_0_0;\n }\n r_1_0_0_2_0_3.s_0 = r_1_0_0_2_0_3_0;\n }\n {\n int192 r_1_0_0_2_0_3_1 = 1629999289311468287529557947852515268838601340840037611061;\n r_1_0_0_2_0_3.s_1 = r_1_0_0_2_0_3_1;\n }\n {\n int32 r_1_0_0_2_0_3_2 = 919153637;\n r_1_0_0_2_0_3.s_2 = r_1_0_0_2_0_3_2;\n }\n r_1_0_0_2_0[3] = r_1_0_0_2_0_3;\n }\n r_1_0_0_2.s_0 = r_1_0_0_2_0;\n }\n {\n address[4] memory r_1_0_0_2_1;\n {\n address r_1_0_0_2_1_0 = 0x42Cd74066F3b72b338E8e4E3766D68f48C47DC33;\n r_1_0_0_2_1[0] = r_1_0_0_2_1_0;\n }\n {\n address r_1_0_0_2_1_1 = 0x016D450BF5243681f0927bABDe6B90b080E0646D;\n r_1_0_0_2_1[1] = r_1_0_0_2_1_1;\n }\n {\n address r_1_0_0_2_1_2 = 0xE20d1773FCCa7234872F818eC4598d102D1F4C02;\n r_1_0_0_2_1[2] = r_1_0_0_2_1_2;\n }\n {\n address r_1_0_0_2_1_3 = 0xa38ca6CBd94e5361d242fc7ffA95Cb7b81B9Ec1C;\n r_1_0_0_2_1[3] = r_1_0_0_2_1_3;\n }\n r_1_0_0_2.s_1 = r_1_0_0_2_1;\n }\n {\n string memory r_1_0_0_2_2 = unicode\"Moo é🚀o🚀é M 🚀o🚀o🚀 éoMo 🚀🚀oo🚀🚀oooooo🚀🚀\";\n r_1_0_0_2.s_2 = r_1_0_0_2_2;\n }\n r_1_0_0[2] = r_1_0_0_2;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x0C97B35bb0B2b696d9652e6DBb1b9D35A89d2c71;\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_d3eb2c12 memory r_2;\n {\n S_cc61e3dd memory r_2_0;\n {\n S_6ae83230[3] memory r_2_0_0;\n {\n S_6ae83230 memory r_2_0_0_0;\n {\n S_e72c145f[4] memory r_2_0_0_0_0;\n {\n S_e72c145f memory r_2_0_0_0_0_0;\n {\n S_14df74d1 memory r_2_0_0_0_0_0_0;\n {\n int56 r_2_0_0_0_0_0_0_0 = -21591543933069159;\n r_2_0_0_0_0_0_0.s_0 = r_2_0_0_0_0_0_0_0;\n }\n r_2_0_0_0_0_0.s_0 = r_2_0_0_0_0_0_0;\n }\n {\n int192 r_2_0_0_0_0_0_1 = 2252824927820877503145152899891141242204973190486289706538;\n r_2_0_0_0_0_0.s_1 = r_2_0_0_0_0_0_1;\n }\n {\n int32 r_2_0_0_0_0_0_2 = -1455958590;\n r_2_0_0_0_0_0.s_2 = r_2_0_0_0_0_0_2;\n }\n r_2_0_0_0_0[0] = r_2_0_0_0_0_0;\n }\n {\n S_e72c145f memory r_2_0_0_0_0_1;\n {\n S_14df74d1 memory r_2_0_0_0_0_1_0;\n {\n int56 r_2_0_0_0_0_1_0_0 = 34603657943548194;\n r_2_0_0_0_0_1_0.s_0 = r_2_0_0_0_0_1_0_0;\n }\n r_2_0_0_0_0_1.s_0 = r_2_0_0_0_0_1_0;\n }\n {\n int192 r_2_0_0_0_0_1_1 = -1511089918744345713837258884959740637875986695554303103089;\n r_2_0_0_0_0_1.s_1 = r_2_0_0_0_0_1_1;\n }\n {\n int32 r_2_0_0_0_0_1_2 = 1564688144;\n r_2_0_0_0_0_1.s_2 = r_2_0_0_0_0_1_2;\n }\n r_2_0_0_0_0[1] = r_2_0_0_0_0_1;\n }\n {\n S_e72c145f memory r_2_0_0_0_0_2;\n {\n S_14df74d1 memory r_2_0_0_0_0_2_0;\n {\n int56 r_2_0_0_0_0_2_0_0 = -19594904696482284;\n r_2_0_0_0_0_2_0.s_0 = r_2_0_0_0_0_2_0_0;\n }\n r_2_0_0_0_0_2.s_0 = r_2_0_0_0_0_2_0;\n }\n {\n int192 r_2_0_0_0_0_2_1 = 2349786227666435407315732870680591711519093690361464538392;\n r_2_0_0_0_0_2.s_1 = r_2_0_0_0_0_2_1;\n }\n {\n int32 r_2_0_0_0_0_2_2 = -684545224;\n r_2_0_0_0_0_2.s_2 = r_2_0_0_0_0_2_2;\n }\n r_2_0_0_0_0[2] = r_2_0_0_0_0_2;\n }\n {\n S_e72c145f memory r_2_0_0_0_0_3;\n {\n S_14df74d1 memory r_2_0_0_0_0_3_0;\n {\n int56 r_2_0_0_0_0_3_0_0 = 4959687490109630;\n r_2_0_0_0_0_3_0.s_0 = r_2_0_0_0_0_3_0_0;\n }\n r_2_0_0_0_0_3.s_0 = r_2_0_0_0_0_3_0;\n }\n {\n int192 r_2_0_0_0_0_3_1 = 199356796803910550091059421704216859561049087143703225408;\n r_2_0_0_0_0_3.s_1 = r_2_0_0_0_0_3_1;\n }\n {\n int32 r_2_0_0_0_0_3_2 = -73746415;\n r_2_0_0_0_0_3.s_2 = r_2_0_0_0_0_3_2;\n }\n r_2_0_0_0_0[3] = r_2_0_0_0_0_3;\n }\n r_2_0_0_0.s_0 = r_2_0_0_0_0;\n }\n {\n address[4] memory r_2_0_0_0_1;\n {\n address r_2_0_0_0_1_0 = 0xBd553Bf894d988f6d5Df075540eEC34D21B4e95A;\n r_2_0_0_0_1[0] = r_2_0_0_0_1_0;\n }\n {\n address r_2_0_0_0_1_1 = 0xCAa2D5f42854dA84f7BCf393d171fD5703ecE403;\n r_2_0_0_0_1[1] = r_2_0_0_0_1_1;\n }\n {\n address r_2_0_0_0_1_2 = 0x11773114d9f49bdc6C9909200304175a32749eEb;\n r_2_0_0_0_1[2] = r_2_0_0_0_1_2;\n }\n {\n address r_2_0_0_0_1_3 = 0x9846E60C0911D711c976dDe22165c6a51909F0d3;\n r_2_0_0_0_1[3] = r_2_0_0_0_1_3;\n }\n r_2_0_0_0.s_1 = r_2_0_0_0_1;\n }\n {\n string memory r_2_0_0_0_2 = unicode\"Moo é🚀o oéM🚀o🚀oM🚀🚀 🚀MMo🚀éMo🚀oé éo o \";\n r_2_0_0_0.s_2 = r_2_0_0_0_2;\n }\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n S_6ae83230 memory r_2_0_0_1;\n {\n S_e72c145f[4] memory r_2_0_0_1_0;\n {\n S_e72c145f memory r_2_0_0_1_0_0;\n {\n S_14df74d1 memory r_2_0_0_1_0_0_0;\n {\n int56 r_2_0_0_1_0_0_0_0 = 5908220507039595;\n r_2_0_0_1_0_0_0.s_0 = r_2_0_0_1_0_0_0_0;\n }\n r_2_0_0_1_0_0.s_0 = r_2_0_0_1_0_0_0;\n }\n {\n int192 r_2_0_0_1_0_0_1 = -508585400579408089109053672852126487494521641570469894593;\n r_2_0_0_1_0_0.s_1 = r_2_0_0_1_0_0_1;\n }\n {\n int32 r_2_0_0_1_0_0_2 = 1227762368;\n r_2_0_0_1_0_0.s_2 = r_2_0_0_1_0_0_2;\n }\n r_2_0_0_1_0[0] = r_2_0_0_1_0_0;\n }\n {\n S_e72c145f memory r_2_0_0_1_0_1;\n {\n S_14df74d1 memory r_2_0_0_1_0_1_0;\n {\n int56 r_2_0_0_1_0_1_0_0 = 6004956187265209;\n r_2_0_0_1_0_1_0.s_0 = r_2_0_0_1_0_1_0_0;\n }\n r_2_0_0_1_0_1.s_0 = r_2_0_0_1_0_1_0;\n }\n {\n int192 r_2_0_0_1_0_1_1 = 73775672659601078168916585951707376031920718672347027433;\n r_2_0_0_1_0_1.s_1 = r_2_0_0_1_0_1_1;\n }\n {\n int32 r_2_0_0_1_0_1_2 = 1473789968;\n r_2_0_0_1_0_1.s_2 = r_2_0_0_1_0_1_2;\n }\n r_2_0_0_1_0[1] = r_2_0_0_1_0_1;\n }\n {\n S_e72c145f memory r_2_0_0_1_0_2;\n {\n S_14df74d1 memory r_2_0_0_1_0_2_0;\n {\n int56 r_2_0_0_1_0_2_0_0 = 16016490746387454;\n r_2_0_0_1_0_2_0.s_0 = r_2_0_0_1_0_2_0_0;\n }\n r_2_0_0_1_0_2.s_0 = r_2_0_0_1_0_2_0;\n }\n {\n int192 r_2_0_0_1_0_2_1 = 2132373353892504150694462614830992417579078860518779567875;\n r_2_0_0_1_0_2.s_1 = r_2_0_0_1_0_2_1;\n }\n {\n int32 r_2_0_0_1_0_2_2 = -1128997231;\n r_2_0_0_1_0_2.s_2 = r_2_0_0_1_0_2_2;\n }\n r_2_0_0_1_0[2] = r_2_0_0_1_0_2;\n }\n {\n S_e72c145f memory r_2_0_0_1_0_3;\n {\n S_14df74d1 memory r_2_0_0_1_0_3_0;\n {\n int56 r_2_0_0_1_0_3_0_0 = -35739625347395923;\n r_2_0_0_1_0_3_0.s_0 = r_2_0_0_1_0_3_0_0;\n }\n r_2_0_0_1_0_3.s_0 = r_2_0_0_1_0_3_0;\n }\n {\n int192 r_2_0_0_1_0_3_1 = 1159849174197563990556592321955819442812601903770361434551;\n r_2_0_0_1_0_3.s_1 = r_2_0_0_1_0_3_1;\n }\n {\n int32 r_2_0_0_1_0_3_2 = -1189140657;\n r_2_0_0_1_0_3.s_2 = r_2_0_0_1_0_3_2;\n }\n r_2_0_0_1_0[3] = r_2_0_0_1_0_3;\n }\n r_2_0_0_1.s_0 = r_2_0_0_1_0;\n }\n {\n address[4] memory r_2_0_0_1_1;\n {\n address r_2_0_0_1_1_0 = 0xdF320C85B875f3D5F9226eF71d738342706720c6;\n r_2_0_0_1_1[0] = r_2_0_0_1_1_0;\n }\n {\n address r_2_0_0_1_1_1 = 0xEb94f430a0345E22C83B513ABefc17F42d9195D7;\n r_2_0_0_1_1[1] = r_2_0_0_1_1_1;\n }\n {\n address r_2_0_0_1_1_2 = 0x9f24Ab538fd2A937B84bb160319710Ce0FC3316F;\n r_2_0_0_1_1[2] = r_2_0_0_1_1_2;\n }\n {\n address r_2_0_0_1_1_3 = 0xFC5592b162388BcC0a4488A3000d173b56dA1AC2;\n r_2_0_0_1_1[3] = r_2_0_0_1_1_3;\n }\n r_2_0_0_1.s_1 = r_2_0_0_1_1;\n }\n {\n string memory r_2_0_0_1_2 = unicode\"Moo é🚀é🚀o é MooooMMoo🚀🚀 MM\";\n r_2_0_0_1.s_2 = r_2_0_0_1_2;\n }\n r_2_0_0[1] = r_2_0_0_1;\n }\n {\n S_6ae83230 memory r_2_0_0_2;\n {\n S_e72c145f[4] memory r_2_0_0_2_0;\n {\n S_e72c145f memory r_2_0_0_2_0_0;\n {\n S_14df74d1 memory r_2_0_0_2_0_0_0;\n {\n int56 r_2_0_0_2_0_0_0_0 = -6565989801617046;\n r_2_0_0_2_0_0_0.s_0 = r_2_0_0_2_0_0_0_0;\n }\n r_2_0_0_2_0_0.s_0 = r_2_0_0_2_0_0_0;\n }\n {\n int192 r_2_0_0_2_0_0_1 = 1534604465317063736108220184621113982013914343520136754289;\n r_2_0_0_2_0_0.s_1 = r_2_0_0_2_0_0_1;\n }\n {\n int32 r_2_0_0_2_0_0_2 = -1366928012;\n r_2_0_0_2_0_0.s_2 = r_2_0_0_2_0_0_2;\n }\n r_2_0_0_2_0[0] = r_2_0_0_2_0_0;\n }\n {\n S_e72c145f memory r_2_0_0_2_0_1;\n {\n S_14df74d1 memory r_2_0_0_2_0_1_0;\n {\n int56 r_2_0_0_2_0_1_0_0 = 29465648336070225;\n r_2_0_0_2_0_1_0.s_0 = r_2_0_0_2_0_1_0_0;\n }\n r_2_0_0_2_0_1.s_0 = r_2_0_0_2_0_1_0;\n }\n {\n int192 r_2_0_0_2_0_1_1 = 1482113964397174789241619419160118886863804230347317648606;\n r_2_0_0_2_0_1.s_1 = r_2_0_0_2_0_1_1;\n }\n {\n int32 r_2_0_0_2_0_1_2 = 1627878877;\n r_2_0_0_2_0_1.s_2 = r_2_0_0_2_0_1_2;\n }\n r_2_0_0_2_0[1] = r_2_0_0_2_0_1;\n }\n {\n S_e72c145f memory r_2_0_0_2_0_2;\n {\n S_14df74d1 memory r_2_0_0_2_0_2_0;\n {\n int56 r_2_0_0_2_0_2_0_0 = 27179369318718028;\n r_2_0_0_2_0_2_0.s_0 = r_2_0_0_2_0_2_0_0;\n }\n r_2_0_0_2_0_2.s_0 = r_2_0_0_2_0_2_0;\n }\n {\n int192 r_2_0_0_2_0_2_1 = 635946567756576973439750041740985017279531138213852644524;\n r_2_0_0_2_0_2.s_1 = r_2_0_0_2_0_2_1;\n }\n {\n int32 r_2_0_0_2_0_2_2 = -2099439419;\n r_2_0_0_2_0_2.s_2 = r_2_0_0_2_0_2_2;\n }\n r_2_0_0_2_0[2] = r_2_0_0_2_0_2;\n }\n {\n S_e72c145f memory r_2_0_0_2_0_3;\n {\n S_14df74d1 memory r_2_0_0_2_0_3_0;\n {\n int56 r_2_0_0_2_0_3_0_0 = 25553371565296073;\n r_2_0_0_2_0_3_0.s_0 = r_2_0_0_2_0_3_0_0;\n }\n r_2_0_0_2_0_3.s_0 = r_2_0_0_2_0_3_0;\n }\n {\n int192 r_2_0_0_2_0_3_1 = -1555305043261312817301316874614419357925233059329136266856;\n r_2_0_0_2_0_3.s_1 = r_2_0_0_2_0_3_1;\n }\n {\n int32 r_2_0_0_2_0_3_2 = -1572159740;\n r_2_0_0_2_0_3.s_2 = r_2_0_0_2_0_3_2;\n }\n r_2_0_0_2_0[3] = r_2_0_0_2_0_3;\n }\n r_2_0_0_2.s_0 = r_2_0_0_2_0;\n }\n {\n address[4] memory r_2_0_0_2_1;\n {\n address r_2_0_0_2_1_0 = 0xe1e6d064a788276c0Ac027F562d11a47620A0CAE;\n r_2_0_0_2_1[0] = r_2_0_0_2_1_0;\n }\n {\n address r_2_0_0_2_1_1 = 0x88C04d6Be1e7FbF518849f339901e8e6895bfb52;\n r_2_0_0_2_1[1] = r_2_0_0_2_1_1;\n }\n {\n address r_2_0_0_2_1_2 = 0xFcDD91852C53002eb9626025Fcc574385df32d5C;\n r_2_0_0_2_1[2] = r_2_0_0_2_1_2;\n }\n {\n address r_2_0_0_2_1_3 = 0x68e935c26d60cDaa61585F0f27d1342b577A77B3;\n r_2_0_0_2_1[3] = r_2_0_0_2_1_3;\n }\n r_2_0_0_2.s_1 = r_2_0_0_2_1;\n }\n {\n string memory r_2_0_0_2_2 = unicode\"Moo é🚀 🚀oMoooéo🚀o MM🚀oooooo 🚀o oo\";\n r_2_0_0_2.s_2 = r_2_0_0_2_2;\n }\n r_2_0_0[2] = r_2_0_0_2;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0xA6Ae09F3752170c0Bf3cB021E93e4E83Ac7534d4;\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000011200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000b3cc0929ce011aeefd5e7481d2affe926c4b41d80000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000001ae1136ee42ccf00000000000000001f2687e1cd1fb97755fb9431472cd495e130feffb823c70f0000000000000000000000000000000000000000000000000000000070445587000000000000000000000000000000000000000000000000001d6b56f65b116dffffffffffffffff934f6e117fa7ce0621d7243f1ff92c4929395b589ff5d1b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffff863b52270000000000000000000000000000000000000000000000000044c09f63cbde8e000000000000000022b0d6fcbf19615fef79240f9e53507f7f8d0b1c2059b325ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3e55d08000000000000000000000000000000000000000000000000002c3975e08c7130fffffffffffffffff5b2a885a6d8fee360b19b5cafe787bab4f947c8f8dfec79ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa70797ec000000000000000000000000b13a2c96db0b93b955736a032f78bc412cdff52a00000000000000000000000023b49e40372be1d29ea88db074527f8afcc1b4fa000000000000000000000000e3cd0ca3a4344fce4e2773103ee5d6d963c2d2d6000000000000000000000000a1428ddbc8bd4f29b6f9882585d801f1cf884c53000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806f4d4df09f9a80f09f9a806fc3a96f4d20206ff09f9a806fc3a94d6f6f2020204d6f6ff09f9a80000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffff01fdc5175b4d3ffffffffffffffffd4a341f6c251ea9bedf3222d7a1fc7348c86e77527597b46ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2314607ffffffffffffffffffffffffffffffffffffffffffffffffff8411eb66e11494ffffffffffffffff8da85f1a1ae2b8ff71d20b1ca54d0c3b3b3a4a8512b0515b00000000000000000000000000000000000000000000000000000000327b1d2d00000000000000000000000000000000000000000000000000240d2cc6bc1eb1ffffffffffffffff8ea0c5776a2c7b449bffa0650f7ffd9eb7ca504481020b78ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe462ef65ffffffffffffffffffffffffffffffffffffffffffffffffffaf3c6b64a50f14ffffffffffffffffe291caeb395f53d45d3f4576477e8572a5793e8de6f07ce700000000000000000000000000000000000000000000000000000000756db06100000000000000000000000040849bc2accbff11f2bcbd827c224f999a77b4e60000000000000000000000001e9ec57bdbffbec27e75dd4a376b5ab18a752184000000000000000000000000c695c6fa9aadbb699a426f53f9616280e29bafed00000000000000000000000054e0ed0f941631bf7cb7c6b42a1fd3d88d83c6540000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a804dc3a96f204d6f6fc3a92020f09f9a804d20c3a920c3a9f09f9a804df09f9a80f09f9a80c3a96f6f20c3a94d6ff09f9a800000000000fffffffffffffffffffffffffffffffffffffffffffffffffff547bd7bc6d7170000000000000000356695bd5982eaa4088c6d9d62e558f54bc47af8b830abe5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcba10d2d0000000000000000000000000000000000000000000000000039f5c68511f94fffffffffffffffff89fa51b3e6a43fde3e5b90008ca6473d4e5541395cd9425e000000000000000000000000000000000000000000000000000000003135fbeeffffffffffffffffffffffffffffffffffffffffffffffffffeb6eb1647ec3f6ffffffffffffffff92bcd78db61b31893bca45fbad8300b62e7e863e337da9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffad6e422e000000000000000000000000000000000000000000000000001ed45b0e0d17d7ffffffffffffffffcee43f6fa5e807bc0b3af3e5862b49facd5f81dd023326a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff72c52600000000000000000000000093fccb581ecf7c2af093de25a74b78007beac25e000000000000000000000000a462f7b3d8c02bb7454d33275aaa14bb64d341b20000000000000000000000003b42c465bbccb784a1dc63c1cc0fcc36b92442020000000000000000000000005690753c2b4557388bc5de653aca38c117cede22000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f206f4d20c3a96f4d6ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000c97b35bb0b2b696d9652e6dbb1b9d35a89d2c710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000052b63b533b6982ffffffffffffffffd3ff4bc15cb33f0dbeafaea78a83007d265862e055a7c7c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd21f4d3effffffffffffffffffffffffffffffffffffffffffffffffffaebcc319ac79a6000000000000000039a94a47eb8a869501d5c17cf74d2f3246a3d314a1e92e77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbb0596dffffffffffffffffffffffffffffffffffffffffffffffffff8b6499487d5e22fffffffffffffffffcbac678b9ed282c1949cf8a412df8eb544bd454f8caf249000000000000000000000000000000000000000000000000000000005c21fa9bffffffffffffffffffffffffffffffffffffffffffffffffffaef5cc601f2e78000000000000000022b401c7117cb17603738332f9f6b03bc866ca45bf97b2210000000000000000000000000000000000000000000000000000000005e5816a000000000000000000000000122590a3351629e39d472453c302d553a6bb5abe00000000000000000000000030ecbe5c93bbfddbaf0f295da08311d483dcb5100000000000000000000000000b350fcdc8fde2db4d5624a50d305027ca3729dc0000000000000000000000008aa066d11bc9b752143c797e225c641622a5dd91000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a806f6ff09f9a806f6f4d4d6f6ff09f9a804d20c3a94d6ff09f9a80f09f9a806f0000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffff8e292f997bc28600000000000000006a31fb8c17ecec73973884144394208bbf59ca98f99c8bbdffffffffffffffffffffffffffffffffffffffffffffffffffffffff890c9d64ffffffffffffffffffffffffffffffffffffffffffffffffffdc459d68be8507ffffffffffffffff9a5b4406d588cb88f2d1adb38c7dcdd21449f656276ab2580000000000000000000000000000000000000000000000000000000048094971ffffffffffffffffffffffffffffffffffffffffffffffffffbb14758c91b29200000000000000002b5ba7eb9388cce4cc91482a48cf177c286a3962f1dafad0000000000000000000000000000000000000000000000000000000003303d9a9ffffffffffffffffffffffffffffffffffffffffffffffffffbada2afa852ab000000000000000002a0a0d52d18f4d63d64e6a4c931761dd31feec4bcb2ef59b000000000000000000000000000000000000000000000000000000001bc4af4c0000000000000000000000008d7fe0ac167be6ecdca434cbd2644fd7ea0e7a87000000000000000000000000ebe7c70e9307351c7069d57365d5eb90b355f4d30000000000000000000000001266b35909d0e3639aac2657b98cc56c8881de35000000000000000000000000c34e6833b223ebe20674a848603cb59407aa5431000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a80f09f9a804dc3a94d6fc3a9c3a9f09f9a8020c3a96fc3a96f6fc3a9f09f9a80f09f9a8020c3a94df09f9a804df09f9a806f6fc3a94d204d00000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffd63dfaa61025abfffffffffffffffff7da5efde2a6dea7f71a9204d5ab5c688858d8f2c41f08df0000000000000000000000000000000000000000000000000000000023a40fdd00000000000000000000000000000000000000000000000000504d283bce613000000000000000007359009274583e9cf3ca997969cadb8dee582f20bb2328bf0000000000000000000000000000000000000000000000000000000061c6937effffffffffffffffffffffffffffffffffffffffffffffffffce778d197d5d8a000000000000000073d2415a7c2d2770cdc2121801fbd019080f0e92644b42c1000000000000000000000000000000000000000000000000000000003b648b920000000000000000000000000000000000000000000000000073a232d2769bb300000000000000004279fc93f45684e77c1a2a338601ddd9007e74259b3876350000000000000000000000000000000000000000000000000000000036c92be500000000000000000000000042cd74066f3b72b338e8e4e3766d68f48c47dc33000000000000000000000000016d450bf5243681f0927babde6b90b080e0646d000000000000000000000000e20d1773fcca7234872f818ec4598d102d1f4c02000000000000000000000000a38ca6cbd94e5361d242fc7ffa95cb7b81b9ec1c0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806ff09f9a80c3a9204d20f09f9a806ff09f9a806ff09f9a802020c3a96f4d6f20f09f9a80f09f9a806f6ff09f9a80f09f9a806f6f6f6f6f6ff09f9a80f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a6ae09f3752170c0bf3cb021e93e4e83ac7534d40000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000580ffffffffffffffffffffffffffffffffffffffffffffffffffb34a9aedb7989900000000000000005be096f71082000df1395bbfd90bdfe274a7b3c90e066e2affffffffffffffffffffffffffffffffffffffffffffffffffffffffa937d5c2000000000000000000000000000000000000000000000000007aefd7f3a78122ffffffffffffffffc25f7c30ffdabe64576f4954637e8127e0ac625f6d626f8f000000000000000000000000000000000000000000000000000000005d433f10ffffffffffffffffffffffffffffffffffffffffffffffffffba6289ba28961400000000000000005fd4e9b4a01296e65de0b60a0e237b5caf3060e54314c518ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd732ab3800000000000000000000000000000000000000000000000000119ecf3b0b80be0000000000000000082161cfabc11a3ef1e348579d9c4ef1aecb625a307c2440fffffffffffffffffffffffffffffffffffffffffffffffffffffffffb9ab811000000000000000000000000bd553bf894d988f6d5df075540eec34d21b4e95a000000000000000000000000caa2d5f42854da84f7bcf393d171fd5703ece40300000000000000000000000011773114d9f49bdc6c9909200304175a32749eeb0000000000000000000000009846e60c0911d711c976dde22165c6a51909f0d3000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a806f20206fc3a94df09f9a806ff09f9a806f4df09f9a80f09f9a8020f09f9a804d4d6ff09f9a80c3a94d6ff09f9a806fc3a920c3a96f206f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fd7ec893a76bffffffffffffffffeb421ee3a6c1b66430d2fd707c69691aaa138bb680b8a63f00000000000000000000000000000000000000000000000000000000492e2ac000000000000000000000000000000000000000000000000000155579d06f08b9000000000000000003024103ac4dbd82a754091961a8b8c36b510b3b166c57e90000000000000000000000000000000000000000000000000000000057d840100000000000000000000000000000000000000000000000000038e6e9d97c9bfe000000000000000056f7043fc01739614f6b740c8dcfcdeb094181662274bf03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbcb4de91ffffffffffffffffffffffffffffffffffffffffffffffffff81070006c34ead00000000000000002f4d63f11b6e846a5545f6968257b9b228ca4ccd61cc91b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb91f274f000000000000000000000000df320c85b875f3d5f9226ef71d738342706720c6000000000000000000000000eb94f430a0345e22c83b513abefc17f42d9195d70000000000000000000000009f24ab538fd2a937b84bb160319710ce0fc3316f000000000000000000000000fc5592b162388bcc0a4488a3000d173b56da1ac20000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a80c3a9f09f9a806f20c3a920204d6f6f6f6f4d4d6f6ff09f9a80f09f9a80204d4d00000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffe8ac445e46996a00000000000000003e9604a8aa59de86b88e2312da880e48a5af0f12a3427471ffffffffffffffffffffffffffffffffffffffffffffffffffffffffae8655740000000000000000000000000000000000000000000000000068aed9de25e65100000000000000003c71fde67f04159590801e7e1c0640862f37176d27511cde00000000000000000000000000000000000000000000000000000000610775dd00000000000000000000000000000000000000000000000000608f7e0d761a4c000000000000000019ef978b36bdbecb0d06aa25ca33073966a2ac72c2ee84acffffffffffffffffffffffffffffffffffffffffffffffffffffffff82dd18c5000000000000000000000000000000000000000000000000005ac8a7f2f689c9ffffffffffffffffc091db912328eef5d01b57623b21820347e1d449a6c9f198ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa24abf04000000000000000000000000e1e6d064a788276c0ac027f562d11a47620a0cae00000000000000000000000088c04d6be1e7fbf518849f339901e8e6895bfb52000000000000000000000000fcdd91852c53002eb9626025fcc574385df32d5c00000000000000000000000068e935c26d60cdaa61585f0f27d1342b577a77b3000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a802020f09f9a806f4d6f6f6fc3a96ff09f9a806f204d4df09f9a806f6f6f6f6f6f20f09f9a806f202020206f6f00000000000000000000" + }, + { + "name": "random-((((string,address,string)),bool,(address,string,string),bytes11),string,string)", + "type": "((((string,address,string)),bool,(address,string,string),bytes11),string,string)", + "value": [ + [ + [ + [ + "Moo é🚀oéM🚀ééo o🚀 🚀oooé éMo éé🚀 🚀oo🚀ooé🚀oo🚀o🚀o M MoM🚀éM ", + "0xEE583BB596ec9b27e3fF0D41743987CCF12d44a1", + "Moo é🚀 MMooMéooooo é 🚀éé éM🚀o🚀🚀MMMooééo" + ] + ], + true, + [ + "0x9711eBe28A09B85979b4223be5Fbf757eC947a3f", + "Moo é🚀🚀ooMoo🚀M🚀ooé MoéoéooMoo o o🚀M 🚀é", + "Moo é🚀o🚀M🚀ooéooMéoMoéoéMéoé🚀 éM Mo" + ], + "0x9204316f201d5dacbfee6b" + ], + "Moo é🚀", + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéM🚀ééo o🚀 🚀oooé éMo éé🚀 🚀oo🚀ooé🚀oo🚀o🚀o M MoM🚀éM " + }, + { + "type": "address", + "value": "0xEE583BB596ec9b27e3fF0D41743987CCF12d44a1" + }, + { + "type": "string", + "value": "Moo é🚀 MMooMéooooo é 🚀éé éM🚀o🚀🚀MMMooééo" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9711eBe28A09B85979b4223be5Fbf757eC947a3f" + }, + { + "type": "string", + "value": "Moo é🚀🚀ooMoo🚀M🚀ooé MoéoéooMoo o o🚀M 🚀é" + }, + { + "type": "string", + "value": "Moo é🚀o🚀M🚀ooéooMéoMoéoéMéoé🚀 éM Mo" + } + ] + }, + { + "type": "hexstring", + "value": "0x9204316f201d5dacbfee6b" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061055b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061030c565b60405180910390f35b6100566101f1565b61005e6101f1565b610066610218565b60408051608081018252606060208201818152600093830193909352808201529081526040805160608082018352808252600060208301529181019190915260006040518060a001604052806063815260200161048d6063913982525073ee583bb596ec9b27e3ff0d41743987ccf12d44a16020808301919091526040805160608101909152603f808252600092610411908301396040808401919091529183525090825260016020808401919091528151606080820184526000825291810182905291820152739711ebe28a09b85979b4223be5fbf757ec947a3f81526040805160608101909152603d80825260009190610450602083013990508082602001819052505060006040518060600160405280603681526020016104f06036913960408084019190915283810192909252506a9204316f201d5dacbfee6b60a81b606083015290825280518082018252600a808252689adede418753e13f3560b71b602080840182905280860193909352835180850185529182529181019190915290820152919050565b6040518060600160405280610204610218565b815260200160608152602001606081525090565b6040805161010081018252606060a08201818152600060c0840181905260e084018390526080840191825290835260208084018290528451808401865291825281018290528084019190915290918201908152600060209091015290565b6000815180845260005b8181101561029c57602081850181015186830182015201610280565b818111156102ae576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b03815116825260006020820151606060208501526102ea6060850182610276565b9050604083015184820360408601526103038282610276565b95945050505050565b6000602080835283516060828501528051608080860152805190508261010086015280516060610120870152610346610180870182610276565b828501516001600160a01b031661014088015260409092015186830361011f190161016088015291905061037a8183610276565b9150508282015161038f60a087018215159052565b506040820151858203607f190160c08701526103ab82826102c3565b915050606082015191506103cb60e08601836001600160a81b0319169052565b828601519250601f199150818582030160408601526103ea8184610276565b9250506040850151818584030160608601526104068382610276565b969550505050505056fe4d6f6f20c3a9f09f9a80204d4d6f6f4dc3a96f6f6f6f6f20c3a92020f09f9a80c3a9c3a920c3a94df09f9a806ff09f9a80f09f9a804d4d4d6f6fc3a9c3a96f4d6f6f20c3a9f09f9a80f09f9a806f6f4d6f6ff09f9a804df09f9a806f6fc3a9204d6fc3a96fc3a96f6f4d6f6f206f206ff09f9a804d20f09f9a80c3a94d6f6f20c3a9f09f9a806fc3a94df09f9a80c3a9c3a96f206ff09f9a8020f09f9a806f6f6fc3a920c3a94d6f20c3a9c3a9f09f9a8020f09f9a806f6ff09f9a806f6fc3a9f09f9a806f6ff09f9a806ff09f9a806f204d20204d6f4df09f9a80c3a94d204d6f6f20c3a9f09f9a806ff09f9a804df09f9a806f6fc3a96f6f4dc3a96f4d6fc3a96fc3a94dc3a96fc3a9f09f9a8020c3a94d204d6fa2646970667358221220feb74013327db758f1b6304bbe3f9872c2d678463129ad0cc093ef531fc0ef2c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7d8f2a5d {\n string s_0;\n address s_1;\n string s_2;\n }\n\n struct S_a67aa342 {\n S_7d8f2a5d s_0;\n }\n\n struct S_23fa3048 {\n address s_0;\n string s_1;\n string s_2;\n }\n\n struct S_dad3b2b7 {\n S_a67aa342 s_0;\n bool s_1;\n S_23fa3048 s_2;\n bytes11 s_3;\n }\n\n struct S_8917bd4d {\n S_dad3b2b7 s_0;\n string s_1;\n string s_2;\n }\n\n function test () public pure returns (S_8917bd4d memory) {\n S_8917bd4d memory r;\n {\n S_dad3b2b7 memory r_0;\n {\n S_a67aa342 memory r_0_0;\n {\n S_7d8f2a5d memory r_0_0_0;\n {\n string memory r_0_0_0_0 = unicode\"Moo é🚀oéM🚀ééo o🚀 🚀oooé éMo éé🚀 🚀oo🚀ooé🚀oo🚀o🚀o M MoM🚀éM \";\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n address r_0_0_0_1 = 0xEE583BB596ec9b27e3fF0D41743987CCF12d44a1;\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n string memory r_0_0_0_2 = unicode\"Moo é🚀 MMooMéooooo é 🚀éé éM🚀o🚀🚀MMMooééo\";\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n S_23fa3048 memory r_0_2;\n {\n address r_0_2_0 = 0x9711eBe28A09B85979b4223be5Fbf757eC947a3f;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀🚀ooMoo🚀M🚀ooé MoéoéooMoo o o🚀M 🚀é\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n string memory r_0_2_2 = unicode\"Moo é🚀o🚀M🚀ooéooMéoMoéoéMéoé🚀 éM Mo\";\n r_0_2.s_2 = r_0_2_2;\n }\n r_0.s_2 = r_0_2;\n }\n {\n bytes11 r_0_3 = bytes11(0x9204316f201d5dacbfee6b);\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002009204316f201d5dacbfee6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ee583bb596ec9b27e3ff0d41743987ccf12d44a1000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a806fc3a94df09f9a80c3a9c3a96f206ff09f9a8020f09f9a806f6f6fc3a920c3a94d6f20c3a9c3a9f09f9a8020f09f9a806f6ff09f9a806f6fc3a9f09f9a806f6ff09f9a806ff09f9a806f204d20204d6f4df09f9a80c3a94d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80204d4d6f6f4dc3a96f6f6f6f6f20c3a92020f09f9a80c3a9c3a920c3a94df09f9a806ff09f9a80f09f9a804d4d4d6f6fc3a9c3a96f000000000000000000000000009711ebe28a09b85979b4223be5fbf757ec947a3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a80f09f9a806f6f4d6f6ff09f9a804df09f9a806f6fc3a9204d6fc3a96fc3a96f6f4d6f6f206f206ff09f9a804d20f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806ff09f9a804df09f9a806f6fc3a96f6f4dc3a96f4d6fc3a96fc3a94dc3a96fc3a9f09f9a8020c3a94d204d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(((address),int80,string,string),bool[2],address,bool[1])[4]", + "type": "(((address),int80,string,string),bool[2],address,bool[1])[4]", + "value": [ + [ + [ + ["0xc2D4f502845879A8e2618290D8A1a585D0654252"], + "-296010844397397586676821", + "Moo é🚀oé🚀Mooo o M🚀oé 🚀é🚀éMéooé🚀é 🚀ééMo oMoé o🚀🚀oMM éé é", + "Moo é🚀ooooMMooMoMMMMoé Mooo 🚀🚀 MooM🚀oo oo" + ], + [true, true], + "0x7552098B7D5a0C5D6B7E8cbDE9C47AC2e779eE83", + [false] + ], + [ + [ + ["0xd9E116Da28Fb8d7334fA715AF709E8E2b454A926"], + "-223969864464425064121600", + "Moo é🚀ooMéoo 🚀éMMMMoéMo ééééo🚀éoo🚀o🚀oéo MéMéoMMéo Mooé🚀🚀ooé", + "Moo é🚀 🚀é oo🚀🚀oéo 🚀oM🚀 oM 🚀MéoMo🚀 M" + ], + [true, true], + "0xA6971E7ecda37552Dc59c1e04A4ea58336D877c4", + [true] + ], + [ + [ + ["0xa0055a5303af828211F35e1Ae8FCae22d7944420"], + "221705289274371194579465", + "Moo é🚀oM o🚀éMoM🚀éé🚀🚀oMoéMoMo🚀M o ooMooéoM🚀é🚀🚀🚀 o🚀 ", + "Moo é🚀oéo Mooooé🚀M M🚀oMé🚀o" + ], + [true, true], + "0xDb77f5Fa1DA1B61c4792AFEf0eD83198d87260bA", + [false] + ], + [ + [ + ["0x9F6b818A6d6D8ce39A56A1a0ea08F85C6315f5cC"], + "-124507085275057999228527", + "Moo é🚀 🚀oé🚀M🚀é MoMM oo 🚀o🚀oMoMéo🚀 🚀Moooé ooM", + "Moo é🚀" + ], + [true, false], + "0xE7B52F14B256Cf6f228cEe47b7B73791A0F1d992", + [true] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xc2D4f502845879A8e2618290D8A1a585D0654252" + } + ] + }, + { + "type": "number", + "value": "-296010844397397586676821" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀Mooo o M🚀oé 🚀é🚀éMéooé🚀é 🚀ééMo oMoé o🚀🚀oMM éé é" + }, + { + "type": "string", + "value": "Moo é🚀ooooMMooMoMMMMoé Mooo 🚀🚀 MooM🚀oo oo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x7552098B7D5a0C5D6B7E8cbDE9C47AC2e779eE83" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd9E116Da28Fb8d7334fA715AF709E8E2b454A926" + } + ] + }, + { + "type": "number", + "value": "-223969864464425064121600" + }, + { + "type": "string", + "value": "Moo é🚀ooMéoo 🚀éMMMMoéMo ééééo🚀éoo🚀o🚀oéo MéMéoMMéo Mooé🚀🚀ooé" + }, + { + "type": "string", + "value": "Moo é🚀 🚀é oo🚀🚀oéo 🚀oM🚀 oM 🚀MéoMo🚀 M" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xA6971E7ecda37552Dc59c1e04A4ea58336D877c4" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa0055a5303af828211F35e1Ae8FCae22d7944420" + } + ] + }, + { + "type": "number", + "value": "221705289274371194579465" + }, + { + "type": "string", + "value": "Moo é🚀oM o🚀éMoM🚀éé🚀🚀oMoéMoMo🚀M o ooMooéoM🚀é🚀🚀🚀 o🚀 " + }, + { + "type": "string", + "value": "Moo é🚀oéo Mooooé🚀M M🚀oMé🚀o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xDb77f5Fa1DA1B61c4792AFEf0eD83198d87260bA" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9F6b818A6d6D8ce39A56A1a0ea08F85C6315f5cC" + } + ] + }, + { + "type": "number", + "value": "-124507085275057999228527" + }, + { + "type": "string", + "value": "Moo é🚀 🚀oé🚀M🚀é MoMM oo 🚀o🚀oMoMéo🚀 🚀Moooé ooM" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xE7B52F14B256Cf6f228cEe47b7B73791A0F1d992" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061083f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610519565b60405180910390f35b6100566103ae565b61005e6103ae565b6100666103db565b61006e610414565b604080516020808201835273c2d4f502845879a8e2618290d8a1a585d06542528252908352693eaec7aff6c387530c541983820152815160a0810190925260628083526000929161064790830139604080840191909152805160608101909152603a8082526000925061078f602083013960608301525081526100ef610440565b6001808252602080830191909152820152737552098b7d5a0c5d6b7e8cbde9c47ac2e779ee83604082015261012261045e565b60008152606082015281526101356103db565b61013d610414565b604080516020808201835273d9e116da28fb8d7334fa715af709e8e2b454a9268252908352692f6d6e411f3207ccc4ff1983820152815160808101909252606080835260009291610705908301396040808401919091528051608081019091526041808252600092506107c9602083013960608301525081526101be610440565b600180825260208083019190915282015273a6971e7ecda37552dc59c1e04a4ea58336d877c460408201526101f161045e565b60018152606082015260208201526102076103db565b61020f610414565b604080516020808201835273a0055a5303af828211f35e1ae8fcae22d79444208252908352692ef2aaf5de1334316a0983820152815160808101909252605c808352600092916106a990830139604080840191909152805160608101909152602a808252600092506107656020830139606083015250815261028f610440565b600180825260208083019190915282015273db77f5fa1da1b61c4792afef0ed83198d87260ba60408201526102c261045e565b60008152606082015260408201526102d86103db565b6102e0610414565b6040805160208082018352739f6b818a6d6d8ce39a56a1a0ea08f85c6315f5cc8252908352691a5d8ae8f6dafccaae6e1983820152815160808101909252604b808352600092916105fc908301396040808401919091528051808201909152600a8152689adede418753e13f3560b71b60208201526060830152508152610365610440565b60018152600060208083019190915282015273e7b52f14b256cf6f228cee47b7b73791a0f1d992604082015261039961045e565b60018152606082810191909152820152919050565b60405180608001604052806004905b6103c56103db565b8152602001906001900390816103bd5790505090565b60405180608001604052806103ee610414565b81526020016103fb610440565b81526000602082015260400161040f61045e565b905290565b6040805160a0810182526000608082018181528252602082015260609181018290528181019190915290565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156104a257602081850181015186830182015201610486565b818111156104b4576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60028110156104ee57815115158452602093840193909101906001016104cd565b50505050565b8060005b60018110156104ee57815115158452602093840193909101906001016104f8565b602080825260009060a083820181850186855b60048110156105ee57878303601f19018452815180518685528051516001600160a01b0316878601528781015160090b60c0860152604080820151608060e0880181905261057e61012089018361047c565b606094850151898203609f19016101008b01529490925061059f838661047c565b94508b86015192506105b38c8a01846104c9565b928501516001600160a01b03811689850152929490940151936105d8888201866104f4565b505050948701949350509085019060010161052c565b509097965050505050505056fe4d6f6f20c3a9f09f9a80202020f09f9a806fc3a9f09f9a804df09f9a80c3a9204d6f4d4d206f6f20f09f9a806ff09f9a806f4d6f4dc3a96ff09f9a8020f09f9a804d6f6f6fc3a9206f6f4d4d6f6f20c3a9f09f9a806fc3a9f09f9a804d6f6f6f206f204df09f9a806fc3a920f09f9a80c3a9f09f9a80c3a94dc3a96f6fc3a9f09f9a80c3a9202020f09f9a80c3a9c3a94d6f206f4d6fc3a9206ff09f9a80f09f9a806f4d4d20c3a9c3a920c3a94d6f6f20c3a9f09f9a806f4d206ff09f9a80c3a94d6f4df09f9a80c3a9c3a9f09f9a80f09f9a806f4d6fc3a94d6f4d6ff09f9a804d206f206f6f4d6f6fc3a96f4df09f9a80c3a9f09f9a80f09f9a80f09f9a802020206ff09f9a80204d6f6f20c3a9f09f9a806f6f4dc3a96f6f2020f09f9a80c3a94d4d4d4d6fc3a94d6f20c3a9c3a9c3a9c3a96ff09f9a80c3a96f6ff09f9a806ff09f9a806fc3a96f204dc3a94dc3a96f4d4dc3a96f204d6f6fc3a9f09f9a80f09f9a806f6fc3a94d6f6f20c3a9f09f9a806fc3a96f204d6f6f6f6fc3a9f09f9a804d204df09f9a806f4dc3a9f09f9a806f4d6f6f20c3a9f09f9a806f6f6f6f4d4d6f6f4d6f4d4d4d4d6fc3a9202020204d6f6f6f20f09f9a80f09f9a80204d6f6f4df09f9a806f6f206f6f4d6f6f20c3a9f09f9a802020f09f9a80c3a9206f6ff09f9a80f09f9a806fc3a96f2020f09f9a806f4df09f9a80206f4d20f09f9a804dc3a96f4d6ff09f9a80204da2646970667358221220874ea070417bd0db694561f12cd544535c3050bfd35afd4833a301975feef32c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_d38a6c27 {\n S_421683f8 s_0;\n int80 s_1;\n string s_2;\n string s_3;\n }\n\n struct S_3c101cb1 {\n S_d38a6c27 s_0;\n bool[2] s_1;\n address s_2;\n bool[1] s_3;\n }\n\n function test () public pure returns (S_3c101cb1[4] memory) {\n S_3c101cb1[4] memory r;\n {\n S_3c101cb1 memory r_0;\n {\n S_d38a6c27 memory r_0_0;\n {\n S_421683f8 memory r_0_0_0;\n {\n address r_0_0_0_0 = 0xc2D4f502845879A8e2618290D8A1a585D0654252;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n int80 r_0_0_1 = -296010844397397586676821;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀oé🚀Mooo o M🚀oé 🚀é🚀éMéooé🚀é 🚀ééMo oMoé o🚀🚀oMM éé é\";\n r_0_0.s_2 = r_0_0_2;\n }\n {\n string memory r_0_0_3 = unicode\"Moo é🚀ooooMMooMoMMMMoé Mooo 🚀🚀 MooM🚀oo oo\";\n r_0_0.s_3 = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool[2] memory r_0_1;\n {\n bool r_0_1_0 = true;\n r_0_1[0] = r_0_1_0;\n }\n {\n bool r_0_1_1 = true;\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x7552098B7D5a0C5D6B7E8cbDE9C47AC2e779eE83;\n r_0.s_2 = r_0_2;\n }\n {\n bool[1] memory r_0_3;\n {\n bool r_0_3_0 = false;\n r_0_3[0] = r_0_3_0;\n }\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_3c101cb1 memory r_1;\n {\n S_d38a6c27 memory r_1_0;\n {\n S_421683f8 memory r_1_0_0;\n {\n address r_1_0_0_0 = 0xd9E116Da28Fb8d7334fA715AF709E8E2b454A926;\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n int80 r_1_0_1 = -223969864464425064121600;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n string memory r_1_0_2 = unicode\"Moo é🚀ooMéoo 🚀éMMMMoéMo ééééo🚀éoo🚀o🚀oéo MéMéoMMéo Mooé🚀🚀ooé\";\n r_1_0.s_2 = r_1_0_2;\n }\n {\n string memory r_1_0_3 = unicode\"Moo é🚀 🚀é oo🚀🚀oéo 🚀oM🚀 oM 🚀MéoMo🚀 M\";\n r_1_0.s_3 = r_1_0_3;\n }\n r_1.s_0 = r_1_0;\n }\n {\n bool[2] memory r_1_1;\n {\n bool r_1_1_0 = true;\n r_1_1[0] = r_1_1_0;\n }\n {\n bool r_1_1_1 = true;\n r_1_1[1] = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0xA6971E7ecda37552Dc59c1e04A4ea58336D877c4;\n r_1.s_2 = r_1_2;\n }\n {\n bool[1] memory r_1_3;\n {\n bool r_1_3_0 = true;\n r_1_3[0] = r_1_3_0;\n }\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_3c101cb1 memory r_2;\n {\n S_d38a6c27 memory r_2_0;\n {\n S_421683f8 memory r_2_0_0;\n {\n address r_2_0_0_0 = 0xa0055a5303af828211F35e1Ae8FCae22d7944420;\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n int80 r_2_0_1 = 221705289274371194579465;\n r_2_0.s_1 = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀oM o🚀éMoM🚀éé🚀🚀oMoéMoMo🚀M o ooMooéoM🚀é🚀🚀🚀 o🚀 \";\n r_2_0.s_2 = r_2_0_2;\n }\n {\n string memory r_2_0_3 = unicode\"Moo é🚀oéo Mooooé🚀M M🚀oMé🚀o\";\n r_2_0.s_3 = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool[2] memory r_2_1;\n {\n bool r_2_1_0 = true;\n r_2_1[0] = r_2_1_0;\n }\n {\n bool r_2_1_1 = true;\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0xDb77f5Fa1DA1B61c4792AFEf0eD83198d87260bA;\n r_2.s_2 = r_2_2;\n }\n {\n bool[1] memory r_2_3;\n {\n bool r_2_3_0 = false;\n r_2_3[0] = r_2_3_0;\n }\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n {\n S_3c101cb1 memory r_3;\n {\n S_d38a6c27 memory r_3_0;\n {\n S_421683f8 memory r_3_0_0;\n {\n address r_3_0_0_0 = 0x9F6b818A6d6D8ce39A56A1a0ea08F85C6315f5cC;\n r_3_0_0.s_0 = r_3_0_0_0;\n }\n r_3_0.s_0 = r_3_0_0;\n }\n {\n int80 r_3_0_1 = -124507085275057999228527;\n r_3_0.s_1 = r_3_0_1;\n }\n {\n string memory r_3_0_2 = unicode\"Moo é🚀 🚀oé🚀M🚀é MoMM oo 🚀o🚀oMoMéo🚀 🚀Moooé ooM\";\n r_3_0.s_2 = r_3_0_2;\n }\n {\n string memory r_3_0_3 = unicode\"Moo é🚀\";\n r_3_0.s_3 = r_3_0_3;\n }\n r_3.s_0 = r_3_0;\n }\n {\n bool[2] memory r_3_1;\n {\n bool r_3_1_0 = true;\n r_3_1[0] = r_3_1_0;\n }\n {\n bool r_3_1_1 = false;\n r_3_1[1] = r_3_1_1;\n }\n r_3.s_1 = r_3_1;\n }\n {\n address r_3_2 = 0xE7B52F14B256Cf6f228cEe47b7B73791A0F1d992;\n r_3.s_2 = r_3_2;\n }\n {\n bool[1] memory r_3_3;\n {\n bool r_3_3_0 = true;\n r_3_3[0] = r_3_3_0;\n }\n r_3.s_3 = r_3_3;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000007552098b7d5a0c5d6b7e8cbde9c47ac2e779ee830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2d4f502845879a8e2618290d8a1a585d0654252ffffffffffffffffffffffffffffffffffffffffffffc1513850093c78acf3ab0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806fc3a9f09f9a804d6f6f6f206f204df09f9a806fc3a920f09f9a80c3a9f09f9a80c3a94dc3a96f6fc3a9f09f9a80c3a9202020f09f9a80c3a9c3a94d6f206f4d6fc3a9206ff09f9a80f09f9a806f4d4d20c3a9c3a920c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a806f6f6f6f4d4d6f6f4d6f4d4d4d4d6fc3a9202020204d6f6f6f20f09f9a80f09f9a80204d6f6f4df09f9a806f6f206f6f00000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a6971e7ecda37552dc59c1e04a4ea58336d877c40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d9e116da28fb8d7334fa715af709e8e2b454a926ffffffffffffffffffffffffffffffffffffffffffffd09291bee0cdf8333b000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a806f6f4dc3a96f6f2020f09f9a80c3a94d4d4d4d6fc3a94d6f20c3a9c3a9c3a9c3a96ff09f9a80c3a96f6ff09f9a806ff09f9a806fc3a96f204dc3a94dc3a96f4d4dc3a96f204d6f6fc3a9f09f9a80f09f9a806f6fc3a900000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a802020f09f9a80c3a9206f6ff09f9a80f09f9a806fc3a96f2020f09f9a806f4df09f9a80206f4d20f09f9a804dc3a96f4d6ff09f9a80204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000db77f5fa1da1b61c4792afef0ed83198d87260ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0055a5303af828211f35e1ae8fcae22d7944420000000000000000000000000000000000000000000002ef2aaf5de1334316a0900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806f4d206ff09f9a80c3a94d6f4df09f9a80c3a9c3a9f09f9a80f09f9a806f4d6fc3a94d6f4d6ff09f9a804d206f206f6f4d6f6fc3a96f4df09f9a80c3a9f09f9a80f09f9a80f09f9a802020206ff09f9a802000000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a806fc3a96f204d6f6f6f6fc3a9f09f9a804d204df09f9a806f4dc3a9f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7b52f14b256cf6f228cee47b7b73791a0f1d99200000000000000000000000000000000000000000000000000000000000000010000000000000000000000009f6b818a6d6d8ce39a56a1a0ea08f85c6315f5ccffffffffffffffffffffffffffffffffffffffffffffe5a2751709250335519100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a80202020f09f9a806fc3a9f09f9a804df09f9a80c3a9204d6f4d4d206f6f20f09f9a806ff09f9a806f4d6f4dc3a96ff09f9a8020f09f9a804d6f6f6fc3a9206f6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(((bool,address,bool,bytes7[2])[],int216,string,bool),address)", + "type": "(((bool,address,bool,bytes7[2])[],int216,string,bool),address)", + "value": [ + [ + [], + "-48321108601483997989180977617598168557333391446037653031792943861", + "Moo é🚀éo🚀MooéoM🚀é éMo🚀🚀oéééo", + false + ], + "0x4F5E41c5Fd19E00EE1c42cF316395CA99ab02bD7" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "number", + "value": "-48321108601483997989180977617598168557333391446037653031792943861" + }, + { + "type": "string", + "value": "Moo é🚀éo🚀MooéoM🚀é éMo🚀🚀oéééo" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x4F5E41c5Fd19E00EE1c42cF316395CA99ab02bD7" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061037d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610206565b60405180910390f35b6040805160c0808201835260608284018181526000828501819052608080860184905260a080870183905292865260208087018390528751958601885285880185815286860184905286830186905293860183905292855284830182905286519081018752838152808301829052808701849052928301819052855181815291820190955292939192909190816100fb565b6100e861016d565b8152602001906001900390816100e05790505b508252507a75764cb99972e118d146885cf1140fcac2b92a0431c8357c5422f4196020808301919091526040805160608101909152603380825260009261031590830139604083015250600060608201528152734f5e41c5fd19e00ee1c42cf316395ca99ab02bd76020820152919050565b60408051608081018252600080825260208201819052918101919091526060810161019661019b565b905290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156101df576020818501810151868301820152016101c3565b818111156101f1576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352606084516040808487015260e0860182516080858901528181518084526101008a019150878301935060009250825b818110156102ac578451805115158452898101516001600160a01b03168a85015286810151151587850152880151888401855b60028110156102965782516001600160c81b0319168252918b0191908b019060010161026f565b5050509388019360a0929092019160010161023c565b50508685015192506102c360808a0184601a0b9052565b84840151898203605f190160a08b015292506102df81846101b9565b9585015180151560c08b01529592506102f6915050565b938701516001600160a01b038116828801529397965050505050505056fe4d6f6f20c3a9f09f9a80c3a96ff09f9a804d6f6fc3a96f4df09f9a80c3a920c3a94d6ff09f9a80f09f9a806fc3a9c3a9c3a96fa2646970667358221220d7d952a0542aac496df0e0865951b03b5e747e77a30cf1a97b5588e1023b832564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f68cad07 {\n bool s_0;\n address s_1;\n bool s_2;\n bytes7[2] s_3;\n }\n\n struct S_d1f480eb {\n S_f68cad07[] s_0;\n int216 s_1;\n string s_2;\n bool s_3;\n }\n\n struct S_4eec83b2 {\n S_d1f480eb s_0;\n address s_1;\n }\n\n function test () public pure returns (S_4eec83b2 memory) {\n S_4eec83b2 memory r;\n {\n S_d1f480eb memory r_0;\n {\n S_f68cad07[] memory r_0_0 = new S_f68cad07[](0);\n r_0.s_0 = r_0_0;\n }\n {\n int216 r_0_1 = -48321108601483997989180977617598168557333391446037653031792943861;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀éo🚀MooéoM🚀é éMo🚀🚀oéééo\";\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x4F5E41c5Fd19E00EE1c42cF316395CA99ab02bD7;\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000004f5e41c5fd19e00ee1c42cf316395ca99ab02bd70000000000000000000000000000000000000000000000000000000000000080ffffffffff8a89b346668d1ee72eb977a30eebf0353d46d5fbce37ca83abdd0b00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80c3a96ff09f9a804d6f6fc3a96f4df09f9a80c3a920c3a94d6ff09f9a80f09f9a806fc3a9c3a9c3a96f00000000000000000000000000" + }, + { + "name": "random-(((bytes19,bytes32,bytes1,((bytes12,bool)[])),address[3],string),bytes14)", + "type": "(((bytes19,bytes32,bytes1,((bytes12,bool)[])),address[3],string),bytes14)", + "value": [ + [ + [ + "0x86e1695072c5dc797d4aa618761baf945b27db", + "0x72658bcea19a0cd744c1f42afc890b3766bf6a1925ad9b14798966a96344ea8b", + "0xe7", + [ + [ + ["0x2626fbe6d5d4c61b91055f7e", false], + ["0x267b90155d848b0b6a9f8062", false] + ] + ] + ], + [ + "0x52bC509DF762931DBCD26766ae297431468559e7", + "0x0487fDF03314686a35A161bC6aF909e6A41b6C2E", + "0x9A04483adEe5e9caac862b26596B7d760edD7eAD" + ], + "Moo é🚀éoMé é 🚀éoMoo é🚀 🚀oéMé Mo" + ], + "0x85527179797ec047062cfc520571" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x86e1695072c5dc797d4aa618761baf945b27db" + }, + { + "type": "hexstring", + "value": "0x72658bcea19a0cd744c1f42afc890b3766bf6a1925ad9b14798966a96344ea8b" + }, + { + "type": "hexstring", + "value": "0xe7" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2626fbe6d5d4c61b91055f7e" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x267b90155d848b0b6a9f8062" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x52bC509DF762931DBCD26766ae297431468559e7" + }, + { + "type": "address", + "value": "0x0487fDF03314686a35A161bC6aF909e6A41b6C2E" + }, + { + "type": "address", + "value": "0x9A04483adEe5e9caac862b26596B7d760edD7eAD" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éoMé é 🚀éoMoo é🚀 🚀oéMé Mo" + } + ] + }, + { + "type": "hexstring", + "value": "0x85527179797ec047062cfc520571" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610509806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061036f565b60405180910390f35b610056610263565b61005e610263565b610066610283565b6040805160808101825260008082526020808301828152838501838152855180840187526060808252808701919091527286e1695072c5dc797d4aa618761baf945b27db60681b86527f72658bcea19a0cd744c1f42afc890b3766bf6a1925ad9b14798966a96344ea8b90925260e760f81b9052845180830186528181528551600280825292810190965293949182015b60408051808201909152600080825260208201528152602001906001900390816100f7575050604080518082019091526000602082018190526b13137df36aea630dc882afbf60a11b8252825192935090918291849161015957610159610487565b60200260200101819052505061017f604080518082019091526000808252602082015290565b6b133dc80aaec24585b54fc03160a11b81526000602082015281518190839060019081106101af576101af610487565b6020908102919091010152508152606082015281526101cc6102d2565b7352bc509df762931dbcd26766ae297431468559e78152730487fdf03314686a35a161bc6af909e6a41b6c2e602080830191909152739a04483adee5e9caac862b26596b7d760edd7ead6040808401919091528382019290925281516060810190925260368083526000929161049e9083013960408301525081526d85527179797ec047062cfc52057160901b6020820152919050565b6040518060400160405280610276610283565b8152600060209091015290565b6040805160e081018252600060608083018281526080840183905260a08401929092528351602080820190955290815260c083015281529081016102c56102d2565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b8060005b600381101561031c5781516001600160a01b03168452602093840193909101906001016102f4565b50505050565b6000815180845260005b818110156103485760208185018101518683018201520161032c565b8181111561035a576000602083870101525b50601f01601f19169290920160200192915050565b602080825282516040838301819052815160a060608087019190915281516cffffffffffffffffffffffffff191661010087015281850151610120870152818301516001600160f81b0319166101408701520151608061016086015251610180850184905280516101a0860181905260009493929184019085906101c08801905b8083101561042557835180516001600160a01b03191683528701511515878301529286019260019290920191908401906103f0565b5085850151925061043960808901846102f0565b93830151878503605f190160e0890152936104548186610322565b9589015171ffffffffffffffffffffffffffffffffffff1981168986015295945061047e92505050565b50949350505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a96f4dc3a920c3a92020f09f9a80c3a96f4d6f6f2020c3a9f09f9a802020f09f9a806fc3a94dc3a9204d6fa26469706673582212209ec2511af97e4eaacd0a8bba7cdd3f8e183c4377b361740568a37a5cd9f1b4d564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_30cb1468 {\n bytes12 s_0;\n bool s_1;\n }\n\n struct S_20dd8eb0 {\n S_30cb1468[] s_0;\n }\n\n struct S_65d3be59 {\n bytes19 s_0;\n bytes32 s_1;\n bytes1 s_2;\n S_20dd8eb0 s_3;\n }\n\n struct S_ea513300 {\n S_65d3be59 s_0;\n address[3] s_1;\n string s_2;\n }\n\n struct S_477a2649 {\n S_ea513300 s_0;\n bytes14 s_1;\n }\n\n function test () public pure returns (S_477a2649 memory) {\n S_477a2649 memory r;\n {\n S_ea513300 memory r_0;\n {\n S_65d3be59 memory r_0_0;\n {\n bytes19 r_0_0_0 = bytes19(0x86e1695072c5dc797d4aa618761baf945b27db);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bytes32 r_0_0_1 = bytes32(0x72658bcea19a0cd744c1f42afc890b3766bf6a1925ad9b14798966a96344ea8b);\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bytes1 r_0_0_2 = bytes1(0xe7);\n r_0_0.s_2 = r_0_0_2;\n }\n {\n S_20dd8eb0 memory r_0_0_3;\n {\n S_30cb1468[] memory r_0_0_3_0 = new S_30cb1468[](2);\n {\n S_30cb1468 memory r_0_0_3_0_0;\n {\n bytes12 r_0_0_3_0_0_0 = bytes12(0x2626fbe6d5d4c61b91055f7e);\n r_0_0_3_0_0.s_0 = r_0_0_3_0_0_0;\n }\n {\n bool r_0_0_3_0_0_1 = false;\n r_0_0_3_0_0.s_1 = r_0_0_3_0_0_1;\n }\n r_0_0_3_0[0] = r_0_0_3_0_0;\n }\n {\n S_30cb1468 memory r_0_0_3_0_1;\n {\n bytes12 r_0_0_3_0_1_0 = bytes12(0x267b90155d848b0b6a9f8062);\n r_0_0_3_0_1.s_0 = r_0_0_3_0_1_0;\n }\n {\n bool r_0_0_3_0_1_1 = false;\n r_0_0_3_0_1.s_1 = r_0_0_3_0_1_1;\n }\n r_0_0_3_0[1] = r_0_0_3_0_1;\n }\n r_0_0_3.s_0 = r_0_0_3_0;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n {\n address[3] memory r_0_1;\n {\n address r_0_1_0 = 0x52bC509DF762931DBCD26766ae297431468559e7;\n r_0_1[0] = r_0_1_0;\n }\n {\n address r_0_1_1 = 0x0487fDF03314686a35A161bC6aF909e6A41b6C2E;\n r_0_1[1] = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x9A04483adEe5e9caac862b26596B7d760edD7eAD;\n r_0_1[2] = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀éoMé é 🚀éoMoo é🚀 🚀oéMé Mo\";\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bytes14 r_1 = bytes14(0x85527179797ec047062cfc520571);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004085527179797ec047062cfc52057100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000052bc509df762931dbcd26766ae297431468559e70000000000000000000000000487fdf03314686a35a161bc6af909e6a41b6c2e0000000000000000000000009a04483adee5e9caac862b26596b7d760edd7ead00000000000000000000000000000000000000000000000000000000000001e086e1695072c5dc797d4aa618761baf945b27db0000000000000000000000000072658bcea19a0cd744c1f42afc890b3766bf6a1925ad9b14798966a96344ea8be7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000022626fbe6d5d4c61b91055f7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000267b90155d848b0b6a9f80620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80c3a96f4dc3a920c3a92020f09f9a80c3a96f4d6f6f2020c3a9f09f9a802020f09f9a806fc3a94dc3a9204d6f00000000000000000000" + }, + { + "name": "random-(((string,(bool)),(address[][],bytes3),(address[2],bool[3])))", + "type": "(((string,(bool)),(address[][],bytes3),(address[2],bool[3])))", + "value": [ + [ + ["Moo é🚀o éMoé🚀é🚀 Mo é🚀o🚀é🚀ééé 🚀MMo MoMé🚀Méo 🚀 oooMoMéMM🚀Mé", [true]], + [ + [ + [ + "0x79B92764CB72b54Ddda4D199E506b3955B242Fce", + "0xf501F099388156547AFbAfCD9D9B3b84F19248aD", + "0x182966ba9867125FeB3A773b160161192f90e21e", + "0x2e2d821aAb3C7161FB57a7A71369fA3CA0B945A6" + ] + ], + "0xbf40ad" + ], + [ + [ + "0xFD356cc838946A8E04a2cB446175D00E55668385", + "0xD4C5499253011F8DE78EA0E3FA23b5562073CD47" + ], + [false, false, false] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o éMoé🚀é🚀 Mo é🚀o🚀é🚀ééé 🚀MMo MoMé🚀Méo 🚀 oooMoMéMM🚀Mé" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x79B92764CB72b54Ddda4D199E506b3955B242Fce" + }, + { + "type": "address", + "value": "0xf501F099388156547AFbAfCD9D9B3b84F19248aD" + }, + { + "type": "address", + "value": "0x182966ba9867125FeB3A773b160161192f90e21e" + }, + { + "type": "address", + "value": "0x2e2d821aAb3C7161FB57a7A71369fA3CA0B945A6" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xbf40ad" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xFD356cc838946A8E04a2cB446175D00E55668385" + }, + { + "type": "address", + "value": "0xD4C5499253011F8DE78EA0E3FA23b5562073CD47" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061064d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104df565b60405180910390f35b6100566102e5565b61005e6102e5565b6100666102fd565b61006e610349565b60006040518060a00160405280606781526020016105b1606791398252506040805160208082018352600180835281850192909252928452815180830183526060815260009381018490528251828152808401909352929190816020015b60608152602001906001900390816100cc57505060408051600480825260a08201909252919250600091906020820160808036833701905050905060007379b92764cb72b54ddda4d199e506b3955b242fce905080826000815181106101345761013461059a565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073f501f099388156547afbafcd9d9b3b84f19248ad905080826001815181106101825761018261059a565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073182966ba9867125feb3a773b160161192f90e21e905080826002815181106101d0576101d061059a565b60200260200101906001600160a01b031690816001600160a01b031681525050506000732e2d821aab3c7161fb57a7a71369fa3ca0b945a69050808260038151811061021e5761021e61059a565b60200260200101906001600160a01b031690816001600160a01b0316815250505080826000815181106102535761025361059a565b6020908102919091018101919091529183525062bf40ad60e81b8282015282015261027c610373565b610284610393565b73fd356cc838946a8e04a2cb446175d00e55668385815273d4c5499253011f8de78ea0e3fa23b5562073cd47602082015281526102bf6103b1565b600080825260208083018290526040808401929092528301919091528201528152919050565b60405180602001604052806102f86102fd565b905290565b6040518060600160405280610310610349565b815260200161033c60405180604001604052806060815260200160006001600160e81b03191681525090565b81526020016102f8610373565b6040518060400160405280606081526020016102f860405180602001604052806000151581525090565b6040518060400160405280610386610393565b81526020016102f86103b1565b60405180604001604052806002906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b60006040830182516040855281815180845260608701915060608160051b8801019350602080840193506000805b8381101561045a57898703605f19018552855180518089529084019084890190845b818110156104445783516001600160a01b03168352928601929186019160010161041f565b50909850505094820194938201936001016103fd565b5050958601516001600160e81b0319169690950195909552509392505050565b80518260005b60028110156104a85782516001600160a01b0316825260209283019290910190600101610480565b5050506020808201516040840160005b60038110156104d75782511515825291830191908301906001016104b8565b505050505050565b6000602080835283518182850152805160e060408601528051604061012087015280518061016088015260005b81811015610529578281018601518882016101800152850161050c565b8181111561053c576000610180838a0101525b50601f19601f82011687019150508382015191506101408251151581880152848401519450808783030160608801525061057a6101808201856103cf565b9350505060408101519050610592608085018261047a565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f2020c3a94d6fc3a9f09f9a80c3a9f09f9a8020204d6f20c3a9f09f9a806ff09f9a80c3a9f09f9a80c3a9c3a9c3a92020f09f9a804d4d6f204d6f4dc3a9f09f9a804dc3a96f20f09f9a80206f6f6f4d6f4dc3a94d4df09f9a804dc3a9a264697066735822122097c97cd48792dc63706cb2d99aefddab91b3e33046840c12e9a018c2b2556cf764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_c2221a7d {\n string s_0;\n S_c1053bda s_1;\n }\n\n struct S_c63fbfa7 {\n address[][] s_0;\n bytes3 s_1;\n }\n\n struct S_8a5a76c7 {\n address[2] s_0;\n bool[3] s_1;\n }\n\n struct S_a28cbaeb {\n S_c2221a7d s_0;\n S_c63fbfa7 s_1;\n S_8a5a76c7 s_2;\n }\n\n struct S_7ee64aa7 {\n S_a28cbaeb s_0;\n }\n\n function test () public pure returns (S_7ee64aa7 memory) {\n S_7ee64aa7 memory r;\n {\n S_a28cbaeb memory r_0;\n {\n S_c2221a7d memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀o éMoé🚀é🚀 Mo é🚀o🚀é🚀ééé 🚀MMo MoMé🚀Méo 🚀 oooMoMéMM🚀Mé\";\n r_0_0.s_0 = r_0_0_0;\n }\n {\n S_c1053bda memory r_0_0_1;\n {\n bool r_0_0_1_0 = true;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n S_c63fbfa7 memory r_0_1;\n {\n address[][] memory r_0_1_0 = new address[][](1);\n {\n address[] memory r_0_1_0_0 = new address[](4);\n {\n address r_0_1_0_0_0 = 0x79B92764CB72b54Ddda4D199E506b3955B242Fce;\n r_0_1_0_0[0] = r_0_1_0_0_0;\n }\n {\n address r_0_1_0_0_1 = 0xf501F099388156547AFbAfCD9D9B3b84F19248aD;\n r_0_1_0_0[1] = r_0_1_0_0_1;\n }\n {\n address r_0_1_0_0_2 = 0x182966ba9867125FeB3A773b160161192f90e21e;\n r_0_1_0_0[2] = r_0_1_0_0_2;\n }\n {\n address r_0_1_0_0_3 = 0x2e2d821aAb3C7161FB57a7A71369fA3CA0B945A6;\n r_0_1_0_0[3] = r_0_1_0_0_3;\n }\n r_0_1_0[0] = r_0_1_0_0;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bytes3 r_0_1_1 = bytes3(0xbf40ad);\n r_0_1.s_1 = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_8a5a76c7 memory r_0_2;\n {\n address[2] memory r_0_2_0;\n {\n address r_0_2_0_0 = 0xFD356cc838946A8E04a2cB446175D00E55668385;\n r_0_2_0[0] = r_0_2_0_0;\n }\n {\n address r_0_2_0_1 = 0xD4C5499253011F8DE78EA0E3FA23b5562073CD47;\n r_0_2_0[1] = r_0_2_0_1;\n }\n r_0_2.s_0 = r_0_2_0;\n }\n {\n bool[3] memory r_0_2_1;\n {\n bool r_0_2_1_0 = false;\n r_0_2_1[0] = r_0_2_1_0;\n }\n {\n bool r_0_2_1_1 = false;\n r_0_2_1[1] = r_0_2_1_1;\n }\n {\n bool r_0_2_1_2 = false;\n r_0_2_1[2] = r_0_2_1_2;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000fd356cc838946a8e04a2cb446175d00e55668385000000000000000000000000d4c5499253011f8de78ea0e3fa23b5562073cd470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a806f2020c3a94d6fc3a9f09f9a80c3a9f09f9a8020204d6f20c3a9f09f9a806ff09f9a80c3a9f09f9a80c3a9c3a9c3a92020f09f9a804d4d6f204d6f4dc3a9f09f9a804dc3a96f20f09f9a80206f6f6f4d6f4dc3a94d4df09f9a804dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040bf40ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000079b92764cb72b54ddda4d199e506b3955b242fce000000000000000000000000f501f099388156547afbafcd9d9b3b84f19248ad000000000000000000000000182966ba9867125feb3a773b160161192f90e21e0000000000000000000000002e2d821aab3c7161fb57a7a71369fa3ca0b945a6" + }, + { + "name": "random-(((string,bool),bool,int168[4],int,address),uint,address,bool)", + "type": "(((string,bool),bool,int168[4],int,address),uint,address,bool)", + "value": [ + [ + ["Moo é🚀ooMo éoéoo", true], + false, + [ + "182257502343397621923595023831835421913863027332004", + "-76995432715985414350716043561799595459229357178486", + "175451877806717610530680168920262202171712963183215", + "-41981231158043515535365891121055403694297967257191" + ], + "-15487201295145940105906972926240790548122866833319351483224515400109771122892", + "0x17743d2De6c86a8F005A59b3AF981307DF77Afdf" + ], + "9158823066430658632153917190139912814177223176236030835117573177487489192792", + "0xB032f9CC39B7a99B9d5CF53848523741f45106a6", + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooMo éoéoo" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "182257502343397621923595023831835421913863027332004" + }, + { + "type": "number", + "value": "-76995432715985414350716043561799595459229357178486" + }, + { + "type": "number", + "value": "175451877806717610530680168920262202171712963183215" + }, + { + "type": "number", + "value": "-41981231158043515535365891121055403694297967257191" + } + ] + }, + { + "type": "number", + "value": "-15487201295145940105906972926240790548122866833319351483224515400109771122892" + }, + { + "type": "address", + "value": "0x17743d2De6c86a8F005A59b3AF981307DF77Afdf" + } + ] + }, + { + "type": "number", + "value": "9158823066430658632153917190139912814177223176236030835117573177487489192792" + }, + { + "type": "address", + "value": "0xB032f9CC39B7a99B9d5CF53848523741f45106a6" + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103b6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610287565b60405180910390f35b6100566101ca565b61005e6101ca565b6100666101f8565b6040805180820182526060815260006020808301828152845180860190955260168552754d6f6f20c3a9f09f9a806f6f4d6f20c3a96fc3a96f6f60501b858301529383526001909352908352908201526100be61023d565b747cb4a50f871bfd0403dde0e660599254c45f1a93a481527434aeb29cabe55ee7485e6d2fb5d7955b1a5ccbfe751960208083019190915274780c8e4d4765a6cdf9c4c3fdb9d0a82265d625826f604080840191909152741cb98783171ca416a41b0efbd16289ff324f4c666619606080850191909152848201939093527fddc28e00fdb90b61a4ecff0d28196541624981ba90b6e5ca6e7ac06c1d851734848401527317743d2de6c86a8f005a59b3af981307df77afdf60808501529284527f143fb5cc82b845e7ef1b4d4723986b3ab6206cd8a70dbd5c79cee234b99f53589084015273b032f9cc39b7a99b9d5cf53848523741f45106a691830191909152600190820152919050565b60405180608001604052806101dd6101f8565b81526000602082018190526040820181905260609091015290565b6040805160e08101909152606060a08201908152600060c0830152819081526000602082015260400161022961023d565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b600481101561028157815160140b84526020938401939091019060010161025f565b50505050565b600060208083528351608082850152805161010060a0860152805160406101a08701528051806101e088015260005b818110156102d357828101860151888201610200015285016102b6565b818111156102e6576000610200838a0101525b509184015115156101c087015282840151151560c087015260408301519161031160e088018461025b565b60608401516101608801526080909301516001600160a01b038116610180880152928488015160408801526040880151945061035860608801866001600160a01b03169052565b606088015180151560808901529450601f01601f19169590950161020001969550505050505056fea26469706673582212205330401fadbc5beb3b4c206b6dd0ab616f42b1fb0ef8031d2808582155ecfa2364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fc3be6c5 {\n string s_0;\n bool s_1;\n }\n\n struct S_9bcbd1e0 {\n S_fc3be6c5 s_0;\n bool s_1;\n int168[4] s_2;\n int256 s_3;\n address s_4;\n }\n\n struct S_1b67d9ac {\n S_9bcbd1e0 s_0;\n uint256 s_1;\n address s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_1b67d9ac memory) {\n S_1b67d9ac memory r;\n {\n S_9bcbd1e0 memory r_0;\n {\n S_fc3be6c5 memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀ooMo éoéoo\";\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bool r_0_0_1 = true;\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n int168[4] memory r_0_2;\n {\n int168 r_0_2_0 = 182257502343397621923595023831835421913863027332004;\n r_0_2[0] = r_0_2_0;\n }\n {\n int168 r_0_2_1 = -76995432715985414350716043561799595459229357178486;\n r_0_2[1] = r_0_2_1;\n }\n {\n int168 r_0_2_2 = 175451877806717610530680168920262202171712963183215;\n r_0_2[2] = r_0_2_2;\n }\n {\n int168 r_0_2_3 = -41981231158043515535365891121055403694297967257191;\n r_0_2[3] = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n int r_0_3 = -15487201295145940105906972926240790548122866833319351483224515400109771122892;\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x17743d2De6c86a8F005A59b3AF981307DF77Afdf;\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n uint r_1 = 9158823066430658632153917190139912814177223176236030835117573177487489192792;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xB032f9CC39B7a99B9d5CF53848523741f45106a6;\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080143fb5cc82b845e7ef1b4d4723986b3ab6206cd8a70dbd5c79cee234b99f5358000000000000000000000000b032f9cc39b7a99b9d5cf53848523741f45106a600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cb4a50f871bfd0403dde0e660599254c45f1a93a4ffffffffffffffffffffffcb514d63541aa118b7a192d04a286aa4e5a334018a0000000000000000000000780c8e4d4765a6cdf9c4c3fdb9d0a82265d625826fffffffffffffffffffffffe346787ce8e35be95be4f1042e9d7600cdb0b39999ddc28e00fdb90b61a4ecff0d28196541624981ba90b6e5ca6e7ac06c1d85173400000000000000000000000017743d2de6c86a8f005a59b3af981307df77afdf0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806f6f4d6f20c3a96fc3a96f6f00000000000000000000" + }, + { + "name": "random-((address,address,(bool,bool,bytes11)),int256,address,uint16[4],bool)", + "type": "((address,address,(bool,bool,bytes11)),int256,address,uint16[4],bool)", + "value": [ + [ + "0xBc66563b3ED20DFcDf1161c42770721ccfCb5691", + "0x8d01a6AF4608942AA4e5e21e68ED20cd7aFAEc8f", + [false, true, "0x753b8a11f600410bb3d46d"] + ], + "26463908802460872902983009206546295973605625904713653240739139297623366536688", + "0x6378e6DD593ecCd051Bcc26ED0446aCE29d3AcF0", + ["14739", "16801", "3091", "56816"], + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xBc66563b3ED20DFcDf1161c42770721ccfCb5691" + }, + { + "type": "address", + "value": "0x8d01a6AF4608942AA4e5e21e68ED20cd7aFAEc8f" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x753b8a11f600410bb3d46d" + } + ] + } + ] + }, + { + "type": "number", + "value": "26463908802460872902983009206546295973605625904713653240739139297623366536688" + }, + { + "type": "address", + "value": "0x6378e6DD593ecCd051Bcc26ED0446aCE29d3AcF0" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "14739" + }, + { + "type": "number", + "value": "16801" + }, + { + "type": "number", + "value": "3091" + }, + { + "type": "number", + "value": "56816" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102e1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610221565b60405180910390f35b61005661016d565b61005e61016d565b61009460408051606080820183526000808352602080840182905284519283018552818352820181905281840152909182015290565b73bc66563b3ed20dfcdf1161c42770721ccfcb56918152738d01a6af4608942aa4e5e21e68ed20cd7afaec8f60208083019190915260408051606081018252600081526001818401526a753b8a11f600410bb3d46d60a81b81830152818401529183527f3a820aa5036054499239778dd28169c6717d6edb4a181cecbee428420f7d8df090830152736378e6dd593eccd051bcc26ed0446ace29d3acf09082015261013d6101d6565b61399381526141a16020820152610c13604082015261ddf060608083019190915282015260016080820152919050565b6040518060a001604052806101ae60408051606080820183526000808352602080840182905284519283018552818352820181905281840152909182015290565b815260006020820181905260408201526060016101c96101d6565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b600481101561021b57815161ffff168452602093840193909101906001016101f8565b50505050565b815180516001600160a01b039081168352602080830151821681850152604092830151805115158486015280820151151560608601528301516001600160a81b031916608085015284015160a08401529083015190811660c083015261018082019050606083015161029660e08401826101f4565b5060809290920151151561016091909101529056fea26469706673582212206a0ec0b40f202036510329b16b9f2bc94986da7aac66f37b484335c76994f8e664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0592d0d8 {\n bool s_0;\n bool s_1;\n bytes11 s_2;\n }\n\n struct S_4816f63f {\n address s_0;\n address s_1;\n S_0592d0d8 s_2;\n }\n\n struct S_49409f2e {\n S_4816f63f s_0;\n int256 s_1;\n address s_2;\n uint16[4] s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_49409f2e memory) {\n S_49409f2e memory r;\n {\n S_4816f63f memory r_0;\n {\n address r_0_0 = 0xBc66563b3ED20DFcDf1161c42770721ccfCb5691;\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x8d01a6AF4608942AA4e5e21e68ED20cd7aFAEc8f;\n r_0.s_1 = r_0_1;\n }\n {\n S_0592d0d8 memory r_0_2;\n {\n bool r_0_2_0 = false;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n bool r_0_2_1 = true;\n r_0_2.s_1 = r_0_2_1;\n }\n {\n bytes11 r_0_2_2 = bytes11(0x753b8a11f600410bb3d46d);\n r_0_2.s_2 = r_0_2_2;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n int256 r_1 = 26463908802460872902983009206546295973605625904713653240739139297623366536688;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x6378e6DD593ecCd051Bcc26ED0446aCE29d3AcF0;\n r.s_2 = r_2;\n }\n {\n uint16[4] memory r_3;\n {\n uint16 r_3_0 = 14739;\n r_3[0] = r_3_0;\n }\n {\n uint16 r_3_1 = 16801;\n r_3[1] = r_3_1;\n }\n {\n uint16 r_3_2 = 3091;\n r_3[2] = r_3_2;\n }\n {\n uint16 r_3_3 = 56816;\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n {\n bool r_4 = true;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000bc66563b3ed20dfcdf1161c42770721ccfcb56910000000000000000000000008d01a6af4608942aa4e5e21e68ed20cd7afaec8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001753b8a11f600410bb3d46d0000000000000000000000000000000000000000003a820aa5036054499239778dd28169c6717d6edb4a181cecbee428420f7d8df00000000000000000000000006378e6dd593eccd051bcc26ed0446ace29d3acf0000000000000000000000000000000000000000000000000000000000000399300000000000000000000000000000000000000000000000000000000000041a10000000000000000000000000000000000000000000000000000000000000c13000000000000000000000000000000000000000000000000000000000000ddf00000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-((bool,bytes14,((string[1],address,bool,address,string),address,address)))", + "type": "((bool,bytes14,((string[1],address,bool,address,string),address,address)))", + "value": [ + [ + true, + "0x77c739bd977d62c995b9f11cf737", + [ + [ + ["Moo é🚀 é"], + "0xb36B30853b1f5A530edEeA9056D03aeFF92c5B26", + true, + "0xd08E42d80dc65b94172b3ac7E5000e6E9B52CaA3", + "Moo é🚀o" + ], + "0xaA99207Af9ce0f57400Ae817e8969d6a1935548f", + "0x1352361a93e03ae1fCa369236898db50d892e504" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x77c739bd977d62c995b9f11cf737" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é" + } + ] + }, + { + "type": "address", + "value": "0xb36B30853b1f5A530edEeA9056D03aeFF92c5B26" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xd08E42d80dc65b94172b3ac7E5000e6E9B52CaA3" + }, + { + "type": "string", + "value": "Moo é🚀o" + } + ] + }, + { + "type": "address", + "value": "0xaA99207Af9ce0f57400Ae817e8969d6a1935548f" + }, + { + "type": "address", + "value": "0x1352361a93e03ae1fCa369236898db50d892e504" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103c0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610266565b60405180910390f35b610056610161565b61005e610161565b610066610179565b600181526d77c739bd977d62c995b9f11cf73760901b6020820152610089610194565b6100916101bb565b6100996101f2565b604080518082018252600d81526c4d6f6f20c3a9f09f9a8020c3a960981b60208083019190915290835291835273b36b30853b1f5a530edeea9056d03aeff92c5b268383015260018382015273d08e42d80dc65b94172b3ac7e5000e6e9b52caa3606084015280518082018252600b81526a4d6f6f20c3a9f09f9a806f60a81b81840152608084015291835273aa99207af9ce0f57400ae817e8969d6a1935548f90830152731352361a93e03ae1fca369236898db50d892e504828201528201528152919050565b6040518060200160405280610174610179565b905290565b60408051606081018252600080825260208201529081016101745b60405180606001604052806101a76101bb565b815260006020820181905260409091015290565b6040518060a001604052806101ce6101f2565b81526000602082018190526040820181905260608083019190915260809091015290565b60405180602001604052806001905b60608152602001906001900390816102015790505090565b6000815180845260005b8181101561023f57602081850181015186830182015201610223565b81811115610251576000602083870101525b50601f01601f19169290920160200192915050565b600060208083528351818285015280511515604085015271ffffffffffffffffffffffffffffffffffff198282015116606085015260408101519050606060808501528051606060a08601526101a08501815160a0610100880152818290506101c08801925060005b60018110156102ff5761019f198985030182526102ed848451610219565b935091860191908601906001016102cf565b505050838201516001600160a01b039081166101208801526040830151151561014088015260608301511661016087015260809091015185820360ff19016101808701529061034e8183610219565b938301516001600160a01b03811660c088015293915061036b9050565b60408201516001600160a01b03811660e087015292509594505050505056fea2646970667358221220190a7b9b55edf2b0cc0e2d5c9ab832df49904f19700bdb0c5d4811e8f509cb0764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e199017c {\n string[1] s_0;\n address s_1;\n bool s_2;\n address s_3;\n string s_4;\n }\n\n struct S_311e312b {\n S_e199017c s_0;\n address s_1;\n address s_2;\n }\n\n struct S_7841b607 {\n bool s_0;\n bytes14 s_1;\n S_311e312b s_2;\n }\n\n struct S_f5a87cc4 {\n S_7841b607 s_0;\n }\n\n function test () public pure returns (S_f5a87cc4 memory) {\n S_f5a87cc4 memory r;\n {\n S_7841b607 memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n bytes14 r_0_1 = bytes14(0x77c739bd977d62c995b9f11cf737);\n r_0.s_1 = r_0_1;\n }\n {\n S_311e312b memory r_0_2;\n {\n S_e199017c memory r_0_2_0;\n {\n string[1] memory r_0_2_0_0;\n {\n string memory r_0_2_0_0_0 = unicode\"Moo é🚀 é\";\n r_0_2_0_0[0] = r_0_2_0_0_0;\n }\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n address r_0_2_0_1 = 0xb36B30853b1f5A530edEeA9056D03aeFF92c5B26;\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n {\n bool r_0_2_0_2 = true;\n r_0_2_0.s_2 = r_0_2_0_2;\n }\n {\n address r_0_2_0_3 = 0xd08E42d80dc65b94172b3ac7E5000e6E9B52CaA3;\n r_0_2_0.s_3 = r_0_2_0_3;\n }\n {\n string memory r_0_2_0_4 = unicode\"Moo é🚀o\";\n r_0_2_0.s_4 = r_0_2_0_4;\n }\n r_0_2.s_0 = r_0_2_0;\n }\n {\n address r_0_2_1 = 0xaA99207Af9ce0f57400Ae817e8969d6a1935548f;\n r_0_2.s_1 = r_0_2_1;\n }\n {\n address r_0_2_2 = 0x1352361a93e03ae1fCa369236898db50d892e504;\n r_0_2.s_2 = r_0_2_2;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000177c739bd977d62c995b9f11cf73700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000aa99207af9ce0f57400ae817e8969d6a1935548f0000000000000000000000001352361a93e03ae1fca369236898db50d892e50400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b36b30853b1f5a530edeea9056d03aeff92c5b260000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d08e42d80dc65b94172b3ac7e5000e6e9b52caa300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a8020c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f000000000000000000000000000000000000000000" + }, + { + "name": "random-((bool,bytes16),int80,(int56),(string,address,bool,bytes8,int168),address)", + "type": "((bool,bytes16),int80,(int56),(string,address,bool,bytes8,int168),address)", + "value": [ + [false, "0x547d940576b6684e7577ce48a1b680a7"], + "195275467286069587507060", + ["-31858278206719536"], + [ + "Moo é🚀éoooo🚀🚀ooééMMoMoooéM éMoé🚀oooooooéMo 🚀MoooMéoooéMo🚀M🚀 ", + "0x5ff8345CDa8c3D653E180E91442821F27A305b1f", + false, + "0x948ea2fab7caa578", + "147519962802338650405257059499066995236534275095098" + ], + "0x4b5e519B396158cDC09Af33f981503ba8e5BCE08" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x547d940576b6684e7577ce48a1b680a7" + } + ] + }, + { + "type": "number", + "value": "195275467286069587507060" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-31858278206719536" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoooo🚀🚀ooééMMoMoooéM éMoé🚀oooooooéMo 🚀MoooMéoooéMo🚀M🚀 " + }, + { + "type": "address", + "value": "0x5ff8345CDa8c3D653E180E91442821F27A305b1f" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x948ea2fab7caa578" + }, + { + "type": "number", + "value": "147519962802338650405257059499066995236534275095098" + } + ] + }, + { + "type": "address", + "value": "0x4b5e519B396158cDC09Af33f981503ba8e5BCE08" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610373806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101d4565b60405180910390f35b61005661016d565b61005e61016d565b60408051808201825260008082526f547d940576b6684e7577ce48a1b680a760801b602080840191909152918452692959e77fc2e9be8c7774848301528251808301845266712eef6baac62f19815284840152825160a0810184526060808252928101829052928301819052908201819052608082015260006040518060800160405280605b81526020016102e3605b9139825250735ff8345cda8c3d653e180e91442821f27a305b1f602082015260006040820152671291d45f56f954af60c31b6060808301919091527464efefea25285dde462b71ed6ed8654861399d3a3a60808084019190915290830191909152734b5e519b396158cdc09af33f981503ba8e5bce0890820152919050565b6040805160e081018252600060a080830182815260c084018390528352602080840183905284518082018652838152848601528451918201855260608083529082018390529381018290528084018290526080818101839052938301529181019190915290565b60006020808352835180511515828501526fffffffffffffffffffffffffffffffff1982820151166040850152508084015160090b606084015260408401515160060b6080840152606084015160c060a0850152805160a060e086015280518061018087015260005b8181101561025a578281018501518782016101a00152840161023d565b8181111561026d5760006101a083890101525b50928201516001600160a01b03166101008601526040820151151561012086015260608201516001600160c01b0319166101408601526080820151601481900b6101608701529260808701516001600160a01b03811660c08801529350601f01601f1916949094016101a0019594505050505056fe4d6f6f20c3a9f09f9a80c3a96f6f6f6ff09f9a80f09f9a806f6fc3a9c3a94d4d6f4d6f6f6fc3a94d20c3a94d6fc3a9f09f9a806f6f6f6f6f6f6fc3a94d6f20f09f9a804d6f6f6f4dc3a96f6f6fc3a94d6ff09f9a804df09f9a8020a2646970667358221220c1bd870396894897247c899f9de8991d7ad765f363e82742d99d896ac35e12fe64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ae1e6302 {\n bool s_0;\n bytes16 s_1;\n }\n\n struct S_14df74d1 {\n int56 s_0;\n }\n\n struct S_a80e594b {\n string s_0;\n address s_1;\n bool s_2;\n bytes8 s_3;\n int168 s_4;\n }\n\n struct S_9a5307e2 {\n S_ae1e6302 s_0;\n int80 s_1;\n S_14df74d1 s_2;\n S_a80e594b s_3;\n address s_4;\n }\n\n function test () public pure returns (S_9a5307e2 memory) {\n S_9a5307e2 memory r;\n {\n S_ae1e6302 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n bytes16 r_0_1 = bytes16(0x547d940576b6684e7577ce48a1b680a7);\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n int80 r_1 = 195275467286069587507060;\n r.s_1 = r_1;\n }\n {\n S_14df74d1 memory r_2;\n {\n int56 r_2_0 = -31858278206719536;\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n S_a80e594b memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀éoooo🚀🚀ooééMMoMoooéM éMoé🚀oooooooéMo 🚀MoooMéoooéMo🚀M🚀 \";\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0x5ff8345CDa8c3D653E180E91442821F27A305b1f;\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = false;\n r_3.s_2 = r_3_2;\n }\n {\n bytes8 r_3_3 = bytes8(0x948ea2fab7caa578);\n r_3.s_3 = r_3_3;\n }\n {\n int168 r_3_4 = 147519962802338650405257059499066995236534275095098;\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x4b5e519B396158cDC09Af33f981503ba8e5BCE08;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000547d940576b6684e7577ce48a1b680a700000000000000000000000000000000000000000000000000000000000000000000000000002959e77fc2e9be8c7774ffffffffffffffffffffffffffffffffffffffffffffffffff8ed110945539d000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004b5e519b396158cdc09af33f981503ba8e5bce0800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000005ff8345cda8c3d653e180e91442821f27a305b1f0000000000000000000000000000000000000000000000000000000000000000948ea2fab7caa578000000000000000000000000000000000000000000000000000000000000000000000064efefea25285dde462b71ed6ed8654861399d3a3a000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a80c3a96f6f6f6ff09f9a80f09f9a806f6fc3a9c3a94d4d6f4d6f6f6fc3a94d20c3a94d6fc3a9f09f9a806f6f6f6f6f6f6fc3a94d6f20f09f9a804d6f6f6f4dc3a96f6f6fc3a94d6ff09f9a804df09f9a80200000000000" + }, + { + "name": "random-((bool,int112[2],(address,(uint24),string,bool),bytes6,address),string)", + "type": "((bool,int112[2],(address,(uint24),string,bool),bytes6,address),string)", + "value": [ + [ + false, + ["972942638256654382999419594160444", "23183086320580162713252726095638"], + [ + "0x7A23963f0F1686C549c5E4DA6E8A00e42b5a87A1", + ["2215555"], + "Moo é🚀 M🚀🚀ééM ééo o ooéMM éo🚀oMoMo🚀🚀 M oMo🚀🚀éoé oéoMé🚀oMMM🚀", + true + ], + "0x0b8f305d7c8b", + "0x2e2728011E0Ec8DD860aB173178aD49d372ed93c" + ], + "Moo é🚀o 🚀é🚀oo🚀o é🚀🚀oMo🚀é" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "972942638256654382999419594160444" + }, + { + "type": "number", + "value": "23183086320580162713252726095638" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x7A23963f0F1686C549c5E4DA6E8A00e42b5a87A1" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2215555" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 M🚀🚀ééM ééo o ooéMM éo🚀oMoMo🚀🚀 M oMo🚀🚀éoé oéoMé🚀oMMM🚀" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x0b8f305d7c8b" + }, + { + "type": "address", + "value": "0x2e2728011E0Ec8DD860aB173178aD49d372ed93c" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o 🚀é🚀oo🚀o é🚀🚀oMo🚀é" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610450806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c4565b60405180910390f35b610056610184565b61005e610184565b6100666101a4565b6000815261007261020c565b6d2ff843377dfa25a32285918f393c81526d01249c978b24997f1c9e918cbf166020808301919091528201526100d160408051608081018252600080825282516020808201855282825283015260609282018390529181019190915290565b737a23963f0f1686c549c5e4da6e8a00e42b5a87a1815260408051602080820183526221ce83825280840191909152815160a0810190925260648083526000929161038490830139604080840191909152600160608085019190915284820193909352650b8f305d7c8b60d01b84840152732e2728011e0ec8dd860ab173178ad49d372ed93c60808501529284525081519081019091526033808252600091906103e86020830139602083015250919050565b60405180604001604052806101976101a4565b8152602001606081525090565b6040518060a001604052806000151581526020016101c061020c565b81526020016101f860408051608081018252600080825282516020808201855282825283015260609282018390529181019190915290565b815260006020820181905260409091015290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561025057602081850181015186830182015201610234565b81811115610262576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b03815116825262ffffff60208201515116602083015260006040820151608060408501526102ae608085018261022a565b6060938401511515949093019390935250919050565b600060208083528351604082850152805115156060850152818101516080850160005b6002811015610307578251600d0b825291840191908401906001016102e7565b505050604081015160c080860152610323610120860182610277565b9050606082015161034060e08701826001600160d01b0319169052565b506080820151915061035e6101008601836001600160a01b03169052565b91850151848303601f1901604086015291610379818461022a565b969550505050505056fe4d6f6f20c3a9f09f9a80204df09f9a80f09f9a80c3a9c3a94d20c3a9c3a96f206f206f6fc3a94d4d20c3a96ff09f9a806f4d6f4d6ff09f9a80f09f9a80204d206f4d6ff09f9a80f09f9a80c3a96fc3a9206fc3a96f4dc3a9f09f9a806f4d4d4df09f9a804d6f6f20c3a9f09f9a806f202020f09f9a80c3a9f09f9a806f6ff09f9a806f20c3a9f09f9a80f09f9a806f4d6ff09f9a80c3a9a26469706673582212201ce73fa2167d0e448ecddeddcb4d6760c9581ad2612325d44526bd082f7a24a464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5f492329 {\n uint24 s_0;\n }\n\n struct S_cde739cf {\n address s_0;\n S_5f492329 s_1;\n string s_2;\n bool s_3;\n }\n\n struct S_9f4d0871 {\n bool s_0;\n int112[2] s_1;\n S_cde739cf s_2;\n bytes6 s_3;\n address s_4;\n }\n\n struct S_a994e943 {\n S_9f4d0871 s_0;\n string s_1;\n }\n\n function test () public pure returns (S_a994e943 memory) {\n S_a994e943 memory r;\n {\n S_9f4d0871 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n int112[2] memory r_0_1;\n {\n int112 r_0_1_0 = 972942638256654382999419594160444;\n r_0_1[0] = r_0_1_0;\n }\n {\n int112 r_0_1_1 = 23183086320580162713252726095638;\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_cde739cf memory r_0_2;\n {\n address r_0_2_0 = 0x7A23963f0F1686C549c5E4DA6E8A00e42b5a87A1;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n S_5f492329 memory r_0_2_1;\n {\n uint24 r_0_2_1_0 = 2215555;\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n {\n string memory r_0_2_2 = unicode\"Moo é🚀 M🚀🚀ééM ééo o ooéMM éo🚀oMoMo🚀🚀 M oMo🚀🚀éoé oéoMé🚀oMMM🚀\";\n r_0_2.s_2 = r_0_2_2;\n }\n {\n bool r_0_2_3 = true;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n bytes6 r_0_3 = bytes6(0x0b8f305d7c8b);\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x2e2728011E0Ec8DD860aB173178aD49d372ed93c;\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀o 🚀é🚀oo🚀o é🚀🚀oMo🚀é\";\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ff843377dfa25a32285918f393c00000000000000000000000000000000000001249c978b24997f1c9e918cbf1600000000000000000000000000000000000000000000000000000000000000c00b8f305d7c8b00000000000000000000000000000000000000000000000000000000000000000000000000002e2728011e0ec8dd860ab173178ad49d372ed93c0000000000000000000000007a23963f0f1686c549c5e4da6e8a00e42b5a87a1000000000000000000000000000000000000000000000000000000000021ce830000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a80204df09f9a80f09f9a80c3a9c3a94d20c3a9c3a96f206f206f6fc3a94d4d20c3a96ff09f9a806f4d6f4d6ff09f9a80f09f9a80204d206f4d6ff09f9a80f09f9a80c3a96fc3a9206fc3a96f4dc3a9f09f9a806f4d4d4df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a806f202020f09f9a80c3a9f09f9a806f6ff09f9a806f20c3a9f09f9a80f09f9a806f4d6ff09f9a80c3a900000000000000000000000000" + }, + { + "name": "random-((bytes16,address[4],address[]),bytes4,string,(address,bytes29,uint128))", + "type": "((bytes16,address[4],address[]),bytes4,string,(address,bytes29,uint128))", + "value": [ + [ + "0x93f23991e2523053aaf85ffe34d15a0f", + [ + "0x30248A08800239fE2eD2210e53B4AA703D2E3d92", + "0xF6E9b5aBc6fd17036df499103DED94351b60cC75", + "0x62e88Bb492fF46d24895c88785DDB5E9869DA0DF", + "0x0Af104958F40c15Cdc770a8B7FE03312fCd1Ac34" + ], + [ + "0x18763B03aE587A6D794Fab827d0a90Cb0Ec04a02", + "0x8A5D9E1bEC8fA8Aff972584F410658Cdf512119C", + "0x9A1Ee16996511EA971Ff4C22Fc4E79dfF7284998" + ] + ], + "0x9cc0874b", + "Moo é🚀 oo🚀Mo", + [ + "0x5E8777Ad5fA50AFc76F59205C95a00F244015AEF", + "0xad98d26d271af86d6bad4f4fdd0823aee789b650757333b1ccfd04588c", + "151327265776043193789488881800184450873" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x93f23991e2523053aaf85ffe34d15a0f" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x30248A08800239fE2eD2210e53B4AA703D2E3d92" + }, + { + "type": "address", + "value": "0xF6E9b5aBc6fd17036df499103DED94351b60cC75" + }, + { + "type": "address", + "value": "0x62e88Bb492fF46d24895c88785DDB5E9869DA0DF" + }, + { + "type": "address", + "value": "0x0Af104958F40c15Cdc770a8B7FE03312fCd1Ac34" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x18763B03aE587A6D794Fab827d0a90Cb0Ec04a02" + }, + { + "type": "address", + "value": "0x8A5D9E1bEC8fA8Aff972584F410658Cdf512119C" + }, + { + "type": "address", + "value": "0x9A1Ee16996511EA971Ff4C22Fc4E79dfF7284998" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x9cc0874b" + }, + { + "type": "string", + "value": "Moo é🚀 oo🚀Mo" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5E8777Ad5fA50AFc76F59205C95a00F244015AEF" + }, + { + "type": "hexstring", + "value": "0xad98d26d271af86d6bad4f4fdd0823aee789b650757333b1ccfd04588c" + }, + { + "type": "number", + "value": "151327265776043193789488881800184450873" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104f8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610389565b60405180910390f35b6100566102a8565b61005e6102a8565b6100666102f6565b6f93f23991e2523053aaf85ffe34d15a0f60801b815261008461031e565b7330248a08800239fe2ed2210e53b4aa703d2e3d92815273f6e9b5abc6fd17036df499103ded94351b60cc756020808301919091527362e88bb492ff46d24895c88785ddb5e9869da0df604080840191909152730af104958f40c15cdc770a8b7fe03312fcd1ac34606084015290830191909152805160038082526080820190925260009181602001602082028036833701905050905060007318763b03ae587a6d794fab827d0a90cb0ec04a0290508082600081518110610148576101486104ac565b60200260200101906001600160a01b031690816001600160a01b031681525050506000738a5d9e1bec8fa8aff972584f410658cdf512119c90508082600181518110610196576101966104ac565b60200260200101906001600160a01b031690816001600160a01b031681525050506000739a1ee16996511ea971ff4c22fc4e79dff7284998905080826002815181106101e4576101e46104ac565b6001600160a01b039290921660209283029190910182015260408481019390935292845250639cc0874b60e01b838301528051808201825260138152724d6f6f20c3a9f09f9a80206f6ff09f9a804d6f60681b8184015283820152805160608082018352735e8777ad5fa50afc76f59205c95a00f244015aef82527fad98d26d271af86d6bad4f4fdd0823aee789b650757333b1ccfd04588c000000938201939093526f71d8923dd5da3adba4c97d837df9cf399181019190915290820152919050565b60405180608001604052806102bb6102f6565b815260006020820152606060408201819052016102f1604080516060810182526000808252602082018190529181019190915290565b905290565b6040805160608101909152600081526020810161031161031e565b8152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b8181101561036257602081850181015186830182015201610346565b81811115610374576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835160c0828501526101a084016001600160801b031982511660e086015282820151610100860160005b60048110156103e05782516001600160a01b0316825291850191908501906001016103ba565b5050506040919091015160c06101808601528051918290528201906000906101c08601905b8083101561042e5783516001600160a01b03168252928401926001929092019190840190610405565b50928601516001600160e01b031981166040870152926040870151868203601f190160608801529350610461818561033c565b935050505060608401516104a4608085018280516001600160a01b0316825260208082015162ffffff1916908301526040908101516001600160801b0316910152565b509392505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212205a802c0b40fa14308387432cbd5c22197a2d1c1727fdc94ce32261ca730f3cf264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6ea8c27f {\n bytes16 s_0;\n address[4] s_1;\n address[] s_2;\n }\n\n struct S_0ff42d27 {\n address s_0;\n bytes29 s_1;\n uint128 s_2;\n }\n\n struct S_2f9b5c33 {\n S_6ea8c27f s_0;\n bytes4 s_1;\n string s_2;\n S_0ff42d27 s_3;\n }\n\n function test () public pure returns (S_2f9b5c33 memory) {\n S_2f9b5c33 memory r;\n {\n S_6ea8c27f memory r_0;\n {\n bytes16 r_0_0 = bytes16(0x93f23991e2523053aaf85ffe34d15a0f);\n r_0.s_0 = r_0_0;\n }\n {\n address[4] memory r_0_1;\n {\n address r_0_1_0 = 0x30248A08800239fE2eD2210e53B4AA703D2E3d92;\n r_0_1[0] = r_0_1_0;\n }\n {\n address r_0_1_1 = 0xF6E9b5aBc6fd17036df499103DED94351b60cC75;\n r_0_1[1] = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x62e88Bb492fF46d24895c88785DDB5E9869DA0DF;\n r_0_1[2] = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x0Af104958F40c15Cdc770a8B7FE03312fCd1Ac34;\n r_0_1[3] = r_0_1_3;\n }\n r_0.s_1 = r_0_1;\n }\n {\n address[] memory r_0_2 = new address[](3);\n {\n address r_0_2_0 = 0x18763B03aE587A6D794Fab827d0a90Cb0Ec04a02;\n r_0_2[0] = r_0_2_0;\n }\n {\n address r_0_2_1 = 0x8A5D9E1bEC8fA8Aff972584F410658Cdf512119C;\n r_0_2[1] = r_0_2_1;\n }\n {\n address r_0_2_2 = 0x9A1Ee16996511EA971Ff4C22Fc4E79dfF7284998;\n r_0_2[2] = r_0_2_2;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bytes4 r_1 = bytes4(0x9cc0874b);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀 oo🚀Mo\";\n r.s_2 = r_2;\n }\n {\n S_0ff42d27 memory r_3;\n {\n address r_3_0 = 0x5E8777Ad5fA50AFc76F59205C95a00F244015AEF;\n r_3.s_0 = r_3_0;\n }\n {\n bytes29 r_3_1 = bytes29(0xad98d26d271af86d6bad4f4fdd0823aee789b650757333b1ccfd04588c);\n r_3.s_1 = r_3_1;\n }\n {\n uint128 r_3_2 = 151327265776043193789488881800184450873;\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c09cc0874b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000005e8777ad5fa50afc76f59205c95a00f244015aefad98d26d271af86d6bad4f4fdd0823aee789b650757333b1ccfd04588c0000000000000000000000000000000000000071d8923dd5da3adba4c97d837df9cf3993f23991e2523053aaf85ffe34d15a0f0000000000000000000000000000000000000000000000000000000030248a08800239fe2ed2210e53b4aa703d2e3d92000000000000000000000000f6e9b5abc6fd17036df499103ded94351b60cc7500000000000000000000000062e88bb492ff46d24895c88785ddb5e9869da0df0000000000000000000000000af104958f40c15cdc770a8b7fe03312fcd1ac3400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000018763b03ae587a6d794fab827d0a90cb0ec04a020000000000000000000000008a5d9e1bec8fa8aff972584f410658cdf512119c0000000000000000000000009a1ee16996511ea971ff4c22fc4e79dff728499800000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80206f6ff09f9a804d6f00000000000000000000000000" + }, + { + "name": "random-((string,(string,uint112,address),string,bytes13),string,bytes13,bytes13[1])", + "type": "((string,(string,uint112,address),string,bytes13),string,bytes13,bytes13[1])", + "value": [ + [ + "Moo é🚀", + [ + "Moo é🚀🚀M🚀o 🚀🚀é🚀é🚀oé 🚀 ooéoo🚀 Méoo", + "5145220266057505257747033141493505", + "0x2b597162B29360586B084f2C35d0264016821274" + ], + "Moo é🚀o🚀 M🚀🚀 MMooé🚀🚀 éM o o🚀oMooooé🚀oM 🚀", + "0x54ea5bd4bf3e148ead466d343a" + ], + "Moo é🚀 🚀oéoM🚀oMéo Mo🚀é", + "0x49f4bb3aeb4ff67be146fe4b85", + ["0xbc26b1663fea439e81bad8d7d1"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀M🚀o 🚀🚀é🚀é🚀oé 🚀 ooéoo🚀 Méoo" + }, + { + "type": "number", + "value": "5145220266057505257747033141493505" + }, + { + "type": "address", + "value": "0x2b597162B29360586B084f2C35d0264016821274" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀 M🚀🚀 MMooé🚀🚀 éM o o🚀oMooooé🚀oM 🚀" + }, + { + "type": "hexstring", + "value": "0x54ea5bd4bf3e148ead466d343a" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀oéoM🚀oMéo Mo🚀é" + }, + { + "type": "hexstring", + "value": "0x49f4bb3aeb4ff67be146fe4b85" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbc26b1663fea439e81bad8d7d1" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102b1565b60405180910390f35b610056610197565b61005e610197565b6100666101ca565b604080518082018252600a8152689adede418753e13f3560b71b60208083019190915290835281516060808201845281526000918101829052918201526000604051806080016040528060438152602001610406604391398252506dfdadcf5365cf9dd4792450333f01602080830191909152732b597162b29360586b084f2c35d0264016821274604080840191909152838201929092528151608081019092526047808352600092916103bf908301396040808401919091526c2a752dea5f9f0a4756a3369a1d60991b606080850191909152928452805192830190525060268082526000919061044960208301396020830152506c49f4bb3aeb4ff67be146fe4b8560981b604082015261017a610213565b6cbc26b1663fea439e81bad8d7d160981b81526060820152919050565b60405180608001604052806101aa6101ca565b815260606020820181905260006040830152016101c5610213565b905290565b6040518060800160405280606081526020016101ff604080516060808201835281526000602082018190529181019190915290565b815260606020820152600060409091015290565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156102575760208185018101518683018201520161023b565b81811115610269576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60018110156102ab5781516001600160981b031916845260209384019390910190600101610282565b50505050565b6000602080835283516080828501528051608060a08601526102d7610120860182610231565b905082820151609f19808784030160c08801528151606084526102fd6060850182610231565b838701516dffffffffffffffffffffffffffff16858801526040808501516001600160a01b03169581019590955293850151888503830160e08a01529390506103468185610231565b9350505050606082015191506103696101008601836001600160981b0319169052565b91850151848303601f19016040860152916103848184610231565b9250505060408401516103a360608501826001600160981b0319169052565b5060608401516103b6608085018261027e565b50939250505056fe4d6f6f20c3a9f09f9a806ff09f9a80204df09f9a80f09f9a80204d4d6f6fc3a9f09f9a80f09f9a8020c3a94d206f206ff09f9a806f4d6f6f6f6fc3a9f09f9a806f4d20f09f9a804d6f6f20c3a9f09f9a80f09f9a804df09f9a806f20f09f9a80f09f9a80c3a9f09f9a80c3a9f09f9a806fc3a920f09f9a8020206f6fc3a96f6ff09f9a80204dc3a96f6f4d6f6f20c3a9f09f9a8020f09f9a806fc3a96f4df09f9a806f4dc3a96f204d6ff09f9a80c3a9a26469706673582212204069c0e01049b7840cb0dedbaa465722e9b1afb27d19189a1e57a77871aada9964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c8ea8146 {\n string s_0;\n uint112 s_1;\n address s_2;\n }\n\n struct S_2b4507fb {\n string s_0;\n S_c8ea8146 s_1;\n string s_2;\n bytes13 s_3;\n }\n\n struct S_8a28d922 {\n S_2b4507fb s_0;\n string s_1;\n bytes13 s_2;\n bytes13[1] s_3;\n }\n\n function test () public pure returns (S_8a28d922 memory) {\n S_8a28d922 memory r;\n {\n S_2b4507fb memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0.s_0 = r_0_0;\n }\n {\n S_c8ea8146 memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀🚀M🚀o 🚀🚀é🚀é🚀oé 🚀 ooéoo🚀 Méoo\";\n r_0_1.s_0 = r_0_1_0;\n }\n {\n uint112 r_0_1_1 = 5145220266057505257747033141493505;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x2b597162B29360586B084f2C35d0264016821274;\n r_0_1.s_2 = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀o🚀 M🚀🚀 MMooé🚀🚀 éM o o🚀oMooooé🚀oM 🚀\";\n r_0.s_2 = r_0_2;\n }\n {\n bytes13 r_0_3 = bytes13(0x54ea5bd4bf3e148ead466d343a);\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 🚀oéoM🚀oMéo Mo🚀é\";\n r.s_1 = r_1;\n }\n {\n bytes13 r_2 = bytes13(0x49f4bb3aeb4ff67be146fe4b85);\n r.s_2 = r_2;\n }\n {\n bytes13[1] memory r_3;\n {\n bytes13 r_3_0 = bytes13(0xbc26b1663fea439e81bad8d7d1);\n r_3[0] = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a049f4bb3aeb4ff67be146fe4b8500000000000000000000000000000000000000bc26b1663fea439e81bad8d7d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001a054ea5bd4bf3e148ead466d343a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000fdadcf5365cf9dd4792450333f010000000000000000000000002b597162b29360586b084f2c35d026401682127400000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80f09f9a804df09f9a806f20f09f9a80f09f9a80c3a9f09f9a80c3a9f09f9a806fc3a920f09f9a8020206f6fc3a96f6ff09f9a80204dc3a96f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a806ff09f9a80204df09f9a80f09f9a80204d4d6f6fc3a9f09f9a80f09f9a8020c3a94d206f206ff09f9a806f4d6f6f6f6fc3a9f09f9a806f4d20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a8020f09f9a806fc3a96f4df09f9a806f4dc3a96f204d6ff09f9a80c3a90000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((string,bytes6,(address,string,bool,int16,address)),string,address,string)", + "type": "((string,bytes6,(address,string,bool,int16,address)),string,address,string)", + "value": [ + [ + "Moo é🚀 M o🚀oéMé", + "0x6ccab81d27d0", + [ + "0x9c6aEAA2E40f694c840b3a762dc9b0951E559832", + "Moo é🚀o éo ooo🚀o🚀MoéM🚀Moéé oo", + true, + "-31960", + "0x5Dd9237Ba05e9bF860F3458155164b27FEb6184b" + ] + ], + "Moo é🚀oéMo oMoéM 🚀oéé🚀éé oMoéé ", + "0x674e30D7F77d49CD7210B5F631160b61b79fDD9c", + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M o🚀oéMé" + }, + { + "type": "hexstring", + "value": "0x6ccab81d27d0" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9c6aEAA2E40f694c840b3a762dc9b0951E559832" + }, + { + "type": "string", + "value": "Moo é🚀o éo ooo🚀o🚀MoéM🚀Moéé oo" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-31960" + }, + { + "type": "address", + "value": "0x5Dd9237Ba05e9bF860F3458155164b27FEb6184b" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oéMo oMoéM 🚀oéé🚀éé oMoéé " + }, + { + "type": "address", + "value": "0x674e30D7F77d49CD7210B5F631160b61b79fDD9c" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061043d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102a6565b60405180910390f35b6100566101f0565b61005e6101f0565b6100a3604080516060808201835280825260006020808401829052845160a0810186528281529081018390528085018290529182018190526080820152909182015290565b604080518082018252601881527f4d6f6f20c3a9f09f9a80204d206ff09f9a806fc3a94dc3a900000000000000006020808301919091529083526506ccab81d27d60d41b83820152815160a0810183526060818301819052600082850181905281830181905260808301819052739c6aeaa2e40f694c840b3a762dc9b0951e55983283528451918201909452602f8082529193929091906103d9908301396020808401919091526001604080850191909152617cd719606080860191909152735dd9237ba05e9bf860f3458155164b27feb6184b60808601528582019490945293855283519283019093525060318082526000926103a89083013960208084019190915273674e30d7f77d49cd7210b5f631160b61b79fdd9c6040808501919091528051808201909152600a8152689adede418753e13f3560b71b91810191909152606083015250919050565b6040518060800160405280610240604080516060808201835280825260006020808401829052845160a0810186528281529081018390528085018290529182018190526080820152909182015290565b8152606060208201819052600060408301529081015290565b6000815180845260005b8181101561027f57602081850181015186830182015201610263565b81811115610291576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516080828501528051606060a08601526102cc610100860182610259565b828401516001600160d01b03191660c0870152604090920151858303609f190160e087015280516001600160a01b0390811684528185015160a086860181905292949350909161031e90840182610259565b9050604084015115156040840152606084015160010b6060840152816080850151166080840152848801519450601f199350838782030160408801526103648186610259565b9450505050604085015161038360608601826001600160a01b03169052565b5060608501518185840301608086015261039d8382610259565b969550505050505056fe4d6f6f20c3a9f09f9a806fc3a94d6f206f4d6fc3a94d20f09f9a806fc3a9c3a9f09f9a80c3a9c3a9206f4d6fc3a9c3a9204d6f6f20c3a9f09f9a806f2020c3a96f206f6f6ff09f9a806ff09f9a804d6fc3a94df09f9a804d6fc3a9c3a9206f6fa264697066735822122040fbd6de91d5b3e274c31a6e6691640ee96891d9240083605eab40b3323005aa64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2493425f {\n address s_0;\n string s_1;\n bool s_2;\n int16 s_3;\n address s_4;\n }\n\n struct S_5e102375 {\n string s_0;\n bytes6 s_1;\n S_2493425f s_2;\n }\n\n struct S_9d7e961f {\n S_5e102375 s_0;\n string s_1;\n address s_2;\n string s_3;\n }\n\n function test () public pure returns (S_9d7e961f memory) {\n S_9d7e961f memory r;\n {\n S_5e102375 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀 M o🚀oéMé\";\n r_0.s_0 = r_0_0;\n }\n {\n bytes6 r_0_1 = bytes6(0x6ccab81d27d0);\n r_0.s_1 = r_0_1;\n }\n {\n S_2493425f memory r_0_2;\n {\n address r_0_2_0 = 0x9c6aEAA2E40f694c840b3a762dc9b0951E559832;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀o éo ooo🚀o🚀MoéM🚀Moéé oo\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n bool r_0_2_2 = true;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n int16 r_0_2_3 = -31960;\n r_0_2.s_3 = r_0_2_3;\n }\n {\n address r_0_2_4 = 0x5Dd9237Ba05e9bF860F3458155164b27FEb6184b;\n r_0_2.s_4 = r_0_2_4;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oéMo oMoéM 🚀oéé🚀éé oMoéé \";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x674e30D7F77d49CD7210B5F631160b61b79fDD9c;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000220000000000000000000000000674e30d7f77d49cd7210b5f631160b61b79fdd9c000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000606ccab81d27d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80204d206ff09f9a806fc3a94dc3a900000000000000000000000000000000000000009c6aeaa2e40f694c840b3a762dc9b0951e55983200000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83280000000000000000000000005dd9237ba05e9bf860f3458155164b27feb6184b000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a806f2020c3a96f206f6f6ff09f9a806ff09f9a804d6fc3a94df09f9a804d6fc3a9c3a9206f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806fc3a94d6f206f4d6fc3a94d20f09f9a806fc3a9c3a9f09f9a80c3a9c3a9206f4d6fc3a9c3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-((uint16,bool,(address,string,bool),bytes2),(address,address,address,string))", + "type": "((uint16,bool,(address,string,bool),bytes2),(address,address,address,string))", + "value": [ + [ + "63228", + false, + ["0x576996334F430EB66B1aEa70F9b2CE5E2785C9D9", "Moo é🚀o🚀🚀🚀ooo 🚀", true], + "0x7278" + ], + [ + "0x827bCB41156e8179edDcdB0545dfd9494814043b", + "0xa81572Eb09dB09cD20753e03D455ee1F7a9068BB", + "0xAC1d7A6b1950a9882c7ecc9030f17513009B6a6b", + "Moo é🚀" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "63228" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x576996334F430EB66B1aEa70F9b2CE5E2785C9D9" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀🚀ooo 🚀" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x7278" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x827bCB41156e8179edDcdB0545dfd9494814043b" + }, + { + "type": "address", + "value": "0xa81572Eb09dB09cD20753e03D455ee1F7a9068BB" + }, + { + "type": "address", + "value": "0xAC1d7A6b1950a9882c7ecc9030f17513009B6a6b" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061037d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610298565b60405180910390f35b61005661016b565b61005e61016b565b6100666101a7565b61f6fc815260006020808301829052604080516060808201835281840181815282840195865273576996334f430eb66b1aea70f9b2ce5e2785c9d9835283518085018552601f81527f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80f09f9a806f6f6f20f09f9a8000818701529052600190945281850152610e4f60f31b83850152928452825160808101845280830192835273827bcb41156e8179eddcdb0545dfd9494814043b815273a81572eb09db09cd20753e03d455ee1f7a9068bb8183015273ac1d7a6b1950a9882c7ecc9030f17513009b6a6b818501528351808501909452600a8452689adede418753e13f3560b71b8483015292909152820152919050565b604051806040016040528061017e6101a7565b815260408051608081018252600080825260208281018290529282015260608082015291015290565b6040518060800160405280600061ffff1681526020016000151581526020016101f5604051806060016040528060006001600160a01b03168152602001606081526020016000151581525090565b8152600060209091015290565b6000815180845260005b818110156102285760208185018101518683018201520161020c565b8181111561023a576000602083870101525b50601f01601f19169290920160200192915050565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151608060608501526102906080850182610202565b949350505050565b60208152600082516040602084015261ffff81511660608401526020810151151560808401526040810151608060a085015260018060a01b0381511660e0850152602081015160606101008601526102f4610140860182610202565b9050604082015115156101208601526060830151925061032060c08601846001600160f01b0319169052565b6020860151858203601f19016040870152925061033d818461024f565b969550505050505056fea26469706673582212204b5e0fe4dd67e4c7268d3e63fa2043eabbd708558c7fc77731393831273eaffb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fa5560ff {\n address s_0;\n string s_1;\n bool s_2;\n }\n\n struct S_ccd3e6ca {\n uint16 s_0;\n bool s_1;\n S_fa5560ff s_2;\n bytes2 s_3;\n }\n\n struct S_5b55e5c6 {\n address s_0;\n address s_1;\n address s_2;\n string s_3;\n }\n\n struct S_010bde35 {\n S_ccd3e6ca s_0;\n S_5b55e5c6 s_1;\n }\n\n function test () public pure returns (S_010bde35 memory) {\n S_010bde35 memory r;\n {\n S_ccd3e6ca memory r_0;\n {\n uint16 r_0_0 = 63228;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n S_fa5560ff memory r_0_2;\n {\n address r_0_2_0 = 0x576996334F430EB66B1aEa70F9b2CE5E2785C9D9;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀o🚀🚀🚀ooo 🚀\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n bool r_0_2_2 = true;\n r_0_2.s_2 = r_0_2_2;\n }\n r_0.s_2 = r_0_2;\n }\n {\n bytes2 r_0_3 = bytes2(0x7278);\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n S_5b55e5c6 memory r_1;\n {\n address r_1_0 = 0x827bCB41156e8179edDcdB0545dfd9494814043b;\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0xa81572Eb09dB09cD20753e03D455ee1F7a9068BB;\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0xAC1d7A6b1950a9882c7ecc9030f17513009B6a6b;\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀\";\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000f6fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000807278000000000000000000000000000000000000000000000000000000000000000000000000000000000000576996334f430eb66b1aea70f9b2ce5e2785c9d900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80f09f9a806f6f6f20f09f9a8000000000000000000000000000827bcb41156e8179eddcdb0545dfd9494814043b000000000000000000000000a81572eb09db09cd20753e03d455ee1f7a9068bb000000000000000000000000ac1d7a6b1950a9882c7ecc9030f17513009b6a6b0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,(int,(uint168,string,address,address),address,string[4]),address)", + "type": "(address,(int,(uint168,string,address,address),address,string[4]),address)", + "value": [ + "0xaBE7bC7c69FdE02dd826eA4C1b0DEc9f4E0450C4", + [ + "32965126527682706427426108139671410138024208463999789235608431142757895827110", + [ + "180275248772760063746601044319196330010035058826324", + "Moo é🚀🚀🚀é ooMoM🚀🚀oooo🚀M é🚀MMé🚀 🚀 o🚀M🚀oéo🚀MoMéM🚀oooM", + "0x664F8b18C384F1dD5fEE516ef93BaB96E22b41B6", + "0x83BF0899458e7e001F1AF90B44731bCeeb4DEf41" + ], + "0xC373A9067f29b8e1658Bc88E6DeAaD333321a3a5", + [ + "Moo é🚀Moooéo MMoéooo", + "Moo é🚀M M🚀o🚀éooMo🚀🚀oM oooo🚀oo🚀Mo", + "Moo é🚀oMo🚀🚀éo🚀MM éééMé oé 🚀oé 🚀o🚀oééMMMo", + "Moo é🚀🚀o🚀 éé🚀é 🚀o🚀oéoo" + ] + ], + "0xADf003d0A7830aF90c2E3973790642596Bc9C343" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xaBE7bC7c69FdE02dd826eA4C1b0DEc9f4E0450C4" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "32965126527682706427426108139671410138024208463999789235608431142757895827110" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "180275248772760063746601044319196330010035058826324" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀é ooMoM🚀🚀oooo🚀M é🚀MMé🚀 🚀 o🚀M🚀oéo🚀MoMéM🚀oooM" + }, + { + "type": "address", + "value": "0x664F8b18C384F1dD5fEE516ef93BaB96E22b41B6" + }, + { + "type": "address", + "value": "0x83BF0899458e7e001F1AF90B44731bCeeb4DEf41" + } + ] + }, + { + "type": "address", + "value": "0xC373A9067f29b8e1658Bc88E6DeAaD333321a3a5" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Moooéo MMoéooo" + }, + { + "type": "string", + "value": "Moo é🚀M M🚀o🚀éooMo🚀🚀oM oooo🚀oo🚀Mo" + }, + { + "type": "string", + "value": "Moo é🚀oMo🚀🚀éo🚀MM éééMé oé 🚀oé 🚀o🚀oééMMMo" + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀 éé🚀é 🚀o🚀oéoo" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xADf003d0A7830aF90c2E3973790642596Bc9C343" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610581806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610362565b60405180910390f35b61005661022e565b61005e61022e565b73abe7bc7c69fde02dd826ea4c1b0dec9f4e0450c4815261007d61025e565b7f48e199b4bf27951586940c64513bbd96b21f135f243a0ba55a8184b70b3ceea681526040805160808082018352606060208084018290526000848601819052828501819052747b596dbc81a7a9cdd514e01e8c0c5ea6e645eedc548552855193840190955281835292939261043f9083013960208084019190915273664f8b18c384f1dd5fee516ef93bab96e22b41b66040808501919091527383bf0899458e7e001f1af90b44731bceeb4def416060850152908401929092525073c373a9067f29b8e1658bc88e6deaad333321a3a59082015261015a6102a9565b604080518082018252601a81527f4d6f6f20c3a9f09f9a804d6f6f6fc3a96f204d4d6fc3a96f6f6f00000000000060208083019190915290835281516060810190925260378083526000929161049f9083013990508082600160200201819052505060006040518060800160405280604981526020016104d660499139604080840191909152805160608101909152602d8082526000925061051f602083013960608084019190915283019190915250602082015273adf003d0a7830af90c2e3973790642596bc9c3436040820152919050565b604051806060016040528060006001600160a01b0316815260200161025161025e565b8152600060209091015290565b60408051608080820183526000808352835191820184528082526060602083810182905294830182905282015290918201908152600060208201526040016102a46102a9565b905290565b60405180608001604052806004905b60608152602001906001900390816102b85790505090565b6000815180845260005b818110156102f6576020818501810151868301820152016102da565b81811115610308576000602083870101525b50601f01601f19169290920160200192915050565b600082608081018360005b60048110156103575783830387526103418383516102d0565b6020978801979093509190910190600101610328565b509095945050505050565b60208152600060018060a01b03808451166020840152602084015160606040850152805160808501526020810151608060a086015260018060a81b03815116610100860152602081015160806101208701526103c26101808701826102d0565b90508360408301511661014087015283606083015116610160870152604083015193506103fa60c08701856001600160a01b03169052565b6060830151868203607f190160e08801529350610417818561031d565b9350505050604084015161043660608501826001600160a01b03169052565b50939250505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a9206f6f4d6f4df09f9a80f09f9a806f6f6f6ff09f9a804d20c3a9f09f9a804d4dc3a9f09f9a8020f09f9a80206ff09f9a804df09f9a806fc3a96ff09f9a804d6f4dc3a94df09f9a806f6f6f4d4d6f6f20c3a9f09f9a804d204df09f9a806ff09f9a80c3a96f6f4d6ff09f9a80f09f9a806f4d206f6f6f6ff09f9a806f6ff09f9a804d6f4d6f6f20c3a9f09f9a806f4d6ff09f9a80f09f9a80c3a96ff09f9a804d4d20c3a9c3a9c3a94dc3a9206fc3a9202020f09f9a806fc3a920f09f9a806ff09f9a806fc3a9c3a94d4d4d6f4d6f6f20c3a9f09f9a80f09f9a806ff09f9a8020c3a9c3a9f09f9a80c3a920f09f9a806ff09f9a806fc3a96f6fa2646970667358221220922e3310015bc16c97e0089a88dfffcac988adaf0432b9257c1c28f63a8e0fba64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c735d4e1 {\n uint168 s_0;\n string s_1;\n address s_2;\n address s_3;\n }\n\n struct S_2c71b142 {\n int256 s_0;\n S_c735d4e1 s_1;\n address s_2;\n string[4] s_3;\n }\n\n struct S_3147cd8f {\n address s_0;\n S_2c71b142 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_3147cd8f memory) {\n S_3147cd8f memory r;\n {\n address r_0 = 0xaBE7bC7c69FdE02dd826eA4C1b0DEc9f4E0450C4;\n r.s_0 = r_0;\n }\n {\n S_2c71b142 memory r_1;\n {\n int r_1_0 = 32965126527682706427426108139671410138024208463999789235608431142757895827110;\n r_1.s_0 = r_1_0;\n }\n {\n S_c735d4e1 memory r_1_1;\n {\n uint168 r_1_1_0 = 180275248772760063746601044319196330010035058826324;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n string memory r_1_1_1 = unicode\"Moo é🚀🚀🚀é ooMoM🚀🚀oooo🚀M é🚀MMé🚀 🚀 o🚀M🚀oéo🚀MoMéM🚀oooM\";\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x664F8b18C384F1dD5fEE516ef93BaB96E22b41B6;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n address r_1_1_3 = 0x83BF0899458e7e001F1AF90B44731bCeeb4DEf41;\n r_1_1.s_3 = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0xC373A9067f29b8e1658Bc88E6DeAaD333321a3a5;\n r_1.s_2 = r_1_2;\n }\n {\n string[4] memory r_1_3;\n {\n string memory r_1_3_0 = unicode\"Moo é🚀Moooéo MMoéooo\";\n r_1_3[0] = r_1_3_0;\n }\n {\n string memory r_1_3_1 = unicode\"Moo é🚀M M🚀o🚀éooMo🚀🚀oM oooo🚀oo🚀Mo\";\n r_1_3[1] = r_1_3_1;\n }\n {\n string memory r_1_3_2 = unicode\"Moo é🚀oMo🚀🚀éo🚀MM éééMé oé 🚀oé 🚀o🚀oééMMMo\";\n r_1_3[2] = r_1_3_2;\n }\n {\n string memory r_1_3_3 = unicode\"Moo é🚀🚀o🚀 éé🚀é 🚀o🚀oéoo\";\n r_1_3[3] = r_1_3_3;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xADf003d0A7830aF90c2E3973790642596Bc9C343;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000abe7bc7c69fde02dd826ea4c1b0dec9f4e0450c40000000000000000000000000000000000000000000000000000000000000060000000000000000000000000adf003d0a7830af90c2e3973790642596bc9c34348e199b4bf27951586940c64513bbd96b21f135f243a0ba55a8184b70b3ceea60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c373a9067f29b8e1658bc88e6deaad333321a3a5000000000000000000000000000000000000000000000000000000000000018000000000000000000000007b596dbc81a7a9cdd514e01e8c0c5ea6e645eedc540000000000000000000000000000000000000000000000000000000000000080000000000000000000000000664f8b18c384f1dd5fee516ef93bab96e22b41b600000000000000000000000083bf0899458e7e001f1af90b44731bceeb4def4100000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a9206f6f4d6f4df09f9a80f09f9a806f6f6f6ff09f9a804d20c3a9f09f9a804d4dc3a9f09f9a8020f09f9a80206ff09f9a804df09f9a806fc3a96ff09f9a804d6f4dc3a94df09f9a806f6f6f4d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a804d6f6f6fc3a96f204d4d6fc3a96f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a804d204df09f9a806ff09f9a80c3a96f6f4d6ff09f9a80f09f9a806f4d206f6f6f6ff09f9a806f6ff09f9a804d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a806f4d6ff09f9a80f09f9a80c3a96ff09f9a804d4d20c3a9c3a9c3a94dc3a9206fc3a9202020f09f9a806fc3a920f09f9a806ff09f9a806fc3a9c3a94d4d4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80f09f9a806ff09f9a8020c3a9c3a9f09f9a80c3a920f09f9a806ff09f9a806fc3a96f6f00000000000000000000000000000000000000" + }, + { + "name": "random-(address,bool,bool,bool,(bytes2,bool,bytes6,int64,bool[]))", + "type": "(address,bool,bool,bool,(bytes2,bool,bytes6,int64,bool[]))", + "value": [ + "0x2F9dbad02C3105A25cf9cf33B18b96e95a8B7e44", + true, + true, + true, + ["0x425e", false, "0x9944d7f54912", "8293293465876885322", [false, true]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2F9dbad02C3105A25cf9cf33B18b96e95a8B7e44" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x425e" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x9944d7f54912" + }, + { + "type": "number", + "value": "8293293465876885322" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102f3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101cf565b60405180910390f35b61005661017e565b61005e61017e565b732f9dbad02c3105a25cf9cf33b18b96e95a8b7e4481526001602082018190526040820181905260608201526100bd6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b61212f60f11b8152600060208201819052654ca26bfaa48960d11b6040830152677317b277aba8ef4a60608301526002604051908082528060200260200182016040528015610116578160200160208202803683370190505b5090506000808260008151811061012f5761012f6102a7565b60200260200101901515908115158152505050600060019050808260018151811061015c5761015c6102a7565b9115156020928302919091019091015250608080830191909152820152919050565b6040805160a080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905281840152608081810193909352909182015290565b6000602080835260018060a01b03845116818401528084015115156040840152604084015115156060840152606084015115156080840152608084015160a080850152610160840161ffff60f01b82511660c086015282820151151560e086015265ffffffffffff60d01b604083015116610100860152606082015160070b6101208601526080820151915060a0610140860152808251808352610180870191508484019350600092505b8083101561029c5783511515825292840192600192909201919084019061027a565b509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220de3eb01dc41473e05a992d7e08fc6ef33dfd569a07b86dbebd6a21d72086c82f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b5a58655 {\n bytes2 s_0;\n bool s_1;\n bytes6 s_2;\n int64 s_3;\n bool[] s_4;\n }\n\n struct S_2053132e {\n address s_0;\n bool s_1;\n bool s_2;\n bool s_3;\n S_b5a58655 s_4;\n }\n\n function test () public pure returns (S_2053132e memory) {\n S_2053132e memory r;\n {\n address r_0 = 0x2F9dbad02C3105A25cf9cf33B18b96e95a8B7e44;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n S_b5a58655 memory r_4;\n {\n bytes2 r_4_0 = bytes2(0x425e);\n r_4.s_0 = r_4_0;\n }\n {\n bool r_4_1 = false;\n r_4.s_1 = r_4_1;\n }\n {\n bytes6 r_4_2 = bytes6(0x9944d7f54912);\n r_4.s_2 = r_4_2;\n }\n {\n int64 r_4_3 = 8293293465876885322;\n r_4.s_3 = r_4_3;\n }\n {\n bool[] memory r_4_4 = new bool[](2);\n {\n bool r_4_4_0 = false;\n r_4_4[0] = r_4_4_0;\n }\n {\n bool r_4_4_1 = true;\n r_4_4[1] = r_4_4_1;\n }\n r_4.s_4 = r_4_4;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000002f9dbad02c3105a25cf9cf33b18b96e95a8b7e4400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0425e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009944d7f5491200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007317b277aba8ef4a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(address,bool[1],(uint24,(string),int24,address),bool,bytes30)[]", + "type": "(address,bool[1],(uint24,(string),int24,address),bool,bytes30)[]", + "value": [ + [ + "0x6de694568cFfe85A87fd71C309f1353e6d97CCc9", + [true], + [ + "104379", + ["Moo é🚀oo🚀oo é🚀ooo Mo🚀MoMoéMé oooé 🚀 🚀M🚀🚀é éo"], + "-7918119", + "0x20cA2D8AeB931D108A19AB84c72Ee69FF96BdD3E" + ], + false, + "0xdc7334be87c91c26dcd6ff8fac70c8249646a196caaa441a3b09a74a1129" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6de694568cFfe85A87fd71C309f1353e6d97CCc9" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "104379" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀oo é🚀ooo Mo🚀MoMoéMé oooé 🚀 🚀M🚀🚀é éo" + } + ] + }, + { + "type": "number", + "value": "-7918119" + }, + { + "type": "address", + "value": "0x20cA2D8AeB931D108A19AB84c72Ee69FF96BdD3E" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xdc7334be87c91c26dcd6ff8fac70c8249646a196caaa441a3b09a74a1129" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610419806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102ac565b60405180910390f35b60408051600180825281830190925260609160009190816020015b61007161017a565b81526020019060019003908161006957905050905061008e61017a565b736de694568cffe85a87fd71c309f1353e6d97ccc981526100ad6101be565b6001815260208201526100be6101dc565b620197bb815260408051602081019091526060815260006040518060800160405280604c8152602001610398604c913982525060208201526278d226196040808301919091527320ca2d8aeb931d108a19ab84c72ee69ff96bdd3e6060808401919091529083019190915260009082018190527fdc7334be87c91c26dcd6ff8fac70c8249646a196caaa441a3b09a74a11290000608083015282518291849161016957610169610381565b602090810291909101015250919050565b6040518060a0016040528060006001600160a01b0316815260200161019d6101be565b81526020016101aa6101dc565b815260006020820181905260409091015290565b60405180602001604052806001906020820280368337509192915050565b6040518060800160405280600062ffffff1681526020016101aa6040518060200160405280606081525090565b62ffffff815116825260006020808301516080828601528051905081608086015280518060a087015260005b818110156102515782810184015187820160c001528301610235565b8181111561026357600060c083890101525b506040850151925061027a604087018460020b9052565b6060850151925061029660608701846001600160a01b03169052565b601f01601f19169490940160c001949350505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561037257898403603f19018652825180516001600160a01b031685528881015160a0908a8701855b600181101561031f57825115158252918c0191908c0190600101610300565b50505088820151818a88015261033782880182610209565b91505060608083015161034d8289018215159052565b505060809182015161ffff1916959091019490945294870194918701916001016102d4565b50919998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6ff09f9a806f6f20c3a9f09f9a806f6f6f204d6ff09f9a804d6f4d6fc3a94dc3a9206f6f6fc3a920f09f9a802020f09f9a804df09f9a80f09f9a80c3a920c3a96fa26469706673582212203afd053b856dfeeb810e4d643b3d2bdf2dc10ba293a8c0c6760278c5db9153fb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_1c6c701b {\n uint24 s_0;\n S_97fc4627 s_1;\n int24 s_2;\n address s_3;\n }\n\n struct S_44e83e8b {\n address s_0;\n bool[1] s_1;\n S_1c6c701b s_2;\n bool s_3;\n bytes30 s_4;\n }\n\n function test () public pure returns (S_44e83e8b[] memory) {\n S_44e83e8b[] memory r = new S_44e83e8b[](1);\n {\n S_44e83e8b memory r_0;\n {\n address r_0_0 = 0x6de694568cFfe85A87fd71C309f1353e6d97CCc9;\n r_0.s_0 = r_0_0;\n }\n {\n bool[1] memory r_0_1;\n {\n bool r_0_1_0 = true;\n r_0_1[0] = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_1c6c701b memory r_0_2;\n {\n uint24 r_0_2_0 = 104379;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n S_97fc4627 memory r_0_2_1;\n {\n string memory r_0_2_1_0 = unicode\"Moo é🚀oo🚀oo é🚀ooo Mo🚀MoMoéMé oooé 🚀 🚀M🚀🚀é éo\";\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n {\n int24 r_0_2_2 = -7918119;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n address r_0_2_3 = 0x20cA2D8AeB931D108A19AB84c72Ee69FF96BdD3E;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0.s_3 = r_0_3;\n }\n {\n bytes30 r_0_4 = bytes30(0xdc7334be87c91c26dcd6ff8fac70c8249646a196caaa441a3b09a74a1129);\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000006de694568cffe85a87fd71c309f1353e6d97ccc9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000dc7334be87c91c26dcd6ff8fac70c8249646a196caaa441a3b09a74a1129000000000000000000000000000000000000000000000000000000000000000197bb0000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff872dd900000000000000000000000020ca2d8aeb931d108a19ab84c72ee69ff96bdd3e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806f6ff09f9a806f6f20c3a9f09f9a806f6f6f204d6ff09f9a804d6f4d6fc3a94dc3a9206f6f6fc3a920f09f9a802020f09f9a804df09f9a80f09f9a80c3a920c3a96f0000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bool,(bytes23,bytes17,bytes18,int184,bool),uint32,bool[4])", + "type": "(bool,bool,(bytes23,bytes17,bytes18,int184,bool),uint32,bool[4])", + "value": [ + false, + true, + [ + "0xeca96f300fce83e0a6a176671541df99e4286f8ab8a5a5", + "0x766ff73add65b01e404d9526f5d4967770", + "0x76796c47481685c7f8bf1a47b0a1414e2acc", + "-11864387994009205910523010940966140556177928992386113021", + false + ], + "760720750", + [true, false, false, false] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xeca96f300fce83e0a6a176671541df99e4286f8ab8a5a5" + }, + { + "type": "hexstring", + "value": "0x766ff73add65b01e404d9526f5d4967770" + }, + { + "type": "hexstring", + "value": "0x76796c47481685c7f8bf1a47b0a1414e2acc" + }, + { + "type": "number", + "value": "-11864387994009205910523010940966140556177928992386113021" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "760720750" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506102e6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101fa565b60405180910390f35b61005661015a565b61005e61015a565b600081526001602082015261009a6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b7feca96f300fce83e0a6a176671541df99e4286f8ab8a5a50000000000000000008152700766ff73add65b01e404d9526f5d496777607c1b6020820152711d9e5b11d205a171fe2fc691ec2850538ab360721b604080830191909152767bdeb7b08515af951a87eaa750cb1455695c25051addfc196060808401919091526000608084015290830191909152632d57ad6e908201526101376101b1565b600181526000602082018190526040820181905260608201526080820152919050565b6040805160a080820183526000808352602080840182905284519283018552818352820181905281840181905260608201819052608082015290918201908152600060208201526040016101ac6101b1565b905290565b60405180608001604052806004906020820280368337509192915050565b8060005b60048110156101f457815115158452602093840193909101906001016101d3565b50505050565b600061018082019050825115158252602083015115156020830152604083015168ffffffffffffffffff1981511660408401526effffffffffffffffffffffffffffff1960208201511660608401526dffffffffffffffffffffffffffff196040820151166080840152606081015160160b60a08401526080810151151560c084015250606083015161029560e084018263ffffffff169052565b5060808301516102a96101008401826101cf565b509291505056fea26469706673582212207986dbb6680b1b05c08bce6882e88908014c5f18dbe8548d9df00e69a5e06a5864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ad8ed4d9 {\n bytes23 s_0;\n bytes17 s_1;\n bytes18 s_2;\n int184 s_3;\n bool s_4;\n }\n\n struct S_e8f803c0 {\n bool s_0;\n bool s_1;\n S_ad8ed4d9 s_2;\n uint32 s_3;\n bool[4] s_4;\n }\n\n function test () public pure returns (S_e8f803c0 memory) {\n S_e8f803c0 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_ad8ed4d9 memory r_2;\n {\n bytes23 r_2_0 = bytes23(0xeca96f300fce83e0a6a176671541df99e4286f8ab8a5a5);\n r_2.s_0 = r_2_0;\n }\n {\n bytes17 r_2_1 = bytes17(0x766ff73add65b01e404d9526f5d4967770);\n r_2.s_1 = r_2_1;\n }\n {\n bytes18 r_2_2 = bytes18(0x76796c47481685c7f8bf1a47b0a1414e2acc);\n r_2.s_2 = r_2_2;\n }\n {\n int184 r_2_3 = -11864387994009205910523010940966140556177928992386113021;\n r_2.s_3 = r_2_3;\n }\n {\n bool r_2_4 = false;\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n uint32 r_3 = 760720750;\n r.s_3 = r_3;\n }\n {\n bool[4] memory r_4;\n {\n bool r_4_0 = true;\n r_4[0] = r_4_0;\n }\n {\n bool r_4_1 = false;\n r_4[1] = r_4_1;\n }\n {\n bool r_4_2 = false;\n r_4[2] = r_4_2;\n }\n {\n bool r_4_3 = false;\n r_4[3] = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001eca96f300fce83e0a6a176671541df99e4286f8ab8a5a5000000000000000000766ff73add65b01e404d9526f5d496777000000000000000000000000000000076796c47481685c7f8bf1a47b0a1414e2acc0000000000000000000000000000ffffffffffffffffff8421484f7aea506ae5781558af34ebaa96a3dafae522030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d57ad6e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bool[1],address,bytes14[2],(uint248,bool[1][3]))", + "type": "(bool,bool[1],address,bytes14[2],(uint248,bool[1][3]))", + "value": [ + true, + [true], + "0x6Bc872b1e22A7e127333bcE991BDB5eC8E5ABE47", + ["0x19857f375ffc668a83bbb9b3c45d", "0xc902045836feeb0ec17c7edc593b"], + [ + "258194964794744524230559495263567441561223259568268014092085689186747213230", + [[false], [true], [true]] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x6Bc872b1e22A7e127333bcE991BDB5eC8E5ABE47" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x19857f375ffc668a83bbb9b3c45d" + }, + { + "type": "hexstring", + "value": "0xc902045836feeb0ec17c7edc593b" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "258194964794744524230559495263567441561223259568268014092085689186747213230" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610334806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610270565b60405180910390f35b610056610136565b61005e610136565b6001815261006a610178565b600181526020820152736bc872b1e22a7e127333bce991bdb5ec8e5abe476040820152610095610196565b6d19857f375ffc668a83bbb9b3c45d60901b81526dc902045836feeb0ec17c7edc593b60901b602082015260608201526100cd6101b4565b7e92221783d2937ac969c7dc083f0f1f58153b16b3b49ad0330a996ae1d8e5ae81526100f76101d3565b6100ff610178565b60008152815261010d610178565b60018152602082015261011e610178565b60018152604082015260208201526080820152919050565b6040518060a00160405280600015158152602001610152610178565b815260006020820152604001610166610196565b81526020016101736101b4565b905290565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b604051806040016040528060006001600160f81b031681526020016101735b60405180606001604052806003905b6101ea610178565b8152602001906001900390816101e25790505090565b8060005b60018110156102255781511515845260209384019390910190600101610204565b50505050565b80516001600160f81b0316825260208082015181840160005b600381101561026857610258828451610200565b9183019190830190600101610244565b505050505050565b8151151581526020808301516101208301919061028f82850182610200565b506040848101516001600160a01b03169084015260608085015190840160005b60028110156102e157825171ffffffffffffffffffffffffffffffffffff1916825291830191908301906001016102af565b5050505060808301516102f760a084018261022b565b509291505056fea264697066735822122025962c9ce76a3b6a250db2a42003b271592018948ab27ddb6be50ef1f2de89dd64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_58eced15 {\n uint248 s_0;\n bool[1][3] s_1;\n }\n\n struct S_24570919 {\n bool s_0;\n bool[1] s_1;\n address s_2;\n bytes14[2] s_3;\n S_58eced15 s_4;\n }\n\n function test () public pure returns (S_24570919 memory) {\n S_24570919 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bool[1] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x6Bc872b1e22A7e127333bcE991BDB5eC8E5ABE47;\n r.s_2 = r_2;\n }\n {\n bytes14[2] memory r_3;\n {\n bytes14 r_3_0 = bytes14(0x19857f375ffc668a83bbb9b3c45d);\n r_3[0] = r_3_0;\n }\n {\n bytes14 r_3_1 = bytes14(0xc902045836feeb0ec17c7edc593b);\n r_3[1] = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n S_58eced15 memory r_4;\n {\n uint248 r_4_0 = 258194964794744524230559495263567441561223259568268014092085689186747213230;\n r_4.s_0 = r_4_0;\n }\n {\n bool[1][3] memory r_4_1;\n {\n bool[1] memory r_4_1_0;\n {\n bool r_4_1_0_0 = false;\n r_4_1_0[0] = r_4_1_0_0;\n }\n r_4_1[0] = r_4_1_0;\n }\n {\n bool[1] memory r_4_1_1;\n {\n bool r_4_1_1_0 = true;\n r_4_1_1[0] = r_4_1_1_0;\n }\n r_4_1[1] = r_4_1_1;\n }\n {\n bool[1] memory r_4_1_2;\n {\n bool r_4_1_2_0 = true;\n r_4_1_2[0] = r_4_1_2_0;\n }\n r_4_1[2] = r_4_1_2;\n }\n r_4.s_1 = r_4_1;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000006bc872b1e22a7e127333bce991bdb5ec8e5abe4719857f375ffc668a83bbb9b3c45d000000000000000000000000000000000000c902045836feeb0ec17c7edc593b0000000000000000000000000000000000000092221783d2937ac969c7dc083f0f1f58153b16b3b49ad0330a996ae1d8e5ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(bool,bytes15[3],uint24[4],bool[3][1],(string,bytes23))", + "type": "(bool,bytes15[3],uint24[4],bool[3][1],(string,bytes23))", + "value": [ + false, + [ + "0xae509bacca4f742db480595be5fee7", + "0x3fa8b72c31a63e3c60523598f0deb5", + "0x453058e2bc9bb8d4ba79b38f8e892a" + ], + ["3723455", "8302641", "8184613", "13888049"], + [[false, true, false]], + [ + "Moo é🚀oo éooMoMMo oé oéooM éo🚀 ", + "0xac9fb925caf5f35a540da198e66c3648ceb2776fbb9da2" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xae509bacca4f742db480595be5fee7" + }, + { + "type": "hexstring", + "value": "0x3fa8b72c31a63e3c60523598f0deb5" + }, + { + "type": "hexstring", + "value": "0x453058e2bc9bb8d4ba79b38f8e892a" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3723455" + }, + { + "type": "number", + "value": "8302641" + }, + { + "type": "number", + "value": "8184613" + }, + { + "type": "number", + "value": "13888049" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo éooMoMMo oé oéooM éo🚀 " + }, + { + "type": "hexstring", + "value": "0xac9fb925caf5f35a540da198e66c3648ceb2776fbb9da2" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610439806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610340565b60405180910390f35b61005661017a565b61005e61017a565b6000815261006a6101e3565b6eae509bacca4f742db480595be5fee760881b81526e3fa8b72c31a63e3c60523598f0deb560881b6020808301919091526e22982c715e4ddc6a5d3cd9c7c7449560891b60408301528201526100be610201565b6238d0bf8152627eb0316020820152627ce32560408083019190915262d3ea3160608301528201526100ee61021f565b6100f66101e3565b60008082526001602080840191909152604080840183905292845260608086019490945282518084019093529282529181019190915260006040518060600160405280602b81526020016103d9602b91398252507fac9fb925caf5f35a540da198e66c3648ceb2776fbb9da200000000000000000060208201526080820152919050565b6040518060a001604052806000151581526020016101966101e3565b81526020016101a3610201565b81526020016101b061021f565b81526020016101de604051806040016040528060608152602001600068ffffffffffffffffff191681525090565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001905b6102366101e3565b81526020019060019003908161022e5790505090565b8060005b600481101561027457815162ffffff16845260209384019390910190600101610250565b50505050565b806000805b600180821061028e57506102cd565b835186845b60038110156102b357825115158252602092830192909101908301610293565b50505060609590950194506020929092019160010161027f565b5050505050565b6000815160408452805180604086015260005b8181101561030457602081840181015160608884010152016102e7565b81811115610316576000606083880101525b5060209384015168ffffffffffffffffff1916938501939093525050601f01601f19160160600190565b600060208083528351151581840152808401516040840160005b600381101561038b57825170ffffffffffffffffffffffffffffffffff19168252918301919083019060010161035a565b5050505060408301516103a160a084018261024c565b5060608301516103b561012084018261027a565b506080830151610180838101526103d06101a08401826102d4565b94935050505056fe4d6f6f20c3a9f09f9a806f6f20c3a96f6f4d6f4d4d6f206fc3a9206fc3a96f6f4d20c3a96ff09f9a802020a264697066735822122000cb0ed662cad0e1f8b7fd3571874f4310d68efdfbc6e1a41624018a8d210cd964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3bf09736 {\n string s_0;\n bytes23 s_1;\n }\n\n struct S_46f2a5f3 {\n bool s_0;\n bytes15[3] s_1;\n uint24[4] s_2;\n bool[3][1] s_3;\n S_3bf09736 s_4;\n }\n\n function test () public pure returns (S_46f2a5f3 memory) {\n S_46f2a5f3 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bytes15[3] memory r_1;\n {\n bytes15 r_1_0 = bytes15(0xae509bacca4f742db480595be5fee7);\n r_1[0] = r_1_0;\n }\n {\n bytes15 r_1_1 = bytes15(0x3fa8b72c31a63e3c60523598f0deb5);\n r_1[1] = r_1_1;\n }\n {\n bytes15 r_1_2 = bytes15(0x453058e2bc9bb8d4ba79b38f8e892a);\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n uint24[4] memory r_2;\n {\n uint24 r_2_0 = 3723455;\n r_2[0] = r_2_0;\n }\n {\n uint24 r_2_1 = 8302641;\n r_2[1] = r_2_1;\n }\n {\n uint24 r_2_2 = 8184613;\n r_2[2] = r_2_2;\n }\n {\n uint24 r_2_3 = 13888049;\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n bool[3][1] memory r_3;\n {\n bool[3] memory r_3_0;\n {\n bool r_3_0_0 = false;\n r_3_0[0] = r_3_0_0;\n }\n {\n bool r_3_0_1 = true;\n r_3_0[1] = r_3_0_1;\n }\n {\n bool r_3_0_2 = false;\n r_3_0[2] = r_3_0_2;\n }\n r_3[0] = r_3_0;\n }\n r.s_3 = r_3;\n }\n {\n S_3bf09736 memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀oo éooMoMMo oé oéooM éo🚀 \";\n r_4.s_0 = r_4_0;\n }\n {\n bytes23 r_4_1 = bytes23(0xac9fb925caf5f35a540da198e66c3648ceb2776fbb9da2);\n r_4.s_1 = r_4_1;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000ae509bacca4f742db480595be5fee700000000000000000000000000000000003fa8b72c31a63e3c60523598f0deb50000000000000000000000000000000000453058e2bc9bb8d4ba79b38f8e892a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d0bf00000000000000000000000000000000000000000000000000000000007eb03100000000000000000000000000000000000000000000000000000000007ce3250000000000000000000000000000000000000000000000000000000000d3ea3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000040ac9fb925caf5f35a540da198e66c3648ceb2776fbb9da2000000000000000000000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a806f6f20c3a96f6f4d6f4d4d6f206fc3a9206fc3a96f6f4d20c3a96ff09f9a802020000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,bytes6,address,(string[],(bool,bytes22,bytes30,bytes4,string)))", + "type": "(bool,bytes6,address,(string[],(bool,bytes22,bytes30,bytes4,string)))", + "value": [ + true, + "0xa11103836741", + "0x1980E4865D1C1631BE600c45CD9718980Ce6aefc", + [ + [ + "Moo é🚀o 🚀🚀🚀o🚀MMMMé M🚀é o", + "Moo é🚀🚀ooo🚀oM🚀o 🚀M🚀MéooMoéM🚀oooMéoM Mo 🚀🚀ooéoo🚀MMMéM ", + "Moo é🚀éoMéo" + ], + [ + false, + "0xaa91d3f1adb5a5dce5bdc0d817036b758f542d5f3772", + "0xdecec76c3f33d0dccede7b249ec4737feb8376d023a1df137b692bc2d8ac", + "0xb1ede891", + "Moo é🚀o oo 🚀oo oéoé🚀 éoMM ooo🚀MooM 🚀Mo é🚀oooM oo🚀ooéMM " + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xa11103836741" + }, + { + "type": "address", + "value": "0x1980E4865D1C1631BE600c45CD9718980Ce6aefc" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀🚀🚀o🚀MMMMé M🚀é o" + }, + { + "type": "string", + "value": "Moo é🚀🚀ooo🚀oM🚀o 🚀M🚀MéooMoéM🚀oooMéoM Mo 🚀🚀ooéoo🚀MMMéM " + }, + { + "type": "string", + "value": "Moo é🚀éoMéo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xaa91d3f1adb5a5dce5bdc0d817036b758f542d5f3772" + }, + { + "type": "hexstring", + "value": "0xdecec76c3f33d0dccede7b249ec4737feb8376d023a1df137b692bc2d8ac" + }, + { + "type": "hexstring", + "value": "0xb1ede891" + }, + { + "type": "string", + "value": "Moo é🚀o oo 🚀oo oéoé🚀 éoMM ooo🚀MooM 🚀Mo é🚀oooM oo🚀ooéMM " + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610572806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610335565b60405180910390f35b610056610282565b61005e610282565b6001815265a1110383674160d01b6020820152731980e4865d1c1631be600c45cd9718980ce6aefc60408201526100cb6040805180820182526060808252825160a08101845260008082526020828101829052948201819052818301526080810191909152909182015290565b60408051600380825260808201909252600091816020015b60608152602001906001900390816100e357905050905060006040518060600160405280602d8152602001610461602d91399050808260008151811061012b5761012b61044a565b60200260200101819052505060006040518060800160405280605981526020016104e460599139905080826001815181106101685761016861044a565b6020026020010181905250506000604051806040016040528060118152602001704d6f6f20c3a9f09f9a80c3a96f4dc3a96f60781b815250905080826002815181106101b6576101b661044a565b60209081029190910101525081526101f76040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b6000808252755548e9f8d6dad2ee72dee06c0b81b5bac7aa16af9bb960511b6020808401919091527fdecec76c3f33d0dccede7b249ec4737feb8376d023a1df137b692bc2d8ac000060408085019190915263b1ede89160e01b60608501528051608081019091526056808252909161048e9083013960808301525060208201526060820152919050565b6040805160808101825260008082526020820181905291810191909152606081016102e36040805180820182526060808252825160a08101845260008082526020828101829052948201819052818301526080810191909152909182015290565b905290565b6000815180845260005b8181101561030e576020818501810151868301820152016102f2565b81811115610320576000602083870101525b50601f01601f19169290920160200192915050565b60006020808352835115158184015265ffffffffffff60d01b8185015116604084015260018060a01b036040850151166060840152606084015160808085015260e084018151604060a087015281815180845261010093508388019150838160051b8901019350858301925060005b818110156103d25760ff198986030183526103c08585516102e8565b945092860192918601916001016103a4565b50505050828201519150609f198582030160c086015281511515815269ffffffffffffffffffff1983830151168382015261ffff19604083015116604082015263ffffffff60e01b60608301511660608201526080820151925060a0608082015261044060a08201846102e8565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f20f09f9a80f09f9a80f09f9a806ff09f9a804d4d4d4dc3a9204df09f9a80c3a9206f4d6f6f20c3a9f09f9a806f2020206f6f20f09f9a806f6f20206fc3a96fc3a9f09f9a8020c3a96f4d4d206f6f6ff09f9a804d6f6f4d20f09f9a804d6f2020c3a9f09f9a806f6f6f4d206f6ff09f9a806f6fc3a94d4d204d6f6f20c3a9f09f9a80f09f9a806f6f6ff09f9a806f4df09f9a806f20f09f9a804df09f9a804dc3a96f6f4d6fc3a94df09f9a806f6f6f4dc3a96f4d204d6f20f09f9a80f09f9a806f6fc3a96f6ff09f9a804d4d4dc3a94d20a26469706673582212206646a31b0319a52405dea0b4184003e5e6bdf588404ed4fa8bf8d6a16986802864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3bd38af0 {\n bool s_0;\n bytes22 s_1;\n bytes30 s_2;\n bytes4 s_3;\n string s_4;\n }\n\n struct S_7488cda2 {\n string[] s_0;\n S_3bd38af0 s_1;\n }\n\n struct S_8e0c8459 {\n bool s_0;\n bytes6 s_1;\n address s_2;\n S_7488cda2 s_3;\n }\n\n function test () public pure returns (S_8e0c8459 memory) {\n S_8e0c8459 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bytes6 r_1 = bytes6(0xa11103836741);\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x1980E4865D1C1631BE600c45CD9718980Ce6aefc;\n r.s_2 = r_2;\n }\n {\n S_7488cda2 memory r_3;\n {\n string[] memory r_3_0 = new string[](3);\n {\n string memory r_3_0_0 = unicode\"Moo é🚀o 🚀🚀🚀o🚀MMMMé M🚀é o\";\n r_3_0[0] = r_3_0_0;\n }\n {\n string memory r_3_0_1 = unicode\"Moo é🚀🚀ooo🚀oM🚀o 🚀M🚀MéooMoéM🚀oooMéoM Mo 🚀🚀ooéoo🚀MMMéM \";\n r_3_0[1] = r_3_0_1;\n }\n {\n string memory r_3_0_2 = unicode\"Moo é🚀éoMéo\";\n r_3_0[2] = r_3_0_2;\n }\n r_3.s_0 = r_3_0;\n }\n {\n S_3bd38af0 memory r_3_1;\n {\n bool r_3_1_0 = false;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bytes22 r_3_1_1 = bytes22(0xaa91d3f1adb5a5dce5bdc0d817036b758f542d5f3772);\n r_3_1.s_1 = r_3_1_1;\n }\n {\n bytes30 r_3_1_2 = bytes30(0xdecec76c3f33d0dccede7b249ec4737feb8376d023a1df137b692bc2d8ac);\n r_3_1.s_2 = r_3_1_2;\n }\n {\n bytes4 r_3_1_3 = bytes4(0xb1ede891);\n r_3_1.s_3 = r_3_1_3;\n }\n {\n string memory r_3_1_4 = unicode\"Moo é🚀o oo 🚀oo oéoé🚀 éoMM ooo🚀MooM 🚀Mo é🚀oooM oo🚀ooéMM \";\n r_3_1.s_4 = r_3_1_4;\n }\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001a1110383674100000000000000000000000000000000000000000000000000000000000000000000000000001980e4865d1c1631be600c45cd9718980ce6aefc0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806f20f09f9a80f09f9a80f09f9a806ff09f9a804d4d4d4dc3a9204df09f9a80c3a9206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a806f6f6ff09f9a806f4df09f9a806f20f09f9a804df09f9a804dc3a96f6f4d6fc3a94df09f9a806f6f6f4dc3a96f4d204d6f20f09f9a80f09f9a806f6fc3a96f6ff09f9a804d4d4dc3a94d200000000000000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a80c3a96f4dc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa91d3f1adb5a5dce5bdc0d817036b758f542d5f377200000000000000000000decec76c3f33d0dccede7b249ec4737feb8376d023a1df137b692bc2d8ac0000b1ede8910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a806f2020206f6f20f09f9a806f6f20206fc3a96fc3a9f09f9a8020c3a96f4d4d206f6f6ff09f9a804d6f6f4d20f09f9a804d6f2020c3a9f09f9a806f6f6f4d206f6ff09f9a806f6fc3a94d4d2000000000000000000000" + }, + { + "name": "random-(bool[1],string,address,string,(bytes28,bool[4],(uint184),bool))", + "type": "(bool[1],string,address,string,(bytes28,bool[4],(uint184),bool))", + "value": [ + [false], + "Moo é🚀🚀🚀🚀o🚀🚀o oMéé🚀MooéMMMMéoo", + "0x0aE154e14C0Bb2564f569a588D8023c95e70DA36", + "Moo é🚀🚀🚀oéo oM é🚀 oooéé🚀🚀oMooo M ééo 🚀ooo", + [ + "0xf0c45ae145d38e6b1ce4cd3e116a6ccfa693f37564870acd91375e7b", + [false, true, true, false], + ["3422628548776214959578390507501256180072667251267458439"], + false + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀o🚀🚀o oMéé🚀MooéMMMMéoo" + }, + { + "type": "address", + "value": "0x0aE154e14C0Bb2564f569a588D8023c95e70DA36" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀oéo oM é🚀 oooéé🚀🚀oMooo M ééo 🚀ooo" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf0c45ae145d38e6b1ce4cd3e116a6ccfa693f37564870acd91375e7b" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3422628548776214959578390507501256180072667251267458439" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061040b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102b3565b60405180910390f35b61005661015b565b61005e61015b565b610066610194565b60008082529082526040805160608101909152603880825261039e6020830139602080840191909152730ae154e14c0bb2564f569a588d8023c95e70da366040808501919091528051608081019091526048808252600093509091610356908301396060830152506100d66101b2565b7ff0c45ae145d38e6b1ce4cd3e116a6ccfa693f37564870acd91375e7b0000000081526101016101ec565b600080825260016020808401829052604080850192909252606080850184905285820194909452815190810182527623bbe17c2b5723ffa52ff4e2bfeae3dd4437b841e9d587815290840152908201526080820152919050565b6040518060a0016040528061016e610194565b8152606060208201819052600060408301528082015260800161018f6101b2565b905290565b60405180602001604052806001906020820280368337509192915050565b604080516080810190915260008152602081016101cd6101ec565b8152604080516020808201835260008083529084019190915291015290565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b8181101561023057602081850181015186830182015201610214565b81811115610242576000602083870101525b50601f01601f19169290920160200192915050565b805163ffffffff1916825260208082015181840160005b600481101561028d57825115158252918301919083019060010161026e565b505050506040810151516001600160b81b031660a083015260600151151560c090910152565b6020808252825160009190828483015b60018210156102e457825115158152918301916001919091019083016102c3565b505050830151610160604084015261030061018084018261020a565b9050604084015161031c60608501826001600160a01b03169052565b506060840151838203601f19016080850152610338828261020a565b915050608084015161034d60a0850182610257565b50939250505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a806fc3a96f2020206f4d20c3a9f09f9a80206f6f6fc3a9c3a9f09f9a80f09f9a806f4d6f6f6f204d2020c3a9c3a96f20f09f9a806f6f6f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806ff09f9a80f09f9a806f206f4dc3a9c3a9f09f9a804d6f6fc3a94d4d4d4dc3a96f6fa264697066735822122033f4cb287c68cc89fd1e8e5d1c78ef9caeee464d9cbc78fe38a6c25628b1c30264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_602e5ffe {\n uint184 s_0;\n }\n\n struct S_d863331d {\n bytes28 s_0;\n bool[4] s_1;\n S_602e5ffe s_2;\n bool s_3;\n }\n\n struct S_98983a61 {\n bool[1] s_0;\n string s_1;\n address s_2;\n string s_3;\n S_d863331d s_4;\n }\n\n function test () public pure returns (S_98983a61 memory) {\n S_98983a61 memory r;\n {\n bool[1] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀🚀🚀🚀o🚀🚀o oMéé🚀MooéMMMMéoo\";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x0aE154e14C0Bb2564f569a588D8023c95e70DA36;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀🚀🚀oéo oM é🚀 oooéé🚀🚀oMooo M ééo 🚀ooo\";\n r.s_3 = r_3;\n }\n {\n S_d863331d memory r_4;\n {\n bytes28 r_4_0 = bytes28(0xf0c45ae145d38e6b1ce4cd3e116a6ccfa693f37564870acd91375e7b);\n r_4.s_0 = r_4_0;\n }\n {\n bool[4] memory r_4_1;\n {\n bool r_4_1_0 = false;\n r_4_1[0] = r_4_1_0;\n }\n {\n bool r_4_1_1 = true;\n r_4_1[1] = r_4_1_1;\n }\n {\n bool r_4_1_2 = true;\n r_4_1[2] = r_4_1_2;\n }\n {\n bool r_4_1_3 = false;\n r_4_1[3] = r_4_1_3;\n }\n r_4.s_1 = r_4_1;\n }\n {\n S_602e5ffe memory r_4_2;\n {\n uint184 r_4_2_0 = 3422628548776214959578390507501256180072667251267458439;\n r_4_2.s_0 = r_4_2_0;\n }\n r_4.s_2 = r_4_2;\n }\n {\n bool r_4_3 = false;\n r_4.s_3 = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000ae154e14c0bb2564f569a588d8023c95e70da3600000000000000000000000000000000000000000000000000000000000001c0f0c45ae145d38e6b1ce4cd3e116a6ccfa693f37564870acd91375e7b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000023bbe17c2b5723ffa52ff4e2bfeae3dd4437b841e9d587000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806ff09f9a80f09f9a806f206f4dc3a9c3a9f09f9a804d6f6fc3a94d4d4d4dc3a96f6f000000000000000000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a80f09f9a80f09f9a806fc3a96f2020206f4d20c3a9f09f9a80206f6f6fc3a9c3a9f09f9a80f09f9a806f4d6f6f6f204d2020c3a9c3a96f20f09f9a806f6f6f000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool[2],address,(bytes12[],bool,address[4],bytes11,bool))", + "type": "(bool[2],address,(bytes12[],bool,address[4],bytes11,bool))", + "value": [ + [false, false], + "0x5bB4e6AeD9b0823B7279fD2e05FA2b1C9f825faE", + [ + ["0xca5cf12cb164984063e4d9f5"], + true, + [ + "0x188c4247f16E124beA253319B6d85E9bC9956b07", + "0x81f48Ce6F1a3b1002E6F96cCea719303db408950", + "0xEB5F9b5E8bAB1129997f208AE367a40b2F595e42", + "0x50F48B48A73397b7ca61E32619D8FA815f197Fe8" + ], + "0xd7d3a9922778a3d6677b47", + true + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x5bB4e6AeD9b0823B7279fD2e05FA2b1C9f825faE" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xca5cf12cb164984063e4d9f5" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x188c4247f16E124beA253319B6d85E9bC9956b07" + }, + { + "type": "address", + "value": "0x81f48Ce6F1a3b1002E6F96cCea719303db408950" + }, + { + "type": "address", + "value": "0xEB5F9b5E8bAB1129997f208AE367a40b2F595e42" + }, + { + "type": "address", + "value": "0x50F48B48A73397b7ca61E32619D8FA815f197Fe8" + } + ] + }, + { + "type": "hexstring", + "value": "0xd7d3a9922778a3d6677b47" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103a9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610271565b60405180910390f35b6100566101a3565b61005e6101a3565b6100666101cf565b6000808252602080830191909152908252735bb4e6aed9b0823b7279fd2e05fa2b1c9f825fae908201526100986101ed565b60408051600180825281830190925260009160208083019080368337505081519192506bca5cf12cb164984063e4d9f560a01b9182915083906000906100e0576100e061035d565b6001600160a01b03199092166020928302919091018201529183525060019082015261010a610221565b73188c4247f16e124bea253319b6d85e9bc9956b0781527381f48ce6f1a3b1002e6f96ccea719303db408950602082015273eb5f9b5e8bab1129997f208ae367a40b2f595e426040808301919091527350f48b48a73397b7ca61e32619d8fa815f197fe8606080840191909152838201929092526ad7d3a9922778a3d6677b4760a81b9183019190915260016080830152820152919050565b60405180606001604052806101b66101cf565b8152600060208201526040016101ca6101ed565b905290565b60405180604001604052806002906020820280368337509192915050565b6040805160a081018252606081526000602082015290810161020d610221565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b600481101561026b5781516001600160a01b0316845260209384019390910190600101610243565b50505050565b6020808252825160009190828483015b60028210156102a25782511515815291830191600191909101908301610281565b505050838101516001600160a01b031660608401526040840151608080850152805161010060a086015280516101a08601819052908301906000906101c08701905b8083101561030e5783516001600160a01b03191682529285019260019290920191908501906102e4565b5093830151151560c087015260408301519361032d60e088018661023f565b60608401516001600160a81b03191661016088015260809093015115156101809096019590955250949350505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122024f745658d8b558bbbd921461a6d98cbfb864531f4c455b37933d50d6ee9e33064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8a88401e {\n bytes12[] s_0;\n bool s_1;\n address[4] s_2;\n bytes11 s_3;\n bool s_4;\n }\n\n struct S_03f21d83 {\n bool[2] s_0;\n address s_1;\n S_8a88401e s_2;\n }\n\n function test () public pure returns (S_03f21d83 memory) {\n S_03f21d83 memory r;\n {\n bool[2] memory r_0;\n {\n bool r_0_0 = false;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x5bB4e6AeD9b0823B7279fD2e05FA2b1C9f825faE;\n r.s_1 = r_1;\n }\n {\n S_8a88401e memory r_2;\n {\n bytes12[] memory r_2_0 = new bytes12[](1);\n {\n bytes12 r_2_0_0 = bytes12(0xca5cf12cb164984063e4d9f5);\n r_2_0[0] = r_2_0_0;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n address[4] memory r_2_2;\n {\n address r_2_2_0 = 0x188c4247f16E124beA253319B6d85E9bC9956b07;\n r_2_2[0] = r_2_2_0;\n }\n {\n address r_2_2_1 = 0x81f48Ce6F1a3b1002E6F96cCea719303db408950;\n r_2_2[1] = r_2_2_1;\n }\n {\n address r_2_2_2 = 0xEB5F9b5E8bAB1129997f208AE367a40b2F595e42;\n r_2_2[2] = r_2_2_2;\n }\n {\n address r_2_2_3 = 0x50F48B48A73397b7ca61E32619D8FA815f197Fe8;\n r_2_2[3] = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n {\n bytes11 r_2_3 = bytes11(0xd7d3a9922778a3d6677b47);\n r_2.s_3 = r_2_3;\n }\n {\n bool r_2_4 = true;\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bb4e6aed9b0823b7279fd2e05fa2b1c9f825fae000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000188c4247f16e124bea253319b6d85e9bc9956b0700000000000000000000000081f48ce6f1a3b1002e6f96ccea719303db408950000000000000000000000000eb5f9b5e8bab1129997f208ae367a40b2f595e4200000000000000000000000050f48b48a73397b7ca61e32619d8fa815f197fe8d7d3a9922778a3d6677b4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ca5cf12cb164984063e4d9f50000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes32[1],(int184,string,string,bool,int64)[],string)[3]", + "type": "(bytes32[1],(int184,string,string,bool,int64)[],string)[3]", + "value": [ + [ + ["0xc4d6082cf912b4c32b520894d51b7a26df085acb7b0eaeb8249b15e399a9b3dd"], + [ + [ + "3227389823094766559653875229413924396012027996347215850", + "Moo é🚀oMéM", + "Moo é🚀é oM🚀🚀éM🚀🚀🚀o🚀oé🚀🚀M 🚀oo🚀ooM", + true, + "7204642582434829093" + ], + [ + "-5766724485026436906284218955900451384388016007231142797", + "Moo é🚀MoM🚀", + "Moo é🚀oMoMMéooMoMéoéoM M o oéMoM éoo🚀 M🚀", + true, + "8502420496356956141" + ], + [ + "12147665247211144087673606942405219731406907656656044045", + "Moo é🚀oooM🚀 oooooM🚀MMé é🚀o🚀oM oM", + "Moo é🚀o🚀Mo🚀M o o🚀 oM 🚀 oéé 🚀oooo🚀é oMMéMMo🚀éééo o", + false, + "4669911440028927813" + ] + ], + "Moo é🚀 éooM🚀🚀🚀ooéooMoMéoooMooo🚀🚀o🚀Méoé🚀M 🚀éé" + ], + [ + ["0xf04276ae47e69596fe5e100b158f230d7fa613fc86e663da6a23be2603b75f00"], + [ + [ + "7878714061901294950406497810661660690695627703886513927", + "Moo é🚀ééé🚀oM 🚀ééo o🚀MoooM🚀é🚀 ééé🚀ooMoMéM🚀oMM ooM🚀oMMo ", + "Moo é🚀o🚀éooMo Mo é o🚀🚀M🚀", + true, + "3990742981477510431" + ] + ], + "Moo é🚀M oéoé oMéé🚀ooM🚀🚀oo🚀🚀ooéoé🚀 oMoMo🚀" + ], + [ + ["0x2c0a90c4f4e4390e9b691a378bf15e4f729186b9ed68307752d47092331724ca"], + [], + "Moo é🚀éMoM🚀oo oé🚀🚀🚀" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc4d6082cf912b4c32b520894d51b7a26df085acb7b0eaeb8249b15e399a9b3dd" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3227389823094766559653875229413924396012027996347215850" + }, + { + "type": "string", + "value": "Moo é🚀oMéM" + }, + { + "type": "string", + "value": "Moo é🚀é oM🚀🚀éM🚀🚀🚀o🚀oé🚀🚀M 🚀oo🚀ooM" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "7204642582434829093" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-5766724485026436906284218955900451384388016007231142797" + }, + { + "type": "string", + "value": "Moo é🚀MoM🚀" + }, + { + "type": "string", + "value": "Moo é🚀oMoMMéooMoMéoéoM M o oéMoM éoo🚀 M🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "8502420496356956141" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "12147665247211144087673606942405219731406907656656044045" + }, + { + "type": "string", + "value": "Moo é🚀oooM🚀 oooooM🚀MMé é🚀o🚀oM oM" + }, + { + "type": "string", + "value": "Moo é🚀o🚀Mo🚀M o o🚀 oM 🚀 oéé 🚀oooo🚀é oMMéMMo🚀éééo o" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "4669911440028927813" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 éooM🚀🚀🚀ooéooMoMéoooMooo🚀🚀o🚀Méoé🚀M 🚀éé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf04276ae47e69596fe5e100b158f230d7fa613fc86e663da6a23be2603b75f00" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "7878714061901294950406497810661660690695627703886513927" + }, + { + "type": "string", + "value": "Moo é🚀ééé🚀oM 🚀ééo o🚀MoooM🚀é🚀 ééé🚀ooMoMéM🚀oMM ooM🚀oMMo " + }, + { + "type": "string", + "value": "Moo é🚀o🚀éooMo Mo é o🚀🚀M🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "3990742981477510431" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M oéoé oMéé🚀ooM🚀🚀oo🚀🚀ooéoé🚀 oMoMo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2c0a90c4f4e4390e9b691a378bf15e4f729186b9ed68307752d47092331724ca" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀éMoM🚀oo oé🚀🚀🚀" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610981806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105bc565b60405180910390f35b6100566104c6565b61005e6104c6565b6100666104f3565b61006e61051a565b7fc4d6082cf912b4c32b520894d51b7a26df085acb7b0eaeb8249b15e399a9b3dd8152815260408051600380825260808201909252600091816020015b6100b3610538565b8152602001906001900390816100ab5790505090506100d0610538565b7621b20dba5c2aebd9cdc122006f88d96f9e886f9ed2afea8152604080518082018252600f81526e4d6f6f20c3a9f09f9a806f4dc3a94d60881b6020808301919091528084019190915281516080810190925260458083526000929161087d90830139604083015250600160608201526763fc0841c3ae53256080820152815181908390600090610163576101636106f2565b602002602001018190525050610177610538565b763c351902a1a8e63989c02a50e2924a8ae2ab64fc0d7b8c198152604080518082018252601181526f9adede418753e13f35009ade9be13f35607f1b60208083019190915280840191909152815160608101909252603980835260009291610913908301396040830152506001606082018190526775feaa64c85b57ed6080830152825182918491811061020d5761020d6106f2565b602002602001018190525050610221610538565b767ed3d9da0190cc4a27247df34f30bc181897eaedcac00d81526040805160608101909152603280825260009190610709602083013990508082602001819052505060006040518060800160405280605181526020016108c260519139604083015250600060608201526740cedbb663750745608082015281518190839060029081106102b0576102b06106f2565b6020026020010181905250508082602001819052505060006040518060800160405280604f8152602001610782604f913960408301525081526102f16104f3565b6102f961051a565b7ff04276ae47e69596fe5e100b158f230d7fa613fc86e663da6a23be2603b75f0081528152604080516001808252818301909252600091816020015b61033d610538565b81526020019060019003908161033557905050905061035a610538565b765241f2eb797df68f42d5a8bee5a7bdaa78285a2f1b870781526040805160808101909152605d80825260009190610820602083013990508082602001819052505060006040518060600160405280602a81526020016107d1602a913960408301525060016060820152673761f79908d9ad1f60808201528151819083906000906103e7576103e76106f2565b60200260200101819052505080826020018190525050600060405180608001604052806047815260200161073b60479139604083015250602082015261042b6104f3565b61043361051a565b7f2c0a90c4f4e4390e9b691a378bf15e4f729186b9ed68307752d47092331724ca815281526040805160008082526020820190925281610489565b610476610538565b81526020019060019003908161046e5790505b5090508082602001819052505060006040518060600160405280602581526020016107fb6025913960408301525080826002602002015250919050565b60405180606001604052806003905b6104dd6104f3565b8152602001906001900390816104d55790505090565b604051806060016040528061050661051a565b815260200160608152602001606081525090565b60405180602001604052806001906020820280368337509192915050565b6040518060a00160405280600060160b81526020016060815260200160608152602001600015158152602001600060070b81525090565b6000815180845260005b8181101561059557602081850181015186830182015201610579565b818111156105a7576000602083870101525b50601f01601f19169290920160200192915050565b6020808252600090608083820181850186855b60038110156106e557878303601f1901845281518051606090818601908660005b600181101561060d5782518252918b0191908b01906001016105f0565b50505082890151868a01839052805191829052600582901b8701890191908a01908988019060005b818110156106b257607f198a86030183528351805160160b86528d81015160a08f88015261066660a088018261056f565b9050604080830151888303828a015261067f838261056f565b92505050878201511515888801528d82015160070b8e88015280965050508c840193508c83019250600181019050610635565b50505050604092830151868203878501529291506106d0818461056f565b968901969550505091860191506001016105cf565b5090979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6f6f4df09f9a80206f6f6f6f6f4df09f9a804d4dc3a920c3a9f09f9a806ff09f9a806f4d206f4d4d6f6f20c3a9f09f9a804d206fc3a96fc3a9206f4dc3a9c3a9f09f9a806f6f4df09f9a80f09f9a806f6ff09f9a80f09f9a806f6fc3a96fc3a9f09f9a80206f4d6f4d6ff09f9a804d6f6f20c3a9f09f9a8020c3a96f6f4df09f9a80f09f9a80f09f9a806f6fc3a96f6f4d6f4dc3a96f6f6f4d6f6f6ff09f9a80f09f9a806ff09f9a804dc3a96fc3a9f09f9a804d20f09f9a80c3a9c3a94d6f6f20c3a9f09f9a806ff09f9a80c3a96f6f4d6f204d6f20c3a9206ff09f9a80f09f9a804df09f9a804d6f6f20c3a9f09f9a80c3a94d6f4df09f9a806f6f206fc3a9f09f9a80f09f9a80f09f9a804d6f6f20c3a9f09f9a80c3a9c3a9c3a9f09f9a806f4d20f09f9a80c3a9c3a96f20206ff09f9a804d6f6f6f4df09f9a80c3a9f09f9a8020c3a9c3a9c3a9f09f9a806f6f4d6f4dc3a94df09f9a806f4d4d206f6f4df09f9a806f4d4d6f204d6f6f20c3a9f09f9a80c3a9206f4df09f9a80f09f9a80c3a94df09f9a80f09f9a80f09f9a806ff09f9a806fc3a9f09f9a80f09f9a804d20f09f9a806f6ff09f9a806f6f4d4d6f6f20c3a9f09f9a806ff09f9a804d6ff09f9a804d206f206ff09f9a80206f4d20f09f9a80206fc3a9c3a920f09f9a806f6f6f6ff09f9a80c3a9206f4d4dc3a94d4d6ff09f9a80c3a9c3a9c3a96f206f4d6f6f20c3a9f09f9a806f4d6f4d4dc3a96f6f4d6f4dc3a96fc3a96f4d20204d206f206fc3a94d6f4d2020c3a96f6ff09f9a80204df09f9a80a2646970667358221220825b89cb6a679eda92ec869b3a8aca08bf56f2c31c36b7e3043371d05be26c6764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a79e3937 {\n int184 s_0;\n string s_1;\n string s_2;\n bool s_3;\n int64 s_4;\n }\n\n struct S_a1aeef04 {\n bytes32[1] s_0;\n S_a79e3937[] s_1;\n string s_2;\n }\n\n function test () public pure returns (S_a1aeef04[3] memory) {\n S_a1aeef04[3] memory r;\n {\n S_a1aeef04 memory r_0;\n {\n bytes32[1] memory r_0_0;\n {\n bytes32 r_0_0_0 = bytes32(0xc4d6082cf912b4c32b520894d51b7a26df085acb7b0eaeb8249b15e399a9b3dd);\n r_0_0[0] = r_0_0_0;\n }\n r_0.s_0 = r_0_0;\n }\n {\n S_a79e3937[] memory r_0_1 = new S_a79e3937[](3);\n {\n S_a79e3937 memory r_0_1_0;\n {\n int184 r_0_1_0_0 = 3227389823094766559653875229413924396012027996347215850;\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n string memory r_0_1_0_1 = unicode\"Moo é🚀oMéM\";\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n string memory r_0_1_0_2 = unicode\"Moo é🚀é oM🚀🚀éM🚀🚀🚀o🚀oé🚀🚀M 🚀oo🚀ooM\";\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n {\n bool r_0_1_0_3 = true;\n r_0_1_0.s_3 = r_0_1_0_3;\n }\n {\n int64 r_0_1_0_4 = 7204642582434829093;\n r_0_1_0.s_4 = r_0_1_0_4;\n }\n r_0_1[0] = r_0_1_0;\n }\n {\n S_a79e3937 memory r_0_1_1;\n {\n int184 r_0_1_1_0 = -5766724485026436906284218955900451384388016007231142797;\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n string memory r_0_1_1_1 = unicode\"Moo é🚀MoM🚀\";\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n string memory r_0_1_1_2 = unicode\"Moo é🚀oMoMMéooMoMéoéoM M o oéMoM éoo🚀 M🚀\";\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n {\n bool r_0_1_1_3 = true;\n r_0_1_1.s_3 = r_0_1_1_3;\n }\n {\n int64 r_0_1_1_4 = 8502420496356956141;\n r_0_1_1.s_4 = r_0_1_1_4;\n }\n r_0_1[1] = r_0_1_1;\n }\n {\n S_a79e3937 memory r_0_1_2;\n {\n int184 r_0_1_2_0 = 12147665247211144087673606942405219731406907656656044045;\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n string memory r_0_1_2_1 = unicode\"Moo é🚀oooM🚀 oooooM🚀MMé é🚀o🚀oM oM\";\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n string memory r_0_1_2_2 = unicode\"Moo é🚀o🚀Mo🚀M o o🚀 oM 🚀 oéé 🚀oooo🚀é oMMéMMo🚀éééo o\";\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n {\n bool r_0_1_2_3 = false;\n r_0_1_2.s_3 = r_0_1_2_3;\n }\n {\n int64 r_0_1_2_4 = 4669911440028927813;\n r_0_1_2.s_4 = r_0_1_2_4;\n }\n r_0_1[2] = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀 éooM🚀🚀🚀ooéooMoMéoooMooo🚀🚀o🚀Méoé🚀M 🚀éé\";\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_a1aeef04 memory r_1;\n {\n bytes32[1] memory r_1_0;\n {\n bytes32 r_1_0_0 = bytes32(0xf04276ae47e69596fe5e100b158f230d7fa613fc86e663da6a23be2603b75f00);\n r_1_0[0] = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n S_a79e3937[] memory r_1_1 = new S_a79e3937[](1);\n {\n S_a79e3937 memory r_1_1_0;\n {\n int184 r_1_1_0_0 = 7878714061901294950406497810661660690695627703886513927;\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n string memory r_1_1_0_1 = unicode\"Moo é🚀ééé🚀oM 🚀ééo o🚀MoooM🚀é🚀 ééé🚀ooMoMéM🚀oMM ooM🚀oMMo \";\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n string memory r_1_1_0_2 = unicode\"Moo é🚀o🚀éooMo Mo é o🚀🚀M🚀\";\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n {\n bool r_1_1_0_3 = true;\n r_1_1_0.s_3 = r_1_1_0_3;\n }\n {\n int64 r_1_1_0_4 = 3990742981477510431;\n r_1_1_0.s_4 = r_1_1_0_4;\n }\n r_1_1[0] = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀M oéoé oMéé🚀ooM🚀🚀oo🚀🚀ooéoé🚀 oMoMo🚀\";\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_a1aeef04 memory r_2;\n {\n bytes32[1] memory r_2_0;\n {\n bytes32 r_2_0_0 = bytes32(0x2c0a90c4f4e4390e9b691a378bf15e4f729186b9ed68307752d47092331724ca);\n r_2_0[0] = r_2_0_0;\n }\n r_2.s_0 = r_2_0;\n }\n {\n S_a79e3937[] memory r_2_1 = new S_a79e3937[](0);\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀éMoM🚀oo oé🚀🚀🚀\";\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000880c4d6082cf912b4c32b520894d51b7a26df085acb7b0eaeb8249b15e399a9b3dd000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000030000000000000000000021b20dba5c2aebd9cdc122006f88d96f9e886f9ed2afea00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000063fc0841c3ae5325000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806f4dc3a94d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a80c3a9206f4df09f9a80f09f9a80c3a94df09f9a80f09f9a80f09f9a806ff09f9a806fc3a9f09f9a80f09f9a804d20f09f9a806f6ff09f9a806f6f4d000000000000000000000000000000000000000000000000000000ffffffffffffffffffc3cae6fd5e5719c6763fd5af1d6db5751d549b03f2847300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000075feaa64c85b57ed00000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804d6f4df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f4d6f4d4dc3a96f6f4d6f4dc3a96fc3a96f4d20204d206f206fc3a94d6f4d2020c3a96f6ff09f9a80204df09f9a80000000000000000000000000000000007ed3d9da0190cc4a27247df34f30bc181897eaedcac00d00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040cedbb66375074500000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a806f6f6f4df09f9a80206f6f6f6f6f4df09f9a804d4dc3a920c3a9f09f9a806ff09f9a806f4d206f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a806ff09f9a804d6ff09f9a804d206f206ff09f9a80206f4d20f09f9a80206fc3a9c3a920f09f9a806f6f6f6ff09f9a80c3a9206f4d4dc3a94d4d6ff09f9a80c3a9c3a9c3a96f206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a8020c3a96f6f4df09f9a80f09f9a80f09f9a806f6fc3a96f6f4d6f4dc3a96f6f6f4d6f6f6ff09f9a80f09f9a806ff09f9a804dc3a96fc3a9f09f9a804d20f09f9a80c3a9c3a90000000000000000000000000000000000f04276ae47e69596fe5e100b158f230d7fa613fc86e663da6a23be2603b75f0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000005241f2eb797df68f42d5a8bee5a7bdaa78285a2f1b870700000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000003761f79908d9ad1f000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a80c3a9c3a9c3a9f09f9a806f4d20f09f9a80c3a9c3a96f20206ff09f9a804d6f6f6f4df09f9a80c3a9f09f9a8020c3a9c3a9c3a9f09f9a806f6f4d6f4dc3a94df09f9a806f4d4d206f6f4df09f9a806f4d4d6f20000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a806ff09f9a80c3a96f6f4d6f204d6f20c3a9206ff09f9a80f09f9a804df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a804d206fc3a96fc3a9206f4dc3a9c3a9f09f9a806f6f4df09f9a80f09f9a806f6ff09f9a80f09f9a806f6fc3a96fc3a9f09f9a80206f4d6f4d6ff09f9a80000000000000000000000000000000000000000000000000002c0a90c4f4e4390e9b691a378bf15e4f729186b9ed68307752d47092331724ca00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a80c3a94d6f4df09f9a806f6f206fc3a9f09f9a80f09f9a80f09f9a80000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int240,bool[2],uint168,(bytes2,address,bytes23,address)[4],int8)", + "type": "(int240,bool[2],uint168,(bytes2,address,bytes23,address)[4],int8)", + "value": [ + "-403702370009211908536660830119123770505137295644894082844678981841102604", + [true, false], + "174851448085213452956069975898037158060831376523577", + [ + [ + "0xace0", + "0x4EEf68612d9713d3cdF8c47fC0b34027910f69f2", + "0xf24b3655d0a0a6ad0425f6697219da4af6bb65af3618da", + "0x1D0d43cC9CAA3Ab04a997E7826ead5c31bBB8310" + ], + [ + "0x0693", + "0x50Bf174585b3a834A9b8270059e18eA3Cd3e96e3", + "0xa4f8fb2c47149fd2c80936ce347409d0a487e12445a73b", + "0x8C1660421BcD2958506F5c081b8b4268E78CFa39" + ], + [ + "0xa09d", + "0xA1C587Ec860eaf456cF76036Bc797BdF3B0fDf27", + "0x441884a6d4f877bf773a520d7d5c4e32560141ec4e6de1", + "0xBBf05Ce45877034c5ACfA84b23bf19E459463ABd" + ], + [ + "0x17e5", + "0x2D096e58B43eec9457a1002298fe0394f69B1881", + "0xc0caa5bcc6dd75e565a68828111da5d140dd345bd7108b", + "0x2AD93E2955EA8d12e09F3aB9578bd71faa8fF6b0" + ] + ], + "66" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-403702370009211908536660830119123770505137295644894082844678981841102604" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "174851448085213452956069975898037158060831376523577" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xace0" + }, + { + "type": "address", + "value": "0x4EEf68612d9713d3cdF8c47fC0b34027910f69f2" + }, + { + "type": "hexstring", + "value": "0xf24b3655d0a0a6ad0425f6697219da4af6bb65af3618da" + }, + { + "type": "address", + "value": "0x1D0d43cC9CAA3Ab04a997E7826ead5c31bBB8310" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0693" + }, + { + "type": "address", + "value": "0x50Bf174585b3a834A9b8270059e18eA3Cd3e96e3" + }, + { + "type": "hexstring", + "value": "0xa4f8fb2c47149fd2c80936ce347409d0a487e12445a73b" + }, + { + "type": "address", + "value": "0x8C1660421BcD2958506F5c081b8b4268E78CFa39" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa09d" + }, + { + "type": "address", + "value": "0xA1C587Ec860eaf456cF76036Bc797BdF3B0fDf27" + }, + { + "type": "hexstring", + "value": "0x441884a6d4f877bf773a520d7d5c4e32560141ec4e6de1" + }, + { + "type": "address", + "value": "0xBBf05Ce45877034c5ACfA84b23bf19E459463ABd" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x17e5" + }, + { + "type": "address", + "value": "0x2D096e58B43eec9457a1002298fe0394f69B1881" + }, + { + "type": "hexstring", + "value": "0xc0caa5bcc6dd75e565a68828111da5d140dd345bd7108b" + }, + { + "type": "address", + "value": "0x2AD93E2955EA8d12e09F3aB9578bd71faa8fF6b0" + } + ] + } + ] + }, + { + "type": "number", + "value": "66" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610454806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061039d565b60405180910390f35b61005661028d565b61005e61028d565b7fffffc581d8cbe4646be69bfffdfce8530c78095cc6e4b9e4467bcbb74d5758f481526100896102cb565b6001815260006020808301919091528201527477a3621a1b29883bd44b8924771925b63cf0cdc13960408201526100be6102e9565b604080516080808201835261056760f51b8252734eef68612d9713d3cdf8c47fc0b34027910f69f26020808401919091527ff24b3655d0a0a6ad0425f6697219da4af6bb65af3618da00000000000000000083850152731d0d43cc9caa3ab04a997e7826ead5c31bbb83106060808501919091529285528351808301855261069360f01b81527350bf174585b3a834a9b8270059e18ea3cd3e96e3818301527fa4f8fb2c47149fd2c80936ce347409d0a487e12445a73b00000000000000000081860152738c1660421bcd2958506f5c081b8b4268e78cfa3981850152858201528351808301855261a09d60f01b815273a1c587ec860eaf456cf76036bc797bdf3b0fdf27818301527f441884a6d4f877bf773a520d7d5c4e32560141ec4e6de10000000000000000008186015273bbf05ce45877034c5acfa84b23bf19e459463abd8185015285850152835180830185526117e560f01b8152732d096e58b43eec9457a1002298fe0394f69b1881918101919091527fc0caa5bcc6dd75e565a68828111da5d140dd345bd7108b00000000000000000093810193909352732ad93e2955ea8d12e09f3ab9578bd71faa8ff6b08383015283820192909252830191909152604290820152919050565b6040518060a001604052806000601d0b81526020016102aa6102cb565b8152600060208201526040016102be6102e9565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004905b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816102f85790505090565b8060005b600481101561039757815180516001600160f01b03191685526020808201516001600160a01b039081168288015260408084015168ffffffffffffffffff191690880152606092830151169186019190915260809094019390910190600101610333565b50505050565b8151601d0b81526020808301516102a08301919081840160005b60028110156103d65782511515825291830191908301906001016103b7565b5050505060408301516001600160a81b0316606083810191909152830151610401608084018261032f565b50608083015161041761028084018260000b9052565b509291505056fea2646970667358221220abb7e6baa4df82a70a3b807dfd0b72b5abcf98892bee293d78195ca1e5e3c4f264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5116c5ff {\n bytes2 s_0;\n address s_1;\n bytes23 s_2;\n address s_3;\n }\n\n struct S_3ed2b3f3 {\n int240 s_0;\n bool[2] s_1;\n uint168 s_2;\n S_5116c5ff[4] s_3;\n int8 s_4;\n }\n\n function test () public pure returns (S_3ed2b3f3 memory) {\n S_3ed2b3f3 memory r;\n {\n int240 r_0 = -403702370009211908536660830119123770505137295644894082844678981841102604;\n r.s_0 = r_0;\n }\n {\n bool[2] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n uint168 r_2 = 174851448085213452956069975898037158060831376523577;\n r.s_2 = r_2;\n }\n {\n S_5116c5ff[4] memory r_3;\n {\n S_5116c5ff memory r_3_0;\n {\n bytes2 r_3_0_0 = bytes2(0xace0);\n r_3_0.s_0 = r_3_0_0;\n }\n {\n address r_3_0_1 = 0x4EEf68612d9713d3cdF8c47fC0b34027910f69f2;\n r_3_0.s_1 = r_3_0_1;\n }\n {\n bytes23 r_3_0_2 = bytes23(0xf24b3655d0a0a6ad0425f6697219da4af6bb65af3618da);\n r_3_0.s_2 = r_3_0_2;\n }\n {\n address r_3_0_3 = 0x1D0d43cC9CAA3Ab04a997E7826ead5c31bBB8310;\n r_3_0.s_3 = r_3_0_3;\n }\n r_3[0] = r_3_0;\n }\n {\n S_5116c5ff memory r_3_1;\n {\n bytes2 r_3_1_0 = bytes2(0x0693);\n r_3_1.s_0 = r_3_1_0;\n }\n {\n address r_3_1_1 = 0x50Bf174585b3a834A9b8270059e18eA3Cd3e96e3;\n r_3_1.s_1 = r_3_1_1;\n }\n {\n bytes23 r_3_1_2 = bytes23(0xa4f8fb2c47149fd2c80936ce347409d0a487e12445a73b);\n r_3_1.s_2 = r_3_1_2;\n }\n {\n address r_3_1_3 = 0x8C1660421BcD2958506F5c081b8b4268E78CFa39;\n r_3_1.s_3 = r_3_1_3;\n }\n r_3[1] = r_3_1;\n }\n {\n S_5116c5ff memory r_3_2;\n {\n bytes2 r_3_2_0 = bytes2(0xa09d);\n r_3_2.s_0 = r_3_2_0;\n }\n {\n address r_3_2_1 = 0xA1C587Ec860eaf456cF76036Bc797BdF3B0fDf27;\n r_3_2.s_1 = r_3_2_1;\n }\n {\n bytes23 r_3_2_2 = bytes23(0x441884a6d4f877bf773a520d7d5c4e32560141ec4e6de1);\n r_3_2.s_2 = r_3_2_2;\n }\n {\n address r_3_2_3 = 0xBBf05Ce45877034c5ACfA84b23bf19E459463ABd;\n r_3_2.s_3 = r_3_2_3;\n }\n r_3[2] = r_3_2;\n }\n {\n S_5116c5ff memory r_3_3;\n {\n bytes2 r_3_3_0 = bytes2(0x17e5);\n r_3_3.s_0 = r_3_3_0;\n }\n {\n address r_3_3_1 = 0x2D096e58B43eec9457a1002298fe0394f69B1881;\n r_3_3.s_1 = r_3_3_1;\n }\n {\n bytes23 r_3_3_2 = bytes23(0xc0caa5bcc6dd75e565a68828111da5d140dd345bd7108b);\n r_3_3.s_2 = r_3_3_2;\n }\n {\n address r_3_3_3 = 0x2AD93E2955EA8d12e09F3aB9578bd71faa8fF6b0;\n r_3_3.s_3 = r_3_3_3;\n }\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n {\n int8 r_4 = 66;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0xffffc581d8cbe4646be69bfffdfce8530c78095cc6e4b9e4467bcbb74d5758f400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000077a3621a1b29883bd44b8924771925b63cf0cdc139ace00000000000000000000000000000000000000000000000000000000000000000000000000000000000004eef68612d9713d3cdf8c47fc0b34027910f69f2f24b3655d0a0a6ad0425f6697219da4af6bb65af3618da0000000000000000000000000000000000000000001d0d43cc9caa3ab04a997e7826ead5c31bbb8310069300000000000000000000000000000000000000000000000000000000000000000000000000000000000050bf174585b3a834a9b8270059e18ea3cd3e96e3a4f8fb2c47149fd2c80936ce347409d0a487e12445a73b0000000000000000000000000000000000000000008c1660421bcd2958506f5c081b8b4268e78cfa39a09d000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1c587ec860eaf456cf76036bc797bdf3b0fdf27441884a6d4f877bf773a520d7d5c4e32560141ec4e6de1000000000000000000000000000000000000000000bbf05ce45877034c5acfa84b23bf19e459463abd17e50000000000000000000000000000000000000000000000000000000000000000000000000000000000002d096e58b43eec9457a1002298fe0394f69b1881c0caa5bcc6dd75e565a68828111da5d140dd345bd7108b0000000000000000000000000000000000000000002ad93e2955ea8d12e09f3ab9578bd71faa8ff6b00000000000000000000000000000000000000000000000000000000000000042" + }, + { + "name": "random-(string,address[2],(uint168[],bytes1[1],string),string,bool)", + "type": "(string,address[2],(uint168[],bytes1[1],string),string,bool)", + "value": [ + "Moo é🚀é o oooé🚀🚀 🚀🚀éo 🚀o MMéo oo🚀o éoMo", + [ + "0x2f25B8224fd558585129f103a7C789a09B422B93", + "0x969ac1a550fAfc03E0024FCD799BFfDebb68a72c" + ], + [ + [ + "179843515880633008439626350009744337972267305043325", + "338377012014492455856762628722909119948344669918289" + ], + ["0xb3"], + "Moo é🚀🚀oo M🚀🚀oo🚀éooéMé oMoééo oM🚀🚀oéo éé🚀🚀 M🚀🚀🚀é Moéo" + ], + "Moo é🚀éééM🚀 Moo", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é o oooé🚀🚀 🚀🚀éo 🚀o MMéo oo🚀o éoMo" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2f25B8224fd558585129f103a7C789a09B422B93" + }, + { + "type": "address", + "value": "0x969ac1a550fAfc03E0024FCD799BFfDebb68a72c" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "179843515880633008439626350009744337972267305043325" + }, + { + "type": "number", + "value": "338377012014492455856762628722909119948344669918289" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oo M🚀🚀oo🚀éooéMé oMoééo oM🚀🚀oéo éé🚀🚀 M🚀🚀🚀é Moéo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éééM🚀 Moo" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061052e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061038d565b60405180910390f35b610056610203565b61005e610203565b60006040518060800160405280604381526020016104b66043913982525061008461023e565b732f25b8224fd558585129f103a7c789a09b422b93815273969ac1a550fafc03e0024fcd799bffdebb68a72c6020808301919091528201526100c461025c565b6040805160028082526060820183526000926020830190803683370190505090506000747b0dce29f64191caaed88282182e22977504e6857d9050808260008151811061011357610113610439565b60200260200101906001600160a81b031690816001600160a81b03168152505050600074e786e5fe59e7295c1fcca62f5240d6785f0cc654519050808260018151811061016257610162610439565b6001600160a81b0390921660209283029190910190910152508152610185610283565b60b360f81b81526020828101919091526040805160a0810190915260668082526000926104509083013960408084019190915283810192909252508051808201909152601981527f4d6f6f20c3a9f09f9a80c3a9c3a9c3a94df09f9a80204d6f6f000000000000006020820152606082015260006080820152919050565b6040518060a001604052806060815260200161021d61023e565b815260200161022a61025c565b815260606020820152600060409091015290565b60405180604001604052806002906020820280368337509192915050565b604051806060016040528060608152602001610276610283565b8152602001606081525090565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156102c7576020818501810151868301820152016102ab565b818111156102d9576000602083870101525b50601f01601f19169290920160200192915050565b805160608084528151908401819052600091602091908201906080860190845b818110156103335783516001600160a81b03168352928401929184019160010161030e565b505082850151915082860160005b60018110156103685783516001600160f81b03191682529284019290840190600101610341565b505060408501519250858103604087015261038381846102a1565b9695505050505050565b60006020808352835160c0828501526103a960e08501826102a1565b9050818501516040850160005b60028110156103dc5782516001600160a01b0316825291840191908401906001016103b6565b50505060408501519150601f19808583030160808601526103fd82846102ee565b925060608601519150808584030160a08601525061041b82826102a1565b915050608084015161043160c085018215159052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a806f6f204df09f9a80f09f9a806f6ff09f9a80c3a96f6fc3a94dc3a9206f4d6fc3a9c3a96f206f4df09f9a80f09f9a806fc3a96f20c3a9c3a9f09f9a80f09f9a80204df09f9a80f09f9a80f09f9a80c3a92020204d6fc3a96f4d6f6f20c3a9f09f9a80c3a9206f206f6f6fc3a9f09f9a80f09f9a8020f09f9a80f09f9a80c3a96f20f09f9a806f204d4dc3a96f20206f6ff09f9a806f20c3a96f4d6fa264697066735822122063a9c1ef0caf6fca4a12de35e2f2428869df9aba60fcef65afbe2f2691ff424e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_24f93496 {\n uint168[] s_0;\n bytes1[1] s_1;\n string s_2;\n }\n\n struct S_7f591fe6 {\n string s_0;\n address[2] s_1;\n S_24f93496 s_2;\n string s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_7f591fe6 memory) {\n S_7f591fe6 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀é o oooé🚀🚀 🚀🚀éo 🚀o MMéo oo🚀o éoMo\";\n r.s_0 = r_0;\n }\n {\n address[2] memory r_1;\n {\n address r_1_0 = 0x2f25B8224fd558585129f103a7C789a09B422B93;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0x969ac1a550fAfc03E0024FCD799BFfDebb68a72c;\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n S_24f93496 memory r_2;\n {\n uint168[] memory r_2_0 = new uint168[](2);\n {\n uint168 r_2_0_0 = 179843515880633008439626350009744337972267305043325;\n r_2_0[0] = r_2_0_0;\n }\n {\n uint168 r_2_0_1 = 338377012014492455856762628722909119948344669918289;\n r_2_0[1] = r_2_0_1;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bytes1[1] memory r_2_1;\n {\n bytes1 r_2_1_0 = bytes1(0xb3);\n r_2_1[0] = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀🚀oo M🚀🚀oo🚀éooéMé oMoééo oM🚀🚀oéo éé🚀🚀 M🚀🚀🚀é Moéo\";\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀éééM🚀 Moo\";\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000002f25b8224fd558585129f103a7c789a09b422b93000000000000000000000000969ac1a550fafc03e0024fcd799bffdebb68a72c000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80c3a9206f206f6f6fc3a9f09f9a80f09f9a8020f09f9a80f09f9a80c3a96f20f09f9a806f204d4dc3a96f20206f6ff09f9a806f20c3a96f4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000200000000000000000000007b0dce29f64191caaed88282182e22977504e6857d0000000000000000000000e786e5fe59e7295c1fcca62f5240d6785f0cc6545100000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a80f09f9a806f6f204df09f9a80f09f9a806f6ff09f9a80c3a96f6fc3a94dc3a9206f4d6fc3a9c3a96f206f4df09f9a80f09f9a806fc3a96f20c3a9c3a9f09f9a80f09f9a80204df09f9a80f09f9a80f09f9a80c3a92020204d6fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a80c3a9c3a9c3a94df09f9a80204d6f6f00000000000000" + }, + { + "name": "random-(string,bool,(bytes22,bool,bytes9,address,string[]),address)[3]", + "type": "(string,bool,(bytes22,bool,bytes9,address,string[]),address)[3]", + "value": [ + [ + "Moo é🚀", + true, + [ + "0x67bc9b3a320317242252181af375be7b7873d1d4fb00", + false, + "0x852134cdb68cd78c82", + "0xE255562e50815A85aa2B773922D49667C0d1dD48", + [ + "Moo é🚀M M oo🚀ooMé🚀éo🚀o oéo", + "Moo é🚀", + "Moo é🚀éo 🚀oo o🚀M", + "Moo é🚀 éMo🚀🚀 🚀Moéoo🚀é🚀o" + ] + ], + "0x4086D5EfC1dC51d34822A8369544040525173e5B" + ], + [ + "Moo é🚀", + true, + [ + "0x29adc7020d24f53125d726a51762b5a8fd9270707413", + true, + "0x8bef7130c25a4347f8", + "0x72cCeb7dC53f128b1cB258301F4d43094b70a156", + ["Moo é🚀oM🚀 ooéMéooo oMMo o🚀🚀oéé🚀MM ooo o", "Moo é🚀 ooooM🚀oooooooooMM"] + ], + "0xB8180Be816dFeD24666c6252888DdA1B4265D467" + ], + [ + "Moo é🚀é🚀", + true, + [ + "0x013cd26853073933528b58825111dc15af95bc1ee74b", + false, + "0xea25c40103283a5f65", + "0xE78F4a86d983348693c1eBca62c410403cdf3C0c", + [ + "Moo é🚀", + "Moo é🚀o 🚀o🚀éMoM🚀oMoéMo🚀 éoo🚀 oMoéMMMééM🚀é o ", + "Moo é🚀oo🚀🚀o oo 🚀 éoo🚀oo 🚀oM 🚀🚀o" + ] + ], + "0x31EA7A1A0850327b85a7a5c51edA553e76fcE1D5" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x67bc9b3a320317242252181af375be7b7873d1d4fb00" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x852134cdb68cd78c82" + }, + { + "type": "address", + "value": "0xE255562e50815A85aa2B773922D49667C0d1dD48" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M M oo🚀ooMé🚀éo🚀o oéo" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀éo 🚀oo o🚀M" + }, + { + "type": "string", + "value": "Moo é🚀 éMo🚀🚀 🚀Moéoo🚀é🚀o" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x4086D5EfC1dC51d34822A8369544040525173e5B" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x29adc7020d24f53125d726a51762b5a8fd9270707413" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x8bef7130c25a4347f8" + }, + { + "type": "address", + "value": "0x72cCeb7dC53f128b1cB258301F4d43094b70a156" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM🚀 ooéMéooo oMMo o🚀🚀oéé🚀MM ooo o" + }, + { + "type": "string", + "value": "Moo é🚀 ooooM🚀oooooooooMM" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xB8180Be816dFeD24666c6252888DdA1B4265D467" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x013cd26853073933528b58825111dc15af95bc1ee74b" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xea25c40103283a5f65" + }, + { + "type": "address", + "value": "0xE78F4a86d983348693c1eBca62c410403cdf3C0c" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o 🚀o🚀éMoM🚀oMoéMo🚀 éoo🚀 oMoéMMMééM🚀é o " + }, + { + "type": "string", + "value": "Moo é🚀oo🚀🚀o oo 🚀 éoo🚀oo 🚀oM 🚀🚀o" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x31EA7A1A0850327b85a7a5c51edA553e76fcE1D5" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506108fe806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061066f565b60405180910390f35b610056610598565b61005e610598565b6100666105c5565b60408051808201909152600a8152689adede418753e13f3560b71b60208083019190915290825260019082015261009b6105f2565b7467bc9b3a320317242252181af375be7b7873d1d4fb60581b81526000602082018190526842909a66db466bc64160b91b60408084019190915273e255562e50815a85aa2b773922d49667c0d1dd4860608401528051600480825260a0820190925290816020015b606081526020019060019003908161010357905050905060006040518060600160405280602a81526020016107b0602a91399050808260008151811061014b5761014b610799565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b8152509050808260018151811061019157610191610799565b60200260200101819052505060006040518060400160405280601b81526020017f4d6f6f20c3a9f09f9a80c3a96f20f09f9a806f6f206ff09f9a804d0000000000815250905080826002815181106101eb576101eb610799565b60200260200101819052505060006040518060600160405280602d815260200161089c602d91399050808260038151811061022857610228610799565b60209081029190910101525060808201526040820152734086d5efc1dc51d34822a8369544040525173e5b606082015281526102626105c5565b60408051808201909152600a8152689adede418753e13f3560b71b6020808301919091529082526001908201526102976105f2565b7529adc7020d24f53125d726a51762b5a8fd927070741360501b81526001602082015268117dee26184b4868ff60bb1b60408201527372cceb7dc53f128b1cb258301f4d43094b70a15660608201526000600260405190808252806020026020018201604052801561031d57816020015b60608152602001906001900390816103085790505b50905060006040518060600160405280603d815260200161085f603d91399050808260008151811061035157610351610799565b60200260200101819052505060006040518060400160405280601f81526020017f4d6f6f20c3a9f09f9a80206f6f6f6f4df09f9a806f6f6f6f6f6f6f6f6f4d4d00815250905080826001815181106103ab576103ab610799565b6020908102919091010152506080820152604082015273b8180be816dfed24666c6252888dda1b4265d4676060820152808260016020020152506103ed6105c5565b60408051808201909152601081526e9adede418753e13f35018753e13f3560871b6020808301919091529082526001908201526104286105f2565b75013cd26853073933528b58825111dc15af95bc1ee74b60501b815260006020820181905268ea25c40103283a5f6560b81b60408084019190915273e78f4a86d983348693c1ebca62c410403cdf3c0c6060840152805160038082526080820190925290816020015b606081526020019060019003908161049157905050905060006040518060400160405280600a8152602001689adede418753e13f3560b71b815250905080826000815181106104e2576104e2610799565b60200260200101819052505060006040518060800160405280604a8152602001610815604a91399050808260018151811061051f5761051f610799565b60200260200101819052505060006040518060600160405280603b81526020016107da603b91399050808260028151811061055c5761055c610799565b60209081029190910101525060808201526040828101919091527331ea7a1a0850327b85a7a5c51eda553e76fce1d56060830152820152919050565b60405180606001604052806003905b6105af6105c5565b8152602001906001900390816105a75790505090565b6040805160808101825260608152600060208201529081016105e56105f2565b8152600060209091015290565b6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b6000815180845260005b818110156106485760208185018101518683018201520161062c565b8181111561065a576000602083870101525b50601f01601f19169290920160200192915050565b602080825260009060808382018185018685805b600381101561078b57888403601f19018552825180518786526106a888870182610622565b828a01511515878b0152604080840151888303828a0152805169ffffffffffffffffffff19168352808c015115158c840152808201516001600160b81b031916918301919091526060808201516001600160a01b031681840152908a015160a08b840181905281519084018190529293509091908b019060c080850191600581901b860190910190885b818110156107605760bf1987840301845261074e838651610622565b948f0194938f01939250600101610732565b5050948301516001600160a01b03169890920197909752505094870194935091860191600101610683565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d204d206f6ff09f9a806f6f4dc3a9f09f9a80c3a96ff09f9a806f206fc3a96f4d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a806f206f6f2020f09f9a802020c3a96f6ff09f9a806f6f20f09f9a806f4d20f09f9a80f09f9a806f4d6f6f20c3a9f09f9a806f20f09f9a806ff09f9a80c3a94d6f4df09f9a806f4d6fc3a94d6ff09f9a8020c3a96f6ff09f9a8020206f4d6fc3a94d4d4dc3a9c3a94df09f9a80c3a9206f204d6f6f20c3a9f09f9a806f4df09f9a80206f6fc3a94dc3a96f6f6f206f4d4d6f206ff09f9a80f09f9a806fc3a9c3a9f09f9a804d4d206f6f6f2020206f4d6f6f20c3a9f09f9a8020c3a94d6ff09f9a80f09f9a8020f09f9a804d6fc3a96f6ff09f9a80c3a9f09f9a806fa2646970667358221220b5e8b67b36189a8262ff308f48e6c1577ef29b7732034b7dd07ba0fe78a03efe64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_24945a01 {\n bytes22 s_0;\n bool s_1;\n bytes9 s_2;\n address s_3;\n string[] s_4;\n }\n\n struct S_d67a7322 {\n string s_0;\n bool s_1;\n S_24945a01 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_d67a7322[3] memory) {\n S_d67a7322[3] memory r;\n {\n S_d67a7322 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n S_24945a01 memory r_0_2;\n {\n bytes22 r_0_2_0 = bytes22(0x67bc9b3a320317242252181af375be7b7873d1d4fb00);\n r_0_2.s_0 = r_0_2_0;\n }\n {\n bool r_0_2_1 = false;\n r_0_2.s_1 = r_0_2_1;\n }\n {\n bytes9 r_0_2_2 = bytes9(0x852134cdb68cd78c82);\n r_0_2.s_2 = r_0_2_2;\n }\n {\n address r_0_2_3 = 0xE255562e50815A85aa2B773922D49667C0d1dD48;\n r_0_2.s_3 = r_0_2_3;\n }\n {\n string[] memory r_0_2_4 = new string[](4);\n {\n string memory r_0_2_4_0 = unicode\"Moo é🚀M M oo🚀ooMé🚀éo🚀o oéo\";\n r_0_2_4[0] = r_0_2_4_0;\n }\n {\n string memory r_0_2_4_1 = unicode\"Moo é🚀\";\n r_0_2_4[1] = r_0_2_4_1;\n }\n {\n string memory r_0_2_4_2 = unicode\"Moo é🚀éo 🚀oo o🚀M\";\n r_0_2_4[2] = r_0_2_4_2;\n }\n {\n string memory r_0_2_4_3 = unicode\"Moo é🚀 éMo🚀🚀 🚀Moéoo🚀é🚀o\";\n r_0_2_4[3] = r_0_2_4_3;\n }\n r_0_2.s_4 = r_0_2_4;\n }\n r_0.s_2 = r_0_2;\n }\n {\n address r_0_3 = 0x4086D5EfC1dC51d34822A8369544040525173e5B;\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_d67a7322 memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀\";\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n S_24945a01 memory r_1_2;\n {\n bytes22 r_1_2_0 = bytes22(0x29adc7020d24f53125d726a51762b5a8fd9270707413);\n r_1_2.s_0 = r_1_2_0;\n }\n {\n bool r_1_2_1 = true;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n bytes9 r_1_2_2 = bytes9(0x8bef7130c25a4347f8);\n r_1_2.s_2 = r_1_2_2;\n }\n {\n address r_1_2_3 = 0x72cCeb7dC53f128b1cB258301F4d43094b70a156;\n r_1_2.s_3 = r_1_2_3;\n }\n {\n string[] memory r_1_2_4 = new string[](2);\n {\n string memory r_1_2_4_0 = unicode\"Moo é🚀oM🚀 ooéMéooo oMMo o🚀🚀oéé🚀MM ooo o\";\n r_1_2_4[0] = r_1_2_4_0;\n }\n {\n string memory r_1_2_4_1 = unicode\"Moo é🚀 ooooM🚀oooooooooMM\";\n r_1_2_4[1] = r_1_2_4_1;\n }\n r_1_2.s_4 = r_1_2_4;\n }\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0xB8180Be816dFeD24666c6252888DdA1B4265D467;\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_d67a7322 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀é🚀\";\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n S_24945a01 memory r_2_2;\n {\n bytes22 r_2_2_0 = bytes22(0x013cd26853073933528b58825111dc15af95bc1ee74b);\n r_2_2.s_0 = r_2_2_0;\n }\n {\n bool r_2_2_1 = false;\n r_2_2.s_1 = r_2_2_1;\n }\n {\n bytes9 r_2_2_2 = bytes9(0xea25c40103283a5f65);\n r_2_2.s_2 = r_2_2_2;\n }\n {\n address r_2_2_3 = 0xE78F4a86d983348693c1eBca62c410403cdf3C0c;\n r_2_2.s_3 = r_2_2_3;\n }\n {\n string[] memory r_2_2_4 = new string[](3);\n {\n string memory r_2_2_4_0 = unicode\"Moo é🚀\";\n r_2_2_4[0] = r_2_2_4_0;\n }\n {\n string memory r_2_2_4_1 = unicode\"Moo é🚀o 🚀o🚀éMoM🚀oMoéMo🚀 éoo🚀 oMoéMMMééM🚀é o \";\n r_2_2_4[1] = r_2_2_4_1;\n }\n {\n string memory r_2_2_4_2 = unicode\"Moo é🚀oo🚀🚀o oo 🚀 éoo🚀oo 🚀oM 🚀🚀o\";\n r_2_2_4[2] = r_2_2_4_2;\n }\n r_2_2.s_4 = r_2_2_4;\n }\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0x31EA7A1A0850327b85a7a5c51edA553e76fcE1D5;\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004086d5efc1dc51d34822a8369544040525173e5b000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000067bc9b3a320317242252181af375be7b7873d1d4fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000852134cdb68cd78c820000000000000000000000000000000000000000000000000000000000000000000000e255562e50815a85aa2b773922d49667c0d1dd4800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a804d204d206f6ff09f9a806f6f4dc3a9f09f9a80c3a96ff09f9a806f206fc3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80c3a96f20f09f9a806f6f206ff09f9a804d0000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a8020c3a94d6ff09f9a80f09f9a8020f09f9a804d6fc3a96f6ff09f9a80c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000b8180be816dfed24666c6252888dda1b4265d467000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000029adc7020d24f53125d726a51762b5a8fd92707074130000000000000000000000000000000000000000000000000000000000000000000000000000000000018bef7130c25a4347f8000000000000000000000000000000000000000000000000000000000000000000000072cceb7dc53f128b1cb258301f4d43094b70a15600000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806f4df09f9a80206f6fc3a94dc3a96f6f6f206f4d4d6f206ff09f9a80f09f9a806fc3a9c3a9f09f9a804d4d206f6f6f2020206f000000000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a80206f6f6f6f4df09f9a806f6f6f6f6f6f6f6f6f4d4d000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000031ea7a1a0850327b85a7a5c51eda553e76fce1d500000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80c3a9f09f9a8000000000000000000000000000000000013cd26853073933528b58825111dc15af95bc1ee74b000000000000000000000000000000000000000000000000000000000000000000000000000000000000ea25c40103283a5f650000000000000000000000000000000000000000000000000000000000000000000000e78f4a86d983348693c1ebca62c410403cdf3c0c00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f20f09f9a806ff09f9a80c3a94d6f4df09f9a806f4d6fc3a94d6ff09f9a8020c3a96f6ff09f9a8020206f4d6fc3a94d4d4dc3a9c3a94df09f9a80c3a9206f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a806f6ff09f9a80f09f9a806f206f6f2020f09f9a802020c3a96f6ff09f9a806f6f20f09f9a806f4d20f09f9a80f09f9a806f0000000000" + }, + { + "name": "random-(((address,address,bytes10)[],int232,string),bool[3],int40,string,int88)", + "type": "(((address,address,bytes10)[],int232,string),bool[3],int40,string,int88)", + "value": [ + [ + [ + [ + "0xCd2BA1Ee69Ed70864faaF4E858ed227d68F6ab0A", + "0xdB15830E882c4c95f0f3D086B0ccA62398867Cef", + "0x18c2790b43c9f58bce67" + ], + [ + "0xADcaCE74Fd61c8DAaeC7A9753F01b03627c71B28", + "0x7b2610EEe5763cF273D27dBa73dC6e6eB8dCA13e", + "0x2e31b3b5bff830b75dec" + ], + [ + "0x3F1A91712E08C1c7744EaFf341d6E7a7dA93aC22", + "0x4d7824E8181cfDe2134Eb76a503548BF547cB1D1", + "0x2b366950b7ab7e5ea9b8" + ] + ], + "2547036973721796361908427292914529870096031577404663883014100863408875", + "Moo é🚀o🚀oooo M🚀o🚀 o🚀 o" + ], + [true, false, true], + "202296080683", + "Moo é🚀oMoMoéoo o🚀🚀🚀🚀MéMo🚀éoMM oé 🚀 ", + "-17221204314813648301393939" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xCd2BA1Ee69Ed70864faaF4E858ed227d68F6ab0A" + }, + { + "type": "address", + "value": "0xdB15830E882c4c95f0f3D086B0ccA62398867Cef" + }, + { + "type": "hexstring", + "value": "0x18c2790b43c9f58bce67" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xADcaCE74Fd61c8DAaeC7A9753F01b03627c71B28" + }, + { + "type": "address", + "value": "0x7b2610EEe5763cF273D27dBa73dC6e6eB8dCA13e" + }, + { + "type": "hexstring", + "value": "0x2e31b3b5bff830b75dec" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x3F1A91712E08C1c7744EaFf341d6E7a7dA93aC22" + }, + { + "type": "address", + "value": "0x4d7824E8181cfDe2134Eb76a503548BF547cB1D1" + }, + { + "type": "hexstring", + "value": "0x2b366950b7ab7e5ea9b8" + } + ] + } + ] + }, + { + "type": "number", + "value": "2547036973721796361908427292914529870096031577404663883014100863408875" + }, + { + "type": "string", + "value": "Moo é🚀o🚀oooo M🚀o🚀 o🚀 o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "202296080683" + }, + { + "type": "string", + "value": "Moo é🚀oMoMoéoo o🚀🚀🚀🚀MéMo🚀éoMM oé 🚀 " + }, + { + "type": "number", + "value": "-17221204314813648301393939" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105a8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103dc565b60405180910390f35b6100566102f9565b61005e6102f9565b60408051606080820183528082526000602083018190528284019190915282516003808252608082019094529192909190816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816100945750506040805160608101825273cd2ba1ee69ed70864faaf4e858ed227d68f6ab0a815273db15830e882c4c95f0f3d086b0cca62398867cef60208201526918c2790b43c9f58bce6760b01b9181019190915281519192509081908390600090610129576101296104f9565b602002602001018190525050610158604080516060810182526000808252602082018190529181019190915290565b73adcace74fd61c8daaec7a9753f01b03627c71b288152737b2610eee5763cf273d27dba73dc6e6eb8dca13e6020820152690b8c6ced6ffe0c2dd77b60b21b604082015281518190839060019081106101b3576101b36104f9565b6020026020010181905250506101e2604080516060810182526000808252602082018190529181019190915290565b733f1a91712e08c1c7744eaff341d6e7a7da93ac228152734d7824e8181cfde2134eb76a503548bf547cb1d16020820152690566cd2a16f56fcbd53760b31b6040820152815181908390600290811061023d5761023d6104f9565b602090810291909101810191909152918352507c5e798fe81325bd49738bb21c942408d479c20155ecf9dffc0b471bdaeb828201526040805160608101909152602680825260009261054d90830139604083015250815261029c610346565b60018082526000602080840182905260408085019390935284810193909352642f19c9392b84830152815160608101909252603d8083529092610510908301396060830152506a0e3ebb5b46a81aa2430812196080820152919050565b604080516101008101909152606060a08201818152600060c084015260e083019190915281526020810161032b610346565b81526000602082018190526060604083018190529091015290565b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b8181101561038a5760208185018101518683018201520161036e565b8181111561039c576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60038110156103d657815115158452602093840193909101906001016103b5565b50505050565b6020808252825160e08383015280516060610100850181905281516101608601819052600094939284019185916101808801905b8084101561045a57845180516001600160a01b0390811684528882015116888401526040908101516001600160b01b03191690830152938601936001939093019290820190610410565b50858501519350610471610120890185601c0b9052565b6040850151945060ff198882030161014089015261048f8186610364565b9450508488015194506104a560408801866103b1565b604088015194506104bb60a088018660040b9052565b870151868403601f190160c088015293506104da915082905083610364565b91505060808401516104f160e0850182600a0b9052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d6f4d6fc3a96f6f206ff09f9a80f09f9a80f09f9a80f09f9a804dc3a94d6ff09f9a80c3a96f4d4d206fc3a920f09f9a80204d6f6f20c3a9f09f9a806ff09f9a806f6f6f6f204df09f9a806ff09f9a80206ff09f9a80206fa264697066735822122075f74550ffc054edec9b22c856ba45049d2616ad56acf293042b0c8cb8bff76464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ab2ff2de {\n address s_0;\n address s_1;\n bytes10 s_2;\n }\n\n struct S_27fc7447 {\n S_ab2ff2de[] s_0;\n int232 s_1;\n string s_2;\n }\n\n struct S_e8b69507 {\n S_27fc7447 s_0;\n bool[3] s_1;\n int40 s_2;\n string s_3;\n int88 s_4;\n }\n\n function test () public pure returns (S_e8b69507 memory) {\n S_e8b69507 memory r;\n {\n S_27fc7447 memory r_0;\n {\n S_ab2ff2de[] memory r_0_0 = new S_ab2ff2de[](3);\n {\n S_ab2ff2de memory r_0_0_0;\n {\n address r_0_0_0_0 = 0xCd2BA1Ee69Ed70864faaF4E858ed227d68F6ab0A;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n address r_0_0_0_1 = 0xdB15830E882c4c95f0f3D086B0ccA62398867Cef;\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n bytes10 r_0_0_0_2 = bytes10(0x18c2790b43c9f58bce67);\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_ab2ff2de memory r_0_0_1;\n {\n address r_0_0_1_0 = 0xADcaCE74Fd61c8DAaeC7A9753F01b03627c71B28;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n address r_0_0_1_1 = 0x7b2610EEe5763cF273D27dBa73dC6e6eB8dCA13e;\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n bytes10 r_0_0_1_2 = bytes10(0x2e31b3b5bff830b75dec);\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n S_ab2ff2de memory r_0_0_2;\n {\n address r_0_0_2_0 = 0x3F1A91712E08C1c7744EaFf341d6E7a7dA93aC22;\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n address r_0_0_2_1 = 0x4d7824E8181cfDe2134Eb76a503548BF547cB1D1;\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n {\n bytes10 r_0_0_2_2 = bytes10(0x2b366950b7ab7e5ea9b8);\n r_0_0_2.s_2 = r_0_0_2_2;\n }\n r_0_0[2] = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n {\n int232 r_0_1 = 2547036973721796361908427292914529870096031577404663883014100863408875;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀o🚀oooo M🚀o🚀 o🚀 o\";\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bool[3] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = true;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n int40 r_2 = 202296080683;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀oMoMoéoo o🚀🚀🚀🚀MéMo🚀éoMM oé 🚀 \";\n r.s_3 = r_3;\n }\n {\n int88 r_4 = -17221204314813648301393939;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000002f19c9392b00000000000000000000000000000000000000000000000000000000000002e0fffffffffffffffffffffffffffffffffffffffffff1c144a4b957e55dbcf7ed00000000000000000000000000000000000000000000000000000000000000600000005e798fe81325bd49738bb21c942408d479c20155ecf9dffc0b471bdaeb00000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000cd2ba1ee69ed70864faaf4e858ed227d68f6ab0a000000000000000000000000db15830e882c4c95f0f3d086b0cca62398867cef18c2790b43c9f58bce6700000000000000000000000000000000000000000000000000000000000000000000adcace74fd61c8daaec7a9753f01b03627c71b280000000000000000000000007b2610eee5763cf273d27dba73dc6e6eb8dca13e2e31b3b5bff830b75dec000000000000000000000000000000000000000000000000000000000000000000003f1a91712e08c1c7744eaff341d6e7a7da93ac220000000000000000000000004d7824e8181cfde2134eb76a503548bf547cb1d12b366950b7ab7e5ea9b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a806ff09f9a806f6f6f6f204df09f9a806ff09f9a80206ff09f9a80206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806f4d6f4d6fc3a96f6f206ff09f9a80f09f9a80f09f9a80f09f9a804dc3a94d6ff09f9a80c3a96f4d4d206fc3a920f09f9a8020000000" + }, + { + "name": "random-(((bool,string,string,bytes30,bool),bytes12,uint176,string,bytes23),int72[3])", + "type": "(((bool,string,string,bytes30,bool),bytes12,uint176,string,bytes23),int72[3])", + "value": [ + [ + [ + false, + "Moo é🚀oéoé 🚀Moooé ooé oMMoooééMooéooé🚀oo🚀o é🚀oMé é", + "Moo é🚀🚀M🚀🚀o 🚀oM🚀🚀Mo Mo🚀éM🚀Mé🚀é🚀Moo🚀🚀 Mo🚀o🚀🚀🚀🚀oo é 🚀oMM oMo 🚀🚀 ", + "0x28e78032d7d945cced2f7de12f17790b02ede12b6a6f18b1c368eaf5f968", + false + ], + "0xbbe9a67c17a8528be2be13e8", + "15373804840663994511981326899441106752049751886743384", + "Moo é🚀o🚀ooMé🚀o 🚀 o éoMé", + "0x736fa3569433d67976773e6f6f14810a3e94e99402cf45" + ], + ["-1011832647432448474394", "-1383562459575301402241", "-1121266229049976815275"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oéoé 🚀Moooé ooé oMMoooééMooéooé🚀oo🚀o é🚀oMé é" + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀🚀o 🚀oM🚀🚀Mo Mo🚀éM🚀Mé🚀é🚀Moo🚀🚀 Mo🚀o🚀🚀🚀🚀oo é 🚀oMM oMo 🚀🚀 " + }, + { + "type": "hexstring", + "value": "0x28e78032d7d945cced2f7de12f17790b02ede12b6a6f18b1c368eaf5f968" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xbbe9a67c17a8528be2be13e8" + }, + { + "type": "number", + "value": "15373804840663994511981326899441106752049751886743384" + }, + { + "type": "string", + "value": "Moo é🚀o🚀ooMé🚀o 🚀 o éoMé" + }, + { + "type": "hexstring", + "value": "0x736fa3569433d67976773e6f6f14810a3e94e99402cf45" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1011832647432448474394" + }, + { + "type": "number", + "value": "-1383562459575301402241" + }, + { + "type": "number", + "value": "-1121266229049976815275" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061050f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102e3565b60405180910390f35b6100566101d0565b61005e6101d0565b6100666101f5565b6040805160a0810182526000808252606060208301819052928201839052918101829052608081019190915260008082526040805160808101909152604d80825261048d602083013990508082602001819052505060006040518060c001604052806082815260200161040b608291396040808401919091527f28e78032d7d945cced2f7de12f17790b02ede12b6a6f18b1c368eaf5f96800006060808501919091526000608085018190529385526b177d34cf82f50a517c57c27d60a31b6020808701919091527529172f23a650289e8bf582521a7a6dbf72ccaea947588684015282519182019092526027808252909250906103e4908301396060830152507f736fa3569433d67976773e6f6f14810a3e94e99402cf450000000000000000006080820152815261019761024c565b6836d9ffafebb2277d19198152684b00c9468e3f976e8019602080830191909152683cc8b1de990da5feaa196040830152820152919050565b60405180604001604052806101e36101f5565b81526020016101f061024c565b905290565b604080516101408101909152600060a08201818152606060c0840181905260e08401526101008301829052610120830191909152819081526000602082018190526040820181905260608083015260809091015290565b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b8181101561029057602081850181015186830182015201610274565b818111156102a2576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60038110156102dd57815160080b8452602093840193909101906001016102bb565b50505050565b602081526000825160806020840152805160a08085015280511515610140850152602081015160a061016086015261031f6101e086018261026a565b9050604082015161013f198683030161018087015261033e828261026a565b60608481015161ffff19166101a089015260809094015115156101c088015260208501516001600160a01b03191660c088015260408501516001600160b01b031660e088015292840151868403609f19016101008801529291506103a49050818361026a565b915050608082015191506103c761012085018368ffffffffffffffffff19169052565b602085015191506103db60408501836102b7565b94935050505056fe4d6f6f20c3a9f09f9a806ff09f9a806f6f4dc3a9f09f9a806f20f09f9a80206f20c3a96f4dc3a94d6f6f20c3a9f09f9a80f09f9a804df09f9a80f09f9a806f20f09f9a806f4df09f9a80f09f9a804d6f204d6ff09f9a80c3a94df09f9a804dc3a9f09f9a80c3a9f09f9a804d6f6ff09f9a80f09f9a80204d6ff09f9a806ff09f9a80f09f9a80f09f9a80f09f9a806f6f20c3a920f09f9a806f4d4d206f4d6f20f09f9a80f09f9a80204d6f6f20c3a9f09f9a806fc3a96fc3a920f09f9a804d6f6f6fc3a9206f6fc3a9206f4d4d6f6f6fc3a9c3a94d6f6fc3a96f6fc3a9f09f9a806f6ff09f9a806f20c3a9f09f9a806f4dc3a920c3a9a2646970667358221220e0ad165fc3e56a4796e05151a81d2c592217449003891514e2f8382aaaa61e9c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_efd43eae {\n bool s_0;\n string s_1;\n string s_2;\n bytes30 s_3;\n bool s_4;\n }\n\n struct S_e534fe2d {\n S_efd43eae s_0;\n bytes12 s_1;\n uint176 s_2;\n string s_3;\n bytes23 s_4;\n }\n\n struct S_aac76a6a {\n S_e534fe2d s_0;\n int72[3] s_1;\n }\n\n function test () public pure returns (S_aac76a6a memory) {\n S_aac76a6a memory r;\n {\n S_e534fe2d memory r_0;\n {\n S_efd43eae memory r_0_0;\n {\n bool r_0_0_0 = false;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀oéoé 🚀Moooé ooé oMMoooééMooéooé🚀oo🚀o é🚀oMé é\";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀🚀M🚀🚀o 🚀oM🚀🚀Mo Mo🚀éM🚀Mé🚀é🚀Moo🚀🚀 Mo🚀o🚀🚀🚀🚀oo é 🚀oMM oMo 🚀🚀 \";\n r_0_0.s_2 = r_0_0_2;\n }\n {\n bytes30 r_0_0_3 = bytes30(0x28e78032d7d945cced2f7de12f17790b02ede12b6a6f18b1c368eaf5f968);\n r_0_0.s_3 = r_0_0_3;\n }\n {\n bool r_0_0_4 = false;\n r_0_0.s_4 = r_0_0_4;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bytes12 r_0_1 = bytes12(0xbbe9a67c17a8528be2be13e8);\n r_0.s_1 = r_0_1;\n }\n {\n uint176 r_0_2 = 15373804840663994511981326899441106752049751886743384;\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀o🚀ooMé🚀o 🚀 o éoMé\";\n r_0.s_3 = r_0_3;\n }\n {\n bytes23 r_0_4 = bytes23(0x736fa3569433d67976773e6f6f14810a3e94e99402cf45);\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n int72[3] memory r_1;\n {\n int72 r_1_0 = -1011832647432448474394;\n r_1[0] = r_1_0;\n }\n {\n int72 r_1_1 = -1383562459575301402241;\n r_1[1] = r_1_1;\n }\n {\n int72 r_1_2 = -1121266229049976815275;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffffffffffffffffc9260050144dd882e6ffffffffffffffffffffffffffffffffffffffffffffffb4ff36b971c068917fffffffffffffffffffffffffffffffffffffffffffffffc3374e2166f25a015500000000000000000000000000000000000000000000000000000000000000a0bbe9a67c17a8528be2be13e800000000000000000000000000000000000000000000000000000000000029172f23a650289e8bf582521a7a6dbf72ccaea947580000000000000000000000000000000000000000000000000000000000000280736fa3569433d67976773e6f6f14810a3e94e99402cf45000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012028e78032d7d945cced2f7de12f17790b02ede12b6a6f18b1c368eaf5f96800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a806fc3a96fc3a920f09f9a804d6f6f6fc3a9206f6fc3a9206f4d4d6f6f6fc3a9c3a94d6f6fc3a96f6fc3a9f09f9a806f6ff09f9a806f20c3a9f09f9a806f4dc3a920c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000824d6f6f20c3a9f09f9a80f09f9a804df09f9a80f09f9a806f20f09f9a806f4df09f9a80f09f9a804d6f204d6ff09f9a80c3a94df09f9a804dc3a9f09f9a80c3a9f09f9a804d6f6ff09f9a80f09f9a80204d6ff09f9a806ff09f9a80f09f9a80f09f9a80f09f9a806f6f20c3a920f09f9a806f4d4d206f4d6f20f09f9a80f09f9a802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806ff09f9a806f6f4dc3a9f09f9a806f20f09f9a80206f20c3a96f4dc3a900000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bool,(string,(string,bytes3,address),uint48,address,bool[1])),string,bool)", + "type": "((bool,(string,(string,bytes3,address),uint48,address,bool[1])),string,bool)", + "value": [ + [ + false, + [ + "Moo é🚀 🚀🚀éooMMoMo éM🚀oM oMoééoMoMoMé🚀 é éMMoM éMM", + [ + "Moo é🚀é🚀é🚀🚀o🚀é🚀éMMéMoM", + "0x8957ce", + "0x674f996d32816a34338DecCF23D2B3BfC6565A49" + ], + "100237906634362", + "0xB559cEa4CC8dD9223A8b35ae1962334EC6bbF250", + [true] + ] + ], + "Moo é🚀éoo éMoM", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀🚀éooMMoMo éM🚀oM oMoééoMoMoMé🚀 é éMMoM éMM" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀é🚀🚀o🚀é🚀éMMéMoM" + }, + { + "type": "hexstring", + "value": "0x8957ce" + }, + { + "type": "address", + "value": "0x674f996d32816a34338DecCF23D2B3BfC6565A49" + } + ] + }, + { + "type": "number", + "value": "100237906634362" + }, + { + "type": "address", + "value": "0xB559cEa4CC8dD9223A8b35ae1962334EC6bbF250" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éoo éMoM" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610454806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102a7565b60405180910390f35b61005661017d565b61005e61017d565b6100666101a4565b600081526100726101c5565b60006040518060800160405280604c81526020016103d3604c9139825250604080516060808201835281526000602082018190529181019190915260006040518060600160405280602e81526020016103a5602e91398252506244abe760e91b60208083019190915273674f996d32816a34338deccf23d2b3bfc6565a4960408084019190915290830191909152655b2a74d1667a9082015273b559cea4cc8dd9223a8b35ae1962334ec6bbf250606082015261012d610211565b60018152608082015260208281019190915290825260408051808201825260148152734d6f6f20c3a9f09f9a80c3a96f6f20c3a94d6f4d60601b8184015291830191909152600090820152919050565b60405180606001604052806101906101a4565b815260606020820152600060409091015290565b60405180604001604052806000151581526020016101c06101c5565b905290565b6040518060a00160405280606081526020016101fa604080516060808201835281526000602082018190529181019190915290565b815260006020820181905260408201526060016101c05b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b8181101561025557602081850181015186830182015201610239565b81811115610267576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60018110156102a15781511515845260209384019390910190600101610280565b50505050565b60006020808352835160608285015280511515608085015281810151905060408060a0860152815160a060c08701526102e461016087018261022f565b90508383015160bf198783030160e0880152805160608352610309606084018261022f565b828701516001600160e81b03191684880152848301516001600160a01b03908116948601949094528585015165ffffffffffff166101008a015260608601519384166101208a015260809095015194905061036861014089018661027c565b94880151878603601f19018489015294610382818761022f565b95505050508086015191505061039c606085018215159052565b50939250505056fe4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9f09f9a80f09f9a806ff09f9a80c3a9f09f9a80c3a94d4dc3a94d6f4d4d6f6f20c3a9f09f9a802020f09f9a80f09f9a80c3a96f6f4d4d6f4d6f20c3a94df09f9a806f4d2020206f4d6fc3a9c3a96f4d6f4d6f4dc3a9f09f9a8020c3a920c3a94d4d6f4d20c3a94d4da2646970667358221220a296f44ec231a01c847b573a4924a6e87a01a1a426021e4b0cea8f838086ee7164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d76e7644 {\n string s_0;\n bytes3 s_1;\n address s_2;\n }\n\n struct S_698ef546 {\n string s_0;\n S_d76e7644 s_1;\n uint48 s_2;\n address s_3;\n bool[1] s_4;\n }\n\n struct S_f56cbb96 {\n bool s_0;\n S_698ef546 s_1;\n }\n\n struct S_f09a2469 {\n S_f56cbb96 s_0;\n string s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_f09a2469 memory) {\n S_f09a2469 memory r;\n {\n S_f56cbb96 memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n S_698ef546 memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀 🚀🚀éooMMoMo éM🚀oM oMoééoMoMoMé🚀 é éMMoM éMM\";\n r_0_1.s_0 = r_0_1_0;\n }\n {\n S_d76e7644 memory r_0_1_1;\n {\n string memory r_0_1_1_0 = unicode\"Moo é🚀é🚀é🚀🚀o🚀é🚀éMMéMoM\";\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n bytes3 r_0_1_1_1 = bytes3(0x8957ce);\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n address r_0_1_1_2 = 0x674f996d32816a34338DecCF23D2B3BfC6565A49;\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n uint48 r_0_1_2 = 100237906634362;\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0xB559cEa4CC8dD9223A8b35ae1962334EC6bbF250;\n r_0_1.s_3 = r_0_1_3;\n }\n {\n bool[1] memory r_0_1_4;\n {\n bool r_0_1_4_0 = true;\n r_0_1_4[0] = r_0_1_4_0;\n }\n r_0_1.s_4 = r_0_1_4;\n }\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éoo éMoM\";\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000005b2a74d1667a000000000000000000000000b559cea4cc8dd9223a8b35ae1962334ec6bbf2500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a802020f09f9a80f09f9a80c3a96f6f4d4d6f4d6f20c3a94df09f9a806f4d2020206f4d6fc3a9c3a96f4d6f4d6f4dc3a9f09f9a8020c3a920c3a94d4d6f4d20c3a94d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000608957ce0000000000000000000000000000000000000000000000000000000000000000000000000000000000674f996d32816a34338deccf23d2b3bfc6565a49000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9f09f9a80f09f9a806ff09f9a80c3a9f09f9a80c3a94d4dc3a94d6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a80c3a96f6f20c3a94d6f4d000000000000000000000000" + }, + { + "name": "random-((bool),((bytes18[],bool,string[2],address,bytes2),address,bool),address)", + "type": "((bool),((bytes18[],bool,string[2],address,bytes2),address,bool),address)", + "value": [ + [false], + [ + [ + [ + "0xf34d534066d40fd11229fc2bb2d4b1a0d235", + "0x4b6e3d1a4622b37ebd48c10dc348e58e391a", + "0xfdf517a081f28e87927008e956952b645399" + ], + true, + [ + "Moo é🚀ooooo oM🚀M🚀oéo MM🚀ééo MM 🚀 ", + "Moo é🚀 MéoM🚀o🚀o 🚀é🚀M🚀Mooé🚀 ooééoM" + ], + "0x25CbA404FfeCcdB3b3545C6BDEd131b486d88512", + "0xa4b8" + ], + "0xa25Ec86bad5A6371A3f713F77Ac442A51A517E90", + false + ], + "0x42FAd4Fd3451c2ae824cb23b36a34A2105d082b9" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf34d534066d40fd11229fc2bb2d4b1a0d235" + }, + { + "type": "hexstring", + "value": "0x4b6e3d1a4622b37ebd48c10dc348e58e391a" + }, + { + "type": "hexstring", + "value": "0xfdf517a081f28e87927008e956952b645399" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooooo oM🚀M🚀oéo MM🚀ééo MM 🚀 " + }, + { + "type": "string", + "value": "Moo é🚀 MéoM🚀o🚀o 🚀é🚀M🚀Mooé🚀 ooééoM" + } + ] + }, + { + "type": "address", + "value": "0x25CbA404FfeCcdB3b3545C6BDEd131b486d88512" + }, + { + "type": "hexstring", + "value": "0xa4b8" + } + ] + }, + { + "type": "address", + "value": "0xa25Ec86bad5A6371A3f713F77Ac442A51A517E90" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x42FAd4Fd3451c2ae824cb23b36a34A2105d082b9" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061052f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061035c565b60405180910390f35b610056610241565b61005e610241565b6040805160208101909152600081528152610077610270565b61007f610297565b60408051600380825260808201909252600091602082016060803683375050815191925071f34d534066d40fd11229fc2bb2d4b1a0d23560701b9182915083906000906100ce576100ce610470565b6001600160701b0319909216602092830291909101909101525080517125b71e8d231159bf5ea46086e1a472c71c8d60711b9081908390600190811061011657610116610470565b6001600160701b03199092166020928302919091019091015250805171fdf517a081f28e87927008e956952b64539960701b9081908390600290811061015e5761015e610470565b6001600160701b0319909216602092830291909101820152918352506001908201526101886102b3565b60006040518060600160405280603581526020016104c5603591398252506040805160608101909152603e8082526000919061048760208301396020808401919091526040848101939093527325cba404ffeccdb3b3545c6bded131b486d88512606085015261149760f31b60808501529284525073a25ec86bad5a6371a3f713f77ac442a51a517e9083830152600083820152908301919091527342fad4fd3451c2ae824cb23b36a34a2105d082b990820152919050565b6040805160808101909152600060608201908152815260208101610263610270565b8152600060209091015290565b6040518060600160405280610283610297565b815260006020820181905260409091015290565b6040805160a08101825260608152600060208201529081016102835b60405180604001604052806002905b60608152602001906001900390816102c25790505090565b60008260408101836000805b600281101561035057848403885282518051808652835b81811015610319576020818401810151888301820152016102fd565b8181111561032a5784602083890101525b506020998a0199601f91909101601f1916959095018501949390930192506001016102e6565b50919695505050505050565b6000602080835283515115158184015280840151606060408501528051606060808601526101808501815160a060e08801528181518084526101a0890191508683019350600092505b808310156103cf5783516001600160701b03191682529286019260019290920191908601906103a5565b50858401511515610100890152604084015160df19898303016101208a015292506103fa81846102da565b9250505060608201516104196101408801826001600160a01b03169052565b50608082015191506104386101608701836001600160f01b0319169052565b928201516001600160a01b0390811660a0870152604092830151151560c0870152959091015190941660609093019290925250919050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a802020204dc3a96f4df09f9a806ff09f9a806f20f09f9a80c3a9f09f9a804df09f9a804d6f6fc3a9f09f9a80206f6fc3a9c3a96f4d4d6f6f20c3a9f09f9a806f6f6f6f6f206f4df09f9a804df09f9a806fc3a96f204d4df09f9a80c3a9c3a96f204d4d2020f09f9a8020a2646970667358221220f879b3c257cb13a05a2c31bc28684ef342c4c5d70a75dd1dd815b02e20a67a8764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_b1507c6d {\n bytes18[] s_0;\n bool s_1;\n string[2] s_2;\n address s_3;\n bytes2 s_4;\n }\n\n struct S_2d571853 {\n S_b1507c6d s_0;\n address s_1;\n bool s_2;\n }\n\n struct S_a0926b2a {\n S_c1053bda s_0;\n S_2d571853 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_a0926b2a memory) {\n S_a0926b2a memory r;\n {\n S_c1053bda memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n S_2d571853 memory r_1;\n {\n S_b1507c6d memory r_1_0;\n {\n bytes18[] memory r_1_0_0 = new bytes18[](3);\n {\n bytes18 r_1_0_0_0 = bytes18(0xf34d534066d40fd11229fc2bb2d4b1a0d235);\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n bytes18 r_1_0_0_1 = bytes18(0x4b6e3d1a4622b37ebd48c10dc348e58e391a);\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n bytes18 r_1_0_0_2 = bytes18(0xfdf517a081f28e87927008e956952b645399);\n r_1_0_0[2] = r_1_0_0_2;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bool r_1_0_1 = true;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n string[2] memory r_1_0_2;\n {\n string memory r_1_0_2_0 = unicode\"Moo é🚀ooooo oM🚀M🚀oéo MM🚀ééo MM 🚀 \";\n r_1_0_2[0] = r_1_0_2_0;\n }\n {\n string memory r_1_0_2_1 = unicode\"Moo é🚀 MéoM🚀o🚀o 🚀é🚀M🚀Mooé🚀 ooééoM\";\n r_1_0_2[1] = r_1_0_2_1;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n {\n address r_1_0_3 = 0x25CbA404FfeCcdB3b3545C6BDEd131b486d88512;\n r_1_0.s_3 = r_1_0_3;\n }\n {\n bytes2 r_1_0_4 = bytes2(0xa4b8);\n r_1_0.s_4 = r_1_0_4;\n }\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0xa25Ec86bad5A6371A3f713F77Ac442A51A517E90;\n r_1.s_1 = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x42FAd4Fd3451c2ae824cb23b36a34A2105d082b9;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000042fad4fd3451c2ae824cb23b36a34a2105d082b90000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a25ec86bad5a6371a3f713f77ac442a51a517e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000025cba404ffeccdb3b3545c6bded131b486d88512a4b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f34d534066d40fd11229fc2bb2d4b1a0d23500000000000000000000000000004b6e3d1a4622b37ebd48c10dc348e58e391a0000000000000000000000000000fdf517a081f28e87927008e956952b6453990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a806f6f6f6f6f206f4df09f9a804df09f9a806fc3a96f204d4df09f9a80c3a9c3a96f204d4d2020f09f9a80200000000000000000000000000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a802020204dc3a96f4df09f9a806ff09f9a806f20f09f9a80c3a9f09f9a804df09f9a804d6f6fc3a9f09f9a80206f6fc3a9c3a96f4d0000" + }, + { + "name": "random-((bool[4],bool,address)[2],address[4],bytes3,(int216,string,address))", + "type": "((bool[4],bool,address)[2],address[4],bytes3,(int216,string,address))", + "value": [ + [ + [[true, true, true, false], false, "0x0246a09a120AB6120a133a3bE0B1FEF398Fc7Ef9"], + [[true, true, true, false], true, "0x4D6E8E8EB75c958665dc11AF9e9FFd2C0dd28b52"] + ], + [ + "0xB680962D3bee6fF9C05538627fD53a7c2A62f0Fd", + "0x46680b1eB78d7514795b2a28F5B9d6B60cb3b6f2", + "0x2dc2C02F1c9c52e6295d3Db8252B8dF082588b46", + "0x165C6027E20E0Cd8E0FE9DE3BA3D2b30f60a5c62" + ], + "0x6df2fa", + [ + "-44464390171147625489391479425103316763329688937263544007342445236", + "Moo é🚀é oo éooooo🚀 éoéMé M🚀oMéM🚀 ooM", + "0x53c48a6260366b9f66e2761d0f990a1521D272C2" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x0246a09a120AB6120a133a3bE0B1FEF398Fc7Ef9" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x4D6E8E8EB75c958665dc11AF9e9FFd2C0dd28b52" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB680962D3bee6fF9C05538627fD53a7c2A62f0Fd" + }, + { + "type": "address", + "value": "0x46680b1eB78d7514795b2a28F5B9d6B60cb3b6f2" + }, + { + "type": "address", + "value": "0x2dc2C02F1c9c52e6295d3Db8252B8dF082588b46" + }, + { + "type": "address", + "value": "0x165C6027E20E0Cd8E0FE9DE3BA3D2b30f60a5c62" + } + ] + }, + { + "type": "hexstring", + "value": "0x6df2fa" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-44464390171147625489391479425103316763329688937263544007342445236" + }, + { + "type": "string", + "value": "Moo é🚀é oo éooooo🚀 éoéMé M🚀oMéM🚀 ooM" + }, + { + "type": "address", + "value": "0x53c48a6260366b9f66e2761d0f990a1521D272C2" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104ce806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103a1565b60405180910390f35b610056610211565b61005e610211565b61006661027c565b61006e6102a9565b6100766102d0565b60018082526020808301829052604080840192909252600060608401819052928452830191909152730246a09a120ab6120a133a3be0b1fef398fc7ef99082015281526100c16102a9565b6100c96102d0565b6001808252602080830182905260408084018390526000606085015292845283810191909152734d6e8e8eb75c958665dc11af9e9ffd2c0dd28b529183019190915282015281526101186102d0565b73b680962d3bee6ff9c05538627fd53a7c2a62f0fd81527346680b1eb78d7514795b2a28f5b9d6b60cb3b6f2602080830191909152732dc2c02f1c9c52e6295d3db8252b8df082588b4660408084019190915273165c6027e20e0cd8e0fe9de3ba3d2b30f60a5c62606080850191909152848301939093526236f97d60e91b848201528051808401825280830184905260008183018190527a6c16420810fda8236aac9da5d0f96e59ba4804973caf5f385852b31982528251948501909252603880855290939192610461908301396020830152507353c48a6260366b9f66e2761d0f990a1521d272c260408201526060820152919050565b604051806080016040528061022461027c565b81526020016102316102d0565b815260200160006001600160e81b031916815260200161027760405180606001604052806000601a0b81526020016060815260200160006001600160a01b031681525090565b905290565b60405180604001604052806002905b6102936102a9565b81526020019060019003908161028b5790505090565b60405180606001604052806102bc6102d0565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b8060005b600481101561031a5781516001600160a01b03168452602093840193909101906001016102f2565b50505050565b8051601a0b82526000602080830151606082860152805180606087015260005b8181101561035c57828101840151878201608001528301610340565b8181111561036e576000608083890101525b506040850151925061038b60408701846001600160a01b03169052565b601f01601f191694909401608001949350505050565b602080825282516000919082848301815b6002811015610413578351805183855b60048110156103e15782511515825291880191908801906001016103c2565b5050508086015115156080840152604001516001600160a01b031660a08301529284019260c0909101906001016103b2565b505050508301516104286101a08401826102ee565b5060408301516001600160e81b031916610220830152606083015161024080840152610458610260840182610320565b94935050505056fe4d6f6f20c3a9f09f9a80c3a9206f6f20c3a96f6f6f6f6ff09f9a8020c3a96fc3a94dc3a920204df09f9a806f4dc3a94df09f9a80206f6f4da26469706673582212201266d3dbad4fa2a426233c5bbb5a212a0d0e9d939364aff55528405e6d24b10664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8462387e {\n bool[4] s_0;\n bool s_1;\n address s_2;\n }\n\n struct S_6b024e88 {\n int216 s_0;\n string s_1;\n address s_2;\n }\n\n struct S_fe798ef9 {\n S_8462387e[2] s_0;\n address[4] s_1;\n bytes3 s_2;\n S_6b024e88 s_3;\n }\n\n function test () public pure returns (S_fe798ef9 memory) {\n S_fe798ef9 memory r;\n {\n S_8462387e[2] memory r_0;\n {\n S_8462387e memory r_0_0;\n {\n bool[4] memory r_0_0_0;\n {\n bool r_0_0_0_0 = true;\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n bool r_0_0_0_1 = true;\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n bool r_0_0_0_2 = true;\n r_0_0_0[2] = r_0_0_0_2;\n }\n {\n bool r_0_0_0_3 = false;\n r_0_0_0[3] = r_0_0_0_3;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bool r_0_0_1 = false;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x0246a09a120AB6120a133a3bE0B1FEF398Fc7Ef9;\n r_0_0.s_2 = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n {\n S_8462387e memory r_0_1;\n {\n bool[4] memory r_0_1_0;\n {\n bool r_0_1_0_0 = true;\n r_0_1_0[0] = r_0_1_0_0;\n }\n {\n bool r_0_1_0_1 = true;\n r_0_1_0[1] = r_0_1_0_1;\n }\n {\n bool r_0_1_0_2 = true;\n r_0_1_0[2] = r_0_1_0_2;\n }\n {\n bool r_0_1_0_3 = false;\n r_0_1_0[3] = r_0_1_0_3;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bool r_0_1_1 = true;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x4D6E8E8EB75c958665dc11AF9e9FFd2C0dd28b52;\n r_0_1.s_2 = r_0_1_2;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n address[4] memory r_1;\n {\n address r_1_0 = 0xB680962D3bee6fF9C05538627fD53a7c2A62f0Fd;\n r_1[0] = r_1_0;\n }\n {\n address r_1_1 = 0x46680b1eB78d7514795b2a28F5B9d6B60cb3b6f2;\n r_1[1] = r_1_1;\n }\n {\n address r_1_2 = 0x2dc2C02F1c9c52e6295d3Db8252B8dF082588b46;\n r_1[2] = r_1_2;\n }\n {\n address r_1_3 = 0x165C6027E20E0Cd8E0FE9DE3BA3D2b30f60a5c62;\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bytes3 r_2 = bytes3(0x6df2fa);\n r.s_2 = r_2;\n }\n {\n S_6b024e88 memory r_3;\n {\n int216 r_3_0 = -44464390171147625489391479425103316763329688937263544007342445236;\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀é oo éooooo🚀 éoéMé M🚀oMéM🚀 ooM\";\n r_3.s_1 = r_3_1;\n }\n {\n address r_3_2 = 0x53c48a6260366b9f66e2761d0f990a1521D272C2;\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000246a09a120ab6120a133a3be0b1fef398fc7ef9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000004d6e8e8eb75c958665dc11af9e9ffd2c0dd28b52000000000000000000000000b680962d3bee6ff9c05538627fd53a7c2a62f0fd00000000000000000000000046680b1eb78d7514795b2a28f5b9d6b60cb3b6f20000000000000000000000002dc2c02f1c9c52e6295d3db8252b8df082588b46000000000000000000000000165c6027e20e0cd8e0fe9de3ba3d2b30f60a5c626df2fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240ffffffffff93e9bdf7ef0257dc9553625a2f0691a645b7fb68c350a0c7a7ad4c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000053c48a6260366b9f66e2761d0f990a1521d272c200000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a80c3a9206f6f20c3a96f6f6f6f6ff09f9a8020c3a96fc3a94dc3a920204df09f9a806f4dc3a94df09f9a80206f6f4d0000000000000000" + }, + { + "name": "random-((bytes26,int32,address,int32,(bytes15,uint144))[3],uint152,address,bool,int88)", + "type": "((bytes26,int32,address,int32,(bytes15,uint144))[3],uint152,address,bool,int88)", + "value": [ + [ + [ + "0x7cd678eab8603f87d01e1aa76691b570e54d2a5d96d30d2da4cc", + "-1274087755", + "0x18cf7F1A50C3C8Ba63d58bE94A29a2748EbA7aa7", + "-410244943", + [ + "0xa1d439ce49c66ecf5a3fc20b76e5d0", + "5861305222278979196761994006358524681924217" + ] + ], + [ + "0x9b947a7161ab1eede7145268c011541284334a4373d0b714bca5", + "865864550", + "0xB756CD513d28450faC2BE04B9bdfD39c04d01648", + "-1580226233", + [ + "0x763c0b949a1bc10bf6e0a6078d826b", + "13416853283015054219154715288741264563542174" + ] + ], + [ + "0x05ad904cf15046303c188db6527129f4625290fd6cc71a2dc38f", + "15765399", + "0xb622d0Cf6E0c02c9c7eC3Ef251548E9097872C13", + "-1309242370", + [ + "0xa625ad7ce943cda0e26c51bd97f319", + "14565845279644385387939078387108336350844367" + ] + ] + ], + "2504265487923180049920196788541285307081912627", + "0x0153e0C83bDDA9884f10322a12198F277F2CCDae", + true, + "46056321346117608791734550" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7cd678eab8603f87d01e1aa76691b570e54d2a5d96d30d2da4cc" + }, + { + "type": "number", + "value": "-1274087755" + }, + { + "type": "address", + "value": "0x18cf7F1A50C3C8Ba63d58bE94A29a2748EbA7aa7" + }, + { + "type": "number", + "value": "-410244943" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa1d439ce49c66ecf5a3fc20b76e5d0" + }, + { + "type": "number", + "value": "5861305222278979196761994006358524681924217" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9b947a7161ab1eede7145268c011541284334a4373d0b714bca5" + }, + { + "type": "number", + "value": "865864550" + }, + { + "type": "address", + "value": "0xB756CD513d28450faC2BE04B9bdfD39c04d01648" + }, + { + "type": "number", + "value": "-1580226233" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x763c0b949a1bc10bf6e0a6078d826b" + }, + { + "type": "number", + "value": "13416853283015054219154715288741264563542174" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x05ad904cf15046303c188db6527129f4625290fd6cc71a2dc38f" + }, + { + "type": "number", + "value": "15765399" + }, + { + "type": "address", + "value": "0xb622d0Cf6E0c02c9c7eC3Ef251548E9097872C13" + }, + { + "type": "number", + "value": "-1309242370" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa625ad7ce943cda0e26c51bd97f319" + }, + { + "type": "number", + "value": "14565845279644385387939078387108336350844367" + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "2504265487923180049920196788541285307081912627" + }, + { + "type": "address", + "value": "0x0153e0C83bDDA9884f10322a12198F277F2CCDae" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "46056321346117608791734550" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061049c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610365565b60405180910390f35b6100566102c8565b61005e6102c8565b6100666102fd565b61006e61032a565b7f7cd678eab8603f87d01e1aa76691b570e54d2a5d96d30d2da4cc0000000000008152634bf1094a1960208201527318cf7f1a50c3c8ba63d58be94a29a2748eba7aa76040820152631873d74e1960608201526100db604080518082019091526000808252602082015290565b6e0a1d439ce49c66ecf5a3fc20b76e5d608c1b8152714348d3f413fa3abd805e9ea60e461cde2e7960208201526080820152815261011761032a565b7f9b947a7161ab1eede7145268c011541284334a4373d0b714bca5000000000000815263339c0b66602082015273b756cd513d28450fac2be04b9bdfd39c04d016486040820152635e3056b8196060820152610183604080518082019091526000808252602082015290565b6e763c0b949a1bc10bf6e0a6078d826b60881b8152719a04968db88c280169044226b6ac55da989e60208201526080820152808260016020020152506101c761032a565b7f05ad904cf15046303c188db6527129f4625290fd6cc71a2dc38f000000000000815262f08f97602082015273b622d0cf6e0c02c9c7ec3ef251548e9097872c136040820152634e097401196060820152610232604080518082019091526000808252602082015290565b6ea625ad7ce943cda0e26c51bd97f31960881b815271a7352c0ef0178c13190456d720d1fe20d5cf6020820152608082015280826002602090810291909101919091529183525072704b8ed5c4ad29f1260c8b1f123df22511713390820152730153e0c83bdda9884f10322a12198f277f2ccdae6040820152600160608201526a2618ce2ed9956227edf9166080820152919050565b6040518060a001604052806102db6102fd565b8152600060208201819052604082018190526060820181905260809091015290565b60405180606001604052806003905b61031461032a565b81526020019060019003908161030c5790505090565b6040805160a0810182526000808252602080830182905282840182905260608301829052835180850190945281845283015290608082015290565b81516102c08201908260005b6003808210610380575061040f565b8351805165ffffffffffff19168452602080820151830b818601526040808301516001600160a01b03169086015260608083015190930b92850192909252608090810151805170ffffffffffffffffffffffffffffffffff19169185019190915281015171ffffffffffffffffffffffffffffffffffff1660a08401529092019160c090910190600101610371565b505050602083015172ffffffffffffffffffffffffffffffffffffff1661024083015260408301516001600160a01b031661026083015260608301511515610280830152608090920151600a0b6102a0909101529056fea26469706673582212204e2270f03ba412e5ccb2f06f612cc92451e17e4c15366fe453edb9ea71a32a7364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_68fe2188 {\n bytes15 s_0;\n uint144 s_1;\n }\n\n struct S_babb2207 {\n bytes26 s_0;\n int32 s_1;\n address s_2;\n int32 s_3;\n S_68fe2188 s_4;\n }\n\n struct S_c18a6c13 {\n S_babb2207[3] s_0;\n uint152 s_1;\n address s_2;\n bool s_3;\n int88 s_4;\n }\n\n function test () public pure returns (S_c18a6c13 memory) {\n S_c18a6c13 memory r;\n {\n S_babb2207[3] memory r_0;\n {\n S_babb2207 memory r_0_0;\n {\n bytes26 r_0_0_0 = bytes26(0x7cd678eab8603f87d01e1aa76691b570e54d2a5d96d30d2da4cc);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n int32 r_0_0_1 = -1274087755;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x18cf7F1A50C3C8Ba63d58bE94A29a2748EbA7aa7;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n int32 r_0_0_3 = -410244943;\n r_0_0.s_3 = r_0_0_3;\n }\n {\n S_68fe2188 memory r_0_0_4;\n {\n bytes15 r_0_0_4_0 = bytes15(0xa1d439ce49c66ecf5a3fc20b76e5d0);\n r_0_0_4.s_0 = r_0_0_4_0;\n }\n {\n uint144 r_0_0_4_1 = 5861305222278979196761994006358524681924217;\n r_0_0_4.s_1 = r_0_0_4_1;\n }\n r_0_0.s_4 = r_0_0_4;\n }\n r_0[0] = r_0_0;\n }\n {\n S_babb2207 memory r_0_1;\n {\n bytes26 r_0_1_0 = bytes26(0x9b947a7161ab1eede7145268c011541284334a4373d0b714bca5);\n r_0_1.s_0 = r_0_1_0;\n }\n {\n int32 r_0_1_1 = 865864550;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n address r_0_1_2 = 0xB756CD513d28450faC2BE04B9bdfD39c04d01648;\n r_0_1.s_2 = r_0_1_2;\n }\n {\n int32 r_0_1_3 = -1580226233;\n r_0_1.s_3 = r_0_1_3;\n }\n {\n S_68fe2188 memory r_0_1_4;\n {\n bytes15 r_0_1_4_0 = bytes15(0x763c0b949a1bc10bf6e0a6078d826b);\n r_0_1_4.s_0 = r_0_1_4_0;\n }\n {\n uint144 r_0_1_4_1 = 13416853283015054219154715288741264563542174;\n r_0_1_4.s_1 = r_0_1_4_1;\n }\n r_0_1.s_4 = r_0_1_4;\n }\n r_0[1] = r_0_1;\n }\n {\n S_babb2207 memory r_0_2;\n {\n bytes26 r_0_2_0 = bytes26(0x05ad904cf15046303c188db6527129f4625290fd6cc71a2dc38f);\n r_0_2.s_0 = r_0_2_0;\n }\n {\n int32 r_0_2_1 = 15765399;\n r_0_2.s_1 = r_0_2_1;\n }\n {\n address r_0_2_2 = 0xb622d0Cf6E0c02c9c7eC3Ef251548E9097872C13;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n int32 r_0_2_3 = -1309242370;\n r_0_2.s_3 = r_0_2_3;\n }\n {\n S_68fe2188 memory r_0_2_4;\n {\n bytes15 r_0_2_4_0 = bytes15(0xa625ad7ce943cda0e26c51bd97f319);\n r_0_2_4.s_0 = r_0_2_4_0;\n }\n {\n uint144 r_0_2_4_1 = 14565845279644385387939078387108336350844367;\n r_0_2_4.s_1 = r_0_2_4_1;\n }\n r_0_2.s_4 = r_0_2_4;\n }\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n uint152 r_1 = 2504265487923180049920196788541285307081912627;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x0153e0C83bDDA9884f10322a12198F277F2CCDae;\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n int88 r_4 = 46056321346117608791734550;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x7cd678eab8603f87d01e1aa76691b570e54d2a5d96d30d2da4cc000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb40ef6b500000000000000000000000018cf7f1a50c3c8ba63d58be94a29a2748eba7aa7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe78c28b1a1d439ce49c66ecf5a3fc20b76e5d0000000000000000000000000000000000000000000000000000000000000004348d3f413fa3abd805e9ea60e461cde2e799b947a7161ab1eede7145268c011541284334a4373d0b714bca500000000000000000000000000000000000000000000000000000000000000000000339c0b66000000000000000000000000b756cd513d28450fac2be04b9bdfd39c04d01648ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1cfa947763c0b949a1bc10bf6e0a6078d826b000000000000000000000000000000000000000000000000000000000000009a04968db88c280169044226b6ac55da989e05ad904cf15046303c188db6527129f4625290fd6cc71a2dc38f0000000000000000000000000000000000000000000000000000000000000000000000f08f97000000000000000000000000b622d0cf6e0c02c9c7ec3ef251548e9097872c13ffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1f68bfea625ad7ce943cda0e26c51bd97f31900000000000000000000000000000000000000000000000000000000000000a7352c0ef0178c13190456d720d1fe20d5cf00000000000000000000000000704b8ed5c4ad29f1260c8b1f123df2251171330000000000000000000000000153e0c83bdda9884f10322a12198f277f2ccdae00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000002618ce2ed9956227edf916" + }, + { + "name": "random-(address,(bool,uint40,((string),int16,bytes1),bool)[3],address,string)[1]", + "type": "(address,(bool,uint40,((string),int16,bytes1),bool)[3],address,string)[1]", + "value": [ + [ + "0x0aA91C192DBEb96741e94ECeC8372FD1aba3A0B5", + [ + [false, "67972901229", [["Moo é🚀🚀oMMéo éM 🚀MM oé"], "614", "0xf9"], false], + [ + true, + "265915777972", + [ + [ + "Moo é🚀éM🚀🚀é 🚀oM🚀ooé 🚀o 🚀éMéooéMéoM🚀ooooooooé o🚀éoMoéMMé é 🚀o" + ], + "6275", + "0x1a" + ], + true + ], + [false, "334872994325", [["Moo é🚀o éoéo🚀"], "-30017", "0x62"], false] + ], + "0x11EfDA1818b8e98Bf8928a5AD32eA329ef11B324", + "Moo é🚀 Mo🚀🚀o🚀é🚀o🚀M🚀éo Mé🚀o🚀oéoé🚀🚀ééooéMoééé 🚀🚀🚀éMoMooé oéMoé " + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0aA91C192DBEb96741e94ECeC8372FD1aba3A0B5" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "67972901229" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oMMéo éM 🚀MM oé" + } + ] + }, + { + "type": "number", + "value": "614" + }, + { + "type": "hexstring", + "value": "0xf9" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "265915777972" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éM🚀🚀é 🚀oM🚀ooé 🚀o 🚀éMéooéMéoM🚀ooooooooé o🚀éoMoéMMé é 🚀o" + } + ] + }, + { + "type": "number", + "value": "6275" + }, + { + "type": "hexstring", + "value": "0x1a" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "334872994325" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o éoéo🚀" + } + ] + }, + { + "type": "number", + "value": "-30017" + }, + { + "type": "hexstring", + "value": "0x62" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "address", + "value": "0x11EfDA1818b8e98Bf8928a5AD32eA329ef11B324" + }, + { + "type": "string", + "value": "Moo é🚀 Mo🚀🚀o🚀é🚀o🚀M🚀éo Mé🚀o🚀oéoé🚀🚀ééooéMoééé 🚀🚀🚀éMoMooé oéMoé " + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061062e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103be565b60405180910390f35b61005661029c565b61005e61029c565b6100666102c9565b730aa91c192dbeb96741e94ecec8372fd1aba3a0b58152610085610300565b61008d61032d565b60008152640fd380296d60208201526100c660408051608081018252606080820190815281526000602082018190529181019190915290565b60408051602081019091526060815260006040518060600160405280602381526020016105d6602391398252508152610266602082015260f960f81b60408083019190915282015260006060820152815261011f61032d565b60018152643de9d0c3b4602082015261015860408051608081018252606080820190815281526000602082018190529181019190915290565b60408051602081019091526060815260006040518060a00160405280606881526020016104f5606891398252508152611883602080830191909152600d60f91b604080840191909152830191909152600160608301528201526101b961032d565b60008152644df7fc621560208201526101f260408051608081018252606080820190815281526000602082018190529181019190915290565b604080516020808201835260608083528351808501855260168152749adede418753e13f3500de418752df8752dfe13f3560571b8184015283529184526175401984820152603160f91b8484015284830193909352600090840181905284820193909352848201939093527311efda1818b8e98bf8928a5ad32ea329ef11b32484840152825160a0810190935260798084529192919061055d908301396060830152508152919050565b60405180602001604052806001905b6102b36102c9565b8152602001906001900390816102ab5790505090565b604051806080016040528060006001600160a01b031681526020016102ec610300565b815260006020820152606060409091015290565b60405180606001604052806003905b61031761032d565b81526020019060019003908161030f5790505090565b604080516080808201835260008083526020808401829052845192830185526060808401908152835282018190528184015290918201908152600060209091015290565b6000815180845260005b818110156103975760208185018101518683018201520161037b565b818111156103a9576000602083870101525b50601f01601f19169290920160200192915050565b6020808252600090604083820181850186855b60018110156104e757878303601f19018452815180516001600160a01b031684528681015160808886018190529060e086019082870160005b60038110156104a257607f19898503018252825180511515855264ffffffffff8d820151168d8601528b810151868d870152805160608089890152815191508f60e089015261045d610100890183610371565b91508f83015160010b60a089015260ff60f81b8f8401511660c089015280840151935061048d8189018515159052565b5095505050918b0191908b019060010161040a565b505050828801516001600160a01b038116878a015291506060830151925085810360608701526104d28184610371565b968901969550505091860191506001016103d1565b509097965050505050505056fe4d6f6f20c3a9f09f9a80c3a94df09f9a80f09f9a80c3a920f09f9a806f4df09f9a806f6fc3a920f09f9a806f20f09f9a80c3a94dc3a96f6fc3a94dc3a96f4df09f9a806f6f6f6f6f6f6f6fc3a9206ff09f9a80c3a96f4d6fc3a94d4dc3a92020c3a920f09f9a806f4d6f6f20c3a9f09f9a80204d6ff09f9a80f09f9a806ff09f9a80c3a9f09f9a806ff09f9a804df09f9a80c3a96f204dc3a9f09f9a806ff09f9a806fc3a96fc3a9f09f9a80f09f9a80c3a9c3a96f6fc3a94d6fc3a9c3a9c3a9202020f09f9a80f09f9a80f09f9a80c3a94d6f4d6f6fc3a9206fc3a94d6fc3a9204d6f6f20c3a9f09f9a80f09f9a806f4d4dc3a96f20c3a94d20f09f9a804d4d206fc3a9a264697066735822122094d5e38bb546e494b1dfe46a1ea86f5477a4b2776f705ad1324361faea78e47464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_275d34e5 {\n S_97fc4627 s_0;\n int16 s_1;\n bytes1 s_2;\n }\n\n struct S_c9a38557 {\n bool s_0;\n uint40 s_1;\n S_275d34e5 s_2;\n bool s_3;\n }\n\n struct S_817dcba3 {\n address s_0;\n S_c9a38557[3] s_1;\n address s_2;\n string s_3;\n }\n\n function test () public pure returns (S_817dcba3[1] memory) {\n S_817dcba3[1] memory r;\n {\n S_817dcba3 memory r_0;\n {\n address r_0_0 = 0x0aA91C192DBEb96741e94ECeC8372FD1aba3A0B5;\n r_0.s_0 = r_0_0;\n }\n {\n S_c9a38557[3] memory r_0_1;\n {\n S_c9a38557 memory r_0_1_0;\n {\n bool r_0_1_0_0 = false;\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n uint40 r_0_1_0_1 = 67972901229;\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n S_275d34e5 memory r_0_1_0_2;\n {\n S_97fc4627 memory r_0_1_0_2_0;\n {\n string memory r_0_1_0_2_0_0 = unicode\"Moo é🚀🚀oMMéo éM 🚀MM oé\";\n r_0_1_0_2_0.s_0 = r_0_1_0_2_0_0;\n }\n r_0_1_0_2.s_0 = r_0_1_0_2_0;\n }\n {\n int16 r_0_1_0_2_1 = 614;\n r_0_1_0_2.s_1 = r_0_1_0_2_1;\n }\n {\n bytes1 r_0_1_0_2_2 = bytes1(0xf9);\n r_0_1_0_2.s_2 = r_0_1_0_2_2;\n }\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n {\n bool r_0_1_0_3 = false;\n r_0_1_0.s_3 = r_0_1_0_3;\n }\n r_0_1[0] = r_0_1_0;\n }\n {\n S_c9a38557 memory r_0_1_1;\n {\n bool r_0_1_1_0 = true;\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n uint40 r_0_1_1_1 = 265915777972;\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n S_275d34e5 memory r_0_1_1_2;\n {\n S_97fc4627 memory r_0_1_1_2_0;\n {\n string memory r_0_1_1_2_0_0 = unicode\"Moo é🚀éM🚀🚀é 🚀oM🚀ooé 🚀o 🚀éMéooéMéoM🚀ooooooooé o🚀éoMoéMMé é 🚀o\";\n r_0_1_1_2_0.s_0 = r_0_1_1_2_0_0;\n }\n r_0_1_1_2.s_0 = r_0_1_1_2_0;\n }\n {\n int16 r_0_1_1_2_1 = 6275;\n r_0_1_1_2.s_1 = r_0_1_1_2_1;\n }\n {\n bytes1 r_0_1_1_2_2 = bytes1(0x1a);\n r_0_1_1_2.s_2 = r_0_1_1_2_2;\n }\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n {\n bool r_0_1_1_3 = true;\n r_0_1_1.s_3 = r_0_1_1_3;\n }\n r_0_1[1] = r_0_1_1;\n }\n {\n S_c9a38557 memory r_0_1_2;\n {\n bool r_0_1_2_0 = false;\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n uint40 r_0_1_2_1 = 334872994325;\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n S_275d34e5 memory r_0_1_2_2;\n {\n S_97fc4627 memory r_0_1_2_2_0;\n {\n string memory r_0_1_2_2_0_0 = unicode\"Moo é🚀o éoéo🚀\";\n r_0_1_2_2_0.s_0 = r_0_1_2_2_0_0;\n }\n r_0_1_2_2.s_0 = r_0_1_2_2_0;\n }\n {\n int16 r_0_1_2_2_1 = -30017;\n r_0_1_2_2.s_1 = r_0_1_2_2_1;\n }\n {\n bytes1 r_0_1_2_2_2 = bytes1(0x62);\n r_0_1_2_2.s_2 = r_0_1_2_2_2;\n }\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n {\n bool r_0_1_2_3 = false;\n r_0_1_2.s_3 = r_0_1_2_3;\n }\n r_0_1[2] = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x11EfDA1818b8e98Bf8928a5AD32eA329ef11B324;\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀 Mo🚀🚀o🚀é🚀o🚀M🚀éo Mé🚀o🚀oéoé🚀🚀ééooéMoééé 🚀🚀🚀éMoMooé oéMoé \";\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000aa91c192dbeb96741e94ecec8372fd1aba3a0b5000000000000000000000000000000000000000000000000000000000000008000000000000000000000000011efda1818b8e98bf8928a5ad32ea329ef11b3240000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd380296d0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000266f900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80f09f9a806f4d4dc3a96f20c3a94d20f09f9a804d4d206fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000003de9d0c3b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000018831a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a80c3a94df09f9a80f09f9a80c3a920f09f9a806f4df09f9a806f6fc3a920f09f9a806f20f09f9a80c3a94dc3a96f6fc3a94dc3a96f4df09f9a806f6f6f6f6f6f6f6fc3a9206ff09f9a80c3a96f4d6fc3a94d4dc3a92020c3a920f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004df7fc6215000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8abf6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806f20c3a96fc3a96ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000794d6f6f20c3a9f09f9a80204d6ff09f9a80f09f9a806ff09f9a80c3a9f09f9a806ff09f9a804df09f9a80c3a96f204dc3a9f09f9a806ff09f9a806fc3a96fc3a9f09f9a80f09f9a80c3a9c3a96f6fc3a94d6fc3a9c3a9c3a9202020f09f9a80f09f9a80f09f9a80c3a94d6f4d6f6fc3a9206fc3a94d6fc3a92000000000000000" + }, + { + "name": "random-(address,string,bool,(string,string,(bytes9,string[2],bool),string,string))", + "type": "(address,string,bool,(string,string,(bytes9,string[2],bool),string,string))", + "value": [ + "0xfF7a812ffecB77E4150d5D22A1400F7B48332858", + "Moo é🚀ooéM 🚀Mo ooooM🚀o🚀 o🚀o o éMoéMé M é🚀éoooo éé oéMooMooooé🚀é", + false, + [ + "Moo é🚀 MMé o🚀oéoo o", + "Moo é🚀", + [ + "0x093373ae03f0043833", + [ + "Moo é🚀MéoMé🚀é MéoMéoo Moéé🚀éoM🚀é éMM🚀oéo🚀oé🚀éooM o oo oéM", + "Moo é🚀oéo oéo🚀éo🚀oo 🚀 Mo oooM o Mé 🚀🚀" + ], + true + ], + "Moo é🚀🚀 🚀é🚀M 🚀🚀Mooo oéooooo oéMMM🚀o🚀🚀🚀M🚀🚀oM🚀o oé🚀 é oM ", + "Moo é🚀Mooé🚀o🚀 M🚀oo ooM éMooo MoM éMoéoooééoMéo 🚀é🚀M é" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xfF7a812ffecB77E4150d5D22A1400F7B48332858" + }, + { + "type": "string", + "value": "Moo é🚀ooéM 🚀Mo ooooM🚀o🚀 o🚀o o éMoéMé M é🚀éoooo éé oéMooMooooé🚀é" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 MMé o🚀oéoo o" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x093373ae03f0043833" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéoMé🚀é MéoMéoo Moéé🚀éoM🚀é éMM🚀oéo🚀oé🚀éooM o oo oéM" + }, + { + "type": "string", + "value": "Moo é🚀oéo oéo🚀éo🚀oo 🚀 Mo oooM o Mé 🚀🚀" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 🚀é🚀M 🚀🚀Mooo oéooooo oéMMM🚀o🚀🚀🚀M🚀🚀oM🚀o oé🚀 é oM " + }, + { + "type": "string", + "value": "Moo é🚀Mooé🚀o🚀 M🚀oo ooM éMooo MoM éMoéoooééoMéo 🚀é🚀M é" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105d9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c4565b60405180910390f35b6100566101c7565b61005e6101c7565b73ff7a812ffecb77e4150d5d22a1400f7b48332858815260408051608081019091526060808252600091906104e66020830139602083015250600060408201526100a66101f3565b604080518082018252601c81527f4d6f6f20c3a9f09f9a80204d4dc3a9206ff09f9a806fc3a96f6f206f000000006020808301919091529083528151808301909252600a8252689adede418753e13f3560b71b82820152820152610108610228565b68093373ae03f004383360b81b815261011f610250565b60006040518060800160405280605e8152602001610546605e91398252506040805160608101909152603c808252600091906103ee60208301396020808401919091528381019290925250600160408084019190915283810192909252815160a0810190925260688083526000929161047e90830139606083015250604080516080810190915260548082526000919061042a60208301396080830152506060820152919050565b604080516080810182526000808252606060208301819052928201529081016101ee6101f3565b905290565b6040518060a001604052806060815260200160608152602001610214610228565b815260200160608152602001606081525090565b60408051606081019091526000815260208101610243610250565b8152600060209091015290565b60405180604001604052806002905b606081526020019060019003908161025f5790505090565b6000815180845260005b8181101561029d57602081850181015186830182015201610281565b818111156102af576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835260018060a01b03845116818401528084015160406080818601526102f260a0860183610277565b915080860151606081151581880152808801519150601f19878503016080880152815160a0855261032660a0860182610277565b9050858301518582038787015261033d8282610277565b848601518782038888015280516001600160b81b031916825288810151898301869052919350915060a083019084840160005b600281101561039f57605f1986850301825261038d848451610277565b9350918a0191908a0190600101610370565b50505085820151151586840152838501519750868103848801526103c38189610277565b975050505050608081015191505081830360808301526103e38382610277565b969550505050505056fe4d6f6f20c3a9f09f9a806fc3a96f206fc3a96ff09f9a80c3a96ff09f9a806f6f20f09f9a80204d6f206f6f6f4d206f204dc3a920f09f9a80f09f9a804d6f6f20c3a9f09f9a804d6f6fc3a9f09f9a806ff09f9a80204df09f9a806f6f206f6f4d20c3a94d6f6f6f204d6f4d20c3a94d6fc3a96f6f6fc3a9c3a96f4dc3a96f20f09f9a80c3a9f09f9a804d20202020c3a94d6f6f20c3a9f09f9a80f09f9a8020f09f9a80c3a9f09f9a804d2020f09f9a80f09f9a804d6f6f6f206fc3a96f6f6f6f6f206fc3a94d4d4df09f9a806ff09f9a80f09f9a80f09f9a804df09f9a80f09f9a806f4df09f9a806f206fc3a9f09f9a8020c3a9206f4d204d6f6f20c3a9f09f9a806f6fc3a94d20f09f9a804d6f206f6f6f6f4df09f9a806ff09f9a80206ff09f9a806f206f20c3a94d6fc3a94dc3a9204d20c3a9f09f9a80c3a96f6f6f6f20c3a9c3a9206fc3a94d6f6f4d6f6f6f6fc3a9f09f9a80c3a94d6f6f20c3a9f09f9a804dc3a96f4dc3a9f09f9a80c3a9204dc3a96f4dc3a96f6f204d6fc3a9c3a9f09f9a80c3a96f4df09f9a80c3a920c3a94d4df09f9a806fc3a96ff09f9a806fc3a9f09f9a80c3a96f6f4d20206f206f6f206fc3a94da26469706673582212202c9562a5b7d063a6428f9d542f3ed13896ad76dec42ebeb5eef7c6c028b36b2f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_554129f2 {\n bytes9 s_0;\n string[2] s_1;\n bool s_2;\n }\n\n struct S_0a5d4ce3 {\n string s_0;\n string s_1;\n S_554129f2 s_2;\n string s_3;\n string s_4;\n }\n\n struct S_d4c572a7 {\n address s_0;\n string s_1;\n bool s_2;\n S_0a5d4ce3 s_3;\n }\n\n function test () public pure returns (S_d4c572a7 memory) {\n S_d4c572a7 memory r;\n {\n address r_0 = 0xfF7a812ffecB77E4150d5D22A1400F7B48332858;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀ooéM 🚀Mo ooooM🚀o🚀 o🚀o o éMoéMé M é🚀éoooo éé oéMooMooooé🚀é\";\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n S_0a5d4ce3 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀 MMé o🚀oéoo o\";\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀\";\n r_3.s_1 = r_3_1;\n }\n {\n S_554129f2 memory r_3_2;\n {\n bytes9 r_3_2_0 = bytes9(0x093373ae03f0043833);\n r_3_2.s_0 = r_3_2_0;\n }\n {\n string[2] memory r_3_2_1;\n {\n string memory r_3_2_1_0 = unicode\"Moo é🚀MéoMé🚀é MéoMéoo Moéé🚀éoM🚀é éMM🚀oéo🚀oé🚀éooM o oo oéM\";\n r_3_2_1[0] = r_3_2_1_0;\n }\n {\n string memory r_3_2_1_1 = unicode\"Moo é🚀oéo oéo🚀éo🚀oo 🚀 Mo oooM o Mé 🚀🚀\";\n r_3_2_1[1] = r_3_2_1_1;\n }\n r_3_2.s_1 = r_3_2_1;\n }\n {\n bool r_3_2_2 = true;\n r_3_2.s_2 = r_3_2_2;\n }\n r_3.s_2 = r_3_2;\n }\n {\n string memory r_3_3 = unicode\"Moo é🚀🚀 🚀é🚀M 🚀🚀Mooo oéooooo oéMMM🚀o🚀🚀🚀M🚀🚀oM🚀o oé🚀 é oM \";\n r_3.s_3 = r_3_3;\n }\n {\n string memory r_3_4 = unicode\"Moo é🚀Mooé🚀o🚀 M🚀oo ooM éMooo MoM éMoéoooééoMéo 🚀é🚀M é\";\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000ff7a812ffecb77e4150d5d22a1400f7b4833285800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a806f6fc3a94d20f09f9a804d6f206f6f6f6f4df09f9a806ff09f9a80206ff09f9a806f206f20c3a94d6fc3a94dc3a9204d20c3a9f09f9a80c3a96f6f6f6f20c3a9c3a9206fc3a94d6f6f4d6f6f6f6fc3a9f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80204d4dc3a9206ff09f9a806fc3a96f6f206f00000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000093373ae03f0043833000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a804dc3a96f4dc3a9f09f9a80c3a9204dc3a96f4dc3a96f6f204d6fc3a9c3a9f09f9a80c3a96f4df09f9a80c3a920c3a94d4df09f9a806fc3a96ff09f9a806fc3a9f09f9a80c3a96f6f4d20206f206f6f206fc3a94d0000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806fc3a96f206fc3a96ff09f9a80c3a96ff09f9a806f6f20f09f9a80204d6f206f6f6f4d206f204dc3a920f09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a80f09f9a8020f09f9a80c3a9f09f9a804d2020f09f9a80f09f9a804d6f6f6f206fc3a96f6f6f6f6f206fc3a94d4d4df09f9a806ff09f9a80f09f9a80f09f9a804df09f9a80f09f9a806f4df09f9a806f206fc3a9f09f9a8020c3a9206f4d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a804d6f6fc3a9f09f9a806ff09f9a80204df09f9a806f6f206f6f4d20c3a94d6f6f6f204d6f4d20c3a94d6fc3a96f6f6fc3a9c3a96f4dc3a96f20f09f9a80c3a9f09f9a804d20202020c3a9000000000000000000000000" + }, + { + "name": "random-(bool,bytes15,(uint16[4],bool[1],uint112,bool[]),string,bytes3)", + "type": "(bool,bytes15,(uint16[4],bool[1],uint112,bool[]),string,bytes3)", + "value": [ + false, + "0xc9d253f49034669f69306e1cf5ef02", + [ + ["43615", "34357", "47501", "886"], + [true], + "2926495038821940548885772380050993", + [false, true, true] + ], + "Moo é🚀🚀M éooo éo🚀oéMooo🚀 é ooM🚀é🚀", + "0xf7736b" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xc9d253f49034669f69306e1cf5ef02" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "43615" + }, + { + "type": "number", + "value": "34357" + }, + { + "type": "number", + "value": "47501" + }, + { + "type": "number", + "value": "886" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "2926495038821940548885772380050993" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀M éooo éo🚀oéMooo🚀 é ooM🚀é🚀" + }, + { + "type": "hexstring", + "value": "0xf7736b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061048b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061030d565b60405180910390f35b6100566101b5565b61005e6101b5565b600081526e64e929fa481a334fb498370e7af78160891b60208201526100826101e8565b61008a61021c565b61aa5f8152618635602082015261b98d6040820152610376606082015281526100b161023a565b6001815260208201526d90498f76d89bedd8dc63454a963160408083019190915280516003808252608082019092526000918160200160208202803683370190505090506000808260008151811061010b5761010b610405565b60200260200101901515908115158152505050600060019050808260018151811061013857610138610405565b60200260200101901515908115158152505050600060019050808260028151811061016557610165610405565b911515602092830291909101820152606080850193909352604080860194909452835192830190935250603a80825260009261041c9083013960608301525062f7736b60e81b6080820152919050565b6040805160a081018252600080825260208201529081016101d46101e8565b815260606020820152600060409091015290565b60405180608001604052806101fb61021c565b815260200161020861023a565b815260006020820152606060409091015290565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b8060005b600181101561027d578151151584526020938401939091019060010161025c565b50505050565b600081518084526020808501945080840160005b838110156102b5578151151587529582019590820190600101610297565b509495945050505050565b6000815180845260005b818110156102e6576020818501810151868301820152016102ca565b818111156102f8576000602083870101525b50601f01601f19169290920160200192915050565b602080825282511515828201528281015170ffffffffffffffffffffffffffffffffff191660408084019190915283015160a060608401528051600092918360c086015b600482101561037457835161ffff16815292840192600191909101908401610351565b50509182015191610389610140860184610258565b60408101516dffffffffffffffffffffffffffff166101608601526060015160e061018086015291506103c290506101a0840182610283565b90506060840151601f198483030160808501526103df82826102c0565b91505060808401516103fd60a08501826001600160e81b0319169052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a804d20c3a96f6f6f2020c3a96ff09f9a806fc3a94d6f6f6ff09f9a8020c3a9206f6f4df09f9a80c3a9f09f9a80a2646970667358221220bbf3c4b5bee4349f47fe85deda601bc072f018eaa8fcea44f2bc2c09cb6effb164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_64e4ef6c {\n uint16[4] s_0;\n bool[1] s_1;\n uint112 s_2;\n bool[] s_3;\n }\n\n struct S_13c11169 {\n bool s_0;\n bytes15 s_1;\n S_64e4ef6c s_2;\n string s_3;\n bytes3 s_4;\n }\n\n function test () public pure returns (S_13c11169 memory) {\n S_13c11169 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n bytes15 r_1 = bytes15(0xc9d253f49034669f69306e1cf5ef02);\n r.s_1 = r_1;\n }\n {\n S_64e4ef6c memory r_2;\n {\n uint16[4] memory r_2_0;\n {\n uint16 r_2_0_0 = 43615;\n r_2_0[0] = r_2_0_0;\n }\n {\n uint16 r_2_0_1 = 34357;\n r_2_0[1] = r_2_0_1;\n }\n {\n uint16 r_2_0_2 = 47501;\n r_2_0[2] = r_2_0_2;\n }\n {\n uint16 r_2_0_3 = 886;\n r_2_0[3] = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool[1] memory r_2_1;\n {\n bool r_2_1_0 = true;\n r_2_1[0] = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n {\n uint112 r_2_2 = 2926495038821940548885772380050993;\n r_2.s_2 = r_2_2;\n }\n {\n bool[] memory r_2_3 = new bool[](3);\n {\n bool r_2_3_0 = false;\n r_2_3[0] = r_2_3_0;\n }\n {\n bool r_2_3_1 = true;\n r_2_3[1] = r_2_3_1;\n }\n {\n bool r_2_3_2 = true;\n r_2_3[2] = r_2_3_2;\n }\n r_2.s_3 = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀🚀M éooo éo🚀oéMooo🚀 é ooM🚀é🚀\";\n r.s_3 = r_3;\n }\n {\n bytes3 r_4 = bytes3(0xf7736b);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000c9d253f49034669f69306e1cf5ef02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000200f7736b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa5f0000000000000000000000000000000000000000000000000000000000008635000000000000000000000000000000000000000000000000000000000000b98d0000000000000000000000000000000000000000000000000000000000000376000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000090498f76d89bedd8dc63454a963100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a80f09f9a804d20c3a96f6f6f2020c3a96ff09f9a806fc3a94d6f6f6ff09f9a8020c3a9206f6f4df09f9a80c3a9f09f9a80000000000000" + }, + { + "name": "random-(int232,(bool,string,uint136,address,bytes4[2]),address,uint80,int8[2])", + "type": "(int232,(bool,string,uint136,address,bytes4[2]),address,uint80,int8[2])", + "value": [ + "-2079440775584775807337132105788565643682173916178697799676537367312107", + [ + false, + "Moo é🚀M🚀o🚀 o🚀🚀oMo 🚀MoooooéM🚀 éM éM é🚀o🚀", + "8173386882283799959557936638716380589138", + "0xc4eab3e937475283C191612cd4cFE4FFfBeAB69d", + ["0x3dee9bf2", "0xb81e350c"] + ], + "0x12dCBB498eE2a8B48d0475f09D2969fcA29B784b", + "330162886233817626908519", + ["10", "-92"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "-2079440775584775807337132105788565643682173916178697799676537367312107" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M🚀o🚀 o🚀🚀oMo 🚀MoooooéM🚀 éM éM é🚀o🚀" + }, + { + "type": "number", + "value": "8173386882283799959557936638716380589138" + }, + { + "type": "address", + "value": "0xc4eab3e937475283C191612cd4cFE4FFfBeAB69d" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3dee9bf2" + }, + { + "type": "hexstring", + "value": "0xb81e350c" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x12dCBB498eE2a8B48d0475f09D2969fcA29B784b" + }, + { + "type": "number", + "value": "330162886233817626908519" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "10" + }, + { + "type": "number", + "value": "-92" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103d1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061024d565b60405180910390f35b610056610153565b61005e610153565b7fffffffb2de877c69b0a86ef8b6af2f6f194d21b35c97e496261efbcc307dc9158152610089610190565b6000808252604080516080810190915260498082526103536020830139602083015250701804f90deae10ac066ab0a9e05d9b22c52604082015273c4eab3e937475283c191612cd4cfe4fffbeab69d60608201526100e56101cf565b631ef74df960e11b8152632e078d4360e21b60208083019190915260808301919091528201527312dcbb498ee2a8b48d0475f09d2969fca29b784b60408201526945ea2a7a27b7171f1767606082015261013d6101cf565b600a8152605b1960208201526080820152919050565b6040518060a001604052806000601c0b8152602001610170610190565b8152600060208201819052604082015260600161018b6101cf565b905290565b6040518060a001604052806000151581526020016060815260200160006001600160881b0316815260200160006001600160a01b0316815260200161018b5b60405180604001604052806002906020820280368337509192915050565b8060005b600281101561021a5781516001600160e01b0319168452602093840193909101906001016101f1565b50505050565b806000805b6002811015610246578251820b855260209485019490920191600101610225565b5050505050565b600060208083528351601c0b818401528084015160c060408501528051151560e08501528181015160c06101008601528051806101a087015260005b818110156102a6578281018501518782016101c001528401610289565b818111156102b95760006101c083890101525b5060408301516001600160881b031661012087015260608301516001600160a01b0316610140870152608083015193506102f76101608701856101ed565b60408701516001600160a01b03811660608801529350606087015169ffffffffffffffffffff8116608088015293506080870151935061033a60a0870185610220565b601f01601f1916949094016101c0019594505050505056fe4d6f6f20c3a9f09f9a804df09f9a806ff09f9a80206ff09f9a80f09f9a806f4d6f20f09f9a804d6f6f6f6f6fc3a94df09f9a8020c3a94d20c3a94d202020c3a9f09f9a806ff09f9a80a26469706673582212200feaefd5b26004bce00363c4186b81f72d7fcb7ca8ad7f3a6b41f908a30d067664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3e79728b {\n bool s_0;\n string s_1;\n uint136 s_2;\n address s_3;\n bytes4[2] s_4;\n }\n\n struct S_a86e13cd {\n int232 s_0;\n S_3e79728b s_1;\n address s_2;\n uint80 s_3;\n int8[2] s_4;\n }\n\n function test () public pure returns (S_a86e13cd memory) {\n S_a86e13cd memory r;\n {\n int232 r_0 = -2079440775584775807337132105788565643682173916178697799676537367312107;\n r.s_0 = r_0;\n }\n {\n S_3e79728b memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀M🚀o🚀 o🚀🚀oMo 🚀MoooooéM🚀 éM éM é🚀o🚀\";\n r_1.s_1 = r_1_1;\n }\n {\n uint136 r_1_2 = 8173386882283799959557936638716380589138;\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0xc4eab3e937475283C191612cd4cFE4FFfBeAB69d;\n r_1.s_3 = r_1_3;\n }\n {\n bytes4[2] memory r_1_4;\n {\n bytes4 r_1_4_0 = bytes4(0x3dee9bf2);\n r_1_4[0] = r_1_4_0;\n }\n {\n bytes4 r_1_4_1 = bytes4(0xb81e350c);\n r_1_4[1] = r_1_4_1;\n }\n r_1.s_4 = r_1_4;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x12dCBB498eE2a8B48d0475f09D2969fcA29B784b;\n r.s_2 = r_2;\n }\n {\n uint80 r_3 = 330162886233817626908519;\n r.s_3 = r_3;\n }\n {\n int8[2] memory r_4;\n {\n int8 r_4_0 = 10;\n r_4[0] = r_4_0;\n }\n {\n int8 r_4_1 = -92;\n r_4[1] = r_4_1;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020ffffffb2de877c69b0a86ef8b6af2f6f194d21b35c97e496261efbcc307dc91500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000012dcbb498ee2a8b48d0475f09d2969fca29b784b0000000000000000000000000000000000000000000045ea2a7a27b7171f1767000000000000000000000000000000000000000000000000000000000000000affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000001804f90deae10ac066ab0a9e05d9b22c52000000000000000000000000c4eab3e937475283c191612cd4cfe4fffbeab69d3dee9bf200000000000000000000000000000000000000000000000000000000b81e350c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a804df09f9a806ff09f9a80206ff09f9a80f09f9a806f4d6f20f09f9a804d6f6f6f6f6fc3a94df09f9a8020c3a94d20c3a94d202020c3a9f09f9a806ff09f9a800000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int32,(uint120,((string,int104,bool,(int128),string)[1],address,address)))[]", + "type": "(int32,(uint120,((string,int104,bool,(int128),string)[1],address,address)))[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061032b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101b6565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b6040518060400160405280600060030b81526020016100a76100ac565b905290565b604051806040016040528060006001600160781b031681526020016100a760405180606001604052806100dd6100f1565b815260006020820181905260409091015290565b60405180602001604052806001905b61010861011e565b8152602001906001900390816101005790505090565b6040518060a00160405280606081526020016000600c0b815260200160001515815260200161015c60405180602001604052806000600f0b81525090565b8152602001606081525090565b6000815180845260005b8181101561018f57602081850181015186830182015201610173565b818111156101a1576000602083870101525b50601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156102e757888303603f190185528151805160030b845287015187840187905280516001600160781b031687850152870151606080850188905281516080860182905261010086019060e0870160005b60018110156102a75760df198985030182528251805160a0865261025760a0870182610169565b90508e820151600c0b8f8701528d82015115158e8701528682015151600f0b878701526080820151915085810360808701526102938183610169565b95505050918c0191908c0190600101610230565b505050828a01516001600160a01b03811660a08801529150918801516001600160a01b03811660c0870152919689019694505050908601906001016101dd565b50909897505050505050505056fea264697066735822122066e50cc8693e6f95d98e3d064afe106f768151fbe49aa7119e1904dad43c748464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b1600010 {\n int128 s_0;\n }\n\n struct S_bfb60337 {\n string s_0;\n int104 s_1;\n bool s_2;\n S_b1600010 s_3;\n string s_4;\n }\n\n struct S_6cf11def {\n S_bfb60337[1] s_0;\n address s_1;\n address s_2;\n }\n\n struct S_0789e1a4 {\n uint120 s_0;\n S_6cf11def s_1;\n }\n\n struct S_af29a066 {\n int32 s_0;\n S_0789e1a4 s_1;\n }\n\n function test () public pure returns (S_af29a066[] memory) {\n S_af29a066[] memory r = new S_af29a066[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,(bool,int136,uint216,string),string,((bytes11,uint56,bool[]),bytes27))", + "type": "(string,(bool,int136,uint216,string),string,((bytes11,uint56,bool[]),bytes27))", + "value": [ + "Moo é🚀Mo🚀 éoM🚀M🚀éMéoooo🚀é🚀Mo ooMo🚀o", + [ + true, + "-1164221126038085248374030812529608821205", + "2886752086344032224339910669180919805207688756914310040895445033", + "Moo é🚀o é🚀éMéoooooé é🚀 Mo🚀éo Moo🚀o🚀 éo🚀🚀oéo🚀ooM🚀oo🚀o o" + ], + "Moo é🚀", + [ + ["0x2eb1ccc0993b9c447330a8", "65359066188433656", [false]], + "0xfe3c000ea4ff983f10458ae1f90193d881c7036826275ca98cd086" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo🚀 éoM🚀M🚀éMéoooo🚀é🚀Mo ooMo🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-1164221126038085248374030812529608821205" + }, + { + "type": "number", + "value": "2886752086344032224339910669180919805207688756914310040895445033" + }, + { + "type": "string", + "value": "Moo é🚀o é🚀éMéoooooé é🚀 Mo🚀éo Moo🚀o🚀 éo🚀🚀oéo🚀ooM🚀oo🚀o o" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2eb1ccc0993b9c447330a8" + }, + { + "type": "number", + "value": "65359066188433656" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xfe3c000ea4ff983f10458ae1f90193d881c7036826275ca98cd086" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104e8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610348565b60405180910390f35b6100566101d5565b61005e6101d5565b60006040518060600160405280603d8152602001610476603d9139825250604080516080810182526060808201526001815270036bdcd535d23efe513f05bb99b60f09d4196020808301919091527a07046e23cb3d592516810ebb9ddd6d1c071b490aecf4e26a75582982840152825160a0810190935260638084529192600092909161041390830139606083015250602080830191909152604080518082018252600a8152689adede418753e13f3560b71b92810192909252820152610123610229565b6040805160608082018352818301526a05d63998132773888e661560ab1b815266e833b9730348f86020808301919091528251600180825281850190945291926000929182810190803683370190505090506000808260008151811061018b5761018b6103fc565b9115156020928302919091018201526040840192909252509082527ffe3c000ea4ff983f10458ae1f90193d881c7036826275ca98cd0860000000000908201526060820152919050565b604051806080016040528060608152602001610210604080516080810182526000808252602082018190529181019190915260608082015290565b815260200160608152602001610224610229565b905290565b60405180604001604052806102566040805160608082018352600080835260208301529181019190915290565b8152600060209091015290565b6000815180845260005b818110156102895760208185018101518683018201520161026d565b8181111561029b576000602083870101525b50601f01601f19169290920160200192915050565b600081516040845260a084016affffffffffffffffffffff60a81b8251166040860152602066ffffffffffffff81840151166060870152604083015192506060608087015281835180845260c0880191508285019450600093505b8084101561032d5784511515825293820193600193909301929082019061030b565b509481015164ffffffffff1916950194909452509092915050565b60208152600082516080602084015261036460a0840182610263565b90506020840151601f1980858403016040860152815115158352602082015160100b602084015260018060d81b03604083015116604084015260608201519150608060608401526103b86080840183610263565b925060408601519150808584030160608601526103d58383610263565b92506060860151915080858403016080860152506103f382826102b0565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f2020c3a9f09f9a80c3a94dc3a96f6f6f6f6fc3a92020c3a9f09f9a80204d6ff09f9a80c3a96f204d6f6ff09f9a806ff09f9a8020c3a96ff09f9a80f09f9a806fc3a96ff09f9a806f6f4df09f9a806f6ff09f9a806f20206f4d6f6f20c3a9f09f9a804d6ff09f9a8020c3a96f4df09f9a804df09f9a80c3a94dc3a96f6f6f6ff09f9a80c3a9f09f9a804d6f206f6f4d6ff09f9a806fa26469706673582212201a4bd95106f08965ceb31698b230d2419576d4093fb479e780a600e2c264d83f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_dd204004 {\n bool s_0;\n int136 s_1;\n uint216 s_2;\n string s_3;\n }\n\n struct S_96b27f20 {\n bytes11 s_0;\n uint56 s_1;\n bool[] s_2;\n }\n\n struct S_c79b37e9 {\n S_96b27f20 s_0;\n bytes27 s_1;\n }\n\n struct S_6afd1de1 {\n string s_0;\n S_dd204004 s_1;\n string s_2;\n S_c79b37e9 s_3;\n }\n\n function test () public pure returns (S_6afd1de1 memory) {\n S_6afd1de1 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀Mo🚀 éoM🚀M🚀éMéoooo🚀é🚀Mo ooMo🚀o\";\n r.s_0 = r_0;\n }\n {\n S_dd204004 memory r_1;\n {\n bool r_1_0 = true;\n r_1.s_0 = r_1_0;\n }\n {\n int136 r_1_1 = -1164221126038085248374030812529608821205;\n r_1.s_1 = r_1_1;\n }\n {\n uint216 r_1_2 = 2886752086344032224339910669180919805207688756914310040895445033;\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀o é🚀éMéoooooé é🚀 Mo🚀éo Moo🚀o🚀 éo🚀🚀oéo🚀ooM🚀oo🚀o o\";\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n {\n S_c79b37e9 memory r_3;\n {\n S_96b27f20 memory r_3_0;\n {\n bytes11 r_3_0_0 = bytes11(0x2eb1ccc0993b9c447330a8);\n r_3_0.s_0 = r_3_0_0;\n }\n {\n uint56 r_3_0_1 = 65359066188433656;\n r_3_0.s_1 = r_3_0_1;\n }\n {\n bool[] memory r_3_0_2 = new bool[](1);\n {\n bool r_3_0_2_0 = false;\n r_3_0_2[0] = r_3_0_2_0;\n }\n r_3_0.s_2 = r_3_0_2;\n }\n r_3.s_0 = r_3_0;\n }\n {\n bytes27 r_3_1 = bytes27(0xfe3c000ea4ff983f10458ae1f90193d881c7036826275ca98cd086);\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a804d6ff09f9a8020c3a96f4df09f9a804df09f9a80c3a94dc3a96f6f6f6ff09f9a80c3a9f09f9a804d6f206f6f4d6ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffc94232aca2dc101aec0fa446649f0f62b000000000007046e23cb3d592516810ebb9ddd6d1c071b490aecf4e26a755829000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a806f2020c3a9f09f9a80c3a94dc3a96f6f6f6f6fc3a92020c3a9f09f9a80204d6ff09f9a80c3a96f204d6f6ff09f9a806ff09f9a8020c3a96ff09f9a80f09f9a806fc3a96ff09f9a806f6f4df09f9a806f6ff09f9a806f20206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040fe3c000ea4ff983f10458ae1f90193d881c7036826275ca98cd08600000000002eb1ccc0993b9c447330a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e833b9730348f8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bytes11,bytes12,(bytes7,(address,bytes17,bytes26[],bool[2])[4]))", + "type": "(string,bytes11,bytes12,(bytes7,(address,bytes17,bytes26[],bool[2])[4]))", + "value": [ + "Moo é🚀Mé🚀🚀é🚀 Mo🚀oo🚀 MM🚀 🚀🚀🚀éMMoMoéoéMMo", + "0xfddb86f32746d296980685", + "0x35799ac6c9a8865497ebd270", + [ + "0xa4856e7e816e16", + [ + [ + "0x779d508be1EeF03C200410C433b568a8F5DC2b89", + "0x2ac662d8132312499b64ad78823200fc92", + [ + "0x2a5c9ff0e817e8f68a94151e302753a32a78ba02610b4e6536ab", + "0x3ea0092ac33b8a334b2772e8a216462bb35841ba2a16cefd869f" + ], + [true, true] + ], + [ + "0xe9bf7A03fdC296a66EBA6c24bAaF6cB89a72e402", + "0x476982f425eb6743e3a6f7b6c5cf744bb8", + [ + "0x1f90bf1bff7fd785fea4f19774558811e4804f9a9dc5acc9c86b", + "0x93b0f6ded3d2804277a2002a3fe2cb3da7694ae1b257fe63fef9", + "0x3457a7c3b4194fb774c654d3b0ef83dac271b11256f44f013833", + "0xf0d4889f0a2cd26ceb47290496e59125ea117967a4ef079c084e" + ], + [false, true] + ], + [ + "0x023B1D7982Ad4dEcB33dfF9faBE7653295E513c8", + "0x7f96310e3cde75692c22bf05aa8ce035bf", + [ + "0x2c61ad161238bcf92b0f62f80b9fee25ae7afd47d0f17e502e50", + "0x2306f2ba70e09c97087f93849bf4f87378d502bcae55068951e8", + "0x9c846fde7f7bed480fd405adb33e76f9bc487145cc301c86372a", + "0x362bc23a860f6e14760642a895114b88e3731016287ad86e078d" + ], + [true, false] + ], + [ + "0x0253a90d12362656426aa9D9f0AfF1Dd101F59eb", + "0xf65034dbbd36c0977468dda09d9e60eff3", + [], + [false, false] + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mé🚀🚀é🚀 Mo🚀oo🚀 MM🚀 🚀🚀🚀éMMoMoéoéMMo" + }, + { + "type": "hexstring", + "value": "0xfddb86f32746d296980685" + }, + { + "type": "hexstring", + "value": "0x35799ac6c9a8865497ebd270" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa4856e7e816e16" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x779d508be1EeF03C200410C433b568a8F5DC2b89" + }, + { + "type": "hexstring", + "value": "0x2ac662d8132312499b64ad78823200fc92" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2a5c9ff0e817e8f68a94151e302753a32a78ba02610b4e6536ab" + }, + { + "type": "hexstring", + "value": "0x3ea0092ac33b8a334b2772e8a216462bb35841ba2a16cefd869f" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xe9bf7A03fdC296a66EBA6c24bAaF6cB89a72e402" + }, + { + "type": "hexstring", + "value": "0x476982f425eb6743e3a6f7b6c5cf744bb8" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1f90bf1bff7fd785fea4f19774558811e4804f9a9dc5acc9c86b" + }, + { + "type": "hexstring", + "value": "0x93b0f6ded3d2804277a2002a3fe2cb3da7694ae1b257fe63fef9" + }, + { + "type": "hexstring", + "value": "0x3457a7c3b4194fb774c654d3b0ef83dac271b11256f44f013833" + }, + { + "type": "hexstring", + "value": "0xf0d4889f0a2cd26ceb47290496e59125ea117967a4ef079c084e" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x023B1D7982Ad4dEcB33dfF9faBE7653295E513c8" + }, + { + "type": "hexstring", + "value": "0x7f96310e3cde75692c22bf05aa8ce035bf" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2c61ad161238bcf92b0f62f80b9fee25ae7afd47d0f17e502e50" + }, + { + "type": "hexstring", + "value": "0x2306f2ba70e09c97087f93849bf4f87378d502bcae55068951e8" + }, + { + "type": "hexstring", + "value": "0x9c846fde7f7bed480fd405adb33e76f9bc487145cc301c86372a" + }, + { + "type": "hexstring", + "value": "0x362bc23a860f6e14760642a895114b88e3731016287ad86e078d" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0253a90d12362656426aa9D9f0AfF1Dd101F59eb" + }, + { + "type": "hexstring", + "value": "0xf65034dbbd36c0977468dda09d9e60eff3" + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610911806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906107cc565b60405180910390f35b6100566105f3565b61005e6105f3565b60006040518060800160405280604b8152602001610891604b91398252506afddb86f32746d29698068560a81b60208201526b035799ac6c9a8865497ebd2760a41b60408201526100ad610634565b665242b73f40b70b60c91b81526100c261064a565b6100ca610677565b73779d508be1eef03c200410c433b568a8f5dc2b898152701563316c09918924cdb256bc4119007e4960791b602082015260408051600280825260608201909252600091816020016020820280368337505081519192507f2a5c9ff0e817e8f68a94151e302753a32a78ba02610b4e6536ab0000000000009182915083906000906101575761015761087a565b65ffffffffffff19909216602092830291909101909101525080517f3ea0092ac33b8a334b2772e8a216462bb35841ba2a16cefd869f000000000000908190839060019081106101a9576101a961087a565b65ffffffffffff19909216602092830291909101909101525060408201526101cf61069a565b60018082526020820152606082015281526101e8610677565b73e9bf7a03fdc296a66eba6c24baaf6cb89a72e40281527008ed305e84bd6ce87c74def6d8b9ee8977607b1b602082015260408051600480825260a08201909252600091816020016020820280368337505081519192507f1f90bf1bff7fd785fea4f19774558811e4804f9a9dc5acc9c86b0000000000009182915083906000906102755761027561087a565b65ffffffffffff19909216602092830291909101909101525080517f93b0f6ded3d2804277a2002a3fe2cb3da7694ae1b257fe63fef9000000000000908190839060019081106102c7576102c761087a565b65ffffffffffff19909216602092830291909101909101525080517f3457a7c3b4194fb774c654d3b0ef83dac271b11256f44f013833000000000000908190839060029081106103195761031961087a565b65ffffffffffff19909216602092830291909101909101525080517ff0d4889f0a2cd26ceb47290496e59125ea117967a4ef079c084e0000000000009081908390600390811061036b5761036b61087a565b65ffffffffffff199092166020928302919091019091015250604082015261039161069a565b60008152600160208083019190915260608301919091528201526103b3610677565b73023b1d7982ad4decb33dff9fabe7653295e513c88152707f96310e3cde75692c22bf05aa8ce035bf60781b602082015260408051600480825260a08201909252600091816020016020820280368337505081519192507f2c61ad161238bcf92b0f62f80b9fee25ae7afd47d0f17e502e500000000000009182915083906000906104405761044061087a565b65ffffffffffff19909216602092830291909101909101525080517f2306f2ba70e09c97087f93849bf4f87378d502bcae55068951e8000000000000908190839060019081106104925761049261087a565b65ffffffffffff19909216602092830291909101909101525080517f9c846fde7f7bed480fd405adb33e76f9bc487145cc301c86372a000000000000908190839060029081106104e4576104e461087a565b65ffffffffffff19909216602092830291909101909101525080517f362bc23a860f6e14760642a895114b88e3731016287ad86e078d000000000000908190839060039081106105365761053661087a565b65ffffffffffff199092166020928302919091019091015250604082015261055c61069a565b600181526000602082015260608201526040820152610579610677565b730253a90d12362656426aa9d9f0aff1dd101f59eb815270f65034dbbd36c0977468dda09d9e60eff360781b602080830191909152604080516000815291820181528201526105c661069a565b60008082526020808301919091526060838101929092528382019290925290830191909152820152919050565b60405180608001604052806060815260200160006001600160a81b031916815260200160006001600160a01b031916815260200161062f610634565b905290565b60408051808201909152600081526020810161062f5b60405180608001604052806004905b610661610677565b8152602001906001900390816106595790505090565b6040805160808101825260008082526020820152606091810182905290810161062f5b60405180604001604052806002906020820280368337509192915050565b8060005b60028110156106dd57815115158452602093840193909101906001016106bc565b50505050565b80516001600160c81b03191682526020808201516040828501819052600092909160c0919086840183880186805b60048110156107bd578a8303603f19018452845180516001600160a01b03168452868101516effffffffffffffffffffffffffffff1916878501528881015160a08a860181905281519086018190528986019189019085905b8082101561079357825165ffffffffffff19168452928a0192918a01916001919091019061076a565b505050606091820151916107a9868201846106b8565b509587019594870194935050600101610711565b50909998505050505050505050565b60006020808352835160808285015280518060a086015260005b818110156108025782810184015186820160c0015283016107e6565b8181111561081457600060c083880101525b509185015191601f01601f19168401905061083b60408501836001600160a81b0319169052565b60408501516001600160a01b03198116606086015291506060850151915060a084820301608085015261087160c08201836106e3565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804dc3a9f09f9a80f09f9a80c3a9f09f9a80204d6ff09f9a806f6ff09f9a80204d4df09f9a8020f09f9a80f09f9a80f09f9a80c3a94d4d6f4d6fc3a96fc3a94d4d6fa264697066735822122078be4035a7a7b45f77acc4a428b256f557e284a0a9b50a42d3b7de429f3b9da064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b18937e2 {\n address s_0;\n bytes17 s_1;\n bytes26[] s_2;\n bool[2] s_3;\n }\n\n struct S_349f5351 {\n bytes7 s_0;\n S_b18937e2[4] s_1;\n }\n\n struct S_5ea23101 {\n string s_0;\n bytes11 s_1;\n bytes12 s_2;\n S_349f5351 s_3;\n }\n\n function test () public pure returns (S_5ea23101 memory) {\n S_5ea23101 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀Mé🚀🚀é🚀 Mo🚀oo🚀 MM🚀 🚀🚀🚀éMMoMoéoéMMo\";\n r.s_0 = r_0;\n }\n {\n bytes11 r_1 = bytes11(0xfddb86f32746d296980685);\n r.s_1 = r_1;\n }\n {\n bytes12 r_2 = bytes12(0x35799ac6c9a8865497ebd270);\n r.s_2 = r_2;\n }\n {\n S_349f5351 memory r_3;\n {\n bytes7 r_3_0 = bytes7(0xa4856e7e816e16);\n r_3.s_0 = r_3_0;\n }\n {\n S_b18937e2[4] memory r_3_1;\n {\n S_b18937e2 memory r_3_1_0;\n {\n address r_3_1_0_0 = 0x779d508be1EeF03C200410C433b568a8F5DC2b89;\n r_3_1_0.s_0 = r_3_1_0_0;\n }\n {\n bytes17 r_3_1_0_1 = bytes17(0x2ac662d8132312499b64ad78823200fc92);\n r_3_1_0.s_1 = r_3_1_0_1;\n }\n {\n bytes26[] memory r_3_1_0_2 = new bytes26[](2);\n {\n bytes26 r_3_1_0_2_0 = bytes26(0x2a5c9ff0e817e8f68a94151e302753a32a78ba02610b4e6536ab);\n r_3_1_0_2[0] = r_3_1_0_2_0;\n }\n {\n bytes26 r_3_1_0_2_1 = bytes26(0x3ea0092ac33b8a334b2772e8a216462bb35841ba2a16cefd869f);\n r_3_1_0_2[1] = r_3_1_0_2_1;\n }\n r_3_1_0.s_2 = r_3_1_0_2;\n }\n {\n bool[2] memory r_3_1_0_3;\n {\n bool r_3_1_0_3_0 = true;\n r_3_1_0_3[0] = r_3_1_0_3_0;\n }\n {\n bool r_3_1_0_3_1 = true;\n r_3_1_0_3[1] = r_3_1_0_3_1;\n }\n r_3_1_0.s_3 = r_3_1_0_3;\n }\n r_3_1[0] = r_3_1_0;\n }\n {\n S_b18937e2 memory r_3_1_1;\n {\n address r_3_1_1_0 = 0xe9bf7A03fdC296a66EBA6c24bAaF6cB89a72e402;\n r_3_1_1.s_0 = r_3_1_1_0;\n }\n {\n bytes17 r_3_1_1_1 = bytes17(0x476982f425eb6743e3a6f7b6c5cf744bb8);\n r_3_1_1.s_1 = r_3_1_1_1;\n }\n {\n bytes26[] memory r_3_1_1_2 = new bytes26[](4);\n {\n bytes26 r_3_1_1_2_0 = bytes26(0x1f90bf1bff7fd785fea4f19774558811e4804f9a9dc5acc9c86b);\n r_3_1_1_2[0] = r_3_1_1_2_0;\n }\n {\n bytes26 r_3_1_1_2_1 = bytes26(0x93b0f6ded3d2804277a2002a3fe2cb3da7694ae1b257fe63fef9);\n r_3_1_1_2[1] = r_3_1_1_2_1;\n }\n {\n bytes26 r_3_1_1_2_2 = bytes26(0x3457a7c3b4194fb774c654d3b0ef83dac271b11256f44f013833);\n r_3_1_1_2[2] = r_3_1_1_2_2;\n }\n {\n bytes26 r_3_1_1_2_3 = bytes26(0xf0d4889f0a2cd26ceb47290496e59125ea117967a4ef079c084e);\n r_3_1_1_2[3] = r_3_1_1_2_3;\n }\n r_3_1_1.s_2 = r_3_1_1_2;\n }\n {\n bool[2] memory r_3_1_1_3;\n {\n bool r_3_1_1_3_0 = false;\n r_3_1_1_3[0] = r_3_1_1_3_0;\n }\n {\n bool r_3_1_1_3_1 = true;\n r_3_1_1_3[1] = r_3_1_1_3_1;\n }\n r_3_1_1.s_3 = r_3_1_1_3;\n }\n r_3_1[1] = r_3_1_1;\n }\n {\n S_b18937e2 memory r_3_1_2;\n {\n address r_3_1_2_0 = 0x023B1D7982Ad4dEcB33dfF9faBE7653295E513c8;\n r_3_1_2.s_0 = r_3_1_2_0;\n }\n {\n bytes17 r_3_1_2_1 = bytes17(0x7f96310e3cde75692c22bf05aa8ce035bf);\n r_3_1_2.s_1 = r_3_1_2_1;\n }\n {\n bytes26[] memory r_3_1_2_2 = new bytes26[](4);\n {\n bytes26 r_3_1_2_2_0 = bytes26(0x2c61ad161238bcf92b0f62f80b9fee25ae7afd47d0f17e502e50);\n r_3_1_2_2[0] = r_3_1_2_2_0;\n }\n {\n bytes26 r_3_1_2_2_1 = bytes26(0x2306f2ba70e09c97087f93849bf4f87378d502bcae55068951e8);\n r_3_1_2_2[1] = r_3_1_2_2_1;\n }\n {\n bytes26 r_3_1_2_2_2 = bytes26(0x9c846fde7f7bed480fd405adb33e76f9bc487145cc301c86372a);\n r_3_1_2_2[2] = r_3_1_2_2_2;\n }\n {\n bytes26 r_3_1_2_2_3 = bytes26(0x362bc23a860f6e14760642a895114b88e3731016287ad86e078d);\n r_3_1_2_2[3] = r_3_1_2_2_3;\n }\n r_3_1_2.s_2 = r_3_1_2_2;\n }\n {\n bool[2] memory r_3_1_2_3;\n {\n bool r_3_1_2_3_0 = true;\n r_3_1_2_3[0] = r_3_1_2_3_0;\n }\n {\n bool r_3_1_2_3_1 = false;\n r_3_1_2_3[1] = r_3_1_2_3_1;\n }\n r_3_1_2.s_3 = r_3_1_2_3;\n }\n r_3_1[2] = r_3_1_2;\n }\n {\n S_b18937e2 memory r_3_1_3;\n {\n address r_3_1_3_0 = 0x0253a90d12362656426aa9D9f0AfF1Dd101F59eb;\n r_3_1_3.s_0 = r_3_1_3_0;\n }\n {\n bytes17 r_3_1_3_1 = bytes17(0xf65034dbbd36c0977468dda09d9e60eff3);\n r_3_1_3.s_1 = r_3_1_3_1;\n }\n {\n bytes26[] memory r_3_1_3_2 = new bytes26[](0);\n r_3_1_3.s_2 = r_3_1_3_2;\n }\n {\n bool[2] memory r_3_1_3_3;\n {\n bool r_3_1_3_3_0 = false;\n r_3_1_3_3[0] = r_3_1_3_3_0;\n }\n {\n bool r_3_1_3_3_1 = false;\n r_3_1_3_3[1] = r_3_1_3_3_1;\n }\n r_3_1_3.s_3 = r_3_1_3_3;\n }\n r_3_1[3] = r_3_1_3;\n }\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080fddb86f32746d29698068500000000000000000000000000000000000000000035799ac6c9a8865497ebd27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a804dc3a9f09f9a80f09f9a80c3a9f09f9a80204d6ff09f9a806f6ff09f9a80204d4df09f9a8020f09f9a80f09f9a80f09f9a80c3a94d4d6f4d6fc3a96fc3a94d4d6f000000000000000000000000000000000000000000a4856e7e816e160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000779d508be1eef03c200410c433b568a8f5dc2b892ac662d8132312499b64ad78823200fc9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000022a5c9ff0e817e8f68a94151e302753a32a78ba02610b4e6536ab0000000000003ea0092ac33b8a334b2772e8a216462bb35841ba2a16cefd869f000000000000000000000000000000000000e9bf7a03fdc296a66eba6c24baaf6cb89a72e402476982f425eb6743e3a6f7b6c5cf744bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000041f90bf1bff7fd785fea4f19774558811e4804f9a9dc5acc9c86b00000000000093b0f6ded3d2804277a2002a3fe2cb3da7694ae1b257fe63fef90000000000003457a7c3b4194fb774c654d3b0ef83dac271b11256f44f013833000000000000f0d4889f0a2cd26ceb47290496e59125ea117967a4ef079c084e000000000000000000000000000000000000023b1d7982ad4decb33dff9fabe7653295e513c87f96310e3cde75692c22bf05aa8ce035bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042c61ad161238bcf92b0f62f80b9fee25ae7afd47d0f17e502e500000000000002306f2ba70e09c97087f93849bf4f87378d502bcae55068951e80000000000009c846fde7f7bed480fd405adb33e76f9bc487145cc301c86372a000000000000362bc23a860f6e14760642a895114b88e3731016287ad86e078d0000000000000000000000000000000000000253a90d12362656426aa9d9f0aff1dd101f59ebf65034dbbd36c0977468dda09d9e60eff300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string[4],(address[4],int16,string,address,bool[]),string,bytes17)", + "type": "(string[4],(address[4],int16,string,address,bool[]),string,bytes17)", + "value": [ + [ + "Moo é🚀M MMM o", + "Moo é🚀M Moooééooooéoé🚀oM o o🚀é ooooéooMooooéoé oéMé🚀o🚀Mo", + "Moo é🚀oMéMo🚀 🚀MoMo🚀ééooo", + "Moo é🚀 éoM🚀o🚀 🚀é🚀oéMMo oMéo MMooooo éooooo" + ], + [ + [ + "0x62557325a8Aa36C4b8063a062C1589E5F6930709", + "0x1E186fa11c8364689aB6dD6d73C0B97ebE7AA7DD", + "0x10DafeB44858EacFff8BFfea62eC9B0c88504433", + "0xC9D67dA168131348B2Cb6fDfadc1c2869aE1B799" + ], + "32647", + "Moo é🚀o🚀M MMéoo MéM o é M🚀 oo ééoo🚀éé🚀🚀oMooo🚀 o oMéoMéoo🚀Moé", + "0x02Cb3D234A91Bb8FdCBb40f6BF83e23F19419A23", + [true] + ], + "Moo é🚀é é", + "0xdd3f23674b7e07829fe5899f5b75c104f0" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M MMM o" + }, + { + "type": "string", + "value": "Moo é🚀M Moooééooooéoé🚀oM o o🚀é ooooéooMooooéoé oéMé🚀o🚀Mo" + }, + { + "type": "string", + "value": "Moo é🚀oMéMo🚀 🚀MoMo🚀ééooo" + }, + { + "type": "string", + "value": "Moo é🚀 éoM🚀o🚀 🚀é🚀oéMMo oMéo MMooooo éooooo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x62557325a8Aa36C4b8063a062C1589E5F6930709" + }, + { + "type": "address", + "value": "0x1E186fa11c8364689aB6dD6d73C0B97ebE7AA7DD" + }, + { + "type": "address", + "value": "0x10DafeB44858EacFff8BFfea62eC9B0c88504433" + }, + { + "type": "address", + "value": "0xC9D67dA168131348B2Cb6fDfadc1c2869aE1B799" + } + ] + }, + { + "type": "number", + "value": "32647" + }, + { + "type": "string", + "value": "Moo é🚀o🚀M MMéoo MéM o é M🚀 oo ééoo🚀éé🚀🚀oMooo🚀 o oMéoMéoo🚀Moé" + }, + { + "type": "address", + "value": "0x02Cb3D234A91Bb8FdCBb40f6BF83e23F19419A23" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é é" + }, + { + "type": "hexstring", + "value": "0xdd3f23674b7e07829fe5899f5b75c104f0" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061066c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061044e565b60405180910390f35b610056610269565b61005e610269565b61006661029d565b60408051808201825260118152704d6f6f20c3a9f09f9a804d204d4d4d206f60781b60208083019190915290835281516080810190925260548083526000929161057c90830139905080826001602002018190525050600060405180606001604052806028815260200161060f60289139604080840191909152805160608101909152603f808252600092506105d06020830139606083015250815261010a6102c4565b610112610305565b7362557325a8aa36c4b8063a062c1589e5f69307098152731e186fa11c8364689ab6dd6d73c0b97ebe7aa7dd6020808301919091527310dafeb44858eacfff8bffea62ec9b0c8850443360408084019190915273c9d67da168131348b2cb6fdfadc1c2869ae1b7996060840152918352617f8783820152815160808101909252605f8083526000929161051d908301396040838101919091527302cb3d234a91bb8fdcbb40f6bf83e23f19419a23606084015280516001808252818301909252600092509060208083019080368337019050509050600060019050808260008151811061020157610201610506565b91151560209283029190910182015260808401929092525082810191909152604080518082018252600f81526e4d6f6f20c3a9f09f9a80c3a920c3a960881b92810192909252820152700dd3f23674b7e07829fe5899f5b75c104f607c1b6060820152919050565b604051806080016040528061027c61029d565b81526020016102896102c4565b815260606020820152600060409091015290565b60405180608001604052806004905b60608152602001906001900390816102ac5790505090565b6040518060a001604052806102d7610305565b8152602001600060010b81526020016060815260200160006001600160a01b03168152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b818110156103495760208185018101518683018201520161032d565b8181111561035b576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156103a2578151151587529582019590820190600101610384565b509495945050505050565b80516000906101009084835b60048110156103e15782516001600160a01b03168252602092830192909101906001016103b9565b50505060208301516103f8608086018260010b9052565b5060408301518160a086015261041082860182610323565b915050606083015161042d60c08601826001600160a01b03169052565b50608083015184820360e08601526104458282610370565b95945050505050565b602080825282516080838301526000919061012084019060a08501845b600481101561049a57609f19878503018252610488848451610323565b9350918401919084019060010161046b565b505050818501519150601f19808583030160408601526104ba82846103ad565b92506040860151915080858403016060860152506104d88282610323565b91505060608401516104fe60808501826effffffffffffffffffffffffffffff19169052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806ff09f9a804d204d4dc3a96f6f204dc3a94d206f20c3a9204df09f9a80206f6f20c3a9c3a96f6ff09f9a80c3a9c3a9f09f9a80f09f9a806f4d6f6f6ff09f9a80206f206f4dc3a96f4dc3a96f6ff09f9a804d6fc3a94d6f6f20c3a9f09f9a804d204d6f6f6fc3a9c3a96f6f6f6fc3a96fc3a9f09f9a806f4d206f206ff09f9a80c3a920206f6f6f6fc3a96f6f4d6f6f6f6fc3a96fc3a920206fc3a94dc3a9f09f9a806ff09f9a804d6f4d6f6f20c3a9f09f9a8020c3a96f4df09f9a806ff09f9a8020f09f9a80c3a9f09f9a806fc3a94d4d6f206f4dc3a96f204d4d6f6f6f6f6f20c3a96f6f6f6f6f4d6f6f20c3a9f09f9a806f4dc3a94d6ff09f9a8020f09f9a804d6f4d6ff09f9a80c3a9c3a96f6f6fa26469706673582212204ca23b197a8b53134f4219c7e438d7c721be1442ff280d37ec277458f475df6964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ef62c53d {\n address[4] s_0;\n int16 s_1;\n string s_2;\n address s_3;\n bool[] s_4;\n }\n\n struct S_db218672 {\n string[4] s_0;\n S_ef62c53d s_1;\n string s_2;\n bytes17 s_3;\n }\n\n function test () public pure returns (S_db218672 memory) {\n S_db218672 memory r;\n {\n string[4] memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀M MMM o\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀M Moooééooooéoé🚀oM o o🚀é ooooéooMooooéoé oéMé🚀o🚀Mo\";\n r_0[1] = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀oMéMo🚀 🚀MoMo🚀ééooo\";\n r_0[2] = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀 éoM🚀o🚀 🚀é🚀oéMMo oMéo MMooooo éooooo\";\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n S_ef62c53d memory r_1;\n {\n address[4] memory r_1_0;\n {\n address r_1_0_0 = 0x62557325a8Aa36C4b8063a062C1589E5F6930709;\n r_1_0[0] = r_1_0_0;\n }\n {\n address r_1_0_1 = 0x1E186fa11c8364689aB6dD6d73C0B97ebE7AA7DD;\n r_1_0[1] = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x10DafeB44858EacFff8BFfea62eC9B0c88504433;\n r_1_0[2] = r_1_0_2;\n }\n {\n address r_1_0_3 = 0xC9D67dA168131348B2Cb6fDfadc1c2869aE1B799;\n r_1_0[3] = r_1_0_3;\n }\n r_1.s_0 = r_1_0;\n }\n {\n int16 r_1_1 = 32647;\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀o🚀M MMéoo MéM o é M🚀 oo ééoo🚀éé🚀🚀oMooo🚀 o oMéoMéoo🚀Moé\";\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0x02Cb3D234A91Bb8FdCBb40f6BF83e23F19419A23;\n r_1.s_3 = r_1_3;\n }\n {\n bool[] memory r_1_4 = new bool[](1);\n {\n bool r_1_4_0 = true;\n r_1_4[0] = r_1_4_0;\n }\n r_1.s_4 = r_1_4;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀é é\";\n r.s_2 = r_2;\n }\n {\n bytes17 r_3 = bytes17(0xdd3f23674b7e07829fe5899f5b75c104f0);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000440dd3f23674b7e07829fe5899f5b75c104f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804d204d4d4d206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a804d204d6f6f6fc3a9c3a96f6f6f6fc3a96fc3a9f09f9a806f4d206f206ff09f9a80c3a920206f6f6f6fc3a96f6f4d6f6f6f6fc3a96fc3a920206fc3a94dc3a9f09f9a806ff09f9a804d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a806f4dc3a94d6ff09f9a8020f09f9a804d6f4d6ff09f9a80c3a9c3a96f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a8020c3a96f4df09f9a806ff09f9a8020f09f9a80c3a9f09f9a806fc3a94d4d6f206f4dc3a96f204d4d6f6f6f6f6f20c3a96f6f6f6f6f0000000000000000000000000062557325a8aa36c4b8063a062c1589e5f69307090000000000000000000000001e186fa11c8364689ab6dd6d73c0b97ebe7aa7dd00000000000000000000000010dafeb44858eacfff8bffea62ec9b0c88504433000000000000000000000000c9d67da168131348b2cb6fdfadc1c2869ae1b7990000000000000000000000000000000000000000000000000000000000007f87000000000000000000000000000000000000000000000000000000000000010000000000000000000000000002cb3d234a91bb8fdcbb40f6bf83e23f19419a230000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000005f4d6f6f20c3a9f09f9a806ff09f9a804d204d4dc3a96f6f204dc3a94d206f20c3a9204df09f9a80206f6f20c3a9c3a96f6ff09f9a80c3a9c3a9f09f9a80f09f9a806f4d6f6f6ff09f9a80206f206f4dc3a96f4dc3a96f6ff09f9a804d6fc3a90000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80c3a920c3a90000000000000000000000000000000000" + }, + { + "name": "random-(((bool,uint112[2],string),string,bytes1,bool[1],bytes32),bool,bytes9)[4]", + "type": "(((bool,uint112[2],string),string,bytes1,bool[1],bytes32),bool,bytes9)[4]", + "value": [ + [ + [ + [ + false, + [ + "1524743065659751003181002726779991", + "2304995672955559947592275229386344" + ], + "Moo é🚀o🚀" + ], + "Moo é🚀 oééMoooé oMMooo🚀MoMMM🚀éé éé oé", + "0xef", + [true], + "0xb4546181da7adbdfa821f7b068e4aade9a8ba432524fd04b290dacba7bd6da6b" + ], + true, + "0x91d627c27c59abcd55" + ], + [ + [ + [ + true, + [ + "2193032221931312744498652777456888", + "4539594797478879932990022069986571" + ], + "Moo é🚀éo🚀ooo oooMo🚀o🚀" + ], + "Moo é🚀MoéoMoMMMoé 🚀ooooéoo", + "0x66", + [true], + "0x328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd41" + ], + true, + "0xd1c5904c1676b9a3ca" + ], + [ + [ + [ + false, + ["597474868964284695740190723126164", "1602494145763489996048063486089087"], + "Moo é🚀" + ], + "Moo é🚀M éMo🚀 M ooéo🚀🚀 MM 🚀M🚀MoéM 🚀M MMM é🚀🚀éM🚀🚀ooMéooMo", + "0x37", + [false], + "0x83ee6960ccd77d8ef4483783d79d5721de907a490a78a7c3bc87f47e7cd7aac1" + ], + true, + "0xa093601cc9a7219c91" + ], + [ + [ + [ + true, + [ + "1976019007855734913493630404751134", + "4821591390761240086920764850975974" + ], + "Moo é🚀o🚀oo Moo🚀éoéMéoM🚀🚀 oMo oéééo🚀🚀o🚀 oéoo o 🚀M ooMooo " + ], + "Moo é🚀MMé MoMoo 🚀 M éé oo oM éoéooééééoo🚀 oo🚀", + "0x97", + [false], + "0x7c337b937f57bda5cc1f7ea3bd895bc276087e225b156f214579f1fc3bb4df4c" + ], + false, + "0x4803d6bcc535142e38" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1524743065659751003181002726779991" + }, + { + "type": "number", + "value": "2304995672955559947592275229386344" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 oééMoooé oMMooo🚀MoMMM🚀éé éé oé" + }, + { + "type": "hexstring", + "value": "0xef" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xb4546181da7adbdfa821f7b068e4aade9a8ba432524fd04b290dacba7bd6da6b" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x91d627c27c59abcd55" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2193032221931312744498652777456888" + }, + { + "type": "number", + "value": "4539594797478879932990022069986571" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éo🚀ooo oooMo🚀o🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MoéoMoMMMoé 🚀ooooéoo" + }, + { + "type": "hexstring", + "value": "0x66" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd41" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xd1c5904c1676b9a3ca" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "597474868964284695740190723126164" + }, + { + "type": "number", + "value": "1602494145763489996048063486089087" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M éMo🚀 M ooéo🚀🚀 MM 🚀M🚀MoéM 🚀M MMM é🚀🚀éM🚀🚀ooMéooMo" + }, + { + "type": "hexstring", + "value": "0x37" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x83ee6960ccd77d8ef4483783d79d5721de907a490a78a7c3bc87f47e7cd7aac1" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xa093601cc9a7219c91" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1976019007855734913493630404751134" + }, + { + "type": "number", + "value": "4821591390761240086920764850975974" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀oo Moo🚀éoéMéoM🚀🚀 oMo oéééo🚀🚀o🚀 oéoo o 🚀M ooMooo " + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MMé MoMoo 🚀 M éé oo oM éoéooééééoo🚀 oo🚀" + }, + { + "type": "hexstring", + "value": "0x97" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x7c337b937f57bda5cc1f7ea3bd895bc276087e225b156f214579f1fc3bb4df4c" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x4803d6bcc535142e38" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506108ad806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105ca565b60405180910390f35b61005661045e565b61005e61045e565b61006661048b565b61006e6104b2565b6100766104ed565b60008152610082610516565b6d4b2cf68f09d5822c2a1f46cb2c5781526d71a522b4affd44ca5257b72fa66860208083019190915282810191909152604080518082018252600f81526d9adede418753e13f3500dfe13f35608f1b81840152818401529183528151606081019092526037808352600092916108419083013960208301525060ef60f81b604082015261010d610534565b600180825260608301919091527fb4546181da7adbdfa821f7b068e4aade9a8ba432524fd04b290dacba7bd6da6b608083015290825260208201526891d627c27c59abcd5560b81b6040820152815261016461048b565b61016c6104b2565b6101746104ed565b60018152610180610516565b6d6c1ff548af881be7a390654ea4f881526ddfd1bde55234c1ec554a1893250b602080830191909152828101919091526040805160608101909152602380825260009261081e90830139604080840191909152918352508051606081019091526024808252600091906107fa6020830139602083015250603360f91b6040820152610209610534565b600180825260608301919091527f328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4160808301529082526020828101919091526868e2c8260b3b5cd1e560b91b604083015282015261026561048b565b61026d6104b2565b6102756104ed565b60008152610281610516565b6d1d75316c184c7a4fea2f2573b39481526d4f0251d91af3ec5af25d6131d77f60208083019190915282810191909152604080518082018252600a8152689adede418753e13f3560b71b8184015281840152918352815160a081019092526061808352600092916106f690830139602083015250603760f81b6040820152610307610534565b6000815260608201527f83ee6960ccd77d8ef4483783d79d5721de907a490a78a7c3bc87f47e7cd7aac1608082015281526001602082015268a093601cc9a7219c9160b81b60408083019190915282015261036061048b565b6103686104b2565b6103706104ed565b6001815261037c610516565b6d616cddc555a3f13a1fb508f36f1e81526dedb90a08171d0fce529f75ec34e6602080830191909152828101919091526040805160808101909152605e80825260009261079c90830139604080840191909152918352508051608081019091526045808252600091906107576020830139602083015250609760f81b6040820152610405610534565b60008082526060838101929092527f7c337b937f57bda5cc1f7ea3bd895bc276087e225b156f214579f1fc3bb4df4c608084015291835260208301919091526809007ad798a6a285c760bb1b6040830152820152919050565b60405180608001604052806004905b61047561048b565b81526020019060019003908161046d5790505090565b604051806060016040528061049e6104b2565b815260006020820181905260409091015290565b6040518060a001604052806104c56104ed565b815260606020820181905260006040830152016104e0610534565b8152600060209091015290565b6040518060600160405280600015158152602001610509610516565b8152602001606081525090565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156105785760208185018101518683018201520161055c565b8181111561058a576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60018110156105c457815115158452602093840193909101906001016105a3565b50505050565b602080825260009060a08382018185018685805b60048110156106e757601f1989850301855282516060815181875280518983890152805115156101008901528a8101516101208901875b60028110156106425782516dffffffffffffffffffffffffffff168252918d0191908d0190600101610615565b50505060408082015191506080806101608b01526106646101808b0184610552565b92508c840151605f198b850301828c015261067f8482610552565b9350508184015161069b8d8c01826001600160f81b0319169052565b5093830151936106ae60c08b018661059f565b9092015160e0890152838b015115158b890152928101516001600160b81b031916960195909552948701949350918601916001016105de565b50919897505050505050505056fe4d6f6f20c3a9f09f9a804d20c3a94d6ff09f9a80204d20206f6fc3a96ff09f9a80f09f9a80204d4d2020f09f9a804df09f9a804d6fc3a94d20f09f9a804d204d4d4d20c3a9f09f9a80f09f9a80c3a94df09f9a80f09f9a806f6f4dc3a96f6f4d6f4d6f6f20c3a9f09f9a804d4dc3a9204d6f4d6f6f20f09f9a80204d2020c3a9c3a9206f6f206f4d20c3a96fc3a96f6fc3a9c3a9c3a9c3a96f6ff09f9a8020206f6ff09f9a804d6f6f20c3a9f09f9a806ff09f9a806f6f204d6f6ff09f9a80c3a96fc3a94dc3a96f4df09f9a80f09f9a80206f4d6f206fc3a9c3a9c3a96ff09f9a80f09f9a806ff09f9a8020206fc3a96f6f206f20f09f9a804d2020206f6f4d6f6f6f204d6f6f20c3a9f09f9a804d6fc3a96f4d6f4d4d4d6fc3a920f09f9a806f6f6f6fc3a96f6f4d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f6f206f6f6f4d6ff09f9a806ff09f9a804d6f6f20c3a9f09f9a80206fc3a9c3a94d6f6f6fc3a9206f4d4d6f6f6ff09f9a804d6f4d4d4df09f9a80c3a9c3a920c3a9c3a9206fc3a9a26469706673582212203a1f133693bbc077fb2e10b86fd57aa69fe422c9596bd2b59b2d0c5291bead7c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2dff1de4 {\n bool s_0;\n uint112[2] s_1;\n string s_2;\n }\n\n struct S_712d7f10 {\n S_2dff1de4 s_0;\n string s_1;\n bytes1 s_2;\n bool[1] s_3;\n bytes32 s_4;\n }\n\n struct S_ac9e1130 {\n S_712d7f10 s_0;\n bool s_1;\n bytes9 s_2;\n }\n\n function test () public pure returns (S_ac9e1130[4] memory) {\n S_ac9e1130[4] memory r;\n {\n S_ac9e1130 memory r_0;\n {\n S_712d7f10 memory r_0_0;\n {\n S_2dff1de4 memory r_0_0_0;\n {\n bool r_0_0_0_0 = false;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n uint112[2] memory r_0_0_0_1;\n {\n uint112 r_0_0_0_1_0 = 1524743065659751003181002726779991;\n r_0_0_0_1[0] = r_0_0_0_1_0;\n }\n {\n uint112 r_0_0_0_1_1 = 2304995672955559947592275229386344;\n r_0_0_0_1[1] = r_0_0_0_1_1;\n }\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n string memory r_0_0_0_2 = unicode\"Moo é🚀o🚀\";\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀 oééMoooé oMMooo🚀MoMMM🚀éé éé oé\";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bytes1 r_0_0_2 = bytes1(0xef);\n r_0_0.s_2 = r_0_0_2;\n }\n {\n bool[1] memory r_0_0_3;\n {\n bool r_0_0_3_0 = true;\n r_0_0_3[0] = r_0_0_3_0;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n {\n bytes32 r_0_0_4 = bytes32(0xb4546181da7adbdfa821f7b068e4aade9a8ba432524fd04b290dacba7bd6da6b);\n r_0_0.s_4 = r_0_0_4;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n bytes9 r_0_2 = bytes9(0x91d627c27c59abcd55);\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_ac9e1130 memory r_1;\n {\n S_712d7f10 memory r_1_0;\n {\n S_2dff1de4 memory r_1_0_0;\n {\n bool r_1_0_0_0 = true;\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n uint112[2] memory r_1_0_0_1;\n {\n uint112 r_1_0_0_1_0 = 2193032221931312744498652777456888;\n r_1_0_0_1[0] = r_1_0_0_1_0;\n }\n {\n uint112 r_1_0_0_1_1 = 4539594797478879932990022069986571;\n r_1_0_0_1[1] = r_1_0_0_1_1;\n }\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n string memory r_1_0_0_2 = unicode\"Moo é🚀éo🚀ooo oooMo🚀o🚀\";\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n string memory r_1_0_1 = unicode\"Moo é🚀MoéoMoMMMoé 🚀ooooéoo\";\n r_1_0.s_1 = r_1_0_1;\n }\n {\n bytes1 r_1_0_2 = bytes1(0x66);\n r_1_0.s_2 = r_1_0_2;\n }\n {\n bool[1] memory r_1_0_3;\n {\n bool r_1_0_3_0 = true;\n r_1_0_3[0] = r_1_0_3_0;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n {\n bytes32 r_1_0_4 = bytes32(0x328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd41);\n r_1_0.s_4 = r_1_0_4;\n }\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n bytes9 r_1_2 = bytes9(0xd1c5904c1676b9a3ca);\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_ac9e1130 memory r_2;\n {\n S_712d7f10 memory r_2_0;\n {\n S_2dff1de4 memory r_2_0_0;\n {\n bool r_2_0_0_0 = false;\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n uint112[2] memory r_2_0_0_1;\n {\n uint112 r_2_0_0_1_0 = 597474868964284695740190723126164;\n r_2_0_0_1[0] = r_2_0_0_1_0;\n }\n {\n uint112 r_2_0_0_1_1 = 1602494145763489996048063486089087;\n r_2_0_0_1[1] = r_2_0_0_1_1;\n }\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n string memory r_2_0_0_2 = unicode\"Moo é🚀\";\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n string memory r_2_0_1 = unicode\"Moo é🚀M éMo🚀 M ooéo🚀🚀 MM 🚀M🚀MoéM 🚀M MMM é🚀🚀éM🚀🚀ooMéooMo\";\n r_2_0.s_1 = r_2_0_1;\n }\n {\n bytes1 r_2_0_2 = bytes1(0x37);\n r_2_0.s_2 = r_2_0_2;\n }\n {\n bool[1] memory r_2_0_3;\n {\n bool r_2_0_3_0 = false;\n r_2_0_3[0] = r_2_0_3_0;\n }\n r_2_0.s_3 = r_2_0_3;\n }\n {\n bytes32 r_2_0_4 = bytes32(0x83ee6960ccd77d8ef4483783d79d5721de907a490a78a7c3bc87f47e7cd7aac1);\n r_2_0.s_4 = r_2_0_4;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n bytes9 r_2_2 = bytes9(0xa093601cc9a7219c91);\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_ac9e1130 memory r_3;\n {\n S_712d7f10 memory r_3_0;\n {\n S_2dff1de4 memory r_3_0_0;\n {\n bool r_3_0_0_0 = true;\n r_3_0_0.s_0 = r_3_0_0_0;\n }\n {\n uint112[2] memory r_3_0_0_1;\n {\n uint112 r_3_0_0_1_0 = 1976019007855734913493630404751134;\n r_3_0_0_1[0] = r_3_0_0_1_0;\n }\n {\n uint112 r_3_0_0_1_1 = 4821591390761240086920764850975974;\n r_3_0_0_1[1] = r_3_0_0_1_1;\n }\n r_3_0_0.s_1 = r_3_0_0_1;\n }\n {\n string memory r_3_0_0_2 = unicode\"Moo é🚀o🚀oo Moo🚀éoéMéoM🚀🚀 oMo oéééo🚀🚀o🚀 oéoo o 🚀M ooMooo \";\n r_3_0_0.s_2 = r_3_0_0_2;\n }\n r_3_0.s_0 = r_3_0_0;\n }\n {\n string memory r_3_0_1 = unicode\"Moo é🚀MMé MoMoo 🚀 M éé oo oM éoéooééééoo🚀 oo🚀\";\n r_3_0.s_1 = r_3_0_1;\n }\n {\n bytes1 r_3_0_2 = bytes1(0x97);\n r_3_0.s_2 = r_3_0_2;\n }\n {\n bool[1] memory r_3_0_3;\n {\n bool r_3_0_3_0 = false;\n r_3_0_3[0] = r_3_0_3_0;\n }\n r_3_0.s_3 = r_3_0_3;\n }\n {\n bytes32 r_3_0_4 = bytes32(0x7c337b937f57bda5cc1f7ea3bd895bc276087e225b156f214579f1fc3bb4df4c);\n r_3_0.s_4 = r_3_0_4;\n }\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3.s_1 = r_3_1;\n }\n {\n bytes9 r_3_2 = bytes9(0x4803d6bcc535142e38);\n r_3.s_2 = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000191d627c27c59abcd55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000160ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4546181da7adbdfa821f7b068e4aade9a8ba432524fd04b290dacba7bd6da6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b2cf68f09d5822c2a1f46cb2c5700000000000000000000000000000000000071a522b4affd44ca5257b72fa6680000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80206fc3a9c3a94d6f6f6fc3a9206f4d4d6f6f6ff09f9a804d6f4d4d4df09f9a80c3a9c3a920c3a9c3a9206fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001d1c5904c1676b9a3ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000018066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000006c1ff548af881be7a390654ea4f8000000000000000000000000000000000000dfd1bde55234c1ec554a1893250b000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f6f206f6f6f4d6ff09f9a806ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a804d6fc3a96f4d6f4d4d4d6fc3a920f09f9a806f6f6f6fc3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001a093601cc9a7219c91000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001603700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083ee6960ccd77d8ef4483783d79d5721de907a490a78a7c3bc87f47e7cd7aac100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d75316c184c7a4fea2f2573b3940000000000000000000000000000000000004f0251d91af3ec5af25d6131d77f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a804d20c3a94d6ff09f9a80204d20206f6fc3a96ff09f9a80f09f9a80204d4d2020f09f9a804df09f9a804d6fc3a94d20f09f9a804d204d4d4d20c3a9f09f9a80f09f9a80c3a94df09f9a80f09f9a806f6f4dc3a96f6f4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000004803d6bcc535142e38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a0970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c337b937f57bda5cc1f7ea3bd895bc276087e225b156f214579f1fc3bb4df4c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000616cddc555a3f13a1fb508f36f1e000000000000000000000000000000000000edb90a08171d0fce529f75ec34e60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a806ff09f9a806f6f204d6f6ff09f9a80c3a96fc3a94dc3a96f4df09f9a80f09f9a80206f4d6f206fc3a9c3a9c3a96ff09f9a80f09f9a806ff09f9a8020206fc3a96f6f206f20f09f9a804d2020206f6f4d6f6f6f20000000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a804d4dc3a9204d6f4d6f6f20f09f9a80204d2020c3a9c3a9206f6f206f4d20c3a96fc3a96f6fc3a9c3a9c3a9c3a96f6ff09f9a8020206f6ff09f9a80000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,address[1]),(uint112,(string,address,address,uint184,bytes4),string,bool),uint240)", + "type": "((address,address[1]),(uint112,(string,address,address,uint184,bytes4),string,bool),uint240)", + "value": [ + [ + "0xAD19FaDF81A15d0837E38DDcC587eBDF1296DB8e", + ["0xA28a9239812CDe273c9B3AB871D6529865C288a0"] + ], + [ + "2789240170870581534885721673351500", + [ + "Moo é🚀 M🚀oéé éooo🚀🚀 🚀éoM🚀 oM🚀🚀oMo🚀éo M ééM🚀M 🚀oooooooééo", + "0x2c13E4C5a8Bf8a2771c36368374c448F37a43768", + "0x410Daaf3A26F65CFB733B44e31d0855ac2B2b8Bc", + "12726693198414424396038837673065339712036485956547019958", + "0xf5b55100" + ], + "Moo é🚀🚀🚀éoMoo🚀Mo🚀éoo é o🚀M éMéoMoM o ", + true + ], + "1680834534767936496981263258330137788751777961886160992532481400896987555" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xAD19FaDF81A15d0837E38DDcC587eBDF1296DB8e" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xA28a9239812CDe273c9B3AB871D6529865C288a0" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2789240170870581534885721673351500" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M🚀oéé éooo🚀🚀 🚀éoM🚀 oM🚀🚀oMo🚀éo M ééM🚀M 🚀oooooooééo" + }, + { + "type": "address", + "value": "0x2c13E4C5a8Bf8a2771c36368374c448F37a43768" + }, + { + "type": "address", + "value": "0x410Daaf3A26F65CFB733B44e31d0855ac2B2b8Bc" + }, + { + "type": "number", + "value": "12726693198414424396038837673065339712036485956547019958" + }, + { + "type": "hexstring", + "value": "0xf5b55100" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀éoMoo🚀Mo🚀éoo é o🚀M éMéoMoM o " + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "1680834534767936496981263258330137788751777961886160992532481400896987555" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104d5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102da565b60405180910390f35b6100566101cd565b61005e6101cd565b6100666101fa565b73ad19fadf81a15d0837e38ddcc587ebdf1296db8e8152610085610222565b73a28a9239812cde273c9b3ab871d6529865c288a08152602082015281526100ab610240565b6d898529111926347fc7d9ff78c14c81526040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260006040518060a001604052806064815260200161043c60649139825250732c13e4c5a8bf8a2771c36368374c448f37a4376860208083019190915273410daaf3a26f65cfb733b44e31d0855ac2b2b8bc6040808401919091527684df74da5be1182d5880e1b6b310093510340b244684b660608085019190915262f5b55160e81b60808501528483019390935280519283019052603d808352600092916103ff90830139604080840191909152600160608401526020840192909252507df3899e31bdbfd360b0ccc4fe8464447b93c8d6dae86adb5435f77377a1a390820152919050565b60405180606001604052806101e06101fa565b81526020016101ed610240565b8152600060209091015290565b604051806040016040528060006001600160a01b0316815260200161021d610222565b905290565b60405180602001604052806001906020820280368337509192915050565b60408051608080820183526000808352835160a081018552606080825260208281018490529582018390528101829052918201529091820190815260606020820152600060409091015290565b6000815180845260005b818110156102b357602081850181015186830182015201610297565b818111156102c5576000602083870101525b50601f01601f19169290920160200192915050565b6020808252825180516001600160a01b0390811684840152908201516000929160408501845b600181101561031f578351831682529284019290840190600101610300565b5050828601519150608060608601526dffffffffffffffffffffffffffff82511660a086015282820151608060c0870152805160a06101208801526103686101c088018261028d565b94820151831661014088015250604080820151831661016088015260608201516001600160b81b031661018088015260808201516001600160e01b0319166101a0880152830151868503609f190160e0880152936103c6818661028d565b9450505050606081015190506103e161010085018215159052565b5060408401516001600160f01b038116608085015250939250505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a96f4d6f6ff09f9a804d6ff09f9a80c3a96f6f20c3a9206ff09f9a804d20c3a94dc3a96f4d6f4d206f204d6f6f20c3a9f09f9a80204df09f9a806fc3a9c3a920c3a96f6f6ff09f9a80f09f9a8020f09f9a80c3a96f4df09f9a80206f4df09f9a80f09f9a806f4d6ff09f9a80c3a96f204d2020c3a9c3a94df09f9a804d20f09f9a806f6f6f6f6f6f6fc3a9c3a96fa264697066735822122007c06084321294164edfb6f5f0fce9018e15fbbd0f383f437e0ff677c17a1c7964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ab540be8 {\n address s_0;\n address[1] s_1;\n }\n\n struct S_1a0602cf {\n string s_0;\n address s_1;\n address s_2;\n uint184 s_3;\n bytes4 s_4;\n }\n\n struct S_f4640940 {\n uint112 s_0;\n S_1a0602cf s_1;\n string s_2;\n bool s_3;\n }\n\n struct S_db9728ba {\n S_ab540be8 s_0;\n S_f4640940 s_1;\n uint240 s_2;\n }\n\n function test () public pure returns (S_db9728ba memory) {\n S_db9728ba memory r;\n {\n S_ab540be8 memory r_0;\n {\n address r_0_0 = 0xAD19FaDF81A15d0837E38DDcC587eBDF1296DB8e;\n r_0.s_0 = r_0_0;\n }\n {\n address[1] memory r_0_1;\n {\n address r_0_1_0 = 0xA28a9239812CDe273c9B3AB871D6529865C288a0;\n r_0_1[0] = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_f4640940 memory r_1;\n {\n uint112 r_1_0 = 2789240170870581534885721673351500;\n r_1.s_0 = r_1_0;\n }\n {\n S_1a0602cf memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀 M🚀oéé éooo🚀🚀 🚀éoM🚀 oM🚀🚀oMo🚀éo M ééM🚀M 🚀oooooooééo\";\n r_1_1.s_0 = r_1_1_0;\n }\n {\n address r_1_1_1 = 0x2c13E4C5a8Bf8a2771c36368374c448F37a43768;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x410Daaf3A26F65CFB733B44e31d0855ac2B2b8Bc;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n uint184 r_1_1_3 = 12726693198414424396038837673065339712036485956547019958;\n r_1_1.s_3 = r_1_1_3;\n }\n {\n bytes4 r_1_1_4 = bytes4(0xf5b55100);\n r_1_1.s_4 = r_1_1_4;\n }\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀🚀🚀éoMoo🚀Mo🚀éoo é o🚀M éMéoMoM o \";\n r_1.s_2 = r_1_2;\n }\n {\n bool r_1_3 = true;\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n uint240 r_2 = 1680834534767936496981263258330137788751777961886160992532481400896987555;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000ad19fadf81a15d0837e38ddcc587ebdf1296db8e000000000000000000000000a28a9239812cde273c9b3ab871d6529865c288a000000000000000000000000000000000000000000000000000000000000000800000f3899e31bdbfd360b0ccc4fe8464447b93c8d6dae86adb5435f77377a1a3000000000000000000000000000000000000898529111926347fc7d9ff78c14c000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002c13e4c5a8bf8a2771c36368374c448f37a43768000000000000000000000000410daaf3a26f65cfb733b44e31d0855ac2b2b8bc00000000000000000084df74da5be1182d5880e1b6b310093510340b244684b6f5b551000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a80204df09f9a806fc3a9c3a920c3a96f6f6ff09f9a80f09f9a8020f09f9a80c3a96f4df09f9a80206f4df09f9a80f09f9a806f4d6ff09f9a80c3a96f204d2020c3a9c3a94df09f9a804d20f09f9a806f6f6f6f6f6f6fc3a9c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a96f4d6f6ff09f9a804d6ff09f9a80c3a96f6f20c3a9206ff09f9a804d20c3a94dc3a96f4d6f4d206f20000000" + }, + { + "name": "random-((bytes24,address,string,(bytes29,bytes13[1],bool))[],bool[2],address,string)", + "type": "((bytes24,address,string,(bytes29,bytes13[1],bool))[],bool[2],address,string)", + "value": [ + [ + [ + "0x214e40176841805427e125f9d848135f52ecc65fcf216146", + "0x541688f4Ec74A3ddaa5cD03ba0E9B7cD5535BdA1", + "Moo é🚀ooMo🚀Mo Mé MééM🚀éo🚀é 🚀é éé oééé🚀🚀ooéM🚀🚀oo🚀éMoMo🚀Mo", + [ + "0xba8da3bff86e14975031ee08b2239ded1369a235c68a72cc994af2744f", + ["0x70a7214babec31160cd6f142a3"], + true + ] + ], + [ + "0x2ec77abf473eafa7c51a6c29387731344d244e9f27106e77", + "0xdA21D39868d5400854a0Cf90e2f58a1134b65570", + "Moo é🚀éMo MoMMéoo🚀", + [ + "0x14f2ffd9c86a273ad6f05ac06a35be0461c6d947561ee0b932cd2f450e", + ["0xe29085cfdc5909453f30c6900f"], + true + ] + ] + ], + [true, true], + "0xcb09b29C2A189BfEE99e808Fa47391aDA083E515", + "Moo é🚀o🚀ooM oo ooéM" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x214e40176841805427e125f9d848135f52ecc65fcf216146" + }, + { + "type": "address", + "value": "0x541688f4Ec74A3ddaa5cD03ba0E9B7cD5535BdA1" + }, + { + "type": "string", + "value": "Moo é🚀ooMo🚀Mo Mé MééM🚀éo🚀é 🚀é éé oééé🚀🚀ooéM🚀🚀oo🚀éMoMo🚀Mo" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xba8da3bff86e14975031ee08b2239ded1369a235c68a72cc994af2744f" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x70a7214babec31160cd6f142a3" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2ec77abf473eafa7c51a6c29387731344d244e9f27106e77" + }, + { + "type": "address", + "value": "0xdA21D39868d5400854a0Cf90e2f58a1134b65570" + }, + { + "type": "string", + "value": "Moo é🚀éMo MoMMéoo🚀" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x14f2ffd9c86a273ad6f05ac06a35be0461c6d947561ee0b932cd2f450e" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe29085cfdc5909453f30c6900f" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xcb09b29C2A189BfEE99e808Fa47391aDA083E515" + }, + { + "type": "string", + "value": "Moo é🚀o🚀ooM oo ooéM" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061061c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610422565b60405180910390f35b6100566102ec565b61005e6102ec565b60408051600280825260608201909252600091816020015b61007e61031a565b81526020019060019003908161007657905050905061009b61031a565b7f214e40176841805427e125f9d848135f52ecc65fcf2161460000000000000000815273541688f4ec74a3ddaa5cd03ba0e9b7cd5535bda16020808301919091526040805160a08101909152606780825260009261058090830139604083015250610104610346565b7fba8da3bff86e14975031ee08b2239ded1369a235c68a72cc994af2744f000000815261012f61036e565b6c70a7214babec31160cd6f142a360981b8152602082015260016040820152606082015281518190839060009061016857610168610569565b60200260200101819052505061017c61031a565b7f2ec77abf473eafa7c51a6c29387731344d244e9f27106e770000000000000000815273da21d39868d5400854a0cf90e2f58a1134b65570602080830191909152604080518082018252601b81527f4d6f6f20c3a9f09f9a80c3a94d6f204d6f4d4dc3a96f6ff09f9a800000000000928101929092528201526101fd610346565b7f14f2ffd9c86a273ad6f05ac06a35be0461c6d947561ee0b932cd2f450e000000815261022861036e565b6ce29085cfdc5909453f30c6900f60981b815260208201526001604082018190526060830191909152825182918491811061026557610265610569565b602090810291909101015250815261027b61038c565b60018082526020808301919091528281019190915273cb09b29c2a189bfee99e808fa47391ada083e5156040808401919091528051808201909152601b81527f4d6f6f20c3a9f09f9a806ff09f9a806f6f4d206f6f206f6fc3a94d0000000000918101919091526060820152919050565b60405180608001604052806060815260200161030661038c565b815260006020820152606060409091015290565b60408051608081018252600080825260208201526060918101829052908101610341610346565b905290565b6040805160608101909152600081526020810161036161036e565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156103d0576020818501810151868301820152016103b4565b818111156103e2576000602083870101525b50601f01601f19169290920160200192915050565b8060005b600281101561041c57815115158452602093840193909101906001016103fb565b50505050565b6000602080835260c0808401855160a0808588015282825180855260e08901915060e08160051b8a0101945086840193506000805b82811015610515578a870360df190184528551805167ffffffffffffffff19168852898101516001600160a01b03168a890152604080820151818a018b90526104a28b8b01826103aa565b9050606080840151935062ffffff19845116818c0152508b83015160808b01865b60018110156104f657825172ffffffffffffffffffffffffffffffffffffff19168252918e0191908e01906001016104c3565b5050509101511515978601979097529488019492880192600101610457565b50505050938701519361052b60408801866103f7565b60408801516001600160a01b031660808801526060880151878403601f190191880191909152935061055f905081846103aa565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6f4d6ff09f9a804d6f204dc3a9204dc3a9c3a94df09f9a80c3a96ff09f9a80c3a920f09f9a80c3a920c3a9c3a9206fc3a9c3a9c3a9f09f9a80f09f9a806f6fc3a94df09f9a80f09f9a806f6ff09f9a80c3a94d6f4d6ff09f9a804d6fa2646970667358221220f353ec4ada11420496c6823b81ffa26715885365525f897b5e968b658e688b7f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_cbd148e4 {\n bytes29 s_0;\n bytes13[1] s_1;\n bool s_2;\n }\n\n struct S_2bd05fea {\n bytes24 s_0;\n address s_1;\n string s_2;\n S_cbd148e4 s_3;\n }\n\n struct S_fe604db3 {\n S_2bd05fea[] s_0;\n bool[2] s_1;\n address s_2;\n string s_3;\n }\n\n function test () public pure returns (S_fe604db3 memory) {\n S_fe604db3 memory r;\n {\n S_2bd05fea[] memory r_0 = new S_2bd05fea[](2);\n {\n S_2bd05fea memory r_0_0;\n {\n bytes24 r_0_0_0 = bytes24(0x214e40176841805427e125f9d848135f52ecc65fcf216146);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x541688f4Ec74A3ddaa5cD03ba0E9B7cD5535BdA1;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀ooMo🚀Mo Mé MééM🚀éo🚀é 🚀é éé oééé🚀🚀ooéM🚀🚀oo🚀éMoMo🚀Mo\";\n r_0_0.s_2 = r_0_0_2;\n }\n {\n S_cbd148e4 memory r_0_0_3;\n {\n bytes29 r_0_0_3_0 = bytes29(0xba8da3bff86e14975031ee08b2239ded1369a235c68a72cc994af2744f);\n r_0_0_3.s_0 = r_0_0_3_0;\n }\n {\n bytes13[1] memory r_0_0_3_1;\n {\n bytes13 r_0_0_3_1_0 = bytes13(0x70a7214babec31160cd6f142a3);\n r_0_0_3_1[0] = r_0_0_3_1_0;\n }\n r_0_0_3.s_1 = r_0_0_3_1;\n }\n {\n bool r_0_0_3_2 = true;\n r_0_0_3.s_2 = r_0_0_3_2;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n S_2bd05fea memory r_0_1;\n {\n bytes24 r_0_1_0 = bytes24(0x2ec77abf473eafa7c51a6c29387731344d244e9f27106e77);\n r_0_1.s_0 = r_0_1_0;\n }\n {\n address r_0_1_1 = 0xdA21D39868d5400854a0Cf90e2f58a1134b65570;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n string memory r_0_1_2 = unicode\"Moo é🚀éMo MoMMéoo🚀\";\n r_0_1.s_2 = r_0_1_2;\n }\n {\n S_cbd148e4 memory r_0_1_3;\n {\n bytes29 r_0_1_3_0 = bytes29(0x14f2ffd9c86a273ad6f05ac06a35be0461c6d947561ee0b932cd2f450e);\n r_0_1_3.s_0 = r_0_1_3_0;\n }\n {\n bytes13[1] memory r_0_1_3_1;\n {\n bytes13 r_0_1_3_1_0 = bytes13(0xe29085cfdc5909453f30c6900f);\n r_0_1_3_1[0] = r_0_1_3_1_0;\n }\n r_0_1_3.s_1 = r_0_1_3_1;\n }\n {\n bool r_0_1_3_2 = true;\n r_0_1_3.s_2 = r_0_1_3_2;\n }\n r_0_1.s_3 = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n bool[2] memory r_1;\n {\n bool r_1_0 = true;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xcb09b29C2A189BfEE99e808Fa47391aDA083E515;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀o🚀ooM oo ooéM\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cb09b29c2a189bfee99e808fa47391ada083e51500000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0214e40176841805427e125f9d848135f52ecc65fcf2161460000000000000000000000000000000000000000541688f4ec74a3ddaa5cd03ba0e9b7cd5535bda100000000000000000000000000000000000000000000000000000000000000c0ba8da3bff86e14975031ee08b2239ded1369a235c68a72cc994af2744f00000070a7214babec31160cd6f142a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a806f6f4d6ff09f9a804d6f204dc3a9204dc3a9c3a94df09f9a80c3a96ff09f9a80c3a920f09f9a80c3a920c3a9c3a9206fc3a9c3a9c3a9f09f9a80f09f9a806f6fc3a94df09f9a80f09f9a806f6ff09f9a80c3a94d6f4d6ff09f9a804d6f000000000000000000000000000000000000000000000000002ec77abf473eafa7c51a6c29387731344d244e9f27106e770000000000000000000000000000000000000000da21d39868d5400854a0cf90e2f58a1134b6557000000000000000000000000000000000000000000000000000000000000000c014f2ffd9c86a273ad6f05ac06a35be0461c6d947561ee0b932cd2f450e000000e29085cfdc5909453f30c6900f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80c3a94d6f204d6f4d4dc3a96f6ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a806ff09f9a806f6f4d206f6f206f6fc3a94d0000000000" + }, + { + "name": "random-((string,string,(string,string[4],uint240,(bytes23[4],address,bool))[4],string))", + "type": "((string,string,(string,string[4],uint240,(bytes23[4],address,bool))[4],string))", + "value": [ + [ + "Moo é🚀", + "Moo é🚀", + [ + [ + "Moo é🚀🚀🚀 M M MM", + [ + "Moo é🚀éo🚀oo", + "Moo é🚀", + "Moo é🚀", + "Moo é🚀🚀ooéo oo🚀éoooM oMé oéM🚀oéMM🚀éo MMo" + ], + "814555359560293370236521225424701320641954613471591701308136790196232147", + [ + [ + "0x5d274cab679a51d6f22b007203d3f750bb505bdd3759aa", + "0xb08a8af5567c186a6ec356931f2036aa89feb52a65105d", + "0xef4ade4a31877dff310e10940018bcbdab087974a68248", + "0x9da0fe95f6b6c490169e4c8f807cde7b6fe9b40044f7f6" + ], + "0xF3D04A21F31301b645368Ce384902B424809893e", + false + ] + ], + [ + "Moo é🚀é🚀MMoMéM🚀Méoo oé🚀", + [ + "Moo é🚀 🚀o oMMo🚀M🚀oMo", + "Moo é🚀oé Méooé Moooo", + "Moo é🚀", + "Moo é🚀🚀M ooMM ooo ooé oéoo 🚀🚀ooMoé o M éoéMo oM🚀 oM MM" + ], + "346385063941645945282457815996977493452354320534099363377869401412073583", + [ + [ + "0xfc5e74404010f8903edab82b49409999c35e6ff62d53cb", + "0xd37de0df3816b917efd729ccc3c8f5b1da18c3958f8d41", + "0x43f932d79874efbf020aa84e213da3cf19742a90cc4110", + "0x70befe6ad18367c896eb28f8e4caf984180fc5a2bfd318" + ], + "0x267A836e29bDD4eA91a0CDeE9EDbf4d7804741C9", + false + ] + ], + [ + "Moo é🚀é ooM🚀 o ooo", + [ + "Moo é🚀é ééM o🚀🚀🚀oo o 🚀MM éoooM🚀M 🚀oéM", + "Moo é🚀éo🚀Mé🚀o🚀o ooé 🚀o o🚀🚀éoo oo🚀🚀 o🚀oMéooMMMo🚀ooé", + "Moo é🚀o🚀Moé🚀o🚀🚀oMMM🚀 🚀oéM oMooMo é 🚀éoMoMo 🚀Moo🚀", + "Moo é🚀 MM🚀o 🚀MoM🚀 Mo MM🚀o 🚀 M🚀MééMMoMMéoM🚀🚀ooM🚀o🚀oéo🚀🚀🚀o" + ], + "1076127099185097150400809704391287104521004738381718839603410431127243423", + [ + [ + "0xc0384e369d7dfd273e9da946659fd2aa163b9ecce74955", + "0x4a39861df0ddec319864892758bc13fee283ba1faf8c75", + "0x88f32d892e131337d8de4e5d849b8a6164c1ef748ca76f", + "0xd45043712b12a88e62d4e68e8a59a85c1c68a7847fc592" + ], + "0x6B92469260C298382f6e633592C6aAAf32017efD", + true + ] + ], + [ + "Moo é🚀🚀🚀M M🚀M🚀M MoMéMMMéo ooé ", + [ + "Moo é🚀M", + "Moo é🚀ooéMoMéMéo oo oé🚀o 🚀é 🚀éooMéo🚀", + "Moo é🚀ééoMoMéooMM🚀MMo🚀🚀oooMo🚀é🚀🚀🚀ooMooooéé🚀oMM", + "Moo é🚀oooMoMoé🚀o🚀ooooéooéo M🚀oM🚀éMoéo" + ], + "1462292077611571137616390930009237249294300296751303391901834163604575340", + [ + [ + "0xdccab3adddc84fdc7d825fa4d5ff6714778c53d2ca78ef", + "0x56cd63c707a9f8b589bd1e6ea5a8776ad61f7fcdd3da96", + "0x57f91d76789de0566b87f4d2f74adeffc844556269e0dc", + "0xb7632920be17aa18e97efaad7c8ed8b725fba6528e6a5b" + ], + "0xe90063B8685f5cB23832430a70453179e5E2f46f", + false + ] + ] + ], + "Moo é🚀M MM🚀oé🚀o🚀oé🚀🚀 é🚀ooMoMééoooo🚀 ooo " + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀 M M MM" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éo🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀ooéo oo🚀éoooM oMé oéM🚀oéMM🚀éo MMo" + } + ] + }, + { + "type": "number", + "value": "814555359560293370236521225424701320641954613471591701308136790196232147" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5d274cab679a51d6f22b007203d3f750bb505bdd3759aa" + }, + { + "type": "hexstring", + "value": "0xb08a8af5567c186a6ec356931f2036aa89feb52a65105d" + }, + { + "type": "hexstring", + "value": "0xef4ade4a31877dff310e10940018bcbdab087974a68248" + }, + { + "type": "hexstring", + "value": "0x9da0fe95f6b6c490169e4c8f807cde7b6fe9b40044f7f6" + } + ] + }, + { + "type": "address", + "value": "0xF3D04A21F31301b645368Ce384902B424809893e" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀MMoMéM🚀Méoo oé🚀" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀o oMMo🚀M🚀oMo" + }, + { + "type": "string", + "value": "Moo é🚀oé Méooé Moooo" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀M ooMM ooo ooé oéoo 🚀🚀ooMoé o M éoéMo oM🚀 oM MM" + } + ] + }, + { + "type": "number", + "value": "346385063941645945282457815996977493452354320534099363377869401412073583" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfc5e74404010f8903edab82b49409999c35e6ff62d53cb" + }, + { + "type": "hexstring", + "value": "0xd37de0df3816b917efd729ccc3c8f5b1da18c3958f8d41" + }, + { + "type": "hexstring", + "value": "0x43f932d79874efbf020aa84e213da3cf19742a90cc4110" + }, + { + "type": "hexstring", + "value": "0x70befe6ad18367c896eb28f8e4caf984180fc5a2bfd318" + } + ] + }, + { + "type": "address", + "value": "0x267A836e29bDD4eA91a0CDeE9EDbf4d7804741C9" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é ooM🚀 o ooo" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é ééM o🚀🚀🚀oo o 🚀MM éoooM🚀M 🚀oéM" + }, + { + "type": "string", + "value": "Moo é🚀éo🚀Mé🚀o🚀o ooé 🚀o o🚀🚀éoo oo🚀🚀 o🚀oMéooMMMo🚀ooé" + }, + { + "type": "string", + "value": "Moo é🚀o🚀Moé🚀o🚀🚀oMMM🚀 🚀oéM oMooMo é 🚀éoMoMo 🚀Moo🚀" + }, + { + "type": "string", + "value": "Moo é🚀 MM🚀o 🚀MoM🚀 Mo MM🚀o 🚀 M🚀MééMMoMMéoM🚀🚀ooM🚀o🚀oéo🚀🚀🚀o" + } + ] + }, + { + "type": "number", + "value": "1076127099185097150400809704391287104521004738381718839603410431127243423" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc0384e369d7dfd273e9da946659fd2aa163b9ecce74955" + }, + { + "type": "hexstring", + "value": "0x4a39861df0ddec319864892758bc13fee283ba1faf8c75" + }, + { + "type": "hexstring", + "value": "0x88f32d892e131337d8de4e5d849b8a6164c1ef748ca76f" + }, + { + "type": "hexstring", + "value": "0xd45043712b12a88e62d4e68e8a59a85c1c68a7847fc592" + } + ] + }, + { + "type": "address", + "value": "0x6B92469260C298382f6e633592C6aAAf32017efD" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀M M🚀M🚀M MoMéMMMéo ooé " + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M" + }, + { + "type": "string", + "value": "Moo é🚀ooéMoMéMéo oo oé🚀o 🚀é 🚀éooMéo🚀" + }, + { + "type": "string", + "value": "Moo é🚀ééoMoMéooMM🚀MMo🚀🚀oooMo🚀é🚀🚀🚀ooMooooéé🚀oMM" + }, + { + "type": "string", + "value": "Moo é🚀oooMoMoé🚀o🚀ooooéooéo M🚀oM🚀éMoéo" + } + ] + }, + { + "type": "number", + "value": "1462292077611571137616390930009237249294300296751303391901834163604575340" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdccab3adddc84fdc7d825fa4d5ff6714778c53d2ca78ef" + }, + { + "type": "hexstring", + "value": "0x56cd63c707a9f8b589bd1e6ea5a8776ad61f7fcdd3da96" + }, + { + "type": "hexstring", + "value": "0x57f91d76789de0566b87f4d2f74adeffc844556269e0dc" + }, + { + "type": "hexstring", + "value": "0xb7632920be17aa18e97efaad7c8ed8b725fba6528e6a5b" + } + ] + }, + { + "type": "address", + "value": "0xe90063B8685f5cB23832430a70453179e5E2f46f" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M MM🚀oé🚀o🚀oé🚀🚀 é🚀ooMoMééoooo🚀 ooo " + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610eb5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906109ce565b60405180910390f35b61005661081f565b61005e61081f565b610066610837565b604080518082018252600a808252689adede418753e13f3560b71b60208084018290529285528351808501909452908352828201528201526100a6610865565b6100ae610892565b60408051808201909152601b81527f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80204d2020204d204d4d0000000000602082015281526100ec6108c0565b60408051808201825260138152724d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f60681b60208083019190915290835281518083018352600a808252689adede418753e13f3560b71b82840181905285840192909252835180850185529081528083019190915283830152815160608101909252603f80835260009291610e419083013960608301525060208201527d7605899970bcf5af3b095ab35b301ac91d797b89bed5f5d2c90cc1141fd360408201526101a76108e7565b6101af61090e565b7f5d274cab679a51d6f22b007203d3f750bb505bdd3759aa00000000000000000081527fb08a8af5567c186a6ec356931f2036aa89feb52a65105d0000000000000000006020808301919091527fef4ade4a31877dff310e10940018bcbdab087974a682480000000000000000006040808401919091527f9da0fe95f6b6c490169e4c8f807cde7b6fe9b40044f7f600000000000000000060608085019190915292845273f3d04a21f31301b645368ce384902b424809893e918401919091526000908301528201528152610282610892565b6000604051806060016040528060288152602001610c27602891398252506102a86108c0565b6000604051806060016040528060218152602001610b1660219139825250604080518082018252601b81527f4d6f6f20c3a9f09f9a806fc3a9204dc3a96f6fc3a9204d6f6f6f6f00000000006020808301919091528084019190915281518083018352600a8152689adede418753e13f3560b71b8183015282840152815160808101909252604d80835260009291610d869083013960608301525060208201527d323022d73d2d5799c913482cbcdde37710b2325ad9ad1f251a2fbb53f86f60408201526103746108e7565b61037c61090e565b7ffc5e74404010f8903edab82b49409999c35e6ff62d53cb00000000000000000081527fd37de0df3816b917efd729ccc3c8f5b1da18c3958f8d410000000000000000006020808301919091527f43f932d79874efbf020aa84e213da3cf19742a90cc41100000000000000000006040808401919091527f70befe6ad18367c896eb28f8e4caf984180fc5a2bfd31800000000000000000060608085019190915292845273267a836e29bdd4ea91a0cdee9edbf4d7804741c98483015260009084015290830191909152820152610451610892565b60408051808201909152601a81527f4d6f6f20c3a9f09f9a80c3a9206f6f4df09f9a80206f206f6f6f0000000000006020820152815261048f6108c0565b6000604051806080016040528060438152602001610d43604391398252506040805160808101909152605a80825260009190610bcd60208301399050808260016020020181905250506000604051806080016040528060538152602001610cf060539139604080840191909152805160a08101909152606780825260009250610c89602083013960608301525060208201527d9bebc5c5faecd83c5f8ec8026b28f02b129047613972e96b66977b96ca9f604082015261054d6108e7565b61055561090e565b7fc0384e369d7dfd273e9da946659fd2aa163b9ecce7495500000000000000000081527f4a39861df0ddec319864892758bc13fee283ba1faf8c750000000000000000006020808301919091527f88f32d892e131337d8de4e5d849b8a6164c1ef748ca76f0000000000000000006040808401919091527fd45043712b12a88e62d4e68e8a59a85c1c68a7847fc592000000000000000000606080850191909152928452736b92469260c298382f6e633592c6aaaf32017efd918401919091526001838201529083019190915282015261062d610892565b6000604051806060016040528060328152602001610dd3603291398252506106536108c0565b604080518082018252600b81526a4d6f6f20c3a9f09f9a804d60a81b602080830191909152908352815160608101909252603c80835260009291610e05908301399050808260016020020181905250506000604051806080016040528060508152602001610b3760509139604080840191909152805160608101909152603a80825260009250610c4f602083013960608301525060208201527dd3df6d7caf36359fd13ac03ecfeb8238b04a87910e56859b8d928012546c60408201526107186108e7565b61072061090e565b7fdccab3adddc84fdc7d825fa4d5ff6714778c53d2ca78ef00000000000000000081527f56cd63c707a9f8b589bd1e6ea5a8776ad61f7fcdd3da960000000000000000006020808301919091527f57f91d76789de0566b87f4d2f74adeffc844556269e0dc0000000000000000006040808401919091527fb7632920be17aa18e97efaad7c8ed8b725fba6528e6a5b00000000000000000060608085019190915292845273e90063b8685f5cb23832430a70453179e5e2f46f8483015260008482018190528584019490945291850193909352848101939093528251608081019093526046808452909291610b87908301396060830152508152919050565b6040518060200160405280610832610837565b905290565b60405180608001604052806060815260200160608152602001610858610865565b8152602001606081525090565b60405180608001604052806004905b61087c610892565b8152602001906001900390816108745790505090565b6040518060800160405280606081526020016108ac6108c0565b8152600060208201526040016108326108e7565b60405180608001604052806004905b60608152602001906001900390816108cf5790505090565b60405180606001604052806108fa61090e565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b8181101561095257602081850181015186830182015201610936565b81811115610964576000602083870101525b50601f01601f19169290920160200192915050565b80518260005b60048110156109aa57825168ffffffffffffffffff191682526020928301929091019060010161097f565b50505060208101516001600160a01b0316608083015260400151151560a090910152565b60006020808352835181828501528051608060408601526109f260c086018261092c565b905082820151603f196060818885030181890152610a10848461092c565b93506040850151925081888503016080890152838490506080850160005b6004808210610a3d5750610aeb565b878303845286516101208151818652610a588287018261092c565b9150508b8201518582038d870152818290506080830160005b86811015610aa0578482038352610a8982855161092c565b91508f840193508f83019250600181019050610a71565b5060408501519550610abd60408901876001600160f01b03169052565b898501519550610acf8a890187610979565b9a8e019a978e0197965050506001939093019250610a2e915050565b50828701519750838a82030160a08b0152610b06818961092c565b9b9a505050505050505050505056fe4d6f6f20c3a9f09f9a8020f09f9a806f206f4d4d6ff09f9a804df09f9a806f4d6f4d6f6f20c3a9f09f9a80c3a9c3a96f4d6f4dc3a96f6f4d4df09f9a804d4d6ff09f9a80f09f9a806f6f6f4d6ff09f9a80c3a9f09f9a80f09f9a80f09f9a806f6f4d6f6f6f6fc3a9c3a9f09f9a806f4d4d4d6f6f20c3a9f09f9a804d204d4df09f9a806fc3a9f09f9a806ff09f9a806fc3a9f09f9a80f09f9a8020c3a9f09f9a806f6f4d6f4dc3a9c3a96f6f6f6ff09f9a80206f6f6f204d6f6f20c3a9f09f9a80c3a96ff09f9a804dc3a9f09f9a806ff09f9a806f206f6fc3a920f09f9a806f206ff09f9a80f09f9a80c3a96f6f206f6ff09f9a80f09f9a80206ff09f9a806f4dc3a96f6f4d4d4d6ff09f9a806f6fc3a94d6f6f20c3a9f09f9a80c3a9f09f9a804d4d6f4dc3a94df09f9a804dc3a96f6f206fc3a9f09f9a804d6f6f20c3a9f09f9a806f6f6f4d6f4d6fc3a9f09f9a806ff09f9a806f6f6f6fc3a96f6fc3a96f204df09f9a806f4df09f9a80c3a94d6fc3a96f4d6f6f20c3a9f09f9a80204d4df09f9a806f20f09f9a804d6f4df09f9a80204d6f204d4df09f9a806f20f09f9a80204df09f9a804dc3a9c3a94d4d6f4d4dc3a96f4df09f9a80f09f9a806f6f4df09f9a806ff09f9a806fc3a96ff09f9a80f09f9a80f09f9a806f4d6f6f20c3a9f09f9a806ff09f9a804d6fc3a9f09f9a806ff09f9a80f09f9a806f4d4d4df09f9a8020f09f9a806fc3a94d206f4d6f6f4d6f20c3a920f09f9a80c3a96f4d6f4d6f20f09f9a804d6f6ff09f9a804d6f6f20c3a9f09f9a80c3a92020c3a9c3a94d206ff09f9a80f09f9a80f09f9a806f6f206f2020f09f9a804d4d2020c3a96f6f6f4df09f9a804d20f09f9a806fc3a94d4d6f6f20c3a9f09f9a80f09f9a804d206f6f4d4d206f6f6f206f6fc3a9206fc3a96f6f20f09f9a80f09f9a806f6f4d6fc3a920206f20204d20c3a96fc3a94d6f206f4df09f9a80206f4d204d4d4d6f6f20c3a9f09f9a80f09f9a80f09f9a804d204df09f9a804df09f9a804d20204d6f4dc3a94d4d4dc3a96f206f6fc3a9204d6f6f20c3a9f09f9a806f6fc3a94d6f4dc3a94dc3a96f20206f6f206fc3a9f09f9a806f20f09f9a80c3a920f09f9a80c3a96f6f4dc3a96ff09f9a804d6f6f20c3a9f09f9a80f09f9a806f6fc3a96f20206f6ff09f9a80c3a96f6f6f4d206f4dc3a9206fc3a94df09f9a806fc3a94d4df09f9a80c3a96f204d4d6fa2646970667358221220c1d5585eef935ec5529100085ecf8800b26ff44cfc53da002bcad401d9ecb58a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6c4ab184 {\n bytes23[4] s_0;\n address s_1;\n bool s_2;\n }\n\n struct S_36facdd7 {\n string s_0;\n string[4] s_1;\n uint240 s_2;\n S_6c4ab184 s_3;\n }\n\n struct S_1d8604b7 {\n string s_0;\n string s_1;\n S_36facdd7[4] s_2;\n string s_3;\n }\n\n struct S_42d42b4b {\n S_1d8604b7 s_0;\n }\n\n function test () public pure returns (S_42d42b4b memory) {\n S_42d42b4b memory r;\n {\n S_1d8604b7 memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀\";\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀\";\n r_0.s_1 = r_0_1;\n }\n {\n S_36facdd7[4] memory r_0_2;\n {\n S_36facdd7 memory r_0_2_0;\n {\n string memory r_0_2_0_0 = unicode\"Moo é🚀🚀🚀 M M MM\";\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n string[4] memory r_0_2_0_1;\n {\n string memory r_0_2_0_1_0 = unicode\"Moo é🚀éo🚀oo\";\n r_0_2_0_1[0] = r_0_2_0_1_0;\n }\n {\n string memory r_0_2_0_1_1 = unicode\"Moo é🚀\";\n r_0_2_0_1[1] = r_0_2_0_1_1;\n }\n {\n string memory r_0_2_0_1_2 = unicode\"Moo é🚀\";\n r_0_2_0_1[2] = r_0_2_0_1_2;\n }\n {\n string memory r_0_2_0_1_3 = unicode\"Moo é🚀🚀ooéo oo🚀éoooM oMé oéM🚀oéMM🚀éo MMo\";\n r_0_2_0_1[3] = r_0_2_0_1_3;\n }\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n {\n uint240 r_0_2_0_2 = 814555359560293370236521225424701320641954613471591701308136790196232147;\n r_0_2_0.s_2 = r_0_2_0_2;\n }\n {\n S_6c4ab184 memory r_0_2_0_3;\n {\n bytes23[4] memory r_0_2_0_3_0;\n {\n bytes23 r_0_2_0_3_0_0 = bytes23(0x5d274cab679a51d6f22b007203d3f750bb505bdd3759aa);\n r_0_2_0_3_0[0] = r_0_2_0_3_0_0;\n }\n {\n bytes23 r_0_2_0_3_0_1 = bytes23(0xb08a8af5567c186a6ec356931f2036aa89feb52a65105d);\n r_0_2_0_3_0[1] = r_0_2_0_3_0_1;\n }\n {\n bytes23 r_0_2_0_3_0_2 = bytes23(0xef4ade4a31877dff310e10940018bcbdab087974a68248);\n r_0_2_0_3_0[2] = r_0_2_0_3_0_2;\n }\n {\n bytes23 r_0_2_0_3_0_3 = bytes23(0x9da0fe95f6b6c490169e4c8f807cde7b6fe9b40044f7f6);\n r_0_2_0_3_0[3] = r_0_2_0_3_0_3;\n }\n r_0_2_0_3.s_0 = r_0_2_0_3_0;\n }\n {\n address r_0_2_0_3_1 = 0xF3D04A21F31301b645368Ce384902B424809893e;\n r_0_2_0_3.s_1 = r_0_2_0_3_1;\n }\n {\n bool r_0_2_0_3_2 = false;\n r_0_2_0_3.s_2 = r_0_2_0_3_2;\n }\n r_0_2_0.s_3 = r_0_2_0_3;\n }\n r_0_2[0] = r_0_2_0;\n }\n {\n S_36facdd7 memory r_0_2_1;\n {\n string memory r_0_2_1_0 = unicode\"Moo é🚀é🚀MMoMéM🚀Méoo oé🚀\";\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n {\n string[4] memory r_0_2_1_1;\n {\n string memory r_0_2_1_1_0 = unicode\"Moo é🚀 🚀o oMMo🚀M🚀oMo\";\n r_0_2_1_1[0] = r_0_2_1_1_0;\n }\n {\n string memory r_0_2_1_1_1 = unicode\"Moo é🚀oé Méooé Moooo\";\n r_0_2_1_1[1] = r_0_2_1_1_1;\n }\n {\n string memory r_0_2_1_1_2 = unicode\"Moo é🚀\";\n r_0_2_1_1[2] = r_0_2_1_1_2;\n }\n {\n string memory r_0_2_1_1_3 = unicode\"Moo é🚀🚀M ooMM ooo ooé oéoo 🚀🚀ooMoé o M éoéMo oM🚀 oM MM\";\n r_0_2_1_1[3] = r_0_2_1_1_3;\n }\n r_0_2_1.s_1 = r_0_2_1_1;\n }\n {\n uint240 r_0_2_1_2 = 346385063941645945282457815996977493452354320534099363377869401412073583;\n r_0_2_1.s_2 = r_0_2_1_2;\n }\n {\n S_6c4ab184 memory r_0_2_1_3;\n {\n bytes23[4] memory r_0_2_1_3_0;\n {\n bytes23 r_0_2_1_3_0_0 = bytes23(0xfc5e74404010f8903edab82b49409999c35e6ff62d53cb);\n r_0_2_1_3_0[0] = r_0_2_1_3_0_0;\n }\n {\n bytes23 r_0_2_1_3_0_1 = bytes23(0xd37de0df3816b917efd729ccc3c8f5b1da18c3958f8d41);\n r_0_2_1_3_0[1] = r_0_2_1_3_0_1;\n }\n {\n bytes23 r_0_2_1_3_0_2 = bytes23(0x43f932d79874efbf020aa84e213da3cf19742a90cc4110);\n r_0_2_1_3_0[2] = r_0_2_1_3_0_2;\n }\n {\n bytes23 r_0_2_1_3_0_3 = bytes23(0x70befe6ad18367c896eb28f8e4caf984180fc5a2bfd318);\n r_0_2_1_3_0[3] = r_0_2_1_3_0_3;\n }\n r_0_2_1_3.s_0 = r_0_2_1_3_0;\n }\n {\n address r_0_2_1_3_1 = 0x267A836e29bDD4eA91a0CDeE9EDbf4d7804741C9;\n r_0_2_1_3.s_1 = r_0_2_1_3_1;\n }\n {\n bool r_0_2_1_3_2 = false;\n r_0_2_1_3.s_2 = r_0_2_1_3_2;\n }\n r_0_2_1.s_3 = r_0_2_1_3;\n }\n r_0_2[1] = r_0_2_1;\n }\n {\n S_36facdd7 memory r_0_2_2;\n {\n string memory r_0_2_2_0 = unicode\"Moo é🚀é ooM🚀 o ooo\";\n r_0_2_2.s_0 = r_0_2_2_0;\n }\n {\n string[4] memory r_0_2_2_1;\n {\n string memory r_0_2_2_1_0 = unicode\"Moo é🚀é ééM o🚀🚀🚀oo o 🚀MM éoooM🚀M 🚀oéM\";\n r_0_2_2_1[0] = r_0_2_2_1_0;\n }\n {\n string memory r_0_2_2_1_1 = unicode\"Moo é🚀éo🚀Mé🚀o🚀o ooé 🚀o o🚀🚀éoo oo🚀🚀 o🚀oMéooMMMo🚀ooé\";\n r_0_2_2_1[1] = r_0_2_2_1_1;\n }\n {\n string memory r_0_2_2_1_2 = unicode\"Moo é🚀o🚀Moé🚀o🚀🚀oMMM🚀 🚀oéM oMooMo é 🚀éoMoMo 🚀Moo🚀\";\n r_0_2_2_1[2] = r_0_2_2_1_2;\n }\n {\n string memory r_0_2_2_1_3 = unicode\"Moo é🚀 MM🚀o 🚀MoM🚀 Mo MM🚀o 🚀 M🚀MééMMoMMéoM🚀🚀ooM🚀o🚀oéo🚀🚀🚀o\";\n r_0_2_2_1[3] = r_0_2_2_1_3;\n }\n r_0_2_2.s_1 = r_0_2_2_1;\n }\n {\n uint240 r_0_2_2_2 = 1076127099185097150400809704391287104521004738381718839603410431127243423;\n r_0_2_2.s_2 = r_0_2_2_2;\n }\n {\n S_6c4ab184 memory r_0_2_2_3;\n {\n bytes23[4] memory r_0_2_2_3_0;\n {\n bytes23 r_0_2_2_3_0_0 = bytes23(0xc0384e369d7dfd273e9da946659fd2aa163b9ecce74955);\n r_0_2_2_3_0[0] = r_0_2_2_3_0_0;\n }\n {\n bytes23 r_0_2_2_3_0_1 = bytes23(0x4a39861df0ddec319864892758bc13fee283ba1faf8c75);\n r_0_2_2_3_0[1] = r_0_2_2_3_0_1;\n }\n {\n bytes23 r_0_2_2_3_0_2 = bytes23(0x88f32d892e131337d8de4e5d849b8a6164c1ef748ca76f);\n r_0_2_2_3_0[2] = r_0_2_2_3_0_2;\n }\n {\n bytes23 r_0_2_2_3_0_3 = bytes23(0xd45043712b12a88e62d4e68e8a59a85c1c68a7847fc592);\n r_0_2_2_3_0[3] = r_0_2_2_3_0_3;\n }\n r_0_2_2_3.s_0 = r_0_2_2_3_0;\n }\n {\n address r_0_2_2_3_1 = 0x6B92469260C298382f6e633592C6aAAf32017efD;\n r_0_2_2_3.s_1 = r_0_2_2_3_1;\n }\n {\n bool r_0_2_2_3_2 = true;\n r_0_2_2_3.s_2 = r_0_2_2_3_2;\n }\n r_0_2_2.s_3 = r_0_2_2_3;\n }\n r_0_2[2] = r_0_2_2;\n }\n {\n S_36facdd7 memory r_0_2_3;\n {\n string memory r_0_2_3_0 = unicode\"Moo é🚀🚀🚀M M🚀M🚀M MoMéMMMéo ooé \";\n r_0_2_3.s_0 = r_0_2_3_0;\n }\n {\n string[4] memory r_0_2_3_1;\n {\n string memory r_0_2_3_1_0 = unicode\"Moo é🚀M\";\n r_0_2_3_1[0] = r_0_2_3_1_0;\n }\n {\n string memory r_0_2_3_1_1 = unicode\"Moo é🚀ooéMoMéMéo oo oé🚀o 🚀é 🚀éooMéo🚀\";\n r_0_2_3_1[1] = r_0_2_3_1_1;\n }\n {\n string memory r_0_2_3_1_2 = unicode\"Moo é🚀ééoMoMéooMM🚀MMo🚀🚀oooMo🚀é🚀🚀🚀ooMooooéé🚀oMM\";\n r_0_2_3_1[2] = r_0_2_3_1_2;\n }\n {\n string memory r_0_2_3_1_3 = unicode\"Moo é🚀oooMoMoé🚀o🚀ooooéooéo M🚀oM🚀éMoéo\";\n r_0_2_3_1[3] = r_0_2_3_1_3;\n }\n r_0_2_3.s_1 = r_0_2_3_1;\n }\n {\n uint240 r_0_2_3_2 = 1462292077611571137616390930009237249294300296751303391901834163604575340;\n r_0_2_3.s_2 = r_0_2_3_2;\n }\n {\n S_6c4ab184 memory r_0_2_3_3;\n {\n bytes23[4] memory r_0_2_3_3_0;\n {\n bytes23 r_0_2_3_3_0_0 = bytes23(0xdccab3adddc84fdc7d825fa4d5ff6714778c53d2ca78ef);\n r_0_2_3_3_0[0] = r_0_2_3_3_0_0;\n }\n {\n bytes23 r_0_2_3_3_0_1 = bytes23(0x56cd63c707a9f8b589bd1e6ea5a8776ad61f7fcdd3da96);\n r_0_2_3_3_0[1] = r_0_2_3_3_0_1;\n }\n {\n bytes23 r_0_2_3_3_0_2 = bytes23(0x57f91d76789de0566b87f4d2f74adeffc844556269e0dc);\n r_0_2_3_3_0[2] = r_0_2_3_3_0_2;\n }\n {\n bytes23 r_0_2_3_3_0_3 = bytes23(0xb7632920be17aa18e97efaad7c8ed8b725fba6528e6a5b);\n r_0_2_3_3_0[3] = r_0_2_3_3_0_3;\n }\n r_0_2_3_3.s_0 = r_0_2_3_3_0;\n }\n {\n address r_0_2_3_3_1 = 0xe90063B8685f5cB23832430a70453179e5E2f46f;\n r_0_2_3_3.s_1 = r_0_2_3_3_1;\n }\n {\n bool r_0_2_3_3_2 = false;\n r_0_2_3_3.s_2 = r_0_2_3_3_2;\n }\n r_0_2_3.s_3 = r_0_2_3_3;\n }\n r_0_2[3] = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀M MM🚀oé🚀o🚀oé🚀🚀 é🚀ooMoMééoooo🚀 ooo \";\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f60000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000007605899970bcf5af3b095ab35b301ac91d797b89bed5f5d2c90cc1141fd35d274cab679a51d6f22b007203d3f750bb505bdd3759aa000000000000000000b08a8af5567c186a6ec356931f2036aa89feb52a65105d000000000000000000ef4ade4a31877dff310e10940018bcbdab087974a682480000000000000000009da0fe95f6b6c490169e4c8f807cde7b6fe9b40044f7f6000000000000000000000000000000000000000000f3d04a21f31301b645368ce384902b424809893e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80f09f9a80f09f9a80204d2020204d204d4d0000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80f09f9a806f6fc3a96f20206f6ff09f9a80c3a96f6f6f4d206f4dc3a9206fc3a94df09f9a806fc3a94d4df09f9a80c3a96f204d4d6f00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000323022d73d2d5799c913482cbcdde37710b2325ad9ad1f251a2fbb53f86ffc5e74404010f8903edab82b49409999c35e6ff62d53cb000000000000000000d37de0df3816b917efd729ccc3c8f5b1da18c3958f8d4100000000000000000043f932d79874efbf020aa84e213da3cf19742a90cc411000000000000000000070befe6ad18367c896eb28f8e4caf984180fc5a2bfd318000000000000000000000000000000000000000000267a836e29bdd4ea91a0cdee9edbf4d7804741c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a80c3a9f09f9a804d4d6f4dc3a94df09f9a804dc3a96f6f206fc3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a8020f09f9a806f206f4d4d6ff09f9a804df09f9a806f4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a806fc3a9204dc3a96f6fc3a9204d6f6f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80f09f9a804d206f6f4d4d206f6f6f206f6fc3a9206fc3a96f6f20f09f9a80f09f9a806f6f4d6fc3a920206f20204d20c3a96fc3a94d6f206f4df09f9a80206f4d204d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000009bebc5c5faecd83c5f8ec8026b28f02b129047613972e96b66977b96ca9fc0384e369d7dfd273e9da946659fd2aa163b9ecce749550000000000000000004a39861df0ddec319864892758bc13fee283ba1faf8c7500000000000000000088f32d892e131337d8de4e5d849b8a6164c1ef748ca76f000000000000000000d45043712b12a88e62d4e68e8a59a85c1c68a7847fc5920000000000000000000000000000000000000000006b92469260c298382f6e633592c6aaaf32017efd0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a80c3a9206f6f4df09f9a80206f206f6f6f000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80c3a92020c3a9c3a94d206ff09f9a80f09f9a80f09f9a806f6f206f2020f09f9a804d4d2020c3a96f6f6f4df09f9a804d20f09f9a806fc3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a80c3a96ff09f9a804dc3a9f09f9a806ff09f9a806f206f6fc3a920f09f9a806f206ff09f9a80f09f9a80c3a96f6f206f6ff09f9a80f09f9a80206ff09f9a806f4dc3a96f6f4d4d4d6ff09f9a806f6fc3a900000000000000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a806ff09f9a804d6fc3a9f09f9a806ff09f9a80f09f9a806f4d4d4df09f9a8020f09f9a806fc3a94d206f4d6f6f4d6f20c3a920f09f9a80c3a96f4d6f4d6f20f09f9a804d6f6ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a80204d4df09f9a806f20f09f9a804d6f4df09f9a80204d6f204d4df09f9a806f20f09f9a80204df09f9a804dc3a9c3a94d4d6f4d4dc3a96f4df09f9a80f09f9a806f6f4df09f9a806ff09f9a806fc3a96ff09f9a80f09f9a80f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000d3df6d7caf36359fd13ac03ecfeb8238b04a87910e56859b8d928012546cdccab3adddc84fdc7d825fa4d5ff6714778c53d2ca78ef00000000000000000056cd63c707a9f8b589bd1e6ea5a8776ad61f7fcdd3da9600000000000000000057f91d76789de0566b87f4d2f74adeffc844556269e0dc000000000000000000b7632920be17aa18e97efaad7c8ed8b725fba6528e6a5b000000000000000000000000000000000000000000e90063b8685f5cb23832430a70453179e5e2f46f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80f09f9a80f09f9a804d204df09f9a804df09f9a804d20204d6f4dc3a94d4d4dc3a96f206f6fc3a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806f6fc3a94d6f4dc3a94dc3a96f20206f6f206fc3a9f09f9a806f20f09f9a80c3a920f09f9a80c3a96f6f4dc3a96ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80c3a9c3a96f4d6f4dc3a96f6f4d4df09f9a804d4d6ff09f9a80f09f9a806f6f6f4d6ff09f9a80c3a9f09f9a80f09f9a80f09f9a806f6f4d6f6f6f6fc3a9c3a9f09f9a806f4d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a806f6f6f4d6f4d6fc3a9f09f9a806ff09f9a806f6f6f6fc3a96f6fc3a96f204df09f9a806f4df09f9a80c3a94d6fc3a96f00000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a804d204d4df09f9a806fc3a9f09f9a806ff09f9a806fc3a9f09f9a80f09f9a8020c3a9f09f9a806f6f4d6f4dc3a9c3a96f6f6f6ff09f9a80206f6f6f200000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((uint160,(address,(address,address,bytes8,bytes5),bytes22),uint80,string,bool),address,bool)", + "type": "((uint160,(address,(address,address,bytes8,bytes5),bytes22),uint80,string,bool),address,bool)", + "value": [ + [ + "1108344027074318021382528324955331044833989235307", + [ + "0x2871982D7de5e775b53042AD25d9Fa4626eFd421", + [ + "0x11F18303E418eD2c5BbAa8D5FbcC70eDc9e8391f", + "0x913da9E88C191A531eCFC336D63d084b950850BB", + "0x12ca3ad0eef370bd", + "0x0d7c4ed0d9" + ], + "0xed9166803d7d8d9696f219de5c0e212b866bcb6c440e" + ], + "674165427558529062447527", + "Moo é🚀ooééé🚀oo🚀é oo🚀🚀ooééM éoMoM 🚀", + true + ], + "0xA85c775e5F79B0fDD83D1C36100B86592F6049A2", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1108344027074318021382528324955331044833989235307" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2871982D7de5e775b53042AD25d9Fa4626eFd421" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x11F18303E418eD2c5BbAa8D5FbcC70eDc9e8391f" + }, + { + "type": "address", + "value": "0x913da9E88C191A531eCFC336D63d084b950850BB" + }, + { + "type": "hexstring", + "value": "0x12ca3ad0eef370bd" + }, + { + "type": "hexstring", + "value": "0x0d7c4ed0d9" + } + ] + }, + { + "type": "hexstring", + "value": "0xed9166803d7d8d9696f219de5c0e212b866bcb6c440e" + } + ] + }, + { + "type": "number", + "value": "674165427558529062447527" + }, + { + "type": "string", + "value": "Moo é🚀ooééé🚀oo🚀é oo🚀🚀ooééM éoMoM 🚀" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xA85c775e5F79B0fDD83D1C36100B86592F6049A2" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061040e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610297565b60405180910390f35b6100566101be565b61005e6101be565b6100666101e5565b73c223dd747bd4a230bf009afe3ac133e67b34126b81526100bf60408051606080820183526000808352835160808101855281815260208181018390529481018290529182015290918201908152600060209091015290565b732871982d7de5e775b53042ad25d9fa4626efd4218152604080516080810182527311f18303e418ed2c5bbaa8d5fbcc70edc9e8391f815273913da9e88c191a531ecfc336d63d084b950850bb6020808301919091526712ca3ad0eef370bd60c01b82840152640d7c4ed0d960d81b606080840191909152818501929092527576c8b3401ebec6cb4b790cef2e071095c335e5b6220760511b8385015284810193909352698ec294c042f68a28a9a7848301528151908101909152603c80825260009261039d9083013960608301525060016080820152815273a85c775e5f79b0fdd83d1c36100b86592f6049a2602082015260006040820152919050565b60405180606001604052806101d16101e5565b815260006020820181905260409091015290565b6040805160a0810182526000808252825160608082018552828252845160808101865283815260208181018590528187018590529181018490528282015293810191909152909182019081526000602082018190526060604083018190529091015290565b6000815180845260005b8181101561027057602081850181015186830182015201610254565b81811115610282576000602083870101525b50601f01601f19169290920160200192915050565b60208082528251606083830181905281516001600160a01b039081166080860152828401518051821660a0870152808501518051831660c08801528086015190921660e08701526040808301516001600160c01b031916610100880152918301516001600160d81b03191661012087015281015169ffffffffffffffffffff1916610140808701919091529083015169ffffffffffffffffffff166101608601529082015161018085019190915260009291906103586101c086018261024a565b9050608082015191506103706101a086018315159052565b918501516001600160a01b0381166040860152916040860151801515606087015292509594505050505056fe4d6f6f20c3a9f09f9a806f6fc3a9c3a9c3a9f09f9a806f6ff09f9a80c3a9206f6ff09f9a80f09f9a806f6fc3a9c3a94d20c3a96f4d6f4d20f09f9a80a2646970667358221220969258ecdd2296cd95f45b33598f9dbd613d0dae0a2e2d14c9117864f1f1202b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c5a3bd4e {\n address s_0;\n address s_1;\n bytes8 s_2;\n bytes5 s_3;\n }\n\n struct S_a86894fb {\n address s_0;\n S_c5a3bd4e s_1;\n bytes22 s_2;\n }\n\n struct S_dd53e997 {\n uint160 s_0;\n S_a86894fb s_1;\n uint80 s_2;\n string s_3;\n bool s_4;\n }\n\n struct S_28337d72 {\n S_dd53e997 s_0;\n address s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_28337d72 memory) {\n S_28337d72 memory r;\n {\n S_dd53e997 memory r_0;\n {\n uint160 r_0_0 = 1108344027074318021382528324955331044833989235307;\n r_0.s_0 = r_0_0;\n }\n {\n S_a86894fb memory r_0_1;\n {\n address r_0_1_0 = 0x2871982D7de5e775b53042AD25d9Fa4626eFd421;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n S_c5a3bd4e memory r_0_1_1;\n {\n address r_0_1_1_0 = 0x11F18303E418eD2c5BbAa8D5FbcC70eDc9e8391f;\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n address r_0_1_1_1 = 0x913da9E88C191A531eCFC336D63d084b950850BB;\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n bytes8 r_0_1_1_2 = bytes8(0x12ca3ad0eef370bd);\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n {\n bytes5 r_0_1_1_3 = bytes5(0x0d7c4ed0d9);\n r_0_1_1.s_3 = r_0_1_1_3;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n bytes22 r_0_1_2 = bytes22(0xed9166803d7d8d9696f219de5c0e212b866bcb6c440e);\n r_0_1.s_2 = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n {\n uint80 r_0_2 = 674165427558529062447527;\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀ooééé🚀oo🚀é oo🚀🚀ooééM éoMoM 🚀\";\n r_0.s_3 = r_0_3;\n }\n {\n bool r_0_4 = true;\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xA85c775e5F79B0fDD83D1C36100B86592F6049A2;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a85c775e5f79b0fdd83d1c36100b86592f6049a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c223dd747bd4a230bf009afe3ac133e67b34126b0000000000000000000000002871982d7de5e775b53042ad25d9fa4626efd42100000000000000000000000011f18303e418ed2c5bbaa8d5fbcc70edc9e8391f000000000000000000000000913da9e88c191a531ecfc336d63d084b950850bb12ca3ad0eef370bd0000000000000000000000000000000000000000000000000d7c4ed0d9000000000000000000000000000000000000000000000000000000ed9166803d7d8d9696f219de5c0e212b866bcb6c440e00000000000000000000000000000000000000000000000000000000000000008ec294c042f68a28a9a700000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806f6fc3a9c3a9c3a9f09f9a806f6ff09f9a80c3a9206f6ff09f9a80f09f9a806f6fc3a9c3a94d20c3a96f4d6f4d20f09f9a8000000000" + }, + { + "name": "random-(address,(bytes12,address,(address[1],bool,bool,string,uint72))[1],address,bool)", + "type": "(address,(bytes12,address,(address[1],bool,bool,string,uint72))[1],address,bool)", + "value": [ + "0x69b30a6c6706462Bc33ACBDF9762d4aCAaeF5576", + [ + [ + "0x45ae17463d1966aa8fe1765a", + "0xCafD33a9D261a6c66aEFeF1Fd4aC479818b98F4b", + [ + ["0x6dd0b99ABE7389323C32043BEd669eADd07f0B73"], + true, + true, + "Moo é🚀🚀ooooMé éo o MoMoé MéoooéMoé🚀é🚀oM o é oé ooMo🚀🚀🚀oM🚀oo🚀ooM", + "234309153431590067133" + ] + ] + ], + "0xB5474f85e53691CaE6e298e2C990BCc8eb308963", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x69b30a6c6706462Bc33ACBDF9762d4aCAaeF5576" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x45ae17463d1966aa8fe1765a" + }, + { + "type": "address", + "value": "0xCafD33a9D261a6c66aEFeF1Fd4aC479818b98F4b" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6dd0b99ABE7389323C32043BEd669eADd07f0B73" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀ooooMé éo o MoMoé MéoooéMoé🚀é🚀oM o é oé ooMo🚀🚀🚀oM🚀oo🚀ooM" + }, + { + "type": "number", + "value": "234309153431590067133" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xB5474f85e53691CaE6e298e2C990BCc8eb308963" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061043c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610281565b60405180910390f35b61005661015a565b61005e61015a565b7369b30a6c6706462bc33acbdf9762d4acaaef5576815261007d610191565b6100856101be565b6b22d70ba31e8cb35547f0bb2d60a11b815273cafd33a9d261a6c66aefef1fd4ac479818b98f4b60208201526100b96101e2565b6100c1610216565b736dd0b99abe7389323c32043bed669eadd07f0b738152815260016020828101829052604080840192909252815160a081019092526064808352600092916103a390830139606083810191909152680cb3b1559f786cdbbd608084015260408481019390935292845250602084019290925273b5474f85e53691cae6e298e2c990bcc8eb30896391830191909152600090820152919050565b604051806080016040528060006001600160a01b0316815260200161017d610191565b815260006020820181905260409091015290565b60405180602001604052806001905b6101a86101be565b8152602001906001900390816101a05790505090565b60408051606081018252600080825260208201529081016101dd6101e2565b905290565b6040518060a001604052806101f5610216565b81526000602082018190526040820181905260608083015260809091015290565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b8181101561025a5760208185018101518683018201520161023e565b8181111561026c576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835260a080840160018060a01b038087511684870152838701516080604081818a01528485905060c08a0195506000805b60018082106102c65750610373565b8c8903609f19018452865180516001600160a01b0319168a528b81015189168c8b01528501516060868b01819052815185828d015b858210156103185782518d168152918f0191908501908f016102fb565b5050508c8201511515888c01528682015115158c8c015281015160c08b018c905291506103496101008b0183610234565b9087015168ffffffffffffffffff1660e09a909a01999099525094890194918901916001016102b7565b5050508901516001600160a01b031660608981019190915290980151151597909601969096529594505050505056fe4d6f6f20c3a9f09f9a80f09f9a806f6f6f6f4dc3a920c3a96f206f204d6f4d6fc3a9204dc3a96f6f6fc3a94d6fc3a9f09f9a80c3a9f09f9a806f4d206f20c3a9206fc3a9206f6f4d6ff09f9a80f09f9a80f09f9a806f4df09f9a806f6ff09f9a806f6f4da264697066735822122072ed6094e2264d4e685e91a8140521d528fb26c0b7b2f97e7d54f92021b6f38b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_284255b2 {\n address[1] s_0;\n bool s_1;\n bool s_2;\n string s_3;\n uint72 s_4;\n }\n\n struct S_40d18f69 {\n bytes12 s_0;\n address s_1;\n S_284255b2 s_2;\n }\n\n struct S_61e218ca {\n address s_0;\n S_40d18f69[1] s_1;\n address s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_61e218ca memory) {\n S_61e218ca memory r;\n {\n address r_0 = 0x69b30a6c6706462Bc33ACBDF9762d4aCAaeF5576;\n r.s_0 = r_0;\n }\n {\n S_40d18f69[1] memory r_1;\n {\n S_40d18f69 memory r_1_0;\n {\n bytes12 r_1_0_0 = bytes12(0x45ae17463d1966aa8fe1765a);\n r_1_0.s_0 = r_1_0_0;\n }\n {\n address r_1_0_1 = 0xCafD33a9D261a6c66aEFeF1Fd4aC479818b98F4b;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n S_284255b2 memory r_1_0_2;\n {\n address[1] memory r_1_0_2_0;\n {\n address r_1_0_2_0_0 = 0x6dd0b99ABE7389323C32043BEd669eADd07f0B73;\n r_1_0_2_0[0] = r_1_0_2_0_0;\n }\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n bool r_1_0_2_1 = true;\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n {\n bool r_1_0_2_2 = true;\n r_1_0_2.s_2 = r_1_0_2_2;\n }\n {\n string memory r_1_0_2_3 = unicode\"Moo é🚀🚀ooooMé éo o MoMoé MéoooéMoé🚀é🚀oM o é oé ooMo🚀🚀🚀oM🚀oo🚀ooM\";\n r_1_0_2.s_3 = r_1_0_2_3;\n }\n {\n uint72 r_1_0_2_4 = 234309153431590067133;\n r_1_0_2.s_4 = r_1_0_2_4;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xB5474f85e53691CaE6e298e2C990BCc8eb308963;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000069b30a6c6706462bc33acbdf9762d4acaaef55760000000000000000000000000000000000000000000000000000000000000080000000000000000000000000b5474f85e53691cae6e298e2c990bcc8eb3089630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002045ae17463d1966aa8fe1765a0000000000000000000000000000000000000000000000000000000000000000cafd33a9d261a6c66aefef1fd4ac479818b98f4b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000006dd0b99abe7389323c32043bed669eadd07f0b730000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000cb3b1559f786cdbbd00000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a80f09f9a806f6f6f6f4dc3a920c3a96f206f204d6f4d6fc3a9204dc3a96f6f6fc3a94d6fc3a9f09f9a80c3a9f09f9a806f4d206f20c3a9206fc3a9206f6f4d6ff09f9a80f09f9a80f09f9a806f4df09f9a806f6ff09f9a806f6f4d00000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bool,((int152,bytes29,bool),int128[3],bytes27,int144),uint112,bytes20)[4]", + "type": "(address,bool,((int152,bytes29,bool),int128[3],bytes27,int144),uint112,bytes20)[4]", + "value": [ + [ + "0xfe257ec9A225197B5Ef581b39EdBa3C961834143", + true, + [ + [ + "-367487821529439856182634921119176115759882135", + "0x9114277f9adf59dcb919644bb0797e9fb6b545a1c15ae7ae5530811a27", + true + ], + [ + "-55354864036280381072930011386423358393", + "-129812591695521910456620563746077898552", + "158968403595070391923361597987926589550" + ], + "0x519a0a374ade9a831f749f6efb81e7b281aa204a9031a25c47a17f", + "-8435974179221311283253364389512900353606586" + ], + "1661188408825630500428136452681712", + "0x4fe2733a4825536f423022a5225dd4ffd1481b52" + ], + [ + "0xb303C4C33b1080c5B8bD12b0506639B33a52C397", + false, + [ + [ + "1334578797605152123681285783624101320913825750", + "0x3b269c4d8d0744d5207b79c085520632c9064c92888d93db4bd23cf21f", + false + ], + [ + "54681290603971129906076190089653205540", + "-168991046943715566013114202944361563725", + "47317863736967251917982592893322769889" + ], + "0x0ee5720d5e318dae6f1964b36c14d5aaae3df85f7f5eb7dc61865d", + "810330781926253792478935935734255240197179" + ], + "4893268753128527669151769062357040", + "0x8003884b8d09afb6528a29079f7a6fca7262be1d" + ], + [ + "0x1a65ae931C5f6594073633fE725E0d3b6fc6994E", + true, + [ + [ + "-1527110627501976758793339687597945559758308065", + "0x56b84ef4c000424fd4e4f2e6f5e2572cc0aa54d855162f968ab4f7698e", + true + ], + [ + "138747119980425229747649299506787878050", + "-57437622816927220753860359122631450222", + "168623085384907069677430265293169588721" + ], + "0xb6c8de0a1880347aadf721ad259f62f13b29d0def9763ecd255bbd", + "-4436776547332007995224717365652146709309011" + ], + "925887774854788713999338281311518", + "0x5fae3648f111f6819d271eec4ded1baa3acbd173" + ], + [ + "0x995823738767206Aa85A0FbC841DE67A41f7186D", + false, + [ + [ + "-195791953561049843804958689997054126997736977", + "0x885ebb053df90d7abe46b1bc3efc8933f9c93094f7c619702b14f7fa6f", + true + ], + [ + "97155587795711099786084553125234832491", + "-77712364435106515201446387809603554224", + "-116875471542183792885707106261620088159" + ], + "0xd57dd0a634810f8a2db7a527a7ebb2ad479ad34fda7acd4b49c82e", + "6338408759504293889521953865395729093937815" + ], + "884697815834412073480896793851062", + "0xa21ed9bfc65baba34473a1b72d380fd35e2d3609" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xfe257ec9A225197B5Ef581b39EdBa3C961834143" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-367487821529439856182634921119176115759882135" + }, + { + "type": "hexstring", + "value": "0x9114277f9adf59dcb919644bb0797e9fb6b545a1c15ae7ae5530811a27" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-55354864036280381072930011386423358393" + }, + { + "type": "number", + "value": "-129812591695521910456620563746077898552" + }, + { + "type": "number", + "value": "158968403595070391923361597987926589550" + } + ] + }, + { + "type": "hexstring", + "value": "0x519a0a374ade9a831f749f6efb81e7b281aa204a9031a25c47a17f" + }, + { + "type": "number", + "value": "-8435974179221311283253364389512900353606586" + } + ] + }, + { + "type": "number", + "value": "1661188408825630500428136452681712" + }, + { + "type": "hexstring", + "value": "0x4fe2733a4825536f423022a5225dd4ffd1481b52" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xb303C4C33b1080c5B8bD12b0506639B33a52C397" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1334578797605152123681285783624101320913825750" + }, + { + "type": "hexstring", + "value": "0x3b269c4d8d0744d5207b79c085520632c9064c92888d93db4bd23cf21f" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "54681290603971129906076190089653205540" + }, + { + "type": "number", + "value": "-168991046943715566013114202944361563725" + }, + { + "type": "number", + "value": "47317863736967251917982592893322769889" + } + ] + }, + { + "type": "hexstring", + "value": "0x0ee5720d5e318dae6f1964b36c14d5aaae3df85f7f5eb7dc61865d" + }, + { + "type": "number", + "value": "810330781926253792478935935734255240197179" + } + ] + }, + { + "type": "number", + "value": "4893268753128527669151769062357040" + }, + { + "type": "hexstring", + "value": "0x8003884b8d09afb6528a29079f7a6fca7262be1d" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1a65ae931C5f6594073633fE725E0d3b6fc6994E" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1527110627501976758793339687597945559758308065" + }, + { + "type": "hexstring", + "value": "0x56b84ef4c000424fd4e4f2e6f5e2572cc0aa54d855162f968ab4f7698e" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "138747119980425229747649299506787878050" + }, + { + "type": "number", + "value": "-57437622816927220753860359122631450222" + }, + { + "type": "number", + "value": "168623085384907069677430265293169588721" + } + ] + }, + { + "type": "hexstring", + "value": "0xb6c8de0a1880347aadf721ad259f62f13b29d0def9763ecd255bbd" + }, + { + "type": "number", + "value": "-4436776547332007995224717365652146709309011" + } + ] + }, + { + "type": "number", + "value": "925887774854788713999338281311518" + }, + { + "type": "hexstring", + "value": "0x5fae3648f111f6819d271eec4ded1baa3acbd173" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x995823738767206Aa85A0FbC841DE67A41f7186D" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-195791953561049843804958689997054126997736977" + }, + { + "type": "hexstring", + "value": "0x885ebb053df90d7abe46b1bc3efc8933f9c93094f7c619702b14f7fa6f" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "97155587795711099786084553125234832491" + }, + { + "type": "number", + "value": "-77712364435106515201446387809603554224" + }, + { + "type": "number", + "value": "-116875471542183792885707106261620088159" + } + ] + }, + { + "type": "hexstring", + "value": "0xd57dd0a634810f8a2db7a527a7ebb2ad479ad34fda7acd4b49c82e" + }, + { + "type": "number", + "value": "6338408759504293889521953865395729093937815" + } + ] + }, + { + "type": "number", + "value": "884697815834412073480896793851062" + }, + { + "type": "hexstring", + "value": "0xa21ed9bfc65baba34473a1b72d380fd35e2d3609" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610792806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061065b565b60405180910390f35b6100566105b0565b61005e6105b0565b6100666105dd565b73fe257ec9a225197b5ef581b39edba3c96183414381526001602082015261008c610610565b6040805160608101825272107a8da5401e38e55a544ac57f2f3042981f961981527f9114277f9adf59dcb919644bb0797e9fb6b545a1c15ae7ae5530811a27000000602082015260019181019190915281526100e661063d565b6f29a4f5826ec7f7b2b00745c5d51533b81981526f61a8fee98115e326710e345835557737196020808301919091526f7798336c2f4b40eb6f44d263cfc8406e604080840191909152908301919091527f519a0a374ade9a831f749f6efb81e7b281aa204a9031a25c47a17f0000000000828201527160d719982f19b0f05582b1010230665243b919606080840191909152908301919091526d51e7253d94105844f1d9b6976ff0908201527327f1399d2412a9b7a1181152912eea7fe8a40da960611b608082015281526101b96105dd565b73b303c4c33b1080c5b8bd12b0506639b33a52c3978152600060208201526101df610610565b60408051606081018252600091810191909152723bd83697e1351ce7500b147bd24a8ad4e7afd681527f3b269c4d8d0744d5207b79c085520632c9064c92888d93db4bd23cf21f0000006020820152815261023861063d565b6f29233bc678d6f4b3bf3b6e1dd6b73a2481526f7f227de442a018e304a67feb83cd864c196020808301919091526f239916cd21754441b8656e459467b5e1604080840191909152838201929092527f0ee5720d5e318dae6f1964b36c14d5aaae3df85f7f5eb7dc61865d00000000008383015271094d591fc6ecb7d322ad1b18f0c7dcbdb43b606080850191909152918401929092526df141bc149975422ea9c4afa5383090830152738003884b8d09afb6528a29079f7a6fca7262be1d60601b608083015282015261030a6105dd565b731a65ae931c5f6594073633fe725e0d3b6fc6994e815260016020820152610330610610565b6040805160608101825272447a5eca0dcdcc08834986ffff30ba38a682e01981527f56b84ef4c000424fd4e4f2e6f5e2572cc0aa54d855162f968ab4f7698e0000006020820152600191810191909152815261038a61063d565b6f6861b92aa21091149cf07309d5d984a281526f2b36157210cf9e0f2fad0cf1f95ade6d196020808301919091526f7edb9ffc7244eb15a407f3527e2179f1604080840191909152908301919091527fb6c8de0a1880347aadf721ad259f62f13b29d0def9763ecd255bbd0000000000828201527132ee83b0e7faee3692ea9167eeeb660ba65219606080840191909152838201929092526d2da658c0c27e9390469747af1d1e91830191909152735fae3648f111f6819d271eec4ded1baa3acbd17360601b60808301528201526104606105dd565b73995823738767206aa85a0fbc841de67a41f7186d815260006020820152610486610610565b604080516060810182527208c794d69f54815eed7d052b20451ca06d8e101981527f885ebb053df90d7abe46b1bc3efc8933f9c93094f7c619702b14f7fa6f000000602082015260019181019190915281526104e061063d565b6f49177c4ef90dc46ecccbdd18fa2d746b81526f3a76db627b77879d290b020c32e00baf196020808301919091526f57ed65a4765f8b3c842553db7905dd5e19604080840191909152908301919091527fd57dd0a634810f8a2db7a527a7ebb2ad479ad34fda7acd4b49c82e0000000000828201527148c2e8c2f835908ed0dc2eac148e76acca97606080840191909152908301919091526d2b9e74d139ea83845179605cb4b68282015273a21ed9bfc65baba34473a1b72d380fd35e2d360960601b6080830152820152919050565b60405180608001604052806004905b6105c76105dd565b8152602001906001900390816105bf5790505090565b6040805160a081018252600080825260208201529081016105fc610610565b815260006020820181905260409091015290565b6040805160e0810190915260006080820181815260a0830182905260c08301919091528152602081016105fc5b60405180606001604052806003906020820280368337509192915050565b610600810181836000805b600481101561075257825180516001600160a01b031685526020808201511515818701526040808301518051805160120b838a01528084015162ffffff19166060808b01919091529083015115156080808b0191909152828501519160a08b01895b60038110156106e8578451600f0b825293870193908701906001016106c8565b50509383015164ffffffffff19166101008b01529183015160110b6101208a015250908301516dffffffffffffffffffffffffffff1661014088015291909101516bffffffffffffffffffffffff1916610160860152610180909401939290920191600101610666565b505050509291505056fea2646970667358221220383d41de733ddf8355b1dc23296eb4b6f25762d9a9d46766895fda7ea964bc9364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0f3f9a44 {\n int152 s_0;\n bytes29 s_1;\n bool s_2;\n }\n\n struct S_d4baab0b {\n S_0f3f9a44 s_0;\n int128[3] s_1;\n bytes27 s_2;\n int144 s_3;\n }\n\n struct S_76980607 {\n address s_0;\n bool s_1;\n S_d4baab0b s_2;\n uint112 s_3;\n bytes20 s_4;\n }\n\n function test () public pure returns (S_76980607[4] memory) {\n S_76980607[4] memory r;\n {\n S_76980607 memory r_0;\n {\n address r_0_0 = 0xfe257ec9A225197B5Ef581b39EdBa3C961834143;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n S_d4baab0b memory r_0_2;\n {\n S_0f3f9a44 memory r_0_2_0;\n {\n int152 r_0_2_0_0 = -367487821529439856182634921119176115759882135;\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n bytes29 r_0_2_0_1 = bytes29(0x9114277f9adf59dcb919644bb0797e9fb6b545a1c15ae7ae5530811a27);\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n {\n bool r_0_2_0_2 = true;\n r_0_2_0.s_2 = r_0_2_0_2;\n }\n r_0_2.s_0 = r_0_2_0;\n }\n {\n int128[3] memory r_0_2_1;\n {\n int128 r_0_2_1_0 = -55354864036280381072930011386423358393;\n r_0_2_1[0] = r_0_2_1_0;\n }\n {\n int128 r_0_2_1_1 = -129812591695521910456620563746077898552;\n r_0_2_1[1] = r_0_2_1_1;\n }\n {\n int128 r_0_2_1_2 = 158968403595070391923361597987926589550;\n r_0_2_1[2] = r_0_2_1_2;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n {\n bytes27 r_0_2_2 = bytes27(0x519a0a374ade9a831f749f6efb81e7b281aa204a9031a25c47a17f);\n r_0_2.s_2 = r_0_2_2;\n }\n {\n int144 r_0_2_3 = -8435974179221311283253364389512900353606586;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n uint112 r_0_3 = 1661188408825630500428136452681712;\n r_0.s_3 = r_0_3;\n }\n {\n bytes20 r_0_4 = bytes20(0x4fe2733a4825536f423022a5225DD4Ffd1481b52);\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_76980607 memory r_1;\n {\n address r_1_0 = 0xb303C4C33b1080c5B8bD12b0506639B33a52C397;\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n {\n S_d4baab0b memory r_1_2;\n {\n S_0f3f9a44 memory r_1_2_0;\n {\n int152 r_1_2_0_0 = 1334578797605152123681285783624101320913825750;\n r_1_2_0.s_0 = r_1_2_0_0;\n }\n {\n bytes29 r_1_2_0_1 = bytes29(0x3b269c4d8d0744d5207b79c085520632c9064c92888d93db4bd23cf21f);\n r_1_2_0.s_1 = r_1_2_0_1;\n }\n {\n bool r_1_2_0_2 = false;\n r_1_2_0.s_2 = r_1_2_0_2;\n }\n r_1_2.s_0 = r_1_2_0;\n }\n {\n int128[3] memory r_1_2_1;\n {\n int128 r_1_2_1_0 = 54681290603971129906076190089653205540;\n r_1_2_1[0] = r_1_2_1_0;\n }\n {\n int128 r_1_2_1_1 = -168991046943715566013114202944361563725;\n r_1_2_1[1] = r_1_2_1_1;\n }\n {\n int128 r_1_2_1_2 = 47317863736967251917982592893322769889;\n r_1_2_1[2] = r_1_2_1_2;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n {\n bytes27 r_1_2_2 = bytes27(0x0ee5720d5e318dae6f1964b36c14d5aaae3df85f7f5eb7dc61865d);\n r_1_2.s_2 = r_1_2_2;\n }\n {\n int144 r_1_2_3 = 810330781926253792478935935734255240197179;\n r_1_2.s_3 = r_1_2_3;\n }\n r_1.s_2 = r_1_2;\n }\n {\n uint112 r_1_3 = 4893268753128527669151769062357040;\n r_1.s_3 = r_1_3;\n }\n {\n bytes20 r_1_4 = bytes20(0x8003884B8d09afB6528A29079F7A6FcA7262bE1D);\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_76980607 memory r_2;\n {\n address r_2_0 = 0x1a65ae931C5f6594073633fE725E0d3b6fc6994E;\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n S_d4baab0b memory r_2_2;\n {\n S_0f3f9a44 memory r_2_2_0;\n {\n int152 r_2_2_0_0 = -1527110627501976758793339687597945559758308065;\n r_2_2_0.s_0 = r_2_2_0_0;\n }\n {\n bytes29 r_2_2_0_1 = bytes29(0x56b84ef4c000424fd4e4f2e6f5e2572cc0aa54d855162f968ab4f7698e);\n r_2_2_0.s_1 = r_2_2_0_1;\n }\n {\n bool r_2_2_0_2 = true;\n r_2_2_0.s_2 = r_2_2_0_2;\n }\n r_2_2.s_0 = r_2_2_0;\n }\n {\n int128[3] memory r_2_2_1;\n {\n int128 r_2_2_1_0 = 138747119980425229747649299506787878050;\n r_2_2_1[0] = r_2_2_1_0;\n }\n {\n int128 r_2_2_1_1 = -57437622816927220753860359122631450222;\n r_2_2_1[1] = r_2_2_1_1;\n }\n {\n int128 r_2_2_1_2 = 168623085384907069677430265293169588721;\n r_2_2_1[2] = r_2_2_1_2;\n }\n r_2_2.s_1 = r_2_2_1;\n }\n {\n bytes27 r_2_2_2 = bytes27(0xb6c8de0a1880347aadf721ad259f62f13b29d0def9763ecd255bbd);\n r_2_2.s_2 = r_2_2_2;\n }\n {\n int144 r_2_2_3 = -4436776547332007995224717365652146709309011;\n r_2_2.s_3 = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n {\n uint112 r_2_3 = 925887774854788713999338281311518;\n r_2.s_3 = r_2_3;\n }\n {\n bytes20 r_2_4 = bytes20(0x5faE3648f111f6819d271Eec4ded1BaA3ACbD173);\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n {\n S_76980607 memory r_3;\n {\n address r_3_0 = 0x995823738767206Aa85A0FbC841DE67A41f7186D;\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3.s_1 = r_3_1;\n }\n {\n S_d4baab0b memory r_3_2;\n {\n S_0f3f9a44 memory r_3_2_0;\n {\n int152 r_3_2_0_0 = -195791953561049843804958689997054126997736977;\n r_3_2_0.s_0 = r_3_2_0_0;\n }\n {\n bytes29 r_3_2_0_1 = bytes29(0x885ebb053df90d7abe46b1bc3efc8933f9c93094f7c619702b14f7fa6f);\n r_3_2_0.s_1 = r_3_2_0_1;\n }\n {\n bool r_3_2_0_2 = true;\n r_3_2_0.s_2 = r_3_2_0_2;\n }\n r_3_2.s_0 = r_3_2_0;\n }\n {\n int128[3] memory r_3_2_1;\n {\n int128 r_3_2_1_0 = 97155587795711099786084553125234832491;\n r_3_2_1[0] = r_3_2_1_0;\n }\n {\n int128 r_3_2_1_1 = -77712364435106515201446387809603554224;\n r_3_2_1[1] = r_3_2_1_1;\n }\n {\n int128 r_3_2_1_2 = -116875471542183792885707106261620088159;\n r_3_2_1[2] = r_3_2_1_2;\n }\n r_3_2.s_1 = r_3_2_1;\n }\n {\n bytes27 r_3_2_2 = bytes27(0xd57dd0a634810f8a2db7a527a7ebb2ad479ad34fda7acd4b49c82e);\n r_3_2.s_2 = r_3_2_2;\n }\n {\n int144 r_3_2_3 = 6338408759504293889521953865395729093937815;\n r_3_2.s_3 = r_3_2_3;\n }\n r_3.s_2 = r_3_2;\n }\n {\n uint112 r_3_3 = 884697815834412073480896793851062;\n r_3.s_3 = r_3_3;\n }\n {\n bytes20 r_3_4 = bytes20(0xA21ed9BfC65BabA34473a1b72d380fD35E2d3609);\n r_3.s_4 = r_3_4;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000fe257ec9a225197b5ef581b39edba3c9618341430000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffef85725abfe1c71aa5abb53a80d0cfbd67e0699114277f9adf59dcb919644bb0797e9fb6b545a1c15ae7ae5530811a270000000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffd65b0a7d9138084d4ff8ba3a2aeacc47ffffffffffffffffffffffffffffffff9e5701167eea1cd98ef1cba7caaa88c8000000000000000000000000000000007798336c2f4b40eb6f44d263cfc8406e519a0a374ade9a831f749f6efb81e7b281aa204a9031a25c47a17f0000000000ffffffffffffffffffffffffffff9f28e667d0e64f0faa7d4efefdcf99adbc4600000000000000000000000000000000000051e7253d94105844f1d9b6976ff04fe2733a4825536f423022a5225dd4ffd1481b52000000000000000000000000000000000000000000000000b303c4c33b1080c5b8bd12b0506639b33a52c3970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bd83697e1351ce7500b147bd24a8ad4e7afd63b269c4d8d0744d5207b79c085520632c9064c92888d93db4bd23cf21f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029233bc678d6f4b3bf3b6e1dd6b73a24ffffffffffffffffffffffffffffffff80dd821bbd5fe71cfb5980147c3279b300000000000000000000000000000000239916cd21754441b8656e459467b5e10ee5720d5e318dae6f1964b36c14d5aaae3df85f7f5eb7dc61865d00000000000000000000000000000000000000094d591fc6ecb7d322ad1b18f0c7dcbdb43b000000000000000000000000000000000000f141bc149975422ea9c4afa538308003884b8d09afb6528a29079f7a6fca7262be1d0000000000000000000000000000000000000000000000001a65ae931c5f6594073633fe725e0d3b6fc6994e0000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffbb85a135f23233f77cb6790000cf45c7597d1f56b84ef4c000424fd4e4f2e6f5e2572cc0aa54d855162f968ab4f7698e0000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000006861b92aa21091149cf07309d5d984a2ffffffffffffffffffffffffffffffffd4c9ea8def3061f0d052f30e06a52192000000000000000000000000000000007edb9ffc7244eb15a407f3527e2179f1b6c8de0a1880347aadf721ad259f62f13b29d0def9763ecd255bbd0000000000ffffffffffffffffffffffffffffcd117c4f180511c96d156e98111499f459ad0000000000000000000000000000000000002da658c0c27e9390469747af1d1e5fae3648f111f6819d271eec4ded1baa3acbd173000000000000000000000000000000000000000000000000995823738767206aa85a0fbc841de67a41f7186d0000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffff7386b2960ab7ea11282fad4dfbae35f9271ef885ebb053df90d7abe46b1bc3efc8933f9c93094f7c619702b14f7fa6f00000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000049177c4ef90dc46ecccbdd18fa2d746bffffffffffffffffffffffffffffffffc589249d84887862d6f4fdf3cd1ff450ffffffffffffffffffffffffffffffffa8129a5b89a074c37bdaac2486fa22a1d57dd0a634810f8a2db7a527a7ebb2ad479ad34fda7acd4b49c82e0000000000000000000000000000000000000048c2e8c2f835908ed0dc2eac148e76acca970000000000000000000000000000000000002b9e74d139ea83845179605cb4b6a21ed9bfc65baba34473a1b72d380fd35e2d3609000000000000000000000000" + }, + { + "name": "random-(address,uint128,address,address[3],(bytes32,string[4],bytes24[2][],bytes12))", + "type": "(address,uint128,address,address[3],(bytes32,string[4],bytes24[2][],bytes12))", + "value": [ + "0x623683292e6D148c8E2787eCccef94545766D9Ad", + "181486589979320913748479475800337785323", + "0x565413c8EA20764129f6397D0A2dB08BD3Ab5672", + [ + "0x9d8aa1bfF6234B5ba5ca712DcE4C198131F466b3", + "0xaE798e08E4DCcC293dbbc0b1326Ae303c08724F4", + "0x346Bc5bD0Bd359Cf6B199E608099Eb7782A19032" + ], + [ + "0xfbd8b4a9748409b3fda8469d009670f7ff6532ce4be5129a5e4838c97e21dc4a", + [ + "Moo é🚀oéMooéMo🚀M🚀M🚀MéoMéoéo🚀oMoééoM o🚀é🚀o ééMo", + "Moo é🚀éooééééo🚀o oo🚀oMoMMoé🚀oM ooooo 🚀oMooo🚀o", + "Moo é🚀é🚀oéoMoo🚀é 🚀é🚀 oooM éo🚀 oé🚀 é o🚀M🚀 🚀🚀ooéMMéo o Méo", + "Moo é🚀🚀🚀ooMoooéoMoé🚀o🚀éoo🚀o éMMMé " + ], + [ + [ + "0x49c91bec86a512f26eda35703225ea9b53c2557d4575d520", + "0xf6e5a539f062b9c30b5b19d68ad045204bd9ce953230207d" + ], + [ + "0xec204dafacbd736ec52934f97515c418f81c228ede180672", + "0x73078cb529d29e0605dc109dca896ab550250a7c7019d03b" + ], + [ + "0x961b5ab80cbc2f1c83f547fd2b7f903b516fe8ac561eca53", + "0xf5745f1c312cad3f435f565a8ca5c20fd275cc1e098e8ea7" + ], + [ + "0xb1a5fac7c8922daae536840282cc6cf0db9f0ec557ad70db", + "0xc29bb9528069fd52df5613d52679fe8961e2b84795ce964e" + ] + ], + "0xbfce54ac9a7e883f7fa4d6e7" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x623683292e6D148c8E2787eCccef94545766D9Ad" + }, + { + "type": "number", + "value": "181486589979320913748479475800337785323" + }, + { + "type": "address", + "value": "0x565413c8EA20764129f6397D0A2dB08BD3Ab5672" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9d8aa1bfF6234B5ba5ca712DcE4C198131F466b3" + }, + { + "type": "address", + "value": "0xaE798e08E4DCcC293dbbc0b1326Ae303c08724F4" + }, + { + "type": "address", + "value": "0x346Bc5bD0Bd359Cf6B199E608099Eb7782A19032" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfbd8b4a9748409b3fda8469d009670f7ff6532ce4be5129a5e4838c97e21dc4a" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéMooéMo🚀M🚀M🚀MéoMéoéo🚀oMoééoM o🚀é🚀o ééMo" + }, + { + "type": "string", + "value": "Moo é🚀éooééééo🚀o oo🚀oMoMMoé🚀oM ooooo 🚀oMooo🚀o" + }, + { + "type": "string", + "value": "Moo é🚀é🚀oéoMoo🚀é 🚀é🚀 oooM éo🚀 oé🚀 é o🚀M🚀 🚀🚀ooéMMéo o Méo" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀ooMoooéoMoé🚀o🚀éoo🚀o éMMMé " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x49c91bec86a512f26eda35703225ea9b53c2557d4575d520" + }, + { + "type": "hexstring", + "value": "0xf6e5a539f062b9c30b5b19d68ad045204bd9ce953230207d" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xec204dafacbd736ec52934f97515c418f81c228ede180672" + }, + { + "type": "hexstring", + "value": "0x73078cb529d29e0605dc109dca896ab550250a7c7019d03b" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x961b5ab80cbc2f1c83f547fd2b7f903b516fe8ac561eca53" + }, + { + "type": "hexstring", + "value": "0xf5745f1c312cad3f435f565a8ca5c20fd275cc1e098e8ea7" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb1a5fac7c8922daae536840282cc6cf0db9f0ec557ad70db" + }, + { + "type": "hexstring", + "value": "0xc29bb9528069fd52df5613d52679fe8961e2b84795ce964e" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xbfce54ac9a7e883f7fa4d6e7" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506107fa806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105ec565b60405180910390f35b6100566103e9565b61005e6103e9565b73623683292e6d148c8e2787ecccef94545766d9ad81526f88890bba8146d8fff2ee4584fe57a1eb602082015273565413c8ea20764129f6397d0a2db08bd3ab567260408201526100ad610424565b739d8aa1bff6234b5ba5ca712dce4c198131f466b3815273ae798e08e4dccc293dbbc0b1326ae303c08724f4602082015273346bc5bd0bd359cf6b199e608099eb7782a1903260408201526060820152610105610442565b7ffbd8b4a9748409b3fda8469d009670f7ff6532ce4be5129a5e4838c97e21dc4a8152610130610471565b60006040518060800160405280604e8152602001610691604e9139825250604080516080810190915260468082526000919061077f602083013990508082600160200201819052505060006040518060a00160405280606681526020016106df60669139604080840191909152805160608101909152603a808252600092506107456020830139606083015250602082015260408051600480825260a08201909252600091816020015b6101e2610498565b8152602001906001900390816101da5790505090506101ff610498565b7f49c91bec86a512f26eda35703225ea9b53c2557d4575d520000000000000000081527ff6e5a539f062b9c30b5b19d68ad045204bd9ce953230207d0000000000000000602082015281518190839060009061025d5761025d61067a565b602002602001018190525050610271610498565b7fec204dafacbd736ec52934f97515c418f81c228ede180672000000000000000081527f73078cb529d29e0605dc109dca896ab550250a7c7019d03b0000000000000000602082015281518190839060019081106102d1576102d161067a565b6020026020010181905250506102e5610498565b7f961b5ab80cbc2f1c83f547fd2b7f903b516fe8ac561eca53000000000000000081527ff5745f1c312cad3f435f565a8ca5c20fd275cc1e098e8ea70000000000000000602082015281518190839060029081106103455761034561067a565b602002602001018190525050610359610498565b7fb1a5fac7c8922daae536840282cc6cf0db9f0ec557ad70db000000000000000081527fc29bb9528069fd52df5613d52679fe8961e2b84795ce964e0000000000000000602082015281518190839060039081106103b9576103b961067a565b60209081029190910101525060408201526bbfce54ac9a7e883f7fa4d6e760a01b60608201526080820152919050565b6040805160a0810182526000808252602082018190529181019190915260608101610412610424565b815260200161041f610442565b905290565b60405180606001604052806003906020820280368337509192915050565b6040805160808101909152600081526020810161045d610471565b815260606020820152600060409091015290565b60405180608001604052806004905b60608152602001906001900390816104805790505090565b60405180604001604052806002906020820280368337509192915050565b60008151808452602080850194508084016000805b8481101561051657825188835b600281101561050057825167ffffffffffffffff1916825291860191908601906001016104d8565b50505060409790970196918301916001016104cb565b50959695505050505050565b8051825260208082015160808285018190526000926101008601929091860184805b60048110156105aa57888603607f1901835283518051808852835b8181101561057a57828101880151898201890152870161055f565b8181111561058a578488838b0101525b50601f01601f191696909601850195509284019291840191600101610544565b5050505050604083015184820360408601526105c682826104b6565b91505060608301516105e460608601826001600160a01b0319169052565b509392505050565b6000602080835260018060a01b0380855116828501526fffffffffffffffffffffffffffffffff8286015116604085015280604086015116606085015260608501516080850160005b6003811015610654578251841682529184019190840190600101610635565b5050505050608083015160e080840152610672610100840182610522565b949350505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806fc3a94d6f6fc3a94d6ff09f9a804df09f9a804df09f9a804dc3a96f4dc3a96fc3a96ff09f9a806f4d6fc3a9c3a96f4d206ff09f9a80c3a9f09f9a806f20c3a9c3a94d6f4d6f6f20c3a9f09f9a80c3a9f09f9a806fc3a96f4d6f6ff09f9a80c3a920f09f9a80c3a9f09f9a802020206f6f6f4d20c3a96ff09f9a80206fc3a9f09f9a8020c3a9206ff09f9a804df09f9a8020f09f9a80f09f9a806f6fc3a94d4dc3a96f206f204dc3a96f4d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6f4d6f6f6fc3a96f4d6fc3a9f09f9a806ff09f9a80c3a96f6ff09f9a806f20c3a94d4d4dc3a9204d6f6f20c3a9f09f9a80c3a96f6fc3a9c3a9c3a9c3a96ff09f9a806f206f6ff09f9a806f4d6f4d4d6fc3a9f09f9a806f4d206f6f6f6f6f20f09f9a806f4d6f6f6ff09f9a806fa2646970667358221220aa57752d215dadfcd6388fcc6e70f39e3dfa9239bb02b646eed033114f1dafa764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_1ad9ae0d {\n bytes32 s_0;\n string[4] s_1;\n bytes24[2][] s_2;\n bytes12 s_3;\n }\n\n struct S_a75cf3f0 {\n address s_0;\n uint128 s_1;\n address s_2;\n address[3] s_3;\n S_1ad9ae0d s_4;\n }\n\n function test () public pure returns (S_a75cf3f0 memory) {\n S_a75cf3f0 memory r;\n {\n address r_0 = 0x623683292e6D148c8E2787eCccef94545766D9Ad;\n r.s_0 = r_0;\n }\n {\n uint128 r_1 = 181486589979320913748479475800337785323;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x565413c8EA20764129f6397D0A2dB08BD3Ab5672;\n r.s_2 = r_2;\n }\n {\n address[3] memory r_3;\n {\n address r_3_0 = 0x9d8aa1bfF6234B5ba5ca712DcE4C198131F466b3;\n r_3[0] = r_3_0;\n }\n {\n address r_3_1 = 0xaE798e08E4DCcC293dbbc0b1326Ae303c08724F4;\n r_3[1] = r_3_1;\n }\n {\n address r_3_2 = 0x346Bc5bD0Bd359Cf6B199E608099Eb7782A19032;\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n S_1ad9ae0d memory r_4;\n {\n bytes32 r_4_0 = bytes32(0xfbd8b4a9748409b3fda8469d009670f7ff6532ce4be5129a5e4838c97e21dc4a);\n r_4.s_0 = r_4_0;\n }\n {\n string[4] memory r_4_1;\n {\n string memory r_4_1_0 = unicode\"Moo é🚀oéMooéMo🚀M🚀M🚀MéoMéoéo🚀oMoééoM o🚀é🚀o ééMo\";\n r_4_1[0] = r_4_1_0;\n }\n {\n string memory r_4_1_1 = unicode\"Moo é🚀éooééééo🚀o oo🚀oMoMMoé🚀oM ooooo 🚀oMooo🚀o\";\n r_4_1[1] = r_4_1_1;\n }\n {\n string memory r_4_1_2 = unicode\"Moo é🚀é🚀oéoMoo🚀é 🚀é🚀 oooM éo🚀 oé🚀 é o🚀M🚀 🚀🚀ooéMMéo o Méo\";\n r_4_1[2] = r_4_1_2;\n }\n {\n string memory r_4_1_3 = unicode\"Moo é🚀🚀🚀ooMoooéoMoé🚀o🚀éoo🚀o éMMMé \";\n r_4_1[3] = r_4_1_3;\n }\n r_4.s_1 = r_4_1;\n }\n {\n bytes24[2][] memory r_4_2 = new bytes24[2][](4);\n {\n bytes24[2] memory r_4_2_0;\n {\n bytes24 r_4_2_0_0 = bytes24(0x49c91bec86a512f26eda35703225ea9b53c2557d4575d520);\n r_4_2_0[0] = r_4_2_0_0;\n }\n {\n bytes24 r_4_2_0_1 = bytes24(0xf6e5a539f062b9c30b5b19d68ad045204bd9ce953230207d);\n r_4_2_0[1] = r_4_2_0_1;\n }\n r_4_2[0] = r_4_2_0;\n }\n {\n bytes24[2] memory r_4_2_1;\n {\n bytes24 r_4_2_1_0 = bytes24(0xec204dafacbd736ec52934f97515c418f81c228ede180672);\n r_4_2_1[0] = r_4_2_1_0;\n }\n {\n bytes24 r_4_2_1_1 = bytes24(0x73078cb529d29e0605dc109dca896ab550250a7c7019d03b);\n r_4_2_1[1] = r_4_2_1_1;\n }\n r_4_2[1] = r_4_2_1;\n }\n {\n bytes24[2] memory r_4_2_2;\n {\n bytes24 r_4_2_2_0 = bytes24(0x961b5ab80cbc2f1c83f547fd2b7f903b516fe8ac561eca53);\n r_4_2_2[0] = r_4_2_2_0;\n }\n {\n bytes24 r_4_2_2_1 = bytes24(0xf5745f1c312cad3f435f565a8ca5c20fd275cc1e098e8ea7);\n r_4_2_2[1] = r_4_2_2_1;\n }\n r_4_2[2] = r_4_2_2;\n }\n {\n bytes24[2] memory r_4_2_3;\n {\n bytes24 r_4_2_3_0 = bytes24(0xb1a5fac7c8922daae536840282cc6cf0db9f0ec557ad70db);\n r_4_2_3[0] = r_4_2_3_0;\n }\n {\n bytes24 r_4_2_3_1 = bytes24(0xc29bb9528069fd52df5613d52679fe8961e2b84795ce964e);\n r_4_2_3[1] = r_4_2_3_1;\n }\n r_4_2[3] = r_4_2_3;\n }\n r_4.s_2 = r_4_2;\n }\n {\n bytes12 r_4_3 = bytes12(0xbfce54ac9a7e883f7fa4d6e7);\n r_4.s_3 = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000623683292e6d148c8e2787ecccef94545766d9ad0000000000000000000000000000000088890bba8146d8fff2ee4584fe57a1eb000000000000000000000000565413c8ea20764129f6397d0a2db08bd3ab56720000000000000000000000009d8aa1bff6234b5ba5ca712dce4c198131f466b3000000000000000000000000ae798e08e4dccc293dbbc0b1326ae303c08724f4000000000000000000000000346bc5bd0bd359cf6b199e608099eb7782a1903200000000000000000000000000000000000000000000000000000000000000e0fbd8b4a9748409b3fda8469d009670f7ff6532ce4be5129a5e4838c97e21dc4a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000300bfce54ac9a7e883f7fa4d6e700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a806fc3a94d6f6fc3a94d6ff09f9a804df09f9a804df09f9a804dc3a96f4dc3a96fc3a96ff09f9a806f4d6fc3a9c3a96f4d206ff09f9a80c3a9f09f9a806f20c3a9c3a94d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80c3a96f6fc3a9c3a9c3a9c3a96ff09f9a806f206f6ff09f9a806f4d6f4d4d6fc3a9f09f9a806f4d206f6f6f6f6f20f09f9a806f4d6f6f6ff09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a80c3a9f09f9a806fc3a96f4d6f6ff09f9a80c3a920f09f9a80c3a9f09f9a802020206f6f6f4d20c3a96ff09f9a80206fc3a9f09f9a8020c3a9206ff09f9a804df09f9a8020f09f9a80f09f9a806f6fc3a94d4dc3a96f206f204dc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6f4d6f6f6fc3a96f4d6fc3a9f09f9a806ff09f9a80c3a96f6ff09f9a806f20c3a94d4d4dc3a920000000000000000000000000000000000000000000000000000000000000000000000000000449c91bec86a512f26eda35703225ea9b53c2557d4575d5200000000000000000f6e5a539f062b9c30b5b19d68ad045204bd9ce953230207d0000000000000000ec204dafacbd736ec52934f97515c418f81c228ede180672000000000000000073078cb529d29e0605dc109dca896ab550250a7c7019d03b0000000000000000961b5ab80cbc2f1c83f547fd2b7f903b516fe8ac561eca530000000000000000f5745f1c312cad3f435f565a8ca5c20fd275cc1e098e8ea70000000000000000b1a5fac7c8922daae536840282cc6cf0db9f0ec557ad70db0000000000000000c29bb9528069fd52df5613d52679fe8961e2b84795ce964e0000000000000000" + }, + { + "name": "random-(address[1],address,(bytes14,bytes7,address,bytes3,address)[2],(address,(address)),address)", + "type": "(address[1],address,(bytes14,bytes7,address,bytes3,address)[2],(address,(address)),address)", + "value": [ + ["0xF4048F1fdB33fb34F210a04B76fe3891DACA0d3A"], + "0x8474Eda60F21751aD1316A48619cc3b4CFAc8df4", + [ + [ + "0xee71fb07c54a93fc03fd34ae5dd7", + "0x287474777ad165", + "0x26E7AB9Bdd0aFd87aC3e8FEAf221c2DBBFe4EDa4", + "0xd7d34b", + "0xA3A9669f2c1e6c07E462DBe6DB747F042f6AA805" + ], + [ + "0xc0e715e8adec5eb09f42fad287ec", + "0x5055dd34fa1a72", + "0xFA4655227Cc6d9a8D4100F45570F3081D6b6fF4b", + "0xc4f456", + "0x4D53CD834d0fF8B59Ec77c2FEf5Ed69a22F94271" + ] + ], + [ + "0xF3a991510D1007f8729B2D544Ba59A8AA78b9687", + ["0x251622fd83bCa18139752687e03903Fe90B96382"] + ], + "0xE52ae73115feeFe7352703DdBa9c4105c94D6460" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xF4048F1fdB33fb34F210a04B76fe3891DACA0d3A" + } + ] + }, + { + "type": "address", + "value": "0x8474Eda60F21751aD1316A48619cc3b4CFAc8df4" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xee71fb07c54a93fc03fd34ae5dd7" + }, + { + "type": "hexstring", + "value": "0x287474777ad165" + }, + { + "type": "address", + "value": "0x26E7AB9Bdd0aFd87aC3e8FEAf221c2DBBFe4EDa4" + }, + { + "type": "hexstring", + "value": "0xd7d34b" + }, + { + "type": "address", + "value": "0xA3A9669f2c1e6c07E462DBe6DB747F042f6AA805" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc0e715e8adec5eb09f42fad287ec" + }, + { + "type": "hexstring", + "value": "0x5055dd34fa1a72" + }, + { + "type": "address", + "value": "0xFA4655227Cc6d9a8D4100F45570F3081D6b6fF4b" + }, + { + "type": "hexstring", + "value": "0xc4f456" + }, + { + "type": "address", + "value": "0x4D53CD834d0fF8B59Ec77c2FEf5Ed69a22F94271" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF3a991510D1007f8729B2D544Ba59A8AA78b9687" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x251622fd83bCa18139752687e03903Fe90B96382" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xE52ae73115feeFe7352703DdBa9c4105c94D6460" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061042e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610360565b60405180910390f35b61005661020f565b61005e61020f565b610066610267565b73f4048f1fdb33fb34f210a04b76fe3891daca0d3a81528152738474eda60f21751ad1316a48619cc3b4cfac8df460208201526100a1610285565b6040805160a080820183526dee71fb07c54a93fc03fd34ae5dd760901b825266287474777ad16560c81b6020808401919091527326e7ab9bdd0afd87ac3e8feaf221c2dbbfe4eda48385015262d7d34b60e81b60608085019190915273a3a9669f2c1e6c07e462dbe6db747f042f6aa805608080860191909152938652845192830185526d3039c57a2b7b17ac27d0beb4a1fb60921b835266282aee9a7d0d3960c91b8383015273fa4655227cc6d9a8d4100f45570f3081d6b6ff4b8386015262627a2b60e91b90830152734d53cd834d0ff8b59ec77c2fef5ed69a22f94271928201929092528382015283820192909252805180820182526000808252825180850190935282529182015273f3a991510d1007f8729b2d544ba59a8aa78b9687815260408051602080820190925273251622fd83bca18139752687e03903fe90b96382815290820152606082015273e52ae73115feefe7352703ddba9c4105c94d64606080820152919050565b6040518060a00160405280610222610267565b815260006020820152604001610236610285565b8152604080518082018252600080825282516020818101909452908152818301529101908152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002905b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816102945790505090565b8060005b600281101561035a578151805171ffffffffffffffffffffffffffffffffffff191685526020808201516001600160c81b031916818701526040808301516001600160a01b03908116918801919091526060808401516001600160e81b03191690880152608092830151169186019190915260a090940193909101906001016102d6565b50505050565b81516101e08201908260005b60018110156103945782516001600160a01b031682526020928301929091019060010161036c565b5050506020838101516001600160a01b031690830152604080840151906103bd908401826102d2565b50606083015180516001600160a01b039081166101808501526020909101515181166101a08401526080909301519092166101c0909101529056fea264697066735822122018c186363a0be54b1d2ed0b44fb9682a73d29321c2e8523ed9a8a6ae0e9ea2d364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_147fb308 {\n bytes14 s_0;\n bytes7 s_1;\n address s_2;\n bytes3 s_3;\n address s_4;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_f889378e {\n address s_0;\n S_421683f8 s_1;\n }\n\n struct S_c666b43b {\n address[1] s_0;\n address s_1;\n S_147fb308[2] s_2;\n S_f889378e s_3;\n address s_4;\n }\n\n function test () public pure returns (S_c666b43b memory) {\n S_c666b43b memory r;\n {\n address[1] memory r_0;\n {\n address r_0_0 = 0xF4048F1fdB33fb34F210a04B76fe3891DACA0d3A;\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x8474Eda60F21751aD1316A48619cc3b4CFAc8df4;\n r.s_1 = r_1;\n }\n {\n S_147fb308[2] memory r_2;\n {\n S_147fb308 memory r_2_0;\n {\n bytes14 r_2_0_0 = bytes14(0xee71fb07c54a93fc03fd34ae5dd7);\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bytes7 r_2_0_1 = bytes7(0x287474777ad165);\n r_2_0.s_1 = r_2_0_1;\n }\n {\n address r_2_0_2 = 0x26E7AB9Bdd0aFd87aC3e8FEAf221c2DBBFe4EDa4;\n r_2_0.s_2 = r_2_0_2;\n }\n {\n bytes3 r_2_0_3 = bytes3(0xd7d34b);\n r_2_0.s_3 = r_2_0_3;\n }\n {\n address r_2_0_4 = 0xA3A9669f2c1e6c07E462DBe6DB747F042f6AA805;\n r_2_0.s_4 = r_2_0_4;\n }\n r_2[0] = r_2_0;\n }\n {\n S_147fb308 memory r_2_1;\n {\n bytes14 r_2_1_0 = bytes14(0xc0e715e8adec5eb09f42fad287ec);\n r_2_1.s_0 = r_2_1_0;\n }\n {\n bytes7 r_2_1_1 = bytes7(0x5055dd34fa1a72);\n r_2_1.s_1 = r_2_1_1;\n }\n {\n address r_2_1_2 = 0xFA4655227Cc6d9a8D4100F45570F3081D6b6fF4b;\n r_2_1.s_2 = r_2_1_2;\n }\n {\n bytes3 r_2_1_3 = bytes3(0xc4f456);\n r_2_1.s_3 = r_2_1_3;\n }\n {\n address r_2_1_4 = 0x4D53CD834d0fF8B59Ec77c2FEf5Ed69a22F94271;\n r_2_1.s_4 = r_2_1_4;\n }\n r_2[1] = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n S_f889378e memory r_3;\n {\n address r_3_0 = 0xF3a991510D1007f8729B2D544Ba59A8AA78b9687;\n r_3.s_0 = r_3_0;\n }\n {\n S_421683f8 memory r_3_1;\n {\n address r_3_1_0 = 0x251622fd83bCa18139752687e03903Fe90B96382;\n r_3_1.s_0 = r_3_1_0;\n }\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xE52ae73115feeFe7352703DdBa9c4105c94D6460;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000f4048f1fdb33fb34f210a04b76fe3891daca0d3a0000000000000000000000008474eda60f21751ad1316a48619cc3b4cfac8df4ee71fb07c54a93fc03fd34ae5dd7000000000000000000000000000000000000287474777ad1650000000000000000000000000000000000000000000000000000000000000000000000000026e7ab9bdd0afd87ac3e8feaf221c2dbbfe4eda4d7d34b0000000000000000000000000000000000000000000000000000000000000000000000000000000000a3a9669f2c1e6c07e462dbe6db747f042f6aa805c0e715e8adec5eb09f42fad287ec0000000000000000000000000000000000005055dd34fa1a7200000000000000000000000000000000000000000000000000000000000000000000000000fa4655227cc6d9a8d4100f45570f3081d6b6ff4bc4f45600000000000000000000000000000000000000000000000000000000000000000000000000000000004d53cd834d0ff8b59ec77c2fef5ed69a22f94271000000000000000000000000f3a991510d1007f8729b2d544ba59a8aa78b9687000000000000000000000000251622fd83bca18139752687e03903fe90b96382000000000000000000000000e52ae73115feefe7352703ddba9c4105c94d6460" + }, + { + "name": "random-(bool,address,(string,(bytes13,address,bool,string,address),bool,(address)[4],string))", + "type": "(bool,address,(string,(bytes13,address,bool,string,address),bool,(address)[4],string))", + "value": [ + false, + "0x172102ffA64Fa277eB0197358dE3937B91810304", + [ + "Moo é🚀oo🚀oMo M M oéM🚀o🚀 o M🚀 Mééoo éé🚀M oMoéoéoo éoo", + [ + "0x3fea276ffb0c8262fa0b5ab875", + "0x21f94ccFec920E687360DAFfb6437FD22984f95C", + true, + "Moo é🚀 🚀🚀 🚀Mééo M éMMooMooéoé 🚀o🚀Mo oéo🚀ooéo🚀🚀Mo🚀MoMooM🚀", + "0xBc645d08bCf0feaD38e23fAF0CB493AFf8bFbAe3" + ], + false, + [ + ["0x0A1863054BA70C2ecd4421e8f927a17E09f4e08c"], + ["0x6D24aF287947B24D4db01481D531A9BD7f080135"], + ["0x3bbc06610652E8b012Ed98B17fEfd55D504044FC"], + ["0x725C5b91C8b479D1680968B964eC863fCc05ecc8"] + ], + "Moo é🚀🚀 MéoMo M o🚀 éé🚀🚀o 🚀 🚀 🚀🚀M Moooo🚀 ééo🚀M 🚀 🚀 M🚀ooooMM o" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x172102ffA64Fa277eB0197358dE3937B91810304" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀oMo M M oéM🚀o🚀 o M🚀 Mééoo éé🚀M oMoéoéoo éoo" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3fea276ffb0c8262fa0b5ab875" + }, + { + "type": "address", + "value": "0x21f94ccFec920E687360DAFfb6437FD22984f95C" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀 🚀🚀 🚀Mééo M éMMooMooéoé 🚀o🚀Mo oéo🚀ooéo🚀🚀Mo🚀MoMooM🚀" + }, + { + "type": "address", + "value": "0xBc645d08bCf0feaD38e23fAF0CB493AFf8bFbAe3" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0A1863054BA70C2ecd4421e8f927a17E09f4e08c" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6D24aF287947B24D4db01481D531A9BD7f080135" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x3bbc06610652E8b012Ed98B17fEfd55D504044FC" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x725C5b91C8b479D1680968B964eC863fCc05ecc8" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 MéoMo M o🚀 éé🚀🚀o 🚀 🚀 🚀🚀M Moooo🚀 ééo🚀M 🚀 🚀 M🚀ooooMM o" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061058d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610339565b60405180910390f35b6100566101fe565b61005e6101fe565b6000815273172102ffa64fa277eb0197358de3937b918103046020820152610084610222565b60006040518060800160405280604f815260200161043b604f91398252506040805160a080820183526060808301526000608083018190526c3fea276ffb0c8262fa0b5ab87560981b83527321f94ccfec920e687360daffb6437fd22984f95c60208085019190915260018486015284519283019094526061808352929390929061048a9083013960608301525073bc645d08bcf0fead38e23faf0cb493aff8bfbae36080820152602082015260006040820152610140610285565b6040805160208082018352730a1863054ba70c2ecd4421e8f927a17e09f4e08c825290835281518082018352736d24af287947b24d4db01481d531a9bd7f08013581528382015281518082018352733bbc06610652e8b012ed98b17fefd55d504044fc8152838301528151808201835273725c5b91c8b479d1680968b964ec863fcc05ecc88152606080850191909152840192909252805160a08101909152606d8082526000926104eb908301396080830152506040820152919050565b604080516060810182526000808252602082015290810161021d610222565b905290565b6040518060a00160405280606081526020016102646040805160a081018252600080825260208201819052918101829052606080820152608081019190915290565b815260006020820152604001610278610285565b8152602001606081525090565b60405180608001604052806004905b6040805160208101909152600081528152602001906001900390816102945790505090565b6000815180845260005b818110156102df576020818501810151868301820152016102c3565b818111156102f1576000602083870101525b50601f01601f19169290920160200192915050565b8060005b6004811015610333578151516001600160a01b031684526020938401939091019060010161030a565b50505050565b6000602080835283511515818401528084015160018060a01b03808216604086015260408601519150606080860152815161010060808701526103806101808701826102b9565b905083830151607f19808884030160a08901526cffffffffffffffffffffffffff60981b8251168352838683015116868401526040820151151560408401526060820151955060a060608401526103da60a08401876102b9565b9550836080830151166080840152604085015193506103fd60c089018515159052565b6060850151935061041160e0890185610306565b6080850151945080888703016101608901525050505061043182826102b9565b9594505050505056fe4d6f6f20c3a9f09f9a806f6ff09f9a806f4d6f204d204d206fc3a94df09f9a806ff09f9a80206f204df09f9a80204dc3a9c3a96f6f20c3a9c3a9f09f9a804d206f4d6fc3a96fc3a96f6f20c3a96f6f4d6f6f20c3a9f09f9a8020f09f9a80f09f9a8020f09f9a804dc3a9c3a96f204d20c3a94d4d6f6f4d6f6fc3a96fc3a920f09f9a806ff09f9a804d6f206fc3a96ff09f9a806f6fc3a96ff09f9a80f09f9a804d6ff09f9a804d6f4d6f6f4df09f9a804d6f6f20c3a9f09f9a80f09f9a80204dc3a96f4d6f204d206ff09f9a8020c3a9c3a9f09f9a80f09f9a806f20f09f9a8020f09f9a8020f09f9a80f09f9a804d204d6f6f6f6ff09f9a8020c3a9c3a96ff09f9a804d20f09f9a8020f09f9a8020204df09f9a806f6f6f6f4d4d206fa26469706673582212202dbe9bbca22c94efe782d549f8a94c24964d9f2bebcb9fd886cc0e6a29b4fb3a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_787766df {\n bytes13 s_0;\n address s_1;\n bool s_2;\n string s_3;\n address s_4;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_917e0a03 {\n string s_0;\n S_787766df s_1;\n bool s_2;\n S_421683f8[4] s_3;\n string s_4;\n }\n\n struct S_a351ffa4 {\n bool s_0;\n address s_1;\n S_917e0a03 s_2;\n }\n\n function test () public pure returns (S_a351ffa4 memory) {\n S_a351ffa4 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x172102ffA64Fa277eB0197358dE3937B91810304;\n r.s_1 = r_1;\n }\n {\n S_917e0a03 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀oo🚀oMo M M oéM🚀o🚀 o M🚀 Mééoo éé🚀M oMoéoéoo éoo\";\n r_2.s_0 = r_2_0;\n }\n {\n S_787766df memory r_2_1;\n {\n bytes13 r_2_1_0 = bytes13(0x3fea276ffb0c8262fa0b5ab875);\n r_2_1.s_0 = r_2_1_0;\n }\n {\n address r_2_1_1 = 0x21f94ccFec920E687360DAFfb6437FD22984f95C;\n r_2_1.s_1 = r_2_1_1;\n }\n {\n bool r_2_1_2 = true;\n r_2_1.s_2 = r_2_1_2;\n }\n {\n string memory r_2_1_3 = unicode\"Moo é🚀 🚀🚀 🚀Mééo M éMMooMooéoé 🚀o🚀Mo oéo🚀ooéo🚀🚀Mo🚀MoMooM🚀\";\n r_2_1.s_3 = r_2_1_3;\n }\n {\n address r_2_1_4 = 0xBc645d08bCf0feaD38e23fAF0CB493AFf8bFbAe3;\n r_2_1.s_4 = r_2_1_4;\n }\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = false;\n r_2.s_2 = r_2_2;\n }\n {\n S_421683f8[4] memory r_2_3;\n {\n S_421683f8 memory r_2_3_0;\n {\n address r_2_3_0_0 = 0x0A1863054BA70C2ecd4421e8f927a17E09f4e08c;\n r_2_3_0.s_0 = r_2_3_0_0;\n }\n r_2_3[0] = r_2_3_0;\n }\n {\n S_421683f8 memory r_2_3_1;\n {\n address r_2_3_1_0 = 0x6D24aF287947B24D4db01481D531A9BD7f080135;\n r_2_3_1.s_0 = r_2_3_1_0;\n }\n r_2_3[1] = r_2_3_1;\n }\n {\n S_421683f8 memory r_2_3_2;\n {\n address r_2_3_2_0 = 0x3bbc06610652E8b012Ed98B17fEfd55D504044FC;\n r_2_3_2.s_0 = r_2_3_2_0;\n }\n r_2_3[2] = r_2_3_2;\n }\n {\n S_421683f8 memory r_2_3_3;\n {\n address r_2_3_3_0 = 0x725C5b91C8b479D1680968B964eC863fCc05ecc8;\n r_2_3_3.s_0 = r_2_3_3_0;\n }\n r_2_3[3] = r_2_3_3;\n }\n r_2.s_3 = r_2_3;\n }\n {\n string memory r_2_4 = unicode\"Moo é🚀🚀 MéoMo M o🚀 éé🚀🚀o 🚀 🚀 🚀🚀M Moooo🚀 ééo🚀M 🚀 🚀 M🚀ooooMM o\";\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000172102ffa64fa277eb0197358de3937b9181030400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1863054ba70c2ecd4421e8f927a17e09f4e08c0000000000000000000000006d24af287947b24d4db01481d531a9bd7f0801350000000000000000000000003bbc06610652e8b012ed98b17fefd55d504044fc000000000000000000000000725c5b91c8b479d1680968b964ec863fcc05ecc800000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a806f6ff09f9a806f4d6f204d204d206fc3a94df09f9a806ff09f9a80206f204df09f9a80204dc3a9c3a96f6f20c3a9c3a9f09f9a804d206f4d6fc3a96fc3a96f6f20c3a96f6f00000000000000000000000000000000003fea276ffb0c8262fa0b5ab8750000000000000000000000000000000000000000000000000000000000000021f94ccfec920e687360daffb6437fd22984f95c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000bc645d08bcf0fead38e23faf0cb493aff8bfbae300000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a8020f09f9a80f09f9a8020f09f9a804dc3a9c3a96f204d20c3a94d4d6f6f4d6f6fc3a96fc3a920f09f9a806ff09f9a804d6f206fc3a96ff09f9a806f6fc3a96ff09f9a80f09f9a804d6ff09f9a804d6f4d6f6f4df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d4d6f6f20c3a9f09f9a80f09f9a80204dc3a96f4d6f204d206ff09f9a8020c3a9c3a9f09f9a80f09f9a806f20f09f9a8020f09f9a8020f09f9a80f09f9a804d204d6f6f6f6ff09f9a8020c3a9c3a96ff09f9a804d20f09f9a8020f09f9a8020204df09f9a806f6f6f6f4d4d206f00000000000000000000000000000000000000" + }, + { + "name": "random-(bytes28,string[],((uint248,bool,int256,string)[],bool,string),bytes25,bytes7)", + "type": "(bytes28,string[],((uint248,bool,int256,string)[],bool,string),bytes25,bytes7)", + "value": [ + "0x194da41db65d9254774a71f779b91cfd805194b8d12c40f67ab34e7e", + [ + "Moo é🚀", + "Moo é🚀 oooéo🚀🚀oMé🚀MoMM🚀o🚀M🚀🚀ooM Méoo🚀oMoooo ooééoo🚀Mo o Moo " + ], + [ + [ + [ + "401015378022104398860763755888174385874389266357697820153282064075580668039", + true, + "-40364074859506343775250920387147162461191345033779266038121599608863197968753", + "Moo é🚀 ooéMéé🚀 ooooéé🚀 o🚀oMoooo🚀🚀Méooé🚀 o" + ], + [ + "173115523164530164094300620272131304498169065650517645511419802772545173417", + true, + "-35422441541893043457408408215283001092863471004099720093264173698427885229251", + "Moo é🚀oo🚀Moé é o🚀🚀éo 🚀oo🚀éMoo o" + ] + ], + true, + "Moo é🚀oééooo 🚀o🚀oMéM 🚀Moé oo🚀🚀M ooMoooé Méoooooé🚀ooooo🚀ooMoéo🚀" + ], + "0xbc7bbf6009df536bda34bb80af5b95a4d0f1d8acd7bac56759", + "0x8901e45f761b23" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x194da41db65d9254774a71f779b91cfd805194b8d12c40f67ab34e7e" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀 oooéo🚀🚀oMé🚀MoMM🚀o🚀M🚀🚀ooM Méoo🚀oMoooo ooééoo🚀Mo o Moo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "401015378022104398860763755888174385874389266357697820153282064075580668039" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-40364074859506343775250920387147162461191345033779266038121599608863197968753" + }, + { + "type": "string", + "value": "Moo é🚀 ooéMéé🚀 ooooéé🚀 o🚀oMoooo🚀🚀Méooé🚀 o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "173115523164530164094300620272131304498169065650517645511419802772545173417" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-35422441541893043457408408215283001092863471004099720093264173698427885229251" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀Moé é o🚀🚀éo 🚀oo🚀éMoo o" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀oééooo 🚀o🚀oMéM 🚀Moé oo🚀🚀M ooMoooé Méoooooé🚀ooooo🚀ooMoéo🚀" + } + ] + }, + { + "type": "hexstring", + "value": "0xbc7bbf6009df536bda34bb80af5b95a4d0f1d8acd7bac56759" + }, + { + "type": "hexstring", + "value": "0x8901e45f761b23" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610749806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104eb565b60405180910390f35b610056610386565b61005e610386565b7f194da41db65d9254774a71f779b91cfd805194b8d12c40f67ab34e7e00000000815260408051600280825260608201909252600091816020015b606081526020019060019003908161009957905050905060006040518060400160405280600a8152602001689adede418753e13f3560b71b815250905080826000815181106100ea576100ea6105b8565b60200260200101819052505060006040518060a001604052806063815260200161064f6063913990508082600181518110610127576101276105b8565b60200260200101819052505080826020018190525050610163604051806060016040528060608152602001600015158152602001606081525090565b60408051600280825260608201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161017b57505060408051608080820183526060808301527ee2f7771119b1adb24f4cf8e347b688a934546d590a9461a8485597c9267887825260016020808401919091527fa6c2be44a4a3389150d01d8216fc1c7fbb186cff51240f03a15a7f45c4e4c68f8385015283519182019093526047808252939450909260009261060890830139606083015250815181908390600090610247576102476105b8565b60200260200101819052505061027c604080516080810182526000808252602082018190529181019190915260608082015290565b7e61fadba20d2b8f2d37c2ad4263441713fe679b64aa68a56169be4a3c0377a9815260016020808301919091527fb1af9bcb9abd095411899077e1135c4dcdaf2f5926ea550dc9f2202b349b6b3d60408084019190915280516060810190915260398082526000926105cf908301396060830152508151819083906001908110610308576103086105b8565b602090810291909101810191909152918352506001828201526040805160a0810190915260628082526000926106b290830139604080840191909152830191909152507fbc7bbf6009df536bda34bb80af5b95a4d0f1d8acd7bac56759000000000000006060820152668901e45f761b2360c81b6080820152919050565b6040518060a00160405280600063ffffffff19168152602001606081526020016103cc604051806060016040528060608152602001600015158152602001606081525090565b815260006020820181905260409091015290565b6000815180845260005b81811015610406576020818501810151868301820152016103ea565b81811115610418576000602083870101525b50601f01601f19169290920160200192915050565b600060608084018351828652818151808452608093508388019150838160051b8901016020808501945060005b838110156104b6578a8303607f19018552855180516001600160f81b0316845282810151151583850152604080820151908501528801518884018890526104a3888501826103e0565b968301969583019593505060010161045a565b50888101518015158b8301529650506040880151955088810360408a01526104de81876103e0565b9998505050505050505050565b6000602080835260c0830163ffffffff19855116828501528185015160a0604086015281815180845260e08701915060e08160051b8801019350848301925060005b8181101561055b5760df198886030183526105498585516103e0565b9450928501929185019160010161052d565b505050506040850151848203601f19016060860152915061057c818361042d565b915050606084015161059a608085018266ffffffffffffff19169052565b5060808401516001600160c81b0319811660a0850152509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6ff09f9a804d6fc3a920c3a9206ff09f9a80f09f9a80c3a96f20f09f9a806f6ff09f9a80c3a94d6f6f202020206f4d6f6f20c3a9f09f9a80206f6fc3a94dc3a9c3a9f09f9a80206f6f6f6fc3a9c3a9f09f9a80206ff09f9a806f4d6f6f6f6ff09f9a80f09f9a804dc3a96f6fc3a9f09f9a8020206f4d6f6f20c3a9f09f9a80206f6f6fc3a96ff09f9a80f09f9a806f4dc3a9f09f9a804d6f4d4df09f9a806ff09f9a804df09f9a80f09f9a806f6f4d202020204dc3a96f6ff09f9a806f4d6f6f6f6f206f6fc3a9c3a96f6ff09f9a804d6f206f204d6f6f204d6f6f20c3a9f09f9a806fc3a9c3a96f6f6f20f09f9a806ff09f9a806f4dc3a94d20f09f9a804d6fc3a9206f6ff09f9a80f09f9a804d206f6f4d6f6f6fc3a9204dc3a96f6f6f6f6fc3a9f09f9a806f6f6f6f6ff09f9a806f6f4d6fc3a96ff09f9a80a2646970667358221220b05cdbe7af392f1a6df52b4ad8637217dd0db3b9486c328e6e6cf2dc5786792564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4330d10b {\n uint248 s_0;\n bool s_1;\n int256 s_2;\n string s_3;\n }\n\n struct S_32e24d42 {\n S_4330d10b[] s_0;\n bool s_1;\n string s_2;\n }\n\n struct S_b899f5d7 {\n bytes28 s_0;\n string[] s_1;\n S_32e24d42 s_2;\n bytes25 s_3;\n bytes7 s_4;\n }\n\n function test () public pure returns (S_b899f5d7 memory) {\n S_b899f5d7 memory r;\n {\n bytes28 r_0 = bytes28(0x194da41db65d9254774a71f779b91cfd805194b8d12c40f67ab34e7e);\n r.s_0 = r_0;\n }\n {\n string[] memory r_1 = new string[](2);\n {\n string memory r_1_0 = unicode\"Moo é🚀\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀 oooéo🚀🚀oMé🚀MoMM🚀o🚀M🚀🚀ooM Méoo🚀oMoooo ooééoo🚀Mo o Moo \";\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n S_32e24d42 memory r_2;\n {\n S_4330d10b[] memory r_2_0 = new S_4330d10b[](2);\n {\n S_4330d10b memory r_2_0_0;\n {\n uint248 r_2_0_0_0 = 401015378022104398860763755888174385874389266357697820153282064075580668039;\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n bool r_2_0_0_1 = true;\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n int256 r_2_0_0_2 = -40364074859506343775250920387147162461191345033779266038121599608863197968753;\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n {\n string memory r_2_0_0_3 = unicode\"Moo é🚀 ooéMéé🚀 ooooéé🚀 o🚀oMoooo🚀🚀Méooé🚀 o\";\n r_2_0_0.s_3 = r_2_0_0_3;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n S_4330d10b memory r_2_0_1;\n {\n uint248 r_2_0_1_0 = 173115523164530164094300620272131304498169065650517645511419802772545173417;\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n {\n bool r_2_0_1_1 = true;\n r_2_0_1.s_1 = r_2_0_1_1;\n }\n {\n int256 r_2_0_1_2 = -35422441541893043457408408215283001092863471004099720093264173698427885229251;\n r_2_0_1.s_2 = r_2_0_1_2;\n }\n {\n string memory r_2_0_1_3 = unicode\"Moo é🚀oo🚀Moé é o🚀🚀éo 🚀oo🚀éMoo o\";\n r_2_0_1.s_3 = r_2_0_1_3;\n }\n r_2_0[1] = r_2_0_1;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀oééooo 🚀o🚀oMéM 🚀Moé oo🚀🚀M ooMoooé Méoooooé🚀ooooo🚀ooMoéo🚀\";\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n bytes25 r_3 = bytes25(0xbc7bbf6009df536bda34bb80af5b95a4d0f1d8acd7bac56759);\n r.s_3 = r_3;\n }\n {\n bytes7 r_4 = bytes7(0x8901e45f761b23);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020194da41db65d9254774a71f779b91cfd805194b8d12c40f67ab34e7e0000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e0bc7bbf6009df536bda34bb80af5b95a4d0f1d8acd7bac56759000000000000008901e45f761b2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80206f6f6fc3a96ff09f9a80f09f9a806f4dc3a9f09f9a804d6f4d4df09f9a806ff09f9a804df09f9a80f09f9a806f6f4d202020204dc3a96f6ff09f9a806f4d6f6f6f6f206f6fc3a9c3a96f6ff09f9a804d6f206f204d6f6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000014000e2f7771119b1adb24f4cf8e347b688a934546d590a9461a8485597c92678870000000000000000000000000000000000000000000000000000000000000001a6c2be44a4a3389150d01d8216fc1c7fbb186cff51240f03a15a7f45c4e4c68f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a80206f6fc3a94dc3a9c3a9f09f9a80206f6f6f6fc3a9c3a9f09f9a80206ff09f9a806f4d6f6f6f6ff09f9a80f09f9a804dc3a96f6fc3a9f09f9a8020206f000000000000000000000000000000000000000000000000000061fadba20d2b8f2d37c2ad4263441713fe679b64aa68a56169be4a3c0377a90000000000000000000000000000000000000000000000000000000000000001b1af9bcb9abd095411899077e1135c4dcdaf2f5926ea550dc9f2202b349b6b3d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f6ff09f9a804d6fc3a920c3a9206ff09f9a80f09f9a80c3a96f20f09f9a806f6ff09f9a80c3a94d6f6f202020206f0000000000000000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806fc3a9c3a96f6f6f20f09f9a806ff09f9a806f4dc3a94d20f09f9a804d6fc3a9206f6ff09f9a80f09f9a804d206f6f4d6f6f6fc3a9204dc3a96f6f6f6f6fc3a9f09f9a806f6f6f6f6ff09f9a806f6f4d6fc3a96ff09f9a80000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,(int120,(string,(int208,string,string),address,bool,bytes25),string,bool),address)", + "type": "(string,(int120,(string,(int208,string,string),address,bool,bytes25),string,bool),address)", + "value": [ + "Moo é🚀oM🚀🚀 M MooMoéoéM", + [ + "531855114598017168984700979908517665", + [ + "Moo é🚀oéMMé 🚀oM🚀🚀MM🚀ééo🚀oé 🚀oMéo🚀MooéooMééM o", + [ + "-185896814398313512195683385651623969601986235873041182342443560", + "Moo é🚀M🚀ooo oéMoo éoééM🚀🚀éo", + "Moo é🚀o oooé éé🚀oé🚀 Mo🚀🚀oooMé oo 🚀oo 🚀oééo🚀🚀 🚀oMo" + ], + "0x3226acA84e93aFC4Dbc1b842ED827ce11Bd8Ec70", + false, + "0x013833d3b6370139fc98634016ddf0f49f1dba1d50eaebb001" + ], + "Moo é🚀oMéoéo 🚀o🚀 Mo", + true + ], + "0x9EF884e6Ab1aC83627497EcE2346A1c7488d9281" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM🚀🚀 M MooMoéoéM" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "531855114598017168984700979908517665" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéMMé 🚀oM🚀🚀MM🚀ééo🚀oé 🚀oMéo🚀MooéooMééM o" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-185896814398313512195683385651623969601986235873041182342443560" + }, + { + "type": "string", + "value": "Moo é🚀M🚀ooo oéMoo éoééM🚀🚀éo" + }, + { + "type": "string", + "value": "Moo é🚀o oooé éé🚀oé🚀 Mo🚀🚀oooMé oo 🚀oo 🚀oééo🚀🚀 🚀oMo" + } + ] + }, + { + "type": "address", + "value": "0x3226acA84e93aFC4Dbc1b842ED827ce11Bd8Ec70" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x013833d3b6370139fc98634016ddf0f49f1dba1d50eaebb001" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMéoéo 🚀o🚀 Mo" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x9EF884e6Ab1aC83627497EcE2346A1c7488d9281" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610549806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102f2565b60405180910390f35b6100566101f9565b61005e6101f9565b600060405180606001604052806022815260200161041e60229139825250610084610220565b6e666e7b507aa608e50909abbdad1f21815261009e610251565b60006040518060800160405280604f815260200161046d604f9139825250604080516060808201835260208083018290528284018290527973af1235ba5f0172782aaefef079e21911d26c1c57d369daf2271983528351918201909352602d8082529192600092906104409083013990508082602001819052505060006040518060800160405280605881526020016104bc60589139604080840191909152602080850193909352733226aca84e93afc4dbc1b842ed827ce11bd8ec708482015260006060808601919091527f013833d3b6370139fc98634016ddf0f49f1dba1d50eaebb0010000000000000060808601528584019490945280518082018252601f81527f4d6f6f20c3a9f09f9a806f4dc3a96fc3a96f20f09f9a806ff09f9a80204d6f00818501528582015260019385019390935250830191909152739ef884e6ab1ac83627497ece2346a1c7488d928190820152919050565b604051806060016040528060608152602001610213610220565b8152600060209091015290565b60405180608001604052806000600e0b815260200161023d610251565b815260606020820152600060409091015290565b6040518060a001604052806060815260200161028a6040518060600160405280600060190b815260200160608152602001606081525090565b81526000602082018190526040820181905260609091015290565b6000815180845260005b818110156102cb576020818501810151868301820152016102af565b818111156102dd576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516060808386015261030f60808601836102a5565b9150828601516040601f1987850301818801528151600e0b845284820151608086860152805160a0608087015261034a6101208701826102a5565b905086820151607f198783030160a0880152805160190b8252878101518689840152610378878401826102a5565b9850508381015190508188038483015261039288826102a5565b97505050818101516103af60c08701826001600160a01b03169052565b5083810151151560e08601526080015166ffffffffffffff191661010085015281810151848603828601526103e486826102a5565b92840151801515868601529295506103f99050565b8701516001600160a01b0381168388015292506104139050565b509094935050505056fe4d6f6f20c3a9f09f9a806f4df09f9a80f09f9a80204d204d6f6f4d6fc3a96fc3a94d4d6f6f20c3a9f09f9a804df09f9a806f6f6f206fc3a94d6f6f20c3a96fc3a9c3a94df09f9a80f09f9a80c3a96f4d6f6f20c3a9f09f9a806fc3a94d4dc3a920f09f9a806f4df09f9a80f09f9a804d4df09f9a80c3a9c3a96ff09f9a806fc3a920f09f9a806f4dc3a96ff09f9a804d6f6fc3a96f6f4dc3a9c3a94d206f4d6f6f20c3a9f09f9a806f206f6f6fc3a920c3a9c3a9f09f9a806fc3a9f09f9a80204d6ff09f9a80f09f9a806f6f6f4dc3a9206f6f2020f09f9a806f6f20f09f9a806fc3a9c3a96ff09f9a80f09f9a8020f09f9a806f4d6fa26469706673582212202329abd3a08316101e7be6af74c826eb579ea4c92198e8bbdce102c6baffe77a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3abede73 {\n int208 s_0;\n string s_1;\n string s_2;\n }\n\n struct S_f55c1821 {\n string s_0;\n S_3abede73 s_1;\n address s_2;\n bool s_3;\n bytes25 s_4;\n }\n\n struct S_16f2af57 {\n int120 s_0;\n S_f55c1821 s_1;\n string s_2;\n bool s_3;\n }\n\n struct S_9fbfb308 {\n string s_0;\n S_16f2af57 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_9fbfb308 memory) {\n S_9fbfb308 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oM🚀🚀 M MooMoéoéM\";\n r.s_0 = r_0;\n }\n {\n S_16f2af57 memory r_1;\n {\n int120 r_1_0 = 531855114598017168984700979908517665;\n r_1.s_0 = r_1_0;\n }\n {\n S_f55c1821 memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀oéMMé 🚀oM🚀🚀MM🚀ééo🚀oé 🚀oMéo🚀MooéooMééM o\";\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_3abede73 memory r_1_1_1;\n {\n int208 r_1_1_1_0 = -185896814398313512195683385651623969601986235873041182342443560;\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n {\n string memory r_1_1_1_1 = unicode\"Moo é🚀M🚀ooo oéMoo éoééM🚀🚀éo\";\n r_1_1_1.s_1 = r_1_1_1_1;\n }\n {\n string memory r_1_1_1_2 = unicode\"Moo é🚀o oooé éé🚀oé🚀 Mo🚀🚀oooMé oo 🚀oo 🚀oééo🚀🚀 🚀oMo\";\n r_1_1_1.s_2 = r_1_1_1_2;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x3226acA84e93aFC4Dbc1b842ED827ce11Bd8Ec70;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bool r_1_1_3 = false;\n r_1_1.s_3 = r_1_1_3;\n }\n {\n bytes25 r_1_1_4 = bytes25(0x013833d3b6370139fc98634016ddf0f49f1dba1d50eaebb001);\n r_1_1.s_4 = r_1_1_4;\n }\n r_1.s_1 = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀oMéoéo 🚀o🚀 Mo\";\n r_1.s_2 = r_1_2;\n }\n {\n bool r_1_3 = true;\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0x9EF884e6Ab1aC83627497EcE2346A1c7488d9281;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009ef884e6ab1ac83627497ece2346a1c7488d928100000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806f4df09f9a80f09f9a80204d204d6f6f4d6fc3a96fc3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666e7b507aa608e50909abbdad1f21000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000003226aca84e93afc4dbc1b842ed827ce11bd8ec700000000000000000000000000000000000000000000000000000000000000000013833d3b6370139fc98634016ddf0f49f1dba1d50eaebb00100000000000000000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a806fc3a94d4dc3a920f09f9a806f4df09f9a80f09f9a804d4df09f9a80c3a9c3a96ff09f9a806fc3a920f09f9a806f4dc3a96ff09f9a804d6f6fc3a96f6f4dc3a9c3a94d206f0000000000000000000000000000000000ffffffffffff8c50edca45a0fe8d87d551010f861de6ee2d93e3a82c96250dd8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a804df09f9a806f6f6f206fc3a94d6f6f20c3a96fc3a9c3a94df09f9a80f09f9a80c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806f206f6f6fc3a920c3a9c3a9f09f9a806fc3a9f09f9a80204d6ff09f9a80f09f9a806f6f6f4dc3a9206f6f2020f09f9a806f6f20f09f9a806fc3a9c3a96ff09f9a80f09f9a8020f09f9a806f4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a806f4dc3a96fc3a96f20f09f9a806ff09f9a80204d6f00" + }, + { + "name": "random-(string,address,bytes14,(int56[][4][],bytes9,bytes22,address[4]),string)", + "type": "(string,address,bytes14,(int56[][4][],bytes9,bytes22,address[4]),string)", + "value": [ + "Moo é🚀M🚀Mooéé oéM🚀 MMMo🚀", + "0x104367F2FA8038FF71B4f7BB407D66c219850744", + "0x17d22ce9719fb2abb8027cd49be8", + [ + [ + [ + ["7530800189719971", "30875116760874103", "-5225657614429538"], + [], + ["-13238957600360282", "35850646835034921", "-22148944263065629"], + [] + ], + [ + ["-9304579260559729"], + ["-17990213913830372"], + ["-27516062887780094", "30538448961612096", "-22874494097027858"], + [] + ] + ], + "0xa01b498325108b0060", + "0x50c907709c6f7f4f407e2f34421db590051debc756d6", + [ + "0x53C9E2102a1B3DDF6568bcc65903Ef68ec1D75bC", + "0x3A4679F94CDEe79916876D8a71F69Ba443bBDD4A", + "0x48C75603B617c86DC1886e66fEE17DbeE28c2E2b", + "0x3f29c882104500D6f497BB94adE2DE5720A9F5d2" + ] + ], + "Moo é🚀MMoéoéo oéMMMo éooo🚀o🚀Méé🚀éoMMoooé 🚀ééoéM🚀é oooooé " + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M🚀Mooéé oéM🚀 MMMo🚀" + }, + { + "type": "address", + "value": "0x104367F2FA8038FF71B4f7BB407D66c219850744" + }, + { + "type": "hexstring", + "value": "0x17d22ce9719fb2abb8027cd49be8" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "7530800189719971" + }, + { + "type": "number", + "value": "30875116760874103" + }, + { + "type": "number", + "value": "-5225657614429538" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-13238957600360282" + }, + { + "type": "number", + "value": "35850646835034921" + }, + { + "type": "number", + "value": "-22148944263065629" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-9304579260559729" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-17990213913830372" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-27516062887780094" + }, + { + "type": "number", + "value": "30538448961612096" + }, + { + "type": "number", + "value": "-22874494097027858" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xa01b498325108b0060" + }, + { + "type": "hexstring", + "value": "0x50c907709c6f7f4f407e2f34421db590051debc756d6" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x53C9E2102a1B3DDF6568bcc65903Ef68ec1D75bC" + }, + { + "type": "address", + "value": "0x3A4679F94CDEe79916876D8a71F69Ba443bBDD4A" + }, + { + "type": "address", + "value": "0x48C75603B617c86DC1886e66fEE17DbeE28c2E2b" + }, + { + "type": "address", + "value": "0x3f29c882104500D6f497BB94adE2DE5720A9F5d2" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MMoéoéo oéMMMo éooo🚀o🚀Méé🚀éoMMoooé 🚀ééoéM🚀é oooooé " + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610911806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906106bc565b60405180910390f35b61005661056c565b61005e61056c565b600060405180606001604052806028815260200161085a6028913982525073104367f2fa8038ff71b4f7bb407d66c21985074460208201526d02fa459d2e33f65577004f9a937d60931b60408201526100b56105b4565b60408051600280825260608201909252600091816020015b6100d56105f8565b8152602001906001900390816100cd5790505090506100f26105f8565b60408051600380825260808201909252600091602082016060803683370190505090506000661ac1390e2ec5a39050808260008151811061013557610135610843565b602002602001019060060b908160060b81525050506000666db0c14eee3c779050808260018151811061016a5761016a610843565b602002602001019060060b908160060b81525050506000661290b539d36d6119905080826002815181106101a0576101a0610843565b60069290920b60209283029190910182015291835250604080516000808252928101909152602083015250604080516003808252608082019092526000918160200160208202803683370190505090506000662f08c304f74759199050808260008151811061021157610211610843565b602002602001019060060b908160060b81525050506000667f5df92d91fb299050808260018151811061024657610246610843565b602002602001019060060b908160060b81525050506000664eb058f2f3301c199050808260028151811061027c5761027c610843565b60069290920b602092830291909101820152604084810193909352825160008082529181019093526060840192909252508251829184916102bf576102bf610843565b6020026020010181905250506102d36105f8565b60408051600180825281830190925260009160208083019080368337019050509050600066210e772d9c3170199050808260008151811061031657610316610843565b60069290920b602092830291909101909101525081526040805160018082528183019092526000918160200160208202803683370190505090506000663fea0115c463e3199050808260008151811061037157610371610843565b60069290920b602092830291909101820152830191909152506040805160038082526080820190925260009181602001602082028036833701905050905060006661c1b6a20b1efd19905080826000815181106103d0576103d0610843565b602002602001019060060b908160060b81525050506000666c7e8eba5929409050808260018151811061040557610405610843565b602002602001019060060b908160060b815250505060006651443b2f11f311199050808260028151811061043b5761043b610843565b60069290920b602092830291909101820152604084810193909352825160008152908101909252506060820152815181908390600190811061047f5761047f610843565b60209081029190910181019190915291835250680500da4c192884580360bd1b9082015275286483b84e37bfa7a03f179a210edac8028ef5e3ab6b60511b60408201526104ca61061f565b7353c9e2102a1b3ddf6568bcc65903ef68ec1d75bc8152733a4679f94cdee79916876d8a71f69ba443bbdd4a6020808301919091527348c75603b617c86dc1886e66fee17dbee28c2e2b604080840191909152733f29c882104500d6f497bb94ade2de5720a9f5d26060808501919091528481019390935291840192909252805160808101909152605a80825260009261088290830139608083015250919050565b6040518060a001604052806060815260200160006001600160a01b0316815260200160006001600160901b03191681526020016105a76105b4565b8152602001606081525090565b60405180608001604052806060815260200160006001600160b81b0319168152602001600069ffffffffffffffffffff191681526020016105f361061f565b905290565b60405180608001604052806004905b60608152602001906001900390816106075790505090565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b8181101561066357602081850181015186830182015201610647565b81811115610675576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60048110156106b65781516001600160a01b031684526020938401939091019060010161068e565b50505050565b602081526000825160a060208401526106d860c084018261063d565b905060018060a01b0360208501511660408401526001600160901b031960408501511660608401526060840151601f1980858403016080860152815160e0845260e084018151808252610100860191506101008160051b87010160208401935060005b828110156107c85787820360ff190184528451826080810160005b60048110156107b05785820383528351805180845260209182019184019060005b8181101561079857835160060b835260209384019390920191600101610777565b50506020958601959490940193925050600101610756565b5060209788019796909601959350505060010161073b565b50602086015193506107e660208801856001600160b81b0319169052565b60408601519350610806604088018569ffffffffffffffffffff19169052565b6060860151955061081a606088018761068a565b60808a01519650848982030160a08a0152610835818861063d565b9a9950505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804df09f9a804d6f6fc3a9c3a9206fc3a94df09f9a80204d4d4d6ff09f9a804d6f6f20c3a9f09f9a804d4d6fc3a96fc3a96f206fc3a94d4d4d6f20c3a96f6f6ff09f9a806ff09f9a804dc3a9c3a9f09f9a80c3a96f4d4d6f6f6fc3a92020f09f9a80c3a9c3a96fc3a94df09f9a80c3a9206f6f6f6f6fc3a920a26469706673582212201c47375be3db7ced54c968245ed1d2794163f3b7b181da72b818e68288713efc64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_fd52c40a {\n int56[][4][] s_0;\n bytes9 s_1;\n bytes22 s_2;\n address[4] s_3;\n }\n\n struct S_801eb5b9 {\n string s_0;\n address s_1;\n bytes14 s_2;\n S_fd52c40a s_3;\n string s_4;\n }\n\n function test () public pure returns (S_801eb5b9 memory) {\n S_801eb5b9 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀M🚀Mooéé oéM🚀 MMMo🚀\";\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x104367F2FA8038FF71B4f7BB407D66c219850744;\n r.s_1 = r_1;\n }\n {\n bytes14 r_2 = bytes14(0x17d22ce9719fb2abb8027cd49be8);\n r.s_2 = r_2;\n }\n {\n S_fd52c40a memory r_3;\n {\n int56[][4][] memory r_3_0 = new int56[][4][](2);\n {\n int56[][4] memory r_3_0_0;\n {\n int56[] memory r_3_0_0_0 = new int56[](3);\n {\n int56 r_3_0_0_0_0 = 7530800189719971;\n r_3_0_0_0[0] = r_3_0_0_0_0;\n }\n {\n int56 r_3_0_0_0_1 = 30875116760874103;\n r_3_0_0_0[1] = r_3_0_0_0_1;\n }\n {\n int56 r_3_0_0_0_2 = -5225657614429538;\n r_3_0_0_0[2] = r_3_0_0_0_2;\n }\n r_3_0_0[0] = r_3_0_0_0;\n }\n {\n int56[] memory r_3_0_0_1 = new int56[](0);\n r_3_0_0[1] = r_3_0_0_1;\n }\n {\n int56[] memory r_3_0_0_2 = new int56[](3);\n {\n int56 r_3_0_0_2_0 = -13238957600360282;\n r_3_0_0_2[0] = r_3_0_0_2_0;\n }\n {\n int56 r_3_0_0_2_1 = 35850646835034921;\n r_3_0_0_2[1] = r_3_0_0_2_1;\n }\n {\n int56 r_3_0_0_2_2 = -22148944263065629;\n r_3_0_0_2[2] = r_3_0_0_2_2;\n }\n r_3_0_0[2] = r_3_0_0_2;\n }\n {\n int56[] memory r_3_0_0_3 = new int56[](0);\n r_3_0_0[3] = r_3_0_0_3;\n }\n r_3_0[0] = r_3_0_0;\n }\n {\n int56[][4] memory r_3_0_1;\n {\n int56[] memory r_3_0_1_0 = new int56[](1);\n {\n int56 r_3_0_1_0_0 = -9304579260559729;\n r_3_0_1_0[0] = r_3_0_1_0_0;\n }\n r_3_0_1[0] = r_3_0_1_0;\n }\n {\n int56[] memory r_3_0_1_1 = new int56[](1);\n {\n int56 r_3_0_1_1_0 = -17990213913830372;\n r_3_0_1_1[0] = r_3_0_1_1_0;\n }\n r_3_0_1[1] = r_3_0_1_1;\n }\n {\n int56[] memory r_3_0_1_2 = new int56[](3);\n {\n int56 r_3_0_1_2_0 = -27516062887780094;\n r_3_0_1_2[0] = r_3_0_1_2_0;\n }\n {\n int56 r_3_0_1_2_1 = 30538448961612096;\n r_3_0_1_2[1] = r_3_0_1_2_1;\n }\n {\n int56 r_3_0_1_2_2 = -22874494097027858;\n r_3_0_1_2[2] = r_3_0_1_2_2;\n }\n r_3_0_1[2] = r_3_0_1_2;\n }\n {\n int56[] memory r_3_0_1_3 = new int56[](0);\n r_3_0_1[3] = r_3_0_1_3;\n }\n r_3_0[1] = r_3_0_1;\n }\n r_3.s_0 = r_3_0;\n }\n {\n bytes9 r_3_1 = bytes9(0xa01b498325108b0060);\n r_3.s_1 = r_3_1;\n }\n {\n bytes22 r_3_2 = bytes22(0x50c907709c6f7f4f407e2f34421db590051debc756d6);\n r_3.s_2 = r_3_2;\n }\n {\n address[4] memory r_3_3;\n {\n address r_3_3_0 = 0x53C9E2102a1B3DDF6568bcc65903Ef68ec1D75bC;\n r_3_3[0] = r_3_3_0;\n }\n {\n address r_3_3_1 = 0x3A4679F94CDEe79916876D8a71F69Ba443bBDD4A;\n r_3_3[1] = r_3_3_1;\n }\n {\n address r_3_3_2 = 0x48C75603B617c86DC1886e66fEE17DbeE28c2E2b;\n r_3_3[2] = r_3_3_2;\n }\n {\n address r_3_3_3 = 0x3f29c882104500D6f497BB94adE2DE5720A9F5d2;\n r_3_3[3] = r_3_3_3;\n }\n r_3.s_3 = r_3_3;\n }\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀MMoéoéo oéMMMo éooo🚀o🚀Méé🚀éoMMoooé 🚀ééoéM🚀é oooooé \";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000104367f2fa8038ff71b4f7bb407d66c21985074417d22ce9719fb2abb8027cd49be8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a804df09f9a804d6f6fc3a9c3a9206fc3a94df09f9a80204d4d4d6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0a01b498325108b0060000000000000000000000000000000000000000000000050c907709c6f7f4f407e2f34421db590051debc756d60000000000000000000000000000000000000000000053c9e2102a1b3ddf6568bcc65903ef68ec1d75bc0000000000000000000000003a4679f94cdee79916876d8a71f69ba443bbdd4a00000000000000000000000048c75603b617c86dc1886e66fee17dbee28c2e2b0000000000000000000000003f29c882104500d6f497bb94ade2de5720a9f5d200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000001ac1390e2ec5a3000000000000000000000000000000000000000000000000006db0c14eee3c77ffffffffffffffffffffffffffffffffffffffffffffffffffed6f4ac62c929e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffffd0f73cfb08b8a6000000000000000000000000000000000000000000000000007f5df92d91fb29ffffffffffffffffffffffffffffffffffffffffffffffffffb14fa70d0ccfe30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffdef188d263ce8f0000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffc015feea3b9c1c0000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffff9e3e495df4e102000000000000000000000000000000000000000000000000006c7e8eba592940ffffffffffffffffffffffffffffffffffffffffffffffffffaebbc4d0ee0cee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a804d4d6fc3a96fc3a96f206fc3a94d4d4d6f20c3a96f6f6ff09f9a806ff09f9a804dc3a9c3a9f09f9a80c3a96f4d4d6f6f6fc3a92020f09f9a80c3a9c3a96fc3a94df09f9a80c3a9206f6f6f6f6fc3a920000000000000" + }, + { + "name": "random-(uint88,bool,int40,(bool[3],bytes6[],bool,address,bytes29),int56)[3]", + "type": "(uint88,bool,int40,(bool[3],bytes6[],bool,address,bytes29),int56)[3]", + "value": [ + [ + "232150326787712383552243143", + true, + "165568683268", + [ + [true, false, true], + ["0x4c83c0c47390", "0x048b2e0b7ed9"], + false, + "0xcE09E1495646A01ae6F8086127c315fa9051F522", + "0x251ddaf3077e20861fc136b496770ec194edd514ea66c85eb3e4ae9d0c" + ], + "-18639727568260225" + ], + [ + "190622864428665519077494383", + true, + "-378223391919", + [ + [true, false, true], + ["0xb61b6f4c8202", "0xc633c927173b", "0x92c0866c1614"], + false, + "0x66f8433078EeD90DEF346128E4ee98f28bB417eB", + "0xab16ac4ca9e2a4a1c543e4238124d08d9285b6697944931b9f3f93df7a" + ], + "-35502381771201321" + ], + [ + "234415786066037235545498268", + true, + "102166238728", + [ + [true, false, true], + [], + true, + "0x4d3aE6C5874D583870C8E374D5AbE9e1f26ce554", + "0xf3130563bf7975c57e72574c44ae0f9582fc646f1e5d63c629f6f26cda" + ], + "16359848424701014" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "232150326787712383552243143" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "165568683268" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4c83c0c47390" + }, + { + "type": "hexstring", + "value": "0x048b2e0b7ed9" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xcE09E1495646A01ae6F8086127c315fa9051F522" + }, + { + "type": "hexstring", + "value": "0x251ddaf3077e20861fc136b496770ec194edd514ea66c85eb3e4ae9d0c" + } + ] + }, + { + "type": "number", + "value": "-18639727568260225" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "190622864428665519077494383" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-378223391919" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb61b6f4c8202" + }, + { + "type": "hexstring", + "value": "0xc633c927173b" + }, + { + "type": "hexstring", + "value": "0x92c0866c1614" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x66f8433078EeD90DEF346128E4ee98f28bB417eB" + }, + { + "type": "hexstring", + "value": "0xab16ac4ca9e2a4a1c543e4238124d08d9285b6697944931b9f3f93df7a" + } + ] + }, + { + "type": "number", + "value": "-35502381771201321" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "234415786066037235545498268" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "102166238728" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x4d3aE6C5874D583870C8E374D5AbE9e1f26ce554" + }, + { + "type": "hexstring", + "value": "0xf3130563bf7975c57e72574c44ae0f9582fc646f1e5d63c629f6f26cda" + } + ] + }, + { + "type": "number", + "value": "16359848424701014" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061067f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061050f565b60405180910390f35b610056610413565b61005e610413565b610066610440565b6ac007be6eacb64ec9e6c5c781526001602082015264268ca99d04604082015261008e610476565b6100966104ac565b6001808252600060208301819052604080840192909252918352805160028082526060820190925290816020016020820280368337505081519192506504c83c0c473960d41b9182915083906000906100f1576100f1610633565b6001600160d01b03199092166020928302919091019091015250805165048b2e0b7ed960d01b9081908390600190811061012d5761012d610633565b6001600160d01b031992909216602092830291909101820152830191909152506000604082015273ce09e1495646a01ae6f8086127c315fa9051f5226060808301919091527f251ddaf3077e20861fc136b496770ec194edd514ea66c85eb3e4ae9d0c00000060808084019190915290830191909152664238bbc46a8c80199082015281526101ba610440565b6a9dadf62fdbda7a10528e6f81526001602082015264580fdef4ae1960408201526101e3610476565b6101eb6104ac565b600180825260006020830181905260408084019290925291835280516003808252608082019092529081602001602082028036833750508151919250655b0db7a6410160d11b91829150839060009061024657610246610633565b6001600160d01b03199092166020928302919091019091015250805165c633c927173b60d01b9081908390600190811061028257610282610633565b6001600160d01b0319909216602092830291909101909101525080516524b0219b058560d21b908190839060029081106102be576102be610633565b6001600160d01b031990921660209283029190910182015283019190915250600060408201527366f8433078eed90def346128e4ee98f28bb417eb6060808301919091527fab16ac4ca9e2a4a1c543e4238124d08d9285b6697944931b9f3f93df7a00000060808084019190915290830191909152667e213a66271b28199082015280826001602002015250610352610440565b6ac1e77939d395150f0b629c8152600160208201526417c9951608604082015261037a610476565b6103826104ac565b60018082526000602080840182905260408085018490529385528351918252818101845284015282820152734d3ae6c5874d583870c8e374d5abe9e1f26ce5546060808401919091527ff3130563bf7975c57e72574c44ae0f9582fc646f1e5d63c629f6f26cda00000060808085019190915290840192909252663a1f3209eefc5691830191909152820152919050565b60405180606001604052806003905b61042a610440565b8152602001906001900390816104225790505090565b6040805160a0810182526000808252602082018190529181019190915260608101610469610476565b8152600060209091015290565b6040518060a001604052806104896104ac565b815260606020820181905260006040830181905290820181905260809091015290565b60405180606001604052806003906020820280368337509192915050565b600081518084526020808501945080840160005b838110156105045781516001600160d01b031916875295820195908201906001016104de565b509495945050505050565b602080825260009060808382018185018685805b60038082106105325750610625565b898503601f19018652835180516affffffffffffffffffffff1686528881015115158987015260408082015160040b8188015260608083015160a0828a018190528151938893909290918b015b8785101561059f57855115158152948e0194600194909401938e0161057f565b508d810151965060e06101008c01526105bc6101808c01886104ca565b96508281015194506105d36101208c018615159052565b908101516001600160a01b03166101408b01528b015162ffffff1981166101608b01529250610600915050565b508701516106128689018260060b9052565b5094870194935091860191600101610523565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfea264697066735822122026937ed86c1fdeb5cb43424e2e6f247c6decc4d660b9e06bc4d3bb52d36e1fe364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2b615a37 {\n bool[3] s_0;\n bytes6[] s_1;\n bool s_2;\n address s_3;\n bytes29 s_4;\n }\n\n struct S_be987d86 {\n uint88 s_0;\n bool s_1;\n int40 s_2;\n S_2b615a37 s_3;\n int56 s_4;\n }\n\n function test () public pure returns (S_be987d86[3] memory) {\n S_be987d86[3] memory r;\n {\n S_be987d86 memory r_0;\n {\n uint88 r_0_0 = 232150326787712383552243143;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n int40 r_0_2 = 165568683268;\n r_0.s_2 = r_0_2;\n }\n {\n S_2b615a37 memory r_0_3;\n {\n bool[3] memory r_0_3_0;\n {\n bool r_0_3_0_0 = true;\n r_0_3_0[0] = r_0_3_0_0;\n }\n {\n bool r_0_3_0_1 = false;\n r_0_3_0[1] = r_0_3_0_1;\n }\n {\n bool r_0_3_0_2 = true;\n r_0_3_0[2] = r_0_3_0_2;\n }\n r_0_3.s_0 = r_0_3_0;\n }\n {\n bytes6[] memory r_0_3_1 = new bytes6[](2);\n {\n bytes6 r_0_3_1_0 = bytes6(0x4c83c0c47390);\n r_0_3_1[0] = r_0_3_1_0;\n }\n {\n bytes6 r_0_3_1_1 = bytes6(0x048b2e0b7ed9);\n r_0_3_1[1] = r_0_3_1_1;\n }\n r_0_3.s_1 = r_0_3_1;\n }\n {\n bool r_0_3_2 = false;\n r_0_3.s_2 = r_0_3_2;\n }\n {\n address r_0_3_3 = 0xcE09E1495646A01ae6F8086127c315fa9051F522;\n r_0_3.s_3 = r_0_3_3;\n }\n {\n bytes29 r_0_3_4 = bytes29(0x251ddaf3077e20861fc136b496770ec194edd514ea66c85eb3e4ae9d0c);\n r_0_3.s_4 = r_0_3_4;\n }\n r_0.s_3 = r_0_3;\n }\n {\n int56 r_0_4 = -18639727568260225;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_be987d86 memory r_1;\n {\n uint88 r_1_0 = 190622864428665519077494383;\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n int40 r_1_2 = -378223391919;\n r_1.s_2 = r_1_2;\n }\n {\n S_2b615a37 memory r_1_3;\n {\n bool[3] memory r_1_3_0;\n {\n bool r_1_3_0_0 = true;\n r_1_3_0[0] = r_1_3_0_0;\n }\n {\n bool r_1_3_0_1 = false;\n r_1_3_0[1] = r_1_3_0_1;\n }\n {\n bool r_1_3_0_2 = true;\n r_1_3_0[2] = r_1_3_0_2;\n }\n r_1_3.s_0 = r_1_3_0;\n }\n {\n bytes6[] memory r_1_3_1 = new bytes6[](3);\n {\n bytes6 r_1_3_1_0 = bytes6(0xb61b6f4c8202);\n r_1_3_1[0] = r_1_3_1_0;\n }\n {\n bytes6 r_1_3_1_1 = bytes6(0xc633c927173b);\n r_1_3_1[1] = r_1_3_1_1;\n }\n {\n bytes6 r_1_3_1_2 = bytes6(0x92c0866c1614);\n r_1_3_1[2] = r_1_3_1_2;\n }\n r_1_3.s_1 = r_1_3_1;\n }\n {\n bool r_1_3_2 = false;\n r_1_3.s_2 = r_1_3_2;\n }\n {\n address r_1_3_3 = 0x66f8433078EeD90DEF346128E4ee98f28bB417eB;\n r_1_3.s_3 = r_1_3_3;\n }\n {\n bytes29 r_1_3_4 = bytes29(0xab16ac4ca9e2a4a1c543e4238124d08d9285b6697944931b9f3f93df7a);\n r_1_3.s_4 = r_1_3_4;\n }\n r_1.s_3 = r_1_3;\n }\n {\n int56 r_1_4 = -35502381771201321;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_be987d86 memory r_2;\n {\n uint88 r_2_0 = 234415786066037235545498268;\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n int40 r_2_2 = 102166238728;\n r_2.s_2 = r_2_2;\n }\n {\n S_2b615a37 memory r_2_3;\n {\n bool[3] memory r_2_3_0;\n {\n bool r_2_3_0_0 = true;\n r_2_3_0[0] = r_2_3_0_0;\n }\n {\n bool r_2_3_0_1 = false;\n r_2_3_0[1] = r_2_3_0_1;\n }\n {\n bool r_2_3_0_2 = true;\n r_2_3_0[2] = r_2_3_0_2;\n }\n r_2_3.s_0 = r_2_3_0;\n }\n {\n bytes6[] memory r_2_3_1 = new bytes6[](0);\n r_2_3.s_1 = r_2_3_1;\n }\n {\n bool r_2_3_2 = true;\n r_2_3.s_2 = r_2_3_2;\n }\n {\n address r_2_3_3 = 0x4d3aE6C5874D583870C8E374D5AbE9e1f26ce554;\n r_2_3.s_3 = r_2_3_3;\n }\n {\n bytes29 r_2_3_4 = bytes29(0xf3130563bf7975c57e72574c44ae0f9582fc646f1e5d63c629f6f26cda);\n r_2_3.s_4 = r_2_3_4;\n }\n r_2.s_3 = r_2_3;\n }\n {\n int56 r_2_4 = 16359848424701014;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000c007be6eacb64ec9e6c5c70000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000268ca99d0400000000000000000000000000000000000000000000000000000000000000a0ffffffffffffffffffffffffffffffffffffffffffffffffffbdc7443b95737f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce09e1495646a01ae6f8086127c315fa9051f522251ddaf3077e20861fc136b496770ec194edd514ea66c85eb3e4ae9d0c00000000000000000000000000000000000000000000000000000000000000000000024c83c0c473900000000000000000000000000000000000000000000000000000048b2e0b7ed900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dadf62fdbda7a10528e6f0000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffa7f0210b5100000000000000000000000000000000000000000000000000000000000000a0ffffffffffffffffffffffffffffffffffffffffffffffffff81dec599d8e4d700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066f8433078eed90def346128e4ee98f28bb417ebab16ac4ca9e2a4a1c543e4238124d08d9285b6697944931b9f3f93df7a0000000000000000000000000000000000000000000000000000000000000000000003b61b6f4c82020000000000000000000000000000000000000000000000000000c633c927173b000000000000000000000000000000000000000000000000000092c0866c16140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1e77939d395150f0b629c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000017c995160800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000003a1f3209eefc5600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000004d3ae6c5874d583870c8e374d5abe9e1f26ce554f3130563bf7975c57e72574c44ae0f9582fc646f1e5d63c629f6f26cda0000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(((string,string,address)[],bool,string),int128,(string,bool,bool,bool),address,address)", + "type": "(((string,string,address)[],bool,string),int128,(string,bool,bool,bool),address,address)", + "value": [ + [ + [ + [ + "Moo é🚀Mo o Mooé🚀🚀éoo🚀oé éoM🚀éo Mé 🚀Moéoo éoo ", + "Moo é🚀o🚀oMM🚀MMo🚀 🚀oMM🚀oo", + "0x238d666871D0435Be4cB344D20228bF29eeDfACA" + ], + [ + "Moo é🚀éééooéMMMéMooo", + "Moo é🚀ooé🚀ooo 🚀Mo🚀oMé🚀🚀Mo Mé MM🚀é MM ", + "0x59F5D3e53Ef59B7B83aA0b18a84685F5b768FBe5" + ] + ], + false, + "Moo é🚀oMMooooM é🚀oo🚀🚀🚀o oé🚀🚀é Mo o" + ], + "-74215461323790999203620574477370774796", + ["Moo é🚀 Mo é Moo 🚀é🚀oM🚀o MéM", false, true, false], + "0xf0a1D853bc48D0687452a238e22D921a18Ede538", + "0xbaB3999Ac506fA887acd99C09310d4fD9A3A3940" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo o Mooé🚀🚀éoo🚀oé éoM🚀éo Mé 🚀Moéoo éoo " + }, + { + "type": "string", + "value": "Moo é🚀o🚀oMM🚀MMo🚀 🚀oMM🚀oo" + }, + { + "type": "address", + "value": "0x238d666871D0435Be4cB344D20228bF29eeDfACA" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éééooéMMMéMooo" + }, + { + "type": "string", + "value": "Moo é🚀ooé🚀ooo 🚀Mo🚀oMé🚀🚀Mo Mé MM🚀é MM " + }, + { + "type": "address", + "value": "0x59F5D3e53Ef59B7B83aA0b18a84685F5b768FBe5" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oMMooooM é🚀oo🚀🚀🚀o oé🚀🚀é Mo o" + } + ] + }, + { + "type": "number", + "value": "-74215461323790999203620574477370774796" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Mo é Moo 🚀é🚀oM🚀o MéM" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xf0a1D853bc48D0687452a238e22D921a18Ede538" + }, + { + "type": "address", + "value": "0xbaB3999Ac506fA887acd99C09310d4fD9A3A3940" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610684806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103d7565b60405180910390f35b6100566102b7565b61005e6102b7565b604080516060808201835280825260006020830181905282840182905283516002808252928101909452919290816020015b61009861031b565b8152602001906001900390816100905790505090506100b561031b565b60006040518060800160405280604a815260200161059f604a91398252506040805160608101909152602b80825260009190610624602083013960208301525073238d666871d0435be4cb344d20228bf29eedfaca60408201528151819083906000906101245761012461051b565b60200260200101819052505061013861031b565b604080518082018252601d81527f4d6f6f20c3a9f09f9a80c3a9c3a9c3a96f6fc3a94d4d4dc3a94d6f6f6f0000006020808301919091529083528151606081018352828152600092909161055f908301396020830152507359f5d3e53ef59b7b83aa0b18a84685f5b768fbe5604082015281518190839060019081106101c0576101c061051b565b6020908102919091018101919091529183525060008282018190526040805160608101909152603b80825291929091906105e990830139604080840191909152918352506f37d560c0053ef90fc2e0c9d34d07d50b196020808401919091528151608081018352606080825260009282018390529281018290529182015260006040518060600160405280602d8152602001610532602d9139825250600060208201819052600160408084019190915260608084019290925283019190915273f0a1d853bc48d0687452a238e22d921a18ede5389082015273bab3999ac506fa887acd99c09310d4fd9a3a39406080820152919050565b6040805161010081018252606060a08201818152600060c0840181905260e084018390529083526020808401829052845160808181018752848252918101839052808601839052808401839052948401949094529082018190529181019190915290565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b6000815180845260005b8181101561036b5760208185018101518683018201520161034f565b8181111561037d576000602083870101525b50601f01601f19169290920160200192915050565b60008151608084526103a76080850182610345565b90506020830151151560208501526040830151151560408501526060830151151560608501528091505092915050565b60006020808352835160a0828501526101208401815160608060c088015282825180855261014094508489019150848160051b8a01019450868401935060005b8181101561047d5789860361013f190183528451805185885261043c86890182610345565b9050898201518882038b8a01526104538282610345565b6040938401516001600160a01b031699909301989098525095509387019391870191600101610417565b5050508484015180151560e089015260409094015187840360bf19016101008901529391506104ac8385610345565b948801519493506104c26040880186600f0b9052565b6040880151878503601f19018289015294506104de8486610392565b94508088015193505050506104fe60808501826001600160a01b03169052565b5060808401516001600160a01b03811660a0850152509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80204d6f20c3a920204d6f6f20f09f9a80c3a9f09f9a806f4df09f9a806f20204dc3a94d4d6f6f20c3a9f09f9a806f6fc3a9f09f9a806f6f6f20f09f9a804d6ff09f9a806f4dc3a9f09f9a80f09f9a804d6f204dc3a9204d4df09f9a80c3a9204d4d20204d6f6f20c3a9f09f9a804d6f206f204d6f6fc3a9f09f9a80f09f9a80c3a96f6ff09f9a806fc3a9202020c3a96f4df09f9a80c3a96f204dc3a920f09f9a804d6fc3a96f6f20c3a96f6f204d6f6f20c3a9f09f9a806f4d4d6f6f6f6f4d20c3a9f09f9a806f6ff09f9a80f09f9a80f09f9a806f206fc3a9f09f9a80f09f9a80c3a9204d6f206f4d6f6f20c3a9f09f9a806ff09f9a806f4d4df09f9a804d4d6ff09f9a8020f09f9a806f4d4df09f9a806f6fa264697066735822122001ae5c79279fe6ab8a8c36a0d7c34bdd57eee793dd37aba9a270ca653ef59cc564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8c30c37a {\n string s_0;\n string s_1;\n address s_2;\n }\n\n struct S_1fbc1b4b {\n S_8c30c37a[] s_0;\n bool s_1;\n string s_2;\n }\n\n struct S_824c8cc2 {\n string s_0;\n bool s_1;\n bool s_2;\n bool s_3;\n }\n\n struct S_af5b3f6a {\n S_1fbc1b4b s_0;\n int128 s_1;\n S_824c8cc2 s_2;\n address s_3;\n address s_4;\n }\n\n function test () public pure returns (S_af5b3f6a memory) {\n S_af5b3f6a memory r;\n {\n S_1fbc1b4b memory r_0;\n {\n S_8c30c37a[] memory r_0_0 = new S_8c30c37a[](2);\n {\n S_8c30c37a memory r_0_0_0;\n {\n string memory r_0_0_0_0 = unicode\"Moo é🚀Mo o Mooé🚀🚀éoo🚀oé éoM🚀éo Mé 🚀Moéoo éoo \";\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n string memory r_0_0_0_1 = unicode\"Moo é🚀o🚀oMM🚀MMo🚀 🚀oMM🚀oo\";\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n address r_0_0_0_2 = 0x238d666871D0435Be4cB344D20228bF29eeDfACA;\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_8c30c37a memory r_0_0_1;\n {\n string memory r_0_0_1_0 = unicode\"Moo é🚀éééooéMMMéMooo\";\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀ooé🚀ooo 🚀Mo🚀oMé🚀🚀Mo Mé MM🚀é MM \";\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n address r_0_0_1_2 = 0x59F5D3e53Ef59B7B83aA0b18a84685F5b768FBe5;\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n r_0_0[1] = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀oMMooooM é🚀oo🚀🚀🚀o oé🚀🚀é Mo o\";\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n int128 r_1 = -74215461323790999203620574477370774796;\n r.s_1 = r_1;\n }\n {\n S_824c8cc2 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 Mo é Moo 🚀é🚀oM🚀o MéM\";\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = false;\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2.s_2 = r_2_2;\n }\n {\n bool r_2_3 = false;\n r_2.s_3 = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xf0a1D853bc48D0687452a238e22D921a18Ede538;\n r.s_3 = r_3;\n }\n {\n address r_4 = 0xbaB3999Ac506fA887acd99C09310d4fD9A3A3940;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0ffffffffffffffffffffffffffffffffc82a9f3ffac106f03d1f362cb2f82af40000000000000000000000000000000000000000000000000000000000000400000000000000000000000000f0a1d853bc48d0687452a238e22d921a18ede538000000000000000000000000bab3999ac506fa887acd99c09310d4fd9a3a3940000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000238d666871d0435be4cb344d20228bf29eedfaca000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a804d6f206f204d6f6fc3a9f09f9a80f09f9a80c3a96f6ff09f9a806fc3a9202020c3a96f4df09f9a80c3a96f204dc3a920f09f9a804d6fc3a96f6f20c3a96f6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a806ff09f9a806f4d4df09f9a804d4d6ff09f9a8020f09f9a806f4d4df09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000059f5d3e53ef59b7b83aa0b18a84685f5b768fbe5000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a80c3a9c3a9c3a96f6fc3a94d4d4dc3a94d6f6f6f00000000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a806f6fc3a9f09f9a806f6f6f20f09f9a804d6ff09f9a806f4dc3a9f09f9a80f09f9a804d6f204dc3a9204d4df09f9a80c3a9204d4d2020000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a806f4d4d6f6f6f6f4d20c3a9f09f9a806f6ff09f9a80f09f9a80f09f9a806f206fc3a9f09f9a80f09f9a80c3a9204d6f206f00000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80204d6f20c3a920204d6f6f20f09f9a80c3a9f09f9a806f4df09f9a806f20204dc3a94d00000000000000000000000000000000000000" + }, + { + "name": "random-((address,bool,bytes31[4],string[4],string),bool[3],bool,string,string[4])", + "type": "((address,bool,bytes31[4],string[4],string),bool[3],bool,string,string[4])", + "value": [ + [ + "0x2EE0437365b9A29196861E0f08198F34d87D6647", + false, + [ + "0xf8f7e0ac4729f81aee42ba6e6599ddd67179aa1af8a6fe0140f034955bf547", + "0x91fcada700835398d46218e7506da4b3a4aa9b7ee7250b92f23b4e3c90af95", + "0x79dc8176240687d708640b630c5972f198ff609544dc7b290bcc80b3ae3534", + "0x47afb683dc54803dba93f5f5a65e09a847603cbf0fa2813b56159e66c54ff9" + ], + [ + "Moo é🚀🚀 é o🚀ooMoé", + "Moo é🚀o oMo🚀oéoéMoo éMéo éoéo🚀 o éé ooo M ", + "Moo é🚀M🚀oM🚀Méo🚀 🚀 o oéo", + "Moo é🚀oMé🚀 🚀é🚀MM🚀🚀 🚀MéoMM🚀o 🚀é🚀oooéo🚀éM M oé" + ], + "Moo é🚀 o🚀MMoé o🚀MMooéooM🚀é M 🚀 é🚀 🚀ooo éo🚀éo" + ], + [false, false, false], + false, + "Moo é🚀 oooéMooooMooé🚀éMé M é oé🚀é oo o ééMMo🚀", + [ + "Moo é🚀oo M MéM🚀éoMoM🚀éoo🚀🚀o", + "Moo é🚀 M🚀ooo🚀Moéo🚀🚀🚀o🚀oo🚀oé🚀🚀oéoo", + "Moo é🚀oéo🚀é🚀éMoé éMo", + "Moo é🚀Méoo o 🚀 Mo 🚀MoM🚀oo oo🚀M 🚀é🚀oéMo oéo🚀Mo" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2EE0437365b9A29196861E0f08198F34d87D6647" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xf8f7e0ac4729f81aee42ba6e6599ddd67179aa1af8a6fe0140f034955bf547" + }, + { + "type": "hexstring", + "value": "0x91fcada700835398d46218e7506da4b3a4aa9b7ee7250b92f23b4e3c90af95" + }, + { + "type": "hexstring", + "value": "0x79dc8176240687d708640b630c5972f198ff609544dc7b290bcc80b3ae3534" + }, + { + "type": "hexstring", + "value": "0x47afb683dc54803dba93f5f5a65e09a847603cbf0fa2813b56159e66c54ff9" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 é o🚀ooMoé" + }, + { + "type": "string", + "value": "Moo é🚀o oMo🚀oéoéMoo éMéo éoéo🚀 o éé ooo M " + }, + { + "type": "string", + "value": "Moo é🚀M🚀oM🚀Méo🚀 🚀 o oéo" + }, + { + "type": "string", + "value": "Moo é🚀oMé🚀 🚀é🚀MM🚀🚀 🚀MéoMM🚀o 🚀é🚀oooéo🚀éM M oé" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 o🚀MMoé o🚀MMooéooM🚀é M 🚀 é🚀 🚀ooo éo🚀éo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 oooéMooooMooé🚀éMé M é oé🚀é oo o ééMMo🚀" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo M MéM🚀éoMoM🚀éoo🚀🚀o" + }, + { + "type": "string", + "value": "Moo é🚀 M🚀ooo🚀Moéo🚀🚀🚀o🚀oo🚀oé🚀🚀oéoo" + }, + { + "type": "string", + "value": "Moo é🚀oéo🚀é🚀éMoé éMo" + }, + { + "type": "string", + "value": "Moo é🚀Méoo o 🚀 Mo 🚀MoM🚀oo oo🚀M 🚀é🚀oéMo oéo🚀Mo" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506107ec806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610485565b60405180910390f35b6100566102ec565b61005e6102ec565b61006661032c565b732ee0437365b9a29196861e0f08198f34d87d664781526000602082015261008c610365565b7ff8f7e0ac4729f81aee42ba6e6599ddd67179aa1af8a6fe0140f034955bf5470081527f91fcada700835398d46218e7506da4b3a4aa9b7ee7250b92f23b4e3c90af950060208201527f79dc8176240687d708640b630c5972f198ff609544dc7b290bcc80b3ae3534006040808301919091527f47afb683dc54803dba93f5f5a65e09a847603cbf0fa2813b56159e66c54ff9006060830152820152610130610383565b604080518082018252601d81527f4d6f6f20c3a9f09f9a80f09f9a8020c3a9206ff09f9a806f6f4d6fc3a9000000602080830191909152908352815160608101909252603e808352600092916105ce9083013990508082600160200201819052505060006040518060600160405280602c815260200161060c602c91396040808401919091528051608081019091526056808252600092506106666020830139606080840191909152830191909152506040805160808101909152604b808252600091906106df6020830139608083015250815261020c6103aa565b6000808252602080830182905260408084018390528482019390935283830182905282516080810190935260488084529192919061058690830139606083015250610255610383565b60006040518060600160405280602e8152602001610638602e91398252506040805160808101909152604380825260009190610774602083013990508082600160200201819052505060006040518060600160405280602381526020016106bc60239139604080840191909152805160808101909152604a8082526000925061072a60208301396060830152506080820152919050565b6040518060a001604052806102ff61032c565b815260200161030c6103aa565b81526000602082015260606040820181905201610327610383565b905290565b6040805160a0810182526000808252602082015290810161034b610365565b8152602001610358610383565b8152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b60405180608001604052806004905b60608152602001906001900390816103925790505090565b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b818110156103ee576020818501810151868301820152016103d2565b81811115610400576000602083870101525b50601f01601f19169290920160200192915050565b600082608081018360005b600481101561044f5783830387526104398383516103c8565b6020978801979093509190910190600101610420565b509095945050505050565b8060005b600381101561047f578151151584526020938401939091019060010161045e565b50505050565b60006020808352610100845160e08386015260018060a01b03815116828601528281015115156101208601526040810151610140860160005b60048110156104df57825160ff1916825291850191908501906001016104be565b5050506060810151826101c08701526104fc610200870182610415565b9250506080810151905060ff19858303016101e086015261051d82826103c8565b915050818501519150610533604085018361045a565b6040850151151560a08501526060850151601f19858303810160c087015290925061055e82846103c8565b925060808601519150808584030160e08601525061057c8282610415565b9594505050505056fe4d6f6f20c3a9f09f9a8020206f6f6fc3a94d6f6f6f6f4d6f6fc3a9f09f9a80c3a94dc3a9204d20c3a9206fc3a9f09f9a80c3a9206f6f2020206f202020c3a9c3a94d4d6ff09f9a804d6f6f20c3a9f09f9a806f206f4d6ff09f9a806fc3a96fc3a94d6f6f20c3a94dc3a96f2020c3a96fc3a96ff09f9a8020206f20c3a9c3a9206f6f6f204d204d6f6f20c3a9f09f9a804df09f9a806f4df09f9a804dc3a96ff09f9a8020202020f09f9a80206f206fc3a96f4d6f6f20c3a9f09f9a806f6f204d204dc3a94df09f9a80c3a96f4d6f4df09f9a80c3a96f6ff09f9a80f09f9a806f4d6f6f20c3a9f09f9a806f4dc3a9f09f9a8020f09f9a80c3a9f09f9a804d4df09f9a80f09f9a8020f09f9a804dc3a96f4d4df09f9a806f20f09f9a80c3a9f09f9a806f6f6fc3a96ff09f9a80c3a94d204d20206fc3a94d6f6f20c3a9f09f9a806fc3a96ff09f9a80c3a9f09f9a80c3a94d6fc3a920c3a94d6f4d6f6f20c3a9f09f9a80206ff09f9a804d4d6fc3a9206ff09f9a804d4d6f6fc3a96f6f4df09f9a80c3a9204d20f09f9a8020c3a9f09f9a8020f09f9a806f6f6f20c3a96ff09f9a80c3a96f4d6f6f20c3a9f09f9a804dc3a96f6f206f20f09f9a80204d6f20f09f9a804d6f4df09f9a806f6f206f6ff09f9a804d20f09f9a80c3a9f09f9a806fc3a94d6f206fc3a96ff09f9a804d6f4d6f6f20c3a9f09f9a80204df09f9a806f6f6ff09f9a804d6fc3a96ff09f9a80f09f9a80f09f9a806ff09f9a806f6ff09f9a806fc3a9f09f9a80f09f9a806fc3a96f6fa264697066735822122065870eee9325cb9181e615b349edff4a5c8c25e32bdd75eefef036d89134331a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5fa8d31c {\n address s_0;\n bool s_1;\n bytes31[4] s_2;\n string[4] s_3;\n string s_4;\n }\n\n struct S_c0b3abff {\n S_5fa8d31c s_0;\n bool[3] s_1;\n bool s_2;\n string s_3;\n string[4] s_4;\n }\n\n function test () public pure returns (S_c0b3abff memory) {\n S_c0b3abff memory r;\n {\n S_5fa8d31c memory r_0;\n {\n address r_0_0 = 0x2EE0437365b9A29196861E0f08198F34d87D6647;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n bytes31[4] memory r_0_2;\n {\n bytes31 r_0_2_0 = bytes31(0xf8f7e0ac4729f81aee42ba6e6599ddd67179aa1af8a6fe0140f034955bf547);\n r_0_2[0] = r_0_2_0;\n }\n {\n bytes31 r_0_2_1 = bytes31(0x91fcada700835398d46218e7506da4b3a4aa9b7ee7250b92f23b4e3c90af95);\n r_0_2[1] = r_0_2_1;\n }\n {\n bytes31 r_0_2_2 = bytes31(0x79dc8176240687d708640b630c5972f198ff609544dc7b290bcc80b3ae3534);\n r_0_2[2] = r_0_2_2;\n }\n {\n bytes31 r_0_2_3 = bytes31(0x47afb683dc54803dba93f5f5a65e09a847603cbf0fa2813b56159e66c54ff9);\n r_0_2[3] = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string[4] memory r_0_3;\n {\n string memory r_0_3_0 = unicode\"Moo é🚀🚀 é o🚀ooMoé\";\n r_0_3[0] = r_0_3_0;\n }\n {\n string memory r_0_3_1 = unicode\"Moo é🚀o oMo🚀oéoéMoo éMéo éoéo🚀 o éé ooo M \";\n r_0_3[1] = r_0_3_1;\n }\n {\n string memory r_0_3_2 = unicode\"Moo é🚀M🚀oM🚀Méo🚀 🚀 o oéo\";\n r_0_3[2] = r_0_3_2;\n }\n {\n string memory r_0_3_3 = unicode\"Moo é🚀oMé🚀 🚀é🚀MM🚀🚀 🚀MéoMM🚀o 🚀é🚀oooéo🚀éM M oé\";\n r_0_3[3] = r_0_3_3;\n }\n r_0.s_3 = r_0_3;\n }\n {\n string memory r_0_4 = unicode\"Moo é🚀 o🚀MMoé o🚀MMooéooM🚀é M 🚀 é🚀 🚀ooo éo🚀éo\";\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n bool[3] memory r_1;\n {\n bool r_1_0 = false;\n r_1[0] = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1[1] = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀 oooéMooooMooé🚀éMé M é oé🚀é oo o ééMMo🚀\";\n r.s_3 = r_3;\n }\n {\n string[4] memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀oo M MéM🚀éoMoM🚀éoo🚀🚀o\";\n r_4[0] = r_4_0;\n }\n {\n string memory r_4_1 = unicode\"Moo é🚀 M🚀ooo🚀Moéo🚀🚀🚀o🚀oo🚀oé🚀🚀oéoo\";\n r_4[1] = r_4_1;\n }\n {\n string memory r_4_2 = unicode\"Moo é🚀oéo🚀é🚀éMoé éMo\";\n r_4[2] = r_4_2;\n }\n {\n string memory r_4_3 = unicode\"Moo é🚀Méoo o 🚀 Mo 🚀MoM🚀oo oo🚀M 🚀é🚀oéMo oéo🚀Mo\";\n r_4[3] = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000002ee0437365b9a29196861e0f08198f34d87d66470000000000000000000000000000000000000000000000000000000000000000f8f7e0ac4729f81aee42ba6e6599ddd67179aa1af8a6fe0140f034955bf5470091fcada700835398d46218e7506da4b3a4aa9b7ee7250b92f23b4e3c90af950079dc8176240687d708640b630c5972f198ff609544dc7b290bcc80b3ae35340047afb683dc54803dba93f5f5a65e09a847603cbf0fa2813b56159e66c54ff90000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a80f09f9a8020c3a9206ff09f9a806f6f4d6fc3a9000000000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a806f206f4d6ff09f9a806fc3a96fc3a94d6f6f20c3a94dc3a96f2020c3a96fc3a96ff09f9a8020206f20c3a9c3a9206f6f6f204d200000000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a804df09f9a806f4df09f9a804dc3a96ff09f9a8020202020f09f9a80206f206fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a806f4dc3a9f09f9a8020f09f9a80c3a9f09f9a804d4df09f9a80f09f9a8020f09f9a804dc3a96f4d4df09f9a806f20f09f9a80c3a9f09f9a806f6f6fc3a96ff09f9a80c3a94d204d20206fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a80206ff09f9a804d4d6fc3a9206ff09f9a804d4d6f6fc3a96f6f4df09f9a80c3a9204d20f09f9a8020c3a9f09f9a8020f09f9a806f6f6f20c3a96ff09f9a80c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a8020206f6f6fc3a94d6f6f6f6f4d6f6fc3a9f09f9a80c3a94dc3a9204d20c3a9206fc3a9f09f9a80c3a9206f6f2020206f202020c3a9c3a94d4d6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a806f6f204d204dc3a94df09f9a80c3a96f4d6f4df09f9a80c3a96f6ff09f9a80f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80204df09f9a806f6f6ff09f9a804d6fc3a96ff09f9a80f09f9a80f09f9a806ff09f9a806f6ff09f9a806fc3a9f09f9a80f09f9a806fc3a96f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806fc3a96ff09f9a80c3a9f09f9a80c3a94d6fc3a920c3a94d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a804dc3a96f6f206f20f09f9a80204d6f20f09f9a804d6f4df09f9a806f6f206f6ff09f9a804d20f09f9a80c3a9f09f9a806fc3a94d6f206fc3a96ff09f9a804d6f00000000000000000000000000000000000000000000" + }, + { + "name": "random-((int216[2],string,string),uint176,(uint48,int32,uint72,(address,bool)),string[4])[]", + "type": "((int216[2],string,string),uint176,(uint48,int32,uint72,(address,bool)),string[4])[]", + "value": [ + [ + [ + [ + "48633453508205274203738855842157016160183376500666379088423812852", + "41163220697275691824284955165996627087369586706669840294390424570" + ], + "Moo é🚀🚀M🚀 ", + "Moo é🚀" + ], + "94029584970309724051898885882960890597331044985369566", + [ + "269566708046572", + "949839591", + "3720316878639692423826", + ["0xAe33a4C5BA1f78b5e4A6AE5C565F7f41a1420229", false] + ], + [ + "Moo é🚀MooM🚀MMMooé oééoooéM🚀🚀oo o🚀oM🚀o", + "Moo é🚀oMééééo🚀Mé🚀🚀🚀oéM🚀ooo🚀é oéo🚀🚀Mé", + "Moo é🚀Mé oo 🚀 oMM🚀éMé🚀oé MooMéM🚀 oo🚀oéM", + "Moo é🚀oéM ooMééMéoMoo🚀ooé🚀o Méé é oé é🚀é Mé " + ] + ], + [ + [ + [ + "-2060735802583908800629244723330460831404569284112270623679741858", + "-22822902565903592968673818686315004629370302664744222335984352121" + ], + "Moo é🚀 oM🚀M MoM MM🚀é🚀oéM🚀ooM oé🚀oo ooM", + "Moo é🚀 oé o " + ], + "64378872468774257868862458166120895079284000658516470", + [ + "54788177187505", + "-1912251410", + "4154322639538573442334", + ["0xA112a997033D475213729d79dc5BF34753A7F1d5", true] + ], + [ + "Moo é🚀oo🚀 🚀oMo ", + "Moo é🚀oo🚀 ooé🚀o🚀oo🚀🚀🚀🚀 oMé ééoMé é🚀🚀Mo🚀o é 🚀🚀🚀M", + "Moo é🚀 🚀oMo ooooé éoMooMo🚀oéoo é🚀éoéoééo", + "Moo é🚀oéMo🚀 éoM🚀oé🚀🚀🚀éoM🚀 é🚀ooéé🚀M 🚀Mo" + ] + ], + [ + [ + [ + "-13152154931715534320213074856036485664018615261154004905307360117", + "-39534439954891917906023654868174038752171923281085183867978156330" + ], + "Moo é🚀o ééMoo🚀o oo🚀M oM🚀éMo oM🚀o🚀o🚀éé🚀🚀o 🚀🚀oooééMoMoMéMoéoéo 🚀", + "Moo é🚀🚀oo🚀o🚀🚀o M 🚀🚀🚀🚀M oéo🚀 Mo🚀oMoo oéoo🚀 ooéooM" + ], + "90766279072655992782805791362450374916175215130045451", + [ + "264525479209981", + "-36153002", + "4112356281544586951689", + ["0x6e1E11b3f1049C47a8202A2898B2B51592D35216", true] + ], + [ + "Moo é🚀M🚀M🚀Mo🚀🚀éooooo M🚀oooM🚀 ooooo🚀M ", + "Moo é🚀 ", + "Moo é🚀Méooo é🚀 ", + "Moo é🚀Moéo🚀🚀oo MMoo M🚀🚀éo Moé" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "48633453508205274203738855842157016160183376500666379088423812852" + }, + { + "type": "number", + "value": "41163220697275691824284955165996627087369586706669840294390424570" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀 " + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "number", + "value": "94029584970309724051898885882960890597331044985369566" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "269566708046572" + }, + { + "type": "number", + "value": "949839591" + }, + { + "type": "number", + "value": "3720316878639692423826" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xAe33a4C5BA1f78b5e4A6AE5C565F7f41a1420229" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MooM🚀MMMooé oééoooéM🚀🚀oo o🚀oM🚀o" + }, + { + "type": "string", + "value": "Moo é🚀oMééééo🚀Mé🚀🚀🚀oéM🚀ooo🚀é oéo🚀🚀Mé" + }, + { + "type": "string", + "value": "Moo é🚀Mé oo 🚀 oMM🚀éMé🚀oé MooMéM🚀 oo🚀oéM" + }, + { + "type": "string", + "value": "Moo é🚀oéM ooMééMéoMoo🚀ooé🚀o Méé é oé é🚀é Mé " + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2060735802583908800629244723330460831404569284112270623679741858" + }, + { + "type": "number", + "value": "-22822902565903592968673818686315004629370302664744222335984352121" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 oM🚀M MoM MM🚀é🚀oéM🚀ooM oé🚀oo ooM" + }, + { + "type": "string", + "value": "Moo é🚀 oé o " + } + ] + }, + { + "type": "number", + "value": "64378872468774257868862458166120895079284000658516470" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "54788177187505" + }, + { + "type": "number", + "value": "-1912251410" + }, + { + "type": "number", + "value": "4154322639538573442334" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA112a997033D475213729d79dc5BF34753A7F1d5" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀 🚀oMo " + }, + { + "type": "string", + "value": "Moo é🚀oo🚀 ooé🚀o🚀oo🚀🚀🚀🚀 oMé ééoMé é🚀🚀Mo🚀o é 🚀🚀🚀M" + }, + { + "type": "string", + "value": "Moo é🚀 🚀oMo ooooé éoMooMo🚀oéoo é🚀éoéoééo" + }, + { + "type": "string", + "value": "Moo é🚀oéMo🚀 éoM🚀oé🚀🚀🚀éoM🚀 é🚀ooéé🚀M 🚀Mo" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-13152154931715534320213074856036485664018615261154004905307360117" + }, + { + "type": "number", + "value": "-39534439954891917906023654868174038752171923281085183867978156330" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o ééMoo🚀o oo🚀M oM🚀éMo oM🚀o🚀o🚀éé🚀🚀o 🚀🚀oooééMoMoMéMoéoéo 🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀oo🚀o🚀🚀o M 🚀🚀🚀🚀M oéo🚀 Mo🚀oMoo oéoo🚀 ooéooM" + } + ] + }, + { + "type": "number", + "value": "90766279072655992782805791362450374916175215130045451" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "264525479209981" + }, + { + "type": "number", + "value": "-36153002" + }, + { + "type": "number", + "value": "4112356281544586951689" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6e1E11b3f1049C47a8202A2898B2B51592D35216" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M🚀M🚀Mo🚀🚀éooooo M🚀oooM🚀 ooooo🚀M " + }, + { + "type": "string", + "value": "Moo é🚀 " + }, + { + "type": "string", + "value": "Moo é🚀Méooo é🚀 " + }, + { + "type": "string", + "value": "Moo é🚀Moéo🚀🚀oo MMoo M🚀🚀éo Moé" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610d13806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906107ff565b60405180910390f35b6040805160038082526080820190925260609160009190816020015b610072610694565b81526020019060019003908161006a57905050905061008f610694565b6100976106cd565b61009f6106f4565b7a7638ac23b2108b84fad6a094643ab6ce9b7ef715831597148ffef481527a640fef64950721c952b01b78c78793ba9780bebd236640c86a63fa6020808301919091529082526040805180820182526014815273026b7b79061d4f84fcd40784fcd4026f84fcd40160651b818401528383015280518082018252600a8152689adede418753e13f3560b71b818401529083015290825275fb51a720a3cc60f170ce9669a5f5a61d31b7b15273de90820152610158610712565b65f52b63e05aec815263389d66e7602082015268c9adc4aa0a08e6a2926040820152610194604080518082019091526000808252602082015290565b73ae33a4c5ba1f78b5e4a6ae5c565f7f41a1420229815260006020820152606082015260408201526101c4610746565b60006040518060600160405280603c8152602001610a79603c913982525060408051608081019091526049808252600091906109766020830139602080840191909152604080516060810182528181526000935091610bfd90830139604080840191909152805160808101909152604580825260009250610b5f602083013990508082600360200201525060608201528151819083906000906102695761026961095f565b60200260200101819052505061027d610694565b6102856106cd565b61028d6106f4565b7a050266275ff1ca0418fc6385792cc3a6891a19adc1325943b47fa11981527a377aba258993beab1095e8cf8c8e59e8797151d91eeb9c08623b78196020808301919091529082526040805160608101909152603d808252600092610ab5908301396020808401919091526040805180820182526011815270026b7b79061d4f84fcd401037e1d490379607d1b81840152908401529183525075ac11cfe403bd95dc8656f8c4ec49a03ffd006f3b69f690820152610349610712565b6531d45dd6d2b181526371faa41119602082015268e134cede1d9bd27d1e6040820152610386604080518082019091526000808252602082015290565b73a112a997033d475213729d79dc5bf34753a7f1d5815260016020820152606082015260408201526103b6610746565b604080518082018252601981527f4d6f6f20c3a9f09f9a806f6ff09f9a8020f09f9a806f4d6f2000000000000000602080830191909152908352815160a08101909252606280835260009291610c7c9083013990508082600160200201819052505060006040518060600160405280603d81526020016109ef603d9139604080840191909152805160808101909152604d80825260009250610a2c60208301399050808260036020020152506060820152815181908390600190811061047e5761047e61095f565b602002602001018190525050610492610694565b61049a6106cd565b6104a26106f4565b7a1ff89b29df924fb2237b362926d40b109e5bfbaad4018b07d74b741981527a601a57a67bf603664f758f63f87fd8c9e04cc7d8948658c2128929196020808301919091529082526040805160a08101909152606d808252600092610af2908301399050808260200181905250506000604051806080016040528060598152602001610ba460599139604083015250815275f298ceef4381d751afe2458deeaa74e6b6a6ad2fec0b6020820152610557610712565b65f095a338ebfd8152630227a6a919602082015268deee6869de0f61fc096040820152610594604080518082019091526000808252602082015290565b736e1e11b3f1049c47a8202a2898b2b51592d35216815260016020820152606082015260408201526105c4610746565b60006040518060600160405280603f8152602001610c3d603f9139825250604080518082018252600b81526a026b7b79061d4f84fcd40160ad1b6020808301919091528084019190915281518083018352601881527f4d6f6f20c3a9f09f9a804dc3a96f6f6f20c3a9f09f9a8020000000000000000081830152828401528151606081019092526030808352600092916109bf90830139905080826003602002015250606082015281518190839060029081106106835761068361095f565b602090810291909101015250919050565b60405180608001604052806106a76106cd565b8152600060208201526040016106bb610712565b81526020016106c8610746565b905290565b60405180606001604052806106e06106f4565b815260200160608152602001606081525090565b60405180604001604052806002906020820280368337509192915050565b6040805160808101825260008082526020808301829052828401829052835180850190945281845283015290606082015290565b60405180608001604052806004905b60608152602001906001900390816107555790505090565b6000815180845260005b8181101561079357602081850181015186830182015201610777565b818111156107a5576000602083870101525b50601f01601f19169290920160200192915050565b600082608081018360005b60048110156107f45783830387526107de83835161076d565b60209788019790935091909101906001016107c5565b509095945050505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b8481101561095057898403603f1901865282518051610100808752815191859188015b600283101561086c578351601a0b8152928c0192600192909201918c0161084a565b508b8101519250608061014089015261088961018089018461076d565b908b015188820360ff19016101608a015290925090506108a9828261076d565b915050898201516108c48b8801826001600160b01b03169052565b50888201516109228a880182805165ffffffffffff16825260208082015160030b8184015260408083015168ffffffffffffffffff169084015260609182015180516001600160a01b03169284019290925201511515608090910152565b506060820151915085810360e087015261093c81836107ba565b978a01979550505091870191600101610827565b50919998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4dc3a9c3a9c3a9c3a96ff09f9a804dc3a9f09f9a80f09f9a80f09f9a806fc3a94df09f9a806f6f6ff09f9a80c3a9206fc3a96ff09f9a80f09f9a804dc3a94d6f6f20c3a9f09f9a804d6fc3a96ff09f9a80f09f9a806f6f204d4d6f6f204df09f9a80f09f9a80c3a96f204d6fc3a94d6f6f20c3a9f09f9a8020f09f9a806f4d6f206f6f6f6fc3a920c3a96f4d6f6f4d6ff09f9a806fc3a96f6f20c3a9f09f9a80c3a96fc3a96fc3a9c3a96f4d6f6f20c3a9f09f9a806fc3a94d6ff09f9a8020c3a96f4df09f9a806fc3a9f09f9a80f09f9a80f09f9a80c3a96f4df09f9a802020c3a9f09f9a806f6fc3a9c3a9f09f9a804d20f09f9a804d6f4d6f6f20c3a9f09f9a804d6f6f4df09f9a804d4d4d6f6fc3a9206fc3a9c3a96f6f6fc3a94df09f9a80f09f9a806f6f206ff09f9a806f4df09f9a806f4d6f6f20c3a9f09f9a80206f4df09f9a804d204d6f4d20204d4df09f9a80c3a9f09f9a806fc3a94df09f9a806f6f4d206fc3a9f09f9a806f6f206f6f4d4d6f6f20c3a9f09f9a806f20c3a9c3a94d6f6ff09f9a806f206f6ff09f9a804d206f4df09f9a80c3a94d6f206f4df09f9a806ff09f9a806ff09f9a80c3a9c3a9f09f9a80f09f9a806f20f09f9a80f09f9a806f6f6fc3a9c3a94d6f4d6f4dc3a94d6fc3a96fc3a96f20f09f9a804d6f6f20c3a9f09f9a806fc3a94d206f6f4dc3a9c3a94dc3a96f4d6f6ff09f9a806f6fc3a9f09f9a806f204dc3a9c3a920c3a9206fc3a920c3a9f09f9a80c3a9204dc3a9204d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806ff09f9a80f09f9a806f20204d20f09f9a80f09f9a80f09f9a80f09f9a804d206fc3a96ff09f9a80204d6ff09f9a806f4d6f6f206fc3a96f6ff09f9a80206f6fc3a96f6f4d4d6f6f20c3a9f09f9a804dc3a9206f6f20f09f9a80206f4d4df09f9a80c3a94dc3a9f09f9a806fc3a9204d6f6f4dc3a94df09f9a80206f6ff09f9a806fc3a94d4d6f6f20c3a9f09f9a804df09f9a804df09f9a804d6ff09f9a80f09f9a80c3a96f6f6f6f6f204df09f9a806f6f6f4df09f9a80206f6f6f6f6ff09f9a804d204d6f6f20c3a9f09f9a806f6ff09f9a80206f6fc3a9f09f9a806ff09f9a806f6ff09f9a80f09f9a80f09f9a80f09f9a80206f4dc3a92020c3a9c3a96f4dc3a920c3a9f09f9a80f09f9a804d6ff09f9a806f20c3a920f09f9a80f09f9a80f09f9a804da2646970667358221220bace4698eb40dc1a13f06d4c17e0f1b82d63961fef0d947054a303a91f1dc2eb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_148a9025 {\n int216[2] s_0;\n string s_1;\n string s_2;\n }\n\n struct S_5cde0d08 {\n address s_0;\n bool s_1;\n }\n\n struct S_0ecd4634 {\n uint48 s_0;\n int32 s_1;\n uint72 s_2;\n S_5cde0d08 s_3;\n }\n\n struct S_f1f4634e {\n S_148a9025 s_0;\n uint176 s_1;\n S_0ecd4634 s_2;\n string[4] s_3;\n }\n\n function test () public pure returns (S_f1f4634e[] memory) {\n S_f1f4634e[] memory r = new S_f1f4634e[](3);\n {\n S_f1f4634e memory r_0;\n {\n S_148a9025 memory r_0_0;\n {\n int216[2] memory r_0_0_0;\n {\n int216 r_0_0_0_0 = 48633453508205274203738855842157016160183376500666379088423812852;\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n int216 r_0_0_0_1 = 41163220697275691824284955165996627087369586706669840294390424570;\n r_0_0_0[1] = r_0_0_0_1;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀🚀M🚀 \";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀\";\n r_0_0.s_2 = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n {\n uint176 r_0_1 = 94029584970309724051898885882960890597331044985369566;\n r_0.s_1 = r_0_1;\n }\n {\n S_0ecd4634 memory r_0_2;\n {\n uint48 r_0_2_0 = 269566708046572;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n int32 r_0_2_1 = 949839591;\n r_0_2.s_1 = r_0_2_1;\n }\n {\n uint72 r_0_2_2 = 3720316878639692423826;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n S_5cde0d08 memory r_0_2_3;\n {\n address r_0_2_3_0 = 0xAe33a4C5BA1f78b5e4A6AE5C565F7f41a1420229;\n r_0_2_3.s_0 = r_0_2_3_0;\n }\n {\n bool r_0_2_3_1 = false;\n r_0_2_3.s_1 = r_0_2_3_1;\n }\n r_0_2.s_3 = r_0_2_3;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string[4] memory r_0_3;\n {\n string memory r_0_3_0 = unicode\"Moo é🚀MooM🚀MMMooé oééoooéM🚀🚀oo o🚀oM🚀o\";\n r_0_3[0] = r_0_3_0;\n }\n {\n string memory r_0_3_1 = unicode\"Moo é🚀oMééééo🚀Mé🚀🚀🚀oéM🚀ooo🚀é oéo🚀🚀Mé\";\n r_0_3[1] = r_0_3_1;\n }\n {\n string memory r_0_3_2 = unicode\"Moo é🚀Mé oo 🚀 oMM🚀éMé🚀oé MooMéM🚀 oo🚀oéM\";\n r_0_3[2] = r_0_3_2;\n }\n {\n string memory r_0_3_3 = unicode\"Moo é🚀oéM ooMééMéoMoo🚀ooé🚀o Méé é oé é🚀é Mé \";\n r_0_3[3] = r_0_3_3;\n }\n r_0.s_3 = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_f1f4634e memory r_1;\n {\n S_148a9025 memory r_1_0;\n {\n int216[2] memory r_1_0_0;\n {\n int216 r_1_0_0_0 = -2060735802583908800629244723330460831404569284112270623679741858;\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n int216 r_1_0_0_1 = -22822902565903592968673818686315004629370302664744222335984352121;\n r_1_0_0[1] = r_1_0_0_1;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n string memory r_1_0_1 = unicode\"Moo é🚀 oM🚀M MoM MM🚀é🚀oéM🚀ooM oé🚀oo ooM\";\n r_1_0.s_1 = r_1_0_1;\n }\n {\n string memory r_1_0_2 = unicode\"Moo é🚀 oé o \";\n r_1_0.s_2 = r_1_0_2;\n }\n r_1.s_0 = r_1_0;\n }\n {\n uint176 r_1_1 = 64378872468774257868862458166120895079284000658516470;\n r_1.s_1 = r_1_1;\n }\n {\n S_0ecd4634 memory r_1_2;\n {\n uint48 r_1_2_0 = 54788177187505;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n int32 r_1_2_1 = -1912251410;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n uint72 r_1_2_2 = 4154322639538573442334;\n r_1_2.s_2 = r_1_2_2;\n }\n {\n S_5cde0d08 memory r_1_2_3;\n {\n address r_1_2_3_0 = 0xA112a997033D475213729d79dc5BF34753A7F1d5;\n r_1_2_3.s_0 = r_1_2_3_0;\n }\n {\n bool r_1_2_3_1 = true;\n r_1_2_3.s_1 = r_1_2_3_1;\n }\n r_1_2.s_3 = r_1_2_3;\n }\n r_1.s_2 = r_1_2;\n }\n {\n string[4] memory r_1_3;\n {\n string memory r_1_3_0 = unicode\"Moo é🚀oo🚀 🚀oMo \";\n r_1_3[0] = r_1_3_0;\n }\n {\n string memory r_1_3_1 = unicode\"Moo é🚀oo🚀 ooé🚀o🚀oo🚀🚀🚀🚀 oMé ééoMé é🚀🚀Mo🚀o é 🚀🚀🚀M\";\n r_1_3[1] = r_1_3_1;\n }\n {\n string memory r_1_3_2 = unicode\"Moo é🚀 🚀oMo ooooé éoMooMo🚀oéoo é🚀éoéoééo\";\n r_1_3[2] = r_1_3_2;\n }\n {\n string memory r_1_3_3 = unicode\"Moo é🚀oéMo🚀 éoM🚀oé🚀🚀🚀éoM🚀 é🚀ooéé🚀M 🚀Mo\";\n r_1_3[3] = r_1_3_3;\n }\n r_1.s_3 = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_f1f4634e memory r_2;\n {\n S_148a9025 memory r_2_0;\n {\n int216[2] memory r_2_0_0;\n {\n int216 r_2_0_0_0 = -13152154931715534320213074856036485664018615261154004905307360117;\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n int216 r_2_0_0_1 = -39534439954891917906023654868174038752171923281085183867978156330;\n r_2_0_0[1] = r_2_0_0_1;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n string memory r_2_0_1 = unicode\"Moo é🚀o ééMoo🚀o oo🚀M oM🚀éMo oM🚀o🚀o🚀éé🚀🚀o 🚀🚀oooééMoMoMéMoéoéo 🚀\";\n r_2_0.s_1 = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀🚀oo🚀o🚀🚀o M 🚀🚀🚀🚀M oéo🚀 Mo🚀oMoo oéoo🚀 ooéooM\";\n r_2_0.s_2 = r_2_0_2;\n }\n r_2.s_0 = r_2_0;\n }\n {\n uint176 r_2_1 = 90766279072655992782805791362450374916175215130045451;\n r_2.s_1 = r_2_1;\n }\n {\n S_0ecd4634 memory r_2_2;\n {\n uint48 r_2_2_0 = 264525479209981;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n int32 r_2_2_1 = -36153002;\n r_2_2.s_1 = r_2_2_1;\n }\n {\n uint72 r_2_2_2 = 4112356281544586951689;\n r_2_2.s_2 = r_2_2_2;\n }\n {\n S_5cde0d08 memory r_2_2_3;\n {\n address r_2_2_3_0 = 0x6e1E11b3f1049C47a8202A2898B2B51592D35216;\n r_2_2_3.s_0 = r_2_2_3_0;\n }\n {\n bool r_2_2_3_1 = true;\n r_2_2_3.s_1 = r_2_2_3_1;\n }\n r_2_2.s_3 = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n {\n string[4] memory r_2_3;\n {\n string memory r_2_3_0 = unicode\"Moo é🚀M🚀M🚀Mo🚀🚀éooooo M🚀oooM🚀 ooooo🚀M \";\n r_2_3[0] = r_2_3_0;\n }\n {\n string memory r_2_3_1 = unicode\"Moo é🚀 \";\n r_2_3[1] = r_2_3_1;\n }\n {\n string memory r_2_3_2 = unicode\"Moo é🚀Méooo é🚀 \";\n r_2_3[2] = r_2_3_2;\n }\n {\n string memory r_2_3_3 = unicode\"Moo é🚀Moéo🚀🚀oo MMoo M🚀🚀éo Moé\";\n r_2_3[3] = r_2_3_3;\n }\n r_2.s_3 = r_2_3;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000010000000000000000000000fb51a720a3cc60f170ce9669a5f5a61d31b7b15273de0000000000000000000000000000000000000000000000000000f52b63e05aec00000000000000000000000000000000000000000000000000000000389d66e70000000000000000000000000000000000000000000000c9adc4aa0a08e6a292000000000000000000000000ae33a4c5ba1f78b5e4a6ae5c565f7f41a14202290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000007638ac23b2108b84fad6a094643ab6ce9b7ef715831597148ffef40000000000640fef64950721c952b01b78c78793ba9780bebd236640c86a63fa000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a80f09f9a804df09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a804d6f6f4df09f9a804d4d4d6f6fc3a9206fc3a9c3a96f6f6fc3a94df09f9a80f09f9a806f6f206ff09f9a806f4df09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a806f4dc3a9c3a9c3a9c3a96ff09f9a804dc3a9f09f9a80f09f9a80f09f9a806fc3a94df09f9a806f6f6ff09f9a80c3a9206fc3a96ff09f9a80f09f9a804dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a804dc3a9206f6f20f09f9a80206f4d4df09f9a80c3a94dc3a9f09f9a806fc3a9204d6f6f4dc3a94df09f9a80206f6ff09f9a806fc3a94d00000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a806fc3a94d206f6f4dc3a9c3a94dc3a96f4d6f6ff09f9a806f6fc3a9f09f9a806f204dc3a9c3a920c3a9206fc3a920c3a9f09f9a80c3a9204dc3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000ac11cfe403bd95dc8656f8c4ec49a03ffd006f3b69f6000000000000000000000000000000000000000000000000000031d45dd6d2b1ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e055bee0000000000000000000000000000000000000000000000e134cede1d9bd27d1e000000000000000000000000a112a997033d475213729d79dc5bf34753a7f1d500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000220fffffffffffafd99d8a00e35fbe7039c7a86d33c5976e5e6523ecda6bc4b805effffffffffc88545da766c4154ef6a17307371a617868eae26e11463f79dc487000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a80206f4df09f9a804d204d6f4d20204d4df09f9a80c3a9f09f9a806fc3a94df09f9a806f6f4d206fc3a9f09f9a806f6f206f6f4d00000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a80206fc3a9206f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a806f6ff09f9a8020f09f9a806f4d6f200000000000000000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806f6ff09f9a80206f6fc3a9f09f9a806ff09f9a806f6ff09f9a80f09f9a80f09f9a80f09f9a80206f4dc3a92020c3a9c3a96f4dc3a920c3a9f09f9a80f09f9a804d6ff09f9a806f20c3a920f09f9a80f09f9a80f09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a8020f09f9a806f4d6f206f6f6f6fc3a920c3a96f4d6f6f4d6ff09f9a806fc3a96f6f20c3a9f09f9a80c3a96fc3a96fc3a9c3a96f000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a806fc3a94d6ff09f9a8020c3a96f4df09f9a806fc3a9f09f9a80f09f9a80f09f9a80c3a96f4df09f9a802020c3a9f09f9a806f6fc3a9c3a9f09f9a804d20f09f9a804d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000f298ceef4381d751afe2458deeaa74e6b6a6ad2fec0b0000000000000000000000000000000000000000000000000000f095a338ebfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd859560000000000000000000000000000000000000000000000deee6869de0f61fc090000000000000000000000006e1e11b3f1049c47a8202a2898b2b51592d35216000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002a0ffffffffffe00764d6206db04ddc84c9d6d92bf4ef61a404552bfe74f828b48bffffffffff9fe5a8598409fc99b08a709c078027361fb338276b79a73ded76d600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000006d4d6f6f20c3a9f09f9a806f20c3a9c3a94d6f6ff09f9a806f206f6ff09f9a804d206f4df09f9a80c3a94d6f206f4df09f9a806ff09f9a806ff09f9a80c3a9c3a9f09f9a80f09f9a806f20f09f9a80f09f9a806f6f6fc3a9c3a94d6f4d6f4dc3a94d6fc3a96fc3a96f20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806ff09f9a80f09f9a806f20204d20f09f9a80f09f9a80f09f9a80f09f9a804d206fc3a96ff09f9a80204d6ff09f9a806f4d6f6f206fc3a96f6ff09f9a80206f6fc3a96f6f4d00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a804df09f9a804df09f9a804d6ff09f9a80f09f9a80c3a96f6f6f6f6f204df09f9a806f6f6f4df09f9a80206f6f6f6f6ff09f9a804d2000000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a804dc3a96f6f6f20c3a9f09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a804d6fc3a96ff09f9a80f09f9a806f6f204d4d6f6f204df09f9a80f09f9a80c3a96f204d6fc3a900000000000000000000000000000000" + }, + { + "name": "random-(address,(bool,uint200[4],bytes28,bool),bool,int128,(bool,uint40,int104,uint))[4]", + "type": "(address,(bool,uint200[4],bytes28,bool),bool,int128,(bool,uint40,int104,uint))[4]", + "value": [ + [ + "0x6483b9602C68e905Bf8ba36a0a065415AB0af639", + [ + false, + [ + "514418966516435233886617767315871194762489908019221809404937", + "1501301031376961989029119853109627840372611485460022744085300", + "886410764806953048739611382037083609063717646795463602629845", + "484839980374218021364421632701016896284980611634496973281303" + ], + "0x83800d9f180ed67448931eed391601efff9ed1eb3b9a0d28cafb75e7", + true + ], + false, + "159253254907323182171260364339284352736", + [ + true, + "356730127431", + "9865322582107325960357830613087", + "8917537136417570004895590792349751377912321068607954940412896965217111454225" + ] + ], + [ + "0x1fAc7D74fF8B14264Dffc4F6BE1d2A09Ece171A3", + [ + true, + [ + "208484493814751486215646927731951067772625605766199890187923", + "907317232110342302212824042144906099749316601970104833768789", + "1509802737972189884820211405020107276437736938445460851485868", + "1368341901723745459116338988653705531947186370600717212032282" + ], + "0x30595d8c38d6350a3feeb0b5cbc50cafe620ebe75c1c9abcdf2fb661", + false + ], + false, + "113780725728544935959998669027456894192", + [ + true, + "569090002234", + "-5336575856077555684976670893979", + "87679255559492701024840493125083147882122682150621466792864560735426498258820" + ] + ], + [ + "0x0fe99cBb2FA277920d0e513e5093C1FdE041887E", + [ + false, + [ + "1242953348252922234096489672624760123702588763836821025423178", + "1474863606468306197946980957972383073856011997314937628246599", + "1519596270615883600197587582703232936025841624373245792116816", + "362417721106762462522546254185983175042631063770498773219637" + ], + "0x03950a42d674f329cb32699d200209dafd0549e92dc72a986ee84d3d", + false + ], + true, + "-21589455210126976280773672598553462871", + [ + false, + "135164124912", + "698874988038875535616621341509", + "71716764466554667585906090537894085286604969046244044223447440073180178282454" + ] + ], + [ + "0xAb4b439080Fb6ceBfb94563950938c16870f7d82", + [ + true, + [ + "632860196372717783674286486022027403437074454738220515644741", + "274299308528172247642898691778826953000464098219242823186103", + "1426327979618991963186693445013090137831312669577752214371318", + "897217399086177366232178009194560614833548563200558209684306" + ], + "0x222ce2cdcdd5c0227e7cd8746883b99f661692c8baad87e9e164c3da", + false + ], + false, + "-140971589281360977008119422838855157695", + [ + true, + "486664439153", + "2630442530268493921144028828147", + "56297137938606624557141739559683911873547666379441084222492019964013227321946" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6483b9602C68e905Bf8ba36a0a065415AB0af639" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "514418966516435233886617767315871194762489908019221809404937" + }, + { + "type": "number", + "value": "1501301031376961989029119853109627840372611485460022744085300" + }, + { + "type": "number", + "value": "886410764806953048739611382037083609063717646795463602629845" + }, + { + "type": "number", + "value": "484839980374218021364421632701016896284980611634496973281303" + } + ] + }, + { + "type": "hexstring", + "value": "0x83800d9f180ed67448931eed391601efff9ed1eb3b9a0d28cafb75e7" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "159253254907323182171260364339284352736" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "356730127431" + }, + { + "type": "number", + "value": "9865322582107325960357830613087" + }, + { + "type": "number", + "value": "8917537136417570004895590792349751377912321068607954940412896965217111454225" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1fAc7D74fF8B14264Dffc4F6BE1d2A09Ece171A3" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "208484493814751486215646927731951067772625605766199890187923" + }, + { + "type": "number", + "value": "907317232110342302212824042144906099749316601970104833768789" + }, + { + "type": "number", + "value": "1509802737972189884820211405020107276437736938445460851485868" + }, + { + "type": "number", + "value": "1368341901723745459116338988653705531947186370600717212032282" + } + ] + }, + { + "type": "hexstring", + "value": "0x30595d8c38d6350a3feeb0b5cbc50cafe620ebe75c1c9abcdf2fb661" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "113780725728544935959998669027456894192" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "569090002234" + }, + { + "type": "number", + "value": "-5336575856077555684976670893979" + }, + { + "type": "number", + "value": "87679255559492701024840493125083147882122682150621466792864560735426498258820" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0fe99cBb2FA277920d0e513e5093C1FdE041887E" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1242953348252922234096489672624760123702588763836821025423178" + }, + { + "type": "number", + "value": "1474863606468306197946980957972383073856011997314937628246599" + }, + { + "type": "number", + "value": "1519596270615883600197587582703232936025841624373245792116816" + }, + { + "type": "number", + "value": "362417721106762462522546254185983175042631063770498773219637" + } + ] + }, + { + "type": "hexstring", + "value": "0x03950a42d674f329cb32699d200209dafd0549e92dc72a986ee84d3d" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-21589455210126976280773672598553462871" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "135164124912" + }, + { + "type": "number", + "value": "698874988038875535616621341509" + }, + { + "type": "number", + "value": "71716764466554667585906090537894085286604969046244044223447440073180178282454" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xAb4b439080Fb6ceBfb94563950938c16870f7d82" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "632860196372717783674286486022027403437074454738220515644741" + }, + { + "type": "number", + "value": "274299308528172247642898691778826953000464098219242823186103" + }, + { + "type": "number", + "value": "1426327979618991963186693445013090137831312669577752214371318" + }, + { + "type": "number", + "value": "897217399086177366232178009194560614833548563200558209684306" + } + ] + }, + { + "type": "hexstring", + "value": "0x222ce2cdcdd5c0227e7cd8746883b99f661692c8baad87e9e164c3da" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-140971589281360977008119422838855157695" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "486664439153" + }, + { + "type": "number", + "value": "2630442530268493921144028828147" + }, + { + "type": "number", + "value": "56297137938606624557141739559683911873547666379441084222492019964013227321946" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610830806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906106ee565b60405180910390f35b61005661060e565b61005e61060e565b61006661063b565b736483b9602c68e905bf8ba36a0a065415ab0af63981526100856106a0565b600081526100916106d0565b7851f3a09be84005f328401d106d258245b5178868df5d711c09815278ef2bca1fe3ad1b0067def7a33a5d98bbee6f9b9c85547c7334602080830191909152788d36a032d2653d2eee25cb76f73fabf513d442616c2fd26cd5604080840191909152784d3d4d959604452586f59fcba9799c3fc199782b88a0c79817606080850191909152848301939093527f83800d9f180ed67448931eed391601efff9ed1eb3b9a0d28cafb75e700000000848201526001848401819052858301949094526000858201526f77cf0fad35970ce62ece4e8363c51ee08584015280516080808201835294815264530ec5c447928101929092526c7c849393958daee613abe6585f908201527f13b725abf42e8f6f3a752d762ab5991211e3b5483fd83bbc2bbfe402c03f3211918101919091529082015281526101cd61063b565b731fac7d74ff8b14264dffc4f6be1d2a09ece171a381526101ec6106a0565b600181526101f86106d0565b782136a7adab648295d420d6d281ad501013838d7be2fa089693815278908b41e6d7d248b6fdae3ab393d90129cbe939c2a844957d5560208083019190915278f086841540ad3ba072176d43ba70ea8345cd93b16881c16cac60408084019190915278d9fd4c0a448608ba2d95128d90a26c3e0781a747beca759d1a606080850191909152848301939093527f30595d8c38d6350a3feeb0b5cbc50cafe620ebe75c1c9abcdf2fb6610000000084820152600084840181905285830194909452848101939093526f55995ee4b801d610a94a9bf9bfbcc4f08483015282516080808201855260018252648480684d3a828401526c435b6815e7a6197174e891679a19948201949094527fc1d8b33416f30c7753a0d539cd90847366dd4bf37ab0c6bdd10507374fe7e784928101929092529183015282015261033861063b565b730fe99cbb2fa277920d0e513e5093c1fde041887e81526103576106a0565b600081526103636106d0565b78c6038e7580582f3b993bd9cd5d4ab8fa9892a1d890bf057f4a815278eaf59687915ada21032950f77cd5ba93e916574aee73d1c24760208083019190915278f215ed55b0999aa4651c079d75a29181ba3da8b9e4ffd660506040808401919091527839bc898f4943c29a8dd20311a3637bd615f4f581da8b42f935606080850191909152848301939093527f03950a42d674f329cb32699d200209dafd0549e92dc72a986ee84d3d00000000848201526000848401819052858301949094526001858201526f103dfa52e276fcaf962266963e9b88561985840152805160808082018352948152641f7868def0928101929092526c08d22fd738606196ab6d42eb45828201527f9e8e400eaade72e4839535d98d3066f5d40df724f77965fc9aa103de4caff7d692820192909252918301919091528201526104a461063b565b73ab4b439080fb6cebfb94563950938c16870f7d8281526104c36106a0565b600181526104cf6106d0565b7864d208bf4979f31b19eef17d32e71ba229c6fb553268a8d5458152782bb2ca67d637df04858437864ca4b795023957e1a654d576b760208083019190915278e33a26f0f1578d6ea8dfec2be338fc716af9bf22d8aa7dfbf6604080840191909152788eef5ab98ee8dbfbc96cea1f3f1a785345a92488825813d352606080850191909152848301939093527f222ce2cdcdd5c0227e7cd8746883b99f661692c8baad87e9e164c3da0000000084820152600084840181905285830194909452848101939093526f6a0e23f87eba00deabd1ccdc9bc7c7be19848301528251608080820185526001825264714f760571928201929092526c21336b103fc4b70e636ed491f3938101939093527f7c770d07146c609e514056ee41be8da179b1a5b4b134497895090e6c0ba4aa5a83830152830191909152820152919050565b60405180608001604052806004905b61062561063b565b81526020019060019003908161061d5790505090565b6040518060a0016040528060006001600160a01b0316815260200161065e6106a0565b8152600060208201819052604082015260600161069b60408051608081018252600080825260208201819052918101829052606081019190915290565b905290565b60405180608001604052806000151581526020016106bc6106d0565b815260006020820181905260409091015290565b60405180608001604052806004906020820280368337509192915050565b610700810181836000805b600480821061070857506107f0565b835180516001600160a01b031686526020808201518051151582890152808201516040808a01885b878110156107555783516001600160c81b031682529285019290850190600101610730565b50508281015163ffffffff191660c08b0152606092830151151560e08b01528401518015156101008b015291945061078a9050565b5091810151916107a0610120880184600f0b9052565b6080919091015180511515610140880152602081015164ffffffffff166101608801526040810151600c0b610180880152606001516101a08701526101c0909501949390930192506001016106f9565b505050509291505056fea2646970667358221220e65fc41beee1797c6e44e3c3974c8c503aa4510ceb25a0848f7e31ab7911cb8464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ba634d2e {\n bool s_0;\n uint200[4] s_1;\n bytes28 s_2;\n bool s_3;\n }\n\n struct S_c2f85d44 {\n bool s_0;\n uint40 s_1;\n int104 s_2;\n uint256 s_3;\n }\n\n struct S_2a9d1dd8 {\n address s_0;\n S_ba634d2e s_1;\n bool s_2;\n int128 s_3;\n S_c2f85d44 s_4;\n }\n\n function test () public pure returns (S_2a9d1dd8[4] memory) {\n S_2a9d1dd8[4] memory r;\n {\n S_2a9d1dd8 memory r_0;\n {\n address r_0_0 = 0x6483b9602C68e905Bf8ba36a0a065415AB0af639;\n r_0.s_0 = r_0_0;\n }\n {\n S_ba634d2e memory r_0_1;\n {\n bool r_0_1_0 = false;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n uint200[4] memory r_0_1_1;\n {\n uint200 r_0_1_1_0 = 514418966516435233886617767315871194762489908019221809404937;\n r_0_1_1[0] = r_0_1_1_0;\n }\n {\n uint200 r_0_1_1_1 = 1501301031376961989029119853109627840372611485460022744085300;\n r_0_1_1[1] = r_0_1_1_1;\n }\n {\n uint200 r_0_1_1_2 = 886410764806953048739611382037083609063717646795463602629845;\n r_0_1_1[2] = r_0_1_1_2;\n }\n {\n uint200 r_0_1_1_3 = 484839980374218021364421632701016896284980611634496973281303;\n r_0_1_1[3] = r_0_1_1_3;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n bytes28 r_0_1_2 = bytes28(0x83800d9f180ed67448931eed391601efff9ed1eb3b9a0d28cafb75e7);\n r_0_1.s_2 = r_0_1_2;\n }\n {\n bool r_0_1_3 = true;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n {\n int128 r_0_3 = 159253254907323182171260364339284352736;\n r_0.s_3 = r_0_3;\n }\n {\n S_c2f85d44 memory r_0_4;\n {\n bool r_0_4_0 = true;\n r_0_4.s_0 = r_0_4_0;\n }\n {\n uint40 r_0_4_1 = 356730127431;\n r_0_4.s_1 = r_0_4_1;\n }\n {\n int104 r_0_4_2 = 9865322582107325960357830613087;\n r_0_4.s_2 = r_0_4_2;\n }\n {\n uint r_0_4_3 = 8917537136417570004895590792349751377912321068607954940412896965217111454225;\n r_0_4.s_3 = r_0_4_3;\n }\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_2a9d1dd8 memory r_1;\n {\n address r_1_0 = 0x1fAc7D74fF8B14264Dffc4F6BE1d2A09Ece171A3;\n r_1.s_0 = r_1_0;\n }\n {\n S_ba634d2e memory r_1_1;\n {\n bool r_1_1_0 = true;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n uint200[4] memory r_1_1_1;\n {\n uint200 r_1_1_1_0 = 208484493814751486215646927731951067772625605766199890187923;\n r_1_1_1[0] = r_1_1_1_0;\n }\n {\n uint200 r_1_1_1_1 = 907317232110342302212824042144906099749316601970104833768789;\n r_1_1_1[1] = r_1_1_1_1;\n }\n {\n uint200 r_1_1_1_2 = 1509802737972189884820211405020107276437736938445460851485868;\n r_1_1_1[2] = r_1_1_1_2;\n }\n {\n uint200 r_1_1_1_3 = 1368341901723745459116338988653705531947186370600717212032282;\n r_1_1_1[3] = r_1_1_1_3;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n bytes28 r_1_1_2 = bytes28(0x30595d8c38d6350a3feeb0b5cbc50cafe620ebe75c1c9abcdf2fb661);\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bool r_1_1_3 = false;\n r_1_1.s_3 = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n {\n bool r_1_2 = false;\n r_1.s_2 = r_1_2;\n }\n {\n int128 r_1_3 = 113780725728544935959998669027456894192;\n r_1.s_3 = r_1_3;\n }\n {\n S_c2f85d44 memory r_1_4;\n {\n bool r_1_4_0 = true;\n r_1_4.s_0 = r_1_4_0;\n }\n {\n uint40 r_1_4_1 = 569090002234;\n r_1_4.s_1 = r_1_4_1;\n }\n {\n int104 r_1_4_2 = -5336575856077555684976670893979;\n r_1_4.s_2 = r_1_4_2;\n }\n {\n uint r_1_4_3 = 87679255559492701024840493125083147882122682150621466792864560735426498258820;\n r_1_4.s_3 = r_1_4_3;\n }\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_2a9d1dd8 memory r_2;\n {\n address r_2_0 = 0x0fe99cBb2FA277920d0e513e5093C1FdE041887E;\n r_2.s_0 = r_2_0;\n }\n {\n S_ba634d2e memory r_2_1;\n {\n bool r_2_1_0 = false;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n uint200[4] memory r_2_1_1;\n {\n uint200 r_2_1_1_0 = 1242953348252922234096489672624760123702588763836821025423178;\n r_2_1_1[0] = r_2_1_1_0;\n }\n {\n uint200 r_2_1_1_1 = 1474863606468306197946980957972383073856011997314937628246599;\n r_2_1_1[1] = r_2_1_1_1;\n }\n {\n uint200 r_2_1_1_2 = 1519596270615883600197587582703232936025841624373245792116816;\n r_2_1_1[2] = r_2_1_1_2;\n }\n {\n uint200 r_2_1_1_3 = 362417721106762462522546254185983175042631063770498773219637;\n r_2_1_1[3] = r_2_1_1_3;\n }\n r_2_1.s_1 = r_2_1_1;\n }\n {\n bytes28 r_2_1_2 = bytes28(0x03950a42d674f329cb32699d200209dafd0549e92dc72a986ee84d3d);\n r_2_1.s_2 = r_2_1_2;\n }\n {\n bool r_2_1_3 = false;\n r_2_1.s_3 = r_2_1_3;\n }\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2.s_2 = r_2_2;\n }\n {\n int128 r_2_3 = -21589455210126976280773672598553462871;\n r_2.s_3 = r_2_3;\n }\n {\n S_c2f85d44 memory r_2_4;\n {\n bool r_2_4_0 = false;\n r_2_4.s_0 = r_2_4_0;\n }\n {\n uint40 r_2_4_1 = 135164124912;\n r_2_4.s_1 = r_2_4_1;\n }\n {\n int104 r_2_4_2 = 698874988038875535616621341509;\n r_2_4.s_2 = r_2_4_2;\n }\n {\n uint r_2_4_3 = 71716764466554667585906090537894085286604969046244044223447440073180178282454;\n r_2_4.s_3 = r_2_4_3;\n }\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n {\n S_2a9d1dd8 memory r_3;\n {\n address r_3_0 = 0xAb4b439080Fb6ceBfb94563950938c16870f7d82;\n r_3.s_0 = r_3_0;\n }\n {\n S_ba634d2e memory r_3_1;\n {\n bool r_3_1_0 = true;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n uint200[4] memory r_3_1_1;\n {\n uint200 r_3_1_1_0 = 632860196372717783674286486022027403437074454738220515644741;\n r_3_1_1[0] = r_3_1_1_0;\n }\n {\n uint200 r_3_1_1_1 = 274299308528172247642898691778826953000464098219242823186103;\n r_3_1_1[1] = r_3_1_1_1;\n }\n {\n uint200 r_3_1_1_2 = 1426327979618991963186693445013090137831312669577752214371318;\n r_3_1_1[2] = r_3_1_1_2;\n }\n {\n uint200 r_3_1_1_3 = 897217399086177366232178009194560614833548563200558209684306;\n r_3_1_1[3] = r_3_1_1_3;\n }\n r_3_1.s_1 = r_3_1_1;\n }\n {\n bytes28 r_3_1_2 = bytes28(0x222ce2cdcdd5c0227e7cd8746883b99f661692c8baad87e9e164c3da);\n r_3_1.s_2 = r_3_1_2;\n }\n {\n bool r_3_1_3 = false;\n r_3_1.s_3 = r_3_1_3;\n }\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = false;\n r_3.s_2 = r_3_2;\n }\n {\n int128 r_3_3 = -140971589281360977008119422838855157695;\n r_3.s_3 = r_3_3;\n }\n {\n S_c2f85d44 memory r_3_4;\n {\n bool r_3_4_0 = true;\n r_3_4.s_0 = r_3_4_0;\n }\n {\n uint40 r_3_4_1 = 486664439153;\n r_3_4.s_1 = r_3_4_1;\n }\n {\n int104 r_3_4_2 = 2630442530268493921144028828147;\n r_3_4.s_2 = r_3_4_2;\n }\n {\n uint r_3_4_3 = 56297137938606624557141739559683911873547666379441084222492019964013227321946;\n r_3_4.s_3 = r_3_4_3;\n }\n r_3.s_4 = r_3_4;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000006483b9602c68e905bf8ba36a0a065415ab0af63900000000000000000000000000000000000000000000000000000000000000000000000000000051f3a09be84005f328401d106d258245b5178868df5d711c0900000000000000ef2bca1fe3ad1b0067def7a33a5d98bbee6f9b9c85547c7334000000000000008d36a032d2653d2eee25cb76f73fabf513d442616c2fd26cd5000000000000004d3d4d959604452586f59fcba9799c3fc199782b88a0c7981783800d9f180ed67448931eed391601efff9ed1eb3b9a0d28cafb75e700000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077cf0fad35970ce62ece4e8363c51ee00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000530ec5c447000000000000000000000000000000000000007c849393958daee613abe6585f13b725abf42e8f6f3a752d762ab5991211e3b5483fd83bbc2bbfe402c03f32110000000000000000000000001fac7d74ff8b14264dffc4f6be1d2a09ece171a30000000000000000000000000000000000000000000000000000000000000001000000000000002136a7adab648295d420d6d281ad501013838d7be2fa08969300000000000000908b41e6d7d248b6fdae3ab393d90129cbe939c2a844957d5500000000000000f086841540ad3ba072176d43ba70ea8345cd93b16881c16cac00000000000000d9fd4c0a448608ba2d95128d90a26c3e0781a747beca759d1a30595d8c38d6350a3feeb0b5cbc50cafe620ebe75c1c9abcdf2fb66100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055995ee4b801d610a94a9bf9bfbcc4f000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008480684d3affffffffffffffffffffffffffffffffffffffbca497ea1859e68e8b176e9865c1d8b33416f30c7753a0d539cd90847366dd4bf37ab0c6bdd10507374fe7e7840000000000000000000000000fe99cbb2fa277920d0e513e5093c1fde041887e000000000000000000000000000000000000000000000000000000000000000000000000000000c6038e7580582f3b993bd9cd5d4ab8fa9892a1d890bf057f4a00000000000000eaf59687915ada21032950f77cd5ba93e916574aee73d1c24700000000000000f215ed55b0999aa4651c079d75a29181ba3da8b9e4ffd660500000000000000039bc898f4943c29a8dd20311a3637bd615f4f581da8b42f93503950a42d674f329cb32699d200209dafd0549e92dc72a986ee84d3d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffefc205ad1d89035069dd9969c16477a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f7868def00000000000000000000000000000000000000008d22fd738606196ab6d42eb459e8e400eaade72e4839535d98d3066f5d40df724f77965fc9aa103de4caff7d6000000000000000000000000ab4b439080fb6cebfb94563950938c16870f7d8200000000000000000000000000000000000000000000000000000000000000010000000000000064d208bf4979f31b19eef17d32e71ba229c6fb553268a8d545000000000000002bb2ca67d637df04858437864ca4b795023957e1a654d576b700000000000000e33a26f0f1578d6ea8dfec2be338fc716af9bf22d8aa7dfbf6000000000000008eef5ab98ee8dbfbc96cea1f3f1a785345a92488825813d352222ce2cdcdd5c0227e7cd8746883b99f661692c8baad87e9e164c3da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff95f1dc078145ff21542e3323643838410000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000714f7605710000000000000000000000000000000000000021336b103fc4b70e636ed491f37c770d07146c609e514056ee41be8da179b1a5b4b134497895090e6c0ba4aa5a" + }, + { + "name": "random-(address,string,(uint40,bytes15,bytes28,int,string),(bytes25,int136,address,uint,string),bytes23)", + "type": "(address,string,(uint40,bytes15,bytes28,int,string),(bytes25,int136,address,uint,string),bytes23)", + "value": [ + "0x1f6F9AA91DBc51ff53978965E1a84e19E4134e08", + "Moo é🚀éo🚀oMoéoM ééoéoMéMM MéMM MMMoéoMMéo🚀oMMoo", + [ + "963517794903", + "0x5d25e2555bb5e149f85c587a997614", + "0x73d50e2a4f03009d592af0a0a4e3b83b3a3ba2489a982c759868b1cb", + "45249570386203554570058350576891500613898921856836561708627905017830103504292", + "Moo é🚀M🚀oéMéoMM🚀ééMé" + ], + [ + "0x9c00280e7ee343df62cf359a8fe35413cf3a91e1f7f34faf28", + "-19896503621507867938384084543574584982430", + "0xf099D111a814e84e1605855d414ACEf536927986", + "34096947975909874148543574699556533163306716778029820395064892838708639072795", + "Moo é🚀oMoo oM🚀ooo🚀 oMoéoo🚀éoMooooooo🚀MMooé" + ], + "0x4f0f7c853c1f997998bd45503bed93d34cfb5b4654689c" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1f6F9AA91DBc51ff53978965E1a84e19E4134e08" + }, + { + "type": "string", + "value": "Moo é🚀éo🚀oMoéoM ééoéoMéMM MéMM MMMoéoMMéo🚀oMMoo" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "963517794903" + }, + { + "type": "hexstring", + "value": "0x5d25e2555bb5e149f85c587a997614" + }, + { + "type": "hexstring", + "value": "0x73d50e2a4f03009d592af0a0a4e3b83b3a3ba2489a982c759868b1cb" + }, + { + "type": "number", + "value": "45249570386203554570058350576891500613898921856836561708627905017830103504292" + }, + { + "type": "string", + "value": "Moo é🚀M🚀oéMéoMM🚀ééMé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9c00280e7ee343df62cf359a8fe35413cf3a91e1f7f34faf28" + }, + { + "type": "number", + "value": "-19896503621507867938384084543574584982430" + }, + { + "type": "address", + "value": "0xf099D111a814e84e1605855d414ACEf536927986" + }, + { + "type": "number", + "value": "34096947975909874148543574699556533163306716778029820395064892838708639072795" + }, + { + "type": "string", + "value": "Moo é🚀oMoo oM🚀ooo🚀 oMoéoo🚀éoMooooooo🚀MMooé" + } + ] + }, + { + "type": "hexstring", + "value": "0x4f0f7c853c1f997998bd45503bed93d34cfb5b4654689c" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061054b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061038c565b60405180910390f35b610056610246565b61005e610246565b731f6f9aa91dbc51ff53978965e1a84e19e4134e08815260408051608081019091526042808252600091906104b160208301396020830152506100ca6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b64e05622ca5781526e1749789556ed78527e17161ea65d85608a1b6020808301919091527f73d50e2a4f03009d592af0a0a4e3b83b3a3ba2489a982c759868b1cb000000006040808401919091527f640a5967ecb8e43db94ce706a8526be99843c24cf04e7604d75186ae0422d5a4606080850191909152815190810190915260238082526000926104f390830139608083015250604082015261016c6102a0565b7f9c00280e7ee343df62cf359a8fe35413cf3a91e1f7f34faf28000000000000008152703a78773619888bb330a1444736aa6dfb9d1960208083019190915273f099d111a814e84e1605855d414acef5369279866040808401919091527f4b62304b84e64fe10590383f9135ad9c1a4ac145ebf8cd6fa01dcfd80c06821b6060808501919091528151908101909152603d808252600092610474908301396080808401919091526060840192909252507f4f0f7c853c1f997998bd45503bed93d34cfb5b4654689c00000000000000000090820152919050565b6040805160a08082018352600080835260606020808501829052855193840186528284528301829052828501829052828101919091526080820152909182019081526020016102936102a0565b8152600060209091015290565b6040518060a00160405280600066ffffffffffffff19168152602001600060100b815260200160006001600160a01b0316815260200160008152602001606081525090565b6000815180845260005b8181101561030b576020818501810151868301820152016102ef565b8181111561031d576000602083870101525b50601f01601f19169290920160200192915050565b66ffffffffffffff198151168252602081015160100b602083015260018060a01b036040820151166040830152606081015160608301526000608082015160a0608085015261038460a08501826102e5565b949350505050565b602080825282516001600160a01b03168282015282015160a060408301526000906103ba60c08401826102e5565b90506040840151601f198085840301606086015264ffffffffff825116835270ffffffffffffffffffffffffffffffffff19602083015116602084015263ffffffff196040830151166040840152606082015160608401526080820151915060a0608084015261042d60a08401836102e5565b925060608601519150808584030160808601525061044b8282610332565b915050608084015161046b60a085018268ffffffffffffffffff19169052565b50939250505056fe4d6f6f20c3a9f09f9a806f4d6f6f206f4df09f9a806f6f6ff09f9a80206f4d6fc3a96f6ff09f9a80c3a96f4d6f6f6f6f6f6f6ff09f9a804d4d6f6fc3a94d6f6f20c3a9f09f9a80c3a96ff09f9a806f4d6fc3a96f4d20c3a9c3a96fc3a96f4dc3a94d4d204dc3a94d4d204d4d4d6fc3a96f4d4dc3a96ff09f9a806f4d4d6f6f4d6f6f20c3a9f09f9a804df09f9a806fc3a94dc3a96f4d4df09f9a80c3a9c3a94dc3a9a2646970667358221220754b95e5a50280f3fbc3a0ff812f670f0b681b3d4032cb45f9a1d6907d049aa464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_e6dee617 {\n uint40 s_0;\n bytes15 s_1;\n bytes28 s_2;\n int256 s_3;\n string s_4;\n }\n\n struct S_390d33f2 {\n bytes25 s_0;\n int136 s_1;\n address s_2;\n uint256 s_3;\n string s_4;\n }\n\n struct S_93dc0348 {\n address s_0;\n string s_1;\n S_e6dee617 s_2;\n S_390d33f2 s_3;\n bytes23 s_4;\n }\n\n function test () public pure returns (S_93dc0348 memory) {\n S_93dc0348 memory r;\n {\n address r_0 = 0x1f6F9AA91DBc51ff53978965E1a84e19E4134e08;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éo🚀oMoéoM ééoéoMéMM MéMM MMMoéoMMéo🚀oMMoo\";\n r.s_1 = r_1;\n }\n {\n S_e6dee617 memory r_2;\n {\n uint40 r_2_0 = 963517794903;\n r_2.s_0 = r_2_0;\n }\n {\n bytes15 r_2_1 = bytes15(0x5d25e2555bb5e149f85c587a997614);\n r_2.s_1 = r_2_1;\n }\n {\n bytes28 r_2_2 = bytes28(0x73d50e2a4f03009d592af0a0a4e3b83b3a3ba2489a982c759868b1cb);\n r_2.s_2 = r_2_2;\n }\n {\n int r_2_3 = 45249570386203554570058350576891500613898921856836561708627905017830103504292;\n r_2.s_3 = r_2_3;\n }\n {\n string memory r_2_4 = unicode\"Moo é🚀M🚀oéMéoMM🚀ééMé\";\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n S_390d33f2 memory r_3;\n {\n bytes25 r_3_0 = bytes25(0x9c00280e7ee343df62cf359a8fe35413cf3a91e1f7f34faf28);\n r_3.s_0 = r_3_0;\n }\n {\n int136 r_3_1 = -19896503621507867938384084543574584982430;\n r_3.s_1 = r_3_1;\n }\n {\n address r_3_2 = 0xf099D111a814e84e1605855d414ACEf536927986;\n r_3.s_2 = r_3_2;\n }\n {\n uint r_3_3 = 34096947975909874148543574699556533163306716778029820395064892838708639072795;\n r_3.s_3 = r_3_3;\n }\n {\n string memory r_3_4 = unicode\"Moo é🚀oMoo oM🚀ooo🚀 oMoéoo🚀éoMooooooo🚀MMooé\";\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n {\n bytes23 r_4 = bytes23(0x4f0f7c853c1f997998bd45503bed93d34cfb5b4654689c);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000001f6f9aa91dbc51ff53978965e1a84e19e4134e0800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000002204f0f7c853c1f997998bd45503bed93d34cfb5b4654689c00000000000000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80c3a96ff09f9a806f4d6fc3a96f4d20c3a9c3a96fc3a96f4dc3a94d4d204dc3a94d4d204d4d4d6fc3a96f4d4dc3a96ff09f9a806f4d4d6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e05622ca575d25e2555bb5e149f85c587a997614000000000000000000000000000000000073d50e2a4f03009d592af0a0a4e3b83b3a3ba2489a982c759868b1cb00000000640a5967ecb8e43db94ce706a8526be99843c24cf04e7604d75186ae0422d5a400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a804df09f9a806fc3a94dc3a96f4d4df09f9a80c3a9c3a94dc3a900000000000000000000000000000000000000000000000000000000009c00280e7ee343df62cf359a8fe35413cf3a91e1f7f34faf2800000000000000ffffffffffffffffffffffffffffffc58788c9e677744ccf5ebbb8c955920462000000000000000000000000f099d111a814e84e1605855d414acef5369279864b62304b84e64fe10590383f9135ad9c1a4ac145ebf8cd6fa01dcfd80c06821b00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806f4d6f6f206f4df09f9a806f6f6ff09f9a80206f4d6fc3a96f6ff09f9a80c3a96f4d6f6f6f6f6f6f6ff09f9a804d4d6f6fc3a9000000" + }, + { + "name": "random-(bool,bool,(bytes21,bytes6),(bool,(address,(int144,bytes12),int248,bool),address,int88,string))", + "type": "(bool,bool,(bytes21,bytes6),(bool,(address,(int144,bytes12),int248,bool),address,int88,string))", + "value": [ + true, + true, + ["0xa35b243393d6cb7e61720acbe82552385725973ba5", "0xbb2453a9685b"], + [ + false, + [ + "0x6d73E405Cdb6aebfcE048d415067F3bddd217bA8", + ["7525579090553749767991480274236885517172672", "0x8a9bff23be1b4dec97be8d80"], + "11673953464856844942616539677257439346346987319979127891031453612887670754", + true + ], + "0x613e0709f953ccF63E22538d860b9F72A7505197", + "-3090628936535824130251653", + "Moo é🚀 ooM🚀ooM Mé 🚀ooMé" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa35b243393d6cb7e61720acbe82552385725973ba5" + }, + { + "type": "hexstring", + "value": "0xbb2453a9685b" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6d73E405Cdb6aebfcE048d415067F3bddd217bA8" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "7525579090553749767991480274236885517172672" + }, + { + "type": "hexstring", + "value": "0x8a9bff23be1b4dec97be8d80" + } + ] + }, + { + "type": "number", + "value": "11673953464856844942616539677257439346346987319979127891031453612887670754" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x613e0709f953ccF63E22538d860b9F72A7505197" + }, + { + "type": "number", + "value": "-3090628936535824130251653" + }, + { + "type": "string", + "value": "Moo é🚀 ooM🚀ooM Mé 🚀ooMé" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610418806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102ae565b60405180910390f35b6100566101b9565b61005e6101b9565b60018082526020820152610082604080518082019091526000808252602082015290565b74a35b243393d6cb7e61720acbe82552385725973ba560581b815265bb2453a9685b60d01b602082015260408201526100b96101fc565b6000808252604080516080810182528281528151808301835283815260208082018590528083019182528284018581526060808501878152736d73e405cdb6aebfce048d415067f3bddd217ba8865286518088018852715663b073ef68cc0a7debeedc0b31a16f7fc081526b011537fe477c369bd92f7d1b60a71b818601529094527e069b72fffc846a6abcaa7e5cfc20e1f744440026314ac7f24efac2847e7fe290915260019092528086019290925273613e0709f953ccf63e22538d860b9f72a7505197838601526a028e775492ed6e85461b84198186015282519081019092526023808352906103c0908301396080830152506060820152919050565b60408051608081018252600080825260208201529081016101ea604080518082019091526000808252602082015290565b81526020016101f76101fc565b905290565b6040518060a00160405280600015158152602001610248604080516080810182526000808252825180840184528181526020808201839052830152918101829052606081019190915290565b8152600060208201819052604082015260609081015290565b6000815180845260005b818110156102875760208185018101518683018201520161026b565b81811115610299576000602083870101525b50601f01601f19169290920160200192915050565b602080825282511515828201528281015115156040808401919091528084015180516affffffffffffffffffffff1916606080860191909152908301516001600160d01b03191660808501528085015160a0808601528051151560c08601528084015180516001600160a01b031660e087015280850151805160110b610100880152909401516001600160a01b0319166101208087019190915284840151601e0b610140870152918401511515610160860152918201516000939092916103816101808701856001600160a01b03169052565b606083015193506103986101a0870185600a0b9052565b60808301519350806101c08701525050506103b76101e0840182610261565b94935050505056fe4d6f6f20c3a9f09f9a80206f6f4df09f9a806f6f4d204dc3a920f09f9a806f6f4dc3a9a264697066735822122043a9b0c671683252000dd40e5c460877d68a714552ddc24fee0cbb4e12c75d5c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ba958cef {\n bytes21 s_0;\n bytes6 s_1;\n }\n\n struct S_555d9b69 {\n int144 s_0;\n bytes12 s_1;\n }\n\n struct S_a4a62bcb {\n address s_0;\n S_555d9b69 s_1;\n int248 s_2;\n bool s_3;\n }\n\n struct S_5bf68f0b {\n bool s_0;\n S_a4a62bcb s_1;\n address s_2;\n int88 s_3;\n string s_4;\n }\n\n struct S_99790a4e {\n bool s_0;\n bool s_1;\n S_ba958cef s_2;\n S_5bf68f0b s_3;\n }\n\n function test () public pure returns (S_99790a4e memory) {\n S_99790a4e memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_ba958cef memory r_2;\n {\n bytes21 r_2_0 = bytes21(0xa35b243393d6cb7e61720acbe82552385725973ba5);\n r_2.s_0 = r_2_0;\n }\n {\n bytes6 r_2_1 = bytes6(0xbb2453a9685b);\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n S_5bf68f0b memory r_3;\n {\n bool r_3_0 = false;\n r_3.s_0 = r_3_0;\n }\n {\n S_a4a62bcb memory r_3_1;\n {\n address r_3_1_0 = 0x6d73E405Cdb6aebfcE048d415067F3bddd217bA8;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n S_555d9b69 memory r_3_1_1;\n {\n int144 r_3_1_1_0 = 7525579090553749767991480274236885517172672;\n r_3_1_1.s_0 = r_3_1_1_0;\n }\n {\n bytes12 r_3_1_1_1 = bytes12(0x8a9bff23be1b4dec97be8d80);\n r_3_1_1.s_1 = r_3_1_1_1;\n }\n r_3_1.s_1 = r_3_1_1;\n }\n {\n int248 r_3_1_2 = 11673953464856844942616539677257439346346987319979127891031453612887670754;\n r_3_1.s_2 = r_3_1_2;\n }\n {\n bool r_3_1_3 = true;\n r_3_1.s_3 = r_3_1_3;\n }\n r_3.s_1 = r_3_1;\n }\n {\n address r_3_2 = 0x613e0709f953ccF63E22538d860b9F72A7505197;\n r_3.s_2 = r_3_2;\n }\n {\n int88 r_3_3 = -3090628936535824130251653;\n r_3.s_3 = r_3_3;\n }\n {\n string memory r_3_4 = unicode\"Moo é🚀 ooM🚀ooM Mé 🚀ooMé\";\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a35b243393d6cb7e61720acbe82552385725973ba50000000000000000000000bb2453a9685b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d73e405cdb6aebfce048d415067f3bddd217ba800000000000000000000000000005663b073ef68cc0a7debeedc0b31a16f7fc08a9bff23be1b4dec97be8d80000000000000000000000000000000000000000000069b72fffc846a6abcaa7e5cfc20e1f744440026314ac7f24efac2847e7fe20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000613e0709f953ccf63e22538d860b9f72a7505197fffffffffffffffffffffffffffffffffffffffffffd7188ab6d12917ab9e47b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80206f6f4df09f9a806f6f4d204dc3a920f09f9a806f6f4dc3a90000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes20,(uint240,uint32,(((bytes26,address)),bool,string,bytes1,(bool,bool)),(address,address,uint80)))", + "type": "(bytes20,(uint240,uint32,(((bytes26,address)),bool,string,bytes1,(bool,bool)),(address,address,uint80)))", + "value": [ + "0x7543676c36552749c981859bfa1da42cc8635586", + [ + "848900141235319058079322759146918135940608999140472087548375057634067570", + "2633321923", + [ + [ + [ + "0x09542dc7aae78b6537535c2de2e954f96f759458ac45f47dab60", + "0x4A045c296584c765B7CC82B8C83BbA28a209971d" + ] + ], + true, + "Moo é🚀🚀🚀éM oé Mo🚀🚀 🚀oé🚀🚀🚀éMM M🚀é Mo é ", + "0xcc", + [false, true] + ], + [ + "0x2a9102268b16C6eD54d1F5089ae618C7d69B60CE", + "0x0d31AA2D7B8dc2b46F8536232D62742237FA92ad", + "286450449107416109303001" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7543676c36552749c981859bfa1da42cc8635586" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "848900141235319058079322759146918135940608999140472087548375057634067570" + }, + { + "type": "number", + "value": "2633321923" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x09542dc7aae78b6537535c2de2e954f96f759458ac45f47dab60" + }, + { + "type": "address", + "value": "0x4A045c296584c765B7CC82B8C83BbA28a209971d" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀éM oé Mo🚀🚀 🚀oé🚀🚀🚀éMM M🚀é Mo é " + }, + { + "type": "hexstring", + "value": "0xcc" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2a9102268b16C6eD54d1F5089ae618C7d69B60CE" + }, + { + "type": "address", + "value": "0x0d31AA2D7B8dc2b46F8536232D62742237FA92ad" + }, + { + "type": "number", + "value": "286450449107416109303001" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061049b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102bc565b60405180910390f35b6100566101e9565b61005e6101e9565b733aa1b3b61b2a93a4e4c0c2cdfd0ed2166431aac360611b8152610080610208565b7d7aff74ccec964f3f5ed64fe76744b4a8ee202aa4554af54a01375ff284728152639cf54dc360208201526100b361024a565b60408051606081018252600060208083018281528385018390528352835180850185527f09542dc7aae78b6537535c2de2e954f96f759458ac45f47dab600000000000008152734a045c296584c765b7cc82b8c83bba28a209971d818301528352918452600184830152825160808101909352604d80845290929161041990830139604080840191909152603360fa1b60608401528051808201909152600080825260208201529050600081526001602082015260808201526040820152610194604080516060810182526000808252602082018190529181019190915290565b732a9102268b16c6ed54d1f5089ae618c7d69b60ce8152730d31aa2d7b8dc2b46f8536232d62742237fa92ad602080830191909152693ca8828cd7abb7b844d960408301526060830191909152820152919050565b604080518082019091526000815260208101610203610208565b905290565b604080516080810182526000808252602082015290810161022761024a565b815260408051606081018252600080825260208281018290529282015291015290565b6040518060a00160405280610275604080516060810182526000602082018181529282015290815290565b81526020016000151581526020016060815260200160006001600160f81b031916815260200161020360405180604001604052806000151581526020016000151581525090565b602080825282516bffffffffffffffffffffffff19168282015282810151604080840181905281516001600160f01b031660608501528183015163ffffffff1660808501528082015160c060a0860152805151805165ffffffffffff19166101208701528401516001600160a01b03166101408601528084015115156101608601529081015160e06101808601528051610200860181905260009493929190855b8181101561037a578281018601518882016102200152850161035d565b8181111561038d576000610220838a0101525b5060608301516001600160f81b031981166101a089015294506080830151805115156101c0890152602081015115156101e08901529450606084015180516001600160a01b0390811660c08a015260208201511660e0890152604081015169ffffffffffffffffffff166101008901529450601f01601f19169590950161022001969550505050505056fe4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a94d206fc3a92020204d6ff09f9a80f09f9a8020f09f9a806fc3a9f09f9a80f09f9a80f09f9a80c3a94d4d204df09f9a80c3a9204d6f20c3a920a2646970667358221220661b27cb5e16e6e9fdc4aed04dbbc4ef627891978a46405ced3f0ef2b8ed060e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ec804f62 {\n bytes26 s_0;\n address s_1;\n }\n\n struct S_f75f58e4 {\n S_ec804f62 s_0;\n }\n\n struct S_25e98821 {\n bool s_0;\n bool s_1;\n }\n\n struct S_a32c0f73 {\n S_f75f58e4 s_0;\n bool s_1;\n string s_2;\n bytes1 s_3;\n S_25e98821 s_4;\n }\n\n struct S_fb1fb05a {\n address s_0;\n address s_1;\n uint80 s_2;\n }\n\n struct S_81c46499 {\n uint240 s_0;\n uint32 s_1;\n S_a32c0f73 s_2;\n S_fb1fb05a s_3;\n }\n\n struct S_a641b0aa {\n bytes20 s_0;\n S_81c46499 s_1;\n }\n\n function test () public pure returns (S_a641b0aa memory) {\n S_a641b0aa memory r;\n {\n bytes20 r_0 = bytes20(0x7543676C36552749c981859bfA1da42Cc8635586);\n r.s_0 = r_0;\n }\n {\n S_81c46499 memory r_1;\n {\n uint240 r_1_0 = 848900141235319058079322759146918135940608999140472087548375057634067570;\n r_1.s_0 = r_1_0;\n }\n {\n uint32 r_1_1 = 2633321923;\n r_1.s_1 = r_1_1;\n }\n {\n S_a32c0f73 memory r_1_2;\n {\n S_f75f58e4 memory r_1_2_0;\n {\n S_ec804f62 memory r_1_2_0_0;\n {\n bytes26 r_1_2_0_0_0 = bytes26(0x09542dc7aae78b6537535c2de2e954f96f759458ac45f47dab60);\n r_1_2_0_0.s_0 = r_1_2_0_0_0;\n }\n {\n address r_1_2_0_0_1 = 0x4A045c296584c765B7CC82B8C83BbA28a209971d;\n r_1_2_0_0.s_1 = r_1_2_0_0_1;\n }\n r_1_2_0.s_0 = r_1_2_0_0;\n }\n r_1_2.s_0 = r_1_2_0;\n }\n {\n bool r_1_2_1 = true;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n string memory r_1_2_2 = unicode\"Moo é🚀🚀🚀éM oé Mo🚀🚀 🚀oé🚀🚀🚀éMM M🚀é Mo é \";\n r_1_2.s_2 = r_1_2_2;\n }\n {\n bytes1 r_1_2_3 = bytes1(0xcc);\n r_1_2.s_3 = r_1_2_3;\n }\n {\n S_25e98821 memory r_1_2_4;\n {\n bool r_1_2_4_0 = false;\n r_1_2_4.s_0 = r_1_2_4_0;\n }\n {\n bool r_1_2_4_1 = true;\n r_1_2_4.s_1 = r_1_2_4_1;\n }\n r_1_2.s_4 = r_1_2_4;\n }\n r_1.s_2 = r_1_2;\n }\n {\n S_fb1fb05a memory r_1_3;\n {\n address r_1_3_0 = 0x2a9102268b16C6eD54d1F5089ae618C7d69B60CE;\n r_1_3.s_0 = r_1_3_0;\n }\n {\n address r_1_3_1 = 0x0d31AA2D7B8dc2b46F8536232D62742237FA92ad;\n r_1_3.s_1 = r_1_3_1;\n }\n {\n uint80 r_1_3_2 = 286450449107416109303001;\n r_1_3.s_2 = r_1_3_2;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000207543676c36552749c981859bfa1da42cc8635586000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000007aff74ccec964f3f5ed64fe76744b4a8ee202aa4554af54a01375ff28472000000000000000000000000000000000000000000000000000000009cf54dc300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000002a9102268b16c6ed54d1f5089ae618c7d69b60ce0000000000000000000000000d31aa2d7b8dc2b46f8536232d62742237fa92ad000000000000000000000000000000000000000000003ca8828cd7abb7b844d909542dc7aae78b6537535c2de2e954f96f759458ac45f47dab600000000000000000000000000000000000004a045c296584c765b7cc82b8c83bba28a209971d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a94d206fc3a92020204d6ff09f9a80f09f9a8020f09f9a806fc3a9f09f9a80f09f9a80f09f9a80c3a94d4d204df09f9a80c3a9204d6f20c3a92000000000000000000000000000000000000000" + }, + { + "name": "random-(int,(string,bool[]),((int208,address,uint248,int248,bytes15),bytes7),string,address)[]", + "type": "(int,(string,bool[]),((int208,address,uint248,int248,bytes15),bytes7),string,address)[]", + "value": [ + [ + "29665255536610695984836050210051370942773068286714870907833463307248536471239", + [ + "Moo é🚀M éMééoo🚀Mo🚀o🚀🚀Mé oM é🚀🚀ooMo o🚀 M oo oMo🚀🚀M oM éoo MoéMo", + [false] + ], + [ + [ + "-30041045181995666196066674519678368197547957991507196690770473", + "0xf43E5b24CfBa2829500E6C2D4cE91779aA0a1df4", + "94957436514953153903009727085771937506736141411179094734692372941554960005", + "-168518623556562049436495536022900179320091236904087178407919285734736835308", + "0x64aa972b979a47d1fd74639e871dae" + ], + "0xc7b0b0ca13d6e9" + ], + "Moo é🚀M🚀🚀oo🚀 éM🚀o🚀o Moééo🚀M🚀M🚀oMo🚀ééo", + "0x7377185514385c17423518347B488e2648cCbAC0" + ], + [ + "18850712388595584458486050264380976433875828772395793496252274110752867551681", + ["Moo é🚀Mé o🚀M", []], + [ + [ + "57083916529167999868681997105066825570864595328143678241279069", + "0xFDBa20C9b3eab1ad670D9b213f95D798eAcbCCdD", + "137016823085876863073450661048749781022009273612476726542238218701291925850", + "-122743882412034221844980584845921443247899533401746451222159859455535842996", + "0xbe37031edeec5852bd4d2b759db04a" + ], + "0xcd4c0fa80b9bf6" + ], + "Moo é🚀éoMMoM M🚀🚀oo🚀oMo🚀 🚀éé ", + "0x5Cc591FfD5b64254f1a623A4218eF96c1D8E329E" + ], + [ + "6890251438428819627204208090776921271981380557322757972157469913966487156851", + ["Moo é🚀 🚀ooMoMééoMo🚀éoMéoMoMM", []], + [ + [ + "45513719791672876966144016821930052096454761218299049310554685", + "0xB779eacAEc0dFf808dE07D0B809AebA373D9FD7a", + "447206937726083397343287111277943457458173998462019992967371028055853458293", + "-60849827911492888317998315105312792492821010367487252307796784992734833626", + "0x752e74155e4a3f4cede24cc04bb21e" + ], + "0x83301ec8aab79e" + ], + "Moo é🚀 éoéo", + "0x411Ac92d55aff6CCce4F49D72Bbf1963420f4cC6" + ], + [ + "46732410323500681354757257553261179243463935493448690953042357669976977870671", + ["Moo é🚀oMM Mo🚀oM🚀🚀 oéM éoé🚀MMéo MooMM Mé", [true, true, true, false]], + [ + [ + "20596661477158121955318509059124312697172243767741181402549204", + "0x9d02748df627a8Fa75D305827f19a4fdED531583", + "416632240173503179534394857371318338454515000272724998389983957612845680728", + "-159613184479161038934530094674703351466325338403508525290037200281050521360", + "0x8cf170d03a2f7682a33fa0e501b062" + ], + "0x0bff500e00196f" + ], + "Moo é🚀ooééoo🚀🚀oM oé é🚀M🚀o🚀éoééééoM o o🚀o🚀Mé🚀ooé🚀o🚀 é oéé ooo", + "0xaf19F00cA90Ad97D94f27c12C9489368D52609eC" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "29665255536610695984836050210051370942773068286714870907833463307248536471239" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M éMééoo🚀Mo🚀o🚀🚀Mé oM é🚀🚀ooMo o🚀 M oo oMo🚀🚀M oM éoo MoéMo" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-30041045181995666196066674519678368197547957991507196690770473" + }, + { + "type": "address", + "value": "0xf43E5b24CfBa2829500E6C2D4cE91779aA0a1df4" + }, + { + "type": "number", + "value": "94957436514953153903009727085771937506736141411179094734692372941554960005" + }, + { + "type": "number", + "value": "-168518623556562049436495536022900179320091236904087178407919285734736835308" + }, + { + "type": "hexstring", + "value": "0x64aa972b979a47d1fd74639e871dae" + } + ] + }, + { + "type": "hexstring", + "value": "0xc7b0b0ca13d6e9" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M🚀🚀oo🚀 éM🚀o🚀o Moééo🚀M🚀M🚀oMo🚀ééo" + }, + { + "type": "address", + "value": "0x7377185514385c17423518347B488e2648cCbAC0" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "18850712388595584458486050264380976433875828772395793496252274110752867551681" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mé o🚀M" + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "57083916529167999868681997105066825570864595328143678241279069" + }, + { + "type": "address", + "value": "0xFDBa20C9b3eab1ad670D9b213f95D798eAcbCCdD" + }, + { + "type": "number", + "value": "137016823085876863073450661048749781022009273612476726542238218701291925850" + }, + { + "type": "number", + "value": "-122743882412034221844980584845921443247899533401746451222159859455535842996" + }, + { + "type": "hexstring", + "value": "0xbe37031edeec5852bd4d2b759db04a" + } + ] + }, + { + "type": "hexstring", + "value": "0xcd4c0fa80b9bf6" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éoMMoM M🚀🚀oo🚀oMo🚀 🚀éé " + }, + { + "type": "address", + "value": "0x5Cc591FfD5b64254f1a623A4218eF96c1D8E329E" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "6890251438428819627204208090776921271981380557322757972157469913966487156851" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀ooMoMééoMo🚀éoMéoMoMM" + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "45513719791672876966144016821930052096454761218299049310554685" + }, + { + "type": "address", + "value": "0xB779eacAEc0dFf808dE07D0B809AebA373D9FD7a" + }, + { + "type": "number", + "value": "447206937726083397343287111277943457458173998462019992967371028055853458293" + }, + { + "type": "number", + "value": "-60849827911492888317998315105312792492821010367487252307796784992734833626" + }, + { + "type": "hexstring", + "value": "0x752e74155e4a3f4cede24cc04bb21e" + } + ] + }, + { + "type": "hexstring", + "value": "0x83301ec8aab79e" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 éoéo" + }, + { + "type": "address", + "value": "0x411Ac92d55aff6CCce4F49D72Bbf1963420f4cC6" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "46732410323500681354757257553261179243463935493448690953042357669976977870671" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMM Mo🚀oM🚀🚀 oéM éoé🚀MMéo MooMM Mé" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "20596661477158121955318509059124312697172243767741181402549204" + }, + { + "type": "address", + "value": "0x9d02748df627a8Fa75D305827f19a4fdED531583" + }, + { + "type": "number", + "value": "416632240173503179534394857371318338454515000272724998389983957612845680728" + }, + { + "type": "number", + "value": "-159613184479161038934530094674703351466325338403508525290037200281050521360" + }, + { + "type": "hexstring", + "value": "0x8cf170d03a2f7682a33fa0e501b062" + } + ] + }, + { + "type": "hexstring", + "value": "0x0bff500e00196f" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooééoo🚀🚀oM oé é🚀M🚀o🚀éoééééoM o o🚀o🚀Mé🚀ooé🚀o🚀 é oéé ooo" + }, + { + "type": "address", + "value": "0xaf19F00cA90Ad97D94f27c12C9489368D52609eC" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610c84806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610903565b60405180910390f35b60408051600480825260a0820190925260609160009190816020015b610072610818565b81526020019060019003908161006a57905050905061008f610818565b7f4195f08afb29ae456626081d432b2d469ab4c83574e7c5ce5d2a3c38062546c78152604080518082019091526060808252602082015260006040518060a0016040528060648152602001610b2160649139825250604080516001808252818301909252600091602080830190803683370190505090506000808260008151811061011c5761011c610a84565b911515602092830291909101820152838101929092525082015261013e610868565b610146610888565b7912b1d08a28b923798f04827635287e69f4f33e50712420b32a2819815273f43e5b24cfba2829500e6c2d4ce91779aa0a1df46020808301919091527e35be771364344adf146c3d1a53eb04b3ffecfc71f34c721d33321c9bf1c6856040808401919091527fffa09f30d998b263442114470dd346a2dedbc928d7a7ad15949bf374cbb14d1460608401526e32554b95cbcd23e8feba31cf438ed760891b60808085019190915292845266c7b0b0ca13d6e960c81b848301528481019390935282519182019092526049808252600092610a9b90830139606083015250737377185514385c17423518347b488e2648ccbac0608082015281518190839060009061025257610252610a84565b602002602001018190525050610266610818565b7f29ad20075dbe2dbb0fce88a361494b7e210df29a902f4cda97e3ad81d33909c18152604080518082018252606080825260208083019182528351808501855260148152734d6f6f20c3a9f09f9a804dc3a9206ff09f9a804d60601b818301528352835160008152808201909452929052908201526102e3610868565b6102eb610888565b792385fe18ed0240ff4a1961a4fb43be88366261222afbdc488c5d815273fdba20c9b3eab1ad670d9b213f95d798eacbccdd6020808301919091527e4d8c7c6debb4e3e94d4b0e4f9108daf1d59b127dfeb28a3e051ba188d4315a6040808401919091527fffba87885d2dcff48a69a146ff4a265600fc5f3b1f7c81643001d8a5e434794c6060808501919091526e5f1b818f6f762c295ea695baced82560891b60808501529284526666a607d405cdfb60c91b848301528481019390935282519182019092526032808252600092610b8590830139606083015250735cc591ffd5b64254f1a623a4218ef96c1d8e329e608082015281518190839060019081106103f8576103f8610a84565b60200260200101819052505061040c610818565b7f0f3bbe7e26eb753af847ed31aaf44c030871c2a9b7510547588abe585c4a38738152604080518082019091526060808252602082015260006040518060600160405280602a8152602001610c25602a91398252506040805160008152602080820190925281830152820152610480610868565b610488610888565b791c52c0fe94353e743f05b6dd9b59a85059d35b19715390fa0a3d815273b779eacaec0dff808de07d0b809aeba373d9fd7a6020808301919091527efd1c333d8d43511f5518759b7179243cecb422e679f6f1aeeb490e289563756040808401919091527fffdd8f6a70bfa3d7be06924edbe33df1434fb791386b13e698af57b6084194266060808501919091526e3a973a0aaf251fa676f1266025d90f60891b6080808601919091529385526641980f64555bcf60c91b8584015285820194909452805180820190915260118152704d6f6f20c3a9f09f9a8020c3a96fc3a96f60781b918101919091529183019190915273411ac92d55aff6ccce4f49d72bbf1963420f4cc69082015281518190839060029081106105aa576105aa610a84565b6020026020010181905250506105be610818565b7f67519b5e1571fffac3c97ac0843a953fa1082522b08f52ff1c71582b5e9e8f4f8152604080518082019091526060808252602082015260006040518060600160405280603d8152602001610ae4603d913982525060408051600480825260a0820190925260009160208201608080368337019050509050600060019050808260008151811061065057610650610a84565b60200260200101901515908115158152505050600060019050808260018151811061067d5761067d610a84565b6020026020010190151590811515815250505060006001905080826002815181106106aa576106aa610a84565b60200260200101901515908115158152505050600080826003815181106106d3576106d3610a84565b91151560209283029190910182015283810192909252508201526106f5610868565b6106fd610888565b790cd13ccb75dd165440f7b843ed01f7882c610ce715cdfd5c0bd48152739d02748df627a8fa75d305827f19a4fded5315836020808301919091527eebce34ada29a481309941b5a12d0311cf77137343e5c63829f21db666948586040808401919091527fffa5a981f1a963331b9eff105e65d069e811d55f12cf98817b16c5363d0860f060608401526e4678b8681d17bb41519fd07280d83160891b6080840152918352660bff500e00196f60c81b8382015283820192909252805160a08101909152606e808252600092610bb79083013960608301525073af19f00ca90ad97d94f27c12c9489368d52609ec6080820152815181908390600390811061080757610807610a84565b602090810291909101015250919050565b6040518060a0016040528060008152602001610847604051806040016040528060608152602001606081525090565b8152602001610854610868565b815260606020820152600060409091015290565b604051806040016040528061087b610888565b8152600060209091015290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6000815180845260005b818110156108dc576020818501810151868301820152016108c0565b818111156108ee576000602083870101525b50601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015610a7557603f198a850301865282516101408151865289820151818b88015280518a838901526109636101808901826108b6565b918c015188830361013f19016101608a01528051808452908d01935086928d0191505b808310156109a857835115158252928c019260019290920191908c0190610986565b508a8401519250610a278b8901848051805160190b83526020808201516001600160a01b0316818501526040808301516001600160f81b031690850152606080830151601e0b9085015260809182015170ffffffffffffffffffffffffffffffffff19169184019190915201516001600160c81b03191660a090910152565b60608401519250878103610100890152610a4181846108b6565b9250505060808201519150610a626101208701836001600160a01b03169052565b968901969450509187019160010161092b565b50919998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804df09f9a80f09f9a806f6ff09f9a8020c3a94df09f9a806ff09f9a806f204d6fc3a9c3a96ff09f9a804df09f9a804df09f9a806f4d6ff09f9a80c3a9c3a96f4d6f6f20c3a9f09f9a806f4d4d204d6ff09f9a806f4df09f9a80f09f9a8020206fc3a94d20c3a96fc3a9f09f9a804d4dc3a96f204d6f6f4d4d204dc3a94d6f6f20c3a9f09f9a804d20c3a94dc3a9c3a96f6ff09f9a804d6ff09f9a806ff09f9a80f09f9a804dc3a9206f4d20c3a9f09f9a80f09f9a806f6f4d6f206ff09f9a80204d206f6f206f4d6ff09f9a80f09f9a804d206f4d20c3a96f6f204d6fc3a94d6f4d6f6f20c3a9f09f9a80c3a96f4d4d6f4d204df09f9a80f09f9a806f6ff09f9a806f4d6ff09f9a8020f09f9a80c3a9c3a9204d6f6f20c3a9f09f9a806f6fc3a9c3a96f6ff09f9a80f09f9a806f4d206fc3a920c3a9f09f9a804df09f9a806ff09f9a80c3a96fc3a9c3a9c3a9c3a96f4d206f206ff09f9a806ff09f9a804dc3a9f09f9a806f6fc3a9f09f9a806ff09f9a8020c3a92020206fc3a9c3a9206f6f6f4d6f6f20c3a9f09f9a8020f09f9a806f6f4d6f4dc3a9c3a96f4d6ff09f9a80c3a96f4dc3a96f4d6f4d4da26469706673582212202a28ee69384379761446aec203f77e105ab2f6cbc305499046c31ba07faefa4f64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d15bc438 {\n string s_0;\n bool[] s_1;\n }\n\n struct S_12ffbd0d {\n int208 s_0;\n address s_1;\n uint248 s_2;\n int248 s_3;\n bytes15 s_4;\n }\n\n struct S_ba89ce4f {\n S_12ffbd0d s_0;\n bytes7 s_1;\n }\n\n struct S_14e754e6 {\n int256 s_0;\n S_d15bc438 s_1;\n S_ba89ce4f s_2;\n string s_3;\n address s_4;\n }\n\n function test () public pure returns (S_14e754e6[] memory) {\n S_14e754e6[] memory r = new S_14e754e6[](4);\n {\n S_14e754e6 memory r_0;\n {\n int r_0_0 = 29665255536610695984836050210051370942773068286714870907833463307248536471239;\n r_0.s_0 = r_0_0;\n }\n {\n S_d15bc438 memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀M éMééoo🚀Mo🚀o🚀🚀Mé oM é🚀🚀ooMo o🚀 M oo oMo🚀🚀M oM éoo MoéMo\";\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bool[] memory r_0_1_1 = new bool[](1);\n {\n bool r_0_1_1_0 = false;\n r_0_1_1[0] = r_0_1_1_0;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_ba89ce4f memory r_0_2;\n {\n S_12ffbd0d memory r_0_2_0;\n {\n int208 r_0_2_0_0 = -30041045181995666196066674519678368197547957991507196690770473;\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n address r_0_2_0_1 = 0xf43E5b24CfBa2829500E6C2D4cE91779aA0a1df4;\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n {\n uint248 r_0_2_0_2 = 94957436514953153903009727085771937506736141411179094734692372941554960005;\n r_0_2_0.s_2 = r_0_2_0_2;\n }\n {\n int248 r_0_2_0_3 = -168518623556562049436495536022900179320091236904087178407919285734736835308;\n r_0_2_0.s_3 = r_0_2_0_3;\n }\n {\n bytes15 r_0_2_0_4 = bytes15(0x64aa972b979a47d1fd74639e871dae);\n r_0_2_0.s_4 = r_0_2_0_4;\n }\n r_0_2.s_0 = r_0_2_0;\n }\n {\n bytes7 r_0_2_1 = bytes7(0xc7b0b0ca13d6e9);\n r_0_2.s_1 = r_0_2_1;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀M🚀🚀oo🚀 éM🚀o🚀o Moééo🚀M🚀M🚀oMo🚀ééo\";\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x7377185514385c17423518347B488e2648cCbAC0;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_14e754e6 memory r_1;\n {\n int r_1_0 = 18850712388595584458486050264380976433875828772395793496252274110752867551681;\n r_1.s_0 = r_1_0;\n }\n {\n S_d15bc438 memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀Mé o🚀M\";\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bool[] memory r_1_1_1 = new bool[](0);\n r_1_1.s_1 = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n {\n S_ba89ce4f memory r_1_2;\n {\n S_12ffbd0d memory r_1_2_0;\n {\n int208 r_1_2_0_0 = 57083916529167999868681997105066825570864595328143678241279069;\n r_1_2_0.s_0 = r_1_2_0_0;\n }\n {\n address r_1_2_0_1 = 0xFDBa20C9b3eab1ad670D9b213f95D798eAcbCCdD;\n r_1_2_0.s_1 = r_1_2_0_1;\n }\n {\n uint248 r_1_2_0_2 = 137016823085876863073450661048749781022009273612476726542238218701291925850;\n r_1_2_0.s_2 = r_1_2_0_2;\n }\n {\n int248 r_1_2_0_3 = -122743882412034221844980584845921443247899533401746451222159859455535842996;\n r_1_2_0.s_3 = r_1_2_0_3;\n }\n {\n bytes15 r_1_2_0_4 = bytes15(0xbe37031edeec5852bd4d2b759db04a);\n r_1_2_0.s_4 = r_1_2_0_4;\n }\n r_1_2.s_0 = r_1_2_0;\n }\n {\n bytes7 r_1_2_1 = bytes7(0xcd4c0fa80b9bf6);\n r_1_2.s_1 = r_1_2_1;\n }\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀éoMMoM M🚀🚀oo🚀oMo🚀 🚀éé \";\n r_1.s_3 = r_1_3;\n }\n {\n address r_1_4 = 0x5Cc591FfD5b64254f1a623A4218eF96c1D8E329E;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_14e754e6 memory r_2;\n {\n int r_2_0 = 6890251438428819627204208090776921271981380557322757972157469913966487156851;\n r_2.s_0 = r_2_0;\n }\n {\n S_d15bc438 memory r_2_1;\n {\n string memory r_2_1_0 = unicode\"Moo é🚀 🚀ooMoMééoMo🚀éoMéoMoMM\";\n r_2_1.s_0 = r_2_1_0;\n }\n {\n bool[] memory r_2_1_1 = new bool[](0);\n r_2_1.s_1 = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n S_ba89ce4f memory r_2_2;\n {\n S_12ffbd0d memory r_2_2_0;\n {\n int208 r_2_2_0_0 = 45513719791672876966144016821930052096454761218299049310554685;\n r_2_2_0.s_0 = r_2_2_0_0;\n }\n {\n address r_2_2_0_1 = 0xB779eacAEc0dFf808dE07D0B809AebA373D9FD7a;\n r_2_2_0.s_1 = r_2_2_0_1;\n }\n {\n uint248 r_2_2_0_2 = 447206937726083397343287111277943457458173998462019992967371028055853458293;\n r_2_2_0.s_2 = r_2_2_0_2;\n }\n {\n int248 r_2_2_0_3 = -60849827911492888317998315105312792492821010367487252307796784992734833626;\n r_2_2_0.s_3 = r_2_2_0_3;\n }\n {\n bytes15 r_2_2_0_4 = bytes15(0x752e74155e4a3f4cede24cc04bb21e);\n r_2_2_0.s_4 = r_2_2_0_4;\n }\n r_2_2.s_0 = r_2_2_0;\n }\n {\n bytes7 r_2_2_1 = bytes7(0x83301ec8aab79e);\n r_2_2.s_1 = r_2_2_1;\n }\n r_2.s_2 = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀 éoéo\";\n r_2.s_3 = r_2_3;\n }\n {\n address r_2_4 = 0x411Ac92d55aff6CCce4F49D72Bbf1963420f4cC6;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n {\n S_14e754e6 memory r_3;\n {\n int r_3_0 = 46732410323500681354757257553261179243463935493448690953042357669976977870671;\n r_3.s_0 = r_3_0;\n }\n {\n S_d15bc438 memory r_3_1;\n {\n string memory r_3_1_0 = unicode\"Moo é🚀oMM Mo🚀oM🚀🚀 oéM éoé🚀MMéo MooMM Mé\";\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bool[] memory r_3_1_1 = new bool[](4);\n {\n bool r_3_1_1_0 = true;\n r_3_1_1[0] = r_3_1_1_0;\n }\n {\n bool r_3_1_1_1 = true;\n r_3_1_1[1] = r_3_1_1_1;\n }\n {\n bool r_3_1_1_2 = true;\n r_3_1_1[2] = r_3_1_1_2;\n }\n {\n bool r_3_1_1_3 = false;\n r_3_1_1[3] = r_3_1_1_3;\n }\n r_3_1.s_1 = r_3_1_1;\n }\n r_3.s_1 = r_3_1;\n }\n {\n S_ba89ce4f memory r_3_2;\n {\n S_12ffbd0d memory r_3_2_0;\n {\n int208 r_3_2_0_0 = 20596661477158121955318509059124312697172243767741181402549204;\n r_3_2_0.s_0 = r_3_2_0_0;\n }\n {\n address r_3_2_0_1 = 0x9d02748df627a8Fa75D305827f19a4fdED531583;\n r_3_2_0.s_1 = r_3_2_0_1;\n }\n {\n uint248 r_3_2_0_2 = 416632240173503179534394857371318338454515000272724998389983957612845680728;\n r_3_2_0.s_2 = r_3_2_0_2;\n }\n {\n int248 r_3_2_0_3 = -159613184479161038934530094674703351466325338403508525290037200281050521360;\n r_3_2_0.s_3 = r_3_2_0_3;\n }\n {\n bytes15 r_3_2_0_4 = bytes15(0x8cf170d03a2f7682a33fa0e501b062);\n r_3_2_0.s_4 = r_3_2_0_4;\n }\n r_3_2.s_0 = r_3_2_0;\n }\n {\n bytes7 r_3_2_1 = bytes7(0x0bff500e00196f);\n r_3_2.s_1 = r_3_2_1;\n }\n r_3.s_2 = r_3_2;\n }\n {\n string memory r_3_3 = unicode\"Moo é🚀ooééoo🚀🚀oM oé é🚀M🚀o🚀éoééééoM o o🚀o🚀Mé🚀ooé🚀o🚀 é oéé ooo\";\n r_3.s_3 = r_3_3;\n }\n {\n address r_3_4 = 0xaf19F00cA90Ad97D94f27c12C9489368D52609eC;\n r_3.s_4 = r_3_4;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000007e04195f08afb29ae456626081d432b2d469ab4c83574e7c5ce5d2a3c38062546c70000000000000000000000000000000000000000000000000000000000000140ffffffffffffed4e2f75d746dc8670fb7d89cad781960b0cc1af8edbdf4cd5d7000000000000000000000000f43e5b24cfba2829500e6c2d4ce91779aa0a1df40035be771364344adf146c3d1a53eb04b3ffecfc71f34c721d33321c9bf1c685ffa09f30d998b263442114470dd346a2dedbc928d7a7ad15949bf374cbb14d1464aa972b979a47d1fd74639e871dae0000000000000000000000000000000000c7b0b0ca13d6e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002600000000000000000000000007377185514385c17423518347b488e2648ccbac0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a804d20c3a94dc3a9c3a96f6ff09f9a804d6ff09f9a806ff09f9a80f09f9a804dc3a9206f4d20c3a9f09f9a80f09f9a806f6f4d6f206ff09f9a80204d206f6f206f4d6ff09f9a80f09f9a804d206f4d20c3a96f6f204d6fc3a94d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a804df09f9a80f09f9a806f6ff09f9a8020c3a94df09f9a806ff09f9a806f204d6fc3a9c3a96ff09f9a804df09f9a804df09f9a806f4d6ff09f9a80c3a9c3a96f000000000000000000000000000000000000000000000029ad20075dbe2dbb0fce88a361494b7e210df29a902f4cda97e3ad81d33909c100000000000000000000000000000000000000000000000000000000000001400000000000002385fe18ed0240ff4a1961a4fb43be88366261222afbdc488c5d000000000000000000000000fdba20c9b3eab1ad670d9b213f95d798eacbccdd004d8c7c6debb4e3e94d4b0e4f9108daf1d59b127dfeb28a3e051ba188d4315affba87885d2dcff48a69a146ff4a265600fc5f3b1f7c81643001d8a5e434794cbe37031edeec5852bd4d2b759db04a0000000000000000000000000000000000cd4c0fa80b9bf60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000005cc591ffd5b64254f1a623a4218ef96c1d8e329e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a804dc3a9206ff09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80c3a96f4d4d6f4d204df09f9a80f09f9a806f6ff09f9a806f4d6ff09f9a8020f09f9a80c3a9c3a92000000000000000000000000000000f3bbe7e26eb753af847ed31aaf44c030871c2a9b7510547588abe585c4a387300000000000000000000000000000000000000000000000000000000000001400000000000001c52c0fe94353e743f05b6dd9b59a85059d35b19715390fa0a3d000000000000000000000000b779eacaec0dff808de07d0b809aeba373d9fd7a00fd1c333d8d43511f5518759b7179243cecb422e679f6f1aeeb490e28956375ffdd8f6a70bfa3d7be06924edbe33df1434fb791386b13e698af57b608419426752e74155e4a3f4cede24cc04bb21e000000000000000000000000000000000083301ec8aab79e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000411ac92d55aff6ccce4f49d72bbf1963420f4cc6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a8020f09f9a806f6f4d6f4dc3a9c3a96f4d6ff09f9a80c3a96f4dc3a96f4d6f4d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a8020c3a96fc3a96f00000000000000000000000000000067519b5e1571fffac3c97ac0843a953fa1082522b08f52ff1c71582b5e9e8f4f00000000000000000000000000000000000000000000000000000000000001400000000000000cd13ccb75dd165440f7b843ed01f7882c610ce715cdfd5c0bd40000000000000000000000009d02748df627a8fa75d305827f19a4fded53158300ebce34ada29a481309941b5a12d0311cf77137343e5c63829f21db66694858ffa5a981f1a963331b9eff105e65d069e811d55f12cf98817b16c5363d0860f08cf170d03a2f7682a33fa0e501b06200000000000000000000000000000000000bff500e00196f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000af19f00ca90ad97d94f27c12c9489368d52609ec000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806f4d4d204d6ff09f9a806f4df09f9a80f09f9a8020206fc3a94d20c3a96fc3a9f09f9a804d4dc3a96f204d6f6f4d4d204dc3a900000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4d6f6f20c3a9f09f9a806f6fc3a9c3a96f6ff09f9a80f09f9a806f4d206fc3a920c3a9f09f9a804df09f9a806ff09f9a80c3a96fc3a9c3a9c3a9c3a96f4d206f206ff09f9a806ff09f9a804dc3a9f09f9a806f6fc3a9f09f9a806ff09f9a8020c3a92020206fc3a9c3a9206f6f6f000000000000000000000000000000000000" + }, + { + "name": "random-(string,bool,address,(bytes8,string,(uint192,bool,int256),(bytes16,address,string,bool)[1]))", + "type": "(string,bool,address,(bytes8,string,(uint192,bool,int256),(bytes16,address,string,bool)[1]))", + "value": [ + "Moo é🚀 M🚀é o 🚀ééoMoM🚀oé oé🚀oM oMooooo M🚀", + true, + "0xfa4eAFB1B5085c7a8A311cEb7fC3fF7a24F4FdEd", + [ + "0x2f3f772cb1714a09", + "Moo é🚀 éooooéoéo Mo o🚀o éo é🚀o🚀oo M", + [ + "4851281032943518285102801021867864444172651317812482084459", + true, + "-25053952289026488485820274690396048118906673231233145235497303698772921369314" + ], + [ + [ + "0x0237a3a94332c7c4061480af52646419", + "0xACcB64173c0417e8eDD79a46862A04638f3CCdA6", + "Moo é🚀🚀 MoéééM🚀é oéMM🚀", + false + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M🚀é o 🚀ééoMoM🚀oé oé🚀oM oMooooo M🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xfa4eAFB1B5085c7a8A311cEb7fC3fF7a24F4FdEd" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2f3f772cb1714a09" + }, + { + "type": "string", + "value": "Moo é🚀 éooooéoéo Mo o🚀o éo é🚀o🚀oo M" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4851281032943518285102801021867864444172651317812482084459" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-25053952289026488485820274690396048118906673231233145235497303698772921369314" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0237a3a94332c7c4061480af52646419" + }, + { + "type": "address", + "value": "0xACcB64173c0417e8eDD79a46862A04638f3CCdA6" + }, + { + "type": "string", + "value": "Moo é🚀🚀 MoéééM🚀é oéMM🚀" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104d0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c8565b60405180910390f35b6100566101c1565b61005e6101c1565b60006040518060800160405280604381526020016103f8604391398252506001602082015273fa4eafb1b5085c7a8a311ceb7fc3ff7a24f4fded60408201526100a56101f9565b672f3f772cb1714a0960c01b8152604080516060810190915260378082526000919061043b60208301396020838101919091526040805160608101825277c5d9bcbe5bfba9b6bce6462dd366098b9562c9a26d910e6b81526001928101929092527fc89bf72cb483e3f1ecd0b0a522a5ef23da3ecbc8e9a2578ca266f8d6ca48bd1e8282015283015250610137610234565b60408051608081018252606081830181905260008183018190526f0237a3a94332c7c4061480af5264641960801b835273accb64173c0417e8edd79a46862a04638f3ccda660208085019190915284519283019094526029808352929390929061047290830139604083015250600060608083019190915290825282810191909152820152919050565b60405180608001604052806060815260200160001515815260200160006001600160a01b031681526020016101f46101f9565b905290565b604080516080810182526000808252606060208084018290528451808301865283815290810183905280850192909252928201529081016101f45b60405180602001604052806001905b604080516080810182526000808252602080830182905260609383018490529282015282526000199092019101816102435790505090565b6000815180845260005b818110156102a157602081850181015186830182015201610285565b818111156102b3576000602083870101525b50601f01601f19169290920160200192915050565b600060208083528351608080838601526102e560a086018361027b565b915082860151604081151581880152808801519150606060018060a01b03808416828a0152818a01519350601f1989870301858a015267ffffffffffffffff60c01b84511686528684015160c08888015261034360c088018261027b565b8585015180516001600160c01b031689870152898101511515858a0152850151878901529483015187860360a090980197909752509294928587810160005b60018110156103e757828203895286516fffffffffffffffffffffffffffffffff198151168352848b820151168b8401528681015189888501526103c88a85018261027b565b91870151151593870193909352988a0198968a01969150600101610382565b509b9a505050505050505050505056fe4d6f6f20c3a9f09f9a80204df09f9a80c3a9206f20f09f9a80c3a9c3a96f4d6f4df09f9a806fc3a920206fc3a9f09f9a806f4d2020206f4d6f6f6f6f6f204df09f9a804d6f6f20c3a9f09f9a8020c3a96f6f6f6fc3a96fc3a96f204d6f206ff09f9a806f2020c3a96f20c3a9f09f9a806ff09f9a806f6f20204d4d6f6f20c3a9f09f9a80f09f9a80204d6fc3a9c3a9c3a94df09f9a80c3a920206fc3a94d4df09f9a80a2646970667358221220ce11ad68ec72cf84341a54e7ced6dadddc3b7104fe33572e459adb60248df94564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_cc5ec77a {\n uint192 s_0;\n bool s_1;\n int256 s_2;\n }\n\n struct S_26862223 {\n bytes16 s_0;\n address s_1;\n string s_2;\n bool s_3;\n }\n\n struct S_34b1c7dc {\n bytes8 s_0;\n string s_1;\n S_cc5ec77a s_2;\n S_26862223[1] s_3;\n }\n\n struct S_27b3739a {\n string s_0;\n bool s_1;\n address s_2;\n S_34b1c7dc s_3;\n }\n\n function test () public pure returns (S_27b3739a memory) {\n S_27b3739a memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 M🚀é o 🚀ééoMoM🚀oé oé🚀oM oMooooo M🚀\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xfa4eAFB1B5085c7a8A311cEb7fC3fF7a24F4FdEd;\n r.s_2 = r_2;\n }\n {\n S_34b1c7dc memory r_3;\n {\n bytes8 r_3_0 = bytes8(0x2f3f772cb1714a09);\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀 éooooéoéo Mo o🚀o éo é🚀o🚀oo M\";\n r_3.s_1 = r_3_1;\n }\n {\n S_cc5ec77a memory r_3_2;\n {\n uint192 r_3_2_0 = 4851281032943518285102801021867864444172651317812482084459;\n r_3_2.s_0 = r_3_2_0;\n }\n {\n bool r_3_2_1 = true;\n r_3_2.s_1 = r_3_2_1;\n }\n {\n int256 r_3_2_2 = -25053952289026488485820274690396048118906673231233145235497303698772921369314;\n r_3_2.s_2 = r_3_2_2;\n }\n r_3.s_2 = r_3_2;\n }\n {\n S_26862223[1] memory r_3_3;\n {\n S_26862223 memory r_3_3_0;\n {\n bytes16 r_3_3_0_0 = bytes16(0x0237a3a94332c7c4061480af52646419);\n r_3_3_0.s_0 = r_3_3_0_0;\n }\n {\n address r_3_3_0_1 = 0xACcB64173c0417e8eDD79a46862A04638f3CCdA6;\n r_3_3_0.s_1 = r_3_3_0_1;\n }\n {\n string memory r_3_3_0_2 = unicode\"Moo é🚀🚀 MoéééM🚀é oéMM🚀\";\n r_3_3_0.s_2 = r_3_3_0_2;\n }\n {\n bool r_3_3_0_3 = false;\n r_3_3_0.s_3 = r_3_3_0_3;\n }\n r_3_3[0] = r_3_3_0;\n }\n r_3.s_3 = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fa4eafb1b5085c7a8a311ceb7fc3ff7a24f4fded000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80204df09f9a80c3a9206f20f09f9a80c3a9c3a96f4d6f4df09f9a806fc3a920206fc3a9f09f9a806f4d2020206f4d6f6f6f6f6f204df09f9a8000000000000000000000000000000000000000000000000000000000002f3f772cb1714a0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000c5d9bcbe5bfba9b6bce6462dd366098b9562c9a26d910e6b0000000000000000000000000000000000000000000000000000000000000001c89bf72cb483e3f1ecd0b0a522a5ef23da3ecbc8e9a2578ca266f8d6ca48bd1e000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a8020c3a96f6f6f6fc3a96fc3a96f204d6f206ff09f9a806f2020c3a96f20c3a9f09f9a806ff09f9a806f6f20204d00000000000000000000000000000000000000000000000000000000000000000000000000000000200237a3a94332c7c4061480af5264641900000000000000000000000000000000000000000000000000000000accb64173c0417e8edd79a46862a04638f3ccda60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a80f09f9a80204d6fc3a9c3a9c3a94df09f9a80c3a920206fc3a94d4df09f9a800000000000000000000000000000000000000000000000" + }, + { + "name": "random-((((address,address,int),bytes30,bool[])),(int112,bytes17,address,(int136),string)[2],string[4])", + "type": "((((address,address,int),bytes30,bool[])),(int112,bytes17,address,(int136),string)[2],string[4])", + "value": [ + [ + [ + [ + "0x908308d59fD1fD951F965eC838a9Ebb6D5b450Aa", + "0x2dC82874C37aB5E2283eb9CE2938eC4ff37AE23e", + "51559861391007624328426198001411521187626097228892384025452897001320400239374" + ], + "0x79a859a9f3073dc945ee31f94022ab9860068de076b1fa6268f6e80d94bf", + [true, true, true, true] + ] + ], + [ + [ + "977418866640932213167409750730875", + "0x327b45f9e828a2fcc746fbb7c813a1a46d", + "0xf018634f80A4A9d135152B05608B698A7b20A9E5", + ["-15103906467070032705753910830524161559963"], + "Moo é🚀ééooéoo🚀ooo🚀🚀 🚀o🚀éoéoMoMo🚀🚀 oééoéo 🚀🚀oéo" + ], + [ + "-1781423843945927863356936533965231", + "0xaae0f0ad9bd220ac13d53b3f7a02e42b67", + "0x38C7e8d2267452cacE8aB9afA75Eb888FFa5456A", + ["22509353492243234918455385061003117049545"], + "Moo é🚀🚀oo🚀Mo MéM M🚀🚀oMo Mo🚀o éMoM🚀 oo🚀🚀o é 🚀ooM🚀🚀oé oM🚀oMé " + ] + ], + [ + "Moo é🚀o🚀 ooééMoo🚀🚀oMo", + "Moo é🚀🚀oMo🚀ooMoMoMéoéo🚀Méoo oM", + "Moo é🚀🚀 🚀 M 🚀🚀o🚀o🚀oMoMoMMoo M 🚀", + "Moo é🚀éMooMéoo oéo oo🚀🚀 éMé oooé oM🚀oé" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x908308d59fD1fD951F965eC838a9Ebb6D5b450Aa" + }, + { + "type": "address", + "value": "0x2dC82874C37aB5E2283eb9CE2938eC4ff37AE23e" + }, + { + "type": "number", + "value": "51559861391007624328426198001411521187626097228892384025452897001320400239374" + } + ] + }, + { + "type": "hexstring", + "value": "0x79a859a9f3073dc945ee31f94022ab9860068de076b1fa6268f6e80d94bf" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "977418866640932213167409750730875" + }, + { + "type": "hexstring", + "value": "0x327b45f9e828a2fcc746fbb7c813a1a46d" + }, + { + "type": "address", + "value": "0xf018634f80A4A9d135152B05608B698A7b20A9E5" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-15103906467070032705753910830524161559963" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ééooéoo🚀ooo🚀🚀 🚀o🚀éoéoMoMo🚀🚀 oééoéo 🚀🚀oéo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1781423843945927863356936533965231" + }, + { + "type": "hexstring", + "value": "0xaae0f0ad9bd220ac13d53b3f7a02e42b67" + }, + { + "type": "address", + "value": "0x38C7e8d2267452cacE8aB9afA75Eb888FFa5456A" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "22509353492243234918455385061003117049545" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oo🚀Mo MéM M🚀🚀oMo Mo🚀o éMoM🚀 oo🚀🚀o é 🚀ooM🚀🚀oé oM🚀oMé " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀 ooééMoo🚀🚀oMo" + }, + { + "type": "string", + "value": "Moo é🚀🚀oMo🚀ooMoMoMéoéo🚀Méoo oM" + }, + { + "type": "string", + "value": "Moo é🚀🚀 🚀 M 🚀🚀o🚀o🚀oMoMoMMoo M 🚀" + }, + { + "type": "string", + "value": "Moo é🚀éMooMéoo oéo oo🚀🚀 éMé oooé oM🚀oé" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506108d8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610623565b60405180910390f35b610056610403565b61005e610403565b6040805160e08101825260006080820181815260a0830182905260c0830182905260208301908152928201526060808201529081526040805160c08101825260006060808301828152608080850184905260a080860185905291855260208086018581528688018590528751948501885273908308d59fd1fd951f965ec838a9ebb6d5b450aa8552732dc82874c37ab5e2283eb9ce2938ec4ff37ae23e858301527f71fdd8ee004c465e25c28f23e6e8429f90d6762712408f66342afc2df3b33b0e858901529386527f79a859a9f3073dc945ee31f94022ab9860068de076b1fa6268f6e80d94bf00009093528551600480825292810190965293949293909183019080368337019050509050600060019050808260008151811061018557610185610705565b6020026020010190151590811515815250505060006001905080826001815181106101b2576101b2610705565b6020026020010190151590811515815250505060006001905080826002815181106101df576101df610705565b60200260200101901515908115158152505050600060019050808260038151811061020c5761020c610705565b911515602092830291909101909101525060408201528152815261022e610468565b610236610495565b6d3030c2b0d434e98381a6e1f1e87b815270327b45f9e828a2fcc746fbb7c813a1a46d60781b60208083019190915273f018634f80a4a9d135152b05608b698a7b20a9e560408084019190915280518083018252702c62ea92ffc821c67e49d8d2e4f6ff8d9a198152606084015280516080810190915260578082526000926107549083013960808301525081526102cc610495565b6d57d4bae273a6a9273458ef35f9ae19815270aae0f0ad9bd220ac13d53b3f7a02e42b6760781b6020808301919091527338c7e8d2267452cace8ab9afa75eb888ffa5456a6040808401919091528051808301825270422627cabd4ab7bcc50a4b639e6a21b6c981526060840152805160a08101909152606a8082526000926107e69083013960808301525060208083019190915282015261036c6104cf565b6000604051806060016040528060258152602001610850602591398252506040805160608101909152602e808252600091906108756020830139905080826001602002018190525050600060405180606001604052806038815260200161071c60389139604080840191909152805160608101909152603b808252600092506107ab60208301396060830152506040820152919050565b60405180606001604052806104496040805160e08101825260006080820181815260a0830182905260c08301829052602083019081529282015260608082015290815290565b8152602001610456610468565b81526020016104636104cf565b905290565b60405180604001604052806002905b61047f610495565b8152602001906001900390816104775790505090565b6040805160a08101825260008082526020808301829052828401829052835190810190935282529060608201908152602001606081525090565b60405180608001604052806004905b60608152602001906001900390816104de5790505090565b6000815180845260005b8181101561051c57602081850181015186830182015201610500565b8181111561052e576000602083870101525b50601f01601f19169290920160200192915050565b60008260408082018460005b60028110156105d257848303885281518051600d0b84526020808201516effffffffffffffffffffffffffffff191681860152858201516001600160a01b0316868601526060808301515160100b9086015260809182015160a092860183905291906105bd828701846104f6565b9a81019a95509390930192505060010161054f565b50909695505050505050565b600082608081018360005b60048110156106185783830387526106028383516104f6565b60209788019790935091909101906001016105e9565b509095945050505050565b602080825282516060838301525160808301829052805180516001600160a01b0390811660a0808701919091528285015190911660c086015260409182015160e08601528284015161ffff1916610100860152910151610120840191909152805161014084018190526000929182019083906101608601905b808310156106be5783511515825292840192600192909201919084019061069c565b50838701519350601f199250828682030160408701526106de8185610543565b935050506040850151818584030160608601526106fb83826105de565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a8020f09f9a80204d20f09f9a80f09f9a806ff09f9a806ff09f9a806f4d6f4d6f4d4d6f6f204d20f09f9a804d6f6f20c3a9f09f9a80c3a9c3a96f6fc3a96f6ff09f9a806f6f6ff09f9a80f09f9a8020f09f9a806ff09f9a80c3a96fc3a96f4d6f4d6ff09f9a80f09f9a8020206fc3a9c3a96fc3a96f20f09f9a80f09f9a806fc3a96f4d6f6f20c3a9f09f9a80c3a94d6f6f4dc3a96f6f206fc3a96f206f6ff09f9a80f09f9a8020c3a94dc3a9206f6f6fc3a920206f4df09f9a806fc3a94d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a804d6f20204dc3a94d204df09f9a80f09f9a806f4d6f204d6ff09f9a806f2020c3a94d6f4df09f9a80206f6ff09f9a80f09f9a806f20c3a920f09f9a806f6f4df09f9a80f09f9a806fc3a9206f4df09f9a806f4dc3a9204d6f6f20c3a9f09f9a806ff09f9a8020206f6fc3a9c3a94d6f6ff09f9a80f09f9a806f4d6f4d6f6f20c3a9f09f9a80f09f9a806f4d6ff09f9a806f6f4d6f4d6f4dc3a96fc3a96ff09f9a804dc3a96f6f206f4da2646970667358221220a1886e8d7a1fa39f28aac22638f8c1000f492e29dd07d1cd21018c4454b85cb564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a3741ccb {\n address s_0;\n address s_1;\n int256 s_2;\n }\n\n struct S_69a34880 {\n S_a3741ccb s_0;\n bytes30 s_1;\n bool[] s_2;\n }\n\n struct S_e5787ac1 {\n S_69a34880 s_0;\n }\n\n struct S_225c98b7 {\n int136 s_0;\n }\n\n struct S_e29425b6 {\n int112 s_0;\n bytes17 s_1;\n address s_2;\n S_225c98b7 s_3;\n string s_4;\n }\n\n struct S_0cfa5d25 {\n S_e5787ac1 s_0;\n S_e29425b6[2] s_1;\n string[4] s_2;\n }\n\n function test () public pure returns (S_0cfa5d25 memory) {\n S_0cfa5d25 memory r;\n {\n S_e5787ac1 memory r_0;\n {\n S_69a34880 memory r_0_0;\n {\n S_a3741ccb memory r_0_0_0;\n {\n address r_0_0_0_0 = 0x908308d59fD1fD951F965eC838a9Ebb6D5b450Aa;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n address r_0_0_0_1 = 0x2dC82874C37aB5E2283eb9CE2938eC4ff37AE23e;\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n int r_0_0_0_2 = 51559861391007624328426198001411521187626097228892384025452897001320400239374;\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bytes30 r_0_0_1 = bytes30(0x79a859a9f3073dc945ee31f94022ab9860068de076b1fa6268f6e80d94bf);\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bool[] memory r_0_0_2 = new bool[](4);\n {\n bool r_0_0_2_0 = true;\n r_0_0_2[0] = r_0_0_2_0;\n }\n {\n bool r_0_0_2_1 = true;\n r_0_0_2[1] = r_0_0_2_1;\n }\n {\n bool r_0_0_2_2 = true;\n r_0_0_2[2] = r_0_0_2_2;\n }\n {\n bool r_0_0_2_3 = true;\n r_0_0_2[3] = r_0_0_2_3;\n }\n r_0_0.s_2 = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n S_e29425b6[2] memory r_1;\n {\n S_e29425b6 memory r_1_0;\n {\n int112 r_1_0_0 = 977418866640932213167409750730875;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes17 r_1_0_1 = bytes17(0x327b45f9e828a2fcc746fbb7c813a1a46d);\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0xf018634f80A4A9d135152B05608B698A7b20A9E5;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n S_225c98b7 memory r_1_0_3;\n {\n int136 r_1_0_3_0 = -15103906467070032705753910830524161559963;\n r_1_0_3.s_0 = r_1_0_3_0;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n {\n string memory r_1_0_4 = unicode\"Moo é🚀ééooéoo🚀ooo🚀🚀 🚀o🚀éoéoMoMo🚀🚀 oééoéo 🚀🚀oéo\";\n r_1_0.s_4 = r_1_0_4;\n }\n r_1[0] = r_1_0;\n }\n {\n S_e29425b6 memory r_1_1;\n {\n int112 r_1_1_0 = -1781423843945927863356936533965231;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bytes17 r_1_1_1 = bytes17(0xaae0f0ad9bd220ac13d53b3f7a02e42b67);\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x38C7e8d2267452cacE8aB9afA75Eb888FFa5456A;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n S_225c98b7 memory r_1_1_3;\n {\n int136 r_1_1_3_0 = 22509353492243234918455385061003117049545;\n r_1_1_3.s_0 = r_1_1_3_0;\n }\n r_1_1.s_3 = r_1_1_3;\n }\n {\n string memory r_1_1_4 = unicode\"Moo é🚀🚀oo🚀Mo MéM M🚀🚀oMo Mo🚀o éMoM🚀 oo🚀🚀o é 🚀ooM🚀🚀oé oM🚀oMé \";\n r_1_1.s_4 = r_1_1_4;\n }\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n string[4] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀o🚀 ooééMoo🚀🚀oMo\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀🚀oMo🚀ooMoMoMéoéo🚀Méoo oM\";\n r_2[1] = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀🚀 🚀 M 🚀🚀o🚀o🚀oMoMoMMoo M 🚀\";\n r_2[2] = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀éMooMéoo oéo oo🚀🚀 éMé oooé oM🚀oé\";\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000908308d59fd1fd951f965ec838a9ebb6d5b450aa0000000000000000000000002dc82874c37ab5e2283eb9ce2938ec4ff37ae23e71fdd8ee004c465e25c28f23e6e8429f90d6762712408f66342afc2df3b33b0e79a859a9f3073dc945ee31f94022ab9860068de076b1fa6268f6e80d94bf000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000003030c2b0d434e98381a6e1f1e87b327b45f9e828a2fcc746fbb7c813a1a46d000000000000000000000000000000000000000000000000000000f018634f80a4a9d135152b05608b698a7b20a9e5ffffffffffffffffffffffffffffffd39d156d0037de3981b6272d1b0900726500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80c3a9c3a96f6fc3a96f6ff09f9a806f6f6ff09f9a80f09f9a8020f09f9a806ff09f9a80c3a96fc3a96f4d6f4d6ff09f9a80f09f9a8020206fc3a9c3a96fc3a96f20f09f9a80f09f9a806fc3a96f000000000000000000ffffffffffffffffffffffffffffffffffffa82b451d8c5956d8cba710ca0651aae0f0ad9bd220ac13d53b3f7a02e42b6700000000000000000000000000000000000000000000000000000038c7e8d2267452cace8ab9afa75eb888ffa5456a000000000000000000000000000000422627cabd4ab7bcc50a4b639e6a21b6c900000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000006a4d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a804d6f20204dc3a94d204df09f9a80f09f9a806f4d6f204d6ff09f9a806f2020c3a94d6f4df09f9a80206f6ff09f9a80f09f9a806f20c3a920f09f9a806f6f4df09f9a80f09f9a806fc3a9206f4df09f9a806f4dc3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806ff09f9a8020206f6fc3a9c3a94d6f6ff09f9a80f09f9a806f4d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80f09f9a806f4d6ff09f9a806f6f4d6f4d6f4dc3a96fc3a96ff09f9a804dc3a96f6f206f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a80f09f9a8020f09f9a80204d20f09f9a80f09f9a806ff09f9a806ff09f9a806f4d6f4d6f4d4d6f6f204d20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a80c3a94d6f6f4dc3a96f6f206fc3a96f206f6ff09f9a80f09f9a8020c3a94dc3a9206f6f6fc3a920206f4df09f9a806fc3a90000000000" + }, + { + "name": "random-((((bool,string[3],bytes1),(int144,bool[2]),bytes1,string),bool),string,bytes7,bool,int136)", + "type": "((((bool,string[3],bytes1),(int144,bool[2]),bytes1,string),bool),string,bytes7,bool,int136)", + "value": [ + [ + [ + [ + true, + [ + "Moo é🚀", + "Moo é🚀oéooMoo é🚀o 🚀o oé Méo 🚀é🚀🚀o🚀oo🚀ééo 🚀🚀 Méoé", + "Moo é🚀oo oééM " + ], + "0x41" + ], + ["6174848302900471976999552640360802059723250", [false, false]], + "0x5d", + "Moo é🚀Mé oooo🚀🚀🚀éMM MoM oé 🚀 Méé o Mo é🚀🚀🚀 o🚀éooM " + ], + false + ], + "Moo é🚀M🚀🚀oo oo🚀o ", + "0x7d1cbd8f661c16", + false, + "-40355845618041658146202340524108946950298" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oéooMoo é🚀o 🚀o oé Méo 🚀é🚀🚀o🚀oo🚀ééo 🚀🚀 Méoé" + }, + { + "type": "string", + "value": "Moo é🚀oo oééM " + } + ] + }, + { + "type": "hexstring", + "value": "0x41" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "6174848302900471976999552640360802059723250" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x5d" + }, + { + "type": "string", + "value": "Moo é🚀Mé oooo🚀🚀🚀éMM MoM oé 🚀 Méé o Mo é🚀🚀🚀 o🚀éooM " + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M🚀🚀oo oo🚀o " + }, + { + "type": "hexstring", + "value": "0x7d1cbd8f661c16" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-40355845618041658146202340524108946950298" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105c8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610385565b60405180910390f35b6100566101f5565b61005e6101f5565b61006661022b565b61006e61024b565b61007661027f565b60018152610082610297565b604080518082018252600a8152689adede418753e13f3560b71b6020808301919091529083528151608081019092526059808352600092916104e0908301396020838101919091526040805180820182526015815274026b7b79061d4f84fcd4037b79037e1d4e1d4a6901605d1b81840152818501529084019290925250604160f81b9082015281526101136102be565b7146e23f8cdc47eac8a8f928242aa410daa1f281526101306102e0565b600080825260208083018290528381019290925283820192909252605d60f81b604080850191909152805160808101909152605a8082529091610539908301396060808401919091529183525060006020808401829052928452604080518082018252601e81527f4d6f6f20c3a9f09f9a804df09f9a80f09f9a806f6f206f6ff09f9a806f2000008186015293850193909352663e8e5ec7b30e0b60c91b928401929092528201527076985d269352ec7f19ad3140b3fd654899196080820152919050565b6040518060a0016040528061020861022b565b815260606020820181905260006040830181905290820181905260809091015290565b604051806040016040528061023e61024b565b8152600060209091015290565b604051806080016040528061025e61027f565b815260200161026b6102be565b815260006020820152606060409091015290565b604051806060016040528060001515815260200161023e5b60405180606001604052806003905b60608152602001906001900390816102a65790505090565b6040518060400160405280600060110b81526020016102db6102e0565b905290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561032457602081850181015186830182015201610308565b81811115610336576000602083870101525b50601f01601f19169290920160200192915050565b805160110b825260208082015181840160005b600281101561037d57825115158252918301919083019060010161035e565b505050505050565b60006020808352835160a0828501528051604060c0860152805160c06101008701526102208601815115156101c08801528482015160606101e0890152818290506102808901925060005b60038110156104005761021f198a85030182526103ee8484516102fe565b935091870191908701906001016103d0565b505050604091909101516001600160f81b031916610200870152818401519061042d61012088018361034b565b60408301516001600160f81b0319811661018089015260609093015187820360ff19016101a089015292915061046381846102fe565b9385015180151560e089015293925061047a915050565b91850151848303601f190160408601529161049581846102fe565b9250505060408401516104b460608501826001600160c81b0319169052565b50606084015180151560808501525060808401516104d760a085018260100b9052565b50939250505056fe4d6f6f20c3a9f09f9a806fc3a96f6f4d6f6f20c3a9f09f9a806f20f09f9a806f206fc3a9204dc3a96f20f09f9a80c3a9f09f9a80f09f9a806ff09f9a806f6ff09f9a80c3a9c3a96f2020f09f9a80f09f9a80204dc3a96fc3a94d6f6f20c3a9f09f9a804dc3a9206f6f6f6ff09f9a80f09f9a80f09f9a80c3a94d4d204d6f4d20206fc3a92020f09f9a80204dc3a9c3a920206f204d6f202020c3a9f09f9a80f09f9a80f09f9a80206ff09f9a80c3a96f6f4d20a2646970667358221220f7d8c890a00b5cf892e7554ede65d9a935037010e212e2f407b25f8abf3e78b564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0f3ffa1d {\n bool s_0;\n string[3] s_1;\n bytes1 s_2;\n }\n\n struct S_234ff0d0 {\n int144 s_0;\n bool[2] s_1;\n }\n\n struct S_ee91a4e2 {\n S_0f3ffa1d s_0;\n S_234ff0d0 s_1;\n bytes1 s_2;\n string s_3;\n }\n\n struct S_cf515569 {\n S_ee91a4e2 s_0;\n bool s_1;\n }\n\n struct S_bf2ae1cb {\n S_cf515569 s_0;\n string s_1;\n bytes7 s_2;\n bool s_3;\n int136 s_4;\n }\n\n function test () public pure returns (S_bf2ae1cb memory) {\n S_bf2ae1cb memory r;\n {\n S_cf515569 memory r_0;\n {\n S_ee91a4e2 memory r_0_0;\n {\n S_0f3ffa1d memory r_0_0_0;\n {\n bool r_0_0_0_0 = true;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n string[3] memory r_0_0_0_1;\n {\n string memory r_0_0_0_1_0 = unicode\"Moo é🚀\";\n r_0_0_0_1[0] = r_0_0_0_1_0;\n }\n {\n string memory r_0_0_0_1_1 = unicode\"Moo é🚀oéooMoo é🚀o 🚀o oé Méo 🚀é🚀🚀o🚀oo🚀ééo 🚀🚀 Méoé\";\n r_0_0_0_1[1] = r_0_0_0_1_1;\n }\n {\n string memory r_0_0_0_1_2 = unicode\"Moo é🚀oo oééM \";\n r_0_0_0_1[2] = r_0_0_0_1_2;\n }\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n bytes1 r_0_0_0_2 = bytes1(0x41);\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n S_234ff0d0 memory r_0_0_1;\n {\n int144 r_0_0_1_0 = 6174848302900471976999552640360802059723250;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n bool[2] memory r_0_0_1_1;\n {\n bool r_0_0_1_1_0 = false;\n r_0_0_1_1[0] = r_0_0_1_1_0;\n }\n {\n bool r_0_0_1_1_1 = false;\n r_0_0_1_1[1] = r_0_0_1_1_1;\n }\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bytes1 r_0_0_2 = bytes1(0x5d);\n r_0_0.s_2 = r_0_0_2;\n }\n {\n string memory r_0_0_3 = unicode\"Moo é🚀Mé oooo🚀🚀🚀éMM MoM oé 🚀 Méé o Mo é🚀🚀🚀 o🚀éooM \";\n r_0_0.s_3 = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀M🚀🚀oo oo🚀o \";\n r.s_1 = r_1;\n }\n {\n bytes7 r_2 = bytes7(0x7d1cbd8f661c16);\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n {\n int136 r_4 = -40355845618041658146202340524108946950298;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003e07d1cbd8f661c16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffff8967a2d96cad1380e652cebf4c029ab7660000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000046e23f8cdc47eac8a8f928242aa410daa1f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000604100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a806fc3a96f6f4d6f6f20c3a9f09f9a806f20f09f9a806f206fc3a9204dc3a96f20f09f9a80c3a9f09f9a80f09f9a806ff09f9a806f6ff09f9a80c3a9c3a96f2020f09f9a80f09f9a80204dc3a96fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a806f6f206fc3a9c3a94d20200000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a804dc3a9206f6f6f6ff09f9a80f09f9a80f09f9a80c3a94d4d204d6f4d20206fc3a92020f09f9a80204dc3a9c3a920206f204d6f202020c3a9f09f9a80f09f9a80f09f9a80206ff09f9a80c3a96f6f4d20000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a804df09f9a80f09f9a806f6f206f6ff09f9a806f200000" + }, + { + "name": "random-(((bytes19[1],bytes16,address,bytes23),bool),string,bytes31,((address[4]),string,bytes27),int72)[3]", + "type": "(((bytes19[1],bytes16,address,bytes23),bool),string,bytes31,((address[4]),string,bytes27),int72)[3]", + "value": [ + [ + [ + [ + ["0xa38f52665e4a1da79f0fdea949d089822fd4d0"], + "0x76e0a1e6722ebd9eaa1c825ec0958964", + "0x6e55480CDC3A6D86B31d42487AA2B9D90FbF452E", + "0x33528af1694b9e55ecfc5707db4f6a391eece97dfcb901" + ], + false + ], + "Moo é🚀", + "0x50340f7b6cdfa38d6b890daddee39ea1defd3f3e4e319c95eb3f06411962e3", + [ + [ + [ + "0x474Ba07Cd4188A4a51350cAefF90916D126FCC65", + "0xfAd617249F29AcED88E07906465C6cbf15e5C26e", + "0x239516367eF1e96d776040E6d7bf9169D536069d", + "0x636400AFF2f022F71590f527a3E99AcD50209412" + ] + ], + "Moo é🚀oéoMoé 🚀 MM🚀M oo🚀MM", + "0x476e13f147bbf6fbad69c1a04dd89be6fb06b3d2876958207a0abe" + ], + "-878533724554300707378" + ], + [ + [ + [ + ["0x1adf9712c2a6e249c8ce874c260b8d71f0f652"], + "0xcbbc9fa1f5209337286ac6d07a93971c", + "0xb7BA35C9c7E68f984f48341E34c1985607623D67", + "0x5f81395e32bd7389acbc131de71f6b04cff74c901af960" + ], + false + ], + "Moo é🚀🚀o 🚀éoooM🚀Moo", + "0xf47685492d74db5a6f5667fd2f35ddf2c913f8c425d477d0b2b06b957eb2b4", + [ + [ + [ + "0x50B3e0649551A84e792BFDE0e22E370DBdc0E982", + "0x438C50029780c17af6d172fb2a262a337D6f3587", + "0xC87A60897266B341651d6b79aa7127aD0e8c8769", + "0x1537d8FeC5b5B539f1353aB36B01F16a9B7f10a8" + ] + ], + "Moo é🚀🚀é Mo🚀oMééM 🚀é oo éé M🚀o 🚀o🚀oooM é🚀Mo🚀 oMoo🚀", + "0xcc1413a9acb20fb8e4da3930215e9eee1dd55b3d458aa2e37ac350" + ], + "-2348054812072302191283" + ], + [ + [ + [ + ["0x3a19a9a22986ce0e37d8c38e9149229de44c2a"], + "0xf8e5e8ef0edb5b378457e0aa76d2597d", + "0xE9bAEc0b0d09228EAaAd3eD8435B8929A41c6385", + "0x0317ada38315382f2c4d525cc1eaafb224fc46eb37c68a" + ], + false + ], + "Moo é🚀oo oooMo", + "0x53dd9a699b8039645b878f7b28a3b48ba2283306fb75c9c4ab6b44718eea38", + [ + [ + [ + "0x2cfA9A1D7EA56456Bb32eaD10552CFc95d82263A", + "0xEeB07891920C386CEdaA58b5275e148F7D43dCc0", + "0x4eF50F5f4458e759f56E22E2AA7515fE75d04a61", + "0xbe7fa437f3c8C24b1Dd54fCBe04dAa0E088eD3c5" + ] + ], + "Moo é🚀 MoooMM🚀oMMéoM🚀ééoé é", + "0xb8c881dccf816f4644bc33336bca8a3b4c9023be47d63ff3c4fcea" + ], + "1873101176195224045730" + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa38f52665e4a1da79f0fdea949d089822fd4d0" + } + ] + }, + { + "type": "hexstring", + "value": "0x76e0a1e6722ebd9eaa1c825ec0958964" + }, + { + "type": "address", + "value": "0x6e55480CDC3A6D86B31d42487AA2B9D90FbF452E" + }, + { + "type": "hexstring", + "value": "0x33528af1694b9e55ecfc5707db4f6a391eece97dfcb901" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x50340f7b6cdfa38d6b890daddee39ea1defd3f3e4e319c95eb3f06411962e3" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x474Ba07Cd4188A4a51350cAefF90916D126FCC65" + }, + { + "type": "address", + "value": "0xfAd617249F29AcED88E07906465C6cbf15e5C26e" + }, + { + "type": "address", + "value": "0x239516367eF1e96d776040E6d7bf9169D536069d" + }, + { + "type": "address", + "value": "0x636400AFF2f022F71590f527a3E99AcD50209412" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oéoMoé 🚀 MM🚀M oo🚀MM" + }, + { + "type": "hexstring", + "value": "0x476e13f147bbf6fbad69c1a04dd89be6fb06b3d2876958207a0abe" + } + ] + }, + { + "type": "number", + "value": "-878533724554300707378" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1adf9712c2a6e249c8ce874c260b8d71f0f652" + } + ] + }, + { + "type": "hexstring", + "value": "0xcbbc9fa1f5209337286ac6d07a93971c" + }, + { + "type": "address", + "value": "0xb7BA35C9c7E68f984f48341E34c1985607623D67" + }, + { + "type": "hexstring", + "value": "0x5f81395e32bd7389acbc131de71f6b04cff74c901af960" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀o 🚀éoooM🚀Moo" + }, + { + "type": "hexstring", + "value": "0xf47685492d74db5a6f5667fd2f35ddf2c913f8c425d477d0b2b06b957eb2b4" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x50B3e0649551A84e792BFDE0e22E370DBdc0E982" + }, + { + "type": "address", + "value": "0x438C50029780c17af6d172fb2a262a337D6f3587" + }, + { + "type": "address", + "value": "0xC87A60897266B341651d6b79aa7127aD0e8c8769" + }, + { + "type": "address", + "value": "0x1537d8FeC5b5B539f1353aB36B01F16a9B7f10a8" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀é Mo🚀oMééM 🚀é oo éé M🚀o 🚀o🚀oooM é🚀Mo🚀 oMoo🚀" + }, + { + "type": "hexstring", + "value": "0xcc1413a9acb20fb8e4da3930215e9eee1dd55b3d458aa2e37ac350" + } + ] + }, + { + "type": "number", + "value": "-2348054812072302191283" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3a19a9a22986ce0e37d8c38e9149229de44c2a" + } + ] + }, + { + "type": "hexstring", + "value": "0xf8e5e8ef0edb5b378457e0aa76d2597d" + }, + { + "type": "address", + "value": "0xE9bAEc0b0d09228EAaAd3eD8435B8929A41c6385" + }, + { + "type": "hexstring", + "value": "0x0317ada38315382f2c4d525cc1eaafb224fc46eb37c68a" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo oooMo" + }, + { + "type": "hexstring", + "value": "0x53dd9a699b8039645b878f7b28a3b48ba2283306fb75c9c4ab6b44718eea38" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2cfA9A1D7EA56456Bb32eaD10552CFc95d82263A" + }, + { + "type": "address", + "value": "0xEeB07891920C386CEdaA58b5275e148F7D43dCc0" + }, + { + "type": "address", + "value": "0x4eF50F5f4458e759f56E22E2AA7515fE75d04a61" + }, + { + "type": "address", + "value": "0xbe7fa437f3c8C24b1Dd54fCBe04dAa0E088eD3c5" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 MoooMM🚀oMMéoM🚀ééoé é" + }, + { + "type": "hexstring", + "value": "0xb8c881dccf816f4644bc33336bca8a3b4c9023be47d63ff3c4fcea" + } + ] + }, + { + "type": "number", + "value": "1873101176195224045730" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610a15806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906107da565b60405180910390f35b610056610602565b61005e610602565b61006661062f565b61006e61066a565b610076610679565b61007e6106a7565b720a38f52665e4a1da79f0fdea949d089822fd4d606c1b815281526f1db828799c8baf67aa872097b025625960821b602082810191909152736e55480cdc3a6d86b31d42487aa2b9d90fbf452e6040808401919091527f33528af1694b9e55ecfc5707db4f6a391eece97dfcb901000000000000000000606084015291835260008382015291835280518082018252600a8152689adede418753e13f3560b71b81840152918301919091527f50340f7b6cdfa38d6b890daddee39ea1defd3f3e4e319c95eb3f06411962e300908201526101566106c5565b61015e6106ec565b610166610704565b73474ba07cd4188a4a51350caeff90916d126fcc65815273fad617249f29aced88e07906465c6cbf15e5c26e60208083019190915273239516367ef1e96d776040e6d7bf9169d536069d60408084019190915273636400aff2f022f71590f527a3e99acd50209412606080850191909152928452928452825191820190925260288082526000926109b8908301396020830152507f476e13f147bbf6fbad69c1a04dd89be6fb06b3d2876958207a0abe000000000060408201526060820152682fa01ac7cf9bf75231196080820152815261023f61062f565b61024761066a565b61024f610679565b6102576106a7565b720d6fcb8961537124e46743a61305c6b8f87b2960691b815281526f32ef27e87d4824cdca1ab1b41ea4e5c760821b60208281019190915273b7ba35c9c7e68f984f48341e34c1985607623d676040808401919091527f5f81395e32bd7389acbc131de71f6b04cff74c901af96000000000000000000060608085019190915292845260008483018190529385528051928301905260218083529061093f908301396020830152507ff47685492d74db5a6f5667fd2f35ddf2c913f8c425d477d0b2b06b957eb2b400604082015261032d6106c5565b6103356106ec565b61033d610704565b7350b3e0649551a84e792bfde0e22e370dbdc0e982815273438c50029780c17af6d172fb2a262a337d6f358760208083019190915273c87a60897266b341651d6b79aa7127ad0e8c8769604080840191909152731537d8fec5b5b539f1353ab36b01f16a9b7f10a860608401529183529183528051608081019091526058808252600092610960908301396020830152507fcc1413a9acb20fb8e4da3930215e9eee1dd55b3d458aa2e37ac350000000000060408201526060820152687f49ce730d5c29a2b21960808201528082600160200201525061041b61062f565b61042361066a565b61042b610679565b6104336106a7565b721d0cd4d114c367071bec61c748a4914ef2261560691b815281526ff8e5e8ef0edb5b378457e0aa76d2597d60801b60208281019190915273e9baec0b0d09228eaaad3ed8435b8929a41c63856040808401919091527f0317ada38315382f2c4d525cc1eaafb224fc46eb37c68a00000000000000000060608401529183526000838201529183528051808201825260138152724d6f6f20c3a9f09f9a806f6f20206f6f6f4d6f60681b81840152918301919091527f53dd9a699b8039645b878f7b28a3b48ba2283306fb75c9c4ab6b44718eea3800908201526105156106c5565b61051d6106ec565b610525610704565b732cfa9a1d7ea56456bb32ead10552cfc95d82263a815273eeb07891920c386cedaa58b5275e148f7d43dcc0602080830191909152734ef50f5f4458e759f56e22e2aa7515fe75d04a6160408084019190915273be7fa437f3c8c24b1dd54fcbe04daa0e088ed3c56060808501919091529284529284528251918201909252602a808252600092610915908301396020830152507fb8c881dccf816f4644bc33336bca8a3b4c9023be47d63ff3c4fcea00000000006040820152606082015268658a802ba25ab208a2608082015280826002602002015250919050565b60405180606001604052806003905b61061961062f565b8152602001906001900390816106115790505090565b6040518060a0016040528061064261066a565b8152606060208201819052600060408301520161065d6106c5565b8152600060209091015290565b604051806040016040528061065d5b604051806080016040528061068c6106a7565b81526000602082018190526040820181905260609091015290565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806106d86106ec565b815260606020820152600060409091015290565b60405180602001604052806106ff610704565b905290565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b818110156107485760208185018101518683018201520161072c565b8181111561075a576000602083870101525b50601f01601f19169290920160200192915050565b80515160009083825b60048110156107a05782516001600160a01b0316825260209283019290910190600101610778565b505050602082015160c060808501526107bc60c0850182610722565b905064ffffffffff1960408401511660a08501528091505092915050565b602080825260009060808382018185018685805b600381101561090657888403601f19018552825180518051805161012092919088875b600181101561083e5782516cffffffffffffffffffffffffff19168252918d0191908d0190600101610811565b505050808b01516fffffffffffffffffffffffffffffffff1916888c01526040808201516001600160a01b0316818a015260608083015168ffffffffffffffffff1916818b0152928c015115158b8a0152848c015160a08a01859052926108a7858b0185610722565b94508186015193506108bf60c08b018560ff19169052565b80860151935050505086820360e08801526108da828261076f565b9150508782015191506108f361010087018360080b9052565b95880195945050918601916001016107ee565b50919897505050505050505056fe4d6f6f20c3a9f09f9a80204d6f6f6f4d4df09f9a806f4d4dc3a96f4df09f9a80c3a9c3a96fc3a920c3a94d6f6f20c3a9f09f9a80f09f9a806f20f09f9a80c3a96f6f6f4df09f9a804d6f6f4d6f6f20c3a9f09f9a80f09f9a80c3a9204d6ff09f9a806f4dc3a9c3a94d20f09f9a80c3a9206f6f20c3a9c3a9204df09f9a806f20f09f9a806ff09f9a806f6f6f4d20c3a9f09f9a804d6ff09f9a80206f4d6f6ff09f9a804d6f6f20c3a9f09f9a806fc3a96f4d6fc3a920f09f9a80204d4df09f9a804d206f6ff09f9a804d4da2646970667358221220a9ae6359488d6f410381e8a0357a9b39a33af1f1585b820a292eb3a4e136c46464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ba99ad87 {\n bytes19[1] s_0;\n bytes16 s_1;\n address s_2;\n bytes23 s_3;\n }\n\n struct S_9294cd0f {\n S_ba99ad87 s_0;\n bool s_1;\n }\n\n struct S_5a8b99b2 {\n address[4] s_0;\n }\n\n struct S_0bdb9df7 {\n S_5a8b99b2 s_0;\n string s_1;\n bytes27 s_2;\n }\n\n struct S_b6f46e7c {\n S_9294cd0f s_0;\n string s_1;\n bytes31 s_2;\n S_0bdb9df7 s_3;\n int72 s_4;\n }\n\n function test () public pure returns (S_b6f46e7c[3] memory) {\n S_b6f46e7c[3] memory r;\n {\n S_b6f46e7c memory r_0;\n {\n S_9294cd0f memory r_0_0;\n {\n S_ba99ad87 memory r_0_0_0;\n {\n bytes19[1] memory r_0_0_0_0;\n {\n bytes19 r_0_0_0_0_0 = bytes19(0xa38f52665e4a1da79f0fdea949d089822fd4d0);\n r_0_0_0_0[0] = r_0_0_0_0_0;\n }\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n bytes16 r_0_0_0_1 = bytes16(0x76e0a1e6722ebd9eaa1c825ec0958964);\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n address r_0_0_0_2 = 0x6e55480CDC3A6D86B31d42487AA2B9D90FbF452E;\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n {\n bytes23 r_0_0_0_3 = bytes23(0x33528af1694b9e55ecfc5707db4f6a391eece97dfcb901);\n r_0_0_0.s_3 = r_0_0_0_3;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bool r_0_0_1 = false;\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀\";\n r_0.s_1 = r_0_1;\n }\n {\n bytes31 r_0_2 = bytes31(0x50340f7b6cdfa38d6b890daddee39ea1defd3f3e4e319c95eb3f06411962e3);\n r_0.s_2 = r_0_2;\n }\n {\n S_0bdb9df7 memory r_0_3;\n {\n S_5a8b99b2 memory r_0_3_0;\n {\n address[4] memory r_0_3_0_0;\n {\n address r_0_3_0_0_0 = 0x474Ba07Cd4188A4a51350cAefF90916D126FCC65;\n r_0_3_0_0[0] = r_0_3_0_0_0;\n }\n {\n address r_0_3_0_0_1 = 0xfAd617249F29AcED88E07906465C6cbf15e5C26e;\n r_0_3_0_0[1] = r_0_3_0_0_1;\n }\n {\n address r_0_3_0_0_2 = 0x239516367eF1e96d776040E6d7bf9169D536069d;\n r_0_3_0_0[2] = r_0_3_0_0_2;\n }\n {\n address r_0_3_0_0_3 = 0x636400AFF2f022F71590f527a3E99AcD50209412;\n r_0_3_0_0[3] = r_0_3_0_0_3;\n }\n r_0_3_0.s_0 = r_0_3_0_0;\n }\n r_0_3.s_0 = r_0_3_0;\n }\n {\n string memory r_0_3_1 = unicode\"Moo é🚀oéoMoé 🚀 MM🚀M oo🚀MM\";\n r_0_3.s_1 = r_0_3_1;\n }\n {\n bytes27 r_0_3_2 = bytes27(0x476e13f147bbf6fbad69c1a04dd89be6fb06b3d2876958207a0abe);\n r_0_3.s_2 = r_0_3_2;\n }\n r_0.s_3 = r_0_3;\n }\n {\n int72 r_0_4 = -878533724554300707378;\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_b6f46e7c memory r_1;\n {\n S_9294cd0f memory r_1_0;\n {\n S_ba99ad87 memory r_1_0_0;\n {\n bytes19[1] memory r_1_0_0_0;\n {\n bytes19 r_1_0_0_0_0 = bytes19(0x1adf9712c2a6e249c8ce874c260b8d71f0f652);\n r_1_0_0_0[0] = r_1_0_0_0_0;\n }\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n bytes16 r_1_0_0_1 = bytes16(0xcbbc9fa1f5209337286ac6d07a93971c);\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n address r_1_0_0_2 = 0xb7BA35C9c7E68f984f48341E34c1985607623D67;\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n {\n bytes23 r_1_0_0_3 = bytes23(0x5f81395e32bd7389acbc131de71f6b04cff74c901af960);\n r_1_0_0.s_3 = r_1_0_0_3;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bool r_1_0_1 = false;\n r_1_0.s_1 = r_1_0_1;\n }\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀🚀o 🚀éoooM🚀Moo\";\n r_1.s_1 = r_1_1;\n }\n {\n bytes31 r_1_2 = bytes31(0xf47685492d74db5a6f5667fd2f35ddf2c913f8c425d477d0b2b06b957eb2b4);\n r_1.s_2 = r_1_2;\n }\n {\n S_0bdb9df7 memory r_1_3;\n {\n S_5a8b99b2 memory r_1_3_0;\n {\n address[4] memory r_1_3_0_0;\n {\n address r_1_3_0_0_0 = 0x50B3e0649551A84e792BFDE0e22E370DBdc0E982;\n r_1_3_0_0[0] = r_1_3_0_0_0;\n }\n {\n address r_1_3_0_0_1 = 0x438C50029780c17af6d172fb2a262a337D6f3587;\n r_1_3_0_0[1] = r_1_3_0_0_1;\n }\n {\n address r_1_3_0_0_2 = 0xC87A60897266B341651d6b79aa7127aD0e8c8769;\n r_1_3_0_0[2] = r_1_3_0_0_2;\n }\n {\n address r_1_3_0_0_3 = 0x1537d8FeC5b5B539f1353aB36B01F16a9B7f10a8;\n r_1_3_0_0[3] = r_1_3_0_0_3;\n }\n r_1_3_0.s_0 = r_1_3_0_0;\n }\n r_1_3.s_0 = r_1_3_0;\n }\n {\n string memory r_1_3_1 = unicode\"Moo é🚀🚀é Mo🚀oMééM 🚀é oo éé M🚀o 🚀o🚀oooM é🚀Mo🚀 oMoo🚀\";\n r_1_3.s_1 = r_1_3_1;\n }\n {\n bytes27 r_1_3_2 = bytes27(0xcc1413a9acb20fb8e4da3930215e9eee1dd55b3d458aa2e37ac350);\n r_1_3.s_2 = r_1_3_2;\n }\n r_1.s_3 = r_1_3;\n }\n {\n int72 r_1_4 = -2348054812072302191283;\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_b6f46e7c memory r_2;\n {\n S_9294cd0f memory r_2_0;\n {\n S_ba99ad87 memory r_2_0_0;\n {\n bytes19[1] memory r_2_0_0_0;\n {\n bytes19 r_2_0_0_0_0 = bytes19(0x3a19a9a22986ce0e37d8c38e9149229de44c2a);\n r_2_0_0_0[0] = r_2_0_0_0_0;\n }\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n bytes16 r_2_0_0_1 = bytes16(0xf8e5e8ef0edb5b378457e0aa76d2597d);\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n address r_2_0_0_2 = 0xE9bAEc0b0d09228EAaAd3eD8435B8929A41c6385;\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n {\n bytes23 r_2_0_0_3 = bytes23(0x0317ada38315382f2c4d525cc1eaafb224fc46eb37c68a);\n r_2_0_0.s_3 = r_2_0_0_3;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bool r_2_0_1 = false;\n r_2_0.s_1 = r_2_0_1;\n }\n r_2.s_0 = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀oo oooMo\";\n r_2.s_1 = r_2_1;\n }\n {\n bytes31 r_2_2 = bytes31(0x53dd9a699b8039645b878f7b28a3b48ba2283306fb75c9c4ab6b44718eea38);\n r_2.s_2 = r_2_2;\n }\n {\n S_0bdb9df7 memory r_2_3;\n {\n S_5a8b99b2 memory r_2_3_0;\n {\n address[4] memory r_2_3_0_0;\n {\n address r_2_3_0_0_0 = 0x2cfA9A1D7EA56456Bb32eaD10552CFc95d82263A;\n r_2_3_0_0[0] = r_2_3_0_0_0;\n }\n {\n address r_2_3_0_0_1 = 0xEeB07891920C386CEdaA58b5275e148F7D43dCc0;\n r_2_3_0_0[1] = r_2_3_0_0_1;\n }\n {\n address r_2_3_0_0_2 = 0x4eF50F5f4458e759f56E22E2AA7515fE75d04a61;\n r_2_3_0_0[2] = r_2_3_0_0_2;\n }\n {\n address r_2_3_0_0_3 = 0xbe7fa437f3c8C24b1Dd54fCBe04dAa0E088eD3c5;\n r_2_3_0_0[3] = r_2_3_0_0_3;\n }\n r_2_3_0.s_0 = r_2_3_0_0;\n }\n r_2_3.s_0 = r_2_3_0;\n }\n {\n string memory r_2_3_1 = unicode\"Moo é🚀 MoooMM🚀oMMéoM🚀ééoé é\";\n r_2_3.s_1 = r_2_3_1;\n }\n {\n bytes27 r_2_3_2 = bytes27(0xb8c881dccf816f4644bc33336bca8a3b4c9023be47d63ff3c4fcea);\n r_2_3.s_2 = r_2_3_2;\n }\n r_2.s_3 = r_2_3;\n }\n {\n int72 r_2_4 = 1873101176195224045730;\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000005a0a38f52665e4a1da79f0fdea949d089822fd4d00000000000000000000000000076e0a1e6722ebd9eaa1c825ec0958964000000000000000000000000000000000000000000000000000000006e55480cdc3a6d86b31d42487aa2b9d90fbf452e33528af1694b9e55ecfc5707db4f6a391eece97dfcb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012050340f7b6cdfa38d6b890daddee39ea1defd3f3e4e319c95eb3f06411962e3000000000000000000000000000000000000000000000000000000000000000160ffffffffffffffffffffffffffffffffffffffffffffffd05fe538306408adce000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000474ba07cd4188a4a51350caeff90916d126fcc65000000000000000000000000fad617249f29aced88e07906465c6cbf15e5c26e000000000000000000000000239516367ef1e96d776040e6d7bf9169d536069d000000000000000000000000636400aff2f022f71590f527a3e99acd5020941200000000000000000000000000000000000000000000000000000000000000c0476e13f147bbf6fbad69c1a04dd89be6fb06b3d2876958207a0abe000000000000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a806fc3a96f4d6fc3a920f09f9a80204d4df09f9a804d206f6ff09f9a804d4d0000000000000000000000000000000000000000000000001adf9712c2a6e249c8ce874c260b8d71f0f65200000000000000000000000000cbbc9fa1f5209337286ac6d07a93971c00000000000000000000000000000000000000000000000000000000b7ba35c9c7e68f984f48341e34c1985607623d675f81395e32bd7389acbc131de71f6b04cff74c901af96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120f47685492d74db5a6f5667fd2f35ddf2c913f8c425d477d0b2b06b957eb2b4000000000000000000000000000000000000000000000000000000000000000180ffffffffffffffffffffffffffffffffffffffffffffff80b6318cf2a3d65d4d00000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80f09f9a806f20f09f9a80c3a96f6f6f4df09f9a804d6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b3e0649551a84e792bfde0e22e370dbdc0e982000000000000000000000000438c50029780c17af6d172fb2a262a337d6f3587000000000000000000000000c87a60897266b341651d6b79aa7127ad0e8c87690000000000000000000000001537d8fec5b5b539f1353ab36b01f16a9b7f10a800000000000000000000000000000000000000000000000000000000000000c0cc1413a9acb20fb8e4da3930215e9eee1dd55b3d458aa2e37ac350000000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a80f09f9a80c3a9204d6ff09f9a806f4dc3a9c3a94d20f09f9a80c3a9206f6f20c3a9c3a9204df09f9a806f20f09f9a806ff09f9a806f6f6f4d20c3a9f09f9a804d6ff09f9a80206f4d6f6ff09f9a8000000000000000003a19a9a22986ce0e37d8c38e9149229de44c2a00000000000000000000000000f8e5e8ef0edb5b378457e0aa76d2597d00000000000000000000000000000000000000000000000000000000e9baec0b0d09228eaaad3ed8435b8929a41c63850317ada38315382f2c4d525cc1eaafb224fc46eb37c68a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012053dd9a699b8039645b878f7b28a3b48ba2283306fb75c9c4ab6b44718eea380000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000658a802ba25ab208a200000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806f6f20206f6f6f4d6f000000000000000000000000000000000000000000000000002cfa9a1d7ea56456bb32ead10552cfc95d82263a000000000000000000000000eeb07891920c386cedaa58b5275e148f7d43dcc00000000000000000000000004ef50f5f4458e759f56e22e2aa7515fe75d04a61000000000000000000000000be7fa437f3c8c24b1dd54fcbe04daa0e088ed3c500000000000000000000000000000000000000000000000000000000000000c0b8c881dccf816f4644bc33336bca8a3b4c9023be47d63ff3c4fcea0000000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a80204d6f6f6f4d4df09f9a806f4d4dc3a96f4df09f9a80c3a9c3a96fc3a920c3a900000000000000000000000000000000000000000000" + }, + { + "name": "random-((bool,bool,address,string[]),address,uint96,string,(bytes16,(bool)[3],bool,int232))[3]", + "type": "((bool,bool,address,string[]),address,uint96,string,(bytes16,(bool)[3],bool,int232))[3]", + "value": [ + [ + [ + true, + true, + "0xA56a86c0CC5326212Bda3d1a48a5a4BedEf7449d", + [ + "Moo é🚀éoo🚀M🚀🚀o o ooéoMéMoMéo🚀", + "Moo é🚀oM oooo🚀o🚀ooMo é🚀 🚀MoM", + "Moo é🚀🚀🚀 o o🚀é🚀oéo 🚀o" + ] + ], + "0x727B5f2Bb8C0fd94135aC513b144cb9486bD3138", + "74119244891081101631345647992", + "Moo é🚀 é🚀oM🚀 éMooM🚀M🚀🚀MoM ééoM 🚀oé 🚀MéooMM🚀oéMo🚀o", + [ + "0xd0284e92d3b9e0242d0a4bbd6781b0b6", + [[false], [true], [false]], + false, + "2015744372352643699368653516288848792370893864712675850360129822712066" + ] + ], + [ + [false, true, "0x878310b3232CFf80f97Bad3fd8FC4aad27448fFc", ["Moo é🚀🚀o"]], + "0x4E145EEE551de1F810e19888114f4cFd1d93AA72", + "1154838798351363358452737586", + "Moo é🚀Mé ooo🚀 Mooé🚀é🚀ooé🚀🚀", + [ + "0x68151efcc3c675a31c455e00bfa06cec", + [[false], [true], [true]], + false, + "-2374300893861232542468757077616514028300989456728643735967798008048968" + ] + ], + [ + [ + false, + false, + "0x0ee2f4eA89D5dA7FC10F5fc14c65713e2F8bd52c", + [ + "Moo é🚀éoMo🚀oo🚀MMMMMoéééo🚀MééoM oooéoooM", + "Moo é🚀o🚀 o🚀 MMoMéo🚀🚀é o 🚀o🚀🚀 oMoMéo🚀", + "Moo é🚀" + ] + ], + "0xAD403b93fF925AC4213cf18B8998821b076dBCFD", + "17523765766723850732090753256", + "Moo é🚀oéMé🚀oMo ooo 🚀ééé 🚀oMMéoé M🚀 🚀é", + [ + "0x6923fe86a320e2e67abfbc9eb14c4056", + [[true], [false], [false]], + true, + "569966561646417809910816818758484505920056805924731760058745715275846" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xA56a86c0CC5326212Bda3d1a48a5a4BedEf7449d" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoo🚀M🚀🚀o o ooéoMéMoMéo🚀" + }, + { + "type": "string", + "value": "Moo é🚀oM oooo🚀o🚀ooMo é🚀 🚀MoM" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀 o o🚀é🚀oéo 🚀o" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x727B5f2Bb8C0fd94135aC513b144cb9486bD3138" + }, + { + "type": "number", + "value": "74119244891081101631345647992" + }, + { + "type": "string", + "value": "Moo é🚀 é🚀oM🚀 éMooM🚀M🚀🚀MoM ééoM 🚀oé 🚀MéooMM🚀oéMo🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd0284e92d3b9e0242d0a4bbd6781b0b6" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "2015744372352643699368653516288848792370893864712675850360129822712066" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x878310b3232CFf80f97Bad3fd8FC4aad27448fFc" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x4E145EEE551de1F810e19888114f4cFd1d93AA72" + }, + { + "type": "number", + "value": "1154838798351363358452737586" + }, + { + "type": "string", + "value": "Moo é🚀Mé ooo🚀 Mooé🚀é🚀ooé🚀🚀" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x68151efcc3c675a31c455e00bfa06cec" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-2374300893861232542468757077616514028300989456728643735967798008048968" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x0ee2f4eA89D5dA7FC10F5fc14c65713e2F8bd52c" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoMo🚀oo🚀MMMMMoéééo🚀MééoM oooéoooM" + }, + { + "type": "string", + "value": "Moo é🚀o🚀 o🚀 MMoMéo🚀🚀é o 🚀o🚀🚀 oMoMéo🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xAD403b93fF925AC4213cf18B8998821b076dBCFD" + }, + { + "type": "number", + "value": "17523765766723850732090753256" + }, + { + "type": "string", + "value": "Moo é🚀oéMé🚀oMo ooo 🚀ééé 🚀oMMéoé M🚀 🚀é" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6923fe86a320e2e67abfbc9eb14c4056" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "569966561646417809910816818758484505920056805924731760058745715275846" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610b1b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906107c5565b60405180910390f35b610056610632565b61005e610632565b61006661065f565b6040805160808082018352606080830152600180835260208084019190915273a56a86c0cc5326212bda3d1a48a5a4bedef7449d8385015283516003808252928101909452919260009290919082015b60608152602001906001900390816100b65790505090506000604051806060016040528060318152602001610a4960319139905080826000815181106100fe576100fe6108fe565b60200260200101819052505060006040518060600160405280602e8152602001610a1b602e91399050808260018151811061013b5761013b6108fe565b60200260200101819052505060006040518060600160405280602a815260200161096d602a913990508082600281518110610178576101786108fe565b60209081029190910181019190915260608401929092525090825273727b5f2bb8c0fd94135ac513b144cb9486bd3138828201526bef7e009cb1dbf971b79be1786040808401919091528051608081019091526058808252600092610915908301396060830152506101e86106b3565b6f6814274969dcf012168525deb3c0d85b60811b81526102066106e2565b6040805160208082018352600080835291845282518082018452600181528482015282518082018452828152848401528401929092528201527c4ac4a3228a936be1bd55ac4cff07472606416ddeeff7587f030ee8e10260608201526080820152815261027161065f565b6040805160808101825260008082526060808301526001602080840182905273878310b3232cff80f97bad3fd8fc4aad27448ffc8486015284518281528086019095529293919282015b60608152602001906001900390816102bb57905050905060006040518060400160405280600f81526020016e4d6f6f20c3a9f09f9a80f09f9a806f60881b81525090508082600081518110610312576103126108fe565b60209081029190910181019190915260608085019390935292845250734e145eee551de1f810e19888114f4cfd1d93aa72838301526b03bb42a0b3c06c073321e632604080850191909152805191820190526031808252600092610ab5908301396060830152506103816106b3565b6f1a0547bf30f19d68c71157802fe81b3b60821b815261039f6106e2565b6040805160208082018352600080835291845282518082018452600180825285830191909152835180830185529081528484015284810193909352908301527fffffffa7eeaa3e53830dfa5826ad87c264b076c07bd49c026e30d4f34a6e92b86060830152608083019190915282015261041761065f565b604080516080808201835260008083526020808401829052606080850152730ee2f4ea89d5da7fc10f5fc14c65713e2f8bd52c84860152845160038082529381019095529293909290919082015b606081526020019060019003908161046557905050905060006040518060600160405280603b8152602001610a7a603b9139905080826000815181106104ad576104ad6108fe565b602002602001018190525050600060405180608001604052806043815260200161099760439139905080826001815181106104ea576104ea6108fe565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b81525090508082600281518110610530576105306108fe565b60209081029190910181019190915260608401929092525090825273ad403b93ff925ac4213cf18b8998821b076dbcfd828201526b389f51bdb86fc5c4510500e860408084019190915280516080810190915260418082526000926109da908301396060830152506105a06106b3565b6f3491ff43519071733d5fde4f58a6202b60811b81526105be6106e2565b60408051602080820183526001808352918452825180820184526000808252858301919091528351808301855290815284840152840192909252828101919091527c152427f6197d0a8facb34bcb95656332b8f38928b276c49cf383d5b84660608301526080830191909152820152919050565b60405180606001604052806003905b61064961065f565b8152602001906001900390816106415790505090565b604080516101208101909152600060a0820181815260c0830182905260e083019190915260606101008301528190815260006020820181905260408201526060808201526080016106ae6106b3565b905290565b604080516080810190915260008152602081016106ce6106e2565b815260006020820181905260409091015290565b60405180606001604052806003905b6040805160208101909152600081528152602001906001900390816106f15790505090565b6000815180845260005b8181101561073c57602081850181015186830182015201610720565b8181111561074e576000602083870101525b50601f01601f19169290920160200192915050565b80516fffffffffffffffffffffffffffffffff1916825260208082015181840160005b60038110156107a657825151151582529183019190830190600101610786565b5050505060408101511515608083015260600151601c0b60a090910152565b602080825260009060808382018185018685805b60038110156108f057601f198985030185528251805161014080875281511515908701528881015115156101608701526040808201516001600160a01b03166101808801526060918201516101a088018a905280516101c089018190529192908b01916101e0600582901b8a0181019291908a0190885b8181101561087f576101df198c860301835261086d858751610716565b958f01959450918e0191600101610850565b505050848c01516001600160a01b0381168a8e01529250848401516bffffffffffffffffffffffff81168a8601529250808501519350888203818a0152506108c78184610716565b925050508782015191506108dd88870183610763565b95880195945050918601916001016107d9565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a8020c3a9f09f9a806f4df09f9a802020c3a94d6f6f4df09f9a804df09f9a80f09f9a804d6f4d20c3a9c3a96f4d20f09f9a806fc3a920f09f9a804dc3a96f6f4d4df09f9a806fc3a94d6ff09f9a806f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80206f206ff09f9a80c3a9f09f9a806fc3a96f20f09f9a806f4d6f6f20c3a9f09f9a806ff09f9a80206ff09f9a80204d4d6f4dc3a96ff09f9a80f09f9a80c3a9206f20f09f9a806ff09f9a80f09f9a80206f4d6f4dc3a96ff09f9a804d6f6f20c3a9f09f9a806fc3a94dc3a9f09f9a806f4d6f206f6f6f20f09f9a80c3a9c3a9c3a920f09f9a806f4d4dc3a96fc3a920204df09f9a8020f09f9a80c3a94d6f6f20c3a9f09f9a806f4d20206f6f6f6ff09f9a806ff09f9a806f6f4d6f20c3a9f09f9a8020f09f9a804d6f4d4d6f6f20c3a9f09f9a80c3a96f6ff09f9a804df09f9a80f09f9a806f206f206f6fc3a96f4dc3a94d6f4dc3a96ff09f9a804d6f6f20c3a9f09f9a80c3a96f4d6ff09f9a806f6ff09f9a804d4d4d4d4d6fc3a9c3a9c3a96ff09f9a804dc3a9c3a96f4d206f6f6fc3a96f6f6f4d4d6f6f20c3a9f09f9a804dc3a9206f6f6ff09f9a80204d6f6fc3a9f09f9a80c3a9f09f9a806f6fc3a9f09f9a80f09f9a80a2646970667358221220f9f4d3b95dd4550858cfd6a138717d667e5b36906ed51153a2ecb4583594046664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5805d811 {\n bool s_0;\n bool s_1;\n address s_2;\n string[] s_3;\n }\n\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_e06fe566 {\n bytes16 s_0;\n S_c1053bda[3] s_1;\n bool s_2;\n int232 s_3;\n }\n\n struct S_9c603a51 {\n S_5805d811 s_0;\n address s_1;\n uint96 s_2;\n string s_3;\n S_e06fe566 s_4;\n }\n\n function test () public pure returns (S_9c603a51[3] memory) {\n S_9c603a51[3] memory r;\n {\n S_9c603a51 memory r_0;\n {\n S_5805d811 memory r_0_0;\n {\n bool r_0_0_0 = true;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bool r_0_0_1 = true;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0xA56a86c0CC5326212Bda3d1a48a5a4BedEf7449d;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n string[] memory r_0_0_3 = new string[](3);\n {\n string memory r_0_0_3_0 = unicode\"Moo é🚀éoo🚀M🚀🚀o o ooéoMéMoMéo🚀\";\n r_0_0_3[0] = r_0_0_3_0;\n }\n {\n string memory r_0_0_3_1 = unicode\"Moo é🚀oM oooo🚀o🚀ooMo é🚀 🚀MoM\";\n r_0_0_3[1] = r_0_0_3_1;\n }\n {\n string memory r_0_0_3_2 = unicode\"Moo é🚀🚀🚀 o o🚀é🚀oéo 🚀o\";\n r_0_0_3[2] = r_0_0_3_2;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n {\n address r_0_1 = 0x727B5f2Bb8C0fd94135aC513b144cb9486bD3138;\n r_0.s_1 = r_0_1;\n }\n {\n uint96 r_0_2 = 74119244891081101631345647992;\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀 é🚀oM🚀 éMooM🚀M🚀🚀MoM ééoM 🚀oé 🚀MéooMM🚀oéMo🚀o\";\n r_0.s_3 = r_0_3;\n }\n {\n S_e06fe566 memory r_0_4;\n {\n bytes16 r_0_4_0 = bytes16(0xd0284e92d3b9e0242d0a4bbd6781b0b6);\n r_0_4.s_0 = r_0_4_0;\n }\n {\n S_c1053bda[3] memory r_0_4_1;\n {\n S_c1053bda memory r_0_4_1_0;\n {\n bool r_0_4_1_0_0 = false;\n r_0_4_1_0.s_0 = r_0_4_1_0_0;\n }\n r_0_4_1[0] = r_0_4_1_0;\n }\n {\n S_c1053bda memory r_0_4_1_1;\n {\n bool r_0_4_1_1_0 = true;\n r_0_4_1_1.s_0 = r_0_4_1_1_0;\n }\n r_0_4_1[1] = r_0_4_1_1;\n }\n {\n S_c1053bda memory r_0_4_1_2;\n {\n bool r_0_4_1_2_0 = false;\n r_0_4_1_2.s_0 = r_0_4_1_2_0;\n }\n r_0_4_1[2] = r_0_4_1_2;\n }\n r_0_4.s_1 = r_0_4_1;\n }\n {\n bool r_0_4_2 = false;\n r_0_4.s_2 = r_0_4_2;\n }\n {\n int232 r_0_4_3 = 2015744372352643699368653516288848792370893864712675850360129822712066;\n r_0_4.s_3 = r_0_4_3;\n }\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_9c603a51 memory r_1;\n {\n S_5805d811 memory r_1_0;\n {\n bool r_1_0_0 = false;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bool r_1_0_1 = true;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x878310b3232CFf80f97Bad3fd8FC4aad27448fFc;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n string[] memory r_1_0_3 = new string[](1);\n {\n string memory r_1_0_3_0 = unicode\"Moo é🚀🚀o\";\n r_1_0_3[0] = r_1_0_3_0;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n r_1.s_0 = r_1_0;\n }\n {\n address r_1_1 = 0x4E145EEE551de1F810e19888114f4cFd1d93AA72;\n r_1.s_1 = r_1_1;\n }\n {\n uint96 r_1_2 = 1154838798351363358452737586;\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀Mé ooo🚀 Mooé🚀é🚀ooé🚀🚀\";\n r_1.s_3 = r_1_3;\n }\n {\n S_e06fe566 memory r_1_4;\n {\n bytes16 r_1_4_0 = bytes16(0x68151efcc3c675a31c455e00bfa06cec);\n r_1_4.s_0 = r_1_4_0;\n }\n {\n S_c1053bda[3] memory r_1_4_1;\n {\n S_c1053bda memory r_1_4_1_0;\n {\n bool r_1_4_1_0_0 = false;\n r_1_4_1_0.s_0 = r_1_4_1_0_0;\n }\n r_1_4_1[0] = r_1_4_1_0;\n }\n {\n S_c1053bda memory r_1_4_1_1;\n {\n bool r_1_4_1_1_0 = true;\n r_1_4_1_1.s_0 = r_1_4_1_1_0;\n }\n r_1_4_1[1] = r_1_4_1_1;\n }\n {\n S_c1053bda memory r_1_4_1_2;\n {\n bool r_1_4_1_2_0 = true;\n r_1_4_1_2.s_0 = r_1_4_1_2_0;\n }\n r_1_4_1[2] = r_1_4_1_2;\n }\n r_1_4.s_1 = r_1_4_1;\n }\n {\n bool r_1_4_2 = false;\n r_1_4.s_2 = r_1_4_2;\n }\n {\n int232 r_1_4_3 = -2374300893861232542468757077616514028300989456728643735967798008048968;\n r_1_4.s_3 = r_1_4_3;\n }\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n {\n S_9c603a51 memory r_2;\n {\n S_5805d811 memory r_2_0;\n {\n bool r_2_0_0 = false;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bool r_2_0_1 = false;\n r_2_0.s_1 = r_2_0_1;\n }\n {\n address r_2_0_2 = 0x0ee2f4eA89D5dA7FC10F5fc14c65713e2F8bd52c;\n r_2_0.s_2 = r_2_0_2;\n }\n {\n string[] memory r_2_0_3 = new string[](3);\n {\n string memory r_2_0_3_0 = unicode\"Moo é🚀éoMo🚀oo🚀MMMMMoéééo🚀MééoM oooéoooM\";\n r_2_0_3[0] = r_2_0_3_0;\n }\n {\n string memory r_2_0_3_1 = unicode\"Moo é🚀o🚀 o🚀 MMoMéo🚀🚀é o 🚀o🚀🚀 oMoMéo🚀\";\n r_2_0_3[1] = r_2_0_3_1;\n }\n {\n string memory r_2_0_3_2 = unicode\"Moo é🚀\";\n r_2_0_3[2] = r_2_0_3_2;\n }\n r_2_0.s_3 = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0xAD403b93fF925AC4213cf18B8998821b076dBCFD;\n r_2.s_1 = r_2_1;\n }\n {\n uint96 r_2_2 = 17523765766723850732090753256;\n r_2.s_2 = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀oéMé🚀oMo ooo 🚀ééé 🚀oMMéoé M🚀 🚀é\";\n r_2.s_3 = r_2_3;\n }\n {\n S_e06fe566 memory r_2_4;\n {\n bytes16 r_2_4_0 = bytes16(0x6923fe86a320e2e67abfbc9eb14c4056);\n r_2_4.s_0 = r_2_4_0;\n }\n {\n S_c1053bda[3] memory r_2_4_1;\n {\n S_c1053bda memory r_2_4_1_0;\n {\n bool r_2_4_1_0_0 = true;\n r_2_4_1_0.s_0 = r_2_4_1_0_0;\n }\n r_2_4_1[0] = r_2_4_1_0;\n }\n {\n S_c1053bda memory r_2_4_1_1;\n {\n bool r_2_4_1_1_0 = false;\n r_2_4_1_1.s_0 = r_2_4_1_1_0;\n }\n r_2_4_1[1] = r_2_4_1_1;\n }\n {\n S_c1053bda memory r_2_4_1_2;\n {\n bool r_2_4_1_2_0 = false;\n r_2_4_1_2.s_0 = r_2_4_1_2_0;\n }\n r_2_4_1[2] = r_2_4_1_2;\n }\n r_2_4.s_1 = r_2_4_1;\n }\n {\n bool r_2_4_2 = true;\n r_2_4.s_2 = r_2_4_2;\n }\n {\n int232 r_2_4_3 = 569966561646417809910816818758484505920056805924731760058745715275846;\n r_2_4.s_3 = r_2_4_3;\n }\n r_2.s_4 = r_2_4;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000727b5f2bb8c0fd94135ac513b144cb9486bd31380000000000000000000000000000000000000000ef7e009cb1dbf971b79be1780000000000000000000000000000000000000000000000000000000000000360d0284e92d3b9e0242d0a4bbd6781b0b60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ac4a3228a936be1bd55ac4cff07472606416ddeeff7587f030ee8e10200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a56a86c0cc5326212bda3d1a48a5a4bedef7449d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a80c3a96f6ff09f9a804df09f9a80f09f9a806f206f206f6fc3a96f4dc3a94d6f4dc3a96ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a806f4d20206f6f6f6ff09f9a806ff09f9a806f6f4d6f20c3a9f09f9a8020f09f9a804d6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a80f09f9a80f09f9a80206f206ff09f9a80c3a9f09f9a806fc3a96f20f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a8020c3a9f09f9a806f4df09f9a802020c3a94d6f6f4df09f9a804df09f9a80f09f9a804d6f4d20c3a9c3a96f4d20f09f9a806fc3a920f09f9a804dc3a96f6f4d4df09f9a806fc3a94d6ff09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000004e145eee551de1f810e19888114f4cfd1d93aa72000000000000000000000000000000000000000003bb42a0b3c06c073321e632000000000000000000000000000000000000000000000000000000000000024068151efcc3c675a31c455e00bfa06cec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffa7eeaa3e53830dfa5826ad87c264b076c07bd49c026e30d4f34a6e92b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000878310b3232cff80f97bad3fd8fc4aad27448ffc000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a804dc3a9206f6f6ff09f9a80204d6f6fc3a9f09f9a80c3a9f09f9a806f6fc3a9f09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000ad403b93ff925ac4213cf18b8998821b076dbcfd0000000000000000000000000000000000000000389f51bdb86fc5c4510500e800000000000000000000000000000000000000000000000000000000000003606923fe86a320e2e67abfbc9eb14c4056000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000152427f6197d0a8facb34bcb95656332b8f38928b276c49cf383d5b846000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ee2f4ea89d5da7fc10f5fc14c65713e2f8bd52c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a80c3a96f4d6ff09f9a806f6ff09f9a804d4d4d4d4d6fc3a9c3a9c3a96ff09f9a804dc3a9c3a96f4d206f6f6fc3a96f6f6f4d000000000000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a806ff09f9a80206ff09f9a80204d4d6f4dc3a96ff09f9a80f09f9a80c3a9206f20f09f9a806ff09f9a80f09f9a80206f4d6f4dc3a96ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a806fc3a94dc3a9f09f9a806f4d6f206f6f6f20f09f9a80c3a9c3a9c3a920f09f9a806f4d4dc3a96fc3a920204df09f9a8020f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bool,bytes29[1],uint216,int16,(bool,string,int168,bytes19[4])),bytes10,string,bytes27,string)", + "type": "((bool,bytes29[1],uint216,int16,(bool,string,int168,bytes19[4])),bytes10,string,bytes27,string)", + "value": [ + [ + false, + ["0xae958ccebde0d68309bb9920dbb03d2302038ada3e0695c6d245d29638"], + "34588956925111867972330688092252384491979011332725286746642883025", + "-17814", + [ + false, + "Moo é🚀🚀éoo", + "-95598922699718537229087676339091443499277188140232", + [ + "0xa46da958ff075f4e5a3bf5748e9e6872faaaf4", + "0x07ae214229e513a61ddad364c7556f2d60fcea", + "0x82ba049dbf76bd4d679567a10de6ff2a60cf65", + "0x656c2200ed28c0e3ac2d6edc428e3e5119bcb3" + ] + ] + ], + "0xc5e7fd75e1c3c6cac703", + "Moo é🚀 é🚀ooo🚀M 🚀 MéM ooMéoo🚀o o🚀oMM🚀éoMoooéooo", + "0x5d5de0f9fef2fe364df173f77b5fbb6fbc631209f35bcb9b1bbefd", + "Moo é🚀 MooMMéo🚀MMo 🚀éoéMoé🚀Méoéo 🚀éo🚀é🚀 🚀éMoMoM🚀🚀oooM🚀MM M🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xae958ccebde0d68309bb9920dbb03d2302038ada3e0695c6d245d29638" + } + ] + }, + { + "type": "number", + "value": "34588956925111867972330688092252384491979011332725286746642883025" + }, + { + "type": "number", + "value": "-17814" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀éoo" + }, + { + "type": "number", + "value": "-95598922699718537229087676339091443499277188140232" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa46da958ff075f4e5a3bf5748e9e6872faaaf4" + }, + { + "type": "hexstring", + "value": "0x07ae214229e513a61ddad364c7556f2d60fcea" + }, + { + "type": "hexstring", + "value": "0x82ba049dbf76bd4d679567a10de6ff2a60cf65" + }, + { + "type": "hexstring", + "value": "0x656c2200ed28c0e3ac2d6edc428e3e5119bcb3" + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xc5e7fd75e1c3c6cac703" + }, + { + "type": "string", + "value": "Moo é🚀 é🚀ooo🚀M 🚀 MéM ooMéoo🚀o o🚀oMM🚀éoMoooéooo" + }, + { + "type": "hexstring", + "value": "0x5d5de0f9fef2fe364df173f77b5fbb6fbc631209f35bcb9b1bbefd" + }, + { + "type": "string", + "value": "Moo é🚀 MooMMéo🚀MMo 🚀éoéMoé🚀Méoéo 🚀éo🚀é🚀 🚀éMoMoM🚀🚀oooM🚀MM M🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105a4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103bd565b60405180910390f35b610056610229565b61005e610229565b610066610260565b6000815261007261029c565b7fae958ccebde0d68309bb9920dbb03d2302038ada3e0695c6d245d29638000000815260208201527a5414c2bfcaf2109390a13161dad6d8866380b5137a51795f82a1d160408201526145951960608201526100cc6102ba565b6000815260408051808201825260128152714d6f6f20c3a9f09f9a80f09f9a80c3a96f6f60701b60208083019190915283015274416953f4498a0a291186a39b7cb3c66835b55d0cc719908201526101226102dd565b72291b6a563fc1d7d3968efd5d23a79a1cbeaabd606a1b81527203d710a114f289d30eed69b263aab796b07e7560691b6020808301919091527282ba049dbf76bd4d679567a10de6ff2a60cf6560681b60408084019190915272656c2200ed28c0e3ac2d6edc428e3e5119bcb360681b60608085019190915284019290925260808481019390935292845269c5e7fd75e1c3c6cac70360b01b8484015280519182019052604a8082526000926104ba908301396040808401919091527f5d5de0f9fef2fe364df173f77b5fbb6fbc631209f35bcb9b1bbefd00000000006060840152805160a08101909152606b808252600092506105046020830139608083015250919050565b6040518060a0016040528061023c610260565b81526000602082018190526060604083018190528083019190915260809091015290565b6040518060a0016040528060001515815260200161027c61029c565b815260006020820181905260408201526060016102976102ba565b905290565b60405180602001604052806001906020820280368337509192915050565b604080516080810182526000808252606060208301819052928201529081016102975b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b8181101561032157602081850181015186830182015201610305565b81811115610333576000602083870101525b50601f01601f19169290920160200192915050565b805115158252600060208083015160e08286015261036960e08601826102fb565b9050604084015160140b604086015260608401516060860160005b60048110156103b15782516cffffffffffffffffffffffffff191682529184019190840190600101610384565b50919695505050505050565b60006020808352835160a0828501528051151560c08501528181015160e0850160005b600181101561040357825162ffffff1916825291840191908401906001016103e0565b50505060408101516001600160d81b0316610100850152606081015160010b6101208501526080015160a0610140850152610442610160850182610348565b918501516001600160b01b03198116604086015291905060408501519150601f198085830301606086015261047782846102fb565b925060608601519150610494608086018364ffffffffff19169052565b60808601519150808584030160a0860152506104b082826102fb565b9594505050505056fe4d6f6f20c3a9f09f9a8020c3a9f09f9a806f6f6ff09f9a804d20f09f9a8020204dc3a94d206f6f4dc3a96f6ff09f9a806f206ff09f9a806f4d4df09f9a80c3a96f4d6f6f6fc3a96f6f6f4d6f6f20c3a9f09f9a8020204d6f6f4d4dc3a96ff09f9a804d4d6f20f09f9a80c3a96fc3a94d6fc3a9f09f9a804dc3a96fc3a96f2020f09f9a80c3a96ff09f9a80c3a9f09f9a8020f09f9a80c3a94d6f4d6f4df09f9a80f09f9a806f6f6f4df09f9a804d4d204df09f9a80a2646970667358221220b3daccafe4d0c4d635d8ba799943335994ae9abb783e7ec48d3326098a248ec564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c3781cd5 {\n bool s_0;\n string s_1;\n int168 s_2;\n bytes19[4] s_3;\n }\n\n struct S_6a7a4daf {\n bool s_0;\n bytes29[1] s_1;\n uint216 s_2;\n int16 s_3;\n S_c3781cd5 s_4;\n }\n\n struct S_9bba254d {\n S_6a7a4daf s_0;\n bytes10 s_1;\n string s_2;\n bytes27 s_3;\n string s_4;\n }\n\n function test () public pure returns (S_9bba254d memory) {\n S_9bba254d memory r;\n {\n S_6a7a4daf memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n bytes29[1] memory r_0_1;\n {\n bytes29 r_0_1_0 = bytes29(0xae958ccebde0d68309bb9920dbb03d2302038ada3e0695c6d245d29638);\n r_0_1[0] = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n uint216 r_0_2 = 34588956925111867972330688092252384491979011332725286746642883025;\n r_0.s_2 = r_0_2;\n }\n {\n int16 r_0_3 = -17814;\n r_0.s_3 = r_0_3;\n }\n {\n S_c3781cd5 memory r_0_4;\n {\n bool r_0_4_0 = false;\n r_0_4.s_0 = r_0_4_0;\n }\n {\n string memory r_0_4_1 = unicode\"Moo é🚀🚀éoo\";\n r_0_4.s_1 = r_0_4_1;\n }\n {\n int168 r_0_4_2 = -95598922699718537229087676339091443499277188140232;\n r_0_4.s_2 = r_0_4_2;\n }\n {\n bytes19[4] memory r_0_4_3;\n {\n bytes19 r_0_4_3_0 = bytes19(0xa46da958ff075f4e5a3bf5748e9e6872faaaf4);\n r_0_4_3[0] = r_0_4_3_0;\n }\n {\n bytes19 r_0_4_3_1 = bytes19(0x07ae214229e513a61ddad364c7556f2d60fcea);\n r_0_4_3[1] = r_0_4_3_1;\n }\n {\n bytes19 r_0_4_3_2 = bytes19(0x82ba049dbf76bd4d679567a10de6ff2a60cf65);\n r_0_4_3[2] = r_0_4_3_2;\n }\n {\n bytes19 r_0_4_3_3 = bytes19(0x656c2200ed28c0e3ac2d6edc428e3e5119bcb3);\n r_0_4_3[3] = r_0_4_3_3;\n }\n r_0_4.s_3 = r_0_4_3;\n }\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n bytes10 r_1 = bytes10(0xc5e7fd75e1c3c6cac703);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀 é🚀ooo🚀M 🚀 MéM ooMéoo🚀o o🚀oMM🚀éoMoooéooo\";\n r.s_2 = r_2;\n }\n {\n bytes27 r_3 = bytes27(0x5d5de0f9fef2fe364df173f77b5fbb6fbc631209f35bcb9b1bbefd);\n r.s_3 = r_3;\n }\n {\n string memory r_4 = unicode\"Moo é🚀 MooMMéo🚀MMo 🚀éoéMoé🚀Méoéo 🚀éo🚀é🚀 🚀éMoMoM🚀🚀oooM🚀MM M🚀\";\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0c5e7fd75e1c3c6cac7030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002605d5de0f9fef2fe364df173f77b5fbb6fbc631209f35bcb9b1bbefd000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000000ae958ccebde0d68309bb9920dbb03d2302038ada3e0695c6d245d2963800000000000000005414c2bfcaf2109390a13161dad6d8866380b5137a51795f82a1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba6a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0ffffffffffffffffffffffbe96ac0bb675f5d6ee795c64834c3997ca4aa2f338a46da958ff075f4e5a3bf5748e9e6872faaaf40000000000000000000000000007ae214229e513a61ddad364c7556f2d60fcea0000000000000000000000000082ba049dbf76bd4d679567a10de6ff2a60cf6500000000000000000000000000656c2200ed28c0e3ac2d6edc428e3e5119bcb30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a80f09f9a80c3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a8020c3a9f09f9a806f6f6ff09f9a804d20f09f9a8020204dc3a94d206f6f4dc3a96f6ff09f9a806f206ff09f9a806f4d4df09f9a80c3a96f4d6f6f6fc3a96f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b4d6f6f20c3a9f09f9a8020204d6f6f4d4dc3a96ff09f9a804d4d6f20f09f9a80c3a96fc3a94d6fc3a9f09f9a804dc3a96fc3a96f2020f09f9a80c3a96ff09f9a80c3a9f09f9a8020f09f9a80c3a94d6f4d6f4df09f9a80f09f9a806f6f6f4df09f9a804d4d204df09f9a80000000000000000000000000000000000000000000" + }, + { + "name": "random-((int,(((bytes27,bytes14,address,bytes17)[1]),address,bytes7,address),uint192),string,int256,bool[3])", + "type": "((int,(((bytes27,bytes14,address,bytes17)[1]),address,bytes7,address),uint192),string,int256,bool[3])", + "value": [ + [ + "13173298113009821450810374662266444586753607818345582586203811312368175910257", + [ + [ + [ + [ + "0x3f103859ca758b60359a70c8a7bd17a83094e76b8053c591024372", + "0x2bb97a146f5758f9be8a021fb152", + "0x066eAE20Df43d1236543F91C3254Ebc7D378f75a", + "0x405b0d88bfc325d3ca6ea68acf6a7e20a7" + ] + ] + ], + "0xC18aB791e827b066Dcffb7aa06713C8d214abE4b", + "0x2d2228f2351ca6", + "0xFAc3EDAeFe4B1ad0449E4D90103395383BbAeAb2" + ], + "4339536122181906316510292365767347242736771185293621648556" + ], + "Moo é🚀ooooéoo🚀 Mééo", + "10269206329789991383076569419174094107080371696636548398341504340519374599689", + [true, false, false] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "13173298113009821450810374662266444586753607818345582586203811312368175910257" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3f103859ca758b60359a70c8a7bd17a83094e76b8053c591024372" + }, + { + "type": "hexstring", + "value": "0x2bb97a146f5758f9be8a021fb152" + }, + { + "type": "address", + "value": "0x066eAE20Df43d1236543F91C3254Ebc7D378f75a" + }, + { + "type": "hexstring", + "value": "0x405b0d88bfc325d3ca6ea68acf6a7e20a7" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xC18aB791e827b066Dcffb7aa06713C8d214abE4b" + }, + { + "type": "hexstring", + "value": "0x2d2228f2351ca6" + }, + { + "type": "address", + "value": "0xFAc3EDAeFe4B1ad0449E4D90103395383BbAeAb2" + } + ] + }, + { + "type": "number", + "value": "4339536122181906316510292365767347242736771185293621648556" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooooéoo🚀 Mééo" + }, + { + "type": "number", + "value": "10269206329789991383076569419174094107080371696636548398341504340519374599689" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506104e4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610384565b60405180910390f35b610056610211565b61005e610211565b610066610244565b7f1d1fd28fdb2caac6c9f35c91d9486e2f6b3e154c774be6dcad235c49678d8d71815261009161026b565b610099610299565b6100a16102a8565b604080516080810182527f3f103859ca758b60359a70c8a7bd17a83094e76b8053c591024372000000000081526d15dcbd0a37abac7cdf45010fd8a960911b60208083019190915273066eae20df43d1236543f91c3254ebc7d378f75a8284015270405b0d88bfc325d3ca6ea68acf6a7e20a760781b60608084019190915291845292845292845273c18ab791e827b066dcffb7aa06713c8d214abe4b8483015266169114791a8e5360c91b8482015273fac3edaefe4b1ad0449e4d90103395383bbaeab2928401929092528381019290925277b0fadf016af2774b575177867cb26cf1857e11579012dcac8382015291835281518083018352601d81527f4d6f6f20c3a9f09f9a806f6f6f6fc3a96f6ff09f9a80204dc3a9c3a96f00000081830152908301527f16b42a30cfb4c9d847a7ed3fd6a92e116de683e1c20b5d34ad3caaced81cb609908201526101f56102ee565b6001815260006020820181905260408201526060820152919050565b6040518060800160405280610224610244565b8152602001606081526020016000815260200161023f6102ee565b905290565b60405180606001604052806000815260200161025e61026b565b8152600060209091015290565b604051806080016040528061027e610299565b81526000602082018190526040820181905260609091015290565b604051806020016040528061023f5b60405180602001604052806001905b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816102b75790505090565b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b8181101561033257602081850181015186830182015201610316565b81811115610344576000602083870101525b50601f01601f19169290920160200192915050565b8060005b600381101561037e578151151584526020938401939091019060010161035d565b50505050565b6020808252825180518383015280820151805151600093929190604090858288015b600182101561041a578251805164ffffffffff191682528781015171ffffffffffffffffffffffffffffffffffff191688830152848101516001600160a01b0316858301526060908101516effffffffffffffffffffffffffffff19169082015291860191600191909101906080016103a6565b505050838201516001600160a01b0390811660c0880152818301516001600160c81b03191660e0880152606090920151918216610100870152918201516001600160c01b03811661012087015291928601516101c0610140870152926104846101e087018561030c565b93508087015161016087015250505060608401516104a6610180850182610359565b50939250505056fea2646970667358221220aa2eab4e160707dc3885619a145f3190d50c155a6515a1b2d12827746704f61864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2d2dc890 {\n bytes27 s_0;\n bytes14 s_1;\n address s_2;\n bytes17 s_3;\n }\n\n struct S_43208241 {\n S_2d2dc890[1] s_0;\n }\n\n struct S_8e93bc67 {\n S_43208241 s_0;\n address s_1;\n bytes7 s_2;\n address s_3;\n }\n\n struct S_07e5082e {\n int256 s_0;\n S_8e93bc67 s_1;\n uint192 s_2;\n }\n\n struct S_ec36874c {\n S_07e5082e s_0;\n string s_1;\n int256 s_2;\n bool[3] s_3;\n }\n\n function test () public pure returns (S_ec36874c memory) {\n S_ec36874c memory r;\n {\n S_07e5082e memory r_0;\n {\n int r_0_0 = 13173298113009821450810374662266444586753607818345582586203811312368175910257;\n r_0.s_0 = r_0_0;\n }\n {\n S_8e93bc67 memory r_0_1;\n {\n S_43208241 memory r_0_1_0;\n {\n S_2d2dc890[1] memory r_0_1_0_0;\n {\n S_2d2dc890 memory r_0_1_0_0_0;\n {\n bytes27 r_0_1_0_0_0_0 = bytes27(0x3f103859ca758b60359a70c8a7bd17a83094e76b8053c591024372);\n r_0_1_0_0_0.s_0 = r_0_1_0_0_0_0;\n }\n {\n bytes14 r_0_1_0_0_0_1 = bytes14(0x2bb97a146f5758f9be8a021fb152);\n r_0_1_0_0_0.s_1 = r_0_1_0_0_0_1;\n }\n {\n address r_0_1_0_0_0_2 = 0x066eAE20Df43d1236543F91C3254Ebc7D378f75a;\n r_0_1_0_0_0.s_2 = r_0_1_0_0_0_2;\n }\n {\n bytes17 r_0_1_0_0_0_3 = bytes17(0x405b0d88bfc325d3ca6ea68acf6a7e20a7);\n r_0_1_0_0_0.s_3 = r_0_1_0_0_0_3;\n }\n r_0_1_0_0[0] = r_0_1_0_0_0;\n }\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n {\n address r_0_1_1 = 0xC18aB791e827b066Dcffb7aa06713C8d214abE4b;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n bytes7 r_0_1_2 = bytes7(0x2d2228f2351ca6);\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0xFAc3EDAeFe4B1ad0449E4D90103395383BbAeAb2;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0.s_1 = r_0_1;\n }\n {\n uint192 r_0_2 = 4339536122181906316510292365767347242736771185293621648556;\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀ooooéoo🚀 Mééo\";\n r.s_1 = r_1;\n }\n {\n int256 r_2 = 10269206329789991383076569419174094107080371696636548398341504340519374599689;\n r.s_2 = r_2;\n }\n {\n bool[3] memory r_3;\n {\n bool r_3_0 = true;\n r_3[0] = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3[1] = r_3_1;\n }\n {\n bool r_3_2 = false;\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000201d1fd28fdb2caac6c9f35c91d9486e2f6b3e154c774be6dcad235c49678d8d713f103859ca758b60359a70c8a7bd17a83094e76b8053c59102437200000000002bb97a146f5758f9be8a021fb152000000000000000000000000000000000000000000000000000000000000066eae20df43d1236543f91c3254ebc7d378f75a405b0d88bfc325d3ca6ea68acf6a7e20a7000000000000000000000000000000000000000000000000000000c18ab791e827b066dcffb7aa06713c8d214abe4b2d2228f2351ca600000000000000000000000000000000000000000000000000000000000000000000000000fac3edaefe4b1ad0449e4d90103395383bbaeab20000000000000000b0fadf016af2774b575177867cb26cf1857e11579012dcac00000000000000000000000000000000000000000000000000000000000001c016b42a30cfb4c9d847a7ed3fd6a92e116de683e1c20b5d34ad3caaced81cb609000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f6f6f6fc3a96f6ff09f9a80204dc3a9c3a96f000000" + }, + { + "name": "random-(address,int80,(string,address[3][1],(bool,bytes5,bool,bytes28),uint240,uint88))[4][4]", + "type": "(address,int80,(string,address[3][1],(bool,bytes5,bool,bytes28),uint240,uint88))[4][4]", + "value": [ + [ + [ + "0xfe885b3641f37aBccC8b5B6D8C6a7dF555210767", + "-371954046979619113350646", + [ + "Moo é🚀ooM🚀é🚀 oooMéé🚀é 🚀🚀 MMMéooo oMo🚀é", + [ + [ + "0xbBF282f8688338465A94AC8599E02386b5cd22F2", + "0xDdF736BE8709AC99860430A984e96C6F8b391099", + "0xE7C38A0984540225CBf85498DB586c270A389EC7" + ] + ], + [ + false, + "0x77fa16afdd", + true, + "0x77f74f709eedb466b62cee3c0acaf238d221322940dd21c5e68c43cf" + ], + "1726008546681151260551673598736135016501958094094443998590598452689683472", + "10164057757303282681551155" + ] + ], + [ + "0x222F1924FEbd6b9A69733904ded8720404ef905f", + "317868839210587068255486", + [ + "Moo é🚀oMoé🚀🚀🚀oooM🚀", + [ + [ + "0xc0c95c9448bEAFA3596Ba222d777c3cDBAfB94AA", + "0xE239A942223A91CfA1f78670189FDFe6AE1Cd5fD", + "0x03b94B43284465fc157f981e2A6bEb912ff4740B" + ] + ], + [ + false, + "0x1fb2e65d72", + false, + "0x2bef0993e4b24a68b622b3d43d28857492be91a46f50b55cde50d593" + ], + "361129914365884532405488894426208442412880084923785456935277568178346674", + "272453771477002621586759820" + ] + ], + [ + "0x07592a1445307fcCA87b0ECB13fc26D016090f17", + "-573345633070781755699460", + [ + "Moo é🚀éo🚀ooMéoM🚀oM Moé o🚀Mé 🚀ooé🚀Moooo", + [ + [ + "0x74CeFAEF109F3b0FbcD654086ed14afF1c2d4aCB", + "0xE996Aaf96C73c17114D9b3B96F0020B7FaF66665", + "0xFE044366F8D27ea8951F589bF3f098de555712E7" + ] + ], + [ + true, + "0xd98b533a04", + false, + "0x7361f5713429ee5b3c5aa0f95a51f20362d03de73af5d24fdd1ba3a9" + ], + "113175224569512132013602103585824308313673745181417885159929491955838294", + "228042630791797743924668015" + ] + ], + [ + "0xdEd3728DE4B0b5EF2e877365aB81522f4be28d0E", + "78552340874942351714788", + [ + "Moo é🚀oé 🚀🚀oééoooMéoé🚀 é🚀oéo🚀", + [ + [ + "0x27D6FeA2a818863362dC1CB5704448D02f04A776", + "0xa516255263F68dc224e67E5D3750Ab8C4DF974f4", + "0xAaA49B36544055460f23B02B2241c0Eb6E1D2135" + ] + ], + [ + true, + "0x6181aee8fd", + false, + "0x5bca6ff666305ba99db6c0a4c94ca9c20bdd4c1b726d9fc5abe07838" + ], + "757119636008924985821085062009745352205806977222282372812821415663386768", + "142356003821432769055146607" + ] + ] + ], + [ + [ + "0x50A1bD48978827275f23797f3CA96897ffA8ED76", + "412470653691313394787764", + [ + "Moo é🚀éoMMéo🚀 MMoééMM éo 🚀oéo🚀🚀 M", + [ + [ + "0x2225F93CFA3ff596CfB3205ebf32570ee5CFCE26", + "0x850E5bC3309820A886aA850a4ee9586f6B095F8e", + "0x8d97a2ab51CCB4Bc4FCBb5273a7E0bb7FA4B17bc" + ] + ], + [ + true, + "0x7bd96891eb", + true, + "0xca861b294f1d32a2806431f122a97875f12176f30437df73046fad89" + ], + "499852171895052400262391608960276181971313109864263121723067631577566061", + "298830116619038927014612371" + ] + ], + [ + "0x00541Afc9D96642D0221F314859e27e98FeD271F", + "-487575037523970649496700", + [ + "Moo é🚀", + [ + [ + "0x91b965e04AF757186C2e753709ac29A352F01333", + "0xbDE131e4171c055e6e6251FFEC1F9C3d308f812c", + "0x5DD1693Be9bE0115a90B75B64D928E352853C472" + ] + ], + [ + true, + "0x34d17ee2b8", + false, + "0x25f9af3d7cf62f47d42c83c8f2aa9e4aa0ff6d9a8068533e7fdc0b8f" + ], + "452851383571058179006716562279806002331361802630414285486007432088225249", + "51270756966335915626570875" + ] + ], + [ + "0x3A10d67f1060852d0b34fb0561bB419649Ed91Ea", + "600129248375862126655075", + [ + "Moo é🚀o🚀 Mooéé🚀🚀🚀éooéo🚀oéo 🚀 Mo o 🚀é 🚀MooMé é🚀MMoo", + [ + [ + "0xb97cF4099ceE515bF91Dede77BF18be293719Df5", + "0x95faB6D50E7c8abdE4e7e4d34aBceD79c1e7eD9D", + "0xEB69636054cfEFc5A54490c800E9ECfe3f9DF898" + ] + ], + [ + false, + "0x852a89c094", + false, + "0xb21d045becf473d467f22c9a8758ada41ca82290b26329aaeefe57ce" + ], + "795039194579847259850917773229897630644160991993442051064403825866683146", + "167584524349078587361670595" + ] + ], + [ + "0x38A0def46C720b68f746B7c4e7d36BAd2d97BaBf", + "-571377777619362448405324", + [ + "Moo é🚀o", + [ + [ + "0xc970B10C2D75Fb18b349A48CCC3a40A7054b413b", + "0xD752358f34733c7B679d3edBb61DA3430f24a057", + "0xF139768178070f7F95E5C90898Bba3a1152a848A" + ] + ], + [ + false, + "0x88a7eeff6e", + true, + "0x6692b9ded3351da70590efd6e126d11e54f895ea894498c3c0b102c6" + ], + "265316384866407637405333897426040408612786893731115282179285144603292617", + "26776131584309205161772383" + ] + ] + ], + [ + [ + "0x6A22c415a20E4842b9A0f2244860401C384F4526", + "377198327110170995321985", + [ + "Moo é🚀🚀oéoo🚀ooMM🚀 M🚀oM🚀oMé🚀🚀 éMooMé 🚀🚀🚀Mooé", + [ + [ + "0x4b0a7A830EF062cb70A07183b95d0573ACFF908d", + "0xAb4269215db5825eBc8fFbB51BF8C7d635976cba", + "0x9493F94df0172Cb57f2a743425bAAA61d2E36D5C" + ] + ], + [ + true, + "0x7f60ddd631", + true, + "0xaa7fb16a4c2d9e8a93a2809e83e661ea2d90e92ee4dadd80f2cf1f27" + ], + "421122003415530036370691533604691027973883054084228617991336821478546513", + "67592121420163781572907310" + ] + ], + [ + "0x539225fC1b1feEd47a887b7F28bbC39B00f681f3", + "325400860414691026941500", + [ + "Moo é🚀éMMMM", + [ + [ + "0xdFb2b5C84dD8cf1BB9b285359F95361443af7BFA", + "0xD258E63182CFF58744DE38c18442d65D8454d47c", + "0x2bD9124A4a497F9203c535Dae11ab8B73793a50C" + ] + ], + [ + false, + "0xf6487e5b08", + false, + "0xde1f0f573dad198c53280b8b3c60a60927611e96ea2e9034bb05d818" + ], + "654848288828254932964363218520914018951639448609035557111564712228759821", + "56131956284168133665082115" + ] + ], + [ + "0xCE191FF0e845C96033b9A1a641c0Db8a5E5cF164", + "-579263166506302098927964", + [ + "Moo é🚀Mo🚀oo 🚀🚀 é o🚀 oé🚀éoo é🚀🚀🚀oMé 🚀Mo 🚀é Mé🚀 oéoéMM🚀MM🚀 MMMé", + [ + [ + "0xB24E74D85c799edab28711e7baEd44A9b479B2A2", + "0x79E0024b4E63751f64B86778A8c3aba9a2e818b6", + "0x62Ab7aC1AeD57C29796C1376b8B3b836d78A07D5" + ] + ], + [ + true, + "0x70be09c29c", + false, + "0xd9d8222df6b73dab031a36de7b577b8d6e0119c7984b8e704592c632" + ], + "339979713229544680630608818877017593993309940551175945598554611544677637", + "75947959788314645638720418" + ] + ], + [ + "0x3AC86AfC57D1782d32Ec61A2A7bcD5779Cb694E0", + "-142181656589653134506668", + [ + "Moo é🚀éoooMo🚀MMMoMMMMééMMoMo🚀éM", + [ + [ + "0x1FE6519189F2123e53fB123029dFbe1fAA3d53A8", + "0x9B9e5dB619a9B045E3a515415144EA2365f3709f", + "0x04759E42c9371b5BfbE6d0ac39b3087DcCfa40c9" + ] + ], + [ + false, + "0xee9cec350a", + false, + "0x4a75ff596e91fc5743735c5abc6d63f173a28e8a02c64d0783b123a0" + ], + "551128815124698752723409326612528100683782846558464748832208201796375295", + "95150692173394116586863979" + ] + ] + ], + [ + [ + "0x030573313f5577C816A48612D61e64Af101f297A", + "439680220069889117273100", + [ + "Moo é🚀o oM ooM 🚀🚀 M🚀M ooM🚀🚀éoMéoéM🚀o", + [ + [ + "0x3BE9e18DD4b0e421af2dDef85b25eE5E26026433", + "0x55b698d4Ea077625463e30D16690AB02bCFD85b1", + "0x6561a1e5e70Ec491c65018B255354701A3284F3a" + ] + ], + [ + false, + "0x55bf2a1829", + false, + "0x0db469339f168c06d384d0f72bee3ebc4421186ada40d85a4b040798" + ], + "153538234430212797863930183779204420626295318668450215694804729607097992", + "182728775794337843018604238" + ] + ], + [ + "0x08dFaA7fdA0402a3970A052222b30D27000E70AC", + "445650647259072783925180", + [ + "Moo é🚀", + [ + [ + "0x3500f521Ae038594932F058606d5a7a33D079ABB", + "0x9927225F4FB72e319535F65eC05b6bC350aB4cfD", + "0x7cF21513497E8364237214B81336dEe3123C6181" + ] + ], + [ + true, + "0x1afc93828b", + false, + "0x4da909d70b05044a5653cb97b58ff15506fc6a0be68801c29cdbb232" + ], + "1215939105339581641879978693481822744304929761923021186061041665205879522", + "210046568862336085767248583" + ] + ], + [ + "0x4643D27B1eE2a853BD499C83f292444B379eb726", + "156322560523113864827463", + [ + "Moo é🚀 o MoMoéoo🚀éoé é é ooo🚀 🚀M🚀é", + [ + [ + "0x195c04C57b529Bd31FDaf043da8AFbEb77840D5A", + "0xAbC28aef7953cb91C54801e5Cb40358819776BEa", + "0x780f327993C8396A91b259251207EC7eFDB5AfBA" + ] + ], + [ + false, + "0x6ff5946d79", + false, + "0x65f1230ab880ca3722c79c3a6dd87540be344da93f527316e541008a" + ], + "1551278232610995841306329861014276702152899602279337454019598562446887001", + "78720716921216444131233280" + ] + ], + [ + "0xc92A68aBf4fd45B8F7de18bD8cB2fA959e473C07", + "172038106178585222449582", + [ + "Moo é🚀o 🚀oM 🚀🚀MMéééM🚀éMoM🚀oo", + [ + [ + "0xa7C37FEbfBa5DA50d7330fc88a0292E3b7511fF6", + "0x5c8C7eFE2642658235c996A3691b52781670741F", + "0x6D364AF9c7abDDC0b91F4131a0289C9fD35a02b3" + ] + ], + [ + true, + "0x4f9ffc5366", + false, + "0x2845fff610f25fad7d5ef76d3e3141c2be16b5280d5ea7992c8dafd8" + ], + "474722090577515673307964402621661487521855441300047619523278325550952753", + "89029201664642928626205282" + ] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xfe885b3641f37aBccC8b5B6D8C6a7dF555210767" + }, + { + "type": "number", + "value": "-371954046979619113350646" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooM🚀é🚀 oooMéé🚀é 🚀🚀 MMMéooo oMo🚀é" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xbBF282f8688338465A94AC8599E02386b5cd22F2" + }, + { + "type": "address", + "value": "0xDdF736BE8709AC99860430A984e96C6F8b391099" + }, + { + "type": "address", + "value": "0xE7C38A0984540225CBf85498DB586c270A389EC7" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x77fa16afdd" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x77f74f709eedb466b62cee3c0acaf238d221322940dd21c5e68c43cf" + } + ] + }, + { + "type": "number", + "value": "1726008546681151260551673598736135016501958094094443998590598452689683472" + }, + { + "type": "number", + "value": "10164057757303282681551155" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x222F1924FEbd6b9A69733904ded8720404ef905f" + }, + { + "type": "number", + "value": "317868839210587068255486" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMoé🚀🚀🚀oooM🚀" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xc0c95c9448bEAFA3596Ba222d777c3cDBAfB94AA" + }, + { + "type": "address", + "value": "0xE239A942223A91CfA1f78670189FDFe6AE1Cd5fD" + }, + { + "type": "address", + "value": "0x03b94B43284465fc157f981e2A6bEb912ff4740B" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x1fb2e65d72" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x2bef0993e4b24a68b622b3d43d28857492be91a46f50b55cde50d593" + } + ] + }, + { + "type": "number", + "value": "361129914365884532405488894426208442412880084923785456935277568178346674" + }, + { + "type": "number", + "value": "272453771477002621586759820" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x07592a1445307fcCA87b0ECB13fc26D016090f17" + }, + { + "type": "number", + "value": "-573345633070781755699460" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éo🚀ooMéoM🚀oM Moé o🚀Mé 🚀ooé🚀Moooo" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x74CeFAEF109F3b0FbcD654086ed14afF1c2d4aCB" + }, + { + "type": "address", + "value": "0xE996Aaf96C73c17114D9b3B96F0020B7FaF66665" + }, + { + "type": "address", + "value": "0xFE044366F8D27ea8951F589bF3f098de555712E7" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xd98b533a04" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x7361f5713429ee5b3c5aa0f95a51f20362d03de73af5d24fdd1ba3a9" + } + ] + }, + { + "type": "number", + "value": "113175224569512132013602103585824308313673745181417885159929491955838294" + }, + { + "type": "number", + "value": "228042630791797743924668015" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdEd3728DE4B0b5EF2e877365aB81522f4be28d0E" + }, + { + "type": "number", + "value": "78552340874942351714788" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oé 🚀🚀oééoooMéoé🚀 é🚀oéo🚀" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x27D6FeA2a818863362dC1CB5704448D02f04A776" + }, + { + "type": "address", + "value": "0xa516255263F68dc224e67E5D3750Ab8C4DF974f4" + }, + { + "type": "address", + "value": "0xAaA49B36544055460f23B02B2241c0Eb6E1D2135" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x6181aee8fd" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x5bca6ff666305ba99db6c0a4c94ca9c20bdd4c1b726d9fc5abe07838" + } + ] + }, + { + "type": "number", + "value": "757119636008924985821085062009745352205806977222282372812821415663386768" + }, + { + "type": "number", + "value": "142356003821432769055146607" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x50A1bD48978827275f23797f3CA96897ffA8ED76" + }, + { + "type": "number", + "value": "412470653691313394787764" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoMMéo🚀 MMoééMM éo 🚀oéo🚀🚀 M" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2225F93CFA3ff596CfB3205ebf32570ee5CFCE26" + }, + { + "type": "address", + "value": "0x850E5bC3309820A886aA850a4ee9586f6B095F8e" + }, + { + "type": "address", + "value": "0x8d97a2ab51CCB4Bc4FCBb5273a7E0bb7FA4B17bc" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x7bd96891eb" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xca861b294f1d32a2806431f122a97875f12176f30437df73046fad89" + } + ] + }, + { + "type": "number", + "value": "499852171895052400262391608960276181971313109864263121723067631577566061" + }, + { + "type": "number", + "value": "298830116619038927014612371" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x00541Afc9D96642D0221F314859e27e98FeD271F" + }, + { + "type": "number", + "value": "-487575037523970649496700" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x91b965e04AF757186C2e753709ac29A352F01333" + }, + { + "type": "address", + "value": "0xbDE131e4171c055e6e6251FFEC1F9C3d308f812c" + }, + { + "type": "address", + "value": "0x5DD1693Be9bE0115a90B75B64D928E352853C472" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x34d17ee2b8" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x25f9af3d7cf62f47d42c83c8f2aa9e4aa0ff6d9a8068533e7fdc0b8f" + } + ] + }, + { + "type": "number", + "value": "452851383571058179006716562279806002331361802630414285486007432088225249" + }, + { + "type": "number", + "value": "51270756966335915626570875" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x3A10d67f1060852d0b34fb0561bB419649Ed91Ea" + }, + { + "type": "number", + "value": "600129248375862126655075" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀 Mooéé🚀🚀🚀éooéo🚀oéo 🚀 Mo o 🚀é 🚀MooMé é🚀MMoo" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xb97cF4099ceE515bF91Dede77BF18be293719Df5" + }, + { + "type": "address", + "value": "0x95faB6D50E7c8abdE4e7e4d34aBceD79c1e7eD9D" + }, + { + "type": "address", + "value": "0xEB69636054cfEFc5A54490c800E9ECfe3f9DF898" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x852a89c094" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xb21d045becf473d467f22c9a8758ada41ca82290b26329aaeefe57ce" + } + ] + }, + { + "type": "number", + "value": "795039194579847259850917773229897630644160991993442051064403825866683146" + }, + { + "type": "number", + "value": "167584524349078587361670595" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x38A0def46C720b68f746B7c4e7d36BAd2d97BaBf" + }, + { + "type": "number", + "value": "-571377777619362448405324" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xc970B10C2D75Fb18b349A48CCC3a40A7054b413b" + }, + { + "type": "address", + "value": "0xD752358f34733c7B679d3edBb61DA3430f24a057" + }, + { + "type": "address", + "value": "0xF139768178070f7F95E5C90898Bba3a1152a848A" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x88a7eeff6e" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x6692b9ded3351da70590efd6e126d11e54f895ea894498c3c0b102c6" + } + ] + }, + { + "type": "number", + "value": "265316384866407637405333897426040408612786893731115282179285144603292617" + }, + { + "type": "number", + "value": "26776131584309205161772383" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6A22c415a20E4842b9A0f2244860401C384F4526" + }, + { + "type": "number", + "value": "377198327110170995321985" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oéoo🚀ooMM🚀 M🚀oM🚀oMé🚀🚀 éMooMé 🚀🚀🚀Mooé" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4b0a7A830EF062cb70A07183b95d0573ACFF908d" + }, + { + "type": "address", + "value": "0xAb4269215db5825eBc8fFbB51BF8C7d635976cba" + }, + { + "type": "address", + "value": "0x9493F94df0172Cb57f2a743425bAAA61d2E36D5C" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x7f60ddd631" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xaa7fb16a4c2d9e8a93a2809e83e661ea2d90e92ee4dadd80f2cf1f27" + } + ] + }, + { + "type": "number", + "value": "421122003415530036370691533604691027973883054084228617991336821478546513" + }, + { + "type": "number", + "value": "67592121420163781572907310" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x539225fC1b1feEd47a887b7F28bbC39B00f681f3" + }, + { + "type": "number", + "value": "325400860414691026941500" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMMMM" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xdFb2b5C84dD8cf1BB9b285359F95361443af7BFA" + }, + { + "type": "address", + "value": "0xD258E63182CFF58744DE38c18442d65D8454d47c" + }, + { + "type": "address", + "value": "0x2bD9124A4a497F9203c535Dae11ab8B73793a50C" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xf6487e5b08" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xde1f0f573dad198c53280b8b3c60a60927611e96ea2e9034bb05d818" + } + ] + }, + { + "type": "number", + "value": "654848288828254932964363218520914018951639448609035557111564712228759821" + }, + { + "type": "number", + "value": "56131956284168133665082115" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xCE191FF0e845C96033b9A1a641c0Db8a5E5cF164" + }, + { + "type": "number", + "value": "-579263166506302098927964" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mo🚀oo 🚀🚀 é o🚀 oé🚀éoo é🚀🚀🚀oMé 🚀Mo 🚀é Mé🚀 oéoéMM🚀MM🚀 MMMé" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB24E74D85c799edab28711e7baEd44A9b479B2A2" + }, + { + "type": "address", + "value": "0x79E0024b4E63751f64B86778A8c3aba9a2e818b6" + }, + { + "type": "address", + "value": "0x62Ab7aC1AeD57C29796C1376b8B3b836d78A07D5" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x70be09c29c" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xd9d8222df6b73dab031a36de7b577b8d6e0119c7984b8e704592c632" + } + ] + }, + { + "type": "number", + "value": "339979713229544680630608818877017593993309940551175945598554611544677637" + }, + { + "type": "number", + "value": "75947959788314645638720418" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x3AC86AfC57D1782d32Ec61A2A7bcD5779Cb694E0" + }, + { + "type": "number", + "value": "-142181656589653134506668" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoooMo🚀MMMoMMMMééMMoMo🚀éM" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1FE6519189F2123e53fB123029dFbe1fAA3d53A8" + }, + { + "type": "address", + "value": "0x9B9e5dB619a9B045E3a515415144EA2365f3709f" + }, + { + "type": "address", + "value": "0x04759E42c9371b5BfbE6d0ac39b3087DcCfa40c9" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xee9cec350a" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x4a75ff596e91fc5743735c5abc6d63f173a28e8a02c64d0783b123a0" + } + ] + }, + { + "type": "number", + "value": "551128815124698752723409326612528100683782846558464748832208201796375295" + }, + { + "type": "number", + "value": "95150692173394116586863979" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x030573313f5577C816A48612D61e64Af101f297A" + }, + { + "type": "number", + "value": "439680220069889117273100" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oM ooM 🚀🚀 M🚀M ooM🚀🚀éoMéoéM🚀o" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3BE9e18DD4b0e421af2dDef85b25eE5E26026433" + }, + { + "type": "address", + "value": "0x55b698d4Ea077625463e30D16690AB02bCFD85b1" + }, + { + "type": "address", + "value": "0x6561a1e5e70Ec491c65018B255354701A3284F3a" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x55bf2a1829" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x0db469339f168c06d384d0f72bee3ebc4421186ada40d85a4b040798" + } + ] + }, + { + "type": "number", + "value": "153538234430212797863930183779204420626295318668450215694804729607097992" + }, + { + "type": "number", + "value": "182728775794337843018604238" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x08dFaA7fdA0402a3970A052222b30D27000E70AC" + }, + { + "type": "number", + "value": "445650647259072783925180" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3500f521Ae038594932F058606d5a7a33D079ABB" + }, + { + "type": "address", + "value": "0x9927225F4FB72e319535F65eC05b6bC350aB4cfD" + }, + { + "type": "address", + "value": "0x7cF21513497E8364237214B81336dEe3123C6181" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x1afc93828b" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x4da909d70b05044a5653cb97b58ff15506fc6a0be68801c29cdbb232" + } + ] + }, + { + "type": "number", + "value": "1215939105339581641879978693481822744304929761923021186061041665205879522" + }, + { + "type": "number", + "value": "210046568862336085767248583" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4643D27B1eE2a853BD499C83f292444B379eb726" + }, + { + "type": "number", + "value": "156322560523113864827463" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o MoMoéoo🚀éoé é é ooo🚀 🚀M🚀é" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x195c04C57b529Bd31FDaf043da8AFbEb77840D5A" + }, + { + "type": "address", + "value": "0xAbC28aef7953cb91C54801e5Cb40358819776BEa" + }, + { + "type": "address", + "value": "0x780f327993C8396A91b259251207EC7eFDB5AfBA" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x6ff5946d79" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x65f1230ab880ca3722c79c3a6dd87540be344da93f527316e541008a" + } + ] + }, + { + "type": "number", + "value": "1551278232610995841306329861014276702152899602279337454019598562446887001" + }, + { + "type": "number", + "value": "78720716921216444131233280" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xc92A68aBf4fd45B8F7de18bD8cB2fA959e473C07" + }, + { + "type": "number", + "value": "172038106178585222449582" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀oM 🚀🚀MMéééM🚀éMoM🚀oo" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xa7C37FEbfBa5DA50d7330fc88a0292E3b7511fF6" + }, + { + "type": "address", + "value": "0x5c8C7eFE2642658235c996A3691b52781670741F" + }, + { + "type": "address", + "value": "0x6D364AF9c7abDDC0b91F4131a0289C9fD35a02b3" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x4f9ffc5366" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x2845fff610f25fad7d5ef76d3e3141c2be16b5280d5ea7992c8dafd8" + } + ] + }, + { + "type": "number", + "value": "474722090577515673307964402621661487521855441300047619523278325550952753" + }, + { + "type": "number", + "value": "89029201664642928626205282" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611be5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190611739565b60405180910390f35b6100566115ad565b61005e6115ad565b6100666115da565b61006e611607565b73fe885b3641f37abccc8b5b6d8c6a7df5552107678152694ec3ab5696f6617735f519602082015261009e61162b565b6000604051806080016040528060428152602001611a0d604291398252506100c4611666565b6100cc611693565b73bbf282f8688338465a94ac8599e02386b5cd22f2815273ddf736be8709ac99860430a984e96c6f8b39109960208083019190915273e7c38a0984540225cbf85498db586c270a389ec760408301529082528201526101296116b1565b600081526477fa16afdd60d81b602082015260016040808301919091527f77f74f709eedb466b62cee3c0acaf238d221322940dd21c5e68c43cf00000000606080840191909152838201929092527dfa153715b3922c53c3e2a7598a2496cb4427c3ba6017de66d13c7e2ec410918301919091526a086852acd27d5ded3c9933608083015282015281526101bb611607565b73222f1924febd6b9a69733904ded8720404ef905f815269434fb44d20bd61234cfe60208201526101ea61162b565b600060405180606001604052806023815260200161197760239139825250610210611666565b610218611693565b73c0c95c9448beafa3596ba222d777c3cdbafb94aa815273e239a942223a91cfa1f78670189fdfe6ae1cd5fd6020808301919091527303b94b43284465fc157f981e2a6beb912ff4740b60408301529082528201526102756116b1565b6000808252640fd9732eb960d91b60208301526040808301919091527f2bef0993e4b24a68b622b3d43d28857492be91a46f50b55cde50d59300000000606080840191909152838201929092527d34530d911f28950da7e1a7006e9078092281217591a7102c6d739f695ab2918301919091526ae15e548bff220a8be7e08c60808301528201528082600160200201525061030e611607565b7307592a1445307fcca87b0ecb13fc26d016090f17815269796921094a857a1e310319602082015261033e61162b565b60006040518060600160405280603e8152602001611a4f603e9139825250610364611666565b61036c611693565b7374cefaef109f3b0fbcd654086ed14aff1c2d4acb815273e996aaf96c73c17114d9b3b96f0020b7faf6666560208083019190915273fe044366f8d27ea8951f589bf3f098de555712e760408301529082528201526103c96116b1565b60018152643662d4ce8160da1b602082015260006040808301919091527f7361f5713429ee5b3c5aa0f95a51f20362d03de73af5d24fdd1ba3a900000000606080840191909152838201929092527d1065e7031524dae7571a7a7e286b74198f16cf022e02f801e1f61976ed56918301919091526abca1e7c943ac1236ede66f608083015282810191909152820152610460611607565b73ded3728de4b0b5ef2e877365ab81522f4be28d0e81526910a254b7ed9f0014a9e4602082015261048f61162b565b6000604051806060016040528060378152602001611940603791398252506104b5611666565b6104bd611693565b7327d6fea2a818863362dc1cb5704448d02f04a776815273a516255263f68dc224e67e5d3750ab8c4df974f460208083019190915273aaa49b36544055460f23b02b2241c0eb6e1d2135604083015290825282015261051a6116b1565b60018152646181aee8fd60d81b602082015260006040808301919091527f5bca6ff666305ba99db6c0a4c94ca9c20bdd4c1b726d9fc5abe0783800000000606080840191909152838201929092527d6db320cb9d387e6ce3608cba557adf2847267593adf231d0eb5662024090838301526a75c10e6e33c7d43111c26f608084015283019190915282015281526105af6115da565b6105b7611607565b7350a1bd48978827275f23797f3ca96897ffa8ed76815269575814357910dabfa5b460208201526105e661162b565b6000604051806060016040528060388152602001611adf6038913982525061060c611666565b610614611693565b732225f93cfa3ff596cfb3205ebf32570ee5cfce26815273850e5bc3309820a886aa850a4ee9586f6b095f8e602080830191909152738d97a2ab51ccb4bc4fcbb5273a7e0bb7fa4b17bc60408301529082528201526106716116b1565b6001808252647bd96891eb60d81b60208301526040808301919091527fca861b294f1d32a2806431f122a97875f12176f30437df73046fad8900000000606080840191909152838201929092527d486c8c293d7f9b9998bada26823adb5c84d070cb5fa57048e1f44d678b6d918301919091526af72fbd1506022ce0e84d9360808301528201528152610702611607565b72541afc9d96642d0221f314859e27e98fed271f815269673f7ee940c9b91c1c7b19602082015261073161162b565b60408051808201909152600a8152689adede418753e13f3560b71b6020820152815261075b611666565b610763611693565b7391b965e04af757186c2e753709ac29a352f01333815273bde131e4171c055e6e6251ffec1f9c3d308f812c602080830191909152735dd1693be9be0115a90b75b64d928e352853c47260408301529082528201526107c06116b1565b6001815264069a2fdc5760db1b60208083019190915260006040808401919091527f25f9af3d7cf62f47d42c83c8f2aa9e4aa0ff6d9a8068533e7fdc0b8f00000000606080850191909152848201939093527d419d30fdd0533a4157fc08d7f70812e79c41e443cd42b52fa729e2e585e1928401929092526a2a69014decc1f76bafa47b60808401529083019190915282015261085b611607565b733a10d67f1060852d0b34fb0561bb419649ed91ea8152697f15125dc0d0f93b3663602082015261088a61162b565b60006040518060800160405280605a81526020016118a7605a91398252506108b0611666565b6108b8611693565b73b97cf4099cee515bf91dede77bf18be293719df581527395fab6d50e7c8abde4e7e4d34abced79c1e7ed9d60208083019190915273eb69636054cfefc5a54490c800e9ecfe3f9df89860408301529082528201526109156116b1565b600080825264214aa2702560da1b60208301526040808301919091527fb21d045becf473d467f22c9a8758ada41ca82290b26329aaeefe57ce00000000606080840191909152838201929092527d7331a4885ce1724d6312d79093e2c80015f2a4384acf342ee1508d21b30a918301919091526a8a9f6744ca3f42b31335c36080830152828101919091528201526109ab611607565b7338a0def46c720b68f746b7c4e7d36bad2d97babf81526978fe738e4f99be57f34b1960208201526109db61162b565b60408051808201909152600b81526a4d6f6f20c3a9f09f9a806f60a81b60208201528152610a07611666565b610a0f611693565b73c970b10c2d75fb18b349a48ccc3a40a7054b413b815273d752358f34733c7b679d3edbb61da3430f24a05760208083019190915273f139768178070f7f95e5c90898bba3a1152a848a6040830152908252820152610a6c6116b1565b60008152644453f77fb760d91b60208083019190915260016040808401919091527f6692b9ded3351da70590efd6e126d11e54f895ea894498c3c0b102c600000000606080850191909152848201939093527d267121b4e10ddbb391e1d1f6bc6be92602e23af63a948cc9ee4d869d73c9848401526a1626110070effc2bd4855f6080850152840192909252830191909152820152610b096115da565b610b11611607565b736a22c415a20e4842b9a0f2244860401c384f45268152694fdff658584ff98fec816020820152610b4061162b565b6000604051806080016040528060528152602001611a8d60529139825250610b66611666565b610b6e611693565b734b0a7a830ef062cb70a07183b95d0573acff908d815273ab4269215db5825ebc8ffbb51bf8c7d635976cba602080830191909152739493f94df0172cb57f2a743425baaa61d2e36d5c6040830152908252820152610bcb6116b1565b6001808252647f60ddd63160d81b60208301526040808301919091527faa7fb16a4c2d9e8a93a2809e83e661ea2d90e92ee4dadd80f2cf1f2700000000606080840191909152838201929092527d3d0448833dd562543d7e28898b07f9e4e1028687dc3581794bcd73825c51918301919091526a37e9303e8c8f69c767512e60808301528201528152610c5c611607565b73539225fc1b1feed47a887b7f28bbc39b00f681f381526944e80417e3837f90363c6020820152610c8b61162b565b60408051808201909152601081526f4d6f6f20c3a9f09f9a80c3a94d4d4d4d60801b60208201528152610cbc611666565b610cc4611693565b73dfb2b5c84dd8cf1bb9b285359f95361443af7bfa815273d258e63182cff58744de38c18442d65d8454d47c602080830191909152732bd9124a4a497f9203c535dae11ab8b73793a50c6040830152908252820152610d216116b1565b6000808252641ec90fcb6160db1b60208301526040808301919091527fde1f0f573dad198c53280b8b3c60a60927611e96ea2e9034bb05d81800000000606080840191909152838201929092527d5ee1ac4a2df2132c171c7ecb1e16068ea37abea60e34230800522751290d918301919091526a2e6e67728c988ab4e7cb03608083015282015280826001602002015250610dba611607565b73ce191ff0e845c96033b9a1a641c0db8a5e5cf1648152697aa9eb4f45b0f914715b196020820152610dea61162b565b60006040518060a001604052806073815260200161199a60739139825250610e10611666565b610e18611693565b73b24e74d85c799edab28711e7baed44a9b479b2a281527379e0024b4e63751f64b86778a8c3aba9a2e818b66020808301919091527362ab7ac1aed57c29796c1376b8b3b836d78a07d56040830152908252820152610e756116b1565b60018152641c2f8270a760da1b602082015260006040808301919091527fd9d8222df6b73dab031a36de7b577b8d6e0119c7984b8e704592c63200000000606080840191909152838201929092527d31428c662f07d72505957e96792c27a8ead8585110681fd17ce2364edd05918301919091526a3ed29b2660ef931d04aba2608083015282810191909152820152610f0c611607565b733ac86afc57d1782d32ec61a2a7bcd5779cb694e08152691e1baedc3d9664bb7aab196020820152610f3c61162b565b60006040518060600160405280602d8152602001611b83602d9139825250610f62611666565b610f6a611693565b731fe6519189f2123e53fb123029dfbe1faa3d53a88152739b9e5db619a9b045e3a515415144ea2365f3709f6020808301919091527304759e42c9371b5bfbe6d0ac39b3087dccfa40c96040830152908252820152610fc76116b1565b600080825264774e761a8560d91b60208301526040808301919091527f4a75ff596e91fc5743735c5abc6d63f173a28e8a02c64d0783b123a000000000606080840191909152838201929092527d4fda81002b0d07d3ed3c15ce75d89171783c7bc63970f51edb3cff6d52ff838301526a4eb4f15bbfc0c7705d7d6b6080840152838101929092528301919091528201526110606115da565b611068611607565b73030573313f5577c816a48612d61e64af101f297a8152695d1b1ccc23eb54983c0c602082015261109761162b565b60006040518060600160405280603f8152602001611901603f91398252506110bd611666565b6110c5611693565b733be9e18dd4b0e421af2ddef85b25ee5e2602643381527355b698d4ea077625463e30d16690ab02bcfd85b1602080830191909152736561a1e5e70ec491c65018b255354701a3284f3a60408301529082528201526111226116b1565b60008082526455bf2a182960d81b60208301526040808301919091527f0db469339f168c06d384d0f72bee3ebc4421186ada40d85a4b04079800000000606080840191909152838201929092527d163f0cb4e38104e40ba5882a458e9b7b6fb7d8b35cf4a32337475eba0e88918301919091526a972652c8db039091821ece608083015282015281526111b3611607565b7308dfaa7fda0402a3970a052222b30d27000e70ac8152695e5ec51e7bcd86f73fbc60208201526111e261162b565b60408051808201909152600a8152689adede418753e13f3560b71b6020820152815261120c611666565b611214611693565b733500f521ae038594932f058606d5a7a33d079abb8152739927225f4fb72e319535f65ec05b6bc350ab4cfd602080830191909152737cf21513497e8364237214b81336dee3123c618160408301529082528201526112716116b1565b60018152641afc93828b60d81b60208083019190915260006040808401919091527f4da909d70b05044a5653cb97b58ff15506fc6a0be68801c29cdbb23200000000606080850191909152848201939093527db02db02643b3d51ef0fe6151a433b0bb7857c02e13d97f76f31877e042e2928401929092526aadbf17506e55315dc85ac760808401529083019190915282015261130c611607565b734643d27b1ee2a853bd499c83f292444b379eb726815269211a4353135997971247602082015261133b61162b565b6000604051806060016040528060398152602001611b1760399139825250611361611666565b611369611693565b73195c04c57b529bd31fdaf043da8afbeb77840d5a815273abc28aef7953cb91c54801e5cb40358819776bea60208083019190915273780f327993c8396a91b259251207ec7efdb5afba60408301529082528201526113c66116b1565b6000808252646ff5946d7960d81b60208301526040808301919091527f65f1230ab880ca3722c79c3a6dd87540be344da93f527316e541008a00000000606080840191909152838201929092527de0c41b8cdf2a6bff5fa391c18ca67f7829dffc981e66817ade819bb94859918301919091526a411dc29d82fcdafd60ce0060808301528281019190915282015261145c611607565b73c92a68abf4fd45b8f7de18bd8cb2fa959e473c07815269246e34551878c34809ae602082015261148b61162b565b6000604051806060016040528060338152602001611b50603391398252506114b1611666565b6114b9611693565b73a7c37febfba5da50d7330fc88a0292e3b7511ff68152735c8c7efe2642658235c996a3691b52781670741f602080830191909152736d364af9c7abddc0b91f4131a0289c9fd35a02b360408301529082528201526115166116b1565b600181526427cffe29b360d91b602082015260006040808301919091527f2845fff610f25fad7d5ef76d3e3141c2be16b5280d5ea7992c8dafd800000000606080840191909152838201929092527d44c86bc58034c185c7658484d58d62bef58453ae950663deeea10b4c3131838301526a49a4aab166aa4e7de18262608084015283019190915282810191909152820152919050565b60405180608001604052806004905b6115c46115da565b8152602001906001900390816115bc5790505090565b60405180608001604052806004905b6115f1611607565b8152602001906001900390816115e95790505090565b604080516060810182526000808252602082015290810161162661162b565b905290565b6040518060a0016040528060608152602001611645611666565b81526020016116526116b1565b815260006020820181905260409091015290565b60405180602001604052806001905b61167d611693565b8152602001906001900390816116755790505090565b60405180606001604052806003906020820280368337509192915050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b806000805b60018082106116ec5750611732565b835186845b60038110156117185782516001600160a01b031682526020928301929091019083016116f1565b5050506060959095019450602092909201916001016116dd565b5050505050565b602080825260009060a0830183820185845b600481101561189a57601f19878503810184528251856080810160005b60048110156118845788820383528351606060018060a01b0382511684528b82015160090b8c850152604080830151925081818601528251610140838701528051806101a088015260005b818110156117d3578f81840101516101c0828a0101528f810190506117b3565b818111156117e65760006101c0838a0101525b508e85015191506117fa60808801836116d8565b918401518051151560e088015260208101516001600160d81b031916610100880152604081015115156101208801526060015163ffffffff191661014087015250908201516001600160f01b03166101608501526080909101516affffffffffffffffffffff16610180840152938a0193928a0192601f0185169091016101c00190600101611768565b509650505092850192509084019060010161174b565b5091969550505050505056fe4d6f6f20c3a9f09f9a806ff09f9a8020204d6f6fc3a9c3a9f09f9a80f09f9a80f09f9a80c3a96f6fc3a96ff09f9a806fc3a96f20f09f9a80204d6f206f20f09f9a80c3a920f09f9a804d6f6f4dc3a920c3a9f09f9a804d4d6f6f4d6f6f20c3a9f09f9a806f206f4d206f6f4d202020f09f9a80f09f9a80204df09f9a804d206f6f4df09f9a80f09f9a80c3a96f4dc3a96fc3a94df09f9a806f4d6f6f20c3a9f09f9a806fc3a920f09f9a80f09f9a806fc3a9c3a96f6f6f4dc3a96fc3a9f09f9a8020c3a9f09f9a806fc3a96ff09f9a804d6f6f20c3a9f09f9a806f4d6fc3a9f09f9a80f09f9a80f09f9a806f6f6f4df09f9a804d6f6f20c3a9f09f9a804d6ff09f9a806f6f20f09f9a80f09f9a8020c3a920206ff09f9a80206fc3a9f09f9a80c3a96f6f20c3a9f09f9a80f09f9a80f09f9a806f4dc3a920f09f9a804d6f20f09f9a80c3a9204dc3a9f09f9a80206fc3a96fc3a94d4df09f9a804d4df09f9a80204d4d4dc3a94d6f6f20c3a9f09f9a806f6f4df09f9a80c3a9f09f9a80206f6f6f4dc3a9c3a9f09f9a80c3a920f09f9a80f09f9a80204d4d4dc3a96f6f6f206f4d6ff09f9a80c3a94d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f4dc3a96f4df09f9a806f4d204d6fc3a9206ff09f9a804dc3a920f09f9a806f6fc3a9f09f9a804d6f6f6f6f4d6f6f20c3a9f09f9a80f09f9a806fc3a96f6ff09f9a806f6f4d4df09f9a80204df09f9a806f4df09f9a806f4dc3a9f09f9a80f09f9a8020c3a94d6f6f4dc3a920f09f9a80f09f9a80f09f9a804d6f6fc3a94d6f6f20c3a9f09f9a80c3a96f4d4dc3a96ff09f9a80204d4d6fc3a9c3a94d4d20c3a96f20f09f9a806fc3a96ff09f9a80f09f9a8020204d4d6f6f20c3a9f09f9a80206f204d6f4d6fc3a96f6ff09f9a80c3a96fc3a920c3a92020c3a9206f6f6ff09f9a8020f09f9a804df09f9a80c3a94d6f6f20c3a9f09f9a806f20f09f9a806f4d20f09f9a80f09f9a804d4dc3a9c3a9c3a94df09f9a80c3a94d6f4df09f9a806f6f4d6f6f20c3a9f09f9a80c3a96f6f6f4d6ff09f9a804d4d4d6f4d4d4d4dc3a9c3a94d4d6f4d6ff09f9a80c3a94da2646970667358221220742beb672a8daf4be548c1d57d5607176146e20933fa2b57ce4f28fedeb6c56d64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_2eddd6ac {\n bool s_0;\n bytes5 s_1;\n bool s_2;\n bytes28 s_3;\n }\n\n struct S_09bc5ab4 {\n string s_0;\n address[3][1] s_1;\n S_2eddd6ac s_2;\n uint240 s_3;\n uint88 s_4;\n }\n\n struct S_a03de45e {\n address s_0;\n int80 s_1;\n S_09bc5ab4 s_2;\n }\n\n function test () public pure returns (S_a03de45e[4][4] memory) {\n S_a03de45e[4][4] memory r;\n {\n S_a03de45e[4] memory r_0;\n {\n S_a03de45e memory r_0_0;\n {\n address r_0_0_0 = 0xfe885b3641f37aBccC8b5B6D8C6a7dF555210767;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n int80 r_0_0_1 = -371954046979619113350646;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n S_09bc5ab4 memory r_0_0_2;\n {\n string memory r_0_0_2_0 = unicode\"Moo é🚀ooM🚀é🚀 oooMéé🚀é 🚀🚀 MMMéooo oMo🚀é\";\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n address[3][1] memory r_0_0_2_1;\n {\n address[3] memory r_0_0_2_1_0;\n {\n address r_0_0_2_1_0_0 = 0xbBF282f8688338465A94AC8599E02386b5cd22F2;\n r_0_0_2_1_0[0] = r_0_0_2_1_0_0;\n }\n {\n address r_0_0_2_1_0_1 = 0xDdF736BE8709AC99860430A984e96C6F8b391099;\n r_0_0_2_1_0[1] = r_0_0_2_1_0_1;\n }\n {\n address r_0_0_2_1_0_2 = 0xE7C38A0984540225CBf85498DB586c270A389EC7;\n r_0_0_2_1_0[2] = r_0_0_2_1_0_2;\n }\n r_0_0_2_1[0] = r_0_0_2_1_0;\n }\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n {\n S_2eddd6ac memory r_0_0_2_2;\n {\n bool r_0_0_2_2_0 = false;\n r_0_0_2_2.s_0 = r_0_0_2_2_0;\n }\n {\n bytes5 r_0_0_2_2_1 = bytes5(0x77fa16afdd);\n r_0_0_2_2.s_1 = r_0_0_2_2_1;\n }\n {\n bool r_0_0_2_2_2 = true;\n r_0_0_2_2.s_2 = r_0_0_2_2_2;\n }\n {\n bytes28 r_0_0_2_2_3 = bytes28(0x77f74f709eedb466b62cee3c0acaf238d221322940dd21c5e68c43cf);\n r_0_0_2_2.s_3 = r_0_0_2_2_3;\n }\n r_0_0_2.s_2 = r_0_0_2_2;\n }\n {\n uint240 r_0_0_2_3 = 1726008546681151260551673598736135016501958094094443998590598452689683472;\n r_0_0_2.s_3 = r_0_0_2_3;\n }\n {\n uint88 r_0_0_2_4 = 10164057757303282681551155;\n r_0_0_2.s_4 = r_0_0_2_4;\n }\n r_0_0.s_2 = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n {\n S_a03de45e memory r_0_1;\n {\n address r_0_1_0 = 0x222F1924FEbd6b9A69733904ded8720404ef905f;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n int80 r_0_1_1 = 317868839210587068255486;\n r_0_1.s_1 = r_0_1_1;\n }\n {\n S_09bc5ab4 memory r_0_1_2;\n {\n string memory r_0_1_2_0 = unicode\"Moo é🚀oMoé🚀🚀🚀oooM🚀\";\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n address[3][1] memory r_0_1_2_1;\n {\n address[3] memory r_0_1_2_1_0;\n {\n address r_0_1_2_1_0_0 = 0xc0c95c9448bEAFA3596Ba222d777c3cDBAfB94AA;\n r_0_1_2_1_0[0] = r_0_1_2_1_0_0;\n }\n {\n address r_0_1_2_1_0_1 = 0xE239A942223A91CfA1f78670189FDFe6AE1Cd5fD;\n r_0_1_2_1_0[1] = r_0_1_2_1_0_1;\n }\n {\n address r_0_1_2_1_0_2 = 0x03b94B43284465fc157f981e2A6bEb912ff4740B;\n r_0_1_2_1_0[2] = r_0_1_2_1_0_2;\n }\n r_0_1_2_1[0] = r_0_1_2_1_0;\n }\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n S_2eddd6ac memory r_0_1_2_2;\n {\n bool r_0_1_2_2_0 = false;\n r_0_1_2_2.s_0 = r_0_1_2_2_0;\n }\n {\n bytes5 r_0_1_2_2_1 = bytes5(0x1fb2e65d72);\n r_0_1_2_2.s_1 = r_0_1_2_2_1;\n }\n {\n bool r_0_1_2_2_2 = false;\n r_0_1_2_2.s_2 = r_0_1_2_2_2;\n }\n {\n bytes28 r_0_1_2_2_3 = bytes28(0x2bef0993e4b24a68b622b3d43d28857492be91a46f50b55cde50d593);\n r_0_1_2_2.s_3 = r_0_1_2_2_3;\n }\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n {\n uint240 r_0_1_2_3 = 361129914365884532405488894426208442412880084923785456935277568178346674;\n r_0_1_2.s_3 = r_0_1_2_3;\n }\n {\n uint88 r_0_1_2_4 = 272453771477002621586759820;\n r_0_1_2.s_4 = r_0_1_2_4;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n r_0[1] = r_0_1;\n }\n {\n S_a03de45e memory r_0_2;\n {\n address r_0_2_0 = 0x07592a1445307fcCA87b0ECB13fc26D016090f17;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n int80 r_0_2_1 = -573345633070781755699460;\n r_0_2.s_1 = r_0_2_1;\n }\n {\n S_09bc5ab4 memory r_0_2_2;\n {\n string memory r_0_2_2_0 = unicode\"Moo é🚀éo🚀ooMéoM🚀oM Moé o🚀Mé 🚀ooé🚀Moooo\";\n r_0_2_2.s_0 = r_0_2_2_0;\n }\n {\n address[3][1] memory r_0_2_2_1;\n {\n address[3] memory r_0_2_2_1_0;\n {\n address r_0_2_2_1_0_0 = 0x74CeFAEF109F3b0FbcD654086ed14afF1c2d4aCB;\n r_0_2_2_1_0[0] = r_0_2_2_1_0_0;\n }\n {\n address r_0_2_2_1_0_1 = 0xE996Aaf96C73c17114D9b3B96F0020B7FaF66665;\n r_0_2_2_1_0[1] = r_0_2_2_1_0_1;\n }\n {\n address r_0_2_2_1_0_2 = 0xFE044366F8D27ea8951F589bF3f098de555712E7;\n r_0_2_2_1_0[2] = r_0_2_2_1_0_2;\n }\n r_0_2_2_1[0] = r_0_2_2_1_0;\n }\n r_0_2_2.s_1 = r_0_2_2_1;\n }\n {\n S_2eddd6ac memory r_0_2_2_2;\n {\n bool r_0_2_2_2_0 = true;\n r_0_2_2_2.s_0 = r_0_2_2_2_0;\n }\n {\n bytes5 r_0_2_2_2_1 = bytes5(0xd98b533a04);\n r_0_2_2_2.s_1 = r_0_2_2_2_1;\n }\n {\n bool r_0_2_2_2_2 = false;\n r_0_2_2_2.s_2 = r_0_2_2_2_2;\n }\n {\n bytes28 r_0_2_2_2_3 = bytes28(0x7361f5713429ee5b3c5aa0f95a51f20362d03de73af5d24fdd1ba3a9);\n r_0_2_2_2.s_3 = r_0_2_2_2_3;\n }\n r_0_2_2.s_2 = r_0_2_2_2;\n }\n {\n uint240 r_0_2_2_3 = 113175224569512132013602103585824308313673745181417885159929491955838294;\n r_0_2_2.s_3 = r_0_2_2_3;\n }\n {\n uint88 r_0_2_2_4 = 228042630791797743924668015;\n r_0_2_2.s_4 = r_0_2_2_4;\n }\n r_0_2.s_2 = r_0_2_2;\n }\n r_0[2] = r_0_2;\n }\n {\n S_a03de45e memory r_0_3;\n {\n address r_0_3_0 = 0xdEd3728DE4B0b5EF2e877365aB81522f4be28d0E;\n r_0_3.s_0 = r_0_3_0;\n }\n {\n int80 r_0_3_1 = 78552340874942351714788;\n r_0_3.s_1 = r_0_3_1;\n }\n {\n S_09bc5ab4 memory r_0_3_2;\n {\n string memory r_0_3_2_0 = unicode\"Moo é🚀oé 🚀🚀oééoooMéoé🚀 é🚀oéo🚀\";\n r_0_3_2.s_0 = r_0_3_2_0;\n }\n {\n address[3][1] memory r_0_3_2_1;\n {\n address[3] memory r_0_3_2_1_0;\n {\n address r_0_3_2_1_0_0 = 0x27D6FeA2a818863362dC1CB5704448D02f04A776;\n r_0_3_2_1_0[0] = r_0_3_2_1_0_0;\n }\n {\n address r_0_3_2_1_0_1 = 0xa516255263F68dc224e67E5D3750Ab8C4DF974f4;\n r_0_3_2_1_0[1] = r_0_3_2_1_0_1;\n }\n {\n address r_0_3_2_1_0_2 = 0xAaA49B36544055460f23B02B2241c0Eb6E1D2135;\n r_0_3_2_1_0[2] = r_0_3_2_1_0_2;\n }\n r_0_3_2_1[0] = r_0_3_2_1_0;\n }\n r_0_3_2.s_1 = r_0_3_2_1;\n }\n {\n S_2eddd6ac memory r_0_3_2_2;\n {\n bool r_0_3_2_2_0 = true;\n r_0_3_2_2.s_0 = r_0_3_2_2_0;\n }\n {\n bytes5 r_0_3_2_2_1 = bytes5(0x6181aee8fd);\n r_0_3_2_2.s_1 = r_0_3_2_2_1;\n }\n {\n bool r_0_3_2_2_2 = false;\n r_0_3_2_2.s_2 = r_0_3_2_2_2;\n }\n {\n bytes28 r_0_3_2_2_3 = bytes28(0x5bca6ff666305ba99db6c0a4c94ca9c20bdd4c1b726d9fc5abe07838);\n r_0_3_2_2.s_3 = r_0_3_2_2_3;\n }\n r_0_3_2.s_2 = r_0_3_2_2;\n }\n {\n uint240 r_0_3_2_3 = 757119636008924985821085062009745352205806977222282372812821415663386768;\n r_0_3_2.s_3 = r_0_3_2_3;\n }\n {\n uint88 r_0_3_2_4 = 142356003821432769055146607;\n r_0_3_2.s_4 = r_0_3_2_4;\n }\n r_0_3.s_2 = r_0_3_2;\n }\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_a03de45e[4] memory r_1;\n {\n S_a03de45e memory r_1_0;\n {\n address r_1_0_0 = 0x50A1bD48978827275f23797f3CA96897ffA8ED76;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n int80 r_1_0_1 = 412470653691313394787764;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n S_09bc5ab4 memory r_1_0_2;\n {\n string memory r_1_0_2_0 = unicode\"Moo é🚀éoMMéo🚀 MMoééMM éo 🚀oéo🚀🚀 M\";\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n address[3][1] memory r_1_0_2_1;\n {\n address[3] memory r_1_0_2_1_0;\n {\n address r_1_0_2_1_0_0 = 0x2225F93CFA3ff596CfB3205ebf32570ee5CFCE26;\n r_1_0_2_1_0[0] = r_1_0_2_1_0_0;\n }\n {\n address r_1_0_2_1_0_1 = 0x850E5bC3309820A886aA850a4ee9586f6B095F8e;\n r_1_0_2_1_0[1] = r_1_0_2_1_0_1;\n }\n {\n address r_1_0_2_1_0_2 = 0x8d97a2ab51CCB4Bc4FCBb5273a7E0bb7FA4B17bc;\n r_1_0_2_1_0[2] = r_1_0_2_1_0_2;\n }\n r_1_0_2_1[0] = r_1_0_2_1_0;\n }\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n {\n S_2eddd6ac memory r_1_0_2_2;\n {\n bool r_1_0_2_2_0 = true;\n r_1_0_2_2.s_0 = r_1_0_2_2_0;\n }\n {\n bytes5 r_1_0_2_2_1 = bytes5(0x7bd96891eb);\n r_1_0_2_2.s_1 = r_1_0_2_2_1;\n }\n {\n bool r_1_0_2_2_2 = true;\n r_1_0_2_2.s_2 = r_1_0_2_2_2;\n }\n {\n bytes28 r_1_0_2_2_3 = bytes28(0xca861b294f1d32a2806431f122a97875f12176f30437df73046fad89);\n r_1_0_2_2.s_3 = r_1_0_2_2_3;\n }\n r_1_0_2.s_2 = r_1_0_2_2;\n }\n {\n uint240 r_1_0_2_3 = 499852171895052400262391608960276181971313109864263121723067631577566061;\n r_1_0_2.s_3 = r_1_0_2_3;\n }\n {\n uint88 r_1_0_2_4 = 298830116619038927014612371;\n r_1_0_2.s_4 = r_1_0_2_4;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n {\n S_a03de45e memory r_1_1;\n {\n address r_1_1_0 = 0x00541Afc9D96642D0221F314859e27e98FeD271F;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n int80 r_1_1_1 = -487575037523970649496700;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_09bc5ab4 memory r_1_1_2;\n {\n string memory r_1_1_2_0 = unicode\"Moo é🚀\";\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n address[3][1] memory r_1_1_2_1;\n {\n address[3] memory r_1_1_2_1_0;\n {\n address r_1_1_2_1_0_0 = 0x91b965e04AF757186C2e753709ac29A352F01333;\n r_1_1_2_1_0[0] = r_1_1_2_1_0_0;\n }\n {\n address r_1_1_2_1_0_1 = 0xbDE131e4171c055e6e6251FFEC1F9C3d308f812c;\n r_1_1_2_1_0[1] = r_1_1_2_1_0_1;\n }\n {\n address r_1_1_2_1_0_2 = 0x5DD1693Be9bE0115a90B75B64D928E352853C472;\n r_1_1_2_1_0[2] = r_1_1_2_1_0_2;\n }\n r_1_1_2_1[0] = r_1_1_2_1_0;\n }\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n {\n S_2eddd6ac memory r_1_1_2_2;\n {\n bool r_1_1_2_2_0 = true;\n r_1_1_2_2.s_0 = r_1_1_2_2_0;\n }\n {\n bytes5 r_1_1_2_2_1 = bytes5(0x34d17ee2b8);\n r_1_1_2_2.s_1 = r_1_1_2_2_1;\n }\n {\n bool r_1_1_2_2_2 = false;\n r_1_1_2_2.s_2 = r_1_1_2_2_2;\n }\n {\n bytes28 r_1_1_2_2_3 = bytes28(0x25f9af3d7cf62f47d42c83c8f2aa9e4aa0ff6d9a8068533e7fdc0b8f);\n r_1_1_2_2.s_3 = r_1_1_2_2_3;\n }\n r_1_1_2.s_2 = r_1_1_2_2;\n }\n {\n uint240 r_1_1_2_3 = 452851383571058179006716562279806002331361802630414285486007432088225249;\n r_1_1_2.s_3 = r_1_1_2_3;\n }\n {\n uint88 r_1_1_2_4 = 51270756966335915626570875;\n r_1_1_2.s_4 = r_1_1_2_4;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n {\n S_a03de45e memory r_1_2;\n {\n address r_1_2_0 = 0x3A10d67f1060852d0b34fb0561bB419649Ed91Ea;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n int80 r_1_2_1 = 600129248375862126655075;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n S_09bc5ab4 memory r_1_2_2;\n {\n string memory r_1_2_2_0 = unicode\"Moo é🚀o🚀 Mooéé🚀🚀🚀éooéo🚀oéo 🚀 Mo o 🚀é 🚀MooMé é🚀MMoo\";\n r_1_2_2.s_0 = r_1_2_2_0;\n }\n {\n address[3][1] memory r_1_2_2_1;\n {\n address[3] memory r_1_2_2_1_0;\n {\n address r_1_2_2_1_0_0 = 0xb97cF4099ceE515bF91Dede77BF18be293719Df5;\n r_1_2_2_1_0[0] = r_1_2_2_1_0_0;\n }\n {\n address r_1_2_2_1_0_1 = 0x95faB6D50E7c8abdE4e7e4d34aBceD79c1e7eD9D;\n r_1_2_2_1_0[1] = r_1_2_2_1_0_1;\n }\n {\n address r_1_2_2_1_0_2 = 0xEB69636054cfEFc5A54490c800E9ECfe3f9DF898;\n r_1_2_2_1_0[2] = r_1_2_2_1_0_2;\n }\n r_1_2_2_1[0] = r_1_2_2_1_0;\n }\n r_1_2_2.s_1 = r_1_2_2_1;\n }\n {\n S_2eddd6ac memory r_1_2_2_2;\n {\n bool r_1_2_2_2_0 = false;\n r_1_2_2_2.s_0 = r_1_2_2_2_0;\n }\n {\n bytes5 r_1_2_2_2_1 = bytes5(0x852a89c094);\n r_1_2_2_2.s_1 = r_1_2_2_2_1;\n }\n {\n bool r_1_2_2_2_2 = false;\n r_1_2_2_2.s_2 = r_1_2_2_2_2;\n }\n {\n bytes28 r_1_2_2_2_3 = bytes28(0xb21d045becf473d467f22c9a8758ada41ca82290b26329aaeefe57ce);\n r_1_2_2_2.s_3 = r_1_2_2_2_3;\n }\n r_1_2_2.s_2 = r_1_2_2_2;\n }\n {\n uint240 r_1_2_2_3 = 795039194579847259850917773229897630644160991993442051064403825866683146;\n r_1_2_2.s_3 = r_1_2_2_3;\n }\n {\n uint88 r_1_2_2_4 = 167584524349078587361670595;\n r_1_2_2.s_4 = r_1_2_2_4;\n }\n r_1_2.s_2 = r_1_2_2;\n }\n r_1[2] = r_1_2;\n }\n {\n S_a03de45e memory r_1_3;\n {\n address r_1_3_0 = 0x38A0def46C720b68f746B7c4e7d36BAd2d97BaBf;\n r_1_3.s_0 = r_1_3_0;\n }\n {\n int80 r_1_3_1 = -571377777619362448405324;\n r_1_3.s_1 = r_1_3_1;\n }\n {\n S_09bc5ab4 memory r_1_3_2;\n {\n string memory r_1_3_2_0 = unicode\"Moo é🚀o\";\n r_1_3_2.s_0 = r_1_3_2_0;\n }\n {\n address[3][1] memory r_1_3_2_1;\n {\n address[3] memory r_1_3_2_1_0;\n {\n address r_1_3_2_1_0_0 = 0xc970B10C2D75Fb18b349A48CCC3a40A7054b413b;\n r_1_3_2_1_0[0] = r_1_3_2_1_0_0;\n }\n {\n address r_1_3_2_1_0_1 = 0xD752358f34733c7B679d3edBb61DA3430f24a057;\n r_1_3_2_1_0[1] = r_1_3_2_1_0_1;\n }\n {\n address r_1_3_2_1_0_2 = 0xF139768178070f7F95E5C90898Bba3a1152a848A;\n r_1_3_2_1_0[2] = r_1_3_2_1_0_2;\n }\n r_1_3_2_1[0] = r_1_3_2_1_0;\n }\n r_1_3_2.s_1 = r_1_3_2_1;\n }\n {\n S_2eddd6ac memory r_1_3_2_2;\n {\n bool r_1_3_2_2_0 = false;\n r_1_3_2_2.s_0 = r_1_3_2_2_0;\n }\n {\n bytes5 r_1_3_2_2_1 = bytes5(0x88a7eeff6e);\n r_1_3_2_2.s_1 = r_1_3_2_2_1;\n }\n {\n bool r_1_3_2_2_2 = true;\n r_1_3_2_2.s_2 = r_1_3_2_2_2;\n }\n {\n bytes28 r_1_3_2_2_3 = bytes28(0x6692b9ded3351da70590efd6e126d11e54f895ea894498c3c0b102c6);\n r_1_3_2_2.s_3 = r_1_3_2_2_3;\n }\n r_1_3_2.s_2 = r_1_3_2_2;\n }\n {\n uint240 r_1_3_2_3 = 265316384866407637405333897426040408612786893731115282179285144603292617;\n r_1_3_2.s_3 = r_1_3_2_3;\n }\n {\n uint88 r_1_3_2_4 = 26776131584309205161772383;\n r_1_3_2.s_4 = r_1_3_2_4;\n }\n r_1_3.s_2 = r_1_3_2;\n }\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n {\n S_a03de45e[4] memory r_2;\n {\n S_a03de45e memory r_2_0;\n {\n address r_2_0_0 = 0x6A22c415a20E4842b9A0f2244860401C384F4526;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n int80 r_2_0_1 = 377198327110170995321985;\n r_2_0.s_1 = r_2_0_1;\n }\n {\n S_09bc5ab4 memory r_2_0_2;\n {\n string memory r_2_0_2_0 = unicode\"Moo é🚀🚀oéoo🚀ooMM🚀 M🚀oM🚀oMé🚀🚀 éMooMé 🚀🚀🚀Mooé\";\n r_2_0_2.s_0 = r_2_0_2_0;\n }\n {\n address[3][1] memory r_2_0_2_1;\n {\n address[3] memory r_2_0_2_1_0;\n {\n address r_2_0_2_1_0_0 = 0x4b0a7A830EF062cb70A07183b95d0573ACFF908d;\n r_2_0_2_1_0[0] = r_2_0_2_1_0_0;\n }\n {\n address r_2_0_2_1_0_1 = 0xAb4269215db5825eBc8fFbB51BF8C7d635976cba;\n r_2_0_2_1_0[1] = r_2_0_2_1_0_1;\n }\n {\n address r_2_0_2_1_0_2 = 0x9493F94df0172Cb57f2a743425bAAA61d2E36D5C;\n r_2_0_2_1_0[2] = r_2_0_2_1_0_2;\n }\n r_2_0_2_1[0] = r_2_0_2_1_0;\n }\n r_2_0_2.s_1 = r_2_0_2_1;\n }\n {\n S_2eddd6ac memory r_2_0_2_2;\n {\n bool r_2_0_2_2_0 = true;\n r_2_0_2_2.s_0 = r_2_0_2_2_0;\n }\n {\n bytes5 r_2_0_2_2_1 = bytes5(0x7f60ddd631);\n r_2_0_2_2.s_1 = r_2_0_2_2_1;\n }\n {\n bool r_2_0_2_2_2 = true;\n r_2_0_2_2.s_2 = r_2_0_2_2_2;\n }\n {\n bytes28 r_2_0_2_2_3 = bytes28(0xaa7fb16a4c2d9e8a93a2809e83e661ea2d90e92ee4dadd80f2cf1f27);\n r_2_0_2_2.s_3 = r_2_0_2_2_3;\n }\n r_2_0_2.s_2 = r_2_0_2_2;\n }\n {\n uint240 r_2_0_2_3 = 421122003415530036370691533604691027973883054084228617991336821478546513;\n r_2_0_2.s_3 = r_2_0_2_3;\n }\n {\n uint88 r_2_0_2_4 = 67592121420163781572907310;\n r_2_0_2.s_4 = r_2_0_2_4;\n }\n r_2_0.s_2 = r_2_0_2;\n }\n r_2[0] = r_2_0;\n }\n {\n S_a03de45e memory r_2_1;\n {\n address r_2_1_0 = 0x539225fC1b1feEd47a887b7F28bbC39B00f681f3;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n int80 r_2_1_1 = 325400860414691026941500;\n r_2_1.s_1 = r_2_1_1;\n }\n {\n S_09bc5ab4 memory r_2_1_2;\n {\n string memory r_2_1_2_0 = unicode\"Moo é🚀éMMMM\";\n r_2_1_2.s_0 = r_2_1_2_0;\n }\n {\n address[3][1] memory r_2_1_2_1;\n {\n address[3] memory r_2_1_2_1_0;\n {\n address r_2_1_2_1_0_0 = 0xdFb2b5C84dD8cf1BB9b285359F95361443af7BFA;\n r_2_1_2_1_0[0] = r_2_1_2_1_0_0;\n }\n {\n address r_2_1_2_1_0_1 = 0xD258E63182CFF58744DE38c18442d65D8454d47c;\n r_2_1_2_1_0[1] = r_2_1_2_1_0_1;\n }\n {\n address r_2_1_2_1_0_2 = 0x2bD9124A4a497F9203c535Dae11ab8B73793a50C;\n r_2_1_2_1_0[2] = r_2_1_2_1_0_2;\n }\n r_2_1_2_1[0] = r_2_1_2_1_0;\n }\n r_2_1_2.s_1 = r_2_1_2_1;\n }\n {\n S_2eddd6ac memory r_2_1_2_2;\n {\n bool r_2_1_2_2_0 = false;\n r_2_1_2_2.s_0 = r_2_1_2_2_0;\n }\n {\n bytes5 r_2_1_2_2_1 = bytes5(0xf6487e5b08);\n r_2_1_2_2.s_1 = r_2_1_2_2_1;\n }\n {\n bool r_2_1_2_2_2 = false;\n r_2_1_2_2.s_2 = r_2_1_2_2_2;\n }\n {\n bytes28 r_2_1_2_2_3 = bytes28(0xde1f0f573dad198c53280b8b3c60a60927611e96ea2e9034bb05d818);\n r_2_1_2_2.s_3 = r_2_1_2_2_3;\n }\n r_2_1_2.s_2 = r_2_1_2_2;\n }\n {\n uint240 r_2_1_2_3 = 654848288828254932964363218520914018951639448609035557111564712228759821;\n r_2_1_2.s_3 = r_2_1_2_3;\n }\n {\n uint88 r_2_1_2_4 = 56131956284168133665082115;\n r_2_1_2.s_4 = r_2_1_2_4;\n }\n r_2_1.s_2 = r_2_1_2;\n }\n r_2[1] = r_2_1;\n }\n {\n S_a03de45e memory r_2_2;\n {\n address r_2_2_0 = 0xCE191FF0e845C96033b9A1a641c0Db8a5E5cF164;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n int80 r_2_2_1 = -579263166506302098927964;\n r_2_2.s_1 = r_2_2_1;\n }\n {\n S_09bc5ab4 memory r_2_2_2;\n {\n string memory r_2_2_2_0 = unicode\"Moo é🚀Mo🚀oo 🚀🚀 é o🚀 oé🚀éoo é🚀🚀🚀oMé 🚀Mo 🚀é Mé🚀 oéoéMM🚀MM🚀 MMMé\";\n r_2_2_2.s_0 = r_2_2_2_0;\n }\n {\n address[3][1] memory r_2_2_2_1;\n {\n address[3] memory r_2_2_2_1_0;\n {\n address r_2_2_2_1_0_0 = 0xB24E74D85c799edab28711e7baEd44A9b479B2A2;\n r_2_2_2_1_0[0] = r_2_2_2_1_0_0;\n }\n {\n address r_2_2_2_1_0_1 = 0x79E0024b4E63751f64B86778A8c3aba9a2e818b6;\n r_2_2_2_1_0[1] = r_2_2_2_1_0_1;\n }\n {\n address r_2_2_2_1_0_2 = 0x62Ab7aC1AeD57C29796C1376b8B3b836d78A07D5;\n r_2_2_2_1_0[2] = r_2_2_2_1_0_2;\n }\n r_2_2_2_1[0] = r_2_2_2_1_0;\n }\n r_2_2_2.s_1 = r_2_2_2_1;\n }\n {\n S_2eddd6ac memory r_2_2_2_2;\n {\n bool r_2_2_2_2_0 = true;\n r_2_2_2_2.s_0 = r_2_2_2_2_0;\n }\n {\n bytes5 r_2_2_2_2_1 = bytes5(0x70be09c29c);\n r_2_2_2_2.s_1 = r_2_2_2_2_1;\n }\n {\n bool r_2_2_2_2_2 = false;\n r_2_2_2_2.s_2 = r_2_2_2_2_2;\n }\n {\n bytes28 r_2_2_2_2_3 = bytes28(0xd9d8222df6b73dab031a36de7b577b8d6e0119c7984b8e704592c632);\n r_2_2_2_2.s_3 = r_2_2_2_2_3;\n }\n r_2_2_2.s_2 = r_2_2_2_2;\n }\n {\n uint240 r_2_2_2_3 = 339979713229544680630608818877017593993309940551175945598554611544677637;\n r_2_2_2.s_3 = r_2_2_2_3;\n }\n {\n uint88 r_2_2_2_4 = 75947959788314645638720418;\n r_2_2_2.s_4 = r_2_2_2_4;\n }\n r_2_2.s_2 = r_2_2_2;\n }\n r_2[2] = r_2_2;\n }\n {\n S_a03de45e memory r_2_3;\n {\n address r_2_3_0 = 0x3AC86AfC57D1782d32Ec61A2A7bcD5779Cb694E0;\n r_2_3.s_0 = r_2_3_0;\n }\n {\n int80 r_2_3_1 = -142181656589653134506668;\n r_2_3.s_1 = r_2_3_1;\n }\n {\n S_09bc5ab4 memory r_2_3_2;\n {\n string memory r_2_3_2_0 = unicode\"Moo é🚀éoooMo🚀MMMoMMMMééMMoMo🚀éM\";\n r_2_3_2.s_0 = r_2_3_2_0;\n }\n {\n address[3][1] memory r_2_3_2_1;\n {\n address[3] memory r_2_3_2_1_0;\n {\n address r_2_3_2_1_0_0 = 0x1FE6519189F2123e53fB123029dFbe1fAA3d53A8;\n r_2_3_2_1_0[0] = r_2_3_2_1_0_0;\n }\n {\n address r_2_3_2_1_0_1 = 0x9B9e5dB619a9B045E3a515415144EA2365f3709f;\n r_2_3_2_1_0[1] = r_2_3_2_1_0_1;\n }\n {\n address r_2_3_2_1_0_2 = 0x04759E42c9371b5BfbE6d0ac39b3087DcCfa40c9;\n r_2_3_2_1_0[2] = r_2_3_2_1_0_2;\n }\n r_2_3_2_1[0] = r_2_3_2_1_0;\n }\n r_2_3_2.s_1 = r_2_3_2_1;\n }\n {\n S_2eddd6ac memory r_2_3_2_2;\n {\n bool r_2_3_2_2_0 = false;\n r_2_3_2_2.s_0 = r_2_3_2_2_0;\n }\n {\n bytes5 r_2_3_2_2_1 = bytes5(0xee9cec350a);\n r_2_3_2_2.s_1 = r_2_3_2_2_1;\n }\n {\n bool r_2_3_2_2_2 = false;\n r_2_3_2_2.s_2 = r_2_3_2_2_2;\n }\n {\n bytes28 r_2_3_2_2_3 = bytes28(0x4a75ff596e91fc5743735c5abc6d63f173a28e8a02c64d0783b123a0);\n r_2_3_2_2.s_3 = r_2_3_2_2_3;\n }\n r_2_3_2.s_2 = r_2_3_2_2;\n }\n {\n uint240 r_2_3_2_3 = 551128815124698752723409326612528100683782846558464748832208201796375295;\n r_2_3_2.s_3 = r_2_3_2_3;\n }\n {\n uint88 r_2_3_2_4 = 95150692173394116586863979;\n r_2_3_2.s_4 = r_2_3_2_4;\n }\n r_2_3.s_2 = r_2_3_2;\n }\n r_2[3] = r_2_3;\n }\n r[2] = r_2;\n }\n {\n S_a03de45e[4] memory r_3;\n {\n S_a03de45e memory r_3_0;\n {\n address r_3_0_0 = 0x030573313f5577C816A48612D61e64Af101f297A;\n r_3_0.s_0 = r_3_0_0;\n }\n {\n int80 r_3_0_1 = 439680220069889117273100;\n r_3_0.s_1 = r_3_0_1;\n }\n {\n S_09bc5ab4 memory r_3_0_2;\n {\n string memory r_3_0_2_0 = unicode\"Moo é🚀o oM ooM 🚀🚀 M🚀M ooM🚀🚀éoMéoéM🚀o\";\n r_3_0_2.s_0 = r_3_0_2_0;\n }\n {\n address[3][1] memory r_3_0_2_1;\n {\n address[3] memory r_3_0_2_1_0;\n {\n address r_3_0_2_1_0_0 = 0x3BE9e18DD4b0e421af2dDef85b25eE5E26026433;\n r_3_0_2_1_0[0] = r_3_0_2_1_0_0;\n }\n {\n address r_3_0_2_1_0_1 = 0x55b698d4Ea077625463e30D16690AB02bCFD85b1;\n r_3_0_2_1_0[1] = r_3_0_2_1_0_1;\n }\n {\n address r_3_0_2_1_0_2 = 0x6561a1e5e70Ec491c65018B255354701A3284F3a;\n r_3_0_2_1_0[2] = r_3_0_2_1_0_2;\n }\n r_3_0_2_1[0] = r_3_0_2_1_0;\n }\n r_3_0_2.s_1 = r_3_0_2_1;\n }\n {\n S_2eddd6ac memory r_3_0_2_2;\n {\n bool r_3_0_2_2_0 = false;\n r_3_0_2_2.s_0 = r_3_0_2_2_0;\n }\n {\n bytes5 r_3_0_2_2_1 = bytes5(0x55bf2a1829);\n r_3_0_2_2.s_1 = r_3_0_2_2_1;\n }\n {\n bool r_3_0_2_2_2 = false;\n r_3_0_2_2.s_2 = r_3_0_2_2_2;\n }\n {\n bytes28 r_3_0_2_2_3 = bytes28(0x0db469339f168c06d384d0f72bee3ebc4421186ada40d85a4b040798);\n r_3_0_2_2.s_3 = r_3_0_2_2_3;\n }\n r_3_0_2.s_2 = r_3_0_2_2;\n }\n {\n uint240 r_3_0_2_3 = 153538234430212797863930183779204420626295318668450215694804729607097992;\n r_3_0_2.s_3 = r_3_0_2_3;\n }\n {\n uint88 r_3_0_2_4 = 182728775794337843018604238;\n r_3_0_2.s_4 = r_3_0_2_4;\n }\n r_3_0.s_2 = r_3_0_2;\n }\n r_3[0] = r_3_0;\n }\n {\n S_a03de45e memory r_3_1;\n {\n address r_3_1_0 = 0x08dFaA7fdA0402a3970A052222b30D27000E70AC;\n r_3_1.s_0 = r_3_1_0;\n }\n {\n int80 r_3_1_1 = 445650647259072783925180;\n r_3_1.s_1 = r_3_1_1;\n }\n {\n S_09bc5ab4 memory r_3_1_2;\n {\n string memory r_3_1_2_0 = unicode\"Moo é🚀\";\n r_3_1_2.s_0 = r_3_1_2_0;\n }\n {\n address[3][1] memory r_3_1_2_1;\n {\n address[3] memory r_3_1_2_1_0;\n {\n address r_3_1_2_1_0_0 = 0x3500f521Ae038594932F058606d5a7a33D079ABB;\n r_3_1_2_1_0[0] = r_3_1_2_1_0_0;\n }\n {\n address r_3_1_2_1_0_1 = 0x9927225F4FB72e319535F65eC05b6bC350aB4cfD;\n r_3_1_2_1_0[1] = r_3_1_2_1_0_1;\n }\n {\n address r_3_1_2_1_0_2 = 0x7cF21513497E8364237214B81336dEe3123C6181;\n r_3_1_2_1_0[2] = r_3_1_2_1_0_2;\n }\n r_3_1_2_1[0] = r_3_1_2_1_0;\n }\n r_3_1_2.s_1 = r_3_1_2_1;\n }\n {\n S_2eddd6ac memory r_3_1_2_2;\n {\n bool r_3_1_2_2_0 = true;\n r_3_1_2_2.s_0 = r_3_1_2_2_0;\n }\n {\n bytes5 r_3_1_2_2_1 = bytes5(0x1afc93828b);\n r_3_1_2_2.s_1 = r_3_1_2_2_1;\n }\n {\n bool r_3_1_2_2_2 = false;\n r_3_1_2_2.s_2 = r_3_1_2_2_2;\n }\n {\n bytes28 r_3_1_2_2_3 = bytes28(0x4da909d70b05044a5653cb97b58ff15506fc6a0be68801c29cdbb232);\n r_3_1_2_2.s_3 = r_3_1_2_2_3;\n }\n r_3_1_2.s_2 = r_3_1_2_2;\n }\n {\n uint240 r_3_1_2_3 = 1215939105339581641879978693481822744304929761923021186061041665205879522;\n r_3_1_2.s_3 = r_3_1_2_3;\n }\n {\n uint88 r_3_1_2_4 = 210046568862336085767248583;\n r_3_1_2.s_4 = r_3_1_2_4;\n }\n r_3_1.s_2 = r_3_1_2;\n }\n r_3[1] = r_3_1;\n }\n {\n S_a03de45e memory r_3_2;\n {\n address r_3_2_0 = 0x4643D27B1eE2a853BD499C83f292444B379eb726;\n r_3_2.s_0 = r_3_2_0;\n }\n {\n int80 r_3_2_1 = 156322560523113864827463;\n r_3_2.s_1 = r_3_2_1;\n }\n {\n S_09bc5ab4 memory r_3_2_2;\n {\n string memory r_3_2_2_0 = unicode\"Moo é🚀 o MoMoéoo🚀éoé é é ooo🚀 🚀M🚀é\";\n r_3_2_2.s_0 = r_3_2_2_0;\n }\n {\n address[3][1] memory r_3_2_2_1;\n {\n address[3] memory r_3_2_2_1_0;\n {\n address r_3_2_2_1_0_0 = 0x195c04C57b529Bd31FDaf043da8AFbEb77840D5A;\n r_3_2_2_1_0[0] = r_3_2_2_1_0_0;\n }\n {\n address r_3_2_2_1_0_1 = 0xAbC28aef7953cb91C54801e5Cb40358819776BEa;\n r_3_2_2_1_0[1] = r_3_2_2_1_0_1;\n }\n {\n address r_3_2_2_1_0_2 = 0x780f327993C8396A91b259251207EC7eFDB5AfBA;\n r_3_2_2_1_0[2] = r_3_2_2_1_0_2;\n }\n r_3_2_2_1[0] = r_3_2_2_1_0;\n }\n r_3_2_2.s_1 = r_3_2_2_1;\n }\n {\n S_2eddd6ac memory r_3_2_2_2;\n {\n bool r_3_2_2_2_0 = false;\n r_3_2_2_2.s_0 = r_3_2_2_2_0;\n }\n {\n bytes5 r_3_2_2_2_1 = bytes5(0x6ff5946d79);\n r_3_2_2_2.s_1 = r_3_2_2_2_1;\n }\n {\n bool r_3_2_2_2_2 = false;\n r_3_2_2_2.s_2 = r_3_2_2_2_2;\n }\n {\n bytes28 r_3_2_2_2_3 = bytes28(0x65f1230ab880ca3722c79c3a6dd87540be344da93f527316e541008a);\n r_3_2_2_2.s_3 = r_3_2_2_2_3;\n }\n r_3_2_2.s_2 = r_3_2_2_2;\n }\n {\n uint240 r_3_2_2_3 = 1551278232610995841306329861014276702152899602279337454019598562446887001;\n r_3_2_2.s_3 = r_3_2_2_3;\n }\n {\n uint88 r_3_2_2_4 = 78720716921216444131233280;\n r_3_2_2.s_4 = r_3_2_2_4;\n }\n r_3_2.s_2 = r_3_2_2;\n }\n r_3[2] = r_3_2;\n }\n {\n S_a03de45e memory r_3_3;\n {\n address r_3_3_0 = 0xc92A68aBf4fd45B8F7de18bD8cB2fA959e473C07;\n r_3_3.s_0 = r_3_3_0;\n }\n {\n int80 r_3_3_1 = 172038106178585222449582;\n r_3_3.s_1 = r_3_3_1;\n }\n {\n S_09bc5ab4 memory r_3_3_2;\n {\n string memory r_3_3_2_0 = unicode\"Moo é🚀o 🚀oM 🚀🚀MMéééM🚀éMoM🚀oo\";\n r_3_3_2.s_0 = r_3_3_2_0;\n }\n {\n address[3][1] memory r_3_3_2_1;\n {\n address[3] memory r_3_3_2_1_0;\n {\n address r_3_3_2_1_0_0 = 0xa7C37FEbfBa5DA50d7330fc88a0292E3b7511fF6;\n r_3_3_2_1_0[0] = r_3_3_2_1_0_0;\n }\n {\n address r_3_3_2_1_0_1 = 0x5c8C7eFE2642658235c996A3691b52781670741F;\n r_3_3_2_1_0[1] = r_3_3_2_1_0_1;\n }\n {\n address r_3_3_2_1_0_2 = 0x6D364AF9c7abDDC0b91F4131a0289C9fD35a02b3;\n r_3_3_2_1_0[2] = r_3_3_2_1_0_2;\n }\n r_3_3_2_1[0] = r_3_3_2_1_0;\n }\n r_3_3_2.s_1 = r_3_3_2_1;\n }\n {\n S_2eddd6ac memory r_3_3_2_2;\n {\n bool r_3_3_2_2_0 = true;\n r_3_3_2_2.s_0 = r_3_3_2_2_0;\n }\n {\n bytes5 r_3_3_2_2_1 = bytes5(0x4f9ffc5366);\n r_3_3_2_2.s_1 = r_3_3_2_2_1;\n }\n {\n bool r_3_3_2_2_2 = false;\n r_3_3_2_2.s_2 = r_3_3_2_2_2;\n }\n {\n bytes28 r_3_3_2_2_3 = bytes28(0x2845fff610f25fad7d5ef76d3e3141c2be16b5280d5ea7992c8dafd8);\n r_3_3_2_2.s_3 = r_3_3_2_2_3;\n }\n r_3_3_2.s_2 = r_3_3_2_2;\n }\n {\n uint240 r_3_3_2_3 = 474722090577515673307964402621661487521855441300047619523278325550952753;\n r_3_3_2.s_3 = r_3_3_2_3;\n }\n {\n uint88 r_3_3_2_4 = 89029201664642928626205282;\n r_3_3_2.s_4 = r_3_3_2_4;\n }\n r_3_3.s_2 = r_3_3_2;\n }\n r_3[3] = r_3_3;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000011800000000000000000000000000000000000000000000000000000000000001a40000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000fe885b3641f37abccc8b5b6d8c6a7df555210767ffffffffffffffffffffffffffffffffffffffffffffb13c54a969099e88ca0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000bbf282f8688338465a94ac8599e02386b5cd22f2000000000000000000000000ddf736be8709ac99860430a984e96c6f8b391099000000000000000000000000e7c38a0984540225cbf85498db586c270a389ec7000000000000000000000000000000000000000000000000000000000000000077fa16afdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000177f74f709eedb466b62cee3c0acaf238d221322940dd21c5e68c43cf000000000000fa153715b3922c53c3e2a7598a2496cb4427c3ba6017de66d13c7e2ec410000000000000000000000000000000000000000000086852acd27d5ded3c993300000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a806f6f4df09f9a80c3a9f09f9a80206f6f6f4dc3a9c3a9f09f9a80c3a920f09f9a80f09f9a80204d4d4dc3a96f6f6f206f4d6ff09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000222f1924febd6b9a69733904ded8720404ef905f00000000000000000000000000000000000000000000434fb44d20bd61234cfe00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c0c95c9448beafa3596ba222d777c3cdbafb94aa000000000000000000000000e239a942223a91cfa1f78670189fdfe6ae1cd5fd00000000000000000000000003b94b43284465fc157f981e2a6beb912ff4740b00000000000000000000000000000000000000000000000000000000000000001fb2e65d7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bef0993e4b24a68b622b3d43d28857492be91a46f50b55cde50d59300000000000034530d911f28950da7e1a7006e9078092281217591a7102c6d739f695ab2000000000000000000000000000000000000000000e15e548bff220a8be7e08c00000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806f4d6fc3a9f09f9a80f09f9a80f09f9a806f6f6f4df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000007592a1445307fcca87b0ecb13fc26d016090f17ffffffffffffffffffffffffffffffffffffffffffff8696def6b57a85e1cefc0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014000000000000000000000000074cefaef109f3b0fbcd654086ed14aff1c2d4acb000000000000000000000000e996aaf96c73c17114d9b3b96f0020b7faf66665000000000000000000000000fe044366f8d27ea8951f589bf3f098de555712e70000000000000000000000000000000000000000000000000000000000000001d98b533a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007361f5713429ee5b3c5aa0f95a51f20362d03de73af5d24fdd1ba3a90000000000001065e7031524dae7571a7a7e286b74198f16cf022e02f801e1f61976ed56000000000000000000000000000000000000000000bca1e7c943ac1236ede66f000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f4dc3a96f4df09f9a806f4d204d6fc3a9206ff09f9a804dc3a920f09f9a806f6fc3a9f09f9a804d6f6f6f6f0000000000000000000000000000ded3728de4b0b5ef2e877365ab81522f4be28d0e0000000000000000000000000000000000000000000010a254b7ed9f0014a9e40000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014000000000000000000000000027d6fea2a818863362dc1cb5704448d02f04a776000000000000000000000000a516255263f68dc224e67e5d3750ab8c4df974f4000000000000000000000000aaa49b36544055460f23b02b2241c0eb6e1d213500000000000000000000000000000000000000000000000000000000000000016181aee8fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bca6ff666305ba99db6c0a4c94ca9c20bdd4c1b726d9fc5abe078380000000000006db320cb9d387e6ce3608cba557adf2847267593adf231d0eb566202409000000000000000000000000000000000000000000075c10e6e33c7d43111c26f00000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a806fc3a920f09f9a80f09f9a806fc3a9c3a96f6f6f4dc3a96fc3a9f09f9a8020c3a9f09f9a806fc3a96ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000068000000000000000000000000050a1bd48978827275f23797f3ca96897ffa8ed7600000000000000000000000000000000000000000000575814357910dabfa5b4000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000002225f93cfa3ff596cfb3205ebf32570ee5cfce26000000000000000000000000850e5bc3309820a886aa850a4ee9586f6b095f8e0000000000000000000000008d97a2ab51ccb4bc4fcbb5273a7e0bb7fa4b17bc00000000000000000000000000000000000000000000000000000000000000017bd96891eb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ca861b294f1d32a2806431f122a97875f12176f30437df73046fad89000000000000486c8c293d7f9b9998bada26823adb5c84d070cb5fa57048e1f44d678b6d000000000000000000000000000000000000000000f72fbd1506022ce0e84d9300000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a80c3a96f4d4dc3a96ff09f9a80204d4d6fc3a9c3a94d4d20c3a96f20f09f9a806fc3a96ff09f9a80f09f9a8020204d000000000000000000000000000000000000000000541afc9d96642d0221f314859e27e98fed271fffffffffffffffffffffffffffffffffffffffffffff98c08116bf3646e3e3840000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014000000000000000000000000091b965e04af757186c2e753709ac29a352f01333000000000000000000000000bde131e4171c055e6e6251ffec1f9c3d308f812c0000000000000000000000005dd1693be9be0115a90b75b64d928e352853c472000000000000000000000000000000000000000000000000000000000000000134d17ee2b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025f9af3d7cf62f47d42c83c8f2aa9e4aa0ff6d9a8068533e7fdc0b8f000000000000419d30fdd0533a4157fc08d7f70812e79c41e443cd42b52fa729e2e585e10000000000000000000000000000000000000000002a69014decc1f76bafa47b000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000003a10d67f1060852d0b34fb0561bb419649ed91ea000000000000000000000000000000000000000000007f15125dc0d0f93b366300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000b97cf4099cee515bf91dede77bf18be293719df500000000000000000000000095fab6d50e7c8abde4e7e4d34abced79c1e7ed9d000000000000000000000000eb69636054cfefc5a54490c800e9ecfe3f9df8980000000000000000000000000000000000000000000000000000000000000000852a89c0940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b21d045becf473d467f22c9a8758ada41ca82290b26329aaeefe57ce0000000000007331a4885ce1724d6312d79093e2c80015f2a4384acf342ee1508d21b30a0000000000000000000000000000000000000000008a9f6744ca3f42b31335c3000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806ff09f9a8020204d6f6fc3a9c3a9f09f9a80f09f9a80f09f9a80c3a96f6fc3a96ff09f9a806fc3a96f20f09f9a80204d6f206f20f09f9a80c3a920f09f9a804d6f6f4dc3a920c3a9f09f9a804d4d6f6f00000000000000000000000000000000000038a0def46c720b68f746b7c4e7d36bad2d97babfffffffffffffffffffffffffffffffffffffffffffff87018c71b06641a80cb400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000c970b10c2d75fb18b349a48ccc3a40a7054b413b000000000000000000000000d752358f34733c7b679d3edbb61da3430f24a057000000000000000000000000f139768178070f7f95e5c90898bba3a1152a848a000000000000000000000000000000000000000000000000000000000000000088a7eeff6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016692b9ded3351da70590efd6e126d11e54f895ea894498c3c0b102c6000000000000267121b4e10ddbb391e1d1f6bc6be92602e23af63a948cc9ee4d869d73c90000000000000000000000000000000000000000001626110070effc2bd4855f000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000006a22c415a20e4842b9a0f2244860401c384f4526000000000000000000000000000000000000000000004fdff658584ff98fec81000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000004b0a7a830ef062cb70a07183b95d0573acff908d000000000000000000000000ab4269215db5825ebc8ffbb51bf8c7d635976cba0000000000000000000000009493f94df0172cb57f2a743425baaa61d2e36d5c00000000000000000000000000000000000000000000000000000000000000017f60ddd6310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aa7fb16a4c2d9e8a93a2809e83e661ea2d90e92ee4dadd80f2cf1f270000000000003d0448833dd562543d7e28898b07f9e4e1028687dc3581794bcd73825c5100000000000000000000000000000000000000000037e9303e8c8f69c767512e00000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80f09f9a806fc3a96f6ff09f9a806f6f4d4df09f9a80204df09f9a806f4df09f9a806f4dc3a9f09f9a80f09f9a8020c3a94d6f6f4dc3a920f09f9a80f09f9a80f09f9a804d6f6fc3a90000000000000000000000000000000000000000000000000000539225fc1b1feed47a887b7f28bbc39b00f681f30000000000000000000000000000000000000000000044e80417e3837f90363c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000dfb2b5c84dd8cf1bb9b285359f95361443af7bfa000000000000000000000000d258e63182cff58744de38c18442d65d8454d47c0000000000000000000000002bd9124a4a497f9203c535dae11ab8b73793a50c0000000000000000000000000000000000000000000000000000000000000000f6487e5b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de1f0f573dad198c53280b8b3c60a60927611e96ea2e9034bb05d8180000000000005ee1ac4a2df2132c171c7ecb1e16068ea37abea60e34230800522751290d0000000000000000000000000000000000000000002e6e67728c988ab4e7cb0300000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80c3a94d4d4d4d00000000000000000000000000000000000000000000000000000000ce191ff0e845c96033b9a1a641c0db8a5e5cf164ffffffffffffffffffffffffffffffffffffffffffff855614b0ba4f06eb8ea400000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000b24e74d85c799edab28711e7baed44a9b479b2a200000000000000000000000079e0024b4e63751f64b86778a8c3aba9a2e818b600000000000000000000000062ab7ac1aed57c29796c1376b8b3b836d78a07d5000000000000000000000000000000000000000000000000000000000000000170be09c29c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9d8222df6b73dab031a36de7b577b8d6e0119c7984b8e704592c63200000000000031428c662f07d72505957e96792c27a8ead8585110681fd17ce2364edd050000000000000000000000000000000000000000003ed29b2660ef931d04aba200000000000000000000000000000000000000000000000000000000000000734d6f6f20c3a9f09f9a804d6ff09f9a806f6f20f09f9a80f09f9a8020c3a920206ff09f9a80206fc3a9f09f9a80c3a96f6f20c3a9f09f9a80f09f9a80f09f9a806f4dc3a920f09f9a804d6f20f09f9a80c3a9204dc3a9f09f9a80206fc3a96fc3a94d4df09f9a804d4df09f9a80204d4d4dc3a9000000000000000000000000000000000000000000000000003ac86afc57d1782d32ec61a2a7bcd5779cb694e0ffffffffffffffffffffffffffffffffffffffffffffe1e45123c2699b448554000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000001fe6519189f2123e53fb123029dfbe1faa3d53a80000000000000000000000009b9e5db619a9b045e3a515415144ea2365f3709f00000000000000000000000004759e42c9371b5bfbe6d0ac39b3087dccfa40c90000000000000000000000000000000000000000000000000000000000000000ee9cec350a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a75ff596e91fc5743735c5abc6d63f173a28e8a02c64d0783b123a00000000000004fda81002b0d07d3ed3c15ce75d89171783c7bc63970f51edb3cff6d52ff0000000000000000000000000000000000000000004eb4f15bbfc0c7705d7d6b000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80c3a96f6f6f4d6ff09f9a804d4d4d6f4d4d4d4dc3a9c3a94d4d6f4d6ff09f9a80c3a94d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000660000000000000000000000000030573313f5577c816a48612d61e64af101f297a000000000000000000000000000000000000000000005d1b1ccc23eb54983c0c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000003be9e18dd4b0e421af2ddef85b25ee5e2602643300000000000000000000000055b698d4ea077625463e30d16690ab02bcfd85b10000000000000000000000006561a1e5e70ec491c65018b255354701a3284f3a000000000000000000000000000000000000000000000000000000000000000055bf2a182900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db469339f168c06d384d0f72bee3ebc4421186ada40d85a4b040798000000000000163f0cb4e38104e40ba5882a458e9b7b6fb7d8b35cf4a32337475eba0e88000000000000000000000000000000000000000000972652c8db039091821ece000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a806f206f4d206f6f4d202020f09f9a80f09f9a80204df09f9a804d206f6f4df09f9a80f09f9a80c3a96f4dc3a96fc3a94df09f9a806f0000000000000000000000000008dfaa7fda0402a3970a052222b30d27000e70ac000000000000000000000000000000000000000000005e5ec51e7bcd86f73fbc000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001400000000000000000000000003500f521ae038594932f058606d5a7a33d079abb0000000000000000000000009927225f4fb72e319535f65ec05b6bc350ab4cfd0000000000000000000000007cf21513497e8364237214b81336dee3123c618100000000000000000000000000000000000000000000000000000000000000011afc93828b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004da909d70b05044a5653cb97b58ff15506fc6a0be68801c29cdbb232000000000000b02db02643b3d51ef0fe6151a433b0bb7857c02e13d97f76f31877e042e2000000000000000000000000000000000000000000adbf17506e55315dc85ac7000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000004643d27b1ee2a853bd499c83f292444b379eb72600000000000000000000000000000000000000000000211a435313599797124700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000195c04c57b529bd31fdaf043da8afbeb77840d5a000000000000000000000000abc28aef7953cb91c54801e5cb40358819776bea000000000000000000000000780f327993c8396a91b259251207ec7efdb5afba00000000000000000000000000000000000000000000000000000000000000006ff5946d79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065f1230ab880ca3722c79c3a6dd87540be344da93f527316e541008a000000000000e0c41b8cdf2a6bff5fa391c18ca67f7829dffc981e66817ade819bb94859000000000000000000000000000000000000000000411dc29d82fcdafd60ce0000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80206f204d6f4d6fc3a96f6ff09f9a80c3a96fc3a920c3a92020c3a9206f6f6ff09f9a8020f09f9a804df09f9a80c3a900000000000000000000000000000000000000c92a68abf4fd45b8f7de18bd8cb2fa959e473c0700000000000000000000000000000000000000000000246e34551878c34809ae00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000a7c37febfba5da50d7330fc88a0292e3b7511ff60000000000000000000000005c8c7efe2642658235c996a3691b52781670741f0000000000000000000000006d364af9c7abddc0b91f4131a0289c9fd35a02b300000000000000000000000000000000000000000000000000000000000000014f9ffc536600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002845fff610f25fad7d5ef76d3e3141c2be16b5280d5ea7992c8dafd800000000000044c86bc58034c185c7658484d58d62bef58453ae950663deeea10b4c313100000000000000000000000000000000000000000049a4aab166aa4e7de1826200000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a806f20f09f9a806f4d20f09f9a80f09f9a804d4dc3a9c3a9c3a94df09f9a80c3a94d6f4df09f9a806f6f00000000000000000000000000" + }, + { + "name": "random-(address[4][4],bytes8,(address,int24,bytes1,(address,address,int24,address,int96)[1])[1])", + "type": "(address[4][4],bytes8,(address,int24,bytes1,(address,address,int24,address,int96)[1])[1])", + "value": [ + [ + [ + "0x2846970672E7E5a6Ac8419370ebD697B8B02a056", + "0x906bdB00c444C4C6E1c61e711586a82c430Bc9A0", + "0xd7cd344e7C2Fb80E22a0cB87950db05385B64102", + "0xe7cF51d3E1e034eb69bD3ba59B1600aDE93f4689" + ], + [ + "0x6959f817d113E347A077B1E7bDB095f14ba97548", + "0x0A63CF1996a593b8baF74bfaBA73601500B2071a", + "0x89dcbd37Aae703956b32892b52922f470078385f", + "0x0f8e94983A662167C66b2a6617F4d25594AAfaBc" + ], + [ + "0x2eE84d60b49F431EB97c82d79D73f53d7c54ffeA", + "0xe35ccd4869eFEb7dcF9cb6255018dd32578B9914", + "0xA214481089AB85cDe63Abb74665098772811bf99", + "0x12C23B2CfE1Dc803Df2Da7142e7a25c8b8D7A3fB" + ], + [ + "0x4cCBaBf08b96897b938E7AbCD5407D5907e0cBbB", + "0x7722CC4DF41B310777851c79D8b411ca221072Bc", + "0x45a31833AD150F88FeFf6D391a5b72FCB7079144", + "0xD4434E3f5344F66cbe8F10C3069081c1C9Ce1169" + ] + ], + "0x277f5b039f9e336c", + [ + [ + "0x8Ea06565f19BED0a95FFC8c6351ce655a203dd07", + "3250358", + "0xe5", + [ + [ + "0x27f9513ea8cB83DF3BC1998CA06d9ca7883Ac6b3", + "0x072704bEbBC6f498D37272B8Fae3f471C1e34d6f", + "-1104074", + "0x3A96A9486f01Afb302120c20D0dD660997c3658C", + "-12233380421610704216933172426" + ] + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2846970672E7E5a6Ac8419370ebD697B8B02a056" + }, + { + "type": "address", + "value": "0x906bdB00c444C4C6E1c61e711586a82c430Bc9A0" + }, + { + "type": "address", + "value": "0xd7cd344e7C2Fb80E22a0cB87950db05385B64102" + }, + { + "type": "address", + "value": "0xe7cF51d3E1e034eb69bD3ba59B1600aDE93f4689" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6959f817d113E347A077B1E7bDB095f14ba97548" + }, + { + "type": "address", + "value": "0x0A63CF1996a593b8baF74bfaBA73601500B2071a" + }, + { + "type": "address", + "value": "0x89dcbd37Aae703956b32892b52922f470078385f" + }, + { + "type": "address", + "value": "0x0f8e94983A662167C66b2a6617F4d25594AAfaBc" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2eE84d60b49F431EB97c82d79D73f53d7c54ffeA" + }, + { + "type": "address", + "value": "0xe35ccd4869eFEb7dcF9cb6255018dd32578B9914" + }, + { + "type": "address", + "value": "0xA214481089AB85cDe63Abb74665098772811bf99" + }, + { + "type": "address", + "value": "0x12C23B2CfE1Dc803Df2Da7142e7a25c8b8D7A3fB" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4cCBaBf08b96897b938E7AbCD5407D5907e0cBbB" + }, + { + "type": "address", + "value": "0x7722CC4DF41B310777851c79D8b411ca221072Bc" + }, + { + "type": "address", + "value": "0x45a31833AD150F88FeFf6D391a5b72FCB7079144" + }, + { + "type": "address", + "value": "0xD4434E3f5344F66cbe8F10C3069081c1C9Ce1169" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x277f5b039f9e336c" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x8Ea06565f19BED0a95FFC8c6351ce655a203dd07" + }, + { + "type": "number", + "value": "3250358" + }, + { + "type": "hexstring", + "value": "0xe5" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x27f9513ea8cB83DF3BC1998CA06d9ca7883Ac6b3" + }, + { + "type": "address", + "value": "0x072704bEbBC6f498D37272B8Fae3f471C1e34d6f" + }, + { + "type": "number", + "value": "-1104074" + }, + { + "type": "address", + "value": "0x3A96A9486f01Afb302120c20D0dD660997c3658C" + }, + { + "type": "number", + "value": "-12233380421610704216933172426" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105be806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104f3565b60405180910390f35b610056610316565b61005e610316565b610066610342565b61006e61036f565b732846970672e7e5a6ac8419370ebd697b8b02a056815273906bdb00c444c4c6e1c61e711586a82c430bc9a0602082015273d7cd344e7c2fb80e22a0cb87950db05385b64102604082015273e7cf51d3e1e034eb69bd3ba59b1600ade93f4689606082015281526100dd61036f565b736959f817d113e347a077b1e7bdb095f14ba975488152730a63cf1996a593b8baf74bfaba73601500b2071a6020808301919091527389dcbd37aae703956b32892b52922f470078385f6040830152730f8e94983a662167c66b2a6617f4d25594aafabc606083015282015261015161036f565b732ee84d60b49f431eb97c82d79d73f53d7c54ffea815273e35ccd4869efeb7dcf9cb6255018dd32578b9914602082015273a214481089ab85cde63abb74665098772811bf996040808301919091527312c23b2cfe1dc803df2da7142e7a25c8b8d7a3fb60608301528201526101c561036f565b734ccbabf08b96897b938e7abcd5407d5907e0cbbb8152737722cc4df41b310777851c79d8b411ca221072bc6020808301919091527345a31833ad150f88feff6d391a5b72fcb7079144604083015273d4434e3f5344f66cbe8f10c3069081c1c9ce11696060808401919091528301919091529082526709dfd6c0e7e78cdb60c21b9082015261025361038d565b61025b6103ba565b738ea06565f19bed0a95ffc8c6351ce655a203dd078152623198b6602082015260e560f81b604082015261028d6103df565b6040805160a0810182527327f9513ea8cb83df3bc1998ca06d9ca7883ac6b3815273072704bebbc6f498d37272b8fae3f471c1e34d6f60208201526210d8c91981830152733a96a9486f01afb302120c20d0dd660997c3658c6060808301919091526b278737117f62968b0f1684c9196080830152908352830191909152908252820152919050565b6040518060600160405280610329610342565b81526000602082015260400161033d61038d565b905290565b60405180608001604052806004905b61035961036f565b8152602001906001900390816103515790505090565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001905b6103a46103ba565b81526020019060019003908161039c5790505090565b60408051608081018252600080825260208201819052918101919091526060810161033d5b60405180602001604052806001905b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816103ee5790505090565b806000805b600180821061044057506104ec565b835180516001600160a01b039081168852602080830151600290810b828b01526040808501516001600160f81b031916818c015260609485015194909190808c01895b888110156104cf5787518051881683528681015188168784015285810151850b8684015283810151881684840152608090810151600b0b908301529685019660a0909101908801610483565b5050506101009a909a019950509590950194505050600101610431565b5050505050565b8151610320820190826000805b600480821061050f5750610555565b845184845b8381101561053b5782516001600160a01b0316825260209283019290910190600101610514565b505050602094909401935060809290920191600101610500565b5050505060208301516001600160c01b031916610200830152604083015161058161022084018261042c565b509291505056fea26469706673582212201e23a3830dd219397d28d43cebabb88bb413e34ebf54ba12d9589e73796c6e1764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3985b702 {\n address s_0;\n address s_1;\n int24 s_2;\n address s_3;\n int96 s_4;\n }\n\n struct S_e601a2ec {\n address s_0;\n int24 s_1;\n bytes1 s_2;\n S_3985b702[1] s_3;\n }\n\n struct S_c2d48df9 {\n address[4][4] s_0;\n bytes8 s_1;\n S_e601a2ec[1] s_2;\n }\n\n function test () public pure returns (S_c2d48df9 memory) {\n S_c2d48df9 memory r;\n {\n address[4][4] memory r_0;\n {\n address[4] memory r_0_0;\n {\n address r_0_0_0 = 0x2846970672E7E5a6Ac8419370ebD697B8B02a056;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x906bdB00c444C4C6E1c61e711586a82c430Bc9A0;\n r_0_0[1] = r_0_0_1;\n }\n {\n address r_0_0_2 = 0xd7cd344e7C2Fb80E22a0cB87950db05385B64102;\n r_0_0[2] = r_0_0_2;\n }\n {\n address r_0_0_3 = 0xe7cF51d3E1e034eb69bD3ba59B1600aDE93f4689;\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n address[4] memory r_0_1;\n {\n address r_0_1_0 = 0x6959f817d113E347A077B1E7bDB095f14ba97548;\n r_0_1[0] = r_0_1_0;\n }\n {\n address r_0_1_1 = 0x0A63CF1996a593b8baF74bfaBA73601500B2071a;\n r_0_1[1] = r_0_1_1;\n }\n {\n address r_0_1_2 = 0x89dcbd37Aae703956b32892b52922f470078385f;\n r_0_1[2] = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x0f8e94983A662167C66b2a6617F4d25594AAfaBc;\n r_0_1[3] = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n {\n address[4] memory r_0_2;\n {\n address r_0_2_0 = 0x2eE84d60b49F431EB97c82d79D73f53d7c54ffeA;\n r_0_2[0] = r_0_2_0;\n }\n {\n address r_0_2_1 = 0xe35ccd4869eFEb7dcF9cb6255018dd32578B9914;\n r_0_2[1] = r_0_2_1;\n }\n {\n address r_0_2_2 = 0xA214481089AB85cDe63Abb74665098772811bf99;\n r_0_2[2] = r_0_2_2;\n }\n {\n address r_0_2_3 = 0x12C23B2CfE1Dc803Df2Da7142e7a25c8b8D7A3fB;\n r_0_2[3] = r_0_2_3;\n }\n r_0[2] = r_0_2;\n }\n {\n address[4] memory r_0_3;\n {\n address r_0_3_0 = 0x4cCBaBf08b96897b938E7AbCD5407D5907e0cBbB;\n r_0_3[0] = r_0_3_0;\n }\n {\n address r_0_3_1 = 0x7722CC4DF41B310777851c79D8b411ca221072Bc;\n r_0_3[1] = r_0_3_1;\n }\n {\n address r_0_3_2 = 0x45a31833AD150F88FeFf6D391a5b72FCB7079144;\n r_0_3[2] = r_0_3_2;\n }\n {\n address r_0_3_3 = 0xD4434E3f5344F66cbe8F10C3069081c1C9Ce1169;\n r_0_3[3] = r_0_3_3;\n }\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n bytes8 r_1 = bytes8(0x277f5b039f9e336c);\n r.s_1 = r_1;\n }\n {\n S_e601a2ec[1] memory r_2;\n {\n S_e601a2ec memory r_2_0;\n {\n address r_2_0_0 = 0x8Ea06565f19BED0a95FFC8c6351ce655a203dd07;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n int24 r_2_0_1 = 3250358;\n r_2_0.s_1 = r_2_0_1;\n }\n {\n bytes1 r_2_0_2 = bytes1(0xe5);\n r_2_0.s_2 = r_2_0_2;\n }\n {\n S_3985b702[1] memory r_2_0_3;\n {\n S_3985b702 memory r_2_0_3_0;\n {\n address r_2_0_3_0_0 = 0x27f9513ea8cB83DF3BC1998CA06d9ca7883Ac6b3;\n r_2_0_3_0.s_0 = r_2_0_3_0_0;\n }\n {\n address r_2_0_3_0_1 = 0x072704bEbBC6f498D37272B8Fae3f471C1e34d6f;\n r_2_0_3_0.s_1 = r_2_0_3_0_1;\n }\n {\n int24 r_2_0_3_0_2 = -1104074;\n r_2_0_3_0.s_2 = r_2_0_3_0_2;\n }\n {\n address r_2_0_3_0_3 = 0x3A96A9486f01Afb302120c20D0dD660997c3658C;\n r_2_0_3_0.s_3 = r_2_0_3_0_3;\n }\n {\n int96 r_2_0_3_0_4 = -12233380421610704216933172426;\n r_2_0_3_0.s_4 = r_2_0_3_0_4;\n }\n r_2_0_3[0] = r_2_0_3_0;\n }\n r_2_0.s_3 = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000002846970672e7e5a6ac8419370ebd697b8b02a056000000000000000000000000906bdb00c444c4c6e1c61e711586a82c430bc9a0000000000000000000000000d7cd344e7c2fb80e22a0cb87950db05385b64102000000000000000000000000e7cf51d3e1e034eb69bd3ba59b1600ade93f46890000000000000000000000006959f817d113e347a077b1e7bdb095f14ba975480000000000000000000000000a63cf1996a593b8baf74bfaba73601500b2071a00000000000000000000000089dcbd37aae703956b32892b52922f470078385f0000000000000000000000000f8e94983a662167c66b2a6617f4d25594aafabc0000000000000000000000002ee84d60b49f431eb97c82d79d73f53d7c54ffea000000000000000000000000e35ccd4869efeb7dcf9cb6255018dd32578b9914000000000000000000000000a214481089ab85cde63abb74665098772811bf9900000000000000000000000012c23b2cfe1dc803df2da7142e7a25c8b8d7a3fb0000000000000000000000004ccbabf08b96897b938e7abcd5407d5907e0cbbb0000000000000000000000007722cc4df41b310777851c79d8b411ca221072bc00000000000000000000000045a31833ad150f88feff6d391a5b72fcb7079144000000000000000000000000d4434e3f5344f66cbe8f10c3069081c1c9ce1169277f5b039f9e336c0000000000000000000000000000000000000000000000000000000000000000000000008ea06565f19bed0a95ffc8c6351ce655a203dd0700000000000000000000000000000000000000000000000000000000003198b6e50000000000000000000000000000000000000000000000000000000000000000000000000000000000000027f9513ea8cb83df3bc1998ca06d9ca7883ac6b3000000000000000000000000072704bebbc6f498d37272b8fae3f471c1e34d6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef27360000000000000000000000003a96a9486f01afb302120c20d0dd660997c3658cffffffffffffffffffffffffffffffffffffffffd878c8ee809d6974f0e97b36" + }, + { + "name": "random-(bool,(address,((bool,int232,bytes7,int184[4]),bytes27[4][4]),(address),uint40),address)[]", + "type": "(bool,(address,((bool,int232,bytes7,int184[4]),bytes27[4][4]),(address),uint40),address)[]", + "value": [], + "verbose": { + "type": "array", + "value": [] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061033a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906101ee565b60405180910390f35b604080516000808252602082019092526060919081610083565b61007061008a565b8152602001906001900390816100685790505b5092915050565b60405180606001604052806000151581526020016100a66100b3565b8152600060209091015290565b604051806080016040528060006001600160a01b031681526020016100d66100f5565b8152604080516020808201835260008083529084019190915291015290565b604051806040016040528061010861011a565b8152602001610115610143565b905290565b604080516080810182526000808252602082018190529181019190915260608101610115610170565b60405180608001604052806004905b61015a610170565b8152602001906001900390816101525790505090565b60405180608001604052806004906020820280368337509192915050565b806000805b60048082106101a257506101e7565b835186845b838110156101cd57825164ffffffffff19168252602092830192909101906001016101a7565b505050608095909501945060209290920191600101610193565b5050505050565b60208082528251828201819052600091906040908185019086840185805b838110156102f65782518051151586528781015180516001600160a01b031689880152808901518051805115158a8a0152808b0151601c0b6060808b01919091528a8201516001600160c81b03191660808b0152908101519060a08a0190875b600481101561028c57835160160b8352928d0192918d019160010161026c565b50928c0151926102a06101208c018561018e565b8b850151516001600160a01b03166103208c01529093015164ffffffffff81166103408b015292506102d0915050565b508601516001600160a01b0316610360860152610380909401939186019160010161020c565b50929897505050505050505056fea26469706673582212205b83d211221052180d29d2ec58aaf3467c265c8e5758442c62b759d4e4fcf8bc64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_92d0fb33 {\n bool s_0;\n int232 s_1;\n bytes7 s_2;\n int184[4] s_3;\n }\n\n struct S_4f896fbe {\n S_92d0fb33 s_0;\n bytes27[4][4] s_1;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_de8c4e82 {\n address s_0;\n S_4f896fbe s_1;\n S_421683f8 s_2;\n uint40 s_3;\n }\n\n struct S_00af99da {\n bool s_0;\n S_de8c4e82 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_00af99da[] memory) {\n S_00af99da[] memory r = new S_00af99da[](0);\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,(bytes15,(bool,address,string,string[][3])[3])[1],(address,address[2]),string)", + "type": "(string,(bytes15,(bool,address,string,string[][3])[3])[1],(address,address[2]),string)", + "value": [ + "Moo é🚀oMéé🚀🚀é 🚀ooo 🚀o MoM 🚀éo🚀éooM🚀oM🚀é", + [ + [ + "0x93db45bbf1d25ef7b458c9ac9ae03c", + [ + [ + true, + "0x82f48CfEDCd65065bf606b1d57775b1c7BdF0129", + "Moo é🚀 Méé 🚀MoM o o é M", + [ + ["Moo é🚀 oo éMoo🚀 🚀é"], + [ + "Moo é🚀o ooo éééé oo🚀é🚀o oMM🚀Moooéé 🚀🚀🚀 ooo🚀M 🚀🚀 ooéoo🚀M", + "Moo é🚀éo🚀o🚀o🚀oo M ooMooé🚀oMoéoo 🚀oé🚀🚀M o🚀ooMéé🚀Méooé ééooé🚀🚀🚀 o", + "Moo é🚀o M é🚀 MMooo🚀🚀o🚀éoMM o o🚀ooééM oéo" + ], + [ + "Moo é🚀 o M🚀M 🚀o o🚀🚀🚀éM o🚀éoM", + "Moo é🚀", + "Moo é🚀oéMMé🚀oM é🚀éé🚀oMM🚀🚀 MooéMM" + ] + ] + ], + [ + false, + "0x5bDA6E0C556955762ceaB7C4dFf7C5a381928835", + "Moo é🚀o Mo é🚀🚀é🚀🚀 ", + [ + [], + ["Moo é🚀éééMM M", "Moo é🚀", "Moo é🚀oééééoMMééoéoo o"], + [ + "Moo é🚀éoooMMoMoMéMoéo🚀", + "Moo é🚀éoooo🚀éMééoo oé 🚀M🚀oé🚀éoooé🚀M Mo" + ] + ] + ], + [ + true, + "0x4dF7E949563B347015DD0dEf8Ab899a6aA01fdAa", + "Moo é🚀ééoM MoéMoM", + [ + [], + [ + "Moo é🚀o ", + "Moo é🚀oé🚀Mé", + "Moo é🚀 é", + "Moo é🚀MooooMoéoéo🚀🚀é o🚀ooM ééééo Moo 🚀 o" + ], + [ + "Moo é🚀ooM é🚀é🚀 oo é Mé🚀oM🚀Méo🚀MéM🚀🚀🚀o🚀Mé oooo ", + "Moo é🚀éMoo🚀ééMo o é o éé🚀 oo🚀ooéo o o🚀 oéMo🚀ééé", + "Moo é🚀o🚀oo 🚀é éM é🚀" + ] + ] + ] + ] + ] + ], + [ + "0x634cF8866c2471E86379B50C5DBcc71F2b50A636", + [ + "0x3f6247413d749e1eC92EDDee08E58aFE088d9202", + "0x67ac5ed51Aa774710A0074fb495C56802ed0baBa" + ] + ], + "Moo é🚀oo🚀MoMo" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMéé🚀🚀é 🚀ooo 🚀o MoM 🚀éo🚀éooM🚀oM🚀é" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x93db45bbf1d25ef7b458c9ac9ae03c" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x82f48CfEDCd65065bf606b1d57775b1c7BdF0129" + }, + { + "type": "string", + "value": "Moo é🚀 Méé 🚀MoM o o é M" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oo éMoo🚀 🚀é" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o ooo éééé oo🚀é🚀o oMM🚀Moooéé 🚀🚀🚀 ooo🚀M 🚀🚀 ooéoo🚀M" + }, + { + "type": "string", + "value": "Moo é🚀éo🚀o🚀o🚀oo M ooMooé🚀oMoéoo 🚀oé🚀🚀M o🚀ooMéé🚀Méooé ééooé🚀🚀🚀 o" + }, + { + "type": "string", + "value": "Moo é🚀o M é🚀 MMooo🚀🚀o🚀éoMM o o🚀ooééM oéo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o M🚀M 🚀o o🚀🚀🚀éM o🚀éoM" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oéMMé🚀oM é🚀éé🚀oMM🚀🚀 MooéMM" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x5bDA6E0C556955762ceaB7C4dFf7C5a381928835" + }, + { + "type": "string", + "value": "Moo é🚀o Mo é🚀🚀é🚀🚀 " + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éééMM M" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oééééoMMééoéoo o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoooMMoMoMéMoéo🚀" + }, + { + "type": "string", + "value": "Moo é🚀éoooo🚀éMééoo oé 🚀M🚀oé🚀éoooé🚀M Mo" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x4dF7E949563B347015DD0dEf8Ab899a6aA01fdAa" + }, + { + "type": "string", + "value": "Moo é🚀ééoM MoéMoM" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o " + }, + { + "type": "string", + "value": "Moo é🚀oé🚀Mé" + }, + { + "type": "string", + "value": "Moo é🚀 é" + }, + { + "type": "string", + "value": "Moo é🚀MooooMoéoéo🚀🚀é o🚀ooM ééééo Moo 🚀 o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooM é🚀é🚀 oo é Mé🚀oM🚀Méo🚀MéM🚀🚀🚀o🚀Mé oooo " + }, + { + "type": "string", + "value": "Moo é🚀éMoo🚀ééMo o é o éé🚀 oo🚀ooéo o o🚀 oéMo🚀ééé" + }, + { + "type": "string", + "value": "Moo é🚀o🚀oo 🚀é éM é🚀" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x634cF8866c2471E86379B50C5DBcc71F2b50A636" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3f6247413d749e1eC92EDDee08E58aFE088d9202" + }, + { + "type": "address", + "value": "0x67ac5ed51Aa774710A0074fb495C56802ed0baBa" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo🚀MoMo" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506110cb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610b40565b60405180910390f35b61005661097c565b61005e61097c565b60006040518060800160405280604a8152602001610eb9604a91398252506100846109b0565b61008c6109dd565b6e24f6d16efc7497bded16326b26b80f608a1b81526100a96109fc565b6100b1610a29565b600181527382f48cfedcd65065bf606b1d57775b1c7bdf012960208083019190915260408051606081019091526025808252600092610d8e908301396040830152506100fb610a4c565b604080516001808252818301909252600091816020015b606081526020019060019003908161011257905050905060006040518060400160405280601e81526020017f4d6f6f20c3a9f09f9a80206f6f20c3a94d6f6ff09f9a8020f09f9a80c3a900008152509050808260008151811061017757610177610d01565b602090810291909101015250815260408051600380825260808201909252600091816020015b606081526020019060019003908161019d57905050905060006040518060a0016040528060618152602001610dd660619139905080826000815181106101e5576101e5610d01565b60200260200101819052505060006040518060a0016040528060728152602001611024607291399050808260018151811061022257610222610d01565b6020026020010181905250506000604051806060016040528060408152602001610fab604091399050808260028151811061025f5761025f610d01565b6020908102919091018101919091528301919091525060408051600380825260808201909252600091816020015b606081526020019060019003908161028d5790505090506000604051806060016040528060348152602001610e8560349139905080826000815181106102d5576102d5610d01565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b8152509050808260018151811061031b5761031b610d01565b6020026020010181905250506000604051806060016040528060398152602001610feb603991399050808260028151811061035857610358610d01565b602090810291909101015250604082015260608201528152610378610a29565b6000808252735bda6e0c556955762ceab7c4dff7c5a381928835602080840191909152604080516060810190915260258082529091610f44908301396040830152506103c2610a4c565b60408051600080825260208201909252816103ed565b60608152602001906001900390816103d85790505b5082525060408051600380825260808201909252600091816020015b60608152602001906001900390816104095790505090506000604051806040016040528060148152602001734d6f6f20c3a9f09f9a80c3a9c3a9c3a94d4d204d60601b8152509050808260008151811061046557610465610d01565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b815250905080826001815181106104ab576104ab610d01565b6020026020010181905250506000604051806060016040528060218152602001610d1860219139905080826002815181106104e8576104e8610d01565b6020908102919091018101919091528301919091525060408051600280825260608201909252600091816020015b606081526020019060019003908161051657905050905060006040518060400160405280602081526020017f4d6f6f20c3a9f09f9a80c3a96f6f6f4d4d6f4d6f4dc3a94d6fc3a96ff09f9a808152509050808260008151811061057b5761057b610d01565b6020026020010181905250506000604051806080016040528060428152602001610f6960429139905080826001815181106105b8576105b8610d01565b602090810291909101015250808260026020020152506060820152808260016020020152506105e5610a29565b60018152734df7e949563b347015dd0def8ab899a6aa01fdaa602080830191909152604080518082018252601881527f4d6f6f20c3a9f09f9a80c3a9c3a96f4d204d6fc3a94d6f4d000000000000000092810192909252820152610647610a4c565b6040805160008082526020820190925281610672565b606081526020019060019003908161065d5790505b5082525060408051600480825260a08201909252600091816020015b606081526020019060019003908161068e57905050905060006040518060400160405280600c81526020016b026b7b79061d4f84fcd4037960a51b815250905080826000815181106106e2576106e2610d01565b6020026020010181905250506000604051806040016040528060148152602001734d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a960601b8152509050808260018151811061073357610733610d01565b60200260200101819052505060006040518060400160405280600d81526020016c4d6f6f20c3a9f09f9a8020c3a960981b8152509050808260028151811061077d5761077d610d01565b6020026020010181905250506000604051806080016040528060418152602001610f0360419139905080826003815181106107ba576107ba610d01565b6020908102919091018101919091528301919091525060408051600380825260808201909252600091816020015b60608152602001906001900390816107e85790505090506000604051806080016040528060558152602001610d39605591399050808260008151811061083057610830610d01565b60200260200101819052505060006040518060800160405280604e8152602001610e37604e91399050808260018151811061086d5761086d610d01565b6020026020010181905250506000604051806060016040528060238152602001610db360239139905080826002815181106108aa576108aa610d01565b602090810291909101810191909152604080850193909352606085019390935250830191909152828101919091529082528201526108e6610a73565b73634cf8866c2471e86379b50c5dbcc71f2b50a6368152610905610a92565b733f6247413d749e1ec92eddee08e58afe088d920281527367ac5ed51aa774710a0074fb495c56802ed0baba60208083019190915282810191909152604083810192909252815180830190925260148252734d6f6f20c3a9f09f9a806f6ff09f9a804d6f4d6f60601b908201526060820152919050565b6040518060800160405280606081526020016109966109b0565b81526020016109a3610a73565b8152602001606081525090565b60405180602001604052806001905b6109c76109dd565b8152602001906001900390816109bf5790505090565b6040805180820190915260008152602081016109f76109fc565b905290565b60405180606001604052806003905b610a13610a29565b815260200190600190039081610a0b5790505090565b604080516080810182526000808252602082015260609181018290529081016109f75b60405180606001604052806003905b6060815260200190600190039081610a5b5790505090565b604051806040016040528060006001600160a01b031681526020016109f75b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b81811015610ad657602081850181015186830182015201610aba565b81811115610ae8576000602083870101525b50601f01601f19169290920160200192915050565b80516001600160a01b03908116835260208083015181850160005b6002811015610b37578251851682529183019190830190600101610b18565b50505050505050565b602081526000825160c06020840152610b5c60e0840182610ab0565b602085810151858303601f190160408701529192508290810160005b6001811015610cc4578482038352835170ffffffffffffffffffffffffffffffffff19815116835260208101519050604060208401526040830160a0840160005b6003811015610cac57603f19868303018352835180511515835260018060a01b036020820151166020840152604081015160806040850152610bfe6080850182610ab0565b60609283015185820386850152929091508190810160005b6003811015610c8f578382038352845180518084526020918201918085019190600582901b86010160005b82811015610c7257601f19878303018452610c5d828651610ab0565b60209586019594909401939150600101610c41565b506020988901989690960195945050506001919091019050610c16565b506020978801979690960195945050506001919091019050610bb9565b50602096870196959095019493505050600101610b78565b5060408701519350610cd96060870185610afd565b6060870151868203601f190160c08801529350610cf68185610ab0565b979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806fc3a9c3a9c3a9c3a96f4d4dc3a9c3a96fc3a96f6f206f4d6f6f20c3a9f09f9a806f6f4d20c3a9f09f9a80c3a9f09f9a80206f6f20c3a9204dc3a9f09f9a806f4df09f9a804dc3a96ff09f9a804dc3a94df09f9a80f09f9a80f09f9a806ff09f9a804dc3a920206f6f6f6f204d6f6f20c3a9f09f9a80204dc3a9c3a92020f09f9a804d6f4d2020206f206f20c3a920204d4d6f6f20c3a9f09f9a806ff09f9a806f6f20f09f9a80c3a920c3a94d20c3a9f09f9a804d6f6f20c3a9f09f9a806f206f6f6f20c3a9c3a9c3a9c3a9206f6ff09f9a80c3a9f09f9a806f206f4d4df09f9a804d6f6f6fc3a9c3a920f09f9a80f09f9a80f09f9a80206f6f6ff09f9a804d20f09f9a80f09f9a80206f6fc3a96f6ff09f9a804d4d6f6f20c3a9f09f9a80c3a94d6f6ff09f9a80c3a9c3a94d6f206f20c3a920206f20c3a9c3a9f09f9a80206f6ff09f9a806f6fc3a96f206f206ff09f9a80206fc3a94d6ff09f9a80c3a9c3a9c3a94d6f6f20c3a9f09f9a80206f204df09f9a804d20f09f9a806f206ff09f9a80f09f9a80f09f9a80c3a94d206ff09f9a80c3a96f4d4d6f6f20c3a9f09f9a806f4dc3a9c3a9f09f9a80f09f9a80c3a920f09f9a806f6f6f2020f09f9a806f204d6f4d20f09f9a80c3a96ff09f9a80c3a96f6f4df09f9a806f4df09f9a80c3a94d6f6f20c3a9f09f9a804d6f6f6f6f4d6fc3a96fc3a96ff09f9a80f09f9a80c3a920206ff09f9a806f6f4d20c3a9c3a9c3a9c3a96f20204d6f6f20f09f9a80206f4d6f6f20c3a9f09f9a806f204d6f2020c3a9f09f9a80f09f9a80c3a9f09f9a80f09f9a80204d6f6f20c3a9f09f9a80c3a96f6f6f6ff09f9a80c3a94dc3a9c3a96f6f206fc3a920f09f9a804df09f9a806fc3a9f09f9a80c3a96f6f6fc3a9f09f9a804d20204d6f4d6f6f20c3a9f09f9a806f204d20c3a9f09f9a80204d4d6f6f6ff09f9a80f09f9a806ff09f9a80c3a96f4d4d206f206ff09f9a806f6fc3a9c3a94d206fc3a96f4d6f6f20c3a9f09f9a806fc3a94d4dc3a9f09f9a806f4d20c3a9f09f9a80c3a9c3a9f09f9a806f4d4df09f9a80f09f9a80204d6f6fc3a94d4d4d6f6f20c3a9f09f9a80c3a96ff09f9a806ff09f9a806ff09f9a806f6f204d206f6f4d6f6fc3a9f09f9a806f4d6fc3a96f6f20f09f9a806fc3a9f09f9a80f09f9a804d206ff09f9a806f6f4dc3a9c3a9f09f9a804dc3a96f6fc3a920c3a9c3a96f6fc3a9f09f9a80f09f9a80f09f9a80206fa26469706673582212204eb7f6a745320e516a4ac63298a5271e0edb5f7a96eb85f51f2bcb725b06fe3c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8205038c {\n bool s_0;\n address s_1;\n string s_2;\n string[][3] s_3;\n }\n\n struct S_f45a93f2 {\n bytes15 s_0;\n S_8205038c[3] s_1;\n }\n\n struct S_2ab2cf39 {\n address s_0;\n address[2] s_1;\n }\n\n struct S_9203f8cb {\n string s_0;\n S_f45a93f2[1] s_1;\n S_2ab2cf39 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_9203f8cb memory) {\n S_9203f8cb memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oMéé🚀🚀é 🚀ooo 🚀o MoM 🚀éo🚀éooM🚀oM🚀é\";\n r.s_0 = r_0;\n }\n {\n S_f45a93f2[1] memory r_1;\n {\n S_f45a93f2 memory r_1_0;\n {\n bytes15 r_1_0_0 = bytes15(0x93db45bbf1d25ef7b458c9ac9ae03c);\n r_1_0.s_0 = r_1_0_0;\n }\n {\n S_8205038c[3] memory r_1_0_1;\n {\n S_8205038c memory r_1_0_1_0;\n {\n bool r_1_0_1_0_0 = true;\n r_1_0_1_0.s_0 = r_1_0_1_0_0;\n }\n {\n address r_1_0_1_0_1 = 0x82f48CfEDCd65065bf606b1d57775b1c7BdF0129;\n r_1_0_1_0.s_1 = r_1_0_1_0_1;\n }\n {\n string memory r_1_0_1_0_2 = unicode\"Moo é🚀 Méé 🚀MoM o o é M\";\n r_1_0_1_0.s_2 = r_1_0_1_0_2;\n }\n {\n string[][3] memory r_1_0_1_0_3;\n {\n string[] memory r_1_0_1_0_3_0 = new string[](1);\n {\n string memory r_1_0_1_0_3_0_0 = unicode\"Moo é🚀 oo éMoo🚀 🚀é\";\n r_1_0_1_0_3_0[0] = r_1_0_1_0_3_0_0;\n }\n r_1_0_1_0_3[0] = r_1_0_1_0_3_0;\n }\n {\n string[] memory r_1_0_1_0_3_1 = new string[](3);\n {\n string memory r_1_0_1_0_3_1_0 = unicode\"Moo é🚀o ooo éééé oo🚀é🚀o oMM🚀Moooéé 🚀🚀🚀 ooo🚀M 🚀🚀 ooéoo🚀M\";\n r_1_0_1_0_3_1[0] = r_1_0_1_0_3_1_0;\n }\n {\n string memory r_1_0_1_0_3_1_1 = unicode\"Moo é🚀éo🚀o🚀o🚀oo M ooMooé🚀oMoéoo 🚀oé🚀🚀M o🚀ooMéé🚀Méooé ééooé🚀🚀🚀 o\";\n r_1_0_1_0_3_1[1] = r_1_0_1_0_3_1_1;\n }\n {\n string memory r_1_0_1_0_3_1_2 = unicode\"Moo é🚀o M é🚀 MMooo🚀🚀o🚀éoMM o o🚀ooééM oéo\";\n r_1_0_1_0_3_1[2] = r_1_0_1_0_3_1_2;\n }\n r_1_0_1_0_3[1] = r_1_0_1_0_3_1;\n }\n {\n string[] memory r_1_0_1_0_3_2 = new string[](3);\n {\n string memory r_1_0_1_0_3_2_0 = unicode\"Moo é🚀 o M🚀M 🚀o o🚀🚀🚀éM o🚀éoM\";\n r_1_0_1_0_3_2[0] = r_1_0_1_0_3_2_0;\n }\n {\n string memory r_1_0_1_0_3_2_1 = unicode\"Moo é🚀\";\n r_1_0_1_0_3_2[1] = r_1_0_1_0_3_2_1;\n }\n {\n string memory r_1_0_1_0_3_2_2 = unicode\"Moo é🚀oéMMé🚀oM é🚀éé🚀oMM🚀🚀 MooéMM\";\n r_1_0_1_0_3_2[2] = r_1_0_1_0_3_2_2;\n }\n r_1_0_1_0_3[2] = r_1_0_1_0_3_2;\n }\n r_1_0_1_0.s_3 = r_1_0_1_0_3;\n }\n r_1_0_1[0] = r_1_0_1_0;\n }\n {\n S_8205038c memory r_1_0_1_1;\n {\n bool r_1_0_1_1_0 = false;\n r_1_0_1_1.s_0 = r_1_0_1_1_0;\n }\n {\n address r_1_0_1_1_1 = 0x5bDA6E0C556955762ceaB7C4dFf7C5a381928835;\n r_1_0_1_1.s_1 = r_1_0_1_1_1;\n }\n {\n string memory r_1_0_1_1_2 = unicode\"Moo é🚀o Mo é🚀🚀é🚀🚀 \";\n r_1_0_1_1.s_2 = r_1_0_1_1_2;\n }\n {\n string[][3] memory r_1_0_1_1_3;\n {\n string[] memory r_1_0_1_1_3_0 = new string[](0);\n r_1_0_1_1_3[0] = r_1_0_1_1_3_0;\n }\n {\n string[] memory r_1_0_1_1_3_1 = new string[](3);\n {\n string memory r_1_0_1_1_3_1_0 = unicode\"Moo é🚀éééMM M\";\n r_1_0_1_1_3_1[0] = r_1_0_1_1_3_1_0;\n }\n {\n string memory r_1_0_1_1_3_1_1 = unicode\"Moo é🚀\";\n r_1_0_1_1_3_1[1] = r_1_0_1_1_3_1_1;\n }\n {\n string memory r_1_0_1_1_3_1_2 = unicode\"Moo é🚀oééééoMMééoéoo o\";\n r_1_0_1_1_3_1[2] = r_1_0_1_1_3_1_2;\n }\n r_1_0_1_1_3[1] = r_1_0_1_1_3_1;\n }\n {\n string[] memory r_1_0_1_1_3_2 = new string[](2);\n {\n string memory r_1_0_1_1_3_2_0 = unicode\"Moo é🚀éoooMMoMoMéMoéo🚀\";\n r_1_0_1_1_3_2[0] = r_1_0_1_1_3_2_0;\n }\n {\n string memory r_1_0_1_1_3_2_1 = unicode\"Moo é🚀éoooo🚀éMééoo oé 🚀M🚀oé🚀éoooé🚀M Mo\";\n r_1_0_1_1_3_2[1] = r_1_0_1_1_3_2_1;\n }\n r_1_0_1_1_3[2] = r_1_0_1_1_3_2;\n }\n r_1_0_1_1.s_3 = r_1_0_1_1_3;\n }\n r_1_0_1[1] = r_1_0_1_1;\n }\n {\n S_8205038c memory r_1_0_1_2;\n {\n bool r_1_0_1_2_0 = true;\n r_1_0_1_2.s_0 = r_1_0_1_2_0;\n }\n {\n address r_1_0_1_2_1 = 0x4dF7E949563B347015DD0dEf8Ab899a6aA01fdAa;\n r_1_0_1_2.s_1 = r_1_0_1_2_1;\n }\n {\n string memory r_1_0_1_2_2 = unicode\"Moo é🚀ééoM MoéMoM\";\n r_1_0_1_2.s_2 = r_1_0_1_2_2;\n }\n {\n string[][3] memory r_1_0_1_2_3;\n {\n string[] memory r_1_0_1_2_3_0 = new string[](0);\n r_1_0_1_2_3[0] = r_1_0_1_2_3_0;\n }\n {\n string[] memory r_1_0_1_2_3_1 = new string[](4);\n {\n string memory r_1_0_1_2_3_1_0 = unicode\"Moo é🚀o \";\n r_1_0_1_2_3_1[0] = r_1_0_1_2_3_1_0;\n }\n {\n string memory r_1_0_1_2_3_1_1 = unicode\"Moo é🚀oé🚀Mé\";\n r_1_0_1_2_3_1[1] = r_1_0_1_2_3_1_1;\n }\n {\n string memory r_1_0_1_2_3_1_2 = unicode\"Moo é🚀 é\";\n r_1_0_1_2_3_1[2] = r_1_0_1_2_3_1_2;\n }\n {\n string memory r_1_0_1_2_3_1_3 = unicode\"Moo é🚀MooooMoéoéo🚀🚀é o🚀ooM ééééo Moo 🚀 o\";\n r_1_0_1_2_3_1[3] = r_1_0_1_2_3_1_3;\n }\n r_1_0_1_2_3[1] = r_1_0_1_2_3_1;\n }\n {\n string[] memory r_1_0_1_2_3_2 = new string[](3);\n {\n string memory r_1_0_1_2_3_2_0 = unicode\"Moo é🚀ooM é🚀é🚀 oo é Mé🚀oM🚀Méo🚀MéM🚀🚀🚀o🚀Mé oooo \";\n r_1_0_1_2_3_2[0] = r_1_0_1_2_3_2_0;\n }\n {\n string memory r_1_0_1_2_3_2_1 = unicode\"Moo é🚀éMoo🚀ééMo o é o éé🚀 oo🚀ooéo o o🚀 oéMo🚀ééé\";\n r_1_0_1_2_3_2[1] = r_1_0_1_2_3_2_1;\n }\n {\n string memory r_1_0_1_2_3_2_2 = unicode\"Moo é🚀o🚀oo 🚀é éM é🚀\";\n r_1_0_1_2_3_2[2] = r_1_0_1_2_3_2_2;\n }\n r_1_0_1_2_3[2] = r_1_0_1_2_3_2;\n }\n r_1_0_1_2.s_3 = r_1_0_1_2_3;\n }\n r_1_0_1[2] = r_1_0_1_2;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n S_2ab2cf39 memory r_2;\n {\n address r_2_0 = 0x634cF8866c2471E86379B50C5DBcc71F2b50A636;\n r_2.s_0 = r_2_0;\n }\n {\n address[2] memory r_2_1;\n {\n address r_2_1_0 = 0x3f6247413d749e1eC92EDDee08E58aFE088d9202;\n r_2_1[0] = r_2_1_0;\n }\n {\n address r_2_1_1 = 0x67ac5ed51Aa774710A0074fb495C56802ed0baBa;\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀oo🚀MoMo\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000634cf8866c2471e86379b50c5dbcc71f2b50a6360000000000000000000000003f6247413d749e1ec92eddee08e58afe088d920200000000000000000000000067ac5ed51aa774710a0074fb495c56802ed0baba0000000000000000000000000000000000000000000000000000000000001040000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f4dc3a9c3a9f09f9a80f09f9a80c3a920f09f9a806f6f6f2020f09f9a806f204d6f4d20f09f9a80c3a96ff09f9a80c3a96f6f4df09f9a806f4df09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002093db45bbf1d25ef7b458c9ac9ae03c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082f48cfedcd65065bf606b1d57775b1c7bdf0129000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a80204dc3a9c3a92020f09f9a804d6f4d2020206f206f20c3a920204d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80206f6f20c3a94d6f6ff09f9a8020f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a806f206f6f6f20c3a9c3a9c3a9c3a9206f6ff09f9a80c3a9f09f9a806f206f4d4df09f9a804d6f6f6fc3a9c3a920f09f9a80f09f9a80f09f9a80206f6f6ff09f9a804d20f09f9a80f09f9a80206f6fc3a96f6ff09f9a804d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000724d6f6f20c3a9f09f9a80c3a96ff09f9a806ff09f9a806ff09f9a806f6f204d206f6f4d6f6fc3a9f09f9a806f4d6fc3a96f6f20f09f9a806fc3a9f09f9a80f09f9a804d206ff09f9a806f6f4dc3a9c3a9f09f9a804dc3a96f6fc3a920c3a9c3a96f6fc3a9f09f9a80f09f9a80f09f9a80206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a806f204d20c3a9f09f9a80204d4d6f6f6ff09f9a80f09f9a806ff09f9a80c3a96f4d4d206f206ff09f9a806f6fc3a9c3a94d206fc3a96f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a80206f204df09f9a804d20f09f9a806f206ff09f9a80f09f9a80f09f9a80c3a94d206ff09f9a80c3a96f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806fc3a94d4dc3a9f09f9a806f4d20c3a9f09f9a80c3a9c3a9f09f9a806f4d4df09f9a80f09f9a80204d6f6fc3a94d4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bda6e0c556955762ceab7c4dff7c5a381928835000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806f204d6f2020c3a9f09f9a80f09f9a80c3a9f09f9a80f09f9a80200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a80c3a9c3a9c3a94d4d204d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a806fc3a9c3a9c3a9c3a96f4d4dc3a9c3a96fc3a96f6f206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a80c3a96f6f6f4d4d6f4d6f4dc3a94d6fc3a96ff09f9a8000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80c3a96f6f6f6ff09f9a80c3a94dc3a9c3a96f6f206fc3a920f09f9a804df09f9a806fc3a9f09f9a80c3a96f6f6fc3a9f09f9a804d20204d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000004df7e949563b347015dd0def8ab899a6aa01fdaa000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80c3a9c3a96f4d204d6fc3a94d6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a806f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a8020c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a804d6f6f6f6f4d6fc3a96fc3a96ff09f9a80f09f9a80c3a920206ff09f9a806f6f4d20c3a9c3a9c3a9c3a96f20204d6f6f20f09f9a80206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806f6f4d20c3a9f09f9a80c3a9f09f9a80206f6f20c3a9204dc3a9f09f9a806f4df09f9a804dc3a96ff09f9a804dc3a94df09f9a80f09f9a80f09f9a806ff09f9a804dc3a920206f6f6f6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a80c3a94d6f6ff09f9a80c3a9c3a94d6f206f20c3a920206f20c3a9c3a9f09f9a80206f6ff09f9a806f6fc3a96f206f206ff09f9a80206fc3a94d6ff09f9a80c3a9c3a9c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806ff09f9a806f6f20f09f9a80c3a920c3a94d20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806f6ff09f9a804d6f4d6f000000000000000000000000" + }, + { + "name": "random-(string,(string),bytes20[],string,(bool,bytes29,((address),uint200,uint48,int120,bytes11),uint8))[1]", + "type": "(string,(string),bytes20[],string,(bool,bytes29,((address),uint200,uint48,int120,bytes11),uint8))[1]", + "value": [ + [ + "Moo é🚀M 🚀MooéMMo", + ["Moo é🚀M🚀🚀éo"], + [ + "0x19ef5f9cf0d3f035da12b12d73c4c63148bbb79a", + "0x369318c17702729ea7b06f5e464698305b3a7675", + "0x90df78bc128c9c32e1cac02938d1a09e8fd02b35" + ], + "Moo é🚀é🚀🚀", + [ + true, + "0xfa99041c32bcc7ff0c463f59816b7486ce5a7ab76ac103e28503bfd22a", + [ + ["0xD11cf919f8Cbab59479dd9D8c73e3f1d08ba6404"], + "1521341453638934311885508631277296040204198640852816840625044", + "158869959867570", + "617178504167975460931480648441433358", + "0x5bedc96093fb42b4f57bcb" + ], + "27" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M 🚀MooéMMo" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M🚀🚀éo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x19ef5f9cf0d3f035da12b12d73c4c63148bbb79a" + }, + { + "type": "hexstring", + "value": "0x369318c17702729ea7b06f5e464698305b3a7675" + }, + { + "type": "hexstring", + "value": "0x90df78bc128c9c32e1cac02938d1a09e8fd02b35" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é🚀🚀" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xfa99041c32bcc7ff0c463f59816b7486ce5a7ab76ac103e28503bfd22a" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD11cf919f8Cbab59479dd9D8c73e3f1d08ba6404" + } + ] + }, + { + "type": "number", + "value": "1521341453638934311885508631277296040204198640852816840625044" + }, + { + "type": "number", + "value": "158869959867570" + }, + { + "type": "number", + "value": "617178504167975460931480648441433358" + }, + { + "type": "hexstring", + "value": "0x5bedc96093fb42b4f57bcb" + } + ] + }, + { + "type": "number", + "value": "27" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105f2806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061042c565b60405180910390f35b61005661030f565b61005e61030f565b61006661033c565b604080518082018252601881527f4d6f6f20c3a9f09f9a804d20f09f9a804d6f6fc3a94d4d6f000000000000000060208083019190915290835281518082018352606081528251808401845260168152754d6f6f20c3a9f09f9a804df09f9a80f09f9a80c3a96f60501b81840152815290830152805160038082526080820190925260009181602001602082028036833750508151919250730cf7afce7869f81aed095896b9e26318a45ddbcd60611b91829150839060009061012b5761012b6105a6565b6001600160601b03199092166020928302919091019091015250805173369318c17702729ea7b06f5e464698305b3a767560601b90819083906001908110610175576101756105a6565b6001600160601b0319909216602092830291909101909101525080517390df78bc128c9c32e1cac02938d1a09e8fd02b3560601b908190839060029081106101bf576101bf6105a6565b6001600160601b0319909216602092830291909101820152604080850193909352825180840190935260148352729adede418753e13f35018753e13f3501e13f3560671b90830152506060820152610215610384565b600181527ffa99041c32bcc7ff0c463f59816b7486ce5a7ab76ac103e28503bfd22a00000060208201526102766040805160c081018252600060a0820181815282526020820181905291810182905260608101829052608081019190915290565b604080516020808201835273d11cf919f8cbab59479dd9d8c73e3f1d08ba6404825290835278f25d19e54958712c8c1e81f24f48433dfa861b14c95bf00b949083015265907dcb85fcb2828201526e76dd3fe54c3a2f65886709df908d0e6060808401919091526a5bedc96093fb42b4f57bcb60a81b60808085019190915291840192909252601b918301919091528201528152919050565b60405180602001604052806001905b61032661033c565b81526020019060019003908161031e5790505090565b6040518060a00160405280606081526020016103646040518060200160405280606081525090565b8152602001606081526020016060815260200161037f610384565b905290565b60408051608081018252600080825260208201529081016103d26040805160c081018252600060a0820181815282526020820181905291810182905260608101829052608081019190915290565b8152600060209091015290565b6000815180845260005b81811015610405576020818501810151868301820152016103e9565b81811115610417576000602083870101525b50601f01601f19169290920160200192915050565b602080825260009060408382018185018685805b600180821061044f5750610598565b601f198a86030186528351610180815181885261046e828901826103df565b838c01518982038a8e0152518c8252909250905061048e8b8301826103df565b838b01518982038a8d01528051808352908d019350879250908c01905b808310156104d25783516001600160601b0319168252928c019291850191908c01906104ab565b5060609450848401519250888103858a01526104ee81846103df565b608094850151805115158b87015260208082015162ffffff191660a08d01526040808301518051516001600160a01b031660c08f0152918201516001600160c81b031660e08e015281015165ffffffffffff166101008d0152606080820151600e0b6101208e0152908701516001600160a81b0319166101408d015281015160ff166101608c0152909550939250610584915050565b505094870194935091860191600101610440565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220d25dd9b7710cd9c5fb72902f17cafd228ee90cfb9f740fc5c9e244f5d555ecd064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_561ac612 {\n S_421683f8 s_0;\n uint200 s_1;\n uint48 s_2;\n int120 s_3;\n bytes11 s_4;\n }\n\n struct S_3f844a37 {\n bool s_0;\n bytes29 s_1;\n S_561ac612 s_2;\n uint8 s_3;\n }\n\n struct S_a45df11a {\n string s_0;\n S_97fc4627 s_1;\n bytes20[] s_2;\n string s_3;\n S_3f844a37 s_4;\n }\n\n function test () public pure returns (S_a45df11a[1] memory) {\n S_a45df11a[1] memory r;\n {\n S_a45df11a memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀M 🚀MooéMMo\";\n r_0.s_0 = r_0_0;\n }\n {\n S_97fc4627 memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀M🚀🚀éo\";\n r_0_1.s_0 = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n bytes20[] memory r_0_2 = new bytes20[](3);\n {\n bytes20 r_0_2_0 = bytes20(0x19Ef5F9cf0d3F035DA12B12D73c4c63148BBB79a);\n r_0_2[0] = r_0_2_0;\n }\n {\n bytes20 r_0_2_1 = bytes20(0x369318C17702729EA7b06F5e464698305B3a7675);\n r_0_2[1] = r_0_2_1;\n }\n {\n bytes20 r_0_2_2 = bytes20(0x90Df78Bc128C9c32e1caC02938d1a09E8fD02b35);\n r_0_2[2] = r_0_2_2;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀é🚀🚀\";\n r_0.s_3 = r_0_3;\n }\n {\n S_3f844a37 memory r_0_4;\n {\n bool r_0_4_0 = true;\n r_0_4.s_0 = r_0_4_0;\n }\n {\n bytes29 r_0_4_1 = bytes29(0xfa99041c32bcc7ff0c463f59816b7486ce5a7ab76ac103e28503bfd22a);\n r_0_4.s_1 = r_0_4_1;\n }\n {\n S_561ac612 memory r_0_4_2;\n {\n S_421683f8 memory r_0_4_2_0;\n {\n address r_0_4_2_0_0 = 0xD11cf919f8Cbab59479dd9D8c73e3f1d08ba6404;\n r_0_4_2_0.s_0 = r_0_4_2_0_0;\n }\n r_0_4_2.s_0 = r_0_4_2_0;\n }\n {\n uint200 r_0_4_2_1 = 1521341453638934311885508631277296040204198640852816840625044;\n r_0_4_2.s_1 = r_0_4_2_1;\n }\n {\n uint48 r_0_4_2_2 = 158869959867570;\n r_0_4_2.s_2 = r_0_4_2_2;\n }\n {\n int120 r_0_4_2_3 = 617178504167975460931480648441433358;\n r_0_4_2.s_3 = r_0_4_2_3;\n }\n {\n bytes11 r_0_4_2_4 = bytes11(0x5bedc96093fb42b4f57bcb);\n r_0_4_2.s_4 = r_0_4_2_4;\n }\n r_0_4.s_2 = r_0_4_2;\n }\n {\n uint8 r_0_4_3 = 27;\n r_0_4.s_3 = r_0_4_3;\n }\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000001fa99041c32bcc7ff0c463f59816b7486ce5a7ab76ac103e28503bfd22a000000000000000000000000000000d11cf919f8cbab59479dd9d8c73e3f1d08ba640400000000000000f25d19e54958712c8c1e81f24f48433dfa861b14c95bf00b940000000000000000000000000000000000000000000000000000907dcb85fcb2000000000000000000000000000000000076dd3fe54c3a2f65886709df908d0e5bedc96093fb42b4f57bcb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a804d20f09f9a804d6f6fc3a94d4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a804df09f9a80f09f9a80c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000319ef5f9cf0d3f035da12b12d73c4c63148bbb79a000000000000000000000000369318c17702729ea7b06f5e464698305b3a767500000000000000000000000090df78bc128c9c32e1cac02938d1a09e8fd02b3500000000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80000000000000000000000000" + }, + { + "name": "random-(string,int16,(address,(string,address,bool,(address),bytes3[1])[3],address,bytes25,bytes7),bool)", + "type": "(string,int16,(address,(string,address,bool,(address),bytes3[1])[3],address,bytes25,bytes7),bool)", + "value": [ + "Moo é🚀o oM🚀 é🚀o 🚀 oéé🚀 éM o ", + "16406", + [ + "0x00c11862B560cD6D47a766130aCd18942485f62A", + [ + [ + "Moo é🚀o o", + "0xd1526Bd986fe16558B096A4170102085c26B266A", + false, + ["0x2e95b869cAc1BF986b1c1989cC08d26f2Be588B6"], + ["0x3f5529"] + ], + [ + "Moo é🚀MM oM oMéMMo 🚀o🚀o éM🚀", + "0x4A3F1F2a177C6E013332762D88dE7866b1579cF8", + false, + ["0xAb6662aD636e480d7D95392aa0c173cde89C9239"], + ["0x5bb6fc"] + ], + [ + "Moo é🚀🚀 🚀oo🚀 o éMM🚀Mooo🚀MéMo🚀oé🚀 o M🚀🚀oo🚀MoMoé🚀🚀", + "0x504551ecf77bbb7208A098b2E5904118A0d8CC81", + false, + ["0x73e8F5e502e02F0F8929091db35feFf952D9Da3D"], + ["0x1a89df"] + ] + ], + "0xc3D05677e84486ceBe21CBCef715b11c27C7cB8d", + "0xc47eed3655d71f6d1a14ffab812e350aed6f70eebb22cd0d7f", + "0x436d7c3e2d0528" + ], + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oM🚀 é🚀o 🚀 oéé🚀 éM o " + }, + { + "type": "number", + "value": "16406" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x00c11862B560cD6D47a766130aCd18942485f62A" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o o" + }, + { + "type": "address", + "value": "0xd1526Bd986fe16558B096A4170102085c26B266A" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2e95b869cAc1BF986b1c1989cC08d26f2Be588B6" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3f5529" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM oM oMéMMo 🚀o🚀o éM🚀" + }, + { + "type": "address", + "value": "0x4A3F1F2a177C6E013332762D88dE7866b1579cF8" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xAb6662aD636e480d7D95392aa0c173cde89C9239" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5bb6fc" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 🚀oo🚀 o éMM🚀Mooo🚀MéMo🚀oé🚀 o M🚀🚀oo🚀MoMoé🚀🚀" + }, + { + "type": "address", + "value": "0x504551ecf77bbb7208A098b2E5904118A0d8CC81" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x73e8F5e502e02F0F8929091db35feFf952D9Da3D" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1a89df" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xc3D05677e84486ceBe21CBCef715b11c27C7cB8d" + }, + { + "type": "hexstring", + "value": "0xc47eed3655d71f6d1a14ffab812e350aed6f70eebb22cd0d7f" + }, + { + "type": "hexstring", + "value": "0x436d7c3e2d0528" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610661806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610428565b60405180910390f35b6100566102c9565b61005e6102c9565b600060405180606001604052806031815260200161057360319139825250614016602082015261008c6102f6565b72c11862b560cd6d47a766130acd18942485f62a81526100aa610334565b6100b2610361565b604080518082018252600f81526e4d6f6f20c3a9f09f9a806f2020206f60881b60208083019190915290835273d1526bd986fe16558b096a4170102085c26b266a838201526000838301528151908101909152732e95b869cac1bf986b1c1989cc08d26f2be588b6815260608201526101296103bd565b623f552960e81b815260808201528152610141610361565b60006040518060600160405280602b81526020016105a4602b9139825250734a3f1f2a177c6e013332762d88de7866b1579cf860208083019190915260006040808401919091528051918201905273ab6662ad636e480d7d95392aa0c173cde89c9239815260608201526101b36103bd565b6216edbf60ea1b8152608082015260208201526101ce610361565b60006040518060800160405280605d81526020016105cf605d913982525073504551ecf77bbb7208a098b2e5904118a0d8cc816020808301919091526000604080840191909152805191820190527373e8f5e502e02f0f8929091db35feff952d9da3d815260608201526102406103bd565b621a89df60e81b8152608082810191909152604080840192909252602084019290925273c3d05677e84486cebe21cbcef715b11c27c7cb8d838201527fc47eed3655d71f6d1a14ffab812e350aed6f70eebb22cd0d7f0000000000000060608085019190915266086daf87c5a0a560cb1b92840192909252830191909152600190820152919050565b6040805160808101825260608152600060208201529081016102e96102f6565b8152600060209091015290565b6040518060a0016040528060006001600160a01b03168152602001610319610334565b81526000602082018190526040820181905260609091015290565b60405180606001604052806003905b61034b610361565b8152602001906001900390816103435790505090565b6040518060a001604052806060815260200160006001600160a01b031681526020016000151581526020016103ab604051806020016040528060006001600160a01b031681525090565b81526020016103b86103bd565b905290565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b81811015610401576020818501810151868301820152016103e5565b81811115610413576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516080808386015261044560a08601836103db565b9150828601516040600182810b828901528189015192506060601f1989870301818a015260a0860160018060a01b038086511688528886015160a08a8a0152828390506101008a01935060005b600381101561052057609f198b86030182528251805160a087526104b960a08801826103db565b9050858e830151168e8801528982015115158a88015285888301515116888801528b82015191508b870160005b8a81101561050b5783516001600160e81b0319168252928f0192908f01908a016104e6565b509096505050918b0191908b01908601610492565b50505050838501516001600160a01b0316938701939093528084015166ffffffffffffff191681870152928401516001600160c81b03191694840194909452960151151594019390935250919291505056fe4d6f6f20c3a9f09f9a806f20206f4df09f9a8020c3a9f09f9a806f20f09f9a80206fc3a9c3a9f09f9a8020c3a94d206f204d6f6f20c3a9f09f9a804d4d206f4d206f4dc3a94d4d6f20f09f9a806ff09f9a806f2020c3a94df09f9a804d6f6f20c3a9f09f9a80f09f9a802020f09f9a806f6ff09f9a80206f20c3a94d4df09f9a804d6f6f6ff09f9a804dc3a94d6ff09f9a806fc3a9f09f9a80206f204df09f9a80f09f9a806f6ff09f9a804d6f4d6fc3a9f09f9a80f09f9a80a26469706673582212200579b7b996c149469f4d151831cb734003e6e71cdcd06d18966549673e4e977364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_ec6fe6ab {\n string s_0;\n address s_1;\n bool s_2;\n S_421683f8 s_3;\n bytes3[1] s_4;\n }\n\n struct S_5163e452 {\n address s_0;\n S_ec6fe6ab[3] s_1;\n address s_2;\n bytes25 s_3;\n bytes7 s_4;\n }\n\n struct S_bfd257f8 {\n string s_0;\n int16 s_1;\n S_5163e452 s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_bfd257f8 memory) {\n S_bfd257f8 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀o oM🚀 é🚀o 🚀 oéé🚀 éM o \";\n r.s_0 = r_0;\n }\n {\n int16 r_1 = 16406;\n r.s_1 = r_1;\n }\n {\n S_5163e452 memory r_2;\n {\n address r_2_0 = 0x00c11862B560cD6D47a766130aCd18942485f62A;\n r_2.s_0 = r_2_0;\n }\n {\n S_ec6fe6ab[3] memory r_2_1;\n {\n S_ec6fe6ab memory r_2_1_0;\n {\n string memory r_2_1_0_0 = unicode\"Moo é🚀o o\";\n r_2_1_0.s_0 = r_2_1_0_0;\n }\n {\n address r_2_1_0_1 = 0xd1526Bd986fe16558B096A4170102085c26B266A;\n r_2_1_0.s_1 = r_2_1_0_1;\n }\n {\n bool r_2_1_0_2 = false;\n r_2_1_0.s_2 = r_2_1_0_2;\n }\n {\n S_421683f8 memory r_2_1_0_3;\n {\n address r_2_1_0_3_0 = 0x2e95b869cAc1BF986b1c1989cC08d26f2Be588B6;\n r_2_1_0_3.s_0 = r_2_1_0_3_0;\n }\n r_2_1_0.s_3 = r_2_1_0_3;\n }\n {\n bytes3[1] memory r_2_1_0_4;\n {\n bytes3 r_2_1_0_4_0 = bytes3(0x3f5529);\n r_2_1_0_4[0] = r_2_1_0_4_0;\n }\n r_2_1_0.s_4 = r_2_1_0_4;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n S_ec6fe6ab memory r_2_1_1;\n {\n string memory r_2_1_1_0 = unicode\"Moo é🚀MM oM oMéMMo 🚀o🚀o éM🚀\";\n r_2_1_1.s_0 = r_2_1_1_0;\n }\n {\n address r_2_1_1_1 = 0x4A3F1F2a177C6E013332762D88dE7866b1579cF8;\n r_2_1_1.s_1 = r_2_1_1_1;\n }\n {\n bool r_2_1_1_2 = false;\n r_2_1_1.s_2 = r_2_1_1_2;\n }\n {\n S_421683f8 memory r_2_1_1_3;\n {\n address r_2_1_1_3_0 = 0xAb6662aD636e480d7D95392aa0c173cde89C9239;\n r_2_1_1_3.s_0 = r_2_1_1_3_0;\n }\n r_2_1_1.s_3 = r_2_1_1_3;\n }\n {\n bytes3[1] memory r_2_1_1_4;\n {\n bytes3 r_2_1_1_4_0 = bytes3(0x5bb6fc);\n r_2_1_1_4[0] = r_2_1_1_4_0;\n }\n r_2_1_1.s_4 = r_2_1_1_4;\n }\n r_2_1[1] = r_2_1_1;\n }\n {\n S_ec6fe6ab memory r_2_1_2;\n {\n string memory r_2_1_2_0 = unicode\"Moo é🚀🚀 🚀oo🚀 o éMM🚀Mooo🚀MéMo🚀oé🚀 o M🚀🚀oo🚀MoMoé🚀🚀\";\n r_2_1_2.s_0 = r_2_1_2_0;\n }\n {\n address r_2_1_2_1 = 0x504551ecf77bbb7208A098b2E5904118A0d8CC81;\n r_2_1_2.s_1 = r_2_1_2_1;\n }\n {\n bool r_2_1_2_2 = false;\n r_2_1_2.s_2 = r_2_1_2_2;\n }\n {\n S_421683f8 memory r_2_1_2_3;\n {\n address r_2_1_2_3_0 = 0x73e8F5e502e02F0F8929091db35feFf952D9Da3D;\n r_2_1_2_3.s_0 = r_2_1_2_3_0;\n }\n r_2_1_2.s_3 = r_2_1_2_3;\n }\n {\n bytes3[1] memory r_2_1_2_4;\n {\n bytes3 r_2_1_2_4_0 = bytes3(0x1a89df);\n r_2_1_2_4[0] = r_2_1_2_4_0;\n }\n r_2_1_2.s_4 = r_2_1_2_4;\n }\n r_2_1[2] = r_2_1_2;\n }\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0xc3D05677e84486ceBe21CBCef715b11c27C7cB8d;\n r_2.s_2 = r_2_2;\n }\n {\n bytes25 r_2_3 = bytes25(0xc47eed3655d71f6d1a14ffab812e350aed6f70eebb22cd0d7f);\n r_2.s_3 = r_2_3;\n }\n {\n bytes7 r_2_4 = bytes7(0x436d7c3e2d0528);\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000401600000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806f20206f4df09f9a8020c3a9f09f9a806f20f09f9a80206fc3a9c3a9f09f9a8020c3a94d206f2000000000000000000000000000000000000000000000000000000000c11862b560cd6d47a766130acd18942485f62a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000c3d05677e84486cebe21cbcef715b11c27c7cb8dc47eed3655d71f6d1a14ffab812e350aed6f70eebb22cd0d7f00000000000000436d7c3e2d05280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000d1526bd986fe16558b096a4170102085c26b266a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e95b869cac1bf986b1c1989cc08d26f2be588b63f55290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a806f2020206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000004a3f1f2a177c6e013332762d88de7866b1579cf80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab6662ad636e480d7d95392aa0c173cde89c92395bb6fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a804d4d206f4d206f4dc3a94d4d6f20f09f9a806ff09f9a806f2020c3a94df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000504551ecf77bbb7208a098b2e5904118a0d8cc81000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073e8f5e502e02f0f8929091db35feff952d9da3d1a89df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a80f09f9a802020f09f9a806f6ff09f9a80206f20c3a94d4df09f9a804d6f6f6ff09f9a804dc3a94d6ff09f9a806fc3a9f09f9a80206f204df09f9a80f09f9a806f6ff09f9a804d6f4d6fc3a9f09f9a80f09f9a80000000" + }, + { + "name": "random-(uint16[],(address,uint184,address,string)[4],address[3],(string,string,(bytes29,bytes27),bytes6))", + "type": "(uint16[],(address,uint184,address,string)[4],address[3],(string,string,(bytes29,bytes27),bytes6))", + "value": [ + ["49973", "52712", "27558"], + [ + [ + "0xa997ae99319d4d5f78001116304B85963CFD598a", + "22352808840010289842302397066752508338424843837075798122", + "0x437c4AA417145B8550CB480a73690dc14b69C7cC", + "Moo é🚀M ooMooé Moo🚀éMo🚀éoé🚀🚀🚀é🚀 Mo🚀 MMo" + ], + [ + "0xbA4bc495f2EA2017b703f7EF1FCBBB762Fd05Bae", + "20670249487535512276558324215094809644232506495339701687", + "0x99A6715055006E3de8D49f47F5dEA681b7C3f3e0", + "Moo é🚀oMooo🚀" + ], + [ + "0xd5eCfc2Ea1f253CeecBbEeF73E6004a2a48E4b38", + "22294945854463320255348459051974076724187677082649948436", + "0x6F5d882Aac2Ac4D0421443b56141D09e9B9Fc125", + "Moo é🚀o o ooo🚀éoooM 🚀🚀MéMo " + ], + [ + "0x04Ee2A1Cbdeba468344e2f97F548158c56B05Fd3", + "18784143715623195643577902658013427953297211858112924806", + "0x8D8630F191BD85750907e1fdE246FF405c871be5", + "Moo é🚀 🚀oM🚀🚀éMo🚀MM Mo🚀🚀 ooMooo éo oM 🚀oéMM🚀o" + ] + ], + [ + "0x02065635c53aB63b284A3381EBAE147D6bB13968", + "0x40940924E49087322b82B969d6777Ba4375A0315", + "0xB6752997639B8CEF0dc3b5b4996d85a5F7a8D390" + ], + [ + "Moo é🚀🚀éo MMMo Méoéo 🚀o ééMMéooéoMMooé ", + "Moo é🚀ooééo éé oM🚀 ooéo Mo o oooM oéo🚀Moo🚀M Mo🚀🚀o oooo", + [ + "0x9d28efccf33e1e24bccddc68c1a9053189e4bdc88eed904105a620bdd3", + "0x491d8567619599200340e91e36443eb838636ef1834e1e604e17bd" + ], + "0x5299a0863036" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "49973" + }, + { + "type": "number", + "value": "52712" + }, + { + "type": "number", + "value": "27558" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa997ae99319d4d5f78001116304B85963CFD598a" + }, + { + "type": "number", + "value": "22352808840010289842302397066752508338424843837075798122" + }, + { + "type": "address", + "value": "0x437c4AA417145B8550CB480a73690dc14b69C7cC" + }, + { + "type": "string", + "value": "Moo é🚀M ooMooé Moo🚀éMo🚀éoé🚀🚀🚀é🚀 Mo🚀 MMo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xbA4bc495f2EA2017b703f7EF1FCBBB762Fd05Bae" + }, + { + "type": "number", + "value": "20670249487535512276558324215094809644232506495339701687" + }, + { + "type": "address", + "value": "0x99A6715055006E3de8D49f47F5dEA681b7C3f3e0" + }, + { + "type": "string", + "value": "Moo é🚀oMooo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd5eCfc2Ea1f253CeecBbEeF73E6004a2a48E4b38" + }, + { + "type": "number", + "value": "22294945854463320255348459051974076724187677082649948436" + }, + { + "type": "address", + "value": "0x6F5d882Aac2Ac4D0421443b56141D09e9B9Fc125" + }, + { + "type": "string", + "value": "Moo é🚀o o ooo🚀éoooM 🚀🚀MéMo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x04Ee2A1Cbdeba468344e2f97F548158c56B05Fd3" + }, + { + "type": "number", + "value": "18784143715623195643577902658013427953297211858112924806" + }, + { + "type": "address", + "value": "0x8D8630F191BD85750907e1fdE246FF405c871be5" + }, + { + "type": "string", + "value": "Moo é🚀 🚀oM🚀🚀éMo🚀MM Mo🚀🚀 ooMooo éo oM 🚀oéMM🚀o" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x02065635c53aB63b284A3381EBAE147D6bB13968" + }, + { + "type": "address", + "value": "0x40940924E49087322b82B969d6777Ba4375A0315" + }, + { + "type": "address", + "value": "0xB6752997639B8CEF0dc3b5b4996d85a5F7a8D390" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éo MMMo Méoéo 🚀o ééMMéooéoMMooé " + }, + { + "type": "string", + "value": "Moo é🚀ooééo éé oM🚀 ooéo Mo o oooM oéo🚀Moo🚀M Mo🚀🚀o oooo" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9d28efccf33e1e24bccddc68c1a9053189e4bdc88eed904105a620bdd3" + }, + { + "type": "hexstring", + "value": "0x491d8567619599200340e91e36443eb838636ef1834e1e604e17bd" + } + ] + }, + { + "type": "hexstring", + "value": "0x5299a0863036" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610948806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610712565b60405180910390f35b6100566104a8565b61005e6104a8565b6040805160038082526080820190925260009160208201606080368337019050509050600061c3359050808260008151811061009c5761009c6107b6565b602002602001019061ffff16908161ffff168152505050600061cde8905080826001815181106100ce576100ce6107b6565b602002602001019061ffff16908161ffff1681525050506000616ba690508082600281518110610100576101006107b6565b61ffff9092166020928302919091019091015250815261011e6104e1565b604080516080808201835260608083015273a997ae99319d4d5f78001116304b85963cfd598a825276e95fcc739b489ed254c80862bcefb6dd5c83fed172b86a60208084019190915273437c4aa417145b8550cb480a73690dc14b69c7cc838501528351918201909352604680825291926000929061087d90830139606083015250808260006020020152506101d3604080516080810182526000808252602082018190529181019190915260608082015290565b73ba4bc495f2ea2017b703f7ef1fcbbb762fd05bae815276d7ceb6a00304eb1d36e62a93652e03722fa1978be1a5b76020808301919091527399a6715055006e3de8d49f47f5dea681b7c3f3e06040808401919091528051808201825260138152719adede418753e13f3500de9adededfe13f35606f1b8184015260608085019190915284830193909352805160808101825280840184905273d5ecfc2ea1f253ceecbbeef73e6004a2a48e4b38815276e8c524fd820f8ac5feba048a31d2c1244c4be8f824f11481840152736f5d882aac2ac4d0421443b56141d09e9b9fc125818301528151938401909152602a80845290926000929091906107cd908301396060830152508082600260200201525061030d604080516080810182526000808252602082018190529181019190915260608082015290565b7304ee2a1cbdeba468344e2f97f548158c56b05fd3815276c41d98afcb8097d5423f370a10373c0eaa86a5aefecc86602080830191909152738d8630f191bd85750907e1fde246ff405c871be5604080840191909152805160808101909152604c8082526000926107f790830139606083810191909152830191909152506020820152610398610526565b7302065635c53ab63b284a3381ebae147d6bb1396881527340940924e49087322b82b969d6777ba4375a0315602082015273b6752997639b8cef0dc3b5b4996d85a5f7a8d3906040808301919091528201526103f2610544565b60006040518060600160405280603a8152602001610843603a913982525060408051608081019091526050808252600091906108c360208301396020838101919091526040805180820182527f9d28efccf33e1e24bccddc68c1a9053189e4bdc88eed904105a620bdd300000081527f491d8567619599200340e91e36443eb838636ef1834e1e604e17bd0000000000928101929092528301525065294cd043181b60d11b606080830191909152820152919050565b6040518060800160405280606081526020016104c26104e1565b81526020016104cf610526565b81526020016104dc610544565b905290565b60405180608001604052806004905b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816104f05790505090565b60405180606001604052806003906020820280368337509192915050565b604051806080016040528060608152602001606081526020016105886040518060400160405280600062ffffff19168152602001600064ffffffffff191681525090565b8152600060209091015290565b6000815180845260005b818110156105bb5760208185018101518683018201520161059f565b818111156105cd576000602083870101525b50601f01601f19169290920160200192915050565b60008260808082018460005b600481101561065f578483038852815180516001600160a01b0390811685526020808301516001600160b81b03168187015260408084015190921691860191909152606091820151828601879052919061064a87870184610595565b9a81019a9550939093019250506001016105ee565b50909695505050505050565b8060005b60038110156106975781516001600160a01b031684526020938401939091019060010161066f565b50505050565b6000815160a084526106b260a0850182610595565b9050602083015184820360208601526106cb8282610595565b915050604083015162ffffff19815116604086015264ffffffffff1960208201511660608601525065ffffffffffff60d01b60608401511660808501528091505092915050565b6020808252825160c083830152805160e084018190526000929182019083906101008601905b8083101561075c57835161ffff168252928401926001929092019190840190610738565b50838701519350601f1992508286820301604087015261077c81856105e2565b935050506040850151610792606086018261066b565b506060850151818584030160c08601526107ac838261069d565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f206f206f6f6ff09f9a80c3a96f6f6f4d20f09f9a80f09f9a804dc3a94d6f204d6f6f20c3a9f09f9a8020f09f9a806f4df09f9a80f09f9a80c3a94d6ff09f9a804d4d20204d6ff09f9a80f09f9a80206f6f4d6f6f6f20c3a96f206f4d20f09f9a806fc3a94d4df09f9a806f4d6f6f20c3a9f09f9a80f09f9a80c3a96f20204d4d4d6f204dc3a96fc3a96f20f09f9a806f20c3a9c3a94d4dc3a96f6fc3a96f4d4d6f6fc3a9204d6f6f20c3a9f09f9a804d206f6f4d6f6fc3a9204d6f6ff09f9a80c3a94d6ff09f9a80c3a96fc3a9f09f9a80f09f9a80f09f9a80c3a9f09f9a8020204d6ff09f9a80204d4d6f4d6f6f20c3a9f09f9a806f6fc3a9c3a96f2020c3a9c3a9206f4df09f9a80206f6fc3a96f204d6f206f206f6f6f4d206fc3a96ff09f9a804d6f6ff09f9a804d204d6ff09f9a80f09f9a806f206f6f6f6fa26469706673582212208179b5b6431bceb0d782375ff048eddda9c50874a14360bed7e59829e1f933c364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_101bedc7 {\n address s_0;\n uint184 s_1;\n address s_2;\n string s_3;\n }\n\n struct S_4cbbdb99 {\n bytes29 s_0;\n bytes27 s_1;\n }\n\n struct S_cb7ec20d {\n string s_0;\n string s_1;\n S_4cbbdb99 s_2;\n bytes6 s_3;\n }\n\n struct S_1706a793 {\n uint16[] s_0;\n S_101bedc7[4] s_1;\n address[3] s_2;\n S_cb7ec20d s_3;\n }\n\n function test () public pure returns (S_1706a793 memory) {\n S_1706a793 memory r;\n {\n uint16[] memory r_0 = new uint16[](3);\n {\n uint16 r_0_0 = 49973;\n r_0[0] = r_0_0;\n }\n {\n uint16 r_0_1 = 52712;\n r_0[1] = r_0_1;\n }\n {\n uint16 r_0_2 = 27558;\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n S_101bedc7[4] memory r_1;\n {\n S_101bedc7 memory r_1_0;\n {\n address r_1_0_0 = 0xa997ae99319d4d5f78001116304B85963CFD598a;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n uint184 r_1_0_1 = 22352808840010289842302397066752508338424843837075798122;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x437c4AA417145B8550CB480a73690dc14b69C7cC;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n string memory r_1_0_3 = unicode\"Moo é🚀M ooMooé Moo🚀éMo🚀éoé🚀🚀🚀é🚀 Mo🚀 MMo\";\n r_1_0.s_3 = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n {\n S_101bedc7 memory r_1_1;\n {\n address r_1_1_0 = 0xbA4bc495f2EA2017b703f7EF1FCBBB762Fd05Bae;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n uint184 r_1_1_1 = 20670249487535512276558324215094809644232506495339701687;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x99A6715055006E3de8D49f47F5dEA681b7C3f3e0;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n string memory r_1_1_3 = unicode\"Moo é🚀oMooo🚀\";\n r_1_1.s_3 = r_1_1_3;\n }\n r_1[1] = r_1_1;\n }\n {\n S_101bedc7 memory r_1_2;\n {\n address r_1_2_0 = 0xd5eCfc2Ea1f253CeecBbEeF73E6004a2a48E4b38;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n uint184 r_1_2_1 = 22294945854463320255348459051974076724187677082649948436;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n address r_1_2_2 = 0x6F5d882Aac2Ac4D0421443b56141D09e9B9Fc125;\n r_1_2.s_2 = r_1_2_2;\n }\n {\n string memory r_1_2_3 = unicode\"Moo é🚀o o ooo🚀éoooM 🚀🚀MéMo \";\n r_1_2.s_3 = r_1_2_3;\n }\n r_1[2] = r_1_2;\n }\n {\n S_101bedc7 memory r_1_3;\n {\n address r_1_3_0 = 0x04Ee2A1Cbdeba468344e2f97F548158c56B05Fd3;\n r_1_3.s_0 = r_1_3_0;\n }\n {\n uint184 r_1_3_1 = 18784143715623195643577902658013427953297211858112924806;\n r_1_3.s_1 = r_1_3_1;\n }\n {\n address r_1_3_2 = 0x8D8630F191BD85750907e1fdE246FF405c871be5;\n r_1_3.s_2 = r_1_3_2;\n }\n {\n string memory r_1_3_3 = unicode\"Moo é🚀 🚀oM🚀🚀éMo🚀MM Mo🚀🚀 ooMooo éo oM 🚀oéMM🚀o\";\n r_1_3.s_3 = r_1_3_3;\n }\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n address[3] memory r_2;\n {\n address r_2_0 = 0x02065635c53aB63b284A3381EBAE147D6bB13968;\n r_2[0] = r_2_0;\n }\n {\n address r_2_1 = 0x40940924E49087322b82B969d6777Ba4375A0315;\n r_2[1] = r_2_1;\n }\n {\n address r_2_2 = 0xB6752997639B8CEF0dc3b5b4996d85a5F7a8D390;\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n S_cb7ec20d memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀🚀éo MMMo Méoéo 🚀o ééMMéooéoMMooé \";\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀ooééo éé oM🚀 ooéo Mo o oooM oéo🚀Moo🚀M Mo🚀🚀o oooo\";\n r_3.s_1 = r_3_1;\n }\n {\n S_4cbbdb99 memory r_3_2;\n {\n bytes29 r_3_2_0 = bytes29(0x9d28efccf33e1e24bccddc68c1a9053189e4bdc88eed904105a620bdd3);\n r_3_2.s_0 = r_3_2_0;\n }\n {\n bytes27 r_3_2_1 = bytes27(0x491d8567619599200340e91e36443eb838636ef1834e1e604e17bd);\n r_3_2.s_1 = r_3_2_1;\n }\n r_3.s_2 = r_3_2;\n }\n {\n bytes6 r_3_3 = bytes6(0x5299a0863036);\n r_3.s_3 = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000002065635c53ab63b284a3381ebae147d6bb1396800000000000000000000000040940924e49087322b82b969d6777ba4375a0315000000000000000000000000b6752997639b8cef0dc3b5b4996d85a5f7a8d39000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000c335000000000000000000000000000000000000000000000000000000000000cde80000000000000000000000000000000000000000000000000000000000006ba60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000a997ae99319d4d5f78001116304b85963cfd598a000000000000000000e95fcc739b489ed254c80862bcefb6dd5c83fed172b86a000000000000000000000000437c4aa417145b8550cb480a73690dc14b69c7cc000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a804d206f6f4d6f6fc3a9204d6f6ff09f9a80c3a94d6ff09f9a80c3a96fc3a9f09f9a80f09f9a80f09f9a80c3a9f09f9a8020204d6ff09f9a80204d4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000ba4bc495f2ea2017b703f7ef1fcbbb762fd05bae000000000000000000d7ceb6a00304eb1d36e62a93652e03722fa1978be1a5b700000000000000000000000099a6715055006e3de8d49f47f5dea681b7c3f3e0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806f4d6f6f6ff09f9a8000000000000000000000000000000000000000000000000000d5ecfc2ea1f253ceecbbeef73e6004a2a48e4b38000000000000000000e8c524fd820f8ac5feba048a31d2c1244c4be8f824f1140000000000000000000000006f5d882aac2ac4d0421443b56141d09e9b9fc1250000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a806f206f206f6f6ff09f9a80c3a96f6f6f4d20f09f9a80f09f9a804dc3a94d6f200000000000000000000000000000000000000000000000000000000000000000000004ee2a1cbdeba468344e2f97f548158c56b05fd3000000000000000000c41d98afcb8097d5423f370a10373c0eaa86a5aefecc860000000000000000000000008d8630f191bd85750907e1fde246ff405c871be50000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a8020f09f9a806f4df09f9a80f09f9a80c3a94d6ff09f9a804d4d20204d6ff09f9a80f09f9a80206f6f4d6f6f6f20c3a96f206f4d20f09f9a806fc3a94d4df09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001009d28efccf33e1e24bccddc68c1a9053189e4bdc88eed904105a620bdd3000000491d8567619599200340e91e36443eb838636ef1834e1e604e17bd00000000005299a08630360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a80f09f9a80c3a96f20204d4d4d6f204dc3a96fc3a96f20f09f9a806f20c3a9c3a94d4dc3a96f6fc3a96f4d4d6f6fc3a92000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a806f6fc3a9c3a96f2020c3a9c3a9206f4df09f9a80206f6fc3a96f204d6f206f206f6f6f4d206fc3a96ff09f9a804d6f6ff09f9a804d204d6ff09f9a80f09f9a806f206f6f6f6f00000000000000000000000000000000" + }, + { + "name": "random-(uint24,int64[2],((bool[][2],(address,string,bytes1,uint216,string))),address)[3][3]", + "type": "(uint24,int64[2],((bool[][2],(address,string,bytes1,uint216,string))),address)[3][3]", + "value": [ + [ + [ + "7878909", + ["5974493399659447779", "4282738417890485748"], + [ + [ + [[], [true]], + [ + "0x7967B6017C61A0d3245f1aA3D18d5071Da010a51", + "Moo é🚀", + "0xbb", + "20944079792621261196888964681634754148806223982820931539781660798", + "Moo é🚀Mo🚀🚀ooooo🚀o🚀 éMo🚀oo🚀o🚀Mo" + ] + ] + ], + "0x9e749337dB3f580Ada7d5c4639798893ea7526b5" + ], + [ + "3771665", + ["-4020771506997897864", "7527673142927007182"], + [ + [ + [[false], [true]], + [ + "0xCf9da3bfA345A2558a99F6fA3D651dA12b6D8CE3", + "Moo é🚀", + "0x59", + "18864518056506174093383034214245207148746026942282257145290281872", + "Moo é🚀M🚀🚀o🚀é🚀🚀oMMM🚀oM M éMM🚀M 🚀ééoooooo 🚀oé🚀🚀Mo éo🚀éooé" + ] + ] + ], + "0xB00441329843aC8adFD78cC9ab6BbDEc78aD0540" + ], + [ + "12906190", + ["2318552752296791621", "-8780540951137241335"], + [ + [ + [[true], []], + [ + "0xE03FA562AEF693Bd4A95213797d4F1f25860E7C6", + "Moo é🚀é🚀 ooMo éooéMéééoooééé🚀oééé oo éo🚀🚀🚀é🚀 Moé", + "0xd3", + "30276435430511853896861358542986961747667647253423379231122933248", + "Moo é🚀 o🚀éMé 🚀🚀 M🚀Méé🚀oMo🚀MooM oM🚀éooéMé M o🚀M🚀M 🚀o🚀ooéoMo🚀 🚀é" + ] + ] + ], + "0x5814ED4F37D81895462f38dd32d0d2D2d4eB2c80" + ] + ], + [ + [ + "14533564", + ["513156561789079568", "798386550769464415"], + [ + [ + [[true], [true, false]], + [ + "0xbFB96A7F4F88C0Ab5FcE2B2915000D51A08243eE", + "Moo é🚀 oo o é🚀ooMMéM🚀M 🚀o🚀o 🚀oé🚀Mé🚀Mo o ééoooM🚀é🚀éooéoo MéoéMMM", + "0xa4", + "94268182663441924477315506316433561309740241761516795906835203065", + "Moo é🚀oooéo🚀Moéo🚀 Mooo M🚀 ooéééé" + ] + ] + ], + "0x46502e3551E8CB08916E43E57a5aFc594446dD68" + ], + [ + "1627187", + ["-4140114426077429215", "3358478230553457566"], + [ + [ + [[false, false], []], + [ + "0xb13d4DF06a5DF00cB09bc488B842f335993424B1", + "Moo é🚀oo Mé🚀o🚀é🚀oMé🚀 🚀M ooo🚀o", + "0x6c", + "31862608245847353469749369818515597333705403400770420586412396690", + "Moo é🚀o🚀oé oéé🚀oéoé 🚀é oo oo oM🚀oMooé🚀M 🚀éMé MMMM🚀éoéé M ooé" + ] + ] + ], + "0x0f9278E8F3Ae371aa040928A45951552A8929faa" + ], + [ + "2163782", + ["3886680150632011270", "-7495526120747920607"], + [ + [ + [[false], []], + [ + "0x4c65e31982DadDa42307ADb243ccA8A72Ae64222", + "Moo é🚀o🚀🚀M 🚀🚀🚀oM🚀ooM🚀o🚀MMoMooéM 🚀o o ", + "0x43", + "59960313712236422865068254353737427957776817516749974264136530064", + "Moo é🚀éééo Méoooo🚀MMo ééooo éMo🚀 oéé é🚀" + ] + ] + ], + "0xbb4c616bc615b7b6C9D8744CdC0C93F90dAd655a" + ] + ], + [ + [ + "1959728", + ["4676639648180745163", "-885735482008792797"], + [ + [ + [[], [false, false, true, true]], + [ + "0x57A9be1880E68943AdcE4F62e175B3476F0a37CA", + "Moo é🚀oé🚀 🚀ééé🚀o🚀🚀o é ééo M🚀ooMMM M🚀Mé", + "0x6d", + "56048536632962939827198251916750354370706957288921132136638258348", + "Moo é🚀ooMo 🚀" + ] + ] + ], + "0x84b65f1320BaBb0E307b5834708301c7cA3023Af" + ], + [ + "13580794", + ["-1722941348427173174", "-7075137442856142154"], + [ + [ + [[], [false, false, false]], + [ + "0x7Ba0c2677B5E0F8f38F7F63706285827487f81ef", + "Moo é🚀éoooMoo ", + "0x92", + "16433703827913589581502359332569286188739228227578518029371614977", + "Moo é🚀🚀🚀M🚀oéo🚀é ooéoMooo🚀o🚀oé🚀🚀oéoo🚀Mo🚀 🚀Mé oo🚀" + ] + ] + ], + "0x971FEF9281643D6d0DEb6A7e71b6AfB274F42BB0" + ], + [ + "3688368", + ["7692595569902164889", "-3971984619589784919"], + [ + [ + [[true, true, false, false], []], + [ + "0xf46E8Fb760454aC809C8b54d6FFd5164a2eB0EFe", + "Moo é🚀 éo🚀oé🚀 M", + "0x0a", + "58703094886778838796687464122993861423723403987518296264635840146", + "Moo é🚀 éoooMo M MM é oMM🚀o🚀 o🚀o🚀🚀M o 🚀oM" + ] + ] + ], + "0xb44d01A33e16eFFB157ae498A272c7E54dbf4824" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "7878909" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "5974493399659447779" + }, + { + "type": "number", + "value": "4282738417890485748" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x7967B6017C61A0d3245f1aA3D18d5071Da010a51" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0xbb" + }, + { + "type": "number", + "value": "20944079792621261196888964681634754148806223982820931539781660798" + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀🚀ooooo🚀o🚀 éMo🚀oo🚀o🚀Mo" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x9e749337dB3f580Ada7d5c4639798893ea7526b5" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3771665" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-4020771506997897864" + }, + { + "type": "number", + "value": "7527673142927007182" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xCf9da3bfA345A2558a99F6fA3D651dA12b6D8CE3" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x59" + }, + { + "type": "number", + "value": "18864518056506174093383034214245207148746026942282257145290281872" + }, + { + "type": "string", + "value": "Moo é🚀M🚀🚀o🚀é🚀🚀oMMM🚀oM M éMM🚀M 🚀ééoooooo 🚀oé🚀🚀Mo éo🚀éooé" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xB00441329843aC8adFD78cC9ab6BbDEc78aD0540" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "12906190" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2318552752296791621" + }, + { + "type": "number", + "value": "-8780540951137241335" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE03FA562AEF693Bd4A95213797d4F1f25860E7C6" + }, + { + "type": "string", + "value": "Moo é🚀é🚀 ooMo éooéMéééoooééé🚀oééé oo éo🚀🚀🚀é🚀 Moé" + }, + { + "type": "hexstring", + "value": "0xd3" + }, + { + "type": "number", + "value": "30276435430511853896861358542986961747667647253423379231122933248" + }, + { + "type": "string", + "value": "Moo é🚀 o🚀éMé 🚀🚀 M🚀Méé🚀oMo🚀MooM oM🚀éooéMé M o🚀M🚀M 🚀o🚀ooéoMo🚀 🚀é" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x5814ED4F37D81895462f38dd32d0d2D2d4eB2c80" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "14533564" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "513156561789079568" + }, + { + "type": "number", + "value": "798386550769464415" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xbFB96A7F4F88C0Ab5FcE2B2915000D51A08243eE" + }, + { + "type": "string", + "value": "Moo é🚀 oo o é🚀ooMMéM🚀M 🚀o🚀o 🚀oé🚀Mé🚀Mo o ééoooM🚀é🚀éooéoo MéoéMMM" + }, + { + "type": "hexstring", + "value": "0xa4" + }, + { + "type": "number", + "value": "94268182663441924477315506316433561309740241761516795906835203065" + }, + { + "type": "string", + "value": "Moo é🚀oooéo🚀Moéo🚀 Mooo M🚀 ooéééé" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x46502e3551E8CB08916E43E57a5aFc594446dD68" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1627187" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-4140114426077429215" + }, + { + "type": "number", + "value": "3358478230553457566" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xb13d4DF06a5DF00cB09bc488B842f335993424B1" + }, + { + "type": "string", + "value": "Moo é🚀oo Mé🚀o🚀é🚀oMé🚀 🚀M ooo🚀o" + }, + { + "type": "hexstring", + "value": "0x6c" + }, + { + "type": "number", + "value": "31862608245847353469749369818515597333705403400770420586412396690" + }, + { + "type": "string", + "value": "Moo é🚀o🚀oé oéé🚀oéoé 🚀é oo oo oM🚀oMooé🚀M 🚀éMé MMMM🚀éoéé M ooé" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x0f9278E8F3Ae371aa040928A45951552A8929faa" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2163782" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3886680150632011270" + }, + { + "type": "number", + "value": "-7495526120747920607" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4c65e31982DadDa42307ADb243ccA8A72Ae64222" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀M 🚀🚀🚀oM🚀ooM🚀o🚀MMoMooéM 🚀o o " + }, + { + "type": "hexstring", + "value": "0x43" + }, + { + "type": "number", + "value": "59960313712236422865068254353737427957776817516749974264136530064" + }, + { + "type": "string", + "value": "Moo é🚀éééo Méoooo🚀MMo ééooo éMo🚀 oéé é🚀" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xbb4c616bc615b7b6C9D8744CdC0C93F90dAd655a" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1959728" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4676639648180745163" + }, + { + "type": "number", + "value": "-885735482008792797" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x57A9be1880E68943AdcE4F62e175B3476F0a37CA" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀 🚀ééé🚀o🚀🚀o é ééo M🚀ooMMM M🚀Mé" + }, + { + "type": "hexstring", + "value": "0x6d" + }, + { + "type": "number", + "value": "56048536632962939827198251916750354370706957288921132136638258348" + }, + { + "type": "string", + "value": "Moo é🚀ooMo 🚀" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x84b65f1320BaBb0E307b5834708301c7cA3023Af" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "13580794" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1722941348427173174" + }, + { + "type": "number", + "value": "-7075137442856142154" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x7Ba0c2677B5E0F8f38F7F63706285827487f81ef" + }, + { + "type": "string", + "value": "Moo é🚀éoooMoo " + }, + { + "type": "hexstring", + "value": "0x92" + }, + { + "type": "number", + "value": "16433703827913589581502359332569286188739228227578518029371614977" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀M🚀oéo🚀é ooéoMooo🚀o🚀oé🚀🚀oéoo🚀Mo🚀 🚀Mé oo🚀" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x971FEF9281643D6d0DEb6A7e71b6AfB274F42BB0" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3688368" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "7692595569902164889" + }, + { + "type": "number", + "value": "-3971984619589784919" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xf46E8Fb760454aC809C8b54d6FFd5164a2eB0EFe" + }, + { + "type": "string", + "value": "Moo é🚀 éo🚀oé🚀 M" + }, + { + "type": "hexstring", + "value": "0x0a" + }, + { + "type": "number", + "value": "58703094886778838796687464122993861423723403987518296264635840146" + }, + { + "type": "string", + "value": "Moo é🚀 éoooMo M MM é oMM🚀o🚀 o🚀o🚀🚀M o 🚀oM" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xb44d01A33e16eFFB157ae498A272c7E54dbf4824" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506117b7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061127e565b60405180910390f35b610056610fea565b61005e610fea565b610066611017565b61006e611044565b627838fd815261007c61107d565b6752e9aa17bf9e05e38152673b6f57e67047e5f46020808301919091528201526100a461109b565b6100ac6110b3565b6100b46110d3565b6040805160008082526020820190925282525060408051600180825281830190925260009160208083019080368337019050509050600060019050808260008151811061010357610103611363565b9115156020928302919091018201528301919091525081526101236110fa565b737967b6017c61a0d3245f1aa3d18d5071da010a518152604080518082018252600a8152689adede418753e13f3560b71b6020808301919091528084019190915260bb60f81b828401527a32e988690e412da48c036fe5c3bd253654e72a641583075a91b07e606080850191909152825190810190925260388083526000929161163890830139608083015250602082015281526040820152739e749337db3f580ada7d5c4639798893ea7526b5606082015281526101e0611044565b62398d1181526101ee61107d565b6737cca661f59f2a87198152676877aad715699dce60208083019190915282015261021761109b565b61021f6110b3565b6102276110d3565b604080516001808252818301909252600091602080830190803683370190505090506000808260008151811061025f5761025f611363565b9115156020928302919091019091015250815260408051600180825281830190925260009181602001602082028036833701905050905060006001905080826000815181106102b0576102b0611363565b9115156020928302919091018201528301919091525081526102d06110fa565b73cf9da3bfa345a2558a99f6fa3d651da12b6d8ce38152604080518082018252600a8152689adede418753e13f3560b71b60208083019190915280840191909152605960f81b828401527a2ddb6b1cc136b6e5e271b8123ad8adc3951d2282053794688fd3906060840152815160a081019092526069808352600092916116709083013960808301525060208201528152604082015273b00441329843ac8adfd78cc9ab6bbdec78ad0540606082015280826001602002015250610392611044565b62c4eece81526103a061107d565b67202d2771a9a78e4581526779dabf79484e48f6196020808301919091528201526103c961109b565b6103d16110b3565b6103d96110d3565b60408051600180825281830190925260009160208083019080368337019050509050600060019050808260008151811061041557610415611363565b9115156020928302919091018201529183525060408051600081528083019091529082015281526104446110fa565b73e03fa562aef693bd4a95213797d4f1f25860e7c681526040805160808101909152605580825260009190611570602083013960208084019190915260d360f81b6040808501919091527a499912702fa9188a4076fb7c06ac693dcb25f2fe8d5466ab9046006060850152805160a0810190915260738082526000935090916116d99083013960808301525060208201528152604082810191909152735814ed4f37d81895462f38dd32d0d2d2d4eb2c8060608301528201528152610507611017565b61050f611044565b62ddc3bc815261051d61107d565b67071f192c939950108152670b1470568010345f60208083019190915282015261054561109b565b61054d6110b3565b6105556110d3565b60408051600180825281830190925260009160208083019080368337019050509050600060019050808260008151811061059157610591611363565b911515602092830291909101909101525081526040805160028082526060820190925260009181602001602082028036833701905050905060006001905080826000815181106105e3576105e3611363565b602002602001019015159081151581525050506000808260018151811061060c5761060c611363565b91151560209283029190910182015283019190915250815261062c6110fa565b73bfb96a7f4f88c0ab5fce2b2915000d51a08243ee81526040805160a0810190915260698082526000919061137a6020830139602080840191909152602960fa1b6040808501919091527ae5273bed862c7fb729df80825f7f6a1d01eb5f000c39e0792dc3f9606080860191909152815190810190915260348082526000935090916115c5908301396080830152506020820152815260408201527346502e3551e8cb08916e43e57a5afc594446dd68606082015281526106eb611044565b6218d43381526106f961107d565b673974a4229fd0bdde198152672e9bb6281e05739e60208083019190915282015261072261109b565b61072a6110b3565b6107326110d3565b6040805160028082526060820183526000926020830190803683370190505090506000808260008151811061076957610769611363565b602002602001019015159081151581525050506000808260018151811061079257610792611363565b9115156020928302919091018201529183525060408051600081528083019091529082015281526107c16110fa565b73b13d4df06a5df00cb09bc488b842f335993424b18152604080516060810190915260368082526000919061174c6020830139602080840191909152601b60fa1b6040808501919091527a4d742658adf16776c10030c279339e5a3c80a696c9624b6fe250926060850152805160a08101909152606380825260009350909161150d90830139608083015250602082015281526040820152730f9278e8f3ae371aa040928a45951552a8929faa606082015280826001602002015250610885611044565b62210446815261089361107d565b6735f0430125fb96068152676805754b37d76cde196020808301919091528201526108bc61109b565b6108c46110b3565b6108cc6110d3565b604080516001808252818301909252600091602080830190803683370190505090506000808260008151811061090457610904611363565b9115156020928302919091018201529183525060408051600081528083019091529082015281526109336110fa565b734c65e31982dadda42307adb243cca8a72ae64222815260408051608081019091526045808252600091906114876020830139602080840191909152604360f81b6040808501919091527a91c165138e7aafa2ab3d02f6f13fc44074e4d709b021c996baf8906060808601919091528151908101909152603f8082526000935090916115f99083013960808301525060208201528152604082015273bb4c616bc615b7b6c9d8744cdc0c93f90dad655a60608201528082600260200201525080826001602002015250610a04611017565b610a0c611044565b621de7308152610a1a61107d565b6740e6c2fb6c5233cb8152670c4ac3ba6217eedc19602080830191909152820152610a4361109b565b610a4b6110b3565b610a536110d3565b6040805160008082526020820190925282525060408051600480825260a082019092526000916020820160808036833701905050905060008082600081518110610a9f57610a9f611363565b6020026020010190151590811515815250505060008082600181518110610ac857610ac8611363565b602002602001019015159081151581525050506000600190508082600281518110610af557610af5611363565b602002602001019015159081151581525050506000600190508082600381518110610b2257610b22611363565b911515602092830291909101820152830191909152508152610b426110fa565b7357a9be1880e68943adce4f62e175b3476f0a37ca815260408051608081019091526047808252600091906114406020830139602083810191909152606d60f81b6040808501919091527a883f1708b95cffd5eea5996a4eb04392905294f5e60cefa2251cac6060808601919091528151808301835260138152719adede418753e13f3500dede9ade41e13f35606f1b81850152608086015291850193909352928452508301919091527384b65f1320babb0e307b5834708301c7ca3023af908201528152610c0f611044565b62cf39fa8152610c1d61107d565b6717e91e0721d58d3519815267622ff004c281854919602080830191909152820152610c4761109b565b610c4f6110b3565b610c576110d3565b60408051600080825260208201909252825250604080516003808252608082019092526000916020820160608036833701905050905060008082600081518110610ca357610ca3611363565b6020026020010190151590811515815250505060008082600181518110610ccc57610ccc611363565b6020026020010190151590811515815250505060008082600281518110610cf557610cf5611363565b911515602092830291909101820152830191909152508152610d156110fa565b737ba0c2677b5e0f8f38f7f63706285827487f81ef81526040805180820182526013815272026b7b79061d4f84fcd4061d4b7b7b7a6b7b79606d1b60208083019190915280840191909152604960f91b828401527a27f2b810567a789a63179f96b6778740f17d674122c67c7c06a7016060840152815160808101909252605d808352600092916113e39083013960808301525060208201528152604082015273971fef9281643d6d0deb6a7e71b6afb274f42bb0606082015280826001602002015250610de1611044565b623847b08152610def61107d565b676ac196e9e8c31b99815267371f52f78ff6d55619602080830191909152820152610e1861109b565b610e206110b3565b610e286110d3565b60408051600480825260a08201909252600091602082016080803683370190505090506000600190508082600081518110610e6557610e65611363565b602002602001019015159081151581525050506000600190508082600181518110610e9257610e92611363565b6020026020010190151590811515815250505060008082600281518110610ebb57610ebb611363565b6020026020010190151590811515815250505060008082600381518110610ee457610ee4611363565b911515602092830291909101820152918352506040805160008152808301909152908201528152610f136110fa565b73f46e8fb760454ac809c8b54d6ffd5164a2eb0efe8152604080518082018252601b81527f4d6f6f20c3a9f09f9a8020c3a96ff09f9a806fc3a9f09f9a80204d000000000060208083019190915280840191909152600560f91b828401527a8eb3068ff010187e190e82ade9660f131c6b9c035638dd0573f69260608401528151608081019092526041808352600092916114cc908301396080830152506020820152815260408281019190915273b44d01a33e16effb157ae498a272c7e54dbf4824606083015282810191909152820152919050565b60405180606001604052806003905b611001611017565b815260200190600190039081610ff95790505090565b60405180606001604052806003905b61102e611044565b8152602001906001900390816110265790505090565b6040518060800160405280600062ffffff16815260200161106361107d565b815260200161107061109b565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806110ae6110b3565b905290565b60405180604001604052806110c66110d3565b81526020016110ae6110fa565b60405180604001604052806002905b60608152602001906001900390816110e25790505090565b6040805160a081018252600080825260606020830181905292820181905282820152608081019190915290565b6000815180845260005b8181101561114d57602081850181015186830182015201611131565b8181111561115f576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b0381511682526000602082015160a0602085015261119b60a0850182611127565b905060ff60f81b604084015116604085015260018060d81b036060840151166060850152608083015184820360808601526111d68282611127565b95945050505050565b8051602080845281516040858301526000929060a08601906060870185805b600281101561125557898503605f19018352835180518087529088019088870190845b8181101561123f57835115158352928a0192918a0191600101611221565b50909650505092860192918601916001016111fe565b5050505091810151858303601f19016040870152916112748184611174565b9695505050505050565b60208082526000906080830183820185845b600380821061129f5750611357565b878503601f19018452825185606080820160005b85811015611340578982038452845160a062ffffff82511684528c8201518d850160005b60028110156112f757825160070b8252918f0191908f01906001016112d7565b50505060408201518186860152611310828601826111df565b928601516001600160a01b038116608087015292915061132d9050565b958c0195948c01949250506001016112b3565b509750505093860193505090840190600101611290565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80206f6f206f20c3a9f09f9a806f6f4d4dc3a94df09f9a804d20f09f9a806ff09f9a806f20f09f9a806fc3a9f09f9a804dc3a9f09f9a804d6f206f20c3a9c3a96f6f6f4df09f9a80c3a9f09f9a80c3a96f6fc3a96f6f204dc3a96fc3a94d4d4d4d6f6f20c3a9f09f9a80f09f9a80f09f9a804df09f9a806fc3a96ff09f9a80c3a9206f6fc3a96f4d6f6f6ff09f9a806ff09f9a806fc3a9f09f9a80f09f9a806fc3a96f6ff09f9a804d6ff09f9a8020f09f9a804dc3a9206f6ff09f9a804d6f6f20c3a9f09f9a806fc3a9f09f9a8020f09f9a80c3a9c3a9c3a9f09f9a806ff09f9a80f09f9a806f20c3a920c3a9c3a96f204df09f9a806f6f4d4d4d204df09f9a804dc3a94d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d20f09f9a80f09f9a80f09f9a806f4df09f9a806f6f4df09f9a806ff09f9a804d4d6f4d6f6fc3a94d20f09f9a806f206f204d6f6f20c3a9f09f9a8020c3a96f6f6f4d6f204d204d4d20c3a9206f4d4df09f9a806ff09f9a80206ff09f9a806ff09f9a80f09f9a804d206f2020f09f9a806f4d4d6f6f20c3a9f09f9a806ff09f9a806fc3a920206fc3a9c3a9f09f9a806fc3a96fc3a920f09f9a80c3a9206f6f206f6f206f4df09f9a806f4d6f6fc3a9f09f9a804d20f09f9a80c3a94dc3a9204d4d4d4df09f9a80c3a96fc3a9c3a9204d206f6fc3a94d6f6f20c3a9f09f9a80c3a9f09f9a80206f6f4d6f20c3a96f6fc3a94dc3a9c3a9c3a96f6f6fc3a9c3a9c3a9f09f9a806fc3a9c3a9c3a9206f6f20c3a96ff09f9a80f09f9a80f09f9a80c3a9f09f9a80204d6fc3a94d6f6f20c3a9f09f9a806f6f6fc3a96ff09f9a804d6fc3a96ff09f9a80204d6f6f6f20204df09f9a80206f6fc3a9c3a9c3a9c3a94d6f6f20c3a9f09f9a80c3a9c3a9c3a96f204dc3a96f6f6f6ff09f9a804d4d6f2020c3a9c3a96f6f6f20c3a94d6ff09f9a80206fc3a9c3a920c3a9f09f9a804d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a806f6f6f6f6ff09f9a806ff09f9a8020c3a94d6ff09f9a806f6ff09f9a806ff09f9a804d6f4d6f6f20c3a9f09f9a804df09f9a80f09f9a806ff09f9a80c3a9f09f9a80f09f9a806f4d4d4df09f9a806f4d204d20c3a94d4df09f9a804d2020f09f9a80c3a9c3a96f6f6f6f6f6f2020f09f9a806fc3a9f09f9a80f09f9a804d6f20c3a96ff09f9a80c3a96f6fc3a94d6f6f20c3a9f09f9a80206ff09f9a80c3a94dc3a920f09f9a80f09f9a80204df09f9a804dc3a9c3a9f09f9a806f4d6ff09f9a804d6f6f4d206f4df09f9a80c3a96f6fc3a94dc3a9204d206ff09f9a804df09f9a804d2020f09f9a806ff09f9a806f6fc3a96f4d6ff09f9a8020f09f9a80c3a94d6f6f20c3a9f09f9a806f6f204dc3a9f09f9a806ff09f9a80c3a9f09f9a806f4dc3a9f09f9a8020f09f9a804d206f6f6ff09f9a806fa2646970667358221220ebfc13114590139dec252a3036b45ae3affe8a3a1afffdc63a7a82bb35af7b3364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_885e90a2 {\n address s_0;\n string s_1;\n bytes1 s_2;\n uint216 s_3;\n string s_4;\n }\n\n struct S_502390a3 {\n bool[][2] s_0;\n S_885e90a2 s_1;\n }\n\n struct S_1900ede5 {\n S_502390a3 s_0;\n }\n\n struct S_a9031fcd {\n uint24 s_0;\n int64[2] s_1;\n S_1900ede5 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_a9031fcd[3][3] memory) {\n S_a9031fcd[3][3] memory r;\n {\n S_a9031fcd[3] memory r_0;\n {\n S_a9031fcd memory r_0_0;\n {\n uint24 r_0_0_0 = 7878909;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n int64[2] memory r_0_0_1;\n {\n int64 r_0_0_1_0 = 5974493399659447779;\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n int64 r_0_0_1_1 = 4282738417890485748;\n r_0_0_1[1] = r_0_0_1_1;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n S_1900ede5 memory r_0_0_2;\n {\n S_502390a3 memory r_0_0_2_0;\n {\n bool[][2] memory r_0_0_2_0_0;\n {\n bool[] memory r_0_0_2_0_0_0 = new bool[](0);\n r_0_0_2_0_0[0] = r_0_0_2_0_0_0;\n }\n {\n bool[] memory r_0_0_2_0_0_1 = new bool[](1);\n {\n bool r_0_0_2_0_0_1_0 = true;\n r_0_0_2_0_0_1[0] = r_0_0_2_0_0_1_0;\n }\n r_0_0_2_0_0[1] = r_0_0_2_0_0_1;\n }\n r_0_0_2_0.s_0 = r_0_0_2_0_0;\n }\n {\n S_885e90a2 memory r_0_0_2_0_1;\n {\n address r_0_0_2_0_1_0 = 0x7967B6017C61A0d3245f1aA3D18d5071Da010a51;\n r_0_0_2_0_1.s_0 = r_0_0_2_0_1_0;\n }\n {\n string memory r_0_0_2_0_1_1 = unicode\"Moo é🚀\";\n r_0_0_2_0_1.s_1 = r_0_0_2_0_1_1;\n }\n {\n bytes1 r_0_0_2_0_1_2 = bytes1(0xbb);\n r_0_0_2_0_1.s_2 = r_0_0_2_0_1_2;\n }\n {\n uint216 r_0_0_2_0_1_3 = 20944079792621261196888964681634754148806223982820931539781660798;\n r_0_0_2_0_1.s_3 = r_0_0_2_0_1_3;\n }\n {\n string memory r_0_0_2_0_1_4 = unicode\"Moo é🚀Mo🚀🚀ooooo🚀o🚀 éMo🚀oo🚀o🚀Mo\";\n r_0_0_2_0_1.s_4 = r_0_0_2_0_1_4;\n }\n r_0_0_2_0.s_1 = r_0_0_2_0_1;\n }\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n r_0_0.s_2 = r_0_0_2;\n }\n {\n address r_0_0_3 = 0x9e749337dB3f580Ada7d5c4639798893ea7526b5;\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n S_a9031fcd memory r_0_1;\n {\n uint24 r_0_1_0 = 3771665;\n r_0_1.s_0 = r_0_1_0;\n }\n {\n int64[2] memory r_0_1_1;\n {\n int64 r_0_1_1_0 = -4020771506997897864;\n r_0_1_1[0] = r_0_1_1_0;\n }\n {\n int64 r_0_1_1_1 = 7527673142927007182;\n r_0_1_1[1] = r_0_1_1_1;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n S_1900ede5 memory r_0_1_2;\n {\n S_502390a3 memory r_0_1_2_0;\n {\n bool[][2] memory r_0_1_2_0_0;\n {\n bool[] memory r_0_1_2_0_0_0 = new bool[](1);\n {\n bool r_0_1_2_0_0_0_0 = false;\n r_0_1_2_0_0_0[0] = r_0_1_2_0_0_0_0;\n }\n r_0_1_2_0_0[0] = r_0_1_2_0_0_0;\n }\n {\n bool[] memory r_0_1_2_0_0_1 = new bool[](1);\n {\n bool r_0_1_2_0_0_1_0 = true;\n r_0_1_2_0_0_1[0] = r_0_1_2_0_0_1_0;\n }\n r_0_1_2_0_0[1] = r_0_1_2_0_0_1;\n }\n r_0_1_2_0.s_0 = r_0_1_2_0_0;\n }\n {\n S_885e90a2 memory r_0_1_2_0_1;\n {\n address r_0_1_2_0_1_0 = 0xCf9da3bfA345A2558a99F6fA3D651dA12b6D8CE3;\n r_0_1_2_0_1.s_0 = r_0_1_2_0_1_0;\n }\n {\n string memory r_0_1_2_0_1_1 = unicode\"Moo é🚀\";\n r_0_1_2_0_1.s_1 = r_0_1_2_0_1_1;\n }\n {\n bytes1 r_0_1_2_0_1_2 = bytes1(0x59);\n r_0_1_2_0_1.s_2 = r_0_1_2_0_1_2;\n }\n {\n uint216 r_0_1_2_0_1_3 = 18864518056506174093383034214245207148746026942282257145290281872;\n r_0_1_2_0_1.s_3 = r_0_1_2_0_1_3;\n }\n {\n string memory r_0_1_2_0_1_4 = unicode\"Moo é🚀M🚀🚀o🚀é🚀🚀oMMM🚀oM M éMM🚀M 🚀ééoooooo 🚀oé🚀🚀Mo éo🚀éooé\";\n r_0_1_2_0_1.s_4 = r_0_1_2_0_1_4;\n }\n r_0_1_2_0.s_1 = r_0_1_2_0_1;\n }\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0xB00441329843aC8adFD78cC9ab6BbDEc78aD0540;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n {\n S_a9031fcd memory r_0_2;\n {\n uint24 r_0_2_0 = 12906190;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n int64[2] memory r_0_2_1;\n {\n int64 r_0_2_1_0 = 2318552752296791621;\n r_0_2_1[0] = r_0_2_1_0;\n }\n {\n int64 r_0_2_1_1 = -8780540951137241335;\n r_0_2_1[1] = r_0_2_1_1;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n {\n S_1900ede5 memory r_0_2_2;\n {\n S_502390a3 memory r_0_2_2_0;\n {\n bool[][2] memory r_0_2_2_0_0;\n {\n bool[] memory r_0_2_2_0_0_0 = new bool[](1);\n {\n bool r_0_2_2_0_0_0_0 = true;\n r_0_2_2_0_0_0[0] = r_0_2_2_0_0_0_0;\n }\n r_0_2_2_0_0[0] = r_0_2_2_0_0_0;\n }\n {\n bool[] memory r_0_2_2_0_0_1 = new bool[](0);\n r_0_2_2_0_0[1] = r_0_2_2_0_0_1;\n }\n r_0_2_2_0.s_0 = r_0_2_2_0_0;\n }\n {\n S_885e90a2 memory r_0_2_2_0_1;\n {\n address r_0_2_2_0_1_0 = 0xE03FA562AEF693Bd4A95213797d4F1f25860E7C6;\n r_0_2_2_0_1.s_0 = r_0_2_2_0_1_0;\n }\n {\n string memory r_0_2_2_0_1_1 = unicode\"Moo é🚀é🚀 ooMo éooéMéééoooééé🚀oééé oo éo🚀🚀🚀é🚀 Moé\";\n r_0_2_2_0_1.s_1 = r_0_2_2_0_1_1;\n }\n {\n bytes1 r_0_2_2_0_1_2 = bytes1(0xd3);\n r_0_2_2_0_1.s_2 = r_0_2_2_0_1_2;\n }\n {\n uint216 r_0_2_2_0_1_3 = 30276435430511853896861358542986961747667647253423379231122933248;\n r_0_2_2_0_1.s_3 = r_0_2_2_0_1_3;\n }\n {\n string memory r_0_2_2_0_1_4 = unicode\"Moo é🚀 o🚀éMé 🚀🚀 M🚀Méé🚀oMo🚀MooM oM🚀éooéMé M o🚀M🚀M 🚀o🚀ooéoMo🚀 🚀é\";\n r_0_2_2_0_1.s_4 = r_0_2_2_0_1_4;\n }\n r_0_2_2_0.s_1 = r_0_2_2_0_1;\n }\n r_0_2_2.s_0 = r_0_2_2_0;\n }\n r_0_2.s_2 = r_0_2_2;\n }\n {\n address r_0_2_3 = 0x5814ED4F37D81895462f38dd32d0d2D2d4eB2c80;\n r_0_2.s_3 = r_0_2_3;\n }\n r_0[2] = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_a9031fcd[3] memory r_1;\n {\n S_a9031fcd memory r_1_0;\n {\n uint24 r_1_0_0 = 14533564;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n int64[2] memory r_1_0_1;\n {\n int64 r_1_0_1_0 = 513156561789079568;\n r_1_0_1[0] = r_1_0_1_0;\n }\n {\n int64 r_1_0_1_1 = 798386550769464415;\n r_1_0_1[1] = r_1_0_1_1;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n {\n S_1900ede5 memory r_1_0_2;\n {\n S_502390a3 memory r_1_0_2_0;\n {\n bool[][2] memory r_1_0_2_0_0;\n {\n bool[] memory r_1_0_2_0_0_0 = new bool[](1);\n {\n bool r_1_0_2_0_0_0_0 = true;\n r_1_0_2_0_0_0[0] = r_1_0_2_0_0_0_0;\n }\n r_1_0_2_0_0[0] = r_1_0_2_0_0_0;\n }\n {\n bool[] memory r_1_0_2_0_0_1 = new bool[](2);\n {\n bool r_1_0_2_0_0_1_0 = true;\n r_1_0_2_0_0_1[0] = r_1_0_2_0_0_1_0;\n }\n {\n bool r_1_0_2_0_0_1_1 = false;\n r_1_0_2_0_0_1[1] = r_1_0_2_0_0_1_1;\n }\n r_1_0_2_0_0[1] = r_1_0_2_0_0_1;\n }\n r_1_0_2_0.s_0 = r_1_0_2_0_0;\n }\n {\n S_885e90a2 memory r_1_0_2_0_1;\n {\n address r_1_0_2_0_1_0 = 0xbFB96A7F4F88C0Ab5FcE2B2915000D51A08243eE;\n r_1_0_2_0_1.s_0 = r_1_0_2_0_1_0;\n }\n {\n string memory r_1_0_2_0_1_1 = unicode\"Moo é🚀 oo o é🚀ooMMéM🚀M 🚀o🚀o 🚀oé🚀Mé🚀Mo o ééoooM🚀é🚀éooéoo MéoéMMM\";\n r_1_0_2_0_1.s_1 = r_1_0_2_0_1_1;\n }\n {\n bytes1 r_1_0_2_0_1_2 = bytes1(0xa4);\n r_1_0_2_0_1.s_2 = r_1_0_2_0_1_2;\n }\n {\n uint216 r_1_0_2_0_1_3 = 94268182663441924477315506316433561309740241761516795906835203065;\n r_1_0_2_0_1.s_3 = r_1_0_2_0_1_3;\n }\n {\n string memory r_1_0_2_0_1_4 = unicode\"Moo é🚀oooéo🚀Moéo🚀 Mooo M🚀 ooéééé\";\n r_1_0_2_0_1.s_4 = r_1_0_2_0_1_4;\n }\n r_1_0_2_0.s_1 = r_1_0_2_0_1;\n }\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n {\n address r_1_0_3 = 0x46502e3551E8CB08916E43E57a5aFc594446dD68;\n r_1_0.s_3 = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n {\n S_a9031fcd memory r_1_1;\n {\n uint24 r_1_1_0 = 1627187;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n int64[2] memory r_1_1_1;\n {\n int64 r_1_1_1_0 = -4140114426077429215;\n r_1_1_1[0] = r_1_1_1_0;\n }\n {\n int64 r_1_1_1_1 = 3358478230553457566;\n r_1_1_1[1] = r_1_1_1_1;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_1900ede5 memory r_1_1_2;\n {\n S_502390a3 memory r_1_1_2_0;\n {\n bool[][2] memory r_1_1_2_0_0;\n {\n bool[] memory r_1_1_2_0_0_0 = new bool[](2);\n {\n bool r_1_1_2_0_0_0_0 = false;\n r_1_1_2_0_0_0[0] = r_1_1_2_0_0_0_0;\n }\n {\n bool r_1_1_2_0_0_0_1 = false;\n r_1_1_2_0_0_0[1] = r_1_1_2_0_0_0_1;\n }\n r_1_1_2_0_0[0] = r_1_1_2_0_0_0;\n }\n {\n bool[] memory r_1_1_2_0_0_1 = new bool[](0);\n r_1_1_2_0_0[1] = r_1_1_2_0_0_1;\n }\n r_1_1_2_0.s_0 = r_1_1_2_0_0;\n }\n {\n S_885e90a2 memory r_1_1_2_0_1;\n {\n address r_1_1_2_0_1_0 = 0xb13d4DF06a5DF00cB09bc488B842f335993424B1;\n r_1_1_2_0_1.s_0 = r_1_1_2_0_1_0;\n }\n {\n string memory r_1_1_2_0_1_1 = unicode\"Moo é🚀oo Mé🚀o🚀é🚀oMé🚀 🚀M ooo🚀o\";\n r_1_1_2_0_1.s_1 = r_1_1_2_0_1_1;\n }\n {\n bytes1 r_1_1_2_0_1_2 = bytes1(0x6c);\n r_1_1_2_0_1.s_2 = r_1_1_2_0_1_2;\n }\n {\n uint216 r_1_1_2_0_1_3 = 31862608245847353469749369818515597333705403400770420586412396690;\n r_1_1_2_0_1.s_3 = r_1_1_2_0_1_3;\n }\n {\n string memory r_1_1_2_0_1_4 = unicode\"Moo é🚀o🚀oé oéé🚀oéoé 🚀é oo oo oM🚀oMooé🚀M 🚀éMé MMMM🚀éoéé M ooé\";\n r_1_1_2_0_1.s_4 = r_1_1_2_0_1_4;\n }\n r_1_1_2_0.s_1 = r_1_1_2_0_1;\n }\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n {\n address r_1_1_3 = 0x0f9278E8F3Ae371aa040928A45951552A8929faa;\n r_1_1.s_3 = r_1_1_3;\n }\n r_1[1] = r_1_1;\n }\n {\n S_a9031fcd memory r_1_2;\n {\n uint24 r_1_2_0 = 2163782;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n int64[2] memory r_1_2_1;\n {\n int64 r_1_2_1_0 = 3886680150632011270;\n r_1_2_1[0] = r_1_2_1_0;\n }\n {\n int64 r_1_2_1_1 = -7495526120747920607;\n r_1_2_1[1] = r_1_2_1_1;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n {\n S_1900ede5 memory r_1_2_2;\n {\n S_502390a3 memory r_1_2_2_0;\n {\n bool[][2] memory r_1_2_2_0_0;\n {\n bool[] memory r_1_2_2_0_0_0 = new bool[](1);\n {\n bool r_1_2_2_0_0_0_0 = false;\n r_1_2_2_0_0_0[0] = r_1_2_2_0_0_0_0;\n }\n r_1_2_2_0_0[0] = r_1_2_2_0_0_0;\n }\n {\n bool[] memory r_1_2_2_0_0_1 = new bool[](0);\n r_1_2_2_0_0[1] = r_1_2_2_0_0_1;\n }\n r_1_2_2_0.s_0 = r_1_2_2_0_0;\n }\n {\n S_885e90a2 memory r_1_2_2_0_1;\n {\n address r_1_2_2_0_1_0 = 0x4c65e31982DadDa42307ADb243ccA8A72Ae64222;\n r_1_2_2_0_1.s_0 = r_1_2_2_0_1_0;\n }\n {\n string memory r_1_2_2_0_1_1 = unicode\"Moo é🚀o🚀🚀M 🚀🚀🚀oM🚀ooM🚀o🚀MMoMooéM 🚀o o \";\n r_1_2_2_0_1.s_1 = r_1_2_2_0_1_1;\n }\n {\n bytes1 r_1_2_2_0_1_2 = bytes1(0x43);\n r_1_2_2_0_1.s_2 = r_1_2_2_0_1_2;\n }\n {\n uint216 r_1_2_2_0_1_3 = 59960313712236422865068254353737427957776817516749974264136530064;\n r_1_2_2_0_1.s_3 = r_1_2_2_0_1_3;\n }\n {\n string memory r_1_2_2_0_1_4 = unicode\"Moo é🚀éééo Méoooo🚀MMo ééooo éMo🚀 oéé é🚀\";\n r_1_2_2_0_1.s_4 = r_1_2_2_0_1_4;\n }\n r_1_2_2_0.s_1 = r_1_2_2_0_1;\n }\n r_1_2_2.s_0 = r_1_2_2_0;\n }\n r_1_2.s_2 = r_1_2_2;\n }\n {\n address r_1_2_3 = 0xbb4c616bc615b7b6C9D8744CdC0C93F90dAd655a;\n r_1_2.s_3 = r_1_2_3;\n }\n r_1[2] = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_a9031fcd[3] memory r_2;\n {\n S_a9031fcd memory r_2_0;\n {\n uint24 r_2_0_0 = 1959728;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n int64[2] memory r_2_0_1;\n {\n int64 r_2_0_1_0 = 4676639648180745163;\n r_2_0_1[0] = r_2_0_1_0;\n }\n {\n int64 r_2_0_1_1 = -885735482008792797;\n r_2_0_1[1] = r_2_0_1_1;\n }\n r_2_0.s_1 = r_2_0_1;\n }\n {\n S_1900ede5 memory r_2_0_2;\n {\n S_502390a3 memory r_2_0_2_0;\n {\n bool[][2] memory r_2_0_2_0_0;\n {\n bool[] memory r_2_0_2_0_0_0 = new bool[](0);\n r_2_0_2_0_0[0] = r_2_0_2_0_0_0;\n }\n {\n bool[] memory r_2_0_2_0_0_1 = new bool[](4);\n {\n bool r_2_0_2_0_0_1_0 = false;\n r_2_0_2_0_0_1[0] = r_2_0_2_0_0_1_0;\n }\n {\n bool r_2_0_2_0_0_1_1 = false;\n r_2_0_2_0_0_1[1] = r_2_0_2_0_0_1_1;\n }\n {\n bool r_2_0_2_0_0_1_2 = true;\n r_2_0_2_0_0_1[2] = r_2_0_2_0_0_1_2;\n }\n {\n bool r_2_0_2_0_0_1_3 = true;\n r_2_0_2_0_0_1[3] = r_2_0_2_0_0_1_3;\n }\n r_2_0_2_0_0[1] = r_2_0_2_0_0_1;\n }\n r_2_0_2_0.s_0 = r_2_0_2_0_0;\n }\n {\n S_885e90a2 memory r_2_0_2_0_1;\n {\n address r_2_0_2_0_1_0 = 0x57A9be1880E68943AdcE4F62e175B3476F0a37CA;\n r_2_0_2_0_1.s_0 = r_2_0_2_0_1_0;\n }\n {\n string memory r_2_0_2_0_1_1 = unicode\"Moo é🚀oé🚀 🚀ééé🚀o🚀🚀o é ééo M🚀ooMMM M🚀Mé\";\n r_2_0_2_0_1.s_1 = r_2_0_2_0_1_1;\n }\n {\n bytes1 r_2_0_2_0_1_2 = bytes1(0x6d);\n r_2_0_2_0_1.s_2 = r_2_0_2_0_1_2;\n }\n {\n uint216 r_2_0_2_0_1_3 = 56048536632962939827198251916750354370706957288921132136638258348;\n r_2_0_2_0_1.s_3 = r_2_0_2_0_1_3;\n }\n {\n string memory r_2_0_2_0_1_4 = unicode\"Moo é🚀ooMo 🚀\";\n r_2_0_2_0_1.s_4 = r_2_0_2_0_1_4;\n }\n r_2_0_2_0.s_1 = r_2_0_2_0_1;\n }\n r_2_0_2.s_0 = r_2_0_2_0;\n }\n r_2_0.s_2 = r_2_0_2;\n }\n {\n address r_2_0_3 = 0x84b65f1320BaBb0E307b5834708301c7cA3023Af;\n r_2_0.s_3 = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n {\n S_a9031fcd memory r_2_1;\n {\n uint24 r_2_1_0 = 13580794;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n int64[2] memory r_2_1_1;\n {\n int64 r_2_1_1_0 = -1722941348427173174;\n r_2_1_1[0] = r_2_1_1_0;\n }\n {\n int64 r_2_1_1_1 = -7075137442856142154;\n r_2_1_1[1] = r_2_1_1_1;\n }\n r_2_1.s_1 = r_2_1_1;\n }\n {\n S_1900ede5 memory r_2_1_2;\n {\n S_502390a3 memory r_2_1_2_0;\n {\n bool[][2] memory r_2_1_2_0_0;\n {\n bool[] memory r_2_1_2_0_0_0 = new bool[](0);\n r_2_1_2_0_0[0] = r_2_1_2_0_0_0;\n }\n {\n bool[] memory r_2_1_2_0_0_1 = new bool[](3);\n {\n bool r_2_1_2_0_0_1_0 = false;\n r_2_1_2_0_0_1[0] = r_2_1_2_0_0_1_0;\n }\n {\n bool r_2_1_2_0_0_1_1 = false;\n r_2_1_2_0_0_1[1] = r_2_1_2_0_0_1_1;\n }\n {\n bool r_2_1_2_0_0_1_2 = false;\n r_2_1_2_0_0_1[2] = r_2_1_2_0_0_1_2;\n }\n r_2_1_2_0_0[1] = r_2_1_2_0_0_1;\n }\n r_2_1_2_0.s_0 = r_2_1_2_0_0;\n }\n {\n S_885e90a2 memory r_2_1_2_0_1;\n {\n address r_2_1_2_0_1_0 = 0x7Ba0c2677B5E0F8f38F7F63706285827487f81ef;\n r_2_1_2_0_1.s_0 = r_2_1_2_0_1_0;\n }\n {\n string memory r_2_1_2_0_1_1 = unicode\"Moo é🚀éoooMoo \";\n r_2_1_2_0_1.s_1 = r_2_1_2_0_1_1;\n }\n {\n bytes1 r_2_1_2_0_1_2 = bytes1(0x92);\n r_2_1_2_0_1.s_2 = r_2_1_2_0_1_2;\n }\n {\n uint216 r_2_1_2_0_1_3 = 16433703827913589581502359332569286188739228227578518029371614977;\n r_2_1_2_0_1.s_3 = r_2_1_2_0_1_3;\n }\n {\n string memory r_2_1_2_0_1_4 = unicode\"Moo é🚀🚀🚀M🚀oéo🚀é ooéoMooo🚀o🚀oé🚀🚀oéoo🚀Mo🚀 🚀Mé oo🚀\";\n r_2_1_2_0_1.s_4 = r_2_1_2_0_1_4;\n }\n r_2_1_2_0.s_1 = r_2_1_2_0_1;\n }\n r_2_1_2.s_0 = r_2_1_2_0;\n }\n r_2_1.s_2 = r_2_1_2;\n }\n {\n address r_2_1_3 = 0x971FEF9281643D6d0DEb6A7e71b6AfB274F42BB0;\n r_2_1.s_3 = r_2_1_3;\n }\n r_2[1] = r_2_1;\n }\n {\n S_a9031fcd memory r_2_2;\n {\n uint24 r_2_2_0 = 3688368;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n int64[2] memory r_2_2_1;\n {\n int64 r_2_2_1_0 = 7692595569902164889;\n r_2_2_1[0] = r_2_2_1_0;\n }\n {\n int64 r_2_2_1_1 = -3971984619589784919;\n r_2_2_1[1] = r_2_2_1_1;\n }\n r_2_2.s_1 = r_2_2_1;\n }\n {\n S_1900ede5 memory r_2_2_2;\n {\n S_502390a3 memory r_2_2_2_0;\n {\n bool[][2] memory r_2_2_2_0_0;\n {\n bool[] memory r_2_2_2_0_0_0 = new bool[](4);\n {\n bool r_2_2_2_0_0_0_0 = true;\n r_2_2_2_0_0_0[0] = r_2_2_2_0_0_0_0;\n }\n {\n bool r_2_2_2_0_0_0_1 = true;\n r_2_2_2_0_0_0[1] = r_2_2_2_0_0_0_1;\n }\n {\n bool r_2_2_2_0_0_0_2 = false;\n r_2_2_2_0_0_0[2] = r_2_2_2_0_0_0_2;\n }\n {\n bool r_2_2_2_0_0_0_3 = false;\n r_2_2_2_0_0_0[3] = r_2_2_2_0_0_0_3;\n }\n r_2_2_2_0_0[0] = r_2_2_2_0_0_0;\n }\n {\n bool[] memory r_2_2_2_0_0_1 = new bool[](0);\n r_2_2_2_0_0[1] = r_2_2_2_0_0_1;\n }\n r_2_2_2_0.s_0 = r_2_2_2_0_0;\n }\n {\n S_885e90a2 memory r_2_2_2_0_1;\n {\n address r_2_2_2_0_1_0 = 0xf46E8Fb760454aC809C8b54d6FFd5164a2eB0EFe;\n r_2_2_2_0_1.s_0 = r_2_2_2_0_1_0;\n }\n {\n string memory r_2_2_2_0_1_1 = unicode\"Moo é🚀 éo🚀oé🚀 M\";\n r_2_2_2_0_1.s_1 = r_2_2_2_0_1_1;\n }\n {\n bytes1 r_2_2_2_0_1_2 = bytes1(0x0a);\n r_2_2_2_0_1.s_2 = r_2_2_2_0_1_2;\n }\n {\n uint216 r_2_2_2_0_1_3 = 58703094886778838796687464122993861423723403987518296264635840146;\n r_2_2_2_0_1.s_3 = r_2_2_2_0_1_3;\n }\n {\n string memory r_2_2_2_0_1_4 = unicode\"Moo é🚀 éoooMo M MM é oMM🚀o🚀 o🚀o🚀🚀M o 🚀oM\";\n r_2_2_2_0_1.s_4 = r_2_2_2_0_1_4;\n }\n r_2_2_2_0.s_1 = r_2_2_2_0_1;\n }\n r_2_2_2.s_0 = r_2_2_2_0;\n }\n r_2_2.s_2 = r_2_2_2;\n }\n {\n address r_2_2_3 = 0xb44d01A33e16eFFB157ae498A272c7E54dbf4824;\n r_2_2.s_3 = r_2_2_3;\n }\n r_2[2] = r_2_2;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000007838fd00000000000000000000000000000000000000000000000052e9aa17bf9e05e30000000000000000000000000000000000000000000000003b6f57e67047e5f400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000009e749337db3f580ada7d5c4639798893ea7526b50000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000007967b6017c61a0d3245f1aa3d18d5071da010a5100000000000000000000000000000000000000000000000000000000000000a0bb00000000000000000000000000000000000000000000000000000000000000000000000032e988690e412da48c036fe5c3bd253654e72a641583075a91b07e00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a804d6ff09f9a80f09f9a806f6f6f6f6ff09f9a806ff09f9a8020c3a94d6ff09f9a806f6ff09f9a806ff09f9a804d6f00000000000000000000000000000000000000000000000000000000000000000000000000398d11ffffffffffffffffffffffffffffffffffffffffffffffffc833599e0a60d5780000000000000000000000000000000000000000000000006877aad715699dce00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b00441329843ac8adfd78cc9ab6bbdec78ad0540000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cf9da3bfa345a2558a99f6fa3d651da12b6d8ce300000000000000000000000000000000000000000000000000000000000000a0590000000000000000000000000000000000000000000000000000000000000000000000002ddb6b1cc136b6e5e271b8123ad8adc3951d2282053794688fd39000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a804df09f9a80f09f9a806ff09f9a80c3a9f09f9a80f09f9a806f4d4d4df09f9a806f4d204d20c3a94d4df09f9a804d2020f09f9a80c3a9c3a96f6f6f6f6f6f2020f09f9a806fc3a9f09f9a80f09f9a804d6f20c3a96ff09f9a80c3a96f6fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4eece000000000000000000000000000000000000000000000000202d2771a9a78e45ffffffffffffffffffffffffffffffffffffffffffffffff86254086b7b1b70900000000000000000000000000000000000000000000000000000000000000a00000000000000000000000005814ed4f37d81895462f38dd32d0d2d2d4eb2c800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e03fa562aef693bd4a95213797d4f1f25860e7c600000000000000000000000000000000000000000000000000000000000000a0d3000000000000000000000000000000000000000000000000000000000000000000000000499912702fa9188a4076fb7c06ac693dcb25f2fe8d5466ab904600000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a80c3a9f09f9a80206f6f4d6f20c3a96f6fc3a94dc3a9c3a9c3a96f6f6fc3a9c3a9c3a9f09f9a806fc3a9c3a9c3a9206f6f20c3a96ff09f9a80f09f9a80f09f9a80c3a9f09f9a80204d6fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000734d6f6f20c3a9f09f9a80206ff09f9a80c3a94dc3a920f09f9a80f09f9a80204df09f9a804dc3a9c3a9f09f9a806f4d6ff09f9a804d6f6f4d206f4df09f9a80c3a96f6fc3a94dc3a9204d206ff09f9a804df09f9a804d2020f09f9a806ff09f9a806f6fc3a96f4d6ff09f9a8020f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000ddc3bc000000000000000000000000000000000000000000000000071f192c939950100000000000000000000000000000000000000000000000000b1470568010345f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000046502e3551e8cb08916e43e57a5afc594446dd680000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfb96a7f4f88c0ab5fce2b2915000d51a08243ee00000000000000000000000000000000000000000000000000000000000000a0a4000000000000000000000000000000000000000000000000000000000000000000000000e5273bed862c7fb729df80825f7f6a1d01eb5f000c39e0792dc3f9000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a80206f6f206f20c3a9f09f9a806f6f4d4dc3a94df09f9a804d20f09f9a806ff09f9a806f20f09f9a806fc3a9f09f9a804dc3a9f09f9a804d6f206f20c3a9c3a96f6f6f4df09f9a80c3a9f09f9a80c3a96f6fc3a96f6f204dc3a96fc3a94d4d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a806f6f6fc3a96ff09f9a804d6fc3a96ff09f9a80204d6f6f6f20204df09f9a80206f6fc3a9c3a9c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000018d433ffffffffffffffffffffffffffffffffffffffffffffffffc68b5bdd602f42210000000000000000000000000000000000000000000000002e9bb6281e05739e00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000f9278e8f3ae371aa040928a45951552a8929faa000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b13d4df06a5df00cb09bc488b842f335993424b100000000000000000000000000000000000000000000000000000000000000a06c0000000000000000000000000000000000000000000000000000000000000000000000004d742658adf16776c10030c279339e5a3c80a696c9624b6fe25092000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806f6f204dc3a9f09f9a806ff09f9a80c3a9f09f9a806f4dc3a9f09f9a8020f09f9a804d206f6f6ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a806ff09f9a806fc3a920206fc3a9c3a9f09f9a806fc3a96fc3a920f09f9a80c3a9206f6f206f6f206f4df09f9a806f4d6f6fc3a9f09f9a804d20f09f9a80c3a94dc3a9204d4d4d4df09f9a80c3a96fc3a9c3a9204d206f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021044600000000000000000000000000000000000000000000000035f0430125fb9606ffffffffffffffffffffffffffffffffffffffffffffffff97fa8ab4c828932100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000bb4c616bc615b7b6c9d8744cdc0c93f90dad655a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c65e31982dadda42307adb243cca8a72ae6422200000000000000000000000000000000000000000000000000000000000000a04300000000000000000000000000000000000000000000000000000000000000000000000091c165138e7aafa2ab3d02f6f13fc44074e4d709b021c996baf890000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a806ff09f9a80f09f9a804d20f09f9a80f09f9a80f09f9a806f4df09f9a806f6f4df09f9a806ff09f9a804d4d6f4d6f6fc3a94d20f09f9a806f206f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80c3a9c3a9c3a96f204dc3a96f6f6f6ff09f9a804d4d6f2020c3a9c3a96f6f6f20c3a94d6ff09f9a80206fc3a9c3a920c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000001de73000000000000000000000000000000000000000000000000040e6c2fb6c5233cbfffffffffffffffffffffffffffffffffffffffffffffffff3b53c459de8112300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000084b65f1320babb0e307b5834708301c7ca3023af0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000057a9be1880e68943adce4f62e175b3476f0a37ca00000000000000000000000000000000000000000000000000000000000000a06d000000000000000000000000000000000000000000000000000000000000000000000000883f1708b95cffd5eea5996a4eb04392905294f5e60cefa2251cac000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a806fc3a9f09f9a8020f09f9a80c3a9c3a9c3a9f09f9a806ff09f9a80f09f9a806f20c3a920c3a9c3a96f204df09f9a806f6f4d4d4d204df09f9a804dc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806f6f4d6f20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf39faffffffffffffffffffffffffffffffffffffffffffffffffe816e1f8de2a72caffffffffffffffffffffffffffffffffffffffffffffffff9dd00ffb3d7e7ab600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000971fef9281643d6d0deb6a7e71b6afb274f42bb000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ba0c2677b5e0f8f38f7f63706285827487f81ef00000000000000000000000000000000000000000000000000000000000000a09200000000000000000000000000000000000000000000000000000000000000000000000027f2b810567a789a63179f96b6778740f17d674122c67c7c06a70100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80c3a96f6f6f4d6f6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a80f09f9a80f09f9a804df09f9a806fc3a96ff09f9a80c3a9206f6fc3a96f4d6f6f6ff09f9a806ff09f9a806fc3a9f09f9a80f09f9a806fc3a96f6ff09f9a804d6ff09f9a8020f09f9a804dc3a9206f6ff09f9a8000000000000000000000000000000000000000000000000000000000000000003847b00000000000000000000000000000000000000000000000006ac196e9e8c31b99ffffffffffffffffffffffffffffffffffffffffffffffffc8e0ad0870092aa900000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b44d01a33e16effb157ae498a272c7e54dbf4824000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f46e8fb760454ac809c8b54d6ffd5164a2eb0efe00000000000000000000000000000000000000000000000000000000000000a00a0000000000000000000000000000000000000000000000000000000000000000000000008eb3068ff010187e190e82ade9660f131c6b9c035638dd0573f69200000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a8020c3a96ff09f9a806fc3a9f09f9a80204d000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a8020c3a96f6f6f4d6f204d204d4d20c3a9206f4d4df09f9a806ff09f9a80206ff09f9a806ff09f9a80f09f9a804d206f2020f09f9a806f4d00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(((string,address,bytes30,(uint240,string[2][3],(bytes12)),uint72),bool,bool,int48),int112,bytes1,string)", + "type": "(((string,address,bytes30,(uint240,string[2][3],(bytes12)),uint72),bool,bool,int48),int112,bytes1,string)", + "value": [ + [ + [ + "Moo é🚀oo ooo éMéo🚀oo", + "0x88FDF5389adfc060bC6566bc6D325729E0d25ba2", + "0x48453874a70d956abff059536cdca94a90d21a2fc75463e8bb4f468a1001", + [ + "998207974724704301982761600087456641428608250369892593831980993255221722", + [ + ["Moo é🚀", "Moo é🚀o🚀 MMéMé🚀o🚀é Méooo oM🚀🚀éo🚀🚀MoMMéoo🚀o"], + ["Moo é🚀oMoMooo🚀", "Moo é🚀 MéMM"], + ["Moo é🚀éooé 🚀🚀oMéoé M🚀ééoM o 🚀é", "Moo é🚀🚀ooé 🚀o"] + ], + ["0x3b190ccc4b8de4eda077bf48"] + ], + "3115037690195025298773" + ], + true, + false, + "5375968087072" + ], + "-2348062724939223504806037714083334", + "0x6a", + "Moo é🚀oo🚀oooo o 🚀🚀o🚀MéoééMoé oéM🚀 é 🚀oMéoéoo🚀oMMM🚀éo🚀 oMM" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo ooo éMéo🚀oo" + }, + { + "type": "address", + "value": "0x88FDF5389adfc060bC6566bc6D325729E0d25ba2" + }, + { + "type": "hexstring", + "value": "0x48453874a70d956abff059536cdca94a90d21a2fc75463e8bb4f468a1001" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "998207974724704301982761600087456641428608250369892593831980993255221722" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀 MMéMé🚀o🚀é Méooo oM🚀🚀éo🚀🚀MoMMéoo🚀o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMoMooo🚀" + }, + { + "type": "string", + "value": "Moo é🚀 MéMM" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooé 🚀🚀oMéoé M🚀ééoM o 🚀é" + }, + { + "type": "string", + "value": "Moo é🚀🚀ooé 🚀o" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3b190ccc4b8de4eda077bf48" + } + ] + } + ] + }, + { + "type": "number", + "value": "3115037690195025298773" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "5375968087072" + } + ] + }, + { + "type": "number", + "value": "-2348062724939223504806037714083334" + }, + { + "type": "hexstring", + "value": "0x6a" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀oooo o 🚀🚀o🚀MéoééMoé oéM🚀 é 🚀oMéoéoo🚀oMMM🚀éo🚀 oMM" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061070d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610450565b60405180910390f35b6100566102d7565b61005e6102d7565b610066610303565b61006e610331565b604080518082018252601d81527f4d6f6f20c3a9f09f9a806f6f206f6f6f20c3a94dc3a96ff09f9a806f6f0000006020808301919091529083527388fdf5389adfc060bc6566bc6d325729e0d25ba2908301527f48453874a70d956abff059536cdca94a90d21a2fc75463e8bb4f468a10010000908201526100ee610374565b7d90a19772c77761240116b1264808e82db70e920f8899a5f034083ffea9da81526101176103af565b61011f6103dc565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160808101909252604e808352600092916105f490830139602083015250815261016e6103dc565b60408051808201825260158152739adede418753e13f3500de9ade9adededfe13f35605f1b602080830191909152908352815180830190925260118252704d6f6f20c3a9f09f9a8020204dc3a94d4d60781b82820152828101919091528201526101d66103dc565b600060405180606001604052806035815260200161064260359139825250604080518082018252601881527f4d6f6f20c3a9f09f9a80f09f9a806f6fc3a920f09f9a806f0000000000000000602080830191909152808401919091528382019290925283820192909252815180820183526b076321998971bc9db40ef7e960a31b81528383015260608481019390935268a8ddd5030e2bcb8555608085015292845260018484015260008482018190526504e3b0ab0c20928501929092529284526d73c4b7db20cefa51b8ff97679e051984830152603560f91b84840152825160a08101909352606180845290929161067790830139606083015250919050565b60405180608001604052806102ea610303565b8152600060208201819052604082015260609081015290565b6040518060800160405280610316610331565b81526000602082018190526040820181905260609091015290565b6040518060a001604052806060815260200160006001600160a01b03168152602001600061ffff19168152602001610367610374565b8152600060209091015290565b604051806060016040528060006001600160f01b031681526020016103976103af565b81526040805160208181019092526000815291015290565b60405180606001604052806003905b6103c66103dc565b8152602001906001900390816103be5790505090565b60405180604001604052806002905b60608152602001906001900390816103eb5790505090565b6000815180845260005b818110156104295760208185018101518683018201520161040d565b8181111561043b576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516080828501528051608060a0860152805160a06101208701526104806101c0870182610403565b828501516001600160a01b031661014088015260408084015161ffff191661016089015260608085015189840361011f19016101808b015280516001600160f01b0316845280880151888501839052939450919290919060c08501908386016000805b600381101561054257888503605f19018352835185898101845b600281101561052d578882038352610516828551610403565b91508f840193508f830192506001810190506104fd565b5096505050928b0192918b01916001016104e3565b505050509083015180516001600160a01b03191685850152906080860151955061057a6101a08b018768ffffffffffffffffff169052565b87870151151560c08b01528387015180151560e08c015296830151600581900b6101008c0152969550968a0151966105b68a850189600d0b9052565b838b01516001600160f81b031916838b0152828b0151601f198b83030160808c015297506105e48189610403565b9b9a505050505050505050505056fe4d6f6f20c3a9f09f9a806ff09f9a8020204d4dc3a94dc3a9f09f9a806ff09f9a80c3a920204dc3a96f6f6f206f4df09f9a80f09f9a80c3a96ff09f9a80f09f9a804d6f4d4dc3a96f6ff09f9a806f4d6f6f20c3a9f09f9a80c3a96f6fc3a920f09f9a80f09f9a806f4dc3a96fc3a9204df09f9a80c3a9c3a96f4d206f20f09f9a80c3a94d6f6f20c3a9f09f9a806f6ff09f9a806f6f6f6f206f20f09f9a80f09f9a806ff09f9a804dc3a96fc3a9c3a94d6fc3a9206fc3a94df09f9a8020c3a920f09f9a806f4dc3a96fc3a96f6ff09f9a806f4d4d4df09f9a80c3a96ff09f9a80206f4d4da2646970667358221220287504ca6ac67b453350aeb939765fedda57dff8b8a89eec25c15d0f993577cf64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d13f080d {\n bytes12 s_0;\n }\n\n struct S_bf60a306 {\n uint240 s_0;\n string[2][3] s_1;\n S_d13f080d s_2;\n }\n\n struct S_efddd9ad {\n string s_0;\n address s_1;\n bytes30 s_2;\n S_bf60a306 s_3;\n uint72 s_4;\n }\n\n struct S_c64c6445 {\n S_efddd9ad s_0;\n bool s_1;\n bool s_2;\n int48 s_3;\n }\n\n struct S_5f5c3c63 {\n S_c64c6445 s_0;\n int112 s_1;\n bytes1 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_5f5c3c63 memory) {\n S_5f5c3c63 memory r;\n {\n S_c64c6445 memory r_0;\n {\n S_efddd9ad memory r_0_0;\n {\n string memory r_0_0_0 = unicode\"Moo é🚀oo ooo éMéo🚀oo\";\n r_0_0.s_0 = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x88FDF5389adfc060bC6566bc6D325729E0d25ba2;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bytes30 r_0_0_2 = bytes30(0x48453874a70d956abff059536cdca94a90d21a2fc75463e8bb4f468a1001);\n r_0_0.s_2 = r_0_0_2;\n }\n {\n S_bf60a306 memory r_0_0_3;\n {\n uint240 r_0_0_3_0 = 998207974724704301982761600087456641428608250369892593831980993255221722;\n r_0_0_3.s_0 = r_0_0_3_0;\n }\n {\n string[2][3] memory r_0_0_3_1;\n {\n string[2] memory r_0_0_3_1_0;\n {\n string memory r_0_0_3_1_0_0 = unicode\"Moo é🚀\";\n r_0_0_3_1_0[0] = r_0_0_3_1_0_0;\n }\n {\n string memory r_0_0_3_1_0_1 = unicode\"Moo é🚀o🚀 MMéMé🚀o🚀é Méooo oM🚀🚀éo🚀🚀MoMMéoo🚀o\";\n r_0_0_3_1_0[1] = r_0_0_3_1_0_1;\n }\n r_0_0_3_1[0] = r_0_0_3_1_0;\n }\n {\n string[2] memory r_0_0_3_1_1;\n {\n string memory r_0_0_3_1_1_0 = unicode\"Moo é🚀oMoMooo🚀\";\n r_0_0_3_1_1[0] = r_0_0_3_1_1_0;\n }\n {\n string memory r_0_0_3_1_1_1 = unicode\"Moo é🚀 MéMM\";\n r_0_0_3_1_1[1] = r_0_0_3_1_1_1;\n }\n r_0_0_3_1[1] = r_0_0_3_1_1;\n }\n {\n string[2] memory r_0_0_3_1_2;\n {\n string memory r_0_0_3_1_2_0 = unicode\"Moo é🚀éooé 🚀🚀oMéoé M🚀ééoM o 🚀é\";\n r_0_0_3_1_2[0] = r_0_0_3_1_2_0;\n }\n {\n string memory r_0_0_3_1_2_1 = unicode\"Moo é🚀🚀ooé 🚀o\";\n r_0_0_3_1_2[1] = r_0_0_3_1_2_1;\n }\n r_0_0_3_1[2] = r_0_0_3_1_2;\n }\n r_0_0_3.s_1 = r_0_0_3_1;\n }\n {\n S_d13f080d memory r_0_0_3_2;\n {\n bytes12 r_0_0_3_2_0 = bytes12(0x3b190ccc4b8de4eda077bf48);\n r_0_0_3_2.s_0 = r_0_0_3_2_0;\n }\n r_0_0_3.s_2 = r_0_0_3_2;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n {\n uint72 r_0_0_4 = 3115037690195025298773;\n r_0_0.s_4 = r_0_0_4;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n bool r_0_2 = false;\n r_0.s_2 = r_0_2;\n }\n {\n int48 r_0_3 = 5375968087072;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n int112 r_1 = -2348062724939223504806037714083334;\n r.s_1 = r_1;\n }\n {\n bytes1 r_2 = bytes1(0x6a);\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀oo🚀oooo o 🚀🚀o🚀MéoééMoé oéM🚀 é 🚀oMéoéoo🚀oMMM🚀éo🚀 oMM\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffffff8c3b4824df3105ae4700689861fa6a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e3b0ab0c2000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000088fdf5389adfc060bc6566bc6d325729e0d25ba248453874a70d956abff059536cdca94a90d21a2fc75463e8bb4f468a1001000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000a8ddd5030e2bcb8555000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f6f206f6f6f20c3a94dc3a96ff09f9a806f6f000000000090a19772c77761240116b1264808e82db70e920f8899a5f034083ffea9da00000000000000000000000000000000000000000000000000000000000000603b190ccc4b8de4eda077bf48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a806ff09f9a8020204d4dc3a94dc3a9f09f9a806ff09f9a80c3a920204dc3a96f6f6f206f4df09f9a80f09f9a80c3a96ff09f9a80f09f9a804d6f4d4dc3a96f6ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a806f4d6f4d6f6f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a8020204dc3a94d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a80c3a96f6fc3a920f09f9a80f09f9a806f4dc3a96fc3a9204df09f9a80c3a9c3a96f4d206f20f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80f09f9a806f6fc3a920f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a806f6ff09f9a806f6f6f6f206f20f09f9a80f09f9a806ff09f9a804dc3a96fc3a9c3a94d6fc3a9206fc3a94df09f9a8020c3a920f09f9a806f4dc3a96fc3a96f6ff09f9a806f4d4d4df09f9a80c3a96ff09f9a80206f4d4d00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address[4],address[],bool[3],bytes29,address[])[2][2],string,address,uint144[])", + "type": "((address[4],address[],bool[3],bytes29,address[])[2][2],string,address,uint144[])", + "value": [ + [ + [ + [ + [ + "0x1D226Feea5B580BFd3af103bE0ca482bf7f816d5", + "0xc60B0BE0605e3eB11234d7566831e16B38973fC7", + "0x679449aa378f0F9aF44707F3989cE30Fcb465296", + "0xC5Ae051024a8dcf9465817e42Fda8481494A6124" + ], + [ + "0xcB08Df4f3164FE46Ab6E89713619EbbF56d59f9F", + "0x91e846e7d98640BB2CF11B8b3b183b4257DC4A03", + "0x4B716f40Fc3D264609680b2793CDe74ea9E4294A", + "0x766d4141D6AdeFB751A8758562f0460C41f58055" + ], + [false, true, true], + "0x4f98d7e7a91dae0f30938ec3ec0cabe08c6a9827ce4b0bdf07c9d4a7f6", + [ + "0x6dAAEb4BFcB1350f55Ab5fb218540d5E32243779", + "0xF0F3f92C0601A0ec84068A77c41BB6a86DaFa784", + "0x59169cDB688801CA8D3A536666be29821099e9De", + "0x0915F10AECD1fB0e9dF25eEE63a81aFe08d3383F" + ] + ], + [ + [ + "0x40dCc5D22A8C716Cf77447adc3F75Ac49A6046b1", + "0xf60fFeE18eF19A26F556BbF5f0247524412C9360", + "0x12be0F7525c2352FC43fc21cC4E65d221cfe272f", + "0x677B24F3dD42EE063765239D6227379329D39728" + ], + [], + [true, true, true], + "0x713bc26af92fc70562f3ba22356657e3d0d390f8d9517c331911be270d", + [ + "0x6861Ab7fA2FE7B180661e15242665f7d4c842347", + "0x0485B7F781208cE4C0Ecf01d10b89C72FF0ABA65", + "0xb3B809c752aa66c975A7b2d58aF1feF9e1e5e272" + ] + ] + ], + [ + [ + [ + "0x1084ccE6c2f283c7C8b9aE236f8F150ac140b2e6", + "0x50Bb770e203241dD8E212E179b7C574AE93D7497", + "0x34272F2305F6772887B9fA3822cb0386ac0825fF", + "0x20b8933BB4d79DF827f7107Ca577a2C782da0D03" + ], + [], + [true, true, true], + "0x4ba84d657c9197536bb62c85aafb6563182800535736c727e88fda1cc2", + [] + ], + [ + [ + "0x37782C536ba4F2555aE6d9dce9833d0C6661D5E0", + "0x57F7dE449c3b8d39c3804f5EbEeae6517d6229F0", + "0x642A9E62FCc3D7789c664476EC1a1E5aE1Bc0Daa", + "0xCBdc50E5e36C4dFa51D3D90B91fD4C819d3eE1D8" + ], + [ + "0xB754E459E6cC56e117232C7B6c8Da65716BbbC25", + "0x5549d3d4F0Ca9232c3f7e73c415b6e631e0Eb6f5" + ], + [false, true, true], + "0xbf28a31947576c73346c7a356618ea6497753097fbde46bcdcd9d67cfe", + [ + "0xd468ecf64c16FD41379019FFE6d90Df74515F8d8", + "0xAd5C935582E51a68ec2f4F968315299EF76B7382" + ] + ] + ] + ], + "Moo é🚀oo🚀oo🚀ééo oMMo🚀🚀éM🚀éé🚀o 🚀oéoé🚀oéo🚀é", + "0xe92cF93697B56093B04C57d7808352529Ab86fB2", + [ + "10839282410974085545049655487999014380610003", + "2224009049836471620008649945337810268201861", + "15344869964919693839632180566457816676834074", + "16236888109866797014123203250676465792717884" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1D226Feea5B580BFd3af103bE0ca482bf7f816d5" + }, + { + "type": "address", + "value": "0xc60B0BE0605e3eB11234d7566831e16B38973fC7" + }, + { + "type": "address", + "value": "0x679449aa378f0F9aF44707F3989cE30Fcb465296" + }, + { + "type": "address", + "value": "0xC5Ae051024a8dcf9465817e42Fda8481494A6124" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xcB08Df4f3164FE46Ab6E89713619EbbF56d59f9F" + }, + { + "type": "address", + "value": "0x91e846e7d98640BB2CF11B8b3b183b4257DC4A03" + }, + { + "type": "address", + "value": "0x4B716f40Fc3D264609680b2793CDe74ea9E4294A" + }, + { + "type": "address", + "value": "0x766d4141D6AdeFB751A8758562f0460C41f58055" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x4f98d7e7a91dae0f30938ec3ec0cabe08c6a9827ce4b0bdf07c9d4a7f6" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6dAAEb4BFcB1350f55Ab5fb218540d5E32243779" + }, + { + "type": "address", + "value": "0xF0F3f92C0601A0ec84068A77c41BB6a86DaFa784" + }, + { + "type": "address", + "value": "0x59169cDB688801CA8D3A536666be29821099e9De" + }, + { + "type": "address", + "value": "0x0915F10AECD1fB0e9dF25eEE63a81aFe08d3383F" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x40dCc5D22A8C716Cf77447adc3F75Ac49A6046b1" + }, + { + "type": "address", + "value": "0xf60fFeE18eF19A26F556BbF5f0247524412C9360" + }, + { + "type": "address", + "value": "0x12be0F7525c2352FC43fc21cC4E65d221cfe272f" + }, + { + "type": "address", + "value": "0x677B24F3dD42EE063765239D6227379329D39728" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x713bc26af92fc70562f3ba22356657e3d0d390f8d9517c331911be270d" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6861Ab7fA2FE7B180661e15242665f7d4c842347" + }, + { + "type": "address", + "value": "0x0485B7F781208cE4C0Ecf01d10b89C72FF0ABA65" + }, + { + "type": "address", + "value": "0xb3B809c752aa66c975A7b2d58aF1feF9e1e5e272" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1084ccE6c2f283c7C8b9aE236f8F150ac140b2e6" + }, + { + "type": "address", + "value": "0x50Bb770e203241dD8E212E179b7C574AE93D7497" + }, + { + "type": "address", + "value": "0x34272F2305F6772887B9fA3822cb0386ac0825fF" + }, + { + "type": "address", + "value": "0x20b8933BB4d79DF827f7107Ca577a2C782da0D03" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x4ba84d657c9197536bb62c85aafb6563182800535736c727e88fda1cc2" + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x37782C536ba4F2555aE6d9dce9833d0C6661D5E0" + }, + { + "type": "address", + "value": "0x57F7dE449c3b8d39c3804f5EbEeae6517d6229F0" + }, + { + "type": "address", + "value": "0x642A9E62FCc3D7789c664476EC1a1E5aE1Bc0Daa" + }, + { + "type": "address", + "value": "0xCBdc50E5e36C4dFa51D3D90B91fD4C819d3eE1D8" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB754E459E6cC56e117232C7B6c8Da65716BbbC25" + }, + { + "type": "address", + "value": "0x5549d3d4F0Ca9232c3f7e73c415b6e631e0Eb6f5" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xbf28a31947576c73346c7a356618ea6497753097fbde46bcdcd9d67cfe" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xd468ecf64c16FD41379019FFE6d90Df74515F8d8" + }, + { + "type": "address", + "value": "0xAd5C935582E51a68ec2f4F968315299EF76B7382" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo🚀oo🚀ééo oMMo🚀🚀éM🚀éé🚀o 🚀oéoé🚀oéo🚀é" + }, + { + "type": "address", + "value": "0xe92cF93697B56093B04C57d7808352529Ab86fB2" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "10839282410974085545049655487999014380610003" + }, + { + "type": "number", + "value": "2224009049836471620008649945337810268201861" + }, + { + "type": "number", + "value": "15344869964919693839632180566457816676834074" + }, + { + "type": "number", + "value": "16236888109866797014123203250676465792717884" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610ea1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610c9f565b60405180910390f35b610056610aad565b61005e610aad565b610066610ad9565b61006e610b06565b610076610b33565b61007e610b6e565b731d226feea5b580bfd3af103be0ca482bf7f816d5815273c60b0be0605e3eb11234d7566831e16b38973fc7602082015273679449aa378f0f9af44707f3989ce30fcb46529660408083019190915273c5ae051024a8dcf9465817e42fda8481494a612460608301529082528051600480825260a08201909252600091816020016020820280368337019050509050600073cb08df4f3164fe46ab6e89713619ebbf56d59f9f9050808260008151811061013a5761013a610e04565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007391e846e7d98640bb2cf11b8b3b183b4257dc4a039050808260018151811061018857610188610e04565b60200260200101906001600160a01b031690816001600160a01b031681525050506000734b716f40fc3d264609680b2793cde74ea9e4294a905080826002815181106101d6576101d6610e04565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073766d4141d6adefb751a8758562f0460c41f580559050808260038151811061022457610224610e04565b6001600160a01b039092166020928302919091018201528301919091525061024a610b8c565b600080825260016020808401829052604080850192909252848201939093527f4f98d7e7a91dae0f30938ec3ec0cabe08c6a9827ce4b0bdf07c9d4a7f600000060608501528051600480825260a08201909252919282016080803683370190505090506000736daaeb4bfcb1350f55ab5fb218540d5e32243779905080826000815181106102da576102da610e04565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073f0f3f92c0601a0ec84068a77c41bb6a86dafa7849050808260018151811061032857610328610e04565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007359169cdb688801ca8d3a536666be29821099e9de9050808260028151811061037657610376610e04565b60200260200101906001600160a01b031690816001600160a01b031681525050506000730915f10aecd1fb0e9df25eee63a81afe08d3383f905080826003815181106103c4576103c4610e04565b6001600160a01b03929092166020928302919091019091015250608082015281526103ed610b33565b6103f5610b6e565b7340dcc5d22a8c716cf77447adc3f75ac49a6046b1815273f60ffee18ef19a26f556bbf5f0247524412c93606020808301919091527312be0f7525c2352fc43fc21cc4e65d221cfe272f60408084019190915273677b24f3dd42ee063765239d6227379329d39728606084015291835281516000815280820190925282015261047c610b8c565b600180825260208201819052604080830191909152828101919091527f713bc26af92fc70562f3ba22356657e3d0d390f8d9517c331911be270d000000606083015280516003808252608082019092526000918160200160208202803683370190505090506000736861ab7fa2fe7b180661e15242665f7d4c8423479050808260008151811061050e5761050e610e04565b60200260200101906001600160a01b031690816001600160a01b031681525050506000730485b7f781208ce4c0ecf01d10b89c72ff0aba659050808260018151811061055c5761055c610e04565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073b3b809c752aa66c975a7b2d58af1fef9e1e5e272905080826002815181106105aa576105aa610e04565b6001600160a01b039290921660209283029190910182015260808401929092525082015281526105d8610b06565b6105e0610b33565b6105e8610b6e565b731084cce6c2f283c7c8b9ae236f8f150ac140b2e681527350bb770e203241dd8e212e179b7c574ae93d74976020808301919091527334272f2305f6772887b9fa3822cb0386ac0825ff6040808401919091527320b8933bb4d79df827f7107ca577a2c782da0d03606084015291835281516000815280820190925282015261066f610b8c565b60018082526020808301829052604080840192909252838201929092527f4ba84d657c9197536bb62c85aafb6563182800535736c727e88fda1cc200000060608401528051600081529182019052608082015281526106cc610b33565b6106d4610b6e565b7337782c536ba4f2555ae6d9dce9833d0c6661d5e081527357f7de449c3b8d39c3804f5ebeeae6517d6229f0602082015273642a9e62fcc3d7789c664476ec1a1e5ae1bc0daa60408083019190915273cbdc50e5e36c4dfa51d3d90b91fd4c819d3ee1d860608084019190915291835280516002808252928101909152600091816020016020820280368337019050509050600073b754e459e6cc56e117232c7b6c8da65716bbbc259050808260008151811061079357610793610e04565b60200260200101906001600160a01b031690816001600160a01b031681525050506000735549d3d4f0ca9232c3f7e73c415b6e631e0eb6f5905080826001815181106107e1576107e1610e04565b6001600160a01b0390921660209283029190910182015283019190915250610807610b8c565b600080825260016020808401829052604080850192909252848201939093527fbf28a31947576c73346c7a356618ea6497753097fbde46bcdcd9d67cfe000000606080860191909152815160028082529181018352929390919083019080368337019050509050600073d468ecf64c16fd41379019ffe6d90df74515f8d89050808260008151811061089b5761089b610e04565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073ad5c935582e51a68ec2f4f968315299ef76b7382905080826001815181106108e9576108e9610e04565b6001600160a01b03929092166020928302919091018201526080848101939093528481019390935250838201929092529183526040805191820190526051808252600092610e1b9083013960208301525073e92cf93697b56093b04c57d7808352529ab86fb26040808301919091528051600480825260a082019092526000918160200160208202803683370190505090506000717c6dc9c118b355ba4f619b4be78dcd61a1d3905080826000815181106109a6576109a6610e04565b60200260200101906001600160901b031690816001600160901b031681525050506000711987c672911b8ab0488e4c72cc60eb4c2385905080826001815181106109f2576109f2610e04565b60200260200101906001600160901b031690816001600160901b03168152505050600071b0268517d1143edf05f2656f1fbfcb941b1a90508082600281518110610a3e57610a3e610e04565b60200260200101906001600160901b031690816001600160901b03168152505050600071ba63ecf5721ce0c72b478d3ab93e2a4c143c90508082600381518110610a8a57610a8a610e04565b6001600160901b0390921660209283029190910190910152506060820152919050565b6040518060800160405280610ac0610ad9565b8152606060208201819052600060408301529081015290565b60405180604001604052806002905b610af0610b06565b815260200190600190039081610ae85790505090565b60405180604001604052806002905b610b1d610b33565b815260200190600190039081610b155790505090565b6040518060a00160405280610b46610b6e565b815260200160608152602001610b5a610b8c565b815260006020820152606060409091015290565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b600081518084526020808501945080840160005b83811015610be35781516001600160a01b031687529582019590820190600101610bbe565b509495945050505050565b8060005b6003811015610c135781511515845260209384019390910190600101610bf2565b50505050565b6000815180845260005b81811015610c3f57602081850181015186830182015201610c23565b81811115610c51576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015610be35781516001600160901b031687529582019590820190600101610c7a565b602080825282516080838301526000919060e084019060a08501845b6002808210610cca5750610da1565b878503609f19018352835185604080820160005b85811015610d8a57898203845284518051610140908460005b6004811015610d1d5782516001600160a01b03168252918f0191908f0190600101610cf7565b5050508c820151816080860152610d3682860182610baa565b91505084820151610d4a60a0860182610bee565b50606082015162ffffff191661010085015260809091015183820361012085015290610d768183610baa565b968d0196958d019593505050600101610cde565b509750505093860193505090840190600101610cbb565b505050818501519150601f1980858303016040860152610dc18284610c19565b925060408601519150610ddf60608601836001600160a01b03169052565b606086015191508085840301608086015250610dfb8282610c66565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6ff09f9a806f6ff09f9a80c3a9c3a96f206f4d4d6ff09f9a80f09f9a80c3a94df09f9a80c3a9c3a9f09f9a806f20f09f9a806fc3a96fc3a9f09f9a806fc3a96ff09f9a80c3a9a26469706673582212201ec33e9ebd13c44c8719eabe90639135da1a4cb7f013a1f4a3de2308b57463bb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_82c52c71 {\n address[4] s_0;\n address[] s_1;\n bool[3] s_2;\n bytes29 s_3;\n address[] s_4;\n }\n\n struct S_694bf363 {\n S_82c52c71[2][2] s_0;\n string s_1;\n address s_2;\n uint144[] s_3;\n }\n\n function test () public pure returns (S_694bf363 memory) {\n S_694bf363 memory r;\n {\n S_82c52c71[2][2] memory r_0;\n {\n S_82c52c71[2] memory r_0_0;\n {\n S_82c52c71 memory r_0_0_0;\n {\n address[4] memory r_0_0_0_0;\n {\n address r_0_0_0_0_0 = 0x1D226Feea5B580BFd3af103bE0ca482bf7f816d5;\n r_0_0_0_0[0] = r_0_0_0_0_0;\n }\n {\n address r_0_0_0_0_1 = 0xc60B0BE0605e3eB11234d7566831e16B38973fC7;\n r_0_0_0_0[1] = r_0_0_0_0_1;\n }\n {\n address r_0_0_0_0_2 = 0x679449aa378f0F9aF44707F3989cE30Fcb465296;\n r_0_0_0_0[2] = r_0_0_0_0_2;\n }\n {\n address r_0_0_0_0_3 = 0xC5Ae051024a8dcf9465817e42Fda8481494A6124;\n r_0_0_0_0[3] = r_0_0_0_0_3;\n }\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n address[] memory r_0_0_0_1 = new address[](4);\n {\n address r_0_0_0_1_0 = 0xcB08Df4f3164FE46Ab6E89713619EbbF56d59f9F;\n r_0_0_0_1[0] = r_0_0_0_1_0;\n }\n {\n address r_0_0_0_1_1 = 0x91e846e7d98640BB2CF11B8b3b183b4257DC4A03;\n r_0_0_0_1[1] = r_0_0_0_1_1;\n }\n {\n address r_0_0_0_1_2 = 0x4B716f40Fc3D264609680b2793CDe74ea9E4294A;\n r_0_0_0_1[2] = r_0_0_0_1_2;\n }\n {\n address r_0_0_0_1_3 = 0x766d4141D6AdeFB751A8758562f0460C41f58055;\n r_0_0_0_1[3] = r_0_0_0_1_3;\n }\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n bool[3] memory r_0_0_0_2;\n {\n bool r_0_0_0_2_0 = false;\n r_0_0_0_2[0] = r_0_0_0_2_0;\n }\n {\n bool r_0_0_0_2_1 = true;\n r_0_0_0_2[1] = r_0_0_0_2_1;\n }\n {\n bool r_0_0_0_2_2 = true;\n r_0_0_0_2[2] = r_0_0_0_2_2;\n }\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n {\n bytes29 r_0_0_0_3 = bytes29(0x4f98d7e7a91dae0f30938ec3ec0cabe08c6a9827ce4b0bdf07c9d4a7f6);\n r_0_0_0.s_3 = r_0_0_0_3;\n }\n {\n address[] memory r_0_0_0_4 = new address[](4);\n {\n address r_0_0_0_4_0 = 0x6dAAEb4BFcB1350f55Ab5fb218540d5E32243779;\n r_0_0_0_4[0] = r_0_0_0_4_0;\n }\n {\n address r_0_0_0_4_1 = 0xF0F3f92C0601A0ec84068A77c41BB6a86DaFa784;\n r_0_0_0_4[1] = r_0_0_0_4_1;\n }\n {\n address r_0_0_0_4_2 = 0x59169cDB688801CA8D3A536666be29821099e9De;\n r_0_0_0_4[2] = r_0_0_0_4_2;\n }\n {\n address r_0_0_0_4_3 = 0x0915F10AECD1fB0e9dF25eEE63a81aFe08d3383F;\n r_0_0_0_4[3] = r_0_0_0_4_3;\n }\n r_0_0_0.s_4 = r_0_0_0_4;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_82c52c71 memory r_0_0_1;\n {\n address[4] memory r_0_0_1_0;\n {\n address r_0_0_1_0_0 = 0x40dCc5D22A8C716Cf77447adc3F75Ac49A6046b1;\n r_0_0_1_0[0] = r_0_0_1_0_0;\n }\n {\n address r_0_0_1_0_1 = 0xf60fFeE18eF19A26F556BbF5f0247524412C9360;\n r_0_0_1_0[1] = r_0_0_1_0_1;\n }\n {\n address r_0_0_1_0_2 = 0x12be0F7525c2352FC43fc21cC4E65d221cfe272f;\n r_0_0_1_0[2] = r_0_0_1_0_2;\n }\n {\n address r_0_0_1_0_3 = 0x677B24F3dD42EE063765239D6227379329D39728;\n r_0_0_1_0[3] = r_0_0_1_0_3;\n }\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n address[] memory r_0_0_1_1 = new address[](0);\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n bool[3] memory r_0_0_1_2;\n {\n bool r_0_0_1_2_0 = true;\n r_0_0_1_2[0] = r_0_0_1_2_0;\n }\n {\n bool r_0_0_1_2_1 = true;\n r_0_0_1_2[1] = r_0_0_1_2_1;\n }\n {\n bool r_0_0_1_2_2 = true;\n r_0_0_1_2[2] = r_0_0_1_2_2;\n }\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n {\n bytes29 r_0_0_1_3 = bytes29(0x713bc26af92fc70562f3ba22356657e3d0d390f8d9517c331911be270d);\n r_0_0_1.s_3 = r_0_0_1_3;\n }\n {\n address[] memory r_0_0_1_4 = new address[](3);\n {\n address r_0_0_1_4_0 = 0x6861Ab7fA2FE7B180661e15242665f7d4c842347;\n r_0_0_1_4[0] = r_0_0_1_4_0;\n }\n {\n address r_0_0_1_4_1 = 0x0485B7F781208cE4C0Ecf01d10b89C72FF0ABA65;\n r_0_0_1_4[1] = r_0_0_1_4_1;\n }\n {\n address r_0_0_1_4_2 = 0xb3B809c752aa66c975A7b2d58aF1feF9e1e5e272;\n r_0_0_1_4[2] = r_0_0_1_4_2;\n }\n r_0_0_1.s_4 = r_0_0_1_4;\n }\n r_0_0[1] = r_0_0_1;\n }\n r_0[0] = r_0_0;\n }\n {\n S_82c52c71[2] memory r_0_1;\n {\n S_82c52c71 memory r_0_1_0;\n {\n address[4] memory r_0_1_0_0;\n {\n address r_0_1_0_0_0 = 0x1084ccE6c2f283c7C8b9aE236f8F150ac140b2e6;\n r_0_1_0_0[0] = r_0_1_0_0_0;\n }\n {\n address r_0_1_0_0_1 = 0x50Bb770e203241dD8E212E179b7C574AE93D7497;\n r_0_1_0_0[1] = r_0_1_0_0_1;\n }\n {\n address r_0_1_0_0_2 = 0x34272F2305F6772887B9fA3822cb0386ac0825fF;\n r_0_1_0_0[2] = r_0_1_0_0_2;\n }\n {\n address r_0_1_0_0_3 = 0x20b8933BB4d79DF827f7107Ca577a2C782da0D03;\n r_0_1_0_0[3] = r_0_1_0_0_3;\n }\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n address[] memory r_0_1_0_1 = new address[](0);\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n bool[3] memory r_0_1_0_2;\n {\n bool r_0_1_0_2_0 = true;\n r_0_1_0_2[0] = r_0_1_0_2_0;\n }\n {\n bool r_0_1_0_2_1 = true;\n r_0_1_0_2[1] = r_0_1_0_2_1;\n }\n {\n bool r_0_1_0_2_2 = true;\n r_0_1_0_2[2] = r_0_1_0_2_2;\n }\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n {\n bytes29 r_0_1_0_3 = bytes29(0x4ba84d657c9197536bb62c85aafb6563182800535736c727e88fda1cc2);\n r_0_1_0.s_3 = r_0_1_0_3;\n }\n {\n address[] memory r_0_1_0_4 = new address[](0);\n r_0_1_0.s_4 = r_0_1_0_4;\n }\n r_0_1[0] = r_0_1_0;\n }\n {\n S_82c52c71 memory r_0_1_1;\n {\n address[4] memory r_0_1_1_0;\n {\n address r_0_1_1_0_0 = 0x37782C536ba4F2555aE6d9dce9833d0C6661D5E0;\n r_0_1_1_0[0] = r_0_1_1_0_0;\n }\n {\n address r_0_1_1_0_1 = 0x57F7dE449c3b8d39c3804f5EbEeae6517d6229F0;\n r_0_1_1_0[1] = r_0_1_1_0_1;\n }\n {\n address r_0_1_1_0_2 = 0x642A9E62FCc3D7789c664476EC1a1E5aE1Bc0Daa;\n r_0_1_1_0[2] = r_0_1_1_0_2;\n }\n {\n address r_0_1_1_0_3 = 0xCBdc50E5e36C4dFa51D3D90B91fD4C819d3eE1D8;\n r_0_1_1_0[3] = r_0_1_1_0_3;\n }\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n address[] memory r_0_1_1_1 = new address[](2);\n {\n address r_0_1_1_1_0 = 0xB754E459E6cC56e117232C7B6c8Da65716BbbC25;\n r_0_1_1_1[0] = r_0_1_1_1_0;\n }\n {\n address r_0_1_1_1_1 = 0x5549d3d4F0Ca9232c3f7e73c415b6e631e0Eb6f5;\n r_0_1_1_1[1] = r_0_1_1_1_1;\n }\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n bool[3] memory r_0_1_1_2;\n {\n bool r_0_1_1_2_0 = false;\n r_0_1_1_2[0] = r_0_1_1_2_0;\n }\n {\n bool r_0_1_1_2_1 = true;\n r_0_1_1_2[1] = r_0_1_1_2_1;\n }\n {\n bool r_0_1_1_2_2 = true;\n r_0_1_1_2[2] = r_0_1_1_2_2;\n }\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n {\n bytes29 r_0_1_1_3 = bytes29(0xbf28a31947576c73346c7a356618ea6497753097fbde46bcdcd9d67cfe);\n r_0_1_1.s_3 = r_0_1_1_3;\n }\n {\n address[] memory r_0_1_1_4 = new address[](2);\n {\n address r_0_1_1_4_0 = 0xd468ecf64c16FD41379019FFE6d90Df74515F8d8;\n r_0_1_1_4[0] = r_0_1_1_4_0;\n }\n {\n address r_0_1_1_4_1 = 0xAd5C935582E51a68ec2f4F968315299EF76B7382;\n r_0_1_1_4[1] = r_0_1_1_4_1;\n }\n r_0_1_1.s_4 = r_0_1_1_4;\n }\n r_0_1[1] = r_0_1_1;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oo🚀oo🚀ééo oMMo🚀🚀éM🚀éé🚀o 🚀oéoé🚀oéo🚀é\";\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xe92cF93697B56093B04C57d7808352529Ab86fB2;\n r.s_2 = r_2;\n }\n {\n uint144[] memory r_3 = new uint144[](4);\n {\n uint144 r_3_0 = 10839282410974085545049655487999014380610003;\n r_3[0] = r_3_0;\n }\n {\n uint144 r_3_1 = 2224009049836471620008649945337810268201861;\n r_3[1] = r_3_1;\n }\n {\n uint144 r_3_2 = 15344869964919693839632180566457816676834074;\n r_3[2] = r_3_2;\n }\n {\n uint144 r_3_3 = 16236888109866797014123203250676465792717884;\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000920000000000000000000000000e92cf93697b56093b04c57d7808352529ab86fb200000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000001d226feea5b580bfd3af103be0ca482bf7f816d5000000000000000000000000c60b0be0605e3eb11234d7566831e16b38973fc7000000000000000000000000679449aa378f0f9af44707f3989ce30fcb465296000000000000000000000000c5ae051024a8dcf9465817e42fda8481494a612400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014f98d7e7a91dae0f30938ec3ec0cabe08c6a9827ce4b0bdf07c9d4a7f600000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cb08df4f3164fe46ab6e89713619ebbf56d59f9f00000000000000000000000091e846e7d98640bb2cf11b8b3b183b4257dc4a030000000000000000000000004b716f40fc3d264609680b2793cde74ea9e4294a000000000000000000000000766d4141d6adefb751a8758562f0460c41f5805500000000000000000000000000000000000000000000000000000000000000040000000000000000000000006daaeb4bfcb1350f55ab5fb218540d5e32243779000000000000000000000000f0f3f92c0601a0ec84068a77c41bb6a86dafa78400000000000000000000000059169cdb688801ca8d3a536666be29821099e9de0000000000000000000000000915f10aecd1fb0e9df25eee63a81afe08d3383f00000000000000000000000040dcc5d22a8c716cf77447adc3f75ac49a6046b1000000000000000000000000f60ffee18ef19a26f556bbf5f0247524412c936000000000000000000000000012be0f7525c2352fc43fc21cc4e65d221cfe272f000000000000000000000000677b24f3dd42ee063765239d6227379329d397280000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001713bc26af92fc70562f3ba22356657e3d0d390f8d9517c331911be270d0000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000006861ab7fa2fe7b180661e15242665f7d4c8423470000000000000000000000000485b7f781208ce4c0ecf01d10b89c72ff0aba65000000000000000000000000b3b809c752aa66c975a7b2d58af1fef9e1e5e272000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000001084cce6c2f283c7c8b9ae236f8f150ac140b2e600000000000000000000000050bb770e203241dd8e212e179b7c574ae93d749700000000000000000000000034272f2305f6772887b9fa3822cb0386ac0825ff00000000000000000000000020b8933bb4d79df827f7107ca577a2c782da0d0300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014ba84d657c9197536bb62c85aafb6563182800535736c727e88fda1cc200000000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037782c536ba4f2555ae6d9dce9833d0c6661d5e000000000000000000000000057f7de449c3b8d39c3804f5ebeeae6517d6229f0000000000000000000000000642a9e62fcc3d7789c664476ec1a1e5ae1bc0daa000000000000000000000000cbdc50e5e36c4dfa51d3d90b91fd4c819d3ee1d80000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001bf28a31947576c73346c7a356618ea6497753097fbde46bcdcd9d67cfe00000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b754e459e6cc56e117232c7b6c8da65716bbbc250000000000000000000000005549d3d4f0ca9232c3f7e73c415b6e631e0eb6f50000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d468ecf64c16fd41379019ffe6d90df74515f8d8000000000000000000000000ad5c935582e51a68ec2f4f968315299ef76b738200000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a806f6ff09f9a806f6ff09f9a80c3a9c3a96f206f4d4d6ff09f9a80f09f9a80c3a94df09f9a80c3a9c3a9f09f9a806f20f09f9a806fc3a96fc3a9f09f9a806fc3a96ff09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000007c6dc9c118b355ba4f619b4be78dcd61a1d300000000000000000000000000001987c672911b8ab0488e4c72cc60eb4c23850000000000000000000000000000b0268517d1143edf05f2656f1fbfcb941b1a0000000000000000000000000000ba63ecf5721ce0c72b478d3ab93e2a4c143c" + }, + { + "name": "random-((uint,address[2],(bytes25,bytes21,string[1],bool,bool)),address,(uint80,address[2],string[3]))", + "type": "((uint,address[2],(bytes25,bytes21,string[1],bool,bool)),address,(uint80,address[2],string[3]))", + "value": [ + [ + "65961121603576596653245102800611347372046054249542752328040567684316251270092", + [ + "0x596AD12c7dFC4730894Ee63B29fDdA09FAED0125", + "0x98ea1d52658307E88A8347a129F62f6F7cF29C44" + ], + [ + "0x1086ea08b24d769bcb900ae1e754464346a21706f950ceab60", + "0x5201f1f1b8774ef24f9ea8e3a664331e82e49aa15c", + ["Moo é🚀o éMo 🚀oMMoooMéMMéooéMMMéoé o M éooo éoéooé o🚀éo é"], + true, + false + ] + ], + "0x46063A895339a250526509C56f4aeD66d5626A5e", + [ + "49986080904397228086997", + [ + "0x8f695F971A6E065DECAce8320dcb581B6b9014f3", + "0x208BC04aE4dB90E1A06345950F821a8f02dc765A" + ], + [ + "Moo é🚀 ooM oo🚀 ooé🚀éM🚀ooMoooéM🚀", + "Moo é🚀oé🚀Méooo M🚀 é🚀éMo🚀o MoééM🚀🚀oMo🚀Mo🚀MM 🚀oé oé o", + "Moo é🚀oooo🚀MM 🚀🚀Mo🚀oo o🚀🚀MéM🚀🚀o🚀 🚀o M🚀 🚀Mo ooM" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "65961121603576596653245102800611347372046054249542752328040567684316251270092" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x596AD12c7dFC4730894Ee63B29fDdA09FAED0125" + }, + { + "type": "address", + "value": "0x98ea1d52658307E88A8347a129F62f6F7cF29C44" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x1086ea08b24d769bcb900ae1e754464346a21706f950ceab60" + }, + { + "type": "hexstring", + "value": "0x5201f1f1b8774ef24f9ea8e3a664331e82e49aa15c" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o éMo 🚀oMMoooMéMMéooéMMMéoé o M éooo éoéooé o🚀éo é" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "address", + "value": "0x46063A895339a250526509C56f4aeD66d5626A5e" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "49986080904397228086997" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8f695F971A6E065DECAce8320dcb581B6b9014f3" + }, + { + "type": "address", + "value": "0x208BC04aE4dB90E1A06345950F821a8f02dc765A" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 ooM oo🚀 ooé🚀éM🚀ooMoooéM🚀" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀Méooo M🚀 é🚀éMo🚀o MoééM🚀🚀oMo🚀Mo🚀MM 🚀oé oé o" + }, + { + "type": "string", + "value": "Moo é🚀oooo🚀MM 🚀🚀Mo🚀oo o🚀🚀MéM🚀🚀o🚀 🚀o M🚀 🚀Mo ooM" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506106e4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061043f565b60405180910390f35b610056610248565b61005e610248565b610066610274565b7f91d4abfb950fd12ae58e64fbf71e850e71b44e74947f7ddd8a764e488357abcc815261009161029b565b73596ad12c7dfc4730894ee63b29fdda09faed012581527398ea1d52658307e88a8347a129f62f6f7cf29c446020808301919091528201526100d16102b9565b7f1086ea08b24d769bcb900ae1e754464346a21706f950ceab600000000000000081527414807c7c6e1dd3bc93e7aa38e9990cc7a0b926a857605a1b602082015261011a6102ec565b60006040518060800160405280604f815260200161057d604f9139825250604082810191909152600160608301526000608083015282015281527346063a895339a250526509c56f4aed66d5626a5e6020820152610176610313565b690a95c03960f1355416d5815261018b61029b565b738f695f971a6e065decace8320dcb581b6b9014f3815273208bc04ae4db90e1a06345950f821a8f02dc765a6020808301919091528201526101cb610342565b6000604051806060016040528060328152602001610623603291398252506040805160808101909152605a80825260009190610655602083013990508082600160200201819052505060006040518060800160405280605781526020016105cc605791396040808401919091528381019290925250820152919050565b604051806060016040528061025b610274565b81526000602082015260400161026f610313565b905290565b60405180606001604052806000815260200161028e61029b565b815260200161026f6102b9565b60405180604001604052806002906020820280368337509192915050565b6040805160a081018252600080825260208201529081016102d86102ec565b815260006020820181905260409091015290565b60405180602001604052806001905b60608152602001906001900390816102fb5790505090565b6040518060600160405280600069ffffffffffffffffffff16815260200161033961029b565b815260200161026f5b6040805160608082019092529081526002602082016102fb565b8060005b60028110156103885781516001600160a01b0316845260209384019390910190600101610360565b50505050565b60006080830169ffffffffffffffffffff83511684526020808401516103b68287018261035c565b5060408401516080606087015260e08601926000805b600381101561043257888603607f1901835283518051808852835b818110156104025782810188015189820189015287016103e7565b81811115610412578488838b0101525b50601f01601f1916969096018501955092840192918401916001016103cc565b5093979650505050505050565b600060208083528351606082850152805160808501528181015161046660a086018261035c565b50604090810151608060e0860152805166ffffffffffffff1916610100860152828101516affffffffffffffffffffff19166101208601529081015160a06101408601526101c08501906101a086016000805b60018110156105205788850361019f1901835283518051808752835b818110156104f0578281018a01518882018b015289016104d5565b8181111561050057848a838a0101525b50601f01601f1916959095018701945092860192918601916001016104b9565b505050506060820151151561016086015260809091015180151561018086015290918501516001600160a01b0381166040860152916040860151858203601f190160608701529250610572818461038e565b969550505050505056fe4d6f6f20c3a9f09f9a806f20c3a94d6f20f09f9a806f4d4d6f6f6f4dc3a94d4dc3a96f6fc3a94d4d4dc3a96fc3a9206f204d2020c3a96f6f6f20c3a96fc3a96f6fc3a9206ff09f9a80c3a96f20c3a94d6f6f20c3a9f09f9a806f6f6f6ff09f9a804d4d20f09f9a80f09f9a804d6ff09f9a806f6f206ff09f9a80f09f9a804dc3a94df09f9a80f09f9a806ff09f9a8020f09f9a806f204df09f9a8020f09f9a804d6f206f6f4d4d6f6f20c3a9f09f9a80206f6f4d206f6ff09f9a80206f6fc3a9f09f9a80c3a94df09f9a806f6f4d6f6f6fc3a94df09f9a804d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a96f6f6f204df09f9a8020c3a9f09f9a80c3a94d6ff09f9a806f204d6fc3a9c3a94df09f9a80f09f9a806f4d6ff09f9a804d6ff09f9a804d4d20f09f9a806fc3a9206fc3a9206fa264697066735822122086b8c5c04274a11b0252f3bbe8e124cb47a1b444c5439053dbd0c83a2ebc409864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_17374cd1 {\n bytes25 s_0;\n bytes21 s_1;\n string[1] s_2;\n bool s_3;\n bool s_4;\n }\n\n struct S_889c259e {\n uint256 s_0;\n address[2] s_1;\n S_17374cd1 s_2;\n }\n\n struct S_86f0887e {\n uint80 s_0;\n address[2] s_1;\n string[3] s_2;\n }\n\n struct S_a87950c6 {\n S_889c259e s_0;\n address s_1;\n S_86f0887e s_2;\n }\n\n function test () public pure returns (S_a87950c6 memory) {\n S_a87950c6 memory r;\n {\n S_889c259e memory r_0;\n {\n uint r_0_0 = 65961121603576596653245102800611347372046054249542752328040567684316251270092;\n r_0.s_0 = r_0_0;\n }\n {\n address[2] memory r_0_1;\n {\n address r_0_1_0 = 0x596AD12c7dFC4730894Ee63B29fDdA09FAED0125;\n r_0_1[0] = r_0_1_0;\n }\n {\n address r_0_1_1 = 0x98ea1d52658307E88A8347a129F62f6F7cF29C44;\n r_0_1[1] = r_0_1_1;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_17374cd1 memory r_0_2;\n {\n bytes25 r_0_2_0 = bytes25(0x1086ea08b24d769bcb900ae1e754464346a21706f950ceab60);\n r_0_2.s_0 = r_0_2_0;\n }\n {\n bytes21 r_0_2_1 = bytes21(0x5201f1f1b8774ef24f9ea8e3a664331e82e49aa15c);\n r_0_2.s_1 = r_0_2_1;\n }\n {\n string[1] memory r_0_2_2;\n {\n string memory r_0_2_2_0 = unicode\"Moo é🚀o éMo 🚀oMMoooMéMMéooéMMMéoé o M éooo éoéooé o🚀éo é\";\n r_0_2_2[0] = r_0_2_2_0;\n }\n r_0_2.s_2 = r_0_2_2;\n }\n {\n bool r_0_2_3 = true;\n r_0_2.s_3 = r_0_2_3;\n }\n {\n bool r_0_2_4 = false;\n r_0_2.s_4 = r_0_2_4;\n }\n r_0.s_2 = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x46063A895339a250526509C56f4aeD66d5626A5e;\n r.s_1 = r_1;\n }\n {\n S_86f0887e memory r_2;\n {\n uint80 r_2_0 = 49986080904397228086997;\n r_2.s_0 = r_2_0;\n }\n {\n address[2] memory r_2_1;\n {\n address r_2_1_0 = 0x8f695F971A6E065DECAce8320dcb581B6b9014f3;\n r_2_1[0] = r_2_1_0;\n }\n {\n address r_2_1_1 = 0x208BC04aE4dB90E1A06345950F821a8f02dc765A;\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n string[3] memory r_2_2;\n {\n string memory r_2_2_0 = unicode\"Moo é🚀 ooM oo🚀 ooé🚀éM🚀ooMoooéM🚀\";\n r_2_2[0] = r_2_2_0;\n }\n {\n string memory r_2_2_1 = unicode\"Moo é🚀oé🚀Méooo M🚀 é🚀éMo🚀o MoééM🚀🚀oMo🚀Mo🚀MM 🚀oé oé o\";\n r_2_2[1] = r_2_2_1;\n }\n {\n string memory r_2_2_2 = unicode\"Moo é🚀oooo🚀MM 🚀🚀Mo🚀oo o🚀🚀MéM🚀🚀o🚀 🚀o M🚀 🚀Mo ooM\";\n r_2_2[2] = r_2_2_2;\n }\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000046063a895339a250526509c56f4aed66d5626a5e000000000000000000000000000000000000000000000000000000000000022091d4abfb950fd12ae58e64fbf71e850e71b44e74947f7ddd8a764e488357abcc000000000000000000000000596ad12c7dfc4730894ee63b29fdda09faed012500000000000000000000000098ea1d52658307e88a8347a129f62f6f7cf29c4400000000000000000000000000000000000000000000000000000000000000801086ea08b24d769bcb900ae1e754464346a21706f950ceab60000000000000005201f1f1b8774ef24f9ea8e3a664331e82e49aa15c000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a806f20c3a94d6f20f09f9a806f4d4d6f6f6f4dc3a94d4dc3a96f6fc3a94d4d4dc3a96fc3a9206f204d2020c3a96f6f6f20c3a96fc3a96f6fc3a9206ff09f9a80c3a96f20c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000a95c03960f1355416d50000000000000000000000008f695f971a6e065decace8320dcb581b6b9014f3000000000000000000000000208bc04ae4db90e1a06345950f821a8f02dc765a0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80206f6f4d206f6ff09f9a80206f6fc3a9f09f9a80c3a94df09f9a806f6f4d6f6f6fc3a94df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a96f6f6f204df09f9a8020c3a9f09f9a80c3a94d6ff09f9a806f204d6fc3a9c3a94df09f9a80f09f9a806f4d6ff09f9a804d6ff09f9a804d4d20f09f9a806fc3a9206fc3a9206f00000000000000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f6f6f6ff09f9a804d4d20f09f9a80f09f9a804d6ff09f9a806f6f206ff09f9a80f09f9a804dc3a94df09f9a80f09f9a806ff09f9a8020f09f9a806f204df09f9a8020f09f9a804d6f206f6f4d000000000000000000" + }, + { + "name": "random-(bytes11,bytes7,(string,(bytes28,((bool),int48,int64,bool,int152)),(address,(bool,bool,int224),address)),address)", + "type": "(bytes11,bytes7,(string,(bytes28,((bool),int48,int64,bool,int152)),(address,(bool,bool,int224),address)),address)", + "value": [ + "0xd0377dc57f5b06801694ee", + "0x1f7a5dc64ea658", + [ + "Moo é🚀 é ", + [ + "0x661373ac5282a7568ceb8dc50c54d8333dff10823de220500618b27c", + [ + [false], + "-78667960584245", + "7105604242905646209", + false, + "2326322274880926260778912606012360289042334396" + ] + ], + [ + "0xd0353D838c63656A923DF745F6e46FbD5C9E5a48", + [ + false, + false, + "5774185279353353389230134981167564492501107814526176442732572045760" + ], + "0xA5C28BFdDA86f22abDC643Be7Dde0C264C0220B6" + ] + ], + "0x4CaEa4ad10908842fE0dE9884E9Aa9E05d5CD921" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd0377dc57f5b06801694ee" + }, + { + "type": "hexstring", + "value": "0x1f7a5dc64ea658" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é " + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x661373ac5282a7568ceb8dc50c54d8333dff10823de220500618b27c" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "-78667960584245" + }, + { + "type": "number", + "value": "7105604242905646209" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "2326322274880926260778912606012360289042334396" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd0353D838c63656A923DF745F6e46FbD5C9E5a48" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "5774185279353353389230134981167564492501107814526176442732572045760" + } + ] + }, + { + "type": "address", + "value": "0xA5C28BFdDA86f22abDC643Be7Dde0C264C0220B6" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x4CaEa4ad10908842fE0dE9884E9Aa9E05d5CD921" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061043e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906102c4565b60405180910390f35b6100566101f3565b61005e6101f3565b6a681bbee2bfad83400b4a7760a91b81526603ef4bb8c9d4cb60cb1b602082015261008761021f565b60408051808201909152600e81526d026b7b79061d4f84fcd401061d4960951b602082015281526100b661024b565b7f661373ac5282a7568ceb8dc50c54d8333dff10823de220500618b27c0000000081526040805160c081018252600060a08201818152825260208083018281528385018381526060850184815260808601858152875180860190985285885296865265478c4fd888341990925267629c2d696ce64481905291909152726850debb14d22f1794efefe096aba7d06882bc90925281830152820152610158610294565b73d0353d838c63656a923df745f6e46fbd5c9e5a488152604080516060808201835260008083526020808401919091527b36d444523119314d397b62ae8cff8a240105239720608cb6215ff1c08385015284019190915273a5c28bfdda86f22abdc643be7dde0c264c0220b68284015283820192909252830191909152734caea4ad10908842fe0de9884e9aa9e05d5cd92190820152919050565b604080516080810182526000808252602082015290810161021261021f565b8152600060209091015290565b60405180606001604052806060815260200161023961024b565b8152602001610246610294565b905290565b6040805180820190915260008152602081016102466040805160c081018252600060a0820181815282526020820181905291810182905260608101829052608081019190915290565b60408051606080820183526000808352835191820184528082526020828101829052938201529091820190610212565b600060208083526affffffffffffffffffffff60a81b8451168184015266ffffffffffffff60c81b8185015116604084015260408401516080606085015280516101808060a087015281518061022088015260005b818110156103365783810186015188820161024001528501610319565b81811115610349576000610240838a0101525b5093830151805163ffffffff191660c0880152602090810151805151151560e08901528082015160050b61010089015260408082015160070b6101208a015260608083015115156101408b015260809283015160120b6101608b01529581015180516001600160a01b03908116958b019586528185015180511515878701529485015115158684015293820151601b0b858801520151821692810192909252969092015190951690840152601f01601f1916909101610240019291505056fea26469706673582212202cd30f012001121c6626414023ed238b4e9a659153e1d763f606a0cc8a44a0a664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_f512f8e5 {\n S_c1053bda s_0;\n int48 s_1;\n int64 s_2;\n bool s_3;\n int152 s_4;\n }\n\n struct S_de5a5adb {\n bytes28 s_0;\n S_f512f8e5 s_1;\n }\n\n struct S_49ba74a5 {\n bool s_0;\n bool s_1;\n int224 s_2;\n }\n\n struct S_63fc7e8b {\n address s_0;\n S_49ba74a5 s_1;\n address s_2;\n }\n\n struct S_28f36c94 {\n string s_0;\n S_de5a5adb s_1;\n S_63fc7e8b s_2;\n }\n\n struct S_163320d8 {\n bytes11 s_0;\n bytes7 s_1;\n S_28f36c94 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_163320d8 memory) {\n S_163320d8 memory r;\n {\n bytes11 r_0 = bytes11(0xd0377dc57f5b06801694ee);\n r.s_0 = r_0;\n }\n {\n bytes7 r_1 = bytes7(0x1f7a5dc64ea658);\n r.s_1 = r_1;\n }\n {\n S_28f36c94 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀 é \";\n r_2.s_0 = r_2_0;\n }\n {\n S_de5a5adb memory r_2_1;\n {\n bytes28 r_2_1_0 = bytes28(0x661373ac5282a7568ceb8dc50c54d8333dff10823de220500618b27c);\n r_2_1.s_0 = r_2_1_0;\n }\n {\n S_f512f8e5 memory r_2_1_1;\n {\n S_c1053bda memory r_2_1_1_0;\n {\n bool r_2_1_1_0_0 = false;\n r_2_1_1_0.s_0 = r_2_1_1_0_0;\n }\n r_2_1_1.s_0 = r_2_1_1_0;\n }\n {\n int48 r_2_1_1_1 = -78667960584245;\n r_2_1_1.s_1 = r_2_1_1_1;\n }\n {\n int64 r_2_1_1_2 = 7105604242905646209;\n r_2_1_1.s_2 = r_2_1_1_2;\n }\n {\n bool r_2_1_1_3 = false;\n r_2_1_1.s_3 = r_2_1_1_3;\n }\n {\n int152 r_2_1_1_4 = 2326322274880926260778912606012360289042334396;\n r_2_1_1.s_4 = r_2_1_1_4;\n }\n r_2_1.s_1 = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n S_63fc7e8b memory r_2_2;\n {\n address r_2_2_0 = 0xd0353D838c63656A923DF745F6e46FbD5C9E5a48;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n S_49ba74a5 memory r_2_2_1;\n {\n bool r_2_2_1_0 = false;\n r_2_2_1.s_0 = r_2_2_1_0;\n }\n {\n bool r_2_2_1_1 = false;\n r_2_2_1.s_1 = r_2_2_1_1;\n }\n {\n int224 r_2_2_1_2 = 5774185279353353389230134981167564492501107814526176442732572045760;\n r_2_2_1.s_2 = r_2_2_1_2;\n }\n r_2_2.s_1 = r_2_2_1;\n }\n {\n address r_2_2_2 = 0xA5C28BFdDA86f22abDC643Be7Dde0C264C0220B6;\n r_2_2.s_2 = r_2_2_2;\n }\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x4CaEa4ad10908842fE0dE9884E9Aa9E05d5CD921;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020d0377dc57f5b06801694ee0000000000000000000000000000000000000000001f7a5dc64ea6580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000004caea4ad10908842fe0de9884e9aa9e05d5cd9210000000000000000000000000000000000000000000000000000000000000180661373ac5282a7568ceb8dc50c54d8333dff10823de220500618b27c000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffb873b02777cb000000000000000000000000000000000000000000000000629c2d696ce644810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006850debb14d22f1794efefe096aba7d06882bc000000000000000000000000d0353d838c63656a923df745f6e46fbd5c9e5a48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036d444523119314d397b62ae8cff8a240105239720608cb6215ff1c0000000000000000000000000a5c28bfdda86f22abdc643be7dde0c264c0220b6000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a8020c3a920000000000000000000000000000000000000" + }, + { + "name": "random-(bytes9,(bool,address[2]),int168,bytes22,(string,string[1],(int256[2],bytes13,bool,bool),address))", + "type": "(bytes9,(bool,address[2]),int168,bytes22,(string,string[1],(int256[2],bytes13,bool,bool),address))", + "value": [ + "0x164ee9d8d62b22249f", + [ + false, + [ + "0xB00f60F97B45939eBb694B90a9DBa8038CBa5f09", + "0x247494c5b7cd1F4956ff51B0cB9A14a3926Bfe42" + ] + ], + "-100335459599962282905660676628061743755105326755845", + "0x813e5b9714961774e7b31b48664f351611eac3a1ca36", + [ + "Moo é🚀oo ooéoé", + ["Moo é🚀oooo éMéooo oo éMéo"], + [ + [ + "7424034867776187483791399233442789598306053058407075508090397467569830482648", + "-49141267867329983767075258606458461461039440801269284833434248843440734065020" + ], + "0xee5115114cd6694e659d0d7bfa", + false, + false + ], + "0xAD3149aF3789692AF3E040225e510f1656aaA76D" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x164ee9d8d62b22249f" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB00f60F97B45939eBb694B90a9DBa8038CBa5f09" + }, + { + "type": "address", + "value": "0x247494c5b7cd1F4956ff51B0cB9A14a3926Bfe42" + } + ] + } + ] + }, + { + "type": "number", + "value": "-100335459599962282905660676628061743755105326755845" + }, + { + "type": "hexstring", + "value": "0x813e5b9714961774e7b31b48664f351611eac3a1ca36" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo ooéoé" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooo éMéooo oo éMéo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "7424034867776187483791399233442789598306053058407075508090397467569830482648" + }, + { + "type": "number", + "value": "-49141267867329983767075258606458461461039440801269284833434248843440734065020" + } + ] + }, + { + "type": "hexstring", + "value": "0xee5115114cd6694e659d0d7bfa" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xAD3149aF3789692AF3E040225e510f1656aaA76D" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610533806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610436565b60405180910390f35b61005661020c565b61005e61020c565b68164ee9d8d62b22249f60b81b8152610075610247565b6000815261008161025f565b73b00f60f97b45939ebb694b90a9dba8038cba5f09815273247494c5b7cd1f4956ff51b0cb9a14a3926bfe42602080830191909152828101919091528201527444a6fd9d5348a6ebbd42782dc75f3f91cc6c36700419604082015275409f2dcb8a4b0bba73d98da433279a8b08f561d0e51b60511b606082015261010361027d565b6040805180820190915260148152734d6f6f20c3a9f09f9a806f6f206f6fc3a96fc3a960601b602082015281526101386102b1565b60006040518060600160405280602181526020016104dd6021913982525060208201526101636102d8565b61016b61025f565b7f1069dad5f1da07942ec0b6b187d512e283e206fb7680dfdc1b41f52c3f23d2d881527f935b072dbd3d2ea6c79afe8e79650e6adc5b510ec5a5fc0ec4e2f219b4342e846020808301919091529082526c77288a88a66b34a732ce86bdfd60991b908201526000604080830182905260608084019290925283019190915273ad3149af3789692af3e040225e510f1656aaa76d908201526080820152919050565b6040805160a081019091526000815260208101610227610247565b8152600060208201819052604082015260600161024261027d565b905290565b60405180604001604052806000151581526020016102425b60405180604001604052806002906020820280368337509192915050565b6040518060800160405280606081526020016102976102b1565b81526020016102a46102d8565b8152600060209091015290565b60405180602001604052806001905b60608152602001906001900390816102c05790505090565b60405180608001604052806102eb61025f565b81526000602082018190526040820181905260609091015290565b6000815180845260005b8181101561032c57602081850181015186830182015201610310565b8181111561033e576000602083870101525b50601f01601f19169290920160200192915050565b6000610100825181855261036982860182610306565b6020858101518783038883015291935091508282810160005b60018110156103ad57858203835261039b828551610306565b93850193928501929150600101610382565b50604087810151805190965093506000925088015b60028310156103e15783518152928401926001929092019184016103c2565b509284015172ffffffffffffffffffffffffffffffffffffff1916608088015250506040820151151560a0860152606091820151151560c08601529201516001600160a01b031660e090930192909252919050565b602080825282516001600160b81b03191682820152828101518051151560408401528101516000919060608401835b600281101561048b5782516001600160a01b031682529183019190830190600101610465565b5050505060408301516104a360a084018260140b9052565b50606083015169ffffffffffffffffffff191660c0830152608083015160e0808401526104d4610100840182610353565b94935050505056fe4d6f6f20c3a9f09f9a806f6f6f6f20c3a94dc3a96f6f6f206f6f20c3a94dc3a96fa2646970667358221220a6ccc3ee515919ba7f694ed8004599e53c8c6461b603a3ac1c04853910246ceb64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_11fc7862 {\n bool s_0;\n address[2] s_1;\n }\n\n struct S_c02ac85a {\n int256[2] s_0;\n bytes13 s_1;\n bool s_2;\n bool s_3;\n }\n\n struct S_9f08f62d {\n string s_0;\n string[1] s_1;\n S_c02ac85a s_2;\n address s_3;\n }\n\n struct S_32dd6869 {\n bytes9 s_0;\n S_11fc7862 s_1;\n int168 s_2;\n bytes22 s_3;\n S_9f08f62d s_4;\n }\n\n function test () public pure returns (S_32dd6869 memory) {\n S_32dd6869 memory r;\n {\n bytes9 r_0 = bytes9(0x164ee9d8d62b22249f);\n r.s_0 = r_0;\n }\n {\n S_11fc7862 memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n address[2] memory r_1_1;\n {\n address r_1_1_0 = 0xB00f60F97B45939eBb694B90a9DBa8038CBa5f09;\n r_1_1[0] = r_1_1_0;\n }\n {\n address r_1_1_1 = 0x247494c5b7cd1F4956ff51B0cB9A14a3926Bfe42;\n r_1_1[1] = r_1_1_1;\n }\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n int168 r_2 = -100335459599962282905660676628061743755105326755845;\n r.s_2 = r_2;\n }\n {\n bytes22 r_3 = bytes22(0x813e5b9714961774e7b31b48664f351611eac3a1ca36);\n r.s_3 = r_3;\n }\n {\n S_9f08f62d memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀oo ooéoé\";\n r_4.s_0 = r_4_0;\n }\n {\n string[1] memory r_4_1;\n {\n string memory r_4_1_0 = unicode\"Moo é🚀oooo éMéooo oo éMéo\";\n r_4_1[0] = r_4_1_0;\n }\n r_4.s_1 = r_4_1;\n }\n {\n S_c02ac85a memory r_4_2;\n {\n int256[2] memory r_4_2_0;\n {\n int256 r_4_2_0_0 = 7424034867776187483791399233442789598306053058407075508090397467569830482648;\n r_4_2_0[0] = r_4_2_0_0;\n }\n {\n int256 r_4_2_0_1 = -49141267867329983767075258606458461461039440801269284833434248843440734065020;\n r_4_2_0[1] = r_4_2_0_1;\n }\n r_4_2.s_0 = r_4_2_0;\n }\n {\n bytes13 r_4_2_1 = bytes13(0xee5115114cd6694e659d0d7bfa);\n r_4_2.s_1 = r_4_2_1;\n }\n {\n bool r_4_2_2 = false;\n r_4_2.s_2 = r_4_2_2;\n }\n {\n bool r_4_2_3 = false;\n r_4_2.s_3 = r_4_2_3;\n }\n r_4.s_2 = r_4_2;\n }\n {\n address r_4_3 = 0xAD3149aF3789692AF3E040225e510f1656aaA76D;\n r_4.s_3 = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020164ee9d8d62b22249f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b00f60f97b45939ebb694b90a9dba8038cba5f09000000000000000000000000247494c5b7cd1f4956ff51b0cb9a14a3926bfe42ffffffffffffffffffffffbb590262acb7591442bd87d238a0c06e3393c98ffb813e5b9714961774e7b31b48664f351611eac3a1ca360000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001401069dad5f1da07942ec0b6b187d512e283e206fb7680dfdc1b41f52c3f23d2d8935b072dbd3d2ea6c79afe8e79650e6adc5b510ec5a5fc0ec4e2f219b4342e84ee5115114cd6694e659d0d7bfa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad3149af3789692af3e040225e510f1656aaa76d00000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806f6f206f6fc3a96fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a806f6f6f6f20c3a94dc3a96f6f6f206f6f20c3a94dc3a96f00000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,((bytes2,(bool[3],bytes8,int240,string,address),(int8,string),bytes17))),(uint96,uint192),string[3][3])", + "type": "((address,((bytes2,(bool[3],bytes8,int240,string,address),(int8,string),bytes17))),(uint96,uint192),string[3][3])", + "value": [ + [ + "0x67b07B0fd93cFC8f4fA729E2c161b826a9062c82", + [ + [ + "0xcef4", + [ + [true, true, false], + "0x40839d67fe488e04", + "703547361575752883923072166597533876385223368313870554168942714137928552", + "Moo é🚀MoMooéé", + "0x64c78F6E488c014Cf7BEAd105479f0AA23f67865" + ], + ["-98", "Moo é🚀 M"], + "0xc9ca5c348cc425e23d01b9a73c680b3b95" + ] + ] + ], + [ + "55554333146762261374501182776", + "4905584324972330139225031045774172477254018074840152333192" + ], + [ + [ + "Moo é🚀M éMMé ooéMMo🚀o", + "Moo é🚀oééMMo ", + "Moo é🚀Méo ooo🚀é éoMéo MMoéé🚀 éo🚀o" + ], + [ + "Moo é🚀MM🚀oééo M🚀 o éo🚀 M🚀éooooé M🚀🚀 🚀", + "Moo é🚀o 🚀éMo🚀é🚀é MMoo🚀 ooo ooM🚀é M Méo🚀MMéo", + "Moo é🚀🚀M Mooo ooéo🚀ooooo🚀 M é🚀 🚀 o" + ], + [ + "Moo é🚀ooéo éo M🚀ooMo🚀oMo o éé 🚀M 🚀é", + "Moo é🚀oM ooo MMooo", + "Moo é🚀oé🚀é🚀 o oo 🚀🚀é🚀 🚀o 🚀 éo🚀oMM" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x67b07B0fd93cFC8f4fA729E2c161b826a9062c82" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xcef4" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x40839d67fe488e04" + }, + { + "type": "number", + "value": "703547361575752883923072166597533876385223368313870554168942714137928552" + }, + { + "type": "string", + "value": "Moo é🚀MoMooéé" + }, + { + "type": "address", + "value": "0x64c78F6E488c014Cf7BEAd105479f0AA23f67865" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-98" + }, + { + "type": "string", + "value": "Moo é🚀 M" + } + ] + }, + { + "type": "hexstring", + "value": "0xc9ca5c348cc425e23d01b9a73c680b3b95" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "55554333146762261374501182776" + }, + { + "type": "number", + "value": "4905584324972330139225031045774172477254018074840152333192" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M éMMé ooéMMo🚀o" + }, + { + "type": "string", + "value": "Moo é🚀oééMMo " + }, + { + "type": "string", + "value": "Moo é🚀Méo ooo🚀é éoMéo MMoéé🚀 éo🚀o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM🚀oééo M🚀 o éo🚀 M🚀éooooé M🚀🚀 🚀" + }, + { + "type": "string", + "value": "Moo é🚀o 🚀éMo🚀é🚀é MMoo🚀 ooo ooM🚀é M Méo🚀MMéo" + }, + { + "type": "string", + "value": "Moo é🚀🚀M Mooo ooéo🚀ooooo🚀 M é🚀 🚀 o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooéo éo M🚀ooMo🚀oMo o éé 🚀M 🚀é" + }, + { + "type": "string", + "value": "Moo é🚀oM ooo MMooo" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀é🚀 o oo 🚀🚀é🚀 🚀o 🚀 éo🚀oMM" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506108fe806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105da565b60405180910390f35b610056610382565b61005e610382565b6100666103c6565b7367b07b0fd93cfc8f4fa729e2c161b826a9062c8281526100856103e5565b61008d6103f4565b6133bd60f21b815261009d610440565b6100a5610474565b60018082526020808301919091526000604080840191909152918352671020e759ff92238160c21b838201527d65f005a25a7b0eedbd428364b6c1260f2107237e9cb5cd140a2acabce368838301528151808301835260138152724d6f6f20c3a9f09f9a804d6f4d6f6fc3a9c3a960681b818301526060808501919091527364c78f6e488c014cf7bead105479f0aa23f6786560808501528482019390935281518083018352808201848152606119825283518085018552600c81526b4d6f6f20c3a9f09f9a80204d60a01b8185015290528483015270c9ca5c348cc425e23d01b9a73c680b3b9560781b928401929092529183528381019290925291835281518083019092526bb38177a26f665cdac44cdd38825277c810b0aa89f3dbf0c3ab05c8b09ce7ec32e3b3a96bfedb88828201528201526101e3610492565b6101eb6104bf565b604080518082018252601f81527f4d6f6f20c3a9f09f9a804d20c3a94d4dc3a9206f6fc3a94d4d6ff09f9a806f00602080830191909152908352815180830183526013815272026b7b79061d4f84fcd4037e1d4e1d4a6a6b79606d1b81830152838201528151606081019092526035808352600092916107549083013960408301525081526102786104bf565b60006040518060800160405280604581526020016107c1604591398252506040805160808101909152604a8082526000919061087f602083013990508082600160200201819052505060006040518060600160405280603781526020016108066037913960408301525060208201526102ef6104bf565b60006040518060600160405280603881526020016107896038913982525060408051808201909152601781527f4d6f6f20c3a9f09f9a806f4d20206f6f6f204d4d6f6f6f000000000000000000602082015280826001602002018190525050600060405180608001604052806042815260200161083d604291396040808401919091528381019290925250820152919050565b60405180606001604052806103956103c6565b81526020016103b4604080518082019091526000808252602082015290565b81526020016103c1610492565b905290565b604051806040016040528060006001600160a01b031681526020016103c15b60405180602001604052806103c15b6040805160808101909152600081526020810161040f610440565b815260200161043360405180604001604052806000800b8152602001606081525090565b8152600060209091015290565b6040518060a00160405280610453610474565b81526000602082018190526040820181905260608083015260809091015290565b60405180606001604052806003906020820280368337509192915050565b60405180606001604052806003905b6104a96104bf565b8152602001906001900390816104a15790505090565b60405180606001604052806003905b60608152602001906001900390816104ce5790505090565b6000815180845260005b8181101561050c576020818501810151868301820152016104f0565b8181111561051e576000602083870101525b50601f01601f19169290920160200192915050565b805160000b8252600060208201516040602085015261055560408501826104e6565b949350505050565b6000826060808201846000805b600380821061057957506105cd565b8685038a52835185878101855b848110156105b357888203835261059e8285516104e6565b60209485019493909301929150600101610586565b5060209c8d019c909750959095019450505060010161056a565b5091979650505050505050565b60208082528251608083830181905281516001600160a01b031660a085015290820151604060c08501525160e0840183905280516001600160f01b031916610100850152808301516101208501929092528151600093928461018087015b60038210156106595783511515815292850192600191909101908501610638565b5050808401516001600160c01b0319166101e08701526040810151601d0b610200870152606081015160e0610220880152915061069a6102608701836104e6565b9150608081015190506106b96102408701826001600160a01b03169052565b50604082015185820360ff19016101408701526106d68282610533565b915050606082015191506106ff6101608601836effffffffffffffffffffffffffffff19169052565b9185015180516bffffffffffffffffffffffff16604086015260208101516001600160c01b03166060860152916040860151858203601f190160808701529250610749818461055d565b969550505050505056fe4d6f6f20c3a9f09f9a804dc3a96f206f6f6ff09f9a80c3a920c3a96f4dc3a96f204d4d6fc3a9c3a9f09f9a8020c3a96ff09f9a806f4d6f6f20c3a9f09f9a806f6fc3a96f20c3a96f204df09f9a806f6f4d6ff09f9a806f4d6f206f20c3a9c3a920f09f9a804d20f09f9a80c3a94d6f6f20c3a9f09f9a804d4df09f9a806fc3a9c3a96f204df09f9a8020206f20c3a96ff09f9a8020204df09f9a80c3a96f6f6f6fc3a9204df09f9a80f09f9a8020f09f9a804d6f6f20c3a9f09f9a80f09f9a804d204d6f6f6f206f6fc3a96ff09f9a806f6f6f6f6ff09f9a80204d20c3a9f09f9a8020f09f9a80206f4d6f6f20c3a9f09f9a806fc3a9f09f9a80c3a9f09f9a8020206f206f6f20f09f9a80f09f9a80c3a9f09f9a8020f09f9a806f20f09f9a8020c3a96ff09f9a806f4d4d4d6f6f20c3a9f09f9a806f202020f09f9a80c3a94d6ff09f9a80c3a9f09f9a80c3a9204d4d6f6ff09f9a80206f6f6f206f6f4df09f9a80c3a920204d204dc3a96ff09f9a804d4dc3a96fa26469706673582212208f629d50f11952cfdd941aef5a8acc44204ad17a231388e04d29b1006db50e6e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7438029c {\n bool[3] s_0;\n bytes8 s_1;\n int240 s_2;\n string s_3;\n address s_4;\n }\n\n struct S_51138439 {\n int8 s_0;\n string s_1;\n }\n\n struct S_1089e840 {\n bytes2 s_0;\n S_7438029c s_1;\n S_51138439 s_2;\n bytes17 s_3;\n }\n\n struct S_f2d0beee {\n S_1089e840 s_0;\n }\n\n struct S_12b4eb12 {\n address s_0;\n S_f2d0beee s_1;\n }\n\n struct S_d557d50b {\n uint96 s_0;\n uint192 s_1;\n }\n\n struct S_6876aac4 {\n S_12b4eb12 s_0;\n S_d557d50b s_1;\n string[3][3] s_2;\n }\n\n function test () public pure returns (S_6876aac4 memory) {\n S_6876aac4 memory r;\n {\n S_12b4eb12 memory r_0;\n {\n address r_0_0 = 0x67b07B0fd93cFC8f4fA729E2c161b826a9062c82;\n r_0.s_0 = r_0_0;\n }\n {\n S_f2d0beee memory r_0_1;\n {\n S_1089e840 memory r_0_1_0;\n {\n bytes2 r_0_1_0_0 = bytes2(0xcef4);\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n S_7438029c memory r_0_1_0_1;\n {\n bool[3] memory r_0_1_0_1_0;\n {\n bool r_0_1_0_1_0_0 = true;\n r_0_1_0_1_0[0] = r_0_1_0_1_0_0;\n }\n {\n bool r_0_1_0_1_0_1 = true;\n r_0_1_0_1_0[1] = r_0_1_0_1_0_1;\n }\n {\n bool r_0_1_0_1_0_2 = false;\n r_0_1_0_1_0[2] = r_0_1_0_1_0_2;\n }\n r_0_1_0_1.s_0 = r_0_1_0_1_0;\n }\n {\n bytes8 r_0_1_0_1_1 = bytes8(0x40839d67fe488e04);\n r_0_1_0_1.s_1 = r_0_1_0_1_1;\n }\n {\n int240 r_0_1_0_1_2 = 703547361575752883923072166597533876385223368313870554168942714137928552;\n r_0_1_0_1.s_2 = r_0_1_0_1_2;\n }\n {\n string memory r_0_1_0_1_3 = unicode\"Moo é🚀MoMooéé\";\n r_0_1_0_1.s_3 = r_0_1_0_1_3;\n }\n {\n address r_0_1_0_1_4 = 0x64c78F6E488c014Cf7BEAd105479f0AA23f67865;\n r_0_1_0_1.s_4 = r_0_1_0_1_4;\n }\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n S_51138439 memory r_0_1_0_2;\n {\n int8 r_0_1_0_2_0 = -98;\n r_0_1_0_2.s_0 = r_0_1_0_2_0;\n }\n {\n string memory r_0_1_0_2_1 = unicode\"Moo é🚀 M\";\n r_0_1_0_2.s_1 = r_0_1_0_2_1;\n }\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n {\n bytes17 r_0_1_0_3 = bytes17(0xc9ca5c348cc425e23d01b9a73c680b3b95);\n r_0_1_0.s_3 = r_0_1_0_3;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_d557d50b memory r_1;\n {\n uint96 r_1_0 = 55554333146762261374501182776;\n r_1.s_0 = r_1_0;\n }\n {\n uint192 r_1_1 = 4905584324972330139225031045774172477254018074840152333192;\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n string[3][3] memory r_2;\n {\n string[3] memory r_2_0;\n {\n string memory r_2_0_0 = unicode\"Moo é🚀M éMMé ooéMMo🚀o\";\n r_2_0[0] = r_2_0_0;\n }\n {\n string memory r_2_0_1 = unicode\"Moo é🚀oééMMo \";\n r_2_0[1] = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀Méo ooo🚀é éoMéo MMoéé🚀 éo🚀o\";\n r_2_0[2] = r_2_0_2;\n }\n r_2[0] = r_2_0;\n }\n {\n string[3] memory r_2_1;\n {\n string memory r_2_1_0 = unicode\"Moo é🚀MM🚀oééo M🚀 o éo🚀 M🚀éooooé M🚀🚀 🚀\";\n r_2_1[0] = r_2_1_0;\n }\n {\n string memory r_2_1_1 = unicode\"Moo é🚀o 🚀éMo🚀é🚀é MMoo🚀 ooo ooM🚀é M Méo🚀MMéo\";\n r_2_1[1] = r_2_1_1;\n }\n {\n string memory r_2_1_2 = unicode\"Moo é🚀🚀M Mooo ooéo🚀ooooo🚀 M é🚀 🚀 o\";\n r_2_1[2] = r_2_1_2;\n }\n r_2[1] = r_2_1;\n }\n {\n string[3] memory r_2_2;\n {\n string memory r_2_2_0 = unicode\"Moo é🚀ooéo éo M🚀ooMo🚀oMo o éé 🚀M 🚀é\";\n r_2_2[0] = r_2_2_0;\n }\n {\n string memory r_2_2_1 = unicode\"Moo é🚀oM ooo MMooo\";\n r_2_2[1] = r_2_2_1;\n }\n {\n string memory r_2_2_2 = unicode\"Moo é🚀oé🚀é🚀 o oo 🚀🚀é🚀 🚀o 🚀 éo🚀oMM\";\n r_2_2[2] = r_2_2_2;\n }\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000b38177a26f665cdac44cdd380000000000000000c810b0aa89f3dbf0c3ab05c8b09ce7ec32e3b3a96bfedb88000000000000000000000000000000000000000000000000000000000000030000000000000000000000000067b07b0fd93cfc8f4fa729e2c161b826a9062c8200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020cef4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a0c9ca5c348cc425e23d01b9a73c680b3b9500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000040839d67fe488e04000000000000000000000000000000000000000000000000000065f005a25a7b0eedbd428364b6c1260f2107237e9cb5cd140a2acabce36800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000064c78f6e488c014cf7bead105479f0aa23f6786500000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a804d6f4d6f6fc3a9c3a900000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a80204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a804d20c3a94d4dc3a9206f6fc3a94d4d6ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806fc3a9c3a94d4d6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a804dc3a96f206f6f6ff09f9a80c3a920c3a96f4dc3a96f204d4d6fc3a9c3a9f09f9a8020c3a96ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a804d4df09f9a806fc3a9c3a96f204df09f9a8020206f20c3a96ff09f9a8020204df09f9a80c3a96f6f6f6fc3a9204df09f9a80f09f9a8020f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f202020f09f9a80c3a94d6ff09f9a80c3a9f09f9a80c3a9204d4d6f6ff09f9a80206f6f6f206f6f4df09f9a80c3a920204d204dc3a96ff09f9a804d4dc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80f09f9a804d204d6f6f6f206f6fc3a96ff09f9a806f6f6f6f6ff09f9a80204d20c3a9f09f9a8020f09f9a80206f000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a806f6fc3a96f20c3a96f204df09f9a806f6f4d6ff09f9a806f4d6f206f20c3a9c3a920f09f9a804d20f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806f4d20206f6f6f204d4d6f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a806fc3a9f09f9a80c3a9f09f9a8020206f206f6f20f09f9a80f09f9a80c3a9f09f9a8020f09f9a806f20f09f9a8020c3a96ff09f9a806f4d4d000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address,bool,(string,uint16,(bool,bool,bytes21,bytes24)[4],address,(int96,bool,bool))[],bytes21,bool)", + "type": "(address,bool,(string,uint16,(bool,bool,bytes21,bytes24)[4],address,(int96,bool,bool))[],bytes21,bool)", + "value": [ + "0x1E620aCC1035d63aF6a175a76369Fa2A0d4c7E8E", + true, + [], + "0xdecafe310dd1814089f4a320f147be0cac412793b1", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1E620aCC1035d63aF6a175a76369Fa2A0d4c7E8E" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [] + }, + { + "type": "hexstring", + "value": "0xdecafe310dd1814089f4a320f147be0cac412793b1" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506103a7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061020e565b60405180910390f35b6040805160a080820183526000808352602080840182905260608486018190528085018390526080808601849052865194850187528487018290529084018390528301829052731e620acc1035d63af6a175a76369fa2a0d4c7e8e835260018382015284518281529081019094529192909190816100e2565b6100cf610113565b8152602001906001900390816100c75790505b5060408301525074decafe310dd1814089f4a320f147be0cac412793b160581b606082015260006080820152919050565b6040805160a081018252606081526000602082015290810161013361015f565b815260006020808301829052604080516060810182528381529182018390528181019290925291015290565b60405180608001604052806004905b60408051608081018252600080825260208083018290529282018190526060820152825260001990920191018161016e5790505090565b8060005b60048110156102085781518051151585526020808201511515818701526040808301516affffffffffffffffffffff19169087015260609182015167ffffffffffffffff191691860191909152608090940193909101906001016101a9565b50505050565b6000602080835260c0830160018060a01b038551168285015281850151604081151581870152808701519150606060a08188015283835180865260e08901915060e08160051b8a0101955086850194506000805b828110156103355760df198b890301845286516102c08151818b52805180838d01528592505b808310156102a7578183018d01518c84016102e00152918c0191610288565b808311156102b957856102e0828e0101525b8c84015161ffff168c8e01528984015192506102d78a8d01846101a5565b838901516001600160a01b03166102408d01526080909301518051600b0b6102608d0152602081015115156102808d01526040015115156102a08c01525050601f01601f19169097016102e001969588019592880192600101610262565b505050508701516affffffffffffffffffffff1981166080880152935061035a915050565b608085015180151560a0860152915094935050505056fea2646970667358221220244c8dcdead4cf0c7354b318fcba1b993528eb4485f84e35a096ccd572c4e28764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0669c04c {\n bool s_0;\n bool s_1;\n bytes21 s_2;\n bytes24 s_3;\n }\n\n struct S_db7bd56f {\n int96 s_0;\n bool s_1;\n bool s_2;\n }\n\n struct S_a7e159a9 {\n string s_0;\n uint16 s_1;\n S_0669c04c[4] s_2;\n address s_3;\n S_db7bd56f s_4;\n }\n\n struct S_003e44e0 {\n address s_0;\n bool s_1;\n S_a7e159a9[] s_2;\n bytes21 s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_003e44e0 memory) {\n S_003e44e0 memory r;\n {\n address r_0 = 0x1E620aCC1035d63aF6a175a76369Fa2A0d4c7E8E;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_a7e159a9[] memory r_2 = new S_a7e159a9[](0);\n r.s_2 = r_2;\n }\n {\n bytes21 r_3 = bytes21(0xdecafe310dd1814089f4a320f147be0cac412793b1);\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000001e620acc1035d63af6a175a76369fa2a0d4c7e8e000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0decafe310dd1814089f4a320f147be0cac412793b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes14[3],(int32[1],uint168,bytes26,((bool[1]),address[])),bytes7,(bool,(bool),bool,string,address))", + "type": "(bytes14[3],(int32[1],uint168,bytes26,((bool[1]),address[])),bytes7,(bool,(bool),bool,string,address))", + "value": [ + [ + "0xc3ec97fb78f7a49f724aec1ee775", + "0x22e7c736152c6e42bbcff2e67936", + "0xa694635771a1a8aae9c27583f9dc" + ], + [ + ["-1950938984"], + "87067062404810549073219706469542110158337975125288", + "0x6f2723373602ff607c3aaabfce7e1f5066e693be22cf05500ef8", + [[[true]], ["0xAFc70386e1D3cc7a92CbDC0627C2Fb7Ab27F0b59"]] + ], + "0x37ebf3243dfad2", + [ + true, + [true], + true, + "Moo é🚀M MMoé🚀🚀MoMo🚀 🚀é", + "0xd3a5122649E70cE1283dF3bf2784a6716F07cBB8" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc3ec97fb78f7a49f724aec1ee775" + }, + { + "type": "hexstring", + "value": "0x22e7c736152c6e42bbcff2e67936" + }, + { + "type": "hexstring", + "value": "0xa694635771a1a8aae9c27583f9dc" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1950938984" + } + ] + }, + { + "type": "number", + "value": "87067062404810549073219706469542110158337975125288" + }, + { + "type": "hexstring", + "value": "0x6f2723373602ff607c3aaabfce7e1f5066e693be22cf05500ef8" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xAFc70386e1D3cc7a92CbDC0627C2Fb7Ab27F0b59" + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x37ebf3243dfad2" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀M MMoé🚀🚀MoMo🚀 🚀é" + }, + { + "type": "address", + "value": "0xd3a5122649E70cE1283dF3bf2784a6716F07cBB8" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506105ec806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104d8565b60405180910390f35b61005661024f565b61005e61024f565b6100666102b8565b6dc3ec97fb78f7a49f724aec1ee77560901b81526d1173e39b0a9637215de7f9733c9b60911b60208201526d29a518d5dc686a2aba709d60fe7760921b604082015281526100b26102d6565b6100ba610304565b637448f7671981528152743b92de1b5eddad6dd6e090f1f2d4925a98b6e6052860208201527f6f2723373602ff607c3aaabfce7e1f5066e693be22cf05500ef8000000000000604082015261010d610322565b610115610342565b61011d610304565b60018082529082529082526040805182815280820190915260009160208083019080368337019050509050600073afc70386e1d3cc7a92cbdc0627c2fb7ab27f0b599050808260008151811061017557610175610578565b6001600160a01b0390921660209283029190910182015283810192909252506060830191909152820152661bf5f9921efd6960c91b60408201526101e76040805160a0810182526000808252825160208082018552828252830152918101829052606080820152608081019190915290565b600180825260408051602080820183528382528085019190915281840192909252805160608101909152602880825260009261058f9083013960608084019190915273d3a5122649e70ce1283df3bf2784a6716f07cbb8608084015283019190915250919050565b60405180608001604052806102626102b8565b815260200161026f6102d6565b8152600060208201526040016102b36040805160a0810182526000808252825160208082018552828252830152918101829052606080820152608081019190915290565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806102e9610304565b815260006020820181905260408201526060016102b3610322565b60405180602001604052806001906020820280368337509192915050565b6040518060400160405280610335610342565b8152602001606081525090565b60405180602001604052806102b3610304565b8051600090608084019084835b600181101561038457825160030b825260209283019290910190600101610362565b5050506020838101516001600160a81b03168582015260408085015165ffffffffffff1916908601526060808501516080918701919091528051519260c08701906000905b60018210156103ea57855115158152948401946001919091019084016103c9565b505090820151604060a08801528051918290528201925060e08601906000905b808210156104335784516001600160a01b0316835293830193918301916001919091019061040a565b50909695505050505050565b805115158252600060208083015151151581850152604083015115156040850152606083015160a0606086015280518060a087015260005b818110156104935782810184015187820160c001528301610477565b818111156104a557600060c083890101525b50608085015192506104c260808701846001600160a01b03169052565b601f01601f19169490940160c001949350505050565b6020808252825160009190828483015b600382101561051c57825171ffffffffffffffffffffffffffffffffffff19168152918301916001919091019083016104e8565b50505083015160c0608084015261053660e0840182610355565b9050604084015161055360a08501826001600160c81b0319169052565b506060840151838203601f190160c085015261056f828261043f565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d204d4d6fc3a9f09f9a80f09f9a804d6f4d6ff09f9a8020f09f9a80c3a9a264697066735822122062b47e6629a142a23ba590cc815a96bb465b120362a104371932a5ad16bf62ce64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d2d22cc7 {\n bool[1] s_0;\n }\n\n struct S_4fae7072 {\n S_d2d22cc7 s_0;\n address[] s_1;\n }\n\n struct S_0104cc3c {\n int32[1] s_0;\n uint168 s_1;\n bytes26 s_2;\n S_4fae7072 s_3;\n }\n\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_186fbd76 {\n bool s_0;\n S_c1053bda s_1;\n bool s_2;\n string s_3;\n address s_4;\n }\n\n struct S_d327d6fd {\n bytes14[3] s_0;\n S_0104cc3c s_1;\n bytes7 s_2;\n S_186fbd76 s_3;\n }\n\n function test () public pure returns (S_d327d6fd memory) {\n S_d327d6fd memory r;\n {\n bytes14[3] memory r_0;\n {\n bytes14 r_0_0 = bytes14(0xc3ec97fb78f7a49f724aec1ee775);\n r_0[0] = r_0_0;\n }\n {\n bytes14 r_0_1 = bytes14(0x22e7c736152c6e42bbcff2e67936);\n r_0[1] = r_0_1;\n }\n {\n bytes14 r_0_2 = bytes14(0xa694635771a1a8aae9c27583f9dc);\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n S_0104cc3c memory r_1;\n {\n int32[1] memory r_1_0;\n {\n int32 r_1_0_0 = -1950938984;\n r_1_0[0] = r_1_0_0;\n }\n r_1.s_0 = r_1_0;\n }\n {\n uint168 r_1_1 = 87067062404810549073219706469542110158337975125288;\n r_1.s_1 = r_1_1;\n }\n {\n bytes26 r_1_2 = bytes26(0x6f2723373602ff607c3aaabfce7e1f5066e693be22cf05500ef8);\n r_1.s_2 = r_1_2;\n }\n {\n S_4fae7072 memory r_1_3;\n {\n S_d2d22cc7 memory r_1_3_0;\n {\n bool[1] memory r_1_3_0_0;\n {\n bool r_1_3_0_0_0 = true;\n r_1_3_0_0[0] = r_1_3_0_0_0;\n }\n r_1_3_0.s_0 = r_1_3_0_0;\n }\n r_1_3.s_0 = r_1_3_0;\n }\n {\n address[] memory r_1_3_1 = new address[](1);\n {\n address r_1_3_1_0 = 0xAFc70386e1D3cc7a92CbDC0627C2Fb7Ab27F0b59;\n r_1_3_1[0] = r_1_3_1_0;\n }\n r_1_3.s_1 = r_1_3_1;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bytes7 r_2 = bytes7(0x37ebf3243dfad2);\n r.s_2 = r_2;\n }\n {\n S_186fbd76 memory r_3;\n {\n bool r_3_0 = true;\n r_3.s_0 = r_3_0;\n }\n {\n S_c1053bda memory r_3_1;\n {\n bool r_3_1_0 = true;\n r_3_1.s_0 = r_3_1_0;\n }\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3.s_2 = r_3_2;\n }\n {\n string memory r_3_3 = unicode\"Moo é🚀M MMoé🚀🚀MoMo🚀 🚀é\";\n r_3.s_3 = r_3_3;\n }\n {\n address r_3_4 = 0xd3a5122649E70cE1283dF3bf2784a6716F07cBB8;\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020c3ec97fb78f7a49f724aec1ee77500000000000000000000000000000000000022e7c736152c6e42bbcff2e67936000000000000000000000000000000000000a694635771a1a8aae9c27583f9dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c037ebf3243dfad20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8bb7089800000000000000000000003b92de1b5eddad6dd6e090f1f2d4925a98b6e605286f2723373602ff607c3aaabfce7e1f5066e693be22cf05500ef80000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000afc70386e1d3cc7a92cbdc0627c2fb7ab27f0b5900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000d3a5122649e70ce1283df3bf2784a6716f07cbb800000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a804d204d4d6fc3a9f09f9a80f09f9a804d6f4d6ff09f9a8020f09f9a80c3a9000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes30,(int192),string[2],(string,string,(bytes20,bytes12,(address,uint136[1],uint216,string,address[]))),(bytes3))", + "type": "(bytes30,(int192),string[2],(string,string,(bytes20,bytes12,(address,uint136[1],uint216,string,address[]))),(bytes3))", + "value": [ + "0xa137d1cd7b4557cac246f6e3450948c0f556d212e3129013f3bbdf3fc10c", + ["2037068930245087684756099283727091550186566670149945148704"], + [ + "Moo é🚀ooo🚀 MMoMéoMooMo Mo", + "Moo é🚀oMo 🚀 Méooo🚀ééoM 🚀oooéooMé 🚀oé🚀o🚀🚀ooMéMéoM🚀🚀🚀 ooMoé" + ], + [ + "Moo é🚀 Mo oéo🚀🚀 o🚀 🚀🚀 🚀éoooM🚀ooo", + "Moo é🚀o🚀🚀oMo éM ooo🚀o oMMoé🚀oo oééo M", + [ + "0x76b037ebc2a387068bd2fe818f82cbbb74e68201", + "0xd87429e65c6784d9d054b81a", + [ + "0xF65618E74822F66d1ab94DbE4a9c7260a46f1d4a", + ["14109388050680661275247680250092534044587"], + "10851661205865290690491059330096443828500993526125288288918213787", + "Moo é🚀éMo🚀é🚀M 🚀 🚀 o ééooo", + [ + "0x8446300b505e8718f9f7b5b71498132F0711f6fC", + "0x3C3f0b6589A3d976c28E3c9cB0EC574eEF73edEB", + "0xbF73b6816962275D5903D981C92C6Ac200348D22" + ] + ] + ] + ], + ["0x044947"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa137d1cd7b4557cac246f6e3450948c0f556d212e3129013f3bbdf3fc10c" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2037068930245087684756099283727091550186566670149945148704" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo🚀 MMoMéoMooMo Mo" + }, + { + "type": "string", + "value": "Moo é🚀oMo 🚀 Méooo🚀ééoM 🚀oooéooMé 🚀oé🚀o🚀🚀ooMéMéoM🚀🚀🚀 ooMoé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Mo oéo🚀🚀 o🚀 🚀🚀 🚀éoooM🚀ooo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀oMo éM ooo🚀o oMMoé🚀oo oééo M" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x76b037ebc2a387068bd2fe818f82cbbb74e68201" + }, + { + "type": "hexstring", + "value": "0xd87429e65c6784d9d054b81a" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF65618E74822F66d1ab94DbE4a9c7260a46f1d4a" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "14109388050680661275247680250092534044587" + } + ] + }, + { + "type": "number", + "value": "10851661205865290690491059330096443828500993526125288288918213787" + }, + { + "type": "string", + "value": "Moo é🚀éMo🚀é🚀M 🚀 🚀 o ééooo" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8446300b505e8718f9f7b5b71498132F0711f6fC" + }, + { + "type": "address", + "value": "0x3C3f0b6589A3d976c28E3c9cB0EC574eEF73edEB" + }, + { + "type": "address", + "value": "0xbF73b6816962275D5903D981C92C6Ac200348D22" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x044947" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610820806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105f9565b60405180910390f35b610056610340565b61005e610340565b7fa137d1cd7b4557cac246f6e3450948c0f556d212e3129013f3bbdf3fc10c00008152604080516020808201909252775313fdf2e387a82d3e2ce3eda9de53e5c65bfea57db445208152908201526100b4610394565b6000604051806060016040528060228152602001610790602291398252506040805160a0810190915260668082526000919061072a602083013960208301525060408201526101016103bb565b60006040518060600160405280603c81526020016106c1603c913982525060408051606081019091526039808252600091906107b260208301396020830152506101496103d8565b7376b037ebc2a387068bd2fe818f82cbbb74e6820160601b81526b6c3a14f32e33c26ce82a5c0d60a11b60208201526101806103f3565b73f65618e74822f66d1ab94dbe4a9c7260a46f1d4a815261019f61042f565b702976b94b5c643e7a4dda5459d1004717ab81526020828101919091527a1a61015e72f14517616c26518f28dda25ea85b81bbf2090194949b604080840191909152805160608101909152602d8082526000926106fd90830139606083015250604080516003808252608082019092526000918160200160208202803683370190505090506000738446300b505e8718f9f7b5b71498132f0711f6fc90508082600081518110610251576102516106aa565b60200260200101906001600160a01b031690816001600160a01b031681525050506000733c3f0b6589a3d976c28e3c9cb0ec574eef73edeb9050808260018151811061029f5761029f6106aa565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073bf73b6816962275d5903d981c92c6ac200348d22905080826002815181106102ed576102ed6106aa565b6001600160a01b039290921660209283029190910182015260808481019390935260408581019490945285840194909452506060850193909352805191820190526204494760e81b815290820152919050565b6040805160a08101825260008082528251602080820185529181529082015290810161036a610394565b81526020016103776103bb565b81526040805160208181019092526000815291015290565b905290565b60405180604001604052806002905b60608152602001906001900390816103a35790505090565b6040518060600160405280606081526020016060815260200161038f5b604080516060810182526000808252602082015290810161038f5b6040518060a0016040528060006001600160a01b0316815260200161041661042f565b8152600060208201526060604082018190529081015290565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b8181101561047357602081850181015186830182015201610457565b81811115610485576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156104d35781516001600160a01b0316875295820195908201906001016104ae565b509495945050505050565b60008151606084526104f3606085018261044d565b90506020808401518583038287015261050c838261044d565b6040868101518883038983015280516bffffffffffffffffffffffff19168352848101516001600160a01b03191685840152810151606091830182905280516001600160a01b0316918301919091528084015191945091506080840160005b600181101561059b57825170ffffffffffffffffffffffffffffffffff168252918401919084019060010161056b565b50505060408101516001600160d81b03811660a085015291506060810151915060a060c08401526105d061010084018361044d565b915060808101519050605f198383030160e08401526105ef828261049a565b9695505050505050565b6020808252825161ffff191682820152828101515160170b60408084019190915283015160a060608401526000919061010084019060c08501845b60028110156106635760bf1987850301825261065184845161044d565b93509184019190840190600101610634565b5050506060850151848203601f19016080860152915061068381836104de565b91505060808401516106a260a0850182516001600160e81b0319169052565b509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80204d6f20206fc3a96ff09f9a80f09f9a80206ff09f9a8020f09f9a80f09f9a8020f09f9a80c3a96f6f6f4df09f9a806f6f6f4d6f6f20c3a9f09f9a80c3a94d6ff09f9a80c3a9f09f9a804d20f09f9a8020f09f9a80206f20c3a9c3a96f6f6f4d6f6f20c3a9f09f9a806f4d6f2020f09f9a8020204dc3a96f6f6ff09f9a80c3a9c3a96f4d20f09f9a806f6f6fc3a96f6f4dc3a920f09f9a806fc3a9f09f9a806ff09f9a80f09f9a806f6f4dc3a94dc3a96f4df09f9a80f09f9a80f09f9a80206f6f4d6fc3a94d6f6f20c3a9f09f9a806f6f6ff09f9a80204d4d6f4dc3a96f4d6f6f4d6f20204d6f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f4d6f20c3a94d206f6f6ff09f9a806f206f4d4d6fc3a9f09f9a806f6f206fc3a9c3a96f204da2646970667358221220d41c5a82c30e9448b7247ddf583de51be6569be360c004014a75ef8e014e6c6664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ad75eff8 {\n int192 s_0;\n }\n\n struct S_af1677fe {\n address s_0;\n uint136[1] s_1;\n uint216 s_2;\n string s_3;\n address[] s_4;\n }\n\n struct S_dff01d3c {\n bytes20 s_0;\n bytes12 s_1;\n S_af1677fe s_2;\n }\n\n struct S_c62daf3e {\n string s_0;\n string s_1;\n S_dff01d3c s_2;\n }\n\n struct S_f9135bc5 {\n bytes3 s_0;\n }\n\n struct S_84b9a376 {\n bytes30 s_0;\n S_ad75eff8 s_1;\n string[2] s_2;\n S_c62daf3e s_3;\n S_f9135bc5 s_4;\n }\n\n function test () public pure returns (S_84b9a376 memory) {\n S_84b9a376 memory r;\n {\n bytes30 r_0 = bytes30(0xa137d1cd7b4557cac246f6e3450948c0f556d212e3129013f3bbdf3fc10c);\n r.s_0 = r_0;\n }\n {\n S_ad75eff8 memory r_1;\n {\n int192 r_1_0 = 2037068930245087684756099283727091550186566670149945148704;\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n string[2] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀ooo🚀 MMoMéoMooMo Mo\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀oMo 🚀 Méooo🚀ééoM 🚀oooéooMé 🚀oé🚀o🚀🚀ooMéMéoM🚀🚀🚀 ooMoé\";\n r_2[1] = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n S_c62daf3e memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀 Mo oéo🚀🚀 o🚀 🚀🚀 🚀éoooM🚀ooo\";\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀o🚀🚀oMo éM ooo🚀o oMMoé🚀oo oééo M\";\n r_3.s_1 = r_3_1;\n }\n {\n S_dff01d3c memory r_3_2;\n {\n bytes20 r_3_2_0 = bytes20(0x76b037ebc2a387068Bd2fE818f82cBbb74e68201);\n r_3_2.s_0 = r_3_2_0;\n }\n {\n bytes12 r_3_2_1 = bytes12(0xd87429e65c6784d9d054b81a);\n r_3_2.s_1 = r_3_2_1;\n }\n {\n S_af1677fe memory r_3_2_2;\n {\n address r_3_2_2_0 = 0xF65618E74822F66d1ab94DbE4a9c7260a46f1d4a;\n r_3_2_2.s_0 = r_3_2_2_0;\n }\n {\n uint136[1] memory r_3_2_2_1;\n {\n uint136 r_3_2_2_1_0 = 14109388050680661275247680250092534044587;\n r_3_2_2_1[0] = r_3_2_2_1_0;\n }\n r_3_2_2.s_1 = r_3_2_2_1;\n }\n {\n uint216 r_3_2_2_2 = 10851661205865290690491059330096443828500993526125288288918213787;\n r_3_2_2.s_2 = r_3_2_2_2;\n }\n {\n string memory r_3_2_2_3 = unicode\"Moo é🚀éMo🚀é🚀M 🚀 🚀 o ééooo\";\n r_3_2_2.s_3 = r_3_2_2_3;\n }\n {\n address[] memory r_3_2_2_4 = new address[](3);\n {\n address r_3_2_2_4_0 = 0x8446300b505e8718f9f7b5b71498132F0711f6fC;\n r_3_2_2_4[0] = r_3_2_2_4_0;\n }\n {\n address r_3_2_2_4_1 = 0x3C3f0b6589A3d976c28E3c9cB0EC574eEF73edEB;\n r_3_2_2_4[1] = r_3_2_2_4_1;\n }\n {\n address r_3_2_2_4_2 = 0xbF73b6816962275D5903D981C92C6Ac200348D22;\n r_3_2_2_4[2] = r_3_2_2_4_2;\n }\n r_3_2_2.s_4 = r_3_2_2_4;\n }\n r_3_2.s_2 = r_3_2_2;\n }\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n S_f9135bc5 memory r_4;\n {\n bytes3 r_4_0 = bytes3(0x044947);\n r_4.s_0 = r_4_0;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020a137d1cd7b4557cac246f6e3450948c0f556d212e3129013f3bbdf3fc10c000000000000000000005313fdf2e387a82d3e2ce3eda9de53e5c65bfea57db4452000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e00449470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806f6f6ff09f9a80204d4d6f4dc3a96f4d6f6f4d6f20204d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a806f4d6f2020f09f9a8020204dc3a96f6f6ff09f9a80c3a9c3a96f4d20f09f9a806f6f6fc3a96f6f4dc3a920f09f9a806fc3a9f09f9a806ff09f9a80f09f9a806f6f4dc3a94dc3a96f4df09f9a80f09f9a80f09f9a80206f6f4d6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a80204d6f20206fc3a96ff09f9a80f09f9a80206ff09f9a8020f09f9a80f09f9a8020f09f9a80c3a96f6f6f4df09f9a806f6f6f0000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f4d6f20c3a94d206f6f6ff09f9a806f206f4d4d6fc3a9f09f9a806f6f206fc3a9c3a96f204d0000000000000076b037ebc2a387068bd2fe818f82cbbb74e68201000000000000000000000000d87429e65c6784d9d054b81a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f65618e74822f66d1ab94dbe4a9c7260a46f1d4a0000000000000000000000000000002976b94b5c643e7a4dda5459d1004717ab00000000001a61015e72f14517616c26518f28dda25ea85b81bbf2090194949b00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80c3a94d6ff09f9a80c3a9f09f9a804d20f09f9a8020f09f9a80206f20c3a9c3a96f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000008446300b505e8718f9f7b5b71498132f0711f6fc0000000000000000000000003c3f0b6589a3d976c28e3c9cb0ec574eef73edeb000000000000000000000000bf73b6816962275d5903d981c92c6ac200348d22" + }, + { + "name": "random-(string,bool,(address,address,((bool),(address,address,string,uint16),uint160,(bytes31,bool,string,bytes26)[2])),(string))", + "type": "(string,bool,(address,address,((bool),(address,address,string,uint16),uint160,(bytes31,bool,string,bytes26)[2])),(string))", + "value": [ + "Moo é🚀🚀éééMM ééo o oo🚀oo🚀MéoMMooMééMé🚀o🚀o🚀ééMoooMo oo", + true, + [ + "0xE66A6F5e07BCB29ECb48BD4F0C08E2872EBC6ef2", + "0xE2F7bC16393d6f37dAAf0B0989B0C1e7d1Cf9b60", + [ + [false], + [ + "0xA3fD8271d4ef9266174fE409113C0aeeDE5b98bd", + "0x9a8D4049A78D11D32684aB03B9ed7EdaE2C63B93", + "Moo é🚀", + "5136" + ], + "916422500711144337695906013851951176225583533211", + [ + [ + "0x68a540f159da95c9a54205da8aab2ffefeef4db4d6e5dfb6aa76b3960e99bf", + true, + "Moo é🚀🚀oo oééo 🚀", + "0xbe8a76b1fed40a7425eacbba7e6dc38fbae10b12ae88a5d82d21" + ], + [ + "0x04f82b1bf4a3041086d08cbd6e0acbc21ebfa1850b34baab95f08a76217635", + true, + "Moo é🚀M🚀éé🚀é🚀o🚀 oéo éo🚀éMMéoM ooo🚀M ooo🚀éMo", + "0x7a6135c771194724e7b4dca32976d7d22429c1b2bbb42eda40ed" + ] + ] + ] + ], + ["Moo é🚀éooéMoM MMooMoMo🚀🚀M oéM🚀oé🚀o 🚀🚀é M ooMM é"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éééMM ééo o oo🚀oo🚀MéoMMooMééMé🚀o🚀o🚀ééMoooMo oo" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE66A6F5e07BCB29ECb48BD4F0C08E2872EBC6ef2" + }, + { + "type": "address", + "value": "0xE2F7bC16393d6f37dAAf0B0989B0C1e7d1Cf9b60" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA3fD8271d4ef9266174fE409113C0aeeDE5b98bd" + }, + { + "type": "address", + "value": "0x9a8D4049A78D11D32684aB03B9ed7EdaE2C63B93" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "5136" + } + ] + }, + { + "type": "number", + "value": "916422500711144337695906013851951176225583533211" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x68a540f159da95c9a54205da8aab2ffefeef4db4d6e5dfb6aa76b3960e99bf" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀oo oééo 🚀" + }, + { + "type": "hexstring", + "value": "0xbe8a76b1fed40a7425eacbba7e6dc38fbae10b12ae88a5d82d21" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x04f82b1bf4a3041086d08cbd6e0acbc21ebfa1850b34baab95f08a76217635" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀M🚀éé🚀é🚀o🚀 oéo éo🚀éMMéoM ooo🚀M ooo🚀éMo" + }, + { + "type": "hexstring", + "value": "0x7a6135c771194724e7b4dca32976d7d22429c1b2bbb42eda40ed" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooéMoM MMooMoMo🚀🚀M oéM🚀oé🚀o 🚀🚀é M ooMM é" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506106f6806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906104bc565b60405180910390f35b6100566102e3565b61005e6102e3565b60006040518060800160405280605781526020016105d1605791398252506001602082015261008b610323565b73e66a6f5e07bcb29ecb48bd4f0c08e2872ebc6ef2815273e2f7bc16393d6f37daaf0b0989b0c1e7d1cf9b6060208201526100c461033e565b604080516020808201835260008083529184528251608081018452606081850181815290820193845273a3fd8271d4ef9266174fe409113c0aeede5b98bd8252739a8d4049a78d11d32684ab03b9ed7edae2c63b938284015284518086018652600a8152689adede418753e13f3560b71b81850152905261141090925283015273a085ce61618695138f703cf51a1448c276400c9b9082015261016561038c565b6040805160808082018352606082840181815260008285018181527f68a540f159da95c9a54205da8aab2ffefeef4db4d6e5dfb6aa76b3960e99bf008652600160208088018290528851808a018a52601c81527f4d6f6f20c3a9f09f9a80f09f9a806f6f206fc3a9c3a96f20f09f9a8000000000818301529094527fbe8a76b1fed40a7425eacbba7e6dc38fbae10b12ae88a5d82d21000000000000909152948752855180850187528087018490529283018190527f04f82b1bf4a3041086d08cbd6e0acbc21ebfa1850b34baab95f08a76217635008352828201949094528451928301909452604e8083529093610673908301396040830152507f7a6135c771194724e7b4dca32976d7d22429c1b2bbb42eda40ed0000000000006060820152808260016020908102919091019190915260608085019390935260408086019490945285840194909452508151928301909152815260006040518060800160405280604b8152602001610628604b91398252506060820152919050565b604080516080810182526060815260006020820152908101610303610323565b815260200161031e6040518060200160405280606081525090565b905290565b604080516060810182526000808252602082015290810161031e5b6040805160a0810190915260006080820190815281908152604080516080810182526000808252602082810182905260609383018490529282015291019081526000602082015260400161031e5b60405180604001604052806002905b6040805160808101825260008082526020808301829052606093830184905292820152825260001990920191018161039b5790505090565b6000815180845260005b818110156103f9576020818501810151868301820152016103dd565b8181111561040b576000602083870101525b50601f01601f19169290920160200192915050565b60008260408082018460005b60028110156104935784830388528151608060ff198251168552602080830151151581870152868301518288880152610467838801826103d3565b60609485015165ffffffffffff19169790940196909652998a019991945050919091019060010161042c565b50909695505050505050565b60008151602084526104b460208501826103d3565b949350505050565b6000602080835283516080828501526104d860a08501826103d3565b905081850151604081151581870152808701519150601f19606081888603018189015260018060a01b03808551168652808786015116878701528385015194508184870152845151151582870152868501516080808801528181511660e088015281888201511661010088015284810151975060806101208801526105616101608801896103d3565b9083015161ffff16610140880152938501516001600160a01b03811660a088015293965061058c9050565b92830151848603605f190160c0860152926105a78685610420565b955080890151945050808786030160808801525050506105c7828261049f565b9594505050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9c3a94d4d20c3a9c3a96f206f206f6ff09f9a806f6ff09f9a804dc3a96f4d4d6f6f4dc3a9c3a94dc3a9f09f9a806ff09f9a806ff09f9a80c3a9c3a94d6f6f6f4d6f20206f6f4d6f6f20c3a9f09f9a80c3a96f6fc3a94d6f4d204d4d6f6f4d6f4d6ff09f9a80f09f9a804d206fc3a94df09f9a806fc3a9f09f9a806f20f09f9a80f09f9a80c3a9204d206f6f4d4d20c3a94d6f6f20c3a9f09f9a804df09f9a80c3a9c3a9f09f9a80c3a9f09f9a806ff09f9a8020206fc3a96f2020c3a96ff09f9a80c3a94d4dc3a96f4d206f6f6ff09f9a804d206f6f6ff09f9a80c3a94d6fa2646970667358221220bf96fc29f7d153471aca79297c82af29b6c71f43afb32dbe259e706f53cf665e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_580e1474 {\n address s_0;\n address s_1;\n string s_2;\n uint16 s_3;\n }\n\n struct S_266cb0b9 {\n bytes31 s_0;\n bool s_1;\n string s_2;\n bytes26 s_3;\n }\n\n struct S_45df91f1 {\n S_c1053bda s_0;\n S_580e1474 s_1;\n uint160 s_2;\n S_266cb0b9[2] s_3;\n }\n\n struct S_2a96377d {\n address s_0;\n address s_1;\n S_45df91f1 s_2;\n }\n\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_5af0a372 {\n string s_0;\n bool s_1;\n S_2a96377d s_2;\n S_97fc4627 s_3;\n }\n\n function test () public pure returns (S_5af0a372 memory) {\n S_5af0a372 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀éééMM ééo o oo🚀oo🚀MéoMMooMééMé🚀o🚀o🚀ééMoooMo oo\";\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_2a96377d memory r_2;\n {\n address r_2_0 = 0xE66A6F5e07BCB29ECb48BD4F0C08E2872EBC6ef2;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0xE2F7bC16393d6f37dAAf0B0989B0C1e7d1Cf9b60;\n r_2.s_1 = r_2_1;\n }\n {\n S_45df91f1 memory r_2_2;\n {\n S_c1053bda memory r_2_2_0;\n {\n bool r_2_2_0_0 = false;\n r_2_2_0.s_0 = r_2_2_0_0;\n }\n r_2_2.s_0 = r_2_2_0;\n }\n {\n S_580e1474 memory r_2_2_1;\n {\n address r_2_2_1_0 = 0xA3fD8271d4ef9266174fE409113C0aeeDE5b98bd;\n r_2_2_1.s_0 = r_2_2_1_0;\n }\n {\n address r_2_2_1_1 = 0x9a8D4049A78D11D32684aB03B9ed7EdaE2C63B93;\n r_2_2_1.s_1 = r_2_2_1_1;\n }\n {\n string memory r_2_2_1_2 = unicode\"Moo é🚀\";\n r_2_2_1.s_2 = r_2_2_1_2;\n }\n {\n uint16 r_2_2_1_3 = 5136;\n r_2_2_1.s_3 = r_2_2_1_3;\n }\n r_2_2.s_1 = r_2_2_1;\n }\n {\n uint160 r_2_2_2 = 916422500711144337695906013851951176225583533211;\n r_2_2.s_2 = r_2_2_2;\n }\n {\n S_266cb0b9[2] memory r_2_2_3;\n {\n S_266cb0b9 memory r_2_2_3_0;\n {\n bytes31 r_2_2_3_0_0 = bytes31(0x68a540f159da95c9a54205da8aab2ffefeef4db4d6e5dfb6aa76b3960e99bf);\n r_2_2_3_0.s_0 = r_2_2_3_0_0;\n }\n {\n bool r_2_2_3_0_1 = true;\n r_2_2_3_0.s_1 = r_2_2_3_0_1;\n }\n {\n string memory r_2_2_3_0_2 = unicode\"Moo é🚀🚀oo oééo 🚀\";\n r_2_2_3_0.s_2 = r_2_2_3_0_2;\n }\n {\n bytes26 r_2_2_3_0_3 = bytes26(0xbe8a76b1fed40a7425eacbba7e6dc38fbae10b12ae88a5d82d21);\n r_2_2_3_0.s_3 = r_2_2_3_0_3;\n }\n r_2_2_3[0] = r_2_2_3_0;\n }\n {\n S_266cb0b9 memory r_2_2_3_1;\n {\n bytes31 r_2_2_3_1_0 = bytes31(0x04f82b1bf4a3041086d08cbd6e0acbc21ebfa1850b34baab95f08a76217635);\n r_2_2_3_1.s_0 = r_2_2_3_1_0;\n }\n {\n bool r_2_2_3_1_1 = true;\n r_2_2_3_1.s_1 = r_2_2_3_1_1;\n }\n {\n string memory r_2_2_3_1_2 = unicode\"Moo é🚀M🚀éé🚀é🚀o🚀 oéo éo🚀éMMéoM ooo🚀M ooo🚀éMo\";\n r_2_2_3_1.s_2 = r_2_2_3_1_2;\n }\n {\n bytes26 r_2_2_3_1_3 = bytes26(0x7a6135c771194724e7b4dca32976d7d22429c1b2bbb42eda40ed);\n r_2_2_3_1.s_3 = r_2_2_3_1_3;\n }\n r_2_2_3[1] = r_2_2_3_1;\n }\n r_2_2.s_3 = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n S_97fc4627 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀éooéMoM MMooMoMo🚀🚀M oéM🚀oé🚀o 🚀🚀é M ooMM é\";\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9c3a94d4d20c3a9c3a96f206f206f6ff09f9a806f6ff09f9a804dc3a96f4d4d6f6f4dc3a9c3a94dc3a9f09f9a806ff09f9a806ff09f9a80c3a9c3a94d6f6f6f4d6f20206f6f000000000000000000000000000000000000000000e66a6f5e07bcb29ecb48bd4f0c08e2872ebc6ef2000000000000000000000000e2f7bc16393d6f37daaf0b0989b0c1e7d1cf9b60000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a085ce61618695138f703cf51a1448c276400c9b0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000a3fd8271d4ef9266174fe409113c0aeede5b98bd0000000000000000000000009a8d4049a78d11d32684ab03b9ed7edae2c63b9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001410000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000010068a540f159da95c9a54205da8aab2ffefeef4db4d6e5dfb6aa76b3960e99bf0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080be8a76b1fed40a7425eacbba7e6dc38fbae10b12ae88a5d82d21000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80f09f9a806f6f206fc3a9c3a96f20f09f9a800000000004f82b1bf4a3041086d08cbd6e0acbc21ebfa1850b34baab95f08a7621763500000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000807a6135c771194724e7b4dca32976d7d22429c1b2bbb42eda40ed000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a804df09f9a80c3a9c3a9f09f9a80c3a9f09f9a806ff09f9a8020206fc3a96f2020c3a96ff09f9a80c3a94d4dc3a96f4d206f6f6ff09f9a804d206f6f6ff09f9a80c3a94d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a80c3a96f6fc3a94d6f4d204d4d6f6f4d6f4d6ff09f9a80f09f9a804d206fc3a94df09f9a806fc3a9f09f9a806f20f09f9a80f09f9a80c3a9204d206f6f4d4d20c3a9000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,string,bytes15[3],(string,bool,bool,string,((uint232,(bytes1,bytes23,int24[],int8),bytes4),bytes22)))", + "type": "(string,string,bytes15[3],(string,bool,bool,string,((uint232,(bytes1,bytes23,int24[],int8),bytes4),bytes22)))", + "value": [ + "Moo é🚀 MMoo 🚀🚀Moéoooé🚀oo", + "Moo é🚀o🚀ééoéooMM o🚀", + [ + "0x02bdcd63671a6015c6a470b3217c65", + "0x33d5b2a8d974013b45f139c7a187a2", + "0xfaa10d7f8d18c7736a7d11609718b9" + ], + [ + "Moo é🚀 oo🚀M🚀🚀🚀éooM o🚀ééooM MMé", + true, + true, + "Moo é🚀é🚀é🚀o🚀éMooo🚀 🚀 M oéooé🚀é🚀M", + [ + [ + "4168637198087632516944368877967562832240128706135842842843529391293656", + [ + "0x3d", + "0x99ff1f514362883450e2301dd8111bee85712dc61120e9", + ["26467", "-4823089", "-2975968", "-70145"], + "-56" + ], + "0xe558938f" + ], + "0x17c6fafd5af4860c3cbc9a95ee66dd59194ac6608c5e" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 MMoo 🚀🚀Moéoooé🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀ééoéooMM o🚀" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x02bdcd63671a6015c6a470b3217c65" + }, + { + "type": "hexstring", + "value": "0x33d5b2a8d974013b45f139c7a187a2" + }, + { + "type": "hexstring", + "value": "0xfaa10d7f8d18c7736a7d11609718b9" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oo🚀M🚀🚀🚀éooM o🚀ééooM MMé" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀é🚀é🚀o🚀éMooo🚀 🚀 M oéooé🚀é🚀M" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4168637198087632516944368877967562832240128706135842842843529391293656" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3d" + }, + { + "type": "hexstring", + "value": "0x99ff1f514362883450e2301dd8111bee85712dc61120e9" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "26467" + }, + { + "type": "number", + "value": "-4823089" + }, + { + "type": "number", + "value": "-2975968" + }, + { + "type": "number", + "value": "-70145" + } + ] + }, + { + "type": "number", + "value": "-56" + } + ] + }, + { + "type": "hexstring", + "value": "0xe558938f" + } + ] + }, + { + "type": "hexstring", + "value": "0x17c6fafd5af4860c3cbc9a95ee66dd59194ac6608c5e" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506106f8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061056d565b60405180910390f35b610056610318565b61005e610318565b6000604051806060016040528060298152602001610665602991398252506040805180820190915260208082527f4d6f6f20c3a9f09f9a806ff09f9a80c3a9c3a96fc3a96f6f4d4d206ff09f9a80818301528201526100bb61034b565b6e02bdcd63671a6015c6a470b3217c6560881b81526e19ead9546cba009da2f89ce3d0c3d160891b60208201526efaa10d7f8d18c7736a7d11609718b960881b60408083019190915282015261010f610369565b600060405180606001604052806035815260200161068e6035913982525060016020808301829052604080840192909252815160608101909252603f8083526000929161062690830139606083015250610167610398565b61016f6103b8565b7c9a9f93b127ecfe16bd94bf67bab81dc024565ae8afeb13247c69e2c4d88152604080516080808201835260608284018190526000908301819052603d60f81b83527f99ff1f514362883450e2301dd8111bee85712dc61120e90000000000000000006020808501919091528451600480825260a08201909652939491939290830190803683370190505090506000616763905080826000815181106102175761021761060f565b602002602001019060020b908160020b815250505060006249983019905080826001815181106102495761024961060f565b600292830b60209182029290920101528251622d68df1992508291849181106102745761027461060f565b602002602001019060020b908160020b815250505060006201120019905080826003815181106102a6576102a661060f565b60029290920b6020928302919091018201526040808501939093526037196060808601919091528582019490945263e558938f60e01b9285019290925250918352750be37d7ead7a43061e5e4d4af7336eac8ca56330462f60511b918301919091526080830191909152820152919050565b6040518060800160405280606081526020016060815260200161033961034b565b8152602001610346610369565b905290565b60405180606001604052806003906020820280368337509192915050565b6040518060a0016040528060608152602001600015158152602001600015158152602001606081526020016103465b60405180604001604052806103ab6103b8565b8152600060209091015290565b60408051606080820183526000808352835160808101855281815260208181018390529481018390529182015290918201906103ab565b6000815180845260005b81811015610415576020818501810151868301820152016103f9565b81811115610427576000602083870101525b50601f01601f19169290920160200192915050565b6000815160a0845261045160a08501826103ef565b90506020808401511515818601526040808501511515818701526060850151868403606088015261048284826103ef565b6080878101518983038a830152805185845280516001600160e81b0316868501528681015160608086015280516001600160f81b03191660a08601528088015168ffffffffffffffffff191660c08601528087015160e0860194909452835161012086018190529498509194509290918601906000906101408901905b8083101561052257835160020b82529288019260019290920191908801906104ff565b506060840151935061053a6101008a018560000b9052565b95909301516001600160e01b031916608088015250505082015169ffffffffffffffffffff191691909201529392505050565b60006020808352835160c08285015261058960e08501826103ef565b905081850151601f19808684030160408701526105a683836103ef565b9250604087015191506060860160005b60038110156105e757835170ffffffffffffffffffffffffffffffffff1916825292850192908501906001016105b6565b505060608701519350808684030160c08701525050610606818361043c565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9f09f9a806ff09f9a80c3a94d6f6f6ff09f9a8020f09f9a80204d206fc3a96f6fc3a9f09f9a80c3a9f09f9a804d4d6f6f20c3a9f09f9a8020204d4d6f6f2020f09f9a80f09f9a804d6fc3a96f6f6fc3a9f09f9a806f6f4d6f6f20c3a9f09f9a80206f6ff09f9a804df09f9a80f09f9a80f09f9a80c3a96f6f4d206ff09f9a80c3a9c3a96f6f4d204d4dc3a9a26469706673582212202988a57d23cb119a3d5f03b1f86b5b6c39ae56df0cb292247fdc32b0298e593c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_75a4476a {\n bytes1 s_0;\n bytes23 s_1;\n int24[] s_2;\n int8 s_3;\n }\n\n struct S_bf4fe9a4 {\n uint232 s_0;\n S_75a4476a s_1;\n bytes4 s_2;\n }\n\n struct S_5e66851a {\n S_bf4fe9a4 s_0;\n bytes22 s_1;\n }\n\n struct S_73687d60 {\n string s_0;\n bool s_1;\n bool s_2;\n string s_3;\n S_5e66851a s_4;\n }\n\n struct S_bca93cb8 {\n string s_0;\n string s_1;\n bytes15[3] s_2;\n S_73687d60 s_3;\n }\n\n function test () public pure returns (S_bca93cb8 memory) {\n S_bca93cb8 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀 MMoo 🚀🚀Moéoooé🚀oo\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀o🚀ééoéooMM o🚀\";\n r.s_1 = r_1;\n }\n {\n bytes15[3] memory r_2;\n {\n bytes15 r_2_0 = bytes15(0x02bdcd63671a6015c6a470b3217c65);\n r_2[0] = r_2_0;\n }\n {\n bytes15 r_2_1 = bytes15(0x33d5b2a8d974013b45f139c7a187a2);\n r_2[1] = r_2_1;\n }\n {\n bytes15 r_2_2 = bytes15(0xfaa10d7f8d18c7736a7d11609718b9);\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n S_73687d60 memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀 oo🚀M🚀🚀🚀éooM o🚀ééooM MMé\";\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = true;\n r_3.s_1 = r_3_1;\n }\n {\n bool r_3_2 = true;\n r_3.s_2 = r_3_2;\n }\n {\n string memory r_3_3 = unicode\"Moo é🚀é🚀é🚀o🚀éMooo🚀 🚀 M oéooé🚀é🚀M\";\n r_3.s_3 = r_3_3;\n }\n {\n S_5e66851a memory r_3_4;\n {\n S_bf4fe9a4 memory r_3_4_0;\n {\n uint232 r_3_4_0_0 = 4168637198087632516944368877967562832240128706135842842843529391293656;\n r_3_4_0.s_0 = r_3_4_0_0;\n }\n {\n S_75a4476a memory r_3_4_0_1;\n {\n bytes1 r_3_4_0_1_0 = bytes1(0x3d);\n r_3_4_0_1.s_0 = r_3_4_0_1_0;\n }\n {\n bytes23 r_3_4_0_1_1 = bytes23(0x99ff1f514362883450e2301dd8111bee85712dc61120e9);\n r_3_4_0_1.s_1 = r_3_4_0_1_1;\n }\n {\n int24[] memory r_3_4_0_1_2 = new int24[](4);\n {\n int24 r_3_4_0_1_2_0 = 26467;\n r_3_4_0_1_2[0] = r_3_4_0_1_2_0;\n }\n {\n int24 r_3_4_0_1_2_1 = -4823089;\n r_3_4_0_1_2[1] = r_3_4_0_1_2_1;\n }\n {\n int24 r_3_4_0_1_2_2 = -2975968;\n r_3_4_0_1_2[2] = r_3_4_0_1_2_2;\n }\n {\n int24 r_3_4_0_1_2_3 = -70145;\n r_3_4_0_1_2[3] = r_3_4_0_1_2_3;\n }\n r_3_4_0_1.s_2 = r_3_4_0_1_2;\n }\n {\n int8 r_3_4_0_1_3 = -56;\n r_3_4_0_1.s_3 = r_3_4_0_1_3;\n }\n r_3_4_0.s_1 = r_3_4_0_1;\n }\n {\n bytes4 r_3_4_0_2 = bytes4(0xe558938f);\n r_3_4_0.s_2 = r_3_4_0_2;\n }\n r_3_4.s_0 = r_3_4_0;\n }\n {\n bytes22 r_3_4_1 = bytes22(0x17c6fafd5af4860c3cbc9a95ee66dd59194ac6608c5e);\n r_3_4.s_1 = r_3_4_1;\n }\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012002bdcd63671a6015c6a470b3217c65000000000000000000000000000000000033d5b2a8d974013b45f139c7a187a20000000000000000000000000000000000faa10d7f8d18c7736a7d11609718b90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a8020204d4d6f6f2020f09f9a80f09f9a804d6fc3a96f6f6fc3a9f09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a806ff09f9a80c3a9c3a96fc3a96f6f4d4d206ff09f9a8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a80206f6ff09f9a804df09f9a80f09f9a80f09f9a80c3a96f6f4d206ff09f9a80c3a9c3a96f6f4d204d4dc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9f09f9a806ff09f9a80c3a94d6f6f6ff09f9a8020f09f9a80204d206fc3a96f6fc3a9f09f9a80c3a9f09f9a804d00000000000000000000000000000000000000000000000000000000000000004017c6fafd5af4860c3cbc9a95ee66dd59194ac6608c5e000000000000000000000000009a9f93b127ecfe16bd94bf67bab81dc024565ae8afeb13247c69e2c4d80000000000000000000000000000000000000000000000000000000000000060e558938f000000000000000000000000000000000000000000000000000000003d0000000000000000000000000000000000000000000000000000000000000099ff1f514362883450e2301dd8111bee85712dc61120e90000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000006763ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb667cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd29720fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeedff" + }, + { + "name": "random-((((bytes26),bool,bool[1],address),bytes4,string,(bool,string[],bytes9[4],(bool,address,address)),bool))[3]", + "type": "((((bytes26),bool,bool[1],address),bytes4,string,(bool,string[],bytes9[4],(bool,address,address)),bool))[3]", + "value": [ + [ + [ + [ + ["0x76c4bdcb4fd1c75aabbc5ac6ad53d650fdf7b457bef229fbc0c5"], + true, + [true], + "0xD724039edE2c586203762938737aE822b3825c2F" + ], + "0x4f5191d1", + "Moo é🚀", + [ + false, + [], + [ + "0xb595d342d7a9f75a6f", + "0x1c5087f9da64bb3f71", + "0x423e4dad6e648ff95e", + "0x0507b315ef15cf5d99" + ], + [ + false, + "0x3Cf794E454EE2605c510392082537D27e8f474c2", + "0x679A8B72CC0912E276283bc2d2a21f39Ba337CE4" + ] + ], + true + ] + ], + [ + [ + [ + ["0x079222c9d34106605724add983ecf8c33598312ecb3efce19704"], + true, + [false], + "0xd8b545fB3AEd8D5F7fCCDb4e7806DE727607F38e" + ], + "0x2061a03b", + "Moo é🚀 oM🚀🚀MéMMo🚀M Mo🚀oo🚀oo🚀éoo🚀🚀Mooo é", + [ + false, + [ + "Moo é🚀o oMoMéoMoM🚀o🚀oooMooMo🚀 ooM 🚀M oM 🚀MMoé🚀ééM", + "Moo é🚀oooéMo éoéoo é Méooé o Mooo o M oMooo 🚀" + ], + [ + "0x3e79089c264603a4b9", + "0xaadf1e6522080e6b27", + "0xc2e2f6cf75fb54b916", + "0x7ae9d40b0f3ae8ce13" + ], + [ + false, + "0x742920762919f76c5e92Bb424c9c651eba09bfFb", + "0x1B8f25d93bD2b6A441a1fB6D2aA96f8cC2C0fc99" + ] + ], + true + ] + ], + [ + [ + [ + ["0x0af1946841d7f1eecaea8734f48956eb0d3fef715a2a528c0ca7"], + false, + [false], + "0x289132918e66C936b66DF052ffDD4D247b4e488D" + ], + "0xfb69f6d0", + "Moo é🚀🚀🚀oé🚀 M🚀éoéM 🚀🚀ééoo ooooooo🚀 🚀o éé🚀 o🚀M MMoMoéo", + [ + false, + [ + "Moo é🚀 oo🚀🚀éé🚀oM🚀é🚀🚀éMM o🚀oMoMoéMMM 🚀o🚀 M🚀 🚀o🚀éo🚀o 🚀 MM🚀o o", + "Moo é🚀🚀oéoMooooéMoo", + "Moo é🚀o🚀 oMM🚀oo🚀oooéoo ooé é🚀o🚀Méoo" + ], + [ + "0x6618497727a3e0a890", + "0x1e244d1834acf1937d", + "0xc0b059c9c26dd5b2a1", + "0x1fe55567386848cce8" + ], + [ + true, + "0xF9EDfD91f2E3302eA48bD0c6bEbFF5b0bB0B2a77", + "0x6b3f4f46D3dd573f44585CdC5BbFa411FC78260A" + ] + ], + true + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x76c4bdcb4fd1c75aabbc5ac6ad53d650fdf7b457bef229fbc0c5" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xD724039edE2c586203762938737aE822b3825c2F" + } + ] + }, + { + "type": "hexstring", + "value": "0x4f5191d1" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb595d342d7a9f75a6f" + }, + { + "type": "hexstring", + "value": "0x1c5087f9da64bb3f71" + }, + { + "type": "hexstring", + "value": "0x423e4dad6e648ff95e" + }, + { + "type": "hexstring", + "value": "0x0507b315ef15cf5d99" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x3Cf794E454EE2605c510392082537D27e8f474c2" + }, + { + "type": "address", + "value": "0x679A8B72CC0912E276283bc2d2a21f39Ba337CE4" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x079222c9d34106605724add983ecf8c33598312ecb3efce19704" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xd8b545fB3AEd8D5F7fCCDb4e7806DE727607F38e" + } + ] + }, + { + "type": "hexstring", + "value": "0x2061a03b" + }, + { + "type": "string", + "value": "Moo é🚀 oM🚀🚀MéMMo🚀M Mo🚀oo🚀oo🚀éoo🚀🚀Mooo é" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oMoMéoMoM🚀o🚀oooMooMo🚀 ooM 🚀M oM 🚀MMoé🚀ééM" + }, + { + "type": "string", + "value": "Moo é🚀oooéMo éoéoo é Méooé o Mooo o M oMooo 🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3e79089c264603a4b9" + }, + { + "type": "hexstring", + "value": "0xaadf1e6522080e6b27" + }, + { + "type": "hexstring", + "value": "0xc2e2f6cf75fb54b916" + }, + { + "type": "hexstring", + "value": "0x7ae9d40b0f3ae8ce13" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x742920762919f76c5e92Bb424c9c651eba09bfFb" + }, + { + "type": "address", + "value": "0x1B8f25d93bD2b6A441a1fB6D2aA96f8cC2C0fc99" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0af1946841d7f1eecaea8734f48956eb0d3fef715a2a528c0ca7" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x289132918e66C936b66DF052ffDD4D247b4e488D" + } + ] + }, + { + "type": "hexstring", + "value": "0xfb69f6d0" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀oé🚀 M🚀éoéM 🚀🚀ééoo ooooooo🚀 🚀o éé🚀 o🚀M MMoMoéo" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oo🚀🚀éé🚀oM🚀é🚀🚀éMM o🚀oMoMoéMMM 🚀o🚀 M🚀 🚀o🚀éo🚀o 🚀 MM🚀o o" + }, + { + "type": "string", + "value": "Moo é🚀🚀oéoMooooéMoo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀 oMM🚀oo🚀oooéoo ooé é🚀o🚀Méoo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6618497727a3e0a890" + }, + { + "type": "hexstring", + "value": "0x1e244d1834acf1937d" + }, + { + "type": "hexstring", + "value": "0xc0b059c9c26dd5b2a1" + }, + { + "type": "hexstring", + "value": "0x1fe55567386848cce8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xF9EDfD91f2E3302eA48bD0c6bEbFF5b0bB0B2a77" + }, + { + "type": "address", + "value": "0x6b3f4f46D3dd573f44585CdC5BbFa411FC78260A" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610c46806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610905565b60405180910390f35b6100566106ad565b61005e6106ad565b6100666106da565b61006e6106f2565b61007661072d565b6040805160208082019092527f76c4bdcb4fd1c75aabbc5ac6ad53d650fdf7b457bef229fbc0c5000000000000815282526001908201526100b561074e565b6001815260408281019190915273d724039ede2c586203762938737ae822b3825c2f6060830152908252634f5191d160e01b60208381019190915281518083018352600a8152689adede418753e13f3560b71b918101919091529082015261011b61076c565b6000808252604080518281526020810190915281610149565b60608152602001906001900390816101345790505b506020830152506101586107af565b68b595d342d7a9f75a6f60b81b8152681c5087f9da64bb3f7160b81b60208083019190915268211f26d6b73247fcaf60b91b604080840191909152680507b315ef15cf5d9960b81b606080850191909152848201939093528051808401825260008152733cf794e454ee2605c510392082537d27e8f474c29281019290925273679a8b72cc0912e276283bc2d2a21f39ba337ce49082015282820152820152600160808201528152815261020a6106da565b6102126106f2565b61021a61072d565b6040805160208082019092527f079222c9d34106605724add983ecf8c33598312ecb3efce197040000000000008152825260019082015261025961074e565b600080825260408381019290925273d8b545fb3aed8d5f7fccdb4e7806de727607f38e6060840152918352632061a03b60e01b602084810191909152815160808101909252604680835290610ad1908301396040830152506102b961076c565b60008082526040805160028082526060820190925290816020015b60608152602001906001900390816102d457905050905060006040518060800160405280604c8152602001610b8a604c91399050808260008151811061031c5761031c610a19565b60200260200101819052505060006040518060600160405280603b8152602001610bd6603b91399050808260018151811061035957610359610a19565b602002602001018190525050808260200181905250506103776107af565b683e79089c264603a4b960b81b815268aadf1e6522080e6b2760b81b6020808301919091526861717b67bafdaa5c8b60b91b604080840191909152687ae9d40b0f3ae8ce1360b81b60608085019190915284820193909352805180840182526000815273742920762919f76c5e92bb424c9c651eba09bffb81840152731b8f25d93bd2b6a441a1fb6d2aa96f8cc2c0fc999181019190915283830152908301919091526001608083015290825282015261042f6106da565b6104376106f2565b61043f61072d565b6040805160208082019092527f0af1946841d7f1eecaea8734f48956eb0d3fef715a2a528c0ca70000000000008152825260009082015261047e61074e565b600080825260408381019290925273289132918e66c936b66df052ffdd4d247b4e488d6060840152918352630fb69f6d60e41b602084810191909152815160a08101909252606480835290610a30908301396040830152506104de61076c565b60008082526040805160038082526080820190925290816020015b60608152602001906001900390816104f957905050905060006040518060a0016040528060738152602001610b17607391399050808260008151811061054157610541610a19565b60200260200101819052505060006040518060400160405280601c81526020017f4d6f6f20c3a9f09f9a80f09f9a806fc3a96f4d6f6f6f6fc3a94d6f6f000000008152509050808260018151811061059b5761059b610a19565b60200260200101819052505060006040518060600160405280603d8152602001610a94603d9139905080826002815181106105d8576105d8610a19565b602002602001018190525050808260200181905250506105f66107af565b6806618497727a3e0a8960bc1b8152681e244d1834acf1937d60b81b60208083019190915268c0b059c9c26dd5b2a160b81b6040808401919091526803fcaaace70d09199d60bb1b6060808501919091528482019390935280518084018252600180825273f9edfd91f2e3302ea48bd0c6bebff5b0bb0b2a7793820193909352736b3f4f46d3dd573f44585cdc5bbfa411fc78260a8183015284840152918401929092526080830191909152908252820152919050565b60405180606001604052806003905b6106c46106da565b8152602001906001900390816106bc5790505090565b60405180602001604052806106ed6106f2565b905290565b6040518060a0016040528061070561072d565b8152600060208201526060604082018190520161072061076c565b8152600060209091015290565b6040805160a081018252600060808201818152825260208201529081016107205b60405180602001604052806001906020820280368337509192915050565b60408051608081018252600081526060602082015290810161078c6107af565b815260408051606081018252600080825260208281018290529282015291015290565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b818110156107f3576020818501810151868301820152016107d7565b81811115610805576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60048110156108475781516001600160b81b03191684526020938401939091019060010161081e565b50505050565b805115158252602080820151610120828501819052815190850181905260009261014080870193600584901b88019091019290820190855b818110156108b45761013f198986030186526108a28584516107cd565b95840195945091830191600101610885565b50505050604084015191506108cc604086018361081a565b60608401518051151560c087015260208101516001600160a01b0390811660e08801526040820151166101008701529150949350505050565b602080825260009060808382018185018685805b6003811015610a0b57601f19808a8603018652835151888652805165ffffffffffff19815151168a880152898101516040811515818a01528083015191506060808a01885b600181101561097d57845115158252938e0193908e019060010161095e565b5050928301516001600160a01b03168b8a01528b8401516001600160e01b0319811660a08b01529281850151935061010092508260c08b01526109c46101208b01856107cd565b935080850151915050848984030160e08a01526109e1838261084d565b938b01518015158a8401529394506109f69050565b50505094870194935091860191600101610919565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a80f09f9a806fc3a9f09f9a80204df09f9a80c3a96fc3a94d20f09f9a80f09f9a80c3a9c3a96f6f20206f6f6f6f6f6f6ff09f9a8020f09f9a806f2020c3a9c3a9f09f9a80202020206ff09f9a804d204d4d6f4d6fc3a96f4d6f6f20c3a9f09f9a806ff09f9a8020206f4d4df09f9a806f6ff09f9a806f6f6fc3a96f6f20206f6fc3a92020c3a9f09f9a806ff09f9a804dc3a96f6f4d6f6f20c3a9f09f9a80206f4df09f9a80f09f9a804dc3a94d4d6ff09f9a804d204d6ff09f9a806f6ff09f9a806f6ff09f9a80c3a96f6ff09f9a80f09f9a804d6f6f6f20c3a94d6f6f20c3a9f09f9a80206f6ff09f9a80f09f9a80c3a9c3a9f09f9a806f4df09f9a80c3a9f09f9a80f09f9a80c3a94d4d206ff09f9a806f4d6f4d6fc3a94d4d4d20f09f9a806ff09f9a8020204df09f9a8020f09f9a806ff09f9a80c3a96ff09f9a806f20f09f9a80204d4df09f9a806f206f4d6f6f20c3a9f09f9a806f206f4d6f4dc3a96f4d6f4df09f9a806ff09f9a806f6f6f4d6f6f4d6ff09f9a80206f6f4d20f09f9a804d206f4d2020f09f9a804d4d6fc3a9f09f9a80c3a9c3a94d4d6f6f20c3a9f09f9a806f6f6fc3a94d6f2020c3a96fc3a96f6f20c3a9204dc3a96f6fc3a9206f204d6f6f6f206f204d206f4d6f6f6f20f09f9a80a2646970667358221220b5be95caa58bdcea526302991308c99dfd403f4adaf64ea29198bec61ef3afbe64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_da4d5856 {\n bytes26 s_0;\n }\n\n struct S_d25c3bab {\n S_da4d5856 s_0;\n bool s_1;\n bool[1] s_2;\n address s_3;\n }\n\n struct S_2f7d42be {\n bool s_0;\n address s_1;\n address s_2;\n }\n\n struct S_4506ab90 {\n bool s_0;\n string[] s_1;\n bytes9[4] s_2;\n S_2f7d42be s_3;\n }\n\n struct S_dc160b72 {\n S_d25c3bab s_0;\n bytes4 s_1;\n string s_2;\n S_4506ab90 s_3;\n bool s_4;\n }\n\n struct S_c0cbfe32 {\n S_dc160b72 s_0;\n }\n\n function test () public pure returns (S_c0cbfe32[3] memory) {\n S_c0cbfe32[3] memory r;\n {\n S_c0cbfe32 memory r_0;\n {\n S_dc160b72 memory r_0_0;\n {\n S_d25c3bab memory r_0_0_0;\n {\n S_da4d5856 memory r_0_0_0_0;\n {\n bytes26 r_0_0_0_0_0 = bytes26(0x76c4bdcb4fd1c75aabbc5ac6ad53d650fdf7b457bef229fbc0c5);\n r_0_0_0_0.s_0 = r_0_0_0_0_0;\n }\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n bool r_0_0_0_1 = true;\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n bool[1] memory r_0_0_0_2;\n {\n bool r_0_0_0_2_0 = true;\n r_0_0_0_2[0] = r_0_0_0_2_0;\n }\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n {\n address r_0_0_0_3 = 0xD724039edE2c586203762938737aE822b3825c2F;\n r_0_0_0.s_3 = r_0_0_0_3;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n bytes4 r_0_0_1 = bytes4(0x4f5191d1);\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀\";\n r_0_0.s_2 = r_0_0_2;\n }\n {\n S_4506ab90 memory r_0_0_3;\n {\n bool r_0_0_3_0 = false;\n r_0_0_3.s_0 = r_0_0_3_0;\n }\n {\n string[] memory r_0_0_3_1 = new string[](0);\n r_0_0_3.s_1 = r_0_0_3_1;\n }\n {\n bytes9[4] memory r_0_0_3_2;\n {\n bytes9 r_0_0_3_2_0 = bytes9(0xb595d342d7a9f75a6f);\n r_0_0_3_2[0] = r_0_0_3_2_0;\n }\n {\n bytes9 r_0_0_3_2_1 = bytes9(0x1c5087f9da64bb3f71);\n r_0_0_3_2[1] = r_0_0_3_2_1;\n }\n {\n bytes9 r_0_0_3_2_2 = bytes9(0x423e4dad6e648ff95e);\n r_0_0_3_2[2] = r_0_0_3_2_2;\n }\n {\n bytes9 r_0_0_3_2_3 = bytes9(0x0507b315ef15cf5d99);\n r_0_0_3_2[3] = r_0_0_3_2_3;\n }\n r_0_0_3.s_2 = r_0_0_3_2;\n }\n {\n S_2f7d42be memory r_0_0_3_3;\n {\n bool r_0_0_3_3_0 = false;\n r_0_0_3_3.s_0 = r_0_0_3_3_0;\n }\n {\n address r_0_0_3_3_1 = 0x3Cf794E454EE2605c510392082537D27e8f474c2;\n r_0_0_3_3.s_1 = r_0_0_3_3_1;\n }\n {\n address r_0_0_3_3_2 = 0x679A8B72CC0912E276283bc2d2a21f39Ba337CE4;\n r_0_0_3_3.s_2 = r_0_0_3_3_2;\n }\n r_0_0_3.s_3 = r_0_0_3_3;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n {\n bool r_0_0_4 = true;\n r_0_0.s_4 = r_0_0_4;\n }\n r_0.s_0 = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_c0cbfe32 memory r_1;\n {\n S_dc160b72 memory r_1_0;\n {\n S_d25c3bab memory r_1_0_0;\n {\n S_da4d5856 memory r_1_0_0_0;\n {\n bytes26 r_1_0_0_0_0 = bytes26(0x079222c9d34106605724add983ecf8c33598312ecb3efce19704);\n r_1_0_0_0.s_0 = r_1_0_0_0_0;\n }\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n bool r_1_0_0_1 = true;\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n bool[1] memory r_1_0_0_2;\n {\n bool r_1_0_0_2_0 = false;\n r_1_0_0_2[0] = r_1_0_0_2_0;\n }\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n {\n address r_1_0_0_3 = 0xd8b545fB3AEd8D5F7fCCDb4e7806DE727607F38e;\n r_1_0_0.s_3 = r_1_0_0_3;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes4 r_1_0_1 = bytes4(0x2061a03b);\n r_1_0.s_1 = r_1_0_1;\n }\n {\n string memory r_1_0_2 = unicode\"Moo é🚀 oM🚀🚀MéMMo🚀M Mo🚀oo🚀oo🚀éoo🚀🚀Mooo é\";\n r_1_0.s_2 = r_1_0_2;\n }\n {\n S_4506ab90 memory r_1_0_3;\n {\n bool r_1_0_3_0 = false;\n r_1_0_3.s_0 = r_1_0_3_0;\n }\n {\n string[] memory r_1_0_3_1 = new string[](2);\n {\n string memory r_1_0_3_1_0 = unicode\"Moo é🚀o oMoMéoMoM🚀o🚀oooMooMo🚀 ooM 🚀M oM 🚀MMoé🚀ééM\";\n r_1_0_3_1[0] = r_1_0_3_1_0;\n }\n {\n string memory r_1_0_3_1_1 = unicode\"Moo é🚀oooéMo éoéoo é Méooé o Mooo o M oMooo 🚀\";\n r_1_0_3_1[1] = r_1_0_3_1_1;\n }\n r_1_0_3.s_1 = r_1_0_3_1;\n }\n {\n bytes9[4] memory r_1_0_3_2;\n {\n bytes9 r_1_0_3_2_0 = bytes9(0x3e79089c264603a4b9);\n r_1_0_3_2[0] = r_1_0_3_2_0;\n }\n {\n bytes9 r_1_0_3_2_1 = bytes9(0xaadf1e6522080e6b27);\n r_1_0_3_2[1] = r_1_0_3_2_1;\n }\n {\n bytes9 r_1_0_3_2_2 = bytes9(0xc2e2f6cf75fb54b916);\n r_1_0_3_2[2] = r_1_0_3_2_2;\n }\n {\n bytes9 r_1_0_3_2_3 = bytes9(0x7ae9d40b0f3ae8ce13);\n r_1_0_3_2[3] = r_1_0_3_2_3;\n }\n r_1_0_3.s_2 = r_1_0_3_2;\n }\n {\n S_2f7d42be memory r_1_0_3_3;\n {\n bool r_1_0_3_3_0 = false;\n r_1_0_3_3.s_0 = r_1_0_3_3_0;\n }\n {\n address r_1_0_3_3_1 = 0x742920762919f76c5e92Bb424c9c651eba09bfFb;\n r_1_0_3_3.s_1 = r_1_0_3_3_1;\n }\n {\n address r_1_0_3_3_2 = 0x1B8f25d93bD2b6A441a1fB6D2aA96f8cC2C0fc99;\n r_1_0_3_3.s_2 = r_1_0_3_3_2;\n }\n r_1_0_3.s_3 = r_1_0_3_3;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n {\n bool r_1_0_4 = true;\n r_1_0.s_4 = r_1_0_4;\n }\n r_1.s_0 = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_c0cbfe32 memory r_2;\n {\n S_dc160b72 memory r_2_0;\n {\n S_d25c3bab memory r_2_0_0;\n {\n S_da4d5856 memory r_2_0_0_0;\n {\n bytes26 r_2_0_0_0_0 = bytes26(0x0af1946841d7f1eecaea8734f48956eb0d3fef715a2a528c0ca7);\n r_2_0_0_0.s_0 = r_2_0_0_0_0;\n }\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n bool r_2_0_0_1 = false;\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n bool[1] memory r_2_0_0_2;\n {\n bool r_2_0_0_2_0 = false;\n r_2_0_0_2[0] = r_2_0_0_2_0;\n }\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n {\n address r_2_0_0_3 = 0x289132918e66C936b66DF052ffDD4D247b4e488D;\n r_2_0_0.s_3 = r_2_0_0_3;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bytes4 r_2_0_1 = bytes4(0xfb69f6d0);\n r_2_0.s_1 = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀🚀🚀oé🚀 M🚀éoéM 🚀🚀ééoo ooooooo🚀 🚀o éé🚀 o🚀M MMoMoéo\";\n r_2_0.s_2 = r_2_0_2;\n }\n {\n S_4506ab90 memory r_2_0_3;\n {\n bool r_2_0_3_0 = false;\n r_2_0_3.s_0 = r_2_0_3_0;\n }\n {\n string[] memory r_2_0_3_1 = new string[](3);\n {\n string memory r_2_0_3_1_0 = unicode\"Moo é🚀 oo🚀🚀éé🚀oM🚀é🚀🚀éMM o🚀oMoMoéMMM 🚀o🚀 M🚀 🚀o🚀éo🚀o 🚀 MM🚀o o\";\n r_2_0_3_1[0] = r_2_0_3_1_0;\n }\n {\n string memory r_2_0_3_1_1 = unicode\"Moo é🚀🚀oéoMooooéMoo\";\n r_2_0_3_1[1] = r_2_0_3_1_1;\n }\n {\n string memory r_2_0_3_1_2 = unicode\"Moo é🚀o🚀 oMM🚀oo🚀oooéoo ooé é🚀o🚀Méoo\";\n r_2_0_3_1[2] = r_2_0_3_1_2;\n }\n r_2_0_3.s_1 = r_2_0_3_1;\n }\n {\n bytes9[4] memory r_2_0_3_2;\n {\n bytes9 r_2_0_3_2_0 = bytes9(0x6618497727a3e0a890);\n r_2_0_3_2[0] = r_2_0_3_2_0;\n }\n {\n bytes9 r_2_0_3_2_1 = bytes9(0x1e244d1834acf1937d);\n r_2_0_3_2[1] = r_2_0_3_2_1;\n }\n {\n bytes9 r_2_0_3_2_2 = bytes9(0xc0b059c9c26dd5b2a1);\n r_2_0_3_2[2] = r_2_0_3_2_2;\n }\n {\n bytes9 r_2_0_3_2_3 = bytes9(0x1fe55567386848cce8);\n r_2_0_3_2[3] = r_2_0_3_2_3;\n }\n r_2_0_3.s_2 = r_2_0_3_2;\n }\n {\n S_2f7d42be memory r_2_0_3_3;\n {\n bool r_2_0_3_3_0 = true;\n r_2_0_3_3.s_0 = r_2_0_3_3_0;\n }\n {\n address r_2_0_3_3_1 = 0xF9EDfD91f2E3302eA48bD0c6bEbFF5b0bB0B2a77;\n r_2_0_3_3.s_1 = r_2_0_3_3_1;\n }\n {\n address r_2_0_3_3_2 = 0x6b3f4f46D3dd573f44585CdC5BbFa411FC78260A;\n r_2_0_3_3.s_2 = r_2_0_3_3_2;\n }\n r_2_0_3.s_3 = r_2_0_3_3;\n }\n r_2_0.s_3 = r_2_0_3;\n }\n {\n bool r_2_0_4 = true;\n r_2_0.s_4 = r_2_0_4;\n }\n r_2.s_0 = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000002076c4bdcb4fd1c75aabbc5ac6ad53d650fdf7b457bef229fbc0c500000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d724039ede2c586203762938737ae822b3825c2f4f5191d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120b595d342d7a9f75a6f00000000000000000000000000000000000000000000001c5087f9da64bb3f710000000000000000000000000000000000000000000000423e4dad6e648ff95e00000000000000000000000000000000000000000000000507b315ef15cf5d99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf794e454ee2605c510392082537d27e8f474c2000000000000000000000000679a8b72cc0912e276283bc2d2a21f39ba337ce400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020079222c9d34106605724add983ecf8c33598312ecb3efce1970400000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8b545fb3aed8d5f7fccdb4e7806de727607f38e2061a03b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80206f4df09f9a80f09f9a804dc3a94d4d6ff09f9a804d204d6ff09f9a806f6ff09f9a806f6ff09f9a80c3a96f6ff09f9a80f09f9a804d6f6f6f20c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001203e79089c264603a4b90000000000000000000000000000000000000000000000aadf1e6522080e6b270000000000000000000000000000000000000000000000c2e2f6cf75fb54b91600000000000000000000000000000000000000000000007ae9d40b0f3ae8ce1300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000742920762919f76c5e92bb424c9c651eba09bffb0000000000000000000000001b8f25d93bd2b6a441a1fb6d2aa96f8cc2c0fc990000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806f206f4d6f4dc3a96f4d6f4df09f9a806ff09f9a806f6f6f4d6f6f4d6ff09f9a80206f6f4d20f09f9a804d206f4d2020f09f9a804d4d6fc3a9f09f9a80c3a9c3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a806f6f6fc3a94d6f2020c3a96fc3a96f6f20c3a9204dc3a96f6fc3a9206f204d6f6f6f206f204d206f4d6f6f6f20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000200af1946841d7f1eecaea8734f48956eb0d3fef715a2a528c0ca700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000289132918e66c936b66df052ffdd4d247b4e488dfb69f6d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a80f09f9a80f09f9a806fc3a9f09f9a80204df09f9a80c3a96fc3a94d20f09f9a80f09f9a80c3a9c3a96f6f20206f6f6f6f6f6f6ff09f9a8020f09f9a806f2020c3a9c3a9f09f9a80202020206ff09f9a804d204d4d6f4d6fc3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001206618497727a3e0a89000000000000000000000000000000000000000000000001e244d1834acf1937d0000000000000000000000000000000000000000000000c0b059c9c26dd5b2a100000000000000000000000000000000000000000000001fe55567386848cce800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f9edfd91f2e3302ea48bd0c6bebff5b0bb0b2a770000000000000000000000006b3f4f46d3dd573f44585cdc5bbfa411fc78260a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000734d6f6f20c3a9f09f9a80206f6ff09f9a80f09f9a80c3a9c3a9f09f9a806f4df09f9a80c3a9f09f9a80f09f9a80c3a94d4d206ff09f9a806f4d6f4d6fc3a94d4d4d20f09f9a806ff09f9a8020204df09f9a8020f09f9a806ff09f9a80c3a96ff09f9a806f20f09f9a80204d4df09f9a806f206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80f09f9a806fc3a96f4d6f6f6f6fc3a94d6f6f00000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806ff09f9a8020206f4d4df09f9a806f6ff09f9a806f6f6fc3a96f6f20206f6fc3a92020c3a9f09f9a806ff09f9a804dc3a96f6f000000" + }, + { + "name": "random-(((int168,uint160,address,string,uint200),address[3]),(uint48,(bytes8,bytes31[],(int224,int))[][]),int152,bytes22)", + "type": "(((int168,uint160,address,string,uint200),address[3]),(uint48,(bytes8,bytes31[],(int224,int))[][]),int152,bytes22)", + "value": [ + [ + [ + "62569139631898096881636259981194516235958816558672", + "61831295811805027381337393198917796559039815576", + "0x8004138e512FA39eDE0633c9Fe685B5B871Ff482", + "Moo é🚀", + "460171249213786923179064349165350025116288767688629306915649" + ], + [ + "0x0c7AA30F28f7502763Fc319F7a25B78B222a5b2c", + "0xe0c5268E5BaDA2Fc25d656951c18F4dfcCF1Da14", + "0xf184E9aA2cAb183edaF3CC552fdF72B24D91B7ba" + ] + ], + ["108887304616692", []], + "1155634070046581896319725415865499494392486041", + "0xddc9ebec9aed4f5f4eb9e89ef12f0fb0fc65ecdb21a1" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "62569139631898096881636259981194516235958816558672" + }, + { + "type": "number", + "value": "61831295811805027381337393198917796559039815576" + }, + { + "type": "address", + "value": "0x8004138e512FA39eDE0633c9Fe685B5B871Ff482" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "460171249213786923179064349165350025116288767688629306915649" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x0c7AA30F28f7502763Fc319F7a25B78B222a5b2c" + }, + { + "type": "address", + "value": "0xe0c5268E5BaDA2Fc25d656951c18F4dfcCF1Da14" + }, + { + "type": "address", + "value": "0xf184E9aA2cAb183edaF3CC552fdF72B24D91B7ba" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "108887304616692" + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "number", + "value": "1155634070046581896319725415865499494392486041" + }, + { + "type": "hexstring", + "value": "0xddc9ebec9aed4f5f4eb9e89ef12f0fb0fc65ecdb21a1" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610569806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061040f565b60405180910390f35b610056610202565b61005e610202565b610066610253565b6040805160a0810182526060808201908152600060808301908152742acfc141c8c48da66edf9df25a317acf8209734e508352730ad49c7753b609de6e343a182beb8d9ec99cdf98602080850191909152738004138e512fa39ede0633c9fe685b5b871ff482848601528451808601909552600a8552689adede418753e13f3560b71b9085015292905278494f3c037f66099c9b593e3a83200e4da25837ff1a09f1fb419091528152610117610295565b730c7aa30f28f7502763fc319f7a25b78b222a5b2c815273e0c5268e5bada2fc25d656951c18f4dfccf1da1460208083019190915273f184e9aa2cab183edaf3cc552fdf72b24d91b7ba60408084019190915283820192909252918352805180820182526060818401526563084d1cbaf48152815160008082529381019092529190816101b4565b606081526020019060019003908161019f5790505b50602080840191909152830191909152507233d2074d69ae4c2549ea3381ba12e711c75899604082015275ddc9ebec9aed4f5f4eb9e89ef12f0fb0fc65ecdb21a160501b6060820152919050565b6040518060800160405280610215610253565b815260200161023f6040518060400160405280600065ffffffffffff168152602001606081525090565b815260006020820181905260409091015290565b6040805160e081018252600091810182815260608083018490526080830184905260a083015260c082019290925290815260208101610290610295565b905290565b60405180606001604052806003906020820280368337509192915050565b8060005b60038110156102df5781516001600160a01b03168452602093840193909101906001016102b7565b50505050565b6000604080840165ffffffffffff8451168552602080850151838288015282815180855260608901915060059450606081861b8a0101848401935060005b82811015610401578a8203605f19018452845180518084529087019087840190808a1b8501890160005b828110156103e757868203601f19018452845180516001600160c01b03191683528b81015160808d8501819052815190850181905260a08501918e01906000905b808210156103b257825160ff19168452928f0192918f01916001919091019061038e565b5050508e82015191508151601b0b8f8501528c820151606085015280935050508a850194508a8401935060018101905061034d565b509789019796890196945050506001919091019050610323565b509998505050505050505050565b6000602080835283516080828501528051608060a08601526101c0815160140b6101208701528382015160018060a01b03808216610140890152806040850151166101608901525050606082015160a06101808801528051808389015260005b8181101561048c578281018701518982016101e00152860161046f565b8181111561049f5760006101e0838b0101525b506080939093015192601f01601f1916870190506104c96101a08801846001600160c81b03169052565b92840151926104db60c08801856102b3565b9387015186850382016040880152936104f86101e08201866102e5565b9450505050506040840151610512606085018260120b9052565b50606084015169ffffffffffffffffffff198116608085015250939250505056fea2646970667358221220c289653b998a573540d8771026ce8335e1e0aa3a64d77678784637c730e1383264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ccd0667f {\n int168 s_0;\n uint160 s_1;\n address s_2;\n string s_3;\n uint200 s_4;\n }\n\n struct S_cc7b58e8 {\n S_ccd0667f s_0;\n address[3] s_1;\n }\n\n struct S_e4fed101 {\n int224 s_0;\n int256 s_1;\n }\n\n struct S_2153b98c {\n bytes8 s_0;\n bytes31[] s_1;\n S_e4fed101 s_2;\n }\n\n struct S_4b07bf09 {\n uint48 s_0;\n S_2153b98c[][] s_1;\n }\n\n struct S_af870ba8 {\n S_cc7b58e8 s_0;\n S_4b07bf09 s_1;\n int152 s_2;\n bytes22 s_3;\n }\n\n function test () public pure returns (S_af870ba8 memory) {\n S_af870ba8 memory r;\n {\n S_cc7b58e8 memory r_0;\n {\n S_ccd0667f memory r_0_0;\n {\n int168 r_0_0_0 = 62569139631898096881636259981194516235958816558672;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n uint160 r_0_0_1 = 61831295811805027381337393198917796559039815576;\n r_0_0.s_1 = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x8004138e512FA39eDE0633c9Fe685B5B871Ff482;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n string memory r_0_0_3 = unicode\"Moo é🚀\";\n r_0_0.s_3 = r_0_0_3;\n }\n {\n uint200 r_0_0_4 = 460171249213786923179064349165350025116288767688629306915649;\n r_0_0.s_4 = r_0_0_4;\n }\n r_0.s_0 = r_0_0;\n }\n {\n address[3] memory r_0_1;\n {\n address r_0_1_0 = 0x0c7AA30F28f7502763Fc319F7a25B78B222a5b2c;\n r_0_1[0] = r_0_1_0;\n }\n {\n address r_0_1_1 = 0xe0c5268E5BaDA2Fc25d656951c18F4dfcCF1Da14;\n r_0_1[1] = r_0_1_1;\n }\n {\n address r_0_1_2 = 0xf184E9aA2cAb183edaF3CC552fdF72B24D91B7ba;\n r_0_1[2] = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n S_4b07bf09 memory r_1;\n {\n uint48 r_1_0 = 108887304616692;\n r_1.s_0 = r_1_0;\n }\n {\n S_2153b98c[][] memory r_1_1 = new S_2153b98c[][](0);\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n int152 r_2 = 1155634070046581896319725415865499494392486041;\n r.s_2 = r_2;\n }\n {\n bytes22 r_3 = bytes22(0xddc9ebec9aed4f5f4eb9e89ef12f0fb0fc65ecdb21a1);\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000033d2074d69ae4c2549ea3381ba12e711c75899ddc9ebec9aed4f5f4eb9e89ef12f0fb0fc65ecdb21a10000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000c7aa30f28f7502763fc319f7a25b78b222a5b2c000000000000000000000000e0c5268e5bada2fc25d656951c18f4dfccf1da14000000000000000000000000f184e9aa2cab183edaf3cc552fdf72b24d91b7ba00000000000000000000002acfc141c8c48da66edf9df25a317acf8209734e500000000000000000000000000ad49c7753b609de6e343a182beb8d9ec99cdf980000000000000000000000008004138e512fa39ede0633c9fe685b5b871ff48200000000000000000000000000000000000000000000000000000000000000a000000000000000494f3c037f66099c9b593e3a83200e4da25837ff1a09f1fb41000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063084d1cbaf400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((address,bytes15,((string[3],address,bool,address),string,address,string[],string),string),address,int24,bytes18,bytes5)", + "type": "((address,bytes15,((string[3],address,bool,address),string,address,string[],string),string),address,int24,bytes18,bytes5)", + "value": [ + [ + "0x7e6777Dc08c9d6bAce67e1d1447c82F8Ba8C112c", + "0xa813f3d6d01a2651f70fa7c32beaea", + [ + [ + [ + "Moo é🚀oM oo é o éo🚀Mé", + "Moo é🚀ééMooMMéMé éo ooo🚀Mo o🚀é 🚀éo éoo 🚀o 🚀 oééo ", + "Moo é🚀é🚀o🚀o🚀🚀 🚀oo🚀🚀é🚀éMo" + ], + "0x41b2aC869f2DD5C4EB5FCD11cB690898A988fa4c", + false, + "0xFB5e7Eb6b8DAe4c2F154a956575a63026e0657A5" + ], + "Moo é🚀Méo M🚀o🚀🚀🚀 oé oé Moé é🚀oooé🚀🚀oé🚀 oMéoéMM", + "0x4e3c92488Ada2deAa8128235F71BC7c37eDacbEd", + [], + "Moo é🚀é 🚀 oéoéé 🚀🚀 🚀Mo ééMoéo M oMoM é oo🚀M🚀🚀o 🚀" + ], + "Moo é🚀éoéoM🚀Méooéé oé🚀🚀éo🚀M Mé" + ], + "0x9FF872838F53a87EaBBF9142B2DBF0fa1a9862eC", + "5256104", + "0x8800ef0c3773dca95889497fc8705fb7e044", + "0x184166a96a" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x7e6777Dc08c9d6bAce67e1d1447c82F8Ba8C112c" + }, + { + "type": "hexstring", + "value": "0xa813f3d6d01a2651f70fa7c32beaea" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM oo é o éo🚀Mé" + }, + { + "type": "string", + "value": "Moo é🚀ééMooMMéMé éo ooo🚀Mo o🚀é 🚀éo éoo 🚀o 🚀 oééo " + }, + { + "type": "string", + "value": "Moo é🚀é🚀o🚀o🚀🚀 🚀oo🚀🚀é🚀éMo" + } + ] + }, + { + "type": "address", + "value": "0x41b2aC869f2DD5C4EB5FCD11cB690898A988fa4c" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xFB5e7Eb6b8DAe4c2F154a956575a63026e0657A5" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Méo M🚀o🚀🚀🚀 oé oé Moé é🚀oooé🚀🚀oé🚀 oMéoéMM" + }, + { + "type": "address", + "value": "0x4e3c92488Ada2deAa8128235F71BC7c37eDacbEd" + }, + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀é 🚀 oéoéé 🚀🚀 🚀Mo ééMoéo M oMoM é oo🚀M🚀🚀o 🚀" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éoéoM🚀Méooéé oé🚀🚀éo🚀M Mé" + } + ] + }, + { + "type": "address", + "value": "0x9FF872838F53a87EaBBF9142B2DBF0fa1a9862eC" + }, + { + "type": "number", + "value": "5256104" + }, + { + "type": "hexstring", + "value": "0x8800ef0c3773dca95889497fc8705fb7e044" + }, + { + "type": "hexstring", + "value": "0x184166a96a" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061079d806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610428565b60405180910390f35b61005661028f565b61005e61028f565b6100666102c4565b737e6777dc08c9d6bace67e1d1447c82f8ba8c112c81526e5409f9eb680d1328fb87d3e195f57560891b602082015261009d6102f0565b6100a561032e565b6100ad61035c565b604080518082018252601f81527f4d6f6f20c3a9f09f9a806f4d206f6f20c3a9206f20c3a96ff09f9a804dc3a900602080830191909152908352815160808101909252604e808352600092916106399083013990508082600160200201819052505060006040518060600160405280603781526020016106db60379139604080840191909152918352507341b2ac869f2dd5c4eb5fcd11cb690898a988fa4c602083810191909152600083830181905273fb5e7eb6b8dae4c2f154a956575a63026e0657a5606085015292845281516080810190925260548083529061068790830139602083015250734e3c92488ada2deaa8128235f71bc7c37edacbed60408201526000806040519080825280602002602001820160405280156101e657816020015b60608152602001906001900390816101d15790505b5060608301525060408051608081019091526056808252600091906107126020830139608083015250604080830191909152805160608101909152603680825260009190610603602083013960608084019190915291835250739ff872838f53a87eabbf9142b2dbf0fa1a9862ec6020830152625033a860408301527122003bc30ddcf72a5622525ff21c17edf81160721b90820152640c20b354b560d91b6080820152919050565b6040518060a001604052806102a26102c4565b8152600060208201819052604082018190526060820181905260809091015290565b60408051608081018252600080825260208201529081016102e36102f0565b8152602001606081525090565b6040518060a0016040528061030361032e565b81526020016060815260200160006001600160a01b0316815260200160608152602001606081525090565b604051806080016040528061034161035c565b81526000602082018190526040820181905260609091015290565b60405180606001604052806003905b606081526020019060019003908161036b5790505090565b6000815180845260005b818110156103a95760208185018101518683018201520161038d565b818111156103bb576000602083870101525b50601f01601f19169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b8481101561041b57601f19868403018952610409838351610383565b988401989250908301906001016103ed565b5090979650505050505050565b60006020808352835160a08285015260018060a01b038082511660c086015270ffffffffffffffffffffffffffffffffff19838301511660e086015260408201516080610100870152805160a06101408801526102608701815160806101e08a0152818290506102c08a01925060005b60038110156104c85761025f198b85030182526104b6848451610383565b93509188019190880190600101610498565b505050818601519390931661020088015260408101511515610220880152606001516001600160a01b03166102408701528084015161013f19878403810161016089015290926105188185610383565b93505060408201516105366101808901826001600160a01b03169052565b50606082015181888503016101a089015261055184826103d0565b9350506080820151915080878403016101c0880152506105718282610383565b9150506060820151915060bf19858203016101208601526105928183610383565b928601516001600160a01b03811660408701529291506105af9050565b604085015191506105c5606085018360020b9052565b60608501516dffffffffffffffffffffffffffff1981166080860152915060808501516001600160d81b0319811660a0860152915094935050505056fe4d6f6f20c3a9f09f9a80c3a96fc3a96f4df09f9a804dc3a96f6fc3a9c3a9206fc3a9f09f9a80f09f9a80c3a96ff09f9a804d204dc3a94d6f6f20c3a9f09f9a80c3a9c3a94d6f6f4d4dc3a94dc3a920c3a96f206f6f6ff09f9a804d6f206ff09f9a80c3a920f09f9a80c3a96f20c3a96f6f20f09f9a806f20f09f9a80206fc3a9c3a96f204d6f6f20c3a9f09f9a804dc3a96f204df09f9a806ff09f9a80f09f9a80f09f9a80206fc3a9206fc3a9204d6fc3a92020c3a9f09f9a806f6f6fc3a9f09f9a80f09f9a806fc3a9f09f9a80206f4dc3a96fc3a94d4d4d6f6f20c3a9f09f9a80c3a9f09f9a806ff09f9a806ff09f9a80f09f9a8020f09f9a806f6ff09f9a80f09f9a80c3a9f09f9a80c3a94d6f4d6f6f20c3a9f09f9a80c3a920f09f9a80206fc3a96fc3a9c3a920f09f9a80f09f9a802020f09f9a804d6f20c3a9c3a94d6fc3a96f204d206f4d6f4d20c3a920206f6ff09f9a804df09f9a80f09f9a806f20f09f9a80a26469706673582212209c552590617acde20b6fd1f9bf5e7a3f970ec062f7487375165e63e6e2b567d664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_963224a6 {\n string[3] s_0;\n address s_1;\n bool s_2;\n address s_3;\n }\n\n struct S_a10bb23b {\n S_963224a6 s_0;\n string s_1;\n address s_2;\n string[] s_3;\n string s_4;\n }\n\n struct S_1f60a6df {\n address s_0;\n bytes15 s_1;\n S_a10bb23b s_2;\n string s_3;\n }\n\n struct S_568d845c {\n S_1f60a6df s_0;\n address s_1;\n int24 s_2;\n bytes18 s_3;\n bytes5 s_4;\n }\n\n function test () public pure returns (S_568d845c memory) {\n S_568d845c memory r;\n {\n S_1f60a6df memory r_0;\n {\n address r_0_0 = 0x7e6777Dc08c9d6bAce67e1d1447c82F8Ba8C112c;\n r_0.s_0 = r_0_0;\n }\n {\n bytes15 r_0_1 = bytes15(0xa813f3d6d01a2651f70fa7c32beaea);\n r_0.s_1 = r_0_1;\n }\n {\n S_a10bb23b memory r_0_2;\n {\n S_963224a6 memory r_0_2_0;\n {\n string[3] memory r_0_2_0_0;\n {\n string memory r_0_2_0_0_0 = unicode\"Moo é🚀oM oo é o éo🚀Mé\";\n r_0_2_0_0[0] = r_0_2_0_0_0;\n }\n {\n string memory r_0_2_0_0_1 = unicode\"Moo é🚀ééMooMMéMé éo ooo🚀Mo o🚀é 🚀éo éoo 🚀o 🚀 oééo \";\n r_0_2_0_0[1] = r_0_2_0_0_1;\n }\n {\n string memory r_0_2_0_0_2 = unicode\"Moo é🚀é🚀o🚀o🚀🚀 🚀oo🚀🚀é🚀éMo\";\n r_0_2_0_0[2] = r_0_2_0_0_2;\n }\n r_0_2_0.s_0 = r_0_2_0_0;\n }\n {\n address r_0_2_0_1 = 0x41b2aC869f2DD5C4EB5FCD11cB690898A988fa4c;\n r_0_2_0.s_1 = r_0_2_0_1;\n }\n {\n bool r_0_2_0_2 = false;\n r_0_2_0.s_2 = r_0_2_0_2;\n }\n {\n address r_0_2_0_3 = 0xFB5e7Eb6b8DAe4c2F154a956575a63026e0657A5;\n r_0_2_0.s_3 = r_0_2_0_3;\n }\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀Méo M🚀o🚀🚀🚀 oé oé Moé é🚀oooé🚀🚀oé🚀 oMéoéMM\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n address r_0_2_2 = 0x4e3c92488Ada2deAa8128235F71BC7c37eDacbEd;\n r_0_2.s_2 = r_0_2_2;\n }\n {\n string[] memory r_0_2_3 = new string[](0);\n r_0_2.s_3 = r_0_2_3;\n }\n {\n string memory r_0_2_4 = unicode\"Moo é🚀é 🚀 oéoéé 🚀🚀 🚀Mo ééMoéo M oMoM é oo🚀M🚀🚀o 🚀\";\n r_0_2.s_4 = r_0_2_4;\n }\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀éoéoM🚀Méooéé oé🚀🚀éo🚀M Mé\";\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x9FF872838F53a87EaBBF9142B2DBF0fa1a9862eC;\n r.s_1 = r_1;\n }\n {\n int24 r_2 = 5256104;\n r.s_2 = r_2;\n }\n {\n bytes18 r_3 = bytes18(0x8800ef0c3773dca95889497fc8705fb7e044);\n r.s_3 = r_3;\n }\n {\n bytes5 r_4 = bytes5(0x184166a96a);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000009ff872838f53a87eabbf9142b2dbf0fa1a9862ec00000000000000000000000000000000000000000000000000000000005033a88800ef0c3773dca95889497fc8705fb7e0440000000000000000000000000000184166a96a0000000000000000000000000000000000000000000000000000000000000000000000000000007e6777dc08c9d6bace67e1d1447c82f8ba8c112ca813f3d6d01a2651f70fa7c32beaea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000004e3c92488ada2deaa8128235f71bc7c37edacbed00000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000008000000000000000000000000041b2ac869f2dd5c4eb5fcd11cb690898a988fa4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb5e7eb6b8dae4c2f154a956575a63026e0657a5000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a806f4d206f6f20c3a9206f20c3a96ff09f9a804dc3a900000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a80c3a9c3a94d6f6f4d4dc3a94dc3a920c3a96f206f6f6ff09f9a804d6f206ff09f9a80c3a920f09f9a80c3a96f20c3a96f6f20f09f9a806f20f09f9a80206fc3a9c3a96f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80c3a9f09f9a806ff09f9a806ff09f9a80f09f9a8020f09f9a806f6ff09f9a80f09f9a80c3a9f09f9a80c3a94d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a804dc3a96f204df09f9a806ff09f9a80f09f9a80f09f9a80206fc3a9206fc3a9204d6fc3a92020c3a9f09f9a806f6f6fc3a9f09f9a80f09f9a806fc3a9f09f9a80206f4dc3a96fc3a94d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a80c3a920f09f9a80206fc3a96fc3a9c3a920f09f9a80f09f9a802020f09f9a804d6f20c3a9c3a94d6fc3a96f204d206f4d6f4d20c3a920206f6ff09f9a804df09f9a80f09f9a806f20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80c3a96fc3a96f4df09f9a804dc3a96f6fc3a9c3a9206fc3a9f09f9a80f09f9a80c3a96ff09f9a804d204dc3a900000000000000000000" + }, + { + "name": "random-((address[3],(string,bytes19,(bool,(bytes9[2],address,(uint88,bool)),string,address)),address,bool),string,uint32[1])", + "type": "((address[3],(string,bytes19,(bool,(bytes9[2],address,(uint88,bool)),string,address)),address,bool),string,uint32[1])", + "value": [ + [ + [ + "0xAfb65F55C74C8C113530FC7C44ea8ac0D5abC73f", + "0x93adB40F732dbC094A4730010793298b214d2756", + "0x7C999F86D727aB2Ad8b9B1176B441De462B31914" + ], + [ + "Moo é🚀 M🚀oo🚀oo🚀ooooéMM 🚀Moo o oo ooMéMo", + "0xb100979c3047f02cc9bf79e733366f99d6f1d7", + [ + true, + [ + ["0xd4b801db5755b16b2d", "0xa288ba5c840d801012"], + "0xe2797850dD06692c5F3b68D0F5780A9F6FfA2447", + ["141859461037909040135630401", false] + ], + "Moo é🚀éoo o éM oééoo o é", + "0xfFdFfc5962d4e428C936156cbaD6a0A8f2DBecB0" + ] + ], + "0x13AD832B16C28c505EEC2813D6614643D82Fb0Fd", + true + ], + "Moo é🚀M oM🚀oo🚀🚀M 🚀éééé oé M🚀🚀o 🚀🚀o🚀MM🚀", + ["3603634331"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xAfb65F55C74C8C113530FC7C44ea8ac0D5abC73f" + }, + { + "type": "address", + "value": "0x93adB40F732dbC094A4730010793298b214d2756" + }, + { + "type": "address", + "value": "0x7C999F86D727aB2Ad8b9B1176B441De462B31914" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M🚀oo🚀oo🚀ooooéMM 🚀Moo o oo ooMéMo" + }, + { + "type": "hexstring", + "value": "0xb100979c3047f02cc9bf79e733366f99d6f1d7" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd4b801db5755b16b2d" + }, + { + "type": "hexstring", + "value": "0xa288ba5c840d801012" + } + ] + }, + { + "type": "address", + "value": "0xe2797850dD06692c5F3b68D0F5780A9F6FfA2447" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "141859461037909040135630401" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éoo o éM oééoo o é" + }, + { + "type": "address", + "value": "0xfFdFfc5962d4e428C936156cbaD6a0A8f2DBecB0" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x13AD832B16C28c505EEC2813D6614643D82Fb0Fd" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M oM🚀oo🚀🚀M 🚀éééé oé M🚀🚀o 🚀🚀o🚀MM🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3603634331" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061065e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103ec565b60405180910390f35b610056610233565b61005e610233565b61006661025f565b61006e610293565b73afb65f55c74c8c113530fc7c44ea8ac0d5abc73f81527393adb40f732dbc094a4730010793298b214d27566020820152737c999f86d727ab2ad8b9b1176b441de462b31914604082015281526100c36102b1565b60006040518060600160405280603a81526020016105ef603a913982525072b100979c3047f02cc9bf79e733366f99d6f1d760681b60208201526101056102cc565b600181526101116102fc565b610119610334565b68d4b801db5755b16b2d60b81b81526851445d2e4206c0080960b91b60208083019190915290825273e2797850dd06692c5f3b68d0f5780a9f6ffa24478282015260408051808201825260008184018190526a7557e8cad0a56a56036e41825282850191909152848301939093528051606081019091526023808252909161057f9083013960408084019190915273ffdffc5962d4e428c936156cbad6a0a8f2dbecb0606080850191909152848201939093526020858101949094527313ad832b16c28c505eec2813d6614643d82fb0fd8582015260019285019290925250918352815160808101909252604d808352600092916105a290830139602083015250610222610352565b63d6cb189b81526040820152919050565b604051806060016040528061024661025f565b81526020016060815260200161025a610352565b905290565b6040518060800160405280610272610293565b815260200161027f6102b1565b815260006020820181905260409091015290565b60405180606001604052806003906020820280368337509192915050565b604080516060808201835281526000602082015290810161025a5b60405180608001604052806000151581526020016102e86102fc565b815260606020820152600060409091015290565b604051806060016040528061030f610334565b8152600060208083018290526040805180820182528381529182019290925291015290565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156103965760208185018101518683018201520161037a565b818111156103a8576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60018110156103e657815163ffffffff168452602093840193909101906001016103c1565b50505050565b602080825282516060838301819052815160009392909184608087015b60038210156104315784516001600160a01b0316815293850193600191909101908501610409565b505083820151925060c060e08701528251816101408801526104576101a0880182610370565b848601516cffffffffffffffffffffffffff191661016089015260409485015188820361013f19016101808a015280511515825280870151805191969293506101009160008986015b60028210156104c95782516001600160b81b0319168152918a0191600191909101908a016104a0565b505050808801516001600160a01b03168486015282015180516affffffffffffffffffffff166080850152870151151560a08401528582015160c0840182905261051582850182610370565b968501516001600160a01b0390811660e08601528387015116828b015250848401518015156101208b0152968a0151601f198a8803018a840152969561055b8189610370565b975050508089015194505050610573818701846103bd565b50919594505050505056fe4d6f6f20c3a9f09f9a80c3a96f6f206f202020c3a94d206fc3a9c3a96f6f206f20c3a94d6f6f20c3a9f09f9a804d206f4df09f9a806f6ff09f9a80f09f9a804d20f09f9a80c3a9c3a9c3a9c3a9206fc3a9204df09f9a80f09f9a806f20f09f9a80f09f9a806ff09f9a804d4df09f9a804d6f6f20c3a9f09f9a80204df09f9a806f6ff09f9a806f6ff09f9a806f6f6f6fc3a94d4d20f09f9a804d6f6f206f206f6f20206f6f4dc3a94d6fa2646970667358221220c761c32ed67c4d713c32a0da2ed44fc54bae02088d6c84c9fd2418623ae2767064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5231a6bb {\n uint88 s_0;\n bool s_1;\n }\n\n struct S_a7444b9c {\n bytes9[2] s_0;\n address s_1;\n S_5231a6bb s_2;\n }\n\n struct S_027588eb {\n bool s_0;\n S_a7444b9c s_1;\n string s_2;\n address s_3;\n }\n\n struct S_c96d0cc7 {\n string s_0;\n bytes19 s_1;\n S_027588eb s_2;\n }\n\n struct S_e94f4112 {\n address[3] s_0;\n S_c96d0cc7 s_1;\n address s_2;\n bool s_3;\n }\n\n struct S_db4f221a {\n S_e94f4112 s_0;\n string s_1;\n uint32[1] s_2;\n }\n\n function test () public pure returns (S_db4f221a memory) {\n S_db4f221a memory r;\n {\n S_e94f4112 memory r_0;\n {\n address[3] memory r_0_0;\n {\n address r_0_0_0 = 0xAfb65F55C74C8C113530FC7C44ea8ac0D5abC73f;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0x93adB40F732dbC094A4730010793298b214d2756;\n r_0_0[1] = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x7C999F86D727aB2Ad8b9B1176B441De462B31914;\n r_0_0[2] = r_0_0_2;\n }\n r_0.s_0 = r_0_0;\n }\n {\n S_c96d0cc7 memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀 M🚀oo🚀oo🚀ooooéMM 🚀Moo o oo ooMéMo\";\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bytes19 r_0_1_1 = bytes19(0xb100979c3047f02cc9bf79e733366f99d6f1d7);\n r_0_1.s_1 = r_0_1_1;\n }\n {\n S_027588eb memory r_0_1_2;\n {\n bool r_0_1_2_0 = true;\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n S_a7444b9c memory r_0_1_2_1;\n {\n bytes9[2] memory r_0_1_2_1_0;\n {\n bytes9 r_0_1_2_1_0_0 = bytes9(0xd4b801db5755b16b2d);\n r_0_1_2_1_0[0] = r_0_1_2_1_0_0;\n }\n {\n bytes9 r_0_1_2_1_0_1 = bytes9(0xa288ba5c840d801012);\n r_0_1_2_1_0[1] = r_0_1_2_1_0_1;\n }\n r_0_1_2_1.s_0 = r_0_1_2_1_0;\n }\n {\n address r_0_1_2_1_1 = 0xe2797850dD06692c5F3b68D0F5780A9F6FfA2447;\n r_0_1_2_1.s_1 = r_0_1_2_1_1;\n }\n {\n S_5231a6bb memory r_0_1_2_1_2;\n {\n uint88 r_0_1_2_1_2_0 = 141859461037909040135630401;\n r_0_1_2_1_2.s_0 = r_0_1_2_1_2_0;\n }\n {\n bool r_0_1_2_1_2_1 = false;\n r_0_1_2_1_2.s_1 = r_0_1_2_1_2_1;\n }\n r_0_1_2_1.s_2 = r_0_1_2_1_2;\n }\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n string memory r_0_1_2_2 = unicode\"Moo é🚀éoo o éM oééoo o é\";\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n {\n address r_0_1_2_3 = 0xfFdFfc5962d4e428C936156cbaD6a0A8f2DBecB0;\n r_0_1_2.s_3 = r_0_1_2_3;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x13AD832B16C28c505EEC2813D6614643D82Fb0Fd;\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀M oM🚀oo🚀🚀M 🚀éééé oé M🚀🚀o 🚀🚀o🚀MM🚀\";\n r.s_1 = r_1;\n }\n {\n uint32[1] memory r_2;\n {\n uint32 r_2_0 = 3603634331;\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000d6cb189b000000000000000000000000afb65f55c74c8c113530fc7c44ea8ac0d5abc73f00000000000000000000000093adb40f732dbc094a4730010793298b214d27560000000000000000000000007c999f86d727ab2ad8b9b1176b441de462b3191400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000013ad832b16c28c505eec2813d6614643d82fb0fd00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060b100979c3047f02cc9bf79e733366f99d6f1d70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a80204df09f9a806f6ff09f9a806f6ff09f9a806f6f6f6fc3a94d4d20f09f9a804d6f6f206f206f6f20206f6f4dc3a94d6f0000000000000000000000000000000000000000000000000000000000000000000000000001d4b801db5755b16b2d0000000000000000000000000000000000000000000000a288ba5c840d8010120000000000000000000000000000000000000000000000000000000000000000000000e2797850dd06692c5f3b68d0f5780a9f6ffa24470000000000000000000000000000000000000000007557e8cad0a56a56036e4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000ffdffc5962d4e428c936156cbad6a0a8f2dbecb000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80c3a96f6f206f202020c3a94d206fc3a9c3a96f6f206f20c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a804d206f4df09f9a806f6ff09f9a80f09f9a804d20f09f9a80c3a9c3a9c3a9c3a9206fc3a9204df09f9a80f09f9a806f20f09f9a80f09f9a806ff09f9a804d4df09f9a8000000000000000000000000000000000000000" + }, + { + "name": "random-((bool,int,(bool,string,string),bool[4],string),(uint232)[],(int72[],address,string,string[3],bool))", + "type": "((bool,int,(bool,string,string),bool[4],string),(uint232)[],(int72[],address,string,string[3],bool))", + "value": [ + [ + true, + "-54399778222038694183140980469431808390807330939282783147505491971111470614640", + [false, "Moo é🚀o🚀🚀oé", "Moo é🚀oéé 🚀"], + [true, false, true, true], + "Moo é🚀" + ], + [["3123898811166440292454144232166577922871499420688975498658830073235283"]], + [ + ["1154091736794279393838"], + "0x5209f95Daf972fc9DED2762B52Cb3bb2032dC772", + "Moo é🚀🚀o éM🚀éo 🚀oo 🚀 🚀MoM🚀MoM", + [ + "Moo é🚀éoM éoMéMo Mé 🚀oéM🚀éoMéo 🚀éM Mo🚀", + "Moo é🚀éooMoé🚀 M🚀éMMéMéoé🚀MooMé Mo", + "Moo é🚀MMMéoo oo" + ], + false + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-54399778222038694183140980469431808390807330939282783147505491971111470614640" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀oé" + }, + { + "type": "string", + "value": "Moo é🚀oéé 🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3123898811166440292454144232166577922871499420688975498658830073235283" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1154091736794279393838" + } + ] + }, + { + "type": "address", + "value": "0x5209f95Daf972fc9DED2762B52Cb3bb2032dC772" + }, + { + "type": "string", + "value": "Moo é🚀🚀o éM🚀éo 🚀oo 🚀 🚀MoM🚀MoM" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoM éoMéMo Mé 🚀oéM🚀éoMéo 🚀éM Mo🚀" + }, + { + "type": "string", + "value": "Moo é🚀éooMoé🚀 M🚀éMMéMéoé🚀MooMé Mo" + }, + { + "type": "string", + "value": "Moo é🚀MMMéoo oo" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506107ad806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105c9565b60405180910390f35b610056610316565b61005e610316565b610066610342565b600181527f87bad1103a52b3033efb58f442b4eaa6a5727cca6402fe4756c2b469abe637906020808301919091526040805160608082018352600082528184018181528284019182528351808501855260168152754d6f6f20c3a9f09f9a806ff09f9a80f09f9a806fc3a960501b8187015290528251808401845260148152729adede418753e13f3500df8753875241e13f3560671b948101949094529290925282015261011261039d565b6001808252600060208084018290526040808501849052606080860185905286019490945283518085018552600a8152689adede418753e13f3560b71b81830152608086015293855282518281528084019093529282015b60408051602081019091526000815281526020019060019003908161016a57505060408051602081019091527c73df315ad68dd30b5ddd6894df97bc7bb99afa056f20ae32394e7c87538152815191925090819083906000906101cf576101cf6106b8565b602002602001018190525050808260200181905250506101ed6103bb565b604080516001808252818301909252600091602080830190803683370190505090506000683e903d7ff96ca33a2e90508082600081518110610231576102316106b8565b60089290920b60209283029190910182015291835250735209f95daf972fc9ded2762b52cb3bb2032dc7728282015260408051606081019091526036808252600092610742908301396040830152506102886103f9565b60006040518060600160405280603e81526020016106cf603e9139825250604080516060810190915260358082526000919061070d602083013960208381019190915260408051808201825260148152734d6f6f20c3a9f09f9a804d4d4dc3a96f6f206f6f60601b928101929092528084019190915260608401929092525060006080830152820152919050565b6040518060600160405280610329610342565b81526020016060815260200161033d6103bb565b905290565b6040518060a0016040528060001515815260200160008152602001610383604051806060016040528060001515815260200160608152602001606081525090565b815260200161039061039d565b8152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b6040518060a001604052806060815260200160006001600160a01b03168152602001606081526020016103ec6103f9565b8152600060209091015290565b60405180606001604052806003905b60608152602001906001900390816104085790505090565b6000815180845260005b818110156104465760208185018101518683018201520161042a565b81811115610458576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60048110156104925781511515845260209384019390910190600101610471565b50505050565b600081518084526020808501945080840160005b838110156104d2578151516001600160e81b0316875295820195908201906001016104ac565b509495945050505050565b600082606081018360005b6003811015610517578383038752610501838351610420565b60209788019790935091909101906001016104e8565b509095945050505050565b805160a080845281519084018190526000916020919082019060c0860190845b8181101561056157835160080b83529284019291840191600101610542565b5050848301516001600160a01b0381168785015291506040850151925085810360408701526105908184610420565b92505050606083015184820360608601526105ab82826104dd565b91505060808301516105c1608086018215159052565b509392505050565b602081526000825160606020840152805115156080840152602081015160a0840152604081015161010060c085015280511515610180850152602081015160606101a086015261061d6101e0860182610420565b90506040820151915061017f19858203016101c086015261063e8183610420565b915050606082015161065360e086018261046d565b5060808201519150607f19848203016101608501526106728183610420565b9150506020840151601f19808584030160408601526106918383610498565b92506040860151915080858403016060860152506106af8282610522565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a96f4d20c3a96f4dc3a94d6f204dc3a920f09f9a806fc3a94df09f9a80c3a96f4dc3a96f20f09f9a80c3a94d204d6ff09f9a804d6f6f20c3a9f09f9a80c3a96f6f4d6fc3a9f09f9a80204df09f9a80c3a94d4dc3a94dc3a96fc3a9f09f9a804d6f6f4dc3a9204d6f4d6f6f20c3a9f09f9a80f09f9a806f20c3a94df09f9a80c3a96f20f09f9a806f6f2020f09f9a8020f09f9a804d6f4df09f9a804d6f4da26469706673582212200266c597f1d2da11ab1af8bc4bf17cb0b384ffa0f28c81ada7d6dd4fe34318b064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_21333ac5 {\n bool s_0;\n string s_1;\n string s_2;\n }\n\n struct S_1eaa98ab {\n bool s_0;\n int256 s_1;\n S_21333ac5 s_2;\n bool[4] s_3;\n string s_4;\n }\n\n struct S_d617b071 {\n uint232 s_0;\n }\n\n struct S_1b3d34b2 {\n int72[] s_0;\n address s_1;\n string s_2;\n string[3] s_3;\n bool s_4;\n }\n\n struct S_5dee3792 {\n S_1eaa98ab s_0;\n S_d617b071[] s_1;\n S_1b3d34b2 s_2;\n }\n\n function test () public pure returns (S_5dee3792 memory) {\n S_5dee3792 memory r;\n {\n S_1eaa98ab memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n int r_0_1 = -54399778222038694183140980469431808390807330939282783147505491971111470614640;\n r_0.s_1 = r_0_1;\n }\n {\n S_21333ac5 memory r_0_2;\n {\n bool r_0_2_0 = false;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string memory r_0_2_1 = unicode\"Moo é🚀o🚀🚀oé\";\n r_0_2.s_1 = r_0_2_1;\n }\n {\n string memory r_0_2_2 = unicode\"Moo é🚀oéé 🚀\";\n r_0_2.s_2 = r_0_2_2;\n }\n r_0.s_2 = r_0_2;\n }\n {\n bool[4] memory r_0_3;\n {\n bool r_0_3_0 = true;\n r_0_3[0] = r_0_3_0;\n }\n {\n bool r_0_3_1 = false;\n r_0_3[1] = r_0_3_1;\n }\n {\n bool r_0_3_2 = true;\n r_0_3[2] = r_0_3_2;\n }\n {\n bool r_0_3_3 = true;\n r_0_3[3] = r_0_3_3;\n }\n r_0.s_3 = r_0_3;\n }\n {\n string memory r_0_4 = unicode\"Moo é🚀\";\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n S_d617b071[] memory r_1 = new S_d617b071[](1);\n {\n S_d617b071 memory r_1_0;\n {\n uint232 r_1_0_0 = 3123898811166440292454144232166577922871499420688975498658830073235283;\n r_1_0.s_0 = r_1_0_0;\n }\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n S_1b3d34b2 memory r_2;\n {\n int72[] memory r_2_0 = new int72[](1);\n {\n int72 r_2_0_0 = 1154091736794279393838;\n r_2_0[0] = r_2_0_0;\n }\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x5209f95Daf972fc9DED2762B52Cb3bb2032dC772;\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀🚀o éM🚀éo 🚀oo 🚀 🚀MoM🚀MoM\";\n r_2.s_2 = r_2_2;\n }\n {\n string[3] memory r_2_3;\n {\n string memory r_2_3_0 = unicode\"Moo é🚀éoM éoMéMo Mé 🚀oéM🚀éoMéo 🚀éM Mo🚀\";\n r_2_3[0] = r_2_3_0;\n }\n {\n string memory r_2_3_1 = unicode\"Moo é🚀éooMoé🚀 M🚀éMMéMéoé🚀MooMé Mo\";\n r_2_3[1] = r_2_3_1;\n }\n {\n string memory r_2_3_2 = unicode\"Moo é🚀MMMéoo oo\";\n r_2_3[2] = r_2_3_2;\n }\n r_2.s_3 = r_2_3;\n }\n {\n bool r_2_4 = false;\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000187bad1103a52b3033efb58f442b4eaa6a5727cca6402fe4756c2b469abe637900000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806ff09f9a80f09f9a806fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806fc3a9c3a920f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000073df315ad68dd30b5ddd6894df97bc7bb99afa056f20ae32394e7c875300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000005209f95daf972fc9ded2762b52cb3bb2032dc77200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000003e903d7ff96ca33a2e00000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a80f09f9a806f20c3a94df09f9a80c3a96f20f09f9a806f6f2020f09f9a8020f09f9a804d6f4df09f9a804d6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80c3a96f4d20c3a96f4dc3a94d6f204dc3a920f09f9a806fc3a94df09f9a80c3a96f4dc3a96f20f09f9a80c3a94d204d6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a80c3a96f6f4d6fc3a9f09f9a80204df09f9a80c3a94d4dc3a94dc3a96fc3a9f09f9a804d6f6f4dc3a9204d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a804d4d4dc3a96f6f206f6f000000000000000000000000" + }, + { + "name": "random-(address,bool,((((int192,address,bytes24[2][1][2]),(address)),int72)[4],bool,address,address,string),(address),bool)", + "type": "(address,bool,((((int192,address,bytes24[2][1][2]),(address)),int72)[4],bool,address,address,string),(address),bool)", + "value": [ + "0xFD7ab00CA7078cFa1100A0225eBfB1886d2B07A7", + true, + [ + [ + [ + [ + [ + "-1653326182153686178333117331197120426262934019458579409599", + "0xB4516A85E4f06a10B87EfA925F7030f312c0Af7a", + [ + [ + [ + "0xc45a0bde748bef6e4c4a01696daa5998b306af882c1fd2c2", + "0x66f7685af0f65caff78a773d2e6c1732c8ee2cb530ad7a77" + ] + ], + [ + [ + "0x82b3894bc4bbf162818cc748b452b93a2a586fe5ff35a899", + "0x52cf070aeab82755dd77f5d982809fd53c2877b9329bddd7" + ] + ] + ] + ], + ["0xF69AF804c83378D7055aeA5C1b132145181D071e"] + ], + "2289019808589871087278" + ], + [ + [ + [ + "729269888266242878959581948868578225014473867990478202083", + "0xC2e8FFec40211DB6A45dC3246316Dd85607B9FbF", + [ + [ + [ + "0x043170d7a1256dd452523c31c5e47fd21e361d19a0a59bff", + "0x4683c472cb4f98574910744a2e09cd9f765ace2a50568cc2" + ] + ], + [ + [ + "0x2fe88292b5c3e64a270d06bea7d153b926d21e6971378a66", + "0x5ec52e709691abc0d730215396b25946848cdb21afc8a89e" + ] + ] + ] + ], + ["0x9045870Bd14161b4E48BA02802Df1f2095314D97"] + ], + "1310854226926574290493" + ], + [ + [ + [ + "-2224774792172874454821033980760415550697583432894874600627", + "0x08f4743DB9a99F11140d00e6402E16d71740B735", + [ + [ + [ + "0x379a51e76631bd9256fbc23f7cfd1d4e4be9dfe0afe882f6", + "0x6a0a3dc321e5f028052a713fcab8da26fd11d4a02f2d50e4" + ] + ], + [ + [ + "0x24af5d88b7a75c6118507de924cdcd9210f9d4918fc44d44", + "0xbd3feb7760944e93b18fe1abc1cb7308d7f09e6a42a0603d" + ] + ] + ] + ], + ["0xe19Fb79452E99Dad314A060BF9Cf5A23D430DD59"] + ], + "1796091489060553007655" + ], + [ + [ + [ + "-877108660701897373797550523867062951038263538988443755777", + "0xE2d7128b2252eB3A5AB932D10FF3dfef2EE21893", + [ + [ + [ + "0xbc4913d510f0b7c7f5da23de672e5f9f89dfdb9729d8e2dd", + "0x4d8431b5aac57062cf6b6bc2de50662aa7092da1046f8889" + ] + ], + [ + [ + "0x734210bb20eee090582ff93663c40e09b35a1441710b3860", + "0x23f32273f10461e28df70e9ccfb8d6b1ba4e3c6d3c9cd99d" + ] + ] + ] + ], + ["0x03256F6EC30884bD43edd2314B88Eb19482D0731"] + ], + "455491076321424883538" + ] + ], + true, + "0xB1e426B51B44FC3f6604BD17176F4f71Ff64987D", + "0x06817D870E27010396C7040Fef438d22DEEB2097", + "Moo é🚀 oM o🚀ooo oM🚀oéééMoééM" + ], + ["0x4AaFb05Bf4FbA7Af320485f8C23ed6660a9296AB"], + true + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xFD7ab00CA7078cFa1100A0225eBfB1886d2B07A7" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1653326182153686178333117331197120426262934019458579409599" + }, + { + "type": "address", + "value": "0xB4516A85E4f06a10B87EfA925F7030f312c0Af7a" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc45a0bde748bef6e4c4a01696daa5998b306af882c1fd2c2" + }, + { + "type": "hexstring", + "value": "0x66f7685af0f65caff78a773d2e6c1732c8ee2cb530ad7a77" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x82b3894bc4bbf162818cc748b452b93a2a586fe5ff35a899" + }, + { + "type": "hexstring", + "value": "0x52cf070aeab82755dd77f5d982809fd53c2877b9329bddd7" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF69AF804c83378D7055aeA5C1b132145181D071e" + } + ] + } + ] + }, + { + "type": "number", + "value": "2289019808589871087278" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "729269888266242878959581948868578225014473867990478202083" + }, + { + "type": "address", + "value": "0xC2e8FFec40211DB6A45dC3246316Dd85607B9FbF" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x043170d7a1256dd452523c31c5e47fd21e361d19a0a59bff" + }, + { + "type": "hexstring", + "value": "0x4683c472cb4f98574910744a2e09cd9f765ace2a50568cc2" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2fe88292b5c3e64a270d06bea7d153b926d21e6971378a66" + }, + { + "type": "hexstring", + "value": "0x5ec52e709691abc0d730215396b25946848cdb21afc8a89e" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9045870Bd14161b4E48BA02802Df1f2095314D97" + } + ] + } + ] + }, + { + "type": "number", + "value": "1310854226926574290493" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-2224774792172874454821033980760415550697583432894874600627" + }, + { + "type": "address", + "value": "0x08f4743DB9a99F11140d00e6402E16d71740B735" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x379a51e76631bd9256fbc23f7cfd1d4e4be9dfe0afe882f6" + }, + { + "type": "hexstring", + "value": "0x6a0a3dc321e5f028052a713fcab8da26fd11d4a02f2d50e4" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x24af5d88b7a75c6118507de924cdcd9210f9d4918fc44d44" + }, + { + "type": "hexstring", + "value": "0xbd3feb7760944e93b18fe1abc1cb7308d7f09e6a42a0603d" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xe19Fb79452E99Dad314A060BF9Cf5A23D430DD59" + } + ] + } + ] + }, + { + "type": "number", + "value": "1796091489060553007655" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-877108660701897373797550523867062951038263538988443755777" + }, + { + "type": "address", + "value": "0xE2d7128b2252eB3A5AB932D10FF3dfef2EE21893" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbc4913d510f0b7c7f5da23de672e5f9f89dfdb9729d8e2dd" + }, + { + "type": "hexstring", + "value": "0x4d8431b5aac57062cf6b6bc2de50662aa7092da1046f8889" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x734210bb20eee090582ff93663c40e09b35a1441710b3860" + }, + { + "type": "hexstring", + "value": "0x23f32273f10461e28df70e9ccfb8d6b1ba4e3c6d3c9cd99d" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x03256F6EC30884bD43edd2314B88Eb19482D0731" + } + ] + } + ] + }, + { + "type": "number", + "value": "455491076321424883538" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xB1e426B51B44FC3f6604BD17176F4f71Ff64987D" + }, + { + "type": "address", + "value": "0x06817D870E27010396C7040Fef438d22DEEB2097" + }, + { + "type": "string", + "value": "Moo é🚀 oM o🚀ooo oM🚀oéééMoééM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4AaFb05Bf4FbA7Af320485f8C23ed6660a9296AB" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610a64806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610866565b60405180910390f35b61005661069b565b61005e61069b565b73fd7ab00ca7078cfa1100a0225ebfb1886d2b07a78152600160208201526100846106e1565b61008c610718565b610094610745565b61009c610754565b6100a4610786565b77436d87dfb9ff24a1373a0d3f57aaacc5ccca11664085aabe19815273b4516a85e4f06a10b87efa925f7030f312c0af7a60208201526100e26107a1565b6100ea6107ce565b6100f26107fb565b7fc45a0bde748bef6e4c4a01696daa5998b306af882c1fd2c2000000000000000081527f66f7685af0f65caff78a773d2e6c1732c8ee2cb530ad7a7700000000000000006020820152815281526101476107ce565b61014f6107fb565b7f82b3894bc4bbf162818cc748b452b93a2a586fe5ff35a899000000000000000081527f52cf070aeab82755dd77f5d982809fd53c2877b9329bddd7000000000000000060208083019190915290825282810191909152604083810192909252918352805180830190915273f69af804c83378d7055aea5c1b132145181d071e815282820152908252687c1687fc2a6fe87eae9082015281526101f0610745565b6101f8610754565b610200610786565b771dbdeed24d3a2581827045aa736f0bd6a11cb1482ef9a4e3815273c2e8ffec40211db6a45dc3246316dd85607b9fbf602082015261023d6107a1565b6102456107ce565b61024d6107fb565b7f043170d7a1256dd452523c31c5e47fd21e361d19a0a59bff000000000000000081527f4683c472cb4f98574910744a2e09cd9f765ace2a50568cc200000000000000006020820152815281526102a26107ce565b6102aa6107fb565b7f2fe88292b5c3e64a270d06bea7d153b926d21e6971378a66000000000000000081527f5ec52e709691abc0d730215396b25946848cdb21afc8a89e0000000000000000602080830191909152908252828101919091526040838101929092529183528051808301909152739045870bd14161b4e48ba02802df1f2095314d9781528282015290825268470fc1be2fb5c0c63d8282015282015261034c610745565b610354610754565b61035c610786565b775abbbb8d6b8d37855f545bba7cb73a9378e863bf3b4b44b21981527308f4743db9a99f11140d00e6402e16d71740b735602082015261039a6107a1565b6103a26107ce565b6103aa6107fb565b7f379a51e76631bd9256fbc23f7cfd1d4e4be9dfe0afe882f6000000000000000081527f6a0a3dc321e5f028052a713fcab8da26fd11d4a02f2d50e400000000000000006020820152815281526103ff6107ce565b6104076107fb565b7f24af5d88b7a75c6118507de924cdcd9210f9d4918fc44d44000000000000000081527fbd3feb7760944e93b18fe1abc1cb7308d7f09e6a42a0603d0000000000000000602080830191909152908252828101919091526040838101929092529183528051808301825273e19fb79452e99dad314a060bf9cf5a23d430dd5981528383015291835268615dc6cd3334a8a227908301528201526104a8610745565b6104b0610754565b6104b8610786565b7723c5711342f21b2e0356e8d04432de69e2ccc638a1dfe50019815273e2d7128b2252eb3a5ab932d10ff3dfef2ee2189360208201526104f66107a1565b6104fe6107ce565b6105066107fb565b7fbc4913d510f0b7c7f5da23de672e5f9f89dfdb9729d8e2dd000000000000000081527f4d8431b5aac57062cf6b6bc2de50662aa7092da1046f8889000000000000000060208201528152815261055b6107ce565b6105636107fb565b7f734210bb20eee090582ff93663c40e09b35a1441710b3860000000000000000081527f23f32273f10461e28df70e9ccfb8d6b1ba4e3c6d3c9cd99d000000000000000060208083019190915290825282810191909152604083810192909252918352805180830182527303256f6ec30884bd43edd2314b88eb19482d07318152838301529183526818b135609e82debf528382015260608481019390935292845260018484015273b1e426b51b44fc3f6604bd17176f4f71ff64987d848201527306817d870e27010396c7040fef438d22deeb20978483015280519182019052602b808252600092610a0490830139608083015250604082015261067360408051602081019091526000815290565b734aafb05bf4fba7af320485f8c23ed6660a9296ab8152606082015260016080820152919050565b6040805160a081018252600080825260208201529081016106ba6106e1565b81526020016106d460408051602081019091526000815290565b8152600060209091015290565b6040518060a001604052806106f4610718565b81526000602082018190526040820181905260608083019190915260809091015290565b60405180608001604052806004905b61072f610745565b8152602001906001900390816107275790505090565b60405180604001604052806106d45b6040518060400160405280610767610786565b815260200161078160408051602081019091526000815290565b905290565b60408051606081018252600080825260208201529081016107815b60405180604001604052806002905b6107b86107ce565b8152602001906001900390816107b05790505090565b60405180602001604052806001905b6107e56107fb565b8152602001906001900390816107dd5790505090565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561083f57602081850181015186830182015201610823565b81811115610851576000602083870101525b50601f01601f19169290920160200192915050565b60208152600060018060a01b038084511660208401526020840151801515604085015250604084015160a06060850152805160c0850160005b600481101561098157825180518051805160170b8552876020820151166020860152604081015190506040850160005b60028110156109495782518260005b60018110156109305782518260005b600281101561091757825167ffffffffffffffff19168252602092830192909101906001016108ed565b50505060209290920191604091909101906001016108de565b50505060209290920191604091909101906001016108cf565b505050602090810151516001600160a01b031660c08501529081015160080b60e084015292909201916101009091019060010161089f565b505050602081015115156104c085015260408101516001600160a01b039081166104e08601526060820151166105008501526080015161048061052085015290506109d0610540840182610819565b905060608401516109ed6080850182516001600160a01b03169052565b50608084015180151560a085015250939250505056fe4d6f6f20c3a9f09f9a80206f4d206ff09f9a806f6f6f206f4df09f9a806fc3a9c3a9c3a94d6fc3a9c3a94da2646970667358221220aab81e7d200cb5a2839da2b894e62d82efaeb358836a84b9c217c26773498b2964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b2b4cc84 {\n int192 s_0;\n address s_1;\n bytes24[2][1][2] s_2;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_beff7ad7 {\n S_b2b4cc84 s_0;\n S_421683f8 s_1;\n }\n\n struct S_ac16e46e {\n S_beff7ad7 s_0;\n int72 s_1;\n }\n\n struct S_55c057f3 {\n S_ac16e46e[4] s_0;\n bool s_1;\n address s_2;\n address s_3;\n string s_4;\n }\n\n struct S_d666820b {\n address s_0;\n bool s_1;\n S_55c057f3 s_2;\n S_421683f8 s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_d666820b memory) {\n S_d666820b memory r;\n {\n address r_0 = 0xFD7ab00CA7078cFa1100A0225eBfB1886d2B07A7;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n S_55c057f3 memory r_2;\n {\n S_ac16e46e[4] memory r_2_0;\n {\n S_ac16e46e memory r_2_0_0;\n {\n S_beff7ad7 memory r_2_0_0_0;\n {\n S_b2b4cc84 memory r_2_0_0_0_0;\n {\n int192 r_2_0_0_0_0_0 = -1653326182153686178333117331197120426262934019458579409599;\n r_2_0_0_0_0.s_0 = r_2_0_0_0_0_0;\n }\n {\n address r_2_0_0_0_0_1 = 0xB4516A85E4f06a10B87EfA925F7030f312c0Af7a;\n r_2_0_0_0_0.s_1 = r_2_0_0_0_0_1;\n }\n {\n bytes24[2][1][2] memory r_2_0_0_0_0_2;\n {\n bytes24[2][1] memory r_2_0_0_0_0_2_0;\n {\n bytes24[2] memory r_2_0_0_0_0_2_0_0;\n {\n bytes24 r_2_0_0_0_0_2_0_0_0 = bytes24(0xc45a0bde748bef6e4c4a01696daa5998b306af882c1fd2c2);\n r_2_0_0_0_0_2_0_0[0] = r_2_0_0_0_0_2_0_0_0;\n }\n {\n bytes24 r_2_0_0_0_0_2_0_0_1 = bytes24(0x66f7685af0f65caff78a773d2e6c1732c8ee2cb530ad7a77);\n r_2_0_0_0_0_2_0_0[1] = r_2_0_0_0_0_2_0_0_1;\n }\n r_2_0_0_0_0_2_0[0] = r_2_0_0_0_0_2_0_0;\n }\n r_2_0_0_0_0_2[0] = r_2_0_0_0_0_2_0;\n }\n {\n bytes24[2][1] memory r_2_0_0_0_0_2_1;\n {\n bytes24[2] memory r_2_0_0_0_0_2_1_0;\n {\n bytes24 r_2_0_0_0_0_2_1_0_0 = bytes24(0x82b3894bc4bbf162818cc748b452b93a2a586fe5ff35a899);\n r_2_0_0_0_0_2_1_0[0] = r_2_0_0_0_0_2_1_0_0;\n }\n {\n bytes24 r_2_0_0_0_0_2_1_0_1 = bytes24(0x52cf070aeab82755dd77f5d982809fd53c2877b9329bddd7);\n r_2_0_0_0_0_2_1_0[1] = r_2_0_0_0_0_2_1_0_1;\n }\n r_2_0_0_0_0_2_1[0] = r_2_0_0_0_0_2_1_0;\n }\n r_2_0_0_0_0_2[1] = r_2_0_0_0_0_2_1;\n }\n r_2_0_0_0_0.s_2 = r_2_0_0_0_0_2;\n }\n r_2_0_0_0.s_0 = r_2_0_0_0_0;\n }\n {\n S_421683f8 memory r_2_0_0_0_1;\n {\n address r_2_0_0_0_1_0 = 0xF69AF804c83378D7055aeA5C1b132145181D071e;\n r_2_0_0_0_1.s_0 = r_2_0_0_0_1_0;\n }\n r_2_0_0_0.s_1 = r_2_0_0_0_1;\n }\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n int72 r_2_0_0_1 = 2289019808589871087278;\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n S_ac16e46e memory r_2_0_1;\n {\n S_beff7ad7 memory r_2_0_1_0;\n {\n S_b2b4cc84 memory r_2_0_1_0_0;\n {\n int192 r_2_0_1_0_0_0 = 729269888266242878959581948868578225014473867990478202083;\n r_2_0_1_0_0.s_0 = r_2_0_1_0_0_0;\n }\n {\n address r_2_0_1_0_0_1 = 0xC2e8FFec40211DB6A45dC3246316Dd85607B9FbF;\n r_2_0_1_0_0.s_1 = r_2_0_1_0_0_1;\n }\n {\n bytes24[2][1][2] memory r_2_0_1_0_0_2;\n {\n bytes24[2][1] memory r_2_0_1_0_0_2_0;\n {\n bytes24[2] memory r_2_0_1_0_0_2_0_0;\n {\n bytes24 r_2_0_1_0_0_2_0_0_0 = bytes24(0x043170d7a1256dd452523c31c5e47fd21e361d19a0a59bff);\n r_2_0_1_0_0_2_0_0[0] = r_2_0_1_0_0_2_0_0_0;\n }\n {\n bytes24 r_2_0_1_0_0_2_0_0_1 = bytes24(0x4683c472cb4f98574910744a2e09cd9f765ace2a50568cc2);\n r_2_0_1_0_0_2_0_0[1] = r_2_0_1_0_0_2_0_0_1;\n }\n r_2_0_1_0_0_2_0[0] = r_2_0_1_0_0_2_0_0;\n }\n r_2_0_1_0_0_2[0] = r_2_0_1_0_0_2_0;\n }\n {\n bytes24[2][1] memory r_2_0_1_0_0_2_1;\n {\n bytes24[2] memory r_2_0_1_0_0_2_1_0;\n {\n bytes24 r_2_0_1_0_0_2_1_0_0 = bytes24(0x2fe88292b5c3e64a270d06bea7d153b926d21e6971378a66);\n r_2_0_1_0_0_2_1_0[0] = r_2_0_1_0_0_2_1_0_0;\n }\n {\n bytes24 r_2_0_1_0_0_2_1_0_1 = bytes24(0x5ec52e709691abc0d730215396b25946848cdb21afc8a89e);\n r_2_0_1_0_0_2_1_0[1] = r_2_0_1_0_0_2_1_0_1;\n }\n r_2_0_1_0_0_2_1[0] = r_2_0_1_0_0_2_1_0;\n }\n r_2_0_1_0_0_2[1] = r_2_0_1_0_0_2_1;\n }\n r_2_0_1_0_0.s_2 = r_2_0_1_0_0_2;\n }\n r_2_0_1_0.s_0 = r_2_0_1_0_0;\n }\n {\n S_421683f8 memory r_2_0_1_0_1;\n {\n address r_2_0_1_0_1_0 = 0x9045870Bd14161b4E48BA02802Df1f2095314D97;\n r_2_0_1_0_1.s_0 = r_2_0_1_0_1_0;\n }\n r_2_0_1_0.s_1 = r_2_0_1_0_1;\n }\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n {\n int72 r_2_0_1_1 = 1310854226926574290493;\n r_2_0_1.s_1 = r_2_0_1_1;\n }\n r_2_0[1] = r_2_0_1;\n }\n {\n S_ac16e46e memory r_2_0_2;\n {\n S_beff7ad7 memory r_2_0_2_0;\n {\n S_b2b4cc84 memory r_2_0_2_0_0;\n {\n int192 r_2_0_2_0_0_0 = -2224774792172874454821033980760415550697583432894874600627;\n r_2_0_2_0_0.s_0 = r_2_0_2_0_0_0;\n }\n {\n address r_2_0_2_0_0_1 = 0x08f4743DB9a99F11140d00e6402E16d71740B735;\n r_2_0_2_0_0.s_1 = r_2_0_2_0_0_1;\n }\n {\n bytes24[2][1][2] memory r_2_0_2_0_0_2;\n {\n bytes24[2][1] memory r_2_0_2_0_0_2_0;\n {\n bytes24[2] memory r_2_0_2_0_0_2_0_0;\n {\n bytes24 r_2_0_2_0_0_2_0_0_0 = bytes24(0x379a51e76631bd9256fbc23f7cfd1d4e4be9dfe0afe882f6);\n r_2_0_2_0_0_2_0_0[0] = r_2_0_2_0_0_2_0_0_0;\n }\n {\n bytes24 r_2_0_2_0_0_2_0_0_1 = bytes24(0x6a0a3dc321e5f028052a713fcab8da26fd11d4a02f2d50e4);\n r_2_0_2_0_0_2_0_0[1] = r_2_0_2_0_0_2_0_0_1;\n }\n r_2_0_2_0_0_2_0[0] = r_2_0_2_0_0_2_0_0;\n }\n r_2_0_2_0_0_2[0] = r_2_0_2_0_0_2_0;\n }\n {\n bytes24[2][1] memory r_2_0_2_0_0_2_1;\n {\n bytes24[2] memory r_2_0_2_0_0_2_1_0;\n {\n bytes24 r_2_0_2_0_0_2_1_0_0 = bytes24(0x24af5d88b7a75c6118507de924cdcd9210f9d4918fc44d44);\n r_2_0_2_0_0_2_1_0[0] = r_2_0_2_0_0_2_1_0_0;\n }\n {\n bytes24 r_2_0_2_0_0_2_1_0_1 = bytes24(0xbd3feb7760944e93b18fe1abc1cb7308d7f09e6a42a0603d);\n r_2_0_2_0_0_2_1_0[1] = r_2_0_2_0_0_2_1_0_1;\n }\n r_2_0_2_0_0_2_1[0] = r_2_0_2_0_0_2_1_0;\n }\n r_2_0_2_0_0_2[1] = r_2_0_2_0_0_2_1;\n }\n r_2_0_2_0_0.s_2 = r_2_0_2_0_0_2;\n }\n r_2_0_2_0.s_0 = r_2_0_2_0_0;\n }\n {\n S_421683f8 memory r_2_0_2_0_1;\n {\n address r_2_0_2_0_1_0 = 0xe19Fb79452E99Dad314A060BF9Cf5A23D430DD59;\n r_2_0_2_0_1.s_0 = r_2_0_2_0_1_0;\n }\n r_2_0_2_0.s_1 = r_2_0_2_0_1;\n }\n r_2_0_2.s_0 = r_2_0_2_0;\n }\n {\n int72 r_2_0_2_1 = 1796091489060553007655;\n r_2_0_2.s_1 = r_2_0_2_1;\n }\n r_2_0[2] = r_2_0_2;\n }\n {\n S_ac16e46e memory r_2_0_3;\n {\n S_beff7ad7 memory r_2_0_3_0;\n {\n S_b2b4cc84 memory r_2_0_3_0_0;\n {\n int192 r_2_0_3_0_0_0 = -877108660701897373797550523867062951038263538988443755777;\n r_2_0_3_0_0.s_0 = r_2_0_3_0_0_0;\n }\n {\n address r_2_0_3_0_0_1 = 0xE2d7128b2252eB3A5AB932D10FF3dfef2EE21893;\n r_2_0_3_0_0.s_1 = r_2_0_3_0_0_1;\n }\n {\n bytes24[2][1][2] memory r_2_0_3_0_0_2;\n {\n bytes24[2][1] memory r_2_0_3_0_0_2_0;\n {\n bytes24[2] memory r_2_0_3_0_0_2_0_0;\n {\n bytes24 r_2_0_3_0_0_2_0_0_0 = bytes24(0xbc4913d510f0b7c7f5da23de672e5f9f89dfdb9729d8e2dd);\n r_2_0_3_0_0_2_0_0[0] = r_2_0_3_0_0_2_0_0_0;\n }\n {\n bytes24 r_2_0_3_0_0_2_0_0_1 = bytes24(0x4d8431b5aac57062cf6b6bc2de50662aa7092da1046f8889);\n r_2_0_3_0_0_2_0_0[1] = r_2_0_3_0_0_2_0_0_1;\n }\n r_2_0_3_0_0_2_0[0] = r_2_0_3_0_0_2_0_0;\n }\n r_2_0_3_0_0_2[0] = r_2_0_3_0_0_2_0;\n }\n {\n bytes24[2][1] memory r_2_0_3_0_0_2_1;\n {\n bytes24[2] memory r_2_0_3_0_0_2_1_0;\n {\n bytes24 r_2_0_3_0_0_2_1_0_0 = bytes24(0x734210bb20eee090582ff93663c40e09b35a1441710b3860);\n r_2_0_3_0_0_2_1_0[0] = r_2_0_3_0_0_2_1_0_0;\n }\n {\n bytes24 r_2_0_3_0_0_2_1_0_1 = bytes24(0x23f32273f10461e28df70e9ccfb8d6b1ba4e3c6d3c9cd99d);\n r_2_0_3_0_0_2_1_0[1] = r_2_0_3_0_0_2_1_0_1;\n }\n r_2_0_3_0_0_2_1[0] = r_2_0_3_0_0_2_1_0;\n }\n r_2_0_3_0_0_2[1] = r_2_0_3_0_0_2_1;\n }\n r_2_0_3_0_0.s_2 = r_2_0_3_0_0_2;\n }\n r_2_0_3_0.s_0 = r_2_0_3_0_0;\n }\n {\n S_421683f8 memory r_2_0_3_0_1;\n {\n address r_2_0_3_0_1_0 = 0x03256F6EC30884bD43edd2314B88Eb19482D0731;\n r_2_0_3_0_1.s_0 = r_2_0_3_0_1_0;\n }\n r_2_0_3_0.s_1 = r_2_0_3_0_1;\n }\n r_2_0_3.s_0 = r_2_0_3_0;\n }\n {\n int72 r_2_0_3_1 = 455491076321424883538;\n r_2_0_3.s_1 = r_2_0_3_1;\n }\n r_2_0[3] = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool r_2_1 = true;\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0xB1e426B51B44FC3f6604BD17176F4f71Ff64987D;\n r_2.s_2 = r_2_2;\n }\n {\n address r_2_3 = 0x06817D870E27010396C7040Fef438d22DEEB2097;\n r_2.s_3 = r_2_3;\n }\n {\n string memory r_2_4 = unicode\"Moo é🚀 oM o🚀ooo oM🚀oéééMoééM\";\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n S_421683f8 memory r_3;\n {\n address r_3_0 = 0x4AaFb05Bf4FbA7Af320485f8C23ed6660a9296AB;\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n {\n bool r_4 = true;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000fd7ab00ca7078cfa1100a0225ebfb1886d2b07a7000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000004aafb05bf4fba7af320485f8c23ed6660a9296ab0000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffbc9278204600db5ec8c5f2c0a855533a3335ee99bf7a5541000000000000000000000000b4516a85e4f06a10b87efa925f7030f312c0af7ac45a0bde748bef6e4c4a01696daa5998b306af882c1fd2c2000000000000000066f7685af0f65caff78a773d2e6c1732c8ee2cb530ad7a77000000000000000082b3894bc4bbf162818cc748b452b93a2a586fe5ff35a899000000000000000052cf070aeab82755dd77f5d982809fd53c2877b9329bddd70000000000000000000000000000000000000000f69af804c83378d7055aea5c1b132145181d071e00000000000000000000000000000000000000000000007c1687fc2a6fe87eae00000000000000001dbdeed24d3a2581827045aa736f0bd6a11cb1482ef9a4e3000000000000000000000000c2e8ffec40211db6a45dc3246316dd85607b9fbf043170d7a1256dd452523c31c5e47fd21e361d19a0a59bff00000000000000004683c472cb4f98574910744a2e09cd9f765ace2a50568cc200000000000000002fe88292b5c3e64a270d06bea7d153b926d21e6971378a6600000000000000005ec52e709691abc0d730215396b25946848cdb21afc8a89e00000000000000000000000000000000000000009045870bd14161b4e48ba02802df1f2095314d970000000000000000000000000000000000000000000000470fc1be2fb5c0c63dffffffffffffffffa54444729472c87aa0aba4458348c56c87179c40c4b4bb4d00000000000000000000000008f4743db9a99f11140d00e6402e16d71740b735379a51e76631bd9256fbc23f7cfd1d4e4be9dfe0afe882f600000000000000006a0a3dc321e5f028052a713fcab8da26fd11d4a02f2d50e4000000000000000024af5d88b7a75c6118507de924cdcd9210f9d4918fc44d440000000000000000bd3feb7760944e93b18fe1abc1cb7308d7f09e6a42a0603d0000000000000000000000000000000000000000e19fb79452e99dad314a060bf9cf5a23d430dd590000000000000000000000000000000000000000000000615dc6cd3334a8a227ffffffffffffffffdc3a8eecbd0de4d1fca9172fbbcd21961d3339c75e201aff000000000000000000000000e2d7128b2252eb3a5ab932d10ff3dfef2ee21893bc4913d510f0b7c7f5da23de672e5f9f89dfdb9729d8e2dd00000000000000004d8431b5aac57062cf6b6bc2de50662aa7092da1046f88890000000000000000734210bb20eee090582ff93663c40e09b35a1441710b3860000000000000000023f32273f10461e28df70e9ccfb8d6b1ba4e3c6d3c9cd99d000000000000000000000000000000000000000003256f6ec30884bd43edd2314b88eb19482d0731000000000000000000000000000000000000000000000018b135609e82debf520000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b1e426b51b44fc3f6604bd17176f4f71ff64987d00000000000000000000000006817d870e27010396c7040fef438d22deeb20970000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a80206f4d206ff09f9a806f6f6f206f4df09f9a806fc3a9c3a9c3a94d6fc3a9c3a94d000000000000000000000000000000000000000000" + }, + { + "name": "random-(address[4],address,bytes32,address,(uint152,int240[4],bytes23,uint16,(bytes13[1],bytes25[1],address)[1])[1])", + "type": "(address[4],address,bytes32,address,(uint152,int240[4],bytes23,uint16,(bytes13[1],bytes25[1],address)[1])[1])", + "value": [ + [ + "0x111f49399Fb8512Df1312Ae80f80Bf95662774b7", + "0xFf6B37E3387ECff107D3218748dE91D85FaE5AEa", + "0x839bc0EB8241c0Ea732D2a44bdb2517C016A1A93", + "0xeC24e32CeEE2155FCD9065C3b6E9F35Ce176e0F3" + ], + "0xD82c6954EA9Be17129Be0D1C8D5A56D4884aE7cb", + "0x52dcf6eaffc5c1a4f0fbe004ab7134f75bc4505e314398b8ef3c54bfe4df83ca", + "0x0A92033A336e0eae27AF58e72234e82914fbA5F6", + [ + [ + "3469027454968466405983297571281400750976290047", + [ + "-610278884543666526574401058253431345207323422716226652219626071411430455", + "239990749043344641667386646536957086055534660644395940145892653567865879", + "88767191719091573165037898821377228098152873188315466629215211727464768", + "-463802395071770939269398138072493291080548296074361498474328901581243217" + ], + "0xaa5093a832988c8e2d95f637a46e888b5ede9d90ad13ae", + "23499", + [ + [ + ["0xa7e27b77cb8d8f683b1b58c20b"], + ["0xb9d759a5e1cce9e7c5567c9ce6b1859ae2ed36b79df33553de"], + "0x03DA56B80a99d6e55c969F66E7902Abb800B2396" + ] + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x111f49399Fb8512Df1312Ae80f80Bf95662774b7" + }, + { + "type": "address", + "value": "0xFf6B37E3387ECff107D3218748dE91D85FaE5AEa" + }, + { + "type": "address", + "value": "0x839bc0EB8241c0Ea732D2a44bdb2517C016A1A93" + }, + { + "type": "address", + "value": "0xeC24e32CeEE2155FCD9065C3b6E9F35Ce176e0F3" + } + ] + }, + { + "type": "address", + "value": "0xD82c6954EA9Be17129Be0D1C8D5A56D4884aE7cb" + }, + { + "type": "hexstring", + "value": "0x52dcf6eaffc5c1a4f0fbe004ab7134f75bc4505e314398b8ef3c54bfe4df83ca" + }, + { + "type": "address", + "value": "0x0A92033A336e0eae27AF58e72234e82914fbA5F6" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3469027454968466405983297571281400750976290047" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-610278884543666526574401058253431345207323422716226652219626071411430455" + }, + { + "type": "number", + "value": "239990749043344641667386646536957086055534660644395940145892653567865879" + }, + { + "type": "number", + "value": "88767191719091573165037898821377228098152873188315466629215211727464768" + }, + { + "type": "number", + "value": "-463802395071770939269398138072493291080548296074361498474328901581243217" + } + ] + }, + { + "type": "hexstring", + "value": "0xaa5093a832988c8e2d95f637a46e888b5ede9d90ad13ae" + }, + { + "type": "number", + "value": "23499" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa7e27b77cb8d8f683b1b58c20b" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb9d759a5e1cce9e7c5567c9ce6b1859ae2ed36b79df33553de" + } + ] + }, + { + "type": "address", + "value": "0x03DA56B80a99d6e55c969F66E7902Abb800B2396" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061060e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610554565b60405180910390f35b6100566102c2565b61005e6102c2565b6100666102fc565b73111f49399fb8512df1312ae80f80bf95662774b7815273ff6b37e3387ecff107d3218748de91d85fae5aea60208083019190915273839bc0eb8241c0ea732d2a44bdb2517c016a1a9360408084019190915273ec24e32ceee2155fcd9065c3b6e9f35ce176e0f360608085019190915292845273d82c6954ea9be17129be0d1c8d5a56d4884ae7cb918401919091527f52dcf6eaffc5c1a4f0fbe004ab7134f75bc4505e314398b8ef3c54bfe4df83ca90830152730a92033a336e0eae27af58e72234e82914fba5f69082015261013c61031a565b610144610347565b729b8e7b70be8572d240fef62e65baac5c244cff81526101626102fc565b7fffffa7937f820cdee9052d3c066d739b45a12ac64fb74a4f0f68164a162b6bc981527d22c5c06a783510d997fd34599b2e2b21e72410dd66a6e1183108375074176020808301919091527d0cdc8ee1f012d6af7284d1dfcd7d30d44f665fb3bab2c3473d45c531a9406040808401919091527fffffbccc9cefdbfa607bc60778b29ae7d079ea8ca85790f053a65f8030647caf606080850191909152918401929092527faa5093a832988c8e2d95f637a46e888b5ede9d90ad13ae00000000000000000091830191909152615bcb9082015261023d610381565b6102456103ae565b61024d6103db565b6ca7e27b77cb8d8f683b1b58c20b60981b8152815261026a6103db565b7fb9d759a5e1cce9e7c5567c9ce6b1859ae2ed36b79df33553de00000000000000815260208201527303da56b80a99d6e55c969f66e7902abb800b239660408201528152608082810191909152908252820152919050565b6040518060a001604052806102d56102fc565b81526000602082018190526040820181905260608201526080016102f761031a565b905290565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001905b610331610347565b8152602001906001900390816103295790505090565b6040518060a0016040528060006001600160981b0316815260200161036a6102fc565b815260006020820181905260408201526060016102f75b60405180602001604052806001905b6103986103ae565b8152602001906001900390816103905790505090565b60405180606001604052806103c16103db565b81526020016103ce6103db565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b8060005b600180821061040c57506104a8565b825180518660005b8481101561044757825172ffffffffffffffffffffffffffffffffffffff19168252602092830192909101908401610414565b50505060208082015181880160005b8581101561047b57825166ffffffffffffff1916825291830191908301908501610456565b5050506040918201516001600160a01b0316918701919091526060909501949290920191506001016103fd565b50505050565b806000805b60018082106104c2575061054d565b83516001600160981b038151168752602080820151818901865b60048110156104fb578251601d0b8252918301919083019085016104dc565b505050604082015168ffffffffffffffffff191660a0890152606082015161ffff1660c08901526080820151925061053660e08901846103f9565b6101409790970196949094019350506001016104b3565b5050505050565b81516102208201908260005b60048110156105885782516001600160a01b0316825260209283019290910190600101610560565b50505060208301516001600160a01b038116608084015250604083015160a083015260608301516001600160a01b03811660c08401525060808301516105d160e08401826104ae565b509291505056fea26469706673582212207d4f24536371abc0ff0a48f6e1ebef71822dd2419c939ffac7b416d00a19160b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_53479498 {\n bytes13[1] s_0;\n bytes25[1] s_1;\n address s_2;\n }\n\n struct S_23f8ac80 {\n uint152 s_0;\n int240[4] s_1;\n bytes23 s_2;\n uint16 s_3;\n S_53479498[1] s_4;\n }\n\n struct S_6c15860a {\n address[4] s_0;\n address s_1;\n bytes32 s_2;\n address s_3;\n S_23f8ac80[1] s_4;\n }\n\n function test () public pure returns (S_6c15860a memory) {\n S_6c15860a memory r;\n {\n address[4] memory r_0;\n {\n address r_0_0 = 0x111f49399Fb8512Df1312Ae80f80Bf95662774b7;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0xFf6B37E3387ECff107D3218748dE91D85FaE5AEa;\n r_0[1] = r_0_1;\n }\n {\n address r_0_2 = 0x839bc0EB8241c0Ea732D2a44bdb2517C016A1A93;\n r_0[2] = r_0_2;\n }\n {\n address r_0_3 = 0xeC24e32CeEE2155FCD9065C3b6E9F35Ce176e0F3;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xD82c6954EA9Be17129Be0D1C8D5A56D4884aE7cb;\n r.s_1 = r_1;\n }\n {\n bytes32 r_2 = bytes32(0x52dcf6eaffc5c1a4f0fbe004ab7134f75bc4505e314398b8ef3c54bfe4df83ca);\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x0A92033A336e0eae27AF58e72234e82914fbA5F6;\n r.s_3 = r_3;\n }\n {\n S_23f8ac80[1] memory r_4;\n {\n S_23f8ac80 memory r_4_0;\n {\n uint152 r_4_0_0 = 3469027454968466405983297571281400750976290047;\n r_4_0.s_0 = r_4_0_0;\n }\n {\n int240[4] memory r_4_0_1;\n {\n int240 r_4_0_1_0 = -610278884543666526574401058253431345207323422716226652219626071411430455;\n r_4_0_1[0] = r_4_0_1_0;\n }\n {\n int240 r_4_0_1_1 = 239990749043344641667386646536957086055534660644395940145892653567865879;\n r_4_0_1[1] = r_4_0_1_1;\n }\n {\n int240 r_4_0_1_2 = 88767191719091573165037898821377228098152873188315466629215211727464768;\n r_4_0_1[2] = r_4_0_1_2;\n }\n {\n int240 r_4_0_1_3 = -463802395071770939269398138072493291080548296074361498474328901581243217;\n r_4_0_1[3] = r_4_0_1_3;\n }\n r_4_0.s_1 = r_4_0_1;\n }\n {\n bytes23 r_4_0_2 = bytes23(0xaa5093a832988c8e2d95f637a46e888b5ede9d90ad13ae);\n r_4_0.s_2 = r_4_0_2;\n }\n {\n uint16 r_4_0_3 = 23499;\n r_4_0.s_3 = r_4_0_3;\n }\n {\n S_53479498[1] memory r_4_0_4;\n {\n S_53479498 memory r_4_0_4_0;\n {\n bytes13[1] memory r_4_0_4_0_0;\n {\n bytes13 r_4_0_4_0_0_0 = bytes13(0xa7e27b77cb8d8f683b1b58c20b);\n r_4_0_4_0_0[0] = r_4_0_4_0_0_0;\n }\n r_4_0_4_0.s_0 = r_4_0_4_0_0;\n }\n {\n bytes25[1] memory r_4_0_4_0_1;\n {\n bytes25 r_4_0_4_0_1_0 = bytes25(0xb9d759a5e1cce9e7c5567c9ce6b1859ae2ed36b79df33553de);\n r_4_0_4_0_1[0] = r_4_0_4_0_1_0;\n }\n r_4_0_4_0.s_1 = r_4_0_4_0_1;\n }\n {\n address r_4_0_4_0_2 = 0x03DA56B80a99d6e55c969F66E7902Abb800B2396;\n r_4_0_4_0.s_2 = r_4_0_4_0_2;\n }\n r_4_0_4[0] = r_4_0_4_0;\n }\n r_4_0.s_4 = r_4_0_4;\n }\n r_4[0] = r_4_0;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000111f49399fb8512df1312ae80f80bf95662774b7000000000000000000000000ff6b37e3387ecff107d3218748de91d85fae5aea000000000000000000000000839bc0eb8241c0ea732d2a44bdb2517c016a1a93000000000000000000000000ec24e32ceee2155fcd9065c3b6e9f35ce176e0f3000000000000000000000000d82c6954ea9be17129be0d1c8d5a56d4884ae7cb52dcf6eaffc5c1a4f0fbe004ab7134f75bc4505e314398b8ef3c54bfe4df83ca0000000000000000000000000a92033a336e0eae27af58e72234e82914fba5f6000000000000000000000000009b8e7b70be8572d240fef62e65baac5c244cffffffa7937f820cdee9052d3c066d739b45a12ac64fb74a4f0f68164a162b6bc9000022c5c06a783510d997fd34599b2e2b21e72410dd66a6e11831083750741700000cdc8ee1f012d6af7284d1dfcd7d30d44f665fb3bab2c3473d45c531a940ffffbccc9cefdbfa607bc60778b29ae7d079ea8ca85790f053a65f8030647cafaa5093a832988c8e2d95f637a46e888b5ede9d90ad13ae0000000000000000000000000000000000000000000000000000000000000000000000000000005bcba7e27b77cb8d8f683b1b58c20b00000000000000000000000000000000000000b9d759a5e1cce9e7c5567c9ce6b1859ae2ed36b79df33553de0000000000000000000000000000000000000003da56b80a99d6e55c969f66e7902abb800b2396" + }, + { + "name": "random-(bool[4],(address[3],bool,((bool[2],address,int256[4],bool),address))[3],bool[][2][])", + "type": "(bool[4],(address[3],bool,((bool[2],address,int256[4],bool),address))[3],bool[][2][])", + "value": [ + [true, true, true, false], + [ + [ + [ + "0x6FD0c51233F26cD32C0D3ed81689371AfD6B3393", + "0xdbF7270EcbF21Fc2D4eaDef4BC0237169E6Cfefd", + "0x534e181a1BF782a6479210AAb1F92FC16e76C709" + ], + false, + [ + [ + [true, false], + "0x97D4bF4198407CF1d0a48329B8FF669bF0E4e98E", + [ + "43717326077816838296666351446801400798342795393702095434648935507386426911068", + "-40026100810336195068279683604426924390758992293733033016275353698710966376856", + "-50743723834276728942893096667496680051408620224594068383719488616863028925939", + "14720210771419083899651258551616407497766249053263605701942335157773547156361" + ], + true + ], + "0xa887B14be68589Fe81807F50f8b0058A7dB702E5" + ] + ], + [ + [ + "0x769D5cFd7294965a5A4ad97B9393582d5F334aF4", + "0x7D6B37F30Add3A3b81cd6B83E6756D64c85e6f77", + "0x430bea1C909a10b2E6BcAA008088f7b5C5229eac" + ], + true, + [ + [ + [false, true], + "0xE30DB9261906c98F2302Bde793C7C9DfC2498496", + [ + "-15555662859501656261692537281179499343414883352409691925539572777967206498014", + "-57845050639978682714478682296853572272480323748868659017777957763269739213907", + "-38815776483839195269821127658089282398460513147570736870397284035890214163480", + "-40736916093614860070667216078369698562970043394344133089444487185068890857496" + ], + true + ], + "0xe4b0ebe5681819b7E400DE1De4499c41D305556C" + ] + ], + [ + [ + "0x354fc1BFcaf660Ec26C7AeB2E7cB4410d0613B2C", + "0x3B4474C69d14Af77f5F917D599C59F7549b5CdE6", + "0x5877C10Fd261BB6c543eb82f65511ceB3df7e60F" + ], + true, + [ + [ + [true, false], + "0x22B9F591517D1d9331618506B382eFAAB0fa5607", + [ + "-21462331976415269489443528535689658952426945085984897618405260761783513445449", + "-32712474771254250389717773471128669032394860371741371180691387571445760097552", + "14601382676250904256765862346792007485507337020667717959036628067124897143647", + "28952005482379120569167190714305978135939653433438129247606068936384498553229" + ], + false + ], + "0xb8446F349716C7ede06032f36441A3b0E90C2466" + ] + ] + ], + [ + [ + [false, true, true], + [true, false] + ], + [ + [true, true], + [true, false] + ], + [[false], [false, false, true]], + [[false, false, false, true], [false]] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6FD0c51233F26cD32C0D3ed81689371AfD6B3393" + }, + { + "type": "address", + "value": "0xdbF7270EcbF21Fc2D4eaDef4BC0237169E6Cfefd" + }, + { + "type": "address", + "value": "0x534e181a1BF782a6479210AAb1F92FC16e76C709" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x97D4bF4198407CF1d0a48329B8FF669bF0E4e98E" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "43717326077816838296666351446801400798342795393702095434648935507386426911068" + }, + { + "type": "number", + "value": "-40026100810336195068279683604426924390758992293733033016275353698710966376856" + }, + { + "type": "number", + "value": "-50743723834276728942893096667496680051408620224594068383719488616863028925939" + }, + { + "type": "number", + "value": "14720210771419083899651258551616407497766249053263605701942335157773547156361" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xa887B14be68589Fe81807F50f8b0058A7dB702E5" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x769D5cFd7294965a5A4ad97B9393582d5F334aF4" + }, + { + "type": "address", + "value": "0x7D6B37F30Add3A3b81cd6B83E6756D64c85e6f77" + }, + { + "type": "address", + "value": "0x430bea1C909a10b2E6BcAA008088f7b5C5229eac" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xE30DB9261906c98F2302Bde793C7C9DfC2498496" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-15555662859501656261692537281179499343414883352409691925539572777967206498014" + }, + { + "type": "number", + "value": "-57845050639978682714478682296853572272480323748868659017777957763269739213907" + }, + { + "type": "number", + "value": "-38815776483839195269821127658089282398460513147570736870397284035890214163480" + }, + { + "type": "number", + "value": "-40736916093614860070667216078369698562970043394344133089444487185068890857496" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xe4b0ebe5681819b7E400DE1De4499c41D305556C" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x354fc1BFcaf660Ec26C7AeB2E7cB4410d0613B2C" + }, + { + "type": "address", + "value": "0x3B4474C69d14Af77f5F917D599C59F7549b5CdE6" + }, + { + "type": "address", + "value": "0x5877C10Fd261BB6c543eb82f65511ceB3df7e60F" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x22B9F591517D1d9331618506B382eFAAB0fa5607" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-21462331976415269489443528535689658952426945085984897618405260761783513445449" + }, + { + "type": "number", + "value": "-32712474771254250389717773471128669032394860371741371180691387571445760097552" + }, + { + "type": "number", + "value": "14601382676250904256765862346792007485507337020667717959036628067124897143647" + }, + { + "type": "number", + "value": "28952005482379120569167190714305978135939653433438129247606068936384498553229" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xb8446F349716C7ede06032f36441A3b0E90C2466" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610de9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610c35565b60405180910390f35b610056610a3d565b61005e610a3d565b610066610a6a565b6001808252602082018190526040820152600060608201528152610088610a88565b610090610ab5565b610098610ae1565b736fd0c51233f26cd32c0d3ed81689371afd6b3393815273dbf7270ecbf21fc2d4eadef4bc0237169e6cfefd60208083019190915273534e181a1bf782a6479210aab1f92fc16e76c70960408301529082526000908201526100f8610aff565b610100610b1f565b610108610b46565b6001815260006020808301919091529082527397d4bf4198407cf1d0a48329b8ff669bf0e4e98e9082015261013b610a6a565b7f60a72133cb619cd576a86f0737a227973f7988a6a7a0664f3eb251733c1ae95c81527fa782079edcd76b615432c97808ef71a94c7718b909830fdae7ebac4973e9e6686020808301919091527f8fd011f2737fc841e053ea477073eb89eb4edc8fecd6a5cdecdef55100a92a0d6040808401919091527f208b581353df7e26a88ea45bb5d0904ed3fb5eb4ee99b4067a310eddc71533896060808501919091528482019390935260019284019290925291835273a887b14be68589fe81807f50f8b0058a7db702e5918301919091528201528152610218610ab5565b610220610ae1565b73769d5cfd7294965a5a4ad97b9393582d5f334af48152737d6b37f30add3a3b81cd6b83e6756d64c85e6f7760208083019190915273430bea1c909a10b2e6bcaa008088f7b5c5229eac6040830152908252600190820152610280610aff565b610288610b1f565b610290610b46565b60008152600160208083019190915290825273e30db9261906c98f2302bde793c7c9dfc2498496908201526102c3610a6a565b7fdd9bce8c6f6705d732309925190d61653dbcdae5fbc8b91c862eeb9426d0812281527f801cdc8fcb2d1c7c4d1e2cc57cdc28bc300453fb4921bf60fdf633ad86230bad6020808301919091527faa2f0c8f396f520518d486b7df637042bc55b42d60eeded16ce130b7827eabe86040808401919091527fa5efb8faa7bf5a9da10275f12265fb659e537946248289552906c44138d2dfe86060808501919091528482019390935260019284019290925291835273e4b0ebe5681819b7e400de1de4499c41d305556c838301528301919091528201526103a1610ab5565b6103a9610ae1565b73354fc1bfcaf660ec26c7aeb2e7cb4410d0613b2c8152733b4474c69d14af77f5f917d599c59f7549b5cde6602080830191909152735877c10fd261bb6c543eb82f65511ceb3df7e60f6040830152908252600190820152610409610aff565b610411610b1f565b610419610b46565b6001815260006020808301919091529082527322b9f591517d1d9331618506b382efaab0fa56079082015261044c610a6a565b7fd08cc0263ff64681e2b9b48b569198a7c4470bbbb1c5fb8476620298ba3b0bb781527fb7ad6539be18d44ce82e74b9bc8c226e435c5dd28ce9018274e57c66dbf682f06020808301919091527f204816f8501a9e301ce4ab537bc46ffb87478f0fe77d7f0e030fa51cdb085b5f6040808401919091527f40024120198a401a790786a2e2629be3818419306a1b02e5621d1352223ad18d60608085019190915284820193909352600092840183905292845273b8446f349716c7ede06032f36441a3b0e90c2466848201528483019390935284820193909352908401929092528151600480825260a082019093529091816020015b61054a610b64565b815260200190600190039081610542579050509050610567610b64565b6040805160038082526080820190925260009160208201606080368337019050509050600080826000815181106105a0576105a0610d9d565b6020026020010190151590811515815250505060006001905080826001815181106105cd576105cd610d9d565b6020026020010190151590811515815250505060006001905080826002815181106105fa576105fa610d9d565b9115156020928302919091019091015250815260408051600280825260608201909252600091816020016020820280368337019050509050600060019050808260008151811061064c5761064c610d9d565b602002602001019015159081151581525050506000808260018151811061067557610675610d9d565b911515602092830291909101820152830191909152508151819083906000906106a0576106a0610d9d565b6020026020010181905250506106b4610b64565b60408051600280825260608201835260009260208301908036833701905050905060006001905080826000815181106106ef576106ef610d9d565b60200260200101901515908115158152505050600060019050808260018151811061071c5761071c610d9d565b9115156020928302919091019091015250815260408051600280825260608201909252600091816020016020820280368337019050509050600060019050808260008151811061076e5761076e610d9d565b602002602001019015159081151581525050506000808260018151811061079757610797610d9d565b9115156020928302919091018201528301919091525081518190839060019081106107c4576107c4610d9d565b6020026020010181905250506107d8610b64565b604080516001808252818301909252600091602080830190803683370190505090506000808260008151811061081057610810610d9d565b91151560209283029190910190910152508152604080516003808252608082019092526000918160200160208202803683370190505090506000808260008151811061085e5761085e610d9d565b602002602001019015159081151581525050506000808260018151811061088757610887610d9d565b6020026020010190151590811515815250505060006001905080826002815181106108b4576108b4610d9d565b9115156020928302919091018201528301919091525081518190839060029081106108e1576108e1610d9d565b6020026020010181905250506108f5610b64565b60408051600480825260a08201909252600091602082016080803683370190505090506000808260008151811061092e5761092e610d9d565b602002602001019015159081151581525050506000808260018151811061095757610957610d9d565b602002602001019015159081151581525050506000808260028151811061098057610980610d9d565b6020026020010190151590811515815250505060006001905080826003815181106109ad576109ad610d9d565b91151560209283029190910190910152508152604080516001808252818301909252600091816020016020820280368337019050509050600080826000815181106109fa576109fa610d9d565b911515602092830291909101820152830191909152508151819083906003908110610a2757610a27610d9d565b6020908102919091010152506040820152919050565b6040518060600160405280610a50610a6a565b8152602001610a5d610a88565b8152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003905b610a9f610ab5565b815260200190600190039081610a975790505090565b6040518060600160405280610ac8610ae1565b815260006020820152604001610adc610aff565b905290565b60405180606001604052806003906020820280368337509192915050565b6040518060400160405280610b12610b1f565b8152600060209091015290565b6040518060800160405280610b32610b46565b815260006020820152604001610b12610a6a565b60405180604001604052806002906020820280368337509192915050565b60405180604001604052806002905b6060815260200190600190039081610b735790505090565b600081518084526020808501808196508360051b8101915082860160005b85811015610c285782840389528151846040810160005b6002811015610c1357878203835283518051808452908a01908a84019060005b81811015610bfe57835115158352928c0192918c0191600101610be0565b5050948a0194938a0193925050600101610bc0565b509a87019a9550505090840190600101610ba9565b5091979650505050505050565b6020808252825160009190828483015b6004821015610c665782511515815291830191600191909101908301610c45565b5050508084015160a0840160005b6003808210610c835750610d77565b835180518460005b84811015610cb05782516001600160a01b031682529188019190880190600101610c8b565b505050808601511515606085810191909152604091820151805180519394509092906000608088015b6002821015610cfa57835115158152928a0192600191909101908a01610cd9565b5050808901516001600160a01b031660c0880152938401519360e08701915060005b6004811015610d3957855183529489019491890191600101610d1c565b50909101519250610d51905061016085018315159052565b8501516001600160a01b031661018084015250918301916101a090910190600101610c74565b50505050604083015161058083810152610d956105a0840182610b8b565b949350505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212200874ed124d3c5a02e10238065f85d04e5506b3b96e0b1743dbe0c3ef1ead77e164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6a3289d8 {\n bool[2] s_0;\n address s_1;\n int256[4] s_2;\n bool s_3;\n }\n\n struct S_27afd0b8 {\n S_6a3289d8 s_0;\n address s_1;\n }\n\n struct S_88bb0a4f {\n address[3] s_0;\n bool s_1;\n S_27afd0b8 s_2;\n }\n\n struct S_7418da87 {\n bool[4] s_0;\n S_88bb0a4f[3] s_1;\n bool[][2][] s_2;\n }\n\n function test () public pure returns (S_7418da87 memory) {\n S_7418da87 memory r;\n {\n bool[4] memory r_0;\n {\n bool r_0_0 = true;\n r_0[0] = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0[1] = r_0_1;\n }\n {\n bool r_0_2 = true;\n r_0[2] = r_0_2;\n }\n {\n bool r_0_3 = false;\n r_0[3] = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n S_88bb0a4f[3] memory r_1;\n {\n S_88bb0a4f memory r_1_0;\n {\n address[3] memory r_1_0_0;\n {\n address r_1_0_0_0 = 0x6FD0c51233F26cD32C0D3ed81689371AfD6B3393;\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n address r_1_0_0_1 = 0xdbF7270EcbF21Fc2D4eaDef4BC0237169E6Cfefd;\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n address r_1_0_0_2 = 0x534e181a1BF782a6479210AAb1F92FC16e76C709;\n r_1_0_0[2] = r_1_0_0_2;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bool r_1_0_1 = false;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n S_27afd0b8 memory r_1_0_2;\n {\n S_6a3289d8 memory r_1_0_2_0;\n {\n bool[2] memory r_1_0_2_0_0;\n {\n bool r_1_0_2_0_0_0 = true;\n r_1_0_2_0_0[0] = r_1_0_2_0_0_0;\n }\n {\n bool r_1_0_2_0_0_1 = false;\n r_1_0_2_0_0[1] = r_1_0_2_0_0_1;\n }\n r_1_0_2_0.s_0 = r_1_0_2_0_0;\n }\n {\n address r_1_0_2_0_1 = 0x97D4bF4198407CF1d0a48329B8FF669bF0E4e98E;\n r_1_0_2_0.s_1 = r_1_0_2_0_1;\n }\n {\n int256[4] memory r_1_0_2_0_2;\n {\n int256 r_1_0_2_0_2_0 = 43717326077816838296666351446801400798342795393702095434648935507386426911068;\n r_1_0_2_0_2[0] = r_1_0_2_0_2_0;\n }\n {\n int256 r_1_0_2_0_2_1 = -40026100810336195068279683604426924390758992293733033016275353698710966376856;\n r_1_0_2_0_2[1] = r_1_0_2_0_2_1;\n }\n {\n int256 r_1_0_2_0_2_2 = -50743723834276728942893096667496680051408620224594068383719488616863028925939;\n r_1_0_2_0_2[2] = r_1_0_2_0_2_2;\n }\n {\n int256 r_1_0_2_0_2_3 = 14720210771419083899651258551616407497766249053263605701942335157773547156361;\n r_1_0_2_0_2[3] = r_1_0_2_0_2_3;\n }\n r_1_0_2_0.s_2 = r_1_0_2_0_2;\n }\n {\n bool r_1_0_2_0_3 = true;\n r_1_0_2_0.s_3 = r_1_0_2_0_3;\n }\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n address r_1_0_2_1 = 0xa887B14be68589Fe81807F50f8b0058A7dB702E5;\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n r_1[0] = r_1_0;\n }\n {\n S_88bb0a4f memory r_1_1;\n {\n address[3] memory r_1_1_0;\n {\n address r_1_1_0_0 = 0x769D5cFd7294965a5A4ad97B9393582d5F334aF4;\n r_1_1_0[0] = r_1_1_0_0;\n }\n {\n address r_1_1_0_1 = 0x7D6B37F30Add3A3b81cd6B83E6756D64c85e6f77;\n r_1_1_0[1] = r_1_1_0_1;\n }\n {\n address r_1_1_0_2 = 0x430bea1C909a10b2E6BcAA008088f7b5C5229eac;\n r_1_1_0[2] = r_1_1_0_2;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bool r_1_1_1 = true;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_27afd0b8 memory r_1_1_2;\n {\n S_6a3289d8 memory r_1_1_2_0;\n {\n bool[2] memory r_1_1_2_0_0;\n {\n bool r_1_1_2_0_0_0 = false;\n r_1_1_2_0_0[0] = r_1_1_2_0_0_0;\n }\n {\n bool r_1_1_2_0_0_1 = true;\n r_1_1_2_0_0[1] = r_1_1_2_0_0_1;\n }\n r_1_1_2_0.s_0 = r_1_1_2_0_0;\n }\n {\n address r_1_1_2_0_1 = 0xE30DB9261906c98F2302Bde793C7C9DfC2498496;\n r_1_1_2_0.s_1 = r_1_1_2_0_1;\n }\n {\n int256[4] memory r_1_1_2_0_2;\n {\n int256 r_1_1_2_0_2_0 = -15555662859501656261692537281179499343414883352409691925539572777967206498014;\n r_1_1_2_0_2[0] = r_1_1_2_0_2_0;\n }\n {\n int256 r_1_1_2_0_2_1 = -57845050639978682714478682296853572272480323748868659017777957763269739213907;\n r_1_1_2_0_2[1] = r_1_1_2_0_2_1;\n }\n {\n int256 r_1_1_2_0_2_2 = -38815776483839195269821127658089282398460513147570736870397284035890214163480;\n r_1_1_2_0_2[2] = r_1_1_2_0_2_2;\n }\n {\n int256 r_1_1_2_0_2_3 = -40736916093614860070667216078369698562970043394344133089444487185068890857496;\n r_1_1_2_0_2[3] = r_1_1_2_0_2_3;\n }\n r_1_1_2_0.s_2 = r_1_1_2_0_2;\n }\n {\n bool r_1_1_2_0_3 = true;\n r_1_1_2_0.s_3 = r_1_1_2_0_3;\n }\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n address r_1_1_2_1 = 0xe4b0ebe5681819b7E400DE1De4499c41D305556C;\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n r_1[1] = r_1_1;\n }\n {\n S_88bb0a4f memory r_1_2;\n {\n address[3] memory r_1_2_0;\n {\n address r_1_2_0_0 = 0x354fc1BFcaf660Ec26C7AeB2E7cB4410d0613B2C;\n r_1_2_0[0] = r_1_2_0_0;\n }\n {\n address r_1_2_0_1 = 0x3B4474C69d14Af77f5F917D599C59F7549b5CdE6;\n r_1_2_0[1] = r_1_2_0_1;\n }\n {\n address r_1_2_0_2 = 0x5877C10Fd261BB6c543eb82f65511ceB3df7e60F;\n r_1_2_0[2] = r_1_2_0_2;\n }\n r_1_2.s_0 = r_1_2_0;\n }\n {\n bool r_1_2_1 = true;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n S_27afd0b8 memory r_1_2_2;\n {\n S_6a3289d8 memory r_1_2_2_0;\n {\n bool[2] memory r_1_2_2_0_0;\n {\n bool r_1_2_2_0_0_0 = true;\n r_1_2_2_0_0[0] = r_1_2_2_0_0_0;\n }\n {\n bool r_1_2_2_0_0_1 = false;\n r_1_2_2_0_0[1] = r_1_2_2_0_0_1;\n }\n r_1_2_2_0.s_0 = r_1_2_2_0_0;\n }\n {\n address r_1_2_2_0_1 = 0x22B9F591517D1d9331618506B382eFAAB0fa5607;\n r_1_2_2_0.s_1 = r_1_2_2_0_1;\n }\n {\n int256[4] memory r_1_2_2_0_2;\n {\n int256 r_1_2_2_0_2_0 = -21462331976415269489443528535689658952426945085984897618405260761783513445449;\n r_1_2_2_0_2[0] = r_1_2_2_0_2_0;\n }\n {\n int256 r_1_2_2_0_2_1 = -32712474771254250389717773471128669032394860371741371180691387571445760097552;\n r_1_2_2_0_2[1] = r_1_2_2_0_2_1;\n }\n {\n int256 r_1_2_2_0_2_2 = 14601382676250904256765862346792007485507337020667717959036628067124897143647;\n r_1_2_2_0_2[2] = r_1_2_2_0_2_2;\n }\n {\n int256 r_1_2_2_0_2_3 = 28952005482379120569167190714305978135939653433438129247606068936384498553229;\n r_1_2_2_0_2[3] = r_1_2_2_0_2_3;\n }\n r_1_2_2_0.s_2 = r_1_2_2_0_2;\n }\n {\n bool r_1_2_2_0_3 = false;\n r_1_2_2_0.s_3 = r_1_2_2_0_3;\n }\n r_1_2_2.s_0 = r_1_2_2_0;\n }\n {\n address r_1_2_2_1 = 0xb8446F349716C7ede06032f36441A3b0E90C2466;\n r_1_2_2.s_1 = r_1_2_2_1;\n }\n r_1_2.s_2 = r_1_2_2;\n }\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n bool[][2][] memory r_2 = new bool[][2][](4);\n {\n bool[][2] memory r_2_0;\n {\n bool[] memory r_2_0_0 = new bool[](3);\n {\n bool r_2_0_0_0 = false;\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n bool r_2_0_0_1 = true;\n r_2_0_0[1] = r_2_0_0_1;\n }\n {\n bool r_2_0_0_2 = true;\n r_2_0_0[2] = r_2_0_0_2;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n bool[] memory r_2_0_1 = new bool[](2);\n {\n bool r_2_0_1_0 = true;\n r_2_0_1[0] = r_2_0_1_0;\n }\n {\n bool r_2_0_1_1 = false;\n r_2_0_1[1] = r_2_0_1_1;\n }\n r_2_0[1] = r_2_0_1;\n }\n r_2[0] = r_2_0;\n }\n {\n bool[][2] memory r_2_1;\n {\n bool[] memory r_2_1_0 = new bool[](2);\n {\n bool r_2_1_0_0 = true;\n r_2_1_0[0] = r_2_1_0_0;\n }\n {\n bool r_2_1_0_1 = true;\n r_2_1_0[1] = r_2_1_0_1;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n bool[] memory r_2_1_1 = new bool[](2);\n {\n bool r_2_1_1_0 = true;\n r_2_1_1[0] = r_2_1_1_0;\n }\n {\n bool r_2_1_1_1 = false;\n r_2_1_1[1] = r_2_1_1_1;\n }\n r_2_1[1] = r_2_1_1;\n }\n r_2[1] = r_2_1;\n }\n {\n bool[][2] memory r_2_2;\n {\n bool[] memory r_2_2_0 = new bool[](1);\n {\n bool r_2_2_0_0 = false;\n r_2_2_0[0] = r_2_2_0_0;\n }\n r_2_2[0] = r_2_2_0;\n }\n {\n bool[] memory r_2_2_1 = new bool[](3);\n {\n bool r_2_2_1_0 = false;\n r_2_2_1[0] = r_2_2_1_0;\n }\n {\n bool r_2_2_1_1 = false;\n r_2_2_1[1] = r_2_2_1_1;\n }\n {\n bool r_2_2_1_2 = true;\n r_2_2_1[2] = r_2_2_1_2;\n }\n r_2_2[1] = r_2_2_1;\n }\n r_2[2] = r_2_2;\n }\n {\n bool[][2] memory r_2_3;\n {\n bool[] memory r_2_3_0 = new bool[](4);\n {\n bool r_2_3_0_0 = false;\n r_2_3_0[0] = r_2_3_0_0;\n }\n {\n bool r_2_3_0_1 = false;\n r_2_3_0[1] = r_2_3_0_1;\n }\n {\n bool r_2_3_0_2 = false;\n r_2_3_0[2] = r_2_3_0_2;\n }\n {\n bool r_2_3_0_3 = true;\n r_2_3_0[3] = r_2_3_0_3;\n }\n r_2_3[0] = r_2_3_0;\n }\n {\n bool[] memory r_2_3_1 = new bool[](1);\n {\n bool r_2_3_1_0 = false;\n r_2_3_1[0] = r_2_3_1_0;\n }\n r_2_3[1] = r_2_3_1;\n }\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fd0c51233f26cd32c0d3ed81689371afd6b3393000000000000000000000000dbf7270ecbf21fc2d4eadef4bc0237169e6cfefd000000000000000000000000534e181a1bf782a6479210aab1f92fc16e76c70900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097d4bf4198407cf1d0a48329b8ff669bf0e4e98e60a72133cb619cd576a86f0737a227973f7988a6a7a0664f3eb251733c1ae95ca782079edcd76b615432c97808ef71a94c7718b909830fdae7ebac4973e9e6688fd011f2737fc841e053ea477073eb89eb4edc8fecd6a5cdecdef55100a92a0d208b581353df7e26a88ea45bb5d0904ed3fb5eb4ee99b4067a310eddc71533890000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a887b14be68589fe81807f50f8b0058a7db702e5000000000000000000000000769d5cfd7294965a5a4ad97b9393582d5f334af40000000000000000000000007d6b37f30add3a3b81cd6b83e6756d64c85e6f77000000000000000000000000430bea1c909a10b2e6bcaa008088f7b5c5229eac000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e30db9261906c98f2302bde793c7c9dfc2498496dd9bce8c6f6705d732309925190d61653dbcdae5fbc8b91c862eeb9426d08122801cdc8fcb2d1c7c4d1e2cc57cdc28bc300453fb4921bf60fdf633ad86230badaa2f0c8f396f520518d486b7df637042bc55b42d60eeded16ce130b7827eabe8a5efb8faa7bf5a9da10275f12265fb659e537946248289552906c44138d2dfe80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e4b0ebe5681819b7e400de1de4499c41d305556c000000000000000000000000354fc1bfcaf660ec26c7aeb2e7cb4410d0613b2c0000000000000000000000003b4474c69d14af77f5f917d599c59f7549b5cde60000000000000000000000005877c10fd261bb6c543eb82f65511ceb3df7e60f00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022b9f591517d1d9331618506b382efaab0fa5607d08cc0263ff64681e2b9b48b569198a7c4470bbbb1c5fb8476620298ba3b0bb7b7ad6539be18d44ce82e74b9bc8c226e435c5dd28ce9018274e57c66dbf682f0204816f8501a9e301ce4ab537bc46ffb87478f0fe77d7f0e030fa51cdb085b5f40024120198a401a790786a2e2629be3818419306a1b02e5621d1352223ad18d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8446f349716c7ede06032f36441a3b0e90c246600000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,int152,bool,((bytes30[3],address,bool),((address,bytes4[2],bool),bool,bool,string)[4][2])[])", + "type": "(string,int152,bool,((bytes30[3],address,bool),((address,bytes4[2],bool),bool,bool,string)[4][2])[])", + "value": [ + "Moo é🚀éooé oo🚀é 🚀oMéoM🚀 🚀o oMooMoMoéo🚀🚀ooo🚀 M", + "1038682924496575370524636657733852580279327620", + true, + [ + [ + [ + [ + "0x571fcb17d306a515b63760c952f3d264c004e9b94e745933b1755c3708e9", + "0xd2ff594ec9fd630e8151ba17254bb93555a6ce350dbccdfa871e383073ff", + "0x391da0841cdcc0f7e1e24a97ba1b8485013a9667ce4caf59d5568f365281" + ], + "0x4bb0830c8aEdc3b6ce497f216be334C21bb4fC7a", + false + ], + [ + [ + [ + [ + "0xE8860CFdFc8cDBceccd26D9a5EBf70d275dB44d1", + ["0x377bbea3", "0x24d6b1d0"], + true + ], + false, + false, + "Moo é🚀Mo o🚀M🚀é oMoo🚀 o éé ooMéoM🚀 🚀é" + ], + [ + [ + "0x2cE6C205B7d6bDE8b4fd540F50855b4428ED9994", + ["0x17cea387", "0x5cd2d06f"], + false + ], + true, + false, + "Moo é🚀🚀 M🚀o🚀éo ooMooM🚀🚀M MMMM éoo🚀Moo " + ], + [ + [ + "0x110345c4a49963Ac64Fd67Abc04BfFB8E4A94b7C", + ["0xbfb10334", "0x625686b9"], + false + ], + true, + true, + "Moo é🚀éoo🚀oooMé🚀oMMoééé🚀MoMoéé🚀ééo🚀🚀 oo🚀éoo é 🚀éooo🚀ooo🚀oM o" + ], + [ + [ + "0xDfB23C9496340E3DD3d2FA3e434A540a30fff3D6", + ["0x326f4bca", "0x48015abf"], + false + ], + false, + true, + "Moo é🚀éMoo🚀oMéo éM 🚀 é🚀Méo o🚀ooé🚀🚀éMooM🚀MMé🚀 " + ] + ], + [ + [ + [ + "0xa7AEB8A8527ec968674BcBe62Db0B37871f0F98C", + ["0x40189c7e", "0xbf06634f"], + true + ], + false, + true, + "Moo é🚀🚀 oMMMoo " + ], + [ + [ + "0xA389185832487EFA09361022Bb666e3dCf8b7Be6", + ["0x011e8376", "0x448a44cb"], + false + ], + true, + true, + "Moo é🚀éMé🚀MoooM oooo🚀éoéoo oéé o MMo🚀🚀" + ], + [ + [ + "0xC5784844d95155aC222C27FC9C0aCFDc9120B79F", + ["0x3c555fab", "0x99f5cb2b"], + true + ], + false, + false, + "Moo é🚀M🚀o MoM🚀 o 🚀ooMéé🚀 🚀o o 🚀Mo MoM🚀" + ], + [ + [ + "0x9C6Fd314070BaC441B96655E624368C044Fc9386", + ["0x30956f49", "0x1e1ffd12"], + true + ], + false, + false, + "Moo é🚀o🚀Mo o🚀o" + ] + ] + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooé oo🚀é 🚀oMéoM🚀 🚀o oMooMoMoéo🚀🚀ooo🚀 M" + }, + { + "type": "number", + "value": "1038682924496575370524636657733852580279327620" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x571fcb17d306a515b63760c952f3d264c004e9b94e745933b1755c3708e9" + }, + { + "type": "hexstring", + "value": "0xd2ff594ec9fd630e8151ba17254bb93555a6ce350dbccdfa871e383073ff" + }, + { + "type": "hexstring", + "value": "0x391da0841cdcc0f7e1e24a97ba1b8485013a9667ce4caf59d5568f365281" + } + ] + }, + { + "type": "address", + "value": "0x4bb0830c8aEdc3b6ce497f216be334C21bb4fC7a" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE8860CFdFc8cDBceccd26D9a5EBf70d275dB44d1" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x377bbea3" + }, + { + "type": "hexstring", + "value": "0x24d6b1d0" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀Mo o🚀M🚀é oMoo🚀 o éé ooMéoM🚀 🚀é" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2cE6C205B7d6bDE8b4fd540F50855b4428ED9994" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x17cea387" + }, + { + "type": "hexstring", + "value": "0x5cd2d06f" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀 M🚀o🚀éo ooMooM🚀🚀M MMMM éoo🚀Moo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x110345c4a49963Ac64Fd67Abc04BfFB8E4A94b7C" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbfb10334" + }, + { + "type": "hexstring", + "value": "0x625686b9" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀éoo🚀oooMé🚀oMMoééé🚀MoMoéé🚀ééo🚀🚀 oo🚀éoo é 🚀éooo🚀ooo🚀oM o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xDfB23C9496340E3DD3d2FA3e434A540a30fff3D6" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x326f4bca" + }, + { + "type": "hexstring", + "value": "0x48015abf" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀éMoo🚀oMéo éM 🚀 é🚀Méo o🚀ooé🚀🚀éMooM🚀MMé🚀 " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa7AEB8A8527ec968674BcBe62Db0B37871f0F98C" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x40189c7e" + }, + { + "type": "hexstring", + "value": "0xbf06634f" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀 oMMMoo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA389185832487EFA09361022Bb666e3dCf8b7Be6" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x011e8376" + }, + { + "type": "hexstring", + "value": "0x448a44cb" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀éMé🚀MoooM oooo🚀éoéoo oéé o MMo🚀🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xC5784844d95155aC222C27FC9C0aCFDc9120B79F" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3c555fab" + }, + { + "type": "hexstring", + "value": "0x99f5cb2b" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M🚀o MoM🚀 o 🚀ooMéé🚀 🚀o o 🚀Mo MoM🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9C6Fd314070BaC441B96655E624368C044Fc9386" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x30956f49" + }, + { + "type": "hexstring", + "value": "0x1e1ffd12" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o🚀Mo o🚀o" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610ca3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061094c565b60405180910390f35b61007e604051806080016040528060608152602001600060120b8152602001600015158152602001606081525090565b6100ae604051806080016040528060608152602001600060120b8152602001600015158152602001606081525090565b60006040518060800160405280604c8152602001610b1e604c9139825250722e937ec66d2a84df95abf70d3c5f60e6319b846020820152600160408083018290528051828152808201909152600091816020015b61010a6106bd565b8152602001906001900390816101025790505090506101276106bd565b61012f6106e2565b610137610709565b7f571fcb17d306a515b63760c952f3d264c004e9b94e745933b1755c3708e9000081527fd2ff594ec9fd630e8151ba17254bb93555a6ce350dbccdfa871e383073ff00006020808301919091527f391da0841cdcc0f7e1e24a97ba1b8485013a9667ce4caf59d5568f3652810000604080840191909152918352734bb0830c8aedc3b6ce497f216be334c21bb4fc7a9083015260009082015281526101da610727565b6101e2610754565b6101ea610781565b6101f26107ad565b73e8860cfdfc8cdbceccd26d9a5ebf70d275db44d181526102116107dd565b63377bbea360e01b815263024d6b1d60e41b6020808301919091528281019190915260016040808401919091529183526000838201819052838301819052825160608101909352603d808452909291610aa2908301396060830152508152610277610781565b61027f6107ad565b732ce6c205b7d6bde8b4fd540f50855b4428ed9994815261029e6107dd565b6317cea38760e01b8152635cd2d06f60e01b6020808301919091528281019190915260006040808401829052928452600184830152838301819052825160608101909352603f808452909291610adf908301396060830152506020820152610304610781565b61030c6107ad565b73110345c4a49963ac64fd67abc04bffb8e4a94b7c815261032b6107dd565b632fec40cd60e21b815263625686b960e01b6020808301919091528281019190915260006040808401829052928452600184830181905284840152825160a08101909352606d808452909291610c01908301396060830152506040820152610391610781565b6103996107ad565b73dfb23c9496340e3dd3d2fa3e434a540a30fff3d681526103b86107dd565b631937a5e560e11b81526348015abf60e01b60208083019190915282810191909152600060408084018290529284528382018190526001848401528251608081019093526052808452909291610b6a90830139606083810191909152830191909152508152610425610754565b61042d610781565b6104356107ad565b73a7aeb8a8527ec968674bcbe62db0b37871f0f98c81526104546107dd565b63200c4e3f60e11b815263bf06634f60e01b60208083019190915282810191909152600160408084018290529284526000848301528383015281518083019092526016825275026b7b79061d4f84fcd40784fcd401037a6a6a6b7b7960551b90820152606082015281526104c6610781565b6104ce6107ad565b73a389185832487efa09361022bb666e3dcf8b7be681526104ed6107dd565b628f41bb60e11b815263448a44cb60e01b6020808301919091528281019190915260006040808401829052928452600184830181905284840152825160608101909352603c808452909291610a66908301396060830152506020820152610552610781565b61055a6107ad565b73c5784844d95155ac222c27fc9c0acfdc9120b79f81526105796107dd565b633c555fab60e01b81526399f5cb2b60e01b60208083019190915282810191909152600160408084019190915291835260008382018190528383018190528251608081019093526045808452909291610bbc9083013960608301525060408201526105e2610781565b6105ea6107ad565b739c6fd314070bac441b96655e624368c044fc938681526106096107dd565b6330956f4960e01b8152630f0ffe8960e11b60208083019190915282810191909152600160408084019190915291835260008382018190528383018190528251808401909352601a83527f4d6f6f20c3a9f09f9a806ff09f9a804d6f2020206ff09f9a806f0000000000008383015260608085019390935291840192909252838201929092528301919091528251829184916106a7576106a7610a4f565b6020908102919091010152506060820152919050565b60405180604001604052806106d06106e2565b81526020016106dd610727565b905290565b60405180606001604052806106f5610709565b815260006020820181905260409091015290565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002905b61073e610754565b8152602001906001900390816107365790505090565b60405180608001604052806004905b61076b610781565b8152602001906001900390816107635790505090565b60405180608001604052806107946107ad565b8152600060208201819052604082015260609081015290565b604051806060016040528060006001600160a01b031681526020016107d06107dd565b8152600060209091015290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561082157602081850181015186830182015201610805565b81811115610833576000602083870101525b50601f01601f19169290920160200192915050565b60008260408082018460005b60028082106108635750610940565b8584038952825184608080820160005b60048110156109215788820384528451805180516001600160a01b0316845260208082015160e092919081870160005b8c8110156108c95782516001600160e01b031916825291830191908301906001016108a3565b505050908d0151151560608681019190915283820151151587870152838e015180151560a088015293015160c086018390529290610909838701856107fb565b98810198970196945050506001919091019050610873565b5060209c8d019c90975095909501945050506001919091019050610854565b50909695505050505050565b60006020808352835160808285015261096860a08501826107fb565b9050818501518060120b6040860152506040850151606081151581870152808701519150601f19808785030160808801528383518086528686019150868160051b87010187860195506000805b83811015610a3e578883038601855287518051805160c0919086865b60038110156109f357825161ffff19168252918f0191908f01906001016109d1565b505050808d01516001600160a01b0316868b01526040015115156080860152908b015160a0850182905290610a2a81860183610848565b998c0199968c0196945050506001016109b5565b50909b9a5050505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a94dc3a9f09f9a804d6f6f6f4d206f6f6f6ff09f9a80c3a96fc3a96f6f206fc3a9c3a9206f204d4d6ff09f9a80f09f9a804d6f6f20c3a9f09f9a804d6f206ff09f9a804df09f9a80c3a920206f4d6f6ff09f9a80206f20c3a9c3a9206f6f4dc3a96f4df09f9a8020f09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a80204df09f9a806ff09f9a80c3a96f206f6f4d6f6f4df09f9a80f09f9a804d204d4d4d4d2020c3a96f6ff09f9a804d6f6f204d6f6f20c3a9f09f9a80c3a96f6fc3a9206f6ff09f9a80c3a920f09f9a806f4dc3a96f4df09f9a8020f09f9a806f20206f4d6f6f4d6f4d6fc3a96ff09f9a80f09f9a806f6f6ff09f9a80204d4d6f6f20c3a9f09f9a80c3a94d6f6ff09f9a806f4dc3a96f20c3a94d20f09f9a8020c3a9f09f9a804dc3a96f206ff09f9a806f6fc3a9f09f9a80f09f9a80c3a94d6f6f4df09f9a804d4dc3a9f09f9a8020204d6f6f20c3a9f09f9a804df09f9a806f20204d6f4df09f9a80206f2020f09f9a806f6f4dc3a9c3a9f09f9a8020f09f9a806f2020206f20f09f9a804d6f204d6f4df09f9a804d6f6f20c3a9f09f9a80c3a96f6ff09f9a806f6f6f4dc3a9f09f9a806f4d4d6fc3a9c3a9c3a9f09f9a804d6f4d6fc3a9c3a9f09f9a80c3a9c3a96ff09f9a80f09f9a80206f6ff09f9a80c3a96f6f2020c3a9202020f09f9a80c3a96f6f6ff09f9a806f6f6ff09f9a806f4d206fa2646970667358221220d00bca17bce7d75e879f819087ee60d8a0a954c531feb9d74ed5755d30988f9c64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_3610b15a {\n bytes30[3] s_0;\n address s_1;\n bool s_2;\n }\n\n struct S_cbe5d844 {\n address s_0;\n bytes4[2] s_1;\n bool s_2;\n }\n\n struct S_2600ac1c {\n S_cbe5d844 s_0;\n bool s_1;\n bool s_2;\n string s_3;\n }\n\n struct S_3dcd01a1 {\n S_3610b15a s_0;\n S_2600ac1c[4][2] s_1;\n }\n\n struct S_8c03ba0b {\n string s_0;\n int152 s_1;\n bool s_2;\n S_3dcd01a1[] s_3;\n }\n\n function test () public pure returns (S_8c03ba0b memory) {\n S_8c03ba0b memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éooé oo🚀é 🚀oMéoM🚀 🚀o oMooMoMoéo🚀🚀ooo🚀 M\";\n r.s_0 = r_0;\n }\n {\n int152 r_1 = 1038682924496575370524636657733852580279327620;\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n S_3dcd01a1[] memory r_3 = new S_3dcd01a1[](1);\n {\n S_3dcd01a1 memory r_3_0;\n {\n S_3610b15a memory r_3_0_0;\n {\n bytes30[3] memory r_3_0_0_0;\n {\n bytes30 r_3_0_0_0_0 = bytes30(0x571fcb17d306a515b63760c952f3d264c004e9b94e745933b1755c3708e9);\n r_3_0_0_0[0] = r_3_0_0_0_0;\n }\n {\n bytes30 r_3_0_0_0_1 = bytes30(0xd2ff594ec9fd630e8151ba17254bb93555a6ce350dbccdfa871e383073ff);\n r_3_0_0_0[1] = r_3_0_0_0_1;\n }\n {\n bytes30 r_3_0_0_0_2 = bytes30(0x391da0841cdcc0f7e1e24a97ba1b8485013a9667ce4caf59d5568f365281);\n r_3_0_0_0[2] = r_3_0_0_0_2;\n }\n r_3_0_0.s_0 = r_3_0_0_0;\n }\n {\n address r_3_0_0_1 = 0x4bb0830c8aEdc3b6ce497f216be334C21bb4fC7a;\n r_3_0_0.s_1 = r_3_0_0_1;\n }\n {\n bool r_3_0_0_2 = false;\n r_3_0_0.s_2 = r_3_0_0_2;\n }\n r_3_0.s_0 = r_3_0_0;\n }\n {\n S_2600ac1c[4][2] memory r_3_0_1;\n {\n S_2600ac1c[4] memory r_3_0_1_0;\n {\n S_2600ac1c memory r_3_0_1_0_0;\n {\n S_cbe5d844 memory r_3_0_1_0_0_0;\n {\n address r_3_0_1_0_0_0_0 = 0xE8860CFdFc8cDBceccd26D9a5EBf70d275dB44d1;\n r_3_0_1_0_0_0.s_0 = r_3_0_1_0_0_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_0_0_0_1;\n {\n bytes4 r_3_0_1_0_0_0_1_0 = bytes4(0x377bbea3);\n r_3_0_1_0_0_0_1[0] = r_3_0_1_0_0_0_1_0;\n }\n {\n bytes4 r_3_0_1_0_0_0_1_1 = bytes4(0x24d6b1d0);\n r_3_0_1_0_0_0_1[1] = r_3_0_1_0_0_0_1_1;\n }\n r_3_0_1_0_0_0.s_1 = r_3_0_1_0_0_0_1;\n }\n {\n bool r_3_0_1_0_0_0_2 = true;\n r_3_0_1_0_0_0.s_2 = r_3_0_1_0_0_0_2;\n }\n r_3_0_1_0_0.s_0 = r_3_0_1_0_0_0;\n }\n {\n bool r_3_0_1_0_0_1 = false;\n r_3_0_1_0_0.s_1 = r_3_0_1_0_0_1;\n }\n {\n bool r_3_0_1_0_0_2 = false;\n r_3_0_1_0_0.s_2 = r_3_0_1_0_0_2;\n }\n {\n string memory r_3_0_1_0_0_3 = unicode\"Moo é🚀Mo o🚀M🚀é oMoo🚀 o éé ooMéoM🚀 🚀é\";\n r_3_0_1_0_0.s_3 = r_3_0_1_0_0_3;\n }\n r_3_0_1_0[0] = r_3_0_1_0_0;\n }\n {\n S_2600ac1c memory r_3_0_1_0_1;\n {\n S_cbe5d844 memory r_3_0_1_0_1_0;\n {\n address r_3_0_1_0_1_0_0 = 0x2cE6C205B7d6bDE8b4fd540F50855b4428ED9994;\n r_3_0_1_0_1_0.s_0 = r_3_0_1_0_1_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_0_1_0_1;\n {\n bytes4 r_3_0_1_0_1_0_1_0 = bytes4(0x17cea387);\n r_3_0_1_0_1_0_1[0] = r_3_0_1_0_1_0_1_0;\n }\n {\n bytes4 r_3_0_1_0_1_0_1_1 = bytes4(0x5cd2d06f);\n r_3_0_1_0_1_0_1[1] = r_3_0_1_0_1_0_1_1;\n }\n r_3_0_1_0_1_0.s_1 = r_3_0_1_0_1_0_1;\n }\n {\n bool r_3_0_1_0_1_0_2 = false;\n r_3_0_1_0_1_0.s_2 = r_3_0_1_0_1_0_2;\n }\n r_3_0_1_0_1.s_0 = r_3_0_1_0_1_0;\n }\n {\n bool r_3_0_1_0_1_1 = true;\n r_3_0_1_0_1.s_1 = r_3_0_1_0_1_1;\n }\n {\n bool r_3_0_1_0_1_2 = false;\n r_3_0_1_0_1.s_2 = r_3_0_1_0_1_2;\n }\n {\n string memory r_3_0_1_0_1_3 = unicode\"Moo é🚀🚀 M🚀o🚀éo ooMooM🚀🚀M MMMM éoo🚀Moo \";\n r_3_0_1_0_1.s_3 = r_3_0_1_0_1_3;\n }\n r_3_0_1_0[1] = r_3_0_1_0_1;\n }\n {\n S_2600ac1c memory r_3_0_1_0_2;\n {\n S_cbe5d844 memory r_3_0_1_0_2_0;\n {\n address r_3_0_1_0_2_0_0 = 0x110345c4a49963Ac64Fd67Abc04BfFB8E4A94b7C;\n r_3_0_1_0_2_0.s_0 = r_3_0_1_0_2_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_0_2_0_1;\n {\n bytes4 r_3_0_1_0_2_0_1_0 = bytes4(0xbfb10334);\n r_3_0_1_0_2_0_1[0] = r_3_0_1_0_2_0_1_0;\n }\n {\n bytes4 r_3_0_1_0_2_0_1_1 = bytes4(0x625686b9);\n r_3_0_1_0_2_0_1[1] = r_3_0_1_0_2_0_1_1;\n }\n r_3_0_1_0_2_0.s_1 = r_3_0_1_0_2_0_1;\n }\n {\n bool r_3_0_1_0_2_0_2 = false;\n r_3_0_1_0_2_0.s_2 = r_3_0_1_0_2_0_2;\n }\n r_3_0_1_0_2.s_0 = r_3_0_1_0_2_0;\n }\n {\n bool r_3_0_1_0_2_1 = true;\n r_3_0_1_0_2.s_1 = r_3_0_1_0_2_1;\n }\n {\n bool r_3_0_1_0_2_2 = true;\n r_3_0_1_0_2.s_2 = r_3_0_1_0_2_2;\n }\n {\n string memory r_3_0_1_0_2_3 = unicode\"Moo é🚀éoo🚀oooMé🚀oMMoééé🚀MoMoéé🚀ééo🚀🚀 oo🚀éoo é 🚀éooo🚀ooo🚀oM o\";\n r_3_0_1_0_2.s_3 = r_3_0_1_0_2_3;\n }\n r_3_0_1_0[2] = r_3_0_1_0_2;\n }\n {\n S_2600ac1c memory r_3_0_1_0_3;\n {\n S_cbe5d844 memory r_3_0_1_0_3_0;\n {\n address r_3_0_1_0_3_0_0 = 0xDfB23C9496340E3DD3d2FA3e434A540a30fff3D6;\n r_3_0_1_0_3_0.s_0 = r_3_0_1_0_3_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_0_3_0_1;\n {\n bytes4 r_3_0_1_0_3_0_1_0 = bytes4(0x326f4bca);\n r_3_0_1_0_3_0_1[0] = r_3_0_1_0_3_0_1_0;\n }\n {\n bytes4 r_3_0_1_0_3_0_1_1 = bytes4(0x48015abf);\n r_3_0_1_0_3_0_1[1] = r_3_0_1_0_3_0_1_1;\n }\n r_3_0_1_0_3_0.s_1 = r_3_0_1_0_3_0_1;\n }\n {\n bool r_3_0_1_0_3_0_2 = false;\n r_3_0_1_0_3_0.s_2 = r_3_0_1_0_3_0_2;\n }\n r_3_0_1_0_3.s_0 = r_3_0_1_0_3_0;\n }\n {\n bool r_3_0_1_0_3_1 = false;\n r_3_0_1_0_3.s_1 = r_3_0_1_0_3_1;\n }\n {\n bool r_3_0_1_0_3_2 = true;\n r_3_0_1_0_3.s_2 = r_3_0_1_0_3_2;\n }\n {\n string memory r_3_0_1_0_3_3 = unicode\"Moo é🚀éMoo🚀oMéo éM 🚀 é🚀Méo o🚀ooé🚀🚀éMooM🚀MMé🚀 \";\n r_3_0_1_0_3.s_3 = r_3_0_1_0_3_3;\n }\n r_3_0_1_0[3] = r_3_0_1_0_3;\n }\n r_3_0_1[0] = r_3_0_1_0;\n }\n {\n S_2600ac1c[4] memory r_3_0_1_1;\n {\n S_2600ac1c memory r_3_0_1_1_0;\n {\n S_cbe5d844 memory r_3_0_1_1_0_0;\n {\n address r_3_0_1_1_0_0_0 = 0xa7AEB8A8527ec968674BcBe62Db0B37871f0F98C;\n r_3_0_1_1_0_0.s_0 = r_3_0_1_1_0_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_1_0_0_1;\n {\n bytes4 r_3_0_1_1_0_0_1_0 = bytes4(0x40189c7e);\n r_3_0_1_1_0_0_1[0] = r_3_0_1_1_0_0_1_0;\n }\n {\n bytes4 r_3_0_1_1_0_0_1_1 = bytes4(0xbf06634f);\n r_3_0_1_1_0_0_1[1] = r_3_0_1_1_0_0_1_1;\n }\n r_3_0_1_1_0_0.s_1 = r_3_0_1_1_0_0_1;\n }\n {\n bool r_3_0_1_1_0_0_2 = true;\n r_3_0_1_1_0_0.s_2 = r_3_0_1_1_0_0_2;\n }\n r_3_0_1_1_0.s_0 = r_3_0_1_1_0_0;\n }\n {\n bool r_3_0_1_1_0_1 = false;\n r_3_0_1_1_0.s_1 = r_3_0_1_1_0_1;\n }\n {\n bool r_3_0_1_1_0_2 = true;\n r_3_0_1_1_0.s_2 = r_3_0_1_1_0_2;\n }\n {\n string memory r_3_0_1_1_0_3 = unicode\"Moo é🚀🚀 oMMMoo \";\n r_3_0_1_1_0.s_3 = r_3_0_1_1_0_3;\n }\n r_3_0_1_1[0] = r_3_0_1_1_0;\n }\n {\n S_2600ac1c memory r_3_0_1_1_1;\n {\n S_cbe5d844 memory r_3_0_1_1_1_0;\n {\n address r_3_0_1_1_1_0_0 = 0xA389185832487EFA09361022Bb666e3dCf8b7Be6;\n r_3_0_1_1_1_0.s_0 = r_3_0_1_1_1_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_1_1_0_1;\n {\n bytes4 r_3_0_1_1_1_0_1_0 = bytes4(0x011e8376);\n r_3_0_1_1_1_0_1[0] = r_3_0_1_1_1_0_1_0;\n }\n {\n bytes4 r_3_0_1_1_1_0_1_1 = bytes4(0x448a44cb);\n r_3_0_1_1_1_0_1[1] = r_3_0_1_1_1_0_1_1;\n }\n r_3_0_1_1_1_0.s_1 = r_3_0_1_1_1_0_1;\n }\n {\n bool r_3_0_1_1_1_0_2 = false;\n r_3_0_1_1_1_0.s_2 = r_3_0_1_1_1_0_2;\n }\n r_3_0_1_1_1.s_0 = r_3_0_1_1_1_0;\n }\n {\n bool r_3_0_1_1_1_1 = true;\n r_3_0_1_1_1.s_1 = r_3_0_1_1_1_1;\n }\n {\n bool r_3_0_1_1_1_2 = true;\n r_3_0_1_1_1.s_2 = r_3_0_1_1_1_2;\n }\n {\n string memory r_3_0_1_1_1_3 = unicode\"Moo é🚀éMé🚀MoooM oooo🚀éoéoo oéé o MMo🚀🚀\";\n r_3_0_1_1_1.s_3 = r_3_0_1_1_1_3;\n }\n r_3_0_1_1[1] = r_3_0_1_1_1;\n }\n {\n S_2600ac1c memory r_3_0_1_1_2;\n {\n S_cbe5d844 memory r_3_0_1_1_2_0;\n {\n address r_3_0_1_1_2_0_0 = 0xC5784844d95155aC222C27FC9C0aCFDc9120B79F;\n r_3_0_1_1_2_0.s_0 = r_3_0_1_1_2_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_1_2_0_1;\n {\n bytes4 r_3_0_1_1_2_0_1_0 = bytes4(0x3c555fab);\n r_3_0_1_1_2_0_1[0] = r_3_0_1_1_2_0_1_0;\n }\n {\n bytes4 r_3_0_1_1_2_0_1_1 = bytes4(0x99f5cb2b);\n r_3_0_1_1_2_0_1[1] = r_3_0_1_1_2_0_1_1;\n }\n r_3_0_1_1_2_0.s_1 = r_3_0_1_1_2_0_1;\n }\n {\n bool r_3_0_1_1_2_0_2 = true;\n r_3_0_1_1_2_0.s_2 = r_3_0_1_1_2_0_2;\n }\n r_3_0_1_1_2.s_0 = r_3_0_1_1_2_0;\n }\n {\n bool r_3_0_1_1_2_1 = false;\n r_3_0_1_1_2.s_1 = r_3_0_1_1_2_1;\n }\n {\n bool r_3_0_1_1_2_2 = false;\n r_3_0_1_1_2.s_2 = r_3_0_1_1_2_2;\n }\n {\n string memory r_3_0_1_1_2_3 = unicode\"Moo é🚀M🚀o MoM🚀 o 🚀ooMéé🚀 🚀o o 🚀Mo MoM🚀\";\n r_3_0_1_1_2.s_3 = r_3_0_1_1_2_3;\n }\n r_3_0_1_1[2] = r_3_0_1_1_2;\n }\n {\n S_2600ac1c memory r_3_0_1_1_3;\n {\n S_cbe5d844 memory r_3_0_1_1_3_0;\n {\n address r_3_0_1_1_3_0_0 = 0x9C6Fd314070BaC441B96655E624368C044Fc9386;\n r_3_0_1_1_3_0.s_0 = r_3_0_1_1_3_0_0;\n }\n {\n bytes4[2] memory r_3_0_1_1_3_0_1;\n {\n bytes4 r_3_0_1_1_3_0_1_0 = bytes4(0x30956f49);\n r_3_0_1_1_3_0_1[0] = r_3_0_1_1_3_0_1_0;\n }\n {\n bytes4 r_3_0_1_1_3_0_1_1 = bytes4(0x1e1ffd12);\n r_3_0_1_1_3_0_1[1] = r_3_0_1_1_3_0_1_1;\n }\n r_3_0_1_1_3_0.s_1 = r_3_0_1_1_3_0_1;\n }\n {\n bool r_3_0_1_1_3_0_2 = true;\n r_3_0_1_1_3_0.s_2 = r_3_0_1_1_3_0_2;\n }\n r_3_0_1_1_3.s_0 = r_3_0_1_1_3_0;\n }\n {\n bool r_3_0_1_1_3_1 = false;\n r_3_0_1_1_3.s_1 = r_3_0_1_1_3_1;\n }\n {\n bool r_3_0_1_1_3_2 = false;\n r_3_0_1_1_3.s_2 = r_3_0_1_1_3_2;\n }\n {\n string memory r_3_0_1_1_3_3 = unicode\"Moo é🚀o🚀Mo o🚀o\";\n r_3_0_1_1_3.s_3 = r_3_0_1_1_3_3;\n }\n r_3_0_1_1[3] = r_3_0_1_1_3;\n }\n r_3_0_1[1] = r_3_0_1_1;\n }\n r_3_0.s_1 = r_3_0_1;\n }\n r_3[0] = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000002e937ec66d2a84df95abf70d3c5f60e6319b8400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a80c3a96f6fc3a9206f6ff09f9a80c3a920f09f9a806f4dc3a96f4df09f9a8020f09f9a806f20206f4d6f6f4d6f4d6fc3a96ff09f9a80f09f9a806f6f6ff09f9a80204d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020571fcb17d306a515b63760c952f3d264c004e9b94e745933b1755c3708e90000d2ff594ec9fd630e8151ba17254bb93555a6ce350dbccdfa871e383073ff0000391da0841cdcc0f7e1e24a97ba1b8485013a9667ce4caf59d5568f36528100000000000000000000000000004bb0830c8aedc3b6ce497f216be334c21bb4fc7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000480000000000000000000000000e8860cfdfc8cdbceccd26d9a5ebf70d275db44d1377bbea30000000000000000000000000000000000000000000000000000000024d6b1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a804d6f206ff09f9a804df09f9a80c3a920206f4d6f6ff09f9a80206f20c3a9c3a9206f6f4dc3a96f4df09f9a8020f09f9a80c3a90000000000000000000000000000002ce6c205b7d6bde8b4fd540f50855b4428ed999417cea387000000000000000000000000000000000000000000000000000000005cd2d06f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80f09f9a80204df09f9a806ff09f9a80c3a96f206f6f4d6f6f4df09f9a80f09f9a804d204d4d4d4d2020c3a96f6ff09f9a804d6f6f2000000000000000000000000000110345c4a49963ac64fd67abc04bffb8e4a94b7cbfb1033400000000000000000000000000000000000000000000000000000000625686b90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006d4d6f6f20c3a9f09f9a80c3a96f6ff09f9a806f6f6f4dc3a9f09f9a806f4d4d6fc3a9c3a9c3a9f09f9a804d6f4d6fc3a9c3a9f09f9a80c3a9c3a96ff09f9a80f09f9a80206f6ff09f9a80c3a96f6f2020c3a9202020f09f9a80c3a96f6f6ff09f9a806f6f6ff09f9a806f4d206f00000000000000000000000000000000000000000000000000000000000000dfb23c9496340e3dd3d2fa3e434a540a30fff3d6326f4bca0000000000000000000000000000000000000000000000000000000048015abf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80c3a94d6f6ff09f9a806f4dc3a96f20c3a94d20f09f9a8020c3a9f09f9a804dc3a96f206ff09f9a806f6fc3a9f09f9a80f09f9a80c3a94d6f6f4df09f9a804d4dc3a9f09f9a8020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000440000000000000000000000000a7aeb8a8527ec968674bcbe62db0b37871f0f98c40189c7e00000000000000000000000000000000000000000000000000000000bf06634f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a80206f4d4d4d6f6f2000000000000000000000000000000000000000000000a389185832487efa09361022bb666e3dcf8b7be6011e837600000000000000000000000000000000000000000000000000000000448a44cb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a80c3a94dc3a9f09f9a804d6f6f6f4d206f6f6f6ff09f9a80c3a96fc3a96f6f206fc3a9c3a9206f204d4d6ff09f9a80f09f9a8000000000000000000000000000000000c5784844d95155ac222c27fc9c0acfdc9120b79f3c555fab0000000000000000000000000000000000000000000000000000000099f5cb2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000454d6f6f20c3a9f09f9a804df09f9a806f20204d6f4df09f9a80206f2020f09f9a806f6f4dc3a9c3a9f09f9a8020f09f9a806f2020206f20f09f9a804d6f204d6f4df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000009c6fd314070bac441b96655e624368c044fc938630956f49000000000000000000000000000000000000000000000000000000001e1ffd120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a806ff09f9a804d6f2020206ff09f9a806f000000000000" + }, + { + "name": "random-((((uint104,bool,string,int72)),string[3],string,bool[])[],address,(bool,address,string,(int,string[]),bytes10))", + "type": "((((uint104,bool,string,int72)),string[3],string,bool[])[],address,(bool,address,string,(int,string[]),bytes10))", + "value": [ + [ + [ + [["404150106349524308203710232736", false, "Moo é🚀", "756364864453827873872"]], + [ + "Moo é🚀", + "Moo é🚀🚀oMoMoMMMMo🚀", + "Moo é🚀🚀🚀 🚀ooé🚀é🚀o éé o 🚀o oMMoé o oé " + ], + "Moo é🚀 🚀MMo", + [] + ], + [ + [ + [ + "4981296494736128120717006307409", + false, + "Moo é🚀🚀Mo", + "-1275144583251754845112" + ] + ], + [ + "Moo é🚀 🚀🚀éMéMoMoé 🚀 Mooooo é🚀éMé🚀 éoo🚀🚀 o é oé🚀ééééM🚀MM ", + "Moo é🚀MooooM éooMM éoMéo o", + "Moo é🚀o o Mooé o éoooé" + ], + "Moo é🚀éé 🚀Mo🚀éoM🚀M oé MoééM o", + [true, false] + ] + ], + "0x297dF168E011676A2b4CA54C0612223c0A68454B", + [ + false, + "0x683EBbD952BEDf7B01D0F5b8e42378c12dd4d0ec", + "Moo é🚀oMM oo M🚀🚀M🚀é🚀🚀 oooééé🚀éoéo oo éoooé🚀 oéMMéoo🚀ééoo éo", + [ + "56386597083436841200305139559528777523959107169871239099962171537470164590928", + [ + "Moo é🚀oMé🚀éM ooMéoo🚀 M ooMéMoo 🚀", + "Moo é🚀", + "Moo é🚀ooé MéooMé🚀éoooMMoooéooéé🚀 éoo🚀ooo🚀oMéoo ", + "Moo é🚀éooéoéo🚀 oé" + ] + ], + "0x2ec624da481d6877f6df" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "404150106349524308203710232736" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "756364864453827873872" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀oMoMoMMMMo🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀 🚀ooé🚀é🚀o éé o 🚀o oMMoé o oé " + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀MMo" + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4981296494736128120717006307409" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀Mo" + }, + { + "type": "number", + "value": "-1275144583251754845112" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀🚀éMéMoMoé 🚀 Mooooo é🚀éMé🚀 éoo🚀🚀 o é oé🚀ééééM🚀MM " + }, + { + "type": "string", + "value": "Moo é🚀MooooM éooMM éoMéo o" + }, + { + "type": "string", + "value": "Moo é🚀o o Mooé o éoooé" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éé 🚀Mo🚀éoM🚀M oé MoééM o" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x297dF168E011676A2b4CA54C0612223c0A68454B" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x683EBbD952BEDf7B01D0F5b8e42378c12dd4d0ec" + }, + { + "type": "string", + "value": "Moo é🚀oMM oo M🚀🚀M🚀é🚀🚀 oooééé🚀éoéo oo éoooé🚀 oéMMéoo🚀ééoo éo" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "56386597083436841200305139559528777523959107169871239099962171537470164590928" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMé🚀éM ooMéoo🚀 M ooMéMoo 🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀ooé MéooMé🚀éoooMMoooéooéé🚀 éoo🚀ooo🚀oMéoo " + }, + { + "type": "string", + "value": "Moo é🚀éooéoéo🚀 oé" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x2ec624da481d6877f6df" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610bf7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610899565b60405180910390f35b61005661060c565b61005e61060c565b60408051600280825260608201909252600091816020015b61007e610630565b81526020019060019003908161007657905050905061009b610630565b6040805160a0810182526000602082018181529282018190526060808301526080820152908152604080516080810182526000602080830182905260608385018181529084019283526c0519e121edb85831bc628cb8a084528451808601909552600a8552689adede418753e13f3560b71b9185019190915292909252682900abccd3f4e3cc5090915281528152610131610689565b604080518082018252600a8152689adede418753e13f3560b71b60208083019190915290835281518083018352601c81527f4d6f6f20c3a9f09f9a80f09f9a806f4d6f4d6f4d4d4d4d6ff09f9a80000000008183015283820152815160808101909252604280835260009291610a1b908301396040838101919091526020848101939093528051808201825260128152714d6f6f20c3a9f09f9a8020f09f9a804d4d6f60701b818501528482015280516000808252938101909152606084015250825182918491610204576102046109d2565b602002602001018190525050610218610630565b6040805160a0810182526000602082018181529282018190526060808301526080820152908152604080516080810182526000602080830182905260608385018181529084019283526c3edf6fe2c55dedd94209c7805184528451808601909552601085526f4d6f6f20c3a9f09f9a80f09f9a804d6f60801b91850191909152929092526845202f9a76405d83b719909152815281526102b6610689565b60006040518060a0016040528060658152602001610a5d606591398252506040805160608101909152602180825260009190610af36020830139602083810191909152604080518082018252601e81527f4d6f6f20c3a9f09f9a806f206f204d6f6fc3a9206f2020c3a96f6f6fc3a900008184015281850152848201939093528251606081019093526031808452600093925090610ac290830139604083810191909152805160028082526060820183526000935090916020830190803683370190505090506000600190508082600081518110610396576103966109d2565b60200260200101901515908115158152505050600080826001815181106103bf576103bf6109d2565b9115156020928302919091019091015250606082015281518190839060019081106103ec576103ec6109d2565b6020908102919091018101919091529183525073297df168e011676a2b4ca54c0612223c0a68454b908201526104206106b0565b600080825273683ebbd952bedf7b01d0f5b8e42378c12dd4d0ec6020808401919091526040805160a0810190915260658082529091610b5d9083013960408381019190915280518082018252606060208201527f7ca9aed72ea2ebb15225bedeaae730640795d7d2cdc519ce1c7c85609b7c615081528151600480825260a08201909352909250600091816020015b60608152602001906001900390816104af57905050905060006040518060600160405280603281526020016109e960329139905080826000815181106104f7576104f76109d2565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b8152509050808260018151811061053d5761053d6109d2565b6020026020010181905250506000604051806080016040528060498152602001610b14604991399050808260028151811061057a5761057a6109d2565b60200260200101819052505060006040518060400160405280601c81526020017f4d6f6f20c3a9f09f9a80c3a96f6fc3a96fc3a96ff09f9a80206fc3a900000000815250905080826003815181106105d4576105d46109d2565b602090810291909101810191909152830191909152506060820152692ec624da481d6877f6df60b01b60808201526040820152919050565b604080516060808201835281526000602082015290810161062b6106b0565b905290565b60405180608001604052806106686040805160a081018252600060208201818152928201819052606080830152608082015290815290565b8152602001610675610689565b815260200160608152602001606081525090565b60405180606001604052806003905b60608152602001906001900390816106985790505090565b6040518060a0016040528060001515815260200160006001600160a01b03168152602001606081526020016106f8604051806040016040528060008152602001606081525090565b8152600060209091015290565b6000815180845260005b8181101561072b5760208185018101518683018201520161070f565b8181111561073d576000602083870101525b50601f01601f19169290920160200192915050565b600082606081018360005b600381101561078c578383038752610776838351610705565b602097880197909350919091019060010161075d565b509095945050505050565b600081518084526020808501945080840160005b838110156107c95781511515875295820195908201906001016107ab565b509495945050505050565b8051151582526000602060018060a01b03818401511681850152604083015160a0604086015261080760a0860182610705565b606085810151878303888301528051835284015160408584018190528151908401819052929350840191600581901b840182019184019060005b8181101561086f57605f1986850301835261085d848651610705565b94870194935091860191600101610841565b5050506080860151935061088f60808801856001600160b01b0319169052565b9695505050505050565b60006020808352608080840185516060808588015282825180855260a094508489019150848160051b8a0101878501945060005b82811015610992578a8203609f1901845285518051898452518984018b905280516cffffffffffffffffffffffffff16898501528a810151151560c085015260408082015160e086018c9052610927610120870182610705565b9289015160080b61010087015250828c01518583038d8701529161094b8184610752565b92505080830151858303828701526109638382610705565b925050508682015191508381038785015261097e8183610797565b978b0197958b0195935050506001016108cd565b50968a01516001600160a01b03811660408b01529660408b01518a8203601f1901858c015297506109c381896107d4565b9b9a5050505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4dc3a9f09f9a80c3a94d206f6f4dc3a96f6ff09f9a8020204d206f6f4dc3a94d6f6f20f09f9a804d6f6f20c3a9f09f9a80f09f9a80f09f9a8020f09f9a806f6fc3a9f09f9a80c3a9f09f9a806f2020c3a9c3a9206f20f09f9a806f206f4d4d6fc3a9206f206fc3a9204d6f6f20c3a9f09f9a8020f09f9a80f09f9a80c3a94dc3a94d6f4d6fc3a920f09f9a8020204d6f6f6f6f6f20c3a9f09f9a80c3a94dc3a9f09f9a8020c3a96f6ff09f9a80f09f9a80206f20c3a9206fc3a9f09f9a80c3a9c3a9c3a9c3a94df09f9a804d4d204d6f6f20c3a9f09f9a80c3a9c3a920f09f9a804d6ff09f9a80c3a96f4df09f9a804d20206fc3a9204d6fc3a9c3a94d206f4d6f6f20c3a9f09f9a804d6f6f6f6f4d20c3a96f6f4d4d20c3a96f4dc3a96f206f4d6f6f20c3a9f09f9a806f6fc3a920204dc3a96f6f4dc3a9f09f9a80c3a96f6f6f4d4d6f6f6fc3a96f6fc3a9c3a9f09f9a8020c3a96f6ff09f9a806f6f6ff09f9a806f4dc3a96f6f204d6f6f20c3a9f09f9a806f4d4d206f6f204df09f9a80f09f9a804df09f9a80c3a9f09f9a80f09f9a80206f6f6fc3a9c3a9c3a9f09f9a80c3a96fc3a96f206f6f20c3a96f6f6fc3a9f09f9a8020206fc3a94d4dc3a96f6ff09f9a80c3a9c3a96f6f20c3a96fa264697066735822122024df8b8a8e07305c14b685ff50b207422e0d6a156ba2d24c271f8287622bc26a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_eb70fad8 {\n uint104 s_0;\n bool s_1;\n string s_2;\n int72 s_3;\n }\n\n struct S_4d17aa14 {\n S_eb70fad8 s_0;\n }\n\n struct S_763a9ffd {\n S_4d17aa14 s_0;\n string[3] s_1;\n string s_2;\n bool[] s_3;\n }\n\n struct S_04eee440 {\n int256 s_0;\n string[] s_1;\n }\n\n struct S_60cad417 {\n bool s_0;\n address s_1;\n string s_2;\n S_04eee440 s_3;\n bytes10 s_4;\n }\n\n struct S_f337e842 {\n S_763a9ffd[] s_0;\n address s_1;\n S_60cad417 s_2;\n }\n\n function test () public pure returns (S_f337e842 memory) {\n S_f337e842 memory r;\n {\n S_763a9ffd[] memory r_0 = new S_763a9ffd[](2);\n {\n S_763a9ffd memory r_0_0;\n {\n S_4d17aa14 memory r_0_0_0;\n {\n S_eb70fad8 memory r_0_0_0_0;\n {\n uint104 r_0_0_0_0_0 = 404150106349524308203710232736;\n r_0_0_0_0.s_0 = r_0_0_0_0_0;\n }\n {\n bool r_0_0_0_0_1 = false;\n r_0_0_0_0.s_1 = r_0_0_0_0_1;\n }\n {\n string memory r_0_0_0_0_2 = unicode\"Moo é🚀\";\n r_0_0_0_0.s_2 = r_0_0_0_0_2;\n }\n {\n int72 r_0_0_0_0_3 = 756364864453827873872;\n r_0_0_0_0.s_3 = r_0_0_0_0_3;\n }\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string[3] memory r_0_0_1;\n {\n string memory r_0_0_1_0 = unicode\"Moo é🚀\";\n r_0_0_1[0] = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀🚀oMoMoMMMMo🚀\";\n r_0_0_1[1] = r_0_0_1_1;\n }\n {\n string memory r_0_0_1_2 = unicode\"Moo é🚀🚀🚀 🚀ooé🚀é🚀o éé o 🚀o oMMoé o oé \";\n r_0_0_1[2] = r_0_0_1_2;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀 🚀MMo\";\n r_0_0.s_2 = r_0_0_2;\n }\n {\n bool[] memory r_0_0_3 = new bool[](0);\n r_0_0.s_3 = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n S_763a9ffd memory r_0_1;\n {\n S_4d17aa14 memory r_0_1_0;\n {\n S_eb70fad8 memory r_0_1_0_0;\n {\n uint104 r_0_1_0_0_0 = 4981296494736128120717006307409;\n r_0_1_0_0.s_0 = r_0_1_0_0_0;\n }\n {\n bool r_0_1_0_0_1 = false;\n r_0_1_0_0.s_1 = r_0_1_0_0_1;\n }\n {\n string memory r_0_1_0_0_2 = unicode\"Moo é🚀🚀Mo\";\n r_0_1_0_0.s_2 = r_0_1_0_0_2;\n }\n {\n int72 r_0_1_0_0_3 = -1275144583251754845112;\n r_0_1_0_0.s_3 = r_0_1_0_0_3;\n }\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n {\n string[3] memory r_0_1_1;\n {\n string memory r_0_1_1_0 = unicode\"Moo é🚀 🚀🚀éMéMoMoé 🚀 Mooooo é🚀éMé🚀 éoo🚀🚀 o é oé🚀ééééM🚀MM \";\n r_0_1_1[0] = r_0_1_1_0;\n }\n {\n string memory r_0_1_1_1 = unicode\"Moo é🚀MooooM éooMM éoMéo o\";\n r_0_1_1[1] = r_0_1_1_1;\n }\n {\n string memory r_0_1_1_2 = unicode\"Moo é🚀o o Mooé o éoooé\";\n r_0_1_1[2] = r_0_1_1_2;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n string memory r_0_1_2 = unicode\"Moo é🚀éé 🚀Mo🚀éoM🚀M oé MoééM o\";\n r_0_1.s_2 = r_0_1_2;\n }\n {\n bool[] memory r_0_1_3 = new bool[](2);\n {\n bool r_0_1_3_0 = true;\n r_0_1_3[0] = r_0_1_3_0;\n }\n {\n bool r_0_1_3_1 = false;\n r_0_1_3[1] = r_0_1_3_1;\n }\n r_0_1.s_3 = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x297dF168E011676A2b4CA54C0612223c0A68454B;\n r.s_1 = r_1;\n }\n {\n S_60cad417 memory r_2;\n {\n bool r_2_0 = false;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x683EBbD952BEDf7B01D0F5b8e42378c12dd4d0ec;\n r_2.s_1 = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀oMM oo M🚀🚀M🚀é🚀🚀 oooééé🚀éoéo oo éoooé🚀 oéMMéoo🚀ééoo éo\";\n r_2.s_2 = r_2_2;\n }\n {\n S_04eee440 memory r_2_3;\n {\n int r_2_3_0 = 56386597083436841200305139559528777523959107169871239099962171537470164590928;\n r_2_3.s_0 = r_2_3_0;\n }\n {\n string[] memory r_2_3_1 = new string[](4);\n {\n string memory r_2_3_1_0 = unicode\"Moo é🚀oMé🚀éM ooMéoo🚀 M ooMéMoo 🚀\";\n r_2_3_1[0] = r_2_3_1_0;\n }\n {\n string memory r_2_3_1_1 = unicode\"Moo é🚀\";\n r_2_3_1[1] = r_2_3_1_1;\n }\n {\n string memory r_2_3_1_2 = unicode\"Moo é🚀ooé MéooMé🚀éoooMMoooéooéé🚀 éoo🚀ooo🚀oMéoo \";\n r_2_3_1[2] = r_2_3_1_2;\n }\n {\n string memory r_2_3_1_3 = unicode\"Moo é🚀éooéoéo🚀 oé\";\n r_2_3_1[3] = r_2_3_1_3;\n }\n r_2_3.s_1 = r_2_3_1;\n }\n r_2.s_3 = r_2_3;\n }\n {\n bytes10 r_2_4 = bytes10(0x2ec624da481d6877f6df);\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000297df168e011676a2b4ca54c0612223c0a68454b00000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000519e121edb85831bc628cb8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000002900abccd3f4e3cc50000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80f09f9a806f4d6f4d6f4d4d4d4d6ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80f09f9a80f09f9a8020f09f9a806f6fc3a9f09f9a80c3a9f09f9a806f2020c3a9c3a9206f20f09f9a806f206f4d4d6fc3a9206f206fc3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a8020f09f9a804d4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000003edf6fe2c55dedd94209c7805100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffffffffffffffffbadfd06589bfa27c4800000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80f09f9a804d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a8020f09f9a80f09f9a80c3a94dc3a94d6f4d6fc3a920f09f9a8020204d6f6f6f6f6f20c3a9f09f9a80c3a94dc3a9f09f9a8020c3a96f6ff09f9a80f09f9a80206f20c3a9206fc3a9f09f9a80c3a9c3a9c3a9c3a94df09f9a804d4d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a804d6f6f6f6f4d20c3a96f6f4d4d20c3a96f4dc3a96f206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a806f206f204d6f6fc3a9206f2020c3a96f6f6fc3a9000000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a80c3a9c3a920f09f9a804d6ff09f9a80c3a96f4df09f9a804d20206fc3a9204d6fc3a9c3a94d206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000683ebbd952bedf7b01d0f5b8e42378c12dd4d0ec00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001402ec624da481d6877f6df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a806f4d4d206f6f204df09f9a80f09f9a804df09f9a80c3a9f09f9a80f09f9a80206f6f6fc3a9c3a9c3a9f09f9a80c3a96fc3a96f206f6f20c3a96f6f6fc3a9f09f9a8020206fc3a94d4dc3a96f6ff09f9a80c3a9c3a96f6f20c3a96f0000000000000000000000000000000000000000000000000000007ca9aed72ea2ebb15225bedeaae730640795d7d2cdc519ce1c7c85609b7c615000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a806f4dc3a9f09f9a80c3a94d206f6f4dc3a96f6ff09f9a8020204d206f6f4dc3a94d6f6f20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a806f6fc3a920204dc3a96f6f4dc3a9f09f9a80c3a96f6f6f4d4d6f6f6fc3a96f6fc3a9c3a9f09f9a8020c3a96f6ff09f9a806f6f6ff09f9a806f4dc3a96f6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80c3a96f6fc3a96fc3a96ff09f9a80206fc3a900000000" + }, + { + "name": "random-(uint8,bytes21,bytes9[1],uint,(string,address[1],((bytes6,string,(string)[][4]),string,(uint16))[1],bytes6,uint152))", + "type": "(uint8,bytes21,bytes9[1],uint,(string,address[1],((bytes6,string,(string)[][4]),string,(uint16))[1],bytes6,uint152))", + "value": [ + "85", + "0xf2e63a62147f1b81d1947e8c6e3f318cf562d1ae76", + ["0xfdda8916adbf38c486"], + "3075903312148500504168904248259152309375262875677038196822495383751846552920", + [ + "Moo é🚀M oé oo ééMé🚀ooo🚀éMo🚀éoMooo oo MM🚀 o éoMoé🚀ooéoooo o o 🚀", + ["0x3B75a8Fc3E2dA0247228147D0ce83493eCA7B0f7"], + [ + [ + [ + "0x8b71d11dc6d7", + "Moo é🚀éo ooéMMéo🚀🚀o🚀o é🚀o oooo oMooo🚀éo🚀MoMM", + [[], [["Moo é🚀"], ["Moo é🚀"]], [], [["Moo é🚀"]]] + ], + "Moo é🚀Mo🚀MooooéMéé", + ["25106"] + ] + ], + "0x034a3db9c844", + "1385407973241408890692723962938071587076343272" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "85" + }, + { + "type": "hexstring", + "value": "0xf2e63a62147f1b81d1947e8c6e3f318cf562d1ae76" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfdda8916adbf38c486" + } + ] + }, + { + "type": "number", + "value": "3075903312148500504168904248259152309375262875677038196822495383751846552920" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M oé oo ééMé🚀ooo🚀éMo🚀éoMooo oo MM🚀 o éoMoé🚀ooéoooo o o 🚀" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3B75a8Fc3E2dA0247228147D0ce83493eCA7B0f7" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8b71d11dc6d7" + }, + { + "type": "string", + "value": "Moo é🚀éo ooéMMéo🚀🚀o🚀o é🚀o oooo oMooo🚀éo🚀MoMM" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀MooooéMéé" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "25106" + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x034a3db9c844" + }, + { + "type": "number", + "value": "1385407973241408890692723962938071587076343272" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506108d9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061075f565b60405180910390f35b6100566103f4565b61005e6103f4565b605581527479731d310a3f8dc0e8ca3f46371f98c67ab168d73b60591b602082015261008861042c565b687eed448b56df9c624360b91b815260408201527f06cce64ad7e9bcb22897b2640ca98b5b5e3f4913b8dca1ea522c366be7e8655860608201526100ca61044a565b60006040518060800160405280605d81526020016107fe605d91398252506100f061042c565b733b75a8fc3e2da0247228147d0ce83493eca7b0f781526020820152610114610485565b61011c6104b2565b6101246104eb565b658b71d11dc6d760d01b8152604080516080810190915260498082526000919061085b602083013960208301525061015a610506565b6040805160008082526020820190925281610192565b6040805160208101909152606081528152602001906001900390816101705790505b5082525060408051600280825260608201909252600091816020015b6040805160208101909152606081528152602001906001900390816101ae57505060408051602081019091526060815290915060408051808201909152600a8152689adede418753e13f3560b71b60208201528152815181908390600090610218576102186107e7565b60200260200101819052505061023a6040518060200160405280606081525090565b60408051808201909152600a8152689adede418753e13f3560b71b602082015281528151819083906001908110610273576102736107e7565b6020908102919091018101919091528381019290925250604080516000808252928101909152816102c1565b60408051602081019091526060815281526020019060019003908161029f5790505b50604080840191909152805160018082528183019092526000925090816020015b6040805160208101909152606081528152602001906001900390816102e257505060408051602081019091526060815290915060408051808201909152600a8152689adede418753e13f3560b71b6020820152815281518190839060009061034c5761034c6107e7565b6020908102919091018101919091526060808501939093526040858101949094529385525081518083018352601c81527f4d6f6f20c3a9f09f9a804d6ff09f9a804d6f6f6f6fc3a94dc3a9c3a9000000008185015284840152815192830182526162128352838201929092529183529083019190915264d28f6e721160d21b90820152723e1fb41d85d891e4e774a630a54937f13a85e8608080830191909152820152919050565b6040805160a0810182526000808252602082015290810161041361042c565b81526020016000815260200161042761044a565b905290565b60405180602001604052806001906020820280368337509192915050565b6040518060a001604052806060815260200161046461042c565b8152602001610471610485565b815260006020820181905260409091015290565b60405180602001604052806001905b61049c6104b2565b8152602001906001900390816104945790505090565b60405180606001604052806104c56104eb565b8152602001606081526020016104276040518060200160405280600061ffff1681525090565b60408051606080820183526000825260208201529081016104275b60405180608001604052806004905b60608152602001906001900390816105155790505090565b6000815180845260005b8181101561055357602081850181015186830182015201610537565b81811115610565576000602083870101525b50601f01601f19169290920160200192915050565b6000815160a0845261058f60a085018261052d565b905060208301516020850160005b60018110156105c55782516001600160a01b031682526020928301929091019060010161059d565b50505060408301518482036040860152818290506020830160005b600181101561070f578482038352835180516060845265ffffffffffff60d01b815116606085015260208101516060608086015261062160c086018261052d565b60409290920151858303605f190160a0870152919050806080810160005b60048110156106c2578382038352845180518084526020918201918085019190600582901b86010160005b828110156106a557601f198783030184528451516020835261068f602084018261052d565b602096870196959095019492505060010161066a565b50602098890198969096019594505050600191909101905061063f565b506020850151935086810360208801526106dc818561052d565b9350505050604082015191506106f960408501835161ffff169052565b60209586019594909401939250506001016105e0565b506060860151935061072d60608801856001600160d01b0319169052565b60808601519350610755608088018572ffffffffffffffffffffffffffffffffffffff169052565b9695505050505050565b6000602080835260ff845116818401526affffffffffffffffffffff198185015116604084015260408401516060840160005b60018110156107b95782516001600160b81b03191682529183019190830190600101610792565b5050505060608301516080830152608083015160a0808401526107df60c084018261057a565b949350505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d206fc3a9206f6f20c3a9c3a94dc3a9f09f9a806f6f6ff09f9a80c3a94d6ff09f9a80c3a96f4d6f6f6f206f6f204d4df09f9a80206f20c3a96f4d6fc3a9f09f9a806f6fc3a96f6f6f6f206f206f20f09f9a804d6f6f20c3a9f09f9a80c3a96f206f6fc3a94d4dc3a96ff09f9a80f09f9a806ff09f9a806f2020c3a9f09f9a806f20206f6f6f6f206f4d6f6f6ff09f9a80c3a96ff09f9a804d6f4d4da2646970667358221220d90f2ba466c9b55f33782ff0b420022769cae0aeecfe9c16c2a6cb2eb46d2f8364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_ecb2d3e4 {\n bytes6 s_0;\n string s_1;\n S_97fc4627[][4] s_2;\n }\n\n struct S_267213ef {\n uint16 s_0;\n }\n\n struct S_c29a59f0 {\n S_ecb2d3e4 s_0;\n string s_1;\n S_267213ef s_2;\n }\n\n struct S_eee93bbd {\n string s_0;\n address[1] s_1;\n S_c29a59f0[1] s_2;\n bytes6 s_3;\n uint152 s_4;\n }\n\n struct S_d365fbcd {\n uint8 s_0;\n bytes21 s_1;\n bytes9[1] s_2;\n uint256 s_3;\n S_eee93bbd s_4;\n }\n\n function test () public pure returns (S_d365fbcd memory) {\n S_d365fbcd memory r;\n {\n uint8 r_0 = 85;\n r.s_0 = r_0;\n }\n {\n bytes21 r_1 = bytes21(0xf2e63a62147f1b81d1947e8c6e3f318cf562d1ae76);\n r.s_1 = r_1;\n }\n {\n bytes9[1] memory r_2;\n {\n bytes9 r_2_0 = bytes9(0xfdda8916adbf38c486);\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n uint r_3 = 3075903312148500504168904248259152309375262875677038196822495383751846552920;\n r.s_3 = r_3;\n }\n {\n S_eee93bbd memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀M oé oo ééMé🚀ooo🚀éMo🚀éoMooo oo MM🚀 o éoMoé🚀ooéoooo o o 🚀\";\n r_4.s_0 = r_4_0;\n }\n {\n address[1] memory r_4_1;\n {\n address r_4_1_0 = 0x3B75a8Fc3E2dA0247228147D0ce83493eCA7B0f7;\n r_4_1[0] = r_4_1_0;\n }\n r_4.s_1 = r_4_1;\n }\n {\n S_c29a59f0[1] memory r_4_2;\n {\n S_c29a59f0 memory r_4_2_0;\n {\n S_ecb2d3e4 memory r_4_2_0_0;\n {\n bytes6 r_4_2_0_0_0 = bytes6(0x8b71d11dc6d7);\n r_4_2_0_0.s_0 = r_4_2_0_0_0;\n }\n {\n string memory r_4_2_0_0_1 = unicode\"Moo é🚀éo ooéMMéo🚀🚀o🚀o é🚀o oooo oMooo🚀éo🚀MoMM\";\n r_4_2_0_0.s_1 = r_4_2_0_0_1;\n }\n {\n S_97fc4627[][4] memory r_4_2_0_0_2;\n {\n S_97fc4627[] memory r_4_2_0_0_2_0 = new S_97fc4627[](0);\n r_4_2_0_0_2[0] = r_4_2_0_0_2_0;\n }\n {\n S_97fc4627[] memory r_4_2_0_0_2_1 = new S_97fc4627[](2);\n {\n S_97fc4627 memory r_4_2_0_0_2_1_0;\n {\n string memory r_4_2_0_0_2_1_0_0 = unicode\"Moo é🚀\";\n r_4_2_0_0_2_1_0.s_0 = r_4_2_0_0_2_1_0_0;\n }\n r_4_2_0_0_2_1[0] = r_4_2_0_0_2_1_0;\n }\n {\n S_97fc4627 memory r_4_2_0_0_2_1_1;\n {\n string memory r_4_2_0_0_2_1_1_0 = unicode\"Moo é🚀\";\n r_4_2_0_0_2_1_1.s_0 = r_4_2_0_0_2_1_1_0;\n }\n r_4_2_0_0_2_1[1] = r_4_2_0_0_2_1_1;\n }\n r_4_2_0_0_2[1] = r_4_2_0_0_2_1;\n }\n {\n S_97fc4627[] memory r_4_2_0_0_2_2 = new S_97fc4627[](0);\n r_4_2_0_0_2[2] = r_4_2_0_0_2_2;\n }\n {\n S_97fc4627[] memory r_4_2_0_0_2_3 = new S_97fc4627[](1);\n {\n S_97fc4627 memory r_4_2_0_0_2_3_0;\n {\n string memory r_4_2_0_0_2_3_0_0 = unicode\"Moo é🚀\";\n r_4_2_0_0_2_3_0.s_0 = r_4_2_0_0_2_3_0_0;\n }\n r_4_2_0_0_2_3[0] = r_4_2_0_0_2_3_0;\n }\n r_4_2_0_0_2[3] = r_4_2_0_0_2_3;\n }\n r_4_2_0_0.s_2 = r_4_2_0_0_2;\n }\n r_4_2_0.s_0 = r_4_2_0_0;\n }\n {\n string memory r_4_2_0_1 = unicode\"Moo é🚀Mo🚀MooooéMéé\";\n r_4_2_0.s_1 = r_4_2_0_1;\n }\n {\n S_267213ef memory r_4_2_0_2;\n {\n uint16 r_4_2_0_2_0 = 25106;\n r_4_2_0_2.s_0 = r_4_2_0_2_0;\n }\n r_4_2_0.s_2 = r_4_2_0_2;\n }\n r_4_2[0] = r_4_2_0;\n }\n r_4.s_2 = r_4_2;\n }\n {\n bytes6 r_4_3 = bytes6(0x034a3db9c844);\n r_4.s_3 = r_4_3;\n }\n {\n uint152 r_4_4 = 1385407973241408890692723962938071587076343272;\n r_4.s_4 = r_4_4;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000055f2e63a62147f1b81d1947e8c6e3f318cf562d1ae760000000000000000000000fdda8916adbf38c486000000000000000000000000000000000000000000000006cce64ad7e9bcb22897b2640ca98b5b5e3f4913b8dca1ea522c366be7e8655800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000003b75a8fc3e2da0247228147d0ce83493eca7b0f70000000000000000000000000000000000000000000000000000000000000120034a3db9c8440000000000000000000000000000000000000000000000000000000000000000000000000000003e1fb41d85d891e4e774a630a54937f13a85e8000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a804d206fc3a9206f6f20c3a9c3a94dc3a9f09f9a806f6f6ff09f9a80c3a94d6ff09f9a80c3a96f4d6f6f6f206f6f204d4df09f9a80206f20c3a96f4d6fc3a9f09f9a806f6fc3a96f6f6f6f206f206f20f09f9a800000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000062128b71d11dc6d70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a80c3a96f206f6fc3a94d4dc3a96ff09f9a80f09f9a806ff09f9a806f2020c3a9f09f9a806f20206f6f6f6f206f4d6f6f6ff09f9a80c3a96ff09f9a804d6f4d4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a804d6ff09f9a804d6f6f6f6fc3a94dc3a9c3a900000000" + }, + { + "name": "random-(((uint240,string,(bool,address,string,uint112),bytes32[3],uint24),address[]),bool,(bytes11,string[3][2]),address[2],address)", + "type": "(((uint240,string,(bool,address,string,uint112),bytes32[3],uint24),address[]),bool,(bytes11,string[3][2]),address[2],address)", + "value": [ + [ + [ + "1499762057607264398106530864280212138189547998353071823019925912593234919", + "Moo é🚀oMooMééo 🚀oo", + [ + true, + "0x7e0658d1875Da228fE51349BBe8948630292fb05", + "Moo é🚀o🚀🚀oM🚀 o oM🚀 ooMooéo🚀ééé M🚀 🚀🚀ooooMoooéMMM🚀🚀o Mo", + "1152110887042683611540513446938977" + ], + [ + "0x6dbee3b878906ec4971990fd64219c0c4c3f737306502c9c17704fecc82fec82", + "0xe018cbf7296817e2b64eb728fe88452b3a5ad7b2ca2bb81b785ba15ff342d492", + "0x7f9d3abb85ef4a854a51c61d96210ddd460ec7f53861b32b454ead8e973c0a3f" + ], + "14671876" + ], + [] + ], + false, + [ + "0x3870e2d7f3da95b45b24f4", + [ + ["Moo é🚀🚀o é🚀o🚀 Mo ", "Moo é🚀", "Moo é🚀oéMoo🚀🚀 éé"], + [ + "Moo é🚀🚀éo 🚀ééoooé🚀éoo🚀🚀 ooMé M🚀éo 🚀oMo oo🚀oo MMM oé", + "Moo é🚀oMééoMoo Moéo oéé oéo o🚀oooé Moéééooo é", + "Moo é🚀" + ] + ] + ], + [ + "0x1783BB84dF43311b866409068FaC2343E38F1a0F", + "0x4A2331d6C695212DB411695F866107cADd30a4CF" + ], + "0x135Ef9ffbA9a6b4A9A36DdF13571D7e26d72e351" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1499762057607264398106530864280212138189547998353071823019925912593234919" + }, + { + "type": "string", + "value": "Moo é🚀oMooMééo 🚀oo" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x7e0658d1875Da228fE51349BBe8948630292fb05" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀oM🚀 o oM🚀 ooMooéo🚀ééé M🚀 🚀🚀ooooMoooéMMM🚀🚀o Mo" + }, + { + "type": "number", + "value": "1152110887042683611540513446938977" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6dbee3b878906ec4971990fd64219c0c4c3f737306502c9c17704fecc82fec82" + }, + { + "type": "hexstring", + "value": "0xe018cbf7296817e2b64eb728fe88452b3a5ad7b2ca2bb81b785ba15ff342d492" + }, + { + "type": "hexstring", + "value": "0x7f9d3abb85ef4a854a51c61d96210ddd460ec7f53861b32b454ead8e973c0a3f" + } + ] + }, + { + "type": "number", + "value": "14671876" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3870e2d7f3da95b45b24f4" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o é🚀o🚀 Mo " + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oéMoo🚀🚀 éé" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éo 🚀ééoooé🚀éoo🚀🚀 ooMé M🚀éo 🚀oMo oo🚀oo MMM oé" + }, + { + "type": "string", + "value": "Moo é🚀oMééoMoo Moéo oéé oéo o🚀oooé Moéééooo é" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1783BB84dF43311b866409068FaC2343E38F1a0F" + }, + { + "type": "address", + "value": "0x4A2331d6C695212DB411695F866107cADd30a4CF" + } + ] + }, + { + "type": "address", + "value": "0x135Ef9ffbA9a6b4A9A36DdF13571D7e26d72e351" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506108ea806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610648565b60405180910390f35b610056610373565b61005e610373565b6100666103b4565b61006e6103d4565b7dd94d443874a5952bc8b050b002970f78eaace69f52ac72352b971fcdfbe78152604080518082018252601b81527f4d6f6f20c3a9f09f9a806f4d6f6f4dc3a9c3a96f20f09f9a806f6f0000000000602080830191909152808401919091528151608080820184526060828501819052600090830181905260018352737e0658d1875da228fe51349bbe8948630292fb05838501528451918201909452605e808252919392909190610857908301396040808401919091526d38cdaf0d45e1f568584602cfc961606084015283019190915250610149610420565b7f6dbee3b878906ec4971990fd64219c0c4c3f737306502c9c17704fecc82fec8281527fe018cbf7296817e2b64eb728fe88452b3a5ad7b2ca2bb81b785ba15ff342d4926020808301919091527f7f9d3abb85ef4a854a51c61d96210ddd460ec7f53861b32b454ead8e973c0a3f604080840191909152606084019290925262dfe004608084015291835280516000808252818401909252838301529183528201526101f361043e565b6a0e1c38b5fcf6a56d16c93d60aa1b815261020c61045d565b61021461048a565b600060405180606001604052806023815260200161083460239139825250604080518082018252600a8152689adede418753e13f3560b71b6020808301919091528084019190915281518083018352601d81527f4d6f6f20c3a9f09f9a806fc3a94d6f6ff09f9a80f09f9a8020c3a9c3a90000009181019190915290820152815261029d61048a565b60006040518060800160405280605c8152602001610799605c91398252506040805160608101909152603f808252600091906107f56020830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b8184015281850152848201939093528401929092528301919091525061031e6104b1565b731783bb84df43311b866409068fac2343e38f1a0f8152734a2331d6c695212db411695f866107cadd30a4cf6020820152606082015273135ef9ffba9a6b4a9a36ddf13571d7e26d72e3516080820152919050565b6040518060a001604052806103866103b4565b81526000602082015260400161039a61043e565b81526020016103a76104b1565b8152600060209091015290565b60405180604001604052806103c76103d4565b8152602001606081525090565b6040805160a08101825260008152606060208201529081016104176040805160808101825260008082526020820181905260609282018390529181019190915290565b81526020016103a75b60405180606001604052806003906020820280368337509192915050565b60408051808201909152600081526020810161045861045d565b905290565b60405180604001604052806002905b61047461048a565b81526020019060019003908161046c5790505090565b60405180606001604052806003905b60608152602001906001900390816104995790505090565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156104f5576020818501810151868301820152016104d9565b81811115610507576000602083870101525b50601f01601f19169290920160200192915050565b8060005b600381101561053f578151845260209384019390910190600101610520565b50505050565b600081518084526020808501945080840160005b8381101561057e5781516001600160a01b031687529582019590820190600101610559565b509495945050505050565b80516001600160a81b0319168252602080820151604082850181905260009260808601929091860184805b600281101561060f57888603603f1901835283518660608101845b60038110156105fa5789820383526105e88285516104cf565b938901939289019291506001016105cf565b509750505092840192918401916001016105b4565b5093979650505050505050565b8060005b600281101561053f5781516001600160a01b0316845260209384019390910190600101610620565b60006020808352835160c082850152805160408060e087015260018060f01b038251166101208701528382015160e061014088015261068b6102008801826104cf565b90508183015161011f198883030161016089015280511515825260018060a01b03868201511686830152828101516080848401526106cc60808401826104cf565b90506dffffffffffffffffffffffffffff6060830151166060840152606085015192506106fd6101808a018461051c565b608085015194506107166101e08a018662ffffff169052565b9486015188860360df19016101008a0152946107328187610545565b968a01518015158a86015296955061074992505050565b860151858303601f19016060870152925061076690508183610589565b915050606084015161077b608085018261061c565b5060808401516001600160a01b03811660c085015250939250505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a96f20f09f9a80c3a9c3a96f6f6fc3a9f09f9a80c3a96f6ff09f9a80f09f9a80206f6f4dc3a920204df09f9a80c3a96f2020f09f9a806f4d6f20206f6ff09f9a806f6f2020204d4d4d206fc3a94d6f6f20c3a9f09f9a806f4dc3a9c3a96f4d6f6f204d6fc3a96f206fc3a9c3a9206fc3a96f206ff09f9a806f6f6fc3a9204d6fc3a9c3a9c3a96f6f6f20c3a94d6f6f20c3a9f09f9a80f09f9a806f20c3a9f09f9a806ff09f9a8020202020204d6f204d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f4df09f9a80206f206f4df09f9a8020206f6f4d6f6fc3a96ff09f9a80c3a9c3a9c3a9204df09f9a8020f09f9a80f09f9a806f6f6f6f4d6f6f6fc3a94d4d4df09f9a80f09f9a806f204d6fa2646970667358221220503054324522d5c58a2747b1908c3ed60eec1c353c16b032ccf01c08a277a88864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_920e3d3c {\n bool s_0;\n address s_1;\n string s_2;\n uint112 s_3;\n }\n\n struct S_bbee8fbb {\n uint240 s_0;\n string s_1;\n S_920e3d3c s_2;\n bytes32[3] s_3;\n uint24 s_4;\n }\n\n struct S_70cfb21a {\n S_bbee8fbb s_0;\n address[] s_1;\n }\n\n struct S_7e383224 {\n bytes11 s_0;\n string[3][2] s_1;\n }\n\n struct S_ceb699f4 {\n S_70cfb21a s_0;\n bool s_1;\n S_7e383224 s_2;\n address[2] s_3;\n address s_4;\n }\n\n function test () public pure returns (S_ceb699f4 memory) {\n S_ceb699f4 memory r;\n {\n S_70cfb21a memory r_0;\n {\n S_bbee8fbb memory r_0_0;\n {\n uint240 r_0_0_0 = 1499762057607264398106530864280212138189547998353071823019925912593234919;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n string memory r_0_0_1 = unicode\"Moo é🚀oMooMééo 🚀oo\";\n r_0_0.s_1 = r_0_0_1;\n }\n {\n S_920e3d3c memory r_0_0_2;\n {\n bool r_0_0_2_0 = true;\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n address r_0_0_2_1 = 0x7e0658d1875Da228fE51349BBe8948630292fb05;\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n {\n string memory r_0_0_2_2 = unicode\"Moo é🚀o🚀🚀oM🚀 o oM🚀 ooMooéo🚀ééé M🚀 🚀🚀ooooMoooéMMM🚀🚀o Mo\";\n r_0_0_2.s_2 = r_0_0_2_2;\n }\n {\n uint112 r_0_0_2_3 = 1152110887042683611540513446938977;\n r_0_0_2.s_3 = r_0_0_2_3;\n }\n r_0_0.s_2 = r_0_0_2;\n }\n {\n bytes32[3] memory r_0_0_3;\n {\n bytes32 r_0_0_3_0 = bytes32(0x6dbee3b878906ec4971990fd64219c0c4c3f737306502c9c17704fecc82fec82);\n r_0_0_3[0] = r_0_0_3_0;\n }\n {\n bytes32 r_0_0_3_1 = bytes32(0xe018cbf7296817e2b64eb728fe88452b3a5ad7b2ca2bb81b785ba15ff342d492);\n r_0_0_3[1] = r_0_0_3_1;\n }\n {\n bytes32 r_0_0_3_2 = bytes32(0x7f9d3abb85ef4a854a51c61d96210ddd460ec7f53861b32b454ead8e973c0a3f);\n r_0_0_3[2] = r_0_0_3_2;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n {\n uint24 r_0_0_4 = 14671876;\n r_0_0.s_4 = r_0_0_4;\n }\n r_0.s_0 = r_0_0;\n }\n {\n address[] memory r_0_1 = new address[](0);\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n bool r_1 = false;\n r.s_1 = r_1;\n }\n {\n S_7e383224 memory r_2;\n {\n bytes11 r_2_0 = bytes11(0x3870e2d7f3da95b45b24f4);\n r_2.s_0 = r_2_0;\n }\n {\n string[3][2] memory r_2_1;\n {\n string[3] memory r_2_1_0;\n {\n string memory r_2_1_0_0 = unicode\"Moo é🚀🚀o é🚀o🚀 Mo \";\n r_2_1_0[0] = r_2_1_0_0;\n }\n {\n string memory r_2_1_0_1 = unicode\"Moo é🚀\";\n r_2_1_0[1] = r_2_1_0_1;\n }\n {\n string memory r_2_1_0_2 = unicode\"Moo é🚀oéMoo🚀🚀 éé\";\n r_2_1_0[2] = r_2_1_0_2;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n string[3] memory r_2_1_1;\n {\n string memory r_2_1_1_0 = unicode\"Moo é🚀🚀éo 🚀ééoooé🚀éoo🚀🚀 ooMé M🚀éo 🚀oMo oo🚀oo MMM oé\";\n r_2_1_1[0] = r_2_1_1_0;\n }\n {\n string memory r_2_1_1_1 = unicode\"Moo é🚀oMééoMoo Moéo oéé oéo o🚀oooé Moéééooo é\";\n r_2_1_1[1] = r_2_1_1_1;\n }\n {\n string memory r_2_1_1_2 = unicode\"Moo é🚀\";\n r_2_1_1[2] = r_2_1_1_2;\n }\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n address[2] memory r_3;\n {\n address r_3_0 = 0x1783BB84dF43311b866409068FaC2343E38F1a0F;\n r_3[0] = r_3_0;\n }\n {\n address r_3_1 = 0x4A2331d6C695212DB411695F866107cADd30a4CF;\n r_3[1] = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x135Ef9ffbA9a6b4A9A36DdF13571D7e26d72e351;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003400000000000000000000000001783bb84df43311b866409068fac2343e38f1a0f0000000000000000000000004a2331d6c695212db411695f866107cadd30a4cf000000000000000000000000135ef9ffba9a6b4a9a36ddf13571d7e26d72e351000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000d94d443874a5952bc8b050b002970f78eaace69f52ac72352b971fcdfbe700000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001206dbee3b878906ec4971990fd64219c0c4c3f737306502c9c17704fecc82fec82e018cbf7296817e2b64eb728fe88452b3a5ad7b2ca2bb81b785ba15ff342d4927f9d3abb85ef4a854a51c61d96210ddd460ec7f53861b32b454ead8e973c0a3f0000000000000000000000000000000000000000000000000000000000dfe004000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a806f4d6f6f4dc3a9c3a96f20f09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007e0658d1875da228fe51349bbe8948630292fb05000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000038cdaf0d45e1f568584602cfc961000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f4df09f9a80206f206f4df09f9a8020206f6f4d6f6fc3a96ff09f9a80c3a9c3a9c3a9204df09f9a8020f09f9a80f09f9a806f6f6f6f4d6f6f6fc3a94d4d4df09f9a80f09f9a806f204d6f000000000000000000000000000000000000000000000000000000000000000000003870e2d7f3da95b45b24f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80f09f9a806f20c3a9f09f9a806ff09f9a8020202020204d6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806fc3a94d6f6ff09f9a80f09f9a8020c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a80f09f9a80c3a96f20f09f9a80c3a9c3a96f6f6fc3a9f09f9a80c3a96f6ff09f9a80f09f9a80206f6f4dc3a920204df09f9a80c3a96f2020f09f9a806f4d6f20206f6ff09f9a806f6f2020204d4d4d206fc3a900000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a806f4dc3a9c3a96f4d6f6f204d6fc3a96f206fc3a9c3a9206fc3a96f206ff09f9a806f6f6fc3a9204d6fc3a9c3a9c3a96f6f6f20c3a900000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bytes14[3],((string[4][4],uint160,int216,string,uint184),bytes8,(address,int16)),bool,bool,bytes3)[2],address,address,bool)", + "type": "((bytes14[3],((string[4][4],uint160,int216,string,uint184),bytes8,(address,int16)),bool,bool,bytes3)[2],address,address,bool)", + "value": [ + [ + [ + [ + "0x2083905f5a3502830581dc8384f5", + "0xd46b270375c488525e1ade05c524", + "0xa242d24a9178b6924fb23244dd6b" + ], + [ + [ + [ + [ + "Moo é🚀oM é🚀MooM🚀 🚀🚀ééo🚀🚀 M", + "Moo é🚀o🚀MM 🚀oM🚀 oMo ooéooMooooMoo🚀éoo 🚀 🚀 éMMM o M🚀o🚀🚀Mé", + "Moo é🚀Mo o🚀🚀", + "Moo é🚀🚀 o🚀MooooéoMoM🚀🚀Moé🚀éooéM MoMMéoMéooo M" + ], + [ + "Moo é🚀ééo MoéMéM🚀ooooo🚀Mo🚀é🚀oMoo🚀oo", + "Moo é🚀é🚀ooMMééM🚀🚀🚀é 🚀é🚀oo 🚀M🚀 oM", + "Moo é🚀", + "Moo é🚀é 🚀oMé M 🚀o " + ], + [ + "Moo é🚀 🚀🚀🚀oo o🚀oéoo🚀Méé oMé🚀é M 🚀oM🚀oMoo 🚀MoooMoM🚀", + "Moo é🚀é🚀éo🚀🚀🚀 éoo o oM🚀", + "Moo é🚀🚀é ééoo Méo o", + "Moo é🚀 éo🚀MMMo🚀oo oo o🚀MéMéM🚀Mo" + ], + [ + "Moo é🚀é oo🚀MMoMé oé o oM🚀", + "Moo é🚀🚀ooMMMoé🚀o oM o oMoooooM🚀MM🚀🚀ooéo 🚀ééoo🚀 o", + "Moo é🚀🚀oéé Moo", + "Moo é🚀" + ] + ], + "884430255819745256523193039258211446315638002813", + "-693898364554408765599645607512590923470049104324493537713311421", + "Moo é🚀oo M🚀 🚀o oMé🚀é éooé🚀 M🚀🚀 oMMé éo🚀oooo ooM ", + "23650830203124819375692743025730069794796506458213991695" + ], + "0xf27860b6798d6c05", + ["0xe467C54dF3a1e5AF92A97A9Aa8184E4dc0A1b11C", "-15200"] + ], + true, + true, + "0xea1849" + ], + [ + [ + "0xdb65be2d5277216dfbdf02dcfdf7", + "0xbb91c6ec887873483da9947eb851", + "0x924e3f8e49abdc8fc0218e40e307" + ], + [ + [ + [ + [ + "Moo é🚀 Moéé MoMooooMM🚀o🚀ooMéoM o", + "Moo é🚀🚀éo 🚀o ", + "Moo é🚀oéo🚀🚀o 🚀Mo🚀o M🚀oéo ooéMo🚀é 🚀MMo oé oM🚀🚀é🚀🚀🚀🚀é", + "Moo é🚀 oé Moo 🚀M oMo M" + ], + [ + "Moo é🚀oooooéoéooéoé🚀M🚀M🚀oMMMo🚀 é é é", + "Moo é🚀Méo🚀 oMM🚀ooMMM🚀M🚀oooé🚀 Mo🚀 🚀", + "Moo é🚀", + "Moo é🚀M🚀ooMo ééM o ééMM 🚀éMéoo🚀oé🚀Mé" + ], + [ + "Moo é🚀o 🚀MoéMMoo🚀🚀o oM🚀ooéMé🚀éééM oo🚀 🚀ooMMo éo", + "Moo é🚀o🚀oMooéé oé ", + "Moo é🚀🚀 🚀o🚀o o🚀o🚀🚀éMM o o🚀MooMoo éo MMo 🚀Moééoooé🚀oM🚀 oo🚀", + "Moo é🚀o🚀o M🚀o o" + ], + [ + "Moo é🚀", + "Moo é🚀oMooééM éM é éMoMoéoooé🚀o🚀o o ooéo éM M🚀o", + "Moo é🚀🚀 éé oo o🚀o oMééo ooo🚀oé o ", + "Moo é🚀 éé é🚀éoé oé é é🚀MéoM é Mo" + ] + ], + "949266093556621147761682348332220140352897609418", + "-26024854546950923878321035282188769806149122950412435678850226859", + "Moo é🚀 🚀M", + "19179245589829708036931860587278255011873379139647833701" + ], + "0x68fe5be447ac0c11", + ["0x32E8BE048439df51Dc27a643EE2625Dfa7676805", "22644"] + ], + false, + false, + "0x38c185" + ] + ], + "0x75e7eF8F5cb09e7825071BEDdeD8844E66A4c299", + "0xE86C3471425fF22ef76F60B0C19227813057cdCc", + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2083905f5a3502830581dc8384f5" + }, + { + "type": "hexstring", + "value": "0xd46b270375c488525e1ade05c524" + }, + { + "type": "hexstring", + "value": "0xa242d24a9178b6924fb23244dd6b" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM é🚀MooM🚀 🚀🚀ééo🚀🚀 M" + }, + { + "type": "string", + "value": "Moo é🚀o🚀MM 🚀oM🚀 oMo ooéooMooooMoo🚀éoo 🚀 🚀 éMMM o M🚀o🚀🚀Mé" + }, + { + "type": "string", + "value": "Moo é🚀Mo o🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀 o🚀MooooéoMoM🚀🚀Moé🚀éooéM MoMMéoMéooo M" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééo MoéMéM🚀ooooo🚀Mo🚀é🚀oMoo🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀é🚀ooMMééM🚀🚀🚀é 🚀é🚀oo 🚀M🚀 oM" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀é 🚀oMé M 🚀o " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀🚀🚀oo o🚀oéoo🚀Méé oMé🚀é M 🚀oM🚀oMoo 🚀MoooMoM🚀" + }, + { + "type": "string", + "value": "Moo é🚀é🚀éo🚀🚀🚀 éoo o oM🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀é ééoo Méo o" + }, + { + "type": "string", + "value": "Moo é🚀 éo🚀MMMo🚀oo oo o🚀MéMéM🚀Mo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é oo🚀MMoMé oé o oM🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀ooMMMoé🚀o oM o oMoooooM🚀MM🚀🚀ooéo 🚀ééoo🚀 o" + }, + { + "type": "string", + "value": "Moo é🚀🚀oéé Moo" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "number", + "value": "884430255819745256523193039258211446315638002813" + }, + { + "type": "number", + "value": "-693898364554408765599645607512590923470049104324493537713311421" + }, + { + "type": "string", + "value": "Moo é🚀oo M🚀 🚀o oMé🚀é éooé🚀 M🚀🚀 oMMé éo🚀oooo ooM " + }, + { + "type": "number", + "value": "23650830203124819375692743025730069794796506458213991695" + } + ] + }, + { + "type": "hexstring", + "value": "0xf27860b6798d6c05" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xe467C54dF3a1e5AF92A97A9Aa8184E4dc0A1b11C" + }, + { + "type": "number", + "value": "-15200" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xea1849" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdb65be2d5277216dfbdf02dcfdf7" + }, + { + "type": "hexstring", + "value": "0xbb91c6ec887873483da9947eb851" + }, + { + "type": "hexstring", + "value": "0x924e3f8e49abdc8fc0218e40e307" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Moéé MoMooooMM🚀o🚀ooMéoM o" + }, + { + "type": "string", + "value": "Moo é🚀🚀éo 🚀o " + }, + { + "type": "string", + "value": "Moo é🚀oéo🚀🚀o 🚀Mo🚀o M🚀oéo ooéMo🚀é 🚀MMo oé oM🚀🚀é🚀🚀🚀🚀é" + }, + { + "type": "string", + "value": "Moo é🚀 oé Moo 🚀M oMo M" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooooéoéooéoé🚀M🚀M🚀oMMMo🚀 é é é" + }, + { + "type": "string", + "value": "Moo é🚀Méo🚀 oMM🚀ooMMM🚀M🚀oooé🚀 Mo🚀 🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀M🚀ooMo ééM o ééMM 🚀éMéoo🚀oé🚀Mé" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀MoéMMoo🚀🚀o oM🚀ooéMé🚀éééM oo🚀 🚀ooMMo éo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀oMooéé oé " + }, + { + "type": "string", + "value": "Moo é🚀🚀 🚀o🚀o o🚀o🚀🚀éMM o o🚀MooMoo éo MMo 🚀Moééoooé🚀oM🚀 oo🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀o M🚀o o" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oMooééM éM é éMoMoéoooé🚀o🚀o o ooéo éM M🚀o" + }, + { + "type": "string", + "value": "Moo é🚀🚀 éé oo o🚀o oMééo ooo🚀oé o " + }, + { + "type": "string", + "value": "Moo é🚀 éé é🚀éoé oé é é🚀MéoM é Mo" + } + ] + } + ] + }, + { + "type": "number", + "value": "949266093556621147761682348332220140352897609418" + }, + { + "type": "number", + "value": "-26024854546950923878321035282188769806149122950412435678850226859" + }, + { + "type": "string", + "value": "Moo é🚀 🚀M" + }, + { + "type": "number", + "value": "19179245589829708036931860587278255011873379139647833701" + } + ] + }, + { + "type": "hexstring", + "value": "0x68fe5be447ac0c11" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x32E8BE048439df51Dc27a643EE2625Dfa7676805" + }, + { + "type": "number", + "value": "22644" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x38c185" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x75e7eF8F5cb09e7825071BEDdeD8844E66A4c299" + }, + { + "type": "address", + "value": "0xE86C3471425fF22ef76F60B0C19227813057cdCc" + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611266806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610ba9565b60405180910390f35b6100566108c8565b61005e6108c8565b6100666108f6565b61006e610923565b610076610943565b6d2083905f5a3502830581dc8384f560901b81526d351ac9c0dd7122149786b781714960921b60208201526da242d24a9178b6924fb23244dd6b60901b604082015281526100c2610961565b6100ca61099f565b6100d26109d3565b6100da610a00565b6000604051806060016040528060338152602001610e2d603391398252506040805160808101909152605d8082526000919061108c602083013960208381019190915260408051808201825260168152749adede418753e13f35009ade40dfe13f3501e13f3560571b818401528185015280516080810190915260468082526000935090916111eb908301396060830152508152610176610a00565b60006040518060600160405280603c8152602001610fee603c91398252506040805160808101909152604180825260009190610dec6020830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b81840152818501528051808201909152601e81527f4d6f6f20c3a9f09f9a80c3a920f09f9a806f4dc3a9204d20f09f9a806f20000081830152606084015283019190915250610220610a00565b60006040518060800160405280605b8152602001610d91605b91398252506040805160608101909152602d8082526000919061102a6020830139602083810191909152604080518082018252601e81527f4d6f6f20c3a9f09f9a80f09f9a80c3a920c3a9c3a96f6f204dc3a96f206f000081840152818501528051606081019091526032808252600093509091610ce99083013960608301525060408201526102c7610a00565b6000604051806060016040528060278152602001610fc7602791398252506040805160808101909152604d808252600091906110e96020830139602083810191909152604080518082018252601881527f4d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a920204d6f6f0000000000000000818401528185015280518082018252600a8152689adede418753e13f3560b71b8184015260608086019190915285019390935292845250739aeb396b87f313787a26b491930ba71fbad3147d838301527a01afd0631db3b6893e99970e3880b587b600fc4c9802306a8fcebc19838201528051608081019091526050808252600092610e9d9083013960608301525076f6ed1ab574aa7b6002b779f7d964b7c300cb59066e450f6080820152815267f27860b6798d6c0560c01b6020820152610411604080518082019091526000808252602082015290565b73e467c54df3a1e5af92a97a9aa8184e4dc0a1b11c8152613b5f196020808301919091526040838101929092528301919091526001908201819052606082015262ea184960e81b60808201528152610467610923565b61046f610943565b6ddb65be2d5277216dfbdf02dcfdf760901b81526dbb91c6ec887873483da9947eb85160901b60208201526d924e3f8e49abdc8fc0218e40e30760901b604082015281526104bb610961565b6104c361099f565b6104cb6109d3565b6104d3610a00565b60006040518060600160405280602e8152602001610d1b602e913982525060408051808201909152601981527f4d6f6f20c3a9f09f9a80f09f9a80c3a96f20f09f9a806f20200000000000000060208201528082600160200201819052505060006040518060a0016040528060658152602001611186606591396040838101919091528051808201909152601e81527f4d6f6f20c3a9f09f9a80206fc3a9204d6f6f20f09f9a804d206f4d6f204d000060208201526060830152508152610598610a00565b60006040518060600160405280603b8152602001610f50603b91398252506040805160608101909152603d80825260009190610e606020830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b8184015281850152805160608101909152603c808252600093509091610f8b90830139606083015250602082015261062b610a00565b60006040518060800160405280605081526020016111366050913982525060408051808201909152601c81527f4d6f6f20c3a9f09f9a806ff09f9a806f4d6f6fc3a9c3a9206fc3a9200000000060208201528082600160200201819052505060006040518060a0016040528060638152602001610eed6063913960408381019190915280518082018252601981527f4d6f6f20c3a9f09f9a806ff09f9a806f204df09f9a806f206f0000000000000060208201526060840152830191909152506106f3610a00565b604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160808101909252604880835260009291610d49908301399050808260016020020181905250506000604051806060016040528060348152602001610cb5603491396040808401919091528051606081019091526035808252600092506110576020830139606080840191909152838101929092525090825273a646905601e333084bce2405025cc8951860eeca6020838101919091527a3f434e86d6c4d881675319f535c93375d9878468b5503f3ce89aaa196040808501919091528051808201825260128152714d6f6f20c3a9f09f9a80202020f09f9a804d60701b818401528484015276c83d9c5bfdfb014d053bda6e8926032da4c5c5fd9e06656080808601919091529385526768fe5be447ac0c1160c01b85830152805180820182527332e8be048439df51dc27a643ee2625dfa7676805815261587481840152858201528582019490945260008585018190528583018190526238c18560e81b93860193909352858101949094529385527375e7ef8f5cb09e7825071bedded8844e66a4c2999285019290925273e86c3471425ff22ef76f60b0c19227813057cdcc9084015290820152919050565b60405180608001604052806108db6108f6565b81526000602082018190526040820181905260609091015290565b60405180604001604052806002905b61090d610923565b8152602001906001900390816109055790505090565b6040518060a00160405280610936610943565b81526020016108db610961565b60405180606001604052806003906020820280368337509192915050565b604051806060016040528061097461099f565b81526000602082015260400161099a604080518082019091526000808252602082015290565b905290565b6040518060a001604052806109b26109d3565b81526000602082018190526040820181905260608083015260809091015290565b60405180608001604052806004905b6109ea610a00565b8152602001906001900390816109e25790505090565b60405180608001604052806004905b6060815260200190600190039081610a0f5790505090565b6000815180845260005b81811015610a4d57602081850181015186830182015201610a31565b81811115610a5f576000602083870101525b50601f01601f19169290920160200192915050565b80516080808452815160a085830152600092906101a0860190610120870185805b6004808210610aa45750610afc565b8a860361011f19018452845186898101855b84811015610ae3578982038352610ace828551610a27565b60209485019493909301929150600101610ab6565b5097505050602094850194939093019250600101610a95565b5050505060208201516001600160a01b031660a08701526040820151601a0b60c08701526060820151868203607f190160e0880152610b3b8282610a27565b938301516001600160b81b038116610100890152939150610b599050565b60208501519250610b7660208701846001600160c01b0319169052565b60408501519250610ba0604087018480516001600160a01b0316825260209081015160010b910152565b95945050505050565b6000602080835260a08084018551608080858801528283905060e093508388016000805b6002811015610c77578a8303609f190184528551805184845b6003811015610c1857825171ffffffffffffffffffffffffffffffffffff19168252918c0191908c0190600101610be6565b5050508981015160608981870152610c328a870183610a74565b91506040830151610c468988018215159052565b508201511515858b0152908601516001600160e81b03191660c0909401939093529488019492880192600101610bcd565b5050958901516001600160a01b0390811660408a8101919091528a0151166060808a0191909152909801511515960195909552509094935050505056fe4d6f6f20c3a9f09f9a80f09f9a8020c3a9c3a9206f6f206ff09f9a806f206f4dc3a9c3a96f20206f6f6ff09f9a806fc3a9206f204d6f6f20c3a9f09f9a8020c3a96ff09f9a804d4d4d6ff09f9a806f6f206f6f206ff09f9a804dc3a94dc3a94df09f9a804d6f4d6f6f20c3a9f09f9a80204d6fc3a9c3a920204d6f4d6f6f6f6f4d4df09f9a806ff09f9a806f6f4dc3a96f4d206f4d6f6f20c3a9f09f9a806f4d6f6fc3a9c3a94d20c3a94d2020c3a920c3a94d6f4d6fc3a96f6f6fc3a9f09f9a806ff09f9a806f206f206f6fc3a96f202020c3a94d204df09f9a806f4d6f6f20c3a9f09f9a802020f09f9a80f09f9a80f09f9a806f6f206ff09f9a806fc3a96f6ff09f9a804dc3a9c3a9206f4dc3a9f09f9a80c3a9204d2020f09f9a806f4df09f9a806f4d6f6f20f09f9a804d6f6f6f4d6f4df09f9a804d6f6f20c3a9f09f9a80c3a9f09f9a806f6f4d4dc3a9c3a94df09f9a80f09f9a80f09f9a80c3a920f09f9a80c3a9f09f9a806f6f20f09f9a804df09f9a80206f4d4d6f6f20c3a9f09f9a806f4d20c3a9f09f9a804d6f6f4df09f9a8020f09f9a80f09f9a80c3a9c3a96ff09f9a80f09f9a80204d4d6f6f20c3a9f09f9a804dc3a96ff09f9a80206f4d4df09f9a806f6f4d4d4df09f9a804df09f9a806f6f6fc3a9f09f9a80204d6ff09f9a8020f09f9a804d6f6f20c3a9f09f9a806f6f204df09f9a8020f09f9a806f206f4dc3a9f09f9a80c3a92020c3a96f6fc3a9f09f9a80204df09f9a80f09f9a80206f4d4dc3a920c3a96ff09f9a806f6f6f6f206f6f4d204d6f6f20c3a9f09f9a80f09f9a8020f09f9a806ff09f9a806f206ff09f9a806ff09f9a80f09f9a80c3a94d4d206f206ff09f9a804d6f6f4d6f6f20c3a96f204d4d6f20f09f9a804d6fc3a9c3a96f6f6fc3a9f09f9a806f4df09f9a80206f6ff09f9a804d6f6f20c3a9f09f9a806f6f6f6f6fc3a96fc3a96f6fc3a96fc3a9f09f9a804df09f9a804df09f9a806f4d4d4d6ff09f9a8020c3a920c3a920c3a94d6f6f20c3a9f09f9a804df09f9a806f6f4d6f20c3a9c3a94d206f20c3a9c3a94d4d20f09f9a80c3a94dc3a96f6ff09f9a806fc3a9f09f9a804dc3a94d6f6f20c3a9f09f9a80c3a920206f6ff09f9a804d4d6f4dc3a9206fc3a9206f206f4df09f9a804d6f6f20c3a9f09f9a80c3a9c3a96f20204d6fc3a94dc3a94df09f9a806f6f6f6f6ff09f9a804d6ff09f9a80c3a9f09f9a806f4d6f6ff09f9a806f6f4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a96ff09f9a80f09f9a80f09f9a8020c3a96f6f206f206f4df09f9a804d6f6f20c3a9f09f9a8020c3a9c3a920c3a9f09f9a80c3a96fc3a9206fc3a92020c3a920c3a9f09f9a804dc3a96f4d20c3a9204d6f4d6f6f20c3a9f09f9a806ff09f9a804d4d20f09f9a806f4df09f9a80206f4d6f206f6fc3a96f6f4d6f6f6f6f4d6f6ff09f9a80c3a96f6f20f09f9a802020f09f9a802020c3a94d4d4d206f204df09f9a806ff09f9a80f09f9a804dc3a94d6f6f20c3a9f09f9a80f09f9a806f6f4d4d4d6fc3a9f09f9a806f206f4d206f206f4d6f6f6f6f6f4df09f9a804d4df09f9a80f09f9a806f6fc3a96f20f09f9a80c3a9c3a96f6ff09f9a80206f4d6f6f20c3a9f09f9a806f20f09f9a804d6fc3a94d4d6f6ff09f9a80f09f9a806f206f4df09f9a806f6fc3a94dc3a9f09f9a80c3a9c3a9c3a94d206f6ff09f9a8020f09f9a806f6f4d4d6f2020c3a96f4d6f6f20c3a9f09f9a806fc3a96ff09f9a80f09f9a806f20f09f9a804d6ff09f9a806f204df09f9a806fc3a96f206f6fc3a94d6ff09f9a80c3a920f09f9a804d4d6f206fc3a9206f4df09f9a80f09f9a80c3a9f09f9a80f09f9a80f09f9a80f09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a80206ff09f9a804d6f6f6f6fc3a96f4d6f4df09f9a80f09f9a804d6fc3a9f09f9a80c3a96f6fc3a94d204d6f4d4dc3a96f4dc3a96f6f6f204da264697066735822122035b2b7cbbafa0008c89e84028629b7f29e2d0c9fe819862dc3562b56a60fcb1e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_7c85266e {\n string[4][4] s_0;\n uint160 s_1;\n int216 s_2;\n string s_3;\n uint184 s_4;\n }\n\n struct S_b49bcddb {\n address s_0;\n int16 s_1;\n }\n\n struct S_48dbe8a4 {\n S_7c85266e s_0;\n bytes8 s_1;\n S_b49bcddb s_2;\n }\n\n struct S_35777228 {\n bytes14[3] s_0;\n S_48dbe8a4 s_1;\n bool s_2;\n bool s_3;\n bytes3 s_4;\n }\n\n struct S_d881be93 {\n S_35777228[2] s_0;\n address s_1;\n address s_2;\n bool s_3;\n }\n\n function test () public pure returns (S_d881be93 memory) {\n S_d881be93 memory r;\n {\n S_35777228[2] memory r_0;\n {\n S_35777228 memory r_0_0;\n {\n bytes14[3] memory r_0_0_0;\n {\n bytes14 r_0_0_0_0 = bytes14(0x2083905f5a3502830581dc8384f5);\n r_0_0_0[0] = r_0_0_0_0;\n }\n {\n bytes14 r_0_0_0_1 = bytes14(0xd46b270375c488525e1ade05c524);\n r_0_0_0[1] = r_0_0_0_1;\n }\n {\n bytes14 r_0_0_0_2 = bytes14(0xa242d24a9178b6924fb23244dd6b);\n r_0_0_0[2] = r_0_0_0_2;\n }\n r_0_0.s_0 = r_0_0_0;\n }\n {\n S_48dbe8a4 memory r_0_0_1;\n {\n S_7c85266e memory r_0_0_1_0;\n {\n string[4][4] memory r_0_0_1_0_0;\n {\n string[4] memory r_0_0_1_0_0_0;\n {\n string memory r_0_0_1_0_0_0_0 = unicode\"Moo é🚀oM é🚀MooM🚀 🚀🚀ééo🚀🚀 M\";\n r_0_0_1_0_0_0[0] = r_0_0_1_0_0_0_0;\n }\n {\n string memory r_0_0_1_0_0_0_1 = unicode\"Moo é🚀o🚀MM 🚀oM🚀 oMo ooéooMooooMoo🚀éoo 🚀 🚀 éMMM o M🚀o🚀🚀Mé\";\n r_0_0_1_0_0_0[1] = r_0_0_1_0_0_0_1;\n }\n {\n string memory r_0_0_1_0_0_0_2 = unicode\"Moo é🚀Mo o🚀🚀\";\n r_0_0_1_0_0_0[2] = r_0_0_1_0_0_0_2;\n }\n {\n string memory r_0_0_1_0_0_0_3 = unicode\"Moo é🚀🚀 o🚀MooooéoMoM🚀🚀Moé🚀éooéM MoMMéoMéooo M\";\n r_0_0_1_0_0_0[3] = r_0_0_1_0_0_0_3;\n }\n r_0_0_1_0_0[0] = r_0_0_1_0_0_0;\n }\n {\n string[4] memory r_0_0_1_0_0_1;\n {\n string memory r_0_0_1_0_0_1_0 = unicode\"Moo é🚀ééo MoéMéM🚀ooooo🚀Mo🚀é🚀oMoo🚀oo\";\n r_0_0_1_0_0_1[0] = r_0_0_1_0_0_1_0;\n }\n {\n string memory r_0_0_1_0_0_1_1 = unicode\"Moo é🚀é🚀ooMMééM🚀🚀🚀é 🚀é🚀oo 🚀M🚀 oM\";\n r_0_0_1_0_0_1[1] = r_0_0_1_0_0_1_1;\n }\n {\n string memory r_0_0_1_0_0_1_2 = unicode\"Moo é🚀\";\n r_0_0_1_0_0_1[2] = r_0_0_1_0_0_1_2;\n }\n {\n string memory r_0_0_1_0_0_1_3 = unicode\"Moo é🚀é 🚀oMé M 🚀o \";\n r_0_0_1_0_0_1[3] = r_0_0_1_0_0_1_3;\n }\n r_0_0_1_0_0[1] = r_0_0_1_0_0_1;\n }\n {\n string[4] memory r_0_0_1_0_0_2;\n {\n string memory r_0_0_1_0_0_2_0 = unicode\"Moo é🚀 🚀🚀🚀oo o🚀oéoo🚀Méé oMé🚀é M 🚀oM🚀oMoo 🚀MoooMoM🚀\";\n r_0_0_1_0_0_2[0] = r_0_0_1_0_0_2_0;\n }\n {\n string memory r_0_0_1_0_0_2_1 = unicode\"Moo é🚀é🚀éo🚀🚀🚀 éoo o oM🚀\";\n r_0_0_1_0_0_2[1] = r_0_0_1_0_0_2_1;\n }\n {\n string memory r_0_0_1_0_0_2_2 = unicode\"Moo é🚀🚀é ééoo Méo o\";\n r_0_0_1_0_0_2[2] = r_0_0_1_0_0_2_2;\n }\n {\n string memory r_0_0_1_0_0_2_3 = unicode\"Moo é🚀 éo🚀MMMo🚀oo oo o🚀MéMéM🚀Mo\";\n r_0_0_1_0_0_2[3] = r_0_0_1_0_0_2_3;\n }\n r_0_0_1_0_0[2] = r_0_0_1_0_0_2;\n }\n {\n string[4] memory r_0_0_1_0_0_3;\n {\n string memory r_0_0_1_0_0_3_0 = unicode\"Moo é🚀é oo🚀MMoMé oé o oM🚀\";\n r_0_0_1_0_0_3[0] = r_0_0_1_0_0_3_0;\n }\n {\n string memory r_0_0_1_0_0_3_1 = unicode\"Moo é🚀🚀ooMMMoé🚀o oM o oMoooooM🚀MM🚀🚀ooéo 🚀ééoo🚀 o\";\n r_0_0_1_0_0_3[1] = r_0_0_1_0_0_3_1;\n }\n {\n string memory r_0_0_1_0_0_3_2 = unicode\"Moo é🚀🚀oéé Moo\";\n r_0_0_1_0_0_3[2] = r_0_0_1_0_0_3_2;\n }\n {\n string memory r_0_0_1_0_0_3_3 = unicode\"Moo é🚀\";\n r_0_0_1_0_0_3[3] = r_0_0_1_0_0_3_3;\n }\n r_0_0_1_0_0[3] = r_0_0_1_0_0_3;\n }\n r_0_0_1_0.s_0 = r_0_0_1_0_0;\n }\n {\n uint160 r_0_0_1_0_1 = 884430255819745256523193039258211446315638002813;\n r_0_0_1_0.s_1 = r_0_0_1_0_1;\n }\n {\n int216 r_0_0_1_0_2 = -693898364554408765599645607512590923470049104324493537713311421;\n r_0_0_1_0.s_2 = r_0_0_1_0_2;\n }\n {\n string memory r_0_0_1_0_3 = unicode\"Moo é🚀oo M🚀 🚀o oMé🚀é éooé🚀 M🚀🚀 oMMé éo🚀oooo ooM \";\n r_0_0_1_0.s_3 = r_0_0_1_0_3;\n }\n {\n uint184 r_0_0_1_0_4 = 23650830203124819375692743025730069794796506458213991695;\n r_0_0_1_0.s_4 = r_0_0_1_0_4;\n }\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n bytes8 r_0_0_1_1 = bytes8(0xf27860b6798d6c05);\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n S_b49bcddb memory r_0_0_1_2;\n {\n address r_0_0_1_2_0 = 0xe467C54dF3a1e5AF92A97A9Aa8184E4dc0A1b11C;\n r_0_0_1_2.s_0 = r_0_0_1_2_0;\n }\n {\n int16 r_0_0_1_2_1 = -15200;\n r_0_0_1_2.s_1 = r_0_0_1_2_1;\n }\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n bool r_0_0_2 = true;\n r_0_0.s_2 = r_0_0_2;\n }\n {\n bool r_0_0_3 = true;\n r_0_0.s_3 = r_0_0_3;\n }\n {\n bytes3 r_0_0_4 = bytes3(0xea1849);\n r_0_0.s_4 = r_0_0_4;\n }\n r_0[0] = r_0_0;\n }\n {\n S_35777228 memory r_0_1;\n {\n bytes14[3] memory r_0_1_0;\n {\n bytes14 r_0_1_0_0 = bytes14(0xdb65be2d5277216dfbdf02dcfdf7);\n r_0_1_0[0] = r_0_1_0_0;\n }\n {\n bytes14 r_0_1_0_1 = bytes14(0xbb91c6ec887873483da9947eb851);\n r_0_1_0[1] = r_0_1_0_1;\n }\n {\n bytes14 r_0_1_0_2 = bytes14(0x924e3f8e49abdc8fc0218e40e307);\n r_0_1_0[2] = r_0_1_0_2;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n {\n S_48dbe8a4 memory r_0_1_1;\n {\n S_7c85266e memory r_0_1_1_0;\n {\n string[4][4] memory r_0_1_1_0_0;\n {\n string[4] memory r_0_1_1_0_0_0;\n {\n string memory r_0_1_1_0_0_0_0 = unicode\"Moo é🚀 Moéé MoMooooMM🚀o🚀ooMéoM o\";\n r_0_1_1_0_0_0[0] = r_0_1_1_0_0_0_0;\n }\n {\n string memory r_0_1_1_0_0_0_1 = unicode\"Moo é🚀🚀éo 🚀o \";\n r_0_1_1_0_0_0[1] = r_0_1_1_0_0_0_1;\n }\n {\n string memory r_0_1_1_0_0_0_2 = unicode\"Moo é🚀oéo🚀🚀o 🚀Mo🚀o M🚀oéo ooéMo🚀é 🚀MMo oé oM🚀🚀é🚀🚀🚀🚀é\";\n r_0_1_1_0_0_0[2] = r_0_1_1_0_0_0_2;\n }\n {\n string memory r_0_1_1_0_0_0_3 = unicode\"Moo é🚀 oé Moo 🚀M oMo M\";\n r_0_1_1_0_0_0[3] = r_0_1_1_0_0_0_3;\n }\n r_0_1_1_0_0[0] = r_0_1_1_0_0_0;\n }\n {\n string[4] memory r_0_1_1_0_0_1;\n {\n string memory r_0_1_1_0_0_1_0 = unicode\"Moo é🚀oooooéoéooéoé🚀M🚀M🚀oMMMo🚀 é é é\";\n r_0_1_1_0_0_1[0] = r_0_1_1_0_0_1_0;\n }\n {\n string memory r_0_1_1_0_0_1_1 = unicode\"Moo é🚀Méo🚀 oMM🚀ooMMM🚀M🚀oooé🚀 Mo🚀 🚀\";\n r_0_1_1_0_0_1[1] = r_0_1_1_0_0_1_1;\n }\n {\n string memory r_0_1_1_0_0_1_2 = unicode\"Moo é🚀\";\n r_0_1_1_0_0_1[2] = r_0_1_1_0_0_1_2;\n }\n {\n string memory r_0_1_1_0_0_1_3 = unicode\"Moo é🚀M🚀ooMo ééM o ééMM 🚀éMéoo🚀oé🚀Mé\";\n r_0_1_1_0_0_1[3] = r_0_1_1_0_0_1_3;\n }\n r_0_1_1_0_0[1] = r_0_1_1_0_0_1;\n }\n {\n string[4] memory r_0_1_1_0_0_2;\n {\n string memory r_0_1_1_0_0_2_0 = unicode\"Moo é🚀o 🚀MoéMMoo🚀🚀o oM🚀ooéMé🚀éééM oo🚀 🚀ooMMo éo\";\n r_0_1_1_0_0_2[0] = r_0_1_1_0_0_2_0;\n }\n {\n string memory r_0_1_1_0_0_2_1 = unicode\"Moo é🚀o🚀oMooéé oé \";\n r_0_1_1_0_0_2[1] = r_0_1_1_0_0_2_1;\n }\n {\n string memory r_0_1_1_0_0_2_2 = unicode\"Moo é🚀🚀 🚀o🚀o o🚀o🚀🚀éMM o o🚀MooMoo éo MMo 🚀Moééoooé🚀oM🚀 oo🚀\";\n r_0_1_1_0_0_2[2] = r_0_1_1_0_0_2_2;\n }\n {\n string memory r_0_1_1_0_0_2_3 = unicode\"Moo é🚀o🚀o M🚀o o\";\n r_0_1_1_0_0_2[3] = r_0_1_1_0_0_2_3;\n }\n r_0_1_1_0_0[2] = r_0_1_1_0_0_2;\n }\n {\n string[4] memory r_0_1_1_0_0_3;\n {\n string memory r_0_1_1_0_0_3_0 = unicode\"Moo é🚀\";\n r_0_1_1_0_0_3[0] = r_0_1_1_0_0_3_0;\n }\n {\n string memory r_0_1_1_0_0_3_1 = unicode\"Moo é🚀oMooééM éM é éMoMoéoooé🚀o🚀o o ooéo éM M🚀o\";\n r_0_1_1_0_0_3[1] = r_0_1_1_0_0_3_1;\n }\n {\n string memory r_0_1_1_0_0_3_2 = unicode\"Moo é🚀🚀 éé oo o🚀o oMééo ooo🚀oé o \";\n r_0_1_1_0_0_3[2] = r_0_1_1_0_0_3_2;\n }\n {\n string memory r_0_1_1_0_0_3_3 = unicode\"Moo é🚀 éé é🚀éoé oé é é🚀MéoM é Mo\";\n r_0_1_1_0_0_3[3] = r_0_1_1_0_0_3_3;\n }\n r_0_1_1_0_0[3] = r_0_1_1_0_0_3;\n }\n r_0_1_1_0.s_0 = r_0_1_1_0_0;\n }\n {\n uint160 r_0_1_1_0_1 = 949266093556621147761682348332220140352897609418;\n r_0_1_1_0.s_1 = r_0_1_1_0_1;\n }\n {\n int216 r_0_1_1_0_2 = -26024854546950923878321035282188769806149122950412435678850226859;\n r_0_1_1_0.s_2 = r_0_1_1_0_2;\n }\n {\n string memory r_0_1_1_0_3 = unicode\"Moo é🚀 🚀M\";\n r_0_1_1_0.s_3 = r_0_1_1_0_3;\n }\n {\n uint184 r_0_1_1_0_4 = 19179245589829708036931860587278255011873379139647833701;\n r_0_1_1_0.s_4 = r_0_1_1_0_4;\n }\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n bytes8 r_0_1_1_1 = bytes8(0x68fe5be447ac0c11);\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n S_b49bcddb memory r_0_1_1_2;\n {\n address r_0_1_1_2_0 = 0x32E8BE048439df51Dc27a643EE2625Dfa7676805;\n r_0_1_1_2.s_0 = r_0_1_1_2_0;\n }\n {\n int16 r_0_1_1_2_1 = 22644;\n r_0_1_1_2.s_1 = r_0_1_1_2_1;\n }\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n bool r_0_1_2 = false;\n r_0_1.s_2 = r_0_1_2;\n }\n {\n bool r_0_1_3 = false;\n r_0_1.s_3 = r_0_1_3;\n }\n {\n bytes3 r_0_1_4 = bytes3(0x38c185);\n r_0_1.s_4 = r_0_1_4;\n }\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x75e7eF8F5cb09e7825071BEDdeD8844E66A4c299;\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xE86C3471425fF22ef76F60B0C19227813057cdCc;\n r.s_2 = r_2;\n }\n {\n bool r_3 = false;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000075e7ef8f5cb09e7825071bedded8844e66a4c299000000000000000000000000e86c3471425ff22ef76f60b0c19227813057cdcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b202083905f5a3502830581dc8384f5000000000000000000000000000000000000d46b270375c488525e1ade05c524000000000000000000000000000000000000a242d24a9178b6924fb23244dd6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ea184900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f27860b6798d6c05000000000000000000000000000000000000000000000000000000000000000000000000e467c54df3a1e5af92a97a9aa8184e4dc0a1b11cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000009aeb396b87f313787a26b491930ba71fbad3147dfffffffffffe502f9ce24c4976c16668f1c77f4a7849ff03b367fdcf957031430000000000000000000000000000000000000000000000000000000000000900000000000000000000f6ed1ab574aa7b6002b779f7d964b7c300cb59066e450f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a806f4d20c3a9f09f9a804d6f6f4df09f9a8020f09f9a80f09f9a80c3a9c3a96ff09f9a80f09f9a80204d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a806ff09f9a804d4d20f09f9a806f4df09f9a80206f4d6f206f6fc3a96f6f4d6f6f6f6f4d6f6ff09f9a80c3a96f6f20f09f9a802020f09f9a802020c3a94d4d4d206f204df09f9a806ff09f9a80f09f9a804dc3a900000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a804d6f206ff09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80f09f9a80206ff09f9a804d6f6f6f6fc3a96f4d6f4df09f9a80f09f9a804d6fc3a9f09f9a80c3a96f6fc3a94d204d6f4d4dc3a96f4dc3a96f6f6f204d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a80c3a9c3a96f20204d6fc3a94dc3a94df09f9a806f6f6f6f6ff09f9a804d6ff09f9a80c3a9f09f9a806f4d6f6ff09f9a806f6f0000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a80c3a9f09f9a806f6f4d4dc3a9c3a94df09f9a80f09f9a80f09f9a80c3a920f09f9a80c3a9f09f9a806f6f20f09f9a804df09f9a80206f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80c3a920f09f9a806f4dc3a9204d20f09f9a806f20000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a802020f09f9a80f09f9a80f09f9a806f6f206ff09f9a806fc3a96f6ff09f9a804dc3a9c3a9206f4dc3a9f09f9a80c3a9204d2020f09f9a806f4df09f9a806f4d6f6f20f09f9a804d6f6f6f4d6f4df09f9a800000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a96ff09f9a80f09f9a80f09f9a8020c3a96f6f206f206f4df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80f09f9a80c3a920c3a9c3a96f6f204dc3a96f206f000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a8020c3a96ff09f9a804d4d4d6ff09f9a806f6f206f6f206ff09f9a804dc3a94dc3a94df09f9a804d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a80c3a920206f6ff09f9a804d4d6f4dc3a9206fc3a9206f206f4df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80f09f9a806f6f4d4d4d6fc3a9f09f9a806f206f4d206f206f4d6f6f6f6f6f4df09f9a804d4df09f9a80f09f9a806f6fc3a96f20f09f9a80c3a9c3a96f6ff09f9a80206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a920204d6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a806f6f204df09f9a8020f09f9a806f206f4dc3a9f09f9a80c3a92020c3a96f6fc3a9f09f9a80204df09f9a80f09f9a80206f4d4dc3a920c3a96ff09f9a806f6f6f6f206f6f4d2000000000000000000000000000000000db65be2d5277216dfbdf02dcfdf7000000000000000000000000000000000000bb91c6ec887873483da9947eb851000000000000000000000000000000000000924e3f8e49abdc8fc0218e40e30700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038c1850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008068fe5be447ac0c1100000000000000000000000000000000000000000000000000000000000000000000000032e8be048439df51dc27a643ee2625dfa7676805000000000000000000000000000000000000000000000000000000000000587400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a646905601e333084bce2405025cc8951860eecaffffffffffc0bcb179293b277e98ace60aca36cc8a26787b974aafc0c31765550000000000000000000000000000000000000000000000000000000000000920000000000000000000c83d9c5bfdfb014d053bda6e8926032da4c5c5fd9e06650000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80204d6fc3a9c3a920204d6f4d6f6f6f6f4d4df09f9a806ff09f9a806f6f4dc3a96f4d206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a80f09f9a80c3a96f20f09f9a806f20200000000000000000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a806fc3a96ff09f9a80f09f9a806f20f09f9a804d6ff09f9a806f204df09f9a806fc3a96f206f6fc3a94d6ff09f9a80c3a920f09f9a804d4d6f206fc3a9206f4df09f9a80f09f9a80c3a9f09f9a80f09f9a80f09f9a80f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80206fc3a9204d6f6f20f09f9a804d206f4d6f204d0000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a806f6f6f6f6fc3a96fc3a96f6fc3a96fc3a9f09f9a804df09f9a804df09f9a806f4d4d4d6ff09f9a8020c3a920c3a920c3a90000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a804dc3a96ff09f9a80206f4d4df09f9a806f6f4d4d4df09f9a804df09f9a806f6f6fc3a9f09f9a80204d6ff09f9a8020f09f9a80000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a804df09f9a806f6f4d6f20c3a9c3a94d206f20c3a9c3a94d4d20f09f9a80c3a94dc3a96f6ff09f9a806fc3a9f09f9a804dc3a90000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a806f20f09f9a804d6fc3a94d4d6f6ff09f9a80f09f9a806f206f4df09f9a806f6fc3a94dc3a9f09f9a80c3a9c3a9c3a94d206f6ff09f9a8020f09f9a806f6f4d4d6f2020c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a806ff09f9a806f4d6f6fc3a9c3a9206fc3a9200000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a8020f09f9a806ff09f9a806f206ff09f9a806ff09f9a80f09f9a80c3a94d4d206f206ff09f9a804d6f6f4d6f6f20c3a96f204d4d6f20f09f9a804d6fc3a9c3a96f6f6fc3a9f09f9a806f4df09f9a80206f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a806ff09f9a806f204df09f9a806f206f00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a806f4d6f6fc3a9c3a94d20c3a94d2020c3a920c3a94d6f4d6fc3a96f6f6fc3a9f09f9a806ff09f9a806f206f206f6fc3a96f202020c3a94d204df09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a80f09f9a8020c3a9c3a9206f6f206ff09f9a806f206f4dc3a9c3a96f20206f6f6ff09f9a806fc3a9206f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a8020c3a9c3a920c3a9f09f9a80c3a96fc3a9206fc3a92020c3a920c3a9f09f9a804dc3a96f4d20c3a9204d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a80202020f09f9a804d0000000000000000000000000000" + }, + { + "name": "random-((bytes8,string[1],address,(uint64[4],(string,string,address),bool[2],string,bytes32[]),(string,(address,uint200),uint208,uint64)))", + "type": "((bytes8,string[1],address,(uint64[4],(string,string,address),bool[2],string,bytes32[]),(string,(address,uint200),uint208,uint64)))", + "value": [ + [ + "0x8845d5c6947aa8c5", + ["Moo é🚀🚀éoé oo🚀é"], + "0x359cD0745d1012cB89FDD74D8592CAb7Ba84af47", + [ + [ + "7254255887554804097", + "949521475707603241", + "18005144837519667542", + "2938851722724532560" + ], + ["Moo é🚀", "Moo é🚀", "0x45e6e4A3E4Da573035d3DE8fB955FD8221594542"], + [true, true], + "Moo é🚀oMéMooéoéo oooé🚀oé MééMéMooMo M MéM", + [] + ], + [ + "Moo é🚀ooM🚀ééoo ooM é 🚀M🚀oMMoo MMM 🚀oM🚀🚀", + [ + "0x23c66e27C0590f2140F1C85Cbb870e112465315B", + "360608226955343173499327957384725982904922611564353308372046" + ], + "18904749027156691926643271784224729714876680149984494052296269", + "10357105648862011313" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8845d5c6947aa8c5" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éoé oo🚀é" + } + ] + }, + { + "type": "address", + "value": "0x359cD0745d1012cB89FDD74D8592CAb7Ba84af47" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "7254255887554804097" + }, + { + "type": "number", + "value": "949521475707603241" + }, + { + "type": "number", + "value": "18005144837519667542" + }, + { + "type": "number", + "value": "2938851722724532560" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0x45e6e4A3E4Da573035d3DE8fB955FD8221594542" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMéMooéoéo oooé🚀oé MééMéMooMo M MéM" + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooM🚀ééoo ooM é 🚀M🚀oMMoo MMM 🚀oM🚀🚀" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x23c66e27C0590f2140F1C85Cbb870e112465315B" + }, + { + "type": "number", + "value": "360608226955343173499327957384725982904922611564353308372046" + } + ] + }, + { + "type": "number", + "value": "18904749027156691926643271784224729714876680149984494052296269" + }, + { + "type": "number", + "value": "10357105648862011313" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061076a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906105fa565b60405180910390f35b61005661028d565b61005e61028d565b6100666102a5565b678845d5c6947aa8c560c01b815261007c6102e1565b604080518082018252601c81527f4d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a9206f6ff09f9a80c3a90000000060208083019190915290835283019190915273359cd0745d1012cb89fdd74d8592cab7ba84af47908201526100dd610308565b6100e561036e565b6764ac4b4b877d79818152670d2d60c05a28092960208083019190915267f9df1fd599d171566040808401919091526728c8e612348a615060608085019190915292845280518084018252838152808301938452600081830190815282518084018452600a808252689adede418753e13f3560b71b8287018190529184528451808601909552845283850152919093527345e6e4a3e4da573035d3de8fb955fd8221594542905282015261019761038c565b6001808252602080830191909152604080840192909252815160608101909252603b808352600092916106b9908301396060830152506040805160008082526020820190925260808301525060608201526101f06103aa565b60006040518060800160405280604181526020016106f4604191398252506040805180820182527323c66e27c0590f2140f1c85cbb870e112465315b8152783972bd8f2cd72fcbf7289b08552e58a27027021103a564ac4e602080830191909152830152790bc3b34544ef25fc783921f562f3731064fc609abda068edc64d90820152678fbbd4b69d9c9fb1606082015260808201528152919050565b60405180602001604052806102a06102a5565b905290565b6040805160a0810190915260008152602081016102c06102e1565b8152600060208201526040016102d4610308565b81526020016102a06103aa565b60405180602001604052806001905b60608152602001906001900390816102f05790505090565b6040518060a0016040528061031b61036e565b815260200161034d6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b815260200161035a61038c565b815260200160608152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6040518060800160405280606081526020016103d6604080518082019091526000808252602082015290565b815260006020820181905260409091015290565b6000815180845260005b81811015610410576020818501810151868301820152016103f4565b81811115610422576000602083870101525b50601f01601f19169290920160200192915050565b600081516060845261044c60608501826103ea565b90506020830151848203602086015261046582826103ea565b6040948501516001600160a01b03169590940194909452509092915050565b8060005b60028110156104a95781511515845260209384019390910190600101610488565b50505050565b600081518084526020808501945080840160005b838110156104df578151875295820195908201906001016104c3565b509495945050505050565b80516000906101209084835b600481101561051f57825167ffffffffffffffff168252602092830192909101906001016104f6565b505050602083015181608086015261053982860182610437565b915050604083015161054e60a0860182610484565b50606083015184820360e086015261056682826103ea565b915050608083015184820361010086015261058182826104af565b95945050505050565b6000815160a0845261059f60a08501826103ea565b60208481015180516001600160a01b03168783015201516001600160c81b03166040808701919091528401516001600160d01b03166060808701919091529093015167ffffffffffffffff1660809094019390935250919050565b6020808252825182820182905280516001600160c01b03191660408401528082015160a06060850152600092919061010085019060e08601855b60018110156106635760df198885030182526106518484516103ea565b93509185019190850190600101610634565b50505060408201516001600160a01b031660808601526060820151858203603f1990810160a088015290935061069982856104ea565b935060808301519250808685030160c08701525050610581828261058a56fe4d6f6f20c3a9f09f9a806f4dc3a94d6f6fc3a96fc3a96f206f6f6fc3a9f09f9a806fc3a920204dc3a9c3a94dc3a94d6f6f4d6f20204d204dc3a94d4d6f6f20c3a9f09f9a806f6f4df09f9a80c3a9c3a96f6f206f6f4d20c3a920f09f9a804df09f9a806f4d4d6f6f20204d4d4d20f09f9a806f4df09f9a80f09f9a80a2646970667358221220fbb7bd43aca0d39498b3cce992e050db60d0baff1ecc1006812bbbb9af51350464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8c30c37a {\n string s_0;\n string s_1;\n address s_2;\n }\n\n struct S_e2219208 {\n uint64[4] s_0;\n S_8c30c37a s_1;\n bool[2] s_2;\n string s_3;\n bytes32[] s_4;\n }\n\n struct S_43558593 {\n address s_0;\n uint200 s_1;\n }\n\n struct S_c7ac1036 {\n string s_0;\n S_43558593 s_1;\n uint208 s_2;\n uint64 s_3;\n }\n\n struct S_cd9b6e81 {\n bytes8 s_0;\n string[1] s_1;\n address s_2;\n S_e2219208 s_3;\n S_c7ac1036 s_4;\n }\n\n struct S_9331c5c8 {\n S_cd9b6e81 s_0;\n }\n\n function test () public pure returns (S_9331c5c8 memory) {\n S_9331c5c8 memory r;\n {\n S_cd9b6e81 memory r_0;\n {\n bytes8 r_0_0 = bytes8(0x8845d5c6947aa8c5);\n r_0.s_0 = r_0_0;\n }\n {\n string[1] memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀🚀éoé oo🚀é\";\n r_0_1[0] = r_0_1_0;\n }\n r_0.s_1 = r_0_1;\n }\n {\n address r_0_2 = 0x359cD0745d1012cB89FDD74D8592CAb7Ba84af47;\n r_0.s_2 = r_0_2;\n }\n {\n S_e2219208 memory r_0_3;\n {\n uint64[4] memory r_0_3_0;\n {\n uint64 r_0_3_0_0 = 7254255887554804097;\n r_0_3_0[0] = r_0_3_0_0;\n }\n {\n uint64 r_0_3_0_1 = 949521475707603241;\n r_0_3_0[1] = r_0_3_0_1;\n }\n {\n uint64 r_0_3_0_2 = 18005144837519667542;\n r_0_3_0[2] = r_0_3_0_2;\n }\n {\n uint64 r_0_3_0_3 = 2938851722724532560;\n r_0_3_0[3] = r_0_3_0_3;\n }\n r_0_3.s_0 = r_0_3_0;\n }\n {\n S_8c30c37a memory r_0_3_1;\n {\n string memory r_0_3_1_0 = unicode\"Moo é🚀\";\n r_0_3_1.s_0 = r_0_3_1_0;\n }\n {\n string memory r_0_3_1_1 = unicode\"Moo é🚀\";\n r_0_3_1.s_1 = r_0_3_1_1;\n }\n {\n address r_0_3_1_2 = 0x45e6e4A3E4Da573035d3DE8fB955FD8221594542;\n r_0_3_1.s_2 = r_0_3_1_2;\n }\n r_0_3.s_1 = r_0_3_1;\n }\n {\n bool[2] memory r_0_3_2;\n {\n bool r_0_3_2_0 = true;\n r_0_3_2[0] = r_0_3_2_0;\n }\n {\n bool r_0_3_2_1 = true;\n r_0_3_2[1] = r_0_3_2_1;\n }\n r_0_3.s_2 = r_0_3_2;\n }\n {\n string memory r_0_3_3 = unicode\"Moo é🚀oMéMooéoéo oooé🚀oé MééMéMooMo M MéM\";\n r_0_3.s_3 = r_0_3_3;\n }\n {\n bytes32[] memory r_0_3_4 = new bytes32[](0);\n r_0_3.s_4 = r_0_3_4;\n }\n r_0.s_3 = r_0_3;\n }\n {\n S_c7ac1036 memory r_0_4;\n {\n string memory r_0_4_0 = unicode\"Moo é🚀ooM🚀ééoo ooM é 🚀M🚀oMMoo MMM 🚀oM🚀🚀\";\n r_0_4.s_0 = r_0_4_0;\n }\n {\n S_43558593 memory r_0_4_1;\n {\n address r_0_4_1_0 = 0x23c66e27C0590f2140F1C85Cbb870e112465315B;\n r_0_4_1.s_0 = r_0_4_1_0;\n }\n {\n uint200 r_0_4_1_1 = 360608226955343173499327957384725982904922611564353308372046;\n r_0_4_1.s_1 = r_0_4_1_1;\n }\n r_0_4.s_1 = r_0_4_1;\n }\n {\n uint208 r_0_4_2 = 18904749027156691926643271784224729714876680149984494052296269;\n r_0_4.s_2 = r_0_4_2;\n }\n {\n uint64 r_0_4_3 = 10357105648862011313;\n r_0_4.s_3 = r_0_4_3;\n }\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000208845d5c6947aa8c500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000359cd0745d1012cb89fdd74d8592cab7ba84af47000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a9206f6ff09f9a80c3a90000000000000000000000000000000000000000000000000000000064ac4b4b877d79810000000000000000000000000000000000000000000000000d2d60c05a280929000000000000000000000000000000000000000000000000f9df1fd599d1715600000000000000000000000000000000000000000000000028c8e612348a615000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000045e6e4a3e4da573035d3de8fb955fd8221594542000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a806f4dc3a94d6f6fc3a96fc3a96f206f6f6fc3a9f09f9a806fc3a920204dc3a9c3a94dc3a94d6f6f4d6f20204d204dc3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000023c66e27c0590f2140f1c85cbb870e112465315b000000000000003972bd8f2cd72fcbf7289b08552e58a27027021103a564ac4e0000000000000bc3b34544ef25fc783921f562f3731064fc609abda068edc64d0000000000000000000000000000000000000000000000008fbbd4b69d9c9fb100000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a806f6f4df09f9a80c3a9c3a96f6f206f6f4d20c3a920f09f9a804df09f9a806f4d4d6f6f20204d4d4d20f09f9a806f4df09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((uint248,(int152,string,int16[2]),string,address,address[])[1],string,(string,address,(address,address),address[4],bool),address)", + "type": "((uint248,(int152,string,int16[2]),string,address,address[])[1],string,(string,address,(address,address),address[4],bool),address)", + "value": [ + [ + [ + "97002626819882037930954750066705338905137732423656964250906865713242325063", + [ + "-1967128713573622175643667723191076847333504483", + "Moo é🚀 ooMoM🚀MéMoMo🚀oo🚀 ", + ["-6697", "11980"] + ], + "Moo é🚀", + "0x8dbDD8AcCf5B6B5Df59028034f8E077B66BD8517", + [ + "0xf7139788524A3F32aBA958a54e0F734B5c03cb16", + "0xb9DCdb5D0FC33652816CE9fc7B41001877a06505", + "0xa56CF124a6feC5cff51a1F4428070f23d3cC6363", + "0xd410DcD0268408FD51c3d7EaD201c00ff195C394" + ] + ] + ], + "Moo é🚀 éo 🚀o🚀ooé🚀éM🚀é🚀MoooMoé o 🚀🚀🚀oo oéoMé", + [ + "Moo é🚀éM 🚀 é", + "0x314ebA744e8C2F1005e5B2c2B1f064b04a2820eA", + [ + "0xCDaF034fCBB0c74ce9EA4Dc9Fc839aA93cA60Dc6", + "0x535283705AE27D13d2a4e61d5bfd3a8b3b5B6fA5" + ], + [ + "0xe8ee40abfa31E2008776Bb1Fe9c570C83480569F", + "0x37213e2747941d256Dc746619Ae2A25d1675dfDb", + "0xb41F828A9b1B0868005C366b624c0F91f7ff387c", + "0x61a47b3B0f54b741Bf6157b38EcFa5D747ce9FdD" + ], + true + ], + "0xF3A84631B9b5e3aad396206Fc9b32Fc260769b0E" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "97002626819882037930954750066705338905137732423656964250906865713242325063" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1967128713573622175643667723191076847333504483" + }, + { + "type": "string", + "value": "Moo é🚀 ooMoM🚀MéMoMo🚀oo🚀 " + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-6697" + }, + { + "type": "number", + "value": "11980" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0x8dbDD8AcCf5B6B5Df59028034f8E077B66BD8517" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xf7139788524A3F32aBA958a54e0F734B5c03cb16" + }, + { + "type": "address", + "value": "0xb9DCdb5D0FC33652816CE9fc7B41001877a06505" + }, + { + "type": "address", + "value": "0xa56CF124a6feC5cff51a1F4428070f23d3cC6363" + }, + { + "type": "address", + "value": "0xd410DcD0268408FD51c3d7EaD201c00ff195C394" + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 éo 🚀o🚀ooé🚀éM🚀é🚀MoooMoé o 🚀🚀🚀oo oéoMé" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éM 🚀 é" + }, + { + "type": "address", + "value": "0x314ebA744e8C2F1005e5B2c2B1f064b04a2820eA" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xCDaF034fCBB0c74ce9EA4Dc9Fc839aA93cA60Dc6" + }, + { + "type": "address", + "value": "0x535283705AE27D13d2a4e61d5bfd3a8b3b5B6fA5" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe8ee40abfa31E2008776Bb1Fe9c570C83480569F" + }, + { + "type": "address", + "value": "0x37213e2747941d256Dc746619Ae2A25d1675dfDb" + }, + { + "type": "address", + "value": "0xb41F828A9b1B0868005C366b624c0F91f7ff387c" + }, + { + "type": "address", + "value": "0x61a47b3B0f54b741Bf6157b38EcFa5D747ce9FdD" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xF3A84631B9b5e3aad396206Fc9b32Fc260769b0E" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061087c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061064c565b60405180910390f35b6100566103ed565b61005e6103ed565b610066610421565b61006e61044e565b7e36e6cb667c1ee2bd7e3da112d64a24342830ec1fe4ed6b44574e646af24047815261009861048a565b72583587b9b189c0ac521b2ab111ede59f6975e219815260408051606081019091526026808252600091906107d260208301396020830152506100d96104ae565b611a28198152612ecc6020808301919091526040838101929092528381019290925280518082018252600a8152689adede418753e13f3560b71b8184015283820152738dbdd8accf5b6b5df59028034f8e077b66bd851760608401528051600480825260a082019092526000929091908201608080368337019050509050600073f7139788524a3f32aba958a54e0f734b5c03cb1690508082600081518110610184576101846107bb565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073b9dcdb5d0fc33652816ce9fc7b41001877a06505905080826001815181106101d2576101d26107bb565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073a56cf124a6fec5cff51a1f4428070f23d3cc636390508082600281518110610220576102206107bb565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073d410dcd0268408fd51c3d7ead201c00ff195c3949050808260038151811061026e5761026e6107bb565b6001600160a01b039290921660209283029190910182015260808481019390935292845250918352604080519283019052604f808352600092916107f8908301396020830152506102bd6104cc565b60408051808201825260158152744d6f6f20c3a9f09f9a80c3a94d20f09f9a8020c3a960581b60208083019190915290835273314eba744e8c2f1005e5b2c2b1f064b04a2820ea838201528151808301835273cdaf034fcbb0c74ce9ea4dc9fc839aa93ca60dc6815273535283705ae27d13d2a4e61d5bfd3a8b3b5b6fa5918101919091529082015261034e610507565b73e8ee40abfa31e2008776bb1fe9c570c83480569f81527337213e2747941d256dc746619ae2a25d1675dfdb602082015273b41f828a9b1b0868005c366b624c0f91f7ff387c6040808301919091527361a47b3b0f54b741bf6157b38ecfa5d747ce9fdd606080840191909152838101929092526001608084015283019190915273f3a84631b9b5e3aad396206fc9b32fc260769b0e90820152919050565b6040518060800160405280610400610421565b8152602001606081526020016104146104cc565b8152600060209091015290565b60405180602001604052806001905b61043861044e565b8152602001906001900390816104305790505090565b6040518060a0016040528060006001600160f81b0316815260200161047161048a565b8152606060208201819052600060408301529081015290565b60408051606080820183526000825260208201529081016104a96104ae565b905290565b60405180604001604052806002906020820280368337509192915050565b6040805160a08101825260608152600060208201529081016104fe604080518082019091526000808252602082015290565b81526020016104145b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b8181101561054b5760208185018101518683018201520161052f565b8181111561055d576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156105ab5781516001600160a01b031687529582019590820190600101610586565b509495945050505050565b600061012082518185526105cc82860182610525565b91505060208084015160018060a01b0380821683880152604086015191508082511660408801528083830151166060880152606086015191506080870160005b600481101561062b57835183168252928401929084019060010161060c565b5050505050608083015161064461010086018215159052565b509392505050565b6000602080835260a08084018551608080858801528283905060c093508388016000805b600180821061067f5750610752565b8b8403609f19018552865180516001600160f81b031685528a8101518b86018b9052805160120b8b870152808c01518a87018990526106c2610120880182610525565b9050604080830151925060e08801875b60028110156106f0578451870b8252938f0193908f019086016106d2565b5050808401519450878203818901525061070a8185610525565b93505050606080820151610728828801826001600160a01b03169052565b50508601518482038588015261073e8282610572565b978b0197958b019594505050600101610670565b5050868a01519650601f199550858982030160408a01526107738188610525565b96505050604088015192508387860301606088015261079285846105b6565b9450606088015193506107af818801856001600160a01b03169052565b50929695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80206f6f4d6f4df09f9a804dc3a94d6f4d6ff09f9a806f6ff09f9a80204d6f6f20c3a9f09f9a8020c3a96f20f09f9a806ff09f9a806f6fc3a9f09f9a80c3a94df09f9a80c3a9f09f9a804d6f6f6f4d6fc3a920206f20f09f9a80f09f9a80f09f9a806f6f206fc3a96f4dc3a9a2646970667358221220a41835091e8685752ed39b08bd9d28d10e2574d435bf0d3769aa5f53b7e9351964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ebc47640 {\n int152 s_0;\n string s_1;\n int16[2] s_2;\n }\n\n struct S_2614f739 {\n uint248 s_0;\n S_ebc47640 s_1;\n string s_2;\n address s_3;\n address[] s_4;\n }\n\n struct S_3b625bf6 {\n address s_0;\n address s_1;\n }\n\n struct S_aaa2da57 {\n string s_0;\n address s_1;\n S_3b625bf6 s_2;\n address[4] s_3;\n bool s_4;\n }\n\n struct S_aef7017f {\n S_2614f739[1] s_0;\n string s_1;\n S_aaa2da57 s_2;\n address s_3;\n }\n\n function test () public pure returns (S_aef7017f memory) {\n S_aef7017f memory r;\n {\n S_2614f739[1] memory r_0;\n {\n S_2614f739 memory r_0_0;\n {\n uint248 r_0_0_0 = 97002626819882037930954750066705338905137732423656964250906865713242325063;\n r_0_0.s_0 = r_0_0_0;\n }\n {\n S_ebc47640 memory r_0_0_1;\n {\n int152 r_0_0_1_0 = -1967128713573622175643667723191076847333504483;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀 ooMoM🚀MéMoMo🚀oo🚀 \";\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n int16[2] memory r_0_0_1_2;\n {\n int16 r_0_0_1_2_0 = -6697;\n r_0_0_1_2[0] = r_0_0_1_2_0;\n }\n {\n int16 r_0_0_1_2_1 = 11980;\n r_0_0_1_2[1] = r_0_0_1_2_1;\n }\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n string memory r_0_0_2 = unicode\"Moo é🚀\";\n r_0_0.s_2 = r_0_0_2;\n }\n {\n address r_0_0_3 = 0x8dbDD8AcCf5B6B5Df59028034f8E077B66BD8517;\n r_0_0.s_3 = r_0_0_3;\n }\n {\n address[] memory r_0_0_4 = new address[](4);\n {\n address r_0_0_4_0 = 0xf7139788524A3F32aBA958a54e0F734B5c03cb16;\n r_0_0_4[0] = r_0_0_4_0;\n }\n {\n address r_0_0_4_1 = 0xb9DCdb5D0FC33652816CE9fc7B41001877a06505;\n r_0_0_4[1] = r_0_0_4_1;\n }\n {\n address r_0_0_4_2 = 0xa56CF124a6feC5cff51a1F4428070f23d3cC6363;\n r_0_0_4[2] = r_0_0_4_2;\n }\n {\n address r_0_0_4_3 = 0xd410DcD0268408FD51c3d7EaD201c00ff195C394;\n r_0_0_4[3] = r_0_0_4_3;\n }\n r_0_0.s_4 = r_0_0_4;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 éo 🚀o🚀ooé🚀éM🚀é🚀MoooMoé o 🚀🚀🚀oo oéoMé\";\n r.s_1 = r_1;\n }\n {\n S_aaa2da57 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀éM 🚀 é\";\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x314ebA744e8C2F1005e5B2c2B1f064b04a2820eA;\n r_2.s_1 = r_2_1;\n }\n {\n S_3b625bf6 memory r_2_2;\n {\n address r_2_2_0 = 0xCDaF034fCBB0c74ce9EA4Dc9Fc839aA93cA60Dc6;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n address r_2_2_1 = 0x535283705AE27D13d2a4e61d5bfd3a8b3b5B6fA5;\n r_2_2.s_1 = r_2_2_1;\n }\n r_2.s_2 = r_2_2;\n }\n {\n address[4] memory r_2_3;\n {\n address r_2_3_0 = 0xe8ee40abfa31E2008776Bb1Fe9c570C83480569F;\n r_2_3[0] = r_2_3_0;\n }\n {\n address r_2_3_1 = 0x37213e2747941d256Dc746619Ae2A25d1675dfDb;\n r_2_3[1] = r_2_3_1;\n }\n {\n address r_2_3_2 = 0xb41F828A9b1B0868005C366b624c0F91f7ff387c;\n r_2_3[2] = r_2_3_2;\n }\n {\n address r_2_3_3 = 0x61a47b3B0f54b741Bf6157b38EcFa5D747ce9FdD;\n r_2_3[3] = r_2_3_3;\n }\n r_2.s_3 = r_2_3;\n }\n {\n bool r_2_4 = true;\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xF3A84631B9b5e3aad396206Fc9b32Fc260769b0E;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000380000000000000000000000000f3a84631b9b5e3aad396206fc9b32fc260769b0e00000000000000000000000000000000000000000000000000000000000000200036e6cb667c1ee2bd7e3da112d64a24342830ec1fe4ed6b44574e646af2404700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001800000000000000000000000008dbdd8accf5b6b5df59028034f8e077b66bd851700000000000000000000000000000000000000000000000000000000000001c0ffffffffffffffffffffffffffa7ca78464e763f53ade4d54eee121a60968a1d0000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5d70000000000000000000000000000000000000000000000000000000000002ecc00000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80206f6f4d6f4df09f9a804dc3a94d6f4d6ff09f9a806f6ff09f9a80200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000f7139788524a3f32aba958a54e0f734b5c03cb16000000000000000000000000b9dcdb5d0fc33652816ce9fc7b41001877a06505000000000000000000000000a56cf124a6fec5cff51a1f4428070f23d3cc6363000000000000000000000000d410dcd0268408fd51c3d7ead201c00ff195c394000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a8020c3a96f20f09f9a806ff09f9a806f6fc3a9f09f9a80c3a94df09f9a80c3a9f09f9a804d6f6f6f4d6fc3a920206f20f09f9a80f09f9a80f09f9a806f6f206fc3a96f4dc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000314eba744e8c2f1005e5b2c2b1f064b04a2820ea000000000000000000000000cdaf034fcbb0c74ce9ea4dc9fc839aa93ca60dc6000000000000000000000000535283705ae27d13d2a4e61d5bfd3a8b3b5b6fa5000000000000000000000000e8ee40abfa31e2008776bb1fe9c570c83480569f00000000000000000000000037213e2747941d256dc746619ae2a25d1675dfdb000000000000000000000000b41f828a9b1b0868005c366b624c0f91f7ff387c00000000000000000000000061a47b3b0f54b741bf6157b38ecfa5d747ce9fdd000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a80c3a94d20f09f9a8020c3a90000000000000000000000" + }, + { + "name": "random-(address[],bool,bytes7,string,(bytes19,bytes12[4],((bool),address,string,bytes20,bytes7),(string,string,bool,int64),address))[2]", + "type": "(address[],bool,bytes7,string,(bytes19,bytes12[4],((bool),address,string,bytes20,bytes7),(string,string,bool,int64),address))[2]", + "value": [ + [ + [ + "0x38193019ccB0a4dcA827Fb421A7d5C035931EFe5", + "0xe48a56a70D0568989e4df130666485F1d1a1b9D2", + "0x8783BBcE01E9A7BE94a1Ba5Fe4AeFEd0e3653156", + "0x587eCE9AA9020dd4E7bf669Af6E43c5a45c3F64A" + ], + true, + "0x9eb5b8fa44c79b", + "Moo é🚀o🚀🚀oo 🚀oo 🚀 Méo🚀 é éM🚀 é🚀oM 🚀MM🚀 ooooo🚀Mé MéoM 🚀oéoéo ", + [ + "0x6dc3e4b04b032206455dee245f2fcfa2e73906", + [ + "0x6b9ff9b005dec83fc18d14df", + "0x9c95ef77a7194af24b5aad7c", + "0x9c91591702e75c2ac21c9ebf", + "0x1946ead544200907594df718" + ], + [ + [true], + "0x913D2037593aD1A1A931261Cb5e43c5ff6c9FB60", + "Moo é🚀oéé🚀é🚀 M🚀 oé🚀oo é🚀🚀🚀o é🚀 M oo Mé o🚀oooooMooo M🚀o", + "0x289d702ef9ef2b93eeead1b3f08aa7b13d77709a", + "0x7e22681a226b30" + ], + ["Moo é🚀", "Moo é🚀M Moéoéo🚀🚀oMMoMM oooéooé ", true, "-7018813490672324756"], + "0x45609Ca234CfB0059EE9BAB9cA14f063a300aB9a" + ] + ], + [ + [ + "0xEf158481b9089c256cECf4f372015a2b9131c7F1", + "0x6F8Ce6adBE51B87F41Eeeb1614c463Ca412761F1", + "0x7C34b9E0E32eA42A8085aAb68A1b091B958F77D5", + "0x366A7D867c41cb533d2417D0571EaDD334982144" + ], + true, + "0xb1293a224fccf4", + "Moo é🚀", + [ + "0x27f1f264ca54d67ddbe4fc44dc027442b69bb2", + [ + "0xe3e41403ed869ede64f832b6", + "0x32b1fe9b20e7c44af4b7abed", + "0x775a84b099d9b6265b875b1c", + "0x677f8807440ea1764944f440" + ], + [ + [true], + "0x92F06D63f39853229e2b29199F453d2002070FF7", + "Moo é🚀oé 🚀oéo o oo oééooéoooéo oMoM🚀MéooéM🚀oMo🚀o🚀éo🚀Mo", + "0x013d19bf6ca65d3812ff246901bdcc7fcd1ab957", + "0xaf1d2b6c9393de" + ], + [ + "Moo é🚀 Moo 🚀éooooM éo🚀é🚀oé🚀🚀oMéM🚀🚀o oéoo🚀ééMéo🚀🚀ooo", + "Moo é🚀 éé🚀oo Méoé🚀🚀éoé🚀o🚀 MéM🚀M 🚀M🚀🚀oooéoé 🚀🚀🚀M 🚀ooMéo", + false, + "-9008147863258183686" + ], + "0x6C74D7188c2f5545b1f70C462a33fFA940Cbf899" + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x38193019ccB0a4dcA827Fb421A7d5C035931EFe5" + }, + { + "type": "address", + "value": "0xe48a56a70D0568989e4df130666485F1d1a1b9D2" + }, + { + "type": "address", + "value": "0x8783BBcE01E9A7BE94a1Ba5Fe4AeFEd0e3653156" + }, + { + "type": "address", + "value": "0x587eCE9AA9020dd4E7bf669Af6E43c5a45c3F64A" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x9eb5b8fa44c79b" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀oo 🚀oo 🚀 Méo🚀 é éM🚀 é🚀oM 🚀MM🚀 ooooo🚀Mé MéoM 🚀oéoéo " + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6dc3e4b04b032206455dee245f2fcfa2e73906" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6b9ff9b005dec83fc18d14df" + }, + { + "type": "hexstring", + "value": "0x9c95ef77a7194af24b5aad7c" + }, + { + "type": "hexstring", + "value": "0x9c91591702e75c2ac21c9ebf" + }, + { + "type": "hexstring", + "value": "0x1946ead544200907594df718" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x913D2037593aD1A1A931261Cb5e43c5ff6c9FB60" + }, + { + "type": "string", + "value": "Moo é🚀oéé🚀é🚀 M🚀 oé🚀oo é🚀🚀🚀o é🚀 M oo Mé o🚀oooooMooo M🚀o" + }, + { + "type": "hexstring", + "value": "0x289d702ef9ef2b93eeead1b3f08aa7b13d77709a" + }, + { + "type": "hexstring", + "value": "0x7e22681a226b30" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀M Moéoéo🚀🚀oMMoMM oooéooé " + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-7018813490672324756" + } + ] + }, + { + "type": "address", + "value": "0x45609Ca234CfB0059EE9BAB9cA14f063a300aB9a" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xEf158481b9089c256cECf4f372015a2b9131c7F1" + }, + { + "type": "address", + "value": "0x6F8Ce6adBE51B87F41Eeeb1614c463Ca412761F1" + }, + { + "type": "address", + "value": "0x7C34b9E0E32eA42A8085aAb68A1b091B958F77D5" + }, + { + "type": "address", + "value": "0x366A7D867c41cb533d2417D0571EaDD334982144" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xb1293a224fccf4" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x27f1f264ca54d67ddbe4fc44dc027442b69bb2" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xe3e41403ed869ede64f832b6" + }, + { + "type": "hexstring", + "value": "0x32b1fe9b20e7c44af4b7abed" + }, + { + "type": "hexstring", + "value": "0x775a84b099d9b6265b875b1c" + }, + { + "type": "hexstring", + "value": "0x677f8807440ea1764944f440" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x92F06D63f39853229e2b29199F453d2002070FF7" + }, + { + "type": "string", + "value": "Moo é🚀oé 🚀oéo o oo oééooéoooéo oMoM🚀MéooéM🚀oMo🚀o🚀éo🚀Mo" + }, + { + "type": "hexstring", + "value": "0x013d19bf6ca65d3812ff246901bdcc7fcd1ab957" + }, + { + "type": "hexstring", + "value": "0xaf1d2b6c9393de" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Moo 🚀éooooM éo🚀é🚀oé🚀🚀oMéM🚀🚀o oéoo🚀ééMéo🚀🚀ooo" + }, + { + "type": "string", + "value": "Moo é🚀 éé🚀oo Méoé🚀🚀éoé🚀o🚀 MéM🚀M 🚀M🚀🚀oooéoé 🚀🚀🚀M 🚀ooMéo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-9008147863258183686" + } + ] + }, + { + "type": "address", + "value": "0x6C74D7188c2f5545b1f70C462a33fFA940Cbf899" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610d1e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906109dc565b60405180910390f35b6100566106ff565b61005e6106ff565b61006661072c565b60408051600480825260a082019092526000916020820160808036833701905050905060007338193019ccb0a4dca827fb421a7d5c035931efe5905080826000815181106100b6576100b6610abc565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073e48a56a70d0568989e4df130666485f1d1a1b9d29050808260018151811061010457610104610abc565b60200260200101906001600160a01b031690816001600160a01b031681525050506000738783bbce01e9a7be94a1ba5fe4aefed0e36531569050808260028151811061015257610152610abc565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073587ece9aa9020dd4e7bf669af6e43c5a45c3f64a905080826003815181106101a0576101a0610abc565b6001600160a01b0390921660209283029190910182015291835250600182820152669eb5b8fa44c79b60c81b604080840191909152805160a08101909152606a808252600092610be7908301396060830152506101fb61076c565b7236e1f2582581910322aef7122f97e7d1739c8360691b815261021c6107d6565b6b6b9ff9b005dec83fc18d14df60a01b81526b27257bdde9c652bc92d6ab5f60a21b6020808301919091526b9c91591702e75c2ac21c9ebf60a01b60408301526b0328dd5aa8840120eb29bee360a31b606083015282015261027c6107f4565b60408051602080820183526001825290835273913d2037593ad1a1a931261cb5e43c5ff6c9fb6083820152815160a08101909252606180835260009291610ad39083013960408084019190915273144eb8177cf795c9f77568d9f84553d89ebbb84d60611b6060808501919091526607e22681a226b360cc1b608080860191909152858301949094528151938401825280845260208401819052600091840182905283015250604080518082018252600a8152689adede418753e13f3560b71b602080830191909152908352815160608101909252602d80835260009291610c519083013960208301525060016040820152676167d5aeb83e5093196060808301919091528201527345609ca234cfb0059ee9bab9ca14f063a300ab9a60808083019190915282015281526103af61072c565b60408051600480825260a0820190925260009160208201608080368337019050509050600073ef158481b9089c256cecf4f372015a2b9131c7f1905080826000815181106103ff576103ff610abc565b60200260200101906001600160a01b031690816001600160a01b031681525050506000736f8ce6adbe51b87f41eeeb1614c463ca412761f19050808260018151811061044d5761044d610abc565b60200260200101906001600160a01b031690816001600160a01b031681525050506000737c34b9e0e32ea42a8085aab68a1b091b958f77d59050808260028151811061049b5761049b610abc565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073366a7d867c41cb533d2417d0571eadd334982144905080826003815181106104e9576104e9610abc565b6001600160a01b0390921660209283029190910182015291835250600182820152662c4a4e8893f33d60ca1b6040808401919091528051808201909152600a8152689adede418753e13f3560b71b91810191909152606082015261054b61076c565b7213f8f932652a6b3eedf27e226e013a215b4dd960691b815261056c6107d6565b6b71f20a01f6c34f6f327c195b60a11b81526b32b1fe9b20e7c44af4b7abed60a01b6020808301919091526b1dd6a12c26766d8996e1d6c760a21b60408301526b019dfe201d103a85d92513d160a61b60608301528201526105cc6107f4565b6040805160208082018352600182529083527392f06d63f39853229e2b29199f453d2002070ff783820152815160808101909252605580835260009291610b349083013960408084019190915273013d19bf6ca65d3812ff246901bdcc7fcd1ab95760601b60608085019190915266578e95b649c9ef60c91b60808086019190915285830194909452815193840182528084526020840181905260009184018290528301525060006040518060800160405280605e8152602001610b89605e91398252506040805160a08101909152606b80825260009190610c7e602083013960208301525060006040820152677d035ec121b2b80519606080830191909152820152736c74d7188c2f5545b1f70c462a33ffa940cbf89960808083019190915282015280826001602002015250919050565b60405180604001604052806002905b61071661072c565b81526020019060019003908161070e5790505090565b6040518060a001604052806060815260200160001515815260200160006001600160c81b03191681526020016060815260200161076761076c565b905290565b6040805160a0810190915260008152602081016107876107d6565b81526020016107946107f4565b81526020016107c960405180608001604052806060815260200160608152602001600015158152602001600060070b81525090565b8152600060209091015290565b60405180608001604052806004906020820280368337509192915050565b6040805160c081018252600060a082018181528252602082018190526060928201839052918101829052608081019190915290565b6000815180845260005b8181101561084f57602081850181015186830182015201610833565b81811115610861576000602083870101525b50601f01601f19169290920160200192915050565b8051511515825260018060a01b0360208201511660208301526000604082015160a060408501526108aa60a0850182610829565b6060848101516bffffffffffffffffffffffff1916908601526080938401516001600160c81b03191693909401929092525090919050565b60008151608084526108f76080850182610829565b9050602083015184820360208601526109108282610829565b915050604083015115156040850152606083015160070b60608501528091505092915050565b60006101006cffffffffffffffffffffffffff19835116845260208084015181860160005b60048110156109825782516001600160a01b0319168252918301919083019060010161095b565b5050505060408301518160a086015261099d82860182610876565b915050606083015184820360c08601526109b782826108e2565b91505060808301516109d460e08601826001600160a01b03169052565b509392505050565b602080825260009060608382018185018685805b6002811015610aae57888403601f190185528251805160a0808752815190870181905260c08701918a019085905b80821015610a475782516001600160a01b03168452928b0192918b019160019190910190610a1e565b505050888201511515868a01526040808301516001600160c81b031916908701528782015186820389880152610a7d8282610829565b91505060808083015192508682038188015250610a9a8183610936565b9689019695505050918601916001016109f0565b509198975050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806fc3a9c3a9f09f9a80c3a9f09f9a80204df09f9a80206fc3a9f09f9a806f6f20c3a9f09f9a80f09f9a80f09f9a806f20c3a9f09f9a80204d206f6f204dc3a9206ff09f9a806f6f6f6f6f4d6f6f6f2020204df09f9a806f4d6f6f20c3a9f09f9a806fc3a920f09f9a806fc3a96f206f206f6f206fc3a9c3a96f6fc3a96f6f6fc3a96f206f4d6f4df09f9a804dc3a96f6fc3a94df09f9a806f4d6ff09f9a806ff09f9a80c3a96ff09f9a804d6f4d6f6f20c3a9f09f9a80204d6f6f20f09f9a80c3a96f6f6f6f4d20c3a96ff09f9a80c3a9f09f9a806fc3a9f09f9a80f09f9a806f4dc3a94df09f9a80f09f9a806f206fc3a96f6ff09f9a80c3a9c3a94dc3a96ff09f9a80f09f9a806f6f6f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f6f20f09f9a806f6f20f09f9a80204dc3a96ff09f9a8020c3a920c3a94df09f9a8020c3a9f09f9a806f4d20f09f9a804d4df09f9a80206f6f6f6f6ff09f9a804dc3a920204dc3a96f4d20f09f9a806fc3a96fc3a96f204d6f6f20c3a9f09f9a804d204d6fc3a96fc3a96ff09f9a80f09f9a806f4d4d6f4d4d206f6f6fc3a96f6fc3a9204d6f6f20c3a9f09f9a8020c3a9c3a9f09f9a806f6f204dc3a96fc3a9f09f9a80f09f9a80c3a96fc3a9f09f9a806ff09f9a80204dc3a94df09f9a804d20f09f9a804df09f9a80f09f9a806f6f6fc3a96fc3a920f09f9a80f09f9a80f09f9a804d20f09f9a806f6f4dc3a96fa2646970667358221220a865098bf9cbc19bc698e48716e517a04110032ce20b65c3479b21ac77e5528664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_2b0ed142 {\n S_c1053bda s_0;\n address s_1;\n string s_2;\n bytes20 s_3;\n bytes7 s_4;\n }\n\n struct S_41757118 {\n string s_0;\n string s_1;\n bool s_2;\n int64 s_3;\n }\n\n struct S_57deda67 {\n bytes19 s_0;\n bytes12[4] s_1;\n S_2b0ed142 s_2;\n S_41757118 s_3;\n address s_4;\n }\n\n struct S_349ded74 {\n address[] s_0;\n bool s_1;\n bytes7 s_2;\n string s_3;\n S_57deda67 s_4;\n }\n\n function test () public pure returns (S_349ded74[2] memory) {\n S_349ded74[2] memory r;\n {\n S_349ded74 memory r_0;\n {\n address[] memory r_0_0 = new address[](4);\n {\n address r_0_0_0 = 0x38193019ccB0a4dcA827Fb421A7d5C035931EFe5;\n r_0_0[0] = r_0_0_0;\n }\n {\n address r_0_0_1 = 0xe48a56a70D0568989e4df130666485F1d1a1b9D2;\n r_0_0[1] = r_0_0_1;\n }\n {\n address r_0_0_2 = 0x8783BBcE01E9A7BE94a1Ba5Fe4AeFEd0e3653156;\n r_0_0[2] = r_0_0_2;\n }\n {\n address r_0_0_3 = 0x587eCE9AA9020dd4E7bf669Af6E43c5a45c3F64A;\n r_0_0[3] = r_0_0_3;\n }\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = true;\n r_0.s_1 = r_0_1;\n }\n {\n bytes7 r_0_2 = bytes7(0x9eb5b8fa44c79b);\n r_0.s_2 = r_0_2;\n }\n {\n string memory r_0_3 = unicode\"Moo é🚀o🚀🚀oo 🚀oo 🚀 Méo🚀 é éM🚀 é🚀oM 🚀MM🚀 ooooo🚀Mé MéoM 🚀oéoéo \";\n r_0.s_3 = r_0_3;\n }\n {\n S_57deda67 memory r_0_4;\n {\n bytes19 r_0_4_0 = bytes19(0x6dc3e4b04b032206455dee245f2fcfa2e73906);\n r_0_4.s_0 = r_0_4_0;\n }\n {\n bytes12[4] memory r_0_4_1;\n {\n bytes12 r_0_4_1_0 = bytes12(0x6b9ff9b005dec83fc18d14df);\n r_0_4_1[0] = r_0_4_1_0;\n }\n {\n bytes12 r_0_4_1_1 = bytes12(0x9c95ef77a7194af24b5aad7c);\n r_0_4_1[1] = r_0_4_1_1;\n }\n {\n bytes12 r_0_4_1_2 = bytes12(0x9c91591702e75c2ac21c9ebf);\n r_0_4_1[2] = r_0_4_1_2;\n }\n {\n bytes12 r_0_4_1_3 = bytes12(0x1946ead544200907594df718);\n r_0_4_1[3] = r_0_4_1_3;\n }\n r_0_4.s_1 = r_0_4_1;\n }\n {\n S_2b0ed142 memory r_0_4_2;\n {\n S_c1053bda memory r_0_4_2_0;\n {\n bool r_0_4_2_0_0 = true;\n r_0_4_2_0.s_0 = r_0_4_2_0_0;\n }\n r_0_4_2.s_0 = r_0_4_2_0;\n }\n {\n address r_0_4_2_1 = 0x913D2037593aD1A1A931261Cb5e43c5ff6c9FB60;\n r_0_4_2.s_1 = r_0_4_2_1;\n }\n {\n string memory r_0_4_2_2 = unicode\"Moo é🚀oéé🚀é🚀 M🚀 oé🚀oo é🚀🚀🚀o é🚀 M oo Mé o🚀oooooMooo M🚀o\";\n r_0_4_2.s_2 = r_0_4_2_2;\n }\n {\n bytes20 r_0_4_2_3 = bytes20(0x289d702eF9ef2b93EEEAd1B3f08aa7b13d77709a);\n r_0_4_2.s_3 = r_0_4_2_3;\n }\n {\n bytes7 r_0_4_2_4 = bytes7(0x7e22681a226b30);\n r_0_4_2.s_4 = r_0_4_2_4;\n }\n r_0_4.s_2 = r_0_4_2;\n }\n {\n S_41757118 memory r_0_4_3;\n {\n string memory r_0_4_3_0 = unicode\"Moo é🚀\";\n r_0_4_3.s_0 = r_0_4_3_0;\n }\n {\n string memory r_0_4_3_1 = unicode\"Moo é🚀M Moéoéo🚀🚀oMMoMM oooéooé \";\n r_0_4_3.s_1 = r_0_4_3_1;\n }\n {\n bool r_0_4_3_2 = true;\n r_0_4_3.s_2 = r_0_4_3_2;\n }\n {\n int64 r_0_4_3_3 = -7018813490672324756;\n r_0_4_3.s_3 = r_0_4_3_3;\n }\n r_0_4.s_3 = r_0_4_3;\n }\n {\n address r_0_4_4 = 0x45609Ca234CfB0059EE9BAB9cA14f063a300aB9a;\n r_0_4.s_4 = r_0_4_4;\n }\n r_0.s_4 = r_0_4;\n }\n r[0] = r_0;\n }\n {\n S_349ded74 memory r_1;\n {\n address[] memory r_1_0 = new address[](4);\n {\n address r_1_0_0 = 0xEf158481b9089c256cECf4f372015a2b9131c7F1;\n r_1_0[0] = r_1_0_0;\n }\n {\n address r_1_0_1 = 0x6F8Ce6adBE51B87F41Eeeb1614c463Ca412761F1;\n r_1_0[1] = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x7C34b9E0E32eA42A8085aAb68A1b091B958F77D5;\n r_1_0[2] = r_1_0_2;\n }\n {\n address r_1_0_3 = 0x366A7D867c41cb533d2417D0571EaDD334982144;\n r_1_0[3] = r_1_0_3;\n }\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = true;\n r_1.s_1 = r_1_1;\n }\n {\n bytes7 r_1_2 = bytes7(0xb1293a224fccf4);\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀\";\n r_1.s_3 = r_1_3;\n }\n {\n S_57deda67 memory r_1_4;\n {\n bytes19 r_1_4_0 = bytes19(0x27f1f264ca54d67ddbe4fc44dc027442b69bb2);\n r_1_4.s_0 = r_1_4_0;\n }\n {\n bytes12[4] memory r_1_4_1;\n {\n bytes12 r_1_4_1_0 = bytes12(0xe3e41403ed869ede64f832b6);\n r_1_4_1[0] = r_1_4_1_0;\n }\n {\n bytes12 r_1_4_1_1 = bytes12(0x32b1fe9b20e7c44af4b7abed);\n r_1_4_1[1] = r_1_4_1_1;\n }\n {\n bytes12 r_1_4_1_2 = bytes12(0x775a84b099d9b6265b875b1c);\n r_1_4_1[2] = r_1_4_1_2;\n }\n {\n bytes12 r_1_4_1_3 = bytes12(0x677f8807440ea1764944f440);\n r_1_4_1[3] = r_1_4_1_3;\n }\n r_1_4.s_1 = r_1_4_1;\n }\n {\n S_2b0ed142 memory r_1_4_2;\n {\n S_c1053bda memory r_1_4_2_0;\n {\n bool r_1_4_2_0_0 = true;\n r_1_4_2_0.s_0 = r_1_4_2_0_0;\n }\n r_1_4_2.s_0 = r_1_4_2_0;\n }\n {\n address r_1_4_2_1 = 0x92F06D63f39853229e2b29199F453d2002070FF7;\n r_1_4_2.s_1 = r_1_4_2_1;\n }\n {\n string memory r_1_4_2_2 = unicode\"Moo é🚀oé 🚀oéo o oo oééooéoooéo oMoM🚀MéooéM🚀oMo🚀o🚀éo🚀Mo\";\n r_1_4_2.s_2 = r_1_4_2_2;\n }\n {\n bytes20 r_1_4_2_3 = bytes20(0x013d19BF6Ca65D3812Ff246901bDcc7FCd1ab957);\n r_1_4_2.s_3 = r_1_4_2_3;\n }\n {\n bytes7 r_1_4_2_4 = bytes7(0xaf1d2b6c9393de);\n r_1_4_2.s_4 = r_1_4_2_4;\n }\n r_1_4.s_2 = r_1_4_2;\n }\n {\n S_41757118 memory r_1_4_3;\n {\n string memory r_1_4_3_0 = unicode\"Moo é🚀 Moo 🚀éooooM éo🚀é🚀oé🚀🚀oMéM🚀🚀o oéoo🚀ééMéo🚀🚀ooo\";\n r_1_4_3.s_0 = r_1_4_3_0;\n }\n {\n string memory r_1_4_3_1 = unicode\"Moo é🚀 éé🚀oo Méoé🚀🚀éoé🚀o🚀 MéM🚀M 🚀M🚀🚀oooéoé 🚀🚀🚀M 🚀ooMéo\";\n r_1_4_3.s_1 = r_1_4_3_1;\n }\n {\n bool r_1_4_3_2 = false;\n r_1_4_3.s_2 = r_1_4_3_2;\n }\n {\n int64 r_1_4_3_3 = -9008147863258183686;\n r_1_4_3.s_3 = r_1_4_3_3;\n }\n r_1_4.s_3 = r_1_4_3;\n }\n {\n address r_1_4_4 = 0x6C74D7188c2f5545b1f70C462a33fFA940Cbf899;\n r_1_4.s_4 = r_1_4_4;\n }\n r_1.s_4 = r_1_4;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000019eb5b8fa44c79b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000038193019ccb0a4dca827fb421a7d5c035931efe5000000000000000000000000e48a56a70d0568989e4df130666485f1d1a1b9d20000000000000000000000008783bbce01e9a7be94a1ba5fe4aefed0e3653156000000000000000000000000587ece9aa9020dd4e7bf669af6e43c5a45c3f64a000000000000000000000000000000000000000000000000000000000000006a4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f6f20f09f9a806f6f20f09f9a80204dc3a96ff09f9a8020c3a920c3a94df09f9a8020c3a9f09f9a806f4d20f09f9a804d4df09f9a80206f6f6f6f6ff09f9a804dc3a920204dc3a96f4d20f09f9a806fc3a96fc3a96f20000000000000000000000000000000000000000000006dc3e4b04b032206455dee245f2fcfa2e73906000000000000000000000000006b9ff9b005dec83fc18d14df00000000000000000000000000000000000000009c95ef77a7194af24b5aad7c00000000000000000000000000000000000000009c91591702e75c2ac21c9ebf00000000000000000000000000000000000000001946ead544200907594df71800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000024000000000000000000000000045609ca234cfb0059ee9bab9ca14f063a300ab9a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000913d2037593ad1a1a931261cb5e43c5ff6c9fb6000000000000000000000000000000000000000000000000000000000000000a0289d702ef9ef2b93eeead1b3f08aa7b13d77709a0000000000000000000000007e22681a226b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a806fc3a9c3a9f09f9a80c3a9f09f9a80204df09f9a80206fc3a9f09f9a806f6f20c3a9f09f9a80f09f9a80f09f9a806f20c3a9f09f9a80204d206f6f204dc3a9206ff09f9a806f6f6f6f6f4d6f6f6f2020204df09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffff9e982a5147c1af6c000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a804d204d6fc3a96fc3a96ff09f9a80f09f9a806f4d4d6f4d4d206f6f6fc3a96f6fc3a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001b1293a224fccf400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000ef158481b9089c256cecf4f372015a2b9131c7f10000000000000000000000006f8ce6adbe51b87f41eeeb1614c463ca412761f10000000000000000000000007c34b9e0e32ea42a8085aab68a1b091b958f77d5000000000000000000000000366a7d867c41cb533d2417d0571eadd334982144000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000027f1f264ca54d67ddbe4fc44dc027442b69bb200000000000000000000000000e3e41403ed869ede64f832b6000000000000000000000000000000000000000032b1fe9b20e7c44af4b7abed0000000000000000000000000000000000000000775a84b099d9b6265b875b1c0000000000000000000000000000000000000000677f8807440ea1764944f4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002200000000000000000000000006c74d7188c2f5545b1f70c462a33ffa940cbf899000000000000000000000000000000000000000000000000000000000000000100000000000000000000000092f06d63f39853229e2b29199f453d2002070ff700000000000000000000000000000000000000000000000000000000000000a0013d19bf6ca65d3812ff246901bdcc7fcd1ab957000000000000000000000000af1d2b6c9393de0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a806fc3a920f09f9a806fc3a96f206f206f6f206fc3a9c3a96f6fc3a96f6f6fc3a96f206f4d6f4df09f9a804dc3a96f6fc3a94df09f9a806f4d6ff09f9a806ff09f9a80c3a96ff09f9a804d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff82fca13ede4d47fa000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80204d6f6f20f09f9a80c3a96f6f6f6f4d20c3a96ff09f9a80c3a9f09f9a806fc3a9f09f9a80f09f9a806f4dc3a94df09f9a80f09f9a806f206fc3a96f6ff09f9a80c3a9c3a94dc3a96ff09f9a80f09f9a806f6f6f0000000000000000000000000000000000000000000000000000000000000000006b4d6f6f20c3a9f09f9a8020c3a9c3a9f09f9a806f6f204dc3a96fc3a9f09f9a80f09f9a80c3a96fc3a9f09f9a806ff09f9a80204dc3a94df09f9a804d20f09f9a804df09f9a80f09f9a806f6f6fc3a96fc3a920f09f9a80f09f9a80f09f9a804d20f09f9a806f6f4dc3a96f000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,int88,(bool,uint136[],uint240,((address,(int64,string,bool,string,(bytes29,(bytes7,string))),string),int232,bool),bytes11),uint64)", + "type": "(bool,int88,(bool,uint136[],uint240,((address,(int64,string,bool,string,(bytes29,(bytes7,string))),string),int232,bool),bytes11),uint64)", + "value": [ + true, + "99068473432584017410456427", + [ + true, + ["85654337282655613828362063691203056929407"], + "1483865830802575623999652063910865397998733824359192943572190957063184561", + [ + [ + "0xf5E456F2a8CF50085ca6445813F5984e468510C0", + [ + "-5879535793652325958", + "Moo é🚀M 🚀Mé🚀🚀🚀 MM 🚀oéoéooo MoéoM🚀MMoé🚀oooMé 🚀oM MéMooéMé🚀Moéo🚀", + true, + "Moo é🚀 🚀éoéo M o ", + [ + "0x4480bf55b436b43deac8c745ddc00d367f11c315ae37087e214f15a512", + ["0xad0c5d8f6c063e", "Moo é🚀🚀ooéo 🚀 oMMMé🚀éooMM🚀oMoo M🚀o o🚀"] + ] + ], + "Moo é🚀" + ], + "-3082174989613501572030520261376293512742666392131679040348195889941144", + true + ], + "0xe62ca4d4a6620e5ff5bf84" + ], + "5699512860806215211" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "99068473432584017410456427" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "85654337282655613828362063691203056929407" + } + ] + }, + { + "type": "number", + "value": "1483865830802575623999652063910865397998733824359192943572190957063184561" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xf5E456F2a8CF50085ca6445813F5984e468510C0" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-5879535793652325958" + }, + { + "type": "string", + "value": "Moo é🚀M 🚀Mé🚀🚀🚀 MM 🚀oéoéooo MoéoM🚀MMoé🚀oooMé 🚀oM MéMooéMé🚀Moéo🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀 🚀éoéo M o " + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4480bf55b436b43deac8c745ddc00d367f11c315ae37087e214f15a512" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xad0c5d8f6c063e" + }, + { + "type": "string", + "value": "Moo é🚀🚀ooéo 🚀 oMMMé🚀éooMM🚀oMoo M🚀o o🚀" + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "number", + "value": "-3082174989613501572030520261376293512742666392131679040348195889941144" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xe62ca4d4a6620e5ff5bf84" + } + ] + }, + { + "type": "number", + "value": "5699512860806215211" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610722806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061053b565b60405180910390f35b6100566102c2565b61005e6102c2565b600181526a51f290b4bdd343e286fb6b602082015261007b6102ee565b60018082526040805182815280820190915260009160208083019080368337019050509050600070fbb7294dce6cd29f3220c87d432b6e8a7f905080826000815181106100ca576100ca61062e565b6001600160881b03909216602092830291909101820152830191909152507dd6ffa485a20ded614534ddbc21c5a0f459acf32be45c4809391e2bcd20b16040820152610114610311565b61011c610338565b73f5e456f2a8cf50085ca6445813f5984e468510c0815261013b610368565b6751984ea738d75e451981526040805160a08101909152606a80825260009190610645602083013960208084019190915260016040808501919091528051808201909152601c81527f4d6f6f20c3a9f09f9a80202020f09f9a80c3a96fc3a96f204d206f2000000000918101919091526060830152506101b96103a1565b7f4480bf55b436b43deac8c745ddc00d367f11c315ae37087e214f15a51200000081526040805180820190915260008152606060208201526656862ec7b6031f60c91b81526040805160608101909152603e808252600091906106af6020830139602080840191909152838101929092525060808084019290925283810192909252604080518082018252600a8152689adede418753e13f3560b71b81850152818501529284527fffffff8dacffa30f32b3a00fca8bac233abb2091e417c47e8464842e168af568918401919091526001838301526060848101939093526a398b293529988397fd6fe160aa1b90840152830191909152674f18bcbfe51ff62b90820152919050565b60408051608081018252600080825260208201529081016102e16102ee565b8152600060209091015290565b6040805160a0810182526000808252606060208301819052928201529081016102e15b6040518060600160405280610324610338565b815260006020820181905260409091015290565b604051806060016040528060006001600160a01b0316815260200161035b610368565b8152602001606081525090565b6040518060a00160405280600060070b8152602001606081526020016000151581526020016060815260200161039c6103a1565b905290565b6040518060400160405280600062ffffff1916815260200161039c604051806040016040528060006001600160c81b0319168152602001606081525090565b6000815180845260005b81811015610406576020818501810151868301820152016103ea565b81811115610418576000602083870101525b50601f01601f19169290920160200192915050565b600081516060845260018060a01b03815116606085015260208082015160606080870152805160070b60c08701528181015160a060e08801526104746101608801826103e0565b90506040808301511515610100890152606083015160bf19808a8503016101208b01526104a184836103e0565b6080958601518b82039092016101408c0152815162ffffff191681529086015186820184905280516001600160c81b0319168483015286015160608201849052949093506104f291508301846103e0565b94810151888603605f190160a08a015294925061050f83866103e0565b945083870151925061052584890184601c0b9052565b9586015115159690950195909552509392505050565b60006020808352835115158184015280840151600a0b604084015260408401516080606085015261014084018151151560a08601528282015160a060c0870152818151808452610160880191508583019350600092505b808310156105bb5783516001600160881b03168252928501926001929092019190850190610592565b5060408401516001600160f01b031660e08801526060840151878203609f190161010089015294506105ed818661042d565b9450505050608081015190506106106101208501826001600160a81b0319169052565b50606084015167ffffffffffffffff81166080850152509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d20f09f9a804dc3a9f09f9a80f09f9a80f09f9a80204d4d20f09f9a806fc3a96fc3a96f6f6f204d6fc3a96f4df09f9a804d4d6fc3a9f09f9a806f6f6f4dc3a920f09f9a806f4d204dc3a94d6f6fc3a94dc3a9f09f9a804d6fc3a96ff09f9a804d6f6f20c3a9f09f9a80f09f9a806f6fc3a96f20f09f9a80206f4d4d4dc3a9f09f9a80c3a96f6f4d4df09f9a806f4d6f6f204df09f9a806f206ff09f9a80a2646970667358221220914d6c2d8775c183fb085b959c645c966e664f044678584fee3b6bd05ee5849864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_76f7d9be {\n bytes7 s_0;\n string s_1;\n }\n\n struct S_b3bdae0d {\n bytes29 s_0;\n S_76f7d9be s_1;\n }\n\n struct S_89fa6770 {\n int64 s_0;\n string s_1;\n bool s_2;\n string s_3;\n S_b3bdae0d s_4;\n }\n\n struct S_62459ccf {\n address s_0;\n S_89fa6770 s_1;\n string s_2;\n }\n\n struct S_4a500eb6 {\n S_62459ccf s_0;\n int232 s_1;\n bool s_2;\n }\n\n struct S_6b6f8635 {\n bool s_0;\n uint136[] s_1;\n uint240 s_2;\n S_4a500eb6 s_3;\n bytes11 s_4;\n }\n\n struct S_9a6958f0 {\n bool s_0;\n int88 s_1;\n S_6b6f8635 s_2;\n uint64 s_3;\n }\n\n function test () public pure returns (S_9a6958f0 memory) {\n S_9a6958f0 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n int88 r_1 = 99068473432584017410456427;\n r.s_1 = r_1;\n }\n {\n S_6b6f8635 memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n {\n uint136[] memory r_2_1 = new uint136[](1);\n {\n uint136 r_2_1_0 = 85654337282655613828362063691203056929407;\n r_2_1[0] = r_2_1_0;\n }\n r_2.s_1 = r_2_1;\n }\n {\n uint240 r_2_2 = 1483865830802575623999652063910865397998733824359192943572190957063184561;\n r_2.s_2 = r_2_2;\n }\n {\n S_4a500eb6 memory r_2_3;\n {\n S_62459ccf memory r_2_3_0;\n {\n address r_2_3_0_0 = 0xf5E456F2a8CF50085ca6445813F5984e468510C0;\n r_2_3_0.s_0 = r_2_3_0_0;\n }\n {\n S_89fa6770 memory r_2_3_0_1;\n {\n int64 r_2_3_0_1_0 = -5879535793652325958;\n r_2_3_0_1.s_0 = r_2_3_0_1_0;\n }\n {\n string memory r_2_3_0_1_1 = unicode\"Moo é🚀M 🚀Mé🚀🚀🚀 MM 🚀oéoéooo MoéoM🚀MMoé🚀oooMé 🚀oM MéMooéMé🚀Moéo🚀\";\n r_2_3_0_1.s_1 = r_2_3_0_1_1;\n }\n {\n bool r_2_3_0_1_2 = true;\n r_2_3_0_1.s_2 = r_2_3_0_1_2;\n }\n {\n string memory r_2_3_0_1_3 = unicode\"Moo é🚀 🚀éoéo M o \";\n r_2_3_0_1.s_3 = r_2_3_0_1_3;\n }\n {\n S_b3bdae0d memory r_2_3_0_1_4;\n {\n bytes29 r_2_3_0_1_4_0 = bytes29(0x4480bf55b436b43deac8c745ddc00d367f11c315ae37087e214f15a512);\n r_2_3_0_1_4.s_0 = r_2_3_0_1_4_0;\n }\n {\n S_76f7d9be memory r_2_3_0_1_4_1;\n {\n bytes7 r_2_3_0_1_4_1_0 = bytes7(0xad0c5d8f6c063e);\n r_2_3_0_1_4_1.s_0 = r_2_3_0_1_4_1_0;\n }\n {\n string memory r_2_3_0_1_4_1_1 = unicode\"Moo é🚀🚀ooéo 🚀 oMMMé🚀éooMM🚀oMoo M🚀o o🚀\";\n r_2_3_0_1_4_1.s_1 = r_2_3_0_1_4_1_1;\n }\n r_2_3_0_1_4.s_1 = r_2_3_0_1_4_1;\n }\n r_2_3_0_1.s_4 = r_2_3_0_1_4;\n }\n r_2_3_0.s_1 = r_2_3_0_1;\n }\n {\n string memory r_2_3_0_2 = unicode\"Moo é🚀\";\n r_2_3_0.s_2 = r_2_3_0_2;\n }\n r_2_3.s_0 = r_2_3_0;\n }\n {\n int232 r_2_3_1 = -3082174989613501572030520261376293512742666392131679040348195889941144;\n r_2_3.s_1 = r_2_3_1;\n }\n {\n bool r_2_3_2 = true;\n r_2_3.s_2 = r_2_3_2;\n }\n r_2.s_3 = r_2_3;\n }\n {\n bytes11 r_2_4 = bytes11(0xe62ca4d4a6620e5ff5bf84);\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n uint64 r_3 = 5699512860806215211;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000051f290b4bdd343e286fb6b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000004f18bcbfe51ff62b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000d6ffa485a20ded614534ddbc21c5a0f459acf32be45c4809391e2bcd20b100000000000000000000000000000000000000000000000000000000000000e0e62ca4d4a6620e5ff5bf840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000fbb7294dce6cd29f3220c87d432b6e8a7f0000000000000000000000000000000000000000000000000000000000000060ffffff8dacffa30f32b3a00fca8bac233abb2091e417c47e8464842e168af5680000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f5e456f2a8cf50085ca6445813f5984e468510c0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c0ffffffffffffffffffffffffffffffffffffffffffffffffae67b158c728a1ba00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000006a4d6f6f20c3a9f09f9a804d20f09f9a804dc3a9f09f9a80f09f9a80f09f9a80204d4d20f09f9a806fc3a96fc3a96f6f6f204d6fc3a96f4df09f9a804d4d6fc3a9f09f9a806f6f6f4dc3a920f09f9a806f4d204dc3a94d6f6fc3a94dc3a9f09f9a804d6fc3a96ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80202020f09f9a80c3a96fc3a96f204d206f20000000004480bf55b436b43deac8c745ddc00d367f11c315ae37087e214f15a5120000000000000000000000000000000000000000000000000000000000000000000040ad0c5d8f6c063e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80f09f9a806f6fc3a96f20f09f9a80206f4d4d4dc3a9f09f9a80c3a96f6f4d4df09f9a806f4d6f6f204df09f9a806f206ff09f9a800000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint152,((address,bytes8,(bytes31,address,(string[],string,string,int200,int),bool,string),bool)[3],bool,(uint72,address[1])))", + "type": "(uint152,((address,bytes8,(bytes31,address,(string[],string,string,int200,int),bool,string),bool)[3],bool,(uint72,address[1])))", + "value": [ + "5159533543432923781032277669191604190015108103", + [ + [ + [ + "0x0508bA0Df204AdCfCd82C3acDeEC5DAd54D77121", + "0xc7618e7f429bd562", + [ + "0x5409447834ec158783622a3d0986c97e74bb8ebf0d546eda360ab9dd846105", + "0xC7D1651e6FaBcBA5c1238531c1aA95B60Dc8f235", + [ + [], + "Moo é🚀🚀M🚀 ooé", + "Moo é🚀Mé ééooéoéMéé🚀M🚀🚀oo🚀ooo éo 🚀MMéé éMooo", + "212791505914023039338568809134359311613690416063997367458563", + "-33530412298051405226546383261494022364457357270428692435909613237395782022285" + ], + false, + "Moo é🚀MMéMoo éoMo oM🚀o o" + ], + true + ], + [ + "0x297720CB452CE99CdBe5A5a9BbB0d190a95e287c", + "0xfdf71c0e4c539392", + [ + "0x850c087a887c6d57169ca3b5807b319f2601b52f2d303d84873f34f9b6265a", + "0xDF5495699D89715E4DeA26C2463953c1b001fefD", + [ + [ + "Moo é🚀🚀oéo o🚀", + "Moo é🚀o éo🚀oéo éo ééé o oé🚀 🚀🚀 éoMoMMéM Mo 🚀oéMé🚀oo oé", + "Moo é🚀éooo🚀o oo é oo oooo🚀oMM ooéMoM🚀oéooo oMéoo ", + "Moo é🚀éoMMM🚀 Mo🚀éM M🚀🚀oéM🚀oooMo🚀🚀 Mé🚀🚀 🚀Mooéo🚀o🚀éoo" + ], + "Moo é🚀M🚀M", + "Moo é🚀oéM ooM🚀MMoM🚀é🚀Méé ooMé 🚀Moooo", + "-142973891831385108100828884113747081171727313794877729287305", + "-48798664125480539943696523578595559435549723640915617573467337944958554582935" + ], + false, + "Moo é🚀" + ], + true + ], + [ + "0x1aF2A54062dd5A79e88f5da6f079243321b81A9d", + "0xfdf2d5267c94b87a", + [ + "0x4d4c7813fc8c9423c7cfbcf34cdcb6d1b1fb36186400d92e3612359f4910c8", + "0x70534346085143e0c13292D52B48CAd0143ea44A", + [ + [ + "Moo é🚀🚀oo", + "Moo é🚀🚀oMMo🚀🚀o 🚀oo oéoMoooo 🚀o é é🚀Moéo", + "Moo é🚀é🚀oo é🚀oo🚀oé🚀Méoo🚀 o oMoo🚀oooM🚀🚀Méé o oé oéoMo🚀 🚀oé " + ], + "Moo é🚀 oéMoM🚀o 🚀", + "Moo é🚀 M 🚀ooo éoM oMMo🚀M🚀é ", + "-617982761035780618456704691967575022063648786862819971573220", + "-44328924306892541892128414215498959846674455559082904675115521585513791357478" + ], + true, + "Moo é🚀MoMo é🚀 🚀é🚀ooéM" + ], + false + ] + ], + false, + ["1625615725014830973962", ["0xbB7Fb0b202859A5F9983c109aa287BE554b8BAA6"]] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "5159533543432923781032277669191604190015108103" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0508bA0Df204AdCfCd82C3acDeEC5DAd54D77121" + }, + { + "type": "hexstring", + "value": "0xc7618e7f429bd562" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5409447834ec158783622a3d0986c97e74bb8ebf0d546eda360ab9dd846105" + }, + { + "type": "address", + "value": "0xC7D1651e6FaBcBA5c1238531c1aA95B60Dc8f235" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀 ooé" + }, + { + "type": "string", + "value": "Moo é🚀Mé ééooéoéMéé🚀M🚀🚀oo🚀ooo éo 🚀MMéé éMooo" + }, + { + "type": "number", + "value": "212791505914023039338568809134359311613690416063997367458563" + }, + { + "type": "number", + "value": "-33530412298051405226546383261494022364457357270428692435909613237395782022285" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀MMéMoo éoMo oM🚀o o" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x297720CB452CE99CdBe5A5a9BbB0d190a95e287c" + }, + { + "type": "hexstring", + "value": "0xfdf71c0e4c539392" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x850c087a887c6d57169ca3b5807b319f2601b52f2d303d84873f34f9b6265a" + }, + { + "type": "address", + "value": "0xDF5495699D89715E4DeA26C2463953c1b001fefD" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oéo o🚀" + }, + { + "type": "string", + "value": "Moo é🚀o éo🚀oéo éo ééé o oé🚀 🚀🚀 éoMoMMéM Mo 🚀oéMé🚀oo oé" + }, + { + "type": "string", + "value": "Moo é🚀éooo🚀o oo é oo oooo🚀oMM ooéMoM🚀oéooo oMéoo " + }, + { + "type": "string", + "value": "Moo é🚀éoMMM🚀 Mo🚀éM M🚀🚀oéM🚀oooMo🚀🚀 Mé🚀🚀 🚀Mooéo🚀o🚀éoo" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M🚀M" + }, + { + "type": "string", + "value": "Moo é🚀oéM ooM🚀MMoM🚀é🚀Méé ooMé 🚀Moooo" + }, + { + "type": "number", + "value": "-142973891831385108100828884113747081171727313794877729287305" + }, + { + "type": "number", + "value": "-48798664125480539943696523578595559435549723640915617573467337944958554582935" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1aF2A54062dd5A79e88f5da6f079243321b81A9d" + }, + { + "type": "hexstring", + "value": "0xfdf2d5267c94b87a" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4d4c7813fc8c9423c7cfbcf34cdcb6d1b1fb36186400d92e3612359f4910c8" + }, + { + "type": "address", + "value": "0x70534346085143e0c13292D52B48CAd0143ea44A" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀🚀oMMo🚀🚀o 🚀oo oéoMoooo 🚀o é é🚀Moéo" + }, + { + "type": "string", + "value": "Moo é🚀é🚀oo é🚀oo🚀oé🚀Méoo🚀 o oMoo🚀oooM🚀🚀Méé o oé oéoMo🚀 🚀oé " + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 oéMoM🚀o 🚀" + }, + { + "type": "string", + "value": "Moo é🚀 M 🚀ooo éoM oMMo🚀M🚀é " + }, + { + "type": "number", + "value": "-617982761035780618456704691967575022063648786862819971573220" + }, + { + "type": "number", + "value": "-44328924306892541892128414215498959846674455559082904675115521585513791357478" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀MoMo é🚀 🚀é🚀ooéM" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1625615725014830973962" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xbB7Fb0b202859A5F9983c109aa287BE554b8BAA6" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610e16806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061094d565b60405180910390f35b61005661076b565b61005e61076b565b72e75c8a553cc8ee25c162353854acfddec7b407815261007c610793565b6100846107ba565b61008c6107e7565b730508ba0df204adcfcd82c3acdeec5dad54d7712181526763b0c73fa14deab160c11b60208201526100bc610813565b7f5409447834ec158783622a3d0986c97e74bb8ebf0d546eda360ab9dd84610500815273c7d1651e6fabcba5c1238531c1aa95b60dc8f2356020820152610101610846565b604080516000808252602082019092528161012c565b60608152602001906001900390816101175790505b50825250604080518082018252601881527f4d6f6f20c3a9f09f9a80f09f9a804df09f9a80206f6fc3a9000000000000000060208083019190915280840191909152815160808101909252604b80835260009291610d96908301396040808401919091527821e64efb9d47b6df442e1b0fca678abfcdcd98f4d6fe929b036060808501919091527fb5de758cb0986b2547fb181ba430f5d5f21ae68fe8f82f169ed5d0f731794b7360808501528482019390935260008484018190528151938401909152602180845290929150610ca96020830139608083015250604082015260016060820152815261021d6107e7565b73297720cb452ce99cdbe5a5a9bbb0d190a95e287c8152677efb8e072629c9c960c11b602082015261024d610813565b7f850c087a887c6d57169ca3b5807b319f2601b52f2d303d84873f34f9b6265a00815273df5495699d89715e4dea26c2463953c1b001fefd6020820152610292610846565b60408051600480825260a08201909252600091816020015b60608152602001906001900390816102aa57905050905060006040518060400160405280601981526020017f4d6f6f20c3a9f09f9a80f09f9a806fc3a96f20206ff09f9a80000000000000008152509050808260008151811061030f5761030f610b2f565b60200260200101819052505060006040518060800160405280605a8152602001610ba7605a91399050808260018151811061034c5761034c610b2f565b6020026020010181905250506000604051806080016040528060438152602001610d2e604391399050808260028151811061038957610389610b2f565b60200260200101819052505060006040518060a0016040528060618152602001610b4660619139905080826003815181106103c6576103c6610b2f565b60209081029190910181019190915291835250604080518082018252601081526f4d6f6f20c3a9f09f9a804df09f9a804d60801b8184015283830152805160608101909152603a808252600092610cf4908301396040838101919091527816c6ed148d2cceb62b365ccb83a38286d1d93b3bba96402c88196060808501919091527f941cef54cdebd300d6f82187efc243cc2196dbe3a94e9ade61902523df2c50696080808601919091528583019490945260008582015281518083018352600a8152689adede418753e13f3560b71b6020828101919091529486015290850193909352506001918301919091528201526104bf6107e7565b731af2a54062dd5a79e88f5da6f079243321b81a9d8152677ef96a933e4a5c3d60c11b60208201526104ef610813565b7f4d4c7813fc8c9423c7cfbcf34cdcb6d1b1fb36186400d92e3612359f4910c80081527370534346085143e0c13292d52b48cad0143ea44a6020820152610534610846565b60408051600380825260808201909252600091816020015b606081526020019060019003908161054c57905050905060006040518060400160405280601081526020016f4d6f6f20c3a9f09f9a80f09f9a806f6f60801b815250905080826000815181106105a4576105a4610b2f565b6020026020010181905250506000604051806080016040528060438152602001610c6660439139905080826001815181106105e1576105e1610b2f565b60200260200101819052505060006040518060a0016040528060658152602001610c01606591399050808260028151811061061e5761061e610b2f565b60209081029190910181019190915291835250604080518082018252601b81527f4d6f6f20c3a9f09f9a80206fc3a94d6f4df09f9a806f20f09f9a8000000000008184015283830152805160608101909152602a808252600092610cca908301396040808401919091527862734913244b38f5cdc88add72d4d7c14d6d0b331103de25e3196060808501919091527f9dfeb7cd133e5efc45f599212781b2516a14a34829b39d5ef4a6a64450adfdda6080850152848201939093526001848401528051928301905250602580825260009190610d716020830139608083015250604082810191909152600060608301819052908301919091529082526020820152610727610878565b68581ff339050e16840a815261073b610899565b73bb7fb0b202859a5f9983c109aa287be554b8baa681526020828101919091526040830191909152820152919050565b604051806040016040528060006001600160981b0316815260200161078e610793565b905290565b60405180606001604052806107a66107ba565b81526000602082015260400161078e610878565b60405180606001604052806003905b6107d16107e7565b8152602001906001900390816107c95790505090565b6040805160808101825260008082526020820152908101610806610813565b8152600060209091015290565b6040805160a08101825260008082526020820152908101610832610846565b815260006020820152606060409091015290565b6040518060a00160405280606081526020016060815260200160608152602001600060180b8152602001600081525090565b6040518060400160405280600068ffffffffffffffffff16815260200161078e5b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156108dd576020818501810151868301820152016108c1565b818111156108ef576000602083870101525b50601f01601f19169290920160200192915050565b68ffffffffffffffffff815116825260208082015181840160005b60018110156109455782516001600160a01b03168252918301919083019060010161091f565b505050505050565b600060208083526001600160981b0384511681840152808401516040808186015260e0850182516080806060890152828390506101408901935060005b6003811015610b035760df198a8603018252835180516001600160a01b039081168752898201516001600160c01b0319168a88015287820151888801869052805160ff191686890152808b015190911660a0808901919091528189015160c0890182905280516101208a019290925281516101c08a018190529092916101e0600583901b8b01810192918e0191908b019060005b81811015610a4d576101df198d8603018352610a3b8585516108b7565b9450928f0192918f0191600101610a1e565b505050508b83015161011f19808b8403016101408c0152610a6e83836108b7565b92508b8501519150808b8403016101608c015250610a8c82826108b7565b9150506060830151610aa46101808b018260180b9052565b50918601516101a08901526060810151151560e089015280860151888303607f19016101008a015291610ad781846108b7565b9250505060608201519150610af0606088018315159052565b955050928701929087019060010161098a565b505094840151151594870194909452818301519350610b2560a0870185610904565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a96f4d4d4df09f9a80204d6ff09f9a80c3a94d204df09f9a80f09f9a806fc3a94df09f9a806f6f6f4d6ff09f9a80f09f9a80204dc3a9f09f9a80f09f9a8020f09f9a804d6f6fc3a96ff09f9a806ff09f9a80c3a96f6f4d6f6f20c3a9f09f9a806f20c3a96ff09f9a806fc3a96f202020c3a96f20c3a9c3a9c3a9206f206fc3a9f09f9a8020f09f9a80f09f9a8020c3a96f4d6f4d4dc3a94d204d6f20f09f9a806fc3a94dc3a9f09f9a806f6f206fc3a94d6f6f20c3a9f09f9a80c3a9f09f9a806f6f20c3a9f09f9a806f6ff09f9a806fc3a9f09f9a804dc3a96f6ff09f9a80206f206f4d6f6ff09f9a806f6f6f4df09f9a80f09f9a804dc3a9c3a9206f206fc3a9206fc3a96f4d6ff09f9a8020f09f9a806fc3a9204d6f6f20c3a9f09f9a80f09f9a806f4d4d6ff09f9a80f09f9a806f2020f09f9a806f6f206fc3a96f4d6f6f6f6f20f09f9a806f2020c3a920c3a9f09f9a804d6fc3a96f4d6f6f20c3a9f09f9a804d4dc3a94d6f6f20c3a96f4d6f206f4df09f9a806f206f4d6f6f20c3a9f09f9a80204d20f09f9a806f6f6f20c3a96f4d206f4d4d6ff09f9a804df09f9a80c3a9204d6f6f20c3a9f09f9a806fc3a94d206f6f4df09f9a804d4d6f4df09f9a80c3a9f09f9a804dc3a9c3a920206f6f4dc3a920f09f9a804d6f6f6f6f4d6f6f20c3a9f09f9a80c3a96f6f6ff09f9a806f206f6f20c3a9206f6f206f6f6f6ff09f9a806f4d4d206f6fc3a94d6f4df09f9a806fc3a96f6f6f206f4dc3a96f6f204d6f6f20c3a9f09f9a804d6f4d6f20c3a9f09f9a8020f09f9a80c3a9f09f9a806f6fc3a94d4d6f6f20c3a9f09f9a804dc3a920c3a9c3a96f6fc3a96fc3a94dc3a9c3a9f09f9a804df09f9a80f09f9a806f6ff09f9a806f6f6f20c3a96f20f09f9a804d4dc3a9c3a92020c3a94d6f6f6fa264697066735822122011a13933dddd8498c63c6fd6265d6bfa79ce059f12916280a25fbc5ce31d7fd664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0756fe5d {\n string[] s_0;\n string s_1;\n string s_2;\n int200 s_3;\n int256 s_4;\n }\n\n struct S_6eba870e {\n bytes31 s_0;\n address s_1;\n S_0756fe5d s_2;\n bool s_3;\n string s_4;\n }\n\n struct S_545489c5 {\n address s_0;\n bytes8 s_1;\n S_6eba870e s_2;\n bool s_3;\n }\n\n struct S_6a3ee73a {\n uint72 s_0;\n address[1] s_1;\n }\n\n struct S_361dd6b0 {\n S_545489c5[3] s_0;\n bool s_1;\n S_6a3ee73a s_2;\n }\n\n struct S_0673135d {\n uint152 s_0;\n S_361dd6b0 s_1;\n }\n\n function test () public pure returns (S_0673135d memory) {\n S_0673135d memory r;\n {\n uint152 r_0 = 5159533543432923781032277669191604190015108103;\n r.s_0 = r_0;\n }\n {\n S_361dd6b0 memory r_1;\n {\n S_545489c5[3] memory r_1_0;\n {\n S_545489c5 memory r_1_0_0;\n {\n address r_1_0_0_0 = 0x0508bA0Df204AdCfCd82C3acDeEC5DAd54D77121;\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n bytes8 r_1_0_0_1 = bytes8(0xc7618e7f429bd562);\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n S_6eba870e memory r_1_0_0_2;\n {\n bytes31 r_1_0_0_2_0 = bytes31(0x5409447834ec158783622a3d0986c97e74bb8ebf0d546eda360ab9dd846105);\n r_1_0_0_2.s_0 = r_1_0_0_2_0;\n }\n {\n address r_1_0_0_2_1 = 0xC7D1651e6FaBcBA5c1238531c1aA95B60Dc8f235;\n r_1_0_0_2.s_1 = r_1_0_0_2_1;\n }\n {\n S_0756fe5d memory r_1_0_0_2_2;\n {\n string[] memory r_1_0_0_2_2_0 = new string[](0);\n r_1_0_0_2_2.s_0 = r_1_0_0_2_2_0;\n }\n {\n string memory r_1_0_0_2_2_1 = unicode\"Moo é🚀🚀M🚀 ooé\";\n r_1_0_0_2_2.s_1 = r_1_0_0_2_2_1;\n }\n {\n string memory r_1_0_0_2_2_2 = unicode\"Moo é🚀Mé ééooéoéMéé🚀M🚀🚀oo🚀ooo éo 🚀MMéé éMooo\";\n r_1_0_0_2_2.s_2 = r_1_0_0_2_2_2;\n }\n {\n int200 r_1_0_0_2_2_3 = 212791505914023039338568809134359311613690416063997367458563;\n r_1_0_0_2_2.s_3 = r_1_0_0_2_2_3;\n }\n {\n int r_1_0_0_2_2_4 = -33530412298051405226546383261494022364457357270428692435909613237395782022285;\n r_1_0_0_2_2.s_4 = r_1_0_0_2_2_4;\n }\n r_1_0_0_2.s_2 = r_1_0_0_2_2;\n }\n {\n bool r_1_0_0_2_3 = false;\n r_1_0_0_2.s_3 = r_1_0_0_2_3;\n }\n {\n string memory r_1_0_0_2_4 = unicode\"Moo é🚀MMéMoo éoMo oM🚀o o\";\n r_1_0_0_2.s_4 = r_1_0_0_2_4;\n }\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n {\n bool r_1_0_0_3 = true;\n r_1_0_0.s_3 = r_1_0_0_3;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n S_545489c5 memory r_1_0_1;\n {\n address r_1_0_1_0 = 0x297720CB452CE99CdBe5A5a9BbB0d190a95e287c;\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n bytes8 r_1_0_1_1 = bytes8(0xfdf71c0e4c539392);\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n {\n S_6eba870e memory r_1_0_1_2;\n {\n bytes31 r_1_0_1_2_0 = bytes31(0x850c087a887c6d57169ca3b5807b319f2601b52f2d303d84873f34f9b6265a);\n r_1_0_1_2.s_0 = r_1_0_1_2_0;\n }\n {\n address r_1_0_1_2_1 = 0xDF5495699D89715E4DeA26C2463953c1b001fefD;\n r_1_0_1_2.s_1 = r_1_0_1_2_1;\n }\n {\n S_0756fe5d memory r_1_0_1_2_2;\n {\n string[] memory r_1_0_1_2_2_0 = new string[](4);\n {\n string memory r_1_0_1_2_2_0_0 = unicode\"Moo é🚀🚀oéo o🚀\";\n r_1_0_1_2_2_0[0] = r_1_0_1_2_2_0_0;\n }\n {\n string memory r_1_0_1_2_2_0_1 = unicode\"Moo é🚀o éo🚀oéo éo ééé o oé🚀 🚀🚀 éoMoMMéM Mo 🚀oéMé🚀oo oé\";\n r_1_0_1_2_2_0[1] = r_1_0_1_2_2_0_1;\n }\n {\n string memory r_1_0_1_2_2_0_2 = unicode\"Moo é🚀éooo🚀o oo é oo oooo🚀oMM ooéMoM🚀oéooo oMéoo \";\n r_1_0_1_2_2_0[2] = r_1_0_1_2_2_0_2;\n }\n {\n string memory r_1_0_1_2_2_0_3 = unicode\"Moo é🚀éoMMM🚀 Mo🚀éM M🚀🚀oéM🚀oooMo🚀🚀 Mé🚀🚀 🚀Mooéo🚀o🚀éoo\";\n r_1_0_1_2_2_0[3] = r_1_0_1_2_2_0_3;\n }\n r_1_0_1_2_2.s_0 = r_1_0_1_2_2_0;\n }\n {\n string memory r_1_0_1_2_2_1 = unicode\"Moo é🚀M🚀M\";\n r_1_0_1_2_2.s_1 = r_1_0_1_2_2_1;\n }\n {\n string memory r_1_0_1_2_2_2 = unicode\"Moo é🚀oéM ooM🚀MMoM🚀é🚀Méé ooMé 🚀Moooo\";\n r_1_0_1_2_2.s_2 = r_1_0_1_2_2_2;\n }\n {\n int200 r_1_0_1_2_2_3 = -142973891831385108100828884113747081171727313794877729287305;\n r_1_0_1_2_2.s_3 = r_1_0_1_2_2_3;\n }\n {\n int r_1_0_1_2_2_4 = -48798664125480539943696523578595559435549723640915617573467337944958554582935;\n r_1_0_1_2_2.s_4 = r_1_0_1_2_2_4;\n }\n r_1_0_1_2.s_2 = r_1_0_1_2_2;\n }\n {\n bool r_1_0_1_2_3 = false;\n r_1_0_1_2.s_3 = r_1_0_1_2_3;\n }\n {\n string memory r_1_0_1_2_4 = unicode\"Moo é🚀\";\n r_1_0_1_2.s_4 = r_1_0_1_2_4;\n }\n r_1_0_1.s_2 = r_1_0_1_2;\n }\n {\n bool r_1_0_1_3 = true;\n r_1_0_1.s_3 = r_1_0_1_3;\n }\n r_1_0[1] = r_1_0_1;\n }\n {\n S_545489c5 memory r_1_0_2;\n {\n address r_1_0_2_0 = 0x1aF2A54062dd5A79e88f5da6f079243321b81A9d;\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n bytes8 r_1_0_2_1 = bytes8(0xfdf2d5267c94b87a);\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n {\n S_6eba870e memory r_1_0_2_2;\n {\n bytes31 r_1_0_2_2_0 = bytes31(0x4d4c7813fc8c9423c7cfbcf34cdcb6d1b1fb36186400d92e3612359f4910c8);\n r_1_0_2_2.s_0 = r_1_0_2_2_0;\n }\n {\n address r_1_0_2_2_1 = 0x70534346085143e0c13292D52B48CAd0143ea44A;\n r_1_0_2_2.s_1 = r_1_0_2_2_1;\n }\n {\n S_0756fe5d memory r_1_0_2_2_2;\n {\n string[] memory r_1_0_2_2_2_0 = new string[](3);\n {\n string memory r_1_0_2_2_2_0_0 = unicode\"Moo é🚀🚀oo\";\n r_1_0_2_2_2_0[0] = r_1_0_2_2_2_0_0;\n }\n {\n string memory r_1_0_2_2_2_0_1 = unicode\"Moo é🚀🚀oMMo🚀🚀o 🚀oo oéoMoooo 🚀o é é🚀Moéo\";\n r_1_0_2_2_2_0[1] = r_1_0_2_2_2_0_1;\n }\n {\n string memory r_1_0_2_2_2_0_2 = unicode\"Moo é🚀é🚀oo é🚀oo🚀oé🚀Méoo🚀 o oMoo🚀oooM🚀🚀Méé o oé oéoMo🚀 🚀oé \";\n r_1_0_2_2_2_0[2] = r_1_0_2_2_2_0_2;\n }\n r_1_0_2_2_2.s_0 = r_1_0_2_2_2_0;\n }\n {\n string memory r_1_0_2_2_2_1 = unicode\"Moo é🚀 oéMoM🚀o 🚀\";\n r_1_0_2_2_2.s_1 = r_1_0_2_2_2_1;\n }\n {\n string memory r_1_0_2_2_2_2 = unicode\"Moo é🚀 M 🚀ooo éoM oMMo🚀M🚀é \";\n r_1_0_2_2_2.s_2 = r_1_0_2_2_2_2;\n }\n {\n int200 r_1_0_2_2_2_3 = -617982761035780618456704691967575022063648786862819971573220;\n r_1_0_2_2_2.s_3 = r_1_0_2_2_2_3;\n }\n {\n int r_1_0_2_2_2_4 = -44328924306892541892128414215498959846674455559082904675115521585513791357478;\n r_1_0_2_2_2.s_4 = r_1_0_2_2_2_4;\n }\n r_1_0_2_2.s_2 = r_1_0_2_2_2;\n }\n {\n bool r_1_0_2_2_3 = true;\n r_1_0_2_2.s_3 = r_1_0_2_2_3;\n }\n {\n string memory r_1_0_2_2_4 = unicode\"Moo é🚀MoMo é🚀 🚀é🚀ooéM\";\n r_1_0_2_2.s_4 = r_1_0_2_2_4;\n }\n r_1_0_2.s_2 = r_1_0_2_2;\n }\n {\n bool r_1_0_2_3 = false;\n r_1_0_2.s_3 = r_1_0_2_3;\n }\n r_1_0[2] = r_1_0_2;\n }\n r_1.s_0 = r_1_0;\n }\n {\n bool r_1_1 = false;\n r_1.s_1 = r_1_1;\n }\n {\n S_6a3ee73a memory r_1_2;\n {\n uint72 r_1_2_0 = 1625615725014830973962;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n address[1] memory r_1_2_1;\n {\n address r_1_2_1_0 = 0xbB7Fb0b202859A5F9983c109aa287BE554b8BAA6;\n r_1_2_1[0] = r_1_2_1_0;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000e75c8a553cc8ee25c162353854acfddec7b4070000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000581ff339050e16840a000000000000000000000000bb7fb0b202859a5f9983c109aa287be554b8baa60000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000508ba0df204adcfcd82c3acdeec5dad54d77121c7618e7f429bd562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000015409447834ec158783622a3d0986c97e74bb8ebf0d546eda360ab9dd84610500000000000000000000000000c7d1651e6fabcba5c1238531c1aa95b60dc8f23500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000021e64efb9d47b6df442e1b0fca678abfcdcd98f4d6fe929b03b5de758cb0986b2547fb181ba430f5d5f21ae68fe8f82f169ed5d0f731794b73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80f09f9a804df09f9a80206f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a804dc3a920c3a9c3a96f6fc3a96fc3a94dc3a9c3a9f09f9a804df09f9a80f09f9a806f6ff09f9a806f6f6f20c3a96f20f09f9a804d4dc3a9c3a92020c3a94d6f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a804d4dc3a94d6f6f20c3a96f4d6f206f4df09f9a806f206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000297720cb452ce99cdbe5a5a9bbb0d190a95e287cfdf71c0e4c53939200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001850c087a887c6d57169ca3b5807b319f2601b52f2d303d84873f34f9b6265a00000000000000000000000000df5495699d89715e4dea26c2463953c1b001fefd00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360ffffffffffffffe93912eb72d33149d4c9a3347c5c7d792e26c4c44569bfd377941cef54cdebd300d6f82187efc243cc2196dbe3a94e9ade61902523df2c50690000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a80f09f9a806fc3a96f20206ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806f20c3a96ff09f9a806fc3a96f202020c3a96f20c3a9c3a9c3a9206f206fc3a9f09f9a8020f09f9a80f09f9a8020c3a96f4d6f4d4dc3a94d204d6f20f09f9a806fc3a94dc3a9f09f9a806f6f206fc3a900000000000000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80c3a96f6f6ff09f9a806f206f6f20c3a9206f6f206f6f6f6ff09f9a806f4d4d206f6fc3a94d6f4df09f9a806fc3a96f6f6f206f4dc3a96f6f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a80c3a96f4d4d4df09f9a80204d6ff09f9a80c3a94d204df09f9a80f09f9a806fc3a94df09f9a806f6f6f4d6ff09f9a80f09f9a80204dc3a9f09f9a80f09f9a8020f09f9a804d6f6fc3a96ff09f9a806ff09f9a80c3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a804df09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a806fc3a94d206f6f4df09f9a804d4d6f4df09f9a80c3a9f09f9a804dc3a9c3a920206f6f4dc3a920f09f9a804d6f6f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000001af2a54062dd5a79e88f5da6f079243321b81a9dfdf2d5267c94b87a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000004d4c7813fc8c9423c7cfbcf34cdcb6d1b1fb36186400d92e3612359f4910c80000000000000000000000000070534346085143e0c13292d52b48cad0143ea44a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c0ffffffffffffff9d8cb6ecdbb4c70a323775228d2b283eb292f4cceefc21da1c9dfeb7cd133e5efc45f599212781b2516a14a34829b39d5ef4a6a64450adfdda0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80f09f9a806f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80f09f9a806f4d4d6ff09f9a80f09f9a806f2020f09f9a806f6f206fc3a96f4d6f6f6f6f20f09f9a806f2020c3a920c3a9f09f9a804d6fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a80c3a9f09f9a806f6f20c3a9f09f9a806f6ff09f9a806fc3a9f09f9a804dc3a96f6ff09f9a80206f206f4d6f6ff09f9a806f6f6f4df09f9a80f09f9a804dc3a9c3a9206f206fc3a9206fc3a96f4d6ff09f9a8020f09f9a806fc3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80206fc3a94d6f4df09f9a806f20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a80204d20f09f9a806f6f6f20c3a96f4d206f4d4d6ff09f9a804df09f9a80c3a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a804d6f4d6f20c3a9f09f9a8020f09f9a80c3a9f09f9a806f6fc3a94d000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((string,uint56,uint80,int96,(address,address[4][3][4],bool,string,string)),string,int104,(string,string,uint24[2])[2],uint40)", + "type": "((string,uint56,uint80,int96,(address,address[4][3][4],bool,string,string)),string,int104,(string,string,uint24[2])[2],uint40)", + "value": [ + [ + "Moo é🚀o M MM🚀", + "56849351209168644", + "585997473532304877245652", + "-4265759512060080937463725419", + [ + "0xbE2f53B85E8604A1332C7Ff1046f82e944f7bD72", + [ + [ + [ + "0x0E3F8485CFd217dA380cf0B27617C322E07e4f31", + "0x136bF83b5bbb291f3E475955e85C1FBF219edE56", + "0x13B6aFE3859C6975b45f8836a9b8aCc2EB77f1FF", + "0x314012405F3ba51Df8b13AbB2283b17626D67171" + ], + [ + "0x9eb9d7f18E42130CE3b84c9FE7237305BAAf4440", + "0xBD9EAe1CCBcbD011c7A6fCf9173FA39a09f02A74", + "0x443264Cfa7BCDCA5d0dD9b3A3A2171DF37696955", + "0xC272cBe93E268C16b0a7ADF7C378445f00334bBA" + ], + [ + "0x7630E4C0FbD21cFEE3a06353845447E79F289C53", + "0xFfe1424749978070D2Ce4040B71228fC5efacbD7", + "0xBd39C43bc2A88E9966b45e03F0794A42938b5A03", + "0x881eA6814Af3D64C694d7cA7Fa111De202d1C079" + ] + ], + [ + [ + "0xE41ae8553bCbe1CbF53Dd1138A0a454577948039", + "0xA898A15ae97686f1AB1228D6fa20bcb78DAd0608", + "0xE1432De1870EE93088575fEA949057a040002d4D", + "0x0dBeB6A56EF01626fB45fC0B4f547eE712Ede852" + ], + [ + "0x6f0e0982217302044DF71c99Ba9aa8BFADf14db1", + "0x0F87b7da3457B427c3F7d364Aa31D984524C84C6", + "0x6eaA244E9cA00d7AE7241f0e672ba306D9226e33", + "0x5B8Beead6A378759D71C3d10112Fb288cCE97909" + ], + [ + "0xe7363AA6AafAb78BaD91fc5AC1457497D8E4870c", + "0x4241465383392D07C5FD3Cda92183C61e088CBe1", + "0x566D0Bf07B5524Dc161ad2938BCeA93966CB1290", + "0x1B708f31abD8d77c24079CE01921D03f55eeC865" + ] + ], + [ + [ + "0xE99af37f27979942B260d519Fd11bBcf0ce3994C", + "0x8BB3645412b4112797149693D6Ed0613402D085A", + "0x62BFAa086a482a74d54493F4C64b28712c08b3D0", + "0x1Dbf7EC44CC917E1356ADb3f8C9f590f7C892b53" + ], + [ + "0xb07a63e9da1855E6281f9DB2BA9Feb50E59c5135", + "0xC9A53f7F553dB52BBb3039AE78ce05d7a3615Ec9", + "0x4c52E99beed045eBbA15E2F7B49d0FbDEEE05766", + "0x6c82f29cF31E675ddD3aC8b68122f60e2fE0655B" + ], + [ + "0xFe17f2Da202ac964ac1B9a7B3AA8c8a72FFF4b47", + "0x8d05A9ac597CB603704B9FD3cC969EAbAab326d5", + "0xC6044A150704BD932259750974f52334f6e62eC8", + "0xf17f1120B2b3Bb02524eDD1D7e82C634138D98DE" + ] + ], + [ + [ + "0x7f23182d1d596A48247bF624330C38a4e5A28F76", + "0x263eD001abAB7a765366D4d4ba5D6B5967f7f78A", + "0x2414b362d8106DF54463778F8Ea38e0E67905FAE", + "0x0cDf542157af0Ef2AC48C638Eb11693DDc89A049" + ], + [ + "0x89D4bc257E8972D5041F3d17502227995e8829a1", + "0x9Faee31C2a44812A1d171232845a493140ce51D2", + "0xF1727bfdfDcc8a82540EbccaA144c86718A880A2", + "0xBfdC339B0742F8511c4dB446c97f92c8a9E98182" + ], + [ + "0x3E4f1555dAA7229EAA91dB6b90e0A33020C477d0", + "0x5AC14b9e81d05dbfc95A0f44810a1fDAAcd1CbD2", + "0x87BE9f322A83ca6cC2a65Fd4cFC1A80b83597fcc", + "0x8CEF3B7698f19A691C380748fE8f0b4E22E760BB" + ] + ] + ], + true, + "Moo é🚀 é é 🚀 oo🚀ooéM oéMMooo éé🚀oé", + "Moo é🚀éMéMo🚀éo éMMMoo🚀 🚀éooooM" + ] + ], + "Moo é🚀oo🚀 oé🚀 ooM🚀o oo🚀 🚀MéMé🚀éo", + "-8864381719565654955396350516378", + [ + ["Moo é🚀ooo", "Moo é🚀M🚀éMM🚀o", ["6204066", "15693755"]], + ["Moo é🚀 éé🚀🚀 Mo", "Moo é🚀oé", ["9668851", "6990993"]] + ], + "981728239224" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o M MM🚀" + }, + { + "type": "number", + "value": "56849351209168644" + }, + { + "type": "number", + "value": "585997473532304877245652" + }, + { + "type": "number", + "value": "-4265759512060080937463725419" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xbE2f53B85E8604A1332C7Ff1046f82e944f7bD72" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x0E3F8485CFd217dA380cf0B27617C322E07e4f31" + }, + { + "type": "address", + "value": "0x136bF83b5bbb291f3E475955e85C1FBF219edE56" + }, + { + "type": "address", + "value": "0x13B6aFE3859C6975b45f8836a9b8aCc2EB77f1FF" + }, + { + "type": "address", + "value": "0x314012405F3ba51Df8b13AbB2283b17626D67171" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9eb9d7f18E42130CE3b84c9FE7237305BAAf4440" + }, + { + "type": "address", + "value": "0xBD9EAe1CCBcbD011c7A6fCf9173FA39a09f02A74" + }, + { + "type": "address", + "value": "0x443264Cfa7BCDCA5d0dD9b3A3A2171DF37696955" + }, + { + "type": "address", + "value": "0xC272cBe93E268C16b0a7ADF7C378445f00334bBA" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x7630E4C0FbD21cFEE3a06353845447E79F289C53" + }, + { + "type": "address", + "value": "0xFfe1424749978070D2Ce4040B71228fC5efacbD7" + }, + { + "type": "address", + "value": "0xBd39C43bc2A88E9966b45e03F0794A42938b5A03" + }, + { + "type": "address", + "value": "0x881eA6814Af3D64C694d7cA7Fa111De202d1C079" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xE41ae8553bCbe1CbF53Dd1138A0a454577948039" + }, + { + "type": "address", + "value": "0xA898A15ae97686f1AB1228D6fa20bcb78DAd0608" + }, + { + "type": "address", + "value": "0xE1432De1870EE93088575fEA949057a040002d4D" + }, + { + "type": "address", + "value": "0x0dBeB6A56EF01626fB45fC0B4f547eE712Ede852" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6f0e0982217302044DF71c99Ba9aa8BFADf14db1" + }, + { + "type": "address", + "value": "0x0F87b7da3457B427c3F7d364Aa31D984524C84C6" + }, + { + "type": "address", + "value": "0x6eaA244E9cA00d7AE7241f0e672ba306D9226e33" + }, + { + "type": "address", + "value": "0x5B8Beead6A378759D71C3d10112Fb288cCE97909" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe7363AA6AafAb78BaD91fc5AC1457497D8E4870c" + }, + { + "type": "address", + "value": "0x4241465383392D07C5FD3Cda92183C61e088CBe1" + }, + { + "type": "address", + "value": "0x566D0Bf07B5524Dc161ad2938BCeA93966CB1290" + }, + { + "type": "address", + "value": "0x1B708f31abD8d77c24079CE01921D03f55eeC865" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xE99af37f27979942B260d519Fd11bBcf0ce3994C" + }, + { + "type": "address", + "value": "0x8BB3645412b4112797149693D6Ed0613402D085A" + }, + { + "type": "address", + "value": "0x62BFAa086a482a74d54493F4C64b28712c08b3D0" + }, + { + "type": "address", + "value": "0x1Dbf7EC44CC917E1356ADb3f8C9f590f7C892b53" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xb07a63e9da1855E6281f9DB2BA9Feb50E59c5135" + }, + { + "type": "address", + "value": "0xC9A53f7F553dB52BBb3039AE78ce05d7a3615Ec9" + }, + { + "type": "address", + "value": "0x4c52E99beed045eBbA15E2F7B49d0FbDEEE05766" + }, + { + "type": "address", + "value": "0x6c82f29cF31E675ddD3aC8b68122f60e2fE0655B" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xFe17f2Da202ac964ac1B9a7B3AA8c8a72FFF4b47" + }, + { + "type": "address", + "value": "0x8d05A9ac597CB603704B9FD3cC969EAbAab326d5" + }, + { + "type": "address", + "value": "0xC6044A150704BD932259750974f52334f6e62eC8" + }, + { + "type": "address", + "value": "0xf17f1120B2b3Bb02524eDD1D7e82C634138D98DE" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x7f23182d1d596A48247bF624330C38a4e5A28F76" + }, + { + "type": "address", + "value": "0x263eD001abAB7a765366D4d4ba5D6B5967f7f78A" + }, + { + "type": "address", + "value": "0x2414b362d8106DF54463778F8Ea38e0E67905FAE" + }, + { + "type": "address", + "value": "0x0cDf542157af0Ef2AC48C638Eb11693DDc89A049" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x89D4bc257E8972D5041F3d17502227995e8829a1" + }, + { + "type": "address", + "value": "0x9Faee31C2a44812A1d171232845a493140ce51D2" + }, + { + "type": "address", + "value": "0xF1727bfdfDcc8a82540EbccaA144c86718A880A2" + }, + { + "type": "address", + "value": "0xBfdC339B0742F8511c4dB446c97f92c8a9E98182" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3E4f1555dAA7229EAA91dB6b90e0A33020C477d0" + }, + { + "type": "address", + "value": "0x5AC14b9e81d05dbfc95A0f44810a1fDAAcd1CbD2" + }, + { + "type": "address", + "value": "0x87BE9f322A83ca6cC2a65Fd4cFC1A80b83597fcc" + }, + { + "type": "address", + "value": "0x8CEF3B7698f19A691C380748fE8f0b4E22E760BB" + } + ] + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀 é é 🚀 oo🚀ooéM oéMMooo éé🚀oé" + }, + { + "type": "string", + "value": "Moo é🚀éMéMo🚀éo éMMMoo🚀 🚀éooooM" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo🚀 oé🚀 ooM🚀o oo🚀 🚀MéMé🚀éo" + }, + { + "type": "number", + "value": "-8864381719565654955396350516378" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo" + }, + { + "type": "string", + "value": "Moo é🚀M🚀éMM🚀o" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "6204066" + }, + { + "type": "number", + "value": "15693755" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 éé🚀🚀 Mo" + }, + { + "type": "string", + "value": "Moo é🚀oé" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "9668851" + }, + { + "type": "number", + "value": "6990993" + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "981728239224" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610d71806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610adc565b60405180910390f35b610056610849565b61005e610849565b610066610884565b60408051808201825260148152729adede418753e13f3500de409a409a9be13f3560671b60208083019190915290835266c9f82f0888af0490830152697c16fc97f5f3f9f554d4908201526b0dc88db68389333074ac3d6a1960608201526100cc6108d0565b73be2f53b85e8604a1332c7ff1046f82e944f7bd7281526100eb61090c565b6100f3610939565b6100fb610966565b730e3f8485cfd217da380cf0b27617c322e07e4f31815273136bf83b5bbb291f3e475955e85c1fbf219ede5660208201527313b6afe3859c6975b45f8836a9b8acc2eb77f1ff604082015273314012405f3ba51df8b13abb2283b17626d671716060820152815261016a610966565b739eb9d7f18e42130ce3b84c9fe7237305baaf4440815273bd9eae1ccbcbd011c7a6fcf9173fa39a09f02a7460208083019190915273443264cfa7bcdca5d0dd9b3a3a2171df37696955604083015273c272cbe93e268c16b0a7adf7c378445f00334bba60608301528201526101de610966565b737630e4c0fbd21cfee3a06353845447e79f289c53815273ffe1424749978070d2ce4040b71228fc5efacbd7602082015273bd39c43bc2a88e9966b45e03f0794a42938b5a0360408083019190915273881ea6814af3d64c694d7ca7fa111de202d1c07960608301528201528152610254610939565b61025c610966565b73e41ae8553bcbe1cbf53dd1138a0a454577948039815273a898a15ae97686f1ab1228d6fa20bcb78dad0608602082015273e1432de1870ee93088575fea949057a040002d4d6040820152730dbeb6a56ef01626fb45fc0b4f547ee712ede852606082015281526102cb610966565b736f0e0982217302044df71c99ba9aa8bfadf14db18152730f87b7da3457b427c3f7d364aa31d984524c84c6602080830191909152736eaa244e9ca00d7ae7241f0e672ba306d9226e336040830152735b8beead6a378759d71c3d10112fb288cce97909606083015282015261033f610966565b73e7363aa6aafab78bad91fc5ac1457497d8e4870c8152734241465383392d07c5fd3cda92183c61e088cbe160208083019190915273566d0bf07b5524dc161ad2938bcea93966cb1290604080840191909152731b708f31abd8d77c24079ce01921d03f55eec86560608401528301919091528201526103bd610939565b6103c5610966565b73e99af37f27979942b260d519fd11bbcf0ce3994c8152738bb3645412b4112797149693d6ed0613402d085a60208201527362bfaa086a482a74d54493f4c64b28712c08b3d06040820152731dbf7ec44cc917e1356adb3f8c9f590f7c892b5360608201528152610434610966565b73b07a63e9da1855e6281f9db2ba9feb50e59c5135815273c9a53f7f553db52bbb3039ae78ce05d7a3615ec9602080830191909152734c52e99beed045ebba15e2f7b49d0fbdeee057666040830152736c82f29cf31e675ddd3ac8b68122f60e2fe0655b60608301528201526104a8610966565b73fe17f2da202ac964ac1b9a7b3aa8c8a72fff4b478152738d05a9ac597cb603704b9fd3cc969eabaab326d5602082015273c6044a150704bd932259750974f52334f6e62ec860408083019190915273f17f1120b2b3bb02524edd1d7e82c634138d98de606083015282810191909152820152610523610939565b61052b610966565b737f23182d1d596a48247bf624330c38a4e5a28f76815273263ed001abab7a765366d4d4ba5d6b5967f7f78a6020820152732414b362d8106df54463778f8ea38e0e67905fae6040820152730cdf542157af0ef2ac48c638eb11693ddc89a0496060820152815261059a610966565b7389d4bc257e8972d5041f3d17502227995e8829a18152739faee31c2a44812a1d171232845a493140ce51d260208083019190915273f1727bfdfdcc8a82540ebccaa144c86718a880a2604083015273bfdc339b0742f8511c4db446c97f92c8a9e98182606083015282015261060e610966565b733e4f1555daa7229eaa91db6b90e0a33020c477d08152735ac14b9e81d05dbfc95a0f44810a1fdaacd1cbd26020808301919091527387be9f322a83ca6cc2a65fd4cfc1a80b83597fcc604080840191909152738cef3b7698f19a691c380748fe8f0b4e22e760bb60608085019190915284820193909352848301939093528481019390935260018483015281519081019091526036808252600092610c9b90830139606080840191909152604080519182019052603080825260009250610d0c60208301396080808401919091528301919091525081526040805160608101909152603b80825260009190610cd160208301396020830152506c6fe25cb360b198623ccf469c99196040820152610724610984565b61072c6109b1565b604080518082018252600d81526c4d6f6f20c3a9f09f9a806f6f6f60981b6020808301919091529083528151808301909252601882527f4d6f6f20c3a9f09f9a804df09f9a80c3a94d4df09f9a806f0000000000000000828201528201526107926109ce565b625eaaa2815262ef77bb6020820152604082015281526107b06109b1565b604080518082018252601a81527f4d6f6f20c3a9f09f9a8020c3a9c3a9f09f9a80f09f9a80204d6f0000000000006020808301919091529083528151808301909252600d82526c4d6f6f20c3a9f09f9a806fc3a960981b828201528201526108166109ce565b629388f38152626aac916020808301919091526040830191909152820152606082015264e493901e786080820152919050565b6040518060a0016040528061085c610884565b81526060602082018190526000604083015201610877610984565b8152600060209091015290565b6040518060a0016040528060608152602001600066ffffffffffffff168152602001600069ffffffffffffffffffff1681526020016000600b0b81526020016108cb6108d0565b905290565b6040518060a0016040528060006001600160a01b031681526020016108f361090c565b8152600060208201526060604082018190529081015290565b60405180608001604052806004905b610923610939565b81526020019060019003908161091b5790505090565b60405180606001604052806003905b610950610966565b8152602001906001900390816109485790505090565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002905b61099b6109b1565b8152602001906001900390816109935790505090565b604051806060016040528060608152602001606081526020016108cb5b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b81811015610a12576020818501810151868301820152016109f6565b81811115610a24576000602083870101525b50601f01601f19169290920160200192915050565b6000826040808201846000805b6002808210610a555750610acf565b8685038a52835160808151818852610a6f828901826109ec565b915050602080830151888303828a0152610a8983826109ec565b938a015193925050878901865b85811015610ab757845162ffffff1682529382019390820190600101610a96565b50509b8c019b90965094909401935050600101610a46565b5091979650505050505050565b60006020808352835160a082850152805160a060c0860152610b026101608601826109ec565b8284015166ffffffffffffff1660e0870152604083015169ffffffffffffffffffff166101008701526060830151600b0b61012087015260809283015186820360bf190161014088015280516001600160a01b0390811683528186015191949293506106809186850160005b6004808210610b7d5750610bdb565b83518360005b6003811015610bc35782518260005b86811015610bb05782518b168252918f0191908f0190600101610b92565b505050918c019190890190600101610b83565b50505092890192506101809190910190600101610b6e565b505050506040840151151561062084015260608401516106408401829052610c05828501826109ec565b915050818401519350828103610660840152610c2181856109ec565b935050838701519350601f19915081868403016040870152610c4383856109ec565b935060408701519250610c5b6060870184600c0b9052565b60608701519250818685030181870152610c758484610a39565b93508087015192505050610c9260a085018264ffffffffff169052565b50939250505056fe4d6f6f20c3a9f09f9a8020c3a920c3a920f09f9a80206f6ff09f9a806f6fc3a94d206fc3a94d4d6f6f6f20c3a9c3a9f09f9a806fc3a94d6f6f20c3a9f09f9a806f6ff09f9a8020206fc3a9f09f9a80206f6f4df09f9a806f206f6ff09f9a8020f09f9a804dc3a94dc3a9f09f9a80c3a96f4d6f6f20c3a9f09f9a80c3a94dc3a94d6ff09f9a80c3a96f20c3a94d4d4d6f6ff09f9a8020f09f9a80c3a96f6f6f6f4da2646970667358221220247e341e52639ddfec6f9f56615b4e77b36acc553b715e8860b4f92327bb870064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a327d8d8 {\n address s_0;\n address[4][3][4] s_1;\n bool s_2;\n string s_3;\n string s_4;\n }\n\n struct S_0828a50a {\n string s_0;\n uint56 s_1;\n uint80 s_2;\n int96 s_3;\n S_a327d8d8 s_4;\n }\n\n struct S_ec0a35d9 {\n string s_0;\n string s_1;\n uint24[2] s_2;\n }\n\n struct S_98c25c06 {\n S_0828a50a s_0;\n string s_1;\n int104 s_2;\n S_ec0a35d9[2] s_3;\n uint40 s_4;\n }\n\n function test () public pure returns (S_98c25c06 memory) {\n S_98c25c06 memory r;\n {\n S_0828a50a memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀o M MM🚀\";\n r_0.s_0 = r_0_0;\n }\n {\n uint56 r_0_1 = 56849351209168644;\n r_0.s_1 = r_0_1;\n }\n {\n uint80 r_0_2 = 585997473532304877245652;\n r_0.s_2 = r_0_2;\n }\n {\n int96 r_0_3 = -4265759512060080937463725419;\n r_0.s_3 = r_0_3;\n }\n {\n S_a327d8d8 memory r_0_4;\n {\n address r_0_4_0 = 0xbE2f53B85E8604A1332C7Ff1046f82e944f7bD72;\n r_0_4.s_0 = r_0_4_0;\n }\n {\n address[4][3][4] memory r_0_4_1;\n {\n address[4][3] memory r_0_4_1_0;\n {\n address[4] memory r_0_4_1_0_0;\n {\n address r_0_4_1_0_0_0 = 0x0E3F8485CFd217dA380cf0B27617C322E07e4f31;\n r_0_4_1_0_0[0] = r_0_4_1_0_0_0;\n }\n {\n address r_0_4_1_0_0_1 = 0x136bF83b5bbb291f3E475955e85C1FBF219edE56;\n r_0_4_1_0_0[1] = r_0_4_1_0_0_1;\n }\n {\n address r_0_4_1_0_0_2 = 0x13B6aFE3859C6975b45f8836a9b8aCc2EB77f1FF;\n r_0_4_1_0_0[2] = r_0_4_1_0_0_2;\n }\n {\n address r_0_4_1_0_0_3 = 0x314012405F3ba51Df8b13AbB2283b17626D67171;\n r_0_4_1_0_0[3] = r_0_4_1_0_0_3;\n }\n r_0_4_1_0[0] = r_0_4_1_0_0;\n }\n {\n address[4] memory r_0_4_1_0_1;\n {\n address r_0_4_1_0_1_0 = 0x9eb9d7f18E42130CE3b84c9FE7237305BAAf4440;\n r_0_4_1_0_1[0] = r_0_4_1_0_1_0;\n }\n {\n address r_0_4_1_0_1_1 = 0xBD9EAe1CCBcbD011c7A6fCf9173FA39a09f02A74;\n r_0_4_1_0_1[1] = r_0_4_1_0_1_1;\n }\n {\n address r_0_4_1_0_1_2 = 0x443264Cfa7BCDCA5d0dD9b3A3A2171DF37696955;\n r_0_4_1_0_1[2] = r_0_4_1_0_1_2;\n }\n {\n address r_0_4_1_0_1_3 = 0xC272cBe93E268C16b0a7ADF7C378445f00334bBA;\n r_0_4_1_0_1[3] = r_0_4_1_0_1_3;\n }\n r_0_4_1_0[1] = r_0_4_1_0_1;\n }\n {\n address[4] memory r_0_4_1_0_2;\n {\n address r_0_4_1_0_2_0 = 0x7630E4C0FbD21cFEE3a06353845447E79F289C53;\n r_0_4_1_0_2[0] = r_0_4_1_0_2_0;\n }\n {\n address r_0_4_1_0_2_1 = 0xFfe1424749978070D2Ce4040B71228fC5efacbD7;\n r_0_4_1_0_2[1] = r_0_4_1_0_2_1;\n }\n {\n address r_0_4_1_0_2_2 = 0xBd39C43bc2A88E9966b45e03F0794A42938b5A03;\n r_0_4_1_0_2[2] = r_0_4_1_0_2_2;\n }\n {\n address r_0_4_1_0_2_3 = 0x881eA6814Af3D64C694d7cA7Fa111De202d1C079;\n r_0_4_1_0_2[3] = r_0_4_1_0_2_3;\n }\n r_0_4_1_0[2] = r_0_4_1_0_2;\n }\n r_0_4_1[0] = r_0_4_1_0;\n }\n {\n address[4][3] memory r_0_4_1_1;\n {\n address[4] memory r_0_4_1_1_0;\n {\n address r_0_4_1_1_0_0 = 0xE41ae8553bCbe1CbF53Dd1138A0a454577948039;\n r_0_4_1_1_0[0] = r_0_4_1_1_0_0;\n }\n {\n address r_0_4_1_1_0_1 = 0xA898A15ae97686f1AB1228D6fa20bcb78DAd0608;\n r_0_4_1_1_0[1] = r_0_4_1_1_0_1;\n }\n {\n address r_0_4_1_1_0_2 = 0xE1432De1870EE93088575fEA949057a040002d4D;\n r_0_4_1_1_0[2] = r_0_4_1_1_0_2;\n }\n {\n address r_0_4_1_1_0_3 = 0x0dBeB6A56EF01626fB45fC0B4f547eE712Ede852;\n r_0_4_1_1_0[3] = r_0_4_1_1_0_3;\n }\n r_0_4_1_1[0] = r_0_4_1_1_0;\n }\n {\n address[4] memory r_0_4_1_1_1;\n {\n address r_0_4_1_1_1_0 = 0x6f0e0982217302044DF71c99Ba9aa8BFADf14db1;\n r_0_4_1_1_1[0] = r_0_4_1_1_1_0;\n }\n {\n address r_0_4_1_1_1_1 = 0x0F87b7da3457B427c3F7d364Aa31D984524C84C6;\n r_0_4_1_1_1[1] = r_0_4_1_1_1_1;\n }\n {\n address r_0_4_1_1_1_2 = 0x6eaA244E9cA00d7AE7241f0e672ba306D9226e33;\n r_0_4_1_1_1[2] = r_0_4_1_1_1_2;\n }\n {\n address r_0_4_1_1_1_3 = 0x5B8Beead6A378759D71C3d10112Fb288cCE97909;\n r_0_4_1_1_1[3] = r_0_4_1_1_1_3;\n }\n r_0_4_1_1[1] = r_0_4_1_1_1;\n }\n {\n address[4] memory r_0_4_1_1_2;\n {\n address r_0_4_1_1_2_0 = 0xe7363AA6AafAb78BaD91fc5AC1457497D8E4870c;\n r_0_4_1_1_2[0] = r_0_4_1_1_2_0;\n }\n {\n address r_0_4_1_1_2_1 = 0x4241465383392D07C5FD3Cda92183C61e088CBe1;\n r_0_4_1_1_2[1] = r_0_4_1_1_2_1;\n }\n {\n address r_0_4_1_1_2_2 = 0x566D0Bf07B5524Dc161ad2938BCeA93966CB1290;\n r_0_4_1_1_2[2] = r_0_4_1_1_2_2;\n }\n {\n address r_0_4_1_1_2_3 = 0x1B708f31abD8d77c24079CE01921D03f55eeC865;\n r_0_4_1_1_2[3] = r_0_4_1_1_2_3;\n }\n r_0_4_1_1[2] = r_0_4_1_1_2;\n }\n r_0_4_1[1] = r_0_4_1_1;\n }\n {\n address[4][3] memory r_0_4_1_2;\n {\n address[4] memory r_0_4_1_2_0;\n {\n address r_0_4_1_2_0_0 = 0xE99af37f27979942B260d519Fd11bBcf0ce3994C;\n r_0_4_1_2_0[0] = r_0_4_1_2_0_0;\n }\n {\n address r_0_4_1_2_0_1 = 0x8BB3645412b4112797149693D6Ed0613402D085A;\n r_0_4_1_2_0[1] = r_0_4_1_2_0_1;\n }\n {\n address r_0_4_1_2_0_2 = 0x62BFAa086a482a74d54493F4C64b28712c08b3D0;\n r_0_4_1_2_0[2] = r_0_4_1_2_0_2;\n }\n {\n address r_0_4_1_2_0_3 = 0x1Dbf7EC44CC917E1356ADb3f8C9f590f7C892b53;\n r_0_4_1_2_0[3] = r_0_4_1_2_0_3;\n }\n r_0_4_1_2[0] = r_0_4_1_2_0;\n }\n {\n address[4] memory r_0_4_1_2_1;\n {\n address r_0_4_1_2_1_0 = 0xb07a63e9da1855E6281f9DB2BA9Feb50E59c5135;\n r_0_4_1_2_1[0] = r_0_4_1_2_1_0;\n }\n {\n address r_0_4_1_2_1_1 = 0xC9A53f7F553dB52BBb3039AE78ce05d7a3615Ec9;\n r_0_4_1_2_1[1] = r_0_4_1_2_1_1;\n }\n {\n address r_0_4_1_2_1_2 = 0x4c52E99beed045eBbA15E2F7B49d0FbDEEE05766;\n r_0_4_1_2_1[2] = r_0_4_1_2_1_2;\n }\n {\n address r_0_4_1_2_1_3 = 0x6c82f29cF31E675ddD3aC8b68122f60e2fE0655B;\n r_0_4_1_2_1[3] = r_0_4_1_2_1_3;\n }\n r_0_4_1_2[1] = r_0_4_1_2_1;\n }\n {\n address[4] memory r_0_4_1_2_2;\n {\n address r_0_4_1_2_2_0 = 0xFe17f2Da202ac964ac1B9a7B3AA8c8a72FFF4b47;\n r_0_4_1_2_2[0] = r_0_4_1_2_2_0;\n }\n {\n address r_0_4_1_2_2_1 = 0x8d05A9ac597CB603704B9FD3cC969EAbAab326d5;\n r_0_4_1_2_2[1] = r_0_4_1_2_2_1;\n }\n {\n address r_0_4_1_2_2_2 = 0xC6044A150704BD932259750974f52334f6e62eC8;\n r_0_4_1_2_2[2] = r_0_4_1_2_2_2;\n }\n {\n address r_0_4_1_2_2_3 = 0xf17f1120B2b3Bb02524eDD1D7e82C634138D98DE;\n r_0_4_1_2_2[3] = r_0_4_1_2_2_3;\n }\n r_0_4_1_2[2] = r_0_4_1_2_2;\n }\n r_0_4_1[2] = r_0_4_1_2;\n }\n {\n address[4][3] memory r_0_4_1_3;\n {\n address[4] memory r_0_4_1_3_0;\n {\n address r_0_4_1_3_0_0 = 0x7f23182d1d596A48247bF624330C38a4e5A28F76;\n r_0_4_1_3_0[0] = r_0_4_1_3_0_0;\n }\n {\n address r_0_4_1_3_0_1 = 0x263eD001abAB7a765366D4d4ba5D6B5967f7f78A;\n r_0_4_1_3_0[1] = r_0_4_1_3_0_1;\n }\n {\n address r_0_4_1_3_0_2 = 0x2414b362d8106DF54463778F8Ea38e0E67905FAE;\n r_0_4_1_3_0[2] = r_0_4_1_3_0_2;\n }\n {\n address r_0_4_1_3_0_3 = 0x0cDf542157af0Ef2AC48C638Eb11693DDc89A049;\n r_0_4_1_3_0[3] = r_0_4_1_3_0_3;\n }\n r_0_4_1_3[0] = r_0_4_1_3_0;\n }\n {\n address[4] memory r_0_4_1_3_1;\n {\n address r_0_4_1_3_1_0 = 0x89D4bc257E8972D5041F3d17502227995e8829a1;\n r_0_4_1_3_1[0] = r_0_4_1_3_1_0;\n }\n {\n address r_0_4_1_3_1_1 = 0x9Faee31C2a44812A1d171232845a493140ce51D2;\n r_0_4_1_3_1[1] = r_0_4_1_3_1_1;\n }\n {\n address r_0_4_1_3_1_2 = 0xF1727bfdfDcc8a82540EbccaA144c86718A880A2;\n r_0_4_1_3_1[2] = r_0_4_1_3_1_2;\n }\n {\n address r_0_4_1_3_1_3 = 0xBfdC339B0742F8511c4dB446c97f92c8a9E98182;\n r_0_4_1_3_1[3] = r_0_4_1_3_1_3;\n }\n r_0_4_1_3[1] = r_0_4_1_3_1;\n }\n {\n address[4] memory r_0_4_1_3_2;\n {\n address r_0_4_1_3_2_0 = 0x3E4f1555dAA7229EAA91dB6b90e0A33020C477d0;\n r_0_4_1_3_2[0] = r_0_4_1_3_2_0;\n }\n {\n address r_0_4_1_3_2_1 = 0x5AC14b9e81d05dbfc95A0f44810a1fDAAcd1CbD2;\n r_0_4_1_3_2[1] = r_0_4_1_3_2_1;\n }\n {\n address r_0_4_1_3_2_2 = 0x87BE9f322A83ca6cC2a65Fd4cFC1A80b83597fcc;\n r_0_4_1_3_2[2] = r_0_4_1_3_2_2;\n }\n {\n address r_0_4_1_3_2_3 = 0x8CEF3B7698f19A691C380748fE8f0b4E22E760BB;\n r_0_4_1_3_2[3] = r_0_4_1_3_2_3;\n }\n r_0_4_1_3[2] = r_0_4_1_3_2;\n }\n r_0_4_1[3] = r_0_4_1_3;\n }\n r_0_4.s_1 = r_0_4_1;\n }\n {\n bool r_0_4_2 = true;\n r_0_4.s_2 = r_0_4_2;\n }\n {\n string memory r_0_4_3 = unicode\"Moo é🚀 é é 🚀 oo🚀ooéM oéMMooo éé🚀oé\";\n r_0_4.s_3 = r_0_4_3;\n }\n {\n string memory r_0_4_4 = unicode\"Moo é🚀éMéMo🚀éo éMMMoo🚀 🚀éooooM\";\n r_0_4.s_4 = r_0_4_4;\n }\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀oo🚀 oé🚀 ooM🚀o oo🚀 🚀MéMé🚀éo\";\n r.s_1 = r_1;\n }\n {\n int104 r_2 = -8864381719565654955396350516378;\n r.s_2 = r_2;\n }\n {\n S_ec0a35d9[2] memory r_3;\n {\n S_ec0a35d9 memory r_3_0;\n {\n string memory r_3_0_0 = unicode\"Moo é🚀ooo\";\n r_3_0.s_0 = r_3_0_0;\n }\n {\n string memory r_3_0_1 = unicode\"Moo é🚀M🚀éMM🚀o\";\n r_3_0.s_1 = r_3_0_1;\n }\n {\n uint24[2] memory r_3_0_2;\n {\n uint24 r_3_0_2_0 = 6204066;\n r_3_0_2[0] = r_3_0_2_0;\n }\n {\n uint24 r_3_0_2_1 = 15693755;\n r_3_0_2[1] = r_3_0_2_1;\n }\n r_3_0.s_2 = r_3_0_2;\n }\n r_3[0] = r_3_0;\n }\n {\n S_ec0a35d9 memory r_3_1;\n {\n string memory r_3_1_0 = unicode\"Moo é🚀 éé🚀🚀 Mo\";\n r_3_1.s_0 = r_3_1_0;\n }\n {\n string memory r_3_1_1 = unicode\"Moo é🚀oé\";\n r_3_1.s_1 = r_3_1_1;\n }\n {\n uint24[2] memory r_3_1_2;\n {\n uint24 r_3_1_2_0 = 9668851;\n r_3_1_2[0] = r_3_1_2_0;\n }\n {\n uint24 r_3_1_2_1 = 6990993;\n r_3_1_2[1] = r_3_1_2_1;\n }\n r_3_1.s_2 = r_3_1_2;\n }\n r_3[1] = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n uint40 r_4 = 981728239224;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000008c0ffffffffffffffffffffffffffffffffffffff901da34c9f4e679dc330b963660000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000e493901e7800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000c9f82f0888af04000000000000000000000000000000000000000000007c16fc97f5f3f9f554d4fffffffffffffffffffffffffffffffffffffffff23772497c76cccf8b53c29500000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806f204d204d4df09f9a80000000000000000000000000000000000000000000000000be2f53b85e8604a1332c7ff1046f82e944f7bd720000000000000000000000000e3f8485cfd217da380cf0b27617c322e07e4f31000000000000000000000000136bf83b5bbb291f3e475955e85c1fbf219ede5600000000000000000000000013b6afe3859c6975b45f8836a9b8acc2eb77f1ff000000000000000000000000314012405f3ba51df8b13abb2283b17626d671710000000000000000000000009eb9d7f18e42130ce3b84c9fe7237305baaf4440000000000000000000000000bd9eae1ccbcbd011c7a6fcf9173fa39a09f02a74000000000000000000000000443264cfa7bcdca5d0dd9b3a3a2171df37696955000000000000000000000000c272cbe93e268c16b0a7adf7c378445f00334bba0000000000000000000000007630e4c0fbd21cfee3a06353845447e79f289c53000000000000000000000000ffe1424749978070d2ce4040b71228fc5efacbd7000000000000000000000000bd39c43bc2a88e9966b45e03f0794a42938b5a03000000000000000000000000881ea6814af3d64c694d7ca7fa111de202d1c079000000000000000000000000e41ae8553bcbe1cbf53dd1138a0a454577948039000000000000000000000000a898a15ae97686f1ab1228d6fa20bcb78dad0608000000000000000000000000e1432de1870ee93088575fea949057a040002d4d0000000000000000000000000dbeb6a56ef01626fb45fc0b4f547ee712ede8520000000000000000000000006f0e0982217302044df71c99ba9aa8bfadf14db10000000000000000000000000f87b7da3457b427c3f7d364aa31d984524c84c60000000000000000000000006eaa244e9ca00d7ae7241f0e672ba306d9226e330000000000000000000000005b8beead6a378759d71c3d10112fb288cce97909000000000000000000000000e7363aa6aafab78bad91fc5ac1457497d8e4870c0000000000000000000000004241465383392d07c5fd3cda92183c61e088cbe1000000000000000000000000566d0bf07b5524dc161ad2938bcea93966cb12900000000000000000000000001b708f31abd8d77c24079ce01921d03f55eec865000000000000000000000000e99af37f27979942b260d519fd11bbcf0ce3994c0000000000000000000000008bb3645412b4112797149693d6ed0613402d085a00000000000000000000000062bfaa086a482a74d54493f4c64b28712c08b3d00000000000000000000000001dbf7ec44cc917e1356adb3f8c9f590f7c892b53000000000000000000000000b07a63e9da1855e6281f9db2ba9feb50e59c5135000000000000000000000000c9a53f7f553db52bbb3039ae78ce05d7a3615ec90000000000000000000000004c52e99beed045ebba15e2f7b49d0fbdeee057660000000000000000000000006c82f29cf31e675ddd3ac8b68122f60e2fe0655b000000000000000000000000fe17f2da202ac964ac1b9a7b3aa8c8a72fff4b470000000000000000000000008d05a9ac597cb603704b9fd3cc969eabaab326d5000000000000000000000000c6044a150704bd932259750974f52334f6e62ec8000000000000000000000000f17f1120b2b3bb02524edd1d7e82c634138d98de0000000000000000000000007f23182d1d596a48247bf624330c38a4e5a28f76000000000000000000000000263ed001abab7a765366d4d4ba5d6b5967f7f78a0000000000000000000000002414b362d8106df54463778f8ea38e0e67905fae0000000000000000000000000cdf542157af0ef2ac48c638eb11693ddc89a04900000000000000000000000089d4bc257e8972d5041f3d17502227995e8829a10000000000000000000000009faee31c2a44812a1d171232845a493140ce51d2000000000000000000000000f1727bfdfdcc8a82540ebccaa144c86718a880a2000000000000000000000000bfdc339b0742f8511c4db446c97f92c8a9e981820000000000000000000000003e4f1555daa7229eaa91db6b90e0a33020c477d00000000000000000000000005ac14b9e81d05dbfc95a0f44810a1fdaacd1cbd200000000000000000000000087be9f322a83ca6cc2a65fd4cfc1a80b83597fcc0000000000000000000000008cef3b7698f19a691c380748fe8f0b4e22e760bb0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a8020c3a920c3a920f09f9a80206f6ff09f9a806f6fc3a94d206fc3a94d4d6f6f6f20c3a9c3a9f09f9a806fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80c3a94dc3a94d6ff09f9a80c3a96f20c3a94d4d4d6f6ff09f9a8020f09f9a80c3a96f6f6f6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b4d6f6f20c3a9f09f9a806f6ff09f9a8020206fc3a9f09f9a80206f6f4df09f9a806f206f6ff09f9a8020f09f9a804dc3a94dc3a9f09f9a80c3a96f000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000005eaaa20000000000000000000000000000000000000000000000000000000000ef77bb000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a806f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a804df09f9a80c3a94d4df09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000009388f300000000000000000000000000000000000000000000000000000000006aac91000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a8020c3a9c3a9f09f9a80f09f9a80204d6f000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a806fc3a900000000000000000000000000000000000000" + }, + { + "name": "random-(address,((bool,bytes2,string,string,bytes14),(address[1],string),(bool,bool,address,string,(string,address)),bytes31,int168[1][3]))[4]", + "type": "(address,((bool,bytes2,string,string,bytes14),(address[1],string),(bool,bool,address,string,(string,address)),bytes31,int168[1][3]))[4]", + "value": [ + [ + "0x0f075a4416d4D84C78F69fd35797D0C29184A37D", + [ + [ + true, + "0xe3c2", + "Moo é🚀o🚀oooé🚀 Moé🚀o 🚀🚀oM é🚀o oo🚀o 🚀🚀o🚀oMoo", + "Moo é🚀éo 🚀o ", + "0x2c5c5553b4790302975a37e5ad8f" + ], + [ + ["0xb5091997ffBDD824e5c8270EE06a043B3001b977"], + "Moo é🚀🚀 oo🚀oééM🚀oMoééooM o🚀oMM Mé éooooooé " + ], + [ + true, + true, + "0x002259c887cBbd081d1b9877B5FF4F3f9b26e753", + "Moo é🚀oMoéééMoooé 🚀MMMé🚀 oo oo éo🚀éooé 🚀M🚀oé🚀M🚀🚀ooé", + ["Moo é🚀", "0xBDA275D83Ad72ed95184BbB3a2E1Acfa92f18281"] + ], + "0x062e62918be6120c41df980b3cc0aa6e380b6c1a8374eef2745c696ce41207", + [ + ["-132855900570452566957322838209045807642919493469809"], + ["-136174730158470224504270391184933229790858613389318"], + ["109975475066293541020901115424284490066385872913007"] + ] + ] + ], + [ + "0xf74200CFC6AcF583A4651f43Af3055E40f4EFEaD", + [ + [ + true, + "0x58fc", + "Moo é🚀", + "Moo é🚀oo oo🚀MMM🚀MMo MéMMM o🚀M M🚀oMoMo MMéé🚀o", + "0xf78b9b1db18b265da71216098f8b" + ], + [ + ["0xe5838496090a6D67b04386413b4f5c6219a00fB1"], + "Moo é🚀oM🚀oMM🚀 éoo🚀🚀oo🚀🚀oé éoM M🚀éM🚀🚀o MoMoéM🚀é" + ], + [ + false, + false, + "0x3242B41Ee6cCe9983d90d8e0BB2eb1Ae6A1492aD", + "Moo é🚀🚀é oéoMoéé🚀o 🚀M 🚀ooo🚀oo 🚀oéMoM ooooMMoMoo 🚀M ", + [ + "Moo é🚀🚀 🚀🚀 🚀 o 🚀MMMéééé 🚀ooooééoéooé🚀oMoooo oo", + "0xD30E60F2B086b9eEFD667c9Ba76b5415DA3E9FF7" + ] + ], + "0xcfdedf4811f80388673329ba4f897609a84246f7857ce578243a55b1252f4b", + [ + ["10281119352035492206931127914602624747929407159960"], + ["-70340482105650579936370982723225901738369260261161"], + ["114405844888924470006150992202480185249539601628410"] + ] + ] + ], + [ + "0x5467A3a6b826F0C388728964deB436ff6D14D90b", + [ + [ + true, + "0xb3fc", + "Moo é🚀 éo M 🚀 oéo🚀 oéo o o M🚀ooMoé🚀o ", + "Moo é🚀 Méé MMMéMo oo é oéo M 🚀oMoéo", + "0x038dce1ee3d62b3fc0b9f92e5227" + ], + [ + ["0x42d9e5b2BDD13C260c4CD60AF3DE1c0b7F861516"], + "Moo é🚀o 🚀éo é🚀🚀🚀 é oé Moéoé🚀 o" + ], + [ + true, + false, + "0x96b56676F61870Aef4d25694C5e15dECf52f735e", + "Moo é🚀 🚀 é", + [ + "Moo é🚀🚀M oéoé🚀🚀é 🚀oo🚀M🚀🚀MMo🚀o🚀é🚀oMéMoo éo🚀ééMo🚀o o ooMMo🚀 é o", + "0x938F9a9fa9f20E8391488be3e0f78F2D4CCAF751" + ] + ], + "0x498c2b7b811995f683644dff78caa8bee50abdaf615cc1323675799985996f", + [ + ["-157778683258692730386398385145916088106356432515585"], + ["54232751861361794542609314957671101038500089270044"], + ["72319662811015540544807272466622102793294740544085"] + ] + ] + ], + [ + "0x0d091C9593C567355201484B0A4761D613d5A72b", + [ + [ + false, + "0xcc1f", + "Moo é🚀", + "Moo é🚀🚀oé o🚀🚀oéo🚀🚀oMéoo🚀🚀é🚀o o éoooééM oééMooMéoéM", + "0xb4ca524f71fd3d3481079179798c" + ], + [ + ["0x1C49449270a67372779E95A3c07Cd1b8797ADd0A"], + "Moo é🚀🚀 oé ooéM MMé🚀MMoo MMééo🚀M 🚀oMMMoé🚀Moo🚀M" + ], + [ + true, + false, + "0x74FDa08C81136F929B95B73C9cdD82cAA0e127F7", + "Moo é🚀 Moéoéé🚀 M Mo🚀oM🚀éM 🚀🚀oéo", + ["Moo é🚀é oooéo", "0x8f830e90Da904Fd4cA01dFc72435c4fc0476e392"] + ], + "0x89eeebdf159eb75289aff1969d6762fffe1b5f0f319f922209668938e85282", + [ + ["-186847071082254048487298153605925822047099540853151"], + ["141865574129162983409560752579659683272264030575773"], + ["-47515847437253924176768556922944829601606456314080"] + ] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0f075a4416d4D84C78F69fd35797D0C29184A37D" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xe3c2" + }, + { + "type": "string", + "value": "Moo é🚀o🚀oooé🚀 Moé🚀o 🚀🚀oM é🚀o oo🚀o 🚀🚀o🚀oMoo" + }, + { + "type": "string", + "value": "Moo é🚀éo 🚀o " + }, + { + "type": "hexstring", + "value": "0x2c5c5553b4790302975a37e5ad8f" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xb5091997ffBDD824e5c8270EE06a043B3001b977" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 oo🚀oééM🚀oMoééooM o🚀oMM Mé éooooooé " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x002259c887cBbd081d1b9877B5FF4F3f9b26e753" + }, + { + "type": "string", + "value": "Moo é🚀oMoéééMoooé 🚀MMMé🚀 oo oo éo🚀éooé 🚀M🚀oé🚀M🚀🚀ooé" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0xBDA275D83Ad72ed95184BbB3a2E1Acfa92f18281" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x062e62918be6120c41df980b3cc0aa6e380b6c1a8374eef2745c696ce41207" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-132855900570452566957322838209045807642919493469809" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-136174730158470224504270391184933229790858613389318" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "109975475066293541020901115424284490066385872913007" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xf74200CFC6AcF583A4651f43Af3055E40f4EFEaD" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x58fc" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oo oo🚀MMM🚀MMo MéMMM o🚀M M🚀oMoMo MMéé🚀o" + }, + { + "type": "hexstring", + "value": "0xf78b9b1db18b265da71216098f8b" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe5838496090a6D67b04386413b4f5c6219a00fB1" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oM🚀oMM🚀 éoo🚀🚀oo🚀🚀oé éoM M🚀éM🚀🚀o MoMoéM🚀é" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x3242B41Ee6cCe9983d90d8e0BB2eb1Ae6A1492aD" + }, + { + "type": "string", + "value": "Moo é🚀🚀é oéoMoéé🚀o 🚀M 🚀ooo🚀oo 🚀oéMoM ooooMMoMoo 🚀M " + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 🚀🚀 🚀 o 🚀MMMéééé 🚀ooooééoéooé🚀oMoooo oo" + }, + { + "type": "address", + "value": "0xD30E60F2B086b9eEFD667c9Ba76b5415DA3E9FF7" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xcfdedf4811f80388673329ba4f897609a84246f7857ce578243a55b1252f4b" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "10281119352035492206931127914602624747929407159960" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-70340482105650579936370982723225901738369260261161" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "114405844888924470006150992202480185249539601628410" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5467A3a6b826F0C388728964deB436ff6D14D90b" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0xb3fc" + }, + { + "type": "string", + "value": "Moo é🚀 éo M 🚀 oéo🚀 oéo o o M🚀ooMoé🚀o " + }, + { + "type": "string", + "value": "Moo é🚀 Méé MMMéMo oo é oéo M 🚀oMoéo" + }, + { + "type": "hexstring", + "value": "0x038dce1ee3d62b3fc0b9f92e5227" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x42d9e5b2BDD13C260c4CD60AF3DE1c0b7F861516" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o 🚀éo é🚀🚀🚀 é oé Moéoé🚀 o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x96b56676F61870Aef4d25694C5e15dECf52f735e" + }, + { + "type": "string", + "value": "Moo é🚀 🚀 é" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀M oéoé🚀🚀é 🚀oo🚀M🚀🚀MMo🚀o🚀é🚀oMéMoo éo🚀ééMo🚀o o ooMMo🚀 é o" + }, + { + "type": "address", + "value": "0x938F9a9fa9f20E8391488be3e0f78F2D4CCAF751" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x498c2b7b811995f683644dff78caa8bee50abdaf615cc1323675799985996f" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-157778683258692730386398385145916088106356432515585" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "54232751861361794542609314957671101038500089270044" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "72319662811015540544807272466622102793294740544085" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0d091C9593C567355201484B0A4761D613d5A72b" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0xcc1f" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀oé o🚀🚀oéo🚀🚀oMéoo🚀🚀é🚀o o éoooééM oééMooMéoéM" + }, + { + "type": "hexstring", + "value": "0xb4ca524f71fd3d3481079179798c" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1C49449270a67372779E95A3c07Cd1b8797ADd0A" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 oé ooéM MMé🚀MMoo MMééo🚀M 🚀oMMMoé🚀Moo🚀M" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x74FDa08C81136F929B95B73C9cdD82cAA0e127F7" + }, + { + "type": "string", + "value": "Moo é🚀 Moéoéé🚀 M Mo🚀oM🚀éM 🚀🚀oéo" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é oooéo" + }, + { + "type": "address", + "value": "0x8f830e90Da904Fd4cA01dFc72435c4fc0476e392" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x89eeebdf159eb75289aff1969d6762fffe1b5f0f319f922209668938e85282" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-186847071082254048487298153605925822047099540853151" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "141865574129162983409560752579659683272264030575773" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-47515847437253924176768556922944829601606456314080" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611234806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610c9f565b60405180910390f35b6100566109c2565b61005e6109c2565b6100666109ef565b730f075a4416d4d84c78f69fd35797d0c29184a37d8152610085610a17565b61008d610a58565b600181526171e160f11b6020808301919091526040805160808101909152604f808252600092610e5a9083013960408084019190915280518082019091526014815273026b7b79061d4f84fcd4061d4b790784fcd4037960651b60208201526060830152506d2c5c5553b4790302975a37e5ad8f60901b60808201528152610113610a88565b61011b610aa8565b73b5091997ffbdd824e5c8270ee06a043b3001b977815281526040805160808101909152604280825260009190610f54602083013960208084019190915283019190915250610168610ac6565b6001808252602080830191909152722259c887cbbd081d1b9877b5ff4f3f9b26e7536040808401919091528051608081019091526059808252600092611164908301396060830152506101cc60408051808201909152606081526000602082015290565b604080518082018252600a8152689adede418753e13f3560b71b60208083019190915290835273bda275d83ad72ed95184bbb3a2e1acfa92f182819083015260808301919091528201527f062e62918be6120c41df980b3cc0aa6e380b6c1a8374eef2745c696ce41207006060820152610244610b01565b61024c610aa8565b745ae7589f4cefb0d52341fdf91320827b9a0cf88670198152815261026f610aa8565b745d2cae168913ecd71c537df3371b0bc4062dbc78051981526020820152610295610aa8565b744b3f8edbbd904043cd116b20a0551cb5a95540826f815260408201526080820152602082015281526102c66109ef565b73f74200cfc6acf583a4651f43af3055e40f4efead81526102e5610a17565b6102ed610a58565b6001815261163f60f21b602080830191909152604080518082018252600a8152689adede418753e13f3560b71b818401528184015280516080810190915260428082526000926111bd908301396060830152506df78b9b1db18b265da71216098f8b60901b60808201528152610361610a88565b610369610aa8565b73e5838496090a6d67b04386413b4f5c6219a00fb1815281526040805160808101909152605780825260009190610fe66020830139602080840191909152830191909152506103b6610ac6565b60008082526020808301829052733242b41ee6cce9983d90d8e0bb2eb1ae6a1492ad604080850191909152805160808101909152605280825290916110969083013960608301525061041960408051808201909152606081526000602082015290565b6000604051806080016040528060508152602001610f966050913982525073d30e60f2b086b9eefd667c9ba76b5415da3e9ff76020820152608082015260408201527fcfdedf4811f80388673329ba4f897609a84246f7857ce578243a55b1252f4b006060820152610489610b01565b610491610aa8565b740708dd56181e58fb42080937ed8436582515e17e98815281526104b3610aa8565b743021004e45456a02614e8c89cb3ba450c5aedd0f2819815260208201526104d9610aa8565b744e47978317f43791640c4d29d83fd6c08e60827cfa81526040820152608082015260208281019190915282015261050f6109ef565b735467a3a6b826f0c388728964deb436ff6d14d90b815261052e610a17565b610536610a58565b60018152612cff60f21b60208083019190915260408051606081019091526039808252600092610de89083013960408084019190915280516060810190915260308082526000925061113460208301396060830152506d038dce1ee3d62b3fc0b9f92e522760901b608082015281526105ad610a88565b6105b5610aa8565b7342d9e5b2bdd13c260c4cd60af3de1c0b7f861516815281526040805160608101909152603980825260009190610e21602083013960208084019190915283019190915250610602610ac6565b60018152600060208083018290527396b56676f61870aef4d25694c5e15decf52f735e6040808501919091528051808201825260138152724d6f6f20c3a9f09f9a802020f09f9a8020c3a960681b81840152606080860191909152815180830190925281529081019190915260006040518060a0016040528060738152602001610ea96073913982525073938f9a9fa9f20e8391488be3e0f78f2d4ccaf7516020820152608082015260408201527f498c2b7b811995f683644dff78caa8bee50abdaf615cc1323675799985996f0060608201526106de610b01565b6106e6610aa8565b746bf4e0d986ee4b1340630dae9d514dc232090d32001981528152610709610aa8565b74251b88b36671b8440a1f884c7f3b0308f2dfb18f1c8152602082015261072e610aa8565b74317badd6874db8e3fdeefdceb38033556f56855a5581526040808301919091526080830191909152602083019190915282015261076a6109ef565b730d091c9593c567355201484b0a4761d613d5a72b8152610789610a17565b610791610a58565b600080825261cc1f60f01b602080840191909152604080518082018252600a8152689adede418753e13f3560b71b81840152818501528051608081019091526059808252909161103d908301396060830152506d2d329493dc7f4f4d2041e45e5e6360921b60808201528152610805610a88565b61080d610aa8565b731c49449270a67372779e95a3c07cd1b8797add0a815281526040805160808101909152604c808252600091906110e860208301396020808401919091528301919091525061085a610ac6565b60018152600060208083018290527374fda08c81136f929b95b73c9cdd82caa0e127f760408085019190915280516060810190915260388082529091610f1c908301396060830152506108be60408051808201909152606081526000602082015290565b60408051808201825260138152724d6f6f20c3a9f09f9a80c3a9206f6f6fc3a96f60681b602080830191909152908352738f830e90da904fd4ca01dfc72435c4fc0476e3929083015260808301919091528201527f89eeebdf159eb75289aff1969d6762fffe1b5f0f319f922209668938e85282006060820152610940610b01565b610948610aa8565b747fd89070d0333865562ee5ddfbd3b0e1894a39d19e198152815261096b610aa8565b746111805b7c7a9700906180a74fd231140a20b75c9d81526020820152610990610aa8565b742082fc4a18906b578a9ab4335bfca7f2a6baec08df1981526040820152608082015260208201526060820152919050565b60405180608001604052806004905b6109d96109ef565b8152602001906001900390816109d15790505090565b604051806040016040528060006001600160a01b03168152602001610a12610a17565b905290565b6040518060a00160405280610a2a610a58565b8152602001610a37610a88565b8152602001610a44610ac6565b815260006020820152604001610a12610b01565b6040805160a081018252600080825260208201819052606092820183905282820192909252608081019190915290565b6040518060400160405280610a9b610aa8565b8152602001606081525090565b60405180602001604052806001906020820280368337509192915050565b6040805160a0810182526000808252602080830182905282840182905260608084018190528451808601909552845283015290608082015290565b60405180606001604052806003905b610b18610aa8565b815260200190600190039081610b105790505090565b6000815180845260005b81811015610b5457602081850181015186830182015201610b38565b81811115610b66576000602083870101525b50601f01601f19169290920160200192915050565b805160009083825b6001811015610bab5782516001600160a01b0316825260209283019290910190600101610b83565b505050602082015160406020850152610bc76040850182610b2e565b949350505050565b8051151582526020810151151560208301526000604082015160018060a01b0380821660408601526060840151915060a06060860152610c1260a0860183610b2e565b915060808401518583036080870152805160408452610c346040850182610b2e565b6020928301519093169390910192909252949350505050565b806000805b6003811015610c9857825185835b6001811015610c8257825160140b825260209283019290910190600101610c60565b5050506020948501949290920191600101610c52565b5050505050565b602080825260009060a083820181850186855b6004811015610dda57878303601f19018452815180516001600160a01b031684528601516040878501819052815160e08287015280511515610120870152808901516001600160f01b031916610140870152808201516101608701899052610d1e6101c0880182610b2e565b905060608083015161011f19898403016101808a0152610d3e8382610b2e565b925050608071ffffffffffffffffffffffffffffffffffff1981850151166101a08a01528b8601519350603f19808a850301838b0152610d7e8486610b7b565b958701518a8703909101828b0152949350610d998486610bcf565b9450818601519350610db08b8a018560ff19169052565b80860151955050505050610dc760c0860183610c4d565b9487019493505090850190600101610cb2565b509097965050505050505056fe4d6f6f20c3a9f09f9a8020c3a96f204d20f09f9a80206fc3a96ff09f9a80206fc3a96f206f206f204df09f9a806f6f4d6fc3a9f09f9a806f204d6f6f20c3a9f09f9a806f2020f09f9a80c3a96f20c3a9f09f9a80f09f9a80f09f9a802020c3a9206fc3a9204d6fc3a96fc3a9f09f9a80206f4d6f6f20c3a9f09f9a806ff09f9a806f6f6fc3a9f09f9a80204d6fc3a9f09f9a806f20f09f9a80f09f9a806f4d20c3a9f09f9a806f206f6ff09f9a806f20f09f9a80f09f9a806ff09f9a806f4d6f6f4d6f6f20c3a9f09f9a80f09f9a804d206fc3a96fc3a9f09f9a80f09f9a80c3a920f09f9a806f6ff09f9a804df09f9a80f09f9a804d4d6ff09f9a806ff09f9a80c3a9f09f9a806f4dc3a94d6f6f20c3a96ff09f9a80c3a9c3a94d6ff09f9a806f206f2020206f6f4d4d6ff09f9a8020c3a9206f4d6f6f20c3a9f09f9a80204d6fc3a96fc3a9c3a9f09f9a80204d204d6ff09f9a806f4df09f9a80c3a94d2020f09f9a80f09f9a806fc3a96f4d6f6f20c3a9f09f9a80f09f9a80206f6ff09f9a806fc3a9c3a94df09f9a806f4d6fc3a9c3a96f6f4d206ff09f9a806f4d4d204dc3a920c3a96f6f6f6f6f6fc3a9204d6f6f20c3a9f09f9a80f09f9a8020f09f9a80f09f9a8020f09f9a80206f2020f09f9a804d4d4dc3a9c3a9c3a9c3a920f09f9a806f6f6f6fc3a9c3a96fc3a96f6fc3a9f09f9a806f4d6f6f6f6f206f6f4d6f6f20c3a9f09f9a806f4df09f9a806f4d4df09f9a8020c3a96f6ff09f9a80f09f9a806f6ff09f9a80f09f9a806fc3a92020c3a96f4d204df09f9a80c3a94df09f9a80f09f9a806f204d6f4d6fc3a94df09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a806fc3a9206ff09f9a80f09f9a806fc3a96ff09f9a80f09f9a806f4dc3a96f6ff09f9a80f09f9a80c3a9f09f9a806f206f20c3a96f6f6fc3a9c3a94d206fc3a9c3a94d6f6f4dc3a96fc3a94d4d6f6f20c3a9f09f9a80f09f9a80c3a9206fc3a96f4d6fc3a9c3a9f09f9a806f20f09f9a804d20f09f9a806f6f6ff09f9a806f6f20f09f9a806fc3a94d6f4d20206f6f6f6f4d4d6f4d6f6f20f09f9a804d204d6f6f20c3a9f09f9a80f09f9a80206fc3a9206f6fc3a94d204d4dc3a9f09f9a804d4d6f6f204d4dc3a9c3a96ff09f9a804d202020f09f9a806f4d4d4d6fc3a9f09f9a804d6f6ff09f9a804d4d6f6f20c3a9f09f9a80204dc3a9c3a9204d4d4dc3a94d6f206f6f20c3a9206fc3a96f204d20f09f9a806f4d6fc3a96f4d6f6f20c3a9f09f9a806f4d6fc3a9c3a9c3a94d6f6f6fc3a920f09f9a804d4d4dc3a9f09f9a80206f6f206f6f20c3a96ff09f9a80c3a96f6fc3a920f09f9a804df09f9a806fc3a9f09f9a804df09f9a80f09f9a806f6fc3a94d6f6f20c3a9f09f9a806f6f206f6ff09f9a804d4d4df09f9a804d4d6f204dc3a94d4d4d206ff09f9a804d204df09f9a806f4d6f4d6f204d4dc3a9c3a9f09f9a806fa264697066735822122008a254d8087b6ec010899b2bc826ceee51a1c03bbaec2c7e460269a91b43f1a864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_04d27fca {\n bool s_0;\n bytes2 s_1;\n string s_2;\n string s_3;\n bytes14 s_4;\n }\n\n struct S_a931c238 {\n address[1] s_0;\n string s_1;\n }\n\n struct S_e7028728 {\n string s_0;\n address s_1;\n }\n\n struct S_93ea1879 {\n bool s_0;\n bool s_1;\n address s_2;\n string s_3;\n S_e7028728 s_4;\n }\n\n struct S_7640573f {\n S_04d27fca s_0;\n S_a931c238 s_1;\n S_93ea1879 s_2;\n bytes31 s_3;\n int168[1][3] s_4;\n }\n\n struct S_46c4c857 {\n address s_0;\n S_7640573f s_1;\n }\n\n function test () public pure returns (S_46c4c857[4] memory) {\n S_46c4c857[4] memory r;\n {\n S_46c4c857 memory r_0;\n {\n address r_0_0 = 0x0f075a4416d4D84C78F69fd35797D0C29184A37D;\n r_0.s_0 = r_0_0;\n }\n {\n S_7640573f memory r_0_1;\n {\n S_04d27fca memory r_0_1_0;\n {\n bool r_0_1_0_0 = true;\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n bytes2 r_0_1_0_1 = bytes2(0xe3c2);\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n string memory r_0_1_0_2 = unicode\"Moo é🚀o🚀oooé🚀 Moé🚀o 🚀🚀oM é🚀o oo🚀o 🚀🚀o🚀oMoo\";\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n {\n string memory r_0_1_0_3 = unicode\"Moo é🚀éo 🚀o \";\n r_0_1_0.s_3 = r_0_1_0_3;\n }\n {\n bytes14 r_0_1_0_4 = bytes14(0x2c5c5553b4790302975a37e5ad8f);\n r_0_1_0.s_4 = r_0_1_0_4;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n {\n S_a931c238 memory r_0_1_1;\n {\n address[1] memory r_0_1_1_0;\n {\n address r_0_1_1_0_0 = 0xb5091997ffBDD824e5c8270EE06a043B3001b977;\n r_0_1_1_0[0] = r_0_1_1_0_0;\n }\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n string memory r_0_1_1_1 = unicode\"Moo é🚀🚀 oo🚀oééM🚀oMoééooM o🚀oMM Mé éooooooé \";\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n S_93ea1879 memory r_0_1_2;\n {\n bool r_0_1_2_0 = true;\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n bool r_0_1_2_1 = true;\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n address r_0_1_2_2 = 0x002259c887cBbd081d1b9877B5FF4F3f9b26e753;\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n {\n string memory r_0_1_2_3 = unicode\"Moo é🚀oMoéééMoooé 🚀MMMé🚀 oo oo éo🚀éooé 🚀M🚀oé🚀M🚀🚀ooé\";\n r_0_1_2.s_3 = r_0_1_2_3;\n }\n {\n S_e7028728 memory r_0_1_2_4;\n {\n string memory r_0_1_2_4_0 = unicode\"Moo é🚀\";\n r_0_1_2_4.s_0 = r_0_1_2_4_0;\n }\n {\n address r_0_1_2_4_1 = 0xBDA275D83Ad72ed95184BbB3a2E1Acfa92f18281;\n r_0_1_2_4.s_1 = r_0_1_2_4_1;\n }\n r_0_1_2.s_4 = r_0_1_2_4;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n {\n bytes31 r_0_1_3 = bytes31(0x062e62918be6120c41df980b3cc0aa6e380b6c1a8374eef2745c696ce41207);\n r_0_1.s_3 = r_0_1_3;\n }\n {\n int168[1][3] memory r_0_1_4;\n {\n int168[1] memory r_0_1_4_0;\n {\n int168 r_0_1_4_0_0 = -132855900570452566957322838209045807642919493469809;\n r_0_1_4_0[0] = r_0_1_4_0_0;\n }\n r_0_1_4[0] = r_0_1_4_0;\n }\n {\n int168[1] memory r_0_1_4_1;\n {\n int168 r_0_1_4_1_0 = -136174730158470224504270391184933229790858613389318;\n r_0_1_4_1[0] = r_0_1_4_1_0;\n }\n r_0_1_4[1] = r_0_1_4_1;\n }\n {\n int168[1] memory r_0_1_4_2;\n {\n int168 r_0_1_4_2_0 = 109975475066293541020901115424284490066385872913007;\n r_0_1_4_2[0] = r_0_1_4_2_0;\n }\n r_0_1_4[2] = r_0_1_4_2;\n }\n r_0_1.s_4 = r_0_1_4;\n }\n r_0.s_1 = r_0_1;\n }\n r[0] = r_0;\n }\n {\n S_46c4c857 memory r_1;\n {\n address r_1_0 = 0xf74200CFC6AcF583A4651f43Af3055E40f4EFEaD;\n r_1.s_0 = r_1_0;\n }\n {\n S_7640573f memory r_1_1;\n {\n S_04d27fca memory r_1_1_0;\n {\n bool r_1_1_0_0 = true;\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n bytes2 r_1_1_0_1 = bytes2(0x58fc);\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n string memory r_1_1_0_2 = unicode\"Moo é🚀\";\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n {\n string memory r_1_1_0_3 = unicode\"Moo é🚀oo oo🚀MMM🚀MMo MéMMM o🚀M M🚀oMoMo MMéé🚀o\";\n r_1_1_0.s_3 = r_1_1_0_3;\n }\n {\n bytes14 r_1_1_0_4 = bytes14(0xf78b9b1db18b265da71216098f8b);\n r_1_1_0.s_4 = r_1_1_0_4;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_a931c238 memory r_1_1_1;\n {\n address[1] memory r_1_1_1_0;\n {\n address r_1_1_1_0_0 = 0xe5838496090a6D67b04386413b4f5c6219a00fB1;\n r_1_1_1_0[0] = r_1_1_1_0_0;\n }\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n {\n string memory r_1_1_1_1 = unicode\"Moo é🚀oM🚀oMM🚀 éoo🚀🚀oo🚀🚀oé éoM M🚀éM🚀🚀o MoMoéM🚀é\";\n r_1_1_1.s_1 = r_1_1_1_1;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_93ea1879 memory r_1_1_2;\n {\n bool r_1_1_2_0 = false;\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n bool r_1_1_2_1 = false;\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n {\n address r_1_1_2_2 = 0x3242B41Ee6cCe9983d90d8e0BB2eb1Ae6A1492aD;\n r_1_1_2.s_2 = r_1_1_2_2;\n }\n {\n string memory r_1_1_2_3 = unicode\"Moo é🚀🚀é oéoMoéé🚀o 🚀M 🚀ooo🚀oo 🚀oéMoM ooooMMoMoo 🚀M \";\n r_1_1_2.s_3 = r_1_1_2_3;\n }\n {\n S_e7028728 memory r_1_1_2_4;\n {\n string memory r_1_1_2_4_0 = unicode\"Moo é🚀🚀 🚀🚀 🚀 o 🚀MMMéééé 🚀ooooééoéooé🚀oMoooo oo\";\n r_1_1_2_4.s_0 = r_1_1_2_4_0;\n }\n {\n address r_1_1_2_4_1 = 0xD30E60F2B086b9eEFD667c9Ba76b5415DA3E9FF7;\n r_1_1_2_4.s_1 = r_1_1_2_4_1;\n }\n r_1_1_2.s_4 = r_1_1_2_4;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bytes31 r_1_1_3 = bytes31(0xcfdedf4811f80388673329ba4f897609a84246f7857ce578243a55b1252f4b);\n r_1_1.s_3 = r_1_1_3;\n }\n {\n int168[1][3] memory r_1_1_4;\n {\n int168[1] memory r_1_1_4_0;\n {\n int168 r_1_1_4_0_0 = 10281119352035492206931127914602624747929407159960;\n r_1_1_4_0[0] = r_1_1_4_0_0;\n }\n r_1_1_4[0] = r_1_1_4_0;\n }\n {\n int168[1] memory r_1_1_4_1;\n {\n int168 r_1_1_4_1_0 = -70340482105650579936370982723225901738369260261161;\n r_1_1_4_1[0] = r_1_1_4_1_0;\n }\n r_1_1_4[1] = r_1_1_4_1;\n }\n {\n int168[1] memory r_1_1_4_2;\n {\n int168 r_1_1_4_2_0 = 114405844888924470006150992202480185249539601628410;\n r_1_1_4_2[0] = r_1_1_4_2_0;\n }\n r_1_1_4[2] = r_1_1_4_2;\n }\n r_1_1.s_4 = r_1_1_4;\n }\n r_1.s_1 = r_1_1;\n }\n r[1] = r_1;\n }\n {\n S_46c4c857 memory r_2;\n {\n address r_2_0 = 0x5467A3a6b826F0C388728964deB436ff6D14D90b;\n r_2.s_0 = r_2_0;\n }\n {\n S_7640573f memory r_2_1;\n {\n S_04d27fca memory r_2_1_0;\n {\n bool r_2_1_0_0 = true;\n r_2_1_0.s_0 = r_2_1_0_0;\n }\n {\n bytes2 r_2_1_0_1 = bytes2(0xb3fc);\n r_2_1_0.s_1 = r_2_1_0_1;\n }\n {\n string memory r_2_1_0_2 = unicode\"Moo é🚀 éo M 🚀 oéo🚀 oéo o o M🚀ooMoé🚀o \";\n r_2_1_0.s_2 = r_2_1_0_2;\n }\n {\n string memory r_2_1_0_3 = unicode\"Moo é🚀 Méé MMMéMo oo é oéo M 🚀oMoéo\";\n r_2_1_0.s_3 = r_2_1_0_3;\n }\n {\n bytes14 r_2_1_0_4 = bytes14(0x038dce1ee3d62b3fc0b9f92e5227);\n r_2_1_0.s_4 = r_2_1_0_4;\n }\n r_2_1.s_0 = r_2_1_0;\n }\n {\n S_a931c238 memory r_2_1_1;\n {\n address[1] memory r_2_1_1_0;\n {\n address r_2_1_1_0_0 = 0x42d9e5b2BDD13C260c4CD60AF3DE1c0b7F861516;\n r_2_1_1_0[0] = r_2_1_1_0_0;\n }\n r_2_1_1.s_0 = r_2_1_1_0;\n }\n {\n string memory r_2_1_1_1 = unicode\"Moo é🚀o 🚀éo é🚀🚀🚀 é oé Moéoé🚀 o\";\n r_2_1_1.s_1 = r_2_1_1_1;\n }\n r_2_1.s_1 = r_2_1_1;\n }\n {\n S_93ea1879 memory r_2_1_2;\n {\n bool r_2_1_2_0 = true;\n r_2_1_2.s_0 = r_2_1_2_0;\n }\n {\n bool r_2_1_2_1 = false;\n r_2_1_2.s_1 = r_2_1_2_1;\n }\n {\n address r_2_1_2_2 = 0x96b56676F61870Aef4d25694C5e15dECf52f735e;\n r_2_1_2.s_2 = r_2_1_2_2;\n }\n {\n string memory r_2_1_2_3 = unicode\"Moo é🚀 🚀 é\";\n r_2_1_2.s_3 = r_2_1_2_3;\n }\n {\n S_e7028728 memory r_2_1_2_4;\n {\n string memory r_2_1_2_4_0 = unicode\"Moo é🚀🚀M oéoé🚀🚀é 🚀oo🚀M🚀🚀MMo🚀o🚀é🚀oMéMoo éo🚀ééMo🚀o o ooMMo🚀 é o\";\n r_2_1_2_4.s_0 = r_2_1_2_4_0;\n }\n {\n address r_2_1_2_4_1 = 0x938F9a9fa9f20E8391488be3e0f78F2D4CCAF751;\n r_2_1_2_4.s_1 = r_2_1_2_4_1;\n }\n r_2_1_2.s_4 = r_2_1_2_4;\n }\n r_2_1.s_2 = r_2_1_2;\n }\n {\n bytes31 r_2_1_3 = bytes31(0x498c2b7b811995f683644dff78caa8bee50abdaf615cc1323675799985996f);\n r_2_1.s_3 = r_2_1_3;\n }\n {\n int168[1][3] memory r_2_1_4;\n {\n int168[1] memory r_2_1_4_0;\n {\n int168 r_2_1_4_0_0 = -157778683258692730386398385145916088106356432515585;\n r_2_1_4_0[0] = r_2_1_4_0_0;\n }\n r_2_1_4[0] = r_2_1_4_0;\n }\n {\n int168[1] memory r_2_1_4_1;\n {\n int168 r_2_1_4_1_0 = 54232751861361794542609314957671101038500089270044;\n r_2_1_4_1[0] = r_2_1_4_1_0;\n }\n r_2_1_4[1] = r_2_1_4_1;\n }\n {\n int168[1] memory r_2_1_4_2;\n {\n int168 r_2_1_4_2_0 = 72319662811015540544807272466622102793294740544085;\n r_2_1_4_2[0] = r_2_1_4_2_0;\n }\n r_2_1_4[2] = r_2_1_4_2;\n }\n r_2_1.s_4 = r_2_1_4;\n }\n r_2.s_1 = r_2_1;\n }\n r[2] = r_2;\n }\n {\n S_46c4c857 memory r_3;\n {\n address r_3_0 = 0x0d091C9593C567355201484B0A4761D613d5A72b;\n r_3.s_0 = r_3_0;\n }\n {\n S_7640573f memory r_3_1;\n {\n S_04d27fca memory r_3_1_0;\n {\n bool r_3_1_0_0 = false;\n r_3_1_0.s_0 = r_3_1_0_0;\n }\n {\n bytes2 r_3_1_0_1 = bytes2(0xcc1f);\n r_3_1_0.s_1 = r_3_1_0_1;\n }\n {\n string memory r_3_1_0_2 = unicode\"Moo é🚀\";\n r_3_1_0.s_2 = r_3_1_0_2;\n }\n {\n string memory r_3_1_0_3 = unicode\"Moo é🚀🚀oé o🚀🚀oéo🚀🚀oMéoo🚀🚀é🚀o o éoooééM oééMooMéoéM\";\n r_3_1_0.s_3 = r_3_1_0_3;\n }\n {\n bytes14 r_3_1_0_4 = bytes14(0xb4ca524f71fd3d3481079179798c);\n r_3_1_0.s_4 = r_3_1_0_4;\n }\n r_3_1.s_0 = r_3_1_0;\n }\n {\n S_a931c238 memory r_3_1_1;\n {\n address[1] memory r_3_1_1_0;\n {\n address r_3_1_1_0_0 = 0x1C49449270a67372779E95A3c07Cd1b8797ADd0A;\n r_3_1_1_0[0] = r_3_1_1_0_0;\n }\n r_3_1_1.s_0 = r_3_1_1_0;\n }\n {\n string memory r_3_1_1_1 = unicode\"Moo é🚀🚀 oé ooéM MMé🚀MMoo MMééo🚀M 🚀oMMMoé🚀Moo🚀M\";\n r_3_1_1.s_1 = r_3_1_1_1;\n }\n r_3_1.s_1 = r_3_1_1;\n }\n {\n S_93ea1879 memory r_3_1_2;\n {\n bool r_3_1_2_0 = true;\n r_3_1_2.s_0 = r_3_1_2_0;\n }\n {\n bool r_3_1_2_1 = false;\n r_3_1_2.s_1 = r_3_1_2_1;\n }\n {\n address r_3_1_2_2 = 0x74FDa08C81136F929B95B73C9cdD82cAA0e127F7;\n r_3_1_2.s_2 = r_3_1_2_2;\n }\n {\n string memory r_3_1_2_3 = unicode\"Moo é🚀 Moéoéé🚀 M Mo🚀oM🚀éM 🚀🚀oéo\";\n r_3_1_2.s_3 = r_3_1_2_3;\n }\n {\n S_e7028728 memory r_3_1_2_4;\n {\n string memory r_3_1_2_4_0 = unicode\"Moo é🚀é oooéo\";\n r_3_1_2_4.s_0 = r_3_1_2_4_0;\n }\n {\n address r_3_1_2_4_1 = 0x8f830e90Da904Fd4cA01dFc72435c4fc0476e392;\n r_3_1_2_4.s_1 = r_3_1_2_4_1;\n }\n r_3_1_2.s_4 = r_3_1_2_4;\n }\n r_3_1.s_2 = r_3_1_2;\n }\n {\n bytes31 r_3_1_3 = bytes31(0x89eeebdf159eb75289aff1969d6762fffe1b5f0f319f922209668938e85282);\n r_3_1.s_3 = r_3_1_3;\n }\n {\n int168[1][3] memory r_3_1_4;\n {\n int168[1] memory r_3_1_4_0;\n {\n int168 r_3_1_4_0_0 = -186847071082254048487298153605925822047099540853151;\n r_3_1_4_0[0] = r_3_1_4_0_0;\n }\n r_3_1_4[0] = r_3_1_4_0;\n }\n {\n int168[1] memory r_3_1_4_1;\n {\n int168 r_3_1_4_1_0 = 141865574129162983409560752579659683272264030575773;\n r_3_1_4_1[0] = r_3_1_4_1_0;\n }\n r_3_1_4[1] = r_3_1_4_1;\n }\n {\n int168[1] memory r_3_1_4_2;\n {\n int168 r_3_1_4_2_0 = -47515847437253924176768556922944829601606456314080;\n r_3_1_4_2[0] = r_3_1_4_2_0;\n }\n r_3_1_4[2] = r_3_1_4_2;\n }\n r_3_1.s_4 = r_3_1_4;\n }\n r_3.s_1 = r_3_1;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000f075a4416d4d84c78f69fd35797d0c29184a37d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000300062e62918be6120c41df980b3cc0aa6e380b6c1a8374eef2745c696ce4120700ffffffffffffffffffffffa518a760b3104f2adcbe0206ecdf7d8465f307798fffffffffffffffffffffffa2d351e976ec1328e3ac820cc8e4f43bf9d24387fa00000000000000000000004b3f8edbbd904043cd116b20a0551cb5a95540826f0000000000000000000000000000000000000000000000000000000000000001e3c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001202c5c5553b4790302975a37e5ad8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a806ff09f9a806f6f6fc3a9f09f9a80204d6fc3a9f09f9a806f20f09f9a80f09f9a806f4d20c3a9f09f9a806f206f6ff09f9a806f20f09f9a80f09f9a806ff09f9a806f4d6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a80c3a96f20f09f9a806f20000000000000000000000000000000000000000000000000b5091997ffbdd824e5c8270ee06a043b3001b977000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80f09f9a80206f6ff09f9a806fc3a9c3a94df09f9a806f4d6fc3a9c3a96f6f4d206ff09f9a806f4d4d204dc3a920c3a96f6f6f6f6f6fc3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000002259c887cbbd081d1b9877b5ff4f3f9b26e75300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a806f4d6fc3a9c3a9c3a94d6f6f6fc3a920f09f9a804d4d4dc3a9f09f9a80206f6f206f6f20c3a96ff09f9a80c3a96f6fc3a920f09f9a804df09f9a806fc3a9f09f9a804df09f9a80f09f9a806f6fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000bda275d83ad72ed95184bbb3a2e1acfa92f18281000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000f74200cfc6acf583a4651f43af3055e40f4efead000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000300cfdedf4811f80388673329ba4f897609a84246f7857ce578243a55b1252f4b0000000000000000000000000708dd56181e58fb42080937ed8436582515e17e98ffffffffffffffffffffffcfdeffb1baba95fd9eb1737634c45baf3a5122f0d700000000000000000000004e47978317f43791640c4d29d83fd6c08e60827cfa000000000000000000000000000000000000000000000000000000000000000158fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0f78b9b1db18b265da71216098f8b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a806f6f206f6ff09f9a804d4d4df09f9a804d4d6f204dc3a94d4d4d206ff09f9a804d204df09f9a806f4d6f4d6f204d4dc3a9c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5838496090a6d67b04386413b4f5c6219a00fb1000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f4df09f9a806f4d4df09f9a8020c3a96f6ff09f9a80f09f9a806f6ff09f9a80f09f9a806fc3a92020c3a96f4d204df09f9a80c3a94df09f9a80f09f9a806f204d6f4d6fc3a94df09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003242b41ee6cce9983d90d8e0bb2eb1ae6a1492ad00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80f09f9a80c3a9206fc3a96f4d6fc3a9c3a9f09f9a806f20f09f9a804d20f09f9a806f6f6ff09f9a806f6f20f09f9a806fc3a94d6f4d20206f6f6f6f4d4d6f4d6f6f20f09f9a804d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000d30e60f2b086b9eefd667c9ba76b5415da3e9ff700000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80f09f9a8020f09f9a80f09f9a8020f09f9a80206f2020f09f9a804d4d4dc3a9c3a9c3a9c3a920f09f9a806f6f6f6fc3a9c3a96fc3a96f6fc3a9f09f9a806f4d6f6f6f6f206f6f000000000000000000000000000000000000000000000000000000005467a3a6b826f0c388728964deb436ff6d14d90b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002e0498c2b7b811995f683644dff78caa8bee50abdaf615cc1323675799985996f00ffffffffffffffffffffff940b1f267911b4ecbf9cf25162aeb23dcdf6f2cdff0000000000000000000000251b88b36671b8440a1f884c7f3b0308f2dfb18f1c0000000000000000000000317badd6874db8e3fdeefdceb38033556f56855a550000000000000000000000000000000000000000000000000000000000000001b3fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100038dce1ee3d62b3fc0b9f92e522700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a8020c3a96f204d20f09f9a80206fc3a96ff09f9a80206fc3a96f206f206f204df09f9a806f6f4d6fc3a9f09f9a806f200000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80204dc3a9c3a9204d4d4dc3a94d6f206f6f20c3a9206fc3a96f204d20f09f9a806f4d6fc3a96f0000000000000000000000000000000000000000000000000000000042d9e5b2bdd13c260c4cd60af3de1c0b7f861516000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f2020f09f9a80c3a96f20c3a9f09f9a80f09f9a80f09f9a802020c3a9206fc3a9204d6fc3a96fc3a9f09f9a80206f000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096b56676f61870aef4d25694c5e15decf52f735e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a802020f09f9a8020c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000938f9a9fa9f20e8391488be3e0f78f2d4ccaf75100000000000000000000000000000000000000000000000000000000000000734d6f6f20c3a9f09f9a80f09f9a804d206fc3a96fc3a9f09f9a80f09f9a80c3a920f09f9a806f6ff09f9a804df09f9a80f09f9a804d4d6ff09f9a806ff09f9a80c3a9f09f9a806f4dc3a94d6f6f20c3a96ff09f9a80c3a9c3a94d6ff09f9a806f206f2020206f6f4d4d6ff09f9a8020c3a9206f000000000000000000000000000000000000000000000000000d091c9593c567355201484b0a4761d613d5a72b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000030089eeebdf159eb75289aff1969d6762fffe1b5f0f319f922209668938e8528200ffffffffffffffffffffff80276f8f2fccc79aa9d11a22042c4f1e76b5c62e6100000000000000000000006111805b7c7a9700906180a74fd231140a20b75c9dffffffffffffffffffffffdf7d03b5e76f94a875654bcca403580d594513f7200000000000000000000000000000000000000000000000000000000000000000cc1f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0b4ca524f71fd3d3481079179798c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a806fc3a9206ff09f9a80f09f9a806fc3a96ff09f9a80f09f9a806f4dc3a96f6ff09f9a80f09f9a80c3a9f09f9a806f206f20c3a96f6f6fc3a9c3a94d206fc3a9c3a94d6f6f4dc3a96fc3a94d000000000000000000000000000000000000001c49449270a67372779e95a3c07cd1b8797add0a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a80f09f9a80206fc3a9206f6fc3a94d204d4dc3a9f09f9a804d4d6f6f204d4dc3a9c3a96ff09f9a804d202020f09f9a806f4d4d4d6fc3a9f09f9a804d6f6ff09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074fda08c81136f929b95b73c9cdd82caa0e127f700000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a80204d6fc3a96fc3a9c3a9f09f9a80204d204d6ff09f9a806f4df09f9a80c3a94d2020f09f9a80f09f9a806fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000008f830e90da904fd4ca01dfc72435c4fc0476e39200000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80c3a9206f6f6fc3a96f00000000000000000000000000" + }, + { + "name": "random-(int184,((string[3],bytes17,address),(uint[3],(int200),address,bytes29[3]),address,string,bool[]),int24,(address,address,bytes21,bool))", + "type": "(int184,((string[3],bytes17,address),(uint[3],(int200),address,bytes29[3]),address,string,bool[]),int24,(address,address,bytes21,bool))", + "value": [ + "10185335835705589186101059708721489697976903556057377518", + [ + [ + [ + "Moo é🚀Mé ", + "Moo é🚀Moo o oMéMM🚀🚀oMMoMoMéo🚀🚀 oé", + "Moo é🚀é🚀 oMMé 🚀🚀M MoééoéMéoooé éoo é oMéo🚀 oMM🚀🚀MooM🚀" + ], + "0x1e1bb68944be60674ce9dbe89201a4ab2d", + "0x4576B7Dc7aDB93203819AAdeb0E3aC21D7F4896b" + ], + [ + [ + "36114325555168542233322009559668645598862926391415783888696122610530572325575", + "60762652398308231926972678367461694517229149704016908959019482000282708881831", + "47861590773579426757882838942552201846661040201951003651542489032352278558172" + ], + ["-571695732114535490360138261830488000825934111026638921041339"], + "0x9E92F672b61aCC419d267E76fd5B352A47F7ECcF", + [ + "0x79fbdf1ce278a114a9637ebd100618a483244e3a2c1373f6351fe8258e", + "0xf8401e4a5b5c1d65b0274a98223e21934d23e84a6d8a9b57bd43a5f73b", + "0x1053851477778970c22422397e81254af5c68e3d7929c452904c9def8d" + ] + ], + "0xbD271D0D66D04282FaA75219249E8bE247C27E24", + "Moo é🚀", + [false, true] + ], + "4386406", + [ + "0xd24c42ec3145c1FcBbD12b53E5caDEb927A119E9", + "0xC27a97E83CaEB2aFaa6a7D36639e6C87a1a89795", + "0x92bca2023a27cac5c83cff86126ddbcdcdf50730d1", + true + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "10185335835705589186101059708721489697976903556057377518" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mé " + }, + { + "type": "string", + "value": "Moo é🚀Moo o oMéMM🚀🚀oMMoMoMéo🚀🚀 oé" + }, + { + "type": "string", + "value": "Moo é🚀é🚀 oMMé 🚀🚀M MoééoéMéoooé éoo é oMéo🚀 oMM🚀🚀MooM🚀" + } + ] + }, + { + "type": "hexstring", + "value": "0x1e1bb68944be60674ce9dbe89201a4ab2d" + }, + { + "type": "address", + "value": "0x4576B7Dc7aDB93203819AAdeb0E3aC21D7F4896b" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "36114325555168542233322009559668645598862926391415783888696122610530572325575" + }, + { + "type": "number", + "value": "60762652398308231926972678367461694517229149704016908959019482000282708881831" + }, + { + "type": "number", + "value": "47861590773579426757882838942552201846661040201951003651542489032352278558172" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-571695732114535490360138261830488000825934111026638921041339" + } + ] + }, + { + "type": "address", + "value": "0x9E92F672b61aCC419d267E76fd5B352A47F7ECcF" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x79fbdf1ce278a114a9637ebd100618a483244e3a2c1373f6351fe8258e" + }, + { + "type": "hexstring", + "value": "0xf8401e4a5b5c1d65b0274a98223e21934d23e84a6d8a9b57bd43a5f73b" + }, + { + "type": "hexstring", + "value": "0x1053851477778970c22422397e81254af5c68e3d7929c452904c9def8d" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xbD271D0D66D04282FaA75219249E8bE247C27E24" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "number", + "value": "4386406" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd24c42ec3145c1FcBbD12b53E5caDEb927A119E9" + }, + { + "type": "address", + "value": "0xC27a97E83CaEB2aFaa6a7D36639e6C87a1a89795" + }, + { + "type": "hexstring", + "value": "0x92bca2023a27cac5c83cff86126ddbcdcdf50730d1" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610872806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610627565b60405180910390f35b6100566103e5565b61005e6103e5565b766a570195269ddaef4391ccef6755d5e337f2778e81aaee815261008061043d565b610088610476565b61009061049d565b604080518082018252600e81526d026b7b79061d4f84fcd4026e1d4960951b6020808301919091529083528151606081019092526034808352600092916108099083013990508082600160200201819052505060006040518060800160405280605881526020016107b16058913960408084019190915291835250701e1bb68944be60674ce9dbe89201a4ab2d60781b6020830152734576b7dc7adb93203819aadeb0e3ac21d7f4896b9082015281526101486104c4565b6101506104fc565b7f4fd7fbe0c586f9a8abd0a955a38370a1b64ae9da8cc327909d000fcb5a5c52c781527f8656714814309f0b9aaf7d208e2360b76e2102f10652fa71177541be024c31a76020808301919091527f69d0b34cca5b07446b23d41a227d00f47bf6beeec138c86808677db5dad4b5dc60408084019190915291835281518082018352785b138df1b4bfd2cfea1d49c2f96fb4ac3d05c9d5aab5f685ba19815290830152739e92f672b61acc419d267e76fd5b352a47f7eccf908201526102136104fc565b7f79fbdf1ce278a114a9637ebd100618a483244e3a2c1373f6351fe8258e00000081527ff8401e4a5b5c1d65b0274a98223e21934d23e84a6d8a9b57bd43a5f73b0000006020808301919091527f1053851477778970c22422397e81254af5c68e3d7929c452904c9def8d0000006040808401919091526060848101939093528482019390935273bd271d0d66d04282faa75219249e8be247c27e248484015282518084018452600a8152689adede418753e13f3560b71b818301528483015282516002808252928101845260009390929183019080368337019050509050600080826000815181106103085761030861079a565b6020026020010190151590811515815250505060006001905080826001815181106103355761033561079a565b9115156020928302919091018201526080840192909252508201526242ee66604082015261038360408051608081018252600080825260208201819052918101829052606081019190915290565b73d24c42ec3145c1fcbbd12b53e5cadeb927a119e9815273c27a97e83caeb2afaa6a7d36639e6c87a1a8979560208201527492bca2023a27cac5c83cff86126ddbcdcdf50730d160581b60408201526001606080830191909152820152919050565b6040518060800160405280600060160b815260200161040261043d565b81526000602082015260400161043860408051608081018252600080825260208201819052918101829052606081019190915290565b905290565b6040518060a00160405280610450610476565b815260200161045d6104c4565b8152600060208201526060604082018190529081015290565b604051806060016040528061048961049d565b815260006020820181905260409091015290565b60405180606001604052806003905b60608152602001906001900390816104ac5790505090565b60405180608001604052806104d76104fc565b8152604080516020818101909252600081529101908152600060208201526040016104385b60405180606001604052806003906020820280368337509192915050565b6000815180845260005b8181101561054057602081850181015186830182015201610524565b81811115610552576000602083870101525b50601f01601f19169290920160200192915050565b80518260005b600381101561058c57825182526020928301929091019060010161056d565b5050506020818101515160180b60608481019190915260408301516001600160a01b0316608085015282015160a0840160005b60038110156105e257825162ffffff1916825291830191908301906001016105bf565b505050505050565b600081518084526020808501945080840160005b8381101561061c5781511515875295820195908201906001016105fe565b509495945050505050565b6020808252825160160b828201528281015160e060408401528051610180610100850152805160606102808601526000939291906103408601906102e08701865b6003811015610698576102df1989850301825261068684845161051a565b93509186019190860190600101610668565b505050818401516effffffffffffffffffffffffffffff19166102a087015260408201516001600160a01b03166102c087015292820151926106de610120870185610567565b60408301516001600160a01b0316610220870152606083015160ff1987830381016102408901529094509150610714818561051a565b9350506080820151915080858403016102608601525061073482826105ea565b915050604084015161074b606085018260020b9052565b5060608481015180516001600160a01b03908116608087015260208201511660a086015260408101516affffffffffffffffffffff191660c086015290810151151560e0850152509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a9f09f9a80206f4d4dc3a920f09f9a80f09f9a804d204d6fc3a9c3a96fc3a94dc3a96f6f6fc3a920c3a96f6f20c3a9206f4dc3a96ff09f9a80206f4d4df09f9a80f09f9a804d6f6f4df09f9a804d6f6f20c3a9f09f9a804d6f6f206f206f4dc3a94d4df09f9a80f09f9a806f4d4d6f4d6f4dc3a96ff09f9a80f09f9a80206fc3a9a26469706673582212200513cde7df88be3a4897832843f78a1c7929a598259ec7c9253c93504f66403564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_dc11a5a8 {\n string[3] s_0;\n bytes17 s_1;\n address s_2;\n }\n\n struct S_530fe426 {\n int200 s_0;\n }\n\n struct S_7caf8a50 {\n uint256[3] s_0;\n S_530fe426 s_1;\n address s_2;\n bytes29[3] s_3;\n }\n\n struct S_33b68843 {\n S_dc11a5a8 s_0;\n S_7caf8a50 s_1;\n address s_2;\n string s_3;\n bool[] s_4;\n }\n\n struct S_62bedf46 {\n address s_0;\n address s_1;\n bytes21 s_2;\n bool s_3;\n }\n\n struct S_0f0af590 {\n int184 s_0;\n S_33b68843 s_1;\n int24 s_2;\n S_62bedf46 s_3;\n }\n\n function test () public pure returns (S_0f0af590 memory) {\n S_0f0af590 memory r;\n {\n int184 r_0 = 10185335835705589186101059708721489697976903556057377518;\n r.s_0 = r_0;\n }\n {\n S_33b68843 memory r_1;\n {\n S_dc11a5a8 memory r_1_0;\n {\n string[3] memory r_1_0_0;\n {\n string memory r_1_0_0_0 = unicode\"Moo é🚀Mé \";\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n string memory r_1_0_0_1 = unicode\"Moo é🚀Moo o oMéMM🚀🚀oMMoMoMéo🚀🚀 oé\";\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n string memory r_1_0_0_2 = unicode\"Moo é🚀é🚀 oMMé 🚀🚀M MoééoéMéoooé éoo é oMéo🚀 oMM🚀🚀MooM🚀\";\n r_1_0_0[2] = r_1_0_0_2;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes17 r_1_0_1 = bytes17(0x1e1bb68944be60674ce9dbe89201a4ab2d);\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x4576B7Dc7aDB93203819AAdeb0E3aC21D7F4896b;\n r_1_0.s_2 = r_1_0_2;\n }\n r_1.s_0 = r_1_0;\n }\n {\n S_7caf8a50 memory r_1_1;\n {\n uint256[3] memory r_1_1_0;\n {\n uint r_1_1_0_0 = 36114325555168542233322009559668645598862926391415783888696122610530572325575;\n r_1_1_0[0] = r_1_1_0_0;\n }\n {\n uint r_1_1_0_1 = 60762652398308231926972678367461694517229149704016908959019482000282708881831;\n r_1_1_0[1] = r_1_1_0_1;\n }\n {\n uint r_1_1_0_2 = 47861590773579426757882838942552201846661040201951003651542489032352278558172;\n r_1_1_0[2] = r_1_1_0_2;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_530fe426 memory r_1_1_1;\n {\n int200 r_1_1_1_0 = -571695732114535490360138261830488000825934111026638921041339;\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0x9E92F672b61aCC419d267E76fd5B352A47F7ECcF;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bytes29[3] memory r_1_1_3;\n {\n bytes29 r_1_1_3_0 = bytes29(0x79fbdf1ce278a114a9637ebd100618a483244e3a2c1373f6351fe8258e);\n r_1_1_3[0] = r_1_1_3_0;\n }\n {\n bytes29 r_1_1_3_1 = bytes29(0xf8401e4a5b5c1d65b0274a98223e21934d23e84a6d8a9b57bd43a5f73b);\n r_1_1_3[1] = r_1_1_3_1;\n }\n {\n bytes29 r_1_1_3_2 = bytes29(0x1053851477778970c22422397e81254af5c68e3d7929c452904c9def8d);\n r_1_1_3[2] = r_1_1_3_2;\n }\n r_1_1.s_3 = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n {\n address r_1_2 = 0xbD271D0D66D04282FaA75219249E8bE247C27E24;\n r_1.s_2 = r_1_2;\n }\n {\n string memory r_1_3 = unicode\"Moo é🚀\";\n r_1.s_3 = r_1_3;\n }\n {\n bool[] memory r_1_4 = new bool[](2);\n {\n bool r_1_4_0 = false;\n r_1_4[0] = r_1_4_0;\n }\n {\n bool r_1_4_1 = true;\n r_1_4[1] = r_1_4_1;\n }\n r_1.s_4 = r_1_4;\n }\n r.s_1 = r_1;\n }\n {\n int24 r_2 = 4386406;\n r.s_2 = r_2;\n }\n {\n S_62bedf46 memory r_3;\n {\n address r_3_0 = 0xd24c42ec3145c1FcBbD12b53E5caDEb927A119E9;\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0xC27a97E83CaEB2aFaa6a7D36639e6C87a1a89795;\n r_3.s_1 = r_3_1;\n }\n {\n bytes21 r_3_2 = bytes21(0x92bca2023a27cac5c83cff86126ddbcdcdf50730d1);\n r_3.s_2 = r_3_2;\n }\n {\n bool r_3_3 = true;\n r_3.s_3 = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000006a570195269ddaef4391ccef6755d5e337f2778e81aaee00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000042ee66000000000000000000000000d24c42ec3145c1fcbbd12b53e5cadeb927a119e9000000000000000000000000c27a97e83caeb2afaa6a7d36639e6c87a1a8979592bca2023a27cac5c83cff86126ddbcdcdf50730d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001804fd7fbe0c586f9a8abd0a955a38370a1b64ae9da8cc327909d000fcb5a5c52c78656714814309f0b9aaf7d208e2360b76e2102f10652fa71177541be024c31a769d0b34cca5b07446b23d41a227d00f47bf6beeec138c86808677db5dad4b5dcffffffffffffffa4ec720e4b402d3015e2b63d06904b53c2fa362a554a097a450000000000000000000000009e92f672b61acc419d267e76fd5b352a47f7eccf79fbdf1ce278a114a9637ebd100618a483244e3a2c1373f6351fe8258e000000f8401e4a5b5c1d65b0274a98223e21934d23e84a6d8a9b57bd43a5f73b0000001053851477778970c22422397e81254af5c68e3d7929c452904c9def8d000000000000000000000000000000bd271d0d66d04282faa75219249e8be247c27e24000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000000601e1bb68944be60674ce9dbe89201a4ab2d0000000000000000000000000000000000000000000000000000004576b7dc7adb93203819aadeb0e3ac21d7f4896b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a804dc3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a804d6f6f206f206f4dc3a94d4df09f9a80f09f9a806f4d4d6f4d6f4dc3a96ff09f9a80f09f9a80206fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a80c3a9f09f9a80206f4d4dc3a920f09f9a80f09f9a804d204d6fc3a9c3a96fc3a94dc3a96f6f6fc3a920c3a96f6f20c3a9206f4dc3a96ff09f9a80206f4d4df09f9a80f09f9a804d6f6f4df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(string,string,((bytes26),(address,bytes10,(bytes24,uint256[3],(bool,(string,address[1]),string,address,string)),bool,string)[2],bool),string)", + "type": "(string,string,((bytes26),(address,bytes10,(bytes24,uint256[3],(bool,(string,address[1]),string,address,string)),bool,string)[2],bool),string)", + "value": [ + "Moo é🚀🚀🚀oM oéM🚀Méoo🚀", + "Moo é🚀", + [ + ["0xf6a6eda8895b61d1f31666d33a67c4149f034dff5becb37c29a8"], + [ + [ + "0x0c847b6BAEc673F9589bFb3fabc98F6e1528bd64", + "0xaafc73f5c8c5768ea720", + [ + "0x3bef3ff4511334eaff1ed84e9a8d1e82b1c3684abd026524", + [ + "24607535201678916201050698634880289647537422983556649388218167511173562850304", + "81972837835788828705103392840108708057772341177229323827543342192841539225697", + "58378743444386562888477130415325848584338368793290400661916654532297228950613" + ], + [ + false, + [ + "Moo é🚀 🚀oooMoo o oMo MooM é🚀oo🚀é🚀o ééé🚀Mo🚀o Mooéé M🚀 ", + ["0x446a4969c1663A24516c72907Ccd8C5911C97039"] + ], + "Moo é🚀MMo 🚀éo🚀éM🚀 M", + "0x4AE9356B82B1A62d299c909417D4eAb9bFCbdF05", + "Moo é🚀é o oooéM o o o🚀oooéo🚀oMo" + ] + ], + false, + "Moo é🚀" + ], + [ + "0xde3Ac83c9452708159D383D23764423d7E0eaD99", + "0x1e02622e6390be9b7be4", + [ + "0xf752cca8f91a2612bbd4ce3a2aff3b282f0f440aa0fbb697", + [ + "70930780465373985931377451328516251316675573976826907720586119233112870519143", + "41157697918880313273063964244577739342008280988357786627971632771490057183766", + "23101050293274233770460807469475357545923971729533207878198168984220049534309" + ], + [ + false, + [ + "Moo é🚀oo🚀oMM🚀é oMoo 🚀🚀Mo🚀oM🚀🚀 oéo🚀ooo🚀🚀oéo", + ["0x754ab0f13712755520Be4429864754C2cbA97D19"] + ], + "Moo é🚀ooo 🚀 é🚀M🚀Méo🚀o🚀🚀ééoo🚀M oM🚀oM🚀ooM 🚀MoMéé🚀Mo M Mé MooMoo", + "0x5909C1B38CE819A8fb83f6c317fb372E38267DBE", + "Moo é🚀M M" + ] + ], + true, + "Moo é🚀" + ] + ], + true + ], + "Moo é🚀oMMooooMo🚀🚀oo oo🚀 éMéoMooéMMo🚀🚀o o" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀oM oéM🚀Méoo🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf6a6eda8895b61d1f31666d33a67c4149f034dff5becb37c29a8" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0c847b6BAEc673F9589bFb3fabc98F6e1528bd64" + }, + { + "type": "hexstring", + "value": "0xaafc73f5c8c5768ea720" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3bef3ff4511334eaff1ed84e9a8d1e82b1c3684abd026524" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "24607535201678916201050698634880289647537422983556649388218167511173562850304" + }, + { + "type": "number", + "value": "81972837835788828705103392840108708057772341177229323827543342192841539225697" + }, + { + "type": "number", + "value": "58378743444386562888477130415325848584338368793290400661916654532297228950613" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀oooMoo o oMo MooM é🚀oo🚀é🚀o ééé🚀Mo🚀o Mooéé M🚀 " + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x446a4969c1663A24516c72907Ccd8C5911C97039" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MMo 🚀éo🚀éM🚀 M" + }, + { + "type": "address", + "value": "0x4AE9356B82B1A62d299c909417D4eAb9bFCbdF05" + }, + { + "type": "string", + "value": "Moo é🚀é o oooéM o o o🚀oooéo🚀oMo" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xde3Ac83c9452708159D383D23764423d7E0eaD99" + }, + { + "type": "hexstring", + "value": "0x1e02622e6390be9b7be4" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf752cca8f91a2612bbd4ce3a2aff3b282f0f440aa0fbb697" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "70930780465373985931377451328516251316675573976826907720586119233112870519143" + }, + { + "type": "number", + "value": "41157697918880313273063964244577739342008280988357786627971632771490057183766" + }, + { + "type": "number", + "value": "23101050293274233770460807469475357545923971729533207878198168984220049534309" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀oMM🚀é oMoo 🚀🚀Mo🚀oM🚀🚀 oéo🚀ooo🚀🚀oéo" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x754ab0f13712755520Be4429864754C2cbA97D19" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooo 🚀 é🚀M🚀Méo🚀o🚀🚀ééoo🚀M oM🚀oM🚀ooM 🚀MoMéé🚀Mo M Mé MooMoo" + }, + { + "type": "address", + "value": "0x5909C1B38CE819A8fb83f6c317fb372E38267DBE" + }, + { + "type": "string", + "value": "Moo é🚀M M" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMMooooMo🚀🚀oo oo🚀 éMéoMooéMMo🚀🚀o o" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610acc806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061069f565b60405180910390f35b6100566104e1565b61005e6104e1565b6000604051806060016040528060268152602001610a006026913982525060408051808201909152600a8152689adede418753e13f3560b71b6020808301919091528201526100ab61050f565b60408051602081019091527ff6a6eda8895b61d1f31666d33a67c4149f034dff5becb37c29a8000000000000815281526100e361053e565b6100eb61056b565b730c847b6baec673f9589bfb3fabc98f6e1528bd648152690557e39fae462bb4753960b51b602082015261011d61059e565b7f3bef3ff4511334eaff1ed84e9a8d1e82b1c3684abd026524000000000000000081526101486105cb565b7f36675f113bb60ea4ddfd04422908bd7579fc3ea8842bce8f49f869251ac75c0081527fb53afb66e5ea34ca036f8f4c55b2fe3d1eb7cb8d687ea2d5d3d7a42fb39c88616020808301919091527f811132a68880db2766e66e6a71396f2b3b9c16257f7eb840df86d0cd734a1c5560408301528201526101c66105e9565b600081526101d261061e565b60006040518060800160405280605781526020016109a9605791398252506101f8610634565b73446a4969c1663a24516c72907ccd8c5911c9703981526020828101919091528281019190915260408051606081019091526022808252600092610a7590830139604080840191909152734ae9356b82b1a62d299c909417d4eab9bfcbdf056060808501919091528151908101909152602d808252600092506108d360208301396080838101919091526040848101939093528483019390935250600060608401528051808201909152600a8152689adede418753e13f3560b71b60208201529082015281526102c661056b565b73de3ac83c9452708159d383d23764423d7e0ead998152690780988b98e42fa6def960b21b60208201526102f861059e565b7ff752cca8f91a2612bbd4ce3a2aff3b282f0f440aa0fbb697000000000000000081526103236105cb565b7f9cd16627c0930dbc1e32d629fe886734a32fdabc311bdad8ab6c6bb5b204816781527f5afe6e76b03ebea5e89e3cbf01006de8effc0067d7b0a3b108a1c664550662166020808301919091527f3312bb2a59fd607fc13406136aa8f7be0df97282b7aa08a32972a0f82fcaed6560408301528201526103a16105e9565b600081526103ad61061e565b60006040518060800160405280604f8152602001610a26604f91398252506103d3610634565b73754ab0f13712755520be4429864754c2cba97d198152602082810191909152828101919091526040805160a08101909152606b80825260009261093e90830139604083810191909152735909c1b38ce819a8fb83f6c317fb372e38267dbe60608085019190915281518083018352600d81526c4d6f6f20c3a9f09f9a804d204d60981b6020808301919091526080808701929092528684019590955286830195909552600186820181905282518084018452600a8152689adede418753e13f3560b71b818701529587019590955286840195909552868301959095525084840191909152848301939093528151908101909152603e80825260009261090090830139606083015250919050565b6040518060800160405280606081526020016060815260200161050261050f565b8152602001606081525090565b604080516080810190915260006060820190815281526020810161053161053e565b8152600060209091015290565b60405180604001604052806002905b61055561056b565b81526020019060019003908161054d5790505090565b6040805160a0810182526000808252602082015290810161058a61059e565b815260006020820152606060409091015290565b604080516060810190915260008152602081016105b96105cb565b81526020016105c66105e9565b905290565b60405180606001604052806003906020820280368337509192915050565b6040518060a0016040528060001515815260200161060561061e565b8152606060208201819052600060408301529081015290565b6040518060400160405280606081526020016105c65b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156106785760208185018101518683018201520161065c565b8181111561068a576000602083870101525b50601f01601f19169290920160200192915050565b6000602080835283516080828501526106bb60a0850182610652565b905081850151601f1960408187850301818801526106d98484610652565b9350808801519250818785030160608801526060840165ffffffffffff19845151168552858401516060878701528182905060a08701925060005b600281101561089d57878403605f19018252825180516001600160a01b0390811686528a8201516001600160b01b0319168b8701528682015160a0888801819052815167ffffffffffffffff191690880152808c015160c0880160005b600381101561078e5782518252918e0191908e0190600101610771565b50505087810151905060a0610120880152805115156101408801528b81015160a06101608901528051896101e08a01526107cc6102208a0182610652565b918e0151919050610200890160005b60018110156107fa57835186168252928f0192908f01906001016107db565b505089830151935061013f19915081898203016101808a015261081d8185610652565b935050606082015161083b6101a08a01826001600160a01b03169052565b506080820151915080888403016101c0890152506108598282610652565b915050606082015161086f606088018215159052565b506080820151915085810360808701526108898183610652565b955050509188019190880190600101610714565b505050818401511515858301526060890151888203840160808a015295506108c58187610652565b999850505050505050505056fe4d6f6f20c3a9f09f9a80c3a9206f20206f6f6fc3a94d206f206f206ff09f9a806f6f6fc3a96ff09f9a806f4d6f4d6f6f20c3a9f09f9a806f4d4d6f6f6f6f4d6ff09f9a80f09f9a806f6f206f6ff09f9a8020c3a94dc3a96f4d6f6fc3a94d4d6ff09f9a80f09f9a806f206f4d6f6f20c3a9f09f9a806f6f6f20f09f9a8020c3a9f09f9a804df09f9a804dc3a96ff09f9a806ff09f9a80f09f9a80c3a9c3a96f6ff09f9a804d20206f4df09f9a806f4df09f9a806f6f4d20f09f9a804d6f4dc3a9c3a9f09f9a804d6f204d20204dc3a9204d6f6f4d6f6f4d6f6f20c3a9f09f9a8020f09f9a806f6f6f4d6f6f206f206f4d6f2020204d6f6f4d20c3a9f09f9a806f6ff09f9a80c3a9f09f9a806f20c3a9c3a9c3a9f09f9a804d6ff09f9a806f204d6f6fc3a9c3a9204df09f9a80204d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4d206fc3a94df09f9a804dc3a96f6ff09f9a804d6f6f20c3a9f09f9a806f6ff09f9a806f4d4df09f9a80c3a9206f4d6f6f20f09f9a80f09f9a804d6ff09f9a806f4df09f9a80f09f9a80206fc3a96ff09f9a806f6f6ff09f9a80f09f9a806fc3a96f4d6f6f20c3a9f09f9a804d4d6f20f09f9a80c3a96ff09f9a80c3a94df09f9a80204da2646970667358221220dc860a7096d37cc7f1f58a81f44112cd2dc7b86a8df59472f9767bc4704bb47064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_da4d5856 {\n bytes26 s_0;\n }\n\n struct S_ab97f69c {\n string s_0;\n address[1] s_1;\n }\n\n struct S_1d1481e8 {\n bool s_0;\n S_ab97f69c s_1;\n string s_2;\n address s_3;\n string s_4;\n }\n\n struct S_ab615d82 {\n bytes24 s_0;\n uint256[3] s_1;\n S_1d1481e8 s_2;\n }\n\n struct S_6c82fdcb {\n address s_0;\n bytes10 s_1;\n S_ab615d82 s_2;\n bool s_3;\n string s_4;\n }\n\n struct S_d581539c {\n S_da4d5856 s_0;\n S_6c82fdcb[2] s_1;\n bool s_2;\n }\n\n struct S_dc8181f2 {\n string s_0;\n string s_1;\n S_d581539c s_2;\n string s_3;\n }\n\n function test () public pure returns (S_dc8181f2 memory) {\n S_dc8181f2 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀🚀🚀oM oéM🚀Méoo🚀\";\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n S_d581539c memory r_2;\n {\n S_da4d5856 memory r_2_0;\n {\n bytes26 r_2_0_0 = bytes26(0xf6a6eda8895b61d1f31666d33a67c4149f034dff5becb37c29a8);\n r_2_0.s_0 = r_2_0_0;\n }\n r_2.s_0 = r_2_0;\n }\n {\n S_6c82fdcb[2] memory r_2_1;\n {\n S_6c82fdcb memory r_2_1_0;\n {\n address r_2_1_0_0 = 0x0c847b6BAEc673F9589bFb3fabc98F6e1528bd64;\n r_2_1_0.s_0 = r_2_1_0_0;\n }\n {\n bytes10 r_2_1_0_1 = bytes10(0xaafc73f5c8c5768ea720);\n r_2_1_0.s_1 = r_2_1_0_1;\n }\n {\n S_ab615d82 memory r_2_1_0_2;\n {\n bytes24 r_2_1_0_2_0 = bytes24(0x3bef3ff4511334eaff1ed84e9a8d1e82b1c3684abd026524);\n r_2_1_0_2.s_0 = r_2_1_0_2_0;\n }\n {\n uint256[3] memory r_2_1_0_2_1;\n {\n uint256 r_2_1_0_2_1_0 = 24607535201678916201050698634880289647537422983556649388218167511173562850304;\n r_2_1_0_2_1[0] = r_2_1_0_2_1_0;\n }\n {\n uint256 r_2_1_0_2_1_1 = 81972837835788828705103392840108708057772341177229323827543342192841539225697;\n r_2_1_0_2_1[1] = r_2_1_0_2_1_1;\n }\n {\n uint256 r_2_1_0_2_1_2 = 58378743444386562888477130415325848584338368793290400661916654532297228950613;\n r_2_1_0_2_1[2] = r_2_1_0_2_1_2;\n }\n r_2_1_0_2.s_1 = r_2_1_0_2_1;\n }\n {\n S_1d1481e8 memory r_2_1_0_2_2;\n {\n bool r_2_1_0_2_2_0 = false;\n r_2_1_0_2_2.s_0 = r_2_1_0_2_2_0;\n }\n {\n S_ab97f69c memory r_2_1_0_2_2_1;\n {\n string memory r_2_1_0_2_2_1_0 = unicode\"Moo é🚀 🚀oooMoo o oMo MooM é🚀oo🚀é🚀o ééé🚀Mo🚀o Mooéé M🚀 \";\n r_2_1_0_2_2_1.s_0 = r_2_1_0_2_2_1_0;\n }\n {\n address[1] memory r_2_1_0_2_2_1_1;\n {\n address r_2_1_0_2_2_1_1_0 = 0x446a4969c1663A24516c72907Ccd8C5911C97039;\n r_2_1_0_2_2_1_1[0] = r_2_1_0_2_2_1_1_0;\n }\n r_2_1_0_2_2_1.s_1 = r_2_1_0_2_2_1_1;\n }\n r_2_1_0_2_2.s_1 = r_2_1_0_2_2_1;\n }\n {\n string memory r_2_1_0_2_2_2 = unicode\"Moo é🚀MMo 🚀éo🚀éM🚀 M\";\n r_2_1_0_2_2.s_2 = r_2_1_0_2_2_2;\n }\n {\n address r_2_1_0_2_2_3 = 0x4AE9356B82B1A62d299c909417D4eAb9bFCbdF05;\n r_2_1_0_2_2.s_3 = r_2_1_0_2_2_3;\n }\n {\n string memory r_2_1_0_2_2_4 = unicode\"Moo é🚀é o oooéM o o o🚀oooéo🚀oMo\";\n r_2_1_0_2_2.s_4 = r_2_1_0_2_2_4;\n }\n r_2_1_0_2.s_2 = r_2_1_0_2_2;\n }\n r_2_1_0.s_2 = r_2_1_0_2;\n }\n {\n bool r_2_1_0_3 = false;\n r_2_1_0.s_3 = r_2_1_0_3;\n }\n {\n string memory r_2_1_0_4 = unicode\"Moo é🚀\";\n r_2_1_0.s_4 = r_2_1_0_4;\n }\n r_2_1[0] = r_2_1_0;\n }\n {\n S_6c82fdcb memory r_2_1_1;\n {\n address r_2_1_1_0 = 0xde3Ac83c9452708159D383D23764423d7E0eaD99;\n r_2_1_1.s_0 = r_2_1_1_0;\n }\n {\n bytes10 r_2_1_1_1 = bytes10(0x1e02622e6390be9b7be4);\n r_2_1_1.s_1 = r_2_1_1_1;\n }\n {\n S_ab615d82 memory r_2_1_1_2;\n {\n bytes24 r_2_1_1_2_0 = bytes24(0xf752cca8f91a2612bbd4ce3a2aff3b282f0f440aa0fbb697);\n r_2_1_1_2.s_0 = r_2_1_1_2_0;\n }\n {\n uint256[3] memory r_2_1_1_2_1;\n {\n uint256 r_2_1_1_2_1_0 = 70930780465373985931377451328516251316675573976826907720586119233112870519143;\n r_2_1_1_2_1[0] = r_2_1_1_2_1_0;\n }\n {\n uint256 r_2_1_1_2_1_1 = 41157697918880313273063964244577739342008280988357786627971632771490057183766;\n r_2_1_1_2_1[1] = r_2_1_1_2_1_1;\n }\n {\n uint256 r_2_1_1_2_1_2 = 23101050293274233770460807469475357545923971729533207878198168984220049534309;\n r_2_1_1_2_1[2] = r_2_1_1_2_1_2;\n }\n r_2_1_1_2.s_1 = r_2_1_1_2_1;\n }\n {\n S_1d1481e8 memory r_2_1_1_2_2;\n {\n bool r_2_1_1_2_2_0 = false;\n r_2_1_1_2_2.s_0 = r_2_1_1_2_2_0;\n }\n {\n S_ab97f69c memory r_2_1_1_2_2_1;\n {\n string memory r_2_1_1_2_2_1_0 = unicode\"Moo é🚀oo🚀oMM🚀é oMoo 🚀🚀Mo🚀oM🚀🚀 oéo🚀ooo🚀🚀oéo\";\n r_2_1_1_2_2_1.s_0 = r_2_1_1_2_2_1_0;\n }\n {\n address[1] memory r_2_1_1_2_2_1_1;\n {\n address r_2_1_1_2_2_1_1_0 = 0x754ab0f13712755520Be4429864754C2cbA97D19;\n r_2_1_1_2_2_1_1[0] = r_2_1_1_2_2_1_1_0;\n }\n r_2_1_1_2_2_1.s_1 = r_2_1_1_2_2_1_1;\n }\n r_2_1_1_2_2.s_1 = r_2_1_1_2_2_1;\n }\n {\n string memory r_2_1_1_2_2_2 = unicode\"Moo é🚀ooo 🚀 é🚀M🚀Méo🚀o🚀🚀ééoo🚀M oM🚀oM🚀ooM 🚀MoMéé🚀Mo M Mé MooMoo\";\n r_2_1_1_2_2.s_2 = r_2_1_1_2_2_2;\n }\n {\n address r_2_1_1_2_2_3 = 0x5909C1B38CE819A8fb83f6c317fb372E38267DBE;\n r_2_1_1_2_2.s_3 = r_2_1_1_2_2_3;\n }\n {\n string memory r_2_1_1_2_2_4 = unicode\"Moo é🚀M M\";\n r_2_1_1_2_2.s_4 = r_2_1_1_2_2_4;\n }\n r_2_1_1_2.s_2 = r_2_1_1_2_2;\n }\n r_2_1_1.s_2 = r_2_1_1_2;\n }\n {\n bool r_2_1_1_3 = true;\n r_2_1_1.s_3 = r_2_1_1_3;\n }\n {\n string memory r_2_1_1_4 = unicode\"Moo é🚀\";\n r_2_1_1.s_4 = r_2_1_1_4;\n }\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n bool r_2_2 = true;\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀oMMooooMo🚀🚀oo oo🚀 éMéoMooéMMo🚀🚀o o\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4d206fc3a94df09f9a804dc3a96f6ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000f6a6eda8895b61d1f31666d33a67c4149f034dff5becb37c29a800000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000c847b6baec673f9589bfb3fabc98f6e1528bd64aafc73f5c8c5768ea7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003603bef3ff4511334eaff1ed84e9a8d1e82b1c3684abd026524000000000000000036675f113bb60ea4ddfd04422908bd7579fc3ea8842bce8f49f869251ac75c00b53afb66e5ea34ca036f8f4c55b2fe3d1eb7cb8d687ea2d5d3d7a42fb39c8861811132a68880db2766e66e6a71396f2b3b9c16257f7eb840df86d0cd734a1c5500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001600000000000000000000000004ae9356b82b1a62d299c909417d4eab9bfcbdf0500000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000446a4969c1663a24516c72907ccd8c5911c9703900000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a8020f09f9a806f6f6f4d6f6f206f206f4d6f2020204d6f6f4d20c3a9f09f9a806f6ff09f9a80c3a9f09f9a806f20c3a9c3a9c3a9f09f9a804d6ff09f9a806f204d6f6fc3a9c3a9204df09f9a802000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a804d4d6f20f09f9a80c3a96ff09f9a80c3a94df09f9a80204d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80c3a9206f20206f6f6fc3a94d206f206f206ff09f9a806f6f6fc3a96ff09f9a806f4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000de3ac83c9452708159d383d23764423d7e0ead991e02622e6390be9b7be40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000380f752cca8f91a2612bbd4ce3a2aff3b282f0f440aa0fbb69700000000000000009cd16627c0930dbc1e32d629fe886734a32fdabc311bdad8ab6c6bb5b20481675afe6e76b03ebea5e89e3cbf01006de8effc0067d7b0a3b108a1c664550662163312bb2a59fd607fc13406136aa8f7be0df97282b7aa08a32972a0f82fcaed6500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001600000000000000000000000005909c1b38ce819a8fb83f6c317fb372e38267dbe00000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000754ab0f13712755520be4429864754c2cba97d19000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a806f6ff09f9a806f4d4df09f9a80c3a9206f4d6f6f20f09f9a80f09f9a804d6ff09f9a806f4df09f9a80f09f9a80206fc3a96ff09f9a806f6f6ff09f9a80f09f9a806fc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b4d6f6f20c3a9f09f9a806f6f6f20f09f9a8020c3a9f09f9a804df09f9a804dc3a96ff09f9a806ff09f9a80f09f9a80c3a9c3a96f6ff09f9a804d20206f4df09f9a806f4df09f9a806f6f4d20f09f9a804d6f4dc3a9c3a9f09f9a804d6f204d20204dc3a9204d6f6f4d6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a804d204d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a806f4d4d6f6f6f6f4d6ff09f9a80f09f9a806f6f206f6ff09f9a8020c3a94dc3a96f4d6f6fc3a94d4d6ff09f9a80f09f9a806f206f0000" + }, + { + "name": "random-(string[],bytes32,string,(bytes9,string),(string[3],(bool,int,address),int168[4],(bytes10,uint160,string,string[3],bool),address))", + "type": "(string[],bytes32,string,(bytes9,string),(string[3],(bool,int,address),int168[4],(bytes10,uint160,string,string[3],bool),address))", + "value": [ + [ + "Moo é🚀🚀éM oo🚀🚀oé ooééM oMé M oo🚀é🚀é🚀éM Méoé oMé Mo oo M", + "Moo é🚀o🚀🚀é🚀 M M🚀éMoé🚀éMMM🚀🚀 🚀 éMoéooo🚀🚀oooé🚀ooo é", + "Moo é🚀🚀M Méé🚀M🚀o🚀ooMooooé" + ], + "0x35b58bc6b2e86a149137011d9e79f67ccf910408cf850eb60c967fc151e66507", + "Moo é🚀", + ["0x1ab9e6de4300b3e710", "Moo é🚀"], + [ + ["Moo é🚀oooéo🚀🚀ééo", "Moo é🚀o🚀ooM🚀 ooo éoéoMoéé o é🚀éo oMé", "Moo é🚀"], + [ + true, + "-52343328100017934614010995073651536382019702561228134622071359108840623668748", + "0xC798Ed1e821FB8f23B25aE912158F45F9D5f46e4" + ], + [ + "-173666669972844002299230817627983981568935346646981", + "117431028151454856015126677031743287486687349902616", + "103436833516638214675123097022239786901995220917460", + "173248718569683442958681505682999101287603201186975" + ], + [ + "0xebe2dd840f9df83f1f72", + "1187798663603825457181228610184939028777684659873", + "Moo é🚀oo MoM🚀Moo🚀o 🚀 M🚀Mo oéoooé 🚀é oo", + [ + "Moo é🚀🚀🚀éo🚀é🚀éo oM🚀🚀🚀 🚀ooMéoo🚀é éooM🚀éM🚀oéM🚀🚀 🚀🚀Moéo🚀éo o🚀o ", + "Moo é🚀🚀oéé o é Mo🚀é", + "Moo é🚀oé oé éoM🚀M é🚀" + ], + false + ], + "0x172fC64837f4dE7271f06D6b2880485B817eb42f" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éM oo🚀🚀oé ooééM oMé M oo🚀é🚀é🚀éM Méoé oMé Mo oo M" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀é🚀 M M🚀éMoé🚀éMMM🚀🚀 🚀 éMoéooo🚀🚀oooé🚀ooo é" + }, + { + "type": "string", + "value": "Moo é🚀🚀M Méé🚀M🚀o🚀ooMooooé" + } + ] + }, + { + "type": "hexstring", + "value": "0x35b58bc6b2e86a149137011d9e79f67ccf910408cf850eb60c967fc151e66507" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x1ab9e6de4300b3e710" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooéo🚀🚀ééo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀ooM🚀 ooo éoéoMoéé o é🚀éo oMé" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-52343328100017934614010995073651536382019702561228134622071359108840623668748" + }, + { + "type": "address", + "value": "0xC798Ed1e821FB8f23B25aE912158F45F9D5f46e4" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-173666669972844002299230817627983981568935346646981" + }, + { + "type": "number", + "value": "117431028151454856015126677031743287486687349902616" + }, + { + "type": "number", + "value": "103436833516638214675123097022239786901995220917460" + }, + { + "type": "number", + "value": "173248718569683442958681505682999101287603201186975" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xebe2dd840f9df83f1f72" + }, + { + "type": "number", + "value": "1187798663603825457181228610184939028777684659873" + }, + { + "type": "string", + "value": "Moo é🚀oo MoM🚀Moo🚀o 🚀 M🚀Mo oéoooé 🚀é oo" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀éo🚀é🚀éo oM🚀🚀🚀 🚀ooMéoo🚀é éooM🚀éM🚀oéM🚀🚀 🚀🚀Moéo🚀éo o🚀o " + }, + { + "type": "string", + "value": "Moo é🚀🚀oéé o é Mo🚀é" + }, + { + "type": "string", + "value": "Moo é🚀oé oé éoM🚀M é🚀" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x172fC64837f4dE7271f06D6b2880485B817eb42f" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610a72806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061073c565b60405180910390f35b610056610432565b61005e610432565b60408051600380825260808201909252600091816020015b6060815260200190600190039081610076579050509050600060405180608001604052806059815260200161093b60599139905080826000815181106100be576100be61080b565b60200260200101819052505060006040518060800160405280605f8152602001610822605f9139905080826001815181106100fb576100fb61080b565b60200260200101819052505060006040518060600160405280602c81526020016109b6602c9139905080826002815181106101385761013861080b565b602090810291909101810191909152918352507f35b58bc6b2e86a149137011d9e79f67ccf910408cf850eb60c967fc151e6650782820152604080518082018252600a808252689adede418753e13f3560b71b828501819052838601929092528251808401845260608186018181526801ab9e6de4300b3e7160bc1b835285518087019096529285529484019290925291909152908201526101d861048e565b6101e06104e8565b604080518082018252601d81527f4d6f6f20c3a9f09f9a806f6f6fc3a96ff09f9a80f09f9a80c3a9c3a96f0000006020808301919091529083528151606081019092526039808352600092916109e290830139602083810191909152604080518082018252600a8152689adede418753e13f3560b71b81840152818501529284528251606081018452600181527f8c46b9e6a3bf4699bcccf04fcc1f50cf2dbc63730645d744fb6fae40037081f48183015273c798ed1e821fb8f23b25ae912158f45f9d5f46e493810193909352830191909152506102bd61050f565b7476d3dad061fde532422672592d9e541dbb05c12fc41981527450597d6bd43871df5d898f5a42f9387e6df2c10d1860208201527446c63c07e06259083c957c89bf9a5cfa1cab4c5cd460408083019190915274768aa53992a876df4416d33617d12ebf9667711c9f606083015282015261033661052d565b6975f16ec207cefc1f8fb960b11b815273d00ebbf3738edceb905a9b4e66e30d992ce36ea16020808301919091526040805160608101909152603c8082526000926108ff9083013960408301525061038c6104e8565b60006040518060a00160405280607e8152602001610881607e9139825250604080516060810190915260228082526000919061099460208301399050808260016020020181905250506000604051806060016040528060228152602001610a1b6022913960408301525060608281019190915260006080808401919091529083019190915273172fc64837f4de7271f06d6b2880485b817eb42f82820152820152919050565b6040518060a0016040528060608152602001600080191681526020016060815260200161047c604051806040016040528060006001600160b81b0319168152602001606081525090565b815260200161048961048e565b905290565b6040518060a001604052806104a16104e8565b815260408051606081018252600080825260208281018290529282015291019081526020016104ce61050f565b81526020016104db61052d565b8152600060209091015290565b60405180606001604052806003905b60608152602001906001900390816104f75790505090565b60405180608001604052806004906020820280368337509192915050565b6040805160a0810182526000808252602082015260609181018290529081016104db6104e8565b6000815180845260005b8181101561057a5760208185018101518683018201520161055e565b8181111561058c576000602083870101525b50601f01601f19169290920160200192915050565b68ffffffffffffffffff60b81b815116825260006020820151604060208501526105ce6040850182610554565b949350505050565b600082606081018360005b60038110156106105783830387526105fa838351610554565b60209788019790935091909101906001016105e1565b509095945050505050565b80516001600160b01b03191682526020808201516001600160a01b03169083015260408082015160a091840182905260009161065990850182610554565b90506060830151848203606086015261067282826105d6565b9150506080830151151560808501528091505092915050565b600061014082518185526106a1828601826105d6565b915050602080840151805115158287015281810151604087015260018060a01b0360408201511660608701525060408401516080860160005b60048110156106fa57825160140b825291830191908301906001016106da565b505050506060830151848203610100860152610716828261061b565b91505060808301516107346101208601826001600160a01b03169052565b509392505050565b6000602080835260c08301845160a08386015281815180845260e08701915060e08160051b8801019350848301925060005b8181101561079c5760df1988860301835261078a858551610554565b9450928501929185019160010161076e565b5050505081850151604085015260408501519150601f19808583030160608601526107c78284610554565b925060608601519150808584030160808601526107e483836105a1565b925060808601519150808584030160a086015250610802828261068b565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80c3a9f09f9a80204d204df09f9a80c3a94d6fc3a9f09f9a80c3a94d4d4df09f9a80f09f9a8020f09f9a8020c3a94d6fc3a96f6f6ff09f9a80f09f9a806f6f6fc3a9f09f9a806f6f6f2020c3a94d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a96ff09f9a80c3a9f09f9a80c3a96f20206f4df09f9a80f09f9a80f09f9a8020f09f9a806f6f4dc3a96f6ff09f9a80c3a920c3a96f6f4df09f9a80c3a94df09f9a806fc3a94df09f9a80f09f9a8020f09f9a80f09f9a804d6fc3a96ff09f9a80c3a96f206ff09f9a806f204d6f6f20c3a9f09f9a806f6f204d6f4df09f9a804d6f6ff09f9a806f20f09f9a80204df09f9a804d6f206fc3a96f6f6fc3a920f09f9a80c3a9206f6f4d6f6f20c3a9f09f9a80f09f9a80c3a94d206f6ff09f9a80f09f9a806fc3a9206f6fc3a9c3a94d206f4dc3a9204d206f6ff09f9a80c3a9f09f9a80c3a9f09f9a80c3a94d204dc3a96fc3a9206f4dc3a9204d6f206f6f20204d4d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a9206f20c3a920204d6ff09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a804d204dc3a9c3a9f09f9a804df09f9a806ff09f9a806f6f4d6f6f6f6fc3a94d6f6f20c3a9f09f9a806ff09f9a806f6f4df09f9a8020206f6f6f20c3a96fc3a96f4d6fc3a9c3a9206f20c3a9f09f9a80c3a96f206f4dc3a94d6f6f20c3a9f09f9a806fc3a9206fc3a920c3a96f4df09f9a804d20c3a9f09f9a80a26469706673582212200596b82b84192c0f644f46052dd1fac0f770a513c41d5c967095ade8a55da6ba64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_64dabfbe {\n bytes9 s_0;\n string s_1;\n }\n\n struct S_1aa26cc8 {\n bool s_0;\n int256 s_1;\n address s_2;\n }\n\n struct S_e37753f8 {\n bytes10 s_0;\n uint160 s_1;\n string s_2;\n string[3] s_3;\n bool s_4;\n }\n\n struct S_cc0bd079 {\n string[3] s_0;\n S_1aa26cc8 s_1;\n int168[4] s_2;\n S_e37753f8 s_3;\n address s_4;\n }\n\n struct S_a29b54bc {\n string[] s_0;\n bytes32 s_1;\n string s_2;\n S_64dabfbe s_3;\n S_cc0bd079 s_4;\n }\n\n function test () public pure returns (S_a29b54bc memory) {\n S_a29b54bc memory r;\n {\n string[] memory r_0 = new string[](3);\n {\n string memory r_0_0 = unicode\"Moo é🚀🚀éM oo🚀🚀oé ooééM oMé M oo🚀é🚀é🚀éM Méoé oMé Mo oo M\";\n r_0[0] = r_0_0;\n }\n {\n string memory r_0_1 = unicode\"Moo é🚀o🚀🚀é🚀 M M🚀éMoé🚀éMMM🚀🚀 🚀 éMoéooo🚀🚀oooé🚀ooo é\";\n r_0[1] = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀🚀M Méé🚀M🚀o🚀ooMooooé\";\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n bytes32 r_1 = bytes32(0x35b58bc6b2e86a149137011d9e79f67ccf910408cf850eb60c967fc151e66507);\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀\";\n r.s_2 = r_2;\n }\n {\n S_64dabfbe memory r_3;\n {\n bytes9 r_3_0 = bytes9(0x1ab9e6de4300b3e710);\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀\";\n r_3.s_1 = r_3_1;\n }\n r.s_3 = r_3;\n }\n {\n S_cc0bd079 memory r_4;\n {\n string[3] memory r_4_0;\n {\n string memory r_4_0_0 = unicode\"Moo é🚀oooéo🚀🚀ééo\";\n r_4_0[0] = r_4_0_0;\n }\n {\n string memory r_4_0_1 = unicode\"Moo é🚀o🚀ooM🚀 ooo éoéoMoéé o é🚀éo oMé\";\n r_4_0[1] = r_4_0_1;\n }\n {\n string memory r_4_0_2 = unicode\"Moo é🚀\";\n r_4_0[2] = r_4_0_2;\n }\n r_4.s_0 = r_4_0;\n }\n {\n S_1aa26cc8 memory r_4_1;\n {\n bool r_4_1_0 = true;\n r_4_1.s_0 = r_4_1_0;\n }\n {\n int r_4_1_1 = -52343328100017934614010995073651536382019702561228134622071359108840623668748;\n r_4_1.s_1 = r_4_1_1;\n }\n {\n address r_4_1_2 = 0xC798Ed1e821FB8f23B25aE912158F45F9D5f46e4;\n r_4_1.s_2 = r_4_1_2;\n }\n r_4.s_1 = r_4_1;\n }\n {\n int168[4] memory r_4_2;\n {\n int168 r_4_2_0 = -173666669972844002299230817627983981568935346646981;\n r_4_2[0] = r_4_2_0;\n }\n {\n int168 r_4_2_1 = 117431028151454856015126677031743287486687349902616;\n r_4_2[1] = r_4_2_1;\n }\n {\n int168 r_4_2_2 = 103436833516638214675123097022239786901995220917460;\n r_4_2[2] = r_4_2_2;\n }\n {\n int168 r_4_2_3 = 173248718569683442958681505682999101287603201186975;\n r_4_2[3] = r_4_2_3;\n }\n r_4.s_2 = r_4_2;\n }\n {\n S_e37753f8 memory r_4_3;\n {\n bytes10 r_4_3_0 = bytes10(0xebe2dd840f9df83f1f72);\n r_4_3.s_0 = r_4_3_0;\n }\n {\n uint160 r_4_3_1 = 1187798663603825457181228610184939028777684659873;\n r_4_3.s_1 = r_4_3_1;\n }\n {\n string memory r_4_3_2 = unicode\"Moo é🚀oo MoM🚀Moo🚀o 🚀 M🚀Mo oéoooé 🚀é oo\";\n r_4_3.s_2 = r_4_3_2;\n }\n {\n string[3] memory r_4_3_3;\n {\n string memory r_4_3_3_0 = unicode\"Moo é🚀🚀🚀éo🚀é🚀éo oM🚀🚀🚀 🚀ooMéoo🚀é éooM🚀éM🚀oéM🚀🚀 🚀🚀Moéo🚀éo o🚀o \";\n r_4_3_3[0] = r_4_3_3_0;\n }\n {\n string memory r_4_3_3_1 = unicode\"Moo é🚀🚀oéé o é Mo🚀é\";\n r_4_3_3[1] = r_4_3_3_1;\n }\n {\n string memory r_4_3_3_2 = unicode\"Moo é🚀oé oé éoM🚀M é🚀\";\n r_4_3_3[2] = r_4_3_3_2;\n }\n r_4_3.s_3 = r_4_3_3;\n }\n {\n bool r_4_3_4 = false;\n r_4_3.s_4 = r_4_3_4;\n }\n r_4.s_3 = r_4_3;\n }\n {\n address r_4_4 = 0x172fC64837f4dE7271f06D6b2880485B817eb42f;\n r_4.s_4 = r_4_4;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a035b58bc6b2e86a149137011d9e79f67ccf910408cf850eb60c967fc151e66507000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80f09f9a80c3a94d206f6ff09f9a80f09f9a806fc3a9206f6fc3a9c3a94d206f4dc3a9204d206f6ff09f9a80c3a9f09f9a80c3a9f09f9a80c3a94d204dc3a96fc3a9206f4dc3a9204d6f206f6f20204d00000000000000000000000000000000000000000000000000000000000000000000000000005f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80c3a9f09f9a80204d204df09f9a80c3a94d6fc3a9f09f9a80c3a94d4d4df09f9a80f09f9a8020f09f9a8020c3a94d6fc3a96f6f6ff09f9a80f09f9a806f6f6fc3a9f09f9a806f6f6f2020c3a900000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a80f09f9a804d204dc3a9c3a9f09f9a804df09f9a806ff09f9a806f6f4d6f6f6f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000001ab9e6de4300b3e71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000018c46b9e6a3bf4699bcccf04fcc1f50cf2dbc63730645d744fb6fae40037081f4000000000000000000000000c798ed1e821fb8f23b25ae912158f45f9d5f46e4ffffffffffffffffffffff892c252f9e021acdbdd98da6d261abe244fa3ed03b000000000000000000000050597d6bd43871df5d898f5a42f9387e6df2c10d18000000000000000000000046c63c07e06259083c957c89bf9a5cfa1cab4c5cd40000000000000000000000768aa53992a876df4416d33617d12ebf9667711c9f0000000000000000000000000000000000000000000000000000000000000280000000000000000000000000172fc64837f4de7271f06d6b2880485b817eb42f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f6f6fc3a96ff09f9a80f09f9a80c3a9c3a96f00000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806ff09f9a806f6f4df09f9a8020206f6f6f20c3a96fc3a96f4d6fc3a9c3a9206f20c3a9f09f9a80c3a96f206f4dc3a900000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000ebe2dd840f9df83f1f7200000000000000000000000000000000000000000000000000000000000000000000d00ebbf3738edceb905a9b4e66e30d992ce36ea100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806f6f204d6f4df09f9a804d6f6ff09f9a806f20f09f9a80204df09f9a804d6f206fc3a96f6f6fc3a920f09f9a80c3a9206f6f00000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000007e4d6f6f20c3a9f09f9a80f09f9a80f09f9a80c3a96ff09f9a80c3a9f09f9a80c3a96f20206f4df09f9a80f09f9a80f09f9a8020f09f9a806f6f4dc3a96f6ff09f9a80c3a920c3a96f6f4df09f9a80c3a94df09f9a806fc3a94df09f9a80f09f9a8020f09f9a80f09f9a804d6fc3a96ff09f9a80c3a96f206ff09f9a806f20000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a9206f20c3a920204d6ff09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806fc3a9206fc3a920c3a96f4df09f9a804d20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((string,(string,(bool[4][4],int104,address,bool[1][2][])[2],bool,address)),string,(bool[][4],bytes24),address[])", + "type": "((string,(string,(bool[4][4],int104,address,bool[1][2][])[2],bool,address)),string,(bool[][4],bytes24),address[])", + "value": [ + [ + "Moo é🚀éM o MMooo é 🚀M🚀oMoMoéo", + [ + "Moo é🚀ooMMM MoéM🚀🚀MoooM é 🚀Mooéé", + [ + [ + [ + [true, false, false, true], + [false, false, true, true], + [false, false, true, false], + [false, false, true, false] + ], + "6579835414599432878651849958866", + "0xDd735426B9B18FE61F8B3c08F87DfB6869fd6c25", + [] + ], + [ + [ + [true, false, false, true], + [true, true, true, false], + [true, true, true, true], + [false, true, false, false] + ], + "1321381532277498459445726587890", + "0x7E033bAf2b9eaBDf84d3Ee3691dd454A8fe818D7", + [ + [[true], [false]], + [[true], [true]], + [[true], [true]] + ] + ] + ], + false, + "0x70487CE7700bE8A90F859D7bccf4C3F54De1A550" + ] + ], + "Moo é🚀éM", + [ + [ + [true, false, true, true], + [false, false, false, true], + [true, true], + [false, false, false, true] + ], + "0x56f033999a9f113d0543e46d73bdbec4104d1f2d0670557f" + ], + ["0x3e86232a17c3d1ec2f70D54CeE22e5Cc6542f5B4"] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éM o MMooo é 🚀M🚀oMoMoéo" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooMMM MoéM🚀🚀MoooM é 🚀Mooéé" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "number", + "value": "6579835414599432878651849958866" + }, + { + "type": "address", + "value": "0xDd735426B9B18FE61F8B3c08F87DfB6869fd6c25" + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "number", + "value": "1321381532277498459445726587890" + }, + { + "type": "address", + "value": "0x7E033bAf2b9eaBDf84d3Ee3691dd454A8fe818D7" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x70487CE7700bE8A90F859D7bccf4C3F54De1A550" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éM" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x56f033999a9f113d0543e46d73bdbec4104d1f2d0670557f" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3e86232a17c3d1ec2f70D54CeE22e5Cc6542f5B4" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610d76806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610b29565b60405180910390f35b6100566107d1565b61005e6107d1565b610066610805565b60006040518060600160405280602b8152602001610ce4602b913982525061008c610824565b6000604051806060016040528060328152602001610d0f603291398252506100b2610852565b6100ba61087f565b6100c26108ab565b6100ca6108d8565b60018082526000602083018190526040830152606082015281526100ec6108d8565b600080825260208083019190915260016040830181905260608301528201526101136108d8565b6000808252602082018190526001604080840191909152606083019190915282015261013d6108d8565b60008082526020808301829052600160408085019190915260608085018490528501939093529284526c530c9849eb49ca71842f19e5d28484015273dd735426b9b18fe61f8b3c08f87dfb6869fd6c2584830152815181815292830190915290816101be565b6101ab6108f6565b8152602001906001900390816101a35790505b5060608301525081526101cf61087f565b6101d76108ab565b6101df6108d8565b60018082526000602083018190526040830152606082015281526102016108d8565b600180825260208083018290526040830191909152600060608301528201526102286108d8565b6001808252602082018190526040808301829052606083019190915282015261024f6108d8565b60008082526001602080840191909152604080840183905260608085018490528501939093529284526c10ad9d2f6edfda69c21e2cabf292840192909252737e033baf2b9eabdf84d3ee3691dd454a8fe818d783820152805160038082526080820190925290816020015b6102c26108f6565b8152602001906001900390816102ba5790505090506102df6108f6565b6102e7610923565b6001815281526102f5610923565b6000808252602083019190915282518291849161031457610314610ccd565b6020026020010181905250506103286108f6565b610330610923565b60018152815261033e610923565b60018082526020830191909152825182918491811061035f5761035f610ccd565b6020026020010181905250506103736108f6565b61037b610923565b600181528152610389610923565b60018152602082015281518190839060029081106103a9576103a9610ccd565b60209081029190910101525060608201528082600160209081029190910191909152838101929092525060006040808401919091527370487ce7700be8a90f859d7bccf4c3f54de1a5506060840152838201929092529183528051808201909152600d81526c4d6f6f20c3a9f09f9a80c3a94d60981b818301529082015261042f610941565b610437610961565b60408051600480825260a0820190925260009160208201608080368337019050509050600060019050808260008151811061047457610474610ccd565b602002602001019015159081151581525050506000808260018151811061049d5761049d610ccd565b6020026020010190151590811515815250505060006001905080826002815181106104ca576104ca610ccd565b6020026020010190151590811515815250505060006001905080826003815181106104f7576104f7610ccd565b9115156020928302919091019091015250815260408051600480825260a082019092526000918160200160208202803683370190505090506000808260008151811061054557610545610ccd565b602002602001019015159081151581525050506000808260018151811061056e5761056e610ccd565b602002602001019015159081151581525050506000808260028151811061059757610597610ccd565b6020026020010190151590811515815250505060006001905080826003815181106105c4576105c4610ccd565b9115156020928302919091018201528301919091525060408051600280825260608201909252600091816020016020820280368337019050509050600060019050808260008151811061061957610619610ccd565b60200260200101901515908115158152505050600060019050808260018151811061064657610646610ccd565b9115156020928302919091018201526040848101939093528251600480825260a082019094526000939092509082016080803683370190505090506000808260008151811061069757610697610ccd565b60200260200101901515908115158152505050600080826001815181106106c0576106c0610ccd565b60200260200101901515908115158152505050600080826002815181106106e9576106e9610ccd565b60200260200101901515908115158152505050600060019050808260038151811061071657610716610ccd565b9115156020928302919091018201526060840192909252509082527f56f033999a9f113d0543e46d73bdbec4104d1f2d0670557f000000000000000090820152604082810191909152805160018082528183019092526000918160200160208202803683370190505090506000733e86232a17c3d1ec2f70d54cee22e5cc6542f5b4905080826000815181106107ae576107ae610ccd565b6001600160a01b0390921660209283029190910190910152506060820152919050565b60405180608001604052806107e4610805565b8152602001606081526020016107f8610941565b8152602001606081525090565b60405180604001604052806060815260200161081f610824565b905290565b60405180608001604052806060815260200161083e610852565b815260006020820181905260409091015290565b60405180604001604052806002905b61086961087f565b8152602001906001900390816108615790505090565b60405180608001604052806108926108ab565b8152600060208201819052604082015260609081015290565b60405180608001604052806004905b6108c26108d8565b8152602001906001900390816108ba5790505090565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002905b61090d610923565b8152602001906001900390816109055790505090565b60405180602001604052806001906020820280368337509192915050565b6040518060400160405280610954610961565b8152600060209091015290565b60405180608001604052806004905b60608152602001906001900390816109705790505090565b6000815180845260005b818110156109ae57602081850181015186830182015201610992565b818111156109c0576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015610a4e5781518760005b6002811015610a385782518260005b6001811015610a25578251151582529188019190880190600101610a06565b50505091850191908501906001016109f7565b50505060409690960195908201906001016109e9565b509495945050505050565b8051604080845260009160c0850191850183805b6004811015610ac857878503603f19018352835180518087526020918201918088019190855b82811015610ab1578451151584529381019392810192600101610a93565b509197505094850194939093019250600101610a6d565b505050506020830151610ae8602086018267ffffffffffffffff19169052565b509392505050565b600081518084526020808501945080840160005b83811015610a4e5781516001600160a01b031687529582019590820190600101610b04565b600060208083528351608082850152805160408060a0870152610b4f60e0870183610988565b9150838301519250609f198683030160c0870152825160808352610b766080840182610988565b84860151848203858801529091508183810160005b6002811015610c3e578482038352835180518360005b6004811015610be55782518260005b6004811015610bcf57825115158252918f0191908f0190600101610bb0565b505050918c019160809190910190600101610ba1565b50505089810151610bfc610200850182600c0b9052565b50868101516001600160a01b0316610220840152606001516102606102408401819052610c2b908401826109d5565b948a0194938a0193925050600101610b8b565b508685015180151587870152935060608701519650610c6860608701886001600160a01b03169052565b878b01519750601f199650868a820301858b0152610c868189610988565b9750505050508087015191505081858403016060860152610ca78382610a59565b925050606085015181858403016080860152610cc38382610af0565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80c3a94d206f20204d4d6f6f6f20c3a920f09f9a804df09f9a806f4d6f4d6fc3a96f4d6f6f20c3a9f09f9a806f6f4d4d4d20204d6fc3a94df09f9a80f09f9a804d6f6f6f4d20c3a920f09f9a804d6f6fc3a9c3a9a2646970667358221220db091d90849d3dd44bfe42ee9d5d6d7c0bbf1ef10a30f7c184d6a54ac3bc472864736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_ef8f5be7 {\n bool[4][4] s_0;\n int104 s_1;\n address s_2;\n bool[1][2][] s_3;\n }\n\n struct S_53cd2c90 {\n string s_0;\n S_ef8f5be7[2] s_1;\n bool s_2;\n address s_3;\n }\n\n struct S_91dfbffe {\n string s_0;\n S_53cd2c90 s_1;\n }\n\n struct S_e317eeee {\n bool[][4] s_0;\n bytes24 s_1;\n }\n\n struct S_c8a2c6fc {\n S_91dfbffe s_0;\n string s_1;\n S_e317eeee s_2;\n address[] s_3;\n }\n\n function test () public pure returns (S_c8a2c6fc memory) {\n S_c8a2c6fc memory r;\n {\n S_91dfbffe memory r_0;\n {\n string memory r_0_0 = unicode\"Moo é🚀éM o MMooo é 🚀M🚀oMoMoéo\";\n r_0.s_0 = r_0_0;\n }\n {\n S_53cd2c90 memory r_0_1;\n {\n string memory r_0_1_0 = unicode\"Moo é🚀ooMMM MoéM🚀🚀MoooM é 🚀Mooéé\";\n r_0_1.s_0 = r_0_1_0;\n }\n {\n S_ef8f5be7[2] memory r_0_1_1;\n {\n S_ef8f5be7 memory r_0_1_1_0;\n {\n bool[4][4] memory r_0_1_1_0_0;\n {\n bool[4] memory r_0_1_1_0_0_0;\n {\n bool r_0_1_1_0_0_0_0 = true;\n r_0_1_1_0_0_0[0] = r_0_1_1_0_0_0_0;\n }\n {\n bool r_0_1_1_0_0_0_1 = false;\n r_0_1_1_0_0_0[1] = r_0_1_1_0_0_0_1;\n }\n {\n bool r_0_1_1_0_0_0_2 = false;\n r_0_1_1_0_0_0[2] = r_0_1_1_0_0_0_2;\n }\n {\n bool r_0_1_1_0_0_0_3 = true;\n r_0_1_1_0_0_0[3] = r_0_1_1_0_0_0_3;\n }\n r_0_1_1_0_0[0] = r_0_1_1_0_0_0;\n }\n {\n bool[4] memory r_0_1_1_0_0_1;\n {\n bool r_0_1_1_0_0_1_0 = false;\n r_0_1_1_0_0_1[0] = r_0_1_1_0_0_1_0;\n }\n {\n bool r_0_1_1_0_0_1_1 = false;\n r_0_1_1_0_0_1[1] = r_0_1_1_0_0_1_1;\n }\n {\n bool r_0_1_1_0_0_1_2 = true;\n r_0_1_1_0_0_1[2] = r_0_1_1_0_0_1_2;\n }\n {\n bool r_0_1_1_0_0_1_3 = true;\n r_0_1_1_0_0_1[3] = r_0_1_1_0_0_1_3;\n }\n r_0_1_1_0_0[1] = r_0_1_1_0_0_1;\n }\n {\n bool[4] memory r_0_1_1_0_0_2;\n {\n bool r_0_1_1_0_0_2_0 = false;\n r_0_1_1_0_0_2[0] = r_0_1_1_0_0_2_0;\n }\n {\n bool r_0_1_1_0_0_2_1 = false;\n r_0_1_1_0_0_2[1] = r_0_1_1_0_0_2_1;\n }\n {\n bool r_0_1_1_0_0_2_2 = true;\n r_0_1_1_0_0_2[2] = r_0_1_1_0_0_2_2;\n }\n {\n bool r_0_1_1_0_0_2_3 = false;\n r_0_1_1_0_0_2[3] = r_0_1_1_0_0_2_3;\n }\n r_0_1_1_0_0[2] = r_0_1_1_0_0_2;\n }\n {\n bool[4] memory r_0_1_1_0_0_3;\n {\n bool r_0_1_1_0_0_3_0 = false;\n r_0_1_1_0_0_3[0] = r_0_1_1_0_0_3_0;\n }\n {\n bool r_0_1_1_0_0_3_1 = false;\n r_0_1_1_0_0_3[1] = r_0_1_1_0_0_3_1;\n }\n {\n bool r_0_1_1_0_0_3_2 = true;\n r_0_1_1_0_0_3[2] = r_0_1_1_0_0_3_2;\n }\n {\n bool r_0_1_1_0_0_3_3 = false;\n r_0_1_1_0_0_3[3] = r_0_1_1_0_0_3_3;\n }\n r_0_1_1_0_0[3] = r_0_1_1_0_0_3;\n }\n r_0_1_1_0.s_0 = r_0_1_1_0_0;\n }\n {\n int104 r_0_1_1_0_1 = 6579835414599432878651849958866;\n r_0_1_1_0.s_1 = r_0_1_1_0_1;\n }\n {\n address r_0_1_1_0_2 = 0xDd735426B9B18FE61F8B3c08F87DfB6869fd6c25;\n r_0_1_1_0.s_2 = r_0_1_1_0_2;\n }\n {\n bool[1][2][] memory r_0_1_1_0_3 = new bool[1][2][](0);\n r_0_1_1_0.s_3 = r_0_1_1_0_3;\n }\n r_0_1_1[0] = r_0_1_1_0;\n }\n {\n S_ef8f5be7 memory r_0_1_1_1;\n {\n bool[4][4] memory r_0_1_1_1_0;\n {\n bool[4] memory r_0_1_1_1_0_0;\n {\n bool r_0_1_1_1_0_0_0 = true;\n r_0_1_1_1_0_0[0] = r_0_1_1_1_0_0_0;\n }\n {\n bool r_0_1_1_1_0_0_1 = false;\n r_0_1_1_1_0_0[1] = r_0_1_1_1_0_0_1;\n }\n {\n bool r_0_1_1_1_0_0_2 = false;\n r_0_1_1_1_0_0[2] = r_0_1_1_1_0_0_2;\n }\n {\n bool r_0_1_1_1_0_0_3 = true;\n r_0_1_1_1_0_0[3] = r_0_1_1_1_0_0_3;\n }\n r_0_1_1_1_0[0] = r_0_1_1_1_0_0;\n }\n {\n bool[4] memory r_0_1_1_1_0_1;\n {\n bool r_0_1_1_1_0_1_0 = true;\n r_0_1_1_1_0_1[0] = r_0_1_1_1_0_1_0;\n }\n {\n bool r_0_1_1_1_0_1_1 = true;\n r_0_1_1_1_0_1[1] = r_0_1_1_1_0_1_1;\n }\n {\n bool r_0_1_1_1_0_1_2 = true;\n r_0_1_1_1_0_1[2] = r_0_1_1_1_0_1_2;\n }\n {\n bool r_0_1_1_1_0_1_3 = false;\n r_0_1_1_1_0_1[3] = r_0_1_1_1_0_1_3;\n }\n r_0_1_1_1_0[1] = r_0_1_1_1_0_1;\n }\n {\n bool[4] memory r_0_1_1_1_0_2;\n {\n bool r_0_1_1_1_0_2_0 = true;\n r_0_1_1_1_0_2[0] = r_0_1_1_1_0_2_0;\n }\n {\n bool r_0_1_1_1_0_2_1 = true;\n r_0_1_1_1_0_2[1] = r_0_1_1_1_0_2_1;\n }\n {\n bool r_0_1_1_1_0_2_2 = true;\n r_0_1_1_1_0_2[2] = r_0_1_1_1_0_2_2;\n }\n {\n bool r_0_1_1_1_0_2_3 = true;\n r_0_1_1_1_0_2[3] = r_0_1_1_1_0_2_3;\n }\n r_0_1_1_1_0[2] = r_0_1_1_1_0_2;\n }\n {\n bool[4] memory r_0_1_1_1_0_3;\n {\n bool r_0_1_1_1_0_3_0 = false;\n r_0_1_1_1_0_3[0] = r_0_1_1_1_0_3_0;\n }\n {\n bool r_0_1_1_1_0_3_1 = true;\n r_0_1_1_1_0_3[1] = r_0_1_1_1_0_3_1;\n }\n {\n bool r_0_1_1_1_0_3_2 = false;\n r_0_1_1_1_0_3[2] = r_0_1_1_1_0_3_2;\n }\n {\n bool r_0_1_1_1_0_3_3 = false;\n r_0_1_1_1_0_3[3] = r_0_1_1_1_0_3_3;\n }\n r_0_1_1_1_0[3] = r_0_1_1_1_0_3;\n }\n r_0_1_1_1.s_0 = r_0_1_1_1_0;\n }\n {\n int104 r_0_1_1_1_1 = 1321381532277498459445726587890;\n r_0_1_1_1.s_1 = r_0_1_1_1_1;\n }\n {\n address r_0_1_1_1_2 = 0x7E033bAf2b9eaBDf84d3Ee3691dd454A8fe818D7;\n r_0_1_1_1.s_2 = r_0_1_1_1_2;\n }\n {\n bool[1][2][] memory r_0_1_1_1_3 = new bool[1][2][](3);\n {\n bool[1][2] memory r_0_1_1_1_3_0;\n {\n bool[1] memory r_0_1_1_1_3_0_0;\n {\n bool r_0_1_1_1_3_0_0_0 = true;\n r_0_1_1_1_3_0_0[0] = r_0_1_1_1_3_0_0_0;\n }\n r_0_1_1_1_3_0[0] = r_0_1_1_1_3_0_0;\n }\n {\n bool[1] memory r_0_1_1_1_3_0_1;\n {\n bool r_0_1_1_1_3_0_1_0 = false;\n r_0_1_1_1_3_0_1[0] = r_0_1_1_1_3_0_1_0;\n }\n r_0_1_1_1_3_0[1] = r_0_1_1_1_3_0_1;\n }\n r_0_1_1_1_3[0] = r_0_1_1_1_3_0;\n }\n {\n bool[1][2] memory r_0_1_1_1_3_1;\n {\n bool[1] memory r_0_1_1_1_3_1_0;\n {\n bool r_0_1_1_1_3_1_0_0 = true;\n r_0_1_1_1_3_1_0[0] = r_0_1_1_1_3_1_0_0;\n }\n r_0_1_1_1_3_1[0] = r_0_1_1_1_3_1_0;\n }\n {\n bool[1] memory r_0_1_1_1_3_1_1;\n {\n bool r_0_1_1_1_3_1_1_0 = true;\n r_0_1_1_1_3_1_1[0] = r_0_1_1_1_3_1_1_0;\n }\n r_0_1_1_1_3_1[1] = r_0_1_1_1_3_1_1;\n }\n r_0_1_1_1_3[1] = r_0_1_1_1_3_1;\n }\n {\n bool[1][2] memory r_0_1_1_1_3_2;\n {\n bool[1] memory r_0_1_1_1_3_2_0;\n {\n bool r_0_1_1_1_3_2_0_0 = true;\n r_0_1_1_1_3_2_0[0] = r_0_1_1_1_3_2_0_0;\n }\n r_0_1_1_1_3_2[0] = r_0_1_1_1_3_2_0;\n }\n {\n bool[1] memory r_0_1_1_1_3_2_1;\n {\n bool r_0_1_1_1_3_2_1_0 = true;\n r_0_1_1_1_3_2_1[0] = r_0_1_1_1_3_2_1_0;\n }\n r_0_1_1_1_3_2[1] = r_0_1_1_1_3_2_1;\n }\n r_0_1_1_1_3[2] = r_0_1_1_1_3_2;\n }\n r_0_1_1_1.s_3 = r_0_1_1_1_3;\n }\n r_0_1_1[1] = r_0_1_1_1;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n bool r_0_1_2 = false;\n r_0_1.s_2 = r_0_1_2;\n }\n {\n address r_0_1_3 = 0x70487CE7700bE8A90F859D7bccf4C3F54De1A550;\n r_0_1.s_3 = r_0_1_3;\n }\n r_0.s_1 = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀éM\";\n r.s_1 = r_1;\n }\n {\n S_e317eeee memory r_2;\n {\n bool[][4] memory r_2_0;\n {\n bool[] memory r_2_0_0 = new bool[](4);\n {\n bool r_2_0_0_0 = true;\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n bool r_2_0_0_1 = false;\n r_2_0_0[1] = r_2_0_0_1;\n }\n {\n bool r_2_0_0_2 = true;\n r_2_0_0[2] = r_2_0_0_2;\n }\n {\n bool r_2_0_0_3 = true;\n r_2_0_0[3] = r_2_0_0_3;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n bool[] memory r_2_0_1 = new bool[](4);\n {\n bool r_2_0_1_0 = false;\n r_2_0_1[0] = r_2_0_1_0;\n }\n {\n bool r_2_0_1_1 = false;\n r_2_0_1[1] = r_2_0_1_1;\n }\n {\n bool r_2_0_1_2 = false;\n r_2_0_1[2] = r_2_0_1_2;\n }\n {\n bool r_2_0_1_3 = true;\n r_2_0_1[3] = r_2_0_1_3;\n }\n r_2_0[1] = r_2_0_1;\n }\n {\n bool[] memory r_2_0_2 = new bool[](2);\n {\n bool r_2_0_2_0 = true;\n r_2_0_2[0] = r_2_0_2_0;\n }\n {\n bool r_2_0_2_1 = true;\n r_2_0_2[1] = r_2_0_2_1;\n }\n r_2_0[2] = r_2_0_2;\n }\n {\n bool[] memory r_2_0_3 = new bool[](4);\n {\n bool r_2_0_3_0 = false;\n r_2_0_3[0] = r_2_0_3_0;\n }\n {\n bool r_2_0_3_1 = false;\n r_2_0_3[1] = r_2_0_3_1;\n }\n {\n bool r_2_0_3_2 = false;\n r_2_0_3[2] = r_2_0_3_2;\n }\n {\n bool r_2_0_3_3 = true;\n r_2_0_3[3] = r_2_0_3_3;\n }\n r_2_0[3] = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bytes24 r_2_1 = bytes24(0x56f033999a9f113d0543e46d73bdbec4104d1f2d0670557f);\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n address[] memory r_3 = new address[](1);\n {\n address r_3_0 = 0x3e86232a17c3d1ec2f70D54CeE22e5Cc6542f5B4;\n r_3[0] = r_3_0;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000b40000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a80c3a94d206f20204d4d6f6f6f20c3a920f09f9a804df09f9a806f4d6f4d6fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070487ce7700be8a90f859d7bccf4c3f54de1a55000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a806f6f4d4d4d20204d6fc3a94df09f9a80f09f9a804d6f6f6f4d20c3a920f09f9a804d6f6fc3a9c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000530c9849eb49ca71842f19e5d2000000000000000000000000dd735426b9b18fe61f8b3c08f87dfb6869fd6c250000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010ad9d2f6edfda69c21e2cabf20000000000000000000000007e033baf2b9eabdf84d3ee3691dd454a8fe818d700000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a80c3a94d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004056f033999a9f113d0543e46d73bdbec4104d1f2d0670557f00000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000003e86232a17c3d1ec2f70d54cee22e5cc6542f5b4" + }, + { + "name": "random-(bytes10,((((int208,bytes27,bool,(uint32,bool,bytes23))),string[3],bytes2,bytes11),address,(uint216,string,address[][3]),address[2])[4],string)", + "type": "(bytes10,((((int208,bytes27,bool,(uint32,bool,bytes23))),string[3],bytes2,bytes11),address,(uint216,string,address[][3]),address[2])[4],string)", + "value": [ + "0x3cf9a19df94e3887bb0f", + [ + [ + [ + [ + [ + "-108011484543700343107002238552945224529381821241531628865634813", + "0xd7809e4d96d6b185b7eac7918e54f1050a44400e0d3e655c4f6a18", + false, + [ + "1571875826", + true, + "0x028237dccc4bdbd8b2c7f806b99b1241e1edec5b3501ff" + ] + ] + ], + [ + "Moo é🚀ooo🚀o🚀 oé ", + "Moo é🚀", + "Moo é🚀M🚀éooM🚀Mo🚀 éooéMéo MoMo M🚀ééM MééoMooé🚀éé🚀 " + ], + "0x10fb", + "0xb680eeae2ad10c4698640f" + ], + "0xCCE3DC32Ec89F8340EA13dC664a6828966F9047e", + [ + "91929768614579885241121598984127876418190780700646559023731363204", + "Moo é🚀MéooM🚀MMé🚀o", + [ + [], + [ + "0x8A9E7E7fb6142E27a0B8cF42fE3112fc6FE37E3F", + "0x67c4d42e1080E9D3386A150bcc3973bb68939689", + "0x458Bf0CD9301C47a66648612B8c4E3497E36117C" + ], + [ + "0xf0e2Ddbe109772e33b1157F8D60E162939A1AD1c", + "0xbb32A13a27B3dF0E64A2C0c444997a8Fc8746932", + "0x3bDb08F3A08eC371CFD6885FFcADEc41A47C41D0", + "0x6084D44Fc1eD03a980fd3510A56e88d2984818aC" + ] + ] + ], + [ + "0xeB7c5898A284cA8526B64c2a03a3F7A99B3a7a36", + "0xF980632A2188f31454ffb9207965154B5FC58018" + ] + ], + [ + [ + [ + [ + "71555856829126466378064881000637697862793071429674631251043613", + "0x9985e2f6ce9f3ced607c0120d3e0656b15f87f8a3b1712f53cd144", + false, + [ + "1716611995", + true, + "0x6fda9f56604a784bc6a56b465bbbd229d63fccdcf775fa" + ] + ] + ], + [ + "Moo é🚀 MoMo éooéooé ééoMéMéo🚀o oo M o🚀oMoMéo oéé ", + "Moo é🚀o🚀 oéo Moo MMoo🚀 🚀é ooooMMM🚀o🚀🚀é 🚀oéoooMo🚀 🚀MMM éé", + "Moo é🚀🚀 oMMo🚀🚀🚀o 🚀M M Mo🚀o" + ], + "0x4d3e", + "0x533ab9f15dbc0c74f840a5" + ], + "0x5600501869F44bb0C0A6729e8340C20603d0f7d6", + [ + "67152750802715546162005508286188312969453450197358150420202783792", + "Moo é🚀oooMoéoé éo oM MMé🚀🚀éoé é 🚀Mo🚀 éMo🚀é🚀M🚀ééo🚀Mé", + [ + [ + "0xA16A5AC73A584c0CAd9B4921012E877c2BBac2Cf", + "0x548726Cc2c0364508E385cC7F57A16727Bf944a5", + "0x6108947eDE11b4Cacb57b1d1724266989D6cDD71", + "0xee7b17A612CB573c6FEEAebaB9323751476087F5" + ], + [ + "0x60c956C9aa3835e4d14b0aAcb8609ef9971a4d46", + "0x3A0A357b9BDC3Bf03217d81Ed47D493b1543ca5f", + "0xdb1D29105E4689C0933aEBF5BA0e89F9AD76949b", + "0x24CB70c15efC56BcD5ADD3E3671a9A8978a9b890" + ], + [ + "0xD03A27c18aea1101D50C04FDEE10DD4D63062A00", + "0x2dd5405cad20BAb8f4F993B51888dC63096CD55A", + "0x93F2EB8b3EaF1d7648E115F570d6245E2aE84ec6" + ] + ] + ], + [ + "0xCAd0178A692d302067DaBbB0321AD75E055d4580", + "0x928ef1e75148D028e73B8A10A54a6Bb6f5926266" + ] + ], + [ + [ + [ + [ + "96363881988588643014124903031250814833401843396099094528279851", + "0xf24afb2cc363c314ea945946b23c0571d199e753f1603d1c124e70", + true, + [ + "1824009918", + false, + "0x9df6368d4445b361b6f07f7c8c8496544b91ac7b7fc9f2" + ] + ] + ], + [ + "Moo é🚀 o🚀oé éoé é🚀oo 🚀éM🚀é🚀o éM🚀 🚀oééo🚀 Moooo 🚀Méoéé o🚀o 🚀oM é", + "Moo é🚀 éé ooéoM oéooMoé🚀🚀🚀oo🚀o 🚀MMooé ", + "Moo é🚀é🚀oo🚀 🚀M 🚀🚀éé🚀o🚀ooé🚀🚀é🚀 o" + ], + "0xa64f", + "0x740f4ba74871bc9ec25500" + ], + "0x2f613D650EED8d3A21bb1c1391024DeA68E21B69", + [ + "52139196495110251778772168498373012670287987622237683445548471514", + "Moo é🚀🚀Mooéoé🚀M🚀 🚀é o🚀ooooéo oé é é🚀oMo oo éo", + [ + [ + "0xcF2CaeB584c2a4dfB1af7F0D9e0Fb845e8C8cF6e", + "0x198Ca6d056F46c8b29E6770AC709541583cAE8AA", + "0xFC944D122bc6bB86BB9D550dC8A607001defb911", + "0x93F43e870AF29c8fb5Bb19331Ca8246274399718" + ], + [ + "0x43558dEF06AF7F3332e9Bfc5e1a0e6E53811f16C", + "0xd8C817a4915F5351a4b0f5dFa2bD6EF000AA4a43", + "0xBce66483DC063409D649a347d866EB53686CE345" + ], + [ + "0x7b395566E1cC2766c1546305dC668b3329E6eBb9", + "0x383d1E6eBBcf38319261c73D1Ab7B99A288EAD65" + ] + ] + ], + [ + "0xDf4204BFAaE9B2bce18E2906cD1B13Aea534D0f0", + "0x48c8Fb0657762c4f8BC77ecd2Be95c6968e5DFF3" + ] + ], + [ + [ + [ + [ + "-169032519442784140758446062937051254553184341018368642998253492", + "0x47c5c88fc0be9b6396b84290b1fc7b35e0e869060492a9a3e8a3fe", + true, + [ + "3650270403", + true, + "0x663a0063fefaa66598e876859a71d5de946d82957f06b4" + ] + ] + ], + [ + "Moo é🚀é🚀 ééo oé🚀 oééo Mo é", + "Moo é🚀o o Mo oooo🚀MMééo🚀é🚀oéo🚀MMé🚀oé🚀Mo🚀🚀o🚀é o🚀 🚀oéMéMé oooé", + "Moo é🚀 o MMo" + ], + "0x3257", + "0xaf7de65e1e61a0a79005ef" + ], + "0xef58Fa521967accD2aDC1f08e4f54b674B49E606", + [ + "50134414082692195463601619161210169859173079101287930974986813554", + "Moo é🚀🚀ooo oo o", + [ + ["0x9ba234d960c530e916dF9B480cd9a27E8313A4b4"], + [ + "0x0a0d79D1DeBce4d7CC269fF1Dc050c6c0aa62774", + "0xae743080325b1703fEdAB647b082bcDAB6EA6c43", + "0x5b102ab08a822322AD0b58100aB0bBe1EF4a12de", + "0x26325763D1972aBB32EB731B55535B99B130C1AD" + ], + [] + ] + ], + [ + "0x69B0B6413055f14A9d1e061B8E606015c4854ba7", + "0xDF5291e1A43B02ea41fa9976e5E2C4A88014C377" + ] + ] + ], + "Moo é🚀é o🚀éééééé🚀🚀o🚀oo🚀Méoé🚀é🚀M🚀🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3cf9a19df94e3887bb0f" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-108011484543700343107002238552945224529381821241531628865634813" + }, + { + "type": "hexstring", + "value": "0xd7809e4d96d6b185b7eac7918e54f1050a44400e0d3e655c4f6a18" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1571875826" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x028237dccc4bdbd8b2c7f806b99b1241e1edec5b3501ff" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo🚀o🚀 oé " + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀M🚀éooM🚀Mo🚀 éooéMéo MoMo M🚀ééM MééoMooé🚀éé🚀 " + } + ] + }, + { + "type": "hexstring", + "value": "0x10fb" + }, + { + "type": "hexstring", + "value": "0xb680eeae2ad10c4698640f" + } + ] + }, + { + "type": "address", + "value": "0xCCE3DC32Ec89F8340EA13dC664a6828966F9047e" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "91929768614579885241121598984127876418190780700646559023731363204" + }, + { + "type": "string", + "value": "Moo é🚀MéooM🚀MMé🚀o" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8A9E7E7fb6142E27a0B8cF42fE3112fc6FE37E3F" + }, + { + "type": "address", + "value": "0x67c4d42e1080E9D3386A150bcc3973bb68939689" + }, + { + "type": "address", + "value": "0x458Bf0CD9301C47a66648612B8c4E3497E36117C" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xf0e2Ddbe109772e33b1157F8D60E162939A1AD1c" + }, + { + "type": "address", + "value": "0xbb32A13a27B3dF0E64A2C0c444997a8Fc8746932" + }, + { + "type": "address", + "value": "0x3bDb08F3A08eC371CFD6885FFcADEc41A47C41D0" + }, + { + "type": "address", + "value": "0x6084D44Fc1eD03a980fd3510A56e88d2984818aC" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xeB7c5898A284cA8526B64c2a03a3F7A99B3a7a36" + }, + { + "type": "address", + "value": "0xF980632A2188f31454ffb9207965154B5FC58018" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "71555856829126466378064881000637697862793071429674631251043613" + }, + { + "type": "hexstring", + "value": "0x9985e2f6ce9f3ced607c0120d3e0656b15f87f8a3b1712f53cd144" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1716611995" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x6fda9f56604a784bc6a56b465bbbd229d63fccdcf775fa" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 MoMo éooéooé ééoMéMéo🚀o oo M o🚀oMoMéo oéé " + }, + { + "type": "string", + "value": "Moo é🚀o🚀 oéo Moo MMoo🚀 🚀é ooooMMM🚀o🚀🚀é 🚀oéoooMo🚀 🚀MMM éé" + }, + { + "type": "string", + "value": "Moo é🚀🚀 oMMo🚀🚀🚀o 🚀M M Mo🚀o" + } + ] + }, + { + "type": "hexstring", + "value": "0x4d3e" + }, + { + "type": "hexstring", + "value": "0x533ab9f15dbc0c74f840a5" + } + ] + }, + { + "type": "address", + "value": "0x5600501869F44bb0C0A6729e8340C20603d0f7d6" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "67152750802715546162005508286188312969453450197358150420202783792" + }, + { + "type": "string", + "value": "Moo é🚀oooMoéoé éo oM MMé🚀🚀éoé é 🚀Mo🚀 éMo🚀é🚀M🚀ééo🚀Mé" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xA16A5AC73A584c0CAd9B4921012E877c2BBac2Cf" + }, + { + "type": "address", + "value": "0x548726Cc2c0364508E385cC7F57A16727Bf944a5" + }, + { + "type": "address", + "value": "0x6108947eDE11b4Cacb57b1d1724266989D6cDD71" + }, + { + "type": "address", + "value": "0xee7b17A612CB573c6FEEAebaB9323751476087F5" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x60c956C9aa3835e4d14b0aAcb8609ef9971a4d46" + }, + { + "type": "address", + "value": "0x3A0A357b9BDC3Bf03217d81Ed47D493b1543ca5f" + }, + { + "type": "address", + "value": "0xdb1D29105E4689C0933aEBF5BA0e89F9AD76949b" + }, + { + "type": "address", + "value": "0x24CB70c15efC56BcD5ADD3E3671a9A8978a9b890" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xD03A27c18aea1101D50C04FDEE10DD4D63062A00" + }, + { + "type": "address", + "value": "0x2dd5405cad20BAb8f4F993B51888dC63096CD55A" + }, + { + "type": "address", + "value": "0x93F2EB8b3EaF1d7648E115F570d6245E2aE84ec6" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xCAd0178A692d302067DaBbB0321AD75E055d4580" + }, + { + "type": "address", + "value": "0x928ef1e75148D028e73B8A10A54a6Bb6f5926266" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "96363881988588643014124903031250814833401843396099094528279851" + }, + { + "type": "hexstring", + "value": "0xf24afb2cc363c314ea945946b23c0571d199e753f1603d1c124e70" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1824009918" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x9df6368d4445b361b6f07f7c8c8496544b91ac7b7fc9f2" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o🚀oé éoé é🚀oo 🚀éM🚀é🚀o éM🚀 🚀oééo🚀 Moooo 🚀Méoéé o🚀o 🚀oM é" + }, + { + "type": "string", + "value": "Moo é🚀 éé ooéoM oéooMoé🚀🚀🚀oo🚀o 🚀MMooé " + }, + { + "type": "string", + "value": "Moo é🚀é🚀oo🚀 🚀M 🚀🚀éé🚀o🚀ooé🚀🚀é🚀 o" + } + ] + }, + { + "type": "hexstring", + "value": "0xa64f" + }, + { + "type": "hexstring", + "value": "0x740f4ba74871bc9ec25500" + } + ] + }, + { + "type": "address", + "value": "0x2f613D650EED8d3A21bb1c1391024DeA68E21B69" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "52139196495110251778772168498373012670287987622237683445548471514" + }, + { + "type": "string", + "value": "Moo é🚀🚀Mooéoé🚀M🚀 🚀é o🚀ooooéo oé é é🚀oMo oo éo" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xcF2CaeB584c2a4dfB1af7F0D9e0Fb845e8C8cF6e" + }, + { + "type": "address", + "value": "0x198Ca6d056F46c8b29E6770AC709541583cAE8AA" + }, + { + "type": "address", + "value": "0xFC944D122bc6bB86BB9D550dC8A607001defb911" + }, + { + "type": "address", + "value": "0x93F43e870AF29c8fb5Bb19331Ca8246274399718" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x43558dEF06AF7F3332e9Bfc5e1a0e6E53811f16C" + }, + { + "type": "address", + "value": "0xd8C817a4915F5351a4b0f5dFa2bD6EF000AA4a43" + }, + { + "type": "address", + "value": "0xBce66483DC063409D649a347d866EB53686CE345" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x7b395566E1cC2766c1546305dC668b3329E6eBb9" + }, + { + "type": "address", + "value": "0x383d1E6eBBcf38319261c73D1Ab7B99A288EAD65" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xDf4204BFAaE9B2bce18E2906cD1B13Aea534D0f0" + }, + { + "type": "address", + "value": "0x48c8Fb0657762c4f8BC77ecd2Be95c6968e5DFF3" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-169032519442784140758446062937051254553184341018368642998253492" + }, + { + "type": "hexstring", + "value": "0x47c5c88fc0be9b6396b84290b1fc7b35e0e869060492a9a3e8a3fe" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3650270403" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x663a0063fefaa66598e876859a71d5de946d82957f06b4" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀 ééo oé🚀 oééo Mo é" + }, + { + "type": "string", + "value": "Moo é🚀o o Mo oooo🚀MMééo🚀é🚀oéo🚀MMé🚀oé🚀Mo🚀🚀o🚀é o🚀 🚀oéMéMé oooé" + }, + { + "type": "string", + "value": "Moo é🚀 o MMo" + } + ] + }, + { + "type": "hexstring", + "value": "0x3257" + }, + { + "type": "hexstring", + "value": "0xaf7de65e1e61a0a79005ef" + } + ] + }, + { + "type": "address", + "value": "0xef58Fa521967accD2aDC1f08e4f54b674B49E606" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "50134414082692195463601619161210169859173079101287930974986813554" + }, + { + "type": "string", + "value": "Moo é🚀🚀ooo oo o" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9ba234d960c530e916dF9B480cd9a27E8313A4b4" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x0a0d79D1DeBce4d7CC269fF1Dc050c6c0aa62774" + }, + { + "type": "address", + "value": "0xae743080325b1703fEdAB647b082bcDAB6EA6c43" + }, + { + "type": "address", + "value": "0x5b102ab08a822322AD0b58100aB0bBe1EF4a12de" + }, + { + "type": "address", + "value": "0x26325763D1972aBB32EB731B55535B99B130C1AD" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x69B0B6413055f14A9d1e061B8E606015c4854ba7" + }, + { + "type": "address", + "value": "0xDF5291e1A43B02ea41fa9976e5E2C4A88014C377" + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é o🚀éééééé🚀🚀o🚀oo🚀Méoé🚀é🚀M🚀🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611d05806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190611796565b60405180910390f35b6100566114b0565b61005e6114b0565b693cf9a19df94e3887bb0f60b01b81526100766114d8565b61007e611505565b61008661153e565b61008e611572565b610096611581565b79433738e44d1227b6a5ac1714635b734fcd0207e316dbb562c1fc1981527fd7809e4d96d6b185b7eac7918e54f1050a44400e0d3e655c4f6a180000000000602082015260006040820152610104604080516060810182526000808252602082018190529181019190915290565b635db0ebf28152600160208201527f028237dccc4bdbd8b2c7f806b99b1241e1edec5b3501ff00000000000000000060408201526060820152815281526101496115c5565b604080518082018252601b81527f4d6f6f20c3a9f09f9a806f6f6ff09f9a806ff09f9a80206fc3a920000000000060208083019190915290835281518083018352600a8152689adede418753e13f3560b71b8183015283820152815160808101909252605380835260009291611c0c908301396040808401919091526020848101939093526110fb60f01b90840152506ab680eeae2ad10c4698640f60a81b606083015290825273cce3dc32ec89f8340ea13dc664a6828966f9047e908201526102116115ec565b7adf780913c4763bb0b872c6adb33aceeb1123de6fc7affafac4cd84815260408051808201909152601d81527f4d6f6f20c3a9f09f9a804dc3a96f6f4df09f9a804d4dc3a9f09f9a806f0000006020808301919091528201526102726115c5565b6040805160008082526020820190925282525060408051600380825260808201909252600091602082016060803683370190505090506000738a9e7e7fb6142e27a0b8cf42fe3112fc6fe37e3f905080826000815181106102d5576102d561190c565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007367c4d42e1080e9d3386a150bcc3973bb68939689905080826001815181106103235761032361190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073458bf0cd9301c47a66648612b8c4e3497e36117c905080826002815181106103715761037161190c565b6001600160a01b03929092166020928302919091018201528301919091525060408051600480825260a08201909252600091816020016020820280368337019050509050600073f0e2ddbe109772e33b1157f8d60e162939a1ad1c905080826000815181106103e2576103e261190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073bb32a13a27b3df0e64a2c0c444997a8fc8746932905080826001815181106104305761043061190c565b60200260200101906001600160a01b031690816001600160a01b031681525050506000733bdb08f3a08ec371cfd6885ffcadec41a47c41d09050808260028151811061047e5761047e61190c565b60200260200101906001600160a01b031690816001600160a01b031681525050506000736084d44fc1ed03a980fd3510a56e88d2984818ac905080826003815181106104cc576104cc61190c565b6001600160a01b0390921660209283029190910190910152508082600260200201525060408083019190915282015261050361160b565b73eb7c5898a284ca8526b64c2a03a3f7a99b3a7a36815273f980632a2188f31454ffb9207965154b5fc58018602082015260608201528152610543611505565b61054b61153e565b610553611572565b61055b611581565b792c878173a54c81f3d713d42f30cfe2ab7d571a9794780513251d81527f9985e2f6ce9f3ced607c0120d3e0656b15f87f8a3b1712f53cd14400000000006020820152600060408201526105c8604080516060810182526000808252602082018190529181019190915290565b6366516b9b8152600160208201527f6fda9f56604a784bc6a56b465bbbd229d63fccdcf775fa000000000000000000604082015260608201528152815261060d6115c5565b6000604051806080016040528060488152602001611923604891398252506040805160808101909152605e8082526000919061199860208301399050808260016020020181905250506000604051806060016040528060308152602001611bdc6030913960408084019190915260208481019390935261269f60f11b90840152506a533ab9f15dbc0c74f840a560a81b6060830152908252735600501869f44bb0c0a6729e8340c20603d0f7d6908201526106c66115ec565b7aa33d4269522979a6be5aff8d28f62830e530d857e75bb80e8c043081526040805160808101909152605c80825260009190611b80602083013960208301525061070e6115c5565b60408051600480825260a0820190925260009160208201608080368337019050509050600073a16a5ac73a584c0cad9b4921012e877c2bbac2cf9050808260008151811061075e5761075e61190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073548726cc2c0364508e385cc7f57a16727bf944a5905080826001815181106107ac576107ac61190c565b60200260200101906001600160a01b031690816001600160a01b031681525050506000736108947ede11b4cacb57b1d1724266989d6cdd71905080826002815181106107fa576107fa61190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073ee7b17a612cb573c6feeaebab9323751476087f5905080826003815181106108485761084861190c565b6001600160a01b03929092166020928302919091019091015250815260408051600480825260a0820190925260009181602001602082028036833701905050905060007360c956c9aa3835e4d14b0aacb8609ef9971a4d46905080826000815181106108b6576108b661190c565b60200260200101906001600160a01b031690816001600160a01b031681525050506000733a0a357b9bdc3bf03217d81ed47d493b1543ca5f905080826001815181106109045761090461190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073db1d29105e4689c0933aebf5ba0e89f9ad76949b905080826002815181106109525761095261190c565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007324cb70c15efc56bcd5add3e3671a9a8978a9b890905080826003815181106109a0576109a061190c565b6001600160a01b03929092166020928302919091018201528301919091525060408051600380825260808201909252600091816020016020820280368337019050509050600073d03a27c18aea1101d50c04fdee10dd4d63062a0090508082600081518110610a1157610a1161190c565b60200260200101906001600160a01b031690816001600160a01b031681525050506000732dd5405cad20bab8f4f993b51888dc63096cd55a90508082600181518110610a5f57610a5f61190c565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007393f2eb8b3eaf1d7648e115f570d6245e2ae84ec690508082600281518110610aad57610aad61190c565b6001600160a01b03909216602092830291909101909101525080826002602002015250604080830191909152820152610ae461160b565b73cad0178a692d302067dabbb0321ad75e055d4580815273928ef1e75148d028e73b8a10a54a6bb6f59262666020808301919091526060830191909152820152610b2c611505565b610b3461153e565b610b3c611572565b610b44611581565b793bf7a6ef8296b39bf713e97416b793ebd5a4ef7f4ddc2122452b81527ff24afb2cc363c314ea945946b23c0571d199e753f1603d1c124e700000000000602082015260016040820152610bb1604080516060810182526000808252602082018190529181019190915290565b636cb82ebe8152600060208201527f9df6368d4445b361b6f07f7c8c8496544b91ac7b7fc9f20000000000000000006040820152606082015281528152610bf66115c5565b60006040518060a0016040528060718152602001611c5f607191398252506040805160608101909152603f80825260009190611a8e60208301399050808260016020020181905250506000604051806080016040528060468152602001611acd6046913960408084019190915260208481019390935261a64f60f01b908401525069740f4ba74871bc9ec25560b01b6060830152908252732f613d650eed8d3a21bb1c1391024dea68e21b6990820152610cae6115ec565b7a7ebe4d380bd5601bc35ddb3f1d85fb9138e73233aa79b353c054da81526040805160808101909152604e808252600091906119f66020830139602083015250610cf66115c5565b60408051600480825260a0820190925260009160208201608080368337019050509050600073cf2caeb584c2a4dfb1af7f0d9e0fb845e8c8cf6e90508082600081518110610d4657610d4661190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073198ca6d056f46c8b29e6770ac709541583cae8aa90508082600181518110610d9457610d9461190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073fc944d122bc6bb86bb9d550dc8a607001defb91190508082600281518110610de257610de261190c565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007393f43e870af29c8fb5bb19331ca824627439971890508082600381518110610e3057610e3061190c565b6001600160a01b0392909216602092830291909101909101525081526040805160038082526080820190925260009181602001602082028036833701905050905060007343558def06af7f3332e9bfc5e1a0e6e53811f16c90508082600081518110610e9e57610e9e61190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073d8c817a4915f5351a4b0f5dfa2bd6ef000aa4a4390508082600181518110610eec57610eec61190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073bce66483dc063409d649a347d866eb53686ce34590508082600281518110610f3a57610f3a61190c565b6001600160a01b039290921660209283029190910182015283019190915250604080516002808252606082019092526000918160200160208202803683370190505090506000737b395566e1cc2766c1546305dc668b3329e6ebb990508082600081518110610fab57610fab61190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073383d1e6ebbcf38319261c73d1ab7b99a288ead6590508082600181518110610ff957610ff961190c565b6001600160a01b0390921660209283029190910190910152508082600260200201525060408083019190915282015261103061160b565b73df4204bfaae9b2bce18e2906cd1b13aea534d0f081527348c8fb0657762c4f8bc77ecd2be95c6968e5dff3602082015260608201526040820152611073611505565b61107b61153e565b611083611572565b61108b611581565b7969306f16f8a57905e8851952eb7a076780c74378dd98ad1eb7b31981527f47c5c88fc0be9b6396b84290b1fc7b35e0e869060492a9a3e8a3fe00000000006020820152600160408201526110f9604080516060810182526000808252602082018190529181019190915290565b63d992b4c38152600160208201527f663a0063fefaa66598e876859a71d5de946d82957f06b4000000000000000000604082015260608201528152815261113e6115c5565b60006040518060600160405280602d815260200161196b602d91398252506040805160a08101909152606d80825260009190611b13602083013960208381019190915260408051808201825260118152704d6f6f20c3a9f09f9a80206f20204d4d6f60781b81840152818501528482019390935261325760f01b92840192909252506aaf7de65e1e61a0a79005ef60a81b606083015290825273ef58fa521967accd2adc1f08e4f54b674b49e606908201526111f86115ec565b7a79deb8f456d8e582d8016ed011ecc0d6393c5c78f1ffff7ebfc07281526040805180820190915260168152754d6f6f20c3a9f09f9a80f09f9a806f6f6f206f6f206f60501b6020808301919091528201526112526115c5565b604080516001808252818301909252600091602080830190803683370190505090506000739ba234d960c530e916df9b480cd9a27e8313a4b4905080826000815181106112a1576112a161190c565b6001600160a01b03929092166020928302919091019091015250815260408051600480825260a082019092526000918160200160208202803683370190505090506000730a0d79d1debce4d7cc269ff1dc050c6c0aa627749050808260008151811061130f5761130f61190c565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073ae743080325b1703fedab647b082bcdab6ea6c439050808260018151811061135d5761135d61190c565b60200260200101906001600160a01b031690816001600160a01b031681525050506000735b102ab08a822322ad0b58100ab0bbe1ef4a12de905080826002815181106113ab576113ab61190c565b60200260200101906001600160a01b031690816001600160a01b0316815250505060007326325763d1972abb32eb731b55535b99b130c1ad905080826003815181106113f9576113f961190c565b6001600160a01b0392909216602092830291909101820152838101929092525060408051600081529182018152808301919091528281019190915282015261143f61160b565b7369b0b6413055f14a9d1e061b8e606015c4854ba7815273df5291e1a43b02ea41fa9976e5e2c4a88014c37760208083019190915260608381019290925290830191909152828101919091526040805160808101909152604a808252600092611a4490830139604083015250919050565b604080516060810190915260008152602081016114cb6114d8565b8152602001606081525090565b60405180608001604052806004905b6114ef611505565b8152602001906001900390816114e75790505090565b604051806080016040528061151861153e565b81526000602082015260400161152c6115ec565b815260200161153961160b565b905290565b6040518060800160405280611551611572565b815260200161155e6115c5565b815260006020820181905260409091015290565b60405180602001604052806115395b604080516080810182526000808252602082018190529181019190915260608101611539604080516060810182526000808252602082018190529181019190915290565b60405180606001604052806003905b60608152602001906001900390816115d45790505090565b60408051606080820183526000825260208201529081016115396115c5565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561164f57602081850181015186830182015201611633565b81811115611661576000602083870101525b50601f01601f19169290920160200192915050565b600082606081018360005b60038110156116b057838303875261169a838351611629565b6020978801979093509190910190600101611681565b509095945050505050565b60018060d81b03815116825260006020808301516060828601526116e26060860182611629565b90506040840151858203604087015281829050606083016000805b6003811015611756578583038452845180518085529088019088850190845b818110156117415783516001600160a01b03168352928a0192918a019160010161171c565b505095880195948801949350506001016116fd565b509098975050505050505050565b8060005b60028110156117905781516001600160a01b0316845260209384019390910190600101611768565b50505050565b602080825282516001600160b01b0319168282015282810151606060408085018290526000939261010092909160808701848801875b60048110156118e257898203607f190183528551805160a0808552815151805160190b918601919091528a81015164ffffffffff191660c086015286810151151560e0860152870151805163ffffffff168a860152808b01511515610120808701919091529087015168ffffffffffffffffff19166101408601528a820151610160860191909152906118636101c0860183611676565b9150868101516118806101808701826001600160f01b0319169052565b508701516001600160a81b0319166101a0850152898201516001600160a01b03168a85015285820151848203878601526118ba82826116bb565b9150508682015191506118cf87850183611764565b96890196938901939250506001016117cc565b5089830151898203601f1901858b015296506118fe8188611629565b9a9950505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80204d6f4d6f20c3a96f6fc3a96f6fc3a920c3a9c3a96f4dc3a94dc3a96ff09f9a806f20206f6f2020204d206ff09f9a806f4d6f4dc3a96f206fc3a9c3a9204d6f6f20c3a9f09f9a80c3a9f09f9a8020c3a9c3a96f206fc3a9f09f9a80206fc3a9c3a96f20204d6f2020c3a94d6f6f20c3a9f09f9a806ff09f9a80206fc3a96f204d6f6f204d4d6f6ff09f9a8020f09f9a80c3a920206f6f6f6f4d4d4df09f9a806ff09f9a80f09f9a80c3a920f09f9a806fc3a96f6f6f4d6ff09f9a8020f09f9a804d4d4d20c3a9c3a94d6f6f20c3a9f09f9a80f09f9a804d6f6fc3a96fc3a9f09f9a804df09f9a8020f09f9a80c3a9206ff09f9a806f6f6f6fc3a96f206fc3a920c3a92020c3a9f09f9a806f4d6f20206f6f2020c3a96f4d6f6f20c3a9f09f9a80c3a9206ff09f9a80c3a9c3a9c3a9c3a9c3a9c3a9f09f9a80f09f9a806ff09f9a806f6ff09f9a804dc3a96fc3a9f09f9a80c3a9f09f9a804df09f9a80f09f9a804d6f6f20c3a9f09f9a8020c3a9c3a9206f6fc3a96f4d206fc3a96f6f4d6fc3a9f09f9a80f09f9a80f09f9a806f6ff09f9a806f20f09f9a804d4d6f6fc3a9204d6f6f20c3a9f09f9a80c3a9f09f9a806f6ff09f9a8020f09f9a804d20f09f9a80f09f9a80c3a9c3a9f09f9a806ff09f9a806f6fc3a9f09f9a80f09f9a80c3a9f09f9a80206f4d6f6f20c3a9f09f9a806f206f204d6f206f6f6f6ff09f9a804d4dc3a9c3a96ff09f9a80c3a9f09f9a806fc3a96ff09f9a804d4dc3a9f09f9a806fc3a9f09f9a804d6ff09f9a80f09f9a806ff09f9a80c3a9206ff09f9a802020f09f9a806fc3a94dc3a94dc3a9206f6f6fc3a94d6f6f20c3a9f09f9a806f6f6f4d6fc3a96fc3a920c3a96f206f4d204d4dc3a9f09f9a80f09f9a80c3a96fc3a920c3a920f09f9a804d6ff09f9a802020c3a94d6ff09f9a80c3a9f09f9a804df09f9a80c3a9c3a96ff09f9a804dc3a94d6f6f20c3a9f09f9a80f09f9a80206f4d4d6ff09f9a80f09f9a80f09f9a806f20f09f9a804d204d204d6ff09f9a806f4d6f6f20c3a9f09f9a804df09f9a80c3a96f6f4df09f9a804d6ff09f9a802020c3a96f6fc3a94dc3a96f204d6f4d6f204df09f9a80c3a9c3a94d204dc3a9c3a96f4d6f6fc3a9f09f9a80c3a9c3a9f09f9a80204d6f6f20c3a9f09f9a80206ff09f9a806fc3a920c3a96fc3a920c3a9f09f9a806f6f20f09f9a80c3a94df09f9a80c3a9f09f9a806f20c3a94df09f9a8020f09f9a806fc3a9c3a96ff09f9a80204d6f6f6f6f20f09f9a804dc3a96fc3a9c3a920206ff09f9a806f20f09f9a806f4d20c3a9a26469706673582212206dd5e6598bf78fff131b97eb133576d4fb673864b62b9d3e913fb8ee7d43a92464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_94783a2a {\n uint32 s_0;\n bool s_1;\n bytes23 s_2;\n }\n\n struct S_d0716984 {\n int208 s_0;\n bytes27 s_1;\n bool s_2;\n S_94783a2a s_3;\n }\n\n struct S_48e72d4c {\n S_d0716984 s_0;\n }\n\n struct S_1b617d04 {\n S_48e72d4c s_0;\n string[3] s_1;\n bytes2 s_2;\n bytes11 s_3;\n }\n\n struct S_5df7cbdd {\n uint216 s_0;\n string s_1;\n address[][3] s_2;\n }\n\n struct S_8f6909b2 {\n S_1b617d04 s_0;\n address s_1;\n S_5df7cbdd s_2;\n address[2] s_3;\n }\n\n struct S_8ca1a3cc {\n bytes10 s_0;\n S_8f6909b2[4] s_1;\n string s_2;\n }\n\n function test () public pure returns (S_8ca1a3cc memory) {\n S_8ca1a3cc memory r;\n {\n bytes10 r_0 = bytes10(0x3cf9a19df94e3887bb0f);\n r.s_0 = r_0;\n }\n {\n S_8f6909b2[4] memory r_1;\n {\n S_8f6909b2 memory r_1_0;\n {\n S_1b617d04 memory r_1_0_0;\n {\n S_48e72d4c memory r_1_0_0_0;\n {\n S_d0716984 memory r_1_0_0_0_0;\n {\n int208 r_1_0_0_0_0_0 = -108011484543700343107002238552945224529381821241531628865634813;\n r_1_0_0_0_0.s_0 = r_1_0_0_0_0_0;\n }\n {\n bytes27 r_1_0_0_0_0_1 = bytes27(0xd7809e4d96d6b185b7eac7918e54f1050a44400e0d3e655c4f6a18);\n r_1_0_0_0_0.s_1 = r_1_0_0_0_0_1;\n }\n {\n bool r_1_0_0_0_0_2 = false;\n r_1_0_0_0_0.s_2 = r_1_0_0_0_0_2;\n }\n {\n S_94783a2a memory r_1_0_0_0_0_3;\n {\n uint32 r_1_0_0_0_0_3_0 = 1571875826;\n r_1_0_0_0_0_3.s_0 = r_1_0_0_0_0_3_0;\n }\n {\n bool r_1_0_0_0_0_3_1 = true;\n r_1_0_0_0_0_3.s_1 = r_1_0_0_0_0_3_1;\n }\n {\n bytes23 r_1_0_0_0_0_3_2 = bytes23(0x028237dccc4bdbd8b2c7f806b99b1241e1edec5b3501ff);\n r_1_0_0_0_0_3.s_2 = r_1_0_0_0_0_3_2;\n }\n r_1_0_0_0_0.s_3 = r_1_0_0_0_0_3;\n }\n r_1_0_0_0.s_0 = r_1_0_0_0_0;\n }\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n string[3] memory r_1_0_0_1;\n {\n string memory r_1_0_0_1_0 = unicode\"Moo é🚀ooo🚀o🚀 oé \";\n r_1_0_0_1[0] = r_1_0_0_1_0;\n }\n {\n string memory r_1_0_0_1_1 = unicode\"Moo é🚀\";\n r_1_0_0_1[1] = r_1_0_0_1_1;\n }\n {\n string memory r_1_0_0_1_2 = unicode\"Moo é🚀M🚀éooM🚀Mo🚀 éooéMéo MoMo M🚀ééM MééoMooé🚀éé🚀 \";\n r_1_0_0_1[2] = r_1_0_0_1_2;\n }\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n bytes2 r_1_0_0_2 = bytes2(0x10fb);\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n {\n bytes11 r_1_0_0_3 = bytes11(0xb680eeae2ad10c4698640f);\n r_1_0_0.s_3 = r_1_0_0_3;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n address r_1_0_1 = 0xCCE3DC32Ec89F8340EA13dC664a6828966F9047e;\n r_1_0.s_1 = r_1_0_1;\n }\n {\n S_5df7cbdd memory r_1_0_2;\n {\n uint216 r_1_0_2_0 = 91929768614579885241121598984127876418190780700646559023731363204;\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n string memory r_1_0_2_1 = unicode\"Moo é🚀MéooM🚀MMé🚀o\";\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n {\n address[][3] memory r_1_0_2_2;\n {\n address[] memory r_1_0_2_2_0 = new address[](0);\n r_1_0_2_2[0] = r_1_0_2_2_0;\n }\n {\n address[] memory r_1_0_2_2_1 = new address[](3);\n {\n address r_1_0_2_2_1_0 = 0x8A9E7E7fb6142E27a0B8cF42fE3112fc6FE37E3F;\n r_1_0_2_2_1[0] = r_1_0_2_2_1_0;\n }\n {\n address r_1_0_2_2_1_1 = 0x67c4d42e1080E9D3386A150bcc3973bb68939689;\n r_1_0_2_2_1[1] = r_1_0_2_2_1_1;\n }\n {\n address r_1_0_2_2_1_2 = 0x458Bf0CD9301C47a66648612B8c4E3497E36117C;\n r_1_0_2_2_1[2] = r_1_0_2_2_1_2;\n }\n r_1_0_2_2[1] = r_1_0_2_2_1;\n }\n {\n address[] memory r_1_0_2_2_2 = new address[](4);\n {\n address r_1_0_2_2_2_0 = 0xf0e2Ddbe109772e33b1157F8D60E162939A1AD1c;\n r_1_0_2_2_2[0] = r_1_0_2_2_2_0;\n }\n {\n address r_1_0_2_2_2_1 = 0xbb32A13a27B3dF0E64A2C0c444997a8Fc8746932;\n r_1_0_2_2_2[1] = r_1_0_2_2_2_1;\n }\n {\n address r_1_0_2_2_2_2 = 0x3bDb08F3A08eC371CFD6885FFcADEc41A47C41D0;\n r_1_0_2_2_2[2] = r_1_0_2_2_2_2;\n }\n {\n address r_1_0_2_2_2_3 = 0x6084D44Fc1eD03a980fd3510A56e88d2984818aC;\n r_1_0_2_2_2[3] = r_1_0_2_2_2_3;\n }\n r_1_0_2_2[2] = r_1_0_2_2_2;\n }\n r_1_0_2.s_2 = r_1_0_2_2;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n {\n address[2] memory r_1_0_3;\n {\n address r_1_0_3_0 = 0xeB7c5898A284cA8526B64c2a03a3F7A99B3a7a36;\n r_1_0_3[0] = r_1_0_3_0;\n }\n {\n address r_1_0_3_1 = 0xF980632A2188f31454ffb9207965154B5FC58018;\n r_1_0_3[1] = r_1_0_3_1;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n {\n S_8f6909b2 memory r_1_1;\n {\n S_1b617d04 memory r_1_1_0;\n {\n S_48e72d4c memory r_1_1_0_0;\n {\n S_d0716984 memory r_1_1_0_0_0;\n {\n int208 r_1_1_0_0_0_0 = 71555856829126466378064881000637697862793071429674631251043613;\n r_1_1_0_0_0.s_0 = r_1_1_0_0_0_0;\n }\n {\n bytes27 r_1_1_0_0_0_1 = bytes27(0x9985e2f6ce9f3ced607c0120d3e0656b15f87f8a3b1712f53cd144);\n r_1_1_0_0_0.s_1 = r_1_1_0_0_0_1;\n }\n {\n bool r_1_1_0_0_0_2 = false;\n r_1_1_0_0_0.s_2 = r_1_1_0_0_0_2;\n }\n {\n S_94783a2a memory r_1_1_0_0_0_3;\n {\n uint32 r_1_1_0_0_0_3_0 = 1716611995;\n r_1_1_0_0_0_3.s_0 = r_1_1_0_0_0_3_0;\n }\n {\n bool r_1_1_0_0_0_3_1 = true;\n r_1_1_0_0_0_3.s_1 = r_1_1_0_0_0_3_1;\n }\n {\n bytes23 r_1_1_0_0_0_3_2 = bytes23(0x6fda9f56604a784bc6a56b465bbbd229d63fccdcf775fa);\n r_1_1_0_0_0_3.s_2 = r_1_1_0_0_0_3_2;\n }\n r_1_1_0_0_0.s_3 = r_1_1_0_0_0_3;\n }\n r_1_1_0_0.s_0 = r_1_1_0_0_0;\n }\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n string[3] memory r_1_1_0_1;\n {\n string memory r_1_1_0_1_0 = unicode\"Moo é🚀 MoMo éooéooé ééoMéMéo🚀o oo M o🚀oMoMéo oéé \";\n r_1_1_0_1[0] = r_1_1_0_1_0;\n }\n {\n string memory r_1_1_0_1_1 = unicode\"Moo é🚀o🚀 oéo Moo MMoo🚀 🚀é ooooMMM🚀o🚀🚀é 🚀oéoooMo🚀 🚀MMM éé\";\n r_1_1_0_1[1] = r_1_1_0_1_1;\n }\n {\n string memory r_1_1_0_1_2 = unicode\"Moo é🚀🚀 oMMo🚀🚀🚀o 🚀M M Mo🚀o\";\n r_1_1_0_1[2] = r_1_1_0_1_2;\n }\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n bytes2 r_1_1_0_2 = bytes2(0x4d3e);\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n {\n bytes11 r_1_1_0_3 = bytes11(0x533ab9f15dbc0c74f840a5);\n r_1_1_0.s_3 = r_1_1_0_3;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n address r_1_1_1 = 0x5600501869F44bb0C0A6729e8340C20603d0f7d6;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_5df7cbdd memory r_1_1_2;\n {\n uint216 r_1_1_2_0 = 67152750802715546162005508286188312969453450197358150420202783792;\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n string memory r_1_1_2_1 = unicode\"Moo é🚀oooMoéoé éo oM MMé🚀🚀éoé é 🚀Mo🚀 éMo🚀é🚀M🚀ééo🚀Mé\";\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n {\n address[][3] memory r_1_1_2_2;\n {\n address[] memory r_1_1_2_2_0 = new address[](4);\n {\n address r_1_1_2_2_0_0 = 0xA16A5AC73A584c0CAd9B4921012E877c2BBac2Cf;\n r_1_1_2_2_0[0] = r_1_1_2_2_0_0;\n }\n {\n address r_1_1_2_2_0_1 = 0x548726Cc2c0364508E385cC7F57A16727Bf944a5;\n r_1_1_2_2_0[1] = r_1_1_2_2_0_1;\n }\n {\n address r_1_1_2_2_0_2 = 0x6108947eDE11b4Cacb57b1d1724266989D6cDD71;\n r_1_1_2_2_0[2] = r_1_1_2_2_0_2;\n }\n {\n address r_1_1_2_2_0_3 = 0xee7b17A612CB573c6FEEAebaB9323751476087F5;\n r_1_1_2_2_0[3] = r_1_1_2_2_0_3;\n }\n r_1_1_2_2[0] = r_1_1_2_2_0;\n }\n {\n address[] memory r_1_1_2_2_1 = new address[](4);\n {\n address r_1_1_2_2_1_0 = 0x60c956C9aa3835e4d14b0aAcb8609ef9971a4d46;\n r_1_1_2_2_1[0] = r_1_1_2_2_1_0;\n }\n {\n address r_1_1_2_2_1_1 = 0x3A0A357b9BDC3Bf03217d81Ed47D493b1543ca5f;\n r_1_1_2_2_1[1] = r_1_1_2_2_1_1;\n }\n {\n address r_1_1_2_2_1_2 = 0xdb1D29105E4689C0933aEBF5BA0e89F9AD76949b;\n r_1_1_2_2_1[2] = r_1_1_2_2_1_2;\n }\n {\n address r_1_1_2_2_1_3 = 0x24CB70c15efC56BcD5ADD3E3671a9A8978a9b890;\n r_1_1_2_2_1[3] = r_1_1_2_2_1_3;\n }\n r_1_1_2_2[1] = r_1_1_2_2_1;\n }\n {\n address[] memory r_1_1_2_2_2 = new address[](3);\n {\n address r_1_1_2_2_2_0 = 0xD03A27c18aea1101D50C04FDEE10DD4D63062A00;\n r_1_1_2_2_2[0] = r_1_1_2_2_2_0;\n }\n {\n address r_1_1_2_2_2_1 = 0x2dd5405cad20BAb8f4F993B51888dC63096CD55A;\n r_1_1_2_2_2[1] = r_1_1_2_2_2_1;\n }\n {\n address r_1_1_2_2_2_2 = 0x93F2EB8b3EaF1d7648E115F570d6245E2aE84ec6;\n r_1_1_2_2_2[2] = r_1_1_2_2_2_2;\n }\n r_1_1_2_2[2] = r_1_1_2_2_2;\n }\n r_1_1_2.s_2 = r_1_1_2_2;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n {\n address[2] memory r_1_1_3;\n {\n address r_1_1_3_0 = 0xCAd0178A692d302067DaBbB0321AD75E055d4580;\n r_1_1_3[0] = r_1_1_3_0;\n }\n {\n address r_1_1_3_1 = 0x928ef1e75148D028e73B8A10A54a6Bb6f5926266;\n r_1_1_3[1] = r_1_1_3_1;\n }\n r_1_1.s_3 = r_1_1_3;\n }\n r_1[1] = r_1_1;\n }\n {\n S_8f6909b2 memory r_1_2;\n {\n S_1b617d04 memory r_1_2_0;\n {\n S_48e72d4c memory r_1_2_0_0;\n {\n S_d0716984 memory r_1_2_0_0_0;\n {\n int208 r_1_2_0_0_0_0 = 96363881988588643014124903031250814833401843396099094528279851;\n r_1_2_0_0_0.s_0 = r_1_2_0_0_0_0;\n }\n {\n bytes27 r_1_2_0_0_0_1 = bytes27(0xf24afb2cc363c314ea945946b23c0571d199e753f1603d1c124e70);\n r_1_2_0_0_0.s_1 = r_1_2_0_0_0_1;\n }\n {\n bool r_1_2_0_0_0_2 = true;\n r_1_2_0_0_0.s_2 = r_1_2_0_0_0_2;\n }\n {\n S_94783a2a memory r_1_2_0_0_0_3;\n {\n uint32 r_1_2_0_0_0_3_0 = 1824009918;\n r_1_2_0_0_0_3.s_0 = r_1_2_0_0_0_3_0;\n }\n {\n bool r_1_2_0_0_0_3_1 = false;\n r_1_2_0_0_0_3.s_1 = r_1_2_0_0_0_3_1;\n }\n {\n bytes23 r_1_2_0_0_0_3_2 = bytes23(0x9df6368d4445b361b6f07f7c8c8496544b91ac7b7fc9f2);\n r_1_2_0_0_0_3.s_2 = r_1_2_0_0_0_3_2;\n }\n r_1_2_0_0_0.s_3 = r_1_2_0_0_0_3;\n }\n r_1_2_0_0.s_0 = r_1_2_0_0_0;\n }\n r_1_2_0.s_0 = r_1_2_0_0;\n }\n {\n string[3] memory r_1_2_0_1;\n {\n string memory r_1_2_0_1_0 = unicode\"Moo é🚀 o🚀oé éoé é🚀oo 🚀éM🚀é🚀o éM🚀 🚀oééo🚀 Moooo 🚀Méoéé o🚀o 🚀oM é\";\n r_1_2_0_1[0] = r_1_2_0_1_0;\n }\n {\n string memory r_1_2_0_1_1 = unicode\"Moo é🚀 éé ooéoM oéooMoé🚀🚀🚀oo🚀o 🚀MMooé \";\n r_1_2_0_1[1] = r_1_2_0_1_1;\n }\n {\n string memory r_1_2_0_1_2 = unicode\"Moo é🚀é🚀oo🚀 🚀M 🚀🚀éé🚀o🚀ooé🚀🚀é🚀 o\";\n r_1_2_0_1[2] = r_1_2_0_1_2;\n }\n r_1_2_0.s_1 = r_1_2_0_1;\n }\n {\n bytes2 r_1_2_0_2 = bytes2(0xa64f);\n r_1_2_0.s_2 = r_1_2_0_2;\n }\n {\n bytes11 r_1_2_0_3 = bytes11(0x740f4ba74871bc9ec25500);\n r_1_2_0.s_3 = r_1_2_0_3;\n }\n r_1_2.s_0 = r_1_2_0;\n }\n {\n address r_1_2_1 = 0x2f613D650EED8d3A21bb1c1391024DeA68E21B69;\n r_1_2.s_1 = r_1_2_1;\n }\n {\n S_5df7cbdd memory r_1_2_2;\n {\n uint216 r_1_2_2_0 = 52139196495110251778772168498373012670287987622237683445548471514;\n r_1_2_2.s_0 = r_1_2_2_0;\n }\n {\n string memory r_1_2_2_1 = unicode\"Moo é🚀🚀Mooéoé🚀M🚀 🚀é o🚀ooooéo oé é é🚀oMo oo éo\";\n r_1_2_2.s_1 = r_1_2_2_1;\n }\n {\n address[][3] memory r_1_2_2_2;\n {\n address[] memory r_1_2_2_2_0 = new address[](4);\n {\n address r_1_2_2_2_0_0 = 0xcF2CaeB584c2a4dfB1af7F0D9e0Fb845e8C8cF6e;\n r_1_2_2_2_0[0] = r_1_2_2_2_0_0;\n }\n {\n address r_1_2_2_2_0_1 = 0x198Ca6d056F46c8b29E6770AC709541583cAE8AA;\n r_1_2_2_2_0[1] = r_1_2_2_2_0_1;\n }\n {\n address r_1_2_2_2_0_2 = 0xFC944D122bc6bB86BB9D550dC8A607001defb911;\n r_1_2_2_2_0[2] = r_1_2_2_2_0_2;\n }\n {\n address r_1_2_2_2_0_3 = 0x93F43e870AF29c8fb5Bb19331Ca8246274399718;\n r_1_2_2_2_0[3] = r_1_2_2_2_0_3;\n }\n r_1_2_2_2[0] = r_1_2_2_2_0;\n }\n {\n address[] memory r_1_2_2_2_1 = new address[](3);\n {\n address r_1_2_2_2_1_0 = 0x43558dEF06AF7F3332e9Bfc5e1a0e6E53811f16C;\n r_1_2_2_2_1[0] = r_1_2_2_2_1_0;\n }\n {\n address r_1_2_2_2_1_1 = 0xd8C817a4915F5351a4b0f5dFa2bD6EF000AA4a43;\n r_1_2_2_2_1[1] = r_1_2_2_2_1_1;\n }\n {\n address r_1_2_2_2_1_2 = 0xBce66483DC063409D649a347d866EB53686CE345;\n r_1_2_2_2_1[2] = r_1_2_2_2_1_2;\n }\n r_1_2_2_2[1] = r_1_2_2_2_1;\n }\n {\n address[] memory r_1_2_2_2_2 = new address[](2);\n {\n address r_1_2_2_2_2_0 = 0x7b395566E1cC2766c1546305dC668b3329E6eBb9;\n r_1_2_2_2_2[0] = r_1_2_2_2_2_0;\n }\n {\n address r_1_2_2_2_2_1 = 0x383d1E6eBBcf38319261c73D1Ab7B99A288EAD65;\n r_1_2_2_2_2[1] = r_1_2_2_2_2_1;\n }\n r_1_2_2_2[2] = r_1_2_2_2_2;\n }\n r_1_2_2.s_2 = r_1_2_2_2;\n }\n r_1_2.s_2 = r_1_2_2;\n }\n {\n address[2] memory r_1_2_3;\n {\n address r_1_2_3_0 = 0xDf4204BFAaE9B2bce18E2906cD1B13Aea534D0f0;\n r_1_2_3[0] = r_1_2_3_0;\n }\n {\n address r_1_2_3_1 = 0x48c8Fb0657762c4f8BC77ecd2Be95c6968e5DFF3;\n r_1_2_3[1] = r_1_2_3_1;\n }\n r_1_2.s_3 = r_1_2_3;\n }\n r_1[2] = r_1_2;\n }\n {\n S_8f6909b2 memory r_1_3;\n {\n S_1b617d04 memory r_1_3_0;\n {\n S_48e72d4c memory r_1_3_0_0;\n {\n S_d0716984 memory r_1_3_0_0_0;\n {\n int208 r_1_3_0_0_0_0 = -169032519442784140758446062937051254553184341018368642998253492;\n r_1_3_0_0_0.s_0 = r_1_3_0_0_0_0;\n }\n {\n bytes27 r_1_3_0_0_0_1 = bytes27(0x47c5c88fc0be9b6396b84290b1fc7b35e0e869060492a9a3e8a3fe);\n r_1_3_0_0_0.s_1 = r_1_3_0_0_0_1;\n }\n {\n bool r_1_3_0_0_0_2 = true;\n r_1_3_0_0_0.s_2 = r_1_3_0_0_0_2;\n }\n {\n S_94783a2a memory r_1_3_0_0_0_3;\n {\n uint32 r_1_3_0_0_0_3_0 = 3650270403;\n r_1_3_0_0_0_3.s_0 = r_1_3_0_0_0_3_0;\n }\n {\n bool r_1_3_0_0_0_3_1 = true;\n r_1_3_0_0_0_3.s_1 = r_1_3_0_0_0_3_1;\n }\n {\n bytes23 r_1_3_0_0_0_3_2 = bytes23(0x663a0063fefaa66598e876859a71d5de946d82957f06b4);\n r_1_3_0_0_0_3.s_2 = r_1_3_0_0_0_3_2;\n }\n r_1_3_0_0_0.s_3 = r_1_3_0_0_0_3;\n }\n r_1_3_0_0.s_0 = r_1_3_0_0_0;\n }\n r_1_3_0.s_0 = r_1_3_0_0;\n }\n {\n string[3] memory r_1_3_0_1;\n {\n string memory r_1_3_0_1_0 = unicode\"Moo é🚀é🚀 ééo oé🚀 oééo Mo é\";\n r_1_3_0_1[0] = r_1_3_0_1_0;\n }\n {\n string memory r_1_3_0_1_1 = unicode\"Moo é🚀o o Mo oooo🚀MMééo🚀é🚀oéo🚀MMé🚀oé🚀Mo🚀🚀o🚀é o🚀 🚀oéMéMé oooé\";\n r_1_3_0_1[1] = r_1_3_0_1_1;\n }\n {\n string memory r_1_3_0_1_2 = unicode\"Moo é🚀 o MMo\";\n r_1_3_0_1[2] = r_1_3_0_1_2;\n }\n r_1_3_0.s_1 = r_1_3_0_1;\n }\n {\n bytes2 r_1_3_0_2 = bytes2(0x3257);\n r_1_3_0.s_2 = r_1_3_0_2;\n }\n {\n bytes11 r_1_3_0_3 = bytes11(0xaf7de65e1e61a0a79005ef);\n r_1_3_0.s_3 = r_1_3_0_3;\n }\n r_1_3.s_0 = r_1_3_0;\n }\n {\n address r_1_3_1 = 0xef58Fa521967accD2aDC1f08e4f54b674B49E606;\n r_1_3.s_1 = r_1_3_1;\n }\n {\n S_5df7cbdd memory r_1_3_2;\n {\n uint216 r_1_3_2_0 = 50134414082692195463601619161210169859173079101287930974986813554;\n r_1_3_2.s_0 = r_1_3_2_0;\n }\n {\n string memory r_1_3_2_1 = unicode\"Moo é🚀🚀ooo oo o\";\n r_1_3_2.s_1 = r_1_3_2_1;\n }\n {\n address[][3] memory r_1_3_2_2;\n {\n address[] memory r_1_3_2_2_0 = new address[](1);\n {\n address r_1_3_2_2_0_0 = 0x9ba234d960c530e916dF9B480cd9a27E8313A4b4;\n r_1_3_2_2_0[0] = r_1_3_2_2_0_0;\n }\n r_1_3_2_2[0] = r_1_3_2_2_0;\n }\n {\n address[] memory r_1_3_2_2_1 = new address[](4);\n {\n address r_1_3_2_2_1_0 = 0x0a0d79D1DeBce4d7CC269fF1Dc050c6c0aa62774;\n r_1_3_2_2_1[0] = r_1_3_2_2_1_0;\n }\n {\n address r_1_3_2_2_1_1 = 0xae743080325b1703fEdAB647b082bcDAB6EA6c43;\n r_1_3_2_2_1[1] = r_1_3_2_2_1_1;\n }\n {\n address r_1_3_2_2_1_2 = 0x5b102ab08a822322AD0b58100aB0bBe1EF4a12de;\n r_1_3_2_2_1[2] = r_1_3_2_2_1_2;\n }\n {\n address r_1_3_2_2_1_3 = 0x26325763D1972aBB32EB731B55535B99B130C1AD;\n r_1_3_2_2_1[3] = r_1_3_2_2_1_3;\n }\n r_1_3_2_2[1] = r_1_3_2_2_1;\n }\n {\n address[] memory r_1_3_2_2_2 = new address[](0);\n r_1_3_2_2[2] = r_1_3_2_2_2;\n }\n r_1_3_2.s_2 = r_1_3_2_2;\n }\n r_1_3.s_2 = r_1_3_2;\n }\n {\n address[2] memory r_1_3_3;\n {\n address r_1_3_3_0 = 0x69B0B6413055f14A9d1e061B8E606015c4854ba7;\n r_1_3_3[0] = r_1_3_3_0;\n }\n {\n address r_1_3_3_1 = 0xDF5291e1A43B02ea41fa9976e5E2C4A88014C377;\n r_1_3_3[1] = r_1_3_3_1;\n }\n r_1_3.s_3 = r_1_3_3;\n }\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n string memory r_2 = unicode\"Moo é🚀é o🚀éééééé🚀🚀o🚀oo🚀Méoé🚀é🚀M🚀🚀\";\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000203cf9a19df94e3887bb0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cce3dc32ec89f8340ea13dc664a6828966f9047e0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000eb7c5898a284ca8526b64c2a03a3f7a99b3a7a36000000000000000000000000f980632a2188f31454ffb9207965154b5fc58018ffffffffffffbcc8c71bb2edd8495a53e8eb9ca48cb032fdf81ce9244a9d3e03d7809e4d96d6b185b7eac7918e54f1050a44400e0d3e655c4f6a1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005db0ebf20000000000000000000000000000000000000000000000000000000000000001028237dccc4bdbd8b2c7f806b99b1241e1edec5b3501ff000000000000000000000000000000000000000000000000000000000000000000000000000000012010fb000000000000000000000000000000000000000000000000000000000000b680eeae2ad10c4698640f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a806f6f6ff09f9a806ff09f9a80206fc3a9200000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a804df09f9a80c3a96f6f4df09f9a804d6ff09f9a802020c3a96f6fc3a94dc3a96f204d6f4d6f204df09f9a80c3a9c3a94d204dc3a9c3a96f4d6f6fc3a9f09f9a80c3a9c3a9f09f9a8020000000000000000000000000000000000000df780913c4763bb0b872c6adb33aceeb1123de6fc7affafac4cd84000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a804dc3a96f6f4df09f9a804d4dc3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000008a9e7e7fb6142e27a0b8cf42fe3112fc6fe37e3f00000000000000000000000067c4d42e1080e9d3386a150bcc3973bb68939689000000000000000000000000458bf0cd9301c47a66648612b8c4e3497e36117c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000f0e2ddbe109772e33b1157f8d60e162939a1ad1c000000000000000000000000bb32a13a27b3df0e64a2c0c444997a8fc87469320000000000000000000000003bdb08f3a08ec371cfd6885ffcadec41a47c41d00000000000000000000000006084d44fc1ed03a980fd3510a56e88d2984818ac00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000005600501869f44bb0c0a6729e8340c20603d0f7d60000000000000000000000000000000000000000000000000000000000000380000000000000000000000000cad0178a692d302067dabbb0321ad75e055d4580000000000000000000000000928ef1e75148d028e73b8a10a54a6bb6f59262660000000000002c878173a54c81f3d713d42f30cfe2ab7d571a9794780513251d9985e2f6ce9f3ced607c0120d3e0656b15f87f8a3b1712f53cd144000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066516b9b00000000000000000000000000000000000000000000000000000000000000016fda9f56604a784bc6a56b465bbbd229d63fccdcf775fa00000000000000000000000000000000000000000000000000000000000000000000000000000001204d3e000000000000000000000000000000000000000000000000000000000000533ab9f15dbc0c74f840a5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a80204d6f4d6f20c3a96f6fc3a96f6fc3a920c3a9c3a96f4dc3a94dc3a96ff09f9a806f20206f6f2020204d206ff09f9a806f4d6f4dc3a96f206fc3a9c3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a806ff09f9a80206fc3a96f204d6f6f204d4d6f6ff09f9a8020f09f9a80c3a920206f6f6f6f4d4d4df09f9a806ff09f9a80f09f9a80c3a920f09f9a806fc3a96f6f6f4d6ff09f9a8020f09f9a804d4d4d20c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80f09f9a80206f4d4d6ff09f9a80f09f9a80f09f9a806f20f09f9a804d204d204d6ff09f9a806f000000000000000000000000000000000000000000a33d4269522979a6be5aff8d28f62830e530d857e75bb80e8c0430000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806f6f6f4d6fc3a96fc3a920c3a96f206f4d204d4dc3a9f09f9a80f09f9a80c3a96fc3a920c3a920f09f9a804d6ff09f9a802020c3a94d6ff09f9a80c3a9f09f9a804df09f9a80c3a9c3a96ff09f9a804dc3a9000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a16a5ac73a584c0cad9b4921012e877c2bbac2cf000000000000000000000000548726cc2c0364508e385cc7f57a16727bf944a50000000000000000000000006108947ede11b4cacb57b1d1724266989d6cdd71000000000000000000000000ee7b17a612cb573c6feeaebab9323751476087f5000000000000000000000000000000000000000000000000000000000000000400000000000000000000000060c956c9aa3835e4d14b0aacb8609ef9971a4d460000000000000000000000003a0a357b9bdc3bf03217d81ed47d493b1543ca5f000000000000000000000000db1d29105e4689c0933aebf5ba0e89f9ad76949b00000000000000000000000024cb70c15efc56bcd5add3e3671a9a8978a9b8900000000000000000000000000000000000000000000000000000000000000003000000000000000000000000d03a27c18aea1101d50c04fdee10dd4d63062a000000000000000000000000002dd5405cad20bab8f4f993b51888dc63096cd55a00000000000000000000000093f2eb8b3eaf1d7648e115f570d6245e2ae84ec600000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002f613d650eed8d3a21bb1c1391024dea68e21b6900000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000df4204bfaae9b2bce18e2906cd1b13aea534d0f000000000000000000000000048c8fb0657762c4f8bc77ecd2be95c6968e5dff30000000000003bf7a6ef8296b39bf713e97416b793ebd5a4ef7f4ddc2122452bf24afb2cc363c314ea945946b23c0571d199e753f1603d1c124e7000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000006cb82ebe00000000000000000000000000000000000000000000000000000000000000009df6368d4445b361b6f07f7c8c8496544b91ac7b7fc9f20000000000000000000000000000000000000000000000000000000000000000000000000000000120a64f000000000000000000000000000000000000000000000000000000000000740f4ba74871bc9ec2550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000714d6f6f20c3a9f09f9a80206ff09f9a806fc3a920c3a96fc3a920c3a9f09f9a806f6f20f09f9a80c3a94df09f9a80c3a9f09f9a806f20c3a94df09f9a8020f09f9a806fc3a9c3a96ff09f9a80204d6f6f6f6f20f09f9a804dc3a96fc3a9c3a920206ff09f9a806f20f09f9a806f4d20c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a8020c3a9c3a9206f6fc3a96f4d206fc3a96f6f4d6fc3a9f09f9a80f09f9a80f09f9a806f6ff09f9a806f20f09f9a804d4d6f6fc3a9200000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80c3a9f09f9a806f6ff09f9a8020f09f9a804d20f09f9a80f09f9a80c3a9c3a9f09f9a806ff09f9a806f6fc3a9f09f9a80f09f9a80c3a9f09f9a80206f000000000000000000000000000000000000000000000000000000000000007ebe4d380bd5601bc35ddb3f1d85fb9138e73233aa79b353c054da000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a80f09f9a804d6f6fc3a96fc3a9f09f9a804df09f9a8020f09f9a80c3a9206ff09f9a806f6f6f6fc3a96f206fc3a920c3a92020c3a9f09f9a806f4d6f20206f6f2020c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000cf2caeb584c2a4dfb1af7f0d9e0fb845e8c8cf6e000000000000000000000000198ca6d056f46c8b29e6770ac709541583cae8aa000000000000000000000000fc944d122bc6bb86bb9d550dc8a607001defb91100000000000000000000000093f43e870af29c8fb5bb19331ca8246274399718000000000000000000000000000000000000000000000000000000000000000300000000000000000000000043558def06af7f3332e9bfc5e1a0e6e53811f16c000000000000000000000000d8c817a4915f5351a4b0f5dfa2bd6ef000aa4a43000000000000000000000000bce66483dc063409d649a347d866eb53686ce34500000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b395566e1cc2766c1546305dc668b3329e6ebb9000000000000000000000000383d1e6ebbcf38319261c73d1ab7b99a288ead6500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ef58fa521967accd2adc1f08e4f54b674b49e606000000000000000000000000000000000000000000000000000000000000036000000000000000000000000069b0b6413055f14a9d1e061b8e606015c4854ba7000000000000000000000000df5291e1a43b02ea41fa9976e5e2c4a88014c377ffffffffffff96cf90e9075a86fa177ae6ad1485f8987f38bc87226752e1484c47c5c88fc0be9b6396b84290b1fc7b35e0e869060492a9a3e8a3fe0000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000d992b4c30000000000000000000000000000000000000000000000000000000000000001663a0063fefaa66598e876859a71d5de946d82957f06b400000000000000000000000000000000000000000000000000000000000000000000000000000001203257000000000000000000000000000000000000000000000000000000000000af7de65e1e61a0a79005ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80c3a9f09f9a8020c3a9c3a96f206fc3a9f09f9a80206fc3a9c3a96f20204d6f2020c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d4d6f6f20c3a9f09f9a806f206f204d6f206f6f6f6ff09f9a804d4dc3a9c3a96ff09f9a80c3a9f09f9a806fc3a96ff09f9a804d4dc3a9f09f9a806fc3a9f09f9a804d6ff09f9a80f09f9a806ff09f9a80c3a9206ff09f9a802020f09f9a806fc3a94dc3a94dc3a9206f6f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a80206f20204d4d6f000000000000000000000000000000000000000079deb8f456d8e582d8016ed011ecc0d6393c5c78f1ffff7ebfc072000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a806f6f6f206f6f206f00000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009ba234d960c530e916df9b480cd9a27e8313a4b400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a0d79d1debce4d7cc269ff1dc050c6c0aa62774000000000000000000000000ae743080325b1703fedab647b082bcdab6ea6c430000000000000000000000005b102ab08a822322ad0b58100ab0bbe1ef4a12de00000000000000000000000026325763d1972abb32eb731b55535b99b130c1ad0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a80c3a9206ff09f9a80c3a9c3a9c3a9c3a9c3a9c3a9f09f9a80f09f9a806ff09f9a806f6ff09f9a804dc3a96fc3a9f09f9a80c3a9f09f9a804df09f9a80f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes2,address,(address,bytes4,(bool,bytes1),uint120,bytes13),bytes23,(address,(address,bytes32,address,bytes14[3][2]),bool[4],address[1],int136))", + "type": "(bytes2,address,(address,bytes4,(bool,bytes1),uint120,bytes13),bytes23,(address,(address,bytes32,address,bytes14[3][2]),bool[4],address[1],int136))", + "value": [ + "0x76b0", + "0x3F3F76BEBF4f431E9B51a748D2F96D3BBd96D743", + [ + "0x054F544b9d1294606157401CE18Da02f21FEA173", + "0x79904220", + [false, "0x8b"], + "1025546436232594542959493000688835848", + "0xea456fd2fd8500d2705bdb24df" + ], + "0xfda72977b964fe605d3bbdac5f8b33bb5164473c903486", + [ + "0x796D138062c6abb7c32a7F5462530C0212AFbbAe", + [ + "0x5Ee5C5e39A301e766BBAEe633396D5241b840ab5", + "0xc86903f18b84c6b6f48cfceca551150814defe2c7febf8089233e0df1a7f1175", + "0x3554c507c75b9B1390B9d6B2f5B1a8a5F5A8f7A1", + [ + [ + "0x42f1765f26792e20e55543de11bf", + "0x6366a9500ceddce6bbb1d9b58efa", + "0xadc81507ee5fb146d4a1d78396d6" + ], + [ + "0xd36d89c7fa82695cdf55a83adf89", + "0xd2d408132a392e34290a3b13dcc2", + "0x31ae5dc3486ccf8729d461194bc6" + ] + ] + ], + [true, true, true, true], + ["0x30D442c6a86e23E539C9Bb75ab10161c7F21020c"], + "22564925728339677287236097601267203561700" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x76b0" + }, + { + "type": "address", + "value": "0x3F3F76BEBF4f431E9B51a748D2F96D3BBd96D743" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x054F544b9d1294606157401CE18Da02f21FEA173" + }, + { + "type": "hexstring", + "value": "0x79904220" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x8b" + } + ] + }, + { + "type": "number", + "value": "1025546436232594542959493000688835848" + }, + { + "type": "hexstring", + "value": "0xea456fd2fd8500d2705bdb24df" + } + ] + }, + { + "type": "hexstring", + "value": "0xfda72977b964fe605d3bbdac5f8b33bb5164473c903486" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x796D138062c6abb7c32a7F5462530C0212AFbbAe" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5Ee5C5e39A301e766BBAEe633396D5241b840ab5" + }, + { + "type": "hexstring", + "value": "0xc86903f18b84c6b6f48cfceca551150814defe2c7febf8089233e0df1a7f1175" + }, + { + "type": "address", + "value": "0x3554c507c75b9B1390B9d6B2f5B1a8a5F5A8f7A1" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x42f1765f26792e20e55543de11bf" + }, + { + "type": "hexstring", + "value": "0x6366a9500ceddce6bbb1d9b58efa" + }, + { + "type": "hexstring", + "value": "0xadc81507ee5fb146d4a1d78396d6" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd36d89c7fa82695cdf55a83adf89" + }, + { + "type": "hexstring", + "value": "0xd2d408132a392e34290a3b13dcc2" + }, + { + "type": "hexstring", + "value": "0x31ae5dc3486ccf8729d461194bc6" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x30D442c6a86e23E539C9Bb75ab10161c7F21020c" + } + ] + }, + { + "type": "number", + "value": "22564925728339677287236097601267203561700" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610689806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061057b565b60405180910390f35b6100566102e9565b61005e6102e9565b61076b60f41b8152733f3f76bebf4f431e9b51a748d2f96d3bbd96d7436020808301919091526040805160a08101825260008082528184018181528351808501855282815280860183905283850190815260608085018481526080860185815273054f544b9d1294606157401ce18da02f21fea17387526303cc821160e51b90945286518088018852948552608b60f81b978501979097529290526ec58357d72c73bc231de3036b801d089094526cea456fd2fd8500d2705bdb24df60981b909352908301527ffda72977b964fe605d3bbdac5f8b33bb5164473c9034860000000000000000009082015261015161034f565b73796d138062c6abb7c32a7f5462530c0212afbbae8152610170610399565b735ee5c5e39a301e766bbaee633396d5241b840ab581527fc86903f18b84c6b6f48cfceca551150814defe2c7febf8089233e0df1a7f11756020820152733554c507c75b9b1390b9d6b2f5b1a8a5f5a8f7a160408201526101cf6103be565b6101d76103eb565b6d42f1765f26792e20e55543de11bf60901b81526d31b354a80676ee735dd8ecdac77d60911b60208201526d56e40a83f72fd8a36a50ebc1cb6b60911b604082015281526102236103eb565b6dd36d89c7fa82695cdf55a83adf8960901b81526d696a0409951c971a14851d89ee6160911b6020808301919091526d18d72ee1a43667c394ea308ca5e360911b6040830152828101919091526060830191909152820152610283610409565b600180825260208201819052604080830182905260608301919091528201526102aa610427565b7330d442c6a86e23e539c9bb75ab10161c7f21020c8152606082015270424ff69d84d8d46959e91522e2bfdbd8e4608080830191909152820152919050565b6040805160a0808201835260008083526020808401829052845192830185528183528281018290528451808601865282815290810182905282850152606082018190526080820152909182019081526000602082015260400161034a61034f565b905290565b6040518060a0016040528060006001600160a01b03168152602001610372610399565b815260200161037f610409565b815260200161038c610427565b8152600060209091015290565b60408051608081018252600080825260208201819052918101919091526060810161034a5b60405180604001604052806002905b6103d56103eb565b8152602001906001900390816103cd5790505090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b8060005b600481101561046a5781511515845260209384019390910190600101610449565b50505050565b8060005b600181101561046a5781516001600160a01b0316845260209384019390910190600101610474565b60018060a01b038082511683526020808301518281511682860152818101516040860152604081015160608482168188015280830151945060808701925060009150815b600281101561053357855184845b600381101561052057825171ffffffffffffffffffffffffffffffffffff1916825291870191908701906001016104ee565b50505094840194928101926001016104e0565b5060408601519450610549610140880186610445565b8501519350610560925050506101c0840182610470565b5060808101516105766101e084018260100b9052565b505050565b81516001600160f01b03191681526020808301516001600160a01b0390811682840152604080850151805190921681850152818301516001600160e01b03191660608086019190915290820151805115156080808701919091529301516001600160f81b03191660a0850152808201516effffffffffffffffffffffffffffff1660c08501529082015172ffffffffffffffffffffffffffffffffffffff191660e084015283015168ffffffffffffffffff191661010083015282015161032082019061064c61012084018261049c565b509291505056fea2646970667358221220c50c9c634edae623d22a7635d6d4fd754cf1c00028f7735cc6dda0c67f424f2764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_77880394 {\n bool s_0;\n bytes1 s_1;\n }\n\n struct S_52454aca {\n address s_0;\n bytes4 s_1;\n S_77880394 s_2;\n uint120 s_3;\n bytes13 s_4;\n }\n\n struct S_1d3cd2dc {\n address s_0;\n bytes32 s_1;\n address s_2;\n bytes14[3][2] s_3;\n }\n\n struct S_3b00f4dc {\n address s_0;\n S_1d3cd2dc s_1;\n bool[4] s_2;\n address[1] s_3;\n int136 s_4;\n }\n\n struct S_0ef3815e {\n bytes2 s_0;\n address s_1;\n S_52454aca s_2;\n bytes23 s_3;\n S_3b00f4dc s_4;\n }\n\n function test () public pure returns (S_0ef3815e memory) {\n S_0ef3815e memory r;\n {\n bytes2 r_0 = bytes2(0x76b0);\n r.s_0 = r_0;\n }\n {\n address r_1 = 0x3F3F76BEBF4f431E9B51a748D2F96D3BBd96D743;\n r.s_1 = r_1;\n }\n {\n S_52454aca memory r_2;\n {\n address r_2_0 = 0x054F544b9d1294606157401CE18Da02f21FEA173;\n r_2.s_0 = r_2_0;\n }\n {\n bytes4 r_2_1 = bytes4(0x79904220);\n r_2.s_1 = r_2_1;\n }\n {\n S_77880394 memory r_2_2;\n {\n bool r_2_2_0 = false;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n bytes1 r_2_2_1 = bytes1(0x8b);\n r_2_2.s_1 = r_2_2_1;\n }\n r_2.s_2 = r_2_2;\n }\n {\n uint120 r_2_3 = 1025546436232594542959493000688835848;\n r_2.s_3 = r_2_3;\n }\n {\n bytes13 r_2_4 = bytes13(0xea456fd2fd8500d2705bdb24df);\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n bytes23 r_3 = bytes23(0xfda72977b964fe605d3bbdac5f8b33bb5164473c903486);\n r.s_3 = r_3;\n }\n {\n S_3b00f4dc memory r_4;\n {\n address r_4_0 = 0x796D138062c6abb7c32a7F5462530C0212AFbbAe;\n r_4.s_0 = r_4_0;\n }\n {\n S_1d3cd2dc memory r_4_1;\n {\n address r_4_1_0 = 0x5Ee5C5e39A301e766BBAEe633396D5241b840ab5;\n r_4_1.s_0 = r_4_1_0;\n }\n {\n bytes32 r_4_1_1 = bytes32(0xc86903f18b84c6b6f48cfceca551150814defe2c7febf8089233e0df1a7f1175);\n r_4_1.s_1 = r_4_1_1;\n }\n {\n address r_4_1_2 = 0x3554c507c75b9B1390B9d6B2f5B1a8a5F5A8f7A1;\n r_4_1.s_2 = r_4_1_2;\n }\n {\n bytes14[3][2] memory r_4_1_3;\n {\n bytes14[3] memory r_4_1_3_0;\n {\n bytes14 r_4_1_3_0_0 = bytes14(0x42f1765f26792e20e55543de11bf);\n r_4_1_3_0[0] = r_4_1_3_0_0;\n }\n {\n bytes14 r_4_1_3_0_1 = bytes14(0x6366a9500ceddce6bbb1d9b58efa);\n r_4_1_3_0[1] = r_4_1_3_0_1;\n }\n {\n bytes14 r_4_1_3_0_2 = bytes14(0xadc81507ee5fb146d4a1d78396d6);\n r_4_1_3_0[2] = r_4_1_3_0_2;\n }\n r_4_1_3[0] = r_4_1_3_0;\n }\n {\n bytes14[3] memory r_4_1_3_1;\n {\n bytes14 r_4_1_3_1_0 = bytes14(0xd36d89c7fa82695cdf55a83adf89);\n r_4_1_3_1[0] = r_4_1_3_1_0;\n }\n {\n bytes14 r_4_1_3_1_1 = bytes14(0xd2d408132a392e34290a3b13dcc2);\n r_4_1_3_1[1] = r_4_1_3_1_1;\n }\n {\n bytes14 r_4_1_3_1_2 = bytes14(0x31ae5dc3486ccf8729d461194bc6);\n r_4_1_3_1[2] = r_4_1_3_1_2;\n }\n r_4_1_3[1] = r_4_1_3_1;\n }\n r_4_1.s_3 = r_4_1_3;\n }\n r_4.s_1 = r_4_1;\n }\n {\n bool[4] memory r_4_2;\n {\n bool r_4_2_0 = true;\n r_4_2[0] = r_4_2_0;\n }\n {\n bool r_4_2_1 = true;\n r_4_2[1] = r_4_2_1;\n }\n {\n bool r_4_2_2 = true;\n r_4_2[2] = r_4_2_2;\n }\n {\n bool r_4_2_3 = true;\n r_4_2[3] = r_4_2_3;\n }\n r_4.s_2 = r_4_2;\n }\n {\n address[1] memory r_4_3;\n {\n address r_4_3_0 = 0x30D442c6a86e23E539C9Bb75ab10161c7F21020c;\n r_4_3[0] = r_4_3_0;\n }\n r_4.s_3 = r_4_3;\n }\n {\n int136 r_4_4 = 22564925728339677287236097601267203561700;\n r_4.s_4 = r_4_4;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x76b00000000000000000000000000000000000000000000000000000000000000000000000000000000000003f3f76bebf4f431e9b51a748d2f96d3bbd96d743000000000000000000000000054f544b9d1294606157401ce18da02f21fea173799042200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c58357d72c73bc231de3036b801d08ea456fd2fd8500d2705bdb24df00000000000000000000000000000000000000fda72977b964fe605d3bbdac5f8b33bb5164473c903486000000000000000000000000000000000000000000796d138062c6abb7c32a7f5462530c0212afbbae0000000000000000000000005ee5c5e39a301e766bbaee633396d5241b840ab5c86903f18b84c6b6f48cfceca551150814defe2c7febf8089233e0df1a7f11750000000000000000000000003554c507c75b9b1390b9d6b2f5b1a8a5f5a8f7a142f1765f26792e20e55543de11bf0000000000000000000000000000000000006366a9500ceddce6bbb1d9b58efa000000000000000000000000000000000000adc81507ee5fb146d4a1d78396d6000000000000000000000000000000000000d36d89c7fa82695cdf55a83adf89000000000000000000000000000000000000d2d408132a392e34290a3b13dcc200000000000000000000000000000000000031ae5dc3486ccf8729d461194bc6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000030d442c6a86e23e539c9bb75ab10161c7f21020c000000000000000000000000000000424ff69d84d8d46959e91522e2bfdbd8e4" + }, + { + "name": "random-(uint64[],(uint112,(string[2],bool,string,bytes4),int184,bytes2[2],bytes20)[1],address[2],(bytes11,bool)[4],bool)[][2]", + "type": "(uint64[],(uint112,(string[2],bool,string,bytes4),int184,bytes2[2],bytes20)[1],address[2],(bytes11,bool)[4],bool)[][2]", + "value": [ + [], + [ + [ + [], + [ + [ + "2168309674635519289834040467556503", + [ + ["Moo é🚀 Moo🚀🚀é🚀🚀Mé🚀🚀M MoM🚀🚀ooééé Méo🚀", "Moo é🚀"], + false, + "Moo é🚀 oM éo🚀🚀 o ", + "0x2fea09a5" + ], + "783499682528676179965540489384191606492672511931549245", + ["0x02ec", "0xd610"], + "0x114612429b3ae1fab0602bcd8db486a8d5200ac3" + ] + ], + [ + "0x757a571F7dAb143891138d94D9d7A26daE1754af", + "0x1DA17106a15693EC1CFB7eC1A924C5C6B85B8Ed6" + ], + [ + ["0xd1fe69d986ac510ad6d04c", false], + ["0x24b6ea34176870c028d71f", false], + ["0x688c1660d8176fe4b67dbd", false], + ["0x44ff5820b17d450cb84099", true] + ], + true + ], + [ + [], + [ + [ + "2116535856143673809255732494889387", + [ + [ + "Moo é🚀🚀éé🚀 o ééé M🚀 éé🚀o🚀🚀MééMéMoo🚀Méé🚀é MéM🚀🚀🚀é oMMo o", + "Moo é🚀🚀M🚀oMo é🚀oooé oo " + ], + true, + "Moo é🚀o🚀oMo M🚀🚀é🚀 ", + "0x74f90bab" + ], + "10284111585956313908193614209681614157542633602231900645", + ["0x6df3", "0x6156"], + "0x257df5eb2b681b87ba618b14c98519af723c58a4" + ] + ], + [ + "0x649fF49E2355b82FFBeEf1bE1eD848613661948A", + "0x1eB75C9AE41E2377Fc279a294E91a2a649EE2549" + ], + [ + ["0xfad930cc2266f718adbcb1", false], + ["0xf4b4b728af82effb987b5d", true], + ["0xe514227da14cb411a572a4", true], + ["0x1ab57d44a1ff46e64f5269", false] + ], + false + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2168309674635519289834040467556503" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 Moo🚀🚀é🚀🚀Mé🚀🚀M MoM🚀🚀ooééé Méo🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 oM éo🚀🚀 o " + }, + { + "type": "hexstring", + "value": "0x2fea09a5" + } + ] + }, + { + "type": "number", + "value": "783499682528676179965540489384191606492672511931549245" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x02ec" + }, + { + "type": "hexstring", + "value": "0xd610" + } + ] + }, + { + "type": "hexstring", + "value": "0x114612429b3ae1fab0602bcd8db486a8d5200ac3" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x757a571F7dAb143891138d94D9d7A26daE1754af" + }, + { + "type": "address", + "value": "0x1DA17106a15693EC1CFB7eC1A924C5C6B85B8Ed6" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd1fe69d986ac510ad6d04c" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x24b6ea34176870c028d71f" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x688c1660d8176fe4b67dbd" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x44ff5820b17d450cb84099" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2116535856143673809255732494889387" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éé🚀 o ééé M🚀 éé🚀o🚀🚀MééMéMoo🚀Méé🚀é MéM🚀🚀🚀é oMMo o" + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀oMo é🚀oooé oo " + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀o🚀oMo M🚀🚀é🚀 " + }, + { + "type": "hexstring", + "value": "0x74f90bab" + } + ] + }, + { + "type": "number", + "value": "10284111585956313908193614209681614157542633602231900645" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6df3" + }, + { + "type": "hexstring", + "value": "0x6156" + } + ] + }, + { + "type": "hexstring", + "value": "0x257df5eb2b681b87ba618b14c98519af723c58a4" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x649fF49E2355b82FFBeEf1bE1eD848613661948A" + }, + { + "type": "address", + "value": "0x1eB75C9AE41E2377Fc279a294E91a2a649EE2549" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfad930cc2266f718adbcb1" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf4b4b728af82effb987b5d" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe514227da14cb411a572a4" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x1ab57d44a1ff46e64f5269" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610b3e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906108d1565b60405180910390f35b610056610567565b61005e610567565b604080516000808252602082019092528161008f565b61007c61058e565b8152602001906001900390816100745790505b5082525060408051600280825260608201909252600091816020015b6100b361058e565b8152602001906001900390816100ab5790505090506100d061058e565b60408051600081526020810190915281526100e96105cf565b6100f16105fc565b6d6ae7ea6cdea25d3b4d81ae7e8897815261010a610633565b610112610567565b60006040518060800160405280604a8152602001610a98604a9139825250604080518082018252600a8152689adede418753e13f3560b71b6020808301919091528084019190915291835260008383015280518082018252601e81527f4d6f6f20c3a9f09f9a8020206f4d2020c3a96ff09f9a80f09f9a80206f2000008184015283820152632fea09a560e01b60608401529083019190915276082e1c3cbda53268f0d3206b86b02e7aa1f8bb105f863d908201526101cf610661565b60bb60f21b8152610d6160f41b602080830191909152606083019190915273114612429b3ae1fab0602bcd8db486a8d5200ac360601b6080830152908252820152610218610661565b73757a571f7dab143891138d94d9d7a26dae1754af8152731da17106a15693ec1cfb7ec1a924c5c6b85b8ed66020820152604082015261025661067f565b604080518082018252600060208083018290526a347f9a7661ab1442b5b41360aa1b8352918452825180840184528083018290526a24b6ea34176870c028d71f60a81b815284830152825180840184528083018290526a688c1660d8176fe4b67dbd60a81b81528484015282518084019093526a44ff5820b17d450cb8409960a81b8352600191830182905260608085019390935291840192909252608083019190915282518291849161030c5761030c6109f1565b60200260200101819052505061032061058e565b60408051600081526020810190915281526103396105cf565b6103416105fc565b6d685a7031f9b1e95b2bb3ad1271ab815261035a610633565b610362610567565b60006040518060a00160405280606c8152602001610a08606c91398252506040805160608101909152602780825260009190610ae260208301396020808401919091529183525060018282015260408051606081019091526024808252600092610a74908301396040808401919091526374f90bab60e01b6060840152602084019290925250766b5f02b18b0f7f158070d8464a3da4dc9bbe9ead4d19e59082015261040c610661565b616df360f01b81526130ab60f11b602080830191909152606083019190915273095f7d7acada06e1ee9862c53261466bdc8f162960621b6080830152908252820152610456610661565b73649ff49e2355b82ffbeef1be1ed848613661948a8152731eb75c9ae41e2377fc279a294e91a2a649ee25496020820152604082015261049461067f565b604080518082018252600060208083018290526afad930cc2266f718adbcb160a81b8352918452825180840184526af4b4b728af82effb987b5d60a81b8152600181840181905285840191909152835180850185526a3945089f68532d04695ca960aa1b81528084018290528585015283518085019094529183018190526a1ab57d44a1ff46e64f526960a81b8352606080850193909352918401929092526080830152825182918491811061054c5761054c6109f1565b60209081029190910101525080826001602002015250919050565b60405180604001604052806002905b60608152602001906001900390816105765790505090565b6040518060a00160405280606081526020016105a86105cf565b81526020016105b5610661565b81526020016105c261067f565b8152600060209091015290565b60405180602001604052806001905b6105e66105fc565b8152602001906001900390816105de5790505090565b6040518060a0016040528060006001600160701b0316815260200161061f610633565b8152600060208201526040016105c2610661565b6040518060800160405280610646610567565b81526000602082018190526060604083018190529091015290565b60405180604001604052806002906020820280368337509192915050565b60405180608001604052806004905b604080518082019091526000808252602082015281526020019060019003908161068e5790505090565b6000815180845260005b818110156106de576020818501810151868301820152016106c2565b818111156106f0576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60028110156107325781516001600160f01b031916845260209384019390910190600101610709565b50505050565b6000826020808201846000805b6001808210610754575061085d565b8685038a52835180516001600160701b031686528681015160c088880181905281516080918901829052610140890192916101808a019190885b60028110156107bd5761013f198c85030186526107ac8484516106b8565b958d01959350918c0191870161078e565b508b840151151560e08c01526040808501518c850360bf19016101008e015290975094506107eb83866106b8565b6060948501516001600160e01b0319166101208d015286880151601681900b898e0152909550939250828601519650610826838c0188610705565b8501516bffffffffffffffffffffffff19811660a08c0152955061084992505050565b9a87019a9550505091840191600101610745565b5091979650505050505050565b8060005b60028110156107325781516001600160a01b031684526020938401939091019060010161086e565b8060005b600481101561073257815180516001600160a81b03191685526020908101511515818601526040909401939091019060010161089a565b60208082526000906060830183820185845b60028110156109e557601f1987850381018452825180518087529087019087870190600581901b8801890160005b828110156109ce5789820386018452845180516101a080855281519085018190526101c08501918e01906000905b8082101561096957825167ffffffffffffffff168452928f0192918f01916001919091019061093f565b5050508c8201518482038e8601526109818282610738565b9150506040808301516109968287018261086a565b5050606082015160806109ab81870183610896565b92909201518015156101808601529150958c0195948c0194925050600101610911565b5097505050938601935050908401906001016108e3565b50919695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9f09f9a80206f20c3a9c3a9c3a9204df09f9a8020c3a9c3a9f09f9a806ff09f9a80f09f9a804dc3a9c3a94dc3a94d6f6ff09f9a804dc3a9c3a9f09f9a80c3a9204dc3a94df09f9a80f09f9a80f09f9a80c3a920206f4d4d6f206f4d6f6f20c3a9f09f9a806ff09f9a806f4d6f204df09f9a80f09f9a80c3a9f09f9a8020204d6f6f20c3a9f09f9a8020204d6f6ff09f9a80f09f9a80c3a9f09f9a80f09f9a804dc3a9f09f9a80f09f9a804d204d6f4df09f9a80f09f9a806f6fc3a9c3a9c3a9204dc3a96ff09f9a804d6f6f20c3a9f09f9a80f09f9a804df09f9a806f4d6f2020c3a9f09f9a806f6f6fc3a9206f6f20a2646970667358221220f15f7f88c0671f8a5a6d5f23147ac7dccc22ad8e2d1a733887be914d1e648e1964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_d0769f15 {\n string[2] s_0;\n bool s_1;\n string s_2;\n bytes4 s_3;\n }\n\n struct S_04f74023 {\n uint112 s_0;\n S_d0769f15 s_1;\n int184 s_2;\n bytes2[2] s_3;\n bytes20 s_4;\n }\n\n struct S_623cd789 {\n bytes11 s_0;\n bool s_1;\n }\n\n struct S_68edc32d {\n uint64[] s_0;\n S_04f74023[1] s_1;\n address[2] s_2;\n S_623cd789[4] s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_68edc32d[][2] memory) {\n S_68edc32d[][2] memory r;\n {\n S_68edc32d[] memory r_0 = new S_68edc32d[](0);\n r[0] = r_0;\n }\n {\n S_68edc32d[] memory r_1 = new S_68edc32d[](2);\n {\n S_68edc32d memory r_1_0;\n {\n uint64[] memory r_1_0_0 = new uint64[](0);\n r_1_0.s_0 = r_1_0_0;\n }\n {\n S_04f74023[1] memory r_1_0_1;\n {\n S_04f74023 memory r_1_0_1_0;\n {\n uint112 r_1_0_1_0_0 = 2168309674635519289834040467556503;\n r_1_0_1_0.s_0 = r_1_0_1_0_0;\n }\n {\n S_d0769f15 memory r_1_0_1_0_1;\n {\n string[2] memory r_1_0_1_0_1_0;\n {\n string memory r_1_0_1_0_1_0_0 = unicode\"Moo é🚀 Moo🚀🚀é🚀🚀Mé🚀🚀M MoM🚀🚀ooééé Méo🚀\";\n r_1_0_1_0_1_0[0] = r_1_0_1_0_1_0_0;\n }\n {\n string memory r_1_0_1_0_1_0_1 = unicode\"Moo é🚀\";\n r_1_0_1_0_1_0[1] = r_1_0_1_0_1_0_1;\n }\n r_1_0_1_0_1.s_0 = r_1_0_1_0_1_0;\n }\n {\n bool r_1_0_1_0_1_1 = false;\n r_1_0_1_0_1.s_1 = r_1_0_1_0_1_1;\n }\n {\n string memory r_1_0_1_0_1_2 = unicode\"Moo é🚀 oM éo🚀🚀 o \";\n r_1_0_1_0_1.s_2 = r_1_0_1_0_1_2;\n }\n {\n bytes4 r_1_0_1_0_1_3 = bytes4(0x2fea09a5);\n r_1_0_1_0_1.s_3 = r_1_0_1_0_1_3;\n }\n r_1_0_1_0.s_1 = r_1_0_1_0_1;\n }\n {\n int184 r_1_0_1_0_2 = 783499682528676179965540489384191606492672511931549245;\n r_1_0_1_0.s_2 = r_1_0_1_0_2;\n }\n {\n bytes2[2] memory r_1_0_1_0_3;\n {\n bytes2 r_1_0_1_0_3_0 = bytes2(0x02ec);\n r_1_0_1_0_3[0] = r_1_0_1_0_3_0;\n }\n {\n bytes2 r_1_0_1_0_3_1 = bytes2(0xd610);\n r_1_0_1_0_3[1] = r_1_0_1_0_3_1;\n }\n r_1_0_1_0.s_3 = r_1_0_1_0_3;\n }\n {\n bytes20 r_1_0_1_0_4 = bytes20(0x114612429b3AE1FAB0602BCd8db486a8D5200Ac3);\n r_1_0_1_0.s_4 = r_1_0_1_0_4;\n }\n r_1_0_1[0] = r_1_0_1_0;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address[2] memory r_1_0_2;\n {\n address r_1_0_2_0 = 0x757a571F7dAb143891138d94D9d7A26daE1754af;\n r_1_0_2[0] = r_1_0_2_0;\n }\n {\n address r_1_0_2_1 = 0x1DA17106a15693EC1CFB7eC1A924C5C6B85B8Ed6;\n r_1_0_2[1] = r_1_0_2_1;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n {\n S_623cd789[4] memory r_1_0_3;\n {\n S_623cd789 memory r_1_0_3_0;\n {\n bytes11 r_1_0_3_0_0 = bytes11(0xd1fe69d986ac510ad6d04c);\n r_1_0_3_0.s_0 = r_1_0_3_0_0;\n }\n {\n bool r_1_0_3_0_1 = false;\n r_1_0_3_0.s_1 = r_1_0_3_0_1;\n }\n r_1_0_3[0] = r_1_0_3_0;\n }\n {\n S_623cd789 memory r_1_0_3_1;\n {\n bytes11 r_1_0_3_1_0 = bytes11(0x24b6ea34176870c028d71f);\n r_1_0_3_1.s_0 = r_1_0_3_1_0;\n }\n {\n bool r_1_0_3_1_1 = false;\n r_1_0_3_1.s_1 = r_1_0_3_1_1;\n }\n r_1_0_3[1] = r_1_0_3_1;\n }\n {\n S_623cd789 memory r_1_0_3_2;\n {\n bytes11 r_1_0_3_2_0 = bytes11(0x688c1660d8176fe4b67dbd);\n r_1_0_3_2.s_0 = r_1_0_3_2_0;\n }\n {\n bool r_1_0_3_2_1 = false;\n r_1_0_3_2.s_1 = r_1_0_3_2_1;\n }\n r_1_0_3[2] = r_1_0_3_2;\n }\n {\n S_623cd789 memory r_1_0_3_3;\n {\n bytes11 r_1_0_3_3_0 = bytes11(0x44ff5820b17d450cb84099);\n r_1_0_3_3.s_0 = r_1_0_3_3_0;\n }\n {\n bool r_1_0_3_3_1 = true;\n r_1_0_3_3.s_1 = r_1_0_3_3_1;\n }\n r_1_0_3[3] = r_1_0_3_3;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n {\n bool r_1_0_4 = true;\n r_1_0.s_4 = r_1_0_4;\n }\n r_1[0] = r_1_0;\n }\n {\n S_68edc32d memory r_1_1;\n {\n uint64[] memory r_1_1_0 = new uint64[](0);\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_04f74023[1] memory r_1_1_1;\n {\n S_04f74023 memory r_1_1_1_0;\n {\n uint112 r_1_1_1_0_0 = 2116535856143673809255732494889387;\n r_1_1_1_0.s_0 = r_1_1_1_0_0;\n }\n {\n S_d0769f15 memory r_1_1_1_0_1;\n {\n string[2] memory r_1_1_1_0_1_0;\n {\n string memory r_1_1_1_0_1_0_0 = unicode\"Moo é🚀🚀éé🚀 o ééé M🚀 éé🚀o🚀🚀MééMéMoo🚀Méé🚀é MéM🚀🚀🚀é oMMo o\";\n r_1_1_1_0_1_0[0] = r_1_1_1_0_1_0_0;\n }\n {\n string memory r_1_1_1_0_1_0_1 = unicode\"Moo é🚀🚀M🚀oMo é🚀oooé oo \";\n r_1_1_1_0_1_0[1] = r_1_1_1_0_1_0_1;\n }\n r_1_1_1_0_1.s_0 = r_1_1_1_0_1_0;\n }\n {\n bool r_1_1_1_0_1_1 = true;\n r_1_1_1_0_1.s_1 = r_1_1_1_0_1_1;\n }\n {\n string memory r_1_1_1_0_1_2 = unicode\"Moo é🚀o🚀oMo M🚀🚀é🚀 \";\n r_1_1_1_0_1.s_2 = r_1_1_1_0_1_2;\n }\n {\n bytes4 r_1_1_1_0_1_3 = bytes4(0x74f90bab);\n r_1_1_1_0_1.s_3 = r_1_1_1_0_1_3;\n }\n r_1_1_1_0.s_1 = r_1_1_1_0_1;\n }\n {\n int184 r_1_1_1_0_2 = 10284111585956313908193614209681614157542633602231900645;\n r_1_1_1_0.s_2 = r_1_1_1_0_2;\n }\n {\n bytes2[2] memory r_1_1_1_0_3;\n {\n bytes2 r_1_1_1_0_3_0 = bytes2(0x6df3);\n r_1_1_1_0_3[0] = r_1_1_1_0_3_0;\n }\n {\n bytes2 r_1_1_1_0_3_1 = bytes2(0x6156);\n r_1_1_1_0_3[1] = r_1_1_1_0_3_1;\n }\n r_1_1_1_0.s_3 = r_1_1_1_0_3;\n }\n {\n bytes20 r_1_1_1_0_4 = bytes20(0x257df5EB2B681B87ba618B14C98519af723c58a4);\n r_1_1_1_0.s_4 = r_1_1_1_0_4;\n }\n r_1_1_1[0] = r_1_1_1_0;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address[2] memory r_1_1_2;\n {\n address r_1_1_2_0 = 0x649fF49E2355b82FFBeEf1bE1eD848613661948A;\n r_1_1_2[0] = r_1_1_2_0;\n }\n {\n address r_1_1_2_1 = 0x1eB75C9AE41E2377Fc279a294E91a2a649EE2549;\n r_1_1_2[1] = r_1_1_2_1;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n {\n S_623cd789[4] memory r_1_1_3;\n {\n S_623cd789 memory r_1_1_3_0;\n {\n bytes11 r_1_1_3_0_0 = bytes11(0xfad930cc2266f718adbcb1);\n r_1_1_3_0.s_0 = r_1_1_3_0_0;\n }\n {\n bool r_1_1_3_0_1 = false;\n r_1_1_3_0.s_1 = r_1_1_3_0_1;\n }\n r_1_1_3[0] = r_1_1_3_0;\n }\n {\n S_623cd789 memory r_1_1_3_1;\n {\n bytes11 r_1_1_3_1_0 = bytes11(0xf4b4b728af82effb987b5d);\n r_1_1_3_1.s_0 = r_1_1_3_1_0;\n }\n {\n bool r_1_1_3_1_1 = true;\n r_1_1_3_1.s_1 = r_1_1_3_1_1;\n }\n r_1_1_3[1] = r_1_1_3_1;\n }\n {\n S_623cd789 memory r_1_1_3_2;\n {\n bytes11 r_1_1_3_2_0 = bytes11(0xe514227da14cb411a572a4);\n r_1_1_3_2.s_0 = r_1_1_3_2_0;\n }\n {\n bool r_1_1_3_2_1 = true;\n r_1_1_3_2.s_1 = r_1_1_3_2_1;\n }\n r_1_1_3[2] = r_1_1_3_2;\n }\n {\n S_623cd789 memory r_1_1_3_3;\n {\n bytes11 r_1_1_3_3_0 = bytes11(0x1ab57d44a1ff46e64f5269);\n r_1_1_3_3.s_0 = r_1_1_3_3_0;\n }\n {\n bool r_1_1_3_3_1 = false;\n r_1_1_3_3.s_1 = r_1_1_3_3_1;\n }\n r_1_1_3[3] = r_1_1_3_3;\n }\n r_1_1.s_3 = r_1_1_3;\n }\n {\n bool r_1_1_4 = false;\n r_1_1.s_4 = r_1_1_4;\n }\n r_1[1] = r_1_1;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000757a571f7dab143891138d94d9d7a26dae1754af0000000000000000000000001da17106a15693ec1cfb7ec1a924c5c6b85b8ed6d1fe69d986ac510ad6d04c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024b6ea34176870c028d71f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000688c1660d8176fe4b67dbd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044ff5820b17d450cb8409900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000006ae7ea6cdea25d3b4d81ae7e889700000000000000000000000000000000000000000000000000000000000000c0000000000000000000082e1c3cbda53268f0d3206b86b02e7aa1f8bb105f863d02ec000000000000000000000000000000000000000000000000000000000000d610000000000000000000000000000000000000000000000000000000000000114612429b3ae1fab0602bcd8db486a8d5200ac30000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001802fea09a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a8020204d6f6ff09f9a80f09f9a80c3a9f09f9a80f09f9a804dc3a9f09f9a80f09f9a804d204d6f4df09f9a80f09f9a806f6fc3a9c3a9c3a9204dc3a96ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a8020206f4d2020c3a96ff09f9a80f09f9a80206f20000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000649ff49e2355b82ffbeef1be1ed848613661948a0000000000000000000000001eb75c9ae41e2377fc279a294e91a2a649ee2549fad930cc2266f718adbcb10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4b4b728af82effb987b5d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e514227da14cb411a572a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011ab57d44a1ff46e64f52690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000685a7031f9b1e95b2bb3ad1271ab00000000000000000000000000000000000000000000000000000000000000c00000000000000000006b5f02b18b0f7f158070d8464a3da4dc9bbe9ead4d19e56df30000000000000000000000000000000000000000000000000000000000006156000000000000000000000000000000000000000000000000000000000000257df5eb2b681b87ba618b14c98519af723c58a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001c074f90bab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006c4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a9f09f9a80206f20c3a9c3a9c3a9204df09f9a8020c3a9c3a9f09f9a806ff09f9a80f09f9a804dc3a9c3a94dc3a94d6f6ff09f9a804dc3a9c3a9f09f9a80c3a9204dc3a94df09f9a80f09f9a80f09f9a80c3a920206f4d4d6f206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a80f09f9a804df09f9a806f4d6f2020c3a9f09f9a806f6f6fc3a9206f6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a806ff09f9a806f4d6f204df09f9a80f09f9a80c3a9f09f9a80202000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,((string,bytes17,(address),bytes19[3][3],int152[3]),bytes19,(string,(address,string,address,string[2]),bool),bytes28),(address,string[4]))[4]", + "type": "(bool,((string,bytes17,(address),bytes19[3][3],int152[3]),bytes19,(string,(address,string,address,string[2]),bool),bytes28),(address,string[4]))[4]", + "value": [ + [ + false, + [ + [ + "Moo é🚀🚀oooé🚀oM o", + "0x90d1d7a4d3c8d2c4e74ef898513b121b4e", + ["0xD09f5502419fe25fF2C9eC3a2b84f68B2Cb92Aa7"], + [ + [ + "0x2a53f4420eefd46df8915a306061fc03a799df", + "0x5fe2b782880ed43eebb3fcea563d4e17d8f724", + "0x648b62ef9afe26f970ce6ac7c96893d8b2c98d" + ], + [ + "0x4eb2cdd02eb92fe6c704e696cd84fbfcaa4772", + "0x107228c1bb573564c7d7c3baede74c98bd1212", + "0x29f79a015066bda3d725d33ca5e4457b0c777b" + ], + [ + "0xc50ce89c23426629c89705c7c02b58077e882c", + "0xc0c426ae87d617332b0b553a43d28aeced1558", + "0x0a2812fafedade07fc50774c83ae28183ebd27" + ] + ], + [ + "431585739183620163088351677677933235714528567", + "-1116669211917382481183902027414992645454996252", + "650412557428707265057216628132677499176729954" + ] + ], + "0x07d4898a52fb8adf0fab2e4a0daf2c53eb5e6d", + [ + "Moo é🚀o🚀 🚀MMo o🚀éMo🚀🚀éoMo oé🚀M🚀ooooo🚀o 🚀M", + [ + "0x0a0f6EEf4d0bb780934A0d58BD49d1Db46F83D41", + "Moo é🚀oééM oé🚀éM🚀oM🚀é M🚀o Méoé ééo🚀🚀🚀é🚀ooé", + "0x51b684cD1750899b2efc108D0ca55cf36345Cb29", + [ + "Moo é🚀 é oooM oooMo🚀Mo🚀oM 🚀ééooéo éMéé🚀éMo🚀Mé M ooooéo", + "Moo é🚀é🚀Moo o" + ] + ], + false + ], + "0x8542fbbb69675516ee5cf80b09ffe87177decadcfd9a3e5330f32302" + ], + [ + "0xcD01614BE9B752726E766C4E93E23755C7546897", + [ + "Moo é🚀🚀 oMoé🚀éo", + "Moo é🚀é🚀éMooéoo🚀oo🚀ooMooo🚀oé 🚀oooooé🚀o🚀 oo🚀o MM🚀oo 🚀M", + "Moo é🚀 o Mo 🚀é🚀🚀oéo M oooM 🚀 Moo", + "Moo é🚀 MéMMé Mo o MoM🚀éMéé🚀🚀 oo🚀🚀MéM🚀🚀éoMoé🚀🚀🚀ooo🚀oé" + ] + ] + ], + [ + false, + [ + [ + "Moo é🚀 ooo🚀🚀🚀ooo", + "0x5811b5d2aacea939662e9ea8220d7c062c", + ["0xeE1Bf04e3719c12cCE1bFE2920c132e522edeeAC"], + [ + [ + "0x904afe233a680ec92eb46d05e29697e2cfd5d3", + "0x56cb88dcdd676fc43fdc322e289e96afdadf8f", + "0x7fbd510e2bc31db1bb9f6dbceacf9dafb28e5c" + ], + [ + "0x64650e8e989c743894be8b36934e89018753d6", + "0x4c0f166214e9eb86d26cd6da36eb093a7b3da7", + "0x731075b2351c801a6791938986b11f361b52f8" + ], + [ + "0x91c592cd133c416b67ddef295d1ab568df247c", + "0xb3ac8ef1a7adbb9770feb75984cb6094517d42", + "0xcb311c7cf5f6cac09d0a7b85f234f73d312f33" + ] + ], + [ + "2153827364392934683215017004626188286370096127", + "2703546555172687709737797302690545571203234820", + "430775534561839653758449717457769406806132433" + ] + ], + "0x4992ca08aab5235e7872b63a5b630f8f75fdab", + [ + "Moo é🚀MMo🚀🚀Mé🚀oéééoooéMé é🚀o é ", + [ + "0x426B639Ea0aF99d863e04Ad97204c0902915a291", + "Moo é🚀M é o🚀ééMMooM oo🚀 🚀 oéooéMMo🚀é oéoo🚀oooooM oMooM🚀é M oo", + "0x3891b4657B544A54100E5D188e032Bd020286438", + [ + "Moo é🚀é🚀oo🚀 é🚀MMoM🚀M é Mé oé🚀éM é🚀oM ééo🚀oMooM🚀éo ", + "Moo é🚀🚀éoéé Mooé 🚀oo o " + ] + ], + false + ], + "0x062b4d4001c96856f4b27e2bcd54cc5dd7c38be5beaabdded2e3abba" + ], + [ + "0xdd9a529D64b3A96BdAB7a021742079fe9cA3F2dB", + [ + "Moo é🚀 M Mééo éMMéoM🚀oMM🚀 oéoé🚀M é oé🚀 é🚀", + "Moo é🚀é oooo🚀ooo 🚀 ééM Moo oMoMo MoéMMMoo o🚀oééMoooo éo🚀 o", + "Moo é🚀Méo oéoM🚀🚀Mé oé 🚀oooMMéoo", + "Moo é🚀oooéé🚀o oo" + ] + ] + ], + [ + true, + [ + [ + "Moo é🚀MM🚀🚀éé oéo🚀é ", + "0xcc7f13267b41acf941b17cdefc2806cb76", + ["0x6cC7818714Df681c93D145d0703C6F57033725b6"], + [ + [ + "0x7bd9936d9282efa18e1ba8a248e2fc7f288674", + "0x5b98f8de1ad55b73645d71989bdf44386e166f", + "0xb17963f665be342c40085323c222da527acf31" + ], + [ + "0xdf7ae492b718639771235f56fc64b0aa774939", + "0xd9e6206720b85f4dc6dfd9ff5e6f06c5c5d36b", + "0xfb93a2e5e4e9e9bb564cccfb5ed1e8dab53d00" + ], + [ + "0x5c44f203fb4eb32209b2890058d1ffa96deed5", + "0x780db44b8693dbc61ba361bc82447446579cd2", + "0xd783b9b3dedd7b91662b31dd22a5762d4c8368" + ] + ], + [ + "-2396120581861681811298631044721138587888247083", + "-2830987302743047426481473440024433188175625531", + "2210410983840805835543064681386313716631987685" + ] + ], + "0x46e3662bed3765c4420052e7d96c002615237f", + [ + "Moo é🚀o é🚀oM🚀 éo🚀o🚀Méo🚀Moo🚀MM🚀 🚀é🚀o🚀🚀oéooé o ", + [ + "0x76B50F0CAa331Ca99AE3F1BecBb778f61fB330DF", + "Moo é🚀M🚀o🚀é", + "0x20854d701466b1929cD2AF5801d5e6b92BF7Ac93", + [ + "Moo é🚀é🚀🚀éo Mé éMooM M🚀M🚀🚀o 🚀M🚀🚀 🚀oé Mé🚀MMooo oooéooo🚀o éo", + "Moo é🚀oMéo🚀M ooooooooéoo🚀🚀 " + ] + ], + true + ], + "0x10417ad721dd982c427420900dbf825f12a3d15ebe5e7a49580b5274" + ], + [ + "0x642A8154e5a8f34A72252637FC5670b3354C10C1", + [ + "Moo é🚀o 🚀Moéoo 🚀MMoMM🚀oo 🚀o🚀🚀🚀🚀ééM oéooMé🚀o M🚀o", + "Moo é🚀🚀🚀 éo🚀oMé 🚀M🚀ooo🚀MM🚀🚀Mo oéoMMoé oMM 🚀🚀 éoéM", + "Moo é🚀Mo🚀ooé🚀🚀éé MoMoo Moééoo🚀éoé éMooo 🚀oMéM o MéoMooMoMo🚀Méoé", + "Moo é🚀🚀o" + ] + ] + ], + [ + false, + [ + [ + "Moo é🚀oééo🚀éMooooééoMoo éM🚀MoM🚀éo", + "0x88ff917fb91533eaef1507477dbdeabdfa", + ["0x494fDE79041CB6E684023703a9b05a3F3CEAbf42"], + [ + [ + "0xa23ab2543a56cdcfcc448da01550ed701293c5", + "0xd0e1b79aedda343d3d7513bbe94d2b88696062", + "0x29885767f43ea7e8d795ef44e0e1ec739e934e" + ], + [ + "0xef826ab55fc7a9c7817e57252ddbf8a3a3aa7f", + "0x832ae9717db366ebf6aabaa8ecab3ea69f2e1c", + "0x56a160e829f038f4a48b13050751a4f9c1f647" + ], + [ + "0x8d8fc83c90bffadf7ea8be15eac87b00766699", + "0xfbd2ede90b08140cf5d7a7c38d4b784927617b", + "0x251939dfa0d77f9e98aa9451965c758f1682ad" + ] + ], + [ + "-1355179431322837227527680346702439934387306036", + "296130412114917465533373671843331322513681531", + "1003905070786950847084945880328770365080069754" + ] + ], + "0x2725741af37a26933107d0296a061f3a10ecfb", + [ + "Moo é🚀ooo🚀éoéoooMoo oo🚀🚀é 🚀 🚀é🚀é M 🚀oMééMoo éoé🚀M 🚀o🚀ééo", + [ + "0x84250D6fcb7e6cF3A7DF8c48b1934fE55E3B6E8c", + "Moo é🚀o o 🚀oéM 🚀é M", + "0xADd4dd07c53023100B7cAf3468500f2D969e671F", + [ + "Moo é🚀o 🚀 🚀o M ééo é🚀oMo oéMM🚀éoM🚀MMéoMo🚀éo oMooMééoééo", + "Moo é🚀MoéééM🚀ooéo oooM🚀🚀ooMéé🚀Mo o🚀 o éo" + ] + ], + true + ], + "0xc54e889e2d8f9ddb1ddeb2cf66c6c7c768827e0061a318ad8f194d29" + ], + [ + "0x2463429fA3C5f0A08f76b9BCC36a68E756F03edE", + [ + "Moo é🚀🚀🚀 M🚀M o M🚀éoééoéé é 🚀oéoéoM", + "Moo é🚀🚀oééMé🚀oooooMMMooo🚀🚀éo 🚀o éoMM🚀é🚀ooé ", + "Moo é🚀Mo🚀o oé 🚀é", + "Moo é🚀 é🚀🚀o 🚀ooéMoo Méo é" + ] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oooé🚀oM o" + }, + { + "type": "hexstring", + "value": "0x90d1d7a4d3c8d2c4e74ef898513b121b4e" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD09f5502419fe25fF2C9eC3a2b84f68B2Cb92Aa7" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2a53f4420eefd46df8915a306061fc03a799df" + }, + { + "type": "hexstring", + "value": "0x5fe2b782880ed43eebb3fcea563d4e17d8f724" + }, + { + "type": "hexstring", + "value": "0x648b62ef9afe26f970ce6ac7c96893d8b2c98d" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x4eb2cdd02eb92fe6c704e696cd84fbfcaa4772" + }, + { + "type": "hexstring", + "value": "0x107228c1bb573564c7d7c3baede74c98bd1212" + }, + { + "type": "hexstring", + "value": "0x29f79a015066bda3d725d33ca5e4457b0c777b" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc50ce89c23426629c89705c7c02b58077e882c" + }, + { + "type": "hexstring", + "value": "0xc0c426ae87d617332b0b553a43d28aeced1558" + }, + { + "type": "hexstring", + "value": "0x0a2812fafedade07fc50774c83ae28183ebd27" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "431585739183620163088351677677933235714528567" + }, + { + "type": "number", + "value": "-1116669211917382481183902027414992645454996252" + }, + { + "type": "number", + "value": "650412557428707265057216628132677499176729954" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x07d4898a52fb8adf0fab2e4a0daf2c53eb5e6d" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀 🚀MMo o🚀éMo🚀🚀éoMo oé🚀M🚀ooooo🚀o 🚀M" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0a0f6EEf4d0bb780934A0d58BD49d1Db46F83D41" + }, + { + "type": "string", + "value": "Moo é🚀oééM oé🚀éM🚀oM🚀é M🚀o Méoé ééo🚀🚀🚀é🚀ooé" + }, + { + "type": "address", + "value": "0x51b684cD1750899b2efc108D0ca55cf36345Cb29" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é oooM oooMo🚀Mo🚀oM 🚀ééooéo éMéé🚀éMo🚀Mé M ooooéo" + }, + { + "type": "string", + "value": "Moo é🚀é🚀Moo o" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x8542fbbb69675516ee5cf80b09ffe87177decadcfd9a3e5330f32302" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xcD01614BE9B752726E766C4E93E23755C7546897" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 oMoé🚀éo" + }, + { + "type": "string", + "value": "Moo é🚀é🚀éMooéoo🚀oo🚀ooMooo🚀oé 🚀oooooé🚀o🚀 oo🚀o MM🚀oo 🚀M" + }, + { + "type": "string", + "value": "Moo é🚀 o Mo 🚀é🚀🚀oéo M oooM 🚀 Moo" + }, + { + "type": "string", + "value": "Moo é🚀 MéMMé Mo o MoM🚀éMéé🚀🚀 oo🚀🚀MéM🚀🚀éoMoé🚀🚀🚀ooo🚀oé" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 ooo🚀🚀🚀ooo" + }, + { + "type": "hexstring", + "value": "0x5811b5d2aacea939662e9ea8220d7c062c" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xeE1Bf04e3719c12cCE1bFE2920c132e522edeeAC" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x904afe233a680ec92eb46d05e29697e2cfd5d3" + }, + { + "type": "hexstring", + "value": "0x56cb88dcdd676fc43fdc322e289e96afdadf8f" + }, + { + "type": "hexstring", + "value": "0x7fbd510e2bc31db1bb9f6dbceacf9dafb28e5c" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x64650e8e989c743894be8b36934e89018753d6" + }, + { + "type": "hexstring", + "value": "0x4c0f166214e9eb86d26cd6da36eb093a7b3da7" + }, + { + "type": "hexstring", + "value": "0x731075b2351c801a6791938986b11f361b52f8" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x91c592cd133c416b67ddef295d1ab568df247c" + }, + { + "type": "hexstring", + "value": "0xb3ac8ef1a7adbb9770feb75984cb6094517d42" + }, + { + "type": "hexstring", + "value": "0xcb311c7cf5f6cac09d0a7b85f234f73d312f33" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2153827364392934683215017004626188286370096127" + }, + { + "type": "number", + "value": "2703546555172687709737797302690545571203234820" + }, + { + "type": "number", + "value": "430775534561839653758449717457769406806132433" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x4992ca08aab5235e7872b63a5b630f8f75fdab" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMo🚀🚀Mé🚀oéééoooéMé é🚀o é " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x426B639Ea0aF99d863e04Ad97204c0902915a291" + }, + { + "type": "string", + "value": "Moo é🚀M é o🚀ééMMooM oo🚀 🚀 oéooéMMo🚀é oéoo🚀oooooM oMooM🚀é M oo" + }, + { + "type": "address", + "value": "0x3891b4657B544A54100E5D188e032Bd020286438" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀oo🚀 é🚀MMoM🚀M é Mé oé🚀éM é🚀oM ééo🚀oMooM🚀éo " + }, + { + "type": "string", + "value": "Moo é🚀🚀éoéé Mooé 🚀oo o " + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x062b4d4001c96856f4b27e2bcd54cc5dd7c38be5beaabdded2e3abba" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdd9a529D64b3A96BdAB7a021742079fe9cA3F2dB" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M Mééo éMMéoM🚀oMM🚀 oéoé🚀M é oé🚀 é🚀" + }, + { + "type": "string", + "value": "Moo é🚀é oooo🚀ooo 🚀 ééM Moo oMoMo MoéMMMoo o🚀oééMoooo éo🚀 o" + }, + { + "type": "string", + "value": "Moo é🚀Méo oéoM🚀🚀Mé oé 🚀oooMMéoo" + }, + { + "type": "string", + "value": "Moo é🚀oooéé🚀o oo" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM🚀🚀éé oéo🚀é " + }, + { + "type": "hexstring", + "value": "0xcc7f13267b41acf941b17cdefc2806cb76" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6cC7818714Df681c93D145d0703C6F57033725b6" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7bd9936d9282efa18e1ba8a248e2fc7f288674" + }, + { + "type": "hexstring", + "value": "0x5b98f8de1ad55b73645d71989bdf44386e166f" + }, + { + "type": "hexstring", + "value": "0xb17963f665be342c40085323c222da527acf31" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdf7ae492b718639771235f56fc64b0aa774939" + }, + { + "type": "hexstring", + "value": "0xd9e6206720b85f4dc6dfd9ff5e6f06c5c5d36b" + }, + { + "type": "hexstring", + "value": "0xfb93a2e5e4e9e9bb564cccfb5ed1e8dab53d00" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5c44f203fb4eb32209b2890058d1ffa96deed5" + }, + { + "type": "hexstring", + "value": "0x780db44b8693dbc61ba361bc82447446579cd2" + }, + { + "type": "hexstring", + "value": "0xd783b9b3dedd7b91662b31dd22a5762d4c8368" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2396120581861681811298631044721138587888247083" + }, + { + "type": "number", + "value": "-2830987302743047426481473440024433188175625531" + }, + { + "type": "number", + "value": "2210410983840805835543064681386313716631987685" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x46e3662bed3765c4420052e7d96c002615237f" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o é🚀oM🚀 éo🚀o🚀Méo🚀Moo🚀MM🚀 🚀é🚀o🚀🚀oéooé o " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x76B50F0CAa331Ca99AE3F1BecBb778f61fB330DF" + }, + { + "type": "string", + "value": "Moo é🚀M🚀o🚀é" + }, + { + "type": "address", + "value": "0x20854d701466b1929cD2AF5801d5e6b92BF7Ac93" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀🚀éo Mé éMooM M🚀M🚀🚀o 🚀M🚀🚀 🚀oé Mé🚀MMooo oooéooo🚀o éo" + }, + { + "type": "string", + "value": "Moo é🚀oMéo🚀M ooooooooéoo🚀🚀 " + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x10417ad721dd982c427420900dbf825f12a3d15ebe5e7a49580b5274" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x642A8154e5a8f34A72252637FC5670b3354C10C1" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀Moéoo 🚀MMoMM🚀oo 🚀o🚀🚀🚀🚀ééM oéooMé🚀o M🚀o" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀 éo🚀oMé 🚀M🚀ooo🚀MM🚀🚀Mo oéoMMoé oMM 🚀🚀 éoéM" + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀ooé🚀🚀éé MoMoo Moééoo🚀éoé éMooo 🚀oMéM o MéoMooMoMo🚀Méoé" + }, + { + "type": "string", + "value": "Moo é🚀🚀o" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oééo🚀éMooooééoMoo éM🚀MoM🚀éo" + }, + { + "type": "hexstring", + "value": "0x88ff917fb91533eaef1507477dbdeabdfa" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x494fDE79041CB6E684023703a9b05a3F3CEAbf42" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xa23ab2543a56cdcfcc448da01550ed701293c5" + }, + { + "type": "hexstring", + "value": "0xd0e1b79aedda343d3d7513bbe94d2b88696062" + }, + { + "type": "hexstring", + "value": "0x29885767f43ea7e8d795ef44e0e1ec739e934e" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xef826ab55fc7a9c7817e57252ddbf8a3a3aa7f" + }, + { + "type": "hexstring", + "value": "0x832ae9717db366ebf6aabaa8ecab3ea69f2e1c" + }, + { + "type": "hexstring", + "value": "0x56a160e829f038f4a48b13050751a4f9c1f647" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8d8fc83c90bffadf7ea8be15eac87b00766699" + }, + { + "type": "hexstring", + "value": "0xfbd2ede90b08140cf5d7a7c38d4b784927617b" + }, + { + "type": "hexstring", + "value": "0x251939dfa0d77f9e98aa9451965c758f1682ad" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1355179431322837227527680346702439934387306036" + }, + { + "type": "number", + "value": "296130412114917465533373671843331322513681531" + }, + { + "type": "number", + "value": "1003905070786950847084945880328770365080069754" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x2725741af37a26933107d0296a061f3a10ecfb" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo🚀éoéoooMoo oo🚀🚀é 🚀 🚀é🚀é M 🚀oMééMoo éoé🚀M 🚀o🚀ééo" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x84250D6fcb7e6cF3A7DF8c48b1934fE55E3B6E8c" + }, + { + "type": "string", + "value": "Moo é🚀o o 🚀oéM 🚀é M" + }, + { + "type": "address", + "value": "0xADd4dd07c53023100B7cAf3468500f2D969e671F" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o 🚀 🚀o M ééo é🚀oMo oéMM🚀éoM🚀MMéoMo🚀éo oMooMééoééo" + }, + { + "type": "string", + "value": "Moo é🚀MoéééM🚀ooéo oooM🚀🚀ooMéé🚀Mo o🚀 o éo" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xc54e889e2d8f9ddb1ddeb2cf66c6c7c768827e0061a318ad8f194d29" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2463429fA3C5f0A08f76b9BCC36a68E756F03edE" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀 M🚀M o M🚀éoééoéé é 🚀oéoéoM" + }, + { + "type": "string", + "value": "Moo é🚀🚀oééMé🚀oooooMMMooo🚀🚀éo 🚀o éoMM🚀é🚀ooé " + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀o oé 🚀é" + }, + { + "type": "string", + "value": "Moo é🚀 é🚀🚀o 🚀ooéMoo Méo é" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611e0a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190611456565b60405180910390f35b610056611103565b61005e611103565b610066611130565b6000815261007261115e565b61007a611192565b604080518082018252601c81527f4d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a9f09f9a806f4d20206f00000000602080830191909152908352704868ebd269e4696273a77c4c289d890da760791b838201528151908101825273d09f5502419fe25ff2c9ec3a2b84f68b2cb92aa78152908201526100f76111d9565b6100ff611206565b722a53f4420eefd46df8915a306061fc03a799df60681b81527217f8ade0a203b50fbaecff3a958f5385f63dc9606a1b602082015272648b62ef9afe26f970ce6ac7c96893d8b2c98d60681b6040820152815261015a611206565b72275966e8175c97f36382734b66c27dfe5523b960691b81527208391460ddab9ab263ebe1dd76f3a64c5e890960691b6020808301919091527229f79a015066bda3d725d33ca5e4457b0c777b60681b60408301528201526101ba611206565b7231433a2708d0998a7225c171f00ad601dfa20b606a1b815272181884d5d0fac2e665616aa7487a515d9da2ab606b1b6020820152720a2812fafedade07fc50774c83ae28183ebd2760681b604080830191909152820152606082015261021f611206565b72135a5c7eea6c61b3f756967026fdb5990615378152723212bbe038b2c3539aefdaf4c08b194f0aa31b19602080830191909152721d2a5eb7a7be356f4cd6d731310391c16dbd62604083015260808301919091529082527207d4898a52fb8adf0fab2e4a0daf2c53eb5e6d60681b9082015261029a611224565b60006040518060800160405280604c81526020016115e1604c91398252506102c061123a565b730a0f6eef4d0bb780934a0d58bd49d1db46f83d41815260408051608081019091526052808252600091906119b160208301396020830152507351b684cd1750899b2efc108d0ca55cf36345cb29604082015261031b61125d565b60006040518060800160405280605581526020016118fb6055913982525060408051808201825260158152744d6f6f20c3a9f09f9a80c3a9f09f9a804d6f6f206f60581b60208083019190915280840191909152606084810193909352848101939093526000848201528401929092527f8542fbbb69675516ee5cf80b09ffe87177decadcfd9a3e5330f3230200000000918301919091528201526103be611284565b73cd01614be9b752726e766c4e93e23755c754689781526103dd6112a3565b604080518082018252601b81527f4d6f6f20c3a9f09f9a80f09f9a80206f4d6fc3a9f09f9a80c3a96f0000000000602080830191909152908352815160808101909252605d80835260009291611a03908301399050808260016020020181905250506000604051806060016040528060338152602001611ba760339139604080840191909152805160a081019091526065808252600092506118616020830139606083015250602082015260408201528152610497611130565b600081526104a361115e565b6104ab611192565b604080518082018252601d81527f4d6f6f20c3a9f09f9a80206f6f6ff09f9a80f09f9a80f09f9a806f6f6f0000006020808301919091529083527016046d74aab3aa4e598ba7aa08835f018b607a1b838201528151908101825273ee1bf04e3719c12cce1bfe2920c132e522edeeac8152908201526105286111d9565b610530611206565b72904afe233a680ec92eb46d05e29697e2cfd5d360681b81527256cb88dcdd676fc43fdc322e289e96afdadf8f60681b6020820152721fef54438af0c76c6ee7db6f3ab3e76beca397606a1b6040820152815261058b611206565b72323287474c4e3a1c4a5f459b49a74480c3a9eb60691b8152724c0f166214e9eb86d26cd6da36eb093a7b3da760681b602080830191909152720e620eb646a390034cf2327130d623e6c36a5f606b1b60408301528201526105eb611206565b72247164b344cf105ad9f77bca5746ad5a37c91f606a1b81527259d64778d3d6ddcbb87f5bacc265b04a28bea160691b602082015272cb311c7cf5f6cac09d0a7b85f234f73d312f3360681b6040808301919091528201526060820152610650611206565b726094b9bfac7fc81106767ea49ed826d8c9a3ff815272793b3141c9342902b38c32f2c44c5429e1bc046020808301919091527213510f84b434e161b0013f85118f89296c86d160408301526080830191909152908252724992ca08aab5235e7872b63a5b630f8f75fdab60681b908201526106ca611224565b6000604051806060016040528060388152602001611c9a603891398252506106f061123a565b73426b639ea0af99d863e04ad97204c0902915a29181526040805160808101909152605b80825260009190611af36020830139602083015250733891b4657b544a54100e5d188e032bd020286438604082015261074b61125d565b6000604051806080016040528060598152602001611d50605991398252506040805160608101909152602680825260009190611a606020830139602080840191909152606084810193909352848101939093525060006040808501919091528401929092527f062b4d4001c96856f4b27e2bcd54cc5dd7c38be5beaabdded2e3abba00000000918301919091528201526107e3611284565b73dd9a529d64b3a96bdab7a021742079fe9ca3f2db81526108026112a3565b6000604051806080016040528060498152602001611818604991398252506040805160808101909152605480825260009190611692602083013990508082600160200201819052505060006040518060600160405280603181526020016116e66031913960408381019190915280518082018252601981527f4d6f6f20c3a9f09f9a806f6f6fc3a9c3a9f09f9a806f206f6f00000000000000602080830191909152606085019190915284810193909352840192909252830191909152506108c8611130565b600181526108d461115e565b6108dc611192565b6000604051806060016040528060248152602001611cd26024913982525070663f89933da0d67ca0d8be6f7e140365bb60791b602082015261092960408051602081019091526000815290565b736cc7818714df681c93d145d0703c6f57033725b68152604082015261094d6111d9565b610955611206565b721ef664db64a0bbe86386ea289238bf1fca219d606a1b8152725b98f8de1ad55b73645d71989bdf44386e166f60681b602082015272b17963f665be342c40085323c222da527acf3160681b604082015281526109b0611206565b72df7ae492b718639771235f56fc64b0aa77493960681b815272d9e6206720b85f4dc6dfd9ff5e6f06c5c5d36b60681b60208083019190915271fb93a2e5e4e9e9bb564cccfb5ed1e8dab53d60701b6040830152820152610a0f611206565b725c44f203fb4eb32209b2890058d1ffa96deed560681b8152723c06da25c349ede30dd1b0de41223a232bce6960691b6020820152721af077367bdbaf722cc5663ba454aec5a9906d606b1b6040808301919091528201526060820152610a74611206565b726b721d8508ff7d5925c34f25cc16f8b877e12a198152727ef223f43d49efd7d07040b6fed97848703d3a1960208083019190915272631e460fae25563bc9632b2a165033b3b9e5e5604083015260808301919091529082527246e3662bed3765c4420052e7d96c002615237f60681b90820152610af0611224565b6000604051806080016040528060598152602001611b4e60599139825250610b1661123a565b7376b50f0caa331ca99ae3f1becbb778f61fb330df815260408051808201825260168152754d6f6f20c3a9f09f9a804df09f9a806ff09f9a80c3a960501b6020808301919091528301527320854d701466b1929cd2af5801d5e6b92bf7ac9390820152610b8161125d565b60006040518060a0016040528060678152602001611bda606791398252506040805160608101909152602a808252600091906117176020830139602080840191909152606084810193909352848101939093525060016040808501919091528401929092527f10417ad721dd982c427420900dbf825f12a3d15ebe5e7a49580b52740000000091830191909152820152610c19611284565b73642a8154e5a8f34a72252637fc5670b3354c10c18152610c386112a3565b6000604051806080016040528060598152602001611c41605991398252506040805160808101909152605a80825260009190611cf6602083013990508082600160200201819052505060006040518060a00160405280606181526020016119506061913960408381019190915280518082018252600f81526e4d6f6f20c3a9f09f9a80f09f9a806f60881b60208083019190915260608501919091528401929092525082810191909152820152610ced611130565b60008152610cf961115e565b610d01611192565b60006040518060600160405280603581526020016118c66035913982525070447fc8bfdc8a99f5778a83a3bedef55efd60791b6020820152610d4e60408051602081019091526000815290565b73494fde79041cb6e684023703a9b05a3f3ceabf4281526040820152610d726111d9565b610d7a611206565b72a23ab2543a56cdcfcc448da01550ed701293c560681b8152726870dbcd76ed1a1e9eba89ddf4a695c434b03160691b60208201527214c42bb3fa1f53f46bcaf7a27070f639cf49a760691b60408201528152610dd5611206565b72ef826ab55fc7a9c7817e57252ddbf8a3a3aa7f60681b81527220caba5c5f6cd9bafdaaaeaa3b2acfa9a7cb87606a1b6020808301919091527256a160e829f038f4a48b13050751a4f9c1f64760681b6040830152820152610e35611206565b728d8fc83c90bffadf7ea8be15eac87b0076669960681b815272fbd2ede90b08140cf5d7a7c38d4b784927617b60681b602082015272251939dfa0d77f9e98aa9451965c758f1682ad60681b6040808301919091528201526060820152610e9a611206565b723cc4b26a283b560104c1a531be1de50a5c3e33198152720d476910fd95d12a84028113e3163c9d9f6c7b602080830191909152722d0443d94313dfac5a917e1b630c3bd7a5e67a60408301526080830191909152908252722725741af37a26933107d0296a061f3a10ecfb60681b90820152610f15611224565b60006040518060a001604052806065815260200161162d60659139825250610f3b61123a565b7384250d6fcb7e6cf3a7df8c48b1934fe55e3b6e8c81526040805160608101909152602180825260009190611ad2602083013960208301525073add4dd07c53023100b7caf3468500f2d969e671f6040820152610f9661125d565b60006040518060800160405280605881526020016117836058913982525060408051608081019091526042808252600091906117416020830139602080840191909152606084810193909352848101939093525060016040808501919091528401929092527fc54e889e2d8f9ddb1ddeb2cf66c6c7c768827e0061a318ad8f194d29000000009183019190915282015261102e611284565b732463429fa3c5f0a08f76b9bcc36a68e756f03ede815261104d6112a3565b60006040518060600160405280603d81526020016117db603d91398252506040805160808101909152604c80825260009190611a866020830139602083810191909152604080518082018252601c81527f4d6f6f20c3a9f09f9a804d6ff09f9a806f206fc3a920f09f9a80c3a9000000008184015281850152805160608101909152602c808252600093509091611da9908301396060808401919091526020840192909252506040830191909152820152919050565b60405180608001604052806004905b61111a611130565b8152602001906001900390816111125790505090565b604051806060016040528060001515815260200161114c61115e565b8152602001611159611284565b905290565b6040518060800160405280611171611192565b815260006020820152604001611185611224565b8152600060209091015290565b6040805160a08101825260608152600060208201529081016111bf60408051602081019091526000815290565b81526020016111cc6111d9565b8152602001611159611206565b60405180606001604052806003905b6111f0611206565b8152602001906001900390816111e85790505090565b60405180606001604052806003906020820280368337509192915050565b6040518060600160405280606081526020016111855b604080516080810182526000808252606060208301819052928201529081016111595b60405180604001604052806002905b606081526020019060019003908161126c5790505090565b604051806040016040528060006001600160a01b031681526020016111595b60408051608081019091526060815260036020820161126c565b6000815180845260005b818110156112e3576020818501810151868301820152016112c7565b818111156112f5576000602083870101525b50601f01601f19169290920160200192915050565b8060005b600381101561133057815160120b84526020938401939091019060010161130e565b50505050565b600081516060845261134b60608501826112bd565b90506020808401518583038287015260018060a01b038082511684528282015160808486015261137e60808601826112bd565b6040848101519093168684015260609384015186820394909601939093525090929083018360005b60028110156113d15781830386526113bf8385516112bd565b958501959385019392506001016113a6565b5050604086015193506113e8604088018515159052565b9695505050505050565b80516001600160a01b03168252602080820151604082850181905260009260c086019290918601845b600481101561144a57603f198886030182526114388584516112bd565b9450918301919083019060010161141b565b50929695505050505050565b602080825260009060a0830183820185845b60048110156115d457601f1987850301835281516060815115158652868201518188880152805160808389015280516101e060e08a01526114ad6102c08a01826112bd565b828b01516effffffffffffffffffffffffffffff19166101008b01526040830151516001600160a01b03166101208b0152848301519091506101408a0160005b600381101561153c5782518260005b60038110156115295782516cffffffffffffffffffffffffff19168252918f0191908f01906001016114fc565b505050918c0191908601906001016114ed565b505050608082015191506115546102608a018361130a565b898301516cffffffffffffffffffffffffff191660808a01526040830151605f198a83030160a08b0152915061158a8183611336565b9383015163ffffffff19811660c08b01529391506115a59050565b6040840151935087810360408901526115be81856113f2565b9750505093860193505090840190600101611468565b5091969550505050505056fe4d6f6f20c3a9f09f9a806ff09f9a8020f09f9a804d4d6f20206ff09f9a80c3a94d6ff09f9a80f09f9a80c3a96f4d6f206fc3a9f09f9a804df09f9a806f6f6f6f6ff09f9a806f20f09f9a804d4d6f6f20c3a9f09f9a806f6f6ff09f9a80c3a96fc3a96f6f6f4d6f6f206f6ff09f9a80f09f9a80c3a920f09f9a8020f09f9a80c3a9f09f9a80c3a9204d20f09f9a806f4dc3a9c3a94d6f6f20c3a96fc3a9f09f9a804d20f09f9a806ff09f9a80c3a9c3a96f4d6f6f20c3a9f09f9a80c3a9202020206f6f6f6ff09f9a806f6f6f20f09f9a8020c3a9c3a94d204d6f6f206f4d6f4d6f204d6fc3a94d4d4d6f6f206ff09f9a806fc3a9c3a94d6f6f6f6f20c3a96ff09f9a80206f4d6f6f20c3a9f09f9a804dc3a96f206fc3a96f4df09f9a80f09f9a804dc3a9206fc3a920f09f9a806f6f6f4d4dc3a96f6f4d6f6f20c3a9f09f9a806f4dc3a96ff09f9a804d206f6f6f6f6f6f6f6fc3a96f6ff09f9a80f09f9a80204d6f6f20c3a9f09f9a804d6fc3a9c3a9c3a94df09f9a806f6fc3a96f206f6f6f4df09f9a80f09f9a806f6f4dc3a9c3a9f09f9a804d6f206ff09f9a80206f20c3a96f4d6f6f20c3a9f09f9a806f20f09f9a8020f09f9a806f204d20c3a9c3a96f20c3a9f09f9a806f4d6f206fc3a94d4df09f9a80c3a96f4df09f9a804d4dc3a96f4d6ff09f9a80c3a96f206f4d6f6f4dc3a9c3a96fc3a9c3a96f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80204df09f9a804d206f204df09f9a80c3a96fc3a9c3a96fc3a9c3a920c3a920f09f9a806fc3a96fc3a96f4d4d6f6f20c3a9f09f9a80204d204dc3a9c3a96f20c3a94d4dc3a96f4df09f9a806f4d4df09f9a80206fc3a96fc3a9f09f9a804d2020c3a92020206fc3a9f09f9a802020c3a9f09f9a804d6f6f20c3a9f09f9a80204dc3a94d4dc3a9204d6f202020206f204d6f4df09f9a80c3a94dc3a9c3a9f09f9a80f09f9a80206f6ff09f9a80f09f9a804dc3a94df09f9a80f09f9a80c3a96f4d6fc3a9f09f9a80f09f9a80f09f9a806f6f6ff09f9a806fc3a94d6f6f20c3a9f09f9a806fc3a9c3a96ff09f9a80c3a94d6f6f6f6fc3a9c3a96f4d6f6f20c3a94df09f9a804d6f4df09f9a80c3a96f4d6f6f20c3a9f09f9a802020c3a9206f6f6f4d206f6f6f4d6ff09f9a804d6ff09f9a806f4d2020f09f9a80c3a9c3a96f6fc3a96f20c3a94dc3a9c3a9f09f9a80c3a94d6ff09f9a804dc3a9204d206f6f6f6fc3a96f4d6f6f20c3a9f09f9a804d6ff09f9a806f6fc3a9f09f9a80f09f9a80c3a9c3a9204d6f4d6f6f204d6fc3a9c3a96f6ff09f9a80c3a96fc3a920c3a94d6f6f6f20f09f9a806f4dc3a94d206f204dc3a96f4d6f6f4d6f4d6ff09f9a804dc3a96fc3a94d6f6f20c3a9f09f9a806fc3a9c3a94d206fc3a9f09f9a80c3a94df09f9a806f4df09f9a80c3a9204df09f9a806f20204dc3a96fc3a920c3a9c3a96ff09f9a80f09f9a80f09f9a80c3a9f09f9a806f6fc3a94d6f6f20c3a9f09f9a80c3a9f09f9a80c3a94d6f6fc3a96f6ff09f9a806f6ff09f9a806f6f4d6f6f6ff09f9a806fc3a920f09f9a806f6f6f6f6fc3a9f09f9a806ff09f9a8020206f6ff09f9a806f204d4df09f9a806f6f20f09f9a804d4d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a9c3a920204d6f6fc3a920f09f9a806f6f206f204d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a94dc3a9f09f9a806f6f6f6f6f4d4d4d6f6f6ff09f9a80f09f9a80c3a96f2020f09f9a806f20c3a96f4d4df09f9a80c3a9f09f9a806f6fc3a9204d6f6f20c3a9f09f9a806f206f20f09f9a806fc3a94d20f09f9a80c3a92020204d4d6f6f20c3a9f09f9a804d20c3a9206ff09f9a80c3a9c3a94d4d6f6f4d206f6ff09f9a8020f09f9a80206fc3a96f6fc3a94d4d6ff09f9a80c3a9206fc3a96f6ff09f9a806f6f6f6f6f4d206f4d6f6f4df09f9a80c3a9204d206f6f4d6f6f20c3a9f09f9a806f2020c3a9f09f9a806f4df09f9a8020c3a96ff09f9a806ff09f9a804dc3a96ff09f9a804d6f6ff09f9a804d4df09f9a8020f09f9a80c3a9f09f9a806ff09f9a80f09f9a806fc3a96f6fc3a9206f204d6f6f20c3a9f09f9a80206f204d6f2020f09f9a80c3a9f09f9a80f09f9a806fc3a96f204d206f6f6f4d20f09f9a80204d6f6f4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80c3a96f204dc3a920c3a94d6f6f4d204df09f9a804df09f9a80f09f9a806f20f09f9a804df09f9a80f09f9a8020f09f9a806fc3a9204dc3a9f09f9a804d4d6f6f6f206f6f6fc3a96f6f6ff09f9a806f20c3a96f4d6f6f20c3a9f09f9a806f2020f09f9a804d6fc3a96f6f20f09f9a804d4d6f4d4df09f9a806f6f2020f09f9a806ff09f9a80f09f9a80f09f9a80f09f9a80c3a9c3a94d206fc3a96f6f4dc3a9f09f9a806f20204df09f9a806f4d6f6f20c3a9f09f9a804d4d6ff09f9a80f09f9a804dc3a9f09f9a806fc3a9c3a9c3a96f6f6fc3a94dc3a920c3a9f09f9a806f2020c3a9204d6f6f20c3a9f09f9a804d4df09f9a80f09f9a80c3a9c3a9206fc3a96ff09f9a80c3a9204d6f6f20c3a9f09f9a80f09f9a80f09f9a8020c3a96ff09f9a806f4dc3a920f09f9a804df09f9a806f6f6ff09f9a804d4df09f9a80f09f9a804d6f206fc3a96f4d4d6fc3a9206f4d4d20f09f9a80f09f9a802020c3a96fc3a94d4d6f6f20c3a9f09f9a80c3a9f09f9a806f6ff09f9a8020c3a9f09f9a804d4d6f4df09f9a804d20c3a9204dc3a9206fc3a9f09f9a80c3a94d2020c3a9f09f9a806f4d20c3a9c3a96ff09f9a806f4d6f6f4df09f9a80c3a96f204d6f6f20c3a9f09f9a8020c3a9f09f9a80f09f9a806f2020f09f9a806f6fc3a94d6f6f204dc3a96f2020c3a9a264697066735822122043b78331cc2b5e8fc171843a99bba85fa8112743ef59b5157bdec6faa42920f164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_873998a3 {\n string s_0;\n bytes17 s_1;\n S_421683f8 s_2;\n bytes19[3][3] s_3;\n int152[3] s_4;\n }\n\n struct S_2cd4fee6 {\n address s_0;\n string s_1;\n address s_2;\n string[2] s_3;\n }\n\n struct S_a02295c8 {\n string s_0;\n S_2cd4fee6 s_1;\n bool s_2;\n }\n\n struct S_ac7dd91b {\n S_873998a3 s_0;\n bytes19 s_1;\n S_a02295c8 s_2;\n bytes28 s_3;\n }\n\n struct S_ab1b3cb0 {\n address s_0;\n string[4] s_1;\n }\n\n struct S_90d6287b {\n bool s_0;\n S_ac7dd91b s_1;\n S_ab1b3cb0 s_2;\n }\n\n function test () public pure returns (S_90d6287b[4] memory) {\n S_90d6287b[4] memory r;\n {\n S_90d6287b memory r_0;\n {\n bool r_0_0 = false;\n r_0.s_0 = r_0_0;\n }\n {\n S_ac7dd91b memory r_0_1;\n {\n S_873998a3 memory r_0_1_0;\n {\n string memory r_0_1_0_0 = unicode\"Moo é🚀🚀oooé🚀oM o\";\n r_0_1_0.s_0 = r_0_1_0_0;\n }\n {\n bytes17 r_0_1_0_1 = bytes17(0x90d1d7a4d3c8d2c4e74ef898513b121b4e);\n r_0_1_0.s_1 = r_0_1_0_1;\n }\n {\n S_421683f8 memory r_0_1_0_2;\n {\n address r_0_1_0_2_0 = 0xD09f5502419fe25fF2C9eC3a2b84f68B2Cb92Aa7;\n r_0_1_0_2.s_0 = r_0_1_0_2_0;\n }\n r_0_1_0.s_2 = r_0_1_0_2;\n }\n {\n bytes19[3][3] memory r_0_1_0_3;\n {\n bytes19[3] memory r_0_1_0_3_0;\n {\n bytes19 r_0_1_0_3_0_0 = bytes19(0x2a53f4420eefd46df8915a306061fc03a799df);\n r_0_1_0_3_0[0] = r_0_1_0_3_0_0;\n }\n {\n bytes19 r_0_1_0_3_0_1 = bytes19(0x5fe2b782880ed43eebb3fcea563d4e17d8f724);\n r_0_1_0_3_0[1] = r_0_1_0_3_0_1;\n }\n {\n bytes19 r_0_1_0_3_0_2 = bytes19(0x648b62ef9afe26f970ce6ac7c96893d8b2c98d);\n r_0_1_0_3_0[2] = r_0_1_0_3_0_2;\n }\n r_0_1_0_3[0] = r_0_1_0_3_0;\n }\n {\n bytes19[3] memory r_0_1_0_3_1;\n {\n bytes19 r_0_1_0_3_1_0 = bytes19(0x4eb2cdd02eb92fe6c704e696cd84fbfcaa4772);\n r_0_1_0_3_1[0] = r_0_1_0_3_1_0;\n }\n {\n bytes19 r_0_1_0_3_1_1 = bytes19(0x107228c1bb573564c7d7c3baede74c98bd1212);\n r_0_1_0_3_1[1] = r_0_1_0_3_1_1;\n }\n {\n bytes19 r_0_1_0_3_1_2 = bytes19(0x29f79a015066bda3d725d33ca5e4457b0c777b);\n r_0_1_0_3_1[2] = r_0_1_0_3_1_2;\n }\n r_0_1_0_3[1] = r_0_1_0_3_1;\n }\n {\n bytes19[3] memory r_0_1_0_3_2;\n {\n bytes19 r_0_1_0_3_2_0 = bytes19(0xc50ce89c23426629c89705c7c02b58077e882c);\n r_0_1_0_3_2[0] = r_0_1_0_3_2_0;\n }\n {\n bytes19 r_0_1_0_3_2_1 = bytes19(0xc0c426ae87d617332b0b553a43d28aeced1558);\n r_0_1_0_3_2[1] = r_0_1_0_3_2_1;\n }\n {\n bytes19 r_0_1_0_3_2_2 = bytes19(0x0a2812fafedade07fc50774c83ae28183ebd27);\n r_0_1_0_3_2[2] = r_0_1_0_3_2_2;\n }\n r_0_1_0_3[2] = r_0_1_0_3_2;\n }\n r_0_1_0.s_3 = r_0_1_0_3;\n }\n {\n int152[3] memory r_0_1_0_4;\n {\n int152 r_0_1_0_4_0 = 431585739183620163088351677677933235714528567;\n r_0_1_0_4[0] = r_0_1_0_4_0;\n }\n {\n int152 r_0_1_0_4_1 = -1116669211917382481183902027414992645454996252;\n r_0_1_0_4[1] = r_0_1_0_4_1;\n }\n {\n int152 r_0_1_0_4_2 = 650412557428707265057216628132677499176729954;\n r_0_1_0_4[2] = r_0_1_0_4_2;\n }\n r_0_1_0.s_4 = r_0_1_0_4;\n }\n r_0_1.s_0 = r_0_1_0;\n }\n {\n bytes19 r_0_1_1 = bytes19(0x07d4898a52fb8adf0fab2e4a0daf2c53eb5e6d);\n r_0_1.s_1 = r_0_1_1;\n }\n {\n S_a02295c8 memory r_0_1_2;\n {\n string memory r_0_1_2_0 = unicode\"Moo é🚀o🚀 🚀MMo o🚀éMo🚀🚀éoMo oé🚀M🚀ooooo🚀o 🚀M\";\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n S_2cd4fee6 memory r_0_1_2_1;\n {\n address r_0_1_2_1_0 = 0x0a0f6EEf4d0bb780934A0d58BD49d1Db46F83D41;\n r_0_1_2_1.s_0 = r_0_1_2_1_0;\n }\n {\n string memory r_0_1_2_1_1 = unicode\"Moo é🚀oééM oé🚀éM🚀oM🚀é M🚀o Méoé ééo🚀🚀🚀é🚀ooé\";\n r_0_1_2_1.s_1 = r_0_1_2_1_1;\n }\n {\n address r_0_1_2_1_2 = 0x51b684cD1750899b2efc108D0ca55cf36345Cb29;\n r_0_1_2_1.s_2 = r_0_1_2_1_2;\n }\n {\n string[2] memory r_0_1_2_1_3;\n {\n string memory r_0_1_2_1_3_0 = unicode\"Moo é🚀 é oooM oooMo🚀Mo🚀oM 🚀ééooéo éMéé🚀éMo🚀Mé M ooooéo\";\n r_0_1_2_1_3[0] = r_0_1_2_1_3_0;\n }\n {\n string memory r_0_1_2_1_3_1 = unicode\"Moo é🚀é🚀Moo o\";\n r_0_1_2_1_3[1] = r_0_1_2_1_3_1;\n }\n r_0_1_2_1.s_3 = r_0_1_2_1_3;\n }\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n bool r_0_1_2_2 = false;\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n {\n bytes28 r_0_1_3 = bytes28(0x8542fbbb69675516ee5cf80b09ffe87177decadcfd9a3e5330f32302);\n r_0_1.s_3 = r_0_1_3;\n }\n r_0.s_1 = r_0_1;\n }\n {\n S_ab1b3cb0 memory r_0_2;\n {\n address r_0_2_0 = 0xcD01614BE9B752726E766C4E93E23755C7546897;\n r_0_2.s_0 = r_0_2_0;\n }\n {\n string[4] memory r_0_2_1;\n {\n string memory r_0_2_1_0 = unicode\"Moo é🚀🚀 oMoé🚀éo\";\n r_0_2_1[0] = r_0_2_1_0;\n }\n {\n string memory r_0_2_1_1 = unicode\"Moo é🚀é🚀éMooéoo🚀oo🚀ooMooo🚀oé 🚀oooooé🚀o🚀 oo🚀o MM🚀oo 🚀M\";\n r_0_2_1[1] = r_0_2_1_1;\n }\n {\n string memory r_0_2_1_2 = unicode\"Moo é🚀 o Mo 🚀é🚀🚀oéo M oooM 🚀 Moo\";\n r_0_2_1[2] = r_0_2_1_2;\n }\n {\n string memory r_0_2_1_3 = unicode\"Moo é🚀 MéMMé Mo o MoM🚀éMéé🚀🚀 oo🚀🚀MéM🚀🚀éoMoé🚀🚀🚀ooo🚀oé\";\n r_0_2_1[3] = r_0_2_1_3;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n r_0.s_2 = r_0_2;\n }\n r[0] = r_0;\n }\n {\n S_90d6287b memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n S_ac7dd91b memory r_1_1;\n {\n S_873998a3 memory r_1_1_0;\n {\n string memory r_1_1_0_0 = unicode\"Moo é🚀 ooo🚀🚀🚀ooo\";\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n bytes17 r_1_1_0_1 = bytes17(0x5811b5d2aacea939662e9ea8220d7c062c);\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n S_421683f8 memory r_1_1_0_2;\n {\n address r_1_1_0_2_0 = 0xeE1Bf04e3719c12cCE1bFE2920c132e522edeeAC;\n r_1_1_0_2.s_0 = r_1_1_0_2_0;\n }\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n {\n bytes19[3][3] memory r_1_1_0_3;\n {\n bytes19[3] memory r_1_1_0_3_0;\n {\n bytes19 r_1_1_0_3_0_0 = bytes19(0x904afe233a680ec92eb46d05e29697e2cfd5d3);\n r_1_1_0_3_0[0] = r_1_1_0_3_0_0;\n }\n {\n bytes19 r_1_1_0_3_0_1 = bytes19(0x56cb88dcdd676fc43fdc322e289e96afdadf8f);\n r_1_1_0_3_0[1] = r_1_1_0_3_0_1;\n }\n {\n bytes19 r_1_1_0_3_0_2 = bytes19(0x7fbd510e2bc31db1bb9f6dbceacf9dafb28e5c);\n r_1_1_0_3_0[2] = r_1_1_0_3_0_2;\n }\n r_1_1_0_3[0] = r_1_1_0_3_0;\n }\n {\n bytes19[3] memory r_1_1_0_3_1;\n {\n bytes19 r_1_1_0_3_1_0 = bytes19(0x64650e8e989c743894be8b36934e89018753d6);\n r_1_1_0_3_1[0] = r_1_1_0_3_1_0;\n }\n {\n bytes19 r_1_1_0_3_1_1 = bytes19(0x4c0f166214e9eb86d26cd6da36eb093a7b3da7);\n r_1_1_0_3_1[1] = r_1_1_0_3_1_1;\n }\n {\n bytes19 r_1_1_0_3_1_2 = bytes19(0x731075b2351c801a6791938986b11f361b52f8);\n r_1_1_0_3_1[2] = r_1_1_0_3_1_2;\n }\n r_1_1_0_3[1] = r_1_1_0_3_1;\n }\n {\n bytes19[3] memory r_1_1_0_3_2;\n {\n bytes19 r_1_1_0_3_2_0 = bytes19(0x91c592cd133c416b67ddef295d1ab568df247c);\n r_1_1_0_3_2[0] = r_1_1_0_3_2_0;\n }\n {\n bytes19 r_1_1_0_3_2_1 = bytes19(0xb3ac8ef1a7adbb9770feb75984cb6094517d42);\n r_1_1_0_3_2[1] = r_1_1_0_3_2_1;\n }\n {\n bytes19 r_1_1_0_3_2_2 = bytes19(0xcb311c7cf5f6cac09d0a7b85f234f73d312f33);\n r_1_1_0_3_2[2] = r_1_1_0_3_2_2;\n }\n r_1_1_0_3[2] = r_1_1_0_3_2;\n }\n r_1_1_0.s_3 = r_1_1_0_3;\n }\n {\n int152[3] memory r_1_1_0_4;\n {\n int152 r_1_1_0_4_0 = 2153827364392934683215017004626188286370096127;\n r_1_1_0_4[0] = r_1_1_0_4_0;\n }\n {\n int152 r_1_1_0_4_1 = 2703546555172687709737797302690545571203234820;\n r_1_1_0_4[1] = r_1_1_0_4_1;\n }\n {\n int152 r_1_1_0_4_2 = 430775534561839653758449717457769406806132433;\n r_1_1_0_4[2] = r_1_1_0_4_2;\n }\n r_1_1_0.s_4 = r_1_1_0_4;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n bytes19 r_1_1_1 = bytes19(0x4992ca08aab5235e7872b63a5b630f8f75fdab);\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_a02295c8 memory r_1_1_2;\n {\n string memory r_1_1_2_0 = unicode\"Moo é🚀MMo🚀🚀Mé🚀oéééoooéMé é🚀o é \";\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n S_2cd4fee6 memory r_1_1_2_1;\n {\n address r_1_1_2_1_0 = 0x426B639Ea0aF99d863e04Ad97204c0902915a291;\n r_1_1_2_1.s_0 = r_1_1_2_1_0;\n }\n {\n string memory r_1_1_2_1_1 = unicode\"Moo é🚀M é o🚀ééMMooM oo🚀 🚀 oéooéMMo🚀é oéoo🚀oooooM oMooM🚀é M oo\";\n r_1_1_2_1.s_1 = r_1_1_2_1_1;\n }\n {\n address r_1_1_2_1_2 = 0x3891b4657B544A54100E5D188e032Bd020286438;\n r_1_1_2_1.s_2 = r_1_1_2_1_2;\n }\n {\n string[2] memory r_1_1_2_1_3;\n {\n string memory r_1_1_2_1_3_0 = unicode\"Moo é🚀é🚀oo🚀 é🚀MMoM🚀M é Mé oé🚀éM é🚀oM ééo🚀oMooM🚀éo \";\n r_1_1_2_1_3[0] = r_1_1_2_1_3_0;\n }\n {\n string memory r_1_1_2_1_3_1 = unicode\"Moo é🚀🚀éoéé Mooé 🚀oo o \";\n r_1_1_2_1_3[1] = r_1_1_2_1_3_1;\n }\n r_1_1_2_1.s_3 = r_1_1_2_1_3;\n }\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n {\n bool r_1_1_2_2 = false;\n r_1_1_2.s_2 = r_1_1_2_2;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bytes28 r_1_1_3 = bytes28(0x062b4d4001c96856f4b27e2bcd54cc5dd7c38be5beaabdded2e3abba);\n r_1_1.s_3 = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n {\n S_ab1b3cb0 memory r_1_2;\n {\n address r_1_2_0 = 0xdd9a529D64b3A96BdAB7a021742079fe9cA3F2dB;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n string[4] memory r_1_2_1;\n {\n string memory r_1_2_1_0 = unicode\"Moo é🚀 M Mééo éMMéoM🚀oMM🚀 oéoé🚀M é oé🚀 é🚀\";\n r_1_2_1[0] = r_1_2_1_0;\n }\n {\n string memory r_1_2_1_1 = unicode\"Moo é🚀é oooo🚀ooo 🚀 ééM Moo oMoMo MoéMMMoo o🚀oééMoooo éo🚀 o\";\n r_1_2_1[1] = r_1_2_1_1;\n }\n {\n string memory r_1_2_1_2 = unicode\"Moo é🚀Méo oéoM🚀🚀Mé oé 🚀oooMMéoo\";\n r_1_2_1[2] = r_1_2_1_2;\n }\n {\n string memory r_1_2_1_3 = unicode\"Moo é🚀oooéé🚀o oo\";\n r_1_2_1[3] = r_1_2_1_3;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n r_1.s_2 = r_1_2;\n }\n r[1] = r_1;\n }\n {\n S_90d6287b memory r_2;\n {\n bool r_2_0 = true;\n r_2.s_0 = r_2_0;\n }\n {\n S_ac7dd91b memory r_2_1;\n {\n S_873998a3 memory r_2_1_0;\n {\n string memory r_2_1_0_0 = unicode\"Moo é🚀MM🚀🚀éé oéo🚀é \";\n r_2_1_0.s_0 = r_2_1_0_0;\n }\n {\n bytes17 r_2_1_0_1 = bytes17(0xcc7f13267b41acf941b17cdefc2806cb76);\n r_2_1_0.s_1 = r_2_1_0_1;\n }\n {\n S_421683f8 memory r_2_1_0_2;\n {\n address r_2_1_0_2_0 = 0x6cC7818714Df681c93D145d0703C6F57033725b6;\n r_2_1_0_2.s_0 = r_2_1_0_2_0;\n }\n r_2_1_0.s_2 = r_2_1_0_2;\n }\n {\n bytes19[3][3] memory r_2_1_0_3;\n {\n bytes19[3] memory r_2_1_0_3_0;\n {\n bytes19 r_2_1_0_3_0_0 = bytes19(0x7bd9936d9282efa18e1ba8a248e2fc7f288674);\n r_2_1_0_3_0[0] = r_2_1_0_3_0_0;\n }\n {\n bytes19 r_2_1_0_3_0_1 = bytes19(0x5b98f8de1ad55b73645d71989bdf44386e166f);\n r_2_1_0_3_0[1] = r_2_1_0_3_0_1;\n }\n {\n bytes19 r_2_1_0_3_0_2 = bytes19(0xb17963f665be342c40085323c222da527acf31);\n r_2_1_0_3_0[2] = r_2_1_0_3_0_2;\n }\n r_2_1_0_3[0] = r_2_1_0_3_0;\n }\n {\n bytes19[3] memory r_2_1_0_3_1;\n {\n bytes19 r_2_1_0_3_1_0 = bytes19(0xdf7ae492b718639771235f56fc64b0aa774939);\n r_2_1_0_3_1[0] = r_2_1_0_3_1_0;\n }\n {\n bytes19 r_2_1_0_3_1_1 = bytes19(0xd9e6206720b85f4dc6dfd9ff5e6f06c5c5d36b);\n r_2_1_0_3_1[1] = r_2_1_0_3_1_1;\n }\n {\n bytes19 r_2_1_0_3_1_2 = bytes19(0xfb93a2e5e4e9e9bb564cccfb5ed1e8dab53d00);\n r_2_1_0_3_1[2] = r_2_1_0_3_1_2;\n }\n r_2_1_0_3[1] = r_2_1_0_3_1;\n }\n {\n bytes19[3] memory r_2_1_0_3_2;\n {\n bytes19 r_2_1_0_3_2_0 = bytes19(0x5c44f203fb4eb32209b2890058d1ffa96deed5);\n r_2_1_0_3_2[0] = r_2_1_0_3_2_0;\n }\n {\n bytes19 r_2_1_0_3_2_1 = bytes19(0x780db44b8693dbc61ba361bc82447446579cd2);\n r_2_1_0_3_2[1] = r_2_1_0_3_2_1;\n }\n {\n bytes19 r_2_1_0_3_2_2 = bytes19(0xd783b9b3dedd7b91662b31dd22a5762d4c8368);\n r_2_1_0_3_2[2] = r_2_1_0_3_2_2;\n }\n r_2_1_0_3[2] = r_2_1_0_3_2;\n }\n r_2_1_0.s_3 = r_2_1_0_3;\n }\n {\n int152[3] memory r_2_1_0_4;\n {\n int152 r_2_1_0_4_0 = -2396120581861681811298631044721138587888247083;\n r_2_1_0_4[0] = r_2_1_0_4_0;\n }\n {\n int152 r_2_1_0_4_1 = -2830987302743047426481473440024433188175625531;\n r_2_1_0_4[1] = r_2_1_0_4_1;\n }\n {\n int152 r_2_1_0_4_2 = 2210410983840805835543064681386313716631987685;\n r_2_1_0_4[2] = r_2_1_0_4_2;\n }\n r_2_1_0.s_4 = r_2_1_0_4;\n }\n r_2_1.s_0 = r_2_1_0;\n }\n {\n bytes19 r_2_1_1 = bytes19(0x46e3662bed3765c4420052e7d96c002615237f);\n r_2_1.s_1 = r_2_1_1;\n }\n {\n S_a02295c8 memory r_2_1_2;\n {\n string memory r_2_1_2_0 = unicode\"Moo é🚀o é🚀oM🚀 éo🚀o🚀Méo🚀Moo🚀MM🚀 🚀é🚀o🚀🚀oéooé o \";\n r_2_1_2.s_0 = r_2_1_2_0;\n }\n {\n S_2cd4fee6 memory r_2_1_2_1;\n {\n address r_2_1_2_1_0 = 0x76B50F0CAa331Ca99AE3F1BecBb778f61fB330DF;\n r_2_1_2_1.s_0 = r_2_1_2_1_0;\n }\n {\n string memory r_2_1_2_1_1 = unicode\"Moo é🚀M🚀o🚀é\";\n r_2_1_2_1.s_1 = r_2_1_2_1_1;\n }\n {\n address r_2_1_2_1_2 = 0x20854d701466b1929cD2AF5801d5e6b92BF7Ac93;\n r_2_1_2_1.s_2 = r_2_1_2_1_2;\n }\n {\n string[2] memory r_2_1_2_1_3;\n {\n string memory r_2_1_2_1_3_0 = unicode\"Moo é🚀é🚀🚀éo Mé éMooM M🚀M🚀🚀o 🚀M🚀🚀 🚀oé Mé🚀MMooo oooéooo🚀o éo\";\n r_2_1_2_1_3[0] = r_2_1_2_1_3_0;\n }\n {\n string memory r_2_1_2_1_3_1 = unicode\"Moo é🚀oMéo🚀M ooooooooéoo🚀🚀 \";\n r_2_1_2_1_3[1] = r_2_1_2_1_3_1;\n }\n r_2_1_2_1.s_3 = r_2_1_2_1_3;\n }\n r_2_1_2.s_1 = r_2_1_2_1;\n }\n {\n bool r_2_1_2_2 = true;\n r_2_1_2.s_2 = r_2_1_2_2;\n }\n r_2_1.s_2 = r_2_1_2;\n }\n {\n bytes28 r_2_1_3 = bytes28(0x10417ad721dd982c427420900dbf825f12a3d15ebe5e7a49580b5274);\n r_2_1.s_3 = r_2_1_3;\n }\n r_2.s_1 = r_2_1;\n }\n {\n S_ab1b3cb0 memory r_2_2;\n {\n address r_2_2_0 = 0x642A8154e5a8f34A72252637FC5670b3354C10C1;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n string[4] memory r_2_2_1;\n {\n string memory r_2_2_1_0 = unicode\"Moo é🚀o 🚀Moéoo 🚀MMoMM🚀oo 🚀o🚀🚀🚀🚀ééM oéooMé🚀o M🚀o\";\n r_2_2_1[0] = r_2_2_1_0;\n }\n {\n string memory r_2_2_1_1 = unicode\"Moo é🚀🚀🚀 éo🚀oMé 🚀M🚀ooo🚀MM🚀🚀Mo oéoMMoé oMM 🚀🚀 éoéM\";\n r_2_2_1[1] = r_2_2_1_1;\n }\n {\n string memory r_2_2_1_2 = unicode\"Moo é🚀Mo🚀ooé🚀🚀éé MoMoo Moééoo🚀éoé éMooo 🚀oMéM o MéoMooMoMo🚀Méoé\";\n r_2_2_1[2] = r_2_2_1_2;\n }\n {\n string memory r_2_2_1_3 = unicode\"Moo é🚀🚀o\";\n r_2_2_1[3] = r_2_2_1_3;\n }\n r_2_2.s_1 = r_2_2_1;\n }\n r_2.s_2 = r_2_2;\n }\n r[2] = r_2;\n }\n {\n S_90d6287b memory r_3;\n {\n bool r_3_0 = false;\n r_3.s_0 = r_3_0;\n }\n {\n S_ac7dd91b memory r_3_1;\n {\n S_873998a3 memory r_3_1_0;\n {\n string memory r_3_1_0_0 = unicode\"Moo é🚀oééo🚀éMooooééoMoo éM🚀MoM🚀éo\";\n r_3_1_0.s_0 = r_3_1_0_0;\n }\n {\n bytes17 r_3_1_0_1 = bytes17(0x88ff917fb91533eaef1507477dbdeabdfa);\n r_3_1_0.s_1 = r_3_1_0_1;\n }\n {\n S_421683f8 memory r_3_1_0_2;\n {\n address r_3_1_0_2_0 = 0x494fDE79041CB6E684023703a9b05a3F3CEAbf42;\n r_3_1_0_2.s_0 = r_3_1_0_2_0;\n }\n r_3_1_0.s_2 = r_3_1_0_2;\n }\n {\n bytes19[3][3] memory r_3_1_0_3;\n {\n bytes19[3] memory r_3_1_0_3_0;\n {\n bytes19 r_3_1_0_3_0_0 = bytes19(0xa23ab2543a56cdcfcc448da01550ed701293c5);\n r_3_1_0_3_0[0] = r_3_1_0_3_0_0;\n }\n {\n bytes19 r_3_1_0_3_0_1 = bytes19(0xd0e1b79aedda343d3d7513bbe94d2b88696062);\n r_3_1_0_3_0[1] = r_3_1_0_3_0_1;\n }\n {\n bytes19 r_3_1_0_3_0_2 = bytes19(0x29885767f43ea7e8d795ef44e0e1ec739e934e);\n r_3_1_0_3_0[2] = r_3_1_0_3_0_2;\n }\n r_3_1_0_3[0] = r_3_1_0_3_0;\n }\n {\n bytes19[3] memory r_3_1_0_3_1;\n {\n bytes19 r_3_1_0_3_1_0 = bytes19(0xef826ab55fc7a9c7817e57252ddbf8a3a3aa7f);\n r_3_1_0_3_1[0] = r_3_1_0_3_1_0;\n }\n {\n bytes19 r_3_1_0_3_1_1 = bytes19(0x832ae9717db366ebf6aabaa8ecab3ea69f2e1c);\n r_3_1_0_3_1[1] = r_3_1_0_3_1_1;\n }\n {\n bytes19 r_3_1_0_3_1_2 = bytes19(0x56a160e829f038f4a48b13050751a4f9c1f647);\n r_3_1_0_3_1[2] = r_3_1_0_3_1_2;\n }\n r_3_1_0_3[1] = r_3_1_0_3_1;\n }\n {\n bytes19[3] memory r_3_1_0_3_2;\n {\n bytes19 r_3_1_0_3_2_0 = bytes19(0x8d8fc83c90bffadf7ea8be15eac87b00766699);\n r_3_1_0_3_2[0] = r_3_1_0_3_2_0;\n }\n {\n bytes19 r_3_1_0_3_2_1 = bytes19(0xfbd2ede90b08140cf5d7a7c38d4b784927617b);\n r_3_1_0_3_2[1] = r_3_1_0_3_2_1;\n }\n {\n bytes19 r_3_1_0_3_2_2 = bytes19(0x251939dfa0d77f9e98aa9451965c758f1682ad);\n r_3_1_0_3_2[2] = r_3_1_0_3_2_2;\n }\n r_3_1_0_3[2] = r_3_1_0_3_2;\n }\n r_3_1_0.s_3 = r_3_1_0_3;\n }\n {\n int152[3] memory r_3_1_0_4;\n {\n int152 r_3_1_0_4_0 = -1355179431322837227527680346702439934387306036;\n r_3_1_0_4[0] = r_3_1_0_4_0;\n }\n {\n int152 r_3_1_0_4_1 = 296130412114917465533373671843331322513681531;\n r_3_1_0_4[1] = r_3_1_0_4_1;\n }\n {\n int152 r_3_1_0_4_2 = 1003905070786950847084945880328770365080069754;\n r_3_1_0_4[2] = r_3_1_0_4_2;\n }\n r_3_1_0.s_4 = r_3_1_0_4;\n }\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bytes19 r_3_1_1 = bytes19(0x2725741af37a26933107d0296a061f3a10ecfb);\n r_3_1.s_1 = r_3_1_1;\n }\n {\n S_a02295c8 memory r_3_1_2;\n {\n string memory r_3_1_2_0 = unicode\"Moo é🚀ooo🚀éoéoooMoo oo🚀🚀é 🚀 🚀é🚀é M 🚀oMééMoo éoé🚀M 🚀o🚀ééo\";\n r_3_1_2.s_0 = r_3_1_2_0;\n }\n {\n S_2cd4fee6 memory r_3_1_2_1;\n {\n address r_3_1_2_1_0 = 0x84250D6fcb7e6cF3A7DF8c48b1934fE55E3B6E8c;\n r_3_1_2_1.s_0 = r_3_1_2_1_0;\n }\n {\n string memory r_3_1_2_1_1 = unicode\"Moo é🚀o o 🚀oéM 🚀é M\";\n r_3_1_2_1.s_1 = r_3_1_2_1_1;\n }\n {\n address r_3_1_2_1_2 = 0xADd4dd07c53023100B7cAf3468500f2D969e671F;\n r_3_1_2_1.s_2 = r_3_1_2_1_2;\n }\n {\n string[2] memory r_3_1_2_1_3;\n {\n string memory r_3_1_2_1_3_0 = unicode\"Moo é🚀o 🚀 🚀o M ééo é🚀oMo oéMM🚀éoM🚀MMéoMo🚀éo oMooMééoééo\";\n r_3_1_2_1_3[0] = r_3_1_2_1_3_0;\n }\n {\n string memory r_3_1_2_1_3_1 = unicode\"Moo é🚀MoéééM🚀ooéo oooM🚀🚀ooMéé🚀Mo o🚀 o éo\";\n r_3_1_2_1_3[1] = r_3_1_2_1_3_1;\n }\n r_3_1_2_1.s_3 = r_3_1_2_1_3;\n }\n r_3_1_2.s_1 = r_3_1_2_1;\n }\n {\n bool r_3_1_2_2 = true;\n r_3_1_2.s_2 = r_3_1_2_2;\n }\n r_3_1.s_2 = r_3_1_2;\n }\n {\n bytes28 r_3_1_3 = bytes28(0xc54e889e2d8f9ddb1ddeb2cf66c6c7c768827e0061a318ad8f194d29);\n r_3_1.s_3 = r_3_1_3;\n }\n r_3.s_1 = r_3_1;\n }\n {\n S_ab1b3cb0 memory r_3_2;\n {\n address r_3_2_0 = 0x2463429fA3C5f0A08f76b9BCC36a68E756F03edE;\n r_3_2.s_0 = r_3_2_0;\n }\n {\n string[4] memory r_3_2_1;\n {\n string memory r_3_2_1_0 = unicode\"Moo é🚀🚀🚀 M🚀M o M🚀éoééoéé é 🚀oéoéoM\";\n r_3_2_1[0] = r_3_2_1_0;\n }\n {\n string memory r_3_2_1_1 = unicode\"Moo é🚀🚀oééMé🚀oooooMMMooo🚀🚀éo 🚀o éoMM🚀é🚀ooé \";\n r_3_2_1[1] = r_3_2_1_1;\n }\n {\n string memory r_3_2_1_2 = unicode\"Moo é🚀Mo🚀o oé 🚀é\";\n r_3_2_1[2] = r_3_2_1_2;\n }\n {\n string memory r_3_2_1_3 = unicode\"Moo é🚀 é🚀🚀o 🚀ooéMoo Méo é\";\n r_3_2_1[3] = r_3_2_1_3;\n }\n r_3_2.s_1 = r_3_2_1;\n }\n r_3.s_2 = r_3_2;\n }\n r[3] = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000112000000000000000000000000000000000000000000000000000000000000019c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000008007d4898a52fb8adf0fab2e4a0daf2c53eb5e6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a08542fbbb69675516ee5cf80b09ffe87177decadcfd9a3e5330f323020000000000000000000000000000000000000000000000000000000000000000000001e090d1d7a4d3c8d2c4e74ef898513b121b4e000000000000000000000000000000000000000000000000000000d09f5502419fe25ff2c9ec3a2b84f68b2cb92aa72a53f4420eefd46df8915a306061fc03a799df000000000000000000000000005fe2b782880ed43eebb3fcea563d4e17d8f72400000000000000000000000000648b62ef9afe26f970ce6ac7c96893d8b2c98d000000000000000000000000004eb2cdd02eb92fe6c704e696cd84fbfcaa477200000000000000000000000000107228c1bb573564c7d7c3baede74c98bd12120000000000000000000000000029f79a015066bda3d725d33ca5e4457b0c777b00000000000000000000000000c50ce89c23426629c89705c7c02b58077e882c00000000000000000000000000c0c426ae87d617332b0b553a43d28aeced1558000000000000000000000000000a2812fafedade07fc50774c83ae28183ebd270000000000000000000000000000000000000000000000000000135a5c7eea6c61b3f756967026fdb599061537ffffffffffffffffffffffffffcded441fc74d3cac6510250b3f74e6b0f55ce4000000000000000000000000001d2a5eb7a7be356f4cd6d731310391c16dbd62000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a9f09f9a806f4d20206f00000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806ff09f9a8020f09f9a804d4d6f20206ff09f9a80c3a94d6ff09f9a80f09f9a80c3a96f4d6f206fc3a9f09f9a804df09f9a806f6f6f6f6ff09f9a806f20f09f9a804d00000000000000000000000000000000000000000000000000000000000000000a0f6eef4d0bb780934a0d58bd49d1db46f83d41000000000000000000000000000000000000000000000000000000000000008000000000000000000000000051b684cd1750899b2efc108d0ca55cf36345cb29000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a806fc3a9c3a94d206fc3a9f09f9a80c3a94df09f9a806f4df09f9a80c3a9204df09f9a806f20204dc3a96fc3a920c3a9c3a96ff09f9a80f09f9a80f09f9a80c3a9f09f9a806f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a802020c3a9206f6f6f4d206f6f6f4d6ff09f9a804d6ff09f9a806f4d2020f09f9a80c3a9c3a96f6fc3a96f20c3a94dc3a9c3a9f09f9a80c3a94d6ff09f9a804dc3a9204d206f6f6f6fc3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a80c3a9f09f9a804d6f6f206f0000000000000000000000000000000000000000000000cd01614be9b752726e766c4e93e23755c75468970000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80f09f9a80206f4d6fc3a9f09f9a80c3a96f0000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a94d6f6fc3a96f6ff09f9a806f6ff09f9a806f6f4d6f6f6ff09f9a806fc3a920f09f9a806f6f6f6f6fc3a9f09f9a806ff09f9a8020206f6ff09f9a806f204d4df09f9a806f6f20f09f9a804d00000000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80206f204d6f2020f09f9a80c3a9f09f9a80f09f9a806fc3a96f204d206f6f6f4d20f09f9a80204d6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a80204dc3a94d4dc3a9204d6f202020206f204d6f4df09f9a80c3a94dc3a9c3a9f09f9a80f09f9a80206f6ff09f9a80f09f9a804dc3a94df09f9a80f09f9a80c3a96f4d6fc3a9f09f9a80f09f9a80f09f9a806f6f6ff09f9a806fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000000804992ca08aab5235e7872b63a5b630f8f75fdab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0062b4d4001c96856f4b27e2bcd54cc5dd7c38be5beaabdded2e3abba0000000000000000000000000000000000000000000000000000000000000000000001e05811b5d2aacea939662e9ea8220d7c062c000000000000000000000000000000000000000000000000000000ee1bf04e3719c12cce1bfe2920c132e522edeeac904afe233a680ec92eb46d05e29697e2cfd5d30000000000000000000000000056cb88dcdd676fc43fdc322e289e96afdadf8f000000000000000000000000007fbd510e2bc31db1bb9f6dbceacf9dafb28e5c0000000000000000000000000064650e8e989c743894be8b36934e89018753d6000000000000000000000000004c0f166214e9eb86d26cd6da36eb093a7b3da700000000000000000000000000731075b2351c801a6791938986b11f361b52f80000000000000000000000000091c592cd133c416b67ddef295d1ab568df247c00000000000000000000000000b3ac8ef1a7adbb9770feb75984cb6094517d4200000000000000000000000000cb311c7cf5f6cac09d0a7b85f234f73d312f3300000000000000000000000000000000000000000000000000006094b9bfac7fc81106767ea49ed826d8c9a3ff00000000000000000000000000793b3141c9342902b38c32f2c44c5429e1bc040000000000000000000000000013510f84b434e161b0013f85118f89296c86d1000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a80206f6f6ff09f9a80f09f9a80f09f9a806f6f6f000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a804d4d6ff09f9a80f09f9a804dc3a9f09f9a806fc3a9c3a9c3a96f6f6fc3a94dc3a920c3a9f09f9a806f2020c3a9200000000000000000000000000000000000000000426b639ea0af99d863e04ad97204c0902915a29100000000000000000000000000000000000000000000000000000000000000800000000000000000000000003891b4657b544a54100e5d188e032bd0202864380000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a804d20c3a9206ff09f9a80c3a9c3a94d4d6f6f4d206f6ff09f9a8020f09f9a80206fc3a96f6fc3a94d4d6ff09f9a80c3a9206fc3a96f6ff09f9a806f6f6f6f6f4d206f4d6f6f4df09f9a80c3a9204d206f6f0000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80c3a9f09f9a806f6ff09f9a8020c3a9f09f9a804d4d6f4df09f9a804d20c3a9204dc3a9206fc3a9f09f9a80c3a94d2020c3a9f09f9a806f4d20c3a9c3a96ff09f9a806f4d6f6f4df09f9a80c3a96f200000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a9c3a920204d6f6fc3a920f09f9a806f6f206f200000000000000000000000000000000000000000000000000000000000000000000000000000dd9a529d64b3a96bdab7a021742079fe9ca3f2db000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a80204d204dc3a9c3a96f20c3a94d4dc3a96f4df09f9a806f4d4df09f9a80206fc3a96fc3a9f09f9a804d2020c3a92020206fc3a9f09f9a802020c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a80c3a9202020206f6f6f6ff09f9a806f6f6f20f09f9a8020c3a9c3a94d204d6f6f206f4d6f4d6f204d6fc3a94d4d4d6f6f206ff09f9a806fc3a9c3a94d6f6f6f6f20c3a96ff09f9a80206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a804dc3a96f206fc3a96f4df09f9a80f09f9a804dc3a9206fc3a920f09f9a806f6f6f4d4dc3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000194d6f6f20c3a9f09f9a806f6f6fc3a9c3a9f09f9a806f206f6f00000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000008046e3662bed3765c4420052e7d96c002615237f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c010417ad721dd982c427420900dbf825f12a3d15ebe5e7a49580b52740000000000000000000000000000000000000000000000000000000000000000000001e0cc7f13267b41acf941b17cdefc2806cb760000000000000000000000000000000000000000000000000000006cc7818714df681c93d145d0703c6f57033725b67bd9936d9282efa18e1ba8a248e2fc7f288674000000000000000000000000005b98f8de1ad55b73645d71989bdf44386e166f00000000000000000000000000b17963f665be342c40085323c222da527acf3100000000000000000000000000df7ae492b718639771235f56fc64b0aa77493900000000000000000000000000d9e6206720b85f4dc6dfd9ff5e6f06c5c5d36b00000000000000000000000000fb93a2e5e4e9e9bb564cccfb5ed1e8dab53d00000000000000000000000000005c44f203fb4eb32209b2890058d1ffa96deed500000000000000000000000000780db44b8693dbc61ba361bc82447446579cd200000000000000000000000000d783b9b3dedd7b91662b31dd22a5762d4c836800000000000000000000000000ffffffffffffffffffffffffff948de27af70082a6da3cb0da33e90747881ed5ffffffffffffffffffffffffff810ddc0bc2b610282f8fbf49012687b78fc2c500000000000000000000000000631e460fae25563bc9632b2a165033b3b9e5e500000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a804d4df09f9a80f09f9a80c3a9c3a9206fc3a96ff09f9a80c3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a806f2020c3a9f09f9a806f4df09f9a8020c3a96ff09f9a806ff09f9a804dc3a96ff09f9a804d6f6ff09f9a804d4df09f9a8020f09f9a80c3a9f09f9a806ff09f9a80f09f9a806fc3a96f6fc3a9206f200000000000000000000000000000000000000076b50f0caa331ca99ae3f1becbb778f61fb330df000000000000000000000000000000000000000000000000000000000000008000000000000000000000000020854d701466b1929cd2af5801d5e6b92bf7ac9300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a804df09f9a806ff09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80c3a96f204dc3a920c3a94d6f6f4d204df09f9a804df09f9a80f09f9a806f20f09f9a804df09f9a80f09f9a8020f09f9a806fc3a9204dc3a9f09f9a804d4d6f6f6f206f6f6fc3a96f6f6ff09f9a806f20c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a806f4dc3a96ff09f9a804d206f6f6f6f6f6f6f6fc3a96f6ff09f9a80f09f9a802000000000000000000000000000000000000000000000000000000000000000000000642a8154e5a8f34a72252637fc5670b3354c10c10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a806f2020f09f9a804d6fc3a96f6f20f09f9a804d4d6f4d4df09f9a806f6f2020f09f9a806ff09f9a80f09f9a80f09f9a80f09f9a80c3a9c3a94d206fc3a96f6f4dc3a9f09f9a806f20204df09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a80f09f9a80f09f9a8020c3a96ff09f9a806f4dc3a920f09f9a804df09f9a806f6f6ff09f9a804d4df09f9a80f09f9a804d6f206fc3a96f4d4d6fc3a9206f4d4d20f09f9a80f09f9a802020c3a96fc3a94d00000000000000000000000000000000000000000000000000000000000000000000000000614d6f6f20c3a9f09f9a804d6ff09f9a806f6fc3a9f09f9a80f09f9a80c3a9c3a9204d6f4d6f6f204d6fc3a9c3a96f6ff09f9a80c3a96fc3a920c3a94d6f6f6f20f09f9a806f4dc3a94d206f204dc3a96f4d6f6f4d6f4d6ff09f9a804dc3a96fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000802725741af37a26933107d0296a061f3a10ecfb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c0c54e889e2d8f9ddb1ddeb2cf66c6c7c768827e0061a318ad8f194d290000000000000000000000000000000000000000000000000000000000000000000001e088ff917fb91533eaef1507477dbdeabdfa000000000000000000000000000000000000000000000000000000494fde79041cb6e684023703a9b05a3f3ceabf42a23ab2543a56cdcfcc448da01550ed701293c500000000000000000000000000d0e1b79aedda343d3d7513bbe94d2b886960620000000000000000000000000029885767f43ea7e8d795ef44e0e1ec739e934e00000000000000000000000000ef826ab55fc7a9c7817e57252ddbf8a3a3aa7f00000000000000000000000000832ae9717db366ebf6aabaa8ecab3ea69f2e1c0000000000000000000000000056a160e829f038f4a48b13050751a4f9c1f647000000000000000000000000008d8fc83c90bffadf7ea8be15eac87b0076669900000000000000000000000000fbd2ede90b08140cf5d7a7c38d4b784927617b00000000000000000000000000251939dfa0d77f9e98aa9451965c758f1682ad00000000000000000000000000ffffffffffffffffffffffffffc33b4d95d7c4a9fefb3e5ace41e21af5a3c1cc000000000000000000000000000d476910fd95d12a84028113e3163c9d9f6c7b000000000000000000000000002d0443d94313dfac5a917e1b630c3bd7a5e67a00000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a806fc3a9c3a96ff09f9a80c3a94d6f6f6f6fc3a9c3a96f4d6f6f20c3a94df09f9a804d6f4df09f9a80c3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000654d6f6f20c3a9f09f9a806f6f6ff09f9a80c3a96fc3a96f6f6f4d6f6f206f6ff09f9a80f09f9a80c3a920f09f9a8020f09f9a80c3a9f09f9a80c3a9204d20f09f9a806f4dc3a9c3a94d6f6f20c3a96fc3a9f09f9a804d20f09f9a806ff09f9a80c3a9c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000084250d6fcb7e6cf3a7df8c48b1934fe55e3b6e8c0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000add4dd07c53023100b7caf3468500f2d969e671f00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a806f206f20f09f9a806fc3a94d20f09f9a80c3a92020204d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806f20f09f9a8020f09f9a806f204d20c3a9c3a96f20c3a9f09f9a806f4d6f206fc3a94d4df09f9a80c3a96f4df09f9a804d4dc3a96f4d6ff09f9a80c3a96f206f4d6f6f4dc3a9c3a96fc3a9c3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a804d6fc3a9c3a9c3a94df09f9a806f6fc3a96f206f6f6f4df09f9a80f09f9a806f6f4dc3a9c3a9f09f9a804d6f206ff09f9a80206f20c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000002463429fa3c5f0a08f76b9bcc36a68e756f03ede0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80204df09f9a804d206f204df09f9a80c3a96fc3a9c3a96fc3a9c3a920c3a920f09f9a806fc3a96fc3a96f4d000000000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a94dc3a9f09f9a806f6f6f6f6f4d4d4d6f6f6ff09f9a80f09f9a80c3a96f2020f09f9a806f20c3a96f4d4df09f9a80c3a9f09f9a806f6fc3a9200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a804d6ff09f9a806f206fc3a920f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a8020c3a9f09f9a80f09f9a806f2020f09f9a806f6fc3a94d6f6f204dc3a96f2020c3a90000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,string[3],((bool,string)),(((bytes2,bytes14,uint168,int48,bool[1][1]),uint104,address,string)),(uint160,(bool[2][][2][2]),bytes18))", + "type": "(bool,string[3],((bool,string)),(((bytes2,bytes14,uint168,int48,bool[1][1]),uint104,address,string)),(uint160,(bool[2][][2][2]),bytes18))", + "value": [ + true, + [ + "Moo é🚀o éoo M oM🚀 oo MééMéo🚀ooo M Moééo🚀", + "Moo é🚀 🚀M oM🚀🚀Mo o🚀o🚀 MM 🚀o🚀🚀🚀ooé 🚀🚀o🚀🚀o oooo🚀ooo🚀o🚀é🚀oo🚀M", + "Moo é🚀o🚀MM o Moé oMéoéoéoMo🚀ooMooM🚀 é🚀o MMé ooM é🚀oMM🚀" + ], + [[true, "Moo é🚀MMMMoM o🚀🚀🚀ééoo 🚀M é🚀M ooéMo 🚀 🚀éM🚀o🚀oé 🚀oMééooo"]], + [ + [ + [ + "0x4f89", + "0xadce4eb732c9f8e71e5c3f87b10e", + "44598453584867922519532923706388542158971849461330", + "-63398827106234", + [[true]] + ], + "1812967080998146360362462321544", + "0xfC03D7A3cC032937288f627831a394E9f7Cf2EB3", + "Moo é🚀o 🚀o🚀 ooMooo🚀Moo🚀é Moéo ééoo éMMéoM éoooMoMM é🚀 🚀🚀éM" + ] + ], + [ + "73008686174554693852374332816814602592382804637", + [ + [ + [[], []], + [ + [ + [false, false], + [false, true] + ], + [[false, false]] + ] + ] + ], + "0x12b81a09a16e22c0fefa3377a2d07945fe69" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o éoo M oM🚀 oo MééMéo🚀ooo M Moééo🚀" + }, + { + "type": "string", + "value": "Moo é🚀 🚀M oM🚀🚀Mo o🚀o🚀 MM 🚀o🚀🚀🚀ooé 🚀🚀o🚀🚀o oooo🚀ooo🚀o🚀é🚀oo🚀M" + }, + { + "type": "string", + "value": "Moo é🚀o🚀MM o Moé oMéoéoéoMo🚀ooMooM🚀 é🚀o MMé ooM é🚀oMM🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀MMMMoM o🚀🚀🚀ééoo 🚀M é🚀M ooéMo 🚀 🚀éM🚀o🚀oé 🚀oMééooo" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4f89" + }, + { + "type": "hexstring", + "value": "0xadce4eb732c9f8e71e5c3f87b10e" + }, + { + "type": "number", + "value": "44598453584867922519532923706388542158971849461330" + }, + { + "type": "number", + "value": "-63398827106234" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "1812967080998146360362462321544" + }, + { + "type": "address", + "value": "0xfC03D7A3cC032937288f627831a394E9f7Cf2EB3" + }, + { + "type": "string", + "value": "Moo é🚀o 🚀o🚀 ooMooo🚀Moo🚀é Moéo ééoo éMMéoM éoooMoMM é🚀 🚀🚀éM" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "73008686174554693852374332816814602592382804637" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x12b81a09a16e22c0fefa3377a2d07945fe69" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610b12806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610850565b60405180910390f35b6100566103fd565b61005e6103fd565b6001815261006a61045e565b60006040518060600160405280603c8152602001610a4e603c91398252506040805160a0810190915260778082526000919061091a60208301399050808260016020020181905250506000604051806080016040528060538152602001610a8a60539139604083810191909152602084810193909352805160608082018352600082860181815283850183905283528351808501855280870183905260018152845160808101909552828552929592945092916109919083013960208301525081526040820152610139610485565b610141610494565b6101496104c0565b614f8960f01b81526d56e7275b9964fc738f2e1fc3d88760911b6020820152741e83f7d31b0e3bbf99769eae36b08b152164b0ce5260408201526539a930919fb91960608201526101986104ec565b6101a0610519565b6001815281526080828101919091529082526c16e2033879250a4ce2ce9b9b8860208381019190915273fc03d7a3cc032937288f627831a394e9f7cf2eb360408085019190915280519283019052605d808352600092916109f19083013960608084019190915291835250820152610216610537565b730cc9d29d65da8714e7a9fb79e2c5aa80c456e29d8152610235610567565b61023d610576565b6102456105a3565b6040805160008082526020820190925281610276565b6102636105bc565b81526020019060019003908161025b5790505b5082525060408051600080825260208201909252816102ab565b6102986105bc565b8152602001906001900390816102905790505b5060208301525081526102bc6105a3565b60408051600280825260608201909252600091816020015b6102dc6105bc565b8152602001906001900390816102d45790505090506102f96105bc565b60008082526020820181905282518291849161031757610317610903565b60200260200101819052505061032b6105bc565b60008152600160208201819052825182918491811061034c5761034c610903565b6020908102919091010152508152604080516001808252818301909252600091816020015b6103796105bc565b8152602001906001900390816103715790505090506103966105bc565b6000808252602082018190528251829184916103b4576103b4610903565b6020908102919091018101919091528381019290925250828101919091529082528201527112b81a09a16e22c0fefa3377a2d07945fe6960701b60408201526080820152919050565b6040518060a0016040528060001515815260200161041961045e565b815260200161043f60408051606080820183526000602083019081529282015290815290565b815260200161044c610485565b8152602001610459610537565b905290565b60405180606001604052806003905b606081526020019060019003908161046d5790505090565b60405180602001604052806104595b60405180608001604052806104a76104c0565b8152600060208201819052604082015260609081015290565b6040805160a0810182526000808252602082018190529181018290526060810191909152608081016104595b60405180602001604052806001905b610503610519565b8152602001906001900390816104fb5790505090565b60405180602001604052806001906020820280368337509192915050565b604051806060016040528060006001600160a01b0316815260200161055a610567565b8152600060209091015290565b60405180602001604052806104595b60405180604001604052806002905b61058d6105a3565b8152602001906001900390816105855790505090565b604080518082019091526060815260016020820161046d565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b81811015610600576020818501810151868301820152016105e4565b81811115610612576000602083870101525b50601f01601f19169290920160200192915050565b805160208084528151151584820152015160408084015260009061064e60608501826105da565b949350505050565b600060208251818552805161ffff60f01b8151168387015271ffffffffffffffffffffffffffffffffffff198382015116604087015260018060a81b036040820151166060870152606081015160050b60808701526080810151905060a086016000805b60018082106106c957506106ff565b845184845b838110156106eb57825115158252918901919089019083016106ce565b5050509386019350918501916001016106ba565b50505050908101516cffffffffffffffffffffffffff1660c085015260408101516001600160a01b031660e0850152606001516101008085015261064e6101208501826105da565b80516001600160a01b03168252602080820151606082850181905290519084018290526000919060c0850160808601845b600281101561082157878303607f190182528351836040810160005b600281101561080c57868203835283518051808452908a01908a84019060005b818110156107f75783518360005b60028110156107e157825115158252918f0191908f01906001016107c2565b505050928c0192604092909201916001016107b4565b5050948a0194938a0193925050600101610794565b50958701959450505090840190600101610778565b50506040850151925061084760408701846dffffffffffffffffffffffffffff19169052565b95945050505050565b602080825282511515828201528281015160a060408401526000919061012084019060c08501845b60038110156108a75760bf198785030182526108958484516105da565b93509184019190840190600101610878565b50505060408501519150601f19808583030160608601526108c88284610627565b925060608601519150808584030160808601526108e58383610656565b925060808601519150808584030160a0860152506108478282610747565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a8020f09f9a804d206f4df09f9a80f09f9a804d6f206ff09f9a806ff09f9a80204d4d20f09f9a806ff09f9a80f09f9a80f09f9a806f6fc3a920f09f9a80f09f9a806ff09f9a80f09f9a806f20206f6f6f6ff09f9a806f6f6ff09f9a806ff09f9a80c3a9f09f9a806f6ff09f9a804d4d6f6f20c3a9f09f9a804d4d4d4d6f4d206ff09f9a80f09f9a80f09f9a80c3a9c3a96f6f20f09f9a804d20c3a9f09f9a804d206f6fc3a94d6f20f09f9a8020f09f9a80c3a94df09f9a806ff09f9a806fc3a920f09f9a806f4dc3a9c3a96f6f6f4d6f6f20c3a9f09f9a806f20f09f9a806ff09f9a80206f6f4d6f6f6ff09f9a804d6f6ff09f9a80c3a9204d6fc3a96f20c3a9c3a96f6f2020c3a94d4dc3a96f4d20c3a96f6f6f4d6f4d4d20c3a9f09f9a8020f09f9a80f09f9a80c3a94d4d6f6f20c3a9f09f9a806f20c3a96f6f204d206f4df09f9a80206f6f20204dc3a9c3a94dc3a96ff09f9a806f6f6f204d204d6fc3a9c3a96ff09f9a804d6f6f20c3a9f09f9a806ff09f9a804d4d206f204d6fc3a9206f4dc3a96fc3a96fc3a96f4d6ff09f9a806f6f4d6f6f4df09f9a8020c3a9f09f9a806f204d4dc3a9206f6f4d20c3a9f09f9a806f4d4df09f9a80a26469706673582212202d384c01fd7bb40c4b9fb16a8b774f9018e1102554d6acf7b18bf42368ac6d9a64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_0e00bb9b {\n bool s_0;\n string s_1;\n }\n\n struct S_1de075c7 {\n S_0e00bb9b s_0;\n }\n\n struct S_820bac46 {\n bytes2 s_0;\n bytes14 s_1;\n uint168 s_2;\n int48 s_3;\n bool[1][1] s_4;\n }\n\n struct S_09091575 {\n S_820bac46 s_0;\n uint104 s_1;\n address s_2;\n string s_3;\n }\n\n struct S_39b3eba2 {\n S_09091575 s_0;\n }\n\n struct S_ee629257 {\n bool[2][][2][2] s_0;\n }\n\n struct S_531f29c6 {\n uint160 s_0;\n S_ee629257 s_1;\n bytes18 s_2;\n }\n\n struct S_510b16e9 {\n bool s_0;\n string[3] s_1;\n S_1de075c7 s_2;\n S_39b3eba2 s_3;\n S_531f29c6 s_4;\n }\n\n function test () public pure returns (S_510b16e9 memory) {\n S_510b16e9 memory r;\n {\n bool r_0 = true;\n r.s_0 = r_0;\n }\n {\n string[3] memory r_1;\n {\n string memory r_1_0 = unicode\"Moo é🚀o éoo M oM🚀 oo MééMéo🚀ooo M Moééo🚀\";\n r_1[0] = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀 🚀M oM🚀🚀Mo o🚀o🚀 MM 🚀o🚀🚀🚀ooé 🚀🚀o🚀🚀o oooo🚀ooo🚀o🚀é🚀oo🚀M\";\n r_1[1] = r_1_1;\n }\n {\n string memory r_1_2 = unicode\"Moo é🚀o🚀MM o Moé oMéoéoéoMo🚀ooMooM🚀 é🚀o MMé ooM é🚀oMM🚀\";\n r_1[2] = r_1_2;\n }\n r.s_1 = r_1;\n }\n {\n S_1de075c7 memory r_2;\n {\n S_0e00bb9b memory r_2_0;\n {\n bool r_2_0_0 = true;\n r_2_0.s_0 = r_2_0_0;\n }\n {\n string memory r_2_0_1 = unicode\"Moo é🚀MMMMoM o🚀🚀🚀ééoo 🚀M é🚀M ooéMo 🚀 🚀éM🚀o🚀oé 🚀oMééooo\";\n r_2_0.s_1 = r_2_0_1;\n }\n r_2.s_0 = r_2_0;\n }\n r.s_2 = r_2;\n }\n {\n S_39b3eba2 memory r_3;\n {\n S_09091575 memory r_3_0;\n {\n S_820bac46 memory r_3_0_0;\n {\n bytes2 r_3_0_0_0 = bytes2(0x4f89);\n r_3_0_0.s_0 = r_3_0_0_0;\n }\n {\n bytes14 r_3_0_0_1 = bytes14(0xadce4eb732c9f8e71e5c3f87b10e);\n r_3_0_0.s_1 = r_3_0_0_1;\n }\n {\n uint168 r_3_0_0_2 = 44598453584867922519532923706388542158971849461330;\n r_3_0_0.s_2 = r_3_0_0_2;\n }\n {\n int48 r_3_0_0_3 = -63398827106234;\n r_3_0_0.s_3 = r_3_0_0_3;\n }\n {\n bool[1][1] memory r_3_0_0_4;\n {\n bool[1] memory r_3_0_0_4_0;\n {\n bool r_3_0_0_4_0_0 = true;\n r_3_0_0_4_0[0] = r_3_0_0_4_0_0;\n }\n r_3_0_0_4[0] = r_3_0_0_4_0;\n }\n r_3_0_0.s_4 = r_3_0_0_4;\n }\n r_3_0.s_0 = r_3_0_0;\n }\n {\n uint104 r_3_0_1 = 1812967080998146360362462321544;\n r_3_0.s_1 = r_3_0_1;\n }\n {\n address r_3_0_2 = 0xfC03D7A3cC032937288f627831a394E9f7Cf2EB3;\n r_3_0.s_2 = r_3_0_2;\n }\n {\n string memory r_3_0_3 = unicode\"Moo é🚀o 🚀o🚀 ooMooo🚀Moo🚀é Moéo ééoo éMMéoM éoooMoMM é🚀 🚀🚀éM\";\n r_3_0.s_3 = r_3_0_3;\n }\n r_3.s_0 = r_3_0;\n }\n r.s_3 = r_3;\n }\n {\n S_531f29c6 memory r_4;\n {\n uint160 r_4_0 = 73008686174554693852374332816814602592382804637;\n r_4.s_0 = r_4_0;\n }\n {\n S_ee629257 memory r_4_1;\n {\n bool[2][][2][2] memory r_4_1_0;\n {\n bool[2][][2] memory r_4_1_0_0;\n {\n bool[2][] memory r_4_1_0_0_0 = new bool[2][](0);\n r_4_1_0_0[0] = r_4_1_0_0_0;\n }\n {\n bool[2][] memory r_4_1_0_0_1 = new bool[2][](0);\n r_4_1_0_0[1] = r_4_1_0_0_1;\n }\n r_4_1_0[0] = r_4_1_0_0;\n }\n {\n bool[2][][2] memory r_4_1_0_1;\n {\n bool[2][] memory r_4_1_0_1_0 = new bool[2][](2);\n {\n bool[2] memory r_4_1_0_1_0_0;\n {\n bool r_4_1_0_1_0_0_0 = false;\n r_4_1_0_1_0_0[0] = r_4_1_0_1_0_0_0;\n }\n {\n bool r_4_1_0_1_0_0_1 = false;\n r_4_1_0_1_0_0[1] = r_4_1_0_1_0_0_1;\n }\n r_4_1_0_1_0[0] = r_4_1_0_1_0_0;\n }\n {\n bool[2] memory r_4_1_0_1_0_1;\n {\n bool r_4_1_0_1_0_1_0 = false;\n r_4_1_0_1_0_1[0] = r_4_1_0_1_0_1_0;\n }\n {\n bool r_4_1_0_1_0_1_1 = true;\n r_4_1_0_1_0_1[1] = r_4_1_0_1_0_1_1;\n }\n r_4_1_0_1_0[1] = r_4_1_0_1_0_1;\n }\n r_4_1_0_1[0] = r_4_1_0_1_0;\n }\n {\n bool[2][] memory r_4_1_0_1_1 = new bool[2][](1);\n {\n bool[2] memory r_4_1_0_1_1_0;\n {\n bool r_4_1_0_1_1_0_0 = false;\n r_4_1_0_1_1_0[0] = r_4_1_0_1_1_0_0;\n }\n {\n bool r_4_1_0_1_1_0_1 = false;\n r_4_1_0_1_1_0[1] = r_4_1_0_1_1_0_1;\n }\n r_4_1_0_1_1[0] = r_4_1_0_1_1_0;\n }\n r_4_1_0_1[1] = r_4_1_0_1_1;\n }\n r_4_1_0[1] = r_4_1_0_1;\n }\n r_4_1.s_0 = r_4_1_0;\n }\n r_4.s_1 = r_4_1;\n }\n {\n bytes18 r_4_2 = bytes18(0x12b81a09a16e22c0fefa3377a2d07945fe69);\n r_4.s_2 = r_4_2;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806f20c3a96f6f204d206f4df09f9a80206f6f20204dc3a9c3a94dc3a96ff09f9a806f6f6f204d204d6fc3a9c3a96ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000774d6f6f20c3a9f09f9a8020f09f9a804d206f4df09f9a80f09f9a804d6f206ff09f9a806ff09f9a80204d4d20f09f9a806ff09f9a80f09f9a80f09f9a806f6fc3a920f09f9a80f09f9a806ff09f9a80f09f9a806f20206f6f6f6ff09f9a806f6f6ff09f9a806ff09f9a80c3a9f09f9a806f6ff09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a806ff09f9a804d4d206f204d6fc3a9206f4dc3a96fc3a96fc3a96f4d6ff09f9a806f6f4d6f6f4df09f9a8020c3a9f09f9a806f204d4dc3a9206f6f4d20c3a9f09f9a806f4d4df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a804d4d4d4d6f4d206ff09f9a80f09f9a80f09f9a80c3a9c3a96f6f20f09f9a804d20c3a9f09f9a804d206f6fc3a94d6f20f09f9a8020f09f9a80c3a94df09f9a806ff09f9a806fc3a920f09f9a806f4dc3a9c3a96f6f6f00000000000000000000000000000000000000000000000000000000000000204f89000000000000000000000000000000000000000000000000000000000000adce4eb732c9f8e71e5c3f87b10e00000000000000000000000000000000000000000000000000000000001e83f7d31b0e3bbf99769eae36b08b152164b0ce52ffffffffffffffffffffffffffffffffffffffffffffffffffffc656cf6e604600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000016e2033879250a4ce2ce9b9b88000000000000000000000000fc03d7a3cc032937288f627831a394e9f7cf2eb30000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a806f20f09f9a806ff09f9a80206f6f4d6f6f6ff09f9a804d6f6ff09f9a80c3a9204d6fc3a96f20c3a9c3a96f6f2020c3a94d4dc3a96f4d20c3a96f6f6f4d6f4d4d20c3a9f09f9a8020f09f9a80f09f9a80c3a94d0000000000000000000000000000000cc9d29d65da8714e7a9fb79e2c5aa80c456e29d000000000000000000000000000000000000000000000000000000000000006012b81a09a16e22c0fefa3377a2d07945fe6900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(uint120,(address,(string,bytes2,(uint32,bool[4],bytes2,string,bool),address)[][4][],bytes21[4][1],bytes4,string),string[][])", + "type": "(uint120,(address,(string,bytes2,(uint32,bool[4],bytes2,string,bool),address)[][4][],bytes21[4][1],bytes4,string),string[][])", + "value": [ + "118032467151180840678421008543178929", + [ + "0x2c04BF96b436c20513eef153409Fa89714a44098", + [ + [ + [ + [ + "Moo é🚀", + "0x37bc", + [ + "325789764", + [true, false, false, true], + "0xe17a", + "Moo é🚀o éé", + true + ], + "0xCC35f88Eb8eFe1867f72e69F7C57532d17052D45" + ], + [ + "Moo é🚀oM 🚀 MéoéMéooMo éoooé", + "0x722f", + [ + "3089238400", + [false, false, false, false], + "0x4d81", + "Moo é🚀 o 🚀o", + true + ], + "0x75F4cc7FAc6eBB3016776DF0Cfec941f72dA2420" + ], + [ + "Moo é🚀o🚀M🚀oMoéo o ooéé🚀oé éoMoooMéoo🚀é ooo o", + "0x5b67", + [ + "4061355906", + [true, true, true, true], + "0x2077", + "Moo é🚀 ", + false + ], + "0xe078797A9feB2B8a9d2E37156a574776A961124D" + ] + ], + [], + [ + [ + "Moo é🚀o", + "0x974f", + [ + "2632340480", + [true, true, true, false], + "0xd827", + "Moo é🚀oM M ooo🚀éoooéMMMoMoé oéoo🚀o 🚀", + true + ], + "0xcaA3251d916a0f8677c7997133E2a0c6e6D24e73" + ], + [ + "Moo é🚀MéM é", + "0xf527", + [ + "8870127", + [false, false, false, true], + "0x22aa", + "Moo é🚀 éooMé🚀oMo oéoooMo o🚀 Mo🚀oo", + false + ], + "0x08E1Ccf9494E2f2995e65fD03F4435C96DF32B05" + ], + [ + "Moo é🚀oééM🚀Moé o🚀 🚀oéoéoo🚀o🚀é ééM🚀MM oM🚀 MMMoooéoo", + "0x61fe", + [ + "3308472352", + [false, false, false, false], + "0xac2a", + "Moo é🚀 o🚀ooooMMooé🚀oM🚀o🚀 o🚀🚀Mooé🚀🚀 o o", + false + ], + "0x8b8EB017d542ACe3fA11f3329a3508cdca5c0c0b" + ], + [ + "Moo é🚀🚀", + "0xecfa", + [ + "1255130709", + [false, false, true, false], + "0x5ab3", + "Moo é🚀🚀é🚀oM 🚀oé🚀o 🚀ooMoo 🚀éM 🚀 ", + false + ], + "0x2Dfd4D17bfE574f45828acE6D919A8e1F0Ae48e6" + ] + ], + [ + [ + "Moo é🚀o🚀oéooMé", + "0x6dce", + [ + "331747208", + [true, true, true, false], + "0x5225", + "Moo é🚀🚀 oM🚀🚀oéM🚀 éMé o M oéo🚀MMoM🚀o🚀o Mo 🚀", + false + ], + "0x7A51df6b8783FaF41CAe7F2Bc3e9Cc527275831F" + ], + [ + "Moo é🚀éooé oM🚀🚀🚀o éoo 🚀🚀o 🚀oo🚀🚀", + "0x6719", + [ + "1565095980", + [false, false, true, false], + "0x9a59", + "Moo é🚀o🚀M🚀MéoM🚀o éo🚀o ééé", + false + ], + "0x70713845Aa0e0B376762fac0615b2f5c0A53660A" + ], + [ + "Moo é🚀M", + "0x0da2", + [ + "2374059176", + [true, true, false, false], + "0x1fd5", + "Moo é🚀ooMoé🚀🚀🚀o🚀 é🚀Mé Moo o oM🚀🚀MéooMo oéé🚀🚀 é🚀", + true + ], + "0x865CBdD0b922d9dC232BFc45A259117CA1e37ca1" + ], + [ + "Moo é🚀🚀 ", + "0xc084", + [ + "3977201122", + [true, true, false, true], + "0x5e19", + "Moo é🚀oMo éo 🚀 oMéé o oMMoéMoo ééMoooéo", + false + ], + "0x7EF9634CE309dC670cf64e79D1330e1906fDC807" + ] + ] + ] + ], + [ + [ + "0xc48413c2682ffae9c5f3177dbbf96bdc608df1b25b", + "0xd54f17f43b0f79d669affeeeee352e067b548f5ea1", + "0xaddf381c7bce57bd3ea070e22611ceb5be0251a5c8", + "0x5d5512b68391dcb24aa1074f11e6c291e78651e0c7" + ] + ], + "0xb17ac19b", + "Moo é🚀🚀o oé🚀ooMo🚀é🚀🚀o🚀ooéé ooéoo " + ], + [ + [], + ["Moo é🚀M🚀🚀o🚀éo o M🚀MéooMoo🚀 éMMMMo🚀é🚀 ééoé 🚀", "Moo é🚀"], + ["Moo é🚀oéo o🚀ooééMM 🚀o🚀MMé🚀🚀éMM🚀🚀🚀oéMooéo", "Moo é🚀"] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "118032467151180840678421008543178929" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2c04BF96b436c20513eef153409Fa89714a44098" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x37bc" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "325789764" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xe17a" + }, + { + "type": "string", + "value": "Moo é🚀o éé" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xCC35f88Eb8eFe1867f72e69F7C57532d17052D45" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oM 🚀 MéoéMéooMo éoooé" + }, + { + "type": "hexstring", + "value": "0x722f" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3089238400" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x4d81" + }, + { + "type": "string", + "value": "Moo é🚀 o 🚀o" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x75F4cc7FAc6eBB3016776DF0Cfec941f72dA2420" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀M🚀oMoéo o ooéé🚀oé éoMoooMéoo🚀é ooo o" + }, + { + "type": "hexstring", + "value": "0x5b67" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4061355906" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x2077" + }, + { + "type": "string", + "value": "Moo é🚀 " + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0xe078797A9feB2B8a9d2E37156a574776A961124D" + } + ] + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o" + }, + { + "type": "hexstring", + "value": "0x974f" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2632340480" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xd827" + }, + { + "type": "string", + "value": "Moo é🚀oM M ooo🚀éoooéMMMoMoé oéoo🚀o 🚀" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0xcaA3251d916a0f8677c7997133E2a0c6e6D24e73" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéM é" + }, + { + "type": "hexstring", + "value": "0xf527" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "8870127" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x22aa" + }, + { + "type": "string", + "value": "Moo é🚀 éooMé🚀oMo oéoooMo o🚀 Mo🚀oo" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x08E1Ccf9494E2f2995e65fD03F4435C96DF32B05" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oééM🚀Moé o🚀 🚀oéoéoo🚀o🚀é ééM🚀MM oM🚀 MMMoooéoo" + }, + { + "type": "hexstring", + "value": "0x61fe" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3308472352" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xac2a" + }, + { + "type": "string", + "value": "Moo é🚀 o🚀ooooMMooé🚀oM🚀o🚀 o🚀🚀Mooé🚀🚀 o o" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x8b8EB017d542ACe3fA11f3329a3508cdca5c0c0b" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀" + }, + { + "type": "hexstring", + "value": "0xecfa" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1255130709" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x5ab3" + }, + { + "type": "string", + "value": "Moo é🚀🚀é🚀oM 🚀oé🚀o 🚀ooMoo 🚀éM 🚀 " + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x2Dfd4D17bfE574f45828acE6D919A8e1F0Ae48e6" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀oéooMé" + }, + { + "type": "hexstring", + "value": "0x6dce" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "331747208" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x5225" + }, + { + "type": "string", + "value": "Moo é🚀🚀 oM🚀🚀oéM🚀 éMé o M oéo🚀MMoM🚀o🚀o Mo 🚀" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x7A51df6b8783FaF41CAe7F2Bc3e9Cc527275831F" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooé oM🚀🚀🚀o éoo 🚀🚀o 🚀oo🚀🚀" + }, + { + "type": "hexstring", + "value": "0x6719" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1565095980" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x9a59" + }, + { + "type": "string", + "value": "Moo é🚀o🚀M🚀MéoM🚀o éo🚀o ééé" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x70713845Aa0e0B376762fac0615b2f5c0A53660A" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M" + }, + { + "type": "hexstring", + "value": "0x0da2" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2374059176" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x1fd5" + }, + { + "type": "string", + "value": "Moo é🚀ooMoé🚀🚀🚀o🚀 é🚀Mé Moo o oM🚀🚀MéooMo oéé🚀🚀 é🚀" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x865CBdD0b922d9dC232BFc45A259117CA1e37ca1" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 " + }, + { + "type": "hexstring", + "value": "0xc084" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3977201122" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x5e19" + }, + { + "type": "string", + "value": "Moo é🚀oMo éo 🚀 oMéé o oMMoéMoo ééMoooéo" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "address", + "value": "0x7EF9634CE309dC670cf64e79D1330e1906fDC807" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc48413c2682ffae9c5f3177dbbf96bdc608df1b25b" + }, + { + "type": "hexstring", + "value": "0xd54f17f43b0f79d669affeeeee352e067b548f5ea1" + }, + { + "type": "hexstring", + "value": "0xaddf381c7bce57bd3ea070e22611ceb5be0251a5c8" + }, + { + "type": "hexstring", + "value": "0x5d5512b68391dcb24aa1074f11e6c291e78651e0c7" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xb17ac19b" + }, + { + "type": "string", + "value": "Moo é🚀🚀o oé🚀ooMo🚀é🚀🚀o🚀ooéé ooéoo " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀M🚀🚀o🚀éo o M🚀MéooMoo🚀 éMMMMo🚀é🚀 ééoé 🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéo o🚀ooééMM 🚀o🚀MMé🚀🚀éMM🚀🚀🚀oéMooéo" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061180c806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906111a8565b60405180910390f35b610056610f1f565b61005e610f1f565b6e16bb732e9f42464ca26c170e00e0b18152610078610f4f565b732c04bf96b436c20513eef153409fa89714a440988152604080516001808252818301909252600091816020015b6100ae610f83565b8152602001906001900390816100a65790505090506100cb610f83565b60408051600380825260808201909252600091816020015b6100eb610faa565b8152602001906001900390816100e3579050509050610108610faa565b60408051808201909152600a8152689adede418753e13f3560b71b602080830191909152908252610def60f21b90820152610141610fd7565b63136b28448152610150611012565b60018082526000602080840182905260408085018390526060808601859052868301959095526170bd60f11b8682015280518082018252601081526f4d6f6f20c3a9f09f9a806f20c3a9c3a960801b928101929092528585019190915260808501929092529084019290925273cc35f88eb8efe1867f72e69f7c57532d17052d45908301528251829184916101e7576101e76113f8565b6020026020010181905250506101fb610faa565b60006040518060600160405280602781526020016114d16027913982525061722f60f01b602082015261022c610fd7565b63b8220980815261023b611012565b60008082526020808301829052604080840183905260608085019390935284820193909352614d8160f01b848401528251808401845260128152714d6f6f20c3a9f09f9a80206f20f09f9a806f60701b9181019190915283820152600160808401819052918401929092527375f4cc7fac6ebb3016776df0cfec941f72da24209183019190915282518291849181106102d6576102d66113f8565b6020026020010181905250506102ea610faa565b600060405180608001604052806043815260200161165a60439139825250615b6760f01b602082015261031b610fd7565b63f2135f82815261032a611012565b6001808252602080830182905260408084018390526060808501939093528482019390935261207760f01b8484015282518084018452600b81526a026b7b79061d4f84fcd40160ad1b9181019190915283820152600060808401529083019190915273e078797a9feb2b8a9d2e37156a574776a961124d9082015281518190839060029081106103bc576103bc6113f8565b60209081029190910181019190915291835250604080516000808252928101909152816103ff565b6103ec610faa565b8152602001906001900390816103e45790505b5060208301525060408051600480825260a08201909252600091816020015b610426610faa565b81526020019060019003908161041e579050509050610443610faa565b60408051808201909152600b81526a4d6f6f20c3a9f09f9a806f60a81b60208083019190915290825261974f60f01b9082015261047e610fd7565b639ce65400815261048d611012565b60018082526020808301829052604080840192909252600060608085018290528583019490945261d82760f01b85840152825193840190925260368084529192919061144d908301396060808401919091526001608084015260408401929092525073caa3251d916a0f8677c7997133e2a0c6e6d24e739082015281518190839060009061051d5761051d6113f8565b602002602001018190525050610531610faa565b6040805180820190915260118152704d6f6f20c3a9f09f9a804dc3a94d20c3a960781b60208083019190915290825261f52760f01b90820152610572610fd7565b628758ef8152610580611012565b60008082526020808301829052604080840183905260016060808601919091528583019490945261115560f11b858201528051938401905260328084529192919061169d90830139606080840191909152600060808401526040840192909252507308e1ccf9494e2f2995e65fd03f4435c96df32b05908201528151819083906001908110610611576106116113f8565b602002602001018190525050610625610faa565b60006040518060800160405280605681526020016115ac605691398252506130ff60f11b6020820152610656610fd7565b63c53348208152610665611012565b600080825260208083018290526040808401839052606084018390528482019390935261561560f11b848401528251608081019093526044808452919291906117479083013960608084019190915260006080840152604084019290925250738b8eb017d542ace3fa11f3329a3508cdca5c0c0b9082015281518190839060029081106106f4576106f46113f8565b602002602001018190525050610708610faa565b60408051808201909152600e81526c9adede418753e13f3501e13f3560971b60208083019190915290825261767d60f11b90820152610745610fd7565b634acfc6558152610754611012565b600080825260208083018290526001604080850191909152606080850184905285830194909452615ab360f01b8582015280519384019052603e8084529192919061140f9083013960608084019190915260006080840152604084019290925250732dfd4d17bfe574f45828ace6d919a8e1f0ae48e69082015281518190839060039081106107e5576107e56113f8565b6020908102919091010152506040808301919091528051600480825260a08201909252600091816020015b610818610faa565b815260200190600190039081610810579050509050610835610faa565b60408051808201909152601781527f4d6f6f20c3a9f09f9a806ff09f9a806fc3a96f6f4dc3a90000000000000000006020808301919091529082526136e760f11b90820152610882610fd7565b6313c60f888152610891611012565b600180825260208083018290526040808401929092526000606084018190528482019390935261522560f01b84830152815160808101909252604a808352906116cf908301396060808401919091526000608084018190526040850193909352737a51df6b8783faf41cae7f2bc3e9cc527275831f908401525082518291849161091d5761091d6113f8565b602002602001018190525050610931610faa565b60006040518060600160405280603f81526020016114f8603f913982525061671960f01b6020820152610962610fd7565b635d49782c8152610971611012565b600080825260208083018290526001604080850191909152606080850184905285830194909452619a5960f01b8582015280519384019052602e8084529192919061171990830139606080840191909152600060808401526040840192909252507370713845aa0e0b376762fac0615b2f5c0a53660a908201528151819083906001908110610a0257610a026113f8565b602002602001018190525050610a16610faa565b60408051808201909152600b81526a4d6f6f20c3a9f09f9a804d60a81b6020808301919091529082526106d160f11b90820152610a51610fd7565b638d8144a88152610a60611012565b6001808252602080830191909152600060408084018290526060840182905284830193909352611fd560f01b848401528251608081019093526058808452909291611602908301396060808401919091526001608084015260408401929092525073865cbdd0b922d9dc232bfc45a259117ca1e37ca1908201528151819083906002908110610af157610af16113f8565b602002602001018190525050610b05610faa565b60408051808201909152600f81526e026b7b79061d4f84fcd40784fcd401608d1b60208083019190915290825261302160f21b90820152610b44610fd7565b63ed0f45e28152610b53611012565b600180825260208083018290526000604080850182905260608086019490945285830194909452615e1960f01b8585015283519283019093526039808352906115379083013960608084019190915260006080840152604084019290925250737ef9634ce309dc670cf64e79d1330e1906fdc807908201528151819083906003908110610be257610be26113f8565b6020908102919091010152506060820152815181908390600090610c0857610c086113f8565b60200260200101819052505080826020018190525050610c26611030565b610c2e611012565b74c48413c2682ffae9c5f3177dbbf96bdc608df1b25b60581b815274d54f17f43b0f79d669affeeeee352e067b548f5ea160581b6020808301919091527415bbe7038f79caf7a7d40e1c44c239d6b7c04a34b9605b1b604080840191909152745d5512b68391dcb24aa1074f11e6c291e78651e0c760581b6060808501919091529284528481019390935263b17ac19b60e01b848301528251918201909252603c80825260009261157090830139608083015250602082015260006003604051908082528060200260200182016040528015610d1e57816020015b6060815260200190600190039081610d095790505b50604080516000808252602082019092529192509081610d4e565b6060815260200190600190039081610d395790505b5090508082600081518110610d6557610d656113f8565b60209081029190910101525060408051600280825260608201909252600091816020015b6060815260200190600190039081610d8957905050905060006040518060800160405280604e8152602001611483604e913990508082600081518110610dd157610dd16113f8565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b81525090508082600181518110610e1757610e176113f8565b6020026020010181905250508082600181518110610e3757610e376113f8565b60209081029190910101525060408051600280825260608201909252600091816020015b6060815260200190600190039081610e5b57905050905060006040518060800160405280604c815260200161178b604c913990508082600081518110610ea357610ea36113f8565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b81525090508082600181518110610ee957610ee96113f8565b6020026020010181905250508082600281518110610f0957610f096113f8565b6020908102919091010152506040820152919050565b604051806060016040528060006001600160781b03168152602001610f42610f4f565b8152602001606081525090565b6040805160a0810182526000815260606020820152908101610f6f611030565b815260006020820152606060409091015290565b60405180608001604052806004905b6060815260200190600190039081610f925790505090565b604080516080810182526060815260006020820152908101610fca610fd7565b8152600060209091015290565b6040518060a00160405280600063ffffffff168152602001610ff7611012565b81526000602082018190526060604083018190529091015290565b60405180608001604052806004906020820280368337509192915050565b60405180602001604052806001905b611047611012565b81526020019060019003908161103f5790505090565b6000815180845260005b8181101561108357602081850181015186830182015201611067565b81811115611095576000602083870101525b50601f01601f19169290920160200192915050565b806000805b60018082106110be5750611109565b835186845b60048110156110ef5782516affffffffffffffffffffff191682526020928301929091019083016110c3565b5050506080959095019450602092909201916001016110af565b5050505050565b600081518084526020808501808196506005915083821b81018387016000805b87811015611199578484038b5282518051808652908801908886019080891b87018a01855b8281101561118357601f1989830301845261117182865161105d565b948c0194938c01939150600101611155565b509d8a019d965050509287019250600101611130565b50919998505050505050505050565b602080825282516001600160781b031682820152828101516060604084015280516001600160a01b031660808401528082015161010060a08501528051610180850181905260009391909101906101a08086019190600582901b870101855b828110156113835787820361019f190184528451826080810160005b600481101561136b578582038352835180518084526020918201918085019190600582901b86010160005b8281101561134e57601f198783030184528451805160808452611274608085018261105d565b905061ffff60f01b60208301511660208501526040820151848203604086015263ffffffff815116825260208101516020830160005b60048110156112cb57825115158252602092830192909101906001016112aa565b50505060408101516001600160f01b0319811660a084015250606081015161010060c08401526112ff61010084018261105d565b90506080820151915061131660e084018315159052565b6060840151935061133260608701856001600160a01b03169052565b602098890198979097019694505050600191909101905061124e565b506020978801979690960195945050506001919091019050611223565b50602097880197969096019593505050600101611207565b506040850151935061139860c08801856110aa565b60608501516001600160e01b03198116610140890152608090950151878203607f19016101608901529493506113ce818661105d565b9450505050506040840151601f198483030160608501526113ef8282611110565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a806f4d20f09f9a806fc3a9f09f9a806f202020f09f9a806f6f4d6f6f2020f09f9a80c3a94d20f09f9a80204d6f6f20c3a9f09f9a806f4d204d206f6f6ff09f9a80c3a96f6f6fc3a94d4d4d6f4d6fc3a920206fc3a96f6ff09f9a806f20f09f9a804d6f6f20c3a9f09f9a804df09f9a80f09f9a806ff09f9a80c3a96f206f204df09f9a804dc3a96f6f4d6f6ff09f9a8020c3a94d4d4d4d6ff09f9a80c3a9f09f9a8020c3a9c3a96fc3a920f09f9a804d6f6f20c3a9f09f9a806f4d20f09f9a80204dc3a96fc3a94dc3a96f6f4d6f20c3a96f6f6fc3a94d6f6f20c3a9f09f9a80c3a96f6fc3a920206f4df09f9a80f09f9a80f09f9a806f20c3a96f6f20f09f9a80f09f9a806f20f09f9a806f6ff09f9a80f09f9a804d6f6f20c3a9f09f9a806f4d6f2020c3a96f2020f09f9a80206f4dc3a9c3a920206f206f4d4d6fc3a94d6f6f2020c3a9c3a94d6f6f6fc3a96f4d6f6f20c3a9f09f9a80f09f9a806f206fc3a9f09f9a806f6f4d6ff09f9a80c3a9f09f9a80f09f9a806ff09f9a806f6fc3a9c3a9206f6fc3a96f6f204d6f6f20c3a9f09f9a806fc3a9c3a94df09f9a804d6fc3a9206ff09f9a8020f09f9a806fc3a96fc3a96f6ff09f9a806ff09f9a80c3a92020c3a9c3a94df09f9a804d4d206f4df09f9a8020204d4d4d6f6f6fc3a96f6f4d6f6f20c3a9f09f9a806f6f4d6fc3a9f09f9a80f09f9a80f09f9a806ff09f9a8020c3a9f09f9a804dc3a9204d6f6f206f206f4df09f9a80f09f9a804dc3a96f6f4d6f206fc3a9c3a9f09f9a80f09f9a8020c3a9f09f9a804d6f6f20c3a9f09f9a806ff09f9a804df09f9a806f4d6fc3a96f206f206f6fc3a9c3a9f09f9a806fc3a920c3a96f4d6f6f6f4dc3a96f6ff09f9a80c3a9206f6f6f206f4d6f6f20c3a9f09f9a802020c3a96f6f4dc3a9f09f9a806f4d6f206fc3a96f6f6f4d6f206ff09f9a80204d6ff09f9a806f6f4d6f6f20c3a9f09f9a80f09f9a80206f4df09f9a80f09f9a806fc3a94df09f9a8020c3a94dc3a9206f204d206fc3a96ff09f9a804d4d6f4df09f9a806ff09f9a806f204d6f20f09f9a804d6f6f20c3a9f09f9a806ff09f9a804df09f9a804dc3a96f4df09f9a806f20c3a96ff09f9a806f20c3a9c3a9c3a94d6f6f20c3a9f09f9a80206ff09f9a806f6f6f6f4d4d6f6fc3a9f09f9a806f4df09f9a806ff09f9a80206ff09f9a80f09f9a804d6f6fc3a9f09f9a80f09f9a80206f206f4d6f6f20c3a9f09f9a806fc3a96f206ff09f9a806f6fc3a9c3a94d4d2020f09f9a806ff09f9a804d4dc3a9f09f9a80f09f9a80c3a94d4df09f9a80f09f9a80f09f9a806fc3a94d6f6fc3a96fa264697066735822122004e1b9560980eeaf0494fd2cfe252cace67541023f04937b37d795b8647b909564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b73ee2ba {\n uint32 s_0;\n bool[4] s_1;\n bytes2 s_2;\n string s_3;\n bool s_4;\n }\n\n struct S_fc8d639a {\n string s_0;\n bytes2 s_1;\n S_b73ee2ba s_2;\n address s_3;\n }\n\n struct S_5597625f {\n address s_0;\n S_fc8d639a[][4][] s_1;\n bytes21[4][1] s_2;\n bytes4 s_3;\n string s_4;\n }\n\n struct S_bef65855 {\n uint120 s_0;\n S_5597625f s_1;\n string[][] s_2;\n }\n\n function test () public pure returns (S_bef65855 memory) {\n S_bef65855 memory r;\n {\n uint120 r_0 = 118032467151180840678421008543178929;\n r.s_0 = r_0;\n }\n {\n S_5597625f memory r_1;\n {\n address r_1_0 = 0x2c04BF96b436c20513eef153409Fa89714a44098;\n r_1.s_0 = r_1_0;\n }\n {\n S_fc8d639a[][4][] memory r_1_1 = new S_fc8d639a[][4][](1);\n {\n S_fc8d639a[][4] memory r_1_1_0;\n {\n S_fc8d639a[] memory r_1_1_0_0 = new S_fc8d639a[](3);\n {\n S_fc8d639a memory r_1_1_0_0_0;\n {\n string memory r_1_1_0_0_0_0 = unicode\"Moo é🚀\";\n r_1_1_0_0_0.s_0 = r_1_1_0_0_0_0;\n }\n {\n bytes2 r_1_1_0_0_0_1 = bytes2(0x37bc);\n r_1_1_0_0_0.s_1 = r_1_1_0_0_0_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_0_0_2;\n {\n uint32 r_1_1_0_0_0_2_0 = 325789764;\n r_1_1_0_0_0_2.s_0 = r_1_1_0_0_0_2_0;\n }\n {\n bool[4] memory r_1_1_0_0_0_2_1;\n {\n bool r_1_1_0_0_0_2_1_0 = true;\n r_1_1_0_0_0_2_1[0] = r_1_1_0_0_0_2_1_0;\n }\n {\n bool r_1_1_0_0_0_2_1_1 = false;\n r_1_1_0_0_0_2_1[1] = r_1_1_0_0_0_2_1_1;\n }\n {\n bool r_1_1_0_0_0_2_1_2 = false;\n r_1_1_0_0_0_2_1[2] = r_1_1_0_0_0_2_1_2;\n }\n {\n bool r_1_1_0_0_0_2_1_3 = true;\n r_1_1_0_0_0_2_1[3] = r_1_1_0_0_0_2_1_3;\n }\n r_1_1_0_0_0_2.s_1 = r_1_1_0_0_0_2_1;\n }\n {\n bytes2 r_1_1_0_0_0_2_2 = bytes2(0xe17a);\n r_1_1_0_0_0_2.s_2 = r_1_1_0_0_0_2_2;\n }\n {\n string memory r_1_1_0_0_0_2_3 = unicode\"Moo é🚀o éé\";\n r_1_1_0_0_0_2.s_3 = r_1_1_0_0_0_2_3;\n }\n {\n bool r_1_1_0_0_0_2_4 = true;\n r_1_1_0_0_0_2.s_4 = r_1_1_0_0_0_2_4;\n }\n r_1_1_0_0_0.s_2 = r_1_1_0_0_0_2;\n }\n {\n address r_1_1_0_0_0_3 = 0xCC35f88Eb8eFe1867f72e69F7C57532d17052D45;\n r_1_1_0_0_0.s_3 = r_1_1_0_0_0_3;\n }\n r_1_1_0_0[0] = r_1_1_0_0_0;\n }\n {\n S_fc8d639a memory r_1_1_0_0_1;\n {\n string memory r_1_1_0_0_1_0 = unicode\"Moo é🚀oM 🚀 MéoéMéooMo éoooé\";\n r_1_1_0_0_1.s_0 = r_1_1_0_0_1_0;\n }\n {\n bytes2 r_1_1_0_0_1_1 = bytes2(0x722f);\n r_1_1_0_0_1.s_1 = r_1_1_0_0_1_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_0_1_2;\n {\n uint32 r_1_1_0_0_1_2_0 = 3089238400;\n r_1_1_0_0_1_2.s_0 = r_1_1_0_0_1_2_0;\n }\n {\n bool[4] memory r_1_1_0_0_1_2_1;\n {\n bool r_1_1_0_0_1_2_1_0 = false;\n r_1_1_0_0_1_2_1[0] = r_1_1_0_0_1_2_1_0;\n }\n {\n bool r_1_1_0_0_1_2_1_1 = false;\n r_1_1_0_0_1_2_1[1] = r_1_1_0_0_1_2_1_1;\n }\n {\n bool r_1_1_0_0_1_2_1_2 = false;\n r_1_1_0_0_1_2_1[2] = r_1_1_0_0_1_2_1_2;\n }\n {\n bool r_1_1_0_0_1_2_1_3 = false;\n r_1_1_0_0_1_2_1[3] = r_1_1_0_0_1_2_1_3;\n }\n r_1_1_0_0_1_2.s_1 = r_1_1_0_0_1_2_1;\n }\n {\n bytes2 r_1_1_0_0_1_2_2 = bytes2(0x4d81);\n r_1_1_0_0_1_2.s_2 = r_1_1_0_0_1_2_2;\n }\n {\n string memory r_1_1_0_0_1_2_3 = unicode\"Moo é🚀 o 🚀o\";\n r_1_1_0_0_1_2.s_3 = r_1_1_0_0_1_2_3;\n }\n {\n bool r_1_1_0_0_1_2_4 = true;\n r_1_1_0_0_1_2.s_4 = r_1_1_0_0_1_2_4;\n }\n r_1_1_0_0_1.s_2 = r_1_1_0_0_1_2;\n }\n {\n address r_1_1_0_0_1_3 = 0x75F4cc7FAc6eBB3016776DF0Cfec941f72dA2420;\n r_1_1_0_0_1.s_3 = r_1_1_0_0_1_3;\n }\n r_1_1_0_0[1] = r_1_1_0_0_1;\n }\n {\n S_fc8d639a memory r_1_1_0_0_2;\n {\n string memory r_1_1_0_0_2_0 = unicode\"Moo é🚀o🚀M🚀oMoéo o ooéé🚀oé éoMoooMéoo🚀é ooo o\";\n r_1_1_0_0_2.s_0 = r_1_1_0_0_2_0;\n }\n {\n bytes2 r_1_1_0_0_2_1 = bytes2(0x5b67);\n r_1_1_0_0_2.s_1 = r_1_1_0_0_2_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_0_2_2;\n {\n uint32 r_1_1_0_0_2_2_0 = 4061355906;\n r_1_1_0_0_2_2.s_0 = r_1_1_0_0_2_2_0;\n }\n {\n bool[4] memory r_1_1_0_0_2_2_1;\n {\n bool r_1_1_0_0_2_2_1_0 = true;\n r_1_1_0_0_2_2_1[0] = r_1_1_0_0_2_2_1_0;\n }\n {\n bool r_1_1_0_0_2_2_1_1 = true;\n r_1_1_0_0_2_2_1[1] = r_1_1_0_0_2_2_1_1;\n }\n {\n bool r_1_1_0_0_2_2_1_2 = true;\n r_1_1_0_0_2_2_1[2] = r_1_1_0_0_2_2_1_2;\n }\n {\n bool r_1_1_0_0_2_2_1_3 = true;\n r_1_1_0_0_2_2_1[3] = r_1_1_0_0_2_2_1_3;\n }\n r_1_1_0_0_2_2.s_1 = r_1_1_0_0_2_2_1;\n }\n {\n bytes2 r_1_1_0_0_2_2_2 = bytes2(0x2077);\n r_1_1_0_0_2_2.s_2 = r_1_1_0_0_2_2_2;\n }\n {\n string memory r_1_1_0_0_2_2_3 = unicode\"Moo é🚀 \";\n r_1_1_0_0_2_2.s_3 = r_1_1_0_0_2_2_3;\n }\n {\n bool r_1_1_0_0_2_2_4 = false;\n r_1_1_0_0_2_2.s_4 = r_1_1_0_0_2_2_4;\n }\n r_1_1_0_0_2.s_2 = r_1_1_0_0_2_2;\n }\n {\n address r_1_1_0_0_2_3 = 0xe078797A9feB2B8a9d2E37156a574776A961124D;\n r_1_1_0_0_2.s_3 = r_1_1_0_0_2_3;\n }\n r_1_1_0_0[2] = r_1_1_0_0_2;\n }\n r_1_1_0[0] = r_1_1_0_0;\n }\n {\n S_fc8d639a[] memory r_1_1_0_1 = new S_fc8d639a[](0);\n r_1_1_0[1] = r_1_1_0_1;\n }\n {\n S_fc8d639a[] memory r_1_1_0_2 = new S_fc8d639a[](4);\n {\n S_fc8d639a memory r_1_1_0_2_0;\n {\n string memory r_1_1_0_2_0_0 = unicode\"Moo é🚀o\";\n r_1_1_0_2_0.s_0 = r_1_1_0_2_0_0;\n }\n {\n bytes2 r_1_1_0_2_0_1 = bytes2(0x974f);\n r_1_1_0_2_0.s_1 = r_1_1_0_2_0_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_2_0_2;\n {\n uint32 r_1_1_0_2_0_2_0 = 2632340480;\n r_1_1_0_2_0_2.s_0 = r_1_1_0_2_0_2_0;\n }\n {\n bool[4] memory r_1_1_0_2_0_2_1;\n {\n bool r_1_1_0_2_0_2_1_0 = true;\n r_1_1_0_2_0_2_1[0] = r_1_1_0_2_0_2_1_0;\n }\n {\n bool r_1_1_0_2_0_2_1_1 = true;\n r_1_1_0_2_0_2_1[1] = r_1_1_0_2_0_2_1_1;\n }\n {\n bool r_1_1_0_2_0_2_1_2 = true;\n r_1_1_0_2_0_2_1[2] = r_1_1_0_2_0_2_1_2;\n }\n {\n bool r_1_1_0_2_0_2_1_3 = false;\n r_1_1_0_2_0_2_1[3] = r_1_1_0_2_0_2_1_3;\n }\n r_1_1_0_2_0_2.s_1 = r_1_1_0_2_0_2_1;\n }\n {\n bytes2 r_1_1_0_2_0_2_2 = bytes2(0xd827);\n r_1_1_0_2_0_2.s_2 = r_1_1_0_2_0_2_2;\n }\n {\n string memory r_1_1_0_2_0_2_3 = unicode\"Moo é🚀oM M ooo🚀éoooéMMMoMoé oéoo🚀o 🚀\";\n r_1_1_0_2_0_2.s_3 = r_1_1_0_2_0_2_3;\n }\n {\n bool r_1_1_0_2_0_2_4 = true;\n r_1_1_0_2_0_2.s_4 = r_1_1_0_2_0_2_4;\n }\n r_1_1_0_2_0.s_2 = r_1_1_0_2_0_2;\n }\n {\n address r_1_1_0_2_0_3 = 0xcaA3251d916a0f8677c7997133E2a0c6e6D24e73;\n r_1_1_0_2_0.s_3 = r_1_1_0_2_0_3;\n }\n r_1_1_0_2[0] = r_1_1_0_2_0;\n }\n {\n S_fc8d639a memory r_1_1_0_2_1;\n {\n string memory r_1_1_0_2_1_0 = unicode\"Moo é🚀MéM é\";\n r_1_1_0_2_1.s_0 = r_1_1_0_2_1_0;\n }\n {\n bytes2 r_1_1_0_2_1_1 = bytes2(0xf527);\n r_1_1_0_2_1.s_1 = r_1_1_0_2_1_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_2_1_2;\n {\n uint32 r_1_1_0_2_1_2_0 = 8870127;\n r_1_1_0_2_1_2.s_0 = r_1_1_0_2_1_2_0;\n }\n {\n bool[4] memory r_1_1_0_2_1_2_1;\n {\n bool r_1_1_0_2_1_2_1_0 = false;\n r_1_1_0_2_1_2_1[0] = r_1_1_0_2_1_2_1_0;\n }\n {\n bool r_1_1_0_2_1_2_1_1 = false;\n r_1_1_0_2_1_2_1[1] = r_1_1_0_2_1_2_1_1;\n }\n {\n bool r_1_1_0_2_1_2_1_2 = false;\n r_1_1_0_2_1_2_1[2] = r_1_1_0_2_1_2_1_2;\n }\n {\n bool r_1_1_0_2_1_2_1_3 = true;\n r_1_1_0_2_1_2_1[3] = r_1_1_0_2_1_2_1_3;\n }\n r_1_1_0_2_1_2.s_1 = r_1_1_0_2_1_2_1;\n }\n {\n bytes2 r_1_1_0_2_1_2_2 = bytes2(0x22aa);\n r_1_1_0_2_1_2.s_2 = r_1_1_0_2_1_2_2;\n }\n {\n string memory r_1_1_0_2_1_2_3 = unicode\"Moo é🚀 éooMé🚀oMo oéoooMo o🚀 Mo🚀oo\";\n r_1_1_0_2_1_2.s_3 = r_1_1_0_2_1_2_3;\n }\n {\n bool r_1_1_0_2_1_2_4 = false;\n r_1_1_0_2_1_2.s_4 = r_1_1_0_2_1_2_4;\n }\n r_1_1_0_2_1.s_2 = r_1_1_0_2_1_2;\n }\n {\n address r_1_1_0_2_1_3 = 0x08E1Ccf9494E2f2995e65fD03F4435C96DF32B05;\n r_1_1_0_2_1.s_3 = r_1_1_0_2_1_3;\n }\n r_1_1_0_2[1] = r_1_1_0_2_1;\n }\n {\n S_fc8d639a memory r_1_1_0_2_2;\n {\n string memory r_1_1_0_2_2_0 = unicode\"Moo é🚀oééM🚀Moé o🚀 🚀oéoéoo🚀o🚀é ééM🚀MM oM🚀 MMMoooéoo\";\n r_1_1_0_2_2.s_0 = r_1_1_0_2_2_0;\n }\n {\n bytes2 r_1_1_0_2_2_1 = bytes2(0x61fe);\n r_1_1_0_2_2.s_1 = r_1_1_0_2_2_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_2_2_2;\n {\n uint32 r_1_1_0_2_2_2_0 = 3308472352;\n r_1_1_0_2_2_2.s_0 = r_1_1_0_2_2_2_0;\n }\n {\n bool[4] memory r_1_1_0_2_2_2_1;\n {\n bool r_1_1_0_2_2_2_1_0 = false;\n r_1_1_0_2_2_2_1[0] = r_1_1_0_2_2_2_1_0;\n }\n {\n bool r_1_1_0_2_2_2_1_1 = false;\n r_1_1_0_2_2_2_1[1] = r_1_1_0_2_2_2_1_1;\n }\n {\n bool r_1_1_0_2_2_2_1_2 = false;\n r_1_1_0_2_2_2_1[2] = r_1_1_0_2_2_2_1_2;\n }\n {\n bool r_1_1_0_2_2_2_1_3 = false;\n r_1_1_0_2_2_2_1[3] = r_1_1_0_2_2_2_1_3;\n }\n r_1_1_0_2_2_2.s_1 = r_1_1_0_2_2_2_1;\n }\n {\n bytes2 r_1_1_0_2_2_2_2 = bytes2(0xac2a);\n r_1_1_0_2_2_2.s_2 = r_1_1_0_2_2_2_2;\n }\n {\n string memory r_1_1_0_2_2_2_3 = unicode\"Moo é🚀 o🚀ooooMMooé🚀oM🚀o🚀 o🚀🚀Mooé🚀🚀 o o\";\n r_1_1_0_2_2_2.s_3 = r_1_1_0_2_2_2_3;\n }\n {\n bool r_1_1_0_2_2_2_4 = false;\n r_1_1_0_2_2_2.s_4 = r_1_1_0_2_2_2_4;\n }\n r_1_1_0_2_2.s_2 = r_1_1_0_2_2_2;\n }\n {\n address r_1_1_0_2_2_3 = 0x8b8EB017d542ACe3fA11f3329a3508cdca5c0c0b;\n r_1_1_0_2_2.s_3 = r_1_1_0_2_2_3;\n }\n r_1_1_0_2[2] = r_1_1_0_2_2;\n }\n {\n S_fc8d639a memory r_1_1_0_2_3;\n {\n string memory r_1_1_0_2_3_0 = unicode\"Moo é🚀🚀\";\n r_1_1_0_2_3.s_0 = r_1_1_0_2_3_0;\n }\n {\n bytes2 r_1_1_0_2_3_1 = bytes2(0xecfa);\n r_1_1_0_2_3.s_1 = r_1_1_0_2_3_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_2_3_2;\n {\n uint32 r_1_1_0_2_3_2_0 = 1255130709;\n r_1_1_0_2_3_2.s_0 = r_1_1_0_2_3_2_0;\n }\n {\n bool[4] memory r_1_1_0_2_3_2_1;\n {\n bool r_1_1_0_2_3_2_1_0 = false;\n r_1_1_0_2_3_2_1[0] = r_1_1_0_2_3_2_1_0;\n }\n {\n bool r_1_1_0_2_3_2_1_1 = false;\n r_1_1_0_2_3_2_1[1] = r_1_1_0_2_3_2_1_1;\n }\n {\n bool r_1_1_0_2_3_2_1_2 = true;\n r_1_1_0_2_3_2_1[2] = r_1_1_0_2_3_2_1_2;\n }\n {\n bool r_1_1_0_2_3_2_1_3 = false;\n r_1_1_0_2_3_2_1[3] = r_1_1_0_2_3_2_1_3;\n }\n r_1_1_0_2_3_2.s_1 = r_1_1_0_2_3_2_1;\n }\n {\n bytes2 r_1_1_0_2_3_2_2 = bytes2(0x5ab3);\n r_1_1_0_2_3_2.s_2 = r_1_1_0_2_3_2_2;\n }\n {\n string memory r_1_1_0_2_3_2_3 = unicode\"Moo é🚀🚀é🚀oM 🚀oé🚀o 🚀ooMoo 🚀éM 🚀 \";\n r_1_1_0_2_3_2.s_3 = r_1_1_0_2_3_2_3;\n }\n {\n bool r_1_1_0_2_3_2_4 = false;\n r_1_1_0_2_3_2.s_4 = r_1_1_0_2_3_2_4;\n }\n r_1_1_0_2_3.s_2 = r_1_1_0_2_3_2;\n }\n {\n address r_1_1_0_2_3_3 = 0x2Dfd4D17bfE574f45828acE6D919A8e1F0Ae48e6;\n r_1_1_0_2_3.s_3 = r_1_1_0_2_3_3;\n }\n r_1_1_0_2[3] = r_1_1_0_2_3;\n }\n r_1_1_0[2] = r_1_1_0_2;\n }\n {\n S_fc8d639a[] memory r_1_1_0_3 = new S_fc8d639a[](4);\n {\n S_fc8d639a memory r_1_1_0_3_0;\n {\n string memory r_1_1_0_3_0_0 = unicode\"Moo é🚀o🚀oéooMé\";\n r_1_1_0_3_0.s_0 = r_1_1_0_3_0_0;\n }\n {\n bytes2 r_1_1_0_3_0_1 = bytes2(0x6dce);\n r_1_1_0_3_0.s_1 = r_1_1_0_3_0_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_3_0_2;\n {\n uint32 r_1_1_0_3_0_2_0 = 331747208;\n r_1_1_0_3_0_2.s_0 = r_1_1_0_3_0_2_0;\n }\n {\n bool[4] memory r_1_1_0_3_0_2_1;\n {\n bool r_1_1_0_3_0_2_1_0 = true;\n r_1_1_0_3_0_2_1[0] = r_1_1_0_3_0_2_1_0;\n }\n {\n bool r_1_1_0_3_0_2_1_1 = true;\n r_1_1_0_3_0_2_1[1] = r_1_1_0_3_0_2_1_1;\n }\n {\n bool r_1_1_0_3_0_2_1_2 = true;\n r_1_1_0_3_0_2_1[2] = r_1_1_0_3_0_2_1_2;\n }\n {\n bool r_1_1_0_3_0_2_1_3 = false;\n r_1_1_0_3_0_2_1[3] = r_1_1_0_3_0_2_1_3;\n }\n r_1_1_0_3_0_2.s_1 = r_1_1_0_3_0_2_1;\n }\n {\n bytes2 r_1_1_0_3_0_2_2 = bytes2(0x5225);\n r_1_1_0_3_0_2.s_2 = r_1_1_0_3_0_2_2;\n }\n {\n string memory r_1_1_0_3_0_2_3 = unicode\"Moo é🚀🚀 oM🚀🚀oéM🚀 éMé o M oéo🚀MMoM🚀o🚀o Mo 🚀\";\n r_1_1_0_3_0_2.s_3 = r_1_1_0_3_0_2_3;\n }\n {\n bool r_1_1_0_3_0_2_4 = false;\n r_1_1_0_3_0_2.s_4 = r_1_1_0_3_0_2_4;\n }\n r_1_1_0_3_0.s_2 = r_1_1_0_3_0_2;\n }\n {\n address r_1_1_0_3_0_3 = 0x7A51df6b8783FaF41CAe7F2Bc3e9Cc527275831F;\n r_1_1_0_3_0.s_3 = r_1_1_0_3_0_3;\n }\n r_1_1_0_3[0] = r_1_1_0_3_0;\n }\n {\n S_fc8d639a memory r_1_1_0_3_1;\n {\n string memory r_1_1_0_3_1_0 = unicode\"Moo é🚀éooé oM🚀🚀🚀o éoo 🚀🚀o 🚀oo🚀🚀\";\n r_1_1_0_3_1.s_0 = r_1_1_0_3_1_0;\n }\n {\n bytes2 r_1_1_0_3_1_1 = bytes2(0x6719);\n r_1_1_0_3_1.s_1 = r_1_1_0_3_1_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_3_1_2;\n {\n uint32 r_1_1_0_3_1_2_0 = 1565095980;\n r_1_1_0_3_1_2.s_0 = r_1_1_0_3_1_2_0;\n }\n {\n bool[4] memory r_1_1_0_3_1_2_1;\n {\n bool r_1_1_0_3_1_2_1_0 = false;\n r_1_1_0_3_1_2_1[0] = r_1_1_0_3_1_2_1_0;\n }\n {\n bool r_1_1_0_3_1_2_1_1 = false;\n r_1_1_0_3_1_2_1[1] = r_1_1_0_3_1_2_1_1;\n }\n {\n bool r_1_1_0_3_1_2_1_2 = true;\n r_1_1_0_3_1_2_1[2] = r_1_1_0_3_1_2_1_2;\n }\n {\n bool r_1_1_0_3_1_2_1_3 = false;\n r_1_1_0_3_1_2_1[3] = r_1_1_0_3_1_2_1_3;\n }\n r_1_1_0_3_1_2.s_1 = r_1_1_0_3_1_2_1;\n }\n {\n bytes2 r_1_1_0_3_1_2_2 = bytes2(0x9a59);\n r_1_1_0_3_1_2.s_2 = r_1_1_0_3_1_2_2;\n }\n {\n string memory r_1_1_0_3_1_2_3 = unicode\"Moo é🚀o🚀M🚀MéoM🚀o éo🚀o ééé\";\n r_1_1_0_3_1_2.s_3 = r_1_1_0_3_1_2_3;\n }\n {\n bool r_1_1_0_3_1_2_4 = false;\n r_1_1_0_3_1_2.s_4 = r_1_1_0_3_1_2_4;\n }\n r_1_1_0_3_1.s_2 = r_1_1_0_3_1_2;\n }\n {\n address r_1_1_0_3_1_3 = 0x70713845Aa0e0B376762fac0615b2f5c0A53660A;\n r_1_1_0_3_1.s_3 = r_1_1_0_3_1_3;\n }\n r_1_1_0_3[1] = r_1_1_0_3_1;\n }\n {\n S_fc8d639a memory r_1_1_0_3_2;\n {\n string memory r_1_1_0_3_2_0 = unicode\"Moo é🚀M\";\n r_1_1_0_3_2.s_0 = r_1_1_0_3_2_0;\n }\n {\n bytes2 r_1_1_0_3_2_1 = bytes2(0x0da2);\n r_1_1_0_3_2.s_1 = r_1_1_0_3_2_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_3_2_2;\n {\n uint32 r_1_1_0_3_2_2_0 = 2374059176;\n r_1_1_0_3_2_2.s_0 = r_1_1_0_3_2_2_0;\n }\n {\n bool[4] memory r_1_1_0_3_2_2_1;\n {\n bool r_1_1_0_3_2_2_1_0 = true;\n r_1_1_0_3_2_2_1[0] = r_1_1_0_3_2_2_1_0;\n }\n {\n bool r_1_1_0_3_2_2_1_1 = true;\n r_1_1_0_3_2_2_1[1] = r_1_1_0_3_2_2_1_1;\n }\n {\n bool r_1_1_0_3_2_2_1_2 = false;\n r_1_1_0_3_2_2_1[2] = r_1_1_0_3_2_2_1_2;\n }\n {\n bool r_1_1_0_3_2_2_1_3 = false;\n r_1_1_0_3_2_2_1[3] = r_1_1_0_3_2_2_1_3;\n }\n r_1_1_0_3_2_2.s_1 = r_1_1_0_3_2_2_1;\n }\n {\n bytes2 r_1_1_0_3_2_2_2 = bytes2(0x1fd5);\n r_1_1_0_3_2_2.s_2 = r_1_1_0_3_2_2_2;\n }\n {\n string memory r_1_1_0_3_2_2_3 = unicode\"Moo é🚀ooMoé🚀🚀🚀o🚀 é🚀Mé Moo o oM🚀🚀MéooMo oéé🚀🚀 é🚀\";\n r_1_1_0_3_2_2.s_3 = r_1_1_0_3_2_2_3;\n }\n {\n bool r_1_1_0_3_2_2_4 = true;\n r_1_1_0_3_2_2.s_4 = r_1_1_0_3_2_2_4;\n }\n r_1_1_0_3_2.s_2 = r_1_1_0_3_2_2;\n }\n {\n address r_1_1_0_3_2_3 = 0x865CBdD0b922d9dC232BFc45A259117CA1e37ca1;\n r_1_1_0_3_2.s_3 = r_1_1_0_3_2_3;\n }\n r_1_1_0_3[2] = r_1_1_0_3_2;\n }\n {\n S_fc8d639a memory r_1_1_0_3_3;\n {\n string memory r_1_1_0_3_3_0 = unicode\"Moo é🚀🚀 \";\n r_1_1_0_3_3.s_0 = r_1_1_0_3_3_0;\n }\n {\n bytes2 r_1_1_0_3_3_1 = bytes2(0xc084);\n r_1_1_0_3_3.s_1 = r_1_1_0_3_3_1;\n }\n {\n S_b73ee2ba memory r_1_1_0_3_3_2;\n {\n uint32 r_1_1_0_3_3_2_0 = 3977201122;\n r_1_1_0_3_3_2.s_0 = r_1_1_0_3_3_2_0;\n }\n {\n bool[4] memory r_1_1_0_3_3_2_1;\n {\n bool r_1_1_0_3_3_2_1_0 = true;\n r_1_1_0_3_3_2_1[0] = r_1_1_0_3_3_2_1_0;\n }\n {\n bool r_1_1_0_3_3_2_1_1 = true;\n r_1_1_0_3_3_2_1[1] = r_1_1_0_3_3_2_1_1;\n }\n {\n bool r_1_1_0_3_3_2_1_2 = false;\n r_1_1_0_3_3_2_1[2] = r_1_1_0_3_3_2_1_2;\n }\n {\n bool r_1_1_0_3_3_2_1_3 = true;\n r_1_1_0_3_3_2_1[3] = r_1_1_0_3_3_2_1_3;\n }\n r_1_1_0_3_3_2.s_1 = r_1_1_0_3_3_2_1;\n }\n {\n bytes2 r_1_1_0_3_3_2_2 = bytes2(0x5e19);\n r_1_1_0_3_3_2.s_2 = r_1_1_0_3_3_2_2;\n }\n {\n string memory r_1_1_0_3_3_2_3 = unicode\"Moo é🚀oMo éo 🚀 oMéé o oMMoéMoo ééMoooéo\";\n r_1_1_0_3_3_2.s_3 = r_1_1_0_3_3_2_3;\n }\n {\n bool r_1_1_0_3_3_2_4 = false;\n r_1_1_0_3_3_2.s_4 = r_1_1_0_3_3_2_4;\n }\n r_1_1_0_3_3.s_2 = r_1_1_0_3_3_2;\n }\n {\n address r_1_1_0_3_3_3 = 0x7EF9634CE309dC670cf64e79D1330e1906fDC807;\n r_1_1_0_3_3.s_3 = r_1_1_0_3_3_3;\n }\n r_1_1_0_3[3] = r_1_1_0_3_3;\n }\n r_1_1_0[3] = r_1_1_0_3;\n }\n r_1_1[0] = r_1_1_0;\n }\n r_1.s_1 = r_1_1;\n }\n {\n bytes21[4][1] memory r_1_2;\n {\n bytes21[4] memory r_1_2_0;\n {\n bytes21 r_1_2_0_0 = bytes21(0xc48413c2682ffae9c5f3177dbbf96bdc608df1b25b);\n r_1_2_0[0] = r_1_2_0_0;\n }\n {\n bytes21 r_1_2_0_1 = bytes21(0xd54f17f43b0f79d669affeeeee352e067b548f5ea1);\n r_1_2_0[1] = r_1_2_0_1;\n }\n {\n bytes21 r_1_2_0_2 = bytes21(0xaddf381c7bce57bd3ea070e22611ceb5be0251a5c8);\n r_1_2_0[2] = r_1_2_0_2;\n }\n {\n bytes21 r_1_2_0_3 = bytes21(0x5d5512b68391dcb24aa1074f11e6c291e78651e0c7);\n r_1_2_0[3] = r_1_2_0_3;\n }\n r_1_2[0] = r_1_2_0;\n }\n r_1.s_2 = r_1_2;\n }\n {\n bytes4 r_1_3 = bytes4(0xb17ac19b);\n r_1.s_3 = r_1_3;\n }\n {\n string memory r_1_4 = unicode\"Moo é🚀🚀o oé🚀ooMo🚀é🚀🚀o🚀ooéé ooéoo \";\n r_1.s_4 = r_1_4;\n }\n r.s_1 = r_1;\n }\n {\n string[][] memory r_2 = new string[][](3);\n {\n string[] memory r_2_0 = new string[](0);\n r_2[0] = r_2_0;\n }\n {\n string[] memory r_2_1 = new string[](2);\n {\n string memory r_2_1_0 = unicode\"Moo é🚀M🚀🚀o🚀éo o M🚀MéooMoo🚀 éMMMMo🚀é🚀 ééoé 🚀\";\n r_2_1[0] = r_2_1_0;\n }\n {\n string memory r_2_1_1 = unicode\"Moo é🚀\";\n r_2_1[1] = r_2_1_1;\n }\n r_2[1] = r_2_1;\n }\n {\n string[] memory r_2_2 = new string[](2);\n {\n string memory r_2_2_0 = unicode\"Moo é🚀oéo o🚀ooééMM 🚀o🚀MMé🚀🚀éMM🚀🚀🚀oéMooéo\";\n r_2_2[0] = r_2_2_0;\n }\n {\n string memory r_2_2_1 = unicode\"Moo é🚀\";\n r_2_2[1] = r_2_2_1;\n }\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000016bb732e9f42464ca26c170e00e0b100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001c800000000000000000000000002c04bf96b436c20513eef153409fa89714a440980000000000000000000000000000000000000000000000000000000000000100c48413c2682ffae9c5f3177dbbf96bdc608df1b25b0000000000000000000000d54f17f43b0f79d669affeeeee352e067b548f5ea10000000000000000000000addf381c7bce57bd3ea070e22611ceb5be0251a5c800000000000000000000005d5512b68391dcb24aa1074f11e6c291e78651e0c70000000000000000000000b17ac19b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000008037bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000cc35f88eb8efe1867f72e69f7c57532d17052d45000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136b28440000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e17a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a806f20c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080722f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000075f4cc7fac6ebb3016776df0cfec941f72da242000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806f4d20f09f9a80204dc3a96fc3a94dc3a96f6f4d6f20c3a96f6f6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b822098000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a80206f20f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000805b670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e078797a9feb2b8a9d2e37156a574776a961124d00000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a806ff09f9a804df09f9a806f4d6fc3a96f206f206f6fc3a9c3a9f09f9a806fc3a920c3a96f4d6f6f6f4dc3a96f6ff09f9a80c3a9206f6f6f206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2135f820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001207700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000080974f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000caa3251d916a0f8677c7997133e2a0c6e6d24e73000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ce654000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000d8270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806f4d204d206f6f6ff09f9a80c3a96f6f6fc3a94d4d4d6f4d6fc3a920206fc3a96f6ff09f9a806f20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000080f52700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000008e1ccf9494e2f2995e65fd03f4435c96df32b0500000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804dc3a94d20c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000008758ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000122aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a802020c3a96f6f4dc3a9f09f9a806f4d6f206fc3a96f6f6f4d6f206ff09f9a80204d6ff09f9a806f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008061fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000008b8eb017d542ace3fa11f3329a3508cdca5c0c0b00000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a806fc3a9c3a94df09f9a804d6fc3a9206ff09f9a8020f09f9a806fc3a96fc3a96f6ff09f9a806ff09f9a80c3a92020c3a9c3a94df09f9a804d4d206f4df09f9a8020204d4d4d6f6f6fc3a96f6f0000000000000000000000000000000000000000000000000000000000000000000000000000c53348200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a80206ff09f9a806f6f6f6f4d4d6f6fc3a9f09f9a806f4df09f9a806ff09f9a80206ff09f9a80f09f9a804d6f6fc3a9f09f9a80f09f9a80206f206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ecfa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000002dfd4d17bfe574f45828ace6d919a8e1f0ae48e6000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a80f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004acfc65500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005ab300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a806f4d20f09f9a806fc3a9f09f9a806f202020f09f9a806f6f4d6f6f2020f09f9a80c3a94d20f09f9a802000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000000806dce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000007a51df6b8783faf41cae7f2bc3e9cc527275831f00000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806ff09f9a806fc3a96f6f4dc3a90000000000000000000000000000000000000000000000000000000000000000000000000013c60f880000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000522500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a80f09f9a80206f4df09f9a80f09f9a806fc3a94df09f9a8020c3a94dc3a9206f204d206fc3a96ff09f9a804d4d6f4df09f9a806ff09f9a806f204d6f20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080671900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000070713845aa0e0b376762fac0615b2f5c0a53660a000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80c3a96f6fc3a920206f4df09f9a80f09f9a80f09f9a806f20c3a96f6f20f09f9a80f09f9a806f20f09f9a806f6ff09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000005d49782c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000009a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a806ff09f9a804df09f9a804dc3a96f4df09f9a806f20c3a96ff09f9a806f20c3a9c3a9c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800da200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000865cbdd0b922d9dc232bfc45a259117ca1e37ca1000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d8144a800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fd50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806f6f4d6fc3a9f09f9a80f09f9a80f09f9a806ff09f9a8020c3a9f09f9a804dc3a9204d6f6f206f206f4df09f9a80f09f9a804dc3a96f6f4d6f206fc3a9c3a9f09f9a80f09f9a8020c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000080c08400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000007ef9634ce309dc670cf64e79d1330e1906fdc807000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed0f45e200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015e190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f4d6f2020c3a96f2020f09f9a80206f4dc3a9c3a920206f206f4d4d6fc3a94d6f6f2020c3a9c3a94d6f6f6fc3a96f00000000000000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a80f09f9a806f206fc3a9f09f9a806f6f4d6ff09f9a80c3a9f09f9a80f09f9a806ff09f9a806f6fc3a9c3a9206f6fc3a96f6f200000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a804df09f9a80f09f9a806ff09f9a80c3a96f206f204df09f9a804dc3a96f6f4d6f6ff09f9a8020c3a94d4d4d4d6ff09f9a80c3a9f09f9a8020c3a9c3a96fc3a920f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806fc3a96f206ff09f9a806f6fc3a9c3a94d4d2020f09f9a806ff09f9a804d4dc3a9f09f9a80f09f9a80c3a94d4df09f9a80f09f9a80f09f9a806fc3a94d6f6fc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(((address,(bytes8,string,int136,address,string),address,address,bool)[],string,bytes25[4],address,(address))[3][1],address,bool,bool[1][][4])", + "type": "(((address,(bytes8,string,int136,address,string),address,address,bool)[],string,bytes25[4],address,(address))[3][1],address,bool,bool[1][][4])", + "value": [ + [ + [ + [ + [], + "Moo é🚀🚀oMo é🚀 é🚀🚀éoo é o🚀éMéoo ooo é🚀 🚀ooo éoo", + [ + "0x8f43d76e459fe48836439c119766a9972de87979784adb7093", + "0xf035dbeeb827db57bdd152143aa7227ea3caa536ca91ab9c28", + "0x7157fd0b968af9f078e5ff25560c0805d6eea81aea26a12527", + "0x67428f6ba9b11f41abeae45b5f6d63ea13a1225947133bedca" + ], + "0x27562256d4A4d74Db2c0556eD18967Ad09Bed136", + ["0x95decbb049174fb0bDDD866871161eAeEC3716B5"] + ], + [ + [ + [ + "0x249D492410cf2E84b96F400D34E97480fc355dA6", + [ + "0x021e01e9e6372c1d", + "Moo é🚀Mé🚀🚀M é🚀oooéM🚀é Méooo🚀🚀 Mo🚀oM", + "41265762335509778239214040315564793533946", + "0x9Fcfa343660100cE99fAf065D55f7f03983B46ee", + "Moo é🚀🚀oM🚀Mooé🚀é🚀 ééM🚀MMéooMooMoooéo éoéo 🚀oéMoMéM🚀 é🚀 o🚀éoM" + ], + "0x33C34511989733edbE05700bD90A6413E400aF02", + "0x7a5AF02956997409945FB5ecbA07A66B1619B7BA", + false + ], + [ + "0xEeCB35A823BffE10D39D11D2F1CE33A1f43532b3", + [ + "0xdf6ddaf618378474", + "Moo é🚀", + "-31136522373649898592636393231769760345316", + "0x0697c90e051Fb3a4be026639d89B217f34C438b6", + "Moo é🚀oMo🚀MoMo o o🚀 oMoM" + ], + "0xAEe192252d2376cA76555E79D764873aF1fd6B13", + "0xF0B2474666C292d57163bAceE73183E4b384387C", + false + ], + [ + "0xd0a3d45Bcc321Dc273129D6B5342577aF3D784A8", + [ + "0x52b3fa43831f7595", + "Moo é🚀 oooMMo o", + "7184269872080566297116242228418398017976", + "0x5a6022407BBbE21fB371b21802e3cB7A00A7f724", + "Moo é🚀🚀 o🚀ooM🚀éé " + ], + "0x3c42512B28523046E33A96C526514DDD544ac1Fd", + "0x57af2e20256DF53132912F74FB511E2A23B51FDd", + true + ] + ], + "Moo é🚀o MoM🚀ooo🚀 éo🚀", + [ + "0xcd9f59f7ed4ee3d9651bd21837c09bda3b5a36554f9e9036e3", + "0x790128a278a0737971f5aaca828f1840827b9df01476437d20", + "0x5be83768730574f58be32b61daeec53e59dd6f2b3e26299fef", + "0x66fb7e9eb7a80d9b2558e72ed88e5f72a8ee9e5145e742f3a8" + ], + "0xe4F3a16bECb949e8f949169513B05cDd3CB0f8A2", + ["0xd636EFDcd5534C19F7312FB5D1fa8EAf13fc4Fd2"] + ], + [ + [ + [ + "0xdbFe81Bdc618d5e09d822b300864Fc5860dd9c55", + [ + "0x57c830e14c33653f", + "Moo é🚀éM🚀oMoo 🚀M 🚀ééoo🚀Mo oo", + "10362802216222783026790027926521726402259", + "0xEe527586bd65247d7751d6168d20EC834Ee72Ba8", + "Moo é🚀M🚀oMMooo🚀oM 🚀éooMé🚀é ééooéoM🚀 éo🚀é Méé o 🚀 🚀 éo oooo" + ], + "0xA79e9CB848533e33875fc2B310213362fa6aF598", + "0xE0094967B4F59a581ef1C7Caf7Da1cCf32DaA969", + true + ], + [ + "0xd737CeF1E0603e2cdfaeDDc9827502B033F1C5aB", + [ + "0xeff12b120e3f9d69", + "Moo é🚀🚀🚀ooé🚀oo 🚀oé🚀oo🚀M🚀Mo oo🚀éoo🚀ooooééo 🚀o Méé 🚀🚀M", + "11957986524501207466435950599261045344494", + "0xc391E80eAfbeeAe9ccBF3057149319AC91030157", + "Moo é🚀🚀oooMéo🚀o o 🚀é🚀o🚀🚀ooMMooéMM🚀🚀o Mé o Méo🚀🚀ooéM éoo oo" + ], + "0x8C66D2bf186EE0Fc8a99a3aa69E28a80Ca3D8209", + "0xF9d0f0C3Bab03A1fcA8F784b55C026aB1F907129", + true + ], + [ + "0xCDD3d8263E25502ABfaad5255B12064A9b900FFD", + [ + "0x83b859bd41d3b1dd", + "Moo é🚀ooooo o é oo MMoM🚀 MM🚀Mo 🚀", + "-38570628417875409241193015294703320129818", + "0xdfFB4db271e9C42b516C388Fc3f41ab308A082D2", + "Moo é🚀o🚀🚀oooo🚀🚀o o ééoo " + ], + "0xE5a7F76Df50d7Ce72D1509921Ae1CbFc2C0dAd01", + "0x14bec285c86B9BD4db9FC61cea309D26a10c0d6d", + true + ] + ], + "Moo é🚀🚀🚀 o oéoM 🚀é🚀é o🚀é", + [ + "0xc3458961d6444147d02355ff44ae2cfa02de0c460d986dec90", + "0x2ebae44e1804ac3bcc939c68ec912c10feb8acad9a4f0a779b", + "0x77b0bc67ff3ecc53c6d06abab804afd33a31f49f6b936cda43", + "0xa68fc6e4ce68768b3419f0d1e1e4a50eac0ddeac60a88fe57d" + ], + "0xCFE08AB4b2239EB0775B46EB540549bA5DeeFF63", + ["0x27285c37d4070Ea4a513930c605Eb8A5DAfB11fA"] + ] + ] + ], + "0xbd8aED6E7cB55bEC1B9C76CED5B84A824E51059e", + false, + [[], [[true], [false], [true], [false]], [[true], [false]], [[false], [false]]] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀🚀oMo é🚀 é🚀🚀éoo é o🚀éMéoo ooo é🚀 🚀ooo éoo" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8f43d76e459fe48836439c119766a9972de87979784adb7093" + }, + { + "type": "hexstring", + "value": "0xf035dbeeb827db57bdd152143aa7227ea3caa536ca91ab9c28" + }, + { + "type": "hexstring", + "value": "0x7157fd0b968af9f078e5ff25560c0805d6eea81aea26a12527" + }, + { + "type": "hexstring", + "value": "0x67428f6ba9b11f41abeae45b5f6d63ea13a1225947133bedca" + } + ] + }, + { + "type": "address", + "value": "0x27562256d4A4d74Db2c0556eD18967Ad09Bed136" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x95decbb049174fb0bDDD866871161eAeEC3716B5" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x249D492410cf2E84b96F400D34E97480fc355dA6" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x021e01e9e6372c1d" + }, + { + "type": "string", + "value": "Moo é🚀Mé🚀🚀M é🚀oooéM🚀é Méooo🚀🚀 Mo🚀oM" + }, + { + "type": "number", + "value": "41265762335509778239214040315564793533946" + }, + { + "type": "address", + "value": "0x9Fcfa343660100cE99fAf065D55f7f03983B46ee" + }, + { + "type": "string", + "value": "Moo é🚀🚀oM🚀Mooé🚀é🚀 ééM🚀MMéooMooMoooéo éoéo 🚀oéMoMéM🚀 é🚀 o🚀éoM" + } + ] + }, + { + "type": "address", + "value": "0x33C34511989733edbE05700bD90A6413E400aF02" + }, + { + "type": "address", + "value": "0x7a5AF02956997409945FB5ecbA07A66B1619B7BA" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xEeCB35A823BffE10D39D11D2F1CE33A1f43532b3" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xdf6ddaf618378474" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "-31136522373649898592636393231769760345316" + }, + { + "type": "address", + "value": "0x0697c90e051Fb3a4be026639d89B217f34C438b6" + }, + { + "type": "string", + "value": "Moo é🚀oMo🚀MoMo o o🚀 oMoM" + } + ] + }, + { + "type": "address", + "value": "0xAEe192252d2376cA76555E79D764873aF1fd6B13" + }, + { + "type": "address", + "value": "0xF0B2474666C292d57163bAceE73183E4b384387C" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd0a3d45Bcc321Dc273129D6B5342577aF3D784A8" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x52b3fa43831f7595" + }, + { + "type": "string", + "value": "Moo é🚀 oooMMo o" + }, + { + "type": "number", + "value": "7184269872080566297116242228418398017976" + }, + { + "type": "address", + "value": "0x5a6022407BBbE21fB371b21802e3cB7A00A7f724" + }, + { + "type": "string", + "value": "Moo é🚀🚀 o🚀ooM🚀éé " + } + ] + }, + { + "type": "address", + "value": "0x3c42512B28523046E33A96C526514DDD544ac1Fd" + }, + { + "type": "address", + "value": "0x57af2e20256DF53132912F74FB511E2A23B51FDd" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o MoM🚀ooo🚀 éo🚀" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xcd9f59f7ed4ee3d9651bd21837c09bda3b5a36554f9e9036e3" + }, + { + "type": "hexstring", + "value": "0x790128a278a0737971f5aaca828f1840827b9df01476437d20" + }, + { + "type": "hexstring", + "value": "0x5be83768730574f58be32b61daeec53e59dd6f2b3e26299fef" + }, + { + "type": "hexstring", + "value": "0x66fb7e9eb7a80d9b2558e72ed88e5f72a8ee9e5145e742f3a8" + } + ] + }, + { + "type": "address", + "value": "0xe4F3a16bECb949e8f949169513B05cDd3CB0f8A2" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd636EFDcd5534C19F7312FB5D1fa8EAf13fc4Fd2" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdbFe81Bdc618d5e09d822b300864Fc5860dd9c55" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x57c830e14c33653f" + }, + { + "type": "string", + "value": "Moo é🚀éM🚀oMoo 🚀M 🚀ééoo🚀Mo oo" + }, + { + "type": "number", + "value": "10362802216222783026790027926521726402259" + }, + { + "type": "address", + "value": "0xEe527586bd65247d7751d6168d20EC834Ee72Ba8" + }, + { + "type": "string", + "value": "Moo é🚀M🚀oMMooo🚀oM 🚀éooMé🚀é ééooéoM🚀 éo🚀é Méé o 🚀 🚀 éo oooo" + } + ] + }, + { + "type": "address", + "value": "0xA79e9CB848533e33875fc2B310213362fa6aF598" + }, + { + "type": "address", + "value": "0xE0094967B4F59a581ef1C7Caf7Da1cCf32DaA969" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xd737CeF1E0603e2cdfaeDDc9827502B033F1C5aB" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xeff12b120e3f9d69" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀ooé🚀oo 🚀oé🚀oo🚀M🚀Mo oo🚀éoo🚀ooooééo 🚀o Méé 🚀🚀M" + }, + { + "type": "number", + "value": "11957986524501207466435950599261045344494" + }, + { + "type": "address", + "value": "0xc391E80eAfbeeAe9ccBF3057149319AC91030157" + }, + { + "type": "string", + "value": "Moo é🚀🚀oooMéo🚀o o 🚀é🚀o🚀🚀ooMMooéMM🚀🚀o Mé o Méo🚀🚀ooéM éoo oo" + } + ] + }, + { + "type": "address", + "value": "0x8C66D2bf186EE0Fc8a99a3aa69E28a80Ca3D8209" + }, + { + "type": "address", + "value": "0xF9d0f0C3Bab03A1fcA8F784b55C026aB1F907129" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xCDD3d8263E25502ABfaad5255B12064A9b900FFD" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x83b859bd41d3b1dd" + }, + { + "type": "string", + "value": "Moo é🚀ooooo o é oo MMoM🚀 MM🚀Mo 🚀" + }, + { + "type": "number", + "value": "-38570628417875409241193015294703320129818" + }, + { + "type": "address", + "value": "0xdfFB4db271e9C42b516C388Fc3f41ab308A082D2" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀oooo🚀🚀o o ééoo " + } + ] + }, + { + "type": "address", + "value": "0xE5a7F76Df50d7Ce72D1509921Ae1CbFc2C0dAd01" + }, + { + "type": "address", + "value": "0x14bec285c86B9BD4db9FC61cea309D26a10c0d6d" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀 o oéoM 🚀é🚀é o🚀é" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc3458961d6444147d02355ff44ae2cfa02de0c460d986dec90" + }, + { + "type": "hexstring", + "value": "0x2ebae44e1804ac3bcc939c68ec912c10feb8acad9a4f0a779b" + }, + { + "type": "hexstring", + "value": "0x77b0bc67ff3ecc53c6d06abab804afd33a31f49f6b936cda43" + }, + { + "type": "hexstring", + "value": "0xa68fc6e4ce68768b3419f0d1e1e4a50eac0ddeac60a88fe57d" + } + ] + }, + { + "type": "address", + "value": "0xCFE08AB4b2239EB0775B46EB540549bA5DeeFF63" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x27285c37d4070Ea4a513930c605Eb8A5DAfB11fA" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0xbd8aED6E7cB55bEC1B9C76CED5B84A824E51059e" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611623806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190611075565b60405180910390f35b610056610dcb565b61005e610dcb565b610066610dfe565b61006e610e2b565b610076610e58565b60408051600080825260208201909252816100a7565b610094610e97565b81526020019060019003908161008c5790505b50825250604080516080810190915260518082526000919061147860208301396020830152506100d5610ed5565b7f8f43d76e459fe48836439c119766a9972de87979784adb70930000000000000081527ff035dbeeb827db57bdd152143aa7227ea3caa536ca91ab9c28000000000000006020808301919091527f7157fd0b968af9f078e5ff25560c0805d6eea81aea26a12527000000000000006040808401919091527f67428f6ba9b11f41abeae45b5f6d63ea13a1225947133bedca00000000000000606080850191909152848201939093527327562256d4a4d74db2c0556ed18967ad09bed1369284019290925281519081019091527395decbb049174fb0bddd866871161eaeec3716b58152608082015281526101c7610e58565b60408051600380825260808201909252600091816020015b6101e7610e97565b8152602001906001900390816101df579050509050610204610e97565b73249d492410cf2e84b96f400d34e97480fc355da68152610223610ef3565b67021e01e9e6372c1d60c01b815260408051608081019091526042808252600091906113826020830139602080840191909152707944e8bc6a018c4ac718c9c755fd6815fa604080850191909152739fcfa343660100ce99faf065d55f7f03983b46ee6060850152805160a081019091526069808252600093509091611585908301396080808401919091526020840192909252507333c34511989733edbe05700bd90a6413e400af026040830152737a5af02956997409945fb5ecba07a66b1619b7ba60608301526000908201819052825182918491610306576103066112b7565b60200260200101819052505061031a610e97565b73eecb35a823bffe10d39d11d2f1ce33a1f43532b38152610339610ef3565b6737db76bd860de11d60c21b8152604080518082018252600a8152689adede418753e13f3560b71b60208083019190915280840191909152705b80841491c9b65d0cc53100c6e766ace31982840152730697c90e051fb3a4be026639d89b217f34c438b660608085019190915282519081019092526022808352600092916112ce9083013960808084019190915260208401929092525073aee192252d2376ca76555e79d764873af1fd6b13604083015273f0b2474666c292d57163bacee73183e4b384387c60608301526000908201528151819083906001908110610421576104216112b7565b602002602001018190525050610435610e97565b73d0a3d45bcc321dc273129d6b5342577af3d784a88152610454610ef3565b6752b3fa43831f759560c01b815260408051808201825260138152724d6f6f20c3a9f09f9a80206f6f6f4d4d6f206f60681b6020808301919091528084019190915270151cd80c2a43a89b203c21de44280e59b882840152735a6022407bbbe21fb371b21802e3cb7a00a7f724606080850191909152825180840184528281527f4d6f6f20c3a9f09f9a80f09f9a80206ff09f9a806f6f4df09f9a80c3a9c3a9208184015260808086019190915291850193909352733c42512b28523046e33a96c526514ddd544ac1fd918401919091527357af2e20256df53132912f74fb511e2a23b51fdd91830191909152600190820152815181908390600290811061055e5761055e6112b7565b6020026020010181905250508082600001819052505060006040518060600160405280602281526020016114566022913960208301525061059d610ed5565b7fcd9f59f7ed4ee3d9651bd21837c09bda3b5a36554f9e9036e30000000000000081527f790128a278a0737971f5aaca828f1840827b9df01476437d20000000000000006020808301919091527f5be83768730574f58be32b61daeec53e59dd6f2b3e26299fef000000000000006040808401919091527f66fb7e9eb7a80d9b2558e72ed88e5f72a8ee9e5145e742f3a8000000000000006060808501919091528482019390935273e4f3a16becb949e8f949169513b05cdd3cb0f8a292840192909252815180820190925273d636efdcd5534c19f7312fb5d1fa8eaf13fc4fd282526080830191909152820152610693610e58565b60408051600380825260808201909252600091816020015b6106b3610e97565b8152602001906001900390816106ab5790505090506106d0610e97565b73dbfe81bdc618d5e09d822b300864fc5860dd9c5581526106ef610ef3565b6757c830e14c33653f60c01b81526040805160608101909152602f808252600091906114c96020830139602080840191909152701e741b1c0ea72a684071f2ebbfd1287ed360408085019190915273ee527586bd65247d7751d6168d20ec834ee72ba86060850152805160a0810190915260628082526000935090916114f89083013960808084019190915260208401929092525073a79e9cb848533e33875fc2b310213362fa6af598604083015273e0094967b4f59a581ef1c7caf7da1ccf32daa96960608301526001908201528151819083906000906107d3576107d36112b7565b6020026020010181905250506107e7610e97565b73d737cef1e0603e2cdfaeddc9827502b033f1c5ab8152610806610ef3565b67eff12b120e3f9d6960c01b81526040805160a0810190915260638082526000919061131f6020830139602080840191909152702324306ea56b3f4546f5849c18b38748ee60408085019190915273c391e80eafbeeae9ccbf3057149319ac910301576060850152805160a0810190915260638082526000935090916113f390830139608080840191909152602084019290925250738c66d2bf186ee0fc8a99a3aa69e28a80ca3d8209604083015273f9d0f0c3bab03a1fca8f784b55c026ab1f9071296060830152600190820181905282518291849181106108eb576108eb6112b7565b6020026020010181905250506108ff610e97565b73cdd3d8263e25502abfaad5255b12064a9b900ffd815261091e610ef3565b6783b859bd41d3b1dd60c01b81526040805160608101909152602f808252600091906112f0602083013960208084019190915270715950d30ab215b54922be42b8d65b61191960408085019190915273dffb4db271e9c42b516c388fc3f41ab308a082d26060808601919091528151908101909152602b80825260009350909161155a9083013960808084019190915260208401929092525073e5a7f76df50d7ce72d1509921ae1cbfc2c0dad0160408301527314bec285c86b9bd4db9fc61cea309d26a10c0d6d60608301526001908201528151819083906002908110610a0857610a086112b7565b6020026020010181905250508082600001819052505060006040518060600160405280602f81526020016113c4602f9139602083015250610a47610ed5565b7fc3458961d6444147d02355ff44ae2cfa02de0c460d986dec900000000000000081527f2ebae44e1804ac3bcc939c68ec912c10feb8acad9a4f0a779b000000000000006020808301919091527f77b0bc67ff3ecc53c6d06abab804afd33a31f49f6b936cda43000000000000006040808401919091527fa68fc6e4ce68768b3419f0d1e1e4a50eac0ddeac60a88fe57d000000000000006060808501919091528482019390935273cfe08ab4b2239eb0775b46eb540549ba5deeff6392840192909252815180820183527327285c37d4070ea4a513930c605eb8a5dafb11fa815260808401528382019290925291835291835273bd8aed6e7cb55bec1b9c76ced5b84a824e51059e91830191909152600090820152610b65610f20565b6040805160008082526020820190925281610b96565b610b83610f47565b815260200190600190039081610b7b5790505b5082525060408051600480825260a08201909252600091816020015b610bba610f47565b815260200190600190039081610bb2579050509050610bd7610f47565b60018152815181908390600090610bf057610bf06112b7565b602002602001018190525050610c04610f47565b600081528151819083906001908110610c1f57610c1f6112b7565b602002602001018190525050610c33610f47565b600181528151819083906002908110610c4e57610c4e6112b7565b602002602001018190525050610c62610f47565b600081528151819083906003908110610c7d57610c7d6112b7565b6020908102919091018101919091528301919091525060408051600280825260608201909252600091816020015b610cb3610f47565b815260200190600190039081610cab579050509050610cd0610f47565b60018152815181908390600090610ce957610ce96112b7565b602002602001018190525050610cfd610f47565b600081528151819083906001908110610d1857610d186112b7565b6020908102919091010152506040808301919091528051600280825260608201909252600091816020015b610d4b610f47565b815260200190600190039081610d43579050509050610d68610f47565b6000808252825182918491610d7f57610d7f6112b7565b602002602001018190525050610d93610f47565b600081528151819083906001908110610dae57610dae6112b7565b602090810291909101015250606080830191909152820152919050565b6040518060800160405280610dde610dfe565b81526000602082018190526040820152606001610df9610f20565b905290565b60405180602001604052806001905b610e15610e2b565b815260200190600190039081610e0d5790505090565b60405180606001604052806003905b610e42610e58565b815260200190600190039081610e3a5790505090565b6040518060a001604052806060815260200160608152602001610e79610ed5565b81526000602080830182905260408051918201815291815291015290565b6040518060a0016040528060006001600160a01b03168152602001610eba610ef3565b81526000602082018190526040820181905260609091015290565b60405180608001604052806004906020820280368337509192915050565b6040805160a081018252600080825260606020830181905292820181905282820152608081019190915290565b60405180608001604052806004905b6060815260200190600190039081610f2f5790505090565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b81811015610f8b57602081850181015186830182015201610f6f565b81811115610f9d576000602083870101525b50601f01601f19169290920160200192915050565b8060005b6004811015610fdf57815166ffffffffffffff1916845260209384019390910190600101610fb6565b50505050565b600082608081018360005b600481101561106a57838303875281518051808552602091820191808601919060005b828110156110535784518460005b6001811015611040578251151582529184019190840190600101611021565b5050509381019392810192600101611013565b50998a019991955050929092019150600101610ff0565b509095945050505050565b60208152600082516080602084015260a0830160c0840160005b600181101561126a57858203609f190183528351826060810160005b600381101561125257858203835283518051610100845261010084018151808252610120860191506101208160051b87010160208401935060005b828110156111e55787820361011f19018452845180516001600160a01b0316835260208082015160a082860181905281516001600160c01b031916818701529181015160c086019290925290611140610140860182610f65565b604083015160100b60e087015260608301516001600160a01b0316610100870152608090920151858303609f19016101208701529190506111818183610f65565b915050604082015161119e60408601826001600160a01b03169052565b5060608201516111b960608601826001600160a01b03169052565b50608082015191506111cf608085018315159052565b60209687019695909501949250506001016110e6565b506020850151935086810360208801526111ff8185610f65565b935050505060408201516112166040860182610fb2565b5060608201516001600160a01b0390811660c0860152608090920151805190921660e085015260209586019594909401939250506001016110ab565b5060209687019695909501949350505060010161108f565b5060208601516001600160a01b038116604087015292506040860151801515606087015292506060860151858203601f1901608087015292506112ad8184610fe5565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d6ff09f9a804d6f4d6f206f206ff09f9a80206f4d6f4d4d6f6f20c3a9f09f9a806f6f6f6f6f206f20c3a920206f6f204d4d6f4df09f9a80204d4df09f9a804d6f20f09f9a804d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6fc3a9f09f9a806f6f20f09f9a806fc3a9f09f9a806f6ff09f9a804df09f9a804d6f206f6ff09f9a80c3a96f6ff09f9a806f6f6f6fc3a9c3a96f20f09f9a806f204dc3a9c3a920f09f9a80f09f9a804d4d6f6f20c3a9f09f9a804dc3a9f09f9a80f09f9a804d20c3a9f09f9a806f6f6fc3a94df09f9a80c3a9204dc3a96f6f6ff09f9a80f09f9a8020204d6ff09f9a806f4d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80206f206fc3a96f4d20f09f9a80c3a9f09f9a80c3a9206ff09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a806f6f6f4dc3a96ff09f9a806f206f20f09f9a80c3a9f09f9a806ff09f9a80f09f9a806f6f4d4d6f6fc3a94d4df09f9a80f09f9a806f204dc3a9206f204dc3a96ff09f9a80f09f9a806f6fc3a94d20c3a96f6f206f6f4d6f6f20c3a9f09f9a806f204d6f4df09f9a806f6f6ff09f9a8020c3a96ff09f9a804d6f6f20c3a9f09f9a80f09f9a806f4d6f20c3a9f09f9a802020c3a9f09f9a80f09f9a80c3a96f6f20c3a920206ff09f9a80c3a94dc3a96f6f206f6f6f20c3a9f09f9a8020f09f9a806f6f6f20c3a96f6f4d6f6f20c3a9f09f9a80c3a94df09f9a806f4d6f6f20f09f9a804d20f09f9a80c3a9c3a96f6ff09f9a804d6f206f6f4d6f6f20c3a9f09f9a804df09f9a806f4d4d6f6f6ff09f9a806f4d20f09f9a80c3a96f6f4dc3a9f09f9a80c3a920c3a9c3a96f6fc3a96f4df09f9a8020c3a96ff09f9a80c3a9204dc3a9c3a9206f20f09f9a8020f09f9a802020c3a96f206f6f6f6f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f6f6f6ff09f9a80f09f9a806f206f2020c3a9c3a96f6f204d6f6f20c3a9f09f9a80f09f9a806f4df09f9a804d6f6fc3a9f09f9a80c3a9f09f9a802020c3a9c3a94df09f9a804d4dc3a96f6f4d6f6f4d6f6f6fc3a96f2020c3a96fc3a96f20f09f9a806fc3a94d6f4dc3a94df09f9a8020c3a9f09f9a80206ff09f9a80c3a96f4da26469706673582212201adc65c5dba831624d41f7c6d964f40c6811f93b917454b0b0c896e80ffc1bf964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_686abcdf {\n bytes8 s_0;\n string s_1;\n int136 s_2;\n address s_3;\n string s_4;\n }\n\n struct S_6757c49f {\n address s_0;\n S_686abcdf s_1;\n address s_2;\n address s_3;\n bool s_4;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_ccfda69a {\n S_6757c49f[] s_0;\n string s_1;\n bytes25[4] s_2;\n address s_3;\n S_421683f8 s_4;\n }\n\n struct S_88f3285d {\n S_ccfda69a[3][1] s_0;\n address s_1;\n bool s_2;\n bool[1][][4] s_3;\n }\n\n function test () public pure returns (S_88f3285d memory) {\n S_88f3285d memory r;\n {\n S_ccfda69a[3][1] memory r_0;\n {\n S_ccfda69a[3] memory r_0_0;\n {\n S_ccfda69a memory r_0_0_0;\n {\n S_6757c49f[] memory r_0_0_0_0 = new S_6757c49f[](0);\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n string memory r_0_0_0_1 = unicode\"Moo é🚀🚀oMo é🚀 é🚀🚀éoo é o🚀éMéoo ooo é🚀 🚀ooo éoo\";\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n bytes25[4] memory r_0_0_0_2;\n {\n bytes25 r_0_0_0_2_0 = bytes25(0x8f43d76e459fe48836439c119766a9972de87979784adb7093);\n r_0_0_0_2[0] = r_0_0_0_2_0;\n }\n {\n bytes25 r_0_0_0_2_1 = bytes25(0xf035dbeeb827db57bdd152143aa7227ea3caa536ca91ab9c28);\n r_0_0_0_2[1] = r_0_0_0_2_1;\n }\n {\n bytes25 r_0_0_0_2_2 = bytes25(0x7157fd0b968af9f078e5ff25560c0805d6eea81aea26a12527);\n r_0_0_0_2[2] = r_0_0_0_2_2;\n }\n {\n bytes25 r_0_0_0_2_3 = bytes25(0x67428f6ba9b11f41abeae45b5f6d63ea13a1225947133bedca);\n r_0_0_0_2[3] = r_0_0_0_2_3;\n }\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n {\n address r_0_0_0_3 = 0x27562256d4A4d74Db2c0556eD18967Ad09Bed136;\n r_0_0_0.s_3 = r_0_0_0_3;\n }\n {\n S_421683f8 memory r_0_0_0_4;\n {\n address r_0_0_0_4_0 = 0x95decbb049174fb0bDDD866871161eAeEC3716B5;\n r_0_0_0_4.s_0 = r_0_0_0_4_0;\n }\n r_0_0_0.s_4 = r_0_0_0_4;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_ccfda69a memory r_0_0_1;\n {\n S_6757c49f[] memory r_0_0_1_0 = new S_6757c49f[](3);\n {\n S_6757c49f memory r_0_0_1_0_0;\n {\n address r_0_0_1_0_0_0 = 0x249D492410cf2E84b96F400D34E97480fc355dA6;\n r_0_0_1_0_0.s_0 = r_0_0_1_0_0_0;\n }\n {\n S_686abcdf memory r_0_0_1_0_0_1;\n {\n bytes8 r_0_0_1_0_0_1_0 = bytes8(0x021e01e9e6372c1d);\n r_0_0_1_0_0_1.s_0 = r_0_0_1_0_0_1_0;\n }\n {\n string memory r_0_0_1_0_0_1_1 = unicode\"Moo é🚀Mé🚀🚀M é🚀oooéM🚀é Méooo🚀🚀 Mo🚀oM\";\n r_0_0_1_0_0_1.s_1 = r_0_0_1_0_0_1_1;\n }\n {\n int136 r_0_0_1_0_0_1_2 = 41265762335509778239214040315564793533946;\n r_0_0_1_0_0_1.s_2 = r_0_0_1_0_0_1_2;\n }\n {\n address r_0_0_1_0_0_1_3 = 0x9Fcfa343660100cE99fAf065D55f7f03983B46ee;\n r_0_0_1_0_0_1.s_3 = r_0_0_1_0_0_1_3;\n }\n {\n string memory r_0_0_1_0_0_1_4 = unicode\"Moo é🚀🚀oM🚀Mooé🚀é🚀 ééM🚀MMéooMooMoooéo éoéo 🚀oéMoMéM🚀 é🚀 o🚀éoM\";\n r_0_0_1_0_0_1.s_4 = r_0_0_1_0_0_1_4;\n }\n r_0_0_1_0_0.s_1 = r_0_0_1_0_0_1;\n }\n {\n address r_0_0_1_0_0_2 = 0x33C34511989733edbE05700bD90A6413E400aF02;\n r_0_0_1_0_0.s_2 = r_0_0_1_0_0_2;\n }\n {\n address r_0_0_1_0_0_3 = 0x7a5AF02956997409945FB5ecbA07A66B1619B7BA;\n r_0_0_1_0_0.s_3 = r_0_0_1_0_0_3;\n }\n {\n bool r_0_0_1_0_0_4 = false;\n r_0_0_1_0_0.s_4 = r_0_0_1_0_0_4;\n }\n r_0_0_1_0[0] = r_0_0_1_0_0;\n }\n {\n S_6757c49f memory r_0_0_1_0_1;\n {\n address r_0_0_1_0_1_0 = 0xEeCB35A823BffE10D39D11D2F1CE33A1f43532b3;\n r_0_0_1_0_1.s_0 = r_0_0_1_0_1_0;\n }\n {\n S_686abcdf memory r_0_0_1_0_1_1;\n {\n bytes8 r_0_0_1_0_1_1_0 = bytes8(0xdf6ddaf618378474);\n r_0_0_1_0_1_1.s_0 = r_0_0_1_0_1_1_0;\n }\n {\n string memory r_0_0_1_0_1_1_1 = unicode\"Moo é🚀\";\n r_0_0_1_0_1_1.s_1 = r_0_0_1_0_1_1_1;\n }\n {\n int136 r_0_0_1_0_1_1_2 = -31136522373649898592636393231769760345316;\n r_0_0_1_0_1_1.s_2 = r_0_0_1_0_1_1_2;\n }\n {\n address r_0_0_1_0_1_1_3 = 0x0697c90e051Fb3a4be026639d89B217f34C438b6;\n r_0_0_1_0_1_1.s_3 = r_0_0_1_0_1_1_3;\n }\n {\n string memory r_0_0_1_0_1_1_4 = unicode\"Moo é🚀oMo🚀MoMo o o🚀 oMoM\";\n r_0_0_1_0_1_1.s_4 = r_0_0_1_0_1_1_4;\n }\n r_0_0_1_0_1.s_1 = r_0_0_1_0_1_1;\n }\n {\n address r_0_0_1_0_1_2 = 0xAEe192252d2376cA76555E79D764873aF1fd6B13;\n r_0_0_1_0_1.s_2 = r_0_0_1_0_1_2;\n }\n {\n address r_0_0_1_0_1_3 = 0xF0B2474666C292d57163bAceE73183E4b384387C;\n r_0_0_1_0_1.s_3 = r_0_0_1_0_1_3;\n }\n {\n bool r_0_0_1_0_1_4 = false;\n r_0_0_1_0_1.s_4 = r_0_0_1_0_1_4;\n }\n r_0_0_1_0[1] = r_0_0_1_0_1;\n }\n {\n S_6757c49f memory r_0_0_1_0_2;\n {\n address r_0_0_1_0_2_0 = 0xd0a3d45Bcc321Dc273129D6B5342577aF3D784A8;\n r_0_0_1_0_2.s_0 = r_0_0_1_0_2_0;\n }\n {\n S_686abcdf memory r_0_0_1_0_2_1;\n {\n bytes8 r_0_0_1_0_2_1_0 = bytes8(0x52b3fa43831f7595);\n r_0_0_1_0_2_1.s_0 = r_0_0_1_0_2_1_0;\n }\n {\n string memory r_0_0_1_0_2_1_1 = unicode\"Moo é🚀 oooMMo o\";\n r_0_0_1_0_2_1.s_1 = r_0_0_1_0_2_1_1;\n }\n {\n int136 r_0_0_1_0_2_1_2 = 7184269872080566297116242228418398017976;\n r_0_0_1_0_2_1.s_2 = r_0_0_1_0_2_1_2;\n }\n {\n address r_0_0_1_0_2_1_3 = 0x5a6022407BBbE21fB371b21802e3cB7A00A7f724;\n r_0_0_1_0_2_1.s_3 = r_0_0_1_0_2_1_3;\n }\n {\n string memory r_0_0_1_0_2_1_4 = unicode\"Moo é🚀🚀 o🚀ooM🚀éé \";\n r_0_0_1_0_2_1.s_4 = r_0_0_1_0_2_1_4;\n }\n r_0_0_1_0_2.s_1 = r_0_0_1_0_2_1;\n }\n {\n address r_0_0_1_0_2_2 = 0x3c42512B28523046E33A96C526514DDD544ac1Fd;\n r_0_0_1_0_2.s_2 = r_0_0_1_0_2_2;\n }\n {\n address r_0_0_1_0_2_3 = 0x57af2e20256DF53132912F74FB511E2A23B51FDd;\n r_0_0_1_0_2.s_3 = r_0_0_1_0_2_3;\n }\n {\n bool r_0_0_1_0_2_4 = true;\n r_0_0_1_0_2.s_4 = r_0_0_1_0_2_4;\n }\n r_0_0_1_0[2] = r_0_0_1_0_2;\n }\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀o MoM🚀ooo🚀 éo🚀\";\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n bytes25[4] memory r_0_0_1_2;\n {\n bytes25 r_0_0_1_2_0 = bytes25(0xcd9f59f7ed4ee3d9651bd21837c09bda3b5a36554f9e9036e3);\n r_0_0_1_2[0] = r_0_0_1_2_0;\n }\n {\n bytes25 r_0_0_1_2_1 = bytes25(0x790128a278a0737971f5aaca828f1840827b9df01476437d20);\n r_0_0_1_2[1] = r_0_0_1_2_1;\n }\n {\n bytes25 r_0_0_1_2_2 = bytes25(0x5be83768730574f58be32b61daeec53e59dd6f2b3e26299fef);\n r_0_0_1_2[2] = r_0_0_1_2_2;\n }\n {\n bytes25 r_0_0_1_2_3 = bytes25(0x66fb7e9eb7a80d9b2558e72ed88e5f72a8ee9e5145e742f3a8);\n r_0_0_1_2[3] = r_0_0_1_2_3;\n }\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n {\n address r_0_0_1_3 = 0xe4F3a16bECb949e8f949169513B05cDd3CB0f8A2;\n r_0_0_1.s_3 = r_0_0_1_3;\n }\n {\n S_421683f8 memory r_0_0_1_4;\n {\n address r_0_0_1_4_0 = 0xd636EFDcd5534C19F7312FB5D1fa8EAf13fc4Fd2;\n r_0_0_1_4.s_0 = r_0_0_1_4_0;\n }\n r_0_0_1.s_4 = r_0_0_1_4;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n S_ccfda69a memory r_0_0_2;\n {\n S_6757c49f[] memory r_0_0_2_0 = new S_6757c49f[](3);\n {\n S_6757c49f memory r_0_0_2_0_0;\n {\n address r_0_0_2_0_0_0 = 0xdbFe81Bdc618d5e09d822b300864Fc5860dd9c55;\n r_0_0_2_0_0.s_0 = r_0_0_2_0_0_0;\n }\n {\n S_686abcdf memory r_0_0_2_0_0_1;\n {\n bytes8 r_0_0_2_0_0_1_0 = bytes8(0x57c830e14c33653f);\n r_0_0_2_0_0_1.s_0 = r_0_0_2_0_0_1_0;\n }\n {\n string memory r_0_0_2_0_0_1_1 = unicode\"Moo é🚀éM🚀oMoo 🚀M 🚀ééoo🚀Mo oo\";\n r_0_0_2_0_0_1.s_1 = r_0_0_2_0_0_1_1;\n }\n {\n int136 r_0_0_2_0_0_1_2 = 10362802216222783026790027926521726402259;\n r_0_0_2_0_0_1.s_2 = r_0_0_2_0_0_1_2;\n }\n {\n address r_0_0_2_0_0_1_3 = 0xEe527586bd65247d7751d6168d20EC834Ee72Ba8;\n r_0_0_2_0_0_1.s_3 = r_0_0_2_0_0_1_3;\n }\n {\n string memory r_0_0_2_0_0_1_4 = unicode\"Moo é🚀M🚀oMMooo🚀oM 🚀éooMé🚀é ééooéoM🚀 éo🚀é Méé o 🚀 🚀 éo oooo\";\n r_0_0_2_0_0_1.s_4 = r_0_0_2_0_0_1_4;\n }\n r_0_0_2_0_0.s_1 = r_0_0_2_0_0_1;\n }\n {\n address r_0_0_2_0_0_2 = 0xA79e9CB848533e33875fc2B310213362fa6aF598;\n r_0_0_2_0_0.s_2 = r_0_0_2_0_0_2;\n }\n {\n address r_0_0_2_0_0_3 = 0xE0094967B4F59a581ef1C7Caf7Da1cCf32DaA969;\n r_0_0_2_0_0.s_3 = r_0_0_2_0_0_3;\n }\n {\n bool r_0_0_2_0_0_4 = true;\n r_0_0_2_0_0.s_4 = r_0_0_2_0_0_4;\n }\n r_0_0_2_0[0] = r_0_0_2_0_0;\n }\n {\n S_6757c49f memory r_0_0_2_0_1;\n {\n address r_0_0_2_0_1_0 = 0xd737CeF1E0603e2cdfaeDDc9827502B033F1C5aB;\n r_0_0_2_0_1.s_0 = r_0_0_2_0_1_0;\n }\n {\n S_686abcdf memory r_0_0_2_0_1_1;\n {\n bytes8 r_0_0_2_0_1_1_0 = bytes8(0xeff12b120e3f9d69);\n r_0_0_2_0_1_1.s_0 = r_0_0_2_0_1_1_0;\n }\n {\n string memory r_0_0_2_0_1_1_1 = unicode\"Moo é🚀🚀🚀ooé🚀oo 🚀oé🚀oo🚀M🚀Mo oo🚀éoo🚀ooooééo 🚀o Méé 🚀🚀M\";\n r_0_0_2_0_1_1.s_1 = r_0_0_2_0_1_1_1;\n }\n {\n int136 r_0_0_2_0_1_1_2 = 11957986524501207466435950599261045344494;\n r_0_0_2_0_1_1.s_2 = r_0_0_2_0_1_1_2;\n }\n {\n address r_0_0_2_0_1_1_3 = 0xc391E80eAfbeeAe9ccBF3057149319AC91030157;\n r_0_0_2_0_1_1.s_3 = r_0_0_2_0_1_1_3;\n }\n {\n string memory r_0_0_2_0_1_1_4 = unicode\"Moo é🚀🚀oooMéo🚀o o 🚀é🚀o🚀🚀ooMMooéMM🚀🚀o Mé o Méo🚀🚀ooéM éoo oo\";\n r_0_0_2_0_1_1.s_4 = r_0_0_2_0_1_1_4;\n }\n r_0_0_2_0_1.s_1 = r_0_0_2_0_1_1;\n }\n {\n address r_0_0_2_0_1_2 = 0x8C66D2bf186EE0Fc8a99a3aa69E28a80Ca3D8209;\n r_0_0_2_0_1.s_2 = r_0_0_2_0_1_2;\n }\n {\n address r_0_0_2_0_1_3 = 0xF9d0f0C3Bab03A1fcA8F784b55C026aB1F907129;\n r_0_0_2_0_1.s_3 = r_0_0_2_0_1_3;\n }\n {\n bool r_0_0_2_0_1_4 = true;\n r_0_0_2_0_1.s_4 = r_0_0_2_0_1_4;\n }\n r_0_0_2_0[1] = r_0_0_2_0_1;\n }\n {\n S_6757c49f memory r_0_0_2_0_2;\n {\n address r_0_0_2_0_2_0 = 0xCDD3d8263E25502ABfaad5255B12064A9b900FFD;\n r_0_0_2_0_2.s_0 = r_0_0_2_0_2_0;\n }\n {\n S_686abcdf memory r_0_0_2_0_2_1;\n {\n bytes8 r_0_0_2_0_2_1_0 = bytes8(0x83b859bd41d3b1dd);\n r_0_0_2_0_2_1.s_0 = r_0_0_2_0_2_1_0;\n }\n {\n string memory r_0_0_2_0_2_1_1 = unicode\"Moo é🚀ooooo o é oo MMoM🚀 MM🚀Mo 🚀\";\n r_0_0_2_0_2_1.s_1 = r_0_0_2_0_2_1_1;\n }\n {\n int136 r_0_0_2_0_2_1_2 = -38570628417875409241193015294703320129818;\n r_0_0_2_0_2_1.s_2 = r_0_0_2_0_2_1_2;\n }\n {\n address r_0_0_2_0_2_1_3 = 0xdfFB4db271e9C42b516C388Fc3f41ab308A082D2;\n r_0_0_2_0_2_1.s_3 = r_0_0_2_0_2_1_3;\n }\n {\n string memory r_0_0_2_0_2_1_4 = unicode\"Moo é🚀o🚀🚀oooo🚀🚀o o ééoo \";\n r_0_0_2_0_2_1.s_4 = r_0_0_2_0_2_1_4;\n }\n r_0_0_2_0_2.s_1 = r_0_0_2_0_2_1;\n }\n {\n address r_0_0_2_0_2_2 = 0xE5a7F76Df50d7Ce72D1509921Ae1CbFc2C0dAd01;\n r_0_0_2_0_2.s_2 = r_0_0_2_0_2_2;\n }\n {\n address r_0_0_2_0_2_3 = 0x14bec285c86B9BD4db9FC61cea309D26a10c0d6d;\n r_0_0_2_0_2.s_3 = r_0_0_2_0_2_3;\n }\n {\n bool r_0_0_2_0_2_4 = true;\n r_0_0_2_0_2.s_4 = r_0_0_2_0_2_4;\n }\n r_0_0_2_0[2] = r_0_0_2_0_2;\n }\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n string memory r_0_0_2_1 = unicode\"Moo é🚀🚀🚀 o oéoM 🚀é🚀é o🚀é\";\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n {\n bytes25[4] memory r_0_0_2_2;\n {\n bytes25 r_0_0_2_2_0 = bytes25(0xc3458961d6444147d02355ff44ae2cfa02de0c460d986dec90);\n r_0_0_2_2[0] = r_0_0_2_2_0;\n }\n {\n bytes25 r_0_0_2_2_1 = bytes25(0x2ebae44e1804ac3bcc939c68ec912c10feb8acad9a4f0a779b);\n r_0_0_2_2[1] = r_0_0_2_2_1;\n }\n {\n bytes25 r_0_0_2_2_2 = bytes25(0x77b0bc67ff3ecc53c6d06abab804afd33a31f49f6b936cda43);\n r_0_0_2_2[2] = r_0_0_2_2_2;\n }\n {\n bytes25 r_0_0_2_2_3 = bytes25(0xa68fc6e4ce68768b3419f0d1e1e4a50eac0ddeac60a88fe57d);\n r_0_0_2_2[3] = r_0_0_2_2_3;\n }\n r_0_0_2.s_2 = r_0_0_2_2;\n }\n {\n address r_0_0_2_3 = 0xCFE08AB4b2239EB0775B46EB540549bA5DeeFF63;\n r_0_0_2.s_3 = r_0_0_2_3;\n }\n {\n S_421683f8 memory r_0_0_2_4;\n {\n address r_0_0_2_4_0 = 0x27285c37d4070Ea4a513930c605Eb8A5DAfB11fA;\n r_0_0_2_4.s_0 = r_0_0_2_4_0;\n }\n r_0_0_2.s_4 = r_0_0_2_4;\n }\n r_0_0[2] = r_0_0_2;\n }\n r_0[0] = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n address r_1 = 0xbd8aED6E7cB55bEC1B9C76CED5B84A824E51059e;\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n {\n bool[1][][4] memory r_3;\n {\n bool[1][] memory r_3_0 = new bool[1][](0);\n r_3[0] = r_3_0;\n }\n {\n bool[1][] memory r_3_1 = new bool[1][](4);\n {\n bool[1] memory r_3_1_0;\n {\n bool r_3_1_0_0 = true;\n r_3_1_0[0] = r_3_1_0_0;\n }\n r_3_1[0] = r_3_1_0;\n }\n {\n bool[1] memory r_3_1_1;\n {\n bool r_3_1_1_0 = false;\n r_3_1_1[0] = r_3_1_1_0;\n }\n r_3_1[1] = r_3_1_1;\n }\n {\n bool[1] memory r_3_1_2;\n {\n bool r_3_1_2_0 = true;\n r_3_1_2[0] = r_3_1_2_0;\n }\n r_3_1[2] = r_3_1_2;\n }\n {\n bool[1] memory r_3_1_3;\n {\n bool r_3_1_3_0 = false;\n r_3_1_3[0] = r_3_1_3_0;\n }\n r_3_1[3] = r_3_1_3;\n }\n r_3[1] = r_3_1;\n }\n {\n bool[1][] memory r_3_2 = new bool[1][](2);\n {\n bool[1] memory r_3_2_0;\n {\n bool r_3_2_0_0 = true;\n r_3_2_0[0] = r_3_2_0_0;\n }\n r_3_2[0] = r_3_2_0;\n }\n {\n bool[1] memory r_3_2_1;\n {\n bool r_3_2_1_0 = false;\n r_3_2_1[0] = r_3_2_1_0;\n }\n r_3_2[1] = r_3_2_1;\n }\n r_3[2] = r_3_2;\n }\n {\n bool[1][] memory r_3_3 = new bool[1][](2);\n {\n bool[1] memory r_3_3_0;\n {\n bool r_3_3_0_0 = false;\n r_3_3_0[0] = r_3_3_0_0;\n }\n r_3_3[0] = r_3_3_0;\n }\n {\n bool[1] memory r_3_3_1;\n {\n bool r_3_3_1_0 = false;\n r_3_3_1[0] = r_3_3_1_0;\n }\n r_3_3[1] = r_3_3_1;\n }\n r_3[3] = r_3_3;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000bd8aed6e7cb55bec1b9c76ced5b84a824e51059e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000132000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001208f43d76e459fe48836439c119766a9972de87979784adb709300000000000000f035dbeeb827db57bdd152143aa7227ea3caa536ca91ab9c28000000000000007157fd0b968af9f078e5ff25560c0805d6eea81aea26a125270000000000000067428f6ba9b11f41abeae45b5f6d63ea13a1225947133bedca0000000000000000000000000000000000000027562256d4a4d74db2c0556ed18967ad09bed13600000000000000000000000095decbb049174fb0bddd866871161eaeec3716b5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80f09f9a806f4d6f20c3a9f09f9a802020c3a9f09f9a80f09f9a80c3a96f6f20c3a920206ff09f9a80c3a94dc3a96f6f206f6f6f20c3a9f09f9a8020f09f9a806f6f6f20c3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000780cd9f59f7ed4ee3d9651bd21837c09bda3b5a36554f9e9036e300000000000000790128a278a0737971f5aaca828f1840827b9df01476437d20000000000000005be83768730574f58be32b61daeec53e59dd6f2b3e26299fef0000000000000066fb7e9eb7a80d9b2558e72ed88e5f72a8ee9e5145e742f3a800000000000000000000000000000000000000e4f3a16becb949e8f949169513b05cdd3cb0f8a2000000000000000000000000d636efdcd5534c19f7312fb5d1fa8eaf13fc4fd20000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000249d492410cf2e84b96f400d34e97480fc355da600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000033c34511989733edbe05700bd90a6413e400af020000000000000000000000007a5af02956997409945fb5ecba07a66b1619b7ba0000000000000000000000000000000000000000000000000000000000000000021e01e9e6372c1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000007944e8bc6a018c4ac718c9c755fd6815fa0000000000000000000000009fcfa343660100ce99faf065d55f7f03983b46ee000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a804dc3a9f09f9a80f09f9a804d20c3a9f09f9a806f6f6fc3a94df09f9a80c3a9204dc3a96f6f6ff09f9a80f09f9a8020204d6ff09f9a806f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a80f09f9a806f4df09f9a804d6f6fc3a9f09f9a80c3a9f09f9a802020c3a9c3a94df09f9a804d4dc3a96f6f4d6f6f4d6f6f6fc3a96f2020c3a96fc3a96f20f09f9a806fc3a94d6f4dc3a94df09f9a8020c3a9f09f9a80206ff09f9a80c3a96f4d0000000000000000000000000000000000000000000000000000000000000000000000eecb35a823bffe10d39d11d2f1ce33a1f43532b300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000aee192252d2376ca76555e79d764873af1fd6b13000000000000000000000000f0b2474666c292d57163bacee73183e4b384387c0000000000000000000000000000000000000000000000000000000000000000df6ddaf61837847400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0ffffffffffffffffffffffffffffffa47f7beb6e3649a2f33aceff391899531c0000000000000000000000000697c90e051fb3a4be026639d89b217f34c438b600000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806f4d6ff09f9a804d6f4d6f206f206ff09f9a80206f4d6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0a3d45bcc321dc273129d6b5342577af3d784a800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000003c42512b28523046e33a96c526514ddd544ac1fd00000000000000000000000057af2e20256df53132912f74fb511e2a23b51fdd000000000000000000000000000000000000000000000000000000000000000152b3fa43831f759500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000151cd80c2a43a89b203c21de44280e59b80000000000000000000000005a6022407bbbe21fb371b21802e3cb7a00a7f72400000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80206f6f6f4d4d6f206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a80f09f9a80206ff09f9a806f6f4df09f9a80c3a9c3a92000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a806f204d6f4df09f9a806f6f6ff09f9a8020c3a96ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000840c3458961d6444147d02355ff44ae2cfa02de0c460d986dec90000000000000002ebae44e1804ac3bcc939c68ec912c10feb8acad9a4f0a779b0000000000000077b0bc67ff3ecc53c6d06abab804afd33a31f49f6b936cda4300000000000000a68fc6e4ce68768b3419f0d1e1e4a50eac0ddeac60a88fe57d00000000000000000000000000000000000000cfe08ab4b2239eb0775b46eb540549ba5deeff6300000000000000000000000027285c37d4070ea4a513930c605eb8a5dafb11fa0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000520000000000000000000000000dbfe81bdc618d5e09d822b300864fc5860dd9c5500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a79e9cb848533e33875fc2b310213362fa6af598000000000000000000000000e0094967b4f59a581ef1c7caf7da1ccf32daa969000000000000000000000000000000000000000000000000000000000000000157c830e14c33653f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000001e741b1c0ea72a684071f2ebbfd1287ed3000000000000000000000000ee527586bd65247d7751d6168d20ec834ee72ba80000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a80c3a94df09f9a806f4d6f6f20f09f9a804d20f09f9a80c3a9c3a96f6ff09f9a804d6f206f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a804df09f9a806f4d4d6f6f6ff09f9a806f4d20f09f9a80c3a96f6f4dc3a9f09f9a80c3a920c3a9c3a96f6fc3a96f4df09f9a8020c3a96ff09f9a80c3a9204dc3a9c3a9206f20f09f9a8020f09f9a802020c3a96f206f6f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000d737cef1e0603e2cdfaeddc9827502b033f1c5ab00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000008c66d2bf186ee0fc8a99a3aa69e28a80ca3d8209000000000000000000000000f9d0f0c3bab03a1fca8f784b55c026ab1f9071290000000000000000000000000000000000000000000000000000000000000001eff12b120e3f9d6900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000002324306ea56b3f4546f5849c18b38748ee000000000000000000000000c391e80eafbeeae9ccbf3057149319ac91030157000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6fc3a9f09f9a806f6f20f09f9a806fc3a9f09f9a806f6ff09f9a804df09f9a804d6f206f6ff09f9a80c3a96f6ff09f9a806f6f6f6fc3a9c3a96f20f09f9a806f204dc3a9c3a920f09f9a80f09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a806f6f6f4dc3a96ff09f9a806f206f20f09f9a80c3a9f09f9a806ff09f9a80f09f9a806f6f4d4d6f6fc3a94d4df09f9a80f09f9a806f204dc3a9206f204dc3a96ff09f9a80f09f9a806f6fc3a94d20c3a96f6f206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000cdd3d8263e25502abfaad5255b12064a9b900ffd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e5a7f76df50d7ce72d1509921ae1cbfc2c0dad0100000000000000000000000014bec285c86b9bd4db9fc61cea309d26a10c0d6d000000000000000000000000000000000000000000000000000000000000000183b859bd41d3b1dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0ffffffffffffffffffffffffffffff8ea6af2cf54dea4ab6dd41bd4729a49ee6000000000000000000000000dffb4db271e9c42b516c388fc3f41ab308a082d20000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a806f6f6f6f6f206f20c3a920206f6f204d4d6f4df09f9a80204d4df09f9a804d6f20f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f6f6f6ff09f9a80f09f9a806f206f2020c3a9c3a96f6f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80206f206fc3a96f4d20f09f9a80c3a9f09f9a80c3a9206ff09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes12,(bool[1],((bool,bytes6,(int96,bytes17,address[1]),int216),bool,address,string[2]),address,bool,int216)[2],(bytes26[1],uint72)[1][4])", + "type": "(bytes12,(bool[1],((bool,bytes6,(int96,bytes17,address[1]),int216),bool,address,string[2]),address,bool,int216)[2],(bytes26[1],uint72)[1][4])", + "value": [ + "0x53f5aca5c337a6c4e4431d72", + [ + [ + [false], + [ + [ + false, + "0x0459af93ff15", + [ + "-1971481084983213762991294426", + "0x334370eb969e54f9f9a6797ce5b26d69a4", + ["0x5777a1622dA18A644c9Ece970AB481096D6b6785"] + ], + "40803334357589702835248104181007008695506356321232760585881391362" + ], + true, + "0xA63603C3E83fe5AfFD512c4757e12704D57edE06", + ["Moo é🚀🚀éo🚀🚀oo ooé🚀 Mé éoMo", "Moo é🚀"] + ], + "0xc941Ff66A427EA171bf2914600E0e1190B7195d8", + true, + "51058849365927828416897941719704376935603890168361591909656805788" + ], + [ + [true], + [ + [ + true, + "0x44c424db4462", + [ + "3040682035426292858005706211", + "0x04576614aebf9df5f412dc8070e1b3f880", + ["0xb126e7A9fe6838C58cD6FcfB7aaeD52023e1eB58"] + ], + "36539763564443667408874316987657089023188009277806280294774565176" + ], + false, + "0x67C55D695ef8202aCc2AA6aeF8dD600CFb4617C5", + ["Moo é🚀 oo", "Moo é🚀oM🚀o🚀🚀ooé oéM éMMMoMéM🚀🚀🚀MMoéMo"] + ], + "0xFBa585d4539c5dBa57261fe3E378FfF8Ef8922f7", + false, + "-24578961906272079566045346142590683337501256663213591040882424049" + ] + ], + [ + [ + [ + ["0x1cce66ed41ce4daa4c2c3f325402f0ea84eb72e70f45db421d7d"], + "882759070998650718416" + ] + ], + [ + [ + ["0xeed637dfd60e96516dbbf9773072fa785db80df9cb64fd36cb0f"], + "3485286420009806226919" + ] + ], + [ + [ + ["0x13a1aacc856d1fb4ee25c3219793d4f53602460a93c4ca520775"], + "1639765765829936911687" + ] + ], + [ + [ + ["0xcad7c6e65ecc5a81ce2c6d1e8b3ae6e6644c72451c27e85dd334"], + "1618529194808791461717" + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x53f5aca5c337a6c4e4431d72" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x0459af93ff15" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1971481084983213762991294426" + }, + { + "type": "hexstring", + "value": "0x334370eb969e54f9f9a6797ce5b26d69a4" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x5777a1622dA18A644c9Ece970AB481096D6b6785" + } + ] + } + ] + }, + { + "type": "number", + "value": "40803334357589702835248104181007008695506356321232760585881391362" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xA63603C3E83fe5AfFD512c4757e12704D57edE06" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀éo🚀🚀oo ooé🚀 Mé éoMo" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xc941Ff66A427EA171bf2914600E0e1190B7195d8" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "51058849365927828416897941719704376935603890168361591909656805788" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x44c424db4462" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "3040682035426292858005706211" + }, + { + "type": "hexstring", + "value": "0x04576614aebf9df5f412dc8070e1b3f880" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xb126e7A9fe6838C58cD6FcfB7aaeD52023e1eB58" + } + ] + } + ] + }, + { + "type": "number", + "value": "36539763564443667408874316987657089023188009277806280294774565176" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x67C55D695ef8202aCc2AA6aeF8dD600CFb4617C5" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oo" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀o🚀🚀ooé oéM éMMMoMéM🚀🚀🚀MMoéMo" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xFBa585d4539c5dBa57261fe3E378FfF8Ef8922f7" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-24578961906272079566045346142590683337501256663213591040882424049" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1cce66ed41ce4daa4c2c3f325402f0ea84eb72e70f45db421d7d" + } + ] + }, + { + "type": "number", + "value": "882759070998650718416" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xeed637dfd60e96516dbbf9773072fa785db80df9cb64fd36cb0f" + } + ] + }, + { + "type": "number", + "value": "3485286420009806226919" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x13a1aacc856d1fb4ee25c3219793d4f53602460a93c4ca520775" + } + ] + }, + { + "type": "number", + "value": "1639765765829936911687" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xcad7c6e65ecc5a81ce2c6d1e8b3ae6e6644c72451c27e85dd334" + } + ] + }, + { + "type": "number", + "value": "1618529194808791461717" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610a2b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610897565b60405180910390f35b6100566104e4565b61005e6104e4565b6b29fad652e19bd36272218eb960a11b8152610078610511565b61008061053e565b610088610579565b600081528152610096610597565b61009e6105c5565b60008152650459af93ff1560d01b60208201526100b96105f1565b6b065ec55bc48450fe13cf07d9198152700cd0dc3ae5a7953e7e699e5f396c9b5a69607a1b60208201526100eb610579565b735777a1622da18a644c9ece970ab481096d6b67858152604082810191909152828101919091527a632ffa30f4822b0d6682e88c1ff4c1b61f69366a2126e59410110260608301529082526001602083015273a63603c3e83fe5affd512c4757e12704d57ede069082015261015e610610565b60006040518060600160405280602e81526020016109c8602e9139825250604080518082018252600a8152689adede418753e13f3560b71b6020808301919091528084019190915260608481019390935284019290925273c941ff66a427ea171bf2914600e0e1190b7195d8918301919091526001908201527a7c1dfffddd5d2e07e76655cbb5e61e9d6fea5149ee1de6759fc19c6080820152815261020261053e565b61020a610579565b600181528152610218610597565b6102206105c5565b60018152652262126da23160d11b602082015261023b6105f1565b6b09d331776eadf0a35ca355e381526f08aecc295d7f3bebe825b900e1c367f1607f1b602082015261026b610579565b73b126e7a9fe6838c58cd6fcfb7aaed52023e1eb588152604082810191909152828101919091527a58d2c02d4aada6f2fa94ad8d73c4111b8097dbf67417c6464369386060830152908252600060208301527367c55d695ef8202acc2aa6aef8dd600cfb4617c5908201526102de610610565b604080518082018252600e81526d4d6f6f20c3a9f09f9a8020206f6f60901b6020808301919091529083528151606081018352828152600092909161098890830139602080840191909152606084810193909352848101939093525073fba585d4539c5dba57261fe3e378fff8ef8922f760408401526000908301527a3bbf868a29386a4a573e4ea00cd07f378dfaf32d372b2ee7fcb8f01960808301528281019190915282015261038e610637565b610396610664565b61039e610691565b6103a6610579565b7f1cce66ed41ce4daa4c2c3f325402f0ea84eb72e70f45db421d7d00000000000081528152682fdabe3a03e86888d06020820152815281526103e6610664565b6103ee610691565b6103f6610579565b7feed637dfd60e96516dbbf9773072fa785db80df9cb64fd36cb0f0000000000008152815268bcf010bd28f96465e760208281019190915290825282015261043c610664565b610444610691565b61044c610579565b7f13a1aacc856d1fb4ee25c3219793d4f53602460a93c4ca520775000000000000815281526858e452442bc3c1954760208201528152604082015261048f610664565b610497610691565b61049f610579565b7fcad7c6e65ecc5a81ce2c6d1e8b3ae6e6644c72451c27e85dd334000000000000815281526857bd9acf57e906ef556020820152815260608201526040820152919050565b604080516060810190915260008152602081016104ff610511565b815260200161050c610637565b905290565b60405180604001604052806002905b61052861053e565b8152602001906001900390816105205790505090565b6040518060a00160405280610551610579565b815260200161055e610597565b81526000602082018190526040820181905260609091015290565b60405180602001604052806001906020820280368337509192915050565b60405180608001604052806105aa6105c5565b8152600060208201819052604082015260600161050c610610565b60408051608081018252600080825260208201529081016105e46105f1565b8152600060209091015290565b604080516060810182526000808252602082015290810161050c610579565b60405180604001604052806002905b606081526020019060019003908161061f5790505090565b60405180608001604052806004905b61064e610664565b8152602001906001900390816106465790505090565b60405180602001604052806001905b61067b610691565b8152602001906001900390816106735790505090565b60405180604001604052806105e4610579565b60008260408101836000805b600281101561071a57848403885282518051808652835b818110156106e3576020818401810151888301820152016106c7565b818111156106f45784602083890101525b506020998a0199601f91909101601f1916959095018501949390930192506001016106b0565b50919695505050505050565b80518051151583526020808201516001600160d01b031916818501526040808301518051600b0b82870152808301516effffffffffffffffffffffffffffff19166060870152015160009261012092909160808701855b60018110156107a35782516001600160a01b03168252918301919083019060010161077d565b505050606082015191506107bc60a0870183601a0b9052565b840151151560c08601525060408301516001600160a01b031660e0850152606083015161010085018290526107f3828601826106a4565b95945050505050565b8060005b60048110156108915781518460005b600180821061081e5750610878565b835180518460005b8481101561084c57825165ffffffffffff19168252602092830192909101908401610826565b50505060209081015168ffffffffffffffffff168482015293909301925060409091019060010161080f565b5050506040939093019260209190910190600101610800565b50505050565b602080825282516001600160a01b0319168282015282810151610140604080850191909152600092916101a0850191610160860185805b60028110156109685788860361015f190183528451805160a09088855b600181101561090a57825115158252918b0191908b01906001016108eb565b50505088820151818a8a0152610922828a0182610726565b9150508582015161093d878a01826001600160a01b03169052565b50606082810151151590890152608091820151601a0b919097015293860193918601916001016108ce565b505050860151925061097f905060608501836107fc565b94935050505056fe4d6f6f20c3a9f09f9a806f4df09f9a806ff09f9a80f09f9a806f6fc3a9206fc3a94d20c3a94d4d4d6f4dc3a94df09f9a80f09f9a80f09f9a804d4d6fc3a94d6f4d6f6f20c3a9f09f9a80f09f9a80c3a96ff09f9a80f09f9a806f6f206f6fc3a9f09f9a80204dc3a920c3a96f4d6fa26469706673582212200ae9cd68a955770617c3a3fec31cae76f5df9aa454388ec6cce6951519a465f064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5d816ab6 {\n int96 s_0;\n bytes17 s_1;\n address[1] s_2;\n }\n\n struct S_7466de91 {\n bool s_0;\n bytes6 s_1;\n S_5d816ab6 s_2;\n int216 s_3;\n }\n\n struct S_17d737f2 {\n S_7466de91 s_0;\n bool s_1;\n address s_2;\n string[2] s_3;\n }\n\n struct S_ffddc76d {\n bool[1] s_0;\n S_17d737f2 s_1;\n address s_2;\n bool s_3;\n int216 s_4;\n }\n\n struct S_95d62f8c {\n bytes26[1] s_0;\n uint72 s_1;\n }\n\n struct S_5c624a1a {\n bytes12 s_0;\n S_ffddc76d[2] s_1;\n S_95d62f8c[1][4] s_2;\n }\n\n function test () public pure returns (S_5c624a1a memory) {\n S_5c624a1a memory r;\n {\n bytes12 r_0 = bytes12(0x53f5aca5c337a6c4e4431d72);\n r.s_0 = r_0;\n }\n {\n S_ffddc76d[2] memory r_1;\n {\n S_ffddc76d memory r_1_0;\n {\n bool[1] memory r_1_0_0;\n {\n bool r_1_0_0_0 = false;\n r_1_0_0[0] = r_1_0_0_0;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n S_17d737f2 memory r_1_0_1;\n {\n S_7466de91 memory r_1_0_1_0;\n {\n bool r_1_0_1_0_0 = false;\n r_1_0_1_0.s_0 = r_1_0_1_0_0;\n }\n {\n bytes6 r_1_0_1_0_1 = bytes6(0x0459af93ff15);\n r_1_0_1_0.s_1 = r_1_0_1_0_1;\n }\n {\n S_5d816ab6 memory r_1_0_1_0_2;\n {\n int96 r_1_0_1_0_2_0 = -1971481084983213762991294426;\n r_1_0_1_0_2.s_0 = r_1_0_1_0_2_0;\n }\n {\n bytes17 r_1_0_1_0_2_1 = bytes17(0x334370eb969e54f9f9a6797ce5b26d69a4);\n r_1_0_1_0_2.s_1 = r_1_0_1_0_2_1;\n }\n {\n address[1] memory r_1_0_1_0_2_2;\n {\n address r_1_0_1_0_2_2_0 = 0x5777a1622dA18A644c9Ece970AB481096D6b6785;\n r_1_0_1_0_2_2[0] = r_1_0_1_0_2_2_0;\n }\n r_1_0_1_0_2.s_2 = r_1_0_1_0_2_2;\n }\n r_1_0_1_0.s_2 = r_1_0_1_0_2;\n }\n {\n int216 r_1_0_1_0_3 = 40803334357589702835248104181007008695506356321232760585881391362;\n r_1_0_1_0.s_3 = r_1_0_1_0_3;\n }\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n bool r_1_0_1_1 = true;\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n {\n address r_1_0_1_2 = 0xA63603C3E83fe5AfFD512c4757e12704D57edE06;\n r_1_0_1.s_2 = r_1_0_1_2;\n }\n {\n string[2] memory r_1_0_1_3;\n {\n string memory r_1_0_1_3_0 = unicode\"Moo é🚀🚀éo🚀🚀oo ooé🚀 Mé éoMo\";\n r_1_0_1_3[0] = r_1_0_1_3_0;\n }\n {\n string memory r_1_0_1_3_1 = unicode\"Moo é🚀\";\n r_1_0_1_3[1] = r_1_0_1_3_1;\n }\n r_1_0_1.s_3 = r_1_0_1_3;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0xc941Ff66A427EA171bf2914600E0e1190B7195d8;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n bool r_1_0_3 = true;\n r_1_0.s_3 = r_1_0_3;\n }\n {\n int216 r_1_0_4 = 51058849365927828416897941719704376935603890168361591909656805788;\n r_1_0.s_4 = r_1_0_4;\n }\n r_1[0] = r_1_0;\n }\n {\n S_ffddc76d memory r_1_1;\n {\n bool[1] memory r_1_1_0;\n {\n bool r_1_1_0_0 = true;\n r_1_1_0[0] = r_1_1_0_0;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_17d737f2 memory r_1_1_1;\n {\n S_7466de91 memory r_1_1_1_0;\n {\n bool r_1_1_1_0_0 = true;\n r_1_1_1_0.s_0 = r_1_1_1_0_0;\n }\n {\n bytes6 r_1_1_1_0_1 = bytes6(0x44c424db4462);\n r_1_1_1_0.s_1 = r_1_1_1_0_1;\n }\n {\n S_5d816ab6 memory r_1_1_1_0_2;\n {\n int96 r_1_1_1_0_2_0 = 3040682035426292858005706211;\n r_1_1_1_0_2.s_0 = r_1_1_1_0_2_0;\n }\n {\n bytes17 r_1_1_1_0_2_1 = bytes17(0x04576614aebf9df5f412dc8070e1b3f880);\n r_1_1_1_0_2.s_1 = r_1_1_1_0_2_1;\n }\n {\n address[1] memory r_1_1_1_0_2_2;\n {\n address r_1_1_1_0_2_2_0 = 0xb126e7A9fe6838C58cD6FcfB7aaeD52023e1eB58;\n r_1_1_1_0_2_2[0] = r_1_1_1_0_2_2_0;\n }\n r_1_1_1_0_2.s_2 = r_1_1_1_0_2_2;\n }\n r_1_1_1_0.s_2 = r_1_1_1_0_2;\n }\n {\n int216 r_1_1_1_0_3 = 36539763564443667408874316987657089023188009277806280294774565176;\n r_1_1_1_0.s_3 = r_1_1_1_0_3;\n }\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n {\n bool r_1_1_1_1 = false;\n r_1_1_1.s_1 = r_1_1_1_1;\n }\n {\n address r_1_1_1_2 = 0x67C55D695ef8202aCc2AA6aeF8dD600CFb4617C5;\n r_1_1_1.s_2 = r_1_1_1_2;\n }\n {\n string[2] memory r_1_1_1_3;\n {\n string memory r_1_1_1_3_0 = unicode\"Moo é🚀 oo\";\n r_1_1_1_3[0] = r_1_1_1_3_0;\n }\n {\n string memory r_1_1_1_3_1 = unicode\"Moo é🚀oM🚀o🚀🚀ooé oéM éMMMoMéM🚀🚀🚀MMoéMo\";\n r_1_1_1_3[1] = r_1_1_1_3_1;\n }\n r_1_1_1.s_3 = r_1_1_1_3;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n address r_1_1_2 = 0xFBa585d4539c5dBa57261fe3E378FfF8Ef8922f7;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bool r_1_1_3 = false;\n r_1_1.s_3 = r_1_1_3;\n }\n {\n int216 r_1_1_4 = -24578961906272079566045346142590683337501256663213591040882424049;\n r_1_1.s_4 = r_1_1_4;\n }\n r_1[1] = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n S_95d62f8c[1][4] memory r_2;\n {\n S_95d62f8c[1] memory r_2_0;\n {\n S_95d62f8c memory r_2_0_0;\n {\n bytes26[1] memory r_2_0_0_0;\n {\n bytes26 r_2_0_0_0_0 = bytes26(0x1cce66ed41ce4daa4c2c3f325402f0ea84eb72e70f45db421d7d);\n r_2_0_0_0[0] = r_2_0_0_0_0;\n }\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n uint72 r_2_0_0_1 = 882759070998650718416;\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n r_2_0[0] = r_2_0_0;\n }\n r_2[0] = r_2_0;\n }\n {\n S_95d62f8c[1] memory r_2_1;\n {\n S_95d62f8c memory r_2_1_0;\n {\n bytes26[1] memory r_2_1_0_0;\n {\n bytes26 r_2_1_0_0_0 = bytes26(0xeed637dfd60e96516dbbf9773072fa785db80df9cb64fd36cb0f);\n r_2_1_0_0[0] = r_2_1_0_0_0;\n }\n r_2_1_0.s_0 = r_2_1_0_0;\n }\n {\n uint72 r_2_1_0_1 = 3485286420009806226919;\n r_2_1_0.s_1 = r_2_1_0_1;\n }\n r_2_1[0] = r_2_1_0;\n }\n r_2[1] = r_2_1;\n }\n {\n S_95d62f8c[1] memory r_2_2;\n {\n S_95d62f8c memory r_2_2_0;\n {\n bytes26[1] memory r_2_2_0_0;\n {\n bytes26 r_2_2_0_0_0 = bytes26(0x13a1aacc856d1fb4ee25c3219793d4f53602460a93c4ca520775);\n r_2_2_0_0[0] = r_2_2_0_0_0;\n }\n r_2_2_0.s_0 = r_2_2_0_0;\n }\n {\n uint72 r_2_2_0_1 = 1639765765829936911687;\n r_2_2_0.s_1 = r_2_2_0_1;\n }\n r_2_2[0] = r_2_2_0;\n }\n r_2[2] = r_2_2;\n }\n {\n S_95d62f8c[1] memory r_2_3;\n {\n S_95d62f8c memory r_2_3_0;\n {\n bytes26[1] memory r_2_3_0_0;\n {\n bytes26 r_2_3_0_0_0 = bytes26(0xcad7c6e65ecc5a81ce2c6d1e8b3ae6e6644c72451c27e85dd334);\n r_2_3_0_0[0] = r_2_3_0_0_0;\n }\n r_2_3_0.s_0 = r_2_3_0_0;\n }\n {\n uint72 r_2_3_0_1 = 1618529194808791461717;\n r_2_3_0.s_1 = r_2_3_0_1;\n }\n r_2_3[0] = r_2_3_0;\n }\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002053f5aca5c337a6c4e4431d72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001401cce66ed41ce4daa4c2c3f325402f0ea84eb72e70f45db421d7d00000000000000000000000000000000000000000000000000000000002fdabe3a03e86888d0eed637dfd60e96516dbbf9773072fa785db80df9cb64fd36cb0f0000000000000000000000000000000000000000000000000000000000bcf010bd28f96465e713a1aacc856d1fb4ee25c3219793d4f53602460a93c4ca520775000000000000000000000000000000000000000000000000000000000058e452442bc3c19547cad7c6e65ecc5a81ce2c6d1e8b3ae6e6644c72451c27e85dd334000000000000000000000000000000000000000000000000000000000057bd9acf57e906ef55000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000c941ff66a427ea171bf2914600e0e1190b7195d8000000000000000000000000000000000000000000000000000000000000000100000000007c1dfffddd5d2e07e76655cbb5e61e9d6fea5149ee1de6759fc19c00000000000000000000000000000000000000000000000000000000000000000459af93ff150000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffff9a13aa43b7baf01ec30f826334370eb969e54f9f9a6797ce5b26d69a40000000000000000000000000000000000000000000000000000005777a1622da18a644c9ece970ab481096d6b67850000000000632ffa30f4822b0d6682e88c1ff4c1b61f69366a2126e5941011020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a63603c3e83fe5affd512c4757e12704d57ede060000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80f09f9a80c3a96ff09f9a80f09f9a806f6f206f6fc3a9f09f9a80204dc3a920c3a96f4d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000fba585d4539c5dba57261fe3e378fff8ef8922f70000000000000000000000000000000000000000000000000000000000000000ffffffffffc4407975d6c795b5a8c1b15ff32f80c872050cd2c8d4d11803470f000000000000000000000000000000000000000000000000000000000000000144c424db44620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d331776eadf0a35ca355e304576614aebf9df5f412dc8070e1b3f880000000000000000000000000000000000000000000000000000000b126e7a9fe6838c58cd6fcfb7aaed52023e1eb58000000000058d2c02d4aada6f2fa94ad8d73c4111b8097dbf67417c646436938000000000000000000000000000000000000000000000000000000000000000000000000000000000000000067c55d695ef8202acc2aa6aef8dd600cfb4617c5000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a8020206f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a806f4df09f9a806ff09f9a80f09f9a806f6fc3a9206fc3a94d20c3a94d4d4d6f4dc3a94df09f9a80f09f9a80f09f9a804d4d6fc3a94d6f" + }, + { + "name": "random-(bytes31,(bool,string,bytes3,((string,(address,string),bytes31,bool,address[2])[3],address,bytes7[],(bytes6,string,uint224[4],string),address[2])),bool)", + "type": "(bytes31,(bool,string,bytes3,((string,(address,string),bytes31,bool,address[2])[3],address,bytes7[],(bytes6,string,uint224[4],string),address[2])),bool)", + "value": [ + "0x71789785ea72517af99f74e3fb407127951340d7d520257a8ebb65f54e1afe", + [ + false, + "Moo é🚀M🚀", + "0x93e73b", + [ + [ + [ + "Moo é🚀oééé🚀é🚀oo🚀éoMooM🚀M 🚀🚀🚀ooMM", + ["0xCCF090B7Ce8Cb7F741202d046af8B380E11963c3", "Moo é🚀oo M M🚀éééMM"], + "0xde4782669f681e3d064817c71067bfc48e736aad3747960ac26b554287bb76", + true, + [ + "0x19C317E543305F4F0739cBd681F799155cE96465", + "0x6b0bD86C29ac1edd4B8822e778ACA20e05E3eb93" + ] + ], + [ + "Moo é🚀M é MéMo MM🚀oéMoéoM🚀🚀o oé🚀🚀oM ooéoo🚀é éM🚀M", + [ + "0x4C85fe8001B39Ee70bD3a7072a6303a0fB00D8D8", + "Moo é🚀éé o oo🚀 oMééoéo" + ], + "0xc8c786624a4d6a960fc904f05353534afdf6100d1a2810bc6c753c536a5b9b", + true, + [ + "0x96626ba13d99EE6d5e0Dc04657475DE9dd5E98f5", + "0xEF1714ae6973eE02dcE5801572e6775d71755741" + ] + ], + [ + "Moo é🚀oo🚀M🚀oéo oo oo Mo o ", + [ + "0x5aD5B31BF0f30D04E89098EC4b4DE3db3E4A975f", + "Moo é🚀o🚀Méo 🚀éé Mo é🚀 oéoM ooMo🚀MooM🚀🚀MoMMMoo🚀M éooo🚀oM" + ], + "0xab25e1c179692e44cfd3cee3ccef1716af35b791ef0f5a788693ff676ab893", + false, + [ + "0xA297AAe107Fe6B2525eceA88945fBc3169955D31", + "0x52E1b0762EEba073cbb8f317020CFCE214F2e85F" + ] + ] + ], + "0x95667A4DCE4F71464986c16681fBdc29Ab44BF33", + ["0xc9d89cac7bfe49", "0x809ab310b3b47b", "0xd6937045a2a627"], + [ + "0x24d9fbed640c", + "Moo é🚀oo Méééooooo🚀o🚀M", + [ + "18260040204669273983367984183841222908336359884446240702289504676480", + "20689410844088486323544556789595477163788398968380336675309503198612", + "9261121455333649860773143397004589990171015849159111998294778383167", + "7274891814480000480114167924079011163663227992870544813085229739982" + ], + "Moo é🚀" + ], + [ + "0xfb32B8204d3A80486de3be80b8e9e3682e3b99Fa", + "0x0B05F899B05Da84E58Fe6545Dd7B6e67BA2bc48F" + ] + ] + ], + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x71789785ea72517af99f74e3fb407127951340d7d520257a8ebb65f54e1afe" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M🚀" + }, + { + "type": "hexstring", + "value": "0x93e73b" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oééé🚀é🚀oo🚀éoMooM🚀M 🚀🚀🚀ooMM" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xCCF090B7Ce8Cb7F741202d046af8B380E11963c3" + }, + { + "type": "string", + "value": "Moo é🚀oo M M🚀éééMM" + } + ] + }, + { + "type": "hexstring", + "value": "0xde4782669f681e3d064817c71067bfc48e736aad3747960ac26b554287bb76" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x19C317E543305F4F0739cBd681F799155cE96465" + }, + { + "type": "address", + "value": "0x6b0bD86C29ac1edd4B8822e778ACA20e05E3eb93" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M é MéMo MM🚀oéMoéoM🚀🚀o oé🚀🚀oM ooéoo🚀é éM🚀M" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4C85fe8001B39Ee70bD3a7072a6303a0fB00D8D8" + }, + { + "type": "string", + "value": "Moo é🚀éé o oo🚀 oMééoéo" + } + ] + }, + { + "type": "hexstring", + "value": "0xc8c786624a4d6a960fc904f05353534afdf6100d1a2810bc6c753c536a5b9b" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x96626ba13d99EE6d5e0Dc04657475DE9dd5E98f5" + }, + { + "type": "address", + "value": "0xEF1714ae6973eE02dcE5801572e6775d71755741" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀M🚀oéo oo oo Mo o " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5aD5B31BF0f30D04E89098EC4b4DE3db3E4A975f" + }, + { + "type": "string", + "value": "Moo é🚀o🚀Méo 🚀éé Mo é🚀 oéoM ooMo🚀MooM🚀🚀MoMMMoo🚀M éooo🚀oM" + } + ] + }, + { + "type": "hexstring", + "value": "0xab25e1c179692e44cfd3cee3ccef1716af35b791ef0f5a788693ff676ab893" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xA297AAe107Fe6B2525eceA88945fBc3169955D31" + }, + { + "type": "address", + "value": "0x52E1b0762EEba073cbb8f317020CFCE214F2e85F" + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x95667A4DCE4F71464986c16681fBdc29Ab44BF33" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc9d89cac7bfe49" + }, + { + "type": "hexstring", + "value": "0x809ab310b3b47b" + }, + { + "type": "hexstring", + "value": "0xd6937045a2a627" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x24d9fbed640c" + }, + { + "type": "string", + "value": "Moo é🚀oo Méééooooo🚀o🚀M" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "18260040204669273983367984183841222908336359884446240702289504676480" + }, + { + "type": "number", + "value": "20689410844088486323544556789595477163788398968380336675309503198612" + }, + { + "type": "number", + "value": "9261121455333649860773143397004589990171015849159111998294778383167" + }, + { + "type": "number", + "value": "7274891814480000480114167924079011163663227992870544813085229739982" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xfb32B8204d3A80486de3be80b8e9e3682e3b99Fa" + }, + { + "type": "address", + "value": "0x0B05F899B05Da84E58Fe6545Dd7B6e67BA2bc48F" + } + ] + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610be4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906108b3565b60405180910390f35b610056610603565b61005e610603565b7f71789785ea72517af99f74e3fb407127951340d7d520257a8ebb65f54e1afe00815261008961062b565b60008152604080518082018252600f81526d9adede418753e13f35009be13f35608f1b6020808301919091528301526293e73b60e81b908201526100cb610657565b6100d3610692565b6100db6106bf565b60006040518060600160405280603f8152602001610b4c603f91398252506040805180820182526060602080830182815273ccf090b7ce8cb7f741202d046af8b380e11963c3845284518086018652601d81527f4d6f6f20c3a9f09f9a806f6f204d20204df09f9a80c3a9c3a9c3a94d4d0000008184015290528401919091527fde4782669f681e3d064817c71067bfc48e736aad3747960ac26b554287bb760091830191909152600190820152610191610703565b7319c317e543305f4f0739cbd681f799155ce964658152736b0bd86c29ac1edd4b8822e778aca20e05e3eb936020820152608082015281526101d16106bf565b6000604051806080016040528060528152602001610ad460529139825250604080518082019091526000815260606020820152734c85fe8001b39ee70bd3a7072a6303a0fb00d8d881526040805160608101909152602480825260009190610b8b6020830139602080840191909152830191909152507fc8c786624a4d6a960fc904f05353534afdf6100d1a2810bc6c753c536a5b9b0060408201526001606082015261027c610703565b7396626ba13d99ee6d5e0dc04657475de9dd5e98f5815273ef1714ae6973ee02dce5801572e6775d7175574160208083019190915260808301919091528201526102c46106bf565b6000604051806060016040528060268152602001610b2660269139825250604080518082019091526000815260606020820152735ad5b31bf0f30d04e89098ec4b4de3db3e4a975f81526040805160808101909152605c80825260009190610a556020830139602080840191909152830191909152507fab25e1c179692e44cfd3cee3ccef1716af35b791ef0f5a788693ff676ab8930060408201526000606082015261036f610703565b73a297aae107fe6b2525ecea88945fbc3169955d3181527352e1b0762eeba073cbb8f317020cfce214f2e85f6020808301919091526080838101929092526040848101939093529284527395667a4dce4f71464986c16681fbdc29ab44bf33848401528151600380825291810190925260009282016060803683375050815191925066c9d89cac7bfe4960c81b91829150839060009061041157610411610a3e565b6001600160c81b03199092166020928302919091019091015250805166809ab310b3b47b60c81b9081908390600190811061044e5761044e610a3e565b6001600160c81b03199092166020928302919091019091015250805166d6937045a2a62760c81b9081908390600290811061048b5761048b610a3e565b6001600160c81b0319909216602092830291909101909101525060408201526104b2610721565b6509367efb590360d21b81526040805160608101909152602380825260009190610ab160208301396020830152506104e861074e565b7bad63b2eab381c4ede5ddcacf38ba3db61f71094e6d99217ba644aa8081527bc4752bfa2e6c5bf6c3cedb4e369c8c719ef92e2b8d3450aa770535946020808301919091527b57f08a07d9c90fb32eb35081f2c27a2c8b99bb562ec7f9e83e730b3f6040808401919091527b4514484a66b395a2ae34ff5935a279f6b96dbfe8c56557de32f26fce606080850191909152848201939093528051808201909152600a8152689adede418753e13f3560b71b91810191909152828201528201526105af610703565b73fb32b8204d3a80486de3be80b8e9e3682e3b99fa8152730b05f899b05da84e58fe6545dd7b6e67ba2bc48f6020808301919091526080830191909152606083019190915282015260006040820152919050565b6040805160608101909152600081526020810161061e61062b565b8152600060209091015290565b60408051608081018252600080825260606020830181905292820152908101610652610657565b905290565b6040518060a0016040528061066a610692565b81526000602082015260606040820181905201610685610721565b8152602001610652610703565b60405180606001604052806003905b6106a96106bf565b8152602001906001900390816106a15790505090565b6040518060a00160405280606081526020016106ec60408051808201909152600081526060602082015290565b815260006020820181905260408201526060016106525b60405180604001604052806002906020820280368337509192915050565b60408051608081018252600081526060602082015290810161074161074e565b8152602001606081525090565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b8181101561079257602081850181015186830182015201610776565b818111156107a4576000602083870101525b50601f01601f19169290920160200192915050565b8060005b60028110156107e55781516001600160a01b03168452602093840193909101906001016107bd565b50505050565b600081518084526020808501945080840160005b838110156108255781516001600160c81b031916875295820195908201906001016107ff565b509495945050505050565b65ffffffffffff60d01b8151168252600060208083015160e08286015261085a60e086018261076c565b905060408401516040860160005b600481101561088e5782516001600160e01b031682529184019190840190600101610868565b5050506060840151915084810360c08601526108aa818361076c565b95945050505050565b60006020808352608060ff198086511683860152828601516060604081818901528251151585890152858301518560a08a01526108f46101008a018261076c565b848301516001600160e81b03191660c08b810191909152948401518a8203607f190160e08c0152805186835290959192506101208301919081840160005b60038110156109ca5785850360bf19018252825180518587526109578688018261076c565b90508d8201518782038f89015260018060a01b0381511682528e8101519050898f8301526109878a83018261076c565b9150508b898301511689880152898201516109a58b89018215159052565b50908c0151906109b7878e01836107b9565b955050918b0191908b0190600101610932565b50505050848801516001600160a01b038116838a01529550828501519750818103838301526109f981896107eb565b97505082840151945080870383820152610a138786610830565b9650858401519450610a27868201866107b9565b509097015115159590960194909452509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806ff09f9a804dc3a96f20f09f9a80c3a9c3a920204d6f2020c3a9f09f9a80206fc3a96f4d206f6f4d6ff09f9a804d6f6f4df09f9a80f09f9a804d6f4d4d4d6f6ff09f9a804d2020c3a96f6f6ff09f9a806f4d4d6f6f20c3a9f09f9a806f6f204dc3a9c3a9c3a96f6f6f6f6ff09f9a806ff09f9a804d4d6f6f20c3a9f09f9a804d20c3a9204dc3a94d6f204d4df09f9a806fc3a94d6fc3a96f4df09f9a80f09f9a806f20206fc3a9f09f9a80f09f9a806f4d206f6fc3a96f6ff09f9a80c3a920c3a94df09f9a804d4d6f6f20c3a9f09f9a806f6ff09f9a804df09f9a806fc3a96f206f6f206f6f204d6f206f20204d6f6f20c3a9f09f9a806fc3a9c3a9c3a9f09f9a80c3a9f09f9a806f6ff09f9a80c3a96f4d6f6f4df09f9a804d2020f09f9a80f09f9a80f09f9a806f6f4d4d4d6f6f20c3a9f09f9a80c3a9c3a9206f20206f6ff09f9a8020206f4dc3a9c3a96fc3a96fa264697066735822122007614360a5c3dea1e4ef5c52aeddc6389827a20a4ab42d78b208556164189fc464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8090aaf4 {\n address s_0;\n string s_1;\n }\n\n struct S_308b85cb {\n string s_0;\n S_8090aaf4 s_1;\n bytes31 s_2;\n bool s_3;\n address[2] s_4;\n }\n\n struct S_b53795a6 {\n bytes6 s_0;\n string s_1;\n uint224[4] s_2;\n string s_3;\n }\n\n struct S_15b64894 {\n S_308b85cb[3] s_0;\n address s_1;\n bytes7[] s_2;\n S_b53795a6 s_3;\n address[2] s_4;\n }\n\n struct S_1bd70314 {\n bool s_0;\n string s_1;\n bytes3 s_2;\n S_15b64894 s_3;\n }\n\n struct S_3317076f {\n bytes31 s_0;\n S_1bd70314 s_1;\n bool s_2;\n }\n\n function test () public pure returns (S_3317076f memory) {\n S_3317076f memory r;\n {\n bytes31 r_0 = bytes31(0x71789785ea72517af99f74e3fb407127951340d7d520257a8ebb65f54e1afe);\n r.s_0 = r_0;\n }\n {\n S_1bd70314 memory r_1;\n {\n bool r_1_0 = false;\n r_1.s_0 = r_1_0;\n }\n {\n string memory r_1_1 = unicode\"Moo é🚀M🚀\";\n r_1.s_1 = r_1_1;\n }\n {\n bytes3 r_1_2 = bytes3(0x93e73b);\n r_1.s_2 = r_1_2;\n }\n {\n S_15b64894 memory r_1_3;\n {\n S_308b85cb[3] memory r_1_3_0;\n {\n S_308b85cb memory r_1_3_0_0;\n {\n string memory r_1_3_0_0_0 = unicode\"Moo é🚀oééé🚀é🚀oo🚀éoMooM🚀M 🚀🚀🚀ooMM\";\n r_1_3_0_0.s_0 = r_1_3_0_0_0;\n }\n {\n S_8090aaf4 memory r_1_3_0_0_1;\n {\n address r_1_3_0_0_1_0 = 0xCCF090B7Ce8Cb7F741202d046af8B380E11963c3;\n r_1_3_0_0_1.s_0 = r_1_3_0_0_1_0;\n }\n {\n string memory r_1_3_0_0_1_1 = unicode\"Moo é🚀oo M M🚀éééMM\";\n r_1_3_0_0_1.s_1 = r_1_3_0_0_1_1;\n }\n r_1_3_0_0.s_1 = r_1_3_0_0_1;\n }\n {\n bytes31 r_1_3_0_0_2 = bytes31(0xde4782669f681e3d064817c71067bfc48e736aad3747960ac26b554287bb76);\n r_1_3_0_0.s_2 = r_1_3_0_0_2;\n }\n {\n bool r_1_3_0_0_3 = true;\n r_1_3_0_0.s_3 = r_1_3_0_0_3;\n }\n {\n address[2] memory r_1_3_0_0_4;\n {\n address r_1_3_0_0_4_0 = 0x19C317E543305F4F0739cBd681F799155cE96465;\n r_1_3_0_0_4[0] = r_1_3_0_0_4_0;\n }\n {\n address r_1_3_0_0_4_1 = 0x6b0bD86C29ac1edd4B8822e778ACA20e05E3eb93;\n r_1_3_0_0_4[1] = r_1_3_0_0_4_1;\n }\n r_1_3_0_0.s_4 = r_1_3_0_0_4;\n }\n r_1_3_0[0] = r_1_3_0_0;\n }\n {\n S_308b85cb memory r_1_3_0_1;\n {\n string memory r_1_3_0_1_0 = unicode\"Moo é🚀M é MéMo MM🚀oéMoéoM🚀🚀o oé🚀🚀oM ooéoo🚀é éM🚀M\";\n r_1_3_0_1.s_0 = r_1_3_0_1_0;\n }\n {\n S_8090aaf4 memory r_1_3_0_1_1;\n {\n address r_1_3_0_1_1_0 = 0x4C85fe8001B39Ee70bD3a7072a6303a0fB00D8D8;\n r_1_3_0_1_1.s_0 = r_1_3_0_1_1_0;\n }\n {\n string memory r_1_3_0_1_1_1 = unicode\"Moo é🚀éé o oo🚀 oMééoéo\";\n r_1_3_0_1_1.s_1 = r_1_3_0_1_1_1;\n }\n r_1_3_0_1.s_1 = r_1_3_0_1_1;\n }\n {\n bytes31 r_1_3_0_1_2 = bytes31(0xc8c786624a4d6a960fc904f05353534afdf6100d1a2810bc6c753c536a5b9b);\n r_1_3_0_1.s_2 = r_1_3_0_1_2;\n }\n {\n bool r_1_3_0_1_3 = true;\n r_1_3_0_1.s_3 = r_1_3_0_1_3;\n }\n {\n address[2] memory r_1_3_0_1_4;\n {\n address r_1_3_0_1_4_0 = 0x96626ba13d99EE6d5e0Dc04657475DE9dd5E98f5;\n r_1_3_0_1_4[0] = r_1_3_0_1_4_0;\n }\n {\n address r_1_3_0_1_4_1 = 0xEF1714ae6973eE02dcE5801572e6775d71755741;\n r_1_3_0_1_4[1] = r_1_3_0_1_4_1;\n }\n r_1_3_0_1.s_4 = r_1_3_0_1_4;\n }\n r_1_3_0[1] = r_1_3_0_1;\n }\n {\n S_308b85cb memory r_1_3_0_2;\n {\n string memory r_1_3_0_2_0 = unicode\"Moo é🚀oo🚀M🚀oéo oo oo Mo o \";\n r_1_3_0_2.s_0 = r_1_3_0_2_0;\n }\n {\n S_8090aaf4 memory r_1_3_0_2_1;\n {\n address r_1_3_0_2_1_0 = 0x5aD5B31BF0f30D04E89098EC4b4DE3db3E4A975f;\n r_1_3_0_2_1.s_0 = r_1_3_0_2_1_0;\n }\n {\n string memory r_1_3_0_2_1_1 = unicode\"Moo é🚀o🚀Méo 🚀éé Mo é🚀 oéoM ooMo🚀MooM🚀🚀MoMMMoo🚀M éooo🚀oM\";\n r_1_3_0_2_1.s_1 = r_1_3_0_2_1_1;\n }\n r_1_3_0_2.s_1 = r_1_3_0_2_1;\n }\n {\n bytes31 r_1_3_0_2_2 = bytes31(0xab25e1c179692e44cfd3cee3ccef1716af35b791ef0f5a788693ff676ab893);\n r_1_3_0_2.s_2 = r_1_3_0_2_2;\n }\n {\n bool r_1_3_0_2_3 = false;\n r_1_3_0_2.s_3 = r_1_3_0_2_3;\n }\n {\n address[2] memory r_1_3_0_2_4;\n {\n address r_1_3_0_2_4_0 = 0xA297AAe107Fe6B2525eceA88945fBc3169955D31;\n r_1_3_0_2_4[0] = r_1_3_0_2_4_0;\n }\n {\n address r_1_3_0_2_4_1 = 0x52E1b0762EEba073cbb8f317020CFCE214F2e85F;\n r_1_3_0_2_4[1] = r_1_3_0_2_4_1;\n }\n r_1_3_0_2.s_4 = r_1_3_0_2_4;\n }\n r_1_3_0[2] = r_1_3_0_2;\n }\n r_1_3.s_0 = r_1_3_0;\n }\n {\n address r_1_3_1 = 0x95667A4DCE4F71464986c16681fBdc29Ab44BF33;\n r_1_3.s_1 = r_1_3_1;\n }\n {\n bytes7[] memory r_1_3_2 = new bytes7[](3);\n {\n bytes7 r_1_3_2_0 = bytes7(0xc9d89cac7bfe49);\n r_1_3_2[0] = r_1_3_2_0;\n }\n {\n bytes7 r_1_3_2_1 = bytes7(0x809ab310b3b47b);\n r_1_3_2[1] = r_1_3_2_1;\n }\n {\n bytes7 r_1_3_2_2 = bytes7(0xd6937045a2a627);\n r_1_3_2[2] = r_1_3_2_2;\n }\n r_1_3.s_2 = r_1_3_2;\n }\n {\n S_b53795a6 memory r_1_3_3;\n {\n bytes6 r_1_3_3_0 = bytes6(0x24d9fbed640c);\n r_1_3_3.s_0 = r_1_3_3_0;\n }\n {\n string memory r_1_3_3_1 = unicode\"Moo é🚀oo Méééooooo🚀o🚀M\";\n r_1_3_3.s_1 = r_1_3_3_1;\n }\n {\n uint224[4] memory r_1_3_3_2;\n {\n uint224 r_1_3_3_2_0 = 18260040204669273983367984183841222908336359884446240702289504676480;\n r_1_3_3_2[0] = r_1_3_3_2_0;\n }\n {\n uint224 r_1_3_3_2_1 = 20689410844088486323544556789595477163788398968380336675309503198612;\n r_1_3_3_2[1] = r_1_3_3_2_1;\n }\n {\n uint224 r_1_3_3_2_2 = 9261121455333649860773143397004589990171015849159111998294778383167;\n r_1_3_3_2[2] = r_1_3_3_2_2;\n }\n {\n uint224 r_1_3_3_2_3 = 7274891814480000480114167924079011163663227992870544813085229739982;\n r_1_3_3_2[3] = r_1_3_3_2_3;\n }\n r_1_3_3.s_2 = r_1_3_3_2;\n }\n {\n string memory r_1_3_3_3 = unicode\"Moo é🚀\";\n r_1_3_3.s_3 = r_1_3_3_3;\n }\n r_1_3.s_3 = r_1_3_3;\n }\n {\n address[2] memory r_1_3_4;\n {\n address r_1_3_4_0 = 0xfb32B8204d3A80486de3be80b8e9e3682e3b99Fa;\n r_1_3_4[0] = r_1_3_4_0;\n }\n {\n address r_1_3_4_1 = 0x0B05F899B05Da84E58Fe6545Dd7B6e67BA2bc48F;\n r_1_3_4[1] = r_1_3_4_1;\n }\n r_1_3.s_4 = r_1_3_4;\n }\n r_1.s_3 = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = false;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002071789785ea72517af99f74e3fb407127951340d7d520257a8ebb65f54e1afe00000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008093e73b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a804df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000095667a4dce4f71464986c16681fbdc29ab44bf3300000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000700000000000000000000000000fb32b8204d3a80486de3be80b8e9e3682e3b99fa0000000000000000000000000b05f899b05da84e58fe6545dd7b6e67ba2bc48f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120de4782669f681e3d064817c71067bfc48e736aad3747960ac26b554287bb7600000000000000000000000000000000000000000000000000000000000000000100000000000000000000000019c317e543305f4f0739cbd681f799155ce964650000000000000000000000006b0bd86c29ac1edd4b8822e778aca20e05e3eb93000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a806fc3a9c3a9c3a9f09f9a80c3a9f09f9a806f6ff09f9a80c3a96f4d6f6f4df09f9a804d2020f09f9a80f09f9a80f09f9a806f6f4d4d00000000000000000000000000ccf090b7ce8cb7f741202d046af8b380e11963c30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f6f204d20204df09f9a80c3a9c3a9c3a94d4d00000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140c8c786624a4d6a960fc904f05353534afdf6100d1a2810bc6c753c536a5b9b00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000096626ba13d99ee6d5e0dc04657475de9dd5e98f5000000000000000000000000ef1714ae6973ee02dce5801572e6775d7175574100000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a804d20c3a9204dc3a94d6f204d4df09f9a806fc3a94d6fc3a96f4df09f9a80f09f9a806f20206fc3a9f09f9a80f09f9a806f4d206f6fc3a96f6ff09f9a80c3a920c3a94df09f9a804d00000000000000000000000000000000000000000000000000004c85fe8001b39ee70bd3a7072a6303a0fb00d8d8000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000244d6f6f20c3a9f09f9a80c3a9c3a9206f20206f6ff09f9a8020206f4dc3a9c3a96fc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120ab25e1c179692e44cfd3cee3ccef1716af35b791ef0f5a788693ff676ab893000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a297aae107fe6b2525ecea88945fbc3169955d3100000000000000000000000052e1b0762eeba073cbb8f317020cfce214f2e85f00000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a806f6ff09f9a804df09f9a806fc3a96f206f6f206f6f204d6f206f202000000000000000000000000000000000000000000000000000000000000000000000000000005ad5b31bf0f30d04e89098ec4b4de3db3e4a975f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806ff09f9a804dc3a96f20f09f9a80c3a9c3a920204d6f2020c3a9f09f9a80206fc3a96f4d206f6f4d6ff09f9a804d6f6f4df09f9a80f09f9a804d6f4d4d4d6f6ff09f9a804d2020c3a96f6f6ff09f9a806f4d000000000000000000000000000000000000000000000000000000000000000000000003c9d89cac7bfe4900000000000000000000000000000000000000000000000000809ab310b3b47b00000000000000000000000000000000000000000000000000d6937045a2a6270000000000000000000000000000000000000000000000000024d9fbed640c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000ad63b2eab381c4ede5ddcacf38ba3db61f71094e6d99217ba644aa8000000000c4752bfa2e6c5bf6c3cedb4e369c8c719ef92e2b8d3450aa770535940000000057f08a07d9c90fb32eb35081f2c27a2c8b99bb562ec7f9e83e730b3f000000004514484a66b395a2ae34ff5935a279f6b96dbfe8c56557de32f26fce000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806f6f204dc3a9c3a9c3a96f6f6f6f6ff09f9a806ff09f9a804d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int32,(uint56,bytes27,bool,(address,bool,(bool,bool),(bytes31,(string,bytes17,((uint80),string)[3][],(bytes31,uint104)[4],uint48)))),string)[4][1][3]", + "type": "(int32,(uint56,bytes27,bool,(address,bool,(bool,bool),(bytes31,(string,bytes17,((uint80),string)[3][],(bytes31,uint104)[4],uint48)))),string)[4][1][3]", + "value": [ + [ + [ + [ + "18355222", + [ + "57605386795259468", + "0x71ef38edd1de0d0fe4505a0d0ae63937d06557cd28350ca1571f3c", + true, + [ + "0x27b258FA3988A5E38dBAf403f8727441Dad93286", + true, + [true, false], + [ + "0x25c195eec3482605a36958b210bc1d5437bfbdd949c9515603fba77abbdd55", + [ + "Moo é🚀🚀M🚀éo o🚀M🚀é o é🚀éo🚀M🚀o🚀oooéoooMoé🚀", + "0x38d263bc12265c652145b25a26113fcc7e", + [ + [ + [ + ["902109314565981353941411"], + "Moo é🚀o🚀🚀é🚀🚀 oM🚀🚀éééé🚀🚀oéMoM ooééo🚀 oé🚀 Méoo oo oooM o🚀Méo" + ], + [ + ["100921045557741606128354"], + "Moo é🚀Mé MoMMo🚀éoMoMoo🚀o 🚀éé M🚀MoéMoM🚀Mé🚀oo🚀M " + ], + [ + ["591931470670889595099545"], + "Moo é🚀 🚀 o o🚀🚀MéoM oéoéo🚀oMoM🚀M" + ] + ], + [ + [ + ["476592337609322106346873"], + "Moo é🚀oMo🚀 🚀M ooooo o🚀o éé éMééooéooM oooo🚀🚀M é oo" + ], + [ + ["207837155718070607859987"], + "Moo é🚀o o o o🚀éo🚀MMMM 🚀🚀M🚀o 🚀é🚀éoéoé é Méo🚀Méoo🚀🚀oMMooé" + ], + [ + ["245780807101999562840711"], + "Moo é🚀🚀 éMoMo o🚀MM🚀 ééMo éoooMoooMoooéé🚀🚀oo🚀ééo 🚀🚀 " + ] + ], + [ + [["841037729954510806441697"], "Moo é🚀"], + [["710066326581668142669341"], "Moo é🚀é"], + [ + ["910891532403756632616283"], + "Moo é🚀Mo oooMéooMééé🚀🚀🚀M oMéééMMooé🚀éoéo Mooo🚀M o Mooo" + ] + ], + [ + [ + ["95509990206409565452298"], + "Moo é🚀é oo 🚀🚀🚀éoéoMM oo" + ], + [ + ["768893670727290818509096"], + "Moo é🚀🚀 é🚀o🚀o🚀 ooéMoo M MMé oéMMoM oo éé 🚀é🚀 M🚀🚀" + ], + [ + ["1031893528898539643774826"], + "Moo é🚀 éM éoé🚀M🚀M Méoooé🚀 M éo oM" + ] + ] + ], + [ + [ + "0x8ef7380bb72bd51844a26505a8fd0c7fc4b8e3a6b621190a3645048351c5a6", + "2903159897798253948824791347977" + ], + [ + "0xe4bb152090d38297f101ae13a44055271fc8fab29f0d3af2e7281571268bfa", + "3905471293673782658392748267612" + ], + [ + "0x42276335c2b5dc4a14c14aff1c50b566dc75c7b1a094b3e1e2bb9b6ec63841", + "9282998479400373305756046633986" + ], + [ + "0xd6d90b6e348c2a6f2c2b3b68a8d9c0f3a98d9f00d489fe685e610a03cbcb72", + "14167259132795680660318273273641" + ] + ], + "194582415095792" + ] + ] + ] + ], + "Moo é🚀🚀o 🚀🚀🚀 M oéo ooééé" + ], + [ + "1518415825", + [ + "5576117797126617", + "0x2b5b999f8bd52f04f9f8a0369f3e05e13581bcbe71dc3e926aa6cb", + true, + [ + "0xD13e497f1e5527A3C27834b0deD2b5Fd3aBeB6E5", + true, + [false, false], + [ + "0x92d5e795f3be6659ea34b2b398b614b9826f2953e5e3d579aa3a4a8afcbddd", + [ + "Moo é🚀oéMoM oM🚀Mo Méo🚀éoMoé éé", + "0xa4d9191c96565cd2c349f9c8530d0377fb", + [ + [ + [ + ["1162095319204708183120967"], + "Moo é🚀🚀 ooééoé MM M ééo o 🚀 é 🚀Mo o éooM🚀MM 🚀oéM🚀éo Méo" + ], + [ + ["272884958764643581332538"], + "Moo é🚀oM oé ééoo🚀oé🚀Moééo🚀ooééoooééé ooééoMé o 🚀 ééo MoMM éM" + ], + [["791645322997087948475041"], "Moo é🚀éM"] + ], + [ + [ + ["723278491125565320940318"], + "Moo é🚀o oMééMo ooooooo🚀🚀 M" + ], + [ + ["552043958592243750387283"], + "Moo é🚀ooooMMMé🚀oo🚀éoo🚀oo🚀 🚀é🚀o" + ], + [ + ["308448460972648359403240"], + "Moo é🚀o🚀oééM o🚀 o oooé🚀 éo é🚀" + ] + ] + ], + [ + [ + "0x18ea9744fff348e9c64f3338bf54fd041553be491bcfe49f0fdbe627414e4f", + "17543211149938518911882444864746" + ], + [ + "0x7b7d35df8b8c2ac9211017182446b42780c97cbd9f6ebaed41f7c40ee5e62c", + "15221617671273916157388938414982" + ], + [ + "0xd0162622470078e075a86c08146dda6fd059f9ee5b079d4bd6b5b6adb2dfcd", + "12928109738491269108925831392415" + ], + [ + "0x18f6d5237f961e45ae2b6adada04ed3fdbc633a51c9beaa1816fad92a328d9", + "17559319900421028608277988566636" + ] + ], + "28013312150153" + ] + ] + ] + ], + "Moo é🚀🚀oo🚀oo" + ], + [ + "825705551", + [ + "17491718229780352", + "0xa43c3be0e2ebe1219c4a9a4a17823b0445eb881d7a0a9dca7ce46b", + true, + [ + "0x1F7D10a796a0B01ec3283A0efE4662CE1559fFd3", + false, + [false, true], + [ + "0x18863b8b339012d809b98142942d7057915e6f5b3b625e9c64b9ffd31bb8ac", + [ + "Moo é🚀MM ", + "0x2aea2b820e8dfca5d26a675335944badcf", + [], + [ + [ + "0x7e5de7c2e33b38f32447900ca4420d0e255b08c343517d2504d64581feb2e6", + "8286211808974415723761821562562" + ], + [ + "0x6c4f2f5c1814515150ce9b74b2057cdac529c6c73269b96000196d7628df1a", + "3417562814199303548836001735486" + ], + [ + "0x35fc69846197173e24beb7c054125f739dadc8525e64368dc39e86ea7df9de", + "18011624044238526319942890898687" + ], + [ + "0x42f0058d747f79ab9ea3c6eebccd31062d143c2658ee554a5e991dc87dd26e", + "2815035757122382850575985213136" + ] + ], + "276412360348032" + ] + ] + ] + ], + "Moo é🚀o ooooMéé MéMM ooMo éoéMoé 🚀oMéMM é M oMooo🚀éé oooééM " + ], + [ + "-1589091163", + [ + "10946574074863406", + "0x412af116c31a93b0d27258332e5af002ccc7dc69e661a1cec24493", + true, + [ + "0xa74d366A1c62AE724e42FD89B72Ee014c65c78DF", + false, + [true, false], + [ + "0xcb80725b7c1cad31f47d3ee80c560b81e8a4dd2b295eb79056bf742310fc8b", + [ + "Moo é🚀é éMMoo éoo o 🚀oéMoM", + "0xa930afe6e210b3bfcd09beb8346e9bdefa", + [], + [ + [ + "0xf582f681c34198affb98cc050e274ae77f43f9e0addbe1a1938e4623282b3a", + "1573085793233808965640542414042" + ], + [ + "0xfb22bdbc137f750cdbc42c8a9f571dd771e9e5738f668c1b7a5a3733b8a33b", + "16611964371288393801231102109040" + ], + [ + "0x3bf36e2756998fdb9e589406842585077db4effd2a919776e6b41303546e1a", + "19814559038747150532004354758775" + ], + [ + "0xc97d5a7d513773d4ff04089a762c02aafdc49bc58717147150315948c3f640", + "10316353148491318811956024938102" + ] + ], + "33295012599608" + ] + ] + ] + ], + "Moo é🚀 é oooéo ooéoo🚀oé🚀ooéM MMé ooMé🚀o o 🚀oo" + ] + ] + ], + [ + [ + [ + "1476853243", + [ + "60467477827986915", + "0x5332806576af8ec3d590461298d7f8128825a22aba5d48db506b25", + false, + [ + "0xb696E384D6829658BFB71D4B88BBBF321Ff97773", + false, + [false, true], + [ + "0x18729c2de78d8688c6ce47b17f62183da5d66fcc5037317ce617a5ade2f33b", + [ + "Moo é🚀M ooo🚀o", + "0x26b07b89792f6dc10a054ca5f625b67eab", + [], + [ + [ + "0xd3dab3151aaf56c3f4d62e2850a08f68bb168a0e2b6f2f239c42afb1a5dc97", + "6872418091216598016862177004896" + ], + [ + "0x47c1dc43c86c201aa67a63dfe1304ce7e5133eebe45c296c6ddb64d08263b9", + "10006911296464363614555990793596" + ], + [ + "0xfd7546ab959bba86a811b06891a91d2650f3576f09a7e1d289b61ff5f1e377", + "3801943204431408774802283769269" + ], + [ + "0xf158360981592577dcb27ec15e3e3b4b93772c9dcf893cafdbce2ec1832f64", + "13068490283941365693850383167407" + ] + ], + "216953581947454" + ] + ] + ] + ], + "Moo é🚀ooéM🚀 oééoo🚀ooo🚀 o Mé Mé oo🚀Mo M🚀Mo🚀éo🚀oMooo🚀 🚀MMoo" + ], + [ + "747420445", + [ + "16188566180546682", + "0x860b14b2e17b3fd6cd1634596166f9a76cefd3de0b605ab9512b0e", + true, + [ + "0x096563133d098C6cDB92D8af284ae57e06741593", + true, + [true, false], + [ + "0x6bf5b4a9ebe952fa7b8f9c4af1cd5a5d36834e99aff65611ac2085e6085bd9", + [ + "Moo é🚀éMo MoooéMéo🚀M é", + "0xbf51bb827ad140cd939d46eeb58884c043", + [ + [ + [ + ["778368575929596687322604"], + "Moo é🚀🚀oooM🚀é 🚀éooooM🚀o🚀MMoéoMM🚀ooéoM🚀é o oéoé MMooé🚀 Mé" + ], + [ + ["829843186055021846451034"], + "Moo é🚀M🚀éM M o 🚀é🚀éé ooéMoé MM🚀Mo🚀o🚀MMM🚀🚀 Mo" + ], + [["361770595238878083926428"], "Moo é🚀 🚀"] + ], + [ + [ + ["141486280541489331339031"], + "Moo é🚀o🚀oo🚀é oé ééo" + ], + [ + ["259028910893327677202134"], + "Moo é🚀 o oé🚀oMMMo🚀🚀 🚀oMoéMoMo🚀" + ], + [ + ["1133757143313620214830831"], + "Moo é🚀o éo éMé🚀o M🚀o🚀oM MMoMM o éo éo🚀🚀oMM 🚀🚀ooMéoMo" + ] + ], + [ + [ + ["601096245887659086830207"], + "Moo é🚀Mooo🚀 éooMoé🚀éo" + ], + [ + ["1098442981598804116546650"], + "Moo é🚀oM🚀🚀éoMMM🚀🚀oooéoooMéMo🚀oMéMoé🚀oMo🚀 éo🚀 ooo 🚀éoé🚀o" + ], + [ + ["341624200395660190621777"], + "Moo é🚀🚀oé🚀M🚀ooéééMo ooMéM🚀oo🚀Moo M🚀🚀🚀o🚀oo 🚀oMo🚀é o M🚀" + ] + ] + ], + [ + [ + "0xc28f97501f7791652fb45bb3d9976991bedac8ddf291eade2581dcc10dcf62", + "7046739415477862561695982978854" + ], + [ + "0x4d41991d972b7c188164e117804b6339c4e0347122b0189b8503ef38892b28", + "20246486506681101723782299644808" + ], + [ + "0xbd58cef4a779fd62899c2c85e99373c3b7e387394dc1a389e38c9a68866e5b", + "2405135291133471726241251808659" + ], + [ + "0xd8690ec22dfafe6dc7c6ba7e040bbca489b51c01b046eb15613743edd44e64", + "12233201482784658931643004358966" + ] + ], + "93747656736920" + ] + ] + ] + ], + "Moo é🚀ooo🚀 M🚀oMMé 🚀M🚀éo🚀oo ooM é🚀oooéé éééooéo🚀o🚀ooéo o o o🚀o" + ], + [ + "918624151", + [ + "56486694906339737", + "0x0ce34271c85d1f7ad57d1f3565af13198555b24f5c469c7c8d1670", + true, + [ + "0x52381eb8042518cfCD935a58DeC4334c3F97489E", + true, + [false, false], + [ + "0xb547c7cfcd6b78f66b4eecfdea431273018a3671ef8d68065a8edc201c233b", + [ + "Moo é🚀ooéo o🚀MéoMMé 🚀oé🚀🚀o M éooéMé éoééoé", + "0x3f68e27ce7b2ad3ef0f90b12fef74c3aa3", + [ + [ + [ + ["649705950308356913956615"], + "Moo é🚀éooooo🚀oéMMoo éo é ééééo" + ], + [ + ["58468454581933630711541"], + "Moo é🚀 Mooooéooéé🚀o🚀o oM Moo🚀Mo ééoo oéoooo🚀ooé🚀 ooM " + ], + [ + ["469311536106426346369599"], + "Moo é🚀🚀oM 🚀Moo MMMé oo oo🚀oo🚀oMMé M ooééoéMo é o" + ] + ], + [ + [["183883345857417564092205"], "Moo é🚀Mé🚀oM🚀"], + [["706959299831709797717431"], "Moo é🚀"], + [ + ["127672568362815957964762"], + "Moo é🚀éMo🚀ééoéMéo🚀o🚀" + ] + ], + [ + [["530031133160340027734252"], "Moo é🚀"], + [ + ["836123641572017954708367"], + "Moo é🚀o🚀🚀 🚀🚀o Mo🚀MééoMéoM🚀o🚀MéoooM🚀" + ], + [["404840947105315220766498"], "Moo é🚀oé o🚀oo"] + ], + [ + [["512886782297741481563198"], "Moo é🚀ooMé🚀ooo"], + [ + ["130508694331430248070448"], + "Moo é🚀Mé 🚀oMéM🚀🚀oMéo oM" + ], + [["484957477470614903403427"], "Moo é🚀🚀éoé"] + ] + ], + [ + [ + "0xe7ece7ae291cd0458a033985ada4c2fec400224a751c41f6447cf13301a401", + "12927771394155598973762112288802" + ], + [ + "0x255a667a600e5ee772487aa83888580271ad9d46ee529c5a50f6f3acb0b16f", + "17266090260360266537560743786226" + ], + [ + "0x0db78f003a4145bebf8fbd7fce49fb124592f6c0e551fdc45bb4aa2fd837c9", + "8454111238309761354615382142430" + ], + [ + "0x6c94b1caf5cae510639dc473a027026fecb07fee48304a13c1fe99817356cb", + "5598719154263456989403668378468" + ] + ], + "207026167236643" + ] + ] + ] + ], + "Moo é🚀o🚀Méooé o" + ], + [ + "-1914892012", + [ + "20299934080799188", + "0x1d2e9d46924e4f5913d7830e45246d546111b393349a7e51408075", + false, + [ + "0xE197Af46E9E37C4a6895Ca782651DA6377E279BF", + false, + [true, false], + [ + "0xa188b35c1d88ceb6ee0784da9e16e8e808c8c736520c4e4bb31de59d598f32", + [ + "Moo é🚀 o oé", + "0x61a2d25a7d1a2179e68e410932c51efb9b", + [ + [ + [["954032285101724101324237"], "Moo é🚀"], + [["196730564305282248666853"], "Moo é🚀o🚀o éoMM "], + [ + ["603667938580924110880859"], + "Moo é🚀 oéo éé 🚀oo " + ] + ], + [ + [ + ["1099728774289268466661399"], + "Moo é🚀éo 🚀oMoéé o oMooooM🚀éé🚀🚀éo " + ], + [ + ["959612613096905308760943"], + "Moo é🚀 🚀M Moooé🚀 oo M o oo 🚀o oé M" + ], + [ + ["1025002190457938415535849"], + "Moo é🚀🚀Moo oé🚀oMo 🚀M oMMoMo MéM🚀o" + ] + ] + ], + [ + [ + "0x12dcb1bc894edcec544c35af28d5be0a590a40830edd501c8c715faeb812d9", + "6995212533981106046433128563926" + ], + [ + "0x8d9fbe397650464e7b601019a91d2728b4cadbbcbbe79d21bfeb1f71b5336c", + "8597070187493096549654997007129" + ], + [ + "0xcc1e1fdc69738faa5d6621e6570f96ea5455879d84e6aced6eb8f4a98532b8", + "9129996001931131645523743293902" + ], + [ + "0xb8b96fd6a9e1bd59acb7c0b76803b3ebc93ddd50715a5c7600ce89852e0ed0", + "4242684607374094016047792180447" + ] + ], + "86381324625382" + ] + ] + ] + ], + "Moo é🚀 ooéo🚀🚀ooM" + ] + ] + ], + [ + [ + [ + "450086051", + [ + "1862667065203480", + "0xe8132e5855fcb7e84a8c0cb2d9cd67b7931a9d2c93bf826c2b77b5", + false, + [ + "0xa322764125e3A508d77E0ba42C154C12E193BD5e", + true, + [false, false], + [ + "0xde240c049f7da90a7ecb9156c990f89bdceb476917fd3322998d3bec8e0c5b", + [ + "Moo é🚀 M M🚀oooMMM🚀", + "0x617345c7fbe4523b00537142e2f8705b9a", + [ + [ + [ + ["1025559340071980978979119"], + "Moo é🚀oMoMéoéoMo oéMo oM ooooMMoMé MM ooMMéé🚀o o" + ], + [ + ["199996398625034076461454"], + "Moo é🚀🚀M🚀🚀MM ééé o" + ], + [["135884599882127575401329"], "Moo é🚀o🚀o"] + ], + [ + [ + ["515288475754605993331757"], + "Moo é🚀oMoo ééoMM " + ], + [ + ["731268341141024115374595"], + "Moo é🚀ééMo🚀 🚀o 🚀ooo🚀o o🚀🚀MM 🚀o🚀 ooéo🚀🚀éMooooéoo🚀Mo🚀🚀 🚀🚀🚀oMoo🚀é" + ], + [ + ["398545296696103799871368"], + "Moo é🚀Mo🚀 oo M oé🚀o " + ] + ], + [ + [ + ["881339986468801126955473"], + "Moo é🚀Moé🚀éo M éMM🚀ooMM🚀 oooM🚀oMooo🚀🚀éMMM🚀🚀 o🚀MMoM🚀 Mo" + ], + [ + ["655244207891843442155449"], + "Moo é🚀🚀oooéoo🚀é🚀MMMoo 🚀é🚀ééoéé éMé o éMMMooo🚀oooMMooééMo é o🚀" + ], + [ + ["160788531032816849381164"], + "Moo é🚀ooM🚀oM o oéoé🚀oéo🚀M 🚀o🚀🚀🚀é🚀 éM oéo M M🚀oé 🚀🚀🚀Mé🚀 o o" + ] + ], + [ + [ + ["62361039763499843442233"], + "Moo é🚀o🚀🚀🚀MoéooMéééééé é🚀 o🚀oo 🚀éM🚀éoM M o" + ], + [ + ["959406524645207881940115"], + "Moo é🚀o éoM 🚀 éMoMMo🚀MoMM🚀o" + ], + [ + ["146539970214223232055320"], + "Moo é🚀🚀oéooMo🚀 🚀 Mé🚀ooMoooo🚀🚀MéooéoéoMooooooMooo" + ] + ] + ], + [ + [ + "0x85d89f6f7782bc2075891a6d05add5f17d67133c2f7dfd884628f5b9135b5f", + "8152652264041231856031820014334" + ], + [ + "0x0fb8607251804ff82b5b152a4bae09bd636adc9ad4063a6d6ca2cab2560537", + "16416864780937006238066005305072" + ], + [ + "0x3ccbe135ae880f89c39361f314bffdf7a5c2aa5a2dedae7c3a6caa34848236", + "17480310804968673507446811182722" + ], + [ + "0xfa0b99564ab5bb7c3cf61146ccf566c56f9a5a7aa6f2c2bda64b15303e1713", + "19557527284622991208475854982546" + ] + ], + "83317973902405" + ] + ] + ] + ], + "Moo é🚀🚀oooé oM oé🚀o🚀MéMo M🚀ooM🚀o MM" + ], + [ + "700510769", + [ + "42507258221890211", + "0x00ccca1671adbde8393212111aa00d5c0e5d7b5453b136a72d0b04", + false, + [ + "0xA0cf4B6227A6214dCDFAD8F3b9a2b2159342c967", + true, + [true, true], + [ + "0xba32bcbcc576d6084f8da91ef59fabc42d2c32870f8f89e74d76849b23de8e", + [ + "Moo é🚀🚀o🚀 MMéo Mooo🚀éo 🚀 é oéo🚀éMéMéMéM🚀Mooo 🚀o", + "0xe64be12210d44d8c9af2b28b479fdda6e7", + [ + [ + [ + ["998904477997770689783828"], + "Moo é🚀ooo éoMo o 🚀éMo🚀M🚀oMoé ooéo🚀éMé" + ], + [ + ["672234829220922730895350"], + "Moo é🚀oooéo🚀ooé 🚀o🚀M🚀o🚀o oMoMéé🚀éooéoM oM🚀MooéM🚀o é🚀éMo🚀Mo éo" + ], + [ + ["565572148567774672239845"], + "Moo é🚀éo🚀ooMooé oooM ooMMoéMéMé oMM MMMMéoMoMéoMo" + ] + ] + ], + [ + [ + "0xdf5e535bdb2251e7b882f04e2c196d209e69bf0727fbcafe195e4536825a1b", + "6878548423508897219270706061599" + ], + [ + "0x221da0d5340ce979deba370153b25c5ad15c51438f37375ab06c759b7a9f48", + "15516337744500600307057943997971" + ], + [ + "0x814565cb98266cee7971f06826107017acb8ea548cde76f1a84d2ab364ad66", + "9082912372448664233971398161464" + ], + [ + "0x57119d2a41f20ade5aa366907021ca01c8dabdc944aa24f0a17f237bbc063d", + "12403548110132185946652650413082" + ] + ], + "6402288773077" + ] + ] + ] + ], + "Moo é🚀🚀o🚀🚀ooM🚀oo🚀éé🚀🚀oéoM 🚀Mo🚀🚀🚀🚀🚀o" + ], + [ + "379366848", + [ + "4777727319079755", + "0x8f000774670384e84ff808431f60951061811e1da8808f4b881570", + true, + [ + "0x9B867Cfd32926770310F8dc48F2a5761F8CeDb0B", + true, + [true, true], + [ + "0x46011da7fb6d10b847738342476d67cdafa19c63bef70301d8e60a8212c84c", + [ + "Moo é🚀🚀🚀o🚀🚀oé MM🚀 éoMoM🚀🚀éooo🚀o🚀oo🚀oM🚀éoé oMMM éooé🚀éo🚀", + "0xfdfac1c8007af04108c1865d6c50fa1249", + [ + [ + [ + ["57362128525397904213373"], + "Moo é🚀éo🚀 éoéMMMéo é ééM🚀🚀🚀ooé🚀Mo🚀🚀MéMé🚀Mo oéMéo MMooo" + ], + [ + ["892154695378074136422085"], + "Moo é🚀ooM 🚀éoMo oo éMMéMoéoo🚀o 🚀" + ], + [ + ["901879116585764694543963"], + "Moo é🚀 MM 🚀 oéé🚀é 🚀oé🚀oé é o 🚀o🚀éoo éo🚀 🚀MMM🚀 " + ] + ] + ], + [ + [ + "0x0747c3b1da93154e98dca22db9b30987ed2ed20c0d806647b1288968a3c7d7", + "4146567576601627746825362586315" + ], + [ + "0x5f0f712b08bf9f443e4b1e177842f36510f49100058d3ea926cd25630247a7", + "7224863001570592521097169560835" + ], + [ + "0xa6db2d5c4a63a868f1a217950b0b308cee6bf793a070fe16729c4b62effbe8", + "10157693620079683599116916718228" + ], + [ + "0x68169af8168260dc2ecfb574beac056944f32f2f530a7ea62ed3cd1577ba6e", + "18999040883110654313566239821052" + ] + ], + "23705855955643" + ] + ] + ] + ], + "Moo é🚀Moo oMéoééooé" + ], + [ + "-602593327", + [ + "68387087619570718", + "0x19417c16c4099975c42e171f8d5afc0165a795590aa4d4053e105f", + true, + [ + "0x453Ae228c89C6ed368617E677a883F251ae61593", + false, + [true, true], + [ + "0x5fcc25a764936dfa632e9515846c730f51dece1ec0f392da926ee942bb273b", + [ + "Moo é🚀oéoM ooééo 🚀🚀 🚀oo 🚀oooo M éo🚀éoo", + "0x33152d109b1c0e4be90cd6c417d5c70d17", + [ + [ + [ + ["867959008457721706592071"], + "Moo é🚀oo éé MééMooMo🚀Méo 🚀oooo🚀MMooéoééM o🚀o🚀éo🚀oM" + ], + [ + ["83607570335716133607005"], + "Moo é🚀🚀ééMéoMéoo oMM o M éo é M o 🚀 Moo🚀é" + ], + [["487947877097455589394867"], "Moo é🚀ooMoMoo🚀"] + ] + ], + [ + [ + "0xc626c1b4c9017d322408531761b91c8d5a563a7ee1caf991a87d491105136d", + "16523666341471639949050835668816" + ], + [ + "0x9f8b3ff1ffdb11b8b7dd7966335f1086ab986d8e074ad0c64a6e9f2a2becac", + "18715586166639367550398947210310" + ], + [ + "0x59681117d865de490b4dc9624d2c8d6dc81eee44ae06a90c9c13dbb800acf1", + "11076808997132194427870041008509" + ], + [ + "0x4054712b301a4f27057b5c125287fdab406a13bbfec45fea29c6f8ca27ca28", + "16924362469328952392198222756247" + ] + ], + "229066645449592" + ] + ] + ] + ], + "Moo é🚀oooé🚀éé o🚀Moé🚀M ooo🚀MM 🚀é" + ] + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "18355222" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "57605386795259468" + }, + { + "type": "hexstring", + "value": "0x71ef38edd1de0d0fe4505a0d0ae63937d06557cd28350ca1571f3c" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x27b258FA3988A5E38dBAf403f8727441Dad93286" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x25c195eec3482605a36958b210bc1d5437bfbdd949c9515603fba77abbdd55" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀M🚀éo o🚀M🚀é o é🚀éo🚀M🚀o🚀oooéoooMoé🚀" + }, + { + "type": "hexstring", + "value": "0x38d263bc12265c652145b25a26113fcc7e" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "902109314565981353941411" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀é🚀🚀 oM🚀🚀éééé🚀🚀oéMoM ooééo🚀 oé🚀 Méoo oo oooM o🚀Méo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "100921045557741606128354" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mé MoMMo🚀éoMoMoo🚀o 🚀éé M🚀MoéMoM🚀Mé🚀oo🚀M " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "591931470670889595099545" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀 o o🚀🚀MéoM oéoéo🚀oMoM🚀M" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "476592337609322106346873" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMo🚀 🚀M ooooo o🚀o éé éMééooéooM oooo🚀🚀M é oo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "207837155718070607859987" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o o o o🚀éo🚀MMMM 🚀🚀M🚀o 🚀é🚀éoéoé é Méo🚀Méoo🚀🚀oMMooé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "245780807101999562840711" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 éMoMo o🚀MM🚀 ééMo éoooMoooMoooéé🚀🚀oo🚀ééo 🚀🚀 " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "841037729954510806441697" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "710066326581668142669341" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "910891532403756632616283" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mo oooMéooMééé🚀🚀🚀M oMéééMMooé🚀éoéo Mooo🚀M o Mooo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "95509990206409565452298" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é oo 🚀🚀🚀éoéoMM oo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "768893670727290818509096" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 é🚀o🚀o🚀 ooéMoo M MMé oéMMoM oo éé 🚀é🚀 M🚀🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1031893528898539643774826" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 éM éoé🚀M🚀M Méoooé🚀 M éo oM" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8ef7380bb72bd51844a26505a8fd0c7fc4b8e3a6b621190a3645048351c5a6" + }, + { + "type": "number", + "value": "2903159897798253948824791347977" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe4bb152090d38297f101ae13a44055271fc8fab29f0d3af2e7281571268bfa" + }, + { + "type": "number", + "value": "3905471293673782658392748267612" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x42276335c2b5dc4a14c14aff1c50b566dc75c7b1a094b3e1e2bb9b6ec63841" + }, + { + "type": "number", + "value": "9282998479400373305756046633986" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd6d90b6e348c2a6f2c2b3b68a8d9c0f3a98d9f00d489fe685e610a03cbcb72" + }, + { + "type": "number", + "value": "14167259132795680660318273273641" + } + ] + } + ] + }, + { + "type": "number", + "value": "194582415095792" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀o 🚀🚀🚀 M oéo ooééé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1518415825" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5576117797126617" + }, + { + "type": "hexstring", + "value": "0x2b5b999f8bd52f04f9f8a0369f3e05e13581bcbe71dc3e926aa6cb" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD13e497f1e5527A3C27834b0deD2b5Fd3aBeB6E5" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x92d5e795f3be6659ea34b2b398b614b9826f2953e5e3d579aa3a4a8afcbddd" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéMoM oM🚀Mo Méo🚀éoMoé éé" + }, + { + "type": "hexstring", + "value": "0xa4d9191c96565cd2c349f9c8530d0377fb" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1162095319204708183120967" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 ooééoé MM M ééo o 🚀 é 🚀Mo o éooM🚀MM 🚀oéM🚀éo Méo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "272884958764643581332538" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oM oé ééoo🚀oé🚀Moééo🚀ooééoooééé ooééoMé o 🚀 ééo MoMM éM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "791645322997087948475041" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éM" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "723278491125565320940318" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o oMééMo ooooooo🚀🚀 M" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "552043958592243750387283" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooooMMMé🚀oo🚀éoo🚀oo🚀 🚀é🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "308448460972648359403240" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀oééM o🚀 o oooé🚀 éo é🚀" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x18ea9744fff348e9c64f3338bf54fd041553be491bcfe49f0fdbe627414e4f" + }, + { + "type": "number", + "value": "17543211149938518911882444864746" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7b7d35df8b8c2ac9211017182446b42780c97cbd9f6ebaed41f7c40ee5e62c" + }, + { + "type": "number", + "value": "15221617671273916157388938414982" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd0162622470078e075a86c08146dda6fd059f9ee5b079d4bd6b5b6adb2dfcd" + }, + { + "type": "number", + "value": "12928109738491269108925831392415" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x18f6d5237f961e45ae2b6adada04ed3fdbc633a51c9beaa1816fad92a328d9" + }, + { + "type": "number", + "value": "17559319900421028608277988566636" + } + ] + } + ] + }, + { + "type": "number", + "value": "28013312150153" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oo🚀oo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "825705551" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "17491718229780352" + }, + { + "type": "hexstring", + "value": "0xa43c3be0e2ebe1219c4a9a4a17823b0445eb881d7a0a9dca7ce46b" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1F7D10a796a0B01ec3283A0efE4662CE1559fFd3" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x18863b8b339012d809b98142942d7057915e6f5b3b625e9c64b9ffd31bb8ac" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM " + }, + { + "type": "hexstring", + "value": "0x2aea2b820e8dfca5d26a675335944badcf" + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x7e5de7c2e33b38f32447900ca4420d0e255b08c343517d2504d64581feb2e6" + }, + { + "type": "number", + "value": "8286211808974415723761821562562" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6c4f2f5c1814515150ce9b74b2057cdac529c6c73269b96000196d7628df1a" + }, + { + "type": "number", + "value": "3417562814199303548836001735486" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x35fc69846197173e24beb7c054125f739dadc8525e64368dc39e86ea7df9de" + }, + { + "type": "number", + "value": "18011624044238526319942890898687" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x42f0058d747f79ab9ea3c6eebccd31062d143c2658ee554a5e991dc87dd26e" + }, + { + "type": "number", + "value": "2815035757122382850575985213136" + } + ] + } + ] + }, + { + "type": "number", + "value": "276412360348032" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o ooooMéé MéMM ooMo éoéMoé 🚀oMéMM é M oMooo🚀éé oooééM " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1589091163" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "10946574074863406" + }, + { + "type": "hexstring", + "value": "0x412af116c31a93b0d27258332e5af002ccc7dc69e661a1cec24493" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa74d366A1c62AE724e42FD89B72Ee014c65c78DF" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xcb80725b7c1cad31f47d3ee80c560b81e8a4dd2b295eb79056bf742310fc8b" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀é éMMoo éoo o 🚀oéMoM" + }, + { + "type": "hexstring", + "value": "0xa930afe6e210b3bfcd09beb8346e9bdefa" + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf582f681c34198affb98cc050e274ae77f43f9e0addbe1a1938e4623282b3a" + }, + { + "type": "number", + "value": "1573085793233808965640542414042" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfb22bdbc137f750cdbc42c8a9f571dd771e9e5738f668c1b7a5a3733b8a33b" + }, + { + "type": "number", + "value": "16611964371288393801231102109040" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3bf36e2756998fdb9e589406842585077db4effd2a919776e6b41303546e1a" + }, + { + "type": "number", + "value": "19814559038747150532004354758775" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc97d5a7d513773d4ff04089a762c02aafdc49bc58717147150315948c3f640" + }, + { + "type": "number", + "value": "10316353148491318811956024938102" + } + ] + } + ] + }, + { + "type": "number", + "value": "33295012599608" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 é oooéo ooéoo🚀oé🚀ooéM MMé ooMé🚀o o 🚀oo" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1476853243" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "60467477827986915" + }, + { + "type": "hexstring", + "value": "0x5332806576af8ec3d590461298d7f8128825a22aba5d48db506b25" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xb696E384D6829658BFB71D4B88BBBF321Ff97773" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x18729c2de78d8688c6ce47b17f62183da5d66fcc5037317ce617a5ade2f33b" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M ooo🚀o" + }, + { + "type": "hexstring", + "value": "0x26b07b89792f6dc10a054ca5f625b67eab" + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd3dab3151aaf56c3f4d62e2850a08f68bb168a0e2b6f2f239c42afb1a5dc97" + }, + { + "type": "number", + "value": "6872418091216598016862177004896" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x47c1dc43c86c201aa67a63dfe1304ce7e5133eebe45c296c6ddb64d08263b9" + }, + { + "type": "number", + "value": "10006911296464363614555990793596" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfd7546ab959bba86a811b06891a91d2650f3576f09a7e1d289b61ff5f1e377" + }, + { + "type": "number", + "value": "3801943204431408774802283769269" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf158360981592577dcb27ec15e3e3b4b93772c9dcf893cafdbce2ec1832f64" + }, + { + "type": "number", + "value": "13068490283941365693850383167407" + } + ] + } + ] + }, + { + "type": "number", + "value": "216953581947454" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooéM🚀 oééoo🚀ooo🚀 o Mé Mé oo🚀Mo M🚀Mo🚀éo🚀oMooo🚀 🚀MMoo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "747420445" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "16188566180546682" + }, + { + "type": "hexstring", + "value": "0x860b14b2e17b3fd6cd1634596166f9a76cefd3de0b605ab9512b0e" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x096563133d098C6cDB92D8af284ae57e06741593" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6bf5b4a9ebe952fa7b8f9c4af1cd5a5d36834e99aff65611ac2085e6085bd9" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMo MoooéMéo🚀M é" + }, + { + "type": "hexstring", + "value": "0xbf51bb827ad140cd939d46eeb58884c043" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "778368575929596687322604" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oooM🚀é 🚀éooooM🚀o🚀MMoéoMM🚀ooéoM🚀é o oéoé MMooé🚀 Mé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "829843186055021846451034" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M🚀éM M o 🚀é🚀éé ooéMoé MM🚀Mo🚀o🚀MMM🚀🚀 Mo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "361770595238878083926428" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "141486280541489331339031" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀oo🚀é oé ééo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "259028910893327677202134" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 o oé🚀oMMMo🚀🚀 🚀oMoéMoMo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1133757143313620214830831" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o éo éMé🚀o M🚀o🚀oM MMoMM o éo éo🚀🚀oMM 🚀🚀ooMéoMo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "601096245887659086830207" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mooo🚀 éooMoé🚀éo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1098442981598804116546650" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oM🚀🚀éoMMM🚀🚀oooéoooMéMo🚀oMéMoé🚀oMo🚀 éo🚀 ooo 🚀éoé🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "341624200395660190621777" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oé🚀M🚀ooéééMo ooMéM🚀oo🚀Moo M🚀🚀🚀o🚀oo 🚀oMo🚀é o M🚀" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc28f97501f7791652fb45bb3d9976991bedac8ddf291eade2581dcc10dcf62" + }, + { + "type": "number", + "value": "7046739415477862561695982978854" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4d41991d972b7c188164e117804b6339c4e0347122b0189b8503ef38892b28" + }, + { + "type": "number", + "value": "20246486506681101723782299644808" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xbd58cef4a779fd62899c2c85e99373c3b7e387394dc1a389e38c9a68866e5b" + }, + { + "type": "number", + "value": "2405135291133471726241251808659" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd8690ec22dfafe6dc7c6ba7e040bbca489b51c01b046eb15613743edd44e64" + }, + { + "type": "number", + "value": "12233201482784658931643004358966" + } + ] + } + ] + }, + { + "type": "number", + "value": "93747656736920" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooo🚀 M🚀oMMé 🚀M🚀éo🚀oo ooM é🚀oooéé éééooéo🚀o🚀ooéo o o o🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "918624151" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "56486694906339737" + }, + { + "type": "hexstring", + "value": "0x0ce34271c85d1f7ad57d1f3565af13198555b24f5c469c7c8d1670" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x52381eb8042518cfCD935a58DeC4334c3F97489E" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb547c7cfcd6b78f66b4eecfdea431273018a3671ef8d68065a8edc201c233b" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooéo o🚀MéoMMé 🚀oé🚀🚀o M éooéMé éoééoé" + }, + { + "type": "hexstring", + "value": "0x3f68e27ce7b2ad3ef0f90b12fef74c3aa3" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "649705950308356913956615" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éooooo🚀oéMMoo éo é ééééo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "58468454581933630711541" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 Mooooéooéé🚀o🚀o oM Moo🚀Mo ééoo oéoooo🚀ooé🚀 ooM " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "469311536106426346369599" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oM 🚀Moo MMMé oo oo🚀oo🚀oMMé M ooééoéMo é o" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "183883345857417564092205" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mé🚀oM🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "706959299831709797717431" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "127672568362815957964762" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éMo🚀ééoéMéo🚀o🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "530031133160340027734252" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "836123641572017954708367" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀 🚀🚀o Mo🚀MééoMéoM🚀o🚀MéoooM🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "404840947105315220766498" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oé o🚀oo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "512886782297741481563198" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooMé🚀ooo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "130508694331430248070448" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mé 🚀oMéM🚀🚀oMéo oM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "484957477470614903403427" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀éoé" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe7ece7ae291cd0458a033985ada4c2fec400224a751c41f6447cf13301a401" + }, + { + "type": "number", + "value": "12927771394155598973762112288802" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x255a667a600e5ee772487aa83888580271ad9d46ee529c5a50f6f3acb0b16f" + }, + { + "type": "number", + "value": "17266090260360266537560743786226" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0db78f003a4145bebf8fbd7fce49fb124592f6c0e551fdc45bb4aa2fd837c9" + }, + { + "type": "number", + "value": "8454111238309761354615382142430" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6c94b1caf5cae510639dc473a027026fecb07fee48304a13c1fe99817356cb" + }, + { + "type": "number", + "value": "5598719154263456989403668378468" + } + ] + } + ] + }, + { + "type": "number", + "value": "207026167236643" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀Méooé o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-1914892012" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "20299934080799188" + }, + { + "type": "hexstring", + "value": "0x1d2e9d46924e4f5913d7830e45246d546111b393349a7e51408075" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE197Af46E9E37C4a6895Ca782651DA6377E279BF" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa188b35c1d88ceb6ee0784da9e16e8e808c8c736520c4e4bb31de59d598f32" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o oé" + }, + { + "type": "hexstring", + "value": "0x61a2d25a7d1a2179e68e410932c51efb9b" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "954032285101724101324237" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "196730564305282248666853" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀o éoMM " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "603667938580924110880859" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 oéo éé 🚀oo " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1099728774289268466661399" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éo 🚀oMoéé o oMooooM🚀éé🚀🚀éo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "959612613096905308760943" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀M Moooé🚀 oo M o oo 🚀o oé M" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1025002190457938415535849" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀Moo oé🚀oMo 🚀M oMMoMo MéM🚀o" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x12dcb1bc894edcec544c35af28d5be0a590a40830edd501c8c715faeb812d9" + }, + { + "type": "number", + "value": "6995212533981106046433128563926" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8d9fbe397650464e7b601019a91d2728b4cadbbcbbe79d21bfeb1f71b5336c" + }, + { + "type": "number", + "value": "8597070187493096549654997007129" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xcc1e1fdc69738faa5d6621e6570f96ea5455879d84e6aced6eb8f4a98532b8" + }, + { + "type": "number", + "value": "9129996001931131645523743293902" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb8b96fd6a9e1bd59acb7c0b76803b3ebc93ddd50715a5c7600ce89852e0ed0" + }, + { + "type": "number", + "value": "4242684607374094016047792180447" + } + ] + } + ] + }, + { + "type": "number", + "value": "86381324625382" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 ooéo🚀🚀ooM" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "450086051" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1862667065203480" + }, + { + "type": "hexstring", + "value": "0xe8132e5855fcb7e84a8c0cb2d9cd67b7931a9d2c93bf826c2b77b5" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xa322764125e3A508d77E0ba42C154C12E193BD5e" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xde240c049f7da90a7ecb9156c990f89bdceb476917fd3322998d3bec8e0c5b" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M M🚀oooMMM🚀" + }, + { + "type": "hexstring", + "value": "0x617345c7fbe4523b00537142e2f8705b9a" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1025559340071980978979119" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMoMéoéoMo oéMo oM ooooMMoMé MM ooMMéé🚀o o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "199996398625034076461454" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀🚀MM ééé o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "135884599882127575401329" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀o" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "515288475754605993331757" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMoo ééoMM " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "731268341141024115374595" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ééMo🚀 🚀o 🚀ooo🚀o o🚀🚀MM 🚀o🚀 ooéo🚀🚀éMooooéoo🚀Mo🚀🚀 🚀🚀🚀oMoo🚀é" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "398545296696103799871368" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀 oo M oé🚀o " + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "881339986468801126955473" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Moé🚀éo M éMM🚀ooMM🚀 oooM🚀oMooo🚀🚀éMMM🚀🚀 o🚀MMoM🚀 Mo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "655244207891843442155449" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oooéoo🚀é🚀MMMoo 🚀é🚀ééoéé éMé o éMMMooo🚀oooMMooééMo é o🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "160788531032816849381164" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooM🚀oM o oéoé🚀oéo🚀M 🚀o🚀🚀🚀é🚀 éM oéo M M🚀oé 🚀🚀🚀Mé🚀 o o" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "62361039763499843442233" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀🚀MoéooMéééééé é🚀 o🚀oo 🚀éM🚀éoM M o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "959406524645207881940115" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o éoM 🚀 éMoMMo🚀MoMM🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "146539970214223232055320" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oéooMo🚀 🚀 Mé🚀ooMoooo🚀🚀MéooéoéoMooooooMooo" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x85d89f6f7782bc2075891a6d05add5f17d67133c2f7dfd884628f5b9135b5f" + }, + { + "type": "number", + "value": "8152652264041231856031820014334" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0fb8607251804ff82b5b152a4bae09bd636adc9ad4063a6d6ca2cab2560537" + }, + { + "type": "number", + "value": "16416864780937006238066005305072" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x3ccbe135ae880f89c39361f314bffdf7a5c2aa5a2dedae7c3a6caa34848236" + }, + { + "type": "number", + "value": "17480310804968673507446811182722" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfa0b99564ab5bb7c3cf61146ccf566c56f9a5a7aa6f2c2bda64b15303e1713" + }, + { + "type": "number", + "value": "19557527284622991208475854982546" + } + ] + } + ] + }, + { + "type": "number", + "value": "83317973902405" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oooé oM oé🚀o🚀MéMo M🚀ooM🚀o MM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "700510769" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "42507258221890211" + }, + { + "type": "hexstring", + "value": "0x00ccca1671adbde8393212111aa00d5c0e5d7b5453b136a72d0b04" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xA0cf4B6227A6214dCDFAD8F3b9a2b2159342c967" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xba32bcbcc576d6084f8da91ef59fabc42d2c32870f8f89e74d76849b23de8e" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o🚀 MMéo Mooo🚀éo 🚀 é oéo🚀éMéMéMéM🚀Mooo 🚀o" + }, + { + "type": "hexstring", + "value": "0xe64be12210d44d8c9af2b28b479fdda6e7" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "998904477997770689783828" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooo éoMo o 🚀éMo🚀M🚀oMoé ooéo🚀éMé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "672234829220922730895350" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oooéo🚀ooé 🚀o🚀M🚀o🚀o oMoMéé🚀éooéoM oM🚀MooéM🚀o é🚀éMo🚀Mo éo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "565572148567774672239845" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éo🚀ooMooé oooM ooMMoéMéMé oMM MMMMéoMoMéoMo" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xdf5e535bdb2251e7b882f04e2c196d209e69bf0727fbcafe195e4536825a1b" + }, + { + "type": "number", + "value": "6878548423508897219270706061599" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x221da0d5340ce979deba370153b25c5ad15c51438f37375ab06c759b7a9f48" + }, + { + "type": "number", + "value": "15516337744500600307057943997971" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x814565cb98266cee7971f06826107017acb8ea548cde76f1a84d2ab364ad66" + }, + { + "type": "number", + "value": "9082912372448664233971398161464" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x57119d2a41f20ade5aa366907021ca01c8dabdc944aa24f0a17f237bbc063d" + }, + { + "type": "number", + "value": "12403548110132185946652650413082" + } + ] + } + ] + }, + { + "type": "number", + "value": "6402288773077" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀🚀ooM🚀oo🚀éé🚀🚀oéoM 🚀Mo🚀🚀🚀🚀🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "379366848" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "4777727319079755" + }, + { + "type": "hexstring", + "value": "0x8f000774670384e84ff808431f60951061811e1da8808f4b881570" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9B867Cfd32926770310F8dc48F2a5761F8CeDb0B" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x46011da7fb6d10b847738342476d67cdafa19c63bef70301d8e60a8212c84c" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀o🚀🚀oé MM🚀 éoMoM🚀🚀éooo🚀o🚀oo🚀oM🚀éoé oMMM éooé🚀éo🚀" + }, + { + "type": "hexstring", + "value": "0xfdfac1c8007af04108c1865d6c50fa1249" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "57362128525397904213373" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éo🚀 éoéMMMéo é ééM🚀🚀🚀ooé🚀Mo🚀🚀MéMé🚀Mo oéMéo MMooo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "892154695378074136422085" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooM 🚀éoMo oo éMMéMoéoo🚀o 🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "901879116585764694543963" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 MM 🚀 oéé🚀é 🚀oé🚀oé é o 🚀o🚀éoo éo🚀 🚀MMM🚀 " + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0747c3b1da93154e98dca22db9b30987ed2ed20c0d806647b1288968a3c7d7" + }, + { + "type": "number", + "value": "4146567576601627746825362586315" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5f0f712b08bf9f443e4b1e177842f36510f49100058d3ea926cd25630247a7" + }, + { + "type": "number", + "value": "7224863001570592521097169560835" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa6db2d5c4a63a868f1a217950b0b308cee6bf793a070fe16729c4b62effbe8" + }, + { + "type": "number", + "value": "10157693620079683599116916718228" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x68169af8168260dc2ecfb574beac056944f32f2f530a7ea62ed3cd1577ba6e" + }, + { + "type": "number", + "value": "18999040883110654313566239821052" + } + ] + } + ] + }, + { + "type": "number", + "value": "23705855955643" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Moo oMéoééooé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-602593327" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "68387087619570718" + }, + { + "type": "hexstring", + "value": "0x19417c16c4099975c42e171f8d5afc0165a795590aa4d4053e105f" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x453Ae228c89C6ed368617E677a883F251ae61593" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5fcc25a764936dfa632e9515846c730f51dece1ec0f392da926ee942bb273b" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéoM ooééo 🚀🚀 🚀oo 🚀oooo M éo🚀éoo" + }, + { + "type": "hexstring", + "value": "0x33152d109b1c0e4be90cd6c417d5c70d17" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "867959008457721706592071" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo éé MééMooMo🚀Méo 🚀oooo🚀MMooéoééM o🚀o🚀éo🚀oM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "83607570335716133607005" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀ééMéoMéoo oMM o M éo é M o 🚀 Moo🚀é" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "487947877097455589394867" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooMoMoo🚀" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc626c1b4c9017d322408531761b91c8d5a563a7ee1caf991a87d491105136d" + }, + { + "type": "number", + "value": "16523666341471639949050835668816" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9f8b3ff1ffdb11b8b7dd7966335f1086ab986d8e074ad0c64a6e9f2a2becac" + }, + { + "type": "number", + "value": "18715586166639367550398947210310" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x59681117d865de490b4dc9624d2c8d6dc81eee44ae06a90c9c13dbb800acf1" + }, + { + "type": "number", + "value": "11076808997132194427870041008509" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4054712b301a4f27057b5c125287fdab406a13bbfec45fea29c6f8ca27ca28" + }, + { + "type": "number", + "value": "16924362469328952392198222756247" + } + ] + } + ] + }, + { + "type": "number", + "value": "229066645449592" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oooé🚀éé o🚀Moé🚀M ooo🚀MM 🚀é" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50614e72806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906139a1565b60405180910390f35b61005661371a565b61005e61371a565b610066613747565b61006e613774565b6100766137a1565b630118141681526100856137cb565b66cca7cb4914964c81527f71ef38edd1de0d0fe4505a0d0ae63937d06557cd28350ca1571f3c00000000006020820152600160408201526100c46137f9565b7327b258fa3988a5e38dbaf403f8727441dad932868152600160208083018290526040805180820182526000928101929092529181529082015261010661382f565b7f25c195eec3482605a36958b210bc1d5437bfbdd949c9515603fba77abbdd55008152610131613845565b60006040518060800160405280604e8152602001614be7604e9139825250701c6931de09132e3290a2d92d13089fe63f60791b602082015260408051600480825260a08201909252600091816020015b61018961388c565b8152602001906001900390816101815790505090506101a661388c565b6101ae6138b9565b604080516020808201835269bf0771a5a1c4965a19a38252908352815160a08101909252606b80835260009291614a589083013960208301525081526101f26138b9565b604080516020808201835269155ef0db08267a77cae28252908352815160808101909252604e808352600092916144c6908301396020830152508082600160200201525061023e6138b9565b6040805160208082018352697d58ab58c3d4e07ad9998252908352815160608101909252603580835260009291613e8490830139602083015250604082015281518190839060009061029257610292613c3b565b6020026020010181905250506102a661388c565b6102ae6138b9565b60408051602080820183526964ec1f550940cdc25d798252908352815160808101909252604e80835260009291613fb99083013960208301525081526102f26138b9565b6040805160208082018352692c02dff21523e904d1138252908352815160a08101909252606280835260009291614291908301396020830152508082600160200201525061033e6138b9565b604080516020808201835269340bcde360be21435a8782529083528151608081019092526058808352600092916141eb908301396020830152506040820152815181908390600190811061039457610394613c3b565b6020026020010181905250506103a861388c565b6103b06138b9565b604080516020808201835269b218bf2798c223e3dee182529083528151808301909252600a8252689adede418753e13f3560b71b8282015282015281526103f56138b9565b604080516020808201835269965cc5cf4d6497545e1d82529083528151808301909252600c82526b4d6f6f20c3a9f09f9a80c3a960a01b82820152828101919091528201526104426138b9565b604080516020808201835269c0e38767130a4cf7ad5b82529083528151608081019092526054808352600092916145b7908301396020830152506040820152815181908390600290811061049857610498613c3b565b6020026020010181905250506104ac61388c565b6104b46138b9565b60408051602080820183526914399b60ab1d1faab80a825290835281516060810190925260278083526000929161467f9083013960208301525081526104f86138b9565b604080516020808201835269a2d1cf3589359e39b928825290835281516080810190925260538083526000929161480390830139602083015250808260016020020152506105446138b9565b604080516020808201835269da830f6f2efde7e4a76a8252908352815160608101909252603480835260009291614492908301396020830152506040820152815181908390600390811061059a5761059a613c3b565b60209081029190910101525060408201526105b36138d3565b6040805180820182527f8ef7380bb72bd51844a26505a8fd0c7fc4b8e3a6b621190a3645048351c5a60081526c24a49d9525487915b30428f309602080830191909152908352815180830183527fe4bb152090d38297f101ae13a44055271fc8fab29f0d3af2e7281571268bfa0081526c314b4223130b5febae5241185c8183015283820152815180830183527f42276335c2b5dc4a14c14aff1c50b566dc75c7b1a094b3e1e2bb9b6ec638410081526c752afc5e5746a464420564ac028183015283830152815180830183527fd6d90b6e348c2a6f2c2b3b68a8d9c0f3a98d9f00d489fe685e610a03cbcb720081526cb2d0e216711be929d85c6dff29818301526060808501919091528481019390935265b0f8bfbb37f060808501528481019390935284820193909352848101939093528481019390935280519182019052602d808252600092613f8c9083013960408301525081526107136137a1565b635a812fd181526107226137cb565b6613cf73188601d981527f2b5b999f8bd52f04f9f8a0369f3e05e13581bcbe71dc3e926aa6cb00000000006020820152600160408201526107616137f9565b73d13e497f1e5527a3c27834b0ded2b5fd3abeb6e5815260016020808301919091526040805180820182526000808252928101929092528201526107a361382f565b7f92d5e795f3be6659ea34b2b398b614b9826f2953e5e3d579aa3a4a8afcbddd0081526107ce613845565b60006040518060600160405280602f8152602001614dd6602f913982525070a4d9191c96565cd2c349f9c8530d0377fb60781b602082015260408051600280825260608201909252600091816020015b61082661388c565b81526020019060019003908161081e57905050905061084361388c565b61084b6138b9565b604080516020808201835269f61550409bcd4a3f1c478252908352815160808101909252605a8083526000929161451490830139602083015250815261088f6138b9565b60408051602080820183526939c91f8dbdf7a32e8c3a8252908352815160808101909252605d808352600092916148b590830139602083015250808260016020020152506108db6138b9565b604080516020808201835269a7a32dcfc52b81fb8aa1825290835281518083018352600d81526c4d6f6f20c3a9f09f9a80c3a94d60981b818301529083015282015281518190839060009061093257610932613c3b565b60200260200101819052505061094661388c565b61094e6138b9565b6040805160208082018352699929016d010501894b1e8252908352815160608101909252602680835260009291614c359083013960208301525081526109926138b9565b60408051602080820183526974e65ceafd6643fbbe538252908352815160608101909252603780835260009291613db090830139602083015250808260016020020152506109de6138b9565b6040805160208082018352694151064a80a334221ee882529083528151606081019092526034808352600092916149859083013960208301525060408201528151819083906001908110610a3457610a34613c3b565b6020908102919091010152506040820152610a4d6138d3565b6040805180820182527f18ea9744fff348e9c64f3338bf54fd041553be491bcfe49f0fdbe627414e4f0081526cdd6d2c2528c369d3a38962fcea602080830191909152908352815180830183527f7b7d35df8b8c2ac9211017182446b42780c97cbd9f6ebaed41f7c40ee5e62c0081526cc01fb30784f23cb589a60a0b868183015283820152815180830183527fd0162622470078e075a86c08146dda6fd059f9ee5b079d4bd6b5b6adb2dfcd0081526ca32cf9bb8e297ab513cd1d2c9f8183015283830152815180830183527f18f6d5237f961e45ae2b6adada04ed3fdbc633a51c9beaa1816fad92a328d90081526cdda138fdc238b631d13018e66c818301526060808501919091528481019390935265197a5b850a8960808501528481019390935284820193909352840192909252838201929092528151808301835260168152754d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806f6f60501b8183015291830191909152820152610bc16137a1565b633137444f8152610bd06137cb565b663e24a00398e78081527fa43c3be0e2ebe1219c4a9a4a17823b0445eb881d7a0a9dca7ce46b0000000000602082015260016040820152610c0f6137f9565b731f7d10a796a0b01ec3283a0efe4662ce1559ffd3815260006020808301829052604080518082018252928352600191830191909152820152610c5061382f565b7f18863b8b339012d809b98142942d7057915e6f5b3b625e9c64b9ffd31bb8ac008152610c7b613845565b604080518082018252600d81526c026b7b79061d4f84fcd4026a69609d1b602080830191909152908352702aea2b820e8dfca5d26a675335944badcf60781b83820152815160008082529181019092529081610ced565b610cda61388c565b815260200190600190039081610cd25790505b50604083015250610cfc6138d3565b6040805180820182527f7e5de7c2e33b38f32447900ca4420d0e255b08c343517d2504d64581feb2e60081526c689631c288415225d5768836c2602080830191909152908352815180830183527f6c4f2f5c1814515150ce9b74b2057cdac529c6c73269b96000196d7628df1a0081526c2b22bdb3bc07288b7ff759e33e8183015283820152815180830183527f35fc69846197173e24beb7c054125f739dadc8525e64368dc39e86ea7df9de0081526ce356b235c1c7235689dcaf44ff8183015283830152815180830183527f42f0058d747f79ab9ea3c6eebccd31062d143c2658ee554a5e991dc87dd26e0081526c2387df007ed2be3683376efed0818301526060808501919091528481019390935265fb65448cd1806080808601919091528582019490945285830194909452908501939093528482019390935281519283019091526054808352600092916143819083013960408301525080826002602002015250610e6a6137a1565b635eb79b5a198152610e7a6137cb565b6626e3d9e33d5f2e81527f412af116c31a93b0d27258332e5af002ccc7dc69e661a1cec244930000000000602082015260016040820152610eb96137f9565b73a74d366a1c62ae724e42fd89b72ee014c65c78df815260006020808301829052604080518082018252918201929092526001815290820152610efa61382f565b7fcb80725b7c1cad31f47d3ee80c560b81e8a4dd2b295eb79056bf742310fc8b008152610f25613845565b6000604051806060016040528060258152602001613f346025913982525070549857f3710859dfe684df5c1a374def7d60791b60208083019190915260408051600080825292810190915281610f91565b610f7e61388c565b815260200190600190039081610f765790505b50604083015250610fa06138d3565b6040805180820182527ff582f681c34198affb98cc050e274ae77f43f9e0addbe1a1938e4623282b3a0081526c13daea11ee82499a8cbcaae4da602080830191909152908352815180830183527ffb22bdbc137f750cdbc42c8a9f571dd771e9e5738f668c1b7a5a3733b8a33b0081526cd1ac26dd4622380ed40a53e5708183015283820152815180830183527f3bf36e2756998fdb9e589406842585077db4effd2a919776e6b41303546e1a0081526cfa184b154898f29a96f27098778183015283830152815180830183527fc97d5a7d513773d4ff04089a762c02aafdc49bc58717147150315948c3f6400081526c8235ef5112191bb0bf8f4f8e768183015260608085019190915284810193909352651e4819661738608080860191909152858201949094528583019490945290850193909352848201939093528151928301909152604480835260009291613c529083013960408301525060608201528152815261110d613747565b611115613774565b61111d6137a1565b635806fdfb815261112c6137cb565b66d6d2d9c866a5e381527f5332806576af8ec3d590461298d7f8128825a22aba5d48db506b25000000000060208201526000604082015261116b6137f9565b73b696e384d6829658bfb71d4b88bbbf321ff977738152600060208083018290526040805180820182529283526001918301919091528201526111ac61382f565b7f18729c2de78d8688c6ce47b17f62183da5d66fcc5037317ce617a5ade2f33b0081526111d7613845565b60408051808201825260148152734d6f6f20c3a9f09f9a804d206f6f6ff09f9a806f60601b6020808301919091529083527026b07b89792f6dc10a054ca5f625b67eab60781b83820152815160008082529181019092529081611250565b61123d61388c565b8152602001906001900390816112355790505b5060408301525061125f6138d3565b6040805180820182527fd3dab3151aaf56c3f4d62e2850a08f68bb168a0e2b6f2f239c42afb1a5dc970081526c56bdfb01a44934810af1010d60602080830191909152908352815180830183527f47c1dc43c86c201aa67a63dfe1304ce7e5133eebe45c296c6ddb64d08263b90081526c7e4e130416d1e7721fca3e1d7c8183015283820152815180830183527ffd7546ab959bba86a811b06891a91d2650f3576f09a7e1d289b61ff5f1e3770081526c2ffcbdb56f8d3b3c4d431d2db58183015283830152815180830183527ff158360981592577dcb27ec15e3e3b4b93772c9dcf893cafdbce2ec1832f640081526ca4f291cc57bf2c44a300162faf818301526060808501919091528481019390935265c551712f4a3e608080860191909152858201949094528583019490945285820194909452858301949094528251908101909252828252600092906140de9083013960408301525081526113c36137a1565b632c8cbb1d81526113d26137cb565b6639836a489d487a81527f860b14b2e17b3fd6cd1634596166f9a76cefd3de0b605ab9512b0e00000000006020820152600160408201526114116137f9565b73096563133d098c6cdb92d8af284ae57e067415938152600160208083018290526040805180820182526000928101929092529181529082015261145361382f565b7f6bf5b4a9ebe952fa7b8f9c4af1cd5a5d36834e99aff65611ac2085e6085bd900815261147e613845565b60006040518060600160405280602181526020016149646021913982525070bf51bb827ad140cd939d46eeb58884c04360781b602082015260408051600380825260808201909252600091816020015b6114d661388c565b8152602001906001900390816114ce5790505090506114f361388c565b6114fb6138b9565b604080516020808201835269a4d371eeda81e42e8dec8252908352815160808101909252605e80835260009291614c9890830139602083015250815261153f6138b9565b604080516020808201835269afb9e3a65b68a041d35a8252908352815160808101909252604e80835260009291614243908301396020830152508082600160200201525061158b6138b9565b6040805160208082018352694c9b9f8e4aff8719c99c825290835281518083018352600f81526d9adede418753e13f350041e13f35608f1b81830152908301528201528151819083906000906115e3576115e3613c3b565b6020026020010181905250506115f761388c565b6115ff6138b9565b6040805160208082018352691df5fc943e0aee527f178252908352815160608101909252602180835260009291614cf69083013960208301525081526116436138b9565b60408051602080820183526936d9fc42ef7e53491ed68252908352815160608101909252603380835260009291613f59908301396020830152508082600160200201525061168f6138b9565b604080516020808201835269f015190f7cf2b53556ef8252908352815160808101909252605780835260009291613c9690830139602083015250604082015281518190839060019081106116e5576116e5613c3b565b6020026020010181905250506116f961388c565b6117016138b9565b6040805160208082018352697f497e270a6c59a5da7f8252908352815160608101909252602280835260009291613d8e9083013960208301525081526117456138b9565b604080516020808201835269e89ab69e1bc53c38a45a8252908352815160a08101909252606380835260009291614d7390830139602083015250808260016020020152506117916138b9565b60408051602080820183526948577c29c1441b1120518252908352815160a0810190925260638083526000929161475f90830139602083015250604082015281518190839060029081106117e7576117e7613c3b565b60209081029190910101525060408201526118006138d3565b6040805180820182527fc28f97501f7791652fb45bb3d9976991bedac8ddf291eade2581dcc10dcf620081526c58f13e39e80440ae1edba08726602080830191909152908352815180830183527f4d41991d972b7c188164e117804b6339c4e0347122b0189b8503ef38892b280081526cff8bed1c531ae7be339c71f3888183015283820152815180830183527fbd58cef4a779fd62899c2c85e99373c3b7e387394dc1a389e38c9a68866e5b0081526c1e5b69488c6c5e2945d6df55938183015283830152815180830183527fd8690ec22dfafe6dc7c6ba7e040bbca489b51c01b046eb15613743edd44e640081526c9a679b189466ac7891ed0a1136818301526060808501919091528481019390935265554353c740986080850152848101939093528482019390935284019290925283820192909252815160a081019092526068808352600092916146d09083013960408301525060208201526119656137a1565b6336c1179781526119746137cb565b66c8ae59886da19981527f0ce34271c85d1f7ad57d1f3565af13198555b24f5c469c7c8d167000000000006020820152600160408201526119b36137f9565b7352381eb8042518cfcd935a58dec4334c3f97489e815260016020808301919091526040805180820182526000808252928101929092528201526119f561382f565b7fb547c7cfcd6b78f66b4eecfdea431273018a3671ef8d68065a8edc201c233b008152611a20613845565b600060405180608001604052806049815260200161456e60499139825250703f68e27ce7b2ad3ef0f90b12fef74c3aa360781b602082015260408051600480825260a08201909252600091816020015b611a7861388c565b815260200190600190039081611a70579050509050611a9561388c565b611a9d6138b9565b6040805160208082018352698994a150dbcbc6f507078252908352815160608101909252602f80835260009291614038908301396020830152508152611ae16138b9565b6040805160208082018352690c6194ce5f1ea66e66f5825290835281516080810190925260528083526000929161460b9083013960208301525080826001602002015250611b2d6138b9565b60408051602080820183526963616de9f1b585c9f23f82529083528151608081019092526046808352600092916143d5908301396020830152506040820152815181908390600090611b8157611b81613c3b565b602002602001018190525050611b9561388c565b611b9d6138b9565b60408051602080820183526926f0560e2199a723772d8252908352815180830190925260178252759adede418753e13f35009b8753e13f3500de9be13f35604f1b828201528201528152611bef6138b9565b60408051602080820183526995b45726de09ffc015b782529083528151808301909252600a8252689adede418753e13f3560b71b8282015282810191909152820152611c396138b9565b6040805160208082018352691b0924d007b91c9717da825290835281516060810190925260268083526000929161441b9083013960208301525060408201528151819083906001908110611c8f57611c8f613c3b565b602002602001018190525050611ca361388c565b611cab6138b9565b604080516020808201835269703d0b98f807d9e1f8ec82529083528151808301909252600a8252689adede418753e13f3560b71b828201528201528152611cf06138b9565b604080516020808201835269b10e5a7a94d653915b8f825290835281516080810190925260438083526000929161413e9083013960208301525080826001602002015250611d3c6138b9565b60408051602080820183526955ba78c28504bb3e3f2282529083528151808301835260158152744d6f6f20c3a9f09f9a806fc3a9206ff09f9a806f6f60581b81830152908301528201528151819083906002908110611d9d57611d9d613c3b565b602002602001018190525050611db161388c565b611db96138b9565b6040805160208082018352696c9ba5ef252941b1543e8252908352815180830190925260168252754d6f6f20c3a9f09f9a806f6f4dc3a9f09f9a806f6f6f60501b828201528201528152611e0b6138b9565b6040805160208082018352691ba2e3f78dbd08033d3082529083528151606081019092526027808352600092916147389083013960208301525080826001602002015250611e576138b9565b60408051602080820183526966b198f7d8b03f5533a382529083528151808301835260138152724d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a960681b81830152908301528201528151819083906003908110611eb657611eb6613c3b565b6020908102919091010152506040820152611ecf6138d3565b6040805180820182527fe7ece7ae291cd0458a033985ada4c2fec400224a751c41f6447cf13301a4010081526ca32be1dc5af912bff887477822602080830191909152908352815180830183527f255a667a600e5ee772487aa83888580271ad9d46ee529c5a50f6f3acb0b16f0081526cd9edbf1e32aba56f7b3c8eb6f28183015283820152815180830183527f0db78f003a4145bebf8fbd7fce49fb124592f6c0e551fdc45bb4aa2fd837c90081526c6ab4b4e9a67a62ab296968edde8183015283830152815180830183527f6c94b1caf5cae510639dc473a027026fecb07fee48304a13c1fe99817356cb0081526c46aa6ff0856eab8c4a42c17364818301526060808501919091528481019390935265bc4a09284823608085015284810193909352848201939093528401929092528382019290925281518083018352601881527f4d6f6f20c3a9f09f9a806ff09f9a804dc3a96f6fc3a9206f0000000000000000918101919091528282015282015261204a6137a1565b637222eeeb19815261205a6137cb565b66481eaeb7d991d481527f1d2e9d46924e4f5913d7830e45246d546111b393349a7e5140807500000000006020820152600060408201526120996137f9565b73e197af46e9e37c4a6895ca782651da6377e279bf8152600060208083018290526040805180820182529182019290925260018152908201526120da61382f565b7fa188b35c1d88ceb6ee0784da9e16e8e808c8c736520c4e4bb31de59d598f32008152612105613845565b604080518082018252601081526f4d6f6f20c3a9f09f9a80206f206fc3a960801b6020808301919091529083527061a2d25a7d1a2179e68e410932c51efb9b60781b908301528051600280825260608201909252600091816020015b61216961388c565b81526020019060019003908161216157905050905061218661388c565b61218e6138b9565b604080516020808201835269ca06319d4c567aa92dcd82529083528151808301909252600a8252689adede418753e13f3560b71b8282015282015281526121d36138b9565b60408051602080820183526929a8c906d873daf6eee582529083528151808301909252601782527f4d6f6f20c3a9f09f9a806ff09f9a806f20c3a96f4d4d2000000000000000000082820152828101919091528201526122316138b9565b6040805160208082018352697fd4e78ed9893302405b825290835281518083018352601c81527f4d6f6f20c3a9f09f9a80206fc3a96f20c3a9c3a920f09f9a806f6f2000000000818301529083015282015281518190839060009061229857612298613c3b565b6020026020010181905250506122ac61388c565b6122b46138b9565b604080516020808201835269e8e06a9363537d9a381782529083528151606081019092526037808352600092916142f39083013960208301525081526122f86138b9565b604080516020808201835269cb34b438e61c3a41eb6f82529083528151606081019092526032808352600092916149b990830139602083015250808260016020020152506123446138b9565b604080516020808201835269d90d7ae6d724115146e98252908352815160608101909252603480835260009291613de7908301396020830152506040820152815181908390600190811061239a5761239a613c3b565b60209081029190910101525060408201526123b36138d3565b6040805180820182527f12dcb1bc894edcec544c35af28d5be0a590a40830edd501c8c715faeb812d90081526c584ac0305501dd6114c9a744d6602080830191909152908352815180830183527f8d9fbe397650464e7b601019a91d2728b4cadbbcbbe79d21bfeb1f71b5336c0081526c6c82a1c8aa84d7513e59bc7b198183015283820152815180830183527fcc1e1fdc69738faa5d6621e6570f96ea5455879d84e6aced6eb8f4a98532b80081526c733c9baf7be298187b324941ce8183015283830152815180830183527fb8b96fd6a9e1bd59acb7c0b76803b3ebc93ddd50715a5c7600ce89852e0ed00081526c358cda73d04a4471e0d14eccdf8183015260608085019190915284810193909352654e90382b65e660808501528481019390935284820193909352848101939093528481019390935280518082018252601b81527f4d6f6f20c3a9f09f9a80206f6fc3a96ff09f9a80f09f9a806f6f4d00000000008185015290840152830191909152908252820152612535613747565b61253d613774565b6125456137a1565b631ad3c4a381526125546137cb565b66069e15f8c19b1881527fe8132e5855fcb7e84a8c0cb2d9cd67b7931a9d2c93bf826c2b77b500000000006020820152600060408201526125936137f9565b73a322764125e3a508d77e0ba42c154c12e193bd5e815260016020808301919091526040805180820182526000808252928101929092528201526125d561382f565b7fde240c049f7da90a7ecb9156c990f89bdceb476917fd3322998d3bec8e0c5b008152612600613845565b604080518082018252601c81527f4d6f6f20c3a9f09f9a80204d204df09f9a806f6f6f4d4d4df09f9a80000000006020808301919091529083527030b9a2e3fdf2291d8029b8a1717c382dcd60791b908301528051600480825260a08201909252600091816020015b61267161388c565b81526020019060019003908161266957905050905061268e61388c565b6126966138b9565b604080516020808201835269d92baee7e5351a4cc12f8252908352815160608101909252603d80835260009291614c5b9083013960208301525081526126da6138b9565b6040805160208082018352692a59d3951b229224998e825290835281516060810190925260228083526000929161465d90830139602083015250808260016020020152506127266138b9565b6040805160208082018352691cc651a4bd544cecc371825290835281518083018352601081526f4d6f6f20c3a9f09f9a806ff09f9a806f60801b818301529083015282015281518190839060009061278057612780613c3b565b60200260200101819052505061279461388c565b61279c6138b9565b6040805160208082018352696d1dd82057764edd0c2d82529083528151808301909252601782527f4d6f6f20c3a9f09f9a806f4d6f6f20c3a9c3a96f4d4d200000000000000000008282015282015281526127f56138b9565b6040805160208082018352699ada22de720a2845ba038252908352815160a08101909252607b80835260009291613eb990830139602083015250808260016020020152506128416138b9565b60408051602080820183526954652f0f31a049dfd788825290835281518083018352601f81527f4d6f6f20c3a9f09f9a804d6ff09f9a80206f6f204d206fc3a9f09f9a806f2000818301529083015282015281518190839060019081106128aa576128aa613c3b565b6020026020010181905250506128be61388c565b6128c66138b9565b604080516020808201835269baa1895199ffb73979d18252908352815160808101909252605c80835260009291614d1790830139602083015250815261290a6138b9565b6040805160208082018352698ac0dc145507dec21fb98252908352815160a08101909252606380835260009291613ced90830139602083015250808260016020020152506129566138b9565b604080516020808201835269220c5d1d9832f031e72c8252908352815160a08101909252606d808352600092916149eb90830139602083015250604082015281518190839060029081106129ac576129ac613c3b565b6020026020010181905250506129c061388c565b6129c86138b9565b6040805160208082018352690d349946fdf439f5d6398252908352815160808101909252604d80835260009291614b5e908301396020830152508152612a0c6138b9565b604080516020808201835269cb29882ba331e2e1fc938252908352815160608101909252602a808352600092916146a69083013960208301525080826001602002015250612a586138b9565b6040805160208082018352691f07f29cabcc7a9338188252908352815160808101909252604b80835260009291614ac39083013960208301525060408201528151819083906003908110612aae57612aae613c3b565b6020908102919091010152506040820152612ac76138d3565b6040805180820182527f85d89f6f7782bc2075891a6d05add5f17d67133c2f7dfd884628f5b9135b5f0081526c66e6a3e4c99e55af5a4fade2fe602080830191909152908352815180830183527f0fb8607251804ff82b5b152a4bae09bd636adc9ad4063a6d6ca2cab25605370081526ccf35c04404a2233b8b48d8e6f08183015283820152815180830183527f3ccbe135ae880f89c39361f314bffdf7a5c2aa5a2dedae7c3a6caa348482360081526cdca1ee33037191c6b6af62c6828183015283830152815180830183527ffa0b99564ab5bb7c3cf61146ccf566c56f9a5a7aa6f2c2bda64b15303e17130081526cf6d9c76639a386b4f513294d928183015260608085019190915284810193909352654bc6fa3ce445608085015284810193909352848201939093528481019390935284810193909352805191820190526039808252600092614067908301396040830152508152612c276137a1565b6329c0f2318152612c366137cb565b669704204ab10aa381527eccca1671adbde8393212111aa00d5c0e5d7b5453b136a72d0b040000000000602082015260006040820152612c746137f9565b73a0cf4b6227a6214dcdfad8f3b9a2b2159342c9678152600160208083018290526040805180820182528381529182019290925290820152612cb461382f565b7fba32bcbcc576d6084f8da91ef59fabc42d2c32870f8f89e74d76849b23de8e008152612cdf613845565b6000604051806080016040528060508152602001614b0e6050913982525070e64be12210d44d8c9af2b28b479fdda6e760781b6020820152604080516001808252818301909252600091816020015b612d3661388c565b815260200190600190039081612d2e579050509050612d5361388c565b612d5b6138b9565b604080516020808201835269d386b862cc399a44a8148252908352815160608101909252603c80835260009291614bab908301396020830152508152612d9f6138b9565b6040805160208082018352698e59ec5123a8911a57f68252908352815160a08101909252606980835260009291613e1b9083013960208301525080826001602002015250612deb6138b9565b60408051602080820183526977c3ba4490b8f4f8bce582529083528151608081019092526041808352600092916147c2908301396020830152506040820152815181908390600090612e3f57612e3f613c3b565b6020908102919091010152506040820152612e586138d3565b6040805180820182527fdf5e535bdb2251e7b882f04e2c196d209e69bf0727fbcafe195e4536825a1b0081526c56d1c9e5ffc1204fad24e1e11f602080830191909152908352815180830183527f221da0d5340ce979deba370153b25c5ad15c51438f37375ab06c759b7a9f480081526cc3d7fdc29451b2c656f2396e138183015283820152815180830183527f814565cb98266cee7971f06826107017acb8ea548cde76f1a84d2ab364ad660081526c72a479051f3727927fa86f34388183015283830152815180830183527f57119d2a41f20ade5aa366907021ca01c8dabdc944aa24f0a17f237bbc063d0081526c9c8e068608b07f30afa6b69c1a81830152606080850191909152848101939093526505d2a625e7d5608080860191909152858201949094528583019490945290850193909352848201939093528151928301909152605180835260009291614441908301396040830152506020820152612fc16137a1565b63169cadc08152612fd06137cb565b6610f95153affb4b81527f8f000774670384e84ff808431f60951061811e1da8808f4b881570000000000060208201526001604082015261300f6137f9565b739b867cfd32926770310f8dc48f2a5761f8cedb0b815260016020808301829052604080518082018252838152918201929092529082015261304f61382f565b7f46011da7fb6d10b847738342476d67cdafa19c63bef70301d8e60a8212c84c00815261307a613845565b60006040518060a00160405280606a8152602001614181606a913982525070fdfac1c8007af04108c1865d6c50fa124960781b6020820152604080516001808252818301909252600091816020015b6130d161388c565b8152602001906001900390816130c95790505090506130ee61388c565b6130f66138b9565b6040805160208082018352690c259b72a84463ba457d8252908352815160808101909252605f8083526000929161485690830139602083015250815261313a6138b9565b604080516020808201835269bcebcd8de032fd2726c5825290835281516060810190925260318083526000929161400790830139602083015250808260016020020152506131866138b9565b604080516020808201835269befaf7021e66ebf84e5b825290835281516080810190925260578083526000929161432a9083013960208301525060408201528151819083906000906131da576131da613c3b565b60209081029190910101525060408201526131f36138d3565b6040805180820182527f0747c3b1da93154e98dca22db9b30987ed2ed20c0d806647b1288968a3c7d70081526c3456484ed978ceda172f61bacb602080830191909152908352815180830183527f5f0f712b08bf9f443e4b1e177842f36510f49100058d3ea926cd25630247a70081526c5b30ca9a6ea621145980ff65038183015283820152815180830183527fa6db2d5c4a63a868f1a217950b0b308cee6bf793a070fe16729c4b62effbe80081526c8035473b14a0868e33d4f37a948183015283830152815180830183527f68169af8168260dc2ecfb574beac056944f32f2f530a7ea62ed3cd1577ba6e0081526cefcd36468e7972a6b096498cfc818301526060808501919091528481019390935265158f731f92bb608085015284810193909352848201939093528401929092528382019290925281518083018352601b81527f4d6f6f20c3a9f09f9a804d6f6f206f4dc3a96fc3a9c3a96f6fc3a90000000000918101919091528282015282015261336e6137a1565b6323ead82e19815261337e6137cb565b66f2f5b1a0c9bc1e81527f19417c16c4099975c42e171f8d5afc0165a795590aa4d4053e105f00000000006020820152600160408201526133bd6137f9565b73453ae228c89c6ed368617e677a883f251ae61593815260006020808301919091526040805180820182526001808252928101929092528201526133ff61382f565b7f5fcc25a764936dfa632e9515846c730f51dece1ec0f392da926ee942bb273b00815261342a613845565b60006040518060600160405280603e8152602001613d50603e91398252507033152d109b1c0e4be90cd6c417d5c70d1760781b6020820152604080516001808252818301909252600091816020015b61348161388c565b81526020019060019003908161347957905050905061349e61388c565b6134a66138b9565b604080516020808201835269b7cc26f1fc61d16a374782529083528151608081019092526052808352600092916149129083013960208301525081526134ea6138b9565b60408051602080820183526911b4601ec870f6d8965d8252908352815160608101909252603e808352600092916140a090830139602083015250808260016020020152506135366138b9565b6040805160208082018352696753b519817bdb1a09b382529083528151808301835260158152739adede418753e13f3500dede9ade9adedfe13f35605f1b818301529083015282015281518190839060009061359457613594613c3b565b60209081029190910101525060408201526135ad6138d3565b6040805180820182527fc626c1b4c9017d322408531761b91c8d5a563a7ee1caf991a87d491105136d0081526cd08ed8722a753c28a6bf848f50602080830191909152908352815180830183527f9f8b3ff1ffdb11b8b7dd7966335f1086ab986d8e074ad0c64a6e9f2a2becac0081526cec3952079480b8826826a934468183015283820152815180830183527f59681117d865de490b4dc9624d2c8d6dc81eee44ae06a90c9c13dbb800acf10081526c8bcf19a6c0e2a5d0863ceae97d8183015283830152815180830183527f4054712b301a4f27057b5c125287fdab406a13bbfec45fea29c6f8ca27ca280081526cd59d9083b2ede887d6e32bb997818301526060808501919091528481019390935265d055bc082b78608085015284810193909352848201939093528481019390935284810193909352805191820190526038808252600092614e0590830139604083810191909152606084019290925250908252820152919050565b60405180606001604052806003905b613731613747565b8152602001906001900390816137295790505090565b60405180602001604052806001905b61375e613774565b8152602001906001900390816137565790505090565b60405180608001604052806004905b61378b6137a1565b8152602001906001900390816137835790505090565b6040518060600160405280600060030b81526020016137be6137cb565b8152602001606081525090565b6040805160808101825260008082526020820181905291810191909152606081016137f46137f9565b905290565b60408051608081018252600080825260208083018290528351808501855282815290810191909152909182019081526020016137f45b6040805180820190915260008152602081016137f45b6040518060a001604052806060815260200160006effffffffffffffffffffffffffffff191681526020016060815260200161387f6138d3565b8152600060209091015290565b60405180606001604052806003905b6138a36138b9565b81526020019060019003908161389b5790505090565b6040805160608101825260009181019182529081906137be565b60405180608001604052806004905b60408051808201909152600080825260208201528152602001906001900390816138e25790505090565b6000815180845260005b8181101561393257602081850181015186830182015201613916565b81811115613944576000602083870101525b50601f01601f19169290920160200192915050565b8060005b600481101561399b578151805160ff191685526020908101516cffffffffffffffffffffffffff16818601526040909401939091019060010161395d565b50505050565b60208152600060208201608083018460005b6003811015613c3057858303601f190184528151836020810160005b6001811015613c175786820383528351826080810160005b6004811015613bff5785820383528351805160030b835260208101516060602085015266ffffffffffffff815116606085015264ffffffffff196020820151166080850152604081015180151560a08601525060608101519050608060c085015260018060a01b0381511660e08501526020810151151561010085015260408101518051151561012086015260208101511515610140860152506060810151905060a061016085015260ff198151166101808501526020810151905060406101a085015280516101806101c0860152613ac461034086018261390c565b6020838101516effffffffffffffffffffffffffffff19166101e088015260408401518783036101bf1901610200890152805180845292935081019181840191600582901b85010160005b82811015613b9457858203601f190184528451826060810160005b6003811015613b7c578582038352835169ffffffffffffffffffff8151511683526020810151905060406020840152613b66604084018261390c565b6020958601959490940193925050600101613b2a565b50602097880197969096019593505050600101613b0f565b5060608601519450613baa6102208a0186613959565b60808601519550613bc66103208a018765ffffffffffff169052565b6040870151965088810360408a0152613bdf818861390c565b9850505050505050506020840193506020830192506001810190506139e7565b506020968701969590950194935050506001016139cf565b50602096870196909550939093019250506001016139b3565b509095945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a8020c3a9206f6f6fc3a96f206f6fc3a96f6ff09f9a806fc3a9f09f9a806f6fc3a94d204d4dc3a9206f6f4dc3a9f09f9a806f206f20f09f9a806f6f4d6f6f20c3a9f09f9a806f2020c3a96f20c3a94dc3a9f09f9a806f20204df09f9a806ff09f9a806f4d204d4d6f4d4d206f20c3a96f20c3a96ff09f9a80f09f9a806f4d4d202020f09f9a80f09f9a806f6f4dc3a96f4d6f4d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a96f6ff09f9a80c3a9f09f9a804d4d4d6f6f20f09f9a80c3a9f09f9a80c3a9c3a96fc3a9c3a920c3a94dc3a9206f20c3a94d4d4d6f6f6ff09f9a806f6f6f4d4d6f6fc3a9c3a94d6f20c3a9206ff09f9a804d6f6f20c3a9f09f9a806fc3a96f4d206f6fc3a9c3a96f20f09f9a80f09f9a8020f09f9a806f6f20f09f9a806f6f6f6f204d20c3a96ff09f9a80c3a96f6f4d6f6f20c3a9f09f9a804d6f6f6ff09f9a8020c3a96f6f4d6fc3a9f09f9a80c3a96f4d6f6f20c3a9f09f9a806f6f6f6f4d4d4dc3a9f09f9a806f6ff09f9a80c3a96f6ff09f9a806f6ff09f9a8020f09f9a80c3a9f09f9a806f4d6f6f20c3a9f09f9a80f09f9a804d6f6f20206fc3a9f09f9a806f4d6f20f09f9a804d206f4d4d6f4d6f204dc3a94df09f9a806f4d6f6f20c3a9f09f9a806f6f6fc3a96ff09f9a806f6fc3a920f09f9a806ff09f9a804df09f9a806ff09f9a806f206f4d6f4dc3a9c3a9f09f9a80c3a96f6fc3a96f4d206f4df09f9a804d6f6fc3a94df09f9a806f20c3a9f09f9a80c3a94d6ff09f9a804d6f20c3a96f4d6f6f20c3a9f09f9a8020f09f9a80206f206ff09f9a80f09f9a804dc3a96f4d206fc3a96fc3a96ff09f9a806f4d6f4df09f9a804d4d6f6f20c3a9f09f9a80c3a9c3a94d6ff09f9a8020f09f9a806f20f09f9a806f6f6ff09f9a806f206ff09f9a80f09f9a804d4d20f09f9a806ff09f9a80206f6fc3a96ff09f9a80f09f9a80c3a94d6f6f6f6fc3a96f6ff09f9a804d6ff09f9a80f09f9a8020f09f9a80f09f9a80f09f9a806f4d6f6ff09f9a80c3a94d6f6f20c3a9f09f9a80c3a920c3a94d4d6f6f20c3a96f6f206f20f09f9a806fc3a94d6f4d4d6f6f20c3a9f09f9a80206f206fc3a9f09f9a806f4d4d4d6ff09f9a80f09f9a8020f09f9a806f4d6fc3a94d6f4d6ff09f9a804d6f6f20c3a9f09f9a80f09f9a806f2020f09f9a80f09f9a80f09f9a80204d206fc3a96f206f6fc3a9c3a9c3a94d6f6f20c3a9f09f9a806f4d6ff09f9a802020f09f9a804d206f6f6f6f6f206ff09f9a806f20c3a9c3a92020c3a94dc3a9c3a96f6fc3a96f6f4d206f6f6f6ff09f9a80f09f9a804d20c3a9206f6f4d6f6f20c3a9f09f9a806f6f4d20f09f9a80c3a96f4d6f206f6f20c3a94d4dc3a94d6fc3a96f6ff09f9a806f20f09f9a804d6f6f20c3a9f09f9a80c3a96f6f6f6f6ff09f9a806fc3a94d4d6f6f202020c3a96f20c3a920c3a9c3a9c3a9c3a96f4d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a9206f4d206fc3a9f09f9a806ff09f9a804dc3a94d6f204df09f9a806f6f4df09f9a806f204d4d4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a94dc3a96f4dc3a96f6f206f4d4d206f204d2020c3a96f20c3a9204d206f20f09f9a80204d6f6ff09f9a80c3a94d6f6f20c3a9f09f9a806f6fc3a94df09f9a80206fc3a9c3a96f6ff09f9a806f6f6ff09f9a80206f204dc3a9204dc3a92020206f6ff09f9a804d6f204df09f9a804d6ff09f9a80c3a96ff09f9a806f4d6f6f6ff09f9a8020f09f9a804d4d6f6f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a8020f09f9a80f09f9a806f204d6ff09f9a804dc3a9c3a96f4dc3a96f4df09f9a806ff09f9a804dc3a96f6f6f4df09f9a804d6f6f20c3a9f09f9a80f09f9a80f09f9a806ff09f9a80f09f9a806fc3a9204d4df09f9a8020c3a96f4d6f4df09f9a80f09f9a80c3a96f6f6ff09f9a806ff09f9a806f6ff09f9a806f4df09f9a80c3a96fc3a9206f4d4d4d20c3a96f6fc3a9f09f9a80c3a96ff09f9a804d6f6f20c3a9f09f9a80f09f9a8020c3a94d6f4d6f206ff09f9a804d4df09f9a8020c3a9c3a94d6f20c3a96f6f6f4d6f6f6f4d6f6f6fc3a9c3a9f09f9a80f09f9a806f6ff09f9a80c3a9c3a96f20f09f9a80f09f9a8020204d6f6f20c3a9f09f9a804df09f9a80c3a94d204d206f20f09f9a80c3a9f09f9a80c3a9c3a9206f6fc3a94d6fc3a9204d4df09f9a804d6ff09f9a806ff09f9a804d4d4df09f9a80f09f9a80204d6f4d6f6f20c3a9f09f9a806f206f206f206ff09f9a80c3a96ff09f9a804d4d4d4d20f09f9a80f09f9a804df09f9a806f20f09f9a80c3a9f09f9a80c3a96fc3a96fc3a920c3a9204dc3a96ff09f9a804dc3a96f6ff09f9a80f09f9a806f4d4d6f6fc3a94d6f6f20c3a9f09f9a80c3a96f20f09f9a806f4d6fc3a9c3a9206f206f4d6f6f6f6f4df09f9a80c3a9c3a9f09f9a80f09f9a80c3a96f204d6f6f20c3a9f09f9a80204d4d20f09f9a80206fc3a9c3a9f09f9a80c3a92020f09f9a806fc3a9f09f9a806fc3a920c3a9206f20f09f9a806ff09f9a80c3a96f6f20c3a96ff09f9a8020f09f9a804d4d4df09f9a8020204d6f6f20c3a9f09f9a806f206f6f6f6f4dc3a9c3a9204dc3a94d4d206f6f4d6f20c3a96fc3a94d6fc3a92020f09f9a806f4dc3a94d4d20c3a9204d206f4d6f6f6ff09f9a80c3a9c3a920206f6f6fc3a9c3a94d204d6f6f20c3a9f09f9a80f09f9a806f4d20f09f9a804d6f6f204d4d4dc3a9206f6f206f6ff09f9a806f6ff09f9a806f4d4dc3a9204d206f6fc3a9c3a96fc3a94d6f20c3a9206f4d6f6f20c3a9f09f9a80c3a94d6ff09f9a80c3a9c3a96fc3a94dc3a96ff09f9a806ff09f9a804d6f6f20c3a9f09f9a80f09f9a806ff09f9a80f09f9a806f6f4df09f9a806f6ff09f9a80c3a9c3a9f09f9a80f09f9a806fc3a96f4d20f09f9a804d6ff09f9a80f09f9a80f09f9a80f09f9a80f09f9a806f4d6f6f20c3a9f09f9a8020c3a94d20c3a96fc3a9f09f9a804df09f9a804d204dc3a96f6f6fc3a9f09f9a80204d20c3a96f206f4d4d6f6f20c3a9f09f9a804dc3a9204d6f4d4d6ff09f9a80c3a96f4d6f4d6f6ff09f9a806f20f09f9a80c3a9c3a9204df09f9a804d6fc3a94d6f4df09f9a804dc3a9f09f9a806f6ff09f9a804d20204d6f6f20c3a9f09f9a80f09f9a80206f6fc3a9c3a96fc3a920204d4d204d20c3a9c3a96f206f20f09f9a8020c3a920f09f9a804d6f206f20c3a96f6f4df09f9a804d4d20f09f9a806fc3a94df09f9a80c3a96f2020204dc3a96f4d6f6f20c3a9f09f9a806f6fc3a96f206ff09f9a804dc3a96f4d4dc3a92020f09f9a806fc3a9f09f9a80f09f9a806f20204d2020c3a96f6fc3a94dc3a92020c3a96fc3a9c3a96fc3a94d6f6f20c3a9f09f9a804d6f206f6f6f4dc3a96f6f4dc3a9c3a9c3a9f09f9a80f09f9a80f09f9a804d20206f4dc3a9c3a9c3a94d4d6f6fc3a9f09f9a80c3a96fc3a96f204d6f6f6ff09f9a804d206f204d6f6f6f4d6f6f20c3a9f09f9a802020204d6f6f6f6fc3a96f6fc3a9c3a9f09f9a806ff09f9a806f206f4d20204d6f6ff09f9a804d6f20c3a9c3a96f6f206fc3a96f6f6f6ff09f9a806f6fc3a9f09f9a80206f6f4d204d6f6f20c3a9f09f9a80f09f9a804df09f9a80f09f9a804d4d20c3a9c3a9c3a9206f4d6f6f20c3a9f09f9a80c3a9206f6f20f09f9a80f09f9a80f09f9a80c3a96fc3a96f4d4d206f6f4d6f6f20c3a9f09f9a806f20c3a96f4d20f09f9a8020c3a94d6f4d4d6ff09f9a804d6f4d4df09f9a806f4d6f6f20c3a9f09f9a806f6f6ff09f9a8020204df09f9a806f4d4dc3a920f09f9a804df09f9a80c3a96ff09f9a806f6f206f6f4d20c3a9f09f9a806f6f6fc3a9c3a920c3a9c3a9c3a96f6fc3a96ff09f9a806ff09f9a806f6fc3a96f20206f206f206ff09f9a806f4d6f6f20c3a9f09f9a804dc3a920f09f9a806f4dc3a94df09f9a80f09f9a806f4dc3a96f206f4d4d6f6f20c3a9f09f9a80f09f9a806fc3a9f09f9a804df09f9a806f6fc3a9c3a9c3a94d6f206f6f4dc3a94df09f9a806f6ff09f9a804d6f6f204df09f9a80f09f9a80f09f9a806ff09f9a806f6f20f09f9a806f4d6ff09f9a80c3a9206f204df09f9a804d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f4d6f6fc3a9206f6f6f4d20206f6f4d4d6fc3a94dc3a94dc3a9206f4d4d20204d4d4d4dc3a96f4d6f4dc3a96f4d6f4d6f6f20c3a9f09f9a80f09f9a8020c3a9f09f9a806ff09f9a806ff09f9a80206f6fc3a94d6f6f204d204d4dc3a9206fc3a94d4d6f4d206f6f20c3a9c3a920f09f9a80c3a9f09f9a80204df09f9a80f09f9a804d6f6f20c3a9f09f9a80c3a96ff09f9a802020c3a96fc3a94d4d4dc3a96f20c3a920c3a9c3a94df09f9a80f09f9a80f09f9a806f6fc3a9f09f9a804d6ff09f9a80f09f9a804dc3a94dc3a9f09f9a804d6f206fc3a94dc3a96f204d4d6f6f6f4d6f6f20c3a9f09f9a806f4d206fc3a920c3a9c3a96f6ff09f9a806fc3a9f09f9a804d6fc3a9c3a96ff09f9a806f6fc3a9c3a96f6f6fc3a9c3a9c3a9206f6fc3a9c3a96f4dc3a9206f20f09f9a8020c3a9c3a96f204d6f4d4d20c3a94d4d6f6f20c3a9f09f9a806f6f20c3a9c3a9204dc3a9c3a94d6f6f4d6ff09f9a804dc3a96f2020f09f9a806f6f6f6ff09f9a804d4d6f6fc3a96fc3a9c3a94d206ff09f9a806ff09f9a80c3a96ff09f9a806f4d4d6f6f20c3a9f09f9a80c3a94d6f204d6f6f6fc3a94dc3a96ff09f9a804d20c3a94d6f6f20c3a9f09f9a806ff09f9a806fc3a9c3a94d20206ff09f9a8020206f206f6f6fc3a9f09f9a8020c3a96f20c3a9f09f9a804d6f6f20c3a9f09f9a8020f09f9a804d20204d6f6f6fc3a9f09f9a80206f6f204d206f206f6f20f09f9a806f206fc3a9204d4d6f6f20c3a9f09f9a806f6f4df09f9a806f4d206f206fc3a96fc3a9f09f9a806fc3a96ff09f9a804d20f09f9a806ff09f9a80f09f9a80f09f9a80c3a9f09f9a8020c3a94d206fc3a96f204d204df09f9a806fc3a920f09f9a80f09f9a80f09f9a804dc3a9f09f9a80206f206f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80c3a9f09f9a80f09f9a80206f4df09f9a80f09f9a80c3a9c3a9c3a9c3a9f09f9a80f09f9a806fc3a94d6f4d206f6fc3a9c3a96ff09f9a8020206fc3a9f09f9a80204dc3a96f6f206f6f206f6f6f4d206ff09f9a804dc3a96f4d6f6f20c3a9f09f9a80f09f9a806fc3a96f6f4d6ff09f9a8020f09f9a80204dc3a9f09f9a806f6f4d6f6f6f6ff09f9a80f09f9a804dc3a96f6fc3a96fc3a96f4d6f6f6f6f6f6f4d6f6f6f4d6f6f20c3a9f09f9a80f09f9a806ff09f9a80204d4dc3a96f204d6f6f6ff09f9a80c3a96f20f09f9a8020c3a9206fc3a96ff09f9a80c3a94dc3a94dc3a94dc3a94df09f9a804d6f6f6f20f09f9a806f4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80f09f9a804d6fc3a96f6f4dc3a9c3a9c3a9c3a9c3a9c3a920c3a9f09f9a80206ff09f9a806f6f20f09f9a80c3a94df09f9a80c3a96f4d204d206f4d6f6f20c3a9f09f9a806f6f6f20c3a96f4d6f20206f20f09f9a80c3a94d6ff09f9a804df09f9a806f4d6fc3a9206f6fc3a96ff09f9a80c3a94dc3a94d6f6f20c3a9f09f9a80f09f9a804df09f9a80c3a96f206ff09f9a804df09f9a80c3a9206f2020c3a9f09f9a80c3a96ff09f9a804df09f9a806ff09f9a806f6f6fc3a96f6f6f4d6fc3a9f09f9a804d6f6f20c3a9f09f9a806f206f4dc3a9c3a94d6f206f6f6f6f6f6f6ff09f9a80f09f9a80204d4d6f6f20c3a9f09f9a806f4d6f4dc3a96fc3a96f4d6f206fc3a94d6f206f4d206f6f6f6f4d4d6f4dc3a9204d4d206f6f4d4dc3a9c3a9f09f9a806f206f4d6f6f20c3a9f09f9a80f09f9a806f6f6f4df09f9a80c3a92020f09f9a80c3a96f6f6f6f4df09f9a806ff09f9a804d4d6fc3a96f4d4df09f9a806f6fc3a96f4df09f9a80c3a9206f206fc3a96fc3a9204d4d6f6fc3a9f09f9a80204dc3a94d6f6f20c3a9f09f9a806ff09f9a806f6ff09f9a80c3a9206fc3a920c3a9c3a96f4d6f6f20c3a9f09f9a804d6fc3a9f09f9a80c3a96f204d20c3a94d4df09f9a806f6f4d4df09f9a80206f6f6f4df09f9a806f4d6f6f6ff09f9a80f09f9a80c3a94d4d4df09f9a80f09f9a80206ff09f9a804d4d6f4df09f9a80204d6f4d6f6f20c3a9f09f9a806f4df09f9a80f09f9a80c3a96f4d4d4df09f9a80f09f9a806f6f6fc3a96f6f6f4dc3a94d6ff09f9a806f4dc3a94d6fc3a9f09f9a806f4d6ff09f9a802020c3a96ff09f9a8020206f6f6f20f09f9a80c3a96fc3a9f09f9a806f4d6f6f20c3a9f09f9a806fc3a94d6f4d206f4df09f9a804d6f20204dc3a96ff09f9a80c3a96f4d6fc3a920c3a9c3a94d6f6f20c3a9f09f9a806f6f6fc3a9f09f9a80c3a9c3a9206ff09f9a804d6fc3a9f09f9a804d206f6f6ff09f9a804d4d2020f09f9a80c3a9a2646970667358221220bab7fc4e6040e2128adcb0612a4304c680e93bf7c36847f523af78118a5a01e164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_25e98821 {\n bool s_0;\n bool s_1;\n }\n\n struct S_54896afd {\n uint80 s_0;\n }\n\n struct S_5758d412 {\n S_54896afd s_0;\n string s_1;\n }\n\n struct S_d8e64867 {\n bytes31 s_0;\n uint104 s_1;\n }\n\n struct S_770db331 {\n string s_0;\n bytes17 s_1;\n S_5758d412[3][] s_2;\n S_d8e64867[4] s_3;\n uint48 s_4;\n }\n\n struct S_a55eb82d {\n bytes31 s_0;\n S_770db331 s_1;\n }\n\n struct S_733a0ce7 {\n address s_0;\n bool s_1;\n S_25e98821 s_2;\n S_a55eb82d s_3;\n }\n\n struct S_c8d7c908 {\n uint56 s_0;\n bytes27 s_1;\n bool s_2;\n S_733a0ce7 s_3;\n }\n\n struct S_920026e8 {\n int32 s_0;\n S_c8d7c908 s_1;\n string s_2;\n }\n\n function test () public pure returns (S_920026e8[4][1][3] memory) {\n S_920026e8[4][1][3] memory r;\n {\n S_920026e8[4][1] memory r_0;\n {\n S_920026e8[4] memory r_0_0;\n {\n S_920026e8 memory r_0_0_0;\n {\n int32 r_0_0_0_0 = 18355222;\n r_0_0_0.s_0 = r_0_0_0_0;\n }\n {\n S_c8d7c908 memory r_0_0_0_1;\n {\n uint56 r_0_0_0_1_0 = 57605386795259468;\n r_0_0_0_1.s_0 = r_0_0_0_1_0;\n }\n {\n bytes27 r_0_0_0_1_1 = bytes27(0x71ef38edd1de0d0fe4505a0d0ae63937d06557cd28350ca1571f3c);\n r_0_0_0_1.s_1 = r_0_0_0_1_1;\n }\n {\n bool r_0_0_0_1_2 = true;\n r_0_0_0_1.s_2 = r_0_0_0_1_2;\n }\n {\n S_733a0ce7 memory r_0_0_0_1_3;\n {\n address r_0_0_0_1_3_0 = 0x27b258FA3988A5E38dBAf403f8727441Dad93286;\n r_0_0_0_1_3.s_0 = r_0_0_0_1_3_0;\n }\n {\n bool r_0_0_0_1_3_1 = true;\n r_0_0_0_1_3.s_1 = r_0_0_0_1_3_1;\n }\n {\n S_25e98821 memory r_0_0_0_1_3_2;\n {\n bool r_0_0_0_1_3_2_0 = true;\n r_0_0_0_1_3_2.s_0 = r_0_0_0_1_3_2_0;\n }\n {\n bool r_0_0_0_1_3_2_1 = false;\n r_0_0_0_1_3_2.s_1 = r_0_0_0_1_3_2_1;\n }\n r_0_0_0_1_3.s_2 = r_0_0_0_1_3_2;\n }\n {\n S_a55eb82d memory r_0_0_0_1_3_3;\n {\n bytes31 r_0_0_0_1_3_3_0 = bytes31(0x25c195eec3482605a36958b210bc1d5437bfbdd949c9515603fba77abbdd55);\n r_0_0_0_1_3_3.s_0 = r_0_0_0_1_3_3_0;\n }\n {\n S_770db331 memory r_0_0_0_1_3_3_1;\n {\n string memory r_0_0_0_1_3_3_1_0 = unicode\"Moo é🚀🚀M🚀éo o🚀M🚀é o é🚀éo🚀M🚀o🚀oooéoooMoé🚀\";\n r_0_0_0_1_3_3_1.s_0 = r_0_0_0_1_3_3_1_0;\n }\n {\n bytes17 r_0_0_0_1_3_3_1_1 = bytes17(0x38d263bc12265c652145b25a26113fcc7e);\n r_0_0_0_1_3_3_1.s_1 = r_0_0_0_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_0_0_0_1_3_3_1_2 = new S_5758d412[3][](4);\n {\n S_5758d412[3] memory r_0_0_0_1_3_3_1_2_0;\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_0_0_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_0_0_0_0 = 902109314565981353941411;\n r_0_0_0_1_3_3_1_2_0_0_0.s_0 = r_0_0_0_1_3_3_1_2_0_0_0_0;\n }\n r_0_0_0_1_3_3_1_2_0_0.s_0 = r_0_0_0_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀o🚀🚀é🚀🚀 oM🚀🚀éééé🚀🚀oéMoM ooééo🚀 oé🚀 Méoo oo oooM o🚀Méo\";\n r_0_0_0_1_3_3_1_2_0_0.s_1 = r_0_0_0_1_3_3_1_2_0_0_1;\n }\n r_0_0_0_1_3_3_1_2_0[0] = r_0_0_0_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_0_1_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_0_1_0_0 = 100921045557741606128354;\n r_0_0_0_1_3_3_1_2_0_1_0.s_0 = r_0_0_0_1_3_3_1_2_0_1_0_0;\n }\n r_0_0_0_1_3_3_1_2_0_1.s_0 = r_0_0_0_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀Mé MoMMo🚀éoMoMoo🚀o 🚀éé M🚀MoéMoM🚀Mé🚀oo🚀M \";\n r_0_0_0_1_3_3_1_2_0_1.s_1 = r_0_0_0_1_3_3_1_2_0_1_1;\n }\n r_0_0_0_1_3_3_1_2_0[1] = r_0_0_0_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_0_2_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_0_2_0_0 = 591931470670889595099545;\n r_0_0_0_1_3_3_1_2_0_2_0.s_0 = r_0_0_0_1_3_3_1_2_0_2_0_0;\n }\n r_0_0_0_1_3_3_1_2_0_2.s_0 = r_0_0_0_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀 🚀 o o🚀🚀MéoM oéoéo🚀oMoM🚀M\";\n r_0_0_0_1_3_3_1_2_0_2.s_1 = r_0_0_0_1_3_3_1_2_0_2_1;\n }\n r_0_0_0_1_3_3_1_2_0[2] = r_0_0_0_1_3_3_1_2_0_2;\n }\n r_0_0_0_1_3_3_1_2[0] = r_0_0_0_1_3_3_1_2_0;\n }\n {\n S_5758d412[3] memory r_0_0_0_1_3_3_1_2_1;\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_1_0;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_1_0_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_1_0_0_0 = 476592337609322106346873;\n r_0_0_0_1_3_3_1_2_1_0_0.s_0 = r_0_0_0_1_3_3_1_2_1_0_0_0;\n }\n r_0_0_0_1_3_3_1_2_1_0.s_0 = r_0_0_0_1_3_3_1_2_1_0_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_1_0_1 = unicode\"Moo é🚀oMo🚀 🚀M ooooo o🚀o éé éMééooéooM oooo🚀🚀M é oo\";\n r_0_0_0_1_3_3_1_2_1_0.s_1 = r_0_0_0_1_3_3_1_2_1_0_1;\n }\n r_0_0_0_1_3_3_1_2_1[0] = r_0_0_0_1_3_3_1_2_1_0;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_1_1;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_1_1_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_1_1_0_0 = 207837155718070607859987;\n r_0_0_0_1_3_3_1_2_1_1_0.s_0 = r_0_0_0_1_3_3_1_2_1_1_0_0;\n }\n r_0_0_0_1_3_3_1_2_1_1.s_0 = r_0_0_0_1_3_3_1_2_1_1_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_1_1_1 = unicode\"Moo é🚀o o o o🚀éo🚀MMMM 🚀🚀M🚀o 🚀é🚀éoéoé é Méo🚀Méoo🚀🚀oMMooé\";\n r_0_0_0_1_3_3_1_2_1_1.s_1 = r_0_0_0_1_3_3_1_2_1_1_1;\n }\n r_0_0_0_1_3_3_1_2_1[1] = r_0_0_0_1_3_3_1_2_1_1;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_1_2;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_1_2_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_1_2_0_0 = 245780807101999562840711;\n r_0_0_0_1_3_3_1_2_1_2_0.s_0 = r_0_0_0_1_3_3_1_2_1_2_0_0;\n }\n r_0_0_0_1_3_3_1_2_1_2.s_0 = r_0_0_0_1_3_3_1_2_1_2_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_1_2_1 = unicode\"Moo é🚀🚀 éMoMo o🚀MM🚀 ééMo éoooMoooMoooéé🚀🚀oo🚀ééo 🚀🚀 \";\n r_0_0_0_1_3_3_1_2_1_2.s_1 = r_0_0_0_1_3_3_1_2_1_2_1;\n }\n r_0_0_0_1_3_3_1_2_1[2] = r_0_0_0_1_3_3_1_2_1_2;\n }\n r_0_0_0_1_3_3_1_2[1] = r_0_0_0_1_3_3_1_2_1;\n }\n {\n S_5758d412[3] memory r_0_0_0_1_3_3_1_2_2;\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_2_0;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_2_0_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_2_0_0_0 = 841037729954510806441697;\n r_0_0_0_1_3_3_1_2_2_0_0.s_0 = r_0_0_0_1_3_3_1_2_2_0_0_0;\n }\n r_0_0_0_1_3_3_1_2_2_0.s_0 = r_0_0_0_1_3_3_1_2_2_0_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_2_0_1 = unicode\"Moo é🚀\";\n r_0_0_0_1_3_3_1_2_2_0.s_1 = r_0_0_0_1_3_3_1_2_2_0_1;\n }\n r_0_0_0_1_3_3_1_2_2[0] = r_0_0_0_1_3_3_1_2_2_0;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_2_1;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_2_1_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_2_1_0_0 = 710066326581668142669341;\n r_0_0_0_1_3_3_1_2_2_1_0.s_0 = r_0_0_0_1_3_3_1_2_2_1_0_0;\n }\n r_0_0_0_1_3_3_1_2_2_1.s_0 = r_0_0_0_1_3_3_1_2_2_1_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_2_1_1 = unicode\"Moo é🚀é\";\n r_0_0_0_1_3_3_1_2_2_1.s_1 = r_0_0_0_1_3_3_1_2_2_1_1;\n }\n r_0_0_0_1_3_3_1_2_2[1] = r_0_0_0_1_3_3_1_2_2_1;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_2_2;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_2_2_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_2_2_0_0 = 910891532403756632616283;\n r_0_0_0_1_3_3_1_2_2_2_0.s_0 = r_0_0_0_1_3_3_1_2_2_2_0_0;\n }\n r_0_0_0_1_3_3_1_2_2_2.s_0 = r_0_0_0_1_3_3_1_2_2_2_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_2_2_1 = unicode\"Moo é🚀Mo oooMéooMééé🚀🚀🚀M oMéééMMooé🚀éoéo Mooo🚀M o Mooo\";\n r_0_0_0_1_3_3_1_2_2_2.s_1 = r_0_0_0_1_3_3_1_2_2_2_1;\n }\n r_0_0_0_1_3_3_1_2_2[2] = r_0_0_0_1_3_3_1_2_2_2;\n }\n r_0_0_0_1_3_3_1_2[2] = r_0_0_0_1_3_3_1_2_2;\n }\n {\n S_5758d412[3] memory r_0_0_0_1_3_3_1_2_3;\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_3_0;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_3_0_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_3_0_0_0 = 95509990206409565452298;\n r_0_0_0_1_3_3_1_2_3_0_0.s_0 = r_0_0_0_1_3_3_1_2_3_0_0_0;\n }\n r_0_0_0_1_3_3_1_2_3_0.s_0 = r_0_0_0_1_3_3_1_2_3_0_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_3_0_1 = unicode\"Moo é🚀é oo 🚀🚀🚀éoéoMM oo\";\n r_0_0_0_1_3_3_1_2_3_0.s_1 = r_0_0_0_1_3_3_1_2_3_0_1;\n }\n r_0_0_0_1_3_3_1_2_3[0] = r_0_0_0_1_3_3_1_2_3_0;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_3_1;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_3_1_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_3_1_0_0 = 768893670727290818509096;\n r_0_0_0_1_3_3_1_2_3_1_0.s_0 = r_0_0_0_1_3_3_1_2_3_1_0_0;\n }\n r_0_0_0_1_3_3_1_2_3_1.s_0 = r_0_0_0_1_3_3_1_2_3_1_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_3_1_1 = unicode\"Moo é🚀🚀 é🚀o🚀o🚀 ooéMoo M MMé oéMMoM oo éé 🚀é🚀 M🚀🚀\";\n r_0_0_0_1_3_3_1_2_3_1.s_1 = r_0_0_0_1_3_3_1_2_3_1_1;\n }\n r_0_0_0_1_3_3_1_2_3[1] = r_0_0_0_1_3_3_1_2_3_1;\n }\n {\n S_5758d412 memory r_0_0_0_1_3_3_1_2_3_2;\n {\n S_54896afd memory r_0_0_0_1_3_3_1_2_3_2_0;\n {\n uint80 r_0_0_0_1_3_3_1_2_3_2_0_0 = 1031893528898539643774826;\n r_0_0_0_1_3_3_1_2_3_2_0.s_0 = r_0_0_0_1_3_3_1_2_3_2_0_0;\n }\n r_0_0_0_1_3_3_1_2_3_2.s_0 = r_0_0_0_1_3_3_1_2_3_2_0;\n }\n {\n string memory r_0_0_0_1_3_3_1_2_3_2_1 = unicode\"Moo é🚀 éM éoé🚀M🚀M Méoooé🚀 M éo oM\";\n r_0_0_0_1_3_3_1_2_3_2.s_1 = r_0_0_0_1_3_3_1_2_3_2_1;\n }\n r_0_0_0_1_3_3_1_2_3[2] = r_0_0_0_1_3_3_1_2_3_2;\n }\n r_0_0_0_1_3_3_1_2[3] = r_0_0_0_1_3_3_1_2_3;\n }\n r_0_0_0_1_3_3_1.s_2 = r_0_0_0_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_0_0_0_1_3_3_1_3;\n {\n S_d8e64867 memory r_0_0_0_1_3_3_1_3_0;\n {\n bytes31 r_0_0_0_1_3_3_1_3_0_0 = bytes31(0x8ef7380bb72bd51844a26505a8fd0c7fc4b8e3a6b621190a3645048351c5a6);\n r_0_0_0_1_3_3_1_3_0.s_0 = r_0_0_0_1_3_3_1_3_0_0;\n }\n {\n uint104 r_0_0_0_1_3_3_1_3_0_1 = 2903159897798253948824791347977;\n r_0_0_0_1_3_3_1_3_0.s_1 = r_0_0_0_1_3_3_1_3_0_1;\n }\n r_0_0_0_1_3_3_1_3[0] = r_0_0_0_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_0_0_0_1_3_3_1_3_1;\n {\n bytes31 r_0_0_0_1_3_3_1_3_1_0 = bytes31(0xe4bb152090d38297f101ae13a44055271fc8fab29f0d3af2e7281571268bfa);\n r_0_0_0_1_3_3_1_3_1.s_0 = r_0_0_0_1_3_3_1_3_1_0;\n }\n {\n uint104 r_0_0_0_1_3_3_1_3_1_1 = 3905471293673782658392748267612;\n r_0_0_0_1_3_3_1_3_1.s_1 = r_0_0_0_1_3_3_1_3_1_1;\n }\n r_0_0_0_1_3_3_1_3[1] = r_0_0_0_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_0_0_0_1_3_3_1_3_2;\n {\n bytes31 r_0_0_0_1_3_3_1_3_2_0 = bytes31(0x42276335c2b5dc4a14c14aff1c50b566dc75c7b1a094b3e1e2bb9b6ec63841);\n r_0_0_0_1_3_3_1_3_2.s_0 = r_0_0_0_1_3_3_1_3_2_0;\n }\n {\n uint104 r_0_0_0_1_3_3_1_3_2_1 = 9282998479400373305756046633986;\n r_0_0_0_1_3_3_1_3_2.s_1 = r_0_0_0_1_3_3_1_3_2_1;\n }\n r_0_0_0_1_3_3_1_3[2] = r_0_0_0_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_0_0_0_1_3_3_1_3_3;\n {\n bytes31 r_0_0_0_1_3_3_1_3_3_0 = bytes31(0xd6d90b6e348c2a6f2c2b3b68a8d9c0f3a98d9f00d489fe685e610a03cbcb72);\n r_0_0_0_1_3_3_1_3_3.s_0 = r_0_0_0_1_3_3_1_3_3_0;\n }\n {\n uint104 r_0_0_0_1_3_3_1_3_3_1 = 14167259132795680660318273273641;\n r_0_0_0_1_3_3_1_3_3.s_1 = r_0_0_0_1_3_3_1_3_3_1;\n }\n r_0_0_0_1_3_3_1_3[3] = r_0_0_0_1_3_3_1_3_3;\n }\n r_0_0_0_1_3_3_1.s_3 = r_0_0_0_1_3_3_1_3;\n }\n {\n uint48 r_0_0_0_1_3_3_1_4 = 194582415095792;\n r_0_0_0_1_3_3_1.s_4 = r_0_0_0_1_3_3_1_4;\n }\n r_0_0_0_1_3_3.s_1 = r_0_0_0_1_3_3_1;\n }\n r_0_0_0_1_3.s_3 = r_0_0_0_1_3_3;\n }\n r_0_0_0_1.s_3 = r_0_0_0_1_3;\n }\n r_0_0_0.s_1 = r_0_0_0_1;\n }\n {\n string memory r_0_0_0_2 = unicode\"Moo é🚀🚀o 🚀🚀🚀 M oéo ooééé\";\n r_0_0_0.s_2 = r_0_0_0_2;\n }\n r_0_0[0] = r_0_0_0;\n }\n {\n S_920026e8 memory r_0_0_1;\n {\n int32 r_0_0_1_0 = 1518415825;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n S_c8d7c908 memory r_0_0_1_1;\n {\n uint56 r_0_0_1_1_0 = 5576117797126617;\n r_0_0_1_1.s_0 = r_0_0_1_1_0;\n }\n {\n bytes27 r_0_0_1_1_1 = bytes27(0x2b5b999f8bd52f04f9f8a0369f3e05e13581bcbe71dc3e926aa6cb);\n r_0_0_1_1.s_1 = r_0_0_1_1_1;\n }\n {\n bool r_0_0_1_1_2 = true;\n r_0_0_1_1.s_2 = r_0_0_1_1_2;\n }\n {\n S_733a0ce7 memory r_0_0_1_1_3;\n {\n address r_0_0_1_1_3_0 = 0xD13e497f1e5527A3C27834b0deD2b5Fd3aBeB6E5;\n r_0_0_1_1_3.s_0 = r_0_0_1_1_3_0;\n }\n {\n bool r_0_0_1_1_3_1 = true;\n r_0_0_1_1_3.s_1 = r_0_0_1_1_3_1;\n }\n {\n S_25e98821 memory r_0_0_1_1_3_2;\n {\n bool r_0_0_1_1_3_2_0 = false;\n r_0_0_1_1_3_2.s_0 = r_0_0_1_1_3_2_0;\n }\n {\n bool r_0_0_1_1_3_2_1 = false;\n r_0_0_1_1_3_2.s_1 = r_0_0_1_1_3_2_1;\n }\n r_0_0_1_1_3.s_2 = r_0_0_1_1_3_2;\n }\n {\n S_a55eb82d memory r_0_0_1_1_3_3;\n {\n bytes31 r_0_0_1_1_3_3_0 = bytes31(0x92d5e795f3be6659ea34b2b398b614b9826f2953e5e3d579aa3a4a8afcbddd);\n r_0_0_1_1_3_3.s_0 = r_0_0_1_1_3_3_0;\n }\n {\n S_770db331 memory r_0_0_1_1_3_3_1;\n {\n string memory r_0_0_1_1_3_3_1_0 = unicode\"Moo é🚀oéMoM oM🚀Mo Méo🚀éoMoé éé\";\n r_0_0_1_1_3_3_1.s_0 = r_0_0_1_1_3_3_1_0;\n }\n {\n bytes17 r_0_0_1_1_3_3_1_1 = bytes17(0xa4d9191c96565cd2c349f9c8530d0377fb);\n r_0_0_1_1_3_3_1.s_1 = r_0_0_1_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_0_0_1_1_3_3_1_2 = new S_5758d412[3][](2);\n {\n S_5758d412[3] memory r_0_0_1_1_3_3_1_2_0;\n {\n S_5758d412 memory r_0_0_1_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_0_0_1_1_3_3_1_2_0_0_0;\n {\n uint80 r_0_0_1_1_3_3_1_2_0_0_0_0 = 1162095319204708183120967;\n r_0_0_1_1_3_3_1_2_0_0_0.s_0 = r_0_0_1_1_3_3_1_2_0_0_0_0;\n }\n r_0_0_1_1_3_3_1_2_0_0.s_0 = r_0_0_1_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_0_0_1_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀🚀 ooééoé MM M ééo o 🚀 é 🚀Mo o éooM🚀MM 🚀oéM🚀éo Méo\";\n r_0_0_1_1_3_3_1_2_0_0.s_1 = r_0_0_1_1_3_3_1_2_0_0_1;\n }\n r_0_0_1_1_3_3_1_2_0[0] = r_0_0_1_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_0_0_1_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_0_0_1_1_3_3_1_2_0_1_0;\n {\n uint80 r_0_0_1_1_3_3_1_2_0_1_0_0 = 272884958764643581332538;\n r_0_0_1_1_3_3_1_2_0_1_0.s_0 = r_0_0_1_1_3_3_1_2_0_1_0_0;\n }\n r_0_0_1_1_3_3_1_2_0_1.s_0 = r_0_0_1_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_0_0_1_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀oM oé ééoo🚀oé🚀Moééo🚀ooééoooééé ooééoMé o 🚀 ééo MoMM éM\";\n r_0_0_1_1_3_3_1_2_0_1.s_1 = r_0_0_1_1_3_3_1_2_0_1_1;\n }\n r_0_0_1_1_3_3_1_2_0[1] = r_0_0_1_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_0_0_1_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_0_0_1_1_3_3_1_2_0_2_0;\n {\n uint80 r_0_0_1_1_3_3_1_2_0_2_0_0 = 791645322997087948475041;\n r_0_0_1_1_3_3_1_2_0_2_0.s_0 = r_0_0_1_1_3_3_1_2_0_2_0_0;\n }\n r_0_0_1_1_3_3_1_2_0_2.s_0 = r_0_0_1_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_0_0_1_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀éM\";\n r_0_0_1_1_3_3_1_2_0_2.s_1 = r_0_0_1_1_3_3_1_2_0_2_1;\n }\n r_0_0_1_1_3_3_1_2_0[2] = r_0_0_1_1_3_3_1_2_0_2;\n }\n r_0_0_1_1_3_3_1_2[0] = r_0_0_1_1_3_3_1_2_0;\n }\n {\n S_5758d412[3] memory r_0_0_1_1_3_3_1_2_1;\n {\n S_5758d412 memory r_0_0_1_1_3_3_1_2_1_0;\n {\n S_54896afd memory r_0_0_1_1_3_3_1_2_1_0_0;\n {\n uint80 r_0_0_1_1_3_3_1_2_1_0_0_0 = 723278491125565320940318;\n r_0_0_1_1_3_3_1_2_1_0_0.s_0 = r_0_0_1_1_3_3_1_2_1_0_0_0;\n }\n r_0_0_1_1_3_3_1_2_1_0.s_0 = r_0_0_1_1_3_3_1_2_1_0_0;\n }\n {\n string memory r_0_0_1_1_3_3_1_2_1_0_1 = unicode\"Moo é🚀o oMééMo ooooooo🚀🚀 M\";\n r_0_0_1_1_3_3_1_2_1_0.s_1 = r_0_0_1_1_3_3_1_2_1_0_1;\n }\n r_0_0_1_1_3_3_1_2_1[0] = r_0_0_1_1_3_3_1_2_1_0;\n }\n {\n S_5758d412 memory r_0_0_1_1_3_3_1_2_1_1;\n {\n S_54896afd memory r_0_0_1_1_3_3_1_2_1_1_0;\n {\n uint80 r_0_0_1_1_3_3_1_2_1_1_0_0 = 552043958592243750387283;\n r_0_0_1_1_3_3_1_2_1_1_0.s_0 = r_0_0_1_1_3_3_1_2_1_1_0_0;\n }\n r_0_0_1_1_3_3_1_2_1_1.s_0 = r_0_0_1_1_3_3_1_2_1_1_0;\n }\n {\n string memory r_0_0_1_1_3_3_1_2_1_1_1 = unicode\"Moo é🚀ooooMMMé🚀oo🚀éoo🚀oo🚀 🚀é🚀o\";\n r_0_0_1_1_3_3_1_2_1_1.s_1 = r_0_0_1_1_3_3_1_2_1_1_1;\n }\n r_0_0_1_1_3_3_1_2_1[1] = r_0_0_1_1_3_3_1_2_1_1;\n }\n {\n S_5758d412 memory r_0_0_1_1_3_3_1_2_1_2;\n {\n S_54896afd memory r_0_0_1_1_3_3_1_2_1_2_0;\n {\n uint80 r_0_0_1_1_3_3_1_2_1_2_0_0 = 308448460972648359403240;\n r_0_0_1_1_3_3_1_2_1_2_0.s_0 = r_0_0_1_1_3_3_1_2_1_2_0_0;\n }\n r_0_0_1_1_3_3_1_2_1_2.s_0 = r_0_0_1_1_3_3_1_2_1_2_0;\n }\n {\n string memory r_0_0_1_1_3_3_1_2_1_2_1 = unicode\"Moo é🚀o🚀oééM o🚀 o oooé🚀 éo é🚀\";\n r_0_0_1_1_3_3_1_2_1_2.s_1 = r_0_0_1_1_3_3_1_2_1_2_1;\n }\n r_0_0_1_1_3_3_1_2_1[2] = r_0_0_1_1_3_3_1_2_1_2;\n }\n r_0_0_1_1_3_3_1_2[1] = r_0_0_1_1_3_3_1_2_1;\n }\n r_0_0_1_1_3_3_1.s_2 = r_0_0_1_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_0_0_1_1_3_3_1_3;\n {\n S_d8e64867 memory r_0_0_1_1_3_3_1_3_0;\n {\n bytes31 r_0_0_1_1_3_3_1_3_0_0 = bytes31(0x18ea9744fff348e9c64f3338bf54fd041553be491bcfe49f0fdbe627414e4f);\n r_0_0_1_1_3_3_1_3_0.s_0 = r_0_0_1_1_3_3_1_3_0_0;\n }\n {\n uint104 r_0_0_1_1_3_3_1_3_0_1 = 17543211149938518911882444864746;\n r_0_0_1_1_3_3_1_3_0.s_1 = r_0_0_1_1_3_3_1_3_0_1;\n }\n r_0_0_1_1_3_3_1_3[0] = r_0_0_1_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_0_0_1_1_3_3_1_3_1;\n {\n bytes31 r_0_0_1_1_3_3_1_3_1_0 = bytes31(0x7b7d35df8b8c2ac9211017182446b42780c97cbd9f6ebaed41f7c40ee5e62c);\n r_0_0_1_1_3_3_1_3_1.s_0 = r_0_0_1_1_3_3_1_3_1_0;\n }\n {\n uint104 r_0_0_1_1_3_3_1_3_1_1 = 15221617671273916157388938414982;\n r_0_0_1_1_3_3_1_3_1.s_1 = r_0_0_1_1_3_3_1_3_1_1;\n }\n r_0_0_1_1_3_3_1_3[1] = r_0_0_1_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_0_0_1_1_3_3_1_3_2;\n {\n bytes31 r_0_0_1_1_3_3_1_3_2_0 = bytes31(0xd0162622470078e075a86c08146dda6fd059f9ee5b079d4bd6b5b6adb2dfcd);\n r_0_0_1_1_3_3_1_3_2.s_0 = r_0_0_1_1_3_3_1_3_2_0;\n }\n {\n uint104 r_0_0_1_1_3_3_1_3_2_1 = 12928109738491269108925831392415;\n r_0_0_1_1_3_3_1_3_2.s_1 = r_0_0_1_1_3_3_1_3_2_1;\n }\n r_0_0_1_1_3_3_1_3[2] = r_0_0_1_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_0_0_1_1_3_3_1_3_3;\n {\n bytes31 r_0_0_1_1_3_3_1_3_3_0 = bytes31(0x18f6d5237f961e45ae2b6adada04ed3fdbc633a51c9beaa1816fad92a328d9);\n r_0_0_1_1_3_3_1_3_3.s_0 = r_0_0_1_1_3_3_1_3_3_0;\n }\n {\n uint104 r_0_0_1_1_3_3_1_3_3_1 = 17559319900421028608277988566636;\n r_0_0_1_1_3_3_1_3_3.s_1 = r_0_0_1_1_3_3_1_3_3_1;\n }\n r_0_0_1_1_3_3_1_3[3] = r_0_0_1_1_3_3_1_3_3;\n }\n r_0_0_1_1_3_3_1.s_3 = r_0_0_1_1_3_3_1_3;\n }\n {\n uint48 r_0_0_1_1_3_3_1_4 = 28013312150153;\n r_0_0_1_1_3_3_1.s_4 = r_0_0_1_1_3_3_1_4;\n }\n r_0_0_1_1_3_3.s_1 = r_0_0_1_1_3_3_1;\n }\n r_0_0_1_1_3.s_3 = r_0_0_1_1_3_3;\n }\n r_0_0_1_1.s_3 = r_0_0_1_1_3;\n }\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n string memory r_0_0_1_2 = unicode\"Moo é🚀🚀oo🚀oo\";\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n r_0_0[1] = r_0_0_1;\n }\n {\n S_920026e8 memory r_0_0_2;\n {\n int32 r_0_0_2_0 = 825705551;\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n S_c8d7c908 memory r_0_0_2_1;\n {\n uint56 r_0_0_2_1_0 = 17491718229780352;\n r_0_0_2_1.s_0 = r_0_0_2_1_0;\n }\n {\n bytes27 r_0_0_2_1_1 = bytes27(0xa43c3be0e2ebe1219c4a9a4a17823b0445eb881d7a0a9dca7ce46b);\n r_0_0_2_1.s_1 = r_0_0_2_1_1;\n }\n {\n bool r_0_0_2_1_2 = true;\n r_0_0_2_1.s_2 = r_0_0_2_1_2;\n }\n {\n S_733a0ce7 memory r_0_0_2_1_3;\n {\n address r_0_0_2_1_3_0 = 0x1F7D10a796a0B01ec3283A0efE4662CE1559fFd3;\n r_0_0_2_1_3.s_0 = r_0_0_2_1_3_0;\n }\n {\n bool r_0_0_2_1_3_1 = false;\n r_0_0_2_1_3.s_1 = r_0_0_2_1_3_1;\n }\n {\n S_25e98821 memory r_0_0_2_1_3_2;\n {\n bool r_0_0_2_1_3_2_0 = false;\n r_0_0_2_1_3_2.s_0 = r_0_0_2_1_3_2_0;\n }\n {\n bool r_0_0_2_1_3_2_1 = true;\n r_0_0_2_1_3_2.s_1 = r_0_0_2_1_3_2_1;\n }\n r_0_0_2_1_3.s_2 = r_0_0_2_1_3_2;\n }\n {\n S_a55eb82d memory r_0_0_2_1_3_3;\n {\n bytes31 r_0_0_2_1_3_3_0 = bytes31(0x18863b8b339012d809b98142942d7057915e6f5b3b625e9c64b9ffd31bb8ac);\n r_0_0_2_1_3_3.s_0 = r_0_0_2_1_3_3_0;\n }\n {\n S_770db331 memory r_0_0_2_1_3_3_1;\n {\n string memory r_0_0_2_1_3_3_1_0 = unicode\"Moo é🚀MM \";\n r_0_0_2_1_3_3_1.s_0 = r_0_0_2_1_3_3_1_0;\n }\n {\n bytes17 r_0_0_2_1_3_3_1_1 = bytes17(0x2aea2b820e8dfca5d26a675335944badcf);\n r_0_0_2_1_3_3_1.s_1 = r_0_0_2_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_0_0_2_1_3_3_1_2 = new S_5758d412[3][](0);\n r_0_0_2_1_3_3_1.s_2 = r_0_0_2_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_0_0_2_1_3_3_1_3;\n {\n S_d8e64867 memory r_0_0_2_1_3_3_1_3_0;\n {\n bytes31 r_0_0_2_1_3_3_1_3_0_0 = bytes31(0x7e5de7c2e33b38f32447900ca4420d0e255b08c343517d2504d64581feb2e6);\n r_0_0_2_1_3_3_1_3_0.s_0 = r_0_0_2_1_3_3_1_3_0_0;\n }\n {\n uint104 r_0_0_2_1_3_3_1_3_0_1 = 8286211808974415723761821562562;\n r_0_0_2_1_3_3_1_3_0.s_1 = r_0_0_2_1_3_3_1_3_0_1;\n }\n r_0_0_2_1_3_3_1_3[0] = r_0_0_2_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_0_0_2_1_3_3_1_3_1;\n {\n bytes31 r_0_0_2_1_3_3_1_3_1_0 = bytes31(0x6c4f2f5c1814515150ce9b74b2057cdac529c6c73269b96000196d7628df1a);\n r_0_0_2_1_3_3_1_3_1.s_0 = r_0_0_2_1_3_3_1_3_1_0;\n }\n {\n uint104 r_0_0_2_1_3_3_1_3_1_1 = 3417562814199303548836001735486;\n r_0_0_2_1_3_3_1_3_1.s_1 = r_0_0_2_1_3_3_1_3_1_1;\n }\n r_0_0_2_1_3_3_1_3[1] = r_0_0_2_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_0_0_2_1_3_3_1_3_2;\n {\n bytes31 r_0_0_2_1_3_3_1_3_2_0 = bytes31(0x35fc69846197173e24beb7c054125f739dadc8525e64368dc39e86ea7df9de);\n r_0_0_2_1_3_3_1_3_2.s_0 = r_0_0_2_1_3_3_1_3_2_0;\n }\n {\n uint104 r_0_0_2_1_3_3_1_3_2_1 = 18011624044238526319942890898687;\n r_0_0_2_1_3_3_1_3_2.s_1 = r_0_0_2_1_3_3_1_3_2_1;\n }\n r_0_0_2_1_3_3_1_3[2] = r_0_0_2_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_0_0_2_1_3_3_1_3_3;\n {\n bytes31 r_0_0_2_1_3_3_1_3_3_0 = bytes31(0x42f0058d747f79ab9ea3c6eebccd31062d143c2658ee554a5e991dc87dd26e);\n r_0_0_2_1_3_3_1_3_3.s_0 = r_0_0_2_1_3_3_1_3_3_0;\n }\n {\n uint104 r_0_0_2_1_3_3_1_3_3_1 = 2815035757122382850575985213136;\n r_0_0_2_1_3_3_1_3_3.s_1 = r_0_0_2_1_3_3_1_3_3_1;\n }\n r_0_0_2_1_3_3_1_3[3] = r_0_0_2_1_3_3_1_3_3;\n }\n r_0_0_2_1_3_3_1.s_3 = r_0_0_2_1_3_3_1_3;\n }\n {\n uint48 r_0_0_2_1_3_3_1_4 = 276412360348032;\n r_0_0_2_1_3_3_1.s_4 = r_0_0_2_1_3_3_1_4;\n }\n r_0_0_2_1_3_3.s_1 = r_0_0_2_1_3_3_1;\n }\n r_0_0_2_1_3.s_3 = r_0_0_2_1_3_3;\n }\n r_0_0_2_1.s_3 = r_0_0_2_1_3;\n }\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n {\n string memory r_0_0_2_2 = unicode\"Moo é🚀o ooooMéé MéMM ooMo éoéMoé 🚀oMéMM é M oMooo🚀éé oooééM \";\n r_0_0_2.s_2 = r_0_0_2_2;\n }\n r_0_0[2] = r_0_0_2;\n }\n {\n S_920026e8 memory r_0_0_3;\n {\n int32 r_0_0_3_0 = -1589091163;\n r_0_0_3.s_0 = r_0_0_3_0;\n }\n {\n S_c8d7c908 memory r_0_0_3_1;\n {\n uint56 r_0_0_3_1_0 = 10946574074863406;\n r_0_0_3_1.s_0 = r_0_0_3_1_0;\n }\n {\n bytes27 r_0_0_3_1_1 = bytes27(0x412af116c31a93b0d27258332e5af002ccc7dc69e661a1cec24493);\n r_0_0_3_1.s_1 = r_0_0_3_1_1;\n }\n {\n bool r_0_0_3_1_2 = true;\n r_0_0_3_1.s_2 = r_0_0_3_1_2;\n }\n {\n S_733a0ce7 memory r_0_0_3_1_3;\n {\n address r_0_0_3_1_3_0 = 0xa74d366A1c62AE724e42FD89B72Ee014c65c78DF;\n r_0_0_3_1_3.s_0 = r_0_0_3_1_3_0;\n }\n {\n bool r_0_0_3_1_3_1 = false;\n r_0_0_3_1_3.s_1 = r_0_0_3_1_3_1;\n }\n {\n S_25e98821 memory r_0_0_3_1_3_2;\n {\n bool r_0_0_3_1_3_2_0 = true;\n r_0_0_3_1_3_2.s_0 = r_0_0_3_1_3_2_0;\n }\n {\n bool r_0_0_3_1_3_2_1 = false;\n r_0_0_3_1_3_2.s_1 = r_0_0_3_1_3_2_1;\n }\n r_0_0_3_1_3.s_2 = r_0_0_3_1_3_2;\n }\n {\n S_a55eb82d memory r_0_0_3_1_3_3;\n {\n bytes31 r_0_0_3_1_3_3_0 = bytes31(0xcb80725b7c1cad31f47d3ee80c560b81e8a4dd2b295eb79056bf742310fc8b);\n r_0_0_3_1_3_3.s_0 = r_0_0_3_1_3_3_0;\n }\n {\n S_770db331 memory r_0_0_3_1_3_3_1;\n {\n string memory r_0_0_3_1_3_3_1_0 = unicode\"Moo é🚀é éMMoo éoo o 🚀oéMoM\";\n r_0_0_3_1_3_3_1.s_0 = r_0_0_3_1_3_3_1_0;\n }\n {\n bytes17 r_0_0_3_1_3_3_1_1 = bytes17(0xa930afe6e210b3bfcd09beb8346e9bdefa);\n r_0_0_3_1_3_3_1.s_1 = r_0_0_3_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_0_0_3_1_3_3_1_2 = new S_5758d412[3][](0);\n r_0_0_3_1_3_3_1.s_2 = r_0_0_3_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_0_0_3_1_3_3_1_3;\n {\n S_d8e64867 memory r_0_0_3_1_3_3_1_3_0;\n {\n bytes31 r_0_0_3_1_3_3_1_3_0_0 = bytes31(0xf582f681c34198affb98cc050e274ae77f43f9e0addbe1a1938e4623282b3a);\n r_0_0_3_1_3_3_1_3_0.s_0 = r_0_0_3_1_3_3_1_3_0_0;\n }\n {\n uint104 r_0_0_3_1_3_3_1_3_0_1 = 1573085793233808965640542414042;\n r_0_0_3_1_3_3_1_3_0.s_1 = r_0_0_3_1_3_3_1_3_0_1;\n }\n r_0_0_3_1_3_3_1_3[0] = r_0_0_3_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_0_0_3_1_3_3_1_3_1;\n {\n bytes31 r_0_0_3_1_3_3_1_3_1_0 = bytes31(0xfb22bdbc137f750cdbc42c8a9f571dd771e9e5738f668c1b7a5a3733b8a33b);\n r_0_0_3_1_3_3_1_3_1.s_0 = r_0_0_3_1_3_3_1_3_1_0;\n }\n {\n uint104 r_0_0_3_1_3_3_1_3_1_1 = 16611964371288393801231102109040;\n r_0_0_3_1_3_3_1_3_1.s_1 = r_0_0_3_1_3_3_1_3_1_1;\n }\n r_0_0_3_1_3_3_1_3[1] = r_0_0_3_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_0_0_3_1_3_3_1_3_2;\n {\n bytes31 r_0_0_3_1_3_3_1_3_2_0 = bytes31(0x3bf36e2756998fdb9e589406842585077db4effd2a919776e6b41303546e1a);\n r_0_0_3_1_3_3_1_3_2.s_0 = r_0_0_3_1_3_3_1_3_2_0;\n }\n {\n uint104 r_0_0_3_1_3_3_1_3_2_1 = 19814559038747150532004354758775;\n r_0_0_3_1_3_3_1_3_2.s_1 = r_0_0_3_1_3_3_1_3_2_1;\n }\n r_0_0_3_1_3_3_1_3[2] = r_0_0_3_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_0_0_3_1_3_3_1_3_3;\n {\n bytes31 r_0_0_3_1_3_3_1_3_3_0 = bytes31(0xc97d5a7d513773d4ff04089a762c02aafdc49bc58717147150315948c3f640);\n r_0_0_3_1_3_3_1_3_3.s_0 = r_0_0_3_1_3_3_1_3_3_0;\n }\n {\n uint104 r_0_0_3_1_3_3_1_3_3_1 = 10316353148491318811956024938102;\n r_0_0_3_1_3_3_1_3_3.s_1 = r_0_0_3_1_3_3_1_3_3_1;\n }\n r_0_0_3_1_3_3_1_3[3] = r_0_0_3_1_3_3_1_3_3;\n }\n r_0_0_3_1_3_3_1.s_3 = r_0_0_3_1_3_3_1_3;\n }\n {\n uint48 r_0_0_3_1_3_3_1_4 = 33295012599608;\n r_0_0_3_1_3_3_1.s_4 = r_0_0_3_1_3_3_1_4;\n }\n r_0_0_3_1_3_3.s_1 = r_0_0_3_1_3_3_1;\n }\n r_0_0_3_1_3.s_3 = r_0_0_3_1_3_3;\n }\n r_0_0_3_1.s_3 = r_0_0_3_1_3;\n }\n r_0_0_3.s_1 = r_0_0_3_1;\n }\n {\n string memory r_0_0_3_2 = unicode\"Moo é🚀 é oooéo ooéoo🚀oé🚀ooéM MMé ooMé🚀o o 🚀oo\";\n r_0_0_3.s_2 = r_0_0_3_2;\n }\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n r[0] = r_0;\n }\n {\n S_920026e8[4][1] memory r_1;\n {\n S_920026e8[4] memory r_1_0;\n {\n S_920026e8 memory r_1_0_0;\n {\n int32 r_1_0_0_0 = 1476853243;\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n S_c8d7c908 memory r_1_0_0_1;\n {\n uint56 r_1_0_0_1_0 = 60467477827986915;\n r_1_0_0_1.s_0 = r_1_0_0_1_0;\n }\n {\n bytes27 r_1_0_0_1_1 = bytes27(0x5332806576af8ec3d590461298d7f8128825a22aba5d48db506b25);\n r_1_0_0_1.s_1 = r_1_0_0_1_1;\n }\n {\n bool r_1_0_0_1_2 = false;\n r_1_0_0_1.s_2 = r_1_0_0_1_2;\n }\n {\n S_733a0ce7 memory r_1_0_0_1_3;\n {\n address r_1_0_0_1_3_0 = 0xb696E384D6829658BFB71D4B88BBBF321Ff97773;\n r_1_0_0_1_3.s_0 = r_1_0_0_1_3_0;\n }\n {\n bool r_1_0_0_1_3_1 = false;\n r_1_0_0_1_3.s_1 = r_1_0_0_1_3_1;\n }\n {\n S_25e98821 memory r_1_0_0_1_3_2;\n {\n bool r_1_0_0_1_3_2_0 = false;\n r_1_0_0_1_3_2.s_0 = r_1_0_0_1_3_2_0;\n }\n {\n bool r_1_0_0_1_3_2_1 = true;\n r_1_0_0_1_3_2.s_1 = r_1_0_0_1_3_2_1;\n }\n r_1_0_0_1_3.s_2 = r_1_0_0_1_3_2;\n }\n {\n S_a55eb82d memory r_1_0_0_1_3_3;\n {\n bytes31 r_1_0_0_1_3_3_0 = bytes31(0x18729c2de78d8688c6ce47b17f62183da5d66fcc5037317ce617a5ade2f33b);\n r_1_0_0_1_3_3.s_0 = r_1_0_0_1_3_3_0;\n }\n {\n S_770db331 memory r_1_0_0_1_3_3_1;\n {\n string memory r_1_0_0_1_3_3_1_0 = unicode\"Moo é🚀M ooo🚀o\";\n r_1_0_0_1_3_3_1.s_0 = r_1_0_0_1_3_3_1_0;\n }\n {\n bytes17 r_1_0_0_1_3_3_1_1 = bytes17(0x26b07b89792f6dc10a054ca5f625b67eab);\n r_1_0_0_1_3_3_1.s_1 = r_1_0_0_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_1_0_0_1_3_3_1_2 = new S_5758d412[3][](0);\n r_1_0_0_1_3_3_1.s_2 = r_1_0_0_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_1_0_0_1_3_3_1_3;\n {\n S_d8e64867 memory r_1_0_0_1_3_3_1_3_0;\n {\n bytes31 r_1_0_0_1_3_3_1_3_0_0 = bytes31(0xd3dab3151aaf56c3f4d62e2850a08f68bb168a0e2b6f2f239c42afb1a5dc97);\n r_1_0_0_1_3_3_1_3_0.s_0 = r_1_0_0_1_3_3_1_3_0_0;\n }\n {\n uint104 r_1_0_0_1_3_3_1_3_0_1 = 6872418091216598016862177004896;\n r_1_0_0_1_3_3_1_3_0.s_1 = r_1_0_0_1_3_3_1_3_0_1;\n }\n r_1_0_0_1_3_3_1_3[0] = r_1_0_0_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_1_0_0_1_3_3_1_3_1;\n {\n bytes31 r_1_0_0_1_3_3_1_3_1_0 = bytes31(0x47c1dc43c86c201aa67a63dfe1304ce7e5133eebe45c296c6ddb64d08263b9);\n r_1_0_0_1_3_3_1_3_1.s_0 = r_1_0_0_1_3_3_1_3_1_0;\n }\n {\n uint104 r_1_0_0_1_3_3_1_3_1_1 = 10006911296464363614555990793596;\n r_1_0_0_1_3_3_1_3_1.s_1 = r_1_0_0_1_3_3_1_3_1_1;\n }\n r_1_0_0_1_3_3_1_3[1] = r_1_0_0_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_1_0_0_1_3_3_1_3_2;\n {\n bytes31 r_1_0_0_1_3_3_1_3_2_0 = bytes31(0xfd7546ab959bba86a811b06891a91d2650f3576f09a7e1d289b61ff5f1e377);\n r_1_0_0_1_3_3_1_3_2.s_0 = r_1_0_0_1_3_3_1_3_2_0;\n }\n {\n uint104 r_1_0_0_1_3_3_1_3_2_1 = 3801943204431408774802283769269;\n r_1_0_0_1_3_3_1_3_2.s_1 = r_1_0_0_1_3_3_1_3_2_1;\n }\n r_1_0_0_1_3_3_1_3[2] = r_1_0_0_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_1_0_0_1_3_3_1_3_3;\n {\n bytes31 r_1_0_0_1_3_3_1_3_3_0 = bytes31(0xf158360981592577dcb27ec15e3e3b4b93772c9dcf893cafdbce2ec1832f64);\n r_1_0_0_1_3_3_1_3_3.s_0 = r_1_0_0_1_3_3_1_3_3_0;\n }\n {\n uint104 r_1_0_0_1_3_3_1_3_3_1 = 13068490283941365693850383167407;\n r_1_0_0_1_3_3_1_3_3.s_1 = r_1_0_0_1_3_3_1_3_3_1;\n }\n r_1_0_0_1_3_3_1_3[3] = r_1_0_0_1_3_3_1_3_3;\n }\n r_1_0_0_1_3_3_1.s_3 = r_1_0_0_1_3_3_1_3;\n }\n {\n uint48 r_1_0_0_1_3_3_1_4 = 216953581947454;\n r_1_0_0_1_3_3_1.s_4 = r_1_0_0_1_3_3_1_4;\n }\n r_1_0_0_1_3_3.s_1 = r_1_0_0_1_3_3_1;\n }\n r_1_0_0_1_3.s_3 = r_1_0_0_1_3_3;\n }\n r_1_0_0_1.s_3 = r_1_0_0_1_3;\n }\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n string memory r_1_0_0_2 = unicode\"Moo é🚀ooéM🚀 oééoo🚀ooo🚀 o Mé Mé oo🚀Mo M🚀Mo🚀éo🚀oMooo🚀 🚀MMoo\";\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n S_920026e8 memory r_1_0_1;\n {\n int32 r_1_0_1_0 = 747420445;\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n S_c8d7c908 memory r_1_0_1_1;\n {\n uint56 r_1_0_1_1_0 = 16188566180546682;\n r_1_0_1_1.s_0 = r_1_0_1_1_0;\n }\n {\n bytes27 r_1_0_1_1_1 = bytes27(0x860b14b2e17b3fd6cd1634596166f9a76cefd3de0b605ab9512b0e);\n r_1_0_1_1.s_1 = r_1_0_1_1_1;\n }\n {\n bool r_1_0_1_1_2 = true;\n r_1_0_1_1.s_2 = r_1_0_1_1_2;\n }\n {\n S_733a0ce7 memory r_1_0_1_1_3;\n {\n address r_1_0_1_1_3_0 = 0x096563133d098C6cDB92D8af284ae57e06741593;\n r_1_0_1_1_3.s_0 = r_1_0_1_1_3_0;\n }\n {\n bool r_1_0_1_1_3_1 = true;\n r_1_0_1_1_3.s_1 = r_1_0_1_1_3_1;\n }\n {\n S_25e98821 memory r_1_0_1_1_3_2;\n {\n bool r_1_0_1_1_3_2_0 = true;\n r_1_0_1_1_3_2.s_0 = r_1_0_1_1_3_2_0;\n }\n {\n bool r_1_0_1_1_3_2_1 = false;\n r_1_0_1_1_3_2.s_1 = r_1_0_1_1_3_2_1;\n }\n r_1_0_1_1_3.s_2 = r_1_0_1_1_3_2;\n }\n {\n S_a55eb82d memory r_1_0_1_1_3_3;\n {\n bytes31 r_1_0_1_1_3_3_0 = bytes31(0x6bf5b4a9ebe952fa7b8f9c4af1cd5a5d36834e99aff65611ac2085e6085bd9);\n r_1_0_1_1_3_3.s_0 = r_1_0_1_1_3_3_0;\n }\n {\n S_770db331 memory r_1_0_1_1_3_3_1;\n {\n string memory r_1_0_1_1_3_3_1_0 = unicode\"Moo é🚀éMo MoooéMéo🚀M é\";\n r_1_0_1_1_3_3_1.s_0 = r_1_0_1_1_3_3_1_0;\n }\n {\n bytes17 r_1_0_1_1_3_3_1_1 = bytes17(0xbf51bb827ad140cd939d46eeb58884c043);\n r_1_0_1_1_3_3_1.s_1 = r_1_0_1_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_1_0_1_1_3_3_1_2 = new S_5758d412[3][](3);\n {\n S_5758d412[3] memory r_1_0_1_1_3_3_1_2_0;\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_0_0_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_0_0_0_0 = 778368575929596687322604;\n r_1_0_1_1_3_3_1_2_0_0_0.s_0 = r_1_0_1_1_3_3_1_2_0_0_0_0;\n }\n r_1_0_1_1_3_3_1_2_0_0.s_0 = r_1_0_1_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀🚀oooM🚀é 🚀éooooM🚀o🚀MMoéoMM🚀ooéoM🚀é o oéoé MMooé🚀 Mé\";\n r_1_0_1_1_3_3_1_2_0_0.s_1 = r_1_0_1_1_3_3_1_2_0_0_1;\n }\n r_1_0_1_1_3_3_1_2_0[0] = r_1_0_1_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_0_1_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_0_1_0_0 = 829843186055021846451034;\n r_1_0_1_1_3_3_1_2_0_1_0.s_0 = r_1_0_1_1_3_3_1_2_0_1_0_0;\n }\n r_1_0_1_1_3_3_1_2_0_1.s_0 = r_1_0_1_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀M🚀éM M o 🚀é🚀éé ooéMoé MM🚀Mo🚀o🚀MMM🚀🚀 Mo\";\n r_1_0_1_1_3_3_1_2_0_1.s_1 = r_1_0_1_1_3_3_1_2_0_1_1;\n }\n r_1_0_1_1_3_3_1_2_0[1] = r_1_0_1_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_0_2_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_0_2_0_0 = 361770595238878083926428;\n r_1_0_1_1_3_3_1_2_0_2_0.s_0 = r_1_0_1_1_3_3_1_2_0_2_0_0;\n }\n r_1_0_1_1_3_3_1_2_0_2.s_0 = r_1_0_1_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀 🚀\";\n r_1_0_1_1_3_3_1_2_0_2.s_1 = r_1_0_1_1_3_3_1_2_0_2_1;\n }\n r_1_0_1_1_3_3_1_2_0[2] = r_1_0_1_1_3_3_1_2_0_2;\n }\n r_1_0_1_1_3_3_1_2[0] = r_1_0_1_1_3_3_1_2_0;\n }\n {\n S_5758d412[3] memory r_1_0_1_1_3_3_1_2_1;\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_1_0;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_1_0_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_1_0_0_0 = 141486280541489331339031;\n r_1_0_1_1_3_3_1_2_1_0_0.s_0 = r_1_0_1_1_3_3_1_2_1_0_0_0;\n }\n r_1_0_1_1_3_3_1_2_1_0.s_0 = r_1_0_1_1_3_3_1_2_1_0_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_1_0_1 = unicode\"Moo é🚀o🚀oo🚀é oé ééo\";\n r_1_0_1_1_3_3_1_2_1_0.s_1 = r_1_0_1_1_3_3_1_2_1_0_1;\n }\n r_1_0_1_1_3_3_1_2_1[0] = r_1_0_1_1_3_3_1_2_1_0;\n }\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_1_1;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_1_1_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_1_1_0_0 = 259028910893327677202134;\n r_1_0_1_1_3_3_1_2_1_1_0.s_0 = r_1_0_1_1_3_3_1_2_1_1_0_0;\n }\n r_1_0_1_1_3_3_1_2_1_1.s_0 = r_1_0_1_1_3_3_1_2_1_1_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_1_1_1 = unicode\"Moo é🚀 o oé🚀oMMMo🚀🚀 🚀oMoéMoMo🚀\";\n r_1_0_1_1_3_3_1_2_1_1.s_1 = r_1_0_1_1_3_3_1_2_1_1_1;\n }\n r_1_0_1_1_3_3_1_2_1[1] = r_1_0_1_1_3_3_1_2_1_1;\n }\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_1_2;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_1_2_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_1_2_0_0 = 1133757143313620214830831;\n r_1_0_1_1_3_3_1_2_1_2_0.s_0 = r_1_0_1_1_3_3_1_2_1_2_0_0;\n }\n r_1_0_1_1_3_3_1_2_1_2.s_0 = r_1_0_1_1_3_3_1_2_1_2_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_1_2_1 = unicode\"Moo é🚀o éo éMé🚀o M🚀o🚀oM MMoMM o éo éo🚀🚀oMM 🚀🚀ooMéoMo\";\n r_1_0_1_1_3_3_1_2_1_2.s_1 = r_1_0_1_1_3_3_1_2_1_2_1;\n }\n r_1_0_1_1_3_3_1_2_1[2] = r_1_0_1_1_3_3_1_2_1_2;\n }\n r_1_0_1_1_3_3_1_2[1] = r_1_0_1_1_3_3_1_2_1;\n }\n {\n S_5758d412[3] memory r_1_0_1_1_3_3_1_2_2;\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_2_0;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_2_0_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_2_0_0_0 = 601096245887659086830207;\n r_1_0_1_1_3_3_1_2_2_0_0.s_0 = r_1_0_1_1_3_3_1_2_2_0_0_0;\n }\n r_1_0_1_1_3_3_1_2_2_0.s_0 = r_1_0_1_1_3_3_1_2_2_0_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_2_0_1 = unicode\"Moo é🚀Mooo🚀 éooMoé🚀éo\";\n r_1_0_1_1_3_3_1_2_2_0.s_1 = r_1_0_1_1_3_3_1_2_2_0_1;\n }\n r_1_0_1_1_3_3_1_2_2[0] = r_1_0_1_1_3_3_1_2_2_0;\n }\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_2_1;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_2_1_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_2_1_0_0 = 1098442981598804116546650;\n r_1_0_1_1_3_3_1_2_2_1_0.s_0 = r_1_0_1_1_3_3_1_2_2_1_0_0;\n }\n r_1_0_1_1_3_3_1_2_2_1.s_0 = r_1_0_1_1_3_3_1_2_2_1_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_2_1_1 = unicode\"Moo é🚀oM🚀🚀éoMMM🚀🚀oooéoooMéMo🚀oMéMoé🚀oMo🚀 éo🚀 ooo 🚀éoé🚀o\";\n r_1_0_1_1_3_3_1_2_2_1.s_1 = r_1_0_1_1_3_3_1_2_2_1_1;\n }\n r_1_0_1_1_3_3_1_2_2[1] = r_1_0_1_1_3_3_1_2_2_1;\n }\n {\n S_5758d412 memory r_1_0_1_1_3_3_1_2_2_2;\n {\n S_54896afd memory r_1_0_1_1_3_3_1_2_2_2_0;\n {\n uint80 r_1_0_1_1_3_3_1_2_2_2_0_0 = 341624200395660190621777;\n r_1_0_1_1_3_3_1_2_2_2_0.s_0 = r_1_0_1_1_3_3_1_2_2_2_0_0;\n }\n r_1_0_1_1_3_3_1_2_2_2.s_0 = r_1_0_1_1_3_3_1_2_2_2_0;\n }\n {\n string memory r_1_0_1_1_3_3_1_2_2_2_1 = unicode\"Moo é🚀🚀oé🚀M🚀ooéééMo ooMéM🚀oo🚀Moo M🚀🚀🚀o🚀oo 🚀oMo🚀é o M🚀\";\n r_1_0_1_1_3_3_1_2_2_2.s_1 = r_1_0_1_1_3_3_1_2_2_2_1;\n }\n r_1_0_1_1_3_3_1_2_2[2] = r_1_0_1_1_3_3_1_2_2_2;\n }\n r_1_0_1_1_3_3_1_2[2] = r_1_0_1_1_3_3_1_2_2;\n }\n r_1_0_1_1_3_3_1.s_2 = r_1_0_1_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_1_0_1_1_3_3_1_3;\n {\n S_d8e64867 memory r_1_0_1_1_3_3_1_3_0;\n {\n bytes31 r_1_0_1_1_3_3_1_3_0_0 = bytes31(0xc28f97501f7791652fb45bb3d9976991bedac8ddf291eade2581dcc10dcf62);\n r_1_0_1_1_3_3_1_3_0.s_0 = r_1_0_1_1_3_3_1_3_0_0;\n }\n {\n uint104 r_1_0_1_1_3_3_1_3_0_1 = 7046739415477862561695982978854;\n r_1_0_1_1_3_3_1_3_0.s_1 = r_1_0_1_1_3_3_1_3_0_1;\n }\n r_1_0_1_1_3_3_1_3[0] = r_1_0_1_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_1_0_1_1_3_3_1_3_1;\n {\n bytes31 r_1_0_1_1_3_3_1_3_1_0 = bytes31(0x4d41991d972b7c188164e117804b6339c4e0347122b0189b8503ef38892b28);\n r_1_0_1_1_3_3_1_3_1.s_0 = r_1_0_1_1_3_3_1_3_1_0;\n }\n {\n uint104 r_1_0_1_1_3_3_1_3_1_1 = 20246486506681101723782299644808;\n r_1_0_1_1_3_3_1_3_1.s_1 = r_1_0_1_1_3_3_1_3_1_1;\n }\n r_1_0_1_1_3_3_1_3[1] = r_1_0_1_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_1_0_1_1_3_3_1_3_2;\n {\n bytes31 r_1_0_1_1_3_3_1_3_2_0 = bytes31(0xbd58cef4a779fd62899c2c85e99373c3b7e387394dc1a389e38c9a68866e5b);\n r_1_0_1_1_3_3_1_3_2.s_0 = r_1_0_1_1_3_3_1_3_2_0;\n }\n {\n uint104 r_1_0_1_1_3_3_1_3_2_1 = 2405135291133471726241251808659;\n r_1_0_1_1_3_3_1_3_2.s_1 = r_1_0_1_1_3_3_1_3_2_1;\n }\n r_1_0_1_1_3_3_1_3[2] = r_1_0_1_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_1_0_1_1_3_3_1_3_3;\n {\n bytes31 r_1_0_1_1_3_3_1_3_3_0 = bytes31(0xd8690ec22dfafe6dc7c6ba7e040bbca489b51c01b046eb15613743edd44e64);\n r_1_0_1_1_3_3_1_3_3.s_0 = r_1_0_1_1_3_3_1_3_3_0;\n }\n {\n uint104 r_1_0_1_1_3_3_1_3_3_1 = 12233201482784658931643004358966;\n r_1_0_1_1_3_3_1_3_3.s_1 = r_1_0_1_1_3_3_1_3_3_1;\n }\n r_1_0_1_1_3_3_1_3[3] = r_1_0_1_1_3_3_1_3_3;\n }\n r_1_0_1_1_3_3_1.s_3 = r_1_0_1_1_3_3_1_3;\n }\n {\n uint48 r_1_0_1_1_3_3_1_4 = 93747656736920;\n r_1_0_1_1_3_3_1.s_4 = r_1_0_1_1_3_3_1_4;\n }\n r_1_0_1_1_3_3.s_1 = r_1_0_1_1_3_3_1;\n }\n r_1_0_1_1_3.s_3 = r_1_0_1_1_3_3;\n }\n r_1_0_1_1.s_3 = r_1_0_1_1_3;\n }\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n {\n string memory r_1_0_1_2 = unicode\"Moo é🚀ooo🚀 M🚀oMMé 🚀M🚀éo🚀oo ooM é🚀oooéé éééooéo🚀o🚀ooéo o o o🚀o\";\n r_1_0_1.s_2 = r_1_0_1_2;\n }\n r_1_0[1] = r_1_0_1;\n }\n {\n S_920026e8 memory r_1_0_2;\n {\n int32 r_1_0_2_0 = 918624151;\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n S_c8d7c908 memory r_1_0_2_1;\n {\n uint56 r_1_0_2_1_0 = 56486694906339737;\n r_1_0_2_1.s_0 = r_1_0_2_1_0;\n }\n {\n bytes27 r_1_0_2_1_1 = bytes27(0x0ce34271c85d1f7ad57d1f3565af13198555b24f5c469c7c8d1670);\n r_1_0_2_1.s_1 = r_1_0_2_1_1;\n }\n {\n bool r_1_0_2_1_2 = true;\n r_1_0_2_1.s_2 = r_1_0_2_1_2;\n }\n {\n S_733a0ce7 memory r_1_0_2_1_3;\n {\n address r_1_0_2_1_3_0 = 0x52381eb8042518cfCD935a58DeC4334c3F97489E;\n r_1_0_2_1_3.s_0 = r_1_0_2_1_3_0;\n }\n {\n bool r_1_0_2_1_3_1 = true;\n r_1_0_2_1_3.s_1 = r_1_0_2_1_3_1;\n }\n {\n S_25e98821 memory r_1_0_2_1_3_2;\n {\n bool r_1_0_2_1_3_2_0 = false;\n r_1_0_2_1_3_2.s_0 = r_1_0_2_1_3_2_0;\n }\n {\n bool r_1_0_2_1_3_2_1 = false;\n r_1_0_2_1_3_2.s_1 = r_1_0_2_1_3_2_1;\n }\n r_1_0_2_1_3.s_2 = r_1_0_2_1_3_2;\n }\n {\n S_a55eb82d memory r_1_0_2_1_3_3;\n {\n bytes31 r_1_0_2_1_3_3_0 = bytes31(0xb547c7cfcd6b78f66b4eecfdea431273018a3671ef8d68065a8edc201c233b);\n r_1_0_2_1_3_3.s_0 = r_1_0_2_1_3_3_0;\n }\n {\n S_770db331 memory r_1_0_2_1_3_3_1;\n {\n string memory r_1_0_2_1_3_3_1_0 = unicode\"Moo é🚀ooéo o🚀MéoMMé 🚀oé🚀🚀o M éooéMé éoééoé\";\n r_1_0_2_1_3_3_1.s_0 = r_1_0_2_1_3_3_1_0;\n }\n {\n bytes17 r_1_0_2_1_3_3_1_1 = bytes17(0x3f68e27ce7b2ad3ef0f90b12fef74c3aa3);\n r_1_0_2_1_3_3_1.s_1 = r_1_0_2_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_1_0_2_1_3_3_1_2 = new S_5758d412[3][](4);\n {\n S_5758d412[3] memory r_1_0_2_1_3_3_1_2_0;\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_0_0_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_0_0_0_0 = 649705950308356913956615;\n r_1_0_2_1_3_3_1_2_0_0_0.s_0 = r_1_0_2_1_3_3_1_2_0_0_0_0;\n }\n r_1_0_2_1_3_3_1_2_0_0.s_0 = r_1_0_2_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀éooooo🚀oéMMoo éo é ééééo\";\n r_1_0_2_1_3_3_1_2_0_0.s_1 = r_1_0_2_1_3_3_1_2_0_0_1;\n }\n r_1_0_2_1_3_3_1_2_0[0] = r_1_0_2_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_0_1_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_0_1_0_0 = 58468454581933630711541;\n r_1_0_2_1_3_3_1_2_0_1_0.s_0 = r_1_0_2_1_3_3_1_2_0_1_0_0;\n }\n r_1_0_2_1_3_3_1_2_0_1.s_0 = r_1_0_2_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀 Mooooéooéé🚀o🚀o oM Moo🚀Mo ééoo oéoooo🚀ooé🚀 ooM \";\n r_1_0_2_1_3_3_1_2_0_1.s_1 = r_1_0_2_1_3_3_1_2_0_1_1;\n }\n r_1_0_2_1_3_3_1_2_0[1] = r_1_0_2_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_0_2_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_0_2_0_0 = 469311536106426346369599;\n r_1_0_2_1_3_3_1_2_0_2_0.s_0 = r_1_0_2_1_3_3_1_2_0_2_0_0;\n }\n r_1_0_2_1_3_3_1_2_0_2.s_0 = r_1_0_2_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀🚀oM 🚀Moo MMMé oo oo🚀oo🚀oMMé M ooééoéMo é o\";\n r_1_0_2_1_3_3_1_2_0_2.s_1 = r_1_0_2_1_3_3_1_2_0_2_1;\n }\n r_1_0_2_1_3_3_1_2_0[2] = r_1_0_2_1_3_3_1_2_0_2;\n }\n r_1_0_2_1_3_3_1_2[0] = r_1_0_2_1_3_3_1_2_0;\n }\n {\n S_5758d412[3] memory r_1_0_2_1_3_3_1_2_1;\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_1_0;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_1_0_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_1_0_0_0 = 183883345857417564092205;\n r_1_0_2_1_3_3_1_2_1_0_0.s_0 = r_1_0_2_1_3_3_1_2_1_0_0_0;\n }\n r_1_0_2_1_3_3_1_2_1_0.s_0 = r_1_0_2_1_3_3_1_2_1_0_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_1_0_1 = unicode\"Moo é🚀Mé🚀oM🚀\";\n r_1_0_2_1_3_3_1_2_1_0.s_1 = r_1_0_2_1_3_3_1_2_1_0_1;\n }\n r_1_0_2_1_3_3_1_2_1[0] = r_1_0_2_1_3_3_1_2_1_0;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_1_1;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_1_1_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_1_1_0_0 = 706959299831709797717431;\n r_1_0_2_1_3_3_1_2_1_1_0.s_0 = r_1_0_2_1_3_3_1_2_1_1_0_0;\n }\n r_1_0_2_1_3_3_1_2_1_1.s_0 = r_1_0_2_1_3_3_1_2_1_1_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_1_1_1 = unicode\"Moo é🚀\";\n r_1_0_2_1_3_3_1_2_1_1.s_1 = r_1_0_2_1_3_3_1_2_1_1_1;\n }\n r_1_0_2_1_3_3_1_2_1[1] = r_1_0_2_1_3_3_1_2_1_1;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_1_2;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_1_2_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_1_2_0_0 = 127672568362815957964762;\n r_1_0_2_1_3_3_1_2_1_2_0.s_0 = r_1_0_2_1_3_3_1_2_1_2_0_0;\n }\n r_1_0_2_1_3_3_1_2_1_2.s_0 = r_1_0_2_1_3_3_1_2_1_2_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_1_2_1 = unicode\"Moo é🚀éMo🚀ééoéMéo🚀o🚀\";\n r_1_0_2_1_3_3_1_2_1_2.s_1 = r_1_0_2_1_3_3_1_2_1_2_1;\n }\n r_1_0_2_1_3_3_1_2_1[2] = r_1_0_2_1_3_3_1_2_1_2;\n }\n r_1_0_2_1_3_3_1_2[1] = r_1_0_2_1_3_3_1_2_1;\n }\n {\n S_5758d412[3] memory r_1_0_2_1_3_3_1_2_2;\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_2_0;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_2_0_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_2_0_0_0 = 530031133160340027734252;\n r_1_0_2_1_3_3_1_2_2_0_0.s_0 = r_1_0_2_1_3_3_1_2_2_0_0_0;\n }\n r_1_0_2_1_3_3_1_2_2_0.s_0 = r_1_0_2_1_3_3_1_2_2_0_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_2_0_1 = unicode\"Moo é🚀\";\n r_1_0_2_1_3_3_1_2_2_0.s_1 = r_1_0_2_1_3_3_1_2_2_0_1;\n }\n r_1_0_2_1_3_3_1_2_2[0] = r_1_0_2_1_3_3_1_2_2_0;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_2_1;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_2_1_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_2_1_0_0 = 836123641572017954708367;\n r_1_0_2_1_3_3_1_2_2_1_0.s_0 = r_1_0_2_1_3_3_1_2_2_1_0_0;\n }\n r_1_0_2_1_3_3_1_2_2_1.s_0 = r_1_0_2_1_3_3_1_2_2_1_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_2_1_1 = unicode\"Moo é🚀o🚀🚀 🚀🚀o Mo🚀MééoMéoM🚀o🚀MéoooM🚀\";\n r_1_0_2_1_3_3_1_2_2_1.s_1 = r_1_0_2_1_3_3_1_2_2_1_1;\n }\n r_1_0_2_1_3_3_1_2_2[1] = r_1_0_2_1_3_3_1_2_2_1;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_2_2;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_2_2_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_2_2_0_0 = 404840947105315220766498;\n r_1_0_2_1_3_3_1_2_2_2_0.s_0 = r_1_0_2_1_3_3_1_2_2_2_0_0;\n }\n r_1_0_2_1_3_3_1_2_2_2.s_0 = r_1_0_2_1_3_3_1_2_2_2_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_2_2_1 = unicode\"Moo é🚀oé o🚀oo\";\n r_1_0_2_1_3_3_1_2_2_2.s_1 = r_1_0_2_1_3_3_1_2_2_2_1;\n }\n r_1_0_2_1_3_3_1_2_2[2] = r_1_0_2_1_3_3_1_2_2_2;\n }\n r_1_0_2_1_3_3_1_2[2] = r_1_0_2_1_3_3_1_2_2;\n }\n {\n S_5758d412[3] memory r_1_0_2_1_3_3_1_2_3;\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_3_0;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_3_0_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_3_0_0_0 = 512886782297741481563198;\n r_1_0_2_1_3_3_1_2_3_0_0.s_0 = r_1_0_2_1_3_3_1_2_3_0_0_0;\n }\n r_1_0_2_1_3_3_1_2_3_0.s_0 = r_1_0_2_1_3_3_1_2_3_0_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_3_0_1 = unicode\"Moo é🚀ooMé🚀ooo\";\n r_1_0_2_1_3_3_1_2_3_0.s_1 = r_1_0_2_1_3_3_1_2_3_0_1;\n }\n r_1_0_2_1_3_3_1_2_3[0] = r_1_0_2_1_3_3_1_2_3_0;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_3_1;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_3_1_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_3_1_0_0 = 130508694331430248070448;\n r_1_0_2_1_3_3_1_2_3_1_0.s_0 = r_1_0_2_1_3_3_1_2_3_1_0_0;\n }\n r_1_0_2_1_3_3_1_2_3_1.s_0 = r_1_0_2_1_3_3_1_2_3_1_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_3_1_1 = unicode\"Moo é🚀Mé 🚀oMéM🚀🚀oMéo oM\";\n r_1_0_2_1_3_3_1_2_3_1.s_1 = r_1_0_2_1_3_3_1_2_3_1_1;\n }\n r_1_0_2_1_3_3_1_2_3[1] = r_1_0_2_1_3_3_1_2_3_1;\n }\n {\n S_5758d412 memory r_1_0_2_1_3_3_1_2_3_2;\n {\n S_54896afd memory r_1_0_2_1_3_3_1_2_3_2_0;\n {\n uint80 r_1_0_2_1_3_3_1_2_3_2_0_0 = 484957477470614903403427;\n r_1_0_2_1_3_3_1_2_3_2_0.s_0 = r_1_0_2_1_3_3_1_2_3_2_0_0;\n }\n r_1_0_2_1_3_3_1_2_3_2.s_0 = r_1_0_2_1_3_3_1_2_3_2_0;\n }\n {\n string memory r_1_0_2_1_3_3_1_2_3_2_1 = unicode\"Moo é🚀🚀éoé\";\n r_1_0_2_1_3_3_1_2_3_2.s_1 = r_1_0_2_1_3_3_1_2_3_2_1;\n }\n r_1_0_2_1_3_3_1_2_3[2] = r_1_0_2_1_3_3_1_2_3_2;\n }\n r_1_0_2_1_3_3_1_2[3] = r_1_0_2_1_3_3_1_2_3;\n }\n r_1_0_2_1_3_3_1.s_2 = r_1_0_2_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_1_0_2_1_3_3_1_3;\n {\n S_d8e64867 memory r_1_0_2_1_3_3_1_3_0;\n {\n bytes31 r_1_0_2_1_3_3_1_3_0_0 = bytes31(0xe7ece7ae291cd0458a033985ada4c2fec400224a751c41f6447cf13301a401);\n r_1_0_2_1_3_3_1_3_0.s_0 = r_1_0_2_1_3_3_1_3_0_0;\n }\n {\n uint104 r_1_0_2_1_3_3_1_3_0_1 = 12927771394155598973762112288802;\n r_1_0_2_1_3_3_1_3_0.s_1 = r_1_0_2_1_3_3_1_3_0_1;\n }\n r_1_0_2_1_3_3_1_3[0] = r_1_0_2_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_1_0_2_1_3_3_1_3_1;\n {\n bytes31 r_1_0_2_1_3_3_1_3_1_0 = bytes31(0x255a667a600e5ee772487aa83888580271ad9d46ee529c5a50f6f3acb0b16f);\n r_1_0_2_1_3_3_1_3_1.s_0 = r_1_0_2_1_3_3_1_3_1_0;\n }\n {\n uint104 r_1_0_2_1_3_3_1_3_1_1 = 17266090260360266537560743786226;\n r_1_0_2_1_3_3_1_3_1.s_1 = r_1_0_2_1_3_3_1_3_1_1;\n }\n r_1_0_2_1_3_3_1_3[1] = r_1_0_2_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_1_0_2_1_3_3_1_3_2;\n {\n bytes31 r_1_0_2_1_3_3_1_3_2_0 = bytes31(0x0db78f003a4145bebf8fbd7fce49fb124592f6c0e551fdc45bb4aa2fd837c9);\n r_1_0_2_1_3_3_1_3_2.s_0 = r_1_0_2_1_3_3_1_3_2_0;\n }\n {\n uint104 r_1_0_2_1_3_3_1_3_2_1 = 8454111238309761354615382142430;\n r_1_0_2_1_3_3_1_3_2.s_1 = r_1_0_2_1_3_3_1_3_2_1;\n }\n r_1_0_2_1_3_3_1_3[2] = r_1_0_2_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_1_0_2_1_3_3_1_3_3;\n {\n bytes31 r_1_0_2_1_3_3_1_3_3_0 = bytes31(0x6c94b1caf5cae510639dc473a027026fecb07fee48304a13c1fe99817356cb);\n r_1_0_2_1_3_3_1_3_3.s_0 = r_1_0_2_1_3_3_1_3_3_0;\n }\n {\n uint104 r_1_0_2_1_3_3_1_3_3_1 = 5598719154263456989403668378468;\n r_1_0_2_1_3_3_1_3_3.s_1 = r_1_0_2_1_3_3_1_3_3_1;\n }\n r_1_0_2_1_3_3_1_3[3] = r_1_0_2_1_3_3_1_3_3;\n }\n r_1_0_2_1_3_3_1.s_3 = r_1_0_2_1_3_3_1_3;\n }\n {\n uint48 r_1_0_2_1_3_3_1_4 = 207026167236643;\n r_1_0_2_1_3_3_1.s_4 = r_1_0_2_1_3_3_1_4;\n }\n r_1_0_2_1_3_3.s_1 = r_1_0_2_1_3_3_1;\n }\n r_1_0_2_1_3.s_3 = r_1_0_2_1_3_3;\n }\n r_1_0_2_1.s_3 = r_1_0_2_1_3;\n }\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n {\n string memory r_1_0_2_2 = unicode\"Moo é🚀o🚀Méooé o\";\n r_1_0_2.s_2 = r_1_0_2_2;\n }\n r_1_0[2] = r_1_0_2;\n }\n {\n S_920026e8 memory r_1_0_3;\n {\n int32 r_1_0_3_0 = -1914892012;\n r_1_0_3.s_0 = r_1_0_3_0;\n }\n {\n S_c8d7c908 memory r_1_0_3_1;\n {\n uint56 r_1_0_3_1_0 = 20299934080799188;\n r_1_0_3_1.s_0 = r_1_0_3_1_0;\n }\n {\n bytes27 r_1_0_3_1_1 = bytes27(0x1d2e9d46924e4f5913d7830e45246d546111b393349a7e51408075);\n r_1_0_3_1.s_1 = r_1_0_3_1_1;\n }\n {\n bool r_1_0_3_1_2 = false;\n r_1_0_3_1.s_2 = r_1_0_3_1_2;\n }\n {\n S_733a0ce7 memory r_1_0_3_1_3;\n {\n address r_1_0_3_1_3_0 = 0xE197Af46E9E37C4a6895Ca782651DA6377E279BF;\n r_1_0_3_1_3.s_0 = r_1_0_3_1_3_0;\n }\n {\n bool r_1_0_3_1_3_1 = false;\n r_1_0_3_1_3.s_1 = r_1_0_3_1_3_1;\n }\n {\n S_25e98821 memory r_1_0_3_1_3_2;\n {\n bool r_1_0_3_1_3_2_0 = true;\n r_1_0_3_1_3_2.s_0 = r_1_0_3_1_3_2_0;\n }\n {\n bool r_1_0_3_1_3_2_1 = false;\n r_1_0_3_1_3_2.s_1 = r_1_0_3_1_3_2_1;\n }\n r_1_0_3_1_3.s_2 = r_1_0_3_1_3_2;\n }\n {\n S_a55eb82d memory r_1_0_3_1_3_3;\n {\n bytes31 r_1_0_3_1_3_3_0 = bytes31(0xa188b35c1d88ceb6ee0784da9e16e8e808c8c736520c4e4bb31de59d598f32);\n r_1_0_3_1_3_3.s_0 = r_1_0_3_1_3_3_0;\n }\n {\n S_770db331 memory r_1_0_3_1_3_3_1;\n {\n string memory r_1_0_3_1_3_3_1_0 = unicode\"Moo é🚀 o oé\";\n r_1_0_3_1_3_3_1.s_0 = r_1_0_3_1_3_3_1_0;\n }\n {\n bytes17 r_1_0_3_1_3_3_1_1 = bytes17(0x61a2d25a7d1a2179e68e410932c51efb9b);\n r_1_0_3_1_3_3_1.s_1 = r_1_0_3_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_1_0_3_1_3_3_1_2 = new S_5758d412[3][](2);\n {\n S_5758d412[3] memory r_1_0_3_1_3_3_1_2_0;\n {\n S_5758d412 memory r_1_0_3_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_1_0_3_1_3_3_1_2_0_0_0;\n {\n uint80 r_1_0_3_1_3_3_1_2_0_0_0_0 = 954032285101724101324237;\n r_1_0_3_1_3_3_1_2_0_0_0.s_0 = r_1_0_3_1_3_3_1_2_0_0_0_0;\n }\n r_1_0_3_1_3_3_1_2_0_0.s_0 = r_1_0_3_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_1_0_3_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀\";\n r_1_0_3_1_3_3_1_2_0_0.s_1 = r_1_0_3_1_3_3_1_2_0_0_1;\n }\n r_1_0_3_1_3_3_1_2_0[0] = r_1_0_3_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_1_0_3_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_1_0_3_1_3_3_1_2_0_1_0;\n {\n uint80 r_1_0_3_1_3_3_1_2_0_1_0_0 = 196730564305282248666853;\n r_1_0_3_1_3_3_1_2_0_1_0.s_0 = r_1_0_3_1_3_3_1_2_0_1_0_0;\n }\n r_1_0_3_1_3_3_1_2_0_1.s_0 = r_1_0_3_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_1_0_3_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀o🚀o éoMM \";\n r_1_0_3_1_3_3_1_2_0_1.s_1 = r_1_0_3_1_3_3_1_2_0_1_1;\n }\n r_1_0_3_1_3_3_1_2_0[1] = r_1_0_3_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_1_0_3_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_1_0_3_1_3_3_1_2_0_2_0;\n {\n uint80 r_1_0_3_1_3_3_1_2_0_2_0_0 = 603667938580924110880859;\n r_1_0_3_1_3_3_1_2_0_2_0.s_0 = r_1_0_3_1_3_3_1_2_0_2_0_0;\n }\n r_1_0_3_1_3_3_1_2_0_2.s_0 = r_1_0_3_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_1_0_3_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀 oéo éé 🚀oo \";\n r_1_0_3_1_3_3_1_2_0_2.s_1 = r_1_0_3_1_3_3_1_2_0_2_1;\n }\n r_1_0_3_1_3_3_1_2_0[2] = r_1_0_3_1_3_3_1_2_0_2;\n }\n r_1_0_3_1_3_3_1_2[0] = r_1_0_3_1_3_3_1_2_0;\n }\n {\n S_5758d412[3] memory r_1_0_3_1_3_3_1_2_1;\n {\n S_5758d412 memory r_1_0_3_1_3_3_1_2_1_0;\n {\n S_54896afd memory r_1_0_3_1_3_3_1_2_1_0_0;\n {\n uint80 r_1_0_3_1_3_3_1_2_1_0_0_0 = 1099728774289268466661399;\n r_1_0_3_1_3_3_1_2_1_0_0.s_0 = r_1_0_3_1_3_3_1_2_1_0_0_0;\n }\n r_1_0_3_1_3_3_1_2_1_0.s_0 = r_1_0_3_1_3_3_1_2_1_0_0;\n }\n {\n string memory r_1_0_3_1_3_3_1_2_1_0_1 = unicode\"Moo é🚀éo 🚀oMoéé o oMooooM🚀éé🚀🚀éo \";\n r_1_0_3_1_3_3_1_2_1_0.s_1 = r_1_0_3_1_3_3_1_2_1_0_1;\n }\n r_1_0_3_1_3_3_1_2_1[0] = r_1_0_3_1_3_3_1_2_1_0;\n }\n {\n S_5758d412 memory r_1_0_3_1_3_3_1_2_1_1;\n {\n S_54896afd memory r_1_0_3_1_3_3_1_2_1_1_0;\n {\n uint80 r_1_0_3_1_3_3_1_2_1_1_0_0 = 959612613096905308760943;\n r_1_0_3_1_3_3_1_2_1_1_0.s_0 = r_1_0_3_1_3_3_1_2_1_1_0_0;\n }\n r_1_0_3_1_3_3_1_2_1_1.s_0 = r_1_0_3_1_3_3_1_2_1_1_0;\n }\n {\n string memory r_1_0_3_1_3_3_1_2_1_1_1 = unicode\"Moo é🚀 🚀M Moooé🚀 oo M o oo 🚀o oé M\";\n r_1_0_3_1_3_3_1_2_1_1.s_1 = r_1_0_3_1_3_3_1_2_1_1_1;\n }\n r_1_0_3_1_3_3_1_2_1[1] = r_1_0_3_1_3_3_1_2_1_1;\n }\n {\n S_5758d412 memory r_1_0_3_1_3_3_1_2_1_2;\n {\n S_54896afd memory r_1_0_3_1_3_3_1_2_1_2_0;\n {\n uint80 r_1_0_3_1_3_3_1_2_1_2_0_0 = 1025002190457938415535849;\n r_1_0_3_1_3_3_1_2_1_2_0.s_0 = r_1_0_3_1_3_3_1_2_1_2_0_0;\n }\n r_1_0_3_1_3_3_1_2_1_2.s_0 = r_1_0_3_1_3_3_1_2_1_2_0;\n }\n {\n string memory r_1_0_3_1_3_3_1_2_1_2_1 = unicode\"Moo é🚀🚀Moo oé🚀oMo 🚀M oMMoMo MéM🚀o\";\n r_1_0_3_1_3_3_1_2_1_2.s_1 = r_1_0_3_1_3_3_1_2_1_2_1;\n }\n r_1_0_3_1_3_3_1_2_1[2] = r_1_0_3_1_3_3_1_2_1_2;\n }\n r_1_0_3_1_3_3_1_2[1] = r_1_0_3_1_3_3_1_2_1;\n }\n r_1_0_3_1_3_3_1.s_2 = r_1_0_3_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_1_0_3_1_3_3_1_3;\n {\n S_d8e64867 memory r_1_0_3_1_3_3_1_3_0;\n {\n bytes31 r_1_0_3_1_3_3_1_3_0_0 = bytes31(0x12dcb1bc894edcec544c35af28d5be0a590a40830edd501c8c715faeb812d9);\n r_1_0_3_1_3_3_1_3_0.s_0 = r_1_0_3_1_3_3_1_3_0_0;\n }\n {\n uint104 r_1_0_3_1_3_3_1_3_0_1 = 6995212533981106046433128563926;\n r_1_0_3_1_3_3_1_3_0.s_1 = r_1_0_3_1_3_3_1_3_0_1;\n }\n r_1_0_3_1_3_3_1_3[0] = r_1_0_3_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_1_0_3_1_3_3_1_3_1;\n {\n bytes31 r_1_0_3_1_3_3_1_3_1_0 = bytes31(0x8d9fbe397650464e7b601019a91d2728b4cadbbcbbe79d21bfeb1f71b5336c);\n r_1_0_3_1_3_3_1_3_1.s_0 = r_1_0_3_1_3_3_1_3_1_0;\n }\n {\n uint104 r_1_0_3_1_3_3_1_3_1_1 = 8597070187493096549654997007129;\n r_1_0_3_1_3_3_1_3_1.s_1 = r_1_0_3_1_3_3_1_3_1_1;\n }\n r_1_0_3_1_3_3_1_3[1] = r_1_0_3_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_1_0_3_1_3_3_1_3_2;\n {\n bytes31 r_1_0_3_1_3_3_1_3_2_0 = bytes31(0xcc1e1fdc69738faa5d6621e6570f96ea5455879d84e6aced6eb8f4a98532b8);\n r_1_0_3_1_3_3_1_3_2.s_0 = r_1_0_3_1_3_3_1_3_2_0;\n }\n {\n uint104 r_1_0_3_1_3_3_1_3_2_1 = 9129996001931131645523743293902;\n r_1_0_3_1_3_3_1_3_2.s_1 = r_1_0_3_1_3_3_1_3_2_1;\n }\n r_1_0_3_1_3_3_1_3[2] = r_1_0_3_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_1_0_3_1_3_3_1_3_3;\n {\n bytes31 r_1_0_3_1_3_3_1_3_3_0 = bytes31(0xb8b96fd6a9e1bd59acb7c0b76803b3ebc93ddd50715a5c7600ce89852e0ed0);\n r_1_0_3_1_3_3_1_3_3.s_0 = r_1_0_3_1_3_3_1_3_3_0;\n }\n {\n uint104 r_1_0_3_1_3_3_1_3_3_1 = 4242684607374094016047792180447;\n r_1_0_3_1_3_3_1_3_3.s_1 = r_1_0_3_1_3_3_1_3_3_1;\n }\n r_1_0_3_1_3_3_1_3[3] = r_1_0_3_1_3_3_1_3_3;\n }\n r_1_0_3_1_3_3_1.s_3 = r_1_0_3_1_3_3_1_3;\n }\n {\n uint48 r_1_0_3_1_3_3_1_4 = 86381324625382;\n r_1_0_3_1_3_3_1.s_4 = r_1_0_3_1_3_3_1_4;\n }\n r_1_0_3_1_3_3.s_1 = r_1_0_3_1_3_3_1;\n }\n r_1_0_3_1_3.s_3 = r_1_0_3_1_3_3;\n }\n r_1_0_3_1.s_3 = r_1_0_3_1_3;\n }\n r_1_0_3.s_1 = r_1_0_3_1;\n }\n {\n string memory r_1_0_3_2 = unicode\"Moo é🚀 ooéo🚀🚀ooM\";\n r_1_0_3.s_2 = r_1_0_3_2;\n }\n r_1_0[3] = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n r[1] = r_1;\n }\n {\n S_920026e8[4][1] memory r_2;\n {\n S_920026e8[4] memory r_2_0;\n {\n S_920026e8 memory r_2_0_0;\n {\n int32 r_2_0_0_0 = 450086051;\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n S_c8d7c908 memory r_2_0_0_1;\n {\n uint56 r_2_0_0_1_0 = 1862667065203480;\n r_2_0_0_1.s_0 = r_2_0_0_1_0;\n }\n {\n bytes27 r_2_0_0_1_1 = bytes27(0xe8132e5855fcb7e84a8c0cb2d9cd67b7931a9d2c93bf826c2b77b5);\n r_2_0_0_1.s_1 = r_2_0_0_1_1;\n }\n {\n bool r_2_0_0_1_2 = false;\n r_2_0_0_1.s_2 = r_2_0_0_1_2;\n }\n {\n S_733a0ce7 memory r_2_0_0_1_3;\n {\n address r_2_0_0_1_3_0 = 0xa322764125e3A508d77E0ba42C154C12E193BD5e;\n r_2_0_0_1_3.s_0 = r_2_0_0_1_3_0;\n }\n {\n bool r_2_0_0_1_3_1 = true;\n r_2_0_0_1_3.s_1 = r_2_0_0_1_3_1;\n }\n {\n S_25e98821 memory r_2_0_0_1_3_2;\n {\n bool r_2_0_0_1_3_2_0 = false;\n r_2_0_0_1_3_2.s_0 = r_2_0_0_1_3_2_0;\n }\n {\n bool r_2_0_0_1_3_2_1 = false;\n r_2_0_0_1_3_2.s_1 = r_2_0_0_1_3_2_1;\n }\n r_2_0_0_1_3.s_2 = r_2_0_0_1_3_2;\n }\n {\n S_a55eb82d memory r_2_0_0_1_3_3;\n {\n bytes31 r_2_0_0_1_3_3_0 = bytes31(0xde240c049f7da90a7ecb9156c990f89bdceb476917fd3322998d3bec8e0c5b);\n r_2_0_0_1_3_3.s_0 = r_2_0_0_1_3_3_0;\n }\n {\n S_770db331 memory r_2_0_0_1_3_3_1;\n {\n string memory r_2_0_0_1_3_3_1_0 = unicode\"Moo é🚀 M M🚀oooMMM🚀\";\n r_2_0_0_1_3_3_1.s_0 = r_2_0_0_1_3_3_1_0;\n }\n {\n bytes17 r_2_0_0_1_3_3_1_1 = bytes17(0x617345c7fbe4523b00537142e2f8705b9a);\n r_2_0_0_1_3_3_1.s_1 = r_2_0_0_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_2_0_0_1_3_3_1_2 = new S_5758d412[3][](4);\n {\n S_5758d412[3] memory r_2_0_0_1_3_3_1_2_0;\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_0_0_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_0_0_0_0 = 1025559340071980978979119;\n r_2_0_0_1_3_3_1_2_0_0_0.s_0 = r_2_0_0_1_3_3_1_2_0_0_0_0;\n }\n r_2_0_0_1_3_3_1_2_0_0.s_0 = r_2_0_0_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀oMoMéoéoMo oéMo oM ooooMMoMé MM ooMMéé🚀o o\";\n r_2_0_0_1_3_3_1_2_0_0.s_1 = r_2_0_0_1_3_3_1_2_0_0_1;\n }\n r_2_0_0_1_3_3_1_2_0[0] = r_2_0_0_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_0_1_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_0_1_0_0 = 199996398625034076461454;\n r_2_0_0_1_3_3_1_2_0_1_0.s_0 = r_2_0_0_1_3_3_1_2_0_1_0_0;\n }\n r_2_0_0_1_3_3_1_2_0_1.s_0 = r_2_0_0_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀🚀M🚀🚀MM ééé o\";\n r_2_0_0_1_3_3_1_2_0_1.s_1 = r_2_0_0_1_3_3_1_2_0_1_1;\n }\n r_2_0_0_1_3_3_1_2_0[1] = r_2_0_0_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_0_2_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_0_2_0_0 = 135884599882127575401329;\n r_2_0_0_1_3_3_1_2_0_2_0.s_0 = r_2_0_0_1_3_3_1_2_0_2_0_0;\n }\n r_2_0_0_1_3_3_1_2_0_2.s_0 = r_2_0_0_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀o🚀o\";\n r_2_0_0_1_3_3_1_2_0_2.s_1 = r_2_0_0_1_3_3_1_2_0_2_1;\n }\n r_2_0_0_1_3_3_1_2_0[2] = r_2_0_0_1_3_3_1_2_0_2;\n }\n r_2_0_0_1_3_3_1_2[0] = r_2_0_0_1_3_3_1_2_0;\n }\n {\n S_5758d412[3] memory r_2_0_0_1_3_3_1_2_1;\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_1_0;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_1_0_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_1_0_0_0 = 515288475754605993331757;\n r_2_0_0_1_3_3_1_2_1_0_0.s_0 = r_2_0_0_1_3_3_1_2_1_0_0_0;\n }\n r_2_0_0_1_3_3_1_2_1_0.s_0 = r_2_0_0_1_3_3_1_2_1_0_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_1_0_1 = unicode\"Moo é🚀oMoo ééoMM \";\n r_2_0_0_1_3_3_1_2_1_0.s_1 = r_2_0_0_1_3_3_1_2_1_0_1;\n }\n r_2_0_0_1_3_3_1_2_1[0] = r_2_0_0_1_3_3_1_2_1_0;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_1_1;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_1_1_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_1_1_0_0 = 731268341141024115374595;\n r_2_0_0_1_3_3_1_2_1_1_0.s_0 = r_2_0_0_1_3_3_1_2_1_1_0_0;\n }\n r_2_0_0_1_3_3_1_2_1_1.s_0 = r_2_0_0_1_3_3_1_2_1_1_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_1_1_1 = unicode\"Moo é🚀ééMo🚀 🚀o 🚀ooo🚀o o🚀🚀MM 🚀o🚀 ooéo🚀🚀éMooooéoo🚀Mo🚀🚀 🚀🚀🚀oMoo🚀é\";\n r_2_0_0_1_3_3_1_2_1_1.s_1 = r_2_0_0_1_3_3_1_2_1_1_1;\n }\n r_2_0_0_1_3_3_1_2_1[1] = r_2_0_0_1_3_3_1_2_1_1;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_1_2;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_1_2_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_1_2_0_0 = 398545296696103799871368;\n r_2_0_0_1_3_3_1_2_1_2_0.s_0 = r_2_0_0_1_3_3_1_2_1_2_0_0;\n }\n r_2_0_0_1_3_3_1_2_1_2.s_0 = r_2_0_0_1_3_3_1_2_1_2_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_1_2_1 = unicode\"Moo é🚀Mo🚀 oo M oé🚀o \";\n r_2_0_0_1_3_3_1_2_1_2.s_1 = r_2_0_0_1_3_3_1_2_1_2_1;\n }\n r_2_0_0_1_3_3_1_2_1[2] = r_2_0_0_1_3_3_1_2_1_2;\n }\n r_2_0_0_1_3_3_1_2[1] = r_2_0_0_1_3_3_1_2_1;\n }\n {\n S_5758d412[3] memory r_2_0_0_1_3_3_1_2_2;\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_2_0;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_2_0_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_2_0_0_0 = 881339986468801126955473;\n r_2_0_0_1_3_3_1_2_2_0_0.s_0 = r_2_0_0_1_3_3_1_2_2_0_0_0;\n }\n r_2_0_0_1_3_3_1_2_2_0.s_0 = r_2_0_0_1_3_3_1_2_2_0_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_2_0_1 = unicode\"Moo é🚀Moé🚀éo M éMM🚀ooMM🚀 oooM🚀oMooo🚀🚀éMMM🚀🚀 o🚀MMoM🚀 Mo\";\n r_2_0_0_1_3_3_1_2_2_0.s_1 = r_2_0_0_1_3_3_1_2_2_0_1;\n }\n r_2_0_0_1_3_3_1_2_2[0] = r_2_0_0_1_3_3_1_2_2_0;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_2_1;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_2_1_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_2_1_0_0 = 655244207891843442155449;\n r_2_0_0_1_3_3_1_2_2_1_0.s_0 = r_2_0_0_1_3_3_1_2_2_1_0_0;\n }\n r_2_0_0_1_3_3_1_2_2_1.s_0 = r_2_0_0_1_3_3_1_2_2_1_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_2_1_1 = unicode\"Moo é🚀🚀oooéoo🚀é🚀MMMoo 🚀é🚀ééoéé éMé o éMMMooo🚀oooMMooééMo é o🚀\";\n r_2_0_0_1_3_3_1_2_2_1.s_1 = r_2_0_0_1_3_3_1_2_2_1_1;\n }\n r_2_0_0_1_3_3_1_2_2[1] = r_2_0_0_1_3_3_1_2_2_1;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_2_2;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_2_2_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_2_2_0_0 = 160788531032816849381164;\n r_2_0_0_1_3_3_1_2_2_2_0.s_0 = r_2_0_0_1_3_3_1_2_2_2_0_0;\n }\n r_2_0_0_1_3_3_1_2_2_2.s_0 = r_2_0_0_1_3_3_1_2_2_2_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_2_2_1 = unicode\"Moo é🚀ooM🚀oM o oéoé🚀oéo🚀M 🚀o🚀🚀🚀é🚀 éM oéo M M🚀oé 🚀🚀🚀Mé🚀 o o\";\n r_2_0_0_1_3_3_1_2_2_2.s_1 = r_2_0_0_1_3_3_1_2_2_2_1;\n }\n r_2_0_0_1_3_3_1_2_2[2] = r_2_0_0_1_3_3_1_2_2_2;\n }\n r_2_0_0_1_3_3_1_2[2] = r_2_0_0_1_3_3_1_2_2;\n }\n {\n S_5758d412[3] memory r_2_0_0_1_3_3_1_2_3;\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_3_0;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_3_0_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_3_0_0_0 = 62361039763499843442233;\n r_2_0_0_1_3_3_1_2_3_0_0.s_0 = r_2_0_0_1_3_3_1_2_3_0_0_0;\n }\n r_2_0_0_1_3_3_1_2_3_0.s_0 = r_2_0_0_1_3_3_1_2_3_0_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_3_0_1 = unicode\"Moo é🚀o🚀🚀🚀MoéooMéééééé é🚀 o🚀oo 🚀éM🚀éoM M o\";\n r_2_0_0_1_3_3_1_2_3_0.s_1 = r_2_0_0_1_3_3_1_2_3_0_1;\n }\n r_2_0_0_1_3_3_1_2_3[0] = r_2_0_0_1_3_3_1_2_3_0;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_3_1;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_3_1_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_3_1_0_0 = 959406524645207881940115;\n r_2_0_0_1_3_3_1_2_3_1_0.s_0 = r_2_0_0_1_3_3_1_2_3_1_0_0;\n }\n r_2_0_0_1_3_3_1_2_3_1.s_0 = r_2_0_0_1_3_3_1_2_3_1_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_3_1_1 = unicode\"Moo é🚀o éoM 🚀 éMoMMo🚀MoMM🚀o\";\n r_2_0_0_1_3_3_1_2_3_1.s_1 = r_2_0_0_1_3_3_1_2_3_1_1;\n }\n r_2_0_0_1_3_3_1_2_3[1] = r_2_0_0_1_3_3_1_2_3_1;\n }\n {\n S_5758d412 memory r_2_0_0_1_3_3_1_2_3_2;\n {\n S_54896afd memory r_2_0_0_1_3_3_1_2_3_2_0;\n {\n uint80 r_2_0_0_1_3_3_1_2_3_2_0_0 = 146539970214223232055320;\n r_2_0_0_1_3_3_1_2_3_2_0.s_0 = r_2_0_0_1_3_3_1_2_3_2_0_0;\n }\n r_2_0_0_1_3_3_1_2_3_2.s_0 = r_2_0_0_1_3_3_1_2_3_2_0;\n }\n {\n string memory r_2_0_0_1_3_3_1_2_3_2_1 = unicode\"Moo é🚀🚀oéooMo🚀 🚀 Mé🚀ooMoooo🚀🚀MéooéoéoMooooooMooo\";\n r_2_0_0_1_3_3_1_2_3_2.s_1 = r_2_0_0_1_3_3_1_2_3_2_1;\n }\n r_2_0_0_1_3_3_1_2_3[2] = r_2_0_0_1_3_3_1_2_3_2;\n }\n r_2_0_0_1_3_3_1_2[3] = r_2_0_0_1_3_3_1_2_3;\n }\n r_2_0_0_1_3_3_1.s_2 = r_2_0_0_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_2_0_0_1_3_3_1_3;\n {\n S_d8e64867 memory r_2_0_0_1_3_3_1_3_0;\n {\n bytes31 r_2_0_0_1_3_3_1_3_0_0 = bytes31(0x85d89f6f7782bc2075891a6d05add5f17d67133c2f7dfd884628f5b9135b5f);\n r_2_0_0_1_3_3_1_3_0.s_0 = r_2_0_0_1_3_3_1_3_0_0;\n }\n {\n uint104 r_2_0_0_1_3_3_1_3_0_1 = 8152652264041231856031820014334;\n r_2_0_0_1_3_3_1_3_0.s_1 = r_2_0_0_1_3_3_1_3_0_1;\n }\n r_2_0_0_1_3_3_1_3[0] = r_2_0_0_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_2_0_0_1_3_3_1_3_1;\n {\n bytes31 r_2_0_0_1_3_3_1_3_1_0 = bytes31(0x0fb8607251804ff82b5b152a4bae09bd636adc9ad4063a6d6ca2cab2560537);\n r_2_0_0_1_3_3_1_3_1.s_0 = r_2_0_0_1_3_3_1_3_1_0;\n }\n {\n uint104 r_2_0_0_1_3_3_1_3_1_1 = 16416864780937006238066005305072;\n r_2_0_0_1_3_3_1_3_1.s_1 = r_2_0_0_1_3_3_1_3_1_1;\n }\n r_2_0_0_1_3_3_1_3[1] = r_2_0_0_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_2_0_0_1_3_3_1_3_2;\n {\n bytes31 r_2_0_0_1_3_3_1_3_2_0 = bytes31(0x3ccbe135ae880f89c39361f314bffdf7a5c2aa5a2dedae7c3a6caa34848236);\n r_2_0_0_1_3_3_1_3_2.s_0 = r_2_0_0_1_3_3_1_3_2_0;\n }\n {\n uint104 r_2_0_0_1_3_3_1_3_2_1 = 17480310804968673507446811182722;\n r_2_0_0_1_3_3_1_3_2.s_1 = r_2_0_0_1_3_3_1_3_2_1;\n }\n r_2_0_0_1_3_3_1_3[2] = r_2_0_0_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_2_0_0_1_3_3_1_3_3;\n {\n bytes31 r_2_0_0_1_3_3_1_3_3_0 = bytes31(0xfa0b99564ab5bb7c3cf61146ccf566c56f9a5a7aa6f2c2bda64b15303e1713);\n r_2_0_0_1_3_3_1_3_3.s_0 = r_2_0_0_1_3_3_1_3_3_0;\n }\n {\n uint104 r_2_0_0_1_3_3_1_3_3_1 = 19557527284622991208475854982546;\n r_2_0_0_1_3_3_1_3_3.s_1 = r_2_0_0_1_3_3_1_3_3_1;\n }\n r_2_0_0_1_3_3_1_3[3] = r_2_0_0_1_3_3_1_3_3;\n }\n r_2_0_0_1_3_3_1.s_3 = r_2_0_0_1_3_3_1_3;\n }\n {\n uint48 r_2_0_0_1_3_3_1_4 = 83317973902405;\n r_2_0_0_1_3_3_1.s_4 = r_2_0_0_1_3_3_1_4;\n }\n r_2_0_0_1_3_3.s_1 = r_2_0_0_1_3_3_1;\n }\n r_2_0_0_1_3.s_3 = r_2_0_0_1_3_3;\n }\n r_2_0_0_1.s_3 = r_2_0_0_1_3;\n }\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n string memory r_2_0_0_2 = unicode\"Moo é🚀🚀oooé oM oé🚀o🚀MéMo M🚀ooM🚀o MM\";\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n r_2_0[0] = r_2_0_0;\n }\n {\n S_920026e8 memory r_2_0_1;\n {\n int32 r_2_0_1_0 = 700510769;\n r_2_0_1.s_0 = r_2_0_1_0;\n }\n {\n S_c8d7c908 memory r_2_0_1_1;\n {\n uint56 r_2_0_1_1_0 = 42507258221890211;\n r_2_0_1_1.s_0 = r_2_0_1_1_0;\n }\n {\n bytes27 r_2_0_1_1_1 = bytes27(0x00ccca1671adbde8393212111aa00d5c0e5d7b5453b136a72d0b04);\n r_2_0_1_1.s_1 = r_2_0_1_1_1;\n }\n {\n bool r_2_0_1_1_2 = false;\n r_2_0_1_1.s_2 = r_2_0_1_1_2;\n }\n {\n S_733a0ce7 memory r_2_0_1_1_3;\n {\n address r_2_0_1_1_3_0 = 0xA0cf4B6227A6214dCDFAD8F3b9a2b2159342c967;\n r_2_0_1_1_3.s_0 = r_2_0_1_1_3_0;\n }\n {\n bool r_2_0_1_1_3_1 = true;\n r_2_0_1_1_3.s_1 = r_2_0_1_1_3_1;\n }\n {\n S_25e98821 memory r_2_0_1_1_3_2;\n {\n bool r_2_0_1_1_3_2_0 = true;\n r_2_0_1_1_3_2.s_0 = r_2_0_1_1_3_2_0;\n }\n {\n bool r_2_0_1_1_3_2_1 = true;\n r_2_0_1_1_3_2.s_1 = r_2_0_1_1_3_2_1;\n }\n r_2_0_1_1_3.s_2 = r_2_0_1_1_3_2;\n }\n {\n S_a55eb82d memory r_2_0_1_1_3_3;\n {\n bytes31 r_2_0_1_1_3_3_0 = bytes31(0xba32bcbcc576d6084f8da91ef59fabc42d2c32870f8f89e74d76849b23de8e);\n r_2_0_1_1_3_3.s_0 = r_2_0_1_1_3_3_0;\n }\n {\n S_770db331 memory r_2_0_1_1_3_3_1;\n {\n string memory r_2_0_1_1_3_3_1_0 = unicode\"Moo é🚀🚀o🚀 MMéo Mooo🚀éo 🚀 é oéo🚀éMéMéMéM🚀Mooo 🚀o\";\n r_2_0_1_1_3_3_1.s_0 = r_2_0_1_1_3_3_1_0;\n }\n {\n bytes17 r_2_0_1_1_3_3_1_1 = bytes17(0xe64be12210d44d8c9af2b28b479fdda6e7);\n r_2_0_1_1_3_3_1.s_1 = r_2_0_1_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_2_0_1_1_3_3_1_2 = new S_5758d412[3][](1);\n {\n S_5758d412[3] memory r_2_0_1_1_3_3_1_2_0;\n {\n S_5758d412 memory r_2_0_1_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_2_0_1_1_3_3_1_2_0_0_0;\n {\n uint80 r_2_0_1_1_3_3_1_2_0_0_0_0 = 998904477997770689783828;\n r_2_0_1_1_3_3_1_2_0_0_0.s_0 = r_2_0_1_1_3_3_1_2_0_0_0_0;\n }\n r_2_0_1_1_3_3_1_2_0_0.s_0 = r_2_0_1_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_2_0_1_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀ooo éoMo o 🚀éMo🚀M🚀oMoé ooéo🚀éMé\";\n r_2_0_1_1_3_3_1_2_0_0.s_1 = r_2_0_1_1_3_3_1_2_0_0_1;\n }\n r_2_0_1_1_3_3_1_2_0[0] = r_2_0_1_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_2_0_1_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_2_0_1_1_3_3_1_2_0_1_0;\n {\n uint80 r_2_0_1_1_3_3_1_2_0_1_0_0 = 672234829220922730895350;\n r_2_0_1_1_3_3_1_2_0_1_0.s_0 = r_2_0_1_1_3_3_1_2_0_1_0_0;\n }\n r_2_0_1_1_3_3_1_2_0_1.s_0 = r_2_0_1_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_2_0_1_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀oooéo🚀ooé 🚀o🚀M🚀o🚀o oMoMéé🚀éooéoM oM🚀MooéM🚀o é🚀éMo🚀Mo éo\";\n r_2_0_1_1_3_3_1_2_0_1.s_1 = r_2_0_1_1_3_3_1_2_0_1_1;\n }\n r_2_0_1_1_3_3_1_2_0[1] = r_2_0_1_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_2_0_1_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_2_0_1_1_3_3_1_2_0_2_0;\n {\n uint80 r_2_0_1_1_3_3_1_2_0_2_0_0 = 565572148567774672239845;\n r_2_0_1_1_3_3_1_2_0_2_0.s_0 = r_2_0_1_1_3_3_1_2_0_2_0_0;\n }\n r_2_0_1_1_3_3_1_2_0_2.s_0 = r_2_0_1_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_2_0_1_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀éo🚀ooMooé oooM ooMMoéMéMé oMM MMMMéoMoMéoMo\";\n r_2_0_1_1_3_3_1_2_0_2.s_1 = r_2_0_1_1_3_3_1_2_0_2_1;\n }\n r_2_0_1_1_3_3_1_2_0[2] = r_2_0_1_1_3_3_1_2_0_2;\n }\n r_2_0_1_1_3_3_1_2[0] = r_2_0_1_1_3_3_1_2_0;\n }\n r_2_0_1_1_3_3_1.s_2 = r_2_0_1_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_2_0_1_1_3_3_1_3;\n {\n S_d8e64867 memory r_2_0_1_1_3_3_1_3_0;\n {\n bytes31 r_2_0_1_1_3_3_1_3_0_0 = bytes31(0xdf5e535bdb2251e7b882f04e2c196d209e69bf0727fbcafe195e4536825a1b);\n r_2_0_1_1_3_3_1_3_0.s_0 = r_2_0_1_1_3_3_1_3_0_0;\n }\n {\n uint104 r_2_0_1_1_3_3_1_3_0_1 = 6878548423508897219270706061599;\n r_2_0_1_1_3_3_1_3_0.s_1 = r_2_0_1_1_3_3_1_3_0_1;\n }\n r_2_0_1_1_3_3_1_3[0] = r_2_0_1_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_2_0_1_1_3_3_1_3_1;\n {\n bytes31 r_2_0_1_1_3_3_1_3_1_0 = bytes31(0x221da0d5340ce979deba370153b25c5ad15c51438f37375ab06c759b7a9f48);\n r_2_0_1_1_3_3_1_3_1.s_0 = r_2_0_1_1_3_3_1_3_1_0;\n }\n {\n uint104 r_2_0_1_1_3_3_1_3_1_1 = 15516337744500600307057943997971;\n r_2_0_1_1_3_3_1_3_1.s_1 = r_2_0_1_1_3_3_1_3_1_1;\n }\n r_2_0_1_1_3_3_1_3[1] = r_2_0_1_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_2_0_1_1_3_3_1_3_2;\n {\n bytes31 r_2_0_1_1_3_3_1_3_2_0 = bytes31(0x814565cb98266cee7971f06826107017acb8ea548cde76f1a84d2ab364ad66);\n r_2_0_1_1_3_3_1_3_2.s_0 = r_2_0_1_1_3_3_1_3_2_0;\n }\n {\n uint104 r_2_0_1_1_3_3_1_3_2_1 = 9082912372448664233971398161464;\n r_2_0_1_1_3_3_1_3_2.s_1 = r_2_0_1_1_3_3_1_3_2_1;\n }\n r_2_0_1_1_3_3_1_3[2] = r_2_0_1_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_2_0_1_1_3_3_1_3_3;\n {\n bytes31 r_2_0_1_1_3_3_1_3_3_0 = bytes31(0x57119d2a41f20ade5aa366907021ca01c8dabdc944aa24f0a17f237bbc063d);\n r_2_0_1_1_3_3_1_3_3.s_0 = r_2_0_1_1_3_3_1_3_3_0;\n }\n {\n uint104 r_2_0_1_1_3_3_1_3_3_1 = 12403548110132185946652650413082;\n r_2_0_1_1_3_3_1_3_3.s_1 = r_2_0_1_1_3_3_1_3_3_1;\n }\n r_2_0_1_1_3_3_1_3[3] = r_2_0_1_1_3_3_1_3_3;\n }\n r_2_0_1_1_3_3_1.s_3 = r_2_0_1_1_3_3_1_3;\n }\n {\n uint48 r_2_0_1_1_3_3_1_4 = 6402288773077;\n r_2_0_1_1_3_3_1.s_4 = r_2_0_1_1_3_3_1_4;\n }\n r_2_0_1_1_3_3.s_1 = r_2_0_1_1_3_3_1;\n }\n r_2_0_1_1_3.s_3 = r_2_0_1_1_3_3;\n }\n r_2_0_1_1.s_3 = r_2_0_1_1_3;\n }\n r_2_0_1.s_1 = r_2_0_1_1;\n }\n {\n string memory r_2_0_1_2 = unicode\"Moo é🚀🚀o🚀🚀ooM🚀oo🚀éé🚀🚀oéoM 🚀Mo🚀🚀🚀🚀🚀o\";\n r_2_0_1.s_2 = r_2_0_1_2;\n }\n r_2_0[1] = r_2_0_1;\n }\n {\n S_920026e8 memory r_2_0_2;\n {\n int32 r_2_0_2_0 = 379366848;\n r_2_0_2.s_0 = r_2_0_2_0;\n }\n {\n S_c8d7c908 memory r_2_0_2_1;\n {\n uint56 r_2_0_2_1_0 = 4777727319079755;\n r_2_0_2_1.s_0 = r_2_0_2_1_0;\n }\n {\n bytes27 r_2_0_2_1_1 = bytes27(0x8f000774670384e84ff808431f60951061811e1da8808f4b881570);\n r_2_0_2_1.s_1 = r_2_0_2_1_1;\n }\n {\n bool r_2_0_2_1_2 = true;\n r_2_0_2_1.s_2 = r_2_0_2_1_2;\n }\n {\n S_733a0ce7 memory r_2_0_2_1_3;\n {\n address r_2_0_2_1_3_0 = 0x9B867Cfd32926770310F8dc48F2a5761F8CeDb0B;\n r_2_0_2_1_3.s_0 = r_2_0_2_1_3_0;\n }\n {\n bool r_2_0_2_1_3_1 = true;\n r_2_0_2_1_3.s_1 = r_2_0_2_1_3_1;\n }\n {\n S_25e98821 memory r_2_0_2_1_3_2;\n {\n bool r_2_0_2_1_3_2_0 = true;\n r_2_0_2_1_3_2.s_0 = r_2_0_2_1_3_2_0;\n }\n {\n bool r_2_0_2_1_3_2_1 = true;\n r_2_0_2_1_3_2.s_1 = r_2_0_2_1_3_2_1;\n }\n r_2_0_2_1_3.s_2 = r_2_0_2_1_3_2;\n }\n {\n S_a55eb82d memory r_2_0_2_1_3_3;\n {\n bytes31 r_2_0_2_1_3_3_0 = bytes31(0x46011da7fb6d10b847738342476d67cdafa19c63bef70301d8e60a8212c84c);\n r_2_0_2_1_3_3.s_0 = r_2_0_2_1_3_3_0;\n }\n {\n S_770db331 memory r_2_0_2_1_3_3_1;\n {\n string memory r_2_0_2_1_3_3_1_0 = unicode\"Moo é🚀🚀🚀o🚀🚀oé MM🚀 éoMoM🚀🚀éooo🚀o🚀oo🚀oM🚀éoé oMMM éooé🚀éo🚀\";\n r_2_0_2_1_3_3_1.s_0 = r_2_0_2_1_3_3_1_0;\n }\n {\n bytes17 r_2_0_2_1_3_3_1_1 = bytes17(0xfdfac1c8007af04108c1865d6c50fa1249);\n r_2_0_2_1_3_3_1.s_1 = r_2_0_2_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_2_0_2_1_3_3_1_2 = new S_5758d412[3][](1);\n {\n S_5758d412[3] memory r_2_0_2_1_3_3_1_2_0;\n {\n S_5758d412 memory r_2_0_2_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_2_0_2_1_3_3_1_2_0_0_0;\n {\n uint80 r_2_0_2_1_3_3_1_2_0_0_0_0 = 57362128525397904213373;\n r_2_0_2_1_3_3_1_2_0_0_0.s_0 = r_2_0_2_1_3_3_1_2_0_0_0_0;\n }\n r_2_0_2_1_3_3_1_2_0_0.s_0 = r_2_0_2_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_2_0_2_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀éo🚀 éoéMMMéo é ééM🚀🚀🚀ooé🚀Mo🚀🚀MéMé🚀Mo oéMéo MMooo\";\n r_2_0_2_1_3_3_1_2_0_0.s_1 = r_2_0_2_1_3_3_1_2_0_0_1;\n }\n r_2_0_2_1_3_3_1_2_0[0] = r_2_0_2_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_2_0_2_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_2_0_2_1_3_3_1_2_0_1_0;\n {\n uint80 r_2_0_2_1_3_3_1_2_0_1_0_0 = 892154695378074136422085;\n r_2_0_2_1_3_3_1_2_0_1_0.s_0 = r_2_0_2_1_3_3_1_2_0_1_0_0;\n }\n r_2_0_2_1_3_3_1_2_0_1.s_0 = r_2_0_2_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_2_0_2_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀ooM 🚀éoMo oo éMMéMoéoo🚀o 🚀\";\n r_2_0_2_1_3_3_1_2_0_1.s_1 = r_2_0_2_1_3_3_1_2_0_1_1;\n }\n r_2_0_2_1_3_3_1_2_0[1] = r_2_0_2_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_2_0_2_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_2_0_2_1_3_3_1_2_0_2_0;\n {\n uint80 r_2_0_2_1_3_3_1_2_0_2_0_0 = 901879116585764694543963;\n r_2_0_2_1_3_3_1_2_0_2_0.s_0 = r_2_0_2_1_3_3_1_2_0_2_0_0;\n }\n r_2_0_2_1_3_3_1_2_0_2.s_0 = r_2_0_2_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_2_0_2_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀 MM 🚀 oéé🚀é 🚀oé🚀oé é o 🚀o🚀éoo éo🚀 🚀MMM🚀 \";\n r_2_0_2_1_3_3_1_2_0_2.s_1 = r_2_0_2_1_3_3_1_2_0_2_1;\n }\n r_2_0_2_1_3_3_1_2_0[2] = r_2_0_2_1_3_3_1_2_0_2;\n }\n r_2_0_2_1_3_3_1_2[0] = r_2_0_2_1_3_3_1_2_0;\n }\n r_2_0_2_1_3_3_1.s_2 = r_2_0_2_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_2_0_2_1_3_3_1_3;\n {\n S_d8e64867 memory r_2_0_2_1_3_3_1_3_0;\n {\n bytes31 r_2_0_2_1_3_3_1_3_0_0 = bytes31(0x0747c3b1da93154e98dca22db9b30987ed2ed20c0d806647b1288968a3c7d7);\n r_2_0_2_1_3_3_1_3_0.s_0 = r_2_0_2_1_3_3_1_3_0_0;\n }\n {\n uint104 r_2_0_2_1_3_3_1_3_0_1 = 4146567576601627746825362586315;\n r_2_0_2_1_3_3_1_3_0.s_1 = r_2_0_2_1_3_3_1_3_0_1;\n }\n r_2_0_2_1_3_3_1_3[0] = r_2_0_2_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_2_0_2_1_3_3_1_3_1;\n {\n bytes31 r_2_0_2_1_3_3_1_3_1_0 = bytes31(0x5f0f712b08bf9f443e4b1e177842f36510f49100058d3ea926cd25630247a7);\n r_2_0_2_1_3_3_1_3_1.s_0 = r_2_0_2_1_3_3_1_3_1_0;\n }\n {\n uint104 r_2_0_2_1_3_3_1_3_1_1 = 7224863001570592521097169560835;\n r_2_0_2_1_3_3_1_3_1.s_1 = r_2_0_2_1_3_3_1_3_1_1;\n }\n r_2_0_2_1_3_3_1_3[1] = r_2_0_2_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_2_0_2_1_3_3_1_3_2;\n {\n bytes31 r_2_0_2_1_3_3_1_3_2_0 = bytes31(0xa6db2d5c4a63a868f1a217950b0b308cee6bf793a070fe16729c4b62effbe8);\n r_2_0_2_1_3_3_1_3_2.s_0 = r_2_0_2_1_3_3_1_3_2_0;\n }\n {\n uint104 r_2_0_2_1_3_3_1_3_2_1 = 10157693620079683599116916718228;\n r_2_0_2_1_3_3_1_3_2.s_1 = r_2_0_2_1_3_3_1_3_2_1;\n }\n r_2_0_2_1_3_3_1_3[2] = r_2_0_2_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_2_0_2_1_3_3_1_3_3;\n {\n bytes31 r_2_0_2_1_3_3_1_3_3_0 = bytes31(0x68169af8168260dc2ecfb574beac056944f32f2f530a7ea62ed3cd1577ba6e);\n r_2_0_2_1_3_3_1_3_3.s_0 = r_2_0_2_1_3_3_1_3_3_0;\n }\n {\n uint104 r_2_0_2_1_3_3_1_3_3_1 = 18999040883110654313566239821052;\n r_2_0_2_1_3_3_1_3_3.s_1 = r_2_0_2_1_3_3_1_3_3_1;\n }\n r_2_0_2_1_3_3_1_3[3] = r_2_0_2_1_3_3_1_3_3;\n }\n r_2_0_2_1_3_3_1.s_3 = r_2_0_2_1_3_3_1_3;\n }\n {\n uint48 r_2_0_2_1_3_3_1_4 = 23705855955643;\n r_2_0_2_1_3_3_1.s_4 = r_2_0_2_1_3_3_1_4;\n }\n r_2_0_2_1_3_3.s_1 = r_2_0_2_1_3_3_1;\n }\n r_2_0_2_1_3.s_3 = r_2_0_2_1_3_3;\n }\n r_2_0_2_1.s_3 = r_2_0_2_1_3;\n }\n r_2_0_2.s_1 = r_2_0_2_1;\n }\n {\n string memory r_2_0_2_2 = unicode\"Moo é🚀Moo oMéoééooé\";\n r_2_0_2.s_2 = r_2_0_2_2;\n }\n r_2_0[2] = r_2_0_2;\n }\n {\n S_920026e8 memory r_2_0_3;\n {\n int32 r_2_0_3_0 = -602593327;\n r_2_0_3.s_0 = r_2_0_3_0;\n }\n {\n S_c8d7c908 memory r_2_0_3_1;\n {\n uint56 r_2_0_3_1_0 = 68387087619570718;\n r_2_0_3_1.s_0 = r_2_0_3_1_0;\n }\n {\n bytes27 r_2_0_3_1_1 = bytes27(0x19417c16c4099975c42e171f8d5afc0165a795590aa4d4053e105f);\n r_2_0_3_1.s_1 = r_2_0_3_1_1;\n }\n {\n bool r_2_0_3_1_2 = true;\n r_2_0_3_1.s_2 = r_2_0_3_1_2;\n }\n {\n S_733a0ce7 memory r_2_0_3_1_3;\n {\n address r_2_0_3_1_3_0 = 0x453Ae228c89C6ed368617E677a883F251ae61593;\n r_2_0_3_1_3.s_0 = r_2_0_3_1_3_0;\n }\n {\n bool r_2_0_3_1_3_1 = false;\n r_2_0_3_1_3.s_1 = r_2_0_3_1_3_1;\n }\n {\n S_25e98821 memory r_2_0_3_1_3_2;\n {\n bool r_2_0_3_1_3_2_0 = true;\n r_2_0_3_1_3_2.s_0 = r_2_0_3_1_3_2_0;\n }\n {\n bool r_2_0_3_1_3_2_1 = true;\n r_2_0_3_1_3_2.s_1 = r_2_0_3_1_3_2_1;\n }\n r_2_0_3_1_3.s_2 = r_2_0_3_1_3_2;\n }\n {\n S_a55eb82d memory r_2_0_3_1_3_3;\n {\n bytes31 r_2_0_3_1_3_3_0 = bytes31(0x5fcc25a764936dfa632e9515846c730f51dece1ec0f392da926ee942bb273b);\n r_2_0_3_1_3_3.s_0 = r_2_0_3_1_3_3_0;\n }\n {\n S_770db331 memory r_2_0_3_1_3_3_1;\n {\n string memory r_2_0_3_1_3_3_1_0 = unicode\"Moo é🚀oéoM ooééo 🚀🚀 🚀oo 🚀oooo M éo🚀éoo\";\n r_2_0_3_1_3_3_1.s_0 = r_2_0_3_1_3_3_1_0;\n }\n {\n bytes17 r_2_0_3_1_3_3_1_1 = bytes17(0x33152d109b1c0e4be90cd6c417d5c70d17);\n r_2_0_3_1_3_3_1.s_1 = r_2_0_3_1_3_3_1_1;\n }\n {\n S_5758d412[3][] memory r_2_0_3_1_3_3_1_2 = new S_5758d412[3][](1);\n {\n S_5758d412[3] memory r_2_0_3_1_3_3_1_2_0;\n {\n S_5758d412 memory r_2_0_3_1_3_3_1_2_0_0;\n {\n S_54896afd memory r_2_0_3_1_3_3_1_2_0_0_0;\n {\n uint80 r_2_0_3_1_3_3_1_2_0_0_0_0 = 867959008457721706592071;\n r_2_0_3_1_3_3_1_2_0_0_0.s_0 = r_2_0_3_1_3_3_1_2_0_0_0_0;\n }\n r_2_0_3_1_3_3_1_2_0_0.s_0 = r_2_0_3_1_3_3_1_2_0_0_0;\n }\n {\n string memory r_2_0_3_1_3_3_1_2_0_0_1 = unicode\"Moo é🚀oo éé MééMooMo🚀Méo 🚀oooo🚀MMooéoééM o🚀o🚀éo🚀oM\";\n r_2_0_3_1_3_3_1_2_0_0.s_1 = r_2_0_3_1_3_3_1_2_0_0_1;\n }\n r_2_0_3_1_3_3_1_2_0[0] = r_2_0_3_1_3_3_1_2_0_0;\n }\n {\n S_5758d412 memory r_2_0_3_1_3_3_1_2_0_1;\n {\n S_54896afd memory r_2_0_3_1_3_3_1_2_0_1_0;\n {\n uint80 r_2_0_3_1_3_3_1_2_0_1_0_0 = 83607570335716133607005;\n r_2_0_3_1_3_3_1_2_0_1_0.s_0 = r_2_0_3_1_3_3_1_2_0_1_0_0;\n }\n r_2_0_3_1_3_3_1_2_0_1.s_0 = r_2_0_3_1_3_3_1_2_0_1_0;\n }\n {\n string memory r_2_0_3_1_3_3_1_2_0_1_1 = unicode\"Moo é🚀🚀ééMéoMéoo oMM o M éo é M o 🚀 Moo🚀é\";\n r_2_0_3_1_3_3_1_2_0_1.s_1 = r_2_0_3_1_3_3_1_2_0_1_1;\n }\n r_2_0_3_1_3_3_1_2_0[1] = r_2_0_3_1_3_3_1_2_0_1;\n }\n {\n S_5758d412 memory r_2_0_3_1_3_3_1_2_0_2;\n {\n S_54896afd memory r_2_0_3_1_3_3_1_2_0_2_0;\n {\n uint80 r_2_0_3_1_3_3_1_2_0_2_0_0 = 487947877097455589394867;\n r_2_0_3_1_3_3_1_2_0_2_0.s_0 = r_2_0_3_1_3_3_1_2_0_2_0_0;\n }\n r_2_0_3_1_3_3_1_2_0_2.s_0 = r_2_0_3_1_3_3_1_2_0_2_0;\n }\n {\n string memory r_2_0_3_1_3_3_1_2_0_2_1 = unicode\"Moo é🚀ooMoMoo🚀\";\n r_2_0_3_1_3_3_1_2_0_2.s_1 = r_2_0_3_1_3_3_1_2_0_2_1;\n }\n r_2_0_3_1_3_3_1_2_0[2] = r_2_0_3_1_3_3_1_2_0_2;\n }\n r_2_0_3_1_3_3_1_2[0] = r_2_0_3_1_3_3_1_2_0;\n }\n r_2_0_3_1_3_3_1.s_2 = r_2_0_3_1_3_3_1_2;\n }\n {\n S_d8e64867[4] memory r_2_0_3_1_3_3_1_3;\n {\n S_d8e64867 memory r_2_0_3_1_3_3_1_3_0;\n {\n bytes31 r_2_0_3_1_3_3_1_3_0_0 = bytes31(0xc626c1b4c9017d322408531761b91c8d5a563a7ee1caf991a87d491105136d);\n r_2_0_3_1_3_3_1_3_0.s_0 = r_2_0_3_1_3_3_1_3_0_0;\n }\n {\n uint104 r_2_0_3_1_3_3_1_3_0_1 = 16523666341471639949050835668816;\n r_2_0_3_1_3_3_1_3_0.s_1 = r_2_0_3_1_3_3_1_3_0_1;\n }\n r_2_0_3_1_3_3_1_3[0] = r_2_0_3_1_3_3_1_3_0;\n }\n {\n S_d8e64867 memory r_2_0_3_1_3_3_1_3_1;\n {\n bytes31 r_2_0_3_1_3_3_1_3_1_0 = bytes31(0x9f8b3ff1ffdb11b8b7dd7966335f1086ab986d8e074ad0c64a6e9f2a2becac);\n r_2_0_3_1_3_3_1_3_1.s_0 = r_2_0_3_1_3_3_1_3_1_0;\n }\n {\n uint104 r_2_0_3_1_3_3_1_3_1_1 = 18715586166639367550398947210310;\n r_2_0_3_1_3_3_1_3_1.s_1 = r_2_0_3_1_3_3_1_3_1_1;\n }\n r_2_0_3_1_3_3_1_3[1] = r_2_0_3_1_3_3_1_3_1;\n }\n {\n S_d8e64867 memory r_2_0_3_1_3_3_1_3_2;\n {\n bytes31 r_2_0_3_1_3_3_1_3_2_0 = bytes31(0x59681117d865de490b4dc9624d2c8d6dc81eee44ae06a90c9c13dbb800acf1);\n r_2_0_3_1_3_3_1_3_2.s_0 = r_2_0_3_1_3_3_1_3_2_0;\n }\n {\n uint104 r_2_0_3_1_3_3_1_3_2_1 = 11076808997132194427870041008509;\n r_2_0_3_1_3_3_1_3_2.s_1 = r_2_0_3_1_3_3_1_3_2_1;\n }\n r_2_0_3_1_3_3_1_3[2] = r_2_0_3_1_3_3_1_3_2;\n }\n {\n S_d8e64867 memory r_2_0_3_1_3_3_1_3_3;\n {\n bytes31 r_2_0_3_1_3_3_1_3_3_0 = bytes31(0x4054712b301a4f27057b5c125287fdab406a13bbfec45fea29c6f8ca27ca28);\n r_2_0_3_1_3_3_1_3_3.s_0 = r_2_0_3_1_3_3_1_3_3_0;\n }\n {\n uint104 r_2_0_3_1_3_3_1_3_3_1 = 16924362469328952392198222756247;\n r_2_0_3_1_3_3_1_3_3.s_1 = r_2_0_3_1_3_3_1_3_3_1;\n }\n r_2_0_3_1_3_3_1_3[3] = r_2_0_3_1_3_3_1_3_3;\n }\n r_2_0_3_1_3_3_1.s_3 = r_2_0_3_1_3_3_1_3;\n }\n {\n uint48 r_2_0_3_1_3_3_1_4 = 229066645449592;\n r_2_0_3_1_3_3_1.s_4 = r_2_0_3_1_3_3_1_4;\n }\n r_2_0_3_1_3_3.s_1 = r_2_0_3_1_3_3_1;\n }\n r_2_0_3_1_3.s_3 = r_2_0_3_1_3_3;\n }\n r_2_0_3_1.s_3 = r_2_0_3_1_3;\n }\n r_2_0_3.s_1 = r_2_0_3_1;\n }\n {\n string memory r_2_0_3_2 = unicode\"Moo é🚀oooé🚀éé o🚀Moé🚀M ooo🚀MM 🚀é\";\n r_2_0_3.s_2 = r_2_0_3_2;\n }\n r_2_0[3] = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n r[2] = r_2;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000020e00000000000000000000000000000000000000000000000000000000000004760000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c20000000000000000000000000000000000000000000000000000000000118141600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000cca7cb4914964c71ef38edd1de0d0fe4505a0d0ae63937d06557cd28350ca1571f3c00000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000027b258fa3988a5e38dbaf403f8727441dad9328600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a025c195eec3482605a36958b210bc1d5437bfbdd949c9515603fba77abbdd55000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018038d263bc12265c652145b25a26113fcc7e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002008ef7380bb72bd51844a26505a8fd0c7fc4b8e3a6b621190a3645048351c5a6000000000000000000000000000000000000000024a49d9525487915b30428f309e4bb152090d38297f101ae13a44055271fc8fab29f0d3af2e7281571268bfa0000000000000000000000000000000000000000314b4223130b5febae5241185c42276335c2b5dc4a14c14aff1c50b566dc75c7b1a094b3e1e2bb9b6ec638410000000000000000000000000000000000000000752afc5e5746a464420564ac02d6d90b6e348c2a6f2c2b3b68a8d9c0f3a98d9f00d489fe685e610a03cbcb720000000000000000000000000000000000000000b2d0e216711be929d85c6dff290000000000000000000000000000000000000000000000000000b0f8bfbb37f0000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a80f09f9a804df09f9a80c3a96f206ff09f9a804df09f9a80c3a9206f2020c3a9f09f9a80c3a96ff09f9a804df09f9a806ff09f9a806f6f6fc3a96f6f6f4d6fc3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000bf0771a5a1c4965a19a30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006b4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80c3a9f09f9a80f09f9a80206f4df09f9a80f09f9a80c3a9c3a9c3a9c3a9f09f9a80f09f9a806fc3a94d6f4d206f6fc3a9c3a96ff09f9a8020206fc3a9f09f9a80204dc3a96f6f206f6f206f6f6f4d206ff09f9a804dc3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000155ef0db08267a77cae20000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a804dc3a9204d6f4d4d6ff09f9a80c3a96f4d6f4d6f6ff09f9a806f20f09f9a80c3a9c3a9204df09f9a804d6fc3a94d6f4df09f9a804dc3a9f09f9a806f6ff09f9a804d2020000000000000000000000000000000000000000000000000000000000000000000000000000000007d58ab58c3d4e07ad999000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a8020f09f9a80206f206ff09f9a80f09f9a804dc3a96f4d206fc3a96fc3a96ff09f9a806f4d6f4df09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000064ec1f550940cdc25d790000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a806f4d6ff09f9a802020f09f9a804d206f6f6f6f6f206ff09f9a806f20c3a9c3a92020c3a94dc3a9c3a96f6fc3a96f6f4d206f6f6f6ff09f9a80f09f9a804d20c3a9206f6f000000000000000000000000000000000000000000000000000000000000000000000000000000002c02dff21523e904d113000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806f206f206f206ff09f9a80c3a96ff09f9a804d4d4d4d20f09f9a80f09f9a804df09f9a806f20f09f9a80c3a9f09f9a80c3a96fc3a96fc3a920c3a9204dc3a96ff09f9a804dc3a96f6ff09f9a80f09f9a806f4d4d6f6fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000340bcde360be21435a87000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a80f09f9a8020c3a94d6f4d6f206ff09f9a804d4df09f9a8020c3a9c3a94d6f20c3a96f6f6f4d6f6f6f4d6f6f6fc3a9c3a9f09f9a80f09f9a806f6ff09f9a80c3a9c3a96f20f09f9a80f09f9a8020200000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000b218bf2798c223e3dee10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000965cc5cf4d6497545e1d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0e38767130a4cf7ad5b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a804d6f206f6f6f4dc3a96f6f4dc3a9c3a9c3a9f09f9a80f09f9a80f09f9a804d20206f4dc3a9c3a9c3a94d4d6f6fc3a9f09f9a80c3a96fc3a96f204d6f6f6ff09f9a804d206f204d6f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000014399b60ab1d1faab80a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a80c3a9206f6f20f09f9a80f09f9a80f09f9a80c3a96fc3a96f4d4d206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2d1cf3589359e39b928000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a80f09f9a8020c3a9f09f9a806ff09f9a806ff09f9a80206f6fc3a94d6f6f204d204d4dc3a9206fc3a94d4d6f4d206f6f20c3a9c3a920f09f9a80c3a9f09f9a80204df09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000da830f6f2efde7e4a76a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a8020c3a94d20c3a96fc3a9f09f9a804df09f9a804d204dc3a96f6f6fc3a9f09f9a80204d20c3a96f206f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80f09f9a806f2020f09f9a80f09f9a80f09f9a80204d206fc3a96f206f6fc3a9c3a9c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a812fd1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000013cf73188601d92b5b999f8bd52f04f9f8a0369f3e05e13581bcbe71dc3e926aa6cb000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000d13e497f1e5527a3c27834b0ded2b5fd3abeb6e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a092d5e795f3be6659ea34b2b398b614b9826f2953e5e3d579aa3a4a8afcbddd0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180a4d9191c96565cd2c349f9c8530d0377fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e018ea9744fff348e9c64f3338bf54fd041553be491bcfe49f0fdbe627414e4f0000000000000000000000000000000000000000dd6d2c2528c369d3a38962fcea7b7d35df8b8c2ac9211017182446b42780c97cbd9f6ebaed41f7c40ee5e62c0000000000000000000000000000000000000000c01fb30784f23cb589a60a0b86d0162622470078e075a86c08146dda6fd059f9ee5b079d4bd6b5b6adb2dfcd0000000000000000000000000000000000000000a32cf9bb8e297ab513cd1d2c9f18f6d5237f961e45ae2b6adada04ed3fdbc633a51c9beaa1816fad92a328d90000000000000000000000000000000000000000dda138fdc238b631d13018e66c0000000000000000000000000000000000000000000000000000197a5b850a89000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a806fc3a94d6f4d206f4df09f9a804d6f20204dc3a96ff09f9a80c3a96f4d6fc3a920c3a9c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000f61550409bcd4a3f1c470000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a80f09f9a80206f6fc3a9c3a96fc3a920204d4d204d20c3a9c3a96f206f20f09f9a8020c3a920f09f9a804d6f206f20c3a96f6f4df09f9a804d4d20f09f9a806fc3a94df09f9a80c3a96f2020204dc3a96f0000000000000000000000000000000000000000000000000000000039c91f8dbdf7a32e8c3a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a806f4d206fc3a920c3a9c3a96f6ff09f9a806fc3a9f09f9a804d6fc3a9c3a96ff09f9a806f6fc3a9c3a96f6f6fc3a9c3a9c3a9206f6fc3a9c3a96f4dc3a9206f20f09f9a8020c3a9c3a96f204d6f4d4d20c3a94d00000000000000000000000000000000000000000000000000a7a32dcfc52b81fb8aa10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a80c3a94d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000009929016d010501894b1e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a806f206f4dc3a9c3a94d6f206f6f6f6f6f6f6ff09f9a80f09f9a80204d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074e65ceafd6643fbbe53000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a806f6f6f6f4d4d4dc3a9f09f9a806f6ff09f9a80c3a96f6ff09f9a806f6ff09f9a8020f09f9a80c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000004151064a80a334221ee8000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a806ff09f9a806fc3a9c3a94d20206ff09f9a8020206f206f6f6fc3a9f09f9a8020c3a96f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806f6f00000000000000000000000000000000000000000000000000000000000000000000000000003137444f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000003e24a00398e780a43c3be0e2ebe1219c4a9a4a17823b0445eb881d7a0a9dca7ce46b0000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000001f7d10a796a0b01ec3283a0efe4662ce1559ffd300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a018863b8b339012d809b98142942d7057915e6f5b3b625e9c64b9ffd31bb8ac00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001802aea2b820e8dfca5d26a675335944badcf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c07e5de7c2e33b38f32447900ca4420d0e255b08c343517d2504d64581feb2e60000000000000000000000000000000000000000689631c288415225d5768836c26c4f2f5c1814515150ce9b74b2057cdac529c6c73269b96000196d7628df1a00000000000000000000000000000000000000002b22bdb3bc07288b7ff759e33e35fc69846197173e24beb7c054125f739dadc8525e64368dc39e86ea7df9de0000000000000000000000000000000000000000e356b235c1c7235689dcaf44ff42f0058d747f79ab9ea3c6eebccd31062d143c2658ee554a5e991dc87dd26e00000000000000000000000000000000000000002387df007ed2be3683376efed00000000000000000000000000000000000000000000000000000fb65448cd180000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a804d4d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a806f206f6f6f6f4dc3a9c3a9204dc3a94d4d206f6f4d6f20c3a96fc3a94d6fc3a92020f09f9a806f4dc3a94d4d20c3a9204d206f4d6f6f6ff09f9a80c3a9c3a920206f6f6fc3a9c3a94d20000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffa14864a5000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000026e3d9e33d5f2e412af116c31a93b0d27258332e5af002ccc7dc69e661a1cec24493000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a74d366a1c62ae724e42fd89b72ee014c65c78df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0cb80725b7c1cad31f47d3ee80c560b81e8a4dd2b295eb79056bf742310fc8b0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180a930afe6e210b3bfcd09beb8346e9bdefa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0f582f681c34198affb98cc050e274ae77f43f9e0addbe1a1938e4623282b3a000000000000000000000000000000000000000013daea11ee82499a8cbcaae4dafb22bdbc137f750cdbc42c8a9f571dd771e9e5738f668c1b7a5a3733b8a33b0000000000000000000000000000000000000000d1ac26dd4622380ed40a53e5703bf36e2756998fdb9e589406842585077db4effd2a919776e6b41303546e1a0000000000000000000000000000000000000000fa184b154898f29a96f2709877c97d5a7d513773d4ff04089a762c02aafdc49bc58717147150315948c3f64000000000000000000000000000000000000000008235ef5112191bb0bf8f4f8e7600000000000000000000000000000000000000000000000000001e481966173800000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a80c3a920c3a94d4d6f6f20c3a96f6f206f20f09f9a806fc3a94d6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a8020c3a9206f6f6fc3a96f206f6fc3a96f6ff09f9a806fc3a9f09f9a806f6fc3a94d204d4dc3a9206f6f4dc3a9f09f9a806f206f20f09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000010e00000000000000000000000000000000000000000000000000000000000001e20000000000000000000000000000000000000000000000000000000005806fdfb000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000d6d2d9c866a5e35332806576af8ec3d590461298d7f8128825a22aba5d48db506b25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000b696e384d6829658bfb71d4b88bbbf321ff9777300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a018729c2de78d8688c6ce47b17f62183da5d66fcc5037317ce617a5ade2f33b000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018026b07b89792f6dc10a054ca5f625b67eab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0d3dab3151aaf56c3f4d62e2850a08f68bb168a0e2b6f2f239c42afb1a5dc97000000000000000000000000000000000000000056bdfb01a44934810af1010d6047c1dc43c86c201aa67a63dfe1304ce7e5133eebe45c296c6ddb64d08263b900000000000000000000000000000000000000007e4e130416d1e7721fca3e1d7cfd7546ab959bba86a811b06891a91d2650f3576f09a7e1d289b61ff5f1e37700000000000000000000000000000000000000002ffcbdb56f8d3b3c4d431d2db5f158360981592577dcb27ec15e3e3b4b93772c9dcf893cafdbce2ec1832f640000000000000000000000000000000000000000a4f291cc57bf2c44a300162faf0000000000000000000000000000000000000000000000000000c551712f4a3e00000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a804d206f6f6ff09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a806f6fc3a94df09f9a80206fc3a9c3a96f6ff09f9a806f6f6ff09f9a80206f204dc3a9204dc3a92020206f6ff09f9a804d6f204df09f9a804d6ff09f9a80c3a96ff09f9a806f4d6f6f6ff09f9a8020f09f9a804d4d6f6f000000000000000000000000000000000000000000000000000000002c8cbb1d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000039836a489d487a860b14b2e17b3fd6cd1634596166f9a76cefd3de0b605ab9512b0e000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000096563133d098c6cdb92d8af284ae57e0674159300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a06bf5b4a9ebe952fa7b8f9c4af1cd5a5d36834e99aff65611ac2085e6085bd90000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180bf51bb827ad140cd939d46eeb58884c04300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0c28f97501f7791652fb45bb3d9976991bedac8ddf291eade2581dcc10dcf62000000000000000000000000000000000000000058f13e39e80440ae1edba087264d41991d972b7c188164e117804b6339c4e0347122b0189b8503ef38892b280000000000000000000000000000000000000000ff8bed1c531ae7be339c71f388bd58cef4a779fd62899c2c85e99373c3b7e387394dc1a389e38c9a68866e5b00000000000000000000000000000000000000001e5b69488c6c5e2945d6df5593d8690ec22dfafe6dc7c6ba7e040bbca489b51c01b046eb15613743edd44e6400000000000000000000000000000000000000009a679b189466ac7891ed0a11360000000000000000000000000000000000000000000000000000554353c7409800000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80c3a94d6f204d6f6f6fc3a94dc3a96ff09f9a804d20c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000a4d371eeda81e42e8dec0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80f09f9a806f6f6f4df09f9a80c3a92020f09f9a80c3a96f6f6f6f4df09f9a806ff09f9a804d4d6fc3a96f4d4df09f9a806f6fc3a96f4df09f9a80c3a9206f206fc3a96fc3a9204d4d6f6fc3a9f09f9a80204dc3a9000000000000000000000000000000000000000000000000afb9e3a65b68a041d35a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a804df09f9a80c3a94d204d206f20f09f9a80c3a9f09f9a80c3a9c3a9206f6fc3a94d6fc3a9204d4df09f9a804d6ff09f9a806ff09f9a804d4d4df09f9a80f09f9a80204d6f000000000000000000000000000000000000000000000000000000000000000000000000000000004c9b9f8e4aff8719c99c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a8020f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000001df5fc943e0aee527f17000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a806ff09f9a806f6ff09f9a80c3a9206fc3a920c3a9c3a96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036d9fc42ef7e53491ed6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a80206f206fc3a9f09f9a806f4d4d4d6ff09f9a80f09f9a8020f09f9a806f4d6fc3a94d6f4d6ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000f015190f7cf2b53556ef000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f2020c3a96f20c3a94dc3a9f09f9a806f20204df09f9a806ff09f9a806f4d204d4d6f4d4d206f20c3a96f20c3a96ff09f9a80f09f9a806f4d4d202020f09f9a80f09f9a806f6f4dc3a96f4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000007f497e270a6c59a5da7f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a804d6f6f6ff09f9a8020c3a96f6f4d6fc3a9f09f9a80c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e89ab69e1bc53c38a45a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a806f4df09f9a80f09f9a80c3a96f4d4d4df09f9a80f09f9a806f6f6fc3a96f6f6f4dc3a94d6ff09f9a806f4dc3a94d6fc3a9f09f9a806f4d6ff09f9a802020c3a96ff09f9a8020206f6f6f20f09f9a80c3a96fc3a9f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048577c29c1441b112051000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a806fc3a9f09f9a804df09f9a806f6fc3a9c3a9c3a94d6f206f6f4dc3a94df09f9a806f6ff09f9a804d6f6f204df09f9a80f09f9a80f09f9a806ff09f9a806f6f20f09f9a806f4d6ff09f9a80c3a9206f204df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000684d6f6f20c3a9f09f9a806f6f6ff09f9a8020204df09f9a806f4d4dc3a920f09f9a804df09f9a80c3a96ff09f9a806f6f206f6f4d20c3a9f09f9a806f6f6fc3a9c3a920c3a9c3a9c3a96f6fc3a96ff09f9a806ff09f9a806f6fc3a96f20206f206f206ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036c1179700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000c8ae59886da1990ce34271c85d1f7ad57d1f3565af13198555b24f5c469c7c8d167000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000052381eb8042518cfcd935a58dec4334c3f97489e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b547c7cfcd6b78f66b4eecfdea431273018a3671ef8d68065a8edc201c233b00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001803f68e27ce7b2ad3ef0f90b12fef74c3aa30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200e7ece7ae291cd0458a033985ada4c2fec400224a751c41f6447cf13301a4010000000000000000000000000000000000000000a32be1dc5af912bff887477822255a667a600e5ee772487aa83888580271ad9d46ee529c5a50f6f3acb0b16f0000000000000000000000000000000000000000d9edbf1e32aba56f7b3c8eb6f20db78f003a4145bebf8fbd7fce49fb124592f6c0e551fdc45bb4aa2fd837c900000000000000000000000000000000000000006ab4b4e9a67a62ab296968edde6c94b1caf5cae510639dc473a027026fecb07fee48304a13c1fe99817356cb000000000000000000000000000000000000000046aa6ff0856eab8c4a42c173640000000000000000000000000000000000000000000000000000bc4a0928482300000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a806f6fc3a96f206ff09f9a804dc3a96f4d4dc3a92020f09f9a806fc3a9f09f9a80f09f9a806f20204d2020c3a96f6fc3a94dc3a92020c3a96fc3a9c3a96fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000008994a150dbcbc6f507070000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a80c3a96f6f6f6f6ff09f9a806fc3a94d4d6f6f202020c3a96f20c3a920c3a9c3a9c3a9c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000c6194ce5f1ea66e66f5000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a802020204d6f6f6f6fc3a96f6fc3a9c3a9f09f9a806ff09f9a806f206f4d20204d6f6ff09f9a804d6f20c3a9c3a96f6f206fc3a96f6f6f6ff09f9a806f6fc3a9f09f9a80206f6f4d2000000000000000000000000000000000000000000000000000000000000000000000000063616de9f1b585c9f23f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a80f09f9a806f4d20f09f9a804d6f6f204d4d4dc3a9206f6f206f6ff09f9a806f6ff09f9a806f4d4dc3a9204d206f6fc3a9c3a96fc3a94d6f20c3a9206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000026f0560e2199a723772d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a804dc3a9f09f9a806f4df09f9a800000000000000000000000000000000000000000000000000000000000000095b45726de09ffc015b70000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b0924d007b91c9717da000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a80c3a94d6ff09f9a80c3a9c3a96fc3a94dc3a96ff09f9a806ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000703d0b98f807d9e1f8ec0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b10e5a7a94d653915b8f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a806ff09f9a80f09f9a8020f09f9a80f09f9a806f204d6ff09f9a804dc3a9c3a96f4dc3a96f4df09f9a806ff09f9a804dc3a96f6f6f4df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055ba78c28504bb3e3f22000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a806fc3a9206ff09f9a806f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000006c9ba5ef252941b1543e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806f6f4dc3a9f09f9a806f6f6f00000000000000000000000000000000000000000000000000000000000000001ba2e3f78dbd08033d30000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a804dc3a920f09f9a806f4dc3a94df09f9a80f09f9a806f4dc3a96f206f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066b198f7d8b03f5533a3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a806ff09f9a804dc3a96f6fc3a9206f0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ddd11140000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000481eaeb7d991d41d2e9d46924e4f5913d7830e45246d546111b393349a7e51408075000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e197af46e9e37c4a6895ca782651da6377e279bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0a188b35c1d88ceb6ee0784da9e16e8e808c8c736520c4e4bb31de59d598f32000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018061a2d25a7d1a2179e68e410932c51efb9b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c012dcb1bc894edcec544c35af28d5be0a590a40830edd501c8c715faeb812d90000000000000000000000000000000000000000584ac0305501dd6114c9a744d68d9fbe397650464e7b601019a91d2728b4cadbbcbbe79d21bfeb1f71b5336c00000000000000000000000000000000000000006c82a1c8aa84d7513e59bc7b19cc1e1fdc69738faa5d6621e6570f96ea5455879d84e6aced6eb8f4a98532b80000000000000000000000000000000000000000733c9baf7be298187b324941ceb8b96fd6a9e1bd59acb7c0b76803b3ebc93ddd50715a5c7600ce89852e0ed00000000000000000000000000000000000000000358cda73d04a4471e0d14eccdf00000000000000000000000000000000000000000000000000004e90382b65e600000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80206f206fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000ca06319d4c567aa92dcd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029a8c906d873daf6eee5000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806ff09f9a806f20c3a96f4d4d20000000000000000000000000000000000000000000000000000000000000007fd4e78ed9893302405b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80206fc3a96f20c3a9c3a920f09f9a806f6f20000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000e8e06a9363537d9a3817000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a80c3a96f20f09f9a806f4d6fc3a9c3a9206f206f4d6f6f6f6f4df09f9a80c3a9c3a9f09f9a80f09f9a80c3a96f2000000000000000000000000000000000000000000000000000000000000000cb34b438e61c3a41eb6f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a8020f09f9a804d20204d6f6f6fc3a9f09f9a80206f6f204d206f206f6f20f09f9a806f206fc3a9204d000000000000000000000000000000000000000000000000000000000000000000000000d90d7ae6d724115146e9000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a80f09f9a804d6f6f20206fc3a9f09f9a806f4d6f20f09f9a804d206f4d4d6f4d6f204dc3a94df09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80206f6fc3a96ff09f9a80f09f9a806f6f4d0000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000015e00000000000000000000000000000000000000000000000000000000000001cc0000000000000000000000000000000000000000000000000000000001ad3c4a300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000069e15f8c19b18e8132e5855fcb7e84a8c0cb2d9cd67b7931a9d2c93bf826c2b77b5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a322764125e3a508d77e0ba42c154c12e193bd5e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0de240c049f7da90a7ecb9156c990f89bdceb476917fd3322998d3bec8e0c5b0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180617345c7fbe4523b00537142e2f8705b9a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c085d89f6f7782bc2075891a6d05add5f17d67133c2f7dfd884628f5b9135b5f000000000000000000000000000000000000000066e6a3e4c99e55af5a4fade2fe0fb8607251804ff82b5b152a4bae09bd636adc9ad4063a6d6ca2cab25605370000000000000000000000000000000000000000cf35c04404a2233b8b48d8e6f03ccbe135ae880f89c39361f314bffdf7a5c2aa5a2dedae7c3a6caa348482360000000000000000000000000000000000000000dca1ee33037191c6b6af62c682fa0b99564ab5bb7c3cf61146ccf566c56f9a5a7aa6f2c2bda64b15303e17130000000000000000000000000000000000000000f6d9c76639a386b4f513294d9200000000000000000000000000000000000000000000000000004bc6fa3ce445000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80204d204df09f9a806f6f6f4d4d4df09f9a80000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000d92baee7e5351a4cc12f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806f4d6f4dc3a96fc3a96f4d6f206fc3a94d6f206f4d206f6f6f6f4d4d6f4dc3a9204d4d206f6f4d4dc3a9c3a9f09f9a806f206f000000000000000000000000000000000000000000000000002a59d3951b229224998e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80f09f9a804df09f9a80f09f9a804d4d20c3a9c3a9c3a9206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cc651a4bd544cecc371000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a806ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000006d1dd82057764edd0c2d000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806f4d6f6f20c3a9c3a96f4d4d20000000000000000000000000000000000000000000000000000000000000009ada22de720a2845ba030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007b4d6f6f20c3a9f09f9a80c3a9c3a94d6ff09f9a8020f09f9a806f20f09f9a806f6f6ff09f9a806f206ff09f9a80f09f9a804d4d20f09f9a806ff09f9a80206f6fc3a96ff09f9a80f09f9a80c3a94d6f6f6f6fc3a96f6ff09f9a804d6ff09f9a80f09f9a8020f09f9a80f09f9a80f09f9a806f4d6f6ff09f9a80c3a900000000000000000000000000000000000000000000000000000054652f0f31a049dfd7880000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a804d6ff09f9a80206f6f204d206fc3a9f09f9a806f200000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000baa1895199ffb73979d10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a804d6fc3a9f09f9a80c3a96f204d20c3a94d4df09f9a806f6f4d4df09f9a80206f6f6f4df09f9a806f4d6f6f6ff09f9a80f09f9a80c3a94d4d4df09f9a80f09f9a80206ff09f9a804d4d6f4df09f9a80204d6f00000000000000000000000000000000000000000000000000008ac0dc145507dec21fb9000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a96f6ff09f9a80c3a9f09f9a804d4d4d6f6f20f09f9a80c3a9f09f9a80c3a9c3a96fc3a9c3a920c3a94dc3a9206f20c3a94d4d4d6f6f6ff09f9a806f6f6f4d4d6f6fc3a9c3a94d6f20c3a9206ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220c5d1d9832f031e72c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006d4d6f6f20c3a9f09f9a806f6f4df09f9a806f4d206f206fc3a96fc3a9f09f9a806fc3a96ff09f9a804d20f09f9a806ff09f9a80f09f9a80f09f9a80c3a9f09f9a8020c3a94d206fc3a96f204d204df09f9a806fc3a920f09f9a80f09f9a80f09f9a804dc3a9f09f9a80206f206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000d349946fdf439f5d6390000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a806ff09f9a80f09f9a80f09f9a804d6fc3a96f6f4dc3a9c3a9c3a9c3a9c3a9c3a920c3a9f09f9a80206ff09f9a806f6f20f09f9a80c3a94df09f9a80c3a96f4d204d206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000cb29882ba331e2e1fc930000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a806f20c3a96f4d20f09f9a8020c3a94d6f4d4d6ff09f9a804d6f4d4df09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f07f29cabcc7a9338180000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a80f09f9a806fc3a96f6f4d6ff09f9a8020f09f9a80204dc3a9f09f9a806f6f4d6f6f6f6ff09f9a80f09f9a804dc3a96f6fc3a96fc3a96f4d6f6f6f6f6f6f4d6f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80f09f9a806f6f6fc3a9206f4d206fc3a9f09f9a806ff09f9a804dc3a94d6f204df09f9a806f6f4df09f9a806f204d4d000000000000000000000000000000000000000000000000000000000000000000000029c0f231000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000009704204ab10aa300ccca1671adbde8393212111aa00d5c0e5d7b5453b136a72d0b04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000a0cf4b6227a6214dcdfad8f3b9a2b2159342c96700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0ba32bcbcc576d6084f8da91ef59fabc42d2c32870f8f89e74d76849b23de8e0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180e64be12210d44d8c9af2b28b479fdda6e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200df5e535bdb2251e7b882f04e2c196d209e69bf0727fbcafe195e4536825a1b000000000000000000000000000000000000000056d1c9e5ffc1204fad24e1e11f221da0d5340ce979deba370153b25c5ad15c51438f37375ab06c759b7a9f480000000000000000000000000000000000000000c3d7fdc29451b2c656f2396e13814565cb98266cee7971f06826107017acb8ea548cde76f1a84d2ab364ad66000000000000000000000000000000000000000072a479051f3727927fa86f343857119d2a41f20ade5aa366907021ca01c8dabdc944aa24f0a17f237bbc063d00000000000000000000000000000000000000009c8e068608b07f30afa6b69c1a000000000000000000000000000000000000000000000000000005d2a625e7d500000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80f09f9a806ff09f9a80204d4dc3a96f204d6f6f6ff09f9a80c3a96f20f09f9a8020c3a9206fc3a96ff09f9a80c3a94dc3a94dc3a94dc3a94df09f9a804d6f6f6f20f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000d386b862cc399a44a8140000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a806f6f6f20c3a96f4d6f20206f20f09f9a80c3a94d6ff09f9a804df09f9a806f4d6fc3a9206f6fc3a96ff09f9a80c3a94dc3a900000000000000000000000000000000000000000000000000008e59ec5123a8911a57f6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000694d6f6f20c3a9f09f9a806f6f6fc3a96ff09f9a806f6fc3a920f09f9a806ff09f9a804df09f9a806ff09f9a806f206f4d6f4dc3a9c3a9f09f9a80c3a96f6fc3a96f4d206f4df09f9a804d6f6fc3a94df09f9a806f20c3a9f09f9a80c3a94d6ff09f9a804d6f20c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077c3ba4490b8f4f8bce5000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a80c3a96ff09f9a806f6f4d6f6fc3a9206f6f6f4d20206f6f4d4d6fc3a94dc3a94dc3a9206f4d4d20204d4d4d4dc3a96f4d6f4dc3a96f4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80f09f9a806ff09f9a80f09f9a806f6f4df09f9a806f6ff09f9a80c3a9c3a9f09f9a80f09f9a806fc3a96f4d20f09f9a804d6ff09f9a80f09f9a80f09f9a80f09f9a80f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000169cadc0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000010f95153affb4b8f000774670384e84ff808431f60951061811e1da8808f4b8815700000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000009b867cfd32926770310f8dc48f2a5761f8cedb0b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a046011da7fb6d10b847738342476d67cdafa19c63bef70301d8e60a8212c84c0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180fdfac1c8007af04108c1865d6c50fa124900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002200747c3b1da93154e98dca22db9b30987ed2ed20c0d806647b1288968a3c7d700000000000000000000000000000000000000003456484ed978ceda172f61bacb5f0f712b08bf9f443e4b1e177842f36510f49100058d3ea926cd25630247a700000000000000000000000000000000000000005b30ca9a6ea621145980ff6503a6db2d5c4a63a868f1a217950b0b308cee6bf793a070fe16729c4b62effbe800000000000000000000000000000000000000008035473b14a0868e33d4f37a9468169af8168260dc2ecfb574beac056944f32f2f530a7ea62ed3cd1577ba6e0000000000000000000000000000000000000000efcd36468e7972a6b096498cfc0000000000000000000000000000000000000000000000000000158f731f92bb000000000000000000000000000000000000000000000000000000000000006a4d6f6f20c3a9f09f9a80f09f9a80f09f9a806ff09f9a80f09f9a806fc3a9204d4df09f9a8020c3a96f4d6f4df09f9a80f09f9a80c3a96f6f6ff09f9a806ff09f9a806f6ff09f9a806f4df09f9a80c3a96fc3a9206f4d4d4d20c3a96f6fc3a9f09f9a80c3a96ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000c259b72a84463ba457d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005f4d6f6f20c3a9f09f9a80c3a96ff09f9a802020c3a96fc3a94d4d4dc3a96f20c3a920c3a9c3a94df09f9a80f09f9a80f09f9a806f6fc3a9f09f9a804d6ff09f9a80f09f9a804dc3a94dc3a9f09f9a804d6f206fc3a94dc3a96f204d4d6f6f6f0000000000000000000000000000000000000000000000bcebcd8de032fd2726c5000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a806f6f4d20f09f9a80c3a96f4d6f206f6f20c3a94d4dc3a94d6fc3a96f6ff09f9a806f20f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000befaf7021e66ebf84e5b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a80204d4d20f09f9a80206fc3a9c3a9f09f9a80c3a92020f09f9a806fc3a9f09f9a806fc3a920c3a9206f20f09f9a806ff09f9a80c3a96f6f20c3a96ff09f9a8020f09f9a804d4d4df09f9a802020000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a804d6f6f206f4dc3a96fc3a9c3a96f6fc3a90000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc1527d10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000f2f5b1a0c9bc1e19417c16c4099975c42e171f8d5afc0165a795590aa4d4053e105f000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000453ae228c89c6ed368617e677a883f251ae6159300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a05fcc25a764936dfa632e9515846c730f51dece1ec0f392da926ee942bb273b000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018033152d109b1c0e4be90cd6c417d5c70d1700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0c626c1b4c9017d322408531761b91c8d5a563a7ee1caf991a87d491105136d0000000000000000000000000000000000000000d08ed8722a753c28a6bf848f509f8b3ff1ffdb11b8b7dd7966335f1086ab986d8e074ad0c64a6e9f2a2becac0000000000000000000000000000000000000000ec3952079480b8826826a9344659681117d865de490b4dc9624d2c8d6dc81eee44ae06a90c9c13dbb800acf100000000000000000000000000000000000000008bcf19a6c0e2a5d0863ceae97d4054712b301a4f27057b5c125287fdab406a13bbfec45fea29c6f8ca27ca280000000000000000000000000000000000000000d59d9083b2ede887d6e32bb9970000000000000000000000000000000000000000000000000000d055bc082b78000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a806fc3a96f4d206f6fc3a9c3a96f20f09f9a80f09f9a8020f09f9a806f6f20f09f9a806f6f6f6f204d20c3a96ff09f9a80c3a96f6f0000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000b7cc26f1fc61d16a3747000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a806f6f20c3a9c3a9204dc3a9c3a94d6f6f4d6ff09f9a804dc3a96f2020f09f9a806f6f6f6ff09f9a804d4d6f6fc3a96fc3a9c3a94d206ff09f9a806ff09f9a80c3a96ff09f9a806f4d00000000000000000000000000000000000000000000000000000000000000000000000011b4601ec870f6d8965d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80f09f9a80c3a9c3a94dc3a96f4dc3a96f6f206f4d4d206f204d2020c3a96f20c3a9204d206f20f09f9a80204d6f6ff09f9a80c3a90000000000000000000000000000000000000000000000006753b519817bdb1a09b3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a806f6f4d6f4d6f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a806f6f6fc3a9f09f9a80c3a9c3a9206ff09f9a804d6fc3a9f09f9a804d206f6f6ff09f9a804d4d2020f09f9a80c3a90000000000000000" + }, + { + "name": "random-(bytes6,string,(address,int168,uint248,(bytes16,string,(address),(bool,(bool[1],string,address,((string,string[1]),int128,address,address))),string)[],address[2]),string)", + "type": "(bytes6,string,(address,int168,uint248,(bytes16,string,(address),(bool,(bool[1],string,address,((string,string[1]),int128,address,address))),string)[],address[2]),string)", + "value": [ + "0xd6a6d56e8dfe", + "Moo é🚀 ooMéMM ", + [ + "0x5C7DFeDc0A31b52036D502B28E14530Ad4D01CD0", + "17601828751497087310125586715235872856368303052213", + "217240073057417179001824132277089683280053034351984081946948220603723217330", + [ + [ + "0x9833067bd8081d385379cd5c2d97e0ca", + "Moo é🚀o 🚀oéMooooM éMéoo🚀🚀🚀 oMMM 🚀éM o MMoéooM🚀oéo🚀o ééo ", + ["0x9b22AA1B1d5343e4C05F005079303C9D54Bee3D0"], + [ + false, + [ + [false], + "Moo é🚀Méo🚀o🚀oMoéoo🚀🚀o 🚀oMo🚀🚀🚀o🚀M éo🚀M🚀M🚀é é é MM M🚀", + "0x9805206D07D3367000aC154cF193B7b3a67Bd43d", + [ + ["Moo é🚀éoMM🚀ééo éM🚀o🚀ooé 🚀M M", ["Moo é🚀o🚀🚀"]], + "49292834066700206678247183266662468294", + "0x70a0D3513e804574a0a20dfd63C58FEb415D49D4", + "0x3ea4f78F1401bE5bC2fbB80a28FFB2571988f928" + ] + ] + ], + "Moo é🚀🚀 éo🚀 M oMoé" + ], + [ + "0x63fd66a9338ff84774c8bb6bf7fb4534", + "Moo é🚀oo oo🚀🚀🚀M oéMMé oMo🚀oMooo éooMé", + ["0x36C65E7Db1C4d1DE8bdc75cFE15325142a00Bc89"], + [ + false, + [ + [true], + "Moo é🚀", + "0xAD08Bd45C5cdde038892bA8e5B6d083628147B56", + [ + [ + "Moo é🚀oéo🚀 🚀o🚀 ooooooMo🚀oMéoM o🚀🚀 ooé éo", + ["Moo é🚀 M oo"] + ], + "-70880202837806996608293628351541434668", + "0x4C16713382DA1F313255d33E7Ee6528c66AD582b", + "0xCfA3260F781dd6d0b758784fBdd38F1A407B1dB3" + ] + ] + ], + "Moo é🚀éooM 🚀oMéMMo" + ], + [ + "0xe9e7dffb334d12c091b995ac673b7a97", + "Moo é🚀Mo Mé oo MoMéooMoéMé🚀oé🚀o🚀 éoM ooé🚀M", + ["0x625cAFbB258a05240aD8F3A17e76e078b25EdE64"], + [ + true, + [ + [true], + "Moo é🚀ooM", + "0xD9D2691334D3ED2C69DD219D75A8616e8c4C968f", + [ + ["Moo é🚀o🚀oM 🚀o MM🚀oo", ["Moo é🚀éo"]], + "-164302756442392904686524561251483093889", + "0x1CD86029dE60A2e7d2e103B0D4704CD53bB7E300", + "0x182755373337B44856Ec9464c22DF1c1DB5afE3F" + ] + ] + ], + "Moo é🚀MéoMoéM o" + ], + [ + "0xc947748795be8fb4f06d6f2dae7a871e", + "Moo é🚀o Moo🚀 oo ", + ["0x5d06CF92198E46929EcB5Be1fde4b0CFDFd116Cb"], + [ + false, + [ + [true], + "Moo é🚀M 🚀é🚀oo🚀Mo🚀é 🚀Mooooooo", + "0x3414f5756C5c91129E8D4450fDE1b6e509Bb048b", + [ + [ + "Moo é🚀 M🚀oM🚀o ooooMo🚀éM oo🚀MMéMoéé M", + ["Moo é🚀o Moéo🚀ooo🚀ooM"] + ], + "-138793539658939051109607675178891855643", + "0xf89D7cd5057C890cf4668e2CE85048114597F733", + "0xC77Ec3d79296970F4Df2f8eC3D49955e11318982" + ] + ] + ], + "Moo é🚀o🚀MééoooMéooéM éo🚀🚀ooMM🚀o éo🚀oéé M o🚀Mo éé é MoMo oo" + ] + ], + [ + "0xdBBb61b1BcdFA8405CFC8F25c1CA0D55D44eFE68", + "0xeeE5b9b29b211Ec185f70486233Bea87Eb6B02f4" + ] + ], + "Moo é🚀" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd6a6d56e8dfe" + }, + { + "type": "string", + "value": "Moo é🚀 ooMéMM " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5C7DFeDc0A31b52036D502B28E14530Ad4D01CD0" + }, + { + "type": "number", + "value": "17601828751497087310125586715235872856368303052213" + }, + { + "type": "number", + "value": "217240073057417179001824132277089683280053034351984081946948220603723217330" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9833067bd8081d385379cd5c2d97e0ca" + }, + { + "type": "string", + "value": "Moo é🚀o 🚀oéMooooM éMéoo🚀🚀🚀 oMMM 🚀éM o MMoéooM🚀oéo🚀o ééo " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9b22AA1B1d5343e4C05F005079303C9D54Bee3D0" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Méo🚀o🚀oMoéoo🚀🚀o 🚀oMo🚀🚀🚀o🚀M éo🚀M🚀M🚀é é é MM M🚀" + }, + { + "type": "address", + "value": "0x9805206D07D3367000aC154cF193B7b3a67Bd43d" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoMM🚀ééo éM🚀o🚀ooé 🚀M M" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀🚀" + } + ] + } + ] + }, + { + "type": "number", + "value": "49292834066700206678247183266662468294" + }, + { + "type": "address", + "value": "0x70a0D3513e804574a0a20dfd63C58FEb415D49D4" + }, + { + "type": "address", + "value": "0x3ea4f78F1401bE5bC2fbB80a28FFB2571988f928" + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 éo🚀 M oMoé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x63fd66a9338ff84774c8bb6bf7fb4534" + }, + { + "type": "string", + "value": "Moo é🚀oo oo🚀🚀🚀M oéMMé oMo🚀oMooo éooMé" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x36C65E7Db1C4d1DE8bdc75cFE15325142a00Bc89" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0xAD08Bd45C5cdde038892bA8e5B6d083628147B56" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéo🚀 🚀o🚀 ooooooMo🚀oMéoM o🚀🚀 ooé éo" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M oo" + } + ] + } + ] + }, + { + "type": "number", + "value": "-70880202837806996608293628351541434668" + }, + { + "type": "address", + "value": "0x4C16713382DA1F313255d33E7Ee6528c66AD582b" + }, + { + "type": "address", + "value": "0xCfA3260F781dd6d0b758784fBdd38F1A407B1dB3" + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éooM 🚀oMéMMo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe9e7dffb334d12c091b995ac673b7a97" + }, + { + "type": "string", + "value": "Moo é🚀Mo Mé oo MoMéooMoéMé🚀oé🚀o🚀 éoM ooé🚀M" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x625cAFbB258a05240aD8F3A17e76e078b25EdE64" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooM" + }, + { + "type": "address", + "value": "0xD9D2691334D3ED2C69DD219D75A8616e8c4C968f" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀oM 🚀o MM🚀oo" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀éo" + } + ] + } + ] + }, + { + "type": "number", + "value": "-164302756442392904686524561251483093889" + }, + { + "type": "address", + "value": "0x1CD86029dE60A2e7d2e103B0D4704CD53bB7E300" + }, + { + "type": "address", + "value": "0x182755373337B44856Ec9464c22DF1c1DB5afE3F" + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MéoMoéM o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc947748795be8fb4f06d6f2dae7a871e" + }, + { + "type": "string", + "value": "Moo é🚀o Moo🚀 oo " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5d06CF92198E46929EcB5Be1fde4b0CFDFd116Cb" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M 🚀é🚀oo🚀Mo🚀é 🚀Mooooooo" + }, + { + "type": "address", + "value": "0x3414f5756C5c91129E8D4450fDE1b6e509Bb048b" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 M🚀oM🚀o ooooMo🚀éM oo🚀MMéMoéé M" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o Moéo🚀ooo🚀ooM" + } + ] + } + ] + }, + { + "type": "number", + "value": "-138793539658939051109607675178891855643" + }, + { + "type": "address", + "value": "0xf89D7cd5057C890cf4668e2CE85048114597F733" + }, + { + "type": "address", + "value": "0xC77Ec3d79296970F4Df2f8eC3D49955e11318982" + } + ] + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀MééoooMéooéM éo🚀🚀ooMM🚀o éo🚀oéé M o🚀Mo éé é MoMo oo" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xdBBb61b1BcdFA8405CFC8F25c1CA0D55D44eFE68" + }, + { + "type": "address", + "value": "0xeeE5b9b29b211Ec185f70486233Bea87Eb6B02f4" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611110806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610c6b565b60405180910390f35b6100566109aa565b61005e6109aa565b656b536ab746ff60d11b8152604080518082019091526013815272026b7b79061d4f84fcd401037b7a6e1d4a6a69606d1b6020808301919091528201526100a36109d7565b735c7dfedc0a31b52036d502b28e14530ad4d01cd08152740c0b2d4c95d0bb71f3f0256634cb9b701cd05015b560208201527e7af41a26cf7dc4e0387e7d9d082d66e531cca374370318197dfd2cedc8f9b26040808301919091528051600480825260a08201909252600091816020015b61011c610a0b565b815260200190600190039081610114579050509050610139610a0b565b6f4c19833dec040e9c29bce6ae16cbf06560811b81526040805160808101909152605980825260009190610e6a602083013960208301525061018660408051602081019091526000815290565b739b22aa1b1d5343e4c05f005079303c9d54bee3d0815260408201526101aa610a41565b600081526101b6610a59565b6101be610a87565b60008082529082526040805160a081019091526064808252610f076020830139602083015250739805206d07d3367000ac154cf193b7b3a67bd43d6040820152610206610aa5565b61020e610ad3565b600060405180606001604052806031815260200161107960319139825250610234610ae9565b60408051808201825260138152719adede418753e13f3500dfe13f3501e13f35606f1b602080830191909152908352838101929092529183526f2515745b3e87d3c2e109a8fa176e4ac6838201527370a0d3513e804574a0a20dfd63c58feb415d49d483830152733ea4f78f1401be5bc2fbb80a28ffb2571988f9286060808501919091528481019390935284810193909352908401929092528151808301909252601f82527f4d6f6f20c3a9f09f9a80f09f9a8020c3a96ff09f9a80204d20206f4d6fc3a90090820152608082015281518190839060009061031957610319610e53565b60200260200101819052505061032d610a0b565b6f18ff59aa4ce3fe11dd322edafdfed14d60821b81526040805160608101909152603980825260009190610fa3602083013960208301525061037a60408051602081019091526000815290565b7336c65e7db1c4d1de8bdc75cfe15325142a00bc898152604082015261039e610a41565b600081526103aa610a59565b6103b2610a87565b600181528152604080518082018252600a8152689adede418753e13f3560b71b60208281019190915283015273ad08bd45c5cdde038892ba8e5b6d083628147b56908201526103ff610aa5565b610407610ad3565b6000604051806080016040528060448152602001610ec36044913982525061042d610ae9565b604080518082018252601081526f4d6f6f20c3a9f09f9a8020204d206f6f60801b602080830191909152908352838101929092529183526f355307cf90ec0abe07d3d4d3b79c592b1983820152734c16713382da1f313255d33e7ee6528c66ad582b8383015273cfa3260f781dd6d0b758784fbdd38f1a407b1db36060808501919091528481019390935284810193909352908401929092528151808301909252601c82527f4d6f6f20c3a9f09f9a80c3a96f6f4d2020f09f9a806f4dc3a94d4d6f00000000908201526080820152815181908390600190811061051357610513610e53565b602002602001018190525050610527610a0b565b6fe9e7dffb334d12c091b995ac673b7a9760801b81526040805160808101909152604180825260009190610fdc602083013960208301525061057460408051602081019091526000815290565b73625cafbb258a05240ad8f3a17e76e078b25ede6481526040820152610598610a41565b600181526105a4610a59565b6105ac610a87565b600181528152604080518082018252600d81526c4d6f6f20c3a9f09f9a806f6f4d60981b60208281019190915283015273d9d2691334d3ed2c69dd219d75a8616e8c4c968f908201526105fd610aa5565b610605610ad3565b6040805180820190915260208082527f4d6f6f20c3a9f09f9a806ff09f9a806f4d20f09f9a806f204d4df09f9a806f6f908201528152610643610ae9565b604080518082018252600d81526c4d6f6f20c3a9f09f9a80c3a96f60981b602080830191909152908352838101929092529183526f7b9b8f52d6d97a1d8c1feeaa9c8d8b801983820152731cd86029de60a2e7d2e103b0d4704cd53bb7e3008383015273182755373337b44856ec9464c22df1c1db5afe3f606080850191909152848101939093528481019390935290840192909252815180830190925260158252744d6f6f20c3a9f09f9a804dc3a96f4d6fc3a94d206f60581b908201526080820152815181908390600290811061071e5761071e610e53565b602002602001018190525050610732610a0b565b6f64a3ba43cadf47da7836b796d73d438f60811b815260408051808201909152601781527f4d6f6f20c3a9f09f9a806f204d6f6ff09f9a80206f6f2000000000000000000060208083019190915282015261079860408051602081019091526000815290565b735d06cf92198e46929ecb5be1fde4b0cfdfd116cb815260408201526107bc610a41565b600081526107c8610a59565b6107d0610a87565b60018152815260408051606081019091526031808252600091906110aa6020830139602083015250733414f5756c5c91129e8d4450fde1b6e509bb048b604082015261081a610aa5565b610822610ad3565b6000604051806060016040528060388152602001610f6b60389139825250610848610ae9565b604080518082018252601f81527f4d6f6f20c3a9f09f9a806f204d6fc3a96ff09f9a806f6f6ff09f9a806f6f4d00602080830191909152908352838101929092529183526f686aa9d558cc24e33ba5433d431fc71a198382015273f89d7cd5057c890cf4668e2ce85048114597f7338383015273c77ec3d79296970f4df2f8ec3d49955e11318982606080850191909152848101939093528481019390935290840192909252815160808101909252605c8083526000929161101d90830139608083015250815181908390600390811061092457610924610e53565b602090810291909101015250606082015261093d610b10565b73dbbb61b1bcdfa8405cfc8f25c1ca0d55d44efe68815273eee5b9b29b211ec185f70486233bea87eb6b02f460208083019190915260808301919091526040838101929092528151808301909252600a8252689adede418753e13f3560b71b908201526060820152919050565b6040805160808101825260008152606060208201529081016109ca6109d7565b8152602001606081525090565b6040805160a0810182526000808252602082018190529181019190915260608082015260808101610a06610b10565b905290565b6040805160a0810182526000815260606020820152908101610a3860408051602081019091526000815290565b81526020016109ca5b6040518060400160405280600015158152602001610a065b6040518060800160405280610a6c610a87565b81526060602082018190526000604083015201610a06610aa5565b60405180602001604052806001906020820280368337509192915050565b6040518060800160405280610ab8610ad3565b81526000602082018190526040820181905260609091015290565b604051806040016040528060608152602001610a065b60405180602001604052806001905b6060815260200190600190039081610af85790505090565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b81811015610b5457602081850181015186830182015201610b38565b81811115610b66576000602083870101525b50601f01601f19169290920160200192915050565b6000815160808452805160406080860152610b9960c0860182610b2e565b602092830151868203607f190160a0880152929091508181810160005b6001811015610be1578482038352610bcf828751610b2e565b95840195928401929150600101610bb6565b50828701519450610bf683890186600f0b9052565b60408701519450610c1260408901866001600160a01b03169052565b60608701519450610c2e60608901866001600160a01b03169052565b979650505050505050565b8060005b6002811015610c655781516001600160a01b0316845260209384019390910190600101610c3d565b50505050565b6000602080835265ffffffffffff60d01b845116818401528084015160806040850152610c9b60a0850182610b2e565b90506040850151601f198086840301606087015260018060a01b038083511684528483015160140b8585015260018060f81b036040840151166040850152606083015160c0606086015260c08501815180825260e08701915060e08160051b880101888401935060005b82811015610e135760df1989830301845284516fffffffffffffffffffffffffffffffff1981511683528a81015160a08c850152610d4660a0850182610b2e565b905087604083015151166040850152606082015184820360608601528051151582528c810151905060408d83015280516040830160005b6001811015610d9c57825115158252918f0191908f0190600101610d7d565b5050508c81015160806060840152610db760c0840182610b2e565b60408301518b166080850152606090920151838303603f190160a0850152919050610de28183610b7b565b92505050608082015191508381036080850152610dff8183610b2e565b968c0196958c019593505050600101610d05565b5060808701519850610e28608089018a610c39565b60608c01519850858b82030160808c0152610e43818a610b2e565b9c9b505050505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f20f09f9a806fc3a94d6f6f6f6f4d20c3a94dc3a96f6ff09f9a80f09f9a80f09f9a80206f4d4d4d20f09f9a80c3a94d206f204d4d6fc3a96f6f4df09f9a806fc3a96ff09f9a806f20c3a9c3a96f204d6f6f20c3a9f09f9a806fc3a96ff09f9a8020f09f9a806ff09f9a8020206f6f6f6f6f6f4d6ff09f9a806f4dc3a96f4d206ff09f9a80f09f9a8020206f6fc3a920c3a96f4d6f6f20c3a9f09f9a804dc3a96ff09f9a806ff09f9a806f4d6fc3a96f6ff09f9a80f09f9a806f20f09f9a806f4d6ff09f9a80f09f9a80f09f9a806ff09f9a804d20c3a96ff09f9a804df09f9a804df09f9a80c3a920c3a920c3a9204d4d204df09f9a804d6f6f20c3a9f09f9a80204df09f9a806f4df09f9a806f206f6f6f6f4d6ff09f9a80c3a94d206f6ff09f9a804d4dc3a94d6fc3a9c3a9204d4d6f6f20c3a9f09f9a806f6f206f6ff09f9a80f09f9a80f09f9a804d206fc3a94d4dc3a9206f4d6ff09f9a806f4d6f6f6f20c3a96f6f4dc3a94d6f6f20c3a9f09f9a804d6f204dc3a9206f6f204d6f4dc3a96f6f4d6fc3a94dc3a9f09f9a806fc3a9f09f9a806ff09f9a8020c3a96f4d206f6fc3a9f09f9a804d4d6f6f20c3a9f09f9a806ff09f9a804dc3a9c3a96f6f6f4dc3a96f6fc3a94d20c3a96ff09f9a80f09f9a806f6f4d4df09f9a806f20c3a96ff09f9a806fc3a9c3a920204d206ff09f9a804d6f20c3a9c3a920c3a9204d6f4d6f206f6f4d6f6f20c3a9f09f9a80c3a96f4d4df09f9a80c3a9c3a96f20c3a94df09f9a806ff09f9a806f6fc3a920f09f9a804d204d4d6f6f20c3a9f09f9a804d20f09f9a80c3a9f09f9a806f6ff09f9a804d6ff09f9a80c3a920f09f9a804d6f6f6f6f6f6f6fa26469706673582212206ed3998f843d46e368a45d41a0ec27933b86bd9ff15fa855da79435189ece52764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_c76a12d8 {\n string s_0;\n string[1] s_1;\n }\n\n struct S_5d0bf50e {\n S_c76a12d8 s_0;\n int128 s_1;\n address s_2;\n address s_3;\n }\n\n struct S_c7d1e161 {\n bool[1] s_0;\n string s_1;\n address s_2;\n S_5d0bf50e s_3;\n }\n\n struct S_c4d623b1 {\n bool s_0;\n S_c7d1e161 s_1;\n }\n\n struct S_7b97843e {\n bytes16 s_0;\n string s_1;\n S_421683f8 s_2;\n S_c4d623b1 s_3;\n string s_4;\n }\n\n struct S_ceac7f58 {\n address s_0;\n int168 s_1;\n uint248 s_2;\n S_7b97843e[] s_3;\n address[2] s_4;\n }\n\n struct S_cf485ded {\n bytes6 s_0;\n string s_1;\n S_ceac7f58 s_2;\n string s_3;\n }\n\n function test () public pure returns (S_cf485ded memory) {\n S_cf485ded memory r;\n {\n bytes6 r_0 = bytes6(0xd6a6d56e8dfe);\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀 ooMéMM \";\n r.s_1 = r_1;\n }\n {\n S_ceac7f58 memory r_2;\n {\n address r_2_0 = 0x5C7DFeDc0A31b52036D502B28E14530Ad4D01CD0;\n r_2.s_0 = r_2_0;\n }\n {\n int168 r_2_1 = 17601828751497087310125586715235872856368303052213;\n r_2.s_1 = r_2_1;\n }\n {\n uint248 r_2_2 = 217240073057417179001824132277089683280053034351984081946948220603723217330;\n r_2.s_2 = r_2_2;\n }\n {\n S_7b97843e[] memory r_2_3 = new S_7b97843e[](4);\n {\n S_7b97843e memory r_2_3_0;\n {\n bytes16 r_2_3_0_0 = bytes16(0x9833067bd8081d385379cd5c2d97e0ca);\n r_2_3_0.s_0 = r_2_3_0_0;\n }\n {\n string memory r_2_3_0_1 = unicode\"Moo é🚀o 🚀oéMooooM éMéoo🚀🚀🚀 oMMM 🚀éM o MMoéooM🚀oéo🚀o ééo \";\n r_2_3_0.s_1 = r_2_3_0_1;\n }\n {\n S_421683f8 memory r_2_3_0_2;\n {\n address r_2_3_0_2_0 = 0x9b22AA1B1d5343e4C05F005079303C9D54Bee3D0;\n r_2_3_0_2.s_0 = r_2_3_0_2_0;\n }\n r_2_3_0.s_2 = r_2_3_0_2;\n }\n {\n S_c4d623b1 memory r_2_3_0_3;\n {\n bool r_2_3_0_3_0 = false;\n r_2_3_0_3.s_0 = r_2_3_0_3_0;\n }\n {\n S_c7d1e161 memory r_2_3_0_3_1;\n {\n bool[1] memory r_2_3_0_3_1_0;\n {\n bool r_2_3_0_3_1_0_0 = false;\n r_2_3_0_3_1_0[0] = r_2_3_0_3_1_0_0;\n }\n r_2_3_0_3_1.s_0 = r_2_3_0_3_1_0;\n }\n {\n string memory r_2_3_0_3_1_1 = unicode\"Moo é🚀Méo🚀o🚀oMoéoo🚀🚀o 🚀oMo🚀🚀🚀o🚀M éo🚀M🚀M🚀é é é MM M🚀\";\n r_2_3_0_3_1.s_1 = r_2_3_0_3_1_1;\n }\n {\n address r_2_3_0_3_1_2 = 0x9805206D07D3367000aC154cF193B7b3a67Bd43d;\n r_2_3_0_3_1.s_2 = r_2_3_0_3_1_2;\n }\n {\n S_5d0bf50e memory r_2_3_0_3_1_3;\n {\n S_c76a12d8 memory r_2_3_0_3_1_3_0;\n {\n string memory r_2_3_0_3_1_3_0_0 = unicode\"Moo é🚀éoMM🚀ééo éM🚀o🚀ooé 🚀M M\";\n r_2_3_0_3_1_3_0.s_0 = r_2_3_0_3_1_3_0_0;\n }\n {\n string[1] memory r_2_3_0_3_1_3_0_1;\n {\n string memory r_2_3_0_3_1_3_0_1_0 = unicode\"Moo é🚀o🚀🚀\";\n r_2_3_0_3_1_3_0_1[0] = r_2_3_0_3_1_3_0_1_0;\n }\n r_2_3_0_3_1_3_0.s_1 = r_2_3_0_3_1_3_0_1;\n }\n r_2_3_0_3_1_3.s_0 = r_2_3_0_3_1_3_0;\n }\n {\n int128 r_2_3_0_3_1_3_1 = 49292834066700206678247183266662468294;\n r_2_3_0_3_1_3.s_1 = r_2_3_0_3_1_3_1;\n }\n {\n address r_2_3_0_3_1_3_2 = 0x70a0D3513e804574a0a20dfd63C58FEb415D49D4;\n r_2_3_0_3_1_3.s_2 = r_2_3_0_3_1_3_2;\n }\n {\n address r_2_3_0_3_1_3_3 = 0x3ea4f78F1401bE5bC2fbB80a28FFB2571988f928;\n r_2_3_0_3_1_3.s_3 = r_2_3_0_3_1_3_3;\n }\n r_2_3_0_3_1.s_3 = r_2_3_0_3_1_3;\n }\n r_2_3_0_3.s_1 = r_2_3_0_3_1;\n }\n r_2_3_0.s_3 = r_2_3_0_3;\n }\n {\n string memory r_2_3_0_4 = unicode\"Moo é🚀🚀 éo🚀 M oMoé\";\n r_2_3_0.s_4 = r_2_3_0_4;\n }\n r_2_3[0] = r_2_3_0;\n }\n {\n S_7b97843e memory r_2_3_1;\n {\n bytes16 r_2_3_1_0 = bytes16(0x63fd66a9338ff84774c8bb6bf7fb4534);\n r_2_3_1.s_0 = r_2_3_1_0;\n }\n {\n string memory r_2_3_1_1 = unicode\"Moo é🚀oo oo🚀🚀🚀M oéMMé oMo🚀oMooo éooMé\";\n r_2_3_1.s_1 = r_2_3_1_1;\n }\n {\n S_421683f8 memory r_2_3_1_2;\n {\n address r_2_3_1_2_0 = 0x36C65E7Db1C4d1DE8bdc75cFE15325142a00Bc89;\n r_2_3_1_2.s_0 = r_2_3_1_2_0;\n }\n r_2_3_1.s_2 = r_2_3_1_2;\n }\n {\n S_c4d623b1 memory r_2_3_1_3;\n {\n bool r_2_3_1_3_0 = false;\n r_2_3_1_3.s_0 = r_2_3_1_3_0;\n }\n {\n S_c7d1e161 memory r_2_3_1_3_1;\n {\n bool[1] memory r_2_3_1_3_1_0;\n {\n bool r_2_3_1_3_1_0_0 = true;\n r_2_3_1_3_1_0[0] = r_2_3_1_3_1_0_0;\n }\n r_2_3_1_3_1.s_0 = r_2_3_1_3_1_0;\n }\n {\n string memory r_2_3_1_3_1_1 = unicode\"Moo é🚀\";\n r_2_3_1_3_1.s_1 = r_2_3_1_3_1_1;\n }\n {\n address r_2_3_1_3_1_2 = 0xAD08Bd45C5cdde038892bA8e5B6d083628147B56;\n r_2_3_1_3_1.s_2 = r_2_3_1_3_1_2;\n }\n {\n S_5d0bf50e memory r_2_3_1_3_1_3;\n {\n S_c76a12d8 memory r_2_3_1_3_1_3_0;\n {\n string memory r_2_3_1_3_1_3_0_0 = unicode\"Moo é🚀oéo🚀 🚀o🚀 ooooooMo🚀oMéoM o🚀🚀 ooé éo\";\n r_2_3_1_3_1_3_0.s_0 = r_2_3_1_3_1_3_0_0;\n }\n {\n string[1] memory r_2_3_1_3_1_3_0_1;\n {\n string memory r_2_3_1_3_1_3_0_1_0 = unicode\"Moo é🚀 M oo\";\n r_2_3_1_3_1_3_0_1[0] = r_2_3_1_3_1_3_0_1_0;\n }\n r_2_3_1_3_1_3_0.s_1 = r_2_3_1_3_1_3_0_1;\n }\n r_2_3_1_3_1_3.s_0 = r_2_3_1_3_1_3_0;\n }\n {\n int128 r_2_3_1_3_1_3_1 = -70880202837806996608293628351541434668;\n r_2_3_1_3_1_3.s_1 = r_2_3_1_3_1_3_1;\n }\n {\n address r_2_3_1_3_1_3_2 = 0x4C16713382DA1F313255d33E7Ee6528c66AD582b;\n r_2_3_1_3_1_3.s_2 = r_2_3_1_3_1_3_2;\n }\n {\n address r_2_3_1_3_1_3_3 = 0xCfA3260F781dd6d0b758784fBdd38F1A407B1dB3;\n r_2_3_1_3_1_3.s_3 = r_2_3_1_3_1_3_3;\n }\n r_2_3_1_3_1.s_3 = r_2_3_1_3_1_3;\n }\n r_2_3_1_3.s_1 = r_2_3_1_3_1;\n }\n r_2_3_1.s_3 = r_2_3_1_3;\n }\n {\n string memory r_2_3_1_4 = unicode\"Moo é🚀éooM 🚀oMéMMo\";\n r_2_3_1.s_4 = r_2_3_1_4;\n }\n r_2_3[1] = r_2_3_1;\n }\n {\n S_7b97843e memory r_2_3_2;\n {\n bytes16 r_2_3_2_0 = bytes16(0xe9e7dffb334d12c091b995ac673b7a97);\n r_2_3_2.s_0 = r_2_3_2_0;\n }\n {\n string memory r_2_3_2_1 = unicode\"Moo é🚀Mo Mé oo MoMéooMoéMé🚀oé🚀o🚀 éoM ooé🚀M\";\n r_2_3_2.s_1 = r_2_3_2_1;\n }\n {\n S_421683f8 memory r_2_3_2_2;\n {\n address r_2_3_2_2_0 = 0x625cAFbB258a05240aD8F3A17e76e078b25EdE64;\n r_2_3_2_2.s_0 = r_2_3_2_2_0;\n }\n r_2_3_2.s_2 = r_2_3_2_2;\n }\n {\n S_c4d623b1 memory r_2_3_2_3;\n {\n bool r_2_3_2_3_0 = true;\n r_2_3_2_3.s_0 = r_2_3_2_3_0;\n }\n {\n S_c7d1e161 memory r_2_3_2_3_1;\n {\n bool[1] memory r_2_3_2_3_1_0;\n {\n bool r_2_3_2_3_1_0_0 = true;\n r_2_3_2_3_1_0[0] = r_2_3_2_3_1_0_0;\n }\n r_2_3_2_3_1.s_0 = r_2_3_2_3_1_0;\n }\n {\n string memory r_2_3_2_3_1_1 = unicode\"Moo é🚀ooM\";\n r_2_3_2_3_1.s_1 = r_2_3_2_3_1_1;\n }\n {\n address r_2_3_2_3_1_2 = 0xD9D2691334D3ED2C69DD219D75A8616e8c4C968f;\n r_2_3_2_3_1.s_2 = r_2_3_2_3_1_2;\n }\n {\n S_5d0bf50e memory r_2_3_2_3_1_3;\n {\n S_c76a12d8 memory r_2_3_2_3_1_3_0;\n {\n string memory r_2_3_2_3_1_3_0_0 = unicode\"Moo é🚀o🚀oM 🚀o MM🚀oo\";\n r_2_3_2_3_1_3_0.s_0 = r_2_3_2_3_1_3_0_0;\n }\n {\n string[1] memory r_2_3_2_3_1_3_0_1;\n {\n string memory r_2_3_2_3_1_3_0_1_0 = unicode\"Moo é🚀éo\";\n r_2_3_2_3_1_3_0_1[0] = r_2_3_2_3_1_3_0_1_0;\n }\n r_2_3_2_3_1_3_0.s_1 = r_2_3_2_3_1_3_0_1;\n }\n r_2_3_2_3_1_3.s_0 = r_2_3_2_3_1_3_0;\n }\n {\n int128 r_2_3_2_3_1_3_1 = -164302756442392904686524561251483093889;\n r_2_3_2_3_1_3.s_1 = r_2_3_2_3_1_3_1;\n }\n {\n address r_2_3_2_3_1_3_2 = 0x1CD86029dE60A2e7d2e103B0D4704CD53bB7E300;\n r_2_3_2_3_1_3.s_2 = r_2_3_2_3_1_3_2;\n }\n {\n address r_2_3_2_3_1_3_3 = 0x182755373337B44856Ec9464c22DF1c1DB5afE3F;\n r_2_3_2_3_1_3.s_3 = r_2_3_2_3_1_3_3;\n }\n r_2_3_2_3_1.s_3 = r_2_3_2_3_1_3;\n }\n r_2_3_2_3.s_1 = r_2_3_2_3_1;\n }\n r_2_3_2.s_3 = r_2_3_2_3;\n }\n {\n string memory r_2_3_2_4 = unicode\"Moo é🚀MéoMoéM o\";\n r_2_3_2.s_4 = r_2_3_2_4;\n }\n r_2_3[2] = r_2_3_2;\n }\n {\n S_7b97843e memory r_2_3_3;\n {\n bytes16 r_2_3_3_0 = bytes16(0xc947748795be8fb4f06d6f2dae7a871e);\n r_2_3_3.s_0 = r_2_3_3_0;\n }\n {\n string memory r_2_3_3_1 = unicode\"Moo é🚀o Moo🚀 oo \";\n r_2_3_3.s_1 = r_2_3_3_1;\n }\n {\n S_421683f8 memory r_2_3_3_2;\n {\n address r_2_3_3_2_0 = 0x5d06CF92198E46929EcB5Be1fde4b0CFDFd116Cb;\n r_2_3_3_2.s_0 = r_2_3_3_2_0;\n }\n r_2_3_3.s_2 = r_2_3_3_2;\n }\n {\n S_c4d623b1 memory r_2_3_3_3;\n {\n bool r_2_3_3_3_0 = false;\n r_2_3_3_3.s_0 = r_2_3_3_3_0;\n }\n {\n S_c7d1e161 memory r_2_3_3_3_1;\n {\n bool[1] memory r_2_3_3_3_1_0;\n {\n bool r_2_3_3_3_1_0_0 = true;\n r_2_3_3_3_1_0[0] = r_2_3_3_3_1_0_0;\n }\n r_2_3_3_3_1.s_0 = r_2_3_3_3_1_0;\n }\n {\n string memory r_2_3_3_3_1_1 = unicode\"Moo é🚀M 🚀é🚀oo🚀Mo🚀é 🚀Mooooooo\";\n r_2_3_3_3_1.s_1 = r_2_3_3_3_1_1;\n }\n {\n address r_2_3_3_3_1_2 = 0x3414f5756C5c91129E8D4450fDE1b6e509Bb048b;\n r_2_3_3_3_1.s_2 = r_2_3_3_3_1_2;\n }\n {\n S_5d0bf50e memory r_2_3_3_3_1_3;\n {\n S_c76a12d8 memory r_2_3_3_3_1_3_0;\n {\n string memory r_2_3_3_3_1_3_0_0 = unicode\"Moo é🚀 M🚀oM🚀o ooooMo🚀éM oo🚀MMéMoéé M\";\n r_2_3_3_3_1_3_0.s_0 = r_2_3_3_3_1_3_0_0;\n }\n {\n string[1] memory r_2_3_3_3_1_3_0_1;\n {\n string memory r_2_3_3_3_1_3_0_1_0 = unicode\"Moo é🚀o Moéo🚀ooo🚀ooM\";\n r_2_3_3_3_1_3_0_1[0] = r_2_3_3_3_1_3_0_1_0;\n }\n r_2_3_3_3_1_3_0.s_1 = r_2_3_3_3_1_3_0_1;\n }\n r_2_3_3_3_1_3.s_0 = r_2_3_3_3_1_3_0;\n }\n {\n int128 r_2_3_3_3_1_3_1 = -138793539658939051109607675178891855643;\n r_2_3_3_3_1_3.s_1 = r_2_3_3_3_1_3_1;\n }\n {\n address r_2_3_3_3_1_3_2 = 0xf89D7cd5057C890cf4668e2CE85048114597F733;\n r_2_3_3_3_1_3.s_2 = r_2_3_3_3_1_3_2;\n }\n {\n address r_2_3_3_3_1_3_3 = 0xC77Ec3d79296970F4Df2f8eC3D49955e11318982;\n r_2_3_3_3_1_3.s_3 = r_2_3_3_3_1_3_3;\n }\n r_2_3_3_3_1.s_3 = r_2_3_3_3_1_3;\n }\n r_2_3_3_3.s_1 = r_2_3_3_3_1;\n }\n r_2_3_3.s_3 = r_2_3_3_3;\n }\n {\n string memory r_2_3_3_4 = unicode\"Moo é🚀o🚀MééoooMéooéM éo🚀🚀ooMM🚀o éo🚀oéé M o🚀Mo éé é MoMo oo\";\n r_2_3_3.s_4 = r_2_3_3_4;\n }\n r_2_3[3] = r_2_3_3;\n }\n r_2.s_3 = r_2_3;\n }\n {\n address[2] memory r_2_4;\n {\n address r_2_4_0 = 0xdBBb61b1BcdFA8405CFC8F25c1CA0D55D44eFE68;\n r_2_4[0] = r_2_4_0;\n }\n {\n address r_2_4_1 = 0xeeE5b9b29b211Ec185f70486233Bea87Eb6B02f4;\n r_2_4[1] = r_2_4_1;\n }\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀\";\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020d6a6d56e8dfe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a80206f6f4dc3a94d4d20000000000000000000000000000000000000000000000000005c7dfedc0a31b52036d502b28e14530ad4d01cd000000000000000000000000c0b2d4c95d0bb71f3f0256634cb9b701cd05015b5007af41a26cf7dc4e0387e7d9d082d66e531cca374370318197dfd2cedc8f9b200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000dbbb61b1bcdfa8405cfc8f25c1ca0d55d44efe68000000000000000000000000eee5b9b29b211ec185f70486233bea87eb6b02f40000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000c609833067bd8081d385379cd5c2d97e0ca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000009b22aa1b1d5343e4c05f005079303c9d54bee3d00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a806f20f09f9a806fc3a94d6f6f6f6f4d20c3a94dc3a96f6ff09f9a80f09f9a80f09f9a80206f4d4d4d20f09f9a80c3a94d206f204d4d6fc3a96f6f4df09f9a806fc3a96ff09f9a806f20c3a9c3a96f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000009805206d07d3367000ac154cf193b7b3a67bd43d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a804dc3a96ff09f9a806ff09f9a806f4d6fc3a96f6ff09f9a80f09f9a806f20f09f9a806f4d6ff09f9a80f09f9a80f09f9a806ff09f9a804d20c3a96ff09f9a804df09f9a804df09f9a80c3a920c3a920c3a9204d4d204df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000002515745b3e87d3c2e109a8fa176e4ac600000000000000000000000070a0d3513e804574a0a20dfd63c58feb415d49d40000000000000000000000003ea4f78f1401be5bc2fbb80a28ffb2571988f928000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a80c3a96f4d4df09f9a80c3a9c3a96f20c3a94df09f9a806ff09f9a806f6fc3a920f09f9a804d204d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806ff09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a80f09f9a8020c3a96ff09f9a80204d20206f4d6fc3a90063fd66a9338ff84774c8bb6bf7fb45340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000036c65e7db1c4d1de8bdc75cfe15325142a00bc89000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a806f6f206f6ff09f9a80f09f9a80f09f9a804d206fc3a94d4dc3a9206f4d6ff09f9a806f4d6f6f6f20c3a96f6f4dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000ad08bd45c5cdde038892ba8e5b6d083628147b5600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffcaacf8306f13f541f82c2b2c4863a6d40000000000000000000000004c16713382da1f313255d33e7ee6528c66ad582b000000000000000000000000cfa3260f781dd6d0b758784fbdd38f1a407b1db3000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a806fc3a96ff09f9a8020f09f9a806ff09f9a8020206f6f6f6f6f6f4d6ff09f9a806f4dc3a96f4d206ff09f9a80f09f9a8020206f6fc3a920c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a8020204d206f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80c3a96f6f4d2020f09f9a806f4dc3a94d4d6f00000000e9e7dffb334d12c091b995ac673b7a970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000625cafbb258a05240ad8f3a17e76e078b25ede640000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a804d6f204dc3a9206f6f204d6f4dc3a96f6f4d6fc3a94dc3a9f09f9a806fc3a9f09f9a806ff09f9a8020c3a96f4d206f6fc3a9f09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000d9d2691334d3ed2c69dd219d75a8616e8c4c968f00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a806f6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffff846470ad292685e273e011556372747f0000000000000000000000001cd86029de60a2e7d2e103b0d4704cd53bb7e300000000000000000000000000182755373337b44856ec9464c22df1c1db5afe3f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a806ff09f9a806f4d20f09f9a806f204d4df09f9a806f6f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a80c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a804dc3a96f4d6fc3a94d206f0000000000000000000000c947748795be8fb4f06d6f2dae7a871e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000005d06cf92198e46929ecb5be1fde4b0cfdfd116cb00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806f204d6f6ff09f9a80206f6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000003414f5756c5c91129e8d4450fde1b6e509bb048b00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a804d20f09f9a80c3a9f09f9a806f6ff09f9a804d6ff09f9a80c3a920f09f9a804d6f6f6f6f6f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffff9795562aa733db1cc45abcc2bce038e5000000000000000000000000f89d7cd5057c890cf4668e2ce85048114597f733000000000000000000000000c77ec3d79296970f4df2f8ec3d49955e11318982000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a80204df09f9a806f4df09f9a806f206f6f6f6f4d6ff09f9a80c3a94d206f6ff09f9a804d4dc3a94d6fc3a9c3a9204d00000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a806f204d6fc3a96ff09f9a806f6f6ff09f9a806f6f4d00000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a806ff09f9a804dc3a9c3a96f6f6f4dc3a96f6fc3a94d20c3a96ff09f9a80f09f9a806f6f4d4df09f9a806f20c3a96ff09f9a806fc3a9c3a920204d206ff09f9a804d6f20c3a9c3a920c3a9204d6f4d6f206f6f00000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bytes11,(bytes13,bool[],(int160,(bytes1[3])[],(bool,bytes23,string,bytes19,((bytes30,uint256[4],bytes28),uint80,bool,bool,bool)[]),bytes16)),address)", + "type": "(string,bytes11,(bytes13,bool[],(int160,(bytes1[3])[],(bool,bytes23,string,bytes19,((bytes30,uint256[4],bytes28),uint80,bool,bool,bool)[]),bytes16)),address)", + "value": [ + "Moo é🚀MMéoé🚀o🚀ooéMM🚀oé🚀oo🚀M ", + "0xb91c7bab7641829b0ac3aa", + [ + "0x590bf20f8224d5c27a29ff809a", + [false, false, false], + [ + "-473272939497505773052553635129628765169324481648", + [ + [["0xaa", "0x88", "0x94"]], + [["0xfc", "0x2d", "0x4e"]], + [["0x62", "0x0a", "0xa5"]] + ], + [ + false, + "0x271bfebf5e437f035fc88ef5b982224a1b66d2cde7f95e", + "Moo é🚀oMoé🚀Mo éMMM🚀oMo éooo 🚀", + "0x1f6813ab0662ff7cb4520ca2950f8029218b6d", + [ + [ + [ + "0xed9b6eb9e844a51eff248fd6d80048fda4e51104bc69c764d82efd9fd96d", + [ + "91232287069125766962403628055276480532985712295479857849717236904243072374893", + "31586196773491879313390560002367796428382189204487648778148962130611508299424", + "7975672891649382190474193358168854816015626000363478494707627386405046386791", + "81216346222660663679465550773025558967985787844913737911522180624310247494888" + ], + "0xd2682352e70c03bef13a0d6ea73d0cab5e8d5618fea8852d4d30f5cd" + ], + "576221118342238746928401", + true, + true, + false + ], + [ + [ + "0x678100d27f5f648a0015a4bca645aa70daf1043134d82625a38a45788ef6", + [ + "51998462732394538304403344513253546291478649133114502576308966049135104434190", + "16984479167058614472269838380011682527168510507193688943127372136843921560650", + "35997648790175436358272025068629060331400405961799213518564051416125277781321", + "31661411309582738770517464133519180146066332099425006726180248023900864373001" + ], + "0xcc5e3c5f4692a7da61a5c72a05e7b8ec80acf8bb05e1185c505be71a" + ], + "845555270567686324975195", + false, + false, + true + ], + [ + [ + "0xbfb7c080da3c732c11785a7b0b88362a50e63ca8d12cbc7f5687b45f54a6", + [ + "22305154555307614318597100139266526622337782323492900702499983811063525729534", + "76999404135158926276606574026593640095454185007136464396507726872172159479706", + "41460873103258109719901063309440364457574410527743986372578642603301930656263", + "9004626772405518445999632174653359254439455245228748370916277165262484844631" + ], + "0x0ccadde4787b628cb64411707f8cbbcba981402ff923ad1a4e48c148" + ], + "929550569640633381715500", + true, + true, + true + ] + ] + ], + "0x05c24dedd3ecd1756dc26662f2e33aed" + ] + ], + "0x17857216aaf3E5A7aF879b4997F7d9A6dF608a0d" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMéoé🚀o🚀ooéMM🚀oé🚀oo🚀M " + }, + { + "type": "hexstring", + "value": "0xb91c7bab7641829b0ac3aa" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x590bf20f8224d5c27a29ff809a" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-473272939497505773052553635129628765169324481648" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xaa" + }, + { + "type": "hexstring", + "value": "0x88" + }, + { + "type": "hexstring", + "value": "0x94" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfc" + }, + { + "type": "hexstring", + "value": "0x2d" + }, + { + "type": "hexstring", + "value": "0x4e" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x62" + }, + { + "type": "hexstring", + "value": "0x0a" + }, + { + "type": "hexstring", + "value": "0xa5" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x271bfebf5e437f035fc88ef5b982224a1b66d2cde7f95e" + }, + { + "type": "string", + "value": "Moo é🚀oMoé🚀Mo éMMM🚀oMo éooo 🚀" + }, + { + "type": "hexstring", + "value": "0x1f6813ab0662ff7cb4520ca2950f8029218b6d" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xed9b6eb9e844a51eff248fd6d80048fda4e51104bc69c764d82efd9fd96d" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "91232287069125766962403628055276480532985712295479857849717236904243072374893" + }, + { + "type": "number", + "value": "31586196773491879313390560002367796428382189204487648778148962130611508299424" + }, + { + "type": "number", + "value": "7975672891649382190474193358168854816015626000363478494707627386405046386791" + }, + { + "type": "number", + "value": "81216346222660663679465550773025558967985787844913737911522180624310247494888" + } + ] + }, + { + "type": "hexstring", + "value": "0xd2682352e70c03bef13a0d6ea73d0cab5e8d5618fea8852d4d30f5cd" + } + ] + }, + { + "type": "number", + "value": "576221118342238746928401" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x678100d27f5f648a0015a4bca645aa70daf1043134d82625a38a45788ef6" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "51998462732394538304403344513253546291478649133114502576308966049135104434190" + }, + { + "type": "number", + "value": "16984479167058614472269838380011682527168510507193688943127372136843921560650" + }, + { + "type": "number", + "value": "35997648790175436358272025068629060331400405961799213518564051416125277781321" + }, + { + "type": "number", + "value": "31661411309582738770517464133519180146066332099425006726180248023900864373001" + } + ] + }, + { + "type": "hexstring", + "value": "0xcc5e3c5f4692a7da61a5c72a05e7b8ec80acf8bb05e1185c505be71a" + } + ] + }, + { + "type": "number", + "value": "845555270567686324975195" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xbfb7c080da3c732c11785a7b0b88362a50e63ca8d12cbc7f5687b45f54a6" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "22305154555307614318597100139266526622337782323492900702499983811063525729534" + }, + { + "type": "number", + "value": "76999404135158926276606574026593640095454185007136464396507726872172159479706" + }, + { + "type": "number", + "value": "41460873103258109719901063309440364457574410527743986372578642603301930656263" + }, + { + "type": "number", + "value": "9004626772405518445999632174653359254439455245228748370916277165262484844631" + } + ] + }, + { + "type": "hexstring", + "value": "0x0ccadde4787b628cb64411707f8cbbcba981402ff923ad1a4e48c148" + } + ] + }, + { + "type": "number", + "value": "929550569640633381715500" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x05c24dedd3ecd1756dc26662f2e33aed" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x17857216aaf3E5A7aF879b4997F7d9A6dF608a0d" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610c94806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610b09565b60405180910390f35b6100566107aa565b61005e6107aa565b6000604051806060016040528060338152602001610c2c603391398252506a5c8e3dd5bb20c14d8561d560a91b60208201526100986107d7565b6c2c85f907c1126ae13d14ffc04d60991b81526040805160038082526080820190925260009160208201606080368337019050509050600080826000815181106100e4576100e4610be8565b602002602001019015159081151581525050506000808260018151811061010d5761010d610be8565b602002602001019015159081151581525050506000808260028151811061013657610136610be8565b911515602092830291909101820152830191909152506101546107fb565b7352e64ae6f0e17e42f0eeec7a57c9973acdfd5c6f19815260408051600380825260808201909252600091816020015b61018c610843565b8152602001906001900390816101845790505090506101a9610843565b6101b1610852565b605560f91b8152601160fb1b6020820152602560fa1b604082015281528151819083906000906101e3576101e3610be8565b6020026020010181905250506101f7610843565b6101ff610852565b603f60fa1b8152602d60f81b6020820152602760f91b60408201528152815181908390600190811061023357610233610be8565b602002602001018190525050610247610843565b61024f610852565b603160f91b8152600560f91b602082015260a560f81b60408201528152815181908390600290811061028357610283610be8565b602002602001018190525050808260200181905250506102c96040805160a081018252600080825260208201819052606092820183905282820152608081019190915290565b60008082527f271bfebf5e437f035fc88ef5b982224a1b66d2cde7f95e0000000000000000006020808401919091526040805160608101909152602d8082529091610bff90830139604083810191909152721f6813ab0662ff7cb4520ca2950f8029218b6d60681b606084015280516003808252608082019092526000925090816020015b610356610870565b81526020019060019003908161034e579050509050610373610870565b61037b6108a5565b7fed9b6eb9e844a51eff248fd6d80048fda4e51104bc69c764d82efd9fd96d000081526103a66108bc565b7fc9b3a503617d4907088fd9e5b5511a937a4acfacc15e9a0285b7c6505ad0986d81527f45d527617d977a805e426b373fbd1f4345967e4415f9ea4c1920aa2ec68b46a06020808301919091527f11a2122574ad39911ce2e9dc801fbc3770315ea28395070c846b8d0af99f00676040808401919091527fb38ed2ad745b75ab7b0489dddd412c8aeccdf7d8749348fd9d4e8dbde06214e8606080850191909152848301939093527fd2682352e70c03bef13a0d6ea73d0cab5e8d5618fea8852d4d30f5cd0000000084820152928452697a05026925f007c365119084015260019183018290528201526000608082018190528251829184916104ab576104ab610be8565b6020026020010181905250506104bf610870565b6104c76108a5565b7f678100d27f5f648a0015a4bca645aa70daf1043134d82625a38a45788ef6000081526104f26108bc565b7f72f61641eed189f66c5498a814640112eed68c405bd63e99cfeefd727fc9200e81527f258cdfe1ed4043a3d8c20b32fd8709dd9827b646ca83da3afba98ce057c3944a6020808301919091527f4f95f27b072dda7851fff660f7c97621ce0a40f5d963d65871c5a05a17f8bd496040808401919091527f45ffb947b082242a3e74680e7fbcef3b6aea4d9f830c3dea6b923a4134e3e109606080850191909152848301939093527fcc5e3c5f4692a7da61a5c72a05e7b8ec80acf8bb05e1185c505be71a000000008482015292845269b30da49fed7c4b05765b90840152600091830182905282015260016080820181905282518291849181106105f9576105f9610be8565b60200260200101819052505061060d610870565b6106156108a5565b7fbfb7c080da3c732c11785a7b0b88362a50e63ca8d12cbc7f5687b45f54a6000081526106406108bc565b7f31504524af90f46bccb54dcfd613504362190acaa5addd3f523d4e5d8e38e4fe81527faa3c1e4a2c89ecefd3de0e5ce9f0a3096bc72341e8eb583fa98dacd5653aaf9a6020808301919091527f5baa05c74656723b0174a1775ce0edfb7f2a434770fb05c733f551150959e2076040808401919091527f13e8702a16a8b44cc9d22dbb29550cd8d3f1ded77372cbd664ad831b778cb057606080850191909152848301939093527f0ccadde4787b628cb64411707f8cbbcba981402ff923ad1a4e48c148000000008482015292845269c4d7098fe629d5d07e2c90840152600191830182905282018190526080820152815181908390600290811061074857610748610be8565b60209081029190910101525060808201526040808301919091526f05c24dedd3ecd1756dc26662f2e33aed60801b606080840191909152838201929092528301919091527317857216aaf3e5a7af879b4997f7d9a6df608a0d90820152919050565b6040805160808101825260608152600060208201529081016107ca6107d7565b8152600060209091015290565b60408051606080820183526000825260208201529081016107f66107fb565b905290565b6040805160808101825260008152606060208201529081016107ca6040805160a081018252600080825260208201819052606092820183905282820152608081019190915290565b60405180602001604052806107f65b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806108836108a5565b8152600060208201819052604082018190526060820181905260809091015290565b604080516060810190915260008152602081016107ca5b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b81811015610900576020818501810151868301820152016108e4565b81811115610912576000602083870101525b50601f01601f19169290920160200192915050565b600060a0825115158452602068ffffffffffffffffff19818501511681860152604080850151838288015261095e848801826108da565b6060878101516cffffffffffffffffffffffffff1916898201526080808901518a8403828c01528051808552908701945091929091600091870190825b81811015610a315786518051805161ffff191685528a8101518b8601875b60048110156109d65782518252918d0191908d01906001016109b9565b50505089015163ffffffff1916848c0152808a015169ffffffffffffffffffff1660c085015280890151151560e08501528681015115156101008501528501511515610120840152958801956101409092019160010161099b565b50909b9a5050505050505050505050565b600060808301825160130b845260208084015160808287015282815180855260a088019150838301945060009250825b81811015610abd5785515183855b6003811015610aa75782516001600160f81b03191682529187019190870190600101610a80565b5050509484019460609290920191600101610a72565b5050604086015193508681036040880152610ad88185610927565b93505050506060830151610b0160608601826fffffffffffffffffffffffffffffffff19169052565b509392505050565b600060208083528351608082850152610b2560a08501826108da565b90506affffffffffffffffffffff60a81b828601511660408501526040850151601f19858303016060860152606082016cffffffffffffffffffffffffff60981b8251168352838201516060858501528181518084526080860191508683019350600092505b80831015610bad57835115158252928601926001929092019190860190610b8b565b50604084015195508481036040860152610bc78187610a42565b955050505050506060840151610b0160808501826001600160a01b03169052565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d6fc3a9f09f9a804d6f20c3a94d4d4df09f9a806f4d6f20c3a96f6f6f20f09f9a804d6f6f20c3a9f09f9a804d4dc3a96fc3a9f09f9a806ff09f9a806f6fc3a94d4df09f9a806fc3a9f09f9a806f6ff09f9a804d20a264697066735822122070a6641eb259188986c56573b84bc7c0c9f2536ce46e5d3516a88ce0cae348b764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8eebce79 {\n bytes1[3] s_0;\n }\n\n struct S_861062ac {\n bytes30 s_0;\n uint256[4] s_1;\n bytes28 s_2;\n }\n\n struct S_60281cba {\n S_861062ac s_0;\n uint80 s_1;\n bool s_2;\n bool s_3;\n bool s_4;\n }\n\n struct S_25cfc49d {\n bool s_0;\n bytes23 s_1;\n string s_2;\n bytes19 s_3;\n S_60281cba[] s_4;\n }\n\n struct S_2aeabbaf {\n int160 s_0;\n S_8eebce79[] s_1;\n S_25cfc49d s_2;\n bytes16 s_3;\n }\n\n struct S_b80d4e3e {\n bytes13 s_0;\n bool[] s_1;\n S_2aeabbaf s_2;\n }\n\n struct S_31340d66 {\n string s_0;\n bytes11 s_1;\n S_b80d4e3e s_2;\n address s_3;\n }\n\n function test () public pure returns (S_31340d66 memory) {\n S_31340d66 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀MMéoé🚀o🚀ooéMM🚀oé🚀oo🚀M \";\n r.s_0 = r_0;\n }\n {\n bytes11 r_1 = bytes11(0xb91c7bab7641829b0ac3aa);\n r.s_1 = r_1;\n }\n {\n S_b80d4e3e memory r_2;\n {\n bytes13 r_2_0 = bytes13(0x590bf20f8224d5c27a29ff809a);\n r_2.s_0 = r_2_0;\n }\n {\n bool[] memory r_2_1 = new bool[](3);\n {\n bool r_2_1_0 = false;\n r_2_1[0] = r_2_1_0;\n }\n {\n bool r_2_1_1 = false;\n r_2_1[1] = r_2_1_1;\n }\n {\n bool r_2_1_2 = false;\n r_2_1[2] = r_2_1_2;\n }\n r_2.s_1 = r_2_1;\n }\n {\n S_2aeabbaf memory r_2_2;\n {\n int160 r_2_2_0 = -473272939497505773052553635129628765169324481648;\n r_2_2.s_0 = r_2_2_0;\n }\n {\n S_8eebce79[] memory r_2_2_1 = new S_8eebce79[](3);\n {\n S_8eebce79 memory r_2_2_1_0;\n {\n bytes1[3] memory r_2_2_1_0_0;\n {\n bytes1 r_2_2_1_0_0_0 = bytes1(0xaa);\n r_2_2_1_0_0[0] = r_2_2_1_0_0_0;\n }\n {\n bytes1 r_2_2_1_0_0_1 = bytes1(0x88);\n r_2_2_1_0_0[1] = r_2_2_1_0_0_1;\n }\n {\n bytes1 r_2_2_1_0_0_2 = bytes1(0x94);\n r_2_2_1_0_0[2] = r_2_2_1_0_0_2;\n }\n r_2_2_1_0.s_0 = r_2_2_1_0_0;\n }\n r_2_2_1[0] = r_2_2_1_0;\n }\n {\n S_8eebce79 memory r_2_2_1_1;\n {\n bytes1[3] memory r_2_2_1_1_0;\n {\n bytes1 r_2_2_1_1_0_0 = bytes1(0xfc);\n r_2_2_1_1_0[0] = r_2_2_1_1_0_0;\n }\n {\n bytes1 r_2_2_1_1_0_1 = bytes1(0x2d);\n r_2_2_1_1_0[1] = r_2_2_1_1_0_1;\n }\n {\n bytes1 r_2_2_1_1_0_2 = bytes1(0x4e);\n r_2_2_1_1_0[2] = r_2_2_1_1_0_2;\n }\n r_2_2_1_1.s_0 = r_2_2_1_1_0;\n }\n r_2_2_1[1] = r_2_2_1_1;\n }\n {\n S_8eebce79 memory r_2_2_1_2;\n {\n bytes1[3] memory r_2_2_1_2_0;\n {\n bytes1 r_2_2_1_2_0_0 = bytes1(0x62);\n r_2_2_1_2_0[0] = r_2_2_1_2_0_0;\n }\n {\n bytes1 r_2_2_1_2_0_1 = bytes1(0x0a);\n r_2_2_1_2_0[1] = r_2_2_1_2_0_1;\n }\n {\n bytes1 r_2_2_1_2_0_2 = bytes1(0xa5);\n r_2_2_1_2_0[2] = r_2_2_1_2_0_2;\n }\n r_2_2_1_2.s_0 = r_2_2_1_2_0;\n }\n r_2_2_1[2] = r_2_2_1_2;\n }\n r_2_2.s_1 = r_2_2_1;\n }\n {\n S_25cfc49d memory r_2_2_2;\n {\n bool r_2_2_2_0 = false;\n r_2_2_2.s_0 = r_2_2_2_0;\n }\n {\n bytes23 r_2_2_2_1 = bytes23(0x271bfebf5e437f035fc88ef5b982224a1b66d2cde7f95e);\n r_2_2_2.s_1 = r_2_2_2_1;\n }\n {\n string memory r_2_2_2_2 = unicode\"Moo é🚀oMoé🚀Mo éMMM🚀oMo éooo 🚀\";\n r_2_2_2.s_2 = r_2_2_2_2;\n }\n {\n bytes19 r_2_2_2_3 = bytes19(0x1f6813ab0662ff7cb4520ca2950f8029218b6d);\n r_2_2_2.s_3 = r_2_2_2_3;\n }\n {\n S_60281cba[] memory r_2_2_2_4 = new S_60281cba[](3);\n {\n S_60281cba memory r_2_2_2_4_0;\n {\n S_861062ac memory r_2_2_2_4_0_0;\n {\n bytes30 r_2_2_2_4_0_0_0 = bytes30(0xed9b6eb9e844a51eff248fd6d80048fda4e51104bc69c764d82efd9fd96d);\n r_2_2_2_4_0_0.s_0 = r_2_2_2_4_0_0_0;\n }\n {\n uint256[4] memory r_2_2_2_4_0_0_1;\n {\n uint256 r_2_2_2_4_0_0_1_0 = 91232287069125766962403628055276480532985712295479857849717236904243072374893;\n r_2_2_2_4_0_0_1[0] = r_2_2_2_4_0_0_1_0;\n }\n {\n uint256 r_2_2_2_4_0_0_1_1 = 31586196773491879313390560002367796428382189204487648778148962130611508299424;\n r_2_2_2_4_0_0_1[1] = r_2_2_2_4_0_0_1_1;\n }\n {\n uint256 r_2_2_2_4_0_0_1_2 = 7975672891649382190474193358168854816015626000363478494707627386405046386791;\n r_2_2_2_4_0_0_1[2] = r_2_2_2_4_0_0_1_2;\n }\n {\n uint256 r_2_2_2_4_0_0_1_3 = 81216346222660663679465550773025558967985787844913737911522180624310247494888;\n r_2_2_2_4_0_0_1[3] = r_2_2_2_4_0_0_1_3;\n }\n r_2_2_2_4_0_0.s_1 = r_2_2_2_4_0_0_1;\n }\n {\n bytes28 r_2_2_2_4_0_0_2 = bytes28(0xd2682352e70c03bef13a0d6ea73d0cab5e8d5618fea8852d4d30f5cd);\n r_2_2_2_4_0_0.s_2 = r_2_2_2_4_0_0_2;\n }\n r_2_2_2_4_0.s_0 = r_2_2_2_4_0_0;\n }\n {\n uint80 r_2_2_2_4_0_1 = 576221118342238746928401;\n r_2_2_2_4_0.s_1 = r_2_2_2_4_0_1;\n }\n {\n bool r_2_2_2_4_0_2 = true;\n r_2_2_2_4_0.s_2 = r_2_2_2_4_0_2;\n }\n {\n bool r_2_2_2_4_0_3 = true;\n r_2_2_2_4_0.s_3 = r_2_2_2_4_0_3;\n }\n {\n bool r_2_2_2_4_0_4 = false;\n r_2_2_2_4_0.s_4 = r_2_2_2_4_0_4;\n }\n r_2_2_2_4[0] = r_2_2_2_4_0;\n }\n {\n S_60281cba memory r_2_2_2_4_1;\n {\n S_861062ac memory r_2_2_2_4_1_0;\n {\n bytes30 r_2_2_2_4_1_0_0 = bytes30(0x678100d27f5f648a0015a4bca645aa70daf1043134d82625a38a45788ef6);\n r_2_2_2_4_1_0.s_0 = r_2_2_2_4_1_0_0;\n }\n {\n uint256[4] memory r_2_2_2_4_1_0_1;\n {\n uint256 r_2_2_2_4_1_0_1_0 = 51998462732394538304403344513253546291478649133114502576308966049135104434190;\n r_2_2_2_4_1_0_1[0] = r_2_2_2_4_1_0_1_0;\n }\n {\n uint256 r_2_2_2_4_1_0_1_1 = 16984479167058614472269838380011682527168510507193688943127372136843921560650;\n r_2_2_2_4_1_0_1[1] = r_2_2_2_4_1_0_1_1;\n }\n {\n uint256 r_2_2_2_4_1_0_1_2 = 35997648790175436358272025068629060331400405961799213518564051416125277781321;\n r_2_2_2_4_1_0_1[2] = r_2_2_2_4_1_0_1_2;\n }\n {\n uint256 r_2_2_2_4_1_0_1_3 = 31661411309582738770517464133519180146066332099425006726180248023900864373001;\n r_2_2_2_4_1_0_1[3] = r_2_2_2_4_1_0_1_3;\n }\n r_2_2_2_4_1_0.s_1 = r_2_2_2_4_1_0_1;\n }\n {\n bytes28 r_2_2_2_4_1_0_2 = bytes28(0xcc5e3c5f4692a7da61a5c72a05e7b8ec80acf8bb05e1185c505be71a);\n r_2_2_2_4_1_0.s_2 = r_2_2_2_4_1_0_2;\n }\n r_2_2_2_4_1.s_0 = r_2_2_2_4_1_0;\n }\n {\n uint80 r_2_2_2_4_1_1 = 845555270567686324975195;\n r_2_2_2_4_1.s_1 = r_2_2_2_4_1_1;\n }\n {\n bool r_2_2_2_4_1_2 = false;\n r_2_2_2_4_1.s_2 = r_2_2_2_4_1_2;\n }\n {\n bool r_2_2_2_4_1_3 = false;\n r_2_2_2_4_1.s_3 = r_2_2_2_4_1_3;\n }\n {\n bool r_2_2_2_4_1_4 = true;\n r_2_2_2_4_1.s_4 = r_2_2_2_4_1_4;\n }\n r_2_2_2_4[1] = r_2_2_2_4_1;\n }\n {\n S_60281cba memory r_2_2_2_4_2;\n {\n S_861062ac memory r_2_2_2_4_2_0;\n {\n bytes30 r_2_2_2_4_2_0_0 = bytes30(0xbfb7c080da3c732c11785a7b0b88362a50e63ca8d12cbc7f5687b45f54a6);\n r_2_2_2_4_2_0.s_0 = r_2_2_2_4_2_0_0;\n }\n {\n uint256[4] memory r_2_2_2_4_2_0_1;\n {\n uint256 r_2_2_2_4_2_0_1_0 = 22305154555307614318597100139266526622337782323492900702499983811063525729534;\n r_2_2_2_4_2_0_1[0] = r_2_2_2_4_2_0_1_0;\n }\n {\n uint256 r_2_2_2_4_2_0_1_1 = 76999404135158926276606574026593640095454185007136464396507726872172159479706;\n r_2_2_2_4_2_0_1[1] = r_2_2_2_4_2_0_1_1;\n }\n {\n uint256 r_2_2_2_4_2_0_1_2 = 41460873103258109719901063309440364457574410527743986372578642603301930656263;\n r_2_2_2_4_2_0_1[2] = r_2_2_2_4_2_0_1_2;\n }\n {\n uint256 r_2_2_2_4_2_0_1_3 = 9004626772405518445999632174653359254439455245228748370916277165262484844631;\n r_2_2_2_4_2_0_1[3] = r_2_2_2_4_2_0_1_3;\n }\n r_2_2_2_4_2_0.s_1 = r_2_2_2_4_2_0_1;\n }\n {\n bytes28 r_2_2_2_4_2_0_2 = bytes28(0x0ccadde4787b628cb64411707f8cbbcba981402ff923ad1a4e48c148);\n r_2_2_2_4_2_0.s_2 = r_2_2_2_4_2_0_2;\n }\n r_2_2_2_4_2.s_0 = r_2_2_2_4_2_0;\n }\n {\n uint80 r_2_2_2_4_2_1 = 929550569640633381715500;\n r_2_2_2_4_2.s_1 = r_2_2_2_4_2_1;\n }\n {\n bool r_2_2_2_4_2_2 = true;\n r_2_2_2_4_2.s_2 = r_2_2_2_4_2_2;\n }\n {\n bool r_2_2_2_4_2_3 = true;\n r_2_2_2_4_2.s_3 = r_2_2_2_4_2_3;\n }\n {\n bool r_2_2_2_4_2_4 = true;\n r_2_2_2_4_2.s_4 = r_2_2_2_4_2_4;\n }\n r_2_2_2_4[2] = r_2_2_2_4_2;\n }\n r_2_2_2.s_4 = r_2_2_2_4;\n }\n r_2_2.s_2 = r_2_2_2;\n }\n {\n bytes16 r_2_2_3 = bytes16(0x05c24dedd3ecd1756dc26662f2e33aed);\n r_2_2.s_3 = r_2_2_3;\n }\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x17857216aaf3E5A7aF879b4997F7d9A6dF608a0d;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080b91c7bab7641829b0ac3aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000017857216aaf3e5a7af879b4997f7d9a6df608a0d00000000000000000000000000000000000000000000000000000000000000334d6f6f20c3a9f09f9a804d4dc3a96fc3a9f09f9a806ff09f9a806f6fc3a94d4df09f9a806fc3a9f09f9a806f6ff09f9a804d2000000000000000000000000000590bf20f8224d5c27a29ff809a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffad19b5190f1e81bd0f111385a83668c53202a390000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c005c24dedd3ecd1756dc26662f2e33aed000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003aa0000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000271bfebf5e437f035fc88ef5b982224a1b66d2cde7f95e00000000000000000000000000000000000000000000000000000000000000000000000000000000a01f6813ab0662ff7cb4520ca2950f8029218b6d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806f4d6fc3a9f09f9a804d6f20c3a94d4d4df09f9a806f4d6f20c3a96f6f6f20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ed9b6eb9e844a51eff248fd6d80048fda4e51104bc69c764d82efd9fd96d0000c9b3a503617d4907088fd9e5b5511a937a4acfacc15e9a0285b7c6505ad0986d45d527617d977a805e426b373fbd1f4345967e4415f9ea4c1920aa2ec68b46a011a2122574ad39911ce2e9dc801fbc3770315ea28395070c846b8d0af99f0067b38ed2ad745b75ab7b0489dddd412c8aeccdf7d8749348fd9d4e8dbde06214e8d2682352e70c03bef13a0d6ea73d0cab5e8d5618fea8852d4d30f5cd00000000000000000000000000000000000000000000000000007a05026925f007c36511000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000678100d27f5f648a0015a4bca645aa70daf1043134d82625a38a45788ef6000072f61641eed189f66c5498a814640112eed68c405bd63e99cfeefd727fc9200e258cdfe1ed4043a3d8c20b32fd8709dd9827b646ca83da3afba98ce057c3944a4f95f27b072dda7851fff660f7c97621ce0a40f5d963d65871c5a05a17f8bd4945ffb947b082242a3e74680e7fbcef3b6aea4d9f830c3dea6b923a4134e3e109cc5e3c5f4692a7da61a5c72a05e7b8ec80acf8bb05e1185c505be71a0000000000000000000000000000000000000000000000000000b30da49fed7c4b05765b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bfb7c080da3c732c11785a7b0b88362a50e63ca8d12cbc7f5687b45f54a6000031504524af90f46bccb54dcfd613504362190acaa5addd3f523d4e5d8e38e4feaa3c1e4a2c89ecefd3de0e5ce9f0a3096bc72341e8eb583fa98dacd5653aaf9a5baa05c74656723b0174a1775ce0edfb7f2a434770fb05c733f551150959e20713e8702a16a8b44cc9d22dbb29550cd8d3f1ded77372cbd664ad831b778cb0570ccadde4787b628cb64411707f8cbbcba981402ff923ad1a4e48c1480000000000000000000000000000000000000000000000000000c4d7098fe629d5d07e2c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001" + }, + { + "name": "random-(address,((address,string),(address,string,bytes1,bool,bytes17),(uint,(address[2],(string,string,bytes18)[2])),address,(bool,((string,bytes6),bool))),uint72,address,bytes30[2][4])", + "type": "(address,((address,string),(address,string,bytes1,bool,bytes17),(uint,(address[2],(string,string,bytes18)[2])),address,(bool,((string,bytes6),bool))),uint72,address,bytes30[2][4])", + "value": [ + "0x1402C626ddF0ee9bF5Cb592Baae2f0049452b551", + [ + [ + "0xAF8227385f58C016164fcA61eF525Ed829711562", + "Moo é🚀M MM🚀🚀oMéoooo🚀M🚀🚀M 🚀oM🚀MoMMMo🚀oooo🚀M🚀MooéoMoo M🚀 🚀é" + ], + [ + "0x760651275c907bcFe3fC1821593209d066199BeE", + "Moo é🚀o o éMéooM o🚀oo 🚀 éoééM🚀ééMo", + "0x83", + true, + "0x8c0dee3098386c2a12eac0998fe3c821ab" + ], + [ + "51218234366483015623190454520378042501219207103170342528510830228156385319185", + [ + [ + "0x219a9256702CFFde8a7167C375CAe87693f8F1bc", + "0x10ccB1B04C29798637DC44ba715250bE76992D55" + ], + [ + [ + "Moo é🚀🚀MéM🚀", + "Moo é🚀🚀Mo 🚀o", + "0x09e53c8873a43144f2084ab81653020519c4" + ], + [ + "Moo é🚀éMMM🚀ooMééé🚀oM Mé🚀M éo M🚀o ooo ooé éooooo🚀o ", + "Moo é🚀o 🚀ooé🚀oéooéo Moé oéoéoé🚀🚀 🚀🚀o🚀Moé ", + "0x53a8447f1b4d27d5443787ae4c4eb6a86729" + ] + ] + ] + ], + "0x93e8cc862C19d690CC4dc8e6B34b0eE9081FB8D8", + [true, [["Moo é🚀éooMoéM é 🚀", "0x81ccb8afe039"], false]] + ], + "3385819309048819068409", + "0xcBE700564f9485a4bFcd5Bc58338E75f20ec7D4c", + [ + [ + "0xbda5b11758c9356bf06d7ca48753a9c2bc52ce35c2175232ac6d771f0810", + "0xe24027977601c58970cfe867e546044e4ebe3dcf19ea72b5dbb464b75232" + ], + [ + "0xdbaf7267e852fb3c5e71c45e50735bf64f8290cf9dd99d6d1f1a23549c5f", + "0x2d9e63a2267b8f515d59fe8d63a3667fde49790dd9b242489891fa2107cd" + ], + [ + "0x9873d10c65d1e014ff4e05366a974196bdbd1e0229c10b615088f1d81e9f", + "0xccea08fa4183164b906fc3f7b0f08e66b34bd7a258056e1e5ad4afb14d6f" + ], + [ + "0x5db64d42155734f3f506079283ae7109dc6f2b11489065854cfc4becffbf", + "0xb5d8fe2f434b275fa14d9c0e7401f903f566c129849a5f5bb66677a6ebc5" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1402C626ddF0ee9bF5Cb592Baae2f0049452b551" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xAF8227385f58C016164fcA61eF525Ed829711562" + }, + { + "type": "string", + "value": "Moo é🚀M MM🚀🚀oMéoooo🚀M🚀🚀M 🚀oM🚀MoMMMo🚀oooo🚀M🚀MooéoMoo M🚀 🚀é" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x760651275c907bcFe3fC1821593209d066199BeE" + }, + { + "type": "string", + "value": "Moo é🚀o o éMéooM o🚀oo 🚀 éoééM🚀ééMo" + }, + { + "type": "hexstring", + "value": "0x83" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x8c0dee3098386c2a12eac0998fe3c821ab" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "51218234366483015623190454520378042501219207103170342528510830228156385319185" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x219a9256702CFFde8a7167C375CAe87693f8F1bc" + }, + { + "type": "address", + "value": "0x10ccB1B04C29798637DC44ba715250bE76992D55" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀MéM🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀Mo 🚀o" + }, + { + "type": "hexstring", + "value": "0x09e53c8873a43144f2084ab81653020519c4" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMMM🚀ooMééé🚀oM Mé🚀M éo M🚀o ooo ooé éooooo🚀o " + }, + { + "type": "string", + "value": "Moo é🚀o 🚀ooé🚀oéooéo Moé oéoéoé🚀🚀 🚀🚀o🚀Moé " + }, + { + "type": "hexstring", + "value": "0x53a8447f1b4d27d5443787ae4c4eb6a86729" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "address", + "value": "0x93e8cc862C19d690CC4dc8e6B34b0eE9081FB8D8" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooMoéM é 🚀" + }, + { + "type": "hexstring", + "value": "0x81ccb8afe039" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "3385819309048819068409" + }, + { + "type": "address", + "value": "0xcBE700564f9485a4bFcd5Bc58338E75f20ec7D4c" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xbda5b11758c9356bf06d7ca48753a9c2bc52ce35c2175232ac6d771f0810" + }, + { + "type": "hexstring", + "value": "0xe24027977601c58970cfe867e546044e4ebe3dcf19ea72b5dbb464b75232" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xdbaf7267e852fb3c5e71c45e50735bf64f8290cf9dd99d6d1f1a23549c5f" + }, + { + "type": "hexstring", + "value": "0x2d9e63a2267b8f515d59fe8d63a3667fde49790dd9b242489891fa2107cd" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9873d10c65d1e014ff4e05366a974196bdbd1e0229c10b615088f1d81e9f" + }, + { + "type": "hexstring", + "value": "0xccea08fa4183164b906fc3f7b0f08e66b34bd7a258056e1e5ad4afb14d6f" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5db64d42155734f3f506079283ae7109dc6f2b11489065854cfc4becffbf" + }, + { + "type": "hexstring", + "value": "0xb5d8fe2f434b275fa14d9c0e7401f903f566c129849a5f5bb66677a6ebc5" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610c0a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610980565b60405180910390f35b610056610585565b61005e610585565b731402c626ddf0ee9bf5cb592baae2f0049452b551815261007d6105c8565b60408051808201909152600081526060602082015273af8227385f58c016164fca61ef525ed82971156281526040805160a08101909152606780825260009190610ad7602083013960208301525081526100ff6040805160a0810182526000808252606060208301819052928201819052918101829052608081019190915290565b73760651275c907bcfe3fc1821593209d066199bee81526040805160608101909152603780825260009190610aa06020830139602080840191909152608360f81b604084015260016060840152708c0dee3098386c2a12eac0998fe3c821ab60781b60808401528301919091525061017561066d565b7f713c7e4b652466138b07bc89332586c6f4aaf36cacb52b25f222398b9117d91181526101a0610683565b6101a86106a3565b73219a9256702cffde8a7167c375cae87693f8f1bc81527310ccb1b04c29798637dc44ba715250be76992d55602082015281526101e36106c1565b604080516060808201835280825260208083018281526000848601818152865180880188526016808252749adede418753e13f3501e13f35009b87529be13f3560571b8287015290875287518089018952908152754d6f6f20c3a9f09f9a80f09f9a804d6f20f09f9a806f60501b818601529092527102794f221ce90c513c8212ae0594c081467160721b90915292855283518083018552828152908101919091529182015260006040518060800160405280604d8152602001610b3e604d91398252506040805160808101909152604a80825260009190610b8b60208301396020830152507153a8447f1b4d27d5443787ae4c4eb6a8672960701b60408201528082600160209081029190910191909152838101929092525082015260408201527393e8cc862c19d690cc4dc8e6b34b0ee9081fb8d8606082015261036060405180604001604052806000151581526020016105c360408051608081018252606091810182815260009282018390528152602081019190915290565b600181526040805160808082018352606082840181815260008285018190529084526020808501828152865180880188528481528083018481528851808a018a52601c81527f4d6f6f20c3a9f09f9a80c3a96f6f4d6fc3a94d20c3a92020f09f9a80000000008186015282526581ccb8afe03960d01b9052865291909152808601939093529085019390935284019290925268b78bae92bd8963adf99183019190915273cbe700564f9485a4bfcd5bc58338e75f20ec7d4c90820152610424610702565b61042c6106a3565b7fbda5b11758c9356bf06d7ca48753a9c2bc52ce35c2175232ac6d771f0810000081527fe24027977601c58970cfe867e546044e4ebe3dcf19ea72b5dbb464b7523200006020820152815261047f6106a3565b7fdbaf7267e852fb3c5e71c45e50735bf64f8290cf9dd99d6d1f1a23549c5f000081527f2d9e63a2267b8f515d59fe8d63a3667fde49790dd9b242489891fa2107cd00006020808301919091528201526104d76106a3565b7f9873d10c65d1e014ff4e05366a974196bdbd1e0229c10b615088f1d81e9f000081527fccea08fa4183164b906fc3f7b0f08e66b34bd7a258056e1e5ad4afb14d6f00006020820152604082015261052d6106a3565b7f5db64d42155734f3f506079283ae7109dc6f2b11489065854cfc4becffbf000081527fb5d8fe2f434b275fa14d9c0e7401f903f566c129849a5f5bb66677a6ebc50000602082015260608201526080820152919050565b6040518060a0016040528060006001600160a01b031681526020016105a86105c8565b815260006020820181905260408201526060016105c3610702565b905290565b6040805160e08101909152600060a08201908152606060c0830152819081526040805160a08101825260008082526060602083810182905293830182905282018190526080820152910190815260200161062061066d565b8152600060208201526040016105c360405180604001604052806000151581526020016105c360408051608081018252606091810182815260009282018390528152602081019190915290565b6040518060400160405280600081526020016105c35b60405180604001604052806106966106a3565b81526020016105c36106c1565b60405180604001604052806002906020820280368337509192915050565b60405180604001604052806002905b604080516060808201835280825260208201526000918101919091528152602001906001900390816106d05790505090565b60405180608001604052806004905b6107196106a3565b8152602001906001900390816107115790505090565b6000815180845260005b8181101561075557602081850181015186830182015201610739565b81811115610767576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b0381511682526000602082015160a060208501526107a360a085018261072f565b6040848101516001600160f81b031916908601526060808501511515908601526080938401516effffffffffffffffffffffffffffff191693909401929092525090919050565b8051825260208082015160408285018190528151600093919290919060a08701858886015b60028210156108375785516001600160a01b031681529484019460019190910190840161080f565b5050908201516060608089018190529093509060e088019060005b60028110156108bd57898303609f19018252855180518585526108778686018261072f565b9050868201518582038887015261088e828261072f565b928a01516dffffffffffffffffffffffffffff1916958a01959095525095850195925090840190600101610852565b509098975050505050505050565b805115158252600060208201516040602085015280516040808601528051604060808701526108fd60c087018261072f565b6020928301516001600160d01b03191660a0880152929091015115156060909501949094529392505050565b806000805b600481101561097957825185835b600281101561096057825161ffff191682526020928301929091019060010161093c565b505050604094909401936020929092019160010161092e565b5050505050565b60208152600060018060a01b0380845116602084015260208401516101806040850152805160a06101a086015282815116610240860152602081015192505060406102608501526109d561028085018361072f565b9150602081015161019f1980868503016101c08701526109f5848361077c565b93506040830151915080868503016101e0870152610a1384836107ea565b935060608301519150610a326102008701836001600160a01b03169052565b6080830151925080868503016102208701525050610a5082826108cb565b9150506040840151610a6f606085018268ffffffffffffffffff169052565b5060608401516001600160a01b0381166080850152506080840151610a9760a0850182610929565b50939250505056fe4d6f6f20c3a9f09f9a806f206f20c3a94dc3a96f6f4d20206ff09f9a806f6f20f09f9a8020c3a96fc3a9c3a94df09f9a80c3a9c3a94d6f4d6f6f20c3a9f09f9a804d204d4df09f9a80f09f9a806f4dc3a96f6f6f6ff09f9a804df09f9a80f09f9a804d20f09f9a806f4df09f9a804d6f4d4d4d6ff09f9a806f6f6f6ff09f9a804df09f9a804d6f6fc3a96f4d6f6f20204df09f9a80202020f09f9a80c3a94d6f6f20c3a9f09f9a80c3a94d4d4df09f9a806f6f4dc3a9c3a9c3a9f09f9a806f4d204dc3a9f09f9a804d20c3a96f204df09f9a806f206f6f6f206f6fc3a920c3a96f6f6f6f6ff09f9a806f204d6f6f20c3a9f09f9a806f20f09f9a806f6fc3a9f09f9a806fc3a96f6fc3a96f204d6fc3a9206fc3a96fc3a96fc3a9f09f9a80f09f9a8020f09f9a80f09f9a806ff09f9a804d6fc3a920a26469706673582212206c3ab3e240569357d939b01bdc14531bbc1df63fb90abe98ac96d394316485f064736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_8090aaf4 {\n address s_0;\n string s_1;\n }\n\n struct S_cf82b2b3 {\n address s_0;\n string s_1;\n bytes1 s_2;\n bool s_3;\n bytes17 s_4;\n }\n\n struct S_2324a664 {\n string s_0;\n string s_1;\n bytes18 s_2;\n }\n\n struct S_6af640d4 {\n address[2] s_0;\n S_2324a664[2] s_1;\n }\n\n struct S_46ffbd1d {\n uint256 s_0;\n S_6af640d4 s_1;\n }\n\n struct S_55549d31 {\n string s_0;\n bytes6 s_1;\n }\n\n struct S_10fc8101 {\n S_55549d31 s_0;\n bool s_1;\n }\n\n struct S_d8d727d8 {\n bool s_0;\n S_10fc8101 s_1;\n }\n\n struct S_56a0350c {\n S_8090aaf4 s_0;\n S_cf82b2b3 s_1;\n S_46ffbd1d s_2;\n address s_3;\n S_d8d727d8 s_4;\n }\n\n struct S_c58b7dc9 {\n address s_0;\n S_56a0350c s_1;\n uint72 s_2;\n address s_3;\n bytes30[2][4] s_4;\n }\n\n function test () public pure returns (S_c58b7dc9 memory) {\n S_c58b7dc9 memory r;\n {\n address r_0 = 0x1402C626ddF0ee9bF5Cb592Baae2f0049452b551;\n r.s_0 = r_0;\n }\n {\n S_56a0350c memory r_1;\n {\n S_8090aaf4 memory r_1_0;\n {\n address r_1_0_0 = 0xAF8227385f58C016164fcA61eF525Ed829711562;\n r_1_0.s_0 = r_1_0_0;\n }\n {\n string memory r_1_0_1 = unicode\"Moo é🚀M MM🚀🚀oMéoooo🚀M🚀🚀M 🚀oM🚀MoMMMo🚀oooo🚀M🚀MooéoMoo M🚀 🚀é\";\n r_1_0.s_1 = r_1_0_1;\n }\n r_1.s_0 = r_1_0;\n }\n {\n S_cf82b2b3 memory r_1_1;\n {\n address r_1_1_0 = 0x760651275c907bcFe3fC1821593209d066199BeE;\n r_1_1.s_0 = r_1_1_0;\n }\n {\n string memory r_1_1_1 = unicode\"Moo é🚀o o éMéooM o🚀oo 🚀 éoééM🚀ééMo\";\n r_1_1.s_1 = r_1_1_1;\n }\n {\n bytes1 r_1_1_2 = bytes1(0x83);\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bool r_1_1_3 = true;\n r_1_1.s_3 = r_1_1_3;\n }\n {\n bytes17 r_1_1_4 = bytes17(0x8c0dee3098386c2a12eac0998fe3c821ab);\n r_1_1.s_4 = r_1_1_4;\n }\n r_1.s_1 = r_1_1;\n }\n {\n S_46ffbd1d memory r_1_2;\n {\n uint r_1_2_0 = 51218234366483015623190454520378042501219207103170342528510830228156385319185;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n S_6af640d4 memory r_1_2_1;\n {\n address[2] memory r_1_2_1_0;\n {\n address r_1_2_1_0_0 = 0x219a9256702CFFde8a7167C375CAe87693f8F1bc;\n r_1_2_1_0[0] = r_1_2_1_0_0;\n }\n {\n address r_1_2_1_0_1 = 0x10ccB1B04C29798637DC44ba715250bE76992D55;\n r_1_2_1_0[1] = r_1_2_1_0_1;\n }\n r_1_2_1.s_0 = r_1_2_1_0;\n }\n {\n S_2324a664[2] memory r_1_2_1_1;\n {\n S_2324a664 memory r_1_2_1_1_0;\n {\n string memory r_1_2_1_1_0_0 = unicode\"Moo é🚀🚀MéM🚀\";\n r_1_2_1_1_0.s_0 = r_1_2_1_1_0_0;\n }\n {\n string memory r_1_2_1_1_0_1 = unicode\"Moo é🚀🚀Mo 🚀o\";\n r_1_2_1_1_0.s_1 = r_1_2_1_1_0_1;\n }\n {\n bytes18 r_1_2_1_1_0_2 = bytes18(0x09e53c8873a43144f2084ab81653020519c4);\n r_1_2_1_1_0.s_2 = r_1_2_1_1_0_2;\n }\n r_1_2_1_1[0] = r_1_2_1_1_0;\n }\n {\n S_2324a664 memory r_1_2_1_1_1;\n {\n string memory r_1_2_1_1_1_0 = unicode\"Moo é🚀éMMM🚀ooMééé🚀oM Mé🚀M éo M🚀o ooo ooé éooooo🚀o \";\n r_1_2_1_1_1.s_0 = r_1_2_1_1_1_0;\n }\n {\n string memory r_1_2_1_1_1_1 = unicode\"Moo é🚀o 🚀ooé🚀oéooéo Moé oéoéoé🚀🚀 🚀🚀o🚀Moé \";\n r_1_2_1_1_1.s_1 = r_1_2_1_1_1_1;\n }\n {\n bytes18 r_1_2_1_1_1_2 = bytes18(0x53a8447f1b4d27d5443787ae4c4eb6a86729);\n r_1_2_1_1_1.s_2 = r_1_2_1_1_1_2;\n }\n r_1_2_1_1[1] = r_1_2_1_1_1;\n }\n r_1_2_1.s_1 = r_1_2_1_1;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n r_1.s_2 = r_1_2;\n }\n {\n address r_1_3 = 0x93e8cc862C19d690CC4dc8e6B34b0eE9081FB8D8;\n r_1.s_3 = r_1_3;\n }\n {\n S_d8d727d8 memory r_1_4;\n {\n bool r_1_4_0 = true;\n r_1_4.s_0 = r_1_4_0;\n }\n {\n S_10fc8101 memory r_1_4_1;\n {\n S_55549d31 memory r_1_4_1_0;\n {\n string memory r_1_4_1_0_0 = unicode\"Moo é🚀éooMoéM é 🚀\";\n r_1_4_1_0.s_0 = r_1_4_1_0_0;\n }\n {\n bytes6 r_1_4_1_0_1 = bytes6(0x81ccb8afe039);\n r_1_4_1_0.s_1 = r_1_4_1_0_1;\n }\n r_1_4_1.s_0 = r_1_4_1_0;\n }\n {\n bool r_1_4_1_1 = false;\n r_1_4_1.s_1 = r_1_4_1_1;\n }\n r_1_4.s_1 = r_1_4_1;\n }\n r_1.s_4 = r_1_4;\n }\n r.s_1 = r_1;\n }\n {\n uint72 r_2 = 3385819309048819068409;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0xcBE700564f9485a4bFcd5Bc58338E75f20ec7D4c;\n r.s_3 = r_3;\n }\n {\n bytes30[2][4] memory r_4;\n {\n bytes30[2] memory r_4_0;\n {\n bytes30 r_4_0_0 = bytes30(0xbda5b11758c9356bf06d7ca48753a9c2bc52ce35c2175232ac6d771f0810);\n r_4_0[0] = r_4_0_0;\n }\n {\n bytes30 r_4_0_1 = bytes30(0xe24027977601c58970cfe867e546044e4ebe3dcf19ea72b5dbb464b75232);\n r_4_0[1] = r_4_0_1;\n }\n r_4[0] = r_4_0;\n }\n {\n bytes30[2] memory r_4_1;\n {\n bytes30 r_4_1_0 = bytes30(0xdbaf7267e852fb3c5e71c45e50735bf64f8290cf9dd99d6d1f1a23549c5f);\n r_4_1[0] = r_4_1_0;\n }\n {\n bytes30 r_4_1_1 = bytes30(0x2d9e63a2267b8f515d59fe8d63a3667fde49790dd9b242489891fa2107cd);\n r_4_1[1] = r_4_1_1;\n }\n r_4[1] = r_4_1;\n }\n {\n bytes30[2] memory r_4_2;\n {\n bytes30 r_4_2_0 = bytes30(0x9873d10c65d1e014ff4e05366a974196bdbd1e0229c10b615088f1d81e9f);\n r_4_2[0] = r_4_2_0;\n }\n {\n bytes30 r_4_2_1 = bytes30(0xccea08fa4183164b906fc3f7b0f08e66b34bd7a258056e1e5ad4afb14d6f);\n r_4_2[1] = r_4_2_1;\n }\n r_4[2] = r_4_2;\n }\n {\n bytes30[2] memory r_4_3;\n {\n bytes30 r_4_3_0 = bytes30(0x5db64d42155734f3f506079283ae7109dc6f2b11489065854cfc4becffbf);\n r_4_3[0] = r_4_3_0;\n }\n {\n bytes30 r_4_3_1 = bytes30(0xb5d8fe2f434b275fa14d9c0e7401f903f566c129849a5f5bb66677a6ebc5);\n r_4_3[1] = r_4_3_1;\n }\n r_4[3] = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000001402c626ddf0ee9bf5cb592baae2f0049452b55100000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000b78bae92bd8963adf9000000000000000000000000cbe700564f9485a4bfcd5bc58338e75f20ec7d4cbda5b11758c9356bf06d7ca48753a9c2bc52ce35c2175232ac6d771f08100000e24027977601c58970cfe867e546044e4ebe3dcf19ea72b5dbb464b752320000dbaf7267e852fb3c5e71c45e50735bf64f8290cf9dd99d6d1f1a23549c5f00002d9e63a2267b8f515d59fe8d63a3667fde49790dd9b242489891fa2107cd00009873d10c65d1e014ff4e05366a974196bdbd1e0229c10b615088f1d81e9f0000ccea08fa4183164b906fc3f7b0f08e66b34bd7a258056e1e5ad4afb14d6f00005db64d42155734f3f506079283ae7109dc6f2b11489065854cfc4becffbf0000b5d8fe2f434b275fa14d9c0e7401f903f566c129849a5f5bb66677a6ebc5000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000028000000000000000000000000093e8cc862c19d690cc4dc8e6b34b0ee9081fb8d800000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000af8227385f58c016164fca61ef525ed829711562000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a804d204d4df09f9a80f09f9a806f4dc3a96f6f6f6ff09f9a804df09f9a80f09f9a804d20f09f9a806f4df09f9a804d6f4d4d4d6ff09f9a806f6f6f6ff09f9a804df09f9a804d6f6fc3a96f4d6f6f20204df09f9a80202020f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000760651275c907bcfe3fc1821593209d066199bee00000000000000000000000000000000000000000000000000000000000000a0830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018c0dee3098386c2a12eac0998fe3c821ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374d6f6f20c3a9f09f9a806f206f20c3a94dc3a96f6f4d20206ff09f9a806f6f20f09f9a8020c3a96fc3a9c3a94df09f9a80c3a9c3a94d6f000000000000000000713c7e4b652466138b07bc89332586c6f4aaf36cacb52b25f222398b9117d9110000000000000000000000000000000000000000000000000000000000000040000000000000000000000000219a9256702cffde8a7167c375cae87693f8f1bc00000000000000000000000010ccb1b04c29798637dc44ba715250be76992d55000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a009e53c8873a43144f2084ab81653020519c4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a804dc3a94df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a804d6f20f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e053a8447f1b4d27d5443787ae4c4eb6a867290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80c3a94d4d4df09f9a806f6f4dc3a9c3a9c3a9f09f9a806f4d204dc3a9f09f9a804d20c3a96f204df09f9a806f206f6f6f206f6fc3a920c3a96f6f6f6f6ff09f9a806f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f20f09f9a806f6fc3a9f09f9a806fc3a96f6fc3a96f204d6fc3a9206fc3a96fc3a96fc3a9f09f9a80f09f9a8020f09f9a80f09f9a806ff09f9a804d6fc3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004081ccb8afe0390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80c3a96f6f4d6fc3a94d20c3a92020f09f9a8000000000" + }, + { + "name": "random-(string,(bytes25[3],string,((address,(bytes12,bytes2[4],(address,bytes20,string,string),address),(bool,bytes2,address,bytes23)[2],bytes19,uint[3][1]),bool,bool,address))[])", + "type": "(string,(bytes25[3],string,((address,(bytes12,bytes2[4],(address,bytes20,string,string),address),(bool,bytes2,address,bytes23)[2],bytes19,uint[3][1]),bool,bool,address))[])", + "value": ["Moo é🚀éoé🚀🚀o🚀o ooMo 🚀🚀MooMoo oooM🚀🚀 🚀 é🚀🚀éM🚀 é ", []], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éoé🚀🚀o🚀o ooMo 🚀🚀MooMoo oooM🚀🚀 🚀 é🚀🚀éM🚀 é " + }, + { + "type": "array", + "value": [] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610689806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906103f8565b60405180910390f35b6040805180820190915260608082526020820152604080518082019091526060808252602082015260006040518060800160405280605981526020016105fb6059913982525060408051600080825260208201909252816100c5565b6100b26100d1565b8152602001906001900390816100aa5790505b50602083015250919050565b60405180606001604052806100e46100fd565b8152602001606081526020016100f861011b565b905290565b60405180606001604052806003906020820280368337509192915050565b604051806080016040528061012e610149565b81526000602082018190526040820181905260609091015290565b6040518060a0016040528060006001600160a01b0316815260200161016c61018d565b81526020016101796101f8565b8152600060208201526040016100f861023e565b604080516080810190915260008152602081016101a861026b565b81526020016101eb604051806080016040528060006001600160a01b0316815260200160006001600160601b031916815260200160608152602001606081525090565b8152600060209091015290565b60405180604001604052806002905b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816102075790505090565b60405180602001604052806001905b6102556100fd565b81526020019060019003908161024d5790505090565b60405180608001604052806004906020820280368337509192915050565b6000815180845260005b818110156102af57602081850181015186830182015201610293565b818111156102c1576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b0381511682526001600160601b0319602082015116602083015260006040820151608060408501526103116080850182610289565b90506060830151848203606086015261032a8282610289565b95945050505050565b8060005b600281101561039a5781518051151585526020808201516001600160f01b031916818701526040808301516001600160a01b03169087015260609182015168ffffffffffffffffff19169186019190915260809094019390910190600101610337565b50505050565b806000805b60018082106103b457506103f1565b835186845b60038110156103d757825182526020928301929091019083016103b9565b5050506060959095019450602092909201916001016103a5565b5050505050565b600060208083528351604080838601526104156060860183610289565b83870151601f1987830381018489015281518084529294509085019184860190600581901b8601870160005b828110156105eb5787820385018452855180518360005b600381101561047f57825166ffffffffffffff19168252918c0191908c0190600101610458565b5050508981015160a0606085015261049a60a0850182610289565b9050888201519150838103608085015281516080825260018060a01b0381511660808301528b8101516101c060a08401526001600160601b0360a01b8151166102408401528c810151610260840160005b60048110156105125782516001600160f01b0319168252918f0191908f01906001016104eb565b5050508a81015160e06102e085015261052f6103208501826102d6565b90506060820151915061054e6103008501836001600160a01b03169052565b8b830151915061056160c0850183610333565b60608301516cffffffffffffffffffffffffff1981166101c08601529150608083015192506105946101e08501846103a0565b8d85015192506105a78e85018415159052565b848c0151801515858e01529250606085015194506105d060608501866001600160a01b03169052565b998d0199978d01979550505060019290920191506104419050565b509a995050505050505050505056fe4d6f6f20c3a9f09f9a80c3a96fc3a9f09f9a80f09f9a806ff09f9a806f206f6f4d6f20f09f9a80f09f9a804d6f6f4d6f6f206f6f6f4df09f9a80f09f9a8020f09f9a8020c3a9f09f9a80f09f9a80c3a94df09f9a8020c3a920a2646970667358221220026f16a8fbae1729ced7905024c97617fcec17daed3fdcea38b1836e3bfad5a364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_f8094b90 {\n address s_0;\n bytes20 s_1;\n string s_2;\n string s_3;\n }\n\n struct S_7c217ce2 {\n bytes12 s_0;\n bytes2[4] s_1;\n S_f8094b90 s_2;\n address s_3;\n }\n\n struct S_3d66157d {\n bool s_0;\n bytes2 s_1;\n address s_2;\n bytes23 s_3;\n }\n\n struct S_ece03302 {\n address s_0;\n S_7c217ce2 s_1;\n S_3d66157d[2] s_2;\n bytes19 s_3;\n uint256[3][1] s_4;\n }\n\n struct S_c2ca3a8c {\n S_ece03302 s_0;\n bool s_1;\n bool s_2;\n address s_3;\n }\n\n struct S_4ef1ba24 {\n bytes25[3] s_0;\n string s_1;\n S_c2ca3a8c s_2;\n }\n\n struct S_c8bf7526 {\n string s_0;\n S_4ef1ba24[] s_1;\n }\n\n function test () public pure returns (S_c8bf7526 memory) {\n S_c8bf7526 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀éoé🚀🚀o🚀o ooMo 🚀🚀MooMoo oooM🚀🚀 🚀 é🚀🚀éM🚀 é \";\n r.s_0 = r_0;\n }\n {\n S_4ef1ba24[] memory r_1 = new S_4ef1ba24[](0);\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a80c3a96fc3a9f09f9a80f09f9a806ff09f9a806f206f6f4d6f20f09f9a80f09f9a804d6f6f4d6f6f206f6f6f4df09f9a80f09f9a8020f09f9a8020c3a9f09f9a80f09f9a80c3a94df09f9a8020c3a920000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(address[2],uint176,(string[],bytes22,string,bool)[],((bool,uint),string,(uint80,bool,bool,address,string[1])),((((bool),address[2],string,address)[1],string,string))[])", + "type": "(address[2],uint176,(string[],bytes22,string,bool)[],((bool,uint),string,(uint80,bool,bool,address,string[1])),((((bool),address[2],string,address)[1],string,string))[])", + "value": [ + [ + "0x8987Fa2Aac46D8A11EB87fcf9890458e8936cA61", + "0x8FB5F6650fCCc0efF26E28023fDCcEdF14E9864f" + ], + "23551615400437493761736304982846751570286021631936031", + [ + [ + [ + "Moo é🚀ééééMMo🚀 M M o 🚀MooMooMé é oMoo🚀 ooM ", + "Moo é🚀oé🚀Mé🚀é o 🚀 Méo🚀éo🚀oéoo🚀ooéM 🚀ééo🚀🚀ooo🚀M oé oM MM🚀o🚀", + "Moo é🚀oé oMoo🚀🚀é 🚀 o Méoé M🚀éMé🚀oMMéé 🚀ooMooMéo🚀ooo🚀", + "Moo é🚀 M é🚀 oo🚀é éé🚀éo🚀🚀oooé 🚀oo ooMo🚀🚀o oo🚀 éoM🚀Mo🚀o " + ], + "0x0062ec78ccc1d6cf069994e17f8dc5eee150a1b73e1b", + "Moo é🚀ooooéoo", + false + ], + [ + ["Moo é🚀", "Moo é🚀🚀🚀oMé🚀 ééoM"], + "0xe5af7aaaa13f22fdd79717d099f1dfbc1e52009637c3", + "Moo é🚀🚀o", + true + ], + [ + [ + "Moo é🚀MMéo oé🚀éooé", + "Moo é🚀🚀 M o oé🚀M🚀M 🚀éooooM ooo🚀o ooMo oé🚀MéMé" + ], + "0xeea4cf9e6327c5a205fa57df9274b86d7b60e0dee4ee", + "Moo é🚀éoooo", + true + ] + ], + [ + [ + false, + "89574471288993514935650399801903430075700747180448827236201756264800791061895" + ], + "Moo é🚀ooooMMéooé ", + [ + "704687446297847473298686", + true, + true, + "0xe300e43bfe36527aB16931Ccf646B4eabbF81246", + ["Moo é🚀é M🚀M🚀MéoooéM MooéMoo"] + ] + ], + [ + [ + [ + [ + [ + [true], + [ + "0x9a12Aee3f664507C566B273D2F4Eb9d4D03D4180", + "0x7a8ec8105d60F71C3ACc92C64875b1aDFd837357" + ], + "Moo é🚀 Moooo🚀ooM o🚀éo o ", + "0x4Ff681175143029B6A6e00996aCE1Cac634c500d" + ] + ], + "Moo é🚀 🚀🚀oooMMéooo🚀🚀éMéé🚀ooéooMM Moo", + "Moo é🚀oM🚀🚀o o🚀 🚀o🚀🚀éoooM 🚀🚀Mé🚀🚀M🚀o M 🚀éoéM" + ] + ], + [ + [ + [ + [ + [false], + [ + "0x3bE888F6540fc4d78187206A53276E9abbab9c3c", + "0xDdBAF99c86C79633d1D34258Ac54a2e3502Fd71e" + ], + "Moo é🚀oMM🚀oMéMéooMoé Mo 🚀🚀M", + "0x32d1e9fc919125BbF9Fc8F78F830bA808876041A" + ] + ], + "Moo é🚀🚀🚀🚀🚀oéoMMM🚀o🚀ooo🚀oooMoMooéMM🚀MM éoé🚀éM Moo", + "Moo é🚀 éMooé M🚀 🚀éM oéMM🚀éMoo" + ] + ], + [ + [ + [ + [ + [false], + [ + "0xBDB6d879236A1Ff7Ab89120daE1BA21Abe245973", + "0x9246B3dCCEFB80d4Ed0c4C2051B22CA015483bFa" + ], + "Moo é🚀o M🚀é🚀M oMM M🚀oo MoMMo🚀o oo 🚀M🚀🚀éM", + "0x9BCBB647735eCabbE7c31DA582D12d6726Dfd589" + ] + ], + "Moo é🚀", + "Moo é🚀 éooM o🚀 🚀oé🚀🚀M🚀Méoo🚀🚀oMoé oM M 🚀é o🚀" + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8987Fa2Aac46D8A11EB87fcf9890458e8936cA61" + }, + { + "type": "address", + "value": "0x8FB5F6650fCCc0efF26E28023fDCcEdF14E9864f" + } + ] + }, + { + "type": "number", + "value": "23551615400437493761736304982846751570286021631936031" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééééMMo🚀 M M o 🚀MooMooMé é oMoo🚀 ooM " + }, + { + "type": "string", + "value": "Moo é🚀oé🚀Mé🚀é o 🚀 Méo🚀éo🚀oéoo🚀ooéM 🚀ééo🚀🚀ooo🚀M oé oM MM🚀o🚀" + }, + { + "type": "string", + "value": "Moo é🚀oé oMoo🚀🚀é 🚀 o Méoé M🚀éMé🚀oMMéé 🚀ooMooMéo🚀ooo🚀" + }, + { + "type": "string", + "value": "Moo é🚀 M é🚀 oo🚀é éé🚀éo🚀🚀oooé 🚀oo ooMo🚀🚀o oo🚀 éoM🚀Mo🚀o " + } + ] + }, + { + "type": "hexstring", + "value": "0x0062ec78ccc1d6cf069994e17f8dc5eee150a1b73e1b" + }, + { + "type": "string", + "value": "Moo é🚀ooooéoo" + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀oMé🚀 ééoM" + } + ] + }, + { + "type": "hexstring", + "value": "0xe5af7aaaa13f22fdd79717d099f1dfbc1e52009637c3" + }, + { + "type": "string", + "value": "Moo é🚀🚀o" + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMéo oé🚀éooé" + }, + { + "type": "string", + "value": "Moo é🚀🚀 M o oé🚀M🚀M 🚀éooooM ooo🚀o ooMo oé🚀MéMé" + } + ] + }, + { + "type": "hexstring", + "value": "0xeea4cf9e6327c5a205fa57df9274b86d7b60e0dee4ee" + }, + { + "type": "string", + "value": "Moo é🚀éoooo" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "89574471288993514935650399801903430075700747180448827236201756264800791061895" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooooMMéooé " + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "704687446297847473298686" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xe300e43bfe36527aB16931Ccf646B4eabbF81246" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é M🚀M🚀MéoooéM MooéMoo" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9a12Aee3f664507C566B273D2F4Eb9d4D03D4180" + }, + { + "type": "address", + "value": "0x7a8ec8105d60F71C3ACc92C64875b1aDFd837357" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 Moooo🚀ooM o🚀éo o " + }, + { + "type": "address", + "value": "0x4Ff681175143029B6A6e00996aCE1Cac634c500d" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 🚀🚀oooMMéooo🚀🚀éMéé🚀ooéooMM Moo" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀🚀o o🚀 🚀o🚀🚀éoooM 🚀🚀Mé🚀🚀M🚀o M 🚀éoéM" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x3bE888F6540fc4d78187206A53276E9abbab9c3c" + }, + { + "type": "address", + "value": "0xDdBAF99c86C79633d1D34258Ac54a2e3502Fd71e" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oMM🚀oMéMéooMoé Mo 🚀🚀M" + }, + { + "type": "address", + "value": "0x32d1e9fc919125BbF9Fc8F78F830bA808876041A" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀🚀oéoMMM🚀o🚀ooo🚀oooMoMooéMM🚀MM éoé🚀éM Moo" + }, + { + "type": "string", + "value": "Moo é🚀 éMooé M🚀 🚀éM oéMM🚀éMoo" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xBDB6d879236A1Ff7Ab89120daE1BA21Abe245973" + }, + { + "type": "address", + "value": "0x9246B3dCCEFB80d4Ed0c4C2051B22CA015483bFa" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o M🚀é🚀M oMM M🚀oo MoMMo🚀o oo 🚀M🚀🚀éM" + }, + { + "type": "address", + "value": "0x9BCBB647735eCabbE7c31DA582D12d6726Dfd589" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀 éooM o🚀 🚀oé🚀🚀M🚀Méoo🚀🚀oMoé oM M 🚀é o🚀" + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b506113af806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610e07565b60405180910390f35b610056610a29565b61005e610a29565b610066610a64565b738987fa2aac46d8a11eb87fcf9890458e8936ca618152738fb5f6650fccc0eff26e28023fdccedf14e9864f602080830191909152908252753ef2ab4fc6aba6c5a5c845bc009cfa6fe96854da061f9082015260408051600380825260808201909252600091816020015b604080516080810182526060808252600060208084018290529383018290529082015282526000199092019101816100d157505060408051608081018252606080825260006020830181905292820181905281019190915290915060408051600480825260a08201909252600091816020015b606081526020019060019003908161014457905050905060006040518060600160405280603e8152602001611147603e91399050808260008151811061018c5761018c610f6d565b60200260200101819052505060006040518060a00160405280606c81526020016111b5606c9139905080826001815181106101c9576101c9610f6d565b60200260200101819052505060006040518060800160405280605a8152602001611288605a91399050808260028151811061020657610206610f6d565b60200260200101819052505060006040518060a00160405280606381526020016110e4606391399050808260038151811061024357610243610f6d565b602090810291909101810191909152918352507462ec78ccc1d6cf069994e17f8dc5eee150a1b73e1b60501b8282015260408051808201825260128152714d6f6f20c3a9f09f9a806f6f6f6fc3a96f6f60701b928101929092528201526000606082018190528251829184916102bb576102bb610f6d565b6020026020010181905250506102f160408051608081018252606080825260006020830181905292820181905281019190915290565b60408051600280825260608201909252600091816020015b606081526020019060019003908161030957905050905060006040518060400160405280600a8152602001689adede418753e13f3560b71b8152509050808260008151811061035a5761035a610f6d565b6020026020010181905250506000604051806060016040528060218152602001610f84602191399050808260018151811061039757610397610f6d565b6020908102919091018101919091529183525075e5af7aaaa13f22fdd79717d099f1dfbc1e52009637c360501b82820152604080518082018252600f81526e4d6f6f20c3a9f09f9a80f09f9a806f60881b92810192909252820152600160608201819052825182918491811061040f5761040f610f6d565b60200260200101819052505061044560408051608081018252606080825260006020830181905292820181905281019190915290565b60408051600280825260608201909252600091816020015b606081526020019060019003908161045d57905050905060006040518060400160405280601d81526020017f4d6f6f20c3a9f09f9a804d4dc3a96f206fc3a9f09f9a80c3a96f6fc3a9000000815250905080826000815181106104c2576104c2610f6d565b602002602001018190525050600060405180608001604052806049815260200161109b60499139905080826001815181106104ff576104ff610f6d565b6020908102919091018101919091529183525075775267cf3193e2d102fd2befc93a5c36bdb0706f727760511b82820152604080518082018252601081526f4d6f6f20c3a9f09f9a80c3a96f6f6f6f60801b9281019290925282015260016060820152815181908390600290811061057957610579610f6d565b6020908102919091010152506040820152610592610a82565b604080518082018252600081527fc6095aa67f4103da21fc8f07759d641764c85c620a8028c86e466cac1b4c65876020808301919091529083528151808301909252601782527f4d6f6f20c3a9f09f9a806f6f6f6f4d4dc3a96f6fc3a92000000000000000000082820152820152610608610ab6565b6995392ed9bdc98406dcfe8152600160208201819052604082015273e300e43bfe36527ab16931ccf646b4eabbf812466060820152610645610ae2565b6000604051806060016040528060298152602001610fa560299139825250608082810191909152604083810192909252606084019290925280516003808252928101909152600091816020015b61069a610b09565b8152602001906001900390816106925790505090506106b7610b09565b6106bf610b18565b6106c7610b3f565b6106cf610b6c565b60408051602081019091526001815281526106e8610a64565b739a12aee3f664507c566b273d2f4eb9d4d03d41808152737a8ec8105d60f71c3acc92c64875b1adfd837357602080830191909152828101919091526040805160608101909152602380825260009261107890830139604083810191909152734ff681175143029b6a6e00996ace1cac634c500d606080850191909152928452928452508151908101909152603c8082526000919061124c60208301399050808260200181905250506000604051806080016040528060588152602001610fce6058913960408301525081528151819083906000906107c9576107c9610f6d565b6020026020010181905250506107dd610b09565b6107e5610b18565b6107ed610b3f565b6107f5610b6c565b604080516020810190915260008152815261080e610a64565b733be888f6540fc4d78187206a53276e9abbab9c3c815273ddbaf99c86c79633d1d34258ac54a2e3502fd71e602080830191909152828101919091526040805160608101909152602b808252600092611221908301396040838101919091527332d1e9fc919125bbf9fc8f78f830ba808876041a6060840152918352509082528051608081019091526054808252600091906112e26020830139905080826020018190525050600060405180606001604052806030815260200161118560309139604083015250815281518190839060019081106108ee576108ee610f6d565b602002602001018190525050610902610b09565b61090a610b18565b610912610b3f565b61091a610b6c565b6040805160208101909152600081528152610933610a64565b73bdb6d879236a1ff7ab89120dae1ba21abe2459738152739246b3dccefb80d4ed0c4c2051b22ca015483bfa602080830191909152828101919091526040805160808101909152604480825260009261133690830139604083810191909152739bcbb647735ecabbe7c31da582d12d6726dfd58960608401529183525090825280518082018252600a8152689adede418753e13f3560b71b602082810191909152838101919091528151608081019092526052808352600092916110269083013960408301525081528151819083906002908110610a1357610a13610f6d565b6020908102919091010152506080820152919050565b6040518060a00160405280610a3c610a64565b81526000602082015260606040820181905201610a57610a82565b8152602001606081525090565b60405180604001604052806002906020820280368337509192915050565b6040805160a0810182526000606080830182815260808401929092529082526020820152908101610ab1610ab6565b905290565b6040805160a081018252600080825260208201819052918101829052606081019190915260808101610ab15b60405180602001604052806001905b6060815260200190600190039081610af15790505090565b6040518060200160405280610ab15b6040518060600160405280610b2b610b3f565b815260200160608152602001606081525090565b60405180602001604052806001905b610b56610b6c565b815260200190600190039081610b4e5790505090565b6040805160a08101909152600060808201908152815260208101610b8e610a64565b815260606020820152600060409091015290565b8060005b6002811015610bce5781516001600160a01b0316845260209384019390910190600101610ba6565b50505050565b6000815180845260005b81811015610bfa57602081850181015186830182015201610bde565b81811115610c0c576000602083870101525b50601f01601f19169290920160200192915050565b600081518051151584526020808201518186015280840151915060806040860152610c4f6080860183610bd4565b91506040840151858303606087015260a0830169ffffffffffffffffffff82511684528282015115158385015260408201511515604085015260018060a01b0360608301511660608501526080820151915060a060808501528081905060c08501915060005b6001811015610ce457609f19868403018252610cd2838551610bd4565b93850193925090840190600101610cb5565b5090979650505050505050565b600081518084526020808501808196508360051b8101915082860160005b85811015610dfa5782840389528151518585528051606087870181905260809160a091838901838a0160005b6001811015610da3578b8203607f190183528451805151151583528d810151610d668f850182610ba2565b5060408101518786850152610d7d88850182610bd4565b918601516001600160a01b031693890193909352948d0194928d01929150600101610d3b565b508b8701519550601f19945060409350848b820301848c0152610dc68187610bd4565b955050508185015194508289850301818a0152505050610de68183610bd4565b9a87019a9550505090840190600101610d0f565b5091979650505050505050565b6000602080835260e08301610e1f8285018651610ba2565b818501516001600160b01b031660608581019190915260408087015160c0608080890191909152815194859052610100600586901b890181019593949392870192908901906000805b82811015610f215760ff198c8a0301845285518051868b528051878c0181905260a0600582901b8d018101928e0191908d0190865b81811015610ecb57609f198f8603018352610eb9858551610bd4565b9450928f0192918f0191600101610e9d565b505050508b82015169ffffffffffffffffffff19168b8d0152898201518b82038b8d0152610ef98282610bd4565b928a01518015158d8c0152929150610f0e9050565b9950509489019492890192600101610e68565b50505050828901519550601f199350838886030160a0890152610f448587610c21565b9550808901519450505050808584030160c086015250610f648282610cf1565b95945050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4dc3a9f09f9a8020c3a9c3a96f4d4d6f6f20c3a9f09f9a80c3a9204df09f9a804df09f9a804dc3a96f6f6fc3a94d204d6f6fc3a94d6f6f4d6f6f20c3a9f09f9a806f4df09f9a80f09f9a806f206ff09f9a80202020f09f9a806ff09f9a80f09f9a80c3a96f6f6f4d20f09f9a80f09f9a804dc3a9f09f9a80f09f9a804df09f9a806f204d20f09f9a80c3a96fc3a94d4d6f6f20c3a9f09f9a802020c3a96f6f4d206ff09f9a802020f09f9a806fc3a9f09f9a80f09f9a804df09f9a804dc3a96f6ff09f9a80f09f9a806f4d6fc3a9206f4d20204d20f09f9a80c3a9206ff09f9a804d6f6f20c3a9f09f9a80204d6f6f6f6ff09f9a806f6f4d206ff09f9a80c3a96f206f204d6f6f20c3a9f09f9a80f09f9a80204d206f206fc3a9f09f9a804df09f9a804d20f09f9a80c3a96f6f6f6f4d206f6f6ff09f9a806f206f6f4d6f20206fc3a9f09f9a804dc3a94dc3a94d6f6f20c3a9f09f9a80204d20c3a9f09f9a8020206f6ff09f9a80c3a920c3a9c3a9f09f9a80c3a96ff09f9a80f09f9a806f6f6fc3a920f09f9a806f6f206f6f4d6ff09f9a80f09f9a806f206f6ff09f9a8020c3a96f4df09f9a804d6ff09f9a806f204d6f6f20c3a9f09f9a80c3a9c3a9c3a9c3a94d4d6ff09f9a80204d204d206f20f09f9a804d6f6f4d6f6f4dc3a920c3a9206f4d6f6ff09f9a80206f6f4d204d6f6f20c3a9f09f9a8020c3a94d6f6fc3a9204df09f9a8020f09f9a80c3a94d20206fc3a94d4df09f9a80c3a94d6f6f4d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a9f09f9a80c3a9206f20f09f9a80204dc3a96ff09f9a80c3a96ff09f9a806fc3a96f6ff09f9a806f6fc3a94d20f09f9a80c3a9c3a96ff09f9a80f09f9a806f6f6ff09f9a804d206fc3a9206f4d204d4df09f9a806ff09f9a804d6f6f20c3a9f09f9a806f4d4df09f9a806f4dc3a94dc3a96f6f4d6fc3a9204d6f20f09f9a80f09f9a804d4d6f6f20c3a9f09f9a8020f09f9a80f09f9a806f6f6f4d4dc3a96f6f6ff09f9a80f09f9a80c3a94dc3a9c3a9f09f9a806f6fc3a96f6f4d4d204d6f6f4d6f6f20c3a9f09f9a806fc3a9206f4d6f6ff09f9a80f09f9a80c3a920f09f9a8020206f204dc3a96fc3a9204df09f9a80c3a94dc3a9f09f9a806f4d4dc3a9c3a920f09f9a806f6f4d6f6f4dc3a96ff09f9a806f6f6ff09f9a804d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80f09f9a806fc3a96f4d4d4df09f9a806ff09f9a806f6f6ff09f9a806f6f6f4d6f4d6f6fc3a94d4df09f9a804d4d20c3a96fc3a9f09f9a80c3a94d204d6f6f4d6f6f20c3a9f09f9a806f20204df09f9a80c3a9f09f9a804d206f4d4d204df09f9a806f6f204d6f4d4d6ff09f9a806f206f6f20f09f9a804df09f9a80f09f9a80c3a94da264697066735822122084ec15b982894e4586e42b92514ab43068df18523b2b8e5a06a3d42bd181560964736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_831282b2 {\n string[] s_0;\n bytes22 s_1;\n string s_2;\n bool s_3;\n }\n\n struct S_a441b23c {\n bool s_0;\n uint256 s_1;\n }\n\n struct S_1ff73a29 {\n uint80 s_0;\n bool s_1;\n bool s_2;\n address s_3;\n string[1] s_4;\n }\n\n struct S_1e55e72a {\n S_a441b23c s_0;\n string s_1;\n S_1ff73a29 s_2;\n }\n\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_0dee559a {\n S_c1053bda s_0;\n address[2] s_1;\n string s_2;\n address s_3;\n }\n\n struct S_e23a0fc8 {\n S_0dee559a[1] s_0;\n string s_1;\n string s_2;\n }\n\n struct S_b2019ea0 {\n S_e23a0fc8 s_0;\n }\n\n struct S_78fbc7d8 {\n address[2] s_0;\n uint176 s_1;\n S_831282b2[] s_2;\n S_1e55e72a s_3;\n S_b2019ea0[] s_4;\n }\n\n function test () public pure returns (S_78fbc7d8 memory) {\n S_78fbc7d8 memory r;\n {\n address[2] memory r_0;\n {\n address r_0_0 = 0x8987Fa2Aac46D8A11EB87fcf9890458e8936cA61;\n r_0[0] = r_0_0;\n }\n {\n address r_0_1 = 0x8FB5F6650fCCc0efF26E28023fDCcEdF14E9864f;\n r_0[1] = r_0_1;\n }\n r.s_0 = r_0;\n }\n {\n uint176 r_1 = 23551615400437493761736304982846751570286021631936031;\n r.s_1 = r_1;\n }\n {\n S_831282b2[] memory r_2 = new S_831282b2[](3);\n {\n S_831282b2 memory r_2_0;\n {\n string[] memory r_2_0_0 = new string[](4);\n {\n string memory r_2_0_0_0 = unicode\"Moo é🚀ééééMMo🚀 M M o 🚀MooMooMé é oMoo🚀 ooM \";\n r_2_0_0[0] = r_2_0_0_0;\n }\n {\n string memory r_2_0_0_1 = unicode\"Moo é🚀oé🚀Mé🚀é o 🚀 Méo🚀éo🚀oéoo🚀ooéM 🚀ééo🚀🚀ooo🚀M oé oM MM🚀o🚀\";\n r_2_0_0[1] = r_2_0_0_1;\n }\n {\n string memory r_2_0_0_2 = unicode\"Moo é🚀oé oMoo🚀🚀é 🚀 o Méoé M🚀éMé🚀oMMéé 🚀ooMooMéo🚀ooo🚀\";\n r_2_0_0[2] = r_2_0_0_2;\n }\n {\n string memory r_2_0_0_3 = unicode\"Moo é🚀 M é🚀 oo🚀é éé🚀éo🚀🚀oooé 🚀oo ooMo🚀🚀o oo🚀 éoM🚀Mo🚀o \";\n r_2_0_0[3] = r_2_0_0_3;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n bytes22 r_2_0_1 = bytes22(0x0062ec78ccc1d6cf069994e17f8dc5eee150a1b73e1b);\n r_2_0.s_1 = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀ooooéoo\";\n r_2_0.s_2 = r_2_0_2;\n }\n {\n bool r_2_0_3 = false;\n r_2_0.s_3 = r_2_0_3;\n }\n r_2[0] = r_2_0;\n }\n {\n S_831282b2 memory r_2_1;\n {\n string[] memory r_2_1_0 = new string[](2);\n {\n string memory r_2_1_0_0 = unicode\"Moo é🚀\";\n r_2_1_0[0] = r_2_1_0_0;\n }\n {\n string memory r_2_1_0_1 = unicode\"Moo é🚀🚀🚀oMé🚀 ééoM\";\n r_2_1_0[1] = r_2_1_0_1;\n }\n r_2_1.s_0 = r_2_1_0;\n }\n {\n bytes22 r_2_1_1 = bytes22(0xe5af7aaaa13f22fdd79717d099f1dfbc1e52009637c3);\n r_2_1.s_1 = r_2_1_1;\n }\n {\n string memory r_2_1_2 = unicode\"Moo é🚀🚀o\";\n r_2_1.s_2 = r_2_1_2;\n }\n {\n bool r_2_1_3 = true;\n r_2_1.s_3 = r_2_1_3;\n }\n r_2[1] = r_2_1;\n }\n {\n S_831282b2 memory r_2_2;\n {\n string[] memory r_2_2_0 = new string[](2);\n {\n string memory r_2_2_0_0 = unicode\"Moo é🚀MMéo oé🚀éooé\";\n r_2_2_0[0] = r_2_2_0_0;\n }\n {\n string memory r_2_2_0_1 = unicode\"Moo é🚀🚀 M o oé🚀M🚀M 🚀éooooM ooo🚀o ooMo oé🚀MéMé\";\n r_2_2_0[1] = r_2_2_0_1;\n }\n r_2_2.s_0 = r_2_2_0;\n }\n {\n bytes22 r_2_2_1 = bytes22(0xeea4cf9e6327c5a205fa57df9274b86d7b60e0dee4ee);\n r_2_2.s_1 = r_2_2_1;\n }\n {\n string memory r_2_2_2 = unicode\"Moo é🚀éoooo\";\n r_2_2.s_2 = r_2_2_2;\n }\n {\n bool r_2_2_3 = true;\n r_2_2.s_3 = r_2_2_3;\n }\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n S_1e55e72a memory r_3;\n {\n S_a441b23c memory r_3_0;\n {\n bool r_3_0_0 = false;\n r_3_0.s_0 = r_3_0_0;\n }\n {\n uint r_3_0_1 = 89574471288993514935650399801903430075700747180448827236201756264800791061895;\n r_3_0.s_1 = r_3_0_1;\n }\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀ooooMMéooé \";\n r_3.s_1 = r_3_1;\n }\n {\n S_1ff73a29 memory r_3_2;\n {\n uint80 r_3_2_0 = 704687446297847473298686;\n r_3_2.s_0 = r_3_2_0;\n }\n {\n bool r_3_2_1 = true;\n r_3_2.s_1 = r_3_2_1;\n }\n {\n bool r_3_2_2 = true;\n r_3_2.s_2 = r_3_2_2;\n }\n {\n address r_3_2_3 = 0xe300e43bfe36527aB16931Ccf646B4eabbF81246;\n r_3_2.s_3 = r_3_2_3;\n }\n {\n string[1] memory r_3_2_4;\n {\n string memory r_3_2_4_0 = unicode\"Moo é🚀é M🚀M🚀MéoooéM MooéMoo\";\n r_3_2_4[0] = r_3_2_4_0;\n }\n r_3_2.s_4 = r_3_2_4;\n }\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n S_b2019ea0[] memory r_4 = new S_b2019ea0[](3);\n {\n S_b2019ea0 memory r_4_0;\n {\n S_e23a0fc8 memory r_4_0_0;\n {\n S_0dee559a[1] memory r_4_0_0_0;\n {\n S_0dee559a memory r_4_0_0_0_0;\n {\n S_c1053bda memory r_4_0_0_0_0_0;\n {\n bool r_4_0_0_0_0_0_0 = true;\n r_4_0_0_0_0_0.s_0 = r_4_0_0_0_0_0_0;\n }\n r_4_0_0_0_0.s_0 = r_4_0_0_0_0_0;\n }\n {\n address[2] memory r_4_0_0_0_0_1;\n {\n address r_4_0_0_0_0_1_0 = 0x9a12Aee3f664507C566B273D2F4Eb9d4D03D4180;\n r_4_0_0_0_0_1[0] = r_4_0_0_0_0_1_0;\n }\n {\n address r_4_0_0_0_0_1_1 = 0x7a8ec8105d60F71C3ACc92C64875b1aDFd837357;\n r_4_0_0_0_0_1[1] = r_4_0_0_0_0_1_1;\n }\n r_4_0_0_0_0.s_1 = r_4_0_0_0_0_1;\n }\n {\n string memory r_4_0_0_0_0_2 = unicode\"Moo é🚀 Moooo🚀ooM o🚀éo o \";\n r_4_0_0_0_0.s_2 = r_4_0_0_0_0_2;\n }\n {\n address r_4_0_0_0_0_3 = 0x4Ff681175143029B6A6e00996aCE1Cac634c500d;\n r_4_0_0_0_0.s_3 = r_4_0_0_0_0_3;\n }\n r_4_0_0_0[0] = r_4_0_0_0_0;\n }\n r_4_0_0.s_0 = r_4_0_0_0;\n }\n {\n string memory r_4_0_0_1 = unicode\"Moo é🚀 🚀🚀oooMMéooo🚀🚀éMéé🚀ooéooMM Moo\";\n r_4_0_0.s_1 = r_4_0_0_1;\n }\n {\n string memory r_4_0_0_2 = unicode\"Moo é🚀oM🚀🚀o o🚀 🚀o🚀🚀éoooM 🚀🚀Mé🚀🚀M🚀o M 🚀éoéM\";\n r_4_0_0.s_2 = r_4_0_0_2;\n }\n r_4_0.s_0 = r_4_0_0;\n }\n r_4[0] = r_4_0;\n }\n {\n S_b2019ea0 memory r_4_1;\n {\n S_e23a0fc8 memory r_4_1_0;\n {\n S_0dee559a[1] memory r_4_1_0_0;\n {\n S_0dee559a memory r_4_1_0_0_0;\n {\n S_c1053bda memory r_4_1_0_0_0_0;\n {\n bool r_4_1_0_0_0_0_0 = false;\n r_4_1_0_0_0_0.s_0 = r_4_1_0_0_0_0_0;\n }\n r_4_1_0_0_0.s_0 = r_4_1_0_0_0_0;\n }\n {\n address[2] memory r_4_1_0_0_0_1;\n {\n address r_4_1_0_0_0_1_0 = 0x3bE888F6540fc4d78187206A53276E9abbab9c3c;\n r_4_1_0_0_0_1[0] = r_4_1_0_0_0_1_0;\n }\n {\n address r_4_1_0_0_0_1_1 = 0xDdBAF99c86C79633d1D34258Ac54a2e3502Fd71e;\n r_4_1_0_0_0_1[1] = r_4_1_0_0_0_1_1;\n }\n r_4_1_0_0_0.s_1 = r_4_1_0_0_0_1;\n }\n {\n string memory r_4_1_0_0_0_2 = unicode\"Moo é🚀oMM🚀oMéMéooMoé Mo 🚀🚀M\";\n r_4_1_0_0_0.s_2 = r_4_1_0_0_0_2;\n }\n {\n address r_4_1_0_0_0_3 = 0x32d1e9fc919125BbF9Fc8F78F830bA808876041A;\n r_4_1_0_0_0.s_3 = r_4_1_0_0_0_3;\n }\n r_4_1_0_0[0] = r_4_1_0_0_0;\n }\n r_4_1_0.s_0 = r_4_1_0_0;\n }\n {\n string memory r_4_1_0_1 = unicode\"Moo é🚀🚀🚀🚀🚀oéoMMM🚀o🚀ooo🚀oooMoMooéMM🚀MM éoé🚀éM Moo\";\n r_4_1_0.s_1 = r_4_1_0_1;\n }\n {\n string memory r_4_1_0_2 = unicode\"Moo é🚀 éMooé M🚀 🚀éM oéMM🚀éMoo\";\n r_4_1_0.s_2 = r_4_1_0_2;\n }\n r_4_1.s_0 = r_4_1_0;\n }\n r_4[1] = r_4_1;\n }\n {\n S_b2019ea0 memory r_4_2;\n {\n S_e23a0fc8 memory r_4_2_0;\n {\n S_0dee559a[1] memory r_4_2_0_0;\n {\n S_0dee559a memory r_4_2_0_0_0;\n {\n S_c1053bda memory r_4_2_0_0_0_0;\n {\n bool r_4_2_0_0_0_0_0 = false;\n r_4_2_0_0_0_0.s_0 = r_4_2_0_0_0_0_0;\n }\n r_4_2_0_0_0.s_0 = r_4_2_0_0_0_0;\n }\n {\n address[2] memory r_4_2_0_0_0_1;\n {\n address r_4_2_0_0_0_1_0 = 0xBDB6d879236A1Ff7Ab89120daE1BA21Abe245973;\n r_4_2_0_0_0_1[0] = r_4_2_0_0_0_1_0;\n }\n {\n address r_4_2_0_0_0_1_1 = 0x9246B3dCCEFB80d4Ed0c4C2051B22CA015483bFa;\n r_4_2_0_0_0_1[1] = r_4_2_0_0_0_1_1;\n }\n r_4_2_0_0_0.s_1 = r_4_2_0_0_0_1;\n }\n {\n string memory r_4_2_0_0_0_2 = unicode\"Moo é🚀o M🚀é🚀M oMM M🚀oo MoMMo🚀o oo 🚀M🚀🚀éM\";\n r_4_2_0_0_0.s_2 = r_4_2_0_0_0_2;\n }\n {\n address r_4_2_0_0_0_3 = 0x9BCBB647735eCabbE7c31DA582D12d6726Dfd589;\n r_4_2_0_0_0.s_3 = r_4_2_0_0_0_3;\n }\n r_4_2_0_0[0] = r_4_2_0_0_0;\n }\n r_4_2_0.s_0 = r_4_2_0_0;\n }\n {\n string memory r_4_2_0_1 = unicode\"Moo é🚀\";\n r_4_2_0.s_1 = r_4_2_0_1;\n }\n {\n string memory r_4_2_0_2 = unicode\"Moo é🚀 éooM o🚀 🚀oé🚀🚀M🚀Méoo🚀🚀oMoé oM M 🚀é o🚀\";\n r_4_2_0.s_2 = r_4_2_0_2;\n }\n r_4_2.s_0 = r_4_2_0;\n }\n r_4[2] = r_4_2;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000008987fa2aac46d8a11eb87fcf9890458e8936ca610000000000000000000000008fb5f6650fccc0eff26e28023fdccedf14e9864f000000000000000000003ef2ab4fc6aba6c5a5c845bc009cfa6fe96854da061f00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000000800062ec78ccc1d6cf069994e17f8dc5eee150a1b73e1b00000000000000000000000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a80c3a9c3a9c3a9c3a94d4d6ff09f9a80204d204d206f20f09f9a804d6f6f4d6f6f4dc3a920c3a9206f4d6f6ff09f9a80206f6f4d200000000000000000000000000000000000000000000000000000000000000000006c4d6f6f20c3a9f09f9a806fc3a9f09f9a804dc3a9f09f9a80c3a9206f20f09f9a80204dc3a96ff09f9a80c3a96ff09f9a806fc3a96f6ff09f9a806f6fc3a94d20f09f9a80c3a9c3a96ff09f9a80f09f9a806f6f6ff09f9a804d206fc3a9206f4d204d4df09f9a806ff09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806fc3a9206f4d6f6ff09f9a80f09f9a80c3a920f09f9a8020206f204dc3a96fc3a9204df09f9a80c3a94dc3a9f09f9a806f4d4dc3a9c3a920f09f9a806f6f4d6f6f4dc3a96ff09f9a806f6f6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80204d20c3a9f09f9a8020206f6ff09f9a80c3a920c3a9c3a9f09f9a80c3a96ff09f9a80f09f9a806f6f6fc3a920f09f9a806f6f206f6f4d6ff09f9a80f09f9a806f206f6ff09f9a8020c3a96f4df09f9a804d6ff09f9a806f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a806f6f6f6fc3a96f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e5af7aaaa13f22fdd79717d099f1dfbc1e52009637c30000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a80f09f9a80f09f9a806f4dc3a9f09f9a8020c3a9c3a96f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080eea4cf9e6327c5a205fa57df9274b86d7b60e0dee4ee0000000000000000000000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a804d4dc3a96f206fc3a9f09f9a80c3a96f6fc3a900000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a80f09f9a80204d206f206fc3a9f09f9a804df09f9a804d20f09f9a80c3a96f6f6f6f4d206f6f6ff09f9a806f206f6f4d6f20206fc3a9f09f9a804dc3a94dc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80c3a96f6f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6095aa67f4103da21fc8f07759d641764c85c620a8028c86e466cac1b4c6587000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806f6f6f6f4d4dc3a96f6fc3a9200000000000000000000000000000000000000000000000000000000000000095392ed9bdc98406dcfe00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e300e43bfe36527ab16931ccf646b4eabbf8124600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a80c3a9204df09f9a804df09f9a804dc3a96f6f6fc3a94d204d6f6fc3a94d6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009a12aee3f664507c566b273d2f4eb9d4d03d41800000000000000000000000007a8ec8105d60f71c3acc92c64875b1adfd83735700000000000000000000000000000000000000000000000000000000000000a00000000000000000000000004ff681175143029b6a6e00996ace1cac634c500d00000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80204d6f6f6f6ff09f9a806f6f4d206ff09f9a80c3a96f206f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a8020f09f9a80f09f9a806f6f6f4d4dc3a96f6f6ff09f9a80f09f9a80c3a94dc3a9c3a9f09f9a806f6fc3a96f6f4d4d204d6f6f0000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a806f4df09f9a80f09f9a806f206ff09f9a80202020f09f9a806ff09f9a80f09f9a80c3a96f6f6f4d20f09f9a80f09f9a804dc3a9f09f9a80f09f9a804df09f9a806f204d20f09f9a80c3a96fc3a94d00000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003be888f6540fc4d78187206a53276e9abbab9c3c000000000000000000000000ddbaf99c86c79633d1d34258ac54a2e3502fd71e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000032d1e9fc919125bbf9fc8f78f830ba808876041a000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a806f4d4df09f9a806f4dc3a94dc3a96f6f4d6fc3a9204d6f20f09f9a80f09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a80f09f9a806fc3a96f4d4d4df09f9a806ff09f9a806f6f6ff09f9a806f6f6f4d6f4d6f6fc3a94d4df09f9a804d4d20c3a96fc3a9f09f9a80c3a94d204d6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a8020c3a94d6f6fc3a9204df09f9a8020f09f9a80c3a94d20206fc3a94d4df09f9a80c3a94d6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdb6d879236a1ff7ab89120dae1ba21abe2459730000000000000000000000009246b3dccefb80d4ed0c4c2051b22ca015483bfa00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000009bcbb647735ecabbe7c31da582d12d6726dfd58900000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a806f20204df09f9a80c3a9f09f9a804d206f4d4d204df09f9a806f6f204d6f4d4d6ff09f9a806f206f6f20f09f9a804df09f9a80f09f9a80c3a94d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a802020c3a96f6f4d206ff09f9a802020f09f9a806fc3a9f09f9a80f09f9a804df09f9a804dc3a96f6ff09f9a80f09f9a806f4d6fc3a9206f4d20204d20f09f9a80c3a9206ff09f9a800000000000000000000000000000" + }, + { + "name": "random-(bool,string,(string,(address,int24[3][4],uint256[4],bytes4[2]),uint),(string,address,(bool[],(bytes21[4],bytes24,int16,uint),address,string)[],bytes16[],string))", + "type": "(bool,string,(string,(address,int24[3][4],uint256[4],bytes4[2]),uint),(string,address,(bool[],(bytes21[4],bytes24,int16,uint),address,string)[],bytes16[],string))", + "value": [ + false, + "Moo é🚀o🚀oooM 🚀 éM🚀MooM🚀éMo🚀 éM🚀é M🚀é🚀", + [ + "Moo é🚀M o🚀M ééMoM oMMMoéé o🚀ooo🚀🚀 oM ", + [ + "0x4D83c1c5E96481fA0332cA77B9F1994007412d08", + [ + ["4215508", "-804602", "6838314"], + ["3177847", "7367301", "6083917"], + ["2329061", "1102630", "4180570"], + ["3025781", "6662439", "7479268"] + ], + [ + "39926023276551085363373582917962715309110965465257791049343790740795854995200", + "69071099571165351632141813685936392177023307842243971693386608934577522126609", + "27981916224878156486424019165533706326602015054501449050777621061309858092707", + "103333959163340068196172810723261371070218427218848437463158122590000607056992" + ], + ["0x6c6ed070", "0xb3f88148"] + ], + "58873819301920659827327704165588347661803108275350507540069153646136052274778" + ], + [ + "Moo é🚀 é MoMo éoooM🚀 ééMo", + "0x5f7B69C401a6da723d0a74c013b508FB873Fe97F", + [ + [ + [true, false, true], + [ + [ + "0x2eb2ed8b228e45fdf48b0c0f5738f4770db3f8c94c", + "0x13127aff85bbb8ff5b3f721bd42d3a84574847f2a6", + "0x2aa61f8736a7f12ca09018e5a66c31765fa1124127", + "0xff8044d2d4598f7142c584fcb5f3458933f28d7002" + ], + "0xb14cfe383701294e2c274ae3b57f4ab5389f6c5ea18e2c4d", + "-22605", + "649568991712649594053811376457667049924588071162452735678000128326155118770" + ], + "0x986F35cF4dc8cE5B4FcE71740b5cBE15d5Ef3333", + "Moo é🚀é 🚀o o oéoéo 🚀🚀 é🚀o🚀🚀é o🚀éM🚀o🚀ééoMo🚀 éooéooM" + ], + [ + [], + [ + [ + "0xddad84471c463fd59659586d556a982cbc6d7b6119", + "0xe3475c870e964e17f4d9e417ff3858944bb8c9df1b", + "0x815edfbdffd3407a5236be6bce4aa3fad2aecbfc47", + "0x786015477d5cc93205db219b092bd25297ecdc3f54" + ], + "0xb0662c6397b100dcf05b6009b57157e8dd0e6aeacbbcf27d", + "8163", + "48065875065003226500716755168132809397299922213635047157652004299330904465876" + ], + "0xAca67A929eC0A91AD0F312E22483b2A28761ec17", + "Moo é🚀 oMooé🚀éMooo🚀 o 🚀 M🚀🚀éo🚀o" + ], + [ + [true, false, true], + [ + [ + "0x6d0311f25c6be2472f052e9ba98867f7fe88388ead", + "0xba534bc76a2dec4e8d99bedf58256d7fb033ddb0f0", + "0xf6245a7bfddb0b8d3d1fe871296ee621bfd00285df", + "0xebf3bc8364e72165f2bf3b6eba8166e1a58ce48d4b" + ], + "0xdd2cbe26c72e448b7e6ef11f8dbd3421070567f1be401460", + "-4397", + "108685860433130461855587303095532121226214581672484191372945582326527518796580" + ], + "0x1E91D2Ca63c2d3cC76B65057cbe40579AD743326", + "Moo é🚀oM🚀 éo MooMéMM🚀 éééMoo🚀🚀éMM🚀🚀🚀M" + ] + ], + ["0x45d2eca383a886627c5efef44aaca5c3"], + "Moo é🚀M🚀é 🚀 Mo éoo o🚀🚀éMoo 🚀éoMé oM M oé o o" + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o🚀oooM 🚀 éM🚀MooM🚀éMo🚀 éM🚀é M🚀é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M o🚀M ééMoM oMMMoéé o🚀ooo🚀🚀 oM " + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4D83c1c5E96481fA0332cA77B9F1994007412d08" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4215508" + }, + { + "type": "number", + "value": "-804602" + }, + { + "type": "number", + "value": "6838314" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3177847" + }, + { + "type": "number", + "value": "7367301" + }, + { + "type": "number", + "value": "6083917" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2329061" + }, + { + "type": "number", + "value": "1102630" + }, + { + "type": "number", + "value": "4180570" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3025781" + }, + { + "type": "number", + "value": "6662439" + }, + { + "type": "number", + "value": "7479268" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "39926023276551085363373582917962715309110965465257791049343790740795854995200" + }, + { + "type": "number", + "value": "69071099571165351632141813685936392177023307842243971693386608934577522126609" + }, + { + "type": "number", + "value": "27981916224878156486424019165533706326602015054501449050777621061309858092707" + }, + { + "type": "number", + "value": "103333959163340068196172810723261371070218427218848437463158122590000607056992" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6c6ed070" + }, + { + "type": "hexstring", + "value": "0xb3f88148" + } + ] + } + ] + }, + { + "type": "number", + "value": "58873819301920659827327704165588347661803108275350507540069153646136052274778" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é MoMo éoooM🚀 ééMo" + }, + { + "type": "address", + "value": "0x5f7B69C401a6da723d0a74c013b508FB873Fe97F" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x2eb2ed8b228e45fdf48b0c0f5738f4770db3f8c94c" + }, + { + "type": "hexstring", + "value": "0x13127aff85bbb8ff5b3f721bd42d3a84574847f2a6" + }, + { + "type": "hexstring", + "value": "0x2aa61f8736a7f12ca09018e5a66c31765fa1124127" + }, + { + "type": "hexstring", + "value": "0xff8044d2d4598f7142c584fcb5f3458933f28d7002" + } + ] + }, + { + "type": "hexstring", + "value": "0xb14cfe383701294e2c274ae3b57f4ab5389f6c5ea18e2c4d" + }, + { + "type": "number", + "value": "-22605" + }, + { + "type": "number", + "value": "649568991712649594053811376457667049924588071162452735678000128326155118770" + } + ] + }, + { + "type": "address", + "value": "0x986F35cF4dc8cE5B4FcE71740b5cBE15d5Ef3333" + }, + { + "type": "string", + "value": "Moo é🚀é 🚀o o oéoéo 🚀🚀 é🚀o🚀🚀é o🚀éM🚀o🚀ééoMo🚀 éooéooM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xddad84471c463fd59659586d556a982cbc6d7b6119" + }, + { + "type": "hexstring", + "value": "0xe3475c870e964e17f4d9e417ff3858944bb8c9df1b" + }, + { + "type": "hexstring", + "value": "0x815edfbdffd3407a5236be6bce4aa3fad2aecbfc47" + }, + { + "type": "hexstring", + "value": "0x786015477d5cc93205db219b092bd25297ecdc3f54" + } + ] + }, + { + "type": "hexstring", + "value": "0xb0662c6397b100dcf05b6009b57157e8dd0e6aeacbbcf27d" + }, + { + "type": "number", + "value": "8163" + }, + { + "type": "number", + "value": "48065875065003226500716755168132809397299922213635047157652004299330904465876" + } + ] + }, + { + "type": "address", + "value": "0xAca67A929eC0A91AD0F312E22483b2A28761ec17" + }, + { + "type": "string", + "value": "Moo é🚀 oMooé🚀éMooo🚀 o 🚀 M🚀🚀éo🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6d0311f25c6be2472f052e9ba98867f7fe88388ead" + }, + { + "type": "hexstring", + "value": "0xba534bc76a2dec4e8d99bedf58256d7fb033ddb0f0" + }, + { + "type": "hexstring", + "value": "0xf6245a7bfddb0b8d3d1fe871296ee621bfd00285df" + }, + { + "type": "hexstring", + "value": "0xebf3bc8364e72165f2bf3b6eba8166e1a58ce48d4b" + } + ] + }, + { + "type": "hexstring", + "value": "0xdd2cbe26c72e448b7e6ef11f8dbd3421070567f1be401460" + }, + { + "type": "number", + "value": "-4397" + }, + { + "type": "number", + "value": "108685860433130461855587303095532121226214581672484191372945582326527518796580" + } + ] + }, + { + "type": "address", + "value": "0x1E91D2Ca63c2d3cC76B65057cbe40579AD743326" + }, + { + "type": "string", + "value": "Moo é🚀oM🚀 éo MooMéMM🚀 éééMoo🚀🚀éMM🚀🚀🚀M" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x45d2eca383a886627c5efef44aaca5c3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M🚀é 🚀 Mo éoo o🚀🚀éMoo 🚀éoMé oM M oé o o" + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b5061103a806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610d11565b60405180910390f35b6100566108d6565b61005e6108d6565b600080825260408051608081019091526046808252610fbf6020830139602083015250610089610908565b60006040518060600160405280603c8152602001610e3b603c91398252506100af61092f565b734d83c1c5e96481fa0332ca77b9f1994007412d0881526100ce61096c565b6100d6610999565b624052d48152620c46f91960208201526268582a604082015281526100f9610999565b62307d77815262706a85602080830191909152625cd54d6040830152820152610120610999565b622389e581526210d3266020820152623fca5a604080830191909152820152610147610999565b622e2b7581526265a92760208083019190915262721fe4604083015260608301919091528201526101766109b7565b7f5845540f19460064a283b531f616b3dffc8dd7b16a1281f856366416f8f4bf0081527f98b4db61a41f05a65f5d1e37bbb7bae34fd82f90afb9a0b0f60d2fd20f90af1160208201527f3ddd340db1817d09df81fb14b7d76a323b348696514fa602a5c6ef7df89896a36040808301919091527fe474f2c1091278791c49b839aae83f0ce3b2f457f8d9837cd1b847e0874ad460606083015282015261021a6109d5565b6306c6ed0760e41b815263167f102960e31b60208083019190915260608301919091528201527f8229669eb1022c47dcca982521345b699feb27db62017b531b4ba49442f5d65a6040808301919091528201526102756109f3565b6000604051806060016040528060258152602001610f9a60259139825250735f7b69c401a6da723d0a74c013b508fb873fe97f602082015260408051600380825260808201909252600091816020015b6102cd610a2b565b8152602001906001900390816102c55790505090506102ea610a2b565b6040805160038082526080820190925260009160208201606080368337019050509050600060019050808260008151811061032757610327610e24565b602002602001019015159081151581525050506000808260018151811061035057610350610e24565b60200260200101901515908115158152505050600060019050808260028151811061037d5761037d610e24565b91151560209283029190910190910152508152610398610a59565b6103a06109b7565b740bacbb62c8a3917f7d22c303d5ce3d1dc36cfe3253605a1b81527409893d7fc2dddc7fad9fb90dea169d422ba423f95360591b602080830191909152742aa61f8736a7f12ca09018e5a66c31765fa112412760581b6040808401919091527fff8044d2d4598f7142c584fcb5f3458933f28d700200000000000000000000006060808501919091529284527fb14cfe383701294e2c274ae3b57f4ab5389f6c5ea18e2c4d00000000000000008483015261584c19848201527f016fa49cfe5a3393aba101651bbc278922d838ebdaf785935a58a8e8971c28b2928401929092528381019290925273986f35cf4dc8ce5b4fce71740b5cbe15d5ef333383820152805160808101909152605e808252600092610f3c908301396060830152508151819083906000906104d4576104d4610e24565b6020026020010181905250506104e8610a2b565b6040805160008152602081019091528152610501610a59565b6105096109b7565b74ddad84471c463fd59659586d556a982cbc6d7b611960581b815274e3475c870e964e17f4d9e417ff3858944bb8c9df1b60581b60208083019190915274815edfbdffd3407a5236be6bce4aa3fad2aecbfc4760581b604080840191909152741e180551df57324c8176c866c24af494a5fb370fd5605a1b6060808501919091529284527fb0662c6397b100dcf05b6009b57157e8dd0e6aeacbbcf27d000000000000000084830152611fe3848201527f6a44523a4af6fda0b19d45a68d4acea3f7267b53465cdebb15a7a6ef1d2521d4848401528482019390935273aca67a929ec0a91ad0f312e22483b2a28761ec178484015282519182019092526039808252600092610e7790830139606083015250815181908390600190811061063257610632610e24565b602002602001018190525050610646610a2b565b6040805160038082526080820190925260009160208201606080368337019050509050600060019050808260008151811061068357610683610e24565b60200260200101901515908115158152505050600080826001815181106106ac576106ac610e24565b6020026020010190151590811515815250505060006001905080826002815181106106d9576106d9610e24565b911515602092830291909101909101525081526106f4610a59565b6106fc6109b7565b746d0311f25c6be2472f052e9ba98867f7fe88388ead60581b8152740ba534bc76a2dec4e8d99bedf58256d7fb033ddb0f605c1b60208083019190915274f6245a7bfddb0b8d3d1fe871296ee621bfd00285df60581b60408084019190915274ebf3bc8364e72165f2bf3b6eba8166e1a58ce48d4b60581b6060808501919091529284527fdd2cbe26c72e448b7e6ef11f8dbd3421070567f1be40146000000000000000008483015261112c19848201527ff04a045c1cfc16d8810f61a01dfa53ffaae20d7e50d9061e36fedd045faf6b249284019290925283810192909252731e91d2ca63c2d3cc76b65057cbe40579ad743326838201528051608081019091526046808252600092610eb090830139606083015250815181908390600290811061082a5761082a610e24565b60209081029190910101525060408281019190915280516001808252818301909252600091816020016020820280368337505081519192506f45d2eca383a886627c5efef44aaca5c360801b91829150839060009061088b5761088b610e24565b6001600160801b031990921660209283029190910182015260608401929092525060408051608081019091526046808252600092610ef6908301396080830152506060820152919050565b6040805160808101825260008152606060208201529081016108f6610908565b81526020016109036109f3565b905290565b60405180606001604052806060815260200161092261092f565b8152602001600081525090565b604051806080016040528060006001600160a01b0316815260200161095261096c565b815260200161095f6109b7565b81526020016109036109d5565b60405180608001604052806004905b610983610999565b81526020019060019003908161097b5790505090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6040518060a001604052806060815260200160006001600160a01b031681526020016060815260200160608152602001606081525090565b604051806080016040528060608152602001610a45610a59565b815260006020820152606060409091015290565b6040518060800160405280610a6c6109b7565b81526000602082018190526040820181905260609091015290565b6000815180845260005b81811015610aad57602081850181015186830182015201610a91565b81811115610abf576000602083870101525b50601f01601f19169290920160200192915050565b8060005b6004811015610af7578151845260209384019390910190600101610ad8565b50505050565b8060005b6002811015610af75781516001600160e01b031916845260209384019390910190600101610b01565b80518260005b6004811015610b5d5782516affffffffffffffffffffff1916825260209283019290910190600101610b30565b505050602081015167ffffffffffffffff19166080830152604081015160010b60a08301526060015160c090910152565b600081518084526020808501945080840160005b83811015610bc85781516001600160801b03191687529582019590820190600101610ba2565b509495945050505050565b6000815160a08452610be860a0850182610a87565b6020848101516001600160a01b0316868201526040808601518784038289015280518085529394509192909183019083850190600581901b860185016000805b83811015610cce57888303601f190185528551805161014080865281519086018190526101608601918b019085905b80821015610c7957825115158452928c0192918c019160019190910190610c57565b50505089820151610c8c8b870182610b2a565b50888201516001600160a01b031661010086015260609091015184820361012086015290610cba8183610a87565b978a0197968a019694505050600101610c28565b50506060890151965089810360608b0152610ce98188610b8e565b965050505050505060808301518482036080860152610d088282610a87565b95945050505050565b6000602080835283511515818401528084015160806040850152610d3860a0850182610a87565b90506040850151601f1960608187850301818801526102a08351818652610d6182870182610a87565b8588015180516001600160a01b0316888a0152808901519193509150604087016000805b6004811015610dc657835183835b6003811015610db357825160020b8252918d0191908d0190600101610d93565b505050928a019291860191600101610d85565b5050505060408101519650610ddf6101c0870188610ad4565b8201519550610df2610240860187610afd565b604084015161028086015281890151955082888203016080890152610e178187610bd3565b9998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d20206ff09f9a804d2020c3a9c3a94d6f4d206f4d4d4d6fc3a9c3a9206ff09f9a806f6f6ff09f9a80f09f9a8020206f4d204d6f6f20c3a9f09f9a80206f4d6f6fc3a9f09f9a80c3a94d6f6f6ff09f9a80206f20f09f9a8020204df09f9a80f09f9a80c3a96ff09f9a806f4d6f6f20c3a9f09f9a806f4df09f9a80202020c3a96f204d6f6f4dc3a94d4df09f9a8020c3a9c3a9c3a94d6f6ff09f9a80f09f9a80c3a94d4df09f9a80f09f9a80f09f9a804d4d6f6f20c3a9f09f9a804df09f9a80c3a920f09f9a80204d6f20c3a96f6f206ff09f9a80f09f9a80c3a94d6f6f20f09f9a80c3a96f4dc3a9206f4d204d206fc3a9206f20206f4d6f6f20c3a9f09f9a80c3a920f09f9a806f206f206fc3a96fc3a96f20f09f9a80f09f9a8020c3a9f09f9a806ff09f9a80f09f9a80c3a9206ff09f9a80c3a94df09f9a806ff09f9a80c3a9c3a96f4d6ff09f9a8020c3a96f6fc3a96f6f4d4d6f6f20c3a9f09f9a8020c3a920204d6f4d6f20c3a96f6f6f4df09f9a8020c3a9c3a94d6f4d6f6f20c3a9f09f9a806ff09f9a806f6f6f4d20f09f9a8020c3a94df09f9a804d6f6f4df09f9a80c3a94d6ff09f9a8020c3a94df09f9a80c3a9204df09f9a80c3a9f09f9a80a2646970667358221220d19252bca1512c998d785f85ae9f7a635a8f8ae52cf54146afe732a9a8398b5b64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_a507b25f {\n address s_0;\n int24[3][4] s_1;\n uint256[4] s_2;\n bytes4[2] s_3;\n }\n\n struct S_db103722 {\n string s_0;\n S_a507b25f s_1;\n uint256 s_2;\n }\n\n struct S_5a6fdea5 {\n bytes21[4] s_0;\n bytes24 s_1;\n int16 s_2;\n uint256 s_3;\n }\n\n struct S_770964d1 {\n bool[] s_0;\n S_5a6fdea5 s_1;\n address s_2;\n string s_3;\n }\n\n struct S_3019a25a {\n string s_0;\n address s_1;\n S_770964d1[] s_2;\n bytes16[] s_3;\n string s_4;\n }\n\n struct S_7f01c5a0 {\n bool s_0;\n string s_1;\n S_db103722 s_2;\n S_3019a25a s_3;\n }\n\n function test () public pure returns (S_7f01c5a0 memory) {\n S_7f01c5a0 memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀o🚀oooM 🚀 éM🚀MooM🚀éMo🚀 éM🚀é M🚀é🚀\";\n r.s_1 = r_1;\n }\n {\n S_db103722 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀M o🚀M ééMoM oMMMoéé o🚀ooo🚀🚀 oM \";\n r_2.s_0 = r_2_0;\n }\n {\n S_a507b25f memory r_2_1;\n {\n address r_2_1_0 = 0x4D83c1c5E96481fA0332cA77B9F1994007412d08;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n int24[3][4] memory r_2_1_1;\n {\n int24[3] memory r_2_1_1_0;\n {\n int24 r_2_1_1_0_0 = 4215508;\n r_2_1_1_0[0] = r_2_1_1_0_0;\n }\n {\n int24 r_2_1_1_0_1 = -804602;\n r_2_1_1_0[1] = r_2_1_1_0_1;\n }\n {\n int24 r_2_1_1_0_2 = 6838314;\n r_2_1_1_0[2] = r_2_1_1_0_2;\n }\n r_2_1_1[0] = r_2_1_1_0;\n }\n {\n int24[3] memory r_2_1_1_1;\n {\n int24 r_2_1_1_1_0 = 3177847;\n r_2_1_1_1[0] = r_2_1_1_1_0;\n }\n {\n int24 r_2_1_1_1_1 = 7367301;\n r_2_1_1_1[1] = r_2_1_1_1_1;\n }\n {\n int24 r_2_1_1_1_2 = 6083917;\n r_2_1_1_1[2] = r_2_1_1_1_2;\n }\n r_2_1_1[1] = r_2_1_1_1;\n }\n {\n int24[3] memory r_2_1_1_2;\n {\n int24 r_2_1_1_2_0 = 2329061;\n r_2_1_1_2[0] = r_2_1_1_2_0;\n }\n {\n int24 r_2_1_1_2_1 = 1102630;\n r_2_1_1_2[1] = r_2_1_1_2_1;\n }\n {\n int24 r_2_1_1_2_2 = 4180570;\n r_2_1_1_2[2] = r_2_1_1_2_2;\n }\n r_2_1_1[2] = r_2_1_1_2;\n }\n {\n int24[3] memory r_2_1_1_3;\n {\n int24 r_2_1_1_3_0 = 3025781;\n r_2_1_1_3[0] = r_2_1_1_3_0;\n }\n {\n int24 r_2_1_1_3_1 = 6662439;\n r_2_1_1_3[1] = r_2_1_1_3_1;\n }\n {\n int24 r_2_1_1_3_2 = 7479268;\n r_2_1_1_3[2] = r_2_1_1_3_2;\n }\n r_2_1_1[3] = r_2_1_1_3;\n }\n r_2_1.s_1 = r_2_1_1;\n }\n {\n uint256[4] memory r_2_1_2;\n {\n uint256 r_2_1_2_0 = 39926023276551085363373582917962715309110965465257791049343790740795854995200;\n r_2_1_2[0] = r_2_1_2_0;\n }\n {\n uint256 r_2_1_2_1 = 69071099571165351632141813685936392177023307842243971693386608934577522126609;\n r_2_1_2[1] = r_2_1_2_1;\n }\n {\n uint256 r_2_1_2_2 = 27981916224878156486424019165533706326602015054501449050777621061309858092707;\n r_2_1_2[2] = r_2_1_2_2;\n }\n {\n uint256 r_2_1_2_3 = 103333959163340068196172810723261371070218427218848437463158122590000607056992;\n r_2_1_2[3] = r_2_1_2_3;\n }\n r_2_1.s_2 = r_2_1_2;\n }\n {\n bytes4[2] memory r_2_1_3;\n {\n bytes4 r_2_1_3_0 = bytes4(0x6c6ed070);\n r_2_1_3[0] = r_2_1_3_0;\n }\n {\n bytes4 r_2_1_3_1 = bytes4(0xb3f88148);\n r_2_1_3[1] = r_2_1_3_1;\n }\n r_2_1.s_3 = r_2_1_3;\n }\n r_2.s_1 = r_2_1;\n }\n {\n uint r_2_2 = 58873819301920659827327704165588347661803108275350507540069153646136052274778;\n r_2.s_2 = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n S_3019a25a memory r_3;\n {\n string memory r_3_0 = unicode\"Moo é🚀 é MoMo éoooM🚀 ééMo\";\n r_3.s_0 = r_3_0;\n }\n {\n address r_3_1 = 0x5f7B69C401a6da723d0a74c013b508FB873Fe97F;\n r_3.s_1 = r_3_1;\n }\n {\n S_770964d1[] memory r_3_2 = new S_770964d1[](3);\n {\n S_770964d1 memory r_3_2_0;\n {\n bool[] memory r_3_2_0_0 = new bool[](3);\n {\n bool r_3_2_0_0_0 = true;\n r_3_2_0_0[0] = r_3_2_0_0_0;\n }\n {\n bool r_3_2_0_0_1 = false;\n r_3_2_0_0[1] = r_3_2_0_0_1;\n }\n {\n bool r_3_2_0_0_2 = true;\n r_3_2_0_0[2] = r_3_2_0_0_2;\n }\n r_3_2_0.s_0 = r_3_2_0_0;\n }\n {\n S_5a6fdea5 memory r_3_2_0_1;\n {\n bytes21[4] memory r_3_2_0_1_0;\n {\n bytes21 r_3_2_0_1_0_0 = bytes21(0x2eb2ed8b228e45fdf48b0c0f5738f4770db3f8c94c);\n r_3_2_0_1_0[0] = r_3_2_0_1_0_0;\n }\n {\n bytes21 r_3_2_0_1_0_1 = bytes21(0x13127aff85bbb8ff5b3f721bd42d3a84574847f2a6);\n r_3_2_0_1_0[1] = r_3_2_0_1_0_1;\n }\n {\n bytes21 r_3_2_0_1_0_2 = bytes21(0x2aa61f8736a7f12ca09018e5a66c31765fa1124127);\n r_3_2_0_1_0[2] = r_3_2_0_1_0_2;\n }\n {\n bytes21 r_3_2_0_1_0_3 = bytes21(0xff8044d2d4598f7142c584fcb5f3458933f28d7002);\n r_3_2_0_1_0[3] = r_3_2_0_1_0_3;\n }\n r_3_2_0_1.s_0 = r_3_2_0_1_0;\n }\n {\n bytes24 r_3_2_0_1_1 = bytes24(0xb14cfe383701294e2c274ae3b57f4ab5389f6c5ea18e2c4d);\n r_3_2_0_1.s_1 = r_3_2_0_1_1;\n }\n {\n int16 r_3_2_0_1_2 = -22605;\n r_3_2_0_1.s_2 = r_3_2_0_1_2;\n }\n {\n uint r_3_2_0_1_3 = 649568991712649594053811376457667049924588071162452735678000128326155118770;\n r_3_2_0_1.s_3 = r_3_2_0_1_3;\n }\n r_3_2_0.s_1 = r_3_2_0_1;\n }\n {\n address r_3_2_0_2 = 0x986F35cF4dc8cE5B4FcE71740b5cBE15d5Ef3333;\n r_3_2_0.s_2 = r_3_2_0_2;\n }\n {\n string memory r_3_2_0_3 = unicode\"Moo é🚀é 🚀o o oéoéo 🚀🚀 é🚀o🚀🚀é o🚀éM🚀o🚀ééoMo🚀 éooéooM\";\n r_3_2_0.s_3 = r_3_2_0_3;\n }\n r_3_2[0] = r_3_2_0;\n }\n {\n S_770964d1 memory r_3_2_1;\n {\n bool[] memory r_3_2_1_0 = new bool[](0);\n r_3_2_1.s_0 = r_3_2_1_0;\n }\n {\n S_5a6fdea5 memory r_3_2_1_1;\n {\n bytes21[4] memory r_3_2_1_1_0;\n {\n bytes21 r_3_2_1_1_0_0 = bytes21(0xddad84471c463fd59659586d556a982cbc6d7b6119);\n r_3_2_1_1_0[0] = r_3_2_1_1_0_0;\n }\n {\n bytes21 r_3_2_1_1_0_1 = bytes21(0xe3475c870e964e17f4d9e417ff3858944bb8c9df1b);\n r_3_2_1_1_0[1] = r_3_2_1_1_0_1;\n }\n {\n bytes21 r_3_2_1_1_0_2 = bytes21(0x815edfbdffd3407a5236be6bce4aa3fad2aecbfc47);\n r_3_2_1_1_0[2] = r_3_2_1_1_0_2;\n }\n {\n bytes21 r_3_2_1_1_0_3 = bytes21(0x786015477d5cc93205db219b092bd25297ecdc3f54);\n r_3_2_1_1_0[3] = r_3_2_1_1_0_3;\n }\n r_3_2_1_1.s_0 = r_3_2_1_1_0;\n }\n {\n bytes24 r_3_2_1_1_1 = bytes24(0xb0662c6397b100dcf05b6009b57157e8dd0e6aeacbbcf27d);\n r_3_2_1_1.s_1 = r_3_2_1_1_1;\n }\n {\n int16 r_3_2_1_1_2 = 8163;\n r_3_2_1_1.s_2 = r_3_2_1_1_2;\n }\n {\n uint r_3_2_1_1_3 = 48065875065003226500716755168132809397299922213635047157652004299330904465876;\n r_3_2_1_1.s_3 = r_3_2_1_1_3;\n }\n r_3_2_1.s_1 = r_3_2_1_1;\n }\n {\n address r_3_2_1_2 = 0xAca67A929eC0A91AD0F312E22483b2A28761ec17;\n r_3_2_1.s_2 = r_3_2_1_2;\n }\n {\n string memory r_3_2_1_3 = unicode\"Moo é🚀 oMooé🚀éMooo🚀 o 🚀 M🚀🚀éo🚀o\";\n r_3_2_1.s_3 = r_3_2_1_3;\n }\n r_3_2[1] = r_3_2_1;\n }\n {\n S_770964d1 memory r_3_2_2;\n {\n bool[] memory r_3_2_2_0 = new bool[](3);\n {\n bool r_3_2_2_0_0 = true;\n r_3_2_2_0[0] = r_3_2_2_0_0;\n }\n {\n bool r_3_2_2_0_1 = false;\n r_3_2_2_0[1] = r_3_2_2_0_1;\n }\n {\n bool r_3_2_2_0_2 = true;\n r_3_2_2_0[2] = r_3_2_2_0_2;\n }\n r_3_2_2.s_0 = r_3_2_2_0;\n }\n {\n S_5a6fdea5 memory r_3_2_2_1;\n {\n bytes21[4] memory r_3_2_2_1_0;\n {\n bytes21 r_3_2_2_1_0_0 = bytes21(0x6d0311f25c6be2472f052e9ba98867f7fe88388ead);\n r_3_2_2_1_0[0] = r_3_2_2_1_0_0;\n }\n {\n bytes21 r_3_2_2_1_0_1 = bytes21(0xba534bc76a2dec4e8d99bedf58256d7fb033ddb0f0);\n r_3_2_2_1_0[1] = r_3_2_2_1_0_1;\n }\n {\n bytes21 r_3_2_2_1_0_2 = bytes21(0xf6245a7bfddb0b8d3d1fe871296ee621bfd00285df);\n r_3_2_2_1_0[2] = r_3_2_2_1_0_2;\n }\n {\n bytes21 r_3_2_2_1_0_3 = bytes21(0xebf3bc8364e72165f2bf3b6eba8166e1a58ce48d4b);\n r_3_2_2_1_0[3] = r_3_2_2_1_0_3;\n }\n r_3_2_2_1.s_0 = r_3_2_2_1_0;\n }\n {\n bytes24 r_3_2_2_1_1 = bytes24(0xdd2cbe26c72e448b7e6ef11f8dbd3421070567f1be401460);\n r_3_2_2_1.s_1 = r_3_2_2_1_1;\n }\n {\n int16 r_3_2_2_1_2 = -4397;\n r_3_2_2_1.s_2 = r_3_2_2_1_2;\n }\n {\n uint r_3_2_2_1_3 = 108685860433130461855587303095532121226214581672484191372945582326527518796580;\n r_3_2_2_1.s_3 = r_3_2_2_1_3;\n }\n r_3_2_2.s_1 = r_3_2_2_1;\n }\n {\n address r_3_2_2_2 = 0x1E91D2Ca63c2d3cC76B65057cbe40579AD743326;\n r_3_2_2.s_2 = r_3_2_2_2;\n }\n {\n string memory r_3_2_2_3 = unicode\"Moo é🚀oM🚀 éo MooMéMM🚀 éééMoo🚀🚀éMM🚀🚀🚀M\";\n r_3_2_2.s_3 = r_3_2_2_3;\n }\n r_3_2[2] = r_3_2_2;\n }\n r_3.s_2 = r_3_2;\n }\n {\n bytes16[] memory r_3_3 = new bytes16[](1);\n {\n bytes16 r_3_3_0 = bytes16(0x45d2eca383a886627c5efef44aaca5c3);\n r_3_3[0] = r_3_3_0;\n }\n r_3.s_3 = r_3_3;\n }\n {\n string memory r_3_4 = unicode\"Moo é🚀M🚀é 🚀 Mo éoo o🚀🚀éMoo 🚀éoMé oM M oé o o\";\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a806ff09f9a806f6f6f4d20f09f9a8020c3a94df09f9a804d6f6f4df09f9a80c3a94d6ff09f9a8020c3a94df09f9a80c3a9204df09f9a80c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000004d83c1c5e96481fa0332ca77b9f1994007412d0800000000000000000000000000000000000000000000000000000000004052d4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3b906000000000000000000000000000000000000000000000000000000000068582a0000000000000000000000000000000000000000000000000000000000307d770000000000000000000000000000000000000000000000000000000000706a8500000000000000000000000000000000000000000000000000000000005cd54d00000000000000000000000000000000000000000000000000000000002389e5000000000000000000000000000000000000000000000000000000000010d32600000000000000000000000000000000000000000000000000000000003fca5a00000000000000000000000000000000000000000000000000000000002e2b75000000000000000000000000000000000000000000000000000000000065a9270000000000000000000000000000000000000000000000000000000000721fe45845540f19460064a283b531f616b3dffc8dd7b16a1281f856366416f8f4bf0098b4db61a41f05a65f5d1e37bbb7bae34fd82f90afb9a0b0f60d2fd20f90af113ddd340db1817d09df81fb14b7d76a323b348696514fa602a5c6ef7df89896a3e474f2c1091278791c49b839aae83f0ce3b2f457f8d9837cd1b847e0874ad4606c6ed07000000000000000000000000000000000000000000000000000000000b3f88148000000000000000000000000000000000000000000000000000000008229669eb1022c47dcca982521345b699feb27db62017b531b4ba49442f5d65a000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a804d20206ff09f9a804d2020c3a9c3a94d6f4d206f4d4d4d6fc3a9c3a9206ff09f9a806f6f6ff09f9a80f09f9a8020206f4d200000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000005f7b69c401a6da723d0a74c013b508fb873fe97f000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000007c0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a8020c3a920204d6f4d6f20c3a96f6f6f4df09f9a8020c3a9c3a94d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001402eb2ed8b228e45fdf48b0c0f5738f4770db3f8c94c000000000000000000000013127aff85bbb8ff5b3f721bd42d3a84574847f2a600000000000000000000002aa61f8736a7f12ca09018e5a66c31765fa11241270000000000000000000000ff8044d2d4598f7142c584fcb5f3458933f28d70020000000000000000000000b14cfe383701294e2c274ae3b57f4ab5389f6c5ea18e2c4d0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa7b3016fa49cfe5a3393aba101651bbc278922d838ebdaf785935a58a8e8971c28b2000000000000000000000000986f35cf4dc8ce5b4fce71740b5cbe15d5ef333300000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80c3a920f09f9a806f206f206fc3a96fc3a96f20f09f9a80f09f9a8020c3a9f09f9a806ff09f9a80f09f9a80c3a9206ff09f9a80c3a94df09f9a806ff09f9a80c3a9c3a96f4d6ff09f9a8020c3a96f6fc3a96f6f4d00000000000000000000000000000000000000000000000000000000000000000140ddad84471c463fd59659586d556a982cbc6d7b61190000000000000000000000e3475c870e964e17f4d9e417ff3858944bb8c9df1b0000000000000000000000815edfbdffd3407a5236be6bce4aa3fad2aecbfc470000000000000000000000786015477d5cc93205db219b092bd25297ecdc3f540000000000000000000000b0662c6397b100dcf05b6009b57157e8dd0e6aeacbbcf27d00000000000000000000000000000000000000000000000000000000000000000000000000001fe36a44523a4af6fda0b19d45a68d4acea3f7267b53465cdebb15a7a6ef1d2521d4000000000000000000000000aca67a929ec0a91ad0f312e22483b2a28761ec170000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80206f4d6f6fc3a9f09f9a80c3a94d6f6f6ff09f9a80206f20f09f9a8020204df09f9a80f09f9a80c3a96ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000001406d0311f25c6be2472f052e9ba98867f7fe88388ead0000000000000000000000ba534bc76a2dec4e8d99bedf58256d7fb033ddb0f00000000000000000000000f6245a7bfddb0b8d3d1fe871296ee621bfd00285df0000000000000000000000ebf3bc8364e72165f2bf3b6eba8166e1a58ce48d4b0000000000000000000000dd2cbe26c72e448b7e6ef11f8dbd3421070567f1be4014600000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeed3f04a045c1cfc16d8810f61a01dfa53ffaae20d7e50d9061e36fedd045faf6b240000000000000000000000001e91d2ca63c2d3cc76b65057cbe40579ad74332600000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a806f4df09f9a80202020c3a96f204d6f6f4dc3a94d4df09f9a8020c3a9c3a9c3a94d6f6ff09f9a80f09f9a80c3a94d4df09f9a80f09f9a80f09f9a804d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145d2eca383a886627c5efef44aaca5c30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a804df09f9a80c3a920f09f9a80204d6f20c3a96f6f206ff09f9a80f09f9a80c3a94d6f6f20f09f9a80c3a96f4dc3a9206f4d204d206fc3a9206f20206f0000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((int152,bytes17,uint64[1],bool),((bool,string,((address[3],bytes22),bytes8,(int128,bool,(string,string,string),address,string)),address,bytes7),string,int40[2])[4][1][4],bool,address)", + "type": "((int152,bytes17,uint64[1],bool),((bool,string,((address[3],bytes22),bytes8,(int128,bool,(string,string,string),address,string)),address,bytes7),string,int40[2])[4][1][4],bool,address)", + "value": [ + [ + "2557053897289181536776227039130753366531499764", + "0x64e16d767c709174fdb3b814b795d2e683", + ["2263345982287538497"], + true + ], + [ + [ + [ + [ + [ + true, + "Moo é🚀🚀🚀oo o🚀🚀 oéo🚀 oéMMoMooéoM🚀🚀oMM🚀🚀🚀🚀o ", + [ + [ + [ + "0x77b2C3b055786ff7A936686c125e84CdB3a3c876", + "0x0d6B791045bdFb317a3B5946B4756B097EC3986b", + "0xc12F0c8d22b046D909C69bC89f21C531c5746163" + ], + "0x608e571f1d7724d085dae45ac249071d05747dba741d" + ], + "0x5cb7199b7b95e3e9", + [ + "-50107174431156178692800459312299352861", + true, + [ + "Moo é🚀oo🚀 oM🚀Mo🚀 Moo🚀M🚀é o🚀MéMéooéM🚀MMoM 🚀o M🚀 🚀 o MM🚀🚀 oé", + "Moo é🚀o🚀éoMo éé🚀oooé🚀Mo🚀 é🚀MMMMéoM🚀oo🚀oo 🚀Moé ooo 🚀🚀🚀", + "Moo é🚀🚀M🚀o🚀oMé🚀 oooM MM🚀o ooo" + ], + "0x87B4709AFAe80773735280825B347d9971eCB691", + "Moo é🚀🚀o" + ] + ], + "0xF7fF3Be34346B75ffFFE0d5Dc0225aFdB212Dd25", + "0x368a7df30c3967" + ], + "Moo é🚀🚀oMoo 🚀 oo", + ["-266286681710", "525885121095"] + ], + [ + [ + false, + "Moo é🚀o éoéééooMM🚀M 🚀oM ", + [ + [ + [ + "0x13eC2E2dE547f48AD354ee4AEd82c2b8c3E5E556", + "0x3D0906dbA7D38713b1184eA920bf0d2bAaCc07f2", + "0x4746B3d6DE6140DC59dD9E9704B91f86858aE500" + ], + "0x73246ca93dd5735fbacb9107c823b7f8eb104af8f806" + ], + "0x5d3c845b5aa34420", + [ + "163701809972189021710462008086298077530", + false, + [ + "Moo é🚀 o🚀é🚀oM", + "Moo é🚀 éo oM", + "Moo é🚀 M 🚀éééoMMooo🚀Mé 🚀MM é o🚀o🚀 éMoé" + ], + "0x6Fc60D8c853d725e0906bDaB3E09Fe71d9ef467b", + "Moo é🚀🚀o o🚀Mo oMé🚀é🚀é🚀oMo🚀o oéo o🚀ooMooé Moé🚀o " + ] + ], + "0x738Eb7EB4664B050A29298068da94C056718FF1A", + "0x749fb2c41b7b88" + ], + "Moo é🚀", + ["-294063635696", "-457809642668"] + ], + [ + [ + true, + "Moo é🚀oééo Mo éMéé 🚀éM oM", + [ + [ + [ + "0xC3DdC93DF8929dC89eA3286542C6cEDE3cBfc0C4", + "0x718dd49145B4ae405AF2cB6E56c091C4c10a802B", + "0x7E03FB9e50c1e7219d7077F1D0ED28D54FfC832e" + ], + "0xe25599e0ec186c4f00d74a6c396bfbbab24c6082b168" + ], + "0xb6c22be93fc4e473", + [ + "-102733595900354371215138505875632835742", + false, + [ + "Moo é🚀oééoMooéoéoooo🚀o 🚀éooéo o🚀M🚀o 🚀M Méooo", + "Moo é🚀🚀o🚀oMoééo éééooM🚀🚀ooo", + "Moo é🚀🚀o oo 🚀🚀M oooMMMM🚀o 🚀Mo🚀o🚀M🚀ooo éMoo🚀🚀 ooM🚀o🚀éé éé🚀 oMM" + ], + "0xe93Bd7EA3eD7907837CD88f19d851CE440438b4B", + "Moo é🚀oééM🚀o🚀oooooééoM🚀é🚀éMM🚀🚀o🚀🚀éo🚀 o🚀o🚀 oo 🚀oo🚀oMéé éM" + ] + ], + "0xDc1Df1fE26e618D818543eeAEB4E43AD32cD6665", + "0x5325fa2502fdd1" + ], + "Moo é🚀oéooo oéMM🚀é ooé 🚀🚀M ooooMM M🚀éo🚀 M 🚀🚀é MMoé oo🚀oo o🚀Mo", + ["478765699500", "-495211968069"] + ], + [ + [ + true, + "Moo é🚀", + [ + [ + [ + "0x4f099c8f6d99818636f5AD1eea5C9B133ef99048", + "0x9E9544EF65849969c0cc0cEB86233a7e09468970", + "0xe13c2A64ee60dC0f94b985fb7BC91b158EE00559" + ], + "0xd2946b3810589dd01ef0d704dd434f8183d67cd8de0b" + ], + "0x290c94382d81ad3c", + [ + "161748600966332684423685375546815565583", + false, + [ + "Moo é🚀", + "Moo é🚀 éMoooo M🚀éMoéM🚀é é🚀Mooooéé🚀éo éoooééoMéMo oMM o🚀 ooM", + "Moo é🚀 🚀éooo o🚀" + ], + "0x90127D0D0261C4B20E2Cc2085db10024101b3104", + "Moo é🚀ooé o" + ] + ], + "0xff958C5E3973110d2EC056910087A5654ae881AB", + "0x0ef43618428a14" + ], + "Moo é🚀o", + ["-242978510265", "-173359248627"] + ] + ] + ], + [ + [ + [ + [ + false, + "Moo é🚀M Mo🚀🚀MM🚀M🚀🚀 éo🚀Méoéo🚀é 🚀ooM oooMoM oooo éooM 🚀 ", + [ + [ + [ + "0x5D636E181B8417a58326e34d561E4070FbD8E178", + "0x3baa6BB0f96eF7ff900f931D00251758415f600E", + "0xbf750a076E3C9035F4cFC383D8083dCA34248c6f" + ], + "0x80aedb9fd3b8201fc59d17301d578348184d1bfcc3a6" + ], + "0xf53f134197ff0ba6", + [ + "-47063988488179439809328724451385541069", + true, + [ + "Moo é🚀M Méo 🚀 éMooo🚀é🚀M🚀oo🚀🚀éoo é🚀MoooM🚀MoooM🚀éoo éo éMMé oé", + "Moo é🚀Moo ooMo 🚀🚀 o 🚀ooo🚀🚀oMMo🚀 oo", + "Moo é🚀o M🚀🚀é oéoo🚀oo🚀 o Mé o🚀MM M🚀éMéoo ooMéo🚀oMM🚀 é MéMéMé " + ], + "0x25A029586837483b82dcC5dbe3630849BD6c78BA", + "Moo é🚀éMooMoo🚀🚀M🚀é🚀o🚀ooM o 🚀Méé é 🚀" + ] + ], + "0xA19B175B3399848d4473c4bbE5996aF5C0e165d9", + "0x578d256e7d3df9" + ], + "Moo é🚀ééo🚀ééo", + ["-499993156525", "-247386515738"] + ], + [ + [ + true, + "Moo é🚀oéooé🚀M", + [ + [ + [ + "0xa4802F649bC5834De9DfeAcC9766d4ff9207e408", + "0x160909344d5C144B7F502d868C24A41f96e0fD53", + "0x8BefD74625fbeB828f03F583fB8004Cf836985C1" + ], + "0x95841e588dafb0c7c847aeed0a0ad6710eff930f55ee" + ], + "0x5a4c00cd7a9721ca", + [ + "63624728085155674815414656595645876392", + true, + [ + "Moo é🚀 🚀o🚀 M🚀🚀é M é🚀éMM o ééM", + "Moo é🚀éoM 🚀🚀oMMMoooMM🚀ééMM oo ooo é🚀éoMMoé", + "Moo é🚀MééoM o🚀oM🚀oooM 🚀M Mo Méo ooéé🚀ooM" + ], + "0xebd39a65B78c03b3D2ADD73F4E8D2273c1DB7106", + "Moo é🚀o🚀o é oM🚀Moéé M 🚀🚀o éooéM🚀🚀M o🚀MoMoéoéoo🚀" + ] + ], + "0xa4c2D29CD36d5B885bb649dCeC0a663CB1de37b0", + "0xd040e3305117e6" + ], + "Moo é🚀ooééoM o🚀M Mooé🚀", + ["34804187488", "-515844725223"] + ], + [ + [ + false, + "Moo é🚀M🚀M éo Mé oéMéé🚀 é", + [ + [ + [ + "0x4D814fB71Bcf5AAD58B2205cAEcf2B8fce94446a", + "0xc5b216cD7c4D9aA71696626656af3C3997543b94", + "0xb4c8197664D834A78fa598544E57bAf061024A8F" + ], + "0xda6b9c3f7d2fdd2a79dd85e5ab48059e8971ed48e298" + ], + "0x96068b8ecef5bc60", + [ + "-50414449485213460151355499249196331985", + true, + [ + "Moo é🚀", + "Moo é🚀o🚀🚀oooooo🚀éooMMéoo🚀 🚀🚀o🚀é 🚀éoooM ooM M MM🚀oéé Mo🚀oo", + "Moo é🚀M🚀oé🚀M🚀🚀é" + ], + "0xB0A6522B4eD9821a887f885e76c4087FA266787E", + "Moo é🚀oMo🚀 Méé🚀oo🚀🚀o🚀o🚀Mo🚀 🚀éé" + ] + ], + "0xDbfCF080a14358ECDd3DD8d30C698AA16e0845FE", + "0x982f0841cc90a1" + ], + "Moo é🚀oo Mé🚀🚀 M M", + ["-213545541656", "296114960907"] + ], + [ + [ + false, + "Moo é🚀é🚀éoMo éM 🚀🚀🚀éMoMooMéoo🚀🚀Mo ", + [ + [ + [ + "0x6167eC3F676b54F2842c038Ed55C8fAfa2DF4196", + "0xede5094843deB0795E98c13c57c1B1d26E3b30bb", + "0x368e4cc37E84485479462E3eB131F47F20733104" + ], + "0x8eece1fc5d97366349413a277eda09d017d76df51293" + ], + "0x7641870d67c9cd29", + [ + "141817897536058375490243465516155199593", + true, + [ + "Moo é🚀🚀oéoMooo", + "Moo é🚀ooé🚀ooéo🚀oMM", + "Moo é🚀MMoMMo 🚀🚀oéooééMMoo MM" + ], + "0xcc448419B619D7Cc59d447F8C0B0fC5A3cC100F4", + "Moo é🚀" + ] + ], + "0x1763d060B32aAfA02a6F6cA499038a0e928477b8", + "0x41fdae2306fba3" + ], + "Moo é🚀MMo 🚀oMMéoMoM🚀MooMéo🚀M🚀Mo o", + ["-257060915571", "53125257302"] + ] + ] + ], + [ + [ + [ + [ + false, + "Moo é🚀🚀🚀ooMM🚀MééMoM", + [ + [ + [ + "0x71D355DE0dd118fF156dF8517E39E2ABbabA438f", + "0xaF35671f099B913fDd8AE97CF60b827c179BDA34", + "0xBc2472868D038A4b170BA6D333cE75c8025c376D" + ], + "0x91c7bf133651fdee8746dbcc8859d376ce10083b9b4d" + ], + "0x5eb60976e4fee44b", + [ + "146040914452404139636133140323314417802", + true, + [ + "Moo é🚀oMoé Méoéoé o oéo 🚀 o MéMoooMMM MMMoo🚀éM oo o o", + "Moo é🚀🚀é🚀MMMoooo🚀🚀M 🚀oooéMo", + "Moo é🚀 o🚀 éoéM🚀o MéoMoéoM 🚀 éMoMéé🚀éMMooooMéMéoMMo o" + ], + "0x7d84272a441212743f7FBA0a6083e125F48d5Edc", + "Moo é🚀oooMM🚀oMo oé🚀oé🚀é🚀M" + ] + ], + "0x7581B289936f63c693753b2eB8D2322d55401FEE", + "0xf76707081f9811" + ], + "Moo é🚀Mooooo🚀 oo🚀", + ["-418950882776", "524829848999"] + ], + [ + [ + false, + "Moo é🚀🚀ooo oMéé é", + [ + [ + [ + "0xef39293a07717FCEE87E558F66a69f22a90E716b", + "0xd3238bc068d5469Faae53fe61e3D28809CAA273b", + "0x1D670fE466711115EFa20cb297D5c0421D859389" + ], + "0x958cb3ac8dc7bce8effc6ad24659ff19b9674d94e766" + ], + "0x8b04ef97822e828b", + [ + "-854946371447721398857650813844016249", + true, + [ + "Moo é🚀o🚀o🚀oéoooM🚀éooé🚀🚀 🚀oo oo 🚀🚀🚀oooooéo oMoM", + "Moo é🚀é🚀Mo🚀o Méoo🚀🚀oo 🚀oéo🚀ooMo", + "Moo é🚀🚀🚀 oM oM Moé 🚀oéoé🚀Mo🚀🚀🚀 MooéooMo🚀🚀ooooo " + ], + "0xee59E04DA840532e07D3059d3858fA7955B91204", + "Moo é🚀éoMo🚀é🚀oé" + ] + ], + "0xd44dF1CF962948F082fe43Ed2b01f49dCf99f3d0", + "0x1fa12715f29770" + ], + "Moo é🚀🚀 é🚀o🚀ééooo🚀éooMooéo M oé🚀o🚀ooMMéoMMé🚀 ", + ["-315319918186", "-268249708440"] + ], + [ + [ + false, + "Moo é🚀oééoMMMéoéoMo🚀 oo🚀o", + [ + [ + [ + "0x59D6F42DB099CE0D55a6B7C4a983AbdEB6497920", + "0xa802b1028dca6c4dbf1e2c15E8979d874BEB86b9", + "0xdb0BF0FeD7b4f4EBb2841cD9a680525bb6a190cD" + ], + "0x701aeb0598026806cf2e547cbdff02a87709fc37b759" + ], + "0xb64d9f88ff5e1100", + [ + "2448348339561654361231214220456131733", + true, + [ + "Moo é🚀", + "Moo é🚀o🚀éMéM M ééo🚀M oooo🚀🚀ooo o🚀o", + "Moo é🚀 o🚀éM🚀 🚀 oM🚀M🚀éMéM🚀o🚀ooo MMo é Mooéoéé" + ], + "0x0F968351013E54160E680D2312eee75B42509FcA", + "Moo é🚀MéM M ooé" + ] + ], + "0x8E93fe3045Ce3429Ff3eF8592616FC2C252CcFa0", + "0x5e64ddf75b0de8" + ], + "Moo é🚀ééooo oééoMMéoo 🚀ooM🚀M", + ["8230283030", "-208070293378"] + ], + [ + [ + false, + "Moo é🚀M ooo oMMéo 🚀🚀", + [ + [ + [ + "0xe8be8845Fb6017ceDb280dD3f6aF7d03b747D95e", + "0x4E5f05c11e461D34bA1AD53433A2F238a29f9Afc", + "0x716F35acAb14eC52DaA0Dd6b036A74C2851c2569" + ], + "0x2dcb459c57ae870b8188f72c18bf037001df04c45543" + ], + "0x11c71a1e5adf3682", + [ + "-128872963893010848526820829214143625467", + true, + [ + "Moo é🚀 é éé", + "Moo é🚀🚀Méé🚀🚀o é é éoéoé🚀 🚀MoMooéo🚀ooo o🚀 Mo🚀oéMé🚀 M🚀", + "Moo é🚀M🚀ooé " + ], + "0xf4558561Cae05DF23d50573B375e1b8f2610222F", + "Moo é🚀éooéo🚀 🚀éooMMo🚀oMéo🚀oéooMoooo 🚀oMéoMMM ooo🚀o ooo é o" + ] + ], + "0x02c240A608B92428c196A55861DB5C15cF4989cb", + "0xbbe2d06698156b" + ], + "Moo é🚀M 🚀 oo🚀é🚀éoé éMM", + ["-405381587136", "296350960436"] + ] + ] + ], + [ + [ + [ + [ + false, + "Moo é🚀o", + [ + [ + [ + "0x0271A9f08b096f13F15615Bf3abFBA63A3835228", + "0x57CAA879D4EeC37000334f29dDcFc6EACe9C9054", + "0x70E88A662Cb1688Ad5afe3d51701acE53c89F5b2" + ], + "0xcdaa21752004534fafae55be67ecb8fd35fa4f92272c" + ], + "0xf70538f14abc419f", + [ + "-74770074349806728544199440763260947058", + false, + [ + "Moo é🚀éooM", + "Moo é🚀 🚀🚀 Moo🚀🚀Mé o Mé🚀 oM o o🚀🚀M🚀MoééM o🚀 é🚀oooMM🚀o MM🚀🚀é 🚀🚀", + "Moo é🚀 o é é🚀Mo M" + ], + "0x811D981e7dbe6f80727285343906aa50bE657Ae2", + "Moo é🚀o ooéo MoM🚀 🚀éo oM🚀🚀 éo ooooMoo éMo🚀oo🚀éo🚀🚀oo" + ] + ], + "0x2dD9b0B8Ea3F36f15eAdA31DE8493717073AA5dC", + "0x086cdf87df18c2" + ], + "Moo é🚀o🚀o🚀oM ", + ["13319631627", "-337173007305"] + ], + [ + [ + true, + "Moo é🚀🚀MMéoé Moo M🚀 oMoéoo🚀 oéMéo🚀 Moéooéoooéooooé🚀🚀 o ", + [ + [ + [ + "0xe14CC5dbF416a76d7A606B0C4eF726c01425Dbe1", + "0xD58a1D35359A2860592D29Ba3DFa0b9fbD52F76A", + "0xBc7B421A3c1f8E0283007835e4F809E7423F0816" + ], + "0xdf78fb020870422a9dfd196ef4cdc059e18bc6c6e3c2" + ], + "0x37104cd607a25215", + [ + "103826667361427089928837382649458393018", + false, + [ + "Moo é🚀🚀Mooo🚀MMM Mo 🚀oMooMo🚀MMoéoooM oo🚀MM🚀éM", + "Moo é🚀oé éé🚀ooéoooMooo é🚀ééoM🚀ooéo é🚀🚀é oé🚀🚀é🚀 🚀o🚀o", + "Moo é🚀" + ], + "0x28FF38296fD042aEC5e9672cf44A8a1a17305F18", + "Moo é🚀o🚀é é🚀oéoooMM" + ] + ], + "0x9423a01eFEc6b7aF47fD029575a2D0F992617c7E", + "0x6101e0fe89074f" + ], + "Moo é🚀", + ["437124834717", "-209087154503"] + ], + [ + [ + false, + "Moo é🚀ooo", + [ + [ + [ + "0xB5405956dA2Fa7849f979aFA97ABFd706b942582", + "0xE0470F38eA39eCd0C79B5234EE861caBE4538946", + "0x8365a9E8B96fC7C5e0B65Bf254c8c669aE4FfB49" + ], + "0xf937c889573cb774d0ab3237361b9f3509b6f7d6b7d8" + ], + "0x5cabbbc7466a93ef", + [ + "-140672197555055157231416370861641455899", + true, + [ + "Moo é🚀o", + "Moo é🚀éMMooo 🚀MoéoMMoM éé 🚀oé ", + "Moo é🚀éM🚀MM🚀MoéMMoéMMooéo🚀éééMo éoMo🚀 M M🚀 ooo" + ], + "0x987188ac2B0b4BDe48BF19C9d9CbAa7c0a4B0cc9", + "Moo é🚀" + ] + ], + "0xb41C0c7CE3d4c72427158fe122eaAF1fDA056f75", + "0xf67b8591c9bece" + ], + "Moo é🚀éMéMMMoo🚀🚀é Méé éoMMooMM ", + ["137528695621", "-131315912947"] + ], + [ + [ + false, + "Moo é🚀", + [ + [ + [ + "0x1746211F458690A6A4b71154637876b917cEe918", + "0x31de4CD09EC9715267CC84c6A1C8D7E9FDf8fe20", + "0xd4dDe6bD2e4ac31717510c2Aee22734b007bF148" + ], + "0x54d4138d9f36bab4954ad00b8593bb8345281f7fd842" + ], + "0xb1ebd4df3f415559", + [ + "-4795633902205635648984968202052634112", + true, + [ + "Moo é🚀oooo🚀 o éM ééééoM🚀M oMMé🚀🚀 o🚀oooéMMM oo", + "Moo é🚀o🚀o", + "Moo é🚀" + ], + "0x302B699c9b23359bD795dF80665031799E9848C9", + "Moo é🚀M MMMé🚀oo 🚀o🚀MoM M 🚀" + ] + ], + "0xF5E84cF41CC6e5b38C5759E307f5966089B25e66", + "0xbb72b251fe9700" + ], + "Moo é🚀é🚀 oééMéoooo o🚀oéM 🚀 🚀", + ["-222159116766", "-29436146639"] + ] + ] + ] + ], + true, + "0x5FEa7a766a6f18b075f51b24a578EB3156663f5b" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2557053897289181536776227039130753366531499764" + }, + { + "type": "hexstring", + "value": "0x64e16d767c709174fdb3b814b795d2e683" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2263345982287538497" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀oo o🚀🚀 oéo🚀 oéMMoMooéoM🚀🚀oMM🚀🚀🚀🚀o " + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x77b2C3b055786ff7A936686c125e84CdB3a3c876" + }, + { + "type": "address", + "value": "0x0d6B791045bdFb317a3B5946B4756B097EC3986b" + }, + { + "type": "address", + "value": "0xc12F0c8d22b046D909C69bC89f21C531c5746163" + } + ] + }, + { + "type": "hexstring", + "value": "0x608e571f1d7724d085dae45ac249071d05747dba741d" + } + ] + }, + { + "type": "hexstring", + "value": "0x5cb7199b7b95e3e9" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-50107174431156178692800459312299352861" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀 oM🚀Mo🚀 Moo🚀M🚀é o🚀MéMéooéM🚀MMoM 🚀o M🚀 🚀 o MM🚀🚀 oé" + }, + { + "type": "string", + "value": "Moo é🚀o🚀éoMo éé🚀oooé🚀Mo🚀 é🚀MMMMéoM🚀oo🚀oo 🚀Moé ooo 🚀🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀🚀M🚀o🚀oMé🚀 oooM MM🚀o ooo" + } + ] + }, + { + "type": "address", + "value": "0x87B4709AFAe80773735280825B347d9971eCB691" + }, + { + "type": "string", + "value": "Moo é🚀🚀o" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xF7fF3Be34346B75ffFFE0d5Dc0225aFdB212Dd25" + }, + { + "type": "hexstring", + "value": "0x368a7df30c3967" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀oMoo 🚀 oo" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-266286681710" + }, + { + "type": "number", + "value": "525885121095" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o éoéééooMM🚀M 🚀oM " + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x13eC2E2dE547f48AD354ee4AEd82c2b8c3E5E556" + }, + { + "type": "address", + "value": "0x3D0906dbA7D38713b1184eA920bf0d2bAaCc07f2" + }, + { + "type": "address", + "value": "0x4746B3d6DE6140DC59dD9E9704B91f86858aE500" + } + ] + }, + { + "type": "hexstring", + "value": "0x73246ca93dd5735fbacb9107c823b7f8eb104af8f806" + } + ] + }, + { + "type": "hexstring", + "value": "0x5d3c845b5aa34420" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "163701809972189021710462008086298077530" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o🚀é🚀oM" + }, + { + "type": "string", + "value": "Moo é🚀 éo oM" + }, + { + "type": "string", + "value": "Moo é🚀 M 🚀éééoMMooo🚀Mé 🚀MM é o🚀o🚀 éMoé" + } + ] + }, + { + "type": "address", + "value": "0x6Fc60D8c853d725e0906bDaB3E09Fe71d9ef467b" + }, + { + "type": "string", + "value": "Moo é🚀🚀o o🚀Mo oMé🚀é🚀é🚀oMo🚀o oéo o🚀ooMooé Moé🚀o " + } + ] + } + ] + }, + { + "type": "address", + "value": "0x738Eb7EB4664B050A29298068da94C056718FF1A" + }, + { + "type": "hexstring", + "value": "0x749fb2c41b7b88" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-294063635696" + }, + { + "type": "number", + "value": "-457809642668" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀oééo Mo éMéé 🚀éM oM" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xC3DdC93DF8929dC89eA3286542C6cEDE3cBfc0C4" + }, + { + "type": "address", + "value": "0x718dd49145B4ae405AF2cB6E56c091C4c10a802B" + }, + { + "type": "address", + "value": "0x7E03FB9e50c1e7219d7077F1D0ED28D54FfC832e" + } + ] + }, + { + "type": "hexstring", + "value": "0xe25599e0ec186c4f00d74a6c396bfbbab24c6082b168" + } + ] + }, + { + "type": "hexstring", + "value": "0xb6c22be93fc4e473" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-102733595900354371215138505875632835742" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oééoMooéoéoooo🚀o 🚀éooéo o🚀M🚀o 🚀M Méooo" + }, + { + "type": "string", + "value": "Moo é🚀🚀o🚀oMoééo éééooM🚀🚀ooo" + }, + { + "type": "string", + "value": "Moo é🚀🚀o oo 🚀🚀M oooMMMM🚀o 🚀Mo🚀o🚀M🚀ooo éMoo🚀🚀 ooM🚀o🚀éé éé🚀 oMM" + } + ] + }, + { + "type": "address", + "value": "0xe93Bd7EA3eD7907837CD88f19d851CE440438b4B" + }, + { + "type": "string", + "value": "Moo é🚀oééM🚀o🚀oooooééoM🚀é🚀éMM🚀🚀o🚀🚀éo🚀 o🚀o🚀 oo 🚀oo🚀oMéé éM" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xDc1Df1fE26e618D818543eeAEB4E43AD32cD6665" + }, + { + "type": "hexstring", + "value": "0x5325fa2502fdd1" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oéooo oéMM🚀é ooé 🚀🚀M ooooMM M🚀éo🚀 M 🚀🚀é MMoé oo🚀oo o🚀Mo" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "478765699500" + }, + { + "type": "number", + "value": "-495211968069" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4f099c8f6d99818636f5AD1eea5C9B133ef99048" + }, + { + "type": "address", + "value": "0x9E9544EF65849969c0cc0cEB86233a7e09468970" + }, + { + "type": "address", + "value": "0xe13c2A64ee60dC0f94b985fb7BC91b158EE00559" + } + ] + }, + { + "type": "hexstring", + "value": "0xd2946b3810589dd01ef0d704dd434f8183d67cd8de0b" + } + ] + }, + { + "type": "hexstring", + "value": "0x290c94382d81ad3c" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "161748600966332684423685375546815565583" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀 éMoooo M🚀éMoéM🚀é é🚀Mooooéé🚀éo éoooééoMéMo oMM o🚀 ooM" + }, + { + "type": "string", + "value": "Moo é🚀 🚀éooo o🚀" + } + ] + }, + { + "type": "address", + "value": "0x90127D0D0261C4B20E2Cc2085db10024101b3104" + }, + { + "type": "string", + "value": "Moo é🚀ooé o" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xff958C5E3973110d2EC056910087A5654ae881AB" + }, + { + "type": "hexstring", + "value": "0x0ef43618428a14" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-242978510265" + }, + { + "type": "number", + "value": "-173359248627" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M Mo🚀🚀MM🚀M🚀🚀 éo🚀Méoéo🚀é 🚀ooM oooMoM oooo éooM 🚀 " + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x5D636E181B8417a58326e34d561E4070FbD8E178" + }, + { + "type": "address", + "value": "0x3baa6BB0f96eF7ff900f931D00251758415f600E" + }, + { + "type": "address", + "value": "0xbf750a076E3C9035F4cFC383D8083dCA34248c6f" + } + ] + }, + { + "type": "hexstring", + "value": "0x80aedb9fd3b8201fc59d17301d578348184d1bfcc3a6" + } + ] + }, + { + "type": "hexstring", + "value": "0xf53f134197ff0ba6" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-47063988488179439809328724451385541069" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M Méo 🚀 éMooo🚀é🚀M🚀oo🚀🚀éoo é🚀MoooM🚀MoooM🚀éoo éo éMMé oé" + }, + { + "type": "string", + "value": "Moo é🚀Moo ooMo 🚀🚀 o 🚀ooo🚀🚀oMMo🚀 oo" + }, + { + "type": "string", + "value": "Moo é🚀o M🚀🚀é oéoo🚀oo🚀 o Mé o🚀MM M🚀éMéoo ooMéo🚀oMM🚀 é MéMéMé " + } + ] + }, + { + "type": "address", + "value": "0x25A029586837483b82dcC5dbe3630849BD6c78BA" + }, + { + "type": "string", + "value": "Moo é🚀éMooMoo🚀🚀M🚀é🚀o🚀ooM o 🚀Méé é 🚀" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xA19B175B3399848d4473c4bbE5996aF5C0e165d9" + }, + { + "type": "hexstring", + "value": "0x578d256e7d3df9" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ééo🚀ééo" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-499993156525" + }, + { + "type": "number", + "value": "-247386515738" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀oéooé🚀M" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xa4802F649bC5834De9DfeAcC9766d4ff9207e408" + }, + { + "type": "address", + "value": "0x160909344d5C144B7F502d868C24A41f96e0fD53" + }, + { + "type": "address", + "value": "0x8BefD74625fbeB828f03F583fB8004Cf836985C1" + } + ] + }, + { + "type": "hexstring", + "value": "0x95841e588dafb0c7c847aeed0a0ad6710eff930f55ee" + } + ] + }, + { + "type": "hexstring", + "value": "0x5a4c00cd7a9721ca" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "63624728085155674815414656595645876392" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀o🚀 M🚀🚀é M é🚀éMM o ééM" + }, + { + "type": "string", + "value": "Moo é🚀éoM 🚀🚀oMMMoooMM🚀ééMM oo ooo é🚀éoMMoé" + }, + { + "type": "string", + "value": "Moo é🚀MééoM o🚀oM🚀oooM 🚀M Mo Méo ooéé🚀ooM" + } + ] + }, + { + "type": "address", + "value": "0xebd39a65B78c03b3D2ADD73F4E8D2273c1DB7106" + }, + { + "type": "string", + "value": "Moo é🚀o🚀o é oM🚀Moéé M 🚀🚀o éooéM🚀🚀M o🚀MoMoéoéoo🚀" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xa4c2D29CD36d5B885bb649dCeC0a663CB1de37b0" + }, + { + "type": "hexstring", + "value": "0xd040e3305117e6" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooééoM o🚀M Mooé🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "34804187488" + }, + { + "type": "number", + "value": "-515844725223" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M🚀M éo Mé oéMéé🚀 é" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4D814fB71Bcf5AAD58B2205cAEcf2B8fce94446a" + }, + { + "type": "address", + "value": "0xc5b216cD7c4D9aA71696626656af3C3997543b94" + }, + { + "type": "address", + "value": "0xb4c8197664D834A78fa598544E57bAf061024A8F" + } + ] + }, + { + "type": "hexstring", + "value": "0xda6b9c3f7d2fdd2a79dd85e5ab48059e8971ed48e298" + } + ] + }, + { + "type": "hexstring", + "value": "0x96068b8ecef5bc60" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-50414449485213460151355499249196331985" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀🚀oooooo🚀éooMMéoo🚀 🚀🚀o🚀é 🚀éoooM ooM M MM🚀oéé Mo🚀oo" + }, + { + "type": "string", + "value": "Moo é🚀M🚀oé🚀M🚀🚀é" + } + ] + }, + { + "type": "address", + "value": "0xB0A6522B4eD9821a887f885e76c4087FA266787E" + }, + { + "type": "string", + "value": "Moo é🚀oMo🚀 Méé🚀oo🚀🚀o🚀o🚀Mo🚀 🚀éé" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xDbfCF080a14358ECDd3DD8d30C698AA16e0845FE" + }, + { + "type": "hexstring", + "value": "0x982f0841cc90a1" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oo Mé🚀🚀 M M" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-213545541656" + }, + { + "type": "number", + "value": "296114960907" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀é🚀éoMo éM 🚀🚀🚀éMoMooMéoo🚀🚀Mo " + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6167eC3F676b54F2842c038Ed55C8fAfa2DF4196" + }, + { + "type": "address", + "value": "0xede5094843deB0795E98c13c57c1B1d26E3b30bb" + }, + { + "type": "address", + "value": "0x368e4cc37E84485479462E3eB131F47F20733104" + } + ] + }, + { + "type": "hexstring", + "value": "0x8eece1fc5d97366349413a277eda09d017d76df51293" + } + ] + }, + { + "type": "hexstring", + "value": "0x7641870d67c9cd29" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "141817897536058375490243465516155199593" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oéoMooo" + }, + { + "type": "string", + "value": "Moo é🚀ooé🚀ooéo🚀oMM" + }, + { + "type": "string", + "value": "Moo é🚀MMoMMo 🚀🚀oéooééMMoo MM" + } + ] + }, + { + "type": "address", + "value": "0xcc448419B619D7Cc59d447F8C0B0fC5A3cC100F4" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x1763d060B32aAfA02a6F6cA499038a0e928477b8" + }, + { + "type": "hexstring", + "value": "0x41fdae2306fba3" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MMo 🚀oMMéoMoM🚀MooMéo🚀M🚀Mo o" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-257060915571" + }, + { + "type": "number", + "value": "53125257302" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀ooMM🚀MééMoM" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x71D355DE0dd118fF156dF8517E39E2ABbabA438f" + }, + { + "type": "address", + "value": "0xaF35671f099B913fDd8AE97CF60b827c179BDA34" + }, + { + "type": "address", + "value": "0xBc2472868D038A4b170BA6D333cE75c8025c376D" + } + ] + }, + { + "type": "hexstring", + "value": "0x91c7bf133651fdee8746dbcc8859d376ce10083b9b4d" + } + ] + }, + { + "type": "hexstring", + "value": "0x5eb60976e4fee44b" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "146040914452404139636133140323314417802" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oMoé Méoéoé o oéo 🚀 o MéMoooMMM MMMoo🚀éM oo o o" + }, + { + "type": "string", + "value": "Moo é🚀🚀é🚀MMMoooo🚀🚀M 🚀oooéMo" + }, + { + "type": "string", + "value": "Moo é🚀 o🚀 éoéM🚀o MéoMoéoM 🚀 éMoMéé🚀éMMooooMéMéoMMo o" + } + ] + }, + { + "type": "address", + "value": "0x7d84272a441212743f7FBA0a6083e125F48d5Edc" + }, + { + "type": "string", + "value": "Moo é🚀oooMM🚀oMo oé🚀oé🚀é🚀M" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x7581B289936f63c693753b2eB8D2322d55401FEE" + }, + { + "type": "hexstring", + "value": "0xf76707081f9811" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mooooo🚀 oo🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-418950882776" + }, + { + "type": "number", + "value": "524829848999" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀ooo oMéé é" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xef39293a07717FCEE87E558F66a69f22a90E716b" + }, + { + "type": "address", + "value": "0xd3238bc068d5469Faae53fe61e3D28809CAA273b" + }, + { + "type": "address", + "value": "0x1D670fE466711115EFa20cb297D5c0421D859389" + } + ] + }, + { + "type": "hexstring", + "value": "0x958cb3ac8dc7bce8effc6ad24659ff19b9674d94e766" + } + ] + }, + { + "type": "hexstring", + "value": "0x8b04ef97822e828b" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-854946371447721398857650813844016249" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o🚀o🚀oéoooM🚀éooé🚀🚀 🚀oo oo 🚀🚀🚀oooooéo oMoM" + }, + { + "type": "string", + "value": "Moo é🚀é🚀Mo🚀o Méoo🚀🚀oo 🚀oéo🚀ooMo" + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀 oM oM Moé 🚀oéoé🚀Mo🚀🚀🚀 MooéooMo🚀🚀ooooo " + } + ] + }, + { + "type": "address", + "value": "0xee59E04DA840532e07D3059d3858fA7955B91204" + }, + { + "type": "string", + "value": "Moo é🚀éoMo🚀é🚀oé" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xd44dF1CF962948F082fe43Ed2b01f49dCf99f3d0" + }, + { + "type": "hexstring", + "value": "0x1fa12715f29770" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 é🚀o🚀ééooo🚀éooMooéo M oé🚀o🚀ooMMéoMMé🚀 " + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-315319918186" + }, + { + "type": "number", + "value": "-268249708440" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oééoMMMéoéoMo🚀 oo🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x59D6F42DB099CE0D55a6B7C4a983AbdEB6497920" + }, + { + "type": "address", + "value": "0xa802b1028dca6c4dbf1e2c15E8979d874BEB86b9" + }, + { + "type": "address", + "value": "0xdb0BF0FeD7b4f4EBb2841cD9a680525bb6a190cD" + } + ] + }, + { + "type": "hexstring", + "value": "0x701aeb0598026806cf2e547cbdff02a87709fc37b759" + } + ] + }, + { + "type": "hexstring", + "value": "0xb64d9f88ff5e1100" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2448348339561654361231214220456131733" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀o🚀éMéM M ééo🚀M oooo🚀🚀ooo o🚀o" + }, + { + "type": "string", + "value": "Moo é🚀 o🚀éM🚀 🚀 oM🚀M🚀éMéM🚀o🚀ooo MMo é Mooéoéé" + } + ] + }, + { + "type": "address", + "value": "0x0F968351013E54160E680D2312eee75B42509FcA" + }, + { + "type": "string", + "value": "Moo é🚀MéM M ooé" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x8E93fe3045Ce3429Ff3eF8592616FC2C252CcFa0" + }, + { + "type": "hexstring", + "value": "0x5e64ddf75b0de8" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ééooo oééoMMéoo 🚀ooM🚀M" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "8230283030" + }, + { + "type": "number", + "value": "-208070293378" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M ooo oMMéo 🚀🚀" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe8be8845Fb6017ceDb280dD3f6aF7d03b747D95e" + }, + { + "type": "address", + "value": "0x4E5f05c11e461D34bA1AD53433A2F238a29f9Afc" + }, + { + "type": "address", + "value": "0x716F35acAb14eC52DaA0Dd6b036A74C2851c2569" + } + ] + }, + { + "type": "hexstring", + "value": "0x2dcb459c57ae870b8188f72c18bf037001df04c45543" + } + ] + }, + { + "type": "hexstring", + "value": "0x11c71a1e5adf3682" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-128872963893010848526820829214143625467" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é éé" + }, + { + "type": "string", + "value": "Moo é🚀🚀Méé🚀🚀o é é éoéoé🚀 🚀MoMooéo🚀ooo o🚀 Mo🚀oéMé🚀 M🚀" + }, + { + "type": "string", + "value": "Moo é🚀M🚀ooé " + } + ] + }, + { + "type": "address", + "value": "0xf4558561Cae05DF23d50573B375e1b8f2610222F" + }, + { + "type": "string", + "value": "Moo é🚀éooéo🚀 🚀éooMMo🚀oMéo🚀oéooMoooo 🚀oMéoMMM ooo🚀o ooo é o" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x02c240A608B92428c196A55861DB5C15cF4989cb" + }, + { + "type": "hexstring", + "value": "0xbbe2d06698156b" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M 🚀 oo🚀é🚀éoé éMM" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-405381587136" + }, + { + "type": "number", + "value": "296350960436" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x0271A9f08b096f13F15615Bf3abFBA63A3835228" + }, + { + "type": "address", + "value": "0x57CAA879D4EeC37000334f29dDcFc6EACe9C9054" + }, + { + "type": "address", + "value": "0x70E88A662Cb1688Ad5afe3d51701acE53c89F5b2" + } + ] + }, + { + "type": "hexstring", + "value": "0xcdaa21752004534fafae55be67ecb8fd35fa4f92272c" + } + ] + }, + { + "type": "hexstring", + "value": "0xf70538f14abc419f" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-74770074349806728544199440763260947058" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooM" + }, + { + "type": "string", + "value": "Moo é🚀 🚀🚀 Moo🚀🚀Mé o Mé🚀 oM o o🚀🚀M🚀MoééM o🚀 é🚀oooMM🚀o MM🚀🚀é 🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀 o é é🚀Mo M" + } + ] + }, + { + "type": "address", + "value": "0x811D981e7dbe6f80727285343906aa50bE657Ae2" + }, + { + "type": "string", + "value": "Moo é🚀o ooéo MoM🚀 🚀éo oM🚀🚀 éo ooooMoo éMo🚀oo🚀éo🚀🚀oo" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x2dD9b0B8Ea3F36f15eAdA31DE8493717073AA5dC" + }, + { + "type": "hexstring", + "value": "0x086cdf87df18c2" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀o🚀oM " + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "13319631627" + }, + { + "type": "number", + "value": "-337173007305" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀MMéoé Moo M🚀 oMoéoo🚀 oéMéo🚀 Moéooéoooéooooé🚀🚀 o " + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xe14CC5dbF416a76d7A606B0C4eF726c01425Dbe1" + }, + { + "type": "address", + "value": "0xD58a1D35359A2860592D29Ba3DFa0b9fbD52F76A" + }, + { + "type": "address", + "value": "0xBc7B421A3c1f8E0283007835e4F809E7423F0816" + } + ] + }, + { + "type": "hexstring", + "value": "0xdf78fb020870422a9dfd196ef4cdc059e18bc6c6e3c2" + } + ] + }, + { + "type": "hexstring", + "value": "0x37104cd607a25215" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "103826667361427089928837382649458393018" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀Mooo🚀MMM Mo 🚀oMooMo🚀MMoéoooM oo🚀MM🚀éM" + }, + { + "type": "string", + "value": "Moo é🚀oé éé🚀ooéoooMooo é🚀ééoM🚀ooéo é🚀🚀é oé🚀🚀é🚀 🚀o🚀o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "address", + "value": "0x28FF38296fD042aEC5e9672cf44A8a1a17305F18" + }, + { + "type": "string", + "value": "Moo é🚀o🚀é é🚀oéoooMM" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x9423a01eFEc6b7aF47fD029575a2D0F992617c7E" + }, + { + "type": "hexstring", + "value": "0x6101e0fe89074f" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "437124834717" + }, + { + "type": "number", + "value": "-209087154503" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀ooo" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB5405956dA2Fa7849f979aFA97ABFd706b942582" + }, + { + "type": "address", + "value": "0xE0470F38eA39eCd0C79B5234EE861caBE4538946" + }, + { + "type": "address", + "value": "0x8365a9E8B96fC7C5e0B65Bf254c8c669aE4FfB49" + } + ] + }, + { + "type": "hexstring", + "value": "0xf937c889573cb774d0ab3237361b9f3509b6f7d6b7d8" + } + ] + }, + { + "type": "hexstring", + "value": "0x5cabbbc7466a93ef" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-140672197555055157231416370861641455899" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o" + }, + { + "type": "string", + "value": "Moo é🚀éMMooo 🚀MoéoMMoM éé 🚀oé " + }, + { + "type": "string", + "value": "Moo é🚀éM🚀MM🚀MoéMMoéMMooéo🚀éééMo éoMo🚀 M M🚀 ooo" + } + ] + }, + { + "type": "address", + "value": "0x987188ac2B0b4BDe48BF19C9d9CbAa7c0a4B0cc9" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xb41C0c7CE3d4c72427158fe122eaAF1fDA056f75" + }, + { + "type": "hexstring", + "value": "0xf67b8591c9bece" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éMéMMMoo🚀🚀é Méé éoMMooMM " + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "137528695621" + }, + { + "type": "number", + "value": "-131315912947" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x1746211F458690A6A4b71154637876b917cEe918" + }, + { + "type": "address", + "value": "0x31de4CD09EC9715267CC84c6A1C8D7E9FDf8fe20" + }, + { + "type": "address", + "value": "0xd4dDe6bD2e4ac31717510c2Aee22734b007bF148" + } + ] + }, + { + "type": "hexstring", + "value": "0x54d4138d9f36bab4954ad00b8593bb8345281f7fd842" + } + ] + }, + { + "type": "hexstring", + "value": "0xb1ebd4df3f415559" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-4795633902205635648984968202052634112" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oooo🚀 o éM ééééoM🚀M oMMé🚀🚀 o🚀oooéMMM oo" + }, + { + "type": "string", + "value": "Moo é🚀o🚀o" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "address", + "value": "0x302B699c9b23359bD795dF80665031799E9848C9" + }, + { + "type": "string", + "value": "Moo é🚀M MMMé🚀oo 🚀o🚀MoM M 🚀" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xF5E84cF41CC6e5b38C5759E307f5966089B25e66" + }, + { + "type": "hexstring", + "value": "0xbb72b251fe9700" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é🚀 oééMéoooo o🚀oéM 🚀 🚀" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-222159116766" + }, + { + "type": "number", + "value": "-29436146639" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x5FEa7a766a6f18b075f51b24a578EB3156663f5b" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50613cdf806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190612c51565b60405180910390f35b610056612753565b61005e612753565b610066612787565b7272a98a070c21be46645eb52e8cb3a06d67e6f481527064e16d767c709174fdb3b814b795d2e68360781b602082015261009e6127b3565b671f69052dde0e6941815260408201526001606082015281526100bf6127d1565b6100c76127fe565b6100cf61282b565b6100d7612858565b6100df612884565b600181526040805160808101909152605280825260009190613a23602083013960208301525061010d6128a0565b6101156128c7565b61011d6128d6565b7377b2c3b055786ff7a936686c125e84cdb3a3c8768152730d6b791045bdfb317a3b5946b4756b097ec3986b60208083019190915273c12f0c8d22b046d909c69bc89f21c531c5746163604083015290825275608e571f1d7724d085dae45ac249071d05747dba741d60501b82820152908252675cb7199b7b95e3e960c01b908201526101a86128f4565b6f25b24a6fad612c8697e119946051a31c198152600160208083019190915260408051606080820183528082529281018390529081019190915260006040518060a0016040528060678152602001613092606791398252506040805160a08101909152606280825260009190612ff760208301399050808260200181905250506000604051806060016040528060328152602001613a756032913960408084019190915283810192909252507387b4709afae80773735280825b347d9971ecb69160608084019190915281518083018352600f81526e4d6f6f20c3a9f09f9a80f09f9a806f60881b602080830191909152608080860192909252858401949094528583019490945273f7ff3be34346b75ffffe0d5dc0225afdb212dd259085015266368a7df30c396760c81b928401929092529183528051808201909152601b81527f4d6f6f20c3a9f09f9a80f09f9a806f4d6f6f20f09f9a8020206f6f0000000000818301529082015261031b61294a565b643dffec4e6d198152647a7132224760208201526040820152815261033e612858565b610346612884565b600080825260408051606081019091526026808252612f4e60208301396020830152506103716128a0565b6103796128c7565b6103816128d6565b7313ec2e2de547f48ad354ee4aed82c2b8c3e5e5568152733d0906dba7d38713b1184ea920bf0d2baacc07f2602080830191909152734746b3d6de6140dc59dd9e9704b91f86858ae500604083015290825275399236549eeab9afdd65c883e411dbfc7588257c7c0360511b828201529082526702e9e422dad51a2160c51b9082015261040c6128f4565b6f7b27d2600402a6387aa3f6ec9a9fa95a81526000602080830182905260408051606080820183528082528184018181528284019190915282518084018452601881527f4d6f6f20c3a9f09f9a80206ff09f9a80c3a9f09f9a806f4d00000000000000008186015282528251808401845260118152704d6f6f20c3a9f09f9a8020c3a96f206f4d60781b8186015290528151608081019092526042808352909392613608908301396040808401919091528381019290925250736fc60d8c853d725e0906bdab3e09fe71d9ef467b60608301528051608081019091526052808252600091906133586020830139608080840191909152604080850193909352848301939093525073738eb7eb4664b050a29298068da94c056718ff1a6060840152660e93f658836f7160cb1b918301919091529082528051808201909152600a8152689adede418753e13f3560b71b60208083019190915282015261056f61294a565b6444778efcef198152646a9794c4ab19602080830191909152604083019190915282015261059b612858565b6105a3612884565b600181526040805160608101909152602980825260009190612f2560208301396020830152506105d16128a0565b6105d96128c7565b6105e16128d6565b73c3ddc93df8929dc89ea3286542c6cede3cbfc0c4815273718dd49145b4ae405af2cb6e56c091c4c10a802b602080830191909152737e03fb9e50c1e7219d7077f1d0ed28d54ffc832e6040830152908252751c4ab33c1d830d89e01ae94d872d7f7756498c10562d60531b8282015290825267b6c22be93fc4e47360c01b9082015261066c6128f4565b6f4d49c5575646576a9d6e932c65424c9d198152600060208083018290526040805160608082018352808252818401819052818301528151608081019092526046808352909392612f749083013982525060408051606081019091526030808252600091906132ef602083013990508082602001819052505060006040518060a00160405280606f815260200161369c606f9139604080840191909152838101929092525073e93bd7ea3ed7907837cd88f19d851ce440438b4b6060830152805160a08101909152606e808252600091906138686020830139608080840191909152604080850193909352848301939093525073dc1df1fe26e618d818543eeaeb4e43ad32cd66656060840152665325fa2502fdd160c81b91830191909152908252805160a08101909152606380825260009190613ad560208301396020830152506107b661294a565b646f78a8d1ac815264734ceef6441960208201526040828101919091528201526107de612858565b6107e6612884565b6001815260408051808201909152600a8152689adede418753e13f3560b71b6020808301919091528201526108196128a0565b6108216128c7565b6108296128d6565b734f099c8f6d99818636f5ad1eea5c9b133ef990488152739e9544ef65849969c0cc0ceb86233a7e0946897060208083019190915273e13c2a64ee60dc0f94b985fb7bc91b158ee00559604083015290825275d2946b3810589dd01ef0d704dd434f8183d67cd8de0b60501b82820152908252670a43250e0b606b4f60c21b908201526108b46128f4565b6f79afa5bc6cae5062853572445b6a4f0f81526000602080830182905260408051606080820183528082528184018190528183015281518083018352600a8152689adede418753e13f3560b71b818501528152815160808101909252605c80835290939261350790830139602080840191909152604080518082018252601a81527f4d6f6f20c3a9f09f9a8020f09f9a80c3a96f6f6f206ff09f9a800000000000008184015281850152848101939093527390127d0d0261c4b20e2cc2085db10024101b310460608086019190915283518085018552601081526f4d6f6f20c3a9f09f9a806f6fc3a9206f60801b81840152608080870191909152868501959095528684019590955273ff958c5e3973110d2ec056910087a5654ae881ab94860194909452506603bd0d8610a28560ca1b918401919091529183528151808301909252600b82526a4d6f6f20c3a9f09f9a806f60a81b82820152820152610a1961294a565b643892a5d5b819815264285d0434f21960208201526040820152606082015281528152610a446127fe565b610a4c61282b565b610a54612858565b610a5c612884565b60008082526040805160808101909152605a8082526130f96020830139602083015250610a876128a0565b610a8f6128c7565b610a976128d6565b735d636e181b8417a58326e34d561e4070fbd8e1788152733baa6bb0f96ef7ff900f931d00251758415f600e60208083019190915273bf750a076e3c9035f4cfc383d8083dca34248c6f60408301529082527540576dcfe9dc100fe2ce8b980eabc1a40c268dfe61d360511b82820152908252677a9f89a0cbff85d360c11b90820152610b226128f4565b6f236831c8fe58e9730155c6e92c3601cc198152600160208083019190915260408051606080820183528082529281018390529081019190915260006040518060a0016040528060668152602001612ddd606691398252506040805160608101909152603980825260009190613059602083013990508082602001819052505060006040518060a00160405280606381526020016133aa6063913960408084019190915283810192909252507325a029586837483b82dcc5dbe3630849bd6c78ba60608301528051608081019091526041808252600091906135c76020830139608080840191909152604080850193909352848301939093525073a19b175b3399848d4473c4bbe5996af5c0e165d9606084015266578d256e7d3df960c81b918301919091529082528051808201909152601881527f4d6f6f20c3a9f09f9a80c3a9c3a96ff09f9a80c3a9c3a96f0000000000000000602080830191909152820152610c8c61294a565b647469ea1bac19815264399962a91919602082015260408201528152610cb0612858565b610cb8612884565b600181526040805180820190915260168152754d6f6f20c3a9f09f9a806fc3a96f6fc3a9f09f9a804d60501b602080830191909152820152610cf86128a0565b610d006128c7565b610d086128d6565b73a4802f649bc5834de9dfeacc9766d4ff9207e408815273160909344d5c144b7f502d868c24a41f96e0fd53602080830191909152738befd74625fbeb828f03f583fb8004cf836985c16040830152908252754ac20f2c46d7d863e423d77685056b38877fc987aaf760511b82820152908252672d260066bd4b90e560c11b90820152610d936128f4565b6f2fddad497796e5078b01986f9adac8a88152600160208083019190915260408051606080820183528082529281018390529081019190915260006040518060600160405280603581526020016137326035913982525060408051608081019091526043808252600091906134c4602083013990508082602001819052505060006040518060600160405280603d8152602001612d57603d9139604080840191909152838101929092525073ebd39a65b78c03b3d2add73f4e8d2273c1db710660608301528051608081019091526052808252600091906137676020830139608080840191909152604080850193909352848301939093525073a4c2d29cd36d5b885bb649dcec0a663cb1de37b06060808501919091526668207198288bf360c91b928401929092529183528151908101909152602580825260009190612d326020830139602083015250610ee661294a565b64081a7dc160815264781abdd9e6196020808301919091526040830191909152820152610f11612858565b610f19612884565b60008082526040805160608101909152602a80825261322d6020830139602083015250610f446128a0565b610f4c6128c7565b610f546128d6565b734d814fb71bcf5aad58b2205caecf2b8fce94446a815273c5b216cd7c4d9aa71696626656af3c3997543b9460208083019190915273b4c8197664d834a78fa598544e57baf061024a8f6040830152908252751b4d7387efa5fba54f3bb0bcb56900b3d12e3da91c5360531b828201529082526704b0345c7677ade360c51b90820152610fdf6128f4565b6f25ed78441d2e8a6b247e087382bff3d0198152600160208083019190915260408051606080820183528082528184018190528183015281518083018352600a8152689adede418753e13f3560b71b818501528152815160a08101909252606280835290926000929190613806908301399050808260200181905250506000604051806060016040528060218152602001613bac60219139604080840191909152838101929092525073b0a6522b4ed9821a887f885e76c4087fa266787e6060808401919091528151908101909152603e80825260009190612e996020830139608080840191909152604080850193909352848301939093525073dbfcf080a14358ecdd3dd8d30c698aa16e0845fe606084015266982f0841cc90a160c81b918301919091529082528051808201909152601d81527f4d6f6f20c3a9f09f9a806f6f204dc3a9f09f9a80f09f9a8020204d204d00000060208083019190915282015261114961294a565b6431b84e60171981526444f1d3ba0b6020820152604082810191909152820152611171612858565b611179612884565b60008082526040805160608101909152603d808252612fba60208301396020830152506111a46128a0565b6111ac6128c7565b6111b46128d6565b736167ec3f676b54f2842c038ed55c8fafa2df4196815273ede5094843deb0795e98c13c57c1b1d26e3b30bb60208083019190915273368e4cc37e84485479462e3eb131f47f207331046040830152908252758eece1fc5d97366349413a277eda09d017d76df5129360501b82820152908252677641870d67c9cd2960c01b9082015261123f6128f4565b6f6ab122306deb47ff08c2ed30d144e0698152600160208083019190915260408051606080820183528082528184018181528284018290528351808501855260168152754d6f6f20c3a9f09f9a80f09f9a806fc3a96f4d6f6f6f60501b81870152835283518085018552601e81527f4d6f6f20c3a9f09f9a806f6fc3a9f09f9a806f6fc3a96ff09f9a806f4d4d00008187015290528251908101909252602980835290926000929190612e7090830139604080840191909152838101929092525073cc448419b619d7cc59d447f8c0b0fc5a3cc100f460608084019190915281518083018352600a8152689adede418753e13f3560b71b6020808301919091526080808601929092528584019490945285830194909452731763d060b32aafa02a6f6ca499038a0e928477b8858201526641fdae2306fba360c81b9385019390935292845282519182019092526034808252600092613490908301396020830152506113a961294a565b643bda064972198152640c5e831856602080830191909152604083019190915260608301919091529082528201526113df6127fe565b6113e761282b565b6113ef612858565b6113f7612884565b6000808252604080516060810190915260228082526137b960208301396020830152506114226128a0565b61142a6128c7565b6114326128d6565b7371d355de0dd118ff156df8517e39e2abbaba438f815273af35671f099b913fdd8ae97cf60b827c179bda3460208083019190915273bc2472868d038a4b170ba6d333ce75c8025c376d60408301529082527591c7bf133651fdee8746dbcc8859d376ce10083b9b4d60501b82820152908252675eb60976e4fee44b60c01b908201526114bd6128f4565b6f6dde74ff966ff7ec6bee74c31dbfc08a8152600160208083019190915260408051606080820183528082529281018390529081019190915260006040518060800160405280604a8152602001613257604a91398252506040805160608101909152603080825260009190613910602083013990508082602001819052505060006040518060800160405280604e8152602001612ed7604e91396040808401919091528381019290925250737d84272a441212743f7fba0a6083e125f48d5edc6060808401919091528151908101909152602d80825260009190612e4360208301396080808401919091526040808501939093528483019390935250737581b289936f63c693753b2eb8d2322d55401fee606084015266f76707081f981160c81b918301919091529082528051808201909152601c81527f4d6f6f20c3a9f09f9a804d6f6f6f6f6ff09f9a8020206f6ff09f9a800000000060208083019190915282015261162961294a565b64618b6b25d7198152647a324bf5a760208201526040820152815261164c612858565b611654612884565b6000815260408051808201909152601b81527f4d6f6f20c3a9f09f9a80f09f9a806f6f6f206f4dc3a9c3a920c3a9000000000060208083019190915282015261169b6128a0565b6116a36128c7565b6116ab6128d6565b73ef39293a07717fcee87e558f66a69f22a90e716b815273d3238bc068d5469faae53fe61e3d28809caa273b602080830191909152731d670fe466711115efa20cb297d5c0421d8593896040830152908252754ac659d646e3de7477fe3569232cff8cdcb3a6ca73b360511b82820152908252678b04ef97822e828b60c01b908201526117366128f4565b6ea4a81c4bc21d50f6a3fca219974c781981526001602080830191909152604080516060808201835280825292810183905290810191909152600060405180608001604052806051815260200161340d60519139825250604080516060810190915260398082526000919061331f6020830139905080826020018190525050600060405180608001604052806052815260200161364a60529139604080840191909152838101929092525073ee59e04da840532e07d3059d3858fa7955b9120460608084019190915281518083018352601c81527f4d6f6f20c3a9f09f9a80c3a96f4d6ff09f9a80c3a9f09f9a806fc3a900000000602080830191909152608080860192909252858401949094528583019490945273d44df1cf962948f082fe43ed2b01f49dcf99f3d0908501526601fa12715f297760cc1b848401529284528251918201909252604e8082526000926132a19083013960208301525061189b61294a565b64496a881e69198152643e74edb7971960208083019190915260408301919091528201526118c7612858565b6118cf612884565b60008082526040805160608101909152602780825261370b60208301396020830152506118fa6128a0565b6119026128c7565b61190a6128d6565b7359d6f42db099ce0d55a6b7c4a983abdeb6497920815273a802b1028dca6c4dbf1e2c15e8979d874beb86b960208083019190915273db0bf0fed7b4f4ebb2841cd9a680525bb6a190cd604083015290825275701aeb0598026806cf2e547cbdff02a87709fc37b75960501b8282015290825266b64d9f88ff5e1160c81b908201526119946128f4565b6f01d788e4995dcc260f83e26597127c9581526001602080830191909152604080516060808201835280825281840181905281830181905282518084018452600a8152689adede418753e13f3560b71b8186015282528251908101909252603a808352909260009291906138d69083013990508082602001819052505060006040518060800160405280604d81526020016131e0604d91396040808401919091528381019290925250730f968351013e54160e680d2312eee75b42509fca6060808401919091528151808301835260168152754d6f6f20c3a9f09f9a804dc3a94d204d20206f6fc3a960501b6020808301919091526080808601929092528584019490945285830194909452738e93fe3045ce3429ff3ef8592616fc2c252ccfa085820152660bcc9bbeeb61bd60cb1b938501939093529284528251918201909252602b8082526000926137db90830139602083015250611af361294a565b6401ea9027168152643071f4b781196020820152604082810191909152820152611b1b612858565b611b23612884565b6000815260408051808201909152601f81527f4d6f6f20c3a9f09f9a804d206f6f6f206f4d4dc3a96f20f09f9a80f09f9a8000602080830191909152820152611b6a6128a0565b611b726128c7565b611b7a6128d6565b73e8be8845fb6017cedb280dd3f6af7d03b747d95e8152734e5f05c11e461d34ba1ad53433a2f238a29f9afc60208083019190915273716f35acab14ec52daa0dd6b036a74c2851c25696040830152908252752dcb459c57ae870b8188f72c18bf037001df04c4554360501b828201529082526708e38d0f2d6f9b4160c11b90820152611c056128f4565b6f60f407af4850ee894dd72061f5c338fa19815260016020808301919091526040805160608082018352808252818401819052818301528151808301835260128152714d6f6f20c3a9f09f9a8020c3a920c3a9c3a960701b818501528152815160a08101909252606280835290926000929190613153908301396020808401919091526040805180820182526015815274026b7b79061d4f84fcd4026f84fcd4037b7e1d4901605d1b81840152818501528481019390935273f4558561cae05df23d50573b375e1b8f2610222f606085015282516080810190935260588084526000939250906139cb9083013960808084019190915260408085019390935284830193909352507302c240a608b92428c196a55861db5c15cf4989cb60608085019190915266bbe2d06698156b60c81b928401929092529183528151908101909152602880825260009190612d0a6020830139602083015250611d6661294a565b645e62a020bf1981526444ffe4cb3460208201526040828101919091526060830191909152908252820152611d996127fe565b611da161282b565b611da9612858565b611db1612884565b6000815260408051808201909152600b81526a4d6f6f20c3a9f09f9a806f60a81b602080830191909152820152611de66128a0565b611dee6128c7565b611df66128d6565b730271a9f08b096f13f15615bf3abfba63a383522881527357caa879d4eec37000334f29ddcfc6eace9c90546020808301919091527370e88a662cb1688ad5afe3d51701ace53c89f5b2604083015290825275336a885d480114d3ebeb956f99fb2e3f4d7e93e489cb60521b8282015290825267f70538f14abc419f60c01b90820152611e816128f4565b6f384031488f7c8d5ac9639261c166ca711981526000602080830182905260408051606080820183528082528184018190528183015281518083018352600f81526e4d6f6f20c3a9f09f9a80c3a96f6f4d60881b818501528152815160a081019092526074808352909392613b3890830139602080840191909152604080518082018252601b81527f4d6f6f20c3a9f09f9a8020206f20c3a920c3a9f09f9a804d6f204d000000000081840152818501528481019390935273811d981e7dbe6f80727285343906aa50be657ae260608501528251608081019093526056808452600093925090613bcd908301396080808401919091526040808501939093528483019390935250732dd9b0b8ea3f36f15eada31de8493717073aa5dc60608401526604366fc3ef8c6160c91b918301919091529082528051808201909152601781527f4d6f6f20c3a9f09f9a806ff09f9a806ff09f9a806f4d20000000000000000000602080830191909152820152611ff861294a565b640319e9730b8152644e8113cbc81960208201526040820152815261201b612858565b612023612884565b600181526040805160808101909152605880825260009190613c2360208301396020830152506120516128a0565b6120596128c7565b6120616128d6565b73e14cc5dbf416a76d7a606b0c4ef726c01425dbe1815273d58a1d35359a2860592d29ba3dfa0b9fbd52f76a60208083019190915273bc7b421a3c1f8e0283007835e4f809e7423f08166040830152908252756fbc7d81043821154efe8cb77a66e02cf0c5e36371e160511b828201529082526737104cd607a2521560c01b908201526120ec6128f4565b6f4e1c49ecd024b4b4a23bf565e52affba8152600060208083018290526040805160608082018352808252818401819052818301528151608081019092526044808352909392613987908301398252506040805160a081019091526064808252600091906135636020830139602080840191909152604080518082018252600a808252689adede418753e13f3560b71b82850181905283870192909252868301959095527328ff38296fd042aec5e9672cf44a8a1a17305f18606080880191909152825180840184528481527f4d6f6f20c3a9f09f9a806ff09f9a80c3a920c3a9f09f9a806fc3a96f6f6f4d4d818601526080808901919091528884019790975288830197909752739423a01efec6b7af47fd029575a2d0f992617c7e96880196909652666101e0fe89074f60c81b948701949094529486525081518083019092528152808301919091529082015261224361294a565b6465c6aba59d81526430ae90c94619602080830191909152604083019190915282015261226e612858565b612276612884565b6000815260408051808201909152600d81526c4d6f6f20c3a9f09f9a806f6f6f60981b6020808301919091528201526122ad6128a0565b6122b56128c7565b6122bd6128d6565b73b5405956da2fa7849f979afa97abfd706b942582815273e0470f38ea39ecd0c79b5234ee861cabe4538946602080830191909152738365a9e8b96fc7c5e0b65bf254c8c669ae4ffb496040830152908252751f26f9112ae796ee9a156646e6c373e6a136defad6fb60531b82820152908252675cabbbc7466a93ef60c01b908201526123486128f4565b6f69d47ad1a4b30c073b94c4e91952591a1981526001602080830191909152604080516060808201835280825281840181905281830181905282518084018452600b81526a4d6f6f20c3a9f09f9a806f60a81b8186015282528251908101909252602e80835290926000929190613aa7908301399050808260200181905250506000604051806080016040528060498152602001612d9460499139604080840191909152838101929092525073987188ac2b0b4bde48bf19c9d9cbaa7c0a4b0cc960608084019190915281518083018352600a8152689adede418753e13f3560b71b602080830191909152608080860192909252858401949094528583019490945273b41c0c7ce3d4c72427158fe122eaaf1fda056f7585820152667b3dc2c8e4df6760c91b938501939093529284528251918201909252602f808252600092613c7b9083013960208301525061249d61294a565b642005595b458152641e9309d0f21960208201526040828101919091528201526124c5612858565b6124cd612884565b6000815260408051808201909152600a8152689adede418753e13f3560b71b6020808301919091528201526125006128a0565b6125086128c7565b6125106128d6565b731746211f458690a6a4b71154637876b917cee91881527331de4cd09ec9715267cc84c6a1c8d7e9fdf8fe2060208083019190915273d4dde6bd2e4ac31717510c2aee22734b007bf1486040830152908252752a6a09c6cf9b5d5a4aa56805c2c9ddc1a2940fbfec2160511b8282015290825267b1ebd4df3f41555960c01b9082015261259b6128f4565b6f039b9b019e86862c3bbe3d54ff6705ff1981526001602080830191909152604080516060808201835280825292810183905290810191909152600060405180608001604052806047815260200161394060479139825250604080518082018252601081526f4d6f6f20c3a9f09f9a806ff09f9a806f60801b6020808301919091528084019190915281518083018352600a8152689adede418753e13f3560b71b81830152828401528382019290925273302b699c9b23359bd795df80665031799e9848c96060808501919091528151908101909152602b8082526000926131b590830139608080840191909152604080850193909352848301939093525073f5e84cf41cc6e5b38c5759e307f5966089b25e6660608085019190915265bb72b251fe9760d01b92840192909252918352815190810190915260328082526000919061345e60208301396020830152506126f361294a565b6433b9b719dd1981526406da87f3ce196020808301919091526040838101929092526060808501939093529284528482019390935290840192909252600190830152735fea7a766a6f18b075f51b24a578eb3156663f5b90820152919050565b6040518060800160405280612766612787565b81526020016127736127d1565b815260006020820181905260409091015290565b60408051608081018252600080825260208201529081016127a66127b3565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b60405180608001604052806004905b6127e86127fe565b8152602001906001900390816127e05790505090565b60405180602001604052806001905b61281561282b565b81526020019060019003908161280d5790505090565b60405180608001604052806004905b612842612858565b81526020019060019003908161283a5790505090565b604051806060016040528061286b612884565b81526020016060815260200161287f61294a565b905290565b6040805160a08101825260008152606060208201529081016127735b60405180606001604052806128b36128c7565b81526000602082015260400161287f6128f4565b60405180604001604052806127a65b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806000600f0b815260200160001515815260200161293660405180606001604052806060815260200160608152602001606081525090565b815260006020820152606060409091015290565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b8181101561298e57602081850181015186830182015201612972565b818111156129a0576000602083870101525b50601f01601f19169290920160200192915050565b8051600f0b82526020810151151560208301526000604082015160a060408501528051606060a08601526129ed610100860182612968565b90506020820151609f19808784030160c0880152612a0b8383612968565b925060408401519350808784030160e08801525050612a2a8183612968565b9150506060830151612a4760608601826001600160a01b03169052565b5060808301518482036080860152612a5f8282612968565b95945050505050565b8060005b6002811015612a8e57815160040b845260209384019390910190600101612a6c565b50505050565b600082608081018360005b6004811015612c465783830387528151836020810160005b6001811015612c2d5786820383528351826080810160005b6004811015612c155785820383528351805160808452805115156080850152602081015160a080860152612b07610120860182612968565b6040830151868203607f190160c08801528051805192935090918360005b6003811015612b4d5782516001600160a01b0316825260209283019290910190600101612b25565b50505060209081015169ffffffffffffffffffff191660608401528101516001600160c01b03191660808301526040015160c060a08301819052612b93908301826129b5565b9150506060820151612bb060e08701826001600160a01b03169052565b5060808201519150612bcf6101008601836001600160c81b0319169052565b602083015191508481036020860152612be88183612968565b91505060408201519150612bff6040850183612a68565b6020958601959490940193925050600101612acf565b50602096870196959095019493505050600101612ab7565b506020998a019990955093909301925050600101612a9f565b509095945050505050565b600060208083528351805160120b828501526effffffffffffffffffffffffffffff198282015116604085015260408101516060850160005b6001811015612cb157825167ffffffffffffffff1682529184019190840190600101612c8a565b505050606001511515608084015283015160e060a0840152612cd7610100840182612a94565b90506040840151612cec60c085018215159052565b5060608401516001600160a01b03811660e085015250939250505056fe4d6f6f20c3a9f09f9a804d20f09f9a80206f6ff09f9a80c3a9f09f9a80c3a96fc3a92020c3a94d4d4d6f6f20c3a9f09f9a806f6fc3a9c3a96f4d20206ff09f9a804d20204d6f6fc3a9f09f9a804d6f6f20c3a9f09f9a804dc3a9c3a96f4d206ff09f9a806f4df09f9a806f6f6f4d20f09f9a804d204d6f204dc3a96f206f6fc3a9c3a9f09f9a806f6f4d4d6f6f20c3a9f09f9a80c3a94df09f9a804d4df09f9a804d6fc3a94d4d6fc3a94d4d6f6fc3a96ff09f9a80c3a9c3a9c3a94d6f20c3a96f4d6ff09f9a80204d204df09f9a80206f6f6f4d6f6f20c3a9f09f9a804d20204dc3a96f20f09f9a8020c3a94d6f6f6ff09f9a80c3a9f09f9a804df09f9a806f6ff09f9a80f09f9a80c3a96f6f20c3a9f09f9a804d6f6f6f4df09f9a804d6f6f6f4df09f9a80c3a96f6f20c3a96f20c3a94d4dc3a9206fc3a94d6f6f20c3a9f09f9a806f6f6f4d4df09f9a806f4d6f20206fc3a9f09f9a806fc3a9f09f9a80c3a9f09f9a804d4d6f6f20c3a9f09f9a804d4d6f4d4d6f20f09f9a80f09f9a806fc3a96f6fc3a9c3a94d4d6f6f204d4d4d6f6f20c3a9f09f9a806f4d6ff09f9a80204dc3a9c3a9f09f9a806f6ff09f9a80f09f9a806ff09f9a806ff09f9a804d6ff09f9a8020f09f9a80c3a9c3a94d6f6f20c3a9f09f9a80206ff09f9a8020c3a96fc3a94df09f9a806f204dc3a96f4d6fc3a96f4d20f09f9a8020c3a94d6f4dc3a9c3a9f09f9a80c3a94d4d6f6f6f6f4dc3a94dc3a96f4d4d6f206f4d6f6f20c3a9f09f9a806fc3a9c3a96f204d6f20c3a94dc3a9c3a920202020f09f9a80c3a94d206f4d4d6f6f20c3a9f09f9a806f20c3a96fc3a9c3a9c3a96f6f4d4df09f9a804d20f09f9a806f4d204d6f6f20c3a9f09f9a806fc3a9c3a96f4d6f6fc3a96fc3a96f6f6f6ff09f9a806f20f09f9a80c3a96f6fc3a96f206ff09f9a804df09f9a806f20f09f9a804d204dc3a96f6f6f4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a96f4d6f20c3a94d20f09f9a80f09f9a80f09f9a80c3a94d6f4d6f6f4dc3a96f6ff09f9a80f09f9a804d6f204d6f6f20c3a9f09f9a806ff09f9a80c3a96f4d6f20c3a9c3a9f09f9a806f6f6fc3a9f09f9a804d6ff09f9a8020c3a9f09f9a804d4d4d4dc3a96f4df09f9a806f6ff09f9a806f6f20f09f9a804d6fc3a920206f6f6f20f09f9a80f09f9a80f09f9a804d6f6f20c3a9f09f9a804d6f6f206f6f4d6f20f09f9a80f09f9a80206f20f09f9a806f6f6ff09f9a80f09f9a806f4d4d6ff09f9a8020206f6f4d6f6f20c3a9f09f9a806f6ff09f9a80206f4df09f9a804d6ff09f9a80204d6f6ff09f9a804df09f9a80c3a9206ff09f9a804dc3a94dc3a96f6fc3a94df09f9a804d4d6f4d20f09f9a806f204df09f9a8020f09f9a80206f204d4df09f9a80f09f9a80206fc3a94d6f6f20c3a9f09f9a804d204d6ff09f9a80f09f9a804d4df09f9a804df09f9a80f09f9a8020c3a96ff09f9a804dc3a96fc3a96ff09f9a80c3a920f09f9a806f6f4d206f6f6f4d6f4d206f6f6f6f20c3a96f6f4d20f09f9a80204d6f6f20c3a9f09f9a80f09f9a804dc3a9c3a9f09f9a80f09f9a806f20c3a920c3a920c3a96fc3a96fc3a9f09f9a802020f09f9a804d6f4d6f6fc3a96ff09f9a806f6f6f206ff09f9a8020204d6ff09f9a806fc3a94dc3a9f09f9a80204df09f9a804d6f6f20c3a9f09f9a804d204d4d4dc3a9f09f9a806f6f20f09f9a806ff09f9a804d6f4d204d20f09f9a804d6f6f20c3a9f09f9a80206ff09f9a80c3a94df09f9a802020f09f9a80206f4df09f9a804df09f9a80c3a94dc3a94df09f9a806ff09f9a806f6f6f204d4d6f20c3a9204d6f6fc3a96fc3a9c3a94d6f6f20c3a9f09f9a804df09f9a804d20c3a96f204dc3a9206fc3a94dc3a9c3a9f09f9a80202020c3a94d6f6f20c3a9f09f9a806f4d6fc3a920204dc3a96fc3a96fc3a920206f206fc3a96f20f09f9a80206f20204dc3a94d6f6f6f4d4d4d20204d4d4d6f6ff09f9a80c3a94d206f6f206f206f4d6f6f20c3a9f09f9a80f09f9a8020c3a9f09f9a806ff09f9a80c3a9c3a96f6f6ff09f9a80c3a96f6f4d6f6fc3a96f204d206fc3a9f09f9a806ff09f9a806f6f4d4dc3a96f4d4dc3a9f09f9a80204d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f4d6fc3a9c3a96f20c3a9c3a9c3a96f6f4df09f9a80f09f9a806f6f6f4d6f6f20c3a9f09f9a80c3a9f09f9a804d6ff09f9a806f20204dc3a96f6ff09f9a80f09f9a806f6f20f09f9a806fc3a96ff09f9a806f6f4d6f4d6f6f20c3a9f09f9a80f09f9a806f206ff09f9a804d6f206f4dc3a9f09f9a80c3a9f09f9a80c3a9f09f9a806f4d6ff09f9a806f206fc3a96f206ff09f9a806f6f4d6f6fc3a9204d6fc3a9f09f9a806f20204d6f6f20c3a9f09f9a806f204df09f9a80f09f9a80c3a9206fc3a96f6ff09f9a806f6ff09f9a80206f204dc3a9206ff09f9a804d4d204df09f9a80c3a94dc3a96f6f206f6f4dc3a96ff09f9a806f4d4df09f9a8020c3a920204dc3a94dc3a94dc3a9204d6f6f20c3a9f09f9a806ff09f9a806ff09f9a806fc3a96f6f6f4df09f9a80c3a96f6fc3a9f09f9a80f09f9a8020f09f9a806f6f206f6f20f09f9a80f09f9a80f09f9a806f6f6f6f6fc3a96f206f4d6f4d4d6f6f20c3a9f09f9a80c3a9f09f9a8020206fc3a9c3a94dc3a96f6f6f6f206ff09f9a806fc3a94d20f09f9a8020f09f9a804d6f6f20c3a9f09f9a804d4d6f2020f09f9a806f4d4dc3a96f4d6f4df09f9a804d6f6f4dc3a96ff09f9a804df09f9a804d6f206f4d6f6f20c3a9f09f9a80c3a96f4d202020f09f9a80f09f9a806f4d4d4d6f6f6f4d4df09f9a80c3a9c3a94d4d206f6f206f6f6f2020c3a9f09f9a80c3a96f4d4d6fc3a94d6f6f20c3a9f09f9a802020c3a94d6f6f6f6f204df09f9a80c3a94d6fc3a94df09f9a80c3a92020c3a9f09f9a804d6f6f6f6fc3a9c3a9f09f9a80c3a96f20c3a96f6f6fc3a9c3a96f4dc3a94d6f206f4d4d206ff09f9a80206f6f4d4d6f6f20c3a9f09f9a806fc3a920c3a9c3a9f09f9a806f6fc3a96f6f6f4d6f6f6f2020c3a9f09f9a80c3a9c3a96f4df09f9a806f6fc3a96f20c3a9f09f9a80f09f9a80c3a9206fc3a9f09f9a80f09f9a80c3a9f09f9a80202020f09f9a806ff09f9a806f4d6f6f20c3a9f09f9a80c3a94d6f6f4d6f6ff09f9a80f09f9a804df09f9a80c3a9f09f9a806ff09f9a806f6f4d206f20f09f9a804dc3a9c3a920c3a920f09f9a804d6f6f20c3a9f09f9a80204d20f09f9a80c3a9c3a9c3a96f4d4d6f6f6ff09f9a804dc3a920f09f9a804d4d20c3a92020206ff09f9a806ff09f9a8020c3a94d6fc3a94d6f6f20c3a9f09f9a80f09f9a80f09f9a80206f4d206f4d204d6fc3a920f09f9a806fc3a96fc3a9f09f9a804d6ff09f9a80f09f9a80f09f9a80204d6f6fc3a96f6f4d6ff09f9a80f09f9a806f6f6f6f6f204d6f6f20c3a9f09f9a80f09f9a806f206f6f20f09f9a80f09f9a804d206f6f6f4d4d4d4df09f9a806f2020f09f9a804d6ff09f9a806ff09f9a804df09f9a806f6f6f20c3a94d6f6ff09f9a80f09f9a8020206f6f4df09f9a806ff09f9a80c3a9c3a920c3a9c3a9f09f9a80206f4d4d4d6f6f20c3a9f09f9a806fc3a9c3a96f4d4d4dc3a96fc3a96f4d6ff09f9a80206f6ff09f9a806f4d6f6f20c3a9f09f9a8020f09f9a806ff09f9a80204df09f9a80f09f9a80c3a9204d20c3a9f09f9a80c3a94d4d206f20c3a9c3a94d4d6f6f20c3a9f09f9a806ff09f9a806f20c3a9206f4df09f9a804d6fc3a9c3a9204d20f09f9a80f09f9a806f20c3a96f6fc3a94df09f9a80f09f9a804d206ff09f9a804d6f4d6fc3a96fc3a96f6ff09f9a804d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6f4d4df09f9a804dc3a9c3a94d6f4d4d6f6f20c3a9f09f9a80c3a9c3a96f6f6f206fc3a9c3a96f4d4dc3a96f6f20f09f9a806f6f4df09f9a804d4d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f6f6f6f6f6ff09f9a80c3a96f6f4d4dc3a96f6ff09f9a802020f09f9a80f09f9a806ff09f9a80c3a920f09f9a80c3a96f6f6f4d206f6f4d204d204d4df09f9a806fc3a9c3a9204d6ff09f9a806f6f4d6f6f20c3a9f09f9a806fc3a9c3a94df09f9a806ff09f9a806f6f6f6f6fc3a9c3a96f4df09f9a80c3a9f09f9a80c3a94d4df09f9a80f09f9a806ff09f9a80f09f9a80c3a96ff09f9a80206ff09f9a806ff09f9a80206f6f2020f09f9a806f6ff09f9a806f4dc3a9c3a920c3a94d4d6f6f20c3a9f09f9a806ff09f9a80c3a94dc3a94d204d2020c3a9c3a96ff09f9a804d206f6f6f6ff09f9a80f09f9a806f6f6f206ff09f9a806f4d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a804d4d4d6f6f6f6ff09f9a80f09f9a804d20f09f9a806f6f6fc3a94d6f4d6f6f20c3a9f09f9a806f6f6f6ff09f9a80206f20c3a94d20c3a9c3a9c3a9c3a96f4df09f9a804d206f4d4dc3a9f09f9a80f09f9a80206ff09f9a806f6f6fc3a94d4d4d206f6f4d6f6f20c3a9f09f9a80f09f9a804d6f6f6ff09f9a804d4d4d204d6f20f09f9a806f4d6f6f4d6ff09f9a804d4d6fc3a96f6f6f4d206f6ff09f9a804d4df09f9a80c3a94d4d6f6f20c3a9f09f9a80c3a96f6fc3a96ff09f9a8020f09f9a80c3a96f6f4d4d6ff09f9a806f4dc3a96ff09f9a806fc3a96f6f4d6f6f6f6f2020f09f9a806f4dc3a96f4d4d4d206f6f6ff09f9a806f206f6f6f20c3a9206f4d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6f206ff09f9a80f09f9a80206fc3a96ff09f9a80206fc3a94d4d6f4d6f6fc3a96f4df09f9a80f09f9a806f4d4df09f9a80f09f9a80f09f9a80f09f9a806f204d6f6f20c3a9f09f9a80f09f9a804df09f9a806ff09f9a806f4dc3a9f09f9a8020206f6f6f4d204d4df09f9a806f206f6f6f4d6f6f20c3a9f09f9a80c3a94d4d6f6f6f20f09f9a804d6fc3a96f4d4d6f4d20c3a9c3a92020f09f9a806fc3a9204d6f6f20c3a9f09f9a806fc3a96f6f6f206fc3a94d4df09f9a80c3a9206f6fc3a920f09f9a80f09f9a804d206f6f6f6f4d4d204df09f9a80c3a96ff09f9a80204d20f09f9a80f09f9a80c3a9204d4d6fc3a9206f6ff09f9a806f6f206ff09f9a804d6f4d6f6f20c3a9f09f9a8020f09f9a80f09f9a80204d6f6ff09f9a80f09f9a804dc3a9206f204dc3a9f09f9a80206f4d206f206ff09f9a80f09f9a804df09f9a804d6fc3a9c3a94d206ff09f9a8020c3a9f09f9a806f6f6f4d4df09f9a806f204d4df09f9a80f09f9a80c3a920f09f9a80f09f9a804d6f6f20c3a9f09f9a804df09f9a806fc3a9f09f9a804df09f9a80f09f9a80c3a94d6f6f20c3a9f09f9a806f206f6fc3a96f204d6f4df09f9a802020f09f9a80c3a96f206f4df09f9a80f09f9a8020c3a96f20206f6f6f6f4d6f6f20c3a94d6ff09f9a806f6ff09f9a80c3a96ff09f9a80f09f9a806f6f4d6f6f20c3a9f09f9a80f09f9a804d4dc3a96fc3a9204d6f6f204df09f9a80206f4d6fc3a96f6ff09f9a8020206fc3a94dc3a96ff09f9a8020204d6fc3a96f6fc3a96f6f6fc3a96f6f6f6fc3a9f09f9a80f09f9a80206f204d6f6f20c3a9f09f9a80c3a94dc3a94d4d4d6f6ff09f9a80f09f9a80c3a9204dc3a9c3a920c3a96f4d4d6f6f4d4d20a26469706673582212200417651eb25410ef5ee6715c99863a0b23b4e87351419183685b79f8f1101c9464736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_80a10b18 {\n int152 s_0;\n bytes17 s_1;\n uint64[1] s_2;\n bool s_3;\n }\n\n struct S_d29e61bf {\n address[3] s_0;\n bytes22 s_1;\n }\n\n struct S_061dfc07 {\n string s_0;\n string s_1;\n string s_2;\n }\n\n struct S_a217dd34 {\n int128 s_0;\n bool s_1;\n S_061dfc07 s_2;\n address s_3;\n string s_4;\n }\n\n struct S_7e54c7ee {\n S_d29e61bf s_0;\n bytes8 s_1;\n S_a217dd34 s_2;\n }\n\n struct S_71a4881b {\n bool s_0;\n string s_1;\n S_7e54c7ee s_2;\n address s_3;\n bytes7 s_4;\n }\n\n struct S_6c7af139 {\n S_71a4881b s_0;\n string s_1;\n int40[2] s_2;\n }\n\n struct S_ed992665 {\n S_80a10b18 s_0;\n S_6c7af139[4][1][4] s_1;\n bool s_2;\n address s_3;\n }\n\n function test () public pure returns (S_ed992665 memory) {\n S_ed992665 memory r;\n {\n S_80a10b18 memory r_0;\n {\n int152 r_0_0 = 2557053897289181536776227039130753366531499764;\n r_0.s_0 = r_0_0;\n }\n {\n bytes17 r_0_1 = bytes17(0x64e16d767c709174fdb3b814b795d2e683);\n r_0.s_1 = r_0_1;\n }\n {\n uint64[1] memory r_0_2;\n {\n uint64 r_0_2_0 = 2263345982287538497;\n r_0_2[0] = r_0_2_0;\n }\n r_0.s_2 = r_0_2;\n }\n {\n bool r_0_3 = true;\n r_0.s_3 = r_0_3;\n }\n r.s_0 = r_0;\n }\n {\n S_6c7af139[4][1][4] memory r_1;\n {\n S_6c7af139[4][1] memory r_1_0;\n {\n S_6c7af139[4] memory r_1_0_0;\n {\n S_6c7af139 memory r_1_0_0_0;\n {\n S_71a4881b memory r_1_0_0_0_0;\n {\n bool r_1_0_0_0_0_0 = true;\n r_1_0_0_0_0.s_0 = r_1_0_0_0_0_0;\n }\n {\n string memory r_1_0_0_0_0_1 = unicode\"Moo é🚀🚀🚀oo o🚀🚀 oéo🚀 oéMMoMooéoM🚀🚀oMM🚀🚀🚀🚀o \";\n r_1_0_0_0_0.s_1 = r_1_0_0_0_0_1;\n }\n {\n S_7e54c7ee memory r_1_0_0_0_0_2;\n {\n S_d29e61bf memory r_1_0_0_0_0_2_0;\n {\n address[3] memory r_1_0_0_0_0_2_0_0;\n {\n address r_1_0_0_0_0_2_0_0_0 = 0x77b2C3b055786ff7A936686c125e84CdB3a3c876;\n r_1_0_0_0_0_2_0_0[0] = r_1_0_0_0_0_2_0_0_0;\n }\n {\n address r_1_0_0_0_0_2_0_0_1 = 0x0d6B791045bdFb317a3B5946B4756B097EC3986b;\n r_1_0_0_0_0_2_0_0[1] = r_1_0_0_0_0_2_0_0_1;\n }\n {\n address r_1_0_0_0_0_2_0_0_2 = 0xc12F0c8d22b046D909C69bC89f21C531c5746163;\n r_1_0_0_0_0_2_0_0[2] = r_1_0_0_0_0_2_0_0_2;\n }\n r_1_0_0_0_0_2_0.s_0 = r_1_0_0_0_0_2_0_0;\n }\n {\n bytes22 r_1_0_0_0_0_2_0_1 = bytes22(0x608e571f1d7724d085dae45ac249071d05747dba741d);\n r_1_0_0_0_0_2_0.s_1 = r_1_0_0_0_0_2_0_1;\n }\n r_1_0_0_0_0_2.s_0 = r_1_0_0_0_0_2_0;\n }\n {\n bytes8 r_1_0_0_0_0_2_1 = bytes8(0x5cb7199b7b95e3e9);\n r_1_0_0_0_0_2.s_1 = r_1_0_0_0_0_2_1;\n }\n {\n S_a217dd34 memory r_1_0_0_0_0_2_2;\n {\n int128 r_1_0_0_0_0_2_2_0 = -50107174431156178692800459312299352861;\n r_1_0_0_0_0_2_2.s_0 = r_1_0_0_0_0_2_2_0;\n }\n {\n bool r_1_0_0_0_0_2_2_1 = true;\n r_1_0_0_0_0_2_2.s_1 = r_1_0_0_0_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_0_0_0_0_2_2_2;\n {\n string memory r_1_0_0_0_0_2_2_2_0 = unicode\"Moo é🚀oo🚀 oM🚀Mo🚀 Moo🚀M🚀é o🚀MéMéooéM🚀MMoM 🚀o M🚀 🚀 o MM🚀🚀 oé\";\n r_1_0_0_0_0_2_2_2.s_0 = r_1_0_0_0_0_2_2_2_0;\n }\n {\n string memory r_1_0_0_0_0_2_2_2_1 = unicode\"Moo é🚀o🚀éoMo éé🚀oooé🚀Mo🚀 é🚀MMMMéoM🚀oo🚀oo 🚀Moé ooo 🚀🚀🚀\";\n r_1_0_0_0_0_2_2_2.s_1 = r_1_0_0_0_0_2_2_2_1;\n }\n {\n string memory r_1_0_0_0_0_2_2_2_2 = unicode\"Moo é🚀🚀M🚀o🚀oMé🚀 oooM MM🚀o ooo\";\n r_1_0_0_0_0_2_2_2.s_2 = r_1_0_0_0_0_2_2_2_2;\n }\n r_1_0_0_0_0_2_2.s_2 = r_1_0_0_0_0_2_2_2;\n }\n {\n address r_1_0_0_0_0_2_2_3 = 0x87B4709AFAe80773735280825B347d9971eCB691;\n r_1_0_0_0_0_2_2.s_3 = r_1_0_0_0_0_2_2_3;\n }\n {\n string memory r_1_0_0_0_0_2_2_4 = unicode\"Moo é🚀🚀o\";\n r_1_0_0_0_0_2_2.s_4 = r_1_0_0_0_0_2_2_4;\n }\n r_1_0_0_0_0_2.s_2 = r_1_0_0_0_0_2_2;\n }\n r_1_0_0_0_0.s_2 = r_1_0_0_0_0_2;\n }\n {\n address r_1_0_0_0_0_3 = 0xF7fF3Be34346B75ffFFE0d5Dc0225aFdB212Dd25;\n r_1_0_0_0_0.s_3 = r_1_0_0_0_0_3;\n }\n {\n bytes7 r_1_0_0_0_0_4 = bytes7(0x368a7df30c3967);\n r_1_0_0_0_0.s_4 = r_1_0_0_0_0_4;\n }\n r_1_0_0_0.s_0 = r_1_0_0_0_0;\n }\n {\n string memory r_1_0_0_0_1 = unicode\"Moo é🚀🚀oMoo 🚀 oo\";\n r_1_0_0_0.s_1 = r_1_0_0_0_1;\n }\n {\n int40[2] memory r_1_0_0_0_2;\n {\n int40 r_1_0_0_0_2_0 = -266286681710;\n r_1_0_0_0_2[0] = r_1_0_0_0_2_0;\n }\n {\n int40 r_1_0_0_0_2_1 = 525885121095;\n r_1_0_0_0_2[1] = r_1_0_0_0_2_1;\n }\n r_1_0_0_0.s_2 = r_1_0_0_0_2;\n }\n r_1_0_0[0] = r_1_0_0_0;\n }\n {\n S_6c7af139 memory r_1_0_0_1;\n {\n S_71a4881b memory r_1_0_0_1_0;\n {\n bool r_1_0_0_1_0_0 = false;\n r_1_0_0_1_0.s_0 = r_1_0_0_1_0_0;\n }\n {\n string memory r_1_0_0_1_0_1 = unicode\"Moo é🚀o éoéééooMM🚀M 🚀oM \";\n r_1_0_0_1_0.s_1 = r_1_0_0_1_0_1;\n }\n {\n S_7e54c7ee memory r_1_0_0_1_0_2;\n {\n S_d29e61bf memory r_1_0_0_1_0_2_0;\n {\n address[3] memory r_1_0_0_1_0_2_0_0;\n {\n address r_1_0_0_1_0_2_0_0_0 = 0x13eC2E2dE547f48AD354ee4AEd82c2b8c3E5E556;\n r_1_0_0_1_0_2_0_0[0] = r_1_0_0_1_0_2_0_0_0;\n }\n {\n address r_1_0_0_1_0_2_0_0_1 = 0x3D0906dbA7D38713b1184eA920bf0d2bAaCc07f2;\n r_1_0_0_1_0_2_0_0[1] = r_1_0_0_1_0_2_0_0_1;\n }\n {\n address r_1_0_0_1_0_2_0_0_2 = 0x4746B3d6DE6140DC59dD9E9704B91f86858aE500;\n r_1_0_0_1_0_2_0_0[2] = r_1_0_0_1_0_2_0_0_2;\n }\n r_1_0_0_1_0_2_0.s_0 = r_1_0_0_1_0_2_0_0;\n }\n {\n bytes22 r_1_0_0_1_0_2_0_1 = bytes22(0x73246ca93dd5735fbacb9107c823b7f8eb104af8f806);\n r_1_0_0_1_0_2_0.s_1 = r_1_0_0_1_0_2_0_1;\n }\n r_1_0_0_1_0_2.s_0 = r_1_0_0_1_0_2_0;\n }\n {\n bytes8 r_1_0_0_1_0_2_1 = bytes8(0x5d3c845b5aa34420);\n r_1_0_0_1_0_2.s_1 = r_1_0_0_1_0_2_1;\n }\n {\n S_a217dd34 memory r_1_0_0_1_0_2_2;\n {\n int128 r_1_0_0_1_0_2_2_0 = 163701809972189021710462008086298077530;\n r_1_0_0_1_0_2_2.s_0 = r_1_0_0_1_0_2_2_0;\n }\n {\n bool r_1_0_0_1_0_2_2_1 = false;\n r_1_0_0_1_0_2_2.s_1 = r_1_0_0_1_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_0_0_1_0_2_2_2;\n {\n string memory r_1_0_0_1_0_2_2_2_0 = unicode\"Moo é🚀 o🚀é🚀oM\";\n r_1_0_0_1_0_2_2_2.s_0 = r_1_0_0_1_0_2_2_2_0;\n }\n {\n string memory r_1_0_0_1_0_2_2_2_1 = unicode\"Moo é🚀 éo oM\";\n r_1_0_0_1_0_2_2_2.s_1 = r_1_0_0_1_0_2_2_2_1;\n }\n {\n string memory r_1_0_0_1_0_2_2_2_2 = unicode\"Moo é🚀 M 🚀éééoMMooo🚀Mé 🚀MM é o🚀o🚀 éMoé\";\n r_1_0_0_1_0_2_2_2.s_2 = r_1_0_0_1_0_2_2_2_2;\n }\n r_1_0_0_1_0_2_2.s_2 = r_1_0_0_1_0_2_2_2;\n }\n {\n address r_1_0_0_1_0_2_2_3 = 0x6Fc60D8c853d725e0906bDaB3E09Fe71d9ef467b;\n r_1_0_0_1_0_2_2.s_3 = r_1_0_0_1_0_2_2_3;\n }\n {\n string memory r_1_0_0_1_0_2_2_4 = unicode\"Moo é🚀🚀o o🚀Mo oMé🚀é🚀é🚀oMo🚀o oéo o🚀ooMooé Moé🚀o \";\n r_1_0_0_1_0_2_2.s_4 = r_1_0_0_1_0_2_2_4;\n }\n r_1_0_0_1_0_2.s_2 = r_1_0_0_1_0_2_2;\n }\n r_1_0_0_1_0.s_2 = r_1_0_0_1_0_2;\n }\n {\n address r_1_0_0_1_0_3 = 0x738Eb7EB4664B050A29298068da94C056718FF1A;\n r_1_0_0_1_0.s_3 = r_1_0_0_1_0_3;\n }\n {\n bytes7 r_1_0_0_1_0_4 = bytes7(0x749fb2c41b7b88);\n r_1_0_0_1_0.s_4 = r_1_0_0_1_0_4;\n }\n r_1_0_0_1.s_0 = r_1_0_0_1_0;\n }\n {\n string memory r_1_0_0_1_1 = unicode\"Moo é🚀\";\n r_1_0_0_1.s_1 = r_1_0_0_1_1;\n }\n {\n int40[2] memory r_1_0_0_1_2;\n {\n int40 r_1_0_0_1_2_0 = -294063635696;\n r_1_0_0_1_2[0] = r_1_0_0_1_2_0;\n }\n {\n int40 r_1_0_0_1_2_1 = -457809642668;\n r_1_0_0_1_2[1] = r_1_0_0_1_2_1;\n }\n r_1_0_0_1.s_2 = r_1_0_0_1_2;\n }\n r_1_0_0[1] = r_1_0_0_1;\n }\n {\n S_6c7af139 memory r_1_0_0_2;\n {\n S_71a4881b memory r_1_0_0_2_0;\n {\n bool r_1_0_0_2_0_0 = true;\n r_1_0_0_2_0.s_0 = r_1_0_0_2_0_0;\n }\n {\n string memory r_1_0_0_2_0_1 = unicode\"Moo é🚀oééo Mo éMéé 🚀éM oM\";\n r_1_0_0_2_0.s_1 = r_1_0_0_2_0_1;\n }\n {\n S_7e54c7ee memory r_1_0_0_2_0_2;\n {\n S_d29e61bf memory r_1_0_0_2_0_2_0;\n {\n address[3] memory r_1_0_0_2_0_2_0_0;\n {\n address r_1_0_0_2_0_2_0_0_0 = 0xC3DdC93DF8929dC89eA3286542C6cEDE3cBfc0C4;\n r_1_0_0_2_0_2_0_0[0] = r_1_0_0_2_0_2_0_0_0;\n }\n {\n address r_1_0_0_2_0_2_0_0_1 = 0x718dd49145B4ae405AF2cB6E56c091C4c10a802B;\n r_1_0_0_2_0_2_0_0[1] = r_1_0_0_2_0_2_0_0_1;\n }\n {\n address r_1_0_0_2_0_2_0_0_2 = 0x7E03FB9e50c1e7219d7077F1D0ED28D54FfC832e;\n r_1_0_0_2_0_2_0_0[2] = r_1_0_0_2_0_2_0_0_2;\n }\n r_1_0_0_2_0_2_0.s_0 = r_1_0_0_2_0_2_0_0;\n }\n {\n bytes22 r_1_0_0_2_0_2_0_1 = bytes22(0xe25599e0ec186c4f00d74a6c396bfbbab24c6082b168);\n r_1_0_0_2_0_2_0.s_1 = r_1_0_0_2_0_2_0_1;\n }\n r_1_0_0_2_0_2.s_0 = r_1_0_0_2_0_2_0;\n }\n {\n bytes8 r_1_0_0_2_0_2_1 = bytes8(0xb6c22be93fc4e473);\n r_1_0_0_2_0_2.s_1 = r_1_0_0_2_0_2_1;\n }\n {\n S_a217dd34 memory r_1_0_0_2_0_2_2;\n {\n int128 r_1_0_0_2_0_2_2_0 = -102733595900354371215138505875632835742;\n r_1_0_0_2_0_2_2.s_0 = r_1_0_0_2_0_2_2_0;\n }\n {\n bool r_1_0_0_2_0_2_2_1 = false;\n r_1_0_0_2_0_2_2.s_1 = r_1_0_0_2_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_0_0_2_0_2_2_2;\n {\n string memory r_1_0_0_2_0_2_2_2_0 = unicode\"Moo é🚀oééoMooéoéoooo🚀o 🚀éooéo o🚀M🚀o 🚀M Méooo\";\n r_1_0_0_2_0_2_2_2.s_0 = r_1_0_0_2_0_2_2_2_0;\n }\n {\n string memory r_1_0_0_2_0_2_2_2_1 = unicode\"Moo é🚀🚀o🚀oMoééo éééooM🚀🚀ooo\";\n r_1_0_0_2_0_2_2_2.s_1 = r_1_0_0_2_0_2_2_2_1;\n }\n {\n string memory r_1_0_0_2_0_2_2_2_2 = unicode\"Moo é🚀🚀o oo 🚀🚀M oooMMMM🚀o 🚀Mo🚀o🚀M🚀ooo éMoo🚀🚀 ooM🚀o🚀éé éé🚀 oMM\";\n r_1_0_0_2_0_2_2_2.s_2 = r_1_0_0_2_0_2_2_2_2;\n }\n r_1_0_0_2_0_2_2.s_2 = r_1_0_0_2_0_2_2_2;\n }\n {\n address r_1_0_0_2_0_2_2_3 = 0xe93Bd7EA3eD7907837CD88f19d851CE440438b4B;\n r_1_0_0_2_0_2_2.s_3 = r_1_0_0_2_0_2_2_3;\n }\n {\n string memory r_1_0_0_2_0_2_2_4 = unicode\"Moo é🚀oééM🚀o🚀oooooééoM🚀é🚀éMM🚀🚀o🚀🚀éo🚀 o🚀o🚀 oo 🚀oo🚀oMéé éM\";\n r_1_0_0_2_0_2_2.s_4 = r_1_0_0_2_0_2_2_4;\n }\n r_1_0_0_2_0_2.s_2 = r_1_0_0_2_0_2_2;\n }\n r_1_0_0_2_0.s_2 = r_1_0_0_2_0_2;\n }\n {\n address r_1_0_0_2_0_3 = 0xDc1Df1fE26e618D818543eeAEB4E43AD32cD6665;\n r_1_0_0_2_0.s_3 = r_1_0_0_2_0_3;\n }\n {\n bytes7 r_1_0_0_2_0_4 = bytes7(0x5325fa2502fdd1);\n r_1_0_0_2_0.s_4 = r_1_0_0_2_0_4;\n }\n r_1_0_0_2.s_0 = r_1_0_0_2_0;\n }\n {\n string memory r_1_0_0_2_1 = unicode\"Moo é🚀oéooo oéMM🚀é ooé 🚀🚀M ooooMM M🚀éo🚀 M 🚀🚀é MMoé oo🚀oo o🚀Mo\";\n r_1_0_0_2.s_1 = r_1_0_0_2_1;\n }\n {\n int40[2] memory r_1_0_0_2_2;\n {\n int40 r_1_0_0_2_2_0 = 478765699500;\n r_1_0_0_2_2[0] = r_1_0_0_2_2_0;\n }\n {\n int40 r_1_0_0_2_2_1 = -495211968069;\n r_1_0_0_2_2[1] = r_1_0_0_2_2_1;\n }\n r_1_0_0_2.s_2 = r_1_0_0_2_2;\n }\n r_1_0_0[2] = r_1_0_0_2;\n }\n {\n S_6c7af139 memory r_1_0_0_3;\n {\n S_71a4881b memory r_1_0_0_3_0;\n {\n bool r_1_0_0_3_0_0 = true;\n r_1_0_0_3_0.s_0 = r_1_0_0_3_0_0;\n }\n {\n string memory r_1_0_0_3_0_1 = unicode\"Moo é🚀\";\n r_1_0_0_3_0.s_1 = r_1_0_0_3_0_1;\n }\n {\n S_7e54c7ee memory r_1_0_0_3_0_2;\n {\n S_d29e61bf memory r_1_0_0_3_0_2_0;\n {\n address[3] memory r_1_0_0_3_0_2_0_0;\n {\n address r_1_0_0_3_0_2_0_0_0 = 0x4f099c8f6d99818636f5AD1eea5C9B133ef99048;\n r_1_0_0_3_0_2_0_0[0] = r_1_0_0_3_0_2_0_0_0;\n }\n {\n address r_1_0_0_3_0_2_0_0_1 = 0x9E9544EF65849969c0cc0cEB86233a7e09468970;\n r_1_0_0_3_0_2_0_0[1] = r_1_0_0_3_0_2_0_0_1;\n }\n {\n address r_1_0_0_3_0_2_0_0_2 = 0xe13c2A64ee60dC0f94b985fb7BC91b158EE00559;\n r_1_0_0_3_0_2_0_0[2] = r_1_0_0_3_0_2_0_0_2;\n }\n r_1_0_0_3_0_2_0.s_0 = r_1_0_0_3_0_2_0_0;\n }\n {\n bytes22 r_1_0_0_3_0_2_0_1 = bytes22(0xd2946b3810589dd01ef0d704dd434f8183d67cd8de0b);\n r_1_0_0_3_0_2_0.s_1 = r_1_0_0_3_0_2_0_1;\n }\n r_1_0_0_3_0_2.s_0 = r_1_0_0_3_0_2_0;\n }\n {\n bytes8 r_1_0_0_3_0_2_1 = bytes8(0x290c94382d81ad3c);\n r_1_0_0_3_0_2.s_1 = r_1_0_0_3_0_2_1;\n }\n {\n S_a217dd34 memory r_1_0_0_3_0_2_2;\n {\n int128 r_1_0_0_3_0_2_2_0 = 161748600966332684423685375546815565583;\n r_1_0_0_3_0_2_2.s_0 = r_1_0_0_3_0_2_2_0;\n }\n {\n bool r_1_0_0_3_0_2_2_1 = false;\n r_1_0_0_3_0_2_2.s_1 = r_1_0_0_3_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_0_0_3_0_2_2_2;\n {\n string memory r_1_0_0_3_0_2_2_2_0 = unicode\"Moo é🚀\";\n r_1_0_0_3_0_2_2_2.s_0 = r_1_0_0_3_0_2_2_2_0;\n }\n {\n string memory r_1_0_0_3_0_2_2_2_1 = unicode\"Moo é🚀 éMoooo M🚀éMoéM🚀é é🚀Mooooéé🚀éo éoooééoMéMo oMM o🚀 ooM\";\n r_1_0_0_3_0_2_2_2.s_1 = r_1_0_0_3_0_2_2_2_1;\n }\n {\n string memory r_1_0_0_3_0_2_2_2_2 = unicode\"Moo é🚀 🚀éooo o🚀\";\n r_1_0_0_3_0_2_2_2.s_2 = r_1_0_0_3_0_2_2_2_2;\n }\n r_1_0_0_3_0_2_2.s_2 = r_1_0_0_3_0_2_2_2;\n }\n {\n address r_1_0_0_3_0_2_2_3 = 0x90127D0D0261C4B20E2Cc2085db10024101b3104;\n r_1_0_0_3_0_2_2.s_3 = r_1_0_0_3_0_2_2_3;\n }\n {\n string memory r_1_0_0_3_0_2_2_4 = unicode\"Moo é🚀ooé o\";\n r_1_0_0_3_0_2_2.s_4 = r_1_0_0_3_0_2_2_4;\n }\n r_1_0_0_3_0_2.s_2 = r_1_0_0_3_0_2_2;\n }\n r_1_0_0_3_0.s_2 = r_1_0_0_3_0_2;\n }\n {\n address r_1_0_0_3_0_3 = 0xff958C5E3973110d2EC056910087A5654ae881AB;\n r_1_0_0_3_0.s_3 = r_1_0_0_3_0_3;\n }\n {\n bytes7 r_1_0_0_3_0_4 = bytes7(0x0ef43618428a14);\n r_1_0_0_3_0.s_4 = r_1_0_0_3_0_4;\n }\n r_1_0_0_3.s_0 = r_1_0_0_3_0;\n }\n {\n string memory r_1_0_0_3_1 = unicode\"Moo é🚀o\";\n r_1_0_0_3.s_1 = r_1_0_0_3_1;\n }\n {\n int40[2] memory r_1_0_0_3_2;\n {\n int40 r_1_0_0_3_2_0 = -242978510265;\n r_1_0_0_3_2[0] = r_1_0_0_3_2_0;\n }\n {\n int40 r_1_0_0_3_2_1 = -173359248627;\n r_1_0_0_3_2[1] = r_1_0_0_3_2_1;\n }\n r_1_0_0_3.s_2 = r_1_0_0_3_2;\n }\n r_1_0_0[3] = r_1_0_0_3;\n }\n r_1_0[0] = r_1_0_0;\n }\n r_1[0] = r_1_0;\n }\n {\n S_6c7af139[4][1] memory r_1_1;\n {\n S_6c7af139[4] memory r_1_1_0;\n {\n S_6c7af139 memory r_1_1_0_0;\n {\n S_71a4881b memory r_1_1_0_0_0;\n {\n bool r_1_1_0_0_0_0 = false;\n r_1_1_0_0_0.s_0 = r_1_1_0_0_0_0;\n }\n {\n string memory r_1_1_0_0_0_1 = unicode\"Moo é🚀M Mo🚀🚀MM🚀M🚀🚀 éo🚀Méoéo🚀é 🚀ooM oooMoM oooo éooM 🚀 \";\n r_1_1_0_0_0.s_1 = r_1_1_0_0_0_1;\n }\n {\n S_7e54c7ee memory r_1_1_0_0_0_2;\n {\n S_d29e61bf memory r_1_1_0_0_0_2_0;\n {\n address[3] memory r_1_1_0_0_0_2_0_0;\n {\n address r_1_1_0_0_0_2_0_0_0 = 0x5D636E181B8417a58326e34d561E4070FbD8E178;\n r_1_1_0_0_0_2_0_0[0] = r_1_1_0_0_0_2_0_0_0;\n }\n {\n address r_1_1_0_0_0_2_0_0_1 = 0x3baa6BB0f96eF7ff900f931D00251758415f600E;\n r_1_1_0_0_0_2_0_0[1] = r_1_1_0_0_0_2_0_0_1;\n }\n {\n address r_1_1_0_0_0_2_0_0_2 = 0xbf750a076E3C9035F4cFC383D8083dCA34248c6f;\n r_1_1_0_0_0_2_0_0[2] = r_1_1_0_0_0_2_0_0_2;\n }\n r_1_1_0_0_0_2_0.s_0 = r_1_1_0_0_0_2_0_0;\n }\n {\n bytes22 r_1_1_0_0_0_2_0_1 = bytes22(0x80aedb9fd3b8201fc59d17301d578348184d1bfcc3a6);\n r_1_1_0_0_0_2_0.s_1 = r_1_1_0_0_0_2_0_1;\n }\n r_1_1_0_0_0_2.s_0 = r_1_1_0_0_0_2_0;\n }\n {\n bytes8 r_1_1_0_0_0_2_1 = bytes8(0xf53f134197ff0ba6);\n r_1_1_0_0_0_2.s_1 = r_1_1_0_0_0_2_1;\n }\n {\n S_a217dd34 memory r_1_1_0_0_0_2_2;\n {\n int128 r_1_1_0_0_0_2_2_0 = -47063988488179439809328724451385541069;\n r_1_1_0_0_0_2_2.s_0 = r_1_1_0_0_0_2_2_0;\n }\n {\n bool r_1_1_0_0_0_2_2_1 = true;\n r_1_1_0_0_0_2_2.s_1 = r_1_1_0_0_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_1_0_0_0_2_2_2;\n {\n string memory r_1_1_0_0_0_2_2_2_0 = unicode\"Moo é🚀M Méo 🚀 éMooo🚀é🚀M🚀oo🚀🚀éoo é🚀MoooM🚀MoooM🚀éoo éo éMMé oé\";\n r_1_1_0_0_0_2_2_2.s_0 = r_1_1_0_0_0_2_2_2_0;\n }\n {\n string memory r_1_1_0_0_0_2_2_2_1 = unicode\"Moo é🚀Moo ooMo 🚀🚀 o 🚀ooo🚀🚀oMMo🚀 oo\";\n r_1_1_0_0_0_2_2_2.s_1 = r_1_1_0_0_0_2_2_2_1;\n }\n {\n string memory r_1_1_0_0_0_2_2_2_2 = unicode\"Moo é🚀o M🚀🚀é oéoo🚀oo🚀 o Mé o🚀MM M🚀éMéoo ooMéo🚀oMM🚀 é MéMéMé \";\n r_1_1_0_0_0_2_2_2.s_2 = r_1_1_0_0_0_2_2_2_2;\n }\n r_1_1_0_0_0_2_2.s_2 = r_1_1_0_0_0_2_2_2;\n }\n {\n address r_1_1_0_0_0_2_2_3 = 0x25A029586837483b82dcC5dbe3630849BD6c78BA;\n r_1_1_0_0_0_2_2.s_3 = r_1_1_0_0_0_2_2_3;\n }\n {\n string memory r_1_1_0_0_0_2_2_4 = unicode\"Moo é🚀éMooMoo🚀🚀M🚀é🚀o🚀ooM o 🚀Méé é 🚀\";\n r_1_1_0_0_0_2_2.s_4 = r_1_1_0_0_0_2_2_4;\n }\n r_1_1_0_0_0_2.s_2 = r_1_1_0_0_0_2_2;\n }\n r_1_1_0_0_0.s_2 = r_1_1_0_0_0_2;\n }\n {\n address r_1_1_0_0_0_3 = 0xA19B175B3399848d4473c4bbE5996aF5C0e165d9;\n r_1_1_0_0_0.s_3 = r_1_1_0_0_0_3;\n }\n {\n bytes7 r_1_1_0_0_0_4 = bytes7(0x578d256e7d3df9);\n r_1_1_0_0_0.s_4 = r_1_1_0_0_0_4;\n }\n r_1_1_0_0.s_0 = r_1_1_0_0_0;\n }\n {\n string memory r_1_1_0_0_1 = unicode\"Moo é🚀ééo🚀ééo\";\n r_1_1_0_0.s_1 = r_1_1_0_0_1;\n }\n {\n int40[2] memory r_1_1_0_0_2;\n {\n int40 r_1_1_0_0_2_0 = -499993156525;\n r_1_1_0_0_2[0] = r_1_1_0_0_2_0;\n }\n {\n int40 r_1_1_0_0_2_1 = -247386515738;\n r_1_1_0_0_2[1] = r_1_1_0_0_2_1;\n }\n r_1_1_0_0.s_2 = r_1_1_0_0_2;\n }\n r_1_1_0[0] = r_1_1_0_0;\n }\n {\n S_6c7af139 memory r_1_1_0_1;\n {\n S_71a4881b memory r_1_1_0_1_0;\n {\n bool r_1_1_0_1_0_0 = true;\n r_1_1_0_1_0.s_0 = r_1_1_0_1_0_0;\n }\n {\n string memory r_1_1_0_1_0_1 = unicode\"Moo é🚀oéooé🚀M\";\n r_1_1_0_1_0.s_1 = r_1_1_0_1_0_1;\n }\n {\n S_7e54c7ee memory r_1_1_0_1_0_2;\n {\n S_d29e61bf memory r_1_1_0_1_0_2_0;\n {\n address[3] memory r_1_1_0_1_0_2_0_0;\n {\n address r_1_1_0_1_0_2_0_0_0 = 0xa4802F649bC5834De9DfeAcC9766d4ff9207e408;\n r_1_1_0_1_0_2_0_0[0] = r_1_1_0_1_0_2_0_0_0;\n }\n {\n address r_1_1_0_1_0_2_0_0_1 = 0x160909344d5C144B7F502d868C24A41f96e0fD53;\n r_1_1_0_1_0_2_0_0[1] = r_1_1_0_1_0_2_0_0_1;\n }\n {\n address r_1_1_0_1_0_2_0_0_2 = 0x8BefD74625fbeB828f03F583fB8004Cf836985C1;\n r_1_1_0_1_0_2_0_0[2] = r_1_1_0_1_0_2_0_0_2;\n }\n r_1_1_0_1_0_2_0.s_0 = r_1_1_0_1_0_2_0_0;\n }\n {\n bytes22 r_1_1_0_1_0_2_0_1 = bytes22(0x95841e588dafb0c7c847aeed0a0ad6710eff930f55ee);\n r_1_1_0_1_0_2_0.s_1 = r_1_1_0_1_0_2_0_1;\n }\n r_1_1_0_1_0_2.s_0 = r_1_1_0_1_0_2_0;\n }\n {\n bytes8 r_1_1_0_1_0_2_1 = bytes8(0x5a4c00cd7a9721ca);\n r_1_1_0_1_0_2.s_1 = r_1_1_0_1_0_2_1;\n }\n {\n S_a217dd34 memory r_1_1_0_1_0_2_2;\n {\n int128 r_1_1_0_1_0_2_2_0 = 63624728085155674815414656595645876392;\n r_1_1_0_1_0_2_2.s_0 = r_1_1_0_1_0_2_2_0;\n }\n {\n bool r_1_1_0_1_0_2_2_1 = true;\n r_1_1_0_1_0_2_2.s_1 = r_1_1_0_1_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_1_0_1_0_2_2_2;\n {\n string memory r_1_1_0_1_0_2_2_2_0 = unicode\"Moo é🚀 🚀o🚀 M🚀🚀é M é🚀éMM o ééM\";\n r_1_1_0_1_0_2_2_2.s_0 = r_1_1_0_1_0_2_2_2_0;\n }\n {\n string memory r_1_1_0_1_0_2_2_2_1 = unicode\"Moo é🚀éoM 🚀🚀oMMMoooMM🚀ééMM oo ooo é🚀éoMMoé\";\n r_1_1_0_1_0_2_2_2.s_1 = r_1_1_0_1_0_2_2_2_1;\n }\n {\n string memory r_1_1_0_1_0_2_2_2_2 = unicode\"Moo é🚀MééoM o🚀oM🚀oooM 🚀M Mo Méo ooéé🚀ooM\";\n r_1_1_0_1_0_2_2_2.s_2 = r_1_1_0_1_0_2_2_2_2;\n }\n r_1_1_0_1_0_2_2.s_2 = r_1_1_0_1_0_2_2_2;\n }\n {\n address r_1_1_0_1_0_2_2_3 = 0xebd39a65B78c03b3D2ADD73F4E8D2273c1DB7106;\n r_1_1_0_1_0_2_2.s_3 = r_1_1_0_1_0_2_2_3;\n }\n {\n string memory r_1_1_0_1_0_2_2_4 = unicode\"Moo é🚀o🚀o é oM🚀Moéé M 🚀🚀o éooéM🚀🚀M o🚀MoMoéoéoo🚀\";\n r_1_1_0_1_0_2_2.s_4 = r_1_1_0_1_0_2_2_4;\n }\n r_1_1_0_1_0_2.s_2 = r_1_1_0_1_0_2_2;\n }\n r_1_1_0_1_0.s_2 = r_1_1_0_1_0_2;\n }\n {\n address r_1_1_0_1_0_3 = 0xa4c2D29CD36d5B885bb649dCeC0a663CB1de37b0;\n r_1_1_0_1_0.s_3 = r_1_1_0_1_0_3;\n }\n {\n bytes7 r_1_1_0_1_0_4 = bytes7(0xd040e3305117e6);\n r_1_1_0_1_0.s_4 = r_1_1_0_1_0_4;\n }\n r_1_1_0_1.s_0 = r_1_1_0_1_0;\n }\n {\n string memory r_1_1_0_1_1 = unicode\"Moo é🚀ooééoM o🚀M Mooé🚀\";\n r_1_1_0_1.s_1 = r_1_1_0_1_1;\n }\n {\n int40[2] memory r_1_1_0_1_2;\n {\n int40 r_1_1_0_1_2_0 = 34804187488;\n r_1_1_0_1_2[0] = r_1_1_0_1_2_0;\n }\n {\n int40 r_1_1_0_1_2_1 = -515844725223;\n r_1_1_0_1_2[1] = r_1_1_0_1_2_1;\n }\n r_1_1_0_1.s_2 = r_1_1_0_1_2;\n }\n r_1_1_0[1] = r_1_1_0_1;\n }\n {\n S_6c7af139 memory r_1_1_0_2;\n {\n S_71a4881b memory r_1_1_0_2_0;\n {\n bool r_1_1_0_2_0_0 = false;\n r_1_1_0_2_0.s_0 = r_1_1_0_2_0_0;\n }\n {\n string memory r_1_1_0_2_0_1 = unicode\"Moo é🚀M🚀M éo Mé oéMéé🚀 é\";\n r_1_1_0_2_0.s_1 = r_1_1_0_2_0_1;\n }\n {\n S_7e54c7ee memory r_1_1_0_2_0_2;\n {\n S_d29e61bf memory r_1_1_0_2_0_2_0;\n {\n address[3] memory r_1_1_0_2_0_2_0_0;\n {\n address r_1_1_0_2_0_2_0_0_0 = 0x4D814fB71Bcf5AAD58B2205cAEcf2B8fce94446a;\n r_1_1_0_2_0_2_0_0[0] = r_1_1_0_2_0_2_0_0_0;\n }\n {\n address r_1_1_0_2_0_2_0_0_1 = 0xc5b216cD7c4D9aA71696626656af3C3997543b94;\n r_1_1_0_2_0_2_0_0[1] = r_1_1_0_2_0_2_0_0_1;\n }\n {\n address r_1_1_0_2_0_2_0_0_2 = 0xb4c8197664D834A78fa598544E57bAf061024A8F;\n r_1_1_0_2_0_2_0_0[2] = r_1_1_0_2_0_2_0_0_2;\n }\n r_1_1_0_2_0_2_0.s_0 = r_1_1_0_2_0_2_0_0;\n }\n {\n bytes22 r_1_1_0_2_0_2_0_1 = bytes22(0xda6b9c3f7d2fdd2a79dd85e5ab48059e8971ed48e298);\n r_1_1_0_2_0_2_0.s_1 = r_1_1_0_2_0_2_0_1;\n }\n r_1_1_0_2_0_2.s_0 = r_1_1_0_2_0_2_0;\n }\n {\n bytes8 r_1_1_0_2_0_2_1 = bytes8(0x96068b8ecef5bc60);\n r_1_1_0_2_0_2.s_1 = r_1_1_0_2_0_2_1;\n }\n {\n S_a217dd34 memory r_1_1_0_2_0_2_2;\n {\n int128 r_1_1_0_2_0_2_2_0 = -50414449485213460151355499249196331985;\n r_1_1_0_2_0_2_2.s_0 = r_1_1_0_2_0_2_2_0;\n }\n {\n bool r_1_1_0_2_0_2_2_1 = true;\n r_1_1_0_2_0_2_2.s_1 = r_1_1_0_2_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_1_0_2_0_2_2_2;\n {\n string memory r_1_1_0_2_0_2_2_2_0 = unicode\"Moo é🚀\";\n r_1_1_0_2_0_2_2_2.s_0 = r_1_1_0_2_0_2_2_2_0;\n }\n {\n string memory r_1_1_0_2_0_2_2_2_1 = unicode\"Moo é🚀o🚀🚀oooooo🚀éooMMéoo🚀 🚀🚀o🚀é 🚀éoooM ooM M MM🚀oéé Mo🚀oo\";\n r_1_1_0_2_0_2_2_2.s_1 = r_1_1_0_2_0_2_2_2_1;\n }\n {\n string memory r_1_1_0_2_0_2_2_2_2 = unicode\"Moo é🚀M🚀oé🚀M🚀🚀é\";\n r_1_1_0_2_0_2_2_2.s_2 = r_1_1_0_2_0_2_2_2_2;\n }\n r_1_1_0_2_0_2_2.s_2 = r_1_1_0_2_0_2_2_2;\n }\n {\n address r_1_1_0_2_0_2_2_3 = 0xB0A6522B4eD9821a887f885e76c4087FA266787E;\n r_1_1_0_2_0_2_2.s_3 = r_1_1_0_2_0_2_2_3;\n }\n {\n string memory r_1_1_0_2_0_2_2_4 = unicode\"Moo é🚀oMo🚀 Méé🚀oo🚀🚀o🚀o🚀Mo🚀 🚀éé\";\n r_1_1_0_2_0_2_2.s_4 = r_1_1_0_2_0_2_2_4;\n }\n r_1_1_0_2_0_2.s_2 = r_1_1_0_2_0_2_2;\n }\n r_1_1_0_2_0.s_2 = r_1_1_0_2_0_2;\n }\n {\n address r_1_1_0_2_0_3 = 0xDbfCF080a14358ECDd3DD8d30C698AA16e0845FE;\n r_1_1_0_2_0.s_3 = r_1_1_0_2_0_3;\n }\n {\n bytes7 r_1_1_0_2_0_4 = bytes7(0x982f0841cc90a1);\n r_1_1_0_2_0.s_4 = r_1_1_0_2_0_4;\n }\n r_1_1_0_2.s_0 = r_1_1_0_2_0;\n }\n {\n string memory r_1_1_0_2_1 = unicode\"Moo é🚀oo Mé🚀🚀 M M\";\n r_1_1_0_2.s_1 = r_1_1_0_2_1;\n }\n {\n int40[2] memory r_1_1_0_2_2;\n {\n int40 r_1_1_0_2_2_0 = -213545541656;\n r_1_1_0_2_2[0] = r_1_1_0_2_2_0;\n }\n {\n int40 r_1_1_0_2_2_1 = 296114960907;\n r_1_1_0_2_2[1] = r_1_1_0_2_2_1;\n }\n r_1_1_0_2.s_2 = r_1_1_0_2_2;\n }\n r_1_1_0[2] = r_1_1_0_2;\n }\n {\n S_6c7af139 memory r_1_1_0_3;\n {\n S_71a4881b memory r_1_1_0_3_0;\n {\n bool r_1_1_0_3_0_0 = false;\n r_1_1_0_3_0.s_0 = r_1_1_0_3_0_0;\n }\n {\n string memory r_1_1_0_3_0_1 = unicode\"Moo é🚀é🚀éoMo éM 🚀🚀🚀éMoMooMéoo🚀🚀Mo \";\n r_1_1_0_3_0.s_1 = r_1_1_0_3_0_1;\n }\n {\n S_7e54c7ee memory r_1_1_0_3_0_2;\n {\n S_d29e61bf memory r_1_1_0_3_0_2_0;\n {\n address[3] memory r_1_1_0_3_0_2_0_0;\n {\n address r_1_1_0_3_0_2_0_0_0 = 0x6167eC3F676b54F2842c038Ed55C8fAfa2DF4196;\n r_1_1_0_3_0_2_0_0[0] = r_1_1_0_3_0_2_0_0_0;\n }\n {\n address r_1_1_0_3_0_2_0_0_1 = 0xede5094843deB0795E98c13c57c1B1d26E3b30bb;\n r_1_1_0_3_0_2_0_0[1] = r_1_1_0_3_0_2_0_0_1;\n }\n {\n address r_1_1_0_3_0_2_0_0_2 = 0x368e4cc37E84485479462E3eB131F47F20733104;\n r_1_1_0_3_0_2_0_0[2] = r_1_1_0_3_0_2_0_0_2;\n }\n r_1_1_0_3_0_2_0.s_0 = r_1_1_0_3_0_2_0_0;\n }\n {\n bytes22 r_1_1_0_3_0_2_0_1 = bytes22(0x8eece1fc5d97366349413a277eda09d017d76df51293);\n r_1_1_0_3_0_2_0.s_1 = r_1_1_0_3_0_2_0_1;\n }\n r_1_1_0_3_0_2.s_0 = r_1_1_0_3_0_2_0;\n }\n {\n bytes8 r_1_1_0_3_0_2_1 = bytes8(0x7641870d67c9cd29);\n r_1_1_0_3_0_2.s_1 = r_1_1_0_3_0_2_1;\n }\n {\n S_a217dd34 memory r_1_1_0_3_0_2_2;\n {\n int128 r_1_1_0_3_0_2_2_0 = 141817897536058375490243465516155199593;\n r_1_1_0_3_0_2_2.s_0 = r_1_1_0_3_0_2_2_0;\n }\n {\n bool r_1_1_0_3_0_2_2_1 = true;\n r_1_1_0_3_0_2_2.s_1 = r_1_1_0_3_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_1_0_3_0_2_2_2;\n {\n string memory r_1_1_0_3_0_2_2_2_0 = unicode\"Moo é🚀🚀oéoMooo\";\n r_1_1_0_3_0_2_2_2.s_0 = r_1_1_0_3_0_2_2_2_0;\n }\n {\n string memory r_1_1_0_3_0_2_2_2_1 = unicode\"Moo é🚀ooé🚀ooéo🚀oMM\";\n r_1_1_0_3_0_2_2_2.s_1 = r_1_1_0_3_0_2_2_2_1;\n }\n {\n string memory r_1_1_0_3_0_2_2_2_2 = unicode\"Moo é🚀MMoMMo 🚀🚀oéooééMMoo MM\";\n r_1_1_0_3_0_2_2_2.s_2 = r_1_1_0_3_0_2_2_2_2;\n }\n r_1_1_0_3_0_2_2.s_2 = r_1_1_0_3_0_2_2_2;\n }\n {\n address r_1_1_0_3_0_2_2_3 = 0xcc448419B619D7Cc59d447F8C0B0fC5A3cC100F4;\n r_1_1_0_3_0_2_2.s_3 = r_1_1_0_3_0_2_2_3;\n }\n {\n string memory r_1_1_0_3_0_2_2_4 = unicode\"Moo é🚀\";\n r_1_1_0_3_0_2_2.s_4 = r_1_1_0_3_0_2_2_4;\n }\n r_1_1_0_3_0_2.s_2 = r_1_1_0_3_0_2_2;\n }\n r_1_1_0_3_0.s_2 = r_1_1_0_3_0_2;\n }\n {\n address r_1_1_0_3_0_3 = 0x1763d060B32aAfA02a6F6cA499038a0e928477b8;\n r_1_1_0_3_0.s_3 = r_1_1_0_3_0_3;\n }\n {\n bytes7 r_1_1_0_3_0_4 = bytes7(0x41fdae2306fba3);\n r_1_1_0_3_0.s_4 = r_1_1_0_3_0_4;\n }\n r_1_1_0_3.s_0 = r_1_1_0_3_0;\n }\n {\n string memory r_1_1_0_3_1 = unicode\"Moo é🚀MMo 🚀oMMéoMoM🚀MooMéo🚀M🚀Mo o\";\n r_1_1_0_3.s_1 = r_1_1_0_3_1;\n }\n {\n int40[2] memory r_1_1_0_3_2;\n {\n int40 r_1_1_0_3_2_0 = -257060915571;\n r_1_1_0_3_2[0] = r_1_1_0_3_2_0;\n }\n {\n int40 r_1_1_0_3_2_1 = 53125257302;\n r_1_1_0_3_2[1] = r_1_1_0_3_2_1;\n }\n r_1_1_0_3.s_2 = r_1_1_0_3_2;\n }\n r_1_1_0[3] = r_1_1_0_3;\n }\n r_1_1[0] = r_1_1_0;\n }\n r_1[1] = r_1_1;\n }\n {\n S_6c7af139[4][1] memory r_1_2;\n {\n S_6c7af139[4] memory r_1_2_0;\n {\n S_6c7af139 memory r_1_2_0_0;\n {\n S_71a4881b memory r_1_2_0_0_0;\n {\n bool r_1_2_0_0_0_0 = false;\n r_1_2_0_0_0.s_0 = r_1_2_0_0_0_0;\n }\n {\n string memory r_1_2_0_0_0_1 = unicode\"Moo é🚀🚀🚀ooMM🚀MééMoM\";\n r_1_2_0_0_0.s_1 = r_1_2_0_0_0_1;\n }\n {\n S_7e54c7ee memory r_1_2_0_0_0_2;\n {\n S_d29e61bf memory r_1_2_0_0_0_2_0;\n {\n address[3] memory r_1_2_0_0_0_2_0_0;\n {\n address r_1_2_0_0_0_2_0_0_0 = 0x71D355DE0dd118fF156dF8517E39E2ABbabA438f;\n r_1_2_0_0_0_2_0_0[0] = r_1_2_0_0_0_2_0_0_0;\n }\n {\n address r_1_2_0_0_0_2_0_0_1 = 0xaF35671f099B913fDd8AE97CF60b827c179BDA34;\n r_1_2_0_0_0_2_0_0[1] = r_1_2_0_0_0_2_0_0_1;\n }\n {\n address r_1_2_0_0_0_2_0_0_2 = 0xBc2472868D038A4b170BA6D333cE75c8025c376D;\n r_1_2_0_0_0_2_0_0[2] = r_1_2_0_0_0_2_0_0_2;\n }\n r_1_2_0_0_0_2_0.s_0 = r_1_2_0_0_0_2_0_0;\n }\n {\n bytes22 r_1_2_0_0_0_2_0_1 = bytes22(0x91c7bf133651fdee8746dbcc8859d376ce10083b9b4d);\n r_1_2_0_0_0_2_0.s_1 = r_1_2_0_0_0_2_0_1;\n }\n r_1_2_0_0_0_2.s_0 = r_1_2_0_0_0_2_0;\n }\n {\n bytes8 r_1_2_0_0_0_2_1 = bytes8(0x5eb60976e4fee44b);\n r_1_2_0_0_0_2.s_1 = r_1_2_0_0_0_2_1;\n }\n {\n S_a217dd34 memory r_1_2_0_0_0_2_2;\n {\n int128 r_1_2_0_0_0_2_2_0 = 146040914452404139636133140323314417802;\n r_1_2_0_0_0_2_2.s_0 = r_1_2_0_0_0_2_2_0;\n }\n {\n bool r_1_2_0_0_0_2_2_1 = true;\n r_1_2_0_0_0_2_2.s_1 = r_1_2_0_0_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_2_0_0_0_2_2_2;\n {\n string memory r_1_2_0_0_0_2_2_2_0 = unicode\"Moo é🚀oMoé Méoéoé o oéo 🚀 o MéMoooMMM MMMoo🚀éM oo o o\";\n r_1_2_0_0_0_2_2_2.s_0 = r_1_2_0_0_0_2_2_2_0;\n }\n {\n string memory r_1_2_0_0_0_2_2_2_1 = unicode\"Moo é🚀🚀é🚀MMMoooo🚀🚀M 🚀oooéMo\";\n r_1_2_0_0_0_2_2_2.s_1 = r_1_2_0_0_0_2_2_2_1;\n }\n {\n string memory r_1_2_0_0_0_2_2_2_2 = unicode\"Moo é🚀 o🚀 éoéM🚀o MéoMoéoM 🚀 éMoMéé🚀éMMooooMéMéoMMo o\";\n r_1_2_0_0_0_2_2_2.s_2 = r_1_2_0_0_0_2_2_2_2;\n }\n r_1_2_0_0_0_2_2.s_2 = r_1_2_0_0_0_2_2_2;\n }\n {\n address r_1_2_0_0_0_2_2_3 = 0x7d84272a441212743f7FBA0a6083e125F48d5Edc;\n r_1_2_0_0_0_2_2.s_3 = r_1_2_0_0_0_2_2_3;\n }\n {\n string memory r_1_2_0_0_0_2_2_4 = unicode\"Moo é🚀oooMM🚀oMo oé🚀oé🚀é🚀M\";\n r_1_2_0_0_0_2_2.s_4 = r_1_2_0_0_0_2_2_4;\n }\n r_1_2_0_0_0_2.s_2 = r_1_2_0_0_0_2_2;\n }\n r_1_2_0_0_0.s_2 = r_1_2_0_0_0_2;\n }\n {\n address r_1_2_0_0_0_3 = 0x7581B289936f63c693753b2eB8D2322d55401FEE;\n r_1_2_0_0_0.s_3 = r_1_2_0_0_0_3;\n }\n {\n bytes7 r_1_2_0_0_0_4 = bytes7(0xf76707081f9811);\n r_1_2_0_0_0.s_4 = r_1_2_0_0_0_4;\n }\n r_1_2_0_0.s_0 = r_1_2_0_0_0;\n }\n {\n string memory r_1_2_0_0_1 = unicode\"Moo é🚀Mooooo🚀 oo🚀\";\n r_1_2_0_0.s_1 = r_1_2_0_0_1;\n }\n {\n int40[2] memory r_1_2_0_0_2;\n {\n int40 r_1_2_0_0_2_0 = -418950882776;\n r_1_2_0_0_2[0] = r_1_2_0_0_2_0;\n }\n {\n int40 r_1_2_0_0_2_1 = 524829848999;\n r_1_2_0_0_2[1] = r_1_2_0_0_2_1;\n }\n r_1_2_0_0.s_2 = r_1_2_0_0_2;\n }\n r_1_2_0[0] = r_1_2_0_0;\n }\n {\n S_6c7af139 memory r_1_2_0_1;\n {\n S_71a4881b memory r_1_2_0_1_0;\n {\n bool r_1_2_0_1_0_0 = false;\n r_1_2_0_1_0.s_0 = r_1_2_0_1_0_0;\n }\n {\n string memory r_1_2_0_1_0_1 = unicode\"Moo é🚀🚀ooo oMéé é\";\n r_1_2_0_1_0.s_1 = r_1_2_0_1_0_1;\n }\n {\n S_7e54c7ee memory r_1_2_0_1_0_2;\n {\n S_d29e61bf memory r_1_2_0_1_0_2_0;\n {\n address[3] memory r_1_2_0_1_0_2_0_0;\n {\n address r_1_2_0_1_0_2_0_0_0 = 0xef39293a07717FCEE87E558F66a69f22a90E716b;\n r_1_2_0_1_0_2_0_0[0] = r_1_2_0_1_0_2_0_0_0;\n }\n {\n address r_1_2_0_1_0_2_0_0_1 = 0xd3238bc068d5469Faae53fe61e3D28809CAA273b;\n r_1_2_0_1_0_2_0_0[1] = r_1_2_0_1_0_2_0_0_1;\n }\n {\n address r_1_2_0_1_0_2_0_0_2 = 0x1D670fE466711115EFa20cb297D5c0421D859389;\n r_1_2_0_1_0_2_0_0[2] = r_1_2_0_1_0_2_0_0_2;\n }\n r_1_2_0_1_0_2_0.s_0 = r_1_2_0_1_0_2_0_0;\n }\n {\n bytes22 r_1_2_0_1_0_2_0_1 = bytes22(0x958cb3ac8dc7bce8effc6ad24659ff19b9674d94e766);\n r_1_2_0_1_0_2_0.s_1 = r_1_2_0_1_0_2_0_1;\n }\n r_1_2_0_1_0_2.s_0 = r_1_2_0_1_0_2_0;\n }\n {\n bytes8 r_1_2_0_1_0_2_1 = bytes8(0x8b04ef97822e828b);\n r_1_2_0_1_0_2.s_1 = r_1_2_0_1_0_2_1;\n }\n {\n S_a217dd34 memory r_1_2_0_1_0_2_2;\n {\n int128 r_1_2_0_1_0_2_2_0 = -854946371447721398857650813844016249;\n r_1_2_0_1_0_2_2.s_0 = r_1_2_0_1_0_2_2_0;\n }\n {\n bool r_1_2_0_1_0_2_2_1 = true;\n r_1_2_0_1_0_2_2.s_1 = r_1_2_0_1_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_2_0_1_0_2_2_2;\n {\n string memory r_1_2_0_1_0_2_2_2_0 = unicode\"Moo é🚀o🚀o🚀oéoooM🚀éooé🚀🚀 🚀oo oo 🚀🚀🚀oooooéo oMoM\";\n r_1_2_0_1_0_2_2_2.s_0 = r_1_2_0_1_0_2_2_2_0;\n }\n {\n string memory r_1_2_0_1_0_2_2_2_1 = unicode\"Moo é🚀é🚀Mo🚀o Méoo🚀🚀oo 🚀oéo🚀ooMo\";\n r_1_2_0_1_0_2_2_2.s_1 = r_1_2_0_1_0_2_2_2_1;\n }\n {\n string memory r_1_2_0_1_0_2_2_2_2 = unicode\"Moo é🚀🚀🚀 oM oM Moé 🚀oéoé🚀Mo🚀🚀🚀 MooéooMo🚀🚀ooooo \";\n r_1_2_0_1_0_2_2_2.s_2 = r_1_2_0_1_0_2_2_2_2;\n }\n r_1_2_0_1_0_2_2.s_2 = r_1_2_0_1_0_2_2_2;\n }\n {\n address r_1_2_0_1_0_2_2_3 = 0xee59E04DA840532e07D3059d3858fA7955B91204;\n r_1_2_0_1_0_2_2.s_3 = r_1_2_0_1_0_2_2_3;\n }\n {\n string memory r_1_2_0_1_0_2_2_4 = unicode\"Moo é🚀éoMo🚀é🚀oé\";\n r_1_2_0_1_0_2_2.s_4 = r_1_2_0_1_0_2_2_4;\n }\n r_1_2_0_1_0_2.s_2 = r_1_2_0_1_0_2_2;\n }\n r_1_2_0_1_0.s_2 = r_1_2_0_1_0_2;\n }\n {\n address r_1_2_0_1_0_3 = 0xd44dF1CF962948F082fe43Ed2b01f49dCf99f3d0;\n r_1_2_0_1_0.s_3 = r_1_2_0_1_0_3;\n }\n {\n bytes7 r_1_2_0_1_0_4 = bytes7(0x1fa12715f29770);\n r_1_2_0_1_0.s_4 = r_1_2_0_1_0_4;\n }\n r_1_2_0_1.s_0 = r_1_2_0_1_0;\n }\n {\n string memory r_1_2_0_1_1 = unicode\"Moo é🚀🚀 é🚀o🚀ééooo🚀éooMooéo M oé🚀o🚀ooMMéoMMé🚀 \";\n r_1_2_0_1.s_1 = r_1_2_0_1_1;\n }\n {\n int40[2] memory r_1_2_0_1_2;\n {\n int40 r_1_2_0_1_2_0 = -315319918186;\n r_1_2_0_1_2[0] = r_1_2_0_1_2_0;\n }\n {\n int40 r_1_2_0_1_2_1 = -268249708440;\n r_1_2_0_1_2[1] = r_1_2_0_1_2_1;\n }\n r_1_2_0_1.s_2 = r_1_2_0_1_2;\n }\n r_1_2_0[1] = r_1_2_0_1;\n }\n {\n S_6c7af139 memory r_1_2_0_2;\n {\n S_71a4881b memory r_1_2_0_2_0;\n {\n bool r_1_2_0_2_0_0 = false;\n r_1_2_0_2_0.s_0 = r_1_2_0_2_0_0;\n }\n {\n string memory r_1_2_0_2_0_1 = unicode\"Moo é🚀oééoMMMéoéoMo🚀 oo🚀o\";\n r_1_2_0_2_0.s_1 = r_1_2_0_2_0_1;\n }\n {\n S_7e54c7ee memory r_1_2_0_2_0_2;\n {\n S_d29e61bf memory r_1_2_0_2_0_2_0;\n {\n address[3] memory r_1_2_0_2_0_2_0_0;\n {\n address r_1_2_0_2_0_2_0_0_0 = 0x59D6F42DB099CE0D55a6B7C4a983AbdEB6497920;\n r_1_2_0_2_0_2_0_0[0] = r_1_2_0_2_0_2_0_0_0;\n }\n {\n address r_1_2_0_2_0_2_0_0_1 = 0xa802b1028dca6c4dbf1e2c15E8979d874BEB86b9;\n r_1_2_0_2_0_2_0_0[1] = r_1_2_0_2_0_2_0_0_1;\n }\n {\n address r_1_2_0_2_0_2_0_0_2 = 0xdb0BF0FeD7b4f4EBb2841cD9a680525bb6a190cD;\n r_1_2_0_2_0_2_0_0[2] = r_1_2_0_2_0_2_0_0_2;\n }\n r_1_2_0_2_0_2_0.s_0 = r_1_2_0_2_0_2_0_0;\n }\n {\n bytes22 r_1_2_0_2_0_2_0_1 = bytes22(0x701aeb0598026806cf2e547cbdff02a87709fc37b759);\n r_1_2_0_2_0_2_0.s_1 = r_1_2_0_2_0_2_0_1;\n }\n r_1_2_0_2_0_2.s_0 = r_1_2_0_2_0_2_0;\n }\n {\n bytes8 r_1_2_0_2_0_2_1 = bytes8(0xb64d9f88ff5e1100);\n r_1_2_0_2_0_2.s_1 = r_1_2_0_2_0_2_1;\n }\n {\n S_a217dd34 memory r_1_2_0_2_0_2_2;\n {\n int128 r_1_2_0_2_0_2_2_0 = 2448348339561654361231214220456131733;\n r_1_2_0_2_0_2_2.s_0 = r_1_2_0_2_0_2_2_0;\n }\n {\n bool r_1_2_0_2_0_2_2_1 = true;\n r_1_2_0_2_0_2_2.s_1 = r_1_2_0_2_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_2_0_2_0_2_2_2;\n {\n string memory r_1_2_0_2_0_2_2_2_0 = unicode\"Moo é🚀\";\n r_1_2_0_2_0_2_2_2.s_0 = r_1_2_0_2_0_2_2_2_0;\n }\n {\n string memory r_1_2_0_2_0_2_2_2_1 = unicode\"Moo é🚀o🚀éMéM M ééo🚀M oooo🚀🚀ooo o🚀o\";\n r_1_2_0_2_0_2_2_2.s_1 = r_1_2_0_2_0_2_2_2_1;\n }\n {\n string memory r_1_2_0_2_0_2_2_2_2 = unicode\"Moo é🚀 o🚀éM🚀 🚀 oM🚀M🚀éMéM🚀o🚀ooo MMo é Mooéoéé\";\n r_1_2_0_2_0_2_2_2.s_2 = r_1_2_0_2_0_2_2_2_2;\n }\n r_1_2_0_2_0_2_2.s_2 = r_1_2_0_2_0_2_2_2;\n }\n {\n address r_1_2_0_2_0_2_2_3 = 0x0F968351013E54160E680D2312eee75B42509FcA;\n r_1_2_0_2_0_2_2.s_3 = r_1_2_0_2_0_2_2_3;\n }\n {\n string memory r_1_2_0_2_0_2_2_4 = unicode\"Moo é🚀MéM M ooé\";\n r_1_2_0_2_0_2_2.s_4 = r_1_2_0_2_0_2_2_4;\n }\n r_1_2_0_2_0_2.s_2 = r_1_2_0_2_0_2_2;\n }\n r_1_2_0_2_0.s_2 = r_1_2_0_2_0_2;\n }\n {\n address r_1_2_0_2_0_3 = 0x8E93fe3045Ce3429Ff3eF8592616FC2C252CcFa0;\n r_1_2_0_2_0.s_3 = r_1_2_0_2_0_3;\n }\n {\n bytes7 r_1_2_0_2_0_4 = bytes7(0x5e64ddf75b0de8);\n r_1_2_0_2_0.s_4 = r_1_2_0_2_0_4;\n }\n r_1_2_0_2.s_0 = r_1_2_0_2_0;\n }\n {\n string memory r_1_2_0_2_1 = unicode\"Moo é🚀ééooo oééoMMéoo 🚀ooM🚀M\";\n r_1_2_0_2.s_1 = r_1_2_0_2_1;\n }\n {\n int40[2] memory r_1_2_0_2_2;\n {\n int40 r_1_2_0_2_2_0 = 8230283030;\n r_1_2_0_2_2[0] = r_1_2_0_2_2_0;\n }\n {\n int40 r_1_2_0_2_2_1 = -208070293378;\n r_1_2_0_2_2[1] = r_1_2_0_2_2_1;\n }\n r_1_2_0_2.s_2 = r_1_2_0_2_2;\n }\n r_1_2_0[2] = r_1_2_0_2;\n }\n {\n S_6c7af139 memory r_1_2_0_3;\n {\n S_71a4881b memory r_1_2_0_3_0;\n {\n bool r_1_2_0_3_0_0 = false;\n r_1_2_0_3_0.s_0 = r_1_2_0_3_0_0;\n }\n {\n string memory r_1_2_0_3_0_1 = unicode\"Moo é🚀M ooo oMMéo 🚀🚀\";\n r_1_2_0_3_0.s_1 = r_1_2_0_3_0_1;\n }\n {\n S_7e54c7ee memory r_1_2_0_3_0_2;\n {\n S_d29e61bf memory r_1_2_0_3_0_2_0;\n {\n address[3] memory r_1_2_0_3_0_2_0_0;\n {\n address r_1_2_0_3_0_2_0_0_0 = 0xe8be8845Fb6017ceDb280dD3f6aF7d03b747D95e;\n r_1_2_0_3_0_2_0_0[0] = r_1_2_0_3_0_2_0_0_0;\n }\n {\n address r_1_2_0_3_0_2_0_0_1 = 0x4E5f05c11e461D34bA1AD53433A2F238a29f9Afc;\n r_1_2_0_3_0_2_0_0[1] = r_1_2_0_3_0_2_0_0_1;\n }\n {\n address r_1_2_0_3_0_2_0_0_2 = 0x716F35acAb14eC52DaA0Dd6b036A74C2851c2569;\n r_1_2_0_3_0_2_0_0[2] = r_1_2_0_3_0_2_0_0_2;\n }\n r_1_2_0_3_0_2_0.s_0 = r_1_2_0_3_0_2_0_0;\n }\n {\n bytes22 r_1_2_0_3_0_2_0_1 = bytes22(0x2dcb459c57ae870b8188f72c18bf037001df04c45543);\n r_1_2_0_3_0_2_0.s_1 = r_1_2_0_3_0_2_0_1;\n }\n r_1_2_0_3_0_2.s_0 = r_1_2_0_3_0_2_0;\n }\n {\n bytes8 r_1_2_0_3_0_2_1 = bytes8(0x11c71a1e5adf3682);\n r_1_2_0_3_0_2.s_1 = r_1_2_0_3_0_2_1;\n }\n {\n S_a217dd34 memory r_1_2_0_3_0_2_2;\n {\n int128 r_1_2_0_3_0_2_2_0 = -128872963893010848526820829214143625467;\n r_1_2_0_3_0_2_2.s_0 = r_1_2_0_3_0_2_2_0;\n }\n {\n bool r_1_2_0_3_0_2_2_1 = true;\n r_1_2_0_3_0_2_2.s_1 = r_1_2_0_3_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_2_0_3_0_2_2_2;\n {\n string memory r_1_2_0_3_0_2_2_2_0 = unicode\"Moo é🚀 é éé\";\n r_1_2_0_3_0_2_2_2.s_0 = r_1_2_0_3_0_2_2_2_0;\n }\n {\n string memory r_1_2_0_3_0_2_2_2_1 = unicode\"Moo é🚀🚀Méé🚀🚀o é é éoéoé🚀 🚀MoMooéo🚀ooo o🚀 Mo🚀oéMé🚀 M🚀\";\n r_1_2_0_3_0_2_2_2.s_1 = r_1_2_0_3_0_2_2_2_1;\n }\n {\n string memory r_1_2_0_3_0_2_2_2_2 = unicode\"Moo é🚀M🚀ooé \";\n r_1_2_0_3_0_2_2_2.s_2 = r_1_2_0_3_0_2_2_2_2;\n }\n r_1_2_0_3_0_2_2.s_2 = r_1_2_0_3_0_2_2_2;\n }\n {\n address r_1_2_0_3_0_2_2_3 = 0xf4558561Cae05DF23d50573B375e1b8f2610222F;\n r_1_2_0_3_0_2_2.s_3 = r_1_2_0_3_0_2_2_3;\n }\n {\n string memory r_1_2_0_3_0_2_2_4 = unicode\"Moo é🚀éooéo🚀 🚀éooMMo🚀oMéo🚀oéooMoooo 🚀oMéoMMM ooo🚀o ooo é o\";\n r_1_2_0_3_0_2_2.s_4 = r_1_2_0_3_0_2_2_4;\n }\n r_1_2_0_3_0_2.s_2 = r_1_2_0_3_0_2_2;\n }\n r_1_2_0_3_0.s_2 = r_1_2_0_3_0_2;\n }\n {\n address r_1_2_0_3_0_3 = 0x02c240A608B92428c196A55861DB5C15cF4989cb;\n r_1_2_0_3_0.s_3 = r_1_2_0_3_0_3;\n }\n {\n bytes7 r_1_2_0_3_0_4 = bytes7(0xbbe2d06698156b);\n r_1_2_0_3_0.s_4 = r_1_2_0_3_0_4;\n }\n r_1_2_0_3.s_0 = r_1_2_0_3_0;\n }\n {\n string memory r_1_2_0_3_1 = unicode\"Moo é🚀M 🚀 oo🚀é🚀éoé éMM\";\n r_1_2_0_3.s_1 = r_1_2_0_3_1;\n }\n {\n int40[2] memory r_1_2_0_3_2;\n {\n int40 r_1_2_0_3_2_0 = -405381587136;\n r_1_2_0_3_2[0] = r_1_2_0_3_2_0;\n }\n {\n int40 r_1_2_0_3_2_1 = 296350960436;\n r_1_2_0_3_2[1] = r_1_2_0_3_2_1;\n }\n r_1_2_0_3.s_2 = r_1_2_0_3_2;\n }\n r_1_2_0[3] = r_1_2_0_3;\n }\n r_1_2[0] = r_1_2_0;\n }\n r_1[2] = r_1_2;\n }\n {\n S_6c7af139[4][1] memory r_1_3;\n {\n S_6c7af139[4] memory r_1_3_0;\n {\n S_6c7af139 memory r_1_3_0_0;\n {\n S_71a4881b memory r_1_3_0_0_0;\n {\n bool r_1_3_0_0_0_0 = false;\n r_1_3_0_0_0.s_0 = r_1_3_0_0_0_0;\n }\n {\n string memory r_1_3_0_0_0_1 = unicode\"Moo é🚀o\";\n r_1_3_0_0_0.s_1 = r_1_3_0_0_0_1;\n }\n {\n S_7e54c7ee memory r_1_3_0_0_0_2;\n {\n S_d29e61bf memory r_1_3_0_0_0_2_0;\n {\n address[3] memory r_1_3_0_0_0_2_0_0;\n {\n address r_1_3_0_0_0_2_0_0_0 = 0x0271A9f08b096f13F15615Bf3abFBA63A3835228;\n r_1_3_0_0_0_2_0_0[0] = r_1_3_0_0_0_2_0_0_0;\n }\n {\n address r_1_3_0_0_0_2_0_0_1 = 0x57CAA879D4EeC37000334f29dDcFc6EACe9C9054;\n r_1_3_0_0_0_2_0_0[1] = r_1_3_0_0_0_2_0_0_1;\n }\n {\n address r_1_3_0_0_0_2_0_0_2 = 0x70E88A662Cb1688Ad5afe3d51701acE53c89F5b2;\n r_1_3_0_0_0_2_0_0[2] = r_1_3_0_0_0_2_0_0_2;\n }\n r_1_3_0_0_0_2_0.s_0 = r_1_3_0_0_0_2_0_0;\n }\n {\n bytes22 r_1_3_0_0_0_2_0_1 = bytes22(0xcdaa21752004534fafae55be67ecb8fd35fa4f92272c);\n r_1_3_0_0_0_2_0.s_1 = r_1_3_0_0_0_2_0_1;\n }\n r_1_3_0_0_0_2.s_0 = r_1_3_0_0_0_2_0;\n }\n {\n bytes8 r_1_3_0_0_0_2_1 = bytes8(0xf70538f14abc419f);\n r_1_3_0_0_0_2.s_1 = r_1_3_0_0_0_2_1;\n }\n {\n S_a217dd34 memory r_1_3_0_0_0_2_2;\n {\n int128 r_1_3_0_0_0_2_2_0 = -74770074349806728544199440763260947058;\n r_1_3_0_0_0_2_2.s_0 = r_1_3_0_0_0_2_2_0;\n }\n {\n bool r_1_3_0_0_0_2_2_1 = false;\n r_1_3_0_0_0_2_2.s_1 = r_1_3_0_0_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_3_0_0_0_2_2_2;\n {\n string memory r_1_3_0_0_0_2_2_2_0 = unicode\"Moo é🚀éooM\";\n r_1_3_0_0_0_2_2_2.s_0 = r_1_3_0_0_0_2_2_2_0;\n }\n {\n string memory r_1_3_0_0_0_2_2_2_1 = unicode\"Moo é🚀 🚀🚀 Moo🚀🚀Mé o Mé🚀 oM o o🚀🚀M🚀MoééM o🚀 é🚀oooMM🚀o MM🚀🚀é 🚀🚀\";\n r_1_3_0_0_0_2_2_2.s_1 = r_1_3_0_0_0_2_2_2_1;\n }\n {\n string memory r_1_3_0_0_0_2_2_2_2 = unicode\"Moo é🚀 o é é🚀Mo M\";\n r_1_3_0_0_0_2_2_2.s_2 = r_1_3_0_0_0_2_2_2_2;\n }\n r_1_3_0_0_0_2_2.s_2 = r_1_3_0_0_0_2_2_2;\n }\n {\n address r_1_3_0_0_0_2_2_3 = 0x811D981e7dbe6f80727285343906aa50bE657Ae2;\n r_1_3_0_0_0_2_2.s_3 = r_1_3_0_0_0_2_2_3;\n }\n {\n string memory r_1_3_0_0_0_2_2_4 = unicode\"Moo é🚀o ooéo MoM🚀 🚀éo oM🚀🚀 éo ooooMoo éMo🚀oo🚀éo🚀🚀oo\";\n r_1_3_0_0_0_2_2.s_4 = r_1_3_0_0_0_2_2_4;\n }\n r_1_3_0_0_0_2.s_2 = r_1_3_0_0_0_2_2;\n }\n r_1_3_0_0_0.s_2 = r_1_3_0_0_0_2;\n }\n {\n address r_1_3_0_0_0_3 = 0x2dD9b0B8Ea3F36f15eAdA31DE8493717073AA5dC;\n r_1_3_0_0_0.s_3 = r_1_3_0_0_0_3;\n }\n {\n bytes7 r_1_3_0_0_0_4 = bytes7(0x086cdf87df18c2);\n r_1_3_0_0_0.s_4 = r_1_3_0_0_0_4;\n }\n r_1_3_0_0.s_0 = r_1_3_0_0_0;\n }\n {\n string memory r_1_3_0_0_1 = unicode\"Moo é🚀o🚀o🚀oM \";\n r_1_3_0_0.s_1 = r_1_3_0_0_1;\n }\n {\n int40[2] memory r_1_3_0_0_2;\n {\n int40 r_1_3_0_0_2_0 = 13319631627;\n r_1_3_0_0_2[0] = r_1_3_0_0_2_0;\n }\n {\n int40 r_1_3_0_0_2_1 = -337173007305;\n r_1_3_0_0_2[1] = r_1_3_0_0_2_1;\n }\n r_1_3_0_0.s_2 = r_1_3_0_0_2;\n }\n r_1_3_0[0] = r_1_3_0_0;\n }\n {\n S_6c7af139 memory r_1_3_0_1;\n {\n S_71a4881b memory r_1_3_0_1_0;\n {\n bool r_1_3_0_1_0_0 = true;\n r_1_3_0_1_0.s_0 = r_1_3_0_1_0_0;\n }\n {\n string memory r_1_3_0_1_0_1 = unicode\"Moo é🚀🚀MMéoé Moo M🚀 oMoéoo🚀 oéMéo🚀 Moéooéoooéooooé🚀🚀 o \";\n r_1_3_0_1_0.s_1 = r_1_3_0_1_0_1;\n }\n {\n S_7e54c7ee memory r_1_3_0_1_0_2;\n {\n S_d29e61bf memory r_1_3_0_1_0_2_0;\n {\n address[3] memory r_1_3_0_1_0_2_0_0;\n {\n address r_1_3_0_1_0_2_0_0_0 = 0xe14CC5dbF416a76d7A606B0C4eF726c01425Dbe1;\n r_1_3_0_1_0_2_0_0[0] = r_1_3_0_1_0_2_0_0_0;\n }\n {\n address r_1_3_0_1_0_2_0_0_1 = 0xD58a1D35359A2860592D29Ba3DFa0b9fbD52F76A;\n r_1_3_0_1_0_2_0_0[1] = r_1_3_0_1_0_2_0_0_1;\n }\n {\n address r_1_3_0_1_0_2_0_0_2 = 0xBc7B421A3c1f8E0283007835e4F809E7423F0816;\n r_1_3_0_1_0_2_0_0[2] = r_1_3_0_1_0_2_0_0_2;\n }\n r_1_3_0_1_0_2_0.s_0 = r_1_3_0_1_0_2_0_0;\n }\n {\n bytes22 r_1_3_0_1_0_2_0_1 = bytes22(0xdf78fb020870422a9dfd196ef4cdc059e18bc6c6e3c2);\n r_1_3_0_1_0_2_0.s_1 = r_1_3_0_1_0_2_0_1;\n }\n r_1_3_0_1_0_2.s_0 = r_1_3_0_1_0_2_0;\n }\n {\n bytes8 r_1_3_0_1_0_2_1 = bytes8(0x37104cd607a25215);\n r_1_3_0_1_0_2.s_1 = r_1_3_0_1_0_2_1;\n }\n {\n S_a217dd34 memory r_1_3_0_1_0_2_2;\n {\n int128 r_1_3_0_1_0_2_2_0 = 103826667361427089928837382649458393018;\n r_1_3_0_1_0_2_2.s_0 = r_1_3_0_1_0_2_2_0;\n }\n {\n bool r_1_3_0_1_0_2_2_1 = false;\n r_1_3_0_1_0_2_2.s_1 = r_1_3_0_1_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_3_0_1_0_2_2_2;\n {\n string memory r_1_3_0_1_0_2_2_2_0 = unicode\"Moo é🚀🚀Mooo🚀MMM Mo 🚀oMooMo🚀MMoéoooM oo🚀MM🚀éM\";\n r_1_3_0_1_0_2_2_2.s_0 = r_1_3_0_1_0_2_2_2_0;\n }\n {\n string memory r_1_3_0_1_0_2_2_2_1 = unicode\"Moo é🚀oé éé🚀ooéoooMooo é🚀ééoM🚀ooéo é🚀🚀é oé🚀🚀é🚀 🚀o🚀o\";\n r_1_3_0_1_0_2_2_2.s_1 = r_1_3_0_1_0_2_2_2_1;\n }\n {\n string memory r_1_3_0_1_0_2_2_2_2 = unicode\"Moo é🚀\";\n r_1_3_0_1_0_2_2_2.s_2 = r_1_3_0_1_0_2_2_2_2;\n }\n r_1_3_0_1_0_2_2.s_2 = r_1_3_0_1_0_2_2_2;\n }\n {\n address r_1_3_0_1_0_2_2_3 = 0x28FF38296fD042aEC5e9672cf44A8a1a17305F18;\n r_1_3_0_1_0_2_2.s_3 = r_1_3_0_1_0_2_2_3;\n }\n {\n string memory r_1_3_0_1_0_2_2_4 = unicode\"Moo é🚀o🚀é é🚀oéoooMM\";\n r_1_3_0_1_0_2_2.s_4 = r_1_3_0_1_0_2_2_4;\n }\n r_1_3_0_1_0_2.s_2 = r_1_3_0_1_0_2_2;\n }\n r_1_3_0_1_0.s_2 = r_1_3_0_1_0_2;\n }\n {\n address r_1_3_0_1_0_3 = 0x9423a01eFEc6b7aF47fD029575a2D0F992617c7E;\n r_1_3_0_1_0.s_3 = r_1_3_0_1_0_3;\n }\n {\n bytes7 r_1_3_0_1_0_4 = bytes7(0x6101e0fe89074f);\n r_1_3_0_1_0.s_4 = r_1_3_0_1_0_4;\n }\n r_1_3_0_1.s_0 = r_1_3_0_1_0;\n }\n {\n string memory r_1_3_0_1_1 = unicode\"Moo é🚀\";\n r_1_3_0_1.s_1 = r_1_3_0_1_1;\n }\n {\n int40[2] memory r_1_3_0_1_2;\n {\n int40 r_1_3_0_1_2_0 = 437124834717;\n r_1_3_0_1_2[0] = r_1_3_0_1_2_0;\n }\n {\n int40 r_1_3_0_1_2_1 = -209087154503;\n r_1_3_0_1_2[1] = r_1_3_0_1_2_1;\n }\n r_1_3_0_1.s_2 = r_1_3_0_1_2;\n }\n r_1_3_0[1] = r_1_3_0_1;\n }\n {\n S_6c7af139 memory r_1_3_0_2;\n {\n S_71a4881b memory r_1_3_0_2_0;\n {\n bool r_1_3_0_2_0_0 = false;\n r_1_3_0_2_0.s_0 = r_1_3_0_2_0_0;\n }\n {\n string memory r_1_3_0_2_0_1 = unicode\"Moo é🚀ooo\";\n r_1_3_0_2_0.s_1 = r_1_3_0_2_0_1;\n }\n {\n S_7e54c7ee memory r_1_3_0_2_0_2;\n {\n S_d29e61bf memory r_1_3_0_2_0_2_0;\n {\n address[3] memory r_1_3_0_2_0_2_0_0;\n {\n address r_1_3_0_2_0_2_0_0_0 = 0xB5405956dA2Fa7849f979aFA97ABFd706b942582;\n r_1_3_0_2_0_2_0_0[0] = r_1_3_0_2_0_2_0_0_0;\n }\n {\n address r_1_3_0_2_0_2_0_0_1 = 0xE0470F38eA39eCd0C79B5234EE861caBE4538946;\n r_1_3_0_2_0_2_0_0[1] = r_1_3_0_2_0_2_0_0_1;\n }\n {\n address r_1_3_0_2_0_2_0_0_2 = 0x8365a9E8B96fC7C5e0B65Bf254c8c669aE4FfB49;\n r_1_3_0_2_0_2_0_0[2] = r_1_3_0_2_0_2_0_0_2;\n }\n r_1_3_0_2_0_2_0.s_0 = r_1_3_0_2_0_2_0_0;\n }\n {\n bytes22 r_1_3_0_2_0_2_0_1 = bytes22(0xf937c889573cb774d0ab3237361b9f3509b6f7d6b7d8);\n r_1_3_0_2_0_2_0.s_1 = r_1_3_0_2_0_2_0_1;\n }\n r_1_3_0_2_0_2.s_0 = r_1_3_0_2_0_2_0;\n }\n {\n bytes8 r_1_3_0_2_0_2_1 = bytes8(0x5cabbbc7466a93ef);\n r_1_3_0_2_0_2.s_1 = r_1_3_0_2_0_2_1;\n }\n {\n S_a217dd34 memory r_1_3_0_2_0_2_2;\n {\n int128 r_1_3_0_2_0_2_2_0 = -140672197555055157231416370861641455899;\n r_1_3_0_2_0_2_2.s_0 = r_1_3_0_2_0_2_2_0;\n }\n {\n bool r_1_3_0_2_0_2_2_1 = true;\n r_1_3_0_2_0_2_2.s_1 = r_1_3_0_2_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_3_0_2_0_2_2_2;\n {\n string memory r_1_3_0_2_0_2_2_2_0 = unicode\"Moo é🚀o\";\n r_1_3_0_2_0_2_2_2.s_0 = r_1_3_0_2_0_2_2_2_0;\n }\n {\n string memory r_1_3_0_2_0_2_2_2_1 = unicode\"Moo é🚀éMMooo 🚀MoéoMMoM éé 🚀oé \";\n r_1_3_0_2_0_2_2_2.s_1 = r_1_3_0_2_0_2_2_2_1;\n }\n {\n string memory r_1_3_0_2_0_2_2_2_2 = unicode\"Moo é🚀éM🚀MM🚀MoéMMoéMMooéo🚀éééMo éoMo🚀 M M🚀 ooo\";\n r_1_3_0_2_0_2_2_2.s_2 = r_1_3_0_2_0_2_2_2_2;\n }\n r_1_3_0_2_0_2_2.s_2 = r_1_3_0_2_0_2_2_2;\n }\n {\n address r_1_3_0_2_0_2_2_3 = 0x987188ac2B0b4BDe48BF19C9d9CbAa7c0a4B0cc9;\n r_1_3_0_2_0_2_2.s_3 = r_1_3_0_2_0_2_2_3;\n }\n {\n string memory r_1_3_0_2_0_2_2_4 = unicode\"Moo é🚀\";\n r_1_3_0_2_0_2_2.s_4 = r_1_3_0_2_0_2_2_4;\n }\n r_1_3_0_2_0_2.s_2 = r_1_3_0_2_0_2_2;\n }\n r_1_3_0_2_0.s_2 = r_1_3_0_2_0_2;\n }\n {\n address r_1_3_0_2_0_3 = 0xb41C0c7CE3d4c72427158fe122eaAF1fDA056f75;\n r_1_3_0_2_0.s_3 = r_1_3_0_2_0_3;\n }\n {\n bytes7 r_1_3_0_2_0_4 = bytes7(0xf67b8591c9bece);\n r_1_3_0_2_0.s_4 = r_1_3_0_2_0_4;\n }\n r_1_3_0_2.s_0 = r_1_3_0_2_0;\n }\n {\n string memory r_1_3_0_2_1 = unicode\"Moo é🚀éMéMMMoo🚀🚀é Méé éoMMooMM \";\n r_1_3_0_2.s_1 = r_1_3_0_2_1;\n }\n {\n int40[2] memory r_1_3_0_2_2;\n {\n int40 r_1_3_0_2_2_0 = 137528695621;\n r_1_3_0_2_2[0] = r_1_3_0_2_2_0;\n }\n {\n int40 r_1_3_0_2_2_1 = -131315912947;\n r_1_3_0_2_2[1] = r_1_3_0_2_2_1;\n }\n r_1_3_0_2.s_2 = r_1_3_0_2_2;\n }\n r_1_3_0[2] = r_1_3_0_2;\n }\n {\n S_6c7af139 memory r_1_3_0_3;\n {\n S_71a4881b memory r_1_3_0_3_0;\n {\n bool r_1_3_0_3_0_0 = false;\n r_1_3_0_3_0.s_0 = r_1_3_0_3_0_0;\n }\n {\n string memory r_1_3_0_3_0_1 = unicode\"Moo é🚀\";\n r_1_3_0_3_0.s_1 = r_1_3_0_3_0_1;\n }\n {\n S_7e54c7ee memory r_1_3_0_3_0_2;\n {\n S_d29e61bf memory r_1_3_0_3_0_2_0;\n {\n address[3] memory r_1_3_0_3_0_2_0_0;\n {\n address r_1_3_0_3_0_2_0_0_0 = 0x1746211F458690A6A4b71154637876b917cEe918;\n r_1_3_0_3_0_2_0_0[0] = r_1_3_0_3_0_2_0_0_0;\n }\n {\n address r_1_3_0_3_0_2_0_0_1 = 0x31de4CD09EC9715267CC84c6A1C8D7E9FDf8fe20;\n r_1_3_0_3_0_2_0_0[1] = r_1_3_0_3_0_2_0_0_1;\n }\n {\n address r_1_3_0_3_0_2_0_0_2 = 0xd4dDe6bD2e4ac31717510c2Aee22734b007bF148;\n r_1_3_0_3_0_2_0_0[2] = r_1_3_0_3_0_2_0_0_2;\n }\n r_1_3_0_3_0_2_0.s_0 = r_1_3_0_3_0_2_0_0;\n }\n {\n bytes22 r_1_3_0_3_0_2_0_1 = bytes22(0x54d4138d9f36bab4954ad00b8593bb8345281f7fd842);\n r_1_3_0_3_0_2_0.s_1 = r_1_3_0_3_0_2_0_1;\n }\n r_1_3_0_3_0_2.s_0 = r_1_3_0_3_0_2_0;\n }\n {\n bytes8 r_1_3_0_3_0_2_1 = bytes8(0xb1ebd4df3f415559);\n r_1_3_0_3_0_2.s_1 = r_1_3_0_3_0_2_1;\n }\n {\n S_a217dd34 memory r_1_3_0_3_0_2_2;\n {\n int128 r_1_3_0_3_0_2_2_0 = -4795633902205635648984968202052634112;\n r_1_3_0_3_0_2_2.s_0 = r_1_3_0_3_0_2_2_0;\n }\n {\n bool r_1_3_0_3_0_2_2_1 = true;\n r_1_3_0_3_0_2_2.s_1 = r_1_3_0_3_0_2_2_1;\n }\n {\n S_061dfc07 memory r_1_3_0_3_0_2_2_2;\n {\n string memory r_1_3_0_3_0_2_2_2_0 = unicode\"Moo é🚀oooo🚀 o éM ééééoM🚀M oMMé🚀🚀 o🚀oooéMMM oo\";\n r_1_3_0_3_0_2_2_2.s_0 = r_1_3_0_3_0_2_2_2_0;\n }\n {\n string memory r_1_3_0_3_0_2_2_2_1 = unicode\"Moo é🚀o🚀o\";\n r_1_3_0_3_0_2_2_2.s_1 = r_1_3_0_3_0_2_2_2_1;\n }\n {\n string memory r_1_3_0_3_0_2_2_2_2 = unicode\"Moo é🚀\";\n r_1_3_0_3_0_2_2_2.s_2 = r_1_3_0_3_0_2_2_2_2;\n }\n r_1_3_0_3_0_2_2.s_2 = r_1_3_0_3_0_2_2_2;\n }\n {\n address r_1_3_0_3_0_2_2_3 = 0x302B699c9b23359bD795dF80665031799E9848C9;\n r_1_3_0_3_0_2_2.s_3 = r_1_3_0_3_0_2_2_3;\n }\n {\n string memory r_1_3_0_3_0_2_2_4 = unicode\"Moo é🚀M MMMé🚀oo 🚀o🚀MoM M 🚀\";\n r_1_3_0_3_0_2_2.s_4 = r_1_3_0_3_0_2_2_4;\n }\n r_1_3_0_3_0_2.s_2 = r_1_3_0_3_0_2_2;\n }\n r_1_3_0_3_0.s_2 = r_1_3_0_3_0_2;\n }\n {\n address r_1_3_0_3_0_3 = 0xF5E84cF41CC6e5b38C5759E307f5966089B25e66;\n r_1_3_0_3_0.s_3 = r_1_3_0_3_0_3;\n }\n {\n bytes7 r_1_3_0_3_0_4 = bytes7(0xbb72b251fe9700);\n r_1_3_0_3_0.s_4 = r_1_3_0_3_0_4;\n }\n r_1_3_0_3.s_0 = r_1_3_0_3_0;\n }\n {\n string memory r_1_3_0_3_1 = unicode\"Moo é🚀é🚀 oééMéoooo o🚀oéM 🚀 🚀\";\n r_1_3_0_3.s_1 = r_1_3_0_3_1;\n }\n {\n int40[2] memory r_1_3_0_3_2;\n {\n int40 r_1_3_0_3_2_0 = -222159116766;\n r_1_3_0_3_2[0] = r_1_3_0_3_2_0;\n }\n {\n int40 r_1_3_0_3_2_1 = -29436146639;\n r_1_3_0_3_2[1] = r_1_3_0_3_2_1;\n }\n r_1_3_0_3.s_2 = r_1_3_0_3_2;\n }\n r_1_3_0[3] = r_1_3_0_3;\n }\n r_1_3[0] = r_1_3_0;\n }\n r_1[3] = r_1_3;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n address r_3 = 0x5FEa7a766a6f18b075f51b24a578EB3156663f5b;\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000072a98a070c21be46645eb52e8cb3a06d67e6f464e16d767c709174fdb3b814b795d2e6830000000000000000000000000000000000000000000000000000000000000000000000000000001f69052dde0e6941000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005fea7a766a6f18b075f51b24a578eb3156663f5b000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000002bc000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000540ffffffffffffffffffffffffffffffffffffffffffffffffffffffc20013b1920000000000000000000000000000000000000000000000000000007a71322247000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000f7ff3be34346b75ffffe0d5dc0225afdb212dd25368a7df30c39670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6f206ff09f9a80f09f9a80206fc3a96ff09f9a80206fc3a94d4d6f4d6f6fc3a96f4df09f9a80f09f9a806f4d4df09f9a80f09f9a80f09f9a80f09f9a806f20000000000000000000000000000000000000000000000000000077b2c3b055786ff7a936686c125e84cdb3a3c8760000000000000000000000000d6b791045bdfb317a3b5946b4756b097ec3986b000000000000000000000000c12f0c8d22b046d909c69bc89f21c531c5746163608e571f1d7724d085dae45ac249071d05747dba741d000000000000000000005cb7199b7b95e3e900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffffda4db590529ed379681ee66b9fae5ce3000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000087b4709afae80773735280825b347d9971ecb69100000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000674d6f6f20c3a9f09f9a806f6ff09f9a80206f4df09f9a804d6ff09f9a80204d6f6ff09f9a804df09f9a80c3a9206ff09f9a804dc3a94dc3a96f6fc3a94df09f9a804d4d6f4d20f09f9a806f204df09f9a8020f09f9a80206f204d4df09f9a80f09f9a80206fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806ff09f9a80c3a96f4d6f20c3a9c3a9f09f9a806f6f6fc3a9f09f9a804d6ff09f9a8020c3a9f09f9a804d4d4d4dc3a96f4df09f9a806f6ff09f9a806f6f20f09f9a804d6fc3a920206f6f6f20f09f9a80f09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80f09f9a804df09f9a806ff09f9a806f4dc3a9f09f9a8020206f6f6f4d204d4df09f9a806f206f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80f09f9a806f4d6f6f20f09f9a8020206f6f0000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffbb88710310ffffffffffffffffffffffffffffffffffffffffffffffffffffff95686b3b54000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000738eb7eb4664b050a29298068da94c056718ff1a749fb2c41b7b880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264d6f6f20c3a9f09f9a806f20c3a96fc3a9c3a9c3a96f6f4d4df09f9a804d20f09f9a806f4d20000000000000000000000000000000000000000000000000000000000000000000000000000013ec2e2de547f48ad354ee4aed82c2b8c3e5e5560000000000000000000000003d0906dba7d38713b1184ea920bf0d2baacc07f20000000000000000000000004746b3d6de6140dc59dd9e9704b91f86858ae50073246ca93dd5735fbacb9107c823b7f8eb104af8f806000000000000000000005d3c845b5aa3442000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000007b27d2600402a6387aa3f6ec9a9fa95a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006fc60d8c853d725e0906bdab3e09fe71d9ef467b0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80206ff09f9a80c3a9f09f9a806f4d000000000000000000000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a8020c3a96f206f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a80204d20f09f9a80c3a9c3a9c3a96f4d4d6f6f6ff09f9a804dc3a920f09f9a804d4d20c3a92020206ff09f9a806ff09f9a8020c3a94d6fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80f09f9a806f206ff09f9a804d6f206f4dc3a9f09f9a80c3a9f09f9a80c3a9f09f9a806f4d6ff09f9a806f206fc3a96f206ff09f9a806f6f4d6f6fc3a9204d6fc3a9f09f9a806f20200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000006f78a8d1acffffffffffffffffffffffffffffffffffffffffffffffffffffff8cb31109bb000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000dc1df1fe26e618d818543eeaeb4e43ad32cd66655325fa2502fdd10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a806fc3a9c3a96f204d6f20c3a94dc3a9c3a920202020f09f9a80c3a94d206f4d0000000000000000000000000000000000000000000000000000000000000000000000c3ddc93df8929dc89ea3286542c6cede3cbfc0c4000000000000000000000000718dd49145b4ae405af2cb6e56c091c4c10a802b0000000000000000000000007e03fb9e50c1e7219d7077f1d0ed28d54ffc832ee25599e0ec186c4f00d74a6c396bfbbab24c6082b16800000000000000000000b6c22be93fc4e47300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffffb2b63aa8a9b9a89562916cd39abdb362000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e93bd7ea3ed7907837cd88f19d851ce440438b4b0000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000464d6f6f20c3a9f09f9a806fc3a9c3a96f4d6f6fc3a96fc3a96f6f6f6ff09f9a806f20f09f9a80c3a96f6fc3a96f206ff09f9a804df09f9a806f20f09f9a804d204dc3a96f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80f09f9a806ff09f9a806f4d6fc3a9c3a96f20c3a9c3a9c3a96f6f4df09f9a80f09f9a806f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f4d6f6f20c3a9f09f9a80f09f9a806f206f6f20f09f9a80f09f9a804d206f6f6f4d4d4d4df09f9a806f2020f09f9a804d6ff09f9a806ff09f9a804df09f9a806f6f6f20c3a94d6f6ff09f9a80f09f9a8020206f6f4df09f9a806ff09f9a80c3a9c3a920c3a9c3a9f09f9a80206f4d4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e4d6f6f20c3a9f09f9a806fc3a9c3a94df09f9a806ff09f9a806f6f6f6f6fc3a9c3a96f4df09f9a80c3a9f09f9a80c3a94d4df09f9a80f09f9a806ff09f9a80f09f9a80c3a96ff09f9a80206ff09f9a806ff09f9a80206f6f2020f09f9a806f6ff09f9a806f4dc3a9c3a920c3a94d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a806fc3a96f6f6f206fc3a94d4df09f9a80c3a9206f6fc3a920f09f9a80f09f9a804d206f6f6f6f4d4d204df09f9a80c3a96ff09f9a80204d20f09f9a80f09f9a80c3a9204d4d6fc3a9206f6ff09f9a806f6f206ff09f9a804d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000460ffffffffffffffffffffffffffffffffffffffffffffffffffffffc76d5a2a47ffffffffffffffffffffffffffffffffffffffffffffffffffffffd7a2fbcb0d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000ff958c5e3973110d2ec056910087a5654ae881ab0ef43618428a1400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000004f099c8f6d99818636f5ad1eea5c9b133ef990480000000000000000000000009e9544ef65849969c0cc0ceb86233a7e09468970000000000000000000000000e13c2a64ee60dc0f94b985fb7bc91b158ee00559d2946b3810589dd01ef0d704dd434f8183d67cd8de0b00000000000000000000290c94382d81ad3c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000079afa5bc6cae5062853572445b6a4f0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000090127d0d0261c4b20e2cc2085db10024101b31040000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a802020c3a94d6f6f6f6f204df09f9a80c3a94d6fc3a94df09f9a80c3a92020c3a9f09f9a804d6f6f6f6fc3a9c3a9f09f9a80c3a96f20c3a96f6f6fc3a9c3a96f4dc3a94d6f206f4d4d206ff09f9a80206f6f4d00000000000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a8020f09f9a80c3a96f6f6f206ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a806f6fc3a9206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000010a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000580ffffffffffffffffffffffffffffffffffffffffffffffffffffff8b9615e453ffffffffffffffffffffffffffffffffffffffffffffffffffffffc6669d56e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a19b175b3399848d4473c4bbe5996af5c0e165d9578d256e7d3df900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a804d204d6ff09f9a80f09f9a804d4df09f9a804df09f9a80f09f9a8020c3a96ff09f9a804dc3a96fc3a96ff09f9a80c3a920f09f9a806f6f4d206f6f6f4d6f4d206f6f6f6f20c3a96f6f4d20f09f9a80200000000000000000000000000000000000005d636e181b8417a58326e34d561e4070fbd8e1780000000000000000000000003baa6bb0f96ef7ff900f931d00251758415f600e000000000000000000000000bf750a076e3c9035f4cfc383d8083dca34248c6f80aedb9fd3b8201fc59d17301d578348184d1bfcc3a600000000000000000000f53f134197ff0ba600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffffdc97ce3701a7168cfeaa3916d3c9fe33000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000025a029586837483b82dcc5dbe3630849bd6c78ba00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a804d20204dc3a96f20f09f9a8020c3a94d6f6f6ff09f9a80c3a9f09f9a804df09f9a806f6ff09f9a80f09f9a80c3a96f6f20c3a9f09f9a804d6f6f6f4df09f9a804d6f6f6f4df09f9a80c3a96f6f20c3a96f20c3a94d4dc3a9206fc3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a804d6f6f206f6f4d6f20f09f9a80f09f9a80206f20f09f9a806f6f6ff09f9a80f09f9a806f4d4d6ff09f9a8020206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a806f204df09f9a80f09f9a80c3a9206fc3a96f6ff09f9a806f6ff09f9a80206f204dc3a9206ff09f9a804d4d204df09f9a80c3a94dc3a96f6f206f6f4dc3a96ff09f9a806f4d4df09f9a8020c3a920204dc3a94dc3a94dc3a920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a80c3a94d6f6f4d6f6ff09f9a80f09f9a804df09f9a80c3a9f09f9a806ff09f9a806f6f4d206f20f09f9a804dc3a9c3a920c3a920f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a80c3a9c3a96ff09f9a80c3a9c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000081a7dc160ffffffffffffffffffffffffffffffffffffffffffffffffffffff87e5422619000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a4c2d29cd36d5b885bb649dcec0a663cb1de37b0d040e3305117e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a806fc3a96f6fc3a9f09f9a804d00000000000000000000000000000000000000000000a4802f649bc5834de9dfeacc9766d4ff9207e408000000000000000000000000160909344d5c144b7f502d868c24a41f96e0fd530000000000000000000000008befd74625fbeb828f03f583fb8004cf836985c195841e588dafb0c7c847aeed0a0ad6710eff930f55ee000000000000000000005a4c00cd7a9721ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000002fddad497796e5078b01986f9adac8a8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ebd39a65b78c03b3d2add73f4e8d2273c1db71060000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a8020f09f9a806ff09f9a80204df09f9a80f09f9a80c3a9204d20c3a9f09f9a80c3a94d4d206f20c3a9c3a94d000000000000000000000000000000000000000000000000000000000000000000000000000000000000434d6f6f20c3a9f09f9a80c3a96f4d202020f09f9a80f09f9a806f4d4d4d6f6f6f4d4df09f9a80c3a9c3a94d4d206f6f206f6f6f2020c3a9f09f9a80c3a96f4d4d6fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a804dc3a9c3a96f4d206ff09f9a806f4df09f9a806f6f6f4d20f09f9a804d204d6f204dc3a96f206f6fc3a9c3a9f09f9a806f6f4d00000000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a806ff09f9a806f20c3a9206f4df09f9a804d6fc3a9c3a9204d20f09f9a80f09f9a806f20c3a96f6fc3a94df09f9a80f09f9a804d206ff09f9a804d6f4d6fc3a96fc3a96f6ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a806f6fc3a9c3a96f4d20206ff09f9a804d20204d6f6fc3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffce47b19fe800000000000000000000000000000000000000000000000000000044f1d3ba0b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000dbfcf080a14358ecdd3dd8d30c698aa16e0845fe982f0841cc90a100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a804df09f9a804d20c3a96f204dc3a9206fc3a94dc3a9c3a9f09f9a80202020c3a9000000000000000000000000000000000000000000000000000000000000000000004d814fb71bcf5aad58b2205caecf2b8fce94446a000000000000000000000000c5b216cd7c4d9aa71696626656af3c3997543b94000000000000000000000000b4c8197664d834a78fa598544e57baf061024a8fda6b9c3f7d2fdd2a79dd85e5ab48059e8971ed48e2980000000000000000000096068b8ecef5bc6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffffda1287bbe2d17594db81f78c7d400c2f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b0a6522b4ed9821a887f885e76c4087fa266787e0000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806ff09f9a80f09f9a806f6f6f6f6f6ff09f9a80c3a96f6f4d4dc3a96f6ff09f9a802020f09f9a80f09f9a806ff09f9a80c3a920f09f9a80c3a96f6f6f4d206f6f4d204d204d4df09f9a806fc3a9c3a9204d6ff09f9a806f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000214d6f6f20c3a9f09f9a804df09f9a806fc3a9f09f9a804df09f9a80f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a806f4d6ff09f9a80204dc3a9c3a9f09f9a806f6ff09f9a80f09f9a806ff09f9a806ff09f9a804d6ff09f9a8020f09f9a80c3a9c3a90000000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f6f204dc3a9f09f9a80f09f9a8020204d204d00000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000460ffffffffffffffffffffffffffffffffffffffffffffffffffffffc425f9b68d0000000000000000000000000000000000000000000000000000000c5e831856000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000001763d060b32aafa02a6f6ca499038a0e928477b841fdae2306fba300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a96f4d6f20c3a94d20f09f9a80f09f9a80f09f9a80c3a94d6f4d6f6f4dc3a96f6ff09f9a80f09f9a804d6f200000000000000000000000000000006167ec3f676b54f2842c038ed55c8fafa2df4196000000000000000000000000ede5094843deb0795e98c13c57c1b1d26e3b30bb000000000000000000000000368e4cc37e84485479462e3eb131f47f207331048eece1fc5d97366349413a277eda09d017d76df51293000000000000000000007641870d67c9cd2900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000006ab122306deb47ff08c2ed30d144e069000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cc448419b619d7cc59d447f8c0b0fc5a3cc100f400000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a80f09f9a806fc3a96f4d6f6f6f00000000000000000000000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a806f6fc3a9f09f9a806f6fc3a96ff09f9a806f4d4d000000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a804d4d6f4d4d6f20f09f9a80f09f9a806fc3a96f6fc3a9c3a94d4d6f6f204d4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a804d4d6f2020f09f9a806f4d4dc3a96f4d6f4df09f9a804d6f6f4dc3a96ff09f9a804df09f9a804d6f206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000500ffffffffffffffffffffffffffffffffffffffffffffffffffffff9e7494da280000000000000000000000000000000000000000000000000000007a324bf5a7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000007581b289936f63c693753b2eb8d2322d55401feef76707081f98110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80f09f9a80f09f9a806f6f4d4df09f9a804dc3a9c3a94d6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000071d355de0dd118ff156df8517e39e2abbaba438f000000000000000000000000af35671f099b913fdd8ae97cf60b827c179bda34000000000000000000000000bc2472868d038a4b170ba6d333ce75c8025c376d91c7bf133651fdee8746dbcc8859d376ce10083b9b4d000000000000000000005eb60976e4fee44b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000006dde74ff966ff7ec6bee74c31dbfc08a000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000007d84272a441212743f7fba0a6083e125f48d5edc0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a806f4d6fc3a920204dc3a96fc3a96fc3a920206f206fc3a96f20f09f9a80206f20204dc3a94d6f6f6f4d4d4d20204d4d4d6f6ff09f9a80c3a94d206f6f206f206f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a80f09f9a80c3a9f09f9a804d4d4d6f6f6f6ff09f9a80f09f9a804d20f09f9a806f6f6fc3a94d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a80206ff09f9a8020c3a96fc3a94df09f9a806f204dc3a96f4d6fc3a96f4d20f09f9a8020c3a94d6f4dc3a9c3a9f09f9a80c3a94d4d6f6f6f6f4dc3a94dc3a96f4d4d6f206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806f6f6f4d4df09f9a806f4d6f20206fc3a9f09f9a806fc3a9f09f9a80c3a9f09f9a804d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a804d6f6f6f6f6ff09f9a8020206f6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffb69577e196ffffffffffffffffffffffffffffffffffffffffffffffffffffffc18b124868000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000d44df1cf962948f082fe43ed2b01f49dcf99f3d01fa12715f2977000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a80f09f9a806f6f6f206f4dc3a9c3a920c3a90000000000000000000000000000000000ef39293a07717fcee87e558f66a69f22a90e716b000000000000000000000000d3238bc068d5469faae53fe61e3d28809caa273b0000000000000000000000001d670fe466711115efa20cb297d5c0421d859389958cb3ac8dc7bce8effc6ad24659ff19b9674d94e766000000000000000000008b04ef97822e828b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffffff5b57e3b43de2af095c035de668b387000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ee59e04da840532e07d3059d3858fa7955b912040000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a806ff09f9a806ff09f9a806fc3a96f6f6f4df09f9a80c3a96f6fc3a9f09f9a80f09f9a8020f09f9a806f6f206f6f20f09f9a80f09f9a80f09f9a806f6f6f6f6fc3a96f206f4d6f4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80c3a9f09f9a804d6ff09f9a806f20204dc3a96f6ff09f9a80f09f9a806f6f20f09f9a806fc3a96ff09f9a806f6f4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a80f09f9a80f09f9a80206f4d206f4d204d6fc3a920f09f9a806fc3a96fc3a9f09f9a804d6ff09f9a80f09f9a80f09f9a80204d6f6fc3a96f6f4d6ff09f9a80f09f9a806f6f6f6f6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80c3a96f4d6ff09f9a80c3a9f09f9a806fc3a900000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a80f09f9a8020c3a9f09f9a806ff09f9a80c3a9c3a96f6f6ff09f9a80c3a96f6f4d6f6fc3a96f204d206fc3a9f09f9a806ff09f9a806f6f4d4dc3a96f4d4dc3a9f09f9a8020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000001ea902716ffffffffffffffffffffffffffffffffffffffffffffffffffffffcf8e0b487e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000008e93fe3045ce3429ff3ef8592616fc2c252ccfa05e64ddf75b0de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a806fc3a9c3a96f4d4d4dc3a96fc3a96f4d6ff09f9a80206f6ff09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000059d6f42db099ce0d55a6b7c4a983abdeb6497920000000000000000000000000a802b1028dca6c4dbf1e2c15e8979d874beb86b9000000000000000000000000db0bf0fed7b4f4ebb2841cd9a680525bb6a190cd701aeb0598026806cf2e547cbdff02a87709fc37b75900000000000000000000b64d9f88ff5e110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000001d788e4995dcc260f83e26597127c95000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000f968351013e54160e680d2312eee75b42509fca0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a806ff09f9a80c3a94dc3a94d204d2020c3a9c3a96ff09f9a804d206f6f6f6ff09f9a80f09f9a806f6f6f206ff09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80206ff09f9a80c3a94df09f9a802020f09f9a80206f4df09f9a804df09f9a80c3a94dc3a94df09f9a806ff09f9a806f6f6f204d4d6f20c3a9204d6f6fc3a96fc3a9c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164d6f6f20c3a9f09f9a804dc3a94d204d20206f6fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a80c3a9c3a96f6f6f206fc3a9c3a96f4d4dc3a96f6f20f09f9a806f6f4df09f9a804d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffa19d5fdf4000000000000000000000000000000000000000000000000000000044ffe4cb34000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000002c240a608b92428c196a55861db5c15cf4989cbbbe2d06698156b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a804d206f6f6f206f4d4dc3a96f20f09f9a80f09f9a8000000000000000000000000000e8be8845fb6017cedb280dd3f6af7d03b747d95e0000000000000000000000004e5f05c11e461d34ba1ad53433a2f238a29f9afc000000000000000000000000716f35acab14ec52daa0dd6b036a74c2851c25692dcb459c57ae870b8188f72c18bf037001df04c455430000000000000000000011c71a1e5adf368200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffff9f0bf850b7af1176b228df9e0a3cc705000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f4558561cae05df23d50573b375e1b8f2610222f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a8020c3a920c3a9c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a80f09f9a804dc3a9c3a9f09f9a80f09f9a806f20c3a920c3a920c3a96fc3a96fc3a9f09f9a802020f09f9a804d6f4d6f6fc3a96ff09f9a806f6f6f206ff09f9a8020204d6ff09f9a806fc3a94dc3a9f09f9a80204df09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a804df09f9a806f6fc3a92020000000000000000000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a80c3a96f6fc3a96ff09f9a8020f09f9a80c3a96f6f4d4d6ff09f9a806f4dc3a96ff09f9a806fc3a96f6f4d6f6f6f6f2020f09f9a806f4dc3a96f4d4d4d206f6f6ff09f9a806f206f6f6f20c3a9206f000000000000000000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a804d20f09f9a80206f6ff09f9a80c3a9f09f9a80c3a96fc3a92020c3a94d4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000319e9730bffffffffffffffffffffffffffffffffffffffffffffffffffffffb17eec3437000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000002dd9b0b8ea3f36f15eada31de8493717073aa5dc086cdf87df18c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000271a9f08b096f13f15615bf3abfba63a383522800000000000000000000000057caa879d4eec37000334f29ddcfc6eace9c905400000000000000000000000070e88a662cb1688ad5afe3d51701ace53c89f5b2cdaa21752004534fafae55be67ecb8fd35fa4f92272c00000000000000000000f70538f14abc419f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffffc7bfceb7708372a5369c6d9e3e99358e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000811d981e7dbe6f80727285343906aa50be657ae20000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a80c3a96f6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000744d6f6f20c3a9f09f9a8020f09f9a80f09f9a80204d6f6ff09f9a80f09f9a804dc3a9206f204dc3a9f09f9a80206f4d206f206ff09f9a80f09f9a804df09f9a804d6fc3a9c3a94d206ff09f9a8020c3a9f09f9a806f6f6f4d4df09f9a806f204d4df09f9a80f09f9a80c3a920f09f9a80f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d6f6f20c3a9f09f9a8020206f20c3a920c3a9f09f9a804d6f204d000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a806f206f6fc3a96f204d6f4df09f9a802020f09f9a80c3a96f206f4df09f9a80f09f9a8020c3a96f20206f6f6f6f4d6f6f20c3a94d6ff09f9a806f6ff09f9a80c3a96ff09f9a80f09f9a806f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806ff09f9a806ff09f9a806f4d200000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000065c6aba59dffffffffffffffffffffffffffffffffffffffffffffffffffffffcf516f36b9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000009423a01efec6b7af47fd029575a2d0f992617c7e6101e0fe89074f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000584d6f6f20c3a9f09f9a80f09f9a804d4dc3a96fc3a9204d6f6f204df09f9a80206f4d6fc3a96f6ff09f9a8020206fc3a94dc3a96ff09f9a8020204d6fc3a96f6fc3a96f6f6fc3a96f6f6f6fc3a9f09f9a80f09f9a80206f200000000000000000000000000000000000000000e14cc5dbf416a76d7a606b0c4ef726c01425dbe1000000000000000000000000d58a1d35359a2860592d29ba3dfa0b9fbd52f76a000000000000000000000000bc7b421a3c1f8e0283007835e4f809e7423f0816df78fb020870422a9dfd196ef4cdc059e18bc6c6e3c20000000000000000000037104cd607a2521500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000004e1c49ecd024b4b4a23bf565e52affba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000028ff38296fd042aec5e9672cf44a8a1a17305f180000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a80f09f9a804d6f6f6ff09f9a804d4d4d204d6f20f09f9a806f4d6f6f4d6ff09f9a804d4d6fc3a96f6f6f4d206f6ff09f9a804d4df09f9a80c3a94d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a806fc3a920c3a9c3a9f09f9a806f6fc3a96f6f6f4d6f6f6f2020c3a9f09f9a80c3a9c3a96f4df09f9a806f6fc3a96f20c3a9f09f9a80f09f9a80c3a9206fc3a9f09f9a80f09f9a80c3a9f09f9a80202020f09f9a806ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a806ff09f9a80c3a920c3a9f09f9a806fc3a96f6f6f4d4d000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000002005595b45ffffffffffffffffffffffffffffffffffffffffffffffffffffffe16cf62f0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000b41c0c7ce3d4c72427158fe122eaaf1fda056f75f67b8591c9bece00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a806f6f6f00000000000000000000000000000000000000000000000000000000000000b5405956da2fa7849f979afa97abfd706b942582000000000000000000000000e0470f38ea39ecd0c79b5234ee861cabe45389460000000000000000000000008365a9e8b96fc7c5e0b65bf254c8c669ae4ffb49f937c889573cb774d0ab3237361b9f3509b6f7d6b7d8000000000000000000005cabbbc7466a93ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffff962b852e5b4cf3f8c46b3b16e6ada6e5000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000987188ac2b0b4bde48bf19c9d9cbaa7c0a4b0cc90000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000b4d6f6f20c3a9f09f9a806f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80c3a94d4d6f6f6f20f09f9a804d6fc3a96f4d4d6f4d20c3a9c3a92020f09f9a806fc3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494d6f6f20c3a9f09f9a80c3a94df09f9a804d4df09f9a804d6fc3a94d4d6fc3a94d4d6f6fc3a96ff09f9a80c3a9c3a9c3a94d6f20c3a96f4d6ff09f9a80204d204df09f9a80206f6f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a80c3a94dc3a94d4d4d6f6ff09f9a80f09f9a80c3a9204dc3a9c3a920c3a96f4d4d6f6f4d4d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000480ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc4648e622fffffffffffffffffffffffffffffffffffffffffffffffffffffff925780c31000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000f5e84cf41cc6e5b38c5759e307f5966089b25e66bb72b251fe970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000001746211f458690a6a4b71154637876b917cee91800000000000000000000000031de4cd09ec9715267cc84c6a1c8d7e9fdf8fe20000000000000000000000000d4dde6bd2e4ac31717510c2aee22734b007bf14854d4138d9f36bab4954ad00b8593bb8345281f7fd84200000000000000000000b1ebd4df3f41555900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0fffffffffffffffffffffffffffffffffc6464fe617979d3c441c2ab0098fa00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000302b699c9b23359bd795df80665031799e9848c90000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a806f6f6f6ff09f9a80206f20c3a94d20c3a9c3a9c3a9c3a96f4df09f9a804d206f4d4dc3a9f09f9a80f09f9a80206ff09f9a806f6f6fc3a94d4d4d206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a806ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a804d204d4d4dc3a9f09f9a806f6f20f09f9a806ff09f9a804d6f4d204d20f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000324d6f6f20c3a9f09f9a80c3a9f09f9a8020206fc3a9c3a94dc3a96f6f6f6f206ff09f9a806fc3a94d20f09f9a8020f09f9a800000000000000000000000000000" + }, + { + "name": "random-(address,string,address[],uint216,(string,bool[],uint248,(bytes22[4],int192,(address[1],(bool[],uint152,uint200[4],bool)[2][3],(bool,bytes16,string)[3],bool)),bool))", + "type": "(address,string,address[],uint216,(string,bool[],uint248,(bytes22[4],int192,(address[1],(bool[],uint152,uint200[4],bool)[2][3],(bool,bytes16,string)[3],bool)),bool))", + "value": [ + "0x6cBD005ee0A8425cCd2720779C28e4bF235DEfB5", + "Moo é🚀", + [], + "11748385545372560794270479845558321214969968737676877191283220214", + [ + "Moo é🚀🚀oéééoM é🚀oMM🚀🚀🚀🚀MéM oé o oo🚀 Mo o🚀Mo🚀ooooo ooéo", + [true, true, false], + "42798344027375486566309803589792121734218987083436135956714065043486133841", + [ + [ + "0x022b6e213c8bbf46f464cf4541e2603ec5cf2e0d072e", + "0x7e1860a4e981e553c7de13e8aafbfec5561b11284c77", + "0x2eca0be4b013471a8d7f75fe2a7d713de7f43c5d1bf1", + "0x6deb4610c2e2e36b94127cba65fdaad65440d30bb37e" + ], + "-3131804874836675365962097563578778409409749354739299636533", + [ + ["0x9847ccc4b036E5E1a3a17D9A241967070F1729D6"], + [ + [ + [ + [true, true], + "4811453609733051664779899168340664302657075108", + [ + "1255876989347247720512753317592810888633969462573765865289066", + "1216622046093212162556165353105136543829942240365526103198345", + "215370811753775232602741063242849734162701353739936183888856", + "823015402238356114551734744716502105098908164647589255174139" + ], + false + ], + [ + [true, false], + "530325941254951113908384610582309675093801642", + [ + "196042535101618852734036353557217249159043327150091709761309", + "1000209630002823198737333958941580455793261098313221318603828", + "1582770379972078012417279690170824077476191267860996266217206", + "211597892108955715665469907952604432063378711254720764667943" + ], + false + ] + ], + [ + [ + [true, false, false, true], + "5053728353304829204118609454767263873026688962", + [ + "90375430785740783783606084355710270838721625541169515256294", + "1459464563704860124848157806951393799835345881605069117339421", + "1156530863991771385014859185910638992638242119589151335655288", + "792577780643147984667344473730078347439978460791577387093752" + ], + true + ], + [ + [true, true, false], + "1558583866370296963842801948735210104079872435", + [ + "385890301499052288002246511334633283575008873478473694202379", + "881205930425664847517173055767245270814826901485695592269910", + "1396060809216236462681626474919130849292285900600534037022135", + "924212449694162623963088950249305642992960293579483594110002" + ], + true + ] + ], + [ + [ + [true], + "800623553434897416430228128929249126881203010", + [ + "30901650246894572776489467184391001419425502581061004164418", + "1062494469775336628263021049639132773774175963964112123657952", + "1113746163374984106690563726112219051946637495549803675531444", + "1477786620762075758101193552224821725408193907197507359810796" + ], + false + ], + [ + [true, false], + "5478275331287724787396752631168129522699177847", + [ + "1312533193472735932299195424870320396199288619705910186412010", + "1065440061942792842541869246075224490586793832314198097720434", + "1584766068860971564724520662839324463036553036998237229453177", + "1403318133503285320150782127906795167827937485299277858808891" + ], + false + ] + ] + ], + [ + [false, "0x903af01d24ef4bde2b75a665c63cdef2", "Moo é🚀"], + [ + true, + "0x34a54e0a13d649be641a02b3d421f257", + "Moo é🚀ooéMéM 🚀🚀oé🚀oo🚀Moo éooMooMé🚀🚀oo MoM🚀🚀MM é oéoM🚀" + ], + [ + false, + "0x02ec8fce4f13af60191fb10a45813fcc", + "Moo é🚀 ooo éoMéé oMoooM🚀M🚀 🚀" + ] + ], + false + ] + ], + true + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x6cBD005ee0A8425cCd2720779C28e4bF235DEfB5" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "array", + "value": [] + }, + { + "type": "number", + "value": "11748385545372560794270479845558321214969968737676877191283220214" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oéééoM é🚀oMM🚀🚀🚀🚀MéM oé o oo🚀 Mo o🚀Mo🚀ooooo ooéo" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "42798344027375486566309803589792121734218987083436135956714065043486133841" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x022b6e213c8bbf46f464cf4541e2603ec5cf2e0d072e" + }, + { + "type": "hexstring", + "value": "0x7e1860a4e981e553c7de13e8aafbfec5561b11284c77" + }, + { + "type": "hexstring", + "value": "0x2eca0be4b013471a8d7f75fe2a7d713de7f43c5d1bf1" + }, + { + "type": "hexstring", + "value": "0x6deb4610c2e2e36b94127cba65fdaad65440d30bb37e" + } + ] + }, + { + "type": "number", + "value": "-3131804874836675365962097563578778409409749354739299636533" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x9847ccc4b036E5E1a3a17D9A241967070F1729D6" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "4811453609733051664779899168340664302657075108" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1255876989347247720512753317592810888633969462573765865289066" + }, + { + "type": "number", + "value": "1216622046093212162556165353105136543829942240365526103198345" + }, + { + "type": "number", + "value": "215370811753775232602741063242849734162701353739936183888856" + }, + { + "type": "number", + "value": "823015402238356114551734744716502105098908164647589255174139" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "530325941254951113908384610582309675093801642" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "196042535101618852734036353557217249159043327150091709761309" + }, + { + "type": "number", + "value": "1000209630002823198737333958941580455793261098313221318603828" + }, + { + "type": "number", + "value": "1582770379972078012417279690170824077476191267860996266217206" + }, + { + "type": "number", + "value": "211597892108955715665469907952604432063378711254720764667943" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "5053728353304829204118609454767263873026688962" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "90375430785740783783606084355710270838721625541169515256294" + }, + { + "type": "number", + "value": "1459464563704860124848157806951393799835345881605069117339421" + }, + { + "type": "number", + "value": "1156530863991771385014859185910638992638242119589151335655288" + }, + { + "type": "number", + "value": "792577780643147984667344473730078347439978460791577387093752" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "1558583866370296963842801948735210104079872435" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "385890301499052288002246511334633283575008873478473694202379" + }, + { + "type": "number", + "value": "881205930425664847517173055767245270814826901485695592269910" + }, + { + "type": "number", + "value": "1396060809216236462681626474919130849292285900600534037022135" + }, + { + "type": "number", + "value": "924212449694162623963088950249305642992960293579483594110002" + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "800623553434897416430228128929249126881203010" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "30901650246894572776489467184391001419425502581061004164418" + }, + { + "type": "number", + "value": "1062494469775336628263021049639132773774175963964112123657952" + }, + { + "type": "number", + "value": "1113746163374984106690563726112219051946637495549803675531444" + }, + { + "type": "number", + "value": "1477786620762075758101193552224821725408193907197507359810796" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "5478275331287724787396752631168129522699177847" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1312533193472735932299195424870320396199288619705910186412010" + }, + { + "type": "number", + "value": "1065440061942792842541869246075224490586793832314198097720434" + }, + { + "type": "number", + "value": "1584766068860971564724520662839324463036553036998237229453177" + }, + { + "type": "number", + "value": "1403318133503285320150782127906795167827937485299277858808891" + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x903af01d24ef4bde2b75a665c63cdef2" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x34a54e0a13d649be641a02b3d421f257" + }, + { + "type": "string", + "value": "Moo é🚀ooéMéM 🚀🚀oé🚀oo🚀Moo éooMooMé🚀🚀oo MoM🚀🚀MM é oéoM🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x02ec8fce4f13af60191fb10a45813fcc" + }, + { + "type": "string", + "value": "Moo é🚀 ooo éoMéé oMoooM🚀M🚀 🚀" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611283806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061109a565b60405180910390f35b610056610bb5565b61005e610bb5565b736cbd005ee0a8425ccd2720779c28e4bf235defb58152604080518082018252600a8152689adede418753e13f3560b71b602080830191909152808401919091528151600081529081018252908201527a1c8f09cc519508c73607b76869bda69813c394080b0dd56be41ef660608201526100d7610bfb565b600060405180608001604052806060815260200161116660609139825250604080516003808252608082019092526000916020820160608036833701905050905060006001905080826000815181106101325761013261114f565b60200260200101901515908115158152505050600060019050808260018151811061015f5761015f61114f565b60200260200101901515908115158152505050600080826002815181106101885761018861114f565b911515602092830291909101820152830191909152507e183916cf1e477ad5322cc54c96edc8f93993805187fb92729ba01b5b53ce5160408201526101cb610c39565b6101d3610c60565b750115b7109e45dfa37a3267a2a0f1301f62e79706839760511b8152757e1860a4e981e553c7de13e8aafbfec5561b11284c7760501b602080830191909152752eca0be4b013471a8d7f75fe2a7d713de7f43c5d1bf160501b60408301527536f5a308617171b5ca093e5d32fed56b2a206985d9bf60511b6060830152908252777fb9918c61337df89db53a6654016c3c10d08b953d19d5341990820152610279610c7e565b610281610cab565b739847ccc4b036e5e1a3a17d9a241967070f1729d6815281526102a2610cc9565b6102aa610cf6565b6102b2610d23565b60408051600280825260608201835260009260208301908036833701905050905060006001905080826000815181106102ed576102ed61114f565b60200260200101901515908115158152505050600060019050808260018151811061031a5761031a61114f565b9115156020928302919091018201529183525072d7c0c757fd7e7fe5ea92584679f412ec07f7a49082015261034d610c60565b78c8129f91581a9c1cb0df003fe489e40f1bf946a0ce3ff4b56a815278c1d1aed6516ee06fd0aaac5e40528cf697f77c0b9204b98a89602082015278224f80313d494fde47af1e53f6a0b607141a86fa48cb302bd860408083019190915278831d29baf70b013316f49106c1a61c6957a3c84792179dd7fb6060808401919091529083019190915260009082015281526103e5610d23565b60408051600280825260608201835260009260208301908036833701905050905060006001905080826000815181106104205761042061114f565b60200260200101901515908115158152505050600080826001815181106104495761044961114f565b911515602092830291909101820152918352507217c7d7debed35dd7c909436284e99c75853aaa9082015261047c610c60565b781f3b3b917f22516ab95053b829d5e1229065648ad250c4c71d8152789f57b3c9c413340b510ab1539c9eb9be3166297692e6ff743460208083019190915278fc265dcfc4c203dac647eb4f56ce530ef990808512adbd4ef66040808401919091527821b5a112c23aff1f00b15f454eec186f3e5da7de6c7307682760608085019190915290840192909252600091830191909152820152815261051e610cf6565b610526610d23565b60408051600480825260a082019092526000916020820160808036833701905050905060006001905080826000815181106105635761056361114f565b602002602001019015159081151581525050506000808260018151811061058c5761058c61114f565b60200260200101901515908115158152505050600080826002815181106105b5576105b561114f565b6020026020010190151590811515815250505060006001905080826003815181106105e2576105e261114f565b9115156020928302919091018201529183525072e29df4d322db4ef2b62fdffce91b5134b707c290820152610615610c60565b780e65cb8610420b6569855fbf8b55075e54e1f5501c4fbad9e6815278e8819105801db4b41821d6c9efa671c1856c720a4ed190371d602082015278b83ef99f68de63c7c369aaaa31b6bb1fb6df8711dbb3a22778604080830191909152787e43d2221b2fdfe116fd854961e5ef98590fade142390e4ef86060808401919091529083019190915260019082015281526106ad610d23565b604080516003808252608082019092526000916020820160608036833701905050905060006001905080826000815181106106ea576106ea61114f565b6020026020010190151590811515815250505060006001905080826001815181106107175761071761114f565b60200260200101901515908115158152505050600080826002815181106107405761074061114f565b911515602092830291909101820152918352507245e3aa5354238f65341622d23406b573e571b390820152610773610c60565b783d79d2bbd041d408b76f2533e08d6b6ccf95688557a6fe4a0b8152788c625b312a69b7e0eb99bfc35d394c3aebdbd08a804f47885660208083019190915278de67c2f00412b29ee7afbca82df9457593d0d39a2dcda1c5b760408084019190915278933c4c342ba06abccc33286d7da432d272a807a2e0edf83432606080850191909152908401929092526001918301919091528281019190915282015261081a610cf6565b610822610d23565b60408051600180825281830190925260009160208083019080368337019050509050600060019050808260008151811061085e5761085e61114f565b911515602092830291909101820152918352507223e6b5291632c4aa035c7ee36ea721fa18934290820152610891610c60565b7804ec444843757f030b2b4588d1b4d1ae1c6d52390c29e1fd42815278a943dfdb7bcfbf7b656497f18e4ffc5a3d1d2864adb976fee0602082015278b16e1481781fc1a400c7950e6a4230f006334b779d7aac38b460408083019190915278eb6ccc3904ef32e887c4b585964643bf1a9525d2848db124ec606080840191909152908301919091526000908201528152610929610d23565b60408051600280825260608201835260009260208301908036833701905050905060006001905080826000815181106109645761096461114f565b602002602001019015159081151581525050506000808260018151811061098d5761098d61114f565b9115156020928302919091018201529183525072f5a78442ac7e4e9a5ddcc1e222adadce398f77908201526109c0610c60565b78d1193df056aa9c01a8936375b6d3afe4a40df38136dcbf07ea815278a9bc01464775b2c2e18182184566c1b69baeb5fbf98024f47260208083019190915278fc77c1c69a67982f5f94fa30909fe169e7c7798b8ad7e48f7960408084019190915278df8fbcf042914b003e5a14a1988556f9bdf6e9fdea156b243b6060808501919091528482019390935260009284019290925283810192909252830191909152820152610a6d610d43565b604080516060808201835260008083528284018281526f481d780e9277a5ef15bad332e31e6f7960811b60208086019190915285518087018752600a8152689adede418753e13f3560b71b818301529091529285528351808301855280850192909252600182526f34a54e0a13d649be641a02b3d421f25760801b82840152835160808101909452605b808552919390929091906111f39083013960408301525080826001602002015250610b3a6040805160608082018352600080835260208301529181019190915290565b60008082526ebb23f393c4ebd80647ec4291604ff360821b6020808401919091526040805160608101909152602d80825290916111c690830139604083015250808260026020020152506040808301919091526000606080840191909152908301919091528201526001608080830191909152820152919050565b6040518060a0016040528060006001600160a01b03168152602001606081526020016060815260200160006001600160d81b03168152602001610bf6610bfb565b905290565b6040518060a00160405280606081526020016060815260200160006001600160f81b03168152602001610c2c610c39565b8152600060209091015290565b6040518060600160405280610c4c610c60565b815260006020820152604001610bf6610c7e565b60405180608001604052806004906020820280368337509192915050565b6040518060800160405280610c91610cab565b8152602001610c9e610cc9565b8152602001610c2c610d43565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003905b610ce0610cf6565b815260200190600190039081610cd85790505090565b60405180604001604052806002905b610d0d610d23565b815260200190600190039081610d055790505090565b604080516080810182526060815260006020820152908101610c2c610c60565b60405180606001604052806003905b60408051606080820183526000808352602083015291810191909152815260200190600190039081610d525790505090565b6000815180845260005b81811015610daa57602081850181015186830182015201610d8e565b81811115610dbc576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b83811015610e03578151151587529582019590820190600101610de5565b509495945050505050565b60008260608082018460005b6003811015610e7957848303885281518051151584526020808201516fffffffffffffffffffffffffffffffff191681860152604091820151918501869052610e6586860183610d84565b998101999450929092019150600101610e1a565b50909695505050505050565b6000815160a08452610e9a60a0850182610d84565b905060208084015185830382870152610eb38382610dd1565b925050604060018060f81b038186015116818701526060850151868403606088015260c0840181518586905060005b6004811015610f0c57825169ffffffffffffffffffff191682529186019190860190600101610ee2565b5050508184015160170b60808601529082015160c060a0860152805190916101408601906000905b6001821015610f5c5783516001600160a01b0316815292860192600191909101908601610f34565b505082850151608060e088015291506101a086019060005b60038110156110425787830361013f1901825283518387810160005b600281101561102d5786820383528351805160e08452610fb360e0850182610dd1565b905072ffffffffffffffffffffffffffffffffffffff8d830151168d8501528b8201518c850160005b60048110156110025782516001600160c81b03168252918f0191908f0190600101610fdc565b5050506060820151915061101a60c085018315159052565b948c0194938c0193925050600101610f90565b50958901959450505090860190600101610f74565b50508284015186820360bf190161010088015294506110618186610e0e565b94505050606081015191505061107c61012084018215159052565b5060808401519150611092608086018315159052565b949350505050565b6000602080835260018060a01b0380855116828501528185015160a060408601526110c860c0860182610d84565b6040870151601f1987830381016060890152815180845291860193506000929091908601905b80841015611110578451861682529386019360019390930192908601906110ee565b5060608901516001600160d81b03811660808a0152955060808901519550818882030160a08901526111428187610e85565b9998505050505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a9c3a96f4d2020c3a9f09f9a806f4d4df09f9a80f09f9a80f09f9a80f09f9a804dc3a94d20206fc3a92020206f206f6ff09f9a80204d6f206ff09f9a804d6ff09f9a806f6f6f6f6f206f6fc3a96f4d6f6f20c3a9f09f9a80206f6f6f2020c3a96f4dc3a9c3a9206f4d6f6f6f4df09f9a804df09f9a8020f09f9a804d6f6f20c3a9f09f9a806f6fc3a94dc3a94d20f09f9a80f09f9a806fc3a9f09f9a806f6ff09f9a804d6f6f20c3a96f6f4d6f6f4dc3a9f09f9a80f09f9a806f6f204d6f4df09f9a80f09f9a804d4d20c3a9206fc3a96f4df09f9a80a2646970667358221220334ea6a503b697d32847559d0d3a16fea3234584bc72d51fe98c783ecc820b1764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_574d9217 {\n bool[] s_0;\n uint152 s_1;\n uint200[4] s_2;\n bool s_3;\n }\n\n struct S_cbb9bf37 {\n bool s_0;\n bytes16 s_1;\n string s_2;\n }\n\n struct S_7142d7f8 {\n address[1] s_0;\n S_574d9217[2][3] s_1;\n S_cbb9bf37[3] s_2;\n bool s_3;\n }\n\n struct S_d046c2d5 {\n bytes22[4] s_0;\n int192 s_1;\n S_7142d7f8 s_2;\n }\n\n struct S_f1926b33 {\n string s_0;\n bool[] s_1;\n uint248 s_2;\n S_d046c2d5 s_3;\n bool s_4;\n }\n\n struct S_7cb2dbe3 {\n address s_0;\n string s_1;\n address[] s_2;\n uint216 s_3;\n S_f1926b33 s_4;\n }\n\n function test () public pure returns (S_7cb2dbe3 memory) {\n S_7cb2dbe3 memory r;\n {\n address r_0 = 0x6cBD005ee0A8425cCd2720779C28e4bF235DEfB5;\n r.s_0 = r_0;\n }\n {\n string memory r_1 = unicode\"Moo é🚀\";\n r.s_1 = r_1;\n }\n {\n address[] memory r_2 = new address[](0);\n r.s_2 = r_2;\n }\n {\n uint216 r_3 = 11748385545372560794270479845558321214969968737676877191283220214;\n r.s_3 = r_3;\n }\n {\n S_f1926b33 memory r_4;\n {\n string memory r_4_0 = unicode\"Moo é🚀🚀oéééoM é🚀oMM🚀🚀🚀🚀MéM oé o oo🚀 Mo o🚀Mo🚀ooooo ooéo\";\n r_4.s_0 = r_4_0;\n }\n {\n bool[] memory r_4_1 = new bool[](3);\n {\n bool r_4_1_0 = true;\n r_4_1[0] = r_4_1_0;\n }\n {\n bool r_4_1_1 = true;\n r_4_1[1] = r_4_1_1;\n }\n {\n bool r_4_1_2 = false;\n r_4_1[2] = r_4_1_2;\n }\n r_4.s_1 = r_4_1;\n }\n {\n uint248 r_4_2 = 42798344027375486566309803589792121734218987083436135956714065043486133841;\n r_4.s_2 = r_4_2;\n }\n {\n S_d046c2d5 memory r_4_3;\n {\n bytes22[4] memory r_4_3_0;\n {\n bytes22 r_4_3_0_0 = bytes22(0x022b6e213c8bbf46f464cf4541e2603ec5cf2e0d072e);\n r_4_3_0[0] = r_4_3_0_0;\n }\n {\n bytes22 r_4_3_0_1 = bytes22(0x7e1860a4e981e553c7de13e8aafbfec5561b11284c77);\n r_4_3_0[1] = r_4_3_0_1;\n }\n {\n bytes22 r_4_3_0_2 = bytes22(0x2eca0be4b013471a8d7f75fe2a7d713de7f43c5d1bf1);\n r_4_3_0[2] = r_4_3_0_2;\n }\n {\n bytes22 r_4_3_0_3 = bytes22(0x6deb4610c2e2e36b94127cba65fdaad65440d30bb37e);\n r_4_3_0[3] = r_4_3_0_3;\n }\n r_4_3.s_0 = r_4_3_0;\n }\n {\n int192 r_4_3_1 = -3131804874836675365962097563578778409409749354739299636533;\n r_4_3.s_1 = r_4_3_1;\n }\n {\n S_7142d7f8 memory r_4_3_2;\n {\n address[1] memory r_4_3_2_0;\n {\n address r_4_3_2_0_0 = 0x9847ccc4b036E5E1a3a17D9A241967070F1729D6;\n r_4_3_2_0[0] = r_4_3_2_0_0;\n }\n r_4_3_2.s_0 = r_4_3_2_0;\n }\n {\n S_574d9217[2][3] memory r_4_3_2_1;\n {\n S_574d9217[2] memory r_4_3_2_1_0;\n {\n S_574d9217 memory r_4_3_2_1_0_0;\n {\n bool[] memory r_4_3_2_1_0_0_0 = new bool[](2);\n {\n bool r_4_3_2_1_0_0_0_0 = true;\n r_4_3_2_1_0_0_0[0] = r_4_3_2_1_0_0_0_0;\n }\n {\n bool r_4_3_2_1_0_0_0_1 = true;\n r_4_3_2_1_0_0_0[1] = r_4_3_2_1_0_0_0_1;\n }\n r_4_3_2_1_0_0.s_0 = r_4_3_2_1_0_0_0;\n }\n {\n uint152 r_4_3_2_1_0_0_1 = 4811453609733051664779899168340664302657075108;\n r_4_3_2_1_0_0.s_1 = r_4_3_2_1_0_0_1;\n }\n {\n uint200[4] memory r_4_3_2_1_0_0_2;\n {\n uint200 r_4_3_2_1_0_0_2_0 = 1255876989347247720512753317592810888633969462573765865289066;\n r_4_3_2_1_0_0_2[0] = r_4_3_2_1_0_0_2_0;\n }\n {\n uint200 r_4_3_2_1_0_0_2_1 = 1216622046093212162556165353105136543829942240365526103198345;\n r_4_3_2_1_0_0_2[1] = r_4_3_2_1_0_0_2_1;\n }\n {\n uint200 r_4_3_2_1_0_0_2_2 = 215370811753775232602741063242849734162701353739936183888856;\n r_4_3_2_1_0_0_2[2] = r_4_3_2_1_0_0_2_2;\n }\n {\n uint200 r_4_3_2_1_0_0_2_3 = 823015402238356114551734744716502105098908164647589255174139;\n r_4_3_2_1_0_0_2[3] = r_4_3_2_1_0_0_2_3;\n }\n r_4_3_2_1_0_0.s_2 = r_4_3_2_1_0_0_2;\n }\n {\n bool r_4_3_2_1_0_0_3 = false;\n r_4_3_2_1_0_0.s_3 = r_4_3_2_1_0_0_3;\n }\n r_4_3_2_1_0[0] = r_4_3_2_1_0_0;\n }\n {\n S_574d9217 memory r_4_3_2_1_0_1;\n {\n bool[] memory r_4_3_2_1_0_1_0 = new bool[](2);\n {\n bool r_4_3_2_1_0_1_0_0 = true;\n r_4_3_2_1_0_1_0[0] = r_4_3_2_1_0_1_0_0;\n }\n {\n bool r_4_3_2_1_0_1_0_1 = false;\n r_4_3_2_1_0_1_0[1] = r_4_3_2_1_0_1_0_1;\n }\n r_4_3_2_1_0_1.s_0 = r_4_3_2_1_0_1_0;\n }\n {\n uint152 r_4_3_2_1_0_1_1 = 530325941254951113908384610582309675093801642;\n r_4_3_2_1_0_1.s_1 = r_4_3_2_1_0_1_1;\n }\n {\n uint200[4] memory r_4_3_2_1_0_1_2;\n {\n uint200 r_4_3_2_1_0_1_2_0 = 196042535101618852734036353557217249159043327150091709761309;\n r_4_3_2_1_0_1_2[0] = r_4_3_2_1_0_1_2_0;\n }\n {\n uint200 r_4_3_2_1_0_1_2_1 = 1000209630002823198737333958941580455793261098313221318603828;\n r_4_3_2_1_0_1_2[1] = r_4_3_2_1_0_1_2_1;\n }\n {\n uint200 r_4_3_2_1_0_1_2_2 = 1582770379972078012417279690170824077476191267860996266217206;\n r_4_3_2_1_0_1_2[2] = r_4_3_2_1_0_1_2_2;\n }\n {\n uint200 r_4_3_2_1_0_1_2_3 = 211597892108955715665469907952604432063378711254720764667943;\n r_4_3_2_1_0_1_2[3] = r_4_3_2_1_0_1_2_3;\n }\n r_4_3_2_1_0_1.s_2 = r_4_3_2_1_0_1_2;\n }\n {\n bool r_4_3_2_1_0_1_3 = false;\n r_4_3_2_1_0_1.s_3 = r_4_3_2_1_0_1_3;\n }\n r_4_3_2_1_0[1] = r_4_3_2_1_0_1;\n }\n r_4_3_2_1[0] = r_4_3_2_1_0;\n }\n {\n S_574d9217[2] memory r_4_3_2_1_1;\n {\n S_574d9217 memory r_4_3_2_1_1_0;\n {\n bool[] memory r_4_3_2_1_1_0_0 = new bool[](4);\n {\n bool r_4_3_2_1_1_0_0_0 = true;\n r_4_3_2_1_1_0_0[0] = r_4_3_2_1_1_0_0_0;\n }\n {\n bool r_4_3_2_1_1_0_0_1 = false;\n r_4_3_2_1_1_0_0[1] = r_4_3_2_1_1_0_0_1;\n }\n {\n bool r_4_3_2_1_1_0_0_2 = false;\n r_4_3_2_1_1_0_0[2] = r_4_3_2_1_1_0_0_2;\n }\n {\n bool r_4_3_2_1_1_0_0_3 = true;\n r_4_3_2_1_1_0_0[3] = r_4_3_2_1_1_0_0_3;\n }\n r_4_3_2_1_1_0.s_0 = r_4_3_2_1_1_0_0;\n }\n {\n uint152 r_4_3_2_1_1_0_1 = 5053728353304829204118609454767263873026688962;\n r_4_3_2_1_1_0.s_1 = r_4_3_2_1_1_0_1;\n }\n {\n uint200[4] memory r_4_3_2_1_1_0_2;\n {\n uint200 r_4_3_2_1_1_0_2_0 = 90375430785740783783606084355710270838721625541169515256294;\n r_4_3_2_1_1_0_2[0] = r_4_3_2_1_1_0_2_0;\n }\n {\n uint200 r_4_3_2_1_1_0_2_1 = 1459464563704860124848157806951393799835345881605069117339421;\n r_4_3_2_1_1_0_2[1] = r_4_3_2_1_1_0_2_1;\n }\n {\n uint200 r_4_3_2_1_1_0_2_2 = 1156530863991771385014859185910638992638242119589151335655288;\n r_4_3_2_1_1_0_2[2] = r_4_3_2_1_1_0_2_2;\n }\n {\n uint200 r_4_3_2_1_1_0_2_3 = 792577780643147984667344473730078347439978460791577387093752;\n r_4_3_2_1_1_0_2[3] = r_4_3_2_1_1_0_2_3;\n }\n r_4_3_2_1_1_0.s_2 = r_4_3_2_1_1_0_2;\n }\n {\n bool r_4_3_2_1_1_0_3 = true;\n r_4_3_2_1_1_0.s_3 = r_4_3_2_1_1_0_3;\n }\n r_4_3_2_1_1[0] = r_4_3_2_1_1_0;\n }\n {\n S_574d9217 memory r_4_3_2_1_1_1;\n {\n bool[] memory r_4_3_2_1_1_1_0 = new bool[](3);\n {\n bool r_4_3_2_1_1_1_0_0 = true;\n r_4_3_2_1_1_1_0[0] = r_4_3_2_1_1_1_0_0;\n }\n {\n bool r_4_3_2_1_1_1_0_1 = true;\n r_4_3_2_1_1_1_0[1] = r_4_3_2_1_1_1_0_1;\n }\n {\n bool r_4_3_2_1_1_1_0_2 = false;\n r_4_3_2_1_1_1_0[2] = r_4_3_2_1_1_1_0_2;\n }\n r_4_3_2_1_1_1.s_0 = r_4_3_2_1_1_1_0;\n }\n {\n uint152 r_4_3_2_1_1_1_1 = 1558583866370296963842801948735210104079872435;\n r_4_3_2_1_1_1.s_1 = r_4_3_2_1_1_1_1;\n }\n {\n uint200[4] memory r_4_3_2_1_1_1_2;\n {\n uint200 r_4_3_2_1_1_1_2_0 = 385890301499052288002246511334633283575008873478473694202379;\n r_4_3_2_1_1_1_2[0] = r_4_3_2_1_1_1_2_0;\n }\n {\n uint200 r_4_3_2_1_1_1_2_1 = 881205930425664847517173055767245270814826901485695592269910;\n r_4_3_2_1_1_1_2[1] = r_4_3_2_1_1_1_2_1;\n }\n {\n uint200 r_4_3_2_1_1_1_2_2 = 1396060809216236462681626474919130849292285900600534037022135;\n r_4_3_2_1_1_1_2[2] = r_4_3_2_1_1_1_2_2;\n }\n {\n uint200 r_4_3_2_1_1_1_2_3 = 924212449694162623963088950249305642992960293579483594110002;\n r_4_3_2_1_1_1_2[3] = r_4_3_2_1_1_1_2_3;\n }\n r_4_3_2_1_1_1.s_2 = r_4_3_2_1_1_1_2;\n }\n {\n bool r_4_3_2_1_1_1_3 = true;\n r_4_3_2_1_1_1.s_3 = r_4_3_2_1_1_1_3;\n }\n r_4_3_2_1_1[1] = r_4_3_2_1_1_1;\n }\n r_4_3_2_1[1] = r_4_3_2_1_1;\n }\n {\n S_574d9217[2] memory r_4_3_2_1_2;\n {\n S_574d9217 memory r_4_3_2_1_2_0;\n {\n bool[] memory r_4_3_2_1_2_0_0 = new bool[](1);\n {\n bool r_4_3_2_1_2_0_0_0 = true;\n r_4_3_2_1_2_0_0[0] = r_4_3_2_1_2_0_0_0;\n }\n r_4_3_2_1_2_0.s_0 = r_4_3_2_1_2_0_0;\n }\n {\n uint152 r_4_3_2_1_2_0_1 = 800623553434897416430228128929249126881203010;\n r_4_3_2_1_2_0.s_1 = r_4_3_2_1_2_0_1;\n }\n {\n uint200[4] memory r_4_3_2_1_2_0_2;\n {\n uint200 r_4_3_2_1_2_0_2_0 = 30901650246894572776489467184391001419425502581061004164418;\n r_4_3_2_1_2_0_2[0] = r_4_3_2_1_2_0_2_0;\n }\n {\n uint200 r_4_3_2_1_2_0_2_1 = 1062494469775336628263021049639132773774175963964112123657952;\n r_4_3_2_1_2_0_2[1] = r_4_3_2_1_2_0_2_1;\n }\n {\n uint200 r_4_3_2_1_2_0_2_2 = 1113746163374984106690563726112219051946637495549803675531444;\n r_4_3_2_1_2_0_2[2] = r_4_3_2_1_2_0_2_2;\n }\n {\n uint200 r_4_3_2_1_2_0_2_3 = 1477786620762075758101193552224821725408193907197507359810796;\n r_4_3_2_1_2_0_2[3] = r_4_3_2_1_2_0_2_3;\n }\n r_4_3_2_1_2_0.s_2 = r_4_3_2_1_2_0_2;\n }\n {\n bool r_4_3_2_1_2_0_3 = false;\n r_4_3_2_1_2_0.s_3 = r_4_3_2_1_2_0_3;\n }\n r_4_3_2_1_2[0] = r_4_3_2_1_2_0;\n }\n {\n S_574d9217 memory r_4_3_2_1_2_1;\n {\n bool[] memory r_4_3_2_1_2_1_0 = new bool[](2);\n {\n bool r_4_3_2_1_2_1_0_0 = true;\n r_4_3_2_1_2_1_0[0] = r_4_3_2_1_2_1_0_0;\n }\n {\n bool r_4_3_2_1_2_1_0_1 = false;\n r_4_3_2_1_2_1_0[1] = r_4_3_2_1_2_1_0_1;\n }\n r_4_3_2_1_2_1.s_0 = r_4_3_2_1_2_1_0;\n }\n {\n uint152 r_4_3_2_1_2_1_1 = 5478275331287724787396752631168129522699177847;\n r_4_3_2_1_2_1.s_1 = r_4_3_2_1_2_1_1;\n }\n {\n uint200[4] memory r_4_3_2_1_2_1_2;\n {\n uint200 r_4_3_2_1_2_1_2_0 = 1312533193472735932299195424870320396199288619705910186412010;\n r_4_3_2_1_2_1_2[0] = r_4_3_2_1_2_1_2_0;\n }\n {\n uint200 r_4_3_2_1_2_1_2_1 = 1065440061942792842541869246075224490586793832314198097720434;\n r_4_3_2_1_2_1_2[1] = r_4_3_2_1_2_1_2_1;\n }\n {\n uint200 r_4_3_2_1_2_1_2_2 = 1584766068860971564724520662839324463036553036998237229453177;\n r_4_3_2_1_2_1_2[2] = r_4_3_2_1_2_1_2_2;\n }\n {\n uint200 r_4_3_2_1_2_1_2_3 = 1403318133503285320150782127906795167827937485299277858808891;\n r_4_3_2_1_2_1_2[3] = r_4_3_2_1_2_1_2_3;\n }\n r_4_3_2_1_2_1.s_2 = r_4_3_2_1_2_1_2;\n }\n {\n bool r_4_3_2_1_2_1_3 = false;\n r_4_3_2_1_2_1.s_3 = r_4_3_2_1_2_1_3;\n }\n r_4_3_2_1_2[1] = r_4_3_2_1_2_1;\n }\n r_4_3_2_1[2] = r_4_3_2_1_2;\n }\n r_4_3_2.s_1 = r_4_3_2_1;\n }\n {\n S_cbb9bf37[3] memory r_4_3_2_2;\n {\n S_cbb9bf37 memory r_4_3_2_2_0;\n {\n bool r_4_3_2_2_0_0 = false;\n r_4_3_2_2_0.s_0 = r_4_3_2_2_0_0;\n }\n {\n bytes16 r_4_3_2_2_0_1 = bytes16(0x903af01d24ef4bde2b75a665c63cdef2);\n r_4_3_2_2_0.s_1 = r_4_3_2_2_0_1;\n }\n {\n string memory r_4_3_2_2_0_2 = unicode\"Moo é🚀\";\n r_4_3_2_2_0.s_2 = r_4_3_2_2_0_2;\n }\n r_4_3_2_2[0] = r_4_3_2_2_0;\n }\n {\n S_cbb9bf37 memory r_4_3_2_2_1;\n {\n bool r_4_3_2_2_1_0 = true;\n r_4_3_2_2_1.s_0 = r_4_3_2_2_1_0;\n }\n {\n bytes16 r_4_3_2_2_1_1 = bytes16(0x34a54e0a13d649be641a02b3d421f257);\n r_4_3_2_2_1.s_1 = r_4_3_2_2_1_1;\n }\n {\n string memory r_4_3_2_2_1_2 = unicode\"Moo é🚀ooéMéM 🚀🚀oé🚀oo🚀Moo éooMooMé🚀🚀oo MoM🚀🚀MM é oéoM🚀\";\n r_4_3_2_2_1.s_2 = r_4_3_2_2_1_2;\n }\n r_4_3_2_2[1] = r_4_3_2_2_1;\n }\n {\n S_cbb9bf37 memory r_4_3_2_2_2;\n {\n bool r_4_3_2_2_2_0 = false;\n r_4_3_2_2_2.s_0 = r_4_3_2_2_2_0;\n }\n {\n bytes16 r_4_3_2_2_2_1 = bytes16(0x02ec8fce4f13af60191fb10a45813fcc);\n r_4_3_2_2_2.s_1 = r_4_3_2_2_2_1;\n }\n {\n string memory r_4_3_2_2_2_2 = unicode\"Moo é🚀 ooo éoMéé oMoooM🚀M🚀 🚀\";\n r_4_3_2_2_2.s_2 = r_4_3_2_2_2_2;\n }\n r_4_3_2_2[2] = r_4_3_2_2_2;\n }\n r_4_3_2.s_2 = r_4_3_2_2;\n }\n {\n bool r_4_3_2_3 = false;\n r_4_3_2.s_3 = r_4_3_2_3;\n }\n r_4_3.s_2 = r_4_3_2;\n }\n r_4.s_3 = r_4_3;\n }\n {\n bool r_4_4 = true;\n r_4.s_4 = r_4_4;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000006cbd005ee0a8425ccd2720779c28e4bf235defb500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000001c8f09cc519508c73607b76869bda69813c394080b0dd56be41ef60000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000183916cf1e477ad5322cc54c96edc8f93993805187fb92729ba01b5b53ce5100000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000604d6f6f20c3a9f09f9a80f09f9a806fc3a9c3a9c3a96f4d2020c3a9f09f9a806f4d4df09f9a80f09f9a80f09f9a80f09f9a804dc3a94d20206fc3a92020206f206f6ff09f9a80204d6f206ff09f9a804d6ff09f9a806f6f6f6f6f206f6fc3a96f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000022b6e213c8bbf46f464cf4541e2603ec5cf2e0d072e000000000000000000007e1860a4e981e553c7de13e8aafbfec5561b11284c77000000000000000000002eca0be4b013471a8d7f75fe2a7d713de7f43c5d1bf1000000000000000000006deb4610c2e2e36b94127cba65fdaad65440d30bb37e00000000000000000000ffffffffffffffff80466e739ecc8207624ac599abfe93c3ef2f746ac2e62acb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009847ccc4b036e5e1a3a17d9a241967070f1729d60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000d7c0c757fd7e7fe5ea92584679f412ec07f7a400000000000000c8129f91581a9c1cb0df003fe489e40f1bf946a0ce3ff4b56a00000000000000c1d1aed6516ee06fd0aaac5e40528cf697f77c0b9204b98a8900000000000000224f80313d494fde47af1e53f6a0b607141a86fa48cb302bd800000000000000831d29baf70b013316f49106c1a61c6957a3c84792179dd7fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000017c7d7debed35dd7c909436284e99c75853aaa000000000000001f3b3b917f22516ab95053b829d5e1229065648ad250c4c71d000000000000009f57b3c9c413340b510ab1539c9eb9be3166297692e6ff743400000000000000fc265dcfc4c203dac647eb4f56ce530ef990808512adbd4ef60000000000000021b5a112c23aff1f00b15f454eec186f3e5da7de6c730768270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000e29df4d322db4ef2b62fdffce91b5134b707c2000000000000000e65cb8610420b6569855fbf8b55075e54e1f5501c4fbad9e600000000000000e8819105801db4b41821d6c9efa671c1856c720a4ed190371d00000000000000b83ef99f68de63c7c369aaaa31b6bb1fb6df8711dbb3a22778000000000000007e43d2221b2fdfe116fd854961e5ef98590fade142390e4ef800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000045e3aa5354238f65341622d23406b573e571b3000000000000003d79d2bbd041d408b76f2533e08d6b6ccf95688557a6fe4a0b000000000000008c625b312a69b7e0eb99bfc35d394c3aebdbd08a804f47885600000000000000de67c2f00412b29ee7afbca82df9457593d0d39a2dcda1c5b700000000000000933c4c342ba06abccc33286d7da432d272a807a2e0edf83432000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000023e6b5291632c4aa035c7ee36ea721fa1893420000000000000004ec444843757f030b2b4588d1b4d1ae1c6d52390c29e1fd4200000000000000a943dfdb7bcfbf7b656497f18e4ffc5a3d1d2864adb976fee000000000000000b16e1481781fc1a400c7950e6a4230f006334b779d7aac38b400000000000000eb6ccc3904ef32e887c4b585964643bf1a9525d2848db124ec00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000f5a78442ac7e4e9a5ddcc1e222adadce398f7700000000000000d1193df056aa9c01a8936375b6d3afe4a40df38136dcbf07ea00000000000000a9bc01464775b2c2e18182184566c1b69baeb5fbf98024f47200000000000000fc77c1c69a67982f5f94fa30909fe169e7c7798b8ad7e48f7900000000000000df8fbcf042914b003e5a14a1988556f9bdf6e9fdea156b243b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000000903af01d24ef4bde2b75a665c63cdef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134a54e0a13d649be641a02b3d421f257000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a806f6fc3a94dc3a94d20f09f9a80f09f9a806fc3a9f09f9a806f6ff09f9a804d6f6f20c3a96f6f4d6f6f4dc3a9f09f9a80f09f9a806f6f204d6f4df09f9a80f09f9a804d4d20c3a9206fc3a96f4df09f9a800000000000000000000000000000000000000000000000000000000000000000000000000002ec8fce4f13af60191fb10a45813fcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a80206f6f6f2020c3a96f4dc3a9c3a9206f4d6f6f6f4df09f9a804df09f9a8020f09f9a8000000000000000000000000000000000000000" + }, + { + "name": "random-(bool,((string)[3],((bool,((bytes11),bytes27,bytes26[],uint48,string),((uint80[3],address,address[1])),bytes17,string),((uint40,int32),int152[3])[],((bool),bool,bool)[4],int96)),address)", + "type": "(bool,((string)[3],((bool,((bytes11),bytes27,bytes26[],uint48,string),((uint80[3],address,address[1])),bytes17,string),((uint40,int32),int152[3])[],((bool),bool,bool)[4],int96)),address)", + "value": [ + false, + [ + [ + ["Moo é🚀o MMé o éM🚀 oéooMééoooé ooo Mé🚀 oMoé"], + ["Moo é🚀 🚀o oooM MM é🚀ooé🚀ooé MMoMM o"], + ["Moo é🚀🚀MMéoooéo é🚀 🚀ooo🚀🚀MéMoo oéooM o🚀ooM Mo"] + ], + [ + [ + true, + [ + ["0x932dde65fb9f2f69ca4738"], + "0x486b4fe3491316cf60aaf1b24c882c2e5f119221f61241cc0ceda4", + [], + "153659014506101", + "Moo é🚀 oMooo o o🚀oMo Mo o🚀🚀 M🚀🚀 éMMo oé é é🚀" + ], + [ + [ + [ + "438613910329105909295447", + "109089138515117367837630", + "551756258728203695837695" + ], + "0xA53525B2A979a63dCbE0DB7D90F07af6f7030cB3", + ["0x4dFb29F89fFfAeDF1457C3729698655a5Ead9959"] + ] + ], + "0x7479ec281e94af181b21779008aa4c93ae", + "Moo é🚀M o🚀 🚀é🚀" + ], + [ + [ + ["959235691055", "687495200"], + [ + "-2610058202524881494598680315501251212508402836", + "2780725569356285966115243087928557512206402793", + "1077207467466402608201462635125866929315824113" + ] + ], + [ + ["740772022181", "-1086918835"], + [ + "838111602694930818189290813948117673620204291", + "-341835273245260977313037423395088411264149546", + "2717973766499356987548601980449792157744613960" + ] + ], + [ + ["224361411732", "-1118855369"], + [ + "1102474998005592214249560468545647578861777848", + "-195200546606339318499777037186549201502495424", + "2425807725283882585536390515723727006121715719" + ] + ] + ], + [ + [[true], false, false], + [[false], false, true], + [[true], false, true], + [[true], false, false] + ], + "-12793842075872703372874618154" + ] + ], + "0xc7d2F4C19c87B0CEC729a1Df6c41fE632A3F3199" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o MMé o éM🚀 oéooMééoooé ooo Mé🚀 oMoé" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 🚀o oooM MM é🚀ooé🚀ooé MMoMM o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀MMéoooéo é🚀 🚀ooo🚀🚀MéMoo oéooM o🚀ooM Mo" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x932dde65fb9f2f69ca4738" + } + ] + }, + { + "type": "hexstring", + "value": "0x486b4fe3491316cf60aaf1b24c882c2e5f119221f61241cc0ceda4" + }, + { + "type": "array", + "value": [] + }, + { + "type": "number", + "value": "153659014506101" + }, + { + "type": "string", + "value": "Moo é🚀 oMooo o o🚀oMo Mo o🚀🚀 M🚀🚀 éMMo oé é é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "438613910329105909295447" + }, + { + "type": "number", + "value": "109089138515117367837630" + }, + { + "type": "number", + "value": "551756258728203695837695" + } + ] + }, + { + "type": "address", + "value": "0xA53525B2A979a63dCbE0DB7D90F07af6f7030cB3" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4dFb29F89fFfAeDF1457C3729698655a5Ead9959" + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x7479ec281e94af181b21779008aa4c93ae" + }, + { + "type": "string", + "value": "Moo é🚀M o🚀 🚀é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "959235691055" + }, + { + "type": "number", + "value": "687495200" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2610058202524881494598680315501251212508402836" + }, + { + "type": "number", + "value": "2780725569356285966115243087928557512206402793" + }, + { + "type": "number", + "value": "1077207467466402608201462635125866929315824113" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "740772022181" + }, + { + "type": "number", + "value": "-1086918835" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "838111602694930818189290813948117673620204291" + }, + { + "type": "number", + "value": "-341835273245260977313037423395088411264149546" + }, + { + "type": "number", + "value": "2717973766499356987548601980449792157744613960" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "224361411732" + }, + { + "type": "number", + "value": "-1118855369" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1102474998005592214249560468545647578861777848" + }, + { + "type": "number", + "value": "-195200546606339318499777037186549201502495424" + }, + { + "type": "number", + "value": "2425807725283882585536390515723727006121715719" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "number", + "value": "-12793842075872703372874618154" + } + ] + } + ] + }, + { + "type": "address", + "value": "0xc7d2F4C19c87B0CEC729a1Df6c41fE632A3F3199" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610ce0806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061098d565b60405180910390f35b6100566105fa565b61005e6105fa565b6000815261006a610623565b610072610648565b60408051602081019091526060815260006040518060600160405280603d8152602001610ba8603d913982525081526040805160208101909152606081526000604051806060016040528060348152602001610be560349139825250602080830191909152604080519182019052606081526000604051806080016040528060488152602001610c19604891398252506040820152815261011161067c565b6101196106a3565b600181526040805160c081018252600060a08201818152825260208083018281526060848601818152818601858152608080880193909352875180860189526a1265bbccbf73e5ed3948e760ab1b815287527f486b4fe3491316cf60aaf1b24c882c2e5f119221f61241cc0ceda40000000000909352865185815280850188529052658bc086f9e6759091528451908101909452604a8085529293919290610c619083013960808301525060208201526101d161070e565b6101d961071d565b6101e1610744565b695ce14ec6f03a62a029578152691719bbea9c78ea9f43be6020808301919091526974d6c447bf5ab05a51ff604083015290825273a53525b2a979a63dcbe0db7d90f07af6f7030cb390820152610236610762565b734dfb29f89fffaedf1457c3729698655a5ead9959815260408281019190915290825282810191909152703a3cf6140f4a578c0d90bbc804552649d760791b606083015280518082018252601d81527f4d6f6f20c3a9f09f9a804d20206ff09f9a8020f09f9a80c3a9f09f9a80000000602082015260808084019190915291835280516003808252928101909152600091816020015b6102d4610780565b8152602001906001900390816102cc5790505090506102f1610780565b6040805180820190915264df56e7122f81526328fa582060208201528152610317610744565b727509ffae539e8f9f66fe9f91da19d4c7d81493198152727cb129feb2a6d316f6cc89b9a4cf57747144e960208083019190915272304dbc3b4f1bbfc5c98b9b61d10efd0da2c1f1604083015282015281518190839060009061037c5761037c610b91565b602002602001018190525050610390610780565b6040805180820190915264ac797407a581526340c910b219602082015281526103b7610744565b7225950ca2c4dac1f6289b13672483f6ac3aeb038152720f541394df1587e0f1603120b9d44a1ca1e829196020808301919091527279e0cf054001db96c78daec7f748f8258fca486040830152820152815181908390600190811061041e5761041e610b91565b602002602001018190525050610432610780565b6040805180820190915264343cfb749481526342b060c81960208201528152610459610744565b72316fcad487b90a8af447b7ac8ddd2b886bb3b881527208c0cad97afd923853a3ef624464e250c462bf19602080830191909152726cc6e8317102f24ae6faf96804d4615029e807604083015282015281518190839060029081106104c0576104c0610b91565b602002602001018190525050808260200181905250506104de6107a9565b604080516080808201835260006060808401828152845260208085018381528587018481528751808401895260018082529088529185905284905294875285518085018752808301848152815280820184815281880185815288518085018a528681528352908590528690528782015285518085018752808301848152815280820184815281880185815288518085018a5288815283529085905286905287870152855193840186528382018381528452838101838152848701848152875180840189529687529585528390529190935284830191909152848301939093526b2956d170a7a6597ae406152919908401528382019290925283019190915273c7d2f4c19c87b0cec729a1df6c41fe632a3f319990820152919050565b6040518060600160405280600015158152602001610616610623565b8152600060209091015290565b6040518060400160405280610636610648565b815260200161064361067c565b905290565b60405180606001604052806003905b6040805160208101909152606081528152602001906001900390816106575790505090565b604051806080016040528061068f6106a3565b8152602001606081526020016106166107a9565b6040518060a001604052806000151581526020016106ed6040805160c081018252600060a08201818152825260208201819052606092820183905282820152608081019190915290565b81526020016106fa61070e565b815260006020820152606060409091015290565b60405180602001604052806106435b6040518060600160405280610730610744565b815260006020820152604001610643610762565b60405180606001604052806003906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b604080516080810182526000918101828152606082019290925290815260208101610643610744565b60405180608001604052806004905b60408051608081018252600060608201818152825260208083018290529282015282526000199092019101816107b85790505090565b6000815180845260005b81811015610814576020818501810151868301820152016107f8565b81811115610826576000602083870101525b50601f01601f19169290920160200192915050565b805180518360005b600381101561086e57825169ffffffffffffffffffff16825260209283019290910190600101610843565b5050506020818101516001600160a01b03908116606086015260409092015191608085019060005b60018110156108b5578451821683529383019391830191600101610896565b50505050505050565b60008151808452602080850194508084016000805b848110156109385782518051805164ffffffffff168a52850151600390810b868b0152908501519060408a0190845b8181101561092157835160120b83529287019291870191600101610902565b50505060a0989098019750918301916001016108d3565b50959695505050505050565b8060005b60048110156109875781518051511515855260208082015115158187015260409182015115159186019190915260609094019390910190600101610948565b50505050565b60006020808352835115158184015280840151604060608186015260c08501825182608088015281829050610120925082880160005b60038110156109fa5789820360bf190183528351518883526109e7898401826107ee565b94890194938901939250506001016109c3565b5094860151888603607f190160a0808b019190915281516101e08089528151151590890152808901516102008901969096528551516001600160a81b0319166103008901528589015164ffffffffff19166103208901528686015161034089019290925281516103a0890181905292979189019594509250906000906103c08301905b80831015610aa657865165ffffffffffff19168252958901956001929092019190890190610a7d565b50606085015165ffffffffffff1661036084015260808501518382036102ff19016103808501529550610ad981876107ee565b95505050848201519250610af161022082018461083b565b60608201516effffffffffffffffffffffffffffff19166102c082015260808201516101df19828603016102e08301529250610b2d84846107ee565b935086860151925080840387820152610b4684846108be565b9650848601519350610b5a85820185610944565b60608601519550610b716101c0820187600b0b9052565b505050508501516001600160a01b03811660608601529050509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f204d4dc3a9206f20c3a94df09f9a8020206fc3a96f6f4dc3a9c3a96f6f6fc3a9206f6f6f204dc3a9f09f9a80206f4d6fc3a94d6f6f20c3a9f09f9a8020f09f9a806f206f6f6f4d204d4d20c3a9f09f9a806f6fc3a9f09f9a806f6fc3a9204d4d6f4d4d20206f4d6f6f20c3a9f09f9a80f09f9a804d4dc3a96f6f6fc3a96f20c3a9f09f9a8020f09f9a806f6f6ff09f9a80f09f9a804dc3a94d6f6f206fc3a96f6f4d206ff09f9a806f6f4d204d6f4d6f6f20c3a9f09f9a802020206f4d6f6f6f206f206ff09f9a806f4d6f204d6f206ff09f9a80f09f9a80204df09f9a80f09f9a802020c3a94d4d6f20206fc3a920c3a920c3a9f09f9a80a2646970667358221220cb33d1f039f5dfcc039d42c89be044d17a2cc0c2a0ffe24022d8459f0a8966c764736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_97fc4627 {\n string s_0;\n }\n\n struct S_1b4cf483 {\n bytes11 s_0;\n }\n\n struct S_acc34dbf {\n S_1b4cf483 s_0;\n bytes27 s_1;\n bytes26[] s_2;\n uint48 s_3;\n string s_4;\n }\n\n struct S_61a80dab {\n uint80[3] s_0;\n address s_1;\n address[1] s_2;\n }\n\n struct S_e186461d {\n S_61a80dab s_0;\n }\n\n struct S_a9ff5e33 {\n bool s_0;\n S_acc34dbf s_1;\n S_e186461d s_2;\n bytes17 s_3;\n string s_4;\n }\n\n struct S_45eeec8a {\n uint40 s_0;\n int32 s_1;\n }\n\n struct S_d7052263 {\n S_45eeec8a s_0;\n int152[3] s_1;\n }\n\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_98eb97a5 {\n S_c1053bda s_0;\n bool s_1;\n bool s_2;\n }\n\n struct S_f09aea52 {\n S_a9ff5e33 s_0;\n S_d7052263[] s_1;\n S_98eb97a5[4] s_2;\n int96 s_3;\n }\n\n struct S_fd275615 {\n S_97fc4627[3] s_0;\n S_f09aea52 s_1;\n }\n\n struct S_b0804e5b {\n bool s_0;\n S_fd275615 s_1;\n address s_2;\n }\n\n function test () public pure returns (S_b0804e5b memory) {\n S_b0804e5b memory r;\n {\n bool r_0 = false;\n r.s_0 = r_0;\n }\n {\n S_fd275615 memory r_1;\n {\n S_97fc4627[3] memory r_1_0;\n {\n S_97fc4627 memory r_1_0_0;\n {\n string memory r_1_0_0_0 = unicode\"Moo é🚀o MMé o éM🚀 oéooMééoooé ooo Mé🚀 oMoé\";\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n r_1_0[0] = r_1_0_0;\n }\n {\n S_97fc4627 memory r_1_0_1;\n {\n string memory r_1_0_1_0 = unicode\"Moo é🚀 🚀o oooM MM é🚀ooé🚀ooé MMoMM o\";\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n r_1_0[1] = r_1_0_1;\n }\n {\n S_97fc4627 memory r_1_0_2;\n {\n string memory r_1_0_2_0 = unicode\"Moo é🚀🚀MMéoooéo é🚀 🚀ooo🚀🚀MéMoo oéooM o🚀ooM Mo\";\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n r_1_0[2] = r_1_0_2;\n }\n r_1.s_0 = r_1_0;\n }\n {\n S_f09aea52 memory r_1_1;\n {\n S_a9ff5e33 memory r_1_1_0;\n {\n bool r_1_1_0_0 = true;\n r_1_1_0.s_0 = r_1_1_0_0;\n }\n {\n S_acc34dbf memory r_1_1_0_1;\n {\n S_1b4cf483 memory r_1_1_0_1_0;\n {\n bytes11 r_1_1_0_1_0_0 = bytes11(0x932dde65fb9f2f69ca4738);\n r_1_1_0_1_0.s_0 = r_1_1_0_1_0_0;\n }\n r_1_1_0_1.s_0 = r_1_1_0_1_0;\n }\n {\n bytes27 r_1_1_0_1_1 = bytes27(0x486b4fe3491316cf60aaf1b24c882c2e5f119221f61241cc0ceda4);\n r_1_1_0_1.s_1 = r_1_1_0_1_1;\n }\n {\n bytes26[] memory r_1_1_0_1_2 = new bytes26[](0);\n r_1_1_0_1.s_2 = r_1_1_0_1_2;\n }\n {\n uint48 r_1_1_0_1_3 = 153659014506101;\n r_1_1_0_1.s_3 = r_1_1_0_1_3;\n }\n {\n string memory r_1_1_0_1_4 = unicode\"Moo é🚀 oMooo o o🚀oMo Mo o🚀🚀 M🚀🚀 éMMo oé é é🚀\";\n r_1_1_0_1.s_4 = r_1_1_0_1_4;\n }\n r_1_1_0.s_1 = r_1_1_0_1;\n }\n {\n S_e186461d memory r_1_1_0_2;\n {\n S_61a80dab memory r_1_1_0_2_0;\n {\n uint80[3] memory r_1_1_0_2_0_0;\n {\n uint80 r_1_1_0_2_0_0_0 = 438613910329105909295447;\n r_1_1_0_2_0_0[0] = r_1_1_0_2_0_0_0;\n }\n {\n uint80 r_1_1_0_2_0_0_1 = 109089138515117367837630;\n r_1_1_0_2_0_0[1] = r_1_1_0_2_0_0_1;\n }\n {\n uint80 r_1_1_0_2_0_0_2 = 551756258728203695837695;\n r_1_1_0_2_0_0[2] = r_1_1_0_2_0_0_2;\n }\n r_1_1_0_2_0.s_0 = r_1_1_0_2_0_0;\n }\n {\n address r_1_1_0_2_0_1 = 0xA53525B2A979a63dCbE0DB7D90F07af6f7030cB3;\n r_1_1_0_2_0.s_1 = r_1_1_0_2_0_1;\n }\n {\n address[1] memory r_1_1_0_2_0_2;\n {\n address r_1_1_0_2_0_2_0 = 0x4dFb29F89fFfAeDF1457C3729698655a5Ead9959;\n r_1_1_0_2_0_2[0] = r_1_1_0_2_0_2_0;\n }\n r_1_1_0_2_0.s_2 = r_1_1_0_2_0_2;\n }\n r_1_1_0_2.s_0 = r_1_1_0_2_0;\n }\n r_1_1_0.s_2 = r_1_1_0_2;\n }\n {\n bytes17 r_1_1_0_3 = bytes17(0x7479ec281e94af181b21779008aa4c93ae);\n r_1_1_0.s_3 = r_1_1_0_3;\n }\n {\n string memory r_1_1_0_4 = unicode\"Moo é🚀M o🚀 🚀é🚀\";\n r_1_1_0.s_4 = r_1_1_0_4;\n }\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_d7052263[] memory r_1_1_1 = new S_d7052263[](3);\n {\n S_d7052263 memory r_1_1_1_0;\n {\n S_45eeec8a memory r_1_1_1_0_0;\n {\n uint40 r_1_1_1_0_0_0 = 959235691055;\n r_1_1_1_0_0.s_0 = r_1_1_1_0_0_0;\n }\n {\n int32 r_1_1_1_0_0_1 = 687495200;\n r_1_1_1_0_0.s_1 = r_1_1_1_0_0_1;\n }\n r_1_1_1_0.s_0 = r_1_1_1_0_0;\n }\n {\n int152[3] memory r_1_1_1_0_1;\n {\n int152 r_1_1_1_0_1_0 = -2610058202524881494598680315501251212508402836;\n r_1_1_1_0_1[0] = r_1_1_1_0_1_0;\n }\n {\n int152 r_1_1_1_0_1_1 = 2780725569356285966115243087928557512206402793;\n r_1_1_1_0_1[1] = r_1_1_1_0_1_1;\n }\n {\n int152 r_1_1_1_0_1_2 = 1077207467466402608201462635125866929315824113;\n r_1_1_1_0_1[2] = r_1_1_1_0_1_2;\n }\n r_1_1_1_0.s_1 = r_1_1_1_0_1;\n }\n r_1_1_1[0] = r_1_1_1_0;\n }\n {\n S_d7052263 memory r_1_1_1_1;\n {\n S_45eeec8a memory r_1_1_1_1_0;\n {\n uint40 r_1_1_1_1_0_0 = 740772022181;\n r_1_1_1_1_0.s_0 = r_1_1_1_1_0_0;\n }\n {\n int32 r_1_1_1_1_0_1 = -1086918835;\n r_1_1_1_1_0.s_1 = r_1_1_1_1_0_1;\n }\n r_1_1_1_1.s_0 = r_1_1_1_1_0;\n }\n {\n int152[3] memory r_1_1_1_1_1;\n {\n int152 r_1_1_1_1_1_0 = 838111602694930818189290813948117673620204291;\n r_1_1_1_1_1[0] = r_1_1_1_1_1_0;\n }\n {\n int152 r_1_1_1_1_1_1 = -341835273245260977313037423395088411264149546;\n r_1_1_1_1_1[1] = r_1_1_1_1_1_1;\n }\n {\n int152 r_1_1_1_1_1_2 = 2717973766499356987548601980449792157744613960;\n r_1_1_1_1_1[2] = r_1_1_1_1_1_2;\n }\n r_1_1_1_1.s_1 = r_1_1_1_1_1;\n }\n r_1_1_1[1] = r_1_1_1_1;\n }\n {\n S_d7052263 memory r_1_1_1_2;\n {\n S_45eeec8a memory r_1_1_1_2_0;\n {\n uint40 r_1_1_1_2_0_0 = 224361411732;\n r_1_1_1_2_0.s_0 = r_1_1_1_2_0_0;\n }\n {\n int32 r_1_1_1_2_0_1 = -1118855369;\n r_1_1_1_2_0.s_1 = r_1_1_1_2_0_1;\n }\n r_1_1_1_2.s_0 = r_1_1_1_2_0;\n }\n {\n int152[3] memory r_1_1_1_2_1;\n {\n int152 r_1_1_1_2_1_0 = 1102474998005592214249560468545647578861777848;\n r_1_1_1_2_1[0] = r_1_1_1_2_1_0;\n }\n {\n int152 r_1_1_1_2_1_1 = -195200546606339318499777037186549201502495424;\n r_1_1_1_2_1[1] = r_1_1_1_2_1_1;\n }\n {\n int152 r_1_1_1_2_1_2 = 2425807725283882585536390515723727006121715719;\n r_1_1_1_2_1[2] = r_1_1_1_2_1_2;\n }\n r_1_1_1_2.s_1 = r_1_1_1_2_1;\n }\n r_1_1_1[2] = r_1_1_1_2;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_98eb97a5[4] memory r_1_1_2;\n {\n S_98eb97a5 memory r_1_1_2_0;\n {\n S_c1053bda memory r_1_1_2_0_0;\n {\n bool r_1_1_2_0_0_0 = true;\n r_1_1_2_0_0.s_0 = r_1_1_2_0_0_0;\n }\n r_1_1_2_0.s_0 = r_1_1_2_0_0;\n }\n {\n bool r_1_1_2_0_1 = false;\n r_1_1_2_0.s_1 = r_1_1_2_0_1;\n }\n {\n bool r_1_1_2_0_2 = false;\n r_1_1_2_0.s_2 = r_1_1_2_0_2;\n }\n r_1_1_2[0] = r_1_1_2_0;\n }\n {\n S_98eb97a5 memory r_1_1_2_1;\n {\n S_c1053bda memory r_1_1_2_1_0;\n {\n bool r_1_1_2_1_0_0 = false;\n r_1_1_2_1_0.s_0 = r_1_1_2_1_0_0;\n }\n r_1_1_2_1.s_0 = r_1_1_2_1_0;\n }\n {\n bool r_1_1_2_1_1 = false;\n r_1_1_2_1.s_1 = r_1_1_2_1_1;\n }\n {\n bool r_1_1_2_1_2 = true;\n r_1_1_2_1.s_2 = r_1_1_2_1_2;\n }\n r_1_1_2[1] = r_1_1_2_1;\n }\n {\n S_98eb97a5 memory r_1_1_2_2;\n {\n S_c1053bda memory r_1_1_2_2_0;\n {\n bool r_1_1_2_2_0_0 = true;\n r_1_1_2_2_0.s_0 = r_1_1_2_2_0_0;\n }\n r_1_1_2_2.s_0 = r_1_1_2_2_0;\n }\n {\n bool r_1_1_2_2_1 = false;\n r_1_1_2_2.s_1 = r_1_1_2_2_1;\n }\n {\n bool r_1_1_2_2_2 = true;\n r_1_1_2_2.s_2 = r_1_1_2_2_2;\n }\n r_1_1_2[2] = r_1_1_2_2;\n }\n {\n S_98eb97a5 memory r_1_1_2_3;\n {\n S_c1053bda memory r_1_1_2_3_0;\n {\n bool r_1_1_2_3_0_0 = true;\n r_1_1_2_3_0.s_0 = r_1_1_2_3_0_0;\n }\n r_1_1_2_3.s_0 = r_1_1_2_3_0;\n }\n {\n bool r_1_1_2_3_1 = false;\n r_1_1_2_3.s_1 = r_1_1_2_3_1;\n }\n {\n bool r_1_1_2_3_2 = false;\n r_1_1_2_3.s_2 = r_1_1_2_3_2;\n }\n r_1_1_2[3] = r_1_1_2_3;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n {\n int96 r_1_1_3 = -12793842075872703372874618154;\n r_1_1.s_3 = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n r.s_1 = r_1;\n }\n {\n address r_2 = 0xc7d2F4C19c87B0CEC729a1Df6c41fE632A3F3199;\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c7d2f4c19c87b0cec729a1df6c41fe632a3f319900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806f204d4dc3a9206f20c3a94df09f9a8020206fc3a96f6f4dc3a9c3a96f6f6fc3a9206f6f6f204dc3a9f09f9a80206f4d6fc3a9000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a8020f09f9a806f206f6f6f4d204d4d20c3a9f09f9a806f6fc3a9f09f9a806f6fc3a9204d4d6f4d4d20206f000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a80f09f9a804d4dc3a96f6f6fc3a96f20c3a9f09f9a8020f09f9a806f6f6ff09f9a80f09f9a804dc3a94d6f6f206fc3a96f6f4d206ff09f9a806f6f4d204d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffd6a92e8f5859a6851bf9ead600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000005ce14ec6f03a62a02957000000000000000000000000000000000000000000001719bbea9c78ea9f43be0000000000000000000000000000000000000000000074d6c447bf5ab05a51ff000000000000000000000000a53525b2a979a63dcbe0db7d90f07af6f7030cb30000000000000000000000004dfb29f89fffaedf1457c3729698655a5ead99597479ec281e94af181b21779008aa4c93ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000260932dde65fb9f2f69ca4738000000000000000000000000000000000000000000486b4fe3491316cf60aaf1b24c882c2e5f119221f61241cc0ceda4000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000008bc086f9e67500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a802020206f4d6f6f6f206f206ff09f9a806f4d6f204d6f206ff09f9a80f09f9a80204df09f9a80f09f9a802020c3a94d4d6f20206fc3a920c3a920c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a804d20206ff09f9a8020f09f9a80c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000df56e7122f0000000000000000000000000000000000000000000000000000000028fa5820ffffffffffffffffffffffffff8af60051ac6170609901606e25e62b3827eb6c000000000000000000000000007cb129feb2a6d316f6cc89b9a4cf57747144e900000000000000000000000000304dbc3b4f1bbfc5c98b9b61d10efd0da2c1f1000000000000000000000000000000000000000000000000000000ac797407a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf36ef4d0000000000000000000000000025950ca2c4dac1f6289b13672483f6ac3aeb03fffffffffffffffffffffffffff0abec6b20ea781f0e9fcedf462bb5e35e17d60000000000000000000000000079e0cf054001db96c78daec7f748f8258fca48000000000000000000000000000000000000000000000000000000343cfb7494ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd4f9f3700000000000000000000000000316fcad487b90a8af447b7ac8ddd2b886bb3b8fffffffffffffffffffffffffff73f352685026dc7ac5c109dbb9b1daf3b9d40000000000000000000000000006cc6e8317102f24ae6faf96804d4615029e807" + }, + { + "name": "random-(bytes30,bytes7,(int136,address,(string[1][1],bytes19[],bytes31)[1][3],bytes24,((address,address,bytes28,uint232,(address)[3]),uint96,address,(bool,string,bool,address))),(int56)[3],bytes22)", + "type": "(bytes30,bytes7,(int136,address,(string[1][1],bytes19[],bytes31)[1][3],bytes24,((address,address,bytes28,uint232,(address)[3]),uint96,address,(bool,string,bool,address))),(int56)[3],bytes22)", + "value": [ + "0x5f5d352fca8a9ea5e254a92ba6681792727744e3e356040e9e5d1b73df11", + "0xd07533559b7ef7", + [ + "1306039673636518585167882872355422852819", + "0x4eD38da1C5E3a6746159ba3832fa336E42055e97", + [ + [ + [ + [["Moo é🚀ooo M oMoééoé o🚀o é oé"]], + ["0x38192d53fe889666488f69b55dfdcf6092a490"], + "0xe831da8b992dc658f5af6803d7ef81ca4bf6c3897a74bdfb4b5752308a52fa" + ] + ], + [ + [ + [["Moo é🚀MMMMooMo o🚀"]], + ["0x266357e85a31df97e500d8b954de2cbe6eb08c"], + "0x4d84beba0117b002fed97b7f7bc8c4e397f5f3390b9a3b569ecb005011eb6c" + ] + ], + [ + [ + [["Moo é🚀 o🚀Moo o é🚀M Mo o o🚀o🚀o🚀o🚀oM🚀Moé MooM🚀🚀🚀é"]], + ["0x96542913c916734ded115304ac48d36a952c3f"], + "0x54707e7a914ba206d67d32c13024639a1521666cf374e31bb03e6d9687203c" + ] + ] + ], + "0xb98bebf0256285e503fe730c31d8455818eae2cd79d33a89", + [ + [ + "0xC08c5F28E64246B371656230D745a87A05a1Baa8", + "0x6A70eF3c732A585597d3C659e6172EC369c2CDC3", + "0x45d9ff2af520d886c680d828398e7f7489371bb65c417d0b5d4f96c9", + "4997943072066713965471440540305387975190501104903100977694463974629336", + [ + ["0x1B4871c2426256CD8400A22582f523FA093D732C"], + ["0x9eB46D172441C2f713fDf5E5eB9348d3e4aE5870"], + ["0xF1FA3F8599Dc73d950F54C6e64E2D5C49b5D232d"] + ] + ], + "37540739180973795964288335750", + "0x128B35FB7C6588c673112821A76fa0a366eA1164", + [ + true, + "Moo é🚀ooooM oooMo🚀oé oMéo🚀MMMo🚀 oéoM🚀 MM🚀o M", + false, + "0x89dFA1f59942188D880be9AFa1ac701dA48a7B9D" + ] + ] + ], + [["20192835943828866"], ["-10916524283924597"], ["1181717350936765"]], + "0xf592bf6ffb021a41dd7525117ff7afaf547b1b0ad729" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5f5d352fca8a9ea5e254a92ba6681792727744e3e356040e9e5d1b73df11" + }, + { + "type": "hexstring", + "value": "0xd07533559b7ef7" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1306039673636518585167882872355422852819" + }, + { + "type": "address", + "value": "0x4eD38da1C5E3a6746159ba3832fa336E42055e97" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo M oMoééoé o🚀o é oé" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x38192d53fe889666488f69b55dfdcf6092a490" + } + ] + }, + { + "type": "hexstring", + "value": "0xe831da8b992dc658f5af6803d7ef81ca4bf6c3897a74bdfb4b5752308a52fa" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMMMooMo o🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x266357e85a31df97e500d8b954de2cbe6eb08c" + } + ] + }, + { + "type": "hexstring", + "value": "0x4d84beba0117b002fed97b7f7bc8c4e397f5f3390b9a3b569ecb005011eb6c" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 o🚀Moo o é🚀M Mo o o🚀o🚀o🚀o🚀oM🚀Moé MooM🚀🚀🚀é" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x96542913c916734ded115304ac48d36a952c3f" + } + ] + }, + { + "type": "hexstring", + "value": "0x54707e7a914ba206d67d32c13024639a1521666cf374e31bb03e6d9687203c" + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xb98bebf0256285e503fe730c31d8455818eae2cd79d33a89" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xC08c5F28E64246B371656230D745a87A05a1Baa8" + }, + { + "type": "address", + "value": "0x6A70eF3c732A585597d3C659e6172EC369c2CDC3" + }, + { + "type": "hexstring", + "value": "0x45d9ff2af520d886c680d828398e7f7489371bb65c417d0b5d4f96c9" + }, + { + "type": "number", + "value": "4997943072066713965471440540305387975190501104903100977694463974629336" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1B4871c2426256CD8400A22582f523FA093D732C" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x9eB46D172441C2f713fDf5E5eB9348d3e4aE5870" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xF1FA3F8599Dc73d950F54C6e64E2D5C49b5D232d" + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "37540739180973795964288335750" + }, + { + "type": "address", + "value": "0x128B35FB7C6588c673112821A76fa0a366eA1164" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀ooooM oooMo🚀oé oMéo🚀MMMo🚀 oéoM🚀 MM🚀o M" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x89dFA1f59942188D880be9AFa1ac701dA48a7B9D" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "20192835943828866" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-10916524283924597" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1181717350936765" + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0xf592bf6ffb021a41dd7525117ff7afaf547b1b0ad729" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610c88806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b604051610045919061099d565b60405180910390f35b6100566105ce565b61005e6105ce565b7f5f5d352fca8a9ea5e254a92ba6681792727744e3e356040e9e5d1b73df110000815266d07533559b7ef760c81b6020820152610099610607565b7003d68e177330fbcaf6e0caeb331ad9d6d38152734ed38da1c5e3a6746159ba3832fa336e42055e9760208201526100cf61063f565b6100d761066c565b6100df610699565b6100e76106c0565b6100ef6106ed565b6000604051806060016040528060298152602001610c2a6029913982525081528152604080516001808252818301909252600091602080830190803683375050815191925072038192d53fe889666488f69b55dfdcf6092a49606c1b91829150839060009061016057610160610b7b565b6001600160681b031992909216602092830291909101820152830191909152507fe831da8b992dc658f5af6803d7ef81ca4bf6c3897a74bdfb4b5752308a52fa006040820152815281526101b261066c565b6101ba610699565b6101c26106c0565b6101ca6106ed565b604080518082018252601881527f4d6f6f20c3a9f09f9a804d4d4d4d6f6f4d6f206ff09f9a800000000000000000602082015282529082529082528051600180825281830190925260009181602001602082028036833750508151919250720998d5fa168c77e5f940362e55378b2f9bac23606a1b91829150839060009061025457610254610b7b565b6001600160681b03199290921660209283029190910182015283810192909252507f4d84beba0117b002fed97b7f7bc8c4e397f5f3390b9a3b569ecb005011eb6c0060408301529082528201526102a961066c565b6102b1610699565b6102b96106c0565b6102c16106ed565b6000604051806080016040528060568152602001610bd4605691398252508152815260408051600180825281830190925260009160208083019080368337505081519192507296542913c916734ded115304ac48d36a952c3f60681b91829150839060009061033257610332610b7b565b6001600160681b031992909216602092830291909101820152830191909152507f54707e7a914ba206d67d32c13024639a1521666cf374e31bb03e6d9687203c00604080830191909152908252828101919091528201527fb98bebf0256285e503fe730c31d8455818eae2cd79d33a89000000000000000060608201526103b7610714565b6103bf610765565b73c08c5f28e64246b371656230d745a87a05a1baa88152736a70ef3c732a585597d3c659e6172ec369c2cdc360208201527f45d9ff2af520d886c680d828398e7f7489371bb65c417d0b5d4f96c90000000060408201527cb9624e9988ff007b7aa1ed27605e0874c0cbe1d6b54889c56df182dfd86060820152610441610791565b6040805160208082018352731b4871c2426256cd8400a22582f523fa093d732c825290835281518082018352739eb46d172441c2f713fdf5e5eb9348d3e4ae58708152838201528151808201835273f1fa3f8599dc73d950f54c6e64e2d5c49b5d232d8152838301526080848101939093529284526b794cf8bcd60f84d5a54d7f868484015273128b35fb7c6588c673112821a76fa0a366ea116484820152805180830182526060818501819052600082840181905290820181905260018252825193840190925260428084529093919291610b929083013960208301525060006040808301919091527389dfa1f59942188d880be9afa1ac701da48a7b9d6060808401919091528301919091526080830191909152820152610562610791565b60408051602080820183526647bd46fd708d828252908352815180820183526626c885602010741981528382015281519081018252660432c402ed70bd815290820152606082015275f592bf6ffb021a41dd7525117ff7afaf547b1b0ad72960501b6080820152919050565b6040805160a081018252600080825260208201529081016105ed610607565b81526020016105fa610791565b8152600060209091015290565b6040805160a0810182526000808252602082015290810161062661063f565b81526000602082015260400161063a610714565b905290565b60405180606001604052806003905b61065661066c565b81526020019060019003908161064e5790505090565b60405180602001604052806001905b610683610699565b81526020019060019003908161067b5790505090565b60405180606001604052806106ac6106c0565b815260606020820152600060409091015290565b60405180602001604052806001905b6106d76106ed565b8152602001906001900390816106cf5790505090565b60405180602001604052806001905b60608152602001906001900390816106fc5790505090565b6040518060800160405280610727610765565b8152600060208201819052604082015260600161063a6040805160808101825260008082526060602083018190529282018190529181019190915290565b6040805160a08101825260008082526020820181905291810182905260608101919091526080810161063a5b60405180606001604052806003905b6040805160208101909152600081528152602001906001900390816107a05790505090565b6000815180845260005b818110156107eb576020818501810151868301820152016107cf565b818111156107fd576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b8381101561084c5781516001600160681b03191687529582019590820190600101610826565b509495945050505050565b805115158252600060208201516080602085015261087860808501826107c5565b6040848101511515908601526060938401516001600160a01b031693909401929092525090919050565b805180516001600160a01b03908116845260208083015182168186015260408084015163ffffffff1916908601526060808401516001600160e81b031690860152608092830151600093610140939192908701855b6003811015610917578451518416825293820193908201906001016108f7565b50508501516bffffffffffffffffffffffff811660e088015291506109399050565b5060408301516001600160a01b03166101008501526060830151610120850182905261096782860182610857565b95945050505050565b8060005b60038110156109975781515160060b845260209384019390910190600101610974565b50505050565b6020808252825161ffff191682820152828101516001600160c81b0319166040808401919091528084015160e06060850152805160100b610100850152918201516001600160a01b031661012084015281015160a0610140840152600091906101a084016102008501845b6003811015610b0b5786820361019f190183528351826020810160005b6001811015610af35785820383528351805160608452606084016080850160005b6001811015610aa857868203605f190183528351826020810160005b6001811015610a90578582038352610a7b8285516107c5565b60209485019493909301929150600101610a62565b50602096870196959095019493505050600101610a46565b50602084015192508581036020870152610ac28184610812565b9250505060408201519150610add604085018360ff19169052565b6020958601959490940193925050600101610a25565b50602096870196959095019493505050600101610a08565b50606084015167ffffffffffffffff19811661016088015260809094015186820360ff1901610180880152939250610b4381856108a2565b93505050506060840151610b5a6080850182610970565b50608084015169ffffffffffffffffffff19811660e0850152509392505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6f6f6f4d206f6f6f4d6ff09f9a806fc3a9206f4dc3a96ff09f9a804d4d4d6ff09f9a80206fc3a96f4df09f9a80204d4df09f9a806f204d4d6f6f20c3a9f09f9a80206ff09f9a804d6f6f20206f20c3a9f09f9a804d204d6f206f20206ff09f9a806ff09f9a806ff09f9a806ff09f9a806f4df09f9a804d6fc3a9204d6f6f4df09f9a80f09f9a80f09f9a80c3a94d6f6f20c3a9f09f9a806f6f6f204d20206f4d6fc3a9c3a96fc3a9206ff09f9a806f20c3a9206fc3a9a264697066735822122017df297b216ca4ab8c6b351feb0de33b6ef42cb40120d76a8cf6cf8717c823ad64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_89f36773 {\n string[1][1] s_0;\n bytes19[] s_1;\n bytes31 s_2;\n }\n\n struct S_421683f8 {\n address s_0;\n }\n\n struct S_40fc726f {\n address s_0;\n address s_1;\n bytes28 s_2;\n uint232 s_3;\n S_421683f8[3] s_4;\n }\n\n struct S_e22ab74a {\n bool s_0;\n string s_1;\n bool s_2;\n address s_3;\n }\n\n struct S_0da4c039 {\n S_40fc726f s_0;\n uint96 s_1;\n address s_2;\n S_e22ab74a s_3;\n }\n\n struct S_09138acc {\n int136 s_0;\n address s_1;\n S_89f36773[1][3] s_2;\n bytes24 s_3;\n S_0da4c039 s_4;\n }\n\n struct S_14df74d1 {\n int56 s_0;\n }\n\n struct S_da06ed5e {\n bytes30 s_0;\n bytes7 s_1;\n S_09138acc s_2;\n S_14df74d1[3] s_3;\n bytes22 s_4;\n }\n\n function test () public pure returns (S_da06ed5e memory) {\n S_da06ed5e memory r;\n {\n bytes30 r_0 = bytes30(0x5f5d352fca8a9ea5e254a92ba6681792727744e3e356040e9e5d1b73df11);\n r.s_0 = r_0;\n }\n {\n bytes7 r_1 = bytes7(0xd07533559b7ef7);\n r.s_1 = r_1;\n }\n {\n S_09138acc memory r_2;\n {\n int136 r_2_0 = 1306039673636518585167882872355422852819;\n r_2.s_0 = r_2_0;\n }\n {\n address r_2_1 = 0x4eD38da1C5E3a6746159ba3832fa336E42055e97;\n r_2.s_1 = r_2_1;\n }\n {\n S_89f36773[1][3] memory r_2_2;\n {\n S_89f36773[1] memory r_2_2_0;\n {\n S_89f36773 memory r_2_2_0_0;\n {\n string[1][1] memory r_2_2_0_0_0;\n {\n string[1] memory r_2_2_0_0_0_0;\n {\n string memory r_2_2_0_0_0_0_0 = unicode\"Moo é🚀ooo M oMoééoé o🚀o é oé\";\n r_2_2_0_0_0_0[0] = r_2_2_0_0_0_0_0;\n }\n r_2_2_0_0_0[0] = r_2_2_0_0_0_0;\n }\n r_2_2_0_0.s_0 = r_2_2_0_0_0;\n }\n {\n bytes19[] memory r_2_2_0_0_1 = new bytes19[](1);\n {\n bytes19 r_2_2_0_0_1_0 = bytes19(0x38192d53fe889666488f69b55dfdcf6092a490);\n r_2_2_0_0_1[0] = r_2_2_0_0_1_0;\n }\n r_2_2_0_0.s_1 = r_2_2_0_0_1;\n }\n {\n bytes31 r_2_2_0_0_2 = bytes31(0xe831da8b992dc658f5af6803d7ef81ca4bf6c3897a74bdfb4b5752308a52fa);\n r_2_2_0_0.s_2 = r_2_2_0_0_2;\n }\n r_2_2_0[0] = r_2_2_0_0;\n }\n r_2_2[0] = r_2_2_0;\n }\n {\n S_89f36773[1] memory r_2_2_1;\n {\n S_89f36773 memory r_2_2_1_0;\n {\n string[1][1] memory r_2_2_1_0_0;\n {\n string[1] memory r_2_2_1_0_0_0;\n {\n string memory r_2_2_1_0_0_0_0 = unicode\"Moo é🚀MMMMooMo o🚀\";\n r_2_2_1_0_0_0[0] = r_2_2_1_0_0_0_0;\n }\n r_2_2_1_0_0[0] = r_2_2_1_0_0_0;\n }\n r_2_2_1_0.s_0 = r_2_2_1_0_0;\n }\n {\n bytes19[] memory r_2_2_1_0_1 = new bytes19[](1);\n {\n bytes19 r_2_2_1_0_1_0 = bytes19(0x266357e85a31df97e500d8b954de2cbe6eb08c);\n r_2_2_1_0_1[0] = r_2_2_1_0_1_0;\n }\n r_2_2_1_0.s_1 = r_2_2_1_0_1;\n }\n {\n bytes31 r_2_2_1_0_2 = bytes31(0x4d84beba0117b002fed97b7f7bc8c4e397f5f3390b9a3b569ecb005011eb6c);\n r_2_2_1_0.s_2 = r_2_2_1_0_2;\n }\n r_2_2_1[0] = r_2_2_1_0;\n }\n r_2_2[1] = r_2_2_1;\n }\n {\n S_89f36773[1] memory r_2_2_2;\n {\n S_89f36773 memory r_2_2_2_0;\n {\n string[1][1] memory r_2_2_2_0_0;\n {\n string[1] memory r_2_2_2_0_0_0;\n {\n string memory r_2_2_2_0_0_0_0 = unicode\"Moo é🚀 o🚀Moo o é🚀M Mo o o🚀o🚀o🚀o🚀oM🚀Moé MooM🚀🚀🚀é\";\n r_2_2_2_0_0_0[0] = r_2_2_2_0_0_0_0;\n }\n r_2_2_2_0_0[0] = r_2_2_2_0_0_0;\n }\n r_2_2_2_0.s_0 = r_2_2_2_0_0;\n }\n {\n bytes19[] memory r_2_2_2_0_1 = new bytes19[](1);\n {\n bytes19 r_2_2_2_0_1_0 = bytes19(0x96542913c916734ded115304ac48d36a952c3f);\n r_2_2_2_0_1[0] = r_2_2_2_0_1_0;\n }\n r_2_2_2_0.s_1 = r_2_2_2_0_1;\n }\n {\n bytes31 r_2_2_2_0_2 = bytes31(0x54707e7a914ba206d67d32c13024639a1521666cf374e31bb03e6d9687203c);\n r_2_2_2_0.s_2 = r_2_2_2_0_2;\n }\n r_2_2_2[0] = r_2_2_2_0;\n }\n r_2_2[2] = r_2_2_2;\n }\n r_2.s_2 = r_2_2;\n }\n {\n bytes24 r_2_3 = bytes24(0xb98bebf0256285e503fe730c31d8455818eae2cd79d33a89);\n r_2.s_3 = r_2_3;\n }\n {\n S_0da4c039 memory r_2_4;\n {\n S_40fc726f memory r_2_4_0;\n {\n address r_2_4_0_0 = 0xC08c5F28E64246B371656230D745a87A05a1Baa8;\n r_2_4_0.s_0 = r_2_4_0_0;\n }\n {\n address r_2_4_0_1 = 0x6A70eF3c732A585597d3C659e6172EC369c2CDC3;\n r_2_4_0.s_1 = r_2_4_0_1;\n }\n {\n bytes28 r_2_4_0_2 = bytes28(0x45d9ff2af520d886c680d828398e7f7489371bb65c417d0b5d4f96c9);\n r_2_4_0.s_2 = r_2_4_0_2;\n }\n {\n uint232 r_2_4_0_3 = 4997943072066713965471440540305387975190501104903100977694463974629336;\n r_2_4_0.s_3 = r_2_4_0_3;\n }\n {\n S_421683f8[3] memory r_2_4_0_4;\n {\n S_421683f8 memory r_2_4_0_4_0;\n {\n address r_2_4_0_4_0_0 = 0x1B4871c2426256CD8400A22582f523FA093D732C;\n r_2_4_0_4_0.s_0 = r_2_4_0_4_0_0;\n }\n r_2_4_0_4[0] = r_2_4_0_4_0;\n }\n {\n S_421683f8 memory r_2_4_0_4_1;\n {\n address r_2_4_0_4_1_0 = 0x9eB46D172441C2f713fDf5E5eB9348d3e4aE5870;\n r_2_4_0_4_1.s_0 = r_2_4_0_4_1_0;\n }\n r_2_4_0_4[1] = r_2_4_0_4_1;\n }\n {\n S_421683f8 memory r_2_4_0_4_2;\n {\n address r_2_4_0_4_2_0 = 0xF1FA3F8599Dc73d950F54C6e64E2D5C49b5D232d;\n r_2_4_0_4_2.s_0 = r_2_4_0_4_2_0;\n }\n r_2_4_0_4[2] = r_2_4_0_4_2;\n }\n r_2_4_0.s_4 = r_2_4_0_4;\n }\n r_2_4.s_0 = r_2_4_0;\n }\n {\n uint96 r_2_4_1 = 37540739180973795964288335750;\n r_2_4.s_1 = r_2_4_1;\n }\n {\n address r_2_4_2 = 0x128B35FB7C6588c673112821A76fa0a366eA1164;\n r_2_4.s_2 = r_2_4_2;\n }\n {\n S_e22ab74a memory r_2_4_3;\n {\n bool r_2_4_3_0 = true;\n r_2_4_3.s_0 = r_2_4_3_0;\n }\n {\n string memory r_2_4_3_1 = unicode\"Moo é🚀ooooM oooMo🚀oé oMéo🚀MMMo🚀 oéoM🚀 MM🚀o M\";\n r_2_4_3.s_1 = r_2_4_3_1;\n }\n {\n bool r_2_4_3_2 = false;\n r_2_4_3.s_2 = r_2_4_3_2;\n }\n {\n address r_2_4_3_3 = 0x89dFA1f59942188D880be9AFa1ac701dA48a7B9D;\n r_2_4_3.s_3 = r_2_4_3_3;\n }\n r_2_4.s_3 = r_2_4_3;\n }\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n S_14df74d1[3] memory r_3;\n {\n S_14df74d1 memory r_3_0;\n {\n int56 r_3_0_0 = 20192835943828866;\n r_3_0.s_0 = r_3_0_0;\n }\n r_3[0] = r_3_0;\n }\n {\n S_14df74d1 memory r_3_1;\n {\n int56 r_3_1_0 = -10916524283924597;\n r_3_1.s_0 = r_3_1_0;\n }\n r_3[1] = r_3_1;\n }\n {\n S_14df74d1 memory r_3_2;\n {\n int56 r_3_2_0 = 1181717350936765;\n r_3_2.s_0 = r_3_2_0;\n }\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n {\n bytes22 r_4 = bytes22(0xf592bf6ffb021a41dd7525117ff7afaf547b1b0ad729);\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000205f5d352fca8a9ea5e254a92ba6681792727744e3e356040e9e5d1b73df110000d07533559b7ef70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000047bd46fd708d82ffffffffffffffffffffffffffffffffffffffffffffffffffd9377a9fdfef8b000000000000000000000000000000000000000000000000000432c402ed70bdf592bf6ffb021a41dd7525117ff7afaf547b1b0ad7290000000000000000000000000000000000000000000000000003d68e177330fbcaf6e0caeb331ad9d6d30000000000000000000000004ed38da1c5e3a6746159ba3832fa336e42055e9700000000000000000000000000000000000000000000000000000000000000a0b98bebf0256285e503fe730c31d8455818eae2cd79d33a8900000000000000000000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100e831da8b992dc658f5af6803d7ef81ca4bf6c3897a74bdfb4b5752308a52fa000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a806f6f6f204d20206f4d6fc3a9c3a96fc3a9206ff09f9a806f20c3a9206fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000138192d53fe889666488f69b55dfdcf6092a490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e04d84beba0117b002fed97b7f7bc8c4e397f5f3390b9a3b569ecb005011eb6c000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000184d6f6f20c3a9f09f9a804d4d4d4d6f6f4d6f206ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000001266357e85a31df97e500d8b954de2cbe6eb08c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012054707e7a914ba206d67d32c13024639a1521666cf374e31bb03e6d9687203c000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a80206ff09f9a804d6f6f20206f20c3a9f09f9a804d204d6f206f20206ff09f9a806ff09f9a806ff09f9a806ff09f9a806f4df09f9a804d6fc3a9204d6f6f4df09f9a80f09f9a80f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000196542913c916734ded115304ac48d36a952c3f00000000000000000000000000000000000000000000000000c08c5f28e64246b371656230d745a87a05a1baa80000000000000000000000006a70ef3c732a585597d3c659e6172ec369c2cdc345d9ff2af520d886c680d828398e7f7489371bb65c417d0b5d4f96c900000000000000b9624e9988ff007b7aa1ed27605e0874c0cbe1d6b54889c56df182dfd80000000000000000000000001b4871c2426256cd8400a22582f523fa093d732c0000000000000000000000009eb46d172441c2f713fdf5e5eb9348d3e4ae5870000000000000000000000000f1fa3f8599dc73d950f54c6e64e2d5c49b5d232d0000000000000000000000000000000000000000794cf8bcd60f84d5a54d7f86000000000000000000000000128b35fb7c6588c673112821a76fa0a366ea1164000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089dfa1f59942188d880be9afa1ac701da48a7b9d00000000000000000000000000000000000000000000000000000000000000424d6f6f20c3a9f09f9a806f6f6f6f4d206f6f6f4d6ff09f9a806fc3a9206f4dc3a96ff09f9a804d4d4d6ff09f9a80206fc3a96f4df09f9a80204d4df09f9a806f204d000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int64,uint216,((((address,uint64,bool,string),uint232,((address[],(uint128,bool,address[4],uint224),(bool,address),address,int224),uint216)[2],bool),uint224,string,uint256),bool[2]),string,address)", + "type": "(int64,uint216,((((address,uint64,bool,string),uint232,((address[],(uint128,bool,address[4],uint224),(bool,address),address,int224),uint216)[2],bool),uint224,string,uint256),bool[2]),string,address)", + "value": [ + "8330845538682408411", + "39440413475746584866034360885808897725118995802210616863384418372", + [ + [ + [ + [ + "0x4aa099fB378470A1cb12b767E3a93bFC9bD4fa38", + "7473038770836942203", + true, + "Moo é🚀Mo🚀ooMM " + ], + "2419147848231734414669938811585331416595206977948376671966594465920102", + [ + [ + [ + [], + [ + "260772859105816539547441437415013987391", + true, + [ + "0xCB106Aa514Ac75b3473607DE542aB6585e3565f6", + "0x9Af14cD9739832526Cca0a44C0A914fA65a8df4B", + "0xeecb517743cC66aAFa097B48254F3aA3073A6E93", + "0x6E14132ec5Ce4C3d5098920ffc85420F006c685f" + ], + "9508164638497437534697334918753352283602027495535560506733042052482" + ], + [false, "0xfd2Da0E8Be5ebc79ba103f3CC306E7367b2b9798"], + "0x546d37C1eb13f7723159a4b7eC36287632F15e11", + "5586327429394393481981633760347688910143420084162611983519440884588" + ], + "80589567226374196294465531483948708847207452953622191230714217300" + ], + [ + [ + [ + "0x77C58Ee965388f813D35996aD9F4F51d61B85732", + "0xa95E72bB1A5491A4B48283Eaf3c5bbad04D390Fc", + "0x006f5b28E986A46ebbA59aB539CB0122fF882562", + "0x9541D90B6CE4fBCfBD8D89A6F1ea51753b44B8c8" + ], + [ + "171746513045073861320980928699843358239", + true, + [ + "0xB68D05a74d7976B07978a83ebd5911e96b08A05C", + "0x6864B4497d16e69b819bA9749504595727D43Cae", + "0xfaa01BeeF5569E7ef25728dc8973E863Ab2e725D", + "0x531354eA767201Bd8E299fD3B85934e792687c90" + ], + "12582044321789371836526942939751260089885119678753181163416513210050" + ], + [true, "0x0f2e8832E9490f3B0f373Db5123E87Bb12AaDab4"], + "0x9AB3b29e0aF88A166a5f52506F0D0e99cD763928", + "-5934343975450553320293286355062552340517248675375210157205680159376" + ], + "7188981163680688580887813153193943425396877509459644168378733834" + ] + ], + false + ], + "3728896344359859098430523511132062334724973526989983580225568346094", + "Moo é🚀🚀 oMM Moo", + "74163517662011946694821071607873515128966767506857702118445238519541820419694" + ], + [true, false] + ], + "Moo é🚀", + "0x44B7Bc6127A968CD445FB47c454d93C7243590c6" + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "8330845538682408411" + }, + { + "type": "number", + "value": "39440413475746584866034360885808897725118995802210616863384418372" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x4aa099fB378470A1cb12b767E3a93bFC9bD4fa38" + }, + { + "type": "number", + "value": "7473038770836942203" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀ooMM " + } + ] + }, + { + "type": "number", + "value": "2419147848231734414669938811585331416595206977948376671966594465920102" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "260772859105816539547441437415013987391" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xCB106Aa514Ac75b3473607DE542aB6585e3565f6" + }, + { + "type": "address", + "value": "0x9Af14cD9739832526Cca0a44C0A914fA65a8df4B" + }, + { + "type": "address", + "value": "0xeecb517743cC66aAFa097B48254F3aA3073A6E93" + }, + { + "type": "address", + "value": "0x6E14132ec5Ce4C3d5098920ffc85420F006c685f" + } + ] + }, + { + "type": "number", + "value": "9508164638497437534697334918753352283602027495535560506733042052482" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xfd2Da0E8Be5ebc79ba103f3CC306E7367b2b9798" + } + ] + }, + { + "type": "address", + "value": "0x546d37C1eb13f7723159a4b7eC36287632F15e11" + }, + { + "type": "number", + "value": "5586327429394393481981633760347688910143420084162611983519440884588" + } + ] + }, + { + "type": "number", + "value": "80589567226374196294465531483948708847207452953622191230714217300" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x77C58Ee965388f813D35996aD9F4F51d61B85732" + }, + { + "type": "address", + "value": "0xa95E72bB1A5491A4B48283Eaf3c5bbad04D390Fc" + }, + { + "type": "address", + "value": "0x006f5b28E986A46ebbA59aB539CB0122fF882562" + }, + { + "type": "address", + "value": "0x9541D90B6CE4fBCfBD8D89A6F1ea51753b44B8c8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "171746513045073861320980928699843358239" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xB68D05a74d7976B07978a83ebd5911e96b08A05C" + }, + { + "type": "address", + "value": "0x6864B4497d16e69b819bA9749504595727D43Cae" + }, + { + "type": "address", + "value": "0xfaa01BeeF5569E7ef25728dc8973E863Ab2e725D" + }, + { + "type": "address", + "value": "0x531354eA767201Bd8E299fD3B85934e792687c90" + } + ] + }, + { + "type": "number", + "value": "12582044321789371836526942939751260089885119678753181163416513210050" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x0f2e8832E9490f3B0f373Db5123E87Bb12AaDab4" + } + ] + }, + { + "type": "address", + "value": "0x9AB3b29e0aF88A166a5f52506F0D0e99cD763928" + }, + { + "type": "number", + "value": "-5934343975450553320293286355062552340517248675375210157205680159376" + } + ] + }, + { + "type": "number", + "value": "7188981163680688580887813153193943425396877509459644168378733834" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "3728896344359859098430523511132062334724973526989983580225568346094" + }, + { + "type": "string", + "value": "Moo é🚀🚀 oMM Moo" + }, + { + "type": "number", + "value": "74163517662011946694821071607873515128966767506857702118445238519541820419694" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "address", + "value": "0x44B7Bc6127A968CD445FB47c454d93C7243590c6" + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610bd7806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610a0d565b60405180910390f35b61005661066a565b61005e61066a565b67739d1be0f3d00ddb81527a5fdfd45e34cc25b7e76fc5d7fedb385a0d8d3a42a9b37e0ae43844602082015261009261069d565b61009a6106c2565b6100a26106f9565b604080516080810182526060808201908152734aa099fb378470a1cb12b767e3a93bfc9bd4fa3882526767b5912b10752d7b60208084019190915260018385015283518085019094526015845274026b7b79061d4f84fcd4026b7f84fcd4037b7a6a69605d1b8482015292905282527c59bb2ea9e52534f0997aed26f0f1411e4ed60506bb953d3671d871f4669082015261013b610741565b61014361076e565b61014b61077d565b60408051600081526020810190915281526101646107ca565b6fc42f069b0f81b4b4c6d7c450f605b43f8152600160208201526101866107e5565b73cb106aa514ac75b3473607de542ab6585e3565f68152739af14cd9739832526cca0a44c0a914fa65a8df4b60208083019190915273eecb517743cc66aafa097b48254f3aa3073a6e93604080840191909152736e14132ec5ce4c3d5098920ffc85420f006c685f606080850191909152848201939093527b5a49116187d4a5d9c2948ad7759f5dee153e5de3b4d7a602018bad828484015284820193909352825180840184526000815273fd2da0e8be5ebc79ba103f3cc306e7367b2b9798818301529284019290925273546d37c1eb13f7723159a4b7ec36287632f15e11908301527b350b9c18120feaa32ca7fddb2fe999165cefa68ca77f5a82f272d36c60808301529082527ac3e702c45a1f8a5344d42f59d30c7eb2b73e1bc156f101b5d983549082015281526102b961076e565b6102c161077d565b60408051600480825260a082019092526000916020820160808036833701905050905060007377c58ee965388f813d35996ad9f4f51d61b857329050808260008151811061031157610311610b8b565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073a95e72bb1a5491a4b48283eaf3c5bbad04d390fc9050808260018151811061035f5761035f610b8b565b60200260200101906001600160a01b031690816001600160a01b031681525050506000726f5b28e986a46ebba59ab539cb0122ff882562905080826002815181106103ac576103ac610b8b565b60200260200101906001600160a01b031690816001600160a01b031681525050506000739541d90b6ce4fbcfbd8d89a6f1ea51753b44b8c8905080826003815181106103fa576103fa610b8b565b6001600160a01b039092166020928302919091019091015250815261041d6107ca565b6f81352cdbfd16c145aab510397e462e1f81526001602082015261043f6107e5565b73b68d05a74d7976b07978a83ebd5911e96b08a05c8152736864b4497d16e69b819ba9749504595727d43cae60208083019190915273faa01beef5569e7ef25728dc8973e863ab2e725d60408084019190915273531354ea767201bd8e299fd3b85934e792687c90606080850191909152848201939093527b77794167748c3ecdc2c76a2e2d505397cfce8eb51dc4a0b1f774e6c284840152848201939093528251808401845260018152730f2e8832e9490f3b0f373db5123e87bb12aadab48183015284840152739ab3b29e0af88a166a5f52506f0d0e99cd763928848301527fffffffffc7a668ad7bb3ce0eed66048a48c01c0e9ddc5143f1b571fcd516057060808501529284527a1179b6c62c5b455a6bf0188da4896d83b7606fb8b9b82d033f550a8484015284830193909352848101939093526000848301529284527b236871e45d779af25c09457a3bd13f870c54a70295e67ed6a82d8fee8484015281518083018352601781527f4d6f6f20c3a9f09f9a80f09f9a8020206f4d4d204d6f6f00000000000000000093810193909352908301919091527fa3f7103eaf7ce0812b348bce90f864b7911baacc50bbfc956a8a199daec5ee6e90820152815261060a610803565b600181526000602080830191909152828101919091526040838101929092528151808301909252600a8252689adede418753e13f3560b71b9082015260608201527344b7bc6127a968cd445fb47c454d93c7243590c66080820152919050565b6040805160a0810182526000808252602082015290810161068961069d565b815260606020820152600060409091015290565b60405180604001604052806106b06106c2565b81526020016106bd610803565b905290565b60405180608001604052806106d56106f9565b815260200160006001600160e01b0316815260200160608152602001600081525090565b604080516101008101825260006080820181815260a0830182905260c08301829052606060e084015282526020820152908101610734610741565b8152600060209091015290565b60405180604001604052806002905b61075861076e565b8152602001906001900390816107505790505090565b60405180604001604052806107345b6040518060a00160405280606081526020016107976107ca565b81526020016107b6604080518082019091526000808252602082015290565b815260006020820181905260409091015290565b60408051608081018252600080825260208201529081016107345b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b818110156108475760208185018101518683018201520161082b565b81811115610859576000602083870101525b50601f01601f19169290920160200192915050565b6fffffffffffffffffffffffffffffffff815116825260208082015115158184015260408201516040840160005b60048110156108c25782516001600160a01b03168252918301919083019060010161089c565b50505050606001516001600160e01b031660c09190910152565b6000826040808201846000805b60028110156109d557858403895282518051868652805161018088880181905281516101c08901819052602092830191906101e08a0190885b818110156109475784516001600160a01b031683529385019391850191600101610922565b5050838501519250606061095d818c018561086e565b858c0151805115156101408d015260208101516001600160a01b03166101608d015293508501516001600160a01b038116838c01529250608085015194506109ab6101a08b0186601b0b9052565b948301516001600160d81b0381168a850152949d83019d98505050949094019350506001016108e9565b5091979650505050505050565b8060005b6002811015610a0757815115158452602093840193909101906001016109e6565b50505050565b60006020808352835160070b8184015260018060d81b03818501511660408401526040840151606060a08186015281518160c087015280516080610120880152805160806101a089015260018060a01b0381511661022089015267ffffffffffffffff8682015116610240890152604081015115156102608901528381015190506080610280890152610aa46102a0890182610821565b905085820151610ac06101c08a01826001600160e81b03169052565b50604082015188820361019f19016101e08a0152610ade82826108dc565b928501518015156102008b0152929150610af59050565b858301516001600160e01b0316610140890152604083015161011f19898303016101608a01529150610b278183610821565b91505082820151610180880152848401519450610b4760e08801866109e2565b87830151878203601f190160808901529450610b638186610821565b9450505050506080840151610b8360a08501826001600160a01b03169052565b509392505050565b634e487b7160e01b600052603260045260246000fdfea26469706673582212204cc4c48095475987f8d286f94f2cb3a9e717e8203cb40706495ce95644af1a2264736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_b559c87b {\n address s_0;\n uint64 s_1;\n bool s_2;\n string s_3;\n }\n\n struct S_82df57f3 {\n uint128 s_0;\n bool s_1;\n address[4] s_2;\n uint224 s_3;\n }\n\n struct S_e212a882 {\n bool s_0;\n address s_1;\n }\n\n struct S_7e908572 {\n address[] s_0;\n S_82df57f3 s_1;\n S_e212a882 s_2;\n address s_3;\n int224 s_4;\n }\n\n struct S_fd97bdde {\n S_7e908572 s_0;\n uint216 s_1;\n }\n\n struct S_f08c62d8 {\n S_b559c87b s_0;\n uint232 s_1;\n S_fd97bdde[2] s_2;\n bool s_3;\n }\n\n struct S_ec924ef6 {\n S_f08c62d8 s_0;\n uint224 s_1;\n string s_2;\n uint256 s_3;\n }\n\n struct S_8296e7d5 {\n S_ec924ef6 s_0;\n bool[2] s_1;\n }\n\n struct S_b14e553d {\n int64 s_0;\n uint216 s_1;\n S_8296e7d5 s_2;\n string s_3;\n address s_4;\n }\n\n function test () public pure returns (S_b14e553d memory) {\n S_b14e553d memory r;\n {\n int64 r_0 = 8330845538682408411;\n r.s_0 = r_0;\n }\n {\n uint216 r_1 = 39440413475746584866034360885808897725118995802210616863384418372;\n r.s_1 = r_1;\n }\n {\n S_8296e7d5 memory r_2;\n {\n S_ec924ef6 memory r_2_0;\n {\n S_f08c62d8 memory r_2_0_0;\n {\n S_b559c87b memory r_2_0_0_0;\n {\n address r_2_0_0_0_0 = 0x4aa099fB378470A1cb12b767E3a93bFC9bD4fa38;\n r_2_0_0_0.s_0 = r_2_0_0_0_0;\n }\n {\n uint64 r_2_0_0_0_1 = 7473038770836942203;\n r_2_0_0_0.s_1 = r_2_0_0_0_1;\n }\n {\n bool r_2_0_0_0_2 = true;\n r_2_0_0_0.s_2 = r_2_0_0_0_2;\n }\n {\n string memory r_2_0_0_0_3 = unicode\"Moo é🚀Mo🚀ooMM \";\n r_2_0_0_0.s_3 = r_2_0_0_0_3;\n }\n r_2_0_0.s_0 = r_2_0_0_0;\n }\n {\n uint232 r_2_0_0_1 = 2419147848231734414669938811585331416595206977948376671966594465920102;\n r_2_0_0.s_1 = r_2_0_0_1;\n }\n {\n S_fd97bdde[2] memory r_2_0_0_2;\n {\n S_fd97bdde memory r_2_0_0_2_0;\n {\n S_7e908572 memory r_2_0_0_2_0_0;\n {\n address[] memory r_2_0_0_2_0_0_0 = new address[](0);\n r_2_0_0_2_0_0.s_0 = r_2_0_0_2_0_0_0;\n }\n {\n S_82df57f3 memory r_2_0_0_2_0_0_1;\n {\n uint128 r_2_0_0_2_0_0_1_0 = 260772859105816539547441437415013987391;\n r_2_0_0_2_0_0_1.s_0 = r_2_0_0_2_0_0_1_0;\n }\n {\n bool r_2_0_0_2_0_0_1_1 = true;\n r_2_0_0_2_0_0_1.s_1 = r_2_0_0_2_0_0_1_1;\n }\n {\n address[4] memory r_2_0_0_2_0_0_1_2;\n {\n address r_2_0_0_2_0_0_1_2_0 = 0xCB106Aa514Ac75b3473607DE542aB6585e3565f6;\n r_2_0_0_2_0_0_1_2[0] = r_2_0_0_2_0_0_1_2_0;\n }\n {\n address r_2_0_0_2_0_0_1_2_1 = 0x9Af14cD9739832526Cca0a44C0A914fA65a8df4B;\n r_2_0_0_2_0_0_1_2[1] = r_2_0_0_2_0_0_1_2_1;\n }\n {\n address r_2_0_0_2_0_0_1_2_2 = 0xeecb517743cC66aAFa097B48254F3aA3073A6E93;\n r_2_0_0_2_0_0_1_2[2] = r_2_0_0_2_0_0_1_2_2;\n }\n {\n address r_2_0_0_2_0_0_1_2_3 = 0x6E14132ec5Ce4C3d5098920ffc85420F006c685f;\n r_2_0_0_2_0_0_1_2[3] = r_2_0_0_2_0_0_1_2_3;\n }\n r_2_0_0_2_0_0_1.s_2 = r_2_0_0_2_0_0_1_2;\n }\n {\n uint224 r_2_0_0_2_0_0_1_3 = 9508164638497437534697334918753352283602027495535560506733042052482;\n r_2_0_0_2_0_0_1.s_3 = r_2_0_0_2_0_0_1_3;\n }\n r_2_0_0_2_0_0.s_1 = r_2_0_0_2_0_0_1;\n }\n {\n S_e212a882 memory r_2_0_0_2_0_0_2;\n {\n bool r_2_0_0_2_0_0_2_0 = false;\n r_2_0_0_2_0_0_2.s_0 = r_2_0_0_2_0_0_2_0;\n }\n {\n address r_2_0_0_2_0_0_2_1 = 0xfd2Da0E8Be5ebc79ba103f3CC306E7367b2b9798;\n r_2_0_0_2_0_0_2.s_1 = r_2_0_0_2_0_0_2_1;\n }\n r_2_0_0_2_0_0.s_2 = r_2_0_0_2_0_0_2;\n }\n {\n address r_2_0_0_2_0_0_3 = 0x546d37C1eb13f7723159a4b7eC36287632F15e11;\n r_2_0_0_2_0_0.s_3 = r_2_0_0_2_0_0_3;\n }\n {\n int224 r_2_0_0_2_0_0_4 = 5586327429394393481981633760347688910143420084162611983519440884588;\n r_2_0_0_2_0_0.s_4 = r_2_0_0_2_0_0_4;\n }\n r_2_0_0_2_0.s_0 = r_2_0_0_2_0_0;\n }\n {\n uint216 r_2_0_0_2_0_1 = 80589567226374196294465531483948708847207452953622191230714217300;\n r_2_0_0_2_0.s_1 = r_2_0_0_2_0_1;\n }\n r_2_0_0_2[0] = r_2_0_0_2_0;\n }\n {\n S_fd97bdde memory r_2_0_0_2_1;\n {\n S_7e908572 memory r_2_0_0_2_1_0;\n {\n address[] memory r_2_0_0_2_1_0_0 = new address[](4);\n {\n address r_2_0_0_2_1_0_0_0 = 0x77C58Ee965388f813D35996aD9F4F51d61B85732;\n r_2_0_0_2_1_0_0[0] = r_2_0_0_2_1_0_0_0;\n }\n {\n address r_2_0_0_2_1_0_0_1 = 0xa95E72bB1A5491A4B48283Eaf3c5bbad04D390Fc;\n r_2_0_0_2_1_0_0[1] = r_2_0_0_2_1_0_0_1;\n }\n {\n address r_2_0_0_2_1_0_0_2 = 0x006f5b28E986A46ebbA59aB539CB0122fF882562;\n r_2_0_0_2_1_0_0[2] = r_2_0_0_2_1_0_0_2;\n }\n {\n address r_2_0_0_2_1_0_0_3 = 0x9541D90B6CE4fBCfBD8D89A6F1ea51753b44B8c8;\n r_2_0_0_2_1_0_0[3] = r_2_0_0_2_1_0_0_3;\n }\n r_2_0_0_2_1_0.s_0 = r_2_0_0_2_1_0_0;\n }\n {\n S_82df57f3 memory r_2_0_0_2_1_0_1;\n {\n uint128 r_2_0_0_2_1_0_1_0 = 171746513045073861320980928699843358239;\n r_2_0_0_2_1_0_1.s_0 = r_2_0_0_2_1_0_1_0;\n }\n {\n bool r_2_0_0_2_1_0_1_1 = true;\n r_2_0_0_2_1_0_1.s_1 = r_2_0_0_2_1_0_1_1;\n }\n {\n address[4] memory r_2_0_0_2_1_0_1_2;\n {\n address r_2_0_0_2_1_0_1_2_0 = 0xB68D05a74d7976B07978a83ebd5911e96b08A05C;\n r_2_0_0_2_1_0_1_2[0] = r_2_0_0_2_1_0_1_2_0;\n }\n {\n address r_2_0_0_2_1_0_1_2_1 = 0x6864B4497d16e69b819bA9749504595727D43Cae;\n r_2_0_0_2_1_0_1_2[1] = r_2_0_0_2_1_0_1_2_1;\n }\n {\n address r_2_0_0_2_1_0_1_2_2 = 0xfaa01BeeF5569E7ef25728dc8973E863Ab2e725D;\n r_2_0_0_2_1_0_1_2[2] = r_2_0_0_2_1_0_1_2_2;\n }\n {\n address r_2_0_0_2_1_0_1_2_3 = 0x531354eA767201Bd8E299fD3B85934e792687c90;\n r_2_0_0_2_1_0_1_2[3] = r_2_0_0_2_1_0_1_2_3;\n }\n r_2_0_0_2_1_0_1.s_2 = r_2_0_0_2_1_0_1_2;\n }\n {\n uint224 r_2_0_0_2_1_0_1_3 = 12582044321789371836526942939751260089885119678753181163416513210050;\n r_2_0_0_2_1_0_1.s_3 = r_2_0_0_2_1_0_1_3;\n }\n r_2_0_0_2_1_0.s_1 = r_2_0_0_2_1_0_1;\n }\n {\n S_e212a882 memory r_2_0_0_2_1_0_2;\n {\n bool r_2_0_0_2_1_0_2_0 = true;\n r_2_0_0_2_1_0_2.s_0 = r_2_0_0_2_1_0_2_0;\n }\n {\n address r_2_0_0_2_1_0_2_1 = 0x0f2e8832E9490f3B0f373Db5123E87Bb12AaDab4;\n r_2_0_0_2_1_0_2.s_1 = r_2_0_0_2_1_0_2_1;\n }\n r_2_0_0_2_1_0.s_2 = r_2_0_0_2_1_0_2;\n }\n {\n address r_2_0_0_2_1_0_3 = 0x9AB3b29e0aF88A166a5f52506F0D0e99cD763928;\n r_2_0_0_2_1_0.s_3 = r_2_0_0_2_1_0_3;\n }\n {\n int224 r_2_0_0_2_1_0_4 = -5934343975450553320293286355062552340517248675375210157205680159376;\n r_2_0_0_2_1_0.s_4 = r_2_0_0_2_1_0_4;\n }\n r_2_0_0_2_1.s_0 = r_2_0_0_2_1_0;\n }\n {\n uint216 r_2_0_0_2_1_1 = 7188981163680688580887813153193943425396877509459644168378733834;\n r_2_0_0_2_1.s_1 = r_2_0_0_2_1_1;\n }\n r_2_0_0_2[1] = r_2_0_0_2_1;\n }\n r_2_0_0.s_2 = r_2_0_0_2;\n }\n {\n bool r_2_0_0_3 = false;\n r_2_0_0.s_3 = r_2_0_0_3;\n }\n r_2_0.s_0 = r_2_0_0;\n }\n {\n uint224 r_2_0_1 = 3728896344359859098430523511132062334724973526989983580225568346094;\n r_2_0.s_1 = r_2_0_1;\n }\n {\n string memory r_2_0_2 = unicode\"Moo é🚀🚀 oMM Moo\";\n r_2_0.s_2 = r_2_0_2;\n }\n {\n uint256 r_2_0_3 = 74163517662011946694821071607873515128966767506857702118445238519541820419694;\n r_2_0.s_3 = r_2_0_3;\n }\n r_2.s_0 = r_2_0;\n }\n {\n bool[2] memory r_2_1;\n {\n bool r_2_1_0 = true;\n r_2_1[0] = r_2_1_0;\n }\n {\n bool r_2_1_1 = false;\n r_2_1[1] = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n r.s_2 = r_2;\n }\n {\n string memory r_3 = unicode\"Moo é🚀\";\n r.s_3 = r_3;\n }\n {\n address r_4 = 0x44B7Bc6127A968CD445FB47c454d93C7243590c6;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000739d1be0f3d00ddb00000000005fdfd45e34cc25b7e76fc5d7fedb385a0d8d3a42a9b37e0ae4384400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000044b7bc6127a968cd445fb47c454d93c7243590c6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000236871e45d779af25c09457a3bd13f870c54a70295e67ed6a82d8fee0000000000000000000000000000000000000000000000000000000000000640a3f7103eaf7ce0812b348bce90f864b7911baacc50bbfc956a8a199daec5ee6e000000000000000000000000000000000000000000000000000000000000008000000059bb2ea9e52534f0997aed26f0f1411e4ed60506bb953d3671d871f466000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aa099fb378470a1cb12b767e3a93bfc9bd4fa3800000000000000000000000000000000000000000000000067b5912b10752d7b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a804d6ff09f9a806f6f4d4d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000400000000000c3e702c45a1f8a5344d42f59d30c7eb2b73e1bc156f101b5d98354000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000c42f069b0f81b4b4c6d7c450f605b43f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cb106aa514ac75b3473607de542ab6585e3565f60000000000000000000000009af14cd9739832526cca0a44c0a914fa65a8df4b000000000000000000000000eecb517743cc66aafa097b48254f3aa3073a6e930000000000000000000000006e14132ec5ce4c3d5098920ffc85420f006c685f000000005a49116187d4a5d9c2948ad7759f5dee153e5de3b4d7a602018bad820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd2da0e8be5ebc79ba103f3cc306e7367b2b9798000000000000000000000000546d37c1eb13f7723159a4b7ec36287632f15e1100000000350b9c18120feaa32ca7fddb2fe999165cefa68ca77f5a82f272d36c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000001179b6c62c5b455a6bf0188da4896d83b7606fb8b9b82d033f550a00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000081352cdbfd16c145aab510397e462e1f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b68d05a74d7976b07978a83ebd5911e96b08a05c0000000000000000000000006864b4497d16e69b819ba9749504595727d43cae000000000000000000000000faa01beef5569e7ef25728dc8973e863ab2e725d000000000000000000000000531354ea767201bd8e299fd3b85934e792687c900000000077794167748c3ecdc2c76a2e2d505397cfce8eb51dc4a0b1f774e6c200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000f2e8832e9490f3b0f373db5123e87bb12aadab40000000000000000000000009ab3b29e0af88a166a5f52506f0d0e99cd763928ffffffffc7a668ad7bb3ce0eed66048a48c01c0e9ddc5143f1b571fcd5160570000000000000000000000000000000000000000000000000000000000000000400000000000000000000000077c58ee965388f813d35996ad9f4f51d61b85732000000000000000000000000a95e72bb1a5491a4b48283eaf3c5bbad04d390fc000000000000000000000000006f5b28e986a46ebba59ab539cb0122ff8825620000000000000000000000009541d90b6ce4fbcfbd8d89a6f1ea51753b44b8c800000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a80f09f9a8020206f4d4d204d6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(((bytes22,int256)),(bool,(string,int200,bool,bool),(int80,(address[3],string,(address,(((address,uint,string,int104),bytes23,string[1],int240),int160,address,int248),int248,bytes9)[],address,address[1]))))", + "type": "(((bytes22,int256)),(bool,(string,int200,bool,bool),(int80,(address[3],string,(address,(((address,uint,string,int104),bytes23,string[1],int240),int160,address,int248),int248,bytes9)[],address,address[1]))))", + "value": [ + [ + [ + "0x6410d001c97425a1965f78c30d3360646e3989335dd3", + "16644862840422335500993092708628519663803585550606305186497754215477587088835" + ] + ], + [ + true, + [ + "Moo é🚀", + "771061106154875255899966804204850628057254772833888480666072", + false, + true + ], + [ + "348114986213313677165994", + [ + [ + "0x8099046968262A6942735C9890B0FC75BAD6847D", + "0xfab95F73e93B14BF0c8601cAdAb9F82F8daD56Cd", + "0x9be6b1231106E1C933efD7C1F076713247Bfc7b8" + ], + "Moo é🚀🚀🚀🚀o Méo🚀é🚀o éM🚀M M o éo éo 🚀o🚀🚀", + [ + [ + "0x1bF9a57eA5bf4Ac928eb6551578cF2758333353F", + [ + [ + [ + "0xE532381dbbb4c5bB66D402d6F746642a94877942", + "58106711634641195612230948933095665471199163590707804912306507376007879216445", + "Moo é🚀M MMoo🚀oMoMéM o🚀oM éo MMo é🚀🚀🚀 M", + "-5614648396676007376867724030622" + ], + "0x847a85aa550c3646e9bc736b484fb345371807dab87af7", + ["Moo é🚀MM 🚀MééMéo🚀é éMé M Mé"], + "-563620570753608512185849581399826292959076287512156992983338256993917757" + ], + "521995043317913541414910818064881182845795738001", + "0x2B62F90e860319c913d99faff563dcbDc4cc9A57", + "119077032029940971114927970702756805301587833301977208566163507460447877553" + ], + "-206250013158227176431253553237137660863297631858250016252226557568071159547", + "0x927f15e06dad973c1c" + ], + [ + "0x2Bf3346988e3A3437D6EE45f8F96d3cec6817ac6", + [ + [ + [ + "0x86A76936e98754F3253B21B9D8E8E52c9f88aC27", + "83488096579900091463435734669090638314302473940696639539393281888537049568957", + "Moo é🚀é é é🚀 🚀éo🚀🚀 🚀éMo o ooo oMoM oo o", + "1472327178828759134993485834695" + ], + "0x60bc3320e4fba9158e4f8d9cdc7414bf1da079fdafdd7f", + ["Moo é🚀🚀o🚀 🚀MMMoooo🚀Mo é"], + "-100264009029520626746929734424966459305570412932003090186969337374347985" + ], + "-265804773336270786045481143919029055925294678857", + "0xe9E5E05bA15f4045D73d7EB85253C1d9abeCf833", + "134878823185249193540015596925965726624038542102523822299128547221290740897" + ], + "-51151670110786870858765808156064554049421747658904715493788141703290798324", + "0xd5ab32c5124e25c634" + ] + ], + "0x2a6068DAd1f6BBBe77CF6F0a42ac3D65B259D9Fb", + ["0xC223bbc9f5a5a89E326b3f7e5ac0B01aAFcB5Ee2"] + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6410d001c97425a1965f78c30d3360646e3989335dd3" + }, + { + "type": "number", + "value": "16644862840422335500993092708628519663803585550606305186497754215477587088835" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "771061106154875255899966804204850628057254772833888480666072" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "348114986213313677165994" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x8099046968262A6942735C9890B0FC75BAD6847D" + }, + { + "type": "address", + "value": "0xfab95F73e93B14BF0c8601cAdAb9F82F8daD56Cd" + }, + { + "type": "address", + "value": "0x9be6b1231106E1C933efD7C1F076713247Bfc7b8" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀🚀o Méo🚀é🚀o éM🚀M M o éo éo 🚀o🚀🚀" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1bF9a57eA5bf4Ac928eb6551578cF2758333353F" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE532381dbbb4c5bB66D402d6F746642a94877942" + }, + { + "type": "number", + "value": "58106711634641195612230948933095665471199163590707804912306507376007879216445" + }, + { + "type": "string", + "value": "Moo é🚀M MMoo🚀oMoMéM o🚀oM éo MMo é🚀🚀🚀 M" + }, + { + "type": "number", + "value": "-5614648396676007376867724030622" + } + ] + }, + { + "type": "hexstring", + "value": "0x847a85aa550c3646e9bc736b484fb345371807dab87af7" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM 🚀MééMéo🚀é éMé M Mé" + } + ] + }, + { + "type": "number", + "value": "-563620570753608512185849581399826292959076287512156992983338256993917757" + } + ] + }, + { + "type": "number", + "value": "521995043317913541414910818064881182845795738001" + }, + { + "type": "address", + "value": "0x2B62F90e860319c913d99faff563dcbDc4cc9A57" + }, + { + "type": "number", + "value": "119077032029940971114927970702756805301587833301977208566163507460447877553" + } + ] + }, + { + "type": "number", + "value": "-206250013158227176431253553237137660863297631858250016252226557568071159547" + }, + { + "type": "hexstring", + "value": "0x927f15e06dad973c1c" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2Bf3346988e3A3437D6EE45f8F96d3cec6817ac6" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x86A76936e98754F3253B21B9D8E8E52c9f88aC27" + }, + { + "type": "number", + "value": "83488096579900091463435734669090638314302473940696639539393281888537049568957" + }, + { + "type": "string", + "value": "Moo é🚀é é é🚀 🚀éo🚀🚀 🚀éMo o ooo oMoM oo o" + }, + { + "type": "number", + "value": "1472327178828759134993485834695" + } + ] + }, + { + "type": "hexstring", + "value": "0x60bc3320e4fba9158e4f8d9cdc7414bf1da079fdafdd7f" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀o🚀 🚀MMMoooo🚀Mo é" + } + ] + }, + { + "type": "number", + "value": "-100264009029520626746929734424966459305570412932003090186969337374347985" + } + ] + }, + { + "type": "number", + "value": "-265804773336270786045481143919029055925294678857" + }, + { + "type": "address", + "value": "0xe9E5E05bA15f4045D73d7EB85253C1d9abeCf833" + }, + { + "type": "number", + "value": "134878823185249193540015596925965726624038542102523822299128547221290740897" + } + ] + }, + { + "type": "number", + "value": "-51151670110786870858765808156064554049421747658904715493788141703290798324" + }, + { + "type": "hexstring", + "value": "0xd5ab32c5124e25c634" + } + ] + } + ] + }, + { + "type": "address", + "value": "0x2a6068DAd1f6BBBe77CF6F0a42ac3D65B259D9Fb" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xC223bbc9f5a5a89E326b3f7e5ac0B01aAFcB5Ee2" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610d51806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610b3a565b60405180910390f35b610056610643565b61005e610643565b604080516060810182526000602082018181529282015290815260408051808201909152756410d001c97425a1965f78c30d3360646e3989335dd360501b81527f24cca894401c334170d56a7fe1adf6c24a0045c48f90b5b318fd0ea0541215c36020820152815281526100d0610680565b6001808252604080516080810182526060808252600060208084018281528486018381529385018381528651808801909752600a8752689adede418753e13f3560b71b87840152958552787ad64d91dafbae787e4ff6191ca2d5b80133a498be9c1e21d89052915292909152908201526101486106bb565b6949b759e950c3c68505aa815261015d6106d4565b610165610712565b738099046968262a6942735c9890b0fc75bad6847d815273fab95f73e93b14bf0c8601cadab9f82f8dad56cd602080830191909152739be6b1231106e1c933efd7c1f076713247bfc7b8604080840191909152918352815160808101909252604d80835260009291610c639083013960208301525060408051600280825260608201909252600091816020015b6101fa610730565b8152602001906001900390816101f2579050509050610217610730565b731bf9a57ea5bf4ac928eb6551578cf2758333353f8152610236610767565b61023e610795565b6102466107c9565b73e532381dbbb4c5bb66d402d6f746642a9487794281527f80773bb9ea10878e6364e1a823b14e3f470e7fc62a960f07fda17e2188ba4d3d60208083019190915260408051606081018252818152600092909190610cdc908301396040830152506c46dde84cceeb4866da77cef29d19606082015281527f847a85aa550c3646e9bc736b484fb345371807dab87af700000000000000000060208201526102eb6107fd565b60006040518060600160405280602c8152602001610cb0602c91398252506040828101919091527fffffae5626b000590718a75452e79fcf41a1e336b93e9213f4a94f894cd364c3606080840191909152918352735b6f11397190331ee96b434189d41e811c12a191602084810191909152732b62f90e860319c913d99faff563dcbdc4cc9a57848301527e43652c989ab4517e13b6994eeaa814d8771ce2337286db930be31cb43739b1848401528401929092527fff8b4441d37e0113d31f40dbe0e970d5f1412e31d249cff57c7711c25f8131059183019190915268249fc5781b6b65cf0760ba1b908201528151819083906000906103ee576103ee610be4565b602002602001018190525050610402610730565b732bf3346988e3a3437d6ee45f8f96d3cec6817ac68152610421610767565b610429610795565b6104316107c9565b7386a76936e98754f3253b21b9d8e8e52c9f88ac2781527fb894968d6efa703b899620aabc9b3a2f720c0925c636b5f939acffc1d77c16bd6020808301919091526040805160608101909152603f808252600092610c24908301396040830152506c1295587f66c79bdfa600faa9c7606082015281527f60bc3320e4fba9158e4f8d9cdc7414bf1da079fdafdd7f00000000000000000060208201526104d56107fd565b6000604051806060016040528060298152602001610bfb602991398252506040828101919091527ffffff179004f4ef7f40b9c9b5bb5710c2dcaba11de42eddceb4edd965ce16d2f606080840191909152918352732e8f1927b22a952726edcb83e34be31fd62b43481960208481019190915273e9e5e05ba15f4045d73d7eb85253c1d9abecf833848301527e4c56b59b061dbb333e90e174af2cae7ab9ab314f45423f58bca35d7871eca1848401528401929092527fffe30c971b277e04b3740bcaab0b5bd571f041fd8d1ff720b7646cf6323a3f0c9183019190915268356accb1449389718d60ba1b9082015281518190839060019081106105db576105db610be4565b6020908102919091010152506040820152732a6068dad1f6bbbe77cf6f0a42ac3d65b259d9fb606082015261060e610824565b73c223bbc9f5a5a89e326b3f7e5ac0b01aafcb5ee2815260808201526020828101919091526040830191909152820152919050565b604051806040016040528061066e604080516060810182526000602082018181529282015290815290565b815260200161067b610680565b905290565b6040805160608082018352600080835283516080810185528281526020818101839052948101829052918201529091820190815260200161067b5b6040518060400160405280600060090b815260200161067b5b6040518060a001604052806106e7610712565b8152602001606081526020016060815260200160006001600160a01b0316815260200161067b610824565b60405180606001604052806003906020820280368337509192915050565b604051806080016040528060006001600160a01b03168152602001610753610767565b815260006020820181905260409091015290565b604051806080016040528061077a610795565b81526000602082018190526040820181905260609091015290565b60405180608001604052806107a86107c9565b8152600060208201526040016107bc6107fd565b8152600060209091015290565b604051806080016040528060006001600160a01b0316815260200160008152602001606081526020016000600c0b81525090565b60405180602001604052806001905b606081526020019060019003908161080c5790505090565b60405180602001604052806001906020820280368337509192915050565b6000815180845260005b818110156108685760208185018101518683018201520161084c565b8181111561087a576000602083870101525b50601f01601f19169290920160200192915050565b60008260208082018460005b60018110156108c65784830388526108b4838351610842565b9784019792509083019060010161089b565b50909695505050505050565b600081518084526020808501808196508360051b8101915082860160005b85811015610a3a5782840389528151608060018060a01b03808351168752878301518289890152805183848a01528051846101008b0152838151166101808b01528a8101516101a08b01526040935083810151856101c08c01526109586102008c0182610842565b955050606080820151600c0b6101e08c01528b83015191506109896101208c018368ffffffffffffffffff19169052565b828501518b870360ff19016101408d015291506109a6868361088f565b928101519295506109bd6101608c0184601d0b9052565b8b84015192506109d260a08c018460130b9052565b838501516001600160a01b03811660c08d0152925092830151926109fb60e08c0185601e0b9052565b848701519350610a0f858c0185601e0b9052565b958601516001600160b81b0319169990950198909852505099860199945050908401906001016108f0565b5091979650505050505050565b8060005b6001811015610a735781516001600160a01b0316845260209384019390910190600101610a4b565b50505050565b805160090b82526020808201516040828501819052815160009390929091849087015b6003821015610ac45784516001600160a01b0316815293830193600191909101908301610a9c565b505081810151925060e060a0870152610ae1610120870184610842565b925060408101519150603f198684030160c0870152610b0083836108d2565b925060608101519150610b1e60e08701836001600160a01b03169052565b608001519050610b32610100860182610a47565b509392505050565b6000602080835283515169ffffffffffffffffffff1981511682850152818101516040850152508084015160608085015280511515608085015281810151606060a08601528051608060e0870152610b96610160870182610842565b9382015160180b61010087015250604080820151151561012087015260608201511515610140870152820151858403607f190160c087015292610bd98185610a79565b979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a806ff09f9a8020f09f9a804d4d4d6f6f6f6ff09f9a804d6f2020c3a94d6f6f20c3a9f09f9a80c3a920c3a920c3a9f09f9a8020f09f9a80c3a96ff09f9a80f09f9a8020f09f9a80c3a94d6f206f206f6f6f206f4d6f4d206f6f206f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f20204dc3a96ff09f9a80c3a9f09f9a806f2020c3a94df09f9a804d204d20206f20c3a96f20c3a96f20f09f9a806ff09f9a80f09f9a804d6f6f20c3a9f09f9a804d4d20f09f9a804dc3a9c3a94dc3a96ff09f9a80c3a920c3a94dc3a9204d204dc3a94d6f6f20c3a9f09f9a804d20204d4d6f6ff09f9a806f4d6f4dc3a94d20206ff09f9a806f4d20c3a96f204d4d6f202020c3a9f09f9a80f09f9a80f09f9a80204da26469706673582212200d25444a849a1abf2509fa5494646b729020b9a85d9ac6ac357f05ccbdbcfed164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_5dcec426 {\n bytes22 s_0;\n int256 s_1;\n }\n\n struct S_d18995c1 {\n S_5dcec426 s_0;\n }\n\n struct S_36848ab0 {\n string s_0;\n int200 s_1;\n bool s_2;\n bool s_3;\n }\n\n struct S_e982deac {\n address s_0;\n uint256 s_1;\n string s_2;\n int104 s_3;\n }\n\n struct S_d49c2149 {\n S_e982deac s_0;\n bytes23 s_1;\n string[1] s_2;\n int240 s_3;\n }\n\n struct S_b784ecdf {\n S_d49c2149 s_0;\n int160 s_1;\n address s_2;\n int248 s_3;\n }\n\n struct S_b01a005b {\n address s_0;\n S_b784ecdf s_1;\n int248 s_2;\n bytes9 s_3;\n }\n\n struct S_8e484065 {\n address[3] s_0;\n string s_1;\n S_b01a005b[] s_2;\n address s_3;\n address[1] s_4;\n }\n\n struct S_4d7a43f2 {\n int80 s_0;\n S_8e484065 s_1;\n }\n\n struct S_f501bf89 {\n bool s_0;\n S_36848ab0 s_1;\n S_4d7a43f2 s_2;\n }\n\n struct S_cee4a8a5 {\n S_d18995c1 s_0;\n S_f501bf89 s_1;\n }\n\n function test () public pure returns (S_cee4a8a5 memory) {\n S_cee4a8a5 memory r;\n {\n S_d18995c1 memory r_0;\n {\n S_5dcec426 memory r_0_0;\n {\n bytes22 r_0_0_0 = bytes22(0x6410d001c97425a1965f78c30d3360646e3989335dd3);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n int256 r_0_0_1 = 16644862840422335500993092708628519663803585550606305186497754215477587088835;\n r_0_0.s_1 = r_0_0_1;\n }\n r_0.s_0 = r_0_0;\n }\n r.s_0 = r_0;\n }\n {\n S_f501bf89 memory r_1;\n {\n bool r_1_0 = true;\n r_1.s_0 = r_1_0;\n }\n {\n S_36848ab0 memory r_1_1;\n {\n string memory r_1_1_0 = unicode\"Moo é🚀\";\n r_1_1.s_0 = r_1_1_0;\n }\n {\n int200 r_1_1_1 = 771061106154875255899966804204850628057254772833888480666072;\n r_1_1.s_1 = r_1_1_1;\n }\n {\n bool r_1_1_2 = false;\n r_1_1.s_2 = r_1_1_2;\n }\n {\n bool r_1_1_3 = true;\n r_1_1.s_3 = r_1_1_3;\n }\n r_1.s_1 = r_1_1;\n }\n {\n S_4d7a43f2 memory r_1_2;\n {\n int80 r_1_2_0 = 348114986213313677165994;\n r_1_2.s_0 = r_1_2_0;\n }\n {\n S_8e484065 memory r_1_2_1;\n {\n address[3] memory r_1_2_1_0;\n {\n address r_1_2_1_0_0 = 0x8099046968262A6942735C9890B0FC75BAD6847D;\n r_1_2_1_0[0] = r_1_2_1_0_0;\n }\n {\n address r_1_2_1_0_1 = 0xfab95F73e93B14BF0c8601cAdAb9F82F8daD56Cd;\n r_1_2_1_0[1] = r_1_2_1_0_1;\n }\n {\n address r_1_2_1_0_2 = 0x9be6b1231106E1C933efD7C1F076713247Bfc7b8;\n r_1_2_1_0[2] = r_1_2_1_0_2;\n }\n r_1_2_1.s_0 = r_1_2_1_0;\n }\n {\n string memory r_1_2_1_1 = unicode\"Moo é🚀🚀🚀🚀o Méo🚀é🚀o éM🚀M M o éo éo 🚀o🚀🚀\";\n r_1_2_1.s_1 = r_1_2_1_1;\n }\n {\n S_b01a005b[] memory r_1_2_1_2 = new S_b01a005b[](2);\n {\n S_b01a005b memory r_1_2_1_2_0;\n {\n address r_1_2_1_2_0_0 = 0x1bF9a57eA5bf4Ac928eb6551578cF2758333353F;\n r_1_2_1_2_0.s_0 = r_1_2_1_2_0_0;\n }\n {\n S_b784ecdf memory r_1_2_1_2_0_1;\n {\n S_d49c2149 memory r_1_2_1_2_0_1_0;\n {\n S_e982deac memory r_1_2_1_2_0_1_0_0;\n {\n address r_1_2_1_2_0_1_0_0_0 = 0xE532381dbbb4c5bB66D402d6F746642a94877942;\n r_1_2_1_2_0_1_0_0.s_0 = r_1_2_1_2_0_1_0_0_0;\n }\n {\n uint r_1_2_1_2_0_1_0_0_1 = 58106711634641195612230948933095665471199163590707804912306507376007879216445;\n r_1_2_1_2_0_1_0_0.s_1 = r_1_2_1_2_0_1_0_0_1;\n }\n {\n string memory r_1_2_1_2_0_1_0_0_2 = unicode\"Moo é🚀M MMoo🚀oMoMéM o🚀oM éo MMo é🚀🚀🚀 M\";\n r_1_2_1_2_0_1_0_0.s_2 = r_1_2_1_2_0_1_0_0_2;\n }\n {\n int104 r_1_2_1_2_0_1_0_0_3 = -5614648396676007376867724030622;\n r_1_2_1_2_0_1_0_0.s_3 = r_1_2_1_2_0_1_0_0_3;\n }\n r_1_2_1_2_0_1_0.s_0 = r_1_2_1_2_0_1_0_0;\n }\n {\n bytes23 r_1_2_1_2_0_1_0_1 = bytes23(0x847a85aa550c3646e9bc736b484fb345371807dab87af7);\n r_1_2_1_2_0_1_0.s_1 = r_1_2_1_2_0_1_0_1;\n }\n {\n string[1] memory r_1_2_1_2_0_1_0_2;\n {\n string memory r_1_2_1_2_0_1_0_2_0 = unicode\"Moo é🚀MM 🚀MééMéo🚀é éMé M Mé\";\n r_1_2_1_2_0_1_0_2[0] = r_1_2_1_2_0_1_0_2_0;\n }\n r_1_2_1_2_0_1_0.s_2 = r_1_2_1_2_0_1_0_2;\n }\n {\n int240 r_1_2_1_2_0_1_0_3 = -563620570753608512185849581399826292959076287512156992983338256993917757;\n r_1_2_1_2_0_1_0.s_3 = r_1_2_1_2_0_1_0_3;\n }\n r_1_2_1_2_0_1.s_0 = r_1_2_1_2_0_1_0;\n }\n {\n int160 r_1_2_1_2_0_1_1 = 521995043317913541414910818064881182845795738001;\n r_1_2_1_2_0_1.s_1 = r_1_2_1_2_0_1_1;\n }\n {\n address r_1_2_1_2_0_1_2 = 0x2B62F90e860319c913d99faff563dcbDc4cc9A57;\n r_1_2_1_2_0_1.s_2 = r_1_2_1_2_0_1_2;\n }\n {\n int248 r_1_2_1_2_0_1_3 = 119077032029940971114927970702756805301587833301977208566163507460447877553;\n r_1_2_1_2_0_1.s_3 = r_1_2_1_2_0_1_3;\n }\n r_1_2_1_2_0.s_1 = r_1_2_1_2_0_1;\n }\n {\n int248 r_1_2_1_2_0_2 = -206250013158227176431253553237137660863297631858250016252226557568071159547;\n r_1_2_1_2_0.s_2 = r_1_2_1_2_0_2;\n }\n {\n bytes9 r_1_2_1_2_0_3 = bytes9(0x927f15e06dad973c1c);\n r_1_2_1_2_0.s_3 = r_1_2_1_2_0_3;\n }\n r_1_2_1_2[0] = r_1_2_1_2_0;\n }\n {\n S_b01a005b memory r_1_2_1_2_1;\n {\n address r_1_2_1_2_1_0 = 0x2Bf3346988e3A3437D6EE45f8F96d3cec6817ac6;\n r_1_2_1_2_1.s_0 = r_1_2_1_2_1_0;\n }\n {\n S_b784ecdf memory r_1_2_1_2_1_1;\n {\n S_d49c2149 memory r_1_2_1_2_1_1_0;\n {\n S_e982deac memory r_1_2_1_2_1_1_0_0;\n {\n address r_1_2_1_2_1_1_0_0_0 = 0x86A76936e98754F3253B21B9D8E8E52c9f88aC27;\n r_1_2_1_2_1_1_0_0.s_0 = r_1_2_1_2_1_1_0_0_0;\n }\n {\n uint r_1_2_1_2_1_1_0_0_1 = 83488096579900091463435734669090638314302473940696639539393281888537049568957;\n r_1_2_1_2_1_1_0_0.s_1 = r_1_2_1_2_1_1_0_0_1;\n }\n {\n string memory r_1_2_1_2_1_1_0_0_2 = unicode\"Moo é🚀é é é🚀 🚀éo🚀🚀 🚀éMo o ooo oMoM oo o\";\n r_1_2_1_2_1_1_0_0.s_2 = r_1_2_1_2_1_1_0_0_2;\n }\n {\n int104 r_1_2_1_2_1_1_0_0_3 = 1472327178828759134993485834695;\n r_1_2_1_2_1_1_0_0.s_3 = r_1_2_1_2_1_1_0_0_3;\n }\n r_1_2_1_2_1_1_0.s_0 = r_1_2_1_2_1_1_0_0;\n }\n {\n bytes23 r_1_2_1_2_1_1_0_1 = bytes23(0x60bc3320e4fba9158e4f8d9cdc7414bf1da079fdafdd7f);\n r_1_2_1_2_1_1_0.s_1 = r_1_2_1_2_1_1_0_1;\n }\n {\n string[1] memory r_1_2_1_2_1_1_0_2;\n {\n string memory r_1_2_1_2_1_1_0_2_0 = unicode\"Moo é🚀🚀o🚀 🚀MMMoooo🚀Mo é\";\n r_1_2_1_2_1_1_0_2[0] = r_1_2_1_2_1_1_0_2_0;\n }\n r_1_2_1_2_1_1_0.s_2 = r_1_2_1_2_1_1_0_2;\n }\n {\n int240 r_1_2_1_2_1_1_0_3 = -100264009029520626746929734424966459305570412932003090186969337374347985;\n r_1_2_1_2_1_1_0.s_3 = r_1_2_1_2_1_1_0_3;\n }\n r_1_2_1_2_1_1.s_0 = r_1_2_1_2_1_1_0;\n }\n {\n int160 r_1_2_1_2_1_1_1 = -265804773336270786045481143919029055925294678857;\n r_1_2_1_2_1_1.s_1 = r_1_2_1_2_1_1_1;\n }\n {\n address r_1_2_1_2_1_1_2 = 0xe9E5E05bA15f4045D73d7EB85253C1d9abeCf833;\n r_1_2_1_2_1_1.s_2 = r_1_2_1_2_1_1_2;\n }\n {\n int248 r_1_2_1_2_1_1_3 = 134878823185249193540015596925965726624038542102523822299128547221290740897;\n r_1_2_1_2_1_1.s_3 = r_1_2_1_2_1_1_3;\n }\n r_1_2_1_2_1.s_1 = r_1_2_1_2_1_1;\n }\n {\n int248 r_1_2_1_2_1_2 = -51151670110786870858765808156064554049421747658904715493788141703290798324;\n r_1_2_1_2_1.s_2 = r_1_2_1_2_1_2;\n }\n {\n bytes9 r_1_2_1_2_1_3 = bytes9(0xd5ab32c5124e25c634);\n r_1_2_1_2_1.s_3 = r_1_2_1_2_1_3;\n }\n r_1_2_1_2[1] = r_1_2_1_2_1;\n }\n r_1_2_1.s_2 = r_1_2_1_2;\n }\n {\n address r_1_2_1_3 = 0x2a6068DAd1f6BBBe77CF6F0a42ac3D65B259D9Fb;\n r_1_2_1.s_3 = r_1_2_1_3;\n }\n {\n address[1] memory r_1_2_1_4;\n {\n address r_1_2_1_4_0 = 0xC223bbc9f5a5a89E326b3f7e5ac0B01aAFcB5Ee2;\n r_1_2_1_4[0] = r_1_2_1_4_0;\n }\n r_1_2_1.s_4 = r_1_2_1_4;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n r_1.s_2 = r_1_2;\n }\n r.s_1 = r_1;\n }\n return r;\n }\n}", + "encoded": "0x00000000000000000000000000000000000000000000000000000000000000206410d001c97425a1965f78c30d3360646e3989335dd30000000000000000000024cca894401c334170d56a7fe1adf6c24a0045c48f90b5b318fd0ea0541215c300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000080000000000000007ad64d91dafbae787e4ff6191ca2d5b80133a498be9c1e21d800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049b759e950c3c68505aa00000000000000000000000000000000000000000000000000000000000000400000000000000000000000008099046968262a6942735c9890b0fc75bad6847d000000000000000000000000fab95f73e93b14bf0c8601cadab9f82f8dad56cd0000000000000000000000009be6b1231106e1c933efd7c1f076713247bfc7b800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001600000000000000000000000002a6068dad1f6bbbe77cf6f0a42ac3d65b259d9fb000000000000000000000000c223bbc9f5a5a89e326b3f7e5ac0b01aafcb5ee2000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80f09f9a80f09f9a80f09f9a806f20204dc3a96ff09f9a80c3a9f09f9a806f2020c3a94df09f9a804d204d20206f20c3a96f20c3a96f20f09f9a806ff09f9a80f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003200000000000000000000000001bf9a57ea5bf4ac928eb6551578cf2758333353f0000000000000000000000000000000000000000000000000000000000000080ff8b4441d37e0113d31f40dbe0e970d5f1412e31d249cff57c7711c25f813105927f15e06dad973c1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000005b6f11397190331ee96b434189d41e811c12a1910000000000000000000000002b62f90e860319c913d99faff563dcbdc4cc9a570043652c989ab4517e13b6994eeaa814d8771ce2337286db930be31cb43739b10000000000000000000000000000000000000000000000000000000000000080847a85aa550c3646e9bc736b484fb345371807dab87af70000000000000000000000000000000000000000000000000000000000000000000000000000000160ffffae5626b000590718a75452e79fcf41a1e336b93e9213f4a94f894cd364c3000000000000000000000000e532381dbbb4c5bb66d402d6f746642a9487794280773bb9ea10878e6364e1a823b14e3f470e7fc62a960f07fda17e2188ba4d3d0000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffffffffffffb92217b33114b7992588310d6200000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a804d20204d4d6f6ff09f9a806f4d6f4dc3a94d20206ff09f9a806f4d20c3a96f204d4d6f202020c3a9f09f9a80f09f9a80f09f9a80204d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a804d4d20f09f9a804dc3a9c3a94dc3a96ff09f9a80c3a920c3a94dc3a9204d204dc3a900000000000000000000000000000000000000000000000000000000000000002bf3346988e3a3437d6ee45f8f96d3cec6817ac60000000000000000000000000000000000000000000000000000000000000080ffe30c971b277e04b3740bcaab0b5bd571f041fd8d1ff720b7646cf6323a3f0cd5ab32c5124e25c63400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffffd170e6d84dd56ad8d912347c1cb41ce029d4bcb7000000000000000000000000e9e5e05ba15f4045d73d7eb85253c1d9abecf833004c56b59b061dbb333e90e174af2cae7ab9ab314f45423f58bca35d7871eca1000000000000000000000000000000000000000000000000000000000000008060bc3320e4fba9158e4f8d9cdc7414bf1da079fdafdd7f0000000000000000000000000000000000000000000000000000000000000000000000000000000160fffff179004f4ef7f40b9c9b5bb5710c2dcaba11de42eddceb4edd965ce16d2f00000000000000000000000086a76936e98754f3253b21b9d8e8e52c9f88ac27b894968d6efa703b899620aabc9b3a2f720c0925c636b5f939acffc1d77c16bd0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000001295587f66c79bdfa600faa9c7000000000000000000000000000000000000000000000000000000000000003f4d6f6f20c3a9f09f9a80c3a920c3a920c3a9f09f9a8020f09f9a80c3a96ff09f9a80f09f9a8020f09f9a80c3a94d6f206f206f6f6f206f4d6f4d206f6f206f00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000294d6f6f20c3a9f09f9a80f09f9a806ff09f9a8020f09f9a804d4d4d6f6f6f6ff09f9a804d6f2020c3a90000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,((bytes3,(bytes15,bytes18,(bytes11,string,bytes12,bool)[1][4]),uint104,(address,string,bytes29[3],string),(bytes25,bool[],string[],bool,(address,bool,uint152)[2]))),address[3][1])", + "type": "(string,((bytes3,(bytes15,bytes18,(bytes11,string,bytes12,bool)[1][4]),uint104,(address,string,bytes29[3],string),(bytes25,bool[],string[],bool,(address,bool,uint152)[2]))),address[3][1])", + "value": [ + "Moo é🚀M 🚀o", + [ + [ + "0xdc5976", + [ + "0xa753a1a23169d014eedbe537b10076", + "0x224cb660ac1be9955209139e54691dd9c648", + [ + [ + [ + "0x78f454179c2ffd2a54b66f", + "Moo é🚀", + "0x343c687de62671dfd10ef3e7", + false + ] + ], + [ + [ + "0xe8b1cd29d67777c1a43348", + "Moo é🚀MoMé oo🚀 o Méé🚀 o 🚀🚀Mé🚀é oé Mo", + "0x705d93adb327ffe1174aca94", + false + ] + ], + [ + [ + "0xa347609da05247782b419b", + "Moo é🚀oé 🚀o🚀🚀 ooéoéMM🚀ooé", + "0x7c7ac2ea5c59c21810d551b6", + false + ] + ], + [ + [ + "0x72d0f1198a1eb046f378fa", + "Moo é🚀M🚀 🚀oéo oo oéMMéo éo🚀oéo 🚀éooo🚀oMo oMoo🚀🚀é🚀🚀Moé éo o", + "0xf4dc919c266264224bf842c3", + true + ] + ] + ] + ], + "7598157658436859234271441995675", + [ + "0x79E8e81b8A5a9e3e076edE5Bb16638e41F03E198", + "Moo é🚀é🚀oooMo🚀o é oMM oooééo", + [ + "0x15b0fb673f4147a2850f9c1d4203f6286cb2ae27abc0bc55ee6e23ee81", + "0xfe7bff3c8fb4ee9a280dcda7451efbaba0a00ea0c421bb6a5810a920ce", + "0x21b3e529217defe687458ea95697bda10871ba7ada0f484f9802623764" + ], + "Moo é🚀o🚀oéoM🚀🚀oo🚀o" + ], + [ + "0x6234d83f31aab9006a16152c0e4ca604087559292f7d9e6361", + [true], + [ + "Moo é🚀oéMéééM ééoMoo🚀MMMoé 🚀é éé🚀M🚀 ooé🚀o MéooéM Mo", + "Moo é🚀o ooé🚀oMMMM🚀é oo 🚀éM ooéooooMooé🚀 ooéMo o", + "Moo é🚀oMMM 🚀MMé🚀MéooM🚀🚀MMéo🚀oéoMoo🚀🚀M🚀éoéMoMo éoM MoMM🚀" + ], + true, + [ + [ + "0x5F8B47770D099234Bbe04f5C00e2d3c9C9771Cd7", + true, + "3290481995610493170978580998006430724915579280" + ], + [ + "0x3973981Cdee11459DeADD244e665F23C0AA35335", + false, + "5343260894431772871393872023759014814660615935" + ] + ] + ] + ] + ], + [ + [ + "0x2e8cC9c5FCCa7280684154668cC6c78774D0c353", + "0x42C3Ab0C1Af8ecd85172e6BC2275ACA4c2C59673", + "0x41E9616EB62bF6b02278E1448c36c7e6d608c36c" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M 🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xdc5976" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa753a1a23169d014eedbe537b10076" + }, + { + "type": "hexstring", + "value": "0x224cb660ac1be9955209139e54691dd9c648" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x78f454179c2ffd2a54b66f" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x343c687de62671dfd10ef3e7" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe8b1cd29d67777c1a43348" + }, + { + "type": "string", + "value": "Moo é🚀MoMé oo🚀 o Méé🚀 o 🚀🚀Mé🚀é oé Mo" + }, + { + "type": "hexstring", + "value": "0x705d93adb327ffe1174aca94" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa347609da05247782b419b" + }, + { + "type": "string", + "value": "Moo é🚀oé 🚀o🚀🚀 ooéoéMM🚀ooé" + }, + { + "type": "hexstring", + "value": "0x7c7ac2ea5c59c21810d551b6" + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x72d0f1198a1eb046f378fa" + }, + { + "type": "string", + "value": "Moo é🚀M🚀 🚀oéo oo oéMMéo éo🚀oéo 🚀éooo🚀oMo oMoo🚀🚀é🚀🚀Moé éo o" + }, + { + "type": "hexstring", + "value": "0xf4dc919c266264224bf842c3" + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "7598157658436859234271441995675" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x79E8e81b8A5a9e3e076edE5Bb16638e41F03E198" + }, + { + "type": "string", + "value": "Moo é🚀é🚀oooMo🚀o é oMM oooééo" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x15b0fb673f4147a2850f9c1d4203f6286cb2ae27abc0bc55ee6e23ee81" + }, + { + "type": "hexstring", + "value": "0xfe7bff3c8fb4ee9a280dcda7451efbaba0a00ea0c421bb6a5810a920ce" + }, + { + "type": "hexstring", + "value": "0x21b3e529217defe687458ea95697bda10871ba7ada0f484f9802623764" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀oéoM🚀🚀oo🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x6234d83f31aab9006a16152c0e4ca604087559292f7d9e6361" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéMéééM ééoMoo🚀MMMoé 🚀é éé🚀M🚀 ooé🚀o MéooéM Mo" + }, + { + "type": "string", + "value": "Moo é🚀o ooé🚀oMMMM🚀é oo 🚀éM ooéooooMooé🚀 ooéMo o" + }, + { + "type": "string", + "value": "Moo é🚀oMMM 🚀MMé🚀MéooM🚀🚀MMéo🚀oéoMoo🚀🚀M🚀éoéMoMo éoM MoMM🚀" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x5F8B47770D099234Bbe04f5C00e2d3c9C9771Cd7" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "3290481995610493170978580998006430724915579280" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x3973981Cdee11459DeADD244e665F23C0AA35335" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "5343260894431772871393872023759014814660615935" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x2e8cC9c5FCCa7280684154668cC6c78774D0c353" + }, + { + "type": "address", + "value": "0x42C3Ab0C1Af8ecd85172e6BC2275ACA4c2C59673" + }, + { + "type": "address", + "value": "0x41E9616EB62bF6b02278E1448c36c7e6d608c36c" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610f04806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610aef565b60405180910390f35b61005661067b565b61005e61067b565b6040805180820190915260118152704d6f6f20c3a9f09f9a804d20f09f9a806f60781b602082015281526100906106a7565b6100986106b6565b626e2cbb60e91b81526100a96106f2565b6e53a9d0d118b4e80a776df29bd8803b60891b815271044996cc15837d32aa412273ca8d23bb38c960731b60208201526100e161070d565b6100e961073a565b604080516080810182526060602080830182815260008486018181529385018181526a78f454179c2ffd2a54b66f60a81b86528651808801909752600a8752689adede418753e13f3560b71b938701939093529490526b343c687de62671dfd10ef3e760a01b909152919091528152815261016261073a565b60408051608080820183526060602080840182905260008486018190529184018290526a1d1639a53aceeef834866960ab1b8452845192830190945260418083529293909290610e61908301396020838101919091526b1c1764eb6cc9fff845d2b2a560a21b604084015260006060840152918352508201526101e361073a565b604080516080810182526060602080830182905260008385018190528284018190526aa347609da05247782b419b60a81b84528451928301909452602d80835292939290610ea2908301396020830152506b3e3d61752e2ce10c086aa8db60a11b6040808301919091526000606083015290825282015261026261073a565b604080516080810182526060602080830182905260008385018190529183018290526a3968788cc50f582379bc7d60a91b8352835160a0810190945260648085529293919290610dfd908301396020838101919091526bf4dc919c266264224bf842c360a01b60408085019190915260016060808601919091529385529285019390935250838101929092528301919091526c5fe6f8b4c83b162afd32b4479b9082015261030e610780565b7379e8e81b8a5a9e3e076ede5bb16638e41f03e19881526040805160608101909152602a80825260009190610d15602083013960208301525061034f6107ad565b7f15b0fb673f4147a2850f9c1d4203f6286cb2ae27abc0bc55ee6e23ee8100000081527ffe7bff3c8fb4ee9a280dcda7451efbaba0a00ea0c421bb6a5810a920ce0000006020808301919091527f21b3e529217defe687458ea95697bda10871ba7ada0f484f980262376400000060408084019190915283810192909252815160608101909252602380835260009291610d3f90830139606080840191909152830191909152506103fe6107cb565b7f6234d83f31aab9006a16152c0e4ca604087559292f7d9e636100000000000000815260408051600180825281830190925260009160208083019080368337019050509050600060019050808260008151811061045d5761045d610ca1565b9115156020928302919091018201528301919091525060408051600380825260808201909252600091816020015b606081526020019060019003908161048b5790505090506000604051806080016040528060548152602001610d6260549139905080826000815181106104d3576104d3610ca1565b6020026020010181905250506000604051806080016040528060478152602001610db6604791399050808260018151811061051057610510610ca1565b60200260200101819052505060006040518060800160405280605d8152602001610cb8605d91399050808260028151811061054d5761054d610ca1565b60209081029190910101525060408201526001606082015261056d610802565b6040805160608082018352735f8b47770d099234bbe04f5c00e2d3c9c9771cd78252600160208084019190915272938ce17e4954f0970e964e1a04dd452695c9908385015291845282519081018352600081830152733973981cdee11459deadd244e665f23c0aa35335815272ef99a07dadf298b8eb81dabb52783ab316deff928101929092528281019190915260808381019290925290830191909152908252820152610619610841565b6106216107ad565b732e8cc9c5fcca7280684154668cc6c78774d0c35381527342c3ab0c1af8ecd85172e6bc2275aca4c2c5967360208201527341e9616eb62bf6b02278e1448c36c7e6d608c36c604080830191909152908252820152919050565b6040518060600160405280606081526020016106956106a7565b81526020016106a2610841565b905290565b60405180602001604052806106a25b6040805160a0810190915260008152602081016106d16106f2565b8152600060208201526040016106e5610780565b81526020016106a26107cb565b60408051606081018252600080825260208201529081016106a25b60405180608001604052806004905b61072461073a565b81526020019060019003908161071c5790505090565b60405180602001604052806001905b6040805160808101825260008082526060602080840182905293830182905282015282526000199092019101816107495790505090565b6040805160808101825260008152606060208201529081016107a06107ad565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b6040518060a00160405280600066ffffffffffffff1916815260200160608152602001606081526020016000151581526020016106a25b60405180604001604052806002905b60408051606081018252600080825260208083018290529282015282526000199092019101816108115790505090565b60405180602001604052806001905b6108586107ad565b8152602001906001900390816108505790505090565b6000815180845260005b8181101561089457602081850181015186830182015201610878565b818111156108a6576000602083870101525b50601f01601f19169290920160200192915050565b60018060a01b038151168252600060208083015160c0828601526108e260c086018261086e565b905060408401516040860160005b600381101561091357825162ffffff1916825291840191908401906001016108f0565b5050506060840151915084810360a086015261092f818361086e565b95945050505050565b6000815180845260208085019450848260051b860182860160005b8581101561097d57838303895261096b83835161086e565b98850198925090840190600101610953565b5090979650505050505050565b8060005b60028110156109e657815180516001600160a01b0316855260208082015115158187015260409182015172ffffffffffffffffffffffffffffffffffffff16918601919091526060909401939091019060010161098e565b50505050565b805166ffffffffffffff19168252602080820151610140828501819052815190850181905260009261016086019281019184905b80821015610a4257835115158552938201939282019260019190910190610a20565b5050505060408301518482036040860152610a5d8282610938565b9150506060830151610a73606086018215159052565b506080830151610a86608086018261098a565b509392505050565b806000805b6001808210610aa25750610ae8565b835186845b6003811015610ace5782516001600160a01b03168252602092830192909101908301610aa7565b505050606095909501945060209290920191600101610a93565b5050505050565b60006020808352835160a082850152610b0b60c085018261086e565b82860151601f198683038101604080890191909152915185845280516001600160e81b031916848701528086015160a084860152805170ffffffffffffffffffffffffffffffffff191660c0860152808701516dffffffffffffffffffffffffffff191660e08601528301516060610100860152939450929091906101a08501610120860160005b6004811015610c325787830361011f190182528351838a810160005b6001811015610c1d57868203835283516affffffffffffffffffffff60a81b81511683528d81015160808f850152610bea608085018261086e565b828c01516001600160a01b031916858d01526060928301511515929094019190915250928c0192918c0191600101610baf565b50958b01959450505090880190600101610b93565b5050848301516cffffffffffffffffffffffffff8116606088015296506060850151965083868203016080870152610c6a81886108bb565b9650505060808301519250818486030160a0850152610c8985846109ec565b9450808801519350505050610a866060850182610a8e565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f4d4d4d20f09f9a804d4dc3a9f09f9a804dc3a96f6f4df09f9a80f09f9a804d4dc3a96ff09f9a806fc3a96f4d6f6ff09f9a80f09f9a804df09f9a80c3a96fc3a94d6f4d6f20c3a96f4d204d6f4d4df09f9a804d6f6f20c3a9f09f9a80c3a9f09f9a806f6f6f4d6ff09f9a806f20c3a9206f4d4d206f6f6fc3a9c3a96f4d6f6f20c3a9f09f9a806ff09f9a806fc3a96f4df09f9a80f09f9a806f6ff09f9a806f4d6f6f20c3a9f09f9a806fc3a94dc3a9c3a9c3a94d20c3a9c3a96f4d6f6ff09f9a804d4d4d6fc3a92020f09f9a80c3a920c3a9c3a9f09f9a804df09f9a80206f6fc3a9f09f9a806f204dc3a96f6fc3a94d204d6f4d6f6f20c3a9f09f9a806f206f6fc3a9f09f9a806f4d4d4d4df09f9a80c3a9206f6f20f09f9a80c3a94d20206f6fc3a96f6f6f6f4d6f6fc3a9f09f9a80206f6fc3a94d6f20206f4d6f6f20c3a9f09f9a804df09f9a8020f09f9a806fc3a96f206f6f206fc3a94d4dc3a96f2020c3a96ff09f9a806fc3a96f20f09f9a80c3a96f6f6ff09f9a806f4d6f206f4d6f6ff09f9a80f09f9a80c3a9f09f9a80f09f9a804d6fc3a92020c3a96f206f4d6f6f20c3a9f09f9a804d6f4dc3a9206f6ff09f9a80206f204dc3a9c3a9f09f9a802020206f2020f09f9a80f09f9a804dc3a9f09f9a80c3a9206fc3a920204d6f4d6f6f20c3a9f09f9a806fc3a920f09f9a806ff09f9a80f09f9a80206f6fc3a96fc3a94d4df09f9a806f6fc3a9a2646970667358221220a53bfc131a5d2de754df440676b4f8ec39bb44ccc7cb8d80d75b82c7bf39815664736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_237fc942 {\n bytes11 s_0;\n string s_1;\n bytes12 s_2;\n bool s_3;\n }\n\n struct S_cb3aa033 {\n bytes15 s_0;\n bytes18 s_1;\n S_237fc942[1][4] s_2;\n }\n\n struct S_65f572f0 {\n address s_0;\n string s_1;\n bytes29[3] s_2;\n string s_3;\n }\n\n struct S_64039d39 {\n address s_0;\n bool s_1;\n uint152 s_2;\n }\n\n struct S_5ed2fe1d {\n bytes25 s_0;\n bool[] s_1;\n string[] s_2;\n bool s_3;\n S_64039d39[2] s_4;\n }\n\n struct S_e6ccb0a3 {\n bytes3 s_0;\n S_cb3aa033 s_1;\n uint104 s_2;\n S_65f572f0 s_3;\n S_5ed2fe1d s_4;\n }\n\n struct S_17ec986b {\n S_e6ccb0a3 s_0;\n }\n\n struct S_37839f5f {\n string s_0;\n S_17ec986b s_1;\n address[3][1] s_2;\n }\n\n function test () public pure returns (S_37839f5f memory) {\n S_37839f5f memory r;\n {\n string memory r_0 = unicode\"Moo é🚀M 🚀o\";\n r.s_0 = r_0;\n }\n {\n S_17ec986b memory r_1;\n {\n S_e6ccb0a3 memory r_1_0;\n {\n bytes3 r_1_0_0 = bytes3(0xdc5976);\n r_1_0.s_0 = r_1_0_0;\n }\n {\n S_cb3aa033 memory r_1_0_1;\n {\n bytes15 r_1_0_1_0 = bytes15(0xa753a1a23169d014eedbe537b10076);\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n bytes18 r_1_0_1_1 = bytes18(0x224cb660ac1be9955209139e54691dd9c648);\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n {\n S_237fc942[1][4] memory r_1_0_1_2;\n {\n S_237fc942[1] memory r_1_0_1_2_0;\n {\n S_237fc942 memory r_1_0_1_2_0_0;\n {\n bytes11 r_1_0_1_2_0_0_0 = bytes11(0x78f454179c2ffd2a54b66f);\n r_1_0_1_2_0_0.s_0 = r_1_0_1_2_0_0_0;\n }\n {\n string memory r_1_0_1_2_0_0_1 = unicode\"Moo é🚀\";\n r_1_0_1_2_0_0.s_1 = r_1_0_1_2_0_0_1;\n }\n {\n bytes12 r_1_0_1_2_0_0_2 = bytes12(0x343c687de62671dfd10ef3e7);\n r_1_0_1_2_0_0.s_2 = r_1_0_1_2_0_0_2;\n }\n {\n bool r_1_0_1_2_0_0_3 = false;\n r_1_0_1_2_0_0.s_3 = r_1_0_1_2_0_0_3;\n }\n r_1_0_1_2_0[0] = r_1_0_1_2_0_0;\n }\n r_1_0_1_2[0] = r_1_0_1_2_0;\n }\n {\n S_237fc942[1] memory r_1_0_1_2_1;\n {\n S_237fc942 memory r_1_0_1_2_1_0;\n {\n bytes11 r_1_0_1_2_1_0_0 = bytes11(0xe8b1cd29d67777c1a43348);\n r_1_0_1_2_1_0.s_0 = r_1_0_1_2_1_0_0;\n }\n {\n string memory r_1_0_1_2_1_0_1 = unicode\"Moo é🚀MoMé oo🚀 o Méé🚀 o 🚀🚀Mé🚀é oé Mo\";\n r_1_0_1_2_1_0.s_1 = r_1_0_1_2_1_0_1;\n }\n {\n bytes12 r_1_0_1_2_1_0_2 = bytes12(0x705d93adb327ffe1174aca94);\n r_1_0_1_2_1_0.s_2 = r_1_0_1_2_1_0_2;\n }\n {\n bool r_1_0_1_2_1_0_3 = false;\n r_1_0_1_2_1_0.s_3 = r_1_0_1_2_1_0_3;\n }\n r_1_0_1_2_1[0] = r_1_0_1_2_1_0;\n }\n r_1_0_1_2[1] = r_1_0_1_2_1;\n }\n {\n S_237fc942[1] memory r_1_0_1_2_2;\n {\n S_237fc942 memory r_1_0_1_2_2_0;\n {\n bytes11 r_1_0_1_2_2_0_0 = bytes11(0xa347609da05247782b419b);\n r_1_0_1_2_2_0.s_0 = r_1_0_1_2_2_0_0;\n }\n {\n string memory r_1_0_1_2_2_0_1 = unicode\"Moo é🚀oé 🚀o🚀🚀 ooéoéMM🚀ooé\";\n r_1_0_1_2_2_0.s_1 = r_1_0_1_2_2_0_1;\n }\n {\n bytes12 r_1_0_1_2_2_0_2 = bytes12(0x7c7ac2ea5c59c21810d551b6);\n r_1_0_1_2_2_0.s_2 = r_1_0_1_2_2_0_2;\n }\n {\n bool r_1_0_1_2_2_0_3 = false;\n r_1_0_1_2_2_0.s_3 = r_1_0_1_2_2_0_3;\n }\n r_1_0_1_2_2[0] = r_1_0_1_2_2_0;\n }\n r_1_0_1_2[2] = r_1_0_1_2_2;\n }\n {\n S_237fc942[1] memory r_1_0_1_2_3;\n {\n S_237fc942 memory r_1_0_1_2_3_0;\n {\n bytes11 r_1_0_1_2_3_0_0 = bytes11(0x72d0f1198a1eb046f378fa);\n r_1_0_1_2_3_0.s_0 = r_1_0_1_2_3_0_0;\n }\n {\n string memory r_1_0_1_2_3_0_1 = unicode\"Moo é🚀M🚀 🚀oéo oo oéMMéo éo🚀oéo 🚀éooo🚀oMo oMoo🚀🚀é🚀🚀Moé éo o\";\n r_1_0_1_2_3_0.s_1 = r_1_0_1_2_3_0_1;\n }\n {\n bytes12 r_1_0_1_2_3_0_2 = bytes12(0xf4dc919c266264224bf842c3);\n r_1_0_1_2_3_0.s_2 = r_1_0_1_2_3_0_2;\n }\n {\n bool r_1_0_1_2_3_0_3 = true;\n r_1_0_1_2_3_0.s_3 = r_1_0_1_2_3_0_3;\n }\n r_1_0_1_2_3[0] = r_1_0_1_2_3_0;\n }\n r_1_0_1_2[3] = r_1_0_1_2_3;\n }\n r_1_0_1.s_2 = r_1_0_1_2;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n {\n uint104 r_1_0_2 = 7598157658436859234271441995675;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n S_65f572f0 memory r_1_0_3;\n {\n address r_1_0_3_0 = 0x79E8e81b8A5a9e3e076edE5Bb16638e41F03E198;\n r_1_0_3.s_0 = r_1_0_3_0;\n }\n {\n string memory r_1_0_3_1 = unicode\"Moo é🚀é🚀oooMo🚀o é oMM oooééo\";\n r_1_0_3.s_1 = r_1_0_3_1;\n }\n {\n bytes29[3] memory r_1_0_3_2;\n {\n bytes29 r_1_0_3_2_0 = bytes29(0x15b0fb673f4147a2850f9c1d4203f6286cb2ae27abc0bc55ee6e23ee81);\n r_1_0_3_2[0] = r_1_0_3_2_0;\n }\n {\n bytes29 r_1_0_3_2_1 = bytes29(0xfe7bff3c8fb4ee9a280dcda7451efbaba0a00ea0c421bb6a5810a920ce);\n r_1_0_3_2[1] = r_1_0_3_2_1;\n }\n {\n bytes29 r_1_0_3_2_2 = bytes29(0x21b3e529217defe687458ea95697bda10871ba7ada0f484f9802623764);\n r_1_0_3_2[2] = r_1_0_3_2_2;\n }\n r_1_0_3.s_2 = r_1_0_3_2;\n }\n {\n string memory r_1_0_3_3 = unicode\"Moo é🚀o🚀oéoM🚀🚀oo🚀o\";\n r_1_0_3.s_3 = r_1_0_3_3;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n {\n S_5ed2fe1d memory r_1_0_4;\n {\n bytes25 r_1_0_4_0 = bytes25(0x6234d83f31aab9006a16152c0e4ca604087559292f7d9e6361);\n r_1_0_4.s_0 = r_1_0_4_0;\n }\n {\n bool[] memory r_1_0_4_1 = new bool[](1);\n {\n bool r_1_0_4_1_0 = true;\n r_1_0_4_1[0] = r_1_0_4_1_0;\n }\n r_1_0_4.s_1 = r_1_0_4_1;\n }\n {\n string[] memory r_1_0_4_2 = new string[](3);\n {\n string memory r_1_0_4_2_0 = unicode\"Moo é🚀oéMéééM ééoMoo🚀MMMoé 🚀é éé🚀M🚀 ooé🚀o MéooéM Mo\";\n r_1_0_4_2[0] = r_1_0_4_2_0;\n }\n {\n string memory r_1_0_4_2_1 = unicode\"Moo é🚀o ooé🚀oMMMM🚀é oo 🚀éM ooéooooMooé🚀 ooéMo o\";\n r_1_0_4_2[1] = r_1_0_4_2_1;\n }\n {\n string memory r_1_0_4_2_2 = unicode\"Moo é🚀oMMM 🚀MMé🚀MéooM🚀🚀MMéo🚀oéoMoo🚀🚀M🚀éoéMoMo éoM MoMM🚀\";\n r_1_0_4_2[2] = r_1_0_4_2_2;\n }\n r_1_0_4.s_2 = r_1_0_4_2;\n }\n {\n bool r_1_0_4_3 = true;\n r_1_0_4.s_3 = r_1_0_4_3;\n }\n {\n S_64039d39[2] memory r_1_0_4_4;\n {\n S_64039d39 memory r_1_0_4_4_0;\n {\n address r_1_0_4_4_0_0 = 0x5F8B47770D099234Bbe04f5C00e2d3c9C9771Cd7;\n r_1_0_4_4_0.s_0 = r_1_0_4_4_0_0;\n }\n {\n bool r_1_0_4_4_0_1 = true;\n r_1_0_4_4_0.s_1 = r_1_0_4_4_0_1;\n }\n {\n uint152 r_1_0_4_4_0_2 = 3290481995610493170978580998006430724915579280;\n r_1_0_4_4_0.s_2 = r_1_0_4_4_0_2;\n }\n r_1_0_4_4[0] = r_1_0_4_4_0;\n }\n {\n S_64039d39 memory r_1_0_4_4_1;\n {\n address r_1_0_4_4_1_0 = 0x3973981Cdee11459DeADD244e665F23C0AA35335;\n r_1_0_4_4_1.s_0 = r_1_0_4_4_1_0;\n }\n {\n bool r_1_0_4_4_1_1 = false;\n r_1_0_4_4_1.s_1 = r_1_0_4_4_1_1;\n }\n {\n uint152 r_1_0_4_4_1_2 = 5343260894431772871393872023759014814660615935;\n r_1_0_4_4_1.s_2 = r_1_0_4_4_1_2;\n }\n r_1_0_4_4[1] = r_1_0_4_4_1;\n }\n r_1_0_4.s_4 = r_1_0_4_4;\n }\n r_1_0.s_4 = r_1_0_4;\n }\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n address[3][1] memory r_2;\n {\n address[3] memory r_2_0;\n {\n address r_2_0_0 = 0x2e8cC9c5FCCa7280684154668cC6c78774D0c353;\n r_2_0[0] = r_2_0_0;\n }\n {\n address r_2_0_1 = 0x42C3Ab0C1Af8ecd85172e6BC2275ACA4c2C59673;\n r_2_0[1] = r_2_0_1;\n }\n {\n address r_2_0_2 = 0x41E9616EB62bF6b02278E1448c36c7e6d608c36c;\n r_2_0[2] = r_2_0_2;\n }\n r_2[0] = r_2_0;\n }\n r.s_2 = r_2;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000002e8cc9c5fcca7280684154668cc6c78774d0c35300000000000000000000000042c3ab0c1af8ecd85172e6bc2275aca4c2c5967300000000000000000000000041e9616eb62bf6b02278e1448c36c7e6d608c36c00000000000000000000000000000000000000000000000000000000000000114d6f6f20c3a9f09f9a804d20f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020dc5976000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000005fe6f8b4c83b162afd32b4479b00000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000740a753a1a23169d014eedbe537b100760000000000000000000000000000000000224cb660ac1be9955209139e54691dd9c648000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000002078f454179c2ffd2a54b66f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080343c687de62671dfd10ef3e700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e8b1cd29d67777c1a433480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080705d93adb327ffe1174aca940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a804d6f4dc3a9206f6ff09f9a80206f204dc3a9c3a9f09f9a802020206f2020f09f9a80f09f9a804dc3a9f09f9a80c3a9206fc3a920204d6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a347609da05247782b419b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000807c7ac2ea5c59c21810d551b600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806fc3a920f09f9a806ff09f9a80f09f9a80206f6fc3a96fc3a94d4df09f9a806f6fc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002072d0f1198a1eb046f378fa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f4dc919c266264224bf842c30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000644d6f6f20c3a9f09f9a804df09f9a8020f09f9a806fc3a96f206f6f206fc3a94d4dc3a96f2020c3a96ff09f9a806fc3a96f20f09f9a80c3a96f6f6ff09f9a806f4d6f206f4d6f6ff09f9a80f09f9a80c3a9f09f9a80f09f9a804d6fc3a92020c3a96f206f0000000000000000000000000000000000000000000000000000000000000000000000000000000079e8e81b8a5a9e3e076ede5bb16638e41f03e19800000000000000000000000000000000000000000000000000000000000000c015b0fb673f4147a2850f9c1d4203f6286cb2ae27abc0bc55ee6e23ee81000000fe7bff3c8fb4ee9a280dcda7451efbaba0a00ea0c421bb6a5810a920ce00000021b3e529217defe687458ea95697bda10871ba7ada0f484f98026237640000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a80c3a9f09f9a806f6f6f4d6ff09f9a806f20c3a9206f4d4d206f6f6fc3a9c3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a806ff09f9a806fc3a96f4df09f9a80f09f9a806f6ff09f9a806f00000000000000000000000000000000000000000000000000000000006234d83f31aab9006a16152c0e4ca604087559292f7d9e6361000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005f8b47770d099234bbe04f5c00e2d3c9c9771cd7000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000938ce17e4954f0970e964e1a04dd452695c9900000000000000000000000003973981cdee11459deadd244e665f23c0aa35335000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef99a07dadf298b8eb81dabb52783ab316deff000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a806fc3a94dc3a9c3a9c3a94d20c3a9c3a96f4d6f6ff09f9a804d4d4d6fc3a92020f09f9a80c3a920c3a9c3a9f09f9a804df09f9a80206f6fc3a9f09f9a806f204dc3a96f6fc3a94d204d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a806f206f6fc3a9f09f9a806f4d4d4d4df09f9a80c3a9206f6f20f09f9a80c3a94d20206f6fc3a96f6f6f6f4d6f6fc3a9f09f9a80206f6fc3a94d6f20206f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a806f4d4d4d20f09f9a804d4dc3a9f09f9a804dc3a96f6f4df09f9a80f09f9a804d4dc3a96ff09f9a806fc3a96f4d6f6ff09f9a80f09f9a804df09f9a80c3a96fc3a94d6f4d6f20c3a96f4d204d6f4d4df09f9a80000000" + }, + { + "name": "random-(int40,bool,bool[2][3],(bool[1],bool,string[1],((((uint208,uint200),bool,int216,string,bytes24)),(bytes12,address,(address[3],address,bool[1]),(bool[2],uint128,bool,bytes1))),uint144)[3])", + "type": "(int40,bool,bool[2][3],(bool[1],bool,string[1],((((uint208,uint200),bool,int216,string,bytes24)),(bytes12,address,(address[3],address,bool[1]),(bool[2],uint128,bool,bytes1))),uint144)[3])", + "value": [ + "375651691803", + true, + [ + [true, true], + [false, true], + [true, true] + ], + [ + [ + [true], + false, + ["Moo é🚀 oM🚀🚀éo🚀é oé 🚀MoéoooM🚀 oéoooé M éoééo "], + [ + [ + [ + [ + "219869268161584151820843745970004265006757244613879184113165175", + "869851872078048537482535141764915344962291147772909393489970" + ], + true, + "-38952926396370531882162672776222128013892686594924006024776996372", + "Moo é🚀oéMMoooé🚀Mo🚀🚀🚀🚀 oéoMoM é🚀ooo oo o 🚀🚀oo ", + "0xaafe7b6baea9cabde256158964045210d15497343fd691a9" + ] + ], + [ + "0xc382f17a6acee642ad48adbb", + "0x42c34931C9Fd6E72EBe9Bb0303d648639FBd22DD", + [ + [ + "0x32B2873BD3Ae1a7dCb90819209Df8e7e6D6420CA", + "0xb98a9D30b88C2bb915467Cb20b94fbF13b70ceF4", + "0x822C9bDdd6db1bCc30baD1f9893AfFC5fc6190cD" + ], + "0x3a360Ecd653A2c3cD8f937aDcc8b1E6b972d45e5", + [true] + ], + [ + [false, false], + "305437018047719388648675381031824257663", + true, + "0x42" + ] + ] + ], + "17338900104561149788001399758473188465564149" + ], + [ + [true], + false, + ["Moo é🚀🚀é ooMoooo🚀é ééé🚀 oé🚀oooo MM o oéo M🚀🚀ooo oo"], + [ + [ + [ + [ + "148986487589770053248126805684815091560552159056743034474368368", + "341629692577134441380087171025575474021054643073969998618173" + ], + false, + "-16577465788737656605976540502486069690983566910615660372025280087", + "Moo é🚀🚀éMMéoo🚀oo 🚀Mo éo🚀oé🚀Mé o MM🚀oé oé🚀é oo", + "0xba998f48b7a9a52e1b4c48aac4dbfe48b483d45659810ff8" + ] + ], + [ + "0x83ad5c1ad75cb8f694035836", + "0x7b4E5D17E60093EB6B75C68e77fC38a0685b3EcB", + [ + [ + "0x4F8C6975D56e0d919204E0F3702c5134096945c9", + "0x87bf3f3E26b33aCa0f33c598eF23f8cFFA55D69d", + "0xA65bcC50BA717762A449DE2C925C196AE61FCA11" + ], + "0xf5874E28d76b93dAC67F78Cf653E74b30c6435d5", + [true] + ], + [[true, true], "56584285225144935868842109006101141896", false, "0x42"] + ] + ], + "1234073841007169731989883187536212630198654" + ], + [ + [true], + false, + ["Moo é🚀oo🚀oo M🚀oMMooM éM🚀éMoéo"], + [ + [ + [ + [ + "321945002089282189664250243448613872382298483802879413377085075", + "64531526687017767409830824526662104081865747532139174540504" + ], + true, + "-16311206085278764399006835689162197040626345037999992664810229262", + "Moo é🚀", + "0xa61c482a275b47beca980e7dfac1b2d1f878eef01b88c3bd" + ] + ], + [ + "0x0f45c2a79e061ad9612e85f7", + "0x5d8e41eE29c34bba648bf0f2Ad9679E6BE213DCb", + [ + [ + "0x6ACb69a4e4761a86f74Cd4f8D196e3194283467E", + "0x5f28599e7eCA36DdB62F1Da12bfd772d6ce21534", + "0x73C7585B136135eB3CB38a3347b53E5d1362a2bb" + ], + "0x1a068CEE9F2A65f6303407ec2DF83d9e1BE35Ae5", + [false] + ], + [[true, true], "220054157221944246324248159608268304219", false, "0x8c"] + ] + ], + "8509275036342399507475015695954959708816776" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "number", + "value": "375651691803" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oM🚀🚀éo🚀é oé 🚀MoéoooM🚀 oéoooé M éoééo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "219869268161584151820843745970004265006757244613879184113165175" + }, + { + "type": "number", + "value": "869851872078048537482535141764915344962291147772909393489970" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-38952926396370531882162672776222128013892686594924006024776996372" + }, + { + "type": "string", + "value": "Moo é🚀oéMMoooé🚀Mo🚀🚀🚀🚀 oéoMoM é🚀ooo oo o 🚀🚀oo " + }, + { + "type": "hexstring", + "value": "0xaafe7b6baea9cabde256158964045210d15497343fd691a9" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xc382f17a6acee642ad48adbb" + }, + { + "type": "address", + "value": "0x42c34931C9Fd6E72EBe9Bb0303d648639FBd22DD" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x32B2873BD3Ae1a7dCb90819209Df8e7e6D6420CA" + }, + { + "type": "address", + "value": "0xb98a9D30b88C2bb915467Cb20b94fbF13b70ceF4" + }, + { + "type": "address", + "value": "0x822C9bDdd6db1bCc30baD1f9893AfFC5fc6190cD" + } + ] + }, + { + "type": "address", + "value": "0x3a360Ecd653A2c3cD8f937aDcc8b1E6b972d45e5" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "number", + "value": "305437018047719388648675381031824257663" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "hexstring", + "value": "0x42" + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "17338900104561149788001399758473188465564149" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀é ooMoooo🚀é ééé🚀 oé🚀oooo MM o oéo M🚀🚀ooo oo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "148986487589770053248126805684815091560552159056743034474368368" + }, + { + "type": "number", + "value": "341629692577134441380087171025575474021054643073969998618173" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-16577465788737656605976540502486069690983566910615660372025280087" + }, + { + "type": "string", + "value": "Moo é🚀🚀éMMéoo🚀oo 🚀Mo éo🚀oé🚀Mé o MM🚀oé oé🚀é oo" + }, + { + "type": "hexstring", + "value": "0xba998f48b7a9a52e1b4c48aac4dbfe48b483d45659810ff8" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x83ad5c1ad75cb8f694035836" + }, + { + "type": "address", + "value": "0x7b4E5D17E60093EB6B75C68e77fC38a0685b3EcB" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4F8C6975D56e0d919204E0F3702c5134096945c9" + }, + { + "type": "address", + "value": "0x87bf3f3E26b33aCa0f33c598eF23f8cFFA55D69d" + }, + { + "type": "address", + "value": "0xA65bcC50BA717762A449DE2C925C196AE61FCA11" + } + ] + }, + { + "type": "address", + "value": "0xf5874E28d76b93dAC67F78Cf653E74b30c6435d5" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "56584285225144935868842109006101141896" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x42" + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "1234073841007169731989883187536212630198654" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀oo M🚀oMMooM éM🚀éMoéo" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "number", + "value": "321945002089282189664250243448613872382298483802879413377085075" + }, + { + "type": "number", + "value": "64531526687017767409830824526662104081865747532139174540504" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-16311206085278764399006835689162197040626345037999992664810229262" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0xa61c482a275b47beca980e7dfac1b2d1f878eef01b88c3bd" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0f45c2a79e061ad9612e85f7" + }, + { + "type": "address", + "value": "0x5d8e41eE29c34bba648bf0f2Ad9679E6BE213DCb" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x6ACb69a4e4761a86f74Cd4f8D196e3194283467E" + }, + { + "type": "address", + "value": "0x5f28599e7eCA36DdB62F1Da12bfd772d6ce21534" + }, + { + "type": "address", + "value": "0x73C7585B136135eB3CB38a3347b53E5d1362a2bb" + } + ] + }, + { + "type": "address", + "value": "0x1a068CEE9F2A65f6303407ec2DF83d9e1BE35Ae5" + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "number", + "value": "220054157221944246324248159608268304219" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "hexstring", + "value": "0x8c" + } + ] + } + ] + } + ] + }, + { + "type": "number", + "value": "8509275036342399507475015695954959708816776" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610f18806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610c39565b60405180910390f35b6100566107ef565b61005e6107ef565b64577695ed1b815260016020820152610075610820565b61007d61084d565b60018082526020820152815261009161084d565b6000815260016020808301919091528201526100ab61084d565b600180825260208201526040808301919091528201526100c961086b565b6100d1610898565b6100d96108d9565b600181528152600060208201526100ee6108f7565b60006040518060800160405280604a8152602001610e99604a9139825250604082015261011961091e565b61012161093e565b61012961094d565b6040805180820182527988d331fca814666d8ecb560ff8f9cd2847afed86926f588263778152788a934d4ab2a5948265b47d450d71d15ba0df201e7e07bf30326020808301919091529083526001838201527a5eb07732195deb7faa0ea4ed5e5e97d8ec2500cf84870b37ef56131983830152815160808101909252604e80835260009291610e4b908301396060830152507faafe7b6baea9cabde256158964045210d15497343fd691a900000000000000006080820152815281526101ed610987565b6bc382f17a6acee642ad48adbb60a01b81527342c34931c9fd6e72ebe9bb0303d648639fbd22dd60208201526102216109b3565b6102296109da565b7332b2873bd3ae1a7dcb90819209df8e7e6d6420ca815273b98a9d30b88c2bb915467cb20b94fbf13b70cef460208083019190915273822c9bddd6db1bcc30bad1f9893affc5fc6190cd6040830152908252733a360ecd653a2c3cd8f937adcc8b1e6b972d45e59082015261029c6108d9565b600181526040828101919091528201526102b46109f8565b6102bc61084d565b60008082526020808301919091529082526fe5c907a8b8dab1699454054dc08bf27f8282015260016040830152602160f91b6060808401919091528381019290925283019190915282015271c70a72a3694ce0bab73b1e6069ad49a1d9f560808201528152610329610898565b6103316108d9565b600181528152600060208201526103466108f7565b6000604051806080016040528060508152602001610dfb60509139825250604082015261037161091e565b61037961093e565b61038161094d565b604080518082018252795cb6eab50686b9078cac4b8ae86a7e7d10ac9e8e0cfaa56e8d70815278366cbc6a3d643b35bf30b7e71fce67306a2e22f0465e495e3d60208083019190915290835260008382018190527a284c2eaa5ef2b1b6b803edcfeade84113bfd412aee270db312065619848401528251608081019093526050808452909291610d7e908301396060830152507fba998f48b7a9a52e1b4c48aac4dbfe48b483d45659810ff80000000000000000608082015281528152610446610987565b6b41d6ae0d6bae5c7b4a01ac1b60a11b8152737b4e5d17e60093eb6b75c68e77fc38a0685b3ecb602082015261047a6109b3565b6104826109da565b734f8c6975d56e0d919204e0f3702c5134096945c981527387bf3f3e26b33aca0f33c598ef23f8cffa55d69d60208083019190915273a65bcc50ba717762a449de2c925c196ae61fca11604083015290825273f5874e28d76b93dac67f78cf653e74b30c6435d5908201526104f56108d9565b6001815260408281019190915282015261050d6109f8565b61051561084d565b60018082526020808301919091529082526f2a91bca76c829f1cc9983fcd4c40d9888282015260006040830152602160f91b6060808401919091528381019290925283810192909252830191909152710e2a9df865e7ca663503ec6e7eda2964597e6080830152820152610587610898565b61058f6108d9565b600181528152600060208201526105a46108f7565b60006040518060600160405280602d8152602001610dce602d913982525060408201526105cf61091e565b6105d761093e565b6105df61094d565b60408051808201825279c858cc40eecaa87a1eae38342d7ebf94d6857540f6844dbcae938152780a47cc9337a9be537fe3eb9f1ab5e30643b3587711ff33b4d86020808301919091529083526001838201527a27a67d0c2abe27787ffdbd1b4d5842c6b44cd8aa11156735168e0d19838301528151808301909252600a8252689adede418753e13f3560b71b9082015260608201527fa61c482a275b47beca980e7dfac1b2d1f878eef01b88c3bd00000000000000006080820152815281526106a6610987565b6b0f45c2a79e061ad9612e85f760a01b8152735d8e41ee29c34bba648bf0f2ad9679e6be213dcb60208201526106da6109b3565b6106e26109da565b736acb69a4e4761a86f74cd4f8d196e3194283467e8152735f28599e7eca36ddb62f1da12bfd772d6ce215346020808301919091527373c7585b136135eb3cb38a3347b53e5d1362a2bb6040830152908252731a068cee9f2a65f6303407ec2df83d9e1be35ae5908201526107556108d9565b6000815260408281019190915282015261076d6109f8565b61077561084d565b60018082526020808301919091529082526fa58ce39a9eb819b508b40ab852beaf5b828201526000604080840191909152602360fa1b6060808501919091528481019390935290840192909252838101929092527161ae8307c079f97654d9507f02990dd985886080840152830191909152820152919050565b604080516080810182526000808252602082015290810161080e610820565b815260200161081b61086b565b905290565b60405180606001604052806003905b61083761084d565b81526020019060019003908161082f5790505090565b60405180604001604052806002906020820280368337509192915050565b60405180606001604052806003905b610882610898565b81526020019060019003908161087a5790505090565b6040518060a001604052806108ab6108d9565b8152600060208201526040016108bf6108f7565b81526020016108cc61091e565b8152600060209091015290565b60405180602001604052806001906020820280368337509192915050565b60405180602001604052806001905b60608152602001906001900390816109065790505090565b604051806040016040528061093161093e565b815260200161081b610987565b604051806020016040528061081b5b6040805160e081018252600060a0820181815260c08301829052825260208201819052918101829052606080820152608081019190915290565b60408051608081018252600080825260208201529081016109a66109b3565b815260200161081b6109f8565b60405180606001604052806109c66109da565b81526000602082015260400161081b6108d9565b60405180606001604052806003906020820280368337509192915050565b6040518060800160405280610a0b61084d565b81526000602082018190526040820181905260609091015290565b8060005b6002811015610a4b5781511515845260209384019390910190600101610a2a565b50505050565b8060005b6001811015610a4b5781511515845260209384019390910190600101610a55565b6000815180845260005b81811015610a9c57602081850181015186830182015201610a80565b81811115610aae576000602083870101525b50601f01601f19169290920160200192915050565b610ace828251610a26565b6fffffffffffffffffffffffffffffffff602082015116604083015260408101511515606083015260ff60f81b60608201511660808301525050565b80516001600160a01b03191682526020808201516001600160a01b0390811682850152604080840151805190929160009087015b6003821015610b5f5782518416815291850191600191909101908501610b3e565b5050509181015190911660a084015260400151610b7f60c0840182610a51565b506060810151610b9260e0840182610ac3565b505050565b80516101a080845290516020918401829052805180516001600160d01b03166101c08601528201516001600160c81b03166101e08501529081015115156102008401526040810151601a0b610220840152606081015160c0610240850152600091610c06610280860183610a76565b915067ffffffffffffffff19608082015116610260860152506020830151610c316020860182610b0a565b509392505050565b600060208083526101408301845160040b8285015281850151604081151581870152808701519150606080870160005b6003811015610c8d57610c7d828651610a26565b9386019390830190600101610c69565b505087810151610120888101526101a088019490935060005b6003811015610d6f5761013f19898703018252845160a0808801610ccb898451610a51565b828a01511515898b015286830151878a01929092529060c089019060005b6001811015610d1857609f198b8403018452610d06838351610a76565b938c01939250908b0190600101610ce9565b5050858301519150888103868a0152610d318183610b97565b9150506080808301519250610d5b818a018471ffffffffffffffffffffffffffffffffffff169052565b509650509386019390860190600101610ca6565b50939897505050505050505056fe4d6f6f20c3a9f09f9a80f09f9a80c3a94d4dc3a96f6ff09f9a806f6f20f09f9a804d6f20c3a96ff09f9a806fc3a9f09f9a804dc3a920206f20204d4df09f9a806fc3a9206fc3a9f09f9a80c3a9206f6f4d6f6f20c3a9f09f9a806f6ff09f9a806f6f204df09f9a806f4d4d6f6f4d20c3a94df09f9a80c3a94d6fc3a96f4d6f6f20c3a9f09f9a80f09f9a80c3a920206f6f4d6f6f6f6ff09f9a80c3a920c3a9c3a9c3a9f09f9a80206fc3a9f09f9a806f6f6f6f204d4d206f206fc3a96f204df09f9a80f09f9a806f6f6f206f6f4d6f6f20c3a9f09f9a806fc3a94d4d6f6f6fc3a9f09f9a804d6ff09f9a80f09f9a80f09f9a80f09f9a80206fc3a96f4d6f4d20c3a9f09f9a806f6f6f206f6f206f2020f09f9a80f09f9a806f6f204d6f6f20c3a9f09f9a80206f4df09f9a80f09f9a80c3a96ff09f9a80c3a920206fc3a920f09f9a804d6fc3a96f6f6f4df09f9a80206fc3a96f6f6fc3a9204d2020c3a96fc3a9c3a96f20a2646970667358221220a79bf07719f7f4826914648f824ca5d9d3bc79656e89d43124dc23a6c4dbb3dc64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_777c6941 {\n uint208 s_0;\n uint200 s_1;\n }\n\n struct S_b804a8ea {\n S_777c6941 s_0;\n bool s_1;\n int216 s_2;\n string s_3;\n bytes24 s_4;\n }\n\n struct S_c9b0b0e3 {\n S_b804a8ea s_0;\n }\n\n struct S_7bb45416 {\n address[3] s_0;\n address s_1;\n bool[1] s_2;\n }\n\n struct S_2bff667f {\n bool[2] s_0;\n uint128 s_1;\n bool s_2;\n bytes1 s_3;\n }\n\n struct S_788eb28e {\n bytes12 s_0;\n address s_1;\n S_7bb45416 s_2;\n S_2bff667f s_3;\n }\n\n struct S_62d017b9 {\n S_c9b0b0e3 s_0;\n S_788eb28e s_1;\n }\n\n struct S_2ad77a10 {\n bool[1] s_0;\n bool s_1;\n string[1] s_2;\n S_62d017b9 s_3;\n uint144 s_4;\n }\n\n struct S_a3d20497 {\n int40 s_0;\n bool s_1;\n bool[2][3] s_2;\n S_2ad77a10[3] s_3;\n }\n\n function test () public pure returns (S_a3d20497 memory) {\n S_a3d20497 memory r;\n {\n int40 r_0 = 375651691803;\n r.s_0 = r_0;\n }\n {\n bool r_1 = true;\n r.s_1 = r_1;\n }\n {\n bool[2][3] memory r_2;\n {\n bool[2] memory r_2_0;\n {\n bool r_2_0_0 = true;\n r_2_0[0] = r_2_0_0;\n }\n {\n bool r_2_0_1 = true;\n r_2_0[1] = r_2_0_1;\n }\n r_2[0] = r_2_0;\n }\n {\n bool[2] memory r_2_1;\n {\n bool r_2_1_0 = false;\n r_2_1[0] = r_2_1_0;\n }\n {\n bool r_2_1_1 = true;\n r_2_1[1] = r_2_1_1;\n }\n r_2[1] = r_2_1;\n }\n {\n bool[2] memory r_2_2;\n {\n bool r_2_2_0 = true;\n r_2_2[0] = r_2_2_0;\n }\n {\n bool r_2_2_1 = true;\n r_2_2[1] = r_2_2_1;\n }\n r_2[2] = r_2_2;\n }\n r.s_2 = r_2;\n }\n {\n S_2ad77a10[3] memory r_3;\n {\n S_2ad77a10 memory r_3_0;\n {\n bool[1] memory r_3_0_0;\n {\n bool r_3_0_0_0 = true;\n r_3_0_0[0] = r_3_0_0_0;\n }\n r_3_0.s_0 = r_3_0_0;\n }\n {\n bool r_3_0_1 = false;\n r_3_0.s_1 = r_3_0_1;\n }\n {\n string[1] memory r_3_0_2;\n {\n string memory r_3_0_2_0 = unicode\"Moo é🚀 oM🚀🚀éo🚀é oé 🚀MoéoooM🚀 oéoooé M éoééo \";\n r_3_0_2[0] = r_3_0_2_0;\n }\n r_3_0.s_2 = r_3_0_2;\n }\n {\n S_62d017b9 memory r_3_0_3;\n {\n S_c9b0b0e3 memory r_3_0_3_0;\n {\n S_b804a8ea memory r_3_0_3_0_0;\n {\n S_777c6941 memory r_3_0_3_0_0_0;\n {\n uint208 r_3_0_3_0_0_0_0 = 219869268161584151820843745970004265006757244613879184113165175;\n r_3_0_3_0_0_0.s_0 = r_3_0_3_0_0_0_0;\n }\n {\n uint200 r_3_0_3_0_0_0_1 = 869851872078048537482535141764915344962291147772909393489970;\n r_3_0_3_0_0_0.s_1 = r_3_0_3_0_0_0_1;\n }\n r_3_0_3_0_0.s_0 = r_3_0_3_0_0_0;\n }\n {\n bool r_3_0_3_0_0_1 = true;\n r_3_0_3_0_0.s_1 = r_3_0_3_0_0_1;\n }\n {\n int216 r_3_0_3_0_0_2 = -38952926396370531882162672776222128013892686594924006024776996372;\n r_3_0_3_0_0.s_2 = r_3_0_3_0_0_2;\n }\n {\n string memory r_3_0_3_0_0_3 = unicode\"Moo é🚀oéMMoooé🚀Mo🚀🚀🚀🚀 oéoMoM é🚀ooo oo o 🚀🚀oo \";\n r_3_0_3_0_0.s_3 = r_3_0_3_0_0_3;\n }\n {\n bytes24 r_3_0_3_0_0_4 = bytes24(0xaafe7b6baea9cabde256158964045210d15497343fd691a9);\n r_3_0_3_0_0.s_4 = r_3_0_3_0_0_4;\n }\n r_3_0_3_0.s_0 = r_3_0_3_0_0;\n }\n r_3_0_3.s_0 = r_3_0_3_0;\n }\n {\n S_788eb28e memory r_3_0_3_1;\n {\n bytes12 r_3_0_3_1_0 = bytes12(0xc382f17a6acee642ad48adbb);\n r_3_0_3_1.s_0 = r_3_0_3_1_0;\n }\n {\n address r_3_0_3_1_1 = 0x42c34931C9Fd6E72EBe9Bb0303d648639FBd22DD;\n r_3_0_3_1.s_1 = r_3_0_3_1_1;\n }\n {\n S_7bb45416 memory r_3_0_3_1_2;\n {\n address[3] memory r_3_0_3_1_2_0;\n {\n address r_3_0_3_1_2_0_0 = 0x32B2873BD3Ae1a7dCb90819209Df8e7e6D6420CA;\n r_3_0_3_1_2_0[0] = r_3_0_3_1_2_0_0;\n }\n {\n address r_3_0_3_1_2_0_1 = 0xb98a9D30b88C2bb915467Cb20b94fbF13b70ceF4;\n r_3_0_3_1_2_0[1] = r_3_0_3_1_2_0_1;\n }\n {\n address r_3_0_3_1_2_0_2 = 0x822C9bDdd6db1bCc30baD1f9893AfFC5fc6190cD;\n r_3_0_3_1_2_0[2] = r_3_0_3_1_2_0_2;\n }\n r_3_0_3_1_2.s_0 = r_3_0_3_1_2_0;\n }\n {\n address r_3_0_3_1_2_1 = 0x3a360Ecd653A2c3cD8f937aDcc8b1E6b972d45e5;\n r_3_0_3_1_2.s_1 = r_3_0_3_1_2_1;\n }\n {\n bool[1] memory r_3_0_3_1_2_2;\n {\n bool r_3_0_3_1_2_2_0 = true;\n r_3_0_3_1_2_2[0] = r_3_0_3_1_2_2_0;\n }\n r_3_0_3_1_2.s_2 = r_3_0_3_1_2_2;\n }\n r_3_0_3_1.s_2 = r_3_0_3_1_2;\n }\n {\n S_2bff667f memory r_3_0_3_1_3;\n {\n bool[2] memory r_3_0_3_1_3_0;\n {\n bool r_3_0_3_1_3_0_0 = false;\n r_3_0_3_1_3_0[0] = r_3_0_3_1_3_0_0;\n }\n {\n bool r_3_0_3_1_3_0_1 = false;\n r_3_0_3_1_3_0[1] = r_3_0_3_1_3_0_1;\n }\n r_3_0_3_1_3.s_0 = r_3_0_3_1_3_0;\n }\n {\n uint128 r_3_0_3_1_3_1 = 305437018047719388648675381031824257663;\n r_3_0_3_1_3.s_1 = r_3_0_3_1_3_1;\n }\n {\n bool r_3_0_3_1_3_2 = true;\n r_3_0_3_1_3.s_2 = r_3_0_3_1_3_2;\n }\n {\n bytes1 r_3_0_3_1_3_3 = bytes1(0x42);\n r_3_0_3_1_3.s_3 = r_3_0_3_1_3_3;\n }\n r_3_0_3_1.s_3 = r_3_0_3_1_3;\n }\n r_3_0_3.s_1 = r_3_0_3_1;\n }\n r_3_0.s_3 = r_3_0_3;\n }\n {\n uint144 r_3_0_4 = 17338900104561149788001399758473188465564149;\n r_3_0.s_4 = r_3_0_4;\n }\n r_3[0] = r_3_0;\n }\n {\n S_2ad77a10 memory r_3_1;\n {\n bool[1] memory r_3_1_0;\n {\n bool r_3_1_0_0 = true;\n r_3_1_0[0] = r_3_1_0_0;\n }\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bool r_3_1_1 = false;\n r_3_1.s_1 = r_3_1_1;\n }\n {\n string[1] memory r_3_1_2;\n {\n string memory r_3_1_2_0 = unicode\"Moo é🚀🚀é ooMoooo🚀é ééé🚀 oé🚀oooo MM o oéo M🚀🚀ooo oo\";\n r_3_1_2[0] = r_3_1_2_0;\n }\n r_3_1.s_2 = r_3_1_2;\n }\n {\n S_62d017b9 memory r_3_1_3;\n {\n S_c9b0b0e3 memory r_3_1_3_0;\n {\n S_b804a8ea memory r_3_1_3_0_0;\n {\n S_777c6941 memory r_3_1_3_0_0_0;\n {\n uint208 r_3_1_3_0_0_0_0 = 148986487589770053248126805684815091560552159056743034474368368;\n r_3_1_3_0_0_0.s_0 = r_3_1_3_0_0_0_0;\n }\n {\n uint200 r_3_1_3_0_0_0_1 = 341629692577134441380087171025575474021054643073969998618173;\n r_3_1_3_0_0_0.s_1 = r_3_1_3_0_0_0_1;\n }\n r_3_1_3_0_0.s_0 = r_3_1_3_0_0_0;\n }\n {\n bool r_3_1_3_0_0_1 = false;\n r_3_1_3_0_0.s_1 = r_3_1_3_0_0_1;\n }\n {\n int216 r_3_1_3_0_0_2 = -16577465788737656605976540502486069690983566910615660372025280087;\n r_3_1_3_0_0.s_2 = r_3_1_3_0_0_2;\n }\n {\n string memory r_3_1_3_0_0_3 = unicode\"Moo é🚀🚀éMMéoo🚀oo 🚀Mo éo🚀oé🚀Mé o MM🚀oé oé🚀é oo\";\n r_3_1_3_0_0.s_3 = r_3_1_3_0_0_3;\n }\n {\n bytes24 r_3_1_3_0_0_4 = bytes24(0xba998f48b7a9a52e1b4c48aac4dbfe48b483d45659810ff8);\n r_3_1_3_0_0.s_4 = r_3_1_3_0_0_4;\n }\n r_3_1_3_0.s_0 = r_3_1_3_0_0;\n }\n r_3_1_3.s_0 = r_3_1_3_0;\n }\n {\n S_788eb28e memory r_3_1_3_1;\n {\n bytes12 r_3_1_3_1_0 = bytes12(0x83ad5c1ad75cb8f694035836);\n r_3_1_3_1.s_0 = r_3_1_3_1_0;\n }\n {\n address r_3_1_3_1_1 = 0x7b4E5D17E60093EB6B75C68e77fC38a0685b3EcB;\n r_3_1_3_1.s_1 = r_3_1_3_1_1;\n }\n {\n S_7bb45416 memory r_3_1_3_1_2;\n {\n address[3] memory r_3_1_3_1_2_0;\n {\n address r_3_1_3_1_2_0_0 = 0x4F8C6975D56e0d919204E0F3702c5134096945c9;\n r_3_1_3_1_2_0[0] = r_3_1_3_1_2_0_0;\n }\n {\n address r_3_1_3_1_2_0_1 = 0x87bf3f3E26b33aCa0f33c598eF23f8cFFA55D69d;\n r_3_1_3_1_2_0[1] = r_3_1_3_1_2_0_1;\n }\n {\n address r_3_1_3_1_2_0_2 = 0xA65bcC50BA717762A449DE2C925C196AE61FCA11;\n r_3_1_3_1_2_0[2] = r_3_1_3_1_2_0_2;\n }\n r_3_1_3_1_2.s_0 = r_3_1_3_1_2_0;\n }\n {\n address r_3_1_3_1_2_1 = 0xf5874E28d76b93dAC67F78Cf653E74b30c6435d5;\n r_3_1_3_1_2.s_1 = r_3_1_3_1_2_1;\n }\n {\n bool[1] memory r_3_1_3_1_2_2;\n {\n bool r_3_1_3_1_2_2_0 = true;\n r_3_1_3_1_2_2[0] = r_3_1_3_1_2_2_0;\n }\n r_3_1_3_1_2.s_2 = r_3_1_3_1_2_2;\n }\n r_3_1_3_1.s_2 = r_3_1_3_1_2;\n }\n {\n S_2bff667f memory r_3_1_3_1_3;\n {\n bool[2] memory r_3_1_3_1_3_0;\n {\n bool r_3_1_3_1_3_0_0 = true;\n r_3_1_3_1_3_0[0] = r_3_1_3_1_3_0_0;\n }\n {\n bool r_3_1_3_1_3_0_1 = true;\n r_3_1_3_1_3_0[1] = r_3_1_3_1_3_0_1;\n }\n r_3_1_3_1_3.s_0 = r_3_1_3_1_3_0;\n }\n {\n uint128 r_3_1_3_1_3_1 = 56584285225144935868842109006101141896;\n r_3_1_3_1_3.s_1 = r_3_1_3_1_3_1;\n }\n {\n bool r_3_1_3_1_3_2 = false;\n r_3_1_3_1_3.s_2 = r_3_1_3_1_3_2;\n }\n {\n bytes1 r_3_1_3_1_3_3 = bytes1(0x42);\n r_3_1_3_1_3.s_3 = r_3_1_3_1_3_3;\n }\n r_3_1_3_1.s_3 = r_3_1_3_1_3;\n }\n r_3_1_3.s_1 = r_3_1_3_1;\n }\n r_3_1.s_3 = r_3_1_3;\n }\n {\n uint144 r_3_1_4 = 1234073841007169731989883187536212630198654;\n r_3_1.s_4 = r_3_1_4;\n }\n r_3[1] = r_3_1;\n }\n {\n S_2ad77a10 memory r_3_2;\n {\n bool[1] memory r_3_2_0;\n {\n bool r_3_2_0_0 = true;\n r_3_2_0[0] = r_3_2_0_0;\n }\n r_3_2.s_0 = r_3_2_0;\n }\n {\n bool r_3_2_1 = false;\n r_3_2.s_1 = r_3_2_1;\n }\n {\n string[1] memory r_3_2_2;\n {\n string memory r_3_2_2_0 = unicode\"Moo é🚀oo🚀oo M🚀oMMooM éM🚀éMoéo\";\n r_3_2_2[0] = r_3_2_2_0;\n }\n r_3_2.s_2 = r_3_2_2;\n }\n {\n S_62d017b9 memory r_3_2_3;\n {\n S_c9b0b0e3 memory r_3_2_3_0;\n {\n S_b804a8ea memory r_3_2_3_0_0;\n {\n S_777c6941 memory r_3_2_3_0_0_0;\n {\n uint208 r_3_2_3_0_0_0_0 = 321945002089282189664250243448613872382298483802879413377085075;\n r_3_2_3_0_0_0.s_0 = r_3_2_3_0_0_0_0;\n }\n {\n uint200 r_3_2_3_0_0_0_1 = 64531526687017767409830824526662104081865747532139174540504;\n r_3_2_3_0_0_0.s_1 = r_3_2_3_0_0_0_1;\n }\n r_3_2_3_0_0.s_0 = r_3_2_3_0_0_0;\n }\n {\n bool r_3_2_3_0_0_1 = true;\n r_3_2_3_0_0.s_1 = r_3_2_3_0_0_1;\n }\n {\n int216 r_3_2_3_0_0_2 = -16311206085278764399006835689162197040626345037999992664810229262;\n r_3_2_3_0_0.s_2 = r_3_2_3_0_0_2;\n }\n {\n string memory r_3_2_3_0_0_3 = unicode\"Moo é🚀\";\n r_3_2_3_0_0.s_3 = r_3_2_3_0_0_3;\n }\n {\n bytes24 r_3_2_3_0_0_4 = bytes24(0xa61c482a275b47beca980e7dfac1b2d1f878eef01b88c3bd);\n r_3_2_3_0_0.s_4 = r_3_2_3_0_0_4;\n }\n r_3_2_3_0.s_0 = r_3_2_3_0_0;\n }\n r_3_2_3.s_0 = r_3_2_3_0;\n }\n {\n S_788eb28e memory r_3_2_3_1;\n {\n bytes12 r_3_2_3_1_0 = bytes12(0x0f45c2a79e061ad9612e85f7);\n r_3_2_3_1.s_0 = r_3_2_3_1_0;\n }\n {\n address r_3_2_3_1_1 = 0x5d8e41eE29c34bba648bf0f2Ad9679E6BE213DCb;\n r_3_2_3_1.s_1 = r_3_2_3_1_1;\n }\n {\n S_7bb45416 memory r_3_2_3_1_2;\n {\n address[3] memory r_3_2_3_1_2_0;\n {\n address r_3_2_3_1_2_0_0 = 0x6ACb69a4e4761a86f74Cd4f8D196e3194283467E;\n r_3_2_3_1_2_0[0] = r_3_2_3_1_2_0_0;\n }\n {\n address r_3_2_3_1_2_0_1 = 0x5f28599e7eCA36DdB62F1Da12bfd772d6ce21534;\n r_3_2_3_1_2_0[1] = r_3_2_3_1_2_0_1;\n }\n {\n address r_3_2_3_1_2_0_2 = 0x73C7585B136135eB3CB38a3347b53E5d1362a2bb;\n r_3_2_3_1_2_0[2] = r_3_2_3_1_2_0_2;\n }\n r_3_2_3_1_2.s_0 = r_3_2_3_1_2_0;\n }\n {\n address r_3_2_3_1_2_1 = 0x1a068CEE9F2A65f6303407ec2DF83d9e1BE35Ae5;\n r_3_2_3_1_2.s_1 = r_3_2_3_1_2_1;\n }\n {\n bool[1] memory r_3_2_3_1_2_2;\n {\n bool r_3_2_3_1_2_2_0 = false;\n r_3_2_3_1_2_2[0] = r_3_2_3_1_2_2_0;\n }\n r_3_2_3_1_2.s_2 = r_3_2_3_1_2_2;\n }\n r_3_2_3_1.s_2 = r_3_2_3_1_2;\n }\n {\n S_2bff667f memory r_3_2_3_1_3;\n {\n bool[2] memory r_3_2_3_1_3_0;\n {\n bool r_3_2_3_1_3_0_0 = true;\n r_3_2_3_1_3_0[0] = r_3_2_3_1_3_0_0;\n }\n {\n bool r_3_2_3_1_3_0_1 = true;\n r_3_2_3_1_3_0[1] = r_3_2_3_1_3_0_1;\n }\n r_3_2_3_1_3.s_0 = r_3_2_3_1_3_0;\n }\n {\n uint128 r_3_2_3_1_3_1 = 220054157221944246324248159608268304219;\n r_3_2_3_1_3.s_1 = r_3_2_3_1_3_1;\n }\n {\n bool r_3_2_3_1_3_2 = false;\n r_3_2_3_1_3.s_2 = r_3_2_3_1_3_2;\n }\n {\n bytes1 r_3_2_3_1_3_3 = bytes1(0x8c);\n r_3_2_3_1_3.s_3 = r_3_2_3_1_3_3;\n }\n r_3_2_3_1.s_3 = r_3_2_3_1_3;\n }\n r_3_2_3.s_1 = r_3_2_3_1;\n }\n r_3_2.s_3 = r_3_2_3;\n }\n {\n uint144 r_3_2_4 = 8509275036342399507475015695954959708816776;\n r_3_2.s_4 = r_3_2_4;\n }\n r_3[2] = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000577695ed1b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000c70a72a3694ce0bab73b1e6069ad49a1d9f50000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a80206f4df09f9a80f09f9a80c3a96ff09f9a80c3a920206fc3a920f09f9a804d6fc3a96f6f6f4df09f9a80206fc3a96f6f6fc3a9204d2020c3a96fc3a9c3a96f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a0c382f17a6acee642ad48adbb000000000000000000000000000000000000000000000000000000000000000042c34931c9fd6e72ebe9bb0303d648639fbd22dd00000000000000000000000032b2873bd3ae1a7dcb90819209df8e7e6d6420ca000000000000000000000000b98a9d30b88c2bb915467cb20b94fbf13b70cef4000000000000000000000000822c9bddd6db1bcc30bad1f9893affc5fc6190cd0000000000000000000000003a360ecd653a2c3cd8f937adcc8b1e6b972d45e500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5c907a8b8dab1699454054dc08bf27f00000000000000000000000000000000000000000000000000000000000000014200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000088d331fca814666d8ecb560ff8f9cd2847afed86926f58826377000000000000008a934d4ab2a5948265b47d450d71d15ba0df201e7e07bf30320000000000000000000000000000000000000000000000000000000000000001ffffffffffa14f88cde6a2148055f15b12a1a1682713daff307b78f4c810a9ec00000000000000000000000000000000000000000000000000000000000000c0aafe7b6baea9cabde256158964045210d15497343fd691a90000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a806fc3a94d4d6f6f6fc3a9f09f9a804d6ff09f9a80f09f9a80f09f9a80f09f9a80206fc3a96f4d6f4d20c3a9f09f9a806f6f6f206f6f206f2020f09f9a80f09f9a806f6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000e2a9df865e7ca663503ec6e7eda2964597e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80f09f9a80c3a920206f6f4d6f6f6f6ff09f9a80c3a920c3a9c3a9c3a9f09f9a80206fc3a9f09f9a806f6f6f6f204d4d206f206fc3a96f204df09f9a80f09f9a806f6f6f206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a083ad5c1ad75cb8f69403583600000000000000000000000000000000000000000000000000000000000000007b4e5d17e60093eb6b75c68e77fc38a0685b3ecb0000000000000000000000004f8c6975d56e0d919204e0f3702c5134096945c900000000000000000000000087bf3f3e26b33aca0f33c598ef23f8cffa55d69d000000000000000000000000a65bcc50ba717762a449de2c925c196ae61fca11000000000000000000000000f5874e28d76b93dac67f78cf653e74b30c6435d5000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000002a91bca76c829f1cc9983fcd4c40d9880000000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000005cb6eab50686b9078cac4b8ae86a7e7d10ac9e8e0cfaa56e8d7000000000000000366cbc6a3d643b35bf30b7e71fce67306a2e22f0465e495e3d0000000000000000000000000000000000000000000000000000000000000000ffffffffffd7b3d155a10d4e4947fc123015217beec402bed511d8f24cedf9a900000000000000000000000000000000000000000000000000000000000000c0ba998f48b7a9a52e1b4c48aac4dbfe48b483d45659810ff8000000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a80f09f9a80c3a94d4dc3a96f6ff09f9a806f6f20f09f9a804d6f20c3a96ff09f9a806fc3a9f09f9a804dc3a920206f20204d4df09f9a806fc3a9206fc3a9f09f9a80c3a9206f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000061ae8307c079f97654d9507f02990dd985880000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806f6ff09f9a806f6f204df09f9a806f4d4d6f6f4d20c3a94df09f9a80c3a94d6fc3a96f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a00f45c2a79e061ad9612e85f700000000000000000000000000000000000000000000000000000000000000005d8e41ee29c34bba648bf0f2ad9679e6be213dcb0000000000000000000000006acb69a4e4761a86f74cd4f8d196e3194283467e0000000000000000000000005f28599e7eca36ddb62f1da12bfd772d6ce2153400000000000000000000000073c7585b136135eb3cb38a3347b53e5d1362a2bb0000000000000000000000001a068cee9f2a65f6303407ec2df83d9e1be35ae500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000a58ce39a9eb819b508b40ab852beaf5b00000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000c858cc40eecaa87a1eae38342d7ebf94d6857540f6844dbcae93000000000000000a47cc9337a9be537fe3eb9f1ab5e30643b3587711ff33b4d80000000000000000000000000000000000000000000000000000000000000001ffffffffffd85982f3d541d887800242e4b2a7bd394bb32755eeea98cae971f200000000000000000000000000000000000000000000000000000000000000c0a61c482a275b47beca980e7dfac1b2d1f878eef01b88c3bd0000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000" + }, + { + "name": "random-(int216[4][3],(uint240),(string,(address,string),address,bytes18,bytes7),(bool,(((((bool,string)[1],bool,address,address,address),uint48[4])[],bytes13),bool[],bool,bool,string),(int104[4],address,string,bool,address)[3][4]))", + "type": "(int216[4][3],(uint240),(string,(address,string),address,bytes18,bytes7),(bool,(((((bool,string)[1],bool,address,address,address),uint48[4])[],bytes13),bool[],bool,bool,string),(int104[4],address,string,bool,address)[3][4]))", + "value": [ + [ + [ + "11868273551323100157294454126160326463210669472274297398079489269", + "-31053727823250310608621249451147313770203284496117432770408255436", + "-35551289483291868831798817457826337023067510140450468107009299707", + "27705487658324299639010918334396919034900227026676127919688044132" + ], + [ + "12044017138693016628210818395860956364718205747862810206544386642", + "-8702306605769261499790468258440394794965222848982942661743527506", + "-28363395972824844711796614057537172777249910313607925943977872243", + "47643637639193787944838147871685507329622557357669123821124769689" + ], + [ + "-13203069845579571794049623603299015635575972392100603201804655820", + "25946512839804814763054277019674198850840485901411554258917216628", + "12891626248449257529908405529762949158768787481693885251968171290", + "-27865920595705910445672894784189981965922047042118373127699957252" + ] + ], + ["1382207009521263128956750398763747923824410427347528465131537058228239109"], + [ + "Moo é🚀🚀oo🚀oé éo🚀M é", + [ + "0x0f64F8235aCAFAb58E0f9c103EDD1f547F58982A", + "Moo é🚀éM🚀o🚀 Mo🚀oo🚀Mé🚀Mé🚀MMoo 🚀o Mo🚀🚀o 🚀oM🚀M 🚀éoo🚀 oMMM M o🚀" + ], + "0x01a3DcEBB6f25D479747d3705C5c0229dFb507bD", + "0x8b74d28d4650ef0c7473fb124000f9e7f520", + "0xeb6053e207bb35" + ], + [ + true, + [ + [[], "0x72c5695695b2422f1977ab9d3a"], + [true, true], + false, + true, + "Moo é🚀MM 🚀MMéoM🚀 M oéoé éoéM 🚀éo oMMéMéM " + ], + [ + [ + [ + [ + "-5074289586242130803561253864454", + "-5138031919710303241181851731740", + "-7577469842508842656615352962275", + "9140643037559548420544799441937" + ], + "0x9AfC5f78E9f61f3F3FeECb5E4CeF2335bFFdb218", + "Moo é🚀oo🚀oo🚀 oo é🚀 Méooéé🚀 oo M🚀", + false, + "0x5cf69d07918c6B7f830c51af2ba5b398CE926017" + ], + [ + [ + "-2711996766733954473430188112293", + "7248488480405104317803945728814", + "-6414385276541047787817126763340", + "2822615459793162944907918080120" + ], + "0x965DB25C87606fA31c27763a4A981dbEB5CeeC1d", + "Moo é🚀MooéMM🚀é Moé", + false, + "0xa56D0CCb57E38a06290e5d55e83f071B91cDba6a" + ], + [ + [ + "6496975029233924612505735132214", + "3262969799242826414099798020393", + "-9148379312908505096423176473133", + "-1490527201003463357452175013028" + ], + "0xfDF5d03Ff3734DB79e18d2D98b7C6A002D9Dc1d5", + "Moo é🚀oo🚀Mé ", + false, + "0xf0b127B3C8a4AE57823613659Be13873d20E84cd" + ] + ], + [ + [ + [ + "3802248741973155448465813988468", + "-4003152078104534013783737725374", + "5380629481164699382605782718878", + "5668779431484416522636970969907" + ], + "0x92EDF1b8CEe54De67a14096371859E89ED611a50", + "Moo é🚀🚀 éo🚀oééMoéééM é🚀oMoo éoooé é🚀éo 🚀oooéMMo 🚀 M🚀éoé", + false, + "0xD66F05FC5111F0BFDFeFfE948FEa5783de6EA4AE" + ], + [ + [ + "-568062085438715178399079196926", + "9768430507367101076883772934365", + "-602562884632819818030647935923", + "-7459578771672695078781167433120" + ], + "0xc66d9d123Fe8B514C83827cecdddE250d9E263fd", + "Moo é🚀oéooMoM M Mo Méooéo🚀Mo M o o🚀éoooooo🚀éoo 🚀éoéoo🚀oéMMéoo ", + false, + "0x4CFAd9d2Cb54FdD0E8d9A78C6B007029E6E57B10" + ], + [ + [ + "644816355525406727468935310703", + "1065232650890388168589923806", + "-6018202306858049917167045549162", + "-6257445314057488991281944519143" + ], + "0x73f90F8eAb1502aA5D257a5391F391dD806df4D8", + "Moo é🚀", + false, + "0xB21ed17DE2f0563a22d4b0C4c1b7fB2A8c1e9cF1" + ] + ], + [ + [ + [ + "-2489685752560771594390836389999", + "-5836303905615012163872093609647", + "-7200372650153725693113821212136", + "-4800832066420430696408060081550" + ], + "0xbA407c054EA4479895a37d904cda3d66CD226D60", + "Moo é🚀M🚀oM🚀ééooo", + false, + "0x1394F327390C838B6BeE8e21940a6A44ed800463" + ], + [ + [ + "-791236597442537990931814752485", + "4914840373755983307267010724018", + "-7126416071102534009490142543381", + "-4891088028924601649376546604290" + ], + "0x193855C9EB73080C96550Cd235E41669193371a3", + "Moo é🚀🚀MoéoéMoMéM🚀M🚀🚀 o", + false, + "0xD290058A48b14ff6353b32f674d0ce59189CAb85" + ], + [ + [ + "-2947173121615078237433737900747", + "2538678727486459955635145404773", + "-2244139134378110706833632752394", + "1906538943279207716567008558391" + ], + "0x3A0A785A4ce48F22E736D0B822f41f8E8C57Ac1E", + "Moo é🚀éo", + true, + "0xC768F45520158e9b6E160221642B699B2b01E69E" + ] + ], + [ + [ + [ + "-8476296552097094217835189363703", + "6803076381013793203589571143330", + "9621124440692406663026919583497", + "-8939111491535559169016930193876" + ], + "0xEDA383fD7c62109168d6EA17FeD2CA220DD60d68", + "Moo é🚀MoM 🚀éMooo🚀oéo🚀🚀🚀 ", + false, + "0x24601f97F20C6A30eD6f60dF733d53820B34EFe8" + ], + [ + [ + "-6854076920828393069582040199753", + "5982016531878963269214073646673", + "-2357231073712344983910852459304", + "-9314037810611913904280499603259" + ], + "0x246faEda159EAe57552b58a2e2653EbddC2a2d6f", + "Moo é🚀MMé🚀o oééMMoooo🚀M🚀oo🚀MoéoMoMo🚀🚀o éo", + false, + "0x63eDD3691A40B8e62a1D48e12417bE97636385A3" + ], + [ + [ + "-4599056693394174449082647137941", + "-9231406732178550736626676271382", + "895981846438197924265809498429", + "-1721109792104042131652308771101" + ], + "0x7Fc0cD50a7c9ac812fE52C9859edE2C7195E0979", + "Moo é🚀oé oéo éooM ooMoo 🚀éé oM🚀 éé 🚀oéM oéo🚀o🚀oooéoo o🚀o 🚀 MooM", + true, + "0xfaa39c63dd1c648e26D04a393138F44B9bA01372" + ] + ] + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "11868273551323100157294454126160326463210669472274297398079489269" + }, + { + "type": "number", + "value": "-31053727823250310608621249451147313770203284496117432770408255436" + }, + { + "type": "number", + "value": "-35551289483291868831798817457826337023067510140450468107009299707" + }, + { + "type": "number", + "value": "27705487658324299639010918334396919034900227026676127919688044132" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "12044017138693016628210818395860956364718205747862810206544386642" + }, + { + "type": "number", + "value": "-8702306605769261499790468258440394794965222848982942661743527506" + }, + { + "type": "number", + "value": "-28363395972824844711796614057537172777249910313607925943977872243" + }, + { + "type": "number", + "value": "47643637639193787944838147871685507329622557357669123821124769689" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-13203069845579571794049623603299015635575972392100603201804655820" + }, + { + "type": "number", + "value": "25946512839804814763054277019674198850840485901411554258917216628" + }, + { + "type": "number", + "value": "12891626248449257529908405529762949158768787481693885251968171290" + }, + { + "type": "number", + "value": "-27865920595705910445672894784189981965922047042118373127699957252" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1382207009521263128956750398763747923824410427347528465131537058228239109" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀oo🚀oé éo🚀M é" + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x0f64F8235aCAFAb58E0f9c103EDD1f547F58982A" + }, + { + "type": "string", + "value": "Moo é🚀éM🚀o🚀 Mo🚀oo🚀Mé🚀Mé🚀MMoo 🚀o Mo🚀🚀o 🚀oM🚀M 🚀éoo🚀 oMMM M o🚀" + } + ] + }, + { + "type": "address", + "value": "0x01a3DcEBB6f25D479747d3705C5c0229dFb507bD" + }, + { + "type": "hexstring", + "value": "0x8b74d28d4650ef0c7473fb124000f9e7f520" + }, + { + "type": "hexstring", + "value": "0xeb6053e207bb35" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [] + }, + { + "type": "hexstring", + "value": "0x72c5695695b2422f1977ab9d3a" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀MM 🚀MMéoM🚀 M oéoé éoéM 🚀éo oMMéMéM " + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-5074289586242130803561253864454" + }, + { + "type": "number", + "value": "-5138031919710303241181851731740" + }, + { + "type": "number", + "value": "-7577469842508842656615352962275" + }, + { + "type": "number", + "value": "9140643037559548420544799441937" + } + ] + }, + { + "type": "address", + "value": "0x9AfC5f78E9f61f3F3FeECb5E4CeF2335bFFdb218" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀oo🚀 oo é🚀 Méooéé🚀 oo M🚀" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x5cf69d07918c6B7f830c51af2ba5b398CE926017" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2711996766733954473430188112293" + }, + { + "type": "number", + "value": "7248488480405104317803945728814" + }, + { + "type": "number", + "value": "-6414385276541047787817126763340" + }, + { + "type": "number", + "value": "2822615459793162944907918080120" + } + ] + }, + { + "type": "address", + "value": "0x965DB25C87606fA31c27763a4A981dbEB5CeeC1d" + }, + { + "type": "string", + "value": "Moo é🚀MooéMM🚀é Moé" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xa56D0CCb57E38a06290e5d55e83f071B91cDba6a" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "6496975029233924612505735132214" + }, + { + "type": "number", + "value": "3262969799242826414099798020393" + }, + { + "type": "number", + "value": "-9148379312908505096423176473133" + }, + { + "type": "number", + "value": "-1490527201003463357452175013028" + } + ] + }, + { + "type": "address", + "value": "0xfDF5d03Ff3734DB79e18d2D98b7C6A002D9Dc1d5" + }, + { + "type": "string", + "value": "Moo é🚀oo🚀Mé " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xf0b127B3C8a4AE57823613659Be13873d20E84cd" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3802248741973155448465813988468" + }, + { + "type": "number", + "value": "-4003152078104534013783737725374" + }, + { + "type": "number", + "value": "5380629481164699382605782718878" + }, + { + "type": "number", + "value": "5668779431484416522636970969907" + } + ] + }, + { + "type": "address", + "value": "0x92EDF1b8CEe54De67a14096371859E89ED611a50" + }, + { + "type": "string", + "value": "Moo é🚀🚀 éo🚀oééMoéééM é🚀oMoo éoooé é🚀éo 🚀oooéMMo 🚀 M🚀éoé" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xD66F05FC5111F0BFDFeFfE948FEa5783de6EA4AE" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-568062085438715178399079196926" + }, + { + "type": "number", + "value": "9768430507367101076883772934365" + }, + { + "type": "number", + "value": "-602562884632819818030647935923" + }, + { + "type": "number", + "value": "-7459578771672695078781167433120" + } + ] + }, + { + "type": "address", + "value": "0xc66d9d123Fe8B514C83827cecdddE250d9E263fd" + }, + { + "type": "string", + "value": "Moo é🚀oéooMoM M Mo Méooéo🚀Mo M o o🚀éoooooo🚀éoo 🚀éoéoo🚀oéMMéoo " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x4CFAd9d2Cb54FdD0E8d9A78C6B007029E6E57B10" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "644816355525406727468935310703" + }, + { + "type": "number", + "value": "1065232650890388168589923806" + }, + { + "type": "number", + "value": "-6018202306858049917167045549162" + }, + { + "type": "number", + "value": "-6257445314057488991281944519143" + } + ] + }, + { + "type": "address", + "value": "0x73f90F8eAb1502aA5D257a5391F391dD806df4D8" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xB21ed17DE2f0563a22d4b0C4c1b7fB2A8c1e9cF1" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2489685752560771594390836389999" + }, + { + "type": "number", + "value": "-5836303905615012163872093609647" + }, + { + "type": "number", + "value": "-7200372650153725693113821212136" + }, + { + "type": "number", + "value": "-4800832066420430696408060081550" + } + ] + }, + { + "type": "address", + "value": "0xbA407c054EA4479895a37d904cda3d66CD226D60" + }, + { + "type": "string", + "value": "Moo é🚀M🚀oM🚀ééooo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x1394F327390C838B6BeE8e21940a6A44ed800463" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-791236597442537990931814752485" + }, + { + "type": "number", + "value": "4914840373755983307267010724018" + }, + { + "type": "number", + "value": "-7126416071102534009490142543381" + }, + { + "type": "number", + "value": "-4891088028924601649376546604290" + } + ] + }, + { + "type": "address", + "value": "0x193855C9EB73080C96550Cd235E41669193371a3" + }, + { + "type": "string", + "value": "Moo é🚀🚀MoéoéMoMéM🚀M🚀🚀 o" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0xD290058A48b14ff6353b32f674d0ce59189CAb85" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-2947173121615078237433737900747" + }, + { + "type": "number", + "value": "2538678727486459955635145404773" + }, + { + "type": "number", + "value": "-2244139134378110706833632752394" + }, + { + "type": "number", + "value": "1906538943279207716567008558391" + } + ] + }, + { + "type": "address", + "value": "0x3A0A785A4ce48F22E736D0B822f41f8E8C57Ac1E" + }, + { + "type": "string", + "value": "Moo é🚀éo" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xC768F45520158e9b6E160221642B699B2b01E69E" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-8476296552097094217835189363703" + }, + { + "type": "number", + "value": "6803076381013793203589571143330" + }, + { + "type": "number", + "value": "9621124440692406663026919583497" + }, + { + "type": "number", + "value": "-8939111491535559169016930193876" + } + ] + }, + { + "type": "address", + "value": "0xEDA383fD7c62109168d6EA17FeD2CA220DD60d68" + }, + { + "type": "string", + "value": "Moo é🚀MoM 🚀éMooo🚀oéo🚀🚀🚀 " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x24601f97F20C6A30eD6f60dF733d53820B34EFe8" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-6854076920828393069582040199753" + }, + { + "type": "number", + "value": "5982016531878963269214073646673" + }, + { + "type": "number", + "value": "-2357231073712344983910852459304" + }, + { + "type": "number", + "value": "-9314037810611913904280499603259" + } + ] + }, + { + "type": "address", + "value": "0x246faEda159EAe57552b58a2e2653EbddC2a2d6f" + }, + { + "type": "string", + "value": "Moo é🚀MMé🚀o oééMMoooo🚀M🚀oo🚀MoéoMoMo🚀🚀o éo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x63eDD3691A40B8e62a1D48e12417bE97636385A3" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-4599056693394174449082647137941" + }, + { + "type": "number", + "value": "-9231406732178550736626676271382" + }, + { + "type": "number", + "value": "895981846438197924265809498429" + }, + { + "type": "number", + "value": "-1721109792104042131652308771101" + } + ] + }, + { + "type": "address", + "value": "0x7Fc0cD50a7c9ac812fE52C9859edE2C7195E0979" + }, + { + "type": "string", + "value": "Moo é🚀oé oéo éooM ooMoo 🚀éé oM🚀 éé 🚀oéM oéo🚀o🚀oooéoo o🚀o 🚀 MooM" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xfaa39c63dd1c648e26D04a393138F44B9bA01372" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611899806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906114df565b60405180910390f35b610056610e66565b61005e610e66565b610066610ea8565b61006e610ed5565b7a1cd9a50f3300f584bfe9324937e7cbdbf3b7e96dea09de51d784f581527a4b7cc842b4e790f2063b6a50ec0b4c344591c83b76c9898b6c8fcb1960208201527a566b9f2bad7e50d4e6d5ecc0cded557e64410a7a72ae28955e94fa1960408201527a43592ad407e80d17f6ca49091fdee3efbe0920a6a71c3ab7c2ce64606082015281526100fb610ed5565b7a1d4702a0cc6c46bc39146c6e067851848a3f3c90a0571ee294da5281527a1527756d1a6e4781812e669c95bfd78957aca81531c6541accc651196020808301919091527a44f295ab6e895877a0b427b1f6c34c57847fd208d46f5c9b8f8b721960408301527a73d0b55fbdf967bcf1da4508ec567679e0446096b9c7e1db78d799606083015282015261018d610ed5565b7a20184a6097737e9a671aed78e0b190fd539aa96761aeddaa755ccb1981527a3f128df90418590312a67cb2e08f83078026553585a8ba00a351746020808301919091527a1f567a8cbe096b68821b5ab29fd7f5be22dcadba0e63fc2f35fd1a6040808401919091527a43bd01450ce20d31377810fe02b9012a628dee6b769efe7b4a06031960608401528381019290925291835280518083019091527dc844e84c2dc212eafa92b52c85462d33cb9b4ae163263c1483ead8227b05815290820152610257610ef3565b600060405180606001604052806023815260200161184160239139825250604080518082019091526000815260606020820152730f64f8235acafab58e0f9c103edd1f547f58982a81526040805160a08101909152606f808252600091906117946020830139602080840191909152830191909152507301a3dcebb6f25d479747d3705c5c0229dfb507bd60408083019190915271045ba6946a32877863a39fd8920007cf3fa960751b606083015266eb6053e207bb3560c81b6080830152820152610321610f46565b600181526103666040805160e08101909152606060a08201908152600060c0830152819081526060602082018190526000604083018190528183015260809091015290565b604080518082018252606081526000602080830182905283518281529081019093529091816103ab565b610398610fa8565b8152602001906001900390816103905790505b508252506c3962b4ab4ad921178cbbd5ce9d60991b602082015281526040805160028082526060820190925260009181602001602082028036833701905050905060006001905080826000815181106104065761040661158f565b6020026020010190151590811515815250505060006001905080826001815181106104335761043361158f565b91151560209283029190910182015283810192909252506000604080840182905260016060808601919091528151908101909152603e808252919290919061180390830139608083015250602082015261048b610fc8565b610493610ff5565b61049b611022565b6104a3610ed5565b6c400be9f7dd36e8415a43ac84051981526c40d9e064027d277302cc42c71b196020808301919091526c5fa420255b92f2cb0f236f0ce2196040808401919091526c735f02b4f9d400a8dea3c80411606080850191909152928452739afc5f78e9f61f3f3feecb5e4cef2335bffdb218848301528051928301905260388083526000929161175c9083013960408301525060006060820152735cf69d07918c6b7f830c51af2ba5b398ce9260176080820152815261055f611022565b610567610ed5565b6c223aef259154b36080c1fd39a41981526c5b7d21242c917edb1a15231b2e6020808301919091526c50f5ff24673dea611ccc429b4b196040808401919091526c23a05cc8f7f2275812af0e787860608085019190915292845273965db25c87606fa31c27763a4a981dbeb5ceec1d8483015280518082018252601c81527f4d6f6f20c3a9f09f9a804d6f6fc3a94d4df09f9a80c3a9204d6fc3a900000000818401529084015260009183019190915273a56d0ccb57e38a06290e5d55e83f071b91cdba6a608083015282015261063c611022565b610644610ed5565b6c5200dbc8cff98861a1985df43681526c292f395b76aee1cd2f72bdd1296020808301919091526c7378020100d7a6292215710a2c196040808401919091526c12d0273401d5ac014955b7f4a31960608085019190915292845273fdf5d03ff3734db79e18d2d98b7c6a002d9dc1d584830152805180820182526015815274026b7b79061d4f84fcd4037b7f84fcd4026e1d4901605d1b928101929092528381019190915260009183019190915273f0b127b3c8a4ae57823613659be13873d20e84cd60808301528201528152610719610ff5565b610721611022565b610729610ed5565b6c2ffdba7186e0e9b8e07dece47481526c3286e1c9c18a354372223971bd196020808301919091526c43e9c063e0ea7dc47cff74199e6040808401919091526c478cd0714bd3cda0857d004b3360608401529183527392edf1b8cee54de67a14096371859e89ed611a5083820152815160808101909252605e808352600092916115a6908301396040830152506000606082015273d66f05fc5111f0bfdfeffe948fea5783de6ea4ae608082015281526107e1611022565b6107e9610ed5565b6c072b81f19cf70e45ba0a5de8fd1981526c7b4b8054ad0df17669758608dd6020808301919091526c079afc5604e6db1fd6c29b03b2196040808401919091526c5e2732f00fb6de7c1e1ec5759f19606084015291835273c66d9d123fe8b514c83827cecddde250d9e263fd83820152815160808101909252605b808352600092916116669083013960408301525060006060820152734cfad9d2cb54fdd0e8d9a78c6b007029e6e57b10608082015260208201526108a6611022565b6108ae610ed5565b6c0823839683bdd772f5323c6d6f81526b037123c9b703335df2eb55de6020808301919091526c4bf5dc4549a37baf501c599c69196040808401919091526c4efae572a984b99b618514e1e6196060808501919091529284527373f90f8eab1502aa5d257a5391f391dd806df4d88483015280518082018252600a8152689adede418753e13f3560b71b818401528482015260009284019290925273b21ed17de2f0563a22d4b0c4c1b7fb2a8c1e9cf1608084015290830191909152820152610975610ff5565b61097d611022565b610985610ed5565b6c1f6c9bc92ea13c87423e3ca86e1981526c49aa1d708fabe96acbbf179eae196020808301919091526c5ae1a8a8cc180b121c0a46ade7196040808401919091526c3c9853359f8e232a252dc5358d1960608085019190915292845273ba407c054ea4479895a37d904cda3d66cd226d608483015280518082018252601c81527f4d6f6f20c3a9f09f9a804df09f9a806f4df09f9a80c3a9c3a96f6f6f0000000092810192909252830152600090820152731394f327390c838b6bee8e21940a6a44ed80046360808201528152610a5a611022565b610a62610ed5565b6c09fc9f92c6dca62bc760fb20e41981526c3e08b4abc449086ab9864800b26020808301919091526c59f2b136043fbfcdca4eda3e14196040808401919091526c3dbbf5311ae5146c53eed545011960608085019190915292845273193855c9eb73080c96550cd235e41669193371a38483015280519283019052602a808352600092916116c1908301396040830152506000606082015273d290058a48b14ff6353b32f674d0ce59189cab8560808201526020820152610b21611022565b610b29610ed5565b6c2532d477d14c34ba5dedf1f2ca1981526c200ae9d32b2d83865e0b7ff1656020808301919091526c1c533462429fd56507114b7309196040808401919091526c18105c0d0b93a59fa425de3d37606080850191909152928452733a0a785a4ce48f22e736d0b822f41f8e8c57ac1e8483015280518082018252600d81526c4d6f6f20c3a9f09f9a80c3a96f60981b928101929092528381019190915260019183019190915273c768f45520158e9b6e160221642b699b2b01e69e608083015282810191909152820152610bfb610ff5565b610c03611022565b610c0b610ed5565b6c6afc642c94c0c57aad33dbe3f61981526c55ddece359ffb796272727e6a26020808301919091526c796f879bb99ac3ffaa7023af096040808401919091526c70d3d3b820a64956f8b56351d31960608085019190915292845273eda383fd7c62109168d6ea17fed2ca220dd60d688483015280519283019052602d8083526000929161172f90830139604083015250600060608201527324601f97f20c6a30ed6f60df733d53820b34efe860808201528152610cc6611022565b610cce610ed5565b6c5682b78bbd3eba18147bf472481981526c4b80f019615e65a3e33ec5ee516020808301919091526c1dc09fd7ee768fed505c55fb27196040808401919091526c758f478063e0e0003ddccf473a19606084015291835273246faeda159eae57552b58a2e2653ebddc2a2d6f838201528151608081019092526044808352600092916116eb90830139604083015250600060608201527363edd3691a40b8e62a1d48e12417be97636385a360808201526020820152610d8b611022565b610d93610ed5565b6c3a0c5a88661924f7ce899b4e941981526c748448acea43c99bcd28de0915196020808301919091526c0b4f12d004cb1ba5e15ad9513d6040808401919091526c15b934a6f0438cde49ae4a211c196060840152918352737fc0cd50a7c9ac812fe52c9859ede2c7195e097983820152815160a08101909252606280835260009291611604908301396040830152506001606082015273faa39c63dd1c648e26d04a393138f44b9ba013726080820152808260026020020152508082600360200201525060408201526060820152919050565b6040518060800160405280610e79610ea8565b815260408051602080820183526000825283015201610e96610ef3565b8152602001610ea3610f46565b905290565b60405180606001604052806003905b610ebf610ed5565b815260200190600190039081610eb75790505090565b60405180608001604052806004906020820280368337509192915050565b6040518060a0016040528060608152602001610f2b604051806040016040528060006001600160a01b03168152602001606081525090565b81526000602082018190526040820181905260609091015290565b6040518060600160405280600015158152602001610f9b6040805160e08101909152606060a08201908152600060c0830152819081526060602082018190526000604083018190528183015260809091015290565b8152602001610ea3610fc8565b6040518060400160405280610fbb611057565b8152602001610ea3610ed5565b60405180608001604052806004905b610fdf610ff5565b815260200190600190039081610fd75790505090565b60405180606001604052806003905b61100c611022565b8152602001906001900390816110045790505090565b6040518060a00160405280611035610ed5565b8152600060208201819052606060408301819052820181905260809091015290565b6040518060a0016040528061106a61108c565b8152600060208201819052604082018190526060820181905260809091015290565b60405180602001604052806001905b60408051808201909152600081526060602082015281526020019060019003908161109b5790505090565b6000815180845260005b818110156110ec576020818501810151868301820152016110d0565b818111156110fe576000602083870101525b50601f01601f19169290920160200192915050565b6000815160a0845261112860a08501826110c6565b90506020830151848203602086015260018060a01b03808251168352602082015191506040602084015261115f60408401836110c6565b925080604086015116604087015250506dffffffffffffffffffffffffffff19606084015116606085015266ffffffffffffff60c81b60808401511660808501528091505092915050565b8060005b60048110156111d557815165ffffffffffff168452602093840193909101906001016111ae565b50505050565b600081518084526020808501945080840160005b8381101561120d5781511515875295820195908201906001016111ef565b509495945050505050565b60008260808082018460005b60048082106112335750611309565b8584038952825184606080820160005b60038110156112ea57888203845284518051610100908460005b8a81101561127e578251600c0b82526020928301929091019060010161125d565b5050506020828101516001600160a01b03168d860152604083015160a086018390526112ac838701826110c6565b925050858301516112c160c087018215159052565b50918c01516001600160a01b03811660e086015291968701969590950194925050600101611243565b5060209c8d019c90975095909501945050506001919091019050611224565b50909695505050505050565b8051151582526000602080830151606082860152805160a060608701526101408601815160406101008901528181518084526101608a0191506101608160051b8b01019350868301925060005b8181101561143d578a850361015f190183528351805160a0808852815181890191909152610160880190610140890160005b60018110156113d9578a840361013f1901825282518051151585528e015160408f86018190526113c6908601826110c6565b945050918d0191908d0190600101611394565b5050508a820151151560c089015260408201516001600160a01b0390811660e08a0152606083015181166101008a0152608090920151918216610120890152918a015191611429888c01846111aa565b965050509287019291870191600101611362565b505050509083015172ffffffffffffffffffffffffffffffffffffff191661012087015291810151605f1986840381016080880152909261147e81856111db565b935050604082015161149460a088018215159052565b506060820151151560c087015260809091015185830390910160e08601526114bc82826110c6565b915050604083015184820360408601526114d68282611218565b95945050505050565b602080825282516000919082848301815b600381101561153457835182845b600481101561151e578251601a0b825291870191908701906001016114fe565b50505092840192608091909101906001016114f0565b50505050830151516001600160f01b03166101a083015260408301516101e06101c08401819052611569610200850183611113565b91506060850151601f1985840301828601526115858382611315565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a80f09f9a8020c3a96ff09f9a806fc3a9c3a94d6fc3a9c3a9c3a94d20c3a9f09f9a806f4d6f6f20c3a96f6f6fc3a920c3a9f09f9a80c3a96f20f09f9a806f6f6fc3a94d4d6f20f09f9a80204df09f9a80c3a96fc3a94d6f6f20c3a9f09f9a806fc3a9206fc3a96f20c3a96f6f4d206f6f4d6f6f20f09f9a80c3a9c3a9206f4df09f9a8020c3a9c3a920f09f9a806fc3a94d206fc3a96ff09f9a806ff09f9a806f6f6fc3a96f6f206ff09f9a806f20f09f9a80204d6f6f4d4d6f6f20c3a9f09f9a806fc3a96f6f4d6f4d204d204d6f204dc3a96f6fc3a96ff09f9a804d6f204d20206f206ff09f9a80c3a96f6f6f6f6f6ff09f9a80c3a96f6f20f09f9a80c3a96fc3a96f6ff09f9a806fc3a94d4dc3a96f6f204d6f6f20c3a9f09f9a80f09f9a804d6fc3a96fc3a94d6f4dc3a94df09f9a804df09f9a80f09f9a80206f4d6f6f20c3a9f09f9a804d4dc3a9f09f9a806f206fc3a9c3a94d4d6f6f6f6ff09f9a804df09f9a806f6ff09f9a804d6fc3a96f4d6f4d6ff09f9a80f09f9a806f20c3a96f4d6f6f20c3a9f09f9a804d6f4d20f09f9a80c3a94d6f6f6ff09f9a806fc3a96ff09f9a80f09f9a80f09f9a80204d6f6f20c3a9f09f9a806f6ff09f9a806f6ff09f9a80206f6f2020c3a9f09f9a80204dc3a96f6fc3a9c3a9f09f9a80206f6f204df09f9a804d6f6f20c3a9f09f9a80c3a94df09f9a806ff09f9a80204d6ff09f9a806f6ff09f9a804dc3a9f09f9a804dc3a9f09f9a804d4d6f6f20f09f9a806f204d6ff09f9a80f09f9a806f20f09f9a806f4df09f9a804d20f09f9a80c3a96f6ff09f9a80206f4d4d4d2020204d206ff09f9a804d6f6f20c3a9f09f9a804d4d20f09f9a804d4dc3a96f4df09f9a80204d206fc3a96fc3a920c3a96fc3a94d20f09f9a80c3a96f206f4d4dc3a94dc3a94d204d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806fc3a920c3a96ff09f9a804d20c3a9a2646970667358221220cb20887fca174ae7da1efdb626aba7dc4a3fbf6f7dfbfbf0cbd4416ccb9da45564736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_9f7d5788 {\n uint240 s_0;\n }\n\n struct S_8090aaf4 {\n address s_0;\n string s_1;\n }\n\n struct S_4d8ea1c9 {\n string s_0;\n S_8090aaf4 s_1;\n address s_2;\n bytes18 s_3;\n bytes7 s_4;\n }\n\n struct S_0e00bb9b {\n bool s_0;\n string s_1;\n }\n\n struct S_4ed2e74c {\n S_0e00bb9b[1] s_0;\n bool s_1;\n address s_2;\n address s_3;\n address s_4;\n }\n\n struct S_8e70aa5a {\n S_4ed2e74c s_0;\n uint48[4] s_1;\n }\n\n struct S_7d704509 {\n S_8e70aa5a[] s_0;\n bytes13 s_1;\n }\n\n struct S_af8b831e {\n S_7d704509 s_0;\n bool[] s_1;\n bool s_2;\n bool s_3;\n string s_4;\n }\n\n struct S_644e90dd {\n int104[4] s_0;\n address s_1;\n string s_2;\n bool s_3;\n address s_4;\n }\n\n struct S_0640fa72 {\n bool s_0;\n S_af8b831e s_1;\n S_644e90dd[3][4] s_2;\n }\n\n struct S_85db563d {\n int216[4][3] s_0;\n S_9f7d5788 s_1;\n S_4d8ea1c9 s_2;\n S_0640fa72 s_3;\n }\n\n function test () public pure returns (S_85db563d memory) {\n S_85db563d memory r;\n {\n int216[4][3] memory r_0;\n {\n int216[4] memory r_0_0;\n {\n int216 r_0_0_0 = 11868273551323100157294454126160326463210669472274297398079489269;\n r_0_0[0] = r_0_0_0;\n }\n {\n int216 r_0_0_1 = -31053727823250310608621249451147313770203284496117432770408255436;\n r_0_0[1] = r_0_0_1;\n }\n {\n int216 r_0_0_2 = -35551289483291868831798817457826337023067510140450468107009299707;\n r_0_0[2] = r_0_0_2;\n }\n {\n int216 r_0_0_3 = 27705487658324299639010918334396919034900227026676127919688044132;\n r_0_0[3] = r_0_0_3;\n }\n r_0[0] = r_0_0;\n }\n {\n int216[4] memory r_0_1;\n {\n int216 r_0_1_0 = 12044017138693016628210818395860956364718205747862810206544386642;\n r_0_1[0] = r_0_1_0;\n }\n {\n int216 r_0_1_1 = -8702306605769261499790468258440394794965222848982942661743527506;\n r_0_1[1] = r_0_1_1;\n }\n {\n int216 r_0_1_2 = -28363395972824844711796614057537172777249910313607925943977872243;\n r_0_1[2] = r_0_1_2;\n }\n {\n int216 r_0_1_3 = 47643637639193787944838147871685507329622557357669123821124769689;\n r_0_1[3] = r_0_1_3;\n }\n r_0[1] = r_0_1;\n }\n {\n int216[4] memory r_0_2;\n {\n int216 r_0_2_0 = -13203069845579571794049623603299015635575972392100603201804655820;\n r_0_2[0] = r_0_2_0;\n }\n {\n int216 r_0_2_1 = 25946512839804814763054277019674198850840485901411554258917216628;\n r_0_2[1] = r_0_2_1;\n }\n {\n int216 r_0_2_2 = 12891626248449257529908405529762949158768787481693885251968171290;\n r_0_2[2] = r_0_2_2;\n }\n {\n int216 r_0_2_3 = -27865920595705910445672894784189981965922047042118373127699957252;\n r_0_2[3] = r_0_2_3;\n }\n r_0[2] = r_0_2;\n }\n r.s_0 = r_0;\n }\n {\n S_9f7d5788 memory r_1;\n {\n uint240 r_1_0 = 1382207009521263128956750398763747923824410427347528465131537058228239109;\n r_1.s_0 = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n S_4d8ea1c9 memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀🚀oo🚀oé éo🚀M é\";\n r_2.s_0 = r_2_0;\n }\n {\n S_8090aaf4 memory r_2_1;\n {\n address r_2_1_0 = 0x0f64F8235aCAFAb58E0f9c103EDD1f547F58982A;\n r_2_1.s_0 = r_2_1_0;\n }\n {\n string memory r_2_1_1 = unicode\"Moo é🚀éM🚀o🚀 Mo🚀oo🚀Mé🚀Mé🚀MMoo 🚀o Mo🚀🚀o 🚀oM🚀M 🚀éoo🚀 oMMM M o🚀\";\n r_2_1.s_1 = r_2_1_1;\n }\n r_2.s_1 = r_2_1;\n }\n {\n address r_2_2 = 0x01a3DcEBB6f25D479747d3705C5c0229dFb507bD;\n r_2.s_2 = r_2_2;\n }\n {\n bytes18 r_2_3 = bytes18(0x8b74d28d4650ef0c7473fb124000f9e7f520);\n r_2.s_3 = r_2_3;\n }\n {\n bytes7 r_2_4 = bytes7(0xeb6053e207bb35);\n r_2.s_4 = r_2_4;\n }\n r.s_2 = r_2;\n }\n {\n S_0640fa72 memory r_3;\n {\n bool r_3_0 = true;\n r_3.s_0 = r_3_0;\n }\n {\n S_af8b831e memory r_3_1;\n {\n S_7d704509 memory r_3_1_0;\n {\n S_8e70aa5a[] memory r_3_1_0_0 = new S_8e70aa5a[](0);\n r_3_1_0.s_0 = r_3_1_0_0;\n }\n {\n bytes13 r_3_1_0_1 = bytes13(0x72c5695695b2422f1977ab9d3a);\n r_3_1_0.s_1 = r_3_1_0_1;\n }\n r_3_1.s_0 = r_3_1_0;\n }\n {\n bool[] memory r_3_1_1 = new bool[](2);\n {\n bool r_3_1_1_0 = true;\n r_3_1_1[0] = r_3_1_1_0;\n }\n {\n bool r_3_1_1_1 = true;\n r_3_1_1[1] = r_3_1_1_1;\n }\n r_3_1.s_1 = r_3_1_1;\n }\n {\n bool r_3_1_2 = false;\n r_3_1.s_2 = r_3_1_2;\n }\n {\n bool r_3_1_3 = true;\n r_3_1.s_3 = r_3_1_3;\n }\n {\n string memory r_3_1_4 = unicode\"Moo é🚀MM 🚀MMéoM🚀 M oéoé éoéM 🚀éo oMMéMéM \";\n r_3_1.s_4 = r_3_1_4;\n }\n r_3.s_1 = r_3_1;\n }\n {\n S_644e90dd[3][4] memory r_3_2;\n {\n S_644e90dd[3] memory r_3_2_0;\n {\n S_644e90dd memory r_3_2_0_0;\n {\n int104[4] memory r_3_2_0_0_0;\n {\n int104 r_3_2_0_0_0_0 = -5074289586242130803561253864454;\n r_3_2_0_0_0[0] = r_3_2_0_0_0_0;\n }\n {\n int104 r_3_2_0_0_0_1 = -5138031919710303241181851731740;\n r_3_2_0_0_0[1] = r_3_2_0_0_0_1;\n }\n {\n int104 r_3_2_0_0_0_2 = -7577469842508842656615352962275;\n r_3_2_0_0_0[2] = r_3_2_0_0_0_2;\n }\n {\n int104 r_3_2_0_0_0_3 = 9140643037559548420544799441937;\n r_3_2_0_0_0[3] = r_3_2_0_0_0_3;\n }\n r_3_2_0_0.s_0 = r_3_2_0_0_0;\n }\n {\n address r_3_2_0_0_1 = 0x9AfC5f78E9f61f3F3FeECb5E4CeF2335bFFdb218;\n r_3_2_0_0.s_1 = r_3_2_0_0_1;\n }\n {\n string memory r_3_2_0_0_2 = unicode\"Moo é🚀oo🚀oo🚀 oo é🚀 Méooéé🚀 oo M🚀\";\n r_3_2_0_0.s_2 = r_3_2_0_0_2;\n }\n {\n bool r_3_2_0_0_3 = false;\n r_3_2_0_0.s_3 = r_3_2_0_0_3;\n }\n {\n address r_3_2_0_0_4 = 0x5cf69d07918c6B7f830c51af2ba5b398CE926017;\n r_3_2_0_0.s_4 = r_3_2_0_0_4;\n }\n r_3_2_0[0] = r_3_2_0_0;\n }\n {\n S_644e90dd memory r_3_2_0_1;\n {\n int104[4] memory r_3_2_0_1_0;\n {\n int104 r_3_2_0_1_0_0 = -2711996766733954473430188112293;\n r_3_2_0_1_0[0] = r_3_2_0_1_0_0;\n }\n {\n int104 r_3_2_0_1_0_1 = 7248488480405104317803945728814;\n r_3_2_0_1_0[1] = r_3_2_0_1_0_1;\n }\n {\n int104 r_3_2_0_1_0_2 = -6414385276541047787817126763340;\n r_3_2_0_1_0[2] = r_3_2_0_1_0_2;\n }\n {\n int104 r_3_2_0_1_0_3 = 2822615459793162944907918080120;\n r_3_2_0_1_0[3] = r_3_2_0_1_0_3;\n }\n r_3_2_0_1.s_0 = r_3_2_0_1_0;\n }\n {\n address r_3_2_0_1_1 = 0x965DB25C87606fA31c27763a4A981dbEB5CeeC1d;\n r_3_2_0_1.s_1 = r_3_2_0_1_1;\n }\n {\n string memory r_3_2_0_1_2 = unicode\"Moo é🚀MooéMM🚀é Moé\";\n r_3_2_0_1.s_2 = r_3_2_0_1_2;\n }\n {\n bool r_3_2_0_1_3 = false;\n r_3_2_0_1.s_3 = r_3_2_0_1_3;\n }\n {\n address r_3_2_0_1_4 = 0xa56D0CCb57E38a06290e5d55e83f071B91cDba6a;\n r_3_2_0_1.s_4 = r_3_2_0_1_4;\n }\n r_3_2_0[1] = r_3_2_0_1;\n }\n {\n S_644e90dd memory r_3_2_0_2;\n {\n int104[4] memory r_3_2_0_2_0;\n {\n int104 r_3_2_0_2_0_0 = 6496975029233924612505735132214;\n r_3_2_0_2_0[0] = r_3_2_0_2_0_0;\n }\n {\n int104 r_3_2_0_2_0_1 = 3262969799242826414099798020393;\n r_3_2_0_2_0[1] = r_3_2_0_2_0_1;\n }\n {\n int104 r_3_2_0_2_0_2 = -9148379312908505096423176473133;\n r_3_2_0_2_0[2] = r_3_2_0_2_0_2;\n }\n {\n int104 r_3_2_0_2_0_3 = -1490527201003463357452175013028;\n r_3_2_0_2_0[3] = r_3_2_0_2_0_3;\n }\n r_3_2_0_2.s_0 = r_3_2_0_2_0;\n }\n {\n address r_3_2_0_2_1 = 0xfDF5d03Ff3734DB79e18d2D98b7C6A002D9Dc1d5;\n r_3_2_0_2.s_1 = r_3_2_0_2_1;\n }\n {\n string memory r_3_2_0_2_2 = unicode\"Moo é🚀oo🚀Mé \";\n r_3_2_0_2.s_2 = r_3_2_0_2_2;\n }\n {\n bool r_3_2_0_2_3 = false;\n r_3_2_0_2.s_3 = r_3_2_0_2_3;\n }\n {\n address r_3_2_0_2_4 = 0xf0b127B3C8a4AE57823613659Be13873d20E84cd;\n r_3_2_0_2.s_4 = r_3_2_0_2_4;\n }\n r_3_2_0[2] = r_3_2_0_2;\n }\n r_3_2[0] = r_3_2_0;\n }\n {\n S_644e90dd[3] memory r_3_2_1;\n {\n S_644e90dd memory r_3_2_1_0;\n {\n int104[4] memory r_3_2_1_0_0;\n {\n int104 r_3_2_1_0_0_0 = 3802248741973155448465813988468;\n r_3_2_1_0_0[0] = r_3_2_1_0_0_0;\n }\n {\n int104 r_3_2_1_0_0_1 = -4003152078104534013783737725374;\n r_3_2_1_0_0[1] = r_3_2_1_0_0_1;\n }\n {\n int104 r_3_2_1_0_0_2 = 5380629481164699382605782718878;\n r_3_2_1_0_0[2] = r_3_2_1_0_0_2;\n }\n {\n int104 r_3_2_1_0_0_3 = 5668779431484416522636970969907;\n r_3_2_1_0_0[3] = r_3_2_1_0_0_3;\n }\n r_3_2_1_0.s_0 = r_3_2_1_0_0;\n }\n {\n address r_3_2_1_0_1 = 0x92EDF1b8CEe54De67a14096371859E89ED611a50;\n r_3_2_1_0.s_1 = r_3_2_1_0_1;\n }\n {\n string memory r_3_2_1_0_2 = unicode\"Moo é🚀🚀 éo🚀oééMoéééM é🚀oMoo éoooé é🚀éo 🚀oooéMMo 🚀 M🚀éoé\";\n r_3_2_1_0.s_2 = r_3_2_1_0_2;\n }\n {\n bool r_3_2_1_0_3 = false;\n r_3_2_1_0.s_3 = r_3_2_1_0_3;\n }\n {\n address r_3_2_1_0_4 = 0xD66F05FC5111F0BFDFeFfE948FEa5783de6EA4AE;\n r_3_2_1_0.s_4 = r_3_2_1_0_4;\n }\n r_3_2_1[0] = r_3_2_1_0;\n }\n {\n S_644e90dd memory r_3_2_1_1;\n {\n int104[4] memory r_3_2_1_1_0;\n {\n int104 r_3_2_1_1_0_0 = -568062085438715178399079196926;\n r_3_2_1_1_0[0] = r_3_2_1_1_0_0;\n }\n {\n int104 r_3_2_1_1_0_1 = 9768430507367101076883772934365;\n r_3_2_1_1_0[1] = r_3_2_1_1_0_1;\n }\n {\n int104 r_3_2_1_1_0_2 = -602562884632819818030647935923;\n r_3_2_1_1_0[2] = r_3_2_1_1_0_2;\n }\n {\n int104 r_3_2_1_1_0_3 = -7459578771672695078781167433120;\n r_3_2_1_1_0[3] = r_3_2_1_1_0_3;\n }\n r_3_2_1_1.s_0 = r_3_2_1_1_0;\n }\n {\n address r_3_2_1_1_1 = 0xc66d9d123Fe8B514C83827cecdddE250d9E263fd;\n r_3_2_1_1.s_1 = r_3_2_1_1_1;\n }\n {\n string memory r_3_2_1_1_2 = unicode\"Moo é🚀oéooMoM M Mo Méooéo🚀Mo M o o🚀éoooooo🚀éoo 🚀éoéoo🚀oéMMéoo \";\n r_3_2_1_1.s_2 = r_3_2_1_1_2;\n }\n {\n bool r_3_2_1_1_3 = false;\n r_3_2_1_1.s_3 = r_3_2_1_1_3;\n }\n {\n address r_3_2_1_1_4 = 0x4CFAd9d2Cb54FdD0E8d9A78C6B007029E6E57B10;\n r_3_2_1_1.s_4 = r_3_2_1_1_4;\n }\n r_3_2_1[1] = r_3_2_1_1;\n }\n {\n S_644e90dd memory r_3_2_1_2;\n {\n int104[4] memory r_3_2_1_2_0;\n {\n int104 r_3_2_1_2_0_0 = 644816355525406727468935310703;\n r_3_2_1_2_0[0] = r_3_2_1_2_0_0;\n }\n {\n int104 r_3_2_1_2_0_1 = 1065232650890388168589923806;\n r_3_2_1_2_0[1] = r_3_2_1_2_0_1;\n }\n {\n int104 r_3_2_1_2_0_2 = -6018202306858049917167045549162;\n r_3_2_1_2_0[2] = r_3_2_1_2_0_2;\n }\n {\n int104 r_3_2_1_2_0_3 = -6257445314057488991281944519143;\n r_3_2_1_2_0[3] = r_3_2_1_2_0_3;\n }\n r_3_2_1_2.s_0 = r_3_2_1_2_0;\n }\n {\n address r_3_2_1_2_1 = 0x73f90F8eAb1502aA5D257a5391F391dD806df4D8;\n r_3_2_1_2.s_1 = r_3_2_1_2_1;\n }\n {\n string memory r_3_2_1_2_2 = unicode\"Moo é🚀\";\n r_3_2_1_2.s_2 = r_3_2_1_2_2;\n }\n {\n bool r_3_2_1_2_3 = false;\n r_3_2_1_2.s_3 = r_3_2_1_2_3;\n }\n {\n address r_3_2_1_2_4 = 0xB21ed17DE2f0563a22d4b0C4c1b7fB2A8c1e9cF1;\n r_3_2_1_2.s_4 = r_3_2_1_2_4;\n }\n r_3_2_1[2] = r_3_2_1_2;\n }\n r_3_2[1] = r_3_2_1;\n }\n {\n S_644e90dd[3] memory r_3_2_2;\n {\n S_644e90dd memory r_3_2_2_0;\n {\n int104[4] memory r_3_2_2_0_0;\n {\n int104 r_3_2_2_0_0_0 = -2489685752560771594390836389999;\n r_3_2_2_0_0[0] = r_3_2_2_0_0_0;\n }\n {\n int104 r_3_2_2_0_0_1 = -5836303905615012163872093609647;\n r_3_2_2_0_0[1] = r_3_2_2_0_0_1;\n }\n {\n int104 r_3_2_2_0_0_2 = -7200372650153725693113821212136;\n r_3_2_2_0_0[2] = r_3_2_2_0_0_2;\n }\n {\n int104 r_3_2_2_0_0_3 = -4800832066420430696408060081550;\n r_3_2_2_0_0[3] = r_3_2_2_0_0_3;\n }\n r_3_2_2_0.s_0 = r_3_2_2_0_0;\n }\n {\n address r_3_2_2_0_1 = 0xbA407c054EA4479895a37d904cda3d66CD226D60;\n r_3_2_2_0.s_1 = r_3_2_2_0_1;\n }\n {\n string memory r_3_2_2_0_2 = unicode\"Moo é🚀M🚀oM🚀ééooo\";\n r_3_2_2_0.s_2 = r_3_2_2_0_2;\n }\n {\n bool r_3_2_2_0_3 = false;\n r_3_2_2_0.s_3 = r_3_2_2_0_3;\n }\n {\n address r_3_2_2_0_4 = 0x1394F327390C838B6BeE8e21940a6A44ed800463;\n r_3_2_2_0.s_4 = r_3_2_2_0_4;\n }\n r_3_2_2[0] = r_3_2_2_0;\n }\n {\n S_644e90dd memory r_3_2_2_1;\n {\n int104[4] memory r_3_2_2_1_0;\n {\n int104 r_3_2_2_1_0_0 = -791236597442537990931814752485;\n r_3_2_2_1_0[0] = r_3_2_2_1_0_0;\n }\n {\n int104 r_3_2_2_1_0_1 = 4914840373755983307267010724018;\n r_3_2_2_1_0[1] = r_3_2_2_1_0_1;\n }\n {\n int104 r_3_2_2_1_0_2 = -7126416071102534009490142543381;\n r_3_2_2_1_0[2] = r_3_2_2_1_0_2;\n }\n {\n int104 r_3_2_2_1_0_3 = -4891088028924601649376546604290;\n r_3_2_2_1_0[3] = r_3_2_2_1_0_3;\n }\n r_3_2_2_1.s_0 = r_3_2_2_1_0;\n }\n {\n address r_3_2_2_1_1 = 0x193855C9EB73080C96550Cd235E41669193371a3;\n r_3_2_2_1.s_1 = r_3_2_2_1_1;\n }\n {\n string memory r_3_2_2_1_2 = unicode\"Moo é🚀🚀MoéoéMoMéM🚀M🚀🚀 o\";\n r_3_2_2_1.s_2 = r_3_2_2_1_2;\n }\n {\n bool r_3_2_2_1_3 = false;\n r_3_2_2_1.s_3 = r_3_2_2_1_3;\n }\n {\n address r_3_2_2_1_4 = 0xD290058A48b14ff6353b32f674d0ce59189CAb85;\n r_3_2_2_1.s_4 = r_3_2_2_1_4;\n }\n r_3_2_2[1] = r_3_2_2_1;\n }\n {\n S_644e90dd memory r_3_2_2_2;\n {\n int104[4] memory r_3_2_2_2_0;\n {\n int104 r_3_2_2_2_0_0 = -2947173121615078237433737900747;\n r_3_2_2_2_0[0] = r_3_2_2_2_0_0;\n }\n {\n int104 r_3_2_2_2_0_1 = 2538678727486459955635145404773;\n r_3_2_2_2_0[1] = r_3_2_2_2_0_1;\n }\n {\n int104 r_3_2_2_2_0_2 = -2244139134378110706833632752394;\n r_3_2_2_2_0[2] = r_3_2_2_2_0_2;\n }\n {\n int104 r_3_2_2_2_0_3 = 1906538943279207716567008558391;\n r_3_2_2_2_0[3] = r_3_2_2_2_0_3;\n }\n r_3_2_2_2.s_0 = r_3_2_2_2_0;\n }\n {\n address r_3_2_2_2_1 = 0x3A0A785A4ce48F22E736D0B822f41f8E8C57Ac1E;\n r_3_2_2_2.s_1 = r_3_2_2_2_1;\n }\n {\n string memory r_3_2_2_2_2 = unicode\"Moo é🚀éo\";\n r_3_2_2_2.s_2 = r_3_2_2_2_2;\n }\n {\n bool r_3_2_2_2_3 = true;\n r_3_2_2_2.s_3 = r_3_2_2_2_3;\n }\n {\n address r_3_2_2_2_4 = 0xC768F45520158e9b6E160221642B699B2b01E69E;\n r_3_2_2_2.s_4 = r_3_2_2_2_4;\n }\n r_3_2_2[2] = r_3_2_2_2;\n }\n r_3_2[2] = r_3_2_2;\n }\n {\n S_644e90dd[3] memory r_3_2_3;\n {\n S_644e90dd memory r_3_2_3_0;\n {\n int104[4] memory r_3_2_3_0_0;\n {\n int104 r_3_2_3_0_0_0 = -8476296552097094217835189363703;\n r_3_2_3_0_0[0] = r_3_2_3_0_0_0;\n }\n {\n int104 r_3_2_3_0_0_1 = 6803076381013793203589571143330;\n r_3_2_3_0_0[1] = r_3_2_3_0_0_1;\n }\n {\n int104 r_3_2_3_0_0_2 = 9621124440692406663026919583497;\n r_3_2_3_0_0[2] = r_3_2_3_0_0_2;\n }\n {\n int104 r_3_2_3_0_0_3 = -8939111491535559169016930193876;\n r_3_2_3_0_0[3] = r_3_2_3_0_0_3;\n }\n r_3_2_3_0.s_0 = r_3_2_3_0_0;\n }\n {\n address r_3_2_3_0_1 = 0xEDA383fD7c62109168d6EA17FeD2CA220DD60d68;\n r_3_2_3_0.s_1 = r_3_2_3_0_1;\n }\n {\n string memory r_3_2_3_0_2 = unicode\"Moo é🚀MoM 🚀éMooo🚀oéo🚀🚀🚀 \";\n r_3_2_3_0.s_2 = r_3_2_3_0_2;\n }\n {\n bool r_3_2_3_0_3 = false;\n r_3_2_3_0.s_3 = r_3_2_3_0_3;\n }\n {\n address r_3_2_3_0_4 = 0x24601f97F20C6A30eD6f60dF733d53820B34EFe8;\n r_3_2_3_0.s_4 = r_3_2_3_0_4;\n }\n r_3_2_3[0] = r_3_2_3_0;\n }\n {\n S_644e90dd memory r_3_2_3_1;\n {\n int104[4] memory r_3_2_3_1_0;\n {\n int104 r_3_2_3_1_0_0 = -6854076920828393069582040199753;\n r_3_2_3_1_0[0] = r_3_2_3_1_0_0;\n }\n {\n int104 r_3_2_3_1_0_1 = 5982016531878963269214073646673;\n r_3_2_3_1_0[1] = r_3_2_3_1_0_1;\n }\n {\n int104 r_3_2_3_1_0_2 = -2357231073712344983910852459304;\n r_3_2_3_1_0[2] = r_3_2_3_1_0_2;\n }\n {\n int104 r_3_2_3_1_0_3 = -9314037810611913904280499603259;\n r_3_2_3_1_0[3] = r_3_2_3_1_0_3;\n }\n r_3_2_3_1.s_0 = r_3_2_3_1_0;\n }\n {\n address r_3_2_3_1_1 = 0x246faEda159EAe57552b58a2e2653EbddC2a2d6f;\n r_3_2_3_1.s_1 = r_3_2_3_1_1;\n }\n {\n string memory r_3_2_3_1_2 = unicode\"Moo é🚀MMé🚀o oééMMoooo🚀M🚀oo🚀MoéoMoMo🚀🚀o éo\";\n r_3_2_3_1.s_2 = r_3_2_3_1_2;\n }\n {\n bool r_3_2_3_1_3 = false;\n r_3_2_3_1.s_3 = r_3_2_3_1_3;\n }\n {\n address r_3_2_3_1_4 = 0x63eDD3691A40B8e62a1D48e12417bE97636385A3;\n r_3_2_3_1.s_4 = r_3_2_3_1_4;\n }\n r_3_2_3[1] = r_3_2_3_1;\n }\n {\n S_644e90dd memory r_3_2_3_2;\n {\n int104[4] memory r_3_2_3_2_0;\n {\n int104 r_3_2_3_2_0_0 = -4599056693394174449082647137941;\n r_3_2_3_2_0[0] = r_3_2_3_2_0_0;\n }\n {\n int104 r_3_2_3_2_0_1 = -9231406732178550736626676271382;\n r_3_2_3_2_0[1] = r_3_2_3_2_0_1;\n }\n {\n int104 r_3_2_3_2_0_2 = 895981846438197924265809498429;\n r_3_2_3_2_0[2] = r_3_2_3_2_0_2;\n }\n {\n int104 r_3_2_3_2_0_3 = -1721109792104042131652308771101;\n r_3_2_3_2_0[3] = r_3_2_3_2_0_3;\n }\n r_3_2_3_2.s_0 = r_3_2_3_2_0;\n }\n {\n address r_3_2_3_2_1 = 0x7Fc0cD50a7c9ac812fE52C9859edE2C7195E0979;\n r_3_2_3_2.s_1 = r_3_2_3_2_1;\n }\n {\n string memory r_3_2_3_2_2 = unicode\"Moo é🚀oé oéo éooM ooMoo 🚀éé oM🚀 éé 🚀oéM oéo🚀o🚀oooéoo o🚀o 🚀 MooM\";\n r_3_2_3_2.s_2 = r_3_2_3_2_2;\n }\n {\n bool r_3_2_3_2_3 = true;\n r_3_2_3_2.s_3 = r_3_2_3_2_3;\n }\n {\n address r_3_2_3_2_4 = 0xfaa39c63dd1c648e26D04a393138F44B9bA01372;\n r_3_2_3_2.s_4 = r_3_2_3_2_4;\n }\n r_3_2_3[2] = r_3_2_3_2;\n }\n r_3_2[3] = r_3_2_3;\n }\n r_3.s_2 = r_3_2;\n }\n r.s_3 = r_3;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000001cd9a50f3300f584bfe9324937e7cbdbf3b7e96dea09de51d784f5ffffffffffb48337bd4b186f0df9c495af13f4b3cbba6e37c489367674937034ffffffffffa99460d45281af2b192a133f3212aa819bbef5858d51d76aa16b05000000000043592ad407e80d17f6ca49091fdee3efbe0920a6a71c3ab7c2ce6400000000001d4702a0cc6c46bc39146c6e067851848a3f3c90a0571ee294da52ffffffffffead88a92e591b87e7ed199636a402876a85357eace39abe53339aeffffffffffbb0d6a549176a7885f4bd84e093cb3a87b802df72b90a36470748d000000000073d0b55fbdf967bcf1da4508ec567679e0446096b9c7e1db78d799ffffffffffdfe7b59f688c816598e512871f4e6f02ac6556989e5122558aa33400000000003f128df90418590312a67cb2e08f83078026553585a8ba00a3517400000000001f567a8cbe096b68821b5ab29fd7f5be22dcadba0e63fc2f35fd1affffffffffbc42febaf31df2cec887ef01fd46fed59d72119489610184b5f9fc0000c844e84c2dc212eafa92b52c85462d33cb9b4ae163263c1483ead8227b0500000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000001a3dcebb6f25d479747d3705c5c0229dfb507bd8b74d28d4650ef0c7473fb124000f9e7f5200000000000000000000000000000eb6053e207bb350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234d6f6f20c3a9f09f9a80f09f9a806f6ff09f9a806fc3a920c3a96ff09f9a804d20c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000f64f8235acafab58e0f9c103edd1f547f58982a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006f4d6f6f20c3a9f09f9a80c3a94df09f9a806ff09f9a80204d6ff09f9a806f6ff09f9a804dc3a9f09f9a804dc3a9f09f9a804d4d6f6f20f09f9a806f204d6ff09f9a80f09f9a806f20f09f9a806f4df09f9a804d20f09f9a80c3a96f6ff09f9a80206f4d4d4d2020204d206ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004072c5695695b2422f1977ab9d3a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a804d4d20f09f9a804d4dc3a96f4df09f9a80204d206fc3a96fc3a920c3a96fc3a94d20f09f9a80c3a96f206f4d4dc3a94dc3a94d200000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000da0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000300ffffffffffffffffffffffffffffffffffffffbff4160822c917bea5bc537bfaffffffffffffffffffffffffffffffffffffffbf261f9bfd82d88cfd33bd38e4ffffffffffffffffffffffffffffffffffffffa05bdfdaa46d0d34f0dc90f31d00000000000000000000000000000000000000735f02b4f9d400a8dea3c804110000000000000000000000009afc5f78e9f61f3f3feecb5e4cef2335bffdb218000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005cf69d07918c6b7f830c51af2ba5b398ce92601700000000000000000000000000000000000000000000000000000000000000384d6f6f20c3a9f09f9a806f6ff09f9a806f6ff09f9a80206f6f2020c3a9f09f9a80204dc3a96f6fc3a9c3a9f09f9a80206f6f204df09f9a800000000000000000ffffffffffffffffffffffffffffffffffffffddc510da6eab4c9f7f3e02c65b000000000000000000000000000000000000005b7d21242c917edb1a15231b2effffffffffffffffffffffffffffffffffffffaf0a00db98c2159ee333bd64b40000000000000000000000000000000000000023a05cc8f7f2275812af0e7878000000000000000000000000965db25c87606fa31c27763a4a981dbeb5ceec1d00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a56d0ccb57e38a06290e5d55e83f071b91cdba6a000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a804d6f6fc3a94d4df09f9a80c3a9204d6fc3a900000000000000000000000000000000000000000000005200dbc8cff98861a1985df43600000000000000000000000000000000000000292f395b76aee1cd2f72bdd129ffffffffffffffffffffffffffffffffffffff8c87fdfeff2859d6ddea8ef5d3ffffffffffffffffffffffffffffffffffffffed2fd8cbfe2a53feb6aa480b5c000000000000000000000000fdf5d03ff3734db79e18d2d98b7c6a002d9dc1d500000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0b127b3c8a4ae57823613659be13873d20e84cd00000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a806f6ff09f9a804dc3a920200000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000002ffdba7186e0e9b8e07dece474ffffffffffffffffffffffffffffffffffffffcd791e363e75cabc8dddc68e420000000000000000000000000000000000000043e9c063e0ea7dc47cff74199e00000000000000000000000000000000000000478cd0714bd3cda0857d004b3300000000000000000000000092edf1b8cee54de67a14096371859e89ed611a5000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d66f05fc5111f0bfdfeffe948fea5783de6ea4ae000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80f09f9a8020c3a96ff09f9a806fc3a9c3a94d6fc3a9c3a9c3a94d20c3a9f09f9a806f4d6f6f20c3a96f6f6fc3a920c3a9f09f9a80c3a96f20f09f9a806f6f6fc3a94d4d6f20f09f9a80204df09f9a80c3a96fc3a90000fffffffffffffffffffffffffffffffffffffff8d47e0e6308f1ba45f5a21702000000000000000000000000000000000000007b4b8054ad0df17669758608ddfffffffffffffffffffffffffffffffffffffff86503a9fb1924e0293d64fc4dffffffffffffffffffffffffffffffffffffffa1d8cd0ff0492183e1e13a8a60000000000000000000000000c66d9d123fe8b514c83827cecddde250d9e263fd000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cfad9d2cb54fdd0e8d9a78c6b007029e6e57b10000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a806fc3a96f6f4d6f4d204d204d6f204dc3a96f6fc3a96ff09f9a804d6f204d20206f206ff09f9a80c3a96f6f6f6f6f6ff09f9a80c3a96f6f20f09f9a80c3a96fc3a96f6ff09f9a806fc3a94d4dc3a96f6f200000000000000000000000000000000000000000000000000823839683bdd772f5323c6d6f0000000000000000000000000000000000000000037123c9b703335df2eb55deffffffffffffffffffffffffffffffffffffffb40a23bab65c8450afe3a66396ffffffffffffffffffffffffffffffffffffffb1051a8d567b46649e7aeb1e1900000000000000000000000073f90f8eab1502aa5d257a5391f391dd806df4d800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b21ed17de2f0563a22d4b0c4c1b7fb2a8c1e9cf1000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000300ffffffffffffffffffffffffffffffffffffffe0936436d15ec378bdc1c35791ffffffffffffffffffffffffffffffffffffffb655e28f705416953440e86151ffffffffffffffffffffffffffffffffffffffa51e575733e7f4ede3f5b95218ffffffffffffffffffffffffffffffffffffffc367acca6071dcd5dad23aca72000000000000000000000000ba407c054ea4479895a37d904cda3d66cd226d60000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001394f327390c838b6bee8e21940a6a44ed800463000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a804df09f9a806f4df09f9a80c3a9c3a96f6f6f00000000fffffffffffffffffffffffffffffffffffffff603606d392359d4389f04df1b000000000000000000000000000000000000003e08b4abc449086ab9864800b2ffffffffffffffffffffffffffffffffffffffa60d4ec9fbc0403235b125c1ebffffffffffffffffffffffffffffffffffffffc2440acee51aeb93ac112abafe000000000000000000000000193855c9eb73080c96550cd235e41669193371a300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d290058a48b14ff6353b32f674d0ce59189cab85000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a80f09f9a804d6fc3a96fc3a94d6f4dc3a94df09f9a804df09f9a80f09f9a80206f00000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffdacd2b882eb3cb45a2120e0d3500000000000000000000000000000000000000200ae9d32b2d83865e0b7ff165ffffffffffffffffffffffffffffffffffffffe3accb9dbd602a9af8eeb48cf60000000000000000000000000000000000000018105c0d0b93a59fa425de3d370000000000000000000000003a0a785a4ce48f22e736d0b822f41f8e8c57ac1e00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c768f45520158e9b6e160221642b699b2b01e69e000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a80c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000340ffffffffffffffffffffffffffffffffffffff95039bd36b3f3a8552cc241c090000000000000000000000000000000000000055ddece359ffb796272727e6a200000000000000000000000000000000000000796f879bb99ac3ffaa7023af09ffffffffffffffffffffffffffffffffffffff8f2c2c47df59b6a9074a9cae2c000000000000000000000000eda383fd7c62109168d6ea17fed2ca220dd60d680000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024601f97f20c6a30ed6f60df733d53820b34efe8000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a804d6f4d20f09f9a80c3a94d6f6f6ff09f9a806fc3a96ff09f9a80f09f9a80f09f9a802000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffa97d487442c145e7eb840b8db7000000000000000000000000000000000000004b80f019615e65a3e33ec5ee51ffffffffffffffffffffffffffffffffffffffe23f602811897012afa3aa04d8ffffffffffffffffffffffffffffffffffffff8a70b87f9c1f1fffc22330b8c5000000000000000000000000246faeda159eae57552b58a2e2653ebddc2a2d6f0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063edd3691a40b8e62a1d48e12417be97636385a300000000000000000000000000000000000000000000000000000000000000444d6f6f20c3a9f09f9a804d4dc3a9f09f9a806f206fc3a9c3a94d4d6f6f6f6ff09f9a804df09f9a806f6ff09f9a804d6fc3a96f4d6f4d6ff09f9a80f09f9a806f20c3a96f00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffc5f3a57799e6db08317664b16bffffffffffffffffffffffffffffffffffffff8b7bb75315bc366432d721f6ea000000000000000000000000000000000000000b4f12d004cb1ba5e15ad9513dffffffffffffffffffffffffffffffffffffffea46cb590fbc7321b651b5dee30000000000000000000000007fc0cd50a7c9ac812fe52c9859ede2c7195e097900000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000faa39c63dd1c648e26d04a393138f44b9ba0137200000000000000000000000000000000000000000000000000000000000000624d6f6f20c3a9f09f9a806fc3a9206fc3a96f20c3a96f6f4d206f6f4d6f6f20f09f9a80c3a9c3a9206f4df09f9a8020c3a9c3a920f09f9a806fc3a94d206fc3a96ff09f9a806ff09f9a806f6f6fc3a96f6f206ff09f9a806f20f09f9a80204d6f6f4d000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-(string,bytes11,bool,((bytes28,string,bytes5,bytes23),bool,((bytes20,(address,int168,(string,bytes12),string[],string)[1],string[2][4],bool[4],address),(bytes29,bytes20),address[4],string[][1]),bool,(bytes2,(bytes29,string,(bool)),string)),bool)", + "type": "(string,bytes11,bool,((bytes28,string,bytes5,bytes23),bool,((bytes20,(address,int168,(string,bytes12),string[],string)[1],string[2][4],bool[4],address),(bytes29,bytes20),address[4],string[][1]),bool,(bytes2,(bytes29,string,(bool)),string)),bool)", + "value": [ + "Moo é🚀oo", + "0xed6276b0e1137444bde71d", + true, + [ + [ + "0x4b03a656f7c0cea1dfd46d09e1ea795d55d0fa03e723b13be7285230", + "Moo é🚀éoM MMéoM🚀🚀oo🚀o o🚀éM oéMoMMé🚀🚀é🚀o🚀", + "0x1a1154eee0", + "0x841ea74d155e6a8be0531b6f1ada8db847e4e5cd42bea6" + ], + false, + [ + [ + "0x2585e35dca606d071bb79ee874f40a1eb77fd22d", + [ + [ + "0x1509AdB1c7ef0EC3D319A38632dB1Ee84903023b", + "-183729731541987963656296707929168285773664531960233", + [ + "Moo é🚀 ooé🚀🚀o🚀éé o🚀 ééooM🚀o", + "0x8e5a3b7cee6da5c957d11da8" + ], + [], + "Moo é🚀" + ] + ], + [ + ["Moo é🚀🚀ooooo o ooo 🚀o", "Moo é🚀oMo"], + [ + "Moo é🚀o éM🚀oééé🚀🚀ooMé🚀o o🚀🚀 o oM🚀 oo🚀o🚀M é 🚀Mooo🚀oMéMMéooé M", + "Moo é🚀 🚀 éoMé MoéoéoééoM🚀 éé🚀o M🚀oééoé🚀Méo🚀é🚀éoMéo" + ], + ["Moo é🚀", "Moo é🚀"], + [ + "Moo é🚀é🚀🚀o🚀Méoo", + "Moo é🚀M🚀🚀oéoéoM Moééooéo MM éo🚀Moéoo🚀oo 🚀o🚀oMéMM 🚀o🚀oé" + ] + ], + [false, false, true, true], + "0x4b3ffc3f0A77A93d3623c52106f7E825F6A3dF70" + ], + [ + "0x21b015316e7df02843be19c1788677fd96a29080488315a1676e70c17d", + "0x1b03c263d83a01ba4354594ed38be216302ebcfd" + ], + [ + "0x5ed9F862cbC897c207359E2D5885415B3DcDcF06", + "0x5559879070bB52f8Aff90882e103b2Ce52707367", + "0x4C022aCaA177Bc7E8fD3d86D11bf6f60132431aD", + "0xA198fdC31E15BAC7101B4f0499EF24C3de6e9288" + ], + [[]] + ], + false, + [ + "0xaf03", + [ + "0x17da8b0d4e8e39b023b6dea5605cf2472384f752123fb0093bbf3b74da", + "Moo é🚀oo ", + [true] + ], + "Moo é🚀éM🚀é🚀🚀oMooMoo oéMoM🚀Mé🚀🚀M🚀éoéMoMMo M o 🚀Moo" + ] + ], + false + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo" + }, + { + "type": "hexstring", + "value": "0xed6276b0e1137444bde71d" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4b03a656f7c0cea1dfd46d09e1ea795d55d0fa03e723b13be7285230" + }, + { + "type": "string", + "value": "Moo é🚀éoM MMéoM🚀🚀oo🚀o o🚀éM oéMoMMé🚀🚀é🚀o🚀" + }, + { + "type": "hexstring", + "value": "0x1a1154eee0" + }, + { + "type": "hexstring", + "value": "0x841ea74d155e6a8be0531b6f1ada8db847e4e5cd42bea6" + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2585e35dca606d071bb79ee874f40a1eb77fd22d" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x1509AdB1c7ef0EC3D319A38632dB1Ee84903023b" + }, + { + "type": "number", + "value": "-183729731541987963656296707929168285773664531960233" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 ooé🚀🚀o🚀éé o🚀 ééooM🚀o" + }, + { + "type": "hexstring", + "value": "0x8e5a3b7cee6da5c957d11da8" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀ooooo o ooo 🚀o" + }, + { + "type": "string", + "value": "Moo é🚀oMo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o éM🚀oééé🚀🚀ooMé🚀o o🚀🚀 o oM🚀 oo🚀o🚀M é 🚀Mooo🚀oMéMMéooé M" + }, + { + "type": "string", + "value": "Moo é🚀 🚀 éoMé MoéoéoééoM🚀 éé🚀o M🚀oééoé🚀Méo🚀é🚀éoMéo" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀🚀o🚀Méoo" + }, + { + "type": "string", + "value": "Moo é🚀M🚀🚀oéoéoM Moééooéo MM éo🚀Moéoo🚀oo 🚀o🚀oMéMM 🚀o🚀oé" + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x4b3ffc3f0A77A93d3623c52106f7E825F6A3dF70" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x21b015316e7df02843be19c1788677fd96a29080488315a1676e70c17d" + }, + { + "type": "hexstring", + "value": "0x1b03c263d83a01ba4354594ed38be216302ebcfd" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x5ed9F862cbC897c207359E2D5885415B3DcDcF06" + }, + { + "type": "address", + "value": "0x5559879070bB52f8Aff90882e103b2Ce52707367" + }, + { + "type": "address", + "value": "0x4C022aCaA177Bc7E8fD3d86D11bf6f60132431aD" + }, + { + "type": "address", + "value": "0xA198fdC31E15BAC7101B4f0499EF24C3de6e9288" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [] + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xaf03" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x17da8b0d4e8e39b023b6dea5605cf2472384f752123fb0093bbf3b74da" + }, + { + "type": "string", + "value": "Moo é🚀oo " + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀éM🚀é🚀🚀oMooMoo oéMoM🚀Mé🚀🚀M🚀éoéMoMMo M o 🚀Moo" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50610fa1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190610c52565b60405180910390f35b610056610656565b61005e610656565b604080518082018252600c81526b4d6f6f20c3a9f09f9a806f6f60a01b6020808301919091529083526aed6276b0e1137444bde71d60a81b908301526001908201526100a8610697565b60408051608080820183526060602080840182905260008486018190529184018290527f4b03a656f7c0cea1dfd46d09e1ea795d55d0fa03e723b13be72852300000000084528451928301909452604b8083529293909290610f219083013960208084019190915263d08aa77760dd1b60408401527f841ea74d155e6a8be0531b6f1ada8db847e4e5cd42bea60000000000000000006060840152918352506000908201526101556106ec565b61015d61073c565b732585e35dca606d071bb79ee874f40a1eb77fd22d60601b815261017f610771565b6040805160a081018252600080825260208083018281528451808601865260608082528184018590528587019190915280850181905260808501819052731509adb1c7ef0ec3d319a38632db1ee84903023b8552747db68619e441792e8eb98e73e05a72db56dfd6d1a81990915284518086018652818152808301849052855191820190955260358082529394939091610eec908301398252506b11cb476f9dcdb4b92afa23b560a31b6020820152604082015260008060405190808252806020026020018201604052801561026957816020015b60608152602001906001900390816102545790505b5060608301525060408051808201909152600a8152689adede418753e13f3560b71b60208083019190915260808301919091529082528201526102aa6107d1565b6102b26107fe565b604080518082018252601f81527f4d6f6f20c3a9f09f9a80f09f9a806f6f6f6f6f206f206f6f6f20f09f9a806f006020808301919091529083528151808301909252600d82526c4d6f6f20c3a9f09f9a806f4d6f60981b82820152820152815261031a6107fe565b60006040518060a00160405280606b8152602001610d76606b91398252506040805160808101909152605d80825260009190610de160208301396020808401919091528301919091525061036c6107fe565b604080518082018252600a808252689adede418753e13f3560b71b60208084018290529285528351808501855291825281830152908301528201526103af6107fe565b604080518082018252601e81527f4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a806ff09f9a804dc3a96f6f0000602080830191909152908352815160808101909252605b80835260009291610e3e908301396020830152506060820152604082015261041a610825565b60008082526020808301919091526001604080840182905260608085019290925290840192909252734b3ffc3f0a77a93d3623c52106f7e825f6a3df70608084015291835280518082019091527f21b015316e7df02843be19c1788677fd96a29080488315a1676e70c17d0000008152731b03c263d83a01ba4354594ed38be216302ebcfd60601b81830152908201526104b2610825565b735ed9f862cbc897c207359e2d5885415b3dcdcf068152735559879070bb52f8aff90882e103b2ce52707367602080830191909152734c022acaa177bc7e8fd3d86d11bf6f60132431ad60408084019190915273a198fdc31e15bac7101b4f0499ef24c3de6e92886060808501919091528482019390935280518083018252928352805160008082529281019091528161055c565b60608152602001906001900390816105475790505b50825250606082810191909152604083019190915260009082015261057f610843565b61af0360f01b81526105b460408051606080820183526000808352602080840192909252835191820184528152909182015290565b7f17da8b0d4e8e39b023b6dea5605cf2472384f752123fb0093bbf3b74da0000008152604080518082018252600e81526d026b7b79061d4f84fcd4037b790160951b60208083019190915280840191909152815180820183526001815282840152838101929092528051608081019091526053808252600092610e99908301396040830152506080808301919091526060830191909152600090820152919050565b6040518060a001604052806060815260200160006001600160a81b031916815260200160001515815260200161068a610697565b8152600060209091015290565b6040805161012081018252600060a08201818152606060c084015260e083018290526101008301829052825260208201529081016106d36106ec565b8152600060208201526040016106e7610843565b905290565b60405180608001604052806106ff61073c565b8152604080518082018252600080825260208083019190915283015201610724610825565b81526040805160208181019092526060815291015290565b6040805160a081019091526000815260208101610757610771565b81526020016107646107d1565b815260200161068a610825565b60405180602001604052806001905b6040805160a081018252600080825260208083018290528351808501855260608082528183019390935293830193909352808201819052608082015282526000199092019101816107805790505090565b60405180608001604052806004905b6107e86107fe565b8152602001906001900390816107e05790505090565b60405180604001604052806002905b606081526020019060019003908161080d5790505090565b60405180608001604052806004906020820280368337509192915050565b6040805160608101909152600081526020810161088360408051606080820183526000808352602080840192909252835191820184528152909182015290565b8152602001606081525090565b6000815180845260005b818110156108b65760208185018101518683018201520161089a565b818111156108c8576000602083870101525b50601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015610925578284038952610913848351610890565b988501989350908401906001016108fb565b5091979650505050505050565b60008260808101836000805b600481101561099c57848403885282518460408101845b600281101561098357878203835261096e828551610890565b60209485019493909301929150600101610955565b5060209a8b019a9096509490940193505060010161093e565b50919695505050505050565b8060005b60048110156109cd57815115158452602093840193909101906001016109ac565b50505050565b8060005b60048110156109cd5781516001600160a01b03168452602093840193909101906001016109d7565b60008260208082018460005b6001811015610a36578483038852610a248383516108dd565b97840197925090830190600101610a0b565b50909695505050505050565b805161010080845281516bffffffffffffffffffffffff1916848201526020808301516101208601929092526000926102008601929091610220870191855b6001811015610b30576101ff19898503018652815160a060018060a01b0382511686528482015160140b858701526040808301518282890152805182848a0152610ace60e08a0182610890565b918801516001600160a01b03191660c08a015250606084810151898303828b01529193509150610afe83826108dd565b9250505060808083015192508682038188015250610b1c8183610890565b978501979550505090820190600101610a81565b5050604083015187830360ff19016101408901529350610b508285610932565b935060608301519150610b676101608801836109a8565b60808301519250610b846101e08801846001600160a01b03169052565b808601519250610bb581880184805162ffffff191682526020908101516bffffffffffffffffffffffff1916910152565b5050506040830151610bca60608601826109d3565b50606083015184820360e0860152610be282826109ff565b95945050505050565b61ffff60f01b8151168252600060208201516060602085015262ffffff198151166060850152602081015160606080860152610c2a60c0860182610890565b9050604082015151151560a0860152604084015191508481036040860152610be28183610890565b60006020808352835160a082850152610c6e60c0850182610890565b90506affffffffffffffffffffff60a81b828601511660408501526040850151151560608501526060850151601f19858303016080860152805160a0835263ffffffff1981511660a084015283810151608060c0850152610cd3610120850182610890565b60408301516001600160d81b03191660e086015260609092015168ffffffffffffffffff191661010085015250838201518015158585015290604083015194508381036040850152610d258186610a42565b945050506060810151610d3c606084018215159052565b50608081015190508183036080830152610d568382610beb565b925050506080840151610d6d60a085018215159052565b50939250505056fe4d6f6f20c3a9f09f9a806f2020c3a94df09f9a806fc3a9c3a9c3a9f09f9a80f09f9a806f6f4dc3a9f09f9a806f206ff09f9a80f09f9a80206f206f4df09f9a80206f6ff09f9a806ff09f9a804d20c3a920f09f9a804d6f6f6ff09f9a806f4dc3a94d4dc3a96f6fc3a9204d4d6f6f20c3a9f09f9a8020f09f9a802020c3a96f4dc3a920204d6fc3a96fc3a96fc3a9c3a96f4df09f9a802020c3a9c3a9f09f9a806f204df09f9a806fc3a9c3a96fc3a9f09f9a804dc3a96ff09f9a80c3a9f09f9a80c3a96f4dc3a96f4d6f6f20c3a9f09f9a804df09f9a80f09f9a806fc3a96fc3a96f4d204d6fc3a9c3a96f6fc3a96f204d4d20c3a96ff09f9a804d6fc3a96f6ff09f9a806f6f20f09f9a806ff09f9a806f4dc3a94d4d20f09f9a806ff09f9a806fc3a94d6f6f20c3a9f09f9a80c3a94df09f9a80c3a9f09f9a80f09f9a806f4d6f6f4d6f6f206fc3a94d6f4df09f9a804dc3a9f09f9a80f09f9a804df09f9a80c3a96fc3a94d6f4d4d6f204d206f20f09f9a804d6f6f4d6f6f20c3a9f09f9a80206f6fc3a9f09f9a80f09f9a806ff09f9a80c3a9c3a92020206ff09f9a8020c3a9c3a96f6f4df09f9a806f4d6f6f20c3a9f09f9a80c3a96f4d204d4dc3a96f4df09f9a80f09f9a806f6ff09f9a806f20206ff09f9a80c3a94d206fc3a94d6f4d4dc3a9f09f9a80f09f9a80c3a9f09f9a806ff09f9a80a2646970667358221220c35ed6209ffbb9a59b507bed196224bb86186d644cef1c79db85a7ad7253430e64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_024b2fb2 {\n bytes28 s_0;\n string s_1;\n bytes5 s_2;\n bytes23 s_3;\n }\n\n struct S_a5eefb3a {\n string s_0;\n bytes12 s_1;\n }\n\n struct S_bcaabad7 {\n address s_0;\n int168 s_1;\n S_a5eefb3a s_2;\n string[] s_3;\n string s_4;\n }\n\n struct S_968e61a6 {\n bytes20 s_0;\n S_bcaabad7[1] s_1;\n string[2][4] s_2;\n bool[4] s_3;\n address s_4;\n }\n\n struct S_f628b69f {\n bytes29 s_0;\n bytes20 s_1;\n }\n\n struct S_6cac2ef6 {\n S_968e61a6 s_0;\n S_f628b69f s_1;\n address[4] s_2;\n string[][1] s_3;\n }\n\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_5dbb2930 {\n bytes29 s_0;\n string s_1;\n S_c1053bda s_2;\n }\n\n struct S_a31119da {\n bytes2 s_0;\n S_5dbb2930 s_1;\n string s_2;\n }\n\n struct S_935276b3 {\n S_024b2fb2 s_0;\n bool s_1;\n S_6cac2ef6 s_2;\n bool s_3;\n S_a31119da s_4;\n }\n\n struct S_1c73d6ad {\n string s_0;\n bytes11 s_1;\n bool s_2;\n S_935276b3 s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_1c73d6ad memory) {\n S_1c73d6ad memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oo\";\n r.s_0 = r_0;\n }\n {\n bytes11 r_1 = bytes11(0xed6276b0e1137444bde71d);\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n S_935276b3 memory r_3;\n {\n S_024b2fb2 memory r_3_0;\n {\n bytes28 r_3_0_0 = bytes28(0x4b03a656f7c0cea1dfd46d09e1ea795d55d0fa03e723b13be7285230);\n r_3_0.s_0 = r_3_0_0;\n }\n {\n string memory r_3_0_1 = unicode\"Moo é🚀éoM MMéoM🚀🚀oo🚀o o🚀éM oéMoMMé🚀🚀é🚀o🚀\";\n r_3_0.s_1 = r_3_0_1;\n }\n {\n bytes5 r_3_0_2 = bytes5(0x1a1154eee0);\n r_3_0.s_2 = r_3_0_2;\n }\n {\n bytes23 r_3_0_3 = bytes23(0x841ea74d155e6a8be0531b6f1ada8db847e4e5cd42bea6);\n r_3_0.s_3 = r_3_0_3;\n }\n r_3.s_0 = r_3_0;\n }\n {\n bool r_3_1 = false;\n r_3.s_1 = r_3_1;\n }\n {\n S_6cac2ef6 memory r_3_2;\n {\n S_968e61a6 memory r_3_2_0;\n {\n bytes20 r_3_2_0_0 = bytes20(0x2585E35dcA606d071Bb79eE874f40a1Eb77fd22D);\n r_3_2_0.s_0 = r_3_2_0_0;\n }\n {\n S_bcaabad7[1] memory r_3_2_0_1;\n {\n S_bcaabad7 memory r_3_2_0_1_0;\n {\n address r_3_2_0_1_0_0 = 0x1509AdB1c7ef0EC3D319A38632dB1Ee84903023b;\n r_3_2_0_1_0.s_0 = r_3_2_0_1_0_0;\n }\n {\n int168 r_3_2_0_1_0_1 = -183729731541987963656296707929168285773664531960233;\n r_3_2_0_1_0.s_1 = r_3_2_0_1_0_1;\n }\n {\n S_a5eefb3a memory r_3_2_0_1_0_2;\n {\n string memory r_3_2_0_1_0_2_0 = unicode\"Moo é🚀 ooé🚀🚀o🚀éé o🚀 ééooM🚀o\";\n r_3_2_0_1_0_2.s_0 = r_3_2_0_1_0_2_0;\n }\n {\n bytes12 r_3_2_0_1_0_2_1 = bytes12(0x8e5a3b7cee6da5c957d11da8);\n r_3_2_0_1_0_2.s_1 = r_3_2_0_1_0_2_1;\n }\n r_3_2_0_1_0.s_2 = r_3_2_0_1_0_2;\n }\n {\n string[] memory r_3_2_0_1_0_3 = new string[](0);\n r_3_2_0_1_0.s_3 = r_3_2_0_1_0_3;\n }\n {\n string memory r_3_2_0_1_0_4 = unicode\"Moo é🚀\";\n r_3_2_0_1_0.s_4 = r_3_2_0_1_0_4;\n }\n r_3_2_0_1[0] = r_3_2_0_1_0;\n }\n r_3_2_0.s_1 = r_3_2_0_1;\n }\n {\n string[2][4] memory r_3_2_0_2;\n {\n string[2] memory r_3_2_0_2_0;\n {\n string memory r_3_2_0_2_0_0 = unicode\"Moo é🚀🚀ooooo o ooo 🚀o\";\n r_3_2_0_2_0[0] = r_3_2_0_2_0_0;\n }\n {\n string memory r_3_2_0_2_0_1 = unicode\"Moo é🚀oMo\";\n r_3_2_0_2_0[1] = r_3_2_0_2_0_1;\n }\n r_3_2_0_2[0] = r_3_2_0_2_0;\n }\n {\n string[2] memory r_3_2_0_2_1;\n {\n string memory r_3_2_0_2_1_0 = unicode\"Moo é🚀o éM🚀oééé🚀🚀ooMé🚀o o🚀🚀 o oM🚀 oo🚀o🚀M é 🚀Mooo🚀oMéMMéooé M\";\n r_3_2_0_2_1[0] = r_3_2_0_2_1_0;\n }\n {\n string memory r_3_2_0_2_1_1 = unicode\"Moo é🚀 🚀 éoMé MoéoéoééoM🚀 éé🚀o M🚀oééoé🚀Méo🚀é🚀éoMéo\";\n r_3_2_0_2_1[1] = r_3_2_0_2_1_1;\n }\n r_3_2_0_2[1] = r_3_2_0_2_1;\n }\n {\n string[2] memory r_3_2_0_2_2;\n {\n string memory r_3_2_0_2_2_0 = unicode\"Moo é🚀\";\n r_3_2_0_2_2[0] = r_3_2_0_2_2_0;\n }\n {\n string memory r_3_2_0_2_2_1 = unicode\"Moo é🚀\";\n r_3_2_0_2_2[1] = r_3_2_0_2_2_1;\n }\n r_3_2_0_2[2] = r_3_2_0_2_2;\n }\n {\n string[2] memory r_3_2_0_2_3;\n {\n string memory r_3_2_0_2_3_0 = unicode\"Moo é🚀é🚀🚀o🚀Méoo\";\n r_3_2_0_2_3[0] = r_3_2_0_2_3_0;\n }\n {\n string memory r_3_2_0_2_3_1 = unicode\"Moo é🚀M🚀🚀oéoéoM Moééooéo MM éo🚀Moéoo🚀oo 🚀o🚀oMéMM 🚀o🚀oé\";\n r_3_2_0_2_3[1] = r_3_2_0_2_3_1;\n }\n r_3_2_0_2[3] = r_3_2_0_2_3;\n }\n r_3_2_0.s_2 = r_3_2_0_2;\n }\n {\n bool[4] memory r_3_2_0_3;\n {\n bool r_3_2_0_3_0 = false;\n r_3_2_0_3[0] = r_3_2_0_3_0;\n }\n {\n bool r_3_2_0_3_1 = false;\n r_3_2_0_3[1] = r_3_2_0_3_1;\n }\n {\n bool r_3_2_0_3_2 = true;\n r_3_2_0_3[2] = r_3_2_0_3_2;\n }\n {\n bool r_3_2_0_3_3 = true;\n r_3_2_0_3[3] = r_3_2_0_3_3;\n }\n r_3_2_0.s_3 = r_3_2_0_3;\n }\n {\n address r_3_2_0_4 = 0x4b3ffc3f0A77A93d3623c52106f7E825F6A3dF70;\n r_3_2_0.s_4 = r_3_2_0_4;\n }\n r_3_2.s_0 = r_3_2_0;\n }\n {\n S_f628b69f memory r_3_2_1;\n {\n bytes29 r_3_2_1_0 = bytes29(0x21b015316e7df02843be19c1788677fd96a29080488315a1676e70c17d);\n r_3_2_1.s_0 = r_3_2_1_0;\n }\n {\n bytes20 r_3_2_1_1 = bytes20(0x1b03C263D83A01bA4354594Ed38BE216302EbcfD);\n r_3_2_1.s_1 = r_3_2_1_1;\n }\n r_3_2.s_1 = r_3_2_1;\n }\n {\n address[4] memory r_3_2_2;\n {\n address r_3_2_2_0 = 0x5ed9F862cbC897c207359E2D5885415B3DcDcF06;\n r_3_2_2[0] = r_3_2_2_0;\n }\n {\n address r_3_2_2_1 = 0x5559879070bB52f8Aff90882e103b2Ce52707367;\n r_3_2_2[1] = r_3_2_2_1;\n }\n {\n address r_3_2_2_2 = 0x4C022aCaA177Bc7E8fD3d86D11bf6f60132431aD;\n r_3_2_2[2] = r_3_2_2_2;\n }\n {\n address r_3_2_2_3 = 0xA198fdC31E15BAC7101B4f0499EF24C3de6e9288;\n r_3_2_2[3] = r_3_2_2_3;\n }\n r_3_2.s_2 = r_3_2_2;\n }\n {\n string[][1] memory r_3_2_3;\n {\n string[] memory r_3_2_3_0 = new string[](0);\n r_3_2_3[0] = r_3_2_3_0;\n }\n r_3_2.s_3 = r_3_2_3;\n }\n r_3.s_2 = r_3_2;\n }\n {\n bool r_3_3 = false;\n r_3.s_3 = r_3_3;\n }\n {\n S_a31119da memory r_3_4;\n {\n bytes2 r_3_4_0 = bytes2(0xaf03);\n r_3_4.s_0 = r_3_4_0;\n }\n {\n S_5dbb2930 memory r_3_4_1;\n {\n bytes29 r_3_4_1_0 = bytes29(0x17da8b0d4e8e39b023b6dea5605cf2472384f752123fb0093bbf3b74da);\n r_3_4_1.s_0 = r_3_4_1_0;\n }\n {\n string memory r_3_4_1_1 = unicode\"Moo é🚀oo \";\n r_3_4_1.s_1 = r_3_4_1_1;\n }\n {\n S_c1053bda memory r_3_4_1_2;\n {\n bool r_3_4_1_2_0 = true;\n r_3_4_1_2.s_0 = r_3_4_1_2_0;\n }\n r_3_4_1.s_2 = r_3_4_1_2;\n }\n r_3_4.s_1 = r_3_4_1;\n }\n {\n string memory r_3_4_2 = unicode\"Moo é🚀éM🚀é🚀🚀oMooMoo oéMoM🚀Mé🚀🚀M🚀éoéMoMMo M o 🚀Moo\";\n r_3_4.s_2 = r_3_4_2;\n }\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n {\n bool r_4 = false;\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0ed6276b0e1137444bde71d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d6f6f20c3a9f09f9a806f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a004b03a656f7c0cea1dfd46d09e1ea795d55d0fa03e723b13be72852300000000000000000000000000000000000000000000000000000000000000000000000801a1154eee0000000000000000000000000000000000000000000000000000000841ea74d155e6a8be0531b6f1ada8db847e4e5cd42bea6000000000000000000000000000000000000000000000000000000000000000000000000000000004b4d6f6f20c3a9f09f9a80c3a96f4d204d4dc3a96f4df09f9a80f09f9a806f6ff09f9a806f20206ff09f9a80c3a94d206fc3a94d6f4d4dc3a9f09f9a80f09f9a80c3a9f09f9a806ff09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010021b015316e7df02843be19c1788677fd96a29080488315a1676e70c17d0000001b03c263d83a01ba4354594ed38be216302ebcfd0000000000000000000000000000000000000000000000005ed9f862cbc897c207359e2d5885415b3dcdcf060000000000000000000000005559879070bb52f8aff90882e103b2ce527073670000000000000000000000004c022acaa177bc7e8fd3d86d11bf6f60132431ad000000000000000000000000a198fdc31e15bac7101b4f0499ef24c3de6e928800000000000000000000000000000000000000000000000000000000000008202585e35dca606d071bb79ee874f40a1eb77fd22d000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000004b3ffc3f0a77a93d3623c52106f7e825f6a3df7000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001509adb1c7ef0ec3d319a38632db1ee84903023bffffffffffffffffffffff824979e61bbe86d17146718c1fa58d24a920292e5700000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000408e5a3b7cee6da5c957d11da8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000354d6f6f20c3a9f09f9a80206f6fc3a9f09f9a80f09f9a806ff09f9a80c3a9c3a92020206ff09f9a8020c3a9c3a96f6f4df09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001f4d6f6f20c3a9f09f9a80f09f9a806f6f6f6f6f206f206f6f6f20f09f9a806f00000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a806f4d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006b4d6f6f20c3a9f09f9a806f2020c3a94df09f9a806fc3a9c3a9c3a9f09f9a80f09f9a806f6f4dc3a9f09f9a806f206ff09f9a80f09f9a80206f206f4df09f9a80206f6ff09f9a806ff09f9a804d20c3a920f09f9a804d6f6f6ff09f9a806f4dc3a94d4dc3a96f6fc3a9204d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a8020f09f9a802020c3a96f4dc3a920204d6fc3a96fc3a96fc3a9c3a96f4df09f9a802020c3a9c3a9f09f9a806f204df09f9a806fc3a9c3a96fc3a9f09f9a804dc3a96ff09f9a80c3a9f09f9a80c3a96f4dc3a96f00000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001e4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a806ff09f9a804dc3a96f6f0000000000000000000000000000000000000000000000000000000000000000005b4d6f6f20c3a9f09f9a804df09f9a80f09f9a806fc3a96fc3a96f4d204d6fc3a9c3a96f6fc3a96f204d4d20c3a96ff09f9a804d6fc3a96f6ff09f9a806f6f20f09f9a806ff09f9a806f4dc3a94d4d20f09f9a806ff09f9a806fc3a9000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000af030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010017da8b0d4e8e39b023b6dea5605cf2472384f752123fb0093bbf3b74da00000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a806f6f202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a80c3a94df09f9a80c3a9f09f9a80f09f9a806f4d6f6f4d6f6f206fc3a94d6f4df09f9a804dc3a9f09f9a80f09f9a804df09f9a80c3a96fc3a94d6f4d4d6f204d206f20f09f9a804d6f6f00000000000000000000000000" + }, + { + "name": "random-(string,((bool,address,int56[3],uint200,(bytes30,bool,(int192,bool,string,address[]),bool)),bytes22,address,string)[1],bool,(bytes26,string,bytes2,(address,bytes32[3],address,bytes8,(bytes17,int152))[2][4],(address,bytes2,bool,address,address)[1]),(bool))", + "type": "(string,((bool,address,int56[3],uint200,(bytes30,bool,(int192,bool,string,address[]),bool)),bytes22,address,string)[1],bool,(bytes26,string,bytes2,(address,bytes32[3],address,bytes8,(bytes17,int152))[2][4],(address,bytes2,bool,address,address)[1]),(bool))", + "value": [ + "Moo é🚀oo🚀 oo🚀 Mo🚀🚀o oMMéoé", + [ + [ + [ + false, + "0x78a1Fb3d7C3F3420854C36BB10ea7fDea80Ce919", + ["-26883565741535288", "-5141813151494236", "26629360009472432"], + "1603398987769685005722175597858365826291742512076644510389132", + [ + "0x1c6bda95fb3c9136aec682a6bdbcbd963f938455983189608675fd82507d", + false, + [ + "1046737888541635118449059417916377480933733099728971613817", + false, + "Moo é🚀oMMoooMo é🚀o🚀ooo🚀éMMéo éo🚀oM", + [ + "0x755Ed5385a0187438817d1E6Ff618a30039Aa810", + "0xf1B386675381c89B64c5E4A41fd8E6BeA47856fa" + ] + ], + false + ] + ], + "0x7f211f7170792e5b571a01020cd1c834766c35dc3a45", + "0x55ea89c08d94e5f14261F3533c9C613a2732Fb34", + "Moo é🚀oéo Moé 🚀 o oéoéMM 🚀🚀o oM ooMoé🚀éM" + ] + ], + true, + [ + "0x696e5ca8954b0f4a5bdb51c15d7674a47de75a4fdf68dc4167da", + "Moo é🚀o🚀éoé🚀oéM 🚀ooo o oo ééo🚀éMéoMééé o o Mo oéM", + "0xc037", + [ + [ + [ + "0xD624A8878d6EE485120e8286CbDC9cF10abCbb57", + [ + "0x9221edfb9018a888805a3176f013f076e5d938fbc6aa1753c7c674b950e837bd", + "0xdbe12eecdceb7f1f2ae6fce1d03e94756c8ff8c2bbd52679b3f04f77a7eefcf2", + "0x2f19f93379d6f2a20ecee5ad670612a28f27941256f446ca8bcec1a5899e76e5" + ], + "0x9F8e96E3103AB52246e19a66a409Cf616241e3D0", + "0x56089b9c940e63b6", + [ + "0x121a06299c784458456a8c84cc621a8845", + "-208389642673309035464843874223566773254034848" + ] + ], + [ + "0xaf51A9F6504eD1EEB7b8d89B50bAE1de3D3dA1a7", + [ + "0xfc4791965498566b26a3827759f291ed4649973d574a9f2638a17459f077b995", + "0xa5d8d441d4207fbaee9b38e4d8f56f391f173f74174a824d9958120ee9aa95f8", + "0x96214b938c4341ffffdce7c3a3f4f3dc72a5cce3ce235864a1e316d2383d0daa" + ], + "0x0273602393dd20Cf8430D7Af530aB22036884B72", + "0x466cffcab0e7f98b", + [ + "0x5b5a45f9fe5c475413abe5d5c207e79c64", + "-792160833879411119615087435813012984254121891" + ] + ] + ], + [ + [ + "0x89dB1724662CE37034806ef0787d78d17422b451", + [ + "0x11cbdcde8a2c6877d81e06e882d3e7afc12ad98e03ed853656c3cd79c3b55f7c", + "0x2daf348c7df22a81d75b6b1cd940ef4d7d4f556cbb89151e91d04e39d76e6719", + "0x7aca0588010f9e62b2c7486d11fb2ce02bd19c89b730db54317c8c54058632e6" + ], + "0xAe7e4B15C1cda5de9Be87580e7BB13dA1efb7591", + "0xec83ccc6b0f9181f", + [ + "0xb68204261b7d17cf39e2f735584d6ac398", + "-2458936244162674171091113051772615737777316744" + ] + ], + [ + "0x17b3Ec6ab419d1A366914ED57F6A0b665bDA8CE9", + [ + "0xb3a5f462eb343b2ba38c581558e7f397f15556d4fe7a617745c87af34d3395b0", + "0xd1249dde2921894ace13f5bd798507b60cd2d56f39d16bcb4414acd5530568b6", + "0x2ee1f1d9d38e6598dacec663e7335c697d75bc01421c2ba3889e58119da829c1" + ], + "0x962712bAFa7CE3d91BB38012C7C17Acd92Ee34d3", + "0xa03a8d3e0410d3db", + [ + "0xbdfac2f5ea903403eefab3ad3810b20c50", + "2134837106943374995115965611423503188547599690" + ] + ] + ], + [ + [ + "0x54a6DCC5c20704c266A715d5B7616705ab8dd897", + [ + "0x96b4cecb3c9f703fde5eee9300655d04ee4553c0ca2a5a7d5caecadf2f93b7a2", + "0x20cdfdd8cef57177b8c89a6f0b164fdd52366bcdac703e9b3914f22eda46b1e5", + "0x67ed7307bc38b514b6fc42f6b2010dee17e84f26d5616a135a843e38c9d093b1" + ], + "0x2b39D6D2b7cB289E7555fedfc96B1Ed44832028e", + "0x468ad872ecb06be0", + [ + "0xcfb24ecb1873c6d5b3809a0a0b9a747fe6", + "-1304229747494031120009605527412148632595873471" + ] + ], + [ + "0x2b57CB6E95A167d6320DDA76a18fbdB3AB97Fa2f", + [ + "0xc80dbfaa35599759201f588d5dace4955090e23381d6bd5ed49df9012f41088c", + "0x5439259b129fea278ff17c38bd309d3ef636c65dc37e48489bc31812349b5e50", + "0x10a48424fc6a0e695d248ed29b561abc85b144ffbc24bb6621951033722935f0" + ], + "0xf385efe72580AfF0A9A9fAA25d8ddB790A6a2aF1", + "0xea1fc724e4946a4c", + [ + "0xfd5d6177b05f411f08a415077e3ea2db5b", + "1365080883231409609352493687900635060428675967" + ] + ] + ], + [ + [ + "0x8c28208eC8349F8072c06F3567734543b767D82b", + [ + "0xaff17a3901f235911f59ac47a474052d28ac0e0a5f0fce3bd820208925c06aef", + "0xcfd10f8d7206b876cc433cee909c71959b0b8ea10f708f1ce1e71e1debf83e89", + "0xe6b2c205b9db529db6f2ea215116888be992f48b7f5ecf685c650728c88c6702" + ], + "0xd3860eF07A59fd979CE006D29abE07aB8DEf6dEE", + "0x4bc1e3fc814f60df", + [ + "0xecd6702cfd26f29969e3c3f4a6f8a77c1c", + "10514906339889610898406899598658610492202526" + ] + ], + [ + "0x010509c08C65376879f024B408751484c24593b5", + [ + "0xb31de7417722d4032c56c325431843d10e01c902487fd5e6a174ecd1a1896493", + "0xfc81f788a1ad5404a1fc9a2d90eb2a531e94644b3f7abf70f096d127cc58ab2c", + "0x81933afd788a9e6973be5a2450074737eb8f3bccabb3767cc27b424d88e4b4bb" + ], + "0x99366Bd31FC99c72A364f2270243554c89BA3167", + "0x0103eae73c7a9875", + [ + "0xd216c235c08eec4db21c42fc22c20661f2", + "-1643049406207138164756734900448518194410292726" + ] + ] + ] + ], + [ + [ + "0xD770dFc6Ef1676De63f40927840623b8615DB2d3", + "0x2fce", + true, + "0xCB2d87DBF4D6D9a33a0F3FfA5F0a0c84e04d0B04", + "0xd9583D04D45a8062b6217666376DbE55f6E3473f" + ] + ] + ], + [false] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oo🚀 oo🚀 Mo🚀🚀o oMMéoé" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x78a1Fb3d7C3F3420854C36BB10ea7fDea80Ce919" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-26883565741535288" + }, + { + "type": "number", + "value": "-5141813151494236" + }, + { + "type": "number", + "value": "26629360009472432" + } + ] + }, + { + "type": "number", + "value": "1603398987769685005722175597858365826291742512076644510389132" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x1c6bda95fb3c9136aec682a6bdbcbd963f938455983189608675fd82507d" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1046737888541635118449059417916377480933733099728971613817" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oMMoooMo é🚀o🚀ooo🚀éMMéo éo🚀oM" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x755Ed5385a0187438817d1E6Ff618a30039Aa810" + }, + { + "type": "address", + "value": "0xf1B386675381c89B64c5E4A41fd8E6BeA47856fa" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x7f211f7170792e5b571a01020cd1c834766c35dc3a45" + }, + { + "type": "address", + "value": "0x55ea89c08d94e5f14261F3533c9C613a2732Fb34" + }, + { + "type": "string", + "value": "Moo é🚀oéo Moé 🚀 o oéoéMM 🚀🚀o oM ooMoé🚀éM" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x696e5ca8954b0f4a5bdb51c15d7674a47de75a4fdf68dc4167da" + }, + { + "type": "string", + "value": "Moo é🚀o🚀éoé🚀oéM 🚀ooo o oo ééo🚀éMéoMééé o o Mo oéM" + }, + { + "type": "hexstring", + "value": "0xc037" + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD624A8878d6EE485120e8286CbDC9cF10abCbb57" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9221edfb9018a888805a3176f013f076e5d938fbc6aa1753c7c674b950e837bd" + }, + { + "type": "hexstring", + "value": "0xdbe12eecdceb7f1f2ae6fce1d03e94756c8ff8c2bbd52679b3f04f77a7eefcf2" + }, + { + "type": "hexstring", + "value": "0x2f19f93379d6f2a20ecee5ad670612a28f27941256f446ca8bcec1a5899e76e5" + } + ] + }, + { + "type": "address", + "value": "0x9F8e96E3103AB52246e19a66a409Cf616241e3D0" + }, + { + "type": "hexstring", + "value": "0x56089b9c940e63b6" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x121a06299c784458456a8c84cc621a8845" + }, + { + "type": "number", + "value": "-208389642673309035464843874223566773254034848" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xaf51A9F6504eD1EEB7b8d89B50bAE1de3D3dA1a7" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xfc4791965498566b26a3827759f291ed4649973d574a9f2638a17459f077b995" + }, + { + "type": "hexstring", + "value": "0xa5d8d441d4207fbaee9b38e4d8f56f391f173f74174a824d9958120ee9aa95f8" + }, + { + "type": "hexstring", + "value": "0x96214b938c4341ffffdce7c3a3f4f3dc72a5cce3ce235864a1e316d2383d0daa" + } + ] + }, + { + "type": "address", + "value": "0x0273602393dd20Cf8430D7Af530aB22036884B72" + }, + { + "type": "hexstring", + "value": "0x466cffcab0e7f98b" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x5b5a45f9fe5c475413abe5d5c207e79c64" + }, + { + "type": "number", + "value": "-792160833879411119615087435813012984254121891" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x89dB1724662CE37034806ef0787d78d17422b451" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x11cbdcde8a2c6877d81e06e882d3e7afc12ad98e03ed853656c3cd79c3b55f7c" + }, + { + "type": "hexstring", + "value": "0x2daf348c7df22a81d75b6b1cd940ef4d7d4f556cbb89151e91d04e39d76e6719" + }, + { + "type": "hexstring", + "value": "0x7aca0588010f9e62b2c7486d11fb2ce02bd19c89b730db54317c8c54058632e6" + } + ] + }, + { + "type": "address", + "value": "0xAe7e4B15C1cda5de9Be87580e7BB13dA1efb7591" + }, + { + "type": "hexstring", + "value": "0xec83ccc6b0f9181f" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xb68204261b7d17cf39e2f735584d6ac398" + }, + { + "type": "number", + "value": "-2458936244162674171091113051772615737777316744" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x17b3Ec6ab419d1A366914ED57F6A0b665bDA8CE9" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb3a5f462eb343b2ba38c581558e7f397f15556d4fe7a617745c87af34d3395b0" + }, + { + "type": "hexstring", + "value": "0xd1249dde2921894ace13f5bd798507b60cd2d56f39d16bcb4414acd5530568b6" + }, + { + "type": "hexstring", + "value": "0x2ee1f1d9d38e6598dacec663e7335c697d75bc01421c2ba3889e58119da829c1" + } + ] + }, + { + "type": "address", + "value": "0x962712bAFa7CE3d91BB38012C7C17Acd92Ee34d3" + }, + { + "type": "hexstring", + "value": "0xa03a8d3e0410d3db" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xbdfac2f5ea903403eefab3ad3810b20c50" + }, + { + "type": "number", + "value": "2134837106943374995115965611423503188547599690" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x54a6DCC5c20704c266A715d5B7616705ab8dd897" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x96b4cecb3c9f703fde5eee9300655d04ee4553c0ca2a5a7d5caecadf2f93b7a2" + }, + { + "type": "hexstring", + "value": "0x20cdfdd8cef57177b8c89a6f0b164fdd52366bcdac703e9b3914f22eda46b1e5" + }, + { + "type": "hexstring", + "value": "0x67ed7307bc38b514b6fc42f6b2010dee17e84f26d5616a135a843e38c9d093b1" + } + ] + }, + { + "type": "address", + "value": "0x2b39D6D2b7cB289E7555fedfc96B1Ed44832028e" + }, + { + "type": "hexstring", + "value": "0x468ad872ecb06be0" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xcfb24ecb1873c6d5b3809a0a0b9a747fe6" + }, + { + "type": "number", + "value": "-1304229747494031120009605527412148632595873471" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x2b57CB6E95A167d6320DDA76a18fbdB3AB97Fa2f" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xc80dbfaa35599759201f588d5dace4955090e23381d6bd5ed49df9012f41088c" + }, + { + "type": "hexstring", + "value": "0x5439259b129fea278ff17c38bd309d3ef636c65dc37e48489bc31812349b5e50" + }, + { + "type": "hexstring", + "value": "0x10a48424fc6a0e695d248ed29b561abc85b144ffbc24bb6621951033722935f0" + } + ] + }, + { + "type": "address", + "value": "0xf385efe72580AfF0A9A9fAA25d8ddB790A6a2aF1" + }, + { + "type": "hexstring", + "value": "0xea1fc724e4946a4c" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xfd5d6177b05f411f08a415077e3ea2db5b" + }, + { + "type": "number", + "value": "1365080883231409609352493687900635060428675967" + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x8c28208eC8349F8072c06F3567734543b767D82b" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xaff17a3901f235911f59ac47a474052d28ac0e0a5f0fce3bd820208925c06aef" + }, + { + "type": "hexstring", + "value": "0xcfd10f8d7206b876cc433cee909c71959b0b8ea10f708f1ce1e71e1debf83e89" + }, + { + "type": "hexstring", + "value": "0xe6b2c205b9db529db6f2ea215116888be992f48b7f5ecf685c650728c88c6702" + } + ] + }, + { + "type": "address", + "value": "0xd3860eF07A59fd979CE006D29abE07aB8DEf6dEE" + }, + { + "type": "hexstring", + "value": "0x4bc1e3fc814f60df" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xecd6702cfd26f29969e3c3f4a6f8a77c1c" + }, + { + "type": "number", + "value": "10514906339889610898406899598658610492202526" + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0x010509c08C65376879f024B408751484c24593b5" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb31de7417722d4032c56c325431843d10e01c902487fd5e6a174ecd1a1896493" + }, + { + "type": "hexstring", + "value": "0xfc81f788a1ad5404a1fc9a2d90eb2a531e94644b3f7abf70f096d127cc58ab2c" + }, + { + "type": "hexstring", + "value": "0x81933afd788a9e6973be5a2450074737eb8f3bccabb3767cc27b424d88e4b4bb" + } + ] + }, + { + "type": "address", + "value": "0x99366Bd31FC99c72A364f2270243554c89BA3167" + }, + { + "type": "hexstring", + "value": "0x0103eae73c7a9875" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd216c235c08eec4db21c42fc22c20661f2" + }, + { + "type": "number", + "value": "-1643049406207138164756734900448518194410292726" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xD770dFc6Ef1676De63f40927840623b8615DB2d3" + }, + { + "type": "hexstring", + "value": "0x2fce" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xCB2d87DBF4D6D9a33a0F3FfA5F0a0c84e04d0B04" + }, + { + "type": "address", + "value": "0xd9583D04D45a8062b6217666376DbE55f6E3473f" + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611498806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906111df565b60405180910390f35b610056610cc7565b61005e610cc7565b60006040518060600160405280602f81526020016113b2602f9139825250610084610d12565b61008c610d3f565b610094610d6b565b600081527378a1fb3d7c3f3420854c36bb10ea7fdea80ce91960208201526100ba610ddc565b665f8275ea51f03719815266124473aa65705b196020820152665e9b4307f5e9b060408083019190915282015278ff6faa86b55737e78528fc985d81034ad689a45b8ebb88d38c606082015261014c6040805160808082018352600080835260208084018290528451928301855281835282015260608184018190528082015290918201908152600060209091015290565b7f1c6bda95fb3c9136aec682a6bdbcbd963f938455983189608675fd82507d0000815260006020808301829052604080516080810182528083018490526060818301819052808201819052772ab07416d67fd59e68d65c5128e385c98cc6dde4b6bdc6798252825190810190925260368083529093926113e19083013960408381019190915280516002808252606082018352600093509091602083019080368337019050509050600073755ed5385a0187438817d1e6ff618a30039aa810905080826000815181106102215761022161135d565b60200260200101906001600160a01b031690816001600160a01b03168152505050600073f1b386675381c89b64c5e4a41fd8e6bea47856fa9050808260018151811061026f5761026f61135d565b6001600160a01b039092166020928302919091018201526060808501939093526040808601949094526000858401819052608087019590955294865250757f211f7170792e5b571a01020cd1c834766c35dc3a4560501b858501527355ea89c08d94e5f14261f3533c9c613a2732fb34858301528151908101909152603e8082529192909190611374908301396060830152508152602082015260016040820152610318610dfa565b7f696e5ca8954b0f4a5bdb51c15d7674a47de75a4fdf68dc4167da00000000000081526040805160808101909152604c80825260009190611417602083013960208301525061c03760f01b6040820152610370610e2e565b610378610e5b565b610380610e88565b73d624a8878d6ee485120e8286cbdc9cf10abcbb57815261039f610ddc565b7f9221edfb9018a888805a3176f013f076e5d938fbc6aa1753c7c674b950e837bd81527fdbe12eecdceb7f1f2ae6fce1d03e94756c8ff8c2bbd52679b3f04f77a7eefcf26020808301919091527f2f19f93379d6f2a20ecee5ad670612a28f27941256f446ca8bcec1a5899e76e560408084019190915283820192909252739f8e96e3103ab52246e19a66a409cf616241e3d083830152672b044dce4a0731db60c11b6060840152815180830190925270121a06299c784458456a8c84cc621a884560781b8252720958321e8c77dc1977d7d1bcdc4f6a13ab159f19908201526080820152815261048e610e88565b73af51a9f6504ed1eeb7b8d89b50bae1de3d3da1a781526104ad610ddc565b7ffc4791965498566b26a3827759f291ed4649973d574a9f2638a17459f077b99581527fa5d8d441d4207fbaee9b38e4d8f56f391f173f74174a824d9958120ee9aa95f86020808301919091527f96214b938c4341ffffdce7c3a3f4f3dc72a5cce3ce235864a1e316d2383d0daa60408084019190915283820192909252730273602393dd20cf8430d7af530ab22036884b728383015267466cffcab0e7f98b60c01b606084015281518083019092527016d6917e7f9711d504eaf9757081f9e719607a1b82527223858f7681e97d010f5716ef84652ce28b47a21982820152608083019190915282015281526105a2610e5b565b6105aa610e88565b7389db1724662ce37034806ef0787d78d17422b45181526105c9610ddc565b7f11cbdcde8a2c6877d81e06e882d3e7afc12ad98e03ed853656c3cd79c3b55f7c81527f2daf348c7df22a81d75b6b1cd940ef4d7d4f556cbb89151e91d04e39d76e67196020808301919091527f7aca0588010f9e62b2c7486d11fb2ce02bd19c89b730db54317c8c54058632e66040808401919091528382019290925273ae7e4b15c1cda5de9be87580e7bb13da1efb75918383015267ec83ccc6b0f9181f60c01b606084015281518083019092527016d04084c36fa2f9e73c5ee6ab09ad5873607b1b8252726e433428fd32a0d7360ecb82308384d6a3e3871990820152608082015281526106b8610e88565b7317b3ec6ab419d1a366914ed57f6a0b665bda8ce981526106d7610ddc565b7fb3a5f462eb343b2ba38c581558e7f397f15556d4fe7a617745c87af34d3395b081527fd1249dde2921894ace13f5bd798507b60cd2d56f39d16bcb4414acd5530568b66020808301919091527f2ee1f1d9d38e6598dacec663e7335c697d75bc01421c2ba3889e58119da829c16040808401919091528382019290925273962712bafa7ce3d91bb38012c7c17acd92ee34d38383015267a03a8d3e0410d3db60c01b60608401528151808301909252700bdfac2f5ea903403eefab3ad3810b20c5607c1b8252725fbaba65d9204c92179ef888c15e393a6bfd4a828201526080830191909152828101919091528201526107d0610e5b565b6107d8610e88565b7354a6dcc5c20704c266a715d5b7616705ab8dd89781526107f7610ddc565b7f96b4cecb3c9f703fde5eee9300655d04ee4553c0ca2a5a7d5caecadf2f93b7a281527f20cdfdd8cef57177b8c89a6f0b164fdd52366bcdac703e9b3914f22eda46b1e56020808301919091527f67ed7307bc38b514b6fc42f6b2010dee17e84f26d5616a135a843e38c9d093b160408084019190915283820192909252732b39d6d2b7cb289e7555fedfc96b1ed44832028e8383015267023456c39765835f60c51b606084015281518083019092527067d927658c39e36ad9c04d0505cd3a3ff360791b8252723a7bd2c039ef90ae7756e5c768b93548863ebe1990820152608082015281526108e6610e88565b732b57cb6e95a167d6320dda76a18fbdb3ab97fa2f8152610905610ddc565b7fc80dbfaa35599759201f588d5dace4955090e23381d6bd5ed49df9012f41088c81527f5439259b129fea278ff17c38bd309d3ef636c65dc37e48489bc31812349b5e506020808301919091527f10a48424fc6a0e695d248ed29b561abc85b144ffbc24bb6621951033722935f06040808401919091528382019290925273f385efe72580aff0a9a9faa25d8ddb790a6a2af183830152673a87f1c939251a9360c21b60608401528151808301835270fd5d6177b05f411f08a415077e3ea2db5b60781b8152723d365c2aa89841971fc086f8df1e1448991b7f8183015260808401528301919091528201526109f9610e5b565b610a01610e88565b738c28208ec8349f8072c06f3567734543b767d82b8152610a20610ddc565b7faff17a3901f235911f59ac47a474052d28ac0e0a5f0fce3bd820208925c06aef81527fcfd10f8d7206b876cc433cee909c71959b0b8ea10f708f1ce1e71e1debf83e896020808301919091527fe6b2c205b9db529db6f2ea215116888be992f48b7f5ecf685c650728c88c67026040808401919091528382019290925273d3860ef07a59fd979ce006d29abe07ab8def6dee83830152674bc1e3fc814f60df60c01b60608401528151808301909252703b359c0b3f49bca65a78f0fd29be29df07607a1b82527178b488523df79780069fba3bbc8f5409de1e9082015260808201528152610b0d610e88565b73010509c08c65376879f024b408751484c24593b58152610b2c610ddc565b7fb31de7417722d4032c56c325431843d10e01c902487fd5e6a174ecd1a189649381527ffc81f788a1ad5404a1fc9a2d90eb2a531e94644b3f7abf70f096d127cc58ab2c6020808301919091527f81933afd788a9e6973be5a2450074737eb8f3bccabb3767cc27b424d88e4b4bb604080840191909152838201929092527399366bd31fc99c72a364f2270243554c89ba316783830152670103eae73c7a987560c01b606080850191909152825180840190935270690b611ae0477626d90e217e11610330f960791b83527249ad483ce0330f21d19d789be251d9437005f51983830152608084019290925283019190915282810191909152820152610c30610ed8565b6040805160a08101825273d770dfc6ef1676de63f40927840623b8615db2d381526117e760f11b60208083019190915260018284015273cb2d87dbf4d6d9a33a0f3ffa5f0a0c84e04d0b0460608084019190915273d9583d04d45a8062b6217666376dbe55f6e3473f6080808501919091529285528583019490945292850193909352805191820190526000815290820152919050565b6040518060a0016040528060608152602001610ce1610d12565b815260006020820152604001610cf5610dfa565b81526040805160208181019092526000815291015290565b905290565b60405180602001604052806001905b610d29610d3f565b815260200190600190039081610d215790505090565b6040518060800160405280610d52610d6b565b8152600060208201819052604082015260609081015290565b6040805160a08101825260008082526020820152908101610d8a610ddc565b815260006020820152604001610d0d6040805160808082018352600080835260208084018290528451928301855281835282015260608184018190528082015290918201908152600060209091015290565b60405180606001604052806003906020820280368337509192915050565b6040805160a081018252600080825260606020830181905292820152908101610e21610e2e565b8152602001610d0d610ed8565b60405180608001604052806004905b610e45610e5b565b815260200190600190039081610e3d5790505090565b60405180604001604052806002905b610e72610e88565b815260200190600190039081610e6a5790505090565b6040518060a0016040528060006001600160a01b03168152602001610eab610ddc565b81526000602082018190526040820152606001610d0d604080518082019091526000808252602082015290565b60405180602001604052806001905b6040805160a081018252600080825260208083018290529282018190526060820181905260808201528252600019909201910181610ee75790505090565b6000815180845260005b81811015610f4b57602081850181015186830182015201610f2f565b81811115610f5d576000602083870101525b50601f01601f19169290920160200192915050565b61ffff1981511682526000602080830151151581850152604083015160806040860152805160170b608086015281810151151560a08601526040810151608060c0870152610fc4610100870182610f25565b60609290920151868303607f190160e0880152805180845290840192600092508401905b808310156110115783516001600160a01b03168252928401926001929092019190840190610fe8565b5060608601519350611027606088018515159052565b9695505050505050565b8060005b600181101561109d57815180516001600160a01b0390811686526020808301516001600160f01b031916818801526040808401511515908801526060808401518316908801526080928301519091169186019190915260a09094019390910190600101611035565b50505050565b600061090065ffffffffffff19835116845260208084015182828701526110cc83870182610f25565b925050604061ffff60f01b81860151168187015260608086015181880160005b60048110156111be5782518260005b60028110156111a757825180516001600160a01b03168352898101518a840160005b600381101561113a5782518252918c0191908c019060010161111d565b505050888101516080611157818601836001600160a01b03169052565b898301516001600160c01b03191660a08601529091015180516effffffffffffffffffffffffffffff191660c08501526020015160120b60e08401525091880191610100909101906001016110fb565b5050509185019161020091909101906001016110ec565b50505050505060808301516111d7610860860182611031565b509392505050565b60006020808352835160a0828501526111fb60c0850182610f25565b905081850151601f196040818785030181880152838490508585016000805b60018082106112295750611316565b888403855287518051608080875281511515818801528c8201516001600160a01b031660a08801528882015190919060c08801875b600381101561127d57825160060b8252918f0191908f0190860161125e565b505050606093508381015161129e6101208901826001600160c81b03169052565b50015160e06101408701526112b7610160870182610f72565b90508b8201516112d58d88018269ffffffffffffffffffff19169052565b50878201516001600160a01b0316868901529082015185820383870152906112fd8183610f25565b998c0199968c019695505050600191909101905061121a565b50508983015180151560608b0152965060608a01519650838982030160808a015261134181886110a3565b965050505050505060808401516111d760a08501825115159052565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806fc3a96f204d6fc3a920f09f9a80206f206fc3a96fc3a94d4d20f09f9a80f09f9a806f206f4d206f6f4d6fc3a9f09f9a80c3a94d4d6f6f20c3a9f09f9a806f6ff09f9a802020206f6ff09f9a80204d6ff09f9a80f09f9a806f20206f4d4dc3a96fc3a94d6f6f20c3a9f09f9a806f4d4d6f6f6f4d6f20c3a9f09f9a806ff09f9a806f6f6ff09f9a80c3a94d4dc3a96f20c3a96ff09f9a806f4d4d6f6f20c3a9f09f9a806ff09f9a80c3a96fc3a9f09f9a806fc3a94d20f09f9a806f6f6f206f206f6f20c3a9c3a96ff09f9a80c3a94dc3a96f4dc3a9c3a9c3a9206f206f204d6f206fc3a94da2646970667358221220c1da05b512ff6c8decb96a74a9559c002a54840804482a009af778ec64a8593364736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_6ce8a791 {\n int192 s_0;\n bool s_1;\n string s_2;\n address[] s_3;\n }\n\n struct S_ab04e35a {\n bytes30 s_0;\n bool s_1;\n S_6ce8a791 s_2;\n bool s_3;\n }\n\n struct S_0420b450 {\n bool s_0;\n address s_1;\n int56[3] s_2;\n uint200 s_3;\n S_ab04e35a s_4;\n }\n\n struct S_cbe10e40 {\n S_0420b450 s_0;\n bytes22 s_1;\n address s_2;\n string s_3;\n }\n\n struct S_25840313 {\n bytes17 s_0;\n int152 s_1;\n }\n\n struct S_edd44740 {\n address s_0;\n bytes32[3] s_1;\n address s_2;\n bytes8 s_3;\n S_25840313 s_4;\n }\n\n struct S_80937532 {\n address s_0;\n bytes2 s_1;\n bool s_2;\n address s_3;\n address s_4;\n }\n\n struct S_e4e0364e {\n bytes26 s_0;\n string s_1;\n bytes2 s_2;\n S_edd44740[2][4] s_3;\n S_80937532[1] s_4;\n }\n\n struct S_c1053bda {\n bool s_0;\n }\n\n struct S_042c3179 {\n string s_0;\n S_cbe10e40[1] s_1;\n bool s_2;\n S_e4e0364e s_3;\n S_c1053bda s_4;\n }\n\n function test () public pure returns (S_042c3179 memory) {\n S_042c3179 memory r;\n {\n string memory r_0 = unicode\"Moo é🚀oo🚀 oo🚀 Mo🚀🚀o oMMéoé\";\n r.s_0 = r_0;\n }\n {\n S_cbe10e40[1] memory r_1;\n {\n S_cbe10e40 memory r_1_0;\n {\n S_0420b450 memory r_1_0_0;\n {\n bool r_1_0_0_0 = false;\n r_1_0_0.s_0 = r_1_0_0_0;\n }\n {\n address r_1_0_0_1 = 0x78a1Fb3d7C3F3420854C36BB10ea7fDea80Ce919;\n r_1_0_0.s_1 = r_1_0_0_1;\n }\n {\n int56[3] memory r_1_0_0_2;\n {\n int56 r_1_0_0_2_0 = -26883565741535288;\n r_1_0_0_2[0] = r_1_0_0_2_0;\n }\n {\n int56 r_1_0_0_2_1 = -5141813151494236;\n r_1_0_0_2[1] = r_1_0_0_2_1;\n }\n {\n int56 r_1_0_0_2_2 = 26629360009472432;\n r_1_0_0_2[2] = r_1_0_0_2_2;\n }\n r_1_0_0.s_2 = r_1_0_0_2;\n }\n {\n uint200 r_1_0_0_3 = 1603398987769685005722175597858365826291742512076644510389132;\n r_1_0_0.s_3 = r_1_0_0_3;\n }\n {\n S_ab04e35a memory r_1_0_0_4;\n {\n bytes30 r_1_0_0_4_0 = bytes30(0x1c6bda95fb3c9136aec682a6bdbcbd963f938455983189608675fd82507d);\n r_1_0_0_4.s_0 = r_1_0_0_4_0;\n }\n {\n bool r_1_0_0_4_1 = false;\n r_1_0_0_4.s_1 = r_1_0_0_4_1;\n }\n {\n S_6ce8a791 memory r_1_0_0_4_2;\n {\n int192 r_1_0_0_4_2_0 = 1046737888541635118449059417916377480933733099728971613817;\n r_1_0_0_4_2.s_0 = r_1_0_0_4_2_0;\n }\n {\n bool r_1_0_0_4_2_1 = false;\n r_1_0_0_4_2.s_1 = r_1_0_0_4_2_1;\n }\n {\n string memory r_1_0_0_4_2_2 = unicode\"Moo é🚀oMMoooMo é🚀o🚀ooo🚀éMMéo éo🚀oM\";\n r_1_0_0_4_2.s_2 = r_1_0_0_4_2_2;\n }\n {\n address[] memory r_1_0_0_4_2_3 = new address[](2);\n {\n address r_1_0_0_4_2_3_0 = 0x755Ed5385a0187438817d1E6Ff618a30039Aa810;\n r_1_0_0_4_2_3[0] = r_1_0_0_4_2_3_0;\n }\n {\n address r_1_0_0_4_2_3_1 = 0xf1B386675381c89B64c5E4A41fd8E6BeA47856fa;\n r_1_0_0_4_2_3[1] = r_1_0_0_4_2_3_1;\n }\n r_1_0_0_4_2.s_3 = r_1_0_0_4_2_3;\n }\n r_1_0_0_4.s_2 = r_1_0_0_4_2;\n }\n {\n bool r_1_0_0_4_3 = false;\n r_1_0_0_4.s_3 = r_1_0_0_4_3;\n }\n r_1_0_0.s_4 = r_1_0_0_4;\n }\n r_1_0.s_0 = r_1_0_0;\n }\n {\n bytes22 r_1_0_1 = bytes22(0x7f211f7170792e5b571a01020cd1c834766c35dc3a45);\n r_1_0.s_1 = r_1_0_1;\n }\n {\n address r_1_0_2 = 0x55ea89c08d94e5f14261F3533c9C613a2732Fb34;\n r_1_0.s_2 = r_1_0_2;\n }\n {\n string memory r_1_0_3 = unicode\"Moo é🚀oéo Moé 🚀 o oéoéMM 🚀🚀o oM ooMoé🚀éM\";\n r_1_0.s_3 = r_1_0_3;\n }\n r_1[0] = r_1_0;\n }\n r.s_1 = r_1;\n }\n {\n bool r_2 = true;\n r.s_2 = r_2;\n }\n {\n S_e4e0364e memory r_3;\n {\n bytes26 r_3_0 = bytes26(0x696e5ca8954b0f4a5bdb51c15d7674a47de75a4fdf68dc4167da);\n r_3.s_0 = r_3_0;\n }\n {\n string memory r_3_1 = unicode\"Moo é🚀o🚀éoé🚀oéM 🚀ooo o oo ééo🚀éMéoMééé o o Mo oéM\";\n r_3.s_1 = r_3_1;\n }\n {\n bytes2 r_3_2 = bytes2(0xc037);\n r_3.s_2 = r_3_2;\n }\n {\n S_edd44740[2][4] memory r_3_3;\n {\n S_edd44740[2] memory r_3_3_0;\n {\n S_edd44740 memory r_3_3_0_0;\n {\n address r_3_3_0_0_0 = 0xD624A8878d6EE485120e8286CbDC9cF10abCbb57;\n r_3_3_0_0.s_0 = r_3_3_0_0_0;\n }\n {\n bytes32[3] memory r_3_3_0_0_1;\n {\n bytes32 r_3_3_0_0_1_0 = bytes32(0x9221edfb9018a888805a3176f013f076e5d938fbc6aa1753c7c674b950e837bd);\n r_3_3_0_0_1[0] = r_3_3_0_0_1_0;\n }\n {\n bytes32 r_3_3_0_0_1_1 = bytes32(0xdbe12eecdceb7f1f2ae6fce1d03e94756c8ff8c2bbd52679b3f04f77a7eefcf2);\n r_3_3_0_0_1[1] = r_3_3_0_0_1_1;\n }\n {\n bytes32 r_3_3_0_0_1_2 = bytes32(0x2f19f93379d6f2a20ecee5ad670612a28f27941256f446ca8bcec1a5899e76e5);\n r_3_3_0_0_1[2] = r_3_3_0_0_1_2;\n }\n r_3_3_0_0.s_1 = r_3_3_0_0_1;\n }\n {\n address r_3_3_0_0_2 = 0x9F8e96E3103AB52246e19a66a409Cf616241e3D0;\n r_3_3_0_0.s_2 = r_3_3_0_0_2;\n }\n {\n bytes8 r_3_3_0_0_3 = bytes8(0x56089b9c940e63b6);\n r_3_3_0_0.s_3 = r_3_3_0_0_3;\n }\n {\n S_25840313 memory r_3_3_0_0_4;\n {\n bytes17 r_3_3_0_0_4_0 = bytes17(0x121a06299c784458456a8c84cc621a8845);\n r_3_3_0_0_4.s_0 = r_3_3_0_0_4_0;\n }\n {\n int152 r_3_3_0_0_4_1 = -208389642673309035464843874223566773254034848;\n r_3_3_0_0_4.s_1 = r_3_3_0_0_4_1;\n }\n r_3_3_0_0.s_4 = r_3_3_0_0_4;\n }\n r_3_3_0[0] = r_3_3_0_0;\n }\n {\n S_edd44740 memory r_3_3_0_1;\n {\n address r_3_3_0_1_0 = 0xaf51A9F6504eD1EEB7b8d89B50bAE1de3D3dA1a7;\n r_3_3_0_1.s_0 = r_3_3_0_1_0;\n }\n {\n bytes32[3] memory r_3_3_0_1_1;\n {\n bytes32 r_3_3_0_1_1_0 = bytes32(0xfc4791965498566b26a3827759f291ed4649973d574a9f2638a17459f077b995);\n r_3_3_0_1_1[0] = r_3_3_0_1_1_0;\n }\n {\n bytes32 r_3_3_0_1_1_1 = bytes32(0xa5d8d441d4207fbaee9b38e4d8f56f391f173f74174a824d9958120ee9aa95f8);\n r_3_3_0_1_1[1] = r_3_3_0_1_1_1;\n }\n {\n bytes32 r_3_3_0_1_1_2 = bytes32(0x96214b938c4341ffffdce7c3a3f4f3dc72a5cce3ce235864a1e316d2383d0daa);\n r_3_3_0_1_1[2] = r_3_3_0_1_1_2;\n }\n r_3_3_0_1.s_1 = r_3_3_0_1_1;\n }\n {\n address r_3_3_0_1_2 = 0x0273602393dd20Cf8430D7Af530aB22036884B72;\n r_3_3_0_1.s_2 = r_3_3_0_1_2;\n }\n {\n bytes8 r_3_3_0_1_3 = bytes8(0x466cffcab0e7f98b);\n r_3_3_0_1.s_3 = r_3_3_0_1_3;\n }\n {\n S_25840313 memory r_3_3_0_1_4;\n {\n bytes17 r_3_3_0_1_4_0 = bytes17(0x5b5a45f9fe5c475413abe5d5c207e79c64);\n r_3_3_0_1_4.s_0 = r_3_3_0_1_4_0;\n }\n {\n int152 r_3_3_0_1_4_1 = -792160833879411119615087435813012984254121891;\n r_3_3_0_1_4.s_1 = r_3_3_0_1_4_1;\n }\n r_3_3_0_1.s_4 = r_3_3_0_1_4;\n }\n r_3_3_0[1] = r_3_3_0_1;\n }\n r_3_3[0] = r_3_3_0;\n }\n {\n S_edd44740[2] memory r_3_3_1;\n {\n S_edd44740 memory r_3_3_1_0;\n {\n address r_3_3_1_0_0 = 0x89dB1724662CE37034806ef0787d78d17422b451;\n r_3_3_1_0.s_0 = r_3_3_1_0_0;\n }\n {\n bytes32[3] memory r_3_3_1_0_1;\n {\n bytes32 r_3_3_1_0_1_0 = bytes32(0x11cbdcde8a2c6877d81e06e882d3e7afc12ad98e03ed853656c3cd79c3b55f7c);\n r_3_3_1_0_1[0] = r_3_3_1_0_1_0;\n }\n {\n bytes32 r_3_3_1_0_1_1 = bytes32(0x2daf348c7df22a81d75b6b1cd940ef4d7d4f556cbb89151e91d04e39d76e6719);\n r_3_3_1_0_1[1] = r_3_3_1_0_1_1;\n }\n {\n bytes32 r_3_3_1_0_1_2 = bytes32(0x7aca0588010f9e62b2c7486d11fb2ce02bd19c89b730db54317c8c54058632e6);\n r_3_3_1_0_1[2] = r_3_3_1_0_1_2;\n }\n r_3_3_1_0.s_1 = r_3_3_1_0_1;\n }\n {\n address r_3_3_1_0_2 = 0xAe7e4B15C1cda5de9Be87580e7BB13dA1efb7591;\n r_3_3_1_0.s_2 = r_3_3_1_0_2;\n }\n {\n bytes8 r_3_3_1_0_3 = bytes8(0xec83ccc6b0f9181f);\n r_3_3_1_0.s_3 = r_3_3_1_0_3;\n }\n {\n S_25840313 memory r_3_3_1_0_4;\n {\n bytes17 r_3_3_1_0_4_0 = bytes17(0xb68204261b7d17cf39e2f735584d6ac398);\n r_3_3_1_0_4.s_0 = r_3_3_1_0_4_0;\n }\n {\n int152 r_3_3_1_0_4_1 = -2458936244162674171091113051772615737777316744;\n r_3_3_1_0_4.s_1 = r_3_3_1_0_4_1;\n }\n r_3_3_1_0.s_4 = r_3_3_1_0_4;\n }\n r_3_3_1[0] = r_3_3_1_0;\n }\n {\n S_edd44740 memory r_3_3_1_1;\n {\n address r_3_3_1_1_0 = 0x17b3Ec6ab419d1A366914ED57F6A0b665bDA8CE9;\n r_3_3_1_1.s_0 = r_3_3_1_1_0;\n }\n {\n bytes32[3] memory r_3_3_1_1_1;\n {\n bytes32 r_3_3_1_1_1_0 = bytes32(0xb3a5f462eb343b2ba38c581558e7f397f15556d4fe7a617745c87af34d3395b0);\n r_3_3_1_1_1[0] = r_3_3_1_1_1_0;\n }\n {\n bytes32 r_3_3_1_1_1_1 = bytes32(0xd1249dde2921894ace13f5bd798507b60cd2d56f39d16bcb4414acd5530568b6);\n r_3_3_1_1_1[1] = r_3_3_1_1_1_1;\n }\n {\n bytes32 r_3_3_1_1_1_2 = bytes32(0x2ee1f1d9d38e6598dacec663e7335c697d75bc01421c2ba3889e58119da829c1);\n r_3_3_1_1_1[2] = r_3_3_1_1_1_2;\n }\n r_3_3_1_1.s_1 = r_3_3_1_1_1;\n }\n {\n address r_3_3_1_1_2 = 0x962712bAFa7CE3d91BB38012C7C17Acd92Ee34d3;\n r_3_3_1_1.s_2 = r_3_3_1_1_2;\n }\n {\n bytes8 r_3_3_1_1_3 = bytes8(0xa03a8d3e0410d3db);\n r_3_3_1_1.s_3 = r_3_3_1_1_3;\n }\n {\n S_25840313 memory r_3_3_1_1_4;\n {\n bytes17 r_3_3_1_1_4_0 = bytes17(0xbdfac2f5ea903403eefab3ad3810b20c50);\n r_3_3_1_1_4.s_0 = r_3_3_1_1_4_0;\n }\n {\n int152 r_3_3_1_1_4_1 = 2134837106943374995115965611423503188547599690;\n r_3_3_1_1_4.s_1 = r_3_3_1_1_4_1;\n }\n r_3_3_1_1.s_4 = r_3_3_1_1_4;\n }\n r_3_3_1[1] = r_3_3_1_1;\n }\n r_3_3[1] = r_3_3_1;\n }\n {\n S_edd44740[2] memory r_3_3_2;\n {\n S_edd44740 memory r_3_3_2_0;\n {\n address r_3_3_2_0_0 = 0x54a6DCC5c20704c266A715d5B7616705ab8dd897;\n r_3_3_2_0.s_0 = r_3_3_2_0_0;\n }\n {\n bytes32[3] memory r_3_3_2_0_1;\n {\n bytes32 r_3_3_2_0_1_0 = bytes32(0x96b4cecb3c9f703fde5eee9300655d04ee4553c0ca2a5a7d5caecadf2f93b7a2);\n r_3_3_2_0_1[0] = r_3_3_2_0_1_0;\n }\n {\n bytes32 r_3_3_2_0_1_1 = bytes32(0x20cdfdd8cef57177b8c89a6f0b164fdd52366bcdac703e9b3914f22eda46b1e5);\n r_3_3_2_0_1[1] = r_3_3_2_0_1_1;\n }\n {\n bytes32 r_3_3_2_0_1_2 = bytes32(0x67ed7307bc38b514b6fc42f6b2010dee17e84f26d5616a135a843e38c9d093b1);\n r_3_3_2_0_1[2] = r_3_3_2_0_1_2;\n }\n r_3_3_2_0.s_1 = r_3_3_2_0_1;\n }\n {\n address r_3_3_2_0_2 = 0x2b39D6D2b7cB289E7555fedfc96B1Ed44832028e;\n r_3_3_2_0.s_2 = r_3_3_2_0_2;\n }\n {\n bytes8 r_3_3_2_0_3 = bytes8(0x468ad872ecb06be0);\n r_3_3_2_0.s_3 = r_3_3_2_0_3;\n }\n {\n S_25840313 memory r_3_3_2_0_4;\n {\n bytes17 r_3_3_2_0_4_0 = bytes17(0xcfb24ecb1873c6d5b3809a0a0b9a747fe6);\n r_3_3_2_0_4.s_0 = r_3_3_2_0_4_0;\n }\n {\n int152 r_3_3_2_0_4_1 = -1304229747494031120009605527412148632595873471;\n r_3_3_2_0_4.s_1 = r_3_3_2_0_4_1;\n }\n r_3_3_2_0.s_4 = r_3_3_2_0_4;\n }\n r_3_3_2[0] = r_3_3_2_0;\n }\n {\n S_edd44740 memory r_3_3_2_1;\n {\n address r_3_3_2_1_0 = 0x2b57CB6E95A167d6320DDA76a18fbdB3AB97Fa2f;\n r_3_3_2_1.s_0 = r_3_3_2_1_0;\n }\n {\n bytes32[3] memory r_3_3_2_1_1;\n {\n bytes32 r_3_3_2_1_1_0 = bytes32(0xc80dbfaa35599759201f588d5dace4955090e23381d6bd5ed49df9012f41088c);\n r_3_3_2_1_1[0] = r_3_3_2_1_1_0;\n }\n {\n bytes32 r_3_3_2_1_1_1 = bytes32(0x5439259b129fea278ff17c38bd309d3ef636c65dc37e48489bc31812349b5e50);\n r_3_3_2_1_1[1] = r_3_3_2_1_1_1;\n }\n {\n bytes32 r_3_3_2_1_1_2 = bytes32(0x10a48424fc6a0e695d248ed29b561abc85b144ffbc24bb6621951033722935f0);\n r_3_3_2_1_1[2] = r_3_3_2_1_1_2;\n }\n r_3_3_2_1.s_1 = r_3_3_2_1_1;\n }\n {\n address r_3_3_2_1_2 = 0xf385efe72580AfF0A9A9fAA25d8ddB790A6a2aF1;\n r_3_3_2_1.s_2 = r_3_3_2_1_2;\n }\n {\n bytes8 r_3_3_2_1_3 = bytes8(0xea1fc724e4946a4c);\n r_3_3_2_1.s_3 = r_3_3_2_1_3;\n }\n {\n S_25840313 memory r_3_3_2_1_4;\n {\n bytes17 r_3_3_2_1_4_0 = bytes17(0xfd5d6177b05f411f08a415077e3ea2db5b);\n r_3_3_2_1_4.s_0 = r_3_3_2_1_4_0;\n }\n {\n int152 r_3_3_2_1_4_1 = 1365080883231409609352493687900635060428675967;\n r_3_3_2_1_4.s_1 = r_3_3_2_1_4_1;\n }\n r_3_3_2_1.s_4 = r_3_3_2_1_4;\n }\n r_3_3_2[1] = r_3_3_2_1;\n }\n r_3_3[2] = r_3_3_2;\n }\n {\n S_edd44740[2] memory r_3_3_3;\n {\n S_edd44740 memory r_3_3_3_0;\n {\n address r_3_3_3_0_0 = 0x8c28208eC8349F8072c06F3567734543b767D82b;\n r_3_3_3_0.s_0 = r_3_3_3_0_0;\n }\n {\n bytes32[3] memory r_3_3_3_0_1;\n {\n bytes32 r_3_3_3_0_1_0 = bytes32(0xaff17a3901f235911f59ac47a474052d28ac0e0a5f0fce3bd820208925c06aef);\n r_3_3_3_0_1[0] = r_3_3_3_0_1_0;\n }\n {\n bytes32 r_3_3_3_0_1_1 = bytes32(0xcfd10f8d7206b876cc433cee909c71959b0b8ea10f708f1ce1e71e1debf83e89);\n r_3_3_3_0_1[1] = r_3_3_3_0_1_1;\n }\n {\n bytes32 r_3_3_3_0_1_2 = bytes32(0xe6b2c205b9db529db6f2ea215116888be992f48b7f5ecf685c650728c88c6702);\n r_3_3_3_0_1[2] = r_3_3_3_0_1_2;\n }\n r_3_3_3_0.s_1 = r_3_3_3_0_1;\n }\n {\n address r_3_3_3_0_2 = 0xd3860eF07A59fd979CE006D29abE07aB8DEf6dEE;\n r_3_3_3_0.s_2 = r_3_3_3_0_2;\n }\n {\n bytes8 r_3_3_3_0_3 = bytes8(0x4bc1e3fc814f60df);\n r_3_3_3_0.s_3 = r_3_3_3_0_3;\n }\n {\n S_25840313 memory r_3_3_3_0_4;\n {\n bytes17 r_3_3_3_0_4_0 = bytes17(0xecd6702cfd26f29969e3c3f4a6f8a77c1c);\n r_3_3_3_0_4.s_0 = r_3_3_3_0_4_0;\n }\n {\n int152 r_3_3_3_0_4_1 = 10514906339889610898406899598658610492202526;\n r_3_3_3_0_4.s_1 = r_3_3_3_0_4_1;\n }\n r_3_3_3_0.s_4 = r_3_3_3_0_4;\n }\n r_3_3_3[0] = r_3_3_3_0;\n }\n {\n S_edd44740 memory r_3_3_3_1;\n {\n address r_3_3_3_1_0 = 0x010509c08C65376879f024B408751484c24593b5;\n r_3_3_3_1.s_0 = r_3_3_3_1_0;\n }\n {\n bytes32[3] memory r_3_3_3_1_1;\n {\n bytes32 r_3_3_3_1_1_0 = bytes32(0xb31de7417722d4032c56c325431843d10e01c902487fd5e6a174ecd1a1896493);\n r_3_3_3_1_1[0] = r_3_3_3_1_1_0;\n }\n {\n bytes32 r_3_3_3_1_1_1 = bytes32(0xfc81f788a1ad5404a1fc9a2d90eb2a531e94644b3f7abf70f096d127cc58ab2c);\n r_3_3_3_1_1[1] = r_3_3_3_1_1_1;\n }\n {\n bytes32 r_3_3_3_1_1_2 = bytes32(0x81933afd788a9e6973be5a2450074737eb8f3bccabb3767cc27b424d88e4b4bb);\n r_3_3_3_1_1[2] = r_3_3_3_1_1_2;\n }\n r_3_3_3_1.s_1 = r_3_3_3_1_1;\n }\n {\n address r_3_3_3_1_2 = 0x99366Bd31FC99c72A364f2270243554c89BA3167;\n r_3_3_3_1.s_2 = r_3_3_3_1_2;\n }\n {\n bytes8 r_3_3_3_1_3 = bytes8(0x0103eae73c7a9875);\n r_3_3_3_1.s_3 = r_3_3_3_1_3;\n }\n {\n S_25840313 memory r_3_3_3_1_4;\n {\n bytes17 r_3_3_3_1_4_0 = bytes17(0xd216c235c08eec4db21c42fc22c20661f2);\n r_3_3_3_1_4.s_0 = r_3_3_3_1_4_0;\n }\n {\n int152 r_3_3_3_1_4_1 = -1643049406207138164756734900448518194410292726;\n r_3_3_3_1_4.s_1 = r_3_3_3_1_4_1;\n }\n r_3_3_3_1.s_4 = r_3_3_3_1_4;\n }\n r_3_3_3[1] = r_3_3_3_1;\n }\n r_3_3[3] = r_3_3_3;\n }\n r_3.s_3 = r_3_3;\n }\n {\n S_80937532[1] memory r_3_4;\n {\n S_80937532 memory r_3_4_0;\n {\n address r_3_4_0_0 = 0xD770dFc6Ef1676De63f40927840623b8615DB2d3;\n r_3_4_0.s_0 = r_3_4_0_0;\n }\n {\n bytes2 r_3_4_0_1 = bytes2(0x2fce);\n r_3_4_0.s_1 = r_3_4_0_1;\n }\n {\n bool r_3_4_0_2 = true;\n r_3_4_0.s_2 = r_3_4_0_2;\n }\n {\n address r_3_4_0_3 = 0xCB2d87DBF4D6D9a33a0F3FfA5F0a0c84e04d0B04;\n r_3_4_0.s_3 = r_3_4_0_3;\n }\n {\n address r_3_4_0_4 = 0xd9583D04D45a8062b6217666376DbE55f6E3473f;\n r_3_4_0.s_4 = r_3_4_0_4;\n }\n r_3_4[0] = r_3_4_0;\n }\n r_3.s_4 = r_3_4;\n }\n r.s_3 = r_3;\n }\n {\n S_c1053bda memory r_4;\n {\n bool r_4_0 = false;\n r_4.s_0 = r_4_0;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a806f6ff09f9a802020206f6ff09f9a80204d6ff09f9a80f09f9a806f20206f4d4dc3a96fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000807f211f7170792e5b571a01020cd1c834766c35dc3a450000000000000000000000000000000000000000000055ea89c08d94e5f14261f3533c9c613a2732fb340000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078a1fb3d7c3f3420854c36bb10ea7fdea80ce919ffffffffffffffffffffffffffffffffffffffffffffffffffa07d8a15ae0fc8ffffffffffffffffffffffffffffffffffffffffffffffffffedbb8c559a8fa4000000000000000000000000000000000000000000000000005e9b4307f5e9b000000000000000ff6faa86b55737e78528fc985d81034ad689a45b8ebb88d38c00000000000000000000000000000000000000000000000000000000000000e01c6bda95fb3c9136aec682a6bdbcbd963f938455983189608675fd82507d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000002ab07416d67fd59e68d65c5128e385c98cc6dde4b6bdc6790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000364d6f6f20c3a9f09f9a806f4d4d6f6f6f4d6f20c3a9f09f9a806ff09f9a806f6f6ff09f9a80c3a94d4dc3a96f20c3a96ff09f9a806f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000755ed5385a0187438817d1e6ff618a30039aa810000000000000000000000000f1b386675381c89b64c5e4a41fd8e6bea47856fa000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a806fc3a96f204d6fc3a920f09f9a80206f206fc3a96fc3a94d4d20f09f9a80f09f9a806f206f4d206f6f4d6fc3a9f09f9a80c3a94d0000696e5ca8954b0f4a5bdb51c15d7674a47de75a4fdf68dc4167da0000000000000000000000000000000000000000000000000000000000000000000000000900c037000000000000000000000000000000000000000000000000000000000000000000000000000000000000d624a8878d6ee485120e8286cbdc9cf10abcbb579221edfb9018a888805a3176f013f076e5d938fbc6aa1753c7c674b950e837bddbe12eecdceb7f1f2ae6fce1d03e94756c8ff8c2bbd52679b3f04f77a7eefcf22f19f93379d6f2a20ecee5ad670612a28f27941256f446ca8bcec1a5899e76e50000000000000000000000009f8e96e3103ab52246e19a66a409cf616241e3d056089b9c940e63b6000000000000000000000000000000000000000000000000121a06299c784458456a8c84cc621a8845000000000000000000000000000000fffffffffffffffffffffffffff6a7cde1738823e688282e4323b095ec54ea60000000000000000000000000af51a9f6504ed1eeb7b8d89b50bae1de3d3da1a7fc4791965498566b26a3827759f291ed4649973d574a9f2638a17459f077b995a5d8d441d4207fbaee9b38e4d8f56f391f173f74174a824d9958120ee9aa95f896214b938c4341ffffdce7c3a3f4f3dc72a5cce3ce235864a1e316d2383d0daa0000000000000000000000000273602393dd20cf8430d7af530ab22036884b72466cffcab0e7f98b0000000000000000000000000000000000000000000000005b5a45f9fe5c475413abe5d5c207e79c64000000000000000000000000000000ffffffffffffffffffffffffffdc7a70897e1682fef0a8e9107b9ad31d74b85d00000000000000000000000089db1724662ce37034806ef0787d78d17422b45111cbdcde8a2c6877d81e06e882d3e7afc12ad98e03ed853656c3cd79c3b55f7c2daf348c7df22a81d75b6b1cd940ef4d7d4f556cbb89151e91d04e39d76e67197aca0588010f9e62b2c7486d11fb2ce02bd19c89b730db54317c8c54058632e6000000000000000000000000ae7e4b15c1cda5de9be87580e7bb13da1efb7591ec83ccc6b0f9181f000000000000000000000000000000000000000000000000b68204261b7d17cf39e2f735584d6ac398000000000000000000000000000000ffffffffffffffffffffffffff91bccbd702cd5f28c9f1347dcf7c7b295c1c7800000000000000000000000017b3ec6ab419d1a366914ed57f6a0b665bda8ce9b3a5f462eb343b2ba38c581558e7f397f15556d4fe7a617745c87af34d3395b0d1249dde2921894ace13f5bd798507b60cd2d56f39d16bcb4414acd5530568b62ee1f1d9d38e6598dacec663e7335c697d75bc01421c2ba3889e58119da829c1000000000000000000000000962712bafa7ce3d91bb38012c7c17acd92ee34d3a03a8d3e0410d3db000000000000000000000000000000000000000000000000bdfac2f5ea903403eefab3ad3810b20c50000000000000000000000000000000000000000000000000000000005fbaba65d9204c92179ef888c15e393a6bfd4a00000000000000000000000054a6dcc5c20704c266a715d5b7616705ab8dd89796b4cecb3c9f703fde5eee9300655d04ee4553c0ca2a5a7d5caecadf2f93b7a220cdfdd8cef57177b8c89a6f0b164fdd52366bcdac703e9b3914f22eda46b1e567ed7307bc38b514b6fc42f6b2010dee17e84f26d5616a135a843e38c9d093b10000000000000000000000002b39d6d2b7cb289e7555fedfc96b1ed44832028e468ad872ecb06be0000000000000000000000000000000000000000000000000cfb24ecb1873c6d5b3809a0a0b9a747fe6000000000000000000000000000000ffffffffffffffffffffffffffc5842d3fc6106f5188a91a389746cab779c1410000000000000000000000002b57cb6e95a167d6320dda76a18fbdb3ab97fa2fc80dbfaa35599759201f588d5dace4955090e23381d6bd5ed49df9012f41088c5439259b129fea278ff17c38bd309d3ef636c65dc37e48489bc31812349b5e5010a48424fc6a0e695d248ed29b561abc85b144ffbc24bb6621951033722935f0000000000000000000000000f385efe72580aff0a9a9faa25d8ddb790a6a2af1ea1fc724e4946a4c000000000000000000000000000000000000000000000000fd5d6177b05f411f08a415077e3ea2db5b000000000000000000000000000000000000000000000000000000003d365c2aa89841971fc086f8df1e1448991b7f0000000000000000000000008c28208ec8349f8072c06f3567734543b767d82baff17a3901f235911f59ac47a474052d28ac0e0a5f0fce3bd820208925c06aefcfd10f8d7206b876cc433cee909c71959b0b8ea10f708f1ce1e71e1debf83e89e6b2c205b9db529db6f2ea215116888be992f48b7f5ecf685c650728c88c6702000000000000000000000000d3860ef07a59fd979ce006d29abe07ab8def6dee4bc1e3fc814f60df000000000000000000000000000000000000000000000000ecd6702cfd26f29969e3c3f4a6f8a77c1c000000000000000000000000000000000000000000000000000000000078b488523df79780069fba3bbc8f5409de1e000000000000000000000000010509c08c65376879f024b408751484c24593b5b31de7417722d4032c56c325431843d10e01c902487fd5e6a174ecd1a1896493fc81f788a1ad5404a1fc9a2d90eb2a531e94644b3f7abf70f096d127cc58ab2c81933afd788a9e6973be5a2450074737eb8f3bccabb3767cc27b424d88e4b4bb00000000000000000000000099366bd31fc99c72a364f2270243554c89ba31670103eae73c7a9875000000000000000000000000000000000000000000000000d216c235c08eec4db21c42fc22c20661f2000000000000000000000000000000ffffffffffffffffffffffffffb652b7c31fccf0de2e6287641dae26bc8ffa0a000000000000000000000000d770dfc6ef1676de63f40927840623b8615db2d32fce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000cb2d87dbf4d6d9a33a0f3ffa5f0a0c84e04d0b04000000000000000000000000d9583d04d45a8062b6217666376dbe55f6e3473f000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806ff09f9a80c3a96fc3a9f09f9a806fc3a94d20f09f9a806f6f6f206f206f6f20c3a9c3a96ff09f9a80c3a94dc3a96f4dc3a9c3a9c3a9206f206f204d6f206fc3a94d0000000000000000000000000000000000000000" + }, + { + "name": "random-(bytes9,(bool,string,(int56,(bytes6,bool,string),(string,bool,int),(int104,(bytes27[1],string,(bool,address,address,address,address[2]),bool)[1]),bytes31[1]),bool,bool),(string,bool,(uint216,bytes22,(string,bool,bool[3],bytes10),string,bytes30),string,address),uint112[][4],bool)[4][2]", + "type": "(bytes9,(bool,string,(int56,(bytes6,bool,string),(string,bool,int),(int104,(bytes27[1],string,(bool,address,address,address,address[2]),bool)[1]),bytes31[1]),bool,bool),(string,bool,(uint216,bytes22,(string,bool,bool[3],bytes10),string,bytes30),string,address),uint112[][4],bool)[4][2]", + "value": [ + [ + [ + "0x38ff1d4bd09084daac", + [ + true, + "Moo é🚀", + [ + "-23752578349029843", + ["0xa3041454f737", false, "Moo é🚀"], + [ + "Moo é🚀🚀🚀 🚀é🚀Moo ", + false, + "-38425255964902292425626891154472153534872251544077286003091327836970394458335" + ], + [ + "-7117633924389681105262242214326", + [ + [ + [ + "0xafc32882a67fb6e2a12ef12e5593e8f0fee4476e3cb861b902a2ff" + ], + "Moo é🚀o éééoéM MMéo🚀 o🚀ooMoé 🚀 ooéMo Mo o🚀o éoéoooéoooooMé ", + [ + true, + "0x1F3d32b69454A0070322B60eC7426d866026C3E1", + "0x5a81cc72331fD53bfc70072ad9e17efAa54d15f8", + "0x6D23544ED1963A7626Db178130b813Db9989A5F1", + [ + "0x03DCCB8F62d73B34F5b5e6547dA3996382bf95e3", + "0x80E3a24161B435412256C4C6B7e555E1FE7674A7" + ] + ], + true + ] + ] + ], + ["0x3ee006aedc7376ecd84c916ee5223648efda9cdb16ee49a68fbeaa0972d2a5"] + ], + false, + false + ], + [ + "Moo é🚀MooM🚀🚀ooMM🚀ooé é oo🚀éo🚀éo ooo🚀M é🚀oé o oM🚀M🚀Méoo", + true, + [ + "72650037408773438030448475368216717356331248262729991183742203537", + "0x9d36abda1a703a914767eba207083d47f0a764bc0c47", + [ + "Moo é🚀ooo o éoé éééoé ooooé MMo🚀Moo", + false, + [false, true, true], + "0x7decc7fe1bccee97d17b" + ], + "Moo é🚀", + "0x7c194ace6f06432df5a7b6b88d86e9f19b397a1ab0105601fde3c1ab2efc" + ], + "Moo é🚀ooMMéo o éoééoM", + "0xae3eDD08Bee48aca623c4C39EaEcd9Fe1A6274Ca" + ], + [ + ["955372374163780864986492531553834", "3024758950298724742608742337127557"], + ["4237546721052470754390151559195610"], + ["2872211107369508497752428063678622"], + ["111355774438692695778092565387668", "2260051501091894501614819150953870"] + ], + false + ], + [ + "0x55906f3ed2d25e1f42", + [ + false, + "Moo é🚀🚀o oooéoé🚀", + [ + "-13588634728638176", + ["0x9822b712d015", true, "Moo é🚀oéoooéoMo🚀 oo éMM 🚀🚀o"], + [ + "Moo é🚀M é M🚀 o oéo", + false, + "-1381828108252282559403895635677371886389472450581672233661675869401130495396" + ], + [ + "-2301286873639017688016524054257", + [ + [ + [ + "0xb2768925b357944d0ae111562b62207a3183208c8ab4bd31f69f5e" + ], + "Moo é🚀o🚀 M🚀Mé🚀oo M 🚀ooooéoooMoéoMéM🚀o ", + [ + false, + "0x55aB8C91f89206F1f5E9b782AA29393F20e86937", + "0xAbdbF1E9feD389D4A969CED2Fa5F60f4170B74E7", + "0xcb5E46bcd1188d4BDC4A5e1252D6ed8b63fEFc50", + [ + "0x4DCEe8608f0dFE1Fb8B0f008D2e460Ec5C2Dd4ce", + "0x68CEdfA366D0cC5B894921CD966fDba4dC9fcae1" + ] + ], + false + ] + ] + ], + ["0x5556b6b433f517aad338cceb71fa66c0d0ffb00189ae3e905f90b7c9673f33"] + ], + true, + true + ], + [ + "Moo é🚀🚀MMMMo M éoMéM M🚀 oé🚀🚀🚀oéo o🚀éo é🚀éoéMoMéé🚀o🚀M oo", + false, + [ + "87276849210015664841785584752947167384195780271625904423032121664", + "0x79b8620d9fc052a643f3a29332e373ca3f8d021986e3", + [ + "Moo é🚀🚀 Moo🚀🚀ooMoM🚀éMooo🚀 o M o éo o🚀Mé🚀 ooMM Mooééo🚀🚀éo🚀é", + false, + [true, false, true], + "0x02f1a6afc51609028dc8" + ], + "Moo é🚀M 🚀o 🚀M🚀Mé éoo oo 🚀🚀é🚀MoooooéoM🚀ooo🚀oMMo ooMo ", + "0x3b291c86abe0818a70a9f010dd7acbf19e1f2bc3f021c0778f610363ad50" + ], + "Moo é🚀Mé 🚀M🚀oooo🚀 M🚀 oo é", + "0xAd230d50ED982311f04D14A5C9fa475cEBf3624B" + ], + [ + ["1669460443878462292282980670702483"], + [ + "4428941743575378706328860399569192", + "1424947952038344969869062031715935", + "4546660216598814792312695772046824" + ], + ["4296674203415129897678115575897696"], + [ + "910863371599992936801945507531803", + "2996372679197759143609789516409237", + "4003478144626770514356714911201572" + ] + ], + false + ], + [ + "0x75b5d4ce932f386ef6", + [ + true, + "Moo é🚀MééM", + [ + "-5051473243263691", + [ + "0xe58fc222ce53", + false, + "Moo é🚀o🚀é MooMo🚀🚀🚀 oo🚀éé oo o oéM🚀oo🚀M MMéo🚀oé🚀" + ], + [ + "Moo é🚀éMMo🚀oMo🚀é🚀🚀🚀", + true, + "-7449863340844524306373980804389553848035409148281865705094943558193151653578" + ], + [ + "62675005066649660926991713638", + [ + [ + [ + "0x8668d85da31504503ea9b77aef6cee6b9b87107d54a85689791c79" + ], + "Moo é🚀MoMéo MM éo", + [ + true, + "0x138A9E491D88E30E2562AADA9bB86De9931DD89f", + "0x7Ec0E8aD2B0482b1661ED6853dE7B8A0A3B54fC6", + "0x23138e20c675b781BE3f96C7992cb4FFc415E1d4", + [ + "0x4212e1bcAF5748c806952257228816e553Ce52A1", + "0xc7C1334dD1a2E8c4F7Bc5c9B0281cf01D9fB03d8" + ] + ], + true + ] + ] + ], + ["0xd39bc92ff2aedc0ca315f6f383f38067f4bd3fdcbd5553d41a05ae6121f64a"] + ], + false, + true + ], + [ + "Moo é🚀MM🚀MoM🚀 MéM🚀oM ooééMoé ooM oo éooMoéo ", + true, + [ + "30148822645983097932041779039543223497977437556495248581884214906", + "0xc2e7db0a808e4f73a557c27c7bf7b66c338b8c2b7e08", + [ + "Moo é🚀ooéMooé o oo oMéoM oMé 🚀🚀éo🚀oMM🚀o M🚀🚀", + false, + [true, false, false], + "0x89cff81cac99fdb50a4c" + ], + "Moo é🚀 Mé", + "0x1ce56dbf942e1efca45cf426cfe753dcc546c27bf04d6ba4fbdebe8d0f7d" + ], + "Moo é🚀é🚀éé🚀🚀éoo🚀Mo é o🚀 o🚀🚀🚀🚀oéé🚀 M M🚀Mo🚀MMoooo🚀oé🚀🚀🚀🚀🚀🚀éé🚀🚀", + "0x4f46eC04723d0EfF4FA143Ceb8fcb9d7cEEaCb81" + ], + [ + [ + "2883883556144974585492497403330033", + "3926707094420510728063374138913274" + ], + [ + "3069091067906313265474471043959744", + "3888745756486092218075146636410400" + ], + ["4189737722986109909039420415827510", "276646836850562282958296894968237"], + [ + "4727416100024242230698001918595878", + "2043457343155596710609380387719796", + "1394517542477882296135882479590824", + "3670692701933182797098307581191731" + ] + ], + false + ], + [ + "0x0cd7ca5805dc4b06af", + [ + true, + "Moo é🚀Méoo🚀M🚀oéoéM🚀o🚀M🚀éoéoéé MMoo", + [ + "-8290523448397740", + [ + "0x765ad85b7426", + true, + "Moo é🚀 🚀 oM🚀M🚀oo🚀Mooo éo Mo🚀Moéé é M🚀🚀 oooo🚀" + ], + [ + "Moo é🚀", + false, + "10402516873405573710396273875152332705176611010480768234745065173663786546454" + ], + [ + "5571910321032267783506139627700", + [ + [ + [ + "0x6fb989260c92e8bc966195c04f7e2fe9d9875833b429350acc0e5c" + ], + "Moo é🚀 é🚀🚀oéM🚀M Moo Mo", + [ + false, + "0x1b139e7d36FDadBcc7Df8c75AdBB6FfA292cEF45", + "0x0F5C24cFcEd9554Fd235F87285C4c5cc47A5b418", + "0x00DA6347a2a1277521bD00823C4DdCd703aEb815", + [ + "0xf5e8E208b26D7a51957f530F4764bf9894F58b54", + "0xEED761Fa1dCb2EAF8F93628fAE92acdE6c174478" + ] + ], + true + ] + ] + ], + ["0x7225a3846e77a05674dcfd69efa3437df1171f5ad40ee2d4ff13d1b47ff8c2"] + ], + true, + true + ], + [ + "Moo é🚀 é éoéoMoéé🚀éééo ", + false, + [ + "5439090432067320680194527809638087444230370463897350716633748856", + "0xaa324338c7572bf832363b06c4dbdc46a53eb6666461", + [ + "Moo é🚀Mé MéééooM🚀 éo o🚀o", + false, + [true, false, false], + "0x539d1fa27354cc2a21be" + ], + "Moo é🚀o🚀oo ", + "0xf9f34cc5c85b184dab5f73987a5e56267ce678c94d489c7f5395f6c689f4" + ], + "Moo é🚀MMoéo🚀o🚀oo ooéoé🚀M🚀ooMMM oMéoéooo🚀 oo🚀🚀o🚀🚀ooéMé🚀o é🚀oooM", + "0x41aBa07653CF095ef00019df15cB694F8a3F496C" + ], + [ + ["3501433467401227308675675358196623"], + ["4478129566979578900280158836831340"], + [ + "1354004295542064315260428212779051", + "1651940248756015948685875254008851" + ], + [] + ], + false + ] + ], + [ + [ + "0xd188f2eb918e1c3678", + [ + false, + "Moo é🚀 M Mo🚀MMoé🚀🚀 é🚀éoMMo", + [ + "19921202998329402", + [ + "0x91efc664009c", + true, + "Moo é🚀éM🚀🚀 Mo o🚀Mééoé🚀 🚀é 🚀 oooooéo🚀M🚀éooéoM oMoMéMoo🚀Mo 🚀" + ], + [ + "Moo é🚀", + true, + "-34853778802574078864607668903207415147089005813637425486660581000432795868354" + ], + [ + "-4986273949011994826117656293701", + [ + [ + [ + "0x1aab4ed8883174b501f54aeb7d0d4602c93cb428b2178d4b7e5d2a" + ], + "Moo é🚀 o🚀 oo 🚀MMo", + [ + true, + "0xB8c72E057Bd699Fb60E3d241113AFB68CaB74F7c", + "0xc28A699999EEe79100dB2911fFb44Af237efa261", + "0xbe24517fe6547CE354b911a96221e3B0Fc411A4F", + [ + "0x4018a5B4f4Eb4eFAf80f60E664C20B4619DBE3b7", + "0x43AF520CF1E78A3e5Edd906cF096C59Dab98701f" + ] + ], + true + ] + ] + ], + ["0x9362b4b7041fcc5a3082d548b8f5fbc9b6fda237d07a6bf8df941f7e15bbb4"] + ], + false, + true + ], + [ + "Moo é🚀 é🚀o Mo ooo🚀 oo éoo éM oo oMooooéo éoo o", + false, + [ + "10063822234314344704186891101443545386702886148609390173024633172", + "0xdca5466aa8187330679e5caa01d2823cfdc605447e08", + [ + "Moo é🚀éMo🚀o 🚀éooé 🚀 🚀é🚀MéoéM ooMM", + false, + [true, true, false], + "0x8d2c525bd7c61732ad6c" + ], + "Moo é🚀🚀MéooMMoéé", + "0x879267f6080428c1cf36b306026357777a4a64c5f4ce84d16a58ec1b164a" + ], + "Moo é🚀oé🚀🚀oM", + "0x4A6EDfA108dcD4DeB780d3e2ee72C8AbD7830807" + ], + [ + [ + "4351667443914206212854853018692721", + "1517345222968682662142905391693174", + "3129906759525319741443462987241790" + ], + [ + "197210087679507814586905804169353", + "515529612669684159505153039132691", + "3127533943137336830095649740682130", + "4690845167942691342852280970213394" + ], + [ + "1594614299129406019292472164413327", + "4402712699161965853857467515963280", + "2272433561112655291394457249640581", + "3693414381600129884772179742807467" + ], + ["4853646781089043191072836236813945"] + ], + true + ], + [ + "0x007db0b7bf377b23a4", + [ + true, + "Moo é🚀éo MMoMoooMoéo é", + [ + "18727119401979969", + ["0x239ec23186a3", true, "Moo é🚀ééé🚀🚀o🚀é "], + [ + "Moo é🚀MéooooMo o🚀 oé M🚀o 🚀🚀é", + false, + "-3401957032145497625429453885115310098237378753282540910148069533561081084690" + ], + [ + "9503075869253945576732871112097", + [ + [ + [ + "0x7ba786850e3be01d5374e16cb110a5f0b463c1bb6ac95ba396becd" + ], + "Moo é🚀🚀éoé🚀é o🚀🚀M ", + [ + true, + "0x9d356c7AA04A105B4634D5DF472696Fe90BA9E52", + "0x2a12DC12f44f2B527e503349578337762f01f7cb", + "0xC01011E87F0d4A5416aac0Aa45D4189123CE07AE", + [ + "0x7F1547A4b5Ee668f9ea78ADC46531c824D0fd65F", + "0x5ebD5e2ddf1AfD70aB20Da1F59552D4d6CCF6091" + ] + ], + true + ] + ] + ], + ["0x62b0dadd1b47d4900b291e875beb3f173bf1ac7a8701e78e17049242a64a96"] + ], + true, + true + ], + [ + "Moo é🚀éooMM oo MéM🚀🚀o 🚀ooo🚀M oooMoéMéMo 🚀oooo🚀🚀éo éé", + false, + [ + "61122460084730887589401861519436335256068040917044125863755700186", + "0x44673e7e80dbfcfd891d5cbc13240a6e61b2dcc66fb0", + [ + "Moo é🚀o oé oé🚀éo🚀 🚀éoo🚀MoM oé🚀 éo M🚀éé Méo🚀ooo🚀oo🚀éoo", + false, + [false, true, false], + "0xf99a38066201c0de2dbb" + ], + "Moo é🚀🚀MéMooéo o🚀M🚀éMo MoMMo🚀M🚀o🚀éoo 🚀ooMoM🚀🚀oéM🚀 é ", + "0xa66df1dddd5cacdb8773bed83e82c915556af9cfbb1cd60b9e93ba443cd7" + ], + "Moo é🚀🚀é", + "0x72D38d5e263e936b9eC9C5E9095da3fE77a7ac3e" + ], + [ + [ + "3843095391395019944319751356282358", + "3527374467356275618008227406752912" + ], + [ + "3025715916080275893188199544395876", + "4762734183378441203526413338708674" + ], + ["2248310426129254510834052394751565"], + [] + ], + true + ], + [ + "0x2d4d4e1e6fc134a99e", + [ + false, + "Moo é🚀o🚀MééoéM 🚀o éoé🚀Mé🚀 o🚀 o🚀🚀éoMéo MMooM éoM🚀éé", + [ + "-21096536789179785", + ["0x83b6e22b89b4", false, "Moo é🚀"], + [ + "Moo é🚀MéMooo🚀éo oM🚀MéMMM🚀 🚀éoé o🚀 🚀éoo M🚀é oo 🚀", + true, + "-35632596317152684293585149403061416555670184918961394017008032728655846225195" + ], + [ + "2692272154424008380290346655986", + [ + [ + [ + "0x9cda0d819f4ddcd4476fdf3cb19b4a93f51408ba361c97bcce02be" + ], + "Moo é🚀🚀éoMé oéoo oMéoooo🚀é🚀🚀 🚀🚀Mooé🚀ooéoé", + [ + true, + "0xB1f5923E517207ee2fB4b4bEe0Ab3d3d19E263FF", + "0x3E6A520EA9d8753Ce9AaA5F8749FDAAbddE23B92", + "0xdD4B72b027345BeaC2cb6315275D601200d78b15", + [ + "0x319A738EF3Fb5Aea84681A2Ede9544C1D6F1a794", + "0x839183E24C35c4358010DC838C766Db13436BeEE" + ] + ], + true + ] + ] + ], + ["0x68af47ae2029cc39b842f7c217b686583617e6040b57bcf2e4e38a24212a54"] + ], + true, + true + ], + [ + "Moo é🚀ééo éMoo🚀ooo 🚀ooééo MM 🚀MM🚀M ", + true, + [ + "25244257055884949875096069331316139460177198992542331600645463177", + "0x334780780af9905eee153d4581f16ae52561a3c50421", + ["Moo é🚀", true, [true, false, true], "0x7f77fae79b343ded5b98"], + "Moo é🚀", + "0x70998e30f82208a475df2e16226cb2c0dc2cdde5d542841a4e6af29c39cc" + ], + "Moo é🚀 é éo oo éoéo🚀 o oéMMoéo🚀MM🚀MéoooooMMM", + "0x729328D745D7280A97AABB91B2553f06d3c85a9E" + ], + [ + ["2502377143484476038673651246124084"], + ["803482201416434846728020011535020"], + ["1969084935455441007698839230581077"], + ["3698994371833325967111580429080967", "4147148449875753158786244866637883"] + ], + false + ], + [ + "0xd46fc91e0203a1e4fc", + [ + true, + "Moo é🚀🚀oo Moo 🚀o ééé🚀o🚀M🚀o🚀M🚀Mo🚀oM M🚀Moo MM", + [ + "27748990894304484", + ["0xe932414f0727", false, "Moo é🚀M🚀éo🚀 oéMooo M o éoooM"], + [ + "Moo é🚀o oéooooééMo🚀éoéMo 🚀🚀é🚀oo🚀 oMé 🚀 🚀oM 🚀 oMoo é ", + true, + "52411836837472820198293125195164928076251432430168676287052327103356919710586" + ], + [ + "1700458549325852792476907623436", + [ + [ + [ + "0x3d2b2a31720f2131dfa00e8ee3315ede5f95edd33a9018ba528d7e" + ], + "Moo é🚀o🚀oo M", + [ + true, + "0xfEa5a295aa12fBd82BAe28FEd0e00EAfBa5D4d35", + "0x21d389e6640268287eb7838576DCB3277bAD6E13", + "0x27b65f3338d28CC7f091022C3D1Bcc3Ae83B13a4", + [ + "0x5Beb62106aBDa3511dad7a32556a7eeade46B0e0", + "0x140278B84f0cd62899aBFD20D159E03460490566" + ] + ], + true + ] + ] + ], + ["0x330e49ed08cc23605e70513cd47b7ecfd406a59bd6b4c8abec201f64f41482"] + ], + false, + false + ], + [ + "Moo é🚀 oM oM MééMMoooMoooééM oooM M éMoo🚀éoMo🚀 🚀o🚀M🚀", + true, + [ + "95258903554469739649272631254932347606007506921841497299313653924", + "0x5058973cd7cb2d84fe12a3c198b1842a0bbe9ddb0ddd", + [ + "Moo é🚀MMé 🚀oooéo ooo🚀 ooMéo oo 🚀M ooM🚀🚀ééééMMMéoMM", + true, + [false, true, true], + "0xccdd6a90e30070c8d892" + ], + "Moo é🚀 éMééM🚀oéMoé éMooMo🚀ooo oéMooo o o 🚀🚀 éoéooo éé", + "0xebf347d511750a76c97ec85df0064defb2112a459ce2682f4de3ee108d74" + ], + "Moo é🚀é🚀oM🚀🚀oMéo 🚀o🚀 MMoo ooMMMo 🚀éMoéooMoM 🚀 🚀", + "0x2DDC2B97fB0F70B538412ed393aDCDc88EDD4C48" + ], + [ + ["171747982968366975167544630288517", "4364508640690874416442345556760859"], + ["3328153896153303566704371299921876"], + [], + [] + ], + false + ] + ] + ], + "verbose": { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x38ff1d4bd09084daac" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-23752578349029843" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xa3041454f737" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀🚀 🚀é🚀Moo " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-38425255964902292425626891154472153534872251544077286003091327836970394458335" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-7117633924389681105262242214326" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xafc32882a67fb6e2a12ef12e5593e8f0fee4476e3cb861b902a2ff" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o éééoéM MMéo🚀 o🚀ooMoé 🚀 ooéMo Mo o🚀o éoéoooéoooooMé " + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x1F3d32b69454A0070322B60eC7426d866026C3E1" + }, + { + "type": "address", + "value": "0x5a81cc72331fD53bfc70072ad9e17efAa54d15f8" + }, + { + "type": "address", + "value": "0x6D23544ED1963A7626Db178130b813Db9989A5F1" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x03DCCB8F62d73B34F5b5e6547dA3996382bf95e3" + }, + { + "type": "address", + "value": "0x80E3a24161B435412256C4C6B7e555E1FE7674A7" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3ee006aedc7376ecd84c916ee5223648efda9cdb16ee49a68fbeaa0972d2a5" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MooM🚀🚀ooMM🚀ooé é oo🚀éo🚀éo ooo🚀M é🚀oé o oM🚀M🚀Méoo" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "72650037408773438030448475368216717356331248262729991183742203537" + }, + { + "type": "hexstring", + "value": "0x9d36abda1a703a914767eba207083d47f0a764bc0c47" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooo o éoé éééoé ooooé MMo🚀Moo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x7decc7fe1bccee97d17b" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x7c194ace6f06432df5a7b6b88d86e9f19b397a1ab0105601fde3c1ab2efc" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀ooMMéo o éoééoM" + }, + { + "type": "address", + "value": "0xae3eDD08Bee48aca623c4C39EaEcd9Fe1A6274Ca" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "955372374163780864986492531553834" + }, + { + "type": "number", + "value": "3024758950298724742608742337127557" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4237546721052470754390151559195610" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2872211107369508497752428063678622" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "111355774438692695778092565387668" + }, + { + "type": "number", + "value": "2260051501091894501614819150953870" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x55906f3ed2d25e1f42" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀🚀o oooéoé🚀" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-13588634728638176" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x9822b712d015" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀oéoooéoMo🚀 oo éMM 🚀🚀o" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀M é M🚀 o oéo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-1381828108252282559403895635677371886389472450581672233661675869401130495396" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-2301286873639017688016524054257" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xb2768925b357944d0ae111562b62207a3183208c8ab4bd31f69f5e" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀 M🚀Mé🚀oo M 🚀ooooéoooMoéoMéM🚀o " + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x55aB8C91f89206F1f5E9b782AA29393F20e86937" + }, + { + "type": "address", + "value": "0xAbdbF1E9feD389D4A969CED2Fa5F60f4170B74E7" + }, + { + "type": "address", + "value": "0xcb5E46bcd1188d4BDC4A5e1252D6ed8b63fEFc50" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4DCEe8608f0dFE1Fb8B0f008D2e460Ec5C2Dd4ce" + }, + { + "type": "address", + "value": "0x68CEdfA366D0cC5B894921CD966fDba4dC9fcae1" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x5556b6b433f517aad338cceb71fa66c0d0ffb00189ae3e905f90b7c9673f33" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀MMMMo M éoMéM M🚀 oé🚀🚀🚀oéo o🚀éo é🚀éoéMoMéé🚀o🚀M oo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "87276849210015664841785584752947167384195780271625904423032121664" + }, + { + "type": "hexstring", + "value": "0x79b8620d9fc052a643f3a29332e373ca3f8d021986e3" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀🚀 Moo🚀🚀ooMoM🚀éMooo🚀 o M o éo o🚀Mé🚀 ooMM Mooééo🚀🚀éo🚀é" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x02f1a6afc51609028dc8" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀M 🚀o 🚀M🚀Mé éoo oo 🚀🚀é🚀MoooooéoM🚀ooo🚀oMMo ooMo " + }, + { + "type": "hexstring", + "value": "0x3b291c86abe0818a70a9f010dd7acbf19e1f2bc3f021c0778f610363ad50" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mé 🚀M🚀oooo🚀 M🚀 oo é" + }, + { + "type": "address", + "value": "0xAd230d50ED982311f04D14A5C9fa475cEBf3624B" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1669460443878462292282980670702483" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4428941743575378706328860399569192" + }, + { + "type": "number", + "value": "1424947952038344969869062031715935" + }, + { + "type": "number", + "value": "4546660216598814792312695772046824" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4296674203415129897678115575897696" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "910863371599992936801945507531803" + }, + { + "type": "number", + "value": "2996372679197759143609789516409237" + }, + { + "type": "number", + "value": "4003478144626770514356714911201572" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x75b5d4ce932f386ef6" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀MééM" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-5051473243263691" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe58fc222ce53" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o🚀é MooMo🚀🚀🚀 oo🚀éé oo o oéM🚀oo🚀M MMéo🚀oé🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMMo🚀oMo🚀é🚀🚀🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-7449863340844524306373980804389553848035409148281865705094943558193151653578" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "62675005066649660926991713638" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x8668d85da31504503ea9b77aef6cee6b9b87107d54a85689791c79" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MoMéo MM éo" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x138A9E491D88E30E2562AADA9bB86De9931DD89f" + }, + { + "type": "address", + "value": "0x7Ec0E8aD2B0482b1661ED6853dE7B8A0A3B54fC6" + }, + { + "type": "address", + "value": "0x23138e20c675b781BE3f96C7992cb4FFc415E1d4" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4212e1bcAF5748c806952257228816e553Ce52A1" + }, + { + "type": "address", + "value": "0xc7C1334dD1a2E8c4F7Bc5c9B0281cf01D9fB03d8" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0xd39bc92ff2aedc0ca315f6f383f38067f4bd3fdcbd5553d41a05ae6121f64a" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MM🚀MoM🚀 MéM🚀oM ooééMoé ooM oo éooMoéo " + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "30148822645983097932041779039543223497977437556495248581884214906" + }, + { + "type": "hexstring", + "value": "0xc2e7db0a808e4f73a557c27c7bf7b66c338b8c2b7e08" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ooéMooé o oo oMéoM oMé 🚀🚀éo🚀oMM🚀o M🚀🚀" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x89cff81cac99fdb50a4c" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 Mé" + }, + { + "type": "hexstring", + "value": "0x1ce56dbf942e1efca45cf426cfe753dcc546c27bf04d6ba4fbdebe8d0f7d" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é🚀éé🚀🚀éoo🚀Mo é o🚀 o🚀🚀🚀🚀oéé🚀 M M🚀Mo🚀MMoooo🚀oé🚀🚀🚀🚀🚀🚀éé🚀🚀" + }, + { + "type": "address", + "value": "0x4f46eC04723d0EfF4FA143Ceb8fcb9d7cEEaCb81" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2883883556144974585492497403330033" + }, + { + "type": "number", + "value": "3926707094420510728063374138913274" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3069091067906313265474471043959744" + }, + { + "type": "number", + "value": "3888745756486092218075146636410400" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4189737722986109909039420415827510" + }, + { + "type": "number", + "value": "276646836850562282958296894968237" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4727416100024242230698001918595878" + }, + { + "type": "number", + "value": "2043457343155596710609380387719796" + }, + { + "type": "number", + "value": "1394517542477882296135882479590824" + }, + { + "type": "number", + "value": "3670692701933182797098307581191731" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0cd7ca5805dc4b06af" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀Méoo🚀M🚀oéoéM🚀o🚀M🚀éoéoéé MMoo" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-8290523448397740" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x765ad85b7426" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀 🚀 oM🚀M🚀oo🚀Mooo éo Mo🚀Moéé é M🚀🚀 oooo🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "10402516873405573710396273875152332705176611010480768234745065173663786546454" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5571910321032267783506139627700" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x6fb989260c92e8bc966195c04f7e2fe9d9875833b429350acc0e5c" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 é🚀🚀oéM🚀M Moo Mo" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "address", + "value": "0x1b139e7d36FDadBcc7Df8c75AdBB6FfA292cEF45" + }, + { + "type": "address", + "value": "0x0F5C24cFcEd9554Fd235F87285C4c5cc47A5b418" + }, + { + "type": "address", + "value": "0x00DA6347a2a1277521bD00823C4DdCd703aEb815" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0xf5e8E208b26D7a51957f530F4764bf9894F58b54" + }, + { + "type": "address", + "value": "0xEED761Fa1dCb2EAF8F93628fAE92acdE6c174478" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7225a3846e77a05674dcfd69efa3437df1171f5ad40ee2d4ff13d1b47ff8c2" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é éoéoMoéé🚀éééo " + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "5439090432067320680194527809638087444230370463897350716633748856" + }, + { + "type": "hexstring", + "value": "0xaa324338c7572bf832363b06c4dbdc46a53eb6666461" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀Mé MéééooM🚀 éo o🚀o" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x539d1fa27354cc2a21be" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀oo " + }, + { + "type": "hexstring", + "value": "0xf9f34cc5c85b184dab5f73987a5e56267ce678c94d489c7f5395f6c689f4" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀MMoéo🚀o🚀oo ooéoé🚀M🚀ooMMM oMéoéooo🚀 oo🚀🚀o🚀🚀ooéMé🚀o é🚀oooM" + }, + { + "type": "address", + "value": "0x41aBa07653CF095ef00019df15cB694F8a3F496C" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3501433467401227308675675358196623" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4478129566979578900280158836831340" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1354004295542064315260428212779051" + }, + { + "type": "number", + "value": "1651940248756015948685875254008851" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd188f2eb918e1c3678" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀 M Mo🚀MMoé🚀🚀 é🚀éoMMo" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "19921202998329402" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x91efc664009c" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀éM🚀🚀 Mo o🚀Mééoé🚀 🚀é 🚀 oooooéo🚀M🚀éooéoM oMoMéMoo🚀Mo 🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-34853778802574078864607668903207415147089005813637425486660581000432795868354" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-4986273949011994826117656293701" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x1aab4ed8883174b501f54aeb7d0d4602c93cb428b2178d4b7e5d2a" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 o🚀 oo 🚀MMo" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xB8c72E057Bd699Fb60E3d241113AFB68CaB74F7c" + }, + { + "type": "address", + "value": "0xc28A699999EEe79100dB2911fFb44Af237efa261" + }, + { + "type": "address", + "value": "0xbe24517fe6547CE354b911a96221e3B0Fc411A4F" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x4018a5B4f4Eb4eFAf80f60E664C20B4619DBE3b7" + }, + { + "type": "address", + "value": "0x43AF520CF1E78A3e5Edd906cF096C59Dab98701f" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9362b4b7041fcc5a3082d548b8f5fbc9b6fda237d07a6bf8df941f7e15bbb4" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 é🚀o Mo ooo🚀 oo éoo éM oo oMooooéo éoo o" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "10063822234314344704186891101443545386702886148609390173024633172" + }, + { + "type": "hexstring", + "value": "0xdca5466aa8187330679e5caa01d2823cfdc605447e08" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éMo🚀o 🚀éooé 🚀 🚀é🚀MéoéM ooMM" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0x8d2c525bd7c61732ad6c" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀MéooMMoéé" + }, + { + "type": "hexstring", + "value": "0x879267f6080428c1cf36b306026357777a4a64c5f4ce84d16a58ec1b164a" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀oé🚀🚀oM" + }, + { + "type": "address", + "value": "0x4A6EDfA108dcD4DeB780d3e2ee72C8AbD7830807" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4351667443914206212854853018692721" + }, + { + "type": "number", + "value": "1517345222968682662142905391693174" + }, + { + "type": "number", + "value": "3129906759525319741443462987241790" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "197210087679507814586905804169353" + }, + { + "type": "number", + "value": "515529612669684159505153039132691" + }, + { + "type": "number", + "value": "3127533943137336830095649740682130" + }, + { + "type": "number", + "value": "4690845167942691342852280970213394" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1594614299129406019292472164413327" + }, + { + "type": "number", + "value": "4402712699161965853857467515963280" + }, + { + "type": "number", + "value": "2272433561112655291394457249640581" + }, + { + "type": "number", + "value": "3693414381600129884772179742807467" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "4853646781089043191072836236813945" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x007db0b7bf377b23a4" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀éo MMoMoooMoéo é" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "18727119401979969" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x239ec23186a3" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀ééé🚀🚀o🚀é " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéooooMo o🚀 oé M🚀o 🚀🚀é" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "-3401957032145497625429453885115310098237378753282540910148069533561081084690" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "9503075869253945576732871112097" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x7ba786850e3be01d5374e16cb110a5f0b463c1bb6ac95ba396becd" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀éoé🚀é o🚀🚀M " + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0x9d356c7AA04A105B4634D5DF472696Fe90BA9E52" + }, + { + "type": "address", + "value": "0x2a12DC12f44f2B527e503349578337762f01f7cb" + }, + { + "type": "address", + "value": "0xC01011E87F0d4A5416aac0Aa45D4189123CE07AE" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x7F1547A4b5Ee668f9ea78ADC46531c824D0fd65F" + }, + { + "type": "address", + "value": "0x5ebD5e2ddf1AfD70aB20Da1F59552D4d6CCF6091" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x62b0dadd1b47d4900b291e875beb3f173bf1ac7a8701e78e17049242a64a96" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀éooMM oo MéM🚀🚀o 🚀ooo🚀M oooMoéMéMo 🚀oooo🚀🚀éo éé" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "61122460084730887589401861519436335256068040917044125863755700186" + }, + { + "type": "hexstring", + "value": "0x44673e7e80dbfcfd891d5cbc13240a6e61b2dcc66fb0" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oé oé🚀éo🚀 🚀éoo🚀MoM oé🚀 éo M🚀éé Méo🚀ooo🚀oo🚀éoo" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xf99a38066201c0de2dbb" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀MéMooéo o🚀M🚀éMo MoMMo🚀M🚀o🚀éoo 🚀ooMoM🚀🚀oéM🚀 é " + }, + { + "type": "hexstring", + "value": "0xa66df1dddd5cacdb8773bed83e82c915556af9cfbb1cd60b9e93ba443cd7" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀é" + }, + { + "type": "address", + "value": "0x72D38d5e263e936b9eC9C5E9095da3fE77a7ac3e" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3843095391395019944319751356282358" + }, + { + "type": "number", + "value": "3527374467356275618008227406752912" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3025715916080275893188199544395876" + }, + { + "type": "number", + "value": "4762734183378441203526413338708674" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2248310426129254510834052394751565" + } + ] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x2d4d4e1e6fc134a99e" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀o🚀MééoéM 🚀o éoé🚀Mé🚀 o🚀 o🚀🚀éoMéo MMooM éoM🚀éé" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "-21096536789179785" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x83b6e22b89b4" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MéMooo🚀éo oM🚀MéMMM🚀 🚀éoé o🚀 🚀éoo M🚀é oo 🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "-35632596317152684293585149403061416555670184918961394017008032728655846225195" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "2692272154424008380290346655986" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x9cda0d819f4ddcd4476fdf3cb19b4a93f51408ba361c97bcce02be" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀éoMé oéoo oMéoooo🚀é🚀🚀 🚀🚀Mooé🚀ooéoé" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xB1f5923E517207ee2fB4b4bEe0Ab3d3d19E263FF" + }, + { + "type": "address", + "value": "0x3E6A520EA9d8753Ce9AaA5F8749FDAAbddE23B92" + }, + { + "type": "address", + "value": "0xdD4B72b027345BeaC2cb6315275D601200d78b15" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x319A738EF3Fb5Aea84681A2Ede9544C1D6F1a794" + }, + { + "type": "address", + "value": "0x839183E24C35c4358010DC838C766Db13436BeEE" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x68af47ae2029cc39b842f7c217b686583617e6040b57bcf2e4e38a24212a54" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀ééo éMoo🚀ooo 🚀ooééo MM 🚀MM🚀M " + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "25244257055884949875096069331316139460177198992542331600645463177" + }, + { + "type": "hexstring", + "value": "0x334780780af9905eee153d4581f16ae52561a3c50421" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0x7f77fae79b343ded5b98" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "hexstring", + "value": "0x70998e30f82208a475df2e16226cb2c0dc2cdde5d542841a4e6af29c39cc" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 é éo oo éoéo🚀 o oéMMoéo🚀MM🚀MéoooooMMM" + }, + { + "type": "address", + "value": "0x729328D745D7280A97AABB91B2553f06d3c85a9E" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2502377143484476038673651246124084" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "803482201416434846728020011535020" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "1969084935455441007698839230581077" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3698994371833325967111580429080967" + }, + { + "type": "number", + "value": "4147148449875753158786244866637883" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xd46fc91e0203a1e4fc" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "string", + "value": "Moo é🚀🚀oo Moo 🚀o ééé🚀o🚀M🚀o🚀M🚀Mo🚀oM M🚀Moo MM" + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "27748990894304484" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xe932414f0727" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀M🚀éo🚀 oéMooo M o éoooM" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀o oéooooééMo🚀éoéMo 🚀🚀é🚀oo🚀 oMé 🚀 🚀oM 🚀 oMoo é " + }, + { + "type": "boolean", + "value": true + }, + { + "type": "number", + "value": "52411836837472820198293125195164928076251432430168676287052327103356919710586" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "1700458549325852792476907623436" + }, + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x3d2b2a31720f2131dfa00e8ee3315ede5f95edd33a9018ba528d7e" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀o🚀oo M" + }, + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "address", + "value": "0xfEa5a295aa12fBd82BAe28FEd0e00EAfBa5D4d35" + }, + { + "type": "address", + "value": "0x21d389e6640268287eb7838576DCB3277bAD6E13" + }, + { + "type": "address", + "value": "0x27b65f3338d28CC7f091022C3D1Bcc3Ae83B13a4" + }, + { + "type": "array", + "value": [ + { + "type": "address", + "value": "0x5Beb62106aBDa3511dad7a32556a7eeade46B0e0" + }, + { + "type": "address", + "value": "0x140278B84f0cd62899aBFD20D159E03460490566" + } + ] + } + ] + }, + { + "type": "boolean", + "value": true + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x330e49ed08cc23605e70513cd47b7ecfd406a59bd6b4c8abec201f64f41482" + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀 oM oM MééMMoooMoooééM oooM M éMoo🚀éoMo🚀 🚀o🚀M🚀" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "number", + "value": "95258903554469739649272631254932347606007506921841497299313653924" + }, + { + "type": "hexstring", + "value": "0x5058973cd7cb2d84fe12a3c198b1842a0bbe9ddb0ddd" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀MMé 🚀oooéo ooo🚀 ooMéo oo 🚀M ooM🚀🚀ééééMMMéoMM" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "hexstring", + "value": "0xccdd6a90e30070c8d892" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀 éMééM🚀oéMoé éMooMo🚀ooo oéMooo o o 🚀🚀 éoéooo éé" + }, + { + "type": "hexstring", + "value": "0xebf347d511750a76c97ec85df0064defb2112a459ce2682f4de3ee108d74" + } + ] + }, + { + "type": "string", + "value": "Moo é🚀é🚀oM🚀🚀oMéo 🚀o🚀 MMoo ooMMMo 🚀éMoéooMoM 🚀 🚀" + }, + { + "type": "address", + "value": "0x2DDC2B97fB0F70B538412ed393aDCDc88EDD4C48" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "171747982968366975167544630288517" + }, + { + "type": "number", + "value": "4364508640690874416442345556760859" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "3328153896153303566704371299921876" + } + ] + }, + { + "type": "array", + "value": [] + }, + { + "type": "array", + "value": [] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50614957806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b6040516100459190613ba3565b60405180910390f35b610056613554565b61005e613554565b610066613581565b61006e6135ae565b680e3fc752f4242136ab60ba1b81526100856135f0565b6001815260408051808201909152600a8152689adede418753e13f3560b71b6020808301919091528201526100b8613624565b665462d81afe59d219815260408051606080820183526000602080840182905283850183815265a3041454f73760d01b855285518087018752600a8152689adede418753e13f3560b71b818401529052808601939093528351808301855282815280840182905280850182905284519283019094526022808352909261419690830139825250600060208201527fab0c136a551c06ca5740fbcba98364c709ced615930af642384d74f368f9e72160408083019190915282015261017a61369a565b6c59d650ca1cfdae6f9e600cb1b51981526101936136b3565b61019b6136e0565b6101a3613707565b7fafc32882a67fb6e2a12ef12e5593e8f0fee4476e3cb861b902a2ff000000000081528152604080516080810190915260578082526000919061458960208301396020830152506101f2613725565b60018152731f3d32b69454a0070322b60ec7426d866026c3e16020820152735a81cc72331fd53bfc70072ad9e17efaa54d15f86040820152736d23544ed1963a7626db178130b813db9989a5f1606082015261024c613751565b7303dccb8f62d73b34f5b5e6547da3996382bf95e381527380e3a24161b435412256c4c6b7e555e1fe7674a76020808301919091526080830191909152604083019190915260016060808401919091529183528301919091528201526102b0613707565b7f3ee006aedc7376ecd84c916ee5223648efda9cdb16ee49a68fbeaa0972d2a500815260808281019190915260408301919091526000606083018190529082015260208201526102fe61376f565b60006040518060800160405280605e8152602001614700605e91398252506001602082015261032b6137a3565b7ab09a3ab1a5f781b6b5e1b6ca17f329af593d22d44d22a13276f6918152759d36abda1a703a914767eba207083d47f0a764bc0c4760501b60208201526103706137be565b6000604051806060016040528060348152602001614494603491398252506000602082015261039d6137da565b600081526001602080830182905260408084019290925283820192909252697decc7fe1bccee97d17b60b01b6060808501919091528482019390935280518082018252600a8152689adede418753e13f3560b71b81840152848401527f7c194ace6f06432df5a7b6b88d86e9f19b397a1ab0105601fde3c1ab2efc00006080808601919091528582019490945280518082018252601d81527f4d6f6f20c3a9f09f9a806f6f4d4dc3a96f206f20c3a96fc3a9c3a96f4d000000928101929092529184015273ae3edd08bee48aca623c4c39eaecd9fe1a6274ca918301919091528201526104886137f8565b60408051600280825260608201835260009260208301908036833701905050905060006d2f1a7ea1ad524564a187a96ab62a905080826000815181106104d0576104d0613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d9521d34955569099d060692aa4859050808260018151811061051857610518613d63565b6001600160701b03929092166020928302919091019091015250815260408051600180825281830190925260009181602001602082028036833701905050905060006dd0ed5bec7137bb65350d98d52bda9050808260008151811061057f5761057f613d63565b6001600160701b03929092166020928302919091018201528301919091525060408051600180825281830190925260009181602001602082028036833701905050905060006d8d9c669f2ceee09cdb6bc6e2e09e905080826000815181106105e9576105e9613d63565b6001600160701b039290921660209283029190910182015260408481019390935282516002808252606082018552600094919350918301908036833701905050905060006d057d81e9b625d239a824bfebd9949050808260008151811061065257610652613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d6f6ddc411317dee9d5e934a87d8e9050808260018151811061069a5761069a613d63565b6001600160701b039290921660209283029190910190910152506060808301919091528201526000608082015281526106d16135ae565b682ac8379f69692f0fa160b91b81526106e86135f0565b6000815260408051808201909152601c81527f4d6f6f20c3a9f09f9a80f09f9a806f206f6f6fc3a96fc3a9f09f9a800000000060208083019190915282015261072f613624565b663046ca91fba6df1981526040805160608082018352818301819052659822b712d01560d01b825260016020808401919091528351918201909352602b8082529192600092906148bb908301396040838101919091526020848101939093528051606080820183528152600081850181815282840182815284518086018652601d81527f4d6f6f20c3a9f09f9a804d2020c3a920204df09f9a80206f206fc3a96f00000097810197909752958352527ffcf1e9bad118689acaecc2bf1124b2472725a6c19d588240ccb544dfd23b925c9093528301919091525061081161369a565b6c1d0bdbe2c397020e466dee8ef019815261082a6136b3565b6108326136e0565b61083a613707565b7fb2768925b357944d0ae111562b62207a3183208c8ab4bd31f69f5e0000000000815281526040805160608101909152603d808252600091906146206020830139602083015250610889613725565b600081527355ab8c91f89206f1f5e9b782aa29393f20e86937602082015273abdbf1e9fed389d4a969ced2fa5f60f4170b74e7604082015273cb5e46bcd1188d4bdc4a5e1252d6ed8b63fefc5060608201526108e3613751565b734dcee8608f0dfe1fb8b0f008d2e460ec5c2dd4ce81527368cedfa366d0cc5b894921cd966fdba4dc9fcae1602080830191909152608083019190915260408301919091526000606080840191909152918352830191909152820152610947613707565b7f5556b6b433f517aad338cceb71fa66c0d0ffb00189ae3e905f90b7c9673f33008152608082810191909152604083019190915260016060830181905290820152602082015261099561376f565b60006040518060a00160405280606381526020016144c860639139825250600060208201526109c26137a3565b7ad428844024b7cb04d2a1d1dd3155fd3eaa4b8539c44cfd9388e94081527579b8620d9fc052a643f3a29332e373ca3f8d021986e360501b6020820152610a076137be565b60006040518060a00160405280606681526020016140ac6066913982525060006020820152610a346137da565b60018082526000602080840182905260408085019390935284830193909352685e34d5f8a2c12051b960b31b60608501528482019390935280516080810190915260568082529091613edc908301396060808401919091527f3b291c86abe0818a70a9f010dd7acbf19e1f2bc3f021c0778f610363ad5000006080840152604080850193909352825190810190925250602c808252600091906146d4602083013960608301525073ad230d50ed982311f04d14a5c9fa475cebf3624b60808201526040820152610b026137f8565b6040805160018082528183019092526000916020808301908036833701905050905060006d524f8da099b62b203f85defd039390508082600081518110610b4b57610b4b613d63565b6001600160701b0392909216602092830291909101909101525081526040805160038082526080820190925260009181602001602082028036833701905050905060006dda5d1a9869902cb7cc6974c1092890508082600081518110610bb357610bb3613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d46415f27d2c1331ad38ee32aae5f90508082600181518110610bfb57610bfb613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006de02aeb7f0964751016f1b03e65e890508082600281518110610c4357610c43613d63565b6001600160701b03929092166020928302919091018201528301919091525060408051600180825281830190925260009181602001602082028036833701905050905060006dd3d7a71f858f66c899942b4f1e6090508082600081518110610cad57610cad613d63565b6001600160701b0392909216602092830291909101820152604084810193909352825160038082526080820190945260009390925090820160608036833701905050905060006d2ce8b649ac152ee2c2ee69bf0c1b90508082600081518110610d1857610d18613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d93bb8a4c3749185ad87d7c00e99590508082600181518110610d6057610d60613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dc562ff9003d90e3ac0375e26792490508082600281518110610da857610da8613d63565b6001600160701b0390921660209283029190910190910152508082600360200201525060608201526000608082015280826001602002015250610de96135ae565b683adaea6749979c377b60b91b8152610e006135f0565b6001815260408051808201909152601081526f4d6f6f20c3a9f09f9a804dc3a9c3a94d60801b602080830191909152820152610e3a613624565b6611f249c441d2ca1981526040805160608082018352600060208084018290528385019290925265e58fc222ce5360d01b83528351608081019094526054808552929390929091614011908301396040808401919091526020808501939093528051606080820183528152600093810184905290810192909252506000604051806060016040528060288152602001613e3960289139825250600160208201527fef8786dabe5bbfe995176b771343d7e0bcac14493576cf39c0060f9259f14936604080830191909152820152610f0f61369a565b6bca838c90b0a8f3a9fdb2c5668152610f266136b3565b610f2e6136e0565b610f36613707565b7f8668d85da31504503ea9b77aef6cee6b9b87107d54a85689791c7900000000008152815260408051808201909152601781527f4d6f6f20c3a9f09f9a804d6f4dc3a96f204d4d20c3a96f000000000000000000602082810191909152820152610f9e613725565b6001815273138a9e491d88e30e2562aada9bb86de9931dd89f6020820152737ec0e8ad2b0482b1661ed6853de7b8a0a3b54fc660408201527323138e20c675b781be3f96c7992cb4ffc415e1d46060820152610ff8613751565b734212e1bcaf5748c806952257228816e553ce52a1815273c7c1334dd1a2e8c4f7bc5c9b0281cf01d9fb03d860208083019190915260808301919091526040830191909152600160608084019190915291835283019190915282015261105c613707565b7fd39bc92ff2aedc0ca315f6f383f38067f4bd3fdcbd5553d41a05ae6121f64a00815260808281019190915260408301919091526000606083015260019082015260208201526110aa61376f565b60006040518060600160405280604081526020016145e060409139825250600160208201526110d76137a3565b7a4949a88c7ac4099fb9911018f6756cea01499c30c2c84044097e7a815275185cfb615011c9ee74aaf84f8f7ef6cd867171856fc160531b602082015261111c6137be565b600060405180608001604052806047815260200161406560479139825250600060208201526111496137da565b6001815260006020808301829052604080840183905284810193909352692273fe072b267f6d429360b21b6060808601919091528584019490945282518084018452600e81526d4d6f6f20c3a9f09f9a80204dc3a960901b81830152938501939093527f1ce56dbf942e1efca45cf426cfe753dcc546c27bf04d6ba4fbdebe8d0f7d0000608085015284820193909352805160c081019091526089808252909161475e90830139606083015250734f46ec04723d0eff4fa143ceb8fcb9d7ceeacb816080820152604082015261121d6137f8565b60408051600280825260608201835260009260208301908036833701905050905060006d8e2fba5680ec2eabb063c2d9bdf19050808260008151811061126557611265613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dc19a02ebadd806a1ba38133db1fa905080826001815181106112ad576112ad613d63565b6001600160701b0392909216602092830291909101909101525081526040805160028082526060820190925260009181602001602082028036833701905050905060006d9751601588221534f0a65e068bc09050808260008151811061131557611315613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dbfbadf38e9c461000510294abe209050808260018151811061135d5761135d613d63565b6001600160701b0392909216602092830291909101820152830191909152506040805160028082526060820190925260009181602001602082028036833701905050905060006dce91ecb822dc8beadcc4508a5e36905080826000815181106113c8576113c8613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d0da3c623f787206aa8b5417491ad9050808260018151811061141057611410613d63565b6001600160701b03929092166020928302919091018201526040848101939093528251600480825260a0820190945260009390925090820160808036833701905050905060006de9146141693db5361b2d064813269050808260008151811061147b5761147b613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d64c00ec8d661be9254108ac20a74905080826001815181106114c3576114c3613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d44c1493300b755bab6568d195da89050808260028151811061150b5761150b613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006db4faa7cdadd426049a13dda926339050808260038151811061155357611553613d63565b6001600160701b0392909216602092830291909101909101525060608083019190915282015260006080820152604082015261158d6135ae565b680cd7ca5805dc4b06af60b81b81526115a46135f0565b600181526040805160608101909152603c808252600091906148e660208301396020830152506115d2613624565b661d742fe924cfab198152604080516060808201835281830152653b2d6c2dba1360d11b8152600160208083019190915282516080810190935260528084529192600092909161465d908301396040838101919091526020848101939093528051606080820183528152600081850181815282840182815284518086018652600a8152689adede418753e13f3560b71b97810197909752958352527f16ff9dabb1d50022b4bf8cfcf46fab2d80c77754ea646c58035f236436f93516909352830191909152506116a061369a565b6c4653d03143e124395e314940b481526116b86136b3565b6116c06136e0565b6116c8613707565b7f6fb989260c92e8bc966195c04f7e2fe9d9875833b429350acc0e5c00000000008152815260408051606081019091526025808252600091906146af6020830139602083015250611717613725565b60008152731b139e7d36fdadbcc7df8c75adbb6ffa292cef456020820152730f5c24cfced9554fd235f87285c4c5cc47a5b418604082015272da6347a2a1277521bd00823c4ddcd703aeb8156060820152611770613751565b73f5e8e208b26d7a51957f530f4764bf9894f58b54815273eed761fa1dcb2eaf8f93628fae92acde6c1744786020808301919091526080830191909152604083019190915260016060808401919091529183528301919091528201526117d4613707565b7f7225a3846e77a05674dcfd69efa3437df1171f5ad40ee2d4ff13d1b47ff8c2008152608082810191909152604083019190915260016060830181905290820152602082015261182261376f565b6000604051806060016040528060278152602001614894602791398252506000602082015261184f6137a3565b7a0d38c118dd25a5c38c5555e02649d877c7426bb80a665937019578815275aa324338c7572bf832363b06c4dbdc46a53eb666646160501b60208201526118946137be565b60006040518060600160405280602881526020016141dd60289139825250600060208201526118c16137da565b60018152600060208083018290526040808401839052848101939093526929ce8fd139aa661510df60b11b60608086019190915285840194909452825180840184526012815271026b7b79061d4f84fcd4037f84fcd4037b7960751b81830152938501939093527ff9f34cc5c85b184dab5f73987a5e56267ce678c94d489c7f5395f6c689f40000608085015284820193909352805160a08101909152606c8082529091613d7a908301396060830152507341aba07653cf095ef00019df15cb694f8a3f496c608082015260408201526119996137f8565b6040805160018082528183019092526000916020808301908036833701905050905060006daca24db860ed2a764031add3738f905080826000815181106119e2576119e2613d63565b6001600160701b03929092166020928302919091019091015250815260408051600180825281830190925260009181602001602082028036833701905050905060006ddcc9f1064e5588c1d8f98575346c90508082600081518110611a4957611a49613d63565b6001600160701b0392909216602092830291909101820152830191909152506040805160028082526060820190925260009181602001602082028036833701905050905060006d42c1efd695fe8e8e1d46421c382b90508082600081518110611ab457611ab4613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d51726ad2ddf3daf20d35cd4e1c1390508082600181518110611afc57611afc613d63565b6001600160701b039290921660209283029190910182015260408481019390935282516000808252918101909352606080850193909352848301939093525060808301919091528201528152611b50613581565b611b586135ae565b681a311e5d7231c386cf60bb1b8152611b6f6135f0565b60008082526040805160608101909152602e8082526143536020830139602083015250611b9a613624565b6646c63a8436c03a815260408051606080820183528183015265247bf199002760d21b81526001602080830191909152825160a0810190935260668084529192600092909161425e908301396040838101919091526020848101939093528051606080820183528152600081850181815282840191825283518085018552600a8152689adede418753e13f3560b71b9681019690965294825260019094527fb2f175d4e86e55c5b49f8ff4e1edb93b04f86c0b7db71563395f5822424aa33e90935283019190915250611c6b61369a565b6c3eef8523b6558188f7059b3144198152611c846136b3565b611c8c6136e0565b611c94613707565b7f1aab4ed8883174b501f54aeb7d0d4602c93cb428b2178d4b7e5d2a00000000008152815260408051808201909152601c81527f4d6f6f20c3a9f09f9a80206ff09f9a80206f6f2020f09f9a804d4d6f00000000602082810191909152820152611cfc613725565b6001815273b8c72e057bd699fb60e3d241113afb68cab74f7c602082015273c28a699999eee79100db2911ffb44af237efa261604082015273be24517fe6547ce354b911a96221e3b0fc411a4f6060820152611d56613751565b734018a5b4f4eb4efaf80f60e664c20b4619dbe3b781527343af520cf1e78a3e5edd906cf096c59dab98701f602080830191909152608083019190915260408301919091526001606080840191909152918352830191909152820152611dba613707565b7f9362b4b7041fcc5a3082d548b8f5fbc9b6fda237d07a6bf8df941f7e15bbb40081526080828101919091526040830191909152600060608301526001908201526020820152611e0861376f565b60006040518060600160405280603e8152602001614381603e913982525060006020820152611e356137a3565b7a1876bb613124927972e7213e5da5b2129d9dc12bd5da150a4f41548152751b94a8cd55030e660cf3cb95403a50479fb8c0a88fc160531b6020820152611e7a6137be565b60006040518060600160405280603a815260200161440d603a913982525060006020820152611ea76137da565b600180825260208083019190915260006040808401919091528381019290925269234b1496f5f185ccab5b60b21b6060808501919091528483019390935281518083018352601a81527f4d6f6f20c3a9f09f9a80f09f9a804dc3a96f6f4d4d6fc3a9c3a900000000000081830152848401527f879267f6080428c1cf36b306026357777a4a64c5f4ce84d16a58ec1b164a00006080808601919091528583019490945281518083018352601781527f4d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a806f4d0000000000000000009181019190915291840191909152734a6edfa108dcd4deb780d3e2ee72c8abd783080791830191909152820152611fab6137f8565b604080516003808252608082019092526000916020820160608036833701905050905060006dd68dc3dde24f3848059dcb9dac7190508082600081518110611ff557611ff5613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d4acf96d6fd5964a893881dd2bd769050808260018151811061203d5761203d613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d9a50fa2e93f8d91e8bcb831fd93e9050808260028151811061208557612085613d63565b6001600160701b03929092166020928302919091019091015250815260408051600480825260a0820190925260009181602001602082028036833701905050905060006d09b9242920dcf58fa812db906089905080826000815181106120ed576120ed613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d196ae604cc1e1c1f7760860de8139050808260018151811061213557612135613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d9a330732dd5ed588d8bf1a43f3929050808260028151811061217d5761217d613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006de746ca336905d7ba48f194557812905080826003815181106121c5576121c5613d63565b6001600160701b03929092166020928302919091018201528301919091525060408051600480825260a0820190925260009181602001602082028036833701905050905060006d4e9edcb0bd5b99f52c39586aef8f9050808260008151811061223057612230613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dd9120bfb63461ff1bbbb19ae87909050808260018151811061227857612278613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006d700a24d911359bd234abf1bdf085905080826002815181106122c0576122c0613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006db6197182958b55f52c4a461bd5ab9050808260038151811061230857612308613d63565b6001600160701b039290921660209283029190910190910152506040808301919091528051600180825281830190925260009181602001602082028036833701905050905060006def4da2957f4ccf2fe207d28b26799050808260008151811061237457612374613d63565b6001600160701b039290921660209283029190910190910152506060808301919091528201526001608082015281526123ab6135ae565b671f6c2defcddec8e960ba1b81526123c16135f0565b6001815260408051808201909152601d81527f4d6f6f20c3a9f09f9a80c3a96f204d4d6f4d6f6f6f4d6fc3a96f20c3a9000000602080830191909152820152612408613624565b66428837439f10418152604080516060808201835281830181815265239ec23186a360d01b83526001602080850191909152845180860186528181527f4d6f6f20c3a9f09f9a80c3a9c3a9c3a9f09f9a80f09f9a806ff09f9a80c3a920818301529091528085019290925282518082018452818152600081840181905281850181905284519283019094526031808352909392613e6190830139825250600060208201527ff87a8f808519361c4278b91e7865745edaacbe63b22bf9831c2f886ca93b44ee6040808301919091528201526124e161369a565b6c77f2181e60fc2d2bc6bc9c35a181526124f96136b3565b6125016136e0565b612509613707565b7f7ba786850e3be01d5374e16cb110a5f0b463c1bb6ac95ba396becd00000000008152815260408051606081019091526025808252600091906141b86020830139602083015250612558613725565b60018152739d356c7aa04a105b4634d5df472696fe90ba9e526020820152732a12dc12f44f2b527e503349578337762f01f7cb604082015273c01011e87f0d4a5416aac0aa45d4189123ce07ae60608201526125b2613751565b737f1547a4b5ee668f9ea78adc46531c824d0fd65f8152735ebd5e2ddf1afd70ab20da1f59552d4d6ccf6091602080830191909152608083019190915260408301919091526001606080840191909152918352830191909152820152612616613707565b7f62b0dadd1b47d4900b291e875beb3f173bf1ac7a8701e78e17049242a64a96008152608082810191909152604083019190915260016060830181905290820152602082015261266461376f565b6000604051806080016040528060558152602001613fbc60559139825250600060208201526126916137a3565b7a949499acc9878d079854d2ddaa8cb994cd73fd41b2153728c4d7da815275044673e7e80dbfcfd891d5cbc13240a6e61b2dcc66fb60541b60208201526126d66137be565b60006040518060800160405280605e815260200161452b605e9139825250600060208201526127036137da565b6000808252600160208084019190915260408084018390528481019390935269f99a38066201c0de2dbb60b01b606085015284830193909352815160808101909252605c8083529092614838908301396060808401919091527fa66df1dddd5cacdb8773bed83e82c915556af9cfbb1cd60b9e93ba443cd7000060808085019190915260408086019490945283518085018552601081526f4d6f6f20c3a9f09f9a80f09f9a80c3a960801b6020820152918501919091527372d38d5e263e936b9ec9c5e9095da3fe77a7ac3e90840152508201526127df6137f8565b60408051600280825260608201835260009260208301908036833701905050905060006dbd7aaeeff42f8781ae7d3245f5f69050808260008151811061282757612827613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dade9b99c9c96a7428a2b28c52c909050808260018151811061286f5761286f613d63565b6001600160701b0392909216602092830291909101909101525081526040805160028082526060820190925260009181602001602082028036833701905050905060006d952de768dfee2aca882015d61864905080826000815181106128d7576128d7613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dead228233bf60a6e27c1abfa8ac29050808260018151811061291f5761291f613d63565b6001600160701b03929092166020928302919091018201528301919091525060408051600180825281830190925260009181602001602082028036833701905050905060006d6ed9aacb7eb566122e035601964d9050808260008151811061298957612989613d63565b6001600160701b03929092166020928302919091018201526040848101939093528251600081528082019093526060808501939093529184019290925260016080840152830191909152506129dc6135ae565b6816a6a70f37e09a54cf60b91b81526129f36135f0565b60008082526040805160808101909152605a8082526141126020830139602083015250612a1e613624565b664af3303d4f5d881981526040805160608082018352600060208084018290528385018381526520edb88ae26d60d21b855285518087018752600a8152689adede418753e13f3560b71b8184015290528086019390935283518083018552918252818301819052818401819052835160808101909452605380855291939092909190613de690830139825250600160208201527fb138aa49c12a635e2126c57c079d8762f3c25027e0d97ab21e57a6c6c88f4ad5604080830191909152820152612ae661369a565b6c21fb3354716fdd255c3f1a20f28152612afe6136b3565b612b066136e0565b612b0e613707565b7f9cda0d819f4ddcd4476fdf3cb19b4a93f51408ba361c97bcce02be0000000000815281526040805160808101909152604a80825260009190613e926020830139602083015250612b5d613725565b6001815273b1f5923e517207ee2fb4b4bee0ab3d3d19e263ff6020820152733e6a520ea9d8753ce9aaa5f8749fdaabdde23b92604082015273dd4b72b027345beac2cb6315275d601200d78b156060820152612bb7613751565b73319a738ef3fb5aea84681a2ede9544c1d6f1a794815273839183e24c35c4358010dc838c766db13436beee602080830191909152608083019190915260408301919091526001606080840191909152918352830191909152820152612c1b613707565b7f68af47ae2029cc39b842f7c217b686583617e6040b57bcf2e4e38a24212a540081526080828101919091526040830191909152600160608301819052908201526020820152612c6961376f565b60006040518060600160405280603a8152602001613f82603a913982525060016020820152612c966137a3565b7a3d5d8a2bfce933d2e746813506090f0194da23fe0d25606b311c89815275334780780af9905eee153d4581f16ae52561a3c5042160501b6020820152612cdb6137be565b60408051808201909152600a8152689adede418753e13f3560b71b602080830191909152908252600190820152612d106137da565b60018082526000602080840182905260408085019390935284830193909352690feeff5cf36687bdab7360b31b6060808601919091528583019490945281518083018352600a8152689adede418753e13f3560b71b81850152858501527f70998e30f82208a475df2e16226cb2c0dc2cdde5d542841a4e6af29c39cc000060808601528582019490945280519283018152808352906143139083013960608301525073729328d745d7280a97aabb91b2553f06d3c85a9e60808201526040820152612dd96137f8565b6040805160018082528183019092526000916020808301908036833701905050905060006d7b6070a262dcfd08377b58214c3490508082600081518110612e2257612e22613d63565b6001600160701b03929092166020928302919091019091015250815260408051600180825281830190925260009181602001602082028036833701905050905060006d279d5f038b08b726ebc86ab04aac90508082600081518110612e8957612e89613d63565b6001600160701b03929092166020928302919091018201528301919091525060408051600180825281830190925260009181602001602082028036833701905050905060006d6115589314376bbc62d12229895590508082600081518110612ef357612ef3613d63565b6001600160701b039290921660209283029190910182015260408481019390935282516002808252606082018552600094919350918301908036833701905050905060006db65fdf6e52c34a4bec764d38598790508082600081518110612f5c57612f5c613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dcc785f5b1dd72eec12a72382803b90508082600181518110612fa457612fa4613d63565b6001600160701b03929092166020928302919091019091015250606080830191909152820152600060808201526040820152612fde6135ae565b68351bf2478080e8793f60ba1b8152612ff56135f0565b600181526040805160808101909152604d808252600091906144476020830139602083015250613023613624565b6662958f69216ce4815260408051606080820183526000602080840182905283850183905265e932414f072760d01b84528451928301909452602a808352929390929061416c90830139604080840191909152602080850193909352805160608082018352815260009381018490529081019290925250600060405180608001604052806059815260200161420560599139825250600160208201527f73e00c63a9eea27b43c7754f1611980edc86af7f2d1a6842463236949bb9837a6040808301919091528201526130f461369a565b6c15767a582e082d8b3de648540c815261310c6136b3565b6131146136e0565b61311c613707565b7f3d2b2a31720f2131dfa00e8ee3315ede5f95edd33a9018ba528d7e0000000000815281526040805180820190915260148152734d6f6f20c3a9f09f9a806ff09f9a806f6f20204d60601b60208281019190915282015261317b613725565b6001815273fea5a295aa12fbd82bae28fed0e00eafba5d4d3560208201527321d389e6640268287eb7838576dcb3277bad6e1360408201527327b65f3338d28cc7f091022c3d1bcc3ae83b13a460608201526131d5613751565b735beb62106abda3511dad7a32556a7eeade46b0e0815273140278b84f0cd62899abfd20d159e03460490566602080830191909152608083019190915260408301919091526001606080840191909152918352830191909152820152613239613707565b7f330e49ed08cc23605e70513cd47b7ecfd406a59bd6b4c8abec201f64f41482008152608082810191909152604083019190915260006060830181905290820152602082015261328761376f565b60006040518060800160405280605181526020016147e760519139825250600160208201526132b46137a3565b7ae78fc2df20febd331f2f845acf60009a63596675aa5dbe6b0e78a48152755058973cd7cb2d84fe12a3c198b1842a0bbe9ddb0ddd60501b60208201526132f96137be565b60006040518060800160405280604e81526020016143bf604e9139825250600160208201526133266137da565b6000808252600160208084018290526040808501929092528482019390935269666eb548718038646c4960b11b6060850152848101939093528251608081019093526050808452909291613f32908301396060830152507febf347d511750a76c97ec85df0064defb2112a459ce2682f4de3ee108d7400006080808301919091526040808401929092528151908101909152604f808252600091906142c46020830139606083015250732ddc2b97fb0f70b538412ed393adcdc88edd4c48608082015260408201526133f66137f8565b60408051600280825260608201835260009260208301908036833701905050905060006d0877c3a9c1ab582dfb7b8225a0859050808260008151811061343e5761343e613d63565b60200260200101906001600160701b031690816001600160701b0316815250505060006dd72fd802e650189420f0c2ff591b9050808260018151811061348657613486613d63565b6001600160701b03929092166020928302919091019091015250815260408051600180825281830190925260009181602001602082028036833701905050905060006da417353a7da761dd39dedcfa2fd4905080826000815181106134ed576134ed613d63565b6001600160701b03929092166020928302919091018201528381019290925250604080516000808252818401835282850191909152815181815280840190925260608085019290925284820193909352608084019290925290830191909152820152919050565b60405180604001604052806002905b61356b613581565b8152602001906001900390816135635790505090565b60405180608001604052806004905b6135986135ae565b8152602001906001900390816135905790505090565b6040805160a0810190915260008152602081016135c96135f0565b81526020016135d661376f565b81526020016135e36137f8565b8152600060209091015290565b6040805160a0810182526000815260606020820152908101613610613624565b815260006020820181905260409091015290565b6040518060a00160405280600060060b815260200161365b6040805160608082018352600080835260208301529181019190915290565b8152604080516060808201835281526000602082810182905292820152910190815260200161368861369a565b8152602001613695613707565b905290565b60405180604001604052806000600c0b81526020016136955b60405180602001604052806001905b6136ca6136e0565b8152602001906001900390816136c25790505090565b60405180608001604052806136f3613707565b8152602001606081526020016135e3613725565b60405180602001604052806001906020820280368337509192915050565b6040805160a0810182526000808252602082018190529181018290526060810191909152608081016136955b60405180604001604052806002906020820280368337509192915050565b6040805160a081018252606081526000602082015290810161378f6137a3565b815260606020820152600060409091015290565b6040805160a0810182526000808252602082015290810161378f5b6040805160808101825260608152600060208201529081016135e35b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004905b60608152602001906001900390816138075790505090565b6000815180845260005b8181101561384557602081850181015186830182015201613829565b81811115613857576000602083870101525b50601f01601f19169290920160200192915050565b6000815160608452613881606085018261381f565b9050602083015115156020850152604083015160408501528091505092915050565b600060408084018351600c0b85526020808501518382880152828390506060935083880160005b60018082106138d957506139b8565b8a8303603f1901845284518051610120908560005b8581101561391157825164ffffffffff19168252918a0191908a019085016138ee565b5050508782015181898701526139298287018261381f565b838c015180511515888e01528a8101516001600160a01b039081168d8a0152818e015181166080808b01919091528d830151821660a08b01529091015191935090915060c087019060005b600281101561399257835182168352928b0192918b01918601613974565b5050505090880151151561010094909401939093525092840192918401916001016138ca565b5098975050505050505050565b8060005b60018110156139ec57815160ff19168452602093840193909101906001016139c9565b50505050565b6000815160a08452613a0760a085018261381f565b90506020808401511515818601526040840151858303604087015260018060d81b03815116835269ffffffffffffffffffff19828201511682840152604081015160a06040850152805160c060a0860152613a6661016086018261381f565b905083820151151560c0860152604082015160e0860160005b6003811015613a9e578251151582529186019190860190600101613a7f565b50505060608201516001600160b01b031981166101408701529350606083015193508481036060860152613ad2818561381f565b9350505060808101519050613aee608084018261ffff19169052565b50606084015191508481036060860152613b08818361381f565b9150506080830151613b2560808601826001600160a01b03169052565b509392505050565b60008260808101836000805b6004811015613b97578484038852825180518086526020918201918087019190855b82811015613b805784516001600160701b031684529381019392810192600101613b5b565b509a8b019a91965050939093019250600101613b39565b50919695505050505050565b6020808252600090606083820181850186855b6002811015613d5657878303601f190184528151836080810160005b6004811015613d41578682038352835168ffffffffffffffffff60b81b81511683528a81015160a08c8501528051151560a08501528b81015160a060c0860152613c2061014086018261381f565b90506040820151609f198683030160e0870152805160060b82528d81015160a08f84015265ffffffffffff60d01b81511660a08401528e810151151560c0840152604081015190508d60e0840152613c7c61010084018261381f565b905060408201518382036040850152613c95828261386c565b9150508d8201518382038f850152613cad82826138a3565b91505060808201519150613cc460808401836139c5565b8d840151801515610100890152608090940151801515610120890152939250604085015193508681036040880152613cfc81856139f2565b93505050508a8201518482038c860152613d168282613b2d565b91505060808201519150613d2e608085018315159052565b948b0194938b0193925050600101613bd2565b50958801959450505090850190600101613bb6565b5090979650505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a804d4d6fc3a96ff09f9a806ff09f9a806f6f206f6fc3a96fc3a9f09f9a804df09f9a806f6f4d4d4d20206f4dc3a96fc3a96f6f6ff09f9a80206f6ff09f9a80f09f9a806ff09f9a80f09f9a806f6fc3a94dc3a9f09f9a806f20c3a9f09f9a806f6f6f4d4d6f6f20c3a9f09f9a804dc3a94d6f6f6ff09f9a80c3a96f20206f4df09f9a804dc3a94d4d4df09f9a8020f09f9a80c3a96fc3a9206ff09f9a8020f09f9a80c3a96f6f204df09f9a80c3a9206f6f20f09f9a804d6f6f20c3a9f09f9a80c3a94d4d6ff09f9a806f4d6ff09f9a80c3a9f09f9a80f09f9a80f09f9a804d6f6f20c3a9f09f9a804dc3a96f6f6f6f4d6f206ff09f9a802020206fc3a9204df09f9a806f20f09f9a80f09f9a80c3a94d6f6f20c3a9f09f9a80f09f9a80c3a96f4dc3a9206fc3a96f6f206f4dc3a96f6f6f6ff09f9a80c3a9f09f9a80f09f9a8020f09f9a80f09f9a804d6f6fc3a9f09f9a806f6fc3a96fc3a94d6f6f20c3a9f09f9a804d2020f09f9a806f20f09f9a804df09f9a804dc3a920c3a96f6f206f6f2020f09f9a80f09f9a80c3a9f09f9a804d6f6f6f6f6fc3a96f4df09f9a806f6f6ff09f9a806f4d4d6f206f6f4d6f204d6f6f20c3a9f09f9a8020c3a94dc3a9c3a94df09f9a806fc3a94d6fc3a920c3a94d6f6f4d6ff09f9a806f6f6f206fc3a94d6f6f6f206f206f20f09f9a80f09f9a8020c3a96fc3a96f6f6f20c3a9c3a94d6f6f20c3a9f09f9a80c3a9c3a96f20c3a94d6f6ff09f9a806f6f6f2020f09f9a806f6fc3a9c3a96f204d4d20f09f9a804d4df09f9a804d20204d6f6f20c3a9f09f9a80c3a96f6f4d4d20206f6f204dc3a94df09f9a80f09f9a806f20f09f9a806f6f6ff09f9a804d206f6f6f4d6fc3a94dc3a94d6f20f09f9a806f6f6f6ff09f9a80f09f9a80c3a96f20c3a9c3a94d6f6f20c3a9f09f9a806ff09f9a80c3a9204d6f6f4d6ff09f9a80f09f9a80f09f9a80206f6ff09f9a80c3a9c3a9206f6f206f206fc3a94df09f9a806f6ff09f9a804d204d4dc3a96ff09f9a806fc3a9f09f9a804d6f6f20c3a9f09f9a806f6fc3a94d6f6fc3a9206f206f6f20206f4dc3a96f4d206f4dc3a920f09f9a80f09f9a80c3a96ff09f9a806f4d4df09f9a806f204df09f9a80f09f9a804d6f6f20c3a9f09f9a80f09f9a80204d6f6ff09f9a80f09f9a806f6f4d6f4df09f9a80c3a94d6f6f6ff09f9a802020206f204d206f2020c3a96f206ff09f9a804dc3a9f09f9a80206f6f4d4d204d6f6fc3a9c3a96ff09f9a80f09f9a80c3a96ff09f9a80c3a94d6f6f20c3a9f09f9a806ff09f9a804dc3a9c3a96fc3a94d20f09f9a806f20c3a96fc3a9f09f9a804dc3a9f09f9a8020206ff09f9a80206ff09f9a80f09f9a80c3a96f4dc3a96f204d4d6f6f4d20c3a96f4df09f9a80c3a9c3a94d6f6f20c3a9f09f9a804df09f9a80c3a96ff09f9a80206fc3a94d6f6f6f20204d206f20c3a96f6f6f4d4d6f6f20c3a9f09f9a80f09f9a80f09f9a8020f09f9a80c3a9f09f9a804d6f6f20204d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a9f09f9a80c3a9206ff09f9a80f09f9a804d204d6f6f20c3a9f09f9a804dc3a9204dc3a9c3a9c3a96f6f4df09f9a802020c3a96f206ff09f9a806f4d6f6f20c3a9f09f9a806f206fc3a96f6f6f6fc3a9c3a94d6ff09f9a80c3a96fc3a94d6f20f09f9a80f09f9a80c3a9f09f9a806f6ff09f9a80206f4dc3a920f09f9a802020f09f9a806f4d20f09f9a80206f4d6f6f20c3a9204d6f6f20c3a9f09f9a80c3a94df09f9a80f09f9a80204d6f206ff09f9a804dc3a9c3a96fc3a9f09f9a8020f09f9a80c3a920f09f9a80206f6f6f6f6fc3a96ff09f9a804df09f9a80c3a96f6fc3a96f4d20206f4d6f4dc3a94d6f6ff09f9a804d6f20f09f9a804d6f6f20c3a9f09f9a80c3a9f09f9a806f4df09f9a80f09f9a806f4dc3a96f20f09f9a806ff09f9a80204d4d6f6f206f6f4d4d4d6f20f09f9a80c3a94d6fc3a96f6f4d6f4d20f09f9a8020f09f9a804d6f6f20c3a9f09f9a8020c3a920c3a96f206f6f20c3a96fc3a96ff09f9a80206f206fc3a94d4d6fc3a96ff09f9a804d4df09f9a804dc3a96f6f6f6f6f4d4d4d4d6f6f20c3a9f09f9a80204d204d6ff09f9a804d4d6fc3a9f09f9a80f09f9a802020c3a9f09f9a80c3a96f4d4d6f4d6f6f20c3a9f09f9a8020c3a9f09f9a806f204d6f206f6f6ff09f9a80206f6f20c3a96f6f20c3a94d20206f6f206f4d6f6f6f6fc3a96f20c3a96f6f206f4d6f6f20c3a9f09f9a804d4dc3a920f09f9a806f6f6fc3a96f206f6f6ff09f9a8020206f6f4dc3a96f206f6f20f09f9a804d206f6f4df09f9a80f09f9a80c3a9c3a9c3a9c3a94d4d4dc3a96f4d4d4d6f6f20c3a9f09f9a80c3a94d6ff09f9a806f20f09f9a80c3a96f6fc3a920f09f9a8020f09f9a80c3a9f09f9a804dc3a96fc3a94d206f6f4d4d4d6f6f20c3a9f09f9a80f09f9a806f6f204d6f6f20f09f9a806f20c3a9c3a9c3a9f09f9a806ff09f9a804df09f9a806ff09f9a804df09f9a804d6ff09f9a806f4d204df09f9a804d6f6f204d4d4d6f6f20c3a9f09f9a806f6f6f206f20c3a96fc3a92020c3a9c3a9c3a96fc3a92020206f6f6f6fc3a9204d4d6ff09f9a804d6f6f4d6f6f20c3a9f09f9a80f09f9a804d4d4d4d6f20204d20c3a96f4dc3a94d204df09f9a8020206fc3a9f09f9a80f09f9a80f09f9a806fc3a96f20206ff09f9a80c3a96f20c3a9f09f9a80c3a96fc3a94d6f4dc3a9c3a9f09f9a806ff09f9a804d206f6f4d6f6f20c3a9f09f9a806f206fc3a9206fc3a9f09f9a80c3a96ff09f9a8020f09f9a80c3a96f6ff09f9a804d6f4d206fc3a9f09f9a8020c3a96f204df09f9a80c3a9c3a9204dc3a96ff09f9a806f6f6ff09f9a806f6ff09f9a80c3a96f6f4d6f6f20c3a9f09f9a806f20c3a9c3a9c3a96fc3a94d20204d4dc3a96ff09f9a80206ff09f9a806f6f4d6fc3a920f09f9a80206f6fc3a94d6f204d6f206ff09f9a806f20c3a96fc3a96f6f6fc3a96f6f6f6f6f4dc3a9204d6f6f20c3a9f09f9a804d4df09f9a804d6f4df09f9a80204dc3a94df09f9a806f4d206f6fc3a9c3a94d6fc3a920206f6f4d206f6f20c3a96f6f4d6fc3a96f204d6f6f20c3a9f09f9a806ff09f9a80204df09f9a804dc3a9f09f9a806f6f204d20f09f9a806f6f6f6fc3a96f6f6f4d6fc3a96f4dc3a94df09f9a806f204d6f6f20c3a9f09f9a8020f09f9a80206f4df09f9a804df09f9a806f6ff09f9a804d6f6f6f2020202020c3a96f204d6ff09f9a804d6fc3a9c3a920c3a920204df09f9a80f09f9a8020206f6f6f6ff09f9a804d6f6f20c3a9f09f9a8020c3a9f09f9a80f09f9a806fc3a94df09f9a804d204d6f6f204d6f4d6f6f20c3a9f09f9a804dc3a92020f09f9a804df09f9a806f6f6f6ff09f9a80204df09f9a80206f6f20c3a94d6f6f20c3a9f09f9a804d6f6f4df09f9a80f09f9a806f6f4d4df09f9a806f6fc3a920c3a92020206f6ff09f9a80c3a96ff09f9a80c3a96f206f6f6ff09f9a804d20c3a9f09f9a806fc3a9206f206f4df09f9a804df09f9a804dc3a96f6f4d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9c3a9f09f9a80f09f9a80c3a96f6ff09f9a804d6f20c3a9206ff09f9a80206ff09f9a80f09f9a80f09f9a80f09f9a806fc3a9c3a9f09f9a80204d204df09f9a804d6ff09f9a804d4d6f6f6f6ff09f9a806fc3a9f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80c3a9c3a9f09f9a80f09f9a804d6f6f20c3a9f09f9a80206f4d206f4d204dc3a9c3a94d4d6f6f6f4d6f6f6fc3a9c3a94d2020206f6f6f4d2020204d20c3a94d6f6ff09f9a80c3a96f4d6ff09f9a8020f09f9a806ff09f9a804df09f9a804d6f6f20c3a9f09f9a80f09f9a804dc3a94d6f6fc3a96f206ff09f9a804df09f9a80c3a94d6f204d6f4d4d6ff09f9a804df09f9a806ff09f9a80c3a96f6f20f09f9a806f6f4d6f4df09f9a80f09f9a806fc3a94df09f9a8020c3a9204d6f6f20c3a9f09f9a8020c3a920c3a96fc3a96f4d6fc3a9c3a9f09f9a80c3a9c3a9c3a96f20204d6f6f20c3a9f09f9a806fc3a96f6f6fc3a96f4d6ff09f9a80206f6f20c3a94d4d20f09f9a80f09f9a806f4d6f6f20c3a9f09f9a804dc3a96f6ff09f9a804df09f9a806fc3a96fc3a94df09f9a806ff09f9a804df09f9a80c3a96fc3a96fc3a9c3a9204d4d6f6fa26469706673582212206f93603547179744c5638b5701ab59c2ee9d475270b84c853cf9f9a44da293e164736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_4dc1782d {\n bytes6 s_0;\n bool s_1;\n string s_2;\n }\n\n struct S_75b95287 {\n string s_0;\n bool s_1;\n int256 s_2;\n }\n\n struct S_59e4d3e3 {\n bool s_0;\n address s_1;\n address s_2;\n address s_3;\n address[2] s_4;\n }\n\n struct S_b0e02723 {\n bytes27[1] s_0;\n string s_1;\n S_59e4d3e3 s_2;\n bool s_3;\n }\n\n struct S_8a864324 {\n int104 s_0;\n S_b0e02723[1] s_1;\n }\n\n struct S_6e8ed41f {\n int56 s_0;\n S_4dc1782d s_1;\n S_75b95287 s_2;\n S_8a864324 s_3;\n bytes31[1] s_4;\n }\n\n struct S_4cbd9404 {\n bool s_0;\n string s_1;\n S_6e8ed41f s_2;\n bool s_3;\n bool s_4;\n }\n\n struct S_8f5c69d2 {\n string s_0;\n bool s_1;\n bool[3] s_2;\n bytes10 s_3;\n }\n\n struct S_e1fe1757 {\n uint216 s_0;\n bytes22 s_1;\n S_8f5c69d2 s_2;\n string s_3;\n bytes30 s_4;\n }\n\n struct S_4f245c87 {\n string s_0;\n bool s_1;\n S_e1fe1757 s_2;\n string s_3;\n address s_4;\n }\n\n struct S_cacfb88b {\n bytes9 s_0;\n S_4cbd9404 s_1;\n S_4f245c87 s_2;\n uint112[][4] s_3;\n bool s_4;\n }\n\n function test () public pure returns (S_cacfb88b[4][2] memory) {\n S_cacfb88b[4][2] memory r;\n {\n S_cacfb88b[4] memory r_0;\n {\n S_cacfb88b memory r_0_0;\n {\n bytes9 r_0_0_0 = bytes9(0x38ff1d4bd09084daac);\n r_0_0.s_0 = r_0_0_0;\n }\n {\n S_4cbd9404 memory r_0_0_1;\n {\n bool r_0_0_1_0 = true;\n r_0_0_1.s_0 = r_0_0_1_0;\n }\n {\n string memory r_0_0_1_1 = unicode\"Moo é🚀\";\n r_0_0_1.s_1 = r_0_0_1_1;\n }\n {\n S_6e8ed41f memory r_0_0_1_2;\n {\n int56 r_0_0_1_2_0 = -23752578349029843;\n r_0_0_1_2.s_0 = r_0_0_1_2_0;\n }\n {\n S_4dc1782d memory r_0_0_1_2_1;\n {\n bytes6 r_0_0_1_2_1_0 = bytes6(0xa3041454f737);\n r_0_0_1_2_1.s_0 = r_0_0_1_2_1_0;\n }\n {\n bool r_0_0_1_2_1_1 = false;\n r_0_0_1_2_1.s_1 = r_0_0_1_2_1_1;\n }\n {\n string memory r_0_0_1_2_1_2 = unicode\"Moo é🚀\";\n r_0_0_1_2_1.s_2 = r_0_0_1_2_1_2;\n }\n r_0_0_1_2.s_1 = r_0_0_1_2_1;\n }\n {\n S_75b95287 memory r_0_0_1_2_2;\n {\n string memory r_0_0_1_2_2_0 = unicode\"Moo é🚀🚀🚀 🚀é🚀Moo \";\n r_0_0_1_2_2.s_0 = r_0_0_1_2_2_0;\n }\n {\n bool r_0_0_1_2_2_1 = false;\n r_0_0_1_2_2.s_1 = r_0_0_1_2_2_1;\n }\n {\n int r_0_0_1_2_2_2 = -38425255964902292425626891154472153534872251544077286003091327836970394458335;\n r_0_0_1_2_2.s_2 = r_0_0_1_2_2_2;\n }\n r_0_0_1_2.s_2 = r_0_0_1_2_2;\n }\n {\n S_8a864324 memory r_0_0_1_2_3;\n {\n int104 r_0_0_1_2_3_0 = -7117633924389681105262242214326;\n r_0_0_1_2_3.s_0 = r_0_0_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_0_0_1_2_3_1;\n {\n S_b0e02723 memory r_0_0_1_2_3_1_0;\n {\n bytes27[1] memory r_0_0_1_2_3_1_0_0;\n {\n bytes27 r_0_0_1_2_3_1_0_0_0 = bytes27(0xafc32882a67fb6e2a12ef12e5593e8f0fee4476e3cb861b902a2ff);\n r_0_0_1_2_3_1_0_0[0] = r_0_0_1_2_3_1_0_0_0;\n }\n r_0_0_1_2_3_1_0.s_0 = r_0_0_1_2_3_1_0_0;\n }\n {\n string memory r_0_0_1_2_3_1_0_1 = unicode\"Moo é🚀o éééoéM MMéo🚀 o🚀ooMoé 🚀 ooéMo Mo o🚀o éoéoooéoooooMé \";\n r_0_0_1_2_3_1_0.s_1 = r_0_0_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_0_0_1_2_3_1_0_2;\n {\n bool r_0_0_1_2_3_1_0_2_0 = true;\n r_0_0_1_2_3_1_0_2.s_0 = r_0_0_1_2_3_1_0_2_0;\n }\n {\n address r_0_0_1_2_3_1_0_2_1 = 0x1F3d32b69454A0070322B60eC7426d866026C3E1;\n r_0_0_1_2_3_1_0_2.s_1 = r_0_0_1_2_3_1_0_2_1;\n }\n {\n address r_0_0_1_2_3_1_0_2_2 = 0x5a81cc72331fD53bfc70072ad9e17efAa54d15f8;\n r_0_0_1_2_3_1_0_2.s_2 = r_0_0_1_2_3_1_0_2_2;\n }\n {\n address r_0_0_1_2_3_1_0_2_3 = 0x6D23544ED1963A7626Db178130b813Db9989A5F1;\n r_0_0_1_2_3_1_0_2.s_3 = r_0_0_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_0_0_1_2_3_1_0_2_4;\n {\n address r_0_0_1_2_3_1_0_2_4_0 = 0x03DCCB8F62d73B34F5b5e6547dA3996382bf95e3;\n r_0_0_1_2_3_1_0_2_4[0] = r_0_0_1_2_3_1_0_2_4_0;\n }\n {\n address r_0_0_1_2_3_1_0_2_4_1 = 0x80E3a24161B435412256C4C6B7e555E1FE7674A7;\n r_0_0_1_2_3_1_0_2_4[1] = r_0_0_1_2_3_1_0_2_4_1;\n }\n r_0_0_1_2_3_1_0_2.s_4 = r_0_0_1_2_3_1_0_2_4;\n }\n r_0_0_1_2_3_1_0.s_2 = r_0_0_1_2_3_1_0_2;\n }\n {\n bool r_0_0_1_2_3_1_0_3 = true;\n r_0_0_1_2_3_1_0.s_3 = r_0_0_1_2_3_1_0_3;\n }\n r_0_0_1_2_3_1[0] = r_0_0_1_2_3_1_0;\n }\n r_0_0_1_2_3.s_1 = r_0_0_1_2_3_1;\n }\n r_0_0_1_2.s_3 = r_0_0_1_2_3;\n }\n {\n bytes31[1] memory r_0_0_1_2_4;\n {\n bytes31 r_0_0_1_2_4_0 = bytes31(0x3ee006aedc7376ecd84c916ee5223648efda9cdb16ee49a68fbeaa0972d2a5);\n r_0_0_1_2_4[0] = r_0_0_1_2_4_0;\n }\n r_0_0_1_2.s_4 = r_0_0_1_2_4;\n }\n r_0_0_1.s_2 = r_0_0_1_2;\n }\n {\n bool r_0_0_1_3 = false;\n r_0_0_1.s_3 = r_0_0_1_3;\n }\n {\n bool r_0_0_1_4 = false;\n r_0_0_1.s_4 = r_0_0_1_4;\n }\n r_0_0.s_1 = r_0_0_1;\n }\n {\n S_4f245c87 memory r_0_0_2;\n {\n string memory r_0_0_2_0 = unicode\"Moo é🚀MooM🚀🚀ooMM🚀ooé é oo🚀éo🚀éo ooo🚀M é🚀oé o oM🚀M🚀Méoo\";\n r_0_0_2.s_0 = r_0_0_2_0;\n }\n {\n bool r_0_0_2_1 = true;\n r_0_0_2.s_1 = r_0_0_2_1;\n }\n {\n S_e1fe1757 memory r_0_0_2_2;\n {\n uint216 r_0_0_2_2_0 = 72650037408773438030448475368216717356331248262729991183742203537;\n r_0_0_2_2.s_0 = r_0_0_2_2_0;\n }\n {\n bytes22 r_0_0_2_2_1 = bytes22(0x9d36abda1a703a914767eba207083d47f0a764bc0c47);\n r_0_0_2_2.s_1 = r_0_0_2_2_1;\n }\n {\n S_8f5c69d2 memory r_0_0_2_2_2;\n {\n string memory r_0_0_2_2_2_0 = unicode\"Moo é🚀ooo o éoé éééoé ooooé MMo🚀Moo\";\n r_0_0_2_2_2.s_0 = r_0_0_2_2_2_0;\n }\n {\n bool r_0_0_2_2_2_1 = false;\n r_0_0_2_2_2.s_1 = r_0_0_2_2_2_1;\n }\n {\n bool[3] memory r_0_0_2_2_2_2;\n {\n bool r_0_0_2_2_2_2_0 = false;\n r_0_0_2_2_2_2[0] = r_0_0_2_2_2_2_0;\n }\n {\n bool r_0_0_2_2_2_2_1 = true;\n r_0_0_2_2_2_2[1] = r_0_0_2_2_2_2_1;\n }\n {\n bool r_0_0_2_2_2_2_2 = true;\n r_0_0_2_2_2_2[2] = r_0_0_2_2_2_2_2;\n }\n r_0_0_2_2_2.s_2 = r_0_0_2_2_2_2;\n }\n {\n bytes10 r_0_0_2_2_2_3 = bytes10(0x7decc7fe1bccee97d17b);\n r_0_0_2_2_2.s_3 = r_0_0_2_2_2_3;\n }\n r_0_0_2_2.s_2 = r_0_0_2_2_2;\n }\n {\n string memory r_0_0_2_2_3 = unicode\"Moo é🚀\";\n r_0_0_2_2.s_3 = r_0_0_2_2_3;\n }\n {\n bytes30 r_0_0_2_2_4 = bytes30(0x7c194ace6f06432df5a7b6b88d86e9f19b397a1ab0105601fde3c1ab2efc);\n r_0_0_2_2.s_4 = r_0_0_2_2_4;\n }\n r_0_0_2.s_2 = r_0_0_2_2;\n }\n {\n string memory r_0_0_2_3 = unicode\"Moo é🚀ooMMéo o éoééoM\";\n r_0_0_2.s_3 = r_0_0_2_3;\n }\n {\n address r_0_0_2_4 = 0xae3eDD08Bee48aca623c4C39EaEcd9Fe1A6274Ca;\n r_0_0_2.s_4 = r_0_0_2_4;\n }\n r_0_0.s_2 = r_0_0_2;\n }\n {\n uint112[][4] memory r_0_0_3;\n {\n uint112[] memory r_0_0_3_0 = new uint112[](2);\n {\n uint112 r_0_0_3_0_0 = 955372374163780864986492531553834;\n r_0_0_3_0[0] = r_0_0_3_0_0;\n }\n {\n uint112 r_0_0_3_0_1 = 3024758950298724742608742337127557;\n r_0_0_3_0[1] = r_0_0_3_0_1;\n }\n r_0_0_3[0] = r_0_0_3_0;\n }\n {\n uint112[] memory r_0_0_3_1 = new uint112[](1);\n {\n uint112 r_0_0_3_1_0 = 4237546721052470754390151559195610;\n r_0_0_3_1[0] = r_0_0_3_1_0;\n }\n r_0_0_3[1] = r_0_0_3_1;\n }\n {\n uint112[] memory r_0_0_3_2 = new uint112[](1);\n {\n uint112 r_0_0_3_2_0 = 2872211107369508497752428063678622;\n r_0_0_3_2[0] = r_0_0_3_2_0;\n }\n r_0_0_3[2] = r_0_0_3_2;\n }\n {\n uint112[] memory r_0_0_3_3 = new uint112[](2);\n {\n uint112 r_0_0_3_3_0 = 111355774438692695778092565387668;\n r_0_0_3_3[0] = r_0_0_3_3_0;\n }\n {\n uint112 r_0_0_3_3_1 = 2260051501091894501614819150953870;\n r_0_0_3_3[1] = r_0_0_3_3_1;\n }\n r_0_0_3[3] = r_0_0_3_3;\n }\n r_0_0.s_3 = r_0_0_3;\n }\n {\n bool r_0_0_4 = false;\n r_0_0.s_4 = r_0_0_4;\n }\n r_0[0] = r_0_0;\n }\n {\n S_cacfb88b memory r_0_1;\n {\n bytes9 r_0_1_0 = bytes9(0x55906f3ed2d25e1f42);\n r_0_1.s_0 = r_0_1_0;\n }\n {\n S_4cbd9404 memory r_0_1_1;\n {\n bool r_0_1_1_0 = false;\n r_0_1_1.s_0 = r_0_1_1_0;\n }\n {\n string memory r_0_1_1_1 = unicode\"Moo é🚀🚀o oooéoé🚀\";\n r_0_1_1.s_1 = r_0_1_1_1;\n }\n {\n S_6e8ed41f memory r_0_1_1_2;\n {\n int56 r_0_1_1_2_0 = -13588634728638176;\n r_0_1_1_2.s_0 = r_0_1_1_2_0;\n }\n {\n S_4dc1782d memory r_0_1_1_2_1;\n {\n bytes6 r_0_1_1_2_1_0 = bytes6(0x9822b712d015);\n r_0_1_1_2_1.s_0 = r_0_1_1_2_1_0;\n }\n {\n bool r_0_1_1_2_1_1 = true;\n r_0_1_1_2_1.s_1 = r_0_1_1_2_1_1;\n }\n {\n string memory r_0_1_1_2_1_2 = unicode\"Moo é🚀oéoooéoMo🚀 oo éMM 🚀🚀o\";\n r_0_1_1_2_1.s_2 = r_0_1_1_2_1_2;\n }\n r_0_1_1_2.s_1 = r_0_1_1_2_1;\n }\n {\n S_75b95287 memory r_0_1_1_2_2;\n {\n string memory r_0_1_1_2_2_0 = unicode\"Moo é🚀M é M🚀 o oéo\";\n r_0_1_1_2_2.s_0 = r_0_1_1_2_2_0;\n }\n {\n bool r_0_1_1_2_2_1 = false;\n r_0_1_1_2_2.s_1 = r_0_1_1_2_2_1;\n }\n {\n int r_0_1_1_2_2_2 = -1381828108252282559403895635677371886389472450581672233661675869401130495396;\n r_0_1_1_2_2.s_2 = r_0_1_1_2_2_2;\n }\n r_0_1_1_2.s_2 = r_0_1_1_2_2;\n }\n {\n S_8a864324 memory r_0_1_1_2_3;\n {\n int104 r_0_1_1_2_3_0 = -2301286873639017688016524054257;\n r_0_1_1_2_3.s_0 = r_0_1_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_0_1_1_2_3_1;\n {\n S_b0e02723 memory r_0_1_1_2_3_1_0;\n {\n bytes27[1] memory r_0_1_1_2_3_1_0_0;\n {\n bytes27 r_0_1_1_2_3_1_0_0_0 = bytes27(0xb2768925b357944d0ae111562b62207a3183208c8ab4bd31f69f5e);\n r_0_1_1_2_3_1_0_0[0] = r_0_1_1_2_3_1_0_0_0;\n }\n r_0_1_1_2_3_1_0.s_0 = r_0_1_1_2_3_1_0_0;\n }\n {\n string memory r_0_1_1_2_3_1_0_1 = unicode\"Moo é🚀o🚀 M🚀Mé🚀oo M 🚀ooooéoooMoéoMéM🚀o \";\n r_0_1_1_2_3_1_0.s_1 = r_0_1_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_0_1_1_2_3_1_0_2;\n {\n bool r_0_1_1_2_3_1_0_2_0 = false;\n r_0_1_1_2_3_1_0_2.s_0 = r_0_1_1_2_3_1_0_2_0;\n }\n {\n address r_0_1_1_2_3_1_0_2_1 = 0x55aB8C91f89206F1f5E9b782AA29393F20e86937;\n r_0_1_1_2_3_1_0_2.s_1 = r_0_1_1_2_3_1_0_2_1;\n }\n {\n address r_0_1_1_2_3_1_0_2_2 = 0xAbdbF1E9feD389D4A969CED2Fa5F60f4170B74E7;\n r_0_1_1_2_3_1_0_2.s_2 = r_0_1_1_2_3_1_0_2_2;\n }\n {\n address r_0_1_1_2_3_1_0_2_3 = 0xcb5E46bcd1188d4BDC4A5e1252D6ed8b63fEFc50;\n r_0_1_1_2_3_1_0_2.s_3 = r_0_1_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_0_1_1_2_3_1_0_2_4;\n {\n address r_0_1_1_2_3_1_0_2_4_0 = 0x4DCEe8608f0dFE1Fb8B0f008D2e460Ec5C2Dd4ce;\n r_0_1_1_2_3_1_0_2_4[0] = r_0_1_1_2_3_1_0_2_4_0;\n }\n {\n address r_0_1_1_2_3_1_0_2_4_1 = 0x68CEdfA366D0cC5B894921CD966fDba4dC9fcae1;\n r_0_1_1_2_3_1_0_2_4[1] = r_0_1_1_2_3_1_0_2_4_1;\n }\n r_0_1_1_2_3_1_0_2.s_4 = r_0_1_1_2_3_1_0_2_4;\n }\n r_0_1_1_2_3_1_0.s_2 = r_0_1_1_2_3_1_0_2;\n }\n {\n bool r_0_1_1_2_3_1_0_3 = false;\n r_0_1_1_2_3_1_0.s_3 = r_0_1_1_2_3_1_0_3;\n }\n r_0_1_1_2_3_1[0] = r_0_1_1_2_3_1_0;\n }\n r_0_1_1_2_3.s_1 = r_0_1_1_2_3_1;\n }\n r_0_1_1_2.s_3 = r_0_1_1_2_3;\n }\n {\n bytes31[1] memory r_0_1_1_2_4;\n {\n bytes31 r_0_1_1_2_4_0 = bytes31(0x5556b6b433f517aad338cceb71fa66c0d0ffb00189ae3e905f90b7c9673f33);\n r_0_1_1_2_4[0] = r_0_1_1_2_4_0;\n }\n r_0_1_1_2.s_4 = r_0_1_1_2_4;\n }\n r_0_1_1.s_2 = r_0_1_1_2;\n }\n {\n bool r_0_1_1_3 = true;\n r_0_1_1.s_3 = r_0_1_1_3;\n }\n {\n bool r_0_1_1_4 = true;\n r_0_1_1.s_4 = r_0_1_1_4;\n }\n r_0_1.s_1 = r_0_1_1;\n }\n {\n S_4f245c87 memory r_0_1_2;\n {\n string memory r_0_1_2_0 = unicode\"Moo é🚀🚀MMMMo M éoMéM M🚀 oé🚀🚀🚀oéo o🚀éo é🚀éoéMoMéé🚀o🚀M oo\";\n r_0_1_2.s_0 = r_0_1_2_0;\n }\n {\n bool r_0_1_2_1 = false;\n r_0_1_2.s_1 = r_0_1_2_1;\n }\n {\n S_e1fe1757 memory r_0_1_2_2;\n {\n uint216 r_0_1_2_2_0 = 87276849210015664841785584752947167384195780271625904423032121664;\n r_0_1_2_2.s_0 = r_0_1_2_2_0;\n }\n {\n bytes22 r_0_1_2_2_1 = bytes22(0x79b8620d9fc052a643f3a29332e373ca3f8d021986e3);\n r_0_1_2_2.s_1 = r_0_1_2_2_1;\n }\n {\n S_8f5c69d2 memory r_0_1_2_2_2;\n {\n string memory r_0_1_2_2_2_0 = unicode\"Moo é🚀🚀 Moo🚀🚀ooMoM🚀éMooo🚀 o M o éo o🚀Mé🚀 ooMM Mooééo🚀🚀éo🚀é\";\n r_0_1_2_2_2.s_0 = r_0_1_2_2_2_0;\n }\n {\n bool r_0_1_2_2_2_1 = false;\n r_0_1_2_2_2.s_1 = r_0_1_2_2_2_1;\n }\n {\n bool[3] memory r_0_1_2_2_2_2;\n {\n bool r_0_1_2_2_2_2_0 = true;\n r_0_1_2_2_2_2[0] = r_0_1_2_2_2_2_0;\n }\n {\n bool r_0_1_2_2_2_2_1 = false;\n r_0_1_2_2_2_2[1] = r_0_1_2_2_2_2_1;\n }\n {\n bool r_0_1_2_2_2_2_2 = true;\n r_0_1_2_2_2_2[2] = r_0_1_2_2_2_2_2;\n }\n r_0_1_2_2_2.s_2 = r_0_1_2_2_2_2;\n }\n {\n bytes10 r_0_1_2_2_2_3 = bytes10(0x02f1a6afc51609028dc8);\n r_0_1_2_2_2.s_3 = r_0_1_2_2_2_3;\n }\n r_0_1_2_2.s_2 = r_0_1_2_2_2;\n }\n {\n string memory r_0_1_2_2_3 = unicode\"Moo é🚀M 🚀o 🚀M🚀Mé éoo oo 🚀🚀é🚀MoooooéoM🚀ooo🚀oMMo ooMo \";\n r_0_1_2_2.s_3 = r_0_1_2_2_3;\n }\n {\n bytes30 r_0_1_2_2_4 = bytes30(0x3b291c86abe0818a70a9f010dd7acbf19e1f2bc3f021c0778f610363ad50);\n r_0_1_2_2.s_4 = r_0_1_2_2_4;\n }\n r_0_1_2.s_2 = r_0_1_2_2;\n }\n {\n string memory r_0_1_2_3 = unicode\"Moo é🚀Mé 🚀M🚀oooo🚀 M🚀 oo é\";\n r_0_1_2.s_3 = r_0_1_2_3;\n }\n {\n address r_0_1_2_4 = 0xAd230d50ED982311f04D14A5C9fa475cEBf3624B;\n r_0_1_2.s_4 = r_0_1_2_4;\n }\n r_0_1.s_2 = r_0_1_2;\n }\n {\n uint112[][4] memory r_0_1_3;\n {\n uint112[] memory r_0_1_3_0 = new uint112[](1);\n {\n uint112 r_0_1_3_0_0 = 1669460443878462292282980670702483;\n r_0_1_3_0[0] = r_0_1_3_0_0;\n }\n r_0_1_3[0] = r_0_1_3_0;\n }\n {\n uint112[] memory r_0_1_3_1 = new uint112[](3);\n {\n uint112 r_0_1_3_1_0 = 4428941743575378706328860399569192;\n r_0_1_3_1[0] = r_0_1_3_1_0;\n }\n {\n uint112 r_0_1_3_1_1 = 1424947952038344969869062031715935;\n r_0_1_3_1[1] = r_0_1_3_1_1;\n }\n {\n uint112 r_0_1_3_1_2 = 4546660216598814792312695772046824;\n r_0_1_3_1[2] = r_0_1_3_1_2;\n }\n r_0_1_3[1] = r_0_1_3_1;\n }\n {\n uint112[] memory r_0_1_3_2 = new uint112[](1);\n {\n uint112 r_0_1_3_2_0 = 4296674203415129897678115575897696;\n r_0_1_3_2[0] = r_0_1_3_2_0;\n }\n r_0_1_3[2] = r_0_1_3_2;\n }\n {\n uint112[] memory r_0_1_3_3 = new uint112[](3);\n {\n uint112 r_0_1_3_3_0 = 910863371599992936801945507531803;\n r_0_1_3_3[0] = r_0_1_3_3_0;\n }\n {\n uint112 r_0_1_3_3_1 = 2996372679197759143609789516409237;\n r_0_1_3_3[1] = r_0_1_3_3_1;\n }\n {\n uint112 r_0_1_3_3_2 = 4003478144626770514356714911201572;\n r_0_1_3_3[2] = r_0_1_3_3_2;\n }\n r_0_1_3[3] = r_0_1_3_3;\n }\n r_0_1.s_3 = r_0_1_3;\n }\n {\n bool r_0_1_4 = false;\n r_0_1.s_4 = r_0_1_4;\n }\n r_0[1] = r_0_1;\n }\n {\n S_cacfb88b memory r_0_2;\n {\n bytes9 r_0_2_0 = bytes9(0x75b5d4ce932f386ef6);\n r_0_2.s_0 = r_0_2_0;\n }\n {\n S_4cbd9404 memory r_0_2_1;\n {\n bool r_0_2_1_0 = true;\n r_0_2_1.s_0 = r_0_2_1_0;\n }\n {\n string memory r_0_2_1_1 = unicode\"Moo é🚀MééM\";\n r_0_2_1.s_1 = r_0_2_1_1;\n }\n {\n S_6e8ed41f memory r_0_2_1_2;\n {\n int56 r_0_2_1_2_0 = -5051473243263691;\n r_0_2_1_2.s_0 = r_0_2_1_2_0;\n }\n {\n S_4dc1782d memory r_0_2_1_2_1;\n {\n bytes6 r_0_2_1_2_1_0 = bytes6(0xe58fc222ce53);\n r_0_2_1_2_1.s_0 = r_0_2_1_2_1_0;\n }\n {\n bool r_0_2_1_2_1_1 = false;\n r_0_2_1_2_1.s_1 = r_0_2_1_2_1_1;\n }\n {\n string memory r_0_2_1_2_1_2 = unicode\"Moo é🚀o🚀é MooMo🚀🚀🚀 oo🚀éé oo o oéM🚀oo🚀M MMéo🚀oé🚀\";\n r_0_2_1_2_1.s_2 = r_0_2_1_2_1_2;\n }\n r_0_2_1_2.s_1 = r_0_2_1_2_1;\n }\n {\n S_75b95287 memory r_0_2_1_2_2;\n {\n string memory r_0_2_1_2_2_0 = unicode\"Moo é🚀éMMo🚀oMo🚀é🚀🚀🚀\";\n r_0_2_1_2_2.s_0 = r_0_2_1_2_2_0;\n }\n {\n bool r_0_2_1_2_2_1 = true;\n r_0_2_1_2_2.s_1 = r_0_2_1_2_2_1;\n }\n {\n int r_0_2_1_2_2_2 = -7449863340844524306373980804389553848035409148281865705094943558193151653578;\n r_0_2_1_2_2.s_2 = r_0_2_1_2_2_2;\n }\n r_0_2_1_2.s_2 = r_0_2_1_2_2;\n }\n {\n S_8a864324 memory r_0_2_1_2_3;\n {\n int104 r_0_2_1_2_3_0 = 62675005066649660926991713638;\n r_0_2_1_2_3.s_0 = r_0_2_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_0_2_1_2_3_1;\n {\n S_b0e02723 memory r_0_2_1_2_3_1_0;\n {\n bytes27[1] memory r_0_2_1_2_3_1_0_0;\n {\n bytes27 r_0_2_1_2_3_1_0_0_0 = bytes27(0x8668d85da31504503ea9b77aef6cee6b9b87107d54a85689791c79);\n r_0_2_1_2_3_1_0_0[0] = r_0_2_1_2_3_1_0_0_0;\n }\n r_0_2_1_2_3_1_0.s_0 = r_0_2_1_2_3_1_0_0;\n }\n {\n string memory r_0_2_1_2_3_1_0_1 = unicode\"Moo é🚀MoMéo MM éo\";\n r_0_2_1_2_3_1_0.s_1 = r_0_2_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_0_2_1_2_3_1_0_2;\n {\n bool r_0_2_1_2_3_1_0_2_0 = true;\n r_0_2_1_2_3_1_0_2.s_0 = r_0_2_1_2_3_1_0_2_0;\n }\n {\n address r_0_2_1_2_3_1_0_2_1 = 0x138A9E491D88E30E2562AADA9bB86De9931DD89f;\n r_0_2_1_2_3_1_0_2.s_1 = r_0_2_1_2_3_1_0_2_1;\n }\n {\n address r_0_2_1_2_3_1_0_2_2 = 0x7Ec0E8aD2B0482b1661ED6853dE7B8A0A3B54fC6;\n r_0_2_1_2_3_1_0_2.s_2 = r_0_2_1_2_3_1_0_2_2;\n }\n {\n address r_0_2_1_2_3_1_0_2_3 = 0x23138e20c675b781BE3f96C7992cb4FFc415E1d4;\n r_0_2_1_2_3_1_0_2.s_3 = r_0_2_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_0_2_1_2_3_1_0_2_4;\n {\n address r_0_2_1_2_3_1_0_2_4_0 = 0x4212e1bcAF5748c806952257228816e553Ce52A1;\n r_0_2_1_2_3_1_0_2_4[0] = r_0_2_1_2_3_1_0_2_4_0;\n }\n {\n address r_0_2_1_2_3_1_0_2_4_1 = 0xc7C1334dD1a2E8c4F7Bc5c9B0281cf01D9fB03d8;\n r_0_2_1_2_3_1_0_2_4[1] = r_0_2_1_2_3_1_0_2_4_1;\n }\n r_0_2_1_2_3_1_0_2.s_4 = r_0_2_1_2_3_1_0_2_4;\n }\n r_0_2_1_2_3_1_0.s_2 = r_0_2_1_2_3_1_0_2;\n }\n {\n bool r_0_2_1_2_3_1_0_3 = true;\n r_0_2_1_2_3_1_0.s_3 = r_0_2_1_2_3_1_0_3;\n }\n r_0_2_1_2_3_1[0] = r_0_2_1_2_3_1_0;\n }\n r_0_2_1_2_3.s_1 = r_0_2_1_2_3_1;\n }\n r_0_2_1_2.s_3 = r_0_2_1_2_3;\n }\n {\n bytes31[1] memory r_0_2_1_2_4;\n {\n bytes31 r_0_2_1_2_4_0 = bytes31(0xd39bc92ff2aedc0ca315f6f383f38067f4bd3fdcbd5553d41a05ae6121f64a);\n r_0_2_1_2_4[0] = r_0_2_1_2_4_0;\n }\n r_0_2_1_2.s_4 = r_0_2_1_2_4;\n }\n r_0_2_1.s_2 = r_0_2_1_2;\n }\n {\n bool r_0_2_1_3 = false;\n r_0_2_1.s_3 = r_0_2_1_3;\n }\n {\n bool r_0_2_1_4 = true;\n r_0_2_1.s_4 = r_0_2_1_4;\n }\n r_0_2.s_1 = r_0_2_1;\n }\n {\n S_4f245c87 memory r_0_2_2;\n {\n string memory r_0_2_2_0 = unicode\"Moo é🚀MM🚀MoM🚀 MéM🚀oM ooééMoé ooM oo éooMoéo \";\n r_0_2_2.s_0 = r_0_2_2_0;\n }\n {\n bool r_0_2_2_1 = true;\n r_0_2_2.s_1 = r_0_2_2_1;\n }\n {\n S_e1fe1757 memory r_0_2_2_2;\n {\n uint216 r_0_2_2_2_0 = 30148822645983097932041779039543223497977437556495248581884214906;\n r_0_2_2_2.s_0 = r_0_2_2_2_0;\n }\n {\n bytes22 r_0_2_2_2_1 = bytes22(0xc2e7db0a808e4f73a557c27c7bf7b66c338b8c2b7e08);\n r_0_2_2_2.s_1 = r_0_2_2_2_1;\n }\n {\n S_8f5c69d2 memory r_0_2_2_2_2;\n {\n string memory r_0_2_2_2_2_0 = unicode\"Moo é🚀ooéMooé o oo oMéoM oMé 🚀🚀éo🚀oMM🚀o M🚀🚀\";\n r_0_2_2_2_2.s_0 = r_0_2_2_2_2_0;\n }\n {\n bool r_0_2_2_2_2_1 = false;\n r_0_2_2_2_2.s_1 = r_0_2_2_2_2_1;\n }\n {\n bool[3] memory r_0_2_2_2_2_2;\n {\n bool r_0_2_2_2_2_2_0 = true;\n r_0_2_2_2_2_2[0] = r_0_2_2_2_2_2_0;\n }\n {\n bool r_0_2_2_2_2_2_1 = false;\n r_0_2_2_2_2_2[1] = r_0_2_2_2_2_2_1;\n }\n {\n bool r_0_2_2_2_2_2_2 = false;\n r_0_2_2_2_2_2[2] = r_0_2_2_2_2_2_2;\n }\n r_0_2_2_2_2.s_2 = r_0_2_2_2_2_2;\n }\n {\n bytes10 r_0_2_2_2_2_3 = bytes10(0x89cff81cac99fdb50a4c);\n r_0_2_2_2_2.s_3 = r_0_2_2_2_2_3;\n }\n r_0_2_2_2.s_2 = r_0_2_2_2_2;\n }\n {\n string memory r_0_2_2_2_3 = unicode\"Moo é🚀 Mé\";\n r_0_2_2_2.s_3 = r_0_2_2_2_3;\n }\n {\n bytes30 r_0_2_2_2_4 = bytes30(0x1ce56dbf942e1efca45cf426cfe753dcc546c27bf04d6ba4fbdebe8d0f7d);\n r_0_2_2_2.s_4 = r_0_2_2_2_4;\n }\n r_0_2_2.s_2 = r_0_2_2_2;\n }\n {\n string memory r_0_2_2_3 = unicode\"Moo é🚀é🚀éé🚀🚀éoo🚀Mo é o🚀 o🚀🚀🚀🚀oéé🚀 M M🚀Mo🚀MMoooo🚀oé🚀🚀🚀🚀🚀🚀éé🚀🚀\";\n r_0_2_2.s_3 = r_0_2_2_3;\n }\n {\n address r_0_2_2_4 = 0x4f46eC04723d0EfF4FA143Ceb8fcb9d7cEEaCb81;\n r_0_2_2.s_4 = r_0_2_2_4;\n }\n r_0_2.s_2 = r_0_2_2;\n }\n {\n uint112[][4] memory r_0_2_3;\n {\n uint112[] memory r_0_2_3_0 = new uint112[](2);\n {\n uint112 r_0_2_3_0_0 = 2883883556144974585492497403330033;\n r_0_2_3_0[0] = r_0_2_3_0_0;\n }\n {\n uint112 r_0_2_3_0_1 = 3926707094420510728063374138913274;\n r_0_2_3_0[1] = r_0_2_3_0_1;\n }\n r_0_2_3[0] = r_0_2_3_0;\n }\n {\n uint112[] memory r_0_2_3_1 = new uint112[](2);\n {\n uint112 r_0_2_3_1_0 = 3069091067906313265474471043959744;\n r_0_2_3_1[0] = r_0_2_3_1_0;\n }\n {\n uint112 r_0_2_3_1_1 = 3888745756486092218075146636410400;\n r_0_2_3_1[1] = r_0_2_3_1_1;\n }\n r_0_2_3[1] = r_0_2_3_1;\n }\n {\n uint112[] memory r_0_2_3_2 = new uint112[](2);\n {\n uint112 r_0_2_3_2_0 = 4189737722986109909039420415827510;\n r_0_2_3_2[0] = r_0_2_3_2_0;\n }\n {\n uint112 r_0_2_3_2_1 = 276646836850562282958296894968237;\n r_0_2_3_2[1] = r_0_2_3_2_1;\n }\n r_0_2_3[2] = r_0_2_3_2;\n }\n {\n uint112[] memory r_0_2_3_3 = new uint112[](4);\n {\n uint112 r_0_2_3_3_0 = 4727416100024242230698001918595878;\n r_0_2_3_3[0] = r_0_2_3_3_0;\n }\n {\n uint112 r_0_2_3_3_1 = 2043457343155596710609380387719796;\n r_0_2_3_3[1] = r_0_2_3_3_1;\n }\n {\n uint112 r_0_2_3_3_2 = 1394517542477882296135882479590824;\n r_0_2_3_3[2] = r_0_2_3_3_2;\n }\n {\n uint112 r_0_2_3_3_3 = 3670692701933182797098307581191731;\n r_0_2_3_3[3] = r_0_2_3_3_3;\n }\n r_0_2_3[3] = r_0_2_3_3;\n }\n r_0_2.s_3 = r_0_2_3;\n }\n {\n bool r_0_2_4 = false;\n r_0_2.s_4 = r_0_2_4;\n }\n r_0[2] = r_0_2;\n }\n {\n S_cacfb88b memory r_0_3;\n {\n bytes9 r_0_3_0 = bytes9(0x0cd7ca5805dc4b06af);\n r_0_3.s_0 = r_0_3_0;\n }\n {\n S_4cbd9404 memory r_0_3_1;\n {\n bool r_0_3_1_0 = true;\n r_0_3_1.s_0 = r_0_3_1_0;\n }\n {\n string memory r_0_3_1_1 = unicode\"Moo é🚀Méoo🚀M🚀oéoéM🚀o🚀M🚀éoéoéé MMoo\";\n r_0_3_1.s_1 = r_0_3_1_1;\n }\n {\n S_6e8ed41f memory r_0_3_1_2;\n {\n int56 r_0_3_1_2_0 = -8290523448397740;\n r_0_3_1_2.s_0 = r_0_3_1_2_0;\n }\n {\n S_4dc1782d memory r_0_3_1_2_1;\n {\n bytes6 r_0_3_1_2_1_0 = bytes6(0x765ad85b7426);\n r_0_3_1_2_1.s_0 = r_0_3_1_2_1_0;\n }\n {\n bool r_0_3_1_2_1_1 = true;\n r_0_3_1_2_1.s_1 = r_0_3_1_2_1_1;\n }\n {\n string memory r_0_3_1_2_1_2 = unicode\"Moo é🚀 🚀 oM🚀M🚀oo🚀Mooo éo Mo🚀Moéé é M🚀🚀 oooo🚀\";\n r_0_3_1_2_1.s_2 = r_0_3_1_2_1_2;\n }\n r_0_3_1_2.s_1 = r_0_3_1_2_1;\n }\n {\n S_75b95287 memory r_0_3_1_2_2;\n {\n string memory r_0_3_1_2_2_0 = unicode\"Moo é🚀\";\n r_0_3_1_2_2.s_0 = r_0_3_1_2_2_0;\n }\n {\n bool r_0_3_1_2_2_1 = false;\n r_0_3_1_2_2.s_1 = r_0_3_1_2_2_1;\n }\n {\n int r_0_3_1_2_2_2 = 10402516873405573710396273875152332705176611010480768234745065173663786546454;\n r_0_3_1_2_2.s_2 = r_0_3_1_2_2_2;\n }\n r_0_3_1_2.s_2 = r_0_3_1_2_2;\n }\n {\n S_8a864324 memory r_0_3_1_2_3;\n {\n int104 r_0_3_1_2_3_0 = 5571910321032267783506139627700;\n r_0_3_1_2_3.s_0 = r_0_3_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_0_3_1_2_3_1;\n {\n S_b0e02723 memory r_0_3_1_2_3_1_0;\n {\n bytes27[1] memory r_0_3_1_2_3_1_0_0;\n {\n bytes27 r_0_3_1_2_3_1_0_0_0 = bytes27(0x6fb989260c92e8bc966195c04f7e2fe9d9875833b429350acc0e5c);\n r_0_3_1_2_3_1_0_0[0] = r_0_3_1_2_3_1_0_0_0;\n }\n r_0_3_1_2_3_1_0.s_0 = r_0_3_1_2_3_1_0_0;\n }\n {\n string memory r_0_3_1_2_3_1_0_1 = unicode\"Moo é🚀 é🚀🚀oéM🚀M Moo Mo\";\n r_0_3_1_2_3_1_0.s_1 = r_0_3_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_0_3_1_2_3_1_0_2;\n {\n bool r_0_3_1_2_3_1_0_2_0 = false;\n r_0_3_1_2_3_1_0_2.s_0 = r_0_3_1_2_3_1_0_2_0;\n }\n {\n address r_0_3_1_2_3_1_0_2_1 = 0x1b139e7d36FDadBcc7Df8c75AdBB6FfA292cEF45;\n r_0_3_1_2_3_1_0_2.s_1 = r_0_3_1_2_3_1_0_2_1;\n }\n {\n address r_0_3_1_2_3_1_0_2_2 = 0x0F5C24cFcEd9554Fd235F87285C4c5cc47A5b418;\n r_0_3_1_2_3_1_0_2.s_2 = r_0_3_1_2_3_1_0_2_2;\n }\n {\n address r_0_3_1_2_3_1_0_2_3 = 0x00DA6347a2a1277521bD00823C4DdCd703aEb815;\n r_0_3_1_2_3_1_0_2.s_3 = r_0_3_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_0_3_1_2_3_1_0_2_4;\n {\n address r_0_3_1_2_3_1_0_2_4_0 = 0xf5e8E208b26D7a51957f530F4764bf9894F58b54;\n r_0_3_1_2_3_1_0_2_4[0] = r_0_3_1_2_3_1_0_2_4_0;\n }\n {\n address r_0_3_1_2_3_1_0_2_4_1 = 0xEED761Fa1dCb2EAF8F93628fAE92acdE6c174478;\n r_0_3_1_2_3_1_0_2_4[1] = r_0_3_1_2_3_1_0_2_4_1;\n }\n r_0_3_1_2_3_1_0_2.s_4 = r_0_3_1_2_3_1_0_2_4;\n }\n r_0_3_1_2_3_1_0.s_2 = r_0_3_1_2_3_1_0_2;\n }\n {\n bool r_0_3_1_2_3_1_0_3 = true;\n r_0_3_1_2_3_1_0.s_3 = r_0_3_1_2_3_1_0_3;\n }\n r_0_3_1_2_3_1[0] = r_0_3_1_2_3_1_0;\n }\n r_0_3_1_2_3.s_1 = r_0_3_1_2_3_1;\n }\n r_0_3_1_2.s_3 = r_0_3_1_2_3;\n }\n {\n bytes31[1] memory r_0_3_1_2_4;\n {\n bytes31 r_0_3_1_2_4_0 = bytes31(0x7225a3846e77a05674dcfd69efa3437df1171f5ad40ee2d4ff13d1b47ff8c2);\n r_0_3_1_2_4[0] = r_0_3_1_2_4_0;\n }\n r_0_3_1_2.s_4 = r_0_3_1_2_4;\n }\n r_0_3_1.s_2 = r_0_3_1_2;\n }\n {\n bool r_0_3_1_3 = true;\n r_0_3_1.s_3 = r_0_3_1_3;\n }\n {\n bool r_0_3_1_4 = true;\n r_0_3_1.s_4 = r_0_3_1_4;\n }\n r_0_3.s_1 = r_0_3_1;\n }\n {\n S_4f245c87 memory r_0_3_2;\n {\n string memory r_0_3_2_0 = unicode\"Moo é🚀 é éoéoMoéé🚀éééo \";\n r_0_3_2.s_0 = r_0_3_2_0;\n }\n {\n bool r_0_3_2_1 = false;\n r_0_3_2.s_1 = r_0_3_2_1;\n }\n {\n S_e1fe1757 memory r_0_3_2_2;\n {\n uint216 r_0_3_2_2_0 = 5439090432067320680194527809638087444230370463897350716633748856;\n r_0_3_2_2.s_0 = r_0_3_2_2_0;\n }\n {\n bytes22 r_0_3_2_2_1 = bytes22(0xaa324338c7572bf832363b06c4dbdc46a53eb6666461);\n r_0_3_2_2.s_1 = r_0_3_2_2_1;\n }\n {\n S_8f5c69d2 memory r_0_3_2_2_2;\n {\n string memory r_0_3_2_2_2_0 = unicode\"Moo é🚀Mé MéééooM🚀 éo o🚀o\";\n r_0_3_2_2_2.s_0 = r_0_3_2_2_2_0;\n }\n {\n bool r_0_3_2_2_2_1 = false;\n r_0_3_2_2_2.s_1 = r_0_3_2_2_2_1;\n }\n {\n bool[3] memory r_0_3_2_2_2_2;\n {\n bool r_0_3_2_2_2_2_0 = true;\n r_0_3_2_2_2_2[0] = r_0_3_2_2_2_2_0;\n }\n {\n bool r_0_3_2_2_2_2_1 = false;\n r_0_3_2_2_2_2[1] = r_0_3_2_2_2_2_1;\n }\n {\n bool r_0_3_2_2_2_2_2 = false;\n r_0_3_2_2_2_2[2] = r_0_3_2_2_2_2_2;\n }\n r_0_3_2_2_2.s_2 = r_0_3_2_2_2_2;\n }\n {\n bytes10 r_0_3_2_2_2_3 = bytes10(0x539d1fa27354cc2a21be);\n r_0_3_2_2_2.s_3 = r_0_3_2_2_2_3;\n }\n r_0_3_2_2.s_2 = r_0_3_2_2_2;\n }\n {\n string memory r_0_3_2_2_3 = unicode\"Moo é🚀o🚀oo \";\n r_0_3_2_2.s_3 = r_0_3_2_2_3;\n }\n {\n bytes30 r_0_3_2_2_4 = bytes30(0xf9f34cc5c85b184dab5f73987a5e56267ce678c94d489c7f5395f6c689f4);\n r_0_3_2_2.s_4 = r_0_3_2_2_4;\n }\n r_0_3_2.s_2 = r_0_3_2_2;\n }\n {\n string memory r_0_3_2_3 = unicode\"Moo é🚀MMoéo🚀o🚀oo ooéoé🚀M🚀ooMMM oMéoéooo🚀 oo🚀🚀o🚀🚀ooéMé🚀o é🚀oooM\";\n r_0_3_2.s_3 = r_0_3_2_3;\n }\n {\n address r_0_3_2_4 = 0x41aBa07653CF095ef00019df15cB694F8a3F496C;\n r_0_3_2.s_4 = r_0_3_2_4;\n }\n r_0_3.s_2 = r_0_3_2;\n }\n {\n uint112[][4] memory r_0_3_3;\n {\n uint112[] memory r_0_3_3_0 = new uint112[](1);\n {\n uint112 r_0_3_3_0_0 = 3501433467401227308675675358196623;\n r_0_3_3_0[0] = r_0_3_3_0_0;\n }\n r_0_3_3[0] = r_0_3_3_0;\n }\n {\n uint112[] memory r_0_3_3_1 = new uint112[](1);\n {\n uint112 r_0_3_3_1_0 = 4478129566979578900280158836831340;\n r_0_3_3_1[0] = r_0_3_3_1_0;\n }\n r_0_3_3[1] = r_0_3_3_1;\n }\n {\n uint112[] memory r_0_3_3_2 = new uint112[](2);\n {\n uint112 r_0_3_3_2_0 = 1354004295542064315260428212779051;\n r_0_3_3_2[0] = r_0_3_3_2_0;\n }\n {\n uint112 r_0_3_3_2_1 = 1651940248756015948685875254008851;\n r_0_3_3_2[1] = r_0_3_3_2_1;\n }\n r_0_3_3[2] = r_0_3_3_2;\n }\n {\n uint112[] memory r_0_3_3_3 = new uint112[](0);\n r_0_3_3[3] = r_0_3_3_3;\n }\n r_0_3.s_3 = r_0_3_3;\n }\n {\n bool r_0_3_4 = false;\n r_0_3.s_4 = r_0_3_4;\n }\n r_0[3] = r_0_3;\n }\n r[0] = r_0;\n }\n {\n S_cacfb88b[4] memory r_1;\n {\n S_cacfb88b memory r_1_0;\n {\n bytes9 r_1_0_0 = bytes9(0xd188f2eb918e1c3678);\n r_1_0.s_0 = r_1_0_0;\n }\n {\n S_4cbd9404 memory r_1_0_1;\n {\n bool r_1_0_1_0 = false;\n r_1_0_1.s_0 = r_1_0_1_0;\n }\n {\n string memory r_1_0_1_1 = unicode\"Moo é🚀 M Mo🚀MMoé🚀🚀 é🚀éoMMo\";\n r_1_0_1.s_1 = r_1_0_1_1;\n }\n {\n S_6e8ed41f memory r_1_0_1_2;\n {\n int56 r_1_0_1_2_0 = 19921202998329402;\n r_1_0_1_2.s_0 = r_1_0_1_2_0;\n }\n {\n S_4dc1782d memory r_1_0_1_2_1;\n {\n bytes6 r_1_0_1_2_1_0 = bytes6(0x91efc664009c);\n r_1_0_1_2_1.s_0 = r_1_0_1_2_1_0;\n }\n {\n bool r_1_0_1_2_1_1 = true;\n r_1_0_1_2_1.s_1 = r_1_0_1_2_1_1;\n }\n {\n string memory r_1_0_1_2_1_2 = unicode\"Moo é🚀éM🚀🚀 Mo o🚀Mééoé🚀 🚀é 🚀 oooooéo🚀M🚀éooéoM oMoMéMoo🚀Mo 🚀\";\n r_1_0_1_2_1.s_2 = r_1_0_1_2_1_2;\n }\n r_1_0_1_2.s_1 = r_1_0_1_2_1;\n }\n {\n S_75b95287 memory r_1_0_1_2_2;\n {\n string memory r_1_0_1_2_2_0 = unicode\"Moo é🚀\";\n r_1_0_1_2_2.s_0 = r_1_0_1_2_2_0;\n }\n {\n bool r_1_0_1_2_2_1 = true;\n r_1_0_1_2_2.s_1 = r_1_0_1_2_2_1;\n }\n {\n int r_1_0_1_2_2_2 = -34853778802574078864607668903207415147089005813637425486660581000432795868354;\n r_1_0_1_2_2.s_2 = r_1_0_1_2_2_2;\n }\n r_1_0_1_2.s_2 = r_1_0_1_2_2;\n }\n {\n S_8a864324 memory r_1_0_1_2_3;\n {\n int104 r_1_0_1_2_3_0 = -4986273949011994826117656293701;\n r_1_0_1_2_3.s_0 = r_1_0_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_1_0_1_2_3_1;\n {\n S_b0e02723 memory r_1_0_1_2_3_1_0;\n {\n bytes27[1] memory r_1_0_1_2_3_1_0_0;\n {\n bytes27 r_1_0_1_2_3_1_0_0_0 = bytes27(0x1aab4ed8883174b501f54aeb7d0d4602c93cb428b2178d4b7e5d2a);\n r_1_0_1_2_3_1_0_0[0] = r_1_0_1_2_3_1_0_0_0;\n }\n r_1_0_1_2_3_1_0.s_0 = r_1_0_1_2_3_1_0_0;\n }\n {\n string memory r_1_0_1_2_3_1_0_1 = unicode\"Moo é🚀 o🚀 oo 🚀MMo\";\n r_1_0_1_2_3_1_0.s_1 = r_1_0_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_1_0_1_2_3_1_0_2;\n {\n bool r_1_0_1_2_3_1_0_2_0 = true;\n r_1_0_1_2_3_1_0_2.s_0 = r_1_0_1_2_3_1_0_2_0;\n }\n {\n address r_1_0_1_2_3_1_0_2_1 = 0xB8c72E057Bd699Fb60E3d241113AFB68CaB74F7c;\n r_1_0_1_2_3_1_0_2.s_1 = r_1_0_1_2_3_1_0_2_1;\n }\n {\n address r_1_0_1_2_3_1_0_2_2 = 0xc28A699999EEe79100dB2911fFb44Af237efa261;\n r_1_0_1_2_3_1_0_2.s_2 = r_1_0_1_2_3_1_0_2_2;\n }\n {\n address r_1_0_1_2_3_1_0_2_3 = 0xbe24517fe6547CE354b911a96221e3B0Fc411A4F;\n r_1_0_1_2_3_1_0_2.s_3 = r_1_0_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_1_0_1_2_3_1_0_2_4;\n {\n address r_1_0_1_2_3_1_0_2_4_0 = 0x4018a5B4f4Eb4eFAf80f60E664C20B4619DBE3b7;\n r_1_0_1_2_3_1_0_2_4[0] = r_1_0_1_2_3_1_0_2_4_0;\n }\n {\n address r_1_0_1_2_3_1_0_2_4_1 = 0x43AF520CF1E78A3e5Edd906cF096C59Dab98701f;\n r_1_0_1_2_3_1_0_2_4[1] = r_1_0_1_2_3_1_0_2_4_1;\n }\n r_1_0_1_2_3_1_0_2.s_4 = r_1_0_1_2_3_1_0_2_4;\n }\n r_1_0_1_2_3_1_0.s_2 = r_1_0_1_2_3_1_0_2;\n }\n {\n bool r_1_0_1_2_3_1_0_3 = true;\n r_1_0_1_2_3_1_0.s_3 = r_1_0_1_2_3_1_0_3;\n }\n r_1_0_1_2_3_1[0] = r_1_0_1_2_3_1_0;\n }\n r_1_0_1_2_3.s_1 = r_1_0_1_2_3_1;\n }\n r_1_0_1_2.s_3 = r_1_0_1_2_3;\n }\n {\n bytes31[1] memory r_1_0_1_2_4;\n {\n bytes31 r_1_0_1_2_4_0 = bytes31(0x9362b4b7041fcc5a3082d548b8f5fbc9b6fda237d07a6bf8df941f7e15bbb4);\n r_1_0_1_2_4[0] = r_1_0_1_2_4_0;\n }\n r_1_0_1_2.s_4 = r_1_0_1_2_4;\n }\n r_1_0_1.s_2 = r_1_0_1_2;\n }\n {\n bool r_1_0_1_3 = false;\n r_1_0_1.s_3 = r_1_0_1_3;\n }\n {\n bool r_1_0_1_4 = true;\n r_1_0_1.s_4 = r_1_0_1_4;\n }\n r_1_0.s_1 = r_1_0_1;\n }\n {\n S_4f245c87 memory r_1_0_2;\n {\n string memory r_1_0_2_0 = unicode\"Moo é🚀 é🚀o Mo ooo🚀 oo éoo éM oo oMooooéo éoo o\";\n r_1_0_2.s_0 = r_1_0_2_0;\n }\n {\n bool r_1_0_2_1 = false;\n r_1_0_2.s_1 = r_1_0_2_1;\n }\n {\n S_e1fe1757 memory r_1_0_2_2;\n {\n uint216 r_1_0_2_2_0 = 10063822234314344704186891101443545386702886148609390173024633172;\n r_1_0_2_2.s_0 = r_1_0_2_2_0;\n }\n {\n bytes22 r_1_0_2_2_1 = bytes22(0xdca5466aa8187330679e5caa01d2823cfdc605447e08);\n r_1_0_2_2.s_1 = r_1_0_2_2_1;\n }\n {\n S_8f5c69d2 memory r_1_0_2_2_2;\n {\n string memory r_1_0_2_2_2_0 = unicode\"Moo é🚀éMo🚀o 🚀éooé 🚀 🚀é🚀MéoéM ooMM\";\n r_1_0_2_2_2.s_0 = r_1_0_2_2_2_0;\n }\n {\n bool r_1_0_2_2_2_1 = false;\n r_1_0_2_2_2.s_1 = r_1_0_2_2_2_1;\n }\n {\n bool[3] memory r_1_0_2_2_2_2;\n {\n bool r_1_0_2_2_2_2_0 = true;\n r_1_0_2_2_2_2[0] = r_1_0_2_2_2_2_0;\n }\n {\n bool r_1_0_2_2_2_2_1 = true;\n r_1_0_2_2_2_2[1] = r_1_0_2_2_2_2_1;\n }\n {\n bool r_1_0_2_2_2_2_2 = false;\n r_1_0_2_2_2_2[2] = r_1_0_2_2_2_2_2;\n }\n r_1_0_2_2_2.s_2 = r_1_0_2_2_2_2;\n }\n {\n bytes10 r_1_0_2_2_2_3 = bytes10(0x8d2c525bd7c61732ad6c);\n r_1_0_2_2_2.s_3 = r_1_0_2_2_2_3;\n }\n r_1_0_2_2.s_2 = r_1_0_2_2_2;\n }\n {\n string memory r_1_0_2_2_3 = unicode\"Moo é🚀🚀MéooMMoéé\";\n r_1_0_2_2.s_3 = r_1_0_2_2_3;\n }\n {\n bytes30 r_1_0_2_2_4 = bytes30(0x879267f6080428c1cf36b306026357777a4a64c5f4ce84d16a58ec1b164a);\n r_1_0_2_2.s_4 = r_1_0_2_2_4;\n }\n r_1_0_2.s_2 = r_1_0_2_2;\n }\n {\n string memory r_1_0_2_3 = unicode\"Moo é🚀oé🚀🚀oM\";\n r_1_0_2.s_3 = r_1_0_2_3;\n }\n {\n address r_1_0_2_4 = 0x4A6EDfA108dcD4DeB780d3e2ee72C8AbD7830807;\n r_1_0_2.s_4 = r_1_0_2_4;\n }\n r_1_0.s_2 = r_1_0_2;\n }\n {\n uint112[][4] memory r_1_0_3;\n {\n uint112[] memory r_1_0_3_0 = new uint112[](3);\n {\n uint112 r_1_0_3_0_0 = 4351667443914206212854853018692721;\n r_1_0_3_0[0] = r_1_0_3_0_0;\n }\n {\n uint112 r_1_0_3_0_1 = 1517345222968682662142905391693174;\n r_1_0_3_0[1] = r_1_0_3_0_1;\n }\n {\n uint112 r_1_0_3_0_2 = 3129906759525319741443462987241790;\n r_1_0_3_0[2] = r_1_0_3_0_2;\n }\n r_1_0_3[0] = r_1_0_3_0;\n }\n {\n uint112[] memory r_1_0_3_1 = new uint112[](4);\n {\n uint112 r_1_0_3_1_0 = 197210087679507814586905804169353;\n r_1_0_3_1[0] = r_1_0_3_1_0;\n }\n {\n uint112 r_1_0_3_1_1 = 515529612669684159505153039132691;\n r_1_0_3_1[1] = r_1_0_3_1_1;\n }\n {\n uint112 r_1_0_3_1_2 = 3127533943137336830095649740682130;\n r_1_0_3_1[2] = r_1_0_3_1_2;\n }\n {\n uint112 r_1_0_3_1_3 = 4690845167942691342852280970213394;\n r_1_0_3_1[3] = r_1_0_3_1_3;\n }\n r_1_0_3[1] = r_1_0_3_1;\n }\n {\n uint112[] memory r_1_0_3_2 = new uint112[](4);\n {\n uint112 r_1_0_3_2_0 = 1594614299129406019292472164413327;\n r_1_0_3_2[0] = r_1_0_3_2_0;\n }\n {\n uint112 r_1_0_3_2_1 = 4402712699161965853857467515963280;\n r_1_0_3_2[1] = r_1_0_3_2_1;\n }\n {\n uint112 r_1_0_3_2_2 = 2272433561112655291394457249640581;\n r_1_0_3_2[2] = r_1_0_3_2_2;\n }\n {\n uint112 r_1_0_3_2_3 = 3693414381600129884772179742807467;\n r_1_0_3_2[3] = r_1_0_3_2_3;\n }\n r_1_0_3[2] = r_1_0_3_2;\n }\n {\n uint112[] memory r_1_0_3_3 = new uint112[](1);\n {\n uint112 r_1_0_3_3_0 = 4853646781089043191072836236813945;\n r_1_0_3_3[0] = r_1_0_3_3_0;\n }\n r_1_0_3[3] = r_1_0_3_3;\n }\n r_1_0.s_3 = r_1_0_3;\n }\n {\n bool r_1_0_4 = true;\n r_1_0.s_4 = r_1_0_4;\n }\n r_1[0] = r_1_0;\n }\n {\n S_cacfb88b memory r_1_1;\n {\n bytes9 r_1_1_0 = bytes9(0x007db0b7bf377b23a4);\n r_1_1.s_0 = r_1_1_0;\n }\n {\n S_4cbd9404 memory r_1_1_1;\n {\n bool r_1_1_1_0 = true;\n r_1_1_1.s_0 = r_1_1_1_0;\n }\n {\n string memory r_1_1_1_1 = unicode\"Moo é🚀éo MMoMoooMoéo é\";\n r_1_1_1.s_1 = r_1_1_1_1;\n }\n {\n S_6e8ed41f memory r_1_1_1_2;\n {\n int56 r_1_1_1_2_0 = 18727119401979969;\n r_1_1_1_2.s_0 = r_1_1_1_2_0;\n }\n {\n S_4dc1782d memory r_1_1_1_2_1;\n {\n bytes6 r_1_1_1_2_1_0 = bytes6(0x239ec23186a3);\n r_1_1_1_2_1.s_0 = r_1_1_1_2_1_0;\n }\n {\n bool r_1_1_1_2_1_1 = true;\n r_1_1_1_2_1.s_1 = r_1_1_1_2_1_1;\n }\n {\n string memory r_1_1_1_2_1_2 = unicode\"Moo é🚀ééé🚀🚀o🚀é \";\n r_1_1_1_2_1.s_2 = r_1_1_1_2_1_2;\n }\n r_1_1_1_2.s_1 = r_1_1_1_2_1;\n }\n {\n S_75b95287 memory r_1_1_1_2_2;\n {\n string memory r_1_1_1_2_2_0 = unicode\"Moo é🚀MéooooMo o🚀 oé M🚀o 🚀🚀é\";\n r_1_1_1_2_2.s_0 = r_1_1_1_2_2_0;\n }\n {\n bool r_1_1_1_2_2_1 = false;\n r_1_1_1_2_2.s_1 = r_1_1_1_2_2_1;\n }\n {\n int r_1_1_1_2_2_2 = -3401957032145497625429453885115310098237378753282540910148069533561081084690;\n r_1_1_1_2_2.s_2 = r_1_1_1_2_2_2;\n }\n r_1_1_1_2.s_2 = r_1_1_1_2_2;\n }\n {\n S_8a864324 memory r_1_1_1_2_3;\n {\n int104 r_1_1_1_2_3_0 = 9503075869253945576732871112097;\n r_1_1_1_2_3.s_0 = r_1_1_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_1_1_1_2_3_1;\n {\n S_b0e02723 memory r_1_1_1_2_3_1_0;\n {\n bytes27[1] memory r_1_1_1_2_3_1_0_0;\n {\n bytes27 r_1_1_1_2_3_1_0_0_0 = bytes27(0x7ba786850e3be01d5374e16cb110a5f0b463c1bb6ac95ba396becd);\n r_1_1_1_2_3_1_0_0[0] = r_1_1_1_2_3_1_0_0_0;\n }\n r_1_1_1_2_3_1_0.s_0 = r_1_1_1_2_3_1_0_0;\n }\n {\n string memory r_1_1_1_2_3_1_0_1 = unicode\"Moo é🚀🚀éoé🚀é o🚀🚀M \";\n r_1_1_1_2_3_1_0.s_1 = r_1_1_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_1_1_1_2_3_1_0_2;\n {\n bool r_1_1_1_2_3_1_0_2_0 = true;\n r_1_1_1_2_3_1_0_2.s_0 = r_1_1_1_2_3_1_0_2_0;\n }\n {\n address r_1_1_1_2_3_1_0_2_1 = 0x9d356c7AA04A105B4634D5DF472696Fe90BA9E52;\n r_1_1_1_2_3_1_0_2.s_1 = r_1_1_1_2_3_1_0_2_1;\n }\n {\n address r_1_1_1_2_3_1_0_2_2 = 0x2a12DC12f44f2B527e503349578337762f01f7cb;\n r_1_1_1_2_3_1_0_2.s_2 = r_1_1_1_2_3_1_0_2_2;\n }\n {\n address r_1_1_1_2_3_1_0_2_3 = 0xC01011E87F0d4A5416aac0Aa45D4189123CE07AE;\n r_1_1_1_2_3_1_0_2.s_3 = r_1_1_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_1_1_1_2_3_1_0_2_4;\n {\n address r_1_1_1_2_3_1_0_2_4_0 = 0x7F1547A4b5Ee668f9ea78ADC46531c824D0fd65F;\n r_1_1_1_2_3_1_0_2_4[0] = r_1_1_1_2_3_1_0_2_4_0;\n }\n {\n address r_1_1_1_2_3_1_0_2_4_1 = 0x5ebD5e2ddf1AfD70aB20Da1F59552D4d6CCF6091;\n r_1_1_1_2_3_1_0_2_4[1] = r_1_1_1_2_3_1_0_2_4_1;\n }\n r_1_1_1_2_3_1_0_2.s_4 = r_1_1_1_2_3_1_0_2_4;\n }\n r_1_1_1_2_3_1_0.s_2 = r_1_1_1_2_3_1_0_2;\n }\n {\n bool r_1_1_1_2_3_1_0_3 = true;\n r_1_1_1_2_3_1_0.s_3 = r_1_1_1_2_3_1_0_3;\n }\n r_1_1_1_2_3_1[0] = r_1_1_1_2_3_1_0;\n }\n r_1_1_1_2_3.s_1 = r_1_1_1_2_3_1;\n }\n r_1_1_1_2.s_3 = r_1_1_1_2_3;\n }\n {\n bytes31[1] memory r_1_1_1_2_4;\n {\n bytes31 r_1_1_1_2_4_0 = bytes31(0x62b0dadd1b47d4900b291e875beb3f173bf1ac7a8701e78e17049242a64a96);\n r_1_1_1_2_4[0] = r_1_1_1_2_4_0;\n }\n r_1_1_1_2.s_4 = r_1_1_1_2_4;\n }\n r_1_1_1.s_2 = r_1_1_1_2;\n }\n {\n bool r_1_1_1_3 = true;\n r_1_1_1.s_3 = r_1_1_1_3;\n }\n {\n bool r_1_1_1_4 = true;\n r_1_1_1.s_4 = r_1_1_1_4;\n }\n r_1_1.s_1 = r_1_1_1;\n }\n {\n S_4f245c87 memory r_1_1_2;\n {\n string memory r_1_1_2_0 = unicode\"Moo é🚀éooMM oo MéM🚀🚀o 🚀ooo🚀M oooMoéMéMo 🚀oooo🚀🚀éo éé\";\n r_1_1_2.s_0 = r_1_1_2_0;\n }\n {\n bool r_1_1_2_1 = false;\n r_1_1_2.s_1 = r_1_1_2_1;\n }\n {\n S_e1fe1757 memory r_1_1_2_2;\n {\n uint216 r_1_1_2_2_0 = 61122460084730887589401861519436335256068040917044125863755700186;\n r_1_1_2_2.s_0 = r_1_1_2_2_0;\n }\n {\n bytes22 r_1_1_2_2_1 = bytes22(0x44673e7e80dbfcfd891d5cbc13240a6e61b2dcc66fb0);\n r_1_1_2_2.s_1 = r_1_1_2_2_1;\n }\n {\n S_8f5c69d2 memory r_1_1_2_2_2;\n {\n string memory r_1_1_2_2_2_0 = unicode\"Moo é🚀o oé oé🚀éo🚀 🚀éoo🚀MoM oé🚀 éo M🚀éé Méo🚀ooo🚀oo🚀éoo\";\n r_1_1_2_2_2.s_0 = r_1_1_2_2_2_0;\n }\n {\n bool r_1_1_2_2_2_1 = false;\n r_1_1_2_2_2.s_1 = r_1_1_2_2_2_1;\n }\n {\n bool[3] memory r_1_1_2_2_2_2;\n {\n bool r_1_1_2_2_2_2_0 = false;\n r_1_1_2_2_2_2[0] = r_1_1_2_2_2_2_0;\n }\n {\n bool r_1_1_2_2_2_2_1 = true;\n r_1_1_2_2_2_2[1] = r_1_1_2_2_2_2_1;\n }\n {\n bool r_1_1_2_2_2_2_2 = false;\n r_1_1_2_2_2_2[2] = r_1_1_2_2_2_2_2;\n }\n r_1_1_2_2_2.s_2 = r_1_1_2_2_2_2;\n }\n {\n bytes10 r_1_1_2_2_2_3 = bytes10(0xf99a38066201c0de2dbb);\n r_1_1_2_2_2.s_3 = r_1_1_2_2_2_3;\n }\n r_1_1_2_2.s_2 = r_1_1_2_2_2;\n }\n {\n string memory r_1_1_2_2_3 = unicode\"Moo é🚀🚀MéMooéo o🚀M🚀éMo MoMMo🚀M🚀o🚀éoo 🚀ooMoM🚀🚀oéM🚀 é \";\n r_1_1_2_2.s_3 = r_1_1_2_2_3;\n }\n {\n bytes30 r_1_1_2_2_4 = bytes30(0xa66df1dddd5cacdb8773bed83e82c915556af9cfbb1cd60b9e93ba443cd7);\n r_1_1_2_2.s_4 = r_1_1_2_2_4;\n }\n r_1_1_2.s_2 = r_1_1_2_2;\n }\n {\n string memory r_1_1_2_3 = unicode\"Moo é🚀🚀é\";\n r_1_1_2.s_3 = r_1_1_2_3;\n }\n {\n address r_1_1_2_4 = 0x72D38d5e263e936b9eC9C5E9095da3fE77a7ac3e;\n r_1_1_2.s_4 = r_1_1_2_4;\n }\n r_1_1.s_2 = r_1_1_2;\n }\n {\n uint112[][4] memory r_1_1_3;\n {\n uint112[] memory r_1_1_3_0 = new uint112[](2);\n {\n uint112 r_1_1_3_0_0 = 3843095391395019944319751356282358;\n r_1_1_3_0[0] = r_1_1_3_0_0;\n }\n {\n uint112 r_1_1_3_0_1 = 3527374467356275618008227406752912;\n r_1_1_3_0[1] = r_1_1_3_0_1;\n }\n r_1_1_3[0] = r_1_1_3_0;\n }\n {\n uint112[] memory r_1_1_3_1 = new uint112[](2);\n {\n uint112 r_1_1_3_1_0 = 3025715916080275893188199544395876;\n r_1_1_3_1[0] = r_1_1_3_1_0;\n }\n {\n uint112 r_1_1_3_1_1 = 4762734183378441203526413338708674;\n r_1_1_3_1[1] = r_1_1_3_1_1;\n }\n r_1_1_3[1] = r_1_1_3_1;\n }\n {\n uint112[] memory r_1_1_3_2 = new uint112[](1);\n {\n uint112 r_1_1_3_2_0 = 2248310426129254510834052394751565;\n r_1_1_3_2[0] = r_1_1_3_2_0;\n }\n r_1_1_3[2] = r_1_1_3_2;\n }\n {\n uint112[] memory r_1_1_3_3 = new uint112[](0);\n r_1_1_3[3] = r_1_1_3_3;\n }\n r_1_1.s_3 = r_1_1_3;\n }\n {\n bool r_1_1_4 = true;\n r_1_1.s_4 = r_1_1_4;\n }\n r_1[1] = r_1_1;\n }\n {\n S_cacfb88b memory r_1_2;\n {\n bytes9 r_1_2_0 = bytes9(0x2d4d4e1e6fc134a99e);\n r_1_2.s_0 = r_1_2_0;\n }\n {\n S_4cbd9404 memory r_1_2_1;\n {\n bool r_1_2_1_0 = false;\n r_1_2_1.s_0 = r_1_2_1_0;\n }\n {\n string memory r_1_2_1_1 = unicode\"Moo é🚀o🚀MééoéM 🚀o éoé🚀Mé🚀 o🚀 o🚀🚀éoMéo MMooM éoM🚀éé\";\n r_1_2_1.s_1 = r_1_2_1_1;\n }\n {\n S_6e8ed41f memory r_1_2_1_2;\n {\n int56 r_1_2_1_2_0 = -21096536789179785;\n r_1_2_1_2.s_0 = r_1_2_1_2_0;\n }\n {\n S_4dc1782d memory r_1_2_1_2_1;\n {\n bytes6 r_1_2_1_2_1_0 = bytes6(0x83b6e22b89b4);\n r_1_2_1_2_1.s_0 = r_1_2_1_2_1_0;\n }\n {\n bool r_1_2_1_2_1_1 = false;\n r_1_2_1_2_1.s_1 = r_1_2_1_2_1_1;\n }\n {\n string memory r_1_2_1_2_1_2 = unicode\"Moo é🚀\";\n r_1_2_1_2_1.s_2 = r_1_2_1_2_1_2;\n }\n r_1_2_1_2.s_1 = r_1_2_1_2_1;\n }\n {\n S_75b95287 memory r_1_2_1_2_2;\n {\n string memory r_1_2_1_2_2_0 = unicode\"Moo é🚀MéMooo🚀éo oM🚀MéMMM🚀 🚀éoé o🚀 🚀éoo M🚀é oo 🚀\";\n r_1_2_1_2_2.s_0 = r_1_2_1_2_2_0;\n }\n {\n bool r_1_2_1_2_2_1 = true;\n r_1_2_1_2_2.s_1 = r_1_2_1_2_2_1;\n }\n {\n int r_1_2_1_2_2_2 = -35632596317152684293585149403061416555670184918961394017008032728655846225195;\n r_1_2_1_2_2.s_2 = r_1_2_1_2_2_2;\n }\n r_1_2_1_2.s_2 = r_1_2_1_2_2;\n }\n {\n S_8a864324 memory r_1_2_1_2_3;\n {\n int104 r_1_2_1_2_3_0 = 2692272154424008380290346655986;\n r_1_2_1_2_3.s_0 = r_1_2_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_1_2_1_2_3_1;\n {\n S_b0e02723 memory r_1_2_1_2_3_1_0;\n {\n bytes27[1] memory r_1_2_1_2_3_1_0_0;\n {\n bytes27 r_1_2_1_2_3_1_0_0_0 = bytes27(0x9cda0d819f4ddcd4476fdf3cb19b4a93f51408ba361c97bcce02be);\n r_1_2_1_2_3_1_0_0[0] = r_1_2_1_2_3_1_0_0_0;\n }\n r_1_2_1_2_3_1_0.s_0 = r_1_2_1_2_3_1_0_0;\n }\n {\n string memory r_1_2_1_2_3_1_0_1 = unicode\"Moo é🚀🚀éoMé oéoo oMéoooo🚀é🚀🚀 🚀🚀Mooé🚀ooéoé\";\n r_1_2_1_2_3_1_0.s_1 = r_1_2_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_1_2_1_2_3_1_0_2;\n {\n bool r_1_2_1_2_3_1_0_2_0 = true;\n r_1_2_1_2_3_1_0_2.s_0 = r_1_2_1_2_3_1_0_2_0;\n }\n {\n address r_1_2_1_2_3_1_0_2_1 = 0xB1f5923E517207ee2fB4b4bEe0Ab3d3d19E263FF;\n r_1_2_1_2_3_1_0_2.s_1 = r_1_2_1_2_3_1_0_2_1;\n }\n {\n address r_1_2_1_2_3_1_0_2_2 = 0x3E6A520EA9d8753Ce9AaA5F8749FDAAbddE23B92;\n r_1_2_1_2_3_1_0_2.s_2 = r_1_2_1_2_3_1_0_2_2;\n }\n {\n address r_1_2_1_2_3_1_0_2_3 = 0xdD4B72b027345BeaC2cb6315275D601200d78b15;\n r_1_2_1_2_3_1_0_2.s_3 = r_1_2_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_1_2_1_2_3_1_0_2_4;\n {\n address r_1_2_1_2_3_1_0_2_4_0 = 0x319A738EF3Fb5Aea84681A2Ede9544C1D6F1a794;\n r_1_2_1_2_3_1_0_2_4[0] = r_1_2_1_2_3_1_0_2_4_0;\n }\n {\n address r_1_2_1_2_3_1_0_2_4_1 = 0x839183E24C35c4358010DC838C766Db13436BeEE;\n r_1_2_1_2_3_1_0_2_4[1] = r_1_2_1_2_3_1_0_2_4_1;\n }\n r_1_2_1_2_3_1_0_2.s_4 = r_1_2_1_2_3_1_0_2_4;\n }\n r_1_2_1_2_3_1_0.s_2 = r_1_2_1_2_3_1_0_2;\n }\n {\n bool r_1_2_1_2_3_1_0_3 = true;\n r_1_2_1_2_3_1_0.s_3 = r_1_2_1_2_3_1_0_3;\n }\n r_1_2_1_2_3_1[0] = r_1_2_1_2_3_1_0;\n }\n r_1_2_1_2_3.s_1 = r_1_2_1_2_3_1;\n }\n r_1_2_1_2.s_3 = r_1_2_1_2_3;\n }\n {\n bytes31[1] memory r_1_2_1_2_4;\n {\n bytes31 r_1_2_1_2_4_0 = bytes31(0x68af47ae2029cc39b842f7c217b686583617e6040b57bcf2e4e38a24212a54);\n r_1_2_1_2_4[0] = r_1_2_1_2_4_0;\n }\n r_1_2_1_2.s_4 = r_1_2_1_2_4;\n }\n r_1_2_1.s_2 = r_1_2_1_2;\n }\n {\n bool r_1_2_1_3 = true;\n r_1_2_1.s_3 = r_1_2_1_3;\n }\n {\n bool r_1_2_1_4 = true;\n r_1_2_1.s_4 = r_1_2_1_4;\n }\n r_1_2.s_1 = r_1_2_1;\n }\n {\n S_4f245c87 memory r_1_2_2;\n {\n string memory r_1_2_2_0 = unicode\"Moo é🚀ééo éMoo🚀ooo 🚀ooééo MM 🚀MM🚀M \";\n r_1_2_2.s_0 = r_1_2_2_0;\n }\n {\n bool r_1_2_2_1 = true;\n r_1_2_2.s_1 = r_1_2_2_1;\n }\n {\n S_e1fe1757 memory r_1_2_2_2;\n {\n uint216 r_1_2_2_2_0 = 25244257055884949875096069331316139460177198992542331600645463177;\n r_1_2_2_2.s_0 = r_1_2_2_2_0;\n }\n {\n bytes22 r_1_2_2_2_1 = bytes22(0x334780780af9905eee153d4581f16ae52561a3c50421);\n r_1_2_2_2.s_1 = r_1_2_2_2_1;\n }\n {\n S_8f5c69d2 memory r_1_2_2_2_2;\n {\n string memory r_1_2_2_2_2_0 = unicode\"Moo é🚀\";\n r_1_2_2_2_2.s_0 = r_1_2_2_2_2_0;\n }\n {\n bool r_1_2_2_2_2_1 = true;\n r_1_2_2_2_2.s_1 = r_1_2_2_2_2_1;\n }\n {\n bool[3] memory r_1_2_2_2_2_2;\n {\n bool r_1_2_2_2_2_2_0 = true;\n r_1_2_2_2_2_2[0] = r_1_2_2_2_2_2_0;\n }\n {\n bool r_1_2_2_2_2_2_1 = false;\n r_1_2_2_2_2_2[1] = r_1_2_2_2_2_2_1;\n }\n {\n bool r_1_2_2_2_2_2_2 = true;\n r_1_2_2_2_2_2[2] = r_1_2_2_2_2_2_2;\n }\n r_1_2_2_2_2.s_2 = r_1_2_2_2_2_2;\n }\n {\n bytes10 r_1_2_2_2_2_3 = bytes10(0x7f77fae79b343ded5b98);\n r_1_2_2_2_2.s_3 = r_1_2_2_2_2_3;\n }\n r_1_2_2_2.s_2 = r_1_2_2_2_2;\n }\n {\n string memory r_1_2_2_2_3 = unicode\"Moo é🚀\";\n r_1_2_2_2.s_3 = r_1_2_2_2_3;\n }\n {\n bytes30 r_1_2_2_2_4 = bytes30(0x70998e30f82208a475df2e16226cb2c0dc2cdde5d542841a4e6af29c39cc);\n r_1_2_2_2.s_4 = r_1_2_2_2_4;\n }\n r_1_2_2.s_2 = r_1_2_2_2;\n }\n {\n string memory r_1_2_2_3 = unicode\"Moo é🚀 é éo oo éoéo🚀 o oéMMoéo🚀MM🚀MéoooooMMM\";\n r_1_2_2.s_3 = r_1_2_2_3;\n }\n {\n address r_1_2_2_4 = 0x729328D745D7280A97AABB91B2553f06d3c85a9E;\n r_1_2_2.s_4 = r_1_2_2_4;\n }\n r_1_2.s_2 = r_1_2_2;\n }\n {\n uint112[][4] memory r_1_2_3;\n {\n uint112[] memory r_1_2_3_0 = new uint112[](1);\n {\n uint112 r_1_2_3_0_0 = 2502377143484476038673651246124084;\n r_1_2_3_0[0] = r_1_2_3_0_0;\n }\n r_1_2_3[0] = r_1_2_3_0;\n }\n {\n uint112[] memory r_1_2_3_1 = new uint112[](1);\n {\n uint112 r_1_2_3_1_0 = 803482201416434846728020011535020;\n r_1_2_3_1[0] = r_1_2_3_1_0;\n }\n r_1_2_3[1] = r_1_2_3_1;\n }\n {\n uint112[] memory r_1_2_3_2 = new uint112[](1);\n {\n uint112 r_1_2_3_2_0 = 1969084935455441007698839230581077;\n r_1_2_3_2[0] = r_1_2_3_2_0;\n }\n r_1_2_3[2] = r_1_2_3_2;\n }\n {\n uint112[] memory r_1_2_3_3 = new uint112[](2);\n {\n uint112 r_1_2_3_3_0 = 3698994371833325967111580429080967;\n r_1_2_3_3[0] = r_1_2_3_3_0;\n }\n {\n uint112 r_1_2_3_3_1 = 4147148449875753158786244866637883;\n r_1_2_3_3[1] = r_1_2_3_3_1;\n }\n r_1_2_3[3] = r_1_2_3_3;\n }\n r_1_2.s_3 = r_1_2_3;\n }\n {\n bool r_1_2_4 = false;\n r_1_2.s_4 = r_1_2_4;\n }\n r_1[2] = r_1_2;\n }\n {\n S_cacfb88b memory r_1_3;\n {\n bytes9 r_1_3_0 = bytes9(0xd46fc91e0203a1e4fc);\n r_1_3.s_0 = r_1_3_0;\n }\n {\n S_4cbd9404 memory r_1_3_1;\n {\n bool r_1_3_1_0 = true;\n r_1_3_1.s_0 = r_1_3_1_0;\n }\n {\n string memory r_1_3_1_1 = unicode\"Moo é🚀🚀oo Moo 🚀o ééé🚀o🚀M🚀o🚀M🚀Mo🚀oM M🚀Moo MM\";\n r_1_3_1.s_1 = r_1_3_1_1;\n }\n {\n S_6e8ed41f memory r_1_3_1_2;\n {\n int56 r_1_3_1_2_0 = 27748990894304484;\n r_1_3_1_2.s_0 = r_1_3_1_2_0;\n }\n {\n S_4dc1782d memory r_1_3_1_2_1;\n {\n bytes6 r_1_3_1_2_1_0 = bytes6(0xe932414f0727);\n r_1_3_1_2_1.s_0 = r_1_3_1_2_1_0;\n }\n {\n bool r_1_3_1_2_1_1 = false;\n r_1_3_1_2_1.s_1 = r_1_3_1_2_1_1;\n }\n {\n string memory r_1_3_1_2_1_2 = unicode\"Moo é🚀M🚀éo🚀 oéMooo M o éoooM\";\n r_1_3_1_2_1.s_2 = r_1_3_1_2_1_2;\n }\n r_1_3_1_2.s_1 = r_1_3_1_2_1;\n }\n {\n S_75b95287 memory r_1_3_1_2_2;\n {\n string memory r_1_3_1_2_2_0 = unicode\"Moo é🚀o oéooooééMo🚀éoéMo 🚀🚀é🚀oo🚀 oMé 🚀 🚀oM 🚀 oMoo é \";\n r_1_3_1_2_2.s_0 = r_1_3_1_2_2_0;\n }\n {\n bool r_1_3_1_2_2_1 = true;\n r_1_3_1_2_2.s_1 = r_1_3_1_2_2_1;\n }\n {\n int r_1_3_1_2_2_2 = 52411836837472820198293125195164928076251432430168676287052327103356919710586;\n r_1_3_1_2_2.s_2 = r_1_3_1_2_2_2;\n }\n r_1_3_1_2.s_2 = r_1_3_1_2_2;\n }\n {\n S_8a864324 memory r_1_3_1_2_3;\n {\n int104 r_1_3_1_2_3_0 = 1700458549325852792476907623436;\n r_1_3_1_2_3.s_0 = r_1_3_1_2_3_0;\n }\n {\n S_b0e02723[1] memory r_1_3_1_2_3_1;\n {\n S_b0e02723 memory r_1_3_1_2_3_1_0;\n {\n bytes27[1] memory r_1_3_1_2_3_1_0_0;\n {\n bytes27 r_1_3_1_2_3_1_0_0_0 = bytes27(0x3d2b2a31720f2131dfa00e8ee3315ede5f95edd33a9018ba528d7e);\n r_1_3_1_2_3_1_0_0[0] = r_1_3_1_2_3_1_0_0_0;\n }\n r_1_3_1_2_3_1_0.s_0 = r_1_3_1_2_3_1_0_0;\n }\n {\n string memory r_1_3_1_2_3_1_0_1 = unicode\"Moo é🚀o🚀oo M\";\n r_1_3_1_2_3_1_0.s_1 = r_1_3_1_2_3_1_0_1;\n }\n {\n S_59e4d3e3 memory r_1_3_1_2_3_1_0_2;\n {\n bool r_1_3_1_2_3_1_0_2_0 = true;\n r_1_3_1_2_3_1_0_2.s_0 = r_1_3_1_2_3_1_0_2_0;\n }\n {\n address r_1_3_1_2_3_1_0_2_1 = 0xfEa5a295aa12fBd82BAe28FEd0e00EAfBa5D4d35;\n r_1_3_1_2_3_1_0_2.s_1 = r_1_3_1_2_3_1_0_2_1;\n }\n {\n address r_1_3_1_2_3_1_0_2_2 = 0x21d389e6640268287eb7838576DCB3277bAD6E13;\n r_1_3_1_2_3_1_0_2.s_2 = r_1_3_1_2_3_1_0_2_2;\n }\n {\n address r_1_3_1_2_3_1_0_2_3 = 0x27b65f3338d28CC7f091022C3D1Bcc3Ae83B13a4;\n r_1_3_1_2_3_1_0_2.s_3 = r_1_3_1_2_3_1_0_2_3;\n }\n {\n address[2] memory r_1_3_1_2_3_1_0_2_4;\n {\n address r_1_3_1_2_3_1_0_2_4_0 = 0x5Beb62106aBDa3511dad7a32556a7eeade46B0e0;\n r_1_3_1_2_3_1_0_2_4[0] = r_1_3_1_2_3_1_0_2_4_0;\n }\n {\n address r_1_3_1_2_3_1_0_2_4_1 = 0x140278B84f0cd62899aBFD20D159E03460490566;\n r_1_3_1_2_3_1_0_2_4[1] = r_1_3_1_2_3_1_0_2_4_1;\n }\n r_1_3_1_2_3_1_0_2.s_4 = r_1_3_1_2_3_1_0_2_4;\n }\n r_1_3_1_2_3_1_0.s_2 = r_1_3_1_2_3_1_0_2;\n }\n {\n bool r_1_3_1_2_3_1_0_3 = true;\n r_1_3_1_2_3_1_0.s_3 = r_1_3_1_2_3_1_0_3;\n }\n r_1_3_1_2_3_1[0] = r_1_3_1_2_3_1_0;\n }\n r_1_3_1_2_3.s_1 = r_1_3_1_2_3_1;\n }\n r_1_3_1_2.s_3 = r_1_3_1_2_3;\n }\n {\n bytes31[1] memory r_1_3_1_2_4;\n {\n bytes31 r_1_3_1_2_4_0 = bytes31(0x330e49ed08cc23605e70513cd47b7ecfd406a59bd6b4c8abec201f64f41482);\n r_1_3_1_2_4[0] = r_1_3_1_2_4_0;\n }\n r_1_3_1_2.s_4 = r_1_3_1_2_4;\n }\n r_1_3_1.s_2 = r_1_3_1_2;\n }\n {\n bool r_1_3_1_3 = false;\n r_1_3_1.s_3 = r_1_3_1_3;\n }\n {\n bool r_1_3_1_4 = false;\n r_1_3_1.s_4 = r_1_3_1_4;\n }\n r_1_3.s_1 = r_1_3_1;\n }\n {\n S_4f245c87 memory r_1_3_2;\n {\n string memory r_1_3_2_0 = unicode\"Moo é🚀 oM oM MééMMoooMoooééM oooM M éMoo🚀éoMo🚀 🚀o🚀M🚀\";\n r_1_3_2.s_0 = r_1_3_2_0;\n }\n {\n bool r_1_3_2_1 = true;\n r_1_3_2.s_1 = r_1_3_2_1;\n }\n {\n S_e1fe1757 memory r_1_3_2_2;\n {\n uint216 r_1_3_2_2_0 = 95258903554469739649272631254932347606007506921841497299313653924;\n r_1_3_2_2.s_0 = r_1_3_2_2_0;\n }\n {\n bytes22 r_1_3_2_2_1 = bytes22(0x5058973cd7cb2d84fe12a3c198b1842a0bbe9ddb0ddd);\n r_1_3_2_2.s_1 = r_1_3_2_2_1;\n }\n {\n S_8f5c69d2 memory r_1_3_2_2_2;\n {\n string memory r_1_3_2_2_2_0 = unicode\"Moo é🚀MMé 🚀oooéo ooo🚀 ooMéo oo 🚀M ooM🚀🚀ééééMMMéoMM\";\n r_1_3_2_2_2.s_0 = r_1_3_2_2_2_0;\n }\n {\n bool r_1_3_2_2_2_1 = true;\n r_1_3_2_2_2.s_1 = r_1_3_2_2_2_1;\n }\n {\n bool[3] memory r_1_3_2_2_2_2;\n {\n bool r_1_3_2_2_2_2_0 = false;\n r_1_3_2_2_2_2[0] = r_1_3_2_2_2_2_0;\n }\n {\n bool r_1_3_2_2_2_2_1 = true;\n r_1_3_2_2_2_2[1] = r_1_3_2_2_2_2_1;\n }\n {\n bool r_1_3_2_2_2_2_2 = true;\n r_1_3_2_2_2_2[2] = r_1_3_2_2_2_2_2;\n }\n r_1_3_2_2_2.s_2 = r_1_3_2_2_2_2;\n }\n {\n bytes10 r_1_3_2_2_2_3 = bytes10(0xccdd6a90e30070c8d892);\n r_1_3_2_2_2.s_3 = r_1_3_2_2_2_3;\n }\n r_1_3_2_2.s_2 = r_1_3_2_2_2;\n }\n {\n string memory r_1_3_2_2_3 = unicode\"Moo é🚀 éMééM🚀oéMoé éMooMo🚀ooo oéMooo o o 🚀🚀 éoéooo éé\";\n r_1_3_2_2.s_3 = r_1_3_2_2_3;\n }\n {\n bytes30 r_1_3_2_2_4 = bytes30(0xebf347d511750a76c97ec85df0064defb2112a459ce2682f4de3ee108d74);\n r_1_3_2_2.s_4 = r_1_3_2_2_4;\n }\n r_1_3_2.s_2 = r_1_3_2_2;\n }\n {\n string memory r_1_3_2_3 = unicode\"Moo é🚀é🚀oM🚀🚀oMéo 🚀o🚀 MMoo ooMMMo 🚀éMoéooMoM 🚀 🚀\";\n r_1_3_2.s_3 = r_1_3_2_3;\n }\n {\n address r_1_3_2_4 = 0x2DDC2B97fB0F70B538412ed393aDCDc88EDD4C48;\n r_1_3_2.s_4 = r_1_3_2_4;\n }\n r_1_3.s_2 = r_1_3_2;\n }\n {\n uint112[][4] memory r_1_3_3;\n {\n uint112[] memory r_1_3_3_0 = new uint112[](2);\n {\n uint112 r_1_3_3_0_0 = 171747982968366975167544630288517;\n r_1_3_3_0[0] = r_1_3_3_0_0;\n }\n {\n uint112 r_1_3_3_0_1 = 4364508640690874416442345556760859;\n r_1_3_3_0[1] = r_1_3_3_0_1;\n }\n r_1_3_3[0] = r_1_3_3_0;\n }\n {\n uint112[] memory r_1_3_3_1 = new uint112[](1);\n {\n uint112 r_1_3_3_1_0 = 3328153896153303566704371299921876;\n r_1_3_3_1[0] = r_1_3_3_1_0;\n }\n r_1_3_3[1] = r_1_3_3_1;\n }\n {\n uint112[] memory r_1_3_3_2 = new uint112[](0);\n r_1_3_3[2] = r_1_3_3_2;\n }\n {\n uint112[] memory r_1_3_3_3 = new uint112[](0);\n r_1_3_3[3] = r_1_3_3_3;\n }\n r_1_3.s_3 = r_1_3_3;\n }\n {\n bool r_1_3_4 = false;\n r_1_3.s_4 = r_1_3_4;\n }\n r_1[3] = r_1_3;\n }\n r[1] = r_1;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000002d4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000016a0000000000000000000000000000000000000000000000000000000000000224038ff1d4bd09084daac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffab9d27e501a62d00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002003ee006aedc7376ecd84c916ee5223648efda9cdb16ee49a68fbeaa0972d2a500a3041454f737000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000ab0c136a551c06ca5740fbcba98364c709ced615930af642384d74f368f9e72100000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80f09f9a80f09f9a8020f09f9a80c3a9f09f9a804d6f6f2020000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffa629af35e3025190619ff34e4a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020afc32882a67fb6e2a12ef12e5593e8f0fee4476e3cb861b902a2ff0000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001f3d32b69454a0070322b60ec7426d866026c3e10000000000000000000000005a81cc72331fd53bfc70072ad9e17efaa54d15f80000000000000000000000006d23544ed1963a7626db178130b813db9989a5f100000000000000000000000003dccb8f62d73b34f5b5e6547da3996382bf95e300000000000000000000000080e3a24161b435412256c4c6b7e555e1fe7674a7000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000574d6f6f20c3a9f09f9a806f20c3a9c3a9c3a96fc3a94d20204d4dc3a96ff09f9a80206ff09f9a806f6f4d6fc3a920f09f9a80206f6fc3a94d6f204d6f206ff09f9a806f20c3a96fc3a96f6f6fc3a96f6f6f6f6f4dc3a92000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000ae3edd08bee48aca623c4c39eaecd9fe1a6274ca000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a804d6f6f4df09f9a80f09f9a806f6f4d4df09f9a806f6fc3a920c3a92020206f6ff09f9a80c3a96ff09f9a80c3a96f206f6f6ff09f9a804d20c3a9f09f9a806fc3a9206f206f4df09f9a804df09f9a804dc3a96f6f00000000000000b09a3ab1a5f781b6b5e1b6ca17f329af593d22d44d22a13276f6919d36abda1a703a914767eba207083d47f0a764bc0c470000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c07c194ace6f06432df5a7b6b88d86e9f19b397a1ab0105601fde3c1ab2efc000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000017decc7fe1bccee97d17b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a806f6f6f206f20c3a96fc3a92020c3a9c3a9c3a96fc3a92020206f6f6f6fc3a9204d4d6ff09f9a804d6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a806f6f4d4dc3a96f206f20c3a96fc3a9c3a96f4d000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000002f1a7ea1ad524564a187a96ab62a0000000000000000000000000000000000009521d34955569099d060692aa4850000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000d0ed5bec7137bb65350d98d52bda00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000008d9c669f2ceee09cdb6bc6e2e09e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000057d81e9b625d239a824bfebd9940000000000000000000000000000000000006f6ddc411317dee9d5e934a87d8e55906f3ed2d25e1f42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80f09f9a806f206f6f6fc3a96fc3a9f09f9a8000000000ffffffffffffffffffffffffffffffffffffffffffffffffffcfb9356e04592000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002005556b6b433f517aad338cceb71fa66c0d0ffb00189ae3e905f90b7c9673f33009822b712d015000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002b4d6f6f20c3a9f09f9a806fc3a96f6f6fc3a96f4d6ff09f9a80206f6f20c3a94d4d20f09f9a80f09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000fcf1e9bad118689acaecc2bf1124b2472725a6c19d588240ccb544dfd23b925c000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a804d2020c3a920204df09f9a80206f206fc3a96f000000ffffffffffffffffffffffffffffffffffffffe2f4241d3c68fdf1b99211710f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020b2768925b357944d0ae111562b62207a3183208c8ab4bd31f69f5e00000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055ab8c91f89206f1f5e9b782aa29393f20e86937000000000000000000000000abdbf1e9fed389d4a969ced2fa5f60f4170b74e7000000000000000000000000cb5e46bcd1188d4bdc4a5e1252d6ed8b63fefc500000000000000000000000004dcee8608f0dfe1fb8b0f008d2e460ec5c2dd4ce00000000000000000000000068cedfa366d0cc5b894921cd966fdba4dc9fcae10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d4d6f6f20c3a9f09f9a806ff09f9a80204df09f9a804dc3a9f09f9a806f6f204d20f09f9a806f6f6f6fc3a96f6f6f4d6fc3a96f4dc3a94df09f9a806f2000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000ad230d50ed982311f04d14a5c9fa475cebf3624b00000000000000000000000000000000000000000000000000000000000000634d6f6f20c3a9f09f9a80f09f9a804d4d4d4d6f20204d20c3a96f4dc3a94d204df09f9a8020206fc3a9f09f9a80f09f9a80f09f9a806fc3a96f20206ff09f9a80c3a96f20c3a9f09f9a80c3a96fc3a94d6f4dc3a9c3a9f09f9a806ff09f9a804d206f6f00000000000000000000000000000000000000000000000000000000000000000000d428844024b7cb04d2a1d1dd3155fd3eaa4b8539c44cfd9388e94079b8620d9fc052a643f3a29332e373ca3f8d021986e30000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002003b291c86abe0818a70a9f010dd7acbf19e1f2bc3f021c0778f610363ad50000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102f1a6afc51609028dc80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a80f09f9a80204d6f6ff09f9a80f09f9a806f6f4d6f4df09f9a80c3a94d6f6f6ff09f9a802020206f204d206f2020c3a96f206ff09f9a804dc3a9f09f9a80206f6f4d4d204d6f6fc3a9c3a96ff09f9a80f09f9a80c3a96ff09f9a80c3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a804d2020f09f9a806f20f09f9a804df09f9a804dc3a920c3a96f6f206f6f2020f09f9a80f09f9a80c3a9f09f9a804d6f6f6f6f6fc3a96f4df09f9a806f6f6ff09f9a806f4d4d6f206f6f4d6f2000000000000000000000000000000000000000000000000000000000000000000000000000000000002c4d6f6f20c3a9f09f9a804dc3a92020f09f9a804df09f9a806f6f6f6ff09f9a80204df09f9a80206f6f20c3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000524f8da099b62b203f85defd03930000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000da5d1a9869902cb7cc6974c1092800000000000000000000000000000000000046415f27d2c1331ad38ee32aae5f000000000000000000000000000000000000e02aeb7f0964751016f1b03e65e80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000d3d7a71f858f66c899942b4f1e6000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000002ce8b649ac152ee2c2ee69bf0c1b00000000000000000000000000000000000093bb8a4c3749185ad87d7c00e995000000000000000000000000000000000000c562ff9003d90e3ac0375e26792475b5d4ce932f386ef6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a804dc3a9c3a94d00000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffee0db63bbe2d3500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000240d39bc92ff2aedc0ca315f6f383f38067f4bd3fdcbd5553d41a05ae6121f64a00e58fc222ce5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000544d6f6f20c3a9f09f9a806ff09f9a80c3a9204d6f6f4d6ff09f9a80f09f9a80f09f9a80206f6ff09f9a80c3a9c3a9206f6f206f206fc3a94df09f9a806f6ff09f9a804d204d4dc3a96ff09f9a806fc3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001ef8786dabe5bbfe995176b771343d7e0bcac14493576cf39c0060f9259f1493600000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a80c3a94d4d6ff09f9a806f4d6ff09f9a80c3a9f09f9a80f09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca838c90b0a8f3a9fdb2c566000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000208668d85da31504503ea9b77aef6cee6b9b87107d54a85689791c79000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000138a9e491d88e30e2562aada9bb86de9931dd89f0000000000000000000000007ec0e8ad2b0482b1661ed6853de7b8a0a3b54fc600000000000000000000000023138e20c675b781be3f96c7992cb4ffc415e1d40000000000000000000000004212e1bcaf5748c806952257228816e553ce52a1000000000000000000000000c7c1334dd1a2e8c4f7bc5c9b0281cf01d9fb03d8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a804d6f4dc3a96f204d4d20c3a96f00000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003200000000000000000000000004f46ec04723d0eff4fa143ceb8fcb9d7ceeacb8100000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a804d4df09f9a804d6f4df09f9a80204dc3a94df09f9a806f4d206f6fc3a9c3a94d6fc3a920206f6f4d206f6f20c3a96f6f4d6fc3a96f2000000000004949a88c7ac4099fb9911018f6756cea01499c30c2c84044097e7ac2e7db0a808e4f73a557c27c7bf7b66c338b8c2b7e080000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e01ce56dbf942e1efca45cf426cfe753dcc546c27bf04d6ba4fbdebe8d0f7d000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089cff81cac99fdb50a4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000474d6f6f20c3a9f09f9a806f6fc3a94d6f6fc3a9206f206f6f20206f4dc3a96f4d206f4dc3a920f09f9a80f09f9a80c3a96ff09f9a806f4d4df09f9a806f204df09f9a80f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4d6f6f20c3a9f09f9a80204dc3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000894d6f6f20c3a9f09f9a80c3a9f09f9a80c3a9c3a9f09f9a80f09f9a80c3a96f6ff09f9a804d6f20c3a9206ff09f9a80206ff09f9a80f09f9a80f09f9a80f09f9a806fc3a9c3a9f09f9a80204d204df09f9a804d6ff09f9a804d4d6f6f6f6ff09f9a806fc3a9f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80f09f9a80c3a9c3a9f09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000008e2fba5680ec2eabb063c2d9bdf1000000000000000000000000000000000000c19a02ebadd806a1ba38133db1fa00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000009751601588221534f0a65e068bc0000000000000000000000000000000000000bfbadf38e9c461000510294abe200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000ce91ecb822dc8beadcc4508a5e360000000000000000000000000000000000000da3c623f787206aa8b5417491ad0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000e9146141693db5361b2d0648132600000000000000000000000000000000000064c00ec8d661be9254108ac20a7400000000000000000000000000000000000044c1493300b755bab6568d195da8000000000000000000000000000000000000b4faa7cdadd426049a13dda926330cd7ca5805dc4b06af000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003c4d6f6f20c3a9f09f9a804dc3a96f6ff09f9a804df09f9a806fc3a96fc3a94df09f9a806ff09f9a804df09f9a80c3a96fc3a96fc3a9c3a9204d4d6f6f00000000ffffffffffffffffffffffffffffffffffffffffffffffffffe28bd016db305400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002207225a3846e77a05674dcfd69efa3437df1171f5ad40ee2d4ff13d1b47ff8c200765ad85b742600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000524d6f6f20c3a9f09f9a8020f09f9a80206f4df09f9a804df09f9a806f6ff09f9a804d6f6f6f2020202020c3a96f204d6ff09f9a804d6fc3a9c3a920c3a920204df09f9a80f09f9a8020206f6f6f6ff09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000016ff9dabb1d50022b4bf8cfcf46fab2d80c77754ea646c58035f236436f93516000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000004653d03143e124395e314940b4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000206fb989260c92e8bc966195c04f7e2fe9d9875833b429350acc0e5c0000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b139e7d36fdadbcc7df8c75adbb6ffa292cef450000000000000000000000000f5c24cfced9554fd235f87285c4c5cc47a5b41800000000000000000000000000da6347a2a1277521bd00823c4ddcd703aeb815000000000000000000000000f5e8e208b26d7a51957f530f4764bf9894f58b54000000000000000000000000eed761fa1dcb2eaf8f93628fae92acde6c174478000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a8020c3a9f09f9a80f09f9a806fc3a94df09f9a804d204d6f6f204d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000041aba07653cf095ef00019df15cb694f8a3f496c00000000000000000000000000000000000000000000000000000000000000274d6f6f20c3a9f09f9a8020c3a920c3a96fc3a96f4d6fc3a9c3a9f09f9a80c3a9c3a9c3a96f20200000000000000000000000000000000000000000000000000000000000000d38c118dd25a5c38c5555e02649d877c7426bb80a665937019578aa324338c7572bf832363b06c4dbdc46a53eb66664610000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c0f9f34cc5c85b184dab5f73987a5e56267ce678c94d489c7f5395f6c689f4000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000539d1fa27354cc2a21be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a804dc3a9204dc3a9c3a9c3a96f6f4df09f9a802020c3a96f206ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124d6f6f20c3a9f09f9a806ff09f9a806f6f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c4d6f6f20c3a9f09f9a804d4d6fc3a96ff09f9a806ff09f9a806f6f206f6fc3a96fc3a9f09f9a804df09f9a806f6f4d4d4d20206f4dc3a96fc3a96f6f6ff09f9a80206f6ff09f9a80f09f9a806ff09f9a80f09f9a806f6fc3a94dc3a9f09f9a806f20c3a9f09f9a806f6f6f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000aca24db860ed2a764031add3738f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000dcc9f1064e5588c1d8f98575346c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000042c1efd695fe8e8e1d46421c382b00000000000000000000000000000000000051726ad2ddf3daf20d35cd4e1c13000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000016a00000000000000000000000000000000000000000000000000000000000002160d188f2eb918e1c3678000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002e4d6f6f20c3a9f09f9a80204d204d6ff09f9a804d4d6fc3a9f09f9a80f09f9a802020c3a9f09f9a80c3a96f4d4d6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000046c63a8436c03a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002409362b4b7041fcc5a3082d548b8f5fbc9b6fda237d07a6bf8df941f7e15bbb40091efc664009c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000664d6f6f20c3a9f09f9a80c3a94df09f9a80f09f9a80204d6f206ff09f9a804dc3a9c3a96fc3a9f09f9a8020f09f9a80c3a920f09f9a80206f6f6f6f6fc3a96ff09f9a804df09f9a80c3a96f6fc3a96f4d20206f4d6f4dc3a94d6f6ff09f9a804d6f20f09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001b2f175d4e86e55c5b49f8ff4e1edb93b04f86c0b7db71563395f5822424aa33e000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffc1107adc49aa7e7708fa64cebb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000201aab4ed8883174b501f54aeb7d0d4602c93cb428b2178d4b7e5d2a000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b8c72e057bd699fb60e3d241113afb68cab74f7c000000000000000000000000c28a699999eee79100db2911ffb44af237efa261000000000000000000000000be24517fe6547ce354b911a96221e3b0fc411a4f0000000000000000000000004018a5b4f4eb4efaf80f60e664c20b4619dbe3b700000000000000000000000043af520cf1e78a3e5edd906cf096c59dab98701f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80206ff09f9a80206f6f2020f09f9a804d4d6f0000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000004a6edfa108dcd4deb780d3e2ee72c8abd7830807000000000000000000000000000000000000000000000000000000000000003e4d6f6f20c3a9f09f9a8020c3a9f09f9a806f204d6f206f6f6ff09f9a80206f6f20c3a96f6f20c3a94d20206f6f206f4d6f6f6f6fc3a96f20c3a96f6f206f000000000000001876bb613124927972e7213e5da5b2129d9dc12bd5da150a4f4154dca5466aa8187330679e5caa01d2823cfdc605447e080000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c0879267f6080428c1cf36b306026357777a4a64c5f4ce84d16a58ec1b164a000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000008d2c525bd7c61732ad6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a80c3a94d6ff09f9a806f20f09f9a80c3a96f6fc3a920f09f9a8020f09f9a80c3a9f09f9a804dc3a96fc3a94d206f6f4d4d000000000000000000000000000000000000000000000000000000000000000000000000001a4d6f6f20c3a9f09f9a80f09f9a804dc3a96f6f4d4d6fc3a9c3a900000000000000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806fc3a9f09f9a80f09f9a806f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000d68dc3dde24f3848059dcb9dac710000000000000000000000000000000000004acf96d6fd5964a893881dd2bd760000000000000000000000000000000000009a50fa2e93f8d91e8bcb831fd93e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000009b9242920dcf58fa812db906089000000000000000000000000000000000000196ae604cc1e1c1f7760860de8130000000000000000000000000000000000009a330732dd5ed588d8bf1a43f392000000000000000000000000000000000000e746ca336905d7ba48f19455781200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000004e9edcb0bd5b99f52c39586aef8f000000000000000000000000000000000000d9120bfb63461ff1bbbb19ae8790000000000000000000000000000000000000700a24d911359bd234abf1bdf085000000000000000000000000000000000000b6197182958b55f52c4a461bd5ab0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000ef4da2957f4ccf2fe207d28b2679007db0b7bf377b23a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001d4d6f6f20c3a9f09f9a80c3a96f204d4d6f4d6f6f6f4d6fc3a96f20c3a900000000000000000000000000000000000000000000000000000000428837439f104100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000020062b0dadd1b47d4900b291e875beb3f173bf1ac7a8701e78e17049242a64a9600239ec23186a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000204d6f6f20c3a9f09f9a80c3a9c3a9c3a9f09f9a80f09f9a806ff09f9a80c3a92000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000f87a8f808519361c4278b91e7865745edaacbe63b22bf9831c2f886ca93b44ee00000000000000000000000000000000000000000000000000000000000000314d6f6f20c3a9f09f9a804dc3a96f6f6f6f4d6f206ff09f9a802020206fc3a9204df09f9a806f20f09f9a80f09f9a80c3a90000000000000000000000000000000000000000000000000000000000000000000077f2181e60fc2d2bc6bc9c35a1000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000207ba786850e3be01d5374e16cb110a5f0b463c1bb6ac95ba396becd0000000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009d356c7aa04a105b4634d5df472696fe90ba9e520000000000000000000000002a12dc12f44f2b527e503349578337762f01f7cb000000000000000000000000c01011e87f0d4a5416aac0aa45d4189123ce07ae0000000000000000000000007f1547a4b5ee668f9ea78adc46531c824d0fd65f0000000000000000000000005ebd5e2ddf1afd70ab20da1f59552d4d6ccf6091000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000254d6f6f20c3a9f09f9a80f09f9a80c3a96fc3a9f09f9a80c3a9206ff09f9a80f09f9a804d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000038000000000000000000000000072d38d5e263e936b9ec9c5e9095da3fe77a7ac3e00000000000000000000000000000000000000000000000000000000000000554d6f6f20c3a9f09f9a80c3a96f6f4d4d20206f6f204dc3a94df09f9a80f09f9a806f20f09f9a806f6f6ff09f9a804d206f6f6f4d6fc3a94dc3a94d6f20f09f9a806f6f6f6ff09f9a80f09f9a80c3a96f20c3a9c3a900000000000000000000000000000000949499acc9878d079854d2ddaa8cb994cd73fd41b2153728c4d7da44673e7e80dbfcfd891d5cbc13240a6e61b2dcc66fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e0a66df1dddd5cacdb8773bed83e82c915556af9cfbb1cd60b9e93ba443cd7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000f99a38066201c0de2dbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a806f206fc3a9206fc3a9f09f9a80c3a96ff09f9a8020f09f9a80c3a96f6ff09f9a804d6f4d206fc3a9f09f9a8020c3a96f204df09f9a80c3a9c3a9204dc3a96ff09f9a806f6f6ff09f9a806f6ff09f9a80c3a96f6f0000000000000000000000000000000000000000000000000000000000000000005c4d6f6f20c3a9f09f9a80f09f9a804dc3a94d6f6fc3a96f206ff09f9a804df09f9a80c3a94d6f204d6f4d4d6ff09f9a804df09f9a806ff09f9a80c3a96f6f20f09f9a806f6f4d6f4df09f9a80f09f9a806fc3a94df09f9a8020c3a9200000000000000000000000000000000000000000000000000000000000000000000000104d6f6f20c3a9f09f9a80f09f9a80c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000bd7aaeeff42f8781ae7d3245f5f6000000000000000000000000000000000000ade9b99c9c96a7428a2b28c52c900000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000952de768dfee2aca882015d61864000000000000000000000000000000000000ead228233bf60a6e27c1abfa8ac200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000006ed9aacb7eb566122e035601964d00000000000000000000000000000000000000000000000000000000000000002d4d4e1e6fc134a99e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000005a4d6f6f20c3a9f09f9a806ff09f9a804dc3a9c3a96fc3a94d20f09f9a806f20c3a96fc3a9f09f9a804dc3a9f09f9a8020206ff09f9a80206ff09f9a80f09f9a80c3a96f4dc3a96f204d4d6f6f4d20c3a96f4df09f9a80c3a9c3a9000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffb50ccfc2b0a27700000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000022068af47ae2029cc39b842f7c217b686583617e6040b57bcf2e4e38a24212a540083b6e22b89b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001b138aa49c12a635e2126c57c079d8762f3c25027e0d97ab21e57a6c6c88f4ad500000000000000000000000000000000000000000000000000000000000000534d6f6f20c3a9f09f9a804dc3a94d6f6f6ff09f9a80c3a96f20206f4df09f9a804dc3a94d4d4df09f9a8020f09f9a80c3a96fc3a9206ff09f9a8020f09f9a80c3a96f6f204df09f9a80c3a9206f6f20f09f9a80000000000000000000000000000000000000000000000000000000000000000021fb3354716fdd255c3f1a20f2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000209cda0d819f4ddcd4476fdf3cb19b4a93f51408ba361c97bcce02be000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b1f5923e517207ee2fb4b4bee0ab3d3d19e263ff0000000000000000000000003e6a520ea9d8753ce9aaa5f8749fdaabdde23b92000000000000000000000000dd4b72b027345beac2cb6315275d601200d78b15000000000000000000000000319a738ef3fb5aea84681a2ede9544c1d6f1a794000000000000000000000000839183e24c35c4358010dc838c766db13436beee0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004a4d6f6f20c3a9f09f9a80f09f9a80c3a96f4dc3a9206fc3a96f6f206f4dc3a96f6f6f6ff09f9a80c3a9f09f9a80f09f9a8020f09f9a80f09f9a804d6f6fc3a9f09f9a806f6fc3a96fc3a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000729328d745d7280a97aabb91b2553f06d3c85a9e000000000000000000000000000000000000000000000000000000000000003a4d6f6f20c3a9f09f9a80c3a9c3a96f20c3a94d6f6ff09f9a806f6f6f2020f09f9a806f6fc3a9c3a96f204d4d20f09f9a804d4df09f9a804d202000000000000000000000003d5d8a2bfce933d2e746813506090f0194da23fe0d25606b311c89334780780af9905eee153d4581f16ae52561a3c504210000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a070998e30f82208a475df2e16226cb2c0dc2cdde5d542841a4e6af29c39cc000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017f77fae79b343ded5b9800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404d6f6f20c3a9f09f9a8020c3a920c3a96f206f6f20c3a96fc3a96ff09f9a80206f206fc3a94d4d6fc3a96ff09f9a804d4df09f9a804dc3a96f6f6f6f6f4d4d4d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000007b6070a262dcfd08377b58214c340000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000279d5f038b08b726ebc86ab04aac00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000006115589314376bbc62d1222989550000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000b65fdf6e52c34a4bec764d385987000000000000000000000000000000000000cc785f5b1dd72eec12a72382803bd46fc91e0203a1e4fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d4d6f6f20c3a9f09f9a80f09f9a806f6f204d6f6f20f09f9a806f20c3a9c3a9c3a9f09f9a806ff09f9a804df09f9a806ff09f9a804df09f9a804d6ff09f9a806f4d204df09f9a804d6f6f204d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062958f69216ce400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240330e49ed08cc23605e70513cd47b7ecfd406a59bd6b4c8abec201f64f4148200e932414f0727000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002a4d6f6f20c3a9f09f9a804df09f9a80c3a96ff09f9a80206fc3a94d6f6f6f20204d206f20c3a96f6f6f4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000173e00c63a9eea27b43c7754f1611980edc86af7f2d1a6842463236949bb9837a00000000000000000000000000000000000000000000000000000000000000594d6f6f20c3a9f09f9a806f206fc3a96f6f6f6fc3a9c3a94d6ff09f9a80c3a96fc3a94d6f20f09f9a80f09f9a80c3a9f09f9a806f6ff09f9a80206f4dc3a920f09f9a802020f09f9a806f4d20f09f9a80206f4d6f6f20c3a920000000000000000000000000000000000000000000000000000015767a582e082d8b3de648540c000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000203d2b2a31720f2131dfa00e8ee3315ede5f95edd33a9018ba528d7e000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000fea5a295aa12fbd82bae28fed0e00eafba5d4d3500000000000000000000000021d389e6640268287eb7838576dcb3277bad6e1300000000000000000000000027b65f3338d28cc7f091022c3d1bcc3ae83b13a40000000000000000000000005beb62106abda3511dad7a32556a7eeade46b0e0000000000000000000000000140278b84f0cd62899abfd20d159e03460490566000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000144d6f6f20c3a9f09f9a806ff09f9a806f6f20204d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000003800000000000000000000000002ddc2b97fb0f70b538412ed393adcdc88edd4c4800000000000000000000000000000000000000000000000000000000000000514d6f6f20c3a9f09f9a80206f4d206f4d204dc3a9c3a94d4d6f6f6f4d6f6f6fc3a9c3a94d2020206f6f6f4d2020204d20c3a94d6f6ff09f9a80c3a96f4d6ff09f9a8020f09f9a806ff09f9a804df09f9a800000000000000000000000000000000000000000e78fc2df20febd331f2f845acf60009a63596675aa5dbe6b0e78a45058973cd7cb2d84fe12a3c198b1842a0bbe9ddb0ddd0000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e0ebf347d511750a76c97ec85df0064defb2112a459ce2682f4de3ee108d74000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ccdd6a90e30070c8d89200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e4d6f6f20c3a9f09f9a804d4dc3a920f09f9a806f6f6fc3a96f206f6f6ff09f9a8020206f6f4dc3a96f206f6f20f09f9a804d206f6f4df09f9a80f09f9a80c3a9c3a9c3a9c3a94d4d4dc3a96f4d4d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000504d6f6f20c3a9f09f9a8020c3a94dc3a9c3a94df09f9a806fc3a94d6fc3a920c3a94d6f6f4d6ff09f9a806f6f6f206fc3a94d6f6f6f206f206f20f09f9a80f09f9a8020c3a96fc3a96f6f6f20c3a9c3a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4d6f6f20c3a9f09f9a80c3a9f09f9a806f4df09f9a80f09f9a806f4dc3a96f20f09f9a806ff09f9a80204d4d6f6f206f6f4d4d4d6f20f09f9a80c3a94d6fc3a96f6f4d6f4d20f09f9a8020f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000877c3a9c1ab582dfb7b8225a085000000000000000000000000000000000000d72fd802e650189420f0c2ff591b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000a417353a7da761dd39dedcfa2fd400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "random-((bool,bool,string,bytes3[],address),int112,string[4],bool,(address,uint32[1],(int88[3][2],string),(string,uint96,((bytes15,address,int192,bool,((string[3])))[4],bytes1,(string,(bytes20,(string,((bool,bool),address,bool,bool,int240),uint32[3],(address,uint248[1]),string)),bool),bytes19,(string[][1])),bool[2],string)))", + "type": "((bool,bool,string,bytes3[],address),int112,string[4],bool,(address,uint32[1],(int88[3][2],string),(string,uint96,((bytes15,address,int192,bool,((string[3])))[4],bytes1,(string,(bytes20,(string,((bool,bool),address,bool,bool,int240),uint32[3],(address,uint248[1]),string)),bool),bytes19,(string[][1])),bool[2],string)))", + "value": [ + [ + true, + false, + "Moo é🚀oé oMoo🚀 o 🚀o🚀o🚀🚀o🚀oéM MM🚀oooMooMM 🚀oé oé éoMo ooo", + ["0x0f921c", "0x1e0e9f", "0xd4e216"], + "0x5F62F0cDDA00Ca0058C649E24dfF47DBDCAFc99F" + ], + "229809142055791099499100764505283", + [ + "Moo é🚀é🚀🚀🚀🚀", + "Moo é🚀é🚀o🚀oM 🚀oooo", + "Moo é🚀 éé é oMééMo éM o🚀ooMo Méoo🚀 MoéM o🚀oM éMM🚀🚀🚀o oéoo o", + "Moo é🚀 oéooéé" + ], + true, + [ + "0xE972cf1fD035e5f44c17ba7B2CfE6E7006834c95", + ["2722283023"], + [ + [ + [ + "-153706940789971282110150562", + "-84948272298763788328565431", + "-12179002006932522499700625" + ], + [ + "-1153595338901722314148663", + "106025502107731607551969080", + "-92623606922103469825682763" + ] + ], + "Moo é🚀🚀 o 🚀oé 🚀🚀 🚀 ééooéoéo " + ], + [ + "Moo é🚀", + "28610939720196723693041822565", + [ + [ + [ + "0xec366485ec6d9c690515f6ffaefb77", + "0xc7a6bE0463115cf55D197A241696Bf0a278668D7", + "-1784580040333686047436184849061162100640945103813418928162", + true, + [ + [ + [ + "Moo é🚀Méo ", + "Moo é🚀MM ", + "Moo é🚀🚀🚀 oéo🚀🚀oMo🚀M🚀 🚀 🚀oMM" + ] + ] + ] + ], + [ + "0x4b20ca764fc89d49984d8828034102", + "0x546E3D2Ec295F2FdaF00A28579014eA427AD2df6", + "470943194378295996088521481971778550562517747326576357453", + false, + [ + [ + [ + "Moo é🚀oéoooMooM🚀🚀o🚀oéoM🚀oo🚀oMééooéoé🚀oo MooM🚀", + "Moo é🚀éoMé🚀 🚀🚀oMoéMoMo🚀éé🚀Mo éé éMo🚀oMMooo éoé M🚀Mo", + "Moo é🚀é🚀oM oo 🚀🚀 MMMo o🚀oMMoMMé 🚀🚀 Mo Mé🚀o M oM🚀o 🚀é🚀" + ] + ] + ] + ], + [ + "0xf61e317938a183234db405af4fe70e", + "0x28B50C1856955065Fd08D2886826ab420be4777D", + "2439801656637368195278225504651474965397153923796635030940", + true, + [ + [ + [ + "Moo é🚀oéM oé o oo MMooooMMo éé Moo MoM", + "Moo é🚀", + "Moo é🚀" + ] + ] + ] + ], + [ + "0x0fa48d7828d6719ff5ec356c9f935a", + "0xcC57056EeDfdC23fbB21c79D986a90C5F4fb9Afa", + "1799155082755164624628582667093781160445312328207140236193", + false, + [ + [ + [ + "Moo é🚀 ", + "Moo é🚀o🚀MoMM 🚀 Moéé oM🚀ééo MMoéM🚀 oMoé oo", + "Moo é🚀ooMo🚀oo o oM o🚀oM M ooMoooo é🚀oo🚀 éo🚀M🚀" + ] + ] + ] + ] + ], + "0x56", + [ + "Moo é🚀", + [ + "0x8c49432712f2798ba72867212740aa3801fa7f9c", + [ + "Moo é🚀oééooo🚀o", + [ + [false, true], + "0x5F44a768DF18779e6f48F2D648A30dd4806D3c2F", + false, + false, + "83184784606457620839490983014002600873244323012114855816796594634254944" + ], + ["2059575334", "39634417", "1311059972"], + [ + "0xdb0474Af174cdA27C222D6fa2CA36D58193C5309", + [ + "247239065641627863986524797218089651309403941954423373021184970812457668181" + ] + ], + "Moo é🚀Mo🚀 oMo o🚀oMoMM🚀oMM🚀éM oo o🚀oMoooo 🚀🚀 oMé🚀 é o " + ] + ], + false + ], + "0xfc9665e2aa3c3e5c2ee69f78700e8df696ef72", + [ + [ + [ + "Moo é🚀o ooéMMoéMMo MMoo🚀o éoé🚀o", + "Moo é🚀o🚀oMMMé oéoMé🚀MoééooM 🚀", + "Moo é🚀", + "Moo é🚀oé🚀oM" + ] + ] + ] + ], + [true, true], + "Moo é🚀🚀 o🚀ooM 🚀oMé🚀oMM" + ] + ] + ], + "verbose": { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": false + }, + { + "type": "string", + "value": "Moo é🚀oé oMoo🚀 o 🚀o🚀o🚀🚀o🚀oéM MM🚀oooMooMM 🚀oé oé éoMo ooo" + }, + { + "type": "array", + "value": [ + { + "type": "hexstring", + "value": "0x0f921c" + }, + { + "type": "hexstring", + "value": "0x1e0e9f" + }, + { + "type": "hexstring", + "value": "0xd4e216" + } + ] + }, + { + "type": "address", + "value": "0x5F62F0cDDA00Ca0058C649E24dfF47DBDCAFc99F" + } + ] + }, + { + "type": "number", + "value": "229809142055791099499100764505283" + }, + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀é🚀🚀🚀🚀" + }, + { + "type": "string", + "value": "Moo é🚀é🚀o🚀oM 🚀oooo" + }, + { + "type": "string", + "value": "Moo é🚀 éé é oMééMo éM o🚀ooMo Méoo🚀 MoéM o🚀oM éMM🚀🚀🚀o oéoo o" + }, + { + "type": "string", + "value": "Moo é🚀 oéooéé" + } + ] + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xE972cf1fD035e5f44c17ba7B2CfE6E7006834c95" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2722283023" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-153706940789971282110150562" + }, + { + "type": "number", + "value": "-84948272298763788328565431" + }, + { + "type": "number", + "value": "-12179002006932522499700625" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "-1153595338901722314148663" + }, + { + "type": "number", + "value": "106025502107731607551969080" + }, + { + "type": "number", + "value": "-92623606922103469825682763" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 o 🚀oé 🚀🚀 🚀 ééooéoéo " + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "number", + "value": "28610939720196723693041822565" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xec366485ec6d9c690515f6ffaefb77" + }, + { + "type": "address", + "value": "0xc7a6bE0463115cf55D197A241696Bf0a278668D7" + }, + { + "type": "number", + "value": "-1784580040333686047436184849061162100640945103813418928162" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀Méo " + }, + { + "type": "string", + "value": "Moo é🚀MM " + }, + { + "type": "string", + "value": "Moo é🚀🚀🚀 oéo🚀🚀oMo🚀M🚀 🚀 🚀oMM" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x4b20ca764fc89d49984d8828034102" + }, + { + "type": "address", + "value": "0x546E3D2Ec295F2FdaF00A28579014eA427AD2df6" + }, + { + "type": "number", + "value": "470943194378295996088521481971778550562517747326576357453" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéoooMooM🚀🚀o🚀oéoM🚀oo🚀oMééooéoé🚀oo MooM🚀" + }, + { + "type": "string", + "value": "Moo é🚀éoMé🚀 🚀🚀oMoéMoMo🚀éé🚀Mo éé éMo🚀oMMooo éoé M🚀Mo" + }, + { + "type": "string", + "value": "Moo é🚀é🚀oM oo 🚀🚀 MMMo o🚀oMMoMMé 🚀🚀 Mo Mé🚀o M oM🚀o 🚀é🚀" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0xf61e317938a183234db405af4fe70e" + }, + { + "type": "address", + "value": "0x28B50C1856955065Fd08D2886826ab420be4777D" + }, + { + "type": "number", + "value": "2439801656637368195278225504651474965397153923796635030940" + }, + { + "type": "boolean", + "value": true + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀oéM oé o oo MMooooMMo éé Moo MoM" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x0fa48d7828d6719ff5ec356c9f935a" + }, + { + "type": "address", + "value": "0xcC57056EeDfdC23fbB21c79D986a90C5F4fb9Afa" + }, + { + "type": "number", + "value": "1799155082755164624628582667093781160445312328207140236193" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀 " + }, + { + "type": "string", + "value": "Moo é🚀o🚀MoMM 🚀 Moéé oM🚀ééo MMoéM🚀 oMoé oo" + }, + { + "type": "string", + "value": "Moo é🚀ooMo🚀oo o oM o🚀oM M ooMoooo é🚀oo🚀 éo🚀M🚀" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "hexstring", + "value": "0x56" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "object", + "value": [ + { + "type": "hexstring", + "value": "0x8c49432712f2798ba72867212740aa3801fa7f9c" + }, + { + "type": "object", + "value": [ + { + "type": "string", + "value": "Moo é🚀oééooo🚀o" + }, + { + "type": "object", + "value": [ + { + "type": "object", + "value": [ + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "address", + "value": "0x5F44a768DF18779e6f48F2D648A30dd4806D3c2F" + }, + { + "type": "boolean", + "value": false + }, + { + "type": "boolean", + "value": false + }, + { + "type": "number", + "value": "83184784606457620839490983014002600873244323012114855816796594634254944" + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "2059575334" + }, + { + "type": "number", + "value": "39634417" + }, + { + "type": "number", + "value": "1311059972" + } + ] + }, + { + "type": "object", + "value": [ + { + "type": "address", + "value": "0xdb0474Af174cdA27C222D6fa2CA36D58193C5309" + }, + { + "type": "array", + "value": [ + { + "type": "number", + "value": "247239065641627863986524797218089651309403941954423373021184970812457668181" + } + ] + } + ] + }, + { + "type": "string", + "value": "Moo é🚀Mo🚀 oMo o🚀oMoMM🚀oMM🚀éM oo o🚀oMoooo 🚀🚀 oMé🚀 é o " + } + ] + } + ] + }, + { + "type": "boolean", + "value": false + } + ] + }, + { + "type": "hexstring", + "value": "0xfc9665e2aa3c3e5c2ee69f78700e8df696ef72" + }, + { + "type": "object", + "value": [ + { + "type": "array", + "value": [ + { + "type": "array", + "value": [ + { + "type": "string", + "value": "Moo é🚀o ooéMMoéMMo MMoo🚀o éoé🚀o" + }, + { + "type": "string", + "value": "Moo é🚀o🚀oMMMé oéoMé🚀MoééooM 🚀" + }, + { + "type": "string", + "value": "Moo é🚀" + }, + { + "type": "string", + "value": "Moo é🚀oé🚀oM" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "array", + "value": [ + { + "type": "boolean", + "value": true + }, + { + "type": "boolean", + "value": true + } + ] + }, + { + "type": "string", + "value": "Moo é🚀🚀 o🚀ooM 🚀oMé🚀oMM" + } + ] + } + ] + } + ] + }, + "bytecode": "0x608060405234801561001057600080fd5b50611927806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f8a8fd6d14610030575b600080fd5b61003861004e565b60405161004591906113e5565b60405180910390f35b610056610b20565b61005e610b20565b610066610b60565b60018152600060208083018290526040805160808101909152605e80825290916115e3908301396040838101919091528051600380825260808201909252600092509060208201606080368337505081519192506203e48760ea1b9182915083906000906100d6576100d66114fe565b6001600160e81b031990921660209283029190910190910152508051621e0e9f60e81b9081908390600190811061010f5761010f6114fe565b6001600160e81b031990921660209283029190910190910152508051626a710b60e91b90819083906002908110610148576101486114fe565b6001600160e81b0319909216602092830291909101820152606084019290925250735f62f0cdda00ca0058c649e24dff47dbdcafc99f60808301529082526d0b549962e55fee3e17586ce604c3908201526101a1610b9c565b604080518082018252601c81527f4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a80f09f9a80000000006020808301919091529083528151606081019092526022808352600092916116a59083013990508082600160200201819052505060006040518060800160405280605d81526020016117e3605d9139604080840191909152805180820190915260158152744d6f6f20c3a9f09f9a8020206fc3a96f6fc3a9c3a960581b6020820152905080826003602002015250604082015260016060820152610271610bc3565b73e972cf1fd035e5f44c17ba7b2cfe6e7006834c958152610290610c00565b63a242be0f815260208201526102a4610c1e565b6102ac610c3e565b6102b4610c6b565b6a7f24b5f4df1c11e65f77a11981526a46447f119a49ac39d2fab61960208201526a0a130105902afd31a5f79019604082015281526102f1610c6b565b69f4488754510fe0598b361981526a57b3c5fc77d4552cef87386020808301919091526a4c9dcfcadbff6d47356d4a1960408084019190915283820192909252918352805160608101909152603480825260009261164190830139602083015250604082015261035f610c89565b60408051808201909152600a8152689adede418753e13f3560b71b6020808301919091529082526b5c726a26130f7a1972c92b659082015261039f610cb6565b6103a7610d04565b6103af610d31565b6eec366485ec6d9c690515f6ffaefb7760881b815273c7a6be0463115cf55d197a241696bf0a278668d760208201527748c7e28ddc0a0f4bedf3ed51051d93970415e4080d33c8211960408201526001606082015261040c610d5d565b610414610d6c565b61041c610d7b565b604080518082018252600f81526e026b7b79061d4f84fcd4026e1d4b79608d1b60208083019190915290835281518083018352600d81526c026b7b79061d4f84fcd4026a69609d1b81830152838201528151606081019092526039808352600092916116c790830139604083015250815281526080820152815261049e610d31565b6e2590653b27e44ea4cc26c41401a08160891b815273546e3d2ec295f2fdaf00a28579014ea427ad2df66020820152771334e059b350f5c95319b550d128140e4b2587209345f04d6040820152600060608201526104fa610d5d565b610502610d6c565b61050a610d7b565b60006040518060800160405280604c8152602001611741604c91398252506040805160808101909152605680825260009190611840602083013990508082600160200201819052505060006040518060800160405280605e8152602001611585605e9139604083015250815281526080820152602082015261058a610d31565b6e7b0f18bc9c50c191a6da02d7a7f38760891b81527328b50c1856955065fd08d2886826ab420be4777d6020820152776380b7c479e2d6817be556557e585d9c6304ab117e1d159c6040820152600160608201526105e6610d5d565b6105ee610d6c565b6105f6610d7b565b60006040518060600160405280602f81526020016118c3602f9139825250604080518082018252600a808252689adede418753e13f3560b71b60208084018290528086019390935283518085019094529083529082015280826002602002015250815281526080820152604082015261066d610d31565b6e07d246bc146b38cffaf61ab64fc9ad60891b815273cc57056eedfdc23fbb21c79d986a90c5f4fb9afa60208201527749600e3692600b258c083335613e222532256b33d1c1aba16040820152600060608201526106c9610d5d565b6106d1610d6c565b6106d9610d7b565b604080518082018252600d81526c026b7b79061d4f84fcd4010101609d1b6020808301919091529083528151608081019092526041808352600092916117009083013990508082600160200201819052505060006040518060800160405280604881526020016115156048913960408301525081528152608082015260608201528152602b60f91b602082015261076e610d95565b60408051808201909152600a8152689adede418753e13f3560b71b60208201528152610798610dbc565b73231250c9c4bc9e62e9ca19c849d02a8e007e9fe760621b81526107ba610dd2565b604080518082018252601781527f4d6f6f20c3a9f09f9a806fc3a9c3a96f6f6ff09f9a806f000000000000000000602080830191909152908352815160e081018352600060a0820181815260c08301829052825281830181815282850182815260608401838152608085018481528751808901909852848852600188880152968552735f44a768df18779e6f48f2d648a30dd4806d3c2f909252829052527d0c0d7ec1f5284bfcc834ae5e1635185dac60301a21ab37e55f2953286a60909252820152610885610c6b565b637ac2a026815263025cc5f16020820152634e2530046040808301919091528201526108af610e38565b73db0474af174cda27c222d6fa2ca36d58193c530981526108ce610c00565b7e8beeaea132cc63386b43c8a606c19a55825965283f834d42b1243c43aece55815260208281019190915260608301919091526040805160808101909152605680825260009261178d908301396080830152506020808301919091528201526000604080830191909152820152727e4b32f1551e1f2e17734fbc380746fb4b77b960691b606082015261097260408051808201909152606060208201908152815290565b60408051602081019091526060815260408051600480825260a08201909252600091816020015b606081526020019060019003908161099957905050905060006040518060600160405280602d8152602001611896602d9139905080826000815181106109e1576109e16114fe565b60200260200101819052505060006040518060600160405280603081526020016116756030913990508082600181518110610a1e57610a1e6114fe565b60200260200101819052505060006040518060400160405280600a8152602001689adede418753e13f3560b71b81525090508082600281518110610a6457610a646114fe565b6020026020010181905250506000604051806040016040528060138152602001724d6f6f20c3a9f09f9a806fc3a9f09f9a806f4d60681b81525090508082600381518110610ab457610ab46114fe565b6020908102919091010152508152815260808201526040820152610ad6610e5b565b600180825260208083019190915260608084019290925260408051928301905260288083526000929161155d90830139608080840191909152606084019290925250820152919050565b6040518060a00160405280610b33610b60565b815260006020820152604001610b47610b9c565b815260006020820152604001610b5b610bc3565b905290565b6040518060a00160405280600015158152602001600015158152602001606081526020016060815260200160006001600160a01b031681525090565b60405180608001604052806004905b6060815260200190600190039081610bab5790505090565b604051806080016040528060006001600160a01b03168152602001610be6610c00565b8152602001610bf3610c1e565b8152602001610b5b610c89565b60405180602001604052806001906020820280368337509192915050565b6040518060400160405280610c31610c3e565b8152602001606081525090565b60405180604001604052806002905b610c55610c6b565b815260200190600190039081610c4d5790505090565b60405180606001604052806003906020820280368337509192915050565b6040805160a0810182526060815260006020820152908101610ca9610cb6565b8152602001610c31610e5b565b6040518060a00160405280610cc9610d04565b815260006020820152604001610cdd610d95565b815260006020820152604001610b5b60408051808201909152606060208201908152815290565b60405180608001604052806004905b610d1b610d31565b815260200190600190039081610d135790505090565b6040805160a081018252600080825260208201819052918101829052606081019190915260808101610b5b5b6040518060200160405280610b5b5b6040518060200160405280610b5b5b604080516060808201909252908152600260208201610bab565b604051806060016040528060608152602001610daf610dbc565b8152600060209091015290565b604080518082019091526000815260208101610b5b5b6040518060a0016040528060608152602001610e226040805160e081018252600060a0820181815260c0830182905282526020820181905291810182905260608101829052608081019190915290565b8152602001610e2f610c6b565b8152602001610c315b604051806040016040528060006001600160a01b03168152602001610b5b610c00565b60405180604001604052806002906020820280368337509192915050565b6000815180845260005b81811015610e9f57602081850181015186830182015201610e83565b81811115610eb1576000602083870101525b50601f01601f19169290920160200192915050565b600082608081018360005b6004811015610f00578383038752610eea838351610e79565b6020978801979093509190910190600101610ed1565b509095945050505050565b8060005b6003811015610f3457815163ffffffff16845260209384019390910190600101610f0f565b50505050565b80516001600160a01b0316825260208082015181840160005b6001811015610f795782516001600160f81b031682529183019190830190600101610f53565b505050505050565b6000815160608452610f966060850182610e79565b90506020808401518583038287015260406bffffffffffffffffffffffff198251168452828201519150808385015281516101a082860152610fdc6101e0860182610e79565b905083830151805180511515606088015285810151151560808801525060018060a01b03858201511660a087015282810151151560c08701526060810151151560e08701526080810151601d0b61010087015250818301519350611044610120860185610f0b565b60608301519350611059610180860185610f3a565b6080830151858203603f19016101c087015293506110778185610e79565b94505080860151925061108d8188018415159052565b509195945050505050565b80516020808452600091604085019085830184805b60018082106110bc5750611123565b601f198a870381018552855180518089529089019089890190600581901b8a018b01875b8281101561110b57858c83030184526110fa828651610e79565b948d0194938d0193915086016110e0565b509950505095880195505050918501916001016110ad565b5092979650505050505050565b8060005b6002811015610f345781511515845260209384019390910190600101611134565b600060c0825181855261116a82860182610e79565b905060206bffffffffffffffffffffffff8186015116818701526040808601518784038289015260a0808501825182875281829050610120880192506000805b600481101561126857898503609f190183528351805170ffffffffffffffffffffffffffffffffff19168652898101516001600160a01b03168a8701528881015160170b89870152606080820151151590870152608090810151908601879052518686018a9052518b86018a9052610140860160e08701845b60038110156112525760df19898403018252611240838551610e79565b938d01939250908c0190600101611223565b50909650505092880192918801916001016111aa565b50505050848301516001600160f81b03191686860152838301518682038588015296506112958188610f81565b965050606082015193506112bb60608601856cffffffffffffffffffffffffff19169052565b6080820151935084860360808601526112d48685611098565b9550606088015194506112ea60608a0186611130565b60808801519450888603818a0152505050506113068282610e79565b95945050505050565b80516001600160a01b031682526020808201516000916080850191818601845b600181101561135257825163ffffffff168252918301919083019060010161132f565b5050506040848101516080918701919091528051926000905b60028210156113b05784518160005b600381101561139a578251600a0b8252918601919086019060010161137a565b505050938301936001919091019060600161136b565b5050015160e061014086015290506113cc610160850182610e79565b9050606083015184820360608601526113068282611155565b60006020808352835160a0828501528051151560c085015281810151151560e0850152604081015160a0610100860152611423610160860182610e79565b606083015186820360bf1901610120880152805180835290850192506000918501905b808310156114705783516001600160e81b0319168252928501926001929092019190850190611446565b506080840151935061148e6101408801856001600160a01b03169052565b93870151936114a26040880186600d0b9052565b60408801519450601f199350838782030160608801526114c28186610ec6565b945050505060608501516114da608086018215159052565b506080850151818584030160a08601526114f4838261130f565b9695505050505050565b634e487b7160e01b600052603260045260246000fdfe4d6f6f20c3a9f09f9a806f6f4d6ff09f9a806f6f206f206f4d206ff09f9a806f4d204d20206f6f4d6f6f6f6f2020c3a9f09f9a806f6ff09f9a802020c3a96ff09f9a804df09f9a804d6f6f20c3a9f09f9a80f09f9a80206ff09f9a806f6f4d2020f09f9a806f4dc3a9f09f9a806f4d4d4d6f6f20c3a9f09f9a80c3a9f09f9a806f4d206f6f20f09f9a80f09f9a802020204d4d4d6f206ff09f9a806f4d4d6f4d4dc3a920f09f9a80f09f9a80204d6f204dc3a9f09f9a806f204d206f4df09f9a806f2020f09f9a80c3a9f09f9a804d6f6f20c3a9f09f9a806fc3a92020206f4d6f6ff09f9a80206f20f09f9a806ff09f9a806ff09f9a80f09f9a806ff09f9a806fc3a94d20204d4df09f9a806f6f6f4d6f6f4d4d20f09f9a806fc3a920206fc3a920c3a96f4d6f20206f6f6f4d6f6f20c3a9f09f9a80f09f9a80206f20f09f9a806fc3a920f09f9a80f09f9a8020f09f9a8020c3a9c3a96f6fc3a96fc3a96f204d6f6f20c3a9f09f9a806ff09f9a806f4d4d4dc3a920206fc3a96f4dc3a9f09f9a804d6fc3a9c3a96f6f4d20f09f9a804d6f6f20c3a9f09f9a80c3a9f09f9a806ff09f9a806f4d202020f09f9a806f6f6f6f4d6f6f20c3a9f09f9a80f09f9a80f09f9a80206fc3a96ff09f9a80f09f9a806f4d6ff09f9a804df09f9a8020f09f9a802020f09f9a806f4d4d4d6f6f20c3a9f09f9a806ff09f9a804d6f4d4d20f09f9a8020204d6fc3a9c3a920206f4df09f9a80c3a9c3a96f204d4d6fc3a94df09f9a80206f4d6fc3a9206f6f4d6f6f20c3a9f09f9a806fc3a96f6f6f4d6f6f4df09f9a80f09f9a806ff09f9a806fc3a96f4df09f9a806f6ff09f9a806f4dc3a9c3a96f6fc3a96fc3a9f09f9a806f6f204d6f6f4df09f9a804d6f6f20c3a9f09f9a804d6ff09f9a80206f4d6f206ff09f9a806f4d6f4d4df09f9a806f4d4df09f9a80c3a94d2020206f6f206ff09f9a806f4d6f6f6f6f20f09f9a80f09f9a80206f4dc3a9f09f9a8020c3a9206f204d6f6f20c3a9f09f9a8020c3a9c3a920c3a9206f4dc3a9c3a94d6f20c3a94d206ff09f9a806f6f4d6f204dc3a96f6ff09f9a8020204d6fc3a94d206ff09f9a806f4d20c3a94d4df09f9a80f09f9a80f09f9a806f206fc3a96f6f20206f4d6f6f20c3a9f09f9a80c3a96f4dc3a9f09f9a8020f09f9a80f09f9a806f4d6fc3a94d6f4d6ff09f9a80c3a9c3a9f09f9a804d6f20c3a9c3a920c3a94d6ff09f9a806f4d4d6f6f6f20c3a96fc3a9204df09f9a804d6f4d6f6f20c3a9f09f9a806f206f6fc3a94d4d6fc3a94d4d6f204d4d6f6ff09f9a806f20c3a96fc3a9f09f9a806f4d6f6f20c3a9f09f9a806fc3a94d206fc3a9206f206f6f204d4d6f6f6f6f4d4d6f20c3a9c3a920204d6f6f204d6f4da2646970667358221220182fa45f8edfddf276aee351d18e21f4b3b151e0733e84c2efda756896decced64736f6c634300080d0033", + "source": "// SPDX-License-Identifier: MIT-License\npragma solidity ^0.8.13;\ncontract Test {\n struct S_01fb8e5b {\n bool s_0;\n bool s_1;\n string s_2;\n bytes3[] s_3;\n address s_4;\n }\n\n struct S_34b651ea {\n int88[3][2] s_0;\n string s_1;\n }\n\n struct S_e9182f36 {\n string[3] s_0;\n }\n\n struct S_98401589 {\n S_e9182f36 s_0;\n }\n\n struct S_7acae4b9 {\n bytes15 s_0;\n address s_1;\n int192 s_2;\n bool s_3;\n S_98401589 s_4;\n }\n\n struct S_25e98821 {\n bool s_0;\n bool s_1;\n }\n\n struct S_3570cd27 {\n S_25e98821 s_0;\n address s_1;\n bool s_2;\n bool s_3;\n int240 s_4;\n }\n\n struct S_b3209696 {\n address s_0;\n uint248[1] s_1;\n }\n\n struct S_e022777e {\n string s_0;\n S_3570cd27 s_1;\n uint32[3] s_2;\n S_b3209696 s_3;\n string s_4;\n }\n\n struct S_a338f6c1 {\n bytes20 s_0;\n S_e022777e s_1;\n }\n\n struct S_867661ce {\n string s_0;\n S_a338f6c1 s_1;\n bool s_2;\n }\n\n struct S_c875c86d {\n string[][1] s_0;\n }\n\n struct S_395c3899 {\n S_7acae4b9[4] s_0;\n bytes1 s_1;\n S_867661ce s_2;\n bytes19 s_3;\n S_c875c86d s_4;\n }\n\n struct S_9a48c4c1 {\n string s_0;\n uint96 s_1;\n S_395c3899 s_2;\n bool[2] s_3;\n string s_4;\n }\n\n struct S_5a8ce5dd {\n address s_0;\n uint32[1] s_1;\n S_34b651ea s_2;\n S_9a48c4c1 s_3;\n }\n\n struct S_06b53856 {\n S_01fb8e5b s_0;\n int112 s_1;\n string[4] s_2;\n bool s_3;\n S_5a8ce5dd s_4;\n }\n\n function test () public pure returns (S_06b53856 memory) {\n S_06b53856 memory r;\n {\n S_01fb8e5b memory r_0;\n {\n bool r_0_0 = true;\n r_0.s_0 = r_0_0;\n }\n {\n bool r_0_1 = false;\n r_0.s_1 = r_0_1;\n }\n {\n string memory r_0_2 = unicode\"Moo é🚀oé oMoo🚀 o 🚀o🚀o🚀🚀o🚀oéM MM🚀oooMooMM 🚀oé oé éoMo ooo\";\n r_0.s_2 = r_0_2;\n }\n {\n bytes3[] memory r_0_3 = new bytes3[](3);\n {\n bytes3 r_0_3_0 = bytes3(0x0f921c);\n r_0_3[0] = r_0_3_0;\n }\n {\n bytes3 r_0_3_1 = bytes3(0x1e0e9f);\n r_0_3[1] = r_0_3_1;\n }\n {\n bytes3 r_0_3_2 = bytes3(0xd4e216);\n r_0_3[2] = r_0_3_2;\n }\n r_0.s_3 = r_0_3;\n }\n {\n address r_0_4 = 0x5F62F0cDDA00Ca0058C649E24dfF47DBDCAFc99F;\n r_0.s_4 = r_0_4;\n }\n r.s_0 = r_0;\n }\n {\n int112 r_1 = 229809142055791099499100764505283;\n r.s_1 = r_1;\n }\n {\n string[4] memory r_2;\n {\n string memory r_2_0 = unicode\"Moo é🚀é🚀🚀🚀🚀\";\n r_2[0] = r_2_0;\n }\n {\n string memory r_2_1 = unicode\"Moo é🚀é🚀o🚀oM 🚀oooo\";\n r_2[1] = r_2_1;\n }\n {\n string memory r_2_2 = unicode\"Moo é🚀 éé é oMééMo éM o🚀ooMo Méoo🚀 MoéM o🚀oM éMM🚀🚀🚀o oéoo o\";\n r_2[2] = r_2_2;\n }\n {\n string memory r_2_3 = unicode\"Moo é🚀 oéooéé\";\n r_2[3] = r_2_3;\n }\n r.s_2 = r_2;\n }\n {\n bool r_3 = true;\n r.s_3 = r_3;\n }\n {\n S_5a8ce5dd memory r_4;\n {\n address r_4_0 = 0xE972cf1fD035e5f44c17ba7B2CfE6E7006834c95;\n r_4.s_0 = r_4_0;\n }\n {\n uint32[1] memory r_4_1;\n {\n uint32 r_4_1_0 = 2722283023;\n r_4_1[0] = r_4_1_0;\n }\n r_4.s_1 = r_4_1;\n }\n {\n S_34b651ea memory r_4_2;\n {\n int88[3][2] memory r_4_2_0;\n {\n int88[3] memory r_4_2_0_0;\n {\n int88 r_4_2_0_0_0 = -153706940789971282110150562;\n r_4_2_0_0[0] = r_4_2_0_0_0;\n }\n {\n int88 r_4_2_0_0_1 = -84948272298763788328565431;\n r_4_2_0_0[1] = r_4_2_0_0_1;\n }\n {\n int88 r_4_2_0_0_2 = -12179002006932522499700625;\n r_4_2_0_0[2] = r_4_2_0_0_2;\n }\n r_4_2_0[0] = r_4_2_0_0;\n }\n {\n int88[3] memory r_4_2_0_1;\n {\n int88 r_4_2_0_1_0 = -1153595338901722314148663;\n r_4_2_0_1[0] = r_4_2_0_1_0;\n }\n {\n int88 r_4_2_0_1_1 = 106025502107731607551969080;\n r_4_2_0_1[1] = r_4_2_0_1_1;\n }\n {\n int88 r_4_2_0_1_2 = -92623606922103469825682763;\n r_4_2_0_1[2] = r_4_2_0_1_2;\n }\n r_4_2_0[1] = r_4_2_0_1;\n }\n r_4_2.s_0 = r_4_2_0;\n }\n {\n string memory r_4_2_1 = unicode\"Moo é🚀🚀 o 🚀oé 🚀🚀 🚀 ééooéoéo \";\n r_4_2.s_1 = r_4_2_1;\n }\n r_4.s_2 = r_4_2;\n }\n {\n S_9a48c4c1 memory r_4_3;\n {\n string memory r_4_3_0 = unicode\"Moo é🚀\";\n r_4_3.s_0 = r_4_3_0;\n }\n {\n uint96 r_4_3_1 = 28610939720196723693041822565;\n r_4_3.s_1 = r_4_3_1;\n }\n {\n S_395c3899 memory r_4_3_2;\n {\n S_7acae4b9[4] memory r_4_3_2_0;\n {\n S_7acae4b9 memory r_4_3_2_0_0;\n {\n bytes15 r_4_3_2_0_0_0 = bytes15(0xec366485ec6d9c690515f6ffaefb77);\n r_4_3_2_0_0.s_0 = r_4_3_2_0_0_0;\n }\n {\n address r_4_3_2_0_0_1 = 0xc7a6bE0463115cf55D197A241696Bf0a278668D7;\n r_4_3_2_0_0.s_1 = r_4_3_2_0_0_1;\n }\n {\n int192 r_4_3_2_0_0_2 = -1784580040333686047436184849061162100640945103813418928162;\n r_4_3_2_0_0.s_2 = r_4_3_2_0_0_2;\n }\n {\n bool r_4_3_2_0_0_3 = true;\n r_4_3_2_0_0.s_3 = r_4_3_2_0_0_3;\n }\n {\n S_98401589 memory r_4_3_2_0_0_4;\n {\n S_e9182f36 memory r_4_3_2_0_0_4_0;\n {\n string[3] memory r_4_3_2_0_0_4_0_0;\n {\n string memory r_4_3_2_0_0_4_0_0_0 = unicode\"Moo é🚀Méo \";\n r_4_3_2_0_0_4_0_0[0] = r_4_3_2_0_0_4_0_0_0;\n }\n {\n string memory r_4_3_2_0_0_4_0_0_1 = unicode\"Moo é🚀MM \";\n r_4_3_2_0_0_4_0_0[1] = r_4_3_2_0_0_4_0_0_1;\n }\n {\n string memory r_4_3_2_0_0_4_0_0_2 = unicode\"Moo é🚀🚀🚀 oéo🚀🚀oMo🚀M🚀 🚀 🚀oMM\";\n r_4_3_2_0_0_4_0_0[2] = r_4_3_2_0_0_4_0_0_2;\n }\n r_4_3_2_0_0_4_0.s_0 = r_4_3_2_0_0_4_0_0;\n }\n r_4_3_2_0_0_4.s_0 = r_4_3_2_0_0_4_0;\n }\n r_4_3_2_0_0.s_4 = r_4_3_2_0_0_4;\n }\n r_4_3_2_0[0] = r_4_3_2_0_0;\n }\n {\n S_7acae4b9 memory r_4_3_2_0_1;\n {\n bytes15 r_4_3_2_0_1_0 = bytes15(0x4b20ca764fc89d49984d8828034102);\n r_4_3_2_0_1.s_0 = r_4_3_2_0_1_0;\n }\n {\n address r_4_3_2_0_1_1 = 0x546E3D2Ec295F2FdaF00A28579014eA427AD2df6;\n r_4_3_2_0_1.s_1 = r_4_3_2_0_1_1;\n }\n {\n int192 r_4_3_2_0_1_2 = 470943194378295996088521481971778550562517747326576357453;\n r_4_3_2_0_1.s_2 = r_4_3_2_0_1_2;\n }\n {\n bool r_4_3_2_0_1_3 = false;\n r_4_3_2_0_1.s_3 = r_4_3_2_0_1_3;\n }\n {\n S_98401589 memory r_4_3_2_0_1_4;\n {\n S_e9182f36 memory r_4_3_2_0_1_4_0;\n {\n string[3] memory r_4_3_2_0_1_4_0_0;\n {\n string memory r_4_3_2_0_1_4_0_0_0 = unicode\"Moo é🚀oéoooMooM🚀🚀o🚀oéoM🚀oo🚀oMééooéoé🚀oo MooM🚀\";\n r_4_3_2_0_1_4_0_0[0] = r_4_3_2_0_1_4_0_0_0;\n }\n {\n string memory r_4_3_2_0_1_4_0_0_1 = unicode\"Moo é🚀éoMé🚀 🚀🚀oMoéMoMo🚀éé🚀Mo éé éMo🚀oMMooo éoé M🚀Mo\";\n r_4_3_2_0_1_4_0_0[1] = r_4_3_2_0_1_4_0_0_1;\n }\n {\n string memory r_4_3_2_0_1_4_0_0_2 = unicode\"Moo é🚀é🚀oM oo 🚀🚀 MMMo o🚀oMMoMMé 🚀🚀 Mo Mé🚀o M oM🚀o 🚀é🚀\";\n r_4_3_2_0_1_4_0_0[2] = r_4_3_2_0_1_4_0_0_2;\n }\n r_4_3_2_0_1_4_0.s_0 = r_4_3_2_0_1_4_0_0;\n }\n r_4_3_2_0_1_4.s_0 = r_4_3_2_0_1_4_0;\n }\n r_4_3_2_0_1.s_4 = r_4_3_2_0_1_4;\n }\n r_4_3_2_0[1] = r_4_3_2_0_1;\n }\n {\n S_7acae4b9 memory r_4_3_2_0_2;\n {\n bytes15 r_4_3_2_0_2_0 = bytes15(0xf61e317938a183234db405af4fe70e);\n r_4_3_2_0_2.s_0 = r_4_3_2_0_2_0;\n }\n {\n address r_4_3_2_0_2_1 = 0x28B50C1856955065Fd08D2886826ab420be4777D;\n r_4_3_2_0_2.s_1 = r_4_3_2_0_2_1;\n }\n {\n int192 r_4_3_2_0_2_2 = 2439801656637368195278225504651474965397153923796635030940;\n r_4_3_2_0_2.s_2 = r_4_3_2_0_2_2;\n }\n {\n bool r_4_3_2_0_2_3 = true;\n r_4_3_2_0_2.s_3 = r_4_3_2_0_2_3;\n }\n {\n S_98401589 memory r_4_3_2_0_2_4;\n {\n S_e9182f36 memory r_4_3_2_0_2_4_0;\n {\n string[3] memory r_4_3_2_0_2_4_0_0;\n {\n string memory r_4_3_2_0_2_4_0_0_0 = unicode\"Moo é🚀oéM oé o oo MMooooMMo éé Moo MoM\";\n r_4_3_2_0_2_4_0_0[0] = r_4_3_2_0_2_4_0_0_0;\n }\n {\n string memory r_4_3_2_0_2_4_0_0_1 = unicode\"Moo é🚀\";\n r_4_3_2_0_2_4_0_0[1] = r_4_3_2_0_2_4_0_0_1;\n }\n {\n string memory r_4_3_2_0_2_4_0_0_2 = unicode\"Moo é🚀\";\n r_4_3_2_0_2_4_0_0[2] = r_4_3_2_0_2_4_0_0_2;\n }\n r_4_3_2_0_2_4_0.s_0 = r_4_3_2_0_2_4_0_0;\n }\n r_4_3_2_0_2_4.s_0 = r_4_3_2_0_2_4_0;\n }\n r_4_3_2_0_2.s_4 = r_4_3_2_0_2_4;\n }\n r_4_3_2_0[2] = r_4_3_2_0_2;\n }\n {\n S_7acae4b9 memory r_4_3_2_0_3;\n {\n bytes15 r_4_3_2_0_3_0 = bytes15(0x0fa48d7828d6719ff5ec356c9f935a);\n r_4_3_2_0_3.s_0 = r_4_3_2_0_3_0;\n }\n {\n address r_4_3_2_0_3_1 = 0xcC57056EeDfdC23fbB21c79D986a90C5F4fb9Afa;\n r_4_3_2_0_3.s_1 = r_4_3_2_0_3_1;\n }\n {\n int192 r_4_3_2_0_3_2 = 1799155082755164624628582667093781160445312328207140236193;\n r_4_3_2_0_3.s_2 = r_4_3_2_0_3_2;\n }\n {\n bool r_4_3_2_0_3_3 = false;\n r_4_3_2_0_3.s_3 = r_4_3_2_0_3_3;\n }\n {\n S_98401589 memory r_4_3_2_0_3_4;\n {\n S_e9182f36 memory r_4_3_2_0_3_4_0;\n {\n string[3] memory r_4_3_2_0_3_4_0_0;\n {\n string memory r_4_3_2_0_3_4_0_0_0 = unicode\"Moo é🚀 \";\n r_4_3_2_0_3_4_0_0[0] = r_4_3_2_0_3_4_0_0_0;\n }\n {\n string memory r_4_3_2_0_3_4_0_0_1 = unicode\"Moo é🚀o🚀MoMM 🚀 Moéé oM🚀ééo MMoéM🚀 oMoé oo\";\n r_4_3_2_0_3_4_0_0[1] = r_4_3_2_0_3_4_0_0_1;\n }\n {\n string memory r_4_3_2_0_3_4_0_0_2 = unicode\"Moo é🚀ooMo🚀oo o oM o🚀oM M ooMoooo é🚀oo🚀 éo🚀M🚀\";\n r_4_3_2_0_3_4_0_0[2] = r_4_3_2_0_3_4_0_0_2;\n }\n r_4_3_2_0_3_4_0.s_0 = r_4_3_2_0_3_4_0_0;\n }\n r_4_3_2_0_3_4.s_0 = r_4_3_2_0_3_4_0;\n }\n r_4_3_2_0_3.s_4 = r_4_3_2_0_3_4;\n }\n r_4_3_2_0[3] = r_4_3_2_0_3;\n }\n r_4_3_2.s_0 = r_4_3_2_0;\n }\n {\n bytes1 r_4_3_2_1 = bytes1(0x56);\n r_4_3_2.s_1 = r_4_3_2_1;\n }\n {\n S_867661ce memory r_4_3_2_2;\n {\n string memory r_4_3_2_2_0 = unicode\"Moo é🚀\";\n r_4_3_2_2.s_0 = r_4_3_2_2_0;\n }\n {\n S_a338f6c1 memory r_4_3_2_2_1;\n {\n bytes20 r_4_3_2_2_1_0 = bytes20(0x8c49432712f2798Ba72867212740AA3801FA7f9C);\n r_4_3_2_2_1.s_0 = r_4_3_2_2_1_0;\n }\n {\n S_e022777e memory r_4_3_2_2_1_1;\n {\n string memory r_4_3_2_2_1_1_0 = unicode\"Moo é🚀oééooo🚀o\";\n r_4_3_2_2_1_1.s_0 = r_4_3_2_2_1_1_0;\n }\n {\n S_3570cd27 memory r_4_3_2_2_1_1_1;\n {\n S_25e98821 memory r_4_3_2_2_1_1_1_0;\n {\n bool r_4_3_2_2_1_1_1_0_0 = false;\n r_4_3_2_2_1_1_1_0.s_0 = r_4_3_2_2_1_1_1_0_0;\n }\n {\n bool r_4_3_2_2_1_1_1_0_1 = true;\n r_4_3_2_2_1_1_1_0.s_1 = r_4_3_2_2_1_1_1_0_1;\n }\n r_4_3_2_2_1_1_1.s_0 = r_4_3_2_2_1_1_1_0;\n }\n {\n address r_4_3_2_2_1_1_1_1 = 0x5F44a768DF18779e6f48F2D648A30dd4806D3c2F;\n r_4_3_2_2_1_1_1.s_1 = r_4_3_2_2_1_1_1_1;\n }\n {\n bool r_4_3_2_2_1_1_1_2 = false;\n r_4_3_2_2_1_1_1.s_2 = r_4_3_2_2_1_1_1_2;\n }\n {\n bool r_4_3_2_2_1_1_1_3 = false;\n r_4_3_2_2_1_1_1.s_3 = r_4_3_2_2_1_1_1_3;\n }\n {\n int240 r_4_3_2_2_1_1_1_4 = 83184784606457620839490983014002600873244323012114855816796594634254944;\n r_4_3_2_2_1_1_1.s_4 = r_4_3_2_2_1_1_1_4;\n }\n r_4_3_2_2_1_1.s_1 = r_4_3_2_2_1_1_1;\n }\n {\n uint32[3] memory r_4_3_2_2_1_1_2;\n {\n uint32 r_4_3_2_2_1_1_2_0 = 2059575334;\n r_4_3_2_2_1_1_2[0] = r_4_3_2_2_1_1_2_0;\n }\n {\n uint32 r_4_3_2_2_1_1_2_1 = 39634417;\n r_4_3_2_2_1_1_2[1] = r_4_3_2_2_1_1_2_1;\n }\n {\n uint32 r_4_3_2_2_1_1_2_2 = 1311059972;\n r_4_3_2_2_1_1_2[2] = r_4_3_2_2_1_1_2_2;\n }\n r_4_3_2_2_1_1.s_2 = r_4_3_2_2_1_1_2;\n }\n {\n S_b3209696 memory r_4_3_2_2_1_1_3;\n {\n address r_4_3_2_2_1_1_3_0 = 0xdb0474Af174cdA27C222D6fa2CA36D58193C5309;\n r_4_3_2_2_1_1_3.s_0 = r_4_3_2_2_1_1_3_0;\n }\n {\n uint248[1] memory r_4_3_2_2_1_1_3_1;\n {\n uint248 r_4_3_2_2_1_1_3_1_0 = 247239065641627863986524797218089651309403941954423373021184970812457668181;\n r_4_3_2_2_1_1_3_1[0] = r_4_3_2_2_1_1_3_1_0;\n }\n r_4_3_2_2_1_1_3.s_1 = r_4_3_2_2_1_1_3_1;\n }\n r_4_3_2_2_1_1.s_3 = r_4_3_2_2_1_1_3;\n }\n {\n string memory r_4_3_2_2_1_1_4 = unicode\"Moo é🚀Mo🚀 oMo o🚀oMoMM🚀oMM🚀éM oo o🚀oMoooo 🚀🚀 oMé🚀 é o \";\n r_4_3_2_2_1_1.s_4 = r_4_3_2_2_1_1_4;\n }\n r_4_3_2_2_1.s_1 = r_4_3_2_2_1_1;\n }\n r_4_3_2_2.s_1 = r_4_3_2_2_1;\n }\n {\n bool r_4_3_2_2_2 = false;\n r_4_3_2_2.s_2 = r_4_3_2_2_2;\n }\n r_4_3_2.s_2 = r_4_3_2_2;\n }\n {\n bytes19 r_4_3_2_3 = bytes19(0xfc9665e2aa3c3e5c2ee69f78700e8df696ef72);\n r_4_3_2.s_3 = r_4_3_2_3;\n }\n {\n S_c875c86d memory r_4_3_2_4;\n {\n string[][1] memory r_4_3_2_4_0;\n {\n string[] memory r_4_3_2_4_0_0 = new string[](4);\n {\n string memory r_4_3_2_4_0_0_0 = unicode\"Moo é🚀o ooéMMoéMMo MMoo🚀o éoé🚀o\";\n r_4_3_2_4_0_0[0] = r_4_3_2_4_0_0_0;\n }\n {\n string memory r_4_3_2_4_0_0_1 = unicode\"Moo é🚀o🚀oMMMé oéoMé🚀MoééooM 🚀\";\n r_4_3_2_4_0_0[1] = r_4_3_2_4_0_0_1;\n }\n {\n string memory r_4_3_2_4_0_0_2 = unicode\"Moo é🚀\";\n r_4_3_2_4_0_0[2] = r_4_3_2_4_0_0_2;\n }\n {\n string memory r_4_3_2_4_0_0_3 = unicode\"Moo é🚀oé🚀oM\";\n r_4_3_2_4_0_0[3] = r_4_3_2_4_0_0_3;\n }\n r_4_3_2_4_0[0] = r_4_3_2_4_0_0;\n }\n r_4_3_2_4.s_0 = r_4_3_2_4_0;\n }\n r_4_3_2.s_4 = r_4_3_2_4;\n }\n r_4_3.s_2 = r_4_3_2;\n }\n {\n bool[2] memory r_4_3_3;\n {\n bool r_4_3_3_0 = true;\n r_4_3_3[0] = r_4_3_3_0;\n }\n {\n bool r_4_3_3_1 = true;\n r_4_3_3[1] = r_4_3_3_1;\n }\n r_4_3.s_3 = r_4_3_3;\n }\n {\n string memory r_4_3_4 = unicode\"Moo é🚀🚀 o🚀ooM 🚀oMé🚀oMM\";\n r_4_3.s_4 = r_4_3_4;\n }\n r_4.s_3 = r_4_3;\n }\n r.s_4 = r_4;\n }\n return r;\n }\n}", + "encoded": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000b549962e55fee3e17586ce604c30000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001200000000000000000000000005f62f0cdda00ca0058c649e24dff47dbdcafc99f000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a806fc3a92020206f4d6f6ff09f9a80206f20f09f9a806ff09f9a806ff09f9a80f09f9a806ff09f9a806fc3a94d20204d4df09f9a806f6f6f4d6f6f4d4d20f09f9a806fc3a920206fc3a920c3a96f4d6f20206f6f6f000000000000000000000000000000000000000000000000000000000000000000030f921c00000000000000000000000000000000000000000000000000000000001e0e9f0000000000000000000000000000000000000000000000000000000000d4e2160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000001c4d6f6f20c3a9f09f9a80c3a9f09f9a80f09f9a80f09f9a80f09f9a800000000000000000000000000000000000000000000000000000000000000000000000224d6f6f20c3a9f09f9a80c3a9f09f9a806ff09f9a806f4d202020f09f9a806f6f6f6f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d4d6f6f20c3a9f09f9a8020c3a9c3a920c3a9206f4dc3a9c3a94d6f20c3a94d206ff09f9a806f6f4d6f204dc3a96f6ff09f9a8020204d6fc3a94d206ff09f9a806f4d20c3a94d4df09f9a80f09f9a80f09f9a806f206fc3a96f6f20206f00000000000000000000000000000000000000000000000000000000000000000000154d6f6f20c3a9f09f9a8020206fc3a96f6fc3a9c3a90000000000000000000000000000000000000000000000e972cf1fd035e5f44c17ba7b2cfe6e7006834c9500000000000000000000000000000000000000000000000000000000a242be0f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c0ffffffffffffffffffffffffffffffffffffffffff80db4a0b20e3ee19a0885effffffffffffffffffffffffffffffffffffffffffb9bb80ee65b653c62d0549fffffffffffffffffffffffffffffffffffffffffff5ecfefa6fd502ce5a086fffffffffffffffffffffffffffffffffffffffffffff0bb778abaef01fa674c900000000000000000000000000000000000000000057b3c5fc77d4552cef8738ffffffffffffffffffffffffffffffffffffffffffb3623035240092b8ca92b500000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000344d6f6f20c3a9f09f9a80f09f9a80206f20f09f9a806fc3a920f09f9a80f09f9a8020f09f9a8020c3a9c3a96f6fc3a96fc3a96f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000005c726a26130f7a1972c92b650000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a056000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa0fc9665e2aa3c3e5c2ee69f78700e8df696ef72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000780ec366485ec6d9c690515f6ffaefb770000000000000000000000000000000000000000000000000000000000c7a6be0463115cf55d197a241696bf0a278668d7ffffffffffffffffb7381d7223f5f0b4120c12aefae26c68fbea1bf7f2cc37de000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000f4d6f6f20c3a9f09f9a804dc3a96f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a804d4d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000394d6f6f20c3a9f09f9a80f09f9a80f09f9a80206fc3a96ff09f9a80f09f9a806f4d6ff09f9a804df09f9a8020f09f9a802020f09f9a806f4d4d000000000000004b20ca764fc89d49984d88280341020000000000000000000000000000000000000000000000000000000000546e3d2ec295f2fdaf00a28579014ea427ad2df600000000000000001334e059b350f5c95319b550d128140e4b2587209345f04d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004c4d6f6f20c3a9f09f9a806fc3a96f6f6f4d6f6f4df09f9a80f09f9a806ff09f9a806fc3a96f4df09f9a806f6ff09f9a806f4dc3a9c3a96f6fc3a96fc3a9f09f9a806f6f204d6f6f4df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a80c3a96f4dc3a9f09f9a8020f09f9a80f09f9a806f4d6fc3a94d6f4d6ff09f9a80c3a9c3a9f09f9a804d6f20c3a9c3a920c3a94d6ff09f9a806f4d4d6f6f6f20c3a96fc3a9204df09f9a804d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000005e4d6f6f20c3a9f09f9a80c3a9f09f9a806f4d206f6f20f09f9a80f09f9a802020204d4d4d6f206ff09f9a806f4d4d6f4d4dc3a920f09f9a80f09f9a80204d6f204dc3a9f09f9a806f204d206f4df09f9a806f2020f09f9a80c3a9f09f9a800000f61e317938a183234db405af4fe70e000000000000000000000000000000000000000000000000000000000028b50c1856955065fd08d2886826ab420be4777d00000000000000006380b7c479e2d6817be556557e585d9c6304ab117e1d159c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002f4d6f6f20c3a9f09f9a806fc3a94d206fc3a9206f206f6f204d4d6f6f6f6f4d4d6f20c3a9c3a920204d6f6f204d6f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000000fa48d7828d6719ff5ec356c9f935a0000000000000000000000000000000000000000000000000000000000cc57056eedfdc23fbb21c79d986a90c5f4fb9afa000000000000000049600e3692600b258c083335613e222532256b33d1c1aba1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000d4d6f6f20c3a9f09f9a802020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414d6f6f20c3a9f09f9a806ff09f9a804d6f4d4d20f09f9a8020204d6fc3a9c3a920206f4df09f9a80c3a9c3a96f204d4d6fc3a94df09f9a80206f4d6fc3a9206f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000484d6f6f20c3a9f09f9a806f6f4d6ff09f9a806f6f206f206f4d206ff09f9a806f4d204d20206f6f4d6f6f6f6f2020c3a9f09f9a806f6ff09f9a802020c3a96ff09f9a804df09f9a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a80000000000000000000000000000000000000000000008c49432712f2798ba72867212740aa3801fa7f9c000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000005f44a768df18779e6f48f2d648a30dd4806d3c2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0d7ec1f5284bfcc834ae5e1635185dac60301a21ab37e55f2953286a60000000000000000000000000000000000000000000000000000000007ac2a02600000000000000000000000000000000000000000000000000000000025cc5f1000000000000000000000000000000000000000000000000000000004e253004000000000000000000000000db0474af174cda27c222d6fa2ca36d58193c5309008beeaea132cc63386b43c8a606c19a55825965283f834d42b1243c43aece5500000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000174d6f6f20c3a9f09f9a806fc3a9c3a96f6f6ff09f9a806f00000000000000000000000000000000000000000000000000000000000000000000000000000000564d6f6f20c3a9f09f9a804d6ff09f9a80206f4d6f206ff09f9a806f4d6f4d4df09f9a806f4d4df09f9a80c3a94d2020206f6f206ff09f9a806f4d6f6f6f6f20f09f9a80f09f9a80206f4dc3a9f09f9a8020c3a9206f2000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002d4d6f6f20c3a9f09f9a806f206f6fc3a94d4d6fc3a94d4d6f204d4d6f6ff09f9a806f20c3a96fc3a9f09f9a806f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000304d6f6f20c3a9f09f9a806ff09f9a806f4d4d4dc3a920206fc3a96f4dc3a9f09f9a804d6fc3a9c3a96f6f4d20f09f9a8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4d6f6f20c3a9f09f9a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134d6f6f20c3a9f09f9a806fc3a9f09f9a806f4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000284d6f6f20c3a9f09f9a80f09f9a80206ff09f9a806f6f4d2020f09f9a806f4dc3a9f09f9a806f4d4d000000000000000000000000000000000000000000000000" + } +] diff --git a/packages/web3-eth-abi/test/fixtures/coders/base/address.ts b/packages/web3-eth-abi/test/fixtures/coders/base/address.ts new file mode 100644 index 00000000000..6f41d39c597 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/base/address.ts @@ -0,0 +1,54 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const validAddressEncoderData: [string, string][] = [ + [ + '00000000219ab540356cbb839cbe05303d7705fa', + '00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa', + ], + [ + '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cC2', + '000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ], +]; + +export const invalidAddressEncoderData: [unknown][] = [ + ['blem'], + ['--123'], + ['2'], + ['-1'], + ['0x01'], + ['0x00'], + [123], +]; + +export const validAddressDecoderData: { bytes: string; result: string; remaining: string }[] = [ + { + bytes: '0x000000000000000000000000e6004226bc1f1ba37e5c2c4689693b94b863cd58', + result: '0xe6004226BC1F1ba37E5C2c4689693b94B863cd58', + remaining: '0x', + }, + { + bytes: '0x000000000000000000000000e6004226bc1f1ba37e5c2c4689693b94b863cd580000000000000000000000000000000000000000000000000000000000000001', + result: '0xe6004226BC1F1ba37E5C2c4689693b94B863cd58', + remaining: '0x0000000000000000000000000000000000000000000000000000000000000001', + }, +]; + +export const invalidAddressDecoderData: [string][] = [ + ['0x00000000000000000000e6004226bc1f1ba37e5c2c4689693b94b863cd58'], +]; diff --git a/packages/web3-eth-abi/test/fixtures/coders/base/array.ts b/packages/web3-eth-abi/test/fixtures/coders/base/array.ts new file mode 100644 index 00000000000..25e89ba15e7 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/base/array.ts @@ -0,0 +1,104 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const validArrayEncoderData: Array<{ + type: string; + values: Array; + result: string; + dynamic: boolean; +}> = [ + { + type: 'uint[]', + values: [1, 3], + dynamic: true, + result: '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003', + }, + { + type: 'uint[2]', + values: [1, 3], + dynamic: false, + result: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003', + }, + { + type: 'string[2]', + values: ['hello', 'web3'], + dynamic: true, + result: '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000568656c6c6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047765623300000000000000000000000000000000000000000000000000000000', + }, + { + type: 'string[]', + values: ['hello', 'web3'], + dynamic: true, + result: '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000568656c6c6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047765623300000000000000000000000000000000000000000000000000000000', + }, +]; + +export const invalidArrayEncoderData: Array<{ + type: string; + values: unknown; +}> = [ + { + type: 'uint[]', + values: 'dsfdf', + }, + { + type: 'uint[3]', + values: [1, 2], + }, +]; + +export const validArrayDecoderData: Array<{ + type: string; + bytes: string; + result: unknown; + remaining: string; +}> = [ + { + type: 'uint[]', + result: [BigInt(1), BigInt(3)], + bytes: '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003', + remaining: '0x', + }, + { + type: 'uint[2]', + bytes: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003', + result: [BigInt(1), BigInt(3)], + remaining: '0x', + }, + { + type: 'string[2]', + result: ['hello', 'web3'], + bytes: '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000568656c6c6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047765623300000000000000000000000000000000000000000000000000000000', + remaining: '0x', + }, + { + type: 'string[]', + result: ['hello', 'web3'], + bytes: '0x000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000568656c6c6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047765623300000000000000000000000000000000000000000000000000000000', + remaining: '0x', + }, +]; + +export const invalidArrayDecoderData: Array<{ + type: string; + bytes: string; +}> = [ + { + type: 'uint[]', + bytes: '0x', + }, +]; diff --git a/packages/web3-eth-abi/test/fixtures/coders/base/bool.ts b/packages/web3-eth-abi/test/fixtures/coders/base/bool.ts new file mode 100644 index 00000000000..8a5fa05ce46 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/base/bool.ts @@ -0,0 +1,63 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const validBoolEncoderData: [any, string][] = [ + [1, '0000000000000000000000000000000000000000000000000000000000000001'], + [0, '0000000000000000000000000000000000000000000000000000000000000000'], + [BigInt(1), '0000000000000000000000000000000000000000000000000000000000000001'], + [BigInt(0), '0000000000000000000000000000000000000000000000000000000000000000'], + ['0x1', '0000000000000000000000000000000000000000000000000000000000000001'], + ['0x0', '0000000000000000000000000000000000000000000000000000000000000000'], + [true, '0000000000000000000000000000000000000000000000000000000000000001'], + [false, '0000000000000000000000000000000000000000000000000000000000000000'], + ['false', '0000000000000000000000000000000000000000000000000000000000000000'], + ['true', '0000000000000000000000000000000000000000000000000000000000000001'], +]; + +export const invalidBoolEncoderData: [any][] = [ + ['blem'], + ['--123'], + ['2'], + ['-1'], + ['0x01'], + ['0x00'], + ['0x0000000000000000000000000000000000000000000000000000000000000002'], +]; + +export const validBoolDecoderData: { bytes: string; result: boolean; remaining: string }[] = [ + { + bytes: '0x0000000000000000000000000000000000000000000000000000000000000001', + result: true, + remaining: '0x', + }, + { + bytes: '0x0000000000000000000000000000000000000000000000000000000000000000', + result: false, + remaining: '0x', + }, + { + bytes: '0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c', + result: true, + remaining: '0x000000000000000000000000000000000000000000000000000000000000000c', + }, +]; + +export const invalidBoolDecoderData: [string][] = [ + ['0x00000000000000000000e6004226bc1f1ba37e5c2c4689693b94b863cd58'], + ['0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9d80a8'], + ['0xffffffff'], +]; diff --git a/packages/web3-eth-abi/test/fixtures/coders/base/bytes.ts b/packages/web3-eth-abi/test/fixtures/coders/base/bytes.ts new file mode 100644 index 00000000000..3886f0c8cf8 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/base/bytes.ts @@ -0,0 +1,73 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiParameter } from 'web3-types'; + +export const validBytesEncoderData: [AbiParameter, string, string][] = [ + [ + { type: 'bytes5', name: '' }, + '0x0000001010', + '0000001010000000000000000000000000000000000000000000000000000000', + ], + [ + { type: 'bytes', name: '' }, + '0x0000001010', + '00000000000000000000000000000000000000000000000000000000000000050000001010000000000000000000000000000000000000000000000000000000', + ], + [ + { type: 'bytes', name: '' }, + '0x3a1bd524db9d52a12c4c60bb3f08e4ed34f380964a6882d46097f6fe4eff98af80552fddf116d4afb1a2676508d68eb62f13e23e1e696c2a800d384470c628c748cee4ad2260d26584cd6a06c4a0cccca37b', + '00000000000000000000000000000000000000000000000000000000000000523a1bd524db9d52a12c4c60bb3f08e4ed34f380964a6882d46097f6fe4eff98af80552fddf116d4afb1a2676508d68eb62f13e23e1e696c2a800d384470c628c748cee4ad2260d26584cd6a06c4a0cccca37b0000000000000000000000000000', + ], +]; + +export const invalidBytesEncoderData: [AbiParameter, string][] = [ + [{ type: 'bytes', name: '' }, 'blem'], + [{ type: 'bytes', name: '' }, '--123'], + [{ type: 'bytes1', name: '' }, '0x0000001010'], +]; + +export const validBytesDecoderData: [AbiParameter, string, string, string][] = [ + [ + { type: 'bytes5', name: '' }, + '0x0000001010000000000000000000000000000000000000000000000000000000', + '0x0000001010', + '0X', + ], + [ + { type: 'bytes5', name: '' }, + '0x0000001010000000000000000000000000000000000000000000000000000000', + '0x0000001010', + '0X', + ], + [ + { type: 'bytes', name: '' }, + '0x00000000000000000000000000000000000000000000000000000000000000050000001010000000000000000000000000000000000000000000000000000000', + '0x0000001010', + '0x', + ], + [ + { type: 'bytes2', name: '' }, + '0x01020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002', + '0x0102', + '0x0000000000000000000000000000000000000000000000000000000000000002', + ], +]; + +export const invalidBytesDecoderData: [AbiParameter, string][] = [ + [{ type: 'bytes32', name: '' }, '0x0000001010'], +]; diff --git a/packages/web3-eth-abi/test/fixtures/coders/base/number.ts b/packages/web3-eth-abi/test/fixtures/coders/base/number.ts new file mode 100644 index 00000000000..932e6d27551 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/base/number.ts @@ -0,0 +1,147 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiParameter, Numbers } from 'web3-types'; + +export const validNumberEncoderData: [AbiParameter, Numbers, string][] = [ + [ + { type: 'uint8', name: '' }, + 1, + '0000000000000000000000000000000000000000000000000000000000000001', + ], + [ + { type: 'uint8', name: '' }, + '8', + '0000000000000000000000000000000000000000000000000000000000000008', + ], + [ + { type: 'int8', name: '' }, + -1, + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + ], + [ + { type: 'int8', name: '' }, + -122, + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86', + ], + [ + { type: 'int8', name: '' }, + -128, + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80', + ], + [ + { type: 'int8', name: '' }, + '-122', + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86', + ], + [ + { type: 'int', name: '' }, + -122, + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86', + ], + [ + { type: 'int', name: '' }, + BigInt(122), + '000000000000000000000000000000000000000000000000000000000000007a', + ], + [ + { type: 'int32', name: '' }, + BigInt(-122), + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86', + ], + [ + { type: 'int32', name: '' }, + '-0xa2', + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e', + ], + [ + { type: 'uint24', name: '' }, + '12312312', + '0000000000000000000000000000000000000000000000000000000000bbdef8', + ], + [ + { type: 'int24', name: '' }, + '-123123', + 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1f0d', + ], +]; + +export const invalidNumberEncoderData: [AbiParameter, Numbers][] = [ + [{ type: 'uint8', name: '' }, 'blem'], + [{ type: 'uint8', name: '' }, '--123'], + [{ type: 'uint8', name: '' }, '256'], + [{ type: 'int8', name: '' }, '128'], + [{ type: 'int8', name: '' }, '-129'], + [{ type: 'int17', name: '' }, '129'], +]; + +export const validNumberDecoderData: [AbiParameter, string, Numbers, string][] = [ + [ + { type: 'uint8', name: '' }, + '0x0000000000000000000000000000000000000000000000000000000000000012', + BigInt(18), + '0x', + ], + [ + { type: 'uint256', name: '' }, + '0x00000000000000000000003f29a33f562a1feab357509b77f71717e78667e7c1', + BigInt('92312312312312312312312312312312312303939393939393'), + '0x', + ], + [ + { type: 'int256', name: '' }, + '0xffffffffffffffffffffffc0d65cc0a9d5e0154ca8af648808e8e8187998183f', + BigInt('-92312312312312312312312312312312312303939393939393'), + '0x', + ], + [ + { type: 'int8', name: '' }, + '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7', + BigInt('-25'), + '0x', + ], + [ + { type: 'uint256', name: '' }, + '0x000000000000000000000000000000000000000000000000000000000001e0f30000000000000000000000000000000000000000000000000000000000000001', + BigInt(123123), + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + [ + { type: 'uint24', name: '' }, + '0x0000000000000000000000000000000000000000000000000000000000bbdef8', + BigInt(12312312), + '0x', + ], + [ + { type: 'int24', name: '' }, + '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1f0d', + -BigInt(123123), + '0x', + ], +]; + +export const invalidNumberDecoderData: [AbiParameter, string][] = [ + [{ type: 'uint8', name: '' }, '0x'], + [ + { type: 'uint8', name: '' }, + '0x00000000000000000000003f29a33f562a1feab357509b77f71717e78667e7c1', + ], + [ + { type: 'int17', name: '' }, + '0xffffffffffffffffffffffc0d65cc0a9d5e0154ca8af648808e8e8187998183f', + ], +]; diff --git a/packages/web3-eth-abi/test/fixtures/coders/base/string.ts b/packages/web3-eth-abi/test/fixtures/coders/base/string.ts new file mode 100644 index 00000000000..1b733e7ae17 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/base/string.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const validStringEncoderData: [unknown, string][] = [ + [ + 'marin', + '00000000000000000000000000000000000000000000000000000000000000056d6172696e000000000000000000000000000000000000000000000000000000', + ], + [ + 'extraaaaaaaaaalooooooooooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnngggggggggggggggggggggggstrrrrrrrrrrrrrrrrrrrrrrrriiiiiiiiiiiinnnnnnnnng', + '000000000000000000000000000000000000000000000000000000000000008a65787472616161616161616161616c6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e676767676767676767676767676767676767676767676773747272727272727272727272727272727272727272727272726969696969696969696969696e6e6e6e6e6e6e6e6e6700000000000000000000000000000000000000000000', + ], + [ + 'šč|€-!', + '000000000000000000000000000000000000000000000000000000000000000ac5a1c48d7ce282ac2d2100000000000000000000000000000000000000000000', + ], +]; + +export const invalidStringEncoderData: [unknown][] = [[123]]; + +export const validStringDecoderData: [string, string, string][] = [ + [ + '0x00000000000000000000000000000000000000000000000000000000000000056d6172696e000000000000000000000000000000000000000000000000000000', + 'marin', + '0x', + ], + [ + '0x000000000000000000000000000000000000000000000000000000000000008a65787472616161616161616161616c6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e676767676767676767676767676767676767676767676773747272727272727272727272727272727272727272727272726969696969696969696969696e6e6e6e6e6e6e6e6e6700000000000000000000000000000000000000000000', + 'extraaaaaaaaaalooooooooooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnngggggggggggggggggggggggstrrrrrrrrrrrrrrrrrrrrrrrriiiiiiiiiiiinnnnnnnnng', + '0x', + ], + [ + '0x000000000000000000000000000000000000000000000000000000000000000ac5a1c48d7ce282ac2d2100000000000000000000000000000000000000000000', + 'šč|€-!', + '0x', + ], +]; diff --git a/packages/web3-eth-abi/test/fixtures/coders/base/tuple.ts b/packages/web3-eth-abi/test/fixtures/coders/base/tuple.ts new file mode 100644 index 00000000000..fdccee223ba --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/base/tuple.ts @@ -0,0 +1,124 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiParameter } from 'web3-types'; + +export const validEncoderData: Array<{ + components: ReadonlyArray; + values: unknown; + result: string; + dynamic: boolean; +}> = [ + { + components: [ + { type: 'uint8', name: '' }, + { type: 'bool', name: '' }, + ], + values: [69, true], + dynamic: false, + result: '00000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001', + }, + { + components: [ + { type: 'bool', name: '' }, + { + type: 'tuple', + name: '', + components: [ + { type: 'uint8', name: '' }, + { type: 'bool', name: '' }, + ], + }, + ], + values: [true, [69, true]], + dynamic: false, + result: '000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001', + }, + { + components: [ + { type: 'bool', name: 'y' }, + { type: 'bool', name: 'z' }, + ], + values: { y: false, z: true }, + dynamic: false, + result: '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', + }, +]; + +export const validDecoderData: Array<{ + components: ReadonlyArray; + bytes: string; + result: unknown; + remaining: string; +}> = [ + { + components: [ + { type: 'uint8', name: '' }, + { type: 'bool', name: '' }, + ], + result: { __length__: 2, 0: BigInt(69), 1: true }, + bytes: '0x00000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001', + remaining: '0x', + }, + { + components: [ + { type: 'bool', name: '' }, + { + type: 'tuple', + name: 'subTuple', + components: [ + { type: 'uint8', name: '' }, + { type: 'bool', name: '' }, + ], + }, + ], + result: { + __length__: 2, + 0: true, + 1: { __length__: 2, 0: BigInt(69), 1: true }, + subTuple: { __length__: 2, 0: BigInt(69), 1: true }, + }, + bytes: '000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001', + remaining: '0x', + }, + { + components: [ + { type: 'string', name: '' }, + { type: 'bool', name: '' }, + { + type: 'tuple', + name: '', + components: [ + { type: 'bool', name: '' }, + { type: 'string', name: '' }, + ], + }, + ], + result: { + __length__: 3, + 0: 'marin123123123123', + 1: true, + 2: { + __length__: 2, + 0: true, + 1: 'web3jstestinglongstriiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiing', + }, + }, + bytes: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000116d6172696e31323331323331323331323300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003c776562336a7374657374696e676c6f6e6773747269696969696969696969696969696969696969696969696969696969696969696969696969696e6700000000', + remaining: '0x', + }, +]; diff --git a/packages/web3-eth-abi/test/fixtures/coders/encode.ts b/packages/web3-eth-abi/test/fixtures/coders/encode.ts new file mode 100644 index 00000000000..9fa67ac65da --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/coders/encode.ts @@ -0,0 +1,62 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiInput } from 'web3-types'; + +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const validEncodeData: ReadonlyArray<{ + abiInput: ReadonlyArray; + params: unknown[]; + result: string; +}> = [ + { + abiInput: ['uint256'], + params: ['2345675643'], + result: '0x000000000000000000000000000000000000000000000000000000008bd02b7b', + }, + // {abiInput: ["uint256"], params: [], result: ""}, + // {abiInput: ["uint256"], params: [], result: ""}, + // {abiInput: ["uint256"], params: [], result: ""}, + // {abiInput: ["uint256"], params: [], result: ""}, + // {abiInput: ["uint256"], params: [], result: ""}, + // {abiInput: ["uint256"], params: [], result: ""}, + // {abiInput: ["uint256"], params: [], result: ""}, + // {abiInput: ["uint256"], params: [], result: ""}, +]; + +export const invalidEncodeData: [string][] = [ + ['blem'], + ['--123'], + ['2'], + ['-1'], + ['0x01'], + ['0x00'], +]; diff --git a/packages/web3-eth-abi/test/fixtures/data.ts b/packages/web3-eth-abi/test/fixtures/data.ts new file mode 100644 index 00000000000..0fe90638f95 --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/data.ts @@ -0,0 +1,1164 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { encodeParameters, decodeParameters } from '../../src/api/parameters_api'; + +// Because Jest does not support BigInt (https://github.com/facebook/jest/issues/12827) +// The BigInt values in this file is in a string format. +// And the following override is to convert BigInt to a string inside the Unit Tests that uses this file, +// i.e when serialization is needed there (because the values in this file is in a string format). +(BigInt.prototype as any).toJSON = function () { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call + return this.toString(); +}; + +export const jsonInterfaceValidData: [any, string][] = [ + [ + { + // testing function type + name: 'myMethod', + type: 'function', + inputs: [ + { + type: 'uint256', + name: 'myNumber', + }, + { + type: 'string', + name: 'myString', + }, + ], + }, + 'myMethod(uint256,string)', + ], + [ + { + name: 'f', + type: 'function', + inputs: [ + { + name: 's', + type: 'tuple', + components: [ + { + name: 'a', + type: 'uint256', + }, + { + name: 'b', + type: 'uint256[]', + }, + { + name: 'c', + type: 'tuple[]', + components: [ + { + name: 'x', + type: 'uint256', + }, + { + name: 'y', + type: 'uint256', + }, + ], + }, + ], + }, + { + name: 't', + type: 'tuple', + components: [ + { + name: 'x', + type: 'uint256', + }, + { + name: 'y', + type: 'uint256', + }, + ], + }, + { + name: 'a', + type: 'uint256', + }, + ], + outputs: [], + }, + 'f((uint256,uint256[],(uint256,uint256)[]),(uint256,uint256),uint256)', + ], + [ + // testing event type + { + type: 'event', + inputs: [ + { name: 'a', type: 'uint256', indexed: true }, + { name: 'b', type: 'bytes32', indexed: false }, + ], + name: 'Event', + }, + 'Event(uint256,bytes32)', + ], + [ + { + name: 'myEvent', + type: 'event', + inputs: [ + { + type: 'uint256', + name: 'myNumber', + }, + { + type: 'bytes32', + name: 'myBytes', + }, + ], + }, + 'myEvent(uint256,bytes32)', + ], +]; + +export const jsonInterfaceInvalidData: [any, string][] = [ + [ + { + name: 'f', + type: 'function', + inputs: [ + { + name: 's', + type: 'notTuple', + components: [ + { + name: 'a', + type: 'uint256', + }, + { + name: 'b', + type: 'uint256[]', + }, + { + name: 'c', + type: 'tuple[]', + components: [ + { + name: 'x', + type: 'uint256', + }, + { + name: 'y', + type: 'uint256', + }, + ], + }, + ], + }, + { + name: 't', + type: 'tuple', + components: [ + { + name: 'x', + type: 'uint256', + }, + { + name: 'y', + type: 'uint256', + }, + ], + }, + { + name: 'a', + type: 'uint256', + }, + ], + outputs: [], + }, + 'Invalid value given "notTuple". Error: components found but type is not tuple.', + ], +]; + +export const validFunctionsSignatures: { input: any; output: string }[] = [ + { input: 'myMethod(uint256,string)', output: '0x24ee0097' }, + { + input: { + name: 'myMethod', + type: 'function' as const, + inputs: [ + { + type: 'uint256', + name: 'myNumber', + }, + { + type: 'string', + name: 'myString', + }, + ], + }, + output: '0x24ee0097', + }, +]; + +export const inValidFunctionsSignatures: { input: any; output: string }[] = [ + { input: 345, output: 'Invalid parameter value in encodeFunctionSignature' }, + { input: {}, output: 'Invalid parameter value in encodeFunctionSignature' }, + { input: ['mystring'], output: 'Invalid parameter value in encodeFunctionSignature' }, + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + { input: null, output: 'Invalid parameter value in encodeFunctionSignature' }, + { input: undefined, output: 'Invalid parameter value in encodeFunctionSignature' }, +]; + +export const validFunctionsCall: { input: { abi: any; params: any }; output: string }[] = [ + { + input: { + abi: { + name: 'myMethod', + type: 'function', + inputs: [ + { + type: 'uint256', + name: 'myNumber', + }, + { + type: 'string', + name: 'myString', + }, + ], + }, + params: ['2345675643', 'Hello!%'], + }, + output: '0x24ee0097000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000', + }, + { + input: { + abi: { + type: 'function', + name: 'pour', + inputs: [ + { + type: 'bytes12', + name: 'vaultId_', + }, + { + type: 'address', + name: 'to', + }, + { + type: 'int128', + name: 'ink', + }, + { + type: 'int128', + name: 'art', + }, + ], + }, + params: [ + '0x000000000000000000000000', + '0x0000000000000000000000000000000000000000', + '170141183460469231731687303715884105727', + '-170141183460469231731687303715884105727', + ], + }, + output: '0x99d4294000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000000000000000001', + }, +]; + +export const inValidFunctionsCalls: { input: any; output: string }[] = [ + { input: 345, output: 'Invalid parameter value in encodeFunctionCall' }, + { input: {}, output: 'Invalid parameter value in encodeFunctionCall' }, + { input: ['mystring'], output: 'Invalid parameter value in encodeFunctionCall' }, + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + { input: null, output: 'Invalid parameter value in encodeFunctionCall' }, + { input: undefined, output: 'Invalid parameter value in encodeFunctionCall' }, +]; + +export const validEventsSignatures: { input: any; output: string }[] = [ + { + input: 'myEvent(uint256,bytes32)', + output: '0xf2eeb729e636a8cb783be044acf6b7b1e2c5863735b60d6daae84c366ee87d97', + }, + { + input: { + name: 'myEvent', + type: 'event' as const, + inputs: [ + { + type: 'uint256', + name: 'myNumber', + }, + { + type: 'bytes32', + name: 'myBytes', + }, + ], + }, + output: '0xf2eeb729e636a8cb783be044acf6b7b1e2c5863735b60d6daae84c366ee87d97', + }, +]; + +export const invalidEventsSignatures: { input: any; output: string }[] = [ + { input: 345, output: 'Invalid parameter value in encodeEventSignature' }, + { input: {}, output: 'Invalid parameter value in encodeEventSignature' }, + { input: ['mystring'], output: 'Invalid parameter value in encodeEventSignature' }, + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + { input: null, output: 'Invalid parameter value in encodeEventSignature' }, + { input: undefined, output: 'Invalid parameter value in encodeEventSignature' }, +]; + +export const validErrorsSignatures: { input: any; output: string }[] = [ + { + input: 'Unauthorized()', + output: '0x82b4290015f7ec7256ca2a6247d3c2a89c4865c0e791456df195f40ad0a81367', + }, + { + input: { + inputs: [{ internalType: 'string', name: '', type: 'string' }], + name: 'CustomError', + type: 'error', + }, + output: '0x8d6ea8bed4afafaebcad40e72174583b8bf4969c5d3bc84536051f3939bf9d81', + }, + { + input: 'Error(string)', + output: '0x08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa', + }, +]; + +export const invalidErrorSignatures: { input: any; output: string }[] = [ + { input: 345, output: 'Invalid parameter value in encodeErrorSignature' }, + { input: {}, output: 'Invalid parameter value in encodeErrorSignature' }, + { input: ['mystring'], output: 'Invalid parameter value in encodeErrorSignature' }, + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + { input: null, output: 'Invalid parameter value in encodeErrorSignature' }, + { input: undefined, output: 'Invalid parameter value in encodeErrorSignature' }, +]; + +export const validDecodeLogsData: { + input: { abi: any; data: any; topics: any }; + output: Record; +}[] = [ + { + input: { + abi: [ + { + type: 'string', + name: 'myString', + }, + { + type: 'uint256', + name: 'myNumber', + indexed: true, + }, + { + type: 'uint8', + name: 'mySmallNumber', + indexed: true, + }, + ], + data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000', + topics: [ + '0x000000000000000000000000000000000000000000000000000000000000f310', + '0x0000000000000000000000000000000000000000000000000000000000000010', + ], + }, + output: { + '0': 'Hello%!', + '1': '62224', + '2': '16', + __length__: 3, + myString: 'Hello%!', + myNumber: '62224', + mySmallNumber: '16', + }, + }, + { + // testing an anonymous log with 4 params + input: { + abi: [ + { + name: 'myString', + type: 'string', + }, + { + name: 'myNum', + type: 'uint8', + }, + { + name: 'str', + type: 'string', + }, + { + name: 'largerNumber', + type: 'uint256', + }, + ], + topics: [], + data: '0x0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000002307800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000', + }, + output: { + '0': '0x', + '1': '12', + '2': 'b', + '3': '125', + __length__: 4, + myString: '0x', + myNum: '12', + largerNumber: '125', + str: 'b', + }, + }, + { + input: { + abi: [ + { + indexed: true, + name: 'from', + type: 'address', + }, + { + indexed: true, + name: 'to', + type: 'address', + }, + { + indexed: false, + name: 'value', + type: 'uint256', + }, + ], + topics: [ + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + '0x0000000000000000000000006e599da0bff7a6598ac1224e4985430bf16458a4', + '0x0000000000000000000000006f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + ], + data: '0x00000000000000000000000000000000000000000000000000000000000186a0', + }, + output: { + '0': '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + '1': '0x6f1DF96865D09d21e8f3f9a7fbA3b17A11c7C53C', + '2': '100000', + __length__: 3, + from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + to: '0x6f1DF96865D09d21e8f3f9a7fbA3b17A11c7C53C', + value: '100000', + }, + }, + { + input: { + abi: [ + { indexed: true, internalType: 'address', name: 'addr', type: 'address' }, + { + components: [ + { internalType: 'string', name: 'name', type: 'string' }, + { internalType: 'address', name: 'addr', type: 'address' }, + { + components: [ + { internalType: 'string', name: 'email', type: 'string' }, + { internalType: 'string', name: 'phone', type: 'string' }, + ], + internalType: 'struct ABIV2UserDirectory.Contact', + name: 'contact', + type: 'tuple', + }, + ], + indexed: false, + internalType: 'struct ABIV2UserDirectory.User', + name: 'user', + type: 'tuple', + }, + ], + data: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000cb00cde33a7a0fba30c63745534f1f7ae607076b00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000c5269636b2053616e6368657a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000157269636b2e63313337406369746164656c2e636663000000000000000000000000000000000000000000000000000000000000000000000000000000000000112b31202835353529203331342d31353933000000000000000000000000000000', + topics: ['0x000000000000000000000000cb00cde33a7a0fba30c63745534f1f7ae607076b'], + }, + output: { + '0': '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '1': { + '0': 'Rick Sanchez', + '1': '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '2': { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + __length__: 3, + name: 'Rick Sanchez', + addr: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + contact: { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + }, + __length__: 2, + addr: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + user: { + '0': 'Rick Sanchez', + '1': '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '2': { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + __length__: 3, + name: 'Rick Sanchez', + addr: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + contact: { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + }, + }, + }, +]; + +export const validEncodeDecodeParametersData: { + input: Parameters; + output: ReturnType; + outputResult: any; +}[] = [ + { + input: [ + ['uint256', 'string'], + ['2345675643', 'Hello!%'], + ], + output: '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000', + outputResult: { + '0': '2345675643', + '1': 'Hello!%', + __length__: 2, + }, + }, + { + input: [ + ['uint8[]', 'bytes32'], + [['34', '255'], '0x324567fff0000000000000000000000000000000000000000000000000000000'], + ], + output: '0x0000000000000000000000000000000000000000000000000000000000000040324567fff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff', + outputResult: { + '0': ['34', '255'], + '1': '0x324567fff0000000000000000000000000000000000000000000000000000000', + __length__: 2, + }, + }, + { + input: [ + [ + 'uint8[]', + { + ParentStruct: { + propertyOne: 'uint256', + propertyTwo: 'uint256', + ChildStruct: { + propertyOne: 'uint256', + propertyTwo: 'uint256', + }, + }, + }, + ], + [ + ['34', '255'], + { + propertyOne: '42', + propertyTwo: '56', + ChildStruct: { + propertyOne: '45', + propertyTwo: '78', + }, + }, + ], + ], + output: '0x00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff', + outputResult: { + '0': ['34', '255'], + '1': { + '0': '42', + '1': '56', + '2': { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + propertyOne: '42', + propertyTwo: '56', + ChildStruct: { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + __length__: 3, + }, + ParentStruct: { + '0': '42', + '1': '56', + '2': { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + propertyOne: '42', + propertyTwo: '56', + ChildStruct: { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + __length__: 3, + }, + __length__: 2, + }, + }, +]; + +export const validEncodeDoesNotMutateData: { + expectedInput: unknown[]; + input: Parameters; + output: ReturnType; +}[] = [ + { + expectedInput: [ + ['34', '255'], + { + propertyOne: ['78', '124'], + propertyTwo: '56', + ChildStruct: { + propertyOne: ['16'], + propertyTwo: '78', + }, + }, + ], + + input: [ + [ + 'uint8[]', + { + ParentStruct: { + propertyOne: 'uint8[]', + propertyTwo: 'uint256', + ChildStruct: { + propertyOne: 'uint8[]', + propertyTwo: 'uint256', + }, + }, + }, + ], + [ + ['34', '255'], + { + propertyOne: ['78', '124'], + propertyTwo: '56', + ChildStruct: { + propertyOne: ['16'], + propertyTwo: '78', + }, + }, + ], + ], + output: '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000007c0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010', + }, +]; + +export const validEncodeParametersData: { + input: Parameters; + output: ReturnType; +}[] = [ + { + input: [ + ['uint256', 'string'], + ['2345675643', 'Hello!%'], + ], + output: '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000', + }, + { + input: [ + ['uint8[]', 'bytes32'], + [['34', '255'], '0x324567fff'], + ], + output: '0x0000000000000000000000000000000000000000000000000000000000000040324567fff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff', + }, + { + input: [ + [ + 'uint8[]', + { + ParentStruct: { + propertyOne: 'uint256', + propertyTwo: 'uint256', + ChildStruct: { + propertyOne: 'uint256', + propertyTwo: 'uint256', + }, + }, + }, + ], + [ + ['34', '255'], + { + propertyOne: '42', + propertyTwo: '56', + ChildStruct: { + propertyOne: '45', + propertyTwo: '78', + }, + }, + ], + ], + output: '0x00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff', + }, + { + input: [ + ['uint', 'tuple(uint256, string)'], + [1234, [5678, 'Hello World']], + ], + output: '0x00000000000000000000000000000000000000000000000000000000000004d20000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000162e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000b48656c6c6f20576f726c64000000000000000000000000000000000000000000', + }, +]; + +export const inValidEncodeParametersData: { + input: any[]; + output: string; +}[] = [ + { + input: [ + ['uint8[]', 'bytes32'], + [['34', '256'], '0x324567fff'], + ], + output: 'Parameter encoding error', + }, + { + input: [345, ['2345675643', 'Hello!%']], + output: 'Parameter encoding error', + }, + { + input: [true, ['2345675643', 'Hello!%']], + output: 'Parameter encoding error', + }, + { + input: [undefined, ['2345675643', 'Hello!%']], + output: 'Parameter encoding error', + }, + { + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + input: [null, ['2345675643', 'Hello!%']], + output: 'Parameter encoding error', + }, +]; + +export const validDecodeParametersData: { + input: Parameters; + outputResult: any; +}[] = [ + { + input: [ + ['uint256', 'string'], + '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000', + ], + outputResult: { + '0': '2345675643', + '1': 'Hello!%', + __length__: 2, + }, + }, + { + input: [ + ['uint8[]', 'bytes32'], + '0x0000000000000000000000000000000000000000000000000000000000000040324567fff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff', + ], + outputResult: { + '0': ['34', '255'], + '1': '0x324567fff0000000000000000000000000000000000000000000000000000000', + __length__: 2, + }, + }, + { + input: [ + [ + 'uint8[]', + { + ParentStruct: { + propertyOne: 'uint256', + propertyTwo: 'uint256', + ChildStruct: { + propertyOne: 'uint256', + propertyTwo: 'uint256', + }, + }, + }, + ], + '0x00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff', + ], + outputResult: { + '0': ['34', '255'], + '1': { + '0': '42', + '1': '56', + '2': { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + propertyOne: '42', + propertyTwo: '56', + ChildStruct: { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + __length__: 3, + }, + ParentStruct: { + '0': '42', + '1': '56', + '2': { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + propertyOne: '42', + propertyTwo: '56', + ChildStruct: { + '0': '45', + '1': '78', + propertyOne: '45', + propertyTwo: '78', + __length__: 2, + }, + __length__: 3, + }, + __length__: 2, + }, + }, + { + input: [ + [ + { + components: [ + { internalType: 'string', name: 'name', type: 'string' }, + { internalType: 'address', name: 'addr', type: 'address' }, + { + components: [ + { internalType: 'string', name: 'email', type: 'string' }, + { internalType: 'string', name: 'phone', type: 'string' }, + ], + internalType: 'struct ABIV2UserDirectory.Contact', + name: 'contact', + type: 'tuple', + }, + ], + indexed: false, + internalType: 'struct ABIV2UserDirectory.User', + name: 'user', + type: 'tuple', + }, + ], + '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000cb00cde33a7a0fba30c63745534f1f7ae607076b00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000c5269636b2053616e6368657a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000157269636b2e63313337406369746164656c2e636663000000000000000000000000000000000000000000000000000000000000000000000000000000000000112b31202835353529203331342d31353933000000000000000000000000000000', + ], + outputResult: { + '0': { + '0': 'Rick Sanchez', + '1': '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '2': { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + __length__: 3, + addr: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + contact: { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + name: 'Rick Sanchez', + }, + __length__: 1, + user: { + '0': 'Rick Sanchez', + '1': '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '2': { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + __length__: 3, + addr: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + contact: { + '0': 'rick.c137@citadel.cfc', + '1': '+1 (555) 314-1593', + __length__: 2, + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + name: 'Rick Sanchez', + }, + }, + }, +]; + +export const inValidDecodeParametersData: { + input: any[]; + output: string; +}[] = [ + { + input: [['uint8[]', 'bytes32'], '0x000000000010'], + output: 'Parameter decoding error', + }, + { + input: [345, '0x000000000010'], + output: 'Parameter decoding error', + }, + { + input: [true, '0x000000000010'], + output: 'Parameter decoding error', + }, + { + input: [undefined, '0x000000000010'], + output: 'Parameter decoding error', + }, + { + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + input: [null, '0x000000000010'], + output: 'Parameter decoding error', + }, +]; + +export const validDecodeContractErrorData: { + input: any[]; + output: any; +}[] = [ + { + input: [ + [ + { inputs: [], name: 'ErrorWithNoParams', type: 'error' }, + { + inputs: [ + { name: 'code', type: 'uint256' }, + { name: 'message', type: 'string' }, + ], + name: 'ErrorWithParams', + type: 'error', + }, + ], + { + code: 12, + message: 'message', + data: '0xc85bda60000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + }, + ], + output: { + errorName: 'ErrorWithParams', + errorSignature: 'ErrorWithParams(uint256,string)', + errorArgs: { + code: 42, + message: 'This is an error with params', + }, + }, + }, + { + input: [ + [ + { inputs: [], name: 'ErrorWithNoParams', type: 'error' }, + { + inputs: [ + { name: 'code', type: 'uint256' }, + { name: 'message', type: 'string' }, + ], + name: 'ErrorWithParams', + type: 'error', + }, + ], + { + code: 12, + message: 'message', + data: { + code: -32000, + data: '0xc85bda60000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + }, + }, + ], + output: { + errorName: 'ErrorWithParams', + errorSignature: 'ErrorWithParams(uint256,string)', + errorArgs: { + code: 42, + message: 'This is an error with params', + }, + cause: { + code: -32000, + }, + }, + }, + { + input: [ + [ + { inputs: [], name: 'ErrorWithNoParams', type: 'error' }, + { + inputs: [ + { name: 'code', type: 'uint256' }, + { name: 'message', type: 'string' }, + ], + name: 'ErrorWithParams', + type: 'error', + }, + ], + { + code: 12, + message: 'message', + data: { + originalError: { + code: 3, + data: '0xc85bda60000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + }, + }, + }, + ], + output: { + errorName: 'ErrorWithParams', + errorSignature: 'ErrorWithParams(uint256,string)', + errorArgs: { + code: 42, + message: 'This is an error with params', + }, + cause: { + code: 3, + }, + }, + }, +]; + +export const invalidDecodeContractErrorData: { + input: any[]; +}[] = [ + { + input: [ + [ + { inputs: [], name: 'ErrorWithNoParams', type: 'error' }, + { + inputs: [ + { name: 'code', type: 'uint256' }, + { name: 'message', type: 'string' }, + ], + name: 'ErrorWithParams', + type: 'error', + }, + ], + { + code: 12, + message: 'message', + data: '0xc85bda60000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000123450000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + }, + ], + }, +]; + +export const validIsAbiConstructorFragment: { + input: any; +}[] = [ + { + input: { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, + }, +]; +export const invalidIsAbiConstructorFragment: { + input: any; +}[] = [ + { + input: { inputs: [], stateMutability: 'nonpayable', type: 'function' }, + }, +]; + +export const mapTypesValidData: [any, any][] = [ + [ + ['string', 'uint256'], + ['string', 'uint256'], + ], + [ + [ + { type: 'string', name: 'test' }, + { type: 'uint256', name: 'test' }, + ], + [ + { type: 'string', name: 'test' }, + { type: 'uint256', name: 'test' }, + ], + ], + [ + [ + { type: 'function', name: 'test' }, + { type: 'uint256', name: 'test' }, + ], + [ + { type: 'bytes24', name: 'test' }, + { type: 'uint256', name: 'test' }, + ], + ], + [ + [{ name1: ['string'] }], + [{ components: [{ name: '0', type: 'string' }], name: 'name1', type: 'tuple' }], + ], +]; + +export const formatParamValidData: [[string, any], any][] = [ + [['string', { name: 'test' }], { name: 'test' }], + [['string', [{ name: 'test' }]], [{ name: 'test' }]], + [['string', BigInt(1)], '1'], + [['int', 123], 123], + [['bytes', '0x99d42941'], '0x99d42941'], + [ + ['int', '0x1234567890123456789012345678901234567890'], + '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001234567890123456789012345678901234567890', + ], + [ + ['bytes256[]', ['0x99d42941']], + [ + '0x99d42941000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + ], + ], +]; diff --git a/packages/web3-eth-abi/test/fixtures/get_encoded_eip712_data.ts b/packages/web3-eth-abi/test/fixtures/get_encoded_eip712_data.ts new file mode 100644 index 00000000000..ff7474aa33f --- /dev/null +++ b/packages/web3-eth-abi/test/fixtures/get_encoded_eip712_data.ts @@ -0,0 +1,758 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Eip712TypedData } from 'web3-types'; + +/** + * string is the test title + * Eip712TypedData is the entire EIP-712 typed data object + * boolean is whether the EIP-712 encoded data is keccak256 hashed + * string is the encoded data expected to be returned by getEncodedEip712Data + */ +export const testData: [string, Eip712TypedData, boolean | undefined, string][] = [ + [ + 'should get encoded message without hashing, hash = undefined', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Person: [ + { + name: 'name', + type: 'string', + }, + { + name: 'wallet', + type: 'address', + }, + ], + Mail: [ + { + name: 'from', + type: 'Person', + }, + { + name: 'to', + type: 'Person', + }, + { + name: 'contents', + type: 'string', + }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, + }, + undefined, + '0x1901f2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090fc52c0ee5d84264471806290a3f2c4cecfc5490626bf912d01f240d7a274b371e', + ], + [ + 'should get encoded message without hashing, hash = false', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Person: [ + { + name: 'name', + type: 'string', + }, + { + name: 'wallet', + type: 'address', + }, + ], + Mail: [ + { + name: 'from', + type: 'Person', + }, + { + name: 'to', + type: 'Person', + }, + { + name: 'contents', + type: 'string', + }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, + }, + false, + '0x1901f2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090fc52c0ee5d84264471806290a3f2c4cecfc5490626bf912d01f240d7a274b371e', + ], + [ + 'should get the hashed encoded message, hash = true', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Person: [ + { + name: 'name', + type: 'string', + }, + { + name: 'wallet', + type: 'address', + }, + ], + Mail: [ + { + name: 'from', + type: 'Person', + }, + { + name: 'to', + type: 'Person', + }, + { + name: 'contents', + type: 'string', + }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, + }, + true, + '0xbe609aee343fb3c4b28e1df9e632fca64fcfaede20f02e86244efddf30957bd2', + ], + [ + 'should get encoded message with array types', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'array1', + type: 'string[]', + }, + { + name: 'array2', + type: 'address[]', + }, + { + name: 'array3', + type: 'uint256[]', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + array1: ['string', 'string2', 'string3'], + array2: [ + '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + ], + array3: [123456, 654321, 42], + }, + }, + false, + '0x1901928e4773f1f7243172cd0dd213906be49eb9d275e09c8bd0575921c51ba00058596a0bafab67b5b49cfe99456c50dd5b6294b1383e4f17c6e5c3c14afee96ac3', + ], + [ + 'should get encoded message with array types', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'array1', + type: 'string[]', + }, + { + name: 'array2', + type: 'address[]', + }, + { + name: 'array3', + type: 'uint256[]', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + array1: ['string', 'string2', 'string3'], + array2: [ + '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + ], + array3: [123456, 654321, 42], + }, + }, + true, + '0x3e4d581a408c8c2fa8775017c26e0127df030593d83a8202e6c19b3380bde3da', + ], + [ + 'should get encoded message with fixed array', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'array1', + type: 'string[]', + }, + { + name: 'array2', + type: 'address[3]', + }, + { + name: 'array3', + type: 'uint256[]', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + array1: ['string', 'string2', 'string3'], + array2: [ + '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + ], + array3: [123456, 654321, 42], + }, + }, + false, + '0x1901928e4773f1f7243172cd0dd213906be49eb9d275e09c8bd0575921c51ba00058b068b45d685c16bc9ef637106b4fd3a4fb9aa259f53218491a3d9eb65b1b574c', + ], + [ + 'should get encoded message with fixed array', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'array1', + type: 'string[]', + }, + { + name: 'array2', + type: 'address[3]', + }, + { + name: 'array3', + type: 'uint256[]', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + array1: ['string', 'string2', 'string3'], + array2: [ + '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + ], + array3: [123456, 654321, 42], + }, + }, + true, + '0x133d00e67f2390ce846a631aeb6718a674a3923f5320b79b6d3e2f5bf146319e', + ], + [ + 'should get encoded message with bytes32', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'bytes32', + type: 'bytes32', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + bytes32: '0x133d00e67f2390ce846a631aeb6718a674a3923f5320b79b6d3e2f5bf146319e', + }, + }, + false, + '0x1901928e4773f1f7243172cd0dd213906be49eb9d275e09c8bd0575921c51ba000587c9d26380d51aac5dc2ff6f794d1c043ea4259bb42068f70f79d2e4849133ac3', + ], + [ + 'should get encoded message with bytes32', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'bytes32', + type: 'bytes', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + bytes32: '0x133d00e67f2390ce846a631aeb6718a674a3923f5320b79b6d3e2f5bf146319e', + }, + }, + false, + '0x1901928e4773f1f7243172cd0dd213906be49eb9d275e09c8bd0575921c51ba00058353ed034fd1df0cd409a19133f4a89f5e99ddc735ad3fbb767d0bb72c97ef175', + ], + [ + 'should get encoded message with bytes32', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'bytes32', + type: 'bytes32', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + bytes32: '0x133d00e67f2390ce846a631aeb6718a674a3923f5320b79b6d3e2f5bf146319e', + }, + }, + true, + '0xa6cd048c02ef3cb70feee1bd9795decbbc8b431b976dfc86e3b09e55e0d2a3f3', + ], +]; + +/** + * string is the test title + * Eip712TypedData is the entire EIP-712 typed data object + * boolean is whether the EIP-712 encoded data is keccak256 hashed + * string is the encoded data expected to be returned by getEncodedEip712Data + */ +export const erroneousTestData: [string, Eip712TypedData, boolean | undefined, Error][] = [ + [ + 'should throw error: Cannot encode data: value is not of array type', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'array1', + type: 'string[]', + }, + { + name: 'array2', + type: 'address[]', + }, + { + name: 'array3', + type: 'uint256[]', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + array1: ['string', 'string2', 'string3'], + array2: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + array3: [123456, 654321, 42], + }, + }, + false, + new Error('Cannot encode data: value is not of array type'), + ], + [ + 'should throw error: Cannot encode data: expected length of 3, but got 1', + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'array1', + type: 'string[]', + }, + { + name: 'array2', + type: 'address[3]', + }, + { + name: 'array3', + type: 'uint256[]', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + array1: ['string', 'string2', 'string3'], + array2: ['0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'], + array3: [123456, 654321, 42], + }, + }, + false, + new Error('Cannot encode data: expected length of 3, but got 1'), + ], + [ + "should throw error: Cannot encode data: missing data for 'array3'", + { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + ArrayData: [ + { + name: 'array1', + type: 'string[]', + }, + { + name: 'array2', + type: 'address[]', + }, + { + name: 'array3', + type: 'uint256[]', + }, + ], + }, + primaryType: 'ArrayData', + domain: { + name: 'Array Data', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + array1: ['string', 'string2', 'string3'], + array2: ['0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB'], + array3: undefined, + }, + }, + false, + new Error("Cannot encode data: missing data for 'array3'"), + ], +]; diff --git a/packages/web3-eth-abi/test/integration/jest.config.js b/packages/web3-eth-abi/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-eth-abi/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-eth-abi/test/integration/setup.js b/packages/web3-eth-abi/test/integration/setup.js new file mode 100644 index 00000000000..339adf9ec52 --- /dev/null +++ b/packages/web3-eth-abi/test/integration/setup.js @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth-abi/test/tsconfig.json b/packages/web3-eth-abi/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-eth-abi/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-eth-abi/test/unit/api/errors_api.test.ts b/packages/web3-eth-abi/test/unit/api/errors_api.test.ts new file mode 100644 index 00000000000..dae7ec783a5 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/api/errors_api.test.ts @@ -0,0 +1,41 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { encodeErrorSignature } from '../../../src/api/errors_api'; +import { validErrorsSignatures, invalidErrorSignatures } from '../../fixtures/data'; + +describe('errors_api', () => { + describe('encodeErrorSignature', () => { + describe('valid data', () => { + it.each(validErrorsSignatures)( + 'should pass for valid values: %s', + ({ input, output }) => { + expect(encodeErrorSignature(input)).toEqual(output); + }, + ); + }); + + describe('invalid data', () => { + it.each(invalidErrorSignatures)( + 'should pass for valid values: %s', + ({ input, output }) => { + expect(() => encodeErrorSignature(input)).toThrow(output); + }, + ); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/api/events_api.test.ts b/packages/web3-eth-abi/test/unit/api/events_api.test.ts new file mode 100644 index 00000000000..f607e38c2d7 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/api/events_api.test.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { encodeEventSignature } from '../../../src/api/events_api'; +import { invalidEventsSignatures, validEventsSignatures } from '../../fixtures/data'; + +describe('events_api', () => { + describe('encodeEventSignature', () => { + describe('valid data', () => { + it.each(validEventsSignatures)( + 'should pass for valid values: %s', + ({ input, output }) => { + expect(encodeEventSignature(input)).toEqual(output); + }, + ); + }); + describe('invalid data', () => { + it.each(invalidEventsSignatures)( + 'should fail for invalid values: %s', + ({ input, output }) => { + expect(() => encodeEventSignature(input)).toThrow(output); + }, + ); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/api/functions_api.test.ts b/packages/web3-eth-abi/test/unit/api/functions_api.test.ts new file mode 100644 index 00000000000..5a6e9479a38 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/api/functions_api.test.ts @@ -0,0 +1,66 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { encodeFunctionCall, encodeFunctionSignature } from '../../../src/api/functions_api'; +import { + inValidFunctionsSignatures, + validFunctionsSignatures, + validFunctionsCall, + inValidFunctionsCalls, +} from '../../fixtures/data'; + +describe('functions_api', () => { + describe('encodeFunctionSignature', () => { + describe('valid data', () => { + it.each(validFunctionsSignatures)( + 'should pass for valid values: %s', + ({ input, output }) => { + expect(encodeFunctionSignature(input)).toEqual(output); + }, + ); + }); + + describe('invalid data', () => { + it.each(inValidFunctionsSignatures)( + 'should pass for valid values: %s', + ({ input, output }) => { + expect(() => encodeFunctionSignature(input)).toThrow(output); + }, + ); + }); + }); + + describe('encodeFunctionCall', () => { + describe('valid data', () => { + it.each(validFunctionsCall)( + 'should pass for valid values: %s', + ({ input: { abi, params }, output }) => { + expect(encodeFunctionCall(abi, params)).toEqual(output); + }, + ); + }); + + describe('invalid data', () => { + it.each(inValidFunctionsCalls)( + 'should pass for valid values: %s', + ({ input, output }) => { + expect(() => encodeFunctionCall(input, [])).toThrow(output); + }, + ); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/api/logs_api.test.ts b/packages/web3-eth-abi/test/unit/api/logs_api.test.ts new file mode 100644 index 00000000000..972cec3fd3b --- /dev/null +++ b/packages/web3-eth-abi/test/unit/api/logs_api.test.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { decodeLog } from '../../../src/api/logs_api'; +import { validDecodeLogsData } from '../../fixtures/data'; + +describe('logs_api', () => { + describe('decodeLog', () => { + describe('valid data', () => { + it.each(validDecodeLogsData)( + 'should pass for valid values: %j', + ({ input: { abi, data, topics }, output }) => { + const expected = decodeLog(abi, data, topics); + expect(JSON.parse(JSON.stringify(expected))).toEqual(output); + }, + ); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/api/parameters_api.test.ts b/packages/web3-eth-abi/test/unit/api/parameters_api.test.ts new file mode 100644 index 00000000000..ae006ab0aee --- /dev/null +++ b/packages/web3-eth-abi/test/unit/api/parameters_api.test.ts @@ -0,0 +1,118 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiInput } from 'web3-types'; +import { decodeParameters, encodeParameters } from '../../../src/api/parameters_api'; +import { + inValidDecodeParametersData, + inValidEncodeParametersData, + validDecodeParametersData, + validEncodeParametersData, + validEncodeDecodeParametersData, + validEncodeDoesNotMutateData, +} from '../../fixtures/data'; + +describe('parameters_api', () => { + describe('encodeParameters', () => { + describe('valid data', () => { + it.each(validEncodeParametersData)( + '%#: should pass for valid values: %j', + ({ input: [abi, params], output }) => { + const expected = encodeParameters(abi, params); + expect(expected).toEqual(output); + }, + ); + }); + + describe('invalid data', () => { + it.each(inValidEncodeParametersData)( + '%#: should not pass for invalid values: %j', + ({ input: [abi, params] }) => { + expect(() => encodeParameters(abi, params)).toThrow(); + }, + ); + }); + }); + + describe('encodeParametersDoesNotMutate', () => { + describe('valid data', () => { + it.each(validEncodeDoesNotMutateData)( + '%#: should pass for valid values: %j', + ({ input: [abi, params], output, expectedInput }) => { + const expected = encodeParameters(abi, params); + expect(JSON.parse(JSON.stringify(expected))).toEqual(output); + // check that params has not been mutated + expect(JSON.parse(JSON.stringify(params))).toEqual( + JSON.parse(JSON.stringify(expectedInput)), + ); + }, + ); + }); + }); + + describe('decodeParameters', () => { + describe('valid data', () => { + it.each(validDecodeParametersData)( + '%#: should pass for valid values: %j', + ({ input: [abi, bytes], outputResult }) => { + // Output returns mix of array and object which can't be matched in + // jest, so have to use stringify+parse to match + // { + // '0': [ '34', '255' ], + // '1': [ + // '42', + // '56', + // [ '45', '78', propertyOne: '45', propertyTwo: '78' ], + // propertyOne: '42', + // propertyTwo: '56', + // ChildStruct: [ '45', '78', propertyOne: '45', propertyTwo: '78' ] + // ], + // __length__: 2 + // } + expect(JSON.parse(JSON.stringify(decodeParameters(abi, bytes)))).toEqual( + outputResult, + ); + }, + ); + }); + + describe('invalid data', () => { + it.each(inValidDecodeParametersData)( + '%#: should not pass for invalid values: %j', + ({ input: [abi, bytes] }) => { + expect(() => decodeParameters(abi, bytes)).toThrow(); + }, + ); + }); + }); + + describe('encode and decode', () => { + describe('input should be the same as returned value from encode and decode', () => { + it.each(validEncodeDecodeParametersData)( + '%#: should pass for valid values: %j', + ({ input: [abi, params], output, outputResult }) => { + const rwAbi = abi as AbiInput[]; + const encodedBytes = encodeParameters(abi, params); + expect(JSON.parse(JSON.stringify(encodedBytes))).toEqual(output); + + const decodedParams = decodeParameters(rwAbi, encodedBytes); + expect(JSON.parse(JSON.stringify(decodedParams))).toEqual(outputResult); + }, + ); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/address.test.ts b/packages/web3-eth-abi/test/unit/coders/base/address.test.ts new file mode 100644 index 00000000000..38c6096ca8e --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/address.test.ts @@ -0,0 +1,59 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { bytesToHex, hexToBytes } from 'web3-utils'; +import { decodeAddress, encodeAddress } from '../../../../src/coders/base/address'; +import { + invalidAddressDecoderData, + invalidAddressEncoderData, + validAddressDecoderData, + validAddressEncoderData, +} from '../../../fixtures/coders/base/address'; + +describe('abi - coder - base - address', () => { + describe('encode', () => { + it.each(validAddressEncoderData)('value %s to result in %s', (value, expected) => { + const result = encodeAddress({ type: 'address', name: '' }, value); + expect(Buffer.from(result.encoded).toString('hex')).toEqual(expected); + }); + + it.each(invalidAddressEncoderData)('value %s to throw', value => { + expect(() => encodeAddress({ type: 'address', name: '' }, value)).toThrow(AbiError); + }); + }); + + describe('decode', () => { + it.each(validAddressDecoderData)( + 'value %s to result in %s', + ({ bytes, result, remaining }) => { + const addressResult = decodeAddress( + { type: 'address', name: '' }, + hexToBytes(bytes), + ); + expect(addressResult.result).toEqual(result); + expect(bytesToHex(addressResult.encoded)).toEqual(remaining); + }, + ); + + it.each(invalidAddressDecoderData)('value %s to throw', bytes => { + expect(() => decodeAddress({ type: 'address', name: '' }, hexToBytes(bytes))).toThrow( + AbiError, + ); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/array.test.ts b/packages/web3-eth-abi/test/unit/coders/base/array.test.ts new file mode 100644 index 00000000000..e0716e44838 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/array.test.ts @@ -0,0 +1,85 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { bytesToHex, hexToBytes } from 'web3-utils'; +import { decodeArray, encodeArray } from '../../../../src/coders/base'; +import { extractArrayType } from '../../../../src/coders/utils'; +import { + invalidArrayDecoderData, + invalidArrayEncoderData, + validArrayDecoderData, + validArrayEncoderData, +} from '../../../fixtures/coders/base/array'; + +describe('abi - coder - base - array', () => { + describe('extractArrayType', () => { + it('should work for dynamic array', () => { + expect(extractArrayType({ type: 'uint256[]', name: '' })).toEqual({ + param: { type: 'uint256', name: '' }, + size: -1, + }); + }); + it('should work for 2d array', () => { + expect(extractArrayType({ type: 'uint256[][]', name: '' })).toEqual({ + param: { type: 'uint256[]', name: '' }, + size: -1, + }); + }); + it('should work for fixed size array', () => { + expect(extractArrayType({ type: 'uint256[2]', name: '' })).toEqual({ + param: { type: 'uint256', name: '' }, + size: 2, + }); + expect(extractArrayType({ type: 'uint256[0]', name: '' })).toEqual({ + param: { type: 'uint256', name: '' }, + size: 0, + }); + }); + it('should fail for invalid array size', () => { + expect(() => extractArrayType({ type: 'uint256[2q]', name: '' })).toThrow(); + }); + }); + + describe('encode', () => { + it.each(validArrayEncoderData)('value %s to result in %s', value => { + const result = encodeArray({ type: value.type, name: '' }, value.values); + expect(bytesToHex(result.encoded)).toEqual(value.result); + expect(result.dynamic).toEqual(value.dynamic); + }); + + it.each(invalidArrayEncoderData)('value %s to throw', value => { + expect(() => encodeArray({ type: value.type, name: '' }, value.values)).toThrow( + AbiError, + ); + }); + }); + + describe('decode', () => { + it.each(validArrayDecoderData)('value to result', value => { + const result = decodeArray({ type: value.type, name: '' }, hexToBytes(value.bytes)); + expect(result.result).toEqual(value.result); + expect(bytesToHex(result.encoded)).toEqual(value.remaining); + }); + + it.each(invalidArrayDecoderData)('value to throw', value => { + expect(() => + decodeArray({ type: value.type, name: '' }, hexToBytes(value.bytes)), + ).toThrow(AbiError); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/bool.test.ts b/packages/web3-eth-abi/test/unit/coders/base/bool.test.ts new file mode 100644 index 00000000000..755eb097c24 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/bool.test.ts @@ -0,0 +1,56 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { bytesToHex, hexToBytes } from 'web3-utils'; +import { decodeBool, encodeBoolean } from '../../../../src/coders/base/bool'; +import { + invalidBoolDecoderData, + invalidBoolEncoderData, + validBoolDecoderData, + validBoolEncoderData, +} from '../../../fixtures/coders/base/bool'; + +describe('abi - coder - base - bool', () => { + describe('encode', () => { + it.each(validBoolEncoderData)('value %s to result in %s', (value, expected) => { + const result = encodeBoolean({ type: 'boolean', name: '' }, value); + expect(Buffer.from(result.encoded).toString('hex')).toEqual(expected); + }); + + it.each(invalidBoolEncoderData)('value %s to throw', value => { + expect(() => encodeBoolean({ type: 'boolean', name: '' }, value)).toThrow(AbiError); + }); + }); + + describe('decode', () => { + it.each(validBoolDecoderData)( + 'value %s to result in %s', + ({ bytes, result, remaining }) => { + const boolResult = decodeBool({ type: 'boolean', name: '' }, hexToBytes(bytes)); + expect(boolResult.result).toEqual(result); + expect(bytesToHex(boolResult.encoded)).toEqual(remaining); + }, + ); + + it.each(invalidBoolDecoderData)('value %s to throw', value => { + expect(() => decodeBool({ type: 'boolean', name: '' }, hexToBytes(value))).toThrow( + AbiError, + ); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/bytes.test.ts b/packages/web3-eth-abi/test/unit/coders/base/bytes.test.ts new file mode 100644 index 00000000000..d9e1bdde496 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/bytes.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { hexToBytes } from 'web3-utils'; +import { decodeBytes, encodeBytes } from '../../../../src/coders/base/bytes'; +import { + invalidBytesDecoderData, + invalidBytesEncoderData, + validBytesDecoderData, + validBytesEncoderData, +} from '../../../fixtures/coders/base/bytes'; + +describe('abi - coder - base - bytes', () => { + describe('encode', () => { + it.each(validBytesEncoderData)( + 'bytes%j type with value %s to result in %s', + (type, value, expected) => { + const result = encodeBytes(type, value); + expect(Buffer.from(result.encoded).toString('hex')).toEqual(expected); + const [, size] = type.type.split('bytes'); + if (size) { + // eslint-disable-next-line jest/no-conditional-expect + expect(result.dynamic).toBeFalsy(); + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(result.dynamic).toBeTruthy(); + } + }, + ); + + it.each(invalidBytesEncoderData)('bytes%j type value %s to throw', (type, value) => { + expect(() => encodeBytes(type, value)).toThrow(AbiError); + }); + }); + + describe('decode', () => { + it.each(validBytesDecoderData)( + 'bytes%j type with value %s to result in %s', + (type, value, expected, remaining) => { + const result = decodeBytes(type, hexToBytes(value)); + expect(result.result).toEqual(expected); + expect(result.encoded).toEqual(hexToBytes(remaining)); + }, + ); + + it.each(invalidBytesDecoderData)( + 'decode bytes %j type with value %s to throw', + (type, value) => { + expect(() => decodeBytes(type, hexToBytes(value))).toThrow(AbiError); + }, + ); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/invalid.test.ts b/packages/web3-eth-abi/test/unit/coders/base/invalid.test.ts new file mode 100644 index 00000000000..049f80774ee --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/invalid.test.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { + decodeParamFromAbiParameter, + encodeParamFromAbiParameter, +} from '../../../../src/coders/base'; + +describe('abi - coder - base - invalid', () => { + describe('invalid type', () => { + it('invalid should cause `decodeParamFromAbiParameter` to throw', () => { + expect(() => + decodeParamFromAbiParameter({ type: 'invalid', name: '' }, new Uint8Array()), + ).toThrow(AbiError); + }); + it('invalid should cause `encodeParamFromAbiParameter` to throw', () => { + expect(() => + encodeParamFromAbiParameter({ type: 'invalid', name: '' }, 'something'), + ).toThrow(AbiError); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/number.test.ts b/packages/web3-eth-abi/test/unit/coders/base/number.test.ts new file mode 100644 index 00000000000..914e106e5f4 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/number.test.ts @@ -0,0 +1,58 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { hexToBytes } from 'web3-utils'; +import { decodeNumber, encodeNumber } from '../../../../src/coders/base/number'; +import { + invalidNumberDecoderData, + invalidNumberEncoderData, + validNumberDecoderData, + validNumberEncoderData, +} from '../../../fixtures/coders/base/number'; + +describe('abi - coder - base - number', () => { + describe('encode', () => { + it.each(validNumberEncoderData)( + '%j type with value %s to be %s', + (type, value, expected) => { + const result = encodeNumber(type, value); + expect(Buffer.from(result.encoded).toString('hex')).toEqual(expected); + }, + ); + + it.each(invalidNumberEncoderData)('%j type with value %s to throw', (type, value) => { + expect(() => encodeNumber(type, value)).toThrow(AbiError); + }); + }); + + describe('decode', () => { + it.each(validNumberDecoderData)( + '%j type with bytes %s', + (param, bytes, result, remaining) => { + const resultNumber = decodeNumber(param, hexToBytes(bytes)); + expect(typeof resultNumber.result).toEqual(typeof result); + expect(resultNumber.result.toString()).toEqual(result.toString()); + expect(resultNumber.encoded).toEqual(hexToBytes(remaining)); + }, + ); + + it.each(invalidNumberDecoderData)('%j type with bytes %s to throw', (type, value) => { + expect(() => decodeNumber(type, hexToBytes(value))).toThrow(AbiError); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/string.test.ts b/packages/web3-eth-abi/test/unit/coders/base/string.test.ts new file mode 100644 index 00000000000..22aa0f78844 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/string.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiError } from 'web3-errors'; +import { hexToBytes } from 'web3-utils'; +import { decodeString, encodeString } from '../../../../src/coders/base/string'; +import { + invalidStringEncoderData, + validStringDecoderData, + validStringEncoderData, +} from '../../../fixtures/coders/base/string'; + +describe('abi - coder - base - string', () => { + describe('encode', () => { + it.each(validStringEncoderData)( + 'string type with value %s to result in %s', + (value, expected) => { + const result = encodeString({ type: 'string', name: '' }, value); + expect(Buffer.from(result.encoded).toString('hex')).toEqual(expected); + expect(result.dynamic).toBeTruthy(); + }, + ); + it.each(invalidStringEncoderData)('string type with value %s to error', value => { + expect(() => encodeString({ type: 'string', name: '' }, value)).toThrow(AbiError); + }); + }); + + describe('decode', () => { + it.each(validStringDecoderData)( + 'string type with value %s to result in %s', + (value, expected, remaining) => { + const result = decodeString({ type: 'string', name: '' }, hexToBytes(value)); + expect(result.result).toEqual(expected); + expect(result.encoded).toEqual(hexToBytes(remaining)); + }, + ); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/coders/base/tuple.test.ts b/packages/web3-eth-abi/test/unit/coders/base/tuple.test.ts new file mode 100644 index 00000000000..a59c5d71204 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/coders/base/tuple.test.ts @@ -0,0 +1,44 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { hexToBytes } from 'web3-utils'; +import { decodeTuple, encodeTuple } from '../../../../src/coders/base/tuple'; +import { validDecoderData, validEncoderData } from '../../../fixtures/coders/base/tuple'; + +describe('abi - coder - base - tuple', () => { + describe('encode', () => { + it.each(validEncoderData)('tuple type with value %s to result in %s', value => { + const result = encodeTuple( + { type: 'tuple', name: '', components: value.components }, + value.values, + ); + expect(Buffer.from(result.encoded).toString('hex')).toEqual(value.result); + expect(result.dynamic).toEqual(value.dynamic); + }); + }); + + describe('decode', () => { + it.each(validDecoderData)('tuple type with value %s to result in %s', value => { + const result = decodeTuple( + { type: 'tuple', name: '', components: value.components }, + hexToBytes(value.bytes), + ); + expect(result.result).toEqual(value.result); + expect(result.encoded).toEqual(hexToBytes(value.remaining)); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/constructor.test.ts b/packages/web3-eth-abi/test/unit/constructor.test.ts new file mode 100644 index 00000000000..6116d16ef46 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/constructor.test.ts @@ -0,0 +1,34 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +describe('constructs a PLACEHOLDER instance with expected properties', () => { + // let providerOptions: ProviderOptions + + beforeEach(() => { + // providerOptions = { + // providerUrl: 'http://127.0.0.1:8545' + // } + }); + + it('should construct with expected properties', () => { + // const web3ProviderBase = new Web3ProviderBase(providerOptions) + // expect(web3ProviderBase).toMatchObject({ + // _providerUrl: providerOptions.providerUrl + // }) + expect(true).toBeTruthy(); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/decodeContractErrorData.test.ts b/packages/web3-eth-abi/test/unit/decodeContractErrorData.test.ts new file mode 100644 index 00000000000..3f6a624ef22 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/decodeContractErrorData.test.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Eip838ExecutionError } from 'web3-errors'; +import { decodeContractErrorData } from '../../src/decode_contract_error_data'; + +import { validDecodeContractErrorData, invalidDecodeContractErrorData } from '../fixtures/data'; + +describe('decodeContractErrorData', () => { + describe('valid data', () => { + it.each(validDecodeContractErrorData)( + '%#: should pass for valid values: %j', + ({ input: [abi, errorData], output }) => { + const err = new Eip838ExecutionError(errorData); + + decodeContractErrorData(abi, err); + + expect(err.errorName).toEqual(output.errorName); + expect(err.errorSignature).toEqual(output.errorSignature); + expect(err.errorArgs?.message).toEqual(output.errorArgs?.message); + expect(Number(err.errorArgs?.code)).toEqual(output.errorArgs?.code); + expect(err.cause?.code).toEqual(output.cause?.code); + }, + ); + }); + + describe('invalid data', () => { + it.each(invalidDecodeContractErrorData)( + '%#: should throw for invalid values: %j', + ({ input: [abi, errorData] }) => { + // mock console.error + const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => 'error'); + const err = new Eip838ExecutionError(errorData); + decodeContractErrorData(abi, err); + expect(consoleSpy).toHaveBeenCalled(); + }, + ); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/encodeDecodeParams.test.ts b/packages/web3-eth-abi/test/unit/encodeDecodeParams.test.ts new file mode 100644 index 00000000000..184ed0fcf4a --- /dev/null +++ b/packages/web3-eth-abi/test/unit/encodeDecodeParams.test.ts @@ -0,0 +1,50 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiInput } from 'web3-types'; +import { decodeParameters, encodeParameters, inferTypesAndEncodeParameters } from '../../src'; +import testsData from '../fixtures/abitestsdata.json'; +import { deepEqualTolerateBigInt, removeKey } from './test_utils'; + +describe('encodeParameters decodeParameters tests should pass', () => { + it.each(testsData)(`unit test of encodeParameters - $name`, encoderTestObj => { + const encodedResult = encodeParameters([encoderTestObj.type], [encoderTestObj.value]); + expect(encodedResult).toEqual(encoderTestObj.encoded); + }); + + it.each(testsData)(`unit test of encodeParameters - $name`, encoderTestObj => { + // skip for types that are not supported by infer-types + // the unsupported types are uint(other than 256), int(other than 256), bytes(that has a number like bytes1 or bytes2), and arrays + if (/((? { + const decodedResult = decodeParameters( + [decoderTestObj.type] as AbiInput[], + decoderTestObj.encoded, + ); + + removeKey(decodedResult[0], '__length__'); + + expect(deepEqualTolerateBigInt(decodedResult[0], decoderTestObj.value)).toBeTruthy(); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/get_encoded_eip712_data.test.ts b/packages/web3-eth-abi/test/unit/get_encoded_eip712_data.test.ts new file mode 100644 index 00000000000..f20d725010f --- /dev/null +++ b/packages/web3-eth-abi/test/unit/get_encoded_eip712_data.test.ts @@ -0,0 +1,29 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { getEncodedEip712Data } from '../../src/index'; +import { erroneousTestData, testData } from '../fixtures/get_encoded_eip712_data'; + +describe('getEncodedEip712Data', () => { + it.each(testData)('%s', (_, typedData, hashEncodedData, expectedResponse) => { + const encodedMessage = getEncodedEip712Data(typedData, hashEncodedData); + expect(encodedMessage).toBe(expectedResponse); + }); + + it.each(erroneousTestData)('%s', (_, typedData, hashEncodedData, expectedError) => { + expect(() => getEncodedEip712Data(typedData, hashEncodedData)).toThrow(expectedError); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/jest.config.js b/packages/web3-eth-abi/test/unit/jest.config.js new file mode 100644 index 00000000000..6acd2aba2ee --- /dev/null +++ b/packages/web3-eth-abi/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-eth-abi-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-eth-abi/test/unit/test_utils.ts b/packages/web3-eth-abi/test/unit/test_utils.ts new file mode 100644 index 00000000000..6f78ae7df9e --- /dev/null +++ b/packages/web3-eth-abi/test/unit/test_utils.ts @@ -0,0 +1,87 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const removeKey = (obj: any, key: any) => { + if (Array.isArray(obj)) { + for (const val of obj) { + removeKey(val, key); + } + } else if (typeof obj === 'object' && obj !== undefined) { + // eslint-disable-next-line no-restricted-syntax + for (const prop in obj) { + if (prop === key) { + // eslint-disable-next-line no-param-reassign + delete obj[prop]; + } else { + removeKey(obj[prop], key); + } + } + } +}; + +export const deepEqualTolerateBigInt = (obj1: any, obj2: any) => { + if (typeof obj1 === 'bigint') + // eslint-disable-next-line no-param-reassign + obj1 = obj1.toString(); + + if (typeof obj2 === 'bigint') + // eslint-disable-next-line no-param-reassign + obj2 = obj2.toString(); + + if (typeof obj1 !== typeof obj2) { + return false; + } + + if (Array.isArray(obj1) && Array.isArray(obj2)) { + if (obj1.length !== obj2.length) { + return false; + } + + /* eslint no-plusplus: ["error", { "allowForLoopAfterthoughts": true }] */ + for (let i = 0; i < obj1.length; i++) { + if (!deepEqualTolerateBigInt(obj1[i], obj2[i])) { + return false; + } + } + + return true; + } + + if ( + typeof obj1 === 'object' && + typeof obj2 === 'object' && + obj1 !== undefined && + obj2 !== undefined + ) { + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + + if (keys1.length !== keys2.length) { + return false; + } + + for (const key of keys1) { + if (!deepEqualTolerateBigInt(obj1[key], obj2[key])) { + return false; + } + } + + return true; + } + + return obj1 === obj2; +}; diff --git a/packages/web3-eth-abi/test/unit/types.test.ts b/packages/web3-eth-abi/test/unit/types.test.ts new file mode 100644 index 00000000000..7bcd3921258 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/types.test.ts @@ -0,0 +1,262 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + Address, + ContractMethodOutputParameters, + Bytes, + MatchPrimitiveType, + Numbers, +} from 'web3-types'; +import { expectTypeOf, typecheck } from '@humeris/espresso-shot'; + +describe('types', () => { + describe('primitive types', () => { + describe('bool', () => { + typecheck('should extend the boolean type', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the boolean type array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the boolean type fixed array', () => + expectTypeOf>().toExtend< + [boolean, boolean, boolean] + >(), + ); + }); + + describe('string', () => { + typecheck('should extend the string type', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the string type array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the string type fixed array', () => + expectTypeOf>().toExtend< + [string, string, string] + >(), + ); + }); + + describe('address', () => { + typecheck('should extend correct type', () => + expectTypeOf>().toExtend

(), + ); + + typecheck('should extend the correct type array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the correct type fixed array', () => + expectTypeOf>().toExtend< + [Address, Address, Address] + >(), + ); + }); + + describe('bytes', () => { + typecheck('should extend correct type', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend correct type with size', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the correct type array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the correct type fixed array', () => + expectTypeOf>().toExtend< + [Bytes, Bytes, Bytes] + >(), + ); + }); + + describe('uint', () => { + typecheck('should extend correct type', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend correct type with size', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend correct type with size array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the correct type array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the correct type fixed array', () => + expectTypeOf>().toExtend< + [Numbers, Numbers, Numbers] + >(), + ); + }); + + describe('int', () => { + typecheck('should extend correct type', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend correct type with size', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend correct type with size array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the correct type array', () => + expectTypeOf>().toExtend(), + ); + + typecheck('should extend the correct type fixed array', () => + expectTypeOf>().toExtend< + [Numbers, Numbers, Numbers] + >(), + ); + }); + + describe('tuple', () => { + typecheck('should extend correct type', () => + expectTypeOf< + MatchPrimitiveType<'tuple', [{ type: 'uint'; name: 'a' }]> + >().toExtend<{ a: Numbers }>(), + ); + + typecheck('should extend correct type with size array', () => + expectTypeOf< + MatchPrimitiveType<'tuple[3]', [{ type: 'uint'; name: 'a' }]> + >().toExtend<[{ a: Numbers }, { a: Numbers }, { a: Numbers }]>(), + ); + + typecheck('should extend the correct type array', () => + expectTypeOf< + MatchPrimitiveType<'tuple[]', [{ type: 'uint'; name: 'a' }]> + >().toExtend<{ a: Numbers }[]>(), + ); + }); + }); + + describe('contract', () => { + describe('outputs', () => { + typecheck('empty outputs should result in []', () => + expectTypeOf>().toExtend(), + ); + + typecheck('single outputs should result in that type', () => { + const abi = [ + { + name: '', + type: 'string', + }, + ] as const; + return expectTypeOf< + ContractMethodOutputParameters + >().toExtend(); + }); + + typecheck('multiple outputs should result in object indexed by numbers', () => { + const abi = [ + { + name: '', + type: 'string', + }, + { + name: '', + type: 'int', + }, + ] as const; + + return expectTypeOf< + ContractMethodOutputParameters[0] + >().toExtend(); + }); + + typecheck('multiple outputs should result in object indexed by numbers', () => { + const abi = [ + { + name: '', + type: 'string', + }, + { + name: '', + type: 'int', + }, + ] as const; + return expectTypeOf< + ContractMethodOutputParameters[1] + >().toExtend(); + }); + + typecheck('multiple outputs should result in object indexed by name', () => { + const abi = [ + { + name: 'first', + type: 'string', + }, + { + name: 'second', + type: 'int', + }, + ] as const; + return expectTypeOf< + ContractMethodOutputParameters['first'] + >().toExtend(); + }); + + typecheck('multiple outputs should result in object indexed by name', () => { + const abi = [ + { + name: 'first', + type: 'string', + }, + { + name: 'second', + type: 'int', + }, + ] as const; + return expectTypeOf< + ContractMethodOutputParameters['second'] + >().toExtend(); + }); + + typecheck('single output should result as in exactly one type', () => { + const abi = [ + { + name: 'first', + type: 'string', + }, + ] as const; + return expectTypeOf< + ContractMethodOutputParameters + >().toExtend(); + }); + }); + }); +}); diff --git a/packages/web3-eth-abi/test/unit/utils.test.ts b/packages/web3-eth-abi/test/unit/utils.test.ts new file mode 100644 index 00000000000..7428d3bcfd6 --- /dev/null +++ b/packages/web3-eth-abi/test/unit/utils.test.ts @@ -0,0 +1,136 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + jsonInterfaceMethodToString, + isAbiConstructorFragment, + flattenTypes, + mapTypes, + formatParam, + isOddHexstring, + formatOddHexstrings, + isAbiFragment, +} from '../../src/utils'; +import { + jsonInterfaceInvalidData, + jsonInterfaceValidData, + validIsAbiConstructorFragment, + invalidIsAbiConstructorFragment, + mapTypesValidData, + formatParamValidData, +} from '../fixtures/data'; + +describe('utils', () => { + describe('jsonInterfaceMethodToString', () => { + describe('valid cases', () => { + it.each(jsonInterfaceValidData)('%s', (input, output) => { + expect(jsonInterfaceMethodToString(input)).toEqual(output); + }); + }); + describe('default cases', () => { + it('default json value', () => { + // @ts-expect-error invalid input + expect(jsonInterfaceMethodToString({})).toBe('()'); + }); + it('name value with brackets', () => { + expect( + jsonInterfaceMethodToString({ + name: '(test)', + type: 'function', + inputs: [], + }), + ).toBe('(test)'); + }); + }); + describe('invalid cases', () => { + // TODO: To be done after `sha3` is implemented + it.todo('should throw error for invalid cases'); + }); + }); + describe('mapTypes', () => { + describe('valid data', () => { + it.each(mapTypesValidData)('%s', (input, output) => { + expect(mapTypes(input)).toEqual(output); + }); + }); + }); + describe('formatParam', () => { + describe('default types', () => { + it.each(formatParamValidData)('%s', (input, output) => { + expect(formatParam(input[0], input[1])).toEqual(output); + }); + }); + }); + describe('isOddHexstring', () => { + it('not string param', () => { + expect(isOddHexstring('')).toBeFalsy(); + }); + }); + describe('isAbiFragment', () => { + it('nullish', () => { + expect(isAbiFragment(undefined)).toBeFalsy(); + }); + }); + describe('formatOddHexstrings', () => { + it('not string param', () => { + expect(formatOddHexstrings('')).toBeFalsy(); + }); + }); + describe('flattenTypes', () => { + it('default types with include tuples', () => { + expect( + flattenTypes(true, [ + { + type: 'tuple', + name: 'test', + components: [ + { + name: 'test', + type: '[string,number]', + }, + ], + }, + ]), + ).toEqual(['tuple([string,number])']); + }); + }); + describe('jsonInterface', () => { + describe('valid cases', () => { + it.each(jsonInterfaceValidData)('%s', (input, output) => { + expect(jsonInterfaceMethodToString(input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(jsonInterfaceInvalidData)('%s', (input, output) => { + expect(() => jsonInterfaceMethodToString(input)).toThrow(output); + }); + }); + }); + describe('isAbiConstructorFragment', () => { + describe('valid cases', () => { + it.each(validIsAbiConstructorFragment)('%s', ({ input }) => { + expect(isAbiConstructorFragment(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidIsAbiConstructorFragment)('%s', ({ input }) => { + expect(isAbiConstructorFragment(input)).toBeFalsy(); + }); + }); + }); +}); diff --git a/packages/web3-eth-abi/tsconfig.cjs.json b/packages/web3-eth-abi/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-eth-abi/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-eth-abi/tsconfig.esm.json b/packages/web3-eth-abi/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-eth-abi/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-eth-abi/tsconfig.json b/packages/web3-eth-abi/tsconfig.json deleted file mode 100644 index 4f8705c68af..00000000000 --- a/packages/web3-eth-abi/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ], -} \ No newline at end of file diff --git a/packages/web3-eth-abi/tsconfig.types.json b/packages/web3-eth-abi/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-eth-abi/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-eth-abi/tsdoc.json b/packages/web3-eth-abi/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-eth-abi/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth-abi/types/index.d.ts b/packages/web3-eth-abi/types/index.d.ts deleted file mode 100644 index 4343b578967..00000000000 --- a/packages/web3-eth-abi/types/index.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -import { AbiInput, AbiItem } from 'web3-utils'; - -export class AbiCoder { - encodeFunctionSignature(functionName: string | AbiItem): string; - - encodeEventSignature(functionName: string | AbiItem): string; - - encodeParameter(type: any, parameter: any): string; - - encodeParameters(types: any[], paramaters: any[]): string; - - encodeFunctionCall(abiItem: AbiItem, params: string[]): string; - - decodeParameter(type: any, hex: string): { [key: string]: any }; - - decodeParameters(types: any[], hex: string): { [key: string]: any }; - - decodeLog( - inputs: AbiInput[], - hex: string, - topics: string[] - ): { [key: string]: string }; -} diff --git a/packages/web3-eth-abi/types/tests/abi-coder-test.ts b/packages/web3-eth-abi/types/tests/abi-coder-test.ts deleted file mode 100644 index 0ed89e58c0a..00000000000 --- a/packages/web3-eth-abi/types/tests/abi-coder-test.ts +++ /dev/null @@ -1,753 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file abi-coder-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import { AbiCoder } from 'web3-eth-abi'; - -const abiCoder = new AbiCoder(); - -// $ExpectType string -abiCoder.encodeFunctionSignature('myMethod(uint256,string)'); -// $ExpectType string -abiCoder.encodeFunctionSignature({ - name: 'myMethod', - type: 'function', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'string', - name: 'myString' - } - ] -}); - -// $ExpectError -abiCoder.encodeFunctionSignature(345); -// $ExpectError -abiCoder.encodeFunctionSignature({}); -// $ExpectError -abiCoder.encodeFunctionSignature(true); -// $ExpectError -abiCoder.encodeFunctionSignature(['string']); -// $ExpectError -abiCoder.encodeFunctionSignature([4]); -// $ExpectError -abiCoder.encodeFunctionSignature(null); -// $ExpectError -abiCoder.encodeFunctionSignature(undefined); -// $ExpectError -abiCoder.encodeFunctionSignature('myMethod(uint256,string)', { - name: 'myMethod' -}); - -// $ExpectType string -abiCoder.encodeEventSignature('myEvent(uint256,bytes32)'); -// $ExpectType string -abiCoder.encodeFunctionSignature({ - name: 'myEvent', - type: 'event', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'bytes32', - name: 'myBytes' - } - ] -}); - -// $ExpectError -abiCoder.encodeFunctionSignature(345); -// $ExpectError -abiCoder.encodeFunctionSignature({}); -// $ExpectError -abiCoder.encodeFunctionSignature(true); -// $ExpectError -abiCoder.encodeFunctionSignature(['string']); -// $ExpectError -abiCoder.encodeFunctionSignature([4]); -// $ExpectError -abiCoder.encodeFunctionSignature(null); -// $ExpectError -abiCoder.encodeFunctionSignature(undefined); -// $ExpectError -abiCoder.encodeFunctionSignature('myEvent(uint256,bytes32)', { - name: 'myEvent' -}); - -// $ExpectType string -abiCoder.encodeParameter('uint256', '2345675643'); -// $ExpectType string -abiCoder.encodeParameter('uint256', ['0xdf3234', '0xfdfd']); -// $ExpectType string -abiCoder.encodeParameter( - { - ParentStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256', - childStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256' - } - } - }, - { - propertyOne: 42, - propertyTwo: 56, - childStruct: { - propertyOne: 45, - propertyTwo: 78 - } - } -); - -// $ExpectType string -abiCoder.encodeParameters(['uint256', 'string'], ['2345675643', 'Hello!%']); -// $ExpectType string -abiCoder.encodeParameters( - ['uint8[]', 'bytes32'], - [['34', '434'], '0x324567fff'] -); -// $ExpectType string -abiCoder.encodeParameters( - [ - 'uint8[]', - { - ParentStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256', - ChildStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256' - } - } - } - ], - [ - ['34', '434'], - { - propertyOne: '42', - propertyTwo: '56', - ChildStruct: { - propertyOne: '45', - propertyTwo: '78' - } - } - ] -); - -// $ExpectError -abiCoder.encodeParameters(345, ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeParameters(true, ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeParameters(null, ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeParameters(undefined, ['2345675643', 'Hello!%']); - -// $ExpectType string -abiCoder.encodeFunctionCall( - { - name: 'myMethod', - type: 'function', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'string', - name: 'myString' - } - ] - }, - ['2345675643', 'Hello!%'] -); - -// $ExpectError -abiCoder.encodeFunctionCall([345], ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeFunctionCall(['string'], ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeFunctionCall(345, ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeFunctionCall(true, ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeFunctionCall(null, ['2345675643', 'Hello!%']); -// $ExpectError -abiCoder.encodeFunctionCall(undefined, ['2345675643', 'Hello!%']); - -abiCoder.encodeFunctionCall( - { - name: 'myMethod', - type: 'function', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'string', - name: 'myString' - } - ] - }, - // $ExpectError - 345 -); - -abiCoder.encodeFunctionCall( - { - name: 'myMethod', - type: 'function', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'string', - name: 'myString' - } - ] - }, - // $ExpectError - [345] -); - -abiCoder.encodeFunctionCall( - { - name: 'myMethod', - type: 'function', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'string', - name: 'myString' - } - ] - }, - // $ExpectError - true -); - -abiCoder.encodeFunctionCall( - { - name: 'myMethod', - type: 'function', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'string', - name: 'myString' - } - ] - }, - // $ExpectError - null -); - -abiCoder.encodeFunctionCall( - { - name: 'myMethod', - type: 'function', - inputs: [ - { - type: 'uint256', - name: 'myNumber' - }, - { - type: 'string', - name: 'myString' - } - ] - }, - // $ExpectError - undefined -); - -// $ExpectType { [key: string]: any; } -abiCoder.decodeParameter( - 'uint256', - '0x0000000000000000000000000000000000000000000000000000000000000010' -); -// $ExpectType { [key: string]: any; } -abiCoder.decodeParameter( - 'uint256', - '0x0000000000000000000000000000000000000000000000000000000000000010' -); -// $ExpectType { [key: string]: any; } -abiCoder.decodeParameter( - 'uint256', - '0x0000000000000000000000000000000000000000000000000000000000000010' -); -// $ExpectType { [key: string]: any; } -abiCoder.decodeParameter( - { - ParentStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256', - childStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256' - } - } - }, - `0x000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000 - 00000000000038000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000 - 0000000000000000000000004e` -); - -// $ExpectError -abiCoder.decodeParameter('uint256', [345]); -// $ExpectError -abiCoder.decodeParameter('uint256', ['string']); -// $ExpectError -abiCoder.decodeParameter('uint256', 345); -// $ExpectError -abiCoder.decodeParameter('uint256', true); -// $ExpectError -abiCoder.decodeParameter('uint256', null); -// $ExpectError -abiCoder.decodeParameter('uint256', undefined); - -// $ExpectType { [key: string]: any; } -abiCoder.decodeParameters( - ['string', 'uint256'], - '0x0000000000000000000000000000000000000000000000000000000000000010' -); -// $ExpectType { [key: string]: any; } -abiCoder.decodeParameters( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber' - } - ], - '0x0000000000000000000000000000000000000000000000000000000000000010' -); -// $ExpectType { [key: string]: any; } -abiCoder.decodeParameters( - [ - 'uint8[]', - { - ParentStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256', - childStruct: { - propertyOne: 'uint256', - propertyTwo: 'uint256' - } - } - } - ], - '0x0000000000000000000000000000000000000000000000000000000000000010' -); - -abiCoder.decodeParameters( - // $ExpectError - 'uint256', - '0x0000000000000000000000000000000000000000000000000000000000000010' -); - -abiCoder.decodeParameters( - // $ExpectError - 453, - '0x0000000000000000000000000000000000000000000000000000000000000010' -); - -abiCoder.decodeParameters( - // $ExpectError - true, - '0x0000000000000000000000000000000000000000000000000000000000000010' -); - -abiCoder.decodeParameters( - // $ExpectError - null, - '0x0000000000000000000000000000000000000000000000000000000000000010' -); - -abiCoder.decodeParameters( - // $ExpectError - undefined, - '0x0000000000000000000000000000000000000000000000000000000000000010' -); -// $ExpectError -abiCoder.decodeParameters(['string', 'uint256'], 345); -// $ExpectError -abiCoder.decodeParameters(['string', 'uint256'], ['string']); -// $ExpectError -abiCoder.decodeParameters(['string', 'uint256'], [345]); -// $ExpectError -abiCoder.decodeParameters(['string', 'uint256'], true); -// $ExpectError -abiCoder.decodeParameters(['string', 'uint256'], null); -// $ExpectError -abiCoder.decodeParameters(['string', 'uint256'], undefined); - -// $ExpectType { [key: string]: string; } -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - // $ExpectError - ['string'], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - // $ExpectError - [345], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - // $ExpectError - true, - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - // $ExpectError - [undefined], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - // $ExpectError - [null], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - // $ExpectError - 345, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - // $ExpectError - [345], - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - // $ExpectError - ['string'], - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - // $ExpectError - true, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - // $ExpectError - null, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - // $ExpectError - undefined, - [ - '0x000000000000000000000000000000000000000000000000000000000000f310', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - // $ExpectError - 345 -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - // $ExpectError - [345] -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - // $ExpectError - null -); - -abiCoder.decodeLog( - [ - { - type: 'string', - name: 'myString' - }, - { - type: 'uint256', - name: 'myNumber', - indexed: true - }, - { - type: 'uint8', - name: 'mySmallNumber', - indexed: true - } - ], - `0x0000000000000000000000000000000000000000000000000000000000000020000000000000000 - 000000000000000000000000000000000000000000000000748656c6c6f2521000000000000000000 - 00000000000000000000000000000000`, - // $ExpectError - undefined -); diff --git a/packages/web3-eth-abi/types/tsconfig.json b/packages/web3-eth-abi/types/tsconfig.json deleted file mode 100644 index 4e08e726c5b..00000000000 --- a/packages/web3-eth-abi/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth-abi": ["."] - } - } -} diff --git a/packages/web3-eth-abi/types/tslint.json b/packages/web3-eth-abi/types/tslint.json deleted file mode 100644 index 2b3d7bd5fb1..00000000000 --- a/packages/web3-eth-abi/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "typedef-whitespace": false - } -} diff --git a/packages/web3-eth-accounts/.eslintignore b/packages/web3-eth-accounts/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-eth-accounts/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-accounts/.eslintrc.js b/packages/web3-eth-accounts/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-eth-accounts/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-accounts/.gitignore b/packages/web3-eth-accounts/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-eth-accounts/.npmignore b/packages/web3-eth-accounts/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-eth-accounts/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-accounts/.prettierignore b/packages/web3-eth-accounts/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-eth-accounts/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-accounts/.prettierrc.json b/packages/web3-eth-accounts/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-eth-accounts/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-eth-accounts/CHANGELOG.md b/packages/web3-eth-accounts/CHANGELOG.md new file mode 100644 index 00000000000..05682b29954 --- /dev/null +++ b/packages/web3-eth-accounts/CHANGELOG.md @@ -0,0 +1,160 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Changed + +- `signTransaction` and `privateKeyToAccount` will throw `TransactionSigningError` instead of `SignerError` now (#5462) + +## [4.0.1-alpha.2] + +### Removed + +- These types were moved to `web3-types` package: Cipher, CipherOptions, ScryptParams, PBKDF2SHA256Params, KeyStore (#5581) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Changed + +- Updated dependencies (#5912) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +### Changed + +- Moved @ethereumjs/tx, @ethereumjs/common code to our source code (#5963) +- The method `signTransaction` returned by `privateKeyToAccount` is now accepting the type `Transaction` for its argument. (#5993) + +## [4.0.1-rc.2] + +### Fixed + +- Fixed ESM import bugs reported in (#6032) and (#6034) + +### Changed + +- Replaced `Buffer` for `Uint8Array` (#6004) +- The methods `recover`, `encrypt`, `privateKeyToAddress` does not support type `Buffer` but supports type `Uint8Array` (#6004) +- The method `parseAndValidatePrivateKey` returns a type `Uint8Array` instead of type `Buffer` (#6004) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Fixed + +- Fixed "The `r` and `s` returned by `signTransaction` to does not always consist of 64 characters #6207" (#6216) + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Fixed + +- Fixed "The `r` and `s` returned by `sign` to does not always consist of 64 characters" (#6411) + + +## [4.1.0] + +### Added + +- Added public function `privateKeyToPublicKey` +- Added exporting `BaseTransaction` from the package (#6493) +- Added exporting `txUtils` from the package (#6493) + +### Fixed + +- Fixed `recover` function, `v` will be normalized to value 0,1 (#6344) + +## [4.1.1] + +### Fixed + +- Send Transaction config used to be ignored if the passed `common` did not have a `copy()` and the `chainId` was not provided (#6663) +- Fixed an issue with detecting Uint8Array (#6486) + +## [Unreleased] + diff --git a/packages/web3-eth-accounts/README.md b/packages/web3-eth-accounts/README.md index 6abe8e4cfa1..3ca18c2a460 100644 --- a/packages/web3-eth-accounts/README.md +++ b/packages/web3-eth-accounts/README.md @@ -1,46 +1,59 @@ -# web3-eth-accounts +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Web3 Eth Accounts -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This is the accounts package used in the `web3-eth` package. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-eth-accounts` contains functionality for managing Ethereum accounts and signing. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-eth-accounts) or using [Yarn](https://yarnpkg.com/package/web3-eth-accounts) + +### Using NPM ```bash npm install web3-eth-accounts ``` -## Usage +### Using Yarn -```js -const Web3EthAccounts = require('web3-eth-accounts'); - -const account = new Web3EthAccounts('ws://localhost:8546'); -account.create(); -> { - address: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', - privateKey: '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - signTransaction: function(tx){...}, - sign: function(data){...}, - encrypt: function(password){...} -} +```bash +yarn add web3-eth-accounts ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-eth-accounts.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-eth-accounts +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-accounts%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-eth-accounts -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-eth-accounts -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-eth-accounts -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-eth-accounts -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-eth-accounts +[downloads-image]: https://img.shields.io/npm/dm/web3-eth-accounts?label=npm%20downloads diff --git a/packages/web3-eth-accounts/assets/logo/web3js.ai b/packages/web3-eth-accounts/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth-accounts/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth-accounts/assets/logo/web3js.jpg b/packages/web3-eth-accounts/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth-accounts/assets/logo/web3js.jpg differ diff --git a/packages/web3-eth-accounts/assets/logo/web3js.svg b/packages/web3-eth-accounts/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth-accounts/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth-accounts/cypress b/packages/web3-eth-accounts/cypress new file mode 120000 index 00000000000..4a671a7beac --- /dev/null +++ b/packages/web3-eth-accounts/cypress @@ -0,0 +1 @@ +../../templates/cypress \ No newline at end of file diff --git a/packages/web3-eth-accounts/cypress.config.js b/packages/web3-eth-accounts/cypress.config.js new file mode 120000 index 00000000000..8cd9ba29af0 --- /dev/null +++ b/packages/web3-eth-accounts/cypress.config.js @@ -0,0 +1 @@ +../../templates/cypress.config.js \ No newline at end of file diff --git a/packages/web3-eth-accounts/package-lock.json b/packages/web3-eth-accounts/package-lock.json deleted file mode 100644 index 0f13064c5d8..00000000000 --- a/packages/web3-eth-accounts/package-lock.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "name": "web3-eth-accounts", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "ethereumjs-common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", - "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==" - }, - "ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "requires": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "ethereumjs-util": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", - "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^2.0.0", - "rlp": "^2.2.3", - "secp256k1": "^3.0.1" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "keccak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.1.0.tgz", - "integrity": "sha512-m1wbJRTo+gWbctZWay9i26v5fFnYkOn7D5PCxJ3fZUGUEb49dE1Pm4BREUYCt/aoO6di7jeoGmhvqN9Nzylm3Q==", - "requires": { - "bindings": "^1.5.0", - "inherits": "^2.0.4", - "nan": "^2.14.0", - "safe-buffer": "^5.2.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", - "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", - "requires": { - "bn.js": "^4.11.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "secp256k1": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", - "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "requires": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.2", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - } - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-eth-accounts/package.json b/packages/web3-eth-accounts/package.json index b907dace695..1906d06b599 100644 --- a/packages/web3-eth-accounts/package.json +++ b/packages/web3-eth-accounts/package.json @@ -1,33 +1,69 @@ { - "name": "web3-eth-accounts", - "version": "1.3.0", - "description": "Web3 module to generate Ethereum accounts and sign data and transactions.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth-accounts", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.8", - "ethereumjs-common": "^1.3.2", - "ethereumjs-tx": "^2.1.1", - "scrypt-js": "^3.0.1", - "underscore": "1.9.1", - "uuid": "3.3.2", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-eth-accounts", + "version": "4.1.1", + "description": "Package for managing Ethereum accounts and signing", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "jest-when": "^3.5.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4", + "web3-providers-ipc": "^4.0.7" + }, + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "crc-32": "^1.2.2", + "ethereum-cryptography": "^2.0.0", + "web3-errors": "^1.1.4", + "web3-types": "^1.3.1", + "web3-utils": "^4.1.1", + "web3-validator": "^2.0.4" + } } diff --git a/packages/web3-eth-accounts/src/account.ts b/packages/web3-eth-accounts/src/account.ts new file mode 100644 index 00000000000..3bb49217192 --- /dev/null +++ b/packages/web3-eth-accounts/src/account.ts @@ -0,0 +1,817 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The web3 accounts package contains functions to generate Ethereum accounts and sign transactions & data. + * + * For using accounts functions, first install Web3 package using `npm i web3` or `yarn add web3` based on your package manager usage. + * After that, Accounts functions will be available as mentioned in following snippet. + * ```ts + * import {Web3} from 'web3'; + * + * const web3 = new Web3(); + * const account = web3.eth.accounts.create(); + * const result = web3.eth.accounts.hashMessage("Test Message"); + * + * ``` + * + * For using individual package install `web3-eth-accounts` package using `npm i web3-eth-accounts` or `yarn add web3-eth-accounts` and only import required functions. + * This is more efficient approach for building lightweight applications. + * ```ts + * import {create,hashMessage} from 'web3-eth-accounts'; + * + * const account = create(); + * const result = hashMessage("Test Message"); + * + * ``` + * @module Accounts + * + */ + +import { + decrypt as createDecipheriv, + encrypt as createCipheriv, +} from 'ethereum-cryptography/aes.js'; +import { pbkdf2Sync } from 'ethereum-cryptography/pbkdf2.js'; +import { scryptSync } from 'ethereum-cryptography/scrypt.js'; +import { + InvalidKdfError, + InvalidPasswordError, + InvalidPrivateKeyError, + InvalidSignatureError, + IVLengthError, + KeyDerivationError, + KeyStoreVersionError, + PBKDF2IterationsError, + PrivateKeyLengthError, + TransactionSigningError, + UndefinedRawTransactionError, +} from 'web3-errors'; +import { + Address, + Bytes, + CipherOptions, + HexString, + KeyStore, + PBKDF2SHA256Params, + ScryptParams, + Transaction, +} from 'web3-types'; +import { + bytesToUint8Array, + bytesToHex, + fromUtf8, + hexToBytes, + isUint8Array, + numberToHex, + randomBytes, + sha3Raw, + toChecksumAddress, + uint8ArrayConcat, + utf8ToHex, + uuidV4, +} from 'web3-utils'; + +import { isHexStrict, isNullish, isString, validator } from 'web3-validator'; +import { secp256k1 } from './tx/constants.js'; +import { keyStoreSchema } from './schemas.js'; +import { TransactionFactory } from './tx/transactionFactory.js'; +import type { + SignatureObject, + SignTransactionResult, + TypedTransaction, + Web3Account, + SignResult, +} from './types.js'; + + +/** + * Get the private key Uint8Array after the validation. + * Note: This function is not exported through main web3 package, so for using it directly import from accounts package. + * @param data - Private key + * @param ignoreLength - Optional, ignore length check during validation + * @returns The Uint8Array private key + * + * ```ts + * parseAndValidatePrivateKey("0x08c673022000ece7964ea4db2d9369c50442b2869cbd8fc21baaca59e18f642c") + * + * > Uint8Array(32) [ + * 186, 26, 143, 168, 235, 179, 90, 75, + * 101, 63, 84, 221, 152, 150, 30, 203, + * 8, 113, 94, 226, 53, 213, 216, 5, + * 194, 159, 17, 53, 219, 97, 121, 248 + * ] + * + * ``` + */ +export const parseAndValidatePrivateKey = (data: Bytes, ignoreLength?: boolean): Uint8Array => { + let privateKeyUint8Array: Uint8Array; + + // To avoid the case of 1 character less in a hex string which is prefixed with '0' by using 'bytesToUint8Array' + if (!ignoreLength && typeof data === 'string' && isHexStrict(data) && data.length !== 66) { + throw new PrivateKeyLengthError(); + } + + try { + privateKeyUint8Array = isUint8Array(data) ? (data ) : bytesToUint8Array(data); + } catch { + throw new InvalidPrivateKeyError(); + } + + if (!ignoreLength && privateKeyUint8Array.byteLength !== 32) { + throw new PrivateKeyLengthError(); + } + + return privateKeyUint8Array; +}; + +/** + * + * Hashes the given message. The data will be `UTF-8 HEX` decoded and enveloped as follows: + * `"\x19Ethereum Signed Message:\n" + message.length + message` and hashed using keccak256. + * + * @param message - A message to hash, if its HEX it will be UTF8 decoded. + * @returns The hashed message + * + * ```ts + * web3.eth.accounts.hashMessage("Hello world") + * + * > "0x8144a6fa26be252b86456491fbcd43c1de7e022241845ffea1c3df066f7cfede" + * + * web3.eth.accounts.hashMessage(web3.utils.utf8ToHex("Hello world")) // Will be hex decoded in hashMessage + * + * > "0x8144a6fa26be252b86456491fbcd43c1de7e022241845ffea1c3df066f7cfede" + * ``` + */ +export const hashMessage = (message: string): string => { + const messageHex = isHexStrict(message) ? message : utf8ToHex(message); + + const messageBytes = hexToBytes(messageHex); + + const preamble = hexToBytes( + fromUtf8(`\x19Ethereum Signed Message:\n${messageBytes.byteLength}`), + ); + + const ethMessage = uint8ArrayConcat(preamble, messageBytes); + + return sha3Raw(ethMessage); // using keccak in web3-utils.sha3Raw instead of SHA3 (NIST Standard) as both are different +}; + +/** + * Signs arbitrary data with a given private key. + * :::info + * The value passed as the data parameter will be UTF-8 HEX decoded and wrapped as follows: "\\x19Ethereum Signed Message:\\n" + message.length + message + * ::: + + * @param data - The data to sign + * @param privateKey - The 32 byte private key to sign with + * @returns The signature Object containing the message, messageHash, signature r, s, v + * + * ```ts + * web3.eth.accounts.sign('Some data', '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318') + * > { + * message: 'Some data', + * messageHash: '0x1da44b586eb0729ff70a73c326926f6ed5a25f5b056e7f47fbc6e58d86871655', + * v: '0x1c', + * r: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd', + * s: '0x6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a029', + * signature: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c' + * } + * ``` + */ +export const sign = (data: string, privateKey: Bytes): SignResult => { + const privateKeyUint8Array = parseAndValidatePrivateKey(privateKey); + + const hash = hashMessage(data); + + const signature = secp256k1.sign(hash.substring(2), privateKeyUint8Array); + const signatureBytes = signature.toCompactRawBytes(); + const r = signature.r.toString(16).padStart(64, '0'); + const s = signature.s.toString(16).padStart(64, '0'); + const v = signature.recovery! + 27; + + return { + message: data, + messageHash: hash, + v: numberToHex(v), + r: `0x${r}`, + s: `0x${s}`, + signature: `${bytesToHex(signatureBytes)}${v.toString(16)}`, + }; +}; + +/** + * Signs an Ethereum transaction with a given private key. + * + * @param transaction - The transaction, must be a legacy, EIP2930 or EIP 1559 transaction type + * @param privateKey - The private key to import. This is 32 bytes of random data. + * @returns A signTransactionResult object that contains message hash, r, s, v, transaction hash and raw transaction. + * + * This function is not stateful here. We need network access to get the account `nonce` and `chainId` to sign the transaction. + * This function will rely on user to provide the full transaction to be signed. If you want to sign a partial transaction object + * Use {@link Web3.eth.accounts.sign} instead. + * + * Signing a legacy transaction + * ```ts + * import {signTransaction, Transaction} from 'web3-eth-accounts'; + * + * signTransaction(new Transaction({ + * to: '0x118C2E5F57FD62C2B5b46a5ae9216F4FF4011a07', + * value: '0x186A0', + * gasLimit: '0x520812', + * gasPrice: '0x09184e72a000', + * data: '', + * chainId: 1, + * nonce: 0 }), + * '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318') + * + * > { + * messageHash: '0x28b7b75f7ba48d588a902c1ff4d5d13cc0ca9ac0aaa39562368146923fb853bf', + * v: '0x25', + * r: '0x601b0017b0e20dd0eeda4b895fbc1a9e8968990953482214f880bae593e71b5', + * s: '0x690d984493560552e3ebdcc19a65b9c301ea9ddc82d3ab8cfde60485fd5722ce', + * rawTransaction: '0xf869808609184e72a0008352081294118c2e5f57fd62c2b5b46a5ae9216f4ff4011a07830186a08025a00601b0017b0e20dd0eeda4b895fbc1a9e8968990953482214f880bae593e71b5a0690d984493560552e3ebdcc19a65b9c301ea9ddc82d3ab8cfde60485fd5722ce', + * transactionHash: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' + * ``` + * + * Signing an eip 1559 transaction + * ```ts + * import {signTransaction, Transaction} from 'web3-eth-accounts'; + * + * signTransaction(new Transaction({ + * to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + * maxPriorityFeePerGas: '0x3B9ACA00', + * maxFeePerGas: '0xB2D05E00', + * gasLimit: '0x6A4012', + * value: '0x186A0', + * data: '', + * chainId: 1, + * nonce: 0}), + * "0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318") + * > { + * messageHash: '0x5744f24d5f0aff6c70487c8e85adf07d8564e50b08558788f00479611d7bae5f', + * v: '0x25', + * r: '0x78a5a6b2876c3985f90f82073d18d57ac299b608cc76a4ba697b8bb085048347', + * s: '0x9cfcb40cc7d505ed17ff2d3337b51b066648f10c6b7e746117de69b2eb6358d', + * rawTransaction: '0xf8638080836a401294f0109fc8df283027b6285cc889f5aa624eac1f55830186a08025a078a5a6b2876c3985f90f82073d18d57ac299b608cc76a4ba697b8bb085048347a009cfcb40cc7d505ed17ff2d3337b51b066648f10c6b7e746117de69b2eb6358d', + * transactionHash: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' + * } + * ``` + * + * Signing an eip 2930 transaction + * ```ts + * import {signTransaction, Transaction} from 'web3-eth-accounts'; + * + * signTransaction(new Transaction ({ + * chainId: 1, + * nonce: 0, + * gasPrice: '0x09184e72a000', + * gasLimit: '0x2710321', + * to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + * value: '0x186A0', + * data: '', + * accessList: [ + * { + * address: '0x0000000000000000000000000000000000000101', + * storageKeys: [ + * '0x0000000000000000000000000000000000000000000000000000000000000000', + * '0x00000000000000000000000000000000000000000000000000000000000060a7', + * ], + * }, + * ], + * }),"0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318") + * + * > { + * messageHash: '0xc55ea24bdb4c379550a7c9a6818ac39ca33e75bc78ddb862bd82c31cc1c7a073', + * v: '0x26', + * r: '0x27344e77871c8b2068bc998bf28e0b5f9920867a69c455b2ed0c1c150fec098e', + * s: '0x519f0130a1d662841d4a28082e9c9bb0a15e0e59bb46cfc39a52f0e285dec6b9', + * rawTransaction: '0xf86a808609184e72a000840271032194f0109fc8df283027b6285cc889f5aa624eac1f55830186a08026a027344e77871c8b2068bc998bf28e0b5f9920867a69c455b2ed0c1c150fec098ea0519f0130a1d662841d4a28082e9c9bb0a15e0e59bb46cfc39a52f0e285dec6b9', + * transactionHash: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' + * } + * ``` + */ +export const signTransaction = async ( + transaction: TypedTransaction, + privateKey: HexString, + // To make it compatible with rest of the API, have to keep it async + // eslint-disable-next-line @typescript-eslint/require-await +): Promise => { + const signedTx = transaction.sign(hexToBytes(privateKey)); + if (isNullish(signedTx.v) || isNullish(signedTx.r) || isNullish(signedTx.s)) + throw new TransactionSigningError('Signer Error'); + + const validationErrors = signedTx.validate(true); + + if (validationErrors.length > 0) { + let errorString = 'Signer Error '; + for (const validationError of validationErrors) { + errorString += `${errorString} ${validationError}.`; + } + throw new TransactionSigningError(errorString); + } + + const rawTx = bytesToHex(signedTx.serialize()); + const txHash = sha3Raw(rawTx); // using keccak in web3-utils.sha3Raw instead of SHA3 (NIST Standard) as both are different + + return { + messageHash: bytesToHex(signedTx.getMessageToSign(true)), + v: `0x${signedTx.v.toString(16)}`, + r: `0x${signedTx.r.toString(16).padStart(64, '0')}`, + s: `0x${signedTx.s.toString(16).padStart(64, '0')}`, + rawTransaction: rawTx, + transactionHash: bytesToHex(txHash), + }; +}; + +/** + * Recovers the Ethereum address which was used to sign the given RLP encoded transaction. + * + * @param rawTransaction - The hex string having RLP encoded transaction + * @returns The Ethereum address used to sign this transaction + * ```ts + * web3.eth.accounts.recoverTransaction('0xf869808504e3b29200831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a0c9cf86333bcb065d140032ecaab5d9281bde80f21b9687b3e94161de42d51895a0727a108a0b8d101465414033c3f705a9c7b826e596766046ee1183dbc8aeaa68'); + * > "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23" + * ``` + */ +export const recoverTransaction = (rawTransaction: HexString): Address => { + if (isNullish(rawTransaction)) throw new UndefinedRawTransactionError(); + + const tx = TransactionFactory.fromSerializedData(hexToBytes(rawTransaction)); + + return toChecksumAddress(tx.getSenderAddress().toString()); +}; + +/** + * Recovers the Ethereum address which was used to sign the given data + * + * @param data - Either a signed message, hash, or the {@link signatureObject} + * @param signature - The raw RLP encoded signature + * @param signatureOrV - signature or V + * @param prefixedOrR - prefixed or R + * @param s - S value in signature + * @param prefixed - (default: false) If the last parameter is true, the given message will NOT automatically be prefixed with `"\\x19Ethereum Signed Message:\\n" + message.length + message`, and assumed to be already prefixed. + * @returns The Ethereum address used to sign this data + * + * ```ts + * const data = 'Some data'; + * const sigObj = web3.eth.accounts.sign(data, '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728') + * + * > { + * message: 'Some data', + * messageHash: '0x1da44b586eb0729ff70a73c326926f6ed5a25f5b056e7f47fbc6e58d86871655', + * v: '0x1b', + * r: '0xa8037a6116c176a25e6fc224947fde9e79a2deaa0dd8b67b366fbdfdbffc01f9', + * s: '0x53e41351267b20d4a89ebfe9c8f03c04de9b345add4a52f15bd026b63c8fb150', + * signature: '0xa8037a6116c176a25e6fc224947fde9e79a2deaa0dd8b67b366fbdfdbffc01f953e41351267b20d4a89ebfe9c8f03c04de9b345add4a52f15bd026b63c8fb1501b' + * } + * + * // now recover + * web3.eth.accounts.recover(data, sigObj.v, sigObj.r, sigObj.s) + * + * > 0xEB014f8c8B418Db6b45774c326A0E64C78914dC0 + * ``` + */ +export const recover = ( + data: string | SignatureObject, + signatureOrV?: string, + prefixedOrR?: boolean | string, + s?: string, + prefixed?: boolean, +): Address => { + if (typeof data === 'object') { + const signatureStr = `${data.r}${data.s.slice(2)}${data.v.slice(2)}`; + return recover(data.messageHash, signatureStr, prefixedOrR); + } + if (typeof signatureOrV === 'string' && typeof prefixedOrR === 'string' && !isNullish(s)) { + const signatureStr = `${prefixedOrR}${s.slice(2)}${signatureOrV.slice(2)}`; + return recover(data, signatureStr, prefixed); + } + + if (isNullish(signatureOrV)) throw new InvalidSignatureError('signature string undefined'); + + const V_INDEX = 130; // r = first 32 bytes, s = second 32 bytes, v = last byte of signature + const hashedMessage = prefixedOrR ? data : hashMessage(data); + + let v = parseInt(signatureOrV.substring(V_INDEX), 16); // 0x + r + s + v + if (v > 26) { + v -= 27; + } + + const ecPublicKey = secp256k1.Signature.fromCompact(signatureOrV.slice(2, V_INDEX)) + .addRecoveryBit(v) + .recoverPublicKey(hashedMessage.replace('0x', '')) + .toRawBytes(false); + + const publicHash = sha3Raw(ecPublicKey.subarray(1)); + + const address = toChecksumAddress(`0x${publicHash.slice(-40)}`); + + return address; +};; + +/** + * Get the ethereum Address from a private key + * + * @param privateKey - String or Uint8Array of 32 bytes + * @param ignoreLength - if true, will not error check length + * @returns The Ethereum address + * @example + * ```ts + * web3.eth.accounts.privateKeyToAddress("0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728") + * + * > "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0" + * ``` + */ +export const privateKeyToAddress = (privateKey: Bytes): string => { + const privateKeyUint8Array = parseAndValidatePrivateKey(privateKey); + + // Get public key from private key in compressed format + const publicKey = secp256k1.getPublicKey(privateKeyUint8Array, false); + + // Uncompressed ECDSA public key contains the prefix `0x04` which is not used in the Ethereum public key + const publicKeyHash = sha3Raw(publicKey.slice(1)); + + // The hash is returned as 256 bits (32 bytes) or 64 hex characters + // To get the address, take the last 20 bytes of the public hash + const address = publicKeyHash.slice(-40); + + return toChecksumAddress(`0x${address}`); +}; + +/** + * Get the public key from a private key + * + * @param privateKey - String or Uint8Array of 32 bytes + * @param isCompressed - if true, will generate a 33 byte compressed public key instead of a 65 byte public key + * @returns The public key + * @example + * ```ts + * web3.eth.accounts.privateKeyToPublicKey("0x1e046a882bb38236b646c9f135cf90ad90a140810f439875f2a6dd8e50fa261f", true) + * + * > "0x42beb65f179720abaa3ec9a70a539629cbbc5ec65bb57e7fc78977796837e537662dd17042e6449dc843c281067a4d6d8d1a1775a13c41901670d5de7ee6503a" // uncompressed public key + * ``` + */ +export const privateKeyToPublicKey = (privateKey: Bytes, isCompressed: boolean): string => { + const privateKeyUint8Array = parseAndValidatePrivateKey(privateKey); + + // Get public key from private key in compressed format + return `0x${bytesToHex(secp256k1.getPublicKey(privateKeyUint8Array, isCompressed)).slice(4)}`; // 0x and removing compression byte +}; + +/** + * encrypt a private key with a password, returns a V3 JSON Keystore + * + * Read more: https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition + * + * @param privateKey - The private key to encrypt, 32 bytes. + * @param password - The password used for encryption. + * @param options - Options to configure to encrypt the keystore either scrypt or pbkdf2 + * @returns Returns a V3 JSON Keystore + * + * Encrypt using scrypt options: + * ```ts + * + * web3.eth.accounts.encrypt( + * '0x67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a6', + * '123', + * { + * n: 8192, + * iv: web3.utils.hexToBytes('0xbfb43120ae00e9de110f8325143a2709'), + * salt: web3.utils.hexToBytes('0x210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd'), + * }).then(console.log) + * + * > { + * version: 3, + * id: 'c0cb0a94-4702-4492-b6e6-eb2ac404344a', + * address: 'cda9a91875fc35c8ac1320e098e584495d66e47c', + * crypto: { + * ciphertext: 'cb3e13e3281ff3861a3f0257fad4c9a51b0eb046f9c7821825c46b210f040b8f', + * cipherparams: { iv: 'bfb43120ae00e9de110f8325143a2709' }, + * cipher: 'aes-128-ctr', + * kdf: 'scrypt', + * kdfparams: { + * n: 8192, + * r: 8, + * p: 1, + * dklen: 32, + * salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd' + * }, + * mac: 'efbf6d3409f37c0084a79d5fdf9a6f5d97d11447517ef1ea8374f51e581b7efd' + * } + *} + *``` + * + * Encrypting using pbkdf2 options: + * ```ts + * web3.eth.accounts.encrypt('0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + *'123', + *{ + * iv: 'bfb43120ae00e9de110f8325143a2709', + * salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + * c: 262144, + * kdf: 'pbkdf2', + *}).then(console.log) + * + * > + * { + * version: 3, + * id: '77381417-0973-4e4b-b590-8eb3ace0fe2d', + * address: 'b8ce9ab6943e0eced004cde8e3bbed6568b2fa01', + * crypto: { + * ciphertext: '76512156a34105fa6473ad040c666ae7b917d14c06543accc0d2dc28e6073b12', + * cipherparams: { iv: 'bfb43120ae00e9de110f8325143a2709' }, + * cipher: 'aes-128-ctr', + * kdf: 'pbkdf2', + * kdfparams: { + * dklen: 32, + * salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + * c: 262144, + * prf: 'hmac-sha256' + * }, + * mac: '46eb4884e82dc43b5aa415faba53cc653b7038e9d61cc32fd643cf8c396189b7' + * } + * } + *``` + */ +export const encrypt = async ( + privateKey: Bytes, + password: string | Uint8Array, + options?: CipherOptions, +): Promise => { + const privateKeyUint8Array = parseAndValidatePrivateKey(privateKey); + + // if given salt or iv is a string, convert it to a Uint8Array + let salt; + if (options?.salt) { + salt = typeof options.salt === 'string' ? hexToBytes(options.salt) : options.salt; + } else { + salt = randomBytes(32); + } + + if (!(isString(password) || isUint8Array(password))) { + throw new InvalidPasswordError(); + } + + const uint8ArrayPassword = + typeof password === 'string' ? hexToBytes(utf8ToHex(password)) : password; + + let initializationVector; + if (options?.iv) { + initializationVector = typeof options.iv === 'string' ? hexToBytes(options.iv) : options.iv; + if (initializationVector.length !== 16) { + throw new IVLengthError(); + } + } else { + initializationVector = randomBytes(16); + } + + const kdf = options?.kdf ?? 'scrypt'; + + let derivedKey; + let kdfparams: ScryptParams | PBKDF2SHA256Params; + + // derive key from key derivation function + if (kdf === 'pbkdf2') { + kdfparams = { + dklen: options?.dklen ?? 32, + salt: bytesToHex(salt).replace('0x', ''), + c: options?.c ?? 262144, + prf: 'hmac-sha256', + }; + + if (kdfparams.c < 1000) { + // error when c < 1000, pbkdf2 is less secure with less iterations + throw new PBKDF2IterationsError(); + } + derivedKey = pbkdf2Sync(uint8ArrayPassword, salt, kdfparams.c, kdfparams.dklen, 'sha256'); + } else if (kdf === 'scrypt') { + kdfparams = { + n: options?.n ?? 8192, + r: options?.r ?? 8, + p: options?.p ?? 1, + dklen: options?.dklen ?? 32, + salt: bytesToHex(salt).replace('0x', ''), + }; + derivedKey = scryptSync( + uint8ArrayPassword, + salt, + kdfparams.n, + kdfparams.p, + kdfparams.r, + kdfparams.dklen, + ); + } else { + throw new InvalidKdfError(); + } + + const cipher = await createCipheriv( + privateKeyUint8Array, + derivedKey.slice(0, 16), + initializationVector, + 'aes-128-ctr', + ); + + const ciphertext = bytesToHex(cipher).slice(2); + + const mac = sha3Raw(uint8ArrayConcat(derivedKey.slice(16, 32), cipher)).replace('0x', ''); + return { + version: 3, + id: uuidV4(), + address: privateKeyToAddress(privateKeyUint8Array).toLowerCase().replace('0x', ''), + crypto: { + ciphertext, + cipherparams: { + iv: bytesToHex(initializationVector).replace('0x', ''), + }, + cipher: 'aes-128-ctr', + kdf, + kdfparams, + mac, + }, + }; +}; + +/** + * Get an Account object from the privateKey + * + * @param privateKey - String or Uint8Array of 32 bytes + * @param ignoreLength - if true, will not error check length + * @returns A Web3Account object + * + * :::info + * The `Web3Account.signTransaction` is not stateful if directly imported from accounts package and used. Network access is required to get the account `nonce` and `chainId` to sign the transaction, so use {@link Web3.eth.accounts.signTransaction} for signing transactions. + * :::: + * + * ```ts + * web3.eth.accounts.privateKeyToAccount("0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709"); + * + * > { + * address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01', + * privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + * sign, + * signTransaction, + * encrypt, + * } + * ``` + */ +export const privateKeyToAccount = (privateKey: Bytes, ignoreLength?: boolean): Web3Account => { + const privateKeyUint8Array = parseAndValidatePrivateKey(privateKey, ignoreLength); + + return { + address: privateKeyToAddress(privateKeyUint8Array), + privateKey: bytesToHex(privateKeyUint8Array), + // eslint-disable-next-line @typescript-eslint/no-unused-vars + signTransaction: (_tx: Transaction) => { + throw new TransactionSigningError('Do not have network access to sign the transaction'); + }, + sign: (data: Record | string) => + sign(typeof data === 'string' ? data : JSON.stringify(data), privateKeyUint8Array), + encrypt: async (password: string, options?: Record) => + encrypt(privateKeyUint8Array, password, options), + }; +}; + +/** + * + * Generates and returns a Web3Account object that includes the private and public key + * For creation of private key, it uses an audited package ethereum-cryptography/secp256k1 + * that is cryptographically secure random number with certain characteristics. + * Read more: https://www.npmjs.com/package/ethereum-cryptography#secp256k1-curve + * + * @returns A Web3Account object + * ```ts + * web3.eth.accounts.create(); + * { + * address: '0xbD504f977021b5E5DdccD8741A368b147B3B38bB', + * privateKey: '0x964ced1c69ad27a311c432fdc0d8211e987595f7eb34ab405a5f16bdc9563ec5', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [AsyncFunction: encrypt] + * } + * ``` + */ +export const create = (): Web3Account => { + const privateKey = secp256k1.utils.randomPrivateKey(); + + return privateKeyToAccount(`${bytesToHex(privateKey)}`); +}; + +/** + * Decrypts a v3 keystore JSON, and creates the account. + * + * @param keystore - the encrypted Keystore object or string to decrypt + * @param password - The password that was used for encryption + * @param nonStrict - if true and given a json string, the keystore will be parsed as lowercase. + * @returns Returns the decrypted Web3Account object + * Decrypting scrypt + * + * ```ts + * web3.eth.accounts.decrypt({ + * version: 3, + * id: 'c0cb0a94-4702-4492-b6e6-eb2ac404344a', + * address: 'cda9a91875fc35c8ac1320e098e584495d66e47c', + * crypto: { + * ciphertext: 'cb3e13e3281ff3861a3f0257fad4c9a51b0eb046f9c7821825c46b210f040b8f', + * cipherparams: { iv: 'bfb43120ae00e9de110f8325143a2709' }, + * cipher: 'aes-128-ctr', + * kdf: 'scrypt', + * kdfparams: { + * n: 8192, + * r: 8, + * p: 1, + * dklen: 32, + * salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd' + * }, + * mac: 'efbf6d3409f37c0084a79d5fdf9a6f5d97d11447517ef1ea8374f51e581b7efd' + * } + * }, '123').then(console.log); + * + * + * > { + * address: '0xcdA9A91875fc35c8Ac1320E098e584495d66e47c', + * privateKey: '67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a6', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [AsyncFunction: encrypt] + * } + * ``` + */ +export const decrypt = async ( + keystore: KeyStore | string, + password: string | Uint8Array, + nonStrict?: boolean, +): Promise => { + const json = + typeof keystore === 'object' + ? keystore + : (JSON.parse(nonStrict ? keystore.toLowerCase() : keystore) as KeyStore); + + validator.validateJSONSchema(keyStoreSchema, json); + + if (json.version !== 3) throw new KeyStoreVersionError(); + + const uint8ArrayPassword = + typeof password === 'string' ? hexToBytes(utf8ToHex(password)) : password; + + validator.validate(['bytes'], [uint8ArrayPassword]); + + let derivedKey; + if (json.crypto.kdf === 'scrypt') { + const kdfparams = json.crypto.kdfparams as ScryptParams; + const uint8ArraySalt = + typeof kdfparams.salt === 'string' ? hexToBytes(kdfparams.salt) : kdfparams.salt; + derivedKey = scryptSync( + uint8ArrayPassword, + uint8ArraySalt, + kdfparams.n, + kdfparams.p, + kdfparams.r, + kdfparams.dklen, + ); + } else if (json.crypto.kdf === 'pbkdf2') { + const kdfparams: PBKDF2SHA256Params = json.crypto.kdfparams as PBKDF2SHA256Params; + + const uint8ArraySalt = + typeof kdfparams.salt === 'string' ? hexToBytes(kdfparams.salt) : kdfparams.salt; + + derivedKey = pbkdf2Sync( + uint8ArrayPassword, + uint8ArraySalt, + kdfparams.c, + kdfparams.dklen, + 'sha256', + ); + } else { + throw new InvalidKdfError(); + } + + const ciphertext = hexToBytes(json.crypto.ciphertext); + const mac = sha3Raw(uint8ArrayConcat(derivedKey.slice(16, 32), ciphertext)).replace('0x', ''); + + if (mac !== json.crypto.mac) { + throw new KeyDerivationError(); + } + + const seed = await createDecipheriv( + hexToBytes(json.crypto.ciphertext), + derivedKey.slice(0, 16), + hexToBytes(json.crypto.cipherparams.iv), + ); + + return privateKeyToAccount(seed); +}; diff --git a/packages/web3-eth-accounts/src/common/chains/goerli.ts b/packages/web3-eth-accounts/src/common/chains/goerli.ts new file mode 100644 index 00000000000..d09be79d2cc --- /dev/null +++ b/packages/web3-eth-accounts/src/common/chains/goerli.ts @@ -0,0 +1,97 @@ +export default { + "name": "goerli", + "chainId": 5, + "networkId": 5, + "defaultHardfork": "merge", + "consensus": { + "type": "poa", + "algorithm": "clique", + "clique": { + "period": 15, + "epoch": 30000 + } + }, + "comment": "Cross-client PoA test network", + "url": "https://github.com/goerli/testnet", + "genesis": { + "timestamp": "0x5c51a607", + "gasLimit": 10485760, + "difficulty": 1, + "nonce": "0x0000000000000000", + "extraData": "0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0, + "forkHash": "0xa3f5ab08" + }, + { + "name": "homestead", + "block": 0, + "forkHash": "0xa3f5ab08" + }, + { + "name": "tangerineWhistle", + "block": 0, + "forkHash": "0xa3f5ab08" + }, + { + "name": "spuriousDragon", + "block": 0, + "forkHash": "0xa3f5ab08" + }, + { + "name": "byzantium", + "block": 0, + "forkHash": "0xa3f5ab08" + }, + { + "name": "constantinople", + "block": 0, + "forkHash": "0xa3f5ab08" + }, + { + "name": "petersburg", + "block": 0, + "forkHash": "0xa3f5ab08" + }, + { + "name": "istanbul", + "block": 1561651, + "forkHash": "0xc25efa5c" + }, + { + "name": "berlin", + "block": 4460644, + "forkHash": "0x757a1c47" + }, + { + "name": "london", + "block": 5062605, + "forkHash": "0xb8c6299d" + }, + { + "//_comment": "The forkHash will remain same as mergeForkIdTransition is post merge, terminal block: https://goerli.etherscan.io/block/7382818", + "name": "merge", + "ttd": "10790000", + "block": 7382819, + "forkHash": "0xb8c6299d" + }, + { + "name": "mergeForkIdTransition", + "block": null, + "forkHash": null + }, + { + "name": "shanghai", + "block": null, + "forkHash": null + } + ], + "bootstrapNodes": [], + "dnsNetworks": [ + "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.goerli.ethdisco.net" + ] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/chains/mainnet.ts b/packages/web3-eth-accounts/src/common/chains/mainnet.ts new file mode 100644 index 00000000000..d18bc733a94 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/chains/mainnet.ts @@ -0,0 +1,113 @@ +export default { + "name": "mainnet", + "chainId": 1, + "networkId": 1, + "defaultHardfork": "merge", + "consensus": { + "type": "pow", + "algorithm": "ethash", + "ethash": {} + }, + "comment": "The Ethereum main chain", + "url": "https://ethstats.net/", + "genesis": { + "gasLimit": 5000, + "difficulty": 17179869184, + "nonce": "0x0000000000000042", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0, + "forkHash": "0xfc64ec04" + }, + { + "name": "homestead", + "block": 1150000, + "forkHash": "0x97c2c34c" + }, + { + "name": "dao", + "block": 1920000, + "forkHash": "0x91d1f948" + }, + { + "name": "tangerineWhistle", + "block": 2463000, + "forkHash": "0x7a64da13" + }, + { + "name": "spuriousDragon", + "block": 2675000, + "forkHash": "0x3edd5b10" + }, + { + "name": "byzantium", + "block": 4370000, + "forkHash": "0xa00bc324" + }, + { + "name": "constantinople", + "block": 7280000, + "forkHash": "0x668db0af" + }, + { + "name": "petersburg", + "block": 7280000, + "forkHash": "0x668db0af" + }, + { + "name": "istanbul", + "block": 9069000, + "forkHash": "0x879d6e30" + }, + { + "name": "muirGlacier", + "block": 9200000, + "forkHash": "0xe029e991" + }, + { + "name": "berlin", + "block": 12244000, + "forkHash": "0x0eb440f6" + }, + { + "name": "london", + "block": 12965000, + "forkHash": "0xb715077d" + }, + { + "name": "arrowGlacier", + "block": 13773000, + "forkHash": "0x20c327fc" + }, + { + "name": "grayGlacier", + "block": 15050000, + "forkHash": "0xf0afd0e3" + }, + { + "//_comment": "The forkHash will remain same as mergeForkIdTransition is post merge, terminal block: https://etherscan.io/block/15537393", + "name": "merge", + "ttd": "58750000000000000000000", + "block": 15537394, + "forkHash": "0xf0afd0e3" + }, + { + "name": "mergeForkIdTransition", + "block": null, + "forkHash": null + }, + { + "name": "shanghai", + "block": null, + "forkHash": null + } + ], + "bootstrapNodes": [], + "dnsNetworks": [ + "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net" + ] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/chains/sepolia.ts b/packages/web3-eth-accounts/src/common/chains/sepolia.ts new file mode 100644 index 00000000000..1de20e440ee --- /dev/null +++ b/packages/web3-eth-accounts/src/common/chains/sepolia.ts @@ -0,0 +1,100 @@ +export default { + "name": "sepolia", + "chainId": 11155111, + "networkId": 11155111, + "defaultHardfork": "merge", + "consensus": { + "type": "pow", + "algorithm": "ethash", + "ethash": {} + }, + "comment": "PoW test network to replace Ropsten", + "url": "https://github.com/ethereum/go-ethereum/pull/23730", + "genesis": { + "timestamp": "0x6159af19", + "gasLimit": 30000000, + "difficulty": 131072, + "nonce": "0x0000000000000000", + "extraData": "0x5365706f6c69612c20417468656e732c204174746963612c2047726565636521" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "homestead", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "tangerineWhistle", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "spuriousDragon", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "byzantium", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "constantinople", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "petersburg", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "istanbul", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "muirGlacier", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "berlin", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "london", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "//_comment": "The forkHash will remain same as mergeForkIdTransition is post merge, terminal block: https://sepolia.etherscan.io/block/1450408", + "name": "merge", + "ttd": "17000000000000000", + "block": 1450409, + "forkHash": "0xfe3366e7" + }, + { + "name": "mergeForkIdTransition", + "block": 1735371, + "forkHash": "0xb96cbd13" + }, + { + "name": "shanghai", + "block": null, + "timestamp": "1677557088", + "forkHash": "0xf7f9bc08" + } + ], + "bootstrapNodes": [], + "dnsNetworks": [ + "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.sepolia.ethdisco.net" + ] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/common.ts b/packages/web3-eth-accounts/src/common/common.ts new file mode 100644 index 00000000000..1569050d2f6 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/common.ts @@ -0,0 +1,1207 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import pkg from 'crc-32'; +import { EventEmitter, bytesToHex, hexToBytes, uint8ArrayConcat } from 'web3-utils'; +import type { Numbers } from 'web3-types'; +import { TypeOutput } from './types.js'; +import { intToUint8Array, toType, parseGethGenesis } from './utils.js'; +import goerli from './chains/goerli.js'; +import mainnet from './chains/mainnet.js'; +import sepolia from './chains/sepolia.js'; +import { EIPs } from './eips/index.js'; +import type { ConsensusAlgorithm, ConsensusType } from './enums.js'; +import { Chain, CustomChain, Hardfork } from './enums.js'; +import { hardforks as HARDFORK_SPECS } from './hardforks/index.js'; + +import type { + BootstrapNodeConfig, + CasperConfig, + ChainConfig, + ChainName, + ChainsConfig, + CliqueConfig, + CommonOpts, + CustomCommonOpts, + EthashConfig, + GenesisBlockConfig, + GethConfigOpts, + HardforkConfig, +} from './types.js'; + +const { buf: crc32Uint8Array } = pkg; + +type HardforkSpecKeys = keyof typeof HARDFORK_SPECS; +type HardforkSpecValues = typeof HARDFORK_SPECS[HardforkSpecKeys]; +/** + * Common class to access chain and hardfork parameters and to provide + * a unified and shared view on the network and hardfork state. + * + * Use the {@link Common.custom} static constructor for creating simple + * custom chain {@link Common} objects (more complete custom chain setups + * can be created via the main constructor and the {@link CommonOpts.customChains} parameter). + */ +export class Common extends EventEmitter { + public readonly DEFAULT_HARDFORK: string | Hardfork; + + private _chainParams: ChainConfig; + private _hardfork: string | Hardfork; + private _eips: number[] = []; + private readonly _customChains: ChainConfig[]; + + private readonly HARDFORK_CHANGES: [HardforkSpecKeys, HardforkSpecValues][]; + + /** + * Creates a {@link Common} object for a custom chain, based on a standard one. + * + * It uses all the {@link Chain} parameters from the {@link baseChain} option except the ones overridden + * in a provided {@link chainParamsOrName} dictionary. Some usage example: + * + * ```javascript + * Common.custom({chainId: 123}) + * ``` + * + * There are also selected supported custom chains which can be initialized by using one of the + * {@link CustomChains} for {@link chainParamsOrName}, e.g.: + * + * ```javascript + * Common.custom(CustomChains.MaticMumbai) + * ``` + * + * Note that these supported custom chains only provide some base parameters (usually the chain and + * network ID and a name) and can only be used for selected use cases (e.g. sending a tx with + * the `web3-utils/tx` library to a Layer-2 chain). + * + * @param chainParamsOrName Custom parameter dict (`name` will default to `custom-chain`) or string with name of a supported custom chain + * @param opts Custom chain options to set the {@link CustomCommonOpts.baseChain}, selected {@link CustomCommonOpts.hardfork} and others + */ + public static custom( + chainParamsOrName: Partial | CustomChain, + opts: CustomCommonOpts = {}, + ): Common { + const baseChain = opts.baseChain ?? 'mainnet'; + const standardChainParams = { ...Common._getChainParams(baseChain) }; + standardChainParams.name = 'custom-chain'; + + if (typeof chainParamsOrName !== 'string') { + return new Common({ + chain: { + ...standardChainParams, + ...chainParamsOrName, + }, + ...opts, + }); + } + if (chainParamsOrName === CustomChain.PolygonMainnet) { + return Common.custom( + { + name: CustomChain.PolygonMainnet, + chainId: 137, + networkId: 137, + }, + opts, + ); + } + if (chainParamsOrName === CustomChain.PolygonMumbai) { + return Common.custom( + { + name: CustomChain.PolygonMumbai, + chainId: 80001, + networkId: 80001, + }, + opts, + ); + } + if (chainParamsOrName === CustomChain.ArbitrumRinkebyTestnet) { + return Common.custom( + { + name: CustomChain.ArbitrumRinkebyTestnet, + chainId: 421611, + networkId: 421611, + }, + opts, + ); + } + if (chainParamsOrName === CustomChain.ArbitrumOne) { + return Common.custom( + { + name: CustomChain.ArbitrumOne, + chainId: 42161, + networkId: 42161, + }, + opts, + ); + } + if (chainParamsOrName === CustomChain.xDaiChain) { + return Common.custom( + { + name: CustomChain.xDaiChain, + chainId: 100, + networkId: 100, + }, + opts, + ); + } + + if (chainParamsOrName === CustomChain.OptimisticKovan) { + return Common.custom( + { + name: CustomChain.OptimisticKovan, + chainId: 69, + networkId: 69, + }, + // Optimism has not implemented the London hardfork yet (targeting Q1.22) + { hardfork: Hardfork.Berlin, ...opts }, + ); + } + + if (chainParamsOrName === CustomChain.OptimisticEthereum) { + return Common.custom( + { + name: CustomChain.OptimisticEthereum, + chainId: 10, + networkId: 10, + }, + // Optimism has not implemented the London hardfork yet (targeting Q1.22) + { hardfork: Hardfork.Berlin, ...opts }, + ); + } + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + throw new Error(`Custom chain ${chainParamsOrName} not supported`); + } + + /** + * Static method to load and set common from a geth genesis json + * @param genesisJson json of geth configuration + * @param { chain, eips, genesisHash, hardfork, mergeForkIdPostMerge } to further configure the common instance + * @returns Common + */ + public static fromGethGenesis( + genesisJson: any, + { chain, eips, genesisHash, hardfork, mergeForkIdPostMerge }: GethConfigOpts, + ): Common { + const genesisParams = parseGethGenesis(genesisJson, chain, mergeForkIdPostMerge); + const common = new Common({ + chain: genesisParams.name ?? 'custom', + customChains: [genesisParams], + eips, + hardfork: hardfork ?? genesisParams.hardfork, + }); + if (genesisHash !== undefined) { + common.setForkHashes(genesisHash); + } + return common; + } + + /** + * Static method to determine if a {@link chainId} is supported as a standard chain + * @param chainId bigint id (`1`) of a standard chain + * @returns boolean + */ + public static isSupportedChainId(chainId: bigint): boolean { + const initializedChains = this._getInitializedChains(); + return Boolean((initializedChains.names as ChainName)[chainId.toString()]); + } + + private static _getChainParams( + _chain: string | number | Chain | bigint, + customChains?: ChainConfig[], + ): ChainConfig { + let chain = _chain; + const initializedChains = this._getInitializedChains(customChains); + if (typeof chain === 'number' || typeof chain === 'bigint') { + chain = chain.toString(); + + if ((initializedChains.names as ChainName)[chain]) { + const name: string = (initializedChains.names as ChainName)[chain]; + return initializedChains[name] as ChainConfig; + } + + throw new Error(`Chain with ID ${chain} not supported`); + } + + if (initializedChains[chain] !== undefined) { + return initializedChains[chain] as ChainConfig; + } + + throw new Error(`Chain with name ${chain} not supported`); + } + + public constructor(opts: CommonOpts) { + super(); + this._customChains = opts.customChains ?? []; + this._chainParams = this.setChain(opts.chain); + this.DEFAULT_HARDFORK = this._chainParams.defaultHardfork ?? Hardfork.Merge; + // Assign hardfork changes in the sequence of the applied hardforks + this.HARDFORK_CHANGES = this.hardforks().map(hf => [ + hf.name as HardforkSpecKeys, + HARDFORK_SPECS[hf.name as HardforkSpecKeys], + ]); + this._hardfork = this.DEFAULT_HARDFORK; + if (opts.hardfork !== undefined) { + this.setHardfork(opts.hardfork); + } + if (opts.eips) { + this.setEIPs(opts.eips); + } + } + + /** + * Sets the chain + * @param chain String ('mainnet') or Number (1) chain representation. + * Or, a Dictionary of chain parameters for a private network. + * @returns The dictionary with parameters set as chain + */ + public setChain(chain: string | number | Chain | bigint | object): ChainConfig { + if (typeof chain === 'number' || typeof chain === 'bigint' || typeof chain === 'string') { + this._chainParams = Common._getChainParams(chain, this._customChains); + } else if (typeof chain === 'object') { + if (this._customChains.length > 0) { + throw new Error( + 'Chain must be a string, number, or bigint when initialized with customChains passed in', + ); + } + const required = ['networkId', 'genesis', 'hardforks', 'bootstrapNodes']; + for (const param of required) { + if (!(param in chain)) { + throw new Error(`Missing required chain parameter: ${param}`); + } + } + this._chainParams = chain as ChainConfig; + } else { + throw new Error('Wrong input format'); + } + for (const hf of this.hardforks()) { + if (hf.block === undefined) { + throw new Error(`Hardfork cannot have undefined block number`); + } + } + return this._chainParams; + } + + /** + * Sets the hardfork to get params for + * @param hardfork String identifier (e.g. 'byzantium') or {@link Hardfork} enum + */ + public setHardfork(hardfork: string | Hardfork): void { + let existing = false; + for (const hfChanges of this.HARDFORK_CHANGES) { + if (hfChanges[0] === hardfork) { + if (this._hardfork !== hardfork) { + this._hardfork = hardfork; + this.emit('hardforkChanged', hardfork); + } + existing = true; + } + } + if (!existing) { + throw new Error(`Hardfork with name ${hardfork} not supported`); + } + } + + /** + * Returns the hardfork based on the block number or an optional + * total difficulty (Merge HF) provided. + * + * An optional TD takes precedence in case the corresponding HF block + * is set to `null` or otherwise needs to match (if not an error + * will be thrown). + * + * @param blockNumber + * @param td : total difficulty of the parent block (for block hf) OR of the chain latest (for chain hf) + * @param timestamp: timestamp in seconds at which block was/is to be minted + * @returns The name of the HF + */ + public getHardforkByBlockNumber( + _blockNumber: Numbers, + _td?: Numbers, + _timestamp?: Numbers, + ): string { + const blockNumber = toType(_blockNumber, TypeOutput.BigInt); + const td = toType(_td, TypeOutput.BigInt); + const timestamp = toType(_timestamp, TypeOutput.Number); + + // Filter out hardforks with no block number, no ttd or no timestamp (i.e. unapplied hardforks) + const hfs = this.hardforks().filter( + hf => + // eslint-disable-next-line no-null/no-null + hf.block !== null || + // eslint-disable-next-line no-null/no-null + (hf.ttd !== null && hf.ttd !== undefined) || + hf.timestamp !== undefined, + ); + // eslint-disable-next-line no-null/no-null + const mergeIndex = hfs.findIndex(hf => hf.ttd !== null && hf.ttd !== undefined); + const doubleTTDHF = hfs + .slice(mergeIndex + 1) + // eslint-disable-next-line no-null/no-null + .findIndex(hf => hf.ttd !== null && hf.ttd !== undefined); + if (doubleTTDHF >= 0) { + throw Error(`More than one merge hardforks found with ttd specified`); + } + + // Find the first hardfork that has a block number greater than `blockNumber` + // (skips the merge hardfork since it cannot have a block number specified). + // If timestamp is not provided, it also skips timestamps hardforks to continue + // discovering/checking number hardforks. + let hfIndex = hfs.findIndex( + hf => + // eslint-disable-next-line no-null/no-null + (hf.block !== null && hf.block > blockNumber) || + (timestamp !== undefined && Number(hf.timestamp) > timestamp), + ); + + if (hfIndex === -1) { + // all hardforks apply, set hfIndex to the last one as that's the candidate + hfIndex = hfs.length; + } else if (hfIndex === 0) { + // cannot have a case where a block number is before all applied hardforks + // since the chain has to start with a hardfork + throw Error('Must have at least one hardfork at block 0'); + } + + // If timestamp is not provided, we need to rollback to the last hf with block or ttd + if (timestamp === undefined) { + const stepBack = hfs + .slice(0, hfIndex) + .reverse() + // eslint-disable-next-line no-null/no-null + .findIndex(hf => hf.block !== null || hf.ttd !== undefined); + hfIndex -= stepBack; + } + // Move hfIndex one back to arrive at candidate hardfork + hfIndex -= 1; + + // If the timestamp was not provided, we could have skipped timestamp hardforks to look for number + // hardforks. so it will now be needed to rollback + // eslint-disable-next-line no-null/no-null + if (hfs[hfIndex].block === null && hfs[hfIndex].timestamp === undefined) { + // We're on the merge hardfork. Let's check the TTD + // eslint-disable-next-line no-null/no-null + if (td === undefined || td === null || BigInt(hfs[hfIndex].ttd!) > td) { + // Merge ttd greater than current td so we're on hardfork before merge + hfIndex -= 1; + } + // eslint-disable-next-line no-null/no-null + } else if (mergeIndex >= 0 && td !== undefined && td !== null) { + if (hfIndex >= mergeIndex && BigInt(hfs[mergeIndex].ttd!) > td) { + throw Error( + 'Maximum HF determined by total difficulty is lower than the block number HF', + ); + } else if (hfIndex < mergeIndex && BigInt(hfs[mergeIndex].ttd!) <= td) { + throw Error( + 'HF determined by block number is lower than the minimum total difficulty HF', + ); + } + } + + const hfStartIndex = hfIndex; + // Move the hfIndex to the end of the hardforks that might be scheduled on the same block/timestamp + // This won't anyway be the case with Merge hfs + for (; hfIndex < hfs.length - 1; hfIndex += 1) { + // break out if hfIndex + 1 is not scheduled at hfIndex + if ( + hfs[hfIndex].block !== hfs[hfIndex + 1].block || + hfs[hfIndex].timestamp !== hfs[hfIndex + 1].timestamp + ) { + break; + } + } + + if (timestamp) { + const minTimeStamp = hfs + .slice(0, hfStartIndex) + .reduce( + (acc: number, hf: HardforkConfig) => Math.max(Number(hf.timestamp ?? '0'), acc), + 0, + ); + if (minTimeStamp > timestamp) { + throw Error( + `Maximum HF determined by timestamp is lower than the block number/ttd HF`, + ); + } + + const maxTimeStamp = hfs + .slice(hfIndex + 1) + .reduce( + (acc: number, hf: HardforkConfig) => + Math.min(Number(hf.timestamp ?? timestamp), acc), + timestamp, + ); + if (maxTimeStamp < timestamp) { + throw Error(`Maximum HF determined by block number/ttd is lower than timestamp HF`); + } + } + const hardfork = hfs[hfIndex]; + return hardfork.name; + } + + /** + * Sets a new hardfork based on the block number or an optional + * total difficulty (Merge HF) provided. + * + * An optional TD takes precedence in case the corresponding HF block + * is set to `null` or otherwise needs to match (if not an error + * will be thrown). + * + * @param blockNumber + * @param td + * @param timestamp + * @returns The name of the HF set + */ + public setHardforkByBlockNumber( + blockNumber: Numbers, + td?: Numbers, + timestamp?: Numbers, + ): string { + const hardfork = this.getHardforkByBlockNumber(blockNumber, td, timestamp); + this.setHardfork(hardfork); + return hardfork; + } + + /** + * Internal helper function, returns the params for the given hardfork for the chain set + * @param hardfork Hardfork name + * @returns Dictionary with hardfork params or null if hardfork not on chain + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public _getHardfork(hardfork: string | Hardfork): HardforkConfig | null { + const hfs = this.hardforks(); + for (const hf of hfs) { + if (hf.name === hardfork) return hf; + } + // eslint-disable-next-line no-null/no-null + return null; + } + + /** + * Sets the active EIPs + * @param eips + */ + public setEIPs(eips: number[] = []) { + for (const eip of eips) { + if (!(eip in EIPs)) { + throw new Error(`${eip} not supported`); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument + const minHF = this.gteHardfork(EIPs[eip].minimumHardfork); + if (!minHF) { + throw new Error( + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `${eip} cannot be activated on hardfork ${this.hardfork()}, minimumHardfork: ${minHF}`, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (EIPs[eip].requiredEIPs !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + for (const elem of EIPs[eip].requiredEIPs) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + if (!(eips.includes(elem) || this.isActivatedEIP(elem))) { + throw new Error( + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `${eip} requires EIP ${elem}, but is not included in the EIP list`, + ); + } + } + } + } + this._eips = eips; + } + + /** + * Returns a parameter for the current chain setup + * + * If the parameter is present in an EIP, the EIP always takes precedence. + * Otherwise the parameter if taken from the latest applied HF with + * a change on the respective parameter. + * + * @param topic Parameter topic ('gasConfig', 'gasPrices', 'vm', 'pow') + * @param name Parameter name (e.g. 'minGasLimit' for 'gasConfig' topic) + * @returns The value requested or `BigInt(0)` if not found + */ + public param(topic: string, name: string): bigint { + // TODO: consider the case that different active EIPs + // can change the same parameter + let value; + for (const eip of this._eips) { + value = this.paramByEIP(topic, name, eip); + if (value !== undefined) return value; + } + return this.paramByHardfork(topic, name, this._hardfork); + } + + /** + * Returns the parameter corresponding to a hardfork + * @param topic Parameter topic ('gasConfig', 'gasPrices', 'vm', 'pow') + * @param name Parameter name (e.g. 'minGasLimit' for 'gasConfig' topic) + * @param hardfork Hardfork name + * @returns The value requested or `BigInt(0)` if not found + */ + public paramByHardfork(topic: string, name: string, hardfork: string | Hardfork): bigint { + // eslint-disable-next-line no-null/no-null + let value = null; + for (const hfChanges of this.HARDFORK_CHANGES) { + // EIP-referencing HF file (e.g. berlin.json) + if ('eips' in hfChanges[1]) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + const hfEIPs = hfChanges[1].eips; + for (const eip of hfEIPs) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + const valueEIP = this.paramByEIP(topic, name, eip); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + value = typeof valueEIP === 'bigint' ? valueEIP : value; + } + // Parameter-inlining HF file (e.g. istanbul.json) + } else { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (hfChanges[1][topic] === undefined) { + throw new Error(`Topic ${topic} not defined`); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (hfChanges[1][topic][name] !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + value = hfChanges[1][topic][name].v; + } + } + if (hfChanges[0] === hardfork) break; + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + return BigInt(value ?? 0); + } + + /** + * Returns a parameter corresponding to an EIP + * @param topic Parameter topic ('gasConfig', 'gasPrices', 'vm', 'pow') + * @param name Parameter name (e.g. 'minGasLimit' for 'gasConfig' topic) + * @param eip Number of the EIP + * @returns The value requested or `undefined` if not found + */ + // eslint-disable-next-line class-methods-use-this + public paramByEIP(topic: string, name: string, eip: number): bigint | undefined { + if (!(eip in EIPs)) { + throw new Error(`${eip} not supported`); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const eipParams = EIPs[eip]; + if (!(topic in eipParams)) { + throw new Error(`Topic ${topic} not defined`); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (eipParams[topic][name] === undefined) { + return undefined; + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + const value = eipParams[topic][name].v; + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + return BigInt(value); + } + + /** + * Returns a parameter for the hardfork active on block number or + * optional provided total difficulty (Merge HF) + * @param topic Parameter topic + * @param name Parameter name + * @param blockNumber Block number + * @param td Total difficulty + * * @returns The value requested or `BigInt(0)` if not found + */ + public paramByBlock( + topic: string, + name: string, + blockNumber: Numbers, + td?: Numbers, + timestamp?: Numbers, + ): bigint { + const hardfork = this.getHardforkByBlockNumber(blockNumber, td, timestamp); + return this.paramByHardfork(topic, name, hardfork); + } + + /** + * Checks if an EIP is activated by either being included in the EIPs + * manually passed in with the {@link CommonOpts.eips} or in a + * hardfork currently being active + * + * Note: this method only works for EIPs being supported + * by the {@link CommonOpts.eips} constructor option + * @param eip + */ + public isActivatedEIP(eip: number): boolean { + if (this.eips().includes(eip)) { + return true; + } + for (const hfChanges of this.HARDFORK_CHANGES) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const hf = hfChanges[1]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument + if (this.gteHardfork(hf.name) && 'eips' in hf) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if ((hf.eips as number[]).includes(eip)) { + return true; + } + } + } + return false; + } + + /** + * Checks if set or provided hardfork is active on block number + * @param hardfork Hardfork name or null (for HF set) + * @param blockNumber + * @returns True if HF is active on block number + */ + public hardforkIsActiveOnBlock( + // eslint-disable-next-line @typescript-eslint/ban-types + _hardfork: string | Hardfork | null, + _blockNumber: Numbers, + ): boolean { + const blockNumber = toType(_blockNumber, TypeOutput.BigInt); + const hardfork = _hardfork ?? this._hardfork; + const hfBlock = this.hardforkBlock(hardfork); + if (typeof hfBlock === 'bigint' && hfBlock !== BigInt(0) && blockNumber >= hfBlock) { + return true; + } + return false; + } + + /** + * Alias to hardforkIsActiveOnBlock when hardfork is set + * @param blockNumber + * @returns True if HF is active on block number + */ + public activeOnBlock(blockNumber: Numbers): boolean { + // eslint-disable-next-line no-null/no-null + return this.hardforkIsActiveOnBlock(null, blockNumber); + } + + /** + * Sequence based check if given or set HF1 is greater than or equal HF2 + * @param hardfork1 Hardfork name or null (if set) + * @param hardfork2 Hardfork name + * @param opts Hardfork options + * @returns True if HF1 gte HF2 + */ + public hardforkGteHardfork( + // eslint-disable-next-line @typescript-eslint/ban-types + _hardfork1: string | Hardfork | null, + hardfork2: string | Hardfork, + ): boolean { + const hardfork1 = _hardfork1 ?? this._hardfork; + const hardforks = this.hardforks(); + + let posHf1 = -1; + let posHf2 = -1; + let index = 0; + for (const hf of hardforks) { + if (hf.name === hardfork1) posHf1 = index; + if (hf.name === hardfork2) posHf2 = index; + index += 1; + } + return posHf1 >= posHf2 && posHf2 !== -1; + } + + /** + * Alias to hardforkGteHardfork when hardfork is set + * @param hardfork Hardfork name + * @returns True if hardfork set is greater than hardfork provided + */ + public gteHardfork(hardfork: string | Hardfork): boolean { + // eslint-disable-next-line no-null/no-null + return this.hardforkGteHardfork(null, hardfork); + } + + /** + * Returns the hardfork change block for hardfork provided or set + * @param hardfork Hardfork name, optional if HF set + * @returns Block number or null if unscheduled + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public hardforkBlock(_hardfork?: string | Hardfork): bigint | null { + const hardfork = _hardfork ?? this._hardfork; + const block = this._getHardfork(hardfork)?.block; + // eslint-disable-next-line no-null/no-null + if (block === undefined || block === null) { + // eslint-disable-next-line no-null/no-null + return null; + } + return BigInt(block); + } + // eslint-disable-next-line @typescript-eslint/ban-types + public hardforkTimestamp(_hardfork?: string | Hardfork): bigint | null { + const hardfork = _hardfork ?? this._hardfork; + const timestamp = this._getHardfork(hardfork)?.timestamp; + // eslint-disable-next-line no-null/no-null + if (timestamp === undefined || timestamp === null) { + // eslint-disable-next-line no-null/no-null + return null; + } + return BigInt(timestamp); + } + + /** + * Returns the hardfork change block for eip + * @param eip EIP number + * @returns Block number or null if unscheduled + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public eipBlock(eip: number): bigint | null { + for (const hfChanges of this.HARDFORK_CHANGES) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const hf = hfChanges[1]; + if ('eips' in hf) { + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + if (hf.eips.includes(eip)) { + return this.hardforkBlock( + typeof hfChanges[0] === 'number' ? String(hfChanges[0]) : hfChanges[0], + ); + } + } + } + // eslint-disable-next-line no-null/no-null + return null; + } + + /** + * Returns the hardfork change total difficulty (Merge HF) for hardfork provided or set + * @param hardfork Hardfork name, optional if HF set + * @returns Total difficulty or null if no set + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public hardforkTTD(_hardfork?: string | Hardfork): bigint | null { + const hardfork = _hardfork ?? this._hardfork; + const ttd = this._getHardfork(hardfork)?.ttd; + // eslint-disable-next-line no-null/no-null + if (ttd === undefined || ttd === null) { + // eslint-disable-next-line no-null/no-null + return null; + } + return BigInt(ttd); + } + + /** + * True if block number provided is the hardfork (given or set) change block + * @param blockNumber Number of the block to check + * @param hardfork Hardfork name, optional if HF set + * @returns True if blockNumber is HF block + * @deprecated + */ + public isHardforkBlock(_blockNumber: Numbers, _hardfork?: string | Hardfork): boolean { + const blockNumber = toType(_blockNumber, TypeOutput.BigInt); + const hardfork = _hardfork ?? this._hardfork; + const block = this.hardforkBlock(hardfork); + return typeof block === 'bigint' && block !== BigInt(0) ? block === blockNumber : false; + } + + /** + * Returns the change block for the next hardfork after the hardfork provided or set + * @param hardfork Hardfork name, optional if HF set + * @returns Block timestamp, number or null if not available + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public nextHardforkBlockOrTimestamp(_hardfork?: string | Hardfork): bigint | null { + const hardfork = _hardfork ?? this._hardfork; + const hfs = this.hardforks(); + let hfIndex = hfs.findIndex(hf => hf.name === hardfork); + // If the current hardfork is merge, go one behind as merge hf is not part of these + // calcs even if the merge hf block is set + if (hardfork === Hardfork.Merge) { + hfIndex -= 1; + } + // Hardfork not found + if (hfIndex < 0) { + // eslint-disable-next-line no-null/no-null + return null; + } + + let currHfTimeOrBlock = hfs[hfIndex].timestamp ?? hfs[hfIndex].block; + currHfTimeOrBlock = + // eslint-disable-next-line no-null/no-null + currHfTimeOrBlock !== null && currHfTimeOrBlock !== undefined + ? Number(currHfTimeOrBlock) + : // eslint-disable-next-line no-null/no-null + null; + + const nextHf = hfs.slice(hfIndex + 1).find(hf => { + let hfTimeOrBlock = hf.timestamp ?? hf.block; + hfTimeOrBlock = + // eslint-disable-next-line no-null/no-null + hfTimeOrBlock !== null && hfTimeOrBlock !== undefined + ? Number(hfTimeOrBlock) + : // eslint-disable-next-line no-null/no-null + null; + return ( + hf.name !== Hardfork.Merge && + // eslint-disable-next-line no-null/no-null + hfTimeOrBlock !== null && + hfTimeOrBlock !== undefined && + hfTimeOrBlock !== currHfTimeOrBlock + ); + }); + // If no next hf found with valid block or timestamp return null + if (nextHf === undefined) { + // eslint-disable-next-line no-null/no-null + return null; + } + + const nextHfBlock = nextHf.timestamp ?? nextHf.block; + // eslint-disable-next-line no-null/no-null + if (nextHfBlock === null || nextHfBlock === undefined) { + // eslint-disable-next-line no-null/no-null + return null; + } + + return BigInt(nextHfBlock); + } + + /** + * Returns the change block for the next hardfork after the hardfork provided or set + * @param hardfork Hardfork name, optional if HF set + * @returns Block number or null if not available + * @deprecated + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public nextHardforkBlock(_hardfork?: string | Hardfork): bigint | null { + const hardfork = _hardfork ?? this._hardfork; + let hfBlock = this.hardforkBlock(hardfork); + // If this is a merge hardfork with block not set, then we fallback to previous hardfork + // to find the nextHardforkBlock + // eslint-disable-next-line no-null/no-null + if (hfBlock === null && hardfork === Hardfork.Merge) { + const hfs = this.hardforks(); + // eslint-disable-next-line no-null/no-null + const mergeIndex = hfs.findIndex(hf => hf.ttd !== null && hf.ttd !== undefined); + if (mergeIndex < 0) { + throw Error(`Merge hardfork should have been found`); + } + hfBlock = this.hardforkBlock(hfs[mergeIndex - 1].name); + } + // eslint-disable-next-line no-null/no-null + if (hfBlock === null) { + // eslint-disable-next-line no-null/no-null + return null; + } + // Next fork block number or null if none available + // Logic: if accumulator is still null and on the first occurrence of + // a block greater than the current hfBlock set the accumulator, + // pass on the accumulator as the final result from this time on + // eslint-disable-next-line no-null/no-null, @typescript-eslint/ban-types + const nextHfBlock = this.hardforks().reduce((acc: bigint | null, hf: HardforkConfig) => { + // We need to ignore the merge block in our next hardfork calc + const block = BigInt( + // eslint-disable-next-line no-null/no-null + hf.block === null || (hf.ttd !== undefined && hf.ttd !== null) ? 0 : hf.block, + ); + // TypeScript can't seem to follow that the hfBlock is not null at this point + // eslint-disable-next-line no-null/no-null + return block > hfBlock! && acc === null ? block : acc; + // eslint-disable-next-line no-null/no-null + }, null); + return nextHfBlock; + } + + /** + * True if block number provided is the hardfork change block following the hardfork given or set + * @param blockNumber Number of the block to check + * @param hardfork Hardfork name, optional if HF set + * @returns True if blockNumber is HF block + * @deprecated + */ + public isNextHardforkBlock(_blockNumber: Numbers, _hardfork?: string | Hardfork): boolean { + const blockNumber = toType(_blockNumber, TypeOutput.BigInt); + const hardfork = _hardfork ?? this._hardfork; + // eslint-disable-next-line deprecation/deprecation + const nextHardforkBlock = this.nextHardforkBlock(hardfork); + // eslint-disable-next-line no-null/no-null + return nextHardforkBlock === null ? false : nextHardforkBlock === blockNumber; + } + + /** + * Internal helper function to calculate a fork hash + * @param hardfork Hardfork name + * @param genesisHash Genesis block hash of the chain + * @returns Fork hash as hex string + */ + public _calcForkHash(hardfork: string | Hardfork, genesisHash: Uint8Array) { + let hfUint8Array = new Uint8Array(); + let prevBlockOrTime = 0; + for (const hf of this.hardforks()) { + const { block, timestamp, name } = hf; + // Timestamp to be used for timestamp based hfs even if we may bundle + // block number with them retrospectively + let blockOrTime = timestamp ?? block; + // eslint-disable-next-line no-null/no-null + blockOrTime = blockOrTime !== null ? Number(blockOrTime) : null; + + // Skip for chainstart (0), not applied HFs (null) and + // when already applied on same blockOrTime HFs + // and on the merge since forkhash doesn't change on merge hf + if ( + typeof blockOrTime === 'number' && + blockOrTime !== 0 && + blockOrTime !== prevBlockOrTime && + name !== Hardfork.Merge + ) { + const hfBlockUint8Array = hexToBytes(blockOrTime.toString(16).padStart(16, '0')); + hfUint8Array = uint8ArrayConcat(hfUint8Array, hfBlockUint8Array); + prevBlockOrTime = blockOrTime; + } + + if (hf.name === hardfork) break; + } + const inputUint8Array = uint8ArrayConcat(genesisHash, hfUint8Array); + + // CRC32 delivers result as signed (negative) 32-bit integer, + // convert to hex string + // eslint-disable-next-line no-bitwise + const forkhash = bytesToHex(intToUint8Array(crc32Uint8Array(inputUint8Array) >>> 0)); + return forkhash; + } + + /** + * Returns an eth/64 compliant fork hash (EIP-2124) + * @param hardfork Hardfork name, optional if HF set + * @param genesisHash Genesis block hash of the chain, optional if already defined and not needed to be calculated + */ + public forkHash(_hardfork?: string | Hardfork, genesisHash?: Uint8Array): string { + const hardfork = _hardfork ?? this._hardfork; + const data = this._getHardfork(hardfork); + if ( + // eslint-disable-next-line no-null/no-null + data === null || + // eslint-disable-next-line no-null/no-null + (data?.block === null && data?.timestamp === undefined && data?.ttd === undefined) + ) { + const msg = 'No fork hash calculation possible for future hardfork'; + throw new Error(msg); + } + // eslint-disable-next-line no-null/no-null + if (data?.forkHash !== null && data?.forkHash !== undefined) { + return data.forkHash; + } + if (!genesisHash) throw new Error('genesisHash required for forkHash calculation'); + return this._calcForkHash(hardfork, genesisHash); + } + + /** + * + * @param forkHash Fork hash as a hex string + * @returns Array with hardfork data (name, block, forkHash) + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public hardforkForForkHash(forkHash: string): HardforkConfig | null { + const resArray = this.hardforks().filter((hf: HardforkConfig) => hf.forkHash === forkHash); + // eslint-disable-next-line no-null/no-null + return resArray.length >= 1 ? resArray[resArray.length - 1] : null; + } + + /** + * Sets any missing forkHashes on the passed-in {@link Common} instance + * @param common The {@link Common} to set the forkHashes for + * @param genesisHash The genesis block hash + */ + public setForkHashes(genesisHash: Uint8Array) { + for (const hf of this.hardforks()) { + const blockOrTime = hf.timestamp ?? hf.block; + if ( + // eslint-disable-next-line no-null/no-null + (hf.forkHash === null || hf.forkHash === undefined) && + // eslint-disable-next-line no-null/no-null + ((blockOrTime !== null && blockOrTime !== undefined) || + typeof hf.ttd !== 'undefined') + ) { + hf.forkHash = this.forkHash(hf.name, genesisHash); + } + } + } + + /** + * Returns the Genesis parameters of the current chain + * @returns Genesis dictionary + */ + public genesis(): GenesisBlockConfig { + return this._chainParams.genesis; + } + + /** + * Returns the hardforks for current chain + * @returns {Array} Array with arrays of hardforks + */ + public hardforks(): HardforkConfig[] { + return this._chainParams.hardforks; + } + + /** + * Returns bootstrap nodes for the current chain + * @returns {Dictionary} Dict with bootstrap nodes + */ + public bootstrapNodes(): BootstrapNodeConfig[] | undefined { + return this._chainParams.bootstrapNodes; + } + + /** + * Returns DNS networks for the current chain + * @returns {String[]} Array of DNS ENR urls + */ + public dnsNetworks(): string[] { + return this._chainParams.dnsNetworks!; + } + + /** + * Returns the hardfork set + * @returns Hardfork name + */ + public hardfork(): string | Hardfork { + return this._hardfork; + } + + /** + * Returns the Id of current chain + * @returns chain Id + */ + public chainId(): bigint { + return BigInt(this._chainParams.chainId); + } + + /** + * Returns the name of current chain + * @returns chain name (lower case) + */ + public chainName(): string { + return this._chainParams.name; + } + + /** + * Returns the Id of current network + * @returns network Id + */ + public networkId(): bigint { + return BigInt(this._chainParams.networkId); + } + + /** + * Returns the active EIPs + * @returns List of EIPs + */ + public eips(): number[] { + return this._eips; + } + + /** + * Returns the consensus type of the network + * Possible values: "pow"|"poa"|"pos" + * + * Note: This value can update along a Hardfork. + */ + public consensusType(): string | ConsensusType { + const hardfork = this.hardfork(); + + let value; + for (const hfChanges of this.HARDFORK_CHANGES) { + if ('consensus' in hfChanges[1]) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + value = hfChanges[1].consensus.type; + } + if (hfChanges[0] === hardfork) break; + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return value ?? this._chainParams.consensus.type; + } + + /** + * Returns the concrete consensus implementation + * algorithm or protocol for the network + * e.g. "ethash" for "pow" consensus type, + * "clique" for "poa" consensus type or + * "casper" for "pos" consensus type. + * + * Note: This value can update along a Hardfork. + */ + public consensusAlgorithm(): string | ConsensusAlgorithm { + const hardfork = this.hardfork(); + + let value; + for (const hfChanges of this.HARDFORK_CHANGES) { + if ('consensus' in hfChanges[1]) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + value = hfChanges[1].consensus.algorithm; + } + if (hfChanges[0] === hardfork) break; + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return value ?? (this._chainParams.consensus.algorithm as ConsensusAlgorithm); + } + + /** + * Returns a dictionary with consensus configuration + * parameters based on the consensus algorithm + * + * Expected returns (parameters must be present in + * the respective chain json files): + * + * ethash: empty object + * clique: period, epoch + * casper: empty object + * + * Note: This value can update along a Hardfork. + */ + public consensusConfig(): { [key: string]: CliqueConfig | EthashConfig | CasperConfig } { + const hardfork = this.hardfork(); + + let value; + for (const hfChanges of this.HARDFORK_CHANGES) { + if ('consensus' in hfChanges[1]) { + // The config parameter is named after the respective consensus algorithm + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + value = hfChanges[1].consensus[hfChanges[1].consensus.algorithm]; + } + if (hfChanges[0] === hardfork) break; + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return ( + value ?? + this._chainParams.consensus[this.consensusAlgorithm() as ConsensusAlgorithm] ?? + {} + ); + } + + /** + * Returns a deep copy of this {@link Common} instance. + */ + public copy(): Common { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment + const copy = Object.assign(Object.create(Object.getPrototypeOf(this)), this); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + copy.removeAllListeners(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return copy; + } + + public static _getInitializedChains(customChains?: ChainConfig[]): ChainsConfig { + const names: ChainName = {}; + for (const [name, id] of Object.entries(Chain)) { + names[id] = name.toLowerCase(); + } + const chains = { mainnet, goerli, sepolia } as ChainsConfig; + if (customChains) { + for (const chain of customChains) { + const { name } = chain; + names[chain.chainId.toString()] = name; + chains[name] = chain; + } + } + chains.names = names; + return chains; + } +} diff --git a/packages/web3-eth-accounts/src/common/eips/1153.ts b/packages/web3-eth-accounts/src/common/eips/1153.ts new file mode 100644 index 00000000000..a7440d29d19 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/1153.ts @@ -0,0 +1,23 @@ +export default { + "name": "EIP-1153", + "number": 1153, + "comment": "Transient Storage", + "url": "https://eips.ethereum.org/EIPS/eip-1153", + "status": "Review", + "minimumHardfork": "chainstart", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": { + "tstore": { + "v": 100, + "d": "Base fee of the TSTORE opcode" + }, + "tload": { + "v": 100, + "d": "Base fee of the TLOAD opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/1559.ts b/packages/web3-eth-accounts/src/common/eips/1559.ts new file mode 100644 index 00000000000..ef3f04422e9 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/1559.ts @@ -0,0 +1,27 @@ +export default { + "name": "EIP-1559", + "number": 1559, + "comment": "Fee market change for ETH 1.0 chain", + "url": "https://eips.ethereum.org/EIPS/eip-1559", + "status": "Final", + "minimumHardfork": "berlin", + "requiredEIPs": [2930], + "gasConfig": { + "baseFeeMaxChangeDenominator": { + "v": 8, + "d": "Maximum base fee change denominator" + }, + "elasticityMultiplier": { + "v": 2, + "d": "Maximum block gas target elasticity" + }, + "initialBaseFee": { + "v": 1000000000, + "d": "Initial base fee on first EIP1559 block" + } + }, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/2315.ts b/packages/web3-eth-accounts/src/common/eips/2315.ts new file mode 100644 index 00000000000..d29efa3049d --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/2315.ts @@ -0,0 +1,26 @@ +export default { + "name": "EIP-2315", + "number": 2315, + "comment": "Simple subroutines for the EVM", + "url": "https://eips.ethereum.org/EIPS/eip-2315", + "status": "Draft", + "minimumHardfork": "istanbul", + "gasConfig": {}, + "gasPrices": { + "beginsub": { + "v": 2, + "d": "Base fee of the BEGINSUB opcode" + }, + "returnsub": { + "v": 5, + "d": "Base fee of the RETURNSUB opcode" + }, + "jumpsub": { + "v": 10, + "d": "Base fee of the JUMPSUB opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/2537.ts b/packages/web3-eth-accounts/src/common/eips/2537.ts new file mode 100644 index 00000000000..14fa62abdb1 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/2537.ts @@ -0,0 +1,179 @@ +export default { + "name": "EIP-2537", + "number": 2537, + "comment": "BLS12-381 precompiles", + "url": "https://eips.ethereum.org/EIPS/eip-2537", + "status": "Draft", + "minimumHardfork": "chainstart", + "gasConfig": {}, + "gasPrices": { + "Bls12381G1AddGas": { + "v": 600, + "d": "Gas cost of a single BLS12-381 G1 addition precompile-call" + }, + "Bls12381G1MulGas": { + "v": 12000, + "d": "Gas cost of a single BLS12-381 G1 multiplication precompile-call" + }, + "Bls12381G2AddGas": { + "v": 4500, + "d": "Gas cost of a single BLS12-381 G2 addition precompile-call" + }, + "Bls12381G2MulGas": { + "v": 55000, + "d": "Gas cost of a single BLS12-381 G2 multiplication precompile-call" + }, + "Bls12381PairingBaseGas": { + "v": 115000, + "d": "Base gas cost of BLS12-381 pairing check" + }, + "Bls12381PairingPerPairGas": { + "v": 23000, + "d": "Per-pair gas cost of BLS12-381 pairing check" + }, + "Bls12381MapG1Gas": { + "v": 5500, + "d": "Gas cost of BLS12-381 map field element to G1" + }, + "Bls12381MapG2Gas": { + "v": 110000, + "d": "Gas cost of BLS12-381 map field element to G2" + }, + "Bls12381MultiExpGasDiscount": { + "v": [ + [1, 1200], + [2, 888], + [3, 764], + [4, 641], + [5, 594], + [6, 547], + [7, 500], + [8, 453], + [9, 438], + [10, 423], + [11, 408], + [12, 394], + [13, 379], + [14, 364], + [15, 349], + [16, 334], + [17, 330], + [18, 326], + [19, 322], + [20, 318], + [21, 314], + [22, 310], + [23, 306], + [24, 302], + [25, 298], + [26, 294], + [27, 289], + [28, 285], + [29, 281], + [30, 277], + [31, 273], + [32, 269], + [33, 268], + [34, 266], + [35, 265], + [36, 263], + [37, 262], + [38, 260], + [39, 259], + [40, 257], + [41, 256], + [42, 254], + [43, 253], + [44, 251], + [45, 250], + [46, 248], + [47, 247], + [48, 245], + [49, 244], + [50, 242], + [51, 241], + [52, 239], + [53, 238], + [54, 236], + [55, 235], + [56, 233], + [57, 232], + [58, 231], + [59, 229], + [60, 228], + [61, 226], + [62, 225], + [63, 223], + [64, 222], + [65, 221], + [66, 220], + [67, 219], + [68, 219], + [69, 218], + [70, 217], + [71, 216], + [72, 216], + [73, 215], + [74, 214], + [75, 213], + [76, 213], + [77, 212], + [78, 211], + [79, 211], + [80, 210], + [81, 209], + [82, 208], + [83, 208], + [84, 207], + [85, 206], + [86, 205], + [87, 205], + [88, 204], + [89, 203], + [90, 202], + [91, 202], + [92, 201], + [93, 200], + [94, 199], + [95, 199], + [96, 198], + [97, 197], + [98, 196], + [99, 196], + [100, 195], + [101, 194], + [102, 193], + [103, 193], + [104, 192], + [105, 191], + [106, 191], + [107, 190], + [108, 189], + [109, 188], + [110, 188], + [111, 187], + [112, 186], + [113, 185], + [114, 185], + [115, 184], + [116, 183], + [117, 182], + [118, 182], + [119, 181], + [120, 180], + [121, 179], + [122, 179], + [123, 178], + [124, 177], + [125, 176], + [126, 176], + [127, 175], + [128, 174] + ], + "d": "Discount gas costs of calls to the MultiExp precompiles with `k` (point, scalar) pair" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/2565.ts b/packages/web3-eth-accounts/src/common/eips/2565.ts new file mode 100644 index 00000000000..1c1743e9a16 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/2565.ts @@ -0,0 +1,18 @@ +export default { + "name": "EIP-2565", + "number": 2565, + "comment": "ModExp gas cost", + "url": "https://eips.ethereum.org/EIPS/eip-2565", + "status": "Final", + "minimumHardfork": "byzantium", + "gasConfig": {}, + "gasPrices": { + "modexpGquaddivisor": { + "v": 3, + "d": "Gquaddivisor from modexp precompile for gas calculation" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/2718.ts b/packages/web3-eth-accounts/src/common/eips/2718.ts new file mode 100644 index 00000000000..f8815c6d7b1 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/2718.ts @@ -0,0 +1,12 @@ +export default { + "name": "EIP-2718", + "comment": "Typed Transaction Envelope", + "url": "https://eips.ethereum.org/EIPS/eip-2718", + "status": "Final", + "minimumHardfork": "chainstart", + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/2929.ts b/packages/web3-eth-accounts/src/common/eips/2929.ts new file mode 100644 index 00000000000..f52dc217d3f --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/2929.ts @@ -0,0 +1,85 @@ +export default { + "name": "EIP-2929", + "comment": "Gas cost increases for state access opcodes", + "url": "https://eips.ethereum.org/EIPS/eip-2929", + "status": "Final", + "minimumHardfork": "chainstart", + "gasConfig": {}, + "gasPrices": { + "coldsload": { + "v": 2100, + "d": "Gas cost of the first read of storage from a given location (per transaction)" + }, + "coldaccountaccess": { + "v": 2600, + "d": "Gas cost of the first read of a given address (per transaction)" + }, + "warmstorageread": { + "v": 100, + "d": "Gas cost of reading storage locations which have already loaded 'cold'" + }, + "sstoreCleanGasEIP2200": { + "v": 2900, + "d": "Once per SSTORE operation from clean non-zero to something else" + }, + "sstoreNoopGasEIP2200": { + "v": 100, + "d": "Once per SSTORE operation if the value doesn't change" + }, + "sstoreDirtyGasEIP2200": { + "v": 100, + "d": "Once per SSTORE operation if a dirty value is changed" + }, + "sstoreInitRefundEIP2200": { + "v": 19900, + "d": "Once per SSTORE operation for resetting to the original zero value" + }, + "sstoreCleanRefundEIP2200": { + "v": 4900, + "d": "Once per SSTORE operation for resetting to the original non-zero value" + }, + "call": { + "v": 0, + "d": "Base fee of the CALL opcode" + }, + "callcode": { + "v": 0, + "d": "Base fee of the CALLCODE opcode" + }, + "delegatecall": { + "v": 0, + "d": "Base fee of the DELEGATECALL opcode" + }, + "staticcall": { + "v": 0, + "d": "Base fee of the STATICCALL opcode" + }, + "balance": { + "v": 0, + "d": "Base fee of the BALANCE opcode" + }, + "extcodesize": { + "v": 0, + "d": "Base fee of the EXTCODESIZE opcode" + }, + "extcodecopy": { + "v": 0, + "d": "Base fee of the EXTCODECOPY opcode" + }, + "extcodehash": { + "v": 0, + "d": "Base fee of the EXTCODEHASH opcode" + }, + "sload": { + "v": 0, + "d": "Base fee of the SLOAD opcode" + }, + "sstore": { + "v": 0, + "d": "Base fee of the SSTORE opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/2930.ts b/packages/web3-eth-accounts/src/common/eips/2930.ts new file mode 100644 index 00000000000..52500d0c94a --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/2930.ts @@ -0,0 +1,22 @@ +export default { + "name": "EIP-2930", + "comment": "Optional access lists", + "url": "https://eips.ethereum.org/EIPS/eip-2930", + "status": "Final", + "minimumHardfork": "istanbul", + "requiredEIPs": [2718, 2929], + "gasConfig": {}, + "gasPrices": { + "accessListStorageKeyCost": { + "v": 1900, + "d": "Gas cost per storage key in an Access List transaction" + }, + "accessListAddressCost": { + "v": 2400, + "d": "Gas cost per storage key in an Access List transaction" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3074.ts b/packages/web3-eth-accounts/src/common/eips/3074.ts new file mode 100644 index 00000000000..538b0569819 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3074.ts @@ -0,0 +1,26 @@ +export default { + "name": "EIP-3074", + "number": 3074, + "comment": "AUTH and AUTHCALL opcodes", + "url": "https://eips.ethereum.org/EIPS/eip-3074", + "status": "Review", + "minimumHardfork": "london", + "gasConfig": {}, + "gasPrices": { + "auth": { + "v": 3100, + "d": "Gas cost of the AUTH opcode" + }, + "authcall": { + "v": 0, + "d": "Gas cost of the AUTHCALL opcode" + }, + "authcallValueTransfer": { + "v": 6700, + "d": "Paid for CALL when the value transfer is non-zero" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3198.ts b/packages/web3-eth-accounts/src/common/eips/3198.ts new file mode 100644 index 00000000000..d949d976359 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3198.ts @@ -0,0 +1,18 @@ +export default { + "name": "EIP-3198", + "number": 3198, + "comment": "BASEFEE opcode", + "url": "https://eips.ethereum.org/EIPS/eip-3198", + "status": "Final", + "minimumHardfork": "london", + "gasConfig": {}, + "gasPrices": { + "basefee": { + "v": 2, + "d": "Gas cost of the BASEFEE opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3529.ts b/packages/web3-eth-accounts/src/common/eips/3529.ts new file mode 100644 index 00000000000..2e8b0e39888 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3529.ts @@ -0,0 +1,27 @@ +export default { + "name": "EIP-3529", + "comment": "Reduction in refunds", + "url": "https://eips.ethereum.org/EIPS/eip-3529", + "status": "Final", + "minimumHardfork": "berlin", + "requiredEIPs": [2929], + "gasConfig": { + "maxRefundQuotient": { + "v": 5, + "d": "Maximum refund quotient; max tx refund is min(tx.gasUsed/maxRefundQuotient, tx.gasRefund)" + } + }, + "gasPrices": { + "selfdestructRefund": { + "v": 0, + "d": "Refunded following a selfdestruct operation" + }, + "sstoreClearRefundEIP2200": { + "v": 4800, + "d": "Once per SSTORE operation for clearing an originally existing storage slot" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3540.ts b/packages/web3-eth-accounts/src/common/eips/3540.ts new file mode 100644 index 00000000000..39fdb91ee43 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3540.ts @@ -0,0 +1,14 @@ +export default { + "name": "EIP-3540", + "number": 3540, + "comment": "EVM Object Format (EOF) v1", + "url": "https://eips.ethereum.org/EIPS/eip-3540", + "status": "Review", + "minimumHardfork": "london", + "requiredEIPs": [3541], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3541.ts b/packages/web3-eth-accounts/src/common/eips/3541.ts new file mode 100644 index 00000000000..b3e7a0ce823 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3541.ts @@ -0,0 +1,13 @@ +export default { + "name": "EIP-3541", + "comment": "Reject new contracts starting with the 0xEF byte", + "url": "https://eips.ethereum.org/EIPS/eip-3541", + "status": "Final", + "minimumHardfork": "berlin", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3554.ts b/packages/web3-eth-accounts/src/common/eips/3554.ts new file mode 100644 index 00000000000..36a9d16ecf2 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3554.ts @@ -0,0 +1,18 @@ +export default { + "name": "EIP-3554", + "comment": "Reduction in refunds", + "url": "Difficulty Bomb Delay to December 1st 2021", + "status": "Final", + "minimumHardfork": "muirGlacier", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": { + "difficultyBombDelay": { + "v": 9500000, + "d": "the amount of blocks to delay the difficulty bomb with" + } + } +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3607.ts b/packages/web3-eth-accounts/src/common/eips/3607.ts new file mode 100644 index 00000000000..6c122728e68 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3607.ts @@ -0,0 +1,14 @@ +export default { + "name": "EIP-3607", + "number": 3607, + "comment": "Reject transactions from senders with deployed code", + "url": "https://eips.ethereum.org/EIPS/eip-3607", + "status": "Final", + "minimumHardfork": "chainstart", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3651.ts b/packages/web3-eth-accounts/src/common/eips/3651.ts new file mode 100644 index 00000000000..c6ebe81da92 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3651.ts @@ -0,0 +1,14 @@ +export default { + "name": "EIP-3651", + "number": 3198, + "comment": "Warm COINBASE", + "url": "https://eips.ethereum.org/EIPS/eip-3651", + "status": "Review", + "minimumHardfork": "london", + "requiredEIPs": [2929], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3670.ts b/packages/web3-eth-accounts/src/common/eips/3670.ts new file mode 100644 index 00000000000..5b36d99b71f --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3670.ts @@ -0,0 +1,14 @@ +export default { + "name": "EIP-3670", + "number": 3670, + "comment": "EOF - Code Validation", + "url": "https://eips.ethereum.org/EIPS/eip-3670", + "status": "Review", + "minimumHardfork": "london", + "requiredEIPs": [3540], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3675.ts b/packages/web3-eth-accounts/src/common/eips/3675.ts new file mode 100644 index 00000000000..a80350300c7 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3675.ts @@ -0,0 +1,14 @@ +export default { + "name": "EIP-3675", + "number": 3675, + "comment": "Upgrade consensus to Proof-of-Stake", + "url": "https://eips.ethereum.org/EIPS/eip-3675", + "status": "Final", + "minimumHardfork": "london", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3855.ts b/packages/web3-eth-accounts/src/common/eips/3855.ts new file mode 100644 index 00000000000..2f5ac0641a5 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3855.ts @@ -0,0 +1,19 @@ +export default { + "name": "EIP-3855", + "number": 3855, + "comment": "PUSH0 instruction", + "url": "https://eips.ethereum.org/EIPS/eip-3855", + "status": "Review", + "minimumHardfork": "chainstart", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": { + "push0": { + "v": 2, + "d": "Base fee of the PUSH0 opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/3860.ts b/packages/web3-eth-accounts/src/common/eips/3860.ts new file mode 100644 index 00000000000..0e1aeb999db --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/3860.ts @@ -0,0 +1,24 @@ +export default { + "name": "EIP-3860", + "number": 3860, + "comment": "Limit and meter initcode", + "url": "https://eips.ethereum.org/EIPS/eip-3860", + "status": "Review", + "minimumHardfork": "spuriousDragon", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": { + "initCodeWordCost": { + "v": 2, + "d": "Gas to pay for each word (32 bytes) of initcode when creating a contract" + } + }, + "vm": { + "maxInitCodeSize": { + "v": 49152, + "d": "Maximum length of initialization code when creating a contract" + } + }, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/4345.ts b/packages/web3-eth-accounts/src/common/eips/4345.ts new file mode 100644 index 00000000000..0e571b327c2 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/4345.ts @@ -0,0 +1,18 @@ +export default { + "name": "EIP-4345", + "number": 4345, + "comment": "Difficulty Bomb Delay to June 2022", + "url": "https://eips.ethereum.org/EIPS/eip-4345", + "status": "Final", + "minimumHardfork": "london", + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": { + "difficultyBombDelay": { + "v": 10700000, + "d": "the amount of blocks to delay the difficulty bomb with" + } + } +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/4399.ts b/packages/web3-eth-accounts/src/common/eips/4399.ts new file mode 100644 index 00000000000..ed948d629de --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/4399.ts @@ -0,0 +1,14 @@ +export default { + "name": "EIP-4399", + "number": 4399, + "comment": "Supplant DIFFICULTY opcode with PREVRANDAO", + "url": "https://eips.ethereum.org/EIPS/eip-4399", + "status": "Review", + "minimumHardfork": "london", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/4844.ts b/packages/web3-eth-accounts/src/common/eips/4844.ts new file mode 100644 index 00000000000..2795067c841 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/4844.ts @@ -0,0 +1,58 @@ +export default { + "name": "EIP-4844", + "number": 4844, + "comment": "Shard Blob Transactions", + "url": "https://eips.ethereum.org/EIPS/eip-4844", + "status": "Draft", + "minimumHardfork": "merge", + "requiredEIPs": [1559, 2718, 2930, 4895], + "gasConfig": { + "dataGasPerBlob": { + "v": 131072, + "d": "The base fee for data gas per blob" + }, + "targetDataGasPerBlock": { + "v": 262144, + "d": "The target data gas consumed per block" + }, + "maxDataGasPerBlock": { + "v": 524288, + "d": "The max data gas allowable per block" + }, + "dataGasPriceUpdateFraction": { + "v": 2225652, + "d": "The denominator used in the exponential when calculating a data gas price" + } + }, + "gasPrices": { + "simpleGasPerBlob": { + "v": 12000, + "d": "The basic gas fee for each blob" + }, + "minDataGasPrice": { + "v": 1, + "d": "The minimum fee per data gas" + }, + "kzgPointEvaluationGasPrecompilePrice": { + "v": 50000, + "d": "The fee associated with the point evaluation precompile" + }, + "datahash": { + "v": 3, + "d": "Base fee of the DATAHASH opcode" + } + }, + "sharding": { + "blobCommitmentVersionKzg": { + "v": 1, + "d": "The number indicated a versioned hash is a KZG commitment" + }, + "fieldElementsPerBlob": { + "v": 4096, + "d": "The number of field elements allowed per blob" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/4895.ts b/packages/web3-eth-accounts/src/common/eips/4895.ts new file mode 100644 index 00000000000..f70f2ec3b35 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/4895.ts @@ -0,0 +1,14 @@ +export default { + "name": "EIP-4895", + "number": 4895, + "comment": "Beacon chain push withdrawals as operations", + "url": "https://eips.ethereum.org/EIPS/eip-4895", + "status": "Review", + "minimumHardfork": "merge", + "requiredEIPs": [], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/5133.ts b/packages/web3-eth-accounts/src/common/eips/5133.ts new file mode 100644 index 00000000000..de3b55c9721 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/5133.ts @@ -0,0 +1,18 @@ +export default { + "name": "EIP-5133", + "number": 5133, + "comment": "Delaying Difficulty Bomb to mid-September 2022", + "url": "https://eips.ethereum.org/EIPS/eip-5133", + "status": "Draft", + "minimumHardfork": "grayGlacier", + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": { + "difficultyBombDelay": { + "v": 11400000, + "d": "the amount of blocks to delay the difficulty bomb with" + } + } +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/eips/index.ts b/packages/web3-eth-accounts/src/common/eips/index.ts new file mode 100644 index 00000000000..eeb5d952e27 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/eips/index.ts @@ -0,0 +1,63 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import e1153 from './1153.js'; +import e1559 from './1559.js'; +import e2315 from './2315.js'; +import e2537 from './2537.js'; +import e2565 from './2565.js'; +import e2718 from './2718.js'; +import e2929 from './2929.js'; +import e2930 from './2930.js'; +import e3198 from './3198.js'; +import e3529 from './3529.js'; +import e3540 from './3540.js'; +import e3541 from './3541.js'; +import e3554 from './3554.js'; +import e3607 from './3607.js'; +import e3651 from './3651.js'; +import e3670 from './3670.js'; +import e3675 from './3675.js'; +import e3855 from './3855.js'; +import e3860 from './3860.js'; +import e4345 from './4345.js'; +import e4399 from './4399.js'; +import e5133 from './5133.js'; + +export const EIPs: { [key: number]: any } = { + 1153: e1153, + 1559: e1559, + 2315: e2315, + 2537: e2537, + 2565: e2565, + 2718: e2718, + 2929: e2929, + 2930: e2930, + 3198: e3198, + 3529: e3529, + 3540: e3540, + 3541: e3541, + 3554: e3554, + 3607: e3607, + 3651: e3651, + 3670: e3670, + 3675: e3675, + 3855: e3855, + 3860: e3860, + 4345: e4345, + 4399: e4399, + 5133: e5133, +}; diff --git a/packages/web3-eth-accounts/src/common/enums.ts b/packages/web3-eth-accounts/src/common/enums.ts new file mode 100644 index 00000000000..0661dd0519b --- /dev/null +++ b/packages/web3-eth-accounts/src/common/enums.ts @@ -0,0 +1,105 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export enum Chain { + Mainnet = 1, + Goerli = 5, + Sepolia = 11155111, +} + +export enum Hardfork { + Chainstart = 'chainstart', + Homestead = 'homestead', + Dao = 'dao', + TangerineWhistle = 'tangerineWhistle', + SpuriousDragon = 'spuriousDragon', + Byzantium = 'byzantium', + Constantinople = 'constantinople', + Petersburg = 'petersburg', + Istanbul = 'istanbul', + MuirGlacier = 'muirGlacier', + Berlin = 'berlin', + London = 'london', + ArrowGlacier = 'arrowGlacier', + GrayGlacier = 'grayGlacier', + MergeForkIdTransition = 'mergeForkIdTransition', + Merge = 'merge', + Shanghai = 'shanghai', + ShardingForkDev = 'shardingFork', +} + +export enum ConsensusType { + ProofOfStake = 'pos', + ProofOfWork = 'pow', + ProofOfAuthority = 'poa', +} + +export enum ConsensusAlgorithm { + Ethash = 'ethash', + Clique = 'clique', + Casper = 'casper', +} + +export enum CustomChain { + /** + * Polygon (Matic) Mainnet + * + * - [Documentation](https://docs.matic.network/docs/develop/network-details/network) + */ + PolygonMainnet = 'polygon-mainnet', + + /** + * Polygon (Matic) Mumbai Testnet + * + * - [Documentation](https://docs.matic.network/docs/develop/network-details/network) + */ + PolygonMumbai = 'polygon-mumbai', + + /** + * Arbitrum Rinkeby Testnet + * + * - [Documentation](https://developer.offchainlabs.com/docs/public_testnet) + */ + ArbitrumRinkebyTestnet = 'arbitrum-rinkeby-testnet', + + /** + * Arbitrum One - mainnet for Arbitrum roll-up + * + * - [Documentation](https://developer.offchainlabs.com/public-chains) + */ + ArbitrumOne = 'arbitrum-one', + + /** + * xDai EVM sidechain with a native stable token + * + * - [Documentation](https://www.xdaichain.com/) + */ + xDaiChain = 'x-dai-chain', + + /** + * Optimistic Kovan - testnet for Optimism roll-up + * + * - [Documentation](https://community.optimism.io/docs/developers/tutorials.html) + */ + OptimisticKovan = 'optimistic-kovan', + + /** + * Optimistic Ethereum - mainnet for Optimism roll-up + * + * - [Documentation](https://community.optimism.io/docs/developers/tutorials.html) + */ + OptimisticEthereum = 'optimistic-ethereum', +} diff --git a/packages/web3-eth-accounts/src/common/hardforks/arrowGlacier.ts b/packages/web3-eth-accounts/src/common/hardforks/arrowGlacier.ts new file mode 100644 index 00000000000..e38f1782855 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/arrowGlacier.ts @@ -0,0 +1,12 @@ +export default { + "name": "arrowGlacier", + "comment": "HF to delay the difficulty bomb", + "url": "https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/arrow-glacier.md", + "status": "Final", + "eips": [4345], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/berlin.ts b/packages/web3-eth-accounts/src/common/hardforks/berlin.ts new file mode 100644 index 00000000000..df30229fb2e --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/berlin.ts @@ -0,0 +1,8 @@ +export default { + "name": "berlin", + "comment": "HF targeted for July 2020 following the Muir Glacier HF", + "url": "https://eips.ethereum.org/EIPS/eip-2070", + "status": "Final", + "eips": [2565, 2929, 2718, 2930] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/byzantium.ts b/packages/web3-eth-accounts/src/common/hardforks/byzantium.ts new file mode 100644 index 00000000000..2c358c8f6ff --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/byzantium.ts @@ -0,0 +1,57 @@ +export default { + "name": "byzantium", + "comment": "Hardfork with new precompiles, instructions and other protocol changes", + "url": "https://eips.ethereum.org/EIPS/eip-609", + "status": "Final", + "gasConfig": {}, + "gasPrices": { + "modexpGquaddivisor": { + "v": 20, + "d": "Gquaddivisor from modexp precompile for gas calculation" + }, + "ecAdd": { + "v": 500, + "d": "Gas costs for curve addition precompile" + }, + "ecMul": { + "v": 40000, + "d": "Gas costs for curve multiplication precompile" + }, + "ecPairing": { + "v": 100000, + "d": "Base gas costs for curve pairing precompile" + }, + "ecPairingWord": { + "v": 80000, + "d": "Gas costs regarding curve pairing precompile input length" + }, + "revert": { + "v": 0, + "d": "Base fee of the REVERT opcode" + }, + "staticcall": { + "v": 700, + "d": "Base fee of the STATICCALL opcode" + }, + "returndatasize": { + "v": 2, + "d": "Base fee of the RETURNDATASIZE opcode" + }, + "returndatacopy": { + "v": 3, + "d": "Base fee of the RETURNDATACOPY opcode" + } + }, + "vm": {}, + "pow": { + "minerReward": { + "v": "3000000000000000000", + "d": "the amount a miner get rewarded for mining a block" + }, + "difficultyBombDelay": { + "v": 3000000, + "d": "the amount of blocks to delay the difficulty bomb with" + } + } +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/chainstart.ts b/packages/web3-eth-accounts/src/common/hardforks/chainstart.ts new file mode 100644 index 00000000000..32f5630b5ff --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/chainstart.ts @@ -0,0 +1,439 @@ +export default { + "name": "chainstart", + "comment": "Start of the Ethereum main chain", + "url": "", + "status": "", + "gasConfig": { + "minGasLimit": { + "v": 5000, + "d": "Minimum the gas limit may ever be" + }, + "gasLimitBoundDivisor": { + "v": 1024, + "d": "The bound divisor of the gas limit, used in update calculations" + }, + "maxRefundQuotient": { + "v": 2, + "d": "Maximum refund quotient; max tx refund is min(tx.gasUsed/maxRefundQuotient, tx.gasRefund)" + } + }, + "gasPrices": { + "base": { + "v": 2, + "d": "Gas base cost, used e.g. for ChainID opcode (Istanbul)" + }, + "tierStep": { + "v": [0, 2, 3, 5, 8, 10, 20], + "d": "Once per operation, for a selection of them" + }, + "exp": { + "v": 10, + "d": "Base fee of the EXP opcode" + }, + "expByte": { + "v": 10, + "d": "Times ceil(log256(exponent)) for the EXP instruction" + }, + "sha3": { + "v": 30, + "d": "Base fee of the SHA3 opcode" + }, + "sha3Word": { + "v": 6, + "d": "Once per word of the SHA3 operation's data" + }, + "sload": { + "v": 50, + "d": "Base fee of the SLOAD opcode" + }, + "sstoreSet": { + "v": 20000, + "d": "Once per SSTORE operation if the zeroness changes from zero" + }, + "sstoreReset": { + "v": 5000, + "d": "Once per SSTORE operation if the zeroness does not change from zero" + }, + "sstoreRefund": { + "v": 15000, + "d": "Once per SSTORE operation if the zeroness changes to zero" + }, + "jumpdest": { + "v": 1, + "d": "Base fee of the JUMPDEST opcode" + }, + "log": { + "v": 375, + "d": "Base fee of the LOG opcode" + }, + "logData": { + "v": 8, + "d": "Per byte in a LOG* operation's data" + }, + "logTopic": { + "v": 375, + "d": "Multiplied by the * of the LOG*, per LOG transaction. e.g. LOG0 incurs 0 * c_txLogTopicGas, LOG4 incurs 4 * c_txLogTopicGas" + }, + "create": { + "v": 32000, + "d": "Base fee of the CREATE opcode" + }, + "call": { + "v": 40, + "d": "Base fee of the CALL opcode" + }, + "callStipend": { + "v": 2300, + "d": "Free gas given at beginning of call" + }, + "callValueTransfer": { + "v": 9000, + "d": "Paid for CALL when the value transfor is non-zero" + }, + "callNewAccount": { + "v": 25000, + "d": "Paid for CALL when the destination address didn't exist prior" + }, + "selfdestructRefund": { + "v": 24000, + "d": "Refunded following a selfdestruct operation" + }, + "memory": { + "v": 3, + "d": "Times the address of the (highest referenced byte in memory + 1). NOTE: referencing happens on read, write and in instructions such as RETURN and CALL" + }, + "quadCoeffDiv": { + "v": 512, + "d": "Divisor for the quadratic particle of the memory cost equation" + }, + "createData": { + "v": 200, + "d": "" + }, + "tx": { + "v": 21000, + "d": "Per transaction. NOTE: Not payable on data of calls between transactions" + }, + "txCreation": { + "v": 32000, + "d": "The cost of creating a contract via tx" + }, + "txDataZero": { + "v": 4, + "d": "Per byte of data attached to a transaction that equals zero. NOTE: Not payable on data of calls between transactions" + }, + "txDataNonZero": { + "v": 68, + "d": "Per byte of data attached to a transaction that is not equal to zero. NOTE: Not payable on data of calls between transactions" + }, + "copy": { + "v": 3, + "d": "Multiplied by the number of 32-byte words that are copied (round up) for any *COPY operation and added" + }, + "ecRecover": { + "v": 3000, + "d": "" + }, + "sha256": { + "v": 60, + "d": "" + }, + "sha256Word": { + "v": 12, + "d": "" + }, + "ripemd160": { + "v": 600, + "d": "" + }, + "ripemd160Word": { + "v": 120, + "d": "" + }, + "identity": { + "v": 15, + "d": "" + }, + "identityWord": { + "v": 3, + "d": "" + }, + "stop": { + "v": 0, + "d": "Base fee of the STOP opcode" + }, + "add": { + "v": 3, + "d": "Base fee of the ADD opcode" + }, + "mul": { + "v": 5, + "d": "Base fee of the MUL opcode" + }, + "sub": { + "v": 3, + "d": "Base fee of the SUB opcode" + }, + "div": { + "v": 5, + "d": "Base fee of the DIV opcode" + }, + "sdiv": { + "v": 5, + "d": "Base fee of the SDIV opcode" + }, + "mod": { + "v": 5, + "d": "Base fee of the MOD opcode" + }, + "smod": { + "v": 5, + "d": "Base fee of the SMOD opcode" + }, + "addmod": { + "v": 8, + "d": "Base fee of the ADDMOD opcode" + }, + "mulmod": { + "v": 8, + "d": "Base fee of the MULMOD opcode" + }, + "signextend": { + "v": 5, + "d": "Base fee of the SIGNEXTEND opcode" + }, + "lt": { + "v": 3, + "d": "Base fee of the LT opcode" + }, + "gt": { + "v": 3, + "d": "Base fee of the GT opcode" + }, + "slt": { + "v": 3, + "d": "Base fee of the SLT opcode" + }, + "sgt": { + "v": 3, + "d": "Base fee of the SGT opcode" + }, + "eq": { + "v": 3, + "d": "Base fee of the EQ opcode" + }, + "iszero": { + "v": 3, + "d": "Base fee of the ISZERO opcode" + }, + "and": { + "v": 3, + "d": "Base fee of the AND opcode" + }, + "or": { + "v": 3, + "d": "Base fee of the OR opcode" + }, + "xor": { + "v": 3, + "d": "Base fee of the XOR opcode" + }, + "not": { + "v": 3, + "d": "Base fee of the NOT opcode" + }, + "byte": { + "v": 3, + "d": "Base fee of the BYTE opcode" + }, + "address": { + "v": 2, + "d": "Base fee of the ADDRESS opcode" + }, + "balance": { + "v": 20, + "d": "Base fee of the BALANCE opcode" + }, + "origin": { + "v": 2, + "d": "Base fee of the ORIGIN opcode" + }, + "caller": { + "v": 2, + "d": "Base fee of the CALLER opcode" + }, + "callvalue": { + "v": 2, + "d": "Base fee of the CALLVALUE opcode" + }, + "calldataload": { + "v": 3, + "d": "Base fee of the CALLDATALOAD opcode" + }, + "calldatasize": { + "v": 2, + "d": "Base fee of the CALLDATASIZE opcode" + }, + "calldatacopy": { + "v": 3, + "d": "Base fee of the CALLDATACOPY opcode" + }, + "codesize": { + "v": 2, + "d": "Base fee of the CODESIZE opcode" + }, + "codecopy": { + "v": 3, + "d": "Base fee of the CODECOPY opcode" + }, + "gasprice": { + "v": 2, + "d": "Base fee of the GASPRICE opcode" + }, + "extcodesize": { + "v": 20, + "d": "Base fee of the EXTCODESIZE opcode" + }, + "extcodecopy": { + "v": 20, + "d": "Base fee of the EXTCODECOPY opcode" + }, + "blockhash": { + "v": 20, + "d": "Base fee of the BLOCKHASH opcode" + }, + "coinbase": { + "v": 2, + "d": "Base fee of the COINBASE opcode" + }, + "timestamp": { + "v": 2, + "d": "Base fee of the TIMESTAMP opcode" + }, + "number": { + "v": 2, + "d": "Base fee of the NUMBER opcode" + }, + "difficulty": { + "v": 2, + "d": "Base fee of the DIFFICULTY opcode" + }, + "gaslimit": { + "v": 2, + "d": "Base fee of the GASLIMIT opcode" + }, + "pop": { + "v": 2, + "d": "Base fee of the POP opcode" + }, + "mload": { + "v": 3, + "d": "Base fee of the MLOAD opcode" + }, + "mstore": { + "v": 3, + "d": "Base fee of the MSTORE opcode" + }, + "mstore8": { + "v": 3, + "d": "Base fee of the MSTORE8 opcode" + }, + "sstore": { + "v": 0, + "d": "Base fee of the SSTORE opcode" + }, + "jump": { + "v": 8, + "d": "Base fee of the JUMP opcode" + }, + "jumpi": { + "v": 10, + "d": "Base fee of the JUMPI opcode" + }, + "pc": { + "v": 2, + "d": "Base fee of the PC opcode" + }, + "msize": { + "v": 2, + "d": "Base fee of the MSIZE opcode" + }, + "gas": { + "v": 2, + "d": "Base fee of the GAS opcode" + }, + "push": { + "v": 3, + "d": "Base fee of the PUSH opcode" + }, + "dup": { + "v": 3, + "d": "Base fee of the DUP opcode" + }, + "swap": { + "v": 3, + "d": "Base fee of the SWAP opcode" + }, + "callcode": { + "v": 40, + "d": "Base fee of the CALLCODE opcode" + }, + "return": { + "v": 0, + "d": "Base fee of the RETURN opcode" + }, + "invalid": { + "v": 0, + "d": "Base fee of the INVALID opcode" + }, + "selfdestruct": { + "v": 0, + "d": "Base fee of the SELFDESTRUCT opcode" + } + }, + "vm": { + "stackLimit": { + "v": 1024, + "d": "Maximum size of VM stack allowed" + }, + "callCreateDepth": { + "v": 1024, + "d": "Maximum depth of call/create stack" + }, + "maxExtraDataSize": { + "v": 32, + "d": "Maximum size extra data may be after Genesis" + } + }, + "pow": { + "minimumDifficulty": { + "v": 131072, + "d": "The minimum that the difficulty may ever be" + }, + "difficultyBoundDivisor": { + "v": 2048, + "d": "The bound divisor of the difficulty, used in the update calculations" + }, + "durationLimit": { + "v": 13, + "d": "The decision boundary on the blocktime duration used to determine whether difficulty should go up or not" + }, + "epochDuration": { + "v": 30000, + "d": "Duration between proof-of-work epochs" + }, + "timebombPeriod": { + "v": 100000, + "d": "Exponential difficulty timebomb period" + }, + "minerReward": { + "v": "5000000000000000000", + "d": "the amount a miner get rewarded for mining a block" + }, + "difficultyBombDelay": { + "v": 0, + "d": "the amount of blocks to delay the difficulty bomb with" + } + } +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/constantinople.ts b/packages/web3-eth-accounts/src/common/hardforks/constantinople.ts new file mode 100644 index 00000000000..dd576fe1575 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/constantinople.ts @@ -0,0 +1,69 @@ +export default { + "name": "constantinople", + "comment": "Postponed hardfork including EIP-1283 (SSTORE gas metering changes)", + "url": "https://eips.ethereum.org/EIPS/eip-1013", + "status": "Final", + "gasConfig": {}, + "gasPrices": { + "netSstoreNoopGas": { + "v": 200, + "d": "Once per SSTORE operation if the value doesn't change" + }, + "netSstoreInitGas": { + "v": 20000, + "d": "Once per SSTORE operation from clean zero" + }, + "netSstoreCleanGas": { + "v": 5000, + "d": "Once per SSTORE operation from clean non-zero" + }, + "netSstoreDirtyGas": { + "v": 200, + "d": "Once per SSTORE operation from dirty" + }, + "netSstoreClearRefund": { + "v": 15000, + "d": "Once per SSTORE operation for clearing an originally existing storage slot" + }, + "netSstoreResetRefund": { + "v": 4800, + "d": "Once per SSTORE operation for resetting to the original non-zero value" + }, + "netSstoreResetClearRefund": { + "v": 19800, + "d": "Once per SSTORE operation for resetting to the original zero value" + }, + "shl": { + "v": 3, + "d": "Base fee of the SHL opcode" + }, + "shr": { + "v": 3, + "d": "Base fee of the SHR opcode" + }, + "sar": { + "v": 3, + "d": "Base fee of the SAR opcode" + }, + "extcodehash": { + "v": 400, + "d": "Base fee of the EXTCODEHASH opcode" + }, + "create2": { + "v": 32000, + "d": "Base fee of the CREATE2 opcode" + } + }, + "vm": {}, + "pow": { + "minerReward": { + "v": "2000000000000000000", + "d": "The amount a miner gets rewarded for mining a block" + }, + "difficultyBombDelay": { + "v": 5000000, + "d": "the amount of blocks to delay the difficulty bomb with" + } + } +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/dao.ts b/packages/web3-eth-accounts/src/common/hardforks/dao.ts new file mode 100644 index 00000000000..a565ec89a42 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/dao.ts @@ -0,0 +1,11 @@ +export default { + "name": "dao", + "comment": "DAO rescue hardfork", + "url": "https://eips.ethereum.org/EIPS/eip-779", + "status": "Final", + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/grayGlacier.ts b/packages/web3-eth-accounts/src/common/hardforks/grayGlacier.ts new file mode 100644 index 00000000000..3c67d73e7af --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/grayGlacier.ts @@ -0,0 +1,12 @@ +export default { + "name": "grayGlacier", + "comment": "Delaying the difficulty bomb to Mid September 2022", + "url": "https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/gray-glacier.md", + "status": "Draft", + "eips": [5133], + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/homestead.ts b/packages/web3-eth-accounts/src/common/hardforks/homestead.ts new file mode 100644 index 00000000000..e6521fc46ab --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/homestead.ts @@ -0,0 +1,16 @@ +export default { + "name": "homestead", + "comment": "Homestead hardfork with protocol and network changes", + "url": "https://eips.ethereum.org/EIPS/eip-606", + "status": "Final", + "gasConfig": {}, + "gasPrices": { + "delegatecall": { + "v": 40, + "d": "Base fee of the DELEGATECALL opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/index.ts b/packages/web3-eth-accounts/src/common/hardforks/index.ts new file mode 100644 index 00000000000..6f646d19836 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/index.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import chainstart from './chainstart.js'; +import dao from './dao.js'; +import homestead from './homestead.js'; +import tangerineWhistle from './tangerineWhistle.js'; +import spuriousDragon from './spuriousDragon.js'; +import byzantium from './byzantium.js'; +import constantinople from './constantinople.js'; +import petersburg from './petersburg.js'; +import istanbul from './istanbul.js'; +import muirGlacier from './muirGlacier.js'; +import berlin from './berlin.js'; +import london from './london.js'; +import shanghai from './shanghai.js'; +import arrowGlacier from './arrowGlacier.js'; +import grayGlacier from './grayGlacier.js'; +import mergeForkIdTransition from './mergeForkIdTransition.js'; +import merge from './merge.js'; + +export const hardforks: { [key: string]: any } = { + chainstart, + homestead, + dao, + tangerineWhistle, + spuriousDragon, + byzantium, + constantinople, + petersburg, + istanbul, + muirGlacier, + berlin, + london, + shanghai, + arrowGlacier, + grayGlacier, + mergeForkIdTransition, + merge, +}; diff --git a/packages/web3-eth-accounts/src/common/hardforks/istanbul.ts b/packages/web3-eth-accounts/src/common/hardforks/istanbul.ts new file mode 100644 index 00000000000..96f3a66c598 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/istanbul.ts @@ -0,0 +1,88 @@ +export default { + "name": "istanbul", + "comment": "HF targeted for December 2019 following the Constantinople/Petersburg HF", + "url": "https://eips.ethereum.org/EIPS/eip-1679", + "status": "Final", + "gasConfig": {}, + "gasPrices": { + "blake2Round": { + "v": 1, + "d": "Gas cost per round for the Blake2 F precompile" + }, + "ecAdd": { + "v": 150, + "d": "Gas costs for curve addition precompile" + }, + "ecMul": { + "v": 6000, + "d": "Gas costs for curve multiplication precompile" + }, + "ecPairing": { + "v": 45000, + "d": "Base gas costs for curve pairing precompile" + }, + "ecPairingWord": { + "v": 34000, + "d": "Gas costs regarding curve pairing precompile input length" + }, + "txDataNonZero": { + "v": 16, + "d": "Per byte of data attached to a transaction that is not equal to zero. NOTE: Not payable on data of calls between transactions" + }, + "sstoreSentryGasEIP2200": { + "v": 2300, + "d": "Minimum gas required to be present for an SSTORE call, not consumed" + }, + "sstoreNoopGasEIP2200": { + "v": 800, + "d": "Once per SSTORE operation if the value doesn't change" + }, + "sstoreDirtyGasEIP2200": { + "v": 800, + "d": "Once per SSTORE operation if a dirty value is changed" + }, + "sstoreInitGasEIP2200": { + "v": 20000, + "d": "Once per SSTORE operation from clean zero to non-zero" + }, + "sstoreInitRefundEIP2200": { + "v": 19200, + "d": "Once per SSTORE operation for resetting to the original zero value" + }, + "sstoreCleanGasEIP2200": { + "v": 5000, + "d": "Once per SSTORE operation from clean non-zero to something else" + }, + "sstoreCleanRefundEIP2200": { + "v": 4200, + "d": "Once per SSTORE operation for resetting to the original non-zero value" + }, + "sstoreClearRefundEIP2200": { + "v": 15000, + "d": "Once per SSTORE operation for clearing an originally existing storage slot" + }, + "balance": { + "v": 700, + "d": "Base fee of the BALANCE opcode" + }, + "extcodehash": { + "v": 700, + "d": "Base fee of the EXTCODEHASH opcode" + }, + "chainid": { + "v": 2, + "d": "Base fee of the CHAINID opcode" + }, + "selfbalance": { + "v": 5, + "d": "Base fee of the SELFBALANCE opcode" + }, + "sload": { + "v": 800, + "d": "Base fee of the SLOAD opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/london.ts b/packages/web3-eth-accounts/src/common/hardforks/london.ts new file mode 100644 index 00000000000..6d0ec4a4468 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/london.ts @@ -0,0 +1,8 @@ +export default { + "name": "london", + "comment": "HF targeted for July 2021 following the Berlin fork", + "url": "https://github.com/ethereum/eth1.0-specs/blob/master/network-upgrades/mainnet-upgrades/london.md", + "status": "Final", + "eips": [1559, 3198, 3529, 3541] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/merge.ts b/packages/web3-eth-accounts/src/common/hardforks/merge.ts new file mode 100644 index 00000000000..db48aa32509 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/merge.ts @@ -0,0 +1,13 @@ +export default { + "name": "merge", + "comment": "Hardfork to upgrade the consensus mechanism to Proof-of-Stake", + "url": "https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/merge.md", + "status": "Final", + "consensus": { + "type": "pos", + "algorithm": "casper", + "casper": {} + }, + "eips": [3675, 4399] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/mergeForkIdTransition.ts b/packages/web3-eth-accounts/src/common/hardforks/mergeForkIdTransition.ts new file mode 100644 index 00000000000..f4df67bd2d2 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/mergeForkIdTransition.ts @@ -0,0 +1,8 @@ +export default { + "name": "mergeForkIdTransition", + "comment": "Pre-merge hardfork to fork off non-upgraded clients", + "url": "https://eips.ethereum.org/EIPS/eip-3675", + "status": "Draft", + "eips": [] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/muirGlacier.ts b/packages/web3-eth-accounts/src/common/hardforks/muirGlacier.ts new file mode 100644 index 00000000000..a7d02c6147e --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/muirGlacier.ts @@ -0,0 +1,16 @@ +export default { + "name": "muirGlacier", + "comment": "HF to delay the difficulty bomb", + "url": "https://eips.ethereum.org/EIPS/eip-2384", + "status": "Final", + "gasConfig": {}, + "gasPrices": {}, + "vm": {}, + "pow": { + "difficultyBombDelay": { + "v": 9000000, + "d": "the amount of blocks to delay the difficulty bomb with" + } + } +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/petersburg.ts b/packages/web3-eth-accounts/src/common/hardforks/petersburg.ts new file mode 100644 index 00000000000..cca4005f893 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/petersburg.ts @@ -0,0 +1,40 @@ +export default { + "name": "petersburg", + "comment": "Aka constantinopleFix, removes EIP-1283, activate together with or after constantinople", + "url": "https://eips.ethereum.org/EIPS/eip-1716", + "status": "Final", + "gasConfig": {}, + "gasPrices": { + "netSstoreNoopGas": { + "v": null, + "d": "Removed along EIP-1283" + }, + "netSstoreInitGas": { + "v": null, + "d": "Removed along EIP-1283" + }, + "netSstoreCleanGas": { + "v": null, + "d": "Removed along EIP-1283" + }, + "netSstoreDirtyGas": { + "v": null, + "d": "Removed along EIP-1283" + }, + "netSstoreClearRefund": { + "v": null, + "d": "Removed along EIP-1283" + }, + "netSstoreResetRefund": { + "v": null, + "d": "Removed along EIP-1283" + }, + "netSstoreResetClearRefund": { + "v": null, + "d": "Removed along EIP-1283" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/shanghai.ts b/packages/web3-eth-accounts/src/common/hardforks/shanghai.ts new file mode 100644 index 00000000000..736e331a89e --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/shanghai.ts @@ -0,0 +1,8 @@ +export default { + "name": "shanghai", + "comment": "Next feature hardfork after the merge hardfork having withdrawals, warm coinbase, push0, limit/meter initcode", + "url": "https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md", + "status": "Final", + "eips": [3651, 3855, 3860, 4895] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/sharding.ts b/packages/web3-eth-accounts/src/common/hardforks/sharding.ts new file mode 100644 index 00000000000..e164e5f84d7 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/sharding.ts @@ -0,0 +1,8 @@ +export default { + "name": "shardingFork", + "comment": "Internal hardfork to test proto-danksharding (do not use in production)", + "url": "https://eips.ethereum.org/EIPS/eip-4844", + "status": "Experimental", + "eips": [4844] +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/spuriousDragon.ts b/packages/web3-eth-accounts/src/common/hardforks/spuriousDragon.ts new file mode 100644 index 00000000000..e1ed0eda36c --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/spuriousDragon.ts @@ -0,0 +1,21 @@ +export default { + "name": "spuriousDragon", + "comment": "HF with EIPs for simple replay attack protection, EXP cost increase, state trie clearing, contract code size limit", + "url": "https://eips.ethereum.org/EIPS/eip-607", + "status": "Final", + "gasConfig": {}, + "gasPrices": { + "expByte": { + "v": 50, + "d": "Times ceil(log256(exponent)) for the EXP instruction" + } + }, + "vm": { + "maxCodeSize": { + "v": 24576, + "d": "Maximum length of contract code" + } + }, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/hardforks/tangerineWhistle.ts b/packages/web3-eth-accounts/src/common/hardforks/tangerineWhistle.ts new file mode 100644 index 00000000000..ffb2bf43594 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/hardforks/tangerineWhistle.ts @@ -0,0 +1,44 @@ +export default { + "name": "tangerineWhistle", + "comment": "Hardfork with gas cost changes for IO-heavy operations", + "url": "https://eips.ethereum.org/EIPS/eip-608", + "status": "Final", + "gasConfig": {}, + "gasPrices": { + "sload": { + "v": 200, + "d": "Once per SLOAD operation" + }, + "call": { + "v": 700, + "d": "Once per CALL operation & message call transaction" + }, + "extcodesize": { + "v": 700, + "d": "Base fee of the EXTCODESIZE opcode" + }, + "extcodecopy": { + "v": 700, + "d": "Base fee of the EXTCODECOPY opcode" + }, + "balance": { + "v": 400, + "d": "Base fee of the BALANCE opcode" + }, + "delegatecall": { + "v": 700, + "d": "Base fee of the DELEGATECALL opcode" + }, + "callcode": { + "v": 700, + "d": "Base fee of the CALLCODE opcode" + }, + "selfdestruct": { + "v": 5000, + "d": "Base fee of the SELFDESTRUCT opcode" + } + }, + "vm": {}, + "pow": {} +} + ; \ No newline at end of file diff --git a/packages/web3-eth-accounts/src/common/index.ts b/packages/web3-eth-accounts/src/common/index.ts new file mode 100644 index 00000000000..3602a0f8f43 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/index.ts @@ -0,0 +1,21 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// @ethereumjs/common version 3.1.1 +export * from './common.js'; +export * from './enums.js'; +export * from './types.js'; +export * from './utils.js'; diff --git a/packages/web3-eth-accounts/src/common/types.ts b/packages/web3-eth-accounts/src/common/types.ts new file mode 100644 index 00000000000..9d5c0bbe261 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/types.ts @@ -0,0 +1,191 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import type { Chain, ConsensusAlgorithm, ConsensusType, Hardfork } from './enums.js'; + +export interface ChainName { + [chainId: string]: string; +} + +export type CliqueConfig = { + period: number; + epoch: number; +}; + +export type EthashConfig = Record; + +export type CasperConfig = Record; + +export interface GenesisBlockConfig { + timestamp?: string; + gasLimit: number; + difficulty: number; + nonce: string; + extraData: string; + baseFeePerGas?: string; +} + +export interface HardforkConfig { + name: Hardfork | string; + // eslint-disable-next-line @typescript-eslint/ban-types + block: number | null; // null is used for hardforks that should not be applied -- since `undefined` isn't a valid value in JSON + ttd?: bigint | string; + timestamp?: number | string; + // eslint-disable-next-line @typescript-eslint/ban-types + forkHash?: string | null; +} + +export interface BootstrapNodeConfig { + ip: string; + port: number | string; + network?: string; + chainId?: number; + id: string; + location: string; + comment: string; +} + +export interface ChainConfig { + name: string; + chainId: number | bigint; + networkId: number | bigint; + defaultHardfork?: string; + comment?: string; + url?: string; + genesis: GenesisBlockConfig; + hardforks: HardforkConfig[]; + bootstrapNodes?: BootstrapNodeConfig[]; + dnsNetworks?: string[]; + consensus: { + type: ConsensusType | string; + algorithm: ConsensusAlgorithm | string; + clique?: CliqueConfig; + ethash?: EthashConfig; + casper?: CasperConfig; + }; +} +export interface ChainsConfig { + [key: string]: ChainConfig | ChainName; +} + +interface BaseOpts { + /** + * String identifier ('byzantium') for hardfork or {@link Hardfork} enum. + * + * Default: Hardfork.London + */ + hardfork?: string | Hardfork; + /** + * Selected EIPs which can be activated, please use an array for instantiation + * (e.g. `eips: [ 2537, ]`) + * + * Currently supported: + * + * - [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537) - BLS12-381 precompiles + */ + eips?: number[]; +} + +/** + * Options for instantiating a {@link Common} instance. + */ +export interface CommonOpts extends BaseOpts { + /** + * Chain name ('mainnet'), id (1), or {@link Chain} enum, + * either from a chain directly supported or a custom chain + * passed in via {@link CommonOpts.customChains}. + */ + chain: string | number | Chain | bigint | object; + /** + * Initialize (in addition to the supported chains) with the selected + * custom chains. Custom genesis state should be passed to the Blockchain class if used. + * + * Usage (directly with the respective chain initialization via the {@link CommonOpts.chain} option): + * + * ```javascript + * import myCustomChain1 from '[PATH_TO_MY_CHAINS]/myCustomChain1.json' + * const common = new Common({ chain: 'myCustomChain1', customChains: [ myCustomChain1 ]}) + * ``` + */ + customChains?: ChainConfig[]; +} + +/** + * Options to be used with the {@link Common.custom} static constructor. + */ +export interface CustomCommonOpts extends BaseOpts { + /** + * The name (`mainnet`), id (`1`), or {@link Chain} enum of + * a standard chain used to base the custom chain params on. + */ + baseChain?: string | number | Chain | bigint; +} + +export interface GethConfigOpts extends BaseOpts { + chain?: string; + genesisHash?: Uint8Array; + mergeForkIdPostMerge?: boolean; +} + +/* + * A type that represents a `0x`-prefixed hex string. + */ +export type PrefixedHexString = string; + +/* + * A type that represents an input that can be converted to a Buffer. + */ +export type Uint8ArrayLike = Uint8Array | number[] | number | bigint | PrefixedHexString; + +/* + * A type that represents an input that can be converted to a BigInt. + */ +export type BigIntLike = bigint | PrefixedHexString | number | Uint8Array; + +/* + * A type that represents an object that has a `toArray()` method. + */ +export interface TransformableToArray { + toArray(): Uint8Array; +} + +export type NestedUint8Array = Array; +/** + * Type output options + */ +export enum TypeOutput { + Number, + BigInt, + Uint8Array, + PrefixedHexString, +} + +export type TypeOutputReturnType = { + [TypeOutput.Number]: number; + [TypeOutput.BigInt]: bigint; + [TypeOutput.Uint8Array]: Uint8Array; + [TypeOutput.PrefixedHexString]: PrefixedHexString; +}; +export type ToBytesInputTypes = + | PrefixedHexString + | number + | bigint + | Uint8Array + | number[] + | TransformableToArray + // eslint-disable-next-line @typescript-eslint/ban-types + | null + | undefined; diff --git a/packages/web3-eth-accounts/src/common/utils.ts b/packages/web3-eth-accounts/src/common/utils.ts new file mode 100644 index 00000000000..a1d46c36140 --- /dev/null +++ b/packages/web3-eth-accounts/src/common/utils.ts @@ -0,0 +1,581 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { isHexPrefixed, isHexString } from 'web3-validator'; +import { bytesToHex, hexToBytes, isUint8Array, numberToHex } from 'web3-utils'; +import { secp256k1 } from '../tx/constants.js'; +import { Hardfork } from './enums.js'; +import { ToBytesInputTypes, TypeOutput, TypeOutputReturnType } from './types.js'; + +type ConfigHardfork = + // eslint-disable-next-line @typescript-eslint/ban-types + | { name: string; block: null; timestamp: number } + | { name: string; block: number; timestamp?: number }; + +/** + * Removes '0x' from a given `String` if present + * @param str the string value + * @returns the string without 0x prefix + */ +export const stripHexPrefix = (str: string): string => { + if (typeof str !== 'string') + throw new Error(`[stripHexPrefix] input must be type 'string', received ${typeof str}`); + + return isHexPrefixed(str) ? str.slice(2) : str; +}; +/** + * Transforms Geth formatted nonce (i.e. hex string) to 8 byte 0x-prefixed string used internally + * @param nonce string parsed from the Geth genesis file + * @returns nonce as a 0x-prefixed 8 byte string + */ +function formatNonce(nonce: string): string { + if (!nonce || nonce === '0x0') { + return '0x0000000000000000'; + } + if (isHexPrefixed(nonce)) { + return `0x${stripHexPrefix(nonce).padStart(16, '0')}`; + } + return `0x${nonce.padStart(16, '0')}`; +} + +/** + * Converts a `Number` into a hex `String` + * @param {Number} i + * @return {String} + */ +const intToHex = function (i: number) { + if (!Number.isSafeInteger(i) || i < 0) { + throw new Error(`Received an invalid integer type: ${i}`); + } + return `0x${i.toString(16)}`; +}; + +/** + * Converts Geth genesis parameters to an EthereumJS compatible `CommonOpts` object + * @param json object representing the Geth genesis file + * @param optional mergeForkIdPostMerge which clarifies the placement of MergeForkIdTransition + * hardfork, which by default is post merge as with the merged eth networks but could also come + * before merge like in kiln genesis + * @returns genesis parameters in a `CommonOpts` compliant object + */ +function parseGethParams(json: any, mergeForkIdPostMerge = true) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { + name, + config, + difficulty, + mixHash, + gasLimit, + coinbase, + baseFeePerGas, + }: { + name: string; + config: any; + difficulty: string; + mixHash: string; + gasLimit: string; + coinbase: string; + baseFeePerGas: string; + } = json; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + let { extraData, timestamp, nonce }: { extraData: string; timestamp: string; nonce: string } = + json; + const genesisTimestamp = Number(timestamp); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { chainId }: { chainId: number } = config; + + // geth is not strictly putting empty fields with a 0x prefix + if (extraData === '') { + extraData = '0x'; + } + // geth may use number for timestamp + if (!isHexPrefixed(timestamp)) { + // eslint-disable-next-line radix + timestamp = intToHex(parseInt(timestamp)); + } + // geth may not give us a nonce strictly formatted to an 8 byte hex string + if (nonce.length !== 18) { + nonce = formatNonce(nonce); + } + + // EIP155 and EIP158 are both part of Spurious Dragon hardfork and must occur at the same time + // but have different configuration parameters in geth genesis parameters + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (config.eip155Block !== config.eip158Block) { + throw new Error( + 'EIP155 block number must equal EIP 158 block number since both are part of SpuriousDragon hardfork and the client only supports activating the full hardfork', + ); + } + + const params = { + name, + chainId, + networkId: chainId, + genesis: { + timestamp, + // eslint-disable-next-line radix + gasLimit: parseInt(gasLimit), // geth gasLimit and difficulty are hex strings while ours are `number`s + // eslint-disable-next-line radix + difficulty: parseInt(difficulty), + nonce, + extraData, + mixHash, + coinbase, + baseFeePerGas, + }, + hardfork: undefined as string | undefined, + hardforks: [] as ConfigHardfork[], + bootstrapNodes: [], + consensus: + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + config.clique !== undefined + ? { + type: 'poa', + algorithm: 'clique', + clique: { + // The recent geth genesis seems to be using blockperiodseconds + // and epochlength for clique specification + // see: https://hackmd.io/PqZgMpnkSWCWv5joJoFymQ + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + period: config.clique.period ?? config.clique.blockperiodseconds, + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + epoch: config.clique.epoch ?? config.clique.epochlength, + }, + } + : { + type: 'pow', + algorithm: 'ethash', + ethash: {}, + }, + }; + + const forkMap: { [key: string]: { name: string; postMerge?: boolean; isTimestamp?: boolean } } = + { + [Hardfork.Homestead]: { name: 'homesteadBlock' }, + [Hardfork.Dao]: { name: 'daoForkBlock' }, + [Hardfork.TangerineWhistle]: { name: 'eip150Block' }, + [Hardfork.SpuriousDragon]: { name: 'eip155Block' }, + [Hardfork.Byzantium]: { name: 'byzantiumBlock' }, + [Hardfork.Constantinople]: { name: 'constantinopleBlock' }, + [Hardfork.Petersburg]: { name: 'petersburgBlock' }, + [Hardfork.Istanbul]: { name: 'istanbulBlock' }, + [Hardfork.MuirGlacier]: { name: 'muirGlacierBlock' }, + [Hardfork.Berlin]: { name: 'berlinBlock' }, + [Hardfork.London]: { name: 'londonBlock' }, + [Hardfork.MergeForkIdTransition]: { + name: 'mergeForkBlock', + postMerge: mergeForkIdPostMerge, + }, + [Hardfork.Shanghai]: { name: 'shanghaiTime', postMerge: true, isTimestamp: true }, + [Hardfork.ShardingForkDev]: { + name: 'shardingForkTime', + postMerge: true, + isTimestamp: true, + }, + }; + + // forkMapRev is the map from config field name to Hardfork + const forkMapRev = Object.keys(forkMap).reduce<{ [key: string]: string }>((acc, elem) => { + acc[forkMap[elem].name] = elem; + return acc; + }, {}); + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + const configHardforkNames = Object.keys(config).filter( + // eslint-disable-next-line no-null/no-null, @typescript-eslint/no-unsafe-member-access + key => forkMapRev[key] !== undefined && config[key] !== undefined && config[key] !== null, + ); + + params.hardforks = configHardforkNames + .map(nameBlock => ({ + name: forkMapRev[nameBlock], + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + block: + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + forkMap[forkMapRev[nameBlock]].isTimestamp === true || + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + typeof config[nameBlock] !== 'number' + ? // eslint-disable-next-line no-null/no-null + null + : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + config[nameBlock], + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + timestamp: + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + forkMap[forkMapRev[nameBlock]].isTimestamp === true && + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + typeof config[nameBlock] === 'number' + ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + config[nameBlock] + : undefined, + })) + // eslint-disable-next-line no-null/no-null + .filter(fork => fork.block !== null || fork.timestamp !== undefined) as ConfigHardfork[]; + + params.hardforks.sort( + (a: ConfigHardfork, b: ConfigHardfork) => (a.block ?? Infinity) - (b.block ?? Infinity), + ); + + params.hardforks.sort( + (a: ConfigHardfork, b: ConfigHardfork) => + (a.timestamp ?? genesisTimestamp) - (b.timestamp ?? genesisTimestamp), + ); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (config.terminalTotalDifficulty !== undefined) { + // Following points need to be considered for placement of merge hf + // - Merge hardfork can't be placed at genesis + // - Place merge hf before any hardforks that require CL participation for e.g. withdrawals + // - Merge hardfork has to be placed just after genesis if any of the genesis hardforks make CL + // necessary for e.g. withdrawals + const mergeConfig = { + name: Hardfork.Merge, + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + ttd: config.terminalTotalDifficulty, + // eslint-disable-next-line no-null/no-null + block: null, + }; + + // Merge hardfork has to be placed before first hardfork that is dependent on merge + const postMergeIndex = params.hardforks.findIndex( + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + (hf: any) => forkMap[hf.name]?.postMerge === true, + ); + if (postMergeIndex !== -1) { + params.hardforks.splice(postMergeIndex, 0, mergeConfig as unknown as ConfigHardfork); + } else { + params.hardforks.push(mergeConfig as unknown as ConfigHardfork); + } + } + + const latestHardfork = params.hardforks.length > 0 ? params.hardforks.slice(-1)[0] : undefined; + params.hardfork = latestHardfork?.name; + params.hardforks.unshift({ name: Hardfork.Chainstart, block: 0 }); + + return params; +} + +/** + * Parses a genesis.json exported from Geth into parameters for Common instance + * @param json representing the Geth genesis file + * @param name optional chain name + * @returns parsed params + */ +export function parseGethGenesis(json: any, name?: string, mergeForkIdPostMerge?: boolean) { + try { + if (['config', 'difficulty', 'gasLimit', 'alloc'].some(field => !(field in json))) { + throw new Error('Invalid format, expected geth genesis fields missing'); + } + if (name !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-param-reassign + json.name = name; + } + return parseGethParams(json, mergeForkIdPostMerge); + } catch (e: any) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/restrict-template-expressions + throw new Error(`Error parsing parameters file: ${e.message}`); + } +} + +/** + * Pads a `String` to have an even length + * @param value + * @return output + */ +export function padToEven(value: string): string { + let a = value; + + if (typeof a !== 'string') { + throw new Error(`[padToEven] value must be type 'string', received ${typeof a}`); + } + + if (a.length % 2) a = `0${a}`; + + return a; +} + +/** + * Converts an `Number` to a `Uint8Array` + * @param {Number} i + * @return {Uint8Array} + */ +export const intToUint8Array = function (i: number) { + const hex = intToHex(i); + return hexToBytes(`0x${padToEven(hex.slice(2))}`); +}; + +/** + * Attempts to turn a value into a `Uint8Array`. + * Inputs supported: `Uint8Array` `String` (hex-prefixed), `Number`, null/undefined, `BigInt` and other objects + * with a `toArray()` or `toUint8Array()` method. + * @param v the value + */ +export const toUint8Array = function (v: ToBytesInputTypes): Uint8Array { + // eslint-disable-next-line no-null/no-null + if (v === null || v === undefined) { + return new Uint8Array(); + } + + if (v instanceof Uint8Array) { + return v; + } + + if (v?.constructor?.name === 'Uint8Array') { + return Uint8Array.from(v as unknown as Uint8Array); + } + + if (Array.isArray(v)) { + return Uint8Array.from(v); + } + + if (typeof v === 'string') { + if (!isHexString(v)) { + throw new Error( + `Cannot convert string to Uint8Array. only supports 0x-prefixed hex strings and this string was given: ${v}`, + ); + } + return hexToBytes(padToEven(stripHexPrefix(v))); + } + + if (typeof v === 'number') { + return toUint8Array(numberToHex(v)); + } + + if (typeof v === 'bigint') { + if (v < BigInt(0)) { + throw new Error(`Cannot convert negative bigint to Uint8Array. Given: ${v}`); + } + let n = v.toString(16); + if (n.length % 2) n = `0${n}`; + return toUint8Array(`0x${n}`); + } + + if (v.toArray) { + // converts a BN to a Uint8Array + return Uint8Array.from(v.toArray()); + } + + throw new Error('invalid type'); +}; + +/** + * Converts a {@link Uint8Array} to a {@link bigint} + */ +export function uint8ArrayToBigInt(buf: Uint8Array) { + const hex = bytesToHex(buf); + if (hex === '0x') { + return BigInt(0); + } + return BigInt(hex); +} + +/** + * Converts a {@link bigint} to a {@link Uint8Array} + */ +export function bigIntToUint8Array(num: bigint) { + return toUint8Array(`0x${num.toString(16)}`); +} + +/** + * Returns a Uint8Array filled with 0s. + * @param bytes the number of bytes the Uint8Array should be + */ +export const zeros = function (bytes: number): Uint8Array { + return new Uint8Array(bytes).fill(0); +}; + +/** + * Pads a `Uint8Array` with zeros till it has `length` bytes. + * Truncates the beginning or end of input if its length exceeds `length`. + * @param msg the value to pad (Uint8Array) + * @param length the number of bytes the output should be + * @param right whether to start padding form the left or right + * @return (Uint8Array) + */ +const setLength = function (msg: Uint8Array, length: number, right: boolean) { + const buf = zeros(length); + if (right) { + if (msg.length < length) { + buf.set(msg); + return buf; + } + return msg.subarray(0, length); + } + if (msg.length < length) { + buf.set(msg, length - msg.length); + return buf; + } + return msg.subarray(-length); +}; + +/** + * Throws if input is not a Uint8Array + * @param {Uint8Array} input value to check + */ +export function assertIsUint8Array(input: unknown): asserts input is Uint8Array { + if (!isUint8Array(input)) { + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + const msg = `This method only supports Uint8Array but input was: ${input}`; + throw new Error(msg); + } +} +/** + * Left Pads a `Uint8Array` with leading zeros till it has `length` bytes. + * Or it truncates the beginning if it exceeds. + * @param msg the value to pad (Uint8Array) + * @param length the number of bytes the output should be + * @return (Uint8Array) + */ +export const setLengthLeft = function (msg: Uint8Array, length: number) { + assertIsUint8Array(msg); + return setLength(msg, length, false); +}; + +/** + * Trims leading zeros from a `Uint8Array`, `String` or `Number[]`. + * @param a (Uint8Array|Array|String) + * @return (Uint8Array|Array|String) + */ +export function stripZeros(a: T): T { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + let first = a[0]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + while (a.length > 0 && first.toString() === '0') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, prefer-destructuring, @typescript-eslint/no-unsafe-call, no-param-reassign + a = a.slice(1) as T; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, prefer-destructuring, @typescript-eslint/no-unsafe-member-access + first = a[0]; + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return a; +} + +/** + * Trims leading zeros from a `Uint8Array`. + * @param a (Uint8Array) + * @return (Uint8Array) + */ +export const unpadUint8Array = function (a: Uint8Array): Uint8Array { + assertIsUint8Array(a); + return stripZeros(a); +}; + +/** + * Converts a {@link bigint} to a `0x` prefixed hex string + */ +export const bigIntToHex = (num: bigint) => `0x${num.toString(16)}`; + +/** + * Convert value from bigint to an unpadded Uint8Array + * (useful for RLP transport) + * @param value value to convert + */ +export function bigIntToUnpaddedUint8Array(value: bigint): Uint8Array { + return unpadUint8Array(bigIntToUint8Array(value)); +} + +function calculateSigRecovery(v: bigint, chainId?: bigint): bigint { + if (v === BigInt(0) || v === BigInt(1)) return v; + + if (chainId === undefined) { + return v - BigInt(27); + } + return v - (chainId * BigInt(2) + BigInt(35)); +} + +function isValidSigRecovery(recovery: bigint): boolean { + return recovery === BigInt(0) || recovery === BigInt(1); +} + +/** + * ECDSA public key recovery from signature. + * NOTE: Accepts `v === 0 | v === 1` for EIP1559 transactions + * @returns Recovered public key + */ +export const ecrecover = function ( + msgHash: Uint8Array, + v: bigint, + r: Uint8Array, + s: Uint8Array, + chainId?: bigint, +): Uint8Array { + const recovery = calculateSigRecovery(v, chainId); + if (!isValidSigRecovery(recovery)) { + throw new Error('Invalid signature v value'); + } + + const senderPubKey = new secp256k1.Signature(uint8ArrayToBigInt(r), uint8ArrayToBigInt(s)) + .addRecoveryBit(Number(recovery)) + .recoverPublicKey(msgHash) + .toRawBytes(false); + return senderPubKey.slice(1); +}; + +/** + * Convert an input to a specified type. + * Input of null/undefined returns null/undefined regardless of the output type. + * @param input value to convert + * @param outputType type to output + */ +// eslint-disable-next-line @typescript-eslint/ban-types +export function toType(input: null, outputType: T): null; +export function toType(input: undefined, outputType: T): undefined; +export function toType( + input: ToBytesInputTypes, + outputType: T, +): TypeOutputReturnType[T]; +export function toType( + input: ToBytesInputTypes, + outputType: T, + // eslint-disable-next-line @typescript-eslint/ban-types +): TypeOutputReturnType[T] | undefined | null { + // eslint-disable-next-line no-null/no-null + if (input === null) { + // eslint-disable-next-line no-null/no-null + return null; + } + if (input === undefined) { + return undefined; + } + + if (typeof input === 'string' && !isHexString(input)) { + throw new Error(`A string must be provided with a 0x-prefix, given: ${input}`); + } else if (typeof input === 'number' && !Number.isSafeInteger(input)) { + throw new Error( + 'The provided number is greater than MAX_SAFE_INTEGER (please use an alternative input type)', + ); + } + + const output = toUint8Array(input); + + switch (outputType) { + case TypeOutput.Uint8Array: + return output as TypeOutputReturnType[T]; + case TypeOutput.BigInt: + return uint8ArrayToBigInt(output) as TypeOutputReturnType[T]; + case TypeOutput.Number: { + const bigInt = uint8ArrayToBigInt(output); + if (bigInt > BigInt(Number.MAX_SAFE_INTEGER)) { + throw new Error( + 'The provided number is greater than MAX_SAFE_INTEGER (please use an alternative output type)', + ); + } + return Number(bigInt) as TypeOutputReturnType[T]; + } + case TypeOutput.PrefixedHexString: + return bytesToHex(output) as TypeOutputReturnType[T]; + default: + throw new Error('unknown outputType'); + } +} diff --git a/packages/web3-eth-accounts/src/index.js b/packages/web3-eth-accounts/src/index.js deleted file mode 100644 index 6df1f8ccf1f..00000000000 --- a/packages/web3-eth-accounts/src/index.js +++ /dev/null @@ -1,640 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file accounts.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -'use strict'; - -var _ = require('underscore'); -var core = require('web3-core'); -var Method = require('web3-core-method'); -var Account = require('eth-lib/lib/account'); -var Hash = require('eth-lib/lib/hash'); -var RLP = require('eth-lib/lib/rlp');// jshint ignore:line -var Bytes = require('eth-lib/lib/bytes');// jshint ignore:line -var cryp = (typeof global === 'undefined') ? require('crypto-browserify') : require('crypto'); -var scrypt = require('scrypt-js'); -var uuid = require('uuid'); -var utils = require('web3-utils'); -var helpers = require('web3-core-helpers'); -var Transaction = require('ethereumjs-tx').Transaction; -var Common = require('ethereumjs-common').default; - - -var isNot = function(value) { - return (_.isUndefined(value) || _.isNull(value)); -}; - -var Accounts = function Accounts() { - var _this = this; - - // sets _requestmanager - core.packageInit(this, arguments); - - // remove unecessary core functions - delete this.BatchRequest; - delete this.extend; - - var _ethereumCall = [ - new Method({ - name: 'getNetworkId', - call: 'net_version', - params: 0, - outputFormatter: parseInt - }), - new Method({ - name: 'getChainId', - call: 'eth_chainId', - params: 0, - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'getGasPrice', - call: 'eth_gasPrice', - params: 0 - }), - new Method({ - name: 'getTransactionCount', - call: 'eth_getTransactionCount', - params: 2, - inputFormatter: [function(address) { - if (utils.isAddress(address)) { - return address; - } else { - throw new Error('Address ' + address + ' is not a valid address to get the "transactionCount".'); - } - }, function() { - return 'latest'; - }] - }) - ]; - // attach methods to this._ethereumCall - this._ethereumCall = {}; - _.each(_ethereumCall, function(method) { - method.attachToObject(_this._ethereumCall); - method.setRequestManager(_this._requestManager); - }); - - - this.wallet = new Wallet(this); -}; - -Accounts.prototype._addAccountFunctions = function(account) { - var _this = this; - - // add sign functions - account.signTransaction = function signTransaction(tx, callback) { - return _this.signTransaction(tx, account.privateKey, callback); - }; - account.sign = function sign(data) { - return _this.sign(data, account.privateKey); - }; - - account.encrypt = function encrypt(password, options) { - return _this.encrypt(account.privateKey, password, options); - }; - - - return account; -}; - -Accounts.prototype.create = function create(entropy) { - return this._addAccountFunctions(Account.create(entropy || utils.randomHex(32))); -}; - -Accounts.prototype.privateKeyToAccount = function privateKeyToAccount(privateKey, ignoreLength) { - if (!privateKey.startsWith('0x')) { - privateKey = '0x' + privateKey; - } - - // 64 hex characters + hex-prefix - if (!ignoreLength && privateKey.length !== 66) { - throw new Error("Private key must be 32 bytes long"); - } - - return this._addAccountFunctions(Account.fromPrivate(privateKey)); -}; - -Accounts.prototype.signTransaction = function signTransaction(tx, privateKey, callback) { - var _this = this, - error = false, - transactionOptions = {}, - hasTxSigningOptions = !!(tx && ((tx.chain && tx.hardfork) || tx.common)); - - callback = callback || function() { - }; - - if (!tx) { - error = new Error('No transaction object given!'); - - callback(error); - return Promise.reject(error); - } - - function signed(tx) { - const error = _validateTransactionForSigning(tx); - - if (error) { - callback(error); - return Promise.reject(error); - } - - try { - var transaction = helpers.formatters.inputCallFormatter(_.clone(tx)); - transaction.to = transaction.to || '0x'; - transaction.data = transaction.data || '0x'; - transaction.value = transaction.value || '0x'; - transaction.chainId = utils.numberToHex(transaction.chainId); - - // Because tx has no ethereumjs-tx signing options we use fetched vals. - if (!hasTxSigningOptions) { - transactionOptions.common = Common.forCustomChain( - 'mainnet', - { - name: 'custom-network', - networkId: transaction.networkId, - chainId: transaction.chainId - }, - 'petersburg' - ); - - delete transaction.networkId; - } else { - if (transaction.common) { - transactionOptions.common = Common.forCustomChain( - transaction.common.baseChain || 'mainnet', - { - name: transaction.common.customChain.name || 'custom-network', - networkId: transaction.common.customChain.networkId, - chainId: transaction.common.customChain.chainId - }, - transaction.common.hardfork || 'petersburg' - ); - - delete transaction.common; - } - - if (transaction.chain) { - transactionOptions.chain = transaction.chain; - delete transaction.chain; - } - - if (transaction.hardfork) { - transactionOptions.hardfork = transaction.hardfork; - delete transaction.hardfork; - } - } - - if (privateKey.startsWith('0x')) { - privateKey = privateKey.substring(2); - } - - var ethTx = new Transaction(transaction, transactionOptions); - - ethTx.sign(Buffer.from(privateKey, 'hex')); - - var validationResult = ethTx.validate(true); - - if (validationResult !== '') { - throw new Error('Signer Error: ' + validationResult); - } - - var rlpEncoded = ethTx.serialize().toString('hex'); - var rawTransaction = '0x' + rlpEncoded; - var transactionHash = utils.keccak256(rawTransaction); - - var result = { - messageHash: '0x' + Buffer.from(ethTx.hash(false)).toString('hex'), - v: '0x' + Buffer.from(ethTx.v).toString('hex'), - r: '0x' + Buffer.from(ethTx.r).toString('hex'), - s: '0x' + Buffer.from(ethTx.s).toString('hex'), - rawTransaction: rawTransaction, - transactionHash: transactionHash - }; - - callback(null, result); - return result; - - } catch (e) { - callback(e); - return Promise.reject(e); - } - } - - - // Resolve immediately if nonce, chainId, price and signing options are provided - if (tx.nonce !== undefined && tx.chainId !== undefined && tx.gasPrice !== undefined && hasTxSigningOptions) { - return Promise.resolve(signed(tx)); - } - - // Otherwise, get the missing info from the Ethereum Node - return Promise.all([ - isNot(tx.chainId) ? _this._ethereumCall.getChainId() : tx.chainId, - isNot(tx.gasPrice) ? _this._ethereumCall.getGasPrice() : tx.gasPrice, - isNot(tx.nonce) ? _this._ethereumCall.getTransactionCount(_this.privateKeyToAccount(privateKey).address) : tx.nonce, - isNot(hasTxSigningOptions) ? _this._ethereumCall.getNetworkId() : 1 - ]).then(function(args) { - if (isNot(args[0]) || isNot(args[1]) || isNot(args[2]) || isNot(args[3])) { - throw new Error('One of the values "chainId", "networkId", "gasPrice", or "nonce" couldn\'t be fetched: ' + JSON.stringify(args)); - } - return signed(_.extend(tx, {chainId: args[0], gasPrice: args[1], nonce: args[2], networkId: args[3]})); - }); -}; - -function _validateTransactionForSigning(tx) { - if (tx.common && (tx.chain && tx.hardfork)) { - return new Error( - 'Please provide the ethereumjs-common object or the chain and hardfork property but not all together.' - ); - } - - if ((tx.chain && !tx.hardfork) || (tx.hardfork && !tx.chain)) { - return new Error( - 'When specifying chain and hardfork, both values must be defined. ' + - 'Received "chain": ' + tx.chain + ', "hardfork": ' + tx.hardfork - ); - } - - if (!tx.gas && !tx.gasLimit) { - return new Error('"gas" is missing'); - } - - if (tx.nonce < 0 || - tx.gas < 0 || - tx.gasPrice < 0 || - tx.chainId < 0) { - return new Error('Gas, gasPrice, nonce or chainId is lower than 0'); - } - - return; -} - - -/* jshint ignore:start */ -Accounts.prototype.recoverTransaction = function recoverTransaction(rawTx) { - var values = RLP.decode(rawTx); - var signature = Account.encodeSignature(values.slice(6, 9)); - var recovery = Bytes.toNumber(values[6]); - var extraData = recovery < 35 ? [] : [Bytes.fromNumber((recovery - 35) >> 1), '0x', '0x']; - var signingData = values.slice(0, 6).concat(extraData); - var signingDataHex = RLP.encode(signingData); - return Account.recover(Hash.keccak256(signingDataHex), signature); -}; -/* jshint ignore:end */ - -Accounts.prototype.hashMessage = function hashMessage(data) { - var messageHex = utils.isHexStrict(data) ? data : utils.utf8ToHex(data); - var messageBytes = utils.hexToBytes(messageHex); - var messageBuffer = Buffer.from(messageBytes); - var preamble = '\x19Ethereum Signed Message:\n' + messageBytes.length; - var preambleBuffer = Buffer.from(preamble); - var ethMessage = Buffer.concat([preambleBuffer, messageBuffer]); - return Hash.keccak256s(ethMessage); -}; - -Accounts.prototype.sign = function sign(data, privateKey) { - if (!privateKey.startsWith('0x')) { - privateKey = '0x' + privateKey; - } - - // 64 hex characters + hex-prefix - if (privateKey.length !== 66) { - throw new Error("Private key must be 32 bytes long"); - } - - var hash = this.hashMessage(data); - var signature = Account.sign(hash, privateKey); - var vrs = Account.decodeSignature(signature); - return { - message: data, - messageHash: hash, - v: vrs[0], - r: vrs[1], - s: vrs[2], - signature: signature - }; -}; - -Accounts.prototype.recover = function recover(message, signature, preFixed) { - var args = [].slice.apply(arguments); - - - if (_.isObject(message)) { - return this.recover(message.messageHash, Account.encodeSignature([message.v, message.r, message.s]), true); - } - - if (!preFixed) { - message = this.hashMessage(message); - } - - if (args.length >= 4) { - preFixed = args.slice(-1)[0]; - preFixed = _.isBoolean(preFixed) ? !!preFixed : false; - - return this.recover(message, Account.encodeSignature(args.slice(1, 4)), preFixed); // v, r, s - } - return Account.recover(message, signature); -}; - -// Taken from https://github.com/ethereumjs/ethereumjs-wallet -Accounts.prototype.decrypt = function(v3Keystore, password, nonStrict) { - /* jshint maxcomplexity: 10 */ - - if (!_.isString(password)) { - throw new Error('No password given.'); - } - - var json = (_.isObject(v3Keystore)) ? v3Keystore : JSON.parse(nonStrict ? v3Keystore.toLowerCase() : v3Keystore); - - if (json.version !== 3) { - throw new Error('Not a valid V3 wallet'); - } - - var derivedKey; - var kdfparams; - if (json.crypto.kdf === 'scrypt') { - kdfparams = json.crypto.kdfparams; - - // FIXME: support progress reporting callback - derivedKey = scrypt.syncScrypt(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen); - } else if (json.crypto.kdf === 'pbkdf2') { - kdfparams = json.crypto.kdfparams; - - if (kdfparams.prf !== 'hmac-sha256') { - throw new Error('Unsupported parameters to PBKDF2'); - } - - derivedKey = cryp.pbkdf2Sync(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.c, kdfparams.dklen, 'sha256'); - } else { - throw new Error('Unsupported key derivation scheme'); - } - - var ciphertext = Buffer.from(json.crypto.ciphertext, 'hex'); - - var mac = utils.sha3(Buffer.from([...derivedKey.slice(16, 32), ...ciphertext])).replace('0x', ''); - if (mac !== json.crypto.mac) { - throw new Error('Key derivation failed - possibly wrong password'); - } - - var decipher = cryp.createDecipheriv(json.crypto.cipher, derivedKey.slice(0, 16), Buffer.from(json.crypto.cipherparams.iv, 'hex')); - var seed = '0x' + Buffer.from([...decipher.update(ciphertext), ...decipher.final()]).toString('hex'); - - return this.privateKeyToAccount(seed, true); -}; - -Accounts.prototype.encrypt = function(privateKey, password, options) { - /* jshint maxcomplexity: 20 */ - var account = this.privateKeyToAccount(privateKey, true); - - options = options || {}; - var salt = options.salt || cryp.randomBytes(32); - var iv = options.iv || cryp.randomBytes(16); - - var derivedKey; - var kdf = options.kdf || 'scrypt'; - var kdfparams = { - dklen: options.dklen || 32, - salt: salt.toString('hex') - }; - - if (kdf === 'pbkdf2') { - kdfparams.c = options.c || 262144; - kdfparams.prf = 'hmac-sha256'; - derivedKey = cryp.pbkdf2Sync(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.c, kdfparams.dklen, 'sha256'); - } else if (kdf === 'scrypt') { - // FIXME: support progress reporting callback - kdfparams.n = options.n || 8192; // 2048 4096 8192 16384 - kdfparams.r = options.r || 8; - kdfparams.p = options.p || 1; - derivedKey = scrypt.syncScrypt(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen); - } else { - throw new Error('Unsupported kdf'); - } - - var cipher = cryp.createCipheriv(options.cipher || 'aes-128-ctr', derivedKey.slice(0, 16), iv); - if (!cipher) { - throw new Error('Unsupported cipher'); - } - - - var ciphertext = Buffer.from([ - ...cipher.update(Buffer.from(account.privateKey.replace('0x', ''), 'hex')), - ...cipher.final()] - ); - - var mac = utils.sha3(Buffer.from([...derivedKey.slice(16, 32), ...ciphertext])).replace('0x', ''); - - return { - version: 3, - id: uuid.v4({random: options.uuid || cryp.randomBytes(16)}), - address: account.address.toLowerCase().replace('0x', ''), - crypto: { - ciphertext: ciphertext.toString('hex'), - cipherparams: { - iv: iv.toString('hex') - }, - cipher: options.cipher || 'aes-128-ctr', - kdf: kdf, - kdfparams: kdfparams, - mac: mac.toString('hex') - } - }; -}; - - -// Note: this is trying to follow closely the specs on -// http://web3js.readthedocs.io/en/1.0/web3-eth-accounts.html - -function Wallet(accounts) { - this._accounts = accounts; - this.length = 0; - this.defaultKeyName = 'web3js_wallet'; -} - -Wallet.prototype._findSafeIndex = function(pointer) { - pointer = pointer || 0; - if (_.has(this, pointer)) { - return this._findSafeIndex(pointer + 1); - } else { - return pointer; - } -}; - -Wallet.prototype._currentIndexes = function() { - var keys = Object.keys(this); - var indexes = keys - .map(function(key) { - return parseInt(key); - }) - .filter(function(n) { - return (n < 9e20); - }); - - return indexes; -}; - -Wallet.prototype.create = function(numberOfAccounts, entropy) { - for (var i = 0; i < numberOfAccounts; ++i) { - this.add(this._accounts.create(entropy).privateKey); - } - return this; -}; - -Wallet.prototype.add = function(account) { - - if (_.isString(account)) { - account = this._accounts.privateKeyToAccount(account); - } - if (!this[account.address]) { - account = this._accounts.privateKeyToAccount(account.privateKey); - account.index = this._findSafeIndex(); - - this[account.index] = account; - this[account.address] = account; - this[account.address.toLowerCase()] = account; - - this.length++; - - return account; - } else { - return this[account.address]; - } -}; - -Wallet.prototype.remove = function(addressOrIndex) { - var account = this[addressOrIndex]; - - if (account && account.address) { - // address - this[account.address].privateKey = null; - delete this[account.address]; - // address lowercase - this[account.address.toLowerCase()].privateKey = null; - delete this[account.address.toLowerCase()]; - // index - this[account.index].privateKey = null; - delete this[account.index]; - - this.length--; - - return true; - } else { - return false; - } -}; - -Wallet.prototype.clear = function() { - var _this = this; - var indexes = this._currentIndexes(); - - indexes.forEach(function(index) { - _this.remove(index); - }); - - return this; -}; - -Wallet.prototype.encrypt = function(password, options) { - var _this = this; - var indexes = this._currentIndexes(); - - var accounts = indexes.map(function(index) { - return _this[index].encrypt(password, options); - }); - - return accounts; -}; - - -Wallet.prototype.decrypt = function(encryptedWallet, password) { - var _this = this; - - encryptedWallet.forEach(function(keystore) { - var account = _this._accounts.decrypt(keystore, password); - - if (account) { - _this.add(account); - } else { - throw new Error('Couldn\'t decrypt accounts. Password wrong?'); - } - }); - - return this; -}; - -Wallet.prototype.save = function(password, keyName) { - localStorage.setItem(keyName || this.defaultKeyName, JSON.stringify(this.encrypt(password))); - - return true; -}; - -Wallet.prototype.load = function(password, keyName) { - var keystore = localStorage.getItem(keyName || this.defaultKeyName); - - if (keystore) { - try { - keystore = JSON.parse(keystore); - } catch (e) { - - } - } - - return this.decrypt(keystore || [], password); -}; - -if (!storageAvailable('localStorage')) { - delete Wallet.prototype.save; - delete Wallet.prototype.load; -} - -/** - * Checks whether a storage type is available or not - * For more info on how this works, please refer to MDN documentation - * https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API#Feature-detecting_localStorage - * - * @method storageAvailable - * @param {String} type the type of storage ('localStorage', 'sessionStorage') - * @returns {Boolean} a boolean indicating whether the specified storage is available or not - */ -function storageAvailable(type) { - var storage; - try { - storage = window[type]; - var x = '__storage_test__'; - storage.setItem(x, x); - storage.removeItem(x); - return true; - } catch (e) { - return e && ( - // everything except Firefox - e.code === 22 || - // Firefox - e.code === 1014 || - // test name field too, because code might not be present - // everything except Firefox - e.name === 'QuotaExceededError' || - // Firefox - e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && - // acknowledge QuotaExceededError only if there's something already stored - (storage && storage.length !== 0); - } -} - -module.exports = Accounts; diff --git a/packages/web3-eth-accounts/src/index.ts b/packages/web3-eth-accounts/src/index.ts new file mode 100644 index 00000000000..3d128c65de4 --- /dev/null +++ b/packages/web3-eth-accounts/src/index.ts @@ -0,0 +1,45 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The web3.eth.accounts contains functions to generate Ethereum accounts and sign transactions and data. + * + * **_NOTE:_** This package has NOT been audited and might potentially be unsafe. Take precautions to clear memory properly, store the private keys safely, and test transaction receiving and sending functionality properly before using in production! + * + * + * To use this package standalone and use its methods use: + * ```ts + * import { create, decrypt } from 'web3-eth-accounts'; // .... + * ``` + * + * To use this package within the web3 object use: + * + * ```ts + * import Web3 from 'web3'; + * + * const web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); + * // now you have access to the accounts class + * web3.eth.accounts.create(); + * ``` + */ + +export * from './wallet.js'; +export * from './account.js'; +export * from './types.js'; +export * from './schemas.js'; +export * from './common/index.js'; +export * from './tx/index.js'; diff --git a/packages/web3-eth-accounts/src/schemas.ts b/packages/web3-eth-accounts/src/schemas.ts new file mode 100644 index 00000000000..3c88da71601 --- /dev/null +++ b/packages/web3-eth-accounts/src/schemas.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const keyStoreSchema = { + type: 'object', + required: ['crypto', 'id', 'version', 'address'], + properties: { + crypto: { + type: 'object', + required: ['cipher', 'ciphertext', 'cipherparams', 'kdf', 'kdfparams', 'mac'], + properties: { + cipher: { type: 'string' }, + ciphertext: { type: 'string' }, + cipherparams: { type: 'object' }, + kdf: { type: 'string' }, + kdfparams: { type: 'object' }, + salt: { type: 'string' }, + mac: { type: 'string' }, + }, + }, + id: { type: 'string' }, + version: { type: 'number' }, + address: { type: 'string' }, + }, +}; diff --git a/packages/web3-eth-accounts/src/tx/address.ts b/packages/web3-eth-accounts/src/tx/address.ts new file mode 100644 index 00000000000..7d6f1ace322 --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/address.ts @@ -0,0 +1,85 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { bytesToHex, uint8ArrayEquals } from 'web3-utils'; +import { secp256k1 } from './constants.js'; +import { assertIsUint8Array, zeros } from '../common/utils.js'; + +export class Address { + public readonly buf: Uint8Array; + + public constructor(buf: Uint8Array) { + if (buf.length !== 20) { + throw new Error('Invalid address length'); + } + this.buf = buf; + } + + /** + * Returns the zero address. + */ + public static zero(): Address { + return new Address(zeros(20)); + } + + /** + * Is address equal to another. + */ + public equals(address: Address): boolean { + return uint8ArrayEquals(this.buf, address.buf); + } + + /** + * Is address zero. + */ + public isZero(): boolean { + return this.equals(Address.zero()); + } + + /** + * Returns hex encoding of address. + */ + public toString(): string { + return bytesToHex(this.buf); + } + + /** + * Returns Uint8Array representation of address. + */ + public toArray(): Uint8Array { + return this.buf; + } + + /** + * Returns the ethereum address of a given public key. + * Accepts "Ethereum public keys" and SEC1 encoded keys. + * @param pubKey The two points of an uncompressed key, unless sanitize is enabled + * @param sanitize Accept public keys in other formats + */ + public static publicToAddress(_pubKey: Uint8Array, sanitize = false): Uint8Array { + let pubKey = _pubKey; + assertIsUint8Array(pubKey); + if (sanitize && pubKey.length !== 64) { + pubKey = secp256k1.ProjectivePoint.fromHex(pubKey).toRawBytes(false).slice(1); + } + if (pubKey.length !== 64) { + throw new Error('Expected pubKey to be of length 64'); + } + // Only take the lower 160bits of the hash + return keccak256(pubKey).slice(-20); + } +} diff --git a/packages/web3-eth-accounts/src/tx/baseTransaction.ts b/packages/web3-eth-accounts/src/tx/baseTransaction.ts new file mode 100644 index 00000000000..3f8da6d4e41 --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/baseTransaction.ts @@ -0,0 +1,613 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Common as CommonType, Numbers } from 'web3-types'; +import { bytesToHex } from 'web3-utils'; +import { MAX_INTEGER, MAX_UINT64, SECP256K1_ORDER_DIV_2, secp256k1 } from './constants.js'; +import { toUint8Array, uint8ArrayToBigInt, unpadUint8Array } from '../common/utils.js'; +import { Common } from '../common/common.js'; +import { Hardfork, Chain } from '../common/enums.js'; +import type { + AccessListEIP2930TxData, + AccessListEIP2930ValuesArray, + FeeMarketEIP1559TxData, + FeeMarketEIP1559ValuesArray, + JsonTx, + TxData, + TxOptions, + TxValuesArray, +} from './types.js'; +import { Capability, ECDSASignature } from './types.js'; +import { Address } from './address.js'; +import { checkMaxInitCodeSize } from './utils.js'; + +interface TransactionCache { + hash: Uint8Array | undefined; + dataFee?: { + value: bigint; + hardfork: string | Hardfork; + }; +} + +/** + * This base class will likely be subject to further + * refactoring along the introduction of additional tx types + * on the Ethereum network. + * + * It is therefore not recommended to use directly. + */ +export abstract class BaseTransaction { + private readonly _type: number; + + public readonly nonce: bigint; + public readonly gasLimit: bigint; + public readonly to?: Address; + public readonly value: bigint; + public readonly data: Uint8Array; + + public readonly v?: bigint; + public readonly r?: bigint; + public readonly s?: bigint; + + public readonly common!: Common; + + protected cache: TransactionCache = { + hash: undefined, + dataFee: undefined, + }; + + protected readonly txOptions: TxOptions; + + /** + * List of tx type defining EIPs, + * e.g. 1559 (fee market) and 2930 (access lists) + * for FeeMarketEIP1559Transaction objects + */ + protected activeCapabilities: number[] = []; + + /** + * The default chain the tx falls back to if no Common + * is provided and if the chain can't be derived from + * a passed in chainId (only EIP-2718 typed txs) or + * EIP-155 signature (legacy txs). + * + * @hidden + */ + protected DEFAULT_CHAIN = Chain.Mainnet; + + /** + * The default HF if the tx type is active on that HF + * or the first greater HF where the tx is active. + * + * @hidden + */ + protected DEFAULT_HARDFORK: string | Hardfork = Hardfork.Merge; + + public constructor( + txData: TxData | AccessListEIP2930TxData | FeeMarketEIP1559TxData, + opts: TxOptions, + ) { + const { nonce, gasLimit, to, value, data, v, r, s, type } = txData; + this._type = Number(uint8ArrayToBigInt(toUint8Array(type))); + + this.txOptions = opts; + + const toB = toUint8Array(to === '' ? '0x' : to); + const vB = toUint8Array(v === '' ? '0x' : v); + const rB = toUint8Array(r === '' ? '0x' : r); + const sB = toUint8Array(s === '' ? '0x' : s); + + this.nonce = uint8ArrayToBigInt(toUint8Array(nonce === '' ? '0x' : nonce)); + this.gasLimit = uint8ArrayToBigInt(toUint8Array(gasLimit === '' ? '0x' : gasLimit)); + this.to = toB.length > 0 ? new Address(toB) : undefined; + this.value = uint8ArrayToBigInt(toUint8Array(value === '' ? '0x' : value)); + this.data = toUint8Array(data === '' ? '0x' : data); + + this.v = vB.length > 0 ? uint8ArrayToBigInt(vB) : undefined; + this.r = rB.length > 0 ? uint8ArrayToBigInt(rB) : undefined; + this.s = sB.length > 0 ? uint8ArrayToBigInt(sB) : undefined; + + this._validateCannotExceedMaxInteger({ value: this.value, r: this.r, s: this.s }); + + // geth limits gasLimit to 2^64-1 + this._validateCannotExceedMaxInteger({ gasLimit: this.gasLimit }, 64); + + // EIP-2681 limits nonce to 2^64-1 (cannot equal 2^64-1) + this._validateCannotExceedMaxInteger({ nonce: this.nonce }, 64, true); + // eslint-disable-next-line no-null/no-null + const createContract = this.to === undefined || this.to === null; + const allowUnlimitedInitCodeSize = opts.allowUnlimitedInitCodeSize ?? false; + const common = opts.common ?? this._getCommon(); + if (createContract && common.isActivatedEIP(3860) && !allowUnlimitedInitCodeSize) { + checkMaxInitCodeSize(common, this.data.length); + } + } + + /** + * Returns the transaction type. + * + * Note: legacy txs will return tx type `0`. + */ + public get type() { + return this._type; + } + + /** + * Checks if a tx type defining capability is active + * on a tx, for example the EIP-1559 fee market mechanism + * or the EIP-2930 access list feature. + * + * Note that this is different from the tx type itself, + * so EIP-2930 access lists can very well be active + * on an EIP-1559 tx for example. + * + * This method can be useful for feature checks if the + * tx type is unknown (e.g. when instantiated with + * the tx factory). + * + * See `Capabilites` in the `types` module for a reference + * on all supported capabilities. + */ + public supports(capability: Capability) { + return this.activeCapabilities.includes(capability); + } + + /** + * Checks if the transaction has the minimum amount of gas required + * (DataFee + TxFee + Creation Fee). + */ + public validate(): boolean; + public validate(stringError: false): boolean; + public validate(stringError: true): string[]; + public validate(stringError = false): boolean | string[] { + const errors = []; + + if (this.getBaseFee() > this.gasLimit) { + errors.push( + `gasLimit is too low. given ${this.gasLimit}, need at least ${this.getBaseFee()}`, + ); + } + + if (this.isSigned() && !this.verifySignature()) { + errors.push('Invalid Signature'); + } + + return stringError ? errors : errors.length === 0; + } + + protected _validateYParity() { + const { v } = this; + if (v !== undefined && v !== BigInt(0) && v !== BigInt(1)) { + const msg = this._errorMsg('The y-parity of the transaction should either be 0 or 1'); + throw new Error(msg); + } + } + + /** + * EIP-2: All transaction signatures whose s-value is greater than secp256k1n/2are considered invalid. + * Reasoning: https://ethereum.stackexchange.com/a/55728 + */ + protected _validateHighS() { + const { s } = this; + if (this.common.gteHardfork('homestead') && s !== undefined && s > SECP256K1_ORDER_DIV_2) { + const msg = this._errorMsg( + 'Invalid Signature: s-values greater than secp256k1n/2 are considered invalid', + ); + throw new Error(msg); + } + } + + /** + * The minimum amount of gas the tx must have (DataFee + TxFee + Creation Fee) + */ + public getBaseFee(): bigint { + const txFee = this.common.param('gasPrices', 'tx'); + let fee = this.getDataFee(); + if (txFee) fee += txFee; + if (this.common.gteHardfork('homestead') && this.toCreationAddress()) { + const txCreationFee = this.common.param('gasPrices', 'txCreation'); + if (txCreationFee) fee += txCreationFee; + } + return fee; + } + + /** + * The amount of gas paid for the data in this tx + */ + public getDataFee(): bigint { + const txDataZero = this.common.param('gasPrices', 'txDataZero'); + const txDataNonZero = this.common.param('gasPrices', 'txDataNonZero'); + + let cost = BigInt(0); + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < this.data.length; i += 1) { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions, no-unused-expressions + this.data[i] === 0 ? (cost += txDataZero) : (cost += txDataNonZero); + } + // eslint-disable-next-line no-null/no-null + if ((this.to === undefined || this.to === null) && this.common.isActivatedEIP(3860)) { + const dataLength = BigInt(Math.ceil(this.data.length / 32)); + const initCodeCost = this.common.param('gasPrices', 'initCodeWordCost') * dataLength; + cost += initCodeCost; + } + + return cost; + } + + /** + * The up front amount that an account must have for this transaction to be valid + */ + public abstract getUpfrontCost(): bigint; + + /** + * If the tx's `to` is to the creation address + */ + public toCreationAddress(): boolean { + return this.to === undefined || this.to.buf.length === 0; + } + + /** + * Returns a Uint8Array Array of the raw Uint8Arrays of this transaction, in order. + * + * Use {@link BaseTransaction.serialize} to add a transaction to a block + * with {@link Block.fromValuesArray}. + * + * For an unsigned tx this method uses the empty Uint8Array values for the + * signature parameters `v`, `r` and `s` for encoding. For an EIP-155 compliant + * representation for external signing use {@link BaseTransaction.getMessageToSign}. + */ + public abstract raw(): + | TxValuesArray + | AccessListEIP2930ValuesArray + | FeeMarketEIP1559ValuesArray; + + /** + * Returns the encoding of the transaction. + */ + public abstract serialize(): Uint8Array; + + // Returns the unsigned tx (hashed or raw), which is used to sign the transaction. + // + // Note: do not use code docs here since VS Studio is then not able to detect the + // comments from the inherited methods + public abstract getMessageToSign(hashMessage: false): Uint8Array | Uint8Array[]; + public abstract getMessageToSign(hashMessage?: true): Uint8Array; + + public abstract hash(): Uint8Array; + + public abstract getMessageToVerifySignature(): Uint8Array; + + public isSigned(): boolean { + const { v, r, s } = this; + if (v === undefined || r === undefined || s === undefined) { + return false; + } + return true; + } + + /** + * Determines if the signature is valid + */ + public verifySignature(): boolean { + try { + // Main signature verification is done in `getSenderPublicKey()` + const publicKey = this.getSenderPublicKey(); + return unpadUint8Array(publicKey).length !== 0; + } catch (e: any) { + return false; + } + } + + /** + * Returns the sender's address + */ + public getSenderAddress(): Address { + return new Address(Address.publicToAddress(this.getSenderPublicKey())); + } + + /** + * Returns the public key of the sender + */ + public abstract getSenderPublicKey(): Uint8Array; + + /** + * Signs a transaction. + * + * Note that the signed tx is returned as a new object, + * use as follows: + * ```javascript + * const signedTx = tx.sign(privateKey) + * ``` + */ + public sign(privateKey: Uint8Array): TransactionObject { + if (privateKey.length !== 32) { + const msg = this._errorMsg('Private key must be 32 bytes in length.'); + throw new Error(msg); + } + + // Hack for the constellation that we have got a legacy tx after spuriousDragon with a non-EIP155 conforming signature + // and want to recreate a signature (where EIP155 should be applied) + // Leaving this hack lets the legacy.spec.ts -> sign(), verifySignature() test fail + // 2021-06-23 + let hackApplied = false; + if ( + this.type === 0 && + this.common.gteHardfork('spuriousDragon') && + !this.supports(Capability.EIP155ReplayProtection) + ) { + this.activeCapabilities.push(Capability.EIP155ReplayProtection); + hackApplied = true; + } + + const msgHash = this.getMessageToSign(true); + const { v, r, s } = this._ecsign(msgHash, privateKey); + const tx = this._processSignature(v, r, s); + + // Hack part 2 + if (hackApplied) { + const index = this.activeCapabilities.indexOf(Capability.EIP155ReplayProtection); + if (index > -1) { + this.activeCapabilities.splice(index, 1); + } + } + + return tx; + } + + /** + * Returns an object with the JSON representation of the transaction + */ + public abstract toJSON(): JsonTx; + + // Accept the v,r,s values from the `sign` method, and convert this into a TransactionObject + protected abstract _processSignature( + v: bigint, + r: Uint8Array, + s: Uint8Array, + ): TransactionObject; + + /** + * Does chain ID checks on common and returns a common + * to be used on instantiation + * @hidden + * + * @param common - {@link Common} instance from tx options + * @param chainId - Chain ID from tx options (typed txs) or signature (legacy tx) + */ + protected _getCommon(common?: Common, chainId?: Numbers) { + // TODO: this function needs to be reviewed and the code to be more clean + // check issue https://github.com/web3/web3.js/issues/6666 + // Chain ID provided + if (chainId !== undefined) { + const chainIdBigInt = uint8ArrayToBigInt(toUint8Array(chainId)); + if (common) { + if (common.chainId() !== chainIdBigInt) { + const msg = this._errorMsg( + 'The chain ID does not match the chain ID of Common', + ); + throw new Error(msg); + } + // Common provided, chain ID does match + // -> Return provided Common + return common.copy(); + } + if (Common.isSupportedChainId(chainIdBigInt)) { + // No Common, chain ID supported by Common + // -> Instantiate Common with chain ID + return new Common({ chain: chainIdBigInt, hardfork: this.DEFAULT_HARDFORK }); + } + // No Common, chain ID not supported by Common + // -> Instantiate custom Common derived from DEFAULT_CHAIN + return Common.custom( + { + name: 'custom-chain', + networkId: chainIdBigInt, + chainId: chainIdBigInt, + }, + { baseChain: this.DEFAULT_CHAIN, hardfork: this.DEFAULT_HARDFORK }, + ); + } + // No chain ID provided + // -> return Common provided or create new default Common + + if (common?.copy && typeof common?.copy === 'function') { + return common.copy(); + } + // TODO: Recheck this next block when working on https://github.com/web3/web3.js/issues/6666 + // This block is to handle when `chainId` was not passed and the `common` object does not have `copy()` + // If it was meant to be unsupported to process `common` in this case, an exception should be thrown instead of the following block + if (common) { + const hardfork = + typeof common.hardfork === 'function' + ? common.hardfork() + : // eslint-disable-next-line @typescript-eslint/unbound-method + (common.hardfork as unknown as string); + + return Common.custom( + { + name: 'custom-chain', + networkId: common.networkId + ? common.networkId() + : BigInt((common as unknown as CommonType).customChain?.networkId) ?? + undefined, + chainId: common.chainId + ? common.chainId() + : BigInt((common as unknown as CommonType).customChain?.chainId) ?? + undefined, + }, + { + baseChain: this.DEFAULT_CHAIN, + hardfork: hardfork || this.DEFAULT_HARDFORK, + }, + ); + } + + return new Common({ chain: this.DEFAULT_CHAIN, hardfork: this.DEFAULT_HARDFORK }); + } + + /** + * Validates that an object with BigInt values cannot exceed the specified bit limit. + * @param values Object containing string keys and BigInt values + * @param bits Number of bits to check (64 or 256) + * @param cannotEqual Pass true if the number also cannot equal one less the maximum value + */ + protected _validateCannotExceedMaxInteger( + values: { [key: string]: bigint | undefined }, + bits = 256, + cannotEqual = false, + ) { + for (const [key, value] of Object.entries(values)) { + switch (bits) { + case 64: + if (cannotEqual) { + if (value !== undefined && value >= MAX_UINT64) { + const msg = this._errorMsg( + `${key} cannot equal or exceed MAX_UINT64 (2^64-1), given ${value}`, + ); + throw new Error(msg); + } + } else if (value !== undefined && value > MAX_UINT64) { + const msg = this._errorMsg( + `${key} cannot exceed MAX_UINT64 (2^64-1), given ${value}`, + ); + throw new Error(msg); + } + break; + case 256: + if (cannotEqual) { + if (value !== undefined && value >= MAX_INTEGER) { + const msg = this._errorMsg( + `${key} cannot equal or exceed MAX_INTEGER (2^256-1), given ${value}`, + ); + throw new Error(msg); + } + } else if (value !== undefined && value > MAX_INTEGER) { + const msg = this._errorMsg( + `${key} cannot exceed MAX_INTEGER (2^256-1), given ${value}`, + ); + throw new Error(msg); + } + break; + default: { + const msg = this._errorMsg('unimplemented bits value'); + throw new Error(msg); + } + } + } + } + + protected static _validateNotArray(values: { [key: string]: any }) { + const txDataKeys = [ + 'nonce', + 'gasPrice', + 'gasLimit', + 'to', + 'value', + 'data', + 'v', + 'r', + 's', + 'type', + 'baseFee', + 'maxFeePerGas', + 'chainId', + ]; + for (const [key, value] of Object.entries(values)) { + if (txDataKeys.includes(key)) { + if (Array.isArray(value)) { + throw new Error(`${key} cannot be an array`); + } + } + } + } + + /** + * Return a compact error string representation of the object + */ + public abstract errorStr(): string; + + /** + * Internal helper function to create an annotated error message + * + * @param msg Base error message + * @hidden + */ + protected abstract _errorMsg(msg: string): string; + + /** + * Returns the shared error postfix part for _error() method + * tx type implementations. + */ + protected _getSharedErrorPostfix() { + let hash = ''; + try { + hash = this.isSigned() ? bytesToHex(this.hash()) : 'not available (unsigned)'; + } catch (e: any) { + hash = 'error'; + } + let isSigned = ''; + try { + isSigned = this.isSigned().toString(); + } catch (e: any) { + hash = 'error'; + } + let hf = ''; + try { + hf = this.common.hardfork(); + } catch (e: any) { + hf = 'error'; + } + + let postfix = `tx type=${this.type} hash=${hash} nonce=${this.nonce} value=${this.value} `; + postfix += `signed=${isSigned} hf=${hf}`; + + return postfix; + } + // eslint-disable-next-line class-methods-use-this + private _ecsign(msgHash: Uint8Array, privateKey: Uint8Array, chainId?: bigint): ECDSASignature { + const signature = secp256k1.sign(msgHash, privateKey); + const signatureBytes = signature.toCompactRawBytes(); + + const r = signatureBytes.subarray(0, 32); + const s = signatureBytes.subarray(32, 64); + + const v = + chainId === undefined + ? BigInt(signature.recovery! + 27) + : BigInt(signature.recovery! + 35) + BigInt(chainId) * BigInt(2); + + return { r, s, v }; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public static fromSerializedTx( + // @ts-expect-error unused variable + serialized: Uint8Array, + // @ts-expect-error unused variable + opts: TxOptions = {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function + ): any {} + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public static fromTxData( + // @ts-expect-error unused variable + txData: any, + // @ts-expect-error unused variable + opts: TxOptions = {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function + ): any {} +} diff --git a/packages/web3-eth-accounts/src/tx/constants.ts b/packages/web3-eth-accounts/src/tx/constants.ts new file mode 100644 index 00000000000..3ef47cd827c --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/constants.ts @@ -0,0 +1,34 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/extensions +import * as ethereumCryptography from 'ethereum-cryptography/secp256k1.js'; + +export const secp256k1 = ethereumCryptography.secp256k1 ?? ethereumCryptography; +/** + * 2^64-1 + */ +export const MAX_UINT64 = BigInt('0xffffffffffffffff'); + +/** + * The max integer that the evm can handle (2^256-1) + */ +export const MAX_INTEGER = BigInt( + '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', +); + +export const SECP256K1_ORDER = secp256k1.CURVE.n; +export const SECP256K1_ORDER_DIV_2 = SECP256K1_ORDER / BigInt(2); diff --git a/packages/web3-eth-accounts/src/tx/eip1559Transaction.ts b/packages/web3-eth-accounts/src/tx/eip1559Transaction.ts new file mode 100644 index 00000000000..eafb889220a --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/eip1559Transaction.ts @@ -0,0 +1,450 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { validateNoLeadingZeroes } from 'web3-validator'; +import { RLP } from '@ethereumjs/rlp'; +import { bytesToHex, hexToBytes, uint8ArrayConcat, uint8ArrayEquals } from 'web3-utils'; +import { MAX_INTEGER } from './constants.js'; +import { BaseTransaction } from './baseTransaction.js'; +import { + getAccessListData, + getAccessListJSON, + getDataFeeEIP2930, + verifyAccessList, +} from './utils.js'; +import { + bigIntToHex, + toUint8Array, + ecrecover, + uint8ArrayToBigInt, + bigIntToUnpaddedUint8Array, +} from '../common/utils.js'; +import type { + AccessList, + AccessListUint8Array, + FeeMarketEIP1559TxData, + FeeMarketEIP1559ValuesArray, + JsonTx, + TxOptions, +} from './types.js'; +import type { Common } from '../common/common.js'; + +const TRANSACTION_TYPE = 2; +const TRANSACTION_TYPE_UINT8ARRAY = hexToBytes(TRANSACTION_TYPE.toString(16).padStart(2, '0')); + +/** + * Typed transaction with a new gas fee market mechanism + * + * - TransactionType: 2 + * - EIP: [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) + */ +// eslint-disable-next-line no-use-before-define +export class FeeMarketEIP1559Transaction extends BaseTransaction { + public readonly chainId: bigint; + public readonly accessList: AccessListUint8Array; + public readonly AccessListJSON: AccessList; + public readonly maxPriorityFeePerGas: bigint; + public readonly maxFeePerGas: bigint; + + public readonly common: Common; + + /** + * The default HF if the tx type is active on that HF + * or the first greater HF where the tx is active. + * + * @hidden + */ + protected DEFAULT_HARDFORK = 'london'; + + /** + * Instantiate a transaction from a data dictionary. + * + * Format: { chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, v, r, s } + * + * Notes: + * - `chainId` will be set automatically if not provided + * - All parameters are optional and have some basic default values + */ + public static fromTxData(txData: FeeMarketEIP1559TxData, opts: TxOptions = {}) { + return new FeeMarketEIP1559Transaction(txData, opts); + } + + /** + * Instantiate a transaction from the serialized tx. + * + * Format: `0x02 || rlp([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS])` + */ + public static fromSerializedTx(serialized: Uint8Array, opts: TxOptions = {}) { + if (!uint8ArrayEquals(serialized.subarray(0, 1), TRANSACTION_TYPE_UINT8ARRAY)) { + throw new Error( + `Invalid serialized tx input: not an EIP-1559 transaction (wrong tx type, expected: ${TRANSACTION_TYPE}, received: ${bytesToHex( + serialized.subarray(0, 1), + )}`, + ); + } + const values = RLP.decode(serialized.subarray(1)); + + if (!Array.isArray(values)) { + throw new Error('Invalid serialized tx input: must be array'); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + return FeeMarketEIP1559Transaction.fromValuesArray(values as any, opts); + } + + /** + * Create a transaction from a values array. + * + * Format: `[chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS]` + */ + public static fromValuesArray(values: FeeMarketEIP1559ValuesArray, opts: TxOptions = {}) { + if (values.length !== 9 && values.length !== 12) { + throw new Error( + 'Invalid EIP-1559 transaction. Only expecting 9 values (for unsigned tx) or 12 values (for signed tx).', + ); + } + + const [ + chainId, + nonce, + maxPriorityFeePerGas, + maxFeePerGas, + gasLimit, + to, + value, + data, + accessList, + v, + r, + s, + ] = values; + + this._validateNotArray({ chainId, v }); + validateNoLeadingZeroes({ + nonce, + maxPriorityFeePerGas, + maxFeePerGas, + gasLimit, + value, + v, + r, + s, + }); + + return new FeeMarketEIP1559Transaction( + { + chainId: uint8ArrayToBigInt(chainId), + nonce, + maxPriorityFeePerGas, + maxFeePerGas, + gasLimit, + to, + value, + data, + accessList: accessList ?? [], + v: v !== undefined ? uint8ArrayToBigInt(v) : undefined, // EIP2930 supports v's with value 0 (empty Uint8Array) + r, + s, + }, + opts, + ); + } + + /** + * This constructor takes the values, validates them, assigns them and freezes the object. + * + * It is not recommended to use this constructor directly. Instead use + * the static factory methods to assist in creating a Transaction object from + * varying data types. + */ + public constructor(txData: FeeMarketEIP1559TxData, opts: TxOptions = {}) { + super({ ...txData, type: TRANSACTION_TYPE }, opts); + const { chainId, accessList, maxFeePerGas, maxPriorityFeePerGas } = txData; + + this.common = this._getCommon(opts.common, chainId); + this.chainId = this.common.chainId(); + + if (!this.common.isActivatedEIP(1559)) { + throw new Error('EIP-1559 not enabled on Common'); + } + this.activeCapabilities = this.activeCapabilities.concat([1559, 2718, 2930]); + + // Populate the access list fields + const accessListData = getAccessListData(accessList ?? []); + this.accessList = accessListData.accessList; + this.AccessListJSON = accessListData.AccessListJSON; + // Verify the access list format. + verifyAccessList(this.accessList); + + this.maxFeePerGas = uint8ArrayToBigInt( + toUint8Array(maxFeePerGas === '' ? '0x' : maxFeePerGas), + ); + this.maxPriorityFeePerGas = uint8ArrayToBigInt( + toUint8Array(maxPriorityFeePerGas === '' ? '0x' : maxPriorityFeePerGas), + ); + + this._validateCannotExceedMaxInteger({ + maxFeePerGas: this.maxFeePerGas, + maxPriorityFeePerGas: this.maxPriorityFeePerGas, + }); + + BaseTransaction._validateNotArray(txData); + + if (this.gasLimit * this.maxFeePerGas > MAX_INTEGER) { + const msg = this._errorMsg( + 'gasLimit * maxFeePerGas cannot exceed MAX_INTEGER (2^256-1)', + ); + throw new Error(msg); + } + + if (this.maxFeePerGas < this.maxPriorityFeePerGas) { + const msg = this._errorMsg( + 'maxFeePerGas cannot be less than maxPriorityFeePerGas (The total must be the larger of the two)', + ); + throw new Error(msg); + } + + this._validateYParity(); + this._validateHighS(); + + const freeze = opts?.freeze ?? true; + if (freeze) { + Object.freeze(this); + } + } + + /** + * The amount of gas paid for the data in this tx + */ + public getDataFee(): bigint { + if (this.cache.dataFee && this.cache.dataFee.hardfork === this.common.hardfork()) { + return this.cache.dataFee.value; + } + + let cost = super.getDataFee(); + cost += BigInt(getDataFeeEIP2930(this.accessList, this.common)); + + if (Object.isFrozen(this)) { + this.cache.dataFee = { + value: cost, + hardfork: this.common.hardfork(), + }; + } + + return cost; + } + + /** + * The up front amount that an account must have for this transaction to be valid + * @param baseFee The base fee of the block (will be set to 0 if not provided) + */ + public getUpfrontCost(baseFee = BigInt(0)): bigint { + const prio = this.maxPriorityFeePerGas; + const maxBase = this.maxFeePerGas - baseFee; + const inclusionFeePerGas = prio < maxBase ? prio : maxBase; + const gasPrice = inclusionFeePerGas + baseFee; + return this.gasLimit * gasPrice + this.value; + } + + /** + * Returns a Uint8Array Array of the raw Uint8Arrays of the EIP-1559 transaction, in order. + * + * Format: `[chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS]` + * + * Use {@link FeeMarketEIP1559Transaction.serialize} to add a transaction to a block + * with {@link Block.fromValuesArray}. + * + * For an unsigned tx this method uses the empty Uint8Array values for the + * signature parameters `v`, `r` and `s` for encoding. For an EIP-155 compliant + * representation for external signing use {@link FeeMarketEIP1559Transaction.getMessageToSign}. + */ + public raw(): FeeMarketEIP1559ValuesArray { + return [ + bigIntToUnpaddedUint8Array(this.chainId), + bigIntToUnpaddedUint8Array(this.nonce), + bigIntToUnpaddedUint8Array(this.maxPriorityFeePerGas), + bigIntToUnpaddedUint8Array(this.maxFeePerGas), + bigIntToUnpaddedUint8Array(this.gasLimit), + this.to !== undefined ? this.to.buf : Uint8Array.from([]), + bigIntToUnpaddedUint8Array(this.value), + this.data, + this.accessList, + this.v !== undefined ? bigIntToUnpaddedUint8Array(this.v) : Uint8Array.from([]), + this.r !== undefined ? bigIntToUnpaddedUint8Array(this.r) : Uint8Array.from([]), + this.s !== undefined ? bigIntToUnpaddedUint8Array(this.s) : Uint8Array.from([]), + ]; + } + + /** + * Returns the serialized encoding of the EIP-1559 transaction. + * + * Format: `0x02 || rlp([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS])` + * + * Note that in contrast to the legacy tx serialization format this is not + * valid RLP any more due to the raw tx type preceding and concatenated to + * the RLP encoding of the values. + */ + public serialize(): Uint8Array { + const base = this.raw(); + return uint8ArrayConcat(TRANSACTION_TYPE_UINT8ARRAY, RLP.encode(base)); + } + + /** + * Returns the serialized unsigned tx (hashed or raw), which can be used + * to sign the transaction (e.g. for sending to a hardware wallet). + * + * Note: in contrast to the legacy tx the raw message format is already + * serialized and doesn't need to be RLP encoded any more. + * + * ```javascript + * const serializedMessage = tx.getMessageToSign(false) // use this for the HW wallet input + * ``` + * + * @param hashMessage - Return hashed message if set to true (default: true) + */ + public getMessageToSign(hashMessage = true): Uint8Array { + const base = this.raw().slice(0, 9); + const message = uint8ArrayConcat(TRANSACTION_TYPE_UINT8ARRAY, RLP.encode(base)); + if (hashMessage) { + return keccak256(message); + } + return message; + } + + /** + * Computes a sha3-256 hash of the serialized tx. + * + * This method can only be used for signed txs (it throws otherwise). + * Use {@link FeeMarketEIP1559Transaction.getMessageToSign} to get a tx hash for the purpose of signing. + */ + public hash(): Uint8Array { + if (!this.isSigned()) { + const msg = this._errorMsg('Cannot call hash method if transaction is not signed'); + throw new Error(msg); + } + + if (Object.isFrozen(this)) { + if (!this.cache.hash) { + this.cache.hash = keccak256(this.serialize()); + } + return this.cache.hash; + } + + return keccak256(this.serialize()); + } + + /** + * Computes a sha3-256 hash which can be used to verify the signature + */ + public getMessageToVerifySignature(): Uint8Array { + return this.getMessageToSign(); + } + + /** + * Returns the public key of the sender + */ + public getSenderPublicKey(): Uint8Array { + if (!this.isSigned()) { + const msg = this._errorMsg('Cannot call this method if transaction is not signed'); + throw new Error(msg); + } + + const msgHash = this.getMessageToVerifySignature(); + const { v, r, s } = this; + + this._validateHighS(); + + try { + return ecrecover( + msgHash, + v! + BigInt(27), // Recover the 27 which was stripped from ecsign + bigIntToUnpaddedUint8Array(r!), + bigIntToUnpaddedUint8Array(s!), + ); + } catch (e: any) { + const msg = this._errorMsg('Invalid Signature'); + throw new Error(msg); + } + } + + public _processSignature(v: bigint, r: Uint8Array, s: Uint8Array) { + const opts = { ...this.txOptions, common: this.common }; + + return FeeMarketEIP1559Transaction.fromTxData( + { + chainId: this.chainId, + nonce: this.nonce, + maxPriorityFeePerGas: this.maxPriorityFeePerGas, + maxFeePerGas: this.maxFeePerGas, + gasLimit: this.gasLimit, + to: this.to, + value: this.value, + data: this.data, + accessList: this.accessList, + v: v - BigInt(27), // This looks extremely hacky: /util actually adds 27 to the value, the recovery bit is either 0 or 1. + r: uint8ArrayToBigInt(r), + s: uint8ArrayToBigInt(s), + }, + opts, + ); + } + + /** + * Returns an object with the JSON representation of the transaction + */ + public toJSON(): JsonTx { + const accessListJSON = getAccessListJSON(this.accessList); + + return { + chainId: bigIntToHex(this.chainId), + nonce: bigIntToHex(this.nonce), + maxPriorityFeePerGas: bigIntToHex(this.maxPriorityFeePerGas), + maxFeePerGas: bigIntToHex(this.maxFeePerGas), + gasLimit: bigIntToHex(this.gasLimit), + to: this.to !== undefined ? this.to.toString() : undefined, + value: bigIntToHex(this.value), + data: bytesToHex(this.data), + accessList: accessListJSON, + v: this.v !== undefined ? bigIntToHex(this.v) : undefined, + r: this.r !== undefined ? bigIntToHex(this.r) : undefined, + s: this.s !== undefined ? bigIntToHex(this.s) : undefined, + }; + } + + /** + * Return a compact error string representation of the object + */ + public errorStr() { + let errorStr = this._getSharedErrorPostfix(); + errorStr += ` maxFeePerGas=${this.maxFeePerGas} maxPriorityFeePerGas=${this.maxPriorityFeePerGas}`; + return errorStr; + } + + /** + * Internal helper function to create an annotated error message + * + * @param msg Base error message + * @hidden + */ + protected _errorMsg(msg: string) { + return `${msg} (${this.errorStr()})`; + } +} diff --git a/packages/web3-eth-accounts/src/tx/eip2930Transaction.ts b/packages/web3-eth-accounts/src/tx/eip2930Transaction.ts new file mode 100644 index 00000000000..7152fbee58d --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/eip2930Transaction.ts @@ -0,0 +1,407 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { validateNoLeadingZeroes } from 'web3-validator'; +import { RLP } from '@ethereumjs/rlp'; +import { bytesToHex, hexToBytes, uint8ArrayConcat, uint8ArrayEquals } from 'web3-utils'; +import { MAX_INTEGER } from './constants.js'; +import { + getAccessListData, + verifyAccessList, + getAccessListJSON, + getDataFeeEIP2930, +} from './utils.js'; +import { + bigIntToHex, + toUint8Array, + ecrecover, + uint8ArrayToBigInt, + bigIntToUnpaddedUint8Array, +} from '../common/utils.js'; +import { BaseTransaction } from './baseTransaction.js'; +import type { + AccessList, + AccessListUint8Array, + AccessListEIP2930TxData, + AccessListEIP2930ValuesArray, + JsonTx, + TxOptions, +} from './types.js'; +import type { Common } from '../common/common.js'; + +const TRANSACTION_TYPE = 1; +const TRANSACTION_TYPE_UINT8ARRAY = hexToBytes(TRANSACTION_TYPE.toString(16).padStart(2, '0')); + +/** + * Typed transaction with optional access lists + * + * - TransactionType: 1 + * - EIP: [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) + */ +// eslint-disable-next-line no-use-before-define +export class AccessListEIP2930Transaction extends BaseTransaction { + public readonly chainId: bigint; + public readonly accessList: AccessListUint8Array; + public readonly AccessListJSON: AccessList; + public readonly gasPrice: bigint; + + public readonly common: Common; + + /** + * The default HF if the tx type is active on that HF + * or the first greater HF where the tx is active. + * + * @hidden + */ + protected DEFAULT_HARDFORK = 'berlin'; + + /** + * Instantiate a transaction from a data dictionary. + * + * Format: { chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, + * v, r, s } + * + * Notes: + * - `chainId` will be set automatically if not provided + * - All parameters are optional and have some basic default values + */ + public static fromTxData(txData: AccessListEIP2930TxData, opts: TxOptions = {}) { + return new AccessListEIP2930Transaction(txData, opts); + } + + /** + * Instantiate a transaction from the serialized tx. + * + * Format: `0x01 || rlp([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, + * signatureYParity (v), signatureR (r), signatureS (s)])` + */ + public static fromSerializedTx(serialized: Uint8Array, opts: TxOptions = {}) { + if (!uint8ArrayEquals(serialized.subarray(0, 1), TRANSACTION_TYPE_UINT8ARRAY)) { + throw new Error( + `Invalid serialized tx input: not an EIP-2930 transaction (wrong tx type, expected: ${TRANSACTION_TYPE}, received: ${bytesToHex( + serialized.subarray(0, 1), + )}`, + ); + } + const values = RLP.decode(Uint8Array.from(serialized.subarray(1))); + + if (!Array.isArray(values)) { + throw new Error('Invalid serialized tx input: must be array'); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + return AccessListEIP2930Transaction.fromValuesArray(values as any, opts); + } + + /** + * Create a transaction from a values array. + * + * Format: `[chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, + * signatureYParity (v), signatureR (r), signatureS (s)]` + */ + public static fromValuesArray(values: AccessListEIP2930ValuesArray, opts: TxOptions = {}) { + if (values.length !== 8 && values.length !== 11) { + throw new Error( + 'Invalid EIP-2930 transaction. Only expecting 8 values (for unsigned tx) or 11 values (for signed tx).', + ); + } + + const [chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, v, r, s] = values; + + this._validateNotArray({ chainId, v }); + validateNoLeadingZeroes({ nonce, gasPrice, gasLimit, value, v, r, s }); + + const emptyAccessList: AccessList = []; + + return new AccessListEIP2930Transaction( + { + chainId: uint8ArrayToBigInt(chainId), + nonce, + gasPrice, + gasLimit, + to, + value, + data, + accessList: accessList ?? emptyAccessList, + v: v !== undefined ? uint8ArrayToBigInt(v) : undefined, // EIP2930 supports v's with value 0 (empty Uint8Array) + r, + s, + }, + opts, + ); + } + + /** + * This constructor takes the values, validates them, assigns them and freezes the object. + * + * It is not recommended to use this constructor directly. Instead use + * the static factory methods to assist in creating a Transaction object from + * varying data types. + */ + public constructor(txData: AccessListEIP2930TxData, opts: TxOptions = {}) { + super({ ...txData, type: TRANSACTION_TYPE }, opts); + const { chainId, accessList, gasPrice } = txData; + + this.common = this._getCommon(opts.common, chainId); + this.chainId = this.common.chainId(); + + // EIP-2718 check is done in Common + if (!this.common.isActivatedEIP(2930)) { + throw new Error('EIP-2930 not enabled on Common'); + } + this.activeCapabilities = this.activeCapabilities.concat([2718, 2930]); + + // Populate the access list fields + const accessListData = getAccessListData(accessList ?? []); + this.accessList = accessListData.accessList; + this.AccessListJSON = accessListData.AccessListJSON; + // Verify the access list format. + verifyAccessList(this.accessList); + + this.gasPrice = uint8ArrayToBigInt(toUint8Array(gasPrice === '' ? '0x' : gasPrice)); + + this._validateCannotExceedMaxInteger({ + gasPrice: this.gasPrice, + }); + + BaseTransaction._validateNotArray(txData); + + if (this.gasPrice * this.gasLimit > MAX_INTEGER) { + const msg = this._errorMsg('gasLimit * gasPrice cannot exceed MAX_INTEGER'); + throw new Error(msg); + } + + this._validateYParity(); + this._validateHighS(); + + const freeze = opts?.freeze ?? true; + if (freeze) { + Object.freeze(this); + } + } + + /** + * The amount of gas paid for the data in this tx + */ + public getDataFee(): bigint { + if (this.cache.dataFee && this.cache.dataFee.hardfork === this.common.hardfork()) { + return this.cache.dataFee.value; + } + + let cost = super.getDataFee(); + cost += BigInt(getDataFeeEIP2930(this.accessList, this.common)); + + if (Object.isFrozen(this)) { + this.cache.dataFee = { + value: cost, + hardfork: this.common.hardfork(), + }; + } + + return cost; + } + + /** + * The up front amount that an account must have for this transaction to be valid + */ + public getUpfrontCost(): bigint { + return this.gasLimit * this.gasPrice + this.value; + } + + /** + * Returns a Uint8Array Array of the raw Uint8Arrays of the EIP-2930 transaction, in order. + * + * Format: `[chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, + * signatureYParity (v), signatureR (r), signatureS (s)]` + * + * Use {@link AccessListEIP2930Transaction.serialize} to add a transaction to a block + * with {@link Block.fromValuesArray}. + * + * For an unsigned tx this method uses the empty UINT8ARRAY values for the + * signature parameters `v`, `r` and `s` for encoding. For an EIP-155 compliant + * representation for external signing use {@link AccessListEIP2930Transaction.getMessageToSign}. + */ + public raw(): AccessListEIP2930ValuesArray { + return [ + bigIntToUnpaddedUint8Array(this.chainId), + bigIntToUnpaddedUint8Array(this.nonce), + bigIntToUnpaddedUint8Array(this.gasPrice), + bigIntToUnpaddedUint8Array(this.gasLimit), + this.to !== undefined ? this.to.buf : Uint8Array.from([]), + bigIntToUnpaddedUint8Array(this.value), + this.data, + this.accessList, + this.v !== undefined ? bigIntToUnpaddedUint8Array(this.v) : Uint8Array.from([]), + this.r !== undefined ? bigIntToUnpaddedUint8Array(this.r) : Uint8Array.from([]), + this.s !== undefined ? bigIntToUnpaddedUint8Array(this.s) : Uint8Array.from([]), + ]; + } + + /** + * Returns the serialized encoding of the EIP-2930 transaction. + * + * Format: `0x01 || rlp([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, + * signatureYParity (v), signatureR (r), signatureS (s)])` + * + * Note that in contrast to the legacy tx serialization format this is not + * valid RLP any more due to the raw tx type preceding and concatenated to + * the RLP encoding of the values. + */ + public serialize(): Uint8Array { + const base = this.raw(); + return uint8ArrayConcat(TRANSACTION_TYPE_UINT8ARRAY, RLP.encode(base)); + } + + /** + * Returns the serialized unsigned tx (hashed or raw), which can be used + * to sign the transaction (e.g. for sending to a hardware wallet). + * + * Note: in contrast to the legacy tx the raw message format is already + * serialized and doesn't need to be RLP encoded any more. + * + * ```javascript + * const serializedMessage = tx.getMessageToSign(false) // use this for the HW wallet input + * ``` + * + * @param hashMessage - Return hashed message if set to true (default: true) + */ + public getMessageToSign(hashMessage = true): Uint8Array { + const base = this.raw().slice(0, 8); + const message = uint8ArrayConcat(TRANSACTION_TYPE_UINT8ARRAY, RLP.encode(base)); + if (hashMessage) { + return keccak256(message); + } + return message; + } + + /** + * Computes a sha3-256 hash of the serialized tx. + * + * This method can only be used for signed txs (it throws otherwise). + * Use {@link AccessListEIP2930Transaction.getMessageToSign} to get a tx hash for the purpose of signing. + */ + public hash(): Uint8Array { + if (!this.isSigned()) { + const msg = this._errorMsg('Cannot call hash method if transaction is not signed'); + throw new Error(msg); + } + + if (Object.isFrozen(this)) { + if (!this.cache.hash) { + this.cache.hash = keccak256(this.serialize()); + } + return this.cache.hash; + } + + return keccak256(this.serialize()); + } + + /** + * Computes a sha3-256 hash which can be used to verify the signature + */ + public getMessageToVerifySignature(): Uint8Array { + return this.getMessageToSign(); + } + + /** + * Returns the public key of the sender + */ + public getSenderPublicKey(): Uint8Array { + if (!this.isSigned()) { + const msg = this._errorMsg('Cannot call this method if transaction is not signed'); + throw new Error(msg); + } + + const msgHash = this.getMessageToVerifySignature(); + const { v, r, s } = this; + + this._validateHighS(); + + try { + return ecrecover( + msgHash, + v! + BigInt(27), // Recover the 27 which was stripped from ecsign + bigIntToUnpaddedUint8Array(r!), + bigIntToUnpaddedUint8Array(s!), + ); + } catch (e: any) { + const msg = this._errorMsg('Invalid Signature'); + throw new Error(msg); + } + } + + public _processSignature(v: bigint, r: Uint8Array, s: Uint8Array) { + const opts = { ...this.txOptions, common: this.common }; + + return AccessListEIP2930Transaction.fromTxData( + { + chainId: this.chainId, + nonce: this.nonce, + gasPrice: this.gasPrice, + gasLimit: this.gasLimit, + to: this.to, + value: this.value, + data: this.data, + accessList: this.accessList, + v: v - BigInt(27), // This looks extremely hacky: /util actually adds 27 to the value, the recovery bit is either 0 or 1. + r: uint8ArrayToBigInt(r), + s: uint8ArrayToBigInt(s), + }, + opts, + ); + } + + /** + * Returns an object with the JSON representation of the transaction + */ + public toJSON(): JsonTx { + const accessListJSON = getAccessListJSON(this.accessList); + + return { + chainId: bigIntToHex(this.chainId), + nonce: bigIntToHex(this.nonce), + gasPrice: bigIntToHex(this.gasPrice), + gasLimit: bigIntToHex(this.gasLimit), + to: this.to !== undefined ? this.to.toString() : undefined, + value: bigIntToHex(this.value), + data: bytesToHex(this.data), + accessList: accessListJSON, + v: this.v !== undefined ? bigIntToHex(this.v) : undefined, + r: this.r !== undefined ? bigIntToHex(this.r) : undefined, + s: this.s !== undefined ? bigIntToHex(this.s) : undefined, + }; + } + + /** + * Return a compact error string representation of the object + */ + public errorStr() { + let errorStr = this._getSharedErrorPostfix(); + // Keep ? for this.accessList since this otherwise causes Hardhat E2E tests to fail + errorStr += ` gasPrice=${this.gasPrice} accessListCount=${this.accessList?.length ?? 0}`; + return errorStr; + } + + /** + * Internal helper function to create an annotated error message + * + * @param msg Base error message + * @hidden + */ + protected _errorMsg(msg: string) { + return `${msg} (${this.errorStr()})`; + } +} diff --git a/packages/web3-eth-accounts/src/tx/index.ts b/packages/web3-eth-accounts/src/tx/index.ts new file mode 100644 index 00000000000..26ead20a897 --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/index.ts @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// @ethereumjs/tx version 4.1.1 +export { FeeMarketEIP1559Transaction } from './eip1559Transaction.js'; +export { AccessListEIP2930Transaction } from './eip2930Transaction.js'; +export { Transaction } from './legacyTransaction.js'; +export { TransactionFactory } from './transactionFactory.js'; +export { BaseTransaction } from './baseTransaction.js'; +export * as txUtils from './utils.js'; +export * from './types.js'; diff --git a/packages/web3-eth-accounts/src/tx/legacyTransaction.ts b/packages/web3-eth-accounts/src/tx/legacyTransaction.ts new file mode 100644 index 00000000000..a7b05b7e4f3 --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/legacyTransaction.ts @@ -0,0 +1,439 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { RLP } from '@ethereumjs/rlp'; +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { bytesToHex } from 'web3-utils'; +import { validateNoLeadingZeroes } from 'web3-validator'; +import { + bigIntToHex, + bigIntToUnpaddedUint8Array, + ecrecover, + toUint8Array, + uint8ArrayToBigInt, + unpadUint8Array, +} from '../common/utils.js'; +import { MAX_INTEGER } from './constants.js'; + +import { BaseTransaction } from './baseTransaction.js'; + +import type { Common } from '../common/common.js'; +import type { JsonTx, TxData, TxOptions, TxValuesArray } from './types.js'; +import { Capability } from './types.js'; + +const TRANSACTION_TYPE = 0; + +function meetsEIP155(_v: bigint, chainId: bigint) { + const v = Number(_v); + const chainIdDoubled = Number(chainId) * 2; + return v === chainIdDoubled + 35 || v === chainIdDoubled + 36; +} + +/** + * An Ethereum non-typed (legacy) transaction + */ +// eslint-disable-next-line no-use-before-define +export class Transaction extends BaseTransaction { + public readonly gasPrice: bigint; + + public readonly common: Common; + + /** + * Instantiate a transaction from a data dictionary. + * + * Format: { nonce, gasPrice, gasLimit, to, value, data, v, r, s } + * + * Notes: + * - All parameters are optional and have some basic default values + */ + public static fromTxData(txData: TxData, opts: TxOptions = {}) { + return new Transaction(txData, opts); + } + + /** + * Instantiate a transaction from the serialized tx. + * + * Format: `rlp([nonce, gasPrice, gasLimit, to, value, data, v, r, s])` + */ + public static fromSerializedTx(serialized: Uint8Array, opts: TxOptions = {}) { + const values = RLP.decode(serialized); + + if (!Array.isArray(values)) { + throw new Error('Invalid serialized tx input. Must be array'); + } + + return this.fromValuesArray(values as Uint8Array[], opts); + } + + /** + * Create a transaction from a values array. + * + * Format: `[nonce, gasPrice, gasLimit, to, value, data, v, r, s]` + */ + public static fromValuesArray(values: TxValuesArray, opts: TxOptions = {}) { + // If length is not 6, it has length 9. If v/r/s are empty Uint8Array, it is still an unsigned transaction + // This happens if you get the RLP data from `raw()` + if (values.length !== 6 && values.length !== 9) { + throw new Error( + 'Invalid transaction. Only expecting 6 values (for unsigned tx) or 9 values (for signed tx).', + ); + } + + const [nonce, gasPrice, gasLimit, to, value, data, v, r, s] = values; + + validateNoLeadingZeroes({ nonce, gasPrice, gasLimit, value, v, r, s }); + + return new Transaction( + { + nonce, + gasPrice, + gasLimit, + to, + value, + data, + v, + r, + s, + }, + opts, + ); + } + + /** + * This constructor takes the values, validates them, assigns them and freezes the object. + * + * It is not recommended to use this constructor directly. Instead use + * the static factory methods to assist in creating a Transaction object from + * varying data types. + */ + public constructor(txData: TxData, opts: TxOptions = {}) { + super({ ...txData, type: TRANSACTION_TYPE }, opts); + + this.common = this._validateTxV(this.v, opts.common); + + this.gasPrice = uint8ArrayToBigInt( + toUint8Array(txData.gasPrice === '' ? '0x' : txData.gasPrice), + ); + + if (this.gasPrice * this.gasLimit > MAX_INTEGER) { + const msg = this._errorMsg('gas limit * gasPrice cannot exceed MAX_INTEGER (2^256-1)'); + throw new Error(msg); + } + this._validateCannotExceedMaxInteger({ gasPrice: this.gasPrice }); + BaseTransaction._validateNotArray(txData); + + if (this.common.gteHardfork('spuriousDragon')) { + if (!this.isSigned()) { + this.activeCapabilities.push(Capability.EIP155ReplayProtection); + } else { + // EIP155 spec: + // If block.number >= 2,675,000 and v = CHAIN_ID * 2 + 35 or v = CHAIN_ID * 2 + 36 + // then when computing the hash of a transaction for purposes of signing or recovering + // instead of hashing only the first six elements (i.e. nonce, gasprice, startgas, to, value, data) + // hash nine elements, with v replaced by CHAIN_ID, r = 0 and s = 0. + // v and chain ID meet EIP-155 conditions + // eslint-disable-next-line no-lonely-if + if (meetsEIP155(this.v!, this.common.chainId())) { + this.activeCapabilities.push(Capability.EIP155ReplayProtection); + } + } + } + + const freeze = opts?.freeze ?? true; + if (freeze) { + Object.freeze(this); + } + } + + /** + * Returns a Uint8Array Array of the raw Uint8Arrays of the legacy transaction, in order. + * + * Format: `[nonce, gasPrice, gasLimit, to, value, data, v, r, s]` + * + * For legacy txs this is also the correct format to add transactions + * to a block with {@link Block.fromValuesArray} (use the `serialize()` method + * for typed txs). + * + * For an unsigned tx this method returns the empty Uint8Array values + * for the signature parameters `v`, `r` and `s`. For an EIP-155 compliant + * representation have a look at {@link Transaction.getMessageToSign}. + */ + public raw(): TxValuesArray { + return [ + bigIntToUnpaddedUint8Array(this.nonce), + bigIntToUnpaddedUint8Array(this.gasPrice), + bigIntToUnpaddedUint8Array(this.gasLimit), + this.to !== undefined ? this.to.buf : Uint8Array.from([]), + bigIntToUnpaddedUint8Array(this.value), + this.data, + this.v !== undefined ? bigIntToUnpaddedUint8Array(this.v) : Uint8Array.from([]), + this.r !== undefined ? bigIntToUnpaddedUint8Array(this.r) : Uint8Array.from([]), + this.s !== undefined ? bigIntToUnpaddedUint8Array(this.s) : Uint8Array.from([]), + ]; + } + + /** + * Returns the serialized encoding of the legacy transaction. + * + * Format: `rlp([nonce, gasPrice, gasLimit, to, value, data, v, r, s])` + * + * For an unsigned tx this method uses the empty Uint8Array values for the + * signature parameters `v`, `r` and `s` for encoding. For an EIP-155 compliant + * representation for external signing use {@link Transaction.getMessageToSign}. + */ + public serialize(): Uint8Array { + return RLP.encode(this.raw()); + } + + private _getMessageToSign() { + const values = [ + bigIntToUnpaddedUint8Array(this.nonce), + bigIntToUnpaddedUint8Array(this.gasPrice), + bigIntToUnpaddedUint8Array(this.gasLimit), + this.to !== undefined ? this.to.buf : Uint8Array.from([]), + bigIntToUnpaddedUint8Array(this.value), + this.data, + ]; + + if (this.supports(Capability.EIP155ReplayProtection)) { + values.push(toUint8Array(this.common.chainId())); + values.push(unpadUint8Array(toUint8Array(0))); + values.push(unpadUint8Array(toUint8Array(0))); + } + + return values; + } + + /** + * Returns the unsigned tx (hashed or raw), which can be used + * to sign the transaction (e.g. for sending to a hardware wallet). + * + * Note: the raw message message format for the legacy tx is not RLP encoded + * and you might need to do yourself with: + * + * ```javascript + * import { bufArrToArr } from '../util' + * import { RLP } from '../rlp' + * const message = tx.getMessageToSign(false) + * const serializedMessage = RLP.encode(message) // use this for the HW wallet input + * ``` + * + * @param hashMessage - Return hashed message if set to true (default: true) + */ + public getMessageToSign(hashMessage: false): Uint8Array[]; + public getMessageToSign(hashMessage?: true): Uint8Array; + public getMessageToSign(hashMessage = true) { + const message = this._getMessageToSign(); + if (hashMessage) { + return keccak256(RLP.encode(message)); + } + return message; + } + + /** + * The amount of gas paid for the data in this tx + */ + public getDataFee(): bigint { + if (this.cache.dataFee && this.cache.dataFee.hardfork === this.common.hardfork()) { + return this.cache.dataFee.value; + } + + if (Object.isFrozen(this)) { + this.cache.dataFee = { + value: super.getDataFee(), + hardfork: this.common.hardfork(), + }; + } + + return super.getDataFee(); + } + + /** + * The up front amount that an account must have for this transaction to be valid + */ + public getUpfrontCost(): bigint { + return this.gasLimit * this.gasPrice + this.value; + } + + /** + * Computes a sha3-256 hash of the serialized tx. + * + * This method can only be used for signed txs (it throws otherwise). + * Use {@link Transaction.getMessageToSign} to get a tx hash for the purpose of signing. + */ + public hash(): Uint8Array { + if (!this.isSigned()) { + const msg = this._errorMsg('Cannot call hash method if transaction is not signed'); + throw new Error(msg); + } + + if (Object.isFrozen(this)) { + if (!this.cache.hash) { + this.cache.hash = keccak256(RLP.encode(this.raw())); + } + return this.cache.hash; + } + + return keccak256(RLP.encode(this.raw())); + } + + /** + * Computes a sha3-256 hash which can be used to verify the signature + */ + public getMessageToVerifySignature() { + if (!this.isSigned()) { + const msg = this._errorMsg('This transaction is not signed'); + throw new Error(msg); + } + const message = this._getMessageToSign(); + return keccak256(RLP.encode(message)); + } + + /** + * Returns the public key of the sender + */ + public getSenderPublicKey(): Uint8Array { + const msgHash = this.getMessageToVerifySignature(); + + const { v, r, s } = this; + + this._validateHighS(); + + try { + return ecrecover( + msgHash, + v!, + bigIntToUnpaddedUint8Array(r!), + bigIntToUnpaddedUint8Array(s!), + this.supports(Capability.EIP155ReplayProtection) + ? this.common.chainId() + : undefined, + ); + } catch (e: any) { + const msg = this._errorMsg('Invalid Signature'); + throw new Error(msg); + } + } + + /** + * Process the v, r, s values from the `sign` method of the base transaction. + */ + protected _processSignature(_v: bigint, r: Uint8Array, s: Uint8Array) { + let v = _v; + if (this.supports(Capability.EIP155ReplayProtection)) { + v += this.common.chainId() * BigInt(2) + BigInt(8); + } + + const opts = { ...this.txOptions, common: this.common }; + + return Transaction.fromTxData( + { + nonce: this.nonce, + gasPrice: this.gasPrice, + gasLimit: this.gasLimit, + to: this.to, + value: this.value, + data: this.data, + v, + r: uint8ArrayToBigInt(r), + s: uint8ArrayToBigInt(s), + }, + opts, + ); + } + + /** + * Returns an object with the JSON representation of the transaction. + */ + public toJSON(): JsonTx { + return { + nonce: bigIntToHex(this.nonce), + gasPrice: bigIntToHex(this.gasPrice), + gasLimit: bigIntToHex(this.gasLimit), + to: this.to !== undefined ? this.to.toString() : undefined, + value: bigIntToHex(this.value), + data: bytesToHex(this.data), + v: this.v !== undefined ? bigIntToHex(this.v) : undefined, + r: this.r !== undefined ? bigIntToHex(this.r) : undefined, + s: this.s !== undefined ? bigIntToHex(this.s) : undefined, + }; + } + + /** + * Validates tx's `v` value + */ + private _validateTxV(_v?: bigint, common?: Common): Common { + let chainIdBigInt; + const v = _v !== undefined ? Number(_v) : undefined; + // Check for valid v values in the scope of a signed legacy tx + if (v !== undefined) { + // v is 1. not matching the EIP-155 chainId included case and... + // v is 2. not matching the classic v=27 or v=28 case + if (v < 37 && v !== 27 && v !== 28) { + throw new Error( + `Legacy txs need either v = 27/28 or v >= 37 (EIP-155 replay protection), got v = ${v}`, + ); + } + } + + // No unsigned tx and EIP-155 activated and chain ID included + if ( + v !== undefined && + v !== 0 && + (!common || common.gteHardfork('spuriousDragon')) && + v !== 27 && + v !== 28 + ) { + if (common) { + if (!meetsEIP155(BigInt(v), common.chainId())) { + throw new Error( + `Incompatible EIP155-based V ${v} and chain id ${common.chainId()}. See the Common parameter of the Transaction constructor to set the chain id.`, + ); + } + } else { + // Derive the original chain ID + let numSub; + if ((v - 35) % 2 === 0) { + numSub = 35; + } else { + numSub = 36; + } + // Use derived chain ID to create a proper Common + chainIdBigInt = BigInt(v - numSub) / BigInt(2); + } + } + return this._getCommon(common, chainIdBigInt); + } + + /** + * Return a compact error string representation of the object + */ + public errorStr() { + let errorStr = this._getSharedErrorPostfix(); + errorStr += ` gasPrice=${this.gasPrice}`; + return errorStr; + } + + /** + * Internal helper function to create an annotated error message + * + * @param msg Base error message + * @hidden + */ + protected _errorMsg(msg: string) { + return `${msg} (${this.errorStr()})`; + } +} diff --git a/packages/web3-eth-accounts/src/tx/transactionFactory.ts b/packages/web3-eth-accounts/src/tx/transactionFactory.ts new file mode 100644 index 00000000000..a677543c64f --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/transactionFactory.ts @@ -0,0 +1,148 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Numbers } from 'web3-types'; +import { isUint8Array } from 'web3-utils'; +import { toUint8Array, uint8ArrayToBigInt } from '../common/utils.js'; +import { FeeMarketEIP1559Transaction } from './eip1559Transaction.js'; +import { AccessListEIP2930Transaction } from './eip2930Transaction.js'; +import { Transaction } from './legacyTransaction.js'; +import type { TypedTransaction } from '../types.js'; + +import type { + AccessListEIP2930TxData, + FeeMarketEIP1559TxData, + TxData, + TxOptions, +} from './types.js'; +import { BaseTransaction } from './baseTransaction.js'; + +const extraTxTypes: Map> = new Map(); + +// eslint-disable-next-line @typescript-eslint/no-extraneous-class +export class TransactionFactory { + // It is not possible to instantiate a TransactionFactory object. + // eslint-disable-next-line @typescript-eslint/no-empty-function, no-useless-constructor + private constructor() {} + + public static typeToInt(txType: Numbers) { + return Number(uint8ArrayToBigInt(toUint8Array(txType))); + } + + public static registerTransactionType>( + type: Numbers, + txClass: NewTxTypeClass, + ) { + const txType = TransactionFactory.typeToInt(type); + extraTxTypes.set(txType, txClass); + } + + /** + * Create a transaction from a `txData` object + * + * @param txData - The transaction data. The `type` field will determine which transaction type is returned (if undefined, creates a legacy transaction) + * @param txOptions - Options to pass on to the constructor of the transaction + */ + public static fromTxData( + txData: TxData | TypedTransaction, + txOptions: TxOptions = {}, + ): TypedTransaction { + if (!('type' in txData) || txData.type === undefined) { + // Assume legacy transaction + return Transaction.fromTxData(txData as TxData, txOptions); + } + const txType = TransactionFactory.typeToInt(txData.type); + if (txType === 0) { + return Transaction.fromTxData(txData as TxData, txOptions); + } + if (txType === 1) { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return AccessListEIP2930Transaction.fromTxData( + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + txData, + txOptions, + ); + } + if (txType === 2) { + return FeeMarketEIP1559Transaction.fromTxData( + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + txData, + txOptions, + ); + } + const ExtraTransaction = extraTxTypes.get(txType); + if (ExtraTransaction?.fromTxData) { + return ExtraTransaction.fromTxData(txData, txOptions) as TypedTransaction; + } + + throw new Error(`Tx instantiation with type ${txType} not supported`); + } + + /** + * This method tries to decode serialized data. + * + * @param data - The data Uint8Array + * @param txOptions - The transaction options + */ + public static fromSerializedData( + data: Uint8Array, + txOptions: TxOptions = {}, + ): TypedTransaction { + if (data[0] <= 0x7f) { + // Determine the type. + switch (data[0]) { + case 1: + return AccessListEIP2930Transaction.fromSerializedTx(data, txOptions); + case 2: + return FeeMarketEIP1559Transaction.fromSerializedTx(data, txOptions); + default: { + const ExtraTransaction = extraTxTypes.get(Number(data[0])); + if (ExtraTransaction?.fromSerializedTx) { + return ExtraTransaction.fromSerializedTx( + data, + txOptions, + ) as TypedTransaction; + } + + throw new Error(`TypedTransaction with ID ${data[0]} unknown`); + } + } + } else { + return Transaction.fromSerializedTx(data, txOptions); + } + } + + /** + * When decoding a BlockBody, in the transactions field, a field is either: + * A Uint8Array (a TypedTransaction - encoded as TransactionType || rlp(TransactionPayload)) + * A Uint8Array[] (Legacy Transaction) + * This method returns the right transaction. + * + * @param data - A Uint8Array or Uint8Array[] + * @param txOptions - The transaction options + */ + public static fromBlockBodyData(data: Uint8Array | Uint8Array[], txOptions: TxOptions = {}) { + if (isUint8Array(data)) { + return this.fromSerializedData(data , txOptions); + } + if (Array.isArray(data)) { + // It is a legacy transaction + return Transaction.fromValuesArray(data, txOptions); + } + throw new Error('Cannot decode transaction: unknown type input'); + } +} diff --git a/packages/web3-eth-accounts/src/tx/types.ts b/packages/web3-eth-accounts/src/tx/types.ts new file mode 100644 index 00000000000..830c9e7582f --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/types.ts @@ -0,0 +1,288 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import type { HexString, Numbers } from 'web3-types'; + +import type { Common } from '../common/common.js'; +// eslint-disable-next-line require-extensions/require-extensions +import type { Uint8ArrayLike, PrefixedHexString } from '../common/types'; +import { Address } from './address.js'; + +/** + * Can be used in conjunction with {@link Transaction.supports} + * to query on tx capabilities + */ +export enum Capability { + /** + * Tx supports EIP-155 replay protection + * See: [155](https://eips.ethereum.org/EIPS/eip-155) Replay Attack Protection EIP + */ + EIP155ReplayProtection = 155, + + /** + * Tx supports EIP-1559 gas fee market mechanism + * See: [1559](https://eips.ethereum.org/EIPS/eip-1559) Fee Market EIP + */ + EIP1559FeeMarket = 1559, + + /** + * Tx is a typed transaction as defined in EIP-2718 + * See: [2718](https://eips.ethereum.org/EIPS/eip-2718) Transaction Type EIP + */ + EIP2718TypedTransaction = 2718, + + /** + * Tx supports access list generation as defined in EIP-2930 + * See: [2930](https://eips.ethereum.org/EIPS/eip-2930) Access Lists EIP + */ + EIP2930AccessLists = 2930, +} + +/** + * The options for initializing a {@link Transaction}. + */ +export interface TxOptions { + /** + * A {@link Common} object defining the chain and hardfork for the transaction. + * + * Object will be internally copied so that tx behavior don't incidentally + * change on future HF changes. + * + * Default: {@link Common} object set to `mainnet` and the default hardfork as defined in the {@link Common} class. + * + * Current default hardfork: `istanbul` + */ + common?: Common; + /** + * A transaction object by default gets frozen along initialization. This gives you + * strong additional security guarantees on the consistency of the tx parameters. + * It also enables tx hash caching when the `hash()` method is called multiple times. + * + * If you need to deactivate the tx freeze - e.g. because you want to subclass tx and + * add additional properties - it is strongly encouraged that you do the freeze yourself + * within your code instead. + * + * Default: true + */ + freeze?: boolean; + + /** + * Allows unlimited contract code-size init while debugging. This (partially) disables EIP-3860. + * Gas cost for initcode size analysis will still be charged. Use with caution. + */ + allowUnlimitedInitCodeSize?: boolean; +} + +/* + * Access List types + */ + +export type AccessListItem = { + address: PrefixedHexString; + storageKeys: PrefixedHexString[]; +}; + +/* + * An Access List as a tuple of [address: Uint8Array, storageKeys: Uint8Array[]] + */ +export type AccessListUint8ArrayItem = [Uint8Array, Uint8Array[]]; +export type AccessListUint8Array = AccessListUint8ArrayItem[]; +export type AccessList = AccessListItem[]; + +export function isAccessListUint8Array( + input: AccessListUint8Array | AccessList, +): input is AccessListUint8Array { + if (input.length === 0) { + return true; + } + const firstItem = input[0]; + if (Array.isArray(firstItem)) { + return true; + } + return false; +} + +export function isAccessList(input: AccessListUint8Array | AccessList): input is AccessList { + return !isAccessListUint8Array(input); // This is exactly the same method, except the output is negated. +} + +export interface ECDSASignature { + v: bigint; + r: Uint8Array; + s: Uint8Array; +} + +/** + * Legacy {@link Transaction} Data + */ +export type TxData = { + /** + * The transaction's nonce. + */ + nonce?: Numbers | Uint8Array; + + /** + * The transaction's gas price. + */ + // eslint-disable-next-line @typescript-eslint/ban-types + gasPrice?: Numbers | Uint8Array | null; + + /** + * The transaction's gas limit. + */ + gasLimit?: Numbers | Uint8Array; + + /** + * The transaction's the address is sent to. + */ + to?: Address | Uint8Array | HexString; + + /** + * The amount of Ether sent. + */ + value?: Numbers | Uint8Array; + + /** + * This will contain the data of the message or the init of a contract. + */ + data?: Uint8ArrayLike; + + /** + * EC recovery ID. + */ + v?: Numbers | Uint8Array; + + /** + * EC signature parameter. + */ + r?: Numbers | Uint8Array; + + /** + * EC signature parameter. + */ + s?: Numbers | Uint8Array; + + /** + * The transaction type + */ + + type?: Numbers; +}; + +/** + * {@link AccessListEIP2930Transaction} data. + */ +export interface AccessListEIP2930TxData extends TxData { + /** + * The transaction's chain ID + */ + chainId?: Numbers; + + /** + * The access list which contains the addresses/storage slots which the transaction wishes to access + */ + // eslint-disable-next-line @typescript-eslint/ban-types + accessList?: AccessListUint8Array | AccessList | null; +} + +/** + * {@link FeeMarketEIP1559Transaction} data. + */ +export interface FeeMarketEIP1559TxData extends AccessListEIP2930TxData { + /** + * The transaction's gas price, inherited from {@link Transaction}. This property is not used for EIP1559 + * transactions and should always be undefined for this specific transaction type. + */ + // eslint-disable-next-line @typescript-eslint/ban-types + gasPrice?: never | null; + /** + * The maximum inclusion fee per gas (this fee is given to the miner) + */ + maxPriorityFeePerGas?: Numbers | Uint8Array; + /** + * The maximum total fee + */ + maxFeePerGas?: Numbers | Uint8Array; +} + +/** + * Uint8Array values array for a legacy {@link Transaction} + */ +export type TxValuesArray = Uint8Array[]; + +/** + * Uint8Array values array for an {@link AccessListEIP2930Transaction} + */ +export type AccessListEIP2930ValuesArray = [ + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + AccessListUint8Array, + Uint8Array?, + Uint8Array?, + Uint8Array?, +]; + +/** + * Uint8Array values array for a {@link FeeMarketEIP1559Transaction} + */ +export type FeeMarketEIP1559ValuesArray = [ + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + Uint8Array, + AccessListUint8Array, + Uint8Array?, + Uint8Array?, + Uint8Array?, +]; + +type JsonAccessListItem = { address: string; storageKeys: string[] }; + +/** + * Generic interface for all tx types with a + * JSON representation of a transaction. + * + * Note that all values are marked as optional + * and not all the values are present on all tx types + * (an EIP1559 tx e.g. lacks a `gasPrice`). + */ +export interface JsonTx { + nonce?: string; + gasPrice?: string; + gasLimit?: string; + to?: string; + data?: string; + v?: string; + r?: string; + s?: string; + value?: string; + chainId?: string; + accessList?: JsonAccessListItem[]; + type?: string; + maxPriorityFeePerGas?: string; + maxFeePerGas?: string; + maxFeePerDataGas?: string; + versionedHashes?: string[]; +} diff --git a/packages/web3-eth-accounts/src/tx/utils.ts b/packages/web3-eth-accounts/src/tx/utils.ts new file mode 100644 index 00000000000..3b2fabbe4ed --- /dev/null +++ b/packages/web3-eth-accounts/src/tx/utils.ts @@ -0,0 +1,150 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString } from 'web3-types'; +import { bytesToHex } from 'web3-utils'; +import { setLengthLeft, toUint8Array } from '../common/utils.js'; +import type { AccessList, AccessListUint8Array, AccessListItem } from './types.js'; +import { isAccessList } from './types.js'; + +import type { Common } from '../common/common.js'; + +export const checkMaxInitCodeSize = (common: Common, length: number) => { + const maxInitCodeSize = common.param('vm', 'maxInitCodeSize'); + if (maxInitCodeSize && BigInt(length) > maxInitCodeSize) { + throw new Error( + `the initcode size of this transaction is too large: it is ${length} while the max is ${common.param( + 'vm', + 'maxInitCodeSize', + )}`, + ); + } +}; + +export const getAccessListData = (accessList: AccessListUint8Array | AccessList) => { + let AccessListJSON; + let uint8arrayAccessList; + if (isAccessList(accessList)) { + AccessListJSON = accessList; + const newAccessList: AccessListUint8Array = []; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < accessList.length; i += 1) { + const item: AccessListItem = accessList[i]; + const addressBytes = toUint8Array(item.address); + const storageItems: Uint8Array[] = []; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < item.storageKeys.length; index += 1) { + storageItems.push(toUint8Array(item.storageKeys[index])); + } + newAccessList.push([addressBytes, storageItems]); + } + uint8arrayAccessList = newAccessList; + } else { + uint8arrayAccessList = accessList ?? []; + // build the JSON + const json: AccessList = []; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < uint8arrayAccessList.length; i += 1) { + const data = uint8arrayAccessList[i]; + const address = bytesToHex(data[0]); + const storageKeys: string[] = []; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let item = 0; item < data[1].length; item += 1) { + storageKeys.push(bytesToHex(data[1][item])); + } + const jsonItem: AccessListItem = { + address, + storageKeys, + }; + json.push(jsonItem); + } + AccessListJSON = json; + } + + return { + AccessListJSON, + accessList: uint8arrayAccessList, + }; +}; + +export const verifyAccessList = (accessList: AccessListUint8Array) => { + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let key = 0; key < accessList.length; key += 1) { + const accessListItem = accessList[key]; + const address = accessListItem[0]; + const storageSlots = accessListItem[1]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/consistent-type-assertions + if ((accessListItem)[2] !== undefined) { + throw new Error( + 'Access list item cannot have 3 elements. It can only have an address, and an array of storage slots.', + ); + } + if (address.length !== 20) { + throw new Error('Invalid EIP-2930 transaction: address length should be 20 bytes'); + } + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let storageSlot = 0; storageSlot < storageSlots.length; storageSlot += 1) { + if (storageSlots[storageSlot].length !== 32) { + throw new Error( + 'Invalid EIP-2930 transaction: storage slot length should be 32 bytes', + ); + } + } + } +}; + +export const getAccessListJSON = ( + accessList: AccessListUint8Array, +): { + address: HexString; + storageKeys: HexString[]; +}[] => { + const accessListJSON: { address: HexString; storageKeys: HexString[] }[] = []; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < accessList.length; index += 1) { + const item: any = accessList[index]; + const JSONItem: { address: HexString; storageKeys: HexString[] } = { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/consistent-type-assertions + address: bytesToHex(setLengthLeft(item[0], 20)), + storageKeys: [], + }; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/prefer-optional-chain + const storageSlots: Uint8Array[] = item && item[1]; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let slot = 0; slot < storageSlots.length; slot += 1) { + const storageSlot = storageSlots[slot]; + JSONItem.storageKeys.push(bytesToHex(setLengthLeft(storageSlot, 32))); + } + accessListJSON.push(JSONItem); + } + return accessListJSON; +}; + +export const getDataFeeEIP2930 = (accessList: AccessListUint8Array, common: Common): number => { + const accessListStorageKeyCost = common.param('gasPrices', 'accessListStorageKeyCost'); + const accessListAddressCost = common.param('gasPrices', 'accessListAddressCost'); + + let slots = 0; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < accessList.length; index += 1) { + const item = accessList[index]; + const storageSlots = item[1]; + slots += storageSlots.length; + } + + const addresses = accessList.length; + return addresses * Number(accessListAddressCost) + slots * Number(accessListStorageKeyCost); +}; diff --git a/packages/web3-eth-accounts/src/types.ts b/packages/web3-eth-accounts/src/types.ts new file mode 100644 index 00000000000..ed45ad94ffb --- /dev/null +++ b/packages/web3-eth-accounts/src/types.ts @@ -0,0 +1,94 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3BaseWalletAccount, HexString } from 'web3-types'; +import { FeeMarketEIP1559TxData, AccessListEIP2930TxData, TxData } from './tx/types.js'; +import { AccessListEIP2930Transaction, FeeMarketEIP1559Transaction, Transaction } from './tx'; + +export type SignatureObject = { + messageHash: string; + r: string; + s: string; + v: string; +}; + +export type SignTransactionResult = SignatureObject & { + rawTransaction: string; + transactionHash: string; +}; + +export type SignTransactionFunction = ( + transaction: + | TxData + | AccessListEIP2930TxData + | FeeMarketEIP1559TxData + | Record, +) => SignTransactionResult; + +export type SignResult = SignatureObject & { + message?: string; + signature: string; +}; + +export type SignFunction = (data: string, privateKey: string) => SignResult; + +// https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition + +export interface Web3Account extends Web3BaseWalletAccount { + address: HexString; + privateKey: HexString; +} + +// To avoid dependency of "dom" library for TS, copying this interface within project +/** This Web Storage API interface provides access to a particular domain's session or local storage. It allows, for example, the addition, modification, or deletion of stored data items. */ +export interface WebStorage { + /** Returns the number of key/value pairs. */ + readonly length: number; + /** + * Removes all key/value pairs, if there are any. + * + * Dispatches a storage event on Window objects holding an equivalent Storage object. + */ + clear(): void; + /** Returns the current value associated with the given key, or null if the given key does not exist. */ + // eslint-disable-next-line @typescript-eslint/ban-types + getItem(key: string): string | null; + /** Returns the name of the nth key, or null if n is greater than or equal to the number of key/value pairs. */ + // eslint-disable-next-line @typescript-eslint/ban-types + key(index: number): string | null; + /** + * Removes the key/value pair with the given key, if a key/value pair with the given key exists. + * + * Dispatches a storage event on Window objects holding an equivalent Storage object. + */ + removeItem(key: string): void; + /** + * Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously. + * + * Throws a "QuotaExceededError" DOMException exception if the new value couldn't be set. (Setting could fail if, e.g., the user has disabled storage for the site, or if the quota has been exceeded.) + * + * Dispatches a storage event on Window objects holding an equivalent Storage object. + */ + setItem(key: string, value: string): void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [name: string]: any; +} + +export type TypedTransaction = + | Transaction + | AccessListEIP2930Transaction + | FeeMarketEIP1559Transaction; diff --git a/packages/web3-eth-accounts/src/wallet.ts b/packages/web3-eth-accounts/src/wallet.ts new file mode 100644 index 00000000000..1e189fe4cbc --- /dev/null +++ b/packages/web3-eth-accounts/src/wallet.ts @@ -0,0 +1,443 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3BaseWallet, Web3BaseWalletAccount, KeyStore } from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { WebStorage } from './types.js'; + +type BrowserError = { code: number; name: string }; + +/** + * Wallet is an in memory `wallet` that can hold multiple accounts. + * These accounts can be used when using web3.eth.sendTransaction() or web3.eth.contract.methods.contractfunction().send(); + * + * For using Wallet functionality, install Web3 package using `npm i web3` or `yarn add web3`. + * After that, Wallet functionality will be available as mentioned below. + * + * ```ts + * import { Web3 } from 'web3'; + * const web3 = new Web3('http://127.0.0.1:7545'); + * + * const wallet = await web3.eth.accounts.wallet.create(2); + * + * const signature = wallet.at(0).sign("Test Data"); // use wallet + * + * // fund account before sending following transaction ... + * + * const receipt = await web3.eth.sendTransaction({ // internally sign transaction using wallet + * from: wallet.at(0).address, + * to: "0xdAC17F958D2ee523a2206206994597C13D831ec7", + * value: 1 + * //.... + * }); + * ``` + */ +export class Wallet< + T extends Web3BaseWalletAccount = Web3BaseWalletAccount, +> extends Web3BaseWallet { + private readonly _addressMap = new Map(); + private readonly _defaultKeyName = 'web3js_wallet'; + + /** + * Get the storage object of the browser + * + * @returns the storage + */ + public static getStorage(): WebStorage | undefined { + let storage: WebStorage | undefined; + + try { + storage = window.localStorage; + const x = '__storage_test__'; + storage.setItem(x, x); + storage.removeItem(x); + + return storage; + } catch (e: unknown) { + return (e as BrowserError) && + // everything except Firefox + ((e as BrowserError).code === 22 || + // Firefox + (e as BrowserError).code === 1014 || + // test name field too, because code might not be present + // everything except Firefox + (e as BrowserError).name === 'QuotaExceededError' || + // Firefox + (e as BrowserError).name === 'NS_ERROR_DOM_QUOTA_REACHED') && + // acknowledge QuotaExceededError only if there's something already stored + !isNullish(storage) && + storage.length !== 0 + ? storage + : undefined; + } + } + /** + * Generates one or more accounts in the wallet. If wallets already exist they will not be overridden. + * + * @param numberOfAccounts - Number of accounts to create. Leave empty to create an empty wallet. + * @returns The wallet + * ```ts + * web3.eth.accounts.wallet.create(2) + * > Wallet(2) [ + * { + * address: '0xde38310a42B751AE57d30cFFF4a0A3c52A442fCE', + * privateKey: '0x6422c9d28efdcbee93c1d32a5fc6fd6fa081b985487885296cf8c9bbb5872600', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [Function: encrypt] + * }, + * { + * address: '0x766BF755246d924B1d017Fdb5390f38a60166691', + * privateKey: '0x756530f13c0eb636ebdda655335f5dea9921e3362e2e588b0ad59e556f7751f0', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [Function: encrypt] + * }, + * _accountProvider: { + * create: [Function: create], + * privateKeyToAccount: [Function: privateKeyToAccount], + * decrypt: [Function: decrypt] + * }, + * _addressMap: Map(2) { + * '0xde38310a42b751ae57d30cfff4a0a3c52a442fce' => 0, + * '0x766bf755246d924b1d017fdb5390f38a60166691' => 1 + * }, + * _defaultKeyName: 'web3js_wallet' + * ] + * + * ``` + */ + + public create(numberOfAccounts: number) { + for (let i = 0; i < numberOfAccounts; i += 1) { + this.add(this._accountProvider.create()); + } + + return this; + } + + /** + * Adds an account using a private key or account object to the wallet. + * + * @param account - A private key or account object + * @returns The wallet + * + * ```ts + * web3.eth.accounts.wallet.add('0xbce9b59981303e76c4878b1a6d7b088ec6b9dd5c966b7d5f54d7a749ff683387'); + * > Wallet(1) [ + * { + * address: '0x85D70633b90e03e0276B98880286D0D055685ed7', + * privateKey: '0xbce9b59981303e76c4878b1a6d7b088ec6b9dd5c966b7d5f54d7a749ff683387', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [Function: encrypt] + * }, + * _accountProvider: { + * create: [Function: create], + * privateKeyToAccount: [Function: privateKeyToAccount], + * decrypt: [Function: decrypt] + * }, + * _addressMap: Map(1) { '0x85d70633b90e03e0276b98880286d0d055685ed7' => 0 }, + * _defaultKeyName: 'web3js_wallet' + * ] + * ``` + */ + public add(account: T | string): this { + if (typeof account === 'string') { + return this.add(this._accountProvider.privateKeyToAccount(account)); + } + let index = this.length; + const existAccount = this.get(account.address); + if (existAccount) { + console.warn(`Account ${account.address.toLowerCase()} already exists.`); + index = this._addressMap.get(account.address.toLowerCase()) ?? index; + } + this._addressMap.set(account.address.toLowerCase(), index); + this[index] = account; + + return this; + } + /** + * Get the account of the wallet with either the index or public address. + * + * @param addressOrIndex - A string of the address or number index within the wallet. + * @returns The account object or undefined if the account doesn't exist + */ + + public get(addressOrIndex: string | number): T | undefined { + if (typeof addressOrIndex === 'string') { + const index = this._addressMap.get(addressOrIndex.toLowerCase()); + + if (!isNullish(index)) { + return this[index]; + } + + return undefined; + } + + return this[addressOrIndex]; + } + + /** + * Removes an account from the wallet. + * + * @param addressOrIndex - The account address, or index in the wallet. + * @returns true if the wallet was removed. false if it couldn't be found. + * ```ts + * web3.eth.accounts.wallet.add('0xbce9b59981303e76c4878b1a6d7b088ec6b9dd5c966b7d5f54d7a749ff683387'); + * + * web3.eth.accounts.wallet.remove('0x85D70633b90e03e0276B98880286D0D055685ed7'); + * > true + * web3.eth.accounts.wallet + * > Wallet(0) [ + * _accountProvider: { + * create: [Function: create], + * privateKeyToAccount: [Function: privateKeyToAccount], + * decrypt: [Function: decrypt] + * }, + * _addressMap: Map(0) {}, + * _defaultKeyName: 'web3js_wallet' + * ] + * ``` + */ + public remove(addressOrIndex: string | number): boolean { + if (typeof addressOrIndex === 'string') { + const index = this._addressMap.get(addressOrIndex.toLowerCase()); + if (isNullish(index)) { + return false; + } + this._addressMap.delete(addressOrIndex.toLowerCase()); + this.splice(index, 1); + + return true; + } + + if (this[addressOrIndex]) { + this.splice(addressOrIndex, 1); + return true; + } + + return false; + } + + /** + * Securely empties the wallet and removes all its accounts. + * Use this with *caution as it will remove all accounts stored in local wallet. + * + * @returns The wallet object + * ```ts + * + * web3.eth.accounts.wallet.clear(); + * > Wallet(0) [ + * _accountProvider: { + * create: [Function: create], + * privateKeyToAccount: [Function: privateKeyToAccount], + * decrypt: [Function: decrypt] + * }, + * _addressMap: Map(0) {}, + * _defaultKeyName: 'web3js_wallet' + * ] + * ``` + */ + public clear() { + this._addressMap.clear(); + + // Setting length clears the Array in JS. + this.length = 0; + + return this; + } + + /** + * Encrypts all wallet accounts to an array of encrypted keystore v3 objects. + * + * @param password - The password which will be used for encryption + * @param options - encryption options + * @returns An array of the encrypted keystore v3. + * + * ```ts + * web3.eth.accounts.wallet.create(1) + * web3.eth.accounts.wallet.encrypt("abc").then(console.log); + * > [ + * '{"version":3,"id":"fa46e213-a7c3-4844-b903-dd14d39cc7db", + * "address":"fa3e41a401609103c241431cbdee8623ae2a321a","crypto": + * {"ciphertext":"8d179a911d6146ad2924e86bf493ed89b8ff3596ffec0816e761c542016ab13c", + * "cipherparams":{"iv":"acc888c6cf4a19b86846cef0185a7164"},"cipher":"aes-128-ctr", + * "kdf":"scrypt","kdfparams":{"n":8192,"r":8,"p":1,"dklen":32,"salt":"6a743c9b367d15f4758e4f3f3378ff0fd443708d1c64854e07588ea5331823ae"}, + * "mac":"410544c8307e3691fda305eb3722d82c3431f212a87daa119a21587d96698b57"}}' + * ] + * ``` + */ + public async encrypt( + password: string, + options?: Record | undefined, + ): Promise { + return Promise.all(this.map(async (account: T) => account.encrypt(password, options))); + } + + /** + * Decrypts keystore v3 objects. + * + * @param encryptedWallets - An array of encrypted keystore v3 objects to decrypt + * @param password - The password to encrypt with + * @param options - decrypt options for the wallets + * @returns The decrypted wallet object + * + * ```ts + * web3.eth.accounts.wallet.decrypt([ + * { version: 3, + * id: '83191a81-aaca-451f-b63d-0c5f3b849289', + * address: '06f702337909c06c82b09b7a22f0a2f0855d1f68', + * crypto: + * { ciphertext: '7d34deae112841fba86e3e6cf08f5398dda323a8e4d29332621534e2c4069e8d', + * cipherparams: { iv: '497f4d26997a84d570778eae874b2333' }, + * cipher: 'aes-128-ctr', + * kdf: 'scrypt', + * kdfparams: + * { dklen: 32, + * salt: '208dd732a27aa4803bb760228dff18515d5313fd085bbce60594a3919ae2d88d', + * n: 262144, + * r: 8, + * p: 1 }, + * mac: '0062a853de302513c57bfe3108ab493733034bf3cb313326f42cf26ea2619cf9' } }, + * { version: 3, + * id: '7d6b91fa-3611-407b-b16b-396efb28f97e', + * address: 'b5d89661b59a9af0b34f58d19138baa2de48baaf', + * crypto: + * { ciphertext: 'cb9712d1982ff89f571fa5dbef447f14b7e5f142232bd2a913aac833730eeb43', + * cipherparams: { iv: '8cccb91cb84e435437f7282ec2ffd2db' }, + * cipher: 'aes-128-ctr', + * kdf: 'scrypt', + * kdfparams: + * { dklen: 32, + * salt: '08ba6736363c5586434cd5b895e6fe41ea7db4785bd9b901dedce77a1514e8b8', + * n: 262144, + * r: 8, + * p: 1 }, + * mac: 'd2eb068b37e2df55f56fa97a2bf4f55e072bef0dd703bfd917717d9dc54510f0' } } + * ], 'test').then(console.log) + * > Wallet { + * _accountProvider: { + * create: [Function: create], + * privateKeyToAccount: [Function: privateKeyToAccount], + * decrypt: [Function: decrypt] + * }, + * _defaultKeyName: 'web3js_wallet', + * _accounts: { + * '0x85d70633b90e03e0276b98880286d0d055685ed7': { + * address: '0x85D70633b90e03e0276B98880286D0D055685ed7', + * privateKey: '0xbce9b59981303e76c4878b1a6d7b088ec6b9dd5c966b7d5f54d7a749ff683387', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [Function: encrypt] + * }, + * '0x06f702337909c06c82b09b7a22f0a2f0855d1f68': { + * address: '0x06F702337909C06C82B09B7A22F0a2f0855d1F68', + * privateKey: '87a51da18900da7398b3bab03996833138f269f8f66dd1237b98df6b9ce14573', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [Function: encrypt] + * }, + * '0xb5d89661b59a9af0b34f58d19138baa2de48baaf': { + * address: '0xB5d89661B59a9aF0b34f58D19138bAa2de48BAaf', + * privateKey: '7ee61c5282979aae9dd795bb6a54e8bdc2bfe009acb64eb9a67322eec3b3da6e', + * signTransaction: [Function: signTransaction], + * sign: [Function: sign], + * encrypt: [Function: encrypt] + * } + * } + * } + * ``` + */ + public async decrypt( + encryptedWallets: KeyStore[], + password: string, + options?: Record | undefined, + ) { + const results = await Promise.all( + encryptedWallets.map(async (wallet: KeyStore) => + this._accountProvider.decrypt(wallet, password, options), + ), + ); + for (const res of results) { + this.add(res); + } + return this; + } + + /** + * Stores the wallet encrypted and as string in local storage. + * **__NOTE:__** Browser only + * + * @param password - The password to encrypt the wallet + * @param keyName - (optional) The key used for the local storage position, defaults to `"web3js_wallet"`. + * @returns Will return boolean value true if saved properly + * ```ts + * web3.eth.accounts.wallet.save('test#!$'); + * >true + * ``` + */ + public async save(password: string, keyName?: string) { + const storage = Wallet.getStorage(); + + if (!storage) { + throw new Error('Local storage not available.'); + } + + storage.setItem( + keyName ?? this._defaultKeyName, + JSON.stringify(await this.encrypt(password)), + ); + + return true; + } + + /** + * Loads a wallet from local storage and decrypts it. + * **__NOTE:__** Browser only + * + * @param password - The password to decrypt the wallet. + * @param keyName - (optional)The key used for local storage position, defaults to `web3js_wallet"` + * @returns Returns the wallet object + * + * ```ts + * web3.eth.accounts.wallet.save('test#!$'); + * > true + * web3.eth.accounts.wallet.load('test#!$'); + * { defaultKeyName: "web3js_wallet", + * length: 0, + * _accounts: Accounts {_requestManager: RequestManager, givenProvider: Proxy, providers: {…}, _provider: WebsocketProvider, …}, + * [[Prototype]]: Object + * } + * ``` + */ + public async load(password: string, keyName?: string) { + const storage = Wallet.getStorage(); + + if (!storage) { + throw new Error('Local storage not available.'); + } + + const keystore = storage.getItem(keyName ?? this._defaultKeyName); + + if (keystore) { + await this.decrypt((JSON.parse(keystore) as KeyStore[]) || [], password); + } + + return this; + } +} diff --git a/packages/web3-eth-accounts/test/.eslintrc.js b/packages/web3-eth-accounts/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-eth-accounts/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-accounts/test/config/jest.config.js b/packages/web3-eth-accounts/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-eth-accounts/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-eth-accounts/test/config/setup.js b/packages/web3-eth-accounts/test/config/setup.js new file mode 100644 index 00000000000..b3c35155474 --- /dev/null +++ b/packages/web3-eth-accounts/test/config/setup.js @@ -0,0 +1,28 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; + +const jestTimeout = 10000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth-accounts/test/fixtures/account.ts b/packages/web3-eth-accounts/test/fixtures/account.ts new file mode 100644 index 00000000000..104b5688e97 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/account.ts @@ -0,0 +1,520 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + InvalidKdfError, + InvalidPrivateKeyError, + KeyDerivationError, + PrivateKeyLengthError, + InvalidPasswordError, + IVLengthError, + PBKDF2IterationsError, +} from 'web3-errors'; +import { CipherOptions, KeyStore, Bytes } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; +import { AccessListEIP2930TxData, FeeMarketEIP1559TxData, TxData } from '../../src/tx/types'; +import { sign, signTransaction, encrypt } from '../../src/account'; + +export const validPrivateKeyToAddressData: [string, string][] = [ + [ + '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01', + ], + [ + '0x9e93921f9bca358a96aa66efcccbde12850473be95f63c1453e29656feafeb35', + '0x118C2E5F57FD62C2B5b46a5ae9216F4FF4011a07', + ], + [ + '0xf44e0436edb0afd26b09f7b9f1e7a280d2365fc530aebccf893f1158a449d20a', + '0x8824eEA7A9FF8E051e63ACAc443460151CB6fd92', + ], + [ + '0xf4a2b939592564feb35ab10a8e04f6f2fe0943579fb3c9c33505298978b74893', + '0xd5e099c71B797516c10ED0F0d895f429C2781142', + ], +]; + +export const invalidPrivateKeyToAddressData: [ + any, + PrivateKeyLengthError | InvalidPrivateKeyError, +][] = [ + ['', new InvalidPrivateKeyError()], + [new Uint8Array([]), new PrivateKeyLengthError()], +]; + +export const validPrivateKeytoAccountData: [any, any][] = [ + [ + { + address: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + ignoreLength: false, + }, + { + address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01', + privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + sign, + signTransaction, + encrypt, + }, + ], + [ + { address: '0x9e93921f9bca358a96aa66efcccbde12850473be95f63c1453e29656feafeb35' }, + { + address: '0x118C2E5F57FD62C2B5b46a5ae9216F4FF4011a07', + privateKey: '0x9e93921f9bca358a96aa66efcccbde12850473be95f63c1453e29656feafeb35', + sign, + signTransaction, + encrypt, + }, + ], + [ + { + address: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', // ignoreLength parameter set true + ignoreLength: true, + }, + { + address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01', + privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + sign, + signTransaction, + encrypt, + }, + ], +]; + +export const signatureRecoverData: [string, any][] = [ + [ + 'Some long text with integers 1233 and special characters and unicode \u1234 as well.', + { + r: '0x2ac888726c80494b80b63996455d109aef5db27e673dd92f277ac6e48dc300db', + s: '0x3dfc7549744c2a33a03a2eaa0f2837f54c5951b80d5e05257d605bc695c2ae7f', + address: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + privateKey: '0xcb89ec4b01771c6c8272f4c0aafba2f8ee0b101afb22273b786939a8af7c1912', + data: 'Some long text with integers 1233 and special characters and unicode \u1234 as well.', + // signature done with personal_sign + signatureOrV: + '0x2ac888726c80494b80b63996455d109aef5db27e673dd92f277ac6e48dc300db3dfc7549744c2a33a03a2eaa0f2837f54c5951b80d5e05257d605bc695c2ae7f1c', + }, + ], + [ + 'Some data', + { + r: '0xa8037a6116c176a25e6fc224947fde9e79a2deaa0dd8b67b366fbdfdbffc01f9', + s: '0x53e41351267b20d4a89ebfe9c8f03c04de9b345add4a52f15bd026b63c8fb150', + address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + data: 'Some data', + // signature done with personal_sign + signatureOrV: + '0xa8037a6116c176a25e6fc224947fde9e79a2deaa0dd8b67b366fbdfdbffc01f953e41351267b20d4a89ebfe9c8f03c04de9b345add4a52f15bd026b63c8fb1501b', + }, + ], + [ + 'Some data!%$$%&@*', + { + r: '0x05252412b097c5d080c994d1ea12abcee6f1cae23feb225517a0b691a66e1286', + s: '0x6b3f54292f9cfef98f390670b4d010fc4af7fcd46e41d72870602c117b14921c', + address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + data: 'Some data!%$$%&@*', + // signature done with personal_sign + signatureOrV: + '0x05252412b097c5d080c994d1ea12abcee6f1cae23feb225517a0b691a66e12866b3f54292f9cfef98f390670b4d010fc4af7fcd46e41d72870602c117b14921c1c', + }, + ], + [ + '102', + { + r: '0x0442af06beec07a50981386c8ffb38eed2b51decd90980d8c30eda18f112339c', + s: '0x080f6f5fb41313d623971020faa2354dd6b62518b758823c03e8b87d5ea4a649', + address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + data: '102', + // signature done with personal_sign + signatureOrV: + '0x0442af06beec07a50981386c8ffb38eed2b51decd90980d8c30eda18f112339c080f6f5fb41313d623971020faa2354dd6b62518b758823c03e8b87d5ea4a6491b', + }, + ], + [ + // testcase for recover(data, V, R, S) + 'some data', + { + signatureOrV: '0x1c', + prefixedOrR: '0xb9be9700e1c7fd9c3e5e1b511de5c6f62680480a7f8c68962a74375cabe51c18', + r: '0xb9be9700e1c7fd9c3e5e1b511de5c6f62680480a7f8c68962a74375cabe51c18', + s: '0x6fcbbcf5b1bc357d3e56bef2ef8a1b3ad7e48564dd886d7636eb1c18e1e41f1b', + address: '0x54BF9ed7F22b64a5D69Beea57cFCd378763bcdc5', + privateKey: '0x03a0021a87dc354855f900fd15c063bcc9c155c33b8f2321ec294e0933ef29d2', + signature: + '0xb9be9700e1c7fd9c3e5e1b511de5c6f62680480a7f8c68962a74375cabe51c186fcbbcf5b1bc357d3e56bef2ef8a1b3ad7e48564dd886d7636eb1c18e1e41f1b1c', + }, + ], +]; + +export const transactionsTestData: [TxData | AccessListEIP2930TxData | FeeMarketEIP1559TxData][] = [ + [ + // 'TxLegacy' + { + to: '0x118C2E5F57FD62C2B5b46a5ae9216F4FF4011a07', + value: '0x186A0', + gasLimit: '0x520812', + gasPrice: '0x09184e72a000', + data: '', + chainId: 1, + nonce: 0, + }, + ], + [ + // 'Tx1559' + { + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + maxPriorityFeePerGas: '0x3B9ACA00', + maxFeePerGas: '0xB2D05E00', + gasLimit: '0x6A4012', + value: '0x186A0', + data: '', + chainId: 1, + nonce: 0, + }, + ], + [ + // 'Tx2930' + { + chainId: 1, + nonce: 0, + gasPrice: '0x09184e72a000', + gasLimit: '0x2710321', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '0x186A0', + data: '', + accessList: [ + { + address: '0x0000000000000000000000000000000000000101', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000000', + '0x00000000000000000000000000000000000000000000000000000000000060a7', + ], + }, + ], + }, + ], +]; + +export const invalidPrivateKeytoAccountData: [ + any, + PrivateKeyLengthError | InvalidPrivateKeyError, +][] = [ + ['', new InvalidPrivateKeyError()], + [new Uint8Array([]), new PrivateKeyLengthError()], +]; + +export const validPrivateKeyToPublicKeyData: [ + Bytes, boolean, string // private key, isCompressed, public key +][] = [ + [ + "0x1e046a882bb38236b646c9f135cf90ad90a140810f439875f2a6dd8e50fa261f", // test string to uncompressed publickey + false, + "0x42beb65f179720abaa3ec9a70a539629cbbc5ec65bb57e7fc78977796837e537662dd17042e6449dc843c281067a4d6d8d1a1775a13c41901670d5de7ee6503a", + ], + [ + "0x1e046a882bb38236b646c9f135cf90ad90a140810f439875f2a6dd8e50fa261f", // test string to compressed publickey + true, + "0x42beb65f179720abaa3ec9a70a539629cbbc5ec65bb57e7fc78977796837e537", + ], + [ + hexToBytes("0xd933beabed94a9f23917576596b2bc64ffeacfe5ded09a99c0feee8369bd295d"), // test uint8array to uncompressed publickey + false, + "0x7891db4ed2d26584b0fa87329c40b398c940c08e7dbeb8e3dad83f34dba284c933fb14b1edd8893fa89af3823fd827ee59044033ca068803030afc294de5f390", + ], + [ + hexToBytes("0xd933beabed94a9f23917576596b2bc64ffeacfe5ded09a99c0feee8369bd295d"), // test uint8array to compressed publickey + true, + "0x7891db4ed2d26584b0fa87329c40b398c940c08e7dbeb8e3dad83f34dba284c9", + ], +]; + +export const validEncryptData: [[any, string | Uint8Array, CipherOptions], KeyStore][] = [ + [ + [ + '0x67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a6', + '123', + { + n: 8192, + iv: hexToBytes('0xbfb43120ae00e9de110f8325143a2709'), + salt: hexToBytes( + '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + ), + }, + ], + { + version: 3, + address: 'cda9a91875fc35c8ac1320e098e584495d66e47c', + crypto: { + ciphertext: 'cb3e13e3281ff3861a3f0257fad4c9a51b0eb046f9c7821825c46b210f040b8f', + cipherparams: { iv: 'bfb43120ae00e9de110f8325143a2709' }, + cipher: 'aes-128-ctr', + kdf: 'scrypt', + kdfparams: { + n: 8192, + r: 8, + p: 1, + dklen: 32, + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + }, + mac: '46eb4884e82dc43b5aa415faba53cc653b7038e9d61cc32fd643cf8c396189b7', + }, + id: '1d82a61f-2bba-4ebc-a283-56d49d877eb7', + }, + ], + [ + [ + '0x67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a6', + '123', + { + n: 8192, + iv: 'bfb43120ae00e9de110f8325143a2709', + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + }, + ], + { + version: 3, + address: 'cda9a91875fc35c8ac1320e098e584495d66e47c', + crypto: { + ciphertext: 'cb3e13e3281ff3861a3f0257fad4c9a51b0eb046f9c7821825c46b210f040b8f', + cipherparams: { iv: 'bfb43120ae00e9de110f8325143a2709' }, + cipher: 'aes-128-ctr', + kdf: 'scrypt', + kdfparams: { + n: 8192, + r: 8, + p: 1, + dklen: 32, + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + }, + mac: '46eb4884e82dc43b5aa415faba53cc653b7038e9d61cc32fd643cf8c396189b7', + }, + id: '1d82a61f-2bba-4ebc-a283-56d49d877eb7', + }, + ], + [ + [ + '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + '123', + { + iv: 'bfb43120ae00e9de110f8325143a2709', + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + c: 262144, + kdf: 'pbkdf2', + }, + ], + { + version: 3, + id: 'e6a68d89-b03c-4e7d-82e0-079eebaa0da7', + address: 'b8ce9ab6943e0eced004cde8e3bbed6568b2fa01', + crypto: { + ciphertext: '76512156a34105fa6473ad040c666ae7b917d14c06543accc0d2dc28e6073b12', + cipherparams: { iv: 'bfb43120ae00e9de110f8325143a2709' }, + cipher: 'aes-128-ctr', + kdf: 'pbkdf2', + kdfparams: { + dklen: 32, + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + c: 262144, + prf: 'hmac-sha256', + }, + mac: '46eb4884e82dc43b5aa415faba53cc653b7038e9d61cc32fd643cf8c396189b7', + }, + }, + ], +]; + +export const invalidEncryptData: [ + [any, any, any], + ( + | PrivateKeyLengthError + | InvalidKdfError + | InvalidPrivateKeyError + | InvalidPasswordError + | IVLengthError + | PBKDF2IterationsError + ), +][] = [ + [ + ['0x67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a', '123', {}], + new PrivateKeyLengthError(), + ], + [ + [ + '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + '123', + { + iv: 'bfb43120ae00e9de110f8325143a2709', + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + kdf: 'hkdf', + }, + ], + new InvalidKdfError(), + ], + [ + [undefined, '123', {}], // no private key provided + new InvalidPrivateKeyError(), + ], + [ + // no password provided + ['0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', undefined, {}], + new InvalidPasswordError(), + ], + [ + // iv length is not 16 bytes + [ + '0x67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a6', + '123', + { + n: 8192, + iv: hexToBytes('0xbfb43120ae00e9de110f8325143a27'), + salt: undefined, + }, + ], + new IVLengthError(), + ], + [ + [ + // iterations is less than 1000, should error + '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + '123', + { + iv: 'bfb43120ae00e9de110f8325143a2709', + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + c: 100, + kdf: 'pbkdf2', + }, + ], + new PBKDF2IterationsError(), + ], +]; + +export const validRecover: [string, string][] = [ + [ "I hereby confirm that I am the sole beneficial owner of the assets involved in the business relationship with Fiat24. \nI hereby undertake to inform Fiat24 proactively of any changes to the information contained herein.", "0xec4f73260ac14882e65995a09359896a0ae8f16bd0d28b0d9171655b4e85271e07cda040be059fdcbf52709e3c993eb50a89ce33f41617dc090dc80a583e3c4f00",], // v < 27 + ["test", "0xefb42c22baa0143b322e93b24b0903a0ef47a64b716fbb77debbea55a93dec3e4417aff7dce845723240916c6e34cf17c674828b3addfb0afad966334df5b6311b"] // v >= 27 +] + +export const invalidKeyStore: [[any, string]][] = [ + [ + // invalid keystore error, missing id field + [ + { + // invalid kdf + version: 3, + address: 'cda9a91875fc35c8ac1320e098e584495d66e47c', + crypto: { + ciphertext: '222f49d9cb350b0b9a16472ecb389f8128bc9404233c34ba0484db12fb47534e', + cipherparams: { iv: '8c36f74571c7aef9dd4901c9c1cc720a' }, + cipher: 'aes-128-ctr', + kdf: 'hkdf', + kdfparams: { + dklen: 32, + salt: 'ffd22eb8573fb1de0262cc133042e8fd9b193a46f20c09f25f39fae90a7a2896', + n: 8192, + r: 8, + p: 1, + }, + mac: '46162bad0ac2145ddd399bfb47b474959a2845faf69e69bd1b325ec8db3298cb', + }, + }, + '123', + ], + ], +]; + +export const validDecryptData: [[string, string, CipherOptions, string]][] = [ + [ + [ + '0x67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a6', + '123', + { + iv: hexToBytes('0xbfb43120ae00e9de110f8325143a2709'), + salt: hexToBytes( + '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd', + ), + }, + '0x67f476289210e3bef3c1c75e4de993ff0a00663df00def84e73aa7411eac18a6', + ], + ], +]; + +export const invalidDecryptData: [[any, string], InvalidKdfError | KeyDerivationError][] = [ + [ + [ + { + // invalid kdf + version: 3, + id: '0e9f63f7-9e7c-4d87-bdf7-02ffe8ee6481', + address: 'cda9a91875fc35c8ac1320e098e584495d66e47c', + crypto: { + ciphertext: '222f49d9cb350b0b9a16472ecb389f8128bc9404233c34ba0484db12fb47534e', + cipherparams: { iv: '8c36f74571c7aef9dd4901c9c1cc720a' }, + cipher: 'aes-128-ctr', + kdf: 'hkdf', + kdfparams: { + dklen: 32, + salt: 'ffd22eb8573fb1de0262cc133042e8fd9b193a46f20c09f25f39fae90a7a2896', + n: 8192, + r: 8, + p: 1, + }, + mac: '46162bad0ac2145ddd399bfb47b474959a2845faf69e69bd1b325ec8db3298cb', + }, + }, + '123', + ], + new InvalidKdfError(), + ], + [ + [ + { + // wrong password + version: 3, + id: 'e6a68d89-b03c-4e7d-82e0-079eebaa0da7', + address: 'b8ce9ab6943e0eced004cde8e3bbed6568b2fa01', + crypto: { + ciphertext: '76512156a34105fa6473ad040c666ae7b917d14c06543accc0d2dc28e6073b12', + cipherparams: { iv: 'bfb43120ae00e9de110f8325143a2709' }, + cipher: 'aes-128-ctr', + kdf: 'pbkdf2', + kdfparams: { + dklen: 32, + salt: '210d0ec956787d865358ac45716e6dd42e68d48e346d795746509523aeb477dd00', + c: 262144, + prf: 'hmac-sha256', + }, + mac: '46eb4884e82dc43b5aa415faba53cc653b7038e9d61cc32fd643cf8c396189b7', + }, + }, + '12', + ], + new KeyDerivationError(), + ], +]; + +export const validHashMessageData: [string, string][] = [ + ['🤗', '0x716ce69c5d2d629c168bc02e24a961456bdc5a362d366119305aea73978a0332'], + [ + 'Some long text with integers 1233 and special characters and unicode \u1234 as well.', + '0xff21294f27c6b1e416215feb0b0b904c552c874c4e11b2314dd3afc1714ed8a8', + ], + ['non utf8 string', '0x8862c6a425a83c082216090e4f0e03b64106189e93c29b11d0112e77b477cce2'], + ['', '0x5f35dce98ba4fba25530a026ed80b2cecdaa31091ba4958b99b52ea1d068adad'], +]; diff --git a/packages/web3-eth-accounts/test/fixtures/accounts.json b/packages/web3-eth-accounts/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-eth-accounts/test/fixtures/common/geth-genesis-kiln.json b/packages/web3-eth-accounts/test/fixtures/common/geth-genesis-kiln.json new file mode 100644 index 00000000000..ecaad9b82e2 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/geth-genesis-kiln.json @@ -0,0 +1,865 @@ +{ + "config": { + "chainId": 1337802, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeForkBlock": 1000, + "terminalTotalDifficulty": 20000000000000 + }, + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x4242424242424242424242424242424242424242": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134": { + "balance": "10000000000000000000000000" + }, + "0x2cA5F489CC1Fd1CEC24747B64E8dE0F4A6A850E1": { + "balance": "10000000000000000000000000" + }, + "0x7203bd333a874D9d329050ecE393820fCD501eaA": { + "balance": "10000000000000000000000000" + }, + "0xA51918aA40D78Ff8be939bf0E8404252875c6aDF": { + "balance": "10000000000000000000000000" + }, + "0xAA81078e6b2121dd7A846690DFdD6b10d7658d8B": { + "balance": "10000000000000000000000000" + }, + "0xFA2d31D8f21c1D1633E9BEB641dF77D21D63ccDd": { + "balance": "10000000000000000000000000" + }, + "0xf751C9c6d60614226fE57D2cAD6e10C856a2ddA3": { + "balance": "10000000000000000000000000" + }, + "0x9cD16887f6A808AEaa65D3c840f059EeA4ca1319": { + "balance": "10000000000000000000000000" + }, + "0x2E07043584F11BFF0AC39c927665DF6c6ebaffFB": { + "balance": "10000000000000000000000000" + }, + "0x60e771E5eCA8E26690920de669520Da210D64A9B": { + "balance": "10000000000000000000000000" + }, + "0xFC4db92C2Cf77CE02fBfd7Da0346d2CbFA66aD59": { + "balance": "10000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x01", + "extraData": "", + "gasLimit": "0x400000", + "nonce": "0x1234", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0" +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/invalid-spurious-dragon.json b/packages/web3-eth-accounts/test/fixtures/common/invalid-spurious-dragon.json new file mode 100644 index 00000000000..f254e2e5ed5 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/invalid-spurious-dragon.json @@ -0,0 +1,32 @@ +{ + "config": { + "chainId": 5, + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 1, + "byzantiumBlock": 2, + "constantinopleBlock": 3, + "petersburgBlock": 4, + "istanbulBlock": 5, + "berlinBlock": 6, + "londonBlock": 7, + "clique": { + "period": 15, + "epoch": 30000 + } + }, + "nonce": "0x0", + "timestamp": "0x5c51a607", + "extraData": "0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0xa00000", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": null +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/merge/testnetMerge.json b/packages/web3-eth-accounts/test/fixtures/common/merge/testnetMerge.json new file mode 100644 index 00000000000..8f710633be5 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/merge/testnetMerge.json @@ -0,0 +1,81 @@ +{ + "name": "testnetMerge", + "chainId": 55555, + "networkId": 55555, + "defaultHardfork": "istanbul", + "consensus": { + "type": "poa", + "algorithm": "clique", + "clique": { + "period": 15, + "epoch": 30000 + } + }, + "comment": "Private test network", + "url": "[TESTNET_URL]", + "genesis": { + "gasLimit": 1000000, + "difficulty": 1, + "nonce": "0xbb00000000000000", + "extraData": "0xcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0 + }, + { + "name": "homestead", + "block": 1 + }, + { + "name": "tangerineWhistle", + "block": 2 + }, + { + "name": "spuriousDragon", + "block": 3 + }, + { + "name": "istanbul", + "block": 8 + }, + { + "name": "muirGlacier", + "block": 10 + }, + { + "name": "berlin", + "block": 12 + }, + { + "name": "london", + "block": 14 + }, + { + "name": "merge", + "block": null, + "ttd": "5000" + }, + { + "name": "shanghai", + "block": null + } + ], + "bootstrapNodes": [ + { + "ip": "10.0.0.1", + "port": 30303, + "id": "11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + }, + { + "ip": "10.0.0.2", + "port": 30303, + "id": "22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + } + ] +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/merge/testnetPOS.json b/packages/web3-eth-accounts/test/fixtures/common/merge/testnetPOS.json new file mode 100644 index 00000000000..9ed75d0566d --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/merge/testnetPOS.json @@ -0,0 +1,46 @@ +{ + "name": "testnetPOS", + "chainId": 66666, + "networkId": 66666, + "defaultHardfork": "chainstart", + "consensus": { + "type": "pos", + "algorithm": "casper", + "casper": {} + }, + "comment": "Private test network (TODO: genesis block not constructed according to POS block rules yet)", + "url": "[TESTNET_URL]", + "genesis": { + "gasLimit": 1000000, + "difficulty": 1, + "nonce": "0xbb00000000000000", + "extraData": "0xcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0, + "ttd": "0" + }, + { + "name": "shanghai", + "block": 5 + } + ], + "bootstrapNodes": [ + { + "ip": "10.0.0.1", + "port": 30303, + "id": "11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + }, + { + "ip": "10.0.0.2", + "port": 30303, + "id": "22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + } + ] +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/no-extra-data.json b/packages/web3-eth-accounts/test/fixtures/common/no-extra-data.json new file mode 100644 index 00000000000..c7bbc4c5af4 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/no-extra-data.json @@ -0,0 +1,37 @@ +{ + "config": { + "chainId": 1, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "clique": { + "period": 5, + "epoch": 30000 + }, + "terminalTotalDifficulty": 0 + }, + "nonce": "0x42", + "timestamp": "16", + "extraData": "", + "gasLimit": "0x1C9C380", + "difficulty": "0x400000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x6d6172697573766477000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0x7" +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/poa.json b/packages/web3-eth-accounts/test/fixtures/common/poa.json new file mode 100644 index 00000000000..68b5a3eaef8 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/poa.json @@ -0,0 +1,804 @@ +{ + "config": { + "chainId": 15470, + "homesteadBlock": 0, + "eip150Block": 20, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 40, + "eip158Block": 40, + "byzantiumBlock": 60, + "constantinopleBlock": 80, + "petersburgBlock": 100, + "istanbulBlock": 120, + "berlinBlock": 140, + "londonBlock": 160, + "clique": { + "period": 15, + "epoch": 30000 + } + }, + "nonce": "0x0", + "timestamp": "0x61279291", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000728bb68502bfcd91ce4c7a692a0c0773ced5cff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x47b760", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0000000000000000000000000000000000000000": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000001": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000002": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000003": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000004": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000005": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000006": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000007": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000008": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000009": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000010": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000011": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000012": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000013": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000014": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000015": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000016": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000017": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000018": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000019": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000020": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000021": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000022": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000023": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000024": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000025": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000026": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000027": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000028": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000029": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000030": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000031": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000032": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000033": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000034": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000035": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000036": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000037": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000038": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000039": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000040": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000041": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000042": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000043": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000044": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000045": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000046": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000047": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000048": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000049": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000050": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000051": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000052": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000053": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000054": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000055": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000056": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000057": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000058": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000059": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000060": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000061": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000062": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000063": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000064": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000065": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000066": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000067": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000068": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000069": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000070": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000071": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000072": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000073": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000074": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000075": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000076": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000077": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000078": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000079": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000080": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000081": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000082": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000083": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000084": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000085": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000086": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000087": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000088": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000089": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000090": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000091": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000092": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000093": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000094": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000095": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000096": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000097": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000098": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000099": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009f": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000aa": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ab": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ac": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ad": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ae": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000af": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ba": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000be": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bf": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ca": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ce": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cf": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000da": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000db": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000dc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000dd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000de": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000df": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ea": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000eb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ec": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ed": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ee": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ef": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fa": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fe": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ff": { + "balance": "0x1" + }, + "728bb68502bfcd91ce4c7a692a0c0773ced5cff0": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": null +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/post-merge-hardfork.json b/packages/web3-eth-accounts/test/fixtures/common/post-merge-hardfork.json new file mode 100644 index 00000000000..55748a721cd --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/post-merge-hardfork.json @@ -0,0 +1,44 @@ +{ + "config": { + "chainId": 1, + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "shanghaiTime": 8, + "clique": { + "period": 5, + "epoch": 30000 + }, + "terminalTotalDifficulty": 2, + "terminalTotalDifficultyPassed": true + }, + "nonce": "0x42", + "timestamp": "0x0", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1C9C380", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x6d6172697573766477000000" + }, + "0x8A04d14125D0FDCDc742F4A05C051De07232EDa4": { + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a714610044578063228951181461008c578063621fd130146101a2578063c5f2892f1461022c575b600080fd5b34801561005057600080fd5b506100786004803603602081101561006757600080fd5b50356001600160e01b031916610253565b604080519115158252519081900360200190f35b6101a0600480360360808110156100a257600080fd5b8101906020810181356401000000008111156100bd57600080fd5b8201836020820111156100cf57600080fd5b803590602001918460018302840111640100000000831117156100f157600080fd5b91939092909160208101903564010000000081111561010f57600080fd5b82018360208201111561012157600080fd5b8035906020019184600183028401116401000000008311171561014357600080fd5b91939092909160208101903564010000000081111561016157600080fd5b82018360208201111561017357600080fd5b8035906020019184600183028401116401000000008311171561019557600080fd5b91935091503561028a565b005b3480156101ae57600080fd5b506101b7610ce6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023857600080fd5b50610241610cf8565b60408051918252519081900360200190f35b60006001600160e01b031982166301ffc9a760e01b148061028457506001600160e01b03198216638564090760e01b145b92915050565b603086146102c95760405162461bcd60e51b81526004018080602001828103825260268152602001806112516026913960400191505060405180910390fd5b602084146103085760405162461bcd60e51b81526004018080602001828103825260368152602001806111e86036913960400191505060405180910390fd5b606082146103475760405162461bcd60e51b81526004018080602001828103825260298152602001806112c46029913960400191505060405180910390fd5b670de0b6b3a764000034101561038e5760405162461bcd60e51b815260040180806020018281038252602681526020018061129e6026913960400191505060405180910390fd5b633b9aca003406156103d15760405162461bcd60e51b815260040180806020018281038252603381526020018061121e6033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff81111561041f5760405162461bcd60e51b81526004018080602001828103825260278152602001806112776027913960400191505060405180910390fd5b606061042a82610fc6565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a61045f602054610fc6565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f01601f191690910187810386528c815260200190508c8c808284376000838201819052601f909101601f191690920188810386528c5181528c51602091820193918e019250908190849084905b838110156104f65781810151838201526020016104de565b50505050905090810190601f1680156105235780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f909101601f19169092018881038452895181528951602091820193918b019250908190849084905b8381101561057f578181015183820152602001610567565b50505050905090810190601f1680156105ac5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284376fffffffffffffffffffffffffffffffff199094169190930190815260408051600f19818403018152601090920190819052815191955093508392506020850191508083835b602083106106415780518252601f199092019160209182019101610622565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610680573d6000803e3d6000fd5b5050506040513d602081101561069557600080fd5b5051905060006002806106ab6040848a8c61114a565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106107015780518252601f1990920191602091820191016106e2565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610740573d6000803e3d6000fd5b5050506040513d602081101561075557600080fd5b50516002610766896040818d61114a565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106107c15780518252601f1990920191602091820191016107a2565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610800573d6000803e3d6000fd5b5050506040513d602081101561081557600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b6020831061086b5780518252601f19909201916020918201910161084c565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156108aa573d6000803e3d6000fd5b5050506040513d60208110156108bf57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b6020831061092e5780518252601f19909201916020918201910161090f565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa15801561096d573d6000803e3d6000fd5b5050506040513d602081101561098257600080fd5b50516040518651600291889160009188916020918201918291908601908083835b602083106109c25780518252601f1990920191602091820191016109a3565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610a495780518252601f199092019160209182019101610a2a565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610a88573d6000803e3d6000fd5b5050506040513d6020811015610a9d57600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610af35780518252601f199092019160209182019101610ad4565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610b32573d6000803e3d6000fd5b5050506040513d6020811015610b4757600080fd5b50519050858114610b895760405162461bcd60e51b81526004018080602001828103825260548152602001806111946054913960600191505060405180910390fd5b60205463ffffffff11610bcd5760405162461bcd60e51b81526004018080602001828103825260218152602001806111736021913960400191505060405180910390fd5b602080546001019081905560005b6020811015610cda578160011660011415610c0d578260008260208110610bfe57fe5b015550610cdd95505050505050565b600260008260208110610c1c57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610c745780518252601f199092019160209182019101610c55565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610cb3573d6000803e3d6000fd5b5050506040513d6020811015610cc857600080fd5b50519250600282049150600101610bdb565b50fe5b50505050505050565b6060610cf3602054610fc6565b905090565b6020546000908190815b6020811015610ea9578160011660011415610ddb57600260008260208110610d2657fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610d7e5780518252601f199092019160209182019101610d5f565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610dbd573d6000803e3d6000fd5b5050506040513d6020811015610dd257600080fd5b50519250610e9b565b60028360218360208110610deb57fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610e425780518252601f199092019160209182019101610e23565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610e81573d6000803e3d6000fd5b5050506040513d6020811015610e9657600080fd5b505192505b600282049150600101610d02565b50600282610eb8602054610fc6565b600060401b6040516020018084815260200183805190602001908083835b60208310610ef55780518252601f199092019160209182019101610ed6565b51815160209384036101000a600019018019909216911617905267ffffffffffffffff199590951692019182525060408051808303600719018152601890920190819052815191955093508392850191508083835b60208310610f695780518252601f199092019160209182019101610f4a565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015610fa8573d6000803e3d6000fd5b5050506040513d6020811015610fbd57600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b8260008151811061100057fe5b60200101906001600160f81b031916908160001a9053508060061a60f81b8260018151811061102b57fe5b60200101906001600160f81b031916908160001a9053508060051a60f81b8260028151811061105657fe5b60200101906001600160f81b031916908160001a9053508060041a60f81b8260038151811061108157fe5b60200101906001600160f81b031916908160001a9053508060031a60f81b826004815181106110ac57fe5b60200101906001600160f81b031916908160001a9053508060021a60f81b826005815181106110d757fe5b60200101906001600160f81b031916908160001a9053508060011a60f81b8260068151811061110257fe5b60200101906001600160f81b031916908160001a9053508060001a60f81b8260078151811061112d57fe5b60200101906001600160f81b031916908160001a90535050919050565b60008085851115611159578182fd5b83861115611165578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a164736f6c634300060b000a", + "balance": "0x0" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0x7" +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/post-merge.json b/packages/web3-eth-accounts/test/fixtures/common/post-merge.json new file mode 100644 index 00000000000..8b5da63e3f7 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/post-merge.json @@ -0,0 +1,35 @@ +{ + "config": { + "chainId": 1, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "clique": { + "period": 5, + "epoch": 30000 + }, + "terminalTotalDifficulty": 0 + }, + "nonce": "0x42", + "timestamp": "0x0", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1C9C380", + "difficulty": "0x400000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "balance": "0x6d6172697573766477000000" } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0x7" +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/shanghai-time.json b/packages/web3-eth-accounts/test/fixtures/common/shanghai-time.json new file mode 100644 index 00000000000..c5848d151a3 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/shanghai-time.json @@ -0,0 +1,853 @@ +{ + "config": { + "chainId": 1337803, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeForkBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 1668699476, + "terminalTotalDifficulty": 9 + }, + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x4242424242424242424242424242424242424242": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0xE7c180eAdA8f60D63e9671867b2e0CA2649207A8": { + "balance": "1000000000000000000000000000" + }, + "0xD84044e7ba939A4a9b35aE427553F39c2B2f26A4": { + "balance": "1000000000000000000000000000" + }, + "0x90c91d6742113a07484cc1E2D4Ba1Fa3AB59aD16": { + "balance": "1000000000000000000000000000" + }, + "0xE0B1b0408471cb254a82B6367caB9c8C5A9B3795": { + "balance": "1000000000000000000000000000" + }, + "0x4ee57bc5947456eBB2E06Dd47e2614Cbed39b6Bc": { + "balance": "1000000000000000000000000000" + }, + "0x191db72a1700646167a40593e6DF44267Fd481Bf": { + "balance": "1000000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x01", + "extraData": "", + "gasLimit": "0x400000", + "nonce": "0x1234", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "1668697340" +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/testnet.json b/packages/web3-eth-accounts/test/fixtures/common/testnet.json new file mode 100644 index 00000000000..5062cb7ab4e --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/testnet.json @@ -0,0 +1,56 @@ +{ + "name": "testnet", + "chainId": 12345, + "networkId": 12345, + "defaultHardfork": "byzantium", + "consensus": { + "type": "pow", + "algorithm": "ethash" + }, + "comment": "Private test network", + "url": "[TESTNET_URL]", + "genesis": { + "gasLimit": 1000000, + "difficulty": 1, + "nonce": "0xbb00000000000000", + "extraData": "0xcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0 + }, + { + "name": "homestead", + "block": 1 + }, + { + "name": "tangerineWhistle", + "block": 2 + }, + { + "name": "spuriousDragon", + "block": 3 + }, + { + "name": "byzantium", + "block": 4 + } + ], + "bootstrapNodes": [ + { + "ip": "10.0.0.1", + "port": 30303, + "id": "11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + }, + { + "ip": "10.0.0.2", + "port": 30303, + "id": "22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + } + ] +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/testnet2.json b/packages/web3-eth-accounts/test/fixtures/common/testnet2.json new file mode 100644 index 00000000000..44b5b2dab4d --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/testnet2.json @@ -0,0 +1,60 @@ +{ + "name": "testnet2", + "chainId": 22222, + "networkId": 22222, + "defaultHardfork": "istanbul", + "consensus": { + "type": "poa", + "algorithm": "clique", + "clique": { + "period": 15, + "epoch": 30000 + } + }, + "comment": "Private test network", + "url": "[TESTNET_URL]", + "genesis": { + "gasLimit": 1000000, + "difficulty": 1, + "nonce": "0xbb00000000000000", + "extraData": "0xcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0 + }, + { + "name": "homestead", + "block": 1 + }, + { + "name": "tangerineWhistle", + "block": 2 + }, + { + "name": "spuriousDragon", + "block": 3 + }, + { + "name": "istanbul", + "block": 10 + } + ], + "bootstrapNodes": [ + { + "ip": "10.0.0.1", + "port": 30303, + "id": "11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + }, + { + "ip": "10.0.0.2", + "port": 30303, + "id": "22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + } + ] +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/testnet3.json b/packages/web3-eth-accounts/test/fixtures/common/testnet3.json new file mode 100644 index 00000000000..dafaa9c32e5 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/testnet3.json @@ -0,0 +1,60 @@ +{ + "name": "testnet3", + "chainId": 33333, + "networkId": 33333, + "defaultHardfork": "istanbul", + "consensus": { + "type": "poa", + "algorithm": "clique", + "clique": { + "period": 15, + "epoch": 30000 + } + }, + "comment": "Private test network", + "url": "[TESTNET_URL]", + "genesis": { + "gasLimit": 1000000, + "difficulty": 1, + "nonce": "0xbb00000000000000", + "extraData": "0xcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0 + }, + { + "name": "homestead", + "block": 1 + }, + { + "name": "tangerineWhistle", + "block": 2 + }, + { + "name": "spuriousDragon", + "block": 3 + }, + { + "name": "istanbul", + "block": 10 + } + ], + "bootstrapNodes": [ + { + "ip": "10.0.0.1", + "port": 30303, + "id": "11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + }, + { + "ip": "10.0.0.2", + "port": 30303, + "id": "22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "location": "", + "comment": "" + } + ] +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/testnetValid.json b/packages/web3-eth-accounts/test/fixtures/common/testnetValid.json new file mode 100644 index 00000000000..522990e3d6d --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/testnetValid.json @@ -0,0 +1,814 @@ +{ + "config": { + "chainId": 5, + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 1561651, + "berlinBlock": 4460644, + "londonBlock": 5062605, + "clique": { + "period": 15, + "epoch": 30000 + } + }, + "nonce": "0x042", + "timestamp": "0x5c51a607", + "extraData": "0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0xa00000", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "0000000000000000000000000000000000000000": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000001": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000002": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000003": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000004": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000005": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000006": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000007": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000008": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000009": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000000f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000010": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000011": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000012": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000013": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000014": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000015": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000016": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000017": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000018": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000019": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000001f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000020": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000021": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000022": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000023": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000024": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000025": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000026": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000027": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000028": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000029": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000002f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000030": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000031": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000032": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000033": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000034": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000035": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000036": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000037": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000038": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000039": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000003f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000040": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000041": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000042": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000043": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000044": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000045": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000046": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000047": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000048": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000049": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000004f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000050": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000051": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000052": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000053": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000054": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000055": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000056": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000057": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000058": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000059": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000005f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000060": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000061": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000062": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000063": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000064": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000065": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000066": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000067": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000068": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000069": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000006f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000070": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000071": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000072": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000073": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000074": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000075": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000076": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000077": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000078": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000079": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000007f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000080": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000081": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000082": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000083": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000084": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000085": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000086": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000087": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000088": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000089": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000008f": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000090": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000091": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000092": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000093": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000094": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000095": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000096": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000097": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000098": { + "balance": "0x1" + }, + "0000000000000000000000000000000000000099": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009a": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009b": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009c": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009d": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009e": { + "balance": "0x1" + }, + "000000000000000000000000000000000000009f": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000a9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000aa": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ab": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ac": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ad": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ae": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000af": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000b9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ba": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000be": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000bf": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000c9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ca": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ce": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000cf": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000d9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000da": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000db": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000dc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000dd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000de": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000df": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000e9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ea": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000eb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ec": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ed": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ee": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ef": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f0": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f1": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f2": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f3": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f4": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f5": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f6": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f7": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f8": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000f9": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fa": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fb": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fc": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fd": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000fe": { + "balance": "0x1" + }, + "00000000000000000000000000000000000000ff": { + "balance": "0x1" + }, + "4c2ae482593505f0163cdefc073e81c63cda4107": { + "balance": "0x152d02c7e14af6800000" + }, + "a8e8f14732658e4b51e8711931053a8a69baf2b1": { + "balance": "0x152d02c7e14af6800000" + }, + "d9a5179f091d85051d3c982785efd1455cec8699": { + "balance": "0x84595161401484a000000" + }, + "e0a2bd4258d2768837baa26a28fe71dc079f84c7": { + "balance": "0x4a47e3c12448f4ad000000" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": null +} diff --git a/packages/web3-eth-accounts/test/fixtures/common/withdrawals-devnet.json b/packages/web3-eth-accounts/test/fixtures/common/withdrawals-devnet.json new file mode 100644 index 00000000000..c5848d151a3 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/common/withdrawals-devnet.json @@ -0,0 +1,853 @@ +{ + "config": { + "chainId": 1337803, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeForkBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 1668699476, + "terminalTotalDifficulty": 9 + }, + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x4242424242424242424242424242424242424242": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0xE7c180eAdA8f60D63e9671867b2e0CA2649207A8": { + "balance": "1000000000000000000000000000" + }, + "0xD84044e7ba939A4a9b35aE427553F39c2B2f26A4": { + "balance": "1000000000000000000000000000" + }, + "0x90c91d6742113a07484cc1E2D4Ba1Fa3AB59aD16": { + "balance": "1000000000000000000000000000" + }, + "0xE0B1b0408471cb254a82B6367caB9c8C5A9B3795": { + "balance": "1000000000000000000000000000" + }, + "0x4ee57bc5947456eBB2E06Dd47e2614Cbed39b6Bc": { + "balance": "1000000000000000000000000000" + }, + "0x191db72a1700646167a40593e6DF44267Fd481Bf": { + "balance": "1000000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x01", + "extraData": "", + "gasLimit": "0x400000", + "nonce": "0x1234", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "1668697340" +} diff --git a/packages/web3-eth-accounts/test/fixtures/json/eip1559.json b/packages/web3-eth-accounts/test/fixtures/json/eip1559.json new file mode 100644 index 00000000000..3d0285b3fb5 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/json/eip1559.json @@ -0,0 +1,102 @@ +[ + { + "nonce": 819, + "value": 43203529, + "gasLimit": 35552, + "maxPriorityFeePerGas": 75853, + "maxFeePerGas": 121212, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87102f86e048203338301284d8301d97c828ae094000000000000000000000000000000000000aaaa8402933bc980c080a00f924cb68412c8f1cfd74d9b581c71eeaf94fff6abdde3e5b02ca6b2931dcf47a07dd1c50027c3e31f8b565e25ce68a5072110f61fce5eee81b195dd51273c2f83" + }, + { + "nonce": 353, + "value": 61901619, + "gasLimit": 32593, + "maxPriorityFeePerGas": 38850, + "maxFeePerGas": 136295, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87002f86d048201618297c283021467827f5194000000000000000000000000000000000000aaaa8403b08b3380c080a08caf712f72489da6f1a634b651b4b1c7d9be7d1e8d05ea76c1eccee3bdfb86a5a06aecc106f588ce51e112f5e9ea7aba3e089dc7511718821d0e0cd52f52af4e45" + }, + { + "nonce": 985, + "value": 32531825, + "gasLimit": 68541, + "maxPriorityFeePerGas": 66377, + "maxFeePerGas": 136097, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87202f86f048203d983010349830213a183010bbd94000000000000000000000000000000000000aaaa8401f0657180c001a08c03a86e85789ee9a1b42fa0a86d316fca262694f8c198df11f194678c2c2d35a028f8e7de02b35014a17b6d28ff8c7e7be6860e7265ac162fb721f1aeae75643c" + }, + { + "nonce": 623, + "value": 21649799, + "gasLimit": 57725, + "maxPriorityFeePerGas": 74140, + "maxFeePerGas": 81173, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87102f86e0482026f8301219c83013d1582e17d94000000000000000000000000000000000000aaaa84014a598780c001a0b87c4c8c505d2d692ac77ba466547e79dd60fe7ecd303d520bf6e8c7085e3182a06dc7d00f5e68c3f3ebe8ae35a90d46051afde620ac12e43cae9560a29b13e7fb" + }, + { + "nonce": 972, + "value": 94563383, + "gasLimit": 65254, + "maxPriorityFeePerGas": 42798, + "maxFeePerGas": 103466, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87002f86d048203cc82a72e8301942a82fee694000000000000000000000000000000000000aaaa8405a2ec3780c001a006cf07af78c187db104496c58d679f37fcd2d5790970cecf9a59fe4a5321b375a039f3faafc71479d283a5b1e66a86b19c4bdc516655d89dbe57d9747747c01dfe" + }, + { + "nonce": 588, + "value": 99359647, + "gasLimit": 37274, + "maxPriorityFeePerGas": 87890, + "maxFeePerGas": 130273, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87102f86e0482024c830157528301fce182919a94000000000000000000000000000000000000aaaa8405ec1b9f80c080a03e2f59ac9ca852034c2c1da35a742ca19fdd910aa5d2ed49ab8ad27a2fcb2b10a03ac1c29c26723c58f91400fb6dfb5f5b837467b1c377541b47dae474dddbe469" + }, + { + "nonce": 900, + "value": 30402257, + "gasLimit": 76053, + "maxPriorityFeePerGas": 8714, + "maxFeePerGas": 112705, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87102f86e0482038482220a8301b8418301291594000000000000000000000000000000000000aaaa8401cfe6d180c001a0f7ffc5bca2512860f8236360159bf303dcfab71546b6a0032df0306f3739d0c4a05d38fe2c4edebdc1edc157034f780c53a0e5ae089e57220745bd48bcb10cdf87" + }, + { + "nonce": 709, + "value": 6478043, + "gasLimit": 28335, + "maxPriorityFeePerGas": 86252, + "maxFeePerGas": 94636, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb87002f86d048202c5830150ec830171ac826eaf94000000000000000000000000000000000000aaaa8362d8db80c001a0a61a5710512f346c9996377f7b564ccb64c73a5fdb615499adb1250498f3e01aa002d10429572cecfaa911a58bbe05f2b26e4c3aee3402202153a93692849add11" + }, + { + "nonce": 939, + "value": 2782905, + "gasLimit": 45047, + "maxPriorityFeePerGas": 45216, + "maxFeePerGas": 91648, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb86f02f86c048203ab82b0a08301660082aff794000000000000000000000000000000000000aaaa832a76b980c001a0191f0f6667a20cefc0b454e344cc01108aafbdc4e4e5ed88fdd1b5d108495b31a020879042b0f8d3807609f18fe42a9820de53c8a0ea1d0a2d50f8f5e92a94f00d" + }, + { + "nonce": 119, + "value": 65456115, + "gasLimit": 62341, + "maxPriorityFeePerGas": 24721, + "maxFeePerGas": 107729, + "to": "0x000000000000000000000000000000000000aaaa", + "privateKey": "0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "signedTransactionRLP": "0xb86e02f86b04778260918301a4d182f38594000000000000000000000000000000000000aaaa8403e6c7f380c001a05e40977f4064a2bc08785e422ed8a47b56aa219abe93251d2b3b4d0cf937b8c0a071e600cd15589c3607bd9627314b99e9b5976bd427b774aa685bd0d036b1771e" + } +] diff --git a/packages/web3-eth-accounts/test/fixtures/json/eip1559txs.json b/packages/web3-eth-accounts/test/fixtures/json/eip1559txs.json new file mode 100644 index 00000000000..38a0fa7b708 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/json/eip1559txs.json @@ -0,0 +1,52 @@ +[ + { + "privateKey": "e0a462586887362a18a318b128dbc1e3a0cae6d4b0739f5d0419ec25114bc722", + "sendersAddress": "d13d825eb15c87b247c4c26331d66f225a5f632e", + "type": "message", + "raw": [ + "0x01", + "0x", + "0x01", + "0x01", + "0x02625a00", + "0xcccccccccccccccccccccccccccccccccccccccc", + "0x0186a0", + "0x1a8451e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + [ + [ + "0x0000000000000000000000000000000000000101", + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000060a7" + ] + ] + ], + "0x01", + "0xafb6e247b1c490e284053c87ab5f6b59e219d51f743f7a4d83e400782bc7e4b9", + "0x479a268e0e0acd4de3f1e28e4fac2a6b32a4195e8dfa9d19147abe8807aa6f64" + ], + "data": { + "data": "0x1a8451e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x02625a00", + "maxPriorityFeePerGas": "0x01", + "maxFeePerGas": "0x01", + "nonce": "0x", + "to": "0xcccccccccccccccccccccccccccccccccccccccc", + "value": "0x0186a0", + "v": "0x01", + "r": "0xafb6e247b1c490e284053c87ab5f6b59e219d51f743f7a4d83e400782bc7e4b9", + "s": "0x479a268e0e0acd4de3f1e28e4fac2a6b32a4195e8dfa9d19147abe8807aa6f64", + "chainId": "0x01", + "accessList": [ + { + "address": "0x0000000000000000000000000000000000000101", + "storageKeys": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000060a7" + ] + } + ], + "type": "0x02" + } + } +] diff --git a/packages/web3-eth-accounts/test/fixtures/json/eip2930blockRLP.json b/packages/web3-eth-accounts/test/fixtures/json/eip2930blockRLP.json new file mode 100644 index 00000000000..498ed5f7097 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/json/eip2930blockRLP.json @@ -0,0 +1,3 @@ +{ + "rlp": "f90319f90211a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017a0e6e49996c7ec59f7a23d22b83239a60151512c65613bf84a0d7da336399ebc4aa0cafe75574d59780665a97fbfd11365c7545aa8f1abf4e5e12e8243334ef7286bb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000820200832fefd882a410845506eb0796636f6f6c65737420626c6f636b206f6e20636861696ea0bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff49888a13a5a8c8f2bb1c4f90101f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba09bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094fa08a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b1b89e01f89b01800a8301e24194095e7baea6a6c7c4c2dfeb977efac326af552d878080f838f7940000000000000000000000000000000000000001e1a0000000000000000000000000000000000000000000000000000000000000000001a03dbacc8d0259f2508625e97fdfc57cd85fdd16e5821bc2c10bdd1a52649e8335a0476e10695b183a87b0aa292a7f4b78ef0c3fbe62aa2c42c84e1d9c3da159ef14c0" +} diff --git a/packages/web3-eth-accounts/test/fixtures/json/eip2930txs.json b/packages/web3-eth-accounts/test/fixtures/json/eip2930txs.json new file mode 100644 index 00000000000..27dc624813b --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/json/eip2930txs.json @@ -0,0 +1,50 @@ +[ + { + "privateKey": "e0a462586887362a18a318b128dbc1e3a0cae6d4b0739f5d0419ec25114bc722", + "sendersAddress": "d13d825eb15c87b247c4c26331d66f225a5f632e", + "type": "message", + "raw": [ + "0x01", + "0x", + "0x01", + "0x02625a00", + "0xcccccccccccccccccccccccccccccccccccccccc", + "0x0186a0", + "0x1a8451e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + [ + [ + "0x0000000000000000000000000000000000000101", + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000060a7" + ] + ] + ], + "0x01", + "0xafb6e247b1c490e284053c87ab5f6b59e219d51f743f7a4d83e400782bc7e4b9", + "0x479a268e0e0acd4de3f1e28e4fac2a6b32a4195e8dfa9d19147abe8807aa6f64" + ], + "data": { + "data": "0x1a8451e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x02625a00", + "gasPrice": "0x01", + "nonce": "0x", + "to": "0xcccccccccccccccccccccccccccccccccccccccc", + "value": "0x0186a0", + "v": "0x01", + "r": "0xafb6e247b1c490e284053c87ab5f6b59e219d51f743f7a4d83e400782bc7e4b9", + "s": "0x479a268e0e0acd4de3f1e28e4fac2a6b32a4195e8dfa9d19147abe8807aa6f64", + "chainId": "0x01", + "accessList": [ + { + "address": "0x0000000000000000000000000000000000000101", + "storageKeys": [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000060a7" + ] + } + ], + "type": "0x01" + } + } +] diff --git a/packages/web3-eth-accounts/test/fixtures/json/rpcTx.json b/packages/web3-eth-accounts/test/fixtures/json/rpcTx.json new file mode 100644 index 00000000000..3ddd5cea98c --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/json/rpcTx.json @@ -0,0 +1,21 @@ +{ + "accessList": [], + "blockHash": "0x72c897034f7b99c69f66b3b86da59877c69fdf47367603f7abe1f0676b5e8ebe", + "blockNumber": "0xec738d", + "chainId": "0x1", + "from": "0x7b0f34615564cd976fea815d9691cc102f4058d6", + "gas": "0x5208", + "gasPrice": "0x3480a01a5", + "hash": "0xed1960aa7d0d7b567c946d94331dddb37a1c67f51f30bf51f256ea40db88cfb0", + "input": "0x", + "maxFeePerGas": "0x3c2152056", + "maxPriorityFeePerGas": "0x3b9aca00", + "nonce": "0x2", + "r": "0x2c4f99fdc33af2979df594c8683efe57c4012a21a0b438284fb24577a666444f", + "s": "0x472eefae0813ff0d7235210e2697228aca35e68987038b9529beb27a3cfa8552", + "to": "0xcad621da75a66c7a8f4ff86d30a2bf981bfc8fdd", + "transactionIndex": "0x1a", + "type": "0x2", + "v": "0x1", + "value": "0x3c305ddbcbc1f5" +} diff --git a/packages/web3-eth-accounts/test/fixtures/json/ttTransactionTestEip155VitaliksTests.json b/packages/web3-eth-accounts/test/fixtures/json/ttTransactionTestEip155VitaliksTests.json new file mode 100644 index 00000000000..05ba913c611 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/json/ttTransactionTestEip155VitaliksTests.json @@ -0,0 +1,189 @@ +[ + { + "blocknumber": "3500000", + "hash": "0xe0be81f8d506dbe3a5549e720b51eb79492378d6638087740824f168667e5239", + "rlp": "0xf864808504a817c800825208943535353535353535353535353535353535353535808025a0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116da0044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "sender": "f0f6f18bca1b28cd68e4357452947e021241e9ce", + "transaction": { + "data": "", + "gasLimit": "0x5208", + "gasPrice": "0x04a817c800", + "nonce": "0x", + "r": "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "s": "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x00" + } + }, + { + "blocknumber": "3500000", + "hash": "0x50b6e7b58320c885ab7b2ee0d0b5813a697268bd2494a06de792790b13668c08", + "rlp": "0xf867088504a817c8088302e2489435353535353535353535353535353535353535358202008025a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12a064b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", + "sender": "9bddad43f934d313c2b79ca28a432dd2b7281029", + "transaction": { + "data": "", + "gasLimit": "0x02e248", + "gasPrice": "0x04a817c808", + "nonce": "0x08", + "r": "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c12", + "s": "0x64b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x0200" + } + }, + { + "blocknumber": "3500000", + "hash": "0x24fd18c70146a2b002254810473fa26b744f7899258a1f32924cc73e7a8f4d4f", + "rlp": "0xf867098504a817c809830334509435353535353535353535353535353535353535358202d98025a052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afba052f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "sender": "3c24d7329e92f84f08556ceb6df1cdb0104ca49f", + "transaction": { + "data": "", + "gasLimit": "0x033450", + "gasPrice": "0x04a817c809", + "nonce": "0x09", + "r": "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "s": "0x52f8f61201b2b11a78d6e866abc9c3db2ae8631fa656bfe5cb53668255367afb", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x02d9" + } + }, + { + "blocknumber": "3500000", + "hash": "0x42973b488dbb3aa237db3d1a3bad18a8d2148af795fb6cdbbbeef5c736df97b9", + "rlp": "0xf864018504a817c80182a410943535353535353535353535353535353535353535018025a0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bcaa0489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + "sender": "23ef145a395ea3fa3deb533b8a9e1b4c6c25d112", + "transaction": { + "data": "", + "gasLimit": "0xa410", + "gasPrice": "0x04a817c801", + "nonce": "0x01", + "r": "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bca", + "s": "0x489efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x01" + } + }, + { + "blocknumber": "3500000", + "hash": "0xe68afed5d359c7e60a0408093da23c57b63e84acb2e368ac7c47630518d6f4d9", + "rlp": "0xf864028504a817c80282f618943535353535353535353535353535353535353535088025a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5a02d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "sender": "2e485e0c23b4c3c542628a5f672eeab0ad4888be", + "transaction": { + "data": "", + "gasLimit": "0xf618", + "gasPrice": "0x04a817c802", + "nonce": "0x02", + "r": "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "s": "0x2d7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x08" + } + }, + { + "blocknumber": "3500000", + "hash": "0xbcb6f653e06c276a080e9d68e5a967847a896cf52a6dc81917dc2c57ae0a31ef", + "rlp": "0xf865038504a817c803830148209435353535353535353535353535353535353535351b8025a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0a02a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", + "sender": "82a88539669a3fd524d669e858935de5e5410cf0", + "transaction": { + "data": "", + "gasLimit": "0x014820", + "gasPrice": "0x04a817c803", + "nonce": "0x03", + "r": "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4e0", + "s": "0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x1b" + } + }, + { + "blocknumber": "3500000", + "hash": "0x244e4b57522352c3e9f93ad8ac8a47d1b46c3dcda6da2522caedad009ac9afb7", + "rlp": "0xf865048504a817c80483019a28943535353535353535353535353535353535353535408025a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063a013600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", + "sender": "f9358f2538fd5ccfeb848b64a96b743fcc930554", + "transaction": { + "data": "", + "gasLimit": "0x019a28", + "gasPrice": "0x04a817c804", + "nonce": "0x04", + "r": "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c063", + "s": "0x13600b294191fc92924bb3ce4b969c1e7e2bab8f4c93c3fc6d0a51733df3c060", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x40" + } + }, + { + "blocknumber": "3500000", + "hash": "0x581c0b79498b1cf1b8fa4f69bc5f21c0c60371cd08d4682b15c4334aac1cccfd", + "rlp": "0xf865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "sender": "a8f7aba377317440bc5b26198a363ad22af1f3a4", + "transaction": { + "data": "", + "gasLimit": "0x01ec30", + "gasPrice": "0x04a817c805", + "nonce": "0x05", + "r": "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "s": "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x7d" + } + }, + { + "blocknumber": "3500000", + "hash": "0x581c0b79498b1cf1b8fa4f69bc5f21c0c60371cd08d4682b15c4334aac1cccfd", + "rlp": "0xf865058504a817c8058301ec309435353535353535353535353535353535353535357d8025a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1a04eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "sender": "a8f7aba377317440bc5b26198a363ad22af1f3a4", + "transaction": { + "data": "", + "gasLimit": "0x01ec30", + "gasPrice": "0x04a817c805", + "nonce": "0x05", + "r": "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "s": "0x4eebf77a833b30520287ddd9478ff51abbdffa30aa90a8d655dba0e8a79ce0c1", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x7d" + } + }, + { + "blocknumber": "3500000", + "hash": "0x678ae2053a840f5fe550a63d724d1c85420d2955a0ccc4f868dd59e27afdf279", + "rlp": "0xf866068504a817c80683023e3894353535353535353535353535353535353535353581d88025a06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2fa06455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", + "sender": "f1f571dc362a0e5b2696b8e775f8491d3e50de35", + "transaction": { + "data": "", + "gasLimit": "0x023e38", + "gasPrice": "0x04a817c806", + "nonce": "0x06", + "r": "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2f", + "s": "0x6455bf8ea6e7463a1046a0b52804526e119b4bf5136279614e0b1e8e296a4e2d", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0xd8" + } + }, + { + "blocknumber": "3500000", + "hash": "0x81aa03ada1474ff3ca4b86afb8e8c0f8b22791e156e706231a695ef8c51515ab", + "rlp": "0xf867078504a817c807830290409435353535353535353535353535353535353535358201578025a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021a052f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "sender": "d37922162ab7cea97c97a87551ed02c9a38b7332", + "transaction": { + "data": "", + "gasLimit": "0x029040", + "gasPrice": "0x04a817c807", + "nonce": "0x07", + "r": "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "s": "0x52f1a9b320cab38e5da8a8f97989383aab0a49165fc91c737310e4f7e9821021", + "to": "0x3535353535353535353535353535353535353535", + "v": "0x25", + "value": "0x0157" + } + } +] diff --git a/packages/web3-eth-accounts/test/fixtures/json/txs.json b/packages/web3-eth-accounts/test/fixtures/json/txs.json new file mode 100644 index 00000000000..b80abe2e23a --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/json/txs.json @@ -0,0 +1,142 @@ +[ + { + "privateKey": "164122e5d39e9814ca723a749253663bafb07f6af91704d9754c361eb315f0c1", + "sendersAddress": "1f36f546477cda21bf2296c50976f2740247906f", + "type": "contract", + "cost": 680, + "raw": [ + "0x", + "0x09184e72a000", + "0x2710", + "0x0000000000000000000000000000000000000000", + "0x", + "0x7f7465737432000000000000000000000000000000000000000000000000000000600057", + "0x1c", + "0x5e1d3a76fbf824220eafc8c79ad578ad2b67d01b0c2425eb1f1347e8f50882ab", + "0x5bd428537f05f9830e93792f90ea6a3e2d1ee84952dd96edbae9f658f831ab13" + ], + "data": { + "nonce": "0x", + "gasPrice": "0x09184e72a000", + "gasLimit": "0x2710", + "to": "0x0000000000000000000000000000000000000000", + "value": "0x", + "data": "0x7f7465737432000000000000000000000000000000000000000000000000000000600057", + "v": "0x1c", + "r": "0x5e1d3a76fbf824220eafc8c79ad578ad2b67d01b0c2425eb1f1347e8f50882ab", + "s": "0x5bd428537f05f9830e93792f90ea6a3e2d1ee84952dd96edbae9f658f831ab13" + } + }, + { + "privateKey": "4646464646464646464646464646464646464646464646464646464646464646", + "sendersAddress": "9d8a62f656a8d1615c1294fd71e9cfb3e4855a4f", + "type": "message", + "cost": 500, + "raw": [ + "0x09", + "0x04a817c800", + "0x2710", + "0x3535353535353535353535353535353535353535", + "0x0de0b6b3a7640000", + "0x", + "0x25", + "0x28ef61340bd939bc2195fe537567866003e1a15d3c71ff63e1590620aa636276", + "0x67cbe9d8997f761aecb703304b3800ccf555c9f3dc64214b297fb1966a3b6d83" + ], + "data": { + "nonce": "0x09", + "gasPrice": "0x04a817c800", + "gasLimit": "0x2710", + "to": "0x3535353535353535353535353535353535353535", + "value": "0x0de0b6b3a7640000", + "data": "0x", + "v": "0x25", + "r": "0x28ef61340bd939bc2195fe537567866003e1a15d3c71ff63e1590620aa636276", + "s": "0x67cbe9d8997f761aecb703304b3800ccf555c9f3dc64214b297fb1966a3b6d83" + } + }, + { + "privateKey": "e0a462586887362a18a318b128dbc1e3a0cae6d4b0739f5d0419ec25114bc722", + "sendersAddress": "d13d825eb15c87b247c4c26331d66f225a5f632e", + "type": "message", + "cost": 500, + "raw": [ + "0x06", + "0x09184e72a000", + "0x01f4", + "0xbe862ad9abfe6f22bcb087716c7d89a26051f74c", + "0x016345785d8a0000", + "0x", + "0x1c", + "0x24a484bfa7380860e9fa0a9f5e4b64b985e860ca31abd36e66583f9030c2e29d", + "0x4d5ef07d9e73fa2fbfdad059591b4f13d0aa79e7634a2bb00174c9200cabb04d" + ], + "data": { + "nonce": "0x06", + "gasPrice": "0x09184e72a000", + "gasLimit": "0x01f4", + "to": "0xbe862ad9abfe6f22bcb087716c7d89a26051f74c", + "value": "0x016345785d8a0000", + "data": "0x", + "v": "0x1c", + "r": "0x24a484bfa7380860e9fa0a9f5e4b64b985e860ca31abd36e66583f9030c2e29d", + "s": "0x4d5ef07d9e73fa2fbfdad059591b4f13d0aa79e7634a2bb00174c9200cabb04d" + } + }, + { + "privateKey": "164122e5d39e9814ca723a749253663bafb07f6af91704d9754c361eb315f0c1", + "sendersAddress": "1f36f546477cda21bf2296c50976f2740247906f", + "type": "message", + "cost": 2420, + "raw": [ + "0x06", + "0x09184e72a000", + "0x0974", + "0xbe862ad9abfe6f22bcb087716c7d89a26051f74c", + "0x016345785d8a0000", + "0x00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000fafa0000000000000000000000000000000000000000000000000000000000000dfa0000000000000000000000000000000000000000000000000000000000000dfa00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000d", + "0x1c", + "0x5e9361ca27e14f3af0e6b28466406ad8be026d3b0f2ae56e3c064043fb73ec77", + "0x29ae9893dac4f9afb1af743e25fbb6a63f7879a61437203cb48c997b0fcefc3a" + ], + "data": { + "nonce": "0x06", + "gasPrice": "0x09184e72a000", + "gasLimit": "0x0974", + "to": "0xbe862ad9abfe6f22bcb087716c7d89a26051f74c", + "value": "0x016345785d8a0000", + "data": "0x00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000fafa0000000000000000000000000000000000000000000000000000000000000dfa0000000000000000000000000000000000000000000000000000000000000dfa00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000d", + "v": "0x1c", + "r": "0x5e9361ca27e14f3af0e6b28466406ad8be026d3b0f2ae56e3c064043fb73ec77", + "s": "0x29ae9893dac4f9afb1af743e25fbb6a63f7879a61437203cb48c997b0fcefc3a" + } + }, + { + "privateKey": "not-available", + "sendersAddress": "TODO", + "type": "message", + "cost": 12312, + "raw": [ + "0x0b", + "0x051f4d5c00", + "0x5208", + "0x656e929d6fc0cac52d3d9526d288fe02dcd56fbd", + "0x2386f26fc10000", + "0x", + "0x26", + "0xef903f6bbcb7d6214d478df27db6591d857b1063954eade1bb24e69e58511f96", + "0x5433f8e1abf886cbec64891f38a2ea6fd9f9ffe078421f5e238b9fec03eea97a" + ], + "data": { + "nonce": "0x0b", + "gasPrice": "0x051f4d5c00", + "gasLimit": "0x5208", + "to": "0x656e929d6fc0cac52d3d9526d288fe02dcd56fbd", + "value": "0x2386f26fc10000", + "data": "0x", + "v": "0x26", + "r": "0xef903f6bbcb7d6214d478df27db6591d857b1063954eade1bb24e69e58511f96", + "s": "0x5433f8e1abf886cbec64891f38a2ea6fd9f9ffe078421f5e238b9fec03eea97a" + } + } +] diff --git a/packages/web3-eth-accounts/test/fixtures/system_test_utils.ts b/packages/web3-eth-accounts/test/fixtures/system_test_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-eth-accounts/test/fixtures/system_test_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-eth-accounts/test/integration/account.test.ts b/packages/web3-eth-accounts/test/integration/account.test.ts new file mode 100644 index 00000000000..06b703e496f --- /dev/null +++ b/packages/web3-eth-accounts/test/integration/account.test.ts @@ -0,0 +1,214 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address } from 'web3-types'; +import { Web3ValidatorError, isHexStrict } from 'web3-validator'; +import { + create, + decrypt, + encrypt, + hashMessage, + privateKeyToAccount, + privateKeyToAddress, + recover, + recoverTransaction, + sign, + signTransaction, +} from '../../src'; +import { TransactionFactory } from '../../src/tx/transactionFactory'; +import { + invalidDecryptData, + invalidEncryptData, + invalidKeyStore, + invalidPrivateKeytoAccountData, + invalidPrivateKeyToAddressData, + signatureRecoverData, + transactionsTestData, + validDecryptData, + validEncryptData, + validHashMessageData, + validPrivateKeytoAccountData, + validPrivateKeyToAddressData, +} from '../fixtures/account'; + +describe('accounts', () => { + describe('create', () => { + describe('valid cases', () => { + it('%s', () => { + const account = create(); + expect(typeof account.privateKey).toBe('string'); + expect(typeof account.address).toBe('string'); + expect(isHexStrict(account.address)).toBe(true); + expect(typeof account.encrypt).toBe('function'); + expect(typeof account.sign).toBe('function'); + expect(typeof account.signTransaction).toBe('function'); + }); + }); + }); + describe('privateKeyToAddress', () => { + describe('valid cases', () => { + it.each(validPrivateKeyToAddressData)('%s', (input, output) => { + expect(privateKeyToAddress(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(invalidPrivateKeyToAddressData)('%s', (input, output) => { + expect(() => privateKeyToAddress(input)).toThrow(output); + }); + }); + }); + + describe('privateKeyToAccount', () => { + describe('valid cases', () => { + it.each(validPrivateKeytoAccountData)('%s', (input, output) => { + expect( + JSON.stringify(privateKeyToAccount(input.address, input.ignoreLength)), + ).toEqual(JSON.stringify(output)); + }); + }); + + describe('invalid cases', () => { + it.each(invalidPrivateKeytoAccountData)('%s', (input, output) => { + expect(() => privateKeyToAccount(input)).toThrow(output); + }); + }); + }); + + describe('Signing and Recovery of Transaction', () => { + it.each(transactionsTestData)('sign transaction', async txData => { + const account = create(); + + const signedResult = await signTransaction( + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + TransactionFactory.fromTxData(txData), + account.privateKey, + ); + expect(signedResult).toBeDefined(); + expect(signedResult.messageHash).toBeDefined(); + expect(signedResult.rawTransaction).toBeDefined(); + expect(signedResult.transactionHash).toBeDefined(); + expect(signedResult.r).toBeDefined(); + expect(signedResult.s).toBeDefined(); + expect(signedResult.v).toBeDefined(); + }); + + it.each(transactionsTestData)('Recover transaction', async txData => { + const account = create(); + const txObj = { ...txData, from: account.address }; + const signedResult = await signTransaction( + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + TransactionFactory.fromTxData(txObj), + account.privateKey, + ); + expect(signedResult).toBeDefined(); + + const address: Address = recoverTransaction(signedResult.rawTransaction); + expect(address).toEqual(account.address); + }); + }); + + describe('Hash Message', () => { + it.each(validHashMessageData)('%s', (message, hash) => { + expect(hashMessage(message)).toEqual(hash); + }); + }); + + describe('Sign Message', () => { + describe('sign', () => { + it.each(signatureRecoverData)('%s', (data, testObj) => { + const result = sign(data, testObj.privateKey); + expect(result.signature).toEqual(testObj.signature || testObj.signatureOrV); // makes sure we get signature and not V value + }); + }); + + describe('recover', () => { + it.each(signatureRecoverData)('%s', (data, testObj) => { + const address = recover(data, testObj.signatureOrV, testObj.prefixedOrR, testObj.s); + expect(address).toEqual(testObj.address); + }); + }); + }); + + describe('encrypt', () => { + describe('valid cases', () => { + it.each(validEncryptData)('%s', async (input, output) => { + const result = await encrypt(input[0], input[1], input[2]).catch(err => { + throw err; + }); + expect(result.version).toBe(output.version); + expect(result.address).toBe(output.address); + expect(result.crypto.ciphertext).toBe(output.crypto.ciphertext); + expect(result.crypto.cipherparams).toEqual(output.crypto.cipherparams); + expect(result.crypto.cipher).toEqual(output.crypto.cipher); + expect(result.crypto.kdf).toBe(output.crypto.kdf); + expect(result.crypto.kdfparams).toEqual(output.crypto.kdfparams); + expect(typeof result.version).toBe('number'); + expect(typeof result.id).toBe('string'); + expect(typeof result.crypto.mac).toBe('string'); + }); + }); + + describe('invalid cases', () => { + it.each(invalidEncryptData)('%s', async (input, output) => { + const result = encrypt(input[0], input[1], input[2]); + await expect(result).rejects.toThrow(output); + }); + }); + }); + + describe('decrypt', () => { + describe('valid cases', () => { + it.each(validDecryptData)('%s', async input => { + const keystore = await encrypt(input[0], input[1], input[2]).catch(err => { + throw err; + }); + + // make sure decrypt does not throw invalid password error + const result = await decrypt(keystore, input[1]); + + expect(JSON.stringify(result)).toEqual( + JSON.stringify(privateKeyToAccount(input[3])), + ); + + const keystoreString = JSON.stringify(keystore); + + const stringResult = await decrypt(keystoreString, input[1], true); + + expect(JSON.stringify(stringResult)).toEqual( + JSON.stringify(privateKeyToAccount(input[3])), + ); + }); + }); + + describe('invalid cases', () => { + it.each(invalidDecryptData)('%s', async (input, output) => { + const result = decrypt(input[0], input[1]); + + await expect(result).rejects.toThrow(output); + }); + }); + + describe('invalid keystore, fails validation', () => { + it.each(invalidKeyStore)('%s', async input => { + const result = decrypt(input[0], input[1]); + + await expect(result).rejects.toThrow(Web3ValidatorError); + }); + }); + }); +}); diff --git a/packages/web3-eth-accounts/test/integration/jest.config.js b/packages/web3-eth-accounts/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-eth-accounts/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-eth-accounts/test/integration/setup.js b/packages/web3-eth-accounts/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-eth-accounts/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth-accounts/test/integration/wallet.test.ts b/packages/web3-eth-accounts/test/integration/wallet.test.ts new file mode 100644 index 00000000000..0cbf2d8db62 --- /dev/null +++ b/packages/web3-eth-accounts/test/integration/wallet.test.ts @@ -0,0 +1,298 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable @typescript-eslint/no-magic-numbers */ + +import { Web3AccountProvider, KeyStore } from 'web3-types'; +import { isBrowser, isElectron, itIf } from '../fixtures/system_test_utils'; +import { Wallet } from '../../src'; +import * as accountProvider from '../../src/account'; + +describe('Wallet', () => { + let wallet: Wallet; + beforeEach(() => { + wallet = new Wallet(accountProvider as Web3AccountProvider); + }); + + describe('constructor', () => { + it('should create instance of the wallet', () => { + expect(wallet).toBeInstanceOf(Wallet); + }); + }); + + describe('create', () => { + it('should create given # of accounts using the account provider', () => { + const numberOfAccounts = 10; + const accounts = []; + wallet.create(numberOfAccounts); + for (let i = 0; i < numberOfAccounts; i += 1) { + accounts.push(wallet.get(i)); + } + expect(wallet).toHaveLength(numberOfAccounts); + expect(accounts).toHaveLength(numberOfAccounts); + }); + }); + + describe('add', () => { + it('should create account from private key if string value is given', () => { + const { privateKey, address } = accountProvider.create(); + const result = wallet.add(privateKey); + + expect(result).toBeTruthy(); + + expect(wallet).toHaveLength(1); + expect(wallet.get(0)?.address).toBe(address); + }); + + it('should not create account from private key if object value is given', () => { + const { address } = accountProvider.create(); + const result = wallet.add({ address } as never); + + expect(result).toBeTruthy(); + expect(wallet).toHaveLength(1); + expect(wallet.get(0)?.address).toBe(address); + }); + + it('should add account with lowercase address', () => { + const { address } = accountProvider.create(); + const result = wallet.add({ address } as never); + + expect(result).toBeTruthy(); + expect(wallet).toHaveLength(1); + expect(wallet.get(address)?.address).toBe(address); + }); + + it('should override account object for existing address', () => { + const temp1 = accountProvider.create(); + const account1 = { address: temp1.address, privateKey: temp1.privateKey } as never; + const temp2 = accountProvider.create(); + const account2 = { address: temp1.address, privateKey: temp2.privateKey } as never; + + wallet.add(account1); + expect(wallet.get(temp1.address)).toEqual(account1); + + wallet.add(account2); + expect(wallet.get(temp1.address)).toEqual(account2); + }); + }); + + describe('get', () => { + it('should get account for given index', () => { + const account = accountProvider.create(); + + wallet.add(account); + + expect(wallet.get(0)).toEqual(account); + }); + + it('should get account for given address', () => { + const account = accountProvider.create(); + + wallet.add(account); + + expect(wallet.get(account.address)).toEqual(account); + }); + + it('should get account with index', () => { + const account = accountProvider.create(); + + wallet.add(account); + + expect(wallet[0]).toEqual(account); + }); + }); + + describe('remove', () => { + it('should remove account for given index', () => { + const account = accountProvider.create(); + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove(0); + + expect(result).toBeTruthy(); + expect(wallet).toHaveLength(0); + expect(wallet.get(0)).toBeUndefined(); + }); + + it('should return false if index not found', () => { + const account = accountProvider.create(); + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove(2); + + expect(result).toBeFalsy(); + expect(wallet).toHaveLength(1); + }); + + it('should remove account for given address', () => { + const account = accountProvider.create(); + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove(account.address); + + expect(result).toBeTruthy(); + expect(wallet).toHaveLength(0); + expect(wallet.get(0)).toBeUndefined(); + }); + + it('should return false if given address not found', () => { + const account = accountProvider.create(); + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove('my_address2'); + + expect(result).toBeFalsy(); + expect(wallet).toHaveLength(1); + }); + + it('should remove account with the index', () => { + const account = accountProvider.create(); + wallet.add(account); + expect(wallet).toHaveLength(1); + + delete wallet[0]; + + // Deleting objects dees not change the length + expect(wallet).toHaveLength(1); + expect(wallet[0]).toBeUndefined(); + }); + + it('should remove account with array methods', () => { + const account = accountProvider.create(); + wallet.add(account); + expect(wallet).toHaveLength(1); + + wallet.splice(0, 1); + + expect(wallet).toHaveLength(0); + expect(wallet[0]).toBeUndefined(); + }); + + it('should remove account added with private key with array methods', () => { + const account = accountProvider.create(); + wallet.add(account.privateKey); + expect(wallet).toHaveLength(1); + + wallet.splice(0, 1); + + expect(wallet).toHaveLength(0); + expect(wallet[0]).toBeUndefined(); + }); + }); + + describe('clear', () => { + it('should remove all accounts', () => { + const account1 = accountProvider.create(); + const account2 = accountProvider.create(); + wallet.add({ address: account1.address } as never); + wallet.add({ address: account2.address } as never); + expect(wallet).toHaveLength(2); + + wallet.clear(); + + expect(wallet).toHaveLength(0); + expect(wallet.get(0)).toBeUndefined(); + }); + }); + + describe('encrypt', () => { + it('should encrypt all accounts and return array', async () => { + const account1 = accountProvider.create(); + const account2 = accountProvider.create(); + const options = { myOptions: 'myOptions' }; + wallet.add(account1); + wallet.add(account2); + + const result: KeyStore[] = await wallet.encrypt('password', options); + expect(result).toHaveLength(2); + expect(`0x${result[0]?.address.toLowerCase()}`).toBe(account1.address.toLowerCase()); + expect(`0x${result[1]?.address.toLowerCase()}`).toBe(account2.address.toLowerCase()); + }); + }); + + describe('decrypt', () => { + it('should decrypt all accounts and add to wallet', async () => { + const account1 = accountProvider.create(); + const account2 = accountProvider.create(); + const options = { myOptions: 'myOptions' }; + wallet.add(account1); + wallet.add(account2); + const result = await wallet.encrypt('password', options); + await wallet.decrypt(result, 'password', options); + + expect(wallet).toHaveLength(2); + expect(wallet.get(0)?.address).toEqual(account1.address); + expect(wallet.get(0)?.privateKey).toEqual(account1.privateKey); + expect(wallet.get(1)?.address).toEqual(account2.address); + expect(wallet.get(1)?.privateKey).toEqual(account2.privateKey); + }); + }); + + describe('save', () => { + itIf(!(isBrowser || isElectron))( + 'should throw error if local storage not present', + async () => { + // eslint-disable-next-line jest/no-standalone-expect + return expect(wallet.save('password')).rejects.toThrow( + 'Local storage not available.', + ); + }, + ); + + itIf(isBrowser || isElectron)( + 'should encrypt wallet and load it with given key', + async () => { + const account = accountProvider.create(); + wallet.add(account); + // eslint-disable-next-line jest/no-standalone-expect + expect(await wallet.save('password', 'myKey')).toBe(true); + // eslint-disable-next-line jest/no-standalone-expect + expect((await wallet.load('password', 'myKey')).get(0)?.address).toBe( + account.address, + ); + }, + ); + + itIf(isBrowser || isElectron)( + 'should encrypt wallet and load it with default key', + async () => { + const account = accountProvider.create(); + wallet.add(account); + // eslint-disable-next-line jest/no-standalone-expect + expect(await wallet.save('password')).toBe(true); + // eslint-disable-next-line jest/no-standalone-expect + expect((await wallet.load('password')).get(0)?.address).toBe(account.address); + }, + ); + }); + + describe('load', () => { + itIf(!(isBrowser || isElectron))( + 'should throw error if local storage not present', + async () => { + // eslint-disable-next-line jest/no-standalone-expect + return expect(wallet.load('password')).rejects.toThrow( + 'Local storage not available.', + ); + }, + ); + }); +}); diff --git a/packages/web3-eth-accounts/test/tsconfig.json b/packages/web3-eth-accounts/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-eth-accounts/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-eth-accounts/test/unit/__snapshots__/wallet.test.ts.snap b/packages/web3-eth-accounts/test/unit/__snapshots__/wallet.test.ts.snap new file mode 100644 index 00000000000..0d190f35c1d --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/__snapshots__/wallet.test.ts.snap @@ -0,0 +1,36 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Wallet create should create given # of accounts using the account provider 1`] = ` +[ + { + "address": "account_create_1", + }, + { + "address": "account_create_2", + }, + { + "address": "account_create_3", + }, + { + "address": "account_create_4", + }, + { + "address": "account_create_5", + }, + { + "address": "account_create_6", + }, + { + "address": "account_create_7", + }, + { + "address": "account_create_8", + }, + { + "address": "account_create_9", + }, + { + "address": "account_create_10", + }, +] +`; diff --git a/packages/web3-eth-accounts/test/unit/account.test.ts b/packages/web3-eth-accounts/test/unit/account.test.ts new file mode 100644 index 00000000000..10dae39fbc7 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/account.test.ts @@ -0,0 +1,237 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address } from 'web3-types'; +import { Web3ValidatorError, isHexStrict } from 'web3-validator'; +import { + create, + decrypt, + encrypt, + hashMessage, + privateKeyToAccount, + privateKeyToAddress, + recover, + recoverTransaction, + sign, + signTransaction, + privateKeyToPublicKey, +} from '../../src/account'; +import { + invalidDecryptData, + invalidEncryptData, + invalidKeyStore, + invalidPrivateKeytoAccountData, + invalidPrivateKeyToAddressData, + signatureRecoverData, + transactionsTestData, + validDecryptData, + validEncryptData, + validHashMessageData, + validPrivateKeytoAccountData, + validPrivateKeyToAddressData, + validPrivateKeyToPublicKeyData, + validRecover, +} from '../fixtures/account'; +import { TransactionFactory } from '../../src/tx/transactionFactory'; +import { TxData } from '../../src/tx/types'; + +jest.setTimeout(25000); + +describe('accounts', () => { + describe('create', () => { + describe('valid cases', () => { + it('%s', () => { + const account = create(); + expect(typeof account.privateKey).toBe('string'); + expect(typeof account.address).toBe('string'); + expect(isHexStrict(account.address)).toBe(true); + expect(typeof account.encrypt).toBe('function'); + expect(typeof account.sign).toBe('function'); + expect(typeof account.signTransaction).toBe('function'); + }); + }); + }); + + describe('privateKeyToAddress', () => { + describe('valid cases', () => { + it.each(validPrivateKeyToAddressData)('%s', (input, output) => { + expect(privateKeyToAddress(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(invalidPrivateKeyToAddressData)('%s', (input, output) => { + expect(() => privateKeyToAddress(input)).toThrow(output); + }); + }); + }); + + describe('privateKeyToAccount', () => { + describe('valid cases', () => { + it.each(validPrivateKeytoAccountData)('%s', (input, output) => { + expect( + JSON.stringify(privateKeyToAccount(input.address, input.ignoreLength)), + ).toEqual(JSON.stringify(output)); + }); + }); + + describe('invalid cases', () => { + it.each(invalidPrivateKeytoAccountData)('%s', (input, output) => { + expect(() => privateKeyToAccount(input)).toThrow(output); + }); + }); + }); + describe('privateKeyToPublicKey', () => { + describe('valid cases', () => { + it.each(validPrivateKeyToPublicKeyData)('%s', (privateKey, isCompressed, output) => { + expect(privateKeyToPublicKey(privateKey, isCompressed)).toEqual(output); + }); + }); + }); + + describe('Signing and Recovery of Transaction', () => { + it.each(transactionsTestData)('sign transaction', async txData => { + const account = create(); + + const signedResult = await signTransaction( + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + TransactionFactory.fromTxData(txData as unknown as TxData), + account.privateKey, + ); + expect(signedResult).toBeDefined(); + expect(signedResult.messageHash).toBeDefined(); + expect(signedResult.rawTransaction).toBeDefined(); + expect(signedResult.transactionHash).toBeDefined(); + expect(signedResult.r).toMatch(/0[xX][0-9a-fA-F]{64}/); + expect(signedResult.s).toMatch(/0[xX][0-9a-fA-F]{64}/); + expect(signedResult.v).toMatch(/0[xX][0-9a-fA-F]+/); + }); + + it.each(transactionsTestData)('Recover transaction', async txData => { + const account = create(); + const txObj = { ...txData, from: account.address }; + const signedResult = await signTransaction( + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + TransactionFactory.fromTxData(txObj), + account.privateKey, + ); + expect(signedResult).toBeDefined(); + + const address: Address = recoverTransaction(signedResult.rawTransaction); + expect(address).toBeDefined(); + expect(address).toEqual(account.address); + }); + }); + + describe('Hash Message', () => { + it.each(validHashMessageData)('%s', (message, hash) => { + expect(hashMessage(message)).toEqual(hash); + }); + }); + + describe('Sign Message', () => { + describe('sign', () => { + it.each(signatureRecoverData)('%s', (data, testObj) => { + const result = sign(data, testObj.privateKey); + expect(result.signature).toEqual(testObj.signature || testObj.signatureOrV); // makes sure we get signature and not V value + expect(result.r).toEqual(testObj.r); + expect(result.s).toEqual(testObj.s); + }); + }); + + describe('recover', () => { + it.each(signatureRecoverData)('%s', (data, testObj) => { + const address = recover(data, testObj.signatureOrV, testObj.prefixedOrR, testObj.s); + expect(address).toEqual(testObj.address); + }); + }); + }); + + describe('encrypt', () => { + describe('valid cases', () => { + it.each(validEncryptData)('%s', async (input, output) => { + const result = await encrypt(input[0], input[1], input[2]).catch(err => { + throw err; + }); + expect(result.version).toBe(output.version); + expect(result.address).toBe(output.address); + expect(result.crypto.ciphertext).toBe(output.crypto.ciphertext); + expect(result.crypto.cipherparams).toEqual(output.crypto.cipherparams); + expect(result.crypto.cipher).toEqual(output.crypto.cipher); + expect(result.crypto.kdf).toBe(output.crypto.kdf); + expect(result.crypto.kdfparams).toEqual(output.crypto.kdfparams); + expect(typeof result.version).toBe('number'); + expect(typeof result.id).toBe('string'); + expect(typeof result.crypto.mac).toBe('string'); + }); + }); + + describe('invalid cases', () => { + it.each(invalidEncryptData)('%s', async (input, output) => { + const result = encrypt(input[0], input[1], input[2]); + await expect(result).rejects.toThrow(output); + }); + }); + }); + + describe('decrypt', () => { + describe('valid cases', () => { + it.each(validDecryptData)('%s', async input => { + const keystore = await encrypt(input[0], input[1], input[2]).catch(err => { + throw err; + }); + + // make sure decrypt does not throw invalid password error + const result = await decrypt(keystore, input[1]); + + expect(JSON.stringify(result)).toEqual( + JSON.stringify(privateKeyToAccount(input[3])), + ); + + const keystoreString = JSON.stringify(keystore); + + const stringResult = await decrypt(keystoreString, input[1], true); + + expect(JSON.stringify(stringResult)).toEqual( + JSON.stringify(privateKeyToAccount(input[3])), + ); + }); + }); + + describe('invalid cases', () => { + it.each(invalidDecryptData)('%s', async (input, output) => { + const result = decrypt(input[0], input[1]); + + await expect(result).rejects.toThrow(output); + }); + }); + + describe('invalid keystore, fails validation', () => { + it.each(invalidKeyStore)('%s', async input => { + const result = decrypt(input[0], input[1]); + + await expect(result).rejects.toThrow(Web3ValidatorError); + }); + }); + + describe('valid signatures for recover', () => { + it.each(validRecover)('&s', (data, signature) => { + recover(data, signature); + }); + }); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/account_dom.test.ts b/packages/web3-eth-accounts/test/unit/account_dom.test.ts new file mode 100644 index 00000000000..587996a721c --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/account_dom.test.ts @@ -0,0 +1,248 @@ +/** + * @jest-environment jsdom + */ + +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// this file contains the unit test for the event emitter in the DOM environment +// it is executed in the jsdom environment (see "@jest-environment jsdom" in the top comment of this file) + +// ignore the following rule to allow keeping `@jest-environment jsdom` on top: +// eslint-disable-next-line header/header +import { TextEncoder } from 'util'; +import crypto from 'crypto'; +// polyfill for jsdom +global.TextEncoder = TextEncoder; +// @ts-expect-error "Cannot assign to 'subtle' because it is a read-only property." +global.crypto.subtle = crypto.webcrypto.subtle; + +/* eslint-disable import/first */ +import { Address } from 'web3-types'; +import { Web3ValidatorError, isHexStrict } from 'web3-validator'; +import { + create, + decrypt, + encrypt, + hashMessage, + privateKeyToAccount, + privateKeyToAddress, + recover, + recoverTransaction, + sign, + signTransaction, + privateKeyToPublicKey, +} from '../../src/account'; +import { + invalidDecryptData, + invalidEncryptData, + invalidKeyStore, + invalidPrivateKeytoAccountData, + invalidPrivateKeyToAddressData, + signatureRecoverData, + transactionsTestData, + validDecryptData, + validEncryptData, + validHashMessageData, + validPrivateKeytoAccountData, + validPrivateKeyToAddressData, + validPrivateKeyToPublicKeyData, + validRecover, +} from '../fixtures/account'; +import { TransactionFactory } from '../../src/tx/transactionFactory'; +import { TxData } from '../../src/tx/types'; + +describe('accounts', () => { + describe('create', () => { + describe('valid cases', () => { + it('%s', () => { + const account = create(); + expect(typeof account.privateKey).toBe('string'); + expect(typeof account.address).toBe('string'); + expect(isHexStrict(account.address)).toBe(true); + expect(typeof account.encrypt).toBe('function'); + expect(typeof account.sign).toBe('function'); + expect(typeof account.signTransaction).toBe('function'); + }); + }); + }); + + describe('privateKeyToAddress', () => { + describe('valid cases', () => { + it.each(validPrivateKeyToAddressData)('%s', (input, output) => { + expect(privateKeyToAddress(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(invalidPrivateKeyToAddressData)('%s', (input, output) => { + expect(() => privateKeyToAddress(input)).toThrow(output); + }); + }); + }); + + describe('privateKeyToAccount', () => { + describe('valid cases', () => { + it.each(validPrivateKeytoAccountData)('%s', (input, output) => { + expect(JSON.stringify(privateKeyToAccount(input.address, input.ignoreLength))).toEqual( + JSON.stringify(output), + ); + }); + }); + + describe('invalid cases', () => { + it.each(invalidPrivateKeytoAccountData)('%s', (input, output) => { + expect(() => privateKeyToAccount(input)).toThrow(output); + }); + }); + }); + describe('privateKeyToPublicKey', () => { + describe('valid cases', () => { + it.each(validPrivateKeyToPublicKeyData)('%s', (privateKey, isCompressed, output) => { + expect(privateKeyToPublicKey(privateKey, isCompressed)).toEqual(output); + }); + }); + }); + + describe('Signing and Recovery of Transaction', () => { + it.each(transactionsTestData)('sign transaction', async txData => { + const account = create(); + + const signedResult = await signTransaction( + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + TransactionFactory.fromTxData(txData as unknown as TxData), + account.privateKey, + ); + expect(signedResult).toBeDefined(); + expect(signedResult.messageHash).toBeDefined(); + expect(signedResult.rawTransaction).toBeDefined(); + expect(signedResult.transactionHash).toBeDefined(); + expect(signedResult.r).toMatch(/0[xX][0-9a-fA-F]{64}/); + expect(signedResult.s).toMatch(/0[xX][0-9a-fA-F]{64}/); + expect(signedResult.v).toMatch(/0[xX][0-9a-fA-F]+/); + }); + + it.each(transactionsTestData)('Recover transaction', async txData => { + const account = create(); + const txObj = { ...txData, from: account.address }; + const signedResult = await signTransaction( + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + TransactionFactory.fromTxData(txObj), + account.privateKey, + ); + expect(signedResult).toBeDefined(); + + const address: Address = recoverTransaction(signedResult.rawTransaction); + expect(address).toBeDefined(); + expect(address).toEqual(account.address); + }); + }); + + describe('Hash Message', () => { + it.each(validHashMessageData)('%s', (message, hash) => { + expect(hashMessage(message)).toEqual(hash); + }); + }); + + describe('Sign Message', () => { + describe('sign', () => { + it.each(signatureRecoverData)('%s', (data, testObj) => { + const result = sign(data, testObj.privateKey); + expect(result.signature).toEqual(testObj.signature || testObj.signatureOrV); // makes sure we get signature and not V value + expect(result.r).toEqual(testObj.r); + expect(result.s).toEqual(testObj.s); + }); + }); + + describe('recover', () => { + it.each(signatureRecoverData)('%s', (data, testObj) => { + const address = recover(data, testObj.signatureOrV, testObj.prefixedOrR, testObj.s); + expect(address).toEqual(testObj.address); + }); + }); + }); + + describe('encrypt', () => { + describe('valid cases', () => { + it.each(validEncryptData)('%s', async (input, output) => { + const result = await encrypt(input[0], input[1], input[2]).catch(err => { + throw err; + }); + expect(result.version).toBe(output.version); + expect(result.address).toBe(output.address); + expect(result.crypto.ciphertext).toBe(output.crypto.ciphertext); + expect(result.crypto.cipherparams).toEqual(output.crypto.cipherparams); + expect(result.crypto.cipher).toEqual(output.crypto.cipher); + expect(result.crypto.kdf).toBe(output.crypto.kdf); + expect(result.crypto.kdfparams).toEqual(output.crypto.kdfparams); + expect(typeof result.version).toBe('number'); + expect(typeof result.id).toBe('string'); + expect(typeof result.crypto.mac).toBe('string'); + }); + }); + + describe('invalid cases', () => { + it.each(invalidEncryptData)('%s', async (input, output) => { + const result = encrypt(input[0], input[1], input[2]); + await expect(result).rejects.toThrow(output); + }); + }); + }); + + describe('decrypt', () => { + describe('valid cases', () => { + it.each(validDecryptData)('%s', async input => { + const keystore = await encrypt(input[0], input[1], input[2]).catch(err => { + throw err; + }); + + // make sure decrypt does not throw invalid password error + const result = await decrypt(keystore, input[1]); + + expect(JSON.stringify(result)).toEqual(JSON.stringify(privateKeyToAccount(input[3]))); + + const keystoreString = JSON.stringify(keystore); + + const stringResult = await decrypt(keystoreString, input[1], true); + + expect(JSON.stringify(stringResult)).toEqual(JSON.stringify(privateKeyToAccount(input[3]))); + }); + }); + + describe('invalid cases', () => { + it.each(invalidDecryptData)('%s', async (input, output) => { + const result = decrypt(input[0], input[1]); + + await expect(result).rejects.toThrow(output); + }); + }); + + describe('invalid keystore, fails validation', () => { + it.each(invalidKeyStore)('%s', async input => { + const result = decrypt(input[0], input[1]); + + await expect(result).rejects.toThrow(Web3ValidatorError); + }); + }); + + describe('valid signatures for recover', () => { + it.each(validRecover)('&s', (data, signature) => { + recover(data, signature); + }); + }); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/chains.test.ts b/packages/web3-eth-accounts/test/unit/common/chains.test.ts new file mode 100644 index 00000000000..750ffd1bc4c --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/chains.test.ts @@ -0,0 +1,112 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Chain, Common, ConsensusAlgorithm, ConsensusType, Hardfork } from '../../../src/common'; + +describe('[Common/Chains]: Initialization / Chain params', () => { + it('Should initialize with chain provided', () => { + let c = new Common({ chain: 'mainnet' }); + expect(c.chainName()).toBe('mainnet'); + expect(c.chainId()).toEqual(BigInt(1)); + expect(c.networkId()).toEqual(BigInt(1)); + expect(c.hardfork()).toEqual(Hardfork.Merge); + expect(c.hardfork()).toEqual(c.DEFAULT_HARDFORK); + + c = new Common({ chain: 1 }); + expect(c.chainName()).toBe('mainnet'); + }); + + it('Should initialize with chain provided by Chain enum', () => { + const c = new Common({ chain: Chain.Mainnet }); + expect(c.chainName()).toBe('mainnet'); + expect(c.chainId()).toEqual(BigInt(1)); + expect(c.networkId()).toEqual(BigInt(1)); + expect(c.hardfork()).toEqual(Hardfork.Merge); + expect(c.hardfork()).toEqual(c.DEFAULT_HARDFORK); + }); + + it('Should initialize with chain and hardfork provided', () => { + const c = new Common({ chain: 'mainnet', hardfork: 'byzantium' }); + expect(c.hardfork()).toBe('byzantium'); + }); + + it('Should initialize with chain and hardfork provided by Chain and Hardfork enums', () => { + const c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }); + expect(c.hardfork()).toBe('byzantium'); + }); + + it('Should handle initialization errors', () => { + let f = function () { + // eslint-disable-next-line no-new + new Common({ chain: 'chainnotexisting' }); + }; + expect(f).toThrow('not supported'); // eslint-disable-line no-new + + f = function () { + // eslint-disable-next-line no-new + new Common({ chain: 'mainnet', hardfork: 'hardforknotexisting' }); + }; + expect(f).toThrow('not supported'); // eslint-disable-line no-new + }); + + it('Should provide correct access to chain parameters', () => { + let c = new Common({ chain: 'mainnet', hardfork: 'chainstart' }); + expect(c.hardforks()[3]['block']).toBe(2463000); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfWork); + expect(c.consensusAlgorithm()).toEqual(ConsensusAlgorithm.Ethash); + expect(c.consensusConfig()).toEqual({}); + + c = new Common({ chain: 'goerli', hardfork: 'chainstart' }); + expect(c.hardforks()[3]['block']).toBe(0); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfAuthority); + expect(c.consensusAlgorithm()).toEqual(ConsensusAlgorithm.Clique); + expect(c.consensusConfig().epoch).toBe(30000); + }); + + it('Should provide DNS network information in a uniform way', () => { + const configs = ['mainnet', 'goerli']; + for (const network of configs) { + const c = new Common({ chain: network }); + const dnsNetworks = c.dnsNetworks(); + expect(Array.isArray(dnsNetworks)).toBe(true); + expect(typeof dnsNetworks[0]).toBe('string'); + } + }); +}); + +describe('[Common]: isSupportedChainId static method', () => { + it('Should return true for supported chainId', () => { + expect(Common.isSupportedChainId(BigInt(1))).toBe(true); + }); + + it('Should return false for unsupported chainId', () => { + expect(Common.isSupportedChainId(BigInt(0))).toBe(false); + }); +}); + +describe('[Common]: copy()', () => { + it('listener tests', () => { + const common = new Common({ chain: 'mainnet' }); + // Add two listeners + // eslint-disable-next-line @typescript-eslint/no-empty-function + common.on('hardforkChanged', () => {}); + // eslint-disable-next-line @typescript-eslint/no-empty-function + common.on('hardforkChanged', () => {}); + const commonCopy = common.copy(); + expect(common.listenerCount('hardforkChanged')).toBe(2); + expect(commonCopy.listenerCount('hardforkChanged')).toBe(0); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/customChains.test.ts b/packages/web3-eth-accounts/test/unit/common/customChains.test.ts new file mode 100644 index 00000000000..d11094e1ed6 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/customChains.test.ts @@ -0,0 +1,166 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Chain, Common, ConsensusType, CustomChain, Hardfork } from '../../../src/common'; + +import * as testnet from '../../fixtures/common/testnet.json'; +import * as testnet2 from '../../fixtures/common/testnet2.json'; +import * as testnet3 from '../../fixtures/common/testnet3.json'; + +describe('[Common]: Custom chains', () => { + it('chain -> object: should provide correct access to private network chain parameters', () => { + const c = new Common({ chain: testnet, hardfork: Hardfork.Byzantium }); + expect(c.chainName()).toBe('testnet'); + expect(c.chainId()).toEqual(BigInt(12345)); + expect(c.networkId()).toEqual(BigInt(12345)); + expect(c.hardforks()[3]['block']).toBe(3); + expect(c.bootstrapNodes()![1].ip).toBe('10.0.0.2'); + }); + + it('chain -> object: should handle custom chain parameters with missing field', () => { + const chainParams = { ...testnet }; + delete (chainParams as any)['hardforks']; + expect(() => { + // eslint-disable-next-line no-new + new Common({ chain: chainParams }); + }).toThrow('Missing required'); // eslint-disable-line no-new + }); + + it('custom() -> base functionality', () => { + const mainnetCommon = new Common({ chain: Chain.Mainnet }); + + const customChainParams = { name: 'custom', chainId: 123, networkId: 678 }; + const customChainCommon = Common.custom(customChainParams, { + hardfork: Hardfork.Byzantium, + }); + + // From custom chain params + expect(customChainCommon.chainName()).toEqual(customChainParams.name); + expect(customChainCommon.chainId()).toEqual(BigInt(customChainParams.chainId)); + expect(customChainCommon.networkId()).toEqual(BigInt(customChainParams.networkId)); + + // Fallback params from mainnet + expect(customChainCommon.genesis()).toEqual(mainnetCommon.genesis()); + expect(customChainCommon.bootstrapNodes()).toEqual(mainnetCommon.bootstrapNodes()); + expect(customChainCommon.hardforks()).toEqual(mainnetCommon.hardforks()); + + // Set only to this Common + expect(customChainCommon.hardfork()).toBe('byzantium'); + }); + + it('custom() -> behavior', () => { + let common = Common.custom({ chainId: 123 }); + expect(common.networkId()).toEqual(BigInt(1)); + expect(common.chainName()).toBe('custom-chain'); + + common = Common.custom(CustomChain.PolygonMumbai); + expect(common.networkId()).toEqual(BigInt(80001)); + for (const customChain of Object.values(CustomChain)) { + common = Common.custom(customChain); + expect(common.chainName()).toEqual(customChain); + } + + common = Common.custom(CustomChain.PolygonMumbai); + expect(common.hardfork()).toEqual(common.DEFAULT_HARDFORK); + + common = Common.custom(CustomChain.OptimisticEthereum, { hardfork: Hardfork.Byzantium }); + expect(common.hardfork()).toEqual(Hardfork.Byzantium); + + expect(() => { + // @ts-expect-error TypeScript complains, nevertheless do the test for JS behavior + Common.custom('this-chain-is-not-supported'); + }).toThrow('not supported'); + }); + + it('customChains parameter: initialization exception', () => { + expect(() => { + // eslint-disable-next-line no-new + new Common({ chain: testnet, customChains: [testnet] }); + }).toThrow( + 'Chain must be a string, number, or bigint when initialized with customChains passed in', + ); + }); + + it('customChains parameter: initialization', () => { + let c = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Byzantium, + customChains: [testnet], + }); + expect(c.chainName()).toBe('mainnet'); + expect(c.hardforkBlock()!).toEqual(BigInt(4370000)); + + c.setChain('testnet'); + expect(c.chainName()).toBe('testnet'); + expect(c.hardforkBlock()!).toEqual(BigInt(4)); + + c = new Common({ + chain: 'testnet', + hardfork: Hardfork.Byzantium, + customChains: [testnet], + }); + expect(c.chainName()).toBe('testnet'); + expect(c.hardforkBlock()!).toEqual(BigInt(4)); + + const customChains = [testnet, testnet2, testnet3]; + c = new Common({ + chain: 'testnet2', + hardfork: Hardfork.Istanbul, + customChains, + }); + expect(c.chainName()).toBe('testnet2'); + expect(c.hardforkBlock()!).toEqual(BigInt(10)); + + c.setChain('testnet'); + expect(c.chainName()).toBe('testnet'); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfWork); + }); +}); + +describe('custom chain setup with hardforks', () => { + const undefinedHardforks = [ + { + name: 'chainstart', + block: 0, + }, + { name: 'homestead' }, + // eslint-disable-next-line no-null/no-null + { name: 'byzantium', block: null }, + { name: 'tangerineWhistle', block: 10 }, + ]; + it('with undefined/null block numbers', () => { + expect( + // @ts-expect-error -- Disabling type check to verify that error is thrown + () => Common.custom({ hardforks: undefinedHardforks }), + ).toThrow(); + + const nullHardforks = [ + { + name: 'chainstart', + block: 0, + }, + // eslint-disable-next-line no-null/no-null + { name: 'homestead', block: null }, + { name: 'tangerineWhistle', block: 10 }, + ]; + + const common = Common.custom({ hardforks: nullHardforks }); + common.setHardforkByBlockNumber(10); + expect('tangerineWhistle').toEqual(common.hardfork()); + common.setHardforkByBlockNumber(3); + expect('chainstart').toEqual(common.hardfork()); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/eips.test.ts b/packages/web3-eth-accounts/test/unit/common/eips.test.ts new file mode 100644 index 00000000000..9266eb037b9 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/eips.test.ts @@ -0,0 +1,78 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { toBigInt } from 'web3-utils'; +import { Chain, Common, Hardfork } from '../../../src/common'; + +describe('[Common/EIPs]: Initialization / Chain params', () => { + it('Correct initialization', () => { + let eips = [2537, 2929]; + const c = new Common({ chain: Chain.Mainnet, eips }); + expect(c.eips()).toEqual(eips); + + eips = [2718, 2929, 2930]; + expect(() => { + // eslint-disable-next-line no-new + new Common({ chain: Chain.Mainnet, eips, hardfork: Hardfork.Istanbul }); + }).not.toThrow(); + + eips = [2930]; + expect(() => { + // eslint-disable-next-line no-new + new Common({ chain: Chain.Mainnet, eips, hardfork: Hardfork.Istanbul }); + }).toThrow(); + }); + + it('Initialization errors', () => { + const UNSUPPORTED_EIP = 1000000; + const eips = [UNSUPPORTED_EIP]; + expect(() => { + // eslint-disable-next-line no-new + new Common({ chain: Chain.Mainnet, eips }); + }).toThrow('not supported'); + + /* + // Manual test since no test triggering EIP config available + // TODO: recheck on addition of new EIP configs + // To run manually change minimumHardfork in EIP2537 config to petersburg + eips = [ 2537, ] + msg = 'should throw on not meeting minimum hardfork requirements' + f = () => { + new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium, eips }) + } + st.throws(f, /minimumHardfork/, msg) + */ + }); + + it('isActivatedEIP()', () => { + let c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Istanbul }); + expect(c.isActivatedEIP(2315)).toBe(false); + c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Istanbul, eips: [2315] }); + expect(c.isActivatedEIP(2315)).toBe(true); + c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Berlin }); + expect(c.isActivatedEIP(2929)).toBe(true); + expect(c.isActivatedEIP(2315)).toBe(false); + expect(c.isActivatedEIP(2537)).toBe(false); + }); + + it('eipBlock', () => { + const c = new Common({ chain: Chain.Mainnet }); + + expect(c.eipBlock(1559)! === toBigInt(12965000)).toBe(true); + + expect(c.eipBlock(0)).toBeNull(); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/hardforks.test.ts b/packages/web3-eth-accounts/test/unit/common/hardforks.test.ts new file mode 100644 index 00000000000..78229bf8d4e --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/hardforks.test.ts @@ -0,0 +1,335 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'web3-utils'; +import { Chain, Common, ConsensusAlgorithm, ConsensusType, Hardfork } from '../../../src/common'; +import gethGenesisKiln from '../../fixtures/common/geth-genesis-kiln.json'; + +describe('[Common]: Hardfork logic', () => { + it('Hardfork access', () => { + const supportedHardforks = [ + Hardfork.Chainstart, + Hardfork.Homestead, + Hardfork.Dao, + Hardfork.Chainstart, + Hardfork.SpuriousDragon, + Hardfork.Byzantium, + Hardfork.Constantinople, + Hardfork.Petersburg, + Hardfork.Istanbul, + Hardfork.Berlin, + Hardfork.London, + Hardfork.ArrowGlacier, + Hardfork.GrayGlacier, + Hardfork.Shanghai, + Hardfork.Merge, + ]; + let c; + + for (const hardfork of supportedHardforks) { + c = new Common({ chain: Chain.Mainnet, hardfork }); + expect(c.hardfork()).toEqual(hardfork); + } + }); + + it('getHardforkByBlockNumber() / setHardforkByBlockNumber()', () => { + let c = new Common({ chain: Chain.Mainnet }); + + expect(c.getHardforkByBlockNumber(0)).toEqual(Hardfork.Chainstart); + expect(c.getHardforkByBlockNumber(1149999)).toEqual(Hardfork.Chainstart); + expect(c.getHardforkByBlockNumber(1150000)).toEqual(Hardfork.Homestead); + expect(c.getHardforkByBlockNumber(1400000)).toEqual(Hardfork.Homestead); + expect(c.getHardforkByBlockNumber(9200000)).toEqual(Hardfork.MuirGlacier); + expect(c.getHardforkByBlockNumber(12244000)).toEqual(Hardfork.Berlin); + expect(c.getHardforkByBlockNumber(12965000)).toEqual(Hardfork.London); + expect(c.getHardforkByBlockNumber(13773000)).toEqual(Hardfork.ArrowGlacier); + expect(c.getHardforkByBlockNumber(15050000)).toEqual(Hardfork.GrayGlacier); + // merge is now specified at 15537394 in config + expect(c.getHardforkByBlockNumber(999999999999)).toEqual(Hardfork.Merge); + + expect(c.setHardforkByBlockNumber(0)).toEqual(Hardfork.Chainstart); + expect(c.setHardforkByBlockNumber(1149999)).toEqual(Hardfork.Chainstart); + expect(c.setHardforkByBlockNumber(1150000)).toEqual(Hardfork.Homestead); + expect(c.setHardforkByBlockNumber(1400000)).toEqual(Hardfork.Homestead); + expect(c.setHardforkByBlockNumber(12244000)).toEqual(Hardfork.Berlin); + expect(c.setHardforkByBlockNumber(12965000)).toEqual(Hardfork.London); + expect(c.setHardforkByBlockNumber(13773000)).toEqual(Hardfork.ArrowGlacier); + expect(c.setHardforkByBlockNumber(15050000)).toEqual(Hardfork.GrayGlacier); + // merge is now specified at 15537394 in config + expect(c.setHardforkByBlockNumber(999999999999)).toEqual(Hardfork.Merge); + + c = new Common({ chain: Chain.Sepolia }); + expect(c.setHardforkByBlockNumber(1735371)).toBe('mergeForkIdTransition'); + }); + + it('should throw if no hardfork qualifies', () => { + const hardforks = [ + { + name: 'homestead', + block: 3, + }, + { + name: 'tangerineWhistle', + block: 3, + }, + { + name: 'spuriousDragon', + block: 3, + }, + ]; + const c = Common.custom({ hardforks }, { baseChain: Chain.Sepolia }); + + expect(() => { + c.getHardforkByBlockNumber(0); + }).toThrow(); + + expect(c.setHardforkByBlockNumber(3)).toEqual(Hardfork.SpuriousDragon); + }); + + it('setHardfork(): hardforkChanged event', () => { + const c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }); + c.on('hardforkChanged', (hardfork: string) => { + expect(hardfork).toEqual(Hardfork.Byzantium); + }); + c.setHardfork(Hardfork.Byzantium); + }); + + it('hardforkBlock()', () => { + let c = new Common({ chain: Chain.Goerli }); + expect(c.hardforkBlock(Hardfork.Byzantium)!).toEqual(BigInt(0)); + + expect(c.hardforkBlock('thisHardforkDoesNotExist')).toBeNull(); + + c = new Common({ chain: Chain.Sepolia, hardfork: Hardfork.MergeForkIdTransition }); + expect(c.hardforkBlock()!).toEqual(BigInt(1735371)); + + c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }); + expect(c.hardforkBlock()!).toEqual(BigInt(9069000)); + + c = new Common({ chain: Chain.Mainnet }); + expect(c.hardforkBlock(Hardfork.Berlin)!).toEqual(BigInt(12244000)); + expect(c.hardforkBlock(Hardfork.Berlin)!).toEqual(BigInt(12244000)); + + // developer note: when Shanghai is set, + // update this test to next unscheduled hardfork. + expect(c.hardforkBlock(Hardfork.Shanghai)).toBeNull(); + expect(c.hardforkBlock(Hardfork.Shanghai)).toBeNull(); + expect(c.nextHardforkBlockOrTimestamp(Hardfork.Shanghai)).toBeNull(); + }); + + it('isHardforkBlock()', () => { + let c = new Common({ chain: Chain.Sepolia }); + // eslint-disable-next-line deprecation/deprecation + expect(c.isHardforkBlock(1450409)).toBe(true); + // eslint-disable-next-line deprecation/deprecation + expect(c.isHardforkBlock(1735372)).toBe(false); + + c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }); + // eslint-disable-next-line deprecation/deprecation + expect(c.isHardforkBlock(4370000)).toBe(true); + // eslint-disable-next-line deprecation/deprecation + expect(c.isHardforkBlock(2463001)).toBe(false); + }); + + it('nextHardforkBlockOrTimestamp()', () => { + let c = new Common({ chain: Chain.Sepolia, hardfork: Hardfork.MergeForkIdTransition }); + expect(c.nextHardforkBlockOrTimestamp()!).toEqual(BigInt(1677557088)); + + expect(c.nextHardforkBlockOrTimestamp('mergeForkIdTransition')!).toEqual( + BigInt(1677557088), + ); + expect(c.nextHardforkBlockOrTimestamp(Hardfork.Byzantium)!).toEqual(BigInt(1735371)); + expect(c.nextHardforkBlockOrTimestamp(Hardfork.London)).toEqual(BigInt(1735371)); + c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Chainstart }); + expect(c.nextHardforkBlockOrTimestamp()!).toEqual(BigInt(1561651)); + }); + + it('isNextHardforkBlock()', () => { + const c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Istanbul }); + // eslint-disable-next-line deprecation/deprecation + expect(c.isNextHardforkBlock(4460644)).toBe(true); + // eslint-disable-next-line deprecation/deprecation + expect(c.isNextHardforkBlock(5062605, 'berlin')).toBe(true); + // eslint-disable-next-line deprecation/deprecation + expect(c.isNextHardforkBlock(5062605, Hardfork.Berlin)).toBe(true); + // eslint-disable-next-line deprecation/deprecation + expect(c.isNextHardforkBlock(13773000, Hardfork.Byzantium)).toBe(false); + // eslint-disable-next-line deprecation/deprecation + expect(c.isNextHardforkBlock(13773001, Hardfork.London)).toBe(false); + }); + + it('hardforkIsActiveOnBlock() / activeOnBlock()', () => { + let c = new Common({ chain: Chain.Goerli }); + expect(c.hardforkIsActiveOnBlock(Hardfork.Istanbul, 1561651)).toBe(true); + + expect(c.hardforkIsActiveOnBlock(Hardfork.London, 5062605)).toBe(true); + + expect(c.hardforkIsActiveOnBlock(Hardfork.Byzantium, 1699999)).toBe(false); + + c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.London }); + // eslint-disable-next-line no-null/no-null + expect(c.hardforkIsActiveOnBlock(null, 5062605)).toBe(true); + + expect(c.activeOnBlock(5062605)).toBe(true); + // eslint-disable-next-line no-null/no-null + expect(c.hardforkIsActiveOnBlock(null, 5062605)).toBe(true); + // eslint-disable-next-line no-null/no-null + expect(c.hardforkIsActiveOnBlock(null, 1699999)).toBe(false); + }); + + it('hardforkGteHardfork()', () => { + let c = new Common({ chain: Chain.Goerli }); + expect(c.hardforkGteHardfork(Hardfork.Constantinople, Hardfork.Byzantium)).toBe(true); + + expect(c.hardforkGteHardfork(Hardfork.Dao, Hardfork.Chainstart)).toBe(false); + + expect(c.hardforkGteHardfork(Hardfork.Byzantium, Hardfork.Byzantium)).toBe(true); + + expect(c.hardforkGteHardfork(Hardfork.SpuriousDragon, Hardfork.Byzantium)).toBe(false); + + c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Byzantium }); + // eslint-disable-next-line no-null/no-null + expect(c.hardforkGteHardfork(null, Hardfork.SpuriousDragon)).toBe(true); + + expect(c.gteHardfork(Hardfork.SpuriousDragon)).toBe(true); + // eslint-disable-next-line no-null/no-null + expect(c.hardforkGteHardfork(null, Hardfork.Byzantium)).toBe(true); + // eslint-disable-next-line no-null/no-null + expect(c.hardforkGteHardfork(null, Hardfork.Constantinople)).toBe(false); + }); + + it('hardforkGteHardfork() ropsten', () => { + const c = new Common({ chain: Chain.Goerli }); + expect(c.hardforkGteHardfork(Hardfork.SpuriousDragon, Hardfork.MuirGlacier)).toBe(false); + }); + + it('_calcForkHash()', () => { + const chains: [Chain, Uint8Array][] = [ + [ + Chain.Mainnet, + hexToBytes('d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3'), + ], + [ + Chain.Goerli, + hexToBytes('bf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a'), + ], + [ + Chain.Sepolia, + hexToBytes('25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9'), + ], + ]; + + let c = new Common({ chain: Chain.Mainnet }); + const mainnetGenesisHash = chains[0][1]; + expect(c._calcForkHash(Hardfork.Chainstart, mainnetGenesisHash)).toBe('0xfc64ec04'); + + expect(c._calcForkHash(Hardfork.Homestead, mainnetGenesisHash)).toBe('0x97c2c34c'); + + expect(c._calcForkHash(Hardfork.Byzantium, mainnetGenesisHash)).toBe('0xa00bc324'); + + for (const [chain, genesisHash] of chains) { + c = new Common({ chain }); + for (const hf of c.hardforks()) { + if (typeof hf.forkHash !== 'string') { + continue; + } + expect(c._calcForkHash(hf.name, genesisHash)).toEqual(hf.forkHash); + } + } + }); + + it('forkHash()', () => { + let c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }); + expect(c.forkHash()).toBe('0xa00bc324'); + expect(c.forkHash(Hardfork.SpuriousDragon)).toBe('0x3edd5b10'); + const genesisHash = hexToBytes( + 'd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', + ); + expect(c.forkHash(Hardfork.SpuriousDragon, genesisHash)).toBe('0x3edd5b10'); + + c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Shanghai }); + // unschedule shanghai on it to test + c.hardforks() + .filter(hf => hf.name === Hardfork.Shanghai) + // eslint-disable-next-line array-callback-return + .map(hf => { + // eslint-disable-next-line no-null/no-null, no-param-reassign + hf.block = null; + // eslint-disable-next-line no-param-reassign + hf.timestamp = undefined; + }); + expect(() => { + c.forkHash(Hardfork.Shanghai); + }).toThrow('No fork hash calculation possible'); + expect(() => { + c.forkHash('thisHardforkDoesNotExist'); + }).toThrow('No fork hash calculation possible'); + }); + + it('hardforkForForkHash()', () => { + const c = new Common({ chain: Chain.Mainnet }); + + const res = c.hardforkForForkHash('0x3edd5b10')!; + expect(res.name).toEqual(Hardfork.SpuriousDragon); + + expect(c.hardforkForForkHash('0x12345')).toBeNull(); + }); + + it('HF consensus updates', () => { + let c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Byzantium }); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfAuthority); + expect(c.consensusAlgorithm()).toEqual(ConsensusAlgorithm.Clique); + expect(c.consensusConfig()['period']).toBe(15); + + c = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Merge }); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfStake); + expect(c.consensusAlgorithm()).toEqual(ConsensusAlgorithm.Casper); + expect(c.consensusConfig()).toEqual({}); + }); + + it('Should correctly apply hardfork changes', () => { + // For sepolia MergeForkIdTransition happens AFTER merge + let c = new Common({ chain: Chain.Sepolia, hardfork: Hardfork.London }); + expect(c['HARDFORK_CHANGES'][11][0]).toEqual(Hardfork.Merge); + expect(c['HARDFORK_CHANGES'][12][0]).toEqual(Hardfork.MergeForkIdTransition); + + // Should give correct ConsensusType pre and post merge + expect(c.consensusType()).toEqual(ConsensusType.ProofOfWork); + c.setHardfork(Hardfork.Merge); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfStake); + c.setHardfork(Hardfork.MergeForkIdTransition); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfStake); + + // For kiln MergeForkIdTransition happens BEFORE Merge + + c = Common.fromGethGenesis(gethGenesisKiln, { + chain: 'kiln', + mergeForkIdPostMerge: false, + }); + + // MergeForkIdTransition change should be before Merge + expect(c['HARDFORK_CHANGES'][10][0]).toEqual(Hardfork.MergeForkIdTransition); + expect(c['HARDFORK_CHANGES'][11][0]).toEqual(Hardfork.Merge); + + // Should give correct ConsensusType pre and post merge + c.setHardfork(Hardfork.London); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfWork); + c.setHardfork(Hardfork.Merge); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfStake); + c.setHardfork(Hardfork.MergeForkIdTransition); + expect(c.consensusType()).toEqual(ConsensusType.ProofOfWork); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/mergePOS.test.ts b/packages/web3-eth-accounts/test/unit/common/mergePOS.test.ts new file mode 100644 index 00000000000..a2337c58c32 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/mergePOS.test.ts @@ -0,0 +1,256 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { toBigInt } from 'web3-utils'; +import { Chain, Common, Hardfork } from '../../../src/common'; + +import * as testnetMerge from '../../fixtures/common/merge/testnetMerge.json'; +import * as testnetPOS from '../../fixtures/common/merge/testnetPOS.json'; +import postMerge from '../../fixtures/common/post-merge.json'; + +describe('[Common]: Merge/POS specific logic', () => { + it('hardforkTTD()', () => { + const customChains = [testnetMerge]; + const c = new Common({ chain: 'testnetMerge', hardfork: Hardfork.Istanbul, customChains }); + expect(c.hardforkTTD(Hardfork.Merge)).toEqual(BigInt(5000)); + expect(c.hardforkTTD('thisHardforkDoesNotExist')).toBeNull(); + }); + + it('getHardforkByBlockNumber(), merge block null, with total difficulty', () => { + const customChains = [testnetMerge]; + const c = new Common({ + chain: 'testnetMerge', + hardfork: Hardfork.Istanbul, + customChains, + }); + + expect(c.getHardforkByBlockNumber(0)).toBe('chainstart'); + expect(c.getHardforkByBlockNumber(14)).toBe('london'); + expect(c.getHardforkByBlockNumber(15, 5000)).toBe('merge'); + expect(c.getHardforkByBlockNumber(15, 5001)).toBe('merge'); + expect(c.getHardforkByBlockNumber(15, 4999)).toBe('london'); + expect(c.getHardforkByBlockNumber(12, 4999)).toBe('berlin'); + }); + + it('getHardforkByBlockNumber(), merge block set, with total difficulty', () => { + const testnetMergeWithBlockNumber = JSON.parse(JSON.stringify(testnetMerge)); + // Set Merge block to 15 + testnetMergeWithBlockNumber['hardforks'][8]['block'] = 16; + const customChains = [testnetMergeWithBlockNumber]; + const c = new Common({ + chain: 'testnetMerge', + hardfork: Hardfork.Istanbul, + customChains, + }); + + expect(c.getHardforkByBlockNumber(0)).toBe('chainstart'); + expect(c.getHardforkByBlockNumber(16)).toBe('merge'); + expect(c.getHardforkByBlockNumber(16, 5000)).toBe('merge'); + expect(c.getHardforkByBlockNumber(16, 5001)).toBe('merge'); + expect(c.getHardforkByBlockNumber(12, 4999)).toBe('berlin'); + + expect(() => { + c.getHardforkByBlockNumber(16, 4999); + }).toThrow('Maximum HF determined by total difficulty is lower than the block number HF'); + + expect(() => { + c.getHardforkByBlockNumber(14, 5000); + }).toThrow('HF determined by block number is lower than the minimum total difficulty HF'); + }); + + it('getHardforkByBlockNumber(), merge block set + subsequent HF, with total difficulty', () => { + const testnetMergeWithBlockNumber = JSON.parse(JSON.stringify(testnetMerge)); + // Set Merge block to 15 + testnetMergeWithBlockNumber['hardforks'][8]['block'] = 16; + // Set Shanghai block to 18 + testnetMergeWithBlockNumber['hardforks'][9]['block'] = 18; + const customChains = [testnetMergeWithBlockNumber]; + const c = new Common({ + chain: 'testnetMerge', + hardfork: Hardfork.Istanbul, + customChains, + }); + + expect(c.getHardforkByBlockNumber(18, 5001)).toBe('shanghai'); + }); + + it('setHardforkByBlockNumber(), merge block null, with total difficulty', () => { + const customChains = [testnetMerge]; + const c = new Common({ + chain: 'testnetMerge', + hardfork: Hardfork.Istanbul, + customChains, + }); + + expect(c.setHardforkByBlockNumber(0)).toBe('chainstart'); + expect(c.setHardforkByBlockNumber(14)).toBe('london'); + expect(c.setHardforkByBlockNumber(15, 5000)).toBe('merge'); + expect(c.setHardforkByBlockNumber(15, 5001)).toBe('merge'); + expect(c.setHardforkByBlockNumber(15, 4999)).toBe('london'); + expect(c.setHardforkByBlockNumber(12, 4999)).toBe('berlin'); + }); + + it('setHardforkByBlockNumber(), merge block set, with total difficulty', () => { + const testnetMergeWithBlockNumber = JSON.parse(JSON.stringify(testnetMerge)); + // Set Merge block to 15 + testnetMergeWithBlockNumber['hardforks'][8]['block'] = 16; + const customChains = [testnetMergeWithBlockNumber]; + const c = new Common({ + chain: 'testnetMerge', + hardfork: Hardfork.Istanbul, + customChains, + }); + + expect(c.setHardforkByBlockNumber(0)).toBe('chainstart'); + expect(c.setHardforkByBlockNumber(16)).toBe('merge'); + expect(c.setHardforkByBlockNumber(16, 5000)).toBe('merge'); + expect(c.setHardforkByBlockNumber(16, 5001)).toBe('merge'); + expect(c.setHardforkByBlockNumber(12, 4999)).toBe('berlin'); + + expect(() => { + c.setHardforkByBlockNumber(16, 4999); + }).toThrow('Maximum HF determined by total difficulty is lower than the block number HF'); + + expect(() => { + c.setHardforkByBlockNumber(14, 5000); + }).toThrow('HF determined by block number is lower than the minimum total difficulty HF'); + }); + + it('setHardforkByBlockNumber(), merge block set + subsequent HF, with total difficulty', () => { + const testnetMergeWithBlockNumber = JSON.parse(JSON.stringify(testnetMerge)); + // Set Merge block to 15 + testnetMergeWithBlockNumber['hardforks'][8]['block'] = 16; + // Set Shanghai block to 18 + testnetMergeWithBlockNumber['hardforks'][9]['block'] = 18; + const customChains = [testnetMergeWithBlockNumber]; + const c = new Common({ + chain: 'testnetMerge', + hardfork: Hardfork.Istanbul, + customChains, + }); + + expect(c.setHardforkByBlockNumber(18, 5001)).toBe('shanghai'); + }); + + it('Pure POS testnet', () => { + const customChains = [testnetPOS]; + const c = new Common({ chain: 'testnetPOS', hardfork: Hardfork.Chainstart, customChains }); + + expect(c.hardforkTTD(Hardfork.Chainstart)).toEqual(BigInt(0)); + + expect(c.getHardforkByBlockNumber(5, 0)).toBe('shanghai'); + }); + + it('Should fail setting invalid hardfork', () => { + const customChains = [testnetPOS]; + expect(() => { + // eslint-disable-next-line no-new + new Common({ chain: 'testnetPOS', hardfork: Hardfork.Istanbul, customChains }); + }).toThrow(`Hardfork with name istanbul not supported`); + }); + + it('should get the correct merge hardfork at genesis', async () => { + const c = Common.fromGethGenesis(postMerge, { chain: 'post-merge' }); + expect(c.getHardforkByBlockNumber(0)).toEqual(Hardfork.London); + expect(c.getHardforkByBlockNumber(0, BigInt(0))).toEqual(Hardfork.Merge); + }); + + it('test post merge hardforks using Sepolia with block null', () => { + const c = new Common({ chain: Chain.Sepolia }); + + expect(c.getHardforkByBlockNumber(0)).toEqual(Hardfork.London); + // Make it null manually as config could be updated later + // eslint-disable-next-line no-null/no-null + const mergeHf = c.hardforks().filter(hf => hf.ttd !== undefined && hf.ttd !== null)[0]; + const prevMergeBlockVal = mergeHf.block; + // eslint-disable-next-line no-null/no-null + mergeHf.block = null; + + // should get Hardfork.London even though happened with 1450408 as terminal as config doesn't have that info + expect(c.getHardforkByBlockNumber(1450409)).toEqual(Hardfork.London); + // however with correct td in input it should select merge + expect(c.getHardforkByBlockNumber(1450409, BigInt('17000000000000000'))).toEqual( + Hardfork.Merge, + ); + // should select MergeForkIdTransition even without td specified as the block is set for this hardfork + expect(c.getHardforkByBlockNumber(1735371)).toEqual(Hardfork.MergeForkIdTransition); + // also with td specified + expect(c.getHardforkByBlockNumber(1735371, BigInt('17000000000000000'))).toEqual( + Hardfork.MergeForkIdTransition, + ); + + // Check nextHardforkBlockOrTimestamp should be MergeForkIdTransition's block on london and merge both + expect(c.nextHardforkBlockOrTimestamp(Hardfork.Berlin)).toEqual(toBigInt(1735371)); + expect(c.nextHardforkBlockOrTimestamp(Hardfork.London)).toEqual(toBigInt(1735371)); + expect(c.nextHardforkBlockOrTimestamp(Hardfork.Merge)).toEqual(toBigInt(1735371)); + + expect(() => { + c.getHardforkByBlockNumber(1735371, BigInt('15000000000000000')); + }).toThrow('Maximum HF determined by total difficulty is lower than the block number HF'); + + expect(c.setHardforkByBlockNumber(0)).toEqual(Hardfork.London); + expect(c.setHardforkByBlockNumber(1450409)).toEqual(Hardfork.London); + expect(c.setHardforkByBlockNumber(1450409, BigInt('17000000000000000'))).toEqual( + Hardfork.Merge, + ); + expect(c.setHardforkByBlockNumber(1735371)).toEqual(Hardfork.MergeForkIdTransition); + expect(c.setHardforkByBlockNumber(1735371, BigInt('17000000000000000'))).toEqual( + Hardfork.MergeForkIdTransition, + ); + + expect(() => { + c.setHardforkByBlockNumber(1735371, BigInt('15000000000000000')); + }).toThrow('Maximum HF determined by total difficulty is lower than the block number HF'); + // restore value + mergeHf.block = prevMergeBlockVal; + }); + + it('should get correct merge and post merge hf with merge block specified', () => { + const c = new Common({ chain: Chain.Sepolia }); + // eslint-disable-next-line no-null/no-null + const mergeHf = c.hardforks().filter(hf => hf.ttd !== undefined && hf.ttd !== null)[0]; + const prevMergeBlockVal = mergeHf.block; + // the terminal block on sepolia is 1450408 + mergeHf.block = 1450409; + + // should get merge even without td supplied as the merge hf now has the block specified + expect(c.setHardforkByBlockNumber(1450409)).toEqual(Hardfork.Merge); + expect(c.setHardforkByBlockNumber(1450409, BigInt('17000000000000000'))).toEqual( + Hardfork.Merge, + ); + expect(c.setHardforkByBlockNumber(1735371)).toEqual(Hardfork.MergeForkIdTransition); + expect(c.setHardforkByBlockNumber(1735371, BigInt('17000000000000000'))).toEqual( + Hardfork.MergeForkIdTransition, + ); + + // Check nextHardforkBlockOrTimestamp should be MergeForkIdTransition's block on london and merge both + expect(c.nextHardforkBlockOrTimestamp(Hardfork.London)).toEqual(toBigInt(1735371)); + expect(c.nextHardforkBlockOrTimestamp(Hardfork.Merge)).toEqual(toBigInt(1735371)); + + // restore value + mergeHf.block = prevMergeBlockVal; + }); + + it('should throw if encounters a double ttd hardfork specification', () => { + const c = new Common({ chain: Chain.Sepolia }); + // Add the ttd to mergeForkIdTransition which occurs post merge in sepolia + c.hardforks().filter(hf => hf.name === 'mergeForkIdTransition')[0]!['ttd'] = + '17000000000000000'; + expect(() => { + c.setHardforkByBlockNumber(1735371); + }).toThrow('More than one merge hardforks found with ttd specified'); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/params.test.ts b/packages/web3-eth-accounts/test/unit/common/params.test.ts new file mode 100644 index 00000000000..46e8720e2db --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/params.test.ts @@ -0,0 +1,102 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Chain, Common, Hardfork } from '../../../src/common'; + +describe('[Common]: Parameter access for param(), paramByHardfork()', () => { + it('Basic usage', () => { + const c = new Common({ chain: Chain.Mainnet, eips: [2537] }); + expect(c.paramByHardfork('gasPrices', 'ecAdd', 'byzantium')).toEqual(BigInt(500)); + + c.setHardfork(Hardfork.Byzantium); + expect(c.param('gasPrices', 'ecAdd')).toEqual(BigInt(500)); + c.setHardfork(Hardfork.Istanbul); + expect(c.param('gasPrices', 'ecAdd')).toEqual(BigInt(150)); + c.setHardfork(Hardfork.MuirGlacier); + expect(c.param('gasPrices', 'ecAdd')).toEqual(BigInt(150)); + + expect(c.param('gasPrices', 'notexistingvalue')).toEqual(BigInt(0)); + expect(c.paramByHardfork('gasPrices', 'notexistingvalue', 'byzantium')).toEqual(BigInt(0)); + }); + + it('Error cases for param(), paramByHardfork()', () => { + const c = new Common({ chain: Chain.Mainnet }); + + expect(() => { + c.paramByHardfork('gasPrizes', 'ecAdd', 'byzantium'); + }).toThrow('Topic gasPrizes not defined'); + + c.setHardfork(Hardfork.Byzantium); + expect(c.param('gasPrices', 'ecAdd')).toEqual(BigInt(500)); + }); + + it('Parameter updates', () => { + const c = new Common({ chain: Chain.Mainnet }); + + expect(c.paramByHardfork('pow', 'minerReward', 'chainstart')).toEqual( + BigInt(5000000000000000000), + ); + + expect(c.paramByHardfork('pow', 'minerReward', 'byzantium')).toEqual( + BigInt(3000000000000000000), + ); + + expect(c.paramByHardfork('gasPrices', 'netSstoreNoopGas', 'constantinople')).toEqual( + BigInt(200), + ); + + expect(c.paramByHardfork('gasPrices', 'netSstoreNoopGas', 'petersburg')).toEqual(BigInt(0)); + }); + + it('Access by block number, paramByBlock()', () => { + const c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }); + expect(c.paramByBlock('pow', 'minerReward', 4370000)).toEqual(BigInt(3000000000000000000)); + expect(c.paramByBlock('pow', 'minerReward', 4369999)).toEqual(BigInt(5000000000000000000)); + + const td = BigInt('1196768507891266117779'); + expect(c.paramByBlock('pow', 'minerReward', 4370000, td)).toEqual( + BigInt(3000000000000000000), + ); + }); + + it('EIP param access, paramByEIP()', () => { + const c = new Common({ chain: Chain.Mainnet }); + + expect(c.paramByEIP('gasPrices', 'notexistingvalue', 2537)).toBeUndefined(); + + const UNSUPPORTED_EIP = 1000000; + expect(() => { + c.paramByEIP('gasPrices', 'Bls12381G1AddGas', UNSUPPORTED_EIP); + }).toThrow('not supported'); + + expect(() => { + c.paramByEIP('notExistingTopic', 'Bls12381G1AddGas', 2537); + }).toThrow('not defined'); + + expect(c.paramByEIP('gasPrices', 'Bls12381G1AddGas', 2537)).toEqual(BigInt(600)); + }); + + it('returns the right block delay for EIP3554', () => { + for (const fork of [Hardfork.MuirGlacier, Hardfork.Berlin]) { + const c = new Common({ chain: Chain.Mainnet, hardfork: fork }); + let delay = c.param('pow', 'difficultyBombDelay'); + expect(delay).toEqual(BigInt(9000000)); + c.setEIPs([3554]); + delay = c.param('pow', 'difficultyBombDelay'); + expect(delay).toEqual(BigInt(9500000)); + } + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/timestamp.test.ts b/packages/web3-eth-accounts/test/unit/common/timestamp.test.ts new file mode 100644 index 00000000000..6718119c349 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/timestamp.test.ts @@ -0,0 +1,144 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'web3-utils'; +import { Chain, Common, Hardfork } from '../../../src/common'; + +import * as timestampJson from '../../fixtures/common/shanghai-time.json'; + +describe('[Common]: Timestamp Hardfork logic', () => { + it('shanghai-time', () => { + const c = Common.fromGethGenesis(timestampJson, { + chain: 'withdrawals', + }); + expect(c.getHardforkByBlockNumber(1, undefined, 0)).toEqual(Hardfork.MergeForkIdTransition); + expect(c.getHardforkByBlockNumber(1, undefined, 1668699476)).toEqual(Hardfork.Shanghai); + expect(c.getHardforkByBlockNumber(1, undefined, 1668699576)).toEqual(Hardfork.Shanghai); + }); + + it('schedule sharding on shanghai-time', () => { + const config = { + ...timestampJson.config, + shardingForkTime: timestampJson.config.shanghaiTime, + }; + const modifiedJson = { ...timestampJson, config }; + const c = Common.fromGethGenesis(modifiedJson, { + chain: 'modified', + }); + expect(c.getHardforkByBlockNumber(1, undefined, 0)).toEqual(Hardfork.MergeForkIdTransition); + expect(c.nextHardforkBlockOrTimestamp(Hardfork.Shanghai)).toBeNull(); + }); + + it('schedule sharding post shanghai-time', () => { + const config = { + ...timestampJson.config, + shardingForkTime: timestampJson.config.shanghaiTime + 1000, + }; + const modifiedJson = { ...timestampJson, config }; + const c = Common.fromGethGenesis(modifiedJson, { + chain: 'modified', + }); + expect(c.getHardforkByBlockNumber(1, undefined, 0)).toEqual(Hardfork.MergeForkIdTransition); + // Should give the shanghai as sharding is schedule a bit post shanghai + expect(c.getHardforkByBlockNumber(1, undefined, 1668699476)).toEqual(Hardfork.Shanghai); + expect(c.getHardforkByBlockNumber(1, undefined, 1668699576)).toEqual(Hardfork.Shanghai); + }); + + it('forkHash', () => { + const mainnet = new Common({ chain: Chain.Mainnet }); + const hfs = mainnet.hardforks(); + const mergeIndex = hfs.findIndex(hf => hf.name === Hardfork.Merge); + const hardforks = hfs.slice(0, mergeIndex + 1).concat([ + // Add these hardforks as specified here: + // https://github.com/ethereum/EIPs/pull/6122/files + { + name: 'mergeForkIdTransition', + block: 18000000, + forkHash: '0x4fb8a872', + }, + { + name: 'shanghai', + // eslint-disable-next-line no-null/no-null + block: null, + timestamp: '1668000000', + forkHash: '0xc1fdf181', + }, + ]); + + const c = Common.custom({ hardforks }, { baseChain: Chain.Mainnet }); + const mainnetGenesisHash = hexToBytes( + 'd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', + ); + for (const hf of c.hardforks()) { + if (typeof hf.forkHash !== 'string') { + continue; + } + expect(c._calcForkHash(hf.name, mainnetGenesisHash)).toEqual(hf.forkHash); + } + + c.setHardfork(Hardfork.MergeForkIdTransition); + expect(c.nextHardforkBlockOrTimestamp()).toEqual(BigInt(1668000000)); + + c.setHardfork(Hardfork.Shanghai); + expect(c.forkHash()).toBe('0xc1fdf181'); + expect(c.hardforkForForkHash('0xc1fdf181')?.name).toEqual(Hardfork.Shanghai); + }); + + it('setForkHashes', () => { + const mainnet = new Common({ chain: Chain.Mainnet }); + const hfs = mainnet.hardforks(); + const mergeIndex = hfs.findIndex(hf => hf.name === Hardfork.Merge); + const hardforks = hfs.slice(0, mergeIndex + 1).concat([ + // Add these hardforks as specified here: + // https://github.com/ethereum/EIPs/pull/6122/files + { + name: 'mergeForkIdTransition', + block: 18000000, + }, + { + name: 'shanghai', + // eslint-disable-next-line no-null/no-null + block: null, + timestamp: '1668000000', + }, + ]); + + const c = Common.custom({ hardforks }, { baseChain: Chain.Mainnet }); + const mainnetGenesisHash = hexToBytes( + 'd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', + ); + + let noForkHashes = c.hardforks().reduce((acc, hf) => { + if (hf.forkHash === undefined) { + // eslint-disable-next-line no-param-reassign + acc += 1; + } + return acc; + }, 0); + expect(noForkHashes).toBe(2); + + c.setForkHashes(mainnetGenesisHash); + noForkHashes = c.hardforks().reduce((acc, hf) => { + if (hf.forkHash === undefined) { + // eslint-disable-next-line no-param-reassign + acc += 1; + } + return acc; + }, 0); + expect(noForkHashes).toBe(0); + expect(c.forkHash(Hardfork.Shanghai)).toBe('0xc1fdf181'); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/common/utils.test.ts b/packages/web3-eth-accounts/test/unit/common/utils.test.ts new file mode 100644 index 00000000000..ae1660fc591 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/common/utils.test.ts @@ -0,0 +1,173 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'web3-utils'; +import { Common } from '../../../src/common/common'; +import { Hardfork } from '../../../src/common'; +import { parseGethGenesis } from '../../../src/common/utils'; +import testnet from '../../fixtures/common/testnetValid.json'; +import invalidSpuriousDragon from '../../fixtures/common/invalid-spurious-dragon.json'; +import poa from '../../fixtures/common/poa.json'; +import postMerge from '../../fixtures/common/post-merge.json'; +import noExtraData from '../../fixtures/common/no-extra-data.json'; +import gethGenesisKiln from '../../fixtures/common/geth-genesis-kiln.json'; +import postMergeHardfork from '../../fixtures/common/post-merge-hardfork.json'; + +describe('[Utils/Parse]', () => { + const kilnForkHashes: any = { + chainstart: '0xbcadf543', + homestead: '0xbcadf543', + tangerineWhistle: '0xbcadf543', + spuriousDragon: '0xbcadf543', + byzantium: '0xbcadf543', + constantinople: '0xbcadf543', + petersburg: '0xbcadf543', + istanbul: '0xbcadf543', + berlin: '0xbcadf543', + london: '0xbcadf543', + mergeForkIdTransition: '0x013fd1b5', + merge: '0x013fd1b5', + }; + + it('should parse geth params file', () => { + const params = parseGethGenesis(testnet, 'rinkeby'); + expect(params.genesis.nonce).toBe('0x0000000000000042'); + }); + + it('should throw with invalid Spurious Dragon blocks', () => { + expect(() => { + parseGethGenesis(invalidSpuriousDragon, 'bad_params'); + }).toThrow(); + }); + + it('should import poa network params correctly', () => { + let params = parseGethGenesis(poa, 'poa'); + expect(params.genesis.nonce).toBe('0x0000000000000000'); + expect(params.consensus).toEqual({ + type: 'poa', + algorithm: 'clique', + clique: { period: 15, epoch: 30000 }, + }); + poa.nonce = '00'; + params = parseGethGenesis(poa, 'poa'); + expect(params.genesis.nonce).toBe('0x0000000000000000'); + expect(params.hardfork).toEqual(Hardfork.London); + }); + + it('should generate expected hash with london block zero and base fee per gas defined', () => { + const params = parseGethGenesis(postMerge, 'post-merge'); + expect(params.genesis.baseFeePerGas).toEqual(postMerge.baseFeePerGas); + }); + + it('should successfully parse genesis file with no extraData', () => { + const params = parseGethGenesis(noExtraData, 'noExtraData'); + expect(params.genesis.extraData).toBe('0x'); + expect(params.genesis.timestamp).toBe('0x10'); + }); + + it('should successfully parse kiln genesis and set forkhash', () => { + const common = Common.fromGethGenesis(gethGenesisKiln, { + chain: 'customChain', + genesisHash: hexToBytes( + '51c7fe41be669f69c45c33a56982cbde405313342d9e2b00d7c91a7b284dd4f8', + ), + mergeForkIdPostMerge: false, + }); + expect(common.hardforks().map(hf => hf.name)).toEqual([ + 'chainstart', + 'homestead', + 'tangerineWhistle', + 'spuriousDragon', + 'byzantium', + 'constantinople', + 'petersburg', + 'istanbul', + 'berlin', + 'london', + 'mergeForkIdTransition', + 'merge', + ]); + for (const hf of common.hardforks()) { + /* eslint-disable @typescript-eslint/no-use-before-define */ + expect(hf.forkHash).toEqual(kilnForkHashes[hf.name]); + } + + expect(common.hardfork()).toEqual(Hardfork.Merge); + + // Ok lets schedule shanghai at block 0, this should force merge to be scheduled at just after + // genesis if even mergeForkIdTransition is not confirmed to be post merge + // This will also check if the forks are being correctly sorted based on block + Object.assign(gethGenesisKiln.config, { shanghaiTime: Math.floor(Date.now() / 1000) }); + const common1 = Common.fromGethGenesis(gethGenesisKiln, { + chain: 'customChain', + }); + // merge hardfork is now scheduled just after shanghai even if mergeForkIdTransition is not confirmed + // to be post merge + expect(common1.hardforks().map(hf => hf.name)).toEqual([ + 'chainstart', + 'homestead', + 'tangerineWhistle', + 'spuriousDragon', + 'byzantium', + 'constantinople', + 'petersburg', + 'istanbul', + 'berlin', + 'london', + 'merge', + 'mergeForkIdTransition', + 'shanghai', + ]); + + expect(common1.hardfork()).toEqual(Hardfork.Shanghai); + }); + + it('should successfully parse genesis with hardfork scheduled post merge', async () => { + const common = Common.fromGethGenesis(postMergeHardfork, { + chain: 'customChain', + }); + expect(common.hardforks().map(hf => hf.name)).toEqual([ + 'chainstart', + 'homestead', + 'tangerineWhistle', + 'spuriousDragon', + 'byzantium', + 'constantinople', + 'petersburg', + 'istanbul', + 'muirGlacier', + 'berlin', + 'london', + 'merge', + 'shanghai', + ]); + + expect(common.getHardforkByBlockNumber(0)).toEqual(Hardfork.London); + expect(common.getHardforkByBlockNumber(1, BigInt(2))).toEqual(Hardfork.Merge); + // shanghai is at timestamp 8 + expect(common.getHardforkByBlockNumber(8)).toEqual(Hardfork.London); + expect(common.getHardforkByBlockNumber(8, BigInt(2))).toEqual(Hardfork.Merge); + expect(common.getHardforkByBlockNumber(8, undefined, 8)).toEqual(Hardfork.Shanghai); + // should be post merge at shanghai + expect(common.getHardforkByBlockNumber(8, BigInt(2), 8)).toEqual(Hardfork.Shanghai); + // if not post merge, then should error + expect(() => { + common.getHardforkByBlockNumber(8, BigInt(1), 8); + }).toThrow(); + + expect(common.hardfork()).toEqual(Hardfork.Shanghai); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/jest.config.js b/packages/web3-eth-accounts/test/unit/jest.config.js new file mode 100644 index 00000000000..a1352870672 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**/*.ts'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-eth-accounts-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-eth-accounts/test/unit/tx/base.test.ts b/packages/web3-eth-accounts/test/unit/tx/base.test.ts new file mode 100644 index 00000000000..236b0e2ded0 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/base.test.ts @@ -0,0 +1,368 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { bytesToUint8Array, hexToBytes, uint8ArrayEquals } from 'web3-utils'; +import { + AccessListEIP2930Transaction, + Capability, + FeeMarketEIP1559Transaction, + Transaction, +} from '../../../src'; +import { Chain, Common, Hardfork, toUint8Array, uint8ArrayToBigInt } from '../../../src/common'; +import { MAX_INTEGER, MAX_UINT64, SECP256K1_ORDER, secp256k1 } from '../../../src/tx/constants'; + +import type { BaseTransaction } from '../../../src/tx/baseTransaction'; +import eip1559Fixtures from '../../fixtures/json/eip1559txs.json'; +import eip2930Fixtures from '../../fixtures/json/eip2930txs.json'; + +import legacyFixtures from '../../fixtures/json/txs.json'; + +const privateToPublic = function (privateKey: Uint8Array): Uint8Array { + return secp256k1.getPublicKey(privateKey, false).slice(1); +}; +const common = new Common({ + chain: 5, + hardfork: Hardfork.London, +}); +// @ts-expect-error set private property +common._chainParams.chainId = 4; +describe('[BaseTransaction]', () => { + // EIP-2930 is not enabled in Common by default (2021-03-06) + // eslint-disable-next-line @typescript-eslint/no-shadow + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }); + + const legacyTxs: BaseTransaction[] = []; + for (const tx of legacyFixtures.slice(0, 4)) { + legacyTxs.push(Transaction.fromTxData(tx.data, { common })); + } + + const eip2930Txs: BaseTransaction[] = []; + for (const tx of eip2930Fixtures) { + eip2930Txs.push(AccessListEIP2930Transaction.fromTxData(tx.data, { common })); + } + + const eip1559Txs: BaseTransaction[] = []; + for (const tx of eip1559Fixtures) { + eip1559Txs.push(FeeMarketEIP1559Transaction.fromTxData(tx.data, { common })); + } + + const zero = new Uint8Array(0); + const txTypes = [ + { + class: Transaction, + name: 'Transaction', + type: 0, + values: Array(6).fill(zero), + txs: legacyTxs, + fixtures: legacyFixtures, + activeCapabilities: [], + notActiveCapabilities: [ + Capability.EIP1559FeeMarket, + Capability.EIP2718TypedTransaction, + Capability.EIP2930AccessLists, + 9999, + ], + }, + { + class: AccessListEIP2930Transaction, + name: 'AccessListEIP2930Transaction', + type: 1, + values: [new Uint8Array([1])].concat(Array(7).fill(zero)), + txs: eip2930Txs, + fixtures: eip2930Fixtures, + activeCapabilities: [Capability.EIP2718TypedTransaction, Capability.EIP2930AccessLists], + notActiveCapabilities: [Capability.EIP1559FeeMarket, 9999], + }, + { + class: FeeMarketEIP1559Transaction, + name: 'FeeMarketEIP1559Transaction', + type: 2, + values: [new Uint8Array([1])].concat(Array(8).fill(zero)), + txs: eip1559Txs, + fixtures: eip1559Fixtures, + activeCapabilities: [ + Capability.EIP1559FeeMarket, + Capability.EIP2718TypedTransaction, + Capability.EIP2930AccessLists, + ], + notActiveCapabilities: [9999], + }, + ]; + + it('Initialization', () => { + for (const txType of txTypes) { + let tx = txType.class.fromTxData({}, { common }); + expect(tx.common.hardfork()).toBe('london'); + expect(Object.isFrozen(tx)).toBe(true); + + const initCommon = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + }); + tx = txType.class.fromTxData({}, { common: initCommon }); + expect(tx.common.hardfork()).toBe('london'); + + initCommon.setHardfork(Hardfork.Byzantium); + expect(tx.common.hardfork()).toBe('london'); + + tx = txType.class.fromTxData({}, { common, freeze: false }); + expect(!Object.isFrozen(tx)).toBe(true); + + // Perform the same test as above, but now using a different construction method. This also implies that passing on the + // options object works as expected. + tx = txType.class.fromTxData({}, { common, freeze: false }); + const rlpData = tx.serialize(); + + tx = txType.class.fromSerializedTx(rlpData, { common }); + expect(tx.type).toEqual(txType.type); + + expect(Object.isFrozen(tx)).toBe(true); + + tx = txType.class.fromSerializedTx(rlpData, { common, freeze: false }); + expect(!Object.isFrozen(tx)).toBe(true); + + tx = txType.class.fromValuesArray(txType.values as any, { common }); + expect(Object.isFrozen(tx)).toBe(true); + + tx = txType.class.fromValuesArray(txType.values as any, { common, freeze: false }); + expect(!Object.isFrozen(tx)).toBe(true); + } + }); + + it('fromValuesArray()', () => { + let rlpData: any = legacyTxs[0].raw(); + rlpData[0] = toUint8Array('0x00'); + expect(() => { + Transaction.fromValuesArray(rlpData); + }).toThrow('nonce cannot have leading zeroes'); + rlpData[0] = toUint8Array('0x'); + rlpData[6] = toUint8Array('0x00'); + expect(() => { + Transaction.fromValuesArray(rlpData); + }).toThrow('v cannot have leading zeroes'); + rlpData = eip2930Txs[0].raw(); + rlpData[3] = toUint8Array('0x0'); + expect(() => { + AccessListEIP2930Transaction.fromValuesArray(rlpData); + }).toThrow('gasLimit cannot have leading zeroes'); + rlpData = eip1559Txs[0].raw(); + rlpData[2] = toUint8Array('0x0'); + expect(() => { + FeeMarketEIP1559Transaction.fromValuesArray(rlpData); + }).toThrow('maxPriorityFeePerGas cannot have leading zeroes'); + }); + + it('serialize()', () => { + for (const txType of txTypes) { + for (const tx of txType.txs) { + expect(txType.class.fromSerializedTx(tx.serialize(), { common })).toBeTruthy(); + expect(txType.class.fromSerializedTx(tx.serialize(), { common })).toBeTruthy(); + } + } + }); + + it('supports()', () => { + for (const txType of txTypes) { + for (const tx of txType.txs) { + for (const activeCapability of txType.activeCapabilities) { + expect(tx.supports(activeCapability)).toBe(true); + } + for (const notActiveCapability of txType.notActiveCapabilities) { + expect(tx.supports(notActiveCapability)).toBe(false); + } + } + } + }); + + it('raw()', () => { + for (const txType of txTypes) { + for (const tx of txType.txs) { + expect(txType.class.fromValuesArray(tx.raw() as any, { common })).toBeTruthy(); + } + } + }); + + it('verifySignature()', () => { + for (const txType of txTypes) { + for (const tx of txType.txs) { + expect(tx.verifySignature()).toBe(true); + } + } + }); + + it('verifySignature() -> invalid', () => { + for (const txType of txTypes) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + for (const txFixture of txType.fixtures.slice(0, 4)) { + // set `s` to a single zero + txFixture.data.s = '0x0'; + // @ts-expect-error set data + const tx = txType.class.fromTxData(txFixture.data, { common }); + expect(tx.verifySignature()).toBe(false); + expect(tx.validate(true)).toContain('Invalid Signature'); + expect(tx.validate()).toBe(false); + } + } + }); + + it('sign()', () => { + for (const txType of txTypes) { + for (const [i, tx] of txType.txs.entries()) { + const { privateKey } = txType.fixtures[i]; + if (privateKey !== undefined) { + // eslint-disable-next-line jest/no-conditional-expect + expect(tx.sign(hexToBytes(privateKey))).toBeTruthy(); + } + + expect(() => tx.sign(new Uint8Array(bytesToUint8Array('invalid')))).toThrow(); + } + } + }); + + it('isSigned() -> returns correct values', () => { + for (const txType of txTypes) { + const txs = [ + ...txType.txs, + // add unsigned variants + ...txType.txs.map(tx => + txType.class.fromTxData({ + ...tx, + v: undefined, + r: undefined, + s: undefined, + }), + ), + ]; + for (const tx of txs) { + expect(tx.isSigned()).toEqual( + tx.v !== undefined && tx.r !== undefined && tx.s !== undefined, + ); + } + } + }); + + it('getSenderAddress()', () => { + for (const txType of txTypes) { + for (const [i, tx] of txType.txs.entries()) { + const { privateKey, sendersAddress } = txType.fixtures[i]; + if (privateKey === undefined) { + continue; + } + const signedTx = tx.sign(hexToBytes(privateKey)); + expect(signedTx.getSenderAddress().toString()).toBe(`0x${sendersAddress}`); + } + } + }); + + it('getSenderPublicKey()', () => { + for (const txType of txTypes) { + for (const [i, tx] of txType.txs.entries()) { + const { privateKey } = txType.fixtures[i]; + if (privateKey === undefined) { + continue; + } + const signedTx = tx.sign(hexToBytes(privateKey)); + const txPubKey = signedTx.getSenderPublicKey(); + const pubKeyFromPriv = privateToPublic(hexToBytes(privateKey)); + expect(uint8ArrayEquals(txPubKey, pubKeyFromPriv)).toBe(true); + } + } + }); + + it('getSenderPublicKey() -> should throw if s-value is greater than secp256k1n/2', () => { + // EIP-2: All transaction signatures whose s-value is greater than secp256k1n/2 are considered invalid. + // Reasoning: https://ethereum.stackexchange.com/a/55728 + for (const txType of txTypes) { + for (const [i, tx] of txType.txs.entries()) { + const { privateKey } = txType.fixtures[i]; + if (privateKey === undefined) { + continue; + } + let signedTx = tx.sign(hexToBytes(privateKey)); + signedTx = JSON.parse(JSON.stringify(signedTx)); // deep clone + (signedTx as any).s = SECP256K1_ORDER + BigInt(1); + expect(() => { + signedTx.getSenderPublicKey(); + }).toThrow(); + } + } + }); + + it('verifySignature()->valid', () => { + for (const txType of txTypes) { + for (const [i, tx] of txType.txs.entries()) { + const { privateKey } = txType.fixtures[i]; + if (privateKey === undefined) { + continue; + } + const signedTx = tx.sign(hexToBytes(privateKey)); + expect(signedTx.verifySignature()).toBeTruthy(); + } + } + }); + + it('initialization with defaults', () => { + const uInt8ArrayZero = toUint8Array('0x'); + const tx = Transaction.fromTxData({ + nonce: '', + gasLimit: '', + gasPrice: '', + to: '', + value: '', + data: '', + v: '', + r: '', + s: '', + }); + expect(tx.v).toBeUndefined(); + expect(tx.r).toBeUndefined(); + expect(tx.s).toBeUndefined(); + expect(tx.to).toBeUndefined(); + expect(tx.value).toBe(uint8ArrayToBigInt(uInt8ArrayZero)); + expect(tx.data).toEqual(uInt8ArrayZero); + expect(tx.gasPrice).toBe(uint8ArrayToBigInt(uInt8ArrayZero)); + expect(tx.gasLimit).toBe(uint8ArrayToBigInt(uInt8ArrayZero)); + expect(tx.nonce).toBe(uint8ArrayToBigInt(uInt8ArrayZero)); + }); + + it('_validateCannotExceedMaxInteger()', () => { + const tx = FeeMarketEIP1559Transaction.fromTxData(eip1559Txs[0]); + expect(() => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + (tx as any)._validateCannotExceedMaxInteger({ a: MAX_INTEGER }, 256, true); + }).toThrow('equal or exceed MAX_INTEGER'); + + expect(() => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + (tx as any)._validateCannotExceedMaxInteger({ a: MAX_INTEGER + BigInt(1) }, 256, false); + }).toThrow('exceed MAX_INTEGER'); + + expect(() => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + (tx as any)._validateCannotExceedMaxInteger({ a: BigInt(0) }, 100, false); + }).toThrow('unimplemented bits value'); + + expect(() => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + (tx as any)._validateCannotExceedMaxInteger({ a: MAX_UINT64 + BigInt(1) }, 64, false); + }).toThrow('2^64'); + + expect(() => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + (tx as any)._validateCannotExceedMaxInteger({ a: MAX_UINT64 }, 64, true); + }).toThrow('2^64'); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/eip1559.test.ts b/packages/web3-eth-accounts/test/unit/tx/eip1559.test.ts new file mode 100644 index 00000000000..d9a0d8acb92 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/eip1559.test.ts @@ -0,0 +1,244 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { RLP } from '@ethereumjs/rlp'; +import { hexToBytes } from 'web3-utils'; +import { Chain, Common, Hardfork } from '../../../src/common'; + +import { FeeMarketEIP1559Transaction } from '../../../src'; + +import testdata from '../../fixtures/json/eip1559.json'; + +const common = new Common({ + chain: 5, + hardfork: Hardfork.London, +}); +// @ts-expect-error set private property +common._chainParams.chainId = 4; +const TWO_POW256 = BigInt('0x10000000000000000000000000000000000000000000000000000000000000000'); + +const validAddress = hexToBytes('01'.repeat(20)); +const validSlot = hexToBytes('01'.repeat(32)); +const chainId = BigInt(4); + +describe('[FeeMarketEIP1559Transaction]', () => { + it('cannot input decimal or negative values %s', () => { + const values = [ + 'maxFeePerGas', + 'maxPriorityFeePerGas', + 'chainId', + 'nonce', + 'gasLimit', + 'value', + 'v', + 'r', + 's', + ]; + const cases = [ + 10.1, + '10.1', + '0xaa.1', + -10.1, + -1, + BigInt(-10), + '-100', + '-10.1', + '-0xaa', + Infinity, + -Infinity, + NaN, + {}, + true, + false, + // eslint-disable-next-line @typescript-eslint/no-empty-function + () => {}, + Number.MAX_SAFE_INTEGER + 1, + ]; + for (const value of values) { + const txData: any = {}; + for (const testCase of cases) { + if ( + value === 'chainId' && + ((typeof testCase === 'number' && Number.isNaN(testCase)) || testCase === false) + ) { + continue; + } + txData[value] = testCase; + expect(() => { + FeeMarketEIP1559Transaction.fromTxData(txData); + }).toThrow(); + } + } + }); + + it('getUpfrontCost()', () => { + const tx = FeeMarketEIP1559Transaction.fromTxData( + { + maxFeePerGas: 10, + maxPriorityFeePerGas: 8, + gasLimit: 100, + value: 6, + }, + { common }, + ); + expect(tx.getUpfrontCost()).toEqual(BigInt(806)); + let baseFee = BigInt(0); + expect(tx.getUpfrontCost(baseFee)).toEqual(BigInt(806)); + baseFee = BigInt(4); + expect(tx.getUpfrontCost(baseFee)).toEqual(BigInt(1006)); + }); + + it('sign()', () => { + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < testdata.length; index += 1) { + const data = testdata[index]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + const pkey = hexToBytes(data.privateKey.slice(2)); + const txn = FeeMarketEIP1559Transaction.fromTxData(data, { common }); + const signed = txn.sign(pkey); + const rlpSerialized = RLP.encode(Uint8Array.from(signed.serialize())); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + expect(rlpSerialized).toEqual(hexToBytes(data.signedTransactionRLP.slice(2))); + } + }); + + it('hash()', () => { + const data = testdata[0]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + const pkey = hexToBytes(data.privateKey.slice(2)); + let txn = FeeMarketEIP1559Transaction.fromTxData(data, { common }); + let signed = txn.sign(pkey); + const expectedHash = hexToBytes( + '0x2e564c87eb4b40e7f469b2eec5aa5d18b0b46a24e8bf0919439cfb0e8fcae446', + ); + expect(signed.hash()).toEqual(expectedHash); + txn = FeeMarketEIP1559Transaction.fromTxData(data, { common, freeze: false }); + signed = txn.sign(pkey); + expect(signed.hash()).toEqual(expectedHash); + }); + + it('freeze property propagates from unsigned tx to signed tx', () => { + const data = testdata[0]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + const pkey = hexToBytes(data.privateKey.slice(2)); + const txn = FeeMarketEIP1559Transaction.fromTxData(data, { common, freeze: false }); + expect(Object.isFrozen(txn)).toBe(false); + const signedTxn = txn.sign(pkey); + expect(Object.isFrozen(signedTxn)).toBe(false); + }); + + it('common propagates from the common of tx, not the common in TxOptions', () => { + const data = testdata[0]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + const pkey = hexToBytes(data.privateKey.slice(2)); + const txn = FeeMarketEIP1559Transaction.fromTxData(data, { common, freeze: false }); + const newCommon = new Common({ + chain: Chain.Goerli, + hardfork: Hardfork.London, + eips: [2537], + }); + expect(Object.isFrozen(newCommon)).not.toEqual(common); + Object.defineProperty(txn, 'common', { + get() { + return newCommon; + }, + }); + const signedTxn = txn.sign(pkey); + expect(signedTxn.common.eips()).toContain(2537); + }); + + it('unsigned tx -> getMessageToSign()', () => { + const unsignedTx = FeeMarketEIP1559Transaction.fromTxData( + { + data: hexToBytes('010200'), + to: validAddress, + accessList: [[validAddress, [validSlot]]], + chainId, + }, + { common }, + ); + const expectedHash = hexToBytes( + '0xfa81814f7dd57bad435657a05eabdba2815f41e3f15ddd6139027e7db56b0dea', + ); + expect(unsignedTx.getMessageToSign(true)).toEqual(expectedHash); + + const expectedSerialization = hexToBytes( + '0x02f85904808080809401010101010101010101010101010101010101018083010200f838f7940101010101010101010101010101010101010101e1a00101010101010101010101010101010101010101010101010101010101010101', + ); + expect(unsignedTx.getMessageToSign(false)).toEqual(expectedSerialization); + }); + + it('toJSON()', () => { + const data = testdata[0]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + const pkey = hexToBytes(data.privateKey.slice(2)); + const txn = FeeMarketEIP1559Transaction.fromTxData(data, { common }); + const signed = txn.sign(pkey); + + const json = signed.toJSON(); + const expectedJSON = { + chainId: '0x4', + nonce: '0x333', + maxPriorityFeePerGas: '0x1284d', + maxFeePerGas: '0x1d97c', + gasLimit: '0x8ae0', + to: '0x000000000000000000000000000000000000aaaa', + value: '0x2933bc9', + data: '0x', + accessList: [], + v: '0x0', + r: '0xf924cb68412c8f1cfd74d9b581c71eeaf94fff6abdde3e5b02ca6b2931dcf47', + s: '0x7dd1c50027c3e31f8b565e25ce68a5072110f61fce5eee81b195dd51273c2f83', + }; + expect(json).toEqual(expectedJSON); + }); + + it('Fee validation', () => { + expect(() => { + FeeMarketEIP1559Transaction.fromTxData( + { + maxFeePerGas: TWO_POW256 - BigInt(1), + maxPriorityFeePerGas: 100, + gasLimit: 1, + value: 6, + }, + { common }, + ); + }).not.toThrow(); + expect(() => { + FeeMarketEIP1559Transaction.fromTxData( + { + maxFeePerGas: TWO_POW256 - BigInt(1), + maxPriorityFeePerGas: 100, + gasLimit: 100, + value: 6, + }, + { common }, + ); + }).toThrow(); + expect(() => { + FeeMarketEIP1559Transaction.fromTxData( + { + maxFeePerGas: 1, + maxPriorityFeePerGas: 2, + gasLimit: 100, + value: 6, + }, + { common }, + ); + }).toThrow(); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/eip3860.test.ts b/packages/web3-eth-accounts/test/unit/tx/eip3860.test.ts new file mode 100644 index 00000000000..94408d9a71c --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/eip3860.test.ts @@ -0,0 +1,92 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Chain, Common, Hardfork } from '../../../src/common'; +import { Address } from '../../../src/tx/address'; +import { TransactionFactory } from '../../../src'; + +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Merge, + eips: [3860], +}); + +const maxInitCodeSize = common.param('vm', 'maxInitCodeSize'); +const txTypes = [0, 1, 2]; +const addressZero = Address.zero(); + +describe('[EIP3860 tests]', () => { + it('Should instantiate create txs with MAX_INITCODE_SIZE', () => { + const data = new Uint8Array(Number(maxInitCodeSize)); + for (const txType of txTypes) { + expect(TransactionFactory.fromTxData({ data, type: txType }, { common })).toBeTruthy(); + } + }); + + it('Should instantiate txs with MAX_INITCODE_SIZE data', () => { + const data = new Uint8Array(Number(maxInitCodeSize)); + for (const txType of txTypes) { + expect( + TransactionFactory.fromTxData({ data, type: txType, to: addressZero }, { common }), + ).toBeTruthy(); + } + }); + + it('Should not instantiate create txs with MAX_INITCODE_SIZE+1 data', () => { + const data = new Uint8Array(Number(maxInitCodeSize) + 1); + for (const txType of txTypes) { + expect(() => + TransactionFactory.fromTxData({ data, type: txType }, { common }), + ).toThrow(); + } + }); + + it('Should instantiate txs with MAX_INITCODE_SIZE+1 data', () => { + const data = new Uint8Array(Number(maxInitCodeSize) + 1); + for (const txType of txTypes) { + expect( + TransactionFactory.fromTxData({ data, type: txType, to: addressZero }, { common }), + ).toBeTruthy(); + } + }); + + it('Should allow txs with MAX_INITCODE_SIZE+1 data if allowUnlimitedInitCodeSize is active', () => { + const data = new Uint8Array(Number(maxInitCodeSize) + 1); + for (const txType of txTypes) { + expect( + TransactionFactory.fromTxData( + { data, type: txType }, + { common, allowUnlimitedInitCodeSize: true }, + ), + ).toBeTruthy(); + } + }); + + it('Should charge initcode analysis gas is allowUnlimitedInitCodeSize is active', () => { + const data = new Uint8Array(Number(maxInitCodeSize)); + for (const txType of txTypes) { + const eip3860ActiveTx = TransactionFactory.fromTxData( + { data, type: txType }, + { common, allowUnlimitedInitCodeSize: true }, + ); + const eip3860DeactivedTx = TransactionFactory.fromTxData( + { data, type: txType }, + { common, allowUnlimitedInitCodeSize: false }, + ); + expect(eip3860ActiveTx.getDataFee() === eip3860DeactivedTx.getDataFee()).toBeTruthy(); + } + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/inputValue.test.ts b/packages/web3-eth-accounts/test/unit/tx/inputValue.test.ts new file mode 100644 index 00000000000..e39ba839775 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/inputValue.test.ts @@ -0,0 +1,289 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; +import { Chain, Common, Hardfork, toUint8Array } from '../../../src/common'; +import { Address } from '../../../src/tx/address'; + +import { + AccessListEIP2930Transaction, + FeeMarketEIP1559Transaction, + Transaction, + TransactionFactory, +} from '../../../src'; + +import type { + AccessListEIP2930ValuesArray, + FeeMarketEIP1559ValuesArray, + TxValuesArray, +} from '../../../src'; +import type { BigIntLike, PrefixedHexString } from '../../../src/common/types'; + +type AddressLike = Address | Uint8Array | PrefixedHexString; +// @returns: Array with subtypes of the AddressLike type for a given address +function generateAddressLikeValues(address: string): AddressLike[] { + return [address, toUint8Array(address), new Address(toUint8Array(address))]; +} + +// @returns: Array with subtypes of the BigIntLike type for a given number +function generateBigIntLikeValues(value: number): BigIntLike[] { + return [value, BigInt(value), `0x${value.toString(16)}`, toUint8Array(value)]; +} + +// @returns: Array with subtypes of the BufferLike type for a given string +function generateBufferLikeValues(value: string): Bytes[] { + return [value, toUint8Array(value)]; +} + +interface GenerateCombinationsArgs { + options: { [x: string]: any }; + optionIndex?: number; + results?: { [x: string]: any }[]; + current?: { [x: string]: any }; +} + +function generateCombinations({ + options, + optionIndex = 0, + results = [], + current = {}, +}: GenerateCombinationsArgs) { + const allKeys = Object.keys(options); + const optionKey = allKeys[optionIndex]; + const values = options[optionKey]; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < values.length; i += 1) { + // eslint-disable-next-line no-param-reassign + current[optionKey] = values[i]; + + if (optionIndex + 1 < allKeys.length) { + generateCombinations({ options, optionIndex: optionIndex + 1, results, current }); + } else { + // Clone the object + const res = { ...current }; + results.push(res); + } + } + + return results; +} + +// Deterministic pseudorandom number generator +function mulberry32(seed: number) { + // eslint-disable-next-line no-param-reassign, no-multi-assign + let t = (seed += 0x6d2b79f5); + // eslint-disable-next-line no-bitwise + t = Math.imul(t ^ (t >>> 15), t | 1); + // eslint-disable-next-line no-bitwise + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + // eslint-disable-next-line no-bitwise + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; +} + +function getRandomSubarray(array: TArrayItem[], size: number) { + const shuffled = array.slice(0); + let seed = 1559; + let index: number; + let { length } = array; + let temp: TArrayItem; + while (length > 0) { + index = Math.floor((length + 1) * mulberry32(seed)); + temp = shuffled[index]; + shuffled[index] = shuffled[length]; + shuffled[length] = temp; + seed += 1; + length -= 1; + } + return shuffled.slice(0, size); +} + +const baseTxValues = { + data: generateBufferLikeValues('0x65'), + gasLimit: generateBigIntLikeValues(100000), + nonce: generateBigIntLikeValues(0), + to: generateAddressLikeValues('0x0000000000000000000000000000000000000000'), + r: generateBigIntLikeValues(100), + s: generateBigIntLikeValues(100), + value: generateBigIntLikeValues(10), +}; + +const legacyTxValues = { + gasPrice: generateBigIntLikeValues(100), +}; + +const accessListEip2930TxValues = { + chainId: generateBigIntLikeValues(4), +}; + +const eip1559TxValues = { + maxFeePerGas: generateBigIntLikeValues(100), + maxPriorityFeePerGas: generateBigIntLikeValues(50), +}; + +describe('[Transaction Input Values]', () => { + it('Legacy Transaction Values', () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Homestead }); + const options = { ...baseTxValues, ...legacyTxValues, type: '0' }; + const legacyTxData = generateCombinations({ + options, + }); + const randomSample = getRandomSubarray(legacyTxData, 100); + for (const txData of randomSample) { + const tx = Transaction.fromTxData(txData, { common }); + expect(() => tx.hash()).toThrow(); + } + }); + + it('EIP-1559 Transaction Values', () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }); + const options = { + ...baseTxValues, + ...accessListEip2930TxValues, + ...eip1559TxValues, + type: '2', + }; + const eip1559TxData = generateCombinations({ + options, + }); + const randomSample = getRandomSubarray(eip1559TxData, 100); + + for (const txData of randomSample) { + const tx = Transaction.fromTxData(txData, { common }); + expect(() => tx.hash()).toThrow(); + } + }); +}); + +test('[Invalid Array Input values]', () => { + const txTypes = [0x0, 0x1, 0x2]; + for (const signed of [false, true]) { + for (const txType of txTypes) { + let tx = TransactionFactory.fromTxData({ type: txType }); + if (signed) { + tx = tx.sign(hexToBytes('42'.repeat(32))); + } + const rawValues = tx.raw(); + for (let x = 0; x < rawValues.length; x += 1) { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + rawValues[x] = [1, 2, 3]; + // eslint-disable-next-line default-case + switch (txType) { + case 0: + // eslint-disable-next-line jest/no-conditional-expect + expect(() => + Transaction.fromValuesArray(rawValues as TxValuesArray), + ).toThrow(); + break; + case 1: + // eslint-disable-next-line jest/no-conditional-expect + expect(() => + AccessListEIP2930Transaction.fromValuesArray( + rawValues as AccessListEIP2930ValuesArray, + ), + ).toThrow(); + break; + case 2: + // eslint-disable-next-line jest/no-conditional-expect + expect(() => + FeeMarketEIP1559Transaction.fromValuesArray( + rawValues as FeeMarketEIP1559ValuesArray, + ), + ).toThrow(); + break; + } + } + } + } +}); + +test('[Invalid Access Lists]', () => { + const txTypes = [0x1, 0x2]; + const invalidAccessLists = [ + [[]], // does not have an address and does not have slots + [[[], []]], // the address is an array + [['0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae']], // there is no storage slot array + [ + [ + '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + ['0x0000000000000000000000000000000000000000000000000000000000000003', []], + ], + ], // one of the slots is an array + [ + [ + '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + ['0x0000000000000000000000000000000000000000000000000000000000000003'], + '0xab', + ], + ], // extra field + [ + '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + ['0x0000000000000000000000000000000000000000000000000000000000000003'], + ], // account/slot needs to be encoded in a deeper array layer + ]; + for (const signed of [false, true]) { + for (const txType of txTypes) { + for (const invalidAccessListItem of invalidAccessLists) { + let tx: any; + try { + tx = TransactionFactory.fromTxData({ + type: txType, + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + accessList: invalidAccessListItem, + }); + if (signed) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + tx = tx.sign(hexToBytes('42'.repeat(32))); + } + } catch (e: any) { + tx = TransactionFactory.fromTxData({ type: txType }); + if (signed) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + tx = tx.sign(hexToBytes('42'.repeat(32))); + } + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + const rawValues = tx!.raw(); + + if (txType === 1 && rawValues[7].length === 0) { + rawValues[7] = invalidAccessListItem; + } else if (txType === 2 && rawValues[8].length === 0) { + rawValues[8] = invalidAccessListItem; + } + + // eslint-disable-next-line default-case + switch (txType) { + case 1: + // eslint-disable-next-line jest/no-conditional-expect + expect(() => + AccessListEIP2930Transaction.fromValuesArray( + rawValues as AccessListEIP2930ValuesArray, + ), + ).toThrow(); + break; + case 2: + // eslint-disable-next-line jest/no-conditional-expect + expect(() => + FeeMarketEIP1559Transaction.fromValuesArray( + rawValues as FeeMarketEIP1559ValuesArray, + ), + ).toThrow(); + break; + } + } + } + } +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/legacy.test.ts b/packages/web3-eth-accounts/test/unit/tx/legacy.test.ts new file mode 100644 index 00000000000..141c421e489 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/legacy.test.ts @@ -0,0 +1,472 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { RLP } from '@ethereumjs/rlp'; +import { bytesToHex, hexToBytes, uint8ArrayEquals } from 'web3-utils'; +import { + Chain, + Common, + Hardfork, + intToUint8Array, + toUint8Array, + uint8ArrayToBigInt, + unpadUint8Array, +} from '../../../src/common'; + +import { Transaction } from '../../../src'; +import type { TxData } from '../../../src'; +import txFixturesEip155 from '../../fixtures/json/ttTransactionTestEip155VitaliksTests.json'; +import txFixtures from '../../fixtures/json/txs.json'; + +describe('[Transaction]', () => { + const transactions: Transaction[] = []; + + it('cannot input decimal or negative values', () => { + const values = ['gasPrice', 'gasLimit', 'nonce', 'value', 'v', 'r', 's']; + const cases = [ + 10.1, + '10.1', + '0xaa.1', + -10.1, + -1, + BigInt(-10), + '-100', + '-10.1', + '-0xaa', + Infinity, + -Infinity, + NaN, + {}, + true, + false, + // eslint-disable-next-line @typescript-eslint/no-empty-function + () => {}, + Number.MAX_SAFE_INTEGER + 1, + ]; + for (const value of values) { + const txData: any = {}; + for (const testCase of cases) { + txData[value] = testCase; + expect(() => { + Transaction.fromTxData(txData); + }).toThrow(); + } + } + }); + + it('Initialization', () => { + const nonEIP2930Common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }); + expect(Transaction.fromTxData({}, { common: nonEIP2930Common })).toBeTruthy(); + + const txData = txFixtures[3].raw.map(toUint8Array); + txData[6] = intToUint8Array(45); // v with 0-parity and chain ID 5 + let tx = Transaction.fromValuesArray(txData); + expect(tx.common.chainId() === BigInt(5)).toBe(true); + + txData[6] = intToUint8Array(46); // v with 1-parity and chain ID 5 + tx = Transaction.fromValuesArray(txData); + expect(tx.common.chainId() === BigInt(5)).toBe(true); + + txData[6] = intToUint8Array(2033); // v with 0-parity and chain ID 999 + tx = Transaction.fromValuesArray(txData); + expect(tx.common.chainId()).toEqual(BigInt(999)); + + txData[6] = intToUint8Array(2034); // v with 1-parity and chain ID 999 + tx = Transaction.fromValuesArray(txData); + expect(tx.common.chainId()).toEqual(BigInt(999)); + }); + + it('Initialization -> decode with fromValuesArray()', () => { + for (const tx of txFixtures.slice(0, 4)) { + const txData = tx.raw.map(toUint8Array); + const pt = Transaction.fromValuesArray(txData); + + expect(bytesToHex(unpadUint8Array(toUint8Array(pt.nonce)))).toEqual(tx.raw[0]); + expect(bytesToHex(toUint8Array(pt.gasPrice))).toEqual(tx.raw[1]); + expect(bytesToHex(toUint8Array(pt.gasLimit))).toEqual(tx.raw[2]); + expect(pt.to?.toString()).toEqual(tx.raw[3]); + expect(bytesToHex(unpadUint8Array(toUint8Array(pt.value)))).toEqual(tx.raw[4]); + expect(bytesToHex(pt.data)).toEqual(tx.raw[5]); + expect(bytesToHex(toUint8Array(pt.v))).toEqual(tx.raw[6]); + expect(bytesToHex(toUint8Array(pt.r))).toEqual(tx.raw[7]); + expect(bytesToHex(toUint8Array(pt.s))).toEqual(tx.raw[8]); + + transactions.push(pt); + } + }); + + it('Initialization -> should accept lesser r values', () => { + const tx = Transaction.fromTxData({ r: uint8ArrayToBigInt(toUint8Array('0x0005')) }); + expect(tx.r!.toString(16)).toBe('5'); + }); + + it('Initialization -> throws when creating a transaction with incompatible chainid and v value', () => { + let common = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Petersburg }); + let tx = Transaction.fromTxData({}, { common }); + expect(tx.common.chainId()).toEqual(BigInt(5)); + const privKey = hexToBytes(txFixtures[0].privateKey); + tx = tx.sign(privKey); + const serialized = tx.serialize(); + common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Petersburg }); + expect(() => Transaction.fromSerializedTx(serialized, { common })).toThrow(); + }); + + it('Initialization -> throws if v is set to an EIP155-encoded value incompatible with the chain id', () => { + expect(() => { + const common = new Common({ chain: 42, hardfork: Hardfork.Petersburg }); + Transaction.fromTxData({ v: BigInt(1) }, { common }); + }).toThrow(); + }); + + it('validate() -> should validate with string option', () => { + for (const tx of transactions) { + expect(typeof tx.validate(true)[0]).toBe('string'); + } + }); + + it('getBaseFee() -> should return base fee', () => { + const tx = Transaction.fromTxData({}); + expect(tx.getBaseFee()).toEqual(BigInt(53000)); + }); + + it('getDataFee() -> should return data fee', () => { + let tx = Transaction.fromTxData({}); + expect(tx.getDataFee()).toEqual(BigInt(0)); + + tx = Transaction.fromValuesArray(txFixtures[3].raw.map(toUint8Array)); + expect(tx.getDataFee()).toEqual(BigInt(1716)); + + tx = Transaction.fromValuesArray(txFixtures[3].raw.map(toUint8Array), { freeze: false }); + expect(tx.getDataFee()).toEqual(BigInt(1716)); + }); + + it('getDataFee() -> should return correct data fee for istanbul', () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }); + let tx = Transaction.fromTxData({}, { common }); + expect(tx.getDataFee()).toEqual(BigInt(0)); + + tx = Transaction.fromValuesArray(txFixtures[3].raw.map(toUint8Array), { + common, + }); + expect(tx.getDataFee()).toEqual(BigInt(1716)); + }); + + it('getDataFee() -> should invalidate cached value on hardfork change', () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }); + const tx = Transaction.fromValuesArray(txFixtures[0].raw.map(toUint8Array), { + common, + }); + expect(tx.getDataFee()).toEqual(BigInt(656)); + tx.common.setHardfork(Hardfork.Istanbul); + expect(tx.getDataFee()).toEqual(BigInt(240)); + }); + + it('getUpfrontCost() -> should return upfront cost', () => { + const tx = Transaction.fromTxData({ + gasPrice: 1000, + gasLimit: 10000000, + value: 42, + }); + expect(tx.getUpfrontCost()).toEqual(BigInt(10000000042)); + }); + + it('serialize()', () => { + for (const [i, tx] of transactions.entries()) { + const s1 = tx.serialize(); + const s2 = RLP.encode(txFixtures[i].raw); + expect(uint8ArrayEquals(s1, s2)).toBe(true); + } + }); + + it('serialize() -> should round trip decode a tx', () => { + const tx = Transaction.fromTxData({ value: 5000 }); + const s1 = tx.serialize(); + + const s1Rlp = toUint8Array(bytesToHex(s1)); + const tx2 = Transaction.fromSerializedTx(s1Rlp); + const s2 = tx2.serialize(); + + expect(uint8ArrayEquals(s1, s2)).toBe(true); + }); + + it('hash() / getMessageToSign(true) / getMessageToSign(false)', () => { + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.TangerineWhistle, + }); + + let tx = Transaction.fromValuesArray(txFixtures[3].raw.slice(0, 6).map(toUint8Array), { + common, + }); + expect(() => { + tx.hash(); + }).toThrow(); + tx = Transaction.fromValuesArray(txFixtures[3].raw.map(toUint8Array), { + common, + }); + expect(tx.hash()).toEqual( + hexToBytes('0x375a8983c9fc56d7cfd118254a80a8d7403d590a6c9e105532b67aca1efb97aa'), + ); + expect(tx.getMessageToSign()).toEqual( + hexToBytes('0x61e1ec33764304dddb55348e7883d4437426f44ab3ef65e6da1e025734c03ff0'), + ); + expect(tx.getMessageToSign(false)).toHaveLength(6); + expect(tx.hash()).toEqual( + hexToBytes('0x375a8983c9fc56d7cfd118254a80a8d7403d590a6c9e105532b67aca1efb97aa'), + ); + }); + + it('hash() -> with defined chainId', () => { + const tx = Transaction.fromValuesArray(txFixtures[4].raw.map(toUint8Array)); + expect(bytesToHex(tx.hash())).toBe( + '0x0f09dc98ea85b7872f4409131a790b91e7540953992886fc268b7ba5c96820e4', + ); + expect(bytesToHex(tx.getMessageToSign())).toBe( + '0xf97c73fdca079da7652dbc61a46cd5aeef804008e057be3e712c43eac389aaf0', + ); + }); + + it("getMessageToSign(), getSenderPublicKey() (implicit call) -> verify EIP155 signature based on Vitalik's tests", () => { + for (const tx of txFixturesEip155) { + const pt = Transaction.fromSerializedTx(toUint8Array(tx.rlp)); + expect(bytesToHex(pt.getMessageToSign())).toEqual(tx.hash); + expect(bytesToHex(pt.serialize())).toEqual(tx.rlp); + expect(pt.getSenderAddress().toString()).toBe(`0x${tx.sender}`); + } + }); + + it('getMessageToSign(), sign(), getSenderPublicKey() (implicit call) -> verify EIP155 signature before and after signing', () => { + // Inputs and expected results for this test are taken directly from the example in https://eips.ethereum.org/EIPS/eip-155 + const txRaw = [ + '0x09', + '0x4a817c800', + '0x5208', + '0x3535353535353535353535353535353535353535', + '0x0de0b6b3a7640000', + '0x', + ]; + const privateKey = hexToBytes( + '4646464646464646464646464646464646464646464646464646464646464646', + ); + const pt = Transaction.fromValuesArray(txRaw.map(toUint8Array)); + + // Note that Vitalik's example has a very similar value denoted "signing data". + // It's not the output of `serialize()`, but the pre-image of the hash returned by `tx.hash(false)`. + // We don't have a getter for such a value in Transaction. + expect(bytesToHex(pt.serialize())).toBe( + '0xec098504a817c800825208943535353535353535353535353535353535353535880de0b6b3a764000080808080', + ); + const signedTx = pt.sign(privateKey); + expect(bytesToHex(signedTx.getMessageToSign())).toBe( + '0xdaf5a779ae972f972197303d7b574746c7ef83eadac0f2791ad23db92e4c8e53', + ); + expect(bytesToHex(signedTx.serialize())).toBe( + '0xf86c098504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a028ef61340bd939bc2195fe537567866003e1a15d3c71ff63e1590620aa636276a067cbe9d8997f761aecb703304b3800ccf555c9f3dc64214b297fb1966a3b6d83', + ); + }); + + it('sign(), getSenderPublicKey() (implicit call) -> EIP155 hashing when singing', () => { + const common = new Common({ chain: 1, hardfork: Hardfork.Petersburg }); + for (const txData of txFixtures.slice(0, 3)) { + const tx = Transaction.fromValuesArray(txData.raw.slice(0, 6).map(toUint8Array), { + common, + }); + + const privKey = hexToBytes(txData.privateKey); + const txSigned = tx.sign(privKey); + + expect(txSigned.getSenderAddress().toString()).toBe(`0x${txData.sendersAddress}`); + } + }); + + it('sign(), serialize(): serialize correctly after being signed with EIP155 Signature for tx created on ropsten', () => { + const txRaw = [ + '0x1', + '0x02540be400', + '0x5208', + '0xd7250824390ec5c8b71d856b5de895e271170d9d', + '0x0de0b6b3a7640000', + '0x', + ]; + const privateKey = hexToBytes( + 'DE3128752F183E8930D7F00A2AAA302DCB5E700B2CBA2D8CA5795660F07DEFD5', + ); + const common = new Common({ chain: 1 }); + const tx = Transaction.fromValuesArray(txRaw.map(toUint8Array), { common }); + const signedTx = tx.sign(privateKey); + expect(bytesToHex(signedTx.serialize())).toBe( + '0xf86c018502540be40082520894d7250824390ec5c8b71d856b5de895e271170d9d880de0b6b3a76400008026a05e5c85a426b11e1ba5d9b567e904818a33975962942f538d247cd7391f5fb27aa00c8ec23ca4a3cdc2515916e4adc89676ce124fd7d0ddbb3ddd37c441dd584c21', + ); + }); + + it('sign(), verifySignature(): should ignore any previous signature when decided if EIP155 should be used in a new one', () => { + const txData: TxData = { + data: '0x7cf5dab00000000000000000000000000000000000000000000000000000000000000005', + gasLimit: '0x15f90', + gasPrice: '0x1', + nonce: '0x01', + to: '0xd9024df085d09398ec76fbed18cac0e1149f50dc', + value: '0x0', + }; + + const privateKey = hexToBytes( + '4646464646464646464646464646464646464646464646464646464646464646', + ); + + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.TangerineWhistle, + }); + + const fixtureTxSignedWithoutEIP155 = Transaction.fromTxData(txData, { + common, + }).sign(privateKey); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + let signedWithEIP155 = Transaction.fromTxData(txData).sign(privateKey); + + expect(signedWithEIP155.verifySignature()).toBe(true); + expect(signedWithEIP155.v?.toString(16)).not.toBe('1c'); + expect(signedWithEIP155.v?.toString(16)).not.toBe('1b'); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + signedWithEIP155 = Transaction.fromTxData(fixtureTxSignedWithoutEIP155.toJSON()).sign( + privateKey, + ); + + expect(signedWithEIP155.verifySignature()).toBe(true); + expect(signedWithEIP155.v?.toString(16)).not.toBe('1c'); + expect(signedWithEIP155.v?.toString(16)).not.toBe('1b'); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + let signedWithoutEIP155 = Transaction.fromTxData(txData, { + common, + }).sign(privateKey); + + expect(signedWithoutEIP155.verifySignature()).toBe(true); + expect( + signedWithoutEIP155.v?.toString(16) === '1c' || + signedWithoutEIP155.v?.toString(16) === '1b', + ).toBe(true); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + signedWithoutEIP155 = Transaction.fromTxData(txData, { + common, + }).sign(privateKey); + + expect(signedWithoutEIP155.verifySignature()).toBe(true); + expect( + signedWithoutEIP155.v?.toString(16) === '1c' || + signedWithoutEIP155.v?.toString(16) === '1b', + ).toBe(true); + }); + + it('constructor: throw on legacy transactions which have v !== 27 and v !== 28 and v < 37', () => { + function getTxData(v: number) { + return { + v, + }; + } + for (let n = 0; n < 27; n += 1) { + expect(() => Transaction.fromTxData(getTxData(n))).toThrow(); + } + expect(() => Transaction.fromTxData(getTxData(29))).toThrow(); + expect(() => Transaction.fromTxData(getTxData(36))).toThrow(); + + expect(() => Transaction.fromTxData(getTxData(27))).not.toThrow(); + expect(() => Transaction.fromTxData(getTxData(28))).not.toThrow(); + expect(() => Transaction.fromTxData(getTxData(37))).not.toThrow(); + }); + + it('sign(), verifySignature(): sign tx with chainId specified in params', () => { + const common = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Petersburg }); + let tx = Transaction.fromTxData({}, { common }); + expect(tx.common.chainId()).toEqual(BigInt(5)); + + const privKey = hexToBytes(txFixtures[0].privateKey); + tx = tx.sign(privKey); + + const serialized = tx.serialize(); + + const reTx = Transaction.fromSerializedTx(serialized, { common }); + expect(reTx.verifySignature()).toBe(true); + expect(reTx.common.chainId()).toEqual(BigInt(5)); + }); + + it('freeze property propagates from unsigned tx to signed tx', () => { + const tx = Transaction.fromTxData({}, { freeze: false }); + expect(Object.isFrozen(tx)).toBe(false); + const privKey = hexToBytes(txFixtures[0].privateKey); + const signedTxn = tx.sign(privKey); + expect(Object.isFrozen(signedTxn)).toBe(false); + }); + + it('common propagates from the common of tx, not the common in TxOptions', () => { + const common = new Common({ chain: Chain.Goerli, hardfork: Hardfork.London }); + const pkey = hexToBytes(txFixtures[0].privateKey); + const txn = Transaction.fromTxData({}, { common, freeze: false }); + const newCommon = new Common({ + chain: Chain.Goerli, + hardfork: Hardfork.London, + eips: [2537], + }); + expect(newCommon).not.toEqual(common); + Object.defineProperty(txn, 'common', { + get() { + return newCommon; + }, + }); + const signedTxn = txn.sign(pkey); + expect(signedTxn.common.eips()).toContain(2537); + }); + + it('isSigned() -> returns correct values', () => { + let tx = Transaction.fromTxData({}); + expect(tx.isSigned()).toBe(false); + + const txData: TxData = { + data: '0x7cf5dab00000000000000000000000000000000000000000000000000000000000000005', + gasLimit: '0x15f90', + gasPrice: '0x1', + nonce: '0x01', + to: '0xd9024df085d09398ec76fbed18cac0e1149f50dc', + value: '0x0', + }; + const privateKey = hexToBytes( + '4646464646464646464646464646464646464646464646464646464646464646', + ); + tx = Transaction.fromTxData(txData); + expect(tx.isSigned()).toBe(false); + tx = tx.sign(privateKey); + expect(tx.isSigned()).toBe(true); + + tx = Transaction.fromTxData(txData); + expect(tx.isSigned()).toBe(false); + const rawUnsigned = tx.serialize(); + tx = tx.sign(privateKey); + const rawSigned = tx.serialize(); + expect(tx.isSigned()).toBe(true); + + tx = Transaction.fromSerializedTx(rawUnsigned); + expect(tx.isSigned()).toBe(false); + tx = tx.sign(privateKey); + expect(tx.isSigned()).toBe(true); + tx = Transaction.fromSerializedTx(rawSigned); + expect(tx.isSigned()).toBe(true); + + const signedValues = RLP.decode(Uint8Array.from(rawSigned)); + tx = Transaction.fromValuesArray(signedValues as Uint8Array[]); + expect(tx.isSigned()).toBe(true); + tx = Transaction.fromValuesArray(signedValues.slice(0, 6) as Uint8Array[]); + expect(tx.isSigned()).toBe(false); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/registerNewTx.test.ts b/packages/web3-eth-accounts/test/unit/tx/registerNewTx.test.ts new file mode 100644 index 00000000000..8b4da78a527 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/registerNewTx.test.ts @@ -0,0 +1,49 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { TransactionFactory } from '../../../src/tx/transactionFactory'; +import { BaseTransaction } from '../../../src/tx/baseTransaction'; +import { TxData, TxOptions } from '../../../src/tx'; + +describe('Register new TX', () => { + it('validateCannotExceedMaxInteger()', () => { + const TYPE = 20; + // @ts-expect-error not implement all methods + class SomeNewTxType extends BaseTransaction { + public constructor(txData: TxData, opts: TxOptions = {}) { + super({ ...txData, type: TYPE }, opts); + } + public static fromTxData() { + return 'new fromTxData'; + } + public static fromSerializedTx() { + return 'new fromSerializedData'; + } + } + TransactionFactory.registerTransactionType(TYPE, SomeNewTxType); + const txData = { + from: '0x', + to: '0x', + value: '0x1', + type: TYPE, + }; + expect(TransactionFactory.fromTxData(txData)).toBe('new fromTxData'); + expect(TransactionFactory.fromSerializedData(new Uint8Array([TYPE, 10]))).toBe( + 'new fromSerializedData', + ); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/staticMethods.test.ts b/packages/web3-eth-accounts/test/unit/tx/staticMethods.test.ts new file mode 100644 index 00000000000..e68893c70aa --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/staticMethods.test.ts @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BaseTransaction } from '../../../src/tx/baseTransaction'; + +describe('[BaseTransaction]', () => { + it('Initialization', () => { + expect(typeof BaseTransaction.fromTxData).toBe('function'); + expect(typeof BaseTransaction.fromSerializedTx).toBe('function'); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/transactionFactory.test.ts b/packages/web3-eth-accounts/test/unit/tx/transactionFactory.test.ts new file mode 100644 index 00000000000..72aa0efd955 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/transactionFactory.test.ts @@ -0,0 +1,155 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'web3-utils'; +import { Chain, Common, Hardfork } from '../../../src/common'; + +import { + AccessListEIP2930Transaction, + FeeMarketEIP1559Transaction, + Transaction, + TransactionFactory, +} from '../../../src'; + +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, +}); + +const pKey = hexToBytes('4646464646464646464646464646464646464646464646464646464646464646'); + +const unsignedTx = Transaction.fromTxData({}); +const signedTx = unsignedTx.sign(pKey); + +const unsignedEIP2930Tx = AccessListEIP2930Transaction.fromTxData( + { chainId: BigInt(1) }, + { common }, +); +const signedEIP2930Tx = unsignedEIP2930Tx.sign(pKey); + +const unsignedEIP1559Tx = FeeMarketEIP1559Transaction.fromTxData( + { chainId: BigInt(1) }, + { common }, +); +const signedEIP1559Tx = unsignedEIP1559Tx.sign(pKey); + +const txTypes = [ + { + class: Transaction, + name: 'Transaction', + unsigned: unsignedTx, + signed: signedTx, + eip2718: false, + type: 0, + }, + { + class: AccessListEIP2930Transaction, + name: 'AccessListEIP2930Transaction', + unsigned: unsignedEIP2930Tx, + signed: signedEIP2930Tx, + eip2718: true, + type: 1, + }, + { + class: FeeMarketEIP1559Transaction, + name: 'FeeMarketEIP1559Transaction', + unsigned: unsignedEIP1559Tx, + signed: signedEIP1559Tx, + eip2718: true, + type: 2, + }, +]; + +describe('[TransactionFactory]: Basic functions', () => { + it('fromSerializedData() -> success cases', () => { + for (const txType of txTypes) { + const serialized = txType.unsigned.serialize(); + const factoryTx = TransactionFactory.fromSerializedData(serialized, { common }); + expect(factoryTx.constructor.name).toEqual(txType.class.name); + } + }); + + it('fromSerializedData() -> error cases', () => { + for (const txType of txTypes) { + if (!txType.eip2718) { + continue; + } + const unsupportedCommon = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Istanbul, + }); + expect(() => { + TransactionFactory.fromSerializedData(txType.unsigned.serialize(), { + common: unsupportedCommon, + }); + }).toThrow(); + + expect(() => { + const serialized = txType.unsigned.serialize(); + serialized[0] = 99; // edit the transaction type + TransactionFactory.fromSerializedData(serialized, { common }); + }).toThrow(); + } + }); + + it('fromBlockBodyData() -> success cases', () => { + for (const txType of txTypes) { + let rawTx; + if (txType.eip2718) { + rawTx = txType.signed.serialize(); + } else { + rawTx = txType.signed.raw() as Uint8Array[]; + } + const tx = TransactionFactory.fromBlockBodyData(rawTx, { common }); + expect(tx.constructor.name).toEqual(txType.name); + expect(txType.eip2718 ? tx.serialize() : tx.raw()).toEqual(rawTx); + } + }); + + it('fromBlockBodyData() -> error case', () => { + expect(() => { + // @ts-expect-error incorrect param type + TransactionFactory.fromBlockBodyData(''); + }).toThrow(); + }); + + it('fromTxData() -> success cases', () => { + for (const txType of txTypes) { + const tx = TransactionFactory.fromTxData({ type: txType.type }, { common }); + expect(tx.constructor.name).toEqual(txType.class.name); + if (txType.eip2718) { + continue; + } + const _tx = TransactionFactory.fromTxData({}); + expect(_tx.constructor.name).toEqual(txType.class.name); + } + }); + + it('fromTxData() -> error cases', () => { + const unsupportedCommon = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }); + expect(() => { + TransactionFactory.fromTxData({ type: 1 }, { common: unsupportedCommon }); + }).toThrow(); + + expect(() => { + TransactionFactory.fromTxData({ type: 999 }); + }).toThrow(); + + expect(() => { + TransactionFactory.fromTxData({ value: BigInt('-100') }); + }).toThrow(); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/typedTxsAndEIP2930.test.ts b/packages/web3-eth-accounts/test/unit/tx/typedTxsAndEIP2930.test.ts new file mode 100644 index 00000000000..288bc265276 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/typedTxsAndEIP2930.test.ts @@ -0,0 +1,582 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { bytesToHex, hexToBytes, uint8ArrayEquals, uint8ArrayConcat } from 'web3-utils'; +import { + AccessListEIP2930Transaction, + AccessListUint8ArrayItem, + FeeMarketEIP1559Transaction, +} from '../../../src'; +import { Chain, Common, Hardfork, uint8ArrayToBigInt } from '../../../src/common'; +import { Address } from '../../../src/tx/address'; +import { + MAX_INTEGER, + MAX_UINT64, + SECP256K1_ORDER_DIV_2, + secp256k1, +} from '../../../src/tx/constants'; + +import type { AccessList } from '../../../src'; + +const privateToPublic = (privateKey: Uint8Array): Uint8Array => { + return secp256k1.getPublicKey(privateKey, false).slice(1); +}; +const pKey = hexToBytes('4646464646464646464646464646464646464646464646464646464646464646'); +const address = Address.publicToAddress(privateToPublic(pKey)); + +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, +}); + +const txTypes = [ + { + class: AccessListEIP2930Transaction, + name: 'AccessListEIP2930Transaction', + type: 1, + }, + { + class: FeeMarketEIP1559Transaction, + name: 'FeeMarketEIP1559Transaction', + type: 2, + }, +]; + +const validAddress = hexToBytes('01'.repeat(20)); +const validSlot = hexToBytes('01'.repeat(32)); +const chainId = BigInt(1); + +describe('[AccessListEIP2930Transaction / FeeMarketEIP1559Transaction] -> EIP-2930 Compatibility', () => { + it('Initialization / Getter -> fromTxData()', () => { + for (const txType of txTypes) { + let tx = txType.class.fromTxData({}, { common }); + expect(tx).toBeTruthy(); + + tx = txType.class.fromTxData({ + chainId: 5, + }); + expect(tx.common.chainId() === BigInt(5)).toBeTruthy(); + + tx = txType.class.fromTxData({ + chainId: 99999, + }); + expect(tx.common.chainId() === BigInt(99999)).toBeTruthy(); + + const nonEIP2930Common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Istanbul, + }); + expect(() => { + txType.class.fromTxData({}, { common: nonEIP2930Common }); + }).toThrow(); + + expect(() => { + txType.class.fromTxData( + { + chainId: chainId + BigInt(1), + }, + { common }, + ); + }).toThrow(); + + expect(() => { + txType.class.fromTxData( + { + v: 2, + }, + { common }, + ); + }).toThrow(); + } + }); + + it('cannot input decimal values', () => { + const values = ['chainId', 'nonce', 'gasPrice', 'gasLimit', 'value', 'v', 'r', 's']; + const cases = [ + 10.1, + '10.1', + '0xaa.1', + -10.1, + -1, + BigInt(-10), + '-100', + '-10.1', + '-0xaa', + Infinity, + -Infinity, + NaN, + {}, + true, + false, + // eslint-disable-next-line @typescript-eslint/no-empty-function + () => {}, + Number.MAX_SAFE_INTEGER + 1, + ]; + for (const value of values) { + const txData: any = {}; + for (const testCase of cases) { + if ( + value === 'chainId' && + ((typeof testCase === 'number' && Number.isNaN(testCase)) || testCase === false) + ) { + continue; + } + txData[value] = testCase; + expect(() => { + AccessListEIP2930Transaction.fromTxData(txData); + }).toThrow(); + } + } + }); + + it('Initialization / Getter -> fromSerializedTx()', () => { + for (const txType of txTypes) { + expect(() => { + txType.class.fromSerializedTx(new Uint8Array([99]), {}); + }).toThrow('wrong tx type'); + + expect(() => { + // Correct tx type + RLP-encoded 5 + const serialized = uint8ArrayConcat( + new Uint8Array([txType.type]), + new Uint8Array([5]), + ); + txType.class.fromSerializedTx(serialized, {}); + }).toThrow('must be array'); + + expect(() => { + const serialized = uint8ArrayConcat( + new Uint8Array([txType.type]), + hexToBytes('c0'), + ); + txType.class.fromSerializedTx(serialized, {}); + }).toThrow('values (for unsigned tx)'); + } + }); + + it('Access Lists -> success cases', () => { + for (const txType of txTypes) { + const access: AccessList = [ + { + address: bytesToHex(validAddress), + storageKeys: [bytesToHex(validSlot)], + }, + ]; + const txn = txType.class.fromTxData( + { + accessList: access, + chainId: 1, + }, + { common }, + ); + + // Check if everything is converted + + const Uint8Array = txn.accessList; + const JSON = txn.AccessListJSON; + + expect(uint8ArrayEquals(Uint8Array[0][0], validAddress)).toBeTruthy(); + expect(uint8ArrayEquals(Uint8Array[0][1][0], validSlot)).toBeTruthy(); + + expect(JSON).toEqual(access); + + // also verify that we can always get the json access list, even if we don't provide one. + + const txnRaw = txType.class.fromTxData( + { + accessList: Uint8Array, + chainId: 1, + }, + { common }, + ); + + const JSONRaw = txnRaw.AccessListJSON; + + expect(JSONRaw).toEqual(access); + } + }); + + it('Access Lists -> error cases', () => { + for (const txType of txTypes) { + let accessList: any[] = [ + [ + hexToBytes('01'.repeat(21)), // Address of 21 bytes instead of 20 + [], + ], + ]; + + expect(() => { + txType.class.fromTxData({ chainId, accessList }, { common }); + }).toThrow(); + + accessList = [ + [ + validAddress, + [ + hexToBytes('01'.repeat(31)), // Slot of 31 bytes instead of 32 + ], + ], + ]; + + expect(() => { + txType.class.fromTxData({ chainId, accessList }, { common }); + }).toThrow(); + + accessList = [[]]; // Address does not exist + + expect(() => { + txType.class.fromTxData({ chainId, accessList }, { common }); + }).toThrow(); + + accessList = [[validAddress]]; // Slots does not exist + + expect(() => { + txType.class.fromTxData({ chainId, accessList }, { common }); + }).toThrow(); + + accessList = [[validAddress, validSlot]]; // Slots is not an array + + expect(() => { + txType.class.fromTxData({ chainId, accessList }, { common }); + }).toThrow(); + + accessList = [[validAddress, [], []]]; // 3 items where 2 are expected + + expect(() => { + txType.class.fromTxData({ chainId, accessList }, { common }); + }).toThrow(); + } + }); + + it('sign()', () => { + for (const txType of txTypes) { + let tx = txType.class.fromTxData( + { + data: hexToBytes('010200'), + to: validAddress, + accessList: [[validAddress, [validSlot]]], + chainId, + }, + { common }, + ); + let signed = tx.sign(pKey); + const signedAddress = signed.getSenderAddress(); + expect(uint8ArrayEquals(signedAddress.buf, address)).toBeTruthy(); + // expect(signedAddress).toEqual(Address.publicToAddress(Buffer.from(address))); + signed.verifySignature(); // If this throws, test will not end. + + tx = txType.class.fromTxData({}, { common }); + signed = tx.sign(pKey); + + expect(tx.accessList).toEqual([]); + expect(signed.accessList).toEqual([]); + + tx = txType.class.fromTxData({}, { common }); + + expect(() => { + tx.hash(); + }).toThrow(); + + expect(() => { + tx.getSenderPublicKey(); + }).toThrow(); + + expect(() => { + const high = SECP256K1_ORDER_DIV_2 + BigInt(1); + const _tx = txType.class.fromTxData({ s: high, r: 1, v: 1 }, { common }); + const _signed = _tx.sign(pKey); + _signed.getSenderPublicKey(); + }).toThrow(); + } + }); + + it('getDataFee()', () => { + for (const txType of txTypes) { + let tx = txType.class.fromTxData({}, { common }); + expect(tx.getDataFee()).toEqual(BigInt(0)); + + tx = txType.class.fromTxData({}, { common, freeze: false }); + expect(tx.getDataFee()).toEqual(BigInt(0)); + + const mutableCommon = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }); + tx = txType.class.fromTxData({}, { common: mutableCommon }); + tx.common.setHardfork(Hardfork.Istanbul); + expect(tx.getDataFee()).toEqual(BigInt(0)); + } + }); +}); + +describe('[AccessListEIP2930Transaction] -> Class Specific Tests', () => { + it('Initialization', () => { + const tx = AccessListEIP2930Transaction.fromTxData({}, { common }); + expect(AccessListEIP2930Transaction.fromTxData(tx, { common })).toBeTruthy(); + + const _validAddress = hexToBytes('01'.repeat(20)); + const _validSlot = hexToBytes('01'.repeat(32)); + const _chainId = BigInt(1); + expect(() => { + AccessListEIP2930Transaction.fromTxData( + { + data: hexToBytes('010200'), + to: _validAddress, + accessList: [[_validAddress, [_validSlot]]], + chainId: _chainId, + gasLimit: MAX_UINT64, + gasPrice: MAX_INTEGER, + }, + { common }, + ); + }).toThrow('gasLimit * gasPrice cannot exceed MAX_INTEGER'); + + const uint8Array = new Uint8Array([]); + const _address = new Uint8Array([]); + const storageKeys = [new Uint8Array([]), new Uint8Array([])]; + const aclBuf: AccessListUint8ArrayItem = [_address, storageKeys]; + expect(() => { + AccessListEIP2930Transaction.fromValuesArray( + [ + uint8Array, + uint8Array, + uint8Array, + uint8Array, + uint8Array, + uint8Array, + uint8Array, + [aclBuf], + uint8Array, + ], + {}, + ); + }).toThrow(); + }); + + it('should return right upfront cost', () => { + let tx = AccessListEIP2930Transaction.fromTxData( + { + data: hexToBytes('010200'), + to: validAddress, + accessList: [[validAddress, [validSlot]]], + chainId, + }, + { common }, + ); + // Cost should be: + // Base fee + 2*TxDataNonZero + TxDataZero + AccessListAddressCost + AccessListSlotCost + const txDataZero = Number(common.param('gasPrices', 'txDataZero')); + const txDataNonZero = Number(common.param('gasPrices', 'txDataNonZero')); + const accessListStorageKeyCost = Number( + common.param('gasPrices', 'accessListStorageKeyCost'), + ); + const accessListAddressCost = Number(common.param('gasPrices', 'accessListAddressCost')); + const baseFee = Number(common.param('gasPrices', 'tx')); + const creationFee = Number(common.param('gasPrices', 'txCreation')); + + expect( + tx.getBaseFee() === + BigInt( + txDataNonZero * 2 + + txDataZero + + baseFee + + accessListAddressCost + + accessListStorageKeyCost, + ), + ).toBeTruthy(); + + // In this Tx, `to` is `undefined`, so we should charge homestead creation gas. + tx = AccessListEIP2930Transaction.fromTxData( + { + data: hexToBytes('010200'), + accessList: [[validAddress, [validSlot]]], + chainId, + }, + { common }, + ); + + expect( + tx.getBaseFee() === + BigInt( + txDataNonZero * 2 + + txDataZero + + creationFee + + baseFee + + accessListAddressCost + + accessListStorageKeyCost, + ), + ).toBeTruthy(); + + // Explicitly check that even if we have duplicates in our list, we still charge for those + tx = AccessListEIP2930Transaction.fromTxData( + { + to: validAddress, + accessList: [ + [validAddress, [validSlot]], + [validAddress, [validSlot, validSlot]], + ], + chainId, + }, + { common }, + ); + + expect( + tx.getBaseFee() === + BigInt(baseFee + accessListAddressCost * 2 + accessListStorageKeyCost * 3), + ).toBeTruthy(); + }); + + it('getUpfrontCost() -> should return upfront cost', () => { + const tx = AccessListEIP2930Transaction.fromTxData( + { + gasPrice: 1000, + gasLimit: 10000000, + value: 42, + }, + { common }, + ); + expect(tx.getUpfrontCost()).toEqual(BigInt(10000000042)); + }); + + it('unsigned tx -> getMessageToSign()', () => { + const unsignedTx = AccessListEIP2930Transaction.fromTxData( + { + data: hexToBytes('010200'), + to: validAddress, + accessList: [[validAddress, [validSlot]]], + chainId, + }, + { common }, + ); + const expectedHash = hexToBytes( + '0x78528e2724aa359c58c13e43a7c467eb721ce8d410c2a12ee62943a3aaefb60b', + ); + expect(unsignedTx.getMessageToSign(true)).toEqual(expectedHash); + + const expectedSerialization = hexToBytes( + '0x01f858018080809401010101010101010101010101010101010101018083010200f838f7940101010101010101010101010101010101010101e1a00101010101010101010101010101010101010101010101010101010101010101', + ); + expect(unsignedTx.getMessageToSign(false)).toEqual(expectedSerialization); + }); + + // Data from + // https://github.com/INFURA/go-ethlibs/blob/75b2a52a39d353ed8206cffaf68d09bd1b154aae/eth/transaction_signing_test.go#L87 + + it('should sign transaction correctly and return expected JSON', () => { + const _address = hexToBytes('0000000000000000000000000000000000001337'); + const slot1 = hexToBytes( + '0000000000000000000000000000000000000000000000000000000000000000', + ); + const txData = { + data: hexToBytes(''), + gasLimit: 0x62d4, + gasPrice: 0x3b9aca00, + nonce: 0x00, + to: new Address(hexToBytes('df0a88b2b68c673713a8ec826003676f272e3573')), + value: 0x01, + chainId: uint8ArrayToBigInt(hexToBytes('796f6c6f763378')), + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + accessList: [[_address, [slot1]]], + }; + + const customChainParams = { + name: 'custom', + chainId: txData.chainId, + eips: [2718, 2929, 2930], + }; + const usedCommon = Common.custom(customChainParams, { + baseChain: Chain.Mainnet, + hardfork: Hardfork.Berlin, + }); + usedCommon.setEIPs([2718, 2929, 2930]); + + const expectedUnsignedRaw = hexToBytes( + '01f86587796f6c6f76337880843b9aca008262d494df0a88b2b68c673713a8ec826003676f272e35730180f838f7940000000000000000000000000000000000001337e1a00000000000000000000000000000000000000000000000000000000000000000808080', + ); + const pkey = hexToBytes('fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19'); + const expectedSigned = hexToBytes( + '01f8a587796f6c6f76337880843b9aca008262d494df0a88b2b68c673713a8ec826003676f272e35730180f838f7940000000000000000000000000000000000001337e1a0000000000000000000000000000000000000000000000000000000000000000080a0294ac94077b35057971e6b4b06dfdf55a6fbed819133a6c1d31e187f1bca938da00be950468ba1c25a5cb50e9f6d8aa13c8cd21f24ba909402775b262ac76d374d', + ); + const expectedHash = hexToBytes( + 'bbd570a3c6acc9bb7da0d5c0322fe4ea2a300db80226f7df4fef39b2d6649eec', + ); + const v = BigInt(0); + const r = uint8ArrayToBigInt( + hexToBytes('294ac94077b35057971e6b4b06dfdf55a6fbed819133a6c1d31e187f1bca938d'), + ); + const s = uint8ArrayToBigInt( + hexToBytes('0be950468ba1c25a5cb50e9f6d8aa13c8cd21f24ba909402775b262ac76d374d'), + ); + + const unsignedTx = AccessListEIP2930Transaction.fromTxData(txData, { common: usedCommon }); + + const serializedMessageRaw = unsignedTx.serialize(); + + expect(uint8ArrayEquals(expectedUnsignedRaw, serializedMessageRaw)).toBeTruthy(); + + const signed = unsignedTx.sign(pkey); + + expect(v === signed.v!).toBeTruthy(); + expect(r === signed.r!).toBeTruthy(); + expect(s === signed.s!).toBeTruthy(); + expect(uint8ArrayEquals(expectedSigned, signed.serialize())).toBeTruthy(); + expect(uint8ArrayEquals(expectedHash, signed.hash())).toBeTruthy(); + + const expectedJSON = { + chainId: '0x796f6c6f763378', + nonce: '0x0', + gasPrice: '0x3b9aca00', + gasLimit: '0x62d4', + to: '0xdf0a88b2b68c673713a8ec826003676f272e3573', + value: '0x1', + data: '0x', + accessList: [ + { + address: '0x0000000000000000000000000000000000001337', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000000', + ], + }, + ], + v: '0x0', + r: '0x294ac94077b35057971e6b4b06dfdf55a6fbed819133a6c1d31e187f1bca938d', + s: '0xbe950468ba1c25a5cb50e9f6d8aa13c8cd21f24ba909402775b262ac76d374d', + }; + + expect(signed.toJSON()).toEqual(expectedJSON); + }); + + it('freeze property propagates from unsigned tx to signed tx', () => { + const tx = AccessListEIP2930Transaction.fromTxData({}, { freeze: false }); + expect(Object.isFrozen(tx)).toBe(false); + const signedTxn = tx.sign(pKey); + expect(Object.isFrozen(signedTxn)).toBe(false); + }); + + it('common propagates from the common of tx, not the common in TxOptions', () => { + const txn = AccessListEIP2930Transaction.fromTxData({}, { common, freeze: false }); + const newCommon = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.London, + eips: [2537], + }); + expect(newCommon).not.toEqual(common); + Object.defineProperty(txn, 'common', { + get() { + return newCommon; + }, + }); + const signedTxn = txn.sign(pKey); + expect(signedTxn.common.eips().includes(2537)).toBeTruthy(); + }); +}); diff --git a/packages/web3-eth-accounts/test/unit/tx/types.ts b/packages/web3-eth-accounts/test/unit/tx/types.ts new file mode 100644 index 00000000000..59579c036e5 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/tx/types.ts @@ -0,0 +1,78 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export type ForkName = + | 'London+3860' + | 'London' + | 'Berlin' + | 'Istanbul' + | 'Byzantium' + | 'ConstantinopleFix' + | 'Constantinople' + | 'EIP150' + | 'EIP158' + | 'Frontier' + | 'Homestead'; + +export type ForkNamesMap = { [forkName in ForkName]: string }; + +export interface TxData { + data: string; + gasLimit: string; + gasPrice: string; + nonce: string; + to: string; + value: string; + + v: string; + r: string; + s: string; +} + +// The type of each entry from ./ttTransactionTestEip155VitaliksTests.json +export interface VitaliksTestsDataEntry { + blocknumber: string; + hash: string; + rlp: string; + sender: string; + transaction: TxData; +} + +// The type of ./txs.json +export type TxsJsonEntry = { + privateKey: string; + sendersAddress: string; + type: string; + cost: number; + raw: string[]; + data: TxData; +}; + +export type ForksData = { + [forkName in ForkName]: { hash?: string; sender?: string; exception?: string }; +}; + +export type OfficialTransactionTestData = { + _info: { + comment: string; + filledwith: string; + lllcversion: string; + source: string; + sourceHash: string; + }; + result: ForksData; + txbytes: string; +}; diff --git a/packages/web3-eth-accounts/test/unit/wallet.test.ts b/packages/web3-eth-accounts/test/unit/wallet.test.ts new file mode 100644 index 00000000000..2bc2c97c2e9 --- /dev/null +++ b/packages/web3-eth-accounts/test/unit/wallet.test.ts @@ -0,0 +1,374 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable @typescript-eslint/no-magic-numbers */ + +import { when } from 'jest-when'; +import { Web3AccountProvider, Web3BaseWalletAccount, KeyStore } from 'web3-types'; +import { Wallet } from '../../src/wallet'; + +describe('Wallet', () => { + let wallet: Wallet; + let accountProvider: Web3AccountProvider; + let localStorageSpy: { + getItem: jest.MockedFunction<(key: string) => string>; + setItem: jest.MockedFunction<(key: string, value: string) => string>; + }; + let totalAccountsCreate = 0; + let totalPrivatekeyCreate = 0; + + beforeEach(() => { + localStorageSpy = { getItem: jest.fn(), setItem: jest.fn() }; + + jest.spyOn(Wallet, 'getStorage').mockReturnValue(localStorageSpy as never); + + accountProvider = { + privateKeyToAccount: jest.fn().mockImplementation(() => { + totalPrivatekeyCreate += 1; + return { address: `privatekey_create_${totalPrivatekeyCreate}` }; + }), + decrypt: jest.fn(), + create: jest.fn().mockImplementation(() => { + totalAccountsCreate += 1; + return { address: `account_create_${totalAccountsCreate}` }; + }), + }; + wallet = new Wallet(accountProvider); + }); + + describe('constructor', () => { + it('should create instance of the wallet', () => { + expect(wallet).toBeInstanceOf(Wallet); + }); + }); + + describe('create', () => { + it('should create given # of accounts using the account provider', () => { + const numberOfAccounts = 10; + const accounts = []; + + wallet.create(numberOfAccounts); + + for (let i = 0; i < numberOfAccounts; i += 1) { + accounts.push(wallet.get(i)); + } + + expect(wallet).toHaveLength(numberOfAccounts); + expect(accounts).toHaveLength(numberOfAccounts); + expect(accounts).toMatchSnapshot(); + expect(accountProvider.create).toHaveBeenCalledTimes(numberOfAccounts); + }); + }); + + describe('add', () => { + it('should create account from private key if string value is given', () => { + const privateKey = 'private key'; + const result = wallet.add(privateKey); + + expect(result).toBeTruthy(); + + expect(accountProvider.privateKeyToAccount).toHaveBeenCalledTimes(1); + expect(accountProvider.privateKeyToAccount).toHaveBeenCalledWith(privateKey); + expect(wallet).toHaveLength(1); + expect(wallet.get(0)).toEqual({ address: 'privatekey_create_1' }); + }); + + it('should not create account from private key if object value is given', () => { + const result = wallet.add({ address: 'my_address' } as never); + + expect(result).toBeTruthy(); + expect(accountProvider.privateKeyToAccount).toHaveBeenCalledTimes(0); + expect(wallet).toHaveLength(1); + expect(wallet.get(0)).toEqual({ address: 'my_address' }); + }); + + it('should add account with lowercase address', () => { + const result = wallet.add({ address: 'myAddress' } as never); + + expect(result).toBeTruthy(); + expect(accountProvider.privateKeyToAccount).toHaveBeenCalledTimes(0); + expect(wallet).toHaveLength(1); + expect(wallet.get('myaddress')).toEqual({ address: 'myAddress' }); + }); + + it('should override account object for existing address', () => { + const account1 = { address: 'address', privateKey: 'pkey1' } as never; + const account2 = { address: 'address', privateKey: 'pkey2' } as never; + + wallet.add(account1); + expect(wallet.get('address')).toEqual(account1); + + wallet.add(account2); + expect(wallet.get('address')).toEqual(account2); + }); + }); + + describe('get', () => { + it('should get account for given index', () => { + const account = { address: 'my_address' } as never; + + wallet.add(account); + + expect(wallet.get(0)).toEqual(account); + }); + + it('should get account for given address', () => { + const account = { address: 'my_address' } as never; + + wallet.add(account); + + expect(wallet.get('my_address')).toEqual(account); + }); + + it('should get account with index', () => { + const account = { address: 'my_Address' } as never; + + wallet.add(account); + + expect(wallet[0]).toEqual(account); + }); + }); + + describe('remove', () => { + it('should remove account for given index', () => { + const account = { address: 'my_address' } as never; + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove(0); + + expect(result).toBeTruthy(); + expect(wallet).toHaveLength(0); + expect(wallet.get(0)).toBeUndefined(); + }); + + it('should return false if index not found', () => { + const account = { address: 'my_address' } as never; + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove(2); + + expect(result).toBeFalsy(); + expect(wallet).toHaveLength(1); + }); + + it('should remove account for given address', () => { + const account = { address: 'my_address' } as never; + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove('my_address'); + + expect(result).toBeTruthy(); + expect(wallet).toHaveLength(0); + expect(wallet.get(0)).toBeUndefined(); + }); + + it('should return false if given address not found', () => { + const account = { address: 'my_address' } as never; + wallet.add(account); + expect(wallet).toHaveLength(1); + + const result = wallet.remove('my_address2'); + + expect(result).toBeFalsy(); + expect(wallet).toHaveLength(1); + }); + + it('should remove account with the index', () => { + const account = { address: 'my_address' } as never; + wallet.add(account); + expect(wallet).toHaveLength(1); + + delete wallet[0]; + + // Deleting objects dees not change the length + expect(wallet).toHaveLength(1); + expect(wallet[0]).toBeUndefined(); + }); + + it('should remove account with array methods', () => { + const account = { address: 'my_address' } as never; + wallet.add(account); + expect(wallet).toHaveLength(1); + + wallet.splice(0, 1); + + expect(wallet).toHaveLength(0); + expect(wallet[0]).toBeUndefined(); + }); + + it('should remove account added with private key with array methods', () => { + const privateKey = 'private_key'; + wallet.add(privateKey); + expect(wallet).toHaveLength(1); + + wallet.splice(0, 1); + + expect(wallet).toHaveLength(0); + expect(wallet[0]).toBeUndefined(); + }); + }); + + describe('clear', () => { + it('should remove all accounts', () => { + wallet.add({ address: 'my_address' } as never); + wallet.add({ address: 'my_address2' } as never); + expect(wallet).toHaveLength(2); + + wallet.clear(); + + expect(wallet).toHaveLength(0); + expect(wallet.get(0)).toBeUndefined(); + }); + }); + + describe('encrypt', () => { + it('should encrypt all accounts and return array', async () => { + const account1 = { + address: 'my_address1', + encrypt: jest.fn().mockResolvedValue('encrypted_account1'), + } as any; + const account2 = { + address: 'my_address2', + encrypt: jest.fn().mockResolvedValue('encrypted_account2'), + } as any; + const options = { myOptions: 'myOptions' }; + wallet.add(account1); + wallet.add(account2); + + const result = await wallet.encrypt('password', options); + + expect(account1.encrypt).toHaveBeenCalledTimes(1); + expect(account1.encrypt).toHaveBeenCalledWith('password', options); + expect(account2.encrypt).toHaveBeenCalledTimes(1); + expect(account2.encrypt).toHaveBeenCalledWith('password', options); + expect(result).toEqual(['encrypted_account1', 'encrypted_account2']); + }); + }); + + describe('decrypt', () => { + it('should decrypt all accounts and add to wallet', async () => { + const encryptedAccount1 = { address: 'encrypted_account1' } as KeyStore; + const encryptedAccount2 = { address: 'encrypted_account2' } as KeyStore; + const account1 = { address: 'my_address1' } as any; + const account2 = { address: 'my_address2' } as any; + const options = { myOptions: 'myOptions' }; + + when(accountProvider.decrypt) + .calledWith(encryptedAccount1, 'password', options) + .mockResolvedValue(account1); + when(accountProvider.decrypt) + .calledWith(encryptedAccount2, 'password', options) + .mockResolvedValue(account2); + + await wallet.decrypt([encryptedAccount1, encryptedAccount2], 'password', options); + + expect(accountProvider.decrypt).toHaveBeenCalledTimes(2); + expect(accountProvider.decrypt).toHaveBeenCalledWith( + encryptedAccount1, + 'password', + options, + ); + expect(accountProvider.decrypt).toHaveBeenCalledWith( + encryptedAccount2, + 'password', + options, + ); + expect(wallet).toHaveLength(2); + expect(wallet.get(0)).toEqual(account1); + expect(wallet.get(1)).toEqual(account2); + }); + }); + + describe('save', () => { + it('should throw error if local storage not present', async () => { + jest.spyOn(Wallet, 'getStorage').mockReturnValue(undefined); + + return expect(wallet.save('password')).rejects.toThrow('Local storage not available.'); + }); + + it('should encrypt wallet and store with local storage for given key', async () => { + const encryptedWallet = [{ address: 'encryptedWallet' }] as KeyStore[]; + jest.spyOn(wallet, 'encrypt').mockResolvedValue(encryptedWallet); + + await wallet.save('password', 'myKey'); + + expect(wallet.encrypt).toHaveBeenCalledTimes(1); + expect(wallet.encrypt).toHaveBeenCalledWith('password'); + expect(localStorageSpy.setItem).toHaveBeenCalledTimes(1); + expect(localStorageSpy.setItem).toHaveBeenCalledWith( + 'myKey', + JSON.stringify(encryptedWallet), + ); + }); + + it('should encrypt wallet and store with local storage with default key', async () => { + const encryptedWallet = [{ address: 'encryptedWallet' }] as KeyStore[]; + jest.spyOn(wallet, 'encrypt').mockResolvedValue(encryptedWallet); + + await wallet.save('password'); + + expect(wallet.encrypt).toHaveBeenCalledTimes(1); + expect(wallet.encrypt).toHaveBeenCalledWith('password'); + expect(localStorageSpy.setItem).toHaveBeenCalledTimes(1); + expect(localStorageSpy.setItem).toHaveBeenCalledWith( + 'web3js_wallet', + JSON.stringify(encryptedWallet), + ); + }); + }); + + describe('load', () => { + it('should throw error if local storage not present', async () => { + jest.spyOn(Wallet, 'getStorage').mockReturnValue(undefined); + + return expect(wallet.load('password')).rejects.toThrow('Local storage not available.'); + }); + + it('should load wallet from local storage for given key and decrypt', async () => { + const encryptedWallet = JSON.stringify(['encryptedWallet']); + + when(localStorageSpy.getItem).calledWith('myKey').mockReturnValue(encryptedWallet); + jest.spyOn(wallet, 'decrypt').mockResolvedValue({} as never); + + await wallet.load('password', 'myKey'); + + expect(wallet.decrypt).toHaveBeenCalledTimes(1); + expect(wallet.decrypt).toHaveBeenCalledWith(['encryptedWallet'], 'password'); + expect(localStorageSpy.getItem).toHaveBeenCalledTimes(1); + expect(localStorageSpy.getItem).toHaveBeenCalledWith('myKey'); + }); + + it('should load wallet from local storage for default key and decrypt', async () => { + const encryptedWallet = JSON.stringify(['encryptedWallet']); + + when(localStorageSpy.getItem) + .calledWith('web3js_wallet') + .mockReturnValue(encryptedWallet); + jest.spyOn(wallet, 'decrypt').mockResolvedValue({} as never); + + await wallet.load('password'); + + expect(wallet.decrypt).toHaveBeenCalledTimes(1); + expect(wallet.decrypt).toHaveBeenCalledWith(['encryptedWallet'], 'password'); + expect(localStorageSpy.getItem).toHaveBeenCalledTimes(1); + expect(localStorageSpy.getItem).toHaveBeenCalledWith('web3js_wallet'); + }); + }); +}); diff --git a/packages/web3-eth-accounts/tsconfig.cjs.json b/packages/web3-eth-accounts/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-eth-accounts/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-eth-accounts/tsconfig.esm.json b/packages/web3-eth-accounts/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-eth-accounts/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-eth-accounts/tsconfig.json b/packages/web3-eth-accounts/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-eth-accounts/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-eth-accounts/tsconfig.types.json b/packages/web3-eth-accounts/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-eth-accounts/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-eth-accounts/tsdoc.json b/packages/web3-eth-accounts/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-eth-accounts/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth-accounts/types/index.d.ts b/packages/web3-eth-accounts/types/index.d.ts deleted file mode 100644 index f92cdc13f7a..00000000000 --- a/packages/web3-eth-accounts/types/index.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens , Samuel Furter - * @date 2018 - */ - -import { AccountsBase, SignedTransaction, WalletBase } from 'web3-core'; - -export {SignedTransaction} from 'web3-core'; - -export class Accounts extends AccountsBase {} - -export class Wallet extends WalletBase {} - -export interface Sign extends SignedTransaction { - message: string; - signature: string; -} - -export interface SignatureObject { - messageHash: string; - r: string; - s: string; - v: string; -} diff --git a/packages/web3-eth-accounts/types/tests/accounts-tests.ts b/packages/web3-eth-accounts/types/tests/accounts-tests.ts deleted file mode 100644 index aa7c1c3f24b..00000000000 --- a/packages/web3-eth-accounts/types/tests/accounts-tests.ts +++ /dev/null @@ -1,241 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file accounts-tests.ts - * @author Josh Stevens - * @date 2018 - */ -import { Accounts, SignedTransaction } from 'web3-eth-accounts'; - -// $ExpectType Accounts -const accounts_empty = new Accounts(); - -// $ExpectType Accounts -const accounts = new Accounts('http://localhost:8545'); - -// $ExpectType provider -accounts.currentProvider; - -// $ExpectType any -accounts.givenProvider; - -// $ExpectType boolean -accounts.setProvider('https://localhost:2100'); - -// $ExpectType Account -accounts.create(); -// $ExpectType Account -accounts.create( - '2435@#@#@±±±±!!!!678543213456764321§34567543213456785432134567' -); - -// $ExpectType Account -accounts.privateKeyToAccount( - '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709' -); - -// $ExpectType Account -accounts.privateKeyToAccount( - '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', - true -); - -// $ExpectType Promise -accounts.signTransaction( - { - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - value: '1000000000', - gas: 2000000 - }, - '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318' -); - -// $ExpectType Promise -accounts.signTransaction( - { - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - value: '1000000000', - gas: 2000000 - }, - '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - (error: Error, signedTransaction: SignedTransaction) => { - console.log('hey'); - } -); - -// $ExpectType string -accounts.recoverTransaction( - '0xf861808084aefcdfa08e7d2ee3f0b9d9ae184b2001fe0aff07603d9' -); - -// $ExpectType string -accounts.hashMessage('hello world'); - -// $ExpectType Sign -accounts.sign( - 'Some data', - '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318' -); - -// $ExpectType string -accounts.recover({ - messageHash: - '0x1da44b586eb0729ff70a73c326926f6ed5a25f5b056e7f47fbc6e58d86871655', - v: '0x1c', - r: '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd', - s: '0x6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a029' -}); - -// $ExpectType string -accounts.recover( - 'Some data', - '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c' -); - -// $ExpectType string -accounts.recover( - 'Some data', - '0x1c', - '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd', - '0x6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a029' -); - -// $ExpectType EncryptedKeystoreV3Json -accounts.encrypt( - '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - 'test!' -); - -// $ExpectType Account -accounts.decrypt( - { - version: 3, - id: '04e9bcbb-96fa-497b-94d1-14df4cd20af6', - address: '2c7536e3605d9c16a7a3d7b1898e529396a65c23', - crypto: { - ciphertext: - 'a1c25da3ecde4e6a24f3697251dd15d6208520efc84ad97397e906e6df24d251', - cipherparams: { iv: '2885df2b63f7ef247d753c82fa20038a' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: { - dklen: 32, - salt: - '4531b3c174cc3ff32a6a7a85d6761b410db674807b2d216d022318ceee50be10', - n: 262144, - r: 8, - p: 1 - }, - mac: - 'b8b010fff37f9ae5559a352a185e86f9b9c1d7f7a9f1bd4e82a5dd35468fc7f6' - } - }, - 'test!' -); - -// $ExpectType WalletBase -accounts.wallet.create(2); - -// $ExpectType Account -accounts.wallet[0]; - -// $ExpectType WalletBase -accounts.wallet.create( - 2, - '54674321§3456764321§345674321§3453647544±±±§±±±!!!43534534534534' -); - -// $ExpectType AddedAccount -accounts.wallet.add( - '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318' -); - -// $ExpectType AddedAccount -accounts.wallet.add({ - privateKey: - '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', - address: '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01' -}); - -// $ExpectType boolean -accounts.wallet.remove('0xF0109fC8DF283027b6285cc889F5aA624EaC1F55'); - -// $ExpectType boolean -accounts.wallet.remove(3); - -// $ExpectType WalletBase -accounts.wallet.clear(); - -// $ExpectType EncryptedKeystoreV3Json[] -accounts.wallet.encrypt('test'); - -// $ExpectType WalletBase -accounts.wallet.decrypt( - [ - { - version: 3, - id: '83191a81-aaca-451f-b63d-0c5f3b849289', - address: '06f702337909c06c82b09b7a22f0a2f0855d1f68', - crypto: { - ciphertext: - '7d34deae112841fba86e3e6cf08f5398dda323a8e4d29332621534e2c4069e8d', - cipherparams: { iv: '497f4d26997a84d570778eae874b2333' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: { - dklen: 32, - salt: - '208dd732a27aa4803bb760228dff18515d5313fd085bbce60594a3919ae2d88d', - n: 262144, - r: 8, - p: 1 - }, - mac: - '0062a853de302513c57bfe3108ab493733034bf3cb313326f42cf26ea2619cf9' - } - }, - { - version: 3, - id: '7d6b91fa-3611-407b-b16b-396efb28f97e', - address: 'b5d89661b59a9af0b34f58d19138baa2de48baaf', - crypto: { - ciphertext: - 'cb9712d1982ff89f571fa5dbef447f14b7e5f142232bd2a913aac833730eeb43', - cipherparams: { iv: '8cccb91cb84e435437f7282ec2ffd2db' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: { - dklen: 32, - salt: - '08ba6736363c5586434cd5b895e6fe41ea7db4785bd9b901dedce77a1514e8b8', - n: 262144, - r: 8, - p: 1 - }, - mac: - 'd2eb068b37e2df55f56fa97a2bf4f55e072bef0dd703bfd917717d9dc54510f0' - } - } - ], - 'test' -); - -// $ExpectType boolean -accounts.wallet.save('test#!$'); - -// $ExpectType WalletBase -accounts.wallet.load('test#!$'); - -// $ExpectType WalletBase -accounts.wallet.load('test#!$', 'myWalletKey'); diff --git a/packages/web3-eth-accounts/types/tsconfig.json b/packages/web3-eth-accounts/types/tsconfig.json deleted file mode 100644 index 8cc88bbb8cc..00000000000 --- a/packages/web3-eth-accounts/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth-accounts": ["."] - } - } -} diff --git a/packages/web3-eth-accounts/types/tslint.json b/packages/web3-eth-accounts/types/tslint.json deleted file mode 100644 index 6429b0c446e..00000000000 --- a/packages/web3-eth-accounts/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false - } -} diff --git a/packages/web3-eth-contract/.eslintignore b/packages/web3-eth-contract/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-eth-contract/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-contract/.eslintrc.js b/packages/web3-eth-contract/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-eth-contract/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-contract/.gitignore b/packages/web3-eth-contract/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-eth-contract/.npmignore b/packages/web3-eth-contract/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-eth-contract/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-eth-contract/.prettierignore b/packages/web3-eth-contract/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-eth-contract/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-contract/.prettierrc.json b/packages/web3-eth-contract/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-eth-contract/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-eth-contract/CHANGELOG.md b/packages/web3-eth-contract/CHANGELOG.md new file mode 100644 index 00000000000..6da5a48e413 --- /dev/null +++ b/packages/web3-eth-contract/CHANGELOG.md @@ -0,0 +1,373 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [4.0.0-alpha.0] + +### Breaking Changes + +#### Receipt Status + +The receiptInfo Status will now be be an unsigned integer instead of boolean value to comply with the specification. + +[https://github.com/ethereum/execution-apis/blob/773ffd230ae5cd037e32415855cf8d4f1e729b2d/src/schemas/receipt.yaml#L94-L97](https://github.com/ethereum/execution-apis/blob/773ffd230ae5cd037e32415855cf8d4f1e729b2d/src/schemas/receipt.yaml#L94-L97) + +

+ +1.x + +

+ +```ts +myContract.methods + .MyMethod() + .send() + .on('receipt', receipt => { + console.log(receipt.status); // true | false + }); +``` + +

+
+ +
+4.x + +

+ +```ts +myContract.methods + .MyMethod() + .send() + .on('receipt', receipt => { + console.log(receipt.status); // BigInt(0) | BigInt(1) + }); +``` + +

+
+ +**NOTE:** The unsigned integer type is dependent on the data format you specified. Default type is `bigint`. + +#### Deploy ’sending’ and `sent` event will fire only the params + +In 1.x when following was executed `deploy().send().on(‘sending’, payload => {})`. The `payload` was the complete the JSON-RPC Payload. In 4.x it will just be the transaction which is about to be transmitted. Earlier it was accessible by from `payload.params[0]`, now will be available directly to event handler. + +
+1.x + +

+ +```ts +myContract + .deploy() + .send() + .on('send', payload => { + console.log(payload); + // {id: <1>, jsonrpc: '2.0', method: 'eth_sendTransaction', params: [txObject] } + }); +``` + +

+
+ +
+4.x + +

+ +```ts +myContract + .deploy() + .send() + .on('send', txObject => { + console.log(txObject); + // {id: <>, gas: <>,...} + }); +``` + +

+
+ +#### Deploy ’confirmations’ handler will be invoked with object + +In 1.x, the `confirmations` handler was invoked with multiple parameters. But in `4.x` there will be one parameter as object but with all the same properties. + +
+1.x + +

+ +```ts +myContract .send().on(‘confirmation’, (confirmations: number, receipt: object, latestBlockHash: string) => {})` +``` + +

+
+ +
+4.x + +

+ +```ts +myContract .send().on(‘confirmation’, ({confirmations: bigint, receipt: object, latestBlockHash: string}) => {})` +``` + +

+
+ +#### Strict validation for `encodeABI` + +`encodeABI` now have strict validation for the ABI types. It's not limited to mentioned use cases below , but applied in general. Some use cases are: + +- Earlier a `byte32` ABI type was successfully encoded even providing less bytes as input. Now it will throw error. +- Earlier a `byte32` ABI type was successfully encoded even with an empty bytes. Now it will throw error. + +#### Different error message for creating object without `new` keyword + +The error message will be different if you try to create a contract object without a `new` keyword. + +
+1.x + +

+ +```ts +Please use the "new" keyword to instantiate a web3.eth.Contract() object! +``` + +

+
+ +
+4.x + +

+ +```ts +Class constructor ContractBuilder cannot be invoked without 'new' +``` + +

+
+ +#### No warning message when `toBlock` passed to event subscription + +In `1.x` if you pass the `toBlock` as event options you would get a warning message. + +> Invalid option: toBlock. Use getPastEvents for specific range. + +In `4.x` you will not get any warning. But `toBlock` still have no effect. + +#### The contract `send` method will now resolve with the `receipt` object + +In `1.x` the contract `.send` method was always resolved with `transactionHash`. That enforces user to make an extra call to get any further information. In `4.x` the `.send` function will resolve with `receipt` object. + +
+1.x + +

+ +```ts +const transactionHash = await myContract.method.MyMethod().send(); +``` + +

+
+ +
+4.x + +

+ +```ts +const receipt = await myContract.method.MyMethod().send(); +const transactionHash = receipt.transactionHash; +``` + +

+
+ +## [4.0.1-alpha.1] + +### Added + +- Decoding error data, using Error ABI if available, according to EIP-838. (#5434) +- The class `Web3ContractError` is moved from this package to `web3-error`. (#5434) + +### Fixed + +- According to the latest change in `web3-eth-abi`, the decoded values of the large numbers, returned from function calls or events, are now available as `BigInt`. (#5435) + +## [4.0.1-alpha.2] + +### Added + +- Decoding error data, using Error ABI if available, if error was returned from a smart contract function call (#5662). +- `SpecialOutput` type was added as a generic type into the call function to support reassigning output types (#5631) +- Overloaded functions types (`ContractOverloadedMethodInputs`, `ContractOverloadedMethodOutputs`) was added (#5631) + +### Fixed + +- Emit past contract events based on `fromBlock` when passed to `contract.events.someEventName` (#5201) +- Use different types for `ContractOptions` -> `jsonInterface` setter and getter (#5474) +- An issue within the `Contract` constructor where `provider` wasn't being set when provided within the `optionsOrContextOrReturnFormat` argument (#5669) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Fixed + +- Fix contract defaults (#5756) +- Fixed getPastEventsError (#5819) + +### Changed + +- Update imports statements for objects that was moved between web3 packages (#5771) + +### Added + +- Added functionality of `createAccessList` for contracts ( #5780 ) +- An instance of `Contract` will `subscribeToContextEvents` upon instantiation if `syncWithContext` is set to `true` and the constructor is passed an instance of `Web3Context` (#5833) +- Added support of `safe` and `finalized` block tags (#5823) + +### Removed + +- `decodeErrorData` is no longer exported (method was moved to `web3-eth-abi` and renamed `decodeContractErrorData`) (#5844) + +## [4.0.1-rc.1] + +### Added + +- `input` is now an acceptable property for `ContractInitOptions` in place of `data` (either can be used, but `input` is used withing the `Contract` class) (#5915) +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +### Changed + +- `getSendTxParams` will now return `input` instead of `data` in returned transaction parameters object (#5915) +- `Contract` constructor will now thrown new `ContractTransactionDataAndInputError` if both `data` and `input` are passed in `ContractInitOptions` for `Contract` constructor (#5915) +- The types `ContractInitOptions`, `NonPayableCallOptions` and `PayableCallOptions` are moved to `web3-types`. (#5993) + +### Removed + +- `data` was removed as a property of `ContractOptions` type (#5915) + +## [4.0.1-rc.2] + +### Added + +- Added support for `getPastEvents` method to filter `allEvents` and specific event (#6010) +- Added `maxPriorityFeePerGas` and `maxFeePerGas` in `ContractOptions` type and updated function using it in utils (#6118) +- Added method's type autodetection by ABI param (#6137) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Fixed + +- Event filtering using non-indexed and indexed string event arguments (#6167) + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Fixed + +- Fixed bug in `contract.events.allEvents` + +### Added + +- In case of error events there will be inner error also available for details + +## [4.1.0] + +### Added + +- Added `dataInputFill` as a ContractInitOption, allowing users to have the choice using property `data`, `input` or `both` for contract methods to be sent to the RPC provider. (#6355) +- Added to `Web3Config` property `contractDataInputFill` allowing users to have the choice using property `data`, `input` or `both` for contract methods to be sent to the RPC provider when creating contracts. (#6377) + + +## [4.1.1] + +### Changed + +- The `events` property was added to the `receipt` object (#6410) + +## [4.1.2] + +### Changed + +- Dependencies updated + +## [4.1.3] + +### Fixed + +- Will populate `data` for transactions in contract for metamask provider instead of `input` (#6534) + +## [4.1.4] + +### Changed + +- By default, contracts will fill `data` instead of `input` within method calls (#6622) + +## [4.2.0] + +### Changed + +- Allow the `deploy` function to accept parameters, even when no ABI was provided to the `Contract`(#6635) + +### Fixed + +- Fix and error that happen when trying to get past events by calling `contract.getPastEvents` or `contract.events.allEvents()`, if there is no matching events. (#6647) +- Fixed: The Contract is not using the context wallet passed if context was passed at constructor. (#6661) + +## [4.3.0] + +### Added + +- Types `ContractDeploySend`, `ContractMethodSend`, `Web3PromiEvent` was exported (#6883) + +## [Unreleased] diff --git a/packages/web3-eth-contract/README.md b/packages/web3-eth-contract/README.md index c738ac33254..d3e752a9b97 100644 --- a/packages/web3-eth-contract/README.md +++ b/packages/web3-eth-contract/README.md @@ -1,48 +1,82 @@ -# web3-eth-contract +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Eth Contract Package -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This is the contract package used in the `web3-eth` package. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-eth-contract` contains the contract package used in `web3-eth`. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-eth-contract) or using [Yarn](https://yarnpkg.com/package/web3-eth-contract) + +### Using NPM ```bash npm install web3-eth-contract ``` +### Using Yarn + +```bash +yarn add web3-eth-contract +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + ## Usage -```js -const Web3EthContract = require('web3-eth-contract'); +You can initialize the typesafe Contract API instance with the following. + +```ts +import { Contract } from 'web3-eth-contract'; -// Set provider for all later instances to use -Web3EthContract.setProvider('ws://localhost:8546'); +const abi = [...] as const; -const contract = new Web3EthContract(jsonInterface, address); -contract.methods.somFunc().send({from: ....}) -.on('receipt', function(){ - ... -}); +const contract = new Contract(abi); ``` -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js +- We prefer that you use `web3.eth.Contract` API in normal usage. +- The use of `as const` is necessary to have fully type-safe interface for the contract. +- As the ABIs are not extensive in size, we suggest declaring them `as const` in your TS project. +- This approach is more flexible and seamless compared to other approaches of off-line compiling ABIs to TS interfaces (such as [TypeChain](https://github.com/dethcrypto/TypeChain). + +## Compatibility + +We have tested the TypeScript interface support for the ABIs compiled with solidity version `v0.4.x` and above. If you face any issue regarding the contract typing, please create an issue to report to us. + +The TypeScript support for fixed length array types are supported up 30 elements. See more details [here](https://github.com/ChainSafe/web3.js/blob/nh%2F4562-contract-typing/packages/web3-eth-abi/src/number_map_type.ts#L1). This limitation is only to provide more performant developer experience in IDEs. In future we may come up with a workaround to avoid this limitation. If you have any idea feel free to share. -## Types +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-eth-contract.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-eth-contract +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-contract%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-eth-contract -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-eth-contract -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-eth-contract -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-eth-contract -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-eth-contract +[downloads-image]: https://img.shields.io/npm/dm/web3-eth-contract?label=npm%20downloads diff --git a/packages/web3-eth-contract/assets/logo/web3js.ai b/packages/web3-eth-contract/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth-contract/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth-contract/assets/logo/web3js.jpg b/packages/web3-eth-contract/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth-contract/assets/logo/web3js.jpg differ diff --git a/packages/web3-eth-contract/assets/logo/web3js.svg b/packages/web3-eth-contract/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth-contract/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth-contract/cypress b/packages/web3-eth-contract/cypress new file mode 120000 index 00000000000..4a671a7beac --- /dev/null +++ b/packages/web3-eth-contract/cypress @@ -0,0 +1 @@ +../../templates/cypress \ No newline at end of file diff --git a/packages/web3-eth-contract/cypress.config.js b/packages/web3-eth-contract/cypress.config.js new file mode 120000 index 00000000000..8cd9ba29af0 --- /dev/null +++ b/packages/web3-eth-contract/cypress.config.js @@ -0,0 +1 @@ +../../templates/cypress.config.js \ No newline at end of file diff --git a/packages/web3-eth-contract/package-lock.json b/packages/web3-eth-contract/package-lock.json deleted file mode 100644 index c0ed72d8134..00000000000 --- a/packages/web3-eth-contract/package-lock.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "web3-eth-contract", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-eth-contract/package.json b/packages/web3-eth-contract/package.json index 2fdbc9c9d6b..0ccf9536c56 100644 --- a/packages/web3-eth-contract/package.json +++ b/packages/web3-eth-contract/package.json @@ -1,31 +1,74 @@ { - "name": "web3-eth-contract", - "version": "1.3.0", - "description": "Web3 module to interact with Ethereum smart contracts.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth-contract", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "@types/bn.js": "^4.11.5", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-eth-contract", + "version": "4.3.0", + "description": "Web3 module to interact with Ethereum smart contracts.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ethereum/web3.js/tree/4.x/packages/web3-eth-contract", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --runInBand --forceExit --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --runInBand --forceExit", + "test:e2e:electron": "npx cypress run --headless --browser electron --env grep='ignore',invert=true", + "test:e2e:chrome": "npx cypress run --headless --browser chrome --env grep='ignore',invert=true", + "test:e2e:firefox": "npx cypress run --headless --browser firefox --env grep='ignore',invert=true" + }, + "dependencies": { + "web3-core": "^4.3.2", + "web3-errors": "^1.1.4", + "web3-eth": "^4.5.0", + "web3-eth-abi": "^4.2.0", + "web3-types": "^1.5.0", + "web3-utils": "^4.2.2", + "web3-validator": "^2.0.5" + }, + "devDependencies": { + "@humeris/espresso-shot": "^4.0.0", + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "flatted": "^3.3.1", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4", + "web3-eth-accounts": "^4.1.1", + "web3-providers-ws": "^4.0.7" + } } diff --git a/packages/web3-eth-contract/src/constant.ts b/packages/web3-eth-contract/src/constant.ts new file mode 100644 index 00000000000..6be67ffb159 --- /dev/null +++ b/packages/web3-eth-contract/src/constant.ts @@ -0,0 +1,17 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export { ALL_EVENTS, ALL_EVENTS_ABI } from 'web3-eth'; diff --git a/packages/web3-eth-contract/src/contract.ts b/packages/web3-eth-contract/src/contract.ts new file mode 100644 index 00000000000..54b7e4e792d --- /dev/null +++ b/packages/web3-eth-contract/src/contract.ts @@ -0,0 +1,1377 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + Web3Context, + Web3EventEmitter, + Web3PromiEvent, + Web3ConfigEvent, + Web3SubscriptionManager, +} from 'web3-core'; +import { + ContractExecutionError, + ContractTransactionDataAndInputError, + SubscriptionError, + Web3ContractError, +} from 'web3-errors'; +import { + createAccessList, + call, + estimateGas, + getLogs, + sendTransaction, + decodeEventABI, + NewHeadsSubscription, + ALL_EVENTS, + ALL_EVENTS_ABI, + SendTransactionEvents, +} from 'web3-eth'; +import { + encodeEventSignature, + encodeFunctionSignature, + decodeContractErrorData, + isAbiErrorFragment, + isAbiEventFragment, + isAbiFunctionFragment, + jsonInterfaceMethodToString, +} from 'web3-eth-abi'; +import { + AbiConstructorFragment, + AbiErrorFragment, + AbiEventFragment, + AbiFragment, + AbiFunctionFragment, + ContractAbi, + ContractConstructorArgs, + ContractEvent, + ContractEvents, + ContractMethod, + ContractMethodInputParameters, + ContractMethodOutputParameters, + Address, + BlockNumberOrTag, + BlockTags, + Bytes, + EthExecutionAPI, + Filter, + FilterAbis, + HexString, + LogsInput, + Mutable, + ContractInitOptions, + NonPayableCallOptions, + PayableCallOptions, + DataFormat, + DEFAULT_RETURN_FORMAT, + Numbers, + Web3ValidationErrorObject, + EventLog, + ContractAbiWithSignature, + ContractOptions, + TransactionReceipt, + FormatType, +} from 'web3-types'; +import { + format, + isDataFormat, + keccak256, + toChecksumAddress, + isContractInitOptions, +} from 'web3-utils'; +import { + isNullish, + validator, + utils as validatorUtils, + ValidationSchemaInput, + Web3ValidatorError, +} from 'web3-validator'; +import { decodeMethodReturn, encodeEventABI, encodeMethodABI } from './encoding.js'; +import { LogsSubscription } from './log_subscription.js'; +import { + ContractEventOptions, + NonPayableMethodObject, + NonPayableTxOptions, + PayableMethodObject, + PayableTxOptions, + Web3ContractContext, +} from './types.js'; +import { + getCreateAccessListParams, + getEstimateGasParams, + getEthTxCallParams, + getSendTxParams, + isWeb3ContractContext, +} from './utils.js'; + +type ContractBoundMethod< + Abi extends AbiFunctionFragment, + Method extends ContractMethod = ContractMethod, +> = ( + ...args: Method['Inputs'] extends undefined | unknown ? any[] : Method['Inputs'] +) => Method['Abi']['stateMutability'] extends 'payable' | 'pure' + ? PayableMethodObject + : NonPayableMethodObject; + +export type ContractOverloadedMethodInputs> = NonNullable< + AbiArr extends readonly [] + ? undefined + : AbiArr extends readonly [infer A, ...infer R] + ? A extends AbiFunctionFragment + ? ContractMethodInputParameters | ContractOverloadedMethodInputs + : undefined + : undefined +>; + +export type ContractOverloadedMethodOutputs> = NonNullable< + AbiArr extends readonly [] + ? undefined + : AbiArr extends readonly [infer A, ...infer R] + ? A extends AbiFunctionFragment + ? ContractMethodOutputParameters | ContractOverloadedMethodOutputs + : undefined + : undefined +>; + +// To avoid circular dependency between types and encoding, declared these types here. +export type ContractMethodsInterface = { + [MethodAbi in FilterAbis< + Abi, + AbiFunctionFragment & { type: 'function' } + > as MethodAbi['name']]: ContractBoundMethod; + // To allow users to use method signatures + // eslint-disable-next-line @typescript-eslint/no-explicit-any +} & { [key: string]: ContractBoundMethod }; + +export type ContractMethodSend = Web3PromiEvent< + FormatType, + SendTransactionEvents +>; +export type ContractDeploySend = Web3PromiEvent< + // eslint-disable-next-line no-use-before-define + Contract, + SendTransactionEvents +>; + +/** + * @hidden + * The event object can be accessed from `myContract.events.myEvent`. + * + * \> Remember: To subscribe to an event, your provider must have support for subscriptions. + * + * ```ts + * const subscription = await myContract.events.MyEvent([options]) + * ``` + * + * @param options - The options used to subscribe for the event + * @returns - A Promise resolved with {@link LogsSubscription} object + */ +export type ContractBoundEvent = (options?: ContractEventOptions) => LogsSubscription; + +// To avoid circular dependency between types and encoding, declared these types here. +export type ContractEventsInterface< + Abi extends ContractAbi, + Events extends ContractEvents = ContractEvents, +> = { + [Name in keyof Events | 'allEvents']: ContractBoundEvent; +} & { + [key: string]: ContractBoundEvent; +}; + +// To avoid circular dependency between types and encoding, declared these types here. +export type ContractEventEmitterInterface = { + [EventAbi in FilterAbis< + Abi, + AbiFunctionFragment & { type: 'event' } + > as EventAbi['name']]: ContractEvent['Inputs']; +}; + +type EventParameters = Parameters[2]; + +const contractSubscriptions = { + logs: LogsSubscription, + newHeads: NewHeadsSubscription, + newBlockHeaders: NewHeadsSubscription, +}; + +/** + * The `web3.eth.Contract` makes it easy to interact with smart contracts on the ethereum blockchain. + * For using contract package, first install Web3 package using: `npm i web3` or `yarn add web3` based on your package manager, after that contracts features can be used as mentioned in following snippet. + * ```ts + * + * import { Web3 } from 'web3'; + * + * const web3 = new Web3('https://127.0.0.1:4545'); + * const abi = [...] as const; // your contract ABI + * + * let contract = new web3.eth.Contract(abi,'0xdAC17F958D2ee523a2206206994597C13D831ec7'); + * await contract.methods.balanceOf('0xdAC17F958D2ee523a2206206994597C13D831ec7').call(); + * ``` + * For using individual package install `web3-eth-contract` and `web3-core` packages using: `npm i web3-eth-contract web3-core` or `yarn add web3-eth-contract web3-core`. This is more efficient approach for building lightweight applications. + * ```ts + * + * import { Web3Context } from 'web3-core'; + * import { Contract } from 'web3-eth-contract'; + * + * const abi = [...] as const; // your contract ABI + * + * let contract = new web3.eth.Contract( + * abi, + * '0xdAC17F958D2ee523a2206206994597C13D831ec7' + * new Web3Context('http://127.0.0.1:8545')); + * + * await contract.methods.balanceOf('0xdAC17F958D2ee523a2206206994597C13D831ec7').call(); + * ``` + * ## Generated Methods + * Following methods are generated by web3.js contract object for each of contract functions by using its ABI. + * + * ### send + * This is used to send a transaction to the smart contract and execute its method. Note this can alter the smart contract state. + * + * #### Parameters + * options?: PayableTxOptions | NonPayableTxOptions + * + * #### Returns + * [Web3PromiEvent](/api/web3/namespace/core#Web3PromiEvent) : Web3 Promi Event + * + * ```ts + * // using the promise + * myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) + * .then(function(receipt){ + * // other parts of code to use receipt + * }); + * + * + * // using the event emitter + * myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) + * .on('transactionHash', function(hash){ + * // ... + * }) + * .on('confirmation', function(confirmationNumber, receipt){ + * // ... + * }) + * .on('receipt', function(receipt){ + * // ... + * }) + * .on('error', function(error, receipt) { + * // ... + * }); + * + * ``` + * + * ### call + * This will execute smart contract method in the EVM without sending any transaction. Note calling cannot alter the smart contract state. + * + * #### Parameters + * options?: PayableCallOptions | NonPayableCallOptions, + * block?: BlockNumberOrTag, + * + * #### Returns + * Promise : having results of call + * + * ```ts + * + * let myContract = new web3.eth.Contract(abi, address); + * + * myContract.methods.myFunction().call() + * .then(console.log); + * + * ``` + * ### estimateGas + * Returns the amount of gas consumed by executing the method in EVM without creating a new transaction on the blockchain. The returned amount can be used as a gas estimate for executing the transaction publicly. The actual gas used can be different when sending the transaction later, as the state of the smart contract can be different at that time. + * + * #### Parameters + * options?: PayableCallOptions, + * returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + * + * #### Returns + * Promise: The gas amount estimated. + * + * ```ts + * const estimatedGas = await contract.methods.approve('0xdAC17F958D2ee523a2206206994597C13D831ec7', 300) + * .estimateGas(); + * + * ``` + * + * ### encodeABI + * Encodes the ABI for this method. The resulting hex string is 32-bit function signature hash plus the passed parameters in Solidity tightly packed format. This can be used to send a transaction, call a method, or pass it into another smart contract’s method as arguments. Set the data field on web3.eth.sendTransaction options as the encodeABI() result and it is the same as calling the contract method with contract.myMethod.send(). + * + * Some use cases for encodeABI() include: preparing a smart contract transaction for a multisignature wallet, working with offline wallets and cold storage and creating transaction payload for complex smart contract proxy calls. + * + * #### Parameters + * None + * + * #### Returns + * String: The encoded ABI. + * + * ```ts + * const encodedABI = await contract.methods.approve('0xdAC17F958D2ee523a2206206994597C13D831ec7', 300) + * .encodeABI(); + * + * ``` + * + * ### createAccessList + * This will create an access list a method execution will access when executed in the EVM. + * Note: You must specify a from address and gas if it’s not specified in options when instantiating parent contract object. + * + * #### Parameters + * options?: PayableCallOptions | NonPayableCallOptions, + * block?: BlockNumberOrTag, + * + * #### Returns + * Promise: The generated access list for transaction. + * + * ```ts + * const accessList = await contract.methods.approve('0xbEe634C21c16F05B03B704BaE071536121e6cFeA', 300) + * .createAccessList({ + * from: "0x9992695e1053bb737d3cfae4743dcfc4b94f203d" + * }); + * ``` + * + */ +export class Contract + extends Web3Context + implements Web3EventEmitter> +{ + /** + * The options `object` for the contract instance. `from`, `gas` and `gasPrice` are used as fallback values when sending transactions. + * + * ```ts + * myContract.options; + * > { + * address: '0x1234567890123456789012345678901234567891', + * jsonInterface: [...], + * from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', + * gasPrice: '10000000000000', + * gas: 1000000 + * } + * + * myContract.options.from = '0x1234567890123456789012345678901234567891'; // default from address + * myContract.options.gasPrice = '20000000000000'; // default gas price in wei + * myContract.options.gas = 5000000; // provide as fallback always 5M gas + * ``` + */ + + public readonly options: ContractOptions; + + /** + * Set to true if you want contracts' defaults to sync with global defaults. + */ + public syncWithContext = false; + + private _errorsInterface!: AbiErrorFragment[]; + private _jsonInterface!: ContractAbiWithSignature; + private _address?: Address; + private _functions: Record< + string, + { + signature: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + method: ContractBoundMethod; + } + > = {}; + private readonly _overloadedMethodAbis: Map; + private _methods!: ContractMethodsInterface; + private _events!: ContractEventsInterface; + /** + * Set property to `data`, `input`, or `both` to change the property of the contract being sent to the + * RPC provider when using contract methods. + * Default is `input` + */ + + private context?: Web3Context; + /** + * Creates a new contract instance with all its methods and events defined in its ABI provided. + * + * ```ts + * new web3.eth.Contract(jsonInterface[, address][, options]) + * ``` + * + * @param jsonInterface - The JSON interface for the contract to instantiate. + * @param address - The address of the smart contract to call. + * @param options - The options of the contract. Some are used as fallbacks for calls and transactions. + * @param context - The context of the contract used for customizing the behavior of the contract. + * @returns - The contract instance with all its methods and events. + * + * ```ts title="Example" + * var myContract = new web3.eth.Contract([...], '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', { + * from: '0x1234567890123456789012345678901234567891', // default from address + * gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case + * }); + * ``` + * + * To use the type safe interface for these contracts you have to include the ABI definitions in your TypeScript project and then declare these as `const`. + * + * ```ts title="Example" + * const myContractAbi = [....] as const; // ABI definitions + * const myContract = new web3.eth.Contract(myContractAbi, '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'); + * ``` + */ + public constructor( + jsonInterface: Abi, + context?: Web3ContractContext | Web3Context, + returnFormat?: DataFormat, + ); + public constructor( + jsonInterface: Abi, + address?: Address, + contextOrReturnFormat?: Web3ContractContext | Web3Context | DataFormat, + returnFormat?: DataFormat, + ); + public constructor( + jsonInterface: Abi, + options?: ContractInitOptions, + contextOrReturnFormat?: Web3ContractContext | Web3Context | DataFormat, + returnFormat?: DataFormat, + ); + public constructor( + jsonInterface: Abi, + address: Address | undefined, + options: ContractInitOptions, + contextOrReturnFormat?: Web3ContractContext | Web3Context | DataFormat, + returnFormat?: DataFormat, + ); + public constructor( + jsonInterface: Abi, + addressOrOptionsOrContext?: + | Address + | ContractInitOptions + | Web3ContractContext + | Web3Context, + optionsOrContextOrReturnFormat?: + | ContractInitOptions + | Web3ContractContext + | Web3Context + | DataFormat, + contextOrReturnFormat?: Web3ContractContext | Web3Context | DataFormat, + returnFormat?: DataFormat, + ) { + // eslint-disable-next-line no-nested-ternary + const options = isContractInitOptions(addressOrOptionsOrContext) + ? addressOrOptionsOrContext + : isContractInitOptions(optionsOrContextOrReturnFormat) + ? optionsOrContextOrReturnFormat + : undefined; + + let contractContext; + if (isWeb3ContractContext(addressOrOptionsOrContext)) { + contractContext = addressOrOptionsOrContext; + } else if (isWeb3ContractContext(optionsOrContextOrReturnFormat)) { + contractContext = optionsOrContextOrReturnFormat; + } else { + contractContext = contextOrReturnFormat; + } + + let provider; + if ( + typeof addressOrOptionsOrContext === 'object' && + 'provider' in addressOrOptionsOrContext + ) { + provider = addressOrOptionsOrContext.provider; + } else if ( + typeof optionsOrContextOrReturnFormat === 'object' && + 'provider' in optionsOrContextOrReturnFormat + ) { + provider = optionsOrContextOrReturnFormat.provider; + } else if ( + typeof contextOrReturnFormat === 'object' && + 'provider' in contextOrReturnFormat + ) { + provider = contextOrReturnFormat.provider; + } else { + provider = Contract.givenProvider; + } + + super({ + ...contractContext, + provider, + registeredSubscriptions: contractSubscriptions, + }); + + // Init protected properties + if ((contractContext as Web3Context)?.wallet) { + this._wallet = (contractContext as Web3Context).wallet; + } + if ((contractContext as Web3Context)?.accountProvider) { + this._accountProvider = (contractContext as Web3Context).accountProvider; + } + + if ( + !isNullish(options) && + !isNullish(options.data) && + !isNullish(options.input) && + this.config.contractDataInputFill !== 'both' + ) + throw new ContractTransactionDataAndInputError({ + data: options.data as HexString, + input: options.input as HexString, + }); + this._overloadedMethodAbis = new Map(); + + // eslint-disable-next-line no-nested-ternary + const returnDataFormat = isDataFormat(contextOrReturnFormat) + ? contextOrReturnFormat + : isDataFormat(optionsOrContextOrReturnFormat) + ? optionsOrContextOrReturnFormat + : returnFormat ?? DEFAULT_RETURN_FORMAT; + const address = + typeof addressOrOptionsOrContext === 'string' ? addressOrOptionsOrContext : undefined; + this.config.contractDataInputFill = + (options as ContractInitOptions)?.dataInputFill ?? this.config.contractDataInputFill; + this._parseAndSetJsonInterface(jsonInterface, returnDataFormat); + + if (!isNullish(address)) { + this._parseAndSetAddress(address, returnDataFormat); + } + + this.options = { + address, + jsonInterface: this._jsonInterface, + gas: options?.gas ?? options?.gasLimit, + gasPrice: options?.gasPrice, + from: options?.from, + input: options?.input, + data: options?.data, + }; + + this.syncWithContext = (options as ContractInitOptions)?.syncWithContext ?? false; + if (contractContext instanceof Web3Context) { + this.subscribeToContextEvents(contractContext); + } + Object.defineProperty(this.options, 'address', { + set: (value: Address) => this._parseAndSetAddress(value, returnDataFormat), + get: () => this._address, + }); + + Object.defineProperty(this.options, 'jsonInterface', { + set: (value: ContractAbi) => this._parseAndSetJsonInterface(value, returnDataFormat), + get: () => this._jsonInterface, + }); + + if (contractContext instanceof Web3Context) { + contractContext.on(Web3ConfigEvent.CONFIG_CHANGE, event => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + this.setConfig({ [event.name]: event.newValue }); + }); + } + } + + /** + * Subscribe to an event. + * + * ```ts + * await myContract.events.MyEvent([options]) + * ``` + * + * There is a special event `allEvents` that can be used to subscribe all events. + * + * ```ts + * await myContract.events.allEvents([options]) + * ``` + * + * @returns - When individual event is accessed will returns {@link ContractBoundEvent} object + */ + public get events() { + return this._events; + } + + /** + * Creates a transaction object for that method, which then can be `called`, `send`, `estimated`, `createAccessList` , or `ABI encoded`. + * + * The methods of this smart contract are available through: + * + * The name: `myContract.methods.myMethod(123)` + * The name with parameters: `myContract.methods['myMethod(uint256)'](123)` + * The signature `myContract.methods['0x58cf5f10'](123)` + * + * This allows calling functions with same name but different parameters from the JavaScript contract object. + * + * \> The method signature does not provide a type safe interface, so we recommend to use method `name` instead. + * + * ```ts + * // calling a method + * const result = await myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * // or sending and using a promise + * const receipt = await myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * // or sending and using the events + * const sendObject = myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * sendObject.on('transactionHash', function(hash){ + * ... + * }); + * sendObject.on('receipt', function(receipt){ + * ... + * }); + * sendObject.on('confirmation', function(confirmationNumber, receipt){ + * ... + * }); + * sendObject.on('error', function(error, receipt) { + * ... + * }); + * ``` + * + * @returns - Either returns {@link PayableMethodObject} or {@link NonPayableMethodObject} based on the definitions of the ABI of that contract. + */ + public get methods() { + return this._methods; + } + + /** + * Clones the current contract instance. This doesn't deploy contract on blockchain and only creates a local clone. + * + * @returns - The new contract instance. + * + * ```ts + * const contract1 = new web3.eth.Contract(abi, address, {gasPrice: '12345678', from: fromAddress}); + * + * const contract2 = contract1.clone(); + * contract2.options.address = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; + * + * (contract1.options.address !== contract2.options.address); + * > true + * ``` + */ + public clone() { + let newContract: Contract; + if (this.options.address) { + newContract = new Contract( + [...this._jsonInterface, ...this._errorsInterface] as unknown as Abi, + this.options.address, + { + gas: this.options.gas, + gasPrice: this.options.gasPrice, + from: this.options.from, + input: this.options.input, + data: this.options.data, + provider: this.currentProvider, + syncWithContext: this.syncWithContext, + dataInputFill: this.config.contractDataInputFill, + }, + this.getContextObject(), + ); + } else { + newContract = new Contract( + [...this._jsonInterface, ...this._errorsInterface] as unknown as Abi, + { + gas: this.options.gas, + gasPrice: this.options.gasPrice, + from: this.options.from, + input: this.options.input, + data: this.options.data, + provider: this.currentProvider, + syncWithContext: this.syncWithContext, + dataInputFill: this.config.contractDataInputFill, + }, + this.getContextObject(), + ); + } + if (this.context) newContract.subscribeToContextEvents(this.context); + + return newContract; + } + + /** + * Call this function to deploy the contract to the blockchain. After successful deployment the promise will resolve with a new contract instance. + * + * ```ts + * myContract.deploy({ + * input: '0x12345...', // data keyword can be used, too. + * arguments: [123, 'My String'] + * }) + * .send({ + * from: '0x1234567890123456789012345678901234567891', + * gas: 1500000, + * gasPrice: '30000000000000' + * }, function(error, transactionHash){ ... }) + * .on('error', function(error){ ... }) + * .on('transactionHash', function(transactionHash){ ... }) + * .on('receipt', function(receipt){ + * console.log(receipt.contractAddress) // contains the new contract address + * }) + * .on('confirmation', function(confirmationNumber, receipt){ ... }) + * .then(function(newContractInstance){ + * console.log(newContractInstance.options.address) // instance with the new contract address + * }); + * + * + * // When the data is already set as an option to the contract itself + * myContract.options.data = '0x12345...'; + * + * myContract.deploy({ + * arguments: [123, 'My String'] + * }) + * .send({ + * from: '0x1234567890123456789012345678901234567891', + * gas: 1500000, + * gasPrice: '30000000000000' + * }) + * .then(function(newContractInstance){ + * console.log(newContractInstance.options.address) // instance with the new contract address + * }); + * + * + * // Simply encoding + * myContract.deploy({ + * input: '0x12345...', + * arguments: [123, 'My String'] + * }) + * .encodeABI(); + * > '0x12345...0000012345678765432' + * + * + * // Gas estimation + * myContract.deploy({ + * input: '0x12345...', + * arguments: [123, 'My String'] + * }) + * .estimateGas(function(err, gas){ + * console.log(gas); + * }); + * ``` + * + * @returns - The transaction object + */ + public deploy(deployOptions?: { + /** + * The byte code of the contract. + */ + data?: HexString; + input?: HexString; + /** + * The arguments which get passed to the constructor on deployment. + */ + arguments?: ContractConstructorArgs; + }) { + let abi = this._jsonInterface.find(j => j.type === 'constructor') as AbiConstructorFragment; + if (!abi) { + abi = { + type: 'constructor', + stateMutability: '', + } as AbiConstructorFragment; + } + + const _input = format( + { format: 'bytes' }, + deployOptions?.input ?? this.options.input, + DEFAULT_RETURN_FORMAT, + ); + + const _data = format( + { format: 'bytes' }, + deployOptions?.data ?? this.options.data, + DEFAULT_RETURN_FORMAT, + ); + + if ((!_input || _input.trim() === '0x') && (!_data || _data.trim() === '0x')) { + throw new Web3ContractError('contract creation without any data provided.'); + } + + const args = deployOptions?.arguments ?? []; + + const contractOptions: ContractOptions = { ...this.options, input: _input, data: _data }; + const deployData = _input ?? _data; + return { + arguments: args, + send: (options?: PayableTxOptions): ContractDeploySend => { + const modifiedOptions = { ...options }; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return this._contractMethodDeploySend( + abi as AbiFunctionFragment, + args as unknown[], + modifiedOptions, + contractOptions, + ); + }, + estimateGas: async ( + options?: PayableCallOptions, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) => { + const modifiedOptions = { ...options }; + return this._contractMethodEstimateGas({ + abi: abi as AbiFunctionFragment, + params: args as unknown[], + returnFormat, + options: modifiedOptions, + contractOptions, + }); + }, + encodeABI: () => + encodeMethodABI( + abi as AbiFunctionFragment, + args as unknown[], + format({ format: 'bytes' }, deployData as Bytes, DEFAULT_RETURN_FORMAT), + ), + }; + } + + /** + * Gets past events for this contract. + * + * ```ts + * const events = await myContract.getPastEvents('MyEvent', { + * filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23 + * fromBlock: 0, + * toBlock: 'latest' + * }); + * + * > [{ + * returnValues: { + * myIndexedParam: 20, + * myOtherIndexedParam: '0x123456789...', + * myNonIndexParam: 'My String' + * }, + * raw: { + * data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] + * }, + * event: 'MyEvent', + * signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * logIndex: 0, + * transactionIndex: 0, + * transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * blockNumber: 1234, + * address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' + * },{ + * ... + * }] + * ``` + * + * @param eventName - The name of the event in the contract, or `allEvents` to get all events. + * @param filter - The filter options used to get events. + * @param returnFormat - Return format + * @returns - An array with the past event `Objects`, matching the given event name and filter. + */ + public async getPastEvents( + returnFormat?: ReturnFormat, + ): Promise<(string | EventLog)[]>; + public async getPastEvents( + eventName: keyof ContractEvents | 'allEvents' | 'ALLEVENTS', + returnFormat?: ReturnFormat, + ): Promise<(string | EventLog)[]>; + public async getPastEvents( + filter: Omit, + returnFormat?: ReturnFormat, + ): Promise<(string | EventLog)[]>; + public async getPastEvents( + eventName: keyof ContractEvents | 'allEvents' | 'ALLEVENTS', + filter: Omit, + returnFormat?: ReturnFormat, + ): Promise<(string | EventLog)[]>; + public async getPastEvents( + param1?: + | keyof ContractEvents + | 'allEvents' + | 'ALLEVENTS' + | Omit + | ReturnFormat, + param2?: Omit | ReturnFormat, + param3?: ReturnFormat, + ): Promise<(string | EventLog)[]> { + const eventName = typeof param1 === 'string' ? param1 : ALL_EVENTS; + + const options = + // eslint-disable-next-line no-nested-ternary + typeof param1 !== 'string' && !isDataFormat(param1) + ? param1 + : !isDataFormat(param2) + ? param2 + : {}; + + // eslint-disable-next-line no-nested-ternary + const returnFormat = isDataFormat(param1) + ? param1 + : isDataFormat(param2) + ? param2 + : param3 ?? DEFAULT_RETURN_FORMAT; + + const abi = + eventName === 'allEvents' || eventName === ALL_EVENTS + ? ALL_EVENTS_ABI + : (this._jsonInterface.find( + j => 'name' in j && j.name === eventName, + ) as AbiEventFragment & { signature: string }); + + if (!abi) { + throw new Web3ContractError(`Event ${eventName} not found.`); + } + + const { fromBlock, toBlock, topics, address } = encodeEventABI( + this.options, + abi, + options ?? {}, + ); + + const logs = await getLogs(this, { fromBlock, toBlock, topics, address }, returnFormat); + const decodedLogs = logs + ? logs.map(log => + typeof log === 'string' + ? log + : decodeEventABI(abi, log as LogsInput, this._jsonInterface, returnFormat), + ) + : []; + + const filter = options?.filter ?? {}; + const filterKeys = Object.keys(filter); + + if (filterKeys.length > 0) { + return decodedLogs.filter(log => { + if (typeof log === 'string') return true; + + return filterKeys.every((key: string) => { + if (Array.isArray(filter[key])) { + return (filter[key] as Numbers[]).some( + (v: Numbers) => + String(log.returnValues[key]).toUpperCase() === + String(v).toUpperCase(), + ); + } + + const inputAbi = abi.inputs?.filter(input => input.name === key)[0]; + if (inputAbi?.indexed && inputAbi.type === 'string') { + const hashedIndexedString = keccak256(filter[key] as string); + if (hashedIndexedString === String(log.returnValues[key])) return true; + } + + return ( + String(log.returnValues[key]).toUpperCase() === + String(filter[key]).toUpperCase() + ); + }); + }); + } + + return decodedLogs; + } + + private _parseAndSetAddress(value?: Address, returnFormat: DataFormat = DEFAULT_RETURN_FORMAT) { + this._address = value + ? toChecksumAddress(format({ format: 'address' }, value, returnFormat)) + : value; + } + + private _parseAndSetJsonInterface( + abis: ContractAbi, + returnFormat: DataFormat = DEFAULT_RETURN_FORMAT, + ) { + this._functions = {}; + this._methods = {} as ContractMethodsInterface; + this._events = {} as ContractEventsInterface; + + let result: ContractAbi = []; + + const functionsAbi = abis.filter(abi => abi.type !== 'error'); + const errorsAbi = abis.filter(abi => + isAbiErrorFragment(abi), + ) as unknown as AbiErrorFragment[]; + + for (const a of functionsAbi) { + const abi: Mutable = { + ...a, + signature: '', + }; + + if (isAbiFunctionFragment(abi)) { + const methodName = jsonInterfaceMethodToString(abi); + const methodSignature = encodeFunctionSignature(methodName); + abi.signature = methodSignature; + + // make constant and payable backwards compatible + abi.constant = + abi.stateMutability === 'view' ?? + abi.stateMutability === 'pure' ?? + abi.constant; + + abi.payable = abi.stateMutability === 'payable' ?? abi.payable; + this._overloadedMethodAbis.set(abi.name, [ + ...(this._overloadedMethodAbis.get(abi.name) ?? []), + abi, + ]); + const abiFragment = this._overloadedMethodAbis.get(abi.name) ?? []; + const contractMethod = this._createContractMethod< + typeof abiFragment, + AbiErrorFragment + >(abiFragment, errorsAbi); + + this._functions[methodName] = { + signature: methodSignature, + method: contractMethod, + }; + + // We don't know a particular type of the Abi method so can't type check + this._methods[abi.name as keyof ContractMethodsInterface] = this._functions[ + methodName + ].method as never; + + // We don't know a particular type of the Abi method so can't type check + this._methods[methodName as keyof ContractMethodsInterface] = this._functions[ + methodName + ].method as never; + + // We don't know a particular type of the Abi method so can't type check + this._methods[methodSignature as keyof ContractMethodsInterface] = this + ._functions[methodName].method as never; + } else if (isAbiEventFragment(abi)) { + const eventName = jsonInterfaceMethodToString(abi); + const eventSignature = encodeEventSignature(eventName); + const event = this._createContractEvent(abi, returnFormat); + abi.signature = eventSignature; + + if (!(eventName in this._events) || abi.name === 'bound') { + // It's a private type and we don't want to expose it and no need to check + this._events[eventName as keyof ContractEventsInterface] = event as never; + } + // It's a private type and we don't want to expose it and no need to check + this._events[abi.name as keyof ContractEventsInterface] = event as never; + // It's a private type and we don't want to expose it and no need to check + this._events[eventSignature as keyof ContractEventsInterface] = event as never; + } + + result = [...result, abi]; + } + + this._events.allEvents = this._createContractEvent(ALL_EVENTS_ABI, returnFormat); + this._jsonInterface = [...result] as unknown as ContractAbiWithSignature; + this._errorsInterface = errorsAbi; + } + + // eslint-disable-next-line class-methods-use-this + private _getAbiParams(abi: AbiFunctionFragment, params: unknown[]): Array { + try { + return validatorUtils.transformJsonDataToAbiFormat(abi.inputs ?? [], params); + } catch (error) { + throw new Web3ContractError( + `Invalid parameters for method ${abi.name}: ${(error as Error).message}`, + ); + } + } + + private _createContractMethod( + abiArr: T, + errorsAbis: E[], + ): ContractBoundMethod { + const abi = abiArr[abiArr.length - 1]; + return (...params: unknown[]) => { + let abiParams!: Array; + const abis = this._overloadedMethodAbis.get(abi.name) ?? []; + let methodAbi: AbiFunctionFragment = abis[0]; + const internalErrorsAbis = errorsAbis; + + const arrayOfAbis: AbiFunctionFragment[] = abis.filter( + _abi => (_abi.inputs ?? []).length === params.length, + ); + + if (abis.length === 1 || arrayOfAbis.length === 0) { + abiParams = this._getAbiParams(methodAbi, params); + validator.validate(abi.inputs ?? [], abiParams); + } else { + const errors: Web3ValidationErrorObject[] = []; + + for (const _abi of arrayOfAbis) { + try { + abiParams = this._getAbiParams(_abi, params); + validator.validate( + _abi.inputs as unknown as ValidationSchemaInput, + abiParams, + ); + methodAbi = _abi; + break; + } catch (e) { + errors.push(e as Web3ValidationErrorObject); + } + } + if (errors.length === arrayOfAbis.length) { + throw new Web3ValidatorError(errors); + } + } + const methods = { + arguments: abiParams, + + call: async ( + options?: PayableCallOptions | NonPayableCallOptions, + block?: BlockNumberOrTag, + ) => + this._contractMethodCall( + methodAbi, + abiParams, + internalErrorsAbis, + options, + block, + ), + + send: (options?: PayableTxOptions | NonPayableTxOptions): ContractMethodSend => + this._contractMethodSend(methodAbi, abiParams, internalErrorsAbis, options), + + estimateGas: async ( + options?: PayableCallOptions | NonPayableCallOptions, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) => + this._contractMethodEstimateGas({ + abi: methodAbi, + params: abiParams, + returnFormat, + options, + }), + + encodeABI: () => encodeMethodABI(methodAbi, abiParams), + + createAccessList: async ( + options?: PayableCallOptions | NonPayableCallOptions, + block?: BlockNumberOrTag, + ) => + this._contractMethodCreateAccessList( + methodAbi, + abiParams, + internalErrorsAbis, + options, + block, + ), + }; + + if (methodAbi.stateMutability === 'payable') { + return methods as PayableMethodObject< + ContractOverloadedMethodInputs, + ContractOverloadedMethodOutputs + >; + } + return methods as NonPayableMethodObject< + ContractOverloadedMethodInputs, + ContractOverloadedMethodOutputs + >; + }; + } + + private async _contractMethodCall( + abi: AbiFunctionFragment, + params: unknown[], + errorsAbi: AbiErrorFragment[], + options?: Options, + block?: BlockNumberOrTag, + ) { + const tx = getEthTxCallParams({ + abi, + params, + options: { + ...options, + dataInputFill: this.config.contractDataInputFill, + }, + contractOptions: { + ...this.options, + from: this.options.from ?? this.config.defaultAccount, + }, + }); + try { + const result = await call(this, tx, block, DEFAULT_RETURN_FORMAT); + return decodeMethodReturn(abi, result); + } catch (error: unknown) { + if (error instanceof ContractExecutionError) { + // this will parse the error data by trying to decode the ABI error inputs according to EIP-838 + decodeContractErrorData(errorsAbi, error.cause); + } + throw error; + } + } + + private async _contractMethodCreateAccessList< + Options extends PayableCallOptions | NonPayableCallOptions, + >( + abi: AbiFunctionFragment, + params: unknown[], + errorsAbi: AbiErrorFragment[], + options?: Options, + block?: BlockNumberOrTag, + ) { + const tx = getCreateAccessListParams({ + abi, + params, + options: { ...options, dataInputFill: this.config.contractDataInputFill }, + contractOptions: { + ...this.options, + from: this.options.from ?? this.config.defaultAccount, + }, + }); + + try { + return createAccessList(this, tx, block, DEFAULT_RETURN_FORMAT); + } catch (error: unknown) { + if (error instanceof ContractExecutionError) { + // this will parse the error data by trying to decode the ABI error inputs according to EIP-838 + decodeContractErrorData(errorsAbi, error.cause); + } + throw error; + } + } + + private _contractMethodSend( + abi: AbiFunctionFragment, + params: unknown[], + errorsAbi: AbiErrorFragment[], + options?: Options, + contractOptions?: ContractOptions, + ) { + let modifiedContractOptions = contractOptions ?? this.options; + modifiedContractOptions = { + ...modifiedContractOptions, + input: undefined, + from: modifiedContractOptions.from ?? this.defaultAccount ?? undefined, + }; + const tx = getSendTxParams({ + abi, + params, + options: { ...options, dataInputFill: this.config.contractDataInputFill }, + contractOptions: modifiedContractOptions, + }); + + const transactionToSend = sendTransaction(this, tx, DEFAULT_RETURN_FORMAT, { + // TODO Should make this configurable by the user + checkRevertBeforeSending: false, + contractAbi: this._jsonInterface, + }); + + // eslint-disable-next-line no-void + void transactionToSend.on('error', (error: unknown) => { + if (error instanceof ContractExecutionError) { + // this will parse the error data by trying to decode the ABI error inputs according to EIP-838 + decodeContractErrorData(errorsAbi, error.cause); + } + }); + return transactionToSend; + } + + private _contractMethodDeploySend( + abi: AbiFunctionFragment, + params: unknown[], + options?: Options, + contractOptions?: ContractOptions, + ) { + let modifiedContractOptions = contractOptions ?? this.options; + modifiedContractOptions = { + ...modifiedContractOptions, + from: modifiedContractOptions.from ?? this.defaultAccount ?? undefined, + }; + const tx = getSendTxParams({ + abi, + params, + options: { ...options, dataInputFill: this.config.contractDataInputFill }, + contractOptions: modifiedContractOptions, + }); + return sendTransaction(this, tx, DEFAULT_RETURN_FORMAT, { + transactionResolver: receipt => { + if (receipt.status === BigInt(0)) { + throw new Web3ContractError("code couldn't be stored", receipt); + } + + const newContract = this.clone(); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + newContract.options.address = receipt.contractAddress; + return newContract; + }, + contractAbi: this._jsonInterface, + // TODO Should make this configurable by the user + checkRevertBeforeSending: false, + }); + } + + private async _contractMethodEstimateGas< + Options extends PayableCallOptions | NonPayableCallOptions, + ReturnFormat extends DataFormat, + >({ + abi, + params, + returnFormat, + options, + contractOptions, + }: { + abi: AbiFunctionFragment; + params: unknown[]; + returnFormat: ReturnFormat; + options?: Options; + contractOptions?: ContractOptions; + }) { + const tx = getEstimateGasParams({ + abi, + params, + options: { ...options, dataInputFill: this.config.contractDataInputFill }, + contractOptions: contractOptions ?? this.options, + }); + return estimateGas(this, tx, BlockTags.LATEST, returnFormat); + } + + // eslint-disable-next-line class-methods-use-this + private _createContractEvent( + abi: AbiEventFragment & { signature: HexString }, + returnFormat: DataFormat = DEFAULT_RETURN_FORMAT, + ): ContractBoundEvent { + return (...params: unknown[]) => { + const { topics, fromBlock } = encodeEventABI( + this.options, + abi, + params[0] as EventParameters, + ); + const sub = new LogsSubscription( + { + address: this.options.address, + topics, + abi, + jsonInterface: this._jsonInterface, + }, + { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + subscriptionManager: this.subscriptionManager as Web3SubscriptionManager< + unknown, + any + >, + returnFormat, + }, + ); + if (!isNullish(fromBlock)) { + // emit past events when fromBlock is defined + this.getPastEvents(abi.name, { fromBlock, topics }, returnFormat) + .then(logs => { + if (logs) { + logs.forEach(log => sub.emit('data', log as EventLog)); + } + }) + .catch((error: Error) => { + sub.emit( + 'error', + new SubscriptionError('Failed to get past events.', error), + ); + }); + } + this.subscriptionManager?.addSubscription(sub).catch((error: Error) => { + sub.emit('error', new SubscriptionError('Failed to subscribe.', error)); + }); + + return sub; + }; + } + + protected subscribeToContextEvents(context: T): void { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const contractThis = this; + this.context = context; + + if (contractThis.syncWithContext) { + context.on(Web3ConfigEvent.CONFIG_CHANGE, event => { + contractThis.setConfig({ [event.name]: event.newValue }); + }); + } + } +} diff --git a/packages/web3-eth-contract/src/encoding.ts b/packages/web3-eth-contract/src/encoding.ts new file mode 100644 index 00000000000..45965262f84 --- /dev/null +++ b/packages/web3-eth-contract/src/encoding.ts @@ -0,0 +1,181 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { format, isNullish, keccak256 } from 'web3-utils'; + +import { + AbiConstructorFragment, + AbiEventFragment, + AbiFunctionFragment, + Filter, + HexString, + Topic, + FMT_NUMBER, + FMT_BYTES, + ContractOptions, +} from 'web3-types'; + +import { + decodeParameters, + encodeEventSignature, + encodeFunctionSignature, + encodeParameter, + encodeParameters, + inferTypesAndEncodeParameters, + isAbiConstructorFragment, + jsonInterfaceMethodToString, +} from 'web3-eth-abi'; + +import { blockSchema, ALL_EVENTS } from 'web3-eth'; +import { Web3ContractError } from 'web3-errors'; + +export { decodeEventABI } from 'web3-eth'; + +type Writeable = { -readonly [P in keyof T]: T[P] }; +export const encodeEventABI = ( + { address }: ContractOptions, + event: AbiEventFragment & { signature: string }, + options?: Filter, +) => { + const topics = options?.topics; + const filter = options?.filter ?? {}; + const opts: Writeable = {}; + + if (!isNullish(options?.fromBlock)) { + opts.fromBlock = format(blockSchema.properties.number, options?.fromBlock, { + number: FMT_NUMBER.HEX, + bytes: FMT_BYTES.HEX, + }); + } + if (!isNullish(options?.toBlock)) { + opts.toBlock = format(blockSchema.properties.number, options?.toBlock, { + number: FMT_NUMBER.HEX, + bytes: FMT_BYTES.HEX, + }); + } + + if (topics && Array.isArray(topics)) { + opts.topics = [...topics] as Topic[]; + } else { + opts.topics = []; + // add event signature + if (event && !event.anonymous && ![ALL_EVENTS, 'allEvents'].includes(event.name)) { + opts.topics.push( + event.signature ?? encodeEventSignature(jsonInterfaceMethodToString(event)), + ); + } + + // add event topics (indexed arguments) + if (![ALL_EVENTS, 'allEvents'].includes(event.name) && event.inputs) { + for (const input of event.inputs) { + if (!input.indexed) { + continue; + } + + const value = filter[input.name]; + if (!value) { + // eslint-disable-next-line no-null/no-null + opts.topics.push(null); + continue; + } + + // TODO: https://github.com/ethereum/web3.js/issues/344 + // TODO: deal properly with components + if (Array.isArray(value)) { + opts.topics.push(value.map(v => encodeParameter(input.type, v))); + } else if (input.type === 'string') { + opts.topics.push(keccak256(value as string)); + } else { + opts.topics.push(encodeParameter(input.type, value)); + } + } + } + } + + if (!opts.topics.length) delete opts.topics; + + if (address) { + opts.address = address.toLowerCase(); + } + + return opts; +}; + +export const encodeMethodABI = ( + abi: AbiFunctionFragment | AbiConstructorFragment, + args: unknown[], + deployData?: HexString, +) => { + const inputLength = Array.isArray(abi.inputs) ? abi.inputs.length : 0; + if (abi.inputs && inputLength !== args.length) { + throw new Web3ContractError( + `The number of arguments is not matching the methods required number. You need to pass ${inputLength} arguments.`, + ); + } + + let params: string; + if (abi.inputs) { + params = encodeParameters(Array.isArray(abi.inputs) ? abi.inputs : [], args).replace( + '0x', + '', + ); + } else { + params = inferTypesAndEncodeParameters(args).replace('0x', ''); + } + + + if (isAbiConstructorFragment(abi)) { + if (!deployData) + throw new Web3ContractError( + 'The contract has no contract data option set. This is necessary to append the constructor parameters.', + ); + + if (!deployData.startsWith('0x')) { + return `0x${deployData}${params}`; + } + + return `${deployData}${params}`; + } + + return `${encodeFunctionSignature(abi)}${params}`; +}; + +export const decodeMethodReturn = (abi: AbiFunctionFragment, returnValues?: HexString) => { + // If it was constructor then we need to return contract address + if (abi.type === 'constructor') { + return returnValues; + } + + if (!returnValues) { + // Using "null" value intentionally to match legacy behavior + // eslint-disable-next-line no-null/no-null + return null; + } + + const value = returnValues.length >= 2 ? returnValues.slice(2) : returnValues; + if (!abi.outputs) { + // eslint-disable-next-line no-null/no-null + return null; + } + const result = decodeParameters([...abi.outputs], value); + + if (result.__length__ === 1) { + return result[0]; + } + + return result; +}; diff --git a/packages/web3-eth-contract/src/index.js b/packages/web3-eth-contract/src/index.js deleted file mode 100644 index fd46f9be6c5..00000000000 --- a/packages/web3-eth-contract/src/index.js +++ /dev/null @@ -1,1034 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file contract.js - * - * To initialize a contract use: - * - * var Contract = require('web3-eth-contract'); - * Contract.setProvider('ws://localhost:8546'); - * var contract = new Contract(abi, address, ...); - * - * @author Fabian Vogelsteller - * @date 2017 - */ - - -"use strict"; - - -var _ = require('underscore'); -var core = require('web3-core'); -var Method = require('web3-core-method'); -var utils = require('web3-utils'); -var Subscription = require('web3-core-subscriptions').subscription; -var formatters = require('web3-core-helpers').formatters; -var errors = require('web3-core-helpers').errors; -var promiEvent = require('web3-core-promievent'); -var abi = require('web3-eth-abi'); - - -/** - * Should be called to create new contract instance - * - * @method Contract - * @constructor - * @param {Array} jsonInterface - * @param {String} address - * @param {Object} options - */ -var Contract = function Contract(jsonInterface, address, options) { - var _this = this, - args = Array.prototype.slice.call(arguments); - - if(!(this instanceof Contract)) { - throw new Error('Please use the "new" keyword to instantiate a web3.eth.Contract() object!'); - } - - this.setProvider = function () { - core.packageInit(_this, arguments); - - _this.clearSubscriptions = _this._requestManager.clearSubscriptions; - }; - - // sets _requestmanager - core.packageInit(this, [this.constructor]); - - this.clearSubscriptions = this._requestManager.clearSubscriptions; - - if(!jsonInterface || !(Array.isArray(jsonInterface))) { - throw errors.ContractMissingABIError(); - } - - // create the options object - this.options = {}; - - var lastArg = args[args.length - 1]; - if(_.isObject(lastArg) && !_.isArray(lastArg)) { - options = lastArg; - - this.options = _.extend(this.options, this._getOrSetDefaultOptions(options)); - if(_.isObject(address)) { - address = null; - } - } - - // set address - Object.defineProperty(this.options, 'address', { - set: function(value){ - if(value) { - _this._address = utils.toChecksumAddress(formatters.inputAddressFormatter(value)); - } - }, - get: function(){ - return _this._address; - }, - enumerable: true - }); - - // add method and event signatures, when the jsonInterface gets set - Object.defineProperty(this.options, 'jsonInterface', { - set: function(value){ - _this.methods = {}; - _this.events = {}; - - _this._jsonInterface = value.map(function(method) { - var func, - funcName; - - // make constant and payable backwards compatible - method.constant = (method.stateMutability === "view" || method.stateMutability === "pure" || method.constant); - method.payable = (method.stateMutability === "payable" || method.payable); - - - if (method.name) { - funcName = utils._jsonInterfaceMethodToString(method); - } - - - // function - if (method.type === 'function') { - method.signature = abi.encodeFunctionSignature(funcName); - func = _this._createTxObject.bind({ - method: method, - parent: _this - }); - - - // add method only if not one already exists - if(!_this.methods[method.name]) { - _this.methods[method.name] = func; - } else { - var cascadeFunc = _this._createTxObject.bind({ - method: method, - parent: _this, - nextMethod: _this.methods[method.name] - }); - _this.methods[method.name] = cascadeFunc; - } - - // definitely add the method based on its signature - _this.methods[method.signature] = func; - - // add method by name - _this.methods[funcName] = func; - - - // event - } else if (method.type === 'event') { - method.signature = abi.encodeEventSignature(funcName); - var event = _this._on.bind(_this, method.signature); - - // add method only if not already exists - if(!_this.events[method.name] || _this.events[method.name].name === 'bound ') - _this.events[method.name] = event; - - // definitely add the method based on its signature - _this.events[method.signature] = event; - - // add event by name - _this.events[funcName] = event; - } - - - return method; - }); - - // add allEvents - _this.events.allEvents = _this._on.bind(_this, 'allevents'); - - return _this._jsonInterface; - }, - get: function(){ - return _this._jsonInterface; - }, - enumerable: true - }); - - // get default account from the Class - var defaultAccount = this.constructor.defaultAccount; - var defaultBlock = this.constructor.defaultBlock || 'latest'; - - Object.defineProperty(this, 'handleRevert', { - get: function () { - if (_this.options.handleRevert === false || _this.options.handleRevert === true) { - return _this.options.handleRevert; - } - - return this.constructor.handleRevert; - }, - set: function (val) { - _this.options.handleRevert = val; - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultCommon', { - get: function () { - return _this.options.common || this.constructor.defaultCommon; - }, - set: function (val) { - _this.options.common = val; - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultHardfork', { - get: function () { - return _this.options.hardfork || this.constructor.defaultHardfork; - }, - set: function (val) { - _this.options.hardfork = val; - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultChain', { - get: function () { - return _this.options.chain || this.constructor.defaultChain; - }, - set: function (val) { - _this.options.chain = val; - }, - enumerable: true - }); - Object.defineProperty(this, 'transactionPollingTimeout', { - get: function () { - if (_this.options.transactionPollingTimeout === 0) { - return _this.options.transactionPollingTimeout; - } - - return _this.options.transactionPollingTimeout || this.constructor.transactionPollingTimeout; - }, - set: function (val) { - _this.options.transactionPollingTimeout = val; - }, - enumerable: true - }); - Object.defineProperty(this, 'transactionConfirmationBlocks', { - get: function () { - if (_this.options.transactionConfirmationBlocks === 0) { - return _this.options.transactionConfirmationBlocks; - } - - return _this.options.transactionConfirmationBlocks || this.constructor.transactionConfirmationBlocks; - }, - set: function (val) { - _this.options.transactionConfirmationBlocks = val; - }, - enumerable: true - }); - Object.defineProperty(this, 'transactionBlockTimeout', { - get: function () { - if (_this.options.transactionBlockTimeout === 0) { - return _this.options.transactionBlockTimeout; - } - - return _this.options.transactionBlockTimeout || this.constructor.transactionBlockTimeout; - }, - set: function (val) { - _this.options.transactionBlockTimeout = val; - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultAccount', { - get: function () { - return defaultAccount; - }, - set: function (val) { - if(val) { - defaultAccount = utils.toChecksumAddress(formatters.inputAddressFormatter(val)); - } - - return val; - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultBlock', { - get: function () { - return defaultBlock; - }, - set: function (val) { - defaultBlock = val; - - return val; - }, - enumerable: true - }); - - // properties - this.methods = {}; - this.events = {}; - - this._address = null; - this._jsonInterface = []; - - // set getter/setter properties - this.options.address = address; - this.options.jsonInterface = jsonInterface; - -}; - -/** - * Sets the new provider, creates a new requestManager, registers the "data" listener on the provider and sets the - * accounts module for the Contract class. - * - * @method setProvider - * - * @param {string|provider} provider - * @param {Accounts} accounts - * - * @returns void - */ -Contract.setProvider = function(provider, accounts) { - // Contract.currentProvider = provider; - core.packageInit(this, [provider]); - - this._ethAccounts = accounts; -}; - - -/** - * Get the callback and modify the array if necessary - * - * @method _getCallback - * @param {Array} args - * @return {Function} the callback - */ -Contract.prototype._getCallback = function getCallback(args) { - if (args && _.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } -}; - -/** - * Checks that no listener with name "newListener" or "removeListener" is added. - * - * @method _checkListener - * @param {String} type - * @param {String} event - * @return {Object} the contract instance - */ -Contract.prototype._checkListener = function(type, event){ - if(event === type) { - throw errors.ContractReservedEventError(type); - } -}; - - -/** - * Use default values, if options are not available - * - * @method _getOrSetDefaultOptions - * @param {Object} options the options gived by the user - * @return {Object} the options with gaps filled by defaults - */ -Contract.prototype._getOrSetDefaultOptions = function getOrSetDefaultOptions(options) { - var gasPrice = options.gasPrice ? String(options.gasPrice): null; - var from = options.from ? utils.toChecksumAddress(formatters.inputAddressFormatter(options.from)) : null; - - options.data = options.data || this.options.data; - - options.from = from || this.options.from; - options.gasPrice = gasPrice || this.options.gasPrice; - options.gas = options.gas || options.gasLimit || this.options.gas; - - // TODO replace with only gasLimit? - delete options.gasLimit; - - return options; -}; - - -/** - * Should be used to encode indexed params and options to one final object - * - * @method _encodeEventABI - * @param {Object} event - * @param {Object} options - * @return {Object} everything combined together and encoded - */ -Contract.prototype._encodeEventABI = function (event, options) { - options = options || {}; - var filter = options.filter || {}, - result = {}; - - ['fromBlock', 'toBlock'].filter(function (f) { - return options[f] !== undefined; - }).forEach(function (f) { - result[f] = formatters.inputBlockNumberFormatter(options[f]); - }); - - // use given topics - if(_.isArray(options.topics)) { - result.topics = options.topics; - - // create topics based on filter - } else { - - result.topics = []; - - // add event signature - if (event && !event.anonymous && event.name !== 'ALLEVENTS') { - result.topics.push(event.signature); - } - - // add event topics (indexed arguments) - if (event.name !== 'ALLEVENTS') { - var indexedTopics = event.inputs.filter(function (i) { - return i.indexed === true; - }).map(function (i) { - var value = filter[i.name]; - if (!value) { - return null; - } - - // TODO: https://github.com/ethereum/web3.js/issues/344 - // TODO: deal properly with components - - if (_.isArray(value)) { - return value.map(function (v) { - return abi.encodeParameter(i.type, v); - }); - } - return abi.encodeParameter(i.type, value); - }); - - result.topics = result.topics.concat(indexedTopics); - } - - if(!result.topics.length) - delete result.topics; - } - - if(this.options.address) { - result.address = this.options.address.toLowerCase(); - } - - return result; -}; - -/** - * Should be used to decode indexed params and options - * - * @method _decodeEventABI - * @param {Object} data - * @return {Object} result object with decoded indexed && not indexed params - */ -Contract.prototype._decodeEventABI = function (data) { - var event = this; - - data.data = data.data || ''; - data.topics = data.topics || []; - var result = formatters.outputLogFormatter(data); - - // if allEvents get the right event - if(event.name === 'ALLEVENTS') { - event = event.jsonInterface.find(function (intf) { - return (intf.signature === data.topics[0]); - }) || {anonymous: true}; - } - - // create empty inputs if none are present (e.g. anonymous events on allEvents) - event.inputs = event.inputs || []; - - // Handle case where an event signature shadows the current ABI with non-identical - // arg indexing. If # of topics doesn't match, event is anon. - if (!event.anonymous){ - let indexedInputs = 0; - event.inputs.forEach(input => input.indexed ? indexedInputs++ : null); - - if (indexedInputs > 0 && (data.topics.length !== indexedInputs + 1)){ - event = { - anonymous: true, - inputs: [] - }; - } - } - - var argTopics = event.anonymous ? data.topics : data.topics.slice(1); - - result.returnValues = abi.decodeLog(event.inputs, data.data, argTopics); - delete result.returnValues.__length__; - - // add name - result.event = event.name; - - // add signature - result.signature = (event.anonymous || !data.topics[0]) ? null : data.topics[0]; - - // move the data and topics to "raw" - result.raw = { - data: result.data, - topics: result.topics - }; - delete result.data; - delete result.topics; - - - return result; -}; - -/** - * Encodes an ABI for a method, including signature or the method. - * Or when constructor encodes only the constructor parameters. - * - * @method _encodeMethodABI - * @param {Mixed} args the arguments to encode - * @param {String} the encoded ABI - */ -Contract.prototype._encodeMethodABI = function _encodeMethodABI() { - var methodSignature = this._method.signature, - args = this.arguments || []; - - var signature = false, - paramsABI = this._parent.options.jsonInterface.filter(function (json) { - return ((methodSignature === 'constructor' && json.type === methodSignature) || - ((json.signature === methodSignature || json.signature === methodSignature.replace('0x','') || json.name === methodSignature) && json.type === 'function')); - }).map(function (json) { - var inputLength = (_.isArray(json.inputs)) ? json.inputs.length : 0; - - if (inputLength !== args.length) { - throw new Error('The number of arguments is not matching the methods required number. You need to pass '+ inputLength +' arguments.'); - } - - if (json.type === 'function') { - signature = json.signature; - } - return _.isArray(json.inputs) ? json.inputs : []; - }).map(function (inputs) { - return abi.encodeParameters(inputs, args).replace('0x',''); - })[0] || ''; - - // return constructor - if(methodSignature === 'constructor') { - if(!this._deployData) - throw new Error('The contract has no contract data option set. This is necessary to append the constructor parameters.'); - - if(!this._deployData.startsWith('0x')) { - this._deployData = '0x' + this._deployData; - } - - return this._deployData + paramsABI; - - } - - // return method - var returnValue = (signature) ? signature + paramsABI : paramsABI; - - if(!returnValue) { - throw new Error('Couldn\'t find a matching contract method named "'+ this._method.name +'".'); - } - - return returnValue; -}; - - -/** - * Decode method return values - * - * @method _decodeMethodReturn - * @param {Array} outputs - * @param {String} returnValues - * @return {Object} decoded output return values - */ -Contract.prototype._decodeMethodReturn = function (outputs, returnValues) { - if (!returnValues) { - return null; - } - - returnValues = returnValues.length >= 2 ? returnValues.slice(2) : returnValues; - var result = abi.decodeParameters(outputs, returnValues); - - if (result.__length__ === 1) { - return result[0]; - } - - delete result.__length__; - return result; -}; - - -/** - * Deploys a contract and fire events based on its state: transactionHash, receipt - * - * All event listeners will be removed, once the last possible event is fired ("error", or "receipt") - * - * @method deploy - * @param {Object} options - * @param {Function} callback - * @return {Object} EventEmitter possible events are "error", "transactionHash" and "receipt" - */ -Contract.prototype.deploy = function(options, callback){ - - options = options || {}; - - options.arguments = options.arguments || []; - options = this._getOrSetDefaultOptions(options); - - - // throw error, if no "data" is specified - if(!options.data) { - if (typeof callback === 'function'){ - return callback(errors.ContractMissingDeployDataError()); - } - throw errors.ContractMissingDeployDataError(); - } - - var constructor = _.find(this.options.jsonInterface, function (method) { - return (method.type === 'constructor'); - }) || {}; - constructor.signature = 'constructor'; - - return this._createTxObject.apply({ - method: constructor, - parent: this, - deployData: options.data, - _ethAccounts: this.constructor._ethAccounts - }, options.arguments); - -}; - -/** - * Gets the event signature and outputFormatters - * - * @method _generateEventOptions - * @param {Object} event - * @param {Object} options - * @param {Function} callback - * @return {Object} the event options object - */ -Contract.prototype._generateEventOptions = function() { - var args = Array.prototype.slice.call(arguments); - - // get the callback - var callback = this._getCallback(args); - - // get the options - var options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; - - var eventName = (_.isString(args[0])) ? args[0] : 'allevents'; - var event = (eventName.toLowerCase() === 'allevents') ? { - name: 'ALLEVENTS', - jsonInterface: this.options.jsonInterface - } : this.options.jsonInterface.find(function (json) { - return (json.type === 'event' && (json.name === eventName || json.signature === '0x'+ eventName.replace('0x',''))); - }); - - if (!event) { - throw errors.ContractEventDoesNotExistError(eventName); - } - - if (!utils.isAddress(this.options.address)) { - throw errors.ContractNoAddressDefinedError(); - } - - return { - params: this._encodeEventABI(event, options), - event: event, - callback: callback - }; -}; - -/** - * Adds event listeners and creates a subscription, and remove it once its fired. - * - * @method clone - * @return {Object} the event subscription - */ -Contract.prototype.clone = function() { - return new this.constructor(this.options.jsonInterface, this.options.address, this.options); -}; - - -/** - * Adds event listeners and creates a subscription, and remove it once its fired. - * - * @method once - * @param {String} event - * @param {Object} options - * @param {Function} callback - * @return {Object} the event subscription - */ -Contract.prototype.once = function(event, options, callback) { - var args = Array.prototype.slice.call(arguments); - - // get the callback - callback = this._getCallback(args); - - if (!callback) { - throw errors.ContractOnceRequiresCallbackError(); - } - - // don't allow fromBlock - if (options) - delete options.fromBlock; - - // don't return as once shouldn't provide "on" - this._on(event, options, function (err, res, sub) { - sub.unsubscribe(); - if(_.isFunction(callback)){ - callback(err, res, sub); - } - }); - - return undefined; -}; - -/** - * Adds event listeners and creates a subscription. - * - * @method _on - * - * @param {String} event - * @param {Object} options - * @param {Function} callback - * - * @return {Object} the event subscription - */ -Contract.prototype._on = function(){ - var subOptions = this._generateEventOptions.apply(this, arguments); - - if (subOptions.params && subOptions.params.toBlock) { - delete subOptions.params.toBlock; - console.warn('Invalid option: toBlock. Use getPastEvents for specific range.'); - } - - // prevent the event "newListener" and "removeListener" from being overwritten - this._checkListener('newListener', subOptions.event.name); - this._checkListener('removeListener', subOptions.event.name); - - // TODO check if listener already exists? and reuse subscription if options are the same. - - // create new subscription - var subscription = new Subscription({ - subscription: { - params: 1, - inputFormatter: [formatters.inputLogFormatter], - outputFormatter: this._decodeEventABI.bind(subOptions.event), - // DUBLICATE, also in web3-eth - subscriptionHandler: function (output) { - if(output.removed) { - this.emit('changed', output); - } else { - this.emit('data', output); - } - - if (_.isFunction(this.callback)) { - this.callback(null, output, this); - } - } - }, - type: 'eth', - requestManager: this._requestManager - }); - - subscription.subscribe('logs', subOptions.params, subOptions.callback || function () {}); - - return subscription; -}; - -/** - * Get past events from contracts - * - * @method getPastEvents - * @param {String} event - * @param {Object} options - * @param {Function} callback - * @return {Object} the promievent - */ -Contract.prototype.getPastEvents = function(){ - var subOptions = this._generateEventOptions.apply(this, arguments); - - var getPastLogs = new Method({ - name: 'getPastLogs', - call: 'eth_getLogs', - params: 1, - inputFormatter: [formatters.inputLogFormatter], - outputFormatter: this._decodeEventABI.bind(subOptions.event) - }); - getPastLogs.setRequestManager(this._requestManager); - var call = getPastLogs.buildCall(); - - getPastLogs = null; - - return call(subOptions.params, subOptions.callback); -}; - - -/** - * returns the an object with call, send, estimate functions - * - * @method _createTxObject - * @returns {Object} an object with functions to call the methods - */ -Contract.prototype._createTxObject = function _createTxObject(){ - var args = Array.prototype.slice.call(arguments); - var txObject = {}; - - if(this.method.type === 'function') { - - txObject.call = this.parent._executeMethod.bind(txObject, 'call'); - txObject.call.request = this.parent._executeMethod.bind(txObject, 'call', true); // to make batch requests - - } - - txObject.send = this.parent._executeMethod.bind(txObject, 'send'); - txObject.send.request = this.parent._executeMethod.bind(txObject, 'send', true); // to make batch requests - txObject.encodeABI = this.parent._encodeMethodABI.bind(txObject); - txObject.estimateGas = this.parent._executeMethod.bind(txObject, 'estimate'); - - if (args && this.method.inputs && args.length !== this.method.inputs.length) { - if (this.nextMethod) { - return this.nextMethod.apply(null, args); - } - throw errors.InvalidNumberOfParams(args.length, this.method.inputs.length, this.method.name); - } - - txObject.arguments = args || []; - txObject._method = this.method; - txObject._parent = this.parent; - txObject._ethAccounts = this.parent.constructor._ethAccounts || this._ethAccounts; - - if(this.deployData) { - txObject._deployData = this.deployData; - } - - return txObject; -}; - - -/** - * Generates the options for the execute call - * - * @method _processExecuteArguments - * @param {Array} args - * @param {Promise} defer - */ -Contract.prototype._processExecuteArguments = function _processExecuteArguments(args, defer) { - var processedArgs = {}; - - processedArgs.type = args.shift(); - - // get the callback - processedArgs.callback = this._parent._getCallback(args); - - // get block number to use for call - if(processedArgs.type === 'call' && args[args.length - 1] !== true && (_.isString(args[args.length - 1]) || isFinite(args[args.length - 1]))) - processedArgs.defaultBlock = args.pop(); - - // get the options - processedArgs.options = (_.isObject(args[args.length - 1])) ? args.pop() : {}; - - // get the generateRequest argument for batch requests - processedArgs.generateRequest = (args[args.length - 1] === true)? args.pop() : false; - - processedArgs.options = this._parent._getOrSetDefaultOptions(processedArgs.options); - processedArgs.options.data = this.encodeABI(); - - // add contract address - if(!this._deployData && !utils.isAddress(this._parent.options.address)) - throw errors.ContractNoAddressDefinedError(); - - if(!this._deployData) - processedArgs.options.to = this._parent.options.address; - - // return error, if no "data" is specified - if(!processedArgs.options.data) - return utils._fireError(new Error('Couldn\'t find a matching contract method, or the number of parameters is wrong.'), defer.eventEmitter, defer.reject, processedArgs.callback); - - return processedArgs; -}; - -/** - * Executes a call, transact or estimateGas on a contract function - * - * @method _executeMethod - * @param {String} type the type this execute function should execute - * @param {Boolean} makeRequest if true, it simply returns the request parameters, rather than executing it - */ -Contract.prototype._executeMethod = function _executeMethod(){ - var _this = this, - args = this._parent._processExecuteArguments.call(this, Array.prototype.slice.call(arguments), defer), - defer = promiEvent((args.type !== 'send')), - ethAccounts = _this.constructor._ethAccounts || _this._ethAccounts; - - // simple return request for batch requests - if(args.generateRequest) { - - var payload = { - params: [formatters.inputCallFormatter.call(this._parent, args.options)], - callback: args.callback - }; - - if(args.type === 'call') { - payload.params.push(formatters.inputDefaultBlockNumberFormatter.call(this._parent, args.defaultBlock)); - payload.method = 'eth_call'; - payload.format = this._parent._decodeMethodReturn.bind(null, this._method.outputs); - } else { - payload.method = 'eth_sendTransaction'; - } - - return payload; - - } - - switch (args.type) { - case 'estimate': - - var estimateGas = (new Method({ - name: 'estimateGas', - call: 'eth_estimateGas', - params: 1, - inputFormatter: [formatters.inputCallFormatter], - outputFormatter: utils.hexToNumber, - requestManager: _this._parent._requestManager, - accounts: ethAccounts, // is eth.accounts (necessary for wallet signing) - defaultAccount: _this._parent.defaultAccount, - defaultBlock: _this._parent.defaultBlock - })).createFunction(); - - return estimateGas(args.options, args.callback); - - case 'call': - - // TODO check errors: missing "from" should give error on deploy and send, call ? - - var call = (new Method({ - name: 'call', - call: 'eth_call', - params: 2, - inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter], - // add output formatter for decoding - outputFormatter: function (result) { - return _this._parent._decodeMethodReturn(_this._method.outputs, result); - }, - requestManager: _this._parent._requestManager, - accounts: ethAccounts, // is eth.accounts (necessary for wallet signing) - defaultAccount: _this._parent.defaultAccount, - defaultBlock: _this._parent.defaultBlock, - handleRevert: _this._parent.handleRevert, - abiCoder: abi - })).createFunction(); - - return call(args.options, args.defaultBlock, args.callback); - - case 'send': - - // return error, if no "from" is specified - if(!utils.isAddress(args.options.from)) { - return utils._fireError(errors.ContractNoFromAddressDefinedError(), defer.eventEmitter, defer.reject, args.callback); - } - - if (_.isBoolean(this._method.payable) && !this._method.payable && args.options.value && args.options.value > 0) { - return utils._fireError(new Error('Can not send value to non-payable contract method or constructor'), defer.eventEmitter, defer.reject, args.callback); - } - - - // make sure receipt logs are decoded - var extraFormatters = { - receiptFormatter: function (receipt) { - if (_.isArray(receipt.logs)) { - - // decode logs - var events = _.map(receipt.logs, function(log) { - return _this._parent._decodeEventABI.call({ - name: 'ALLEVENTS', - jsonInterface: _this._parent.options.jsonInterface - }, log); - }); - - // make log names keys - receipt.events = {}; - var count = 0; - events.forEach(function (ev) { - if (ev.event) { - // if > 1 of the same event, don't overwrite any existing events - if (receipt.events[ev.event]) { - if (Array.isArray(receipt.events[ ev.event ])) { - receipt.events[ ev.event ].push(ev); - } else { - receipt.events[ev.event] = [receipt.events[ev.event], ev]; - } - } else { - receipt.events[ ev.event ] = ev; - } - } else { - receipt.events[count] = ev; - count++; - } - }); - - delete receipt.logs; - } - return receipt; - }, - contractDeployFormatter: function (receipt) { - var newContract = _this._parent.clone(); - newContract.options.address = receipt.contractAddress; - return newContract; - } - }; - - var sendTransaction = (new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter], - requestManager: _this._parent._requestManager, - accounts: _this.constructor._ethAccounts || _this._ethAccounts, // is eth.accounts (necessary for wallet signing) - defaultAccount: _this._parent.defaultAccount, - defaultBlock: _this._parent.defaultBlock, - transactionBlockTimeout: _this._parent.transactionBlockTimeout, - transactionConfirmationBlocks: _this._parent.transactionConfirmationBlocks, - transactionPollingTimeout: _this._parent.transactionPollingTimeout, - defaultCommon: _this._parent.defaultCommon, - defaultChain: _this._parent.defaultChain, - defaultHardfork: _this._parent.defaultHardfork, - handleRevert: _this._parent.handleRevert, - extraFormatters: extraFormatters, - abiCoder: abi - })).createFunction(); - - return sendTransaction(args.options, args.callback); - - default: - throw new Error('Method "' + args.type + '" not implemented.'); - - } - - -}; - -module.exports = Contract; diff --git a/packages/web3-eth-contract/src/index.ts b/packages/web3-eth-contract/src/index.ts new file mode 100644 index 00000000000..09052f859a1 --- /dev/null +++ b/packages/web3-eth-contract/src/index.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The `web3.eth.Contract` object makes it easy to interact with smart contracts on the Ethereum blockchain. + * When you create a new contract object you give it the JSON interface of the respective smart contract and + * web3 will auto convert all calls into low level ABI calls over RPC for you. + * This allows you to interact with smart contracts as if they were JavaScript objects. + * + * To use it standalone: + * + * ```ts + * const Contract = require('web3-eth-contract'); + * + * // set provider for all later instances to use + * Contract.setProvider('ws://localhost:8546'); + * + * const contract = new Contract(jsonInterface, address); + * + * contract.methods.somFunc().send({from: ....}) + * .on('receipt', function(){ + * ... + * }); + * ``` + */ +/** + * This comment _supports3_ [Markdown](https://marked.js.org/) + */ +import { Contract } from './contract.js'; + +export * from './encoding.js'; + +export * from './contract.js'; +export * from './log_subscription.js'; +export * from './types.js'; +export * from './utils.js'; + +export default Contract; diff --git a/packages/web3-eth-contract/src/log_subscription.ts b/packages/web3-eth-contract/src/log_subscription.ts new file mode 100644 index 00000000000..6ace1e17478 --- /dev/null +++ b/packages/web3-eth-contract/src/log_subscription.ts @@ -0,0 +1,164 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + AbiEventFragment, + LogsInput, + HexString, + Topic, + DataFormat, + EventLog, + ContractAbiWithSignature, +} from 'web3-types'; +import { Web3RequestManager, Web3Subscription, Web3SubscriptionManager } from 'web3-core'; +import { decodeEventABI } from 'web3-eth'; + +/** + * LogSubscription to be used to subscribe to events logs. + * + * Following events are supported and can be accessed with either {@link LogsSubscription.once} or ${@link LogsSubscription.on} methods. + * + * - **connected**: Emitted when the subscription is connected. + * - **data**: Fires on each incoming event with the event object as argument. + * - **changed**: Fires on each event which was removed from the blockchain. The event will have the additional property `removed: true`. + * - **error**: Fires on each error. + * + * ```ts + * const subscription = await myContract.events.MyEvent({ + * filter: {myIndexedParam: [20,23], myOtherIndexedParam: '0x123456789...'}, // Using an array means OR: e.g. 20 or 23 + * fromBlock: 0 + * }); + * + * subscription.on("connected", function(subscriptionId){ + * console.log(subscriptionId); + * }); + * + * subscription.on('data', function(event){ + * console.log(event); // same results as the optional callback above + * }); + * + * subscription.on('changed', function(event){ + * // remove event from local database + * }) + * + * subscription.on('error', function(error, receipt) { // If the transaction was rejected by the network with a receipt, the second parameter will be the receipt. + * ... + * }); + * + * // event output example + * > { + * returnValues: { + * myIndexedParam: 20, + * myOtherIndexedParam: '0x123456789...', + * myNonIndexParam: 'My String' + * }, + * raw: { + * data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] + * }, + * event: 'MyEvent', + * signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * logIndex: 0, + * transactionIndex: 0, + * transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * blockNumber: 1234, + * address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' + * } + * ``` + */ +export class LogsSubscription extends Web3Subscription< + { + data: EventLog; + changed: EventLog & { removed: true }; + }, + // eslint-disable-next-line @typescript-eslint/ban-types + { address?: HexString; topics?: (Topic | Topic[] | null)[]; abi: AbiEventFragment } +> { + /** + * Address of tye contract + */ + public readonly address?: HexString; + + /** + * The list of topics subscribed + */ + // eslint-disable-next-line @typescript-eslint/ban-types + public readonly topics?: (Topic | Topic[] | null)[]; + + /** + * The {@doclink glossary/json_interface | JSON Interface} of the event. + */ + public readonly abi: AbiEventFragment & { signature: HexString }; + + public readonly jsonInterface: ContractAbiWithSignature; + + public constructor( + args: { + address?: HexString; + // eslint-disable-next-line @typescript-eslint/ban-types + topics?: (Topic | Topic[] | null)[]; + abi: AbiEventFragment & { signature: HexString }; + jsonInterface: ContractAbiWithSignature; + }, + options: { subscriptionManager: Web3SubscriptionManager; returnFormat?: DataFormat }, + ); + /** + * @deprecated This constructor overloading should not be used + */ + public constructor( + args: { + address?: HexString; + // eslint-disable-next-line @typescript-eslint/ban-types + topics?: (Topic | Topic[] | null)[]; + abi: AbiEventFragment & { signature: HexString }; + jsonInterface: ContractAbiWithSignature; + }, + options: { requestManager: Web3RequestManager; returnFormat?: DataFormat }, + ); + public constructor( + args: { + address?: HexString; + // eslint-disable-next-line @typescript-eslint/ban-types + topics?: (Topic | Topic[] | null)[]; + abi: AbiEventFragment & { signature: HexString }; + jsonInterface: ContractAbiWithSignature; + }, + options: ( + | { subscriptionManager: Web3SubscriptionManager } + | { requestManager: Web3RequestManager } + ) & { + returnFormat?: DataFormat; + }, + ) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + super(args, options as any); + + this.address = args.address; + this.topics = args.topics; + this.abi = args.abi; + this.jsonInterface = args.jsonInterface; + } + + protected _buildSubscriptionParams() { + return ['logs', { address: this.address, topics: this.topics }]; + } + + protected formatSubscriptionResult(data: EventLog) { + return decodeEventABI(this.abi, data as LogsInput, this.jsonInterface, super.returnFormat); + } +} diff --git a/packages/web3-eth-contract/src/types.ts b/packages/web3-eth-contract/src/types.ts new file mode 100644 index 00000000000..fc66826b2e6 --- /dev/null +++ b/packages/web3-eth-contract/src/types.ts @@ -0,0 +1,439 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3ContextInitOptions, Web3PromiEvent } from 'web3-core'; +import { + AccessListResult, + BlockNumberOrTag, + EthExecutionAPI, + HexString, + Numbers, + TransactionReceipt, + NonPayableCallOptions, + PayableCallOptions, + DataFormat, + DEFAULT_RETURN_FORMAT, + FormatType, +} from 'web3-types'; +import { NewHeadsSubscription, SendTransactionEvents } from 'web3-eth'; +import { LogsSubscription } from './log_subscription.js'; + +export type NonPayableTxOptions = NonPayableCallOptions; +export type PayableTxOptions = PayableCallOptions; +export { ContractAbiWithSignature, EventLog, ContractOptions } from 'web3-types'; + +export interface ContractEventOptions { + /** + * Let you filter events by indexed parameters, e.g. `{filter: {myNumber: [12,13]}}` means all events where `myNumber` is `12` or `13`. + */ + filter?: Record; + /** + * The block number (greater than or equal to) from which to get events on. Pre-defined block numbers as `earliest`, `latest`, `pending`, `safe` or `finalized` can also be used. For specific range use {@link Contract.getPastEvents}. + */ + fromBlock?: BlockNumberOrTag; + /** + * This allows to manually set the topics for the event filter. If given the filter property and event signature, (topic[0]) will not be set automatically. Each topic can also be a nested array of topics that behaves as `or` operation between the given nested topics. + */ + topics?: string[]; +} + +export interface NonPayableMethodObject { + arguments: Inputs; + /** + * This will call a method and execute its smart contract method in the EVM without sending any transaction. Note calling cannot alter the smart contract state. + * + * ```ts + * // using the promise + * const result = await myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * // MULTI-ARGUMENT RETURN: + * // Solidity + * contract MyContract { + * function myFunction() returns(uint256 myNumber, string myString) { + * return (23456, "Hello!%"); + * } + * } + * + * // web3.js + * var MyContract = new web3.eth.Contract(abi, address); + * const result = MyContract.methods.myFunction().call() + * console.log(result) + * > Result { + * myNumber: '23456', + * myString: 'Hello!%', + * 0: '23456', // these are here as fallbacks if the name is not know or given + * 1: 'Hello!%' + * } + * + * + * // SINGLE-ARGUMENT RETURN: + * // Solidity + * contract MyContract { + * function myFunction() returns(string myString) { + * return "Hello!%"; + * } + * } + * + * // web3.js + * const MyContract = new web3.eth.Contract(abi, address); + * const result = await MyContract.methods.myFunction().call(); + * console.log(result); + * > "Hello!%" + * ``` + * + * @param tx - The options used for calling. + * @param block - If you pass this parameter it will not use the default block set with contract.defaultBlock. Pre-defined block numbers as `earliest`, `latest`, `pending`, `safe` or `finalized can also be used. Useful for requesting data from or replaying transactions in past blocks. + * @returns - The return value(s) of the smart contract method. If it returns a single value, it’s returned as is. If it has multiple return values they are returned as an object with properties and indices. + */ + + call( + tx?: NonPayableCallOptions, + block?: BlockNumberOrTag, + ): Promise; + + /** + * This will send a transaction to the smart contract and execute its method. Note this can alter the smart contract state. + * + * ```ts + * await myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * const receipt = await myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * + * // using the event emitter + * const sendObj = myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) + * sendObj.on('transactionHash', function(hash){ + * ... + * }); + * + * sendObj.on('confirmation', function(confirmationNumber, receipt){ + * ... + * }); + * + * sendObj.on('receipt', function(receipt){ + * // receipt example + * console.log(receipt); + * > { + * "transactionHash": "0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b", + * "transactionIndex": 0, + * "blockHash": "0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46", + * "blockNumber": 3, + * "contractAddress": "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", + * "cumulativeGasUsed": 314159, + * "gasUsed": 30234, + * "events": { + * "MyEvent": { + * returnValues: { + * myIndexedParam: 20, + * myOtherIndexedParam: '0x123456789...', + * myNonIndexParam: 'My String' + * }, + * raw: { + * data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] + * }, + * event: 'MyEvent', + * signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * logIndex: 0, + * transactionIndex: 0, + * transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * blockNumber: 1234, + * address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' + * }, + * "MyOtherEvent": { + * ... + * }, + * "MyMultipleEvent":[{...}, {...}] // If there are multiple of the same event, they will be in an array + * } + * } + * }); + * + * sendObj.on('error', function(error, receipt) { // If the transaction was rejected by the network with a receipt, the second parameter will be the receipt. + * ... + * }); + * ``` + * + * @param tx - The options used for sending. + * @returns - Returns a {@link PromiEvent} resolved with transaction receipt. + */ + send( + tx?: NonPayableTxOptions, + ): Web3PromiEvent< + FormatType, + SendTransactionEvents + >; + + /** + * Returns the amount of gas consumed by executing the method locally without creating a new transaction on the blockchain. + * The returned amount can be used as a gas estimate for executing the transaction publicly. The actual gas used can be + * different when sending the transaction later, as the state of the smart contract can be different at that time. + * + * ```ts + * const gasAmount = await myContract.methods.myMethod(123).estimateGas({gas: 5000000}); + * if(gasAmount == 5000000) { + * console.log('Method ran out of gas'); + * } + * ``` + * + * @param options - The options used for calling + * @param returnFormat - The data format you want the output in. + * @returns - The gas amount estimated. + */ + estimateGas( + options?: NonPayableCallOptions, + returnFormat?: ReturnFormat, + ): Promise>; + + /** + * Encodes the ABI for this method. The resulting hex string is 32-bit function signature hash plus the passed parameters in Solidity tightly packed format. + * This can be used to send a transaction, call a method, or pass it into another smart contract’s method as arguments. + * Set the data field on `web3.eth.sendTransaction` options as the encodeABI() result and it is the same as calling the contract method with `contract.myMethod.send()`. + * + * Some use cases for encodeABI() include: preparing a smart contract transaction for a multi signature wallet, + * working with offline wallets and cold storage and creating transaction payload for complex smart contract proxy calls. + * + * @returns - The encoded ABI byte code to send via a transaction or call. + */ + encodeABI(): string; + + /** + * This method generates an access list for a transaction. You must specify a `from` address and `gas` if it’s not specified in options. + * + * @param options - The options used for createAccessList. + * @param block - If you pass this parameter it will not use the default block set with contract.defaultBlock. Pre-defined block numbers as `earliest`, `latest`, `pending`, `safe` or `finalized can also be used. Useful for requesting data from or replaying transactions in past blocks. + * @returns The returned data of the createAccessList, e.g. The generated access list for transaction. + * + * ```ts + * const result = await MyContract.methods.myFunction().createAccessList(); + * console.log(result); + * + * > { + * "accessList": [ + * { + * "address": "0x15859bdf5aff2080a9968f6a410361e9598df62f", + * "storageKeys": [ + * "0x0000000000000000000000000000000000000000000000000000000000000000" + * ] + * } + * ], + * "gasUsed": "0x7671" + * } + * ``` + */ + createAccessList( + tx?: NonPayableCallOptions, + block?: BlockNumberOrTag, + ): Promise; +} + +export interface PayableMethodObject { + arguments: Inputs; + /** + * Will call a method and execute its smart contract method in the EVM without sending any transaction. Note calling cannot alter the smart contract state. + * + * ```ts + * // using the promise + * const result = await myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * // MULTI-ARGUMENT RETURN: + * // Solidity + * contract MyContract { + * function myFunction() returns(uint256 myNumber, string myString) { + * return (23456, "Hello!%"); + * } + * } + * + * // web3.js + * var MyContract = new web3.eth.Contract(abi, address); + * const result = MyContract.methods.myFunction().call() + * console.log(result) + * > Result { + * myNumber: '23456', + * myString: 'Hello!%', + * 0: '23456', // these are here as fallbacks if the name is not know or given + * 1: 'Hello!%' + * } + * + * + * // SINGLE-ARGUMENT RETURN: + * // Solidity + * contract MyContract { + * function myFunction() returns(string myString) { + * return "Hello!%"; + * } + * } + * + * // web3.js + * const MyContract = new web3.eth.Contract(abi, address); + * const result = await MyContract.methods.myFunction().call(); + * console.log(result); + * > "Hello!%" + * ``` + * + * @param tx - The options used for calling. + * @param block - If you pass this parameter it will not use the default block set with contract.defaultBlock. Pre-defined block numbers as `earliest`, `latest`, `pending`, `safe` or `finalized can also be used. Useful for requesting data from or replaying transactions in past blocks. + * @returns - The return value(s) of the smart contract method. If it returns a single value, it’s returned as is. If it has multiple return values they are returned as an object with properties and indices. + */ + call( + tx?: PayableCallOptions, + block?: BlockNumberOrTag, + ): Promise; + + /** + * Will send a transaction to the smart contract and execute its method. Note this can alter the smart contract state. + * + * ```ts + * await myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * const receipt = await myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}); + * + * + * // using the event emitter + * const sendObj = myContract.methods.myMethod(123).send({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) + * sendObj.on('transactionHash', function(hash){ + * ... + * }); + * + * sendObj.on('confirmation', function(confirmationNumber, receipt){ + * ... + * }); + * + * sendObj.on('receipt', function(receipt){ + * // receipt example + * console.log(receipt); + * > { + * "transactionHash": "0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b", + * "transactionIndex": 0, + * "blockHash": "0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46", + * "blockNumber": 3, + * "contractAddress": "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", + * "cumulativeGasUsed": 314159, + * "gasUsed": 30234, + * "events": { + * "MyEvent": { + * returnValues: { + * myIndexedParam: 20, + * myOtherIndexedParam: '0x123456789...', + * myNonIndexParam: 'My String' + * }, + * raw: { + * data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] + * }, + * event: 'MyEvent', + * signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * logIndex: 0, + * transactionIndex: 0, + * transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * blockNumber: 1234, + * address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' + * }, + * "MyOtherEvent": { + * ... + * }, + * "MyMultipleEvent":[{...}, {...}] // If there are multiple of the same event, they will be in an array + * } + * } + * }); + * + * sendObj.on('error', function(error, receipt) { // If the transaction was rejected by the network with a receipt, the second parameter will be the receipt. + * ... + * }); + * ``` + * + * @param tx - The options used for sending. + * @returns - Returns a {@link PromiEvent} object resolved with transaction receipt. + */ + send( + tx?: PayableTxOptions, + ): Web3PromiEvent< + FormatType, + SendTransactionEvents + >; + + /** + * Returns the amount of gas consumed by executing the method locally without creating a new transaction on the blockchain. + * The returned amount can be used as a gas estimate for executing the transaction publicly. The actual gas used can be + * different when sending the transaction later, as the state of the smart contract can be different at that time. + * + * ```ts + * const gasAmount = await myContract.methods.myMethod(123).estimateGas({gas: 5000000}); + * if(gasAmount == 5000000) { + * console.log('Method ran out of gas'); + * } + * ``` + * + * @param options - The options used for calling + * @param returnFormat - The data format you want the output in. + * @returns - The gas amount estimated. + */ + estimateGas( + options?: PayableCallOptions, + returnFormat?: ReturnFormat, + ): Promise>; + + /** + * Encodes the ABI for this method. The resulting hex string is 32-bit function signature hash plus the passed parameters in Solidity tightly packed format. + * This can be used to send a transaction, call a method, or pass it into another smart contract’s method as arguments. + * Set the data field on `web3.eth.sendTransaction` options as the encodeABI() result and it is the same as calling the contract method with `contract.myMethod.send()`. + * + * Some use cases for encodeABI() include: preparing a smart contract transaction for a multi signature wallet, + * working with offline wallets and cold storage and creating transaction payload for complex smart contract proxy calls. + * + * @returns - The encoded ABI byte code to send via a transaction or call. + */ + encodeABI(): HexString; + + /** + * This method generates an access list for a transaction. You must specify a `from` address and `gas` if it’s not specified in options. + * + * @param options - The options used for createAccessList. + * @param block - If you pass this parameter it will not use the default block set with contract.defaultBlock. Pre-defined block numbers as `earliest`, `latest`, `pending`, `safe` or `finalized can also be used. Useful for requesting data from or replaying transactions in past blocks. + * @returns The returned data of the createAccessList, e.g. The generated access list for transaction. + * + * ```ts + * const result = await MyContract.methods.myFunction().createAccessList(); + * console.log(result); + * + * > { + * "accessList": [ + * { + * "address": "0x15859bdf5aff2080a9968f6a410361e9598df62f", + * "storageKeys": [ + * "0x0000000000000000000000000000000000000000000000000000000000000000" + * ] + * } + * ], + * "gasUsed": "0x7671" + * } + *``` + */ + createAccessList(tx?: PayableCallOptions, block?: BlockNumberOrTag): Promise; +} + +export type Web3ContractContext = Partial< + Web3ContextInitOptions< + EthExecutionAPI, + { + logs: typeof LogsSubscription; + newHeads: typeof NewHeadsSubscription; + newBlockHeaders: typeof NewHeadsSubscription; + } + > +>; diff --git a/packages/web3-eth-contract/src/utils.ts b/packages/web3-eth-contract/src/utils.ts new file mode 100644 index 00000000000..d2afe72a7b2 --- /dev/null +++ b/packages/web3-eth-contract/src/utils.ts @@ -0,0 +1,212 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3ContractError } from 'web3-errors'; +import { + TransactionForAccessList, + AbiFunctionFragment, + TransactionWithSenderAPI, + TransactionCall, + HexString, + Address, + NonPayableCallOptions, + PayableCallOptions, + ContractOptions, +} from 'web3-types'; +import { isNullish, mergeDeep, isContractInitOptions } from 'web3-utils'; +import { encodeMethodABI } from './encoding.js'; +import { Web3ContractContext } from './types.js'; + +const dataInputEncodeMethodHelper = ( + txParams: TransactionCall | TransactionForAccessList, + abi: AbiFunctionFragment, + params: unknown[], + dataInputFill?: 'data' | 'input' | 'both', +): { data?: HexString; input?: HexString } => { + const tx: { data?: HexString; input?: HexString } = {}; + if (!isNullish(txParams.data) || dataInputFill === 'both') { + tx.data = encodeMethodABI(abi, params, (txParams.data ?? txParams.input) as HexString); + } + if (!isNullish(txParams.input) || dataInputFill === 'both') { + tx.input = encodeMethodABI(abi, params, (txParams.input ?? txParams.data) as HexString); + } + // if input and data is empty, use web3config default + if (isNullish(tx.input) && isNullish(tx.data)) { + tx[dataInputFill as 'data' | 'input'] = encodeMethodABI(abi, params); + } + return { data: tx.data as HexString, input: tx.input as HexString }; +}; + +export const getSendTxParams = ({ + abi, + params, + options, + contractOptions, +}: { + abi: AbiFunctionFragment; + params: unknown[]; + options?: (PayableCallOptions | NonPayableCallOptions) & { + input?: HexString; + data?: HexString; + to?: Address; + dataInputFill?: 'input' | 'data' | 'both'; + }; + contractOptions: ContractOptions; +}): TransactionCall => { + const deploymentCall = + options?.input ?? options?.data ?? contractOptions.input ?? contractOptions.data; + if (!deploymentCall && !options?.to && !contractOptions.address) { + throw new Web3ContractError('Contract address not specified'); + } + + if (!options?.from && !contractOptions.from) { + throw new Web3ContractError('Contract "from" address not specified'); + } + let txParams = mergeDeep( + { + to: contractOptions.address, + gas: contractOptions.gas, + gasPrice: contractOptions.gasPrice, + from: contractOptions.from, + input: contractOptions.input, + maxPriorityFeePerGas: contractOptions.maxPriorityFeePerGas, + maxFeePerGas: contractOptions.maxFeePerGas, + data: contractOptions.data, + }, + options as unknown as Record, + ) as unknown as TransactionCall; + const dataInput = dataInputEncodeMethodHelper(txParams, abi, params, options?.dataInputFill); + txParams = { ...txParams, data: dataInput.data, input: dataInput.input }; + + return txParams; +}; + +export const getEthTxCallParams = ({ + abi, + params, + options, + contractOptions, +}: { + abi: AbiFunctionFragment; + params: unknown[]; + options?: (PayableCallOptions | NonPayableCallOptions) & { + to?: Address; + dataInputFill?: 'input' | 'data' | 'both'; + }; + contractOptions: ContractOptions; +}): TransactionCall => { + if (!options?.to && !contractOptions.address) { + throw new Web3ContractError('Contract address not specified'); + } + let txParams = mergeDeep( + { + to: contractOptions.address, + gas: contractOptions.gas, + gasPrice: contractOptions.gasPrice, + from: contractOptions.from, + input: contractOptions.input, + maxPriorityFeePerGas: contractOptions.maxPriorityFeePerGas, + maxFeePerGas: contractOptions.maxFeePerGas, + data: contractOptions.data, + }, + options as unknown as Record, + ) as unknown as TransactionCall; + + const dataInput = dataInputEncodeMethodHelper(txParams, abi, params, options?.dataInputFill); + txParams = { ...txParams, data: dataInput.data, input: dataInput.input }; + + return txParams; +}; + +export const getEstimateGasParams = ({ + abi, + params, + options, + contractOptions, +}: { + abi: AbiFunctionFragment; + params: unknown[]; + options?: (PayableCallOptions | NonPayableCallOptions) & { + dataInputFill?: 'input' | 'data' | 'both'; + }; + contractOptions: ContractOptions; +}): Partial => { + let txParams = mergeDeep( + { + to: contractOptions.address, + gas: contractOptions.gas, + gasPrice: contractOptions.gasPrice, + from: contractOptions.from, + input: contractOptions.input, + data: contractOptions.data, + }, + options as unknown as Record, + ) as unknown as TransactionCall; + + const dataInput = dataInputEncodeMethodHelper(txParams, abi, params, options?.dataInputFill); + txParams = { ...txParams, data: dataInput.data, input: dataInput.input }; + + return txParams as TransactionWithSenderAPI; +}; + +export const isWeb3ContractContext = (options: unknown): options is Web3ContractContext => + typeof options === 'object' && + !isNullish(options) && + Object.keys(options).length !== 0 && + !isContractInitOptions(options); + +export const getCreateAccessListParams = ({ + abi, + params, + options, + contractOptions, +}: { + abi: AbiFunctionFragment; + params: unknown[]; + options?: (PayableCallOptions | NonPayableCallOptions) & { + to?: Address; + dataInputFill?: 'input' | 'data' | 'both'; + }; + contractOptions: ContractOptions; +}): TransactionForAccessList => { + if (!options?.to && !contractOptions.address) { + throw new Web3ContractError('Contract address not specified'); + } + + if (!options?.from && !contractOptions.from) { + throw new Web3ContractError('Contract "from" address not specified'); + } + + let txParams = mergeDeep( + { + to: contractOptions.address, + gas: contractOptions.gas, + gasPrice: contractOptions.gasPrice, + from: contractOptions.from, + input: contractOptions.input, + maxPriorityFeePerGas: contractOptions.maxPriorityFeePerGas, + maxFeePerGas: contractOptions.maxFeePerGas, + data: contractOptions.data, + }, + options as unknown as Record, + ) as unknown as TransactionForAccessList; + + const dataInput = dataInputEncodeMethodHelper(txParams, abi, params, options?.dataInputFill); + txParams = { ...txParams, data: dataInput.data, input: dataInput.input }; + + return txParams; +}; diff --git a/packages/web3-eth-contract/test/.eslintrc.js b/packages/web3-eth-contract/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-eth-contract/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-contract/test/config/jest.config.js b/packages/web3-eth-contract/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3-eth-contract/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-eth-contract/test/config/setup.js b/packages/web3-eth-contract/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-eth-contract/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-eth-contract/test/fixtures/AbiItem.ts b/packages/web3-eth-contract/test/fixtures/AbiItem.ts new file mode 100644 index 00000000000..bcc94ce4b02 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/AbiItem.ts @@ -0,0 +1,99 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const Abi = { + anonymous: false, + constant: true, + inputs: [ + { + name: 'testMe', + type: 'uint256[3]' + }, + { + name: 'inputA', + type: 'tuple', + components: [ + { + name: 'a', + type: 'uint8' + }, + { + name: 'b', + type: 'uint8' + } + ] + }, + { + name: 'inputB', + type: 'tuple[]', + components: [ + { + name: 'a1', + type: 'uint256' + }, + { + name: 'a2', + type: 'uint256' + } + ] + }, + { + name: 'inputC', + type: 'uint8', + indexed: false + } + ], + name: "testName", + outputs: [ + { + name: "test", + type: "uint256" + }, + { + name: 'outputA', + type: 'tuple', + components: [ + { + name: 'a', + type: 'uint8' + }, + { + name: 'b', + type: 'uint8' + } + ] + }, + { + name: 'outputB', + type: 'tuple[]', + components: [ + { + name: 'a1', + type: 'uint256' + }, + { + name: 'a2', + type: 'uint256' + } + ] + } + ], + payable: false, + stateMutability: "pure", + type: "function", + gas: 175875 +} \ No newline at end of file diff --git a/packages/web3-eth-contract/test/fixtures/MyContract.json b/packages/web3-eth-contract/test/fixtures/MyContract.json new file mode 120000 index 00000000000..cdd501bfcbd --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/MyContract.json @@ -0,0 +1 @@ +../../../../fixtures/build/MyContract.json \ No newline at end of file diff --git a/packages/web3-eth-contract/test/fixtures/MyContract.ts b/packages/web3-eth-contract/test/fixtures/MyContract.ts new file mode 120000 index 00000000000..3cd9f98ecc1 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/MyContract.ts @@ -0,0 +1 @@ +../../../../fixtures/build/MyContract.ts \ No newline at end of file diff --git a/packages/web3-eth-contract/test/fixtures/SimpleOverloaded.ts b/packages/web3-eth-contract/test/fixtures/SimpleOverloaded.ts new file mode 100644 index 00000000000..d4a9a9515d8 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/SimpleOverloaded.ts @@ -0,0 +1,183 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const SimpleOverloadedAbi = [ + { + inputs: [], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'numToAdd', + type: 'uint256', + }, + { + internalType: 'string', + name: '_someString', + type: 'string', + }, + ], + name: 'getSecret', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'getSecret', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'numToAdd', + type: 'uint256', + }, + ], + name: 'getSecret', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'deadline', + type: 'uint256', + }, + { + internalType: 'bytes[]', + name: 'datas', + type: 'bytes[]', + }, + ], + name: 'multicall', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes[]', + name: 'datas', + type: 'bytes[]', + }, + ], + name: 'multicall', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'secret', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'numToAdd', + type: 'uint256', + }, + { + internalType: 'string', + name: '_someString', + type: 'string', + }, + ], + name: 'setSecret', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'numToAdd', + type: 'uint256', + }, + ], + name: 'setSecret', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'setSecret', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'someString', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const; + +export const SimpleOverloadedBytecode = + '608060405234801561001057600080fd5b50602a600081905550610da5806100286000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638d17664d116100665780638d17664d14610146578063ac9650d814610176578063b8bf4de714610192578063d1efd30d1461019c578063e7a96f6d146101ba5761009e565b806301a27378146100a35780632687b697146100d45780633b4dbf8b146100f05780635ae401dc1461010c5780635b9fdc3014610128575b600080fd5b6100bd60048036038101906100b89190610540565b6101d8565b6040516100cb92919061063f565b60405180910390f35b6100ee60048036038101906100e99190610540565b61021b565b005b61010a6004803603810190610105919061066f565b61024a565b005b610126600480360381019061012191906106f2565b610265565b005b610130610328565b60405161013d9190610752565b60405180910390f35b610160600480360381019061015b919061066f565b610331565b60405161016d9190610752565b60405180910390f35b610190600480360381019061018b919061076d565b610348565b005b61019a6103fd565b005b6101a4610407565b6040516101b19190610752565b60405180910390f35b6101c261040d565b6040516101cf91906107ba565b60405180910390f35b60006060846000546101ea919061080b565b6001858560405160200161020093929190610976565b60405160208183030381529060405291509150935093915050565b8260008082825461022c919061080b565b92505081905550818160019182610244929190610b6d565b50505050565b8060008082825461025b919061080b565b9250508190555050565b8242111561027257600080fd5b60005b82829050811015610322573073ffffffffffffffffffffffffffffffffffffffff168383838181106102aa576102a9610c3d565b5b90506020028101906102bc9190610c7b565b6040516102ca929190610d0e565b6000604051808303816000865af19150503d8060008114610307576040519150601f19603f3d011682016040523d82523d6000602084013e61030c565b606091505b505050808061031a90610d27565b915050610275565b50505050565b60008054905090565b600081600054610341919061080b565b9050919050565b60005b828290508110156103f8573073ffffffffffffffffffffffffffffffffffffffff168383838181106103805761037f610c3d565b5b90506020028101906103929190610c7b565b6040516103a0929190610d0e565b6000604051808303816000865af19150503d80600081146103dd576040519150601f19603f3d011682016040523d82523d6000602084013e6103e2565b606091505b50505080806103f090610d27565b91505061034b565b505050565b602a600081905550565b60005481565b6001805461041a9061086e565b80601f01602080910402602001604051908101604052809291908181526020018280546104469061086e565b80156104935780601f1061046857610100808354040283529160200191610493565b820191906000526020600020905b81548152906001019060200180831161047657829003601f168201915b505050505081565b600080fd5b600080fd5b6000819050919050565b6104b8816104a5565b81146104c357600080fd5b50565b6000813590506104d5816104af565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610500576104ff6104db565b5b8235905067ffffffffffffffff81111561051d5761051c6104e0565b5b602083019150836001820283011115610539576105386104e5565b5b9250929050565b6000806000604084860312156105595761055861049b565b5b6000610567868287016104c6565b935050602084013567ffffffffffffffff811115610588576105876104a0565b5b610594868287016104ea565b92509250509250925092565b6105a9816104a5565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156105e95780820151818401526020810190506105ce565b60008484015250505050565b6000601f19601f8301169050919050565b6000610611826105af565b61061b81856105ba565b935061062b8185602086016105cb565b610634816105f5565b840191505092915050565b600060408201905061065460008301856105a0565b81810360208301526106668184610606565b90509392505050565b6000602082840312156106855761068461049b565b5b6000610693848285016104c6565b91505092915050565b60008083601f8401126106b2576106b16104db565b5b8235905067ffffffffffffffff8111156106cf576106ce6104e0565b5b6020830191508360208202830111156106eb576106ea6104e5565b5b9250929050565b60008060006040848603121561070b5761070a61049b565b5b6000610719868287016104c6565b935050602084013567ffffffffffffffff81111561073a576107396104a0565b5b6107468682870161069c565b92509250509250925092565b600060208201905061076760008301846105a0565b92915050565b600080602083850312156107845761078361049b565b5b600083013567ffffffffffffffff8111156107a2576107a16104a0565b5b6107ae8582860161069c565b92509250509250929050565b600060208201905081810360008301526107d48184610606565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610816826104a5565b9150610821836104a5565b9250828201905080821115610839576108386107dc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061088657607f821691505b6020821081036108995761089861083f565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546108cc8161086e565b6108d6818661089f565b945060018216600081146108f1576001811461090657610939565b60ff1983168652811515820286019350610939565b61090f856108aa565b60005b8381101561093157815481890152600182019150602081019050610912565b838801955050505b50505092915050565b82818337600083830152505050565b600061095d838561089f565b935061096a838584610942565b82840190509392505050565b600061098282866108bf565b915061098f828486610951565b9150819050949350505050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b600060088302610a237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826109e6565b610a2d86836109e6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000610a6a610a65610a60846104a5565b610a45565b6104a5565b9050919050565b6000819050919050565b610a8483610a4f565b610a98610a9082610a71565b8484546109f3565b825550505050565b600090565b610aad610aa0565b610ab8818484610a7b565b505050565b5b81811015610adc57610ad1600082610aa5565b600181019050610abe565b5050565b601f821115610b2157610af2816108aa565b610afb846109d6565b81016020851015610b0a578190505b610b1e610b16856109d6565b830182610abd565b50505b505050565b600082821c905092915050565b6000610b4460001984600802610b26565b1980831691505092915050565b6000610b5d8383610b33565b9150826002028217905092915050565b610b77838361099c565b67ffffffffffffffff811115610b9057610b8f6109a7565b5b610b9a825461086e565b610ba5828285610ae0565b6000601f831160018114610bd45760008415610bc2578287013590505b610bcc8582610b51565b865550610c34565b601f198416610be2866108aa565b60005b82811015610c0a57848901358255600182019150602085019450602081019050610be5565b86831015610c275784890135610c23601f891682610b33565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112610c9857610c97610c6c565b5b80840192508235915067ffffffffffffffff821115610cba57610cb9610c71565b5b602083019250600182023603831315610cd657610cd5610c76565b5b509250929050565b600081905092915050565b6000610cf58385610cde565b9350610d02838584610942565b82840190509392505050565b6000610d1b828486610ce9565b91508190509392505050565b6000610d32826104a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610d6457610d636107dc565b5b60018201905091905056fea264697066735822122051bf349567ac5068fe1c4aeb5f09d024556608a3de408fb2ad8bee6570f865c864736f6c63430008130033'; diff --git a/packages/web3-eth-contract/test/fixtures/accounts.json b/packages/web3-eth-contract/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-eth-contract/test/fixtures/contracts/SampleStorageContract.sol b/packages/web3-eth-contract/test/fixtures/contracts/SampleStorageContract.sol new file mode 100644 index 00000000000..617c3732fdb --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/contracts/SampleStorageContract.sol @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +pragma solidity ^0.8.7; + +contract SampleStorageContract { + uint256 uintNum; + + event NEWNUM(uint256 param); + + function storeNum(uint256 param) public { + uintNum = param; + emit NEWNUM(param); + } + + function retrieveNum() public view returns (uint256) { + return uintNum; + } +} diff --git a/packages/web3-eth-contract/test/fixtures/contracts/SimpleOverloaded.sol b/packages/web3-eth-contract/test/fixtures/contracts/SimpleOverloaded.sol new file mode 100644 index 00000000000..3aa74fa05d8 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/contracts/SimpleOverloaded.sol @@ -0,0 +1,52 @@ +pragma solidity 0.8.19; + +contract SimpleOverload { + uint256 public secret; + string public someString; + + constructor() { + secret = 42; + } + + function getSecret() public view returns (uint256) { + return secret; + } + + function getSecret(uint256 numToAdd) public view returns (uint256) { + return secret + numToAdd; + } + + function getSecret(uint256 numToAdd, string calldata _someString) + public + view + returns (uint256, string memory) + { + return (secret + numToAdd, string.concat(someString, _someString)); + } + + function setSecret() public { + secret = 42; + } + + function setSecret(uint256 numToAdd) public { + secret += numToAdd; + } + + function setSecret(uint256 numToAdd, string calldata _someString) public { + secret += numToAdd; + someString = _someString; + } + + function multicall(bytes[] calldata datas) external { + for (uint256 i = 0; i < datas.length; i++) { + address(this).call(datas[i]); + } + } + + function multicall(uint256 deadline, bytes[] calldata datas) external { + require(block.timestamp <= deadline); + for (uint256 i = 0; i < datas.length; i++) { + address(this).call(datas[i]); + } + } +} diff --git a/packages/web3-eth-contract/test/fixtures/erc20.ts b/packages/web3-eth-contract/test/fixtures/erc20.ts new file mode 100644 index 00000000000..cf4b595ec8d --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/erc20.ts @@ -0,0 +1,284 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address, Numbers } from 'web3-types'; +import { LogsSubscription } from '../../src/log_subscription'; +import { ContractEventOptions, PayableMethodObject, NonPayableMethodObject } from '../../src/types'; + +export interface Erc20Interface { + methods: { + [key: string]: ( + ...args: ReadonlyArray + ) => + | PayableMethodObject, ReadonlyArray> + | NonPayableMethodObject, ReadonlyArray>; + + name: () => NonPayableMethodObject<[], [string]>; + + approve: ( + _spender: string, + _value: Numbers, + ) => NonPayableMethodObject<[_spender: string, _value: Numbers], [boolean]>; + totalSupply: () => NonPayableMethodObject<[], [Numbers]>; + transferFrom: ( + _from: Address, + _to: Address, + _value: Numbers, + ) => NonPayableMethodObject<[_from: Address, _to: Address, _value: Numbers], [boolean]>; + decimals: () => NonPayableMethodObject<[], [Numbers]>; + balanceOf: (_owner: Address) => NonPayableMethodObject<[_owner: Address], [Numbers]>; + symbol: () => NonPayableMethodObject<[], [string]>; + transfer: ( + _to: Address, + _value: Numbers, + ) => NonPayableMethodObject<[_to: Address, _value: Numbers], [boolean]>; + allowance: ( + _owner: Address, + _spender: Address, + ) => NonPayableMethodObject<[_owner: Address, _spender: Address], [Numbers]>; + }; + + events: { + [key: string]: (options?: ContractEventOptions) => LogsSubscription; + Approval: (options?: ContractEventOptions) => LogsSubscription; + Transfer: (options?: ContractEventOptions) => LogsSubscription; + }; +} + +// https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/ +export const erc20Abi = [ + { + constant: true, + inputs: [], + name: 'name', + outputs: [ + { + name: '', + type: 'string', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_spender', + type: 'address', + }, + { + name: '_value', + type: 'uint256', + }, + ], + name: 'approve', + outputs: [ + { + name: '', + type: 'bool', + }, + ], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'totalSupply', + outputs: [ + { + name: '', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_from', + type: 'address', + }, + { + name: '_to', + type: 'address', + }, + { + name: '_value', + type: 'uint256', + }, + ], + name: 'transferFrom', + outputs: [ + { + name: '', + type: 'bool', + }, + ], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'decimals', + outputs: [ + { + name: '', + type: 'uint8', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: '_owner', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + name: 'balance', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'symbol', + outputs: [ + { + name: '', + type: 'string', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_to', + type: 'address', + }, + { + name: '_value', + type: 'uint256', + }, + ], + name: 'transfer', + outputs: [ + { + name: '', + type: 'bool', + }, + ], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: '_owner', + type: 'address', + }, + { + name: '_spender', + type: 'address', + }, + ], + name: 'allowance', + outputs: [ + { + name: '', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + payable: true, + stateMutability: 'payable', + type: 'fallback', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + name: 'owner', + type: 'address', + }, + { + indexed: true, + name: 'spender', + type: 'address', + }, + { + indexed: false, + name: 'value', + type: 'uint256', + }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + name: 'from', + type: 'address', + }, + { + indexed: true, + name: 'to', + type: 'address', + }, + { + indexed: false, + name: 'value', + type: 'uint256', + }, + ], + name: 'Transfer', + type: 'event', + }, +] as const; diff --git a/packages/web3-eth-contract/test/fixtures/erc721.ts b/packages/web3-eth-contract/test/fixtures/erc721.ts new file mode 100644 index 00000000000..36c87289c24 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/erc721.ts @@ -0,0 +1,323 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address, Numbers } from 'web3-types'; +import { LogsSubscription } from '../../src/log_subscription'; +import { ContractEventOptions, NonPayableMethodObject, PayableMethodObject } from '../../src/types'; + +export interface Erc721Interface { + methods: { + [key: string]: ( + ...args: ReadonlyArray + ) => + | PayableMethodObject, ReadonlyArray> + | NonPayableMethodObject, ReadonlyArray>; + getApproved: (_tokenId: Numbers) => NonPayableMethodObject<[_tokenId: Numbers], [Address]>; + approve: ( + _approved: Address, + _tokenId: Numbers, + ) => PayableMethodObject<[_approved: Address, _tokenId: Numbers], []>; + transferFrom: ( + _from: Address, + _to: Address, + _tokenId: Numbers, + ) => PayableMethodObject<[_from: Address, _to: Address, _tokenId: Numbers], []>; + safeTransferFrom: ( + _from: Address, + _to: Address, + _tokenId: Numbers, + ) => PayableMethodObject<[_from: Address, _to: Address, _tokenId: Numbers], []>; + ownerOf: (_tokenId: Numbers) => NonPayableMethodObject<[_tokenId: Numbers], [Address]>; + balanceOf: (_owner: Address) => NonPayableMethodObject<[_owner: Address], [Numbers]>; + setApprovalForAll: ( + _operator: Address, + _approved: boolean, + ) => NonPayableMethodObject<[_operator: Address, _approved: boolean], []>; + + isApprovedForAll: ( + _owner: Address, + _operator: Address, + ) => NonPayableMethodObject<[_owner: Address, _operator: Address], [boolean]>; + }; + + events: { + [key: string]: (options?: ContractEventOptions) => LogsSubscription; + Transfer: (options?: ContractEventOptions) => LogsSubscription; + Approval: (options?: ContractEventOptions) => LogsSubscription; + ApprovalForAll: (options?: ContractEventOptions) => LogsSubscription; + }; +} + +// https://eips.ethereum.org/EIPS/eip-721 +// Copied interface from above link to Remix and compile +export const erc721Abi = [ + { + constant: true, + inputs: [ + { + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'getApproved', + outputs: [ + { + name: '', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_approved', + type: 'address', + }, + { + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'approve', + outputs: [], + payable: true, + stateMutability: 'payable', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_from', + type: 'address', + }, + { + name: '_to', + type: 'address', + }, + { + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'transferFrom', + outputs: [], + payable: true, + stateMutability: 'payable', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_from', + type: 'address', + }, + { + name: '_to', + type: 'address', + }, + { + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'safeTransferFrom', + outputs: [], + payable: true, + stateMutability: 'payable', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'ownerOf', + outputs: [ + { + name: '', + type: 'address', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: '_owner', + type: 'address', + }, + ], + name: 'balanceOf', + outputs: [ + { + name: '', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + constant: false, + inputs: [ + { + name: '_operator', + type: 'address', + }, + { + name: '_approved', + type: 'bool', + }, + ], + name: 'setApprovalForAll', + outputs: [], + payable: false, + stateMutability: 'nonpayable', + type: 'function', + }, + + // TODO: Need to check how to handle overloads in generics + // This is overloaded method + { + constant: false, + inputs: [ + { + name: '_from', + type: 'address', + }, + { + name: '_to', + type: 'address', + }, + { + name: '_tokenId', + type: 'uint256', + }, + { + name: 'data', + type: 'bytes', + }, + ], + name: 'safeTransferFrom', + outputs: [], + payable: true, + stateMutability: 'payable', + type: 'function', + }, + { + constant: true, + inputs: [ + { + name: '_owner', + type: 'address', + }, + { + name: '_operator', + type: 'address', + }, + ], + name: 'isApprovedForAll', + outputs: [ + { + name: '', + type: 'bool', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + name: '_from', + type: 'address', + }, + { + indexed: true, + name: '_to', + type: 'address', + }, + { + indexed: true, + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + name: '_owner', + type: 'address', + }, + { + indexed: true, + name: '_approved', + type: 'address', + }, + { + indexed: true, + name: '_tokenId', + type: 'uint256', + }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + name: '_owner', + type: 'address', + }, + { + indexed: true, + name: '_operator', + type: 'address', + }, + { + indexed: false, + name: '_approved', + type: 'bool', + }, + ], + name: 'ApprovalForAll', + type: 'event', + }, +] as const; diff --git a/packages/web3-eth-contract/test/fixtures/storage.ts b/packages/web3-eth-contract/test/fixtures/storage.ts new file mode 100644 index 00000000000..5ec10ed2c37 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/storage.ts @@ -0,0 +1,59 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// sample storage contract ABI +export const sampleStorageContractABI = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: 'param', + type: 'uint256', + }, + ], + name: 'NEWNUM', + type: 'event', + }, + { + inputs: [], + name: 'retrieveNum', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'param', + type: 'uint256', + }, + ], + name: 'storeNum', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +]; diff --git a/packages/web3-eth-contract/test/fixtures/system_test_utils.ts b/packages/web3-eth-contract/test/fixtures/system_test_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/system_test_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-eth-contract/test/fixtures/unitTestFixtures.ts b/packages/web3-eth-contract/test/fixtures/unitTestFixtures.ts new file mode 100644 index 00000000000..1316e0f6e58 --- /dev/null +++ b/packages/web3-eth-contract/test/fixtures/unitTestFixtures.ts @@ -0,0 +1,142 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const getLogsData = { + request: { + fromBlock: 'earliest', + toBlock: 'latest', + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + }, + + response: [ + { + logIndex: 1, + transactionIndex: 0, + transactionHash: '0xbe70733bcf87282c0ba9bf3c0e2d545084fad48bd571c314140c8dc1db882673', + blockHash: '0x78755c18c9a0a1283fa04b2f78c7794c249395b08f7f7dff304034d64d6a1607', + blockNumber: 25, + address: '0x2D029a4bd792d795f35e0583F64eD9DedeBBa849', + data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000', + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + type: 'mined', + id: 'log_886b29f0', + }, + ], +}; + +export const getPastEventsData = { + event: 'GREETING_CHANGED', + response: [ + { + logIndex: BigInt(1), + transactionIndex: BigInt(0), + transactionHash: '0xbe70733bcf87282c0ba9bf3c0e2d545084fad48bd571c314140c8dc1db882673', + blockHash: '0x78755c18c9a0a1283fa04b2f78c7794c249395b08f7f7dff304034d64d6a1607', + blockNumber: BigInt(25), + address: '0x2D029a4bd792d795f35e0583F64eD9DedeBBa849', + data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000', + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + returnValues: { + '0': 'Hello', + __length__: 1, + greeting: 'Hello', + }, + event: 'GREETING_CHANGED', + signature: '0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e', + raw: { + data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000', + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + }, + }, + ], +}; + +export const AllGetPastEventsData = { + getLogsData: [ + { + logIndex: 0, + transactionIndex: 0, + transactionHash: '0x1ba478ce1810bfa8a0725c0ca94f3cfe163a70c396037a1f3c94cad34e497959', + blockHash: '0x79eece1fb22b7109f302b65bd826b1cebf9f704642e86ae9086ed93baf44a45e', + blockNumber: 20, + address: '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426', + data: '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010416e6f74686572204772656574696e6700000000000000000000000000000000', + topics: ['0x0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b75'], + type: 'mined', + id: 'log_0a03b06c', + }, + { + logIndex: 1, + transactionIndex: 0, + transactionHash: '0x1ba478ce1810bfa8a0725c0ca94f3cfe163a70c396037a1f3c94cad34e497959', + blockHash: '0x79eece1fb22b7109f302b65bd826b1cebf9f704642e86ae9086ed93baf44a45e', + blockNumber: 20, + address: '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426', + data: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010416e6f74686572204772656574696e6700000000000000000000000000000000', + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + type: 'mined', + id: 'log_389ae161', + }, + ], + + response: [ + { + logIndex: BigInt(0), + transactionIndex: BigInt(0), + transactionHash: '0x1ba478ce1810bfa8a0725c0ca94f3cfe163a70c396037a1f3c94cad34e497959', + blockHash: '0x79eece1fb22b7109f302b65bd826b1cebf9f704642e86ae9086ed93baf44a45e', + blockNumber: BigInt(20), + address: '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426', + data: '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010416e6f74686572204772656574696e6700000000000000000000000000000000', + topics: ['0x0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b75'], + returnValues: { + '0': 'Hello', + '1': 'Another Greeting', + __length__: 2, + from: 'Hello', + to: 'Another Greeting', + }, + event: 'GREETING_CHANGING', + signature: '0x0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b75', + raw: { + data: '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010416e6f74686572204772656574696e6700000000000000000000000000000000', + topics: ['0x0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b75'], + }, + }, + { + logIndex: BigInt(1), + transactionIndex: BigInt(0), + transactionHash: '0x1ba478ce1810bfa8a0725c0ca94f3cfe163a70c396037a1f3c94cad34e497959', + blockHash: '0x79eece1fb22b7109f302b65bd826b1cebf9f704642e86ae9086ed93baf44a45e', + blockNumber: BigInt(20), + address: '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426', + data: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010416e6f74686572204772656574696e6700000000000000000000000000000000', + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + returnValues: { + '0': 'Another Greeting', + __length__: 1, + greeting: 'Another Greeting', + }, + event: 'GREETING_CHANGED', + signature: '0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e', + raw: { + data: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010416e6f74686572204772656574696e6700000000000000000000000000000000', + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + }, + }, + ], +}; diff --git a/packages/web3-eth-contract/test/integration/contract_accesslist.test.ts b/packages/web3-eth-contract/test/integration/contract_accesslist.test.ts new file mode 100644 index 00000000000..23934b05016 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_accesslist.test.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Contract } from '../../src'; +import { GreeterBytecode, GreeterAbi } from '../shared_fixtures/build/Greeter'; +import { + getSystemTestProvider, + createTempAccount, + describeIf, + getSystemTestBackend, + BACKEND +} from '../fixtures/system_test_utils'; + +describe('contract', () => { + describeIf(getSystemTestBackend() === BACKEND.GETH)('createAccessList', () => { + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + let acc: { address: string; privateKey: string }; + + beforeEach(async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + acc = await createTempAccount(); + + deployOptions = { + data: GreeterBytecode, + arguments: ['My Greeting'], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + }); + + it('create access list for setter', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + deployedContract.defaultAccount = acc.address; + + const receipt = await deployedContract.methods + .setGreeting('New Greeting') + .send({ gas: '1000000' }); + expect(receipt.from).toEqual(acc.address); + + const accessList = await deployedContract.methods + .setGreeting('New Greeting') + .createAccessList(); + + const accessListResult = { + accessList: [ + { + address: deployedContract.options.address?.toLowerCase(), + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + gasUsed: '0x866b', + }; + + expect(accessList).toStrictEqual(accessListResult); + }); + + it('create access list for getter', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + deployedContract.defaultAccount = acc.address; + + const receipt = await deployedContract.methods + .setGreeting('New Greeting') + .send({ gas: '1000000' }); + expect(receipt.from).toEqual(acc.address); + + const accessList = await deployedContract.methods.greet().createAccessList(); + + const accessListResult = { + accessList: [ + { + address: deployedContract.options.address?.toLowerCase(), + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + gasUsed: '0x68ab', + }; + + expect(accessList).toStrictEqual(accessListResult); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_clone.test.ts b/packages/web3-eth-contract/test/integration/contract_clone.test.ts new file mode 100644 index 00000000000..873ac0658ea --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_clone.test.ts @@ -0,0 +1,48 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Contract } from '../../src'; +import { GreeterBytecode, GreeterAbi } from '../shared_fixtures/build/Greeter'; +import { getSystemTestProvider, createTempAccount } from '../fixtures/system_test_utils'; + +describe('contract', () => { + describe('clone', () => { + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + beforeAll(async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + const acc = await createTempAccount(); + + deployOptions = { + data: GreeterBytecode, + arguments: ['My Greeting'], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + }); + + it('should clone the contract but with same address', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + const newContract = deployedContract.clone(); + expect(newContract).toBeInstanceOf(Contract); + expect(newContract).not.toBe(deployedContract); + expect(newContract.options.address).toBe(deployedContract.options.address); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_defaults.test.ts b/packages/web3-eth-contract/test/integration/contract_defaults.test.ts new file mode 100644 index 00000000000..b481237c739 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_defaults.test.ts @@ -0,0 +1,127 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3BaseProvider } from 'web3-types'; +import { Web3Context } from 'web3-core'; + +import { Contract } from '../../src'; +import { GreeterBytecode, GreeterAbi } from '../shared_fixtures/build/Greeter'; +import { getSystemTestProvider, createTempAccount } from '../fixtures/system_test_utils'; + +describe('contract', () => { + describe('defaults', () => { + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + let acc: { address: string; privateKey: string }; + + beforeEach(async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + acc = await createTempAccount(); + + deployOptions = { + data: GreeterBytecode, + arguments: ['My Greeting'], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + }); + + it('should use "defaultAccount" on "instance" level instead of "from"', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + // eslint-disable-next-line prefer-destructuring + deployedContract.defaultAccount = acc.address; + // We didn't specify "from" in this call + const receipt = await deployedContract.methods + .setGreeting('New Greeting') + .send({ gas: '1000000' }); + expect(receipt.from).toEqual(acc.address); + }); + + it('should throw error when "from" is not set on any level', () => { + contract.defaultAccount = undefined; + + expect(() => contract.deploy(deployOptions).send({ gas: '1000000' })).toThrow( + 'Contract "from" address not specified', + ); + }); + + it('should set syncWithContext from init options', async () => { + contract = new Contract(GreeterAbi, { + provider: getSystemTestProvider(), + syncWithContext: true, + }); + + contract = await contract.deploy(deployOptions).send(sendOptions); + + expect(contract.syncWithContext).toBeTruthy(); + }); + + it('should subscribe to provided context upon instantiation', () => { + const web3Context = new Web3Context('http://127.0.0.1:8545'); + const _contract = new Contract([], { syncWithContext: true }, web3Context); + expect(_contract.defaultBlock).toBe('latest'); + + web3Context.defaultBlock = 'earliest'; + expect(_contract.defaultBlock).toBe('earliest'); + }); + + describe('defaultBlock', () => { + it('should use "defaultBlock" on "instance" level', async () => { + contract = await contract.deploy(deployOptions).send(sendOptions); + + await contract.methods.setGreeting('New Greeting').send(sendOptions); + + const requestSpy = jest.spyOn( + contract.currentProvider as Web3BaseProvider, + 'request', + ); + contract.defaultBlock = 'pending'; + + await contract.methods.greet().call(); + + expect(requestSpy).toHaveBeenCalledWith( + expect.objectContaining({ params: [expect.any(Object), 'pending'] }), + ); + }); + + it('should use "defaultBlock" on "call" level', async () => { + contract = await contract.deploy(deployOptions).send(sendOptions); + + await contract.methods.setGreeting('New Greeting').send(sendOptions); + + const requestSpy = jest.spyOn( + contract.currentProvider as Web3BaseProvider, + 'request', + ); + + // Forcefully delete this property from the contract instance + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + contract.defaultBlock = undefined; + + await contract.methods.greet().call(undefined, 'pending'); + + expect(requestSpy).toHaveBeenCalledWith( + expect.objectContaining({ params: [expect.any(Object), 'pending'] }), + ); + }); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_defaults_extra.test.ts b/packages/web3-eth-contract/test/integration/contract_defaults_extra.test.ts new file mode 100644 index 00000000000..206b10ee709 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_defaults_extra.test.ts @@ -0,0 +1,320 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ValidChains, Hardfork, TransactionReceipt } from 'web3-types'; +import * as Web3Eth from 'web3-eth'; +import { TransactionBlockTimeoutError } from 'web3-errors'; +import { Contract } from '../../src'; +import { GreeterBytecode, GreeterAbi } from '../shared_fixtures/build/Greeter'; +import { + getSystemTestProvider, + createTempAccount, + describeIf, + isWs, + isHttp, + closeOpenConnection, +} from '../fixtures/system_test_utils'; + +type Resolve = (value?: unknown) => void; +const MAX_32_SIGNED_INTEGER = 2147483647; + +jest.mock('web3-eth', () => { + const original = jest.requireActual('web3-eth'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return { + ...original, + call: jest.fn().mockImplementation(original.call), + sendTransaction: jest.fn().mockImplementation(original.sendTransaction), + }; +}); + +describe('contract defaults (extra)', () => { + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + let acc: { address: string; privateKey: string }; + + beforeEach(async () => { + acc = await createTempAccount(); + + deployOptions = { + data: GreeterBytecode, + arguments: ['My Greeting'], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + }); + + afterEach(async () => { + await closeOpenConnection(contract); + }); + + it('should use "defaultHardfork" on "instance" level', async () => { + const hardfork = 'berlin'; + + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + + contract = await contract.deploy(deployOptions).send(sendOptions); + contract.defaultHardfork = hardfork; + + await contract.methods.setGreeting('New Greeting').send(sendOptions); + await contract.methods.greet().send(sendOptions); + + expect(contract.defaultHardfork).toBe(hardfork); + const callSpy = jest.spyOn(Web3Eth, 'call'); + + await contract.methods.greet().call(); + + expect(callSpy).toHaveBeenLastCalledWith( + expect.objectContaining({ + config: expect.objectContaining({ defaultHardfork: hardfork }), + }), + expect.any(Object), + undefined, + expect.any(Object), + ); + }); + + describe('defaultChain', () => { + it('should use "defaultChain" on "instance" level', async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + + contract = await contract.deploy(deployOptions).send(sendOptions); + + expect(contract.defaultChain).toBe('mainnet'); + + const defaultChain = 'ropsten'; + contract.defaultChain = defaultChain; + + expect(contract.defaultChain).toBe(defaultChain); + + await contract.methods.setGreeting('New Greeting').send(sendOptions); + + const callSpy = jest.spyOn(Web3Eth, 'call'); + + await contract.methods.greet().call(); + + expect(callSpy).toHaveBeenCalledWith( + expect.objectContaining({ + config: expect.objectContaining({ defaultChain }), + }), + expect.any(Object), + undefined, + expect.any(Object), + ); + }); + }); + + describe('defaultCommon', () => { + const baseChain = 'mainnet' as ValidChains; + const common = { + customChain: { name: 'testnet', networkId: '1337', chainId: '1337' }, + baseChain, + hardfork: 'london' as Hardfork, + }; + + beforeEach(async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + acc = await createTempAccount(); + + deployOptions = { + data: GreeterBytecode, + arguments: ['My Greeting'], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + + contract = await contract.deploy(deployOptions).send(sendOptions); + }); + + it('should use "defaultCommon" on "instance" level', async () => { + contract.defaultCommon = common; + const callSpy = jest.spyOn(Web3Eth, 'call'); + + await contract.methods.greet().call(); + + expect(callSpy).toHaveBeenCalledWith( + expect.objectContaining({ + config: expect.objectContaining({ defaultCommon: common }), + }), + expect.any(Object), + undefined, + expect.any(Object), + ); + }); + }); + + describeIf(isWs)('transactionBlockTimeout', () => { + it('should use "transactionBlockTimeout" on "instance" level', async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + contract = await contract.deploy(deployOptions).send(sendOptions); + + const sendTransactionSpy = jest.spyOn(Web3Eth, 'sendTransaction'); + expect(contract.transactionBlockTimeout).toBe(50); + + contract.transactionBlockTimeout = 32; + expect(contract.transactionBlockTimeout).toBe(32); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + await contract.methods.setGreeting('New Greeting').send(sendOptions); + + expect(sendTransactionSpy).toHaveBeenLastCalledWith( + expect.objectContaining({ + config: expect.objectContaining({ transactionBlockTimeout: 32 }), + }), + expect.any(Object), + expect.any(Object), + expect.any(Object), + ); + }); + + it('should fail if transaction was not mined within `transactionBlockTimeout` blocks', async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + contract = await contract.deploy(deployOptions).send(sendOptions); + + // Make the test run faster by casing the polling to start after 2 blocks + contract.transactionBlockTimeout = 1; + // Prevent transaction from stucking for a long time if the provider (like Ganache v7.4.0) + // does not respond, when raising the nonce + contract.transactionSendTimeout = MAX_32_SIGNED_INTEGER; + // Increase other timeouts + contract.transactionPollingTimeout = MAX_32_SIGNED_INTEGER; + + // Setting a high `nonce` when sending a transaction, to cause the RPC call to stuck at the Node + // The previous test has the nonce set to Number.MAX_SAFE_INTEGER. + // So, just decrease 1 from it here to not fall into another error. + const sentTx = contract.methods.setGreeting('New Greeting with high nonce').send({ + ...sendOptions, + nonce: (Number.MAX_SAFE_INTEGER - 1).toString(), + }); + + // Some providers (mostly used for development) will make blocks only when there are new transactions + // So, send 2 transactions because in this test `transactionBlockTimeout = 2`. And do nothing if an error happens. + setTimeout(() => { + (async () => { + try { + await contract.methods.setGreeting('New Greeting').send(sendOptions); + } catch (error) { + // Nothing needed to be done. + } + try { + await contract.methods.setGreeting('New Greeting').send(sendOptions); + } catch (error) { + // Nothing needed to be done. + } + })() as unknown; + }, 100); + + await expect(sentTx).rejects.toThrow(/was not mined within [0-9]+ blocks/); + + await expect(sentTx).rejects.toThrow(TransactionBlockTimeoutError); + }); + }); + + describeIf(isWs)('blockHeaderTimeout', () => { + it('should use "blockHeaderTimeout" on "instance" level', async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + + contract = await contract.deploy(deployOptions).send(sendOptions); + + expect(contract.blockHeaderTimeout).toBe(10); + + const blockHeaderTimeout = 1; + contract.blockHeaderTimeout = blockHeaderTimeout; + + expect(contract.blockHeaderTimeout).toBe(blockHeaderTimeout); + + const sentTx = contract.methods.setGreeting('New Greeting').send(sendOptions); + + const confirmationPromise = new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on( + 'confirmation', + async ({ confirmations }: { confirmations: bigint }) => { + if (confirmations >= blockHeaderTimeout) { + resolve(); + } else { + // Send a transaction to cause dev providers creating new blocks to fire the 'confirmation' event again. + await contract.methods.setGreeting('New Greeting').send(sendOptions); + } + }, + ); + }); + await new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on('receipt', (params: TransactionReceipt) => { + expect(params.status).toBe(BigInt(1)); + resolve(); + }); + }); + + await sentTx; + await confirmationPromise; + sentTx.removeAllListeners(); + }); + }); + + describeIf(isHttp)('transactionPollingInterval', () => { + it('should use "transactionPollingTimeout" on "instance" level', async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + + contract = await contract.deploy(deployOptions).send(sendOptions); + + const transactionPollingInterval = 500; + contract.transactionPollingInterval = transactionPollingInterval; + + expect(contract.transactionPollingInterval).toBe(transactionPollingInterval); + }); + }); + + it('should use "handleRevert" on "instance" level', async () => { + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + + contract = await contract.deploy(deployOptions).send(sendOptions); + + expect(contract.handleRevert).toBeFalsy(); + + const handleRevert = true; + contract.handleRevert = handleRevert; + + expect(contract.handleRevert).toBe(handleRevert); + + const sendTransactionSpy = jest.spyOn(Web3Eth, 'sendTransaction'); + + await contract.methods.setGreeting('New Greeting').send(sendOptions); + + expect(sendTransactionSpy).toHaveBeenCalled(); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_deploy.test.ts b/packages/web3-eth-contract/test/integration/contract_deploy.test.ts new file mode 100644 index 00000000000..1d7277fe881 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_deploy.test.ts @@ -0,0 +1,307 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Eth } from 'web3-eth'; +import { Contract } from '../../src'; +import { sleep } from '../shared_fixtures/utils'; +import { ERC721TokenAbi, ERC721TokenBytecode } from '../shared_fixtures/build/ERC721Token'; +import { GreeterBytecode, GreeterAbi } from '../shared_fixtures/build/Greeter'; +import { DeployRevertAbi, DeployRevertBytecode } from '../shared_fixtures/build/DeployRevert'; +import { + getSystemTestProvider, + isWs, + createTempAccount, + createNewAccount, + signTxAndSendEIP2930, + signTxAndSendEIP1559, + sendFewSampleTxs, + closeOpenConnection, + getSystemTestBackend, + BACKEND +} from '../fixtures/system_test_utils'; + +describe('contract', () => { + describe('deploy', () => { + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + let acc: { address: string; privateKey: string }; + let pkAccount: { address: string; privateKey: string }; + let web3Eth: Web3Eth; + + beforeAll(() => { + web3Eth = new Web3Eth(getSystemTestProvider()); + deployOptions = { + data: GreeterBytecode, + arguments: ['My Greeting'], + }; + }); + beforeEach(async () => { + acc = await createTempAccount(); + contract = new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }); + sendOptions = { from: acc.address, gas: '1000000' }; + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + describe('local account', () => { + it.each([signTxAndSendEIP1559, signTxAndSendEIP2930])( + 'should deploy the contract %p', + async signTxAndSend => { + pkAccount = await createNewAccount({ refill: true }); + + const deployData = contract.deploy(deployOptions); + + const res = await signTxAndSend( + contract.provider, + { + data: deployData.encodeABI(), + }, + pkAccount.privateKey, + ); + expect(Number(res.status)).toBe(1); + }, + ); + + it.each([signTxAndSendEIP1559, signTxAndSendEIP2930])( + 'should deploy the contract with input%p', + async signTxAndSend => { + pkAccount = await createNewAccount({ refill: true }); + + const deployData = contract.deploy(deployOptions); + + const res = await signTxAndSend( + contract.provider, + { + input: deployData.encodeABI(), + }, + pkAccount.privateKey, + ); + expect(Number(res.status)).toBe(1); + }, + ); + + it('should return estimated gas of contract constructor %p', async () => { + const estimatedGas = await new Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + }) + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .estimateGas({ + from: acc.address, + gas: '1000000', + }); + expect(Number(estimatedGas)).toBeGreaterThan(0); + }); + it('should return estimated gas of contract constructor without arguments', async () => { + const estimatedGas = await new Contract(ERC721TokenAbi, undefined, { + provider: getSystemTestProvider(), + }) + .deploy({ + data: ERC721TokenBytecode, + arguments: [], + }) + .estimateGas({ + from: acc.address, + gas: '10000000', + }); + expect(Number(estimatedGas)).toBeGreaterThan(0); + }); + it('should return estimated gas of contract method', async () => { + const contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + + const estimatedGas = await contractDeployed.methods + .setGreeting('Hello') + .estimateGas({ + gas: '1000000', + from: acc.address, + }); + expect(Number(estimatedGas)).toBeGreaterThan(0); + }); + it('should return estimated gas of contract method without arguments', async () => { + const contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + + const estimatedGas = await contractDeployed.methods.increment().estimateGas({ + gas: '1000000', + from: acc.address, + }); + expect(Number(estimatedGas)).toBeGreaterThan(0); + }); + }); + + it('should deploy the contract', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + + expect(deployedContract).toBeDefined(); + }); + + it('should deploy the contract if data is provided at initiation', async () => { + contract = new Contract(GreeterAbi, { + provider: getSystemTestProvider(), + data: GreeterBytecode, + from: acc.address, + gas: '1000000', + }); + const deployedContract = await contract.deploy({ arguments: ['Hello World'] }).send(); + + expect(deployedContract).toBeDefined(); + }); + + it('should return instance of the contract', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + + expect(deployedContract).toBeInstanceOf(Contract); + }); + + it('should set contract address on new contract instance', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + + expect(deployedContract.options.address).toBeDefined(); + }); + + it('should emit the "confirmation" event', async () => { + const confirmationHandler = jest.fn(); + contract.setConfig({ transactionConfirmationBlocks: 1 }); + await contract + .deploy(deployOptions) + .send(sendOptions) + .on('confirmation', confirmationHandler); + + // Wait for some time to allow the transaction to be processed + await sleep(500); + + // Deploy once again to trigger block mining to trigger confirmation + // We can send any other transaction as well + await contract.deploy(deployOptions).send(sendOptions); + + await sendFewSampleTxs(3); + + // Wait for some fraction of time to trigger the handler + // On http we use polling to get confirmation, so wait a bit longer + await sleep(isWs ? 500 : 2000); + + // eslint-disable-next-line jest/no-standalone-expect + expect(confirmationHandler).toHaveBeenCalled(); + }); + + it('should emit the "transactionHash" event', async () => { + const handler = jest.fn(); + + const promiEvent = contract + .deploy(deployOptions) + .send(sendOptions) + .on('transactionHash', handler); + + // Deploy the contract + await promiEvent; + + expect(handler).toHaveBeenCalled(); + }); + + it('should emit the "sending" event', async () => { + const handler = jest.fn(); + + const promiEvent = contract + .deploy(deployOptions) + .send(sendOptions) + .on('sending', handler); + + // Deploy the contract + await promiEvent; + + expect(handler).toHaveBeenCalled(); + }); + + it('should emit the "sent" event', async () => { + const handler = jest.fn(); + + const promiEvent = contract.deploy(deployOptions).send(sendOptions).on('sent', handler); + + // Deploy the contract + await promiEvent; + + expect(handler).toHaveBeenCalled(); + }); + + it('should emit the "receipt" event', async () => { + const handler = jest.fn(); + + const promiEvent = contract + .deploy(deployOptions) + .send(sendOptions) + .on('receipt', handler); + + // Deploy the contract + await promiEvent; + + expect(handler).toHaveBeenCalled(); + }); + + it('should fail with errors on "intrinsic gas too low" OOG', async () => { + if (getSystemTestBackend() !== BACKEND.HARDHAT){ + // eslint-disable-next-line jest/no-conditional-expect + await expect( + contract.deploy(deployOptions).send({ ...sendOptions, gas: '100' }), + ).rejects.toThrow('Returned error: intrinsic gas too low'); + } else { + // eslint-disable-next-line jest/no-conditional-expect + await expect( + contract.deploy(deployOptions).send({ ...sendOptions, gas: '100' }), + ).rejects.toThrow('Returned error: Transaction requires at least 109656 gas but got 100'); + } + }); + + it('should fail with errors deploying a zero length bytecode', () => { + return expect(() => + contract + .deploy({ + ...deployOptions, + data: '0x', + }) + .send(sendOptions), + ).toThrow('contract creation without any data provided.'); + }); + + it('should fail with errors on revert', async () => { + const revert = new Contract(DeployRevertAbi); + revert.provider = getSystemTestProvider(); + if (getSystemTestBackend() !== BACKEND.HARDHAT){ + // eslint-disable-next-line jest/no-conditional-expect + await expect( + revert + .deploy({ + data: DeployRevertBytecode, + }) + .send(sendOptions), + ).rejects.toThrow("code couldn't be stored"); + } else { + // eslint-disable-next-line jest/no-conditional-expect + await expect( + revert + .deploy({ + data: DeployRevertBytecode, + }) + .send(sendOptions), + ).rejects.toThrow("Error happened while trying to execute a function inside a smart contract"); + } + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_empty_string.test.ts b/packages/web3-eth-contract/test/integration/contract_empty_string.test.ts new file mode 100644 index 00000000000..25540c2ebf4 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_empty_string.test.ts @@ -0,0 +1,48 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Contract } from '../../src'; +import { getSystemTestProvider, createTempAccount } from '../fixtures/system_test_utils'; +import { MyContractAbi, MyContractBytecode } from '../fixtures/MyContract'; + +describe('request empty string from contract', () => { + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + beforeAll(async () => { + contract = new Contract(MyContractAbi, undefined, { + provider: getSystemTestProvider(), + }); + const acc = await createTempAccount(); + + deployOptions = { + data: MyContractBytecode, + arguments: [], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + }); + + it('should fetch empty string', async () => { + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + + const attribute = await deployedContract.methods.getAttr().call(); + + expect(attribute).toHaveLength(0); + expect(attribute).toBe(''); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_erc20.test.ts b/packages/web3-eth-contract/test/integration/contract_erc20.test.ts new file mode 100644 index 00000000000..5e268691aa5 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_erc20.test.ts @@ -0,0 +1,318 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { LogsOutput } from 'web3-types'; +import { Contract } from '../../src'; +import { ERC20TokenAbi, ERC20TokenBytecode } from '../shared_fixtures/build/ERC20Token'; +import { + getSystemTestProvider, + describeIf, + isWs, + createTempAccount, + createNewAccount, + refillAccount, + signAndSendContractMethodEIP1559, + signAndSendContractMethodEIP2930, +} from '../fixtures/system_test_utils'; +import { processAsync, toUpperCaseHex } from '../shared_fixtures/utils'; + +const initialSupply = BigInt('5000000000'); + +describe('contract', () => { + describe('erc20', () => { + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + beforeAll(() => { + contract = new Contract(ERC20TokenAbi, undefined, { + provider: getSystemTestProvider(), + }); + + deployOptions = { + data: ERC20TokenBytecode, + arguments: [initialSupply], + }; + }); + + it('should deploy the contract', async () => { + const acc = await createTempAccount(); + const sendOptionsLocal = { from: acc.address, gas: '10000000' }; + await expect( + contract.deploy(deployOptions).send(sendOptionsLocal), + ).resolves.toBeDefined(); + }); + + describe('contract instance', () => { + let contractDeployed: Contract; + let pkAccount: { address: string; privateKey: string }; + let mainAcc: { address: string; privateKey: string }; + const prepareForTransfer = async (value: string) => { + const tempAccount = await createTempAccount(); + await contractDeployed.methods.transfer(pkAccount.address, value).send(sendOptions); + return tempAccount; + }; + + beforeAll(async () => { + mainAcc = await createTempAccount(); + pkAccount = await createNewAccount(); + await refillAccount(mainAcc.address, pkAccount.address, '20000000000000000'); + sendOptions = { from: mainAcc.address, gas: '10000000' }; + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + }); + describe('methods', () => { + it('should return the name', async () => { + expect(await contractDeployed.methods.name().call()).toBe('Gold'); + }); + + it('should return the symbol', async () => { + expect(await contractDeployed.methods.symbol().call()).toBe('GLD'); + }); + + it('should return the decimals', async () => { + expect(await contractDeployed.methods.decimals().call()).toBe(BigInt(18)); + }); + + it('should return total supply', async () => { + expect(await contractDeployed.methods.totalSupply().call()).toBe(initialSupply); + }); + + it('should transfer tokens', async () => { + const acc2 = await createTempAccount(); + const value = BigInt(10); + const receipt = await contractDeployed.methods + .transfer(acc2.address, value) + .send(sendOptions); + + expect(receipt.events).toBeDefined(); + expect(receipt.events?.Transfer).toBeDefined(); + expect(receipt.events?.Transfer.event).toBe('Transfer'); + expect(String(receipt.events?.Transfer.returnValues.from).toLowerCase()).toBe( + mainAcc.address.toLowerCase(), + ); + expect(String(receipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + mainAcc.address.toLowerCase(), + ); + expect(String(receipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + acc2.address.toLowerCase(), + ); + expect(String(receipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + acc2.address.toLowerCase(), + ); + expect(receipt.events?.Transfer.returnValues.value).toBe(value); + expect(receipt.events?.Transfer.returnValues[2]).toBe(value); + + expect(await contractDeployed.methods.balanceOf(acc2.address).call()).toBe( + value, + ); + }); + + it('send tokens from the account that does not have ether', async () => { + const tempAccount = await createTempAccount(); + const test = await createNewAccount({ + unlock: true, + refill: false, + }); + + let catchError = false; + let catchErrorPromise; + try { + const promiEvent = contractDeployed.methods + .transfer(tempAccount.address, '0x1') + .send({ ...sendOptions, from: test.address }); + + catchErrorPromise = new Promise(resolve => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + promiEvent.on('error', err => { + // Returned error: insufficient funds for gas * price + value: balance 0, tx cost 25000327300000000, overshot 25000327300000000 + resolve(err); + }); + }); + await promiEvent; + } catch (e) { + // Returned error: insufficient funds for gas * price + value: balance 0, tx cost 25000327300000000, overshot 25000327300000000 + catchError = true; + } + expect(await catchErrorPromise).toBeDefined(); + expect(catchError).toBe(true); + }); + it('send tokens from the account that does not have tokens', async () => { + const tempAccount = await createTempAccount(); + const test = await createNewAccount({ + unlock: true, + refill: true, + }); + + let catchError = false; + let catchErrorPromise; + try { + const promiEvent = contractDeployed.methods + .transfer(tempAccount.address, '0x1') + .send({ ...sendOptions, from: test.address }); + + catchErrorPromise = new Promise(resolve => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + promiEvent.on('error', err => { + // Transaction has been reverted by the EVM + resolve(err); + }); + }); + await promiEvent; + } catch (e) { + // Transaction has been reverted by the EVM + catchError = true; + } + expect(await catchErrorPromise).toBeDefined(); + expect(catchError).toBe(true); + }); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should transfer tokens with local wallet %p', + async signAndSendContractMethod => { + const value = BigInt(10); + const tempAccount = await prepareForTransfer(value.toString()); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.transfer(tempAccount.address, value), + pkAccount.privateKey, + ); + + expect( + await contractDeployed.methods.balanceOf(tempAccount.address).call(), + ).toBe(value); + }, + ); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should approve and transferFrom tokens with local wallet %p', + async signAndSendContractMethod => { + const value = BigInt(10); + const transferFromValue = BigInt(4); + const tempAccount = await prepareForTransfer(value.toString()); + // approve + const res = await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.approve(pkAccount.address, value), + pkAccount.privateKey, + ); + + expect(res.status).toBe(BigInt(1)); + expect( + (res.logs as LogsOutput[])[0].topics[2].endsWith( + pkAccount.address.substring(2), + ), + ).toBe(true); + + // transferFrom + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.transferFrom( + pkAccount.address, + tempAccount.address, + transferFromValue, + ), + pkAccount.privateKey, + ); + expect( + await contractDeployed.methods.balanceOf(tempAccount.address).call(), + ).toBe(transferFromValue); + + // allowance + expect( + await contractDeployed.methods + .allowance(pkAccount.address, pkAccount.address) + .call(), + ).toBe(value - transferFromValue); + }, + ); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should approve and transferFrom tokens with local wallet %p', + async signAndSendContractMethod => { + const value = BigInt(10); + const transferFromValue = BigInt(4); + const tempAccount = await prepareForTransfer(value.toString()); + // approve + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.approve( + tempAccount.address, + transferFromValue, + ), + tempAccount.privateKey, + ); + + // allowance + expect( + await contractDeployed.methods + .allowance(tempAccount.address, tempAccount.address) + .call(), + ).toBe(transferFromValue); + + // increaseAllowance + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.increaseAllowance( + tempAccount.address, + transferFromValue, + ), + tempAccount.privateKey, + ); + + // allowance + expect( + await contractDeployed.methods + .allowance(tempAccount.address, tempAccount.address) + .call(), + ).toBe(transferFromValue + transferFromValue); + }, + ); + }); + + describeIf(isWs)('events', () => { + it('should emit transfer event', async () => { + const acc2 = await createTempAccount(); + await expect( + processAsync(async resolve => { + const event = contractDeployed.events.Transfer(); + event.on('data', data => { + resolve({ + from: toUpperCaseHex(data.returnValues.from as string), + to: toUpperCaseHex(data.returnValues.to as string), + value: data.returnValues.value, + }); + }); + + await contractDeployed.methods + .transfer(acc2.address, '100') + .send(sendOptions); + }), + ).resolves.toEqual({ + from: toUpperCaseHex(sendOptions.from as string), + to: toUpperCaseHex(acc2.address), + value: BigInt(100), + }); + }); + }); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_erc721.test.ts b/packages/web3-eth-contract/test/integration/contract_erc721.test.ts new file mode 100644 index 00000000000..9463a636930 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_erc721.test.ts @@ -0,0 +1,336 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { toBigInt } from 'web3-utils'; +import { Contract } from '../../src'; +import { ERC721TokenAbi, ERC721TokenBytecode } from '../shared_fixtures/build/ERC721Token'; +import { + getSystemTestProvider, + describeIf, + isWs, + createTempAccount, + signAndSendContractMethodEIP1559, + signAndSendContractMethodEIP2930, + createNewAccount, + refillAccount, +} from '../fixtures/system_test_utils'; +import { processAsync, toUpperCaseHex } from '../shared_fixtures/utils'; + +describe('contract', () => { + describe('erc721', () => { + let contract: Contract; + let contractDeployed: Contract; + let deployOptions: Record; + let sendOptions: Record; + + beforeAll(async () => { + contract = new Contract(ERC721TokenAbi, undefined, { + provider: getSystemTestProvider(), + }); + + const acc = await createTempAccount(); + + deployOptions = { + data: ERC721TokenBytecode, + arguments: [], + }; + sendOptions = { from: acc.address, gas: '10000000' }; + }); + + it('should deploy the contract', async () => { + await expect(contract.deploy(deployOptions).send(sendOptions)).resolves.toBeDefined(); + }); + + describe('contract instance', () => { + let acc: { address: string; privateKey: string }; + let acc2: { address: string; privateKey: string }; + let pkAccount: { address: string; privateKey: string }; + beforeAll(async () => { + acc = await createTempAccount(); + pkAccount = await createNewAccount(); + await refillAccount(acc.address, pkAccount.address, '20000000000000000'); + }); + beforeEach(async () => { + acc2 = await createTempAccount(); + sendOptions = { from: acc.address, gas: '10000000' }; + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + }); + + describe('methods', () => { + it('should return the name', async () => { + expect(await contractDeployed.methods.name().call()).toBe('GameItem'); + }); + + it('should return the symbol', async () => { + expect(await contractDeployed.methods.symbol().call()).toBe('ITM'); + }); + + it('should award item', async () => { + const tempAccount = await createTempAccount(); + const receipt = await contractDeployed.methods + .awardItem(tempAccount.address, 'http://my-nft-uri') + .send(sendOptions); + + expect(receipt.events).toBeDefined(); + expect(receipt.events?.Transfer).toBeDefined(); + expect(receipt.events?.Transfer.event).toBe('Transfer'); + expect(String(receipt.events?.Transfer.returnValues.from).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(receipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(receipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(String(receipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + const tokenId = toBigInt(0); + expect( + toUpperCaseHex( + (await contractDeployed.methods + .ownerOf(tokenId) + .call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(tempAccount.address)); + }); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should award item with local wallet %p', + async signAndSendContractMethod => { + const tempAccount = await createTempAccount(); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.awardItem( + tempAccount.address, + 'http://my-nft-award', + ), + pkAccount.privateKey, + ); + const tokenId = toBigInt(0); + expect( + toUpperCaseHex( + (await contractDeployed.methods + .ownerOf(tokenId) + .call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(tempAccount.address)); + }, + ); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should transferFrom item with local wallet %p', + async signAndSendContractMethod => { + const tempAccount = await createTempAccount(); + const tempAccountTo = await createTempAccount(); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.awardItem( + tempAccount.address, + 'http://my-nft-award', + ), + pkAccount.privateKey, + ); + + const tokenId = toBigInt(0); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.transferFrom( + tempAccount.address, + tempAccountTo.address, + tokenId, + ), + tempAccount.privateKey, + ); + + expect( + toUpperCaseHex( + (await contractDeployed.methods + .ownerOf(tokenId) + .call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(tempAccountTo.address)); + }, + ); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should safeTransferFrom item with local wallet %p', + async signAndSendContractMethod => { + const tempAccount = await createTempAccount(); + const tempAccountTo = await createTempAccount(); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.awardItem( + tempAccount.address, + 'http://my-nft-award', + ), + pkAccount.privateKey, + ); + + const tokenId = toBigInt(0); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.approve(tempAccountTo.address, tokenId), + tempAccount.privateKey, + ); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.safeTransferFrom( + tempAccount.address, + tempAccountTo.address, + tokenId, + ), + tempAccount.privateKey, + ); + + expect( + toUpperCaseHex( + (await contractDeployed.methods + .ownerOf(tokenId) + .call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(tempAccountTo.address)); + }, + ); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should approve item with local wallet %p', + async signAndSendContractMethod => { + const tempAccount = await createTempAccount(); + const tempAccountTo = await createTempAccount(); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.awardItem( + tempAccount.address, + 'http://my-nft-award', + ), + pkAccount.privateKey, + ); + const tokenId = toBigInt(0); + + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.approve(tempAccountTo.address, tokenId), + tempAccount.privateKey, + ); + + const res = await contractDeployed.methods.getApproved(tokenId).call(); + expect(res.toString().toUpperCase()).toBe( + tempAccountTo.address.toUpperCase(), + ); + }, + ); + + it.each([signAndSendContractMethodEIP1559, signAndSendContractMethodEIP2930])( + 'should set approve for all item with local wallet %p', + async signAndSendContractMethod => { + const tempAccount = await createTempAccount(); + const tempAccountTo = await createTempAccount(); + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.awardItem( + tempAccount.address, + 'http://my-nft-award', + ), + pkAccount.privateKey, + ); + + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.setApprovalForAll(tempAccountTo.address, true), + tempAccount.privateKey, + ); + + expect( + await contractDeployed.methods + .isApprovedForAll(tempAccount.address, tempAccountTo.address) + .call(), + ).toBe(true); + + await signAndSendContractMethod( + contract.provider, + contractDeployed.options.address as string, + contractDeployed.methods.setApprovalForAll( + tempAccountTo.address, + false, + ), + tempAccount.privateKey, + ); + + expect( + await contractDeployed.methods + .isApprovedForAll(tempAccount.address, tempAccountTo.address) + .call(), + ).toBe(false); + }, + ); + }); + + describeIf(isWs)('events', () => { + it('should emit transfer event', async () => { + await expect( + processAsync(async resolve => { + const event = contractDeployed.events.Transfer(); + event.on('data', data => { + resolve({ + from: toUpperCaseHex(data.returnValues.from as string), + to: toUpperCaseHex(data.returnValues.to as string), + tokenId: data.returnValues.tokenId, + }); + }); + + const receipt = await contractDeployed.methods + .awardItem(acc2.address, 'http://my-nft-uri') + .send(sendOptions); + + expect(receipt.events).toBeDefined(); + expect(receipt.events?.Transfer).toBeDefined(); + expect(receipt.events?.Transfer.event).toBe('Transfer'); + expect( + String(receipt.events?.Transfer.returnValues.from).toLowerCase(), + ).toBe('0x0000000000000000000000000000000000000000'); + expect( + String(receipt.events?.Transfer.returnValues[0]).toLowerCase(), + ).toBe('0x0000000000000000000000000000000000000000'); + expect( + String(receipt.events?.Transfer.returnValues.to).toLowerCase(), + ).toBe(acc2.address.toLowerCase()); + expect( + String(receipt.events?.Transfer.returnValues[1]).toLowerCase(), + ).toBe(acc2.address.toLowerCase()); + }), + ).resolves.toEqual({ + from: '0x0000000000000000000000000000000000000000', + to: toUpperCaseHex(acc2.address), + tokenId: BigInt(0), + }); + }); + }); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_estimateGas_without_0x.test.ts b/packages/web3-eth-contract/test/integration/contract_estimateGas_without_0x.test.ts new file mode 100644 index 00000000000..d74a901e265 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_estimateGas_without_0x.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ETH_DATA_FORMAT } from 'web3-types'; +import { Contract } from '../../src'; +import { getSystemTestProvider, createTempAccount } from '../fixtures/system_test_utils'; + +describe('contract', () => { + // Create a new contract object using the ABI and bytecode + const abi = [ + { + inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'myNumber', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }], + name: 'setMyNumber', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + ]; + let acc: { address: string; privateKey: string }; + let contract: Contract; + + beforeEach(async () => { + acc = await createTempAccount(); + }); + + it('should be able to add `data` input without `0x` prefix', async () => { + contract = new Contract(abi, undefined, { + provider: getSystemTestProvider(), + }); + + const myContract = contract.deploy({ + data: '608060405234801561001057600080fd5b506040516101d93803806101d983398181016040528101906100329190610054565b806000819055505061009e565b60008151905061004e81610087565b92915050565b60006020828403121561006657600080fd5b60006100748482850161003f565b91505092915050565b6000819050919050565b6100908161007d565b811461009b57600080fd5b50565b61012c806100ad6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806323fd0e401460375780636ffd773c146051575b600080fd5b603d6069565b6040516048919060bf565b60405180910390f35b6067600480360381019060639190608c565b606f565b005b60005481565b8060008190555050565b60008135905060868160e2565b92915050565b600060208284031215609d57600080fd5b600060a9848285016079565b91505092915050565b60b98160d8565b82525050565b600060208201905060d2600083018460b2565b92915050565b6000819050919050565b60e98160d8565b811460f357600080fd5b5056fea2646970667358221220d28cf161457f7936995800eb9896635a02a559a0561bff6a09a40bfb81cd056564736f6c63430008000033', + arguments: [1], + }); + + const gas = await myContract.estimateGas( + { + from: acc.address, + }, + ETH_DATA_FORMAT, + ); + expect(gas).toBeDefined(); + expect(gas).toMatch(/0[xX][0-9a-fA-F]/i); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_events.test.ts b/packages/web3-eth-contract/test/integration/contract_events.test.ts new file mode 100644 index 00000000000..b84a875d173 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_events.test.ts @@ -0,0 +1,295 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EventLog } from 'web3-types'; +import { Contract } from '../../src'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { processAsync } from '../shared_fixtures/utils'; +import { + getSystemTestProvider, + describeIf, + isWs, + itIf, + isHttp, + createTempAccount, +} from '../fixtures/system_test_utils'; + +describe('contract', () => { + let contract: Contract; + let contractDeployed: Contract; + let deployOptions: Record; + let sendOptions: Record; + + beforeAll(() => { + contract = new Contract(BasicAbi, undefined, { + provider: getSystemTestProvider(), + }); + }); + beforeEach(async () => { + const acc = await createTempAccount(); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + }); + + describe('events', () => { + itIf(isWs)('should trigger the "contract.events."', async () => { + // eslint-disable-next-line jest/no-standalone-expect + return expect( + processAsync(async (resolve, reject) => { + const event = contractDeployed.events.MultiValueEvent(); + + event.on('data', resolve); + event.on('error', reject); + + // trigger event + await contractDeployed.methods + .firesMultiValueEvent('value', 12, true) + .send(sendOptions); + }), + ).resolves.toEqual( + expect.objectContaining({ + event: 'MultiValueEvent', + }), + ); + }); + + itIf(isWs)( + 'should trigger the "contract.events." for indexed parameters', + async () => { + const res = await processAsync(async (resolve, reject) => { + const event = contractDeployed.events.MultiValueIndexedEvent({ + filter: { val: 100 }, + }); + + event.on('data', resolve); + event.on('error', reject); + + // trigger event + await contractDeployed.methods + .firesMultiValueIndexedEvent('value', 12, true) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueIndexedEvent('value', 100, true) + .send(sendOptions); + }); + // eslint-disable-next-line jest/no-standalone-expect + expect((res as any)?.event).toBe('MultiValueIndexedEvent'); + // eslint-disable-next-line jest/no-standalone-expect + expect((res as any)?.returnValues.val).toBe(BigInt(100)); + }, + ); + + itIf(isWs)( + 'should trigger when "fromBlock" is passed to contract.events.', + async () => { + // eslint-disable-next-line jest/no-standalone-expect + return expect( + processAsync(async (resolve, reject) => { + const event = contractDeployed.events.MultiValueEvent({ + fromBlock: 'latest', + }); + + event.on('data', resolve); + event.on('error', reject); + + // trigger event + await contractDeployed.methods + .firesMultiValueEvent('Event Value', 11, false) + .send(sendOptions); + }), + ).resolves.toEqual( + expect.objectContaining({ + event: 'MultiValueEvent', + }), + ); + }, + ); + + itIf(isWs)( + 'should fetch past events when "fromBlock" is passed to contract.events.', + async () => { + const eventValues = [11, 12, 13, 14]; + // eslint-disable-next-line jest/no-standalone-expect + return expect( + processAsync(async resolve => { + // trigger multiple events + for (const eventValue of eventValues) { + // Wait for every transaction, before firing the next one, to prevent a possible nonce duplication. + // eslint-disable-next-line no-await-in-loop + await contractDeployed.methods + .firesMultiValueEvent('Event Value', eventValue, false) + .send(sendOptions); + } + + const event = contractDeployed.events.MultiValueEvent({ + fromBlock: 'earliest', + }); + + const pastEvents: EventLog[] = []; + event.on('data', d => { + pastEvents.push(d); + if (pastEvents.length === eventValues.length) { + resolve(pastEvents); + } + }); + }), + ).resolves.toEqual( + expect.arrayContaining([ + expect.objectContaining({ event: 'MultiValueEvent' }), + expect.objectContaining({ event: 'MultiValueEvent' }), + expect.objectContaining({ event: 'MultiValueEvent' }), + expect.objectContaining({ event: 'MultiValueEvent' }), + ]), + ); + }, + ); + }); + + describe('events subscription with HTTP', () => { + itIf(isHttp)('should fail to subscribe', async () => { + // eslint-disable-next-line no-async-promise-executor, @typescript-eslint/no-misused-promises + const failedSubscriptionPromise = new Promise((resolve, reject) => { + const event = contractDeployed.events.MultiValueEvent({ fromBlock: 'latest' }); + + event.on('data', () => { + resolve(); + }); + event.on('error', (err: Error) => { + reject(err); + }); + }); + + // eslint-disable-next-line jest/no-standalone-expect + await expect(failedSubscriptionPromise).rejects.toThrow('Failed to subscribe.'); + }); + }); + + describeIf(isWs)('getPastEvents', () => { + // TODO: Debug why this tests is hanging the websocket + it('should return all past events using earliest and latest options', async () => { + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 1', 11, true) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 2', 12, true) + .send(sendOptions); + + expect( + await contractDeployed.getPastEvents('MultiValueEvent', { + fromBlock: 'earliest', + toBlock: 'latest', + }), + ).toHaveLength(2); + }); + it('should return all past events using number options', async () => { + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 1', 11, true) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 2', 12, true) + .send(sendOptions); + + expect( + await contractDeployed.getPastEvents('MultiValueEvent', { + fromBlock: 0, + toBlock: 1000, + }), + ).toHaveLength(2); + }); + it('should return all past events using string options', async () => { + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 1', 11, true) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 2', 12, true) + .send(sendOptions); + + expect( + await contractDeployed.getPastEvents('MultiValueEvent', { + fromBlock: '0', + toBlock: '1000', + }), + ).toHaveLength(2); + }); + it('should return all past events using bigint options', async () => { + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 1', 11, true) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueEvent('New Greeting 2', 12, true) + .send(sendOptions); + + expect( + await contractDeployed.getPastEvents('MultiValueEvent', { + fromBlock: BigInt(0), + toBlock: BigInt(1000), + }), + ).toHaveLength(2); + }); + }); + + describeIf(isWs)('allEvents', () => { + it('should sub and get event using earliest options with allEvents()', async () => { + // eslint-disable-next-line jest/no-standalone-expect + return expect( + processAsync(async (resolve, reject) => { + const event = contractDeployed.events.allEvents({ fromBlock: 'earliest' }); + + event.on('data', resolve); + event.on('error', reject); + + // trigger event + await contractDeployed.methods + .firesMultiValueEvent('val test', 12, true) + .send(sendOptions); + }), + ).resolves.toEqual( + expect.objectContaining({ + event: 'MultiValueEvent', + }), + ); + }); + + it('should sub allEvents()', async () => { + // eslint-disable-next-line jest/no-standalone-expect + return expect( + processAsync(async (resolve, reject) => { + const event = contractDeployed.events.allEvents(); + + event.on('data', resolve); + event.on('error', reject); + + // trigger event + await contractDeployed.methods + .firesMultiValueEvent('Pak1', 12, true) + .send(sendOptions); + }), + ).resolves.toEqual( + expect.objectContaining({ + event: 'MultiValueEvent', + }), + ); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_filter_events.test.ts b/packages/web3-eth-contract/test/integration/contract_filter_events.test.ts new file mode 100644 index 00000000000..338cd448c12 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_filter_events.test.ts @@ -0,0 +1,285 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { toBigInt } from 'web3-utils'; +import { EventLog } from 'web3-types'; +import { Contract } from '../../src'; +import { ERC20TokenAbi, ERC20TokenBytecode } from '../shared_fixtures/build/ERC20Token'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { + getSystemTestProvider, + createTempAccount, + createNewAccount, +} from '../fixtures/system_test_utils'; + +const initialSupply = BigInt('5000000000'); + +describe('contract getPastEvent filter', () => { + describe('erc20', () => { + let contract: Contract; + let contractDeployed: Contract; + let deployOptions: Record; + let sendOptions: Record; + let mainAcc: Record; + let toAcc1: Record; + let toAcc2: Record; + let toAcc3: Record; + + beforeAll(async () => { + contract = new Contract(ERC20TokenAbi, undefined, { + provider: getSystemTestProvider(), + }); + + deployOptions = { + data: ERC20TokenBytecode, + arguments: [initialSupply], + }; + mainAcc = await createTempAccount(); + sendOptions = { from: mainAcc.address, gas: '10000000' }; + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + toAcc1 = await createNewAccount(); + toAcc2 = await createNewAccount(); + toAcc3 = await createNewAccount(); + const value = BigInt(10); + await contractDeployed.methods.transfer(toAcc1.address, value).send(sendOptions); + await contractDeployed.methods.transfer(toAcc2.address, value).send(sendOptions); + await contractDeployed.methods.transfer(toAcc3.address, value).send(sendOptions); + }); + + it('should filter one event by address with event name and filter param', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents('Transfer', { + fromBlock: 'earliest', + filter: { + to: toAcc2.address, + }, + })) as unknown as EventLog[]; + expect(res[0]).toBeDefined(); + expect((res[0]?.returnValues?.to as string).toUpperCase()).toBe( + toAcc2.address.toUpperCase(), + ); + }); + it('should filter one event by address without event name and filter param', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents({ + fromBlock: 'earliest', + filter: { + to: toAcc2.address, + }, + })) as unknown as EventLog[]; + expect(res[0]).toBeDefined(); + expect((res[0]?.returnValues?.to as string).toUpperCase()).toBe( + toAcc2.address.toUpperCase(), + ); + }); + it('should filter one event by address with event name allEvents and filter param', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents('allEvents', { + fromBlock: 'earliest', + filter: { + to: toAcc2.address, + }, + })) as unknown as EventLog[]; + expect(res[0]).toBeDefined(); + expect((res[0]?.returnValues?.to as string).toUpperCase()).toBe( + toAcc2.address.toUpperCase(), + ); + }); + it('should filter few event by addresses array', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents('Transfer', { + fromBlock: 'earliest', + filter: { + to: [toAcc2.address, toAcc3.address], + }, + })) as unknown as EventLog[]; + expect(res).toHaveLength(2); + + const event2 = res.filter( + e => + String(e.returnValues.to).toUpperCase() === + String(toAcc2.address).toUpperCase(), + )[0]; + const event3 = res.filter( + e => + String(e.returnValues.to).toUpperCase() === + String(toAcc3.address).toUpperCase(), + )[0]; + + expect(event2).toBeDefined(); + expect(event3).toBeDefined(); + expect((event2?.returnValues?.to as string).toUpperCase()).toBe( + toAcc2.address.toUpperCase(), + ); + expect((event3?.returnValues?.to as string).toUpperCase()).toBe( + toAcc3.address.toUpperCase(), + ); + }); + it('should filter few event by addresses array without eventName', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents({ + fromBlock: 'earliest', + filter: { + to: [toAcc2.address, toAcc3.address], + }, + })) as unknown as EventLog[]; + expect(res).toHaveLength(2); + + const event2 = res.filter( + e => + String(e.returnValues.to).toUpperCase() === + String(toAcc2.address).toUpperCase(), + )[0]; + const event3 = res.filter( + e => + String(e.returnValues.to).toUpperCase() === + String(toAcc3.address).toUpperCase(), + )[0]; + + expect(event2).toBeDefined(); + expect(event3).toBeDefined(); + expect((event2?.returnValues?.to as string).toUpperCase()).toBe( + toAcc2.address.toUpperCase(), + ); + expect((event3?.returnValues?.to as string).toUpperCase()).toBe( + toAcc3.address.toUpperCase(), + ); + }); + }); + describe('basic', () => { + let contract: Contract; + let contractDeployed: Contract; + let deployOptions: Record; + let sendOptions: Record; + let mainAcc: Record; + + beforeAll(async () => { + contract = new Contract(BasicAbi, undefined, { + provider: getSystemTestProvider(), + }); + + deployOptions = { + data: BasicBytecode, + arguments: [123, '123'], + }; + mainAcc = await createTempAccount(); + sendOptions = { from: mainAcc.address, gas: '10000000' }; + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + await contractDeployed.methods + .firesMultiValueIndexedEvent('str1', 1, true) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueIndexedEvent('str2', 2, false) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueIndexedEvent('str3', 3, true) + .send(sendOptions); + await contractDeployed.methods + .firesMultiValueIndexedEventWithStringIndexed('str4', 4, true) + .send(sendOptions); + }); + + it('should filter one event by address with event name and filter param', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents( + 'MultiValueIndexedEvent', + { + fromBlock: 'earliest', + filter: { + val: 2, + }, + }, + )) as unknown as EventLog[]; + expect(res[0]).toBeDefined(); + expect(res[0]?.returnValues?.val).toBe(toBigInt(2)); + }); + it('should filter few event by numbers array', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents( + 'MultiValueIndexedEvent', + { + fromBlock: 'earliest', + filter: { + val: [2, 3], + }, + }, + )) as unknown as EventLog[]; + expect(res).toHaveLength(2); + + const event2 = res.filter(e => e.returnValues.val === toBigInt(2))[0]; + const event3 = res.filter(e => e.returnValues.val === toBigInt(3))[0]; + + expect(event2).toBeDefined(); + expect(event3).toBeDefined(); + expect(event2?.returnValues?.val).toBe(toBigInt(2)); + expect(event3?.returnValues?.val).toBe(toBigInt(3)); + }); + it('should filter few event by bool array', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents( + 'MultiValueIndexedEvent', + { + fromBlock: 'earliest', + filter: { + flag: [true], + }, + }, + )) as unknown as EventLog[]; + expect(res).toHaveLength(2); + + const event1 = res.filter(e => e.returnValues.val === toBigInt(1))[0]; + const event3 = res.filter(e => e.returnValues.val === toBigInt(3))[0]; + + expect(event1).toBeDefined(); + expect(event3).toBeDefined(); + expect(event1?.returnValues?.val).toBe(toBigInt(1)); + expect(event3?.returnValues?.val).toBe(toBigInt(3)); + }); + + it('should filter events using non-indexed string', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents( + 'MultiValueIndexedEvent', + { + fromBlock: 'earliest', + filter: { + str: 'str2', + }, + }, + )) as unknown as EventLog[]; + expect(res).toHaveLength(1); + + const event = res[0]; + expect(event).toBeDefined(); + expect(event.returnValues.str).toBe('str2'); + expect(event.returnValues.val).toBe(BigInt(2)); + expect(event.returnValues.flag).toBeFalsy(); + }); + + it('should filter events using indexed string', async () => { + const res: EventLog[] = (await contractDeployed.getPastEvents( + 'MultiValueIndexedEventWithStringIndexed', + { + fromBlock: 'earliest', + filter: { + str: 'str4', + }, + }, + )) as unknown as EventLog[]; + expect(res).toHaveLength(1); + + const event = res[0]; + expect(event).toBeDefined(); + expect(event.returnValues.str).toBe( + '0x3f6d5d7b72c0059e2ecac56fd4adeefb2cff23aa41d13170f78ea6bf81e6e0ca', + ); + expect(event.returnValues.val).toBe(BigInt(4)); + expect(event.returnValues.flag).toBeTruthy(); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_methods.test.ts b/packages/web3-eth-contract/test/integration/contract_methods.test.ts new file mode 100644 index 00000000000..0c138d364dd --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_methods.test.ts @@ -0,0 +1,183 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { ContractExecutionError } from 'web3-errors'; +import { Contract } from '../../src'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { getSystemTestProvider, createTempAccount, getSystemTestBackend, BACKEND} from '../fixtures/system_test_utils'; + +describe('contract', () => { + let contract: Contract; + let contractDeployed: Contract; + let deployOptions: Record; + let sendOptions: Record; + let acc: Record; + + beforeAll(async () => { + contract = new Contract(BasicAbi, undefined, { + provider: getSystemTestProvider(), + }); + acc = await createTempAccount(); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + + sendOptions = { from: acc.address, gas: '1000000' }; + + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + }); + + describe('methods', () => { + describe('call', () => { + it('should retrieve the values', async () => { + const result = await contractDeployed.methods.getValues().call(); + + expect(result).toEqual({ + '0': BigInt(10), + '1': 'string init value', + '2': false, + __length__: 3, + }); + }); + + it('should run call method of the contract if data is provided at initiation', async () => { + const tempContract = new Contract(BasicAbi, { + provider: getSystemTestProvider(), + data: BasicBytecode, + from: acc.address, + gas: '1000000', + }); + const deployedTempContract = await tempContract + .deploy({ arguments: [10, 'string init value'] }) + .send(); + const res = await deployedTempContract.methods.getStringValue().call(); + expect(res).toBe('string init value'); + }); + + describe('revert handling', () => { + it('should returns the expected revert reason string', async () => { + let error: ContractExecutionError | undefined; + try { + await contractDeployed.methods.reverts().call(); + } catch (err: any) { + error = err; + } + + // eslint-disable-next-line jest/no-standalone-expect + expect(error).toBeDefined(); + // eslint-disable-next-line jest/no-standalone-expect + expect(error?.cause.message).toContain('REVERTED WITH REVERT'); + }); + }); + }); + + describe('send', () => { + it('should returns a receipt', async () => { + const receipt = await contractDeployed.methods + .setValues(1, 'string value', true) + .send(sendOptions); + + expect(receipt.events).toBeUndefined(); + expect(receipt).toEqual( + expect.objectContaining({ + // status: BigInt(1), + transactionHash: expect.any(String), + }), + ); + + // To avoid issue with the `objectContaining` and `cypress` had to add + // these expectations explicitly on each attribute + expect(receipt.status).toEqual(BigInt(1)); + }); + + it('should returns a receipt (EIP-1559, maxFeePerGas and maxPriorityFeePerGas specified)', async () => { + const tempAcc = await createTempAccount(); + + const sendOptionsLocal = { from: tempAcc.address, gas: '1000000' }; + + const contractLocal = await contract.deploy(deployOptions).send(sendOptionsLocal); + const receipt = await contractLocal.methods + .setValues(1, 'string value', true) + .send({ + ...sendOptionsLocal, + maxFeePerGas: '0x59682F00', // 1.5 Gwei + maxPriorityFeePerGas: '0x1DCD6500', // .5 Gwei + type: '0x2', + }); + + expect(receipt).toEqual( + expect.objectContaining({ + // status: BigInt(1), + transactionHash: expect.any(String), + }), + ); + + // To avoid issue with the `objectContaining` and `cypress` had to add + // these expectations explicitly on each attribute + expect(receipt.status).toEqual(BigInt(1)); + }); + + it('should run send method of the contract if data is provided at initiation', async () => { + const tempContract = new Contract(BasicAbi, { + provider: getSystemTestProvider(), + from: acc.address, + gas: '1000000', + data: BasicBytecode, + }); + const deployedTempContract = await tempContract + .deploy({ arguments: [10, 'string init value'] }) + .send(); + await deployedTempContract.methods.setValues(10, 'TEST', true).send(); + + expect(await deployedTempContract.methods.getStringValue().call()).toBe('TEST'); + }); + + it('should returns errors on reverts', async () => { + // TODO hardhat reverts but sends an undefined receipt, needs investigation + if (getSystemTestBackend() === BACKEND.HARDHAT) { + // eslint-disable-next-line jest/no-conditional-expect + await expect( + contractDeployed.methods.reverts().send(sendOptions), + ).rejects.toMatchObject({ + "name": "ContractExecutionError", + "receipt": undefined, + }); + } else { + // eslint-disable-next-line jest/no-conditional-expect + await expect( + contractDeployed.methods.reverts().send(sendOptions), + ).rejects.toMatchObject({ + name: 'TransactionRevertedWithoutReasonError', + receipt: { + cumulativeGasUsed: BigInt(21543), + from: acc.address, + gasUsed: BigInt(21543), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(0), + to: contractDeployed.options.address?.toLowerCase(), + transactionIndex: BigInt(0), + type: BigInt(2), + }, + }); + } + }); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_methods_errors.test.ts b/packages/web3-eth-contract/test/integration/contract_methods_errors.test.ts new file mode 100644 index 00000000000..7c07ee5af8d --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_methods_errors.test.ts @@ -0,0 +1,149 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ContractExecutionError, ERR_CONTRACT_EXECUTION_REVERTED } from 'web3-errors'; +import { ErrorsContractAbi, ErrorsContractBytecode } from '../shared_fixtures/build/ErrorsContract'; +import { Contract } from '../../src'; +import { + getSystemTestProvider, + createTempAccount, + getSystemTestBackend, + describeIf, + BACKEND, +} from '../fixtures/system_test_utils'; + +describe('contract errors', () => { + let sendOptions: Record; + let contract: Contract; + let deployOptions: Record; + + let deployedContract: Contract; + + beforeAll(async () => { + const acc = await createTempAccount(); + sendOptions = { from: acc.address }; + + contract = new Contract(ErrorsContractAbi, undefined, { + provider: getSystemTestProvider(), + }); + + deployOptions = { + data: ErrorsContractBytecode, + }; + + const sendOptionsLocal = { from: acc.address, gas: '10000000' }; + deployedContract = await contract.deploy(deployOptions).send(sendOptionsLocal); + + contract.setProvider(getSystemTestProvider()); + }); + + describeIf(getSystemTestBackend() === BACKEND.GETH)('Test EIP-838 Error Codes', () => { + it('Unauthorized', async () => { + let error: ContractExecutionError | undefined; + try { + await deployedContract.methods.unauthorize().send(sendOptions); + + // execution should throw before this line, if not throw here to indicate an issue. + } catch (err: any) { + error = err; + } + + expect(error).toBeDefined(); + + expect(error).toMatchObject({ + message: expect.stringContaining( + 'Error happened while trying to execute a function inside a smart contract', + ), + code: ERR_CONTRACT_EXECUTION_REVERTED, + cause: { + errorName: 'Unauthorized', + errorSignature: 'Unauthorized()', + }, + }); + }); + + it('should catch Unauthorized error PromiEvent.on("error")', async () => { + const expectedThrownError = { + name: 'ContractExecutionError', + code: ERR_CONTRACT_EXECUTION_REVERTED, + receipt: undefined, + cause: { + code: 3, + data: '0x82b42900', + errorName: 'Unauthorized', + errorSignature: 'Unauthorized()', + }, + }; + + await expect( + deployedContract.methods + .unauthorize() + .send(sendOptions) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Error with parameter', async () => { + let error: ContractExecutionError | undefined; + try { + await deployedContract.methods.badRequire().send(sendOptions); + + // execution should throw before this line, if not throw here to indicate an issue. + } catch (err: any) { + error = err; + } + + expect(error).toBeDefined(); + + expect(error).toMatchObject({ + message: expect.stringContaining( + 'Error happened while trying to execute a function inside a smart contract', + ), + code: ERR_CONTRACT_EXECUTION_REVERTED, + cause: { + errorName: 'CustomError', + errorSignature: 'CustomError(string)', + errorArgs: { + 0: 'reverted using custom Error', + }, + }, + }); + }); + + it('should catch error with parameter using PromiEvent.on("error")', async () => { + const expectedThrownError = { + name: 'ContractExecutionError', + code: ERR_CONTRACT_EXECUTION_REVERTED, + receipt: undefined, + cause: { + code: 3, + data: '0x8d6ea8be0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001b7265766572746564207573696e6720637573746f6d204572726f720000000000', + errorName: 'CustomError', + errorSignature: 'CustomError(string)', + errorArgs: { '0': 'reverted using custom Error' }, + }, + }; + + await expect( + deployedContract.methods + .badRequire() + .send(sendOptions) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_negative_numbers.test.ts b/packages/web3-eth-contract/test/integration/contract_negative_numbers.test.ts new file mode 100644 index 00000000000..bf9283d5a4f --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_negative_numbers.test.ts @@ -0,0 +1,122 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Contract from '../../src'; +import { createTempAccount, getSystemTestProvider } from '../fixtures/system_test_utils'; +import { + NegativeNumbersAbi, + NegativeNumbersBytecode, +} from '../shared_fixtures/build/NegativeNumbers'; + +describe('Contract - NegativeNumbers.sol', () => { + const storedNegativeNumber = '-170141183460469231731687303715884105727'; + + let contract: Contract; + let contractDeployed: Contract; + let account: Record; + let sendOptions: Record; + + beforeAll(async () => { + contract = new Contract(NegativeNumbersAbi, undefined, { + provider: getSystemTestProvider(), + }); + account = await createTempAccount(); + + const deployOptions: Record = { + data: NegativeNumbersBytecode, + arguments: [storedNegativeNumber], + }; + sendOptions = { + from: account.address, + gas: '1000000', + }; + + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + }); + + it('should retrieve storedNegativeNumber', async () => { + const response = await contractDeployed.methods.storedNegativeNumber().call(); + expect(response).toBe(BigInt(storedNegativeNumber)); + }); + + it('should return storedNegativeNumber when calling oneNegativeNumber(storedNegativeNumber)', async () => { + const transactionReceipt = await contractDeployed.methods + .oneNegativeNumber(storedNegativeNumber) + .send(sendOptions); + + expect(transactionReceipt.logs).toMatchObject([ + { + topics: ['0x5b53dc4e9e8fa2416d4e172bdad04be5a6d622643bc9ef45987b2caadd0d0c95'], + data: '0xffffffffffffffffffffffffffffffff80000000000000000000000000000001', + }, + { + topics: [ + '0x33e7dccd3899498f4408d6468e5dfad650f32574dba2ec4f13399a82e62166d5', + '0xffffffffffffffffffffffffffffffff80000000000000000000000000000001', + ], + data: '0x', + }, + ]); + }); + + it('should return storedNegativeNumber when calling twoNegativeNumbers(storedNegativeNumber, secondNegativeNumber)', async () => { + const secondNegativeNumber = + '-17014118346046923173168730371588410572712039182039812039812098312'; + + const transactionReceipt = await contractDeployed.methods + .twoNegativeNumbers(storedNegativeNumber, secondNegativeNumber) + .send(sendOptions); + + expect(transactionReceipt.logs).toMatchObject([ + { + topics: ['0xfaa997e4b16dcde196bbb99868e16fa934a0b4c1f019e494d9fbffb5abc46fc2'], + data: '0xffffffffffffffffffffffffffffffff80000000000000000000000000000001ffffffffffd6a416919bf9968e000000000000000048c26d7f0da3fa91bf56f8', + }, + { + topics: [ + '0x0204c97becd72594486cf753e30e8acfc9951ee663e404bc858e3d10b80da99b', + '0xffffffffffffffffffffffffffffffff80000000000000000000000000000001', + '0xffffffffffd6a416919bf9968e000000000000000048c26d7f0da3fa91bf56f8', + ], + data: '0x', + }, + ]); + }); + + it('should return storedNegativeNumber when calling otherNegativeNumbers(storedNegativeNumber, secondNegativeNumber)', async () => { + const secondNegativeNumber = + '-17014118346046923173168730371588410572712039182039812039812098312'; + + const transactionReceipt = await contractDeployed.methods + .otherNegativeNumbers(storedNegativeNumber, secondNegativeNumber, 'fooBar') + .send(sendOptions); + + expect(transactionReceipt.logs).toMatchObject([ + { + topics: ['0x2e1fb99ee1b27b6491b2d46a54ac8daca82f2da6810e4b8eed4d634f78fa6948'], + data: '0xffffffffffffffffffffffffffffffff80000000000000000000000000000001ffffffffffd6a416919bf9968e000000000000000048c26d7f0da3fa91bf56f800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000006666f6f4261720000000000000000000000000000000000000000000000000000', + }, + { + topics: [ + '0x0e29b573959c1b6ffd5e16886385ec1732e187cc5ac10e8faceb5e02a1c7b50b', + '0xffffffffffffffffffffffffffffffff80000000000000000000000000000001', + '0xffffffffffd6a416919bf9968e000000000000000048c26d7f0da3fa91bf56f8', + ], + data: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006666f6f4261720000000000000000000000000000000000000000000000000000', + }, + ]); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/contract_simple_overloaded.test.ts b/packages/web3-eth-contract/test/integration/contract_simple_overloaded.test.ts new file mode 100644 index 00000000000..0e786b77428 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/contract_simple_overloaded.test.ts @@ -0,0 +1,100 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Contract from '../../src'; +import { SimpleOverloadedAbi, SimpleOverloadedBytecode } from '../fixtures/SimpleOverloaded'; +import { createTempAccount, getSystemTestProvider } from '../fixtures/system_test_utils'; + +describe('SimpleOverloaded', () => { + let contract: Contract; + let mainAcc: { address: string; privateKey: string }; + let contractDeployed: Contract; + + beforeAll(async () => { + mainAcc = await createTempAccount(); + contract = new Contract(SimpleOverloadedAbi, undefined, { + provider: getSystemTestProvider(), + }); + contractDeployed = await contract + .deploy({ + data: SimpleOverloadedBytecode, + }) + .send({ from: mainAcc.address, gas: '10000000' }); + }); + + it('should call getSecret with no args', async () => { + const response = await contractDeployed.methods.getSecret().call(); + expect(response).toBe(BigInt(42)); + }); + + it('should call getSecret with one args', async () => { + const response = await contractDeployed.methods.getSecret(42).call(); + expect(response).toBe(BigInt(84)); + }); + + it('should call getSecret with two args', async () => { + const response = await contractDeployed.methods.getSecret(42, 'some string').call(); + expect(response).toStrictEqual({ '0': BigInt(84), '1': 'some string', __length__: 2 }); + }); + + it('should send setSecret with no args', async () => { + const transactionReceipt = await contractDeployed.methods + .setSecret() + .send({ from: mainAcc.address, gas: '10000000' }); + expect(transactionReceipt.status).toBe(BigInt(1)); + + const response = await contractDeployed.methods.getSecret(42, 'some string').call(); + expect(response).toStrictEqual({ '0': BigInt(84), '1': 'some string', __length__: 2 }); + }); + + it('should send setSecret with one args', async () => { + const transactionReceipt = await contractDeployed.methods + .setSecret(42) + .send({ from: mainAcc.address, gas: '10000000' }); + expect(transactionReceipt.status).toBe(BigInt(1)); + + const response = await contractDeployed.methods.getSecret(42, 'some string').call(); + expect(response).toStrictEqual({ '0': BigInt(126), '1': 'some string', __length__: 2 }); + }); + + it('should send setSecret with two args', async () => { + const transactionReceipt = await contractDeployed.methods + .setSecret(42, 'more string') + .send({ from: mainAcc.address, gas: '10000000' }); + expect(transactionReceipt.status).toBe(BigInt(1)); + + const response = await contractDeployed.methods.getSecret(42, 'some string').call(); + expect(response).toStrictEqual({ + '0': BigInt(168), + '1': 'more stringsome string', + __length__: 2, + }); + }); + + it('should send multicall with one arg', async () => { + const transactionReceipt = await contractDeployed.methods + .multicall(['0x5b9fdc30', '0x5b9fdc30', '0x5b9fdc30']) + .send({ from: mainAcc.address, gas: '10000000' }); + expect(transactionReceipt.status).toBe(BigInt(1)); + }); + + it('should send multicall with two args', async () => { + const transactionReceipt = await contractDeployed.methods + .multicall(99999999999, ['0x5b9fdc30', '0x5b9fdc30', '0x5b9fdc30']) + .send({ from: mainAcc.address, gas: '10000000' }); + expect(transactionReceipt.status).toBe(BigInt(1)); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/jest.config.js b/packages/web3-eth-contract/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-eth-contract/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-eth-contract/test/integration/local_account/contract_deploy.test.ts b/packages/web3-eth-contract/test/integration/local_account/contract_deploy.test.ts new file mode 100644 index 00000000000..7938636d8cb --- /dev/null +++ b/packages/web3-eth-contract/test/integration/local_account/contract_deploy.test.ts @@ -0,0 +1,173 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line import/no-extraneous-dependencies +import Web3 from 'web3'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3Account } from 'web3-eth-accounts'; +import { GreeterBytecode, GreeterAbi } from '../../shared_fixtures/build/Greeter'; +import { getSystemTestProvider, createLocalAccount } from '../../fixtures/system_test_utils'; +import { Contract } from '../../../src'; + +describe('contract', () => { + describe('deploy', () => { + let contract: Contract; + let sendOptions: Record; + let deployOptions: Record; + let localAccount: Web3Account; + let web3: Web3; + + beforeEach(async () => { + web3 = new Web3(getSystemTestProvider()); + contract = new web3.eth.Contract(GreeterAbi) as unknown as Contract; + deployOptions = { + data: GreeterBytecode, + arguments: ['My Greeting'], + }; + localAccount = await createLocalAccount(web3); + sendOptions = { + from: localAccount.address, + gas: '1000000', + }; + }); + + it.each(['0x1', '0x2'])('should emit the "sending" event', async txType => { + const handler = jest.fn(); + const acc = await createLocalAccount(web3); + const promiEvent = contract + .deploy(deployOptions) + .send({ + ...sendOptions, + from: acc.address, + type: txType, + }) + .on('sending', handler); + + // Deploy the contract + await promiEvent; + + expect(handler).toHaveBeenCalled(); + }); + + it.each(['0x1', '0x2'])('should deploy contract %p', async txType => { + const acc = await createLocalAccount(web3); + const deployedContract = await contract.deploy(deployOptions).send({ + ...sendOptions, + from: acc.address, + type: txType, + }); + expect(deployedContract.options.address).toBeDefined(); + }); + + it('deploy should fail with low baseFeeGas EIP1559', async () => { + await expect( + contract.deploy(deployOptions).send({ + type: '0x2', + gas: '1000', + maxFeePerGas: '0x1', + maxPriorityFeePerGas: '0x1', + from: localAccount.address, + }), + ).rejects.toThrow('Signer Error Signer Error gasLimit is too low'); + }); + + it.each(['0x1', '0x2'])( + 'should return estimated gas of contract method %p', + async txType => { + const contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + + const estimatedGas = await contractDeployed.methods + .setGreeting('Hello') + .estimateGas({ + ...sendOptions, + type: txType, + }); + expect(Number(estimatedGas)).toBeGreaterThan(0); + }, + ); + + it('should deploy the contract if data is provided at initiation', async () => { + const contractWithParams = new web3.eth.Contract(GreeterAbi, undefined, { + provider: web3.provider, + data: GreeterBytecode, + from: localAccount.address, + gas: '1000000', + }) as unknown as Contract; + + const deployedContract = await contractWithParams + .deploy({ arguments: ['Hello World'] }) + .send(); + + expect(deployedContract.options.address).toBeDefined(); + }); + + it('should emit the "confirmation" event', async () => { + const confirmationHandler = jest.fn(); + const promievent = contract + .deploy(deployOptions) + .send(sendOptions); + const receiptPromise = new Promise((resolve) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + promievent + .on('receipt', () => { + resolve() + }) + }) + + const confirmationPRomise = new Promise((resolve) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + promievent + .on('confirmation', () => {confirmationHandler(); resolve();}) + }) + await promievent; + await receiptPromise; + + // Deploy once again to trigger block mining to trigger confirmation + // We can send any other transaction as well + await contract.deploy(deployOptions).send(sendOptions); + + await confirmationPRomise; + // eslint-disable-next-line jest/no-standalone-expect + expect(confirmationHandler).toHaveBeenCalled(); + }); + + it('should emit the "transactionHash" event', async () => { + const handler = jest.fn(); + + const promiEvent = contract + .deploy(deployOptions) + .send(sendOptions) + .on('transactionHash', handler); + + // Deploy the contract + await promiEvent; + + expect(handler).toHaveBeenCalled(); + }); + + it('should fail with errors deploying a zero length bytecode', () => { + return expect(() => + contract + .deploy({ + ...deployOptions, + data: '0x', + }) + .send(sendOptions), + ).toThrow('contract creation without any data provided.'); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/local_account/contract_erc20.test.ts b/packages/web3-eth-contract/test/integration/local_account/contract_erc20.test.ts new file mode 100644 index 00000000000..edff03fe598 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/local_account/contract_erc20.test.ts @@ -0,0 +1,228 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line import/no-extraneous-dependencies +import Web3 from 'web3'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3Account } from 'web3-eth-accounts'; +import { Contract } from '../../../src'; +import { ERC20TokenAbi, ERC20TokenBytecode } from '../../shared_fixtures/build/ERC20Token'; +import { getSystemTestProvider, createLocalAccount } from '../../fixtures/system_test_utils'; + +const initialSupply = BigInt('5000000000'); + +describe('contract', () => { + describe('erc20', () => { + let contract: Contract; + let sendOptions: Record; + let deployOptions: Record; + let localAccount: Web3Account; + let web3: Web3; + let contractDeployed: Contract; + + beforeAll(async () => { + web3 = new Web3(getSystemTestProvider()); + localAccount = await createLocalAccount(web3); + contract = new web3.eth.Contract(ERC20TokenAbi) as unknown as Contract< + typeof ERC20TokenAbi + >; + + deployOptions = { + data: ERC20TokenBytecode, + arguments: [initialSupply], + }; + + sendOptions = { + from: localAccount.address, + gas: '2000000', + }; + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + }); + + it('should deploy the contract', () => { + expect(contractDeployed.options.address).toBeDefined(); + }); + + it.each(['0x1', '0x2'])('should transfer tokens %p', async type => { + const acc = web3.eth.accounts.create(); + const value = BigInt(10); + + const receipt = await contractDeployed.methods.transfer(acc.address, value).send({ + ...sendOptions, + type, + }); + expect(receipt.events).toBeDefined(); + expect(receipt.events?.Transfer).toBeDefined(); + expect(receipt.events?.Transfer.event).toBe('Transfer'); + expect(receipt.events).toBeDefined(); + expect(receipt.events?.Transfer).toBeDefined(); + expect(receipt.events?.Transfer.event).toBe('Transfer'); + expect(String(receipt.events?.Transfer.returnValues.from).toLowerCase()).toBe( + localAccount.address.toLowerCase(), + ); + expect(String(receipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + localAccount.address.toLowerCase(), + ); + expect(String(receipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + acc.address.toLowerCase(), + ); + expect(String(receipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + acc.address.toLowerCase(), + ); + expect(receipt.events?.Transfer.returnValues.value).toBe(value); + expect(receipt.events?.Transfer.returnValues[2]).toBe(value); + expect(await contractDeployed.methods.balanceOf(acc.address).call()).toBe(value); + }); + + it.each(['0x1', '0x2'])('should approve and transferFrom tokens %p', async type => { + const value = BigInt(10); + const transferFromValue = BigInt(4); + const tempAccount = await createLocalAccount(web3); + // approve + const approvalReceipt = await contractDeployed.methods + .approve(tempAccount.address, value) + .send({ ...sendOptions, type }); + expect(approvalReceipt.events).toBeDefined(); + expect(approvalReceipt.events?.Approval).toBeDefined(); + expect(approvalReceipt.events?.Approval.event).toBe('Approval'); + // transferFrom + const transferFromReceipt = await contractDeployed.methods + .transferFrom(localAccount.address, tempAccount.address, transferFromValue) + .send({ ...sendOptions, from: tempAccount.address, type }); + expect(transferFromReceipt.events).toBeDefined(); + expect(transferFromReceipt.events?.Approval).toBeDefined(); + expect(transferFromReceipt.events?.Approval.event).toBe('Approval'); + expect( + String(transferFromReceipt.events?.Approval.returnValues.owner).toLowerCase(), + ).toBe(localAccount.address.toLowerCase()); + expect(String(transferFromReceipt.events?.Approval.returnValues[0]).toLowerCase()).toBe( + localAccount.address.toLowerCase(), + ); + expect( + String(transferFromReceipt.events?.Approval.returnValues.spender).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect(String(transferFromReceipt.events?.Approval.returnValues[1]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(transferFromReceipt.events?.Approval.returnValues.value).toBe( + value - transferFromValue, + ); + expect(transferFromReceipt.events?.Approval.returnValues[2]).toBe( + value - transferFromValue, + ); + + expect(transferFromReceipt.events?.Transfer).toBeDefined(); + expect(transferFromReceipt.events?.Transfer.event).toBe('Transfer'); + expect(transferFromReceipt.events).toBeDefined(); + expect( + String(transferFromReceipt.events?.Transfer.returnValues.from).toLowerCase(), + ).toBe(localAccount.address.toLowerCase()); + expect(String(transferFromReceipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + localAccount.address.toLowerCase(), + ); + expect(String(transferFromReceipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(String(transferFromReceipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(transferFromReceipt.events?.Transfer.returnValues.value).toBe(transferFromValue); + expect(transferFromReceipt.events?.Transfer.returnValues[2]).toBe(transferFromValue); + + expect(await contractDeployed.methods.balanceOf(tempAccount.address).call()).toBe( + transferFromValue, + ); + + // allowance + expect( + await contractDeployed.methods + .allowance(localAccount.address, tempAccount.address) + .call(), + ).toBe(value - transferFromValue); + }); + + it.each(['0x1', '0x2'])('should increase allowance %p', async type => { + const value = BigInt(10); + const extraAmount = BigInt(4); + const tempAccount = await createLocalAccount(web3); + + // approve + const approvalReceipt = await contractDeployed.methods + .approve(tempAccount.address, value) + .send({ ...sendOptions, type }); + expect(approvalReceipt.events).toBeDefined(); + expect(approvalReceipt.events?.Approval).toBeDefined(); + expect(approvalReceipt.events?.Approval.event).toBe('Approval'); + expect(String(approvalReceipt.events?.Approval.returnValues.owner).toLowerCase()).toBe( + localAccount.address.toLowerCase(), + ); + expect(String(approvalReceipt.events?.Approval.returnValues[0]).toLowerCase()).toBe( + localAccount.address.toLowerCase(), + ); + expect( + String(approvalReceipt.events?.Approval.returnValues.spender).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect(String(approvalReceipt.events?.Approval.returnValues[1]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(approvalReceipt.events?.Approval.returnValues.value).toBe(value); + expect(approvalReceipt.events?.Approval.returnValues[2]).toBe(value); + + // allowance + expect( + await contractDeployed.methods + .allowance(localAccount.address, tempAccount.address) + .call(), + ).toBe(value); + + // increaseAllowance + const increaseAllowanceReceipt = await contractDeployed.methods + .increaseAllowance(tempAccount.address, extraAmount) + .send({ ...sendOptions, from: localAccount.address, type, gas: '2000000' }); + + expect(increaseAllowanceReceipt.events).toBeDefined(); + expect(increaseAllowanceReceipt.events?.Approval).toBeDefined(); + expect(increaseAllowanceReceipt.events?.Approval.event).toBe('Approval'); + expect( + String(increaseAllowanceReceipt.events?.Approval.returnValues.owner).toLowerCase(), + ).toBe(localAccount.address.toLowerCase()); + expect( + String(increaseAllowanceReceipt.events?.Approval.returnValues[0]).toLowerCase(), + ).toBe(localAccount.address.toLowerCase()); + expect( + String( + increaseAllowanceReceipt.events?.Approval.returnValues.spender, + ).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String(increaseAllowanceReceipt.events?.Approval.returnValues[1]).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect(increaseAllowanceReceipt.events?.Approval.returnValues.value).toBe( + value + extraAmount, + ); + expect(increaseAllowanceReceipt.events?.Approval.returnValues[2]).toBe( + value + extraAmount, + ); + // check allowance + expect( + await contractDeployed.methods + .allowance(localAccount.address, tempAccount.address) + .call(), + ).toBe(value + extraAmount); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/local_account/contract_erc721.test.ts b/packages/web3-eth-contract/test/integration/local_account/contract_erc721.test.ts new file mode 100644 index 00000000000..d9226c580f1 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/local_account/contract_erc721.test.ts @@ -0,0 +1,355 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line import/no-extraneous-dependencies +import Web3 from 'web3'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3Account } from 'web3-eth-accounts'; +import { Contract } from '../../../src'; +import { ERC721TokenAbi, ERC721TokenBytecode } from '../../shared_fixtures/build/ERC721Token'; +import { getSystemTestProvider, createLocalAccount } from '../../fixtures/system_test_utils'; +import { toUpperCaseHex } from '../../shared_fixtures/utils'; + +describe('contract', () => { + describe('erc721', () => { + let contract: Contract; + let sendOptions: Record; + let deployOptions: Record; + let localAccount: Web3Account; + let web3: Web3; + let contractDeployed: Contract; + beforeAll(async () => { + web3 = new Web3(getSystemTestProvider()); + localAccount = await createLocalAccount(web3); + contract = new web3.eth.Contract(ERC721TokenAbi) as unknown as Contract< + typeof ERC721TokenAbi + >; + + deployOptions = { + data: ERC721TokenBytecode, + arguments: [], + }; + + sendOptions = { + from: localAccount.address, + gas: '1000000', + }; + contractDeployed = await contract + .deploy(deployOptions) + .send({ ...sendOptions, gas: '3000000' }); + }); + + it('should deploy the contract', () => { + expect(contractDeployed.options.address).toBeDefined(); + }); + + it.each(['0x1', '0x2'])('should award item %p', async type => { + const tempAccount = web3.eth.accounts.create(); + const awardReceipt = await contractDeployed.methods + .awardItem(tempAccount.address, 'http://my-nft-uri') + .send({ ...sendOptions, type }); + expect(awardReceipt.events).toBeDefined(); + expect(awardReceipt.events?.Transfer).toBeDefined(); + expect(awardReceipt.events?.Transfer.event).toBe('Transfer'); + + expect(String(awardReceipt.events?.Transfer.returnValues.from).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(awardReceipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(awardReceipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(String(awardReceipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + + const tokenId = awardReceipt.events?.Transfer.returnValues?.tokenId as string; + + expect( + toUpperCaseHex( + (await contractDeployed.methods.ownerOf(tokenId).call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(tempAccount.address)); + }); + + it.each(['0x1', '0x2'])('should transferFrom item %p', async type => { + const tempAccount = await createLocalAccount(web3); + const toAccount = await createLocalAccount(web3); + const awardReceipt = await contractDeployed.methods + .awardItem(tempAccount.address, 'http://my-nft-award') + .send({ ...sendOptions, type }); + expect(awardReceipt.events).toBeDefined(); + expect(awardReceipt.events?.Transfer).toBeDefined(); + expect(awardReceipt.events?.Transfer.event).toBe('Transfer'); + + expect(String(awardReceipt.events?.Transfer.returnValues.from).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(awardReceipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(awardReceipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(String(awardReceipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + + const tokenId = awardReceipt.events?.Transfer.returnValues?.tokenId as string; + const transferFromReceipt = await contractDeployed.methods + .transferFrom(tempAccount.address, toAccount.address, tokenId) + .send({ + ...sendOptions, + type, + from: tempAccount.address, + }); + expect(transferFromReceipt.events).toBeDefined(); + expect(transferFromReceipt.events?.Transfer).toBeDefined(); + expect(transferFromReceipt.events?.Transfer.event).toBe('Transfer'); + expect( + String(transferFromReceipt.events?.Transfer.returnValues.from).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect(String(transferFromReceipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(String(transferFromReceipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + toAccount.address.toLowerCase(), + ); + expect(String(transferFromReceipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + toAccount.address.toLowerCase(), + ); + expect(transferFromReceipt.events?.Transfer.returnValues.tokenId).toBe(tokenId); + expect(transferFromReceipt.events?.Transfer.returnValues[2]).toBe(tokenId); + + expect(transferFromReceipt.events?.Approval).toBeDefined(); + expect(transferFromReceipt.events?.Approval.event).toBe('Approval'); + expect( + String(transferFromReceipt.events?.Approval.returnValues.owner).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect(String(transferFromReceipt.events?.Approval.returnValues[0]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect( + String(transferFromReceipt.events?.Approval.returnValues.approved).toLowerCase(), + ).toBe('0x0000000000000000000000000000000000000000'); + expect(String(transferFromReceipt.events?.Approval.returnValues[1]).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(transferFromReceipt.events?.Approval.returnValues.tokenId).toBe(tokenId); + expect(transferFromReceipt.events?.Approval.returnValues[2]).toBe(tokenId); + + expect( + toUpperCaseHex( + (await contractDeployed.methods.ownerOf(tokenId).call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(toAccount.address)); + }); + + it.each(['0x1', '0x2'])('should approve and then transferFrom item %p', async type => { + const tempAccount = await createLocalAccount(web3); + const toAccount = await createLocalAccount(web3); + const awardReceipt = await contractDeployed.methods + .awardItem(tempAccount.address, 'http://my-nft-award') + .send({ ...sendOptions, type }); + expect(awardReceipt.events).toBeDefined(); + expect(awardReceipt.events?.Transfer).toBeDefined(); + expect(awardReceipt.events?.Transfer.event).toBe('Transfer'); + expect(String(awardReceipt.events?.Transfer.returnValues.from).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(awardReceipt.events?.Transfer.returnValues[0]).toLowerCase()).toBe( + '0x0000000000000000000000000000000000000000', + ); + expect(String(awardReceipt.events?.Transfer.returnValues.to).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(String(awardReceipt.events?.Transfer.returnValues[1]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + + const tokenId = awardReceipt.events?.Transfer.returnValues?.tokenId as string; + + const approveReceipt = await contractDeployed.methods + .approve(toAccount.address, tokenId) + .send({ + ...sendOptions, + type, + from: tempAccount.address, + }); + expect(approveReceipt.events).toBeDefined(); + expect(approveReceipt.events?.Approval).toBeDefined(); + expect(approveReceipt.events?.Approval.event).toBe('Approval'); + expect(String(approveReceipt.events?.Approval.returnValues.owner).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect(String(approveReceipt.events?.Approval.returnValues[0]).toLowerCase()).toBe( + tempAccount.address.toLowerCase(), + ); + expect( + String(approveReceipt.events?.Approval.returnValues.approved).toLowerCase(), + ).toBe(toAccount.address.toLowerCase()); + expect(String(approveReceipt.events?.Approval.returnValues[1]).toLowerCase()).toBe( + toAccount.address.toLowerCase(), + ); + expect(approveReceipt.events?.Approval.returnValues.tokenId).toBe(tokenId); + expect(approveReceipt.events?.Approval.returnValues[2]).toBe(tokenId); + + const res = await contractDeployed.methods.getApproved(tokenId).call(); + expect(res.toString().toUpperCase()).toBe(toAccount.address.toUpperCase()); + + const safeTransferFromReceipt = await contractDeployed.methods + .safeTransferFrom(tempAccount.address, toAccount.address, tokenId) + .send({ + ...sendOptions, + type, + from: toAccount.address, + }); + + expect(safeTransferFromReceipt.events).toBeDefined(); + expect(safeTransferFromReceipt.events?.Transfer).toBeDefined(); + expect(safeTransferFromReceipt.events?.Transfer.event).toBe('Transfer'); + expect(safeTransferFromReceipt.events?.Approval).toBeDefined(); + expect(safeTransferFromReceipt.events?.Approval.event).toBe('Approval'); + + expect( + String(safeTransferFromReceipt.events?.Transfer.returnValues.from).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String(safeTransferFromReceipt.events?.Transfer.returnValues[0]).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String(safeTransferFromReceipt.events?.Transfer.returnValues.to).toLowerCase(), + ).toBe(toAccount.address.toLowerCase()); + expect( + String(safeTransferFromReceipt.events?.Transfer.returnValues[1]).toLowerCase(), + ).toBe(toAccount.address.toLowerCase()); + expect(safeTransferFromReceipt.events?.Transfer.returnValues.tokenId).toBe(tokenId); + expect(safeTransferFromReceipt.events?.Transfer.returnValues[2]).toBe(tokenId); + + expect( + String(safeTransferFromReceipt.events?.Approval.returnValues.owner).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String(safeTransferFromReceipt.events?.Approval.returnValues[0]).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String( + safeTransferFromReceipt.events?.Approval.returnValues.approved, + ).toLowerCase(), + ).toBe('0x0000000000000000000000000000000000000000'); + expect( + String(safeTransferFromReceipt.events?.Approval.returnValues[1]).toLowerCase(), + ).toBe('0x0000000000000000000000000000000000000000'); + expect(safeTransferFromReceipt.events?.Approval.returnValues.tokenId).toBe(tokenId); + expect(safeTransferFromReceipt.events?.Approval.returnValues[2]).toBe(tokenId); + + expect( + toUpperCaseHex( + (await contractDeployed.methods.ownerOf(tokenId).call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(toAccount.address)); + }); + + it.each(['0x1', '0x2'])( + 'should set approve for all item with local wallet %p', + async type => { + const tempAccount = await createLocalAccount(web3); + const toAccount = await createLocalAccount(web3); + + const setApprovalReceipt = await contractDeployed.methods + .setApprovalForAll(toAccount.address, true) + .send({ + ...sendOptions, + type, + from: tempAccount.address, + }); + expect(setApprovalReceipt.events).toBeDefined(); + expect(setApprovalReceipt.events?.ApprovalForAll).toBeDefined(); + expect(setApprovalReceipt.events?.ApprovalForAll.event).toBe('ApprovalForAll'); + + expect( + String( + setApprovalReceipt.events?.ApprovalForAll.returnValues.owner, + ).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String(setApprovalReceipt.events?.ApprovalForAll.returnValues[0]).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String( + setApprovalReceipt.events?.ApprovalForAll.returnValues.operator, + ).toLowerCase(), + ).toBe(toAccount.address.toLowerCase()); + expect( + String(setApprovalReceipt.events?.ApprovalForAll.returnValues[1]).toLowerCase(), + ).toBe(toAccount.address.toLowerCase()); + expect(setApprovalReceipt.events?.ApprovalForAll.returnValues.approved).toBe(true); + expect(setApprovalReceipt.events?.ApprovalForAll.returnValues[2]).toBe(true); + + expect( + await contractDeployed.methods + .isApprovedForAll(tempAccount.address, toAccount.address) + .call(), + ).toBe(true); + + const setApprovalForAllReceipt = await contractDeployed.methods + .setApprovalForAll(toAccount.address, false) + .send({ + ...sendOptions, + type, + from: tempAccount.address, + }); + expect(setApprovalForAllReceipt.events).toBeDefined(); + expect(setApprovalForAllReceipt.events?.ApprovalForAll).toBeDefined(); + expect(setApprovalForAllReceipt.events?.ApprovalForAll.event).toBe( + 'ApprovalForAll', + ); + expect( + String( + setApprovalForAllReceipt.events?.ApprovalForAll.returnValues.owner, + ).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String( + setApprovalForAllReceipt.events?.ApprovalForAll.returnValues[0], + ).toLowerCase(), + ).toBe(tempAccount.address.toLowerCase()); + expect( + String( + setApprovalForAllReceipt.events?.ApprovalForAll.returnValues.operator, + ).toLowerCase(), + ).toBe(toAccount.address.toLowerCase()); + expect( + String( + setApprovalForAllReceipt.events?.ApprovalForAll.returnValues[1], + ).toLowerCase(), + ).toBe(toAccount.address.toLowerCase()); + expect(setApprovalForAllReceipt.events?.ApprovalForAll.returnValues.approved).toBe( + false, + ); + expect(setApprovalForAllReceipt.events?.ApprovalForAll.returnValues[2]).toBe(false); + expect( + await contractDeployed.methods + .isApprovedForAll(tempAccount.address, toAccount.address) + .call(), + ).toBe(false); + }, + ); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/local_account/contract_overloaded_methods.test.ts b/packages/web3-eth-contract/test/integration/local_account/contract_overloaded_methods.test.ts new file mode 100644 index 00000000000..35ca056cbab --- /dev/null +++ b/packages/web3-eth-contract/test/integration/local_account/contract_overloaded_methods.test.ts @@ -0,0 +1,116 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line import/no-extraneous-dependencies +import Web3 from 'web3'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3Account } from 'web3-eth-accounts'; +import { utf8ToHex } from 'web3-utils'; +import { EventLog } from 'web3-types'; +import { Contract } from '../../../src'; +import { ERC721TokenAbi, ERC721TokenBytecode } from '../../shared_fixtures/build/ERC721Token'; +import { getSystemTestProvider, createLocalAccount } from '../../fixtures/system_test_utils'; +import { toUpperCaseHex } from '../../shared_fixtures/utils'; + +describe('contract ERC721 overloaded functions', () => { + let contract: Contract; + let sendOptions: Record; + let deployOptions: Record; + let localAccount: Web3Account; + let web3: Web3; + let contractDeployed: Contract; + + beforeAll(async () => { + web3 = new Web3(getSystemTestProvider()); + localAccount = await createLocalAccount(web3); + contract = new web3.eth.Contract(ERC721TokenAbi) as unknown as Contract< + typeof ERC721TokenAbi + >; + + deployOptions = { + data: ERC721TokenBytecode, + arguments: [], + }; + + sendOptions = { + from: localAccount.address, + gas: '1000000', + }; + contractDeployed = await contract + .deploy(deployOptions) + .send({ ...sendOptions, gas: '3000000' }); + }); + + it('transferFrom with 4 arguments', async () => { + const tempAccount = await createLocalAccount(web3); + const toAccount = await createLocalAccount(web3); + await contractDeployed.methods + .awardItem(tempAccount.address, 'http://my-nft-award') + .send({ ...sendOptions }); + + const logs = await contractDeployed.getPastEvents('Transfer'); + const tokenId = (logs[0] as EventLog)?.returnValues?.tokenId as string; + await contractDeployed.methods + .safeTransferFrom(tempAccount.address, toAccount.address, tokenId, utf8ToHex('1')) + .send({ + ...sendOptions, + from: tempAccount.address, + }); + + expect( + toUpperCaseHex( + (await contractDeployed.methods.ownerOf(tokenId).call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(toAccount.address)); + }); + + it('transferFrom with 3 arguments', async () => { + const tempAccount = await createLocalAccount(web3); + const toAccount = await createLocalAccount(web3); + await contractDeployed.methods + .awardItem(tempAccount.address, 'http://my-nft-award') + .send({ ...sendOptions }); + + const logs = await contractDeployed.getPastEvents('Transfer'); + const tokenId = (logs[0] as EventLog)?.returnValues?.tokenId as string; + await contractDeployed.methods + .safeTransferFrom(tempAccount.address, toAccount.address, tokenId) + .send({ + ...sendOptions, + from: tempAccount.address, + }); + + expect( + toUpperCaseHex( + (await contractDeployed.methods.ownerOf(tokenId).call()) as unknown as string, + ), + ).toBe(toUpperCaseHex(toAccount.address)); + }); + + it('transferFrom with 3 invalid arguments', () => { + expect(() => + contractDeployed.methods + .safeTransferFrom(1, 2, 3), + ).toThrow('Web3 validator'); + }); + + it('transferFrom with 2 arguments', () => { + expect(() => + contractDeployed.methods.safeTransferFrom(localAccount.address, localAccount.address), + ).toThrow('Web3 validator'); + }); +}); diff --git a/packages/web3-eth-contract/test/integration/setup.js b/packages/web3-eth-contract/test/integration/setup.js new file mode 100644 index 00000000000..6170e9ca349 --- /dev/null +++ b/packages/web3-eth-contract/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = String(process.env.WEB3_SYSTEM_TEST_PROVIDER).includes('ipc') ? 35000 : 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth-contract/test/shared_fixtures b/packages/web3-eth-contract/test/shared_fixtures new file mode 120000 index 00000000000..729a61c9ef4 --- /dev/null +++ b/packages/web3-eth-contract/test/shared_fixtures @@ -0,0 +1 @@ +../../../fixtures \ No newline at end of file diff --git a/packages/web3-eth-contract/test/tsconfig.json b/packages/web3-eth-contract/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-eth-contract/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-eth-contract/test/unit/contract.test.ts b/packages/web3-eth-contract/test/unit/contract.test.ts new file mode 100644 index 00000000000..a9a0c863242 --- /dev/null +++ b/packages/web3-eth-contract/test/unit/contract.test.ts @@ -0,0 +1,1777 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import * as eth from 'web3-eth'; +import { ValidChains, Hardfork, AccessListResult, Address, ETH_DATA_FORMAT , DEFAULT_RETURN_FORMAT } from 'web3-types'; +import { Web3ContractError } from 'web3-errors'; +import { Web3Context , Web3ConfigEvent } from 'web3-core'; +import { Web3ValidatorError } from 'web3-validator'; +import { AbiItem } from 'web3-utils'; +import { stringify } from 'flatted'; +import {Abi} from '../fixtures/AbiItem' +import { Contract } from '../../src'; +import { sampleStorageContractABI } from '../fixtures/storage'; +import { GreeterAbi, GreeterBytecode } from '../shared_fixtures/build/Greeter'; +import { + GreeterWithOverloadingAbi, + GreeterWithOverloadingBytecode, +} from '../shared_fixtures/build/GreeterWithOverloading'; +import { AllGetPastEventsData, getLogsData, getPastEventsData } from '../fixtures/unitTestFixtures'; +import { getSystemTestProvider } from '../fixtures/system_test_utils'; +import { erc721Abi } from '../fixtures/erc721'; +import { ERC20TokenAbi } from '../shared_fixtures/build/ERC20Token'; +import { processAsync } from '../shared_fixtures/utils'; + +jest.mock('web3-eth', () => { + const allAutoMocked = jest.createMockFromModule('web3-eth'); + const actual = jest.requireActual('web3-eth'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return { + __esModules: true, + // @ts-expect-error ignore allAutoMocked type + ...allAutoMocked, + decodeEventABI: actual.decodeEventABI, + }; +}); + +describe('Contract', () => { + describe('constructor', () => { + it('should init with only the abi', () => { + const contract = new Contract([]); + + expect(contract).toBeInstanceOf(Contract); + }); + + it('should throw if both options.data and options.input are provided', () => { + expect( + () => + new Contract([], { + data: GreeterBytecode, + input: GreeterBytecode, + }), + ).toThrow( + 'You can\'t have "data" and "input" as properties of a contract at the same time, please use either "data" or "input" instead.', + ); + }); + + it('should init with abi and address', () => { + const contract = new Contract([], '0x00000000219ab540356cBB839Cbe05303d7705Fa'); + + expect(contract).toBeInstanceOf(Contract); + }); + + it('should init with abi and options', () => { + const contract = new Contract([], { gas: '123' }); + + expect(contract).toBeInstanceOf(Contract); + }); + + it('method should have correct type by ABI', () => { + const contractInstance = new Contract([ + { + inputs: [ + { + internalType: 'uint256', + name: 'tokenId', + type: 'uint256', + }, + ], + name: 'tokenURI', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + ] as const); + + const method = contractInstance.methods.tokenURI(123); + + expect(method).toBeDefined(); + }); + + it('should init with abi, options and context', () => { + const contract = new Contract( + [], + { gas: '123' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + expect(contract).toBeInstanceOf(Contract); + }); + + it('should init with abiItem, options and context', () => { + const contract = new Contract( + [Abi as AbiItem], + { gas: '123' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + expect(contract).toBeInstanceOf(Contract); + }); + + it('should init with abi, address and options', () => { + const contract = new Contract([], '0x00000000219ab540356cBB839Cbe05303d7705Fa', { + gas: '123', + }); + + expect(contract).toBeInstanceOf(Contract); + }); + + it('should init with abi, address, options and context', () => { + const contract = new Contract( + [], + '0x00000000219ab540356cBB839Cbe05303d7705Fa', + { gas: '123' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + expect(contract).toBeInstanceOf(Contract); + }); + + it('should set the provider, from options, upon instantiation', () => { + const provider = getSystemTestProvider(); + const contract = new Contract([], '', { + provider, + }); + + expect(contract.provider).toEqual({ + clientUrl: provider, + httpProviderOptions: undefined, + }); + }); + + it('should set the provider, from context, upon instantiation', () => { + const provider = getSystemTestProvider(); + const contract = new Contract( + [], + '', + {}, + { + provider, + }, + ); + + expect(contract.provider).toEqual({ + clientUrl: provider, + httpProviderOptions: undefined, + }); + }); + + it('should pass the returnDataFormat to `_parseAndSetAddress` and `_parseAndSetJsonInterface`', () => { + const contract = new Contract([], '', ETH_DATA_FORMAT); + + // @ts-expect-error run protected method + const parseAndSetAddressSpy = jest.spyOn(contract, '_parseAndSetAddress'); + contract.options.address = '0x6e599da0bff7a6598ac1224e4985430bf16458a4'; + + expect(parseAndSetAddressSpy).toHaveBeenCalledWith( + '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + ETH_DATA_FORMAT, + ); + const parseAndSetJsonInterfaceSpy = jest.spyOn( + contract, + // @ts-expect-error run protected method + '_parseAndSetJsonInterface', + ); + contract.options.jsonInterface = []; + expect(parseAndSetJsonInterfaceSpy).toHaveBeenCalledWith([], ETH_DATA_FORMAT); + }); + + it('should pass the returnDataFormat, as the constructor forth parameter, to `_parseAndSetAddress` and `_parseAndSetJsonInterface`', () => { + const contract = new Contract([], '', {}, ETH_DATA_FORMAT); + + // @ts-expect-error run protected method + const parseAndSetAddressSpy = jest.spyOn(contract, '_parseAndSetAddress'); + contract.options.address = '0x6e599da0bff7a6598ac1224e4985430bf16458a4'; + + expect(parseAndSetAddressSpy).toHaveBeenCalledWith( + '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + ETH_DATA_FORMAT, + ); + const parseAndSetJsonInterfaceSpy = jest.spyOn( + contract, + // @ts-expect-error run protected method + '_parseAndSetJsonInterface', + ); + contract.options.jsonInterface = []; + expect(parseAndSetJsonInterfaceSpy).toHaveBeenCalledWith([], ETH_DATA_FORMAT); + }); + + it('should pass the returnDataFormat, as the constructor fifth parameter, to `_parseAndSetAddress` and `_parseAndSetJsonInterface`', () => { + const contract = new Contract([], '', {}, {}, ETH_DATA_FORMAT); + + // @ts-expect-error run protected method + const parseAndSetAddressSpy = jest.spyOn(contract, '_parseAndSetAddress'); + contract.options.address = '0x6e599da0bff7a6598ac1224e4985430bf16458a4'; + + expect(parseAndSetAddressSpy).toHaveBeenCalledWith( + '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + ETH_DATA_FORMAT, + ); + const parseAndSetJsonInterfaceSpy = jest.spyOn( + contract, + // @ts-expect-error run protected method + '_parseAndSetJsonInterface', + ); + contract.options.jsonInterface = []; + expect(parseAndSetJsonInterfaceSpy).toHaveBeenCalledWith([], ETH_DATA_FORMAT); + }); + }); + + describe('Contract functions and defaults', () => { + let sendOptions: Record; + const deployedAddr = '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426'; + + beforeEach(() => { + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + }); + + it('should deploy contract with input property', async () => { + const input = `${GreeterBytecode}0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000`; + const contract = new Contract(GreeterAbi); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const sendTransactionSpy = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, tx) => { + expect(tx.to).toBeUndefined(); + expect(tx.gas).toStrictEqual(sendOptions.gas); + expect(tx.gasPrice).toBeUndefined(); + expect(tx.from).toStrictEqual(sendOptions.from); + expect(tx.input).toStrictEqual(input); // padded data + + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const deployedContract = await contract + .deploy({ + input: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + expect(deployedContract).toBeDefined(); + expect(deployedContract.options.address).toStrictEqual(deployedAddr); + sendTransactionSpy.mockClear(); + }); + + it('should deploy contract with input property with no ABI', async () => { + const input = `${GreeterBytecode}0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000`; + const contract = new Contract([]); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const sendTransactionSpy = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, tx) => { + expect(tx.to).toBeUndefined(); + expect(tx.gas).toStrictEqual(sendOptions.gas); + expect(tx.gasPrice).toBeUndefined(); + expect(tx.from).toStrictEqual(sendOptions.from); + expect(tx.input).toStrictEqual(input); // padded data + + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const deployedContract = await contract + .deploy({ + input: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + expect(deployedContract).toBeDefined(); + expect(deployedContract.options.address).toStrictEqual(deployedAddr); + sendTransactionSpy.mockClear(); + }); + + it('should deploy contract with data property', async () => { + const data = `${GreeterBytecode}0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000`; + const contract = new Contract(GreeterAbi); + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const sendTransactionSpy = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, tx) => { + expect(tx.to).toBeUndefined(); + expect(tx.gas).toStrictEqual(sendOptions.gas); + expect(tx.gasPrice).toBeUndefined(); + expect(tx.from).toStrictEqual(sendOptions.from); + expect(tx.data).toStrictEqual(data); // padded data + + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + expect(deployedContract).toBeDefined(); + expect(deployedContract.options.address).toStrictEqual(deployedAddr); + sendTransactionSpy.mockClear(); + }); + + // eslint-disable-next-line @typescript-eslint/require-await + it('should not deploy contract with empty data', async () => { + const contract = new Contract(GreeterAbi); + + expect(() => contract.deploy({ data: '' }).send(sendOptions)).toThrow( + 'contract creation without any data provided', + ); + }); + + // eslint-disable-next-line @typescript-eslint/require-await + it('send method on deployed contract should work using input', async () => { + const arg = 'Hello'; + const contract = new Contract(GreeterAbi); + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + const spyTx = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, _tx) => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + expect(_tx.data).toBeDefined(); + if ( + _tx.data === + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' + ) { + // eslint-disable-next-line + expect(_tx.to).toStrictEqual(deployedAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return { status: '0x1', on: () => {} } as any; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return Promise.resolve(Object.assign(newContract, { on: () => {} })) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + const receipt = await deployedContract.methods.setGreeting(arg).send(sendOptions); + expect(receipt.status).toBe('0x1'); + + spyTx.mockClear(); + }); + + it('test calling overloaded solidity method', async () => { + const arg = 'Hello'; + const contract = new Contract(GreeterWithOverloadingAbi); + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + const spyTx = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, _tx) => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + expect(_tx.data).toBeDefined(); + if ( + _tx.data === + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' || + _tx.data === + '0x4495ef8a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' + ) { + // eslint-disable-next-line + expect(_tx.to).toStrictEqual(deployedAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return { status: '0x1', on: () => {} } as any; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return Object.assign(Promise.resolve(newContract), { on: () => {} }) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterWithOverloadingBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const receipt = await deployedContract.methods.setGreeting(arg).send(sendOptions); + expect(receipt.status).toBe('0x1'); + + const receipt2 = await deployedContract.methods + .setGreeting(arg, true) + .send(sendOptions); + expect(receipt2.status).toBe('0x1'); + + spyTx.mockClear(); + }); + + it('test calling overloaded solidity method with incompatible parameters', async () => { + const arg = 'Hello'; + const contract = new Contract(GreeterWithOverloadingAbi); + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + const spyTx = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, _tx) => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + expect(_tx.data).toBeDefined(); + if ( + _tx.data === + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' || + _tx.data === + '0x4495ef8a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' + ) { + // eslint-disable-next-line jest/no-conditional-expect + expect(_tx.to).toStrictEqual(deployedAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return { status: '0x1', on: () => {} } as any; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return Object.assign(Promise.resolve(newContract), { on: () => {} }) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterWithOverloadingBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const receipt = await deployedContract.methods.setGreeting(arg).send(sendOptions); + expect(receipt.status).toBe('0x1'); + + // calling with correct parameters should pass + const receipt2 = await deployedContract.methods + .setGreeting(arg, true) + .send(sendOptions); + expect(receipt2.status).toBe('0x1'); + + // calling with wrong parameters should throw + try { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + await(deployedContract.methods.setGreeting as any)(arg, 'test').send(sendOptions); + expect(true).toBe(false); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error).toBeInstanceOf(Web3ValidatorError); + // eslint-disable-next-line jest/no-conditional-expect + expect((error as Web3ValidatorError).message).toBe( + 'Web3 validator found 1 error[s]:\nWeb3 validator found 1 error[s]:\nvalue "test" at "/1" must pass "bool" validation', + ); + } + + // calling with wrong parameters should throw + try { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + await(deployedContract.methods.setGreeting as any)(arg, true, 'test').send( + sendOptions, + ); + expect(true).toBe(false); + } catch (error) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error).toBeInstanceOf(Web3ValidatorError); + // eslint-disable-next-line jest/no-conditional-expect + expect((error as Web3ValidatorError).message).toBe( + 'Web3 validator found 2 error[s]:\nmust NOT have more than 1 items\nvalue "true" at "/1" must pass "string" validation', + ); + } + + spyTx.mockClear(); + }); + + it('send method on deployed contract should work using data (default)', async () => { + const arg = 'Hello'; + const contract = new Contract(GreeterAbi); + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + data: '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000', + }; + const spyTx = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, _tx) => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + expect(_tx.data).toBeDefined(); + if ( + _tx.data === + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' + ) { + // eslint-disable-next-line + expect(_tx.to).toStrictEqual(deployedAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return { status: '0x1', on: () => {} } as any; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return Promise.resolve(Object.assign(newContract, { on: () => {} })) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + const receipt = await deployedContract.methods.setGreeting(arg).send(sendOptions); + expect(receipt.status).toBe('0x1'); + + spyTx.mockClear(); + }); + + it('should config change if the linked web3config emitted a config change event', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { + contractDataInputFill: 'data', + defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa', + }, + }); + const contract = new Contract(GreeterAbi, web3Context); + web3Context.emit(Web3ConfigEvent.CONFIG_CHANGE, { + name: 'contractDataInputFill', + oldValue: 'data', + newValue: 'input', + }); + expect(contract.config.contractDataInputFill).toBe('input'); + }); + + it('should send method on deployed contract should work with data using web3config', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { + contractDataInputFill: 'data', + defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa', + }, + }); + const arg = 'Hello'; + const contract = new Contract(GreeterAbi, web3Context); + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + const spyTx = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, _tx) => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + if ( + _tx.data === + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' + ) { + // eslint-disable-next-line + expect(_tx.to).toStrictEqual(deployedAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return { status: '0x1', on: () => {} } as any; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return Promise.resolve(Object.assign(newContract, { on: () => {} })) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + const receipt = await deployedContract.methods.setGreeting(arg).send(sendOptions); + expect(receipt.status).toBe('0x1'); + + spyTx.mockClear(); + }); + + it('send method on deployed contract should work with both input and data using web3config', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { + contractDataInputFill: 'both', + defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa', + }, + }); + const arg = 'Hello'; + const contract = new Contract(GreeterAbi, web3Context); + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + const spyTx = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, _tx) => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + if ( + _tx.data === + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' + ) { + // eslint-disable-next-line + expect(_tx.input).toStrictEqual( + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000', + ); + // eslint-disable-next-line + expect(_tx.to).toStrictEqual(deployedAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return { status: '0x1', on: () => {} } as any; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return Promise.resolve(Object.assign(newContract, { on: () => {} })) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + const receipt = await deployedContract.methods.setGreeting(arg).send(sendOptions); + expect(receipt.status).toBe('0x1'); + + spyTx.mockClear(); + }); + + it('should send method on deployed contract should work with input using web3config', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { + contractDataInputFill: 'input', + defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa', + }, + }); + const arg = 'Hello'; + const contract = new Contract(GreeterAbi, web3Context); + sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + const spyTx = jest + .spyOn(eth, 'sendTransaction') + .mockImplementation((_objInstance, _tx) => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + if ( + _tx.input === + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000' + ) { + // eslint-disable-next-line + expect(_tx.to).toStrictEqual(deployedAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return { status: '0x1', on: () => {} } as any; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-empty-function + return Promise.resolve(Object.assign(newContract, { on: () => {} })) as any; + }); + + const deployedContract = await contract + .deploy({ + input: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + const receipt = await deployedContract.methods.setGreeting(arg).send(sendOptions); + expect(receipt.status).toBe('0x1'); + + spyTx.mockClear(); + }); + + it('call on deployed contract should decode result', async () => { + const arg = 'Hello'; + const encodedArg = + '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000'; + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyEthCall = jest.spyOn(eth, 'call').mockImplementation((_objInstance, _tx) => { + expect(_tx.to).toStrictEqual(deployedAddr); + expect(_tx.data).toBe('0xcfae3217'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(encodedArg) as any; // contract class should decode encodedArg + }); + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + const res = await deployedContract.methods.greet().call(); + expect(res).toStrictEqual(arg); + + spyTx.mockClear(); + spyEthCall.mockClear(); + }); + + it('should clone pre deployed contract with address', () => { + const contract = new Contract( + sampleStorageContractABI, + '0x00000000219ab540356cBB839Cbe05303d7705Fa', + { gas: '0x97254' }, + ); + + const clonnedContract = contract.clone(); + + expect(stringify(contract)).toStrictEqual(stringify(clonnedContract)); + + contract.options.jsonInterface = GreeterAbi; + }); + + it('should clone new contract', () => { + const contract = new Contract(sampleStorageContractABI); + + const clonnedContract = contract.clone(); + expect(stringify(contract)).toStrictEqual(stringify(clonnedContract)); + }); + + it('should be able to update the jsonInterface', () => { + const contract = new Contract(sampleStorageContractABI); + + expect(contract.methods.retrieveNum).toBeDefined(); + expect(contract.methods.storeNum).toBeDefined(); + + expect(contract.methods.greet).toBeUndefined(); + expect(contract.methods.increment).toBeUndefined(); + expect(contract.methods.setGreeting).toBeUndefined(); + + contract.options.jsonInterface = GreeterAbi; + + expect(contract.methods.retrieveNum).toBeUndefined(); + expect(contract.methods.storeNum).toBeUndefined(); + + expect(contract.methods.greet).toBeDefined(); + expect(contract.methods.increment).toBeDefined(); + expect(contract.methods.setGreeting).toBeDefined(); + }); + + it('defaults set and get should work', () => { + const contract = new Contract([], '0x00000000219ab540356cBB839Cbe05303d7705Fa'); + + const defaultAddr = '0xd7E30ae310C1D1800F5B641Baa7af95b2e1FD98C'; + expect(contract.defaultAccount).toBeUndefined(); + contract.defaultAccount = defaultAddr; + expect(contract.defaultAccount).toStrictEqual(defaultAddr); + + const defaultBlock = '0xC43A'; + expect(contract.defaultBlock).toBe('latest'); + contract.defaultBlock = defaultBlock; + expect(contract.defaultBlock).toStrictEqual(defaultBlock); + + const defaultHardfork = 'constantinople'; + expect(contract.defaultHardfork).toBe('london'); + contract.defaultHardfork = defaultHardfork; + expect(contract.defaultHardfork).toStrictEqual(defaultHardfork); + + const baseChain = 'mainnet' as ValidChains; + contract.defaultChain = baseChain; + expect(contract.defaultChain).toBe(baseChain); + + const defaultCommonDifferentHardfork = { + customChain: { name: 'testnet', networkId: '5678', chainId: '5634' }, + baseChain, + hardfork: 'petersburg' as Hardfork, + }; + expect(contract.defaultCommon).toBeUndefined(); + + // Test that defaultcommon will error when defaulthardfork is not matching + // Has to be wrapped in another function to check Error + expect(() => { + contract.defaultCommon = defaultCommonDifferentHardfork; + }).toThrow( + new Error( + 'Web3Config hardfork doesnt match in defaultHardfork constantinople and common.hardfork petersburg', + ), + ); + + expect(contract.defaultCommon).toBeUndefined(); + + // Should error when defaultCommon has different chain than defaultChain + const defaultCommonDifferentChain = { + customChain: { name: 'testnet', networkId: '5678', chainId: '5634' }, + baseChain: 'sepolia' as ValidChains, + hardfork: 'constantinople' as Hardfork, + }; + expect(() => { + contract.defaultCommon = defaultCommonDifferentChain; + }).toThrow( + new Error( + 'Web3Config chain doesnt match in defaultHardfork mainnet and common.hardfork sepolia', + ), + ); + + expect(contract.defaultCommon).toBeUndefined(); + + const defaultCommon = { + customChain: { name: 'testnet', networkId: '5678', chainId: '5634' }, + baseChain: 'mainnet' as ValidChains, + hardfork: 'constantinople' as Hardfork, + }; + contract.defaultCommon = defaultCommon; + expect(contract.defaultCommon).toBe(defaultCommon); + + const transactionBlockTimeout = 130; + expect(contract.transactionBlockTimeout).toBe(50); + contract.transactionBlockTimeout = transactionBlockTimeout; + expect(contract.transactionBlockTimeout).toStrictEqual(transactionBlockTimeout); + + const transactionConfirmationBlocks = 30; + expect(contract.transactionConfirmationBlocks).toBe(24); + contract.transactionConfirmationBlocks = transactionConfirmationBlocks; + expect(contract.transactionConfirmationBlocks).toStrictEqual( + transactionConfirmationBlocks, + ); + + const transactionPollingInterval = 1000; + expect(contract.transactionPollingInterval).toBe(1000); + contract.transactionPollingInterval = transactionPollingInterval; + expect(contract.transactionPollingInterval).toStrictEqual(transactionPollingInterval); + + const transactionPollingTimeout = 800000; + expect(contract.transactionPollingTimeout).toBe(750000); + contract.transactionPollingTimeout = transactionPollingTimeout; + expect(contract.transactionPollingTimeout).toStrictEqual(transactionPollingTimeout); + + const transactionReceiptPollingInterval = 2000; // its new in 4.x + expect(contract.transactionReceiptPollingInterval).toBe(1000); + contract.transactionReceiptPollingInterval = transactionReceiptPollingInterval; + expect(contract.transactionReceiptPollingInterval).toStrictEqual( + transactionReceiptPollingInterval, + ); + + const transactionConfirmationPollingInterval = 2501; // its new in 4.x + expect(contract.transactionConfirmationPollingInterval).toBe(1000); + contract.transactionConfirmationPollingInterval = + transactionConfirmationPollingInterval; + expect(contract.transactionConfirmationPollingInterval).toStrictEqual( + transactionConfirmationPollingInterval, + ); + + const transactionSendTimeout = 730000; // its new in 4.x + expect(contract.transactionSendTimeout).toBe(750000); + contract.transactionSendTimeout = transactionSendTimeout; + expect(contract.transactionSendTimeout).toStrictEqual(transactionSendTimeout); + + const blockHeaderTimeout = 12; + expect(contract.blockHeaderTimeout).toBe(10); + contract.blockHeaderTimeout = blockHeaderTimeout; + expect(contract.blockHeaderTimeout).toStrictEqual(blockHeaderTimeout); + + expect(contract.handleRevert).toBe(false); + contract.handleRevert = true; + expect(contract.handleRevert).toBe(true); + }); + + it('should set and get correct address', () => { + const addr = '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701'; + const contract = new Contract( + [], + '', + { gas: '123' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + contract.options.address = addr; + expect(contract.options.address).toStrictEqual(addr); + }); + + it('should set, at the constructor, and later get jsonInterface', () => { + const contract = new Contract( + sampleStorageContractABI, + '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701', + { gas: '123' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + expect(contract.options.jsonInterface).toMatchObject(sampleStorageContractABI); + }); + + it('should set and get jsonInterface', () => { + const contract = new Contract( + sampleStorageContractABI, + '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701', + { gas: '123' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + contract.options.jsonInterface = ERC20TokenAbi; + expect(contract.options.jsonInterface).toMatchObject(ERC20TokenAbi); + }); + + it('should be able to call a payable method', async () => { + const contract = new Contract( + erc721Abi, + '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701', + { gas: '123' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + // @ts-expect-error fix-types + const spyEthCall = jest.spyOn(eth, 'call').mockImplementation((_objInstance, _tx) => { + expect(_tx.to).toBe('0x1230B93ffd14F2F022039675fA3fc3A46eE4C701'); + expect(_tx.data).toBe( + '0x095ea7b300000000000000000000000000000000219ab540356cbb839cbe05303d7705fa0000000000000000000000000000000000000000000000000000000000000001', + ); + return '0x00'; + }); + + await expect( + contract.methods.approve('0x00000000219ab540356cBB839Cbe05303d7705Fa', 1).call(), + ).resolves.toBeTruthy(); + + spyEthCall.mockClear(); + }); + + it('should be able to call a payable method with data as a contract init option', async () => { + const contract = new Contract( + erc721Abi, + '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701', + { gas: '123', dataInputFill: 'data' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + const spyEthCall = jest + .spyOn(eth, 'call') + .mockImplementation(async (_objInstance, _tx) => { + expect(_tx.to).toBe('0x1230B93ffd14F2F022039675fA3fc3A46eE4C701'); + expect(_tx.data).toBe( + '0x095ea7b300000000000000000000000000000000219ab540356cbb839cbe05303d7705fa0000000000000000000000000000000000000000000000000000000000000001', + ); + return '0x00'; + }); + + await expect( + contract.methods.approve('0x00000000219ab540356cBB839Cbe05303d7705Fa', 1).call(), + ).resolves.toBeTruthy(); + + spyEthCall.mockClear(); + }); + + it('should be able to call a payable method with input as a contract init option', async () => { + const contract = new Contract( + erc721Abi, + '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701', + { gas: '123', dataInputFill: 'input' }, + { config: { defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa' } }, + ); + + const spyEthCall = jest + .spyOn(eth, 'call') + .mockImplementation(async (_objInstance, _tx) => { + expect(_tx.to).toBe('0x1230B93ffd14F2F022039675fA3fc3A46eE4C701'); + expect(_tx.input).toBe( + '0x095ea7b300000000000000000000000000000000219ab540356cbb839cbe05303d7705fa0000000000000000000000000000000000000000000000000000000000000001', + ); + return '0x00'; + }); + + await expect( + contract.methods.approve('0x00000000219ab540356cBB839Cbe05303d7705Fa', 1).call(), + ).resolves.toBeTruthy(); + + spyEthCall.mockClear(); + }); + + it('should be able to call a payable method with data as a web3Context option', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { + contractDataInputFill: 'data', + defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa', + }, + }); + const contract = new Contract( + erc721Abi, + '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701', + { gas: '123' }, + web3Context, + ); + + const spyEthCall = jest + .spyOn(eth, 'call') + .mockImplementation(async (_objInstance, _tx) => { + expect(_tx.to).toBe('0x1230B93ffd14F2F022039675fA3fc3A46eE4C701'); + expect(_tx.data).toBe( + '0x095ea7b300000000000000000000000000000000219ab540356cbb839cbe05303d7705fa0000000000000000000000000000000000000000000000000000000000000001', + ); + return '0x00'; + }); + + await expect( + contract.methods.approve('0x00000000219ab540356cBB839Cbe05303d7705Fa', 1).call(), + ).resolves.toBeTruthy(); + + spyEthCall.mockClear(); + }); + + it('should be able to call a payable method with both data and input as a web3Context option', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { + contractDataInputFill: 'both', + defaultAccount: '0x00000000219ab540356cBB839Cbe05303d7705Fa', + }, + }); + const contract = new Contract( + erc721Abi, + '0x1230B93ffd14F2F022039675fA3fc3A46eE4C701', + { gas: '123' }, + web3Context, + ); + + const spyEthCall = jest + .spyOn(eth, 'call') + .mockImplementation(async (_objInstance, _tx) => { + expect(_tx.to).toBe('0x1230B93ffd14F2F022039675fA3fc3A46eE4C701'); + expect(_tx.data).toBe( + '0x095ea7b300000000000000000000000000000000219ab540356cbb839cbe05303d7705fa0000000000000000000000000000000000000000000000000000000000000001', + ); + expect(_tx.input).toBe( + '0x095ea7b300000000000000000000000000000000219ab540356cbb839cbe05303d7705fa0000000000000000000000000000000000000000000000000000000000000001', + ); + return '0x00'; + }); + + await expect( + contract.methods.approve('0x00000000219ab540356cBB839Cbe05303d7705Fa', 1).call(), + ).resolves.toBeTruthy(); + + spyEthCall.mockClear(); + }); + + it('getPastEvents with filter should work', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyGetLogs = jest + .spyOn(eth, 'getLogs') + .mockImplementation((_objInstance, _params) => { + expect(_params.address).toStrictEqual(deployedAddr.toLocaleLowerCase()); + expect(_params.fromBlock).toStrictEqual(getLogsData.request.fromBlock); + expect(_params.toBlock).toStrictEqual(getLogsData.request.toBlock); + expect(_params.topics).toStrictEqual(getLogsData.request.topics); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(getLogsData.response) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const fromBlock = 'earliest'; + const toBlock = 'latest'; + const pastEvent = await deployedContract.getPastEvents(getPastEventsData.event as any, { + fromBlock, + toBlock, + }); + + expect(pastEvent).toStrictEqual(getPastEventsData.response); + spyTx.mockClear(); + spyGetLogs.mockClear(); + }); + + it('getPastEvents with filter by topics should work', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyGetLogs = jest + .spyOn(eth, 'getLogs') + .mockImplementation((_objInstance, _params) => { + expect(_params.address).toStrictEqual(deployedAddr.toLocaleLowerCase()); + expect(_params.fromBlock).toStrictEqual(getLogsData.request.fromBlock); + expect(_params.toBlock).toStrictEqual(getLogsData.request.toBlock); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve([getLogsData.response[0]]) as any; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const fromBlock = 'earliest'; + const toBlock = 'latest'; + const pastEvent = await deployedContract.getPastEvents(getPastEventsData.event as any, { + fromBlock, + toBlock, + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + }); + + expect(pastEvent).toStrictEqual(getPastEventsData.response); + spyTx.mockClear(); + spyGetLogs.mockClear(); + }); + + it('getPastEvents for all events should work', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyGetLogs = jest + .spyOn(eth, 'getLogs') + .mockImplementation((_objInstance, _params) => { + expect(_params.address).toStrictEqual(deployedAddr.toLocaleLowerCase()); + expect(_params.fromBlock).toBeUndefined(); + expect(_params.toBlock).toBeUndefined(); + expect(_params.topics).toBeUndefined(); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(AllGetPastEventsData.getLogsData) as any; // AllGetPastEventsData.getLogsData data test is for: assume two transactions sent to contract with contractInstance.methods.setGreeting("Hello") and contractInstance.methods.setGreeting("Another Greeting") + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const pastEvent = await deployedContract.getPastEvents('allEvents'); + + expect(pastEvent).toStrictEqual(AllGetPastEventsData.response); + spyTx.mockClear(); + spyGetLogs.mockClear(); + }); + + it('getPastEvents for all events with filter should work', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyGetLogs = jest + .spyOn(eth, 'getLogs') + .mockImplementation((_objInstance, _params) => { + expect(_params.address).toStrictEqual(deployedAddr.toLocaleLowerCase()); + expect(_params.fromBlock).toBeUndefined(); + expect(_params.toBlock).toBeUndefined(); + expect(_params.topics).toBeUndefined(); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(AllGetPastEventsData.getLogsData) as any; // AllGetPastEventsData.getLogsData data test is for: assume two transactions sent to contract with contractInstance.methods.setGreeting("Hello") and contractInstance.methods.setGreeting("Another Greeting") + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const pastEvent = await deployedContract.getPastEvents('allEvents', { + filter: { + greeting: 'Another Greeting', + }, + }); + + expect(pastEvent).toHaveLength(1); + expect(pastEvent[0]).toStrictEqual(AllGetPastEventsData.response[1]); + + const pastEventWithoutEventName = await deployedContract.getPastEvents({ + filter: { + greeting: 'Another Greeting', + }, + }); + + expect(pastEventWithoutEventName).toHaveLength(1); + expect(pastEventWithoutEventName[0]).toStrictEqual(AllGetPastEventsData.response[1]); + + const pastEventFilterArray = await deployedContract.getPastEvents({ + filter: { + greeting: ['Another Greeting'], + }, + }); + + expect(pastEventFilterArray).toHaveLength(1); + expect(pastEventFilterArray[0]).toStrictEqual(AllGetPastEventsData.response[1]); + + const pastEventFilterWithIncorrectParam = await deployedContract.getPastEvents({ + filter: { + incorrectParam: 'test', + }, + }); + expect(pastEventFilterWithIncorrectParam).toHaveLength(0); + + spyTx.mockClear(); + spyGetLogs.mockClear(); + }); + + it('getPastEvents for all events with filter by topics should work', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyGetLogs = jest + .spyOn(eth, 'getLogs') + .mockImplementation((_objInstance, _params) => { + expect(_params.address).toStrictEqual(deployedAddr.toLocaleLowerCase()); + expect(_params.fromBlock).toBeUndefined(); + expect(_params.toBlock).toBeUndefined(); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve([AllGetPastEventsData.getLogsData[1]]) as any; // AllGetPastEventsData.getLogsData data test is for: assume two transactions sent to contract with contractInstance.methods.setGreeting("Hello") and contractInstance.methods.setGreeting("Another Greeting") + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const pastEvent = await deployedContract.getPastEvents({ + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + }); + expect(pastEvent).toHaveLength(1); + expect(pastEvent[0]).toStrictEqual(AllGetPastEventsData.response[1]); + + spyTx.mockClear(); + spyGetLogs.mockClear(); + }); + + it('allEvents() should throw error with inner error', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyGetLogs = jest + .spyOn(eth, 'getLogs') + .mockImplementation((_objInstance, _params) => { + throw new Error('Inner error'); + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + await expect( + processAsync((resolve, reject) => { + const event = deployedContract.events.allEvents({ fromBlock: 'earliest' }); + + event.on('error', reject); + event.on('data', resolve); + }), + ).rejects.toThrow( + expect.objectContaining({ + cause: expect.any(Error), + }), + ); + + spyTx.mockClear(); + spyGetLogs.mockClear(); + }); + + it('encodeABI should work for the deploy function using data', () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const deploy = contract.deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }); + + const result = deploy.encodeABI(); + expect(result).toBe( + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000', + ); + + spyTx.mockClear(); + }); + it.skip('estimateGas should use DEFAULT_RETURN_FORMAT by default', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyEstimateGas = jest + .spyOn(eth, 'estimateGas') + .mockImplementationOnce(async (_objInstance, _tx, _block, returnFormat) => { + expect(_block).toBe('latest'); + expect(_tx.to).toBeUndefined(); + expect(_tx.from).toStrictEqual(sendOptions.from); + expect(_tx.input).toBe( + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000', + ); + expect(returnFormat).toBe(DEFAULT_RETURN_FORMAT); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(BigInt(36916)); + }); + + const deploy = contract.deploy({ + input: GreeterBytecode, + arguments: ['My Greeting'], + }); + + const result = await deploy.estimateGas(sendOptions); + expect(result).toStrictEqual(BigInt(36916)); + + spyTx.mockClear(); + spyEstimateGas.mockClear(); + }); + + it('estimateGas should work for the deploy function using input', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyEstimateGas = jest + .spyOn(eth, 'estimateGas') + .mockImplementationOnce((_objInstance, _tx, _block, returnFormat) => { + expect(_block).toBe('latest'); + expect(_tx.to).toBeUndefined(); + expect(_tx.from).toStrictEqual(sendOptions.from); + expect(_tx.input).toBe( + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000', + ); + expect(returnFormat).toBe(ETH_DATA_FORMAT); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(BigInt(36916)) as any; + }); + + const deploy = contract.deploy({ + input: GreeterBytecode, + arguments: ['My Greeting'], + }); + + const result = await deploy.estimateGas(sendOptions, ETH_DATA_FORMAT); + expect(result).toStrictEqual(BigInt(36916)); + + spyTx.mockClear(); + spyEstimateGas.mockClear(); + }); + + it('estimateGas should work for the deploy function using data', async () => { + const contract = new Contract(GreeterAbi); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyEstimateGas = jest + .spyOn(eth, 'estimateGas') + .mockImplementationOnce((_objInstance, _tx, _block, returnFormat) => { + expect(_block).toBe('latest'); + expect(_tx.to).toBeUndefined(); + expect(_tx.from).toStrictEqual(sendOptions.from); + expect(_tx.data).toBe( + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000', + ); + expect(returnFormat).toBe(ETH_DATA_FORMAT); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(BigInt(36916)) as any; + }); + + const deploy = contract.deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }); + + const result = await deploy.estimateGas(sendOptions, ETH_DATA_FORMAT); + expect(result).toStrictEqual(BigInt(36916)); + + spyTx.mockClear(); + spyEstimateGas.mockClear(); + }); + + it('estimateGas should work for the deploy function using both data and input web3config', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { contractDataInputFill: 'both' }, + }); + + const contract = new Contract(GreeterAbi, web3Context); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyEstimateGas = jest + .spyOn(eth, 'estimateGas') + .mockImplementationOnce((_objInstance, _tx, _block, returnFormat) => { + expect(_block).toBe('latest'); + expect(_tx.to).toBeUndefined(); + expect(_tx.from).toStrictEqual(sendOptions.from); + expect(_tx.data).toBe( + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000', + ); + expect(_tx.input).toBe( + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000', + ); + expect(returnFormat).toBe(ETH_DATA_FORMAT); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(BigInt(36916)) as any; + }); + + const deploy = contract.deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }); + + const result = await deploy.estimateGas(sendOptions, ETH_DATA_FORMAT); + expect(result).toStrictEqual(BigInt(36916)); + + spyTx.mockClear(); + spyEstimateGas.mockClear(); + }); + it('estimateGas should work for the deploy function using data web3config', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { contractDataInputFill: 'data' }, + }); + + const contract = new Contract(GreeterAbi, web3Context); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyEstimateGas = jest + .spyOn(eth, 'estimateGas') + .mockImplementationOnce((_objInstance, _tx, _block, returnFormat) => { + expect(_block).toBe('latest'); + expect(_tx.to).toBeUndefined(); + expect(_tx.from).toStrictEqual(sendOptions.from); + expect(_tx.data).toBe( + '0x60806040523480156200001157600080fd5b5060405162000ed038038062000ed08339818101604052810190620000379190620001ea565b806001908162000048919062000486565b5060008081905550506200056d565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000c08262000075565b810181811067ffffffffffffffff82111715620000e257620000e162000086565b5b80604052505050565b6000620000f762000057565b9050620001058282620000b5565b919050565b600067ffffffffffffffff82111562000128576200012762000086565b5b620001338262000075565b9050602081019050919050565b60005b838110156200016057808201518184015260208101905062000143565b60008484015250505050565b6000620001836200017d846200010a565b620000eb565b905082815260208101848484011115620001a257620001a162000070565b5b620001af84828562000140565b509392505050565b600082601f830112620001cf57620001ce6200006b565b5b8151620001e18482602086016200016c565b91505092915050565b60006020828403121562000203576200020262000061565b5b600082015167ffffffffffffffff81111562000224576200022362000066565b5b6200023284828501620001b7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028e57607f821691505b602082108103620002a457620002a362000246565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002cf565b6200031a8683620002cf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000367620003616200035b8462000332565b6200033c565b62000332565b9050919050565b6000819050919050565b620003838362000346565b6200039b62000392826200036e565b848454620002dc565b825550505050565b600090565b620003b2620003a3565b620003bf81848462000378565b505050565b5b81811015620003e757620003db600082620003a8565b600181019050620003c5565b5050565b601f82111562000436576200040081620002aa565b6200040b84620002bf565b810160208510156200041b578190505b620004336200042a85620002bf565b830182620003c4565b50505b505050565b600082821c905092915050565b60006200045b600019846008026200043b565b1980831691505092915050565b600062000476838362000448565b9150826002028217905092915050565b62000491826200023b565b67ffffffffffffffff811115620004ad57620004ac62000086565b5b620004b9825462000275565b620004c6828285620003eb565b600060209050601f831160018114620004fe5760008415620004e9578287015190505b620004f5858262000468565b86555062000565565b601f1984166200050e86620002aa565b60005b82811015620005385784890151825560018201915060208501945060208101905062000511565b8683101562000558578489015162000554601f89168262000448565b8355505b6001600288020188555050505b505050505050565b610953806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063a413686214610046578063cfae321714610077578063d09de08a14610095575b600080fd5b610060600480360381019061005b91906103c0565b61009f565b60405161006e9291906104a3565b60405180910390f35b61007f6101bd565b60405161008c91906104d3565b60405180910390f35b61009d61024f565b005b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756001846040516100d59291906105ee565b60405180910390a182600190816100ec91906107c6565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600160405161011d9190610898565b60405180910390a160018080805461013490610524565b80601f016020809104026020016040519081016040528092919081815260200182805461016090610524565b80156101ad5780601f10610182576101008083540402835291602001916101ad565b820191906000526020600020905b81548152906001019060200180831161019057829003601f168201915b5050505050905091509150915091565b6060600180546101cc90610524565b80601f01602080910402602001604051908101604052809291908181526020018280546101f890610524565b80156102455780601f1061021a57610100808354040283529160200191610245565b820191906000526020600020905b81548152906001019060200180831161022857829003601f168201915b5050505050905090565b600160005461025e91906108e9565b600081905550565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102cd82610284565b810181811067ffffffffffffffff821117156102ec576102eb610295565b5b80604052505050565b60006102ff610266565b905061030b82826102c4565b919050565b600067ffffffffffffffff82111561032b5761032a610295565b5b61033482610284565b9050602081019050919050565b82818337600083830152505050565b600061036361035e84610310565b6102f5565b90508281526020810184848401111561037f5761037e61027f565b5b61038a848285610341565b509392505050565b600082601f8301126103a7576103a661027a565b5b81356103b7848260208601610350565b91505092915050565b6000602082840312156103d6576103d5610270565b5b600082013567ffffffffffffffff8111156103f4576103f3610275565b5b61040084828501610392565b91505092915050565b60008115159050919050565b61041e81610409565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561045e578082015181840152602081019050610443565b60008484015250505050565b600061047582610424565b61047f818561042f565b935061048f818560208601610440565b61049881610284565b840191505092915050565b60006040820190506104b86000830185610415565b81810360208301526104ca818461046a565b90509392505050565b600060208201905081810360008301526104ed818461046a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f5565b5b50919050565b60008190508160005260206000209050919050565b6000815461057781610524565b610581818661042f565b9450600182166000811461059c57600181146105b2576105e5565b60ff1983168652811515602002860193506105e5565b6105bb85610555565b60005b838110156105dd578154818901526001820191506020810190506105be565b808801955050505b50505092915050565b60006040820190508181036000830152610608818561056a565b9050818103602083015261061c818461046a565b90509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026106727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610635565b61067c8683610635565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006106c36106be6106b984610694565b61069e565b610694565b9050919050565b6000819050919050565b6106dd836106a8565b6106f16106e9826106ca565b848454610642565b825550505050565b600090565b6107066106f9565b6107118184846106d4565b505050565b5b818110156107355761072a6000826106fe565b600181019050610717565b5050565b601f82111561077a5761074b81610555565b61075484610625565b81016020851015610763578190505b61077761076f85610625565b830182610716565b50505b505050565b600082821c905092915050565b600061079d6000198460080261077f565b1980831691505092915050565b60006107b6838361078c565b9150826002028217905092915050565b6107cf82610424565b67ffffffffffffffff8111156107e8576107e7610295565b5b6107f28254610524565b6107fd828285610739565b600060209050601f831160018114610830576000841561081e578287015190505b61082885826107aa565b865550610890565b601f19841661083e86610555565b60005b8281101561086657848901518255600182019150602085019450602081019050610841565b86831015610883578489015161087f601f89168261078c565b8355505b6001600288020188555050505b505050505050565b600060208201905081810360008301526108b2818461056a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f482610694565b91506108ff83610694565b9250828201905080821115610917576109166108ba565b5b9291505056fea26469706673582212207e5ba44159ffb37af8e8a9e7c5b6fb5ce81ea195b62ae3ac36288f2cf72c18a764736f6c634300081000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b4d79204772656574696e67000000000000000000000000000000000000000000', + ); + expect(returnFormat).toBe(ETH_DATA_FORMAT); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(BigInt(36916)) as any; + }); + + const deploy = contract.deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }); + + const result = await deploy.estimateGas(sendOptions, ETH_DATA_FORMAT); + expect(result).toStrictEqual(BigInt(36916)); + + spyTx.mockClear(); + spyEstimateGas.mockClear(); + }); + + it('estimateGas should work for contract method', async () => { + const arg = 'Hello'; + + const contract = new Contract(GreeterAbi, { data: GreeterBytecode }); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const spyEstimateGas = jest + .spyOn(eth, 'estimateGas') + .mockImplementationOnce((_objInstance, _tx, _block) => { + expect(_block).toBe('latest'); + expect(_tx.to).toStrictEqual(deployedAddr); + expect(_tx.from).toStrictEqual(sendOptions.from); + expect(_tx.data).toBe( + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000', + ); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(BigInt(36916)) as any; + }); + + const deployedContract = await contract + .deploy({ + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const result = await deployedContract.methods.setGreeting(arg).estimateGas(sendOptions); + expect(result).toStrictEqual(BigInt(36916)); + + spyTx.mockClear(); + spyEstimateGas.mockClear(); + }); + + it('encodeABI should work for contract method', async () => { + const arg = 'Hello'; + + const contract = new Contract(GreeterAbi, { data: GreeterBytecode }); + + const spyTx = jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + + const deployedContract = await contract + .deploy({ + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const result = deployedContract.methods.setGreeting(arg).encodeABI(); + + expect(result).toBe( + '0xa41368620000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000', + ); + + spyTx.mockClear(); + }); + + it('contract method send without contract address should throw error', async () => { + const arg = 'Hello'; + + const contract = new Contract(GreeterAbi); + + await expect(async () => { + await contract.methods.setGreeting(arg).send(sendOptions); + }).rejects.toThrow(new Web3ContractError('Contract address not specified')); + }); + + it('contract method send without from address should throw error', async () => { + const gas = '1000000'; + const sendOptionsSpecial = { gas }; + const arg = 'Hello'; + + const contract = new Contract(GreeterAbi); + contract.options.address = '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2'; + + /* eslint-disable no-useless-escape */ + await expect(async () => { + await contract.methods.setGreeting(arg).send(sendOptionsSpecial); + }).rejects.toThrow('Contract "from" address not specified'); + }); + + it('contract method createAccessList should work', async () => { + const fromAddr: Address = '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426'; + const result: AccessListResult = { + accessList: [ + { + address: deployedAddr, + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + gasUsed: '0x644e', + }; + + const contract = new Contract(GreeterAbi, deployedAddr); + + const spyEthCall = jest + .spyOn(eth, 'createAccessList') + .mockImplementation((_objInstance, _tx) => { + expect(_tx.to).toStrictEqual(deployedAddr); + expect(_tx.data).toBe('0xcfae3217'); + expect(_tx.from).toBe(fromAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(result) as any; // contract class should decode encodedArg + }); + + const res = await contract.methods.greet().createAccessList({ from: fromAddr }); + expect(res).toStrictEqual(result); + + spyEthCall.mockClear(); + }); + + it('contract method createAccessList should work using data with web3config', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { contractDataInputFill: 'data' }, + }); + const fromAddr: Address = '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426'; + const result: AccessListResult = { + accessList: [ + { + address: deployedAddr, + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + gasUsed: '0x644e', + }; + + const contract = new Contract(GreeterAbi, deployedAddr, web3Context); + + const spyEthCall = jest + .spyOn(eth, 'createAccessList') + .mockImplementation((_objInstance, _tx) => { + expect(_tx.to).toStrictEqual(deployedAddr); + expect(_tx.data).toBe('0xcfae3217'); + expect(_tx.from).toBe(fromAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(result) as any; // contract class should decode encodedArg + }); + + const res = await contract.methods.greet().createAccessList({ from: fromAddr }); + expect(res).toStrictEqual(result); + + spyEthCall.mockClear(); + }); + it('contract method createAccessList should work using data with web3config with both input and data', async () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { contractDataInputFill: 'both' }, + }); + const fromAddr: Address = '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426'; + const result: AccessListResult = { + accessList: [ + { + address: deployedAddr, + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + }, + ], + gasUsed: '0x644e', + }; + + const contract = new Contract(GreeterAbi, deployedAddr, web3Context); + + const spyEthCall = jest + .spyOn(eth, 'createAccessList') + .mockImplementation((_objInstance, _tx) => { + expect(_tx.to).toStrictEqual(deployedAddr); + expect(_tx.data).toBe('0xcfae3217'); + expect(_tx.input).toBe('0xcfae3217'); + expect(_tx.from).toBe(fromAddr); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(result) as any; // contract class should decode encodedArg + }); + + const res = await contract.methods.greet().createAccessList({ from: fromAddr }); + expect(res).toStrictEqual(result); + + spyEthCall.mockClear(); + }); + + it('should correctly apply provided Web3Context to new Contract instance', () => { + const expectedProvider = 'http://127.0.0.1:8545'; + const web3Context = new Web3Context({ + provider: expectedProvider, + config: { handleRevert: true, defaultTransactionType: '0x2' }, + }); + const contract = new Contract(GreeterAbi, web3Context); + expect(contract.config).toStrictEqual(web3Context.config); + }); + }); +}); diff --git a/packages/web3-eth-contract/test/unit/contract_typing.test.ts b/packages/web3-eth-contract/test/unit/contract_typing.test.ts new file mode 100644 index 00000000000..e0bc6b9afcb --- /dev/null +++ b/packages/web3-eth-contract/test/unit/contract_typing.test.ts @@ -0,0 +1,120 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable jest/expect-expect */ + +import { expectTypeOf, typecheck } from '@humeris/espresso-shot'; +import { ContractConstructorArgs, Numbers } from 'web3-types'; +import { Contract } from '../../src/contract'; +import { erc20Abi, Erc20Interface } from '../fixtures/erc20'; +import { erc721Abi, Erc721Interface } from '../fixtures/erc721'; +import { NonPayableMethodObject, PayableMethodObject } from '../../src'; + +describe('contract typing', () => { + + describe('no abi type', () => { + const defaultContractInstance = new Contract([]); + // when using new web3.eth.Contract generic is any[] instead of never + const web3ContractInstance = new Contract([]); + + typecheck('should allow any contract init params', () => [ + expectTypeOf>().not.toBe<[]>(), + expectTypeOf>().not.toBe<[]>(), + expectTypeOf>().not.toBe<[]>(), + ]); + + typecheck('should allow any input params', () => [ + expectTypeOf>().toBe(), + expectTypeOf>().toBe(), + ]); + + }) + describe('custom abi', () => { + const abi = [ + { + inputs: [ + { + internalType: 'string', + name: 'tokenId', + type: 'string', + }, + ], + name: 'tokenURI', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + ] as const; + const contractInstance = new Contract(abi); + interface CustomInterface { + methods: { + [key: string]: ( + ...args: ReadonlyArray + ) => + | PayableMethodObject, ReadonlyArray> + | NonPayableMethodObject, ReadonlyArray>; + tokenURI: (tokenId: Numbers) => NonPayableMethodObject<[Numbers], [string]>; + }; + } + + typecheck('should contain all methods', () => + expectTypeOf().toBe< + keyof CustomInterface['methods'] + >(), + ); + }); + describe('erc20', () => { + const contract = new Contract(erc20Abi); + + typecheck('should contain all methods', () => + expectTypeOf().toBe(), + ); + + typecheck('should have interface compliance methods', () => + expectTypeOf(contract.methods).toExtend(), + ); + + typecheck('should have all events', () => + expectTypeOf().toBe(), + ); + + typecheck('should have interface compliance events', () => + expectTypeOf(contract.events).toExtend(), + ); + }); + + describe('erc721', () => { + const contract = new Contract(erc721Abi); + + typecheck('should contain all methods', () => + expectTypeOf().toBe(), + ); + + // TODO: It's not matching types for `safeTransferFrom` because of overloaded method + // typecheck('should have interface compliance methods', () => + // expectTypeOf(contract.methods).toExtend(), + // ); + + typecheck('should have all events', () => + expectTypeOf().toBe(), + ); + + typecheck('should have interface compliance events', () => + expectTypeOf(contract.events).toExtend(), + ); + }); +}); diff --git a/packages/web3-eth-contract/test/unit/encode_event_abi.test.ts b/packages/web3-eth-contract/test/unit/encode_event_abi.test.ts new file mode 100644 index 00000000000..c4353806ba9 --- /dev/null +++ b/packages/web3-eth-contract/test/unit/encode_event_abi.test.ts @@ -0,0 +1,205 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiEventFragment, ContractOptions } from 'web3-types'; +import { encodeEventABI } from '../../src'; + +const contractOptions: ContractOptions = { + address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', +} as ContractOptions; +const abiEventFragment: AbiEventFragment & { signature: string } = { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'string', + name: 'str', + type: 'string', + }, + { + indexed: true, + internalType: 'uint256', + name: 'val', + type: 'uint256', + }, + { + indexed: true, + internalType: 'bool', + name: 'flag', + type: 'bool', + }, + ], + name: 'MultiValueIndexedEventWithStringIndexed', + type: 'event', + signature: '0x5b5730af07e266d8b4845f404beb3b193085c686b0edd8e8e20cd4b3fc2b6cd5', +}; + +describe('encodeEventAbi', () => { + it('should format fromBlock for filter', () => { + const encodedEventFilter = encodeEventABI(contractOptions, abiEventFragment, { + fromBlock: 10, + }); + + expect(encodedEventFilter).toMatchObject({ + fromBlock: '0xa', + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + }); + }); + + it('should format toBlock for filter', () => { + const encodedEventFilter = encodeEventABI(contractOptions, abiEventFragment, { + toBlock: 10, + }); + + expect(encodedEventFilter).toMatchObject({ + toBlock: '0xa', + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + }); + }); + + it('should set topics array for filter to given topics array', () => { + const encodedEventFilter = encodeEventABI(contractOptions, abiEventFragment, { + topics: ['0x3f6d5d7b72c0059e2ecac56fd4adeefb2cff23aa41d13170f78ea6bf81e6e0ca'], + }); + + expect(encodedEventFilter).toMatchObject({ + topics: ['0x3f6d5d7b72c0059e2ecac56fd4adeefb2cff23aa41d13170f78ea6bf81e6e0ca'], + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + }); + }); + + it('should set filter to get all events for address starting at fromBlock', () => { + const encodedEventFilter = encodeEventABI( + contractOptions, + { + anonymous: false, + name: 'ALLEVENTS', + type: 'event', + signature: '0x5b5730af07e266d8b4845f404beb3b193085c686b0edd8e8e20cd4b3fc2b6cd5', + }, + { + fromBlock: 1000, + }, + ); + + expect(encodedEventFilter).toMatchObject({ + fromBlock: '0x3e8', + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + }); + }); + + // This test fails because encoding of a dynamic sized array is not current supported + // Received error: AbiError: Parameter encoding error + it.skip('should set the filter topics to the keccak256 hash of the provided filter value', () => { + const _abiEventFragment: AbiEventFragment & { signature: string } = { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'uint256[]', + name: 'vals', + type: 'uint256[]', + }, + ], + name: 'IndexedArrayEvent', + type: 'event', + signature: '0x71aefd401e4886a78931d42be506247958b9751348fa91aa2f9dbbd557e9208e', + }; + + encodeEventABI(contractOptions, _abiEventFragment, { + filter: { + vals: [1, 2, 3], + }, + }); + }); + + // This test fails because encoding of a dynamic sized array is not current supported + // Received error: AbiError: Parameter encoding error + it.skip('should set the filter topics', () => { + const _abiEventFragment: AbiEventFragment & { signature: string } = { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'uint256[]', + name: 'vals', + type: 'uint256[]', + }, + { + indexed: true, + internalType: 'string[]', + name: 'strs', + type: 'string[]', + }, + { + indexed: true, + internalType: 'bool[]', + name: 'flags', + type: 'bool[]', + }, + ], + name: 'IndexedMultiValArrayEvent', + type: 'event', + signature: '0x9b5a12617e7ca791109ef5e09b8cc23cb4034e0e3dfb4aadac37b55fd28718f6', + }; + + encodeEventABI(contractOptions, _abiEventFragment, { + filter: { + vals: [1, 2, 3], + }, + }); + }); + + it('should filter by the keccak256 of the provided indexed string filter', () => { + const encodedEventFilter = encodeEventABI(contractOptions, abiEventFragment, { + filter: { + str: 'str4', + }, + }); + + expect(encodedEventFilter).toMatchObject({ + topics: [ + '0x5b5730af07e266d8b4845f404beb3b193085c686b0edd8e8e20cd4b3fc2b6cd5', + '0x3f6d5d7b72c0059e2ecac56fd4adeefb2cff23aa41d13170f78ea6bf81e6e0ca', + // eslint-disable-next-line no-null/no-null + null, + // eslint-disable-next-line no-null/no-null + null, + ], + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + }); + }); + + it('should filter by the provided bool filter', () => { + const encodedEventFilter = encodeEventABI(contractOptions, abiEventFragment, { + filter: { + flag: true, + }, + }); + + expect(encodedEventFilter).toMatchObject({ + topics: [ + '0x5b5730af07e266d8b4845f404beb3b193085c686b0edd8e8e20cd4b3fc2b6cd5', + // eslint-disable-next-line no-null/no-null + null, + // eslint-disable-next-line no-null/no-null + null, + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + }); + }); +}); diff --git a/packages/web3-eth-contract/test/unit/jest.config.js b/packages/web3-eth-contract/test/unit/jest.config.js new file mode 100644 index 00000000000..06b5f59117a --- /dev/null +++ b/packages/web3-eth-contract/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-eth-contract-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-eth-contract/test/unit/log_subscription.test.ts b/packages/web3-eth-contract/test/unit/log_subscription.test.ts new file mode 100644 index 00000000000..ccc72acaac6 --- /dev/null +++ b/packages/web3-eth-contract/test/unit/log_subscription.test.ts @@ -0,0 +1,79 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import * as eth from 'web3-eth'; +import { WebSocketProvider } from 'web3-providers-ws'; +import { Contract } from '../../src'; +import { GreeterAbi, GreeterBytecode } from '../shared_fixtures/build/Greeter'; + +jest.mock('web3-eth'); + +describe('contract log subscription', () => { + const contract = new Contract(GreeterAbi); + const sendOptions = { + from: '0x12364916b10Ae90076dDa6dE756EE1395BB69ec2', + gas: '1000000', + }; + const deployedAddr = '0x20bc23D0598b12c34cBDEf1fae439Ba8744DB426'; + const providerString = 'ws://mydomain.com'; + + beforeAll(() => { + jest.spyOn(WebSocketProvider.prototype, 'connect').mockImplementation(() => { + // nothing + }); + jest.spyOn(WebSocketProvider.prototype, 'getStatus').mockImplementation(() => 'connected'); + contract.setProvider(providerString); + + jest.spyOn(eth, 'sendTransaction').mockImplementation(() => { + const newContract = contract.clone(); + newContract.options.address = deployedAddr; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return Promise.resolve(newContract) as any; + }); + }); + + it('Request Manager should call eth_subscribe with correct params', async () => { + const spyRequestManagerSend = jest + .spyOn(contract.requestManager, 'send') + .mockImplementation(async () => { + return 'sub-id'; + }); + + const deployedContract = await contract + .deploy({ + data: GreeterBytecode, + arguments: ['My Greeting'], + }) + .send(sendOptions); + + const topics = ['0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5']; + + deployedContract.events.allEvents({ fromBlock: 'earliest', topics }); + + deployedContract.events.GREETING_CHANGED({ fromBlock: 'earliest', topics }); + + expect(spyRequestManagerSend).toHaveBeenCalledTimes(2); + expect(spyRequestManagerSend).toHaveBeenCalledWith({ + method: 'eth_subscribe', + params: [ + 'logs', + // those params has been generated inside: _buildSubscriptionParams + { address: deployedAddr, topics }, + ], + }); + }); +}); diff --git a/packages/web3-eth-contract/tsconfig.cjs.json b/packages/web3-eth-contract/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-eth-contract/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-eth-contract/tsconfig.esm.json b/packages/web3-eth-contract/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-eth-contract/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-eth-contract/tsconfig.json b/packages/web3-eth-contract/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-eth-contract/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-eth-contract/tsconfig.types.json b/packages/web3-eth-contract/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-eth-contract/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-eth-contract/tsdoc.json b/packages/web3-eth-contract/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-eth-contract/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth-contract/types/index.d.ts b/packages/web3-eth-contract/types/index.d.ts deleted file mode 100644 index 3b8485e7ce9..00000000000 --- a/packages/web3-eth-contract/types/index.d.ts +++ /dev/null @@ -1,175 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {Common, PromiEvent, provider, hardfork, chain, BlockNumber, PastLogsOptions, LogsOptions} from 'web3-core'; -import {AbiItem} from 'web3-utils'; - -// TODO: Add generic type! -export class Contract { - constructor( - jsonInterface: AbiItem[], - address?: string, - options?: ContractOptions - ); - - private _address: string; - private _jsonInterface: AbiItem[]; - defaultAccount: string | null; - defaultBlock: BlockNumber; - defaultCommon: Common; - defaultHardfork: hardfork; - defaultChain: chain; - transactionPollingTimeout: number; - transactionConfirmationBlocks: number; - transactionBlockTimeout: number; - handleRevert: boolean; - - options: Options; - - clone(): Contract; - - deploy(options: DeployOptions): ContractSendMethod; - - methods: any; - - once( - event: string, - callback: (error: Error, event: EventData) => void - ): void; - once( - event: string, - options: EventOptions, - callback: (error: Error, event: EventData) => void - ): void; - - events: any; - - getPastEvents(event: string): Promise; - getPastEvents( - event: string, - options: PastEventOptions, - callback: (error: Error, event: EventData) => void - ): Promise; - getPastEvents(event: string, options: PastEventOptions): Promise; - getPastEvents( - event: string, - callback: (error: Error, event: EventData) => void - ): Promise; -} - -export interface Options extends ContractOptions { - address: string; - jsonInterface: AbiItem[]; -} - -export interface DeployOptions { - data: string; - arguments?: any[]; -} - -export interface ContractSendMethod { - send( - options: SendOptions, - callback?: (err: Error, transactionHash: string) => void - ): PromiEvent; - - call( - options?: CallOptions, - callback?: (err: Error, result: any) => void - ): Promise; - - estimateGas( - options: EstimateGasOptions, - callback?: (err: Error, gas: number) => void - ): Promise; - - estimateGas(callback: (err: Error, gas: number) => void): Promise; - - estimateGas( - options: EstimateGasOptions, - callback: (err: Error, gas: number) => void - ): Promise; - - estimateGas(options: EstimateGasOptions): Promise; - - estimateGas(): Promise; - - encodeABI(): string; -} - -export interface CallOptions { - from?: string; - gasPrice?: string; - gas?: number; -} - -export interface SendOptions { - from: string; - gasPrice?: string; - gas?: number; - value?: number | string | BN; -} - -export interface EstimateGasOptions { - from?: string; - gas?: number; - value?: number | string | BN; -} - -export interface ContractOptions { - // Sender to use for contract calls - from?: string; - // Gas price to use for contract calls - gasPrice?: string; - // Gas to use for contract calls - gas?: number; - // Contract code - data?: string; -} - -export interface PastEventOptions extends PastLogsOptions { - filter?: Filter; -} - -export interface EventOptions extends LogsOptions { - filter?: Filter; -} - -export interface Filter { - [key: string]: number | string | string[] | number[]; -} - -export interface EventData { - returnValues: { - [key: string]: any; - }; - raw: { - data: string; - topics: string[]; - }; - event: string; - signature: string; - logIndex: number; - transactionIndex: number; - transactionHash: string; - blockHash: string; - blockNumber: number; - address: string; -} diff --git a/packages/web3-eth-contract/types/tests/contract-test.ts b/packages/web3-eth-contract/types/tests/contract-test.ts deleted file mode 100644 index 56657810b37..00000000000 --- a/packages/web3-eth-contract/types/tests/contract-test.ts +++ /dev/null @@ -1,174 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file contract-tests.ts - * @author Josh Stevens - * @author Samuel Furter - * @date 2018 - */ - -import { Contract } from 'web3-eth-contract'; - -const contract = new Contract([]); - -// $ExpectType string | null -contract.defaultAccount; - -// $ExpectType BlockNumber -contract.defaultBlock; - -// $ExpectType Common -contract.defaultCommon; - -// $ExpectType hardfork -contract.defaultHardfork; - -// $ExpectType chain -contract.defaultChain; - -// $ExpectType number -contract.transactionPollingTimeout; - -// $ExpectType number -contract.transactionConfirmationBlocks; - -// $ExpectType number -contract.transactionBlockTimeout; - -// $ExpectType boolean -contract.handleRevert; - -// $ExpectType string -contract.options.address; - -// $ExpectType AbiItem[] -contract.options.jsonInterface; - -// $ExpectType string | undefined -contract.options.from; - -// $ExpectType number | undefined -contract.options.gas; - -// $ExpectType string | undefined -contract.options.gasPrice; - -// $ExpectType string | undefined -contract.options.data; - -// $ExpectType Contract -contract.clone(); - -// $ExpectType ContractSendMethod -contract.deploy({ - data: '0x12345...', - arguments: [123, 'My String'] -}); - -// $ExpectType void -contract.once( - 'MyEvent', - { - filter: { - myIndexedParam: [20, 23], - myOtherIndexedParam: '0x123456789...' - }, - fromBlock: 0 - }, - (error, event) => {} -); - -// $ExpectType void -contract.once('MyEvent', (error, event) => {}); - -// $ExpectType Promise -contract.getPastEvents('MyEvent'); - -// $ExpectType Promise -contract.getPastEvents('MyEvent', { - filter: { myIndexedParam: [20, 23], myOtherIndexedParam: '0x123456789...' }, - fromBlock: 0, - toBlock: 'latest' -}); - -// $ExpectType Promise -contract.getPastEvents('MyEvent', {}); - -// $ExpectType Promise -contract.getPastEvents( - 'MyEvent', - { - filter: { - myIndexedParam: [20, 23], - myOtherIndexedParam: '0x123456789...' - }, - fromBlock: 0, - toBlock: 'latest' - }, - (error, events) => {} -); - -// $ExpectType Promise -contract.getPastEvents('MyEvent', (error, events) => {}); - -// $ExpectType Promise -contract - .deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .estimateGas(); - -// $ExpectType Promise -contract - .deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .estimateGas({ from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' }); - -// $ExpectType Promise -contract - .deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .estimateGas((err: Error, gas: number) => {}); - -// $ExpectType string -contract - .deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .encodeABI(); - -// $ExpectType PromiEvent -contract - .deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .send({ from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' }); - -// $ExpectType PromiEvent -contract - .deploy({ - data: '0x12345...', - arguments: [123, 'My String'] - }) - .send( - { from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' }, - (err: Error, transactionHash: string) => {} - ); diff --git a/packages/web3-eth-contract/types/tsconfig.json b/packages/web3-eth-contract/types/tsconfig.json deleted file mode 100644 index 906dd3fd159..00000000000 --- a/packages/web3-eth-contract/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth-contract": ["."] - } - } -} diff --git a/packages/web3-eth-contract/types/tslint.json b/packages/web3-eth-contract/types/tslint.json deleted file mode 100644 index 383b159dc72..00000000000 --- a/packages/web3-eth-contract/types/tslint.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "no-empty-interface": false, - "unified-signatures": false, - "no-redundant-jsdoc": false - } -} diff --git a/packages/web3-eth-ens/.eslintignore b/packages/web3-eth-ens/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-eth-ens/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-ens/.eslintrc.js b/packages/web3-eth-ens/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-eth-ens/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-ens/.gitignore b/packages/web3-eth-ens/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-eth-ens/.npmignore b/packages/web3-eth-ens/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-eth-ens/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-ens/.prettierignore b/packages/web3-eth-ens/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-eth-ens/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-ens/.prettierrc.json b/packages/web3-eth-ens/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-eth-ens/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-eth-ens/CHANGELOG.md b/packages/web3-eth-ens/CHANGELOG.md new file mode 100644 index 00000000000..c0212f7f121 --- /dev/null +++ b/packages/web3-eth-ens/CHANGELOG.md @@ -0,0 +1,156 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Changed + +- `Web3NetAPI` is now imported from `web3-types` instead of `web3-net` (#5441) + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Changed + +- Updated dependencies (#5912) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +### Fixed + +- Bug fix of `checkNetwork` in ENS (#5988) + +## [4.0.1-rc.2] + +### Removed + +- Removed non read-only methods (#6084) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Fixed + +- Fixed bug #6185, now web3.js compiles on typescript v5 (#6195) + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Changed + +- Dependencies updated + +## [4.0.7] + +### Changed + +- Dependencies updated + +## [4.0.8] + +### Changed + +- Dependencies updated + +## [4.1.0] + +### Added + +- Added function `setAddress` in ENS and Resolver classes (#5956) + +## [4.2.0] + +### Add + +- Added function getText and getName in ENS and resolver classes (#6914) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-eth-ens/README.md b/packages/web3-eth-ens/README.md index b96d2b458b4..ea4f306a767 100644 --- a/packages/web3-eth-ens/README.md +++ b/packages/web3-eth-ens/README.md @@ -1,41 +1,59 @@ -# web3-eth-ens +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - ENS -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This is the contract package to be used in the `web3-eth` package. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-eth-ens` This package has ENS functions for interacting with Ethereum Name Service. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-eth-ens) or using [Yarn](https://yarnpkg.com/package/web3-eth-ens) + +### Using NPM ```bash npm install web3-eth-ens ``` -## Usage +### Using Yarn -```js -const eth = new Web3Eth(web3.currentProvider); -const ens = new EthEns(eth); - -ens.getAddress('ethereum.eth').then(function(result) { - console.log(result); -}); +```bash +yarn add web3-eth-ens ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-eth-ens.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-eth-ens +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-ens%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-eth-ens -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-eth-ens -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-eth-ens -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-eth-ens -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-eth-ens \ No newline at end of file +[downloads-image]: https://img.shields.io/npm/dm/web3-eth-ens?label=npm%20downloads diff --git a/packages/web3-eth-ens/assets/logo/web3js.ai b/packages/web3-eth-ens/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth-ens/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth-ens/assets/logo/web3js.jpg b/packages/web3-eth-ens/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth-ens/assets/logo/web3js.jpg differ diff --git a/packages/web3-eth-ens/assets/logo/web3js.svg b/packages/web3-eth-ens/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth-ens/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth-ens/package-lock.json b/packages/web3-eth-ens/package-lock.json deleted file mode 100644 index a75c113fde8..00000000000 --- a/packages/web3-eth-ens/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-eth-ens", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-eth-ens/package.json b/packages/web3-eth-ens/package.json index 7da40c41877..994f4427741 100644 --- a/packages/web3-eth-ens/package.json +++ b/packages/web3-eth-ens/package.json @@ -1,31 +1,71 @@ { - "name": "web3-eth-ens", - "version": "1.3.0", - "description": "ENS support for web3.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth-ens", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-promievent": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-eth-ens", + "version": "4.2.0", + "description": "This package has ENS functions for interacting with Ethereum Name Service.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js", + "ens:download:registry": "curl -L -o test/fixtures/ens/registry.json 'https://api.etherscan.io/api?module=contract&action=getabi&address=0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'", + "ens:download:reverse_registrar": "curl -L -o test/fixtures/ens/reverse_registrar.json 'https://api.etherscan.io/api?module=contract&action=getabi&address=0x084b1c3c81545d370f3634392de611caabff8148'" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "@adraffy/ens-normalize": "^1.8.8", + "web3-core": "^4.3.2", + "web3-errors": "^1.1.4", + "web3-eth": "^4.5.0", + "web3-eth-contract": "^4.3.0", + "web3-net": "^4.0.7", + "web3-types": "^1.5.0", + "web3-utils": "^4.2.2", + "web3-validator": "^2.0.5" + } } diff --git a/packages/web3-eth-ens/src/ENS.js b/packages/web3-eth-ens/src/ENS.js deleted file mode 100644 index 604df14329d..00000000000 --- a/packages/web3-eth-ens/src/ENS.js +++ /dev/null @@ -1,538 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file ENS.js - * - * @author Samuel Furter - * @date 2018 - */ - -"use strict"; - -var _ = require('underscore'); -var config = require('./config'); -var formatters = require('web3-core-helpers').formatters; -var utils = require('web3-utils'); -var Registry = require('./contracts/Registry'); -var ResolverMethodHandler = require('./lib/ResolverMethodHandler'); -var contenthash = require('./lib/contentHash'); - -/** - * Constructs a new instance of ENS - * - * @param {Eth} eth - * - * @constructor - */ -function ENS(eth) { - this.eth = eth; - var registryAddress = null; - this._detectedAddress = null; - this._lastSyncCheck = null; - - Object.defineProperty(this, 'registry', { - get: function () { - return new Registry(this); - }, - enumerable: true - }); - - Object.defineProperty(this, 'resolverMethodHandler', { - get: function () { - return new ResolverMethodHandler(this.registry); - }, - enumerable: true - }); - - Object.defineProperty(this, 'registryAddress', { - get: function () { - return registryAddress; - }, - set: function (value) { - if (value === null) { - registryAddress = value; - - return; - } - - registryAddress = formatters.inputAddressFormatter(value); - }, - enumerable: true - }); -} - -/** - * Returns true if the given interfaceId is supported and otherwise false. - * - * @method supportsInterface - * - * @param {string} name - * @param {string} interfaceId - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -ENS.prototype.supportsInterface = function (name, interfaceId, callback) { - return this.getResolver(name).then(function (resolver) { - if (!utils.isHexStrict(interfaceId)) { - interfaceId = utils.sha3(interfaceId).slice(0,10); - } - - return resolver.methods.supportsInterface(interfaceId).call(callback); - }).catch(function(error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - throw error; - }); -}; - -/** - * Returns the Resolver by the given address - * - * @deprecated Please use the "getResolver" method instead of "resolver" - * - * @method resolver - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -ENS.prototype.resolver = function (name, callback) { - return this.registry.resolver(name, callback); -}; - -/** - * Returns the Resolver by the given address - * - * @method getResolver - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -ENS.prototype.getResolver = function (name, callback) { - return this.registry.getResolver(name, callback); -}; - -/** - * Does set the resolver of the given name - * - * @method setResolver - * - * @param {string} name - * @param {string} address - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setResolver = function (name, address, txConfig, callback) { - return this.registry.setResolver(name, address, txConfig, callback); -}; - -/** - * Sets the owner, resolver, and TTL for an ENS record in a single operation. - * - * @method setRecord - * - * @param {string} name - * @param {string} owner - * @param {string} resolver - * @param {string | number} ttl - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setRecord = function (name, owner, resolver, ttl, txConfig, callback) { - return this.registry.setRecord(name, owner, resolver, ttl, txConfig, callback); -}; - -/** - * Sets the owner, resolver and TTL for a subdomain, creating it if necessary. - * - * @method setSubnodeRecord - * - * @param {string} name - * @param {string} label - * @param {string} owner - * @param {string} resolver - * @param {string | number} ttl - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setSubnodeRecord = function (name, label, owner, resolver, ttl, txConfig, callback) { - return this.registry.setSubnodeRecord(name, label, owner, resolver, ttl, txConfig, callback); -}; - -/** - * Sets or clears an approval by the given operator. - * - * @method setApprovalForAll - * - * @param {string} operator - * @param {boolean} approved - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setApprovalForAll = function (operator, approved, txConfig, callback) { - return this.registry.setApprovalForAll(operator, approved, txConfig, callback); -}; - -/** - * Returns true if the operator is approved - * - * @method isApprovedForAll - * - * @param {string} owner - * @param {string} operator - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -ENS.prototype.isApprovedForAll = function (owner, operator, callback) { - return this.registry.isApprovedForAll(owner, operator, callback); -}; - -/** - * Returns true if the record exists - * - * @method recordExists - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -ENS.prototype.recordExists = function (name, callback) { - return this.registry.recordExists(name, callback); -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method setSubnodeOwner - * - * @param {string} name - * @param {string} label - * @param {string} address - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setSubnodeOwner = function (name, label, address, txConfig, callback) { - return this.registry.setSubnodeOwner(name, label, address, txConfig, callback); -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method getTTL - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.getTTL = function (name, callback) { - return this.registry.getTTL(name, callback); -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method setTTL - * - * @param {string} name - * @param {number} ttl - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setTTL = function (name, ttl, txConfig, callback) { - return this.registry.setTTL(name, ttl, txConfig, callback); -}; - -/** - * Returns the owner by the given name and current configured or detected Registry - * - * @method getOwner - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.getOwner = function (name, callback) { - return this.registry.getOwner(name, callback); -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method setOwner - * - * @param {string} name - * @param {string} address - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setOwner = function (name, address, txConfig, callback) { - return this.registry.setOwner(name, address, txConfig, callback); -}; - -/** - * Returns the address record associated with a name. - * - * @method getAddress - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.getAddress = function (name, callback) { - return this.resolverMethodHandler.method(name, 'addr', []).call(callback); -}; - -/** - * Sets a new address - * - * @method setAddress - * - * @param {string} name - * @param {string} address - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setAddress = function (name, address, txConfig, callback) { - return this.resolverMethodHandler.method(name, 'setAddr', [address]).send(txConfig, callback); -}; - -/** - * Returns the public key - * - * @method getPubkey - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.getPubkey = function (name, callback) { - return this.resolverMethodHandler.method(name, 'pubkey', [], null, callback).call(callback); -}; - -/** - * Set the new public key - * - * @method setPubkey - * - * @param {string} name - * @param {string} x - * @param {string} y - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setPubkey = function (name, x, y, txConfig, callback) { - return this.resolverMethodHandler.method(name, 'setPubkey', [x, y]).send(txConfig, callback); -}; - -/** - * Returns the content - * - * @method getContent - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.getContent = function (name, callback) { - return this.resolverMethodHandler.method(name, 'content', []).call(callback); -}; - -/** - * Set the content - * - * @method setContent - * - * @param {string} name - * @param {string} hash - * @param {function} callback - * @param {TransactionConfig} txConfig - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setContent = function (name, hash, txConfig, callback) { - return this.resolverMethodHandler.method(name, 'setContent', [hash]).send(txConfig, callback); -}; - -/** - * Returns the contenthash - * - * @method getContenthash - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.getContenthash = function (name, callback) { - return this.resolverMethodHandler.method(name, 'contenthash', [], contenthash.decode).call(callback); -}; - -/** - * Set the contenthash - * - * @method setContent - * - * @param {string} name - * @param {string} hash - * @param {function} callback - * @param {TransactionConfig} txConfig - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setContenthash = function (name, hash, txConfig, callback) { - var encoded; - try { - encoded = contenthash.encode(hash); - } catch(err){ - var error = new Error('Could not encode ' + hash + '. See docs for supported hash protocols.'); - - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - throw error; - } - return this.resolverMethodHandler.method(name, 'setContenthash', [encoded]).send(txConfig, callback); -}; - -/** - * Get the multihash - * - * @method getMultihash - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.getMultihash = function (name, callback) { - return this.resolverMethodHandler.method(name, 'multihash', []).call(callback); -}; - -/** - * Set the multihash - * - * @method setMultihash - * - * @param {string} name - * @param {string} hash - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -ENS.prototype.setMultihash = function (name, hash, txConfig, callback) { - return this.resolverMethodHandler.method(name, 'multihash', [hash]).send(txConfig, callback); -}; - -/** - * Checks if the current used network is synced and looks for ENS support there. - * Throws an error if not. - * - * @returns {Promise} - */ -ENS.prototype.checkNetwork = async function () { - var now = new Date() / 1000; - - if (!this._lastSyncCheck || (now - this._lastSyncCheck) > 3600) { - var block = await this.eth.getBlock('latest'); - var headAge = now - block.timestamp; - - if (headAge > 3600) { - throw new Error("Network not synced; last block was " + headAge + " seconds ago"); - } - - this._lastSyncCheck = now; - } - - if (this.registryAddress) { - return this.registryAddress; - } - - if (!this._detectedAddress) { - var networkType = await this.eth.net.getNetworkType(); - var addr = config.addresses[networkType]; - - if (typeof addr === 'undefined') { - throw new Error("ENS is not supported on network " + networkType); - } - - this._detectedAddress = addr; - - return this._detectedAddress; - } - - return this._detectedAddress; -}; - -module.exports = ENS; diff --git a/packages/web3-eth-ens/src/abi/ens/ENSRegistry.ts b/packages/web3-eth-ens/src/abi/ens/ENSRegistry.ts new file mode 100644 index 00000000000..bcac4c53170 --- /dev/null +++ b/packages/web3-eth-ens/src/abi/ens/ENSRegistry.ts @@ -0,0 +1,183 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// https://github.com/ensdomains/ens-contracts/blob/master/contracts/registry/ENSRegistry.sol +export const ENSRegistryAbi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'label', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'NewOwner', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'resolver', + type: 'address', + }, + ], + name: 'NewResolver', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + ], + name: 'isApprovedForAll', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'owner', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'recordExists', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'resolver', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'ttl', + outputs: [ + { + internalType: 'uint64', + name: '', + type: 'uint64', + }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const; diff --git a/packages/web3-eth-ens/src/abi/ens/PublicResolver.ts b/packages/web3-eth-ens/src/abi/ens/PublicResolver.ts new file mode 100644 index 00000000000..b9dba8a249c --- /dev/null +++ b/packages/web3-eth-ens/src/abi/ens/PublicResolver.ts @@ -0,0 +1,611 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// https://github.com/ensdomains/ens-contracts/blob/master/contracts/resolvers/PublicResolver.sol +export const PublicResolverAbi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'a', + type: 'address', + }, + ], + name: 'AddrChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'uint256', + name: 'coinType', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bytes', + name: 'newAddress', + type: 'bytes', + }, + ], + name: 'AddressChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + indexed: false, + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'hash', + type: 'bytes', + }, + ], + name: 'ContenthashChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'name', + type: 'bytes', + }, + { + indexed: false, + internalType: 'uint16', + name: 'resource', + type: 'uint16', + }, + { + indexed: false, + internalType: 'bytes', + name: 'record', + type: 'bytes', + }, + ], + name: 'DNSRecordChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'name', + type: 'bytes', + }, + { + indexed: false, + internalType: 'uint16', + name: 'resource', + type: 'uint16', + }, + ], + name: 'DNSRecordDeleted', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'DNSZoneCleared', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'lastzonehash', + type: 'bytes', + }, + { + indexed: false, + internalType: 'bytes', + name: 'zonehash', + type: 'bytes', + }, + ], + name: 'DNSZonehashChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes4', + name: 'interfaceID', + type: 'bytes4', + }, + { + indexed: false, + internalType: 'address', + name: 'implementer', + type: 'address', + }, + ], + name: 'InterfaceChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'string', + name: 'name', + type: 'string', + }, + ], + name: 'NameChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes32', + name: 'x', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes32', + name: 'y', + type: 'bytes32', + }, + ], + name: 'PubkeyChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'string', + name: 'indexedKey', + type: 'string', + }, + { + indexed: false, + internalType: 'string', + name: 'key', + type: 'string', + }, + ], + name: 'TextChanged', + type: 'event', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'contentTypes', + type: 'uint256', + }, + ], + name: 'ABI', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'addr', + outputs: [ + { + internalType: 'address payable', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'coinType', + type: 'uint256', + }, + ], + name: 'addr', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'contenthash', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'name', + type: 'bytes32', + }, + { + internalType: 'uint16', + name: 'resource', + type: 'uint16', + }, + ], + name: 'dnsRecord', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'name', + type: 'bytes32', + }, + ], + name: 'hasDNSRecords', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes4', + name: 'interfaceID', + type: 'bytes4', + }, + ], + name: 'interfaceImplementer', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + ], + name: 'isApprovedForAll', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'pubkey', + outputs: [ + { + internalType: 'bytes32', + name: 'x', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'y', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'interfaceID', + type: 'bytes4', + }, + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'string', + name: 'key', + type: 'string', + }, + ], + name: 'text', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'zonehash', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'a', + type: 'address', + }, + ], + name: 'setAddr', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; diff --git a/packages/web3-eth-ens/src/config.js b/packages/web3-eth-ens/src/config.js deleted file mode 100644 index b12e5f5b717..00000000000 --- a/packages/web3-eth-ens/src/config.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file config.js - * - * @author Samuel Furter - * @date 2017 - */ - -"use strict"; - -/** - * Source: https://docs.ens.domains/ens-deployments - * - * @type {{addresses: {main: string, rinkeby: string, goerli: string, ropsten: string}}} - */ -var config = { - addresses: { - main: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", - ropsten: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", - rinkeby: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", - goerli: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e" - }, - // These ids obtained at ensdomains docs: - // https://docs.ens.domains/contract-developer-guide/writing-a-resolver - interfaceIds: { - addr: "0x3b3b57de", - setAddr: "0x3b3b57de", - pubkey: "0xc8690233", - setPubkey: "0xc8690233", - contenthash: "0xbc1c58d1", - setContenthash: "0xbc1c58d1", - content: "0xd8389dc5", - setContent: "0xd8389dc5" - } -}; - -module.exports = config; diff --git a/packages/web3-eth-ens/src/config.ts b/packages/web3-eth-ens/src/config.ts new file mode 100644 index 00000000000..e9f746305c4 --- /dev/null +++ b/packages/web3-eth-ens/src/config.ts @@ -0,0 +1,56 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// +/** + * An object holding the interface Ids of the ENS resolver contracts. Please see [how to write a resolver](https://docs.ens.domains/contract-developer-guide/writing-a-resolver). + */ +export const interfaceIds: { [T: string]: string } = { + addr: '0x3b3b57de', + name: '0x691f3431', + abi: '0x2203ab56', + pubkey: '0xc8690233', + text: '0x59d1d43c', + contenthash: '0xbc1c58d1', +}; + +/** + * An object holding the functions that are supported by the ENS resolver contracts/interfaces. + */ +export const methodsInInterface: { [T: string]: string } = { + setAddr: 'addr', + addr: 'addr', + setPubkey: 'pubkey', + pubkey: 'pubkey', + setContenthash: 'contenthash', + contenthash: 'contenthash', + text: 'text', + name: 'name', +}; + +/** + * An object holding the addressed of the ENS registries on the different networks (mainnet, goerli). + */ +export const registryAddresses: { [T: string]: string } = { + main: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + goerli: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', +}; + +export const networkIds: { [T: string]: string } = { + '0x1': 'main', + '0x5': 'goerli', +}; diff --git a/packages/web3-eth-ens/src/contracts/Registry.js b/packages/web3-eth-ens/src/contracts/Registry.js deleted file mode 100644 index d0119e09d75..00000000000 --- a/packages/web3-eth-ens/src/contracts/Registry.js +++ /dev/null @@ -1,593 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file Registry.js - * - * @author Samuel Furter - * @date 2018 - */ - -"use strict"; - -var _ = require('underscore'); -var Contract = require('web3-eth-contract'); -var namehash = require('eth-ens-namehash'); -var PromiEvent = require('web3-core-promievent'); -var formatters = require('web3-core-helpers').formatters; -var utils = require('web3-utils'); -var REGISTRY_ABI = require('../resources/ABI/Registry'); -var RESOLVER_ABI = require('../resources/ABI/Resolver'); - - -/** - * A wrapper around the ENS registry contract. - * - * @method Registry - * @param {Ens} ens - * @constructor - */ -function Registry(ens) { - var self = this; - this.ens = ens; - this.contract = ens.checkNetwork().then(function (address) { - var contract = new Contract(REGISTRY_ABI, address); - contract.setProvider(self.ens.eth.currentProvider); - - return contract; - }); -} - -/** - * Returns the address of the owner of an ENS name. - * - * @deprecated Please use the "getOwner" method instead of "owner" - * - * @method owner - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -Registry.prototype.owner = function (name, callback) { - console.warn('Deprecated: Please use the "getOwner" method instead of "owner".'); - - return this.getOwner(name, callback); -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method getOwner - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -Registry.prototype.getOwner = function (name, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.owner(namehash.hash(name)).call(); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method setOwner - * - * @param {string} name - * @param {string} address - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -Registry.prototype.setOwner = function (name, address, txConfig, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.setOwner(namehash.hash(name), formatters.inputAddressFormatter(address)).send(txConfig); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Returns the TTL of the given node by his name - * - * @method getTTL - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returnss {Promise} - */ -Registry.prototype.getTTL = function (name, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.ttl(namehash.hash(name)).call(); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method setTTL - * - * @param {string} name - * @param {number} ttl - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -Registry.prototype.setTTL = function (name, ttl, txConfig, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.setTTL(namehash.hash(name), ttl).send(txConfig); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method setSubnodeOwner - * - * @param {string} name - * @param {string} label - * @param {string} address - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -Registry.prototype.setSubnodeOwner = function (name, label, address, txConfig, callback) { - var promiEvent = new PromiEvent(true); - - if (!utils.isHexStrict(label)) { - label = utils.sha3(label); - } - - this.contract.then(function (contract) { - return contract.methods.setSubnodeOwner( - namehash.hash(name), - label, - formatters.inputAddressFormatter(address) - ).send(txConfig); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Sets the owner, resolver, and TTL for an ENS record in a single operation. - * - * @method setRecord - * - * @param {string} name - * @param {string} owner - * @param {string} resolver - * @param {string | number} ttl - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -Registry.prototype.setRecord = function (name, owner, resolver, ttl, txConfig, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.setRecord( - namehash.hash(name), - formatters.inputAddressFormatter(owner), - formatters.inputAddressFormatter(resolver), - ttl - ).send(txConfig); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Sets the owner, resolver and TTL for a subdomain, creating it if necessary. - * - * @method setSubnodeRecord - * - * @param {string} name - * @param {string} label - * @param {string} owner - * @param {string} resolver - * @param {string | number} ttl - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -Registry.prototype.setSubnodeRecord = function (name, label, owner, resolver, ttl, txConfig, callback) { - var promiEvent = new PromiEvent(true); - - if (!utils.isHexStrict(label)) { - label = utils.sha3(label); - } - - this.contract.then(function (contract) { - return contract.methods.setSubnodeRecord( - namehash.hash(name), - label, - formatters.inputAddressFormatter(owner), - formatters.inputAddressFormatter(resolver), - ttl - ).send(txConfig); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Sets or clears an approval by the given operator. - * - * @method setApprovalForAll - * - * @param {string} operator - * @param {boolean} approved - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -Registry.prototype.setApprovalForAll = function (operator, approved, txConfig, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.setApprovalForAll(formatters.inputAddressFormatter(operator), approved).send(txConfig); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Returns true if the operator is approved - * - * @method isApprovedForAll - * - * @param {string} owner - * @param {string} operator - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -Registry.prototype.isApprovedForAll = function (owner, operator, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.isApprovedForAll( - formatters.inputAddressFormatter(owner), - formatters.inputAddressFormatter(operator) - ).call(); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Returns true if the record exists - * - * @method recordExists - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -Registry.prototype.recordExists = function (name, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.recordExists(namehash.hash(name)).call(); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Returns the resolver contract associated with a name. - * - * @deprecated Please use the "getResolver" method instead of "resolver" - * - * @method resolver - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -Registry.prototype.resolver = function (name, callback) { - console.warn('Deprecated: Please use the "getResolver" method instead of "resolver".'); - - return this.getResolver(name, callback); -}; - -/** - * Returns the resolver contract associated with a name. - * - * @method getResolver - * - * @param {string} name - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {Promise} - */ -Registry.prototype.getResolver = function (name, callback) { - var self = this; - - return this.contract.then(function (contract) { - return contract.methods.resolver(namehash.hash(name)).call(); - }).then(function (address) { - var contract = new Contract(RESOLVER_ABI, address); - contract.setProvider(self.ens.eth.currentProvider); - - if (_.isFunction(callback)) { - // It's required to pass the contract to the first argument to be backward compatible and to have the required consistency - callback(contract, contract); - - return; - } - - return contract; - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - throw error; - }); -}; - -/** - * Returns the address of the owner of an ENS name. - * - * @method setResolver - * - * @param {string} name - * @param {string} address - * @param {TransactionConfig} txConfig - * @param {function} callback - * - * @callback callback callback(error, result) - * @returns {PromiEvent} - */ -Registry.prototype.setResolver = function (name, address, txConfig, callback) { - var promiEvent = new PromiEvent(true); - - this.contract.then(function (contract) { - return contract.methods.setResolver(namehash.hash(name), formatters.inputAddressFormatter(address)).send(txConfig); - }).then(function (receipt) { - if (_.isFunction(callback)) { - // It's required to pass the receipt to the first argument to be backward compatible and to have the required consistency - callback(receipt, receipt); - - return; - } - - promiEvent.resolve(receipt); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -module.exports = Registry; diff --git a/packages/web3-eth-ens/src/ens.ts b/packages/web3-eth-ens/src/ens.ts new file mode 100644 index 00000000000..88d6ae58c83 --- /dev/null +++ b/packages/web3-eth-ens/src/ens.ts @@ -0,0 +1,302 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context, Web3ContextObject } from 'web3-core'; +import { ENSNetworkNotSyncedError, ENSUnsupportedNetworkError, RevertInstructionError } from 'web3-errors'; +import { isSyncing } from 'web3-eth'; +import { Contract } from 'web3-eth-contract'; +import { getId } from 'web3-net'; +import { + Address, + DEFAULT_RETURN_FORMAT, + EthExecutionAPI, + FMT_NUMBER, + PayableCallOptions, + SupportedProviders, + TransactionReceipt, + Web3NetAPI, +} from 'web3-types'; +import { PublicResolverAbi } from './abi/ens/PublicResolver.js'; +import { networkIds, registryAddresses } from './config.js'; +import { Registry } from './registry.js'; +import { Resolver } from './resolver.js'; + +/** + * This class is designed to interact with the ENS system on the Ethereum blockchain. +* For using ENS package, first install Web3 package using: `npm i web3` or `yarn add web3` based on your package manager, after that ENS features can be used as mentioned in following snippet. +* ```ts +* +* import { Web3 } from 'web3'; +* +* const web3 = new Web3('https://127.0.0.1:4545'); +* +* console.log(await web3.eth.ens.getAddress('ethereum.eth')) +* ``` +* For using individual package install `web3-eth-ens` packages using: `npm i web3-eth-ens` or `yarn add web3-eth-ens`. This is more efficient approach for building lightweight applications. +* +* ```ts +*import { ENS } from 'web3-eth-ens'; +* +* const ens = new ENS(undefined,'https://127.0.0.1:4545'); +* +* console.log(await ens.getAddress('vitalik.eth')); +* ``` +*/ +export class ENS extends Web3Context { + /** + * The registryAddress property can be used to define a custom registry address when you are connected to an unknown chain. It defaults to the main registry address. + */ + public registryAddress: string; + private readonly _registry: Registry; + private readonly _resolver: Resolver; + private _detectedAddress?: string; + private _lastSyncCheck?: number; + + /** + * Use to create an instance of ENS + * @param registryAddr - (Optional) The address of the ENS registry (default: mainnet registry address) + * @param provider - (Optional) The provider to use for the ENS instance + * @example + * ```ts + * const ens = new ENS( + * "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + * "http://localhost:8545" + * ); + * + * console.log( ens.defaultChain); + * > mainnet + * ``` + */ + public constructor( + registryAddr?: string, + provider?: + | SupportedProviders + | Web3ContextObject + | string, + ) { + super(provider ?? ''); + this.registryAddress = registryAddr ?? registryAddresses.main; // will default to main registry address + this._registry = new Registry(this.getContextObject(), registryAddr); + this._resolver = new Resolver(this._registry); + } + + /** + * Returns the Resolver by the given address + * @param name - The name of the ENS domain + * @returns - An contract instance of the resolver + * + * @example + * ```ts + * const resolver = await ens.getResolver('resolver'); + * + * console.log(resolver.options.address); + * > '0x1234567890123456789012345678901234567890' + * ``` + */ + public async getResolver(name: string): Promise> { + return this._registry.getResolver(name); + } + + /** + * Returns true if the record exists + * @param name - The ENS name + * @returns - Returns `true` if node exists in this ENS registry. This will return `false` for records that are in the legacy ENS registry but have not yet been migrated to the new one. + * @example + * ```ts + * const exists = await web3.eth.ens.recordExists('ethereum.eth'); + * ``` + */ + public async recordExists(name: string): Promise { + return this._registry.recordExists(name); + } + + /** + * Returns the caching TTL (time-to-live) of an ENS name. + * @param name - The ENS name + * @returns - Returns the caching TTL (time-to-live) of a name. + * @example + * ```ts + * const owner = await web3.eth.ens.getTTL('ethereum.eth'); + * ``` + */ + public async getTTL(name: string): Promise { + return this._registry.getTTL(name); + } + + /** + * Returns the owner by the given name and current configured or detected Registry + * @param name - The ENS name + * @returns - Returns the address of the owner of the name. + * @example + * ```ts + * const owner = await web3.eth.ens.getOwner('ethereum.eth'); + * ``` + */ + public async getOwner(name: string): Promise { + return this._registry.getOwner(name); + } + + /** + * Resolves an ENS name to an Ethereum address. + * @param ENSName - The ENS name to resolve + * @param coinType - (Optional) The coin type, defaults to 60 (ETH) + * @returns - The Ethereum address of the given name + * ```ts + * const address = await web3.eth.ens.getAddress('ethereum.eth'); + * console.log(address); + * > '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359' + * ``` + */ + public async getAddress(ENSName: string, coinType = 60) { + return this._resolver.getAddress(ENSName, coinType); + } + + /** + * ERC-634 - Returns the text content stored in the resolver for the specified key. + * @param ENSName - The ENS name to resolve + * @param key - The key to resolve https://github.com/ethereum/ercs/blob/master/ERCS/erc-634.md#global-keys + * @returns - The value content stored in the resolver for the specified key + */ + public async getText(ENSName: string, key: string): Promise { + return this._resolver.getText(ENSName, key); + } + + + /** + * Resolves the name of an ENS node. + * @param ENSName - The node to resolve + * @returns - The name + */ + public async getName(ENSName: string): Promise { + return this._resolver.getName(ENSName); + } + + /** + * Returns the X and Y coordinates of the curve point for the public key. + * @param ENSName - The ENS name + * @returns - The X and Y coordinates of the curve point for the public key + * @example + * ```ts + * const key = await web3.eth.ens.getPubkey('ethereum.eth'); + * console.log(key); + * > { + * "0": "0x0000000000000000000000000000000000000000000000000000000000000000", + * "1": "0x0000000000000000000000000000000000000000000000000000000000000000", + * "x": "0x0000000000000000000000000000000000000000000000000000000000000000", + * "y": "0x0000000000000000000000000000000000000000000000000000000000000000" + * } + * ``` + */ + public async getPubkey(ENSName: string) { + return this._resolver.getPubkey(ENSName); + } + + /** + * Returns the content hash object associated with an ENS node. + * @param ENSName - The ENS name + * @returns - The content hash object associated with an ENS node + * @example + * ```ts + * const hash = await web3.eth.ens.getContenthash('ethereum.eth'); + * console.log(hash); + * > 'QmaEBknbGT4bTQiQoe2VNgBJbRfygQGktnaW5TbuKixjYL' + * ``` + */ + public async getContenthash(ENSName: string) { + return this._resolver.getContenthash(ENSName); + } + + /** + * Checks if the current used network is synced and looks for ENS support there. + * Throws an error if not. + * @returns - The address of the ENS registry if the network has been detected successfully + * @example + * ```ts + * console.log(await web3.eth.ens.checkNetwork()); + * > '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e' + * ``` + */ + public async checkNetwork() { + const now = Date.now() / 1000; + if (!this._lastSyncCheck || now - this._lastSyncCheck > 3600) { + const syncInfo = await isSyncing(this); + + if (!(typeof syncInfo === 'boolean' && !syncInfo)) { + throw new ENSNetworkNotSyncedError(); + } + + this._lastSyncCheck = now; + } + + if (this._detectedAddress) { + return this._detectedAddress; + } + const networkType = await getId(this, { + ...DEFAULT_RETURN_FORMAT, + number: FMT_NUMBER.HEX, + }); // get the network from provider + const addr = registryAddresses[networkIds[networkType]]; + + if (typeof addr === 'undefined') { + throw new ENSUnsupportedNetworkError(networkType); + } + + this._detectedAddress = addr; + return this._detectedAddress; + } + + /** + * Returns true if the related Resolver does support the given signature or interfaceId. + * @param ENSName - The ENS name + * @param interfaceId - The signature of the function or the interfaceId as described in the ENS documentation + * @returns - `true` if the related Resolver does support the given signature or interfaceId. + * @example + * ```ts + * const supports = await web3.eth.ens.supportsInterface('ethereum.eth', 'addr(bytes32'); + * console.log(supports); + * > true + * ``` + */ + public async supportsInterface(ENSName: string, interfaceId: string) { + return this._resolver.supportsInterface(ENSName, interfaceId); + } + + /** + * @returns - Returns all events that can be emitted by the ENS registry. + */ + public get events() { + return this._registry.events; + } + + /** + * Sets the address of an ENS name in his resolver. + * @param name - The ENS name + * @param address - The address to set + * @param txConfig - (Optional) The transaction config + * @returns - The transaction receipt + * ```ts + * const receipt = await ens.setAddress('web3js.eth','0xe2597eb05cf9a87eb1309e86750c903ec38e527e'); + *``` + */ + public async setAddress( + name: string, + address: Address, + txConfig: PayableCallOptions + ): Promise { + return this._resolver.setAddress(name, address, txConfig); + } +} diff --git a/packages/web3-eth-ens/src/index.js b/packages/web3-eth-ens/src/index.js deleted file mode 100644 index cb39092a827..00000000000 --- a/packages/web3-eth-ens/src/index.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * - * @author Samuel Furter - * @date 2018 - */ - -"use strict"; - -var ENS = require('./ENS'); - -module.exports = ENS; diff --git a/packages/web3-eth-ens/src/index.ts b/packages/web3-eth-ens/src/index.ts new file mode 100644 index 00000000000..b57e6714f20 --- /dev/null +++ b/packages/web3-eth-ens/src/index.ts @@ -0,0 +1,34 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The `web3.eth.ens` functions let you interact with ENS. We recommend reading the [ENS documentation](https://docs.ens.domains/) to get deeper insights about the internals of the name service. + * + * ## Breaking Changes + * + * - All the API level interfaces returning or accepting `null` in 1.x, use `undefined` in 4.x. + * - Functions don't accept a callback anymore. + * - Functions that accepted an optional `TransactionConfig` as the last argument, now accept an optional `NonPayableCallOptions`. See `web3-eth-contract` package for more details. + * - Removed all non-read methods. If you need modifing resolver or registry, please use https://www.npmjs.com/package/@ensdomains/ensjs + */ +/** + * This comment _supports3_ [Markdown](https://marked.js.org/) + */ +import { registryAddresses } from './config.js'; + +export * from './ens.js'; +export { registryAddresses }; diff --git a/packages/web3-eth-ens/src/lib/ResolverMethodHandler.js b/packages/web3-eth-ens/src/lib/ResolverMethodHandler.js deleted file mode 100644 index a07d8e89fe4..00000000000 --- a/packages/web3-eth-ens/src/lib/ResolverMethodHandler.js +++ /dev/null @@ -1,254 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file ResolverMethodHandler.js - * - * @author Samuel Furter - * @date 2018 - */ - -"use strict"; - -var PromiEvent = require('web3-core-promievent'); -var namehash = require('eth-ens-namehash'); -var errors = require('web3-core-helpers').errors; -var _ = require('underscore'); -var interfaceIds = require('../config').interfaceIds; - -/** - * @param {Registry} registry - * @constructor - */ -function ResolverMethodHandler(registry) { - this.registry = registry; -} - -/** - * Executes an resolver method and returns an eventifiedPromise - * - * @param {string} ensName - * @param {string} methodName - * @param {array} methodArguments - * @param {function} callback - * @returns {Object} - */ -ResolverMethodHandler.prototype.method = function (ensName, methodName, methodArguments, outputFormatter, callback) { - return { - call: this.call.bind({ - ensName: ensName, - methodName: methodName, - methodArguments: methodArguments, - callback: callback, - parent: this, - outputFormatter: outputFormatter - }), - send: this.send.bind({ - ensName: ensName, - methodName: methodName, - methodArguments: methodArguments, - callback: callback, - parent: this - }) - }; -}; - -/** - * Executes call - * - * @returns {eventifiedPromise} - */ -ResolverMethodHandler.prototype.call = function (callback) { - var self = this; - var promiEvent = new PromiEvent(); - var preparedArguments = this.parent.prepareArguments(this.ensName, this.methodArguments); - var outputFormatter = this.outputFormatter || null; - - this.parent.registry.getResolver(this.ensName).then(async function (resolver) { - await self.parent.checkInterfaceSupport(resolver, self.methodName); - self.parent.handleCall(promiEvent, resolver.methods[self.methodName], preparedArguments, outputFormatter, callback); - }).catch(function(error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - - -/** - * Executes send - * - * @param {Object} sendOptions - * @param {function} callback - * @returns {eventifiedPromise} - */ -ResolverMethodHandler.prototype.send = function (sendOptions, callback) { - var self = this; - var promiEvent = new PromiEvent(); - var preparedArguments = this.parent.prepareArguments(this.ensName, this.methodArguments); - - this.parent.registry.getResolver(this.ensName).then(async function (resolver) { - await self.parent.checkInterfaceSupport(resolver, self.methodName); - self.parent.handleSend(promiEvent, resolver.methods[self.methodName], preparedArguments, sendOptions, callback); - }).catch(function(error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent.eventEmitter; -}; - -/** - * Handles a call method - * - * @param {eventifiedPromise} promiEvent - * @param {function} method - * @param {array} preparedArguments - * @param {function} callback - * @returns {eventifiedPromise} - */ -ResolverMethodHandler.prototype.handleCall = function (promiEvent, method, preparedArguments, outputFormatter, callback) { - method.apply(this, preparedArguments).call() - .then(function (result) { - if (outputFormatter){ - result = outputFormatter(result); - } - - if (_.isFunction(callback)) { - // It's required to pass the receipt to the second argument to be backwards compatible and to have the required consistency - callback(result, result); - - return; - } - - promiEvent.resolve(result); - }).catch(function (error) { - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent; -}; - -/** - * Handles a send method - * - * @param {eventifiedPromise} promiEvent - * @param {function} method - * @param {array} preparedArguments - * @param {Object} sendOptions - * @param {function} callback - * @returns {eventifiedPromise} - */ -ResolverMethodHandler.prototype.handleSend = function (promiEvent, method, preparedArguments, sendOptions, callback) { - method.apply(this, preparedArguments).send(sendOptions) - .on('sending', function () { - promiEvent.eventEmitter.emit('sending'); - }) - .on('sent', function () { - promiEvent.eventEmitter.emit('sent'); - }) - .on('transactionHash', function (hash) { - promiEvent.eventEmitter.emit('transactionHash', hash); - }) - .on('confirmation', function (confirmationNumber, receipt) { - promiEvent.eventEmitter.emit('confirmation', confirmationNumber, receipt); - }) - .on('receipt', function (receipt) { - promiEvent.eventEmitter.emit('receipt', receipt); - promiEvent.resolve(receipt); - - if (_.isFunction(callback)) { - // It's required to pass the receipt to the second argument to be backwards compatible and to have the required consistency - callback(receipt, receipt); - } - }) - .on('error', function (error) { - promiEvent.eventEmitter.emit('error', error); - - if (_.isFunction(callback)) { - callback(error, null); - - return; - } - - promiEvent.reject(error); - }); - - return promiEvent; -}; - -/** - * Adds the ENS node to the arguments - * - * @param {string} name - * @param {array} methodArguments - * - * @returns {array} - */ -ResolverMethodHandler.prototype.prepareArguments = function (name, methodArguments) { - var node = namehash.hash(name); - - if (methodArguments.length > 0) { - methodArguments.unshift(node); - - return methodArguments; - } - - return [node]; -}; - -/** - * - * - * @param {Contract} resolver - * @param {string} methodName - * - * @returns {Promise} - */ -ResolverMethodHandler.prototype.checkInterfaceSupport = async function (resolver, methodName) { - // Skip validation for undocumented interface ids (ex: multihash) - if (!interfaceIds[methodName]) return; - - var supported = false; - try { - supported = await resolver - .methods - .supportsInterface(interfaceIds[methodName]) - .call(); - } catch(err) { - console.warn('Could not verify interface of resolver contract at "' + resolver.options.address + '". '); - } - - if (!supported){ - throw errors.ResolverMethodMissingError(resolver.options.address, methodName); - } -}; - -module.exports = ResolverMethodHandler; diff --git a/packages/web3-eth-ens/src/lib/contentHash.js b/packages/web3-eth-ens/src/lib/contentHash.js deleted file mode 100644 index bd0cbc8486d..00000000000 --- a/packages/web3-eth-ens/src/lib/contentHash.js +++ /dev/null @@ -1,111 +0,0 @@ -/* -Adapted from ensdomains/ui -https://github.com/ensdomains/ui/blob/3e62e440b53466eeec9dd1c63d73924eefbd88c1/src/utils/contents.js#L1-L85 - -BSD 2-Clause License - -Copyright (c) 2019, Ethereum Name Service -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -var contentHash = require('content-hash'); - -function decode(encoded) { - var decoded = null; - var protocolType = null; - var error = null; - - if (encoded && encoded.error) { - return { - protocolType: null, - decoded: encoded.error - }; - } - if (encoded) { - try { - decoded = contentHash.decode(encoded); - var codec = contentHash.getCodec(encoded); - if (codec === 'ipfs-ns') { - protocolType = 'ipfs'; - } else if (codec === 'swarm-ns') { - protocolType = 'bzz'; - } else if (codec === 'onion') { - protocolType = 'onion'; - } else if (codec === 'onion3') { - protocolType = 'onion3'; - } else { - decoded = encoded; - } - } catch (e) { - error = e.message; - } - } - return { - protocolType: protocolType, - decoded: decoded, - error: error - }; -} - -function encode(text) { - var content, contentType; - var encoded = false; - if (!!text) { - var matched = text.match(/^(ipfs|bzz|onion|onion3):\/\/(.*)/) || text.match(/\/(ipfs)\/(.*)/); - if (matched) { - contentType = matched[1]; - content = matched[2]; - } - - try { - if (contentType === 'ipfs') { - if(content.length >= 4) { - encoded = '0x' + contentHash.fromIpfs(content); - } - } else if (contentType === 'bzz') { - if(content.length >= 4) { - encoded = '0x' + contentHash.fromSwarm(content); - } - } else if (contentType === 'onion') { - if(content.length === 16) { - encoded = '0x' + contentHash.encode('onion', content); - } - } else if (contentType === 'onion3') { - if(content.length === 56) { - encoded = '0x' + contentHash.encode('onion3', content); - } - } else { - throw new Error('Could not encode content hash: unsupported content type'); - } - } catch (err) { - throw err; - } - } - return encoded; -} - -module.exports = { - decode: decode, - encode: encode -}; diff --git a/packages/web3-eth-ens/src/registry.ts b/packages/web3-eth-ens/src/registry.ts new file mode 100644 index 00000000000..1c41435e54b --- /dev/null +++ b/packages/web3-eth-ens/src/registry.ts @@ -0,0 +1,90 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3ContextObject } from 'web3-core'; +import { Contract } from 'web3-eth-contract'; +import { Address } from 'web3-types'; +import { ENSRegistryAbi } from './abi/ens/ENSRegistry.js'; +import { PublicResolverAbi } from './abi/ens/PublicResolver.js'; +import { registryAddresses } from './config.js'; +import { namehash } from './utils.js'; + +export class Registry { + private readonly contract: Contract; + private readonly context: Web3ContextObject; + + public constructor(context: Web3ContextObject, customRegistryAddress?: Address) { + this.contract = new Contract( + ENSRegistryAbi, + customRegistryAddress ?? registryAddresses.main, + context, + ); + + this.context = context; + } + + public async getOwner(name: string) { + try { + const result = this.contract.methods.owner(namehash(name)).call(); + + return result; + } catch (error) { + throw new Error(); // TODO: TransactionRevertInstructionError Needs to be added after web3-eth call method is implemented + } + } + + public async getTTL(name: string) { + try { + return this.contract.methods.ttl(namehash(name)).call(); + } catch (error) { + throw new Error(); // TODO: TransactionRevertInstructionError Needs to be added after web3-eth call method is implemented + } + } + + public async recordExists(name: string) { + try { + const promise = this.contract.methods.recordExists(namehash(name)).call(); + + return promise; + } catch (error) { + throw new Error(); // TODO: TransactionRevertInstructionError Needs to be added after web3-eth call method is implemented + } + } + + public async getResolver(name: string) { + try { + return this.contract.methods + .resolver(namehash(name)) + .call() + .then(address => { + // address type is unknown, not sure why + if (typeof address === 'string') { + const contract = new Contract(PublicResolverAbi, address, this.context); + // TODO: set contract provider needs to be added when ens current provider + return contract; + } + throw new Error(); + }); + } catch (error) { + throw new Error(); // TODO: TransactionRevertInstructionError Needs to be added after web3-eth call method is implemented + } + } + + public get events() { + return this.contract.events; + } +} diff --git a/packages/web3-eth-ens/src/resolver.ts b/packages/web3-eth-ens/src/resolver.ts new file mode 100644 index 00000000000..c93d150e805 --- /dev/null +++ b/packages/web3-eth-ens/src/resolver.ts @@ -0,0 +1,141 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ResolverMethodMissingError } from 'web3-errors'; +import { Contract } from 'web3-eth-contract'; +import { isNullish, sha3 } from 'web3-utils'; +import { isHexStrict } from 'web3-validator'; +import { Address, PayableCallOptions } from 'web3-types'; +import { PublicResolverAbi } from './abi/ens/PublicResolver.js'; +import { interfaceIds, methodsInInterface } from './config.js'; +import { Registry } from './registry.js'; +import { namehash } from './utils.js'; + + +// Default public resolver +// https://github.com/ensdomains/resolvers/blob/master/contracts/PublicResolver.sol + +export class Resolver { + private readonly registry: Registry; + + public constructor(registry: Registry) { + this.registry = registry; + } + + private async getResolverContractAdapter(ENSName: string) { + // TODO : (Future 4.1.0 TDB) cache resolver contract if frequently queried same ENS name, refresh cache based on TTL and usage, also limit cache size, optional cache with a flag + return this.registry.getResolver(ENSName); + } + + // https://eips.ethereum.org/EIPS/eip-165 + // eslint-disable-next-line class-methods-use-this + public async checkInterfaceSupport( + resolverContract: Contract, + methodName: string, + ) { + if (isNullish(interfaceIds[methodName])) + throw new ResolverMethodMissingError( + resolverContract.options.address ?? '', + methodName, + ); + + const supported = await resolverContract.methods + .supportsInterface(interfaceIds[methodName]) + .call(); + + if (!supported) + throw new ResolverMethodMissingError( + resolverContract.options.address ?? '', + methodName, + ); + } + + public async supportsInterface(ENSName: string, interfaceId: string) { + const resolverContract = await this.getResolverContractAdapter(ENSName); + + let interfaceIdParam = interfaceId; + + if (!isHexStrict(interfaceIdParam)) { + interfaceIdParam = sha3(interfaceId) ?? ''; + + if (interfaceId === '') throw new Error('Invalid interface Id'); + + interfaceIdParam = interfaceIdParam.slice(0, 10); + } + + return resolverContract.methods.supportsInterface(interfaceIdParam).call(); + } + + // eslint-disable-next-line @typescript-eslint/no-inferrable-types + public async getAddress(ENSName: string, coinType: number = 60) { + const resolverContract = await this.getResolverContractAdapter(ENSName); + + await this.checkInterfaceSupport(resolverContract, methodsInInterface.addr); + + return resolverContract.methods.addr(namehash(ENSName), coinType).call(); + } + + public async getPubkey(ENSName: string) { + const resolverContract = await this.getResolverContractAdapter(ENSName); + + await this.checkInterfaceSupport(resolverContract, methodsInInterface.pubkey); + + return resolverContract.methods.pubkey(namehash(ENSName)).call(); + } + + public async getContenthash(ENSName: string) { + const resolverContract = await this.getResolverContractAdapter(ENSName); + + await this.checkInterfaceSupport(resolverContract, methodsInInterface.contenthash); + + return resolverContract.methods.contenthash(namehash(ENSName)).call(); + } + + public async setAddress( + ENSName: string, + address: Address, + txConfig: PayableCallOptions, + ) { + const resolverContract = await this.getResolverContractAdapter(ENSName); + await this.checkInterfaceSupport(resolverContract, methodsInInterface.setAddr); + + return resolverContract.methods + .setAddr(namehash(ENSName), address) + .send(txConfig); + } + + public async getText( + ENSName: string, + key: string, + ) { + const resolverContract = await this.getResolverContractAdapter(ENSName); + await this.checkInterfaceSupport(resolverContract, methodsInInterface.text); + + return resolverContract.methods + .text(namehash(ENSName), key).call() + } + + public async getName( + address: string + ) { + const resolverContract = await this.getResolverContractAdapter(address); + await this.checkInterfaceSupport(resolverContract, methodsInInterface.name); + + return resolverContract.methods + .name(namehash(address)).call() + } +} diff --git a/packages/web3-eth-ens/src/resources/ABI/Registry.js b/packages/web3-eth-ens/src/resources/ABI/Registry.js deleted file mode 100644 index 092788a55b3..00000000000 --- a/packages/web3-eth-ens/src/resources/ABI/Registry.js +++ /dev/null @@ -1,362 +0,0 @@ -"use strict"; - -var REGISTRY = [ - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "resolver", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "owner", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "label", - "type": "bytes32" - }, - { - "name": "owner", - "type": "address" - } - ], - "name": "setSubnodeOwner", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "ttl", - "type": "uint64" - } - ], - "name": "setTTL", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "ttl", - "outputs": [ - { - "name": "", - "type": "uint64" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "resolver", - "type": "address" - } - ], - "name": "setResolver", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "owner", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "owner", - "type": "address" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": true, - "name": "label", - "type": "bytes32" - }, - { - "indexed": false, - "name": "owner", - "type": "address" - } - ], - "name": "NewOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "resolver", - "type": "address" - } - ], - "name": "NewResolver", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "ttl", - "type": "uint64" - } - ], - "name": "NewTTL", - "type": "event" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "bytes32", - "name": "node", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "uint64", - "name": "ttl", - "type": "uint64" - } - ], - "name": "setRecord", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "name": "setApprovalForAll", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "operator", - "type": "address" - }, - { - "indexed": false, - "internalType": "bool", - "name": "approved", - "type": "bool" - } - ], - "name": "ApprovalForAll", - "type": "event" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "isApprovedForAll", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "bytes32", - "name": "node", - "type": "bytes32" - } - ], - "name": "recordExists", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "bytes32", - "name": "node", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "label", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "resolver", - "type": "address" - }, - { - "internalType": "uint64", - "name": "ttl", - "type": "uint64" - } - ], - "name": "setSubnodeRecord", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } -]; - -module.exports = REGISTRY; diff --git a/packages/web3-eth-ens/src/resources/ABI/Resolver.js b/packages/web3-eth-ens/src/resources/ABI/Resolver.js deleted file mode 100644 index 1d897391299..00000000000 --- a/packages/web3-eth-ens/src/resources/ABI/Resolver.js +++ /dev/null @@ -1,410 +0,0 @@ -"use strict"; - -var RESOLVER = [ - { - "constant": true, - "inputs": [ - { - "name": "interfaceID", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "contentTypes", - "type": "uint256" - } - ], - "name": "ABI", - "outputs": [ - { - "name": "contentType", - "type": "uint256" - }, - { - "name": "data", - "type": "bytes" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "hash", - "type": "bytes" - } - ], - "name": "setMultihash", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "multihash", - "outputs": [ - { - "name": "", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "x", - "type": "bytes32" - }, - { - "name": "y", - "type": "bytes32" - } - ], - "name": "setPubkey", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "content", - "outputs": [ - { - "name": "ret", - "type": "bytes32" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "addr", - "outputs": [ - { - "name": "ret", - "type": "address" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "contentType", - "type": "uint256" - }, - { - "name": "data", - "type": "bytes" - } - ], - "name": "setABI", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "name", - "outputs": [ - { - "name": "ret", - "type": "string" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "name", - "type": "string" - } - ], - "name": "setName", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "hash", - "type": "bytes32" - } - ], - "name": "setContent", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "pubkey", - "outputs": [ - { - "name": "x", - "type": "bytes32" - }, - { - "name": "y", - "type": "bytes32" - } - ], - "payable": false, - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "addr", - "type": "address" - } - ], - "name": "setAddr", - "outputs": [], - "payable": false, - "type": "function" - }, - { - "inputs": [ - { - "name": "ensAddr", - "type": "address" - } - ], - "payable": false, - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "a", - "type": "address" - } - ], - "name": "AddrChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "hash", - "type": "bytes32" - } - ], - "name": "ContentChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "name", - "type": "string" - } - ], - "name": "NameChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": true, - "name": "contentType", - "type": "uint256" - } - ], - "name": "ABIChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "x", - "type": "bytes32" - }, - { - "indexed": false, - "name": "y", - "type": "bytes32" - } - ], - "name": "PubkeyChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "name": "node", - "type": "bytes32" - }, - { - "indexed": false, - "name": "hash", - "type": "bytes" - } - ], - "name": "ContenthashChanged", - "type": "event" - }, - { - "constant": true, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "contenthash", - "outputs": [ - { - "name": "", - "type": "bytes" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "hash", - "type": "bytes" - } - ], - "name": "setContenthash", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } -]; - -module.exports = RESOLVER; \ No newline at end of file diff --git a/packages/web3-eth-ens/src/utils.ts b/packages/web3-eth-ens/src/utils.ts new file mode 100644 index 00000000000..0184929790c --- /dev/null +++ b/packages/web3-eth-ens/src/utils.ts @@ -0,0 +1,42 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { sha3Raw } from 'web3-utils'; +// eslint-disable-next-line camelcase +import { ens_normalize } from '@adraffy/ens-normalize'; + +export const normalize = (name: string) => ens_normalize(name); + +export const namehash = (inputName: string) => { + // Reject empty names: + let node = ''; + for (let i = 0; i < 32; i += 1) { + node += '00'; + } + + if (inputName) { + const name = normalize(inputName); + const labels = name.split('.'); + + for (let i = labels.length - 1; i >= 0; i -= 1) { + const labelSha = sha3Raw(labels[i]).slice(2); + node = sha3Raw(`0x${node}${labelSha}`).slice(2); + } + } + + return `0x${node}`; +}; diff --git a/packages/web3-eth-ens/test/.eslintrc.js b/packages/web3-eth-ens/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-eth-ens/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-ens/test/config/jest.config.js b/packages/web3-eth-ens/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-eth-ens/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-eth-ens/test/config/setup.js b/packages/web3-eth-ens/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-eth-ens/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-eth-ens/test/fixtures/accounts.json b/packages/web3-eth-ens/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-eth-ens/test/fixtures/ens/ENSRegistry.json b/packages/web3-eth-ens/test/fixtures/ens/ENSRegistry.json new file mode 100644 index 00000000000..b73563f066c --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/ENSRegistry.json @@ -0,0 +1,385 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ENSRegistry", + "sourceName": "contracts/registry/ENSRegistry.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "label", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "NewOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "resolver", + "type": "address" + } + ], + "name": "NewResolver", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "ttl", + "type": "uint64" + } + ], + "name": "NewTTL", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "recordExists", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "resolver", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "resolver", + "type": "address" + }, + { + "internalType": "uint64", + "name": "ttl", + "type": "uint64" + } + ], + "name": "setRecord", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "resolver", + "type": "address" + } + ], + "name": "setResolver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "label", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "setSubnodeOwner", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "label", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "resolver", + "type": "address" + }, + { + "internalType": "uint64", + "name": "ttl", + "type": "uint64" + } + ], + "name": "setSubnodeRecord", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "ttl", + "type": "uint64" + } + ], + "name": "setTTL", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "node", + "type": "bytes32" + } + ], + "name": "ttl", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb580546001600160a01b03191633179055610c1a806100596000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80635b0fc9c311610081578063cf4088231161005b578063cf4088231461022f578063e985e9c514610242578063f79fe5381461029b57600080fd5b80635b0fc9c3146101f65780635ef2c7f014610209578063a22cb4651461021c57600080fd5b806314ab9038116100b257806314ab90381461017057806316a25cbd146101855780631896f70a146101e357600080fd5b80630178b8bf146100d957806302571be31461013c57806306ab59231461014f575b600080fd5b6101126100e73660046109fc565b60009081526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61011261014a3660046109fc565b6102d3565b61016261015d366004610a3e565b61030e565b604051908152602001610133565b61018361017e366004610a8b565b61046b565b005b6101ca6101933660046109fc565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b60405167ffffffffffffffff9091168152602001610133565b6101836101f1366004610ab7565b61057d565b610183610204366004610ab7565b61068e565b610183610217366004610ada565b610799565b61018361022a366004610b31565b6107bb565b61018361023d366004610b6d565b610852565b61028b610250366004610bba565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6040519015158152602001610133565b61028b6102a93660046109fc565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff163081036103085750600092915050565b92915050565b600083815260208190526040812054849073ffffffffffffffffffffffffffffffffffffffff1633811480610373575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b61037c57600080fd5b6040805160208101889052908101869052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815292839052912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905060405173ffffffffffffffffffffffffffffffffffffffff86168152869088907fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e829060200160405180910390a39695505050505050565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114806104d0575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b6104d957600080fd5b60405167ffffffffffffffff8416815284907f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa689060200160405180910390a25050600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114806105e2575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b6105eb57600080fd5b60405173ffffffffffffffffffffffffffffffffffffffff8416815284907f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a09060200160405180910390a2505060009182526020829052604090912060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114806106f3575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b6106fc57600080fd5b600084815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905560405173ffffffffffffffffffffffffffffffffffffffff8416815284907fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d2669060200160405180910390a250505050565b60006107a686868661030e565b90506107b381848461086d565b505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61085c848461068e565b61086784838361086d565b50505050565b60008381526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff838116911614610925576000838152602081815260409182902060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155915191825284917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0910160405180910390a25b60008381526020819052604090206001015467ffffffffffffffff8281167401000000000000000000000000000000000000000090920416146109f7576000838152602081815260409182902060010180547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff861690810291909117909155915191825284917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68910160405180910390a25b505050565b600060208284031215610a0e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a3957600080fd5b919050565b600080600060608486031215610a5357600080fd5b8335925060208401359150610a6a60408501610a15565b90509250925092565b803567ffffffffffffffff81168114610a3957600080fd5b60008060408385031215610a9e57600080fd5b82359150610aae60208401610a73565b90509250929050565b60008060408385031215610aca57600080fd5b82359150610aae60208401610a15565b600080600080600060a08688031215610af257600080fd5b8535945060208601359350610b0960408701610a15565b9250610b1760608701610a15565b9150610b2560808701610a73565b90509295509295909350565b60008060408385031215610b4457600080fd5b610b4d83610a15565b915060208301358015158114610b6257600080fd5b809150509250929050565b60008060008060808587031215610b8357600080fd5b84359350610b9360208601610a15565b9250610ba160408601610a15565b9150610baf60608601610a73565b905092959194509250565b60008060408385031215610bcd57600080fd5b610bd683610a15565b9150610aae60208401610a1556fea26469706673582212207e08237bee1508846e20a29f454fa362e24c1e230661c644bfadeca9eeed8be964736f6c634300080d0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80635b0fc9c311610081578063cf4088231161005b578063cf4088231461022f578063e985e9c514610242578063f79fe5381461029b57600080fd5b80635b0fc9c3146101f65780635ef2c7f014610209578063a22cb4651461021c57600080fd5b806314ab9038116100b257806314ab90381461017057806316a25cbd146101855780631896f70a146101e357600080fd5b80630178b8bf146100d957806302571be31461013c57806306ab59231461014f575b600080fd5b6101126100e73660046109fc565b60009081526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61011261014a3660046109fc565b6102d3565b61016261015d366004610a3e565b61030e565b604051908152602001610133565b61018361017e366004610a8b565b61046b565b005b6101ca6101933660046109fc565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b60405167ffffffffffffffff9091168152602001610133565b6101836101f1366004610ab7565b61057d565b610183610204366004610ab7565b61068e565b610183610217366004610ada565b610799565b61018361022a366004610b31565b6107bb565b61018361023d366004610b6d565b610852565b61028b610250366004610bba565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6040519015158152602001610133565b61028b6102a93660046109fc565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff163081036103085750600092915050565b92915050565b600083815260208190526040812054849073ffffffffffffffffffffffffffffffffffffffff1633811480610373575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b61037c57600080fd5b6040805160208101889052908101869052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815292839052912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905060405173ffffffffffffffffffffffffffffffffffffffff86168152869088907fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e829060200160405180910390a39695505050505050565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114806104d0575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b6104d957600080fd5b60405167ffffffffffffffff8416815284907f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa689060200160405180910390a25050600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114806105e2575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b6105eb57600080fd5b60405173ffffffffffffffffffffffffffffffffffffffff8416815284907f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a09060200160405180910390a2505060009182526020829052604090912060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114806106f3575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b6106fc57600080fd5b600084815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905560405173ffffffffffffffffffffffffffffffffffffffff8416815284907fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d2669060200160405180910390a250505050565b60006107a686868661030e565b90506107b381848461086d565b505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61085c848461068e565b61086784838361086d565b50505050565b60008381526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff838116911614610925576000838152602081815260409182902060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155915191825284917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0910160405180910390a25b60008381526020819052604090206001015467ffffffffffffffff8281167401000000000000000000000000000000000000000090920416146109f7576000838152602081815260409182902060010180547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff861690810291909117909155915191825284917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68910160405180910390a25b505050565b600060208284031215610a0e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610a3957600080fd5b919050565b600080600060608486031215610a5357600080fd5b8335925060208401359150610a6a60408501610a15565b90509250925092565b803567ffffffffffffffff81168114610a3957600080fd5b60008060408385031215610a9e57600080fd5b82359150610aae60208401610a73565b90509250929050565b60008060408385031215610aca57600080fd5b82359150610aae60208401610a15565b600080600080600060a08688031215610af257600080fd5b8535945060208601359350610b0960408701610a15565b9250610b1760608701610a15565b9150610b2560808701610a73565b90509295509295909350565b60008060408385031215610b4457600080fd5b610b4d83610a15565b915060208301358015158114610b6257600080fd5b809150509250929050565b60008060008060808587031215610b8357600080fd5b84359350610b9360208601610a15565b9250610ba160408601610a15565b9150610baf60608601610a73565b905092959194509250565b60008060408385031215610bcd57600080fd5b610bd683610a15565b9150610aae60208401610a1556fea26469706673582212207e08237bee1508846e20a29f454fa362e24c1e230661c644bfadeca9eeed8be964736f6c634300080d0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/web3-eth-ens/test/fixtures/ens/abi/ENSRegistry.ts b/packages/web3-eth-ens/test/fixtures/ens/abi/ENSRegistry.ts new file mode 100644 index 00000000000..99730866873 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/abi/ENSRegistry.ts @@ -0,0 +1,394 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// https://github.com/ensdomains/ens-contracts/blob/master/contracts/registry/ENSRegistry.sol +export const ENSRegistryAbi = [ + { + inputs: [], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + indexed: false, + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes32', + name: 'label', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'NewOwner', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'resolver', + type: 'address', + }, + ], + name: 'NewResolver', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'uint64', + name: 'ttl', + type: 'uint64', + }, + ], + name: 'NewTTL', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + ], + name: 'isApprovedForAll', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'owner', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'recordExists', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'resolver', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'setApprovalForAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'setOwner', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'resolver', + type: 'address', + }, + { + internalType: 'uint64', + name: 'ttl', + type: 'uint64', + }, + ], + name: 'setRecord', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'resolver', + type: 'address', + }, + ], + name: 'setResolver', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'label', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + ], + name: 'setSubnodeOwner', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'label', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'address', + name: 'resolver', + type: 'address', + }, + { + internalType: 'uint64', + name: 'ttl', + type: 'uint64', + }, + ], + name: 'setSubnodeRecord', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'uint64', + name: 'ttl', + type: 'uint64', + }, + ], + name: 'setTTL', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'ttl', + outputs: [ + { + internalType: 'uint64', + name: '', + type: 'uint64', + }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const; diff --git a/packages/web3-eth-ens/test/fixtures/ens/abi/NameWrapper.ts b/packages/web3-eth-ens/test/fixtures/ens/abi/NameWrapper.ts new file mode 100644 index 00000000000..cdbc7ba71e8 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/abi/NameWrapper.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// https://github.com/ensdomains/ens-contracts/blob/master/contracts/resolvers/mocks/DummyNameWrapper.sol +export const NameWrapperAbi = [ + { + inputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + ], + name: 'ownerOf', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const; diff --git a/packages/web3-eth-ens/test/fixtures/ens/abi/PublicResolver.ts b/packages/web3-eth-ens/test/fixtures/ens/abi/PublicResolver.ts new file mode 100644 index 00000000000..b666d4f4d67 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/abi/PublicResolver.ts @@ -0,0 +1,893 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// https://github.com/ensdomains/ens-contracts/blob/master/contracts/resolvers/PublicResolver.sol +export const PublicResolverAbi = [ + { + inputs: [ + { + internalType: 'contract ENS', + name: '_ens', + type: 'address', + }, + { + internalType: 'contract INameWrapper', + name: 'wrapperAddress', + type: 'address', + }, + { + internalType: 'address', + name: '_trustedETHController', + type: 'address', + }, + { + internalType: 'address', + name: '_trustedReverseRegistrar', + type: 'address', + }, + ], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'uint256', + name: 'contentType', + type: 'uint256', + }, + ], + name: 'ABIChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'address', + name: 'a', + type: 'address', + }, + ], + name: 'AddrChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'uint256', + name: 'coinType', + type: 'uint256', + }, + { + indexed: false, + internalType: 'bytes', + name: 'newAddress', + type: 'bytes', + }, + ], + name: 'AddressChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + indexed: true, + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + indexed: false, + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'hash', + type: 'bytes', + }, + ], + name: 'ContenthashChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'name', + type: 'bytes', + }, + { + indexed: false, + internalType: 'uint16', + name: 'resource', + type: 'uint16', + }, + { + indexed: false, + internalType: 'bytes', + name: 'record', + type: 'bytes', + }, + ], + name: 'DNSRecordChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'name', + type: 'bytes', + }, + { + indexed: false, + internalType: 'uint16', + name: 'resource', + type: 'uint16', + }, + ], + name: 'DNSRecordDeleted', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'DNSZoneCleared', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes', + name: 'lastzonehash', + type: 'bytes', + }, + { + indexed: false, + internalType: 'bytes', + name: 'zonehash', + type: 'bytes', + }, + ], + name: 'DNSZonehashChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'bytes4', + name: 'interfaceID', + type: 'bytes4', + }, + { + indexed: false, + internalType: 'address', + name: 'implementer', + type: 'address', + }, + ], + name: 'InterfaceChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'string', + name: 'name', + type: 'string', + }, + ], + name: 'NameChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes32', + name: 'x', + type: 'bytes32', + }, + { + indexed: false, + internalType: 'bytes32', + name: 'y', + type: 'bytes32', + }, + ], + name: 'PubkeyChanged', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + indexed: true, + internalType: 'string', + name: 'indexedKey', + type: 'string', + }, + { + indexed: false, + internalType: 'string', + name: 'key', + type: 'string', + }, + ], + name: 'TextChanged', + type: 'event', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'contentTypes', + type: 'uint256', + }, + ], + name: 'ABI', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256', + }, + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'addr', + outputs: [ + { + internalType: 'address payable', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'coinType', + type: 'uint256', + }, + ], + name: 'addr', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'clearDNSZone', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'contenthash', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'name', + type: 'bytes32', + }, + { + internalType: 'uint16', + name: 'resource', + type: 'uint16', + }, + ], + name: 'dnsRecord', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'name', + type: 'bytes32', + }, + ], + name: 'hasDNSRecords', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes4', + name: 'interfaceID', + type: 'bytes4', + }, + ], + name: 'interfaceImplementer', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'account', + type: 'address', + }, + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + ], + name: 'isApprovedForAll', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes[]', + name: 'data', + type: 'bytes[]', + }, + ], + name: 'multicall', + outputs: [ + { + internalType: 'bytes[]', + name: 'results', + type: 'bytes[]', + }, + ], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'pubkey', + outputs: [ + { + internalType: 'bytes32', + name: 'x', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'y', + type: 'bytes32', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'contentType', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'setABI', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'uint256', + name: 'coinType', + type: 'uint256', + }, + { + internalType: 'bytes', + name: 'a', + type: 'bytes', + }, + ], + name: 'setAddr', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'address', + name: 'a', + type: 'address', + }, + ], + name: 'setAddr', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'address', + name: 'operator', + type: 'address', + }, + { + internalType: 'bool', + name: 'approved', + type: 'bool', + }, + ], + name: 'setApprovalForAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes', + name: 'hash', + type: 'bytes', + }, + ], + name: 'setContenthash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes', + }, + ], + name: 'setDNSRecords', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes4', + name: 'interfaceID', + type: 'bytes4', + }, + { + internalType: 'address', + name: 'implementer', + type: 'address', + }, + ], + name: 'setInterface', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'string', + name: 'newName', + type: 'string', + }, + ], + name: 'setName', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'x', + type: 'bytes32', + }, + { + internalType: 'bytes32', + name: 'y', + type: 'bytes32', + }, + ], + name: 'setPubkey', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'string', + name: 'key', + type: 'string', + }, + { + internalType: 'string', + name: 'value', + type: 'string', + }, + ], + name: 'setText', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'bytes', + name: 'hash', + type: 'bytes', + }, + ], + name: 'setZonehash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes4', + name: 'interfaceID', + type: 'bytes4', + }, + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + { + internalType: 'string', + name: 'key', + type: 'string', + }, + ], + name: 'text', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { + internalType: 'bytes32', + name: 'node', + type: 'bytes32', + }, + ], + name: 'zonehash', + outputs: [ + { + internalType: 'bytes', + name: '', + type: 'bytes', + }, + ], + stateMutability: 'view', + type: 'function', + }, +] as const; diff --git a/packages/web3-eth-ens/test/fixtures/ens/bytecode/ENSRegistryBytecode.ts b/packages/web3-eth-ens/test/fixtures/ens/bytecode/ENSRegistryBytecode.ts new file mode 100644 index 00000000000..2fdf02f8189 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/bytecode/ENSRegistryBytecode.ts @@ -0,0 +1,20 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// https://github.com/ensdomains/ens-contracts/blob/master/contracts/resolvers/PublicResolver.sol +export const ENSRegistryBytecode = + '0x608060405234801561001057600080fd5b5060008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb580546001600160a01b0319163317905561192c806100596000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80635b0fc9c31161008c578063a22cb46511610066578063a22cb46514610247578063cf4088231461025a578063e985e9c51461026d578063f79fe538146102c657600080fd5b80635b0fc9c3146102015780635ef2c7f0146102145780639201de551461022757600080fd5b806314ab9038116100bd57806314ab90381461017b57806316a25cbd146101905780631896f70a146101ee57600080fd5b80630178b8bf146100e457806302571be31461014757806306ab59231461015a575b600080fd5b61011d6100f2366004611258565b60009081526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61011d610155366004611258565b6102fe565b61016d610168366004611295565b610339565b60405190815260200161013e565b61018e6101893660046112e2565b6105c3565b005b6101d561019e366004611258565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b60405167ffffffffffffffff909116815260200161013e565b61018e6101fc36600461130e565b610817565b61018e61020f36600461130e565b610a6a565b61018e610222366004611331565b610cb7565b61023a610235366004611258565b610cd9565b60405161013e91906113b4565b61018e6102553660046113e7565b610e58565b61018e610268366004611423565b610eef565b6102b661027b366004611470565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b604051901515815260200161013e565b6102b66102d4366004611258565b60009081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff163081036103335750600092915050565b92915050565b600083815260208190526040812054849073ffffffffffffffffffffffffffffffffffffffff163381148061039e575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b6103a782610f0a565b6040516020016103b7919061149a565b60408051601f19818403018152908290526103d4916020016114df565b6040516020818303038152906040526103ec33610f0a565b6040516020016103fd929190611520565b60408051601f198184030181529082905261041a9160200161154f565b60408051601f19818403018152908290526104379160200161156b565b60408051601f1981840301815291905260008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5546104909073ffffffffffffffffffffffffffffffffffffffff16610f0a565b6040516020016104a1929190611520565b604051602081830303815290604052906104f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e891906113b4565b60405180910390fd5b50604080516020810188905290810186905260009060600160408051601f198184030181529181528151602092830120600081815292839052912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905060405173ffffffffffffffffffffffffffffffffffffffff86168152869088907fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e829060200160405180910390a39695505050505050565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633811480610628575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b61063182610f0a565b604051602001610641919061149a565b60408051601f198184030181529082905261065e916020016114df565b60405160208183030381529060405261067633610f0a565b604051602001610687929190611520565b60408051601f19818403018152908290526106a49160200161154f565b60408051601f19818403018152908290526106c19160200161156b565b60408051601f1981840301815291905260008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461071a9073ffffffffffffffffffffffffffffffffffffffff16610f0a565b60405160200161072b929190611520565b60405160208183030381529060405290610772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e891906113b4565b5060405167ffffffffffffffff8416815284907f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa689060200160405180910390a25050600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff163381148061087c575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b61088582610f0a565b604051602001610895919061149a565b60408051601f19818403018152908290526108b2916020016114df565b6040516020818303038152906040526108ca33610f0a565b6040516020016108db929190611520565b60408051601f19818403018152908290526108f89160200161154f565b60408051601f19818403018152908290526109159160200161156b565b60408051601f1981840301815291905260008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461096e9073ffffffffffffffffffffffffffffffffffffffff16610f0a565b60405160200161097f929190611520565b604051602081830303815290604052906109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e891906113b4565b5060405173ffffffffffffffffffffffffffffffffffffffff8416815284907f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a09060200160405180910390a2505060009182526020829052604090912060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633811480610acf575073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604080832033845290915290205460ff165b610ad882610f0a565b604051602001610ae8919061149a565b60408051601f1981840301815290829052610b05916020016114df565b604051602081830303815290604052610b1d33610f0a565b604051602001610b2e929190611520565b60408051601f1981840301815290829052610b4b9160200161154f565b60408051601f1981840301815290829052610b689160200161156b565b60408051601f1981840301815291905260008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb554610bc19073ffffffffffffffffffffffffffffffffffffffff16610f0a565b604051602001610bd2929190611520565b60405160208183030381529060405290610c19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e891906113b4565b50600084815260208190526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905560405173ffffffffffffffffffffffffffffffffffffffff8416815284907fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d2669060200160405180910390a250505050565b6000610cc4868686610339565b9050610cd181848461108e565b505050505050565b606060005b60208160ff16108015610d2a5750828160ff1660208110610d0157610d016115ac565b1a60f81b7fff000000000000000000000000000000000000000000000000000000000000001615155b15610d415780610d398161160a565b915050610cde565b60008160ff1667ffffffffffffffff811115610d5f57610d5f611629565b6040519080825280601f01601f191660200182016040528015610d89576020820181803683370190505b509050600091505b60208260ff16108015610ddd5750838260ff1660208110610db457610db46115ac565b1a60f81b7fff000000000000000000000000000000000000000000000000000000000000001615155b15610e5157838260ff1660208110610df757610df76115ac565b1a60f81b818360ff1681518110610e1057610e106115ac565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081610e498161160a565b925050610d91565b9392505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ef98484610a6a565b610f0484838361108e565b50505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015611087576000610f47826013611658565b610f5290600861166f565b610f5d9060026117cc565b610f7d9073ffffffffffffffffffffffffffffffffffffffff8716611807565b60f81b9050600060108260f81c610f94919061181b565b60f81b905060008160f81c6010610fab919061183d565b8360f81c610fb9919061185e565b60f81b9050610fc78261121d565b85610fd386600261166f565b81518110610fe357610fe36115ac565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061101b8161121d565b8561102786600261166f565b611032906001611881565b81518110611042576110426115ac565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350505050808061107f90611899565b915050610f31565b5092915050565b60008381526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff838116911614611146576000838152602081815260409182902060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155915191825284917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0910160405180910390a25b60008381526020819052604090206001015467ffffffffffffffff828116740100000000000000000000000000000000000000009092041614611218576000838152602081815260409182902060010180547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff861690810291909117909155915191825284917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68910160405180910390a25b505050565b6000600a60f883901c10156112445761123b60f883901c60306118d1565b60f81b92915050565b61123b60f883901c60576118d1565b919050565b60006020828403121561126a57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125357600080fd5b6000806000606084860312156112aa57600080fd5b83359250602084013591506112c160408501611271565b90509250925092565b803567ffffffffffffffff8116811461125357600080fd5b600080604083850312156112f557600080fd5b82359150611305602084016112ca565b90509250929050565b6000806040838503121561132157600080fd5b8235915061130560208401611271565b600080600080600060a0868803121561134957600080fd5b853594506020860135935061136060408701611271565b925061136e60608701611271565b915061137c608087016112ca565b90509295509295909350565b60005b838110156113a357818101518382015260200161138b565b83811115610f045750506000910152565b60208152600082518060208401526113d3816040850160208701611388565b601f01601f19169190910160400192915050565b600080604083850312156113fa57600080fd5b61140383611271565b91506020830135801515811461141857600080fd5b809150509250929050565b6000806000806080858703121561143957600080fd5b8435935061144960208601611271565b925061145760408601611271565b9150611465606086016112ca565b905092959194509250565b6000806040838503121561148357600080fd5b61148c83611271565b915061130560208401611271565b7f596f7520617265206e6f7420746865206f776e657220000000000000000000008152600082516114d2816016850160208701611388565b9190910160160192915050565b600082516114f1818460208701611388565b7f206d736773656e6465723a000000000000000000000000000000000000000000920191825250600b01919050565b60008351611532818460208801611388565b835190830190611546818360208801611388565b01949350505050565b60008251611561818460208701611388565b9190910192915050565b6000825161157d818460208701611388565b7f206e6f64653a2000000000000000000000000000000000000000000000000000920191825250600701919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff821660ff8103611620576116206115db565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008282101561166a5761166a6115db565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156116a7576116a76115db565b500290565b600181815b8085111561170557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156116eb576116eb6115db565b808516156116f857918102915b93841c93908002906116b1565b509250929050565b60008261171c57506001610333565b8161172957506000610333565b816001811461173f576002811461174957611765565b6001915050610333565b60ff84111561175a5761175a6115db565b50506001821b610333565b5060208310610133831016604e8410600b8410161715611788575081810a610333565b61179283836116ac565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156117c4576117c46115db565b029392505050565b6000610e51838361170d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611816576118166117d8565b500490565b600060ff83168061182e5761182e6117d8565b8060ff84160491505092915050565b600060ff821660ff84168160ff04811182151516156117c4576117c46115db565b600060ff821660ff841680821015611878576118786115db565b90039392505050565b60008219821115611894576118946115db565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118ca576118ca6115db565b5060010190565b600060ff821660ff84168060ff038211156118ee576118ee6115db565b01939250505056fea2646970667358221220504e59c82907e2f23b970e6f59e61282809e57a5d52d051976f95421d183cfc764736f6c634300080d0033'; diff --git a/packages/web3-eth-ens/test/fixtures/ens/bytecode/NameWrapperBytecode.ts b/packages/web3-eth-ens/test/fixtures/ens/bytecode/NameWrapperBytecode.ts new file mode 100644 index 00000000000..0dd1589288c --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/bytecode/NameWrapperBytecode.ts @@ -0,0 +1,20 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// https://github.com/ensdomains/ens-contracts/blob/1b6b4b59003cceb045634d84ab63ae9bc2c0f8c2/contracts/resolvers/mocks/DummyNameWrapper.sol +export const NameWrapperBytecode = + '0x608060405234801561001057600080fd5b5060b48061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80636352211e14602d575b600080fd5b603d60383660046066565b503290565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b600060208284031215607757600080fd5b503591905056fea2646970667358221220b67fcd4e2e3ba377840d17d946ec7bb7d98ab1f95fb8806d831190a194af0f7964736f6c634300080d0033'; diff --git a/packages/web3-eth-ens/test/fixtures/ens/bytecode/PublicResolverBytecode.ts b/packages/web3-eth-ens/test/fixtures/ens/bytecode/PublicResolverBytecode.ts new file mode 100644 index 00000000000..9fe1ad0693b --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/bytecode/PublicResolverBytecode.ts @@ -0,0 +1,20 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// https://github.com/ensdomains/ens-contracts/blob/master/contracts/resolvers/PublicResolver.sol +export const PublicResolverBytecode = + '0x6101006040523480156200001257600080fd5b5060405162002e9838038062002e98833981016040819052620000359162000071565b6001600160a01b0393841660805291831660a052821660c0521660e052620000d9565b6001600160a01b03811681146200006e57600080fd5b50565b600080600080608085870312156200008857600080fd5b8451620000958162000058565b6020860151909450620000a88162000058565b6040860151909350620000bb8162000058565b6060860151909250620000ce8162000058565b939692955090935050565b60805160a05160c05160e051612d7e6200011a60003960006116980152600061165901526000818161177d01526117fd015260006116f90152612d7e6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806377372213116100ee578063bc1c58d111610097578063d5fa2b0011610071578063d5fa2b0014610410578063e59d895d14610423578063e985e9c514610436578063f1cb7e061461047f57600080fd5b8063bc1c58d1146103ad578063c8690233146103c0578063ce3decdc146103fd57600080fd5b8063a8fa5682116100c8578063a8fa568214610367578063ac9650d81461037a578063ad5780af1461039a57600080fd5b8063773722131461032e5780638b95dd7114610341578063a22cb4651461035457600080fd5b8063304e6ade1161015b57806359d1d43c1161013557806359d1d43c146102d55780635c98042b146102f5578063623195b014610308578063691f34311461031b57600080fd5b8063304e6ade1461026f5780633b3b57de146102825780634cbf6ba41461029557600080fd5b8063124a319c1161018c578063124a319c146102035780632203ab561461023b57806329cd62ea1461025c57600080fd5b806301ffc9a7146101b35780630af179d7146101db57806310f13a8c146101f0575b600080fd5b6101c66101c1366004612437565b610492565b60405190151581526020015b60405180910390f35b6101ee6101e9366004612494565b6104a3565b005b6101ee6101fe3660046124e0565b610691565b61021661021136600461255a565b61073e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b61024e610249366004612586565b610abb565b6040516101d2929190612622565b6101ee61026a36600461263b565b610bd6565b6101ee61027d366004612494565b610c56565b610216610290366004612667565b610cb5565b6101c66102a3366004612586565b600091825260066020908152604080842060048352818520548552825280842092845291905290205461ffff16151590565b6102e86102e3366004612494565b610ce7565b6040516101d29190612680565b6102e8610303366004612667565b610dac565b6101ee610316366004612693565b610e4e565b6102e8610329366004612667565b610ecf565b6101ee61033c366004612494565b610eec565b6101ee61034f366004612715565b610f4b565b6101ee610362366004612819565b611022565b6102e8610375366004612857565b611162565b61038d610388366004612897565b6111a5565b6040516101d2919061290c565b6101ee6103a8366004612667565b6112c0565b6102e86103bb366004612667565b611321565b6103e86103ce366004612667565b600090815260096020526040902080546001909101549091565b604080519283526020830191909152016101d2565b6101ee61040b366004612494565b61133e565b6101ee61041e36600461298c565b61144a565b6101ee6104313660046129b1565b611471565b6101c66104443660046129e6565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6102e861048d366004612586565b61153b565b600061049d826115e9565b92915050565b826104ad8161163f565b6104b657600080fd5b60008060608060008061050360008a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506118d89050565b90505b8051516020820151101561062c578561ffff1660000361056b578060400151955061053081611939565b9350836040516020016105439190612a14565b6040516020818303038152906040528051906020012091506105648161195a565b925061061e565b600061057682611939565b9050816040015161ffff168761ffff1614158061059a57506105988582611976565b155b1561061c576105f58b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505060208801518c91506105ed908290612a5f565b8a5115611994565b8160400151965081602001519550809450848051906020012092506106198261195a565b93505b505b61062781611bd7565b610506565b50825115610686576106868984878b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925061067e91508290508e612a5f565b885115611994565b505050505050505050565b8461069b8161163f565b6106a457600080fd5b8282600a600089815260200190815260200160002087876040516106c9929190612a76565b9081526040519081900360200190206106e392909161229a565b5084846040516106f4929190612a76565b6040518091039020867fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550878760405161072e929190612acf565b60405180910390a3505050505050565b60008281526007602090815260408083207fffffffff000000000000000000000000000000000000000000000000000000008516845290915281205473ffffffffffffffffffffffffffffffffffffffff16801561079d57905061049d565b60006107a885610cb5565b905073ffffffffffffffffffffffffffffffffffffffff81166107d05760009250505061049d565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000006024820152600090819073ffffffffffffffffffffffffffffffffffffffff841690604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790525161089a9190612a14565b600060405180830381855afa9150503d80600081146108d5576040519150601f19603f3d011682016040523d82523d6000602084013e6108da565b606091505b50915091508115806108ed575060208151105b8061092f575080601f8151811061090657610906612ae3565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b1561094157600094505050505061049d565b6040517fffffffff000000000000000000000000000000000000000000000000000000008716602482015273ffffffffffffffffffffffffffffffffffffffff841690604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a70000000000000000000000000000000000000000000000000000000017905251610a089190612a14565b600060405180830381855afa9150503d8060008114610a43576040519150601f19603f3d011682016040523d82523d6000602084013e610a48565b606091505b509092509050811580610a5c575060208151105b80610a9e575080601f81518110610a7557610a75612ae3565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b15610ab057600094505050505061049d565b509095945050505050565b600082815260208190526040812060609060015b848111610bb65780851615801590610aff575060008181526020839052604081208054610afb90612b12565b9050115b15610bae5780826000838152602001908152602001600020808054610b2390612b12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4f90612b12565b8015610b9c5780601f10610b7157610100808354040283529160200191610b9c565b820191906000526020600020905b815481529060010190602001808311610b7f57829003601f168201915b50505050509050935093505050610bcf565b60011b610acf565b5060006040518060200160405280600081525092509250505b9250929050565b82610be08161163f565b610be957600080fd5b60408051808201825284815260208082018581526000888152600983528490209251835551600190920191909155815185815290810184905285917f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e4691015b60405180910390a250505050565b82610c608161163f565b610c6957600080fd5b6000848152600260205260409020610c8290848461229a565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484604051610c48929190612acf565b600080610cc383603c61153b565b90508051600003610cd75750600092915050565b610ce081611cbf565b9392505050565b6060600a60008581526020019081526020016000208383604051610d0c929190612a76565b90815260200160405180910390208054610d2590612b12565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5190612b12565b8015610d9e5780601f10610d7357610100808354040283529160200191610d9e565b820191906000526020600020905b815481529060010190602001808311610d8157829003601f168201915b505050505090509392505050565b6000818152600360205260409020805460609190610dc990612b12565b80601f0160208091040260200160405190810160405280929190818152602001828054610df590612b12565b8015610e425780601f10610e1757610100808354040283529160200191610e42565b820191906000526020600020905b815481529060010190602001808311610e2557829003601f168201915b50505050509050919050565b83610e588161163f565b610e6157600080fd5b83610e6d600182612a5f565b1615610e7857600080fd5b6000858152602081815260408083208784529091529020610e9a90848461229a565b50604051849086907faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe390600090a35050505050565b6000818152600860205260409020805460609190610dc990612b12565b82610ef68161163f565b610eff57600080fd5b6000848152600860205260409020610f1890848461229a565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78484604051610c48929190612acf565b82610f558161163f565b610f5e57600080fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484604051610f90929190612622565b60405180910390a2603c8303610ff457837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2610fcb84611cbf565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a25b60008481526001602090815260408083208684528252909120835161101b9285019061233c565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff821633036110cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840160405180910390fd5b336000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000838152600560209081526040808320600483528184205484528252808320858452825280832061ffff851684529091529020805460609190610d2590612b12565b60608167ffffffffffffffff8111156111c0576111c06126e6565b6040519080825280602002602001820160405280156111f357816020015b60608152602001906001900390816111de5790505b50905060005b828110156112b9576000803086868581811061121757611217612ae3565b90506020028101906112299190612b65565b604051611237929190612a76565b600060405180830381855af49150503d8060008114611272576040519150601f19603f3d011682016040523d82523d6000602084013e611277565b606091505b50915091508161128657600080fd5b8084848151811061129957611299612ae3565b6020026020010181905250505080806112b190612bca565b9150506111f9565b5092915050565b806112ca8161163f565b6112d357600080fd5b60008281526004602052604081208054916112ed83612bca565b909155505060405182907fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a198390600090a25050565b6000818152600260205260409020805460609190610dc990612b12565b826113488161163f565b61135157600080fd5b6000848152600360205260408120805461136a90612b12565b80601f016020809104026020016040519081016040528092919081815260200182805461139690612b12565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b50505060008881526003602052604090209293506114069291508690508561229a565b50847f8f15ed4b723ef428f250961da8315675b507046737e19319fc1a4d81bfe87f8582868660405161143b93929190612c02565b60405180910390a25050505050565b816114548161163f565b61145d57600080fd5b61146c83603c61034f85611ce7565b505050565b8261147b8161163f565b61148457600080fd5b60008481526007602090815260408083207fffffffff0000000000000000000000000000000000000000000000000000000087168085529083529281902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155905190815286917f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa910160405180910390a350505050565b6000828152600160209081526040808320848452909152902080546060919061156390612b12565b80601f016020809104026020016040519081016040528092919081815260200182805461158f90612b12565b80156115dc5780601f106115b1576101008083540402835291602001916115dc565b820191906000526020600020905b8154815290600101906020018083116115bf57829003601f168201915b5050505050905092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f59d1d43c00000000000000000000000000000000000000000000000000000000148061049d575061049d82611d20565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806116ba57503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b156116c757506001919050565b6040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906302571be390602401602060405180830381865afa158015611755573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117799190612c32565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611880576040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e90602401602060405180830381865afa158015611859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187d9190612c32565b90505b73ffffffffffffffffffffffffffffffffffffffff8116331480610ce0575073ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020908152604080832033845290915290205460ff16610ce0565b6119266040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b82815260c0810182905261049d81611bd7565b6020810151815160609161049d916119519082611d76565b84519190611dd8565b60a081015160c082015160609161049d91611951908290612a5f565b600081518351148015610ce05750610ce08360008460008751611e4f565b600087815260046020908152604082205488519189019190912090916119bb878787611dd8565b90508315611ac45760008a81526005602090815260408083208684528252808320858452825280832061ffff8c168452909152902080546119fb90612b12565b159050611a4f5760008a815260066020908152604080832086845282528083208584529091528120805461ffff1691611a3383612c4f565b91906101000a81548161ffff021916908361ffff160217905550505b60008a81526005602090815260408083208684528252808320858452825280832061ffff8c1684529091528120611a85916123b0565b897f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a604051611ab7929190612c8b565b60405180910390a2611bcb565b60008a81526005602090815260408083208684528252808320858452825280832061ffff8c16845290915290208054611afc90612b12565b9050600003611b525760008a815260066020908152604080832086845282528083208584529091528120805461ffff1691611b3683612cb1565b91906101000a81548161ffff021916908361ffff160217905550505b60008a81526005602090815260408083208684528252808320858452825280832061ffff8c16845282529091208251611b8d9284019061233c565b50897f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a84604051611bc293929190612cd2565b60405180910390a25b50505050505050505050565b60c08101516020820181905281515111611bee5750565b6000611c0282600001518360200151611d76565b8260200151611c119190612d01565b8251909150611c209082611e72565b61ffff166040830152611c34600282612d01565b8251909150611c439082611e72565b61ffff166060830152611c57600282612d01565b8251909150611c669082611e9a565b63ffffffff166080830152611c7c600482612d01565b8251909150600090611c8e9083611e72565b61ffff169050611c9f600283612d01565b60a084018190529150611cb28183612d01565b60c0909301929092525050565b60008151601414611ccf57600080fd5b50602001516c01000000000000000000000000900490565b6040805160148082528183019092526060916020820181803683375050506c010000000000000000000000009290920260208301525090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fc869023300000000000000000000000000000000000000000000000000000000148061049d575061049d82611ec4565b6000815b83518110611d8a57611d8a612d19565b6000611d968583611f1a565b60ff169050611da6816001612d01565b611db09083612d01565b915080600003611dc05750611dc6565b50611d7a565b611dd08382612a5f565b949350505050565b8251606090611de78385612d01565b1115611df257600080fd5b60008267ffffffffffffffff811115611e0d57611e0d6126e6565b6040519080825280601f01601f191660200182016040528015611e37576020820181803683370190505b50905060208082019086860101610ab0828287611f3e565b6000611e5c848484611fb2565b611e67878785611fb2565b149695505050505050565b8151600090611e82836002612d01565b1115611e8d57600080fd5b50016002015161ffff1690565b8151600090611eaa836004612d01565b1115611eb557600080fd5b50016004015163ffffffff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f691f343100000000000000000000000000000000000000000000000000000000148061049d575061049d82611fd6565b6000828281518110611f2e57611f2e612ae3565b016020015160f81c905092915050565b60208110611f765781518352611f55602084612d01565b9250611f62602083612d01565b9150611f6f602082612a5f565b9050611f3e565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052565b8251600090611fc18385612d01565b1115611fcc57600080fd5b5091016020012090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f124a319c00000000000000000000000000000000000000000000000000000000148061049d575061049d8260007fffffffff0000000000000000000000000000000000000000000000000000000082167fa8fa56820000000000000000000000000000000000000000000000000000000014806120ba57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5c98042b00000000000000000000000000000000000000000000000000000000145b8061049d575061049d8260007fffffffff0000000000000000000000000000000000000000000000000000000082167fbc1c58d100000000000000000000000000000000000000000000000000000000148061049d575061049d8260007fffffffff0000000000000000000000000000000000000000000000000000000082167f3b3b57de0000000000000000000000000000000000000000000000000000000014806121a857507fffffffff0000000000000000000000000000000000000000000000000000000082167ff1cb7e0600000000000000000000000000000000000000000000000000000000145b8061049d575061049d8260007fffffffff0000000000000000000000000000000000000000000000000000000082167f2203ab5600000000000000000000000000000000000000000000000000000000148061049d575061049d8260007fffffffff0000000000000000000000000000000000000000000000000000000082167fac9650d800000000000000000000000000000000000000000000000000000000148061049d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461049d565b8280546122a690612b12565b90600052602060002090601f0160209004810192826122c8576000855561232c565b82601f106122ff578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082351617855561232c565b8280016001018555821561232c579182015b8281111561232c578235825591602001919060010190612311565b506123389291506123ed565b5090565b82805461234890612b12565b90600052602060002090601f01602090048101928261236a576000855561232c565b82601f1061238357805160ff191683800117855561232c565b8280016001018555821561232c579182015b8281111561232c578251825591602001919060010190612395565b5080546123bc90612b12565b6000825580601f106123cc575050565b601f0160209004906000526020600020908101906123ea91906123ed565b50565b5b8082111561233857600081556001016123ee565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461243257600080fd5b919050565b60006020828403121561244957600080fd5b610ce082612402565b60008083601f84011261246457600080fd5b50813567ffffffffffffffff81111561247c57600080fd5b602083019150836020828501011115610bcf57600080fd5b6000806000604084860312156124a957600080fd5b83359250602084013567ffffffffffffffff8111156124c757600080fd5b6124d386828701612452565b9497909650939450505050565b6000806000806000606086880312156124f857600080fd5b85359450602086013567ffffffffffffffff8082111561251757600080fd5b61252389838a01612452565b9096509450604088013591508082111561253c57600080fd5b5061254988828901612452565b969995985093965092949392505050565b6000806040838503121561256d57600080fd5b8235915061257d60208401612402565b90509250929050565b6000806040838503121561259957600080fd5b50508035926020909101359150565b60005b838110156125c35781810151838201526020016125ab565b838111156125d2576000848401525b50505050565b600081518084526125f08160208601602086016125a8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b828152604060208201526000611dd060408301846125d8565b60008060006060848603121561265057600080fd5b505081359360208301359350604090920135919050565b60006020828403121561267957600080fd5b5035919050565b602081526000610ce060208301846125d8565b600080600080606085870312156126a957600080fd5b8435935060208501359250604085013567ffffffffffffffff8111156126ce57600080fd5b6126da87828801612452565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060006060848603121561272a57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561275057600080fd5b818601915086601f83011261276457600080fd5b813581811115612776576127766126e6565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156127bc576127bc6126e6565b816040528281528960208487010111156127d557600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b73ffffffffffffffffffffffffffffffffffffffff811681146123ea57600080fd5b6000806040838503121561282c57600080fd5b8235612837816127f7565b91506020830135801515811461284c57600080fd5b809150509250929050565b60008060006060848603121561286c57600080fd5b8335925060208401359150604084013561ffff8116811461288c57600080fd5b809150509250925092565b600080602083850312156128aa57600080fd5b823567ffffffffffffffff808211156128c257600080fd5b818501915085601f8301126128d657600080fd5b8135818111156128e557600080fd5b8660208260051b85010111156128fa57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561297f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261296d8583516125d8565b94509285019290850190600101612933565b5092979650505050505050565b6000806040838503121561299f57600080fd5b82359150602083013561284c816127f7565b6000806000606084860312156129c657600080fd5b833592506129d660208501612402565b9150604084013561288c816127f7565b600080604083850312156129f957600080fd5b8235612a04816127f7565b9150602083013561284c816127f7565b60008251612a268184602087016125a8565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612a7157612a71612a30565b500390565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000611dd0602083018486612a86565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612b2657607f821691505b602082108103612b5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612b9a57600080fd5b83018035915067ffffffffffffffff821115612bb557600080fd5b602001915036819003821315610bcf57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612bfb57612bfb612a30565b5060010190565b604081526000612c1560408301866125d8565b8281036020840152612c28818587612a86565b9695505050505050565b600060208284031215612c4457600080fd5b8151610ce0816127f7565b600061ffff821680612c6357612c63612a30565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b604081526000612c9e60408301856125d8565b905061ffff831660208301529392505050565b600061ffff808316818103612cc857612cc8612a30565b6001019392505050565b606081526000612ce560608301866125d8565b61ffff851660208401528281036040840152612c2881856125d8565b60008219821115612d1457612d14612a30565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea264697066735822122017b3e680dc23d712e3971f2217d550695e594a6f174f0ed1adabba4ba578aac564736f6c634300080d0033'; diff --git a/packages/web3-eth-ens/test/fixtures/ens/reverse_registrar.json b/packages/web3-eth-ens/test/fixtures/ens/reverse_registrar.json new file mode 100644 index 00000000000..a878744a3a6 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/ens/reverse_registrar.json @@ -0,0 +1,5 @@ +{ + "status": "1", + "message": "OK-Missing/Invalid API Key, rate limit of 1/5sec applied", + "result": "[{\"inputs\":[{\"internalType\":\"contract ENS\",\"name\":\"ensAddr\",\"type\":\"address\"},{\"internalType\":\"contract Resolver\",\"name\":\"resolverAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADDR_REVERSE_NODE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"claimWithResolver\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"defaultResolver\",\"outputs\":[{\"internalType\":\"contract Resolver\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ens\",\"outputs\":[{\"internalType\":\"contract ENS\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"node\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" +} diff --git a/packages/web3-eth-ens/test/fixtures/system_tests_utils.ts b/packages/web3-eth-ens/test/fixtures/system_tests_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/system_tests_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-eth-ens/test/fixtures/utils.ts b/packages/web3-eth-ens/test/fixtures/utils.ts new file mode 100644 index 00000000000..b972253f988 --- /dev/null +++ b/packages/web3-eth-ens/test/fixtures/utils.ts @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const namehashValidData: [string, string][] = [ + ['', '0x0000000000000000000000000000000000000000000000000000000000000000'], + ['eth', '0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae'], + ['foo.eth', '0xde9b09fd7c5f901e23a3f19fecc54828e9c848539801e86591bd9801b019f84f'], + ['FOO.eth', '0xde9b09fd7c5f901e23a3f19fecc54828e9c848539801e86591bd9801b019f84f'], +]; + +export const normalizeValidData: [string, string][] = [ + ['Öbb.at', 'öbb.at'], + ['Ⓜ', 'm'], + ['foo.eth', 'foo.eth'], + ['Foo.eth', 'foo.eth'], + ['🦚.eth', '🦚.eth'], +]; diff --git a/packages/web3-eth-ens/test/integration/ens.events.test.ts b/packages/web3-eth-ens/test/integration/ens.events.test.ts new file mode 100644 index 00000000000..8ad10d08bda --- /dev/null +++ b/packages/web3-eth-ens/test/integration/ens.events.test.ts @@ -0,0 +1,168 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Contract, PayableTxOptions } from 'web3-eth-contract'; +import { sha3 } from 'web3-utils'; +import { getBlock } from 'web3-eth'; + +import { Address, Bytes, DEFAULT_RETURN_FORMAT } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import { ENS } from '../../src'; +import { namehash } from '../../src/utils'; + +import { + getSystemTestProvider, + isWs, + isIpc, + closeOpenConnection, + isSocket, + describeIf, + getSystemTestProviderUrl, + createTempAccount, +} from '../fixtures/system_tests_utils'; + +import { ENSRegistryAbi } from '../fixtures/ens/abi/ENSRegistry'; +import { ENSRegistryBytecode } from '../fixtures/ens/bytecode/ENSRegistryBytecode'; +import { NameWrapperAbi } from '../fixtures/ens/abi/NameWrapper'; +import { NameWrapperBytecode } from '../fixtures/ens/bytecode/NameWrapperBytecode'; +import { PublicResolverAbi } from '../fixtures/ens/abi/PublicResolver'; +import { PublicResolverBytecode } from '../fixtures/ens/bytecode/PublicResolverBytecode'; + +describeIf(isSocket)('ens events', () => { + let registry: Contract; + let resolver: Contract; + let nameWrapper: Contract; + + type ResolverContract = Contract; + + let Resolver: ResolverContract; + let setEnsResolver: ResolverContract; + let getEnsResolver: ResolverContract; + + let sendOptions: PayableTxOptions; + + const domain = 'test'; + const domainNode = namehash(domain); + const node = namehash('resolver'); + const label = sha3('resolver') as string; + + let ens: ENS; + let defaultAccount: string; + let accountOne: string; + + const ZERO_NODE: Bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; + const addressOne: Address = '0x0000000000000000000000000000000000000001'; + + beforeAll(async () => { + const acc1 = await createTempAccount(); + defaultAccount = acc1.address; + const acc2 = await createTempAccount(); + accountOne = acc2.address; + + sendOptions = { from: defaultAccount, gas: '10000000' }; + + const Registry = new Contract(ENSRegistryAbi, undefined, { + provider: getSystemTestProvider(), + }); + + const NameWrapper = new Contract(NameWrapperAbi, undefined, { + provider: getSystemTestProvider(), + }); + + Resolver = new Contract(PublicResolverAbi, undefined, { + provider: getSystemTestProvider(), + }); + + registry = await Registry.deploy({ data: ENSRegistryBytecode }).send(sendOptions); + + nameWrapper = await NameWrapper.deploy({ data: NameWrapperBytecode }).send(sendOptions); + + resolver = await Resolver.deploy({ + data: PublicResolverBytecode, + arguments: [ + registry.options.address as string, + nameWrapper.options.address as string, + accountOne, + defaultAccount, + ], + }).send(sendOptions); + + await registry.methods.setSubnodeOwner(ZERO_NODE, label, defaultAccount).send(sendOptions); + await registry.methods + .setResolver(node, resolver.options.address as string) + .send(sendOptions); + await resolver.methods.setAddr(node, addressOne).send(sendOptions); + + await registry.methods + .setSubnodeOwner(ZERO_NODE, sha3(domain) as string, defaultAccount) + .send(sendOptions); + + const clientUrl = getSystemTestProviderUrl(); + let provider; + if (isIpc) provider = new IpcProvider(clientUrl); + else if (isWs) provider = new ENS.providers.WebsocketProvider(clientUrl); + else provider = new ENS.providers.HttpProvider(clientUrl); + + ens = new ENS(registry.options.address, provider); + + const block = await getBlock(ens, 'latest', false, DEFAULT_RETURN_FORMAT); + const gas = block.gasLimit.toString(); + + // Increase gas for contract calls + sendOptions = { + ...sendOptions, + gas, + }; + }); + + afterAll(async () => { + await closeOpenConnection(ens); + // @ts-expect-error @typescript-eslint/ban-ts-comment + await closeOpenConnection(ens?._registry?.contract); + await closeOpenConnection(getEnsResolver); + await closeOpenConnection(setEnsResolver); + await closeOpenConnection(registry); + await closeOpenConnection(resolver); + await closeOpenConnection(nameWrapper); + }); + + beforeEach(async () => { + // set up subnode + await registry.methods + .setSubnodeOwner(namehash(domain), sha3('web3js') as string, defaultAccount) + .send(sendOptions); + }); + + // eslint-disable-next-line jest/expect-expect, jest/no-done-callback, jest/consistent-test-it + it('NewResolver event', async () => { + // eslint-disable-next-line @typescript-eslint/no-misused-promises, no-async-promise-executor + await new Promise(async resolve => { + const event = ens.events.NewResolver(); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + event.on('data', () => { + resolve(); + }); + + await registry.methods + .setResolver(domainNode, resolver.options.address as string) + .send(sendOptions); + }); + }); +}); diff --git a/packages/web3-eth-ens/test/integration/ens.test.ts b/packages/web3-eth-ens/test/integration/ens.test.ts new file mode 100644 index 00000000000..5683451b66f --- /dev/null +++ b/packages/web3-eth-ens/test/integration/ens.test.ts @@ -0,0 +1,187 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { getBlock } from 'web3-eth'; +import { Contract, PayableTxOptions } from 'web3-eth-contract'; +import { Address, Bytes, DEFAULT_RETURN_FORMAT } from 'web3-types'; +import { sha3, toChecksumAddress } from 'web3-utils'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import { ENS } from '../../src'; +import { namehash } from '../../src/utils'; + +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + getSystemTestProviderUrl, + isIpc, + isSocket, + isWs, +} from '../fixtures/system_tests_utils'; + +import { PublicResolverAbi as PublicResolver } from '../../src/abi/ens/PublicResolver'; +import { ENSRegistryAbi } from '../fixtures/ens/abi/ENSRegistry'; +import { NameWrapperAbi } from '../fixtures/ens/abi/NameWrapper'; +import { PublicResolverAbi } from '../fixtures/ens/abi/PublicResolver'; +import { ENSRegistryBytecode } from '../fixtures/ens/bytecode/ENSRegistryBytecode'; +import { NameWrapperBytecode } from '../fixtures/ens/bytecode/NameWrapperBytecode'; +import { PublicResolverBytecode } from '../fixtures/ens/bytecode/PublicResolverBytecode'; + +describe('ens', () => { + let registry: Contract; + let resolver: Contract; + let nameWrapper: Contract; + + type ResolverContract = Contract; + + let Resolver: ResolverContract; + let getEnsResolver: Contract; + + let sendOptions: PayableTxOptions; + + const domain = 'test'; + const node = namehash('resolver'); + const label = sha3('resolver') as string; + + const subdomain = 'subdomain'; + const fullDomain = `${subdomain}.${domain}`; + const web3jsName = 'web3js.test'; + + let ens: ENS; + let defaultAccount: string; + let accountOne: string; + + const ZERO_NODE: Bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; + const addressOne: Address = '0x0000000000000000000000000000000000000001'; + + beforeAll(async () => { + const acc1 = await createTempAccount(); + defaultAccount = acc1.address; + const acc2 = await createTempAccount(); + accountOne = acc2.address; + + sendOptions = { from: defaultAccount, gas: '10000000' }; + + const Registry = new Contract(ENSRegistryAbi, undefined, { + provider: getSystemTestProvider(), + }); + + const NameWrapper = new Contract(NameWrapperAbi, undefined, { + provider: getSystemTestProvider(), + }); + + Resolver = new Contract(PublicResolverAbi, undefined, { + provider: getSystemTestProvider(), + }); + + registry = await Registry.deploy({ data: ENSRegistryBytecode }).send(sendOptions); + + nameWrapper = await NameWrapper.deploy({ data: NameWrapperBytecode }).send(sendOptions); + + resolver = await Resolver.deploy({ + data: PublicResolverBytecode, + arguments: [ + registry.options.address as string, + nameWrapper.options.address as string, + accountOne, + defaultAccount, + ], + }).send(sendOptions); + + await registry.methods.setSubnodeOwner(ZERO_NODE, label, defaultAccount).send(sendOptions); + await registry.methods + .setResolver(node, resolver.options.address as string) + .send(sendOptions); + await resolver.methods.setAddr(node, addressOne).send(sendOptions); + + await registry.methods + .setSubnodeOwner(ZERO_NODE, sha3(domain) as string, defaultAccount) + .send(sendOptions); + + const clientUrl = getSystemTestProviderUrl(); + let provider; + if (isIpc) provider = new IpcProvider(clientUrl); + else if (isWs) provider = new ENS.providers.WebsocketProvider(clientUrl); + else provider = new ENS.providers.HttpProvider(clientUrl); + + ens = new ENS(registry.options.address, provider); + + const block = await getBlock(ens, 'latest', false, DEFAULT_RETURN_FORMAT); + const gas = block.gasLimit.toString(); + + // Increase gas for contract calls + sendOptions = { + ...sendOptions, + gas, + }; + }); + + afterAll(async () => { + if (isSocket) { + await closeOpenConnection(ens); + // @ts-expect-error @typescript-eslint/ban-ts-comment + await closeOpenConnection(ens?._registry?.contract); + await closeOpenConnection(getEnsResolver); + await closeOpenConnection(registry); + await closeOpenConnection(resolver); + await closeOpenConnection(nameWrapper); + } + }); + + beforeEach(async () => { + // set up subnode + await registry.methods + .setSubnodeOwner(namehash(domain), sha3('web3js') as string, defaultAccount) + .send(sendOptions); + }); + + it('should return the subnode owner of "resolver"', async () => { + const owner = await ens.getOwner('resolver'); + + expect(owner).toEqual(toChecksumAddress(defaultAccount)); + }); + + it('should return the registered resolver for the subnode "resolver"', async () => { + getEnsResolver = await ens.getResolver('resolver'); + + expect(getEnsResolver.options.address).toEqual(resolver.options.address); + }); + + it('should get the owner record for a name', async () => { + const web3jsOwner = await ens.getOwner(web3jsName); + + expect(web3jsOwner).toEqual(toChecksumAddress(defaultAccount)); + }); + + it('should get TTL', async () => { + const TTL = await ens.getTTL(web3jsName); + + expect(TTL).toBe(BigInt(0)); + }); + + it('shoud record exists', async () => { + await registry.methods + .setSubnodeOwner(namehash(domain), sha3(subdomain) as string, defaultAccount) + .send(sendOptions); + + const exists = await ens.recordExists(fullDomain); + + expect(exists).toBeTruthy(); + }); +}); diff --git a/packages/web3-eth-ens/test/integration/jest.config.js b/packages/web3-eth-ens/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-eth-ens/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-eth-ens/test/integration/resolver.test.ts b/packages/web3-eth-ens/test/integration/resolver.test.ts new file mode 100644 index 00000000000..587ce2e7b29 --- /dev/null +++ b/packages/web3-eth-ens/test/integration/resolver.test.ts @@ -0,0 +1,243 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable @typescript-eslint/no-unused-vars */ +import Web3Eth from 'web3-eth'; +import { Contract, PayableTxOptions } from 'web3-eth-contract'; +import { sha3 } from 'web3-utils'; + +import { Address, Bytes, DEFAULT_RETURN_FORMAT } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import { ENS } from '../../src'; +import { namehash } from '../../src/utils'; + +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + getSystemTestProviderUrl, + isIpc, + isSocket, + isWs, + itIf, +} from '../fixtures/system_tests_utils'; + +import { ENSRegistryAbi } from '../fixtures/ens/abi/ENSRegistry'; +import { PublicResolverAbi } from '../fixtures/ens/abi/PublicResolver'; +import { NameWrapperAbi } from '../fixtures/ens/abi/NameWrapper'; +import { ENSRegistryBytecode } from '../fixtures/ens/bytecode/ENSRegistryBytecode'; +import { NameWrapperBytecode } from '../fixtures/ens/bytecode/NameWrapperBytecode'; +import { PublicResolverBytecode } from '../fixtures/ens/bytecode/PublicResolverBytecode'; + +jest.setTimeout(25000); +describe('ens', () => { + let registry: Contract; + let resolver: Contract; + let nameWrapper: Contract; + + let Resolver: Contract; + + let sendOptions: PayableTxOptions; + + const domain = 'test'; + const domainNode = namehash(domain); + const node = namehash('resolver'); + const label = sha3('resolver') as string; + + let web3Eth: Web3Eth; + + let ens: ENS; + let defaultAccount: string; + let accountOne: string; + + const ZERO_NODE: Bytes = '0x0000000000000000000000000000000000000000000000000000000000000000'; + const addressOne: Address = '0x0000000000000000000000000000000000000001'; + + const contentHash = '0x0000000000000000000000000000000000000000000000000000000000000001'; + + const DEFAULT_COIN_TYPE = 60; + + beforeAll(async () => { + const acc1 = await createTempAccount(); + defaultAccount = acc1.address; + const acc2 = await createTempAccount(); + accountOne = acc2.address; + + sendOptions = { from: defaultAccount, gas: '10000000' }; + + const Registry = new Contract(ENSRegistryAbi, undefined, { + provider: getSystemTestProvider(), + }); + + const NameWrapper = new Contract(NameWrapperAbi, undefined, { + provider: getSystemTestProvider(), + }); + + Resolver = new Contract(PublicResolverAbi, undefined, { + provider: getSystemTestProvider(), + }); + + registry = await Registry.deploy({ data: ENSRegistryBytecode }).send(sendOptions); + + nameWrapper = await NameWrapper.deploy({ data: NameWrapperBytecode }).send(sendOptions); + + resolver = await Resolver.deploy({ + data: PublicResolverBytecode, + arguments: [ + registry.options.address as string, + nameWrapper.options.address as string, + accountOne, + defaultAccount, + ], + }).send(sendOptions); + + await registry.methods.setSubnodeOwner(ZERO_NODE, label, defaultAccount).send(sendOptions); + await registry.methods + .setResolver(node, resolver.options.address as string) + .send(sendOptions); + await resolver.methods.setAddr(node, addressOne).send(sendOptions); + + await registry.methods + .setSubnodeOwner(ZERO_NODE, sha3(domain) as string, defaultAccount) + .send(sendOptions); + + const clientUrl = getSystemTestProviderUrl(); + let provider; + if (isIpc) provider = new IpcProvider(clientUrl); + else if (isWs) provider = new ENS.providers.WebsocketProvider(clientUrl); + else provider = new ENS.providers.HttpProvider(clientUrl); + + ens = new ENS(registry.options.address, provider); + + web3Eth = new Web3Eth(provider); + const block = await web3Eth.getBlock('latest', false, DEFAULT_RETURN_FORMAT); + const gas = block.gasLimit.toString(); + + // Increase gas for contract calls + sendOptions = { + ...sendOptions, + gas, + }; + }); + + afterAll(async () => { + if (isSocket) { + await closeOpenConnection(ens); + // @ts-expect-error @typescript-eslint/ban-ts-comment + await closeOpenConnection(ens?._registry?.contract); + await closeOpenConnection(registry); + await closeOpenConnection(resolver); + await closeOpenConnection(nameWrapper); + } + }); + beforeEach(async () => { + // set up subnode + await registry.methods + .setSubnodeOwner(ZERO_NODE, sha3('eth') as string, defaultAccount) + .send(sendOptions); + }); + + it('supports known interfaces', async () => { + await expect(ens.supportsInterface('resolver', '0x3b3b57de')).resolves.toBeTruthy(); // IAddrResolver + await expect(ens.supportsInterface('resolver', '0xf1cb7e06')).resolves.toBeTruthy(); // IAddressResolver + await expect(ens.supportsInterface('resolver', '0x691f3431')).resolves.toBeTruthy(); // INameResolver + await expect(ens.supportsInterface('resolver', '0x2203ab56')).resolves.toBeTruthy(); // IABIResolver + await expect(ens.supportsInterface('resolver', '0xc8690233')).resolves.toBeTruthy(); // IPubkeyResolver + await expect(ens.supportsInterface('resolver', '0x59d1d43c')).resolves.toBeTruthy(); // ITextResolver + await expect(ens.supportsInterface('resolver', '0xbc1c58d1')).resolves.toBeTruthy(); // IContentHashResolver + await expect(ens.supportsInterface('resolver', '0xa8fa5682')).resolves.toBeTruthy(); // IDNSRecordResolver + await expect(ens.supportsInterface('resolver', '0x5c98042b')).resolves.toBeTruthy(); // IDNSZoneResolver + await expect(ens.supportsInterface('resolver', '0x01ffc9a7')).resolves.toBeTruthy(); // IInterfaceResolver + }); + + it('does not support a random interface', async () => { + await expect(ens.supportsInterface('resolver', '0x3b3b57df')).resolves.toBeFalsy(); + }); + + it('fetch pubkey', async () => { + await registry.methods + .setResolver(domainNode, resolver.options.address as string) + .send(sendOptions); + + const res = await ens.getPubkey(domain); + expect(res.x).toBe('0x0000000000000000000000000000000000000000000000000000000000000000'); + expect(res.y).toBe('0x0000000000000000000000000000000000000000000000000000000000000000'); + }); + + it('permits setting public key by owner', async () => { + const x = '0x1000000000000000000000000000000000000000000000000000000000000000'; + const y = '0x2000000000000000000000000000000000000000000000000000000000000000'; + + await resolver.methods.setPubkey(domainNode, x, y).send(sendOptions); + + const result = await ens.getPubkey(domain); + + expect(result[0]).toBe(x); + expect(result[1]).toBe(y); + }); + + it('sets contenthash', async () => { + await resolver.methods.setContenthash(domainNode, contentHash).send(sendOptions); + + const res = await resolver.methods.contenthash(domainNode).call(sendOptions); + expect(res).toBe(contentHash); + }); + + // eslint-disable-next-line jest/expect-expect + itIf(isSocket)('ContenthashChanged event', async () => { + // eslint-disable-next-line @typescript-eslint/no-misused-promises, no-async-promise-executor + await new Promise(async resolve => { + const resolver2 = await ens.getResolver('resolver'); + const event = resolver2.events.ContenthashChanged(); + + event.on('data', () => { + resolve(); + }); + await resolver.methods.setContenthash(domainNode, contentHash).send(sendOptions); + }); + }); + + it('fetches contenthash', async () => { + await resolver.methods.setContenthash(domainNode, contentHash).call(sendOptions); + + const res = await ens.getContenthash(domain); + expect(res).toBe(contentHash); + }); + + it('sets address', async () => { + await registry.methods + .setResolver(domainNode, resolver.options.address as string) + .send(sendOptions); + + await resolver.methods.setAddr(domainNode, accountOne).send(sendOptions); + + const res = await resolver.methods.addr(domainNode, DEFAULT_COIN_TYPE).call(sendOptions); + expect(res).toBe(accountOne); + }); + + it('fetches address', async () => { + await registry.methods + .setResolver(domainNode, resolver.options.address as string) + .send(sendOptions); + + await resolver.methods.setAddr(domainNode, accountOne).send(sendOptions); + + const resultAddress = await ens.getAddress(domain); + expect(resultAddress).toBe(accountOne); + }); +}); diff --git a/packages/web3-eth-ens/test/integration/setup.js b/packages/web3-eth-ens/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-eth-ens/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth-ens/test/tsconfig.json b/packages/web3-eth-ens/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-eth-ens/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-eth-ens/test/unit/constructor.test.ts b/packages/web3-eth-ens/test/unit/constructor.test.ts new file mode 100644 index 00000000000..06836c024d9 --- /dev/null +++ b/packages/web3-eth-ens/test/unit/constructor.test.ts @@ -0,0 +1,66 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context, Web3ContextObject } from 'web3-core'; +import { Registry } from '../../src/registry'; +import { Resolver } from '../../src/resolver'; +import { ENS } from '../../src/ens'; +import { registryAddresses } from '../../src/config'; + +describe('ens', () => { + let object: Web3ContextObject; + + beforeAll(() => { + const context = new Web3Context('http://test.com'); + object = context.getContextObject(); + }); + it('should construct registry with expected methods', () => { + const registry = new Registry(object); + + expect(registry.getOwner).toBeDefined(); + expect(registry.getResolver).toBeDefined(); + expect(registry.getTTL).toBeDefined(); + expect(registry.recordExists).toBeDefined(); + }); + + it('should construct resolver with expected methods', () => { + const registry = new Registry(object); + const resolver = new Resolver(registry); + + expect(resolver.setAddress).toBeDefined(); + expect(resolver.getAddress).toBeDefined(); + expect(resolver.checkInterfaceSupport).toBeDefined(); + expect(resolver.supportsInterface).toBeDefined(); + expect(resolver.getPubkey).toBeDefined(); + expect(resolver.getContenthash).toBeDefined(); + }); + + it('should construct main ens class with expected methods', () => { + const ens = new ENS(registryAddresses.main, 'http://127.0.0.1:8545'); + + expect(ens.getResolver).toBeDefined(); + expect(ens.setAddress).toBeDefined(); + expect(ens.recordExists).toBeDefined(); + expect(ens.getTTL).toBeDefined(); + expect(ens.getOwner).toBeDefined(); + expect(ens.getAddress).toBeDefined(); + expect(ens.getPubkey).toBeDefined(); + expect(ens.getContenthash).toBeDefined(); + expect(ens.checkNetwork).toBeDefined(); + expect(ens.supportsInterface).toBeDefined(); + }); +}); diff --git a/packages/web3-eth-ens/test/unit/ens.test.ts b/packages/web3-eth-ens/test/unit/ens.test.ts new file mode 100644 index 00000000000..1c860d72c38 --- /dev/null +++ b/packages/web3-eth-ens/test/unit/ens.test.ts @@ -0,0 +1,268 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context, Web3ContextObject, Web3PromiEvent } from 'web3-core'; +import { ENSNetworkNotSyncedError, ENSUnsupportedNetworkError } from 'web3-errors'; +import { Contract } from 'web3-eth-contract'; +import { PublicResolverAbi } from '../../src/abi/ens/PublicResolver'; +import { registryAddresses } from '../../src/config'; + +import { ENS } from '../../src/ens'; + +jest.useFakeTimers().setSystemTime(new Date('2020-01-01')); + +jest.mock('web3-eth', () => ({ + __esModule: true, + isSyncing: jest.fn(), +})); + +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +const { isSyncing } = require('web3-eth'); + +const expectedNetworkId = '0x1'; +jest.mock('web3-net', () => ({ + getId: jest.fn(), +})); +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +const { getId } = require('web3-net'); + +describe('ens', () => { + let object: Web3ContextObject; + let resolverContract: Contract; + const mockAddress = '0x0000000000000000000000000000000000000000'; + const ENS_NAME = 'web3js.eth'; + let ens: ENS; + + beforeAll(() => { + const context = new Web3Context('http://test.com'); + object = context.getContextObject(); + + resolverContract = new Contract(PublicResolverAbi, mockAddress); + ens = new ENS(registryAddresses.main, object); + }); + + describe('Resolver', () => { + it('getResolver', async () => { + const getResolverMock = jest + .spyOn(ens['_registry'], 'getResolver') + .mockResolvedValue(resolverContract); + + await ens.getResolver(ENS_NAME); + + expect(getResolverMock).toHaveBeenCalledWith(ENS_NAME); + }); + }); + + describe('Record', () => { + it('recordExists', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const recordExistsMock = jest.spyOn(ens['_registry'], 'recordExists').mockReturnValue({ + call, + } as unknown as Web3PromiEvent); + await ens.recordExists(ENS_NAME); + + expect(recordExistsMock).toHaveBeenCalledWith(ENS_NAME); + }); + }); + + describe('ttl', () => { + it('getTTL', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const getTTLMock = jest.spyOn(ens['_registry'], 'getTTL').mockReturnValue({ + call, + } as unknown as Web3PromiEvent); + + await ens.getTTL(ENS_NAME); + expect(getTTLMock).toHaveBeenCalledWith(ENS_NAME); + }); + }); + + describe('owner', () => { + it('getOwner', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const getOwnerMock = jest.spyOn(ens['_registry'], 'getOwner').mockReturnValue({ + call, + } as unknown as Web3PromiEvent); + + await ens.getOwner(ENS_NAME); + expect(getOwnerMock).toHaveBeenCalledWith(ENS_NAME); + }); + }); + + describe('addr', () => { + it('setAddr valid', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const send = jest.spyOn({ send: () => {} }, 'send'); + + const setAddressMock = jest.spyOn(ens['_resolver'], 'setAddress').mockReturnValue({ + send, + } as unknown as Web3PromiEvent); + + const sendOptions = { from: mockAddress }; + await ens.setAddress(ENS_NAME, mockAddress, sendOptions); + expect(setAddressMock).toHaveBeenCalledWith( + ENS_NAME, + mockAddress, + sendOptions, + ); + }); + it('getAddress', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const addrMock = jest.spyOn(ens['_resolver'], 'getAddress').mockReturnValue({ + call, + } as unknown as Web3PromiEvent); + + await ens.getAddress(ENS_NAME); + + expect(addrMock).toHaveBeenCalledWith(ENS_NAME, 60); + }); + }); + + describe('events', () => { + it('get events', async () => { + const { events } = ens; + expect(typeof events.NewOwner).toBe('function'); + expect(typeof events.allEvents).toBe('function'); + expect(typeof events.NewResolver).toBe('function'); + expect(typeof events.Transfer).toBe('function'); + }); + }); + + describe('constructor', () => { + it('default params', async () => { + const localEns = new ENS(); + expect(localEns.provider).toBeUndefined(); + expect(localEns.registryAddress).toBe(registryAddresses.main); + }); + it('set params', async () => { + const localEns = new ENS(registryAddresses.goerli, 'http://127.0.0.1:8545'); + // @ts-expect-error check clientUrl field + expect(localEns.provider?.clientUrl).toBe('http://127.0.0.1:8545'); + expect(localEns.registryAddress).toBe(registryAddresses.goerli); + }); + }); + + describe('pubkey', () => { + it('getPubkey', async () => { + const pubkeyMock = jest.spyOn(ens['_resolver'], 'getPubkey').mockReturnValue({ + call: jest.fn(), + } as unknown as Web3PromiEvent); + + await ens.getPubkey(ENS_NAME); + expect(pubkeyMock).toHaveBeenCalledWith(ENS_NAME); + }); + + describe('Contenthash', () => { + it('getContenthash', async () => { + const contenthashMock = jest + .spyOn(ens['_resolver'], 'getContenthash') + .mockReturnValue({ + call: jest.fn(), + } as unknown as Web3PromiEvent); + + await ens.getContenthash(ENS_NAME); + + expect(contenthashMock).toHaveBeenCalledWith(ENS_NAME); + }); + }); + }); + + it('supportsInterface', async () => { + const interfaceId = 'setAddr'; + const supportsInterfaceMock = jest + .spyOn(ens['_resolver'], 'supportsInterface') + .mockReturnValue({ + call: jest.fn(), + } as unknown as Web3PromiEvent); + + await ens.supportsInterface(ENS_NAME, interfaceId); + + expect(supportsInterfaceMock).toHaveBeenCalledWith(ENS_NAME, interfaceId); + }); + + describe('CheckNetwork', () => { + beforeEach(() => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + getId.mockReset(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + isSyncing.mockReset(); + }); + it('Not last sync/ENSNetworkNotSyncedError', async () => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + getId.mockImplementation(() => expectedNetworkId); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + isSyncing.mockImplementation(() => { + return { + startingBlock: 100, + currentBlock: 312, + highestBlock: 51266, + } as unknown; + }); + await expect(ens.checkNetwork()).rejects.toThrow(new ENSNetworkNotSyncedError()); + }); + + it('Threshold exceeded from previous check/ENSNetworkNotSyncedError', async () => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + getId.mockImplementation(() => expectedNetworkId); + + // An initial check, in order to update `_lastSyncCheck` + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + isSyncing.mockImplementation(() => { + return false; + }); + // update `_lastSyncCheck` + await ens.checkNetwork(); + + // now - this._lastSyncCheck > 3600) + jest.useFakeTimers().setSystemTime(new Date('2020-01-01').getTime() + 3601000); // (3600 + 1) * 1000 + await expect(ens.checkNetwork()).resolves.not.toThrow(); + }); + + it('ENSUnsupportedNetworkError', async () => { + // reset from previous check + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + ens['_detectedAddress'] = undefined; + + const network = 'AnUnsupportedNetwork'; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + getId.mockImplementation(() => network); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + isSyncing.mockImplementation(() => { + return { + startingBlock: 100, + currentBlock: 312, + highestBlock: 51266, + } as unknown; + }); + + await expect(ens.checkNetwork()).rejects.toThrow( + new ENSUnsupportedNetworkError(network), + ); + }); + }); +}); diff --git a/packages/web3-eth-ens/test/unit/index.test.ts b/packages/web3-eth-ens/test/unit/index.test.ts new file mode 100644 index 00000000000..ec6df8f7d5e --- /dev/null +++ b/packages/web3-eth-ens/test/unit/index.test.ts @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import * as ens from '../../src'; +import { registryAddresses } from '../../src'; + +describe('main package', () => { + it('should import', () => { + expect(registryAddresses).toBeDefined(); + expect(ens.ENS).toBeDefined(); + }); +}); diff --git a/packages/web3-eth-ens/test/unit/jest.config.js b/packages/web3-eth-ens/test/unit/jest.config.js new file mode 100644 index 00000000000..c88b5aeb17d --- /dev/null +++ b/packages/web3-eth-ens/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-eth-ens-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-eth-ens/test/unit/registry.test.ts b/packages/web3-eth-ens/test/unit/registry.test.ts new file mode 100644 index 00000000000..d0b4f1ce751 --- /dev/null +++ b/packages/web3-eth-ens/test/unit/registry.test.ts @@ -0,0 +1,212 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context, Web3ContextObject } from 'web3-core'; +import { NonPayableMethodObject } from 'web3-eth-contract'; +import { Registry } from '../../src/registry'; +import { namehash } from '../../src/utils'; + +describe('registry', () => { + let object: Web3ContextObject; + let registry: Registry; + const mockAddress = '0x0000000000000000000000000000000000000000'; + const ENS_NAME = 'web3js.eth'; + + beforeAll(() => { + const context = new Web3Context('http://test.com'); + object = context.getContextObject(); + + registry = new Registry(object); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('constructor with custom address', async () => { + const tempRegistry = new Registry(object, mockAddress); + + expect(tempRegistry).toBeInstanceOf(Registry); + }); + + describe('owner', () => { + it('getOwner', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const getOwnerMock = jest.spyOn(registry['contract'].methods, 'owner').mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await registry.getOwner(ENS_NAME); + expect(getOwnerMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + it('getOwner throw (transaction reverted)', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call').mockImplementation(() => { + throw new Error(); + }); + + const getOwnerMock = jest + .spyOn(registry['contract'].methods, 'owner') + .mockReturnValue({ call } as unknown as NonPayableMethodObject); + + await expect(async () => { + await registry.getOwner(ENS_NAME); + }).rejects.toThrow(new Error()); + expect(getOwnerMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + }); + + describe('ttl', () => { + it('getTTL', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const getTTLMock = jest.spyOn(registry['contract'].methods, 'ttl').mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await registry.getTTL(ENS_NAME); + expect(getTTLMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + it('getTTL throw (transaction reverted)', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call').mockImplementation(() => { + throw new Error(); + }); + + const getTTLMock = jest + .spyOn(registry['contract'].methods, 'ttl') + .mockReturnValue({ call } as unknown as NonPayableMethodObject); + + await expect(async () => { + await registry.getTTL(ENS_NAME); + }).rejects.toThrow(new Error()); + expect(getTTLMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + }); + + describe('record', () => { + it('recordExists', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const setRecordMock = jest + .spyOn(registry['contract'].methods, 'recordExists') + .mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await registry.recordExists(ENS_NAME); + expect(setRecordMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + it('recordExists throw (transaction reverted)', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call').mockImplementation(() => { + throw new Error(); + }); + + const setRecordMock = jest + .spyOn(registry['contract'].methods, 'recordExists') + .mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await expect(async () => { + await registry.recordExists(ENS_NAME); + }).rejects.toThrow(new Error()); + expect(setRecordMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + }); + + describe('resolver', () => { + it('resolver', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest + .spyOn( + { + call: async () => { + return mockAddress; + }, + }, + 'call', + ) + .mockReturnValue(Promise.resolve(mockAddress)); + + const resolverMock = jest + .spyOn(registry['contract'].methods, 'resolver') + .mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await registry.getResolver(ENS_NAME); + expect(resolverMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + + it('resolver (return non string)', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest + .spyOn( + { + call: async () => { + return 5; // something that is not string + }, + }, + 'call', + ) + .mockReturnValue(Promise.resolve(5)); // something that is not string + + const resolverMock = jest + .spyOn(registry['contract'].methods, 'resolver') + .mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await expect(async () => { + await registry.getResolver(ENS_NAME); + }).rejects.toThrow(new Error()); + expect(resolverMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + + it('resolver throw (transaction reverted)', async () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call').mockImplementation(() => { + throw new Error(); + }); + const resolverMock = jest + .spyOn(registry['contract'].methods, 'resolver') + .mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await expect(async () => { + await registry.getResolver(ENS_NAME); + }).rejects.toThrow(new Error()); + expect(resolverMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + expect(call).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/web3-eth-ens/test/unit/resolver.test.ts b/packages/web3-eth-ens/test/unit/resolver.test.ts new file mode 100644 index 00000000000..f0df74bd2a7 --- /dev/null +++ b/packages/web3-eth-ens/test/unit/resolver.test.ts @@ -0,0 +1,337 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context, Web3ContextObject } from 'web3-core'; +import { ResolverMethodMissingError } from 'web3-errors'; +import { Contract, NonPayableMethodObject } from 'web3-eth-contract'; +import { sha3 } from 'web3-utils'; +import { PublicResolverAbi } from '../../src/abi/ens/PublicResolver'; +import { interfaceIds, methodsInInterface } from '../../src/config'; +import { Registry } from '../../src/registry'; +import { Resolver } from '../../src/resolver'; +import { namehash } from '../../src/utils'; + +describe('resolver', () => { + let object: Web3ContextObject; + let registry: Registry; + let resolver: Resolver; + let contract: Contract; + const mockAddress = '0x0000000000000000000000000000000000000000'; + const ENS_NAME = 'web3js.eth'; + + beforeAll(() => { + const context = new Web3Context('http://test.com'); + object = context.getContextObject(); + + registry = new Registry(object); + resolver = new Resolver(registry); + contract = new Contract(PublicResolverAbi, mockAddress); + }); + + describe('checkInterfaceSupport', () => { + it('isNullish interface', async () => { + const methodName = 'nullish'; + await expect(resolver.checkInterfaceSupport(contract, methodName)).rejects.toThrow( + new ResolverMethodMissingError(mockAddress, methodName), + ); + }); + it('isNullish interface with no address', async () => { + const methodName = 'nullish'; + const localContract = new Contract(PublicResolverAbi); + await expect(resolver.checkInterfaceSupport(localContract, methodName)).rejects.toThrow( + new ResolverMethodMissingError('', methodName), + ); + }); + + it('Doesn"t support interface', async () => { + const methodName = methodsInInterface.setAddr; // Just a method to pass first check + + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: jest.fn().mockReturnValue(false), + } as unknown as NonPayableMethodObject); + + await expect(resolver.checkInterfaceSupport(contract, methodName)).rejects.toThrow( + new ResolverMethodMissingError(mockAddress, methodName), + ); + + expect(supportsInterfaceMock).toHaveBeenCalledWith(interfaceIds[methodName]); + }); + it('Doesn"t support interface with no address', async () => { + const methodName = methodsInInterface.setAddr; // Just a method to pass first check + const localContract = new Contract(PublicResolverAbi); + const supportsInterfaceMock = jest + .spyOn(localContract.methods, 'supportsInterface') + .mockReturnValue({ + call: jest.fn().mockReturnValue(false), + } as unknown as NonPayableMethodObject); + + await expect(resolver.checkInterfaceSupport(localContract, methodName)).rejects.toThrow( + new ResolverMethodMissingError('', methodName), + ); + expect(supportsInterfaceMock).toHaveBeenCalledWith(interfaceIds[methodName]); + }); + + it.each(Object.values(methodsInInterface))( + 'supported interface for %s', + async methodName => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: jest.fn().mockReturnValue(true), + } as unknown as NonPayableMethodObject); + + await expect( + resolver.checkInterfaceSupport(contract, methodName), + ).resolves.not.toThrow(); + + expect(supportsInterfaceMock).toHaveBeenCalledWith(interfaceIds[methodName]); + }, + ); + }); + describe('addr', () => { + it('setAddr valid', async () => { + const checkInteraface = jest.spyOn(resolver, 'checkInterfaceSupport'); + + const setAddrMock = jest.spyOn(contract.methods, 'setAddr').mockReturnValue({ + send: jest.fn(), + } as unknown as NonPayableMethodObject); + + jest.spyOn(contract.methods, 'supportsInterface').mockReturnValue({ + call: jest.fn().mockReturnValue(true), + } as unknown as NonPayableMethodObject); + + // todo when moving this mock in beforeAll, jest calls the actual implementation, how to fix that + // I use this in many places + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.setAddress(ENS_NAME, mockAddress, { from: mockAddress }); + expect(checkInteraface).toHaveBeenCalled(); + expect(setAddrMock).toHaveBeenCalledWith(namehash(ENS_NAME), mockAddress); + }); + it('getAddress', async () => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + const addrMock = jest.spyOn(contract.methods, 'addr').mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + // todo when moving this mock in beforeAll, jest calls the actual implementation, how to fix that + // I use this in many places + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.getAddress(ENS_NAME); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + interfaceIds[methodsInInterface.addr], + ); + expect(addrMock).toHaveBeenCalledWith(namehash(ENS_NAME), 60); + }); + }); + + describe('pubkey', () => { + it('getPubkey', async () => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + const pubkeyMock = jest.spyOn(contract.methods, 'pubkey').mockReturnValue({ + call: jest.fn(), + } as unknown as NonPayableMethodObject); + + // todo when moving this mock in beforeAll, jest calls the actual implementation, how to fix that + // I use this in many places + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.getPubkey(ENS_NAME); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + interfaceIds[methodsInInterface.pubkey], + ); + expect(pubkeyMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + }); + }); + + describe('Contenthash', () => { + it('getContenthash', async () => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + const contenthashMock = jest.spyOn(contract.methods, 'contenthash').mockReturnValue({ + call: jest.fn(), + } as unknown as NonPayableMethodObject); + + // todo when moving this mock in beforeAll, jest calls the actual implementation, how to fix that + // I use this in many places + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.getContenthash(ENS_NAME); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + interfaceIds[methodsInInterface.contenthash], + ); + expect(contenthashMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + }); + }); + + describe('text', () => { + it('getText', async () => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + const textMock = jest.spyOn(contract.methods, 'text').mockReturnValue({ + call: jest.fn(), + } as unknown as NonPayableMethodObject); + + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.getText(ENS_NAME, "key"); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + interfaceIds[methodsInInterface.text], + ); + expect(textMock).toHaveBeenCalledWith(namehash(ENS_NAME), "key"); + }) +}) + + describe('name', () => { + it('getName', async () => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + const nameMock = jest.spyOn(contract.methods, 'name').mockReturnValue({ + call: jest.fn(), + } as unknown as NonPayableMethodObject); + + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.getName(ENS_NAME); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + interfaceIds[methodsInInterface.name], + ); + + expect(nameMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + }) + }) + + + describe('supportsInterface', () => { + it('check supportsInterface for non strict hex id', async () => { + const interfaceId = 'setAddr'; + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await expect(resolver.supportsInterface(ENS_NAME, interfaceId)).resolves.not.toThrow(); + + // expect(setContenthashMock).toHaveBeenCalledWith(namehash(ENS_NAME), hash); + expect(supportsInterfaceMock).toHaveBeenCalledWith(sha3(interfaceId)?.substring(0, 10)); + expect(call).toHaveBeenCalled(); + }); + + it('check supportsInterface for empty non strict hex id', async () => { + const interfaceId = ''; // empty + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await expect(resolver.supportsInterface(ENS_NAME, interfaceId)).rejects.toThrow( + new Error('Invalid interface Id'), + ); + }); + + it.each(Object.values(interfaceIds))( + 'check supportsInterface for valid hex ids', + async () => { + const interfaceId = 'setAddr'; + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + // eslint-disable-next-line @typescript-eslint/no-empty-function + const call = jest.spyOn({ call: () => {} }, 'call'); + + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call, + } as unknown as NonPayableMethodObject); + + await expect( + resolver.supportsInterface(ENS_NAME, interfaceId), + ).resolves.not.toThrow(); + + // expect(setContenthashMock).toHaveBeenCalledWith(namehash(ENS_NAME), hash); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + sha3(interfaceId)?.substring(0, 10), + ); + expect(call).toHaveBeenCalled(); + }, + ); + }); +}); diff --git a/packages/web3-eth-ens/test/unit/utils.test.ts b/packages/web3-eth-ens/test/unit/utils.test.ts new file mode 100644 index 00000000000..e7cce3ed581 --- /dev/null +++ b/packages/web3-eth-ens/test/unit/utils.test.ts @@ -0,0 +1,35 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { namehash, normalize } from '../../src/utils'; +import { namehashValidData, normalizeValidData } from '../fixtures/utils'; + +describe('ens utils', () => { + describe('namehash', () => { + describe('valid cases', () => { + it.each(namehashValidData)('%s', (input, output) => { + expect(namehash(input)).toEqual(output); + }); + }); + }); + + describe('toAscii', () => { + it.each(normalizeValidData)('should normalize %s', (input, output) => { + expect(normalize(input)).toEqual(output); + }); + }); +}); diff --git a/packages/web3-eth-ens/tsconfig.cjs.json b/packages/web3-eth-ens/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-eth-ens/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-eth-ens/tsconfig.esm.json b/packages/web3-eth-ens/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-eth-ens/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-eth-ens/tsconfig.json b/packages/web3-eth-ens/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-eth-ens/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-eth-ens/tsconfig.types.json b/packages/web3-eth-ens/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-eth-ens/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-eth-ens/tsdoc.json b/packages/web3-eth-ens/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-eth-ens/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth-ens/types/index.d.ts b/packages/web3-eth-ens/types/index.d.ts deleted file mode 100644 index c47f21fac03..00000000000 --- a/packages/web3-eth-ens/types/index.d.ts +++ /dev/null @@ -1,404 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Samuel Furter , Josh Stevens - * @date 2018 - */ - -import { PromiEvent, TransactionConfig, TransactionReceipt } from 'web3-core'; -import { TransactionRevertInstructionError } from 'web3-core-helpers'; -import { Eth } from 'web3-eth'; -import { Contract } from 'web3-eth-contract'; - -export interface ContentHash { - protocolType: 'ipfs' | 'bzz' | 'onion' | 'onion3' | null, - decoded: string | null, - error?: Error | null -} - -// TODO: Define as soon as implemented the generic contract -export class Ens { - constructor(eth: Eth); - - registryAddress: string | null; - registry: Registry; - - /** - * @deprecated This callback signature is deprecated - */ - supportsInterface( - name: string, - interfaceId: string, - callback?: (value: any) => void - ): Promise; - supportsInterface( - name: string, - interfaceId: string, - callback?: (error: Error, supported: boolean) => void - ): Promise; - - /** - * @deprecated Please use the "getResolver" method instead of "resolver" - */ - resolver( - name: string, - callback?: (error: Error, contract: Contract) => void - ): Promise; - /** - * @deprecated Please use the "getResolver" method instead of "resolver" - */ - resolver( - name: string, - callback?: (value: any) => void - ): Promise; - - /** - * @deprecated This callback signature is deprecated - */ - getResolver( - name: string, - callback?: (value: any) => void - ): Promise; - getResolver( - name: string, - callback?: (error: Error, contract: Contract) => void - ): Promise; - - setResolver( - name: string, - address: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent - - setSubnodeOwner( - name: string, - label: string, - address: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent - - setRecord( - name: string, - owner: string, - resolver: string, - ttl: number | string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent - - setSubnodeRecord( - name: string, - label: string, - owner: string, - resolver: string, - ttl: number | string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent - - setApprovalForAll( - operator: string, - approved: boolean, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent - - /** - * @deprecated This callback signature is deprecated - */ - isApprovedForAll( - owner: string, - operator: string, - callback?: (value: any) => void - ): Promise; - isApprovedForAll( - owner: string, - operator: string, - callback?: (error: Error, result: boolean) => void - ): Promise; - - /** - * @deprecated This callback signature is deprecated - */ - recordExists( - name: string, - callback?: (value: any) => void - ): Promise; - recordExists( - name: string, - callback?: (error: Error, result: boolean) => void - ): Promise; - - /** - * @deprecated This callback signature is deprecated - */ - getTTL( - name: string, - callback?: (value: any) => void - ): Promise; - getTTL( - name: string, - callback?: (error: Error, ttl: string) => void - ): Promise; - - setTTL( - name: string, - ttl: string | number, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getOwner( - name: string, - callback?: (value: any) => void - ): Promise; - getOwner( - name: string, - callback?: (error: Error, owner: string) => void - ): Promise; - - setOwner( - name: string, - address: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getAddress( - name: string, - callback?: (value: any) => void - ): Promise; - getAddress( - name: string, - callback?: (error: Error, address: string) => void - ): Promise; - - setAddress( - name: string, - address: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getPubkey( - name: string, - callback?: (value: any) => void - ): Promise<{ [x: string]: string }>; - getPubkey( - name: string, - callback?: (error: Error, result: { [x: string]: string }) => void - ): Promise<{ [x: string]: string }>; - - setPubkey( - name: string, - x: string, - y: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getText( - name: string, - key: string, - callback?: (value: any) => void - ): Promise; - getText( - name: string, - key: string, - callback?: (error: Error, ensName: string) => void - ): Promise; - - setText( - name: string, - key: string, - value: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getContent( - name: string, - callback?: (value: any) => void - ): Promise; - getContent( - name: string, - callback?: (error: Error, contentHash: string) => void - ): Promise; - - setContent( - name: string, - hash: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getMultihash( - name: string, - callback?: (value: any) => void - ): Promise; - getMultihash( - name: string, - callback?: (error: Error, multihash: string) => void - ): Promise; - - setMultihash( - name: string, - hash: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getContenthash( - name: string, - callback?: (value: ContentHash) => void - ): Promise; - getContenthash( - name: string, - callback?: (error: Error, contenthash: ContentHash) => void - ): Promise; - - setContenthash( - name: string, - hash: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; -} - -export class Registry { - constructor(ens: Ens); - - ens: Ens; - - contract: Contract | null; - - /** - * @deprecated Please use the "getOwner" method instead of "owner" - */ - owner( - name: string, - callback?: (error: Error, address: string) => void - ): Promise; - /** - * @deprecated Please use the "getOwner" method instead of "owner" - */ - owner( - name: string, - callback?: (value: any) => void - ): Promise; - - /** - * @deprecated This callback signature is deprecated - */ - getOwner( - name: string, - callback?: (value: any) => void - ): Promise; - getOwner( - name: string, - callback?: (error: Error, address: string) => void - ): Promise; - - setOwner( - name: string, - address: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - /** - * @deprecated This callback signature is deprecated - */ - getTTl( - name: string, - callback?: (value: any) => void - ): Promise; - getTTl( - name: string, - callback?: (error: Error, ttl: string) => void - ): Promise; - - setTTL( - name: string, - ttl: string | number, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent; - - setSubnodeOwner( - name: string, - label: string, - address: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent - - /** - * @deprecated Please use the "getResolver" method instead of "resolver" - */ - resolver( - name: string, - callback?: (error: Error, contract: Contract) => void - ): Promise; - /** - * @deprecated Please use the "getResolver" method instead of "resolver" - */ - resolver( - name: string, - callback?: (value: any) => void - ): Promise; - - /** - * @deprecated This callback signature is deprecated - */ - getResolver( - name: string, - callback?: (value: any) => void - ): Promise; - getResolver( - name: string, - callback?: (error: Error, contract: Contract) => void - ): Promise; - - setResolver( - name: string, - address: string, - txConfig?: TransactionConfig, - callback?: (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => void - ): PromiEvent -} diff --git a/packages/web3-eth-ens/types/tests/ens-test.ts b/packages/web3-eth-ens/types/tests/ens-test.ts deleted file mode 100644 index 17d0af5bcdd..00000000000 --- a/packages/web3-eth-ens/types/tests/ens-test.ts +++ /dev/null @@ -1,225 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file ens-test.ts - * @author Samuel Furter , Josh Stevens - * @date 2018 - */ - -import { TransactionRevertInstructionError } from 'web3-core-helpers'; -import { TransactionReceipt } from 'web3-core'; -import { Contract } from 'web3-eth-contract'; -import { Ens, ContentHash } from 'web3-eth-ens'; -import { Eth } from 'web3-eth'; - -const ens = new Ens(new Eth('http://localhost:8545')); - -// $ExpectType string | null -ens.registryAddress; - -// $ExpectType Registry -ens.registry; - -// $ExpectType Promise -ens.resolver('name'); -// $ExpectType Promise -ens.resolver('name', (value: any) => {}); -// $ExpectType Promise -ens.resolver('name', (error: Error, contract: Contract) => {}); -// $ExpectType Promise -ens.getResolver('name'); -// $ExpectType Promise -ens.getResolver('name', (error: Error, contract: Contract) => {}); -// $ExpectType Promise -ens.getResolver('name', (value: any) => {}); - -// $ExpectType PromiEvent -ens.setResolver('name', '0x0...'); -// $ExpectType PromiEvent -ens.setResolver('name', '0x0...', {}); -// $ExpectType PromiEvent -ens.setResolver('name', '0x0...', {}, (error: Error, receipt: TransactionReceipt) => {}); - -// $ExpectType PromiEvent -ens.setSubnodeOwner('name', 'label', '0x...'); -// $ExpectType PromiEvent -ens.setSubnodeOwner('name', 'label', '0x...', {}); -// $ExpectType PromiEvent -ens.setSubnodeOwner('name', 'label', '0x...', {}, (error: Error, receipt: TransactionReceipt) => {}); - -// $ExpectType PromiEvent -ens.setRecord('name', 'owner', 'resolver', '100000'); -// $ExpectType PromiEvent -ens.setRecord('name', 'owner', 'resolver', 100000); -// $ExpectType PromiEvent -ens.setRecord('name', 'owner', 'resolver', 100000, {}); -// $ExpectType PromiEvent -ens.setRecord('name', 'owner', 'resolver', 100000, {}, (error: Error, receipt: TransactionReceipt) => {}); - -// $ExpectType PromiEvent -ens.setSubnodeRecord('name', 'label', 'owner', 'resolver', '100000'); -// $ExpectType PromiEvent -ens.setSubnodeRecord('name', 'label', 'owner', 'resolver', 100000); -// $ExpectType PromiEvent -ens.setSubnodeRecord('name', 'label', 'owner', 'resolver', 100000, {}); -// $ExpectType PromiEvent -ens.setSubnodeRecord('name', 'label', 'owner', 'resolver', 100000, {}, (error: Error, receipt: TransactionReceipt) => {}); - -// $ExpectType PromiEvent -ens.setApprovalForAll('name', true); -// $ExpectType PromiEvent -ens.setApprovalForAll('name', false, {}); -// $ExpectType PromiEvent -ens.setApprovalForAll('name', true, {}, (error: Error, receipt: TransactionReceipt) => {}); - -// $ExpectType Promise -ens.isApprovedForAll('owner', 'operator'); -// $ExpectType Promise -ens.isApprovedForAll('owner', 'operator', (error: Error, result: boolean) => {}); -// $ExpectType Promise -ens.isApprovedForAll('owner', 'operator', (value: any) => {}); - -// $ExpectType Promise -ens.recordExists('name'); -// $ExpectType Promise -ens.recordExists('name', (error: Error, result: boolean) => {}); -// $ExpectType Promise -ens.recordExists('name', (value: any) => {}); - -// $ExpectType Promise -ens.getTTL('name'); -// $ExpectType Promise -ens.getTTL('name', (error: Error, ttl: string) => {}); -// $ExpectType Promise -ens.getTTL('name', (value: any) => {}); - -// $ExpectType PromiEvent -ens.setTTL('name', 10000); -// $ExpectType PromiEvent -ens.setTTL('name', 10000, {}); -// $ExpectType PromiEvent -ens.setTTL('name', '0xa', {}, (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => {}); - -// $ExpectType Promise -ens.getOwner('name'); -// $ExpectType Promise -ens.getOwner('name', (value: any) => {}); -// $ExpectType Promise -ens.getOwner('name', (error: Error, owner: string) => {}); - -// $ExpectType PromiEvent -ens.setOwner('name', '0x...'); -// $ExpectType PromiEvent -ens.setOwner('name', '0x...', {}); -// $ExpectType PromiEvent -ens.setOwner('name', '0x...', {}, (error: Error | TransactionRevertInstructionError, receipt: TransactionReceipt) => {}); - -// $ExpectType Promise -ens.supportsInterface('name', 'interfaceId'); -// $ExpectType Promise -ens.supportsInterface( - 'name', - 'interfaceId', - (error: Error, supportsInterface: boolean) => {} -); -// $ExpectType Promise -ens.supportsInterface( - 'name', - 'interfaceId', - (value: any) => {} -); - -// $ExpectType Promise -ens.getAddress('name'); -// $ExpectType Promise -ens.getAddress('name', (error: Error, address: string) => {}); -// $ExpectType Promise -ens.getAddress('name', (value: any) => {}); - -// $ExpectType PromiEvent -ens.setAddress('name', 'address'); -// $ExpectType PromiEvent -ens.setAddress('name', 'address', {}); -// $ExpectType PromiEvent -ens.setAddress('name', 'address', {}, (error: Error, result: any) => {}); - -// $ExpectType Promise<{ [x: string]: string; }> -ens.getPubkey('name'); -// $ExpectType Promise<{ [x: string]: string; }> -ens.getPubkey('name', (error: Error, result: { [x: string]: string }) => {}); -// $ExpectType Promise<{ [x: string]: string; }> -ens.getPubkey('name', (value: any) => {}); - -// $ExpectType PromiEvent -ens.setPubkey('name', 'x', 'y'); -// $ExpectType PromiEvent -ens.setPubkey('name', 'x', 'y', {}); -// $ExpectType PromiEvent -ens.setPubkey('name', 'x', 'y', {}, (error: Error, result: any) => {}); - -// $ExpectType Promise -ens.getText('name', 'key'); -// $ExpectType Promise -ens.getText('name', 'key', (error: Error, ensName: string) => {}); -// $ExpectType Promise -ens.getText('name', 'key', (value: any) => {}); - -// $ExpectType PromiEvent -ens.setText('name', 'key', 'value'); -// $ExpectType PromiEvent -ens.setText('name', 'key', 'value', {}); -// $ExpectType PromiEvent -ens.setText('name', 'key', 'value', {}, (error: Error, result: any) => {}); - -// $ExpectType Promise -ens.getContent('name'); -// $ExpectType Promise -ens.getContent('name', (error: Error, contentHash: string) => {}); -// $ExpectType Promise -ens.getContent('name', (value: any) => {}); - -// $ExpectType PromiEvent -ens.setContent('name', 'hash'); -// $ExpectType PromiEvent -ens.setContent('name', 'hash', {}); -// $ExpectType PromiEvent -ens.setContent('name', 'hash', {}, (error: Error, result: any) => {}); - -// $ExpectType Promise -ens.getMultihash('name'); -// $ExpectType Promise -ens.getMultihash('name', (error: Error, multihash: string) => {}); -// $ExpectType Promise -ens.getMultihash('name', (value: any) => {}); - -// $ExpectType PromiEvent -ens.setMultihash('name', 'hash'); -// $ExpectType PromiEvent -ens.setMultihash('name', 'hash', {}, (error: Error, result: any) => {}); -// $ExpectType PromiEvent -ens.setMultihash('name', 'hash', {}); - -// $ExpectType Promise -ens.getContenthash('name'); -// $ExpectType Promise -ens.getContenthash('name', (error: Error, contenthash: ContentHash) => {}); -// $ExpectType Promise -ens.getContenthash('name', (value: ContentHash) => {}); - -// $ExpectType PromiEvent -ens.setContenthash('name', 'hash'); -// $ExpectType PromiEvent -ens.setContenthash('name', 'hash', {}); -// $ExpectType PromiEvent -ens.setContenthash('name', 'hash', {}, (error: Error, result: any) => {}); diff --git a/packages/web3-eth-ens/types/tsconfig.json b/packages/web3-eth-ens/types/tsconfig.json deleted file mode 100644 index 212c71253ba..00000000000 --- a/packages/web3-eth-ens/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth-ens": ["."] - } - } -} diff --git a/packages/web3-eth-ens/types/tslint.json b/packages/web3-eth-ens/types/tslint.json deleted file mode 100644 index 30e95b7bca5..00000000000 --- a/packages/web3-eth-ens/types/tslint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "no-empty-interface": false, - "unified-signatures": false - } -} diff --git a/packages/web3-eth-iban/.eslintignore b/packages/web3-eth-iban/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-eth-iban/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-iban/.eslintrc.js b/packages/web3-eth-iban/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-eth-iban/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-iban/.gitignore b/packages/web3-eth-iban/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-eth-iban/.npmignore b/packages/web3-eth-iban/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-eth-iban/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-iban/.prettierignore b/packages/web3-eth-iban/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-eth-iban/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-iban/.prettierrc.json b/packages/web3-eth-iban/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-eth-iban/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-eth-iban/CHANGELOG.md b/packages/web3-eth-iban/CHANGELOG.md new file mode 100644 index 00000000000..797f4ffe29f --- /dev/null +++ b/packages/web3-eth-iban/CHANGELOG.md @@ -0,0 +1,128 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Changed + +- Updated dependencies (#5912) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [4.0.1-rc.2] + +### Changed + +- Dependencies updated + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Changed + +- Dependencies updated + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Changed + +- Dependencies updated + +## [4.0.7] + +### Changed + +- Dependencies updated + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-eth-iban/README.md b/packages/web3-eth-iban/README.md index 79dfdcca83d..11c7e52305b 100644 --- a/packages/web3-eth-iban/README.md +++ b/packages/web3-eth-iban/README.md @@ -1,42 +1,59 @@ -# web3-eth-iban +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - IBAN -This is a sub package of [web3.js][repo] +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This is the IBAN package to be used in the `web3-eth` package. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-eth-iban` This package converts Ethereum addresses to IBAN addresses a vice versa. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-eth-iban) or using [Yarn](https://yarnpkg.com/package/web3-eth-iban) + +### Using NPM ```bash npm install web3-eth-iban ``` -## Usage - -```js -const Web3EthIban = require('web3-eth-iban'); +### Using Yarn -const iban = new Web3EthIban('XE75JRZCTTLBSYEQBGAS7GID8DKR7QY0QA3'); -iban.toAddress() > '0xa94f5374Fce5edBC8E2a8697C15331677e6EbF0B'; +```bash +yarn add web3-eth-iban ``` -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) -## Types +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-eth-iban.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-eth-iban +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-iban%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-eth-iban -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-eth-iban -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-eth-iban -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-eth-iban -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=web3-eth-iban +[downloads-image]: https://img.shields.io/npm/dm/web3-eth-iban?label=npm%20downloads diff --git a/packages/web3-eth-iban/assets/logo/web3js.ai b/packages/web3-eth-iban/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth-iban/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth-iban/assets/logo/web3js.jpg b/packages/web3-eth-iban/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth-iban/assets/logo/web3js.jpg differ diff --git a/packages/web3-eth-iban/assets/logo/web3js.svg b/packages/web3-eth-iban/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth-iban/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth-iban/logo/web3js.ai b/packages/web3-eth-iban/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth-iban/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth-iban/logo/web3js.jpg b/packages/web3-eth-iban/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth-iban/logo/web3js.jpg differ diff --git a/packages/web3-eth-iban/logo/web3js.svg b/packages/web3-eth-iban/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth-iban/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth-iban/package-lock.json b/packages/web3-eth-iban/package-lock.json deleted file mode 100644 index ae1ded5a6c5..00000000000 --- a/packages/web3-eth-iban/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-eth-iban", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - } - } -} diff --git a/packages/web3-eth-iban/package.json b/packages/web3-eth-iban/package.json index 37c23da76d7..8a92af70ea6 100644 --- a/packages/web3-eth-iban/package.json +++ b/packages/web3-eth-iban/package.json @@ -1,24 +1,64 @@ { - "name": "web3-eth-iban", - "version": "1.3.0", - "description": "This package converts Ethereum addresses to IBAN addresses a vice versa.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth-iban", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "bn.js": "^4.11.9", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-eth-iban", + "version": "4.0.7", + "description": "This package converts Ethereum addresses to IBAN addresses and vice versa.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --runInBand --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --runInBand" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7", + "web3-validator": "^2.0.3" + } } diff --git a/packages/web3-eth-iban/src/iban.ts b/packages/web3-eth-iban/src/iban.ts new file mode 100644 index 00000000000..4bdb5e32cc6 --- /dev/null +++ b/packages/web3-eth-iban/src/iban.ts @@ -0,0 +1,415 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { HexString } from 'web3-types'; +import { toChecksumAddress, leftPad, hexToNumber } from 'web3-utils'; +import { isAddress } from 'web3-validator'; +import { InvalidAddressError } from 'web3-errors'; +import { IbanOptions } from './types.js'; + +/** + * Converts Ethereum addresses to IBAN or BBAN addresses and vice versa. +* For using Iban package, first install Web3 package using: `npm i web3` or `yarn add web3` based on your package manager, after that ENS features can be used. +* ```ts +* +* import { Web3 } from 'web3'; +* const web3 = new Web3('https://mainnet.infura.io/v3/'); +* +* const iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); +* console.log(iban.checksum()); + +* ``` +* For using individual package install `web3-eth-iban` packages using: `npm i web3-eth-iban` or `yarn add web3-eth-iban`. +* +* ```ts +* import {Iban} from 'web3-eth-iban'; +* +* const iban = new Iban("XE81ETHXREGGAVOFYORK"); +* console.log(iban.checksum()); +* ``` +*/ +export class Iban { + private readonly _iban: string; + + /** + * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to + * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616. + */ + private static readonly _iso13616Prepare = (iban: string): string => { + const A = 'A'.charCodeAt(0); + const Z = 'Z'.charCodeAt(0); + + const upperIban = iban.toUpperCase(); + const modifiedIban = `${upperIban.slice(4)}${upperIban.slice(0, 4)}`; + + return modifiedIban + .split('') + .map(n => { + const code = n.charCodeAt(0); + if (code >= A && code <= Z) { + // A = 10, B = 11, ... Z = 35 + return code - A + 10; + } + return n; + }) + .join(''); + }; + + /** + * return the bigint of the given string with the specified base + */ + private static readonly _parseInt = (str: string, base: number): bigint => + [...str].reduce( + (acc, curr) => BigInt(parseInt(curr, base)) + BigInt(base) * acc, + BigInt(0), + ); + + /** + * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064. + */ + private static readonly _mod9710 = (iban: string): number => { + let remainder = iban; + let block; + + while (remainder.length > 2) { + block = remainder.slice(0, 9); + remainder = `${(parseInt(block, 10) % 97).toString()}${remainder.slice(block.length)}`; + } + + return parseInt(remainder, 10) % 97; + }; + + /** + * A static method that checks if an IBAN is Direct. + * It actually check the length of the provided variable and, only if it is 34 or 35, it returns true. + * Note: this is also available as a method at an Iban instance. + * @param iban - an IBAN to be checked + * @returns - `true` if the provided `iban` is a Direct IBAN, and `false` otherwise. + * + * @example + * ```ts + * web3.eth.Iban.isDirect("XE81ETHXREGGAVOFYORK"); + * > false + * ``` + */ + public static isDirect(iban: string): boolean { + return iban.length === 34 || iban.length === 35; + } + + /** + * An instance method that checks if iban number is Direct. + * It actually check the length of the provided variable and, only if it is 34 or 35, it returns true. + * Note: this is also available as a static method. + * @param iban - an IBAN to be checked + * @returns - `true` if the provided `iban` is a Direct IBAN, and `false` otherwise. + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); + * iban.isDirect(); + * > false + * ``` + */ + public isDirect(): boolean { + return Iban.isDirect(this._iban); + } + + /** + * A static method that checks if an IBAN is Indirect. + * It actually check the length of the provided variable and, only if it is 20, it returns true. + * Note: this is also available as a method at an Iban instance. + * @param iban - an IBAN to be checked + * @returns - `true` if the provided `iban` is an Indirect IBAN, and `false` otherwise. + * + * @example + * ```ts + * web3.eth.Iban.isIndirect("XE81ETHXREGGAVOFYORK"); + * > true + * ``` + */ + public static isIndirect(iban: string): boolean { + return iban.length === 20; + } + + /** + * check if iban number if indirect + * It actually check the length of the provided variable and, only if it is 20, it returns true. + * Note: this is also available as a static method. + * @param iban - an IBAN to be checked + * @returns - `true` if the provided `iban` is an Indirect IBAN, and `false` otherwise. + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); + * iban.isIndirect(); + * > true + * ``` + */ + public isIndirect(): boolean { + return Iban.isIndirect(this._iban); + } + + /** + * This method could be used to check if a given string is valid IBAN object. + * Note: this is also available as a method at an Iban instance. + * + * @param iban - a string to be checked if it is in IBAN + * @returns - true if it is valid IBAN + * + * @example + * ```ts + * web3.eth.Iban.isValid("XE81ETHXREGGAVOFYORK"); + * > true + * + * web3.eth.Iban.isValid("XE82ETHXREGGAVOFYORK"); + * > false // because the checksum is incorrect + * ``` + */ + public static isValid(iban: string) { + return ( + /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(iban) && + Iban._mod9710(Iban._iso13616Prepare(iban)) === 1 + ); + } + + /** + * Should be called to check if the early provided IBAN is correct. + * Note: this is also available as a static method. + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); + * iban.isValid(); + * > true + * + * const iban = new web3.eth.Iban("XE82ETHXREGGAVOFYORK"); + * iban.isValid(); + * > false // because the checksum is incorrect + * ``` + */ + public isValid(): boolean { + return Iban.isValid(this._iban); + } + + /** + * Construct a direct or indirect IBAN that has conversion methods and validity checks. + * If the provided string was not of either the length of a direct IBAN (34 or 35), + * nor the length of an indirect IBAN (20), an Error will be thrown ('Invalid IBAN was provided'). + * + * @param iban - a Direct or an Indirect IBAN + * @returns - Iban instance + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"); + * > Iban { _iban: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS' } + * ``` + */ + public constructor(iban: string) { + if (Iban.isIndirect(iban) || Iban.isDirect(iban)) { + this._iban = iban; + } else { + throw new Error('Invalid IBAN was provided'); + } + } + + /** + * Convert the passed BBAN to an IBAN for this country specification. + * Please note that "generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account". + * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits + * + * @param bban - the BBAN to convert to IBAN + * @returns an Iban class instance that holds the equivalent IBAN + * + * @example + * ```ts + * web3.eth.Iban.fromBban('ETHXREGGAVOFYORK'); + * > Iban {_iban: "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"} + * ``` + */ + public static fromBban(bban: string): Iban { + const countryCode = 'XE'; + + const remainder = this._mod9710(this._iso13616Prepare(`${countryCode}00${bban}`)); + const checkDigit = `0${(98 - remainder).toString()}`.slice(-2); + + return new Iban(`${countryCode}${checkDigit}${bban}`); + } + + /** + * Should be used to create IBAN object for given institution and identifier + * + * @param options - an object holds the `institution` and the `identifier` which will be composed to create an `Iban` object from. + * @returns an Iban class instance that holds the equivalent IBAN + * + * @example + * ```ts + * web3.eth.Iban.createIndirect({ + * institution: "XREG", + * identifier: "GAVOFYORK" + * }); + * > Iban {_iban: "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"} + * ``` + */ + public static createIndirect(options: IbanOptions): Iban { + return Iban.fromBban(`ETH${options.institution}${options.identifier}`); + } + + /** + * This method should be used to create iban object from an Ethereum address. + * + * @param address - an Ethereum address + * @returns an Iban class instance that holds the equivalent IBAN + * + * @example + * ```ts + * web3.eth.Iban.fromAddress("0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8"); + * > Iban {_iban: "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"} + * ``` + */ + public static fromAddress(address: HexString): Iban { + if (!isAddress(address)) { + throw new InvalidAddressError(address); + } + + const num = BigInt(hexToNumber(address)); + const base36 = num.toString(36); + const padded = leftPad(base36, 15); + return Iban.fromBban(padded.toUpperCase()); + } + + /** + * This method should be used to create an ethereum address from a Direct IBAN address. + * If the provided string was not a direct IBAN (has the length of 34 or 35), an Error will be thrown: + * ('Iban is indirect and cannot be converted. Must be length of 34 or 35'). + * Note: this is also available as a method at an Iban instance. + * + * @param iban - a Direct IBAN address + * @return the equivalent ethereum address + * + * @example + * ```ts + * web3.eth.Iban.toAddress("XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"); + * > "0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8" + * ``` + */ + public static toAddress = (iban: string): HexString => { + const ibanObject = new Iban(iban); + return ibanObject.toAddress(); + }; + + /** + * This method should be used to create the equivalent ethereum address for the early provided Direct IBAN address. + * If the provided string was not a direct IBAN (has the length of 34 or 35), an Error will be thrown: + * ('Iban is indirect and cannot be converted. Must be length of 34 or 35'). + * Note: this is also available as a static method. + * + * @return the equivalent ethereum address + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS"); + * iban.toAddress(); + * > "0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8" + * ``` + */ + public toAddress = (): HexString => { + if (this.isDirect()) { + // check if Iban can be converted to an address + const base36 = this._iban.slice(4); + const parsedBigInt = Iban._parseInt(base36, 36); // convert the base36 string to a bigint + const paddedBigInt = leftPad(parsedBigInt, 40); + return toChecksumAddress(paddedBigInt); + } + throw new Error('Iban is indirect and cannot be converted. Must be length of 34 or 35'); + }; + + /** + * This method should be used to create IBAN address from an Ethereum address + * + * @param address - an Ethereum address + * @return the equivalent IBAN address + * + * @example + * ```ts + * web3.eth.Iban.toIban("0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8"); + * > "XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS" + * ``` + */ + public static toIban(address: HexString): string { + return Iban.fromAddress(address).toString(); + } + + /** + * Should be called to get client identifier within institution + * + * @return the client of the IBAN instance. + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); + * iban.client(); + * > 'GAVOFYORK' + * ``` + */ + public client(): string { + return this.isIndirect() ? this._iban.slice(11) : ''; + } + + /** + * Returns the IBAN checksum of the early provided IBAN + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); + * iban.checksum(); + * > "81" + * ``` + * + */ + public checksum(): string { + return this._iban.slice(2, 4); + } + + /** + * Returns institution identifier from the early provided IBAN + * + * @example + * ```ts + * const iban = new web3.eth.Iban("XE81ETHXREGGAVOFYORK"); + * iban.institution(); + * > 'XREG' + * ``` + */ + public institution(): string { + return this.isIndirect() ? this._iban.slice(7, 11) : ''; + } + + /** + * Simply returns the early provided IBAN + * + * @example + * ```ts + * const iban = new web3.eth.Iban('XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'); + * iban.toString(); + * > 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS' + * ``` + */ + public toString(): string { + return this._iban; + } +} diff --git a/packages/web3-eth-iban/src/index.js b/packages/web3-eth-iban/src/index.js deleted file mode 100644 index 6fdbc99fcb8..00000000000 --- a/packages/web3-eth-iban/src/index.js +++ /dev/null @@ -1,267 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file iban.js - * - * Details: https://github.com/ethereum/wiki/wiki/ICAP:-Inter-exchange-Client-Address-Protocol - * - * @author Marek Kotewicz - * @date 2015 - */ - -"use strict"; - -var utils = require('web3-utils'); -var BigNumber = require('bn.js'); - - -var leftPad = function (string, bytes) { - var result = string; - while (result.length < bytes * 2) { - result = '0' + result; - } - return result; -}; - -/** - * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to - * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616. - * - * @method iso13616Prepare - * @param {String} iban the IBAN - * @returns {String} the prepared IBAN - */ -var iso13616Prepare = function (iban) { - var A = 'A'.charCodeAt(0); - var Z = 'Z'.charCodeAt(0); - - iban = iban.toUpperCase(); - iban = iban.substr(4) + iban.substr(0,4); - - return iban.split('').map(function(n){ - var code = n.charCodeAt(0); - if (code >= A && code <= Z){ - // A = 10, B = 11, ... Z = 35 - return code - A + 10; - } else { - return n; - } - }).join(''); -}; - -/** - * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064. - * - * @method mod9710 - * @param {String} iban - * @returns {Number} - */ -var mod9710 = function (iban) { - var remainder = iban, - block; - - while (remainder.length > 2){ - block = remainder.slice(0, 9); - remainder = parseInt(block, 10) % 97 + remainder.slice(block.length); - } - - return parseInt(remainder, 10) % 97; -}; - -/** - * This prototype should be used to create iban object from iban correct string - * - * @param {String} iban - */ -var Iban = function Iban(iban) { - this._iban = iban; -}; - -/** - * This method should be used to create an ethereum address from a direct iban address - * - * @method toAddress - * @param {String} iban address - * @return {String} the ethereum address - */ -Iban.toAddress = function (ib) { - ib = new Iban(ib); - - if(!ib.isDirect()) { - throw new Error('IBAN is indirect and can\'t be converted'); - } - - return ib.toAddress(); -}; - -/** - * This method should be used to create iban address from an ethereum address - * - * @method toIban - * @param {String} address - * @return {String} the IBAN address - */ -Iban.toIban = function (address) { - return Iban.fromAddress(address).toString(); -}; - -/** - * This method should be used to create iban object from an ethereum address - * - * @method fromAddress - * @param {String} address - * @return {Iban} the IBAN object - */ -Iban.fromAddress = function (address) { - if(!utils.isAddress(address)){ - throw new Error('Provided address is not a valid address: '+ address); - } - - address = address.replace('0x','').replace('0X',''); - - var asBn = new BigNumber(address, 16); - var base36 = asBn.toString(36); - var padded = leftPad(base36, 15); - return Iban.fromBban(padded.toUpperCase()); -}; - -/** - * Convert the passed BBAN to an IBAN for this country specification. - * Please note that "generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account". - * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits - * - * @method fromBban - * @param {String} bban the BBAN to convert to IBAN - * @returns {Iban} the IBAN object - */ -Iban.fromBban = function (bban) { - var countryCode = 'XE'; - - var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban)); - var checkDigit = ('0' + (98 - remainder)).slice(-2); - - return new Iban(countryCode + checkDigit + bban); -}; - -/** - * Should be used to create IBAN object for given institution and identifier - * - * @method createIndirect - * @param {Object} options, required options are "institution" and "identifier" - * @return {Iban} the IBAN object - */ -Iban.createIndirect = function (options) { - return Iban.fromBban('ETH' + options.institution + options.identifier); -}; - -/** - * This method should be used to check if given string is valid iban object - * - * @method isValid - * @param {String} iban string - * @return {Boolean} true if it is valid IBAN - */ -Iban.isValid = function (iban) { - var i = new Iban(iban); - return i.isValid(); -}; - -/** - * Should be called to check if iban is correct - * - * @method isValid - * @returns {Boolean} true if it is, otherwise false - */ -Iban.prototype.isValid = function () { - return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) && - mod9710(iso13616Prepare(this._iban)) === 1; -}; - -/** - * Should be called to check if iban number is direct - * - * @method isDirect - * @returns {Boolean} true if it is, otherwise false - */ -Iban.prototype.isDirect = function () { - return this._iban.length === 34 || this._iban.length === 35; -}; - -/** - * Should be called to check if iban number if indirect - * - * @method isIndirect - * @returns {Boolean} true if it is, otherwise false - */ -Iban.prototype.isIndirect = function () { - return this._iban.length === 20; -}; - -/** - * Should be called to get iban checksum - * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003) - * - * @method checksum - * @returns {String} checksum - */ -Iban.prototype.checksum = function () { - return this._iban.substr(2, 2); -}; - -/** - * Should be called to get institution identifier - * eg. XREG - * - * @method institution - * @returns {String} institution identifier - */ -Iban.prototype.institution = function () { - return this.isIndirect() ? this._iban.substr(7, 4) : ''; -}; - -/** - * Should be called to get client identifier within institution - * eg. GAVOFYORK - * - * @method client - * @returns {String} client identifier - */ -Iban.prototype.client = function () { - return this.isIndirect() ? this._iban.substr(11) : ''; -}; - -/** - * Should be called to get client direct address - * - * @method toAddress - * @returns {String} ethereum address - */ -Iban.prototype.toAddress = function () { - if (this.isDirect()) { - var base36 = this._iban.substr(4); - var asBn = new BigNumber(base36, 36); - return utils.toChecksumAddress(asBn.toString(16, 20)); - } - - return ''; -}; - -Iban.prototype.toString = function () { - return this._iban; -}; - -module.exports = Iban; diff --git a/packages/web3-eth-iban/src/index.ts b/packages/web3-eth-iban/src/index.ts new file mode 100644 index 00000000000..bda252d4eb0 --- /dev/null +++ b/packages/web3-eth-iban/src/index.ts @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Iban } from './iban.js'; + +export * from './iban.js'; +export * from './types.js'; + +export default Iban; diff --git a/packages/web3-eth-iban/src/types.ts b/packages/web3-eth-iban/src/types.ts new file mode 100644 index 00000000000..b563c1ce3c4 --- /dev/null +++ b/packages/web3-eth-iban/src/types.ts @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * An object that could hold the components for an Indirect IBAN (BBAN) + */ +export type IbanOptions = { + institution: string; + identifier: string; +}; diff --git a/packages/web3-eth-iban/test/.eslintrc.js b/packages/web3-eth-iban/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-eth-iban/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-iban/test/config/jest.config.js b/packages/web3-eth-iban/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-eth-iban/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-eth-iban/test/config/setup.js b/packages/web3-eth-iban/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-eth-iban/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-eth-iban/test/fixtures/iban.ts b/packages/web3-eth-iban/test/fixtures/iban.ts new file mode 100644 index 00000000000..a62ba914c62 --- /dev/null +++ b/packages/web3-eth-iban/test/fixtures/iban.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { IbanOptions } from '../../src/types'; + +export const validIbanToAddressData: [string, string][] = [ + ['XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36', '0x8ba1f109551bD432803012645Ac136ddd64DBA72'], + ['XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', '0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8'], + ['XE76LL5FJYLSMDVW5J02HWU6R5ZVPHURYM9', '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01'], + ['XE76LL5FJYLSMDVW5J02HWU6R5ZVPHURYM9', '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01'], +]; + +export const invalidIbanToAddressData: [string, Error][] = [ + [ + 'XE81ETHXREGGAVOFYORK', + new Error('Iban is indirect and cannot be converted. Must be length of 34 or 35'), + ], +]; + +export const invalidAddressData: [string][] = [ + ['0x1'], + ['0xE247a45c287191d435A8a5D72A7C8dc030451E9F'], // Invalid checksum + ['-0x407d73d8a49eeb85d32cf465507dd71d507100c1'], +]; + +export const validFromBbanData: [string, string][] = [['ETHXREGGAVOFYORK', 'XE81ETHXREGGAVOFYORK']]; + +export const validCreateIndirectData: [IbanOptions, string][] = [ + [ + { + institution: 'XREG', + identifier: 'GAVOFYORK', + }, + 'XE81ETHXREGGAVOFYORK', + ], + [ + { + institution: 'XREG', + identifier: 'HELLOWORL', + }, + 'XE48ETHXREGHELLOWORL', + ], +]; + +export const isValidData: [any, boolean][] = [ + ['XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36', true], + ['XE81ETHXREGGAVOFYORK', true], + ['XE48ETHXREGHELLOWORL', true], +]; + +export const isValidStaticData: [any, boolean][] = [ + ...isValidData, + [1, false], // anything that is not a string should return false + [[], false], + [true, false], + [{}, false], + ['ZZ68539007547034', false], // iban must start with the XE + ['BE68539007547034', false], + ['LC55HEMM000100010012001200023015', false], +]; + +export const validIsDirectData: [string, boolean][] = [ + ['XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36', true], + ['XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', true], + ['ZZ68539007547034', false], + ['BE68539007547034', false], +]; + +export const validIsIndirectData: [string, boolean][] = [ + ['XE81ETHXREGGAVOFYORK', true], + ['XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', false], + ['XE81ETHXREGGAVOFYO', false], + ['XE48ETHXREGHELLOWORL', true], +]; + +export const validClientData: [string, string][] = [ + ['XE81ETHXREGGAVOFYORK', 'GAVOFYORK'], + ['XE48ETHXREGHELLOWORL', 'HELLOWORL'], +]; + +export const validChecksumData: [string, string][] = [ + ['XE81ETHXREGGAVOFYORK', '81'], + ['XE48ETHXREGHELLOWORL', '48'], +]; + +export const validInstitutionData: [string, string][] = [ + ['XE81ETHXREGGAVOFYORK', 'XREG'], + ['XE48ETHXREGHELLOWORL', 'XREG'], +]; diff --git a/packages/web3-eth-iban/test/integration/jest.config.js b/packages/web3-eth-iban/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-eth-iban/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-eth-iban/test/integration/setup.js b/packages/web3-eth-iban/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-eth-iban/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth-iban/test/tsconfig.json b/packages/web3-eth-iban/test/tsconfig.json new file mode 120000 index 00000000000..c73c54e77b4 --- /dev/null +++ b/packages/web3-eth-iban/test/tsconfig.json @@ -0,0 +1 @@ +../../../templates/test/tsconfig.json.tmpl \ No newline at end of file diff --git a/packages/web3-eth-iban/test/unit/constructor.test.ts b/packages/web3-eth-iban/test/unit/constructor.test.ts new file mode 100644 index 00000000000..5d08d50bebc --- /dev/null +++ b/packages/web3-eth-iban/test/unit/constructor.test.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// import Web3ProviderBase from '../../src/index' +// import {ProviderOptions} from '../../types' + +describe('constructs a PLACEHOLDER instance with expected properties', () => { + // let providerOptions: ProviderOptions + + beforeEach(() => { + // providerOptions = { + // providerUrl: 'http://127.0.0.1:8545' + // } + }); + + it('should construct with expected properties', () => { + // const web3ProviderBase = new Web3ProviderBase(providerOptions) + // expect(web3ProviderBase).toMatchObject({ + // _providerUrl: providerOptions.providerUrl + // }) + expect(true).toBeTruthy(); + }); +}); diff --git a/packages/web3-eth-iban/test/unit/iban.test.ts b/packages/web3-eth-iban/test/unit/iban.test.ts new file mode 100644 index 00000000000..d7f3f63b90b --- /dev/null +++ b/packages/web3-eth-iban/test/unit/iban.test.ts @@ -0,0 +1,161 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Iban } from '../../src/iban'; +import { + validIbanToAddressData, + validFromBbanData, + invalidIbanToAddressData, + validCreateIndirectData, + isValidData, + validIsDirectData, + validIsIndirectData, + validClientData, + validChecksumData, + validInstitutionData, +} from '../fixtures/iban'; + +describe('iban', () => { + describe('create', () => { + describe('valid cases', () => { + it.each(validIbanToAddressData)('%s', () => { + const iban = new Iban('XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'); + expect(typeof iban).toBe('object'); + }); + }); + }); + + describe('toAddress', () => { + describe('valid cases', () => { + it.each(validIbanToAddressData)('%s', (input, output) => { + const iban = new Iban(input); + expect(iban.toAddress()).toBe(output); + }); + }); + describe('invalid cases', () => { + it.each(invalidIbanToAddressData)('%s', (input, output) => { + const iban = new Iban(input); + expect(() => iban.toAddress()).toThrow(output); + }); + }); + }); + + describe('toAddress static method', () => { + describe('valid cases', () => { + it.each(validIbanToAddressData)('%s', (input, output) => { + expect(Iban.toAddress(input)).toBe(output); + }); + }); + describe('invalid cases', () => { + it.each(invalidIbanToAddressData)('%s', (input, output) => { + expect(() => Iban.toAddress(input)).toThrow(output); + }); + }); + }); + + describe('toIban', () => { + describe('valid cases', () => { + it.each(validIbanToAddressData)('%s', (output, input) => { + expect(Iban.toIban(input)).toBe(output); + }); + }); + }); + + describe('fromAddress', () => { + describe('valid cases', () => { + it.each(validIbanToAddressData)('%s', (output, input) => { + expect(Iban.fromAddress(input).toString()).toBe(output); + }); + }); + }); + + describe('fromBban', () => { + describe('valid cases', () => { + it.each(validFromBbanData)('%s', (input, output) => { + expect(Iban.fromBban(input).toString()).toBe(output); + }); + }); + }); + + describe('createIndirect', () => { + describe('valid cases', () => { + it.each(validCreateIndirectData)('%s', (input, output) => { + expect(Iban.createIndirect(input).toString()).toBe(output); + }); + }); + }); + + describe('isValid', () => { + describe('valid cases', () => { + it.each(isValidData)('%s', (input, output) => { + const iban = new Iban(input); + expect(iban.isValid()).toBe(output); + }); + }); + }); + + describe('isValid static', () => { + describe('valid cases', () => { + it.each(isValidData)('%s', (input, output) => { + expect(Iban.isValid(input)).toBe(output); + }); + }); + }); + + describe('isDirect', () => { + describe('valid cases', () => { + it.each(validIsDirectData)('%s', (input, output) => { + expect(Iban.isValid(input)).toBe(output); + }); + }); + }); + + describe('isIndirect', () => { + describe('valid cases', () => { + it.each(validIsIndirectData)('%s', (input, output) => { + expect(Iban.isIndirect(input)).toBe(output); + }); + }); + }); + + describe('client', () => { + describe('valid cases', () => { + it.each(validClientData)('%s', (input, output) => { + const iban = new Iban(input); + expect(iban.client()).toBe(output); + }); + }); + }); + + describe('institution', () => { + describe('valid cases', () => { + it.each(validInstitutionData)('%s', (input, output) => { + const iban = new Iban(input); + expect(iban.institution()).toBe(output); + }); + }); + }); + + describe('checksum', () => { + describe('valid cases', () => { + it.each(validChecksumData)('%s', (input, output) => { + const iban = new Iban(input); + expect(iban.checksum()).toBe(output); + }); + }); + }); +}); diff --git a/packages/web3-eth-iban/test/unit/jest.config.js b/packages/web3-eth-iban/test/unit/jest.config.js new file mode 100644 index 00000000000..7e869778053 --- /dev/null +++ b/packages/web3-eth-iban/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-eth-iban-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-eth-iban/tsconfig.cjs.json b/packages/web3-eth-iban/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-eth-iban/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-eth-iban/tsconfig.esm.json b/packages/web3-eth-iban/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-eth-iban/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-eth-iban/tsconfig.json b/packages/web3-eth-iban/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-eth-iban/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-eth-iban/tsconfig.types.json b/packages/web3-eth-iban/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-eth-iban/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-eth-iban/tsdoc.json b/packages/web3-eth-iban/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-eth-iban/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth-iban/types/index.d.ts b/packages/web3-eth-iban/types/index.d.ts deleted file mode 100644 index 6890787f65a..00000000000 --- a/packages/web3-eth-iban/types/index.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -export class Iban { - constructor( - iban: string - ) - - static toAddress(iban: string): string; - - static toIban(address: string): string; - - static fromAddress(address: string): Iban; - - static fromBban(bban: string): Iban; - - static createIndirect(options: IndirectOptions): Iban; - - static isValid(iban: string): boolean; - - isValid(): boolean; - - isDirect(): boolean; - - isIndirect(): boolean; - - checksum(): string; - - institution(): string; - - client(): string; - - toAddress(): string; - - toString(): string; -} - -export interface IndirectOptions { - institution: string; - identifier: string; -} diff --git a/packages/web3-eth-iban/types/tests/iban-tests.ts b/packages/web3-eth-iban/types/tests/iban-tests.ts deleted file mode 100644 index 41c921d900b..00000000000 --- a/packages/web3-eth-iban/types/tests/iban-tests.ts +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file iban-tests.ts - * @author Josh Stevens - * @date 2018 - */ - -import { Iban, IndirectOptions } from 'web3-eth-iban'; - -const iban = 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'; -const address = '0x45cd08334aeedd8a06265b2ae302e3597d8faa28'; - -// $ExpectType Iban -const ibanClass = new Iban(iban); - -// $ExpectType boolean -ibanClass.isDirect(); -// $ExpectType boolean -ibanClass.isIndirect(); -// $ExpectType string -ibanClass.checksum(); -// $ExpectType string -ibanClass.institution(); -// $ExpectType string -ibanClass.client(); -// $ExpectType string -ibanClass.toAddress(); -// $ExpectType string -Iban.toAddress(iban); - -// $ExpectError -Iban.toAddress(345); -// $ExpectError -Iban.toAddress({}); -// $ExpectError -Iban.toAddress(true); -// $ExpectError -Iban.toAddress(['string']); -// $ExpectError -Iban.toAddress([4]); -// $ExpectError -Iban.toAddress(null); -// $ExpectError -Iban.toAddress(undefined); - -// $ExpectType string -Iban.toIban(address); - -// $ExpectError -Iban.toIban(345); -// $ExpectError -Iban.toIban({}); -// $ExpectError -Iban.toIban(true); -// $ExpectError -Iban.toIban(['string']); -// $ExpectError -Iban.toIban([4]); -// $ExpectError -Iban.toIban(null); -// $ExpectError -Iban.toIban(undefined); - -// $ExpectType Iban -Iban.fromAddress(address); - -// $ExpectError -Iban.fromAddress(345); -// $ExpectError -Iban.fromAddress({}); -// $ExpectError -Iban.fromAddress(true); -// $ExpectError -Iban.fromAddress(['string']); -// $ExpectError -Iban.fromAddress([4]); -// $ExpectError -Iban.fromAddress(null); -// $ExpectError -Iban.fromAddress(undefined); - -// $ExpectType Iban -Iban.fromBban('ETHXREGGAVOFYORK'); - -// $ExpectError -Iban.fromBban(345); -// $ExpectError -Iban.fromBban({}); -// $ExpectError -Iban.fromBban(true); -// $ExpectError -Iban.fromBban(['string']); -// $ExpectError -Iban.fromBban([4]); -// $ExpectError -Iban.fromBban(null); -// $ExpectError -Iban.fromBban(undefined); - -const indirectOptions: IndirectOptions = { - institution: 'XREG', - identifier: 'GAVOFYORK' -}; - -// $ExpectType Iban -Iban.createIndirect(indirectOptions); - -// $ExpectError -Iban.createIndirect(345); -// $ExpectError -Iban.createIndirect('string'); -// $ExpectError -Iban.createIndirect(true); -// $ExpectError -Iban.createIndirect(['string']); -// $ExpectError -Iban.createIndirect([4]); -// $ExpectError -Iban.createIndirect(null); -// $ExpectError -Iban.createIndirect(undefined); - -// $ExpectType boolean -Iban.isValid(iban); - -// $ExpectError -Iban.isValid(345); -// $ExpectError -Iban.isValid({}); -// $ExpectError -Iban.isValid(true); -// $ExpectError -Iban.isValid(['string']); -// $ExpectError -Iban.isValid([4]); -// $ExpectError -Iban.isValid(null); -// $ExpectError -Iban.isValid(undefined); diff --git a/packages/web3-eth-iban/types/tsconfig.json b/packages/web3-eth-iban/types/tsconfig.json deleted file mode 100644 index 306c438b694..00000000000 --- a/packages/web3-eth-iban/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth-iban": ["."] - } - } -} diff --git a/packages/web3-eth-iban/types/tslint.json b/packages/web3-eth-iban/types/tslint.json deleted file mode 100644 index dc95ea202b8..00000000000 --- a/packages/web3-eth-iban/types/tslint.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false - } -} diff --git a/packages/web3-eth-personal/.eslintignore b/packages/web3-eth-personal/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-eth-personal/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-personal/.eslintrc.js b/packages/web3-eth-personal/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-eth-personal/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-personal/.gitignore b/packages/web3-eth-personal/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-eth-personal/.npmignore b/packages/web3-eth-personal/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-eth-personal/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-eth-personal/.prettierignore b/packages/web3-eth-personal/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-eth-personal/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth-personal/.prettierrc.json b/packages/web3-eth-personal/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-eth-personal/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-eth-personal/CHANGELOG.md b/packages/web3-eth-personal/CHANGELOG.md new file mode 100644 index 00000000000..aba75cae036 --- /dev/null +++ b/packages/web3-eth-personal/CHANGELOG.md @@ -0,0 +1,150 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Added + +- `web3-rpc-methods` dependency (#5441) + +### Changed + +- Import `EthPersonalAPI` from `web3-types` instead of local import (#5441) +- Replace the imported methods from `rcp_methods.ts` with `personalRpcMethods` imports from `web3-rpc-methods` (#5441) +- Replace use of `EthPersonalAPIManager` with `Web3RequestManager` (#5441) + +### Removed + +- Exported type `EthPersonalAPIManager`, `EthPersonalAPI` is not exported via `web3-types` (#5441) + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Changed + +- Updated dependencies (#5912) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [4.0.1-rc.2] + +### Changed + +- Dependencies updated + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Changed + +- Dependencies updated + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Changed + +- Dependencies updated + +## [4.0.7] + +### Changed + +- Dependencies updated + +## [4.0.8] + +### Changed + +- Dependencies updated + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-eth-personal/README.md b/packages/web3-eth-personal/README.md index 1ff2a56a424..857d97d88f2 100644 --- a/packages/web3-eth-personal/README.md +++ b/packages/web3-eth-personal/README.md @@ -1,38 +1,59 @@ -# web3-eth-personal +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Web3-Eth-Personal -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This is the personal package used in the `web3-eth` package. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-eth-personal` Web3 module to interact with the Ethereum blockchain accounts stored in the node. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-eth-personal) or using [Yarn](https://yarnpkg.com/package/web3-eth-personal) + +### Using NPM ```bash npm install web3-eth-personal ``` -## Usage +### Using Yarn -```js -const Web3EthPersonal = require('web3-eth-personal'); - -const personal = new Web3EthPersonal('ws://localhost:8546'); +```bash +yarn add web3-eth-personal ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-eth-personal.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-eth-personal +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-personal%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-eth-personal -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-eth-personal -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-eth-personal -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-eth-personal -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-eth-personal +[downloads-image]: https://img.shields.io/npm/dm/web3-eth-personal?label=npm%20downloads diff --git a/packages/web3-eth-personal/assets/logo/web3js.ai b/packages/web3-eth-personal/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth-personal/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth-personal/assets/logo/web3js.jpg b/packages/web3-eth-personal/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth-personal/assets/logo/web3js.jpg differ diff --git a/packages/web3-eth-personal/assets/logo/web3js.svg b/packages/web3-eth-personal/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth-personal/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth-personal/package-lock.json b/packages/web3-eth-personal/package-lock.json deleted file mode 100644 index 07a67fb6ee9..00000000000 --- a/packages/web3-eth-personal/package-lock.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "web3-eth-personal", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==" - }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - } - } -} diff --git a/packages/web3-eth-personal/package.json b/packages/web3-eth-personal/package.json index a1ab1d9a038..4be584d822a 100644 --- a/packages/web3-eth-personal/package.json +++ b/packages/web3-eth-personal/package.json @@ -1,28 +1,67 @@ { - "name": "web3-eth-personal", - "version": "1.3.0", - "description": "Web3 module to interact with the Ethereum blockchain accounts stored in the node.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth-personal", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-eth-personal", + "version": "4.0.8", + "description": "Web3 module to interact with the Ethereum blockchain accounts stored in the node.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js" + }, + "dependencies": { + "web3-core": "^4.3.0", + "web3-eth": "^4.3.1", + "web3-rpc-methods": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7", + "web3-validator": "^2.0.3" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4", + "web3-providers-ws": "^4.0.7" + } } diff --git a/packages/web3-eth-personal/src/index.js b/packages/web3-eth-personal/src/index.js deleted file mode 100644 index ab27b1ef4aa..00000000000 --- a/packages/web3-eth-personal/src/index.js +++ /dev/null @@ -1,150 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var core = require('web3-core'); -var Method = require('web3-core-method'); -var utils = require('web3-utils'); -var Net = require('web3-net'); - -var formatters = require('web3-core-helpers').formatters; - - -var Personal = function Personal() { - var _this = this; - - // sets _requestmanager - core.packageInit(this, arguments); - - this.net = new Net(this); - - var defaultAccount = null; - var defaultBlock = 'latest'; - - Object.defineProperty(this, 'defaultAccount', { - get: function () { - return defaultAccount; - }, - set: function (val) { - if(val) { - defaultAccount = utils.toChecksumAddress(formatters.inputAddressFormatter(val)); - } - - // update defaultBlock - methods.forEach(function(method) { - method.defaultAccount = defaultAccount; - }); - - return val; - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultBlock', { - get: function () { - return defaultBlock; - }, - set: function (val) { - defaultBlock = val; - - // update defaultBlock - methods.forEach(function(method) { - method.defaultBlock = defaultBlock; - }); - - return val; - }, - enumerable: true - }); - - - var methods = [ - new Method({ - name: 'getAccounts', - call: 'personal_listAccounts', - params: 0, - outputFormatter: utils.toChecksumAddress - }), - new Method({ - name: 'newAccount', - call: 'personal_newAccount', - params: 1, - inputFormatter: [null], - outputFormatter: utils.toChecksumAddress - }), - new Method({ - name: 'unlockAccount', - call: 'personal_unlockAccount', - params: 3, - inputFormatter: [formatters.inputAddressFormatter, null, null] - }), - new Method({ - name: 'lockAccount', - call: 'personal_lockAccount', - params: 1, - inputFormatter: [formatters.inputAddressFormatter] - }), - new Method({ - name: 'importRawKey', - call: 'personal_importRawKey', - params: 2 - }), - new Method({ - name: 'sendTransaction', - call: 'personal_sendTransaction', - params: 2, - inputFormatter: [formatters.inputTransactionFormatter, null] - }), - new Method({ - name: 'signTransaction', - call: 'personal_signTransaction', - params: 2, - inputFormatter: [formatters.inputTransactionFormatter, null] - }), - new Method({ - name: 'sign', - call: 'personal_sign', - params: 3, - inputFormatter: [formatters.inputSignFormatter, formatters.inputAddressFormatter, null] - }), - new Method({ - name: 'ecRecover', - call: 'personal_ecRecover', - params: 2, - inputFormatter: [formatters.inputSignFormatter, null] - }) - ]; - methods.forEach(function(method) { - method.attachToObject(_this); - method.setRequestManager(_this._requestManager); - method.defaultBlock = _this.defaultBlock; - method.defaultAccount = _this.defaultAccount; - }); -}; - -core.addProviders(Personal); - - - -module.exports = Personal; - - diff --git a/packages/web3-eth-personal/src/index.ts b/packages/web3-eth-personal/src/index.ts new file mode 100644 index 00000000000..62576d7bae1 --- /dev/null +++ b/packages/web3-eth-personal/src/index.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The `web3-eth-personal` package allows you to interact with the Ethereum node’s accounts. + * + * **_NOTE:_** Many of these functions send sensitive information like passwords. Never call these functions over a unsecured Websocket or HTTP provider, as your password will be sent in plain text! + * + * import Personal from 'web3-eth-personal'; + * + * const personal = new Personal('http://localhost:8545'); + * + * or using the web3 umbrella package + * + * import Personal from 'web3-eth-personal'; + * const web3 = new Web3('http://localhost:8545'); + * // web3.eth.personal + */ +/** + * This comment _supports3_ [Markdown](https://marked.js.org/) + */ +import { Personal } from './personal.js'; + +export * from './personal.js'; + +export default Personal; diff --git a/packages/web3-eth-personal/src/personal.ts b/packages/web3-eth-personal/src/personal.ts new file mode 100644 index 00000000000..14bee669d6f --- /dev/null +++ b/packages/web3-eth-personal/src/personal.ts @@ -0,0 +1,249 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context } from 'web3-core'; +import { Address, EthPersonalAPI, HexString, Transaction } from 'web3-types'; + +import * as rpcWrappers from './rpc_method_wrappers.js'; + +/** +* Eth Personal allows you to interact with the Ethereum node’s accounts. +* For using Eth Personal package, first install Web3 package using: `npm i web3` or `yarn add web3` based on your package manager. +* ```ts +* +*import { Web3 } from 'web3'; +* const web3 = new Web3('http://127.0.0.1:7545'); +* +* console.log(await web3.eth.personal.getAccounts()); +* +* ``` +* For using individual package install `web3-eth-personal` packages using: `npm i web3-eth-personal` or `yarn add web3-eth-personal`. +* +* ```ts +* import {Personal} from 'web3-eth-personal'; +* +* const personal = new Personal('http://127.0.0.1:7545'); +* console.log(await personal.getAccounts()); +* ``` +*/ +export class Personal extends Web3Context { + /** + *Returns a list of accounts the node controls by using the provider and calling the RPC method personal_listAccounts. Using `web3.eth.accounts.create()` will not add accounts into this list. For that use `web3.eth.personal.newAccount()`. + * @returns - An array of addresses controlled by the node. + * @example + * ```ts + * const accounts = await personal.getAccounts(); + * console.log(accounts); + * > + * [ + * '0x79D7BbaC53C9aF700d0B250e9AE789E503Fcd6AE', + * '0xe2597eB05CF9a87eB1309e86750C903EC38E527e', + * '0x7eD0e85B8E1E925600B4373e6d108F34AB38a401', + * '0xE4bEEf667408b99053dC147Ed19592aDa0d77F59', + * '0x7AB80aeB6bb488B7f6c41c58e83Ef248eB39c882', + * '0x12B1D9d74d73b1C3A245B19C1C5501c653aF1af9', + * '0x1a6075A263Ee140e00Dbf8E374Fc5A443d097894', + * '0x4FEC0A51024B13030D26E70904B066C6d41157A5', + * '0x03095dc4857BB26f3a4550c5651Df8b7f6b6B1Ef', + * '0xac0B9b6e8A17991cb172B2ABAF45Fb5eb769E540' + * ] + * ``` + */ + public async getAccounts() { + return rpcWrappers.getAccounts(this.requestManager); + } + + /** + * Creates a new account and returns its address. + * **_NOTE:_** This function sends a sensitive information like password. Never call this function over a unsecured Websocket or HTTP provider, as your password will be sent in plain text! + * @param password - The password to encrypt the account with. + * @returns - The address of the new account. + * @example + * ```ts + * const addr = await web3.eth.personal.newAccount('password'); + * console.log(addr); + * > '0x1234567891011121314151617181920212223456' + * ``` + */ + public async newAccount(password: string) { + return rpcWrappers.newAccount(this.requestManager, password); + } + + /** + * Unlocks an account for a given duration. + * @param address - The address of the account to unlock. + * @param password - The password of the account to unlock. + * @param unlockDuration - The duration in seconds to unlock the account for. + * @example + * ```ts + * await personal.unlockAccount( + * "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e", + * "123456", + * 600 + * ); + * ``` + */ + public async unlockAccount(address: Address, password: string, unlockDuration: number) { + return rpcWrappers.unlockAccount(this.requestManager, address, password, unlockDuration); + } + /** + * Locks the given account + * @param address - The address of the account to lock. + * @returns - `true` if the account was locked, otherwise `false`. + * @example + * ```ts + * await personal.lockAccount( + * "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e" + * ); + * ``` + */ + public async lockAccount(address: Address) { + return rpcWrappers.lockAccount(this.requestManager, address); + } + /** + * Imports the given private key into the key store, encrypting it with the passphrase. + * @param keyData - An unencrypted private key (hex string). + * @param passphrase - The password of the account + * @returns - The address of the new account. + * @example + * ```ts + * const accountAddress = await personal.importRawKey( + * "abe40cb08850da918ee951b237fa87946499b2d8643e4aa12b0610b050c731f6", + * "123456" + * ); + * + * console.log(unlockTx); + * > 0x8727a8b34ec833154b72b62cac05d69f86eb6556 + * ``` + */ + public async importRawKey(keyData: HexString, passphrase: string) { + return rpcWrappers.importRawKey(this.requestManager, keyData, passphrase); + } + + /** + * This method sends a transaction over the management API. + * **_NOTE:_** Sending your account password over an unsecured HTTP RPC connection is highly unsecure. + * @param tx - The transaction options + * @param passphrase - The passphrase of the current account + * @returns - The transaction hash + * @example + * ```ts + * const txHash = personal + * .sendTransaction({ + * from: "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e", + * gasPrice: "20000000000", + * gas: "21000", + * to: "0x3535353535353535353535353535353535353535", + * value: "1000000", + * data: "", + * nonce: 0, + * }, + * "123456"); + * + * console.log(txHash); + * > 0x9445325c3c5638c9fe425b003b8c32f03e9f99d409555a650a6838ba712bb51b + * ``` + */ + public async sendTransaction(tx: Transaction, passphrase: string) { + return rpcWrappers.sendTransaction(this.requestManager, tx, passphrase); + } + /** + * Signs a transaction. This account needs to be unlocked. + * **_NOTE:_** Sending your account password over an unsecured HTTP RPC connection is highly unsecure. + * @param tx - The transaction data to sign. See sendTransaction for more information. + * @param passphrase - The password of the `from` account, to sign the transaction with. + * @returns - The RLP encoded transaction. The `raw` property can be used to send the transaction using sendSignedTransaction. + * @example + * ```ts + * const tx = personal + * .signTransaction({ + * from: "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e", + * gasPrice: "20000000000", + * gas: "21000", + * to: "0x3535353535353535353535353535353535353535", + * value: "1000000000000000000", + * data: "", + * nonce: 0, + * }, + * "123456"); + * + * console.log(tx); + * + * > { + * raw: '0xf86e808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a764000080820a95a0c951c03238fe930e6e69ab9d6af9f29248a514048e44884f0e60c4de40de3526a038b71399bf0c8925749ab79e91ce6cd2fc068c84c18ff6a197b48c4cbef01e00', + * tx: { + * type: '0x0', + * nonce: '0x0', + * gasPrice: '0x4a817c800', + * maxPriorityFeePerGas: null, + * maxFeePerGas: null, + * gas: '0x5208', + * value: '0xde0b6b3a7640000', + * input: '0x', + * v: '0xa95', + * r: '0xc951c03238fe930e6e69ab9d6af9f29248a514048e44884f0e60c4de40de3526', + * s: '0x38b71399bf0c8925749ab79e91ce6cd2fc068c84c18ff6a197b48c4cbef01e00', + * to: '0x3535353535353535353535353535353535353535', + * hash: '0x65e3df790ab2a32068b13cff970b26445b8995229ae4abbed61bd996f09fce69' + * } + * } + * ``` + */ + public async signTransaction(tx: Transaction, passphrase: string) { + return rpcWrappers.signTransaction(this.requestManager, tx, passphrase); + } + /** + * Calculates an Ethereum specific signature with: + * sign(keccak256("\x19Ethereum Signed Message:\n" + dataToSign.length + dataToSign))) + * Adding a prefix to the message makes the calculated signature recognisable as an Ethereum specific signature. + * + * If you have the original message and the signed message, you can discover the signing account address using web3.eth.personal.ecRecover + * **_NOTE:_** Sending your account password over an unsecured HTTP RPC connection is highly unsecure. + * @param data - The data to sign. + * @param address - The address to sign with. + * @param passphrase - The passphrase to decrypt the account with. + * @returns - The signature. + * @example + * ```ts + * const sig = await personal.sign("Hello world", "0x0D4Aa485ECbC499c70860fEb7e5AaeAf5fd8172E", "123456") + * console.log(sig) + * > 0x5d21d01b3198ac34d0585a9d76c4d1c8123e5e06746c8962318a1c08ffb207596e6fce4a6f377b7c0fc98c5f646cd73438c80e8a1a95cbec55a84c2889dca0301b + * ``` + */ + public async sign(data: HexString, address: Address, passphrase: string) { + return rpcWrappers.sign(this.requestManager, data, address, passphrase); + } + + /** + * Recovers the account that signed the data. + * @param signedData - Data that was signed. If String it will be converted using {@link utf8ToHex} + * @param signature - The signature + * @returns - The address of the account that signed the data. + * @example + * ```ts + * const address = await personal.ecRecover( + * "Hello world", + * "0x5d21d01b3198ac34d0585a9d76c4d1c8123e5e06746c8962318a1c08ffb207596e6fce4a6f377b7c0fc98c5f646cd73438c80e8a1a95cbec55a84c2889dca0301b" + * ); + * console.log(address); + * > 0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e + * ``` + */ + public async ecRecover(signedData: HexString, signature: string) { + return rpcWrappers.ecRecover(this.requestManager, signedData, signature); + } +} diff --git a/packages/web3-eth-personal/src/rpc_method_wrappers.ts b/packages/web3-eth-personal/src/rpc_method_wrappers.ts new file mode 100644 index 00000000000..51491714881 --- /dev/null +++ b/packages/web3-eth-personal/src/rpc_method_wrappers.ts @@ -0,0 +1,114 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3RequestManager } from 'web3-core'; +import { toChecksumAddress, utf8ToHex } from 'web3-utils'; +import { formatTransaction } from 'web3-eth'; +import { Address, EthPersonalAPI, ETH_DATA_FORMAT, HexString, Transaction } from 'web3-types'; +import { validator, isHexStrict } from 'web3-validator'; +import { personalRpcMethods } from 'web3-rpc-methods'; + +export const getAccounts = async (requestManager: Web3RequestManager) => { + const result = await personalRpcMethods.getAccounts(requestManager); + + return result.map(toChecksumAddress); +}; + +export const newAccount = async ( + requestManager: Web3RequestManager, + password: string, +) => { + validator.validate(['string'], [password]); + + const result = await personalRpcMethods.newAccount(requestManager, password); + + return toChecksumAddress(result); +}; + +export const unlockAccount = async ( + requestManager: Web3RequestManager, + address: Address, + password: string, + unlockDuration: number, +) => { + validator.validate(['address', 'string', 'uint'], [address, password, unlockDuration]); + + return personalRpcMethods.unlockAccount(requestManager, address, password, unlockDuration); +}; + +export const lockAccount = async ( + requestManager: Web3RequestManager, + address: Address, +) => { + validator.validate(['address'], [address]); + + return personalRpcMethods.lockAccount(requestManager, address); +}; + +export const importRawKey = async ( + requestManager: Web3RequestManager, + keyData: HexString, + passphrase: string, +) => { + validator.validate(['string', 'string'], [keyData, passphrase]); + + return personalRpcMethods.importRawKey(requestManager, keyData, passphrase); +}; + +export const sendTransaction = async ( + requestManager: Web3RequestManager, + tx: Transaction, + passphrase: string, +) => { + const formattedTx = formatTransaction(tx, ETH_DATA_FORMAT); + + return personalRpcMethods.sendTransaction(requestManager, formattedTx, passphrase); +}; + +export const signTransaction = async ( + requestManager: Web3RequestManager, + tx: Transaction, + passphrase: string, +) => { + const formattedTx = formatTransaction(tx, ETH_DATA_FORMAT); + + return personalRpcMethods.signTransaction(requestManager, formattedTx, passphrase); +}; + +export const sign = async ( + requestManager: Web3RequestManager, + data: HexString, + address: Address, + passphrase: string, +) => { + validator.validate(['string', 'address', 'string'], [data, address, passphrase]); + + const dataToSign = isHexStrict(data) ? data : utf8ToHex(data); + + return personalRpcMethods.sign(requestManager, dataToSign, address, passphrase); +}; + +export const ecRecover = async ( + requestManager: Web3RequestManager, + signedData: HexString, + signature: string, +) => { + validator.validate(['string', 'string'], [signedData, signature]); + + const signedDataString = isHexStrict(signedData) ? signedData : utf8ToHex(signedData); + + return personalRpcMethods.ecRecover(requestManager, signedDataString, signature); +}; diff --git a/packages/web3-eth-personal/test/.eslintrc.js b/packages/web3-eth-personal/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-eth-personal/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth-personal/test/config/jest.config.js b/packages/web3-eth-personal/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3-eth-personal/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-eth-personal/test/config/setup.js b/packages/web3-eth-personal/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-eth-personal/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-eth-personal/test/fixtures/accounts.json b/packages/web3-eth-personal/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-eth-personal/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-eth-personal/test/fixtures/system_test_utils.ts b/packages/web3-eth-personal/test/fixtures/system_test_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-eth-personal/test/fixtures/system_test_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-eth-personal/test/integration/jest.config.js b/packages/web3-eth-personal/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-eth-personal/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-eth-personal/test/integration/personal.test.ts b/packages/web3-eth-personal/test/integration/personal.test.ts new file mode 100644 index 00000000000..d650bdc6e8b --- /dev/null +++ b/packages/web3-eth-personal/test/integration/personal.test.ts @@ -0,0 +1,142 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { EthPersonalAPI, SupportedProviders } from 'web3-types'; +import { toChecksumAddress } from 'web3-utils'; +import { isHexStrict } from 'web3-validator'; +import { Personal } from '../../src/index'; +import { + closeOpenConnection, + createAccount, + createNewAccount, + createTempAccount, + getSystemTestBackend, + getSystemTestProvider, + itIf, + describeIf, + BACKEND +} from '../fixtures/system_test_utils'; + +// hardhat does not support personal +describeIf(getSystemTestBackend() !== BACKEND.HARDHAT)('personal integration tests', () => { + let ethPersonal: Personal; + let clientUrl: string | SupportedProviders; + + beforeAll(() => { + clientUrl = getSystemTestProvider(); + ethPersonal = new Personal(clientUrl); + }); + + afterAll(async () => { + await closeOpenConnection(ethPersonal); + }); + + test('new account', async () => { + const newAccount = await ethPersonal.newAccount('!@superpassword'); + expect(isHexStrict(newAccount)).toBe(true); + }); + + itIf(getSystemTestBackend() === BACKEND.GETH)('ecRecover', async () => { + const password = '123456'; + const acc = (await createTempAccount({ password })).address; + // ganache does not support ecRecover + const signature = await ethPersonal.sign('0x2313', acc, password); + const publicKey = await ethPersonal.ecRecover('0x2313', signature); // ecRecover is returning all lowercase + // eslint-disable-next-line jest/no-standalone-expect + expect(toChecksumAddress(publicKey)).toBe(toChecksumAddress(acc)); + }); + + test('lock account', async () => { + const { address } = await createTempAccount(); + const lockAccount = await ethPersonal.lockAccount(address); + expect(lockAccount).toBe(true); + + const from = address; + const tx = { + from, + to: '0x1337C75FdF978ABABaACC038A1dCd580FeC28ab2', + value: `0`, + gas: '21000', + maxFeePerGas: '0x59682F00', + maxPriorityFeePerGas: '0x1DCD6500', + }; + // locked accounts will error + await expect(ethPersonal.sendTransaction(tx, '')).rejects.toThrow(); + }); + + test('unlock account', async () => { + const { address } = await createTempAccount(); + const unlockedAccount = await ethPersonal.unlockAccount(address, '123456', 1000); + expect(unlockedAccount).toBe(true); + + const tx = { + from: address, + to: '0x1337C75FdF978ABABaACC038A1dCd580FeC28ab2', + value: `0`, + gas: '21000', + maxFeePerGas: '0x59682F00', + maxPriorityFeePerGas: '0x1DCD6500', + }; + const receipt = await ethPersonal.sendTransaction(tx, '123456'); + + expect(isHexStrict(receipt)).toBe(true); + }); + + // ganache does not support sign + itIf(getSystemTestBackend() === BACKEND.GETH)('sign', async () => { + const password = '123456'; + const key = (await createTempAccount({ password })).address; + await ethPersonal.unlockAccount(key, password, 100000); + const signature = await ethPersonal.sign('0xdeadbeaf', key, password); + const address = await ethPersonal.ecRecover('0xdeadbeaf', signature); + // eslint-disable-next-line jest/no-standalone-expect + expect(key).toBe(address); + }); + + test('getAccounts', async () => { + const accountList = await ethPersonal.getAccounts(); + // create a new account + await ethPersonal.newAccount('cde'); + const updatedAccountList = await ethPersonal.getAccounts(); + expect(updatedAccountList.length).toBeGreaterThan(accountList.length); + }); + + test('importRawKey', async () => { + const { address, privateKey } = createAccount(); + const rawKey = getSystemTestBackend() === BACKEND.GETH ? privateKey.slice(2) : privateKey; + const key = await ethPersonal.importRawKey(rawKey, '123456'); + expect(toChecksumAddress(key).toLowerCase()).toBe(address.toLowerCase()); + }); + + test('sendTransaction', async () => { + const from = (await createNewAccount({ unlock: true, refill: true })).address; + + const unlockedAccount = await ethPersonal.unlockAccount(from, '123456', 1000); + expect(unlockedAccount).toBe(true); + + const tx = { + from, + to: '0x1337C75FdF978ABABaACC038A1dCd580FeC28ab2', + value: `0`, + gas: '21000', + maxFeePerGas: '0x59682F00', + maxPriorityFeePerGas: '0x1DCD6500', + }; + const receipt = await ethPersonal.sendTransaction(tx, '123456'); + + expect(isHexStrict(receipt)).toBe(true); + }); +}); diff --git a/packages/web3-eth-personal/test/integration/setup.js b/packages/web3-eth-personal/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-eth-personal/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth-personal/test/tsconfig.json b/packages/web3-eth-personal/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-eth-personal/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-eth-personal/test/unit/eth_personal.test.ts b/packages/web3-eth-personal/test/unit/eth_personal.test.ts new file mode 100644 index 00000000000..fc2d545da10 --- /dev/null +++ b/packages/web3-eth-personal/test/unit/eth_personal.test.ts @@ -0,0 +1,320 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ETH_DATA_FORMAT } from 'web3-types'; +import * as utils from 'web3-utils'; +import * as eth from 'web3-eth'; +import * as validator from 'web3-validator'; +import { Personal } from '../../src/index'; + +jest.mock('web3-utils'); +jest.mock('web3-eth'); +jest.mock('web3-validator'); +describe('Personal', () => { + let personal: Personal; + let sendSpy: jest.SpyInstance; + let validateSpy: jest.SpyInstance; + beforeEach(() => { + personal = new Personal('http://localhost:8545'); + + sendSpy = jest.spyOn(personal.requestManager, 'send').mockImplementation(async () => { + return Promise.resolve('0x0'); + }); + + validateSpy = jest.spyOn(validator.validator, 'validate').mockReturnValue(undefined); + + jest.resetAllMocks(); + }); + + describe('getAccounts', () => { + it('should call the correct method for request manager', async () => { + sendSpy.mockResolvedValue(['0x528ABBBa47c33600245066398072799A9b7e2d9E']); + + await personal.getAccounts(); + + expect(sendSpy).toHaveBeenCalledWith({ method: 'personal_listAccounts', params: [] }); + }); + + it('should format return with toChecksumAddress', async () => { + const result = ['0x528ABBBa47c33600245066398072799A9b7e2d9E']; + sendSpy.mockResolvedValue(result); + + await personal.getAccounts(); + + expect(utils.toChecksumAddress).toHaveBeenCalledTimes(1); + expect(utils.toChecksumAddress).toHaveBeenCalledWith(result[0], 0, result); + }); + }); + + describe('newAccount', () => { + it('should call the correct method for request manager', async () => { + await personal.newAccount('password'); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_newAccount', + params: ['password'], + }); + }); + + it('should validate user input', async () => { + await personal.newAccount('password'); + + expect(validateSpy).toHaveBeenCalledTimes(1); + expect(validateSpy).toHaveBeenCalledWith(['string'], ['password']); + }); + + it('should format return with toChecksumAddress', async () => { + const result = '0x528ABBBa47c33600245066398072799A9b7e2d9E'; + sendSpy.mockResolvedValue(result); + + await personal.newAccount('password'); + + expect(utils.toChecksumAddress).toHaveBeenCalledTimes(1); + expect(utils.toChecksumAddress).toHaveBeenCalledWith(result); + }); + }); + + describe('unlockAccount', () => { + it('should call the correct method for request manager', async () => { + await personal.unlockAccount( + '0x528ABBBa47c33600245066398072799A9b7e2d9E', + 'password', + 30, + ); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_unlockAccount', + params: ['0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password', 30], + }); + }); + + it('should validate user input', async () => { + await personal.unlockAccount( + '0x528ABBBa47c33600245066398072799A9b7e2d9E', + 'password', + 30, + ); + + expect(validateSpy).toHaveBeenCalledTimes(1); + expect(validateSpy).toHaveBeenCalledWith( + ['address', 'string', 'uint'], + ['0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password', 30], + ); + }); + }); + + describe('lockAccount', () => { + it('should call the correct method for request manager', async () => { + await personal.lockAccount('0x528ABBBa47c33600245066398072799A9b7e2d9E'); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_lockAccount', + params: ['0x528ABBBa47c33600245066398072799A9b7e2d9E'], + }); + }); + + it('should validate user input', async () => { + await personal.lockAccount('0x528ABBBa47c33600245066398072799A9b7e2d9E'); + + expect(validateSpy).toHaveBeenCalledTimes(1); + expect(validateSpy).toHaveBeenCalledWith( + ['address'], + ['0x528ABBBa47c33600245066398072799A9b7e2d9E'], + ); + }); + }); + + describe('importRawKey', () => { + it('should call the correct method for request manager', async () => { + await personal.importRawKey('0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_importRawKey', + params: ['0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'], + }); + }); + + it('should validate user input', async () => { + await personal.importRawKey('0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'); + + expect(validateSpy).toHaveBeenCalledTimes(1); + expect(validateSpy).toHaveBeenCalledWith( + ['string', 'string'], + ['0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'], + ); + }); + }); + + describe('sendTransaction', () => { + it('should call the correct method for request manager', async () => { + const tx = { + from: '0x528ABBBa47c33600245066398072799A9b7e2d9E', + to: '0x9988BBBa47c33600245066398072799A9b7e2d9E', + }; + jest.spyOn(eth, 'formatTransaction').mockReturnValue(tx); + + await personal.sendTransaction(tx, 'password'); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_sendTransaction', + params: [tx, 'password'], + }); + }); + + it('should format user input', async () => { + const tx = { + from: '0x528ABBBa47c33600245066398072799A9b7e2d9E', + to: '0x9988BBBa47c33600245066398072799A9b7e2d9E', + }; + jest.spyOn(eth, 'formatTransaction').mockReturnValue(tx); + + await personal.sendTransaction(tx, 'password'); + + expect(eth.formatTransaction).toHaveBeenCalledTimes(1); + expect(eth.formatTransaction).toHaveBeenCalledWith(tx, ETH_DATA_FORMAT); + }); + }); + + describe('signTransaction', () => { + it('should call the correct method for request manager', async () => { + const tx = { + from: '0x528ABBBa47c33600245066398072799A9b7e2d9E', + to: '0x9988BBBa47c33600245066398072799A9b7e2d9E', + }; + jest.spyOn(eth, 'formatTransaction').mockReturnValue(tx); + + await personal.signTransaction(tx, 'password'); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_signTransaction', + params: [tx, 'password'], + }); + }); + + it('should format user input', async () => { + const tx = { + from: '0x528ABBBa47c33600245066398072799A9b7e2d9E', + to: '0x9988BBBa47c33600245066398072799A9b7e2d9E', + }; + jest.spyOn(eth, 'formatTransaction').mockReturnValue(tx); + + await personal.signTransaction(tx, 'password'); + + expect(eth.formatTransaction).toHaveBeenCalledTimes(1); + expect(eth.formatTransaction).toHaveBeenCalledWith(tx, ETH_DATA_FORMAT); + }); + }); + + describe('sign', () => { + it('should call the correct method for request manager', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(true); + + await personal.sign(data, '0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_sign', + params: ['0x1234', '0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'], + }); + }); + + it('should convert input if not hex', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(false); + jest.spyOn(utils, 'utf8ToHex').mockReturnValue(data); + + await personal.sign(data, '0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'); + + expect(utils.utf8ToHex).toHaveBeenCalledTimes(1); + expect(utils.utf8ToHex).toHaveBeenCalledWith(data); + }); + + it('should not convert input if data is already hex', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(true); + + await personal.sign(data, '0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'); + + expect(utils.utf8ToHex).toHaveBeenCalledTimes(0); + }); + + it('should validate user input', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(true); + + await personal.sign(data, '0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'); + + expect(validateSpy).toHaveBeenCalledTimes(1); + expect(validateSpy).toHaveBeenCalledWith( + ['string', 'address', 'string'], + [data, '0x528ABBBa47c33600245066398072799A9b7e2d9E', 'password'], + ); + }); + }); + + describe('ecRecover', () => { + it('should call the correct method for request manager', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(true); + + await personal.ecRecover(data, '0x000000'); + + expect(sendSpy).toHaveBeenCalledWith({ + method: 'personal_ecRecover', + params: [data, '0x000000'], + }); + }); + + it('should convert input if not hex', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(false); + jest.spyOn(utils, 'utf8ToHex').mockReturnValue(data); + + await personal.ecRecover(data, 'password'); + + expect(utils.utf8ToHex).toHaveBeenCalledTimes(1); + expect(utils.utf8ToHex).toHaveBeenCalledWith(data); + }); + + it('should not convert input if data is already hex', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(true); + + await personal.ecRecover(data, 'password'); + + expect(utils.utf8ToHex).toHaveBeenCalledTimes(0); + }); + + it('should validate user input', async () => { + const data = '0x1234'; + + jest.spyOn(validator, 'isHexStrict').mockReturnValue(true); + + await personal.ecRecover(data, 'password'); + + expect(validateSpy).toHaveBeenCalledTimes(1); + expect(validateSpy).toHaveBeenCalledWith(['string', 'string'], [data, 'password']); + }); + }); +}); diff --git a/packages/web3-eth-personal/test/unit/jest.config.js b/packages/web3-eth-personal/test/unit/jest.config.js new file mode 100644 index 00000000000..3815ba858d7 --- /dev/null +++ b/packages/web3-eth-personal/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-eth-personal-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-eth-personal/tsconfig.cjs.json b/packages/web3-eth-personal/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-eth-personal/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-eth-personal/tsconfig.esm.json b/packages/web3-eth-personal/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-eth-personal/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-eth-personal/tsconfig.json b/packages/web3-eth-personal/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-eth-personal/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-eth-personal/tsconfig.types.json b/packages/web3-eth-personal/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-eth-personal/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-eth-personal/tsdoc.json b/packages/web3-eth-personal/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-eth-personal/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth-personal/types/index.d.ts b/packages/web3-eth-personal/types/index.d.ts deleted file mode 100644 index 8d52ff9477d..00000000000 --- a/packages/web3-eth-personal/types/index.d.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Huan Zhang , - * @author Josh Stevens - * @date 2018 - */ - -import * as net from 'net'; -import { provider, RLPEncodedTransaction, TransactionConfig, BatchRequest, Providers, Extension } from 'web3-core'; - -export class Personal { - constructor(); - constructor(provider: provider); - constructor(provider: provider, net: net.Socket); - - readonly givenProvider: any; - static readonly givenProvider: any; - static readonly providers: Providers; - readonly currentProvider: provider; - defaultAccount: string | null; - defaultBlock: string | number; - BatchRequest: new () => BatchRequest; - - setProvider(provider: provider): boolean; - - extend(extension: Extension): any; - - newAccount( - password: string, - callback?: (error: Error, address: string) => void - ): Promise; - - sign( - dataToSign: string, - address: string, - password: string, - callback?: (error: Error, signature: string) => void - ): Promise; - - ecRecover( - dataThatWasSigned: string, - signature: string, - callback?: (error: Error, address: string) => void - ): Promise; - - signTransaction( - transactionConfig: TransactionConfig, - password: string, - callback?: ( - error: Error, - RLPEncodedTransaction: RLPEncodedTransaction - ) => void - ): Promise; - - sendTransaction( - transactionConfig: TransactionConfig, - password: string, - callback?: (error: Error, transactionHash: string) => void - ): Promise; - - unlockAccount( - address: string, - password: string, - unlockDuration: number, - callback?: (error: Error) => void - ): Promise; - - lockAccount( - address: string, - callback?: (error: Error, success: boolean) => void - ): Promise; - - getAccounts( - callback?: (error: Error, accounts: string[]) => void - ): Promise; - - importRawKey( - privateKey: string, - password: string, - callback?: (error: Error, result: string) => void - ): Promise; -} diff --git a/packages/web3-eth-personal/types/tests/personal-tests.ts b/packages/web3-eth-personal/types/tests/personal-tests.ts deleted file mode 100644 index 556e6aa2848..00000000000 --- a/packages/web3-eth-personal/types/tests/personal-tests.ts +++ /dev/null @@ -1,164 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file personal-tests.ts - * @author Huan Zhang - * @author Samuel Furter - * @author Josh Stevens - * @date 2018 - */ - -import { RLPEncodedTransaction } from 'web3-core'; -import { Personal } from 'web3-eth-personal'; - -// $ExpectType Personal -const personal_empty = new Personal(); - -// $ExpectType Personal -const personal = new Personal('http://localhost:7545'); - -// $ExpectType string | null -personal.defaultAccount; - -// $ExpectType string | number -personal.defaultBlock; - -// $ExpectType provider -personal.currentProvider; - -// $ExpectType any -Personal.givenProvider; - -// $ExpectType any -personal.givenProvider; - -// $ExpectType boolean -personal.setProvider('https://localhost:2100'); - -// $ExpectType BatchRequest -new personal.BatchRequest(); - -// $ExpectType any -personal.extend({property: 'test', methods: [{name: 'method', call: 'method'}]}); - -// $ExpectType Promise -personal.newAccount('test password'); -// $ExpectType Promise -personal.newAccount('test password', (error: Error, address: string) => {}); - -// $ExpectType Promise -personal.sign( - 'Hello world', - '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 'test password!' -); -// $ExpectType Promise -personal.sign( - 'Hello world', - '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 'test password!', - (error: Error, signature: string) => {} -); - -// $ExpectType Promise -personal.ecRecover('Hello world', '0x30755ed65396facf86c53e6217c52b4daebe72aa'); -// $ExpectType Promise -personal.ecRecover( - 'Hello world', - '0x30755ed65396facf86c53e6217c52b4daebe72aa', - (error: Error, address: string) => {} -); - -// $ExpectType Promise -personal.signTransaction( - { - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' - }, - 'test password' -); -// $ExpectType Promise -personal.signTransaction( - { - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' - }, - 'test password', - (error: Error, RLPEncodedTransaction: RLPEncodedTransaction) => {} -); - -// $ExpectType Promise -personal.sendTransaction( - { - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' - }, - 'test password' -); - -// $ExpectType Promise -personal.sendTransaction( - { - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' - }, - 'test password', - (error: Error, transactionHash: string) => {} -); - -// $ExpectType Promise -personal.unlockAccount( - '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 'test password!', - 600 -); -// $ExpectType Promise -personal.unlockAccount( - '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 'test password!', - 600, - (error: Error) => {} -); - -// $ExpectType Promise -personal.lockAccount('0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'); -// $ExpectType Promise -personal.lockAccount( - '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - (error: Error, sucess: boolean) => {} -); - -// $ExpectType Promise -personal.getAccounts(); -// $ExpectType Promise -personal.getAccounts((error: Error, accounts: string[]) => {}); - -// $ExpectType Promise -personal.importRawKey('privateKey', 'blah2'); diff --git a/packages/web3-eth-personal/types/tsconfig.json b/packages/web3-eth-personal/types/tsconfig.json deleted file mode 100644 index 8d56df7eb4f..00000000000 --- a/packages/web3-eth-personal/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth-personal": ["."] - } - } -} diff --git a/packages/web3-eth-personal/types/tslint.json b/packages/web3-eth-personal/types/tslint.json deleted file mode 100644 index 871d605704b..00000000000 --- a/packages/web3-eth-personal/types/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false - } -} diff --git a/packages/web3-eth/.eslintignore b/packages/web3-eth/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-eth/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth/.eslintrc.js b/packages/web3-eth/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-eth/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth/.gitignore b/packages/web3-eth/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-eth/.npmignore b/packages/web3-eth/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-eth/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth/.prettierignore b/packages/web3-eth/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-eth/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-eth/.prettierrc.json b/packages/web3-eth/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-eth/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-eth/CHANGELOG.md b/packages/web3-eth/CHANGELOG.md new file mode 100644 index 00000000000..90ad4805704 --- /dev/null +++ b/packages/web3-eth/CHANGELOG.md @@ -0,0 +1,228 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Added + +- `web3-rpc-methods` dependency (#5441) +- Added chain and hardfork validation for transaction and transaction.common object in `validateTransactionForSigning` + +### Changed + +- `Web3EthExecutionAPI` is now imported via `web3-types` instead of `web3_eth_execution_api.ts` (#5441) +- Replace the imported methods from `rpc_methods.ts` with `ethRpcMethods` imports from `web3-rpc-methods` (#5441) +- `Web3NetAPI` is now imported from `web3-types` instead of `web3-net` (#5441) +- Moved `rpc_methods` tests to `web3-rpc-methods` (#5441) +- Implemented the logic for `transactionBlockTimeout` (#5294) +- Use subscription at `rejectIfBlockTimeout` when the provider supports subscription. Implement this as an experimental feature (if `useSubscriptionWhenCheckingBlockTimeout` at `enableExperimentalFeatures` is `true`). (#5481) +- At some test cases, optimized some codes. (#5481) + +### Removed + +- Moved the errors' classes from `web3-eth/src/errors.ts` to `web3-errors/src/errors/transaction_errors.ts` (#5462) + +### Fixed + +- Fix `getBlock` returning empty transactions object on `hydrated` true (#5556) +- [setimmediate](https://github.com/yuzujs/setImmediate) package to polyfill [setImmediate](https://nodejs.org/api/timers.html#setimmediatecallback-args) for browsers (#5450) + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +### Fixed + +- Enable transaction with local wallet index in the `to` field (#5731) + +## [4.0.1-rc.0] + +### Changed + +- Update imports statements for objects that was moved between web3 packages (#5771) +- `sendTransaction` and `sendSignedTransaction` now errors with (and `error` event emits) the following possible errors: `TransactionRevertedWithoutReasonError`, `TransactionRevertInstructionError`, `TransactionRevertWithCustomError`, `InvalidResponseError`, or `ContractExecutionError` (#5854) + +### Added + +- Added `createAccessList` functionality ( #5780 ) +- Added support of `safe` and `finalized` block tags (#5823) +- `contractAbi` option to `SendTransactionOptions` and `SendSignedTransactionOptions` to added the ability to parse custom solidity errors (#5854) + +### Removed + +- `getRevertReason` is no longer exported (#5844) + +## [4.0.1-rc.1] + +### Added + +- Added hybrid build (ESM and CJS) of library (#5904) +- Added source files (#5956) + +### Changed + +- `signTransaction` will now return `gas` instead of `gasLimit` for returned transaction object regardless of what property name the provider uses (#5915) +- `formatTransaction` will now replace `data` transaction property with `input` (#5915) +- `isTransactionCall` will now check if `value.input` `isHexStrict` if provided (#5915) +- The functions `defaultTransactionBuilder` and `transactionBuilder` are now utilizing the type `Transaction` for the transaction object. (#5993) + +### Removed + +- Removed dependencies @ethereumjs/tx, @ethereumjs/common (#5963) + +## [4.0.1-rc.2] + +### Fixed + +- Fixed `ignoreGasPricing` bug with wallet in context (#6071) + +### Changed + +- `formatTransaction` no longer throws a `TransactionDataAndInputError` if it's passed a transaction object with both `data` and `input` properties set (as long as they are the same value) (#6064) +- Refactored documentation for `rpc_method_wrappers` to point to the previously duplicated documentation found under the `Web3Eth` class documentation (#6054) +- Replaced Buffer for Uint8Array (#6004) +- Refactored `defaultTransactionTypeParser` to return correct EIP-2718 types, prior implementation was prioritizing `transaction.hardfork` and ignoring the use of `transaction.gasLimit`. `defaultTransactionTypeParser` will now throw `InvalidPropertiesForTransactionTypeError`s for properties are used that are incompatible with `transaction.type` (#6102) +- `prepareTransactionForSigning` and `defaultTransactionBuilder` now accepts optional `fillGasPrice` flag and by default will not fill gas(#6071) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Changed + +- Dependencies updated + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.1.0] + +### Fixed + +- sendTransaction will have gas filled by default using method `estimateGas` unless transaction builder `options.fillGas` is false. (#6249) +- Missing `blockHeaderSchema` properties causing some properties to not appear in response of `newHeads` subscription (#6243) +- Missing `blockHeaderSchema` properties causing some properties to not appear in response of `newHeads` subscription (#6243) + +### Changed + +- `MissingGasError` error message changed for clarity (#6215) +- `input` and `data` are no longer auto populated for transaction objects if they are not present. Instead, whichever property is provided by the user is formatted and sent to the RPC provider. Transaction objects returned from RPC responses are still formatted to contain both `input` and `data` properties (#6294) + +### Added + +- A `rpc_method_wrapper` (`signTypedData`) for the rpc calls `eth_signTypedData` and `eth_signTypedData_v4` (#6286) +- A `signTypedData` method to the `Web3Eth` class (#6286) + +## [4.1.1] + +### Fixed + +- Added return type for `formatSubscriptionResult` in class `NewHeadsSubscription` (#6368) + +## [4.2.0] + +### Added + +- Added to `Web3Config` property `contractDataInputFill` allowing users to have the choice using property `data`, `input` or `both` for contract methods to be sent to the RPC provider when creating contracts. (#6377) (#6400) + +## [4.3.0] + +### Changed + +- Transactions will now default to type 2 transactions instead of type 0, similar to 1.x version. (#6282) + +### Fixed + +- Ensure provider.supportsSubscriptions exists before watching by subscription (#6440) +- Fixed param sent to `checkRevertBeforeSending` in `sendSignedTransaction` +- Fixed `defaultTransactionBuilder` for value issue (#6509) + +### Added + +- Added `ALL_EVENTS` and `ALL_EVENTS_ABI` constants, `SendTransactionEventsBase` type, `decodeEventABI` method (#6410) + +## [4.3.1] + +### Changed + +- Dependencies updated + +## [4.4.0] + +### Added + +- Catch `TransactionPollingTimeoutError` was added to send transaction events (#6623) + +## [4.5.0] + +### Added + +- Added `eth.getMaxPriorityFeePerGas` method (#6748) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-eth/README.md b/packages/web3-eth/README.md index c229af4e846..a7d675b599c 100644 --- a/packages/web3-eth/README.md +++ b/packages/web3-eth/README.md @@ -1,38 +1,59 @@ -# web3-eth +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Eth -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This Eth package is used within some [web3.js][repo] packages. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-eth` contains modules to interact with the Ethereum blockchain and smart contracts. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-eth) or using [Yarn](https://yarnpkg.com/package/web3-eth) + +### Using NPM ```bash npm install web3-eth ``` -## Usage +### Using Yarn -```js -const Web3Eth = require('web3-eth'); - -const eth = new Web3Eth('ws://localhost:8546'); +```bash +yarn add web3-eth ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3-eth.js -[npm-image]: https://img.shields.io/npm/v/web3-eth.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-eth +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-eth -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-eth -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-eth -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-eth -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-eth +[downloads-image]: https://img.shields.io/npm/dm/web3-eth?label=npm%20downloads diff --git a/packages/web3-eth/assets/logo/web3js.ai b/packages/web3-eth/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-eth/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-eth/assets/logo/web3js.jpg b/packages/web3-eth/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-eth/assets/logo/web3js.jpg differ diff --git a/packages/web3-eth/assets/logo/web3js.svg b/packages/web3-eth/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-eth/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-eth/cypress b/packages/web3-eth/cypress new file mode 120000 index 00000000000..4a671a7beac --- /dev/null +++ b/packages/web3-eth/cypress @@ -0,0 +1 @@ +../../templates/cypress \ No newline at end of file diff --git a/packages/web3-eth/cypress.config.js b/packages/web3-eth/cypress.config.js new file mode 120000 index 00000000000..8cd9ba29af0 --- /dev/null +++ b/packages/web3-eth/cypress.config.js @@ -0,0 +1 @@ +../../templates/cypress.config.js \ No newline at end of file diff --git a/packages/web3-eth/package-lock.json b/packages/web3-eth/package-lock.json deleted file mode 100644 index 846ea5088f3..00000000000 --- a/packages/web3-eth/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-eth", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-eth/package.json b/packages/web3-eth/package.json index 60ed3d1108f..7b53c9df5ab 100644 --- a/packages/web3-eth/package.json +++ b/packages/web3-eth/package.json @@ -1,35 +1,77 @@ { - "name": "web3-eth", - "version": "1.3.0", - "description": "Web3 module to interact with the Ethereum blockchain and smart contracts.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "underscore": "1.9.1", - "web3-core": "1.3.0", - "web3-core-helpers": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-eth-abi": "1.3.0", - "web3-eth-accounts": "1.3.0", - "web3-eth-contract": "1.3.0", - "web3-eth-ens": "1.3.0", - "web3-eth-iban": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-eth", + "version": "4.5.0", + "description": "Web3 module to interact with the Ethereum blockchain and smart contracts.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:e2e:mainnet": "jest --config=./test/e2e/jest.config.js --forceExit", + "test:e2e:sepolia": "jest --config=./test/e2e/jest.config.js --forceExit", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --runInBand --forceExit", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --runInBand --forceExit --coverage=true --coverage-reporters=text", + "test:e2e:electron": "npx cypress run --headless --browser electron", + "test:e2e:chrome": "npx cypress run --headless --browser chrome", + "test:e2e:firefox": "npx cypress run --headless --browser firefox" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4", + "web3-providers-http": "^4.1.0" + }, + "dependencies": { + "setimmediate": "^1.0.5", + "web3-core": "^4.3.2", + "web3-errors": "^1.1.4", + "web3-eth-abi": "^4.2.0", + "web3-eth-accounts": "^4.1.1", + "web3-net": "^4.0.7", + "web3-providers-ws": "^4.0.7", + "web3-rpc-methods": "^1.2.0", + "web3-types": "^1.5.0", + "web3-utils": "^4.2.1", + "web3-validator": "^2.0.4" + } } diff --git a/packages/web3-eth/src/constants.ts b/packages/web3-eth/src/constants.ts new file mode 100644 index 00000000000..13a485719a0 --- /dev/null +++ b/packages/web3-eth/src/constants.ts @@ -0,0 +1,27 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiEventFragment, FMT_BYTES, FMT_NUMBER } from 'web3-types'; + +export const ALL_EVENTS = 'ALLEVENTS'; +export const ALL_EVENTS_ABI = { + name: ALL_EVENTS, + signature: '', + type: 'event', + inputs: [], +} as AbiEventFragment & { signature: string }; + +export const NUMBER_DATA_FORMAT = { bytes: FMT_BYTES.HEX, number: FMT_NUMBER.NUMBER } as const; diff --git a/packages/web3-eth/src/getNetworkType.js b/packages/web3-eth/src/getNetworkType.js deleted file mode 100644 index 3be3a2027e6..00000000000 --- a/packages/web3-eth/src/getNetworkType.js +++ /dev/null @@ -1,82 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file getNetworkType.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var _ = require('underscore'); - -var getNetworkType = function (callback) { - var _this = this, - id; - - - return this.net.getId() - .then(function (givenId) { - - id = givenId; - - return _this.getBlock(0); - }) - .then(function (genesis) { - var returnValue = 'private'; - - if (genesis.hash === '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3' && - id === 1) { - returnValue = 'main'; - } - if (genesis.hash === '0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303' && - id === 2) { - returnValue = 'morden'; - } - if (genesis.hash === '0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d' && - id === 3) { - returnValue = 'ropsten'; - } - if (genesis.hash === '0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177' && - id === 4) { - returnValue = 'rinkeby'; - } - if (genesis.hash === '0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a' && - id === 5) { - returnValue = 'goerli'; - } - if (genesis.hash === '0xa3c565fc15c7478862d50ccd6561e3c06b24cc509bf388941c25ea985ce32cb9' && - id === 42) { - returnValue = 'kovan'; - } - - if (_.isFunction(callback)) { - callback(null, returnValue); - } - - return returnValue; - }) - .catch(function (err) { - if (_.isFunction(callback)) { - callback(err); - } else { - throw err; - } - }); -}; - -module.exports = getNetworkType; diff --git a/packages/web3-eth/src/index.js b/packages/web3-eth/src/index.js deleted file mode 100644 index 469c149eca8..00000000000 --- a/packages/web3-eth/src/index.js +++ /dev/null @@ -1,661 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var _ = require('underscore'); -var core = require('web3-core'); -var helpers = require('web3-core-helpers'); -var Subscriptions = require('web3-core-subscriptions').subscriptions; -var Method = require('web3-core-method'); -var utils = require('web3-utils'); -var Net = require('web3-net'); - -var ENS = require('web3-eth-ens'); -var Personal = require('web3-eth-personal'); -var BaseContract = require('web3-eth-contract'); -var Iban = require('web3-eth-iban'); -var Accounts = require('web3-eth-accounts'); -var abi = require('web3-eth-abi'); - -var getNetworkType = require('./getNetworkType.js'); -var formatter = helpers.formatters; - - -var blockCall = function (args) { - return (_.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber"; -}; - -var transactionFromBlockCall = function (args) { - return (_.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex'; -}; - -var uncleCall = function (args) { - return (_.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex'; -}; - -var getBlockTransactionCountCall = function (args) { - return (_.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber'; -}; - -var uncleCountCall = function (args) { - return (_.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber'; -}; - - -var Eth = function Eth() { - var _this = this; - - // sets _requestmanager - core.packageInit(this, arguments); - - // overwrite package setRequestManager - var setRequestManager = this.setRequestManager; - this.setRequestManager = function (manager) { - setRequestManager(manager); - - _this.net.setRequestManager(manager); - _this.personal.setRequestManager(manager); - _this.accounts.setRequestManager(manager); - _this.Contract._requestManager = _this._requestManager; - _this.Contract.currentProvider = _this._provider; - - return true; - }; - - // overwrite setProvider - var setProvider = this.setProvider; - this.setProvider = function () { - setProvider.apply(_this, arguments); - - _this.setRequestManager(_this._requestManager); - - // Set detectedAddress/lastSyncCheck back to null because the provider could be connected to a different chain now - _this.ens._detectedAddress = null; - _this.ens._lastSyncCheck = null; - }; - - - var handleRevert = false; - var defaultAccount = null; - var defaultBlock = 'latest'; - var transactionBlockTimeout = 50; - var transactionConfirmationBlocks = 24; - var transactionPollingTimeout = 750; - var maxListenersWarningThreshold = 100; - var defaultChain, defaultHardfork, defaultCommon; - - Object.defineProperty(this, 'handleRevert', { - get: function () { - return handleRevert; - }, - set: function (val) { - handleRevert = val; - - // also set on the Contract object - _this.Contract.handleRevert = handleRevert; - - // update handleRevert - methods.forEach(function(method) { - method.handleRevert = handleRevert; - }); - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultCommon', { - get: function () { - return defaultCommon; - }, - set: function (val) { - defaultCommon = val; - - // also set on the Contract object - _this.Contract.defaultCommon = defaultCommon; - - // update defaultBlock - methods.forEach(function(method) { - method.defaultCommon = defaultCommon; - }); - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultHardfork', { - get: function () { - return defaultHardfork; - }, - set: function (val) { - defaultHardfork = val; - - // also set on the Contract object - _this.Contract.defaultHardfork = defaultHardfork; - - // update defaultBlock - methods.forEach(function(method) { - method.defaultHardfork = defaultHardfork; - }); - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultChain', { - get: function () { - return defaultChain; - }, - set: function (val) { - defaultChain = val; - - // also set on the Contract object - _this.Contract.defaultChain = defaultChain; - - // update defaultBlock - methods.forEach(function(method) { - method.defaultChain = defaultChain; - }); - }, - enumerable: true - }); - Object.defineProperty(this, 'transactionPollingTimeout', { - get: function () { - return transactionPollingTimeout; - }, - set: function (val) { - transactionPollingTimeout = val; - - // also set on the Contract object - _this.Contract.transactionPollingTimeout = transactionPollingTimeout; - - // update defaultBlock - methods.forEach(function(method) { - method.transactionPollingTimeout = transactionPollingTimeout; - }); - }, - enumerable: true - }); - Object.defineProperty(this, 'transactionConfirmationBlocks', { - get: function () { - return transactionConfirmationBlocks; - }, - set: function (val) { - transactionConfirmationBlocks = val; - - // also set on the Contract object - _this.Contract.transactionConfirmationBlocks = transactionConfirmationBlocks; - - // update defaultBlock - methods.forEach(function(method) { - method.transactionConfirmationBlocks = transactionConfirmationBlocks; - }); - }, - enumerable: true - }); - Object.defineProperty(this, 'transactionBlockTimeout', { - get: function () { - return transactionBlockTimeout; - }, - set: function (val) { - transactionBlockTimeout = val; - - // also set on the Contract object - _this.Contract.transactionBlockTimeout = transactionBlockTimeout; - - // update defaultBlock - methods.forEach(function(method) { - method.transactionBlockTimeout = transactionBlockTimeout; - }); - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultAccount', { - get: function () { - return defaultAccount; - }, - set: function (val) { - if(val) { - defaultAccount = utils.toChecksumAddress(formatter.inputAddressFormatter(val)); - } - - // also set on the Contract object - _this.Contract.defaultAccount = defaultAccount; - _this.personal.defaultAccount = defaultAccount; - - // update defaultBlock - methods.forEach(function(method) { - method.defaultAccount = defaultAccount; - }); - - return val; - }, - enumerable: true - }); - Object.defineProperty(this, 'defaultBlock', { - get: function () { - return defaultBlock; - }, - set: function (val) { - defaultBlock = val; - // also set on the Contract object - _this.Contract.defaultBlock = defaultBlock; - _this.personal.defaultBlock = defaultBlock; - - // update defaultBlock - methods.forEach(function(method) { - method.defaultBlock = defaultBlock; - }); - - return val; - }, - enumerable: true - }); - Object.defineProperty(this, 'maxListenersWarningThreshold', { - get: function () { - return maxListenersWarningThreshold; - }, - set: function (val) { - if (_this.currentProvider && _this.currentProvider.setMaxListeners){ - maxListenersWarningThreshold = val; - _this.currentProvider.setMaxListeners(val); - } - }, - enumerable: true - }); - - - this.clearSubscriptions = _this._requestManager.clearSubscriptions.bind(_this._requestManager); - - // add net - this.net = new Net(this); - // add chain detection - this.net.getNetworkType = getNetworkType.bind(this); - - // add accounts - this.accounts = new Accounts(this); - - // add personal - this.personal = new Personal(this); - this.personal.defaultAccount = this.defaultAccount; - - // set warnings threshold - this.maxListenersWarningThreshold = maxListenersWarningThreshold; - - // create a proxy Contract type for this instance, as a Contract's provider - // is stored as a class member rather than an instance variable. If we do - // not create this proxy type, changing the provider in one instance of - // web3-eth would subsequently change the provider for _all_ contract - // instances! - var self = this; - var Contract = function Contract() { - BaseContract.apply(this, arguments); - - // when Eth.setProvider is called, call packageInit - // on all contract instances instantiated via this Eth - // instances. This will update the currentProvider for - // the contract instances - var _this = this; - var setProvider = self.setProvider; - self.setProvider = function() { - setProvider.apply(self, arguments); - core.packageInit(_this, [self]); - }; - }; - - Contract.setProvider = function() { - BaseContract.setProvider.apply(this, arguments); - }; - - // make our proxy Contract inherit from web3-eth-contract so that it has all - // the right functionality and so that instanceof and friends work properly - Contract.prototype = Object.create(BaseContract.prototype); - Contract.prototype.constructor = Contract; - - // add contract - this.Contract = Contract; - this.Contract.defaultAccount = this.defaultAccount; - this.Contract.defaultBlock = this.defaultBlock; - this.Contract.transactionBlockTimeout = this.transactionBlockTimeout; - this.Contract.transactionConfirmationBlocks = this.transactionConfirmationBlocks; - this.Contract.transactionPollingTimeout = this.transactionPollingTimeout; - this.Contract.handleRevert = this.handleRevert; - this.Contract._requestManager = this._requestManager; - this.Contract._ethAccounts = this.accounts; - this.Contract.currentProvider = this._requestManager.provider; - - // add IBAN - this.Iban = Iban; - - // add ABI - this.abi = abi; - - // add ENS - this.ens = new ENS(this); - - var methods = [ - new Method({ - name: 'getNodeInfo', - call: 'web3_clientVersion' - }), - new Method({ - name: 'getProtocolVersion', - call: 'eth_protocolVersion', - params: 0 - }), - new Method({ - name: 'getCoinbase', - call: 'eth_coinbase', - params: 0 - }), - new Method({ - name: 'isMining', - call: 'eth_mining', - params: 0 - }), - new Method({ - name: 'getHashrate', - call: 'eth_hashrate', - params: 0, - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'isSyncing', - call: 'eth_syncing', - params: 0, - outputFormatter: formatter.outputSyncingFormatter - }), - new Method({ - name: 'getGasPrice', - call: 'eth_gasPrice', - params: 0, - outputFormatter: formatter.outputBigNumberFormatter - }), - new Method({ - name: 'getAccounts', - call: 'eth_accounts', - params: 0, - outputFormatter: utils.toChecksumAddress - }), - new Method({ - name: 'getBlockNumber', - call: 'eth_blockNumber', - params: 0, - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'getBalance', - call: 'eth_getBalance', - params: 2, - inputFormatter: [formatter.inputAddressFormatter, formatter.inputDefaultBlockNumberFormatter], - outputFormatter: formatter.outputBigNumberFormatter - }), - new Method({ - name: 'getStorageAt', - call: 'eth_getStorageAt', - params: 3, - inputFormatter: [formatter.inputAddressFormatter, utils.numberToHex, formatter.inputDefaultBlockNumberFormatter] - }), - new Method({ - name: 'getCode', - call: 'eth_getCode', - params: 2, - inputFormatter: [formatter.inputAddressFormatter, formatter.inputDefaultBlockNumberFormatter] - }), - new Method({ - name: 'getBlock', - call: blockCall, - params: 2, - inputFormatter: [formatter.inputBlockNumberFormatter, function (val) { return !!val; }], - outputFormatter: formatter.outputBlockFormatter - }), - new Method({ - name: 'getUncle', - call: uncleCall, - params: 2, - inputFormatter: [formatter.inputBlockNumberFormatter, utils.numberToHex], - outputFormatter: formatter.outputBlockFormatter, - - }), - new Method({ - name: 'getBlockTransactionCount', - call: getBlockTransactionCountCall, - params: 1, - inputFormatter: [formatter.inputBlockNumberFormatter], - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'getBlockUncleCount', - call: uncleCountCall, - params: 1, - inputFormatter: [formatter.inputBlockNumberFormatter], - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'getTransaction', - call: 'eth_getTransactionByHash', - params: 1, - inputFormatter: [null], - outputFormatter: formatter.outputTransactionFormatter - }), - new Method({ - name: 'getTransactionFromBlock', - call: transactionFromBlockCall, - params: 2, - inputFormatter: [formatter.inputBlockNumberFormatter, utils.numberToHex], - outputFormatter: formatter.outputTransactionFormatter - }), - new Method({ - name: 'getTransactionReceipt', - call: 'eth_getTransactionReceipt', - params: 1, - inputFormatter: [null], - outputFormatter: formatter.outputTransactionReceiptFormatter - }), - new Method({ - name: 'getTransactionCount', - call: 'eth_getTransactionCount', - params: 2, - inputFormatter: [formatter.inputAddressFormatter, formatter.inputDefaultBlockNumberFormatter], - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'sendSignedTransaction', - call: 'eth_sendRawTransaction', - params: 1, - inputFormatter: [null], - abiCoder: abi - }), - new Method({ - name: 'signTransaction', - call: 'eth_signTransaction', - params: 1, - inputFormatter: [formatter.inputTransactionFormatter] - }), - new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatter.inputTransactionFormatter], - abiCoder: abi - }), - new Method({ - name: 'sign', - call: 'eth_sign', - params: 2, - inputFormatter: [formatter.inputSignFormatter, formatter.inputAddressFormatter], - transformPayload: function (payload) { - payload.params.reverse(); - return payload; - } - }), - new Method({ - name: 'call', - call: 'eth_call', - params: 2, - inputFormatter: [formatter.inputCallFormatter, formatter.inputDefaultBlockNumberFormatter], - abiCoder: abi - }), - new Method({ - name: 'estimateGas', - call: 'eth_estimateGas', - params: 1, - inputFormatter: [formatter.inputCallFormatter], - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'submitWork', - call: 'eth_submitWork', - params: 3 - }), - new Method({ - name: 'getWork', - call: 'eth_getWork', - params: 0 - }), - new Method({ - name: 'getPastLogs', - call: 'eth_getLogs', - params: 1, - inputFormatter: [formatter.inputLogFormatter], - outputFormatter: formatter.outputLogFormatter - }), - new Method({ - name: 'getChainId', - call: 'eth_chainId', - params: 0, - outputFormatter: utils.hexToNumber - }), - new Method({ - name: 'requestAccounts', - call: 'eth_requestAccounts', - params: 0, - outputFormatter: utils.toChecksumAddress - }), - new Method({ - name: 'getProof', - call: 'eth_getProof', - params: 3, - inputFormatter: [formatter.inputAddressFormatter, formatter.inputStorageKeysFormatter, formatter.inputDefaultBlockNumberFormatter], - outputFormatter: formatter.outputProofFormatter - }), - new Method({ - name: 'getPendingTransactions', - call: 'eth_pendingTransactions', - params: 0, - outputFormatter: formatter.outputTransactionFormatter - }), - - // subscriptions - new Subscriptions({ - name: 'subscribe', - type: 'eth', - subscriptions: { - 'newBlockHeaders': { - // TODO rename on RPC side? - subscriptionName: 'newHeads', // replace subscription with this name - params: 0, - outputFormatter: formatter.outputBlockFormatter - }, - 'pendingTransactions': { - subscriptionName: 'newPendingTransactions', // replace subscription with this name - params: 0 - }, - 'logs': { - params: 1, - inputFormatter: [formatter.inputLogFormatter], - outputFormatter: formatter.outputLogFormatter, - // DUBLICATE, also in web3-eth-contract - subscriptionHandler: function (output) { - if(output.removed) { - this.emit('changed', output); - } else { - this.emit('data', output); - } - - if (_.isFunction(this.callback)) { - this.callback(null, output, this); - } - } - }, - 'syncing': { - params: 0, - outputFormatter: formatter.outputSyncingFormatter, - subscriptionHandler: function (output) { - var _this = this; - - // fire TRUE at start - if(this._isSyncing !== true) { - this._isSyncing = true; - this.emit('changed', _this._isSyncing); - - if (_.isFunction(this.callback)) { - this.callback(null, _this._isSyncing, this); - } - - setTimeout(function () { - _this.emit('data', output); - - if (_.isFunction(_this.callback)) { - _this.callback(null, output, _this); - } - }, 0); - - // fire sync status - } else { - this.emit('data', output); - if (_.isFunction(_this.callback)) { - this.callback(null, output, this); - } - - // wait for some time before fireing the FALSE - clearTimeout(this._isSyncingTimeout); - this._isSyncingTimeout = setTimeout(function () { - if(output.currentBlock > output.highestBlock - 200) { - _this._isSyncing = false; - _this.emit('changed', _this._isSyncing); - - if (_.isFunction(_this.callback)) { - _this.callback(null, _this._isSyncing, _this); - } - } - }, 500); - } - } - } - } - }) - ]; - - methods.forEach(function(method) { - method.attachToObject(_this); - method.setRequestManager(_this._requestManager, _this.accounts); // second param is the eth.accounts module (necessary for signing transactions locally) - method.defaultBlock = _this.defaultBlock; - method.defaultAccount = _this.defaultAccount; - method.transactionBlockTimeout = _this.transactionBlockTimeout; - method.transactionConfirmationBlocks = _this.transactionConfirmationBlocks; - method.transactionPollingTimeout = _this.transactionPollingTimeout; - method.handleRevert = _this.handleRevert; - }); - -}; - -// Adds the static givenProvider and providers property to the Eth module -core.addProviders(Eth); - - -module.exports = Eth; - diff --git a/packages/web3-eth/src/index.ts b/packages/web3-eth/src/index.ts new file mode 100644 index 00000000000..d1f1d326832 --- /dev/null +++ b/packages/web3-eth/src/index.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The `web3-eth` package allows you to interact with an Ethereum blockchain and Ethereum smart contracts. + * + * To use this package standalone and use its methods use: + * ```ts + * import { Web3Context } from 'web3-core'; + * import { BlockTags } from 'web3-types'; + * import { DEFAULT_RETURN_FORMAT } from 'web3-types'; + * import { getBalance} from 'web3-eth'; + * + * getBalance( + * new Web3Context('http://127.0.0.1:8545'), + * '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + * BlockTags.LATEST, + * DEFAULT_RETURN_FORMAT + * ).then(console.log); + * > 1000000000000n + * ``` + * + * To use this package within the `web3` object use: + * ```ts + * import Web3 from 'web3'; + * + * const web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); + * web3.eth.getBalance('0x407d73d8a49eeb85d32cf465507dd71d507100c1').then(console.log); + * > 1000000000000n + *``` + * + * With `web3-eth` you can also subscribe (if supported by provider) to events in the Ethereum Blockchain, using the `subscribe` function. See more at the {@link Web3Eth.subscribe} function. + */ +/** + * + */ +import 'setimmediate'; + +import { Web3Eth } from './web3_eth.js'; + +export * from './web3_eth.js'; +export * from './utils/decoding.js'; +export * from './schemas.js'; +export * from './constants.js'; +export * from './types.js'; +export * from './validation.js'; +export * from './rpc_method_wrappers.js'; +export * from './utils/format_transaction.js'; +export * from './utils/prepare_transaction_for_signing.js'; +export * from './web3_subscriptions.js'; +export { detectTransactionType } from './utils/detect_transaction_type.js'; +export { transactionBuilder } from './utils/transaction_builder.js'; + +export default Web3Eth; diff --git a/packages/web3-eth/src/rpc_method_wrappers.ts b/packages/web3-eth/src/rpc_method_wrappers.ts new file mode 100644 index 00000000000..1a2cac1ffd8 --- /dev/null +++ b/packages/web3-eth/src/rpc_method_wrappers.ts @@ -0,0 +1,991 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Disabling because returnTypes must be last param to match 1.x params +/* eslint-disable default-param-last */ +import { + ETH_DATA_FORMAT, + FormatType, + DataFormat, + DEFAULT_RETURN_FORMAT, + EthExecutionAPI, + SignedTransactionInfoAPI, + Web3BaseWalletAccount, + Address, + BlockTag, + BlockNumberOrTag, + Bytes, + Filter, + HexString, + Numbers, + HexStringBytes, + AccountObject, + Block, + FeeHistory, + Log, + TransactionReceipt, + Transaction, + TransactionCall, + Web3EthExecutionAPI, + TransactionWithFromLocalWalletIndex, + TransactionWithToLocalWalletIndex, + TransactionWithFromAndToLocalWalletIndex, + TransactionForAccessList, + AccessListResult, + Eip712TypedData, +} from 'web3-types'; +import { Web3Context, Web3PromiEvent } from 'web3-core'; +import { format, hexToBytes, bytesToUint8Array, numberToHex } from 'web3-utils'; +import { TransactionFactory } from 'web3-eth-accounts'; +import { isBlockTag, isBytes, isNullish, isString } from 'web3-validator'; +import { SignatureError } from 'web3-errors'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { decodeSignedTransaction } from './utils/decode_signed_transaction.js'; +import { + accountSchema, + blockSchema, + feeHistorySchema, + logSchema, + transactionReceiptSchema, + accessListResultSchema, + SignatureObjectSchema, +} from './schemas.js'; +import { + SendSignedTransactionEvents, + SendSignedTransactionOptions, + SendTransactionEvents, + SendTransactionOptions, +} from './types.js'; +// eslint-disable-next-line import/no-cycle +import { getTransactionFromOrToAttr } from './utils/transaction_builder.js'; +import { formatTransaction } from './utils/format_transaction.js'; +// eslint-disable-next-line import/no-cycle +import { trySendTransaction } from './utils/try_send_transaction.js'; +// eslint-disable-next-line import/no-cycle +import { waitForTransactionReceipt } from './utils/wait_for_transaction_receipt.js'; +import { NUMBER_DATA_FORMAT } from './constants.js'; +// eslint-disable-next-line import/no-cycle +import { SendTxHelper } from './utils/send_tx_helper.js'; + +/** + * View additional documentations here: {@link Web3Eth.getProtocolVersion} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export const getProtocolVersion = async (web3Context: Web3Context) => + ethRpcMethods.getProtocolVersion(web3Context.requestManager); + +// TODO Add returnFormat parameter +/** + * View additional documentations here: {@link Web3Eth.isSyncing} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export const isSyncing = async (web3Context: Web3Context) => + ethRpcMethods.getSyncing(web3Context.requestManager); + +// TODO consider adding returnFormat parameter (to format address as bytes) +/** + * View additional documentations here: {@link Web3Eth.getCoinbase} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export const getCoinbase = async (web3Context: Web3Context) => + ethRpcMethods.getCoinbase(web3Context.requestManager); + +/** + * View additional documentations here: {@link Web3Eth.isMining} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export const isMining = async (web3Context: Web3Context) => + ethRpcMethods.getMining(web3Context.requestManager); + +/** + * View additional documentations here: {@link Web3Eth.getHashRate} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getHashRate( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.getHashRate(web3Context.requestManager); + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getGasPrice} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getGasPrice( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.getGasPrice(web3Context.requestManager); + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getMaxPriorityFeePerGas} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getMaxPriorityFeePerGas( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.getMaxPriorityFeePerGas(web3Context.requestManager); + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} +/** + * View additional documentations here: {@link Web3Eth.getBlockNumber} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getBlockNumber( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.getBlockNumber(web3Context.requestManager); + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getBalance} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getBalance( + web3Context: Web3Context, + address: Address, + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + const response = await ethRpcMethods.getBalance( + web3Context.requestManager, + address, + blockNumberFormatted, + ); + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getStorageAt} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getStorageAt( + web3Context: Web3Context, + address: Address, + storageSlot: Numbers, + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const storageSlotFormatted = format({ format: 'uint' }, storageSlot, ETH_DATA_FORMAT); + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + const response = await ethRpcMethods.getStorageAt( + web3Context.requestManager, + address, + storageSlotFormatted, + blockNumberFormatted, + ); + return format({ format: 'bytes' }, response as Bytes, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getCode} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getCode( + web3Context: Web3Context, + address: Address, + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + const response = await ethRpcMethods.getCode( + web3Context.requestManager, + address, + blockNumberFormatted, + ); + return format({ format: 'bytes' }, response as Bytes, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getBlock} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getBlock( + web3Context: Web3Context, + block: Bytes | BlockNumberOrTag = web3Context.defaultBlock, + hydrated = false, + returnFormat: ReturnFormat, +) { + let response; + if (isBytes(block)) { + const blockHashFormatted = format({ format: 'bytes32' }, block, ETH_DATA_FORMAT); + response = await ethRpcMethods.getBlockByHash( + web3Context.requestManager, + blockHashFormatted as HexString, + hydrated, + ); + } else { + const blockNumberFormatted = isBlockTag(block as string) + ? (block as BlockTag) + : format({ format: 'uint' }, block as Numbers, ETH_DATA_FORMAT); + response = await ethRpcMethods.getBlockByNumber( + web3Context.requestManager, + blockNumberFormatted, + hydrated, + ); + } + return format(blockSchema, response as unknown as Block, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getBlockTransactionCount} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getBlockTransactionCount( + web3Context: Web3Context, + block: Bytes | BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + let response; + if (isBytes(block)) { + const blockHashFormatted = format({ format: 'bytes32' }, block, ETH_DATA_FORMAT); + response = await ethRpcMethods.getBlockTransactionCountByHash( + web3Context.requestManager, + blockHashFormatted as HexString, + ); + } else { + const blockNumberFormatted = isBlockTag(block as string) + ? (block as BlockTag) + : format({ format: 'uint' }, block as Numbers, ETH_DATA_FORMAT); + response = await ethRpcMethods.getBlockTransactionCountByNumber( + web3Context.requestManager, + blockNumberFormatted, + ); + } + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getBlockUncleCount} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getBlockUncleCount( + web3Context: Web3Context, + block: Bytes | BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + let response; + if (isBytes(block)) { + const blockHashFormatted = format({ format: 'bytes32' }, block, ETH_DATA_FORMAT); + response = await ethRpcMethods.getUncleCountByBlockHash( + web3Context.requestManager, + blockHashFormatted as HexString, + ); + } else { + const blockNumberFormatted = isBlockTag(block as string) + ? (block as BlockTag) + : format({ format: 'uint' }, block as Numbers, ETH_DATA_FORMAT); + response = await ethRpcMethods.getUncleCountByBlockNumber( + web3Context.requestManager, + blockNumberFormatted, + ); + } + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getUncle} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getUncle( + web3Context: Web3Context, + block: Bytes | BlockNumberOrTag = web3Context.defaultBlock, + uncleIndex: Numbers, + returnFormat: ReturnFormat, +) { + const uncleIndexFormatted = format({ format: 'uint' }, uncleIndex, ETH_DATA_FORMAT); + + let response; + if (isBytes(block)) { + const blockHashFormatted = format({ format: 'bytes32' }, block, ETH_DATA_FORMAT); + response = await ethRpcMethods.getUncleByBlockHashAndIndex( + web3Context.requestManager, + blockHashFormatted as HexString, + uncleIndexFormatted, + ); + } else { + const blockNumberFormatted = isBlockTag(block as string) + ? (block as BlockTag) + : format({ format: 'uint' }, block as Numbers, ETH_DATA_FORMAT); + response = await ethRpcMethods.getUncleByBlockNumberAndIndex( + web3Context.requestManager, + blockNumberFormatted, + uncleIndexFormatted, + ); + } + + return format(blockSchema, response as unknown as Block, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.getTransaction} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getTransaction( + web3Context: Web3Context, + transactionHash: Bytes, + returnFormat: ReturnFormat, +) { + const transactionHashFormatted = format( + { format: 'bytes32' }, + transactionHash, + DEFAULT_RETURN_FORMAT, + ); + const response = await ethRpcMethods.getTransactionByHash( + web3Context.requestManager, + transactionHashFormatted, + ); + + return isNullish(response) + ? response + : formatTransaction(response, returnFormat, { fillInputAndData: true }); +} + +/** + * View additional documentations here: {@link Web3Eth.getPendingTransactions} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getPendingTransactions( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.getPendingTransactions(web3Context.requestManager); + + return response.map(transaction => + formatTransaction(transaction as unknown as Transaction, returnFormat, { + fillInputAndData: true, + }), + ); +} + +/** + * View additional documentations here: {@link Web3Eth.getTransactionFromBlock} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getTransactionFromBlock( + web3Context: Web3Context, + block: Bytes | BlockNumberOrTag = web3Context.defaultBlock, + transactionIndex: Numbers, + returnFormat: ReturnFormat, +) { + const transactionIndexFormatted = format({ format: 'uint' }, transactionIndex, ETH_DATA_FORMAT); + + let response; + if (isBytes(block)) { + const blockHashFormatted = format({ format: 'bytes32' }, block, ETH_DATA_FORMAT); + response = await ethRpcMethods.getTransactionByBlockHashAndIndex( + web3Context.requestManager, + blockHashFormatted as HexString, + transactionIndexFormatted, + ); + } else { + const blockNumberFormatted = isBlockTag(block as string) + ? (block as BlockTag) + : format({ format: 'uint' }, block as Numbers, ETH_DATA_FORMAT); + response = await ethRpcMethods.getTransactionByBlockNumberAndIndex( + web3Context.requestManager, + blockNumberFormatted, + transactionIndexFormatted, + ); + } + + return isNullish(response) + ? response + : formatTransaction(response, returnFormat, { fillInputAndData: true }); +} + +/** + * View additional documentations here: {@link Web3Eth.getTransactionReceipt} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getTransactionReceipt( + web3Context: Web3Context, + transactionHash: Bytes, + returnFormat: ReturnFormat, +) { + const transactionHashFormatted = format( + { format: 'bytes32' }, + transactionHash, + DEFAULT_RETURN_FORMAT, + ); + const response = await ethRpcMethods.getTransactionReceipt( + web3Context.requestManager, + transactionHashFormatted, + ); + + return isNullish(response) + ? response + : (format( + transactionReceiptSchema, + response as unknown as TransactionReceipt, + returnFormat, + ) as TransactionReceipt); +} + +/** + * View additional documentations here: {@link Web3Eth.getTransactionCount} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getTransactionCount( + web3Context: Web3Context, + address: Address, + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + const response = await ethRpcMethods.getTransactionCount( + web3Context.requestManager, + address, + blockNumberFormatted, + ); + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.sendTransaction} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export function sendTransaction< + ReturnFormat extends DataFormat, + ResolveType = FormatType, +>( + web3Context: Web3Context, + transaction: + | Transaction + | TransactionWithFromLocalWalletIndex + | TransactionWithToLocalWalletIndex + | TransactionWithFromAndToLocalWalletIndex, + returnFormat: ReturnFormat, + options: SendTransactionOptions = { checkRevertBeforeSending: true }, +): Web3PromiEvent> { + const promiEvent = new Web3PromiEvent>( + (resolve, reject) => { + setImmediate(() => { + (async () => { + const sendTxHelper = new SendTxHelper({ + web3Context, + promiEvent, + options, + returnFormat, + }); + + let transactionFormatted: + | Transaction + | TransactionWithFromLocalWalletIndex + | TransactionWithToLocalWalletIndex + | TransactionWithFromAndToLocalWalletIndex = formatTransaction( + { + ...transaction, + from: getTransactionFromOrToAttr('from', web3Context, transaction), + to: getTransactionFromOrToAttr('to', web3Context, transaction), + }, + ETH_DATA_FORMAT, + ); + + try { + transactionFormatted = await sendTxHelper.populateGasPrice({ + transaction, + transactionFormatted, + }); + + await sendTxHelper.checkRevertBeforeSending( + transactionFormatted as TransactionCall, + ); + + sendTxHelper.emitSending(transactionFormatted); + + let wallet: Web3BaseWalletAccount | undefined; + + if (web3Context.wallet && !isNullish(transactionFormatted.from)) { + wallet = web3Context.wallet.get( + (transactionFormatted as Transaction).from as string, + ); + } + + const transactionHash: HexString = await sendTxHelper.signAndSend({ + wallet, + tx: transactionFormatted, + }); + + const transactionHashFormatted = format( + { format: 'bytes32' }, + transactionHash as Bytes, + returnFormat, + ); + sendTxHelper.emitSent(transactionFormatted); + sendTxHelper.emitTransactionHash( + transactionHashFormatted as string & Uint8Array, + ); + + const transactionReceipt = await waitForTransactionReceipt( + web3Context, + transactionHash, + returnFormat, + ); + + const transactionReceiptFormatted = sendTxHelper.getReceiptWithEvents( + format(transactionReceiptSchema, transactionReceipt, returnFormat), + ); + + sendTxHelper.emitReceipt(transactionReceiptFormatted); + + resolve( + await sendTxHelper.handleResolve({ + receipt: transactionReceiptFormatted, + tx: transactionFormatted as TransactionCall, + }), + ); + + sendTxHelper.emitConfirmation({ + receipt: transactionReceiptFormatted, + transactionHash, + }); + } catch (error) { + reject( + await sendTxHelper.handleError({ + error, + tx: transactionFormatted as TransactionCall, + }), + ); + } + })() as unknown; + }); + }, + ); + + return promiEvent; +} + +/** + * View additional documentations here: {@link Web3Eth.sendSignedTransaction} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export function sendSignedTransaction< + ReturnFormat extends DataFormat, + ResolveType = FormatType, +>( + web3Context: Web3Context, + signedTransaction: Bytes, + returnFormat: ReturnFormat, + options: SendSignedTransactionOptions = { checkRevertBeforeSending: true }, +): Web3PromiEvent> { + // TODO - Promise returned in function argument where a void return was expected + // eslint-disable-next-line @typescript-eslint/no-misused-promises + const promiEvent = new Web3PromiEvent>( + (resolve, reject) => { + setImmediate(() => { + (async () => { + const sendTxHelper = new SendTxHelper({ + web3Context, + promiEvent, + options, + returnFormat, + }); + // Formatting signedTransaction to be send to RPC endpoint + const signedTransactionFormattedHex = format( + { format: 'bytes' }, + signedTransaction, + ETH_DATA_FORMAT, + ); + const unSerializedTransaction = TransactionFactory.fromSerializedData( + bytesToUint8Array(hexToBytes(signedTransactionFormattedHex)), + ); + const unSerializedTransactionWithFrom = { + ...unSerializedTransaction.toJSON(), + // Some providers will default `from` to address(0) causing the error + // reported from `eth_call` to not be the reason the user's tx failed + // e.g. `eth_call` will return an Out of Gas error for a failed + // smart contract execution contract, because the sender, address(0), + // has no balance to pay for the gas of the transaction execution + from: unSerializedTransaction.getSenderAddress().toString(), + }; + + try { + const { v, r, s, ...txWithoutSigParams } = unSerializedTransactionWithFrom; + + await sendTxHelper.checkRevertBeforeSending( + txWithoutSigParams as TransactionCall, + ); + + sendTxHelper.emitSending(signedTransactionFormattedHex); + + const transactionHash = await trySendTransaction( + web3Context, + async (): Promise => + ethRpcMethods.sendRawTransaction( + web3Context.requestManager, + signedTransactionFormattedHex, + ), + ); + + sendTxHelper.emitSent(signedTransactionFormattedHex); + + const transactionHashFormatted = format( + { format: 'bytes32' }, + transactionHash as Bytes, + returnFormat, + ); + + sendTxHelper.emitTransactionHash( + transactionHashFormatted as string & Uint8Array, + ); + + const transactionReceipt = await waitForTransactionReceipt( + web3Context, + transactionHash, + returnFormat, + ); + + const transactionReceiptFormatted = sendTxHelper.getReceiptWithEvents( + format(transactionReceiptSchema, transactionReceipt, returnFormat), + ); + + sendTxHelper.emitReceipt(transactionReceiptFormatted); + + resolve( + await sendTxHelper.handleResolve({ + receipt: transactionReceiptFormatted, + tx: unSerializedTransactionWithFrom as TransactionCall, + }), + ); + + sendTxHelper.emitConfirmation({ + receipt: transactionReceiptFormatted, + transactionHash, + }); + } catch (error) { + reject( + await sendTxHelper.handleError({ + error, + tx: unSerializedTransactionWithFrom as TransactionCall, + }), + ); + } + })() as unknown; + }); + }, + ); + + return promiEvent; +} + +/** + * View additional documentations here: {@link Web3Eth.sign} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function sign( + web3Context: Web3Context, + message: Bytes, + addressOrIndex: Address | number, + returnFormat: ReturnFormat, +) { + const messageFormatted = format({ format: 'bytes' }, message, DEFAULT_RETURN_FORMAT); + if (web3Context.wallet?.get(addressOrIndex)) { + const wallet = web3Context.wallet.get(addressOrIndex) as Web3BaseWalletAccount; + const signed = wallet.sign(messageFormatted); + return format(SignatureObjectSchema, signed, returnFormat); + } + + if (typeof addressOrIndex === 'number') { + throw new SignatureError( + message, + 'RPC method "eth_sign" does not support index signatures', + ); + } + + const response = await ethRpcMethods.sign( + web3Context.requestManager, + addressOrIndex, + messageFormatted, + ); + + return format({ format: 'bytes' }, response as Bytes, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.signTransaction} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function signTransaction( + web3Context: Web3Context, + transaction: Transaction, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.signTransaction( + web3Context.requestManager, + formatTransaction(transaction, ETH_DATA_FORMAT), + ); + // Some clients only return the encoded signed transaction (e.g. Ganache) + // while clients such as Geth return the desired SignedTransactionInfoAPI object + return isString(response as HexStringBytes) + ? decodeSignedTransaction(response as HexStringBytes, returnFormat, { + fillInputAndData: true, + }) + : { + raw: format( + { format: 'bytes' }, + (response as SignedTransactionInfoAPI).raw, + returnFormat, + ), + tx: formatTransaction((response as SignedTransactionInfoAPI).tx, returnFormat, { + fillInputAndData: true, + }), + }; +} + +// TODO Decide what to do with transaction.to +// https://github.com/ChainSafe/web3.js/pull/4525#issuecomment-982330076 +/** + * View additional documentations here: {@link Web3Eth.call} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function call( + web3Context: Web3Context, + transaction: TransactionCall, + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + + const response = await ethRpcMethods.call( + web3Context.requestManager, + formatTransaction(transaction, ETH_DATA_FORMAT), + blockNumberFormatted, + ); + + return format({ format: 'bytes' }, response as Bytes, returnFormat); +} + +// TODO - Investigate whether response is padded as 1.x docs suggest +/** + * View additional documentations here: {@link Web3Eth.estimateGas} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function estimateGas( + web3Context: Web3Context, + transaction: Transaction, + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const transactionFormatted = formatTransaction(transaction, ETH_DATA_FORMAT); + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + + const response = await ethRpcMethods.estimateGas( + web3Context.requestManager, + transactionFormatted, + blockNumberFormatted, + ); + + return format({ format: 'uint' }, response as Numbers, returnFormat); +} + +// TODO - Add input formatting to filter +/** + * View additional documentations here: {@link Web3Eth.getPastLogs} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getLogs( + web3Context: Web3Context, + filter: Filter, + returnFormat: ReturnFormat, +) { + // format type bigint or number toBlock and fromBlock to hexstring. + let { toBlock, fromBlock } = filter; + if (!isNullish(toBlock)) { + if (typeof toBlock === 'number' || typeof toBlock === 'bigint') { + toBlock = numberToHex(toBlock); + } + } + if (!isNullish(fromBlock)) { + if (typeof fromBlock === 'number' || typeof fromBlock === 'bigint') { + fromBlock = numberToHex(fromBlock); + } + } + + const formattedFilter = { ...filter, fromBlock, toBlock }; + + const response = await ethRpcMethods.getLogs(web3Context.requestManager, formattedFilter); + + const result = response.map(res => { + if (typeof res === 'string') { + return res; + } + + return format(logSchema, res as unknown as Log, returnFormat); + }); + + return result; +} + +/** + * View additional documentations here: {@link Web3Eth.getChainId} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getChainId( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.getChainId(web3Context.requestManager); + + return format( + { format: 'uint' }, + // Response is number in hex formatted string + response as unknown as number, + returnFormat, + ); +} + +/** + * View additional documentations here: {@link Web3Eth.getProof} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getProof( + web3Context: Web3Context, + address: Address, + storageKeys: Bytes[], + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const storageKeysFormatted = storageKeys.map(storageKey => + format({ format: 'bytes' }, storageKey, ETH_DATA_FORMAT), + ); + + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + + const response = await ethRpcMethods.getProof( + web3Context.requestManager, + address, + storageKeysFormatted, + blockNumberFormatted, + ); + + return format(accountSchema, response as unknown as AccountObject, returnFormat); +} + +// TODO Throwing an error with Geth, but not Infura +// TODO gasUsedRatio and reward not formatting +/** + * View additional documentations here: {@link Web3Eth.getFeeHistory} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function getFeeHistory( + web3Context: Web3Context, + blockCount: Numbers, + newestBlock: BlockNumberOrTag = web3Context.defaultBlock, + rewardPercentiles: Numbers[], + returnFormat: ReturnFormat, +) { + const blockCountFormatted = format({ format: 'uint' }, blockCount, ETH_DATA_FORMAT); + + const newestBlockFormatted = isBlockTag(newestBlock as string) + ? (newestBlock as BlockTag) + : format({ format: 'uint' }, newestBlock as Numbers, ETH_DATA_FORMAT); + + const rewardPercentilesFormatted = format( + { + type: 'array', + items: { + format: 'uint', + }, + }, + rewardPercentiles, + NUMBER_DATA_FORMAT, + ); + + const response = await ethRpcMethods.getFeeHistory( + web3Context.requestManager, + blockCountFormatted, + newestBlockFormatted, + rewardPercentilesFormatted, + ); + + return format(feeHistorySchema, response as unknown as FeeHistory, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.createAccessList} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function createAccessList( + web3Context: Web3Context, + transaction: TransactionForAccessList, + blockNumber: BlockNumberOrTag = web3Context.defaultBlock, + returnFormat: ReturnFormat, +) { + const blockNumberFormatted = isBlockTag(blockNumber as string) + ? (blockNumber as BlockTag) + : format({ format: 'uint' }, blockNumber as Numbers, ETH_DATA_FORMAT); + + const response = (await ethRpcMethods.createAccessList( + web3Context.requestManager, + formatTransaction(transaction, ETH_DATA_FORMAT), + blockNumberFormatted, + )) as unknown as AccessListResult; + + return format(accessListResultSchema, response, returnFormat); +} + +/** + * View additional documentations here: {@link Web3Eth.signTypedData} + * @param web3Context ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + */ +export async function signTypedData( + web3Context: Web3Context, + address: Address, + typedData: Eip712TypedData, + useLegacy: boolean, + returnFormat: ReturnFormat, +) { + const response = await ethRpcMethods.signTypedData( + web3Context.requestManager, + address, + typedData, + useLegacy, + ); + + return format({ format: 'bytes' }, response, returnFormat); +} diff --git a/packages/web3-eth/src/schemas.ts b/packages/web3-eth/src/schemas.ts new file mode 100644 index 00000000000..89e23459fac --- /dev/null +++ b/packages/web3-eth/src/schemas.ts @@ -0,0 +1,641 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const accessListItemSchema = { + type: 'object', + properties: { + address: { + format: 'address', + }, + storageKeys: { + type: 'array', + items: { + format: 'bytes32', + }, + }, + }, +}; + +export const accessListSchema = { + type: 'array', + items: { + ...accessListItemSchema, + }, +}; + +export const accessListResultSchema = { + type: 'object', + properties: { + accessList: { + ...accessListSchema, + }, + gasUsed: { + type: 'string', + }, + }, +}; + +export const chainSchema = { + type: 'string', + enum: ['goerli', 'kovan', 'mainnet', 'rinkeby', 'ropsten', 'sepolia'], +}; + +export const hardforkSchema = { + type: 'string', + enum: [ + 'arrowGlacier', + 'berlin', + 'byzantium', + 'chainstart', + 'constantinople', + 'dao', + 'homestead', + 'istanbul', + 'london', + 'merge', + 'muirGlacier', + 'petersburg', + 'shanghai', + 'spuriousDragon', + 'tangerineWhistle', + ], +}; + +export const customChainSchema = { + type: 'object', + properties: { + name: { + format: 'string', + }, + networkId: { + format: 'uint', + }, + chainId: { + format: 'uint', + }, + }, +}; + +export const transactionSchema = { + type: 'object', + properties: { + from: { + format: 'address', + }, + to: { + oneOf: [{ format: 'address' }, { type: 'null' }], + }, + value: { + format: 'uint', + }, + gas: { + format: 'uint', + }, + gasPrice: { + format: 'uint', + }, + effectiveGasPrice: { + format: 'uint', + }, + type: { + format: 'uint', + }, + maxFeePerGas: { + format: 'uint', + }, + maxPriorityFeePerGas: { + format: 'uint', + }, + accessList: { + ...accessListSchema, + }, + data: { + format: 'bytes', + }, + input: { + format: 'bytes', + }, + nonce: { + format: 'uint', + }, + chain: { ...chainSchema }, + hardfork: { ...hardforkSchema }, + chainId: { + format: 'uint', + }, + networkId: { + format: 'uint', + }, + common: { + type: 'object', + properties: { + customChain: { ...customChainSchema }, + baseChain: { + ...chainSchema, + }, + hardfork: { + ...hardforkSchema, + }, + }, + }, + gasLimit: { + format: 'uint', + }, + v: { + format: 'uint', + }, + r: { + format: 'bytes32', + }, + s: { + format: 'bytes32', + }, + }, +}; + +export const transactionInfoSchema = { + type: 'object', + properties: { + ...transactionSchema.properties, + blockHash: { + format: 'bytes32', + }, + blockNumber: { + format: 'uint', + }, + hash: { + format: 'bytes32', + }, + transactionIndex: { + format: 'uint', + }, + from: { + format: 'address', + }, + to: { + oneOf: [{ format: 'address' }, { type: 'null' }], + }, + value: { + format: 'uint', + }, + gas: { + format: 'uint', + }, + gasPrice: { + format: 'uint', + }, + effectiveGasPrice: { + format: 'uint', + }, + type: { + format: 'uint', + }, + maxFeePerGas: { + format: 'uint', + }, + maxPriorityFeePerGas: { + format: 'uint', + }, + accessList: { + ...accessListSchema, + }, + data: { + format: 'bytes', + }, + input: { + format: 'bytes', + }, + nonce: { + format: 'uint', + }, + gasLimit: { + format: 'uint', + }, + v: { + format: 'uint', + }, + r: { + format: 'bytes32', + }, + s: { + format: 'bytes32', + }, + }, +}; + +export const blockSchema = { + type: 'object', + properties: { + parentHash: { + format: 'bytes32', + }, + sha3Uncles: { + format: 'bytes32', + }, + miner: { + format: 'bytes', + }, + stateRoot: { + format: 'bytes32', + }, + transactionsRoot: { + format: 'bytes32', + }, + receiptsRoot: { + format: 'bytes32', + }, + logsBloom: { + format: 'bytes256', + }, + difficulty: { + format: 'uint', + }, + number: { + format: 'uint', + }, + gasLimit: { + format: 'uint', + }, + gasUsed: { + format: 'uint', + }, + timestamp: { + format: 'uint', + }, + extraData: { + format: 'bytes', + }, + mixHash: { + format: 'bytes32', + }, + nonce: { + format: 'uint', + }, + totalDifficulty: { + format: 'uint', + }, + baseFeePerGas: { + format: 'uint', + }, + size: { + format: 'uint', + }, + transactions: { + oneOf: [ + { + type: 'array', + items: { + ...transactionInfoSchema, + }, + }, + { + type: 'array', + items: { + format: 'bytes32', + }, + }, + ], + }, + uncles: { + type: 'array', + items: { + format: 'bytes32', + }, + }, + hash: { + format: 'bytes32', + }, + }, +}; + +export const withdrawalsSchema = { + type: 'object', + properties: { + index: { + format: 'uint', + }, + validatorIndex: { + format: 'uint', + }, + address: { + format: 'address', + }, + amount: { + format: 'uint', + }, + }, +}; + +export const blockHeaderSchema = { + type: 'object', + properties: { + author: { + format: 'bytes32', + }, + hash: { + format: 'bytes32', + }, + parentHash: { + format: 'bytes32', + }, + receiptsRoot: { + format: 'bytes32', + }, + miner: { + format: 'bytes', + }, + stateRoot: { + format: 'bytes32', + }, + transactionsRoot: { + format: 'bytes32', + }, + withdrawalsRoot: { + format: 'bytes32', + }, + logsBloom: { + format: 'bytes256', + }, + difficulty: { + format: 'uint', + }, + totalDifficulty: { + format: 'uint', + }, + number: { + format: 'uint', + }, + gasLimit: { + format: 'uint', + }, + gasUsed: { + format: 'uint', + }, + timestamp: { + format: 'uint', + }, + extraData: { + format: 'bytes', + }, + nonce: { + format: 'uint', + }, + sha3Uncles: { + format: 'bytes32', + }, + size: { + format: 'uint', + }, + baseFeePerGas: { + format: 'uint', + }, + excessDataGas: { + format: 'uint', + }, + mixHash: { + format: 'bytes32', + }, + transactions: { + type: 'array', + items: { + format: 'bytes32', + }, + }, + uncles: { + type: 'array', + items: { + format: 'bytes32', + }, + }, + withdrawals: { + type: 'array', + items: { + ...withdrawalsSchema, + }, + }, + }, +}; + +export const logSchema = { + type: 'object', + properties: { + removed: { + format: 'bool', + }, + logIndex: { + format: 'uint', + }, + transactionIndex: { + format: 'uint', + }, + transactionHash: { + format: 'bytes32', + }, + blockHash: { + format: 'bytes32', + }, + blockNumber: { + format: 'uint', + }, + address: { + format: 'address', + }, + data: { + format: 'bytes', + }, + topics: { + type: 'array', + items: { + format: 'bytes32', + }, + }, + }, +}; +export const syncSchema = { + type: 'object', + properties: { + startingBlock: { + format: 'string', + }, + currentBlock: { + format: 'string', + }, + highestBlock: { + format: 'string', + }, + knownStates: { + format: 'string', + }, + pulledStates: { + format: 'string', + }, + }, +}; + +export const transactionReceiptSchema = { + type: 'object', + properties: { + transactionHash: { + format: 'bytes32', + }, + transactionIndex: { + format: 'uint', + }, + blockHash: { + format: 'bytes32', + }, + blockNumber: { + format: 'uint', + }, + from: { + format: 'address', + }, + to: { + format: 'address', + }, + cumulativeGasUsed: { + format: 'uint', + }, + gasUsed: { + format: 'uint', + }, + effectiveGasPrice: { + format: 'uint', + }, + contractAddress: { + format: 'address', + }, + logs: { + type: 'array', + items: { + ...logSchema, + }, + }, + logsBloom: { + format: 'bytes', + }, + root: { + format: 'bytes', + }, + status: { + format: 'uint', + }, + type: { + format: 'uint', + }, + }, +}; + +export const SignatureObjectSchema = { + type: 'object', + properties: { + messageHash: { + format: 'bytes', + }, + r: { + format: 'bytes32', + }, + s: { + format: 'bytes32', + }, + v: { + format: 'bytes', + }, + message: { + format: 'bytes', + }, + signature: { + format: 'bytes', + }, + }, +}; +export const feeHistorySchema = { + type: 'object', + properties: { + oldestBlock: { + format: 'uint', + }, + baseFeePerGas: { + type: 'array', + items: { + format: 'uint', + }, + }, + reward: { + type: 'array', + items: { + type: 'array', + items: { + format: 'uint', + }, + }, + }, + gasUsedRatio: { + type: 'array', + items: { + type: 'number', + }, + }, + }, +}; + +export const storageProofSchema = { + type: 'object', + properties: { + key: { + format: 'bytes32', + }, + value: { + format: 'uint', + }, + proof: { + type: 'array', + items: { + format: 'bytes32', + }, + }, + }, +}; + +export const accountSchema = { + type: 'object', + properties: { + balance: { + format: 'uint', + }, + codeHash: { + format: 'bytes32', + }, + nonce: { + format: 'uint', + }, + storageHash: { + format: 'bytes32', + }, + accountProof: { + type: 'array', + items: { + format: 'bytes32', + }, + }, + storageProof: { + type: 'array', + items: { + ...storageProofSchema, + }, + }, + }, +}; diff --git a/packages/web3-eth/src/types.ts b/packages/web3-eth/src/types.ts new file mode 100644 index 00000000000..e1bba319d69 --- /dev/null +++ b/packages/web3-eth/src/types.ts @@ -0,0 +1,90 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + ContractExecutionError, + TransactionRevertedWithoutReasonError, + TransactionRevertInstructionError, + TransactionRevertWithCustomError, + InvalidResponseError, + TransactionPollingTimeoutError, +} from 'web3-errors'; +import { + FormatType, + ETH_DATA_FORMAT, + DataFormat, + Bytes, + ContractAbi, + HexString, + Numbers, + Transaction, + TransactionReceipt, +} from 'web3-types'; + +export type InternalTransaction = FormatType; + +export type SendTransactionEventsBase = { + sending: FormatType; + sent: FormatType; + transactionHash: FormatType; + receipt: FormatType; + confirmation: { + confirmations: FormatType; + receipt: FormatType; + latestBlockHash: FormatType; + }; + error: + | TransactionRevertedWithoutReasonError> + | TransactionRevertInstructionError> + | TransactionRevertWithCustomError> + | TransactionPollingTimeoutError + | InvalidResponseError + | ContractExecutionError; +}; + +export type SendTransactionEvents = SendTransactionEventsBase< + ReturnFormat, + Transaction +>; +export type SendSignedTransactionEvents = + SendTransactionEventsBase; + +export interface SendTransactionOptions { + ignoreGasPricing?: boolean; + transactionResolver?: (receipt: TransactionReceipt) => ResolveType; + contractAbi?: ContractAbi; + checkRevertBeforeSending?: boolean; + ignoreFillingGasLimit?: boolean; +} + +export interface SendSignedTransactionOptions { + transactionResolver?: (receipt: TransactionReceipt) => ResolveType; + contractAbi?: ContractAbi; + checkRevertBeforeSending?: boolean; +} + +export interface RevertReason { + reason: string; + signature?: HexString; + data?: HexString; +} + +export interface RevertReasonWithCustomError extends RevertReason { + customErrorName: string; + customErrorDecodedSignature: string; + customErrorArguments: Record; +} diff --git a/packages/web3-eth/src/utils/decode_signed_transaction.ts b/packages/web3-eth/src/utils/decode_signed_transaction.ts new file mode 100644 index 00000000000..943ea188e2c --- /dev/null +++ b/packages/web3-eth/src/utils/decode_signed_transaction.ts @@ -0,0 +1,54 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + DataFormat, + HexStringBytes, + SignedTransactionInfoAPI, + TransactionSignedAPI, +} from 'web3-types'; +import { bytesToHex, format, hexToBytes, keccak256 } from 'web3-utils'; +import { TransactionFactory } from 'web3-eth-accounts'; +import { detectRawTransactionType } from './detect_transaction_type.js'; +import { formatTransaction } from './format_transaction.js'; + +/** + * Decodes an [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/#top) encoded transaction. + * + * @param encodedSignedTransaction The RLP encoded transaction. + * @param returnFormat ({@link DataFormat} Specifies how the return data should be formatted. + * @returns {@link SignedTransactionInfoAPI}, an object containing the RLP encoded signed transaction (accessed via the `raw` property) and the signed transaction object (accessed via the `tx` property). + */ +export function decodeSignedTransaction( + encodedSignedTransaction: HexStringBytes, + returnFormat: ReturnFormat, + options: { fillInputAndData?: boolean } = { fillInputAndData: false }, +): SignedTransactionInfoAPI { + return { + raw: format({ format: 'bytes' }, encodedSignedTransaction, returnFormat), + tx: formatTransaction( + { + ...TransactionFactory.fromSerializedData( + hexToBytes(encodedSignedTransaction), + ).toJSON(), + hash: bytesToHex(keccak256(hexToBytes(encodedSignedTransaction))), + type: detectRawTransactionType(hexToBytes(encodedSignedTransaction)), + } as TransactionSignedAPI, + returnFormat, + { fillInputAndData: options.fillInputAndData }, + ), + }; +} diff --git a/packages/web3-eth/src/utils/decoding.ts b/packages/web3-eth/src/utils/decoding.ts new file mode 100644 index 00000000000..f4b61c0a5ac --- /dev/null +++ b/packages/web3-eth/src/utils/decoding.ts @@ -0,0 +1,95 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { format } from 'web3-utils'; + +import { + AbiEventFragment, + LogsInput, + DataFormat, + DEFAULT_RETURN_FORMAT, + EventLog, + ContractAbiWithSignature, +} from 'web3-types'; + +import { decodeLog } from 'web3-eth-abi'; + +import { logSchema } from '../schemas.js'; +import { ALL_EVENTS } from '../constants.js'; + +export const decodeEventABI = ( + event: AbiEventFragment & { signature: string }, + data: LogsInput, + jsonInterface: ContractAbiWithSignature, + returnFormat: DataFormat = DEFAULT_RETURN_FORMAT, +): EventLog => { + let modifiedEvent = { ...event }; + + const result = format(logSchema, data, returnFormat); + + // if allEvents get the right event + if ([ALL_EVENTS, 'allEvents'].includes(modifiedEvent.name)) { + const matchedEvent = jsonInterface.find(j => j.signature === data.topics[0]); + if (matchedEvent) { + modifiedEvent = matchedEvent as AbiEventFragment & { signature: string }; + } else { + modifiedEvent = { anonymous: true } as unknown as AbiEventFragment & { + signature: string; + }; + } + } + + // create empty inputs if none are present (e.g. anonymous events on allEvents) + modifiedEvent.inputs = modifiedEvent.inputs ?? event.inputs ?? []; + + // Handle case where an event signature shadows the current ABI with non-identical + // arg indexing. If # of topics doesn't match, event is anon. + if (!modifiedEvent.anonymous) { + let indexedInputs = 0; + (modifiedEvent.inputs ?? []).forEach(input => { + if (input.indexed) { + indexedInputs += 1; + } + }); + + if (indexedInputs > 0 && data?.topics && data?.topics.length !== indexedInputs + 1) { + // checks if event is anonymous + modifiedEvent = { + ...modifiedEvent, + anonymous: true, + inputs: [], + }; + } + } + + const argTopics = modifiedEvent.anonymous ? data.topics : (data.topics ?? []).slice(1); + + return { + ...result, + returnValues: decodeLog([...(modifiedEvent.inputs ?? [])], data.data, argTopics), + event: modifiedEvent.name, + signature: + modifiedEvent.anonymous || !data.topics || data.topics.length === 0 || !data.topics[0] + ? undefined + : data.topics[0], + + raw: { + data: data.data, + topics: data.topics, + }, + }; +}; diff --git a/packages/web3-eth/src/utils/detect_transaction_type.ts b/packages/web3-eth/src/utils/detect_transaction_type.ts new file mode 100644 index 00000000000..ec5539b375a --- /dev/null +++ b/packages/web3-eth/src/utils/detect_transaction_type.ts @@ -0,0 +1,146 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { format, toHex } from 'web3-utils'; +import { TransactionTypeParser, Web3Context } from 'web3-core'; +import { EthExecutionAPI, HardforksOrdered, Transaction, ETH_DATA_FORMAT } from 'web3-types'; +import { Web3ValidatorError, isNullish, validator } from 'web3-validator'; +import { InvalidPropertiesForTransactionTypeError } from 'web3-errors'; + +import { InternalTransaction } from '../types.js'; + +// undefined is treated as null for JSON schema validator +const transactionType0x0Schema = { + type: 'object', + properties: { + accessList: { + type: 'null', + }, + maxFeePerGas: { + type: 'null', + }, + maxPriorityFeePerGas: { + type: 'null', + }, + }, +}; +const transactionType0x1Schema = { + type: 'object', + properties: { + maxFeePerGas: { + type: 'null', + }, + maxPriorityFeePerGas: { + type: 'null', + }, + }, +}; +const transactionType0x2Schema = { + type: 'object', + properties: { + gasPrice: { + type: 'null', + }, + }, +}; + +const validateTxTypeAndHandleErrors = ( + txSchema: object, + tx: Transaction, + txType: '0x0' | '0x1' | '0x2', +) => { + try { + validator.validateJSONSchema(txSchema, tx); + } catch (error) { + if (error instanceof Web3ValidatorError) + // Erroneously reported error + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + throw new InvalidPropertiesForTransactionTypeError(error.errors, txType); + + throw error; + } +}; + +export const defaultTransactionTypeParser: TransactionTypeParser = ( + transaction +) => { + const tx = transaction as unknown as Transaction; + if (!isNullish(tx.type)) { + let txSchema; + switch (tx.type) { + case '0x0': + txSchema = transactionType0x0Schema; + break; + case '0x1': + txSchema = transactionType0x1Schema; + break; + case '0x2': + txSchema = transactionType0x2Schema; + break; + + default: + return format({ format: 'uint' }, tx.type, ETH_DATA_FORMAT); + } + + validateTxTypeAndHandleErrors(txSchema, tx, tx.type); + + return format({ format: 'uint' }, tx.type, ETH_DATA_FORMAT); + } + + if (!isNullish(tx.maxFeePerGas) || !isNullish(tx.maxPriorityFeePerGas)) { + validateTxTypeAndHandleErrors(transactionType0x2Schema, tx, '0x2'); + return '0x2'; + } + + if (!isNullish(tx.accessList)) { + validateTxTypeAndHandleErrors(transactionType0x1Schema, tx, '0x1'); + return '0x1'; + } + + const givenHardfork = tx.hardfork ?? tx.common?.hardfork; + + if (!isNullish(givenHardfork)) { + const hardforkIndex = Object.keys(HardforksOrdered).indexOf(givenHardfork); + + // givenHardfork is London or later, so EIP-2718 is supported + if (hardforkIndex >= Object.keys(HardforksOrdered).indexOf('london')) + return !isNullish(tx.gasPrice) ? '0x0' : '0x2'; + + // givenHardfork is Berlin, tx.accessList is undefined, assume type is 0x0 + if (hardforkIndex === Object.keys(HardforksOrdered).indexOf('berlin')) return '0x0'; + } + + // gasprice is defined + if (!isNullish(tx.gasPrice)) { + validateTxTypeAndHandleErrors(transactionType0x0Schema, tx, '0x0'); + return '0x0'; + } + + // no transaction type can be inferred from properties, use default transaction type + return undefined; +}; + +export const detectTransactionType = ( + transaction: InternalTransaction, + web3Context?: Web3Context, +) => + (web3Context?.transactionTypeParser ?? defaultTransactionTypeParser)( + transaction as unknown as Record + ); + +export const detectRawTransactionType = (transaction: Uint8Array) => + transaction[0] > 0x7f ? '0x0' : toHex(transaction[0]); diff --git a/packages/web3-eth/src/utils/format_transaction.ts b/packages/web3-eth/src/utils/format_transaction.ts new file mode 100644 index 00000000000..5333254db60 --- /dev/null +++ b/packages/web3-eth/src/utils/format_transaction.ts @@ -0,0 +1,76 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Transaction, DataFormat, DEFAULT_RETURN_FORMAT, FormatType } from 'web3-types'; +import { isNullish, ValidationSchemaInput } from 'web3-validator'; +import { mergeDeep, format, bytesToHex, toHex } from 'web3-utils'; +import { TransactionDataAndInputError } from 'web3-errors'; + +import { transactionInfoSchema, transactionSchema } from '../schemas.js'; + +export function formatTransaction< + ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT, + TransactionType extends Transaction = Transaction, +>( + transaction: TransactionType, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + options: { + transactionSchema?: ValidationSchemaInput | typeof transactionSchema; + fillInputAndData?: boolean; + } = { + transactionSchema: transactionInfoSchema, + fillInputAndData: false, + }, +): FormatType { + let formattedTransaction = mergeDeep({}, transaction as Record) as Transaction; + if (!isNullish(transaction?.common)) { + formattedTransaction.common = { ...transaction.common }; + if (!isNullish(transaction.common?.customChain)) + formattedTransaction.common.customChain = { ...transaction.common.customChain }; + } + formattedTransaction = format( + options.transactionSchema ?? transactionInfoSchema, + formattedTransaction, + returnFormat, + ); + if ( + !isNullish(formattedTransaction.data) && + !isNullish(formattedTransaction.input) && + // Converting toHex is accounting for data and input being Uint8Arrays + // since comparing Uint8Array is not as straightforward as comparing strings + toHex(formattedTransaction.data) !== toHex(formattedTransaction.input) + ) + throw new TransactionDataAndInputError({ + data: bytesToHex(formattedTransaction.data), + input: bytesToHex(formattedTransaction.input), + }); + + if (options.fillInputAndData) { + if (!isNullish(formattedTransaction.data)) { + formattedTransaction.input = formattedTransaction.data; + } else if (!isNullish(formattedTransaction.input)) { + formattedTransaction.data = formattedTransaction.input; + } + } + + if (!isNullish(formattedTransaction.gasLimit)) { + formattedTransaction.gas = formattedTransaction.gasLimit; + delete formattedTransaction.gasLimit; + } + + return formattedTransaction as FormatType; +} diff --git a/packages/web3-eth/src/utils/get_revert_reason.ts b/packages/web3-eth/src/utils/get_revert_reason.ts new file mode 100644 index 00000000000..ae4fc32dbfa --- /dev/null +++ b/packages/web3-eth/src/utils/get_revert_reason.ts @@ -0,0 +1,91 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context } from 'web3-core'; +import { ContractExecutionError, Eip838ExecutionError, InvalidResponseError , MultipleErrors } from 'web3-errors'; +import { decodeContractErrorData, isAbiErrorFragment } from 'web3-eth-abi'; +import { + AbiErrorFragment, + ContractAbi, + DataFormat, + DEFAULT_RETURN_FORMAT, + EthExecutionAPI, + TransactionCall, +} from 'web3-types'; + +// eslint-disable-next-line import/no-cycle +import { call } from '../rpc_method_wrappers.js'; +import { RevertReason, RevertReasonWithCustomError } from '../types.js'; + +export const parseTransactionError = (error: unknown, contractAbi?: ContractAbi) => { + if (error instanceof ContractExecutionError && error.cause instanceof Eip838ExecutionError) { + if (contractAbi !== undefined) { + const errorsAbi = contractAbi.filter(abi => + isAbiErrorFragment(abi), + ) as unknown as AbiErrorFragment[]; + decodeContractErrorData(errorsAbi, error.cause); + + return { + reason: error.cause.message, + signature: error.cause.data?.slice(0, 10), + data: error.cause.data?.substring(10), + customErrorName: error.cause.errorName, + customErrorDecodedSignature: error.cause.errorSignature, + customErrorArguments: error.cause.errorArgs, + } as RevertReasonWithCustomError; + } + + return { + reason: error.cause.message, + signature: error.cause.data?.slice(0, 10), + data: error.cause.data?.substring(10), + } as RevertReason; + } + + if ( + error instanceof InvalidResponseError && + !Array.isArray((error.cause as MultipleErrors)?.errors) && + error.cause !== undefined + ) { + return error.cause.message; + } + + throw error; +}; + +/** + * Returns the revert reason generated by the EVM if the transaction were to be executed. + * + * @param web3Context - ({@link Web3Context}) Web3 configuration object that contains things such as the provider, request manager, wallet, etc. + * @param transaction - A transaction object where all properties are optional except `to`, however it's recommended to include the `from` property or it may default to `0x0000000000000000000000000000000000000000` depending on your node or provider. + * @returns `undefined` if no revert reason was given, a revert reason object, a revert reason string, or an `unknown` error + */ +export async function getRevertReason< + ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT, +>( + web3Context: Web3Context, + transaction: TransactionCall, + contractAbi?: ContractAbi, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, +): Promise { + try { + await call(web3Context, transaction, web3Context.defaultBlock, returnFormat); + return undefined; + } catch (error) { + return parseTransactionError(error, contractAbi); + } +} diff --git a/packages/web3-eth/src/utils/get_transaction_error.ts b/packages/web3-eth/src/utils/get_transaction_error.ts new file mode 100644 index 00000000000..4cb0f520937 --- /dev/null +++ b/packages/web3-eth/src/utils/get_transaction_error.ts @@ -0,0 +1,93 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context } from 'web3-core'; +import { + TransactionRevertedWithoutReasonError, + TransactionRevertInstructionError, + TransactionRevertWithCustomError, +} from 'web3-errors'; +import { + DataFormat, + FormatType, + ContractAbi, + TransactionCall, + TransactionReceipt, +} from 'web3-types'; +import { RevertReason, RevertReasonWithCustomError } from '../types.js'; +// eslint-disable-next-line import/no-cycle +import { getRevertReason, parseTransactionError } from './get_revert_reason.js'; + +export async function getTransactionError( + web3Context: Web3Context, + transactionFormatted?: TransactionCall, + transactionReceiptFormatted?: FormatType, + receivedError?: unknown, + contractAbi?: ContractAbi, + knownReason?: string | RevertReason | RevertReasonWithCustomError, +) { + let _reason: string | RevertReason | RevertReasonWithCustomError | undefined = knownReason; + + if (_reason === undefined) { + if (receivedError !== undefined) { + _reason = parseTransactionError(receivedError); + } else if (web3Context.handleRevert && transactionFormatted !== undefined) { + _reason = await getRevertReason(web3Context, transactionFormatted, contractAbi); + } + } + + let error: + | TransactionRevertedWithoutReasonError> + | TransactionRevertInstructionError> + | TransactionRevertWithCustomError>; + if (_reason === undefined) { + error = new TransactionRevertedWithoutReasonError< + FormatType + >(transactionReceiptFormatted); + } else if (typeof _reason === 'string') { + error = new TransactionRevertInstructionError>( + _reason, + undefined, + transactionReceiptFormatted, + ); + } else if ( + (_reason as RevertReasonWithCustomError).customErrorName !== undefined && + (_reason as RevertReasonWithCustomError).customErrorDecodedSignature !== undefined && + (_reason as RevertReasonWithCustomError).customErrorArguments !== undefined + ) { + const reasonWithCustomError: RevertReasonWithCustomError = + _reason as RevertReasonWithCustomError; + error = new TransactionRevertWithCustomError>( + reasonWithCustomError.reason, + reasonWithCustomError.customErrorName, + reasonWithCustomError.customErrorDecodedSignature, + reasonWithCustomError.customErrorArguments, + reasonWithCustomError.signature, + transactionReceiptFormatted, + reasonWithCustomError.data, + ); + } else { + error = new TransactionRevertInstructionError>( + _reason.reason, + _reason.signature, + transactionReceiptFormatted, + _reason.data, + ); + } + + return error; +} diff --git a/packages/web3-eth/src/utils/get_transaction_gas_pricing.ts b/packages/web3-eth/src/utils/get_transaction_gas_pricing.ts new file mode 100644 index 00000000000..e5bbcdedfd4 --- /dev/null +++ b/packages/web3-eth/src/utils/get_transaction_gas_pricing.ts @@ -0,0 +1,114 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context } from 'web3-core'; +import { + EthExecutionAPI, + Numbers, + Transaction, + DataFormat, + FormatType, + ETH_DATA_FORMAT, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { Eip1559NotSupportedError, UnsupportedTransactionTypeError } from 'web3-errors'; +import { format } from 'web3-utils'; +// eslint-disable-next-line import/no-cycle +import { getBlock, getGasPrice } from '../rpc_method_wrappers.js'; +import { InternalTransaction } from '../types.js'; +// eslint-disable-next-line import/no-cycle +import { getTransactionType } from './transaction_builder.js'; + +async function getEip1559GasPricing( + transaction: FormatType, + web3Context: Web3Context, + returnFormat: ReturnFormat, +): Promise> { + const block = await getBlock(web3Context, web3Context.defaultBlock, false, returnFormat); + + if (isNullish(block.baseFeePerGas)) throw new Eip1559NotSupportedError(); + + if (!isNullish(transaction.gasPrice)) { + const convertedTransactionGasPrice = format( + { format: 'uint' }, + transaction.gasPrice as Numbers, + returnFormat, + ); + + return { + maxPriorityFeePerGas: convertedTransactionGasPrice, + maxFeePerGas: convertedTransactionGasPrice, + }; + } + return { + maxPriorityFeePerGas: format( + { format: 'uint' }, + transaction.maxPriorityFeePerGas ?? web3Context.defaultMaxPriorityFeePerGas, + returnFormat, + ), + maxFeePerGas: format( + { format: 'uint' }, + (transaction.maxFeePerGas ?? + BigInt(block.baseFeePerGas) * BigInt(2) + + BigInt( + transaction.maxPriorityFeePerGas ?? web3Context.defaultMaxPriorityFeePerGas, + )) as Numbers, + returnFormat, + ), + }; +} + +export async function getTransactionGasPricing( + transaction: InternalTransaction, + web3Context: Web3Context, + returnFormat: ReturnFormat, +): Promise< + | FormatType< + { gasPrice?: Numbers; maxPriorityFeePerGas?: Numbers; maxFeePerGas?: Numbers }, + ReturnFormat + > + | undefined +> { + const transactionType = getTransactionType(transaction, web3Context); + if (!isNullish(transactionType)) { + if (transactionType.startsWith('-')) + throw new UnsupportedTransactionTypeError(transactionType); + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2718.md#transactions + if (Number(transactionType) < 0 || Number(transactionType) > 127) + throw new UnsupportedTransactionTypeError(transactionType); + + if ( + isNullish(transaction.gasPrice) && + (transactionType === '0x0' || transactionType === '0x1') + ) + return { + gasPrice: await getGasPrice(web3Context, returnFormat), + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + if (transactionType === '0x2') { + return { + gasPrice: undefined, + ...(await getEip1559GasPricing(transaction, web3Context, returnFormat)), + }; + } + } + + return undefined; +} diff --git a/packages/web3-eth/src/utils/index.ts b/packages/web3-eth/src/utils/index.ts new file mode 100644 index 00000000000..1251c4a6cc9 --- /dev/null +++ b/packages/web3-eth/src/utils/index.ts @@ -0,0 +1,21 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './detect_transaction_type.js'; +export * from './format_transaction.js'; +export * from './prepare_transaction_for_signing.js'; +export * from './transaction_builder.js'; diff --git a/packages/web3-eth/src/utils/prepare_transaction_for_signing.ts b/packages/web3-eth/src/utils/prepare_transaction_for_signing.ts new file mode 100644 index 00000000000..fe761ada1f6 --- /dev/null +++ b/packages/web3-eth/src/utils/prepare_transaction_for_signing.ts @@ -0,0 +1,149 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + EthExecutionAPI, + HexString, + PopulatedUnsignedEip1559Transaction, + PopulatedUnsignedEip2930Transaction, + PopulatedUnsignedTransaction, + Transaction, + ValidChains, + FormatType, + ETH_DATA_FORMAT, +} from 'web3-types'; +import { Web3Context } from 'web3-core'; +import { toNumber } from 'web3-utils'; +import { TransactionFactory, TxOptions, Common } from 'web3-eth-accounts'; +import { isNullish } from 'web3-validator'; +import { validateTransactionForSigning } from '../validation.js'; +import { formatTransaction } from './format_transaction.js'; +import { transactionBuilder } from './transaction_builder.js'; + +const getEthereumjsTxDataFromTransaction = ( + transaction: FormatType, +) => ({ + nonce: transaction.nonce, + gasPrice: transaction.gasPrice, + gasLimit: transaction.gasLimit ?? transaction.gas, + to: transaction.to, + value: transaction.value, + data: transaction.data ?? transaction.input, + type: transaction.type, + chainId: transaction.chainId, + accessList: ( + transaction as FormatType + ).accessList, + maxPriorityFeePerGas: ( + transaction as FormatType + ).maxPriorityFeePerGas, + maxFeePerGas: ( + transaction as FormatType + ).maxFeePerGas, +}); + +const getEthereumjsTransactionOptions = ( + transaction: FormatType, + web3Context: Web3Context, +) => { + const hasTransactionSigningOptions = + (!isNullish(transaction.chain) && !isNullish(transaction.hardfork)) || + !isNullish(transaction.common); + + let common; + if (!hasTransactionSigningOptions) { + // if defaultcommon is specified, use that. + if (web3Context.defaultCommon) { + common = { ...web3Context.defaultCommon }; + + if (isNullish(common.hardfork)) + common.hardfork = transaction.hardfork ?? web3Context.defaultHardfork; + if (isNullish(common.baseChain)) + common.baseChain = web3Context.defaultChain as ValidChains; + } else { + common = Common.custom( + { + name: 'custom-network', + chainId: toNumber(transaction.chainId) as number, + networkId: !isNullish(transaction.networkId) + ? (toNumber(transaction.networkId) as number) + : undefined, + defaultHardfork: transaction.hardfork ?? web3Context.defaultHardfork, + }, + { + baseChain: web3Context.defaultChain, + }, + ); + } + } else { + const name = + transaction?.common?.customChain?.name ?? transaction.chain ?? 'custom-network'; + const chainId = toNumber( + transaction?.common?.customChain?.chainId ?? transaction?.chainId, + ) as number; + const networkId = toNumber( + transaction?.common?.customChain?.networkId ?? transaction?.networkId, + ) as number; + const defaultHardfork = + transaction?.common?.hardfork ?? transaction?.hardfork ?? web3Context.defaultHardfork; + const baseChain = + transaction.common?.baseChain ?? transaction.chain ?? web3Context.defaultChain; + + if (chainId && networkId && name) { + common = Common.custom( + { + name, + chainId, + networkId, + defaultHardfork, + }, + { + baseChain, + }, + ); + } + } + return { common } as TxOptions; +}; + +export const prepareTransactionForSigning = async ( + transaction: Transaction, + web3Context: Web3Context, + privateKey?: HexString | Uint8Array, + fillGasPrice = false, + fillGasLimit = true, +) => { + const populatedTransaction = (await transactionBuilder({ + transaction, + web3Context, + privateKey, + fillGasPrice, + fillGasLimit, + })) as unknown as PopulatedUnsignedTransaction; + const formattedTransaction = formatTransaction( + populatedTransaction, + ETH_DATA_FORMAT, + ) as unknown as FormatType; + validateTransactionForSigning( + formattedTransaction as unknown as FormatType, + ); + + return TransactionFactory.fromTxData( + getEthereumjsTxDataFromTransaction(formattedTransaction), + getEthereumjsTransactionOptions(formattedTransaction, web3Context), + ); +}; diff --git a/packages/web3-eth/src/utils/reject_if_block_timeout.ts b/packages/web3-eth/src/utils/reject_if_block_timeout.ts new file mode 100644 index 00000000000..2019ce3380d --- /dev/null +++ b/packages/web3-eth/src/utils/reject_if_block_timeout.ts @@ -0,0 +1,177 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { EthExecutionAPI, Bytes, Web3BaseProvider, BlockHeaderOutput } from 'web3-types'; +import { Web3Context } from 'web3-core'; +import { rejectIfConditionAtInterval } from 'web3-utils'; + +import { TransactionBlockTimeoutError } from 'web3-errors'; +import { NUMBER_DATA_FORMAT } from '../constants.js'; +// eslint-disable-next-line import/no-cycle +import { getBlockNumber } from '../rpc_method_wrappers.js'; +import { NewHeadsSubscription } from '../web3_subscriptions.js'; + +export interface ResourceCleaner { + clean: () => void; +} + +function resolveByPolling( + web3Context: Web3Context, + starterBlockNumber: number, + transactionHash?: Bytes, +): [Promise, ResourceCleaner] { + const pollingInterval = web3Context.transactionPollingInterval; + const [intervalId, promiseToError] = + rejectIfConditionAtInterval(async () => { + let lastBlockNumber; + try { + lastBlockNumber = await getBlockNumber(web3Context, NUMBER_DATA_FORMAT); + } catch (error) { + console.warn('An error happen while trying to get the block number', error); + return undefined; + } + const numberOfBlocks = lastBlockNumber - starterBlockNumber; + if (numberOfBlocks >= web3Context.transactionBlockTimeout) { + return new TransactionBlockTimeoutError({ + starterBlockNumber, + numberOfBlocks, + transactionHash, + }); + } + return undefined; + }, pollingInterval); + + const clean = () => { + clearInterval(intervalId); + }; + + return [promiseToError, { clean }]; +} + +async function resolveBySubscription( + web3Context: Web3Context, + starterBlockNumber: number, + transactionHash?: Bytes, +): Promise<[Promise, ResourceCleaner]> { + // The following variable will stay true except if the data arrived, + // or if watching started after an error had occurred. + let needToWatchLater = true; + + let subscription: NewHeadsSubscription; + let resourceCleaner: ResourceCleaner; + // internal helper function + function revertToPolling( + reject: (value: Error | PromiseLike) => void, + previousError?: Error, + ) { + if (previousError) { + console.warn('error happened at subscription. So revert to polling...', previousError); + } + resourceCleaner.clean(); + + needToWatchLater = false; + const [promiseToError, newResourceCleaner] = resolveByPolling( + web3Context, + starterBlockNumber, + transactionHash, + ); + resourceCleaner.clean = newResourceCleaner.clean; + promiseToError.catch(error => reject(error as Error)); + } + try { + subscription = (await web3Context.subscriptionManager?.subscribe( + 'newHeads', + )) as unknown as NewHeadsSubscription; + resourceCleaner = { + clean: () => { + // Remove the subscription, if it was not removed somewhere + // else by calling, for example, subscriptionManager.clear() + if (subscription.id) { + web3Context.subscriptionManager + ?.removeSubscription(subscription) + .then(() => { + // Subscription ended successfully + }) + .catch(() => { + // An error happened while ending subscription. But no need to take any action. + }); + } + }, + }; + } catch (error) { + return resolveByPolling(web3Context, starterBlockNumber, transactionHash); + } + const promiseToError: Promise = new Promise((_, reject) => { + try { + subscription.on('data', (lastBlockHeader: BlockHeaderOutput) => { + needToWatchLater = false; + if (!lastBlockHeader?.number) { + return; + } + const numberOfBlocks = Number( + BigInt(lastBlockHeader.number) - BigInt(starterBlockNumber), + ); + + if (numberOfBlocks >= web3Context.transactionBlockTimeout) { + // Transaction Block Timeout is known to be reached by subscribing to new heads + reject( + new TransactionBlockTimeoutError({ + starterBlockNumber, + numberOfBlocks, + transactionHash, + }), + ); + } + }); + subscription.on('error', error => { + revertToPolling(reject, error); + }); + } catch (error) { + revertToPolling(reject, error as Error); + } + + // Fallback to polling if tx receipt didn't arrived in "blockHeaderTimeout" [10 seconds] + setTimeout(() => { + if (needToWatchLater) { + revertToPolling(reject); + } + }, web3Context.blockHeaderTimeout * 1000); + }); + + return [promiseToError, resourceCleaner]; +} + +/* TODO: After merge, there will be constant block mining time (exactly 12 second each block, except slot missed that currently happens in <1% of slots. ) so we can optimize following function +for POS NWs, we can skip checking getBlockNumber(); after interval and calculate only based on time that certain num of blocked are mined after that for internal double check, can do one getBlockNumber() call and timeout. +*/ +export async function rejectIfBlockTimeout( + web3Context: Web3Context, + transactionHash?: Bytes, +): Promise<[Promise, ResourceCleaner]> { + const { provider } = web3Context.requestManager; + let callingRes: [Promise, ResourceCleaner]; + const starterBlockNumber = await getBlockNumber(web3Context, NUMBER_DATA_FORMAT); + // TODO: once https://github.com/web3/web3.js/issues/5521 is implemented, remove checking for `enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout` + if ( + (provider as Web3BaseProvider).supportsSubscriptions?.() && + web3Context.enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout + ) { + callingRes = await resolveBySubscription(web3Context, starterBlockNumber, transactionHash); + } else { + callingRes = resolveByPolling(web3Context, starterBlockNumber, transactionHash); + } + return callingRes; +} diff --git a/packages/web3-eth/src/utils/send_tx_helper.ts b/packages/web3-eth/src/utils/send_tx_helper.ts new file mode 100644 index 00000000000..2e3385d5d1c --- /dev/null +++ b/packages/web3-eth/src/utils/send_tx_helper.ts @@ -0,0 +1,301 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + ETH_DATA_FORMAT, + FormatType, + DataFormat, + EthExecutionAPI, + TransactionWithSenderAPI, + Web3BaseWalletAccount, + HexString, + TransactionReceipt, + Transaction, + TransactionCall, + TransactionWithFromLocalWalletIndex, + TransactionWithToLocalWalletIndex, + TransactionWithFromAndToLocalWalletIndex, + LogsInput, + TransactionHash, + ContractAbiWithSignature, +} from 'web3-types'; +import { Web3Context, Web3EventEmitter, Web3PromiEvent } from 'web3-core'; +import { isNullish } from 'web3-validator'; +import { + ContractExecutionError, + InvalidResponseError, + TransactionPollingTimeoutError, + TransactionRevertedWithoutReasonError, + TransactionRevertInstructionError, + TransactionRevertWithCustomError, +} from 'web3-errors'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { + SendSignedTransactionEvents, + SendTransactionEvents, + SendTransactionOptions, +} from '../types.js'; +// eslint-disable-next-line import/no-cycle +import { getTransactionGasPricing } from './get_transaction_gas_pricing.js'; +// eslint-disable-next-line import/no-cycle +import { trySendTransaction } from './try_send_transaction.js'; +// eslint-disable-next-line import/no-cycle +import { watchTransactionForConfirmations } from './watch_transaction_for_confirmations.js'; +import { ALL_EVENTS_ABI } from '../constants.js'; +// eslint-disable-next-line import/no-cycle +import { getTransactionError } from './get_transaction_error.js'; +// eslint-disable-next-line import/no-cycle +import { getRevertReason } from './get_revert_reason.js'; +import { decodeEventABI } from './decoding.js'; + +export class SendTxHelper< + ReturnFormat extends DataFormat, + ResolveType = FormatType, + TxType = + | Transaction + | TransactionWithFromLocalWalletIndex + | TransactionWithToLocalWalletIndex + | TransactionWithFromAndToLocalWalletIndex, +> { + private readonly web3Context: Web3Context; + private readonly promiEvent: Web3PromiEvent< + ResolveType, + SendSignedTransactionEvents | SendTransactionEvents + >; + private readonly options: SendTransactionOptions = { + checkRevertBeforeSending: true, + }; + private readonly returnFormat: ReturnFormat; + public constructor({ + options, + web3Context, + promiEvent, + returnFormat, + }: { + web3Context: Web3Context; + options: SendTransactionOptions; + promiEvent: Web3PromiEvent< + ResolveType, + SendSignedTransactionEvents | SendTransactionEvents + >; + returnFormat: ReturnFormat; + }) { + this.options = options; + this.web3Context = web3Context; + this.promiEvent = promiEvent; + this.returnFormat = returnFormat; + } + + public getReceiptWithEvents(data: TransactionReceipt): ResolveType { + const result = { ...(data ?? {}) }; + if (this.options?.contractAbi && result.logs && result.logs.length > 0) { + result.events = {}; + for (const log of result.logs) { + const event = decodeEventABI( + ALL_EVENTS_ABI, + log as LogsInput, + this.options?.contractAbi as ContractAbiWithSignature, + this.returnFormat, + ); + if (event.event) { + result.events[event.event] = event; + } + } + } + + return result as unknown as ResolveType; + } + + public async checkRevertBeforeSending(tx: TransactionCall) { + if (this.options.checkRevertBeforeSending !== false) { + const reason = await getRevertReason(this.web3Context, tx, this.options.contractAbi); + if (reason !== undefined) { + throw await getTransactionError( + this.web3Context, + tx, + undefined, + undefined, + this.options.contractAbi, + reason, + ); + } + } + } + + public emitSending(tx: TxType | HexString) { + if (this.promiEvent.listenerCount('sending') > 0) { + this.promiEvent.emit('sending', tx); + } + } + + public async populateGasPrice({ + transactionFormatted, + transaction, + }: { + transactionFormatted: TxType; + transaction: TxType; + }): Promise { + let result = transactionFormatted; + if ( + !this.options?.ignoreGasPricing && + isNullish((transactionFormatted as Transaction).gasPrice) && + (isNullish((transaction as Transaction).maxPriorityFeePerGas) || + isNullish((transaction as Transaction).maxFeePerGas)) + ) { + result = { + ...transactionFormatted, + // @TODO gasPrice, maxPriorityFeePerGas, maxFeePerGas + // should not be included if undefined, but currently are + ...(await getTransactionGasPricing( + transactionFormatted, + this.web3Context, + ETH_DATA_FORMAT, + )), + }; + } + + return result; + } + + public async signAndSend({ + wallet, + tx, + }: { + wallet: Web3BaseWalletAccount | undefined; + tx: TxType; + }) { + if (wallet) { + const signedTransaction = await wallet.signTransaction(tx); + + return trySendTransaction( + this.web3Context, + async (): Promise => + ethRpcMethods.sendRawTransaction( + this.web3Context.requestManager, + signedTransaction.rawTransaction, + ), + signedTransaction.transactionHash, + ); + } + return trySendTransaction( + this.web3Context, + async (): Promise => + ethRpcMethods.sendTransaction( + this.web3Context.requestManager, + tx as Partial, + ), + ); + } + + public emitSent(tx: TxType | HexString) { + if (this.promiEvent.listenerCount('sent') > 0) { + this.promiEvent.emit('sent', tx); + } + } + public emitTransactionHash(hash: string & Uint8Array) { + if (this.promiEvent.listenerCount('transactionHash') > 0) { + this.promiEvent.emit('transactionHash', hash); + } + } + + public emitReceipt(receipt: ResolveType) { + if (this.promiEvent.listenerCount('receipt') > 0) { + ( + this.promiEvent as Web3EventEmitter< + SendTransactionEvents | SendSignedTransactionEvents + > + ).emit( + 'receipt', + // @ts-expect-error unknown type fix + receipt, + ); + } + } + + public async handleError({ error, tx }: { error: unknown; tx: TransactionCall }) { + let _error = error; + + if (_error instanceof ContractExecutionError && this.web3Context.handleRevert) { + _error = await getTransactionError( + this.web3Context, + tx, + undefined, + undefined, + this.options?.contractAbi, + ); + } + + if ( + (_error instanceof InvalidResponseError || + _error instanceof ContractExecutionError || + _error instanceof TransactionRevertWithCustomError || + _error instanceof TransactionRevertedWithoutReasonError || + _error instanceof TransactionRevertInstructionError || + _error instanceof TransactionPollingTimeoutError) && + this.promiEvent.listenerCount('error') > 0 + ) { + this.promiEvent.emit('error', _error); + } + + return _error; + } + + public emitConfirmation({ + receipt, + transactionHash, + }: { + receipt: ResolveType; + transactionHash: TransactionHash; + }) { + if (this.promiEvent.listenerCount('confirmation') > 0) { + watchTransactionForConfirmations< + ReturnFormat, + SendSignedTransactionEvents | SendTransactionEvents, + ResolveType + >( + this.web3Context, + this.promiEvent, + receipt as unknown as TransactionReceipt, + transactionHash, + this.returnFormat, + ); + } + } + + public async handleResolve({ receipt, tx }: { receipt: ResolveType; tx: TransactionCall }) { + if (this.options?.transactionResolver) { + return this.options?.transactionResolver(receipt as unknown as TransactionReceipt); + } + if ((receipt as unknown as TransactionReceipt).status === BigInt(0)) { + const error = await getTransactionError( + this.web3Context, + tx, + // @ts-expect-error unknown type fix + receipt, + undefined, + this.options?.contractAbi, + ); + if (this.promiEvent.listenerCount('error') > 0) { + this.promiEvent.emit('error', error); + } + + throw error; + } else { + return receipt; + } + } +} diff --git a/packages/web3-eth/src/utils/transaction_builder.ts b/packages/web3-eth/src/utils/transaction_builder.ts new file mode 100644 index 00000000000..13edd253330 --- /dev/null +++ b/packages/web3-eth/src/utils/transaction_builder.ts @@ -0,0 +1,265 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + EthExecutionAPI, + Address, + HexString, + ValidChains, + Hardfork, + Transaction, + TransactionWithFromLocalWalletIndex, + TransactionWithToLocalWalletIndex, + TransactionWithFromAndToLocalWalletIndex, + Common, + Web3NetAPI, + Numbers, + DataFormat, + DEFAULT_RETURN_FORMAT, + FormatType, + ETH_DATA_FORMAT, +} from 'web3-types'; +import { Web3Context } from 'web3-core'; +import { privateKeyToAddress } from 'web3-eth-accounts'; +import { getId } from 'web3-net'; +import { isNullish, isNumber, isHexStrict, isAddress } from 'web3-validator'; +import { + InvalidTransactionWithSender, + InvalidTransactionWithReceiver, + LocalWalletNotAvailableError, + TransactionDataAndInputError, + UnableToPopulateNonceError, +} from 'web3-errors'; +import { bytesToHex, format } from 'web3-utils'; +import { NUMBER_DATA_FORMAT } from '../constants.js'; +// eslint-disable-next-line import/no-cycle +import { getChainId, getTransactionCount, estimateGas } from '../rpc_method_wrappers.js'; +import { detectTransactionType } from './detect_transaction_type.js'; +import { transactionSchema } from '../schemas.js'; +import { InternalTransaction } from '../types.js'; +// eslint-disable-next-line import/no-cycle +import { getTransactionGasPricing } from './get_transaction_gas_pricing.js'; + +export const getTransactionFromOrToAttr = ( + attr: 'from' | 'to', + web3Context: Web3Context, + transaction?: + | Transaction + | TransactionWithFromLocalWalletIndex + | TransactionWithToLocalWalletIndex + | TransactionWithFromAndToLocalWalletIndex, + privateKey?: HexString | Uint8Array, +): Address | undefined => { + if (transaction !== undefined && attr in transaction && transaction[attr] !== undefined) { + if (typeof transaction[attr] === 'string' && isAddress(transaction[attr] as string)) { + return transaction[attr] as Address; + } + if (!isHexStrict(transaction[attr] as string) && isNumber(transaction[attr] as Numbers)) { + if (web3Context.wallet) { + const account = web3Context.wallet.get( + format({ format: 'uint' }, transaction[attr] as Numbers, NUMBER_DATA_FORMAT), + ); + + if (!isNullish(account)) { + return account.address; + } + + throw new LocalWalletNotAvailableError(); + } + throw new LocalWalletNotAvailableError(); + } else { + throw attr === 'from' + ? new InvalidTransactionWithSender(transaction.from) + : // eslint-disable-next-line @typescript-eslint/no-unsafe-call + new InvalidTransactionWithReceiver(transaction.to); + } + } + if (attr === 'from') { + if (!isNullish(privateKey)) return privateKeyToAddress(privateKey); + if (!isNullish(web3Context.defaultAccount)) return web3Context.defaultAccount; + } + + return undefined; +}; + +export const getTransactionNonce = async ( + web3Context: Web3Context, + address?: Address, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, +) => { + if (isNullish(address)) { + // TODO if (web3.eth.accounts.wallet) use address from local wallet + throw new UnableToPopulateNonceError(); + } + + return getTransactionCount(web3Context, address, web3Context.defaultBlock, returnFormat); +}; + +export const getTransactionType = ( + transaction: FormatType, + web3Context: Web3Context, +) => { + const inferredType = detectTransactionType(transaction, web3Context); + if (!isNullish(inferredType)) return inferredType; + if (!isNullish(web3Context.defaultTransactionType)) + return format({ format: 'uint' }, web3Context.defaultTransactionType, ETH_DATA_FORMAT); + + return undefined; +}; + +// Keep in mind that the order the properties of populateTransaction get populated matters +// as some of the properties are dependent on others +export async function defaultTransactionBuilder(options: { + transaction: Transaction; + web3Context: Web3Context; + privateKey?: HexString | Uint8Array; + fillGasPrice?: boolean; + fillGasLimit?: boolean; +}): Promise { + let populatedTransaction = format( + transactionSchema, + options.transaction, + DEFAULT_RETURN_FORMAT, + ) as InternalTransaction; + + if (isNullish(populatedTransaction.from)) { + populatedTransaction.from = getTransactionFromOrToAttr( + 'from', + options.web3Context, + undefined, + options.privateKey, + ); + } + + // TODO: Debug why need to typecase getTransactionNonce + if (isNullish(populatedTransaction.nonce)) { + populatedTransaction.nonce = await getTransactionNonce( + options.web3Context, + populatedTransaction.from, + ETH_DATA_FORMAT, + ); + } + + if (isNullish(populatedTransaction.value)) { + populatedTransaction.value = '0x0'; + } + + if (!isNullish(populatedTransaction.data)) { + if ( + !isNullish(populatedTransaction.input) && + populatedTransaction.data !== populatedTransaction.input + ) + throw new TransactionDataAndInputError({ + data: bytesToHex(populatedTransaction.data), + input: bytesToHex(populatedTransaction.input), + }); + + if (!populatedTransaction.data.startsWith('0x')) + populatedTransaction.data = `0x${populatedTransaction.data}`; + } else if (!isNullish(populatedTransaction.input)) { + if (!populatedTransaction.input.startsWith('0x')) + populatedTransaction.input = `0x${populatedTransaction.input}`; + } else { + populatedTransaction.input = '0x'; + } + + if (isNullish(populatedTransaction.common)) { + if (options.web3Context.defaultCommon) { + const common = options.web3Context.defaultCommon as unknown as Common; + const chainId = common.customChain.chainId as string; + const networkId = common.customChain.networkId as string; + const name = common.customChain.name as string; + populatedTransaction.common = { + ...common, + customChain: { chainId, networkId, name }, + }; + } + + if (isNullish(populatedTransaction.chain)) { + populatedTransaction.chain = options.web3Context.defaultChain as ValidChains; + } + if (isNullish(populatedTransaction.hardfork)) { + populatedTransaction.hardfork = options.web3Context.defaultHardfork as Hardfork; + } + } + + if ( + isNullish(populatedTransaction.chainId) && + isNullish(populatedTransaction.common?.customChain.chainId) + ) { + populatedTransaction.chainId = await getChainId(options.web3Context, ETH_DATA_FORMAT); + } + + if (isNullish(populatedTransaction.networkId)) { + populatedTransaction.networkId = + (options.web3Context.defaultNetworkId as string) ?? + (await getId(options.web3Context, ETH_DATA_FORMAT)); + } + + if (isNullish(populatedTransaction.gasLimit) && !isNullish(populatedTransaction.gas)) { + populatedTransaction.gasLimit = populatedTransaction.gas; + } + + populatedTransaction.type = getTransactionType(populatedTransaction, options.web3Context); + if ( + isNullish(populatedTransaction.accessList) && + (populatedTransaction.type === '0x1' || populatedTransaction.type === '0x2') + ) { + populatedTransaction.accessList = []; + } + if (options.fillGasPrice) + populatedTransaction = { + ...populatedTransaction, + ...(await getTransactionGasPricing( + populatedTransaction, + options.web3Context, + ETH_DATA_FORMAT, + )), + }; + if ( + isNullish(populatedTransaction.gas) && + isNullish(populatedTransaction.gasLimit) && + options.fillGasLimit + ) { + const fillGasLimit = await estimateGas( + options.web3Context, + populatedTransaction, + 'latest', + ETH_DATA_FORMAT, + ); + populatedTransaction = { + ...populatedTransaction, + gas: format({ format: 'uint' }, fillGasLimit as Numbers, ETH_DATA_FORMAT), + }; + } + return populatedTransaction as ReturnType; +} + +export const transactionBuilder = async ( + options: { + transaction: Transaction; + web3Context: Web3Context; + privateKey?: HexString | Uint8Array; + fillGasPrice?: boolean; + fillGasLimit?: boolean; + }, + // eslint-disable-next-line @typescript-eslint/require-await +) => + (options.web3Context.transactionBuilder ?? defaultTransactionBuilder)({ + ...options, + transaction: options.transaction, + }) as unknown as ReturnType; diff --git a/packages/web3-eth/src/utils/try_send_transaction.ts b/packages/web3-eth/src/utils/try_send_transaction.ts new file mode 100644 index 00000000000..b3a677c6270 --- /dev/null +++ b/packages/web3-eth/src/utils/try_send_transaction.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { EthExecutionAPI, Bytes } from 'web3-types'; +import { AsyncFunction, rejectIfTimeout } from 'web3-utils'; +import { TransactionSendTimeoutError } from 'web3-errors'; + +// eslint-disable-next-line import/no-cycle +import { rejectIfBlockTimeout } from './reject_if_block_timeout.js'; + +/** + * An internal function to send a transaction or throws if sending did not finish during the timeout during the blocks-timeout. + * @param web3Context - the context to read the configurations from + * @param sendTransactionFunc - the function that will send the transaction (could be sendTransaction or sendRawTransaction) + * @param transactionHash - to be used inside the exception message if there will be any exceptions. + * @returns the Promise returned by the `sendTransactionFunc`. + */ +export async function trySendTransaction( + web3Context: Web3Context, + sendTransactionFunc: AsyncFunction, + transactionHash?: Bytes, +): Promise { + const [timeoutId, rejectOnTimeout] = rejectIfTimeout( + web3Context.transactionSendTimeout, + new TransactionSendTimeoutError({ + numberOfSeconds: web3Context.transactionSendTimeout / 1000, + transactionHash, + }), + ); + + const [rejectOnBlockTimeout, blockTimeoutResourceCleaner] = await rejectIfBlockTimeout( + web3Context, + transactionHash, + ); + + try { + // If an error happened here, do not catch it, just clear the resources before raising it to the caller function. + return await Promise.race([ + sendTransactionFunc(), // this is the function that will send the transaction + rejectOnTimeout, // this will throw an error on Transaction Send Timeout + rejectOnBlockTimeout, // this will throw an error on Transaction Block Timeout + ]); + } finally { + clearTimeout(timeoutId); + blockTimeoutResourceCleaner.clean(); + } +} diff --git a/packages/web3-eth/src/utils/wait_for_transaction_receipt.ts b/packages/web3-eth/src/utils/wait_for_transaction_receipt.ts new file mode 100644 index 00000000000..d335683391e --- /dev/null +++ b/packages/web3-eth/src/utils/wait_for_transaction_receipt.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context } from 'web3-core'; +import { TransactionPollingTimeoutError } from 'web3-errors'; +import { EthExecutionAPI, Bytes, TransactionReceipt, DataFormat } from 'web3-types'; + +// eslint-disable-next-line import/no-cycle +import { pollTillDefinedAndReturnIntervalId, rejectIfTimeout } from 'web3-utils'; +// eslint-disable-next-line import/no-cycle +import { rejectIfBlockTimeout } from './reject_if_block_timeout.js'; +// eslint-disable-next-line import/no-cycle +import { getTransactionReceipt } from '../rpc_method_wrappers.js'; + +export async function waitForTransactionReceipt( + web3Context: Web3Context, + transactionHash: Bytes, + returnFormat: ReturnFormat, +): Promise { + + const pollingInterval = + web3Context.transactionReceiptPollingInterval ?? web3Context.transactionPollingInterval; + + const [awaitableTransactionReceipt, IntervalId] = pollTillDefinedAndReturnIntervalId(async () => { + try { + return getTransactionReceipt(web3Context, transactionHash, returnFormat); + } catch (error) { + console.warn('An error happen while trying to get the transaction receipt', error); + return undefined; + } + }, pollingInterval); + + const [timeoutId, rejectOnTimeout] = rejectIfTimeout( + web3Context.transactionPollingTimeout, + new TransactionPollingTimeoutError({ + numberOfSeconds: web3Context.transactionPollingTimeout / 1000, + transactionHash, + }), + ); + + const [rejectOnBlockTimeout, blockTimeoutResourceCleaner] = await rejectIfBlockTimeout( + web3Context, + transactionHash, + ); + + try { + // If an error happened here, do not catch it, just clear the resources before raising it to the caller function. + return await Promise.race([ + awaitableTransactionReceipt, + rejectOnTimeout, // this will throw an error on Transaction Polling Timeout + rejectOnBlockTimeout, // this will throw an error on Transaction Block Timeout + ]); + } finally { + if(timeoutId) + clearTimeout(timeoutId); + if(IntervalId) + clearInterval(IntervalId); + blockTimeoutResourceCleaner.clean(); + } +} diff --git a/packages/web3-eth/src/utils/watch_transaction_by_polling.ts b/packages/web3-eth/src/utils/watch_transaction_by_polling.ts new file mode 100644 index 00000000000..6be3c572742 --- /dev/null +++ b/packages/web3-eth/src/utils/watch_transaction_by_polling.ts @@ -0,0 +1,80 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, EthExecutionAPI, TransactionReceipt } from 'web3-types'; +import { Web3Context, Web3PromiEvent } from 'web3-core'; +import { format, numberToHex } from 'web3-utils'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { DataFormat } from 'web3-types'; +import { SendSignedTransactionEvents, SendTransactionEvents } from '../types.js'; +import { transactionReceiptSchema } from '../schemas.js'; + +export type Web3PromiEventEventTypeBase = + | SendTransactionEvents + | SendSignedTransactionEvents; + +export type WaitProps = { + web3Context: Web3Context; + transactionReceipt: TransactionReceipt; + transactionPromiEvent: Web3PromiEvent>; + returnFormat: ReturnFormat; +}; + +/** + * This function watches a Transaction by subscribing to new heads. + * It is used by `watchTransactionForConfirmations`, in case the provider does not support subscription. + * And it is also used by `watchTransactionBySubscription`, as a fallback, if the subscription failed for any reason. + */ +export const watchTransactionByPolling = < + ReturnFormat extends DataFormat, + ResolveType = TransactionReceipt, +>({ + web3Context, + transactionReceipt, + transactionPromiEvent, + returnFormat, +}: WaitProps) => { + // Having a transactionReceipt means that the transaction has already been included + // in at least one block, so we start with 1 + let confirmations = 1; + const intervalId = setInterval(() => { + (async () => { + if (confirmations >= web3Context.transactionConfirmationBlocks) + clearInterval(intervalId); + + const nextBlock = await ethRpcMethods.getBlockByNumber( + web3Context.requestManager, + numberToHex(BigInt(transactionReceipt.blockNumber) + BigInt(confirmations)), + false, + ); + + if (nextBlock?.hash) { + confirmations += 1; + + transactionPromiEvent.emit('confirmation', { + confirmations: format({ format: 'uint' }, confirmations, returnFormat), + receipt: format(transactionReceiptSchema, transactionReceipt, returnFormat), + latestBlockHash: format( + { format: 'bytes32' }, + nextBlock.hash as Bytes, + returnFormat, + ), + }); + } + })() as unknown; + }, web3Context.transactionReceiptPollingInterval ?? web3Context.transactionPollingInterval); +}; diff --git a/packages/web3-eth/src/utils/watch_transaction_by_subscription.ts b/packages/web3-eth/src/utils/watch_transaction_by_subscription.ts new file mode 100644 index 00000000000..d68c39da95d --- /dev/null +++ b/packages/web3-eth/src/utils/watch_transaction_by_subscription.ts @@ -0,0 +1,114 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, Numbers, BlockHeaderOutput, TransactionReceipt } from 'web3-types'; +import { format } from 'web3-utils'; + +import { DataFormat } from 'web3-types'; +import { NewHeadsSubscription } from '../web3_subscriptions.js'; +import { transactionReceiptSchema } from '../schemas.js'; +import { WaitProps, watchTransactionByPolling } from './watch_transaction_by_polling.js'; + +/** + * This function watches a Transaction by subscribing to new heads. + * It is used by `watchTransactionForConfirmations`, in case the provider supports subscription. + */ +export const watchTransactionBySubscription = < + ReturnFormat extends DataFormat, + ResolveType = TransactionReceipt, +>({ + web3Context, + transactionReceipt, + transactionPromiEvent, + returnFormat, +}: WaitProps) => { + // The following variable will stay true except if the data arrived, + // or if watching started after an error had occurred. + let needToWatchLater = true; + let lastCaughtBlockHash: string; + setImmediate(() => { + web3Context.subscriptionManager + ?.subscribe('newHeads') + .then((subscription: NewHeadsSubscription) => { + subscription.on('data', async (newBlockHeader: BlockHeaderOutput) => { + needToWatchLater = false; + if ( + !newBlockHeader?.number || + // For some cases, the on-data event is fired couple times for the same block! + // This needs investigation but seems to be because of multiple `subscription.on('data'...)` even this should not cause that. + lastCaughtBlockHash === newBlockHeader?.parentHash + ) { + return; + } + lastCaughtBlockHash = newBlockHeader?.parentHash as string; + + const confirmations = + BigInt(newBlockHeader.number) - + BigInt(transactionReceipt.blockNumber) + + BigInt(1); + + transactionPromiEvent.emit('confirmation', { + confirmations: format( + { format: 'uint' }, + confirmations as Numbers, + returnFormat, + ), + receipt: format(transactionReceiptSchema, transactionReceipt, returnFormat), + latestBlockHash: format( + { format: 'bytes32' }, + newBlockHeader.parentHash as Bytes, + returnFormat, + ), + }); + if (confirmations >= web3Context.transactionConfirmationBlocks) { + await web3Context.subscriptionManager?.removeSubscription(subscription); + } + }); + subscription.on('error', async () => { + await web3Context.subscriptionManager?.removeSubscription(subscription); + + needToWatchLater = false; + watchTransactionByPolling({ + web3Context, + transactionReceipt, + transactionPromiEvent, + returnFormat, + }); + }); + }) + .catch(() => { + needToWatchLater = false; + watchTransactionByPolling({ + web3Context, + transactionReceipt, + transactionPromiEvent, + returnFormat, + }); + }); + }); + + // Fallback to polling if tx receipt didn't arrived in "blockHeaderTimeout" [10 seconds] + setTimeout(() => { + if (needToWatchLater) { + watchTransactionByPolling({ + web3Context, + transactionReceipt, + transactionPromiEvent, + returnFormat, + }); + } + }, web3Context.blockHeaderTimeout * 1000); +}; diff --git a/packages/web3-eth/src/utils/watch_transaction_for_confirmations.ts b/packages/web3-eth/src/utils/watch_transaction_for_confirmations.ts new file mode 100644 index 00000000000..60489d59c50 --- /dev/null +++ b/packages/web3-eth/src/utils/watch_transaction_for_confirmations.ts @@ -0,0 +1,79 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, EthExecutionAPI, Web3BaseProvider, TransactionReceipt } from 'web3-types'; +import { Web3Context, Web3PromiEvent } from 'web3-core'; +import { format } from 'web3-utils'; +import { isNullish } from 'web3-validator'; + +import { + TransactionMissingReceiptOrBlockHashError, + TransactionReceiptMissingBlockNumberError, +} from 'web3-errors'; +import { DataFormat } from 'web3-types'; +import { transactionReceiptSchema } from '../schemas.js'; +import { + watchTransactionByPolling, + Web3PromiEventEventTypeBase, +} from './watch_transaction_by_polling.js'; +import { watchTransactionBySubscription } from './watch_transaction_by_subscription.js'; + +export function watchTransactionForConfirmations< + ReturnFormat extends DataFormat, + Web3PromiEventEventType extends Web3PromiEventEventTypeBase, + ResolveType = TransactionReceipt, +>( + web3Context: Web3Context, + transactionPromiEvent: Web3PromiEvent, + transactionReceipt: TransactionReceipt, + transactionHash: Bytes, + returnFormat: ReturnFormat, +) { + if (isNullish(transactionReceipt) || isNullish(transactionReceipt.blockHash)) + throw new TransactionMissingReceiptOrBlockHashError({ + receipt: transactionReceipt, + blockHash: format({ format: 'bytes32' }, transactionReceipt?.blockHash, returnFormat), + transactionHash: format({ format: 'bytes32' }, transactionHash, returnFormat), + }); + + if (!transactionReceipt.blockNumber) + throw new TransactionReceiptMissingBlockNumberError({ receipt: transactionReceipt }); + + // As we have the receipt, it's the first confirmation that tx is accepted. + transactionPromiEvent.emit('confirmation', { + confirmations: format({ format: 'uint' }, 1, returnFormat), + receipt: format(transactionReceiptSchema, transactionReceipt, returnFormat), + latestBlockHash: format({ format: 'bytes32' }, transactionReceipt.blockHash, returnFormat), + }); + + // so a subscription for newBlockHeaders can be made instead of polling + const provider: Web3BaseProvider = web3Context.requestManager.provider as Web3BaseProvider; + if (provider && 'supportsSubscriptions' in provider && provider.supportsSubscriptions()) { + watchTransactionBySubscription({ + web3Context, + transactionReceipt, + transactionPromiEvent, + returnFormat, + }); + } else { + watchTransactionByPolling({ + web3Context, + transactionReceipt, + transactionPromiEvent, + returnFormat, + }); + } +} diff --git a/packages/web3-eth/src/validation.ts b/packages/web3-eth/src/validation.ts new file mode 100644 index 00000000000..a818cc66c10 --- /dev/null +++ b/packages/web3-eth/src/validation.ts @@ -0,0 +1,312 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + AccessList, + AccessListEntry, + BaseTransactionAPI, + Transaction1559UnsignedAPI, + Transaction2930UnsignedAPI, + TransactionCall, + TransactionLegacyUnsignedAPI, + Transaction, + TransactionWithSenderAPI, + ETH_DATA_FORMAT, +} from 'web3-types'; +import { isAddress, isHexStrict, isHexString32Bytes, isNullish, isUInt } from 'web3-validator'; +import { + ChainMismatchError, + HardforkMismatchError, + ChainIdMismatchError, + CommonOrChainAndHardforkError, + Eip1559GasPriceError, + InvalidGasOrGasPrice, + InvalidMaxPriorityFeePerGasOrMaxFeePerGas, + InvalidNonceOrChainIdError, + InvalidTransactionCall, + InvalidTransactionObjectError, + InvalidTransactionWithSender, + MissingChainOrHardforkError, + MissingCustomChainError, + MissingCustomChainIdError, + MissingGasError, + TransactionGasMismatchError, + UnsupportedFeeMarketError, +} from 'web3-errors'; +import { formatTransaction } from './utils/format_transaction.js'; +import { InternalTransaction } from './types.js'; + +export function isBaseTransaction(value: BaseTransactionAPI): boolean { + if (!isNullish(value.to) && !isAddress(value.to)) return false; + if (!isHexStrict(value.type) && !isNullish(value.type) && value.type.length !== 2) return false; + if (!isHexStrict(value.nonce)) return false; + if (!isHexStrict(value.gas)) return false; + if (!isHexStrict(value.value)) return false; + if (!isHexStrict(value.input)) return false; + if (value.chainId && !isHexStrict(value.chainId)) return false; + + return true; +} + +export function isAccessListEntry(value: AccessListEntry): boolean { + if (!isNullish(value.address) && !isAddress(value.address)) return false; + if ( + !isNullish(value.storageKeys) && + !value.storageKeys.every(storageKey => isHexString32Bytes(storageKey)) + ) + return false; + + return true; +} + +export function isAccessList(value: AccessList): boolean { + if ( + !Array.isArray(value) || + !value.every(accessListEntry => isAccessListEntry(accessListEntry)) + ) + return false; + + return true; +} + +export function isTransaction1559Unsigned(value: Transaction1559UnsignedAPI): boolean { + if (!isBaseTransaction(value)) return false; + if (!isHexStrict(value.maxFeePerGas)) return false; + if (!isHexStrict(value.maxPriorityFeePerGas)) return false; + if (!isAccessList(value.accessList)) return false; + + return true; +} + +export function isTransaction2930Unsigned(value: Transaction2930UnsignedAPI): boolean { + if (!isBaseTransaction(value)) return false; + if (!isHexStrict(value.gasPrice)) return false; + if (!isAccessList(value.accessList)) return false; + + return true; +} + +export function isTransactionLegacyUnsigned(value: TransactionLegacyUnsignedAPI): boolean { + if (!isBaseTransaction(value)) return false; + if (!isHexStrict(value.gasPrice)) return false; + + return true; +} + +export function isTransactionWithSender(value: TransactionWithSenderAPI): boolean { + if (!isAddress(value.from)) return false; + if (!isBaseTransaction(value)) return false; + if ( + !isTransaction1559Unsigned(value as Transaction1559UnsignedAPI) && + !isTransaction2930Unsigned(value as Transaction2930UnsignedAPI) && + !isTransactionLegacyUnsigned(value as TransactionLegacyUnsignedAPI) + ) + return false; + + return true; +} + +export function validateTransactionWithSender(value: TransactionWithSenderAPI) { + if (!isTransactionWithSender(value)) throw new InvalidTransactionWithSender(value); +} + +export function isTransactionCall(value: TransactionCall): boolean { + if (!isNullish(value.from) && !isAddress(value.from)) return false; + if (!isAddress(value.to)) return false; + if (!isNullish(value.gas) && !isHexStrict(value.gas)) return false; + if (!isNullish(value.gasPrice) && !isHexStrict(value.gasPrice)) return false; + if (!isNullish(value.value) && !isHexStrict(value.value)) return false; + if (!isNullish(value.data) && !isHexStrict(value.data)) return false; + if (!isNullish(value.input) && !isHexStrict(value.input)) return false; + if (!isNullish(value.type)) return false; + if (isTransaction1559Unsigned(value as Transaction1559UnsignedAPI)) return false; + if (isTransaction2930Unsigned(value as Transaction2930UnsignedAPI)) return false; + + return true; +} + +export function validateTransactionCall(value: TransactionCall) { + if (!isTransactionCall(value)) throw new InvalidTransactionCall(value); +} + +export const validateCustomChainInfo = (transaction: InternalTransaction) => { + if (!isNullish(transaction.common)) { + if (isNullish(transaction.common.customChain)) throw new MissingCustomChainError(); + if (isNullish(transaction.common.customChain.chainId)) + throw new MissingCustomChainIdError(); + if ( + !isNullish(transaction.chainId) && + transaction.chainId !== transaction.common.customChain.chainId + ) + throw new ChainIdMismatchError({ + txChainId: transaction.chainId, + customChainId: transaction.common.customChain.chainId, + }); + } +}; +export const validateChainInfo = (transaction: InternalTransaction) => { + if ( + !isNullish(transaction.common) && + !isNullish(transaction.chain) && + !isNullish(transaction.hardfork) + ) { + throw new CommonOrChainAndHardforkError(); + } + if ( + (!isNullish(transaction.chain) && isNullish(transaction.hardfork)) || + (!isNullish(transaction.hardfork) && isNullish(transaction.chain)) + ) + throw new MissingChainOrHardforkError({ + chain: transaction.chain, + hardfork: transaction.hardfork, + }); +}; +export const validateBaseChain = (transaction: InternalTransaction) => { + if (!isNullish(transaction.common)) + if (!isNullish(transaction.common.baseChain)) + if ( + !isNullish(transaction.chain) && + transaction.chain !== transaction.common.baseChain + ) { + throw new ChainMismatchError({ + txChain: transaction.chain, + baseChain: transaction.common.baseChain, + }); + } +}; +export const validateHardfork = (transaction: InternalTransaction) => { + if (!isNullish(transaction.common)) + if (!isNullish(transaction.common.hardfork)) + if ( + !isNullish(transaction.hardfork) && + transaction.hardfork !== transaction.common.hardfork + ) { + throw new HardforkMismatchError({ + txHardfork: transaction.hardfork, + commonHardfork: transaction.common.hardfork, + }); + } +}; + +export const validateLegacyGas = (transaction: InternalTransaction) => { + if ( + // This check is verifying gas and gasPrice aren't less than 0. + isNullish(transaction.gas) || + !isUInt(transaction.gas) || + isNullish(transaction.gasPrice) || + !isUInt(transaction.gasPrice) + ) + throw new InvalidGasOrGasPrice({ + gas: transaction.gas, + gasPrice: transaction.gasPrice, + }); + if (!isNullish(transaction.maxFeePerGas) || !isNullish(transaction.maxPriorityFeePerGas)) + throw new UnsupportedFeeMarketError({ + maxFeePerGas: transaction.maxFeePerGas, + maxPriorityFeePerGas: transaction.maxPriorityFeePerGas, + }); +}; + +export const validateFeeMarketGas = (transaction: InternalTransaction) => { + // These errors come from 1.x, so they must be checked before + // InvalidMaxPriorityFeePerGasOrMaxFeePerGas to throw the same error + // for the same code executing in 1.x + if (!isNullish(transaction.gasPrice) && transaction.type === '0x2') + throw new Eip1559GasPriceError(transaction.gasPrice); + if (transaction.type === '0x0' || transaction.type === '0x1') + throw new UnsupportedFeeMarketError({ + maxFeePerGas: transaction.maxFeePerGas, + maxPriorityFeePerGas: transaction.maxPriorityFeePerGas, + }); + + if ( + isNullish(transaction.maxFeePerGas) || + !isUInt(transaction.maxFeePerGas) || + isNullish(transaction.maxPriorityFeePerGas) || + !isUInt(transaction.maxPriorityFeePerGas) + ) + throw new InvalidMaxPriorityFeePerGasOrMaxFeePerGas({ + maxPriorityFeePerGas: transaction.maxPriorityFeePerGas, + maxFeePerGas: transaction.maxFeePerGas, + }); +}; + +/** + * This method checks if all required gas properties are present for either + * legacy gas (type 0x0 and 0x1) OR fee market transactions (0x2) + */ +export const validateGas = (transaction: InternalTransaction) => { + const gasPresent = !isNullish(transaction.gas) || !isNullish(transaction.gasLimit); + const legacyGasPresent = gasPresent && !isNullish(transaction.gasPrice); + const feeMarketGasPresent = + gasPresent && + !isNullish(transaction.maxPriorityFeePerGas) && + !isNullish(transaction.maxFeePerGas); + + if (!legacyGasPresent && !feeMarketGasPresent) + throw new MissingGasError({ + gas: transaction.gas, + gasPrice: transaction.gasPrice, + maxPriorityFeePerGas: transaction.maxPriorityFeePerGas, + maxFeePerGas: transaction.maxFeePerGas, + }); + + if (legacyGasPresent && feeMarketGasPresent) + throw new TransactionGasMismatchError({ + gas: transaction.gas, + gasPrice: transaction.gasPrice, + maxPriorityFeePerGas: transaction.maxPriorityFeePerGas, + maxFeePerGas: transaction.maxFeePerGas, + }); + + (legacyGasPresent ? validateLegacyGas : validateFeeMarketGas)(transaction); + (!isNullish(transaction.type) && transaction.type > '0x1' + ? validateFeeMarketGas + : validateLegacyGas)(transaction); +}; + +export const validateTransactionForSigning = ( + transaction: InternalTransaction, + overrideMethod?: (transaction: InternalTransaction) => void, +) => { + if (!isNullish(overrideMethod)) { + overrideMethod(transaction); + return; + } + + if (typeof transaction !== 'object' || isNullish(transaction)) + throw new InvalidTransactionObjectError(transaction); + + validateCustomChainInfo(transaction); + validateChainInfo(transaction); + validateBaseChain(transaction); + validateHardfork(transaction); + + const formattedTransaction = formatTransaction(transaction as Transaction, ETH_DATA_FORMAT); + validateGas(formattedTransaction); + + if ( + isNullish(formattedTransaction.nonce) || + isNullish(formattedTransaction.chainId) || + formattedTransaction.nonce.startsWith('-') || + formattedTransaction.chainId.startsWith('-') + ) + throw new InvalidNonceOrChainIdError({ + nonce: transaction.nonce, + chainId: transaction.chainId, + }); +}; diff --git a/packages/web3-eth/src/web3_eth.ts b/packages/web3-eth/src/web3_eth.ts new file mode 100644 index 00000000000..3c1165b0e3c --- /dev/null +++ b/packages/web3-eth/src/web3_eth.ts @@ -0,0 +1,1846 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Disabling because returnTypes must be last param to match 1.x params +/* eslint-disable default-param-last */ + +import { + SupportedProviders, + Address, + Bytes, + FeeData, + Filter, + HexString32Bytes, + HexString8Bytes, + Numbers, + BlockNumberOrTag, + LogsOutput, + Transaction, + TransactionCall, + Web3EthExecutionAPI, + TransactionWithFromLocalWalletIndex, + TransactionWithToLocalWalletIndex, + TransactionWithFromAndToLocalWalletIndex, + TransactionForAccessList, + DataFormat, + DEFAULT_RETURN_FORMAT, + Eip712TypedData, + FMT_BYTES, + FMT_NUMBER, +} from 'web3-types'; +import { isSupportedProvider, Web3Context, Web3ContextInitOptions } from 'web3-core'; +import { TransactionNotFound } from 'web3-errors'; +import { toChecksumAddress, isNullish, ethUnitMap } from 'web3-utils'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import * as rpcMethodsWrappers from './rpc_method_wrappers.js'; +import { SendTransactionOptions } from './types.js'; +import { + LogsSubscription, + NewPendingTransactionsSubscription, + NewHeadsSubscription, + SyncingSubscription, +} from './web3_subscriptions.js'; + +export type RegisteredSubscription = { + logs: typeof LogsSubscription; + newPendingTransactions: typeof NewPendingTransactionsSubscription; + pendingTransactions: typeof NewPendingTransactionsSubscription; + newHeads: typeof NewHeadsSubscription; + newBlockHeaders: typeof NewHeadsSubscription; + syncing: typeof SyncingSubscription; +}; + +export const registeredSubscriptions = { + logs: LogsSubscription, + newPendingTransactions: NewPendingTransactionsSubscription, + newHeads: NewHeadsSubscription, + syncing: SyncingSubscription, + pendingTransactions: NewPendingTransactionsSubscription, // the same as newPendingTransactions. just for support API like in version 1.x + newBlockHeaders: NewHeadsSubscription, // the same as newHeads. just for support API like in version 1.x +}; + +/** + * + * The Web3Eth allows you to interact with an Ethereum blockchain. + * + * For using Web3 Eth functions, first install Web3 package using `npm i web3` or `yarn add web3` based on your package manager usage. + * After that, Web3 Eth functions will be available as mentioned in following snippet. + * ```ts + * import { Web3 } from 'web3'; + * const web3 = new Web3('https://mainnet.infura.io/v3/'); + * + * const block = await web3.eth.getBlock(0); + * + * ``` + * + * For using individual package install `web3-eth` package using `npm i web3-eth` or `yarn add web3-eth` and only import required functions. + * This is more efficient approach for building lightweight applications. + * ```ts + * import { Web3Eth } from 'web3-eth'; + * + * const eth = new Web3Eth('https://mainnet.infura.io/v3/'); + * const block = await eth.getBlock(0); + * + * ``` + */ +export class Web3Eth extends Web3Context { + public constructor( + providerOrContext?: SupportedProviders | Web3ContextInitOptions | string, + ) { + if ( + typeof providerOrContext === 'string' || + isSupportedProvider(providerOrContext as SupportedProviders) + ) { + // @ts-expect-error disable the error: "A 'super' call must be a root-level statement within a constructor of a derived class that contains initialized properties, parameter properties, or private identifiers." + super({ + provider: providerOrContext as SupportedProviders, + registeredSubscriptions, + }); + + return; + } + + if ((providerOrContext as Web3ContextInitOptions).registeredSubscriptions) { + super(providerOrContext as Web3ContextInitOptions); + return; + } + + super({ + ...(providerOrContext as Web3ContextInitOptions), + registeredSubscriptions, + }); + } + + /** + * @returns Returns the ethereum protocol version of the node. + * + * ```ts + * web3.eth.getProtocolVersion().then(console.log); + * > "63" + * ``` + */ + public async getProtocolVersion() { + return ethRpcMethods.getProtocolVersion(this.requestManager); + } + + // TODO Add returnFormat parameter + /** + * Checks if the node is currently syncing. + * + * @returns Either a {@link SyncingStatusAPI}, or `false`. + * + * ```ts + * web3.eth.isSyncing().then(console.log); + * > { + * startingBlock: 100, + * currentBlock: 312, + * highestBlock: 512, + * knownStates: 234566, + * pulledStates: 123455 + * } + * ``` + */ + public async isSyncing() { + return ethRpcMethods.getSyncing(this.requestManager); + } + + // TODO consider adding returnFormat parameter (to format address as bytes) + /** + * @returns Returns the coinbase address to which mining rewards will go. + * + * ```ts + * web3.eth.getCoinbase().then(console.log); + * > "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe" + * ``` + */ + public async getCoinbase() { + return ethRpcMethods.getCoinbase(this.requestManager); + } + + /** + * Checks whether the node is mining or not. + * + * @returns `true` if the node is mining, otherwise `false`. + * + * ```ts + * web3.eth.isMining().then(console.log); + * > true + * ``` + */ + public async isMining() { + return ethRpcMethods.getMining(this.requestManager); + } + + /** + * @deprecated Will be removed in the future, please use {@link Web3Eth.getHashRate} method instead. + * + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The number of hashes per second that the node is mining with. + * + * ```ts + * web3.eth.getHashrate().then(console.log); + * > 493736n + * + * web3.eth.getHashrate({ number: FMT_NUMBER.HEX , bytes: FMT_BYTES.HEX }).then(console.log); + * > "0x788a8" + * ``` + */ + public async getHashrate( + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return this.getHashRate(returnFormat); + } + + /** + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The number of hashes per second that the node is mining with. + * + * ```ts + * web3.eth.getHashRate().then(console.log); + * > 493736n + * + * web3.eth.getHashRate({ number: FMT_NUMBER.HEX , bytes: FMT_BYTES.HEX }).then(console.log); + * > "0x788a8" + * ``` + */ + public async getHashRate( + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getHashRate(this, returnFormat); + } + + /** + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The gas price determined by the last few blocks median gas price. + * + * ```ts + * web3.eth.getGasPrice().then(console.log); + * > 20000000000n + * + * web3.eth.getGasPrice({ number: FMT_NUMBER.HEX , bytes: FMT_BYTES.HEX }).then(console.log); + * > "0x4a817c800" + * ``` + */ + public async getGasPrice( + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getGasPrice(this, returnFormat); + } + + /** + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns the current maxPriorityFeePerGas per gas in wei. + * + * ```ts + * web3.eth.getMaxPriorityFeePerGas().then(console.log); + * > 20000000000n + * + * web3.eth.getMaxPriorityFeePerGas({ number: FMT_NUMBER.HEX , bytes: FMT_BYTES.HEX }).then(console.log); + * > "0x4a817c800" + * ``` + */ + public async getMaxPriorityFeePerGas< + ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT, + >(returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat) { + return rpcMethodsWrappers.getMaxPriorityFeePerGas(this, returnFormat); + } + + /** + * Calculates the current Fee Data. + * If the node supports EIP-1559, then the `maxFeePerGas` and `maxPriorityFeePerGas` will be calculated. + * If the node does not support EIP-1559, then the `gasPrice` will be returned and the rest are `null`s. + * + * @param baseFeePerGasFactor The factor to multiply the baseFeePerGas with, if the node supports EIP-1559. + * @param alternativeMaxPriorityFeePerGas The alternative maxPriorityFeePerGas to use, if the node supports EIP-1559, but does not support the method `eth_maxPriorityFeePerGas`. + * @returns The current fee data. + * + * ```ts + * web3.eth.calculateFeeData().then(console.log); + * > { + * gasPrice: 20000000000n, + * maxFeePerGas: 20000000000n, + * maxPriorityFeePerGas: 20000000000n, + * baseFeePerGas: 20000000000n + * } + * + * web3.eth.calculateFeeData(ethUnitMap.Gwei, 2n).then(console.log); + * > { + * gasPrice: 20000000000n, + * maxFeePerGas: 40000000000n, + * maxPriorityFeePerGas: 20000000000n, + * baseFeePerGas: 20000000000n + * } + * ``` + */ + public async calculateFeeData( + baseFeePerGasFactor = BigInt(2), + alternativeMaxPriorityFeePerGas = ethUnitMap.Gwei, + ): Promise { + const block = await this.getBlock<{ number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.HEX }>( + undefined, + false, + ); + + const baseFeePerGas: bigint | undefined = block?.baseFeePerGas ?? undefined; // use undefined if it was null + + let gasPrice: bigint | undefined; + try { + gasPrice = await this.getGasPrice<{ number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.HEX }>(); + } catch (error) { + // do nothing + } + + let maxPriorityFeePerGas: bigint | undefined; + try { + maxPriorityFeePerGas = await this.getMaxPriorityFeePerGas<{ + number: FMT_NUMBER.BIGINT; + bytes: FMT_BYTES.HEX; + }>(); + } catch (error) { + // do nothing + } + + let maxFeePerGas: bigint | undefined; + // if the `block.baseFeePerGas` is available, then EIP-1559 is supported + // and we can calculate the `maxFeePerGas` from the `block.baseFeePerGas` + if (baseFeePerGas) { + // tip the miner with alternativeMaxPriorityFeePerGas, if no value available from getMaxPriorityFeePerGas + maxPriorityFeePerGas = maxPriorityFeePerGas ?? alternativeMaxPriorityFeePerGas; + // basically maxFeePerGas = (baseFeePerGas +- 12.5%) + maxPriorityFeePerGas + // and we multiply the `baseFeePerGas` by `baseFeePerGasFactor`, to allow + // trying to include the transaction in the next few blocks even if the + // baseFeePerGas is increasing fast + maxFeePerGas = baseFeePerGas * baseFeePerGasFactor + maxPriorityFeePerGas; + } + + return { gasPrice, maxFeePerGas, maxPriorityFeePerGas, baseFeePerGas }; + } + + // an alias for calculateFeeData + // eslint-disable-next-line + public getFeeData = this.calculateFeeData; + + /** + * @returns A list of accounts the node controls (addresses are checksummed). + * + * ```ts + * web3.eth.getAccounts().then(console.log); + * > ["0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", "0xDCc6960376d6C6dEa93647383FfB245CfCed97Cf"] + * ``` + */ + public async getAccounts() { + const hexAddresses = (await ethRpcMethods.getAccounts(this.requestManager)) ?? []; + return hexAddresses.map(address => toChecksumAddress(address)); + } + + /** + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The current block number. + * + * ```ts + * web3.eth.getBlockNumber().then(console.log); + * > 2744n + * + * web3.eth.getBlockNumber({ number: FMT_NUMBER.HEX , bytes: FMT_BYTES.HEX }).then(console.log); + * > "0xab8" + * ``` + */ + public async getBlockNumber( + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getBlockNumber(this, returnFormat); + } + + /** + * Get the balance of an address at a given block. + * + * @param address The address to get the balance of. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) Specifies what block to use as the current state for the balance query. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The current balance for the given address in `wei`. + * + * ```ts + * web3.eth.getBalance("0x407d73d8a49eeb85d32cf465507dd71d507100c1").then(console.log); + * > 1000000000000n + * + * web3.eth.getBalance("0x407d73d8a49eeb85d32cf465507dd71d507100c1").then(console.log); + * > "0xe8d4a51000" + * ``` + */ + public async getBalance( + address: Address, + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getBalance(this, address, blockNumber, returnFormat); + } + + /** + * Get the storage at a specific position of an address. + * + * @param address The address to get the storage from. + * @param storageSlot The index position of the storage. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) Specifies what block to use as the current state for the storage query. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The value in storage at the given position. + * + * ```ts + * web3.eth.getStorageAt("0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234", 0).then(console.log); + * > "0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234" + * + * web3.eth.getStorageAt( + * "0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234", + * 0, + * undefined, + * { number: FMT_NUMBER.HEX , bytes: FMT_BYTES.UINT8ARRAY } + * ).then(console.log); + * > Uint8Array(31) [ + * 3, 52, 86, 115, 33, 35, 255, 255, + * 35, 66, 52, 45, 209, 35, 66, 67, + * 67, 36, 35, 66, 52, 253, 35, 79, + * 210, 63, 212, 242, 61, 66, 52 + * ] + * ``` + */ + public async getStorageAt( + address: Address, + storageSlot: Numbers, + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getStorageAt(this, address, storageSlot, blockNumber, returnFormat); + } + + /** + * Get the code at a specific address. + * + * @param address The address to get the code from. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) Specifies what block to use as the current state for the code query. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The [data](https://ethereum.org/en/developers/docs/transactions/#the-data-field) at the provided `address`. + * + * ```ts + * web3.eth.getCode("0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234").then(console.log); + * > "0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056" + * + * web3.eth.getCode( + * "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + * undefined, + * { number: FMT_NUMBER.HEX , bytes: FMT_BYTES.UINT8ARRAY } + * ).then(console.log); + * > Uint8Array(50) [ + * 96, 1, 96, 0, 128, 53, 129, 26, 129, 129, 129, + * 20, 96, 18, 87, 131, 1, 0, 91, 96, 27, 96, + * 1, 53, 96, 37, 86, 91, 128, 96, 0, 82, 96, + * 32, 96, 0, 242, 91, 96, 0, 96, 7, 130, 2, + * 144, 80, 145, 144, 80, 86 + * ] + * ``` + */ + public async getCode( + address: Address, + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getCode(this, address, blockNumber, returnFormat); + } + + /** + * Retrieves a {@link Block} matching the provided block number, block hash or block tag. + * + * @param block The {@link BlockNumberOrTag} (defaults to {@link Web3Eth.defaultBlock}) or block hash of the desired block. + * @param hydrated If specified `true`, the returned block will contain all transactions as objects. If `false` it will only contain transaction hashes. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted (does not format transaction objects or hashes). + * @returns A {@link Block} object matching the provided block number or block hash. + * + * ```ts + * web3.eth.getBlock(0).then(console.log); + * > { + * hash: '0x7dbfdc6a7a67a670cb9b0c3f81ca60c007762f1e4e598cb027a470678ff26d0d', + * parentHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + * miner: '0x0000000000000000000000000000000000000000', + * stateRoot: '0x5ed9882897d363c4632a6e67fba6203df61bd994813dcf048da59be442a9c6c4', + * transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * difficulty: 1n, + * number: 0n, + * gasLimit: 30000000n, + * gasUsed: 0n, + * timestamp: 1658281638n, + * extraData: '0x', + * mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * nonce: 0n, + * totalDifficulty: 1n, + * baseFeePerGas: 1000000000n, + * size: 514n, + * transactions: [], + * uncles: [] + * } + * + * web3.eth.getBlock( + * "0x7dbfdc6a7a67a670cb9b0c3f81ca60c007762f1e4e598cb027a470678ff26d0d", + * false, + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > { + * hash: '0x7dbfdc6a7a67a670cb9b0c3f81ca60c007762f1e4e598cb027a470678ff26d0d', + * parentHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + * miner: '0x0000000000000000000000000000000000000000', + * stateRoot: '0x5ed9882897d363c4632a6e67fba6203df61bd994813dcf048da59be442a9c6c4', + * transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * difficulty: 1, + * number: 0, + * gasLimit: 30000000, + * gasUsed: 0, + * timestamp: 1658281638, + * extraData: '0x', + * mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * nonce: 0, + * totalDifficulty: 1, + * baseFeePerGas: 1000000000, + * size: 514, + * transactions: [], + * uncles: [] + * } + * ``` + */ + public async getBlock( + block: HexString32Bytes | BlockNumberOrTag = this.defaultBlock, + hydrated = false, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getBlock(this, block, hydrated, returnFormat); + } + + /** + * @param block The {@link BlockNumberOrTag} (defaults to {@link Web3Eth.defaultBlock}) or block hash of the desired block. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The number of transactions in the provided block. + * + * ```ts + * web3.eth.getBlockTransactionCount("0x407d73d8a49eeb85d32cf465507dd71d507100c1").then(console.log); + * > 1n + * + * web3.eth.getBlockTransactionCount( + * "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > 1 + * ``` + */ + public async getBlockTransactionCount< + ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT, + >( + block: HexString32Bytes | BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getBlockTransactionCount(this, block, returnFormat); + } + + /** + * @param block The {@link BlockNumberOrTag} (defaults to {@link Web3Eth.defaultBlock}) or block hash of the desired block. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The number of [uncles](https://ethereum.org/en/glossary/#ommer) in the provided block. + * + * ```ts + * web3.eth.getBlockUncleCount("0x407d73d8a49eeb85d32cf465507dd71d507100c1").then(console.log); + * > 1n + * + * web3.eth.getBlockUncleCount( + * "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > 1 + * ``` + */ + public async getBlockUncleCount( + block: HexString32Bytes | BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getBlockUncleCount(this, block, returnFormat); + } + + /** + * + * @param block The {@link BlockNumberOrTag} (defaults to {@link Web3Eth.defaultBlock}) or block hash of the desired block. + * @param uncleIndex The index position of the uncle. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns A blocks [uncle](https://ethereum.org/en/glossary/#ommer) by a given uncle index position. + * + * ```ts + * web3.eth.getUncle(0, 1).then(console.log); + * > { + * hash: '0x7dbfdc6a7a67a670cb9b0c3f81ca60c007762f1e4e598cb027a470678ff26d0d', + * parentHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + * miner: '0x0000000000000000000000000000000000000000', + * stateRoot: '0x5ed9882897d363c4632a6e67fba6203df61bd994813dcf048da59be442a9c6c4', + * transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * difficulty: 1n, + * number: 0n, + * gasLimit: 30000000n, + * gasUsed: 0n, + * timestamp: 1658281638n, + * extraData: '0x', + * mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * nonce: 0n, + * totalDifficulty: 1n, + * baseFeePerGas: 1000000000n, + * size: 514n, + * transactions: [], + * uncles: [] + * } + * + * web3.eth.getUncle( + * "0x7dbfdc6a7a67a670cb9b0c3f81ca60c007762f1e4e598cb027a470678ff26d0d", + * 1, + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > { + * hash: '0x7dbfdc6a7a67a670cb9b0c3f81ca60c007762f1e4e598cb027a470678ff26d0d', + * parentHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + * miner: '0x0000000000000000000000000000000000000000', + * stateRoot: '0x5ed9882897d363c4632a6e67fba6203df61bd994813dcf048da59be442a9c6c4', + * transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * difficulty: 1, + * number: 0, + * gasLimit: 30000000, + * gasUsed: 0, + * timestamp: 1658281638, + * extraData: '0x', + * mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * nonce: 0, + * totalDifficulty: 1, + * baseFeePerGas: 1000000000, + * size: 514, + * transactions: [], + * uncles: [] + * } + * ``` + */ + public async getUncle( + block: HexString32Bytes | BlockNumberOrTag = this.defaultBlock, + uncleIndex: Numbers, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getUncle(this, block, uncleIndex, returnFormat); + } + + /** + * @param transactionHash The hash of the desired transaction. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The desired transaction object. + * + * ```ts + * web3.eth.getTransaction('0x73aea70e969941f23f9d24103e91aa1f55c7964eb13daf1c9360c308a72686dc').then(console.log); + * { + * hash: '0x73aea70e969941f23f9d24103e91aa1f55c7964eb13daf1c9360c308a72686dc', + * type: 0n, + * nonce: 0n, + * blockHash: '0x43202bd16b6bd54bea1b310736bd78bdbe93a64ad940f7586739d9eb25ad8d00', + * blockNumber: 1n, + * transactionIndex: 0n, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1n, + * gas: 90000n, + * gasPrice: 2000000000n, + * input: '0x', + * v: 2709n, + * r: '0x8b336c290f6d7b2af3ccb2c02203a8356cc7d5b150ab19cce549d55636a3a78c', + * s: '0x5a83c6f816befc5cd4b0c997a347224a8aa002e5799c4b082a3ec726d0e9531d' + * } + * + * web3.eth.getTransaction( + * web3.utils.hexToBytes("0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400"), + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * { + * hash: '0x73aea70e969941f23f9d24103e91aa1f55c7964eb13daf1c9360c308a72686dc', + * type: 0, + * nonce: 0, + * blockHash: '0x43202bd16b6bd54bea1b310736bd78bdbe93a64ad940f7586739d9eb25ad8d00', + * blockNumber: 1, + * transactionIndex: 0, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1, + * gas: 90000, + * gasPrice: 2000000000, + * input: '0x', + * v: 2709, + * r: '0x8b336c290f6d7b2af3ccb2c02203a8356cc7d5b150ab19cce549d55636a3a78c', + * s: '0x5a83c6f816befc5cd4b0c997a347224a8aa002e5799c4b082a3ec726d0e9531d' + * } + * ``` + */ + public async getTransaction( + transactionHash: Bytes, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + const response = await rpcMethodsWrappers.getTransaction(this, transactionHash, returnFormat); + + if (!response) throw new TransactionNotFound(); + + return response; + } + + /** + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns A list of pending transactions. + * + * ```ts + * web3.eth.getPendingTransactions().then(console.log); + * > [ + * { + * hash: '0x73aea70e969941f23f9d24103e91aa1f55c7964eb13daf1c9360c308a72686dc', + * type: 0n, + * nonce: 0n, + * blockHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * blockNumber: null, + * transactionIndex: 0n, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1n, + * gas: 90000n, + * gasPrice: 2000000000n, + * input: '0x', + * v: 2709n, + * r: '0x8b336c290f6d7b2af3ccb2c02203a8356cc7d5b150ab19cce549d55636a3a78c', + * s: '0x5a83c6f816befc5cd4b0c997a347224a8aa002e5799c4b082a3ec726d0e9531d' + * }, + * { + * hash: '0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f', + * type: 0n, + * nonce: 1n, + * blockHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * blockNumber: null, + * transactionIndex: 0n, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1n, + * gas: 90000n, + * gasPrice: 2000000000n, + * input: '0x', + * v: 2710n, + * r: '0x55ac19fade21db035a1b7ea0a8d49e265e05dbb926e75f273f836ad67ce5c96a', + * s: '0x6550036a7c3fd426d5c3d35d96a7075cd673957620b7889846a980d2d017ec08' + * } + * ] + * + * * web3.eth.getPendingTransactions({ number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX }).then(console.log); + * > [ + * { + * hash: '0x73aea70e969941f23f9d24103e91aa1f55c7964eb13daf1c9360c308a72686dc', + * type: 0, + * nonce: 0, + * blockHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * blockNumber: null, + * transactionIndex: 0, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1, + * gas: 90000, + * gasPrice: 2000000000, + * input: '0x', + * v: 2709, + * r: '0x8b336c290f6d7b2af3ccb2c02203a8356cc7d5b150ab19cce549d55636a3a78c', + * s: '0x5a83c6f816befc5cd4b0c997a347224a8aa002e5799c4b082a3ec726d0e9531d' + * }, + * { + * hash: '0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f', + * type: 0, + * nonce: 1, + * blockHash: '0x0000000000000000000000000000000000000000000000000000000000000000', + * blockNumber: null, + * transactionIndex: 0, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1, + * gas: 90000, + * gasPrice: 2000000000, + * input: '0x', + * v: 2710, + * r: '0x55ac19fade21db035a1b7ea0a8d49e265e05dbb926e75f273f836ad67ce5c96a', + * s: '0x6550036a7c3fd426d5c3d35d96a7075cd673957620b7889846a980d2d017ec08' + * } + * ] + * ``` + */ + public async getPendingTransactions< + ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT, + >(returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat) { + return rpcMethodsWrappers.getPendingTransactions(this, returnFormat); + } + + /** + * @param block The {@link BlockNumberOrTag} (defaults to {@link Web3Eth.defaultBlock}) or block hash of the desired block. + * @param transactionIndex The index position of the transaction. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The desired transaction object. + * + * ```ts + * web3.eth.getTransactionFromBlock('0x43202bd16b6bd54bea1b310736bd78bdbe93a64ad940f7586739d9eb25ad8d00', 0).then(console.log); + * { + * hash: '0x73aea70e969941f23f9d24103e91aa1f55c7964eb13daf1c9360c308a72686dc', + * type: 0n, + * nonce: 0n, + * blockHash: '0x43202bd16b6bd54bea1b310736bd78bdbe93a64ad940f7586739d9eb25ad8d00', + * blockNumber: 1n, + * transactionIndex: 0n, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1n, + * gas: 90000n, + * gasPrice: 2000000000n, + * input: '0x', + * v: 2709n, + * r: '0x8b336c290f6d7b2af3ccb2c02203a8356cc7d5b150ab19cce549d55636a3a78c', + * s: '0x5a83c6f816befc5cd4b0c997a347224a8aa002e5799c4b082a3ec726d0e9531d' + * } + * + * web3.eth.getTransactionFromBlock( + * hexToBytes("0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400"), + * 0, + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * { + * hash: '0x73aea70e969941f23f9d24103e91aa1f55c7964eb13daf1c9360c308a72686dc', + * type: 0, + * nonce: 0, + * blockHash: '0x43202bd16b6bd54bea1b310736bd78bdbe93a64ad940f7586739d9eb25ad8d00', + * blockNumber: 1, + * transactionIndex: 0, + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * value: 1, + * gas: 90000, + * gasPrice: 2000000000, + * input: '0x', + * v: 2709, + * r: '0x8b336c290f6d7b2af3ccb2c02203a8356cc7d5b150ab19cce549d55636a3a78c', + * s: '0x5a83c6f816befc5cd4b0c997a347224a8aa002e5799c4b082a3ec726d0e9531d' + * } + * ``` + */ + public async getTransactionFromBlock< + ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT, + >( + block: HexString32Bytes | BlockNumberOrTag = this.defaultBlock, + transactionIndex: Numbers, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getTransactionFromBlock(this, block, transactionIndex, returnFormat); + } + + /** + * @param transactionHash Hash of the transaction to retrieve the receipt for. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The desired {@link TransactionReceipt} object. + * + * ```ts + * web3.eth.getTransactionReceipt("0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f").then(console.log); + * > { + * transactionHash: '0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f', + * transactionIndex: 0n, + * blockNumber: 2n, + * blockHash: '0xeb1565a08b23429552dafa92e32409f42eb43944f7611963c63ce40e7243941a', + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * cumulativeGasUsed: 21000n, + * gasUsed: 21000n, + * logs: [], + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * status: 1n, + * effectiveGasPrice: 2000000000n, + * type: 0n + * } + * + * web3.eth.getTransactionReceipt( + * "0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f", + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > { + * transactionHash: '0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f', + * transactionIndex: 0, + * blockNumber: 2, + * blockHash: '0xeb1565a08b23429552dafa92e32409f42eb43944f7611963c63ce40e7243941a', + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * cumulativeGasUsed: 21000, + * gasUsed: 21000, + * logs: [], + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * status: 1, + * effectiveGasPrice: 2000000000, + * type: 0n + * } + * ``` + */ + public async getTransactionReceipt< + ReturnFormat extends DataFormat = typeof DEFAULT_RETURN_FORMAT, + >(transactionHash: Bytes, returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat) { + const response = await rpcMethodsWrappers.getTransactionReceipt( + this, + transactionHash, + returnFormat, + ); + + if (!response) throw new TransactionNotFound(); + + return response; + } + + /** + * @param address The address to get the number of transactions for. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) Specifies what block to use as the current state for the query. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The number of transactions sent from the provided address. + * + * ```ts + * web3.eth.getTransactionCount("0x407d73d8a49eeb85d32cf465507dd71d507100c1").then(console.log); + * > 1n + * + * web3.eth.getTransactionCount( + * "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + * undefined, + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > 1 + * ``` + */ + public async getTransactionCount( + address: Address, + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getTransactionCount(this, address, blockNumber, returnFormat); + } + + /** + * @param transaction The {@link Transaction}, {@link TransactionWithFromLocalWalletIndex}, {@link TransactionWithToLocalWalletIndex} or {@link TransactionWithFromAndToLocalWalletIndex} to send. __Note:__ In the `to` and `from` fields when hex strings are used, it is assumed they are addresses, for any other form (number, string number, etc.) it is assumed they are wallet indexes. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @param options A configuration object used to change the behavior of the `sendTransaction` method. + * @returns If `await`ed or `.then`d (i.e. the promise resolves), the transaction hash is returned. + * ```ts + * const transaction = { + * from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + * to: '0x6f1DF96865D09d21e8f3f9a7fbA3b17A11c7C53C', + * value: '0x1' + * } + * + * const transactionHash = await web3.eth.sendTransaction(transaction); + * console.log(transactionHash); + * > 0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f + * + * web3.eth.sendTransaction(transaction).then(console.log); + * > 0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f + * + * web3.eth.sendTransaction(transaction).catch(console.log); + * > + * + * // Example using options.ignoreGasPricing = true + * web3.eth.sendTransaction(transaction, undefined, { ignoreGasPricing: true }).then(console.log); + * > 0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f + * ``` + * + * + * Otherwise, a {@link Web3PromiEvent} is returned which has several events than can be listened to using the `.on` syntax, such as: + * - `sending` + * ```ts + * web3.eth.sendTransaction(transaction).on('sending', transactionToBeSent => console.log(transactionToBeSent)); + * > { + * from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + * to: '0x6f1DF96865D09d21e8f3f9a7fbA3b17A11c7C53C', + * value: '0x1', + * gasPrice: '0x77359400', + * maxPriorityFeePerGas: undefined, + * maxFeePerGas: undefined + * } + * ``` + * - `sent` + * ```ts + * web3.eth.sendTransaction(transaction).on('sent', sentTransaction => console.log(sentTransaction)); + * > { + * from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + * to: '0x6f1DF96865D09d21e8f3f9a7fbA3b17A11c7C53C', + * value: '0x1', + * gasPrice: '0x77359400', + * maxPriorityFeePerGas: undefined, + * maxFeePerGas: undefined + * } + * ``` + * - `transactionHash` + * ```ts + * web3.eth.sendTransaction(transaction).on('transactionHash', transactionHash => console.log(transactionHash)); + * > 0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f + * ``` + * - `receipt` + * ```ts + * web3.eth.sendTransaction(transaction).on('receipt', receipt => console.log(receipt)); + * > { + * transactionHash: '0xdf7756865c2056ce34c4eabe4eff42ad251a9f920a1c620c00b4ea0988731d3f', + * transactionIndex: 0n, + * blockNumber: 2n, + * blockHash: '0xeb1565a08b23429552dafa92e32409f42eb43944f7611963c63ce40e7243941a', + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * cumulativeGasUsed: 21000n, + * gasUsed: 21000n, + * logs: [], + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * status: 1n, + * effectiveGasPrice: 2000000000n, + * type: 0n + * } + * ``` + * - `confirmation` + * ```ts + * web3.eth.sendTransaction(transaction).on('confirmation', confirmation => console.log(confirmation)); + * > { + * confirmations: 1n, + * receipt: { + * transactionHash: '0xb4a3a35ae0f3e77ef0ff7be42010d948d011b21a4e341072ee18717b67e99ab8', + * transactionIndex: 0n, + * blockNumber: 5n, + * blockHash: '0xb57fbe6f145cefd86a305a9a024a4351d15d4d39607d7af53d69a319bc3b5548', + * from: '0x6e599da0bff7a6598ac1224e4985430bf16458a4', + * to: '0x6f1df96865d09d21e8f3f9a7fba3b17a11c7c53c', + * cumulativeGasUsed: 21000n, + * gasUsed: 21000n, + * logs: [], + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * status: 1n, + * effectiveGasPrice: 2000000000n, + * type: 0n + * }, + * latestBlockHash: '0xb57fbe6f145cefd86a305a9a024a4351d15d4d39607d7af53d69a319bc3b5548' + * } + * ``` + * - `error` + * ```ts + * web3.eth.sendTransaction(transaction).on('error', error => console.log); + * > + * ``` + */ + public sendTransaction( + transaction: + | Transaction + | TransactionWithFromLocalWalletIndex + | TransactionWithToLocalWalletIndex + | TransactionWithFromAndToLocalWalletIndex, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + options?: SendTransactionOptions, + ) { + return rpcMethodsWrappers.sendTransaction(this, transaction, returnFormat, options); + } + + /** + * @param transaction Signed transaction in one of the valid {@link Bytes} format. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @param options A configuration object used to change the behavior of the method + * @returns If `await`ed or `.then`d (i.e. the promise resolves), the transaction hash is returned. + * ```ts + * const signedTransaction = "0xf86580843b9aca0182520894e899f0130fd099c0b896b2ce4e5e15a25b23139a0180820a95a03a42d53ca5b71f845e1cd4c65359b05446a85d16881372d3bfaab8980935cb04a0711497bc8dd3b541152e2fed14fe650a647f1f0edab0d386ad9506f0e642410f" + * + * const transactionHash = await web3.eth.sendSignedTransaction(signedTransaction); + * console.log(transactionHash); + * > 0xed8c241ea44d57f4605dc22c63500de46254d6c7844fd65fa438b128c80cf700 + * + * web3.eth.sendSignedTransaction(signedTransaction).then(console.log); + * > 0xed8c241ea44d57f4605dc22c63500de46254d6c7844fd65fa438b128c80cf700 + * + * web3.eth.sendSignedTransaction(signedTransaction).catch(console.log); + * > + * ``` + * + * + * Otherwise, a {@link Web3PromiEvent} is returned which has several events than can be listened to using the `.on` syntax, such as: + * - `sending` + * ```ts + * web3.eth.sendSignedTransaction(signedTransaction).on('sending', transactionToBeSent => console.log(transactionToBeSent)); + * > "0xf86580843b9aca0182520894e899f0130fd099c0b896b2ce4e5e15a25b23139a0180820a95a03a42d53ca5b71f845e1cd4c65359b05446a85d16881372d3bfaab8980935cb04a0711497bc8dd3b541152e2fed14fe650a647f1f0edab0d386ad9506f0e642410f" + * ``` + * - `sent` + * ```ts + * web3.eth.sendSignedTransaction(signedTransaction).on('sent', sentTransaction => console.log(sentTransaction)); + * > "0xf86580843b9aca0182520894e899f0130fd099c0b896b2ce4e5e15a25b23139a0180820a95a03a42d53ca5b71f845e1cd4c65359b05446a85d16881372d3bfaab8980935cb04a0711497bc8dd3b541152e2fed14fe650a647f1f0edab0d386ad9506f0e642410f" + * ``` + * - `transactionHash` + * ```ts + * web3.eth.sendSignedTransaction(signedTransaction).on('transactionHash', transactionHash => console.log(transactionHash)); + * > 0xed8c241ea44d57f4605dc22c63500de46254d6c7844fd65fa438b128c80cf700 + * ``` + * - `receipt` + * ```ts + * web3.eth.sendSignedTransaction(signedTransaction).on('receipt', receipt => console.log(receipt)); + * > { + * blockHash: '0xff2b1687995d81066361bc6affe4455746120a7d4bb75fc938211a2692a50081', + * blockNumber: 1n, + * cumulativeGasUsed: 21000n, + * effectiveGasPrice: 1000000001n, + * from: '0xe899f0130fd099c0b896b2ce4e5e15a25b23139a', + * gasUsed: 21000n, + * logs: [], + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * status: 1n, + * to: '0xe899f0130fd099c0b896b2ce4e5e15a25b23139a', + * transactionHash: '0xed8c241ea44d57f4605dc22c63500de46254d6c7844fd65fa438b128c80cf700', + * transactionIndex: 0n, + * type: 0n + * } + * ``` + * - `confirmation` + * ```ts + * web3.eth.sendSignedTransaction(signedTransaction).on('confirmation', confirmation => console.log(confirmation)); + * > { + * confirmations: 1n, + * receipt: { + * blockHash: '0xff2b1687995d81066361bc6affe4455746120a7d4bb75fc938211a2692a50081', + * blockNumber: 1n, + * cumulativeGasUsed: 21000n, + * effectiveGasPrice: 1000000001n, + * from: '0xe899f0130fd099c0b896b2ce4e5e15a25b23139a', + * gasUsed: 21000n, + * logs: [], + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * status: 1n, + * to: '0xe899f0130fd099c0b896b2ce4e5e15a25b23139a', + * transactionHash: '0xed8c241ea44d57f4605dc22c63500de46254d6c7844fd65fa438b128c80cf700', + * transactionIndex: 0n, + * type: 0n + * }, + * latestBlockHash: '0xff2b1687995d81066361bc6affe4455746120a7d4bb75fc938211a2692a50081' + * } + * ``` + * - `error` + * ```ts + * web3.eth.sendSignedTransaction(signedTransaction).on('error', error => console.log(error)); + * > + * ``` + */ + public sendSignedTransaction( + transaction: Bytes, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + options?: SendTransactionOptions, + ) { + return rpcMethodsWrappers.sendSignedTransaction(this, transaction, returnFormat, options); + } + + /** + * @param message Data to sign in one of the valid {@link Bytes} format. + * @param address Address to sign data with, can be an address or the index of a local wallet. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns The signed `message`. + * + * ```ts + * // Using an unlocked account managed by connected RPC client + * web3.eth.sign("0x48656c6c6f20776f726c64", "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe").then(console.log); + * > "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400" + * + * // Using an unlocked account managed by connected RPC client + * web3.eth.sign("0x48656c6c6f20776f726c64", "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.UINT8ARRAY }).then(console.log); + * > Uint8Array(65) [ + * 48, 117, 94, 214, 83, 150, 250, 207, 134, 197, 62, + * 98, 23, 197, 43, 77, 174, 190, 114, 170, 73, 65, + * 216, 150, 53, 64, 157, 228, 201, 199, 249, 70, 109, + * 78, 154, 174, 199, 151, 127, 5, 233, 35, 136, 155, + * 51, 192, 208, 221, 39, 215, 34, 107, 110, 111, 86, + * 206, 115, 116, 101, 197, 207, 208, 75, 228, 0 + * ] + * ``` + * + * // Using an indexed account managed by local Web3 wallet + * web3.eth.sign("0x48656c6c6f20776f726c64", 0).then(console.log); + * > "0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400" + */ + public async sign( + message: Bytes, + addressOrIndex: Address | number, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.sign(this, message, addressOrIndex, returnFormat); + } + + /** + * @param transaction The transaction object to sign. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) Specifies how the return data should be formatted. + * @returns {@link SignedTransactionInfoAPI}, an object containing the [RLP](https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/#top) encoded signed transaction (accessed via the `raw` property) and the signed transaction object (accessed via the `tx` property). + * + * ```ts + * const transaction = { + * from: '0xe899f0130FD099c0b896B2cE4E5E15A25b23139a', + * to: '0xe899f0130FD099c0b896B2cE4E5E15A25b23139a', + * value: '0x1', + * gas: '21000', + * gasPrice: await web3Eth.getGasPrice(), + * nonce: '0x1', + * type: '0x0' + * } + * + * web3.eth.signTransaction(transaction).then(console.log); + * > { + * raw: '0xf86501843b9aca0182520894e899f0130fd099c0b896b2ce4e5e15a25b23139a0180820a96a0adb3468dbb4dce89fe1785ea9182e85fb56b399b378f82b93af7a8a12a4f9679a027d37d736e9bcf00121f78b2d10e4404fa5c45856d62b746574345f5cd278097', + * tx: { + * type: 0n, + * nonce: 1n, + * gasPrice: 1000000001n, + * gas: 21000n, + * value: 1n, + * v: 2710n, + * r: '0xadb3468dbb4dce89fe1785ea9182e85fb56b399b378f82b93af7a8a12a4f9679', + * s: '0x27d37d736e9bcf00121f78b2d10e4404fa5c45856d62b746574345f5cd278097', + * to: '0xe899f0130fd099c0b896b2ce4e5e15a25b23139a', + * data: '0x' + * } + * } + * + * web3.eth.signTransaction(transaction, { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX }).then(console.log); + * > { + * raw: '0xf86501843b9aca0182520894e899f0130fd099c0b896b2ce4e5e15a25b23139a0180820a96a0adb3468dbb4dce89fe1785ea9182e85fb56b399b378f82b93af7a8a12a4f9679a027d37d736e9bcf00121f78b2d10e4404fa5c45856d62b746574345f5cd278097', + * tx: { + * type: 0, + * nonce: 1, + * gasPrice: 1000000001, + * gas: 21000, + * value: 1, + * v: 2710, + * r: '0xadb3468dbb4dce89fe1785ea9182e85fb56b399b378f82b93af7a8a12a4f9679', + * s: '0x27d37d736e9bcf00121f78b2d10e4404fa5c45856d62b746574345f5cd278097', + * to: '0xe899f0130fd099c0b896b2ce4e5e15a25b23139a', + * data: '0x' + * } + * } + * ``` + */ + public async signTransaction( + transaction: Transaction, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.signTransaction(this, transaction, returnFormat); + } + + // TODO Decide what to do with transaction.to + // https://github.com/ChainSafe/web3.js/pull/4525#issuecomment-982330076 + /** + * Executes a message call within the EVM without creating a transaction. + * It does not publish anything to the blockchain and does not consume any gas. + * + * @param transaction - A transaction object where all properties are optional except `to`, however it's recommended to include the `from` property or it may default to `0x0000000000000000000000000000000000000000` depending on your node or provider. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) - Specifies what block to use as the current state of the blockchain while processing the transaction. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the call should be formatted. + * @returns The returned data of the call, e.g. a smart contract function's return value. + */ + public async call( + transaction: TransactionCall, + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.call(this, transaction, blockNumber, returnFormat); + } + + /** + * Simulates the transaction within the EVM to estimate the amount of gas to be used by the transaction. + * The transaction will not be added to the blockchain, and actual gas usage can vary when interacting + * with a contract as a result of updating the contract's state. + * + * @param transaction The {@link Transaction} object to estimate the gas for. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) - Specifies what block to use as the current state of the blockchain while processing the gas estimation. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the call should be formatted. + * @returns The used gas for the simulated transaction execution. + * + * ```ts + * const transaction = { + * from: '0xe899f0130FD099c0b896B2cE4E5E15A25b23139a', + * to: '0xe899f0130FD099c0b896B2cE4E5E15A25b23139a', + * value: '0x1', + * nonce: '0x1', + * type: '0x0' + * } + * + * web3.eth.estimateGas(transaction).then(console.log); + * > 21000n + * + * web3.eth.estimateGas(transaction, { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX }).then(console.log); + * > 21000 + * ``` + */ + public async estimateGas( + transaction: Transaction, + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.estimateGas(this, transaction, blockNumber, returnFormat); + } + + /** + * Gets past logs, matching the provided `filter`. + * + * @param filter A {@link Filter} object containing the properties for the desired logs. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the call should be formatted. + * @returns {@link FilterResultsAPI}, an array of {@link Log} objects. + * + * ```ts + * web3.eth.getPastLogs({ + * address: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", + * topics: ["0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234"] + * }).then(console.log); + * > [{ + * data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] + * logIndex: 0n, + * transactionIndex: 0n, + * transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * blockNumber: 1234n, + * address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' + * }, + * {...}] + * + * web3.eth.getPastLogs( + * { + * address: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", + * topics: ["0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234"] + * }, + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > [{ + * data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385'] + * logIndex: 0, + * transactionIndex: 0, + * transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385', + * blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', + * blockNumber: 1234, + * address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' + * }, + * {...}] + * ``` + */ + public async getPastLogs( + filter: Filter, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getLogs(this, filter, returnFormat); + } + + /** + * Gets work for miners to mine on. Returns the hash of the current block, the seedHash, and the boundary condition to be met ('target'). + * + * @returns The mining work as an array of strings with the following structure: + * + * String 32 Bytes - at index 0: current block header pow-hash + * String 32 Bytes - at index 1: the seed hash used for the DAG. + * String 32 Bytes - at index 2: the boundary condition ('target'), 2^256 / difficulty. + * + * ```ts + * web3.eth.getWork().then(console.log); + * > [ + * "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + * "0x5EED00000000000000000000000000005EED0000000000000000000000000000", + * "0xd1ff1c01710000000000000000000000d1ff1c01710000000000000000000000" + * ] + * ``` + */ + public async getWork() { + return ethRpcMethods.getWork(this.requestManager); + } + + /** + * Used for submitting a proof-of-work solution. + * + * @param nonce The nonce found (8 bytes). + * @param hash The header’s pow-hash (32 bytes). + * @param digest The mix digest (32 bytes). + * @returns Returns `true` if the provided solution is valid, otherwise `false`. + * + * ```ts + * web3.eth.submitWork([ + * "0x0000000000000001", + * "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + * "0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000" + * ]).then(console.log); + * > true + * ``` + */ + public async submitWork( + nonce: HexString8Bytes, + hash: HexString32Bytes, + digest: HexString32Bytes, + ) { + return ethRpcMethods.submitWork(this.requestManager, nonce, hash, digest); + } + + // TODO - Format addresses + /** + * This method will request/enable the accounts from the current environment and for supporting [EIP 1102](https://eips.ethereum.org/EIPS/eip-1102) + * This method will only work if you’re using the injected provider from a application like Metamask, Status or TrustWallet. + * It doesn’t work if you’re connected to a node with a default Web3.js provider (WebsocketProvider, HttpProvider and IpcProvider). + * For more information about the behavior of this method please read [EIP-1102](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1102.md): Opt-in account exposure. + * + * @returns An array of enabled accounts. + * + * ```ts + * web3.eth.requestAccounts().then(console.log); + * > ['0aae0B295369a9FD31d5F28D9Ec85E40f4cb692BAf', '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'] + * ``` + */ + public async requestAccounts() { + return ethRpcMethods.requestAccounts(this.requestManager); + } + + /** + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the call should be formatted. + * @returns The chain ID of the current connected node as described in the [EIP-695](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-695.md). + * + * ```ts + * web3.eth.getChainId().then(console.log); + * > 61n + * + * web3.eth.getChainId({ number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX }).then(console.log); + * > 61 + * ``` + */ + public async getChainId( + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getChainId(this, returnFormat); + } + + /** + * @returns The current client version. + * + * ```ts + * web3.eth.getNodeInfo().then(console.log); + * > "Mist/v0.9.3/darwin/go1.4.1" + * ``` + */ + public async getNodeInfo() { + return ethRpcMethods.getNodeInfo(this.requestManager); + } + + /** + * @param address The Address of the account or contract. + * @param storageKeys Array of storage-keys which should be proofed and included. See {@link web3.getStorageAt}. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) - Specifies what block to use as the current state of the blockchain while processing the gas estimation. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the call should be formatted. + * @returns The account and storage-values of the specified account including the Merkle-proof as described in [EIP-1186](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1186.md). + * + * ```ts + * web3.eth.getProof( + * "0x1234567890123456789012345678901234567890", + * ["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001"], + * "latest" + * ).then(console.log); + * > { + * "address": "0x1234567890123456789012345678901234567890", + * "accountProof": [ + * "0xf90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80", + * "0xf90211a0395d87a95873cd98c21cf1df9421af03f7247880a2554e20738eec2c7507a494a0bcf6546339a1e7e14eb8fb572a968d217d2a0d1f3bc4257b22ef5333e9e4433ca012ae12498af8b2752c99efce07f3feef8ec910493be749acd63822c3558e6671a0dbf51303afdc36fc0c2d68a9bb05dab4f4917e7531e4a37ab0a153472d1b86e2a0ae90b50f067d9a2244e3d975233c0a0558c39ee152969f6678790abf773a9621a01d65cd682cc1be7c5e38d8da5c942e0a73eeaef10f387340a40a106699d494c3a06163b53d956c55544390c13634ea9aa75309f4fd866f312586942daf0f60fb37a058a52c1e858b1382a8893eb9c1f111f266eb9e21e6137aff0dddea243a567000a037b4b100761e02de63ea5f1fcfcf43e81a372dafb4419d126342136d329b7a7ba032472415864b08f808ba4374092003c8d7c40a9f7f9fe9cc8291f62538e1cc14a074e238ff5ec96b810364515551344100138916594d6af966170ff326a092fab0a0d31ac4eef14a79845200a496662e92186ca8b55e29ed0f9f59dbc6b521b116fea090607784fe738458b63c1942bba7c0321ae77e18df4961b2bc66727ea996464ea078f757653c1b63f72aff3dcc3f2a2e4c8cb4a9d36d1117c742833c84e20de994a0f78407de07f4b4cb4f899dfb95eedeb4049aeb5fc1635d65cf2f2f4dfd25d1d7a0862037513ba9d45354dd3e36264aceb2b862ac79d2050f14c95657e43a51b85c80", + * "0xf90171a04ad705ea7bf04339fa36b124fa221379bd5a38ffe9a6112cb2d94be3a437b879a08e45b5f72e8149c01efcb71429841d6a8879d4bbe27335604a5bff8dfdf85dcea00313d9b2f7c03733d6549ea3b810e5262ed844ea12f70993d87d3e0f04e3979ea0b59e3cdd6750fa8b15164612a5cb6567cdfb386d4e0137fccee5f35ab55d0efda0fe6db56e42f2057a071c980a778d9a0b61038f269dd74a0e90155b3f40f14364a08538587f2378a0849f9608942cf481da4120c360f8391bbcc225d811823c6432a026eac94e755534e16f9552e73025d6d9c30d1d7682a4cb5bd7741ddabfd48c50a041557da9a74ca68da793e743e81e2029b2835e1cc16e9e25bd0c1e89d4ccad6980a041dda0a40a21ade3a20fcd1a4abb2a42b74e9a32b02424ff8db4ea708a5e0fb9a09aaf8326a51f613607a8685f57458329b41e938bb761131a5747e066b81a0a16808080a022e6cef138e16d2272ef58434ddf49260dc1de1f8ad6dfca3da5d2a92aaaadc58080", + * "0xf851808080a009833150c367df138f1538689984b8a84fc55692d3d41fe4d1e5720ff5483a6980808080808080808080a0a319c1c415b271afc0adcb664e67738d103ac168e0bc0b7bd2da7966165cb9518080" + * ], + * "balance": 0n, + * "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + * "nonce": 0n, + * "storageHash": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + * "storageProof": [ + * { + * "key": "0x0000000000000000000000000000000000000000000000000000000000000000", + * "value": 0n, + * "proof": [] + * }, + * { + * "key": "0x0000000000000000000000000000000000000000000000000000000000000001", + * "value": 0n, + * "proof": [] + * } + * ] + * } + * + * web3.eth.getProof( + * "0x1234567890123456789012345678901234567890", + * ["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001"], + * undefined, + * { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX } + * ).then(console.log); + * > { + * "address": "0x1234567890123456789012345678901234567890", + * "accountProof": [ + * "0xf90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80", + * "0xf90211a0395d87a95873cd98c21cf1df9421af03f7247880a2554e20738eec2c7507a494a0bcf6546339a1e7e14eb8fb572a968d217d2a0d1f3bc4257b22ef5333e9e4433ca012ae12498af8b2752c99efce07f3feef8ec910493be749acd63822c3558e6671a0dbf51303afdc36fc0c2d68a9bb05dab4f4917e7531e4a37ab0a153472d1b86e2a0ae90b50f067d9a2244e3d975233c0a0558c39ee152969f6678790abf773a9621a01d65cd682cc1be7c5e38d8da5c942e0a73eeaef10f387340a40a106699d494c3a06163b53d956c55544390c13634ea9aa75309f4fd866f312586942daf0f60fb37a058a52c1e858b1382a8893eb9c1f111f266eb9e21e6137aff0dddea243a567000a037b4b100761e02de63ea5f1fcfcf43e81a372dafb4419d126342136d329b7a7ba032472415864b08f808ba4374092003c8d7c40a9f7f9fe9cc8291f62538e1cc14a074e238ff5ec96b810364515551344100138916594d6af966170ff326a092fab0a0d31ac4eef14a79845200a496662e92186ca8b55e29ed0f9f59dbc6b521b116fea090607784fe738458b63c1942bba7c0321ae77e18df4961b2bc66727ea996464ea078f757653c1b63f72aff3dcc3f2a2e4c8cb4a9d36d1117c742833c84e20de994a0f78407de07f4b4cb4f899dfb95eedeb4049aeb5fc1635d65cf2f2f4dfd25d1d7a0862037513ba9d45354dd3e36264aceb2b862ac79d2050f14c95657e43a51b85c80", + * "0xf90171a04ad705ea7bf04339fa36b124fa221379bd5a38ffe9a6112cb2d94be3a437b879a08e45b5f72e8149c01efcb71429841d6a8879d4bbe27335604a5bff8dfdf85dcea00313d9b2f7c03733d6549ea3b810e5262ed844ea12f70993d87d3e0f04e3979ea0b59e3cdd6750fa8b15164612a5cb6567cdfb386d4e0137fccee5f35ab55d0efda0fe6db56e42f2057a071c980a778d9a0b61038f269dd74a0e90155b3f40f14364a08538587f2378a0849f9608942cf481da4120c360f8391bbcc225d811823c6432a026eac94e755534e16f9552e73025d6d9c30d1d7682a4cb5bd7741ddabfd48c50a041557da9a74ca68da793e743e81e2029b2835e1cc16e9e25bd0c1e89d4ccad6980a041dda0a40a21ade3a20fcd1a4abb2a42b74e9a32b02424ff8db4ea708a5e0fb9a09aaf8326a51f613607a8685f57458329b41e938bb761131a5747e066b81a0a16808080a022e6cef138e16d2272ef58434ddf49260dc1de1f8ad6dfca3da5d2a92aaaadc58080", + * "0xf851808080a009833150c367df138f1538689984b8a84fc55692d3d41fe4d1e5720ff5483a6980808080808080808080a0a319c1c415b271afc0adcb664e67738d103ac168e0bc0b7bd2da7966165cb9518080" + * ], + * "balance": 0, + * "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + * "nonce": 0, + * "storageHash": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + * "storageProof": [ + * { + * "key": "0x0000000000000000000000000000000000000000000000000000000000000000", + * "value": 0, + * "proof": [] + * }, + * { + * "key": "0x0000000000000000000000000000000000000000000000000000000000000001", + * "value": 0, + * "proof": [] + * } + * ] + * } + * ``` + */ + public async getProof( + address: Address, + storageKeys: Bytes[], + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getProof(this, address, storageKeys, blockNumber, returnFormat); + } + + // TODO Throwing an error with Geth, but not Infura + // TODO gasUsedRatio and reward not formatting + /** + * @param blockCount Number of blocks in the requested range. Between `1` and `1024` blocks can be requested in a single query. Less than requested may be returned if not all blocks are available. + * @param newestBlock Highest number block of the requested range. + * @param rewardPercentiles A monotonically increasing list of percentile values to sample from each block’s effective priority fees per gas in ascending order, weighted by gas used. Example: `['0', '25', '50', '75', '100']` or `['0', '0.5', '1', '1.5', '3', '80']` + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the call should be formatted. + * @returns `baseFeePerGas` and transaction effective `priorityFeePerGas` history for the requested block range if available. + * The range between `headBlock - 4` and `headBlock` is guaranteed to be available while retrieving data from the `pending` block and older history are optional to support. + * For pre-EIP-1559 blocks the `gasPrice`s are returned as `rewards` and zeroes are returned for the `baseFeePerGas`. + * + * ```ts + * web3.eth.getFeeHistory(4, 'pending', [0, 25, 75, 100]).then(console.log); + * > { + * baseFeePerGas: [ + * 22983878621n, + * 21417903463n, + * 19989260230n, + * 17770954829n, + * 18850641304n + * ], + * gasUsedRatio: [ + * 0.22746546666666667, + * 0.2331871, + * 0.05610054885262125, + * 0.7430227268212117 + * ], + * oldestBlock: 15216343n, + * reward: [ + * [ '0x3b9aca00', '0x53724e00', '0x77359400', '0x1d92c03423' ], + * [ '0x3b9aca00', '0x3b9aca00', '0x3b9aca00', '0xee6b2800' ], + * [ '0x3b9aca00', '0x4f86a721', '0x77d9743a', '0x9502f900' ], + * [ '0xcc8ff9e', '0x53724e00', '0x77359400', '0x1ec9771bb3' ] + * ] + * } + * + * web3.eth.getFeeHistory(4, BlockTags.LATEST, [0, 25, 75, 100], { number: FMT_NUMBER.NUMBER , bytes: FMT_BYTES.HEX }).then(console.log); + * > { + * baseFeePerGas: [ + * 22983878621, + * 21417903463, + * 19989260230, + * 17770954829, + * 18850641304 + * ], + * gasUsedRatio: [ + * 0.22746546666666667, + * 0.2331871, + * 0.05610054885262125, + * 0.7430227268212117 + * ], + * oldestBlock: 15216343, + * reward: [ + * [ '0x3b9aca00', '0x53724e00', '0x77359400', '0x1d92c03423' ], + * [ '0x3b9aca00', '0x3b9aca00', '0x3b9aca00', '0xee6b2800' ], + * [ '0x3b9aca00', '0x4f86a721', '0x77d9743a', '0x9502f900' ], + * [ '0xcc8ff9e', '0x53724e00', '0x77359400', '0x1ec9771bb3' ] + * ] + * } + * ``` + */ + public async getFeeHistory( + blockCount: Numbers, + newestBlock: BlockNumberOrTag = this.defaultBlock, + rewardPercentiles: Numbers[], + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getFeeHistory( + this, + blockCount, + newestBlock, + rewardPercentiles, + returnFormat, + ); + } + + /** + * This method generates an access list for a transaction. + * + * @param transaction - A transaction object where all properties are optional except `from`, however it's recommended to include the `to` property. + * @param blockNumber ({@link BlockNumberOrTag} defaults to {@link Web3Eth.defaultBlock}) - Specifies what block to use as the current state of the blockchain while processing the transaction. + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the return data from the createAccessList should be formatted. + * @returns The returned data of the createAccessList, e.g. The generated access list for transaction. + * @example + * ```ts + * web3.eth.createAccessList({ + * from: '0xDe95305a63302C3aa4d3A9B42654659AeA72b694', + * data: '0x9a67c8b100000000000000000000000000000000000000000000000000000000000004d0', + * gasPrice: '0x3b9aca00', + * gas: '0x3d0900', + * to: '0x940b25304947ae863568B3804434EC77E2160b87' + * }) + * .then(console.log); + * + * > { + * "accessList": [ + * { + * "address": "0x15859bdf5aff2080a9968f6a410361e9598df62f", + * "storageKeys": [ + * "0x0000000000000000000000000000000000000000000000000000000000000000" + * ] + * } + * ], + * "gasUsed": "0x7671" + * } + * ``` + */ + public async createAccessList( + transaction: TransactionForAccessList, + blockNumber: BlockNumberOrTag = this.defaultBlock, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.createAccessList(this, transaction, blockNumber, returnFormat); + } + + /** + * This method sends EIP-712 typed data to the RPC provider to be signed. + * + * @param address The address that corresponds with the private key used to sign the typed data. + * @param typedData The EIP-712 typed data object. + * @param useLegacy A boolean flag determining whether the RPC call uses the legacy method `eth_signTypedData` or the newer method `eth_signTypedData_v4` + * @param returnFormat ({@link DataFormat} defaults to {@link DEFAULT_RETURN_FORMAT}) - Specifies how the signed typed data should be formatted. + * @returns The signed typed data. + */ + public async signTypedData( + address: Address, + typedData: Eip712TypedData, + useLegacy = false, + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.signTypedData(this, address, typedData, useLegacy, returnFormat); + } + + /** + * Lets you subscribe to specific events in the blockchain. + * + * @param name - The subscription you want to subscribe to. + * @param args - Optional additional parameters, depending on the subscription type. + * @returns A subscription object of type {@link RegisteredSubscription}. The object contains: + * - subscription.id: The subscription id, used to identify and unsubscribing the subscription. + * - subscription.subscribe(): Can be used to re-subscribe with the same parameters. + * - subscription.unsubscribe(): Unsubscribes the subscription and returns TRUE in the callback if successful. + * - subscription.args: The subscription arguments, used when re-subscribing. + * + * + * You can use the subscription object to listen on: + * + * - on("data") - Fires on each incoming log with the log object as argument. + * - on("changed") - Fires on each log which was removed from the blockchain. The log will have the additional property "removed: true". + * - on("error") - Fires when an error in the subscription occurs. + * - on("connected") - Fires once after the subscription successfully connected. Returns the subscription id. + * + * @example **Subscribe to Smart Contract events** + * ```ts + * // Subscribe to `logs` + * const logSubscription = web3.eth.subscribe('logs', { + * address: '0x1234567890123456789012345678901234567890', + * topics: ['0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234'] + * }); + * logSubscription.on('data', (data: any) => console.log(data)); + * logSubscription.on('error', (error: any) => console.log(error)); + * + * ``` + * + * @example **Subscribe to new block headers** + * ```ts + * // Subscribe to `newBlockHeaders` + * const newBlocksSubscription = await web3.eth.subscribe('newBlockHeaders'); + * + * newBlocksSubscription.on('data', async blockhead => { + * console.log('New block header: ', blockhead); + * + * // You do not need the next line, if you like to keep notified for every new block + * await newBlocksSubscription.unsubscribe(); + * console.log('Unsubscribed from new block headers.'); + * }); + * newBlocksSubscription.on('error', error => + * console.log('Error when subscribing to New block header: ', error), + * ); + * ``` + * + * ### subscribe('pendingTransactions') + * + * Subscribes to incoming pending transactions. + * You can subscribe to pending transactions by calling web3.eth.subscribe('pendingTransactions'). + * + * ```ts + * (await web3.eth.subscribe('pendingTransactions')).on('data', console.log); + * ``` + * + * ### subscribe('newHeads') + * ( same as subscribe('newBlockHeaders')) + * Subscribes to incoming block headers. This can be used as timer to check for changes on the blockchain. + * + * The structure of a returned block header is {@link BlockHeaderOutput}: + * + * ```ts + * (await web3.eth.subscribe('newHeads')).on( // 'newBlockHeaders' would work as well + * 'data', + * console.log + * ); + * >{ + * parentHash: '0x9e746a1d906b299def98c75b06f714d62dacadd567c7515d76eeaa8c8074c738', + * sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + * miner: '0x0000000000000000000000000000000000000000', + * stateRoot: '0xe0f04b04861ecfa95e82a9310d6a7ef7aef8d7417f5209c182582bfb98a8e307', + * transactionsRoot: '0x31ab4ea571a9e10d3a19aaed07d190595b1dfa34e03960c04293fec565dea536', + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * difficulty: 2n, + * number: 21n, + * gasLimit: 11738125n, + * gasUsed: 830006n, + * timestamp: 1678797237n, + * extraData: '0xd883010b02846765746888676f312e32302e31856c696e757800000000000000e0a6e93cf40e2e71a72e493272210c3f43738ccc7e7d7b14ffd51833797d896c09117e8dc4fbcbc969bd21b42e5af3e276a911524038c001b2109b63b8e0352601', + * nonce: 0n + * } + * ``` + * + * ### subscribe('syncing') + * Subscribe to syncing events. This will return `true` when the node is syncing and when it’s finished syncing will return `false`, for the `changed` event. + * + * ```ts + * (await web3.eth.subscribe('syncing')).on('changed', console.log); + * > `true` // when syncing + * + * (await web3.eth.subscribe('syncing')).on('data', console.log); + * > { + * startingBlock: 0, + * currentBlock: 0, + * highestBlock: 0, + * pulledStates: 0, + * knownStates: 0 + * } + * ``` + * + * ### subscribe('logs', options) + * Subscribes to incoming logs, filtered by the given options. If a valid numerical fromBlock options property is set, web3.js will retrieve logs beginning from this point, backfilling the response as necessary. + * + * options: You can subscribe to logs matching a given filter object, which can take the following parameters: + * - `fromBlock`: (optional, default: 'latest') Integer block number, or `'latest'` for the last mined block or `'pending'`, `'earliest'` for not yet mined transactions. + * - `address`: (optional) Contract address or a list of addresses from which logs should originate. + * - `topics`: (optional) Array of 32 Bytes DATA topics. Topics are order-dependent. Each topic can also be an array of DATA with `or` options. + * + * ```ts + * (await web3.eth.subscribe('logs', { + * address: '0xdac17f958d2ee523a2206206994597c13d831ec7', + * })).on('data', console.log); + * + * > { + * removed: false, + * logIndex: 119n, + * transactionIndex: 58n, + * transactionHash: '0x61533efa77937360215069d5d6cb0be09a22af9721e6dc3df59d957833ed8870', + * blockHash: '0xe32bb97084479d32247f66f8b46d00af2fbc3c2db2bc6e5843fe2e4d1ca9b099', + * blockNumber: 18771966n, + * address: '0xdac17f958d2ee523a2206206994597c13d831ec7', + * data: '0x00000000000000000000000000000000000000000000000000000000d88b2e40', + * topics: [ + * '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + * '0x0000000000000000000000002fb2457f6ec1865dc0d4e7300c696b69c2a1b989', + * '0x00000000000000000000000027fd43babfbe83a81d14665b1a6fb8030a60c9b4' + * ] + * } + *``` + */ + + public async subscribe< + T extends keyof RegisteredSubscription, + ReturnType extends DataFormat = DataFormat, + >( + name: T, + args?: ConstructorParameters[0], + returnFormat: ReturnType = DEFAULT_RETURN_FORMAT as ReturnType, + ): Promise> { + const subscription = await this.subscriptionManager?.subscribe(name, args, returnFormat); + if ( + subscription instanceof LogsSubscription && + name === 'logs' && + typeof args === 'object' && + !isNullish(args.fromBlock) && + Number.isFinite(Number(args.fromBlock)) + ) { + setImmediate(() => { + this.getPastLogs(args) + .then(logs => { + for (const log of logs) { + subscription._processSubscriptionResult(log as LogsOutput); + } + }) + .catch(e => { + subscription._processSubscriptionError(e as Error); + }); + }); + } + return subscription; + } + + private static shouldClearSubscription({ sub }: { sub: unknown }): boolean { + return !(sub instanceof SyncingSubscription); + } + + /** + * Resets subscriptions. + * + * @param notClearSyncing If `true` it keeps the `syncing` subscription. + * @returns A promise to an array of subscription ids that were cleared. + * + * ```ts + * web3.eth.clearSubscriptions().then(console.log); + * > [...] An array of subscription ids that were cleared + * ``` + */ + public clearSubscriptions(notClearSyncing = false): Promise | undefined { + return this.subscriptionManager?.unsubscribe( + // eslint-disable-next-line + notClearSyncing ? Web3Eth.shouldClearSubscription : undefined, + ); + } +} diff --git a/packages/web3-eth/src/web3_subscriptions.ts b/packages/web3-eth/src/web3_subscriptions.ts new file mode 100644 index 00000000000..5838aa9ce2d --- /dev/null +++ b/packages/web3-eth/src/web3_subscriptions.ts @@ -0,0 +1,176 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable-next-line max-classes-per-file */ +import { format } from 'web3-utils'; + +import { + SyncOutput, + Address, + BlockNumberOrTag, + HexString, + Topic, + BlockHeaderOutput, + LogsOutput, +} from 'web3-types'; +import { Web3Subscription } from 'web3-core'; +import { blockHeaderSchema, logSchema, syncSchema } from './schemas.js'; + +/** + * ## subscribe('logs') + * Subscribes to incoming logs, filtered by the given options. If a valid numerical fromBlock options property is set, web3.js will retrieve logs beginning from this point, backfilling the response as necessary. + * + * You can subscribe to logs matching a given filter object, which can take the following parameters: + * - `fromBlock`: (optional, default: 'latest') Integer block number, or `'latest'` for the last mined block or `'pending'`, `'earliest'` for not yet mined transactions. + * - `address`: (optional) Contract address or a list of addresses from which logs should originate. + * - `topics`: (optional) Array of 32 Bytes DATA topics. Topics are order-dependent. Each topic can also be an array of DATA with `or` options. + * + */ +export class LogsSubscription extends Web3Subscription< + { + data: LogsOutput; + }, + { + readonly fromBlock?: BlockNumberOrTag; + readonly address?: Address | Address[]; + readonly topics?: Topic[]; + } +> { + protected _buildSubscriptionParams() { + return ['logs', this.args]; + } + + protected formatSubscriptionResult(data: LogsOutput) { + return format(logSchema, data, super.returnFormat); + } +} + +/** + * ## subscribe('pendingTransactions') + * Subscribes to incoming pending transactions. + * + * You can subscribe to pending transactions by calling web3.eth.subscribe('pendingTransactions'). + * @example + * ```ts + * (await web3.eth.subscribe('pendingTransactions')).on('data', console.log); + * ``` + */ +export class NewPendingTransactionsSubscription extends Web3Subscription<{ + data: HexString; +}> { + // eslint-disable-next-line + protected _buildSubscriptionParams() { + return ['newPendingTransactions']; + } + + protected formatSubscriptionResult(data: string) { + return format({ format: 'string' }, data, super.returnFormat); + } +} + +/** + * ## subscribe('newHeads') ( same as subscribe('newBlockHeaders')) + * + * Subscribes to incoming block headers. This can be used as timer to check for changes on the blockchain. + * + * The structure of a returned block header is {@link BlockHeaderOutput}: + * @example + * ```ts + * (await web3.eth.subscribe('newHeads')).on( // 'newBlockHeaders' would work as well + * 'data', + * console.log + * ); + * >{ + * parentHash: '0x9e746a1d906b299def98c75b06f714d62dacadd567c7515d76eeaa8c8074c738', + * sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + * miner: '0x0000000000000000000000000000000000000000', + * stateRoot: '0xe0f04b04861ecfa95e82a9310d6a7ef7aef8d7417f5209c182582bfb98a8e307', + * transactionsRoot: '0x31ab4ea571a9e10d3a19aaed07d190595b1dfa34e03960c04293fec565dea536', + * logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + * difficulty: 2n, + * number: 21n, + * gasLimit: 11738125n, + * gasUsed: 830006n, + * timestamp: 1678797237n, + * extraData: '0xd883010b02846765746888676f312e32302e31856c696e757800000000000000e0a6e93cf40e2e71a72e493272210c3f43738ccc7e7d7b14ffd51833797d896c09117e8dc4fbcbc969bd21b42e5af3e276a911524038c001b2109b63b8e0352601', + * nonce: 0n + * } + * ``` + */ +export class NewHeadsSubscription extends Web3Subscription<{ + data: BlockHeaderOutput; +}> { + // eslint-disable-next-line + protected _buildSubscriptionParams() { + return ['newHeads']; + } + + protected formatSubscriptionResult(data: BlockHeaderOutput): BlockHeaderOutput { + return format(blockHeaderSchema, data, super.returnFormat); + } +} + +/** + * ## subscribe('syncing') + * + * Subscribe to syncing events. This will return `true` when the node is syncing and when it’s finished syncing will return `false`, for the `changed` event. + * @example + * ```ts + * (await web3.eth.subscribe('syncing')).on('changed', console.log); + * > `true` // when syncing + * + * (await web3.eth.subscribe('syncing')).on('data', console.log); + * > { + * startingBlock: 0, + * currentBlock: 0, + * highestBlock: 0, + * pulledStates: 0, + * knownStates: 0 + * } + * ``` + */ +export class SyncingSubscription extends Web3Subscription<{ + data: SyncOutput; + changed: boolean; +}> { + // eslint-disable-next-line + protected _buildSubscriptionParams() { + return ['syncing']; + } + + public _processSubscriptionResult( + data: + | { + syncing: boolean; + status: SyncOutput; + } + | boolean, + ) { + if (typeof data === 'boolean') { + this.emit('changed', data); + } else { + const mappedData: SyncOutput = Object.fromEntries( + Object.entries(data.status).map(([key, value]) => [ + key.charAt(0).toLowerCase() + key.substring(1), + value, + ]), + ) as SyncOutput; + + this.emit('changed', data.syncing); + this.emit('data', format(syncSchema, mappedData, super.returnFormat)); + } + } +} diff --git a/packages/web3-eth/test/.eslintrc.js b/packages/web3-eth/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-eth/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-eth/test/config/jest.config.js b/packages/web3-eth/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-eth/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-eth/test/config/setup.js b/packages/web3-eth/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-eth/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-eth/test/e2e/accounts.json b/packages/web3-eth/test/e2e/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-eth/test/e2e/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-eth/test/e2e/e2e_utils.ts b/packages/web3-eth/test/e2e/e2e_utils.ts new file mode 100644 index 00000000000..ff9717a9370 --- /dev/null +++ b/packages/web3-eth/test/e2e/e2e_utils.ts @@ -0,0 +1,85 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * @NOTE This Util method is kept separate from shared system_test_utils.ts file because + * of it's import of .secrets.json. For this method to exist in shared system_test_utils.ts + * file, the import path would be ../.secrets.json which doesn't resolve when the file is + * copied over to each package's test directory. Because web3 package is the only package + * running these E2E tests that use Sepolia and Mainnet, this util exists here for now. + */ + +import { getSystemTestBackend, BACKEND } from '../fixtures/system_test_utils'; +// eslint-disable-next-line import/no-relative-packages +import secrets from '../../../../.secrets.json'; + +export const getSystemE2ETestProvider = (): string => { + if (process.env.WEB3_SYSTEM_TEST_MODE === 'http') { + return getSystemTestBackend() === BACKEND.SEPOLIA + ? process.env.INFURA_SEPOLIA_HTTP ?? secrets.SEPOLIA.HTTP + : process.env.INFURA_MAINNET_HTTP ?? secrets.MAINNET.HTTP; + } + return getSystemTestBackend() === BACKEND.SEPOLIA + ? process.env.INFURA_SEPOLIA_WS ?? secrets.SEPOLIA.WS + : process.env.INFURA_MAINNET_WS ?? secrets.MAINNET.WS; +}; + +export const getE2ETestAccountAddress = (): string => { + if (process.env.TEST_ACCOUNT_ADDRESS !== undefined) { + return process.env.TEST_ACCOUNT_ADDRESS; + // eslint-disable-next-line no-else-return + } else if (getSystemTestBackend() === BACKEND.SEPOLIA || getSystemTestBackend() === BACKEND.MAINNET) { + return secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'].ACCOUNT + .address; + } + + throw new Error('Unable to get test account address'); +}; + +export const getE2ETestContractAddress = () => + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'] + .DEPLOYED_TEST_CONTRACT_ADDRESS as string; + +export const getAllowedSendTransaction = (): boolean => { + if (process.env.ALLOWED_SEND_TRANSACTION !== undefined) { + // https://github.com/actions/runner/issues/1483 + if (process.env.ALLOWED_SEND_TRANSACTION === 'false') { + return false; + } + + return Boolean(process.env.ALLOWED_SEND_TRANSACTION); + // eslint-disable-next-line no-else-return + } else if (getSystemTestBackend() === BACKEND.SEPOLIA || getSystemTestBackend() === BACKEND.MAINNET) { + return secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'] + .ALLOWED_SEND_TRANSACTION; + } + + return false; +}; + +export const getE2ETestAccountPrivateKey = (): string => { + if (process.env.TEST_ACCOUNT_PRIVATE_KEY !== undefined) { + return process.env.TEST_ACCOUNT_PRIVATE_KEY; + // eslint-disable-next-line no-else-return + } else if (getSystemTestBackend() === BACKEND.SEPOLIA || getSystemTestBackend() === BACKEND.MAINNET) { + return secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'].ACCOUNT + .privateKey; + } + + throw new Error('Unable to get test account private key'); +}; diff --git a/packages/web3-eth/test/e2e/jest.config.js b/packages/web3-eth/test/e2e/jest.config.js new file mode 100644 index 00000000000..cc3c69f72ff --- /dev/null +++ b/packages/web3-eth/test/e2e/jest.config.js @@ -0,0 +1,36 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/e2e/setup.js'], + testMatch: [ + `/test/e2e/*.(spec|test).(js|ts)`, + `/test/e2e/${process.env.WEB3_SYSTEM_TEST_BACKEND}/**/*.(spec|test).(js|ts)`, + ], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: `.coverage/e2e/${process.env.WEB3_SYSTEM_TEST_BACKEND}`, +}; diff --git a/packages/web3-eth/test/e2e/setup.js b/packages/web3-eth/test/e2e/setup.js new file mode 100644 index 00000000000..fddbec59a1e --- /dev/null +++ b/packages/web3-eth/test/e2e/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 30000; // Sometimes `in3` takes long time because of its decentralized nature. + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth/test/e2e/subscription_new_heads.test.ts b/packages/web3-eth/test/e2e/subscription_new_heads.test.ts new file mode 100644 index 00000000000..01bb6b5fc4e --- /dev/null +++ b/packages/web3-eth/test/e2e/subscription_new_heads.test.ts @@ -0,0 +1,88 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import Web3, { BlockHeaderOutput } from 'web3'; + +import { + closeOpenConnection, + getSystemTestBackend, + itIf, + waitForOpenConnection, +} from '../fixtures/system_test_utils'; +import { getSystemE2ETestProvider } from './e2e_utils'; + +describe(`${getSystemTestBackend()} tests - subscription newHeads`, () => { + const provider = getSystemE2ETestProvider(); + const expectedNumberOfNewHeads = 1; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + itIf(provider.startsWith('ws'))( + `should subscribe to newHeads and receive ${expectedNumberOfNewHeads}`, + async () => { + const newHeadsSubscription = await web3.eth.subscribe('newHeads'); + + let numberOfNewHeadsReceived = 0; + + await waitForOpenConnection(web3.eth); + const assertionPromise = new Promise((resolve, reject) => { + newHeadsSubscription.on('data', (data: BlockHeaderOutput) => { + try { + expect(data).toMatchObject({ + hash: expect.any(String), + parentHash: expect.any(String), + receiptsRoot: expect.any(String), + miner: expect.any(String), + stateRoot: expect.any(String), + transactionsRoot: expect.any(String), + logsBloom: expect.any(String), + difficulty: expect.any(BigInt), + number: expect.any(BigInt), + gasLimit: expect.any(BigInt), + gasUsed: expect.any(BigInt), + timestamp: expect.any(BigInt), + extraData: expect.any(String), + nonce: expect.any(BigInt), + sha3Uncles: expect.any(String), + baseFeePerGas: expect.any(BigInt), + mixHash: expect.any(String), + withdrawalsRoot: expect.any(String), + }); + } catch (error) { + reject(error); + } + + numberOfNewHeadsReceived += 1; + if (numberOfNewHeadsReceived === expectedNumberOfNewHeads) resolve(undefined); + }); + + newHeadsSubscription.on('error', error => reject(error)); + }); + + await assertionPromise; + await web3.eth.subscriptionManager?.removeSubscription(newHeadsSubscription); + }, + ); +}); diff --git a/packages/web3-eth/test/fixtures/accounts.json b/packages/web3-eth/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-eth/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-eth/test/fixtures/decoding.ts b/packages/web3-eth/test/fixtures/decoding.ts new file mode 100644 index 00000000000..e548f33acc6 --- /dev/null +++ b/packages/web3-eth/test/fixtures/decoding.ts @@ -0,0 +1,263 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiEventFragment, LogsInput } from 'web3-types'; + +export const decodeEventABIData: [AbiEventFragment & { signature: string }, LogsInput, any][] = [ + [ + { + // unindexed event with some indexed + type: 'event', + inputs: [ + { name: 'a', type: 'string', indexed: true }, + { name: 'b', type: 'uint', indexed: false }, + { name: 'a', type: 'string', indexed: false }, + ], + name: 'EventNotAnonymous', + signature: '0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5', + }, + { + address: '', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + }, + { + address: '', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + returnValues: { + __length__: 0, + }, + event: 'EventNotAnonymous', + signature: undefined, + raw: { + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + }, + }, + ], + [ + { + // unindexed event + type: 'event', + inputs: [ + { name: 'a', type: 'string', indexed: false }, + { name: 'b', type: 'uint', indexed: false }, + { name: 'a', type: 'string', indexed: false }, + ], + name: 'EventNotAnonymous', + signature: '0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5', + }, + { + address: '', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + }, + { + address: '', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + returnValues: { + '0': 'a', + '1': BigInt(24), + '2': 'c', + __length__: 3, + a: 'c', + b: BigInt(24), + }, + event: 'EventNotAnonymous', + signature: '0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5', + raw: { + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + }, + }, + ], + [ + { + // all events + type: 'event', + name: 'allEvents', + signature: '', + }, + { + address: '', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + }, + { + address: '', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + returnValues: { + __length__: 0, + }, + event: undefined, + signature: undefined, + raw: { + data: '0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016300000000000000000000000000000000000000000000000000000000000000', + topics: ['0x7bbee60e68739c7319c204bae2f54caab4114edf476c64bfc5be98af25f446f5'], + }, + }, + ], + [ + { + // indexed event + type: 'event', + inputs: [{ name: 'a', type: 'uint256', indexed: true }], + name: 'EventIndexed', + signature: '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + }, + { + address: '', + topics: [ + '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + '0x000000000000000000000000000000000000000000000000000000000000007b', + ], + data: '', + }, + { + address: '', + topics: [ + '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + '0x000000000000000000000000000000000000000000000000000000000000007b', + ], + data: '', + returnValues: { '0': BigInt(123), __length__: 1, a: BigInt(123) }, + event: 'EventIndexed', + signature: '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + raw: { + data: '', + topics: [ + '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + '0x000000000000000000000000000000000000000000000000000000000000007b', + ], + }, + }, + ], + [ + { + // indexed all events + type: 'event', + inputs: [{ name: 'a', type: 'uint256', indexed: true }], + name: 'allEvents', + signature: '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + }, + { + address: '', + topics: [ + '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + '0x000000000000000000000000000000000000000000000000000000000000007b', + ], + data: '', + }, + { + address: '', + topics: [ + '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + '0x000000000000000000000000000000000000000000000000000000000000007b', + ], + data: '', + returnValues: { '0': BigInt(123), __length__: 1, a: BigInt(123) }, + event: undefined, + signature: '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + raw: { + data: '', + topics: [ + '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + '0x000000000000000000000000000000000000000000000000000000000000007b', + ], + }, + }, + ], + [ + { + // anonymous event + type: 'event', + inputs: [ + { name: 'a', type: 'string', indexed: false }, + { name: 'b', type: 'uint8', indexed: false }, + { name: 'c', type: 'uint256', indexed: false }, + ], + name: '', + signature: '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + anonymous: true, + }, + { + address: '', + topics: [], + data: '0x0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000002307800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000', + }, + { + address: '', + topics: [], + data: '0x0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000002307800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000', + returnValues: { + '0': '0x', + '1': BigInt(12), + '2': BigInt(192), + __length__: 3, + a: '0x', + b: BigInt(12), + c: BigInt(192), + }, + event: '', + signature: undefined, + raw: { + data: '0x0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000002307800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000', + topics: [], + }, + }, + ], + [ + { + // anonymous event without anonymous flag + type: 'event', + inputs: [ + { name: 'a', type: 'string', indexed: false }, + { name: 'b', type: 'uint8', indexed: false }, + { name: 'c', type: 'uint256', indexed: false }, + ], + name: '', + signature: '0xdd64d7f331676de21d95ea9f7eb8585b688f72afec29a51ff4502fd5a6ae19e7', + }, + { + address: '', + topics: [], + data: '0x0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000002307800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000', + }, + { + address: '', + topics: [], + data: '0x0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000002307800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000', + returnValues: { + '0': '0x', + '1': BigInt(12), + '2': BigInt(192), + __length__: 3, + a: '0x', + b: BigInt(12), + c: BigInt(192), + }, + event: '', + signature: undefined, + raw: { + data: '0x0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000002307800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000', + topics: [], + }, + }, + ], +]; diff --git a/packages/web3-eth/test/fixtures/detect_transaction_type.ts b/packages/web3-eth/test/fixtures/detect_transaction_type.ts new file mode 100644 index 00000000000..bd957462cfb --- /dev/null +++ b/packages/web3-eth/test/fixtures/detect_transaction_type.ts @@ -0,0 +1,391 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ETH_DATA_FORMAT, FormatType, Transaction } from 'web3-types'; + +export const transactionType0x0: FormatType[] = [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + { + to: '0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca', + nonce: '0x3B7', + gasPrice: '0x4617EE7C40', + from: '0x76D43E68c2aE1084B340f0eDC04C325DD341039B', + gas: '0x67B8BF', + value: '0x', + input: '0x', + chain: 'mainnet', + hardfork: 'london', + chainId: '0x1', + networkId: '0x1', + gasLimit: '0x67B8BF', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + hardfork: 'berlin', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + common: { + customChain: { + networkId: '0x42', + chainId: '0x42', + }, + hardfork: 'berlin', + }, + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + common: { + customChain: { + networkId: '0x42', + chainId: '0x42', + }, + hardfork: 'london', + }, + }, +]; + +export const transactionType0x1: FormatType[] = [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x1', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x1', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + accessList: [], + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + accessList: [], + }, +]; + +export const transactionType0x2: FormatType[] = [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + type: '0x2', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxFeePerGas: '0x1229298c00', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxPriorityFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + common: { + customChain: { + networkId: '0x42', + chainId: '0x42', + }, + hardfork: 'london', + }, + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + hardfork: 'london', + }, +]; + +export const transactionTypeUndefined: FormatType[] = [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + // @ts-expect-error Hardfork doesn't exist + hardfork: 'nonExistent', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + common: { + customChain: { + networkId: '0x42', + chainId: '0x42', + }, + // @ts-expect-error Hardfork doesn't exist + hardfork: 'nonExistent', + }, + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + }, +]; + +export const transactionTypeValidationError: FormatType[] = [ + // Invalid type 0x0 txs + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxPriorityFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + gasPrice: '0x12', + type: '0x0', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + type: '0x0', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + accessList: [], + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + type: '0x0', + }, + // Invalid type 0x1 txs + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxPriorityFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + gasPrice: '0x12', + type: '0x1', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + type: '0x1', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + type: '0x1', + accessList: [], + }, + // Invalid type 0x2 txs + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxPriorityFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + gasPrice: '0x12', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + gasPrice: '0x12', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + maxPriorityFeePerGas: '0x49504f80', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + gasPrice: '0x12', + type: '0x2', + }, + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + gasPrice: '0x123', + type: '0x2', + }, +]; diff --git a/packages/web3-eth/test/fixtures/erc20.ts b/packages/web3-eth/test/fixtures/erc20.ts new file mode 100644 index 00000000000..17ce176c7d8 --- /dev/null +++ b/packages/web3-eth/test/fixtures/erc20.ts @@ -0,0 +1,175 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const ERC20TokenAbi = [ + { + inputs: [{ internalType: 'uint256', name: 'initialSupply', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'constructor', + signature: '', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'spender', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + signature: '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'address', name: 'spender', type: 'address' }, + ], + name: 'allowance', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + signature: '0xdd62ed3e', + constant: true, + payable: false, + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'approve', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + signature: '0x095ea7b3', + constant: false, + payable: false, + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + signature: '0x70a08231', + constant: true, + payable: false, + }, + { + inputs: [], + name: 'decimals', + outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }], + stateMutability: 'view', + type: 'function', + signature: '0x313ce567', + constant: true, + payable: false, + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'subtractedValue', type: 'uint256' }, + ], + name: 'decreaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + signature: '0xa457c2d7', + constant: false, + payable: false, + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'addedValue', type: 'uint256' }, + ], + name: 'increaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + signature: '0x39509351', + constant: false, + payable: false, + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + signature: '0x06fdde03', + constant: true, + payable: false, + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + signature: '0x95d89b41', + constant: true, + payable: false, + }, + { + inputs: [], + name: 'totalSupply', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + signature: '0x18160ddd', + constant: true, + payable: false, + }, + { + inputs: [ + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + signature: '0xa9059cbb', + constant: false, + payable: false, + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + signature: '0x23b872dd', + constant: false, + payable: false, + }, +] as const; diff --git a/packages/web3-eth/test/fixtures/errors.ts b/packages/web3-eth/test/fixtures/errors.ts new file mode 100644 index 00000000000..c69551e24d5 --- /dev/null +++ b/packages/web3-eth/test/fixtures/errors.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const InvalidTransactionWithSenderData: [unknown, string][] = [ + [ + BigInt(9007199254740991), + 'Invalid value given "9007199254740991". Error: invalid transaction with invalid sender.', + ], + [ + 'Invalid data', + 'Invalid value given "Invalid data". Error: invalid transaction with invalid sender.', + ], + ['0x0', 'Invalid value given "0x0". Error: invalid transaction with invalid sender.'], + [0, 'Invalid value given "0". Error: invalid transaction with invalid sender.'], +]; + +export const InvalidTransactionCallData: [unknown, string][] = [ + [ + BigInt(9007199254740991), + 'Invalid value given "9007199254740991". Error: invalid transaction call', + ], + ['Invalid data', 'Invalid value given "Invalid data". Error: invalid transaction call'], + ['0x0', 'Invalid value given "0x0". Error: invalid transaction call'], + [0, 'Invalid value given "0". Error: invalid transaction call'], +]; diff --git a/packages/web3-eth/test/fixtures/example_subscription.ts b/packages/web3-eth/test/fixtures/example_subscription.ts new file mode 100644 index 00000000000..ceb1f101469 --- /dev/null +++ b/packages/web3-eth/test/fixtures/example_subscription.ts @@ -0,0 +1,28 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Subscription } from 'web3-core'; + +export class NewHeadsSubscription extends Web3Subscription< + { data: string }, + { param1: string }, + { eth_subscribe: (newHeads: string) => void } +> { + // eslint-disable-next-line class-methods-use-this + protected _buildSubscriptionParams() { + return ['newHeads']; + } +} diff --git a/packages/web3-eth/test/fixtures/format_transaction.ts b/packages/web3-eth/test/fixtures/format_transaction.ts new file mode 100644 index 00000000000..dc91dc7c823 --- /dev/null +++ b/packages/web3-eth/test/fixtures/format_transaction.ts @@ -0,0 +1,301 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { FormatType, Transaction, DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const bytesAsHexStringTransaction: FormatType< + Transaction, + { number: typeof DEFAULT_RETURN_FORMAT.number; bytes: FMT_BYTES.HEX } +> = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: BigInt('100000000000'), + gas: BigInt('21000'), + gasPrice: BigInt('20000000000'), + type: BigInt(0), + maxFeePerGas: BigInt('78000000000'), + maxPriorityFeePerGas: BigInt('1230000000'), + data: '0x', + nonce: BigInt(4), + chain: 'mainnet', + hardfork: 'berlin', + chainId: BigInt(1), + common: { + customChain: { + name: 'foo', + networkId: BigInt(4), + chainId: BigInt(66), + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: BigInt('21000'), + v: BigInt('37'), + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +export const bytesAsUint8ArrayTransaction: FormatType< + Transaction, + { number: typeof DEFAULT_RETURN_FORMAT.number; bytes: FMT_BYTES.UINT8ARRAY } +> = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: BigInt('100000000000'), + gas: BigInt('21000'), + gasPrice: BigInt('20000000000'), + type: BigInt('0'), + maxFeePerGas: BigInt('78000000000'), + maxPriorityFeePerGas: BigInt('1230000000'), + data: new Uint8Array(), + nonce: BigInt(4), + chain: 'mainnet', + hardfork: 'berlin', + chainId: BigInt(1), + common: { + customChain: { + name: 'foo', + networkId: BigInt(4), + chainId: BigInt(66), + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: BigInt('21000'), + v: BigInt('37'), + r: hexToBytes('0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d'), + s: hexToBytes('7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0'), +}; + +export const numbersAsHexStringTransaction: FormatType< + Transaction, + { number: FMT_NUMBER.HEX; bytes: typeof DEFAULT_RETURN_FORMAT.bytes } +> = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x42', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +export const numbersAsNumberTransaction: FormatType< + Transaction, + { number: FMT_NUMBER.NUMBER; bytes: typeof DEFAULT_RETURN_FORMAT.bytes } +> = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: 100000000000, + gas: 21000, + gasPrice: 20000000000, + type: 0, + maxFeePerGas: 78000000000, + maxPriorityFeePerGas: 1230000000, + data: '0x', + nonce: 4, + chain: 'mainnet', + hardfork: 'berlin', + chainId: 1, + common: { + customChain: { + name: 'foo', + networkId: 4, + chainId: 66, + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: 21000, + v: 37, + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +export const numbersAsStringTransaction: FormatType< + Transaction, + { number: FMT_NUMBER.STR; bytes: typeof DEFAULT_RETURN_FORMAT.bytes } +> = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '100000000000', + gas: '21000', + gasPrice: '20000000000', + type: '0', + maxFeePerGas: '78000000000', + maxPriorityFeePerGas: '1230000000', + data: '0x', + nonce: '4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '1', + common: { + customChain: { + name: 'foo', + networkId: '4', + chainId: '66', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '21000', + v: '37', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +export const numbersAsBigIntTransaction: FormatType< + Transaction, + { number: FMT_NUMBER.BIGINT; bytes: typeof DEFAULT_RETURN_FORMAT.bytes } +> = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: BigInt(100000000000), + gas: BigInt(21000), + gasPrice: BigInt(20000000000), + type: BigInt(0), + maxFeePerGas: BigInt(78000000000), + maxPriorityFeePerGas: BigInt(1230000000), + data: '0x', + nonce: BigInt(4), + chain: 'mainnet', + hardfork: 'berlin', + chainId: BigInt(1), + common: { + customChain: { + name: 'foo', + networkId: BigInt(4), + chainId: BigInt(66), + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: BigInt(21000), + v: BigInt(37), + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +const dummyTransaction: Transaction = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', +}; +export const validGetTransactionFromOrToAttrData: { input: any; output: any }[] = [ + { + input: { + role: 'from', + transaction: { + ...dummyTransaction, + from: '0x58422b64d0e95ab4e93a9d95b755d9b53545c9ef', + }, + }, + output: '0x58422b64d0e95ab4e93a9d95b755d9b53545c9ef', + }, +]; +export const invalidGetTransactionFromOrToAttrData: { input: any; output: any }[] = [ + { + input: { + role: 'from', + transaction: { + ...dummyTransaction, + from: '0x58422b64d0e95ab4e93a9d95b755d9b53545c9eff', + }, + }, + output: 'Invalid value given "0x58422b64d0e95ab4e93a9d95b755d9b53545c9eff". Error: invalid transaction with invalid sender', + }, + { + input: { + role: 'to', + transaction: { + ...dummyTransaction, + to: '0x58422b64d0e95ab4e93a9d95b755d9b53545c9eff', + }, + }, + output: 'Invalid value given "0x58422b64d0e95ab4e93a9d95b755d9b53545c9eff". Error: invalid transaction with invalid receiver', + }, + { + input: { + role: 'from', + transaction: { + ...dummyTransaction, + from: '0x1', + }, + }, + output: 'Invalid value given "0x1". Error: invalid transaction with invalid sender', + }, + { + input: { + role: 'from', + transaction: { + ...dummyTransaction, + from: 1, + }, + }, + output: 'Invalid value given "LocalWalletNotAvailableError". Error: Attempted to index account in local wallet, but no wallet is available.', + }, +]; + +export const invalidGetTransactionFromOrToAttrDataForWallet: { input: any; output: any }[] = [ + { + input: { + role: 'from', + transaction: { + ...dummyTransaction, + from: 1, + }, + }, + output: 'Invalid value given "LocalWalletNotAvailableError". Error: Attempted to index account in local wallet, but no wallet is available.', + }, + { + input: { + role: 'from', + transaction: { + ...dummyTransaction, + from: 10, + }, + }, + output: 'Invalid value given "LocalWalletNotAvailableError". Error: Attempted to index account in local wallet, but no wallet is available.', + }, +]; diff --git a/packages/web3-eth/test/fixtures/prepare_transaction_for_signing.ts b/packages/web3-eth/test/fixtures/prepare_transaction_for_signing.ts new file mode 100644 index 00000000000..dd03a74bcde --- /dev/null +++ b/packages/web3-eth/test/fixtures/prepare_transaction_for_signing.ts @@ -0,0 +1,898 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AccessList, Block, HexString, Common, Transaction } from 'web3-types'; + +export const preEip1559Block: Block = { + parentHash: '0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + miner: '0xbb7b8287f3f0a933474a79eae42cbca977791171', + stateRoot: '0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d', + transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + difficulty: '0x4ea3f27bc', + number: '0x1b4', + gasLimit: '0x1388', + gasUsed: '0x0', + timestamp: '0x55ba467c', + extraData: '0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32', + mixHash: '0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843', + nonce: '0x689056015818adbe', + totalDifficulty: '0x78ed983323d', + size: '0x220', + transactions: [], + uncles: [], + hash: '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', +}; +export const postEip1559Block: Block = { + parentHash: '0x28f49150e1fe6f245655925b290f59e707d1e5c646dadaa22937169433b30294', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + miner: '0x86864f1edf10eaf105b1bdc6e9aa8232b4c6aa00', + stateRoot: '0x116981b10423133ade5bd44f03c54cc3c57f4467a1c3d4b0c6d8d33a76c361ad', + transactionsRoot: '0x738f53f745d58169da93ebbd52cc49e0c979d6ca68a6513007b546b19ab78ba4', + receiptsRoot: '0xc97d4f9980d680053606318a5820261a1dccb556d1056b70f0d48fb384986be5', + logsBloom: + '0x4020001000000000000000008000010000000000400200000001002140000008000000010000810020000840000204304000081000000b00400010000822200004200020020140000001000882000064000021303200020000400008800000000002202102000084010000090020a8000800002000000010000030300000000000000006001005000040080001010000010040018100004c0050004000000000420000000021000200000010020008100000004000080000000000000040000900080102004002000080210201081014004030200148101000002020108025000018020020102040000204240500010000002200048000401300080088000002', + difficulty: '0x6cd6be3a', + number: '0xa0d600', + gasLimit: '0x1c9c381', + gasUsed: '0x8dc073', + timestamp: '0x60dc24ec', + extraData: '0x796f75747562652e636f6d2f77617463683f763d6451773477395767586351', + mixHash: '0xa29afb1fa1aea9eeac72ff435a8fc420bbc1fa1be08223eb61f294ee32250bde', + nonce: '0x122af1a5ccd78f3b', + totalDifficulty: '0x78828f2d886cbb', + size: '0x2042', + transactions: [], + uncles: [], + hash: '0x846880b1158f434884f3637802ed09bac77eafc35b5f03b881ac88ce38a54907', + baseFeePerGas: '0x7', +}; + +const common: Common = { + baseChain: 'mainnet', + customChain: { + name: 'custom-network', + networkId: 1, + chainId: 1, + }, + hardfork: 'istanbul', +}; +const commonBerlin: Common = { + baseChain: 'mainnet', + customChain: { + name: 'custom-network', + networkId: 1, + chainId: 1, + }, + hardfork: 'berlin', +}; +const commonLondon: Common = { + baseChain: 'mainnet', + customChain: { + name: 'custom-network', + networkId: 1, + chainId: 1, + }, + hardfork: 'london', +}; + +const accessList: AccessList = [ + { + address: '0x0000000000000000000000000000000000000101', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000000', + '0x00000000000000000000000000000000000000000000000000000000000060a7', + ], + }, +]; + +/** + * Array consists of: + * - pre/post EIP1559 block + * - transaction data + * - private key + * - RLP encoded signed transaction + * - v + * - r + * - s + * + * Each test runs with from specified, and without (will use private key to get from) + */ +export const validTransactions: [ + Block, + Transaction, + HexString, + HexString, + HexString, + HexString, + HexString, + HexString, + HexString, + HexString, +][] = [ + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '20000000000', + gas: 21000, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf868808504a817c80082520894f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008026a0afa02d193471bb974081585daabf8a751d4decbb519604ac7df612cc11e9226da04bf1bd55e82cebb2b09ed39bbffe35107ea611fa212c2d9a1f1ada4952077118', + '0xab0f71614c37231d71ae521ce188a9c7c9d5e976124a91f62f9f125348dd0326', + '0x2c7903a33b55caf582d170f21595f1a7e598df3fa61b103ea0cd9d6b2a92565d', + '0x26', + '0xafa02d193471bb974081585daabf8a751d4decbb519604ac7df612cc11e9226d', + '0x4bf1bd55e82cebb2b09ed39bbffe35107ea611fa212c2d9a1f1ada4952077118', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '20000000000', + gas: 21000, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '1000000000', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf868808504a817c80082520894f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008026a0afa02d193471bb974081585daabf8a751d4decbb519604ac7df612cc11e9226da04bf1bd55e82cebb2b09ed39bbffe35107ea611fa212c2d9a1f1ada4952077118', + '0xab0f71614c37231d71ae521ce188a9c7c9d5e976124a91f62f9f125348dd0326', + '0x2c7903a33b55caf582d170f21595f1a7e598df3fa61b103ea0cd9d6b2a92565d', + '0x26', + '0xafa02d193471bb974081585daabf8a751d4decbb519604ac7df612cc11e9226d', + '0x4bf1bd55e82cebb2b09ed39bbffe35107ea611fa212c2d9a1f1ada4952077118', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '1', + gas: 31853, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '0', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf85f8001827c6d94f0109fc8df283027b6285cc889f5aa624eac1f55808026a074dcecc6b8ad09ca09882ac1088eac145e799f56ea3f5b5fe8fcb52bbd3ea4f7a03d49e02af9c239b1b8aea8a7ac9162862dec03207f9f59bc38a4f2b9e42077a9', + '0xfe1f3da48513409d62210b76d3493190fed19e4d54f0aa4283715184bff68e0b', + '0xce07a6c829c9a7d0a11d5ce7120bfdae769b75ba2c20961a00738d540267a975', + '0x26', + '0x74dcecc6b8ad09ca09882ac1088eac145e799f56ea3f5b5fe8fcb52bbd3ea4f7', + '0x3d49e02af9c239b1b8aea8a7ac9162862dec03207f9f59bc38a4f2b9e42077a9', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '1', + gas: 31853, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '0', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf85f8001827c6d94f0109fc8df283027b6285cc889f5aa624eac1f55808026a074dcecc6b8ad09ca09882ac1088eac145e799f56ea3f5b5fe8fcb52bbd3ea4f7a03d49e02af9c239b1b8aea8a7ac9162862dec03207f9f59bc38a4f2b9e42077a9', + '0xfe1f3da48513409d62210b76d3493190fed19e4d54f0aa4283715184bff68e0b', + '0xce07a6c829c9a7d0a11d5ce7120bfdae769b75ba2c20961a00738d540267a975', + '0x26', + '0x74dcecc6b8ad09ca09882ac1088eac145e799f56ea3f5b5fe8fcb52bbd3ea4f7', + '0x3d49e02af9c239b1b8aea8a7ac9162862dec03207f9f59bc38a4f2b9e42077a9', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '234567897654321', + gas: 2000000, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428', + '0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60', + '0x6893a6ee8df79b0f5d64a180cd1ef35d030f3e296a5361cf04d02ce720d32ec5', + '0x25', + '0x9ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9c', + '0x440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '234567897654321', + gas: 2000000, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '1000000000', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428', + '0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60', + '0x6893a6ee8df79b0f5d64a180cd1ef35d030f3e296a5361cf04d02ce720d32ec5', + '0x25', + '0x9ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9c', + '0x440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '10', + gas: 31853, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '0', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf85f800a827c6d94f0109fc8df283027b6285cc889f5aa624eac1f55808025a03cbfff5b8ef4588b930ecbf9b85388795875edf814dfc6c71884f99b6d7555cca057142e729c1c83bfccb2785e629fc32dffb2e613df565e78e119aa4694cb1df9', + '0x247533e8b3d12185a871fca5503b7e86f2fecef4a43ded244d5c18ec6b6b057f', + '0xf5932468728558772f9422155ef1d7de7f8daf41542da16f1c1063cb98299953', + '0x25', + '0x3cbfff5b8ef4588b930ecbf9b85388795875edf814dfc6c71884f99b6d7555cc', + '0x57142e729c1c83bfccb2785e629fc32dffb2e613df565e78e119aa4694cb1df9', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '10', + gas: 31853, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '0', + input: '', + common, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0xf85f800a827c6d94f0109fc8df283027b6285cc889f5aa624eac1f55808025a03cbfff5b8ef4588b930ecbf9b85388795875edf814dfc6c71884f99b6d7555cca057142e729c1c83bfccb2785e629fc32dffb2e613df565e78e119aa4694cb1df9', + '0x247533e8b3d12185a871fca5503b7e86f2fecef4a43ded244d5c18ec6b6b057f', + '0xf5932468728558772f9422155ef1d7de7f8daf41542da16f1c1063cb98299953', + '0x25', + '0x3cbfff5b8ef4588b930ecbf9b85388795875edf814dfc6c71884f99b6d7555cc', + '0x57142e729c1c83bfccb2785e629fc32dffb2e613df565e78e119aa4694cb1df9', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '20000000000', + gas: 21000, + to: '0x3535353535353535353535353535353535353535', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf86c808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a04f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88da07e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + '0xda3be87732110de6c1354c83770aae630ede9ac308d9f7b399ecfba23d923384', + '0x7dbc5644b83abd32d014d170ba9bdc855c126328c0cb41af0ed6422bef0bb32e', + '0x25', + '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '20000000000', + gas: 21000, + to: '0x3535353535353535353535353535353535353535', + value: '1000000000000000000', + input: '', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf86c808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a04f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88da07e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + '0xda3be87732110de6c1354c83770aae630ede9ac308d9f7b399ecfba23d923384', + '0x7dbc5644b83abd32d014d170ba9bdc855c126328c0cb41af0ed6422bef0bb32e', + '0x25', + '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8708085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a031bb05bd1535150d312dcaa870a4a69c130a51aa80537659c1f308bf1f180ac6a012c938a8e04ac4e279d0b7c29811609031a96e949ad98f1ca74ca6078910bede', + '0xe86ab542020b3f386af1a1c79881d5db06f5fac58da79f697308f1d1e1799f2c', + '0x044d45bc28c2126e98c9cd0103a6559f5a92e01ecc201f48472f1e10a4c3ae27', + '0x26', + '0x31bb05bd1535150d312dcaa870a4a69c130a51aa80537659c1f308bf1f180ac6', + '0x12c938a8e04ac4e279d0b7c29811609031a96e949ad98f1ca74ca6078910bede', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8708085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a031bb05bd1535150d312dcaa870a4a69c130a51aa80537659c1f308bf1f180ac6a012c938a8e04ac4e279d0b7c29811609031a96e949ad98f1ca74ca6078910bede', + '0xe86ab542020b3f386af1a1c79881d5db06f5fac58da79f697308f1d1e1799f2c', + '0x044d45bc28c2126e98c9cd0103a6559f5a92e01ecc201f48472f1e10a4c3ae27', + '0x26', + '0x31bb05bd1535150d312dcaa870a4a69c130a51aa80537659c1f308bf1f180ac6', + '0x12c938a8e04ac4e279d0b7c29811609031a96e949ad98f1ca74ca6078910bede', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 10, + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + '0x42fb18cc20b10438c6b4bcb4f3fc777a72195caf3e8b6ddc671df4a249e84ba7', + '0xa75c245723fedf4b739771f5eeedeb3dc6ecd3b9ea79277a33dc5ab27be0c911', + '0x25', + '0x496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aa', + '0xc1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 10, + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + '0x42fb18cc20b10438c6b4bcb4f3fc777a72195caf3e8b6ddc671df4a249e84ba7', + '0xa75c245723fedf4b739771f5eeedeb3dc6ecd3b9ea79277a33dc5ab27be0c911', + '0x25', + '0x496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aa', + '0xc1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '0xa', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + '0x42fb18cc20b10438c6b4bcb4f3fc777a72195caf3e8b6ddc671df4a249e84ba7', + '0xa75c245723fedf4b739771f5eeedeb3dc6ecd3b9ea79277a33dc5ab27be0c911', + '0x25', + '0x496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aa', + '0xc1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '0xa', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + '0x42fb18cc20b10438c6b4bcb4f3fc777a72195caf3e8b6ddc671df4a249e84ba7', + '0xa75c245723fedf4b739771f5eeedeb3dc6ecd3b9ea79277a33dc5ab27be0c911', + '0x25', + '0x496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aa', + '0xc1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '16', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + '0xa2db7be5398c250e3ecf569c573f222255d46c509199ff649cca5e806edf5212', + '0x9c8c1fb88a95974c5ac75b6c58af2b5a62d9ccb9dffad7552a3182344bf37c27', + '0x25', + '0x4ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508', + '0x5c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '16', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + '0xa2db7be5398c250e3ecf569c573f222255d46c509199ff649cca5e806edf5212', + '0x9c8c1fb88a95974c5ac75b6c58af2b5a62d9ccb9dffad7552a3182344bf37c27', + '0x25', + '0x4ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508', + '0x5c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 16, + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + '0xa2db7be5398c250e3ecf569c573f222255d46c509199ff649cca5e806edf5212', + '0x9c8c1fb88a95974c5ac75b6c58af2b5a62d9ccb9dffad7552a3182344bf37c27', + '0x25', + '0x4ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508', + '0x5c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 16, + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + '0xa2db7be5398c250e3ecf569c573f222255d46c509199ff649cca5e806edf5212', + '0x9c8c1fb88a95974c5ac75b6c58af2b5a62d9ccb9dffad7552a3182344bf37c27', + '0x25', + '0x4ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508', + '0x5c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '0x16', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + '0x3135f97ac8d534b4b487cc2965fb1dcf427b92fd233577900dab3420e7afca13', + '0x77fd104f011a0085a9fa80f6f77cb213bce71fe8b4585d6fa9e3217117263a5b', + '0x26', + '0xe027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efb', + '0x51b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '0x16', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + '0x3135f97ac8d534b4b487cc2965fb1dcf427b92fd233577900dab3420e7afca13', + '0x77fd104f011a0085a9fa80f6f77cb213bce71fe8b4585d6fa9e3217117263a5b', + '0x26', + '0xe027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efb', + '0x51b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '0x16', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + '0x3135f97ac8d534b4b487cc2965fb1dcf427b92fd233577900dab3420e7afca13', + '0x77fd104f011a0085a9fa80f6f77cb213bce71fe8b4585d6fa9e3217117263a5b', + '0x26', + '0xe027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efb', + '0x51b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: '0x16', + gasPrice: '230000000000', + gas: 50000, + to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + value: '1000000000000000000', + input: '0x0123abcd', + common, + }, + '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', + '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + '0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + '0x3135f97ac8d534b4b487cc2965fb1dcf427b92fd233577900dab3420e7afca13', + '0x77fd104f011a0085a9fa80f6f77cb213bce71fe8b4585d6fa9e3217117263a5b', + '0x26', + '0xe027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efb', + '0x51b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '20000000000', + gas: 27200, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common: commonBerlin, + accessList, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x01f8c601808504a817c800826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080f85bf859940000000000000000000000000000000000000101f842a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000060a701a07a49fff8f639e42af36704b16e30fd95823d9ab7e71bf7c231e397dec2c5427ca0773bfdc5e911eedc0470325727426cff3c65329be4701005cd4ea620aacfa335', + '0xbac5b9b1d381034a2eaee9d574acaff42b39dc3bc236a6022928828bdb189b92', + '0x19920e15ec80c033dec688ccc2cb414144a0dac23f6f36f503390228cc4672eb', + '0x1', + '0x7a49fff8f639e42af36704b16e30fd95823d9ab7e71bf7c231e397dec2c5427c', + '0x773bfdc5e911eedc0470325727426cff3c65329be4701005cd4ea620aacfa335', + ], + [ + preEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '20000000000', + gas: 27200, + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '1000000000', + input: '', + common: commonBerlin, + accessList, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x01f8c601808504a817c800826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080f85bf859940000000000000000000000000000000000000101f842a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000060a701a07a49fff8f639e42af36704b16e30fd95823d9ab7e71bf7c231e397dec2c5427ca0773bfdc5e911eedc0470325727426cff3c65329be4701005cd4ea620aacfa335', + '0xbac5b9b1d381034a2eaee9d574acaff42b39dc3bc236a6022928828bdb189b92', + '0x19920e15ec80c033dec688ccc2cb414144a0dac23f6f36f503390228cc4672eb', + '0x1', + '0x7a49fff8f639e42af36704b16e30fd95823d9ab7e71bf7c231e397dec2c5427c', + '0x773bfdc5e911eedc0470325727426cff3c65329be4701005cd4ea620aacfa335', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '0x3B9ACA00', + gas: 27200, + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common: commonLondon, + accessList, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x01f8c50180843b9aca00826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080f85bf859940000000000000000000000000000000000000101f842a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000060a701a0cd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143a07bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + '0xb2d28b9d250189dfb5cd8c916833456f05b57f47567ac858786764689cb32c94', + '0x124b9f59e10f30ccf7c5b08ddb9484f5092b38f3a8d5fc0168b0e583dbd3d244', + '0x1', + '0xcd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143', + '0x7bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '0x3B9ACA00', + gas: 27200, + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '1000000000', + input: '', + common: commonLondon, + accessList, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x01f8c50180843b9aca00826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080f85bf859940000000000000000000000000000000000000101f842a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000060a701a0cd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143a07bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + '0xb2d28b9d250189dfb5cd8c916833456f05b57f47567ac858786764689cb32c94', + '0x124b9f59e10f30ccf7c5b08ddb9484f5092b38f3a8d5fc0168b0e583dbd3d244', + '0x1', + '0xcd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143', + '0x7bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + gas: 27200, + maxPriorityFeePerGas: '0x3B9ACA00', + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common: commonLondon, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x02f86e0180843b9aca00843b9aca0e826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080c080a0eb8ca6017e6926503ce11c404ba9b61f30d53ea934857e4f4489f43a6c189cf8a03655ba42b2fdcabdb3363cb39e7f672baa91455632e02bab27f92e1a275ca833', + '0x488a813f2286f7c015947aa13133bdae49ec75ae1c8f5eba80034d71a038dca8', + '0xcd6d6dee80ecc38f1b22f2d128bf6043dc41079fc913183a8995b5b3e187df61', + '0x0', + '0xeb8ca6017e6926503ce11c404ba9b61f30d53ea934857e4f4489f43a6c189cf8', + '0x3655ba42b2fdcabdb3363cb39e7f672baa91455632e02bab27f92e1a275ca833', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + maxPriorityFeePerGas: '0x3B9ACA00', + gas: 27200, + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '1000000000', + input: '', + common: commonLondon, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x02f86e0180843b9aca00843b9aca0e826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080c080a0eb8ca6017e6926503ce11c404ba9b61f30d53ea934857e4f4489f43a6c189cf8a03655ba42b2fdcabdb3363cb39e7f672baa91455632e02bab27f92e1a275ca833', + '0x488a813f2286f7c015947aa13133bdae49ec75ae1c8f5eba80034d71a038dca8', + '0xcd6d6dee80ecc38f1b22f2d128bf6043dc41079fc913183a8995b5b3e187df61', + '0x0', + '0xeb8ca6017e6926503ce11c404ba9b61f30d53ea934857e4f4489f43a6c189cf8', + '0x3655ba42b2fdcabdb3363cb39e7f672baa91455632e02bab27f92e1a275ca833', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + gas: 27200, + gasPrice: '0x3B9ACA00', + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common: commonLondon, + accessList, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x01f8c50180843b9aca00826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080f85bf859940000000000000000000000000000000000000101f842a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000060a701a0cd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143a07bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + '0xb2d28b9d250189dfb5cd8c916833456f05b57f47567ac858786764689cb32c94', + '0x124b9f59e10f30ccf7c5b08ddb9484f5092b38f3a8d5fc0168b0e583dbd3d244', + '0x1', + '0xcd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143', + '0x7bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + gasPrice: '0x3B9ACA00', + gas: 27200, + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '1000000000', + input: '', + common: commonLondon, + accessList, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x01f8c50180843b9aca00826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080f85bf859940000000000000000000000000000000000000101f842a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000060a701a0cd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143a07bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + '0xb2d28b9d250189dfb5cd8c916833456f05b57f47567ac858786764689cb32c94', + '0x124b9f59e10f30ccf7c5b08ddb9484f5092b38f3a8d5fc0168b0e583dbd3d244', + '0x1', + '0xcd7afd026299f679957b6f4d3be71e38c7724f32b123323d27e37c8ed6dba143', + '0x7bbf3c9ef4ea21a59d77dbad3509502f620dd98f21e66a11b9dc0cd9400b878d', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + maxPriorityFeePerGas: '0x3B9ACA00', + maxFeePerGas: '0xB2D05E00', + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common: commonLondon, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x02f86e0180843b9aca0084b2d05e00826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080c080a0d1290a118d51918c1ca17e3af0267c45efcd745cf42e78eabc444c424d6bcf37a003c81e1fda169575023a94200ee034128747f91020e704abaee30dbcfc785c36', + '0x82c19b39a6b7eaa0492863a8b236fad5018f267b4977c270ddd5228c4cbda60e', + '0xe3beea0918f445c21eb2f42e3cbc3c5d54321ec642f47d12c473b2765df97f2b', + '0x0', + '0xd1290a118d51918c1ca17e3af0267c45efcd745cf42e78eabc444c424d6bcf37', + '0x3c81e1fda169575023a94200ee034128747f91020e704abaee30dbcfc785c36', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + maxPriorityFeePerGas: '1000000000', + maxFeePerGas: '3000000000', + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + common: commonLondon, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x02f86e0180843b9aca0084b2d05e00826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080c080a0d1290a118d51918c1ca17e3af0267c45efcd745cf42e78eabc444c424d6bcf37a003c81e1fda169575023a94200ee034128747f91020e704abaee30dbcfc785c36', + '0x82c19b39a6b7eaa0492863a8b236fad5018f267b4977c270ddd5228c4cbda60e', + '0xe3beea0918f445c21eb2f42e3cbc3c5d54321ec642f47d12c473b2765df97f2b', + '0x0', + '0xd1290a118d51918c1ca17e3af0267c45efcd745cf42e78eabc444c424d6bcf37', + '0x3c81e1fda169575023a94200ee034128747f91020e704abaee30dbcfc785c36', + ], + [ + postEip1559Block, + { + chainId: 1, + nonce: 0, + maxPriorityFeePerGas: '1000000000', + maxFeePerGas: '3000000000', + gasLimit: '0x6A40', + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + value: '1000000000', + input: '', + common: commonLondon, + }, + '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', + '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + '0x02f86e0180843b9aca0084b2d05e00826a4094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca0080c080a0d1290a118d51918c1ca17e3af0267c45efcd745cf42e78eabc444c424d6bcf37a003c81e1fda169575023a94200ee034128747f91020e704abaee30dbcfc785c36', + '0x82c19b39a6b7eaa0492863a8b236fad5018f267b4977c270ddd5228c4cbda60e', + '0xe3beea0918f445c21eb2f42e3cbc3c5d54321ec642f47d12c473b2765df97f2b', + '0x0', + '0xd1290a118d51918c1ca17e3af0267c45efcd745cf42e78eabc444c424d6bcf37', + '0x3c81e1fda169575023a94200ee034128747f91020e704abaee30dbcfc785c36', + ], +]; diff --git a/packages/web3-eth/test/fixtures/rpc_methods_wrappers.ts b/packages/web3-eth/test/fixtures/rpc_methods_wrappers.ts new file mode 100644 index 00000000000..02f877d9988 --- /dev/null +++ b/packages/web3-eth/test/fixtures/rpc_methods_wrappers.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + DataFormat, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + Numbers, + Uint, + TransactionWithSenderAPI, +} from 'web3-types'; + +// Array consists of: returnType parameter, mock RPC result, expected output +export const getHashRateValidData: [DataFormat, Numbers, Numbers][] = [ + [DEFAULT_RETURN_FORMAT, '0x38a', '0x38a'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, '0x38a', '906'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, '0x38a', 906], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, '0x38a', BigInt('0x38a')], +]; + +// Array consists of: returnType parameter, mock RPC result, expected output +export const getGasPriceValidData: [DataFormat, any, any][] = [ + [DEFAULT_RETURN_FORMAT, '0x1dfd14000', '0x1dfd14000'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, '0x1dfd14000', '8049999872'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, '0x1dfd14000', 8049999872], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, '0x1dfd14000', BigInt('0x1dfd14000')], +]; + +// Array consists of: returnType parameter, mock RPC result, expected output +export const getBlockNumberValidData: [DataFormat, any, any][] = [ + [DEFAULT_RETURN_FORMAT, '0x4b7', '0x4b7'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, '0x4b7', '1207'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, '0x4b7', 1207], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, '0x4b7', BigInt('0x4b7')], +]; + +export const transactionWithSender: TransactionWithSenderAPI = { + to: '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + type: '0x0', + nonce: '0x1', + gas: '0xc350', + value: '0x1', + input: '0x0', + maxFeePerGas: '0x1475505aab', + maxPriorityFeePerGas: '0x7f324180', + accessList: [], + gasPrice: '0x4a817c800', + from: '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + chainId: '0x1', +}; + +export const getChainIdValidData: [DataFormat, Uint, Numbers][] = [ + [DEFAULT_RETURN_FORMAT, '0x3d', '0x3d'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, '0x3d', 61], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, '0x3d', '61'], + [{ ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, '0x3d', BigInt('0x3d')], +]; diff --git a/packages/web3-eth/test/fixtures/simple_revert.ts b/packages/web3-eth/test/fixtures/simple_revert.ts new file mode 100644 index 00000000000..4a942522678 --- /dev/null +++ b/packages/web3-eth/test/fixtures/simple_revert.ts @@ -0,0 +1,100 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const SimpleRevertAbi = [ + { + inputs: [], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + inputs: [], + name: 'ErrorWithNoParams', + type: 'error', + }, + { + inputs: [ + { + internalType: 'uint256', + name: 'code', + type: 'uint256', + }, + { + internalType: 'string', + name: 'message', + type: 'string', + }, + ], + name: 'ErrorWithParams', + type: 'error', + }, + { + inputs: [], + name: 'revertCall', + outputs: [], + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [], + name: 'revertErrorWithNoParams', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'revertErrorWithParams', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { + internalType: 'string', + name: 'revertString', + type: 'string', + }, + ], + name: 'revertSend', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +]; + +export const SimpleRevertBytecode = { + functionDebugData: { + '@_5': { + // eslint-disable-next-line no-null/no-null + entryPoint: null, + id: 5, + parameterSlots: 0, + returnSlots: 0, + }, + }, + generatedSources: [], + linkReferences: {}, + object: '608060405234801561001057600080fd5b50610639806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633ebf4d9c14610051578063819f48fe1461005b578063ba57a51114610065578063f38fb65b14610081575b600080fd5b61005961008b565b005b6100636100bd565b005b61007f600480360381019061007a919061031f565b6100fb565b005b61008961018a565b005b6040517f72090e4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a6040517fc85bda600000000000000000000000000000000000000000000000000000000081526004016100f29190610414565b60405180910390fd5b60405160200161010a90610499565b60405160208183030381529060405280519060200120816040516020016101319190610514565b6040516020818303038152906040528051906020012003610187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017e90610577565b60405180910390fd5b50565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bc906105e3565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022c826101e3565b810181811067ffffffffffffffff8211171561024b5761024a6101f4565b5b80604052505050565b600061025e6101c5565b905061026a8282610223565b919050565b600067ffffffffffffffff82111561028a576102896101f4565b5b610293826101e3565b9050602081019050919050565b82818337600083830152505050565b60006102c26102bd8461026f565b610254565b9050828152602081018484840111156102de576102dd6101de565b5b6102e98482856102a0565b509392505050565b600082601f830112610306576103056101d9565b5b81356103168482602086016102af565b91505092915050565b600060208284031215610335576103346101cf565b5b600082013567ffffffffffffffff811115610353576103526101d4565b5b61035f848285016102f1565b91505092915050565b6000819050919050565b6000819050919050565b6000819050919050565b60006103a161039c61039784610368565b61037c565b610372565b9050919050565b6103b181610386565b82525050565b600082825260208201905092915050565b7f5468697320697320616e206572726f72207769746820706172616d7300000000600082015250565b60006103fe601c836103b7565b9150610409826103c8565b602082019050919050565b600060408201905061042960008301846103a8565b818103602083015261043a816103f1565b905092915050565b600081905092915050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b6000610483600683610442565b915061048e8261044d565b600682019050919050565b60006104a482610476565b9150819050919050565b600081519050919050565b60005b838110156104d75780820151818401526020810190506104bc565b60008484015250505050565b60006104ee826104ae565b6104f88185610442565b93506105088185602086016104b9565b80840191505092915050565b600061052082846104e3565b915081905092915050565b7f5468697320697320612073656e64207265766572740000000000000000000000600082015250565b60006105616015836103b7565b915061056c8261052b565b602082019050919050565b6000602082019050818103600083015261059081610554565b9050919050565b7f5468697320697320612063616c6c207265766572740000000000000000000000600082015250565b60006105cd6015836103b7565b91506105d882610597565b602082019050919050565b600060208201905081810360008301526105fc816105c0565b905091905056fea2646970667358221220b588b01905b37b3ca19aa18f84e1211506d00be5ba2a3d089b964cf0698b3ee564736f6c63430008110033', + opcodes: + 'PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x639 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3EBF4D9C EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x819F48FE EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0xBA57A511 EQ PUSH2 0x65 JUMPI DUP1 PUSH4 0xF38FB65B EQ PUSH2 0x81 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x8B JUMP JUMPDEST STOP JUMPDEST PUSH2 0x63 PUSH2 0xBD JUMP JUMPDEST STOP JUMPDEST PUSH2 0x7F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x7A SWAP2 SWAP1 PUSH2 0x31F JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x89 PUSH2 0x18A JUMP JUMPDEST STOP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x72090E4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2A PUSH1 0x40 MLOAD PUSH32 0xC85BDA6000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF2 SWAP2 SWAP1 PUSH2 0x414 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x10A SWAP1 PUSH2 0x499 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x131 SWAP2 SWAP1 PUSH2 0x514 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SUB PUSH2 0x187 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x17E SWAP1 PUSH2 0x577 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BC SWAP1 PUSH2 0x5E3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x22C DUP3 PUSH2 0x1E3 JUMP JUMPDEST DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0x24B JUMPI PUSH2 0x24A PUSH2 0x1F4 JUMP JUMPDEST JUMPDEST DUP1 PUSH1 0x40 MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x25E PUSH2 0x1C5 JUMP JUMPDEST SWAP1 POP PUSH2 0x26A DUP3 DUP3 PUSH2 0x223 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x28A JUMPI PUSH2 0x289 PUSH2 0x1F4 JUMP JUMPDEST JUMPDEST PUSH2 0x293 DUP3 PUSH2 0x1E3 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY PUSH1 0x0 DUP4 DUP4 ADD MSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C2 PUSH2 0x2BD DUP5 PUSH2 0x26F JUMP JUMPDEST PUSH2 0x254 JUMP JUMPDEST SWAP1 POP DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP5 DUP5 DUP5 ADD GT ISZERO PUSH2 0x2DE JUMPI PUSH2 0x2DD PUSH2 0x1DE JUMP JUMPDEST JUMPDEST PUSH2 0x2E9 DUP5 DUP3 DUP6 PUSH2 0x2A0 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x306 JUMPI PUSH2 0x305 PUSH2 0x1D9 JUMP JUMPDEST JUMPDEST DUP2 CALLDATALOAD PUSH2 0x316 DUP5 DUP3 PUSH1 0x20 DUP7 ADD PUSH2 0x2AF JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x335 JUMPI PUSH2 0x334 PUSH2 0x1CF JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x353 JUMPI PUSH2 0x352 PUSH2 0x1D4 JUMP JUMPDEST JUMPDEST PUSH2 0x35F DUP5 DUP3 DUP6 ADD PUSH2 0x2F1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A1 PUSH2 0x39C PUSH2 0x397 DUP5 PUSH2 0x368 JUMP JUMPDEST PUSH2 0x37C JUMP JUMPDEST PUSH2 0x372 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x3B1 DUP2 PUSH2 0x386 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x5468697320697320616E206572726F72207769746820706172616D7300000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3FE PUSH1 0x1C DUP4 PUSH2 0x3B7 JUMP JUMPDEST SWAP2 POP PUSH2 0x409 DUP3 PUSH2 0x3C8 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x429 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x3A8 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x43A DUP2 PUSH2 0x3F1 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x7265766572740000000000000000000000000000000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x483 PUSH1 0x6 DUP4 PUSH2 0x442 JUMP JUMPDEST SWAP2 POP PUSH2 0x48E DUP3 PUSH2 0x44D JUMP JUMPDEST PUSH1 0x6 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4A4 DUP3 PUSH2 0x476 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4D7 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x4BC JUMP JUMPDEST PUSH1 0x0 DUP5 DUP5 ADD MSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4EE DUP3 PUSH2 0x4AE JUMP JUMPDEST PUSH2 0x4F8 DUP2 DUP6 PUSH2 0x442 JUMP JUMPDEST SWAP4 POP PUSH2 0x508 DUP2 DUP6 PUSH1 0x20 DUP7 ADD PUSH2 0x4B9 JUMP JUMPDEST DUP1 DUP5 ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x520 DUP3 DUP5 PUSH2 0x4E3 JUMP JUMPDEST SWAP2 POP DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x5468697320697320612073656E64207265766572740000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 PUSH1 0x15 DUP4 PUSH2 0x3B7 JUMP JUMPDEST SWAP2 POP PUSH2 0x56C DUP3 PUSH2 0x52B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x590 DUP2 PUSH2 0x554 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x5468697320697320612063616C6C207265766572740000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5CD PUSH1 0x15 DUP4 PUSH2 0x3B7 JUMP JUMPDEST SWAP2 POP PUSH2 0x5D8 DUP3 PUSH2 0x597 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x5FC DUP2 PUSH2 0x5C0 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB5 DUP9 0xB0 NOT SDIV 0xB3 PUSH28 0x3CA19AA18F84E1211506D00BE5BA2A3D089B964CF0698B3EE564736F PUSH13 0x63430008110033000000000000 ', + sourceMap: '59:575:0:-:0;;;87:16;;;;;;;;;;59:575;;;;;;', +}; + +export const SimpleRevertDeploymentData = + '0x608060405234801561001057600080fd5b50610639806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80633ebf4d9c14610051578063819f48fe1461005b578063ba57a51114610065578063f38fb65b14610081575b600080fd5b61005961008b565b005b6100636100bd565b005b61007f600480360381019061007a919061031f565b6100fb565b005b61008961018a565b005b6040517f72090e4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602a6040517fc85bda600000000000000000000000000000000000000000000000000000000081526004016100f29190610414565b60405180910390fd5b60405160200161010a90610499565b60405160208183030381529060405280519060200120816040516020016101319190610514565b6040516020818303038152906040528051906020012003610187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017e90610577565b60405180910390fd5b50565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bc906105e3565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022c826101e3565b810181811067ffffffffffffffff8211171561024b5761024a6101f4565b5b80604052505050565b600061025e6101c5565b905061026a8282610223565b919050565b600067ffffffffffffffff82111561028a576102896101f4565b5b610293826101e3565b9050602081019050919050565b82818337600083830152505050565b60006102c26102bd8461026f565b610254565b9050828152602081018484840111156102de576102dd6101de565b5b6102e98482856102a0565b509392505050565b600082601f830112610306576103056101d9565b5b81356103168482602086016102af565b91505092915050565b600060208284031215610335576103346101cf565b5b600082013567ffffffffffffffff811115610353576103526101d4565b5b61035f848285016102f1565b91505092915050565b6000819050919050565b6000819050919050565b6000819050919050565b60006103a161039c61039784610368565b61037c565b610372565b9050919050565b6103b181610386565b82525050565b600082825260208201905092915050565b7f5468697320697320616e206572726f72207769746820706172616d7300000000600082015250565b60006103fe601c836103b7565b9150610409826103c8565b602082019050919050565b600060408201905061042960008301846103a8565b818103602083015261043a816103f1565b905092915050565b600081905092915050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b6000610483600683610442565b915061048e8261044d565b600682019050919050565b60006104a482610476565b9150819050919050565b600081519050919050565b60005b838110156104d75780820151818401526020810190506104bc565b60008484015250505050565b60006104ee826104ae565b6104f88185610442565b93506105088185602086016104b9565b80840191505092915050565b600061052082846104e3565b915081905092915050565b7f5468697320697320612073656e64207265766572740000000000000000000000600082015250565b60006105616015836103b7565b915061056c8261052b565b602082019050919050565b6000602082019050818103600083015261059081610554565b9050919050565b7f5468697320697320612063616c6c207265766572740000000000000000000000600082015250565b60006105cd6015836103b7565b91506105d882610597565b602082019050919050565b600060208201905081810360008301526105fc816105c0565b905091905056fea2646970667358221220b588b01905b37b3ca19aa18f84e1211506d00be5ba2a3d089b964cf0698b3ee564736f6c63430008110033'; diff --git a/packages/web3-eth/test/fixtures/system_test_utils.ts b/packages/web3-eth/test/fixtures/system_test_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-eth/test/fixtures/system_test_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-eth/test/fixtures/validate_transaction_for_signing.ts b/packages/web3-eth/test/fixtures/validate_transaction_for_signing.ts new file mode 100644 index 00000000000..f22d5ac60cc --- /dev/null +++ b/packages/web3-eth/test/fixtures/validate_transaction_for_signing.ts @@ -0,0 +1,899 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Transaction, FMT_BYTES, FMT_NUMBER, FormatType } from 'web3-types'; +import { + ChainIdMismatchError, + CommonOrChainAndHardforkError, + Eip1559GasPriceError, + InvalidGasOrGasPrice, + InvalidMaxPriorityFeePerGasOrMaxFeePerGas, + InvalidNonceOrChainIdError, + MissingChainOrHardforkError, + MissingCustomChainError, + MissingCustomChainIdError, + MissingGasError, + TransactionGasMismatchError, + UnsupportedFeeMarketError, +} from 'web3-errors'; + +// eslint-disable-next-line @typescript-eslint/no-empty-function +export const invalidTransactionObject: any[] = ['42', false, '0x0', BigInt(42), () => {}]; + +export const validateCustomChainInfoData: [ + FormatType | any, + undefined | MissingCustomChainError | MissingCustomChainIdError | ChainIdMismatchError, +][] = [ + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + common: { + customChain: { + networkId: '0x4', + chainId: '0x1', + }, + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + common: {}, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingCustomChainError(), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + common: { + customChain: { + networkId: '0x4', + }, + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingCustomChainIdError(), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + common: { + customChain: { + networkId: '0x4', + chainId: '0x42', + }, + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new ChainIdMismatchError({ txChainId: '0x1', customChainId: '0x42' }), + ], +]; + +export const validateChainInfoData: [ + FormatType | any, + undefined | CommonOrChainAndHardforkError | MissingChainOrHardforkError, +][] = [ + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + chain: 'mainnet', + hardfork: 'berlin', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new CommonOrChainAndHardforkError(), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + chain: 'mainnet', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingChainOrHardforkError({ + chain: 'mainnet', + hardfork: undefined, + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + hardfork: 'berlin', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingChainOrHardforkError({ + chain: undefined, + hardfork: 'berlin', + }), + ], +]; + +export const validateGasData: [ + FormatType | any, + ( + | undefined + | MissingGasError + | InvalidGasOrGasPrice + | InvalidMaxPriorityFeePerGasOrMaxFeePerGas + | Eip1559GasPriceError + | UnsupportedFeeMarketError + ), +][] = [ + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingGasError({ + gas: undefined, + gasPrice: undefined, + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingGasError({ + gas: '0x5208', + gasPrice: undefined, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingGasError({ + gas: '0x5208', + gasPrice: undefined, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '-0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidGasOrGasPrice({ gas: '-0x5208', gasPrice: '0x4a817c800' }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '-0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidGasOrGasPrice({ gas: '0x5208', gasPrice: '-0x4a817c800' }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + maxFeePerGas: '0x1229298c00', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingGasError({ + gas: '0x5208', + gasPrice: undefined, + maxPriorityFeePerGas: undefined, + maxFeePerGas: '0x1229298c00', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + maxPriorityFeePerGas: '0x49504f80', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new MissingGasError({ + gas: '0x5208', + gasPrice: undefined, + maxPriorityFeePerGas: '0x49504f80', + maxFeePerGas: undefined, + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new TransactionGasMismatchError({ + gas: '0x5208', + gasPrice: '0x4a817c800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new TransactionGasMismatchError({ + gas: '0x5208', + gasPrice: '0x4a817c800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + maxFeePerGas: '-0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidMaxPriorityFeePerGasOrMaxFeePerGas({ + maxPriorityFeePerGas: '0x49504f80', + maxFeePerGas: '-0x1229298c00', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '-0x49504f80', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidMaxPriorityFeePerGasOrMaxFeePerGas({ + maxPriorityFeePerGas: '-0x49504f80', + maxFeePerGas: '0x1229298c00', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x2', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new Eip1559GasPriceError('0x4a817c800'), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new UnsupportedFeeMarketError({ + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + type: '0x1', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new UnsupportedFeeMarketError({ + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + maxPriorityFeePerGas: '0x49504f80', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new UnsupportedFeeMarketError({ + maxFeePerGas: undefined, + maxPriorityFeePerGas: '0x49504f80', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + maxFeePerGas: '0x1229298c00', + type: '0x0', + data: '0x0', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new UnsupportedFeeMarketError({ + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: undefined, + }), + ], +]; + +export const invalidNonceOrChainIdData: [ + FormatType | any, + undefined | InvalidNonceOrChainIdError, +][] = [ + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + undefined, + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + chainId: '0x1', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidNonceOrChainIdError({ + nonce: undefined, + chainId: '0x1', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidNonceOrChainIdError({ + nonce: '0x4', + chainId: undefined, + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '-0x4', + chainId: '0x1', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidNonceOrChainIdError({ + nonce: '-0x4', + chainId: '0x1', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '-0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidNonceOrChainIdError({ + nonce: '0x4', + chainId: '-0x1', + }), + ], + [ + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + data: '0x0', + nonce: '0x4', + chainId: '-0x1', + common: { + customChain: { + name: 'foo', + networkId: '0x4', + chainId: '-0x1', + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', + }, + new InvalidNonceOrChainIdError({ + nonce: '0x4', + chainId: '-0x1', + }), + ], +]; diff --git a/packages/web3-eth/test/fixtures/validation.ts b/packages/web3-eth/test/fixtures/validation.ts new file mode 100644 index 00000000000..115e198ae1f --- /dev/null +++ b/packages/web3-eth/test/fixtures/validation.ts @@ -0,0 +1,182 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + AccessList, + AccessListEntry, + BaseTransactionAPI, + Transaction1559UnsignedAPI, + Transaction2930UnsignedAPI, + TransactionLegacyUnsignedAPI, + TransactionCall, + TransactionWithSenderAPI, +} from 'web3-types'; +import { InvalidTransactionCall, InvalidTransactionWithSender } from 'web3-errors'; + +export const isBaseTransactionValidData: [BaseTransactionAPI, true][] = [ + [ + { + type: '0x0', + nonce: '0x0', + gas: '0x5208', + value: '0x1', + input: '0x0', + chainId: '0x1', + }, + true, + ], + [ + { + to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + type: '0x1', + nonce: '0x1', + gas: '0x5208', + value: '0x1', + input: '0x1', + }, + true, + ], +]; + +export const isAccessListEntryValidData: [AccessListEntry, true][] = [ + [{}, true], + [ + { + address: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + }, + true, + ], + [ + { + storageKeys: [ + '0x22f30f0608f88c510de0016370f1525b330e5839026bdff93f9ceef24d2275e6', + '0x63a01bba0d4f0ad913a241aed52f5c55807be35f554536abd1e451d4e6515b29', + ], + }, + true, + ], + [ + { + address: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + storageKeys: [ + '0x22f30f0608f88c510de0016370f1525b330e5839026bdff93f9ceef24d2275e6', + '0x63a01bba0d4f0ad913a241aed52f5c55807be35f554536abd1e451d4e6515b29', + ], + }, + true, + ], +]; + +export const isAccessListValidData = (): [AccessList, true][] => [ + [isAccessListEntryValidData.map(entry => entry[0]), true], +]; + +export const isTransaction1559UnsignedValidData = (): [Transaction1559UnsignedAPI, true][] => + isBaseTransactionValidData.map(transaction => { + return [ + { + ...transaction[0], + maxFeePerGas: '0x1', + gasPrice: '0x1', + maxPriorityFeePerGas: '0x1', + accessList: [], + }, + true, + ]; + }); + +export const isTransactionLegacyUnsignedValidData = (): [TransactionLegacyUnsignedAPI, true][] => + isBaseTransactionValidData.map(transaction => { + return [ + { + ...transaction[0], + gasPrice: '0x1', + }, + true, + ]; + }); + +export const isTransaction2930UnsignedValidData = (): [Transaction2930UnsignedAPI, true][] => + isTransactionLegacyUnsignedValidData().map(transaction => { + return [ + { + ...transaction[0], + accessList: [], + }, + true, + ]; + }); + +export const isTransactionWithSenderValidData = (): [TransactionWithSenderAPI, true][] => { + const transactions = [ + ...isTransaction1559UnsignedValidData(), + ...isTransactionLegacyUnsignedValidData(), + ...isTransaction2930UnsignedValidData(), + ]; + return transactions.map(transaction => { + return [ + { + ...transaction[0], + from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + }, + true, + ]; + }); +}; + +export const validateTransactionWithSenderInvalidData = (): [ + any, + InvalidTransactionWithSender, +][] => { + const transactions = [ + ...isTransaction1559UnsignedValidData(), + ...isTransactionLegacyUnsignedValidData(), + ...isTransaction2930UnsignedValidData(), + ]; + return transactions.map(transaction => { + return [transaction[0], new InvalidTransactionWithSender(transaction[0])]; + }); +}; + +export const isTransactionCallValidData: [TransactionCall, true][] = [ + [{ to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4' }, true], + [ + { + from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + gas: '0x5208', + value: '0x1', + }, + true, + ], + [ + { + from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + to: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + gas: '0x5208', + gasPrice: '0x5208', + value: '0x1', + data: '0x0', + }, + true, + ], +]; + +export const validateTransactionCallInvalidData = (): [any, InvalidTransactionCall][] => + validateTransactionWithSenderInvalidData().map(transaction => { + return [transaction[0], new InvalidTransactionCall(transaction[0])]; + }); diff --git a/packages/web3-eth/test/fixtures/web3_eth_methods_with_parameters.ts b/packages/web3-eth/test/fixtures/web3_eth_methods_with_parameters.ts new file mode 100644 index 00000000000..17d9c204f21 --- /dev/null +++ b/packages/web3-eth/test/fixtures/web3_eth_methods_with_parameters.ts @@ -0,0 +1,2304 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + DataFormat, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + Address, + BlockNumberOrTag, + BlockTags, + Filter, + HexString32Bytes, + HexString8Bytes, + HexStringBytes, + Uint, + Uint256, + TransactionWithSenderAPI, + TransactionReceipt, +} from 'web3-types'; +import { transactionWithSender } from './rpc_methods_wrappers'; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getBalanceValidData: [ + [Address, BlockNumberOrTag | undefined, DataFormat | undefined], + [Address, BlockNumberOrTag, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', undefined, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + // Defined blockNumber, undefined returnType + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + // Undefined blockNumber, returnType = DEFAULT_RETURN_FORMAT + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', undefined, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + // Defined blockNumber, returnType = DEFAULT_RETURN_FORMAT + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x4b7', DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x4b7', DEFAULT_RETURN_FORMAT], + ], + // Undefined blockNumber, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + undefined, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + // Defined blockNumber, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x4b7', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x4b7', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + // Undefined blockNumber, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + undefined, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + // Defined blockNumber, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x4b7', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x4b7', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + // Undefined blockNumber, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + undefined, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + // Defined blockNumber, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x4b7', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x4b7', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getBlockValidData: [ + [HexString32Bytes | BlockNumberOrTag | undefined, boolean | undefined, DataFormat | undefined], + [HexString32Bytes | BlockNumberOrTag, boolean, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + [undefined, undefined, undefined], + [BlockTags.LATEST, false, DEFAULT_RETURN_FORMAT], + ], + // Defined block, undefined hydrated and returnType + [ + [ + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + undefined, + undefined, + ], + [ + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + false, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [BlockTags.LATEST, undefined, undefined], + [BlockTags.LATEST, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, undefined, undefined], + [BlockTags.EARLIEST, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, undefined, undefined], + [BlockTags.SAFE, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, undefined, undefined], + [BlockTags.FINALIZED, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, undefined, undefined], + [BlockTags.PENDING, false, DEFAULT_RETURN_FORMAT], + ], + // Defined block, hydrated = true, and undefined returnType + [ + [BlockTags.LATEST, true, undefined], + [BlockTags.LATEST, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, true, undefined], + [BlockTags.EARLIEST, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, true, undefined], + [BlockTags.PENDING, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, true, undefined], + [BlockTags.SAFE, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, true, undefined], + [BlockTags.FINALIZED, true, DEFAULT_RETURN_FORMAT], + ], + // Defined block, hydrated = false, and undefined returnType + [ + [BlockTags.LATEST, false, undefined], + [BlockTags.LATEST, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, false, undefined], + [BlockTags.EARLIEST, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, false, undefined], + [BlockTags.PENDING, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, false, undefined], + [BlockTags.SAFE, false, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, false, undefined], + [BlockTags.FINALIZED, false, DEFAULT_RETURN_FORMAT], + ], + // Defined block, hydrated = true, and returnType = DEFAULT_RETURN_FORMAT + [ + [BlockTags.LATEST, true, DEFAULT_RETURN_FORMAT], + [BlockTags.LATEST, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, true, DEFAULT_RETURN_FORMAT], + [BlockTags.EARLIEST, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, true, DEFAULT_RETURN_FORMAT], + [BlockTags.PENDING, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, true, DEFAULT_RETURN_FORMAT], + [BlockTags.SAFE, true, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, true, DEFAULT_RETURN_FORMAT], + [BlockTags.FINALIZED, true, DEFAULT_RETURN_FORMAT], + ], + // Defined block, hydrated = true, and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [BlockTags.LATEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.LATEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.EARLIEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.EARLIEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.PENDING, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.PENDING, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.SAFE, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.SAFE, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.FINALIZED, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.FINALIZED, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + // Defined block, hydrated = true, and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [BlockTags.LATEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.LATEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.EARLIEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.EARLIEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.PENDING, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.PENDING, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.SAFE, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.SAFE, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.FINALIZED, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.FINALIZED, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + // Defined block, hydrated = true, and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [BlockTags.LATEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.LATEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.EARLIEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.EARLIEST, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.PENDING, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.PENDING, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.SAFE, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.SAFE, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.FINALIZED, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.FINALIZED, true, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getBlockTransactionCountValidData: [ + [HexString32Bytes | BlockNumberOrTag | undefined, DataFormat | undefined], + [HexString32Bytes | BlockNumberOrTag, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + [undefined, undefined], + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + // Defined block, undefined returnType + [ + ['0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', undefined], + [ + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [BlockTags.LATEST, undefined], + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, undefined], + [BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, undefined], + [BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, undefined], + [BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, undefined], + [BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + // Defined block and returnType = DEFAULT_RETURN_FORMAT + [ + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + [BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + [BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + [BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + [BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + // Defined block and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.SAFE, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.SAFE, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.FINALIZED, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.FINALIZED, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + // Defined block, hydrated = true, and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + // Defined block and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.SAFE, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.SAFE, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.FINALIZED, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.FINALIZED, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getBlockUncleCountValidData: [ + [HexString32Bytes | BlockNumberOrTag | undefined, DataFormat | undefined], + [HexString32Bytes | BlockNumberOrTag, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + [undefined, undefined], + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + // Defined block, undefined returnType + [ + ['0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', undefined], + [ + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [BlockTags.LATEST, undefined], + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, undefined], + [BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, undefined], + [BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, undefined], + [BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, undefined], + [BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + // Defined block and returnType = DEFAULT_RETURN_FORMAT + [ + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + [BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + [BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + [BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + // Defined block and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + // Defined block, hydrated = true, and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.SAFE, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.SAFE, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.FINALIZED, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.FINALIZED, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + // Defined block and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.LATEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.EARLIEST, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.PENDING, { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getUncleValidData: [ + [HexString32Bytes | BlockNumberOrTag | undefined, Uint, DataFormat | undefined], + [HexString32Bytes | BlockNumberOrTag, Uint, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + [undefined, '0x0', undefined], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = '0x0', and undefined returnType + [ + ['0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', '0x0', undefined], + [ + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + '0x0', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [BlockTags.LATEST, '0x0', undefined], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, '0x0', undefined], + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, '0x0', undefined], + [BlockTags.SAFE, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, '0x0', undefined], + [BlockTags.FINALIZED, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, '0x0', undefined], + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = '0x0', and undefined returnType + [ + [BlockTags.LATEST, '0x0', undefined], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, '0x0', undefined], + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, '0x0', undefined], + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = true, and returnType = DEFAULT_RETURN_FORMAT + [ + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = '0x0', and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + // Defined block, uncleIndex = '0x0', and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + // Defined block, uncleIndex = '0x0', and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - mock RPC result + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + * - expected output + */ +export const getTransactionValidData: [ + [HexString32Bytes, DataFormat | undefined], + [HexString32Bytes, DataFormat | undefined], +][] = [ + // Defined transactionHash, undefined returnType + [ + ['0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', undefined], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + DEFAULT_RETURN_FORMAT, + ], + ], + // Defined transactionHash and returnType = DEFAULT_RETURN_FORMAT + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + DEFAULT_RETURN_FORMAT, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + DEFAULT_RETURN_FORMAT, + ], + ], + // Defined transactionHash and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + // Defined block, hydrated = true, and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + // Defined block and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getTransactionFromBlockValidData: [ + [HexString32Bytes | BlockNumberOrTag | undefined, Uint, DataFormat | undefined], + [HexString32Bytes | BlockNumberOrTag, Uint, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + [undefined, '0x0', undefined], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = '0x0', and undefined returnType + [ + ['0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', '0x0', undefined], + [ + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + '0x0', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [BlockTags.LATEST, '0x0', undefined], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, '0x0', undefined], + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, '0x0', undefined], + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = '0x0', and undefined returnType + [ + [BlockTags.LATEST, '0x0', undefined], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, '0x0', undefined], + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, '0x0', undefined], + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.SAFE, '0x0', undefined], + [BlockTags.SAFE, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.FINALIZED, '0x0', undefined], + [BlockTags.FINALIZED, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = true, and returnType = DEFAULT_RETURN_FORMAT + [ + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + [BlockTags.LATEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + [BlockTags.EARLIEST, '0x0', DEFAULT_RETURN_FORMAT], + ], + [ + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + [BlockTags.PENDING, '0x0', DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = '0x0', and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + // Defined block, uncleIndex = '0x0', and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + // Defined block, uncleIndex = '0x0', and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.LATEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.EARLIEST, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + [BlockTags.PENDING, '0x0', { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getTransactionReceiptValidData: [ + [HexString32Bytes, DataFormat | undefined], + [HexString32Bytes, DataFormat | undefined], +][] = [ + // Defined block, undefined returnType + [ + ['0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', undefined], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + DEFAULT_RETURN_FORMAT, + ], + ], + // Defined block and returnType = DEFAULT_RETURN_FORMAT + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + DEFAULT_RETURN_FORMAT, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + DEFAULT_RETURN_FORMAT, + ], + ], + // Defined block and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + // Defined block, hydrated = true, and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + // Defined block and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getTransactionCountValidData: [ + [Address, HexString32Bytes | BlockNumberOrTag | undefined, DataFormat | undefined], + [Address, HexString32Bytes | BlockNumberOrTag, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', undefined, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + // Defined address and block number, undefined returnType + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + undefined, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = and undefined returnType + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = true, and returnType = DEFAULT_RETURN_FORMAT + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + // Defined block, uncleIndex = and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + // Defined block, uncleIndex = and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + // Defined block, uncleIndex = and returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const estimateGasValidData: [ + [ + Partial, + HexString32Bytes | BlockNumberOrTag | undefined, + DataFormat | undefined, + ], + [ + Partial, + HexString32Bytes | BlockNumberOrTag, + DataFormat | undefined, + ], +][] = [ + // All possible undefined values + [ + [transactionWithSender, undefined, undefined], + [transactionWithSender, BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, undefined returnType + [ + [ + transactionWithSender, + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + undefined, + ], + [ + transactionWithSender, + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [transactionWithSender, BlockTags.LATEST, undefined], + [transactionWithSender, BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.EARLIEST, undefined], + [transactionWithSender, BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.PENDING, undefined], + [transactionWithSender, BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.SAFE, undefined], + [transactionWithSender, BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.FINALIZED, undefined], + [transactionWithSender, BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, undefined returnType + [ + [transactionWithSender, BlockTags.LATEST, undefined], + [transactionWithSender, BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.EARLIEST, undefined], + [transactionWithSender, BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.PENDING, undefined], + [transactionWithSender, BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, returnType = DEFAULT_RETURN_FORMAT + [ + [transactionWithSender, BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + [transactionWithSender, BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + [transactionWithSender, BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + [transactionWithSender, BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + [transactionWithSender, BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [ + transactionWithSender, + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + transactionWithSender, + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + transactionWithSender, + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + transactionWithSender, + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + transactionWithSender, + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + transactionWithSender, + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + // Defined transaction and block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [ + transactionWithSender, + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + transactionWithSender, + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + transactionWithSender, + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + transactionWithSender, + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + transactionWithSender, + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + transactionWithSender, + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + // Defined transaction and block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [ + transactionWithSender, + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + transactionWithSender, + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + transactionWithSender, + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + transactionWithSender, + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + transactionWithSender, + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + transactionWithSender, + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getFeeHistoryValidData: [ + [Uint, HexString32Bytes | BlockNumberOrTag | undefined, number[], DataFormat | undefined], + [Uint, HexString32Bytes | BlockNumberOrTag, number[], DataFormat | undefined], +][] = [ + // All possible undefined values + [ + ['0x4', undefined, [], undefined], + ['0x4', BlockTags.LATEST, [], DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, undefined returnType + [ + [ + '0x4', + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + [], + undefined, + ], + [ + '0x4', + '0xc3073501c72f0d9372a18015637c86a394c7d52b633ced791d64e88969cfa3e2', + [], + DEFAULT_RETURN_FORMAT, + ], + ], + [ + ['0x4', BlockTags.LATEST, [], undefined], + ['0x4', BlockTags.LATEST, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.EARLIEST, [], undefined], + ['0x4', BlockTags.EARLIEST, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.PENDING, [], undefined], + ['0x4', BlockTags.PENDING, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.SAFE, [], undefined], + ['0x4', BlockTags.SAFE, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.FINALIZED, [], undefined], + ['0x4', BlockTags.FINALIZED, [], DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, undefined returnType + [ + ['0x4', BlockTags.LATEST, [], undefined], + ['0x4', BlockTags.LATEST, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.EARLIEST, [], undefined], + ['0x4', BlockTags.EARLIEST, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.PENDING, [], undefined], + ['0x4', BlockTags.PENDING, [], DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, returnType = DEFAULT_RETURN_FORMAT + [ + ['0x4', BlockTags.LATEST, [], DEFAULT_RETURN_FORMAT], + ['0x4', BlockTags.LATEST, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.EARLIEST, [], DEFAULT_RETURN_FORMAT], + ['0x4', BlockTags.EARLIEST, [], DEFAULT_RETURN_FORMAT], + ], + [ + ['0x4', BlockTags.PENDING, [], DEFAULT_RETURN_FORMAT], + ['0x4', BlockTags.PENDING, [], DEFAULT_RETURN_FORMAT], + ], + // Defined transaction and block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + ['0x4', BlockTags.LATEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ['0x4', BlockTags.LATEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + ['0x4', BlockTags.EARLIEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ['0x4', BlockTags.EARLIEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + [ + ['0x4', BlockTags.PENDING, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ['0x4', BlockTags.PENDING, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }], + ], + // Defined transaction and block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + ['0x4', BlockTags.LATEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ['0x4', BlockTags.LATEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + ['0x4', BlockTags.EARLIEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ['0x4', BlockTags.EARLIEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + [ + ['0x4', BlockTags.PENDING, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ['0x4', BlockTags.PENDING, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }], + ], + // Defined transaction and block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + ['0x4', BlockTags.LATEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ['0x4', BlockTags.LATEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + ['0x4', BlockTags.EARLIEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ['0x4', BlockTags.EARLIEST, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], + [ + ['0x4', BlockTags.PENDING, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ['0x4', BlockTags.PENDING, [], { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getStorageAtValidData: [ + [Address, Uint256, BlockNumberOrTag | undefined, DataFormat], + [Address, Uint256, BlockNumberOrTag, DataFormat], +][] = [ + // All possible undefined values + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + undefined, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + // Defined address, storageSlot, and blockNumber + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.SAFE, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + '0x0', + BlockTags.FINALIZED, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getCodeValidData: [ + [Address, BlockNumberOrTag | undefined], + [Address, BlockNumberOrTag, DataFormat], +][] = [ + // All possible undefined values + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', undefined], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + // Defined address and blockNumber + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED], + ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], +]; + +/** + * Array consists of: + * - input + * - mock RPC result + */ +export const sendSignedTransactionValidData: [[string], [string, DataFormat, undefined]][] = [ + [ + ['signedTransaction = HexString'], + ['signedTransaction = HexString', DEFAULT_RETURN_FORMAT, undefined], + ], + [ + ['0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675'], + [ + '0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675', + DEFAULT_RETURN_FORMAT, + undefined, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + */ +export const signValidData: [ + [HexStringBytes, Address, DataFormat | undefined], + [HexStringBytes, Address, DataFormat | undefined], +][] = [ + [ + ['0xdeadbeaf', '0x407d73d8a49eeb85d32cf465507dd71d507100c1', undefined], + ['0xdeadbeaf', '0x407d73d8a49eeb85d32cf465507dd71d507100c1', DEFAULT_RETURN_FORMAT], + ], +]; + +/** + * Array tests getPastLogs and formats valid fromBlock and toBlock + */ +export const getPastLogsValidFormatData: [Filter][] = [ + [{ fromBlock: 0, toBlock: 100 }], + [{ fromBlock: BigInt(0), toBlock: BigInt(100) }], + [{ fromBlock: '0x0', toBlock: '0x10' }], + [{ blockHash: '0x19e54b41ac6ed5eb5045aab59967489bbab1852e742857b1987f62290a4b89af' }], +]; +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getPastLogsValidData: [[Filter, DataFormat | undefined], [Filter, DataFormat]][] = [ + [ + [{}, undefined], + [{}, DEFAULT_RETURN_FORMAT], + ], + [ + [ + { blockHash: '0x19e54b41ac6ed5eb5045aab59967489bbab1852e742857b1987f62290a4b89af' }, + undefined, + ], + [ + { blockHash: '0x19e54b41ac6ed5eb5045aab59967489bbab1852e742857b1987f62290a4b89af' }, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + { + address: '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + undefined, + ], + [ + { + address: '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + { + fromBlock: BlockTags.LATEST, + toBlock: BlockTags.LATEST, + }, + undefined, + ], + [ + { + fromBlock: BlockTags.LATEST, + toBlock: BlockTags.LATEST, + }, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + { + fromBlock: BlockTags.PENDING, + toBlock: BlockTags.PENDING, + }, + undefined, + ], + [ + { + fromBlock: BlockTags.PENDING, + toBlock: BlockTags.PENDING, + }, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + { + fromBlock: BlockTags.EARLIEST, + toBlock: BlockTags.EARLIEST, + }, + undefined, + ], + [ + { + fromBlock: BlockTags.EARLIEST, + toBlock: BlockTags.EARLIEST, + }, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + { + fromBlock: BlockTags.SAFE, + toBlock: BlockTags.SAFE, + }, + undefined, + ], + [ + { + fromBlock: BlockTags.SAFE, + toBlock: BlockTags.SAFE, + }, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + { + fromBlock: BlockTags.FINALIZED, + toBlock: BlockTags.FINALIZED, + }, + undefined, + ], + [ + { + fromBlock: BlockTags.FINALIZED, + toBlock: BlockTags.FINALIZED, + }, + DEFAULT_RETURN_FORMAT, + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + */ +export const submitWorkValidData: [[HexString8Bytes, HexString32Bytes, HexString32Bytes]][] = [ + [ + [ + '0x0000000000000001', + '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', + '0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000', + ], + ], +]; + +/** + * Array consists of: + * - array of inputs + * - array of passed RPC parameters (excluding Web3Context) - This is to account for any defaults set by the method + */ +export const getProofValidData: [ + [Address, HexString32Bytes[], BlockNumberOrTag | undefined, DataFormat | undefined], + [Address, HexString32Bytes[], BlockNumberOrTag, DataFormat | undefined], +][] = [ + // All possible undefined values + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + undefined, + undefined, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + DEFAULT_RETURN_FORMAT, + ], + ], + // Defined block number, undefined returnType + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + undefined, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + undefined, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + undefined, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + undefined, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.SAFE, + undefined, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.SAFE, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.FINALIZED, + undefined, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.FINALIZED, + DEFAULT_RETURN_FORMAT, + ], + ], + // Defined block number, returnType = DEFAULT_RETURN_FORMAT + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + DEFAULT_RETURN_FORMAT, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + DEFAULT_RETURN_FORMAT, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + DEFAULT_RETURN_FORMAT, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + DEFAULT_RETURN_FORMAT, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + DEFAULT_RETURN_FORMAT, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + DEFAULT_RETURN_FORMAT, + ], + ], + // Defined block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR} + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.STR }, + ], + ], + // Defined block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER} + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.NUMBER }, + ], + ], + // Defined block number, returnType = {...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT} + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + '0x1', + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.EARLIEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.LATEST, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], + [ + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + [ + '0x1234567890123456789012345678901234567890', + ['0x295a70b2de5e3953354a6a8344e616ed314d7251'], + BlockTags.PENDING, + { ...DEFAULT_RETURN_FORMAT, number: FMT_NUMBER.BIGINT }, + ], + ], +]; + +export const tx = { + blockHash: '0xb3a667f84f58c90ab87476073e06c5d1186a0f0b0b69aa3033bfe0e4df264350', + blockNumber: '123', + from: '0x01ada9d3470eb9eb3875d9e7948c674804ca43ae', + gas: '21000', + gasPrice: '10000', + hash: '0x84f44dffc3cd90a1b66ad0219a97680308e5e7a77299fbf1e2ebb572cf02cc2d', + input: '0x', + nonce: '61', + to: '0x0000000000000000000000000000000000000000', + transactionIndex: '0', + value: '1', + type: '0x01', + v: '2710', + r: '0xbefb00433ef79b2609dc560c28963c2e954370792671f71ab99665b8807b7feb', + s: '0x6bebe5e2c9f839d3ce0264dc5c7cc521f902e86705c69f5fddffaa3de5aac6d3', +}; + +export const txReceipt: TransactionReceipt = { + blockHash: '0xb3a667f84f58c90ab87476073e06c5d1186a0f0b0b69aa3033bfe0e4df264350', + blockNumber: BigInt(123), + cumulativeGasUsed: BigInt(21000), + effectiveGasPrice: BigInt(10000), + from: '0x01ada9d3470eb9eb3875d9e7948c674804ca43ae', + gasUsed: BigInt(21000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(1), + to: '0x0000000000000000000000000000000000000000', + transactionHash: '0x84f44dffc3cd90a1b66ad0219a97680308e5e7a77299fbf1e2ebb572cf02cc2d', + transactionIndex: BigInt(0), + type: BigInt(0), + root: '', +}; diff --git a/packages/web3-eth/test/integration/batch.test.ts b/packages/web3-eth/test/integration/batch.test.ts new file mode 100644 index 00000000000..a71f02be43b --- /dev/null +++ b/packages/web3-eth/test/integration/batch.test.ts @@ -0,0 +1,97 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { SupportedProviders } from 'web3-types'; +import { hexToNumber } from 'web3-utils'; +import { Web3Eth } from '../../src'; + +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + waitForOpenConnection, +} from '../fixtures/system_test_utils'; + +describe('eth', () => { + let web3Eth: Web3Eth; + + let clientUrl: string | SupportedProviders; + + beforeAll(async () => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth(clientUrl); + await waitForOpenConnection(web3Eth); + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + describe('methods', () => { + it('executes one batch request', async () => { + const acc1 = await createTempAccount(); + + const batch = new web3Eth.BatchRequest(); + const request1 = { + id: 10, + method: 'eth_getBalance', + params: [acc1.address, 'latest'], + }; + const r1 = batch.add(request1).catch(console.error); + const [response1] = await batch.execute(); + + // eslint-disable-next-line jest/no-standalone-expect + expect(response1.result).toBeDefined(); + // TODO: in future release add test for validation of returned results , ( match balance ) + // eslint-disable-next-line jest/no-standalone-expect + expect(Number(hexToNumber(String(response1.result)))).toBeGreaterThan(0); + const [res1] = await Promise.all([r1]); + expect(res1).toBe(response1.result); + }); + it('BatchRequest', async () => { + const acc1 = await createTempAccount(); + const acc2 = await createTempAccount(); + + const batch = new web3Eth.BatchRequest(); + const request1 = { + id: 10, + method: 'eth_getBalance', + params: [acc1.address, 'latest'], + }; + const request2 = { + id: 11, + method: 'eth_getBalance', + params: [acc2.address, 'latest'], + }; + const r1 = batch.add(request1).catch(console.error); + const r2 = batch.add(request2).catch(console.error); + const [response1, response2] = await batch.execute(); + + // eslint-disable-next-line jest/no-standalone-expect + expect(response1.result).toBeDefined(); + // eslint-disable-next-line jest/no-standalone-expect + expect(response2.result).toBeDefined(); + // TODO: in future release add test for validation of returned results , ( match balance ) + // eslint-disable-next-line jest/no-standalone-expect + expect(Number(hexToNumber(String(response1.result)))).toBeGreaterThan(0); + // eslint-disable-next-line jest/no-standalone-expect + expect(Number(hexToNumber(String(response2.result)))).toBeGreaterThan(0); + const [res1, res2] = await Promise.all([r1, r2]); + expect(res1).toBe(response1.result); + expect(res2).toBe(response2.result); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/block/rpc.getBlock.test.ts b/packages/web3-eth/test/integration/block/rpc.getBlock.test.ts new file mode 100644 index 00000000000..50731193bcc --- /dev/null +++ b/packages/web3-eth/test/integration/block/rpc.getBlock.test.ts @@ -0,0 +1,158 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + TransactionReceipt, + Transaction, + FMT_BYTES, + FMT_NUMBER, + SupportedProviders, +} from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; +import { validator } from 'web3-validator'; +import { Web3Eth } from '../../../src'; +import { + getSystemTestProvider, + createTempAccount, + closeOpenConnection, + getSystemTestBackend, + describeIf, + createNewAccount, + refillAccount, + BACKEND +} from '../../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { sendFewTxes } from '../helper'; +import { blockSchema } from '../../../src/schemas'; + +describe('rpc with block', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + let blockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + blockNumber: number | bigint; + blockHash: string; + transactionHash: string; + transactionIndex: number | bigint; + }; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth({ + provider: clientUrl, + config: { + transactionPollingTimeout: 2000, + }, + }); + + contract = new Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + tempAcc = await createNewAccount({ unlock: true }); + await refillAccount( + ( + await createTempAccount() + ).address, + tempAcc.address, + '10000000000000000', + ); + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + await contract.deploy(deployOptions).send(sendOptions); + const [receipt]: TransactionReceipt[] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + blockData = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receipt.blockNumber), + blockHash: String(receipt.blockHash), + transactionHash: String(receipt.transactionHash), + transactionIndex: Number(receipt.transactionIndex), + }; + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + it.each( + toAllVariants<{ + block: 'earliest' | 'latest' | 'pending' | 'blockHash' | 'blockNumber'; + hydrated: boolean; + format: string; + }>({ + block: ['earliest', 'latest', 'blockHash', 'blockNumber'], + hydrated: [true, false], + format: Object.values(FMT_NUMBER), + }), + )('getBlock', async ({ hydrated, block, format }) => { + const b = { + ...(await web3Eth.getBlock(blockData[block], hydrated, { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + })), + }; + if (blockData[block] === 'pending') { + b.nonce = '0x0'; + b.miner = '0x0000000000000000000000000000000000000000'; + b.totalDifficulty = '0x0'; + } + + expect(validator.validateJSONSchema(blockSchema, b)).toBeUndefined(); + if (hydrated && b.transactions?.length > 0) { + // eslint-disable-next-line jest/no-conditional-expect + expect(b.transactions).toBeInstanceOf(Array); + } + }); + }); + + describeIf(getSystemTestBackend() === BACKEND.GETH)( + 'getBlock calls with POS tags in POA node', + () => { + it.each(['safe', 'finalized'])( + // only geth throws this error + 'getBlock', + async blockTag => { + const request = await web3Eth.getBlock(blockTag); + + expect(request).toBeDefined(); + expect(validator.validateJSONSchema(blockSchema, request)).toBeUndefined(); + }, + ); + }, + ); +}); diff --git a/packages/web3-eth/test/integration/block/rpc.getBlockTransactionCount.test.ts b/packages/web3-eth/test/integration/block/rpc.getBlockTransactionCount.test.ts new file mode 100644 index 00000000000..ce4ad2e26a1 --- /dev/null +++ b/packages/web3-eth/test/integration/block/rpc.getBlockTransactionCount.test.ts @@ -0,0 +1,106 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SupportedProviders, TransactionReceipt } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; +import { Web3Eth } from '../../../src'; +import { + getSystemTestProvider, + createTempAccount, + closeOpenConnection, +} from '../../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { sendFewTxes } from '../helper'; + +describe('rpc with block', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + let blockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + blockNumber: number | bigint; + blockHash: string; + transactionHash: string; + transactionIndex: number | bigint; + }; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(() => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth({ + provider: clientUrl, + config: { + transactionPollingTimeout: 2000, + }, + }); + + contract = new Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + }); + beforeAll(async () => { + tempAcc = await createTempAccount(); + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + await contract.deploy(deployOptions).send(sendOptions); + const [receipt]: TransactionReceipt[] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + blockData = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receipt.blockNumber), + blockHash: String(receipt.blockHash), + transactionHash: String(receipt.transactionHash), + transactionIndex: Number(receipt.transactionIndex), + }; + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + it.each( + toAllVariants<{ + block: 'earliest' | 'latest' | 'pending' | 'blockHash' | 'blockNumber'; + }>({ + block: ['earliest', 'latest', 'pending', 'blockHash', 'blockNumber'], + }), + )('getBlockTransactionCount', async ({ block }) => { + const res = await web3Eth.getBlockTransactionCount(blockData[block]); + const shouldBe = ['earliest', 'pending'].includes(String(blockData[block])) ? 0 : 1; + + expect(Number(res)).toBe(shouldBe); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/block/rpc.getBlockUncleCount.test.ts b/packages/web3-eth/test/integration/block/rpc.getBlockUncleCount.test.ts new file mode 100644 index 00000000000..ae822a99a5a --- /dev/null +++ b/packages/web3-eth/test/integration/block/rpc.getBlockUncleCount.test.ts @@ -0,0 +1,108 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SupportedProviders, TransactionReceipt } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; +import { Web3Eth } from '../../../src'; +import { + getSystemTestProvider, + createTempAccount, + closeOpenConnection, + describeIf, + getSystemTestBackend, + BACKEND +} from '../../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { sendFewTxes } from '../helper'; + +// hardhat does not support eth_getBlockUncleCountByBlockHash +describeIf(getSystemTestBackend() !== BACKEND.HARDHAT)('rpc with block', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + let blockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + blockNumber: number | bigint; + blockHash: string; + transactionHash: string; + transactionIndex: number | bigint; + }; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(() => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth({ + provider: clientUrl, + config: { + transactionPollingTimeout: 2000, + }, + }); + + contract = new Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + }); + beforeAll(async () => { + tempAcc = await createTempAccount(); + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + await contract.deploy(deployOptions).send(sendOptions); + const [receipt]: TransactionReceipt[] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + blockData = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receipt.blockNumber), + blockHash: String(receipt.blockHash), + transactionHash: String(receipt.transactionHash), + transactionIndex: Number(receipt.transactionIndex), + }; + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + it.each( + toAllVariants<{ + block: 'earliest' | 'latest' | 'pending' | 'blockHash' | 'blockNumber'; + }>({ + block: ['earliest', 'latest', 'pending', 'blockHash', 'blockNumber'], + }), + )('getBlockUncleCount', async ({ block }) => { + const res = await web3Eth.getBlockUncleCount(blockData[block]); + expect(Number(res)).toBe(0); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/block/rpc.getTransactionCount.test.ts b/packages/web3-eth/test/integration/block/rpc.getTransactionCount.test.ts new file mode 100644 index 00000000000..26bf386dba9 --- /dev/null +++ b/packages/web3-eth/test/integration/block/rpc.getTransactionCount.test.ts @@ -0,0 +1,148 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SupportedProviders, TransactionReceipt, FMT_BYTES, FMT_NUMBER } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; +import { Web3Eth } from '../../../src'; +import { + getSystemTestProvider, + createNewAccount, + createTempAccount, + closeOpenConnection, +} from '../../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { sendFewTxes } from '../helper'; + +describe('rpc with block', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + let blockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + blockNumber: number | bigint; + blockHash: string; + transactionHash: string; + transactionIndex: number | bigint; + }; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(() => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth({ + provider: clientUrl, + config: { + transactionPollingTimeout: 2000, + }, + }); + + contract = new Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + }); + beforeAll(async () => { + tempAcc = await createTempAccount(); + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + await contract.deploy(deployOptions).send(sendOptions); + const [receipt]: TransactionReceipt[] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + blockData = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receipt.blockNumber), + blockHash: String(receipt.blockHash), + transactionHash: String(receipt.transactionHash), + transactionIndex: Number(receipt.transactionIndex), + }; + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + it.each( + toAllVariants<{ + block: 'earliest' | 'latest' | 'pending' | 'blockHash' | 'blockNumber'; + format: string; + }>({ + block: ['earliest', 'latest', 'pending', 'blockNumber'], + format: Object.values(FMT_NUMBER), + }), + )('getTransactionCount', async ({ block, format }) => { + const acc = await createNewAccount({ unlock: true, refill: true }); + const [receipt] = await sendFewTxes({ + from: acc.address, + value: '0x1', + times: 1, + }); + const data = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receipt.blockNumber), + blockHash: String(receipt.blockHash), + transactionHash: String(receipt.transactionHash), + transactionIndex: Number(receipt.transactionIndex), + }; + const countBefore = await web3Eth.getTransactionCount(acc.address, data[block], { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + const count = 2; + const res = await sendFewTxes({ + from: acc.address, + value: '0x1', + times: count, + }); + const receiptAfter = res[res.length - 1]; + const dataAfter = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receiptAfter.blockNumber), + blockHash: String(receiptAfter.blockHash), + transactionHash: String(receiptAfter.transactionHash), + transactionIndex: Number(receiptAfter.transactionIndex), + }; + const countAfter = await web3Eth.getTransactionCount(acc.address, dataAfter[block], { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + // eslint-disable-next-line jest/no-standalone-expect + expect(Number(countAfter) - Number(countBefore)).toBe( + blockData[block] === 'earliest' ? 0 : count, + ); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/block/rpc.getTransactionFromBlock.test.ts b/packages/web3-eth/test/integration/block/rpc.getTransactionFromBlock.test.ts new file mode 100644 index 00000000000..13777425e8c --- /dev/null +++ b/packages/web3-eth/test/integration/block/rpc.getTransactionFromBlock.test.ts @@ -0,0 +1,102 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SupportedProviders, TransactionInfo, TransactionReceipt } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; +import { Web3Eth } from '../../../src'; +import { + getSystemTestProvider, + createTempAccount, + closeOpenConnection, +} from '../../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; +import { sendFewTxes, validateTransaction } from '../helper'; + +describe('rpc with block', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + let blockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + blockNumber: number | bigint; + blockHash: string; + transactionHash: string; + transactionIndex: number | bigint; + }; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(() => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth({ + provider: clientUrl, + config: { + transactionPollingTimeout: 2000, + }, + }); + + contract = new Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + }); + beforeAll(async () => { + tempAcc = await createTempAccount(); + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + await contract.deploy(deployOptions).send(sendOptions); + const [receipt]: TransactionReceipt[] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + blockData = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receipt.blockNumber), + blockHash: String(receipt.blockHash), + transactionHash: String(receipt.transactionHash), + transactionIndex: Number(receipt.transactionIndex), + }; + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + it('getTransactionFromBlock', async () => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const tx = (await web3Eth.getTransactionFromBlock( + blockData.blockNumber, + blockData.transactionIndex, + ))!; + validateTransaction(tx as TransactionInfo); + expect(tx?.hash).toBe(blockData.transactionHash); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/block/rpc.getUncle.test.ts b/packages/web3-eth/test/integration/block/rpc.getUncle.test.ts new file mode 100644 index 00000000000..9b820fd9077 --- /dev/null +++ b/packages/web3-eth/test/integration/block/rpc.getUncle.test.ts @@ -0,0 +1,111 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SupportedProviders, TransactionReceipt } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; + +import { Web3Eth } from '../../../src'; + +import { + getSystemTestProvider, + createTempAccount, + closeOpenConnection, + describeIf, + getSystemTestBackend, + BACKEND +} from '../../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { sendFewTxes } from '../helper'; + +// hardhat does not support eth_getUncle +describeIf(getSystemTestBackend() !== BACKEND.HARDHAT)('rpc with block', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + let blockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + blockNumber: number | bigint; + blockHash: string; + transactionHash: string; + transactionIndex: number | bigint; + }; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(() => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth({ + provider: clientUrl, + config: { + transactionPollingTimeout: 2000, + }, + }); + + contract = new Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + }); + beforeAll(async () => { + tempAcc = await createTempAccount(); + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + await contract.deploy(deployOptions).send(sendOptions); + const [receipt]: TransactionReceipt[] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + blockData = { + pending: 'pending', + latest: 'latest', + earliest: 'earliest', + blockNumber: Number(receipt.blockNumber), + blockHash: String(receipt.blockHash), + transactionHash: String(receipt.transactionHash), + transactionIndex: Number(receipt.transactionIndex), + }; + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + it.each( + toAllVariants<{ + block: 'earliest' | 'latest' | 'pending' | 'blockNumber'; + }>({ + block: ['earliest', 'latest', 'pending', 'blockNumber'], + }), + )('getUncle', async ({ block }) => { + const res = await web3Eth.getUncle(blockData[block], 0); + // eslint-disable-next-line jest/no-standalone-expect + expect(res).toBeNull(); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/defaults.test.ts b/packages/web3-eth/test/integration/defaults.test.ts new file mode 100644 index 00000000000..a9651fa20e3 --- /dev/null +++ b/packages/web3-eth/test/integration/defaults.test.ts @@ -0,0 +1,1053 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; +import { hexToNumber, numberToHex } from 'web3-utils'; +import { TransactionBuilder, TransactionTypeParser, Web3Context, Web3PromiEvent } from 'web3-core'; +import { + Hardfork, + SupportedProviders, + TransactionReceipt, + ValidChains, + Web3BaseProvider, + DEFAULT_RETURN_FORMAT, +} from 'web3-types'; +import { + detectTransactionType, + prepareTransactionForSigning, + SendTransactionEvents, + transactionBuilder, + Web3Eth, +} from '../../src'; + +import { + closeOpenConnection, + createNewAccount, + createTempAccount, + getSystemTestProvider, + isIpc, + sendFewSampleTxs, +} from '../fixtures/system_test_utils'; + +import { + defaultTransactionBuilder, + getTransactionFromOrToAttr, + getTransactionType, +} from '../../src/utils'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { MsgSenderAbi, MsgSenderBytecode } from '../shared_fixtures/build/MsgSender'; +import { getTransactionGasPricing } from '../../src/utils/get_transaction_gas_pricing'; +import { Resolve, sendFewTxes } from './helper'; + +describe('defaults', () => { + let web3Eth: Web3Eth; + let eth2: Web3Eth; + let clientUrl: string | SupportedProviders; + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + let tempAcc: { address: string; privateKey: string }; + + beforeEach(async () => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth(clientUrl); + tempAcc = await createTempAccount(); + contract = new Contract(BasicAbi, web3Eth.getContextObject() as any); + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + sendOptions = { from: tempAcc.address, gas: '1000000' }; + }); + + afterEach(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(eth2); + }); + + describe('defaults', () => { + it('defaultAccount', async () => { + const tempAcc2 = await createTempAccount(); + const tempAcc3 = await createTempAccount(); + const contractMsgFrom = await new Contract( + MsgSenderAbi, + web3Eth.getContextObject() as any, + ) + .deploy({ + data: MsgSenderBytecode, + arguments: ['test'], + }) + .send({ from: tempAcc2.address, gas: '2700000' }); + // default + expect(web3Eth.defaultAccount).toBeUndefined(); + + // after set + web3Eth.setConfig({ + defaultAccount: tempAcc.address, + }); + expect(web3Eth.defaultAccount).toBe(tempAcc.address); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + defaultAccount: tempAcc3.address, + }, + }); + expect(eth2.defaultAccount).toBe(tempAcc3.address); + + // check utils + expect(getTransactionFromOrToAttr('from', eth2)).toBe(tempAcc3.address); + // TODO: after handleRevert implementation https://github.com/ChainSafe/web3.js/issues/5069 add following tests in future release + // set handleRevert true and test following functions with invalid input tx data and see revert reason present in error details: + contractMsgFrom.setConfig({ + defaultAccount: tempAcc.address, + }); + + const tx = await contractMsgFrom.methods + .setTestString('test2') + .send({ gas: '1000000' }); + const txSend = await web3Eth.sendTransaction({ + to: tempAcc2.address, + value: '0x1', + }); + expect(tx.from).toBe(tempAcc.address.toLowerCase()); + expect(txSend.from).toBe(tempAcc.address.toLowerCase()); + + const tx2 = await contractMsgFrom.methods.setTestString('test3').send({ + from: tempAcc2.address, + }); + const tx2Send = await web3Eth.sendTransaction({ + to: tempAcc.address, + value: '0x1', + from: tempAcc2.address, + }); + expect(tx2.from).toBe(tempAcc2.address.toLowerCase()); + expect(tx2Send.from).toBe(tempAcc2.address.toLowerCase()); + + const fromDefault = await contractMsgFrom.methods?.from().call(); + const fromPass = await contractMsgFrom.methods?.from().call({ from: tempAcc.address }); + const fromPass2 = await contractMsgFrom.methods + ?.from() + .call({ from: tempAcc2.address }); + expect((fromDefault as unknown as string).toLowerCase()).toBe( + tempAcc.address.toLowerCase(), + ); + expect((fromPass as unknown as string).toLowerCase()).toBe( + tempAcc.address.toLowerCase(), + ); + expect((fromPass2 as unknown as string).toLowerCase()).toBe( + tempAcc2.address.toLowerCase(), + ); + }); + it('handleRevert', () => { + /* + //TO DO: after handleRevert implementation https://github.com/ChainSafe/web3.js/issues/5069 add following tests in future release + /* set handleRevert true and test following functions with invalid input tx data and see revert reason present in error details: + + web3.eth.call() + web3.eth.sendTransaction() + contract.methods.myMethod(…).send(…) + contract.methods.myMethod(…).call(…) + + */ + // default + expect(web3Eth.handleRevert).toBe(false); + + // after set + web3Eth.setConfig({ + handleRevert: true, + }); + expect(web3Eth.handleRevert).toBe(true); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + handleRevert: true, + }, + }); + expect(eth2.handleRevert).toBe(true); + }); + it('defaultBlock', async () => { + const contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + // default + expect(web3Eth.defaultBlock).toBe('latest'); + + web3Eth.setConfig({ + defaultBlock: 'safe', + }); + expect(web3Eth.defaultBlock).toBe('safe'); + + web3Eth.setConfig({ + defaultBlock: 'finalized', + }); + expect(web3Eth.defaultBlock).toBe('finalized'); + + // after set + web3Eth.setConfig({ + defaultBlock: 'earliest', + }); + expect(web3Eth.defaultBlock).toBe('earliest'); + + // set by create new instance + eth2 = new Web3Eth({ + provider: web3Eth.provider, + config: { + defaultBlock: 'earliest', + }, + }); + expect(eth2.defaultBlock).toBe('earliest'); + + // check implementation + const acc = await createNewAccount({ refill: true, unlock: true }); + + await sendFewTxes({ + from: acc.address, + times: 1, + value: '0x1', + }); + const balance = await eth2.getBalance(acc.address); + const code = await eth2.getCode(contractDeployed?.options?.address as string); + const storage = await eth2.getStorageAt( + contractDeployed?.options?.address as string, + 0, + ); + const transactionCount = await eth2.getTransactionCount(acc.address); + expect(storage === '0x' ? 0 : Number(hexToNumber(storage))).toBe(0); + expect(code).toBe('0x'); + expect(balance).toBe(BigInt(0)); + expect(transactionCount).toBe(BigInt(0)); + + // pass blockNumber to rewrite defaultBlockNumber + const balanceWithBlockNumber = await eth2.getBalance(acc.address, 'latest'); + const transactionCountWithBlockNumber = await eth2.getTransactionCount( + acc.address, + 'latest', + ); + const codeWithBlockNumber = await eth2.getCode( + contractDeployed?.options?.address as string, + 'latest', + ); + const storageWithBlockNumber = await eth2.getStorageAt( + contractDeployed?.options?.address as string, + 0, + 'latest', + ); + expect(Number(hexToNumber(storageWithBlockNumber))).toBe(10); + expect(transactionCountWithBlockNumber).toBe(BigInt(1)); + expect(Number(balanceWithBlockNumber)).toBeGreaterThan(0); + expect(codeWithBlockNumber.startsWith(BasicBytecode.slice(0, 10))).toBe(true); + + // set new default block to config + eth2.setConfig({ + defaultBlock: 'latest', + }); + const balanceLatest = await eth2.getBalance(acc.address); + const codeLatest = await eth2.getCode(contractDeployed?.options?.address as string); + const storageLatest = await eth2.getStorageAt( + contractDeployed?.options?.address as string, + 0, + ); + const transactionCountLatest = await eth2.getTransactionCount(acc.address); + expect(codeLatest.startsWith(BasicBytecode.slice(0, 10))).toBe(true); + expect(Number(hexToNumber(storageLatest))).toBe(10); + expect(transactionCountLatest).toBe(BigInt(1)); + expect(Number(balanceLatest)).toBeGreaterThan(0); + }); + it('transactionSendTimeout', () => { + // default + expect(web3Eth.transactionSendTimeout).toBe(750 * 1000); + + // after set + web3Eth.setConfig({ + transactionSendTimeout: 1, + }); + expect(web3Eth.transactionSendTimeout).toBe(1); + + // set by create new instance + eth2 = new Web3Eth({ + provider: web3Eth.provider, + config: { + transactionSendTimeout: 120, + }, + }); + expect(eth2.transactionSendTimeout).toBe(120); + }); + it('transactionBlockTimeout', () => { + // default + expect(web3Eth.transactionBlockTimeout).toBe(50); + + // after set + web3Eth.setConfig({ + transactionBlockTimeout: 1, + }); + expect(web3Eth.transactionBlockTimeout).toBe(1); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + transactionBlockTimeout: 120, + }, + }); + expect(eth2.transactionBlockTimeout).toBe(120); + }); + it('transactionConfirmationBlocks', () => { + // default + // eslint-disable-next-line jest/no-standalone-expect + expect(web3Eth.transactionConfirmationBlocks).toBe(24); + + // after set + web3Eth.setConfig({ + transactionConfirmationBlocks: 3, + }); + // eslint-disable-next-line jest/no-standalone-expect + expect(web3Eth.transactionConfirmationBlocks).toBe(3); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + transactionConfirmationBlocks: 4, + }, + }); + // eslint-disable-next-line jest/no-standalone-expect + expect(eth2.transactionConfirmationBlocks).toBe(4); + }); + it('transactionConfirmationBlocks implementation', async () => { + const tempAcc2 = await createTempAccount(); + const waitConfirmations = 1; + const eth = new Web3Eth(web3Eth.provider); + eth.setConfig({ transactionConfirmationBlocks: waitConfirmations }); + + const from = tempAcc.address; + const to = tempAcc2.address; + const value = `0x1`; + const sentTx: Web3PromiEvent< + TransactionReceipt, + SendTransactionEvents + > = eth.sendTransaction({ + to, + value, + from, + }); + + const receiptPromise = new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on('receipt', (params: TransactionReceipt) => { + expect(Number(params.status)).toBe(1); + resolve(); + }); + }); + let shouldBe = 1; + const confirmationPromise = new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on('confirmation', ({ confirmations }) => { + expect(Number(confirmations)).toBeGreaterThanOrEqual(shouldBe); + shouldBe += 1; + if (shouldBe > waitConfirmations) { + resolve(); + } + }); + }); + await sentTx; + await receiptPromise; + await sendFewSampleTxs(isIpc ? 2 * waitConfirmations : waitConfirmations); + await confirmationPromise; + await closeOpenConnection(eth); + }); + it('transactionPollingInterval and transactionPollingTimeout', () => { + // default + expect(web3Eth.transactionPollingInterval).toBe(1000); + expect(web3Eth.transactionPollingTimeout).toBe(750 * 1000); + + // after set + web3Eth.setConfig({ + transactionPollingInterval: 3, + transactionPollingTimeout: 10, + }); + expect(web3Eth.transactionPollingInterval).toBe(3); + expect(web3Eth.transactionPollingTimeout).toBe(10); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + transactionPollingInterval: 400, + transactionPollingTimeout: 10, + }, + }); + expect(eth2.transactionPollingInterval).toBe(400); + expect(eth2.transactionPollingTimeout).toBe(10); + }); + // todo will work with not instance mining + // itIf(isHttp)('transactionReceiptPollingInterval and transactionConfirmationPollingInterval implementation', async () => { + // eth2 = new Web3Eth({ + // provider: web3Eth.provider, + // config: { + // transactionPollingInterval: 400, + // transactionPollingTimeout: 10, + // }, + // }); + // + // const sentTx: Web3PromiEvent = eth2.sendTransaction({ + // to: tempAcc2.address, + // value: '0x1', + // from: tempAcc.address, + // }); + // + // const res = await Promise.race([ + // new Promise((resolve) => setTimeout(resolve, 410)), + // new Promise((resolve: Resolve) => { + // sentTx.on('receipt', (params: TransactionReceipt) => { + // expect(params.status).toBe(BigInt(1)); + // resolve(params); + // }); + // }), + // ]); + // expect((res as TransactionReceipt).status).toBe(BigInt(1)); + // + // const sentTx2: Web3PromiEvent = eth2.sendTransaction({ + // to: tempAcc2.address, + // value: '0x1', + // from: tempAcc.address, + // }); + // const res2 = await Promise.race([ + // new Promise((resolve) => setTimeout(()=>resolve(false), 300)), + // new Promise((resolve: Resolve) => { + // sentTx2.on('receipt', (params: TransactionReceipt) => { + // expect(params.status).toBe(BigInt(1)); + // resolve(params); + // }); + // }), + // ]); + // expect((res2 as boolean)).toBe(false); + // + // + // }); + it('transactionReceiptPollingInterval and transactionConfirmationPollingInterval', () => { + // default + expect(web3Eth.transactionReceiptPollingInterval).toBeUndefined(); + expect(web3Eth.transactionConfirmationPollingInterval).toBeUndefined(); + + // after set + web3Eth.setConfig({ + transactionReceiptPollingInterval: 3, + transactionConfirmationPollingInterval: 10, + }); + expect(web3Eth.transactionReceiptPollingInterval).toBe(3); + expect(web3Eth.transactionConfirmationPollingInterval).toBe(10); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + transactionReceiptPollingInterval: 400, + transactionConfirmationPollingInterval: 10, + }, + }); + expect(eth2.transactionReceiptPollingInterval).toBe(400); + expect(eth2.transactionConfirmationPollingInterval).toBe(10); + }); + it('blockHeaderTimeout', () => { + // default + expect(web3Eth.blockHeaderTimeout).toBe(10); + + // after set + web3Eth.setConfig({ + blockHeaderTimeout: 3, + }); + expect(web3Eth.blockHeaderTimeout).toBe(3); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + blockHeaderTimeout: 4, + }, + }); + expect(eth2.blockHeaderTimeout).toBe(4); + }); + + it('enableExperimentalFeatures useSubscriptionWhenCheckingBlockTimeout', () => { + // default + expect(web3Eth.enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout).toBe( + false, + ); + + // after set + web3Eth.setConfig({ + enableExperimentalFeatures: { + useSubscriptionWhenCheckingBlockTimeout: true, + useRpcCallSpecification: false, + }, + }); + expect(web3Eth.enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout).toBe( + true, + ); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + enableExperimentalFeatures: { + useSubscriptionWhenCheckingBlockTimeout: true, + useRpcCallSpecification: false, + }, + }, + }); + expect(eth2.enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout).toBe( + true, + ); + }); + + it('enableExperimentalFeatures useRpcCallSpecification', () => { + // default + expect(web3Eth.enableExperimentalFeatures.useRpcCallSpecification).toBe(false); + + // after set + web3Eth.setConfig({ + enableExperimentalFeatures: { + useSubscriptionWhenCheckingBlockTimeout: false, + useRpcCallSpecification: true, + }, + }); + expect(web3Eth.enableExperimentalFeatures.useRpcCallSpecification).toBe(true); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + enableExperimentalFeatures: { + useSubscriptionWhenCheckingBlockTimeout: false, + useRpcCallSpecification: true, + }, + }, + }); + expect(eth2.enableExperimentalFeatures.useRpcCallSpecification).toBe(true); + }); + + it('should fallback to polling if provider support `on` but `newBlockHeaders` does not arrive in `blockHeaderTimeout` seconds', async () => { + const tempAcc2 = await createTempAccount(); + + const tempEth: Web3Eth = new Web3Eth(clientUrl); + // Ensure the provider supports subscriptions to simulate the test scenario + // It will cause providers that does not support subscriptions (like http) to throw exception when subscribing. + // This case is tested to ensure that even if an error happen at subscription, + // polling will still get the data from next blocks. + (tempEth.provider as Web3BaseProvider).supportsSubscriptions = () => true; + + // Cause the events to take a long time (more than blockHeaderTimeout), + // to ensure that polling of new blocks works in such cases. + // This will cause the providers that supports subscription (like WebSocket) + // to never return data through listening to new events + + // eslint-disable-next-line @typescript-eslint/no-misused-promises + (tempEth.provider as Web3BaseProvider).on = async () => { + await new Promise(res => { + setTimeout(res, 1000000); + }); + }; + + // Make the test run faster by casing the polling to start after 1 second + tempEth.blockHeaderTimeout = 1; + const from = tempAcc2.address; + const to = tempAcc.address; + const value = `0x1`; + + const sentTx: Web3PromiEvent< + TransactionReceipt, + SendTransactionEvents + > = tempEth.sendTransaction({ + from, + to, + value, + }); + + const confirmationPromise = new Promise((resolve: (status: bigint) => void) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on( + 'confirmation', + async ({ + confirmations, + receipt: { status }, + }: { + confirmations: bigint; + receipt: { status: bigint }; + }) => { + // Being able to get 2 confirmations means the polling for new blocks works + if (confirmations >= 2) { + sentTx.removeAllListeners(); + resolve(status); + } else { + // Send a transaction to cause dev providers creating new blocks to fire the 'confirmation' event again. + await tempEth.sendTransaction({ + from, + to, + value, + }); + } + }, + ); + }); + await sentTx; + + // Ensure the promise the get the confirmations resolves with no error + const status = await confirmationPromise; + expect(status).toBe(BigInt(1)); + await closeOpenConnection(tempEth); + }); + it('maxListenersWarningThreshold test default config', () => { + // default + expect(web3Eth.maxListenersWarningThreshold).toBe(100); + }); + it('maxListenersWarningThreshold set maxListeners through variable', () => { + eth2 = new Web3Eth({}); + eth2.maxListenersWarningThreshold = 3; + expect(eth2.maxListenersWarningThreshold).toBe(3); + expect(eth2.getMaxListeners()).toBe(3); + }); + it('maxListenersWarningThreshold set config', () => { + const eth = new Web3Eth({}); + eth.setConfig({ + maxListenersWarningThreshold: 3, + }); + expect(eth2.maxListenersWarningThreshold).toBe(3); + expect(eth2.getMaxListeners()).toBe(3); + }); + it('defaultNetworkId', async () => { + // default + expect(web3Eth.defaultNetworkId).toBeUndefined(); + + // after set + web3Eth.setConfig({ + defaultNetworkId: 3, + }); + expect(web3Eth.defaultNetworkId).toBe(3); + + // set by create new instance + eth2 = new Web3Eth({ + provider: web3Eth.provider, + config: { + defaultNetworkId: 4, + }, + }); + expect(eth2.defaultNetworkId).toBe(4); + const res = await defaultTransactionBuilder({ + transaction: { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + }, + web3Context: eth2 as Web3Context, + }); + expect(res.networkId).toBe(4); + + // pass network id + const resWithPassNetworkId = await defaultTransactionBuilder({ + transaction: { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + networkId: 5, + }, + web3Context: eth2 as Web3Context, + }); + + expect(resWithPassNetworkId.networkId).toBe(BigInt(5)); + }); + it('defaultChain', async () => { + // default + expect(web3Eth.defaultChain).toBe('mainnet'); + + // after set + web3Eth.setConfig({ + defaultChain: 'ropsten', + }); + expect(web3Eth.defaultChain).toBe('ropsten'); + + // set by create new instance + eth2 = new Web3Eth({ + provider: web3Eth.provider, + config: { + defaultChain: 'rinkeby', + }, + }); + expect(eth2.defaultChain).toBe('rinkeby'); + const res = await defaultTransactionBuilder({ + transaction: { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + }, + web3Context: eth2 as Web3Context, + }); + expect(res.chain).toBe('rinkeby'); + }); + it('defaultHardfork', async () => { + // default + expect(web3Eth.defaultHardfork).toBe('london'); + + // after set + web3Eth.setConfig({ + defaultHardfork: 'dao', + }); + expect(web3Eth.defaultHardfork).toBe('dao'); + + // set by create new instance + eth2 = new Web3Eth({ + provider: web3Eth.provider, + config: { + defaultHardfork: 'istanbul', + defaultTransactionType: '0x0', + }, + }); + expect(eth2.defaultHardfork).toBe('istanbul'); + expect(eth2.defaultTransactionType).toBe('0x0'); + + const res = await prepareTransactionForSigning( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + eth2, + ); + expect(res.common.hardfork()).toBe('istanbul'); + }); + it('defaultCommon', () => { + // default + expect(web3Eth.defaultCommon).toBeUndefined(); + const baseChain: ValidChains = 'mainnet'; + const hardfork: Hardfork = 'dao'; + const common = { + customChain: { + name: 'test', + networkId: 123, + chainId: 1234, + }, + baseChain, + hardfork, + }; + // after set + web3Eth.setConfig({ + defaultCommon: common, + }); + expect(web3Eth.defaultCommon).toBe(common); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + defaultCommon: common, + }, + }); + expect(eth2.defaultCommon).toBe(common); + }); + it('defaultTransactionType', async () => { + // default + expect(web3Eth.defaultTransactionType).toBe('0x2'); + // after set + web3Eth.setConfig({ + defaultTransactionType: '0x3', + }); + expect(web3Eth.defaultTransactionType).toBe('0x3'); + + // set by create new instance + eth2 = new Web3Eth({ + provider: clientUrl, + config: { + defaultTransactionType: '0x4444', + }, + }); + + expect(eth2.defaultTransactionType).toBe('0x4444'); + + const res = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + eth2, + ); + expect(res).toBe('0x4444'); + + // test override to 0x2 if: + // tx.maxFeePerGas !== undefined || + // tx.maxPriorityFeePerGas !== undefined || + // tx.hardfork === 'london' || + // tx.common?.hardfork === 'london' + const maxFeePerGasOverride = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + maxFeePerGas: '0x32', + }, + eth2, + ); + expect(maxFeePerGasOverride).toBe('0x2'); + const maxPriorityFeePerGasOverride = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + maxPriorityFeePerGas: '0x32', + }, + eth2, + ); + expect(maxPriorityFeePerGasOverride).toBe('0x2'); + const hardforkOverride = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + hardfork: 'london', + }, + eth2, + ); + expect(hardforkOverride).toBe('0x2'); + const commonOverride = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + common: { + customChain: { name: 'ropsten', networkId: '2', chainId: '0x1' }, + hardfork: 'london', + }, + }, + eth2, + ); + expect(commonOverride).toBe('0x2'); + + // override to 0x1 if: + // tx.accessList !== undefined || tx.hardfork === 'berlin' || tx.common?.hardfork === 'berlin' + + const accessListOverride = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + accessList: [ + { + address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + storageKeys: ['0x3535353535353535353535353535353535353535'], + }, + ], + }, + eth2, + ); + expect(accessListOverride).toBe('0x1'); + + const hardforkBerlinOverride = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + hardfork: 'berlin', + }, + eth2, + ); + expect(hardforkBerlinOverride).toBe('0x0'); + + const commonBerlinOverride = getTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + common: { + customChain: { name: 'ropsten', networkId: '2', chainId: '0x1' }, + hardfork: 'berlin', + }, + }, + eth2, + ); + expect(commonBerlinOverride).toBe('0x0'); + }); + it('defaultMaxPriorityFeePerGas', async () => { + // default + expect(web3Eth.defaultMaxPriorityFeePerGas).toBe(numberToHex(2500000000)); + // after set + web3Eth.setConfig({ + defaultMaxPriorityFeePerGas: numberToHex(2100000000), + }); + expect(web3Eth.defaultMaxPriorityFeePerGas).toBe(numberToHex(2100000000)); + + // set by create new instance + eth2 = new Web3Eth({ + provider: web3Eth.provider, + config: { + defaultMaxPriorityFeePerGas: numberToHex(1200000000), + }, + }); + expect(eth2.defaultMaxPriorityFeePerGas).toBe(numberToHex(1200000000)); + + const res = await getTransactionGasPricing( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + type: '0x2', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + eth2, + DEFAULT_RETURN_FORMAT, + ); + expect(res?.maxPriorityFeePerGas).toBe(BigInt(1200000000)); + + // override test + const resOverride = await getTransactionGasPricing( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + type: '0x2', + gas: '0x5208', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + maxPriorityFeePerGas: '0x123123123', + }, + eth2, + DEFAULT_RETURN_FORMAT, + ); + expect(resOverride?.maxPriorityFeePerGas).toBe(BigInt('4883362083')); + }); + it('transactionBuilder', async () => { + // default + expect(web3Eth.transactionBuilder).toBeUndefined(); + + // default + expect(web3Eth.transactionBuilder).toBeUndefined(); + + const newBuilderMock = jest.fn() as unknown as TransactionBuilder; + + web3Eth.setConfig({ + transactionBuilder: newBuilderMock, + }); + expect(web3Eth.transactionBuilder).toBe(newBuilderMock); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + transactionBuilder: newBuilderMock, + }, + }); + expect(eth2.transactionBuilder).toBe(newBuilderMock); + + await transactionBuilder({ + transaction: { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + web3Context: eth2, + }); + expect(newBuilderMock).toHaveBeenCalled(); + }); + it('transactionTypeParser', () => { + // default + expect(web3Eth.transactionTypeParser).toBeUndefined(); + + const newParserMock = jest.fn() as unknown as TransactionTypeParser; + + web3Eth.setConfig({ + transactionTypeParser: newParserMock, + }); + expect(web3Eth.transactionTypeParser).toBe(newParserMock); + + // set by create new instance + eth2 = new Web3Eth({ + config: { + transactionTypeParser: newParserMock, + }, + }); + expect(eth2.transactionTypeParser).toBe(newParserMock); + detectTransactionType( + { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x0', + nonce: '0x4', + chainId: '0x1', + gasLimit: '0x5208', + }, + eth2, + ); + expect(newParserMock).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/defaults.transactionBlockTimeout.test.ts b/packages/web3-eth/test/integration/defaults.transactionBlockTimeout.test.ts new file mode 100644 index 00000000000..fe679bb0dbe --- /dev/null +++ b/packages/web3-eth/test/integration/defaults.transactionBlockTimeout.test.ts @@ -0,0 +1,139 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { DEFAULT_RETURN_FORMAT } from 'web3-types'; +import { Web3PromiEvent } from 'web3-core'; +import { SupportedProviders, TransactionReceipt } from 'web3-types'; +import { TransactionBlockTimeoutError } from 'web3-errors'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3 } from 'web3'; +import { Web3Account } from 'web3-eth-accounts'; +import { SendTransactionEvents } from '../../src'; + +import { + closeOpenConnection, + getSystemTestProvider, + isSocket, + itIf, + waitForOpenConnection, + createLocalAccount, + sendFewSampleTxs, + getSystemTestBackend, + describeIf, + BACKEND +} from '../fixtures/system_test_utils'; + +const MAX_32_SIGNED_INTEGER = 2147483647; +const gas = 21000; +// skip if using hardhat, does not return a transaction not mined error but instead a nonce too high error +/* eslint-disable jest/no-standalone-expect */ +describeIf(getSystemTestBackend() !== BACKEND.HARDHAT)('defaults', () => { + let web3: Web3; + let clientUrl: string | SupportedProviders; + let account1: Web3Account; + let account2: Web3Account; + + beforeEach(() => { + clientUrl = getSystemTestProvider(); + web3 = new Web3(clientUrl); + + // Increase other timeouts so only `transactionBlockTimeout` would be reached + web3.eth.transactionSendTimeout = MAX_32_SIGNED_INTEGER; + web3.eth.transactionPollingTimeout = MAX_32_SIGNED_INTEGER; + web3.eth.blockHeaderTimeout = MAX_32_SIGNED_INTEGER / 1000; + }); + + afterEach(async () => { + web3.eth.transactionBlockTimeout = 50; + await closeOpenConnection(web3.eth); + }); + + describe('defaults', () => { + it('should fail if transaction was not mined within `transactionBlockTimeout` blocks', async () => { + account1 = await createLocalAccount(web3); + account2 = await createLocalAccount(web3); + // Setting a high `nonce` when sending a transaction, to cause the RPC call to stuck at the Node + + const sentTx: Web3PromiEvent< + TransactionReceipt, + SendTransactionEvents + > = web3.eth.sendTransaction({ + from: account1.address, + to: account2.address, + gas, + value: '0x1', + // Give a high nonce so the transaction stuck forever. + // However, make this random to be able to run the test many times without receiving an error that indicate submitting the same transaction twice. + nonce: Number.MAX_SAFE_INTEGER, + }); + + // Some providers (mostly used for development) will make blocks only when there are new transactions + // So, send 2 transactions, one after another, because in this test `transactionBlockTimeout = 2`. + // eslint-disable-next-line no-void + await sendFewSampleTxs(2); + + web3.eth.transactionBlockTimeout = 2; + + await expect(sentTx).rejects.toThrow(/was not mined within [0-9]+ blocks/); + + await expect(sentTx).rejects.toThrow(TransactionBlockTimeoutError); + + await closeOpenConnection(web3.eth); + }); + + // The code of this test case is identical to the pervious one except for `eth.enableExperimentalFeatures = true` + // TODO: And this test case will be removed once https://github.com/web3/web3.js/issues/5521 is implemented. + itIf(isSocket)( + 'should fail if transaction was not mined within `transactionBlockTimeout` blocks - when subscription is used', + async () => { + account1 = await createLocalAccount(web3); + account2 = await createLocalAccount(web3); + await waitForOpenConnection(web3.eth); + // using subscription to get the new blocks and fire `TransactionBlockTimeoutError` is currently supported only + // with `enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout` equal true. + web3.eth.enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout = true; + + // Setting a high `nonce` when sending a transaction, to cause the RPC call to stuck at the Node + const sentTx: Web3PromiEvent< + TransactionReceipt, + SendTransactionEvents + > = web3.eth.sendTransaction({ + from: account1.address, + to: account2.address, + gas, + value: '0x1', + type: '0x1', + // Give a high nonce so the transaction stuck forever. + // However, make this random to be able to run the test many times without receiving an error that indicate submitting the same transaction twice. + nonce: Number.MAX_SAFE_INTEGER, + }); + + // Some providers (mostly used for development) will make blocks only when there are new transactions + // So, send 2 transactions, one after another, because in this test `transactionBlockTimeout = 2`. + // eslint-disable-next-line no-void, @typescript-eslint/no-unsafe-call + void sendFewSampleTxs(2); + + web3.eth.transactionBlockTimeout = 2; + + await expect(sentTx).rejects.toThrow(/was not mined within [0-9]+ blocks/); + + await expect(sentTx).rejects.toThrow(TransactionBlockTimeoutError); + + await closeOpenConnection(web3.eth); + }, + ); + }); +}); diff --git a/packages/web3-eth/test/integration/eth.test.ts b/packages/web3-eth/test/integration/eth.test.ts new file mode 100644 index 00000000000..99a096b40aa --- /dev/null +++ b/packages/web3-eth/test/integration/eth.test.ts @@ -0,0 +1,99 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocketProvider from 'web3-providers-ws'; +import HttpProvider from 'web3-providers-http'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract } from 'web3-eth-contract'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { SupportedProviders } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import { Web3Eth } from '../../src'; + +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + isHttp, + isWs, +} from '../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; + +describe('eth', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(() => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth(clientUrl); + contract = new Contract(BasicAbi, { + provider: clientUrl, + }); + }); + beforeEach(async () => { + tempAcc = await createTempAccount(); + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + it('setProvider', async () => { + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + const deployedContract = await contract.deploy(deployOptions).send(sendOptions); + const { provider } = web3Eth; + web3Eth.setProvider(deployedContract.provider as SupportedProviders); + + expect(web3Eth.provider).toBe(deployedContract.provider); + web3Eth.setProvider(provider as SupportedProviders); + }); + it('providers', () => { + const res = web3Eth.providers; + + expect(res.HttpProvider).toBeDefined(); + expect(res.WebsocketProvider).toBeDefined(); + }); + it('currentProvider', () => { + const { currentProvider } = web3Eth; + let checkWithClass; + if (isWs) { + checkWithClass = WebSocketProvider; + } else if (isHttp) { + checkWithClass = HttpProvider; + } else { + checkWithClass = IpcProvider; + } + expect(currentProvider).toBeInstanceOf(checkWithClass); + }); + it('givenProvider', () => { + const { givenProvider } = web3Eth; + expect(givenProvider).toBeUndefined(); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/get_revert_reason.test.ts b/packages/web3-eth/test/integration/get_revert_reason.test.ts new file mode 100644 index 00000000000..5318b06400c --- /dev/null +++ b/packages/web3-eth/test/integration/get_revert_reason.test.ts @@ -0,0 +1,227 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable jest/no-conditional-expect */ + +import { Address, Transaction, TransactionCall } from 'web3-types'; + +import Web3Eth from '../../src'; +import { getRevertReason } from '../../src/utils/get_revert_reason'; +import { SimpleRevertAbi, SimpleRevertDeploymentData } from '../fixtures/simple_revert'; +import { + createTempAccount, + getSystemTestBackend, + getSystemTestProvider, + BACKEND +} from '../fixtures/system_test_utils'; + +describe('Web3Eth.getRevertReason', () => { + let tempAccount: { address: string; privateKey: string }; + let web3Eth: Web3Eth; + let simpleRevertContractAddress: Address; + + beforeAll(async () => { + tempAccount = await createTempAccount(); + web3Eth = new Web3Eth(getSystemTestProvider()); + + const simpleRevertDeployTransaction: Transaction = { + from: tempAccount.address, + data: SimpleRevertDeploymentData, + }; + simpleRevertDeployTransaction.gas = await web3Eth.estimateGas( + simpleRevertDeployTransaction, + ); + simpleRevertContractAddress = (await web3Eth.sendTransaction(simpleRevertDeployTransaction)) + .contractAddress as Address; + }); + + it('should return reason for a contract call', async () => { + const transaction: TransactionCall = { + from: tempAccount.address, + to: simpleRevertContractAddress, + data: '0xf38fb65b', + }; + + const response = await getRevertReason(web3Eth, transaction); + + switch (getSystemTestBackend()) { + case BACKEND.GETH: + expect(response).toMatchObject({ + reason: 'execution reverted: This is a call revert', + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612063616c6c207265766572740000000000000000000000', + }); + break; + case BACKEND.HARDHAT: + expect(response).toMatchObject({ + reason: "Error: VM Exception while processing transaction: reverted with reason string 'This is a call revert'", + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612063616c6c207265766572740000000000000000000000', + }); + break; + default: + throw new Error( + `Unable to finish test, unknown backend: ${getSystemTestBackend()}`, + ); + } + }); + + it('should return reason for a contract send', async () => { + const transaction: TransactionCall = { + from: tempAccount.address, + to: simpleRevertContractAddress, + data: '0xba57a511000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000067265766572740000000000000000000000000000000000000000000000000000', + }; + + const response = await getRevertReason(web3Eth, transaction); + + switch (getSystemTestBackend()) { + case BACKEND.GETH: + expect(response).toMatchObject({ + reason: 'execution reverted: This is a send revert', + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + }); + break; + case BACKEND.HARDHAT: + expect(response).toMatchObject({ + reason: "Error: VM Exception while processing transaction: reverted with reason string 'This is a send revert'", + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + }); + break; + default: + throw new Error( + `Unable to finish test, unknown backend: ${getSystemTestBackend()}`, + ); + } + }); + + it('should return out of gas reason', async () => { + const transaction: TransactionCall = { + from: tempAccount.address, + to: simpleRevertContractAddress, + gas: '0x0', + data: '0xba57a511000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000067265766572740000000000000000000000000000000000000000000000000000', + }; + + const response = await getRevertReason(web3Eth, transaction); + switch (getSystemTestBackend()) { + case BACKEND.GETH: + expect(response).toBe( + 'err: intrinsic gas too low: have 0, want 21544 (supplied gas 0)', + ); + break; + case BACKEND.HARDHAT: + expect(response).toContain('Error: base fee exceeds gas limit'); + break; + default: + throw new Error( + `Unable to finish test, unknown backend: ${getSystemTestBackend()}`, + ); + } + }); + + it('should revert with custom error with no params', async () => { + const transaction: TransactionCall = { + from: tempAccount.address, + to: simpleRevertContractAddress, + data: '0x3ebf4d9c', + }; + + const response = await getRevertReason(web3Eth, transaction, SimpleRevertAbi); + switch (getSystemTestBackend()) { + case BACKEND.GETH: + expect(response).toMatchObject({ + data: '', + reason: 'execution reverted', + signature: '0x72090e4d', + customErrorName: 'ErrorWithNoParams', + customErrorDecodedSignature: 'ErrorWithNoParams()', + customErrorArguments: {}, + }); + break; + case BACKEND.HARDHAT: + expect(response).toMatchObject({ + data: '', + reason: "Error: VM Exception while processing transaction: reverted with an unrecognized custom error (return data: 0x72090e4d)", + signature: '0x72090e4d', + customErrorName: 'ErrorWithNoParams', + customErrorDecodedSignature: 'ErrorWithNoParams()', + customErrorArguments: {}, + }); + break; + default: + throw new Error( + `Unable to finish test, unknown backend: ${getSystemTestBackend()}`, + ); + } + }); + + it('should revert with custom error with params', async () => { + const transaction: TransactionCall = { + from: tempAccount.address, + to: simpleRevertContractAddress, + data: '0x819f48fe', + }; + + const response = await getRevertReason(web3Eth, transaction, SimpleRevertAbi); + switch (getSystemTestBackend()) { + case BACKEND.GETH: + expect(response).toMatchObject({ + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + reason: 'execution reverted', + signature: '0xc85bda60', + customErrorName: 'ErrorWithParams', + customErrorDecodedSignature: 'ErrorWithParams(uint256,string)', + customErrorArguments: { + code: BigInt(42), + message: 'This is an error with params', + }, + }); + break; + case BACKEND.HARDHAT: + expect(response).toMatchObject({ + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + reason: "Error: VM Exception while processing transaction: reverted with an unrecognized custom error (return data: 0xc85bda60000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000)", + signature: '0xc85bda60', + customErrorName: 'ErrorWithParams', + customErrorDecodedSignature: 'ErrorWithParams(uint256,string)', + customErrorArguments: { + code: BigInt(42), + message: 'This is an error with params', + }, + }); + break; + default: + throw new Error( + `Unable to finish test, unknown backend: ${getSystemTestBackend()}`, + ); + } + }); + + it("shouldn't return a revert reason", async () => { + const transaction: TransactionCall = { + from: tempAccount.address, + to: simpleRevertContractAddress, + data: '0xba57a51100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000', + }; + + const response = await getRevertReason(web3Eth, transaction); + expect(response).toBeUndefined(); + }); +}); diff --git a/packages/web3-eth/test/integration/helper.ts b/packages/web3-eth/test/integration/helper.ts new file mode 100644 index 00000000000..46063294702 --- /dev/null +++ b/packages/web3-eth/test/integration/helper.ts @@ -0,0 +1,142 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + AbiEventFragment, + Block, + TransactionInfo, + TransactionReceipt, + FMT_NUMBER, +} from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import Web3 from 'web3'; +import { BasicAbi } from '../shared_fixtures/build/Basic'; +import { + closeOpenConnection, + createAccount, + getSystemTestProvider, +} from '../fixtures/system_test_utils'; + +type SendFewTxParams = { + to?: string; + from: string; + value: string; + times?: number; + waitReceipt?: boolean; + gas?: string | number; +}; +export type Resolve = (value?: TransactionReceipt) => void; +export const sendFewTxes = async ({ + to, + value, + from, + times = 3, + gas, +}: SendFewTxParams): Promise => { + const res: TransactionReceipt[] = []; + const toAddress = to ?? createAccount().address; + const web3 = new Web3(getSystemTestProvider()); + for (let i = 0; i < times; i += 1) { + res.push( + // eslint-disable-next-line no-await-in-loop + await web3.eth.sendTransaction({ + to: toAddress, + value, + from, + gas: gas ?? '300000', + }), + ); + } + await closeOpenConnection(web3); + + return res; +}; + +const regexHex20 = /0[xX][0-9a-fA-F]{40}/i; +const regexHex32 = /0[xX][0-9a-fA-F]{64}/i; + +type ExpectOptions = { + type?: number; +}; +export const validateTransaction = ( + tx: TransactionInfo, + expectOptions: ExpectOptions = { type: 2 }, +) => { + expect(tx.nonce).toBeDefined(); + expect(tx.hash).toMatch(regexHex32); + expect(Number(tx.type)).toBe(expectOptions.type); + expect(tx.blockHash).toMatch(regexHex32); + expect(Number(tx.blockNumber)).toBeGreaterThan(0); + expect(tx.transactionIndex).toBeDefined(); + expect(tx.from).toMatch(regexHex20); + expect(tx.to).toMatch(regexHex20); + expect(Number(tx.value)).toBe(1); + expect(tx.input).toBe('0x'); + expect(tx.r).toBeDefined(); + expect(tx.s).toBeDefined(); + expect(Number(tx.gas)).toBeGreaterThan(0); +}; +export const validateBlock = (b: Block) => { + expect(b.nonce).toBeDefined(); + expect(Number(b.baseFeePerGas)).toBeGreaterThan(0); + expect(b.number).toBeDefined(); + expect(b.hash).toMatch(regexHex32); + expect(b.parentHash).toMatch(regexHex32); + expect(b.sha3Uncles).toMatch(regexHex32); + expect(b.transactionsRoot).toMatch(regexHex32); + expect(b.receiptsRoot).toMatch(regexHex32); + expect(b.logsBloom).toBeDefined(); + expect(b.miner).toMatch(regexHex20); + expect(b.difficulty).toBeDefined(); + expect(b.stateRoot).toMatch(regexHex32); + expect(b.gasLimit).toBeDefined(); + expect(b.gasUsed).toBeDefined(); + expect(b.timestamp).toBeDefined(); + expect(b.extraData).toBeDefined(); + expect(b.mixHash).toMatch(regexHex32); + expect(b.totalDifficulty).toBeDefined(); + expect(b.baseFeePerGas).toBeDefined(); + expect(b.size).toBeDefined(); + expect(Array.isArray(b.transactions)).toBe(true); + expect(Array.isArray(b.uncles)).toBe(true); +}; +export const validateReceipt = (r: TransactionReceipt) => { + expect(r.transactionHash).toMatch(regexHex32); + expect(r.transactionIndex).toBeDefined(); + expect(r.blockHash).toMatch(regexHex32); + expect(r.blockNumber).toBeDefined(); + expect(r.from).toMatch(regexHex20); + expect(r.to).toMatch(regexHex20); + expect(r.cumulativeGasUsed).toBeDefined(); + expect(r.gasUsed).toBeDefined(); + expect(r.effectiveGasPrice).toBeDefined(); + expect(r.logs).toBeDefined(); + expect(r.logsBloom).toBeDefined(); + expect(r.status).toBeDefined(); + expect(r.transactionHash).toMatch(regexHex32); + expect(Number(r.gasUsed)).toBeGreaterThan(0); +}; + +export const mapFormatToType: { [key: string]: string } = { + [FMT_NUMBER.NUMBER]: 'number', + [FMT_NUMBER.HEX]: 'string', + [FMT_NUMBER.STR]: 'string', + [FMT_NUMBER.BIGINT]: 'bigint', +}; +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +export const eventAbi: AbiEventFragment = BasicAbi.find((e: any) => { + return e.name === 'StringEvent' && (e as AbiEventFragment).type === 'event'; +})! as AbiEventFragment; diff --git a/packages/web3-eth/test/integration/jest.config.js b/packages/web3-eth/test/integration/jest.config.js new file mode 100644 index 00000000000..4e807a7b1fb --- /dev/null +++ b/packages/web3-eth/test/integration/jest.config.js @@ -0,0 +1,49 @@ +'use strict'; +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-eth/test/integration/nonce.test.ts b/packages/web3-eth/test/integration/nonce.test.ts new file mode 100644 index 00000000000..201c0728d5f --- /dev/null +++ b/packages/web3-eth/test/integration/nonce.test.ts @@ -0,0 +1,98 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { TransactionPollingTimeoutError, TransactionSendTimeoutError } from 'web3-errors'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { SupportedProviders, Web3 } from 'web3'; +import { Web3Account } from 'web3-eth-accounts'; +import { Web3Eth } from '../../src'; + +import { + closeOpenConnection, + createAccount, + createLocalAccount, + getSystemTestBackend, + getSystemTestProvider, + BACKEND +} from '../fixtures/system_test_utils'; + +const gas = 30000; + +describe('defaults', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + let tempAcc: Web3Account; + beforeEach(async () => { + clientUrl = getSystemTestProvider(); + const web3 = new Web3(clientUrl); + tempAcc = await createLocalAccount(web3); + web3Eth = web3.eth as unknown as Web3Eth; + }); + + afterEach(async () => { + await closeOpenConnection(web3Eth); + }); + + describe('defaults', () => { + it('should fail if Ethereum Node did not respond because of a high nonce', async () => { + // Make the test run faster by causing the timeout to happen after 0.2 second + web3Eth.transactionSendTimeout = 200; + web3Eth.transactionPollingTimeout = 200; + + const from = tempAcc.address; + const to = createAccount().address; + const value = `0x1`; + + try { + // Setting a high `nonce` when sending a transaction, to cause the RPC call to stuck at the Node + await web3Eth.sendTransaction({ + to, + value, + from, + gas, + // Give a high nonce so the transaction stuck forever. + // However, make this random to be able to run the test many times without receiving an error that indicate submitting the same transaction twice. + nonce: Number.MAX_SAFE_INTEGER, + }); + expect(true).toBe(false); // the test should fail if there is no exception + } catch (error) { + // Some providers would not respond to the RPC request when sending a transaction (like Ganache v7.4.0) + if (error instanceof TransactionSendTimeoutError) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.message).toContain( + `connected Ethereum Node did not respond within ${ + web3Eth.transactionSendTimeout / 1000 + } seconds`, + ); + } + // Some other providers would not respond when trying to get the transaction receipt (like Geth v1.10.22-unstable) + else if (error instanceof TransactionPollingTimeoutError) { + // eslint-disable-next-line jest/no-conditional-expect + expect(error.message).toContain( + `Transaction was not mined within ${ + web3Eth.transactionPollingTimeout / 1000 + } seconds`, + ); + } else if (getSystemTestBackend() === BACKEND.HARDHAT){ + // eslint-disable-next-line jest/no-conditional-expect + expect((error as any).message).toContain("Nonce too high") + } else { + throw error; + } + } + }); + }); +}); diff --git a/packages/web3-eth/test/integration/rpc.test.ts b/packages/web3-eth/test/integration/rpc.test.ts new file mode 100644 index 00000000000..d9ca6e5676b --- /dev/null +++ b/packages/web3-eth/test/integration/rpc.test.ts @@ -0,0 +1,485 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + AbiEventFragment, + TransactionReceipt, + TransactionInfo, + SupportedProviders, + FMT_BYTES, + FMT_NUMBER, +} from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract, decodeEventABI } from 'web3-eth-contract'; +import { hexToNumber, hexToString, numberToHex, getStorageSlotNumForLongString } from 'web3-utils'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3Eth } from '../../src'; + +import { + closeOpenConnection, + getSystemTestBackend, + getSystemTestProvider, + createNewAccount, + itIf, + createTempAccount, + describeIf, + BACKEND +} from '../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { + eventAbi, + mapFormatToType, + sendFewTxes, + validateReceipt, + validateTransaction, +} from './helper'; + +describe('rpc', () => { + let web3Eth: Web3Eth; + let clientUrl: string | SupportedProviders; + let contractDeployed: Contract; + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + let tempAcc: { address: string; privateKey: string }; + let tempAcc2: { address: string; privateKey: string }; + beforeAll(async () => { + clientUrl = getSystemTestProvider(); + web3Eth = new Web3Eth({ + provider: clientUrl, + config: { + transactionPollingTimeout: 2000, + }, + }); + contract = new Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + tempAcc = await createTempAccount(); + tempAcc2 = await createTempAccount(); + sendOptions = { from: tempAcc.address, gas: '1000000' }; + + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + await closeOpenConnection(contract); + }); + + describe('methods', () => { + itIf(!['geth', 'hardhat'].includes(getSystemTestBackend()))('getProtocolVersion', async () => { + const version = await web3Eth.getProtocolVersion(); + // eslint-disable-next-line jest/no-standalone-expect + expect(parseInt(version, 16)).toBeGreaterThan(0); + }); + + // TODO:in beta, test eth_syncing during sync mode with return obj having ( startingblock, currentBlock, heighestBlock ) + it('isSyncing', async () => { + const isSyncing = await web3Eth.isSyncing(); + expect(isSyncing).toBe(false); + }); + + // TODO: in future release, set coinbase account in node and match actual address here + it('getCoinbase', async () => { + const coinbase = await web3Eth.getCoinbase(); + expect(coinbase.startsWith('0x')).toBe(true); + expect(coinbase).toHaveLength(42); + }); + + itIf(getSystemTestBackend() !== BACKEND.HARDHAT)('isMining', async () => { + const isMining = await web3Eth.isMining(); + + if (getSystemTestBackend() !== BACKEND.GETH) + // eslint-disable-next-line jest/no-conditional-expect, jest/no-standalone-expect + expect(isMining).toBe(true); + }); + + describeIf(getSystemTestBackend() !== BACKEND.HARDHAT)('getHashRate', () => { + it.each(Object.values(FMT_NUMBER))('getHashRate', async format => { + const hashRate = await web3Eth.getHashRate({ + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + // eslint-disable-next-line jest/no-standalone-expect + expect(typeof hashRate).toBe(mapFormatToType[format as string]); + }); + }) + + it('getAccounts', async () => { + // hardhat does not have support importrawkey, so we can't add new accounts rather just check the default 20 accounts + if (getSystemTestBackend() !== BACKEND.HARDHAT) { + const account = await createNewAccount({ unlock: true }); + const accList = await web3Eth.getAccounts(); + const accListLowerCase = accList.map((add: string) => add.toLowerCase()); + // eslint-disable-next-line jest/no-conditional-expect + expect(accListLowerCase).toContain(account.address.toLowerCase()); + } else { + const accList = await web3Eth.getAccounts(); + // eslint-disable-next-line jest/no-conditional-expect + expect(accList).toHaveLength(20); + } + }); + + it.each(Object.values(FMT_NUMBER))('getBlockNumber', async format => { + const res = await web3Eth.getBlockNumber({ + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + expect(typeof res).toBe(mapFormatToType[format as string]); + expect(parseInt(String(res), 16)).toBeGreaterThan(0); + }); + + it.each(Object.values(FMT_NUMBER))('getGasPrice', async format => { + const res = await web3Eth.getGasPrice({ + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + expect(typeof res).toBe(mapFormatToType[format as string]); + expect(parseInt(String(res), 16)).toBeGreaterThan(0); + }); + + it.each(Object.values(FMT_NUMBER))('getBalance', async format => { + const value = '0xa'; + const newAccount = await createNewAccount(); + await web3Eth.sendTransaction({ + to: newAccount.address, + value, + from: tempAcc.address, + }); + const res = await web3Eth.getBalance(newAccount.address, undefined, { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + expect(typeof res).toBe(mapFormatToType[format as string]); + + expect(numberToHex(res)).toBe(value); + }); + + it('getStorageAt', async () => { + const numberData = 10; + const stringData = 'str'; + const boolData = true; + await contractDeployed.methods + ?.setValues(numberData, stringData, boolData) + .send(sendOptions); + const resNumber = await web3Eth.getStorageAt( + contractDeployed.options.address as string, + '0x0', + undefined, + ); + const resString = await web3Eth.getStorageAt( + contractDeployed.options.address as string, + '0x1', + undefined, + ); + const resBool = await web3Eth.getStorageAt( + contractDeployed.options.address as string, + '0x2', + undefined, + ); + + expect(Number(resNumber)).toBe(numberData); + + const rString = hexToString(resString.slice(0, resString.length / 2 + 1)) + .split('') + .filter(d => d !== '\x00') + .join(''); + + expect(rString).toHaveLength(stringData.length); + expect(rString).toEqual(stringData); + expect(Boolean(hexToNumber(resBool))).toBe(boolData); + + // long string data test + const stringDataLong = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In in interdum nibh, in viverra diam. Morbi eleifend diam sed erat malesuada molestie. Donec ultricies, mi et porta viverra, est magna tempus lorem, sit amet tempus mauris sapien vitae lacus. Duis at est quis nisl dictum accumsan eget et libero. Phasellus semper nibh et varius accumsan. Cras fringilla egestas dui, vitae bibendum enim tincidunt id. Donec condimentum lacinia nulla, eget elementum tortor tristique vel. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ac risus tellus. Etiam nec neque et erat efficitur laoreet. Maecenas fermentum feugiat diam, ut ultricies ipsum mollis at. In in velit turpis. Vestibulum urna ipsum, vestibulum ut cursus ut, ullamcorper quis est.'; + await contractDeployed.methods + ?.setValues(numberData, stringDataLong, boolData) + .send(sendOptions); + + const resStringLong = await web3Eth.getStorageAt( + contractDeployed.options.address as string, + 1, + undefined, + { + number: FMT_NUMBER.STR, + bytes: FMT_BYTES.HEX, + }, + ); + + const slotCount = Math.ceil((Number(hexToNumber(resStringLong)) - 1) / 64); + const slotDataNum = getStorageSlotNumForLongString(1); + const prs = []; + for (let i = 0; i < slotCount; i += 1) { + prs.push( + // eslint-disable-next-line no-await-in-loop + web3Eth.getStorageAt( + contractDeployed.options.address as string, + `0x${( + BigInt(String(hexToNumber(slotDataNum as string))) + BigInt(i) + ).toString(16)}`, + ), + ); + } + const str = (await Promise.all(prs)) + .map(t => hexToString(t)) + .join('') + .split('') + .filter(d => d !== '\x00') + .join(''); + expect(stringDataLong).toBe(str); + }); + + it.each(Object.values(FMT_NUMBER))('getCode', async format => { + const code = await web3Eth.getCode( + contractDeployed?.options?.address as string, + undefined, + { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }, + ); + expect(code).toBeDefined(); + expect(BasicBytecode.slice(-100)).toBe(code.slice(-100)); + }); + + it('getTransaction', async () => { + const [receipt] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + + const res = await web3Eth.getTransaction(receipt.transactionHash); + // TODO: after alpha release add tests for matching following (first get nonce of account sending tx and validate nonce with tx is incremented) + // TODO: after alpha release add tests for matching following (from and to addresses) + // TODO: after alpha release add tests for matching following (value transferred) + // TODO: after alpha release add tests for matching following (specify some random inputData in tx and validate in test with getTransaction) + + validateTransaction(res as TransactionInfo); + expect(res?.hash).toBe(receipt.transactionHash); + }); + it('check get transaction fields', async () => { + const receipt0 = await web3Eth.sendTransaction({ + from: tempAcc.address, + value: '0x1', + to: tempAcc2.address, + type: BigInt(0), + }); + const res0 = await web3Eth.getTransaction(receipt0.transactionHash); + + expect(res0.type).toBeDefined(); + expect(res0.hash).toBeDefined(); + expect(res0.nonce).toBeDefined(); + expect(res0.blockHash).toBeDefined(); + expect(res0.blockNumber).toBeDefined(); + expect(res0.transactionIndex).toBeDefined(); + expect(res0.from).toBeDefined(); + expect(res0.to).toBeDefined(); + expect(res0.value).toBeDefined(); + expect(res0.gas).toBeDefined(); + expect(res0.input).toBeDefined(); + expect(res0.r).toBeDefined(); + expect(res0.s).toBeDefined(); + expect(res0.v).toBeDefined(); + expect(res0.data).toBeDefined(); + expect(res0?.hash).toBe(receipt0.transactionHash); + + expect(res0.gasPrice).toBeDefined(); + + const receipt1 = await web3Eth.sendTransaction({ + from: tempAcc.address, + value: '0x1', + maxPriorityFeePerGas: BigInt(500000000), + maxFeePerGas: BigInt(500000000), + to: tempAcc2.address, + type: BigInt(1), + }); + const res1 = await web3Eth.getTransaction(receipt1.transactionHash); + expect(res1.type).toBeDefined(); + expect(res1.hash).toBeDefined(); + expect(res1.nonce).toBeDefined(); + expect(res1.blockHash).toBeDefined(); + expect(res1.blockNumber).toBeDefined(); + expect(res1.transactionIndex).toBeDefined(); + expect(res1.from).toBeDefined(); + expect(res1.to).toBeDefined(); + expect(res1.value).toBeDefined(); + expect(res1.gas).toBeDefined(); + expect(res1.input).toBeDefined(); + expect(res1.r).toBeDefined(); + expect(res1.s).toBeDefined(); + expect(res1.data).toBeDefined(); + expect(res1?.hash).toBe(receipt1.transactionHash); + expect(res1.gasPrice).toBeDefined(); + expect(res1.accessList).toBeDefined(); + + const receipt2 = await web3Eth.sendTransaction({ + from: tempAcc.address, + value: '0x1', + to: tempAcc2.address, + type: BigInt(2), + }); + const res2 = await web3Eth.getTransaction(receipt2.transactionHash); + + expect(res2.type).toBeDefined(); + expect(res2.hash).toBeDefined(); + expect(res2.nonce).toBeDefined(); + expect(res2.blockHash).toBeDefined(); + expect(res2.blockNumber).toBeDefined(); + expect(res2.transactionIndex).toBeDefined(); + expect(res2.from).toBeDefined(); + expect(res2.to).toBeDefined(); + expect(res2.value).toBeDefined(); + expect(res2.gas).toBeDefined(); + expect(res2.input).toBeDefined(); + expect(res2.r).toBeDefined(); + expect(res2.s).toBeDefined(); + expect(res2.data).toBeDefined(); + expect(res2?.hash).toBe(receipt2.transactionHash); + expect(res2.maxFeePerGas).toBeDefined(); + expect(res2.maxPriorityFeePerGas).toBeDefined(); + expect(res2.accessList).toBeDefined(); + expect(res2.gasPrice).toBeDefined(); + }); + + itIf(getSystemTestBackend() !== 'ganache')('getPendingTransactions', async () => { + const tx = web3Eth.sendTransaction({ + to: tempAcc2.address, + value: '0x1', + from: tempAcc.address, + }); + + const res = await web3Eth.getPendingTransactions(); + await tx; + // TODO: validate pending tx fields match with submitted tx + // TODO: investigate why res always is empty array + // eslint-disable-next-line jest/no-standalone-expect + expect(res).toBeDefined(); + }); + + it('getTransactionReceipt', async () => { + const [receipt] = await sendFewTxes({ + from: tempAcc.address, + value: '0x1', + times: 1, + }); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const res: TransactionReceipt = (await web3Eth.getTransactionReceipt( + // TODO: add more scenarios in future release with block number + receipt.transactionHash as string, + ))!; + validateReceipt(res); + expect(res?.transactionHash).toBe(receipt.transactionHash); + }); + + it('getChainId', async () => { + const res = await web3Eth.getChainId({ + number: FMT_NUMBER.NUMBER, + bytes: FMT_BYTES.HEX, + }); + // TODO: in next release validate chain ID , it should match with chain id of connected client + expect(Number(res)).toBeGreaterThan(0); + }); + + it('getNodeInfo', async () => { + const res = await web3Eth.getNodeInfo(); + // TODO: in next release, it should also be validated + expect(res).toBeDefined(); + }); + + itIf(!['geth', 'ganache'].includes(getSystemTestBackend()))('requestAccounts', () => { + // const res = await web3Eth.requestAccounts(); + // eslint-disable-next-line jest/no-standalone-expect + expect(true).toBe(true); + // expect(res[0]).toEqual(tempAcc.address); + }); + + // hardhat does not support getProof + itIf(getSystemTestBackend() !== BACKEND.HARDHAT)('getProof', async () => { + const numberData = BigInt(10); + const stringData = 'str'; + const boolData = true; + const sendRes = await contractDeployed.methods + .setValues(numberData, stringData, boolData) + .send(sendOptions); + await web3Eth.getStorageAt(contractDeployed.options.address as string, 0, undefined); + const res = await web3Eth.getProof( + contractDeployed.options.address as string, + ['0x0000000000000000000000000000000000000000000000000000000000000000'], + sendRes?.blockNumber, + ); + // eslint-disable-next-line jest/no-standalone-expect + expect(res.storageProof).toBeDefined(); + // eslint-disable-next-line jest/no-standalone-expect + expect(res.storageProof[0].value).toBe(numberData); + }); + + it('getPastLogs', async () => { + const listOfStrings = ['t1', 't2', 't3']; + const resTx = []; + for (const l of listOfStrings) { + // eslint-disable-next-line no-await-in-loop + resTx.push(await contractDeployed.methods?.firesStringEvent(l).send(sendOptions)); + } + + // test type hexstring + const res: Array = await web3Eth.getPastLogs({ + address: contractDeployed.options.address as string, + fromBlock: numberToHex(Math.min(...resTx.map(d => Number(d.blockNumber)))), + toBlock: numberToHex(1000), + }); + const results = res.map( + r => + decodeEventABI(eventAbi as AbiEventFragment & { signature: string }, r, []) + .returnValues[0], + ); + + // test type number + const res2: Array = await web3Eth.getPastLogs({ + address: contractDeployed.options.address as string, + fromBlock: Math.min(...resTx.map(d => Number(d.blockNumber))), + toBlock: 1000, + }); + const results2 = res2.map( + r => + decodeEventABI(eventAbi as AbiEventFragment & { signature: string }, r, []) + .returnValues[0], + ); + // test type BigInt + const res3: Array = await web3Eth.getPastLogs({ + address: contractDeployed.options.address as string, + fromBlock: BigInt(Math.min(...resTx.map(d => Number(d.blockNumber)))), + toBlock: BigInt(1000), + }); + const results3 = res3.map( + r => + decodeEventABI(eventAbi as AbiEventFragment & { signature: string }, r, []) + .returnValues[0], + ); + for (const l of listOfStrings) { + expect(results).toContain(l); + expect(results2).toContain(l); + expect(results3).toContain(l); + } + }); + }); +}); diff --git a/packages/web3-eth/test/integration/setup.js b/packages/web3-eth/test/integration/setup.js new file mode 100644 index 00000000000..19e711c511e --- /dev/null +++ b/packages/web3-eth/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = process.env.WEB3_SYSTEM_TEST_PROVIDER.includes('ipc') ? 60000 : 50000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-eth/test/integration/subscribe.test.ts b/packages/web3-eth/test/integration/subscribe.test.ts new file mode 100644 index 00000000000..9c6fc04b05b --- /dev/null +++ b/packages/web3-eth/test/integration/subscribe.test.ts @@ -0,0 +1,88 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocketProvider from 'web3-providers-ws'; +import { Web3BaseProvider } from 'web3-types'; +/* eslint-disable import/no-named-as-default */ +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import Web3Eth, { + LogsSubscription, + NewHeadsSubscription, + NewPendingTransactionsSubscription, + SyncingSubscription, +} from '../../src/index'; +import { + closeOpenConnection, + createTempAccount, + describeIf, + getSystemTestProviderUrl, + isSocket, + isWs, +} from '../fixtures/system_test_utils'; + +describeIf(isSocket)('subscribe', () => { + let web3Eth: Web3Eth; + let provider: WebSocketProvider | IpcProvider; + + beforeAll(() => { + provider = isWs + ? new WebSocketProvider(getSystemTestProviderUrl()) + : new IpcProvider(getSystemTestProviderUrl()); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + afterEach(async () => { + await web3Eth.clearSubscriptions(); + }); + + describe('subscribe to', () => { + it('newHeads', async () => { + web3Eth = new Web3Eth(provider as Web3BaseProvider); + await web3Eth.subscribe('newHeads'); + const subs = web3Eth?.subscriptionManager?.subscriptions; + const inst = subs?.get(Array.from(subs.keys())[0]); + expect(inst).toBeInstanceOf(NewHeadsSubscription); + }); + it('syncing', async () => { + web3Eth = new Web3Eth(provider as Web3BaseProvider); + await web3Eth.subscribe('syncing'); + const subs = web3Eth?.subscriptionManager?.subscriptions; + const inst = subs?.get(Array.from(subs.keys())[0]); + expect(inst).toBeInstanceOf(SyncingSubscription); + }); + it('newPendingTransactions', async () => { + web3Eth = new Web3Eth(provider as Web3BaseProvider); + await web3Eth.subscribe('newPendingTransactions'); + const subs = web3Eth?.subscriptionManager?.subscriptions; + const inst = subs?.get(Array.from(subs.keys())[0]); + expect(inst).toBeInstanceOf(NewPendingTransactionsSubscription); + }); + it('logs', async () => { + const tempAcc = await createTempAccount(); + web3Eth = new Web3Eth(provider as Web3BaseProvider); + await web3Eth.subscribe('logs', { + address: tempAcc.address, + }); + const subs = web3Eth?.subscriptionManager?.subscriptions; + const inst = subs?.get(Array.from(subs.keys())[0]); + expect(inst).toBeInstanceOf(LogsSubscription); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/subscription_heads.test.ts b/packages/web3-eth/test/integration/subscription_heads.test.ts new file mode 100644 index 00000000000..c801e5e83ef --- /dev/null +++ b/packages/web3-eth/test/integration/subscription_heads.test.ts @@ -0,0 +1,111 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockHeaderOutput, SupportedProviders } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3 } from 'web3'; +import { Web3Eth, NewHeadsSubscription } from '../../src'; +import { Resolve } from './helper'; +import { + closeOpenConnection, + describeIf, + getSystemTestProvider, + isSocket, + sendFewSampleTxs, + waitForOpenConnection, +} from '../fixtures/system_test_utils'; + +const checkTxCount = 2; +describeIf(isSocket)('subscription', () => { + let clientUrl: string | SupportedProviders; + let web3: Web3; + beforeEach(() => { + clientUrl = getSystemTestProvider(); + }); + describe('heads', () => { + it(`wait for ${checkTxCount} newHeads`, async () => { + web3 = new Web3(clientUrl); + const sub = await web3.eth.subscribe('newHeads'); + await waitForOpenConnection(web3.eth); + let times = 0; + const pr = new Promise((resolve: Resolve, reject) => { + sub.on('data', (data: BlockHeaderOutput) => { + try { + expect(typeof data.hash).toBe('string'); + expect(typeof data.parentHash).toBe('string'); + expect(typeof data.receiptsRoot).toBe('string'); + expect(typeof data.miner).toBe('string'); + expect(typeof data.stateRoot).toBe('string'); + expect(typeof data.transactionsRoot).toBe('string'); + expect(typeof data.logsBloom).toBe('string'); + expect(typeof data.difficulty).toBe('bigint'); + expect(typeof data.number).toBe('bigint'); + expect(typeof data.gasLimit).toBe('bigint'); + expect(typeof data.gasUsed).toBe('bigint'); + expect(typeof data.timestamp).toBe('bigint'); + expect(typeof data.extraData).toBe('string'); + expect(typeof data.nonce).toBe('bigint'); + expect(typeof data.sha3Uncles).toBe('string'); + expect(typeof data.baseFeePerGas).toBe('bigint'); + expect(typeof data.mixHash).toBe('string'); + } catch (error) { + reject(error); + } + + times += 1; + expect(times).toBeGreaterThanOrEqual(times); + if (times >= checkTxCount) { + resolve(); + } + }); + sub.on('error', error => { + reject(error); + }); + }); + // eslint-disable-next-line no-void + void sendFewSampleTxs(checkTxCount); + + await pr; + sub.off('data', () => { + // do nothing + }); + await web3.eth.subscriptionManager?.removeSubscription(sub); + await closeOpenConnection(web3.eth); + }); + it(`remove at subscriptionManager`, async () => { + const web3Eth = new Web3Eth(clientUrl); + await waitForOpenConnection(web3Eth); + const sub: NewHeadsSubscription = await web3Eth.subscribe('newHeads'); + expect(sub.id).toBeDefined(); + const subId = sub.id as string; + await web3Eth.subscriptionManager?.removeSubscription(sub); + expect(web3Eth.subscriptionManager.subscriptions.has(subId)).toBe(false); + expect(sub.id).toBeUndefined(); + await closeOpenConnection(web3Eth); + }); + it(`remove at subscribe object`, async () => { + const web3Eth = new Web3Eth(clientUrl); + await waitForOpenConnection(web3Eth); + const sub: NewHeadsSubscription = await web3Eth.subscribe('newHeads'); + expect(sub.id).toBeDefined(); + const subId = sub.id as string; + await sub.unsubscribe(); + expect(web3Eth.subscriptionManager.subscriptions.has(subId)).toBe(false); + expect(sub.id).toBeUndefined(); + await closeOpenConnection(web3Eth); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/subscription_logs.test.ts b/packages/web3-eth/test/integration/subscription_logs.test.ts new file mode 100644 index 00000000000..748aadab99c --- /dev/null +++ b/packages/web3-eth/test/integration/subscription_logs.test.ts @@ -0,0 +1,121 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocketProvider from 'web3-providers-ws'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract, decodeEventABI } from 'web3-eth-contract'; +import { AbiEventFragment, Web3BaseProvider } from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import { Web3Eth } from '../../src'; +import { LogsSubscription } from '../../src/web3_subscriptions'; +import { + closeOpenConnection, + createTempAccount, + describeIf, + getSystemTestProviderUrl, + isSocket, + isWs, +} from '../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { eventAbi, Resolve } from './helper'; + +const checkEventCount = 2; + +type MakeFewTxToContract = { + sendOptions: Record; + contract: Contract; + testDataString: string; +}; +const makeFewTxToContract = async ({ + contract, + sendOptions, + testDataString, +}: MakeFewTxToContract): Promise => { + const prs = []; + for (let i = 0; i < checkEventCount; i += 1) { + // eslint-disable-next-line no-await-in-loop + prs.push(await contract.methods?.firesStringEvent(testDataString).send(sendOptions)); + } +}; +describeIf(isSocket)('subscription', () => { + let clientUrl: string; + let web3Eth: Web3Eth; + let provider: WebSocketProvider | IpcProvider; + let contract: Contract; + let contractDeployed: Contract; + let deployOptions: Record; + let sendOptions: Record; + const testDataString = 'someTestString'; + let tempAcc: { address: string; privateKey: string }; + + beforeEach(async () => { + tempAcc = await createTempAccount(); + clientUrl = getSystemTestProviderUrl(); + provider = isWs ? new WebSocketProvider(clientUrl) : new IpcProvider(clientUrl); + contract = new Contract(BasicAbi, undefined, { + provider, + }); + }); + afterEach(async () => { + provider.disconnect(); + await closeOpenConnection(web3Eth); + }); + + describe('logs', () => { + it(`wait for ${checkEventCount} logs`, async () => { + web3Eth = new Web3Eth(provider as Web3BaseProvider); + const from = tempAcc.address; + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + + sendOptions = { from, gas: '1000000' }; + contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + + const sub: LogsSubscription = await web3Eth.subscribe('logs', { + address: contractDeployed.options.address, + }); + + let count = 0; + + const pr = new Promise((resolve: Resolve) => { + sub.on('data', (data: any) => { + count += 1; + const decodedData = decodeEventABI( + eventAbi as AbiEventFragment & { signature: string }, + data, + [], + ); + expect(decodedData.returnValues['0']).toBe(testDataString); + if (count >= checkEventCount) { + resolve(); + } + }); + }); + + await makeFewTxToContract({ + contract: contractDeployed, + sendOptions, + testDataString, + }); + + await pr; + await web3Eth.clearSubscriptions(); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/subscription_logs_block.test.ts b/packages/web3-eth/test/integration/subscription_logs_block.test.ts new file mode 100644 index 00000000000..0509224d90e --- /dev/null +++ b/packages/web3-eth/test/integration/subscription_logs_block.test.ts @@ -0,0 +1,117 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocketProvider from 'web3-providers-ws'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Contract, decodeEventABI } from 'web3-eth-contract'; +import { AbiEventFragment, Web3BaseProvider } from 'web3-types'; +import { numberToHex } from 'web3-utils'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import { Web3Eth } from '../../src'; +import { LogsSubscription } from '../../src/web3_subscriptions'; +import { + closeOpenConnection, + createTempAccount, + describeIf, + getSystemTestProviderUrl, + isSocket, + isWs, +} from '../fixtures/system_test_utils'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { eventAbi, Resolve } from './helper'; + +const checkEventCount = 2; + +type MakeFewTxToContract = { + sendOptions: Record; + contract: Contract; + testDataString: string; +}; +const makeFewTxToContract = async ({ + contract, + sendOptions, + testDataString, +}: MakeFewTxToContract): Promise => { + const prs = []; + for (let i = 0; i < checkEventCount; i += 1) { + // eslint-disable-next-line no-await-in-loop + prs.push(await contract.methods?.firesStringEvent(testDataString).send(sendOptions)); + } +}; +describeIf(isSocket)('subscription', () => { + let clientUrl: string; + let providerWs: WebSocketProvider | IpcProvider; + let contract: Contract; + const testDataString = 'someTestString'; + + beforeAll(() => { + clientUrl = getSystemTestProviderUrl(); + providerWs = isWs ? new WebSocketProvider(clientUrl) : new IpcProvider(clientUrl); + contract = new Contract(BasicAbi, undefined, { + provider: providerWs, + }); + }); + afterAll(async () => { + providerWs.disconnect(); + await closeOpenConnection(contract); + }); + + describe('logs', () => { + it(`wait for ${checkEventCount} logs with from block`, async () => { + const tempAcc = await createTempAccount(); + const from = tempAcc.address; + const deployOptions: Record = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + + const sendOptions = { from, gas: '1000000' }; + const contractDeployed = await contract.deploy(deployOptions).send(sendOptions); + const web3Eth = new Web3Eth(providerWs as Web3BaseProvider); + const fromBlock = await web3Eth.getTransactionCount( + String(contractDeployed.options.address), + ); + + await makeFewTxToContract({ contract: contractDeployed, sendOptions, testDataString }); + + const sub: LogsSubscription = await web3Eth.subscribe('logs', { + fromBlock: numberToHex(fromBlock), + address: contractDeployed.options.address, + }); + + let count = 0; + + const pr = new Promise((resolve: Resolve) => { + sub.on('data', (data: any) => { + count += 1; + const decodedData = decodeEventABI( + eventAbi as AbiEventFragment & { signature: string }, + data, + [], + ); + expect(decodedData.returnValues['0']).toBe(testDataString); + if (count >= checkEventCount) { + resolve(); + } + }); + }); + + await pr; + await web3Eth.clearSubscriptions(); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/subscription_logs_clear.test.ts b/packages/web3-eth/test/integration/subscription_logs_clear.test.ts new file mode 100644 index 00000000000..798d45c60d3 --- /dev/null +++ b/packages/web3-eth/test/integration/subscription_logs_clear.test.ts @@ -0,0 +1,43 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Eth } from '../../src'; +import { + closeOpenConnection, + describeIf, + getSystemTestProvider, + isSocket, +} from '../fixtures/system_test_utils'; +import { LogsSubscription } from '../../src/web3_subscriptions'; + +describeIf(isSocket)('subscription', () => { + let web3Eth: Web3Eth; + beforeAll(() => { + web3Eth = new Web3Eth(getSystemTestProvider()); + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + describe('logs', () => { + it(`clear`, async () => { + const sub: LogsSubscription = await web3Eth.subscribe('logs'); + expect(sub.id).toBeDefined(); + await web3Eth.clearSubscriptions(); + expect(sub.id).toBeUndefined(); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/subscription_new_pending_tx.test.ts b/packages/web3-eth/test/integration/subscription_new_pending_tx.test.ts new file mode 100644 index 00000000000..86e20626d6f --- /dev/null +++ b/packages/web3-eth/test/integration/subscription_new_pending_tx.test.ts @@ -0,0 +1,104 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3 } from 'web3'; +import { Web3Eth, NewPendingTransactionsSubscription } from '../../src'; +import { + closeOpenConnection, + describeIf, + getSystemTestProvider, + isSocket, + sendFewSampleTxs, + waitForOpenConnection, +} from '../fixtures/system_test_utils'; + +const checkTxCount = 2; +describeIf(isSocket)('subscription', () => { + describe('new pending transaction', () => { + it(`wait ${checkTxCount} transaction`, async () => { + const web3 = new Web3(getSystemTestProvider()); + const web3Eth = web3.eth; + await waitForOpenConnection(web3Eth); + const sub = await web3Eth.subscribe('pendingTransactions'); + + let times = 0; + const txHashes: string[] = []; + let receipts: string[] = []; + const pr = new Promise((resolve: (s?: string) => void) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + (async () => { + let waitList: string[] = []; + sub.on('data', (data: string) => { + if (receipts.length > 0 && waitList.length > 0) { + for (const hash of waitList) { + if (receipts.includes(hash)) { + txHashes.push(hash); + times += 1; + } + } + waitList = []; + } + if (receipts.length > 0 && receipts.includes(data)) { + txHashes.push(data); + times += 1; + } else { + waitList.push(data); + } + + if (times >= checkTxCount) { + resolve(); + } + }); + receipts = (await sendFewSampleTxs(checkTxCount)).map(r => + String(r?.transactionHash), + ); + if (receipts.length > 0 && waitList.length > 0) { + for (const hash of waitList) { + if (receipts.includes(hash)) { + txHashes.push(hash); + times += 1; + } + } + waitList = []; + } + if (times >= checkTxCount) { + sub.off('data', () => { + // no need to do anything + }); + resolve(); + } + })(); + }); + await pr; + for (const hash of txHashes) { + expect(receipts).toContain(hash); + } + await closeOpenConnection(web3Eth); + }); + it(`clear`, async () => { + const web3Eth = new Web3Eth(getSystemTestProvider()); + await waitForOpenConnection(web3Eth); + const sub: NewPendingTransactionsSubscription = await web3Eth.subscribe( + 'pendingTransactions', + ); + expect(sub.id).toBeDefined(); + await web3Eth.subscriptionManager?.removeSubscription(sub); + expect(sub.id).toBeUndefined(); + await closeOpenConnection(web3Eth); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/subscription_on_2_events.test.ts b/packages/web3-eth/test/integration/subscription_on_2_events.test.ts new file mode 100644 index 00000000000..bfcfb99da92 --- /dev/null +++ b/packages/web3-eth/test/integration/subscription_on_2_events.test.ts @@ -0,0 +1,114 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { BlockHeaderOutput, Web3 } from 'web3'; +import { + closeOpenConnection, + describeIf, + getSystemTestProvider, + isSocket, + sendFewSampleTxs, + waitForOpenConnection, +} from '../fixtures/system_test_utils'; +import { Resolve } from './helper'; + +const checkTxCount = 2; +describeIf(isSocket)('subscription on multiple events', () => { + test(`catch the data of pendingTransactions and newHeads`, async () => { + const web3 = new Web3(getSystemTestProvider()); + const web3Eth = web3.eth; + await waitForOpenConnection(web3Eth); + const pendingTransactionsSub = await web3Eth.subscribe('pendingTransactions'); + + let pendingTransactionsCount = 0; + const pendingTransactionsData = new Promise((resolve: Resolve, reject) => { + (() => { + pendingTransactionsSub.on('data', (data: string) => { + expect(typeof data).toBe('string'); + + pendingTransactionsCount += 1; + if (pendingTransactionsCount >= checkTxCount) { + resolve(); + } + }); + pendingTransactionsSub.on('error', error => { + reject(error); + }); + })(); + }); + + const newHeadsSub = await web3.eth.subscribe('newHeads'); + let newHeadsCount = 0; + const newHeadsData = new Promise((resolve: Resolve, reject) => { + newHeadsSub.on('data', (data: BlockHeaderOutput) => { + expect(typeof data.parentHash).toBe('string'); + + newHeadsCount += 1; + if (newHeadsCount >= checkTxCount) { + resolve(); + } + }); + newHeadsSub.on('error', error => { + reject(error); + }); + }); + + await sendFewSampleTxs(2); + + await pendingTransactionsData; + await newHeadsData; + + await closeOpenConnection(web3Eth); + }); + + test(`catch the data of an event even after subscribing off another one`, async () => { + const web3 = new Web3(getSystemTestProvider()); + const web3Eth = web3.eth; + await waitForOpenConnection(web3Eth); + const pendingTransactionsSub = await web3Eth.subscribe('pendingTransactions'); + + // eslint-disable-next-line @typescript-eslint/no-empty-function + pendingTransactionsSub.on('data', () => {}); + pendingTransactionsSub.on('error', error => { + throw error; + }); + + const newHeadsSub = await web3.eth.subscribe('newHeads'); + let times = 0; + const newHeadsData = new Promise((resolve: Resolve, reject) => { + newHeadsSub.on('data', (data: BlockHeaderOutput) => { + expect(typeof data.parentHash).toBe('string'); + + times += 1; + if (times >= checkTxCount) { + resolve(); + } + }); + newHeadsSub.on('error', error => { + reject(error); + }); + }); + + await pendingTransactionsSub.unsubscribe(); + + await sendFewSampleTxs(2); + + await newHeadsData; + + await closeOpenConnection(web3Eth); + }); +}); diff --git a/packages/web3-eth/test/integration/unsubscribe.test.ts b/packages/web3-eth/test/integration/unsubscribe.test.ts new file mode 100644 index 00000000000..4c74e10eb25 --- /dev/null +++ b/packages/web3-eth/test/integration/unsubscribe.test.ts @@ -0,0 +1,77 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocketProvider from 'web3-providers-ws'; +import { Web3BaseProvider } from 'web3-types'; +/* eslint-disable import/no-extraneous-dependencies */ +import { IpcProvider } from 'web3-providers-ipc'; +import Web3Eth from '../../src/index'; +import { NewHeadsSubscription, SyncingSubscription } from '../../src/web3_subscriptions'; +import { + getSystemTestProviderUrl, + describeIf, + isWs, + isSocket, + closeOpenConnection, + waitForOpenConnection, +} from '../fixtures/system_test_utils'; + +describeIf(isSocket)('unsubscribe', () => { + let web3Eth: Web3Eth; + let provider: WebSocketProvider | IpcProvider; + beforeAll(() => { + provider = isWs + ? new WebSocketProvider(getSystemTestProviderUrl()) + : new IpcProvider(getSystemTestProviderUrl()); + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + describe('unsubscribe from', () => { + it('should clearSubscriptions', async () => { + web3Eth = new Web3Eth(provider as Web3BaseProvider); + await web3Eth.subscribe('newHeads'); + const subs = web3Eth?.subscriptionManager?.subscriptions; + const inst = subs?.get(Array.from(subs.keys())[0]); + expect(inst).toBeInstanceOf(NewHeadsSubscription); + await waitForOpenConnection(web3Eth); + await web3Eth.clearSubscriptions(); + expect(web3Eth?.subscriptionManager?.subscriptions?.size).toBe(0); + }); + + it('subscribe to all and clear all except syncing', async () => { + web3Eth = new Web3Eth(provider as Web3BaseProvider); + await web3Eth.subscribe('newHeads'); + await web3Eth.subscribe('newPendingTransactions'); + await web3Eth.subscribe('syncing'); + await web3Eth.subscribe('logs', { + address: '0x8320fe7702b96808f7bbc0d4a888ed1468216cfd', + topics: ['0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902'], + }); + expect(web3Eth?.subscriptionManager?.subscriptions.size).toBe(4); + + await waitForOpenConnection(web3Eth); + + await web3Eth.clearSubscriptions(true); + + const subs = web3Eth?.subscriptionManager?.subscriptions; + const inst = subs?.get(Array.from(subs.keys())[0]); + expect(inst).toBeInstanceOf(SyncingSubscription); + expect(web3Eth?.subscriptionManager?.subscriptions.size).toBe(1); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/watch_transaction.test.ts b/packages/web3-eth/test/integration/watch_transaction.test.ts new file mode 100644 index 00000000000..4aa607c8fdd --- /dev/null +++ b/packages/web3-eth/test/integration/watch_transaction.test.ts @@ -0,0 +1,92 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SupportedProviders, TransactionReceipt, DEFAULT_RETURN_FORMAT } from 'web3-types'; +import { Web3PromiEvent } from 'web3-core'; +import { Web3Account } from 'web3-eth-accounts'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3 } from 'web3'; +import { SendTransactionEvents } from '../../src'; +import { + getSystemTestProvider, + describeIf, + closeOpenConnection, + isSocket, + waitForOpenConnection, + createLocalAccount, + isIpc, + sendFewSampleTxs, + createAccount, +} from '../fixtures/system_test_utils'; + +const waitConfirmations = 2; +const gas = 30000; +type Resolve = (value?: unknown) => void; + +describeIf(isSocket)('watch subscription transaction', () => { + let web3: Web3; + let clientUrl: string | SupportedProviders; + let account1: Web3Account; + let account2: Web3Account; + beforeEach(async () => { + clientUrl = getSystemTestProvider(); + web3 = new Web3(clientUrl); + account1 = await createLocalAccount(web3); + account2 = createAccount(); + await waitForOpenConnection(web3.eth); + }); + describe('wait for confirmation subscription', () => { + it('subscription to heads', async () => { + web3.eth.setConfig({ transactionConfirmationBlocks: waitConfirmations }); + + const sentTx: Web3PromiEvent< + TransactionReceipt, + SendTransactionEvents + > = web3.eth.sendTransaction({ + from: account1.address, + to: account2.address, + value: '0x1', + gas, + }); + + const receiptPromise = new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on('receipt', (params: TransactionReceipt) => { + expect(params.status).toBe(BigInt(1)); + resolve(); + }); + }); + + let shouldBe = 1; + const confirmationPromise = new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on('confirmation', ({ confirmations }) => { + expect(Number(confirmations)).toBeGreaterThanOrEqual(shouldBe); + shouldBe += 1; + if (shouldBe >= waitConfirmations) { + resolve(); + } + }); + }); + await receiptPromise; + await sendFewSampleTxs(isIpc ? 2 * waitConfirmations : waitConfirmations); + await confirmationPromise; + await closeOpenConnection(web3.eth); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/watch_transaction_polling.test.ts b/packages/web3-eth/test/integration/watch_transaction_polling.test.ts new file mode 100644 index 00000000000..3677120e125 --- /dev/null +++ b/packages/web3-eth/test/integration/watch_transaction_polling.test.ts @@ -0,0 +1,98 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { DEFAULT_RETURN_FORMAT } from 'web3-types'; +import { Web3PromiEvent } from 'web3-core'; +import { SupportedProviders, TransactionReceipt } from 'web3-types'; +import { Web3Eth, SendTransactionEvents } from '../../src'; + +import { + closeOpenConnection, + createTempAccount, + describeIf, + getSystemTestProvider, + isHttp, +} from '../fixtures/system_test_utils'; + +const waitConfirmations = 3; + +type Resolve = (value?: unknown) => void; + +describeIf(isHttp)('watch polling transaction', () => { + let clientUrl: string | SupportedProviders; + let tempAcc: { address: string; privateKey: string }; + let tempAcc2: { address: string; privateKey: string }; + + beforeEach(async () => { + tempAcc = await createTempAccount(); + tempAcc2 = await createTempAccount(); + }); + beforeAll(() => { + clientUrl = getSystemTestProvider(); + }); + + describe('wait for confirmation polling', () => { + it('polling', async () => { + const web3Eth = new Web3Eth(clientUrl); + web3Eth.setConfig({ transactionConfirmationBlocks: waitConfirmations }); + + const from = tempAcc.address; + const to = tempAcc2.address; + const value = `0x1`; + + const sentTx: Web3PromiEvent< + TransactionReceipt, + SendTransactionEvents + > = web3Eth.sendTransaction({ + to, + value, + from, + }); + const confirmationPromise = new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on( + 'confirmation', + async ({ confirmations }: { confirmations: bigint }) => { + if (confirmations >= waitConfirmations) { + resolve(); + } else { + // Send a transaction to cause dev providers creating new blocks to fire the 'confirmation' event again. + await web3Eth.sendTransaction({ + to, + value, + from, + }); + } + }, + ); + }); + await new Promise((resolve: Resolve) => { + // Tx promise is handled separately + // eslint-disable-next-line no-void + void sentTx.on('receipt', (params: TransactionReceipt) => { + expect(params.status).toBe(BigInt(1)); + resolve(); + }); + }); + + await sentTx; + await confirmationPromise; + sentTx.removeAllListeners(); + await closeOpenConnection(web3Eth); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/call.test.ts b/packages/web3-eth/test/integration/web3_eth/call.test.ts new file mode 100644 index 00000000000..4f22a29876e --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/call.test.ts @@ -0,0 +1,136 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { TransactionCall, BlockTags, Transaction } from 'web3-types'; +import { decodeParameters } from 'web3-eth-abi'; +import { Web3Eth } from '../../../src'; +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, +} from '../../fixtures/system_test_utils'; + +describe('Web3Eth.call', () => { + const expectedEncodedGreet = + '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000'; + const expectedDecodedGreet = 'solyent green is people'; + const greetCallData = '0xcfae3217'; + const greeterAbiFragment = { + inputs: [], + name: 'greet', + outputs: [ + { + name: '', + type: 'string', + }, + ], + stateMutability: 'view', + type: 'function', + }; + + let web3Eth: Web3Eth; + let greeterContractAddress: string; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + const greeterContractDeploymentData = + '0x60806040523480156200001157600080fd5b5060405162000a6a38038062000a6a8339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b505062000359565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61070180620003696000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae32171461006c575b600080fd5b6100556004803603810190610050919061043f565b61008a565b60405161006392919061052b565b60405180910390f35b6100746101b0565b604051610081919061055b565b60405180910390f35b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756000846040516100c0929190610672565b60405180910390a182600090805190602001906100de929190610242565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600060405161010f91906106a9565b60405180910390a160016000808054610127906105ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610153906105ac565b80156101a05780601f10610175576101008083540402835291602001916101a0565b820191906000526020600020905b81548152906001019060200180831161018357829003601f168201915b5050505050905091509150915091565b6060600080546101bf906105ac565b80601f01602080910402602001604051908101604052809291908181526020018280546101eb906105ac565b80156102385780601f1061020d57610100808354040283529160200191610238565b820191906000526020600020905b81548152906001019060200180831161021b57829003601f168201915b5050505050905090565b82805461024e906105ac565b90600052602060002090601f01602090048101928261027057600085556102b7565b82601f1061028957805160ff19168380011785556102b7565b828001600101855582156102b7579182015b828111156102b657825182559160200191906001019061029b565b5b5090506102c491906102c8565b5090565b5b808211156102e15760008160009055506001016102c9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61034c82610303565b810181811067ffffffffffffffff8211171561036b5761036a610314565b5b80604052505050565b600061037e6102e5565b905061038a8282610343565b919050565b600067ffffffffffffffff8211156103aa576103a9610314565b5b6103b382610303565b9050602081019050919050565b82818337600083830152505050565b60006103e26103dd8461038f565b610374565b9050828152602081018484840111156103fe576103fd6102fe565b5b6104098482856103c0565b509392505050565b600082601f830112610426576104256102f9565b5b81356104368482602086016103cf565b91505092915050565b600060208284031215610455576104546102ef565b5b600082013567ffffffffffffffff811115610473576104726102f4565b5b61047f84828501610411565b91505092915050565b60008115159050919050565b61049d81610488565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104dd5780820151818401526020810190506104c2565b838111156104ec576000848401525b50505050565b60006104fd826104a3565b61050781856104ae565b93506105178185602086016104bf565b61052081610303565b840191505092915050565b60006040820190506105406000830185610494565b818103602083015261055281846104f2565b90509392505050565b6000602082019050818103600083015261057581846104f2565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806105c457607f821691505b6020821081036105d7576105d661057d565b5b50919050565b60008190508160005260206000209050919050565b600081546105ff816105ac565b61060981866104ae565b94506001821660008114610624576001811461063657610669565b60ff1983168652602086019350610669565b61063f856105dd565b60005b8381101561066157815481890152600182019150602081019050610642565b808801955050505b50505092915050565b6000604082019050818103600083015261068c81856105f2565b905081810360208301526106a081846104f2565b90509392505050565b600060208201905081810360008301526106c381846105f2565b90509291505056fea2646970667358221220fe0f28c9f8ef0a13a95934b974e7bc2ca6762b40a5b93ccd6ca2038f454bf52764736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000'; + tempAcc = await createTempAccount(); + const transaction: Transaction = { + from: tempAcc.address, + data: greeterContractDeploymentData, + gas: '0x742b8', + }; + const response = await web3Eth.sendTransaction(transaction); + greeterContractAddress = response.contractAddress as string; + }); + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + it('should make a call to deployed Greeter contract', async () => { + const transaction: TransactionCall = { + from: tempAcc.address, + to: greeterContractAddress, + data: greetCallData, + }; + const response = await web3Eth.call(transaction); + expect(response).toBe(expectedEncodedGreet); + const decodedResult = decodeParameters([...greeterAbiFragment.outputs], response)[0]; + expect(decodedResult).toBe(expectedDecodedGreet); + }); + + describe('blockNumber parameter', () => { + it('should return no data (0x) for call to deployed Greeter contract with blockNumber = EARLIEST', async () => { + const transaction: TransactionCall = { + from: tempAcc.address, + to: greeterContractAddress, + data: greetCallData, + }; + const response = await web3Eth.call(transaction, BlockTags.EARLIEST); + expect(response).toBe('0x'); + }); + + it('should return expectedDecodedGreet for call to deployed Greeter contract with blockNumber = LATEST', async () => { + const transaction: TransactionCall = { + from: tempAcc.address, + to: greeterContractAddress, + data: greetCallData, + }; + const response = await web3Eth.call(transaction, BlockTags.LATEST); + expect(response).toBe(expectedEncodedGreet); + const decodedResult = decodeParameters([...greeterAbiFragment.outputs], response)[0]; + expect(decodedResult).toBe(expectedDecodedGreet); + }); + + // TODO - Not sure if there is a better way to test PENDING BlockTag, + // but interacting with a contract that hasn't been mined yet doesn't make sense + it('should return expectedDecodedGreet for call to deployed Greeter contract with blockNumber = PENDING', async () => { + const transaction: TransactionCall = { + from: tempAcc.address, + to: greeterContractAddress, + data: greetCallData, + }; + const response = await web3Eth.call(transaction, BlockTags.PENDING); + expect(response).toBe(expectedEncodedGreet); + const decodedResult = decodeParameters([...greeterAbiFragment.outputs], response)[0]; + expect(decodedResult).toBe(expectedDecodedGreet); + }); + + it('should return no data (0x) for call to deployed Greeter contract with blockNumber = 0x0', async () => { + const transaction: TransactionCall = { + from: tempAcc.address, + to: greeterContractAddress, + data: greetCallData, + }; + const response = await web3Eth.call(transaction, '0x0'); + expect(response).toBe('0x'); + }); + + it('should return no data (0x) for call to deployed Greeter contract with web3Context.defaultBlock = EARLIEST', async () => { + web3Eth.defaultBlock = BlockTags.EARLIEST; + + const transaction: TransactionCall = { + from: tempAcc.address, + to: greeterContractAddress, + data: greetCallData, + }; + const response = await web3Eth.call(transaction); + expect(response).toBe('0x'); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/createAccessList.test.ts b/packages/web3-eth/test/integration/web3_eth/createAccessList.test.ts new file mode 100644 index 00000000000..3e1186c3cda --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/createAccessList.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AccessListResult, Transaction, TransactionForAccessList } from 'web3-types'; +import { Web3Eth } from '../../../src'; +import { + closeOpenConnection, + createTempAccount, + describeIf, + getSystemTestBackend, + getSystemTestProvider, + BACKEND +} from '../../fixtures/system_test_utils'; + +describeIf(getSystemTestBackend() === BACKEND.GETH)('Web3Eth.createAccessList', () => { + let web3Eth: Web3Eth; + let greeterContractAddress: string; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + const greeterContractDeploymentData = + '0x60806040523480156200001157600080fd5b5060405162000a6a38038062000a6a8339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b505062000359565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61070180620003696000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae32171461006c575b600080fd5b6100556004803603810190610050919061043f565b61008a565b60405161006392919061052b565b60405180910390f35b6100746101b0565b604051610081919061055b565b60405180910390f35b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756000846040516100c0929190610672565b60405180910390a182600090805190602001906100de929190610242565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600060405161010f91906106a9565b60405180910390a160016000808054610127906105ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610153906105ac565b80156101a05780601f10610175576101008083540402835291602001916101a0565b820191906000526020600020905b81548152906001019060200180831161018357829003601f168201915b5050505050905091509150915091565b6060600080546101bf906105ac565b80601f01602080910402602001604051908101604052809291908181526020018280546101eb906105ac565b80156102385780601f1061020d57610100808354040283529160200191610238565b820191906000526020600020905b81548152906001019060200180831161021b57829003601f168201915b5050505050905090565b82805461024e906105ac565b90600052602060002090601f01602090048101928261027057600085556102b7565b82601f1061028957805160ff19168380011785556102b7565b828001600101855582156102b7579182015b828111156102b657825182559160200191906001019061029b565b5b5090506102c491906102c8565b5090565b5b808211156102e15760008160009055506001016102c9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61034c82610303565b810181811067ffffffffffffffff8211171561036b5761036a610314565b5b80604052505050565b600061037e6102e5565b905061038a8282610343565b919050565b600067ffffffffffffffff8211156103aa576103a9610314565b5b6103b382610303565b9050602081019050919050565b82818337600083830152505050565b60006103e26103dd8461038f565b610374565b9050828152602081018484840111156103fe576103fd6102fe565b5b6104098482856103c0565b509392505050565b600082601f830112610426576104256102f9565b5b81356104368482602086016103cf565b91505092915050565b600060208284031215610455576104546102ef565b5b600082013567ffffffffffffffff811115610473576104726102f4565b5b61047f84828501610411565b91505092915050565b60008115159050919050565b61049d81610488565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104dd5780820151818401526020810190506104c2565b838111156104ec576000848401525b50505050565b60006104fd826104a3565b61050781856104ae565b93506105178185602086016104bf565b61052081610303565b840191505092915050565b60006040820190506105406000830185610494565b818103602083015261055281846104f2565b90509392505050565b6000602082019050818103600083015261057581846104f2565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806105c457607f821691505b6020821081036105d7576105d661057d565b5b50919050565b60008190508160005260206000209050919050565b600081546105ff816105ac565b61060981866104ae565b94506001821660008114610624576001811461063657610669565b60ff1983168652602086019350610669565b61063f856105dd565b60005b8381101561066157815481890152600182019150602081019050610642565b808801955050505b50505092915050565b6000604082019050818103600083015261068c81856105f2565b905081810360208301526106a081846104f2565b90509392505050565b600060208201905081810360008301526106c381846105f2565b90509291505056fea2646970667358221220fe0f28c9f8ef0a13a95934b974e7bc2ca6762b40a5b93ccd6ca2038f454bf52764736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000'; + tempAcc = await createTempAccount(); + const transaction: Transaction = { + from: tempAcc.address, + data: greeterContractDeploymentData, + gas: '0x744A0', + }; + const response = await web3Eth.sendTransaction(transaction); + greeterContractAddress = response.contractAddress as string; + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + test('should return access list for provided transaction', async () => { + const transaction: TransactionForAccessList = { + from: tempAcc.address, + to: greeterContractAddress, + data: '0xcfae3217', // greet function call data encoded + }; + + const response = await web3Eth.createAccessList(transaction); + + const expectedResponse: AccessListResult = { + accessList: [ + { + address: greeterContractAddress, + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000000', + ], + }, + ], + gasUsed: '0x68c5', + }; + + expect(response).toStrictEqual(expectedResponse); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/estimate_gas.test.ts b/packages/web3-eth/test/integration/web3_eth/estimate_gas.test.ts new file mode 100644 index 00000000000..e26de249a3e --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/estimate_gas.test.ts @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Transaction } from 'web3-types'; +import { Web3Eth } from '../../../src'; +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + itIf, + isGeth, + getSystemTestBackend, + BACKEND +} from '../../fixtures/system_test_utils'; + +describe('Web3Eth.estimateGas', () => { + let web3Eth: Web3Eth; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + tempAcc = await createTempAccount(); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + it('should estimate a simple value transfer', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + }; + const response = await web3Eth.estimateGas(transaction); + if (getSystemTestBackend() === BACKEND.HARDHAT) { + // eslint-disable-next-line jest/no-conditional-expect + expect(response).toBe(BigInt(21001)); + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(response).toBe(BigInt(21000)); + } + }); + + itIf(isGeth)('should estimate a contract deployment', async () => { + const greeterContractDeploymentData = + '0x60806040523480156200001157600080fd5b5060405162000a6a38038062000a6a8339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b505062000359565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61070180620003696000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae32171461006c575b600080fd5b6100556004803603810190610050919061043f565b61008a565b60405161006392919061052b565b60405180910390f35b6100746101b0565b604051610081919061055b565b60405180910390f35b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756000846040516100c0929190610672565b60405180910390a182600090805190602001906100de929190610242565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600060405161010f91906106a9565b60405180910390a160016000808054610127906105ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610153906105ac565b80156101a05780601f10610175576101008083540402835291602001916101a0565b820191906000526020600020905b81548152906001019060200180831161018357829003601f168201915b5050505050905091509150915091565b6060600080546101bf906105ac565b80601f01602080910402602001604051908101604052809291908181526020018280546101eb906105ac565b80156102385780601f1061020d57610100808354040283529160200191610238565b820191906000526020600020905b81548152906001019060200180831161021b57829003601f168201915b5050505050905090565b82805461024e906105ac565b90600052602060002090601f01602090048101928261027057600085556102b7565b82601f1061028957805160ff19168380011785556102b7565b828001600101855582156102b7579182015b828111156102b657825182559160200191906001019061029b565b5b5090506102c491906102c8565b5090565b5b808211156102e15760008160009055506001016102c9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61034c82610303565b810181811067ffffffffffffffff8211171561036b5761036a610314565b5b80604052505050565b600061037e6102e5565b905061038a8282610343565b919050565b600067ffffffffffffffff8211156103aa576103a9610314565b5b6103b382610303565b9050602081019050919050565b82818337600083830152505050565b60006103e26103dd8461038f565b610374565b9050828152602081018484840111156103fe576103fd6102fe565b5b6104098482856103c0565b509392505050565b600082601f830112610426576104256102f9565b5b81356104368482602086016103cf565b91505092915050565b600060208284031215610455576104546102ef565b5b600082013567ffffffffffffffff811115610473576104726102f4565b5b61047f84828501610411565b91505092915050565b60008115159050919050565b61049d81610488565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104dd5780820151818401526020810190506104c2565b838111156104ec576000848401525b50505050565b60006104fd826104a3565b61050781856104ae565b93506105178185602086016104bf565b61052081610303565b840191505092915050565b60006040820190506105406000830185610494565b818103602083015261055281846104f2565b90509392505050565b6000602082019050818103600083015261057581846104f2565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806105c457607f821691505b6020821081036105d7576105d661057d565b5b50919050565b60008190508160005260206000209050919050565b600081546105ff816105ac565b61060981866104ae565b94506001821660008114610624576001811461063657610669565b60ff1983168652602086019350610669565b61063f856105dd565b60005b8381101561066157815481890152600182019150602081019050610642565b808801955050505b50505092915050565b6000604082019050818103600083015261068c81856105f2565b905081810360208301526106a081846104f2565b90509392505050565b600060208201905081810360008301526106c381846105f2565b90509291505056fea2646970667358221220fe0f28c9f8ef0a13a95934b974e7bc2ca6762b40a5b93ccd6ca2038f454bf52764736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000'; + const transaction: Transaction = { + from: tempAcc.address, + data: greeterContractDeploymentData, + }; + const response = await web3Eth.estimateGas(transaction); + // eslint-disable-next-line jest/no-standalone-expect + expect(response).toBe(BigInt(480435)); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/getFeeHistory.test.ts b/packages/web3-eth/test/integration/web3_eth/getFeeHistory.test.ts new file mode 100644 index 00000000000..fd8aec67383 --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/getFeeHistory.test.ts @@ -0,0 +1,59 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, Numbers, SupportedProviders } from 'web3-types'; + +import Web3Eth from '../../../src'; +import { + getSystemTestProvider, + describeIf, + getSystemTestBackend, + closeOpenConnection, + BACKEND +} from '../../fixtures/system_test_utils'; +import { feeHistorySchema } from '../../../src/schemas'; + +describeIf(getSystemTestBackend().includes(BACKEND.GETH))('Web3Eth.getFeeHistory', () => { + let web3Eth: Web3Eth; + let systemProvider: string | SupportedProviders; + + beforeAll(() => { + systemProvider = getSystemTestProvider(); + web3Eth = new Web3Eth(systemProvider); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + test('should return fee history with right data', async () => { + const blockCount: Numbers = '0x1'; + const newestBlock: BlockNumberOrTag = 'latest'; + const rewardPercentiles: number[] = []; + + const functionResponse = await web3Eth.getFeeHistory( + blockCount, + newestBlock, + rewardPercentiles, + ); + + const functionResponseKeys = Object.keys(functionResponse); + + const schemaProperties = Object.keys(feeHistorySchema.properties); + + functionResponseKeys.forEach(prop => expect(schemaProperties).toContain(prop)); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/send_signed_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/send_signed_transaction.test.ts new file mode 100644 index 00000000000..f74a12938ac --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/send_signed_transaction.test.ts @@ -0,0 +1,624 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// TODO Seems to be an issue with linter falsely reporting this +// error for Transaction Error Scenarios tests +/* eslint-disable jest/no-conditional-expect */ + +import { + Address, + Bytes, + SignedTransactionInfoAPI, + Transaction, + FMT_BYTES, + FMT_NUMBER, + DEFAULT_RETURN_FORMAT, +} from 'web3-types'; +import { format, hexToNumber } from 'web3-utils'; +import { isHexStrict } from 'web3-validator'; +import { Web3Eth, InternalTransaction, transactionSchema } from '../../../src'; +import { + closeOpenConnection, + createNewAccount, + createTempAccount, + getSystemTestBackend, + getSystemTestProvider, + describeIf, + BACKEND +} from '../../fixtures/system_test_utils'; +import { getTransactionGasPricing } from '../../../src/utils/get_transaction_gas_pricing'; +import { SimpleRevertAbi, SimpleRevertDeploymentData } from '../../fixtures/simple_revert'; + +const HEX_NUMBER_DATA_FORMAT = { bytes: FMT_BYTES.HEX, number: FMT_NUMBER.HEX } as const; + +// hardhat does not support eth_signTransaction +describeIf(getSystemTestBackend() !== BACKEND.HARDHAT)('Web3Eth.sendSignedTransaction', () => { + let web3Eth: Web3Eth; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + tempAcc = await createTempAccount(); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + describe('Should catch errors', () => { + it('send ether from the account that does not have ether', async () => { + let onErrorReceived = false; + let catchErrorReceived = false; + const from = await createNewAccount({ + unlock: true, + refill: false, + }); + let pr; + try { + const promiEvent = web3Eth.sendTransaction({ + to: tempAcc.address, + from: from.address, + }); + pr = new Promise(resolve => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + promiEvent.on('error', () => { + onErrorReceived = true; + resolve(true); + }); + }); + await promiEvent; + } catch (e) { + catchErrorReceived = true; + } + await pr; + expect(onErrorReceived).toBe(true); + expect(catchErrorReceived).toBe(true); + }); + it('send and wait timeout', async () => { + let onErrorReceived = false; + let catchErrorReceived = false; + const from = await createNewAccount({ + unlock: true, + refill: true, + }); + + web3Eth.setConfig({ + transactionReceiptPollingInterval: 10, + transactionPollingTimeout: 1000, + }); + + const currentNonce = await web3Eth.getTransactionCount(from.address); + let pr; + try { + const promiEvent = web3Eth.sendTransaction({ + to: tempAcc.address, + from: from.address, + value: '0x1', + nonce: currentNonce + BigInt(1000), + }); + pr = new Promise(resolve => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + promiEvent.on('error', () => { + onErrorReceived = true; + resolve(true); + }); + }); + await promiEvent; + } catch (e) { + catchErrorReceived = true; + } + await pr; + expect(onErrorReceived).toBe(true); + expect(catchErrorReceived).toBe(true); + }); + }); + + describe('Transaction Types', () => { + it('should send a signed simple value transfer - type 0x0', async () => { + const temp = await createTempAccount(); + const accountNonce = await web3Eth.getTransactionCount( + temp.address, + undefined, + HEX_NUMBER_DATA_FORMAT, + ); + const transaction: InternalTransaction = { + nonce: accountNonce, + from: temp.address, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + type: '0x0', + gas: '0x5208', + }; + const gasPricing = await getTransactionGasPricing( + transaction, + web3Eth, + DEFAULT_RETURN_FORMAT, + ); + const signedTransaction = await web3Eth.signTransaction({ + ...transaction, + ...gasPricing, + }); + const response = await web3Eth.sendSignedTransaction(signedTransaction.raw); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject( + format(transactionSchema, transaction, DEFAULT_RETURN_FORMAT), + ); + }); + + it('should send a signed simple value transfer - type 0x1', async () => { + const temp = await createTempAccount(); + const accountNonce = await web3Eth.getTransactionCount( + temp.address, + undefined, + HEX_NUMBER_DATA_FORMAT, + ); + const transaction: InternalTransaction = { + nonce: accountNonce, + from: temp.address, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + type: '0x1', + gas: '0x5208', + accessList: [], + }; + const gasPricing = await getTransactionGasPricing( + transaction, + web3Eth, + DEFAULT_RETURN_FORMAT, + ); + const signedTransaction = await web3Eth.signTransaction({ + ...transaction, + ...gasPricing, + }); + const response = await web3Eth.sendSignedTransaction(signedTransaction.raw); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject( + format(transactionSchema, transaction, DEFAULT_RETURN_FORMAT), + ); + }); + + it('should send a signed simple value transfer - type 0x2', async () => { + const temp = await createTempAccount(); + const accountNonce = await web3Eth.getTransactionCount( + temp.address, + undefined, + HEX_NUMBER_DATA_FORMAT, + ); + const transaction: InternalTransaction = { + nonce: accountNonce, + from: temp.address, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + type: '0x2', + gas: '0x5208', + }; + const gasPricing = await getTransactionGasPricing( + transaction, + web3Eth, + DEFAULT_RETURN_FORMAT, + ); + const signedTransaction = await web3Eth.signTransaction({ + ...transaction, + ...gasPricing, + }); + const response = await web3Eth.sendSignedTransaction(signedTransaction.raw); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject( + format(transactionSchema, transaction, DEFAULT_RETURN_FORMAT), + ); + }); + }); + + test('should send a signed contract deployment', async () => { + const greeterContractDeploymentData = + '0x60806040523480156200001157600080fd5b5060405162000a6a38038062000a6a8339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b505062000359565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61070180620003696000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae32171461006c575b600080fd5b6100556004803603810190610050919061043f565b61008a565b60405161006392919061052b565b60405180910390f35b6100746101b0565b604051610081919061055b565b60405180910390f35b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756000846040516100c0929190610672565b60405180910390a182600090805190602001906100de929190610242565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600060405161010f91906106a9565b60405180910390a160016000808054610127906105ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610153906105ac565b80156101a05780601f10610175576101008083540402835291602001916101a0565b820191906000526020600020905b81548152906001019060200180831161018357829003601f168201915b5050505050905091509150915091565b6060600080546101bf906105ac565b80601f01602080910402602001604051908101604052809291908181526020018280546101eb906105ac565b80156102385780601f1061020d57610100808354040283529160200191610238565b820191906000526020600020905b81548152906001019060200180831161021b57829003601f168201915b5050505050905090565b82805461024e906105ac565b90600052602060002090601f01602090048101928261027057600085556102b7565b82601f1061028957805160ff19168380011785556102b7565b828001600101855582156102b7579182015b828111156102b657825182559160200191906001019061029b565b5b5090506102c491906102c8565b5090565b5b808211156102e15760008160009055506001016102c9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61034c82610303565b810181811067ffffffffffffffff8211171561036b5761036a610314565b5b80604052505050565b600061037e6102e5565b905061038a8282610343565b919050565b600067ffffffffffffffff8211156103aa576103a9610314565b5b6103b382610303565b9050602081019050919050565b82818337600083830152505050565b60006103e26103dd8461038f565b610374565b9050828152602081018484840111156103fe576103fd6102fe565b5b6104098482856103c0565b509392505050565b600082601f830112610426576104256102f9565b5b81356104368482602086016103cf565b91505092915050565b600060208284031215610455576104546102ef565b5b600082013567ffffffffffffffff811115610473576104726102f4565b5b61047f84828501610411565b91505092915050565b60008115159050919050565b61049d81610488565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104dd5780820151818401526020810190506104c2565b838111156104ec576000848401525b50505050565b60006104fd826104a3565b61050781856104ae565b93506105178185602086016104bf565b61052081610303565b840191505092915050565b60006040820190506105406000830185610494565b818103602083015261055281846104f2565b90509392505050565b6000602082019050818103600083015261057581846104f2565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806105c457607f821691505b6020821081036105d7576105d661057d565b5b50919050565b60008190508160005260206000209050919050565b600081546105ff816105ac565b61060981866104ae565b94506001821660008114610624576001811461063657610669565b60ff1983168652602086019350610669565b61063f856105dd565b60005b8381101561066157815481890152600182019150602081019050610642565b808801955050505b50505092915050565b6000604082019050818103600083015261068c81856105f2565b905081810360208301526106a081846104f2565b90509392505050565b600060208201905081810360008301526106c381846105f2565b90509291505056fea2646970667358221220fe0f28c9f8ef0a13a95934b974e7bc2ca6762b40a5b93ccd6ca2038f454bf52764736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000'; + const accountNonce = await web3Eth.getTransactionCount( + tempAcc.address, + undefined, + HEX_NUMBER_DATA_FORMAT, + ); + const transaction: InternalTransaction = { + nonce: accountNonce, + from: tempAcc.address, + data: greeterContractDeploymentData, + type: '0x0', + gas: '0x745b8', + }; + const gasPricing = await getTransactionGasPricing( + transaction, + web3Eth, + DEFAULT_RETURN_FORMAT, + ); + const signedTransaction = await web3Eth.signTransaction({ ...transaction, ...gasPricing }); + const response = await web3Eth.sendSignedTransaction(signedTransaction.raw as Bytes); + // eslint-disable-next-line jest/no-standalone-expect + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + // eslint-disable-next-line jest/no-standalone-expect + expect(minedTransactionData).toMatchObject({ + nonce: BigInt(hexToNumber(accountNonce)), + from: tempAcc.address, + input: greeterContractDeploymentData, + type: BigInt(0), + gas: BigInt(476600), + }); + }); + + describe('Transaction PromiEvents', () => { + let transaction: Transaction; + let signedTransaction: SignedTransactionInfoAPI; + + beforeEach(async () => { + tempAcc = await createTempAccount(); + const accountNonce = await web3Eth.getTransactionCount(tempAcc.address); + transaction = { + nonce: accountNonce, + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + type: '0x0', + gas: '0x5208', + }; + const gasPricing = await getTransactionGasPricing( + transaction as InternalTransaction, + web3Eth, + DEFAULT_RETURN_FORMAT, + ); + signedTransaction = await web3Eth.signTransaction({ ...transaction, ...gasPricing }); + }); + + it('should listen to the sending event', async () => { + await web3Eth.sendSignedTransaction(signedTransaction.raw).on('sending', data => { + expect(data).toBe(signedTransaction.raw); + }); + expect.assertions(1); + }); + + it('should listen to the sent event', async () => { + await web3Eth.sendSignedTransaction(signedTransaction.raw).on('sent', data => { + expect(data).toBe(signedTransaction.raw); + }); + expect.assertions(1); + }); + + it('should listen to the transactionHash event', async () => { + await web3Eth + .sendSignedTransaction(signedTransaction.raw) + .on('transactionHash', data => { + expect(isHexStrict(data)).toBe(true); + }); + expect.assertions(1); + }); + + it('should listen to the receipt event', async () => { + const expectedTransactionReceipt = { + blockHash: expect.any(String), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + from: transaction.from, + to: transaction.to, + transactionHash: expect.any(String), + }; + + await web3Eth.sendSignedTransaction(signedTransaction.raw).on('receipt', data => { + expect(data).toEqual(expect.objectContaining(expectedTransactionReceipt)); + + // To avoid issue with the `objectContaining` and `cypress` had to add + // these expectations explicitly on each attribute + expect(typeof data.blockNumber).toBe('bigint'); + expect(typeof data.cumulativeGasUsed).toBe('bigint'); + expect(typeof data.effectiveGasPrice).toBe('bigint'); + expect(typeof data.gasUsed).toBe('bigint'); + expect(typeof data.transactionIndex).toBe('bigint'); + expect(data.status).toBe(BigInt(1)); + expect(data.type).toBe(BigInt(0)); + }); + expect.assertions(8); + }); + + it('should listen to the confirmation event', async () => { + const expectedTransactionConfirmation = { + confirmationNumber: expect.any(BigInt), + receipt: { + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + cumulativeGasUsed: expect.any(BigInt), + effectiveGasPrice: expect.any(BigInt), + gasUsed: expect.any(BigInt), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(1), + from: transaction.from, + to: transaction.to, + transactionHash: expect.any(String), + transactionIndex: BigInt(0), + type: BigInt(0), + }, + latestBlockHash: expect.any(String), + }; + + await web3Eth.sendSignedTransaction(signedTransaction.raw).on('confirmation', data => { + expect(data).toEqual(expect.objectContaining(expectedTransactionConfirmation)); + }); + + // TODO Confirmations are dependent on the next block being mined, + // this is manually triggering the next block to be created since both + // Geth and Ganache wait for transaction before mining a block. + // This should be revisited to implement a better solution + await web3Eth.sendTransaction({ + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + type: '0x0', + gas: '0x5208', + }); + + expect.assertions(1); + }); + }); + + describe('Transaction Error Scenarios', () => { + let simpleRevertContractAddress: Address; + + beforeAll(async () => { + const simpleRevertDeployTransaction: Transaction = { + from: tempAcc.address, + data: SimpleRevertDeploymentData, + }; + simpleRevertDeployTransaction.gas = await web3Eth.estimateGas( + simpleRevertDeployTransaction, + ); + simpleRevertContractAddress = ( + await web3Eth.sendTransaction(simpleRevertDeployTransaction) + ).contractAddress as Address; + }); + + it('Should throw TransactionRevertInstructionError because gas too low', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + gas: 1, + gasPrice: 1, + nonce: await web3Eth.getTransactionCount(tempAcc.address), + }; + const signedTransaction = await web3Eth.signTransaction(transaction, { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.UINT8ARRAY, + }); + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + cause: undefined, + reason: + getSystemTestBackend() === BACKEND.GETH + ? expect.stringContaining( + 'err: max fee per gas less than block base fee: address 0x', + ) + : 'VM Exception while processing transaction: out of gas', + signature: undefined, + receipt: undefined, + data: undefined, + code: 402, + }; + + await expect( + web3Eth + .sendSignedTransaction(signedTransaction.raw) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + it('Should throw InvalidResponseError because insufficient funds', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt('999999999999999999999999999999999999999999999999999999999'), + gas: 21000, + nonce: await web3Eth.getTransactionCount(tempAcc.address), + }; + transaction.gasPrice = await web3Eth.getGasPrice(); + const signedTransaction = await web3Eth.signTransaction(transaction, { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.UINT8ARRAY, + }); + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + message: 'Transaction has been reverted by the EVM', + cause: undefined, + reason: + getSystemTestBackend() === BACKEND.GETH + ? expect.stringContaining( + 'err: insufficient funds for gas * price + value: address 0x', + ) + : 'VM Exception while processing transaction: insufficient balance', + signature: undefined, + receipt: undefined, + data: undefined, + code: 402, + }; + + await expect( + web3Eth + .sendSignedTransaction(signedTransaction.raw) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Should throw TransactionRevertInstructionError because of contract revert and return revert reason', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0xba57a511000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000067265766572740000000000000000000000000000000000000000000000000000', + gasPrice: 2000000000, + gas: 23605, + nonce: await web3Eth.getTransactionCount(tempAcc.address), + }; + const signedTransaction = await web3Eth.signTransaction(transaction, { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.UINT8ARRAY, + }); + + web3Eth.handleRevert = true; + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + code: 402, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted: This is a send revert' + : 'VM Exception while processing transaction: revert This is a send revert', + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + receipt: undefined, + }; + + await expect( + web3Eth + .sendSignedTransaction(signedTransaction.raw) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Should throw TransactionRevertWithCustomError because of contract revert and return custom error ErrorWithNoParams', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0x3ebf4d9c', + gasPrice: 2000000000, + gas: 21222, + nonce: await web3Eth.getTransactionCount(tempAcc.address), + }; + const signedTransaction = await web3Eth.signTransaction(transaction, { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.UINT8ARRAY, + }); + + web3Eth.handleRevert = true; + + const expectedThrownError = { + name: 'TransactionRevertWithCustomError', + code: 438, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted' + : 'VM Exception while processing transaction: revert', + signature: '0x72090e4d', + customErrorName: 'ErrorWithNoParams', + customErrorDecodedSignature: 'ErrorWithNoParams()', + customErrorArguments: {}, + receipt: undefined, + }; + + await expect( + web3Eth + .sendSignedTransaction(signedTransaction.raw, undefined, { + contractAbi: SimpleRevertAbi, + }) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Should throw TransactionRevertWithCustomError because of contract revert and return custom error ErrorWithParams', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0x819f48fe', + gasPrice: 2000000000, + gas: 21730, + nonce: await web3Eth.getTransactionCount(tempAcc.address), + }; + const signedTransaction = await web3Eth.signTransaction(transaction, { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.UINT8ARRAY, + }); + + web3Eth.handleRevert = true; + + const expectedThrownError = { + name: 'TransactionRevertWithCustomError', + code: 438, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted' + : 'VM Exception while processing transaction: revert', + signature: '0xc85bda60', + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + customErrorName: 'ErrorWithParams', + customErrorDecodedSignature: 'ErrorWithParams(uint256,string)', + customErrorArguments: { + code: BigInt(42), + message: 'This is an error with params', + }, + receipt: undefined, + }; + + await expect( + web3Eth + .sendSignedTransaction(signedTransaction.raw, undefined, { + contractAbi: SimpleRevertAbi, + }) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Should throw TransactionRevertInstructionError because of contract revert', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0xba57a511000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000067265766572740000000000000000000000000000000000000000000000000000', + gasPrice: 2000000000, + gas: 23605, + nonce: await web3Eth.getTransactionCount(tempAcc.address), + }; + const signedTransaction = await web3Eth.signTransaction(transaction, { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.UINT8ARRAY, + }); + + web3Eth.handleRevert = false; + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + cause: undefined, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted: This is a send revert' + : 'VM Exception while processing transaction: revert This is a send revert', + signature: '0x08c379a0', + receipt: undefined, + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + code: 402, + }; + + await expect( + web3Eth + .sendSignedTransaction(signedTransaction.raw) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts new file mode 100644 index 00000000000..9018381bd6a --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts @@ -0,0 +1,723 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// TODO Seems to be an issue with linter falsely reporting this +// error for Transaction Error Scenarios tests +/* eslint-disable jest/no-conditional-expect */ + +import { + Transaction, + TransactionWithFromLocalWalletIndex, + TransactionWithToLocalWalletIndex, + TransactionWithFromAndToLocalWalletIndex, + Address, + DEFAULT_RETURN_FORMAT, +} from 'web3-types'; +import { Wallet } from 'web3-eth-accounts'; +import { isHexStrict } from 'web3-validator'; + +import Web3Eth from '../../../src'; +import { + closeOpenConnection, + createAccountProvider, + createTempAccount, + getSystemTestBackend, + getSystemTestProvider, + isGeth, + itIf, + BACKEND, +} from '../../fixtures/system_test_utils'; +import { SimpleRevertAbi, SimpleRevertDeploymentData } from '../../fixtures/simple_revert'; + +describe('Web3Eth.sendTransaction', () => { + let web3Eth: Web3Eth; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + tempAcc = await createTempAccount(); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + it('should make a simple value transfer', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.status).toBe(BigInt(1)); + expect(response.events).toBeUndefined(); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should make a simple value transfer - with local wallet indexed sender', async () => { + const web3EthWithWallet = new Web3Eth(getSystemTestProvider()); + const accountProvider = createAccountProvider(web3Eth); + const wallet = new Wallet(accountProvider); + + web3EthWithWallet['_accountProvider'] = accountProvider; + web3EthWithWallet['_wallet'] = wallet; + + web3EthWithWallet.wallet?.add(tempAcc.privateKey); + + const transaction: TransactionWithFromLocalWalletIndex = { + from: 0, + to: '0x0000000000000000000000000000000000000000', + gas: 21000, + value: BigInt(1), + }; + const response = await web3EthWithWallet.sendTransaction(transaction); + expect(response.status).toBe(BigInt(1)); + expect(response.events).toBeUndefined(); + + const minedTransactionData = await web3EthWithWallet.getTransaction(response.transactionHash); + + expect(minedTransactionData).toMatchObject({ + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + }); + }); + + it('should make a simple value transfer - with local wallet indexed receiver', async () => { + const web3EthWithWallet = new Web3Eth(getSystemTestProvider()); + const accountProvider = createAccountProvider(web3Eth); + const wallet = new Wallet(accountProvider); + + web3EthWithWallet['_accountProvider'] = accountProvider; + web3EthWithWallet['_wallet'] = wallet; + + web3EthWithWallet.wallet?.add(tempAcc.privateKey); + + const transaction: TransactionWithToLocalWalletIndex = { + from: tempAcc.address, + to: 0, + gas: 21000, + value: BigInt(1), + }; + const response = await web3EthWithWallet.sendTransaction(transaction); + expect(response.status).toBe(BigInt(1)); + expect(response.events).toBeUndefined(); + + const minedTransactionData = await web3EthWithWallet.getTransaction(response.transactionHash); + + expect(minedTransactionData).toMatchObject({ + from: tempAcc.address, + to: wallet.get(0)?.address.toLowerCase(), + value: BigInt(1), + }); + }); + + it('should make a simple value transfer - with local wallet indexed sender and receiver', async () => { + const web3EthWithWallet = new Web3Eth(getSystemTestProvider()); + const accountProvider = createAccountProvider(web3Eth); + const wallet = new Wallet(accountProvider); + + web3EthWithWallet['_accountProvider'] = accountProvider; + web3EthWithWallet['_wallet'] = wallet; + + const tempAcc2 = await createTempAccount(); + + web3EthWithWallet.wallet?.add(tempAcc.privateKey); + + web3EthWithWallet.wallet?.add(tempAcc2.privateKey); + + const transaction: TransactionWithFromAndToLocalWalletIndex = { + from: 0, + to: 1, + gas: 21000, + value: BigInt(1), + }; + const response = await web3EthWithWallet.sendTransaction(transaction); + expect(response.status).toBe(BigInt(1)); + expect(response.events).toBeUndefined(); + + const minedTransactionData = await web3EthWithWallet.getTransaction(response.transactionHash); + + expect(minedTransactionData).toMatchObject({ + from: tempAcc.address, + to: wallet.get(1)?.address.toLowerCase(), + value: BigInt(1), + }); + }); + it('should make a transaction with no value transfer', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(0), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.status).toBe(BigInt(1)); + expect(response.events).toBeUndefined(); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + it('should send a transaction with data', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + data: '0x64edfbf0e2c706ba4a09595315c45355a341a576cc17f3a19f43ac1c02f814ee', + value: BigInt(0), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.status).toBe(BigInt(1)); + expect(response.events).toBeUndefined(); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + describe('Deploy and interact with contract', () => { + let greeterContractAddress: string; + + it('should deploy a contract', async () => { + const greeterContractDeploymentData = + '0x60806040523480156200001157600080fd5b5060405162000a6a38038062000a6a8339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b505062000359565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61070180620003696000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae32171461006c575b600080fd5b6100556004803603810190610050919061043f565b61008a565b60405161006392919061052b565b60405180910390f35b6100746101b0565b604051610081919061055b565b60405180910390f35b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756000846040516100c0929190610672565b60405180910390a182600090805190602001906100de929190610242565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600060405161010f91906106a9565b60405180910390a160016000808054610127906105ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610153906105ac565b80156101a05780601f10610175576101008083540402835291602001916101a0565b820191906000526020600020905b81548152906001019060200180831161018357829003601f168201915b5050505050905091509150915091565b6060600080546101bf906105ac565b80601f01602080910402602001604051908101604052809291908181526020018280546101eb906105ac565b80156102385780601f1061020d57610100808354040283529160200191610238565b820191906000526020600020905b81548152906001019060200180831161021b57829003601f168201915b5050505050905090565b82805461024e906105ac565b90600052602060002090601f01602090048101928261027057600085556102b7565b82601f1061028957805160ff19168380011785556102b7565b828001600101855582156102b7579182015b828111156102b657825182559160200191906001019061029b565b5b5090506102c491906102c8565b5090565b5b808211156102e15760008160009055506001016102c9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61034c82610303565b810181811067ffffffffffffffff8211171561036b5761036a610314565b5b80604052505050565b600061037e6102e5565b905061038a8282610343565b919050565b600067ffffffffffffffff8211156103aa576103a9610314565b5b6103b382610303565b9050602081019050919050565b82818337600083830152505050565b60006103e26103dd8461038f565b610374565b9050828152602081018484840111156103fe576103fd6102fe565b5b6104098482856103c0565b509392505050565b600082601f830112610426576104256102f9565b5b81356104368482602086016103cf565b91505092915050565b600060208284031215610455576104546102ef565b5b600082013567ffffffffffffffff811115610473576104726102f4565b5b61047f84828501610411565b91505092915050565b60008115159050919050565b61049d81610488565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104dd5780820151818401526020810190506104c2565b838111156104ec576000848401525b50505050565b60006104fd826104a3565b61050781856104ae565b93506105178185602086016104bf565b61052081610303565b840191505092915050565b60006040820190506105406000830185610494565b818103602083015261055281846104f2565b90509392505050565b6000602082019050818103600083015261057581846104f2565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806105c457607f821691505b6020821081036105d7576105d661057d565b5b50919050565b60008190508160005260206000209050919050565b600081546105ff816105ac565b61060981866104ae565b94506001821660008114610624576001811461063657610669565b60ff1983168652602086019350610669565b61063f856105dd565b60005b8381101561066157815481890152600182019150602081019050610642565b808801955050505b50505092915050565b6000604082019050818103600083015261068c81856105f2565b905081810360208301526106a081846104f2565b90509392505050565b600060208201905081810360008301526106c381846105f2565b90509291505056fea2646970667358221220fe0f28c9f8ef0a13a95934b974e7bc2ca6762b40a5b93ccd6ca2038f454bf52764736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000'; + const transaction: Transaction = { + from: tempAcc.address, + data: greeterContractDeploymentData, + input: greeterContractDeploymentData, + gas: BigInt('475520'), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.status).toBe(BigInt(1)); + expect(response.events).toBeUndefined(); + expect(response.contractAddress).toBeDefined(); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject({ + from: tempAcc.address, + input: greeterContractDeploymentData, + gas: BigInt('475520'), + }); + + greeterContractAddress = response.contractAddress as string; + }); + + it('should update greet in contract', async () => { + const contractFunctionCall = + '0xa4136862000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000023432000000000000000000000000000000000000000000000000000000000000'; + const transaction: Transaction = { + from: tempAcc.address, + to: greeterContractAddress, + data: contractFunctionCall, + input: contractFunctionCall, + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject({ + from: tempAcc.address, + to: greeterContractAddress, + input: contractFunctionCall, + }); + }); + }); + + describe('Transaction Types', () => { + it('should send a successful type 0x0 transaction', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + type: BigInt(0), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.type).toBe(BigInt(0)); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should send a successful type 0x1 transaction', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + type: BigInt(1), + // TODO If this property is not included, tx gets default to type: 0x0 + // from what I can tell our library isn't doing this, but it happens + // with both Geth and Ganache, so I'm not sure + accessList: [], + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.type).toBe(BigInt(1)); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should send a successful type 0x2 transaction', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + type: BigInt(2), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.type).toBe(BigInt(2)); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should send a successful type 0x2 transaction (gas = estimateGas)', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + type: BigInt(2), + }; + + transaction.gas = await web3Eth.estimateGas(transaction); + + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.type).toBe(BigInt(2)); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should send a successful type 0x2 transaction (fee per gas from: calculateFeeData)', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + type: BigInt(2), + }; + + const feeData = await web3Eth.calculateFeeData(); + transaction.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas; + transaction.maxFeePerGas = feeData.maxFeePerGas; + + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.type).toBe(BigInt(2)); + expect(response.status).toBe(BigInt(1)); + + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should send a successful type 0x0 transaction with data', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + data: '0x64edfbf0e2c706ba4a09595315c45355a341a576cc17f3a19f43ac1c02f814ee', + value: BigInt(1), + type: BigInt(0), + }; + const response = await web3Eth.sendTransaction(transaction, DEFAULT_RETURN_FORMAT); + expect(response.type).toBe(BigInt(0)); + expect(response.events).toBeUndefined(); + expect(response.status).toBe(BigInt(1)); + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should send a successful autodetected type 0x0 gasprice as data', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + data: '0x64edfbf0e2c706ba4a09595315c45355a341a576cc17f3a19f43ac1c02f814ee', + value: BigInt(1), + gasPrice: BigInt(2500000008), + }; + const response = await web3Eth.sendTransaction(transaction, DEFAULT_RETURN_FORMAT); + expect(response.type).toBe(BigInt(0)); + expect(response.status).toBe(BigInt(1)); + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should send a successful default type 0x2 transaction with data', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + data: '0x64edfbf0e2c706ba4a09595315c45355a341a576cc17f3a19f43ac1c02f814ee', + value: BigInt(1), + gas: BigInt(30000), + }; + const response = await web3Eth.sendTransaction(transaction, DEFAULT_RETURN_FORMAT); + expect(response.type).toBe(BigInt(2)); + expect(response.status).toBe(BigInt(1)); + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + }); + it('should autofill a successful type 0x2 transaction with only maxFeePerGas passed', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + maxFeePerGas: BigInt(2500000016), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.type).toBe(BigInt(2)); + expect(response.status).toBe(BigInt(1)); + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + it('should autofill a successful type 0x2 transaction with only maxPriorityFeePerGas passed', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + maxPriorityFeePerGas: BigInt(100), + }; + const response = await web3Eth.sendTransaction(transaction); + expect(response.events).toBeUndefined(); + expect(response.type).toBe(BigInt(2)); + expect(response.status).toBe(BigInt(1)); + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + expect(minedTransactionData).toMatchObject(transaction); + }); + + itIf(isGeth)( + 'should send type 0x2 transaction with maxPriorityFeePerGas got from await web3Eth.getMaxPriorityFeePerGas()', + async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + maxPriorityFeePerGas: await web3Eth.getMaxPriorityFeePerGas(), + }; + const response = await web3Eth.sendTransaction(transaction); + + // eslint-disable-next-line jest/no-standalone-expect + expect(response.events).toBeUndefined(); + // eslint-disable-next-line jest/no-standalone-expect + expect(response.type).toBe(BigInt(2)); + // eslint-disable-next-line jest/no-standalone-expect + expect(response.status).toBe(BigInt(1)); + const minedTransactionData = await web3Eth.getTransaction(response.transactionHash); + // eslint-disable-next-line jest/no-standalone-expect + expect(minedTransactionData).toMatchObject(transaction); + }, + ); + + describe('Transaction PromiEvents', () => { + let transaction: Transaction; + + beforeEach(async () => { + tempAcc = await createTempAccount(); + transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + }; + }); + + it('should listen to the sending event', async () => { + await web3Eth.sendTransaction(transaction).on('sending', data => { + expect(data).toMatchObject(transaction); + }); + expect.assertions(1); + }); + + it('should listen to the sent event', async () => { + await web3Eth.sendTransaction(transaction).on('sent', data => { + expect(data).toMatchObject(transaction); + }); + expect.assertions(1); + }); + + it('should listen to the transactionHash event', async () => { + await web3Eth.sendTransaction(transaction).on('transactionHash', data => { + expect(isHexStrict(data)).toBe(true); + }); + expect.assertions(1); + }); + + it('should listen to the receipt event', async () => { + const expectedTransactionReceipt = { + blockHash: expect.any(String), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + from: transaction.from, + to: transaction.to, + transactionHash: expect.any(String), + }; + await web3Eth.sendTransaction(transaction).on('receipt', data => { + expect(data).toEqual(expect.objectContaining(expectedTransactionReceipt)); + + // To avoid issue with the `objectContaining` and `cypress` had to add + // these expectations explicitly on each attribute + expect(typeof data.blockNumber).toBe('bigint'); + expect(typeof data.cumulativeGasUsed).toBe('bigint'); + expect(typeof data.effectiveGasPrice).toBe('bigint'); + expect(typeof data.gasUsed).toBe('bigint'); + expect(typeof data.transactionIndex).toBe('bigint'); + expect(data.status).toBe(BigInt(1)); + expect(data.type).toBe(BigInt(2)); + expect(data.events).toBeUndefined(); + }); + expect.assertions(9); + }); + + it('should listen to the confirmation event', async () => { + const expectedTransactionConfirmation = { + confirmationNumber: expect.any(BigInt), + receipt: { + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + cumulativeGasUsed: expect.any(BigInt), + effectiveGasPrice: expect.any(BigInt), + gasUsed: expect.any(BigInt), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(1), + from: transaction.from, + to: transaction.to, + transactionHash: expect.any(String), + transactionIndex: BigInt(0), + type: BigInt(0), + }, + latestBlockHash: expect.any(String), + }; + + await web3Eth.sendTransaction(transaction).on('confirmation', data => { + expect(data).toEqual(expect.objectContaining(expectedTransactionConfirmation)); + }); + + // TODO Confirmations are dependent on the next block being mined, + // this is manually triggering the next block to be created since both + // Geth and Ganache wait for transaction before mining a block. + // This should be revisted to implement a better solution + await web3Eth.sendTransaction(transaction); + + // TODO: Debug why the assertions are not being called + // expect.assertions(1); + }); + }); + + describe('Transaction Error Scenarios', () => { + let simpleRevertContractAddress: Address; + + beforeAll(async () => { + const simpleRevertDeployTransaction: Transaction = { + from: tempAcc.address, + data: SimpleRevertDeploymentData, + }; + simpleRevertDeployTransaction.gas = await web3Eth.estimateGas(simpleRevertDeployTransaction); + simpleRevertContractAddress = (await web3Eth.sendTransaction(simpleRevertDeployTransaction)) + .contractAddress as Address; + }); + + it('Should throw TransactionRevertInstructionError because gas too low', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt(1), + gas: 1, + }; + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + code: 402, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'err: intrinsic gas too low: have 1, want 21000 (supplied gas 1)' + : 'base fee exceeds gas limit', + }; + + if (getSystemTestBackend() !== BACKEND.HARDHAT) { + await expect( + web3Eth + .sendTransaction(transaction) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + } else { + try { + await web3Eth.sendTransaction(transaction); + } catch (error) { + expect((error as any).name).toEqual(expectedThrownError.name); + expect((error as any).code).toEqual(expectedThrownError.code); + expect((error as any).reason).toContain(expectedThrownError.reason); + } + } + }); + itIf(getSystemTestBackend() !== BACKEND.HARDHAT)( + 'Should throw TransactionRevertInstructionError because insufficient funds', + async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: '0x0000000000000000000000000000000000000000', + value: BigInt('99999999999999999999999999999999999999999999999999999999999999999'), + }; + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + message: 'Transaction has been reverted by the EVM', + code: 402, + reason: + getSystemTestBackend() === BACKEND.GETH + ? expect.stringContaining('err: insufficient funds for gas * price + value: address') + : 'VM Exception while processing transaction: insufficient balance', + }; + + // eslint-disable-next-line jest/no-standalone-expect + await expect( + web3Eth + .sendTransaction(transaction) + // eslint-disable-next-line jest/no-standalone-expect + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }, + ); + + it('Should throw TransactionRevertInstructionError because of contract revert and return revert reason', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0xba57a511000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000067265766572740000000000000000000000000000000000000000000000000000', + }; + + web3Eth.handleRevert = true; + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + code: 402, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted: This is a send revert' + : "Error: VM Exception while processing transaction: reverted with reason string 'This is a send revert'", + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + receipt: undefined, + }; + + await expect( + web3Eth + .sendTransaction(transaction) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Should throw TransactionRevertWithCustomError because of contract revert and return custom error ErrorWithNoParams', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0x3ebf4d9c', + }; + + web3Eth.handleRevert = true; + + const expectedThrownError = { + name: 'TransactionRevertWithCustomError', + code: 438, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted' + : 'Error: VM Exception while processing transaction: reverted with an unrecognized custom error (return data: 0x72090e4d)', + signature: '0x72090e4d', + customErrorName: 'ErrorWithNoParams', + customErrorDecodedSignature: 'ErrorWithNoParams()', + customErrorArguments: {}, + receipt: undefined, + }; + + await expect( + web3Eth + .sendTransaction(transaction, undefined, { contractAbi: SimpleRevertAbi }) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Should throw TransactionRevertWithCustomError because of contract revert and return custom error ErrorWithParams', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0x819f48fe', + }; + + web3Eth.handleRevert = true; + + const expectedThrownError = { + name: 'TransactionRevertWithCustomError', + code: 438, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted' + : 'Error: VM Exception while processing transaction: reverted with an unrecognized custom error (return data: 0xc85bda60000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000)', + signature: '0xc85bda60', + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + customErrorName: 'ErrorWithParams', + customErrorDecodedSignature: 'ErrorWithParams(uint256,string)', + customErrorArguments: { + code: BigInt(42), + message: 'This is an error with params', + }, + receipt: undefined, + }; + + await expect( + web3Eth + .sendTransaction(transaction, undefined, { contractAbi: SimpleRevertAbi }) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + + it('Should throw TransactionRevertInstructionError because of contract revert', async () => { + const transaction: Transaction = { + from: tempAcc.address, + to: simpleRevertContractAddress, + data: '0xba57a511000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000067265766572740000000000000000000000000000000000000000000000000000', + }; + + web3Eth.handleRevert = false; + + const expectedThrownError = { + name: 'TransactionRevertInstructionError', + code: 402, + reason: + getSystemTestBackend() === BACKEND.GETH + ? 'execution reverted: This is a send revert' + : "Error: VM Exception while processing transaction: reverted with reason string 'This is a send revert'", + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + }; + + await expect( + web3Eth + .sendTransaction(transaction) + .on('error', error => expect(error).toMatchObject(expectedThrownError)), + ).rejects.toMatchObject(expectedThrownError); + }); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/sign.test.ts b/packages/web3-eth/test/integration/web3_eth/sign.test.ts new file mode 100644 index 00000000000..b468dbb1cb0 --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/sign.test.ts @@ -0,0 +1,56 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isHexStrict } from 'web3-validator'; + +import { Web3Eth } from '../../../src'; +import { + closeOpenConnection, + createTempAccount, + getSystemTestBackend, + getSystemTestProvider, + BACKEND +} from '../../fixtures/system_test_utils'; + +describe('Web3Eth.sign', () => { + let web3Eth: Web3Eth; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + tempAcc = await createTempAccount(); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + it('should sign message', async () => { + if (getSystemTestBackend() === BACKEND.HARDHAT) { + const message = '0x736f796c656e7420677265656e2069732070656f706c65'; + const accounts = await web3Eth.getAccounts(); + const response = await web3Eth.sign(message, accounts[0]); + // eslint-disable-next-line jest/no-conditional-expect + expect(isHexStrict(response as string)).toBe(true); + } else { + const message = '0x736f796c656e7420677265656e2069732070656f706c65'; + const response = await web3Eth.sign(message, tempAcc.address); + // eslint-disable-next-line jest/no-conditional-expect + expect(isHexStrict(response as string)).toBe(true); + } + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/sign_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/sign_transaction.test.ts new file mode 100644 index 00000000000..630a67cfba2 --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/sign_transaction.test.ts @@ -0,0 +1,107 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Transaction, TransactionLegacySignedAPI } from 'web3-types'; +import { Web3Eth } from '../../../src'; +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + describeIf, + getSystemTestBackend, + BACKEND +} from '../../fixtures/system_test_utils'; + +// hardhat does not support eth_signtransaction +describeIf(getSystemTestBackend() !== BACKEND.HARDHAT)('Web3Eth.signTransaction', () => { + let web3Eth: Web3Eth; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + tempAcc = await createTempAccount(); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + test('should sign a simple value transfer', async () => { + const nonce = await web3Eth.getTransactionCount(tempAcc.address); + const transaction: Transaction = { + from: tempAcc.address, + nonce, + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + gas: '0x5208', + gasPrice: '0x3b9aca01', + }; + const response = await web3Eth.signTransaction(transaction); + const expectedResponse: { tx: Transaction } = { + tx: { + type: BigInt(0), + nonce: BigInt(nonce), + gasPrice: BigInt(1000000001), + gas: BigInt(21000), + value: BigInt(1), + to: transaction.to, + input: '0x', + data: '0x', + }, + }; + + expect(response).toMatchObject(expectedResponse); + + // Pulling out of toMatchObject to be compatible with Cypress + expect(response.raw).toMatch(/0[xX][0-9a-fA-F]+/); + expect(typeof (response.tx as TransactionLegacySignedAPI).v).toBe('bigint'); + expect(response.tx.r).toMatch(/0[xX][0-9a-fA-F]{64}/); + expect(response.tx.s).toMatch(/0[xX][0-9a-fA-F]{64}/); + }); + + test('should sign a contract deployment', async () => { + const greeterContractDeploymentData = + '0x60806040523480156200001157600080fd5b5060405162000a6a38038062000a6a8339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b505062000359565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61070180620003696000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae32171461006c575b600080fd5b6100556004803603810190610050919061043f565b61008a565b60405161006392919061052b565b60405180910390f35b6100746101b0565b604051610081919061055b565b60405180910390f35b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756000846040516100c0929190610672565b60405180910390a182600090805190602001906100de929190610242565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600060405161010f91906106a9565b60405180910390a160016000808054610127906105ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610153906105ac565b80156101a05780601f10610175576101008083540402835291602001916101a0565b820191906000526020600020905b81548152906001019060200180831161018357829003601f168201915b5050505050905091509150915091565b6060600080546101bf906105ac565b80601f01602080910402602001604051908101604052809291908181526020018280546101eb906105ac565b80156102385780601f1061020d57610100808354040283529160200191610238565b820191906000526020600020905b81548152906001019060200180831161021b57829003601f168201915b5050505050905090565b82805461024e906105ac565b90600052602060002090601f01602090048101928261027057600085556102b7565b82601f1061028957805160ff19168380011785556102b7565b828001600101855582156102b7579182015b828111156102b657825182559160200191906001019061029b565b5b5090506102c491906102c8565b5090565b5b808211156102e15760008160009055506001016102c9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61034c82610303565b810181811067ffffffffffffffff8211171561036b5761036a610314565b5b80604052505050565b600061037e6102e5565b905061038a8282610343565b919050565b600067ffffffffffffffff8211156103aa576103a9610314565b5b6103b382610303565b9050602081019050919050565b82818337600083830152505050565b60006103e26103dd8461038f565b610374565b9050828152602081018484840111156103fe576103fd6102fe565b5b6104098482856103c0565b509392505050565b600082601f830112610426576104256102f9565b5b81356104368482602086016103cf565b91505092915050565b600060208284031215610455576104546102ef565b5b600082013567ffffffffffffffff811115610473576104726102f4565b5b61047f84828501610411565b91505092915050565b60008115159050919050565b61049d81610488565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104dd5780820151818401526020810190506104c2565b838111156104ec576000848401525b50505050565b60006104fd826104a3565b61050781856104ae565b93506105178185602086016104bf565b61052081610303565b840191505092915050565b60006040820190506105406000830185610494565b818103602083015261055281846104f2565b90509392505050565b6000602082019050818103600083015261057581846104f2565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806105c457607f821691505b6020821081036105d7576105d661057d565b5b50919050565b60008190508160005260206000209050919050565b600081546105ff816105ac565b61060981866104ae565b94506001821660008114610624576001811461063657610669565b60ff1983168652602086019350610669565b61063f856105dd565b60005b8381101561066157815481890152600182019150602081019050610642565b808801955050505b50505092915050565b6000604082019050818103600083015261068c81856105f2565b905081810360208301526106a081846104f2565b90509392505050565b600060208201905081810360008301526106c381846105f2565b90509291505056fea2646970667358221220fe0f28c9f8ef0a13a95934b974e7bc2ca6762b40a5b93ccd6ca2038f454bf52764736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000'; + const nonce = await web3Eth.getTransactionCount(tempAcc.address); + const transaction: Transaction = { + from: tempAcc.address, + nonce, + data: greeterContractDeploymentData, + gas: '0x740b8', + gasPrice: '0x3b9aca01', + }; + const response = await web3Eth.signTransaction(transaction); + const expectedResponse: { tx: Transaction } = { + tx: { + type: BigInt(0), + nonce: BigInt(nonce), + gasPrice: BigInt(1000000001), + gas: BigInt(475320), + input: greeterContractDeploymentData, + data: greeterContractDeploymentData, + }, + }; + + // eslint-disable-next-line jest/no-standalone-expect + expect(response).toMatchObject(expectedResponse); + // Pulling out of toMatchObject to be compatible with Cypress + expect(response.raw).toMatch(/0[xX][0-9a-fA-F]+/); + expect(typeof (response.tx as TransactionLegacySignedAPI).v).toBe('bigint'); + expect(response.tx.r).toMatch(/0[xX][0-9a-fA-F]{64}/); + expect(response.tx.s).toMatch(/0[xX][0-9a-fA-F]{64}/); + }); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/sign_typed_data.test.ts b/packages/web3-eth/test/integration/web3_eth/sign_typed_data.test.ts new file mode 100644 index 00000000000..04f5f19b9cb --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/sign_typed_data.test.ts @@ -0,0 +1,124 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { getEncodedEip712Data } from 'web3-eth-abi'; +import { ecrecover, toUint8Array } from 'web3-eth-accounts'; +import { bytesToHex, hexToNumber, keccak256 } from 'web3-utils'; + +import Web3Eth from '../../../src'; +import { + closeOpenConnection, + createTempAccount, + getSystemTestBackend, + getSystemTestProvider, + itIf, +} from '../../fixtures/system_test_utils'; + +describe('Web3Eth.signTypedData', () => { + let web3Eth: Web3Eth; + let tempAcc: { address: string; privateKey: string }; + + beforeAll(async () => { + web3Eth = new Web3Eth(getSystemTestProvider()); + tempAcc = await createTempAccount(); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + itIf(getSystemTestBackend() === 'ganache')( + 'should sign the typed data, return the signature, and recover the correct ETH address', + async () => { + const typedData = { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Person: [ + { + name: 'name', + type: 'string', + }, + { + name: 'wallet', + type: 'address', + }, + ], + Mail: [ + { + name: 'from', + type: 'Person', + }, + { + name: 'to', + type: 'Person', + }, + { + name: 'contents', + type: 'string', + }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, + }; + const encodedTypedDataHash = getEncodedEip712Data(typedData, true); + const signature = await web3Eth.signTypedData(tempAcc.address, typedData); + const r = toUint8Array(signature.slice(0, 66)); + const s = toUint8Array(`0x${signature.slice(66, 130)}`); + const v = BigInt(hexToNumber(`0x${signature.slice(130, 132)}`)); + const recoveredPublicKey = bytesToHex( + ecrecover(toUint8Array(encodedTypedDataHash), v, r, s), + ); + + const recoveredAddress = `0x${keccak256(bytesToHex(recoveredPublicKey)).slice(-40)}`; + // eslint-disable-next-line jest/no-standalone-expect + expect(recoveredAddress).toBe(tempAcc.address); + }, + ); +}); diff --git a/packages/web3-eth/test/integration/web3_eth/submit_work.test.ts b/packages/web3-eth/test/integration/web3_eth/submit_work.test.ts new file mode 100644 index 00000000000..d3817d551b4 --- /dev/null +++ b/packages/web3-eth/test/integration/web3_eth/submit_work.test.ts @@ -0,0 +1,48 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Eth } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, + getSystemTestProvider, + itIf, + BACKEND +} from '../../fixtures/system_test_utils'; + +describe('Web3Eth.submitWork', () => { + let web3Eth: Web3Eth; + + beforeAll(() => { + web3Eth = new Web3Eth(getSystemTestProvider()); + }); + + afterAll(async () => { + await closeOpenConnection(web3Eth); + }); + + // Hardhat and Geth doesn't support eth_submitWork + itIf(getSystemTestBackend() !== BACKEND.GETH && getSystemTestBackend() !== BACKEND.HARDHAT)('should submit work', async () => { + const response = await web3Eth.submitWork( + '0x0000000000000001', + '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', + '0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000', + ); + // eslint-disable-next-line jest/no-standalone-expect + expect(response).toBe(false); + }); +}); diff --git a/packages/web3-eth/test/shared_fixtures b/packages/web3-eth/test/shared_fixtures new file mode 120000 index 00000000000..729a61c9ef4 --- /dev/null +++ b/packages/web3-eth/test/shared_fixtures @@ -0,0 +1 @@ +../../../fixtures \ No newline at end of file diff --git a/packages/web3-eth/test/tsconfig.json b/packages/web3-eth/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-eth/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-eth/test/unit/constructor.test.ts b/packages/web3-eth/test/unit/constructor.test.ts new file mode 100644 index 00000000000..5d08d50bebc --- /dev/null +++ b/packages/web3-eth/test/unit/constructor.test.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// import Web3ProviderBase from '../../src/index' +// import {ProviderOptions} from '../../types' + +describe('constructs a PLACEHOLDER instance with expected properties', () => { + // let providerOptions: ProviderOptions + + beforeEach(() => { + // providerOptions = { + // providerUrl: 'http://127.0.0.1:8545' + // } + }); + + it('should construct with expected properties', () => { + // const web3ProviderBase = new Web3ProviderBase(providerOptions) + // expect(web3ProviderBase).toMatchObject({ + // _providerUrl: providerOptions.providerUrl + // }) + expect(true).toBeTruthy(); + }); +}); diff --git a/packages/web3-eth/test/unit/decoding.test.ts b/packages/web3-eth/test/unit/decoding.test.ts new file mode 100644 index 00000000000..94627d84575 --- /dev/null +++ b/packages/web3-eth/test/unit/decoding.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiEventFragment, LogsInput } from 'web3-types'; +import { decodeEventABI } from '../../src'; +import { decodeEventABIData } from '../fixtures/decoding'; + +describe('decoding functions', () => { + describe('decode', () => { + describe('decodeEventABI', () => { + it.each(decodeEventABIData)( + '%s', + (event: AbiEventFragment & { signature: string }, inputs: LogsInput, output) => { + expect( + decodeEventABI(event, inputs, [ + { signature: event.signature } as unknown as AbiEventFragment & { + signature: string; + }, + ]), + ).toStrictEqual(output); + }, + ); + }); + }); +}); diff --git a/packages/web3-eth/test/unit/default_transaction_builder.test.ts b/packages/web3-eth/test/unit/default_transaction_builder.test.ts new file mode 100644 index 00000000000..0e065806393 --- /dev/null +++ b/packages/web3-eth/test/unit/default_transaction_builder.test.ts @@ -0,0 +1,721 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + EthExecutionAPI, + PopulatedUnsignedEip1559Transaction, + PopulatedUnsignedEip2930Transaction, + Transaction, + ValidChains, + Hardfork, +} from 'web3-types'; +import { Web3Context } from 'web3-core'; +import HttpProvider from 'web3-providers-http'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; +import { + Eip1559NotSupportedError, + TransactionDataAndInputError, + UnableToPopulateNonceError, + UnsupportedTransactionTypeError, +} from 'web3-errors'; +import { defaultTransactionBuilder } from '../../src/utils/transaction_builder'; + +jest.mock('web3-rpc-methods'); +const expectedNetworkId = '0x4'; +jest.mock('web3-net', () => ({ + getId: jest.fn().mockImplementation(() => expectedNetworkId), +})); + +describe('defaultTransactionBuilder', () => { + const expectedFrom = '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01'; + const expectedNonce = '0x42'; + const expectedGas = BigInt(21000); + const expectedGasLimit = expectedGas; + const expectedGasPrice = '0x4a817c800'; + const expectedBaseFeePerGas = '0x13afe8b904'; + const expectedMaxPriorityFeePerGas = '0x9502f900'; + const expectedMaxFeePerGas = '0x27f4d46b08'; + const expectedChainId = '0x1'; + const defaultTransactionType = '0x0'; + const transaction: Transaction = { + from: expectedFrom, + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: expectedGas, + gasLimit: expectedGasLimit, + gasPrice: expectedGasPrice, + type: '0x0', + maxFeePerGas: expectedMaxFeePerGas, + maxPriorityFeePerGas: expectedMaxPriorityFeePerGas, + data: '0x', + nonce: expectedNonce, + chain: 'mainnet', + hardfork: 'berlin', + chainId: expectedChainId, + networkId: expectedNetworkId, + common: { + customChain: { + name: 'foo', + networkId: expectedNetworkId, + chainId: expectedChainId, + }, + baseChain: 'mainnet', + hardfork: 'berlin', + }, + }; + const mockBlockData = { + parentHash: '0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + miner: '0xbb7b8287f3f0a933474a79eae42cbca977791171', + stateRoot: '0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d', + transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + difficulty: '0x4ea3f27bc', + number: '0x1b4', + gasLimit: '0x1388', + gasUsed: '0x1c96e73', + timestamp: '0x55ba467c', + extraData: '0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32', + mixHash: '0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843', + nonce: '0x1c11920a4', + totalDifficulty: '0x78ed983323d', + size: '0x220', + transactions: [ + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + ], + uncles: [ + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + ], + hash: '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + baseFeePerGas: expectedBaseFeePerGas, + }; + let web3Context: Web3Context; + let getTransactionCountSpy: jest.SpyInstance; + + beforeEach(() => { + jest.spyOn(ethRpcMethods, 'getBlockByNumber').mockResolvedValue(mockBlockData); + getTransactionCountSpy = jest + .spyOn(ethRpcMethods, 'getTransactionCount') + .mockResolvedValue(expectedNonce); + jest.spyOn(ethRpcMethods, 'getGasPrice').mockResolvedValue(expectedGasPrice); + jest.spyOn(ethRpcMethods, 'getChainId').mockResolvedValue(expectedChainId); + + web3Context = new Web3Context(new HttpProvider('http://127.0.0.1')); + }); + + it.skip('should call override method', async () => { + const overrideFunction = jest.fn(); + const input = { ...transaction }; + await defaultTransactionBuilder({ + transaction: input, + web3Context, + // VALID_ETH_BASE_TYPES.HexString, + // '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + // overrideFunction, + fillGasPrice: true, + }); + expect(overrideFunction).toHaveBeenCalledWith(input); + }); + + describe('should populate from', () => { + it('should use privateKey to populate', async () => { + const input = { ...transaction }; + delete input.from; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', + fillGasPrice: true, + }); + expect(result.from).toBe(expectedFrom); + }); + + it('should use web3Context.defaultAccount to populate', async () => { + web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { + defaultAccount: expectedFrom, + }, + }); + + const input = { ...transaction }; + delete input.from; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.from).toBe(expectedFrom); + }); + }); + + describe('should populate nonce', () => { + it('should throw UnableToPopulateNonceError', async () => { + const input = { ...transaction }; + delete input.from; + delete input.nonce; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + await expect( + defaultTransactionBuilder({ transaction: input, web3Context, fillGasPrice: true }), + ).rejects.toThrow(new UnableToPopulateNonceError()); + }); + + it('should use web3Eth.getTransactionCount to populate nonce', async () => { + const input = { ...transaction }; + delete input.nonce; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.nonce).toBe(expectedNonce); + expect(getTransactionCountSpy).toHaveBeenCalledWith( + web3Context.requestManager, + expectedFrom, + web3Context.defaultBlock, + ); + }); + + it('should use web3Eth.getTransactionCount to populate nonce without gas fill', async () => { + const input = { ...transaction }; + delete input.nonce; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: false, + }); + expect(result.nonce).toBe(expectedNonce); + expect(getTransactionCountSpy).toHaveBeenCalledWith( + web3Context.requestManager, + expectedFrom, + web3Context.defaultBlock, + ); + }); + }); + + describe('should populate value', () => { + it('should populate with 0x0 if not provided', async () => { + const input = { ...transaction }; + delete input.value; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.value).toBe('0x0'); + }); + + + it('should not populate with 0x0 if provided', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.value).not.toBe('0x0'); + }); + }); + + describe('should populate input/data', () => { + it('should populate input with 0x', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + delete input.data; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.input).toBe('0x'); + expect(result.data).toBeUndefined(); + }); + + it('should prefix input with 0x', async () => { + const input = { ...transaction }; + input.input = '123'; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + delete input.data; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.input).toBe('0x123'); + expect(result.data).toBeUndefined(); + }); + + it('should prefix data with 0x', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + input.data = '123'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.input).toBeUndefined(); + expect(result.data).toBe('0x123'); + }); + + it('should throw TransactionDataAndInputError', async () => { + const input = { ...transaction }; + input.data = '0x3211'; + input.input = '0x1233'; + + await expect( + defaultTransactionBuilder({ + transaction: input, + web3Context, + }), + ).rejects.toThrow(TransactionDataAndInputError); + }); + }); + + describe('should populate chain', () => { + it('should populate with mainnet', async () => { + const input = { ...transaction }; + delete input.chain; + delete input.common; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.chain).toBe('mainnet'); + }); + + it('should use web3Context.defaultChain to populate', async () => { + web3Context = new Web3Context(new HttpProvider('http://127.0.0.1')); + + const input = { ...transaction }; + delete input.chain; + delete input.common; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.chain).toBe(web3Context.defaultChain); + }); + }); + + describe('should populate hardfork', () => { + it('should populate with london', async () => { + const input = { ...transaction }; + delete input.hardfork; + delete input.common; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.hardfork).toBe('london'); + }); + + it('should use web3Context.defaultHardfork to populate', async () => { + web3Context = new Web3Context(new HttpProvider('http://127.0.0.1')); + + const input = { ...transaction }; + delete input.hardfork; + delete input.common; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.hardfork).toBe(web3Context.defaultHardfork); + }); + + it('should use web3Context.defaultCommon to populate', async () => { + const baseChain: ValidChains = 'mainnet'; + const hardfork: Hardfork = 'berlin'; + const customCommon = { + customChain: { + name: 'custom', + networkId: '0x3', + chainId: '0x1', + }, + baseChain, + hardfork, + }; + + web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { + defaultCommon: customCommon, + }, + }); + + const input = { ...transaction }; + delete input.common; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.common).toStrictEqual(customCommon); + }); + }); + + describe('should populate chainId', () => { + it('should populate with web3Eth.getChainId', async () => { + const input = { ...transaction }; + delete input.chainId; + delete input.common; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.chainId).toBe(expectedChainId); + }); + }); + + describe('should populate networkId', () => { + it('should populate with web3Net.getId', async () => { + const input = { ...transaction }; + delete input.networkId; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.networkId).toBe(expectedNetworkId); + }); + }); + + describe('should populate gasLimit', () => { + it('should populate with gas', async () => { + const input = { ...transaction }; + delete input.gasLimit; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.gasLimit).toBe(expectedGasLimit); + }); + }); + + describe('should populate type', () => { + it('should throw UnsupportedTransactionTypeError', async () => { + const input = { ...transaction }; + input.type = '0x80'; // // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-2718.md#transactions + + await expect( + defaultTransactionBuilder({ transaction: input, web3Context, fillGasPrice: true }), + ).rejects.toThrow(new UnsupportedTransactionTypeError(input.type)); + }); + + it('should use web3Context.defaultTransactionType to populate', async () => { + web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { + defaultTransactionType, + }, + }); + + const input = { ...transaction }; + delete input.gas; + delete input.gasLimit; + delete input.gasPrice; + delete input.maxFeePerGas; + delete input.maxPriorityFeePerGas; + delete input.accessList; + delete input.type; + + input.hardfork = 'istanbul'; + if (!isNullish(input.common)) input.common.hardfork = 'istanbul'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.type).toBe(web3Context.defaultTransactionType); + }); + }); + + describe('should populate gasPrice', () => { + it('should populate with web3Eth.getGasPrice (tx.type 0x0)', async () => { + const input = { ...transaction }; + delete input.gasPrice; + delete input.maxFeePerGas; + delete input.maxPriorityFeePerGas; + input.type = '0x0'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.gasPrice).toBe(expectedGasPrice); + }); + + it('should populate with web3Eth.getGasPrice (tx.type 0x1)', async () => { + const input = { ...transaction }; + delete input.gasPrice; + delete input.maxFeePerGas; + delete input.maxPriorityFeePerGas; + input.type = '0x1'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.gasPrice).toBe(expectedGasPrice); + }); + }); + + describe('should populate accessList', () => { + it('should populate with [] (tx.type 0x1)', async () => { + const input = { ...transaction }; + delete input.accessList; + delete input.maxFeePerGas; + delete input.maxPriorityFeePerGas; + input.type = '0x1'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.accessList).toStrictEqual([]); + }); + + it('should populate with [] (tx.type 0x2)', async () => { + const input = { ...transaction }; + delete input.accessList; + delete input.gasPrice; + input.type = '0x2'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.accessList).toStrictEqual([]); + }); + }); + + describe('should populate maxPriorityFeePerGas and maxFeePerGas', () => { + it('should throw Eip1559NotSupportedError', async () => { + const mockBlockDataNoBaseFeePerGas = { ...mockBlockData, baseFeePerGas: undefined }; + jest.spyOn(ethRpcMethods, 'getBlockByNumber').mockImplementation( + // @ts-expect-error - Mocked implementation doesn't have correct method signature + // (i.e. requestManager, blockNumber, hydrated params), but that doesn't matter for the test + () => mockBlockDataNoBaseFeePerGas, + ); + + const input = { ...transaction }; + delete input.gasPrice; + input.type = '0x2'; + + await expect( + defaultTransactionBuilder({ transaction: input, web3Context, fillGasPrice: true }), + ).rejects.toThrow(new Eip1559NotSupportedError()); + }); + + it('should populate with gasPrice', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + delete input.gasPrice; + input.type = '0x2'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + + expect(result.maxPriorityFeePerGas).toBeDefined(); + expect(result.gasPrice).toBeUndefined(); + }); + + it('should populate with default maxPriorityFeePerGas and calculated maxFeePerGas (no maxPriorityFeePerGas and maxFeePerGas)', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + delete input.gasPrice; + input.type = '0x2'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.maxPriorityFeePerGas).toBe(expectedMaxPriorityFeePerGas); // 2.5 Gwei, hardcoded in defaultTransactionBuilder; + expect(result.maxFeePerGas).toBe(expectedMaxFeePerGas); + }); + + it('should populate with default maxPriorityFeePerGas and calculated maxFeePerGas (no maxFeePerGas)', async () => { + const input = { ...transaction }; + delete input.maxFeePerGas; + delete input.gasPrice; + input.type = '0x2'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.maxPriorityFeePerGas).toBe(expectedMaxPriorityFeePerGas); // 2.5 Gwei, hardcoded in defaultTransactionBuilder; + expect(result.maxFeePerGas).toBe(expectedMaxFeePerGas); + }); + + it('should populate with default maxPriorityFeePerGas and calculated maxFeePerGas (no maxPriorityFeePerGas)', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.gasPrice; + input.type = '0x2'; + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.maxPriorityFeePerGas).toBe(expectedMaxPriorityFeePerGas); // 2.5 Gwei, hardcoded in defaultTransactionBuilder; + expect(result.maxFeePerGas).toBe(expectedMaxFeePerGas); + }); + + it('should populate with web3Context.defaultMaxPriorityFeePerGas and calculated maxFeePerGas (no maxPriorityFeePerGas and maxFeePerGas)', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.maxFeePerGas; + delete input.gasPrice; + input.type = '0x2'; + + web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { + defaultMaxPriorityFeePerGas: expectedMaxPriorityFeePerGas, + }, + }); + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.maxPriorityFeePerGas).toBe(web3Context.defaultMaxPriorityFeePerGas); // 2.5 Gwei, hardcoded in defaultTransactionBuilder; + expect(result.maxFeePerGas).toBe(expectedMaxFeePerGas); + }); + + it('should populate with web3Context.defaultMaxPriorityFeePerGas and calculated maxFeePerGas (no maxFeePerGas)', async () => { + const input = { ...transaction }; + delete input.maxFeePerGas; + delete input.gasPrice; + input.type = '0x2'; + + web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { + defaultMaxPriorityFeePerGas: expectedMaxPriorityFeePerGas, + }, + }); + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.maxPriorityFeePerGas).toBe(web3Context.defaultMaxPriorityFeePerGas); // 2.5 Gwei, hardcoded in defaultTransactionBuilder; + expect(result.maxFeePerGas).toBe(expectedMaxFeePerGas); + }); + + it('should populate with web3Context.defaultMaxPriorityFeePerGas and calculated maxFeePerGas (no maxPriorityFeePerGas)', async () => { + const input = { ...transaction }; + delete input.maxPriorityFeePerGas; + delete input.gasPrice; + input.type = '0x2'; + + web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { + defaultMaxPriorityFeePerGas: expectedMaxPriorityFeePerGas, + }, + }); + + const result = await defaultTransactionBuilder({ + transaction: input, + web3Context, + fillGasPrice: true, + }); + expect(result.maxPriorityFeePerGas).toBe(web3Context.defaultMaxPriorityFeePerGas); // 2.5 Gwei, hardcoded in defaultTransactionBuilder; + expect(result.maxFeePerGas).toBe(expectedMaxFeePerGas); + }); + }); +}); diff --git a/packages/web3-eth/test/unit/detect_transaction_type.test.ts b/packages/web3-eth/test/unit/detect_transaction_type.test.ts new file mode 100644 index 00000000000..4d583bbad17 --- /dev/null +++ b/packages/web3-eth/test/unit/detect_transaction_type.test.ts @@ -0,0 +1,89 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { InvalidPropertiesForTransactionTypeError } from 'web3-errors'; +import { Web3Context } from 'web3-core'; +import { EthExecutionAPI } from 'web3-types'; +import HttpProvider from 'web3-providers-http'; + +import { detectTransactionType } from '../../src/utils/detect_transaction_type'; +import { + transactionType0x0, + transactionType0x1, + transactionType0x2, + transactionTypeUndefined, + transactionTypeValidationError, +} from '../fixtures/detect_transaction_type'; + + +jest.mock('../../src/rpc_method_wrappers'); + +describe('detectTransactionType', () => { + afterAll(() => { + jest.resetAllMocks(); + }); + + describe('should detect transaction type 0x0', () => { + const web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1:80'), + }); + it.each(transactionType0x0)('%s', async transaction => { + expect(detectTransactionType(transaction, web3Context)).toBe('0x0'); + }); + }); + + describe('should detect transaction type 0x1', () => { + const web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1:80'), + }); + it.each(transactionType0x1)('%s', async transaction => { + expect(detectTransactionType(transaction, web3Context)).toBe('0x1'); + }); + }); + + describe('should detect transaction type 0x2', () => { + const web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1:80'), + }); + it.each(transactionType0x2)('%s', async transaction => { + expect(detectTransactionType(transaction, web3Context)).toBe('0x2'); + }); + }); + + describe('should not be able to detect transaction type, returning undefined', () => { + const web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1:80'), + }); + it.each(transactionTypeUndefined)('%s', async transaction => { + expect(detectTransactionType(transaction, web3Context)).toBeUndefined(); + }); + }); + + describe('should throw validation error', () => { + const web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1:80'), + }); + it.each(transactionTypeValidationError)('%s', async transaction => { + let err; + try { + detectTransactionType(transaction, web3Context); + } catch (error) { + err = error; + } + expect(err).toBeInstanceOf(InvalidPropertiesForTransactionTypeError); + }); + }); +}); diff --git a/packages/web3-eth/test/unit/errors.test.ts b/packages/web3-eth/test/unit/errors.test.ts new file mode 100644 index 00000000000..e51cb8764a8 --- /dev/null +++ b/packages/web3-eth/test/unit/errors.test.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { InvalidTransactionCall, InvalidTransactionWithSender } from 'web3-errors'; +import { InvalidTransactionWithSenderData, InvalidTransactionCallData } from '../fixtures/errors'; + +describe('errors', () => { + it.each(InvalidTransactionWithSenderData)('%s', (input, output) => { + expect(() => { + throw new InvalidTransactionWithSender(input); + }).toThrow(output); + }); + + it.each(InvalidTransactionCallData)('%s', (input, output) => { + expect(() => { + throw new InvalidTransactionCall(input); + }).toThrow(output); + }); +}); diff --git a/packages/web3-eth/test/unit/format_rpc_methods.test.ts b/packages/web3-eth/test/unit/format_rpc_methods.test.ts new file mode 100644 index 00000000000..23156d96d28 --- /dev/null +++ b/packages/web3-eth/test/unit/format_rpc_methods.test.ts @@ -0,0 +1,55 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ethRpcMethods } from 'web3-rpc-methods'; +import { DEFAULT_RETURN_FORMAT } from 'web3-types'; +import { numberToHex, isNullish } from 'web3-utils'; +import * as rpcMethodWrappers from '../../src/rpc_method_wrappers'; +import { getPastLogsValidFormatData } from '../fixtures/web3_eth_methods_with_parameters'; +import Web3Eth from '../../src/index'; + +jest.mock('web3-rpc-methods'); +describe('web3_eth_methods formatting', () => { + let web3Eth: Web3Eth; + + beforeAll(() => { + web3Eth = new Web3Eth('http://127.0.0.1:8545'); + }); + + describe('getPastLogs makes sure data is prepared properly', () => { + it.each(getPastLogsValidFormatData)('input: %s\nrpcMethodParameters: %s', async filter => { + jest.spyOn(ethRpcMethods, 'getLogs').mockResolvedValue(['']); + await rpcMethodWrappers.getLogs(web3Eth, filter, DEFAULT_RETURN_FORMAT); + let { fromBlock, toBlock } = filter; + if ( + !isNullish(filter.fromBlock) && + (typeof filter.fromBlock === 'bigint' || typeof filter.fromBlock === 'number') + ) + fromBlock = numberToHex(filter.fromBlock); + if ( + !isNullish(filter.toBlock) && + (typeof filter.toBlock === 'bigint' || typeof filter.toBlock === 'number') + ) + toBlock = numberToHex(filter.toBlock); + expect(ethRpcMethods.getLogs).toHaveBeenCalledWith(web3Eth.requestManager, { + ...filter, + toBlock, + fromBlock, + }); + }); + }); +}); diff --git a/packages/web3-eth/test/unit/format_transaction.test.ts b/packages/web3-eth/test/unit/format_transaction.test.ts new file mode 100644 index 00000000000..9ce83aaa941 --- /dev/null +++ b/packages/web3-eth/test/unit/format_transaction.test.ts @@ -0,0 +1,119 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Transaction } from 'web3-types'; +import { TransactionDataAndInputError } from 'web3-errors'; + +import { formatTransaction } from '../../src/utils/format_transaction'; +import { + bytesAsHexStringTransaction, + numbersAsBigIntTransaction, + numbersAsHexStringTransaction, + numbersAsStringTransaction, + numbersAsNumberTransaction, + bytesAsUint8ArrayTransaction, +} from '../fixtures/format_transaction'; +import { objectBigintToString } from '../fixtures/system_test_utils'; + +const transactionsDataForNumberTypes: Record> = { + [FMT_NUMBER.BIGINT]: numbersAsBigIntTransaction, + [FMT_NUMBER.HEX]: numbersAsHexStringTransaction, + [FMT_NUMBER.NUMBER]: numbersAsNumberTransaction, + [FMT_NUMBER.STR]: numbersAsStringTransaction, +}; + +const transactionsDataForByteTypes: Record> = { + [FMT_BYTES.HEX]: bytesAsHexStringTransaction, + [FMT_BYTES.UINT8ARRAY]: bytesAsUint8ArrayTransaction, +}; + +describe('formatTransaction', () => { + it.skip('should call override method', () => { + const overrideFunction = jest.fn(); + formatTransaction(numbersAsHexStringTransaction, DEFAULT_RETURN_FORMAT); + expect(overrideFunction).toHaveBeenCalledWith(numbersAsHexStringTransaction); + }); + + describe('numbers fields', () => { + for (const sourceType of Object.keys(transactionsDataForNumberTypes)) { + for (const destinationType of Object.keys(transactionsDataForNumberTypes)) { + it(`should convert "${sourceType}" properties to "${destinationType}"`, () => { + // formatTransaction replaces gasLimit with gas property to follow ETH spec + // https://github.com/ethereum/execution-apis/issues/283 + const expectedFormattedTransaction = + transactionsDataForNumberTypes[destinationType as FMT_NUMBER]; + delete expectedFormattedTransaction.gasLimit; + // formatTransaction replaces data with input to follow ETH spec + delete expectedFormattedTransaction.data; + + expect( + objectBigintToString( + formatTransaction( + transactionsDataForNumberTypes[sourceType as FMT_NUMBER], + { + ...DEFAULT_RETURN_FORMAT, + number: destinationType as FMT_NUMBER, + }, + ), + ), + ).toStrictEqual(objectBigintToString(expectedFormattedTransaction)); + }); + } + } + }); + + describe('bytes fields', () => { + for (const sourceType of Object.keys(transactionsDataForByteTypes)) { + for (const destinationType of Object.keys(transactionsDataForByteTypes)) { + it(`should convert "${sourceType}" properties to "${destinationType}"`, () => { + // formatTransaction replaces gasLimit with gas property to follow ETH spec + // https://github.com/ethereum/execution-apis/issues/283 + const expectedFormattedTransaction = + transactionsDataForByteTypes[destinationType as FMT_BYTES]; + delete expectedFormattedTransaction.gasLimit; + // formatTransaction replaces data with input to follow ETH spec + delete expectedFormattedTransaction.data; + + expect( + objectBigintToString( + formatTransaction( + transactionsDataForByteTypes[sourceType as FMT_BYTES], + { + ...DEFAULT_RETURN_FORMAT, + bytes: destinationType as FMT_BYTES, + }, + ), + ), + ).toStrictEqual(objectBigintToString(expectedFormattedTransaction)); + }); + } + } + }); + + it('Should throw a TransactionDataAndInputError error', () => { + const transaction: Transaction = { + data: '0x00', + input: '0x01', + }; + + expect(() => formatTransaction(transaction)).toThrow( + new TransactionDataAndInputError({ + data: transaction.data as string, + input: transaction.input as string, + }), + ); + }); +}); diff --git a/packages/web3-eth/test/unit/jest.config.js b/packages/web3-eth/test/unit/jest.config.js new file mode 100644 index 00000000000..a69a1a92811 --- /dev/null +++ b/packages/web3-eth/test/unit/jest.config.js @@ -0,0 +1,34 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-eth-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-eth/test/unit/prepare_transaction_for_signing.test.ts b/packages/web3-eth/test/unit/prepare_transaction_for_signing.test.ts new file mode 100644 index 00000000000..d53785c2e36 --- /dev/null +++ b/packages/web3-eth/test/unit/prepare_transaction_for_signing.test.ts @@ -0,0 +1,325 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + EthExecutionAPI, + HexString, + Web3NetAPI, + Transaction as TransactionType, +} from 'web3-types'; +import { Web3Context } from 'web3-core'; +import HttpProvider from 'web3-providers-http'; +import { isNullish } from 'web3-validator'; + +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { bytesToHex, hexToBytes } from 'web3-utils'; +import { + AccessListEIP2930Transaction, + FeeMarketEIP1559Transaction, + Transaction, + Hardfork, +} from 'web3-eth-accounts'; +import { prepareTransactionForSigning } from '../../src/utils/prepare_transaction_for_signing'; +import { validTransactions } from '../fixtures/prepare_transaction_for_signing'; + +describe('prepareTransactionForSigning', () => { + const web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { defaultNetworkId: '0x1' }, + }); + + describe('default', () => { + it('use default common', async () => { + const context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { defaultNetworkId: '0x1' }, + }); + context.defaultChain = 'mainnet'; + context.defaultCommon = { + customChain: { + name: 'test', + networkId: 457, + chainId: 1458, + }, + baseChain: 'mainnet', + }; + + async function transactionBuilder(options: { + transaction: TransactionType; + web3Context: Web3Context; + privateKey?: HexString | Uint8Array; + fillGasPrice?: boolean; + fillGasLimit?: boolean; + }): Promise { + const tx = { ...options.transaction }; + + if (isNullish(tx.common)) { + if (options.web3Context.defaultCommon) { + const common = options.web3Context.defaultCommon; + const chainId = common.customChain.chainId as string; + const networkId = common.customChain.networkId as string; + const name = common.customChain.name as string; + tx.common = { + ...common, + customChain: { chainId, networkId, name }, + }; + } + } + return tx as unknown as ReturnType; + } + + context.transactionBuilder = transactionBuilder; + + const ethereumjsTx = await prepareTransactionForSigning( + { + chainId: 1458, + nonce: 1, + gasPrice: BigInt(20000000000), + gas: BigInt(21000), + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + }, + context, + ); + expect(Number(ethereumjsTx.common.networkId())).toBe(457); + expect(ethereumjsTx.common.chainName()).toBe('test'); + }); + }); + + it('should be able to read Hardfork from context.defaultHardfork', async () => { + const context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { defaultNetworkId: '0x9' }, + }); + context.defaultChain = 'mainnet'; + context.defaultHardfork = Hardfork.Istanbul; + + async function transactionBuilder(options: { + transaction: TransactionType; + web3Context: Web3Context; + privateKey?: HexString | Uint8Array; + fillGasPrice?: boolean; + fillGasLimit?: boolean; + }): Promise { + const tx = { ...options.transaction }; + return tx as unknown as ReturnType; + } + + context.transactionBuilder = transactionBuilder; + + const ethereumjsTx = await prepareTransactionForSigning( + { + chainId: 1458, + nonce: 1, + gasPrice: BigInt(20000000000), + gas: BigInt(21000), + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + networkId: 999, + }, + context, + ); + expect(ethereumjsTx.common.hardfork()).toBe(Hardfork.Istanbul); + expect(ethereumjsTx.common.networkId().toString()).toBe('999'); + }); + + it('should be able to read Hardfork from context.config.defaultHardfork and context.defaultCommon.hardfork', async () => { + const context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { defaultNetworkId: '0x9' }, + }); + context.defaultChain = 'mainnet'; + + // if the value here is different from the one in context.defaultCommon.hardfork + // Then an error will be thrown: + // "ConfigHardforkMismatchError: Web3Config hardfork doesnt match in defaultHardfork london and common.hardfork istanbul" + context.config.defaultHardfork = Hardfork.Istanbul; + context.defaultCommon = { + customChain: { + name: 'test', + networkId: 111, + chainId: 1458, + }, + hardfork: Hardfork.Istanbul, + baseChain: 'mainnet', + } as any; + + async function transactionBuilder(options: { + transaction: TransactionType; + web3Context: Web3Context; + privateKey?: HexString | Uint8Array; + fillGasPrice?: boolean; + fillGasLimit?: boolean; + }): Promise { + const tx = { ...options.transaction }; + return tx as unknown as ReturnType; + } + + context.transactionBuilder = transactionBuilder; + + const ethereumjsTx = await prepareTransactionForSigning( + { + chainId: 1458, + nonce: 1, + gasPrice: BigInt(20000000000), + gas: BigInt(21000), + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + }, + context, + ); + expect(ethereumjsTx.common.hardfork()).toBe(Hardfork.Istanbul); + expect(ethereumjsTx.common.networkId().toString()).toBe('111'); + }); + + it('should give priorities to tx.hardfork and tx.networkId over values from context', async () => { + const context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1'), + config: { defaultNetworkId: '0x9' }, + }); + context.defaultChain = 'mainnet'; + + // if the value here is different from the one in context.defaultCommon.hardfork + // Then an error will be thrown: + // "ConfigHardforkMismatchError: Web3Config hardfork doesnt match in defaultHardfork london and common.hardfork istanbul" + context.config.defaultHardfork = Hardfork.Istanbul; + context.defaultCommon = { + customChain: { + name: 'test', + networkId: 111, + chainId: 1458, + }, + hardfork: Hardfork.Istanbul, + baseChain: 'mainnet', + } as any; + + async function transactionBuilder(options: { + transaction: TransactionType; + web3Context: Web3Context; + privateKey?: HexString | Uint8Array; + fillGasPrice?: boolean; + fillGasLimit?: boolean; + }): Promise { + const tx = { ...options.transaction }; + return tx as unknown as ReturnType; + } + + context.transactionBuilder = transactionBuilder; + + // context.transactionBuilder = defaultTransactionBuilder; + + const ethereumjsTx = await prepareTransactionForSigning( + { + chainId: 1458, + nonce: 1, + gasPrice: BigInt(20000000000), + gas: BigInt(21000), + to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', + from: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', + value: '1000000000', + input: '', + networkId: 999, + hardfork: Hardfork.Chainstart, + chain: 'mainnet', + }, + context, + ); + expect(ethereumjsTx.common.hardfork()).toBe(Hardfork.Chainstart); + expect(ethereumjsTx.common.networkId().toString()).toBe('999'); + }); + + describe('should return an web3-utils/tx instance with expected properties', () => { + it.each(validTransactions)( + 'mockBlock: %s\nexpectedTransaction: %s\nexpectedPrivateKey: %s\nexpectedAddress: %s\nexpectedRlpEncodedTransaction: %s\nexpectedTransactionHash: %s\nexpectedMessageToSign: %s\nexpectedV: %s\nexpectedR: %s\nexpectedS: %s', + async ( + mockBlock, + expectedTransaction, + expectedPrivateKey, + expectedAddress, + expectedRlpEncodedTransaction, + expectedTransactionHash, + expectedMessageToSign, + expectedV, + expectedR, + expectedS, + ) => { + // (i.e. requestManager, blockNumber, hydrated params), but that doesn't matter for the test + jest.spyOn(ethRpcMethods, 'estimateGas').mockImplementation( + // @ts-expect-error - Mocked implementation doesn't have correct method signature + () => expectedTransaction.gas, + ); + // @ts-expect-error - Mocked implementation doesn't have correct method signature + jest.spyOn(ethRpcMethods, 'getBlockByNumber').mockImplementation(() => mockBlock); + + const ethereumjsTx = await prepareTransactionForSigning( + expectedTransaction, + web3Context, + expectedPrivateKey, + true, + ); + + // should produce an web3-utils/tx instance + expect( + ethereumjsTx instanceof Transaction || + ethereumjsTx instanceof AccessListEIP2930Transaction || + ethereumjsTx instanceof FeeMarketEIP1559Transaction, + ).toBeTruthy(); + expect(ethereumjsTx.sign).toBeDefined(); + + // should sign transaction + const signedTransaction = ethereumjsTx.sign( + hexToBytes(expectedPrivateKey.substring(2)), + ); + + const senderAddress = signedTransaction.getSenderAddress().toString(); + expect(senderAddress).toBe(expectedAddress.toLowerCase()); + + // should be able to obtain expectedRlpEncodedTransaction + const rlpEncodedTransaction = bytesToHex(signedTransaction.serialize()); + expect(rlpEncodedTransaction).toBe(expectedRlpEncodedTransaction); + + // should be able to obtain expectedTransactionHash + const transactionHash = bytesToHex(signedTransaction.hash()); + expect(transactionHash).toBe(expectedTransactionHash); + + // should be able to obtain expectedMessageToSign + const messageToSign = bytesToHex(signedTransaction.getMessageToSign()); + expect(messageToSign).toBe(expectedMessageToSign); + // should have expected v, r, and s + const v = !isNullish(signedTransaction.v) + ? `0x${signedTransaction.v.toString(16)}` + : ''; + const r = !isNullish(signedTransaction.r) + ? `0x${signedTransaction.r.toString(16)}` + : ''; + const s = !isNullish(signedTransaction.s) + ? `0x${signedTransaction.s.toString(16)}` + : ''; + expect(v).toBe(expectedV); + expect(r).toBe(expectedR); + expect(s).toBe(expectedS); + }, + ); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/call.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/call.test.ts new file mode 100644 index 00000000000..e981aef6a10 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/call.test.ts @@ -0,0 +1,84 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { + Web3EthExecutionAPI, + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { format } from 'web3-utils'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { call } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/call'; +import { formatTransaction } from '../../../src'; + +jest.mock('web3-rpc-methods'); + +describe('call', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.call with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputTransaction, inputBlockNumber] = inputParameters; + const inputTransactionFormatted = formatTransaction(inputTransaction, ETH_DATA_FORMAT); + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await call(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.call).toHaveBeenCalledWith( + web3Context.requestManager, + inputTransactionFormatted, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'bytes' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.call as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await call(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/createAccessList.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/createAccessList.test.ts new file mode 100644 index 00000000000..0ffeb0dcad6 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/createAccessList.test.ts @@ -0,0 +1,83 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { Web3EthExecutionAPI, ETH_DATA_FORMAT, FMT_BYTES, FMT_NUMBER } from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { format } from 'web3-utils'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { createAccessList } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/createAccessList'; +import { formatTransaction } from '../../../src'; + +jest.mock('web3-rpc-methods'); + +describe('createAccessList', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.createAccessList with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputTransaction, inputBlockNumber] = inputParameters; + const inputTransactionFormatted = formatTransaction(inputTransaction, ETH_DATA_FORMAT); + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await createAccessList(web3Context, ...inputParameters); + expect(ethRpcMethods.createAccessList).toHaveBeenCalledWith( + web3Context.requestManager, + inputTransactionFormatted, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'bytes' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.createAccessList as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await createAccessList( + web3Context, + inputParameters[0], + inputParameters[1], + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/estimate_gas.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/estimate_gas.test.ts new file mode 100644 index 00000000000..6dc605b67e3 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/estimate_gas.test.ts @@ -0,0 +1,84 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { isNullish } from 'web3-validator'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Web3EthExecutionAPI, +} from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { estimateGas } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/estimate_gas'; +import { formatTransaction } from '../../../src'; + +jest.mock('web3-rpc-methods'); + +describe('call', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.estimateGas with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputTransaction, inputBlockNumber] = inputParameters; + const inputTransactionFormatted = formatTransaction(inputTransaction, ETH_DATA_FORMAT); + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await estimateGas(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.estimateGas).toHaveBeenCalledWith( + web3Context.requestManager, + inputTransactionFormatted, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.estimateGas as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await estimateGas(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/call.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/call.ts new file mode 100644 index 00000000000..e8949e97eab --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/call.ts @@ -0,0 +1,79 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, TransactionCall } from 'web3-types'; + +export const mockRpcResponse = '0x000000000000000000000000000000000000000000000000000000000000000a'; + +const transaction: TransactionCall = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - uncleIndex + * - returnFormat + * - mockRpcResponse + */ +type TestData = [string, [TransactionCall, BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + // blockNumber = BlockTag + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.LATEST`, + [transaction, BlockTags.LATEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.EARLIEST`, + [transaction, BlockTags.EARLIEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.PENDING`, + [transaction, BlockTags.PENDING], + ], + [`${JSON.stringify(transaction)}\nblockNumber = BlockTags.SAFE`, [transaction, BlockTags.SAFE]], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.FINALIZED`, + [transaction, BlockTags.FINALIZED], + ], + // blockNumber = Numbers + [`${JSON.stringify(transaction)}\nblockNumber = "0x4b7"`, [transaction, '0x4b7']], + [`${JSON.stringify(transaction)}\nblockNumber = 1207`, [transaction, 1207]], + [`${JSON.stringify(transaction)}\nblockNumber = "1207"`, [transaction, '1207']], + [ + `${JSON.stringify(transaction)}\nblockNumber = BigInt("0x4b7")`, + [transaction, BigInt('0x4b7')], + ], + [`${JSON.stringify(transaction)}\nblockNumber = undefined`, [transaction, undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/createAccessList.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/createAccessList.ts new file mode 100644 index 00000000000..1984c34c50a --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/createAccessList.ts @@ -0,0 +1,89 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + BlockNumberOrTag, + BlockTags, + DataFormat, + DEFAULT_RETURN_FORMAT, + TransactionForAccessList, +} from 'web3-types'; + +export const mockRpcResponse = + '{"accessList":[{"address":"0x15859bdf5aff2080a9968f6a410361e9598df62f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]}],"gasUsed":"0x7671"}'; + +const transaction: TransactionForAccessList = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x940b25304947ae863568B3804434EC77E2160b87', + value: '0x0', + gas: '0x5208', + gasPrice: '0x4a817c800', + data: '0x9a67c8b100000000000000000000000000000000000000000000000000000000000004d0', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transaction + * - blocknumberortag + * - mockRpcResponse + */ +type TestData = [string, [TransactionForAccessList, BlockNumberOrTag | undefined, DataFormat]]; +export const testData: TestData[] = [ + // blockNumber = BlockTag + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.LATEST`, + [transaction, BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.EARLIEST`, + [transaction, BlockTags.EARLIEST, DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.PENDING`, + [transaction, BlockTags.PENDING, DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.SAFE`, + [transaction, BlockTags.SAFE, DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.FINALIZED`, + [transaction, BlockTags.FINALIZED, DEFAULT_RETURN_FORMAT], + ], + // blockNumber = Numbers + [ + `${JSON.stringify(transaction)}\nblockNumber = "0x4b7"`, + [transaction, '0x4b7', DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = 1207`, + [transaction, 1207, DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = "1207"`, + [transaction, '1207', DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BigInt("0x4b7")`, + [transaction, BigInt('0x4b7'), DEFAULT_RETURN_FORMAT], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = undefined`, + [transaction, BlockTags.LATEST, DEFAULT_RETURN_FORMAT], + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/estimate_gas.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/estimate_gas.ts new file mode 100644 index 00000000000..2dfc07e11fd --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/estimate_gas.ts @@ -0,0 +1,79 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, Transaction } from 'web3-types'; + +export const mockRpcResponse = '0x5208'; + +const transaction: Transaction = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - uncleIndex + * - returnFormat + * - mockRpcResponse + */ +type TestData = [string, [Transaction, BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + // blockNumber = BlockTag + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.LATEST`, + [transaction, BlockTags.LATEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.EARLIEST`, + [transaction, BlockTags.EARLIEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.PENDING`, + [transaction, BlockTags.PENDING], + ], + [`${JSON.stringify(transaction)}\nblockNumber = BlockTags.SAFE`, [transaction, BlockTags.SAFE]], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.FINALIZED`, + [transaction, BlockTags.FINALIZED], + ], + // blockNumber = Numbers + [`${JSON.stringify(transaction)}\nblockNumber = "0x4b7"`, [transaction, '0x4b7']], + [`${JSON.stringify(transaction)}\nblockNumber = 1207`, [transaction, 1207]], + [`${JSON.stringify(transaction)}\nblockNumber = "1207"`, [transaction, '1207']], + [ + `${JSON.stringify(transaction)}\nblockNumber = BigInt("0x4b7")`, + [transaction, BigInt('0x4b7')], + ], + [`${JSON.stringify(transaction)}\nblockNumber = undefined`, [transaction, undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_balance.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_balance.ts new file mode 100644 index 00000000000..6c933d470ea --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_balance.ts @@ -0,0 +1,42 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, BlockNumberOrTag, BlockTags } from 'web3-types'; + +export const mockRpcResponse = '0xe8d4a51000'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - blockNumber + */ +type TestData = [string, [Address, BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + ['blockNumber = BlockTags.LATEST', [address, BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [address, BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [address, BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [address, BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [address, BlockTags.FINALIZED]], + ['blockNumber = "0x4b7"', [address, '0x4b7']], + ['blockNumber = 1207', [address, 1207]], + ['blockNumber = "1207"', [address, '1207']], + ['blockNumber = BigInt("0x4b7")', [address, BigInt('0x4b7')]], + ['blockNumber = undefined', [address, undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block.ts new file mode 100644 index 00000000000..4474bec4972 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block.ts @@ -0,0 +1,146 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Block, TransactionInfo, BlockNumberOrTag, BlockTags, Bytes } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse: Block = { + parentHash: '0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + miner: '0xbb7b8287f3f0a933474a79eae42cbca977791171', + stateRoot: '0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d', + transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + difficulty: '0x4ea3f27bc', + number: '0x1b4', + gasLimit: '0x1388', + gasUsed: '0x1c96e73', + timestamp: '0x55ba467c', + extraData: '0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32', + mixHash: '0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843', + nonce: '0x1c11920a4', + totalDifficulty: '0x78ed983323d', + size: '0x220', + transactions: [ + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + ], + uncles: [ + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + ], + hash: '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + baseFeePerGas: '0x13afe8b904', +}; +const hydratedTransaction: TransactionInfo = { + blockHash: '0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2', + blockNumber: '0x5daf3b', + from: '0xa7d9ddbe1f17865597fbd27ec712455208b6b76d', + gas: '0xc350', + gasPrice: '0x4a817c800', + hash: '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + input: '0x68656c6c6f21', + nonce: '0x15', + to: '0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb', + transactionIndex: '0x41', + value: '0xf3dbb76162000', + v: '0x25', + r: '0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea', + s: '0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c', + type: '0x0', +}; +export const mockRpcResponseHydrated: Block = { + ...mockRpcResponse, + transactions: [hydratedTransaction, hydratedTransaction, hydratedTransaction], +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - hydrated + */ +type TestData = [string, [Bytes | BlockNumberOrTag | undefined, boolean]]; +export const testData: TestData[] = [ + // Testing block cases, hydrated = false + // blockNumber = bytes + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", hydrated = false', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', false], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), hydrated = false', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), false], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), hydrated = false', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + false, + ], + ], + // blockNumber = BlockTag + ['blockNumber = BlockTags.LATEST, hydrated = false', [BlockTags.LATEST, false]], + ['blockNumber = BlockTags.EARLIEST, hydrated = false', [BlockTags.EARLIEST, false]], + ['blockNumber = BlockTags.PENDING, hydrated = false', [BlockTags.PENDING, false]], + ['blockNumber = BlockTags.SAFE, hydrated = false', [BlockTags.SAFE, false]], + ['blockNumber = BlockTags.FINALIZED, hydrated = false', [BlockTags.FINALIZED, false]], + // blockNumber = Numbers + ['blockNumber = "0x4b7", hydrated = false', ['0x4b7', false]], + ['blockNumber = 1207, hydrated = false', [1207, false]], + ['blockNumber = "1207", hydrated = false', ['1207', false]], + ['blockNumber = BigInt("0x4b7"), hydrated = false', [BigInt('0x4b7'), false]], + ['blockNumber = undefined, hydrated = false', [undefined, false]], + + // Testing block cases, hydrated = true + // blockNumber = bytes + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", hydrated = true', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', true], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), hydrated = true', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), true], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), hydrated = true', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + true, + ], + ], + // blockNumber = BlockTag + ['blockNumber = BlockTags.LATEST, hydrated = true', [BlockTags.LATEST, true]], + ['blockNumber = BlockTags.EARLIEST, hydrated = true', [BlockTags.EARLIEST, true]], + ['blockNumber = BlockTags.PENDING, hydrated = true', [BlockTags.PENDING, true]], + // // blockNumber = Numbers + ['blockNumber = "0x4b7", hydrated = true', ['0x4b7', true]], + ['blockNumber = 1207, hydrated = true', [1207, true]], + ['blockNumber = "1207", hydrated = true', ['1207', true]], + ['blockNumber = BigInt("0x4b7"), hydrated = true', [BigInt('0x4b7'), true]], + ['blockNumber = undefined, hydrated = true', [undefined, true]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block_transaction_count.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block_transaction_count.ts new file mode 100644 index 00000000000..db0f08c701b --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block_transaction_count.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, Bytes } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + */ +type TestData = [string, [Bytes | BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + // Testing block cases + // blockNumber = bytes + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8')], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + ], + ], + // blockNumber = BlockTag + ['blockNumber = BlockTags.LATEST', [BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [BlockTags.FINALIZED]], + // blockNumber = Numbers + ['blockNumber = "0x4b7"', ['0x4b7']], + ['blockNumber = 1207', [1207]], + ['blockNumber = "1207"', ['1207']], + ['blockNumber = BigInt("0x4b7")', [BigInt('0x4b7')]], + ['blockNumber = undefined', [undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block_uncle_count.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block_uncle_count.ts new file mode 100644 index 00000000000..db0f08c701b --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_block_uncle_count.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, Bytes } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + */ +type TestData = [string, [Bytes | BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + // Testing block cases + // blockNumber = bytes + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8')], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + ], + ], + // blockNumber = BlockTag + ['blockNumber = BlockTags.LATEST', [BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [BlockTags.FINALIZED]], + // blockNumber = Numbers + ['blockNumber = "0x4b7"', ['0x4b7']], + ['blockNumber = 1207', [1207]], + ['blockNumber = "1207"', ['1207']], + ['blockNumber = BigInt("0x4b7")', [BigInt('0x4b7')]], + ['blockNumber = undefined', [undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_code.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_code.ts new file mode 100644 index 00000000000..d23918f3efa --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_code.ts @@ -0,0 +1,44 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, BlockNumberOrTag, BlockTags } from 'web3-types'; + +export const mockRpcResponse = + '0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - blockNumber + */ +type TestData = [string, [Address, BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + // Testing blockNumber cases + ['blockNumber = BlockTags.LATEST', [address, BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [address, BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [address, BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [address, BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [address, BlockTags.FINALIZED]], + ['blockNumber = "0x4b7"', [address, '0x4b7']], + ['blockNumber = 1207', [address, 1207]], + ['blockNumber = "1207"', [address, '1207']], + ['blockNumber = BigInt("0x4b7")', [address, BigInt('0x4b7')]], + ['blockNumber = undefined', [address, undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_fee_history.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_fee_history.ts new file mode 100644 index 00000000000..54ea874c610 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_fee_history.ts @@ -0,0 +1,107 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { FeeHistoryResultAPI, BlockNumberOrTag, BlockTags, Numbers } from 'web3-types'; + +export const mockRpcResponse: FeeHistoryResultAPI = { + oldestBlock: '0xa30950', + baseFeePerGas: '0x9', + reward: [], + gasUsedRatio: ['0'], +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockCount + * - newestBlock + * - rewardPercentiles + */ +type TestData = [string, [Numbers, BlockNumberOrTag | undefined, Numbers[]]]; +export const testData: TestData[] = [ + // Testing blockCount cases + [ + 'blockCount = "0x4b7", newestBlock = "0xa30950", rewardPercentiles = ["0x0"]', + ['0x4b7', '0xa30950', ['0x0']], + ], + [ + 'blockCount = 1207, newestBlock = "0xa30950", rewardPercentiles = ["0x0"]', + [1207, '0xa30950', ['0x0']], + ], + [ + 'blockCount = "1207", newestBlock = "0xa30950", rewardPercentiles = ["0x0"]', + ['1207', '0xa30950', ['0x0']], + ], + [ + 'blockCount = BigInt("0x4b7"), newestBlock = "0xa30950", rewardPercentiles = ["0x0"]', + [BigInt('0x4b7'), '0xa30950', ['0x0']], + ], + + // Testing newestBlock cases + // blockNumber = BlockTag + [ + 'blockCount = "0x4b7", newestBlock = BlockTags.LATEST, rewardPercentiles = ["0x0"]', + ['0x4b7', BlockTags.LATEST, ['0x0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = BlockTags.EARLIEST, rewardPercentiles = ["0x0"]', + ['0x4b7', BlockTags.EARLIEST, ['0x0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = BlockTags.PENDING, rewardPercentiles = ["0x0"]', + ['0x4b7', BlockTags.PENDING, ['0x0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = BlockTags.SAFE, rewardPercentiles = ["0x0"]', + ['0x4b7', BlockTags.SAFE, ['0x0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = BlockTags.FINALIZED, rewardPercentiles = ["0x0"]', + ['0x4b7', BlockTags.FINALIZED, ['0x0']], + ], + // blockNumber = Numbers + [ + 'blockCount = "0x4b7", newestBlock = 1207, rewardPercentiles = ["0x0"]', + ['0x4b7', 1207, ['0x0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = "1207", rewardPercentiles = ["0x0"]', + ['0x4b7', '1207', ['0x0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = BigInt("0x4b7"), rewardPercentiles = ["0x0"]', + ['0x4b7', BigInt('0x4b7'), ['0x0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = undefined, rewardPercentiles = ["0x0"]', + ['0x4b7', undefined, ['0x0']], + ], + + // Testing rewardPercentiles cases + [ + 'blockCount = "0x4b7", newestBlock = "0xa30950", rewardPercentiles = [0]', + ['0x4b7', '0xa30950', [0]], + ], + [ + 'blockCount = "0x4b7", newestBlock = "0xa30950", rewardPercentiles = ["0"]', + ['0x4b7', '0xa30950', ['0']], + ], + [ + 'blockCount = "0x4b7", newestBlock = "0xa30950", rewardPercentiles = [BigInt("0x0")]', + ['0x4b7', '0xa30950', [BigInt('0x0')]], + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_logs.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_logs.ts new file mode 100644 index 00000000000..e38527f2b9a --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_logs.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { FilterResultsAPI, Filter } from 'web3-types'; + +export const mockRpcResponse: FilterResultsAPI = [ + { + logIndex: '0x1', + blockNumber: '0x1b4', + blockHash: '0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d', + transactionHash: '0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf', + transactionIndex: '0x0', + address: '0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d', + data: '0x0000000000000000000000000000000000000000000000000000000000000000', + topics: ['0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5'], + }, +]; + +const filter: Filter = { + address: '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - filter + */ +type TestData = [string, [Filter]]; +export const testData: TestData[] = [[JSON.stringify(filter), [filter]]]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_pending_transactions.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_pending_transactions.ts new file mode 100644 index 00000000000..5ee9d3fd070 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_pending_transactions.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Transaction } from 'web3-types'; + +const transaction: Transaction = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', + input: '0x', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +export const mockRpcResponse: Transaction[] = [transaction, transaction, transaction]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_proof.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_proof.ts new file mode 100644 index 00000000000..ce0f4c7df4a --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_proof.ts @@ -0,0 +1,117 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, BlockNumberOrTag, BlockTags, Bytes } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse = { + accountProof: [ + '0xf90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80', + '0xf90211a0395d87a95873cd98c21cf1df9421af03f7247880a2554e20738eec2c7507a494a0bcf6546339a1e7e14eb8fb572a968d217d2a0d1f3bc4257b22ef5333e9e4433ca012ae12498af8b2752c99efce07f3feef8ec910493be749acd63822c3558e6671a0dbf51303afdc36fc0c2d68a9bb05dab4f4917e7531e4a37ab0a153472d1b86e2a0ae90b50f067d9a2244e3d975233c0a0558c39ee152969f6678790abf773a9621a01d65cd682cc1be7c5e38d8da5c942e0a73eeaef10f387340a40a106699d494c3a06163b53d956c55544390c13634ea9aa75309f4fd866f312586942daf0f60fb37a058a52c1e858b1382a8893eb9c1f111f266eb9e21e6137aff0dddea243a567000a037b4b100761e02de63ea5f1fcfcf43e81a372dafb4419d126342136d329b7a7ba032472415864b08f808ba4374092003c8d7c40a9f7f9fe9cc8291f62538e1cc14a074e238ff5ec96b810364515551344100138916594d6af966170ff326a092fab0a0d31ac4eef14a79845200a496662e92186ca8b55e29ed0f9f59dbc6b521b116fea090607784fe738458b63c1942bba7c0321ae77e18df4961b2bc66727ea996464ea078f757653c1b63f72aff3dcc3f2a2e4c8cb4a9d36d1117c742833c84e20de994a0f78407de07f4b4cb4f899dfb95eedeb4049aeb5fc1635d65cf2f2f4dfd25d1d7a0862037513ba9d45354dd3e36264aceb2b862ac79d2050f14c95657e43a51b85c80', + '0xf90171a04ad705ea7bf04339fa36b124fa221379bd5a38ffe9a6112cb2d94be3a437b879a08e45b5f72e8149c01efcb71429841d6a8879d4bbe27335604a5bff8dfdf85dcea00313d9b2f7c03733d6549ea3b810e5262ed844ea12f70993d87d3e0f04e3979ea0b59e3cdd6750fa8b15164612a5cb6567cdfb386d4e0137fccee5f35ab55d0efda0fe6db56e42f2057a071c980a778d9a0b61038f269dd74a0e90155b3f40f14364a08538587f2378a0849f9608942cf481da4120c360f8391bbcc225d811823c6432a026eac94e755534e16f9552e73025d6d9c30d1d7682a4cb5bd7741ddabfd48c50a041557da9a74ca68da793e743e81e2029b2835e1cc16e9e25bd0c1e89d4ccad6980a041dda0a40a21ade3a20fcd1a4abb2a42b74e9a32b02424ff8db4ea708a5e0fb9a09aaf8326a51f613607a8685f57458329b41e938bb761131a5747e066b81a0a16808080a022e6cef138e16d2272ef58434ddf49260dc1de1f8ad6dfca3da5d2a92aaaadc58080', + '0xf851808080a009833150c367df138f1538689984b8a84fc55692d3d41fe4d1e5720ff5483a6980808080808080808080a0a319c1c415b271afc0adcb664e67738d103ac168e0bc0b7bd2da7966165cb9518080', + ], + balance: '0x0', + codeHash: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + nonce: '0x0', + storageHash: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + storageProof: [ + { + key: '0x0000000000000000000000000000000000000000000000000000000000000000', + value: '0x0', + proof: [], + }, + { + key: '0x0000000000000000000000000000000000000000000000000000000000000001', + value: '0x0', + proof: [], + }, + ], +}; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - storageKey + * - blockNumber + */ +type TestData = [string, [Address, Bytes[] | Uint8Array[], BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + // Testing storageKey cases + // storageKey = HexString + [ + 'storageKey = ["0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"], blockNumber = "0x1"', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], '0x1'], + ], + // storageKey = Uint8Array + [ + 'storageKey = [hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")], blockNumber = "0x1"', + [address, [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8')], '0x1'], + ], + // storageKey = Uint8Array + [ + 'storageKey = [hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8")], blockNumber = "0x1"', + [ + address, + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, + 124, 251, 248, + ]), + ], + '0x1', + ], + ], + + // Testing blockNumber cases + // blockNumber = BlockTag + [ + 'blockNumber = BlockTags.LATEST', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], BlockTags.LATEST], + ], + [ + 'blockNumber = BlockTags.EARLIEST', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], BlockTags.EARLIEST], + ], + [ + 'blockNumber = BlockTags.PENDING', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], BlockTags.PENDING], + ], + [ + 'blockNumber = BlockTags.SAFE', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], BlockTags.SAFE], + ], + [ + 'blockNumber = BlockTags.FINALIZED', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], BlockTags.FINALIZED], + ], + // blockNumber = Numbers + ['blockNumber = "0x4b7"', [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], '0x4b7']], + ['blockNumber = 1207', [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], 1207]], + ['blockNumber = "1207"', [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], '1207']], + [ + 'blockNumber = BigInt("0x4b7")', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], BigInt('0x4b7')], + ], + [ + 'blockNumber = undefined', + [address, ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], undefined], + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_storage_at.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_storage_at.ts new file mode 100644 index 00000000000..9afd4c3934c --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_storage_at.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, BlockNumberOrTag, BlockTags, Numbers } from 'web3-types'; + +export const mockRpcResponse = '0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - storageSlot + * - blockNumber + */ +type TestData = [string, [Address, Numbers, BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + // Testing storageSlot cases + ['storageSlot = "0x4b7", blockNumber = undefined', [address, '0x4b7', undefined]], + ['storageSlot = 1207, blockNumber = undefined', [address, 1207, undefined]], + ['storageSlot = "1207", blockNumber = undefined', [address, '1207', undefined]], + [ + 'storageSlot = BigInt("0x4b7"), blockNumber = undefined', + [address, BigInt('0x4b7'), undefined], + ], + // Testing blockNumber cases + ['storageSlot = "0x4b7", blockNumber = BlockTags.LATEST', [address, '0x4b7', BlockTags.LATEST]], + [ + 'storageSlot = "0x4b7", blockNumber = BlockTags.EARLIEST', + [address, '0x4b7', BlockTags.EARLIEST], + ], + [ + 'storageSlot = "0x4b7", blockNumber = BlockTags.PENDING', + [address, '0x4b7', BlockTags.PENDING], + ], + ['storageSlot = "0x4b7", blockNumber = BlockTags.SAFE', [address, '0x4b7', BlockTags.SAFE]], + [ + 'storageSlot = "0x4b7", blockNumber = BlockTags.FINALIZED', + [address, '0x4b7', BlockTags.FINALIZED], + ], + ['storageSlot = "0x4b7", blockNumber = "0x4b7"', [address, '0x4b7', '0x4b7']], + ['storageSlot = "0x4b7", blockNumber = 1207', [address, '0x4b7', 1207]], + ['storageSlot = "0x4b7", blockNumber = "1207"', [address, '0x4b7', '1207']], + ['storageSlot = "0x4b7", blockNumber = BigInt("0x4b7")', [address, '0x4b7', BigInt('0x4b7')]], + ['storageSlot = "0x4b7", blockNumber = undefined', [address, '0x4b7', undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction.ts new file mode 100644 index 00000000000..cfc2e81942a --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction.ts @@ -0,0 +1,69 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, TransactionInfo } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse: TransactionInfo = { + accessList: [], + blockHash: '0xc9e87d2d1aa23d241fe281b8db7856c497320aa4f1f582a7fcd4fab7d2addf74', + blockNumber: '0xc66332', + chainId: '0x1', + from: '0xcfb162c6de7ee2b49048b270cb5e297da5b6e6c3', + gas: '0x31d00', + gasPrice: '0xa83613262', + hash: '0x5f67b495f9c53b942cb1bfacaf175ad887372d7227454a971f15f5e6a7639ad1', + input: '0x38ed17390000000000000000000000000000000000000000000000147ebc6d689cc81c8c0000000000000000000000000000000000000000000000005b7471df733ea75c00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cfb162c6de7ee2b49048b270cb5e297da5b6e6c30000000000000000000000000000000000000000000000000000000061134c8f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000d084b83c305dafd76ae3e1b4e1f1fe2ecccb3988000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d2877702675e6ceb975b4a1dff9fb7baf4c91ea9', + data: '0x38ed17390000000000000000000000000000000000000000000000147ebc6d689cc81c8c0000000000000000000000000000000000000000000000005b7471df733ea75c00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cfb162c6de7ee2b49048b270cb5e297da5b6e6c30000000000000000000000000000000000000000000000000000000061134c8f0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000d084b83c305dafd76ae3e1b4e1f1fe2ecccb3988000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d2877702675e6ceb975b4a1dff9fb7baf4c91ea9', + maxFeePerGas: '0xf2cec3661', + maxPriorityFeePerGas: '0xb2d05e00', + nonce: '0xb8', + r: '0x9d201db7621ee0e204841ea374cca3397c7f1a880c5f83207d8cd7e5b4b9e984', + s: '0x391b00b10782665d8c5138aef912ea77a59024bf7962f4d1faedcc45bf91d568', + to: '0x7a250d5630b4cf539739df2c5dacb4c659f2488d', + transactionIndex: '0xc8', + type: '0x2', + v: '0x0', + value: '0x0', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transactionHash + */ +type TestData = [string, [Bytes]]; +export const testData: TestData[] = [ + // transactionHash = Bytes + [ + 'transactionHash = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], + ], + [ + 'transactionHash = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8')], + ], + [ + 'transactionHash = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + ], + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_count.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_count.ts new file mode 100644 index 00000000000..6c933d470ea --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_count.ts @@ -0,0 +1,42 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, BlockNumberOrTag, BlockTags } from 'web3-types'; + +export const mockRpcResponse = '0xe8d4a51000'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - blockNumber + */ +type TestData = [string, [Address, BlockNumberOrTag | undefined]]; +export const testData: TestData[] = [ + ['blockNumber = BlockTags.LATEST', [address, BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [address, BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [address, BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [address, BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [address, BlockTags.FINALIZED]], + ['blockNumber = "0x4b7"', [address, '0x4b7']], + ['blockNumber = 1207', [address, 1207]], + ['blockNumber = "1207"', [address, '1207']], + ['blockNumber = BigInt("0x4b7")', [address, BigInt('0x4b7')]], + ['blockNumber = undefined', [address, undefined]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_from_block.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_from_block.ts new file mode 100644 index 00000000000..b9d768e4664 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_from_block.ts @@ -0,0 +1,197 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, Bytes, Numbers, Transaction } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse: Transaction = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', + input: '0x', + nonce: '0x4', + chain: 'mainnet', + hardfork: 'berlin', + chainId: '0x1', + gasLimit: '0x5208', + v: '0x25', + r: '0x4f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88d', + s: '0x7e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - uncleIndex + * - returnFormat + * - mockRpcResponse + */ +type TestData = [string, [Bytes | BlockNumberOrTag | undefined, Numbers]]; +export const testData: TestData[] = [ + // blockNumber = Bytes, transactionIndex = HexString + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", transactionIndex = "0x0"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', '0x0'], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = "0x0"', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), '0x0'], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = "0x0"', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + '0x0', + ], + ], + // blockNumber = BlockTag, transactionIndex = HexString + ['blockNumber = BlockTags.LATEST, transactionIndex = "0x0"', [BlockTags.LATEST, '0x0']], + ['blockNumber = BlockTags.EARLIEST, transactionIndex = "0x0"', [BlockTags.EARLIEST, '0x0']], + ['blockNumber = BlockTags.PENDING, transactionIndex = "0x0"', [BlockTags.PENDING, '0x0']], + ['blockNumber = BlockTags.SAFE, transactionIndex = "0x0"', [BlockTags.SAFE, '0x0']], + ['blockNumber = BlockTags.FINALIZED, transactionIndex = "0x0"', [BlockTags.FINALIZED, '0x0']], + // blockNumber = Numbers, transactionIndex = HexString + ['blockNumber = "0x4b7", transactionIndex = "0x0"', ['0x4b7', '0x0']], + ['blockNumber = 1207, transactionIndex = "0x0"', [1207, '0x0']], + ['blockNumber = "1207", transactionIndex = "0x0"', ['1207', '0x0']], + ['blockNumber = BigInt("0x4b7"), transactionIndex = "0x0"', [BigInt('0x4b7'), '0x0']], + ['blockNumber = undefined, transactionIndex = "0x0"', [undefined, '0x0']], + + // blockNumber = Bytes, transactionIndex = number + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", transactionIndex = 0', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8, transactionIndex = 0', 0], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = 0', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), 0], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = 0', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + 0, + ], + ], + // blockNumber = BlockTag, transactionIndex = number + ['blockNumber = BlockTags.LATEST, transactionIndex = 0', [BlockTags.LATEST, 0]], + ['blockNumber = BlockTags.EARLIEST, transactionIndex = 0', [BlockTags.EARLIEST, 0]], + ['blockNumber = BlockTags.PENDING, transactionIndex = 0', [BlockTags.PENDING, 0]], + ['blockNumber = BlockTags.SAFE, transactionIndex = "0x0"', [BlockTags.SAFE, 0]], + ['blockNumber = BlockTags.FINALIZED, transactionIndex = "0x0"', [BlockTags.FINALIZED, 0]], + // blockNumber = Numbers, transactionIndex = number + ['blockNumber = "0x4b7"', ['0x4b7, transactionIndex = 0', 0]], + ['blockNumber = 1207, transactionIndex = 0', [1207, 0]], + ['blockNumber = "1207", transactionIndex = 0', ['1207', 0]], + ['blockNumber = BigInt("0x4b7"), transactionIndex = 0', [BigInt('0x4b7'), 0]], + ['blockNumber = undefined, transactionIndex = 0', [undefined, 0]], + + // blockNumber = Bytes, transactionIndex = NumberString + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", transactionIndex = "0"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', '0'], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = "0"', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), '0'], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = "0"', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + '0', + ], + ], + // blockNumber = BlockTag, transactionIndex = NumberString + ['blockNumber = BlockTags.LATEST, transactionIndex = "0"', [BlockTags.LATEST, '0']], + ['blockNumber = BlockTags.EARLIEST, transactionIndex = "0"', [BlockTags.EARLIEST, '0']], + ['blockNumber = BlockTags.PENDING, transactionIndex = "0"', [BlockTags.PENDING, '0']], + ['blockNumber = BlockTags.SAFE, transactionIndex = "0x0"', [BlockTags.SAFE, '0']], + ['blockNumber = BlockTags.FINALIZED, transactionIndex = "0x0"', [BlockTags.FINALIZED, '0']], + // blockNumber = Numbers, transactionIndex = NumberString + ['blockNumber = "0x4b7", transactionIndex = "0"', ['0x4b7', '0']], + ['blockNumber = 1207, transactionIndex = "0"', [1207, '0']], + ['blockNumber = "1207", transactionIndex = "0"', ['1207', '0']], + ['blockNumber = BigInt("0x4b7"), transactionIndex = "0"', [BigInt('0x4b7'), '0']], + ['blockNumber = undefined, transactionIndex = "0"', [undefined, '0']], + + // blockNumber = Bytes, transactionIndex = BigInt + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", transactionIndex = BigInt("0x0")', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', BigInt('0x0')], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = BigInt("0x0")', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), BigInt('0x0')], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), transactionIndex = BigInt("0x0")', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + BigInt('0x0'), + ], + ], + // blockNumber = BlockTag, transactionIndex = BigInt + [ + 'blockNumber = BlockTags.LATEST, transactionIndex = BigInt("0x0")', + [BlockTags.LATEST, BigInt('0x0')], + ], + [ + 'blockNumber = BlockTags.EARLIEST, transactionIndex = BigInt("0x0")', + [BlockTags.EARLIEST, BigInt('0x0')], + ], + [ + 'blockNumber = BlockTags.PENDING, transactionIndex = BigInt("0x0")', + [BlockTags.PENDING, BigInt('0x0')], + ], + [ + 'blockNumber = BlockTags.SAFE, transactionIndex = BigInt("0x0")', + [BlockTags.SAFE, BigInt('0x0')], + ], + [ + 'blockNumber = BlockTags.FINALIZED, transactionIndex = BigInt("0x0")', + [BlockTags.FINALIZED, BigInt('0x0')], + ], + // blockNumber = Numbers, transactionIndex = BigInt + ['blockNumber = "0x4b7", transactionIndex = BigInt("0x0")', ['0x4b7', BigInt('0x0')]], + ['blockNumber = 1207, transactionIndex = BigInt("0x0")', [1207, BigInt('0x0')]], + ['blockNumber = "1207", transactionIndex = BigInt("0x0")', ['1207', BigInt('0x0')]], + [ + 'blockNumber = BigInt("0x4b7"), transactionIndex = BigInt("0x0")', + [BigInt('0x4b7'), BigInt('0x0')], + ], + ['blockNumber = undefined, transactionIndex = BigInt("0x0")', [undefined, BigInt('0x0')]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_receipt.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_receipt.ts new file mode 100644 index 00000000000..2fbc413630a --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_transaction_receipt.ts @@ -0,0 +1,65 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { TransactionReceipt, Bytes } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse: TransactionReceipt = { + transactionHash: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + transactionIndex: '0x41', + blockHash: '0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2', + blockNumber: '0x5daf3b', + from: '0xa7d9ddbe1f17865597fbd27ec712455208b6b76d', + to: '0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb', + cumulativeGasUsed: '0x33bc', // 13244 + gasUsed: '0x4dc', // 1244 + contractAddress: '0xb60e8dd61c5d32be8058bb8eb970870f07233155', + logs: [], + logsBloom: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + root: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + status: '0x1', + effectiveGasPrice: '0x4dc4', // 19908 +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transactionHash + * - returnFormat + * - mockRpcResponse + */ +type TestData = [string, [Bytes]]; +export const testData: TestData[] = [ + // transactionHash = Bytes + [ + 'transactionHash = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'], + ], + [ + 'transactionHash = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8')], + ], + [ + 'transactionHash = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + ], + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_uncle.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_uncle.ts new file mode 100644 index 00000000000..95886e7940a --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/get_uncle.ts @@ -0,0 +1,201 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, Bytes, Numbers, Block } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse: Block = { + parentHash: '0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + miner: '0xbb7b8287f3f0a933474a79eae42cbca977791171', + stateRoot: '0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d', + transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + difficulty: '0x4ea3f27bc', + number: '0x1b4', + gasLimit: '0x1388', + gasUsed: '0x1c96e73', + timestamp: '0x55ba467c', + extraData: '0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32', + mixHash: '0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843', + nonce: '0x1c11920a4', + totalDifficulty: '0x78ed983323d', + size: '0x220', + transactions: [ + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + '0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', + ], + uncles: [ + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + ], + hash: '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', + baseFeePerGas: '0x13afe8b904', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - uncleIndex + */ +type TestData = [string, [Bytes | BlockNumberOrTag | undefined, Numbers]]; +export const testData: TestData[] = [ + // blockNumber = Bytes, uncleIndex = HexString + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", uncleIndex = "0x0"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', '0x0'], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = "0x0"', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), '0x0'], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = "0x0"', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + '0x0', + ], + ], + // blockNumber = BlockTag, uncleIndex = HexString + ['blockNumber = BlockTags.LATEST, uncleIndex = "0x0"', [BlockTags.LATEST, '0x0']], + ['blockNumber = BlockTags.EARLIEST, uncleIndex = "0x0"', [BlockTags.EARLIEST, '0x0']], + ['blockNumber = BlockTags.PENDING, uncleIndex = "0x0"', [BlockTags.PENDING, '0x0']], + ['blockNumber = BlockTags.SAFE, uncleIndex = "0x0"', [BlockTags.SAFE, '0x0']], + ['blockNumber = BlockTags.FINALIZED, uncleIndex = "0x0"', [BlockTags.FINALIZED, '0x0']], + // blockNumber = Numbers, uncleIndex = HexString + ['blockNumber = "0x4b7", uncleIndex = "0x0"', ['0x4b7', '0x0']], + ['blockNumber = 1207, uncleIndex = "0x0"', [1207, '0x0']], + ['blockNumber = "1207", uncleIndex = "0x0"', ['1207', '0x0']], + ['blockNumber = BigInt("0x4b7"), uncleIndex = "0x0"', [BigInt('0x4b7'), '0x0']], + ['blockNumber = undefined, uncleIndex = "0x0"', [undefined, '0x0']], + + // blockNumber = Bytes, uncleIndex = number + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", uncleIndex = 0', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8, uncleIndex = 0', 0], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = 0', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), 0], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = 0', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + 0, + ], + ], + // blockNumber = BlockTag, uncleIndex = number + ['blockNumber = BlockTags.LATEST, uncleIndex = 0', [BlockTags.LATEST, 0]], + ['blockNumber = BlockTags.EARLIEST, uncleIndex = 0', [BlockTags.EARLIEST, 0]], + ['blockNumber = BlockTags.PENDING, uncleIndex = 0', [BlockTags.PENDING, 0]], + ['blockNumber = BlockTags.SAFE, uncleIndex = 0', [BlockTags.SAFE, 0]], + ['blockNumber = BlockTags.FINALIZED, uncleIndex = 0', [BlockTags.FINALIZED, 0]], + // blockNumber = Numbers, uncleIndex = number + ['blockNumber = "0x4b7"', ['0x4b7, uncleIndex = 0', 0]], + ['blockNumber = 1207, uncleIndex = 0', [1207, 0]], + ['blockNumber = "1207", uncleIndex = 0', ['1207', 0]], + ['blockNumber = BigInt("0x4b7"), uncleIndex = 0', [BigInt('0x4b7'), 0]], + ['blockNumber = undefined, uncleIndex = 0', [undefined, 0]], + + // blockNumber = Bytes, uncleIndex = NumberString + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", uncleIndex = "0"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', '0'], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = "0"', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), '0'], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = "0"', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + '0', + ], + ], + // blockNumber = BlockTag, uncleIndex = NumberString + ['blockNumber = BlockTags.LATEST, uncleIndex = "0"', [BlockTags.LATEST, '0']], + ['blockNumber = BlockTags.EARLIEST, uncleIndex = "0"', [BlockTags.EARLIEST, '0']], + ['blockNumber = BlockTags.PENDING, uncleIndex = "0"', [BlockTags.PENDING, '0']], + ['blockNumber = BlockTags.SAFE, uncleIndex = "0"', [BlockTags.SAFE, '0']], + ['blockNumber = BlockTags.FINALIZED, uncleIndex = "0"', [BlockTags.FINALIZED, '0']], + // blockNumber = Numbers, uncleIndex = NumberString + ['blockNumber = "0x4b7", uncleIndex = "0"', ['0x4b7', '0']], + ['blockNumber = 1207, uncleIndex = "0"', [1207, '0']], + ['blockNumber = "1207", uncleIndex = "0"', ['1207', '0']], + ['blockNumber = BigInt("0x4b7"), uncleIndex = "0"', [BigInt('0x4b7'), '0']], + ['blockNumber = undefined, uncleIndex = "0"', [undefined, '0']], + + // blockNumber = Bytes, uncleIndex = BigInt + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8", uncleIndex = BigInt("0x0")', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', BigInt('0x0')], + ], + [ + 'blockNumber = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = BigInt("0x0")', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), BigInt('0x0')], + ], + [ + 'blockNumber = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8"), uncleIndex = BigInt("0x0")', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + BigInt('0x0'), + ], + ], + // blockNumber = BlockTag, uncleIndex = BigInt + [ + 'blockNumber = BlockTags.LATEST, uncleIndex = BigInt("0x0")', + [BlockTags.LATEST, BigInt('0x0')], + ], + [ + 'blockNumber = BlockTags.EARLIEST, uncleIndex = BigInt("0x0")', + [BlockTags.EARLIEST, BigInt('0x0')], + ], + [ + 'blockNumber = BlockTags.PENDING, uncleIndex = BigInt("0x0")', + [BlockTags.PENDING, BigInt('0x0')], + ], + ['blockNumber = BlockTags.SAFE, uncleIndex = BigInt("0x0")', [BlockTags.SAFE, BigInt('0x0')]], + [ + 'blockNumber = BlockTags.FINALIZED, uncleIndex = BigInt("0x0")', + [BlockTags.FINALIZED, BigInt('0x0')], + ], + // blockNumber = Numbers, uncleIndex = BigInt + ['blockNumber = "0x4b7", uncleIndex = BigInt("0x0")', ['0x4b7', BigInt('0x0')]], + ['blockNumber = 1207, uncleIndex = BigInt("0x0")', [1207, BigInt('0x0')]], + ['blockNumber = "1207", uncleIndex = BigInt("0x0")', ['1207', BigInt('0x0')]], + ['blockNumber = BigInt("0x4b7"), uncleIndex = BigInt("0x0")', [BigInt('0x4b7'), BigInt('0x0')]], + ['blockNumber = undefined, uncleIndex = BigInt("0x0")', [undefined, BigInt('0x0')]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/return_formats.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/return_formats.ts new file mode 100644 index 00000000000..4796ab8736c --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/return_formats.ts @@ -0,0 +1,34 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { DataFormat, FMT_BYTES, FMT_NUMBER } from 'web3-types'; + +export const returnFormats: DataFormat[] = [ + { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX }, + { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }, + { number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX }, + { number: FMT_NUMBER.BIGINT, bytes: FMT_BYTES.HEX }, + + { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.BIGINT, bytes: FMT_BYTES.UINT8ARRAY }, + + { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.BIGINT, bytes: FMT_BYTES.UINT8ARRAY }, +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/send_signed_transaction.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/send_signed_transaction.ts new file mode 100644 index 00000000000..f6e41600d12 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/send_signed_transaction.ts @@ -0,0 +1,50 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, TransactionReceipt } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const expectedTransactionHash = + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547'; +export const expectedTransactionReceipt: TransactionReceipt = { + transactionHash: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + transactionIndex: '0x41', + blockHash: '0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2', + blockNumber: '0x5daf3b', + from: '0x7ed0e85b8e1e925600b4373e6d108f34ab38a401', + to: '0x0000000000000000000000000000000000000000', + cumulativeGasUsed: '0x33bc', // 13244 + effectiveGasPrice: '0x13a21bc946', // 84324108614 + gasUsed: '0x4dc', // 1244 + contractAddress: '0xb60e8dd61c5d32be8058bb8eb970870f07233155', + logs: [], + logsBloom: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + root: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + status: '0x1', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - signedTransaction + */ +const signedTransaction = + '0xf8650f8415aa14088252089400000000000000000000000000000000000000000180820a95a0e6d6bc9c7af306733eb44b2a8a4a4efed5db2fbff947e21521fe81dfb144a00aa01a8a87c872f59564abbbe60e9d4e54dee5e1f1647477ab170ecd7e2704d3c94d'; +export const testData: [string, Bytes][] = [ + ['signedTransaction = HexString', signedTransaction], + ['signedTransaction = Uint8Array', hexToBytes(signedTransaction)], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/send_transaction.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/send_transaction.ts new file mode 100644 index 00000000000..05bc02d2c31 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/send_transaction.ts @@ -0,0 +1,112 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Transaction, TransactionReceipt } from 'web3-types'; +import { SendTransactionOptions } from '../../../../src/types'; + +export const expectedTransactionHash = + '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547'; +export const expectedTransactionReceipt: TransactionReceipt = { + transactionHash: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + transactionIndex: '0x41', + blockHash: '0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2', + blockNumber: '0x5daf3b', + from: '0xa7d9ddbe1f17865597fbd27ec712455208b6b76d', + to: '0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb', + cumulativeGasUsed: '0x33bc', // 13244 + effectiveGasPrice: '0x13a21bc946', // 84324108614 + gasUsed: '0x4dc', // 1244 + contractAddress: '0xb60e8dd61c5d32be8058bb8eb970870f07233155', + logs: [], + logsBloom: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + root: '0xe21194c9509beb01be7e90c2bcefff2804cd85836ae12134f22ad4acda0fc547', + status: '0x1', +}; + +const inputTransaction = { + from: '0xa7d9ddbe1f17865597fbd27ec712455208b6b76d', + gas: '0xc350', + gasPrice: '0x4a817c800', + input: '0x68656c6c6f21', + nonce: '0x15', + to: '0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb', + value: '0xf3dbb76162000', + type: '0x0', + maxFeePerGas: '0x1475505aab', + maxPriorityFeePerGas: '0x7f324180', + chainId: '0x1', +}; + +/** + * Array consists of: + * - Test title + * - Input transaction + * - SendTransactionOptions + * - Expected transaction hash + * - Expected receipt info + */ +export const testData: [string, Transaction, SendTransactionOptions | undefined][] = [ + ['Transaction with all hex string values', inputTransaction, undefined], + [ + 'Transaction with all hex string values and SendTransactionOptions.ignoreGasPricing = true', + inputTransaction, + { ignoreGasPricing: true }, + ], + [ + 'Transaction with all hex string values, inputTransaction.gasPrice !== undefined; inputTransaction.maxPriorityFeePerGas === undefined; inputTransaction.maxFeePerGas === undefined', + { + ...inputTransaction, + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }, + { ignoreGasPricing: true }, + ], + [ + 'Transaction with all hex string values, inputTransaction.gasPrice === undefined; inputTransaction.maxPriorityFeePerGas !== undefined; inputTransaction.maxFeePerGas !== undefined', + { + ...inputTransaction, + gasPrice: undefined, + }, + { ignoreGasPricing: true }, + ], + [ + 'Transaction with all hex string values, inputTransaction.gasPrice === undefined; inputTransaction.maxPriorityFeePerGas === undefined; inputTransaction.maxFeePerGas !== undefined', + { + ...inputTransaction, + maxPriorityFeePerGas: undefined, + }, + { ignoreGasPricing: true }, + ], + [ + 'Transaction with all hex string values, inputTransaction.gasPrice === undefined; inputTransaction.maxPriorityFeePerGas !== undefined; inputTransaction.maxFeePerGas === undefined', + { + ...inputTransaction, + maxFeePerGas: undefined, + }, + { ignoreGasPricing: true }, + ], + [ + 'Transaction with all hex string values, inputTransaction.gasPrice === undefined; inputTransaction.maxPriorityFeePerGas === undefined; inputTransaction.maxFeePerGas === undefined', + { + ...inputTransaction, + gasPrice: undefined, + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }, + { ignoreGasPricing: true }, + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign.ts new file mode 100644 index 00000000000..fa3f475d802 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign.ts @@ -0,0 +1,63 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, Bytes, FMT_BYTES, FMT_NUMBER } from 'web3-types'; +import { hexToBytes } from 'web3-utils'; + +export const mockRpcResponse = '0x736f796c656e7420677265656e2069732070656f706c65'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - message + * - address + */ +type TestData = [string, [Bytes, Address]]; +export const testData: TestData[] = [ + [ + 'message = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', address], + ], + [ + 'message = hexToBytes("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [hexToBytes('0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8'), address], + ], + [ + 'message = hexToBytes("d5677cf67b5aa051bb40496e68ad359eb97cfbf8")', + [ + new Uint8Array([ + 213, 103, 124, 246, 123, 90, 160, 81, 187, 64, 73, 110, 104, 173, 53, 158, 185, 124, + 251, 248, + ]), + address, + ], + ], +]; +export const walletTestData: [string, [Bytes, Address | number], any][] = [ + [ + 'message = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', 0], + { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }, + ], + [ + 'message = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', 0], + { number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX }, + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign_transaction.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign_transaction.ts new file mode 100644 index 00000000000..c95fd9b3275 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign_transaction.ts @@ -0,0 +1,190 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + HexStringBytes, + SignedTransactionInfoAPI, + Transaction, + TransactionSignedAPI, + FMT_BYTES, + FMT_NUMBER, +} from 'web3-types'; +import { decodeSignedTransaction } from '../../../../src/utils/decode_signed_transaction'; + +const rawLegacyTransaction: Transaction = { + type: '0x0', + nonce: '0x0', + gasPrice: '0x3b9aca01', + gasLimit: '0x5208', + value: '0x1', + input: '0x', + to: '0x0000000000000000000000000000000000000000', +}; +const signedLegacyTransaction: Transaction = { + ...rawLegacyTransaction, + v: '0xa95', + r: '0xddb601f46a2232d9863f96bf8dabc8fd29d96c880d99f6c763465446f75a71e5', + s: '0x28e3bd580f589a75a3d8d6cf85283692bb52830baba879f153266fda0182882c', +}; +const legacySignedTransactionInfo = { + raw: '0xf86580843b9aca018252089400000000000000000000000000000000000000000180820a95a0ddb601f46a2232d9863f96bf8dabc8fd29d96c880d99f6c763465446f75a71e5a028e3bd580f589a75a3d8d6cf85283692bb52830baba879f153266fda0182882c', + tx: signedLegacyTransaction as TransactionSignedAPI, +}; + +const rawType0x1Transaction: Transaction = { + from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + type: '0x1', + nonce: '0x0', + gasPrice: '0x3b9aca01', + gasLimit: '0x5208', + value: '0x1', + input: '0x', + to: '0x0000000000000000000000000000000000000000', + accessList: [ + { + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000003', + '0x0000000000000000000000000000000000000000000000000000000000000007', + ], + }, + { + address: '0xbb9bc244d798123fde783fcc1c72d3bb8c189413', + storageKeys: [], + }, + ], +}; +const signedType0x1Transaction: Transaction = { + ...rawType0x1Transaction, + v: '0x0', + r: '0xecfaaf5659c3d126d5cdf537bb29fa0a28c1fce7651b64cf3106e4a156549b3e', + s: '0x75b26402a0c72d108cade9c641889ee21189129d5495964e3f42267db4aa837b', +}; +const type0x1SignedTransactionInfo = { + raw: '0x01f8da82053980843b9aca018252089400000000000000000000000000000000000000000180f872f85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000007d694bb9bc244d798123fde783fcc1c72d3bb8c189413c080a0ecfaaf5659c3d126d5cdf537bb29fa0a28c1fce7651b64cf3106e4a156549b3ea075b26402a0c72d108cade9c641889ee21189129d5495964e3f42267db4aa837b', + tx: signedType0x1Transaction as TransactionSignedAPI, +}; + +const rawType0x2Transaction: Transaction = { + from: '0x6E599DA0bfF7A6598AC1224E4985430Bf16458a4', + type: '0x2', + nonce: '0x0', + gasPrice: '0x3b9aca01', + gasLimit: '0x5208', + value: '0x1', + input: '0x', + to: '0x0000000000000000000000000000000000000000', + accessList: [ + { + address: '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000003', + '0x0000000000000000000000000000000000000000000000000000000000000007', + ], + }, + { + address: '0xbb9bc244d798123fde783fcc1c72d3bb8c189413', + storageKeys: [], + }, + ], +}; +const signedType0x2Transaction: Transaction = { + ...rawType0x2Transaction, + v: '0x0', + r: '0xcee64249a5d244614de658ac37c2c2e9e3ba232814401d29d234c57a79ff24a7', + s: '0x2cb0a134943392ebc71c3ff2b8d8d3defaa1d2f0cb5f65311119bcaeff546034', +}; +const type0x2SignedTransactionInfo = { + raw: '0x02f8db820539808252088252088252089400000000000000000000000000000000000000000180f872f85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000007d694bb9bc244d798123fde783fcc1c72d3bb8c189413c080a0b2c321d81024278c17476072d576450a415179e355a247bab30f24052210f20ea066878fda7e04c5993c80cab324456a3c90ad0f8953fe2e64c91255f75ba2b540', + tx: signedType0x2Transaction as TransactionSignedAPI, +}; + +export const returnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transaction + * - SignedTransactionInfoAPI or HexStringBytes (i.e. SignedTransactionInfoAPI.raw) + * - Formatted SignedTransactionInfoAPI + */ +type TestData = [ + string, + [Transaction, SignedTransactionInfoAPI | HexStringBytes, SignedTransactionInfoAPI], +]; +export const testData: TestData[] = [ + [ + JSON.stringify(rawLegacyTransaction), + [ + rawLegacyTransaction, + legacySignedTransactionInfo, + decodeSignedTransaction(legacySignedTransactionInfo.raw, returnFormat, { + fillInputAndData: true, + }), + ], + ], + [ + JSON.stringify(rawLegacyTransaction), + [ + rawLegacyTransaction, + legacySignedTransactionInfo.raw, + decodeSignedTransaction(legacySignedTransactionInfo.raw, returnFormat, { + fillInputAndData: true, + }), + ], + ], + [ + JSON.stringify(rawType0x1Transaction), + [ + rawType0x1Transaction, + type0x1SignedTransactionInfo, + decodeSignedTransaction(type0x1SignedTransactionInfo.raw, returnFormat, { + fillInputAndData: true, + }), + ], + ], + [ + JSON.stringify(rawType0x1Transaction), + [ + rawType0x1Transaction, + type0x1SignedTransactionInfo.raw, + decodeSignedTransaction(type0x1SignedTransactionInfo.raw, returnFormat, { + fillInputAndData: true, + }), + ], + ], + [ + JSON.stringify(rawType0x2Transaction), + [ + rawType0x2Transaction, + type0x2SignedTransactionInfo, + decodeSignedTransaction(type0x2SignedTransactionInfo.raw, returnFormat, { + fillInputAndData: true, + }), + ], + ], + [ + JSON.stringify(rawType0x2Transaction), + [ + rawType0x2Transaction, + type0x2SignedTransactionInfo.raw, + decodeSignedTransaction(type0x2SignedTransactionInfo.raw, returnFormat, { + fillInputAndData: true, + }), + ], + ], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign_typed_data.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign_typed_data.ts new file mode 100644 index 00000000000..b01f33f698e --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/fixtures/sign_typed_data.ts @@ -0,0 +1,100 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, Eip712TypedData } from 'web3-types'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +const typedData = { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Person: [ + { + name: 'name', + type: 'string', + }, + { + name: 'wallet', + type: 'address', + }, + ], + Mail: [ + { + name: 'from', + type: 'Person', + }, + { + name: 'to', + type: 'Person', + }, + { + name: 'contents', + type: 'string', + }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, +}; + +export const mockRpcResponse = + '0xf326421b6b34e1e59a8a34c986861e8790a9402a9e51e012718872cd51dad4e23c590bd170be23c51cff4b44d8d4eba54120431ca6a04940098dae62d97677da1c'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - message + */ +type TestData = [string, [Address, Eip712TypedData, boolean]]; +export const testData: TestData[] = [ + ['useLegacy = false', [address, typedData, false]], + ['useLegacy = true', [address, typedData, true]], +]; diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_balance.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_balance.test.ts new file mode 100644 index 00000000000..5d9f8935f0b --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_balance.test.ts @@ -0,0 +1,82 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getBalance } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_balance'; + +jest.mock('web3-rpc-methods'); + +describe('getBalance', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getBalance with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputAddress, inputBlockNumber] = inputParameters; + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await getBalance(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getBalance).toHaveBeenCalledWith( + web3Context.requestManager, + inputAddress, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getBalance as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getBalance(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toBe(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_block.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block.test.ts new file mode 100644 index 00000000000..778c6d4d000 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block.test.ts @@ -0,0 +1,87 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Bytes, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isBytes, isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getBlock } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, mockRpcResponseHydrated, testData } from './fixtures/get_block'; +import { blockSchema } from '../../../src/schemas'; + +jest.mock('web3-rpc-methods'); + +describe('getBlock', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getBlock with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock, hydrated] = inputParameters; + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + + let inputBlockFormatted; + + if (inputBlockIsBytes) { + inputBlockFormatted = format({ format: 'bytes32' }, inputBlock, ETH_DATA_FORMAT); + } else if (isNullish(inputBlock)) { + inputBlockFormatted = web3Context.defaultBlock; + } else { + inputBlockFormatted = format({ format: 'uint' }, inputBlock, ETH_DATA_FORMAT); + } + await getBlock(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect( + inputBlockIsBytes ? ethRpcMethods.getBlockByHash : ethRpcMethods.getBlockByNumber, + ).toHaveBeenCalledWith(web3Context.requestManager, inputBlockFormatted, hydrated); + }, + ); + + it.each(testData)( + `should format expectedMockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock, hydrated] = inputParameters; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedMockRpcResponse = hydrated ? mockRpcResponseHydrated : mockRpcResponse; + const expectedFormattedResult = format( + blockSchema, + expectedMockRpcResponse, + expectedReturnFormat, + ); + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + ( + (inputBlockIsBytes + ? ethRpcMethods.getBlockByHash + : ethRpcMethods.getBlockByNumber) as jest.Mock + ).mockResolvedValueOnce(expectedMockRpcResponse); + + const result = await getBlock(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_number.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_number.test.ts new file mode 100644 index 00000000000..71babcb4bf4 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_number.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getBlockNumber } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('getBlockNumber', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getBlockNumber with expected parameters', async () => { + await getBlockNumber(web3Context, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getBlockNumber).toHaveBeenCalledWith(web3Context.requestManager); + }); + + it('should format mockRpcResponse using provided return format', async () => { + const mockRpcResponse = '0x4b7'; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getBlockNumber as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getBlockNumber(web3Context, expectedReturnFormat); + expect(result).toBe(expectedFormattedResult); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_transaction_count.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_transaction_count.test.ts new file mode 100644 index 00000000000..82392e47d9b --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_transaction_count.test.ts @@ -0,0 +1,92 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Bytes, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isBytes, isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getBlockTransactionCount } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_block_transaction_count'; + +jest.mock('web3-rpc-methods'); + +describe('getBlockTransactionCount', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getBlock with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock] = inputParameters; + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + + let inputBlockFormatted; + + if (inputBlockIsBytes) { + inputBlockFormatted = format({ format: 'bytes32' }, inputBlock, ETH_DATA_FORMAT); + } else if (isNullish(inputBlock)) { + inputBlockFormatted = web3Context.defaultBlock; + } else { + inputBlockFormatted = format({ format: 'uint' }, inputBlock, ETH_DATA_FORMAT); + } + + await getBlockTransactionCount(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect( + inputBlockIsBytes + ? ethRpcMethods.getBlockTransactionCountByHash + : ethRpcMethods.getBlockTransactionCountByNumber, + ).toHaveBeenCalledWith(web3Context.requestManager, inputBlockFormatted); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock] = inputParameters; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + ( + (inputBlockIsBytes + ? ethRpcMethods.getBlockTransactionCountByHash + : ethRpcMethods.getBlockTransactionCountByNumber) as jest.Mock + ).mockResolvedValueOnce(mockRpcResponse); + + const result = await getBlockTransactionCount( + web3Context, + inputBlock, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_uncle_count.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_uncle_count.test.ts new file mode 100644 index 00000000000..3556234315f --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_block_uncle_count.test.ts @@ -0,0 +1,88 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Bytes, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isBytes, isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getBlockUncleCount } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_block_uncle_count'; + +jest.mock('web3-rpc-methods'); + +describe('getBlockUncleCount', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getBlockUncleCount with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock] = inputParameters; + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + + let inputBlockFormatted; + + if (inputBlockIsBytes) { + inputBlockFormatted = format({ format: 'bytes32' }, inputBlock, ETH_DATA_FORMAT); + } else if (isNullish(inputBlock)) { + inputBlockFormatted = web3Context.defaultBlock; + } else { + inputBlockFormatted = format({ format: 'uint' }, inputBlock, ETH_DATA_FORMAT); + } + + await getBlockUncleCount(web3Context, inputBlock, DEFAULT_RETURN_FORMAT); + expect( + inputBlockIsBytes + ? ethRpcMethods.getUncleCountByBlockHash + : ethRpcMethods.getUncleCountByBlockNumber, + ).toHaveBeenCalledWith(web3Context.requestManager, inputBlockFormatted); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock] = inputParameters; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + ( + (inputBlockIsBytes + ? ethRpcMethods.getUncleCountByBlockHash + : ethRpcMethods.getUncleCountByBlockNumber) as jest.Mock + ).mockResolvedValueOnce(mockRpcResponse); + + const result = await getBlockUncleCount(web3Context, inputBlock, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_chain_id.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_chain_id.test.ts new file mode 100644 index 00000000000..e753bf13804 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_chain_id.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getChainId } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('getChainId', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getBlockNumber with expected parameters', async () => { + await getChainId(web3Context, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getChainId).toHaveBeenCalledWith(web3Context.requestManager); + }); + + it('should format mockRpcResponse using provided return format', async () => { + const mockRpcResponse = '0x4b7'; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getChainId as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getChainId(web3Context, expectedReturnFormat); + expect(result).toBe(expectedFormattedResult); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_code.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_code.test.ts new file mode 100644 index 00000000000..51f63db815f --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_code.test.ts @@ -0,0 +1,82 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getCode } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_code'; + +jest.mock('web3-rpc-methods'); + +describe('getCode', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getCode with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputAddress, inputBlockNumber] = inputParameters; + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await getCode(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getCode).toHaveBeenCalledWith( + web3Context.requestManager, + inputAddress, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'bytes' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getCode as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getCode(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_coinbase.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_coinbase.test.ts new file mode 100644 index 00000000000..6a896c33763 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_coinbase.test.ts @@ -0,0 +1,36 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getCoinbase } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('getCoinbase', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getCoinbase with expected parameters', async () => { + await getCoinbase(web3Context); + expect(ethRpcMethods.getCoinbase).toHaveBeenCalledWith(web3Context.requestManager); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_fee_history.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_fee_history.test.ts new file mode 100644 index 00000000000..8a89aa75369 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_fee_history.test.ts @@ -0,0 +1,104 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getFeeHistory } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_fee_history'; +import { feeHistorySchema } from '../../../src/schemas'; +import { NUMBER_DATA_FORMAT } from '../../../src/constants'; + +jest.mock('web3-rpc-methods'); + +describe('getFeeHistory', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getProof with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlockCount, inputNewestBlock, inputRewardPercentiles] = inputParameters; + const inputBlockCountFormatted = format( + { format: 'uint' }, + inputBlockCount, + ETH_DATA_FORMAT, + ); + const inputRewardPercentilesFormatted = format( + { + type: 'array', + items: { + format: 'uint', + }, + }, + inputRewardPercentiles, + NUMBER_DATA_FORMAT, + ); + + let inputNewestBlockFormatted; + + if (isNullish(inputNewestBlock)) { + inputNewestBlockFormatted = web3Context.defaultBlock; + } else { + inputNewestBlockFormatted = format( + { format: 'uint' }, + inputNewestBlock, + ETH_DATA_FORMAT, + ); + } + + await getFeeHistory(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getFeeHistory).toHaveBeenCalledWith( + web3Context.requestManager, + inputBlockCountFormatted, + inputNewestBlockFormatted, + inputRewardPercentilesFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + feeHistorySchema, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getFeeHistory as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getFeeHistory( + web3Context, + ...inputParameters, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_gas_price.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_gas_price.test.ts new file mode 100644 index 00000000000..3053e2623ac --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_gas_price.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getGasPrice } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('getGasPrice', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getGasPrice with expected parameters', async () => { + await getGasPrice(web3Context, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getGasPrice).toHaveBeenCalledWith(web3Context.requestManager); + }); + + it('should format mockRpcResponse using provided return format', async () => { + const mockRpcResponse = '0x1dfd14000'; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getGasPrice as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getGasPrice(web3Context, expectedReturnFormat); + expect(result).toBe(expectedFormattedResult); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_hash_rate.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_hash_rate.test.ts new file mode 100644 index 00000000000..8d8c7a04702 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_hash_rate.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getHashRate } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('getHashRate', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getHashRate with expected parameters', async () => { + await getHashRate(web3Context, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getHashRate).toHaveBeenCalledWith(web3Context.requestManager); + }); + + it('should format return value using provided return format', async () => { + const mockRpcResponse = '0x38a'; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getHashRate as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getHashRate(web3Context, expectedReturnFormat); + expect(result).toBe(expectedFormattedResult); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_logs.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_logs.test.ts new file mode 100644 index 00000000000..903ddf61b10 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_logs.test.ts @@ -0,0 +1,64 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getLogs } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_logs'; +import { logSchema } from '../../../src/schemas'; + +jest.mock('web3-rpc-methods'); + +describe('getLogs', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getLogs with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + (ethRpcMethods.getLogs as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + await getLogs(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getLogs).toHaveBeenCalledWith( + web3Context.requestManager, + ...inputParameters, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = mockRpcResponse.map(res => { + if (typeof res === 'string') { + return res; + } + + return format(logSchema, res, expectedReturnFormat); + }); + (ethRpcMethods.getLogs as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getLogs(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_pending_transactions.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_pending_transactions.test.ts new file mode 100644 index 00000000000..211295389c7 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_pending_transactions.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getPendingTransactions } from '../../../src/rpc_method_wrappers'; +import { formatTransaction } from '../../../src'; +import { mockRpcResponse } from './fixtures/get_pending_transactions'; + +jest.mock('web3-rpc-methods'); + +describe('getPendingTransactions', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getPendingTransactions with expected parameters', async () => { + (ethRpcMethods.getPendingTransactions as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + await getPendingTransactions(web3Context, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getPendingTransactions).toHaveBeenCalledWith( + web3Context.requestManager, + ); + }); + + it('should format return value using provided return format', async () => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = mockRpcResponse.map(transaction => + formatTransaction(transaction, expectedReturnFormat), + ); + (ethRpcMethods.getPendingTransactions as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getPendingTransactions(web3Context, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_proof.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_proof.test.ts new file mode 100644 index 00000000000..65960a791e5 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_proof.test.ts @@ -0,0 +1,87 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getProof } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_proof'; +import { accountSchema } from '../../../src/schemas'; + +jest.mock('web3-rpc-methods'); + +describe('getProof', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getProof with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputAddress, inputStorageKey, inputBlockNumber] = inputParameters; + const inputStorageKeyFormatted = inputStorageKey.map(s => + format({ format: 'bytes' }, s, ETH_DATA_FORMAT), + ); + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await getProof(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getProof).toHaveBeenCalledWith( + web3Context.requestManager, + inputAddress, + inputStorageKeyFormatted, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + accountSchema, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getProof as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getProof(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_protocol_version.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_protocol_version.test.ts new file mode 100644 index 00000000000..5ebe9c200e9 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_protocol_version.test.ts @@ -0,0 +1,36 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getProtocolVersion } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('getProtocolVersion', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getProtocolVersion with expected parameters', async () => { + await getProtocolVersion(web3Context); + expect(ethRpcMethods.getProtocolVersion).toHaveBeenCalledWith(web3Context.requestManager); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_storage_at.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_storage_at.test.ts new file mode 100644 index 00000000000..6006cd8334c --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_storage_at.test.ts @@ -0,0 +1,92 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getStorageAt } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_storage_at'; + +jest.mock('web3-rpc-methods'); + +describe('getStorageAt', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getStorageAt with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputAddress, inputStorageSlot, inputBlockNumber] = inputParameters; + const inputStorageSlotFormatted = format( + { format: 'uint' }, + inputStorageSlot, + ETH_DATA_FORMAT, + ); + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await getStorageAt(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getStorageAt).toHaveBeenCalledWith( + web3Context.requestManager, + inputAddress, + inputStorageSlotFormatted, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\nMock Rpc Response: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'bytes' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getStorageAt as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getStorageAt( + web3Context, + ...inputParameters, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction.test.ts new file mode 100644 index 00000000000..225a9e106ef --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getTransaction } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_transaction'; +import { formatTransaction, transactionInfoSchema } from '../../../src'; + +jest.mock('web3-rpc-methods'); + +describe('getTransaction', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getTransaction with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputTransactionHash] = inputParameters; + const inputTransactionHashFormatted = format( + { format: 'bytes32' }, + inputTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + + await getTransaction(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getTransactionByHash).toHaveBeenCalledWith( + web3Context.requestManager, + inputTransactionHashFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\nMock Rpc Response: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = formatTransaction( + mockRpcResponse, + expectedReturnFormat, + { transactionSchema: transactionInfoSchema }, + ); + (ethRpcMethods.getTransactionByHash as jest.Mock).mockResolvedValueOnce( + mockRpcResponse, + ); + + const result = await getTransaction( + web3Context, + ...inputParameters, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_count.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_count.test.ts new file mode 100644 index 00000000000..2907477aef1 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_count.test.ts @@ -0,0 +1,86 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getTransactionCount } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_transaction_count'; + +jest.mock('web3-rpc-methods'); + +describe('getTransactionCount', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getBalance with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputAddress, inputBlockNumber] = inputParameters; + + let inputBlockNumberFormatted; + + if (isNullish(inputBlockNumber)) { + inputBlockNumberFormatted = web3Context.defaultBlock; + } else { + inputBlockNumberFormatted = format( + { format: 'uint' }, + inputBlockNumber, + ETH_DATA_FORMAT, + ); + } + + await getTransactionCount(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getTransactionCount).toHaveBeenCalledWith( + web3Context.requestManager, + inputAddress, + inputBlockNumberFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'uint' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getTransactionCount as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await getTransactionCount( + web3Context, + ...inputParameters, + expectedReturnFormat, + ); + expect(result).toBe(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_from_block.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_from_block.test.ts new file mode 100644 index 00000000000..8f0a231da01 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_from_block.test.ts @@ -0,0 +1,102 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Bytes, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isBytes, isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getTransactionFromBlock } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_transaction_from_block'; +import { formatTransaction, transactionInfoSchema } from '../../../src'; + +jest.mock('web3-rpc-methods'); + +describe('getTransactionFromBlock', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getTransactionFromBlock with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock, inputTransactionIndex] = inputParameters; + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + const inputTransactionIndexFormatted = format( + { format: 'uint' }, + inputTransactionIndex, + ETH_DATA_FORMAT, + ); + + let inputBlockFormatted; + + if (inputBlockIsBytes) { + inputBlockFormatted = format({ format: 'bytes32' }, inputBlock, ETH_DATA_FORMAT); + } else if (isNullish(inputBlock)) { + inputBlockFormatted = web3Context.defaultBlock; + } else { + inputBlockFormatted = format({ format: 'uint' }, inputBlock, ETH_DATA_FORMAT); + } + + await getTransactionFromBlock(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect( + inputBlockIsBytes + ? ethRpcMethods.getTransactionByBlockHashAndIndex + : ethRpcMethods.getTransactionByBlockNumberAndIndex, + ).toHaveBeenCalledWith( + web3Context.requestManager, + inputBlockFormatted, + inputTransactionIndexFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock] = inputParameters; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = formatTransaction( + mockRpcResponse, + expectedReturnFormat, + { transactionSchema: transactionInfoSchema }, + ); + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + ( + (inputBlockIsBytes + ? ethRpcMethods.getTransactionByBlockHashAndIndex + : ethRpcMethods.getTransactionByBlockNumberAndIndex) as jest.Mock + ).mockResolvedValueOnce(mockRpcResponse); + + const result = await getTransactionFromBlock( + web3Context, + ...inputParameters, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_receipt.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_receipt.test.ts new file mode 100644 index 00000000000..f9d5d2ef462 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_transaction_receipt.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getTransactionReceipt } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_transaction_receipt'; +import { transactionReceiptSchema } from '../../../src/schemas'; + +jest.mock('web3-rpc-methods'); + +describe('getTransactionReceipt', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getTransaction with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputTransactionHash] = inputParameters; + const inputTransactionHashFormatted = format( + { format: 'bytes32' }, + inputTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + + await getTransactionReceipt(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.getTransactionReceipt).toHaveBeenCalledWith( + web3Context.requestManager, + inputTransactionHashFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + transactionReceiptSchema, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.getTransactionReceipt as jest.Mock).mockResolvedValueOnce( + mockRpcResponse, + ); + + const result = await getTransactionReceipt( + web3Context, + ...inputParameters, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/get_uncle.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/get_uncle.test.ts new file mode 100644 index 00000000000..fbbfa1ca510 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/get_uncle.test.ts @@ -0,0 +1,98 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { + ETH_DATA_FORMAT, + DEFAULT_RETURN_FORMAT, + FMT_NUMBER, + FMT_BYTES, + Bytes, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isBytes, isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { getUncle } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData } from './fixtures/get_uncle'; +import { blockSchema } from '../../../src/schemas'; + +jest.mock('web3-rpc-methods'); + +describe('getUncle', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.getUncle with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputBlock, inputUncleIndex] = inputParameters; + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + const inputUncleIndexFormatted = format( + { format: 'uint' }, + inputUncleIndex, + ETH_DATA_FORMAT, + ); + + let inputBlockFormatted; + + if (inputBlockIsBytes) { + inputBlockFormatted = format({ format: 'bytes32' }, inputBlock, ETH_DATA_FORMAT); + } else if (isNullish(inputBlock)) { + inputBlockFormatted = web3Context.defaultBlock; + } else { + inputBlockFormatted = format({ format: 'uint' }, inputBlock, ETH_DATA_FORMAT); + } + + await getUncle(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect( + inputBlockIsBytes + ? ethRpcMethods.getUncleByBlockHashAndIndex + : ethRpcMethods.getUncleByBlockNumberAndIndex, + ).toHaveBeenCalledWith( + web3Context.requestManager, + inputBlockFormatted, + inputUncleIndexFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\nMock Rpc Response: %s\n`, + async (_, inputParameters) => { + const [inputBlock] = inputParameters; + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + blockSchema, + mockRpcResponse, + expectedReturnFormat, + ); + const inputBlockIsBytes = isBytes(inputBlock as Bytes); + ( + (inputBlockIsBytes + ? ethRpcMethods.getUncleByBlockHashAndIndex + : ethRpcMethods.getUncleByBlockNumberAndIndex) as jest.Mock + ).mockResolvedValueOnce(mockRpcResponse); + + const result = await getUncle(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/is_mining.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/is_mining.test.ts new file mode 100644 index 00000000000..e782aa321d4 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/is_mining.test.ts @@ -0,0 +1,36 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { isMining } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('isMining', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getMining with expected parameters', async () => { + await isMining(web3Context); + expect(ethRpcMethods.getMining).toHaveBeenCalledWith(web3Context.requestManager); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/is_syncing.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/is_syncing.test.ts new file mode 100644 index 00000000000..5920db0129b --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/is_syncing.test.ts @@ -0,0 +1,36 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { isSyncing } from '../../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('isSyncing', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call rpcMethods.getSyncing with expected parameters', async () => { + await isSyncing(web3Context); + expect(ethRpcMethods.getSyncing).toHaveBeenCalledWith(web3Context.requestManager); + }); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/send_signed_transaction.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/send_signed_transaction.test.ts new file mode 100644 index 00000000000..4a741c46646 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/send_signed_transaction.test.ts @@ -0,0 +1,306 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { sendSignedTransaction } from '../../../src/rpc_method_wrappers'; +import * as WaitForTransactionReceipt from '../../../src/utils/wait_for_transaction_receipt'; +import * as WatchTransactionForConfirmations from '../../../src/utils/watch_transaction_for_confirmations'; +import { + expectedTransactionReceipt, + expectedTransactionHash, + testData, +} from './fixtures/send_signed_transaction'; +import { transactionReceiptSchema } from '../../../src/schemas'; +import { SendTxHelper } from '../../../src/utils/send_tx_helper'; + +jest.mock('web3-rpc-methods'); +jest.mock('../../../src/utils/wait_for_transaction_receipt'); +jest.mock('../../../src/utils/watch_transaction_for_confirmations'); + +describe('sendTransaction', () => { + const testMessage = + 'Title: %s\ninputSignedTransaction: %s\nexpectedTransactionHash: %s\nexpectedTransactionReceipt: %s\n'; + + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + afterEach(() => jest.resetAllMocks()); + + it.each(testData)( + `should remove signature part in transaction before checkRevertBeforeSending`, + async (_, inputSignedTransaction) => { + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + const checkRevertBeforeSendingSpy = jest.fn().mockImplementation((transaction) => { + expect(transaction).toBeDefined(); + + // verify signature part is removed before sending to revert check function + expect(transaction).not.toHaveProperty('v'); + expect(transaction).not.toHaveProperty('r'); + expect(transaction).not.toHaveProperty('s'); + }); + + SendTxHelper.prototype.checkRevertBeforeSending = checkRevertBeforeSendingSpy; + + const inputSignedTransactionFormatted = format( + { format: 'bytes' }, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ); + await sendSignedTransaction(web3Context, inputSignedTransaction, DEFAULT_RETURN_FORMAT); + + // verify original tx params are intact + expect(ethRpcMethods.sendRawTransaction).toHaveBeenCalledWith( + web3Context.requestManager, + inputSignedTransactionFormatted, + ); + + expect(checkRevertBeforeSendingSpy).toHaveBeenCalledTimes(1); + + }, + ); + + it.each(testData)( + `sending event should emit with inputSignedTransaction\n ${testMessage}`, + async (_, inputSignedTransaction) => { + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + const inputSignedTransactionFormatted = format( + { format: 'bytes' }, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ); + await sendSignedTransaction( + web3Context, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ).on('sending', signedTransaction => { + expect(signedTransaction).toStrictEqual(inputSignedTransactionFormatted); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `should call ethRpcMethods.sendRawTransaction with expected parameters\n ${testMessage}`, + async (_, inputSignedTransaction) => { + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + const inputSignedTransactionFormatted = format( + { format: 'bytes' }, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ); + await sendSignedTransaction(web3Context, inputSignedTransaction, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.sendRawTransaction).toHaveBeenCalledWith( + web3Context.requestManager, + inputSignedTransactionFormatted, + ); + }, + ); + + it.each(testData)( + `sent event should emit with inputSignedTransaction\n ${testMessage}`, + async (_, inputSignedTransaction) => { + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + const inputSignedTransactionFormatted = format( + { format: 'bytes' }, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ); + + await sendSignedTransaction( + web3Context, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ).on('sent', signedTransaction => { + expect(signedTransaction).toStrictEqual(inputSignedTransactionFormatted); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `transactionHash event should emit with inputSignedTransaction\n ${testMessage}`, + async (_, inputSignedTransaction) => { + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + + await sendSignedTransaction( + web3Context, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ).on('transactionHash', transactionHash => { + expect(transactionHash).toStrictEqual(expectedTransactionHash); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `should call WaitForTransactionReceipt.waitForTransactionReceipt with expected parameters\n ${testMessage}`, + async (_, inputSignedTransaction) => { + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + await sendSignedTransaction(web3Context, inputSignedTransaction, DEFAULT_RETURN_FORMAT); + expect(WaitForTransactionReceipt.waitForTransactionReceipt).toHaveBeenCalledWith( + web3Context, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + }, + ); + + it.each(testData)( + `waitForTransactionReceipt is called when expected\n ${testMessage}`, + async (_, inputSignedTransaction) => { + const waitForTransactionReceiptSpy = jest + .spyOn(WaitForTransactionReceipt, 'waitForTransactionReceipt') + .mockResolvedValueOnce(expectedTransactionReceipt); + + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + + await sendSignedTransaction(web3Context, inputSignedTransaction, DEFAULT_RETURN_FORMAT); + + expect(waitForTransactionReceiptSpy).toHaveBeenCalledWith( + web3Context, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + }, + ); + + it.each(testData)( + `receipt event should emit with inputSignedTransaction\n ${testMessage}`, + async (_, inputSignedTransaction) => { + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + await sendSignedTransaction( + web3Context, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ).on('receipt', receiptInfo => { + expect(receiptInfo).toStrictEqual(formattedTransactionReceipt); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `should resolve Web3PromiEvent with expectedTransactionReceipt\n ${testMessage}`, + async (_, inputSignedTransaction) => { + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + expect( + await sendSignedTransaction( + web3Context, + inputSignedTransaction, + DEFAULT_RETURN_FORMAT, + ), + ).toStrictEqual(formattedTransactionReceipt); + }, + ); + + it.each(testData)( + `watchTransactionForConfirmations is called when expected\n ${testMessage}`, + async (_, inputTransaction) => { + const watchTransactionForConfirmationsSpy = jest.spyOn( + WatchTransactionForConfirmations, + 'watchTransactionForConfirmations', + ); + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + const promiEvent = sendSignedTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + ).on('confirmation', () => undefined); + + await promiEvent; + + expect(WaitForTransactionReceipt.waitForTransactionReceipt).toHaveBeenCalledWith( + web3Context, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + expect(watchTransactionForConfirmationsSpy).toHaveBeenCalledWith( + web3Context, + promiEvent, + formattedTransactionReceipt, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/send_transaction.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/send_transaction.test.ts new file mode 100644 index 00000000000..3be8182cd33 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/send_transaction.test.ts @@ -0,0 +1,305 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, ETH_DATA_FORMAT, Web3EthExecutionAPI } from 'web3-types'; +import { isNullish } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { sendTransaction } from '../../../src/rpc_method_wrappers'; +import { formatTransaction } from '../../../src'; +import * as GetTransactionGasPricing from '../../../src/utils/get_transaction_gas_pricing'; +import * as WaitForTransactionReceipt from '../../../src/utils/wait_for_transaction_receipt'; +import * as WatchTransactionForConfirmations from '../../../src/utils/watch_transaction_for_confirmations'; +import { + expectedTransactionReceipt, + expectedTransactionHash, + testData, +} from './fixtures/send_transaction'; +import { transactionReceiptSchema } from '../../../src/schemas'; + +jest.mock('web3-rpc-methods'); +jest.mock('../../../src/utils/wait_for_transaction_receipt'); +jest.mock('../../../src/utils/watch_transaction_for_confirmations'); + +describe('sendTransaction', () => { + const testMessage = + 'Title: %s\ninputTransaction: %s\nsendTransactionOptions: %s\nexpectedTransactionHash: %s\nexpectedTransactionReceipt: %s\n'; + + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + afterEach(() => jest.resetAllMocks()); + + it.each(testData)( + `getTransactionGasPricing is called only when expected\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const getTransactionGasPricingSpy = jest.spyOn( + GetTransactionGasPricing, + 'getTransactionGasPricing', + ); + (WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock).mockResolvedValue( + expectedTransactionReceipt, + ); + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ); + + if ( + sendTransactionOptions?.ignoreGasPricing || + !isNullish(inputTransaction.gasPrice) || + (!isNullish(inputTransaction.maxPriorityFeePerGas) && + !isNullish(inputTransaction.maxFeePerGas)) + ) + // eslint-disable-next-line jest/no-conditional-expect + expect(getTransactionGasPricingSpy).not.toHaveBeenCalled(); + // eslint-disable-next-line jest/no-conditional-expect + else expect(getTransactionGasPricingSpy).toHaveBeenCalled(); + }, + ); + + it.each(testData)( + `sending event should emit with formattedTransaction\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const formattedTransaction = formatTransaction(inputTransaction, ETH_DATA_FORMAT); + (WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock).mockResolvedValue( + expectedTransactionReceipt, + ); + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ).on('sending', transaction => { + expect(transaction).toStrictEqual(formattedTransaction); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `should call ethRpcMethods.sendTransaction with expected parameters\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const formattedTransaction = formatTransaction(inputTransaction, ETH_DATA_FORMAT); + (WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock).mockResolvedValue( + expectedTransactionReceipt, + ); + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ); + expect(ethRpcMethods.sendTransaction).toHaveBeenCalledWith( + web3Context.requestManager, + formattedTransaction, + ); + }, + ); + + it.each(testData)( + `sent event should emit with formattedTransaction\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const formattedTransaction = formatTransaction(inputTransaction, ETH_DATA_FORMAT); + (WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock).mockResolvedValue( + expectedTransactionReceipt, + ); + + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ).on('sent', transaction => { + expect(transaction).toStrictEqual(formattedTransaction); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `transactionHash event should emit with expectedTransactionHash\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + (ethRpcMethods.sendTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + (WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock).mockResolvedValue( + expectedTransactionReceipt, + ); + + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ).on('transactionHash', transactionHash => { + expect(transactionHash).toStrictEqual(expectedTransactionHash); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `should call WaitForTransactionReceipt.waitForTransactionReceipt with expected parameters\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + (ethRpcMethods.sendTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + (WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock).mockResolvedValue( + expectedTransactionReceipt, + ); + + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ); + expect(WaitForTransactionReceipt.waitForTransactionReceipt).toHaveBeenCalledWith( + web3Context, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + }, + ); + + it.each(testData)( + `waitForTransactionReceipt is called when expected\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const waitForTransactionReceiptSpy = jest + .spyOn(WaitForTransactionReceipt, 'waitForTransactionReceipt') + .mockResolvedValueOnce(expectedTransactionReceipt); + + (ethRpcMethods.sendTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ); + + expect(waitForTransactionReceiptSpy).toHaveBeenCalledWith( + web3Context, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + }, + ); + + it.each(testData)( + `receipt event should emit with expectedTransactionReceipt\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(formattedTransactionReceipt); + + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ).on('receipt', receiptInfo => { + expect(receiptInfo).toStrictEqual(formattedTransactionReceipt); + }); + + expect.assertions(1); + }, + ); + + it.each(testData)( + `should resolve Web3PromiEvent with expectedTransactionReceipt\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(formattedTransactionReceipt); + expect( + await sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ), + ).toStrictEqual(formattedTransactionReceipt); + }, + ); + + it.each(testData)( + `watchTransactionForConfirmations is called when expected\n ${testMessage}`, + async (_, inputTransaction, sendTransactionOptions) => { + const watchTransactionForConfirmationsSpy = jest.spyOn( + WatchTransactionForConfirmations, + 'watchTransactionForConfirmations', + ); + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + (ethRpcMethods.sendTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + const promiEvent = sendTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + sendTransactionOptions, + ).on('confirmation', () => undefined); + + await promiEvent; + + expect(WaitForTransactionReceipt.waitForTransactionReceipt).toHaveBeenCalledWith( + web3Context, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + expect(watchTransactionForConfirmationsSpy).toHaveBeenCalledWith( + web3Context, + promiEvent, + formattedTransactionReceipt, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/sign.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/sign.test.ts new file mode 100644 index 00000000000..ebbbc16955c --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/sign.test.ts @@ -0,0 +1,88 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; +import { Wallet } from 'web3-eth-accounts'; +import { sign } from '../../../src/rpc_method_wrappers'; +import { mockRpcResponse, testData, walletTestData } from './fixtures/sign'; +import { createAccountProvider } from '../../fixtures/system_test_utils'; +import { SignatureObjectSchema } from '../../../src/schemas'; + +jest.mock('web3-rpc-methods'); + +describe('sign', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.sign with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputMessage, inputAddress] = inputParameters; + const inputMessageFormatted = format( + { format: 'bytes' }, + inputMessage, + DEFAULT_RETURN_FORMAT, + ); + await sign(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.sign).toHaveBeenCalledWith( + web3Context.requestManager, + inputAddress, + inputMessageFormatted, + ); + }, + ); + it.each(walletTestData)( + `should call rpcMethods.sign using the context wallet with expected parameters\nTitle: %s\nInput parameters: %s\n and return with expected format`, + async (_, inputParameters, expectedReturnFormat) => { + // set up wallet for signing + const localContext = new Web3Context('http://127.0.0.1:8545'); + const accountProvider = createAccountProvider(localContext); + const wallet = new Wallet(accountProvider); + wallet.create(1); + localContext['_wallet'] = wallet; + + const result = await sign(localContext, ...inputParameters, expectedReturnFormat); + const expectedFormattedResult = format( + SignatureObjectSchema, + result, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'bytes' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.sign as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await sign(web3Context, ...inputParameters, expectedReturnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/sign_transaction.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/sign_transaction.test.ts new file mode 100644 index 00000000000..68364142d32 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/sign_transaction.test.ts @@ -0,0 +1,75 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { + DEFAULT_RETURN_FORMAT, + ETH_DATA_FORMAT, + SignedTransactionInfoAPI, + Web3EthExecutionAPI, +} from 'web3-types'; +import { isString } from 'web3-validator'; +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { signTransaction } from '../../../src/rpc_method_wrappers'; +import { returnFormat, testData } from './fixtures/sign_transaction'; +import { formatTransaction } from '../../../src'; + +jest.mock('web3-rpc-methods'); + +describe('signTransaction', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.signTransaction with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputTransaction, signedTransactionInfo] = inputParameters; + const inputTransactionFormatted = formatTransaction(inputTransaction, ETH_DATA_FORMAT); + + (ethRpcMethods.signTransaction as jest.Mock).mockResolvedValueOnce( + isString(signedTransactionInfo as string) + ? signedTransactionInfo + : (signedTransactionInfo as SignedTransactionInfoAPI).raw, + ); + + await signTransaction(web3Context, inputTransaction, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.signTransaction).toHaveBeenCalledWith( + web3Context.requestManager, + inputTransactionFormatted, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const [inputTransaction, signedTransactionInfo, expectedFormattedResult] = + inputParameters; + (ethRpcMethods.signTransaction as jest.Mock).mockResolvedValueOnce( + isString(signedTransactionInfo as string) + ? signedTransactionInfo + : (signedTransactionInfo as SignedTransactionInfoAPI).raw, + ); + + const result = await signTransaction(web3Context, inputTransaction, returnFormat); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/rpc_method_wrappers/sign_typed_data.test.ts b/packages/web3-eth/test/unit/rpc_method_wrappers/sign_typed_data.test.ts new file mode 100644 index 00000000000..8256beb7f78 --- /dev/null +++ b/packages/web3-eth/test/unit/rpc_method_wrappers/sign_typed_data.test.ts @@ -0,0 +1,64 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { DEFAULT_RETURN_FORMAT, FMT_BYTES, FMT_NUMBER, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; +import { format } from 'web3-utils'; + +import { signTypedData } from '../../../src/rpc_method_wrappers'; +import { testData, mockRpcResponse } from './fixtures/sign_typed_data'; + +jest.mock('web3-rpc-methods'); + +describe('signTypedData', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it.each(testData)( + `should call rpcMethods.signTypedData with expected parameters\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + await signTypedData(web3Context, ...inputParameters, DEFAULT_RETURN_FORMAT); + expect(ethRpcMethods.signTypedData).toHaveBeenCalledWith( + web3Context.requestManager, + ...inputParameters, + ); + }, + ); + + it.each(testData)( + `should format mockRpcResponse using provided return format\nTitle: %s\nInput parameters: %s\n`, + async (_, inputParameters) => { + const expectedReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }; + const expectedFormattedResult = format( + { format: 'bytes' }, + mockRpcResponse, + expectedReturnFormat, + ); + (ethRpcMethods.signTypedData as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + + const result = await signTypedData( + web3Context, + ...inputParameters, + expectedReturnFormat, + ); + expect(result).toStrictEqual(expectedFormattedResult); + }, + ); +}); diff --git a/packages/web3-eth/test/unit/send_tx_helper.test.ts b/packages/web3-eth/test/unit/send_tx_helper.test.ts new file mode 100644 index 00000000000..55a482395b8 --- /dev/null +++ b/packages/web3-eth/test/unit/send_tx_helper.test.ts @@ -0,0 +1,248 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + DataFormat, + DEFAULT_RETURN_FORMAT, + EthExecutionAPI, + JsonRpcResponse, + TransactionReceipt, + Web3BaseWalletAccount, +} from 'web3-types'; +import { Web3Context, Web3EventMap, Web3PromiEvent } from 'web3-core'; +import { + ContractExecutionError, + InvalidResponseError, + TransactionRevertInstructionError, +} from 'web3-errors'; +import { SendTxHelper } from '../../src/utils/send_tx_helper'; +import { getTransactionError } from '../../src/utils/get_transaction_error'; +import { getTransactionGasPricing } from '../../src/utils/get_transaction_gas_pricing'; +import { getRevertReason } from '../../src/utils/get_revert_reason'; +import { trySendTransaction } from '../../src/utils/try_send_transaction'; +import { ERC20TokenAbi } from '../fixtures/erc20'; +import { SendSignedTransactionEvents, SendTransactionEvents } from '../../src'; + +const utils = { + getTransactionError, + getRevertReason, + trySendTransaction, + getTransactionGasPricing, +}; +jest.mock('../../src/utils/get_transaction_gas_pricing'); +jest.mock('../../src/utils/try_send_transaction'); +jest.mock('../../src/utils/get_transaction_error'); +jest.mock('../../src/utils/get_revert_reason'); + +type PromiEvent = Web3PromiEvent< + TransactionReceipt, + SendSignedTransactionEvents | SendTransactionEvents +>; +const receipt = { + transactionHash: '0x559e12c4d679f66ff234ad2075a0953793692bdd3a9d9f12def5edc5d7cc2eec', + transactionIndex: BigInt(0), + blockNumber: BigInt(38), + blockHash: '0xc238b3b27edd12846afc824e4f36ebd7e6dcf35914af631f181ebc05127dd553', + from: '0x53a179dfe130c7b4054f7e6e7f1928777d7e7bbd', + to: '0xead2356c468ce5443bd7cbb2caaeb48266b7f31f', + cumulativeGasUsed: BigInt(47521), + gasUsed: BigInt(47521), + logs: [ + { + address: '0xead2356c468ce5443bd7cbb2caaeb48266b7f31f', + blockHash: '0xc238b3b27edd12846afc824e4f36ebd7e6dcf35914af631f181ebc05127dd553', + blockNumber: BigInt(38), + data: '0x000000000000000000000000000000000000000000000000000000000000000a', + logIndex: BigInt(0), + removed: false, + topics: [ + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + '0x00000000000000000000000051623651024932936d00d36a93594db5684fbbb3', + '0x00000000000000000000000003095dc4857bb26f3a4550c5651df8b7f6b6b1ef', + ], + transactionHash: '0x559e12c4d679f66ff234ad2075a0953793692bdd3a9d9f12def5edc5d7cc2eec', + transactionIndex: BigInt(0), + }, + ], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000800000000000008000000000000000000020000001000000002000000000000000000000000000200000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000008000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000', + status: BigInt(1), + effectiveGasPrice: BigInt(2506532645), + type: BigInt(2), +}; + +describe('sendTxHelper class', () => { + let sendTxHelper: SendTxHelper; + let promiEvent: Web3PromiEvent; + let web3Context: Web3Context; + beforeAll(() => { + web3Context = new Web3Context(); + promiEvent = new Web3PromiEvent(resolve => { + resolve({} as unknown as TransactionReceipt); + }); + sendTxHelper = new SendTxHelper({ + web3Context, + promiEvent: promiEvent as PromiEvent, + options: { + contractAbi: ERC20TokenAbi, + }, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + }); + it('constructor', () => { + expect(sendTxHelper).toBeDefined(); + // @ts-expect-error get private property + expect(sendTxHelper.promiEvent).toBe(promiEvent); + // @ts-expect-error get private property + expect(sendTxHelper.web3Context).toBe(web3Context); + // @ts-expect-error get private property + expect(sendTxHelper.returnFormat).toBe(DEFAULT_RETURN_FORMAT); + }); + it('getReceiptWithEvents', () => { + const res = sendTxHelper.getReceiptWithEvents(receipt as unknown as TransactionReceipt); + expect(res?.events?.Transfer.address).toBeDefined(); + }); + it('emit sending', async () => { + const f = jest.fn(); + await promiEvent.on('sending', f); + sendTxHelper.emitSending(receipt); + expect(f).toHaveBeenCalledWith(receipt); + promiEvent.off('sending', f); + }); + it('emit emitSent', async () => { + const f = jest.fn(); + await promiEvent.on('sent', f); + sendTxHelper.emitSent(receipt); + expect(f).toHaveBeenCalledWith(receipt); + promiEvent.off('sent', f); + }); + it('emit emitTransactionHash', async () => { + const f = jest.fn(); + await promiEvent.on('transactionHash', f); + sendTxHelper.emitTransactionHash(receipt.transactionHash as string & Uint8Array); + expect(f).toHaveBeenCalledWith(receipt.transactionHash); + promiEvent.off('transactionHash', f); + }); + it('emit emitReceipt', async () => { + const f = jest.fn(); + await promiEvent.on('receipt', f); + sendTxHelper.emitReceipt(receipt as TransactionReceipt); + expect(f).toHaveBeenCalledWith(receipt); + promiEvent.off('receipt', f); + }); + it('emit handleError', async () => { + const f = jest.fn(); + await promiEvent.on('error', f); + const error = new InvalidResponseError({} as JsonRpcResponse); + await sendTxHelper.handleError({ error, tx: receipt }); + expect(f).toHaveBeenCalledWith(error); + promiEvent.off('error', f); + }); + it('emit handleError with handleRevert', async () => { + const error = new ContractExecutionError({ code: 1, message: 'error' }); + web3Context.handleRevert = true; + jest.spyOn(utils, 'getTransactionError').mockResolvedValue( + error as unknown as TransactionRevertInstructionError, + ); + await sendTxHelper.handleError({ error, tx: receipt }); + expect(utils.getTransactionError).toHaveBeenCalled(); + }); + it('emit handleResolve', async () => { + const f = jest.fn(); + const error = new TransactionRevertInstructionError('error'); + jest.spyOn(utils, 'getTransactionError').mockResolvedValue(error); + await promiEvent.on('error', f); + + await expect(async () => { + await sendTxHelper.handleResolve({ + receipt: { ...receipt, status: BigInt(0) } as TransactionReceipt, + tx: receipt, + }); + expect(utils.getTransactionError).toHaveBeenCalled(); + expect(f).toHaveBeenCalledWith(error); + promiEvent.off('error', f); + }).rejects.toThrow(); + }); + it('emit checkRevertBeforeSending', async () => { + const _sendTxHelper = new SendTxHelper({ + web3Context, + promiEvent: promiEvent as PromiEvent, + options: { + checkRevertBeforeSending: true, + }, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + const error = new TransactionRevertInstructionError('error'); + jest.spyOn(utils, 'getRevertReason').mockResolvedValue(error); + await expect(_sendTxHelper.checkRevertBeforeSending(receipt)).rejects.toThrow(); + expect(utils.getRevertReason).toHaveBeenCalled(); + }); + it('emit handleResolve with transactionResolver', async () => { + const f = jest.fn(); + + const _sendTxHelper = new SendTxHelper({ + web3Context, + promiEvent: promiEvent as PromiEvent, + options: { + transactionResolver: f, + }, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + + await _sendTxHelper.handleResolve({ receipt: receipt as TransactionReceipt, tx: receipt }); + expect(f).toHaveBeenCalledWith(receipt); + }); + it('emit populateGasPrice', async () => { + const _sendTxHelper = new SendTxHelper({ + web3Context, + promiEvent: promiEvent as PromiEvent, + options: { + ignoreGasPricing: false, + }, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + const receiptWithoutGas = { + ...receipt, + gasPrice: undefined, + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + const populatedReceipt = { ...receiptWithoutGas, gasPrice: 1 }; + jest.spyOn(utils, 'getTransactionGasPricing').mockResolvedValue(populatedReceipt); + const result = await _sendTxHelper.populateGasPrice({ + transaction: receiptWithoutGas, + transactionFormatted: receiptWithoutGas, + }); + expect(result).toStrictEqual(populatedReceipt); + expect(utils.getTransactionGasPricing).toHaveBeenCalled(); + }); + it('emit signAndSend', async () => { + jest.spyOn(utils, 'trySendTransaction').mockResolvedValue('success'); + const wallet = { + signTransaction: jest.fn(() => ({ + transactionHash: receipt.transactionHash, + rawTransaction: receipt, + })), + }; + const result = await sendTxHelper.signAndSend({ + tx: receipt, + wallet: wallet as unknown as Web3BaseWalletAccount, + }); + expect(result).toBe('success'); + expect(utils.trySendTransaction).toHaveBeenCalled(); + expect(wallet.signTransaction).toHaveBeenCalledWith(receipt); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/getTransactionFromOrToAttr.test.ts b/packages/web3-eth/test/unit/utils/getTransactionFromOrToAttr.test.ts new file mode 100644 index 00000000000..879ff57f11f --- /dev/null +++ b/packages/web3-eth/test/unit/utils/getTransactionFromOrToAttr.test.ts @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context } from 'web3-core'; + +import { Wallet } from 'web3-eth-accounts'; +import { getTransactionFromOrToAttr } from '../../../src/utils/transaction_builder'; +import { + validGetTransactionFromOrToAttrData, + invalidGetTransactionFromOrToAttrData, + invalidGetTransactionFromOrToAttrDataForWallet, +} from '../../fixtures/format_transaction'; +import { createAccountProvider } from '../../fixtures/system_test_utils'; + +import Web3Eth from '../../../src'; + +describe('getTransactionFromOrToAttr', () => { + const web3Context = new Web3Context(); + + describe('valid data', () => { + it.each(validGetTransactionFromOrToAttrData)('$title', ({ input, output }) => { + const { role, transaction } = input; + + expect(getTransactionFromOrToAttr(role, web3Context, transaction)).toEqual(output); + }); + }); + + describe('invalid data', () => { + it.each(invalidGetTransactionFromOrToAttrData)('$title', ({ input, output }) => { + const { role, transaction } = input; + expect(() => getTransactionFromOrToAttr(role, web3Context, transaction)).toThrow( + output, + ); + }); + + it.each(invalidGetTransactionFromOrToAttrDataForWallet)( + '$title with wallet', + ({ input, output }) => { + const privateKey = + '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709'; + + // setup wallet + const web3Eth = new Web3Eth('http://localhost:8545'); + const accountProvider = createAccountProvider(web3Eth); + const wallet = new Wallet(accountProvider); + web3Eth.wallet?.add(privateKey); + web3Eth['_wallet'] = wallet; + + const { role, transaction } = input; + expect(() => getTransactionFromOrToAttr(role, web3Eth, transaction)).toThrow( + output, + ); + }, + ); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/get_revert_reason.test.ts b/packages/web3-eth/test/unit/utils/get_revert_reason.test.ts new file mode 100644 index 00000000000..061837f4c54 --- /dev/null +++ b/packages/web3-eth/test/unit/utils/get_revert_reason.test.ts @@ -0,0 +1,125 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { DEFAULT_RETURN_FORMAT } from 'web3-types'; + +import * as RpcMethodWrappers from '../../../src/rpc_method_wrappers'; +import * as GetRevertReason from '../../../src/utils/get_revert_reason'; +import { SimpleRevertAbi } from '../../fixtures/simple_revert'; + +describe('getRevertReason', () => { + const web3Context = new Web3Context(); + + it('should use the call rpc wrapper', async () => { + const callSpy = jest.spyOn(RpcMethodWrappers, 'call').mockImplementation(); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + await GetRevertReason.getRevertReason(web3Context, transaction); + + expect(callSpy).toHaveBeenCalledWith( + web3Context, + transaction, + web3Context.defaultBlock, + DEFAULT_RETURN_FORMAT, + ); + }); + + it('should return undefined', async () => { + jest.spyOn(RpcMethodWrappers, 'call').mockResolvedValueOnce( + '0x000000000000000000000000000000000000000000000000000000000000000a', + ); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + const result = await GetRevertReason.getRevertReason(web3Context, transaction); + + expect(result).toBeUndefined(); + }); + + it('should call parseTransactionError without contractAbi', async () => { + const expectedError = { + jsonrpc: '2.0', + id: 1, + error: { + code: -32000, + message: + 'err: insufficient funds for gas * price + value: address 0x0000000000000000000000000000000000000000 have 66 want 9983799287684 (supplied gas 26827)', + }, + }; + const parseTransactionErrorSpy = jest + .spyOn(GetRevertReason, 'parseTransactionError') + .mockImplementation(); + jest.spyOn(RpcMethodWrappers, 'call').mockRejectedValueOnce(expectedError); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + await GetRevertReason.getRevertReason(web3Context, transaction); + + expect(parseTransactionErrorSpy).toHaveBeenCalledWith(expectedError, undefined); + }); + + it('should call parseTransactionError with contractAbi', async () => { + const expectedError = { + jsonrpc: '2.0', + id: 1, + error: { + code: -32000, + message: + 'err: insufficient funds for gas * price + value: address 0x0000000000000000000000000000000000000000 have 66 want 9983799287684 (supplied gas 26827)', + }, + }; + const parseTransactionErrorSpy = jest + .spyOn(GetRevertReason, 'parseTransactionError') + .mockImplementation(); + jest.spyOn(RpcMethodWrappers, 'call').mockRejectedValueOnce(expectedError); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + await GetRevertReason.getRevertReason(web3Context, transaction, SimpleRevertAbi); + + expect(parseTransactionErrorSpy).toHaveBeenCalledWith(expectedError, SimpleRevertAbi); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/get_transaction_error.test.ts b/packages/web3-eth/test/unit/utils/get_transaction_error.test.ts new file mode 100644 index 00000000000..898947f4889 --- /dev/null +++ b/packages/web3-eth/test/unit/utils/get_transaction_error.test.ts @@ -0,0 +1,446 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Context } from 'web3-core'; +import { + InvalidResponseError, + TransactionRevertedWithoutReasonError, + TransactionRevertInstructionError, + TransactionRevertWithCustomError, +} from 'web3-errors'; + +import * as GetRevertReasonUtils from '../../../src/utils/get_revert_reason'; +import { getTransactionError } from '../../../src/utils/get_transaction_error'; +import { SimpleRevertAbi } from '../../fixtures/simple_revert'; + +describe('getTransactionError', () => { + let web3Context: Web3Context; + + beforeEach(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + }); + + it('should call parseTransactionError to get error from receivedError', async () => { + const parseTransactionErrorSpy = jest.spyOn(GetRevertReasonUtils, 'parseTransactionError'); + + const receivedError = new InvalidResponseError( + { + jsonrpc: '2.0', + id: '3f839900-afdd-4553-bca7-b4e2b835c687', + error: { code: -32000, message: 'intrinsic gas too low' }, + }, + { + jsonrpc: '2.0', + id: '2568856d-8ee5-43f4-a8db-dbd22cf97a53', + method: 'eth_sendTransaction', + params: [ + { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + gas: '0x1', + gasPrice: '0x15b61074', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }, + ], + }, + ); + await getTransactionError(web3Context, undefined, undefined, receivedError); + expect(parseTransactionErrorSpy).toHaveBeenCalledWith(receivedError); + }); + + it('should call getRevertReason to get error from transactionFormatted without contractAbi', async () => { + const getRevertReasonSpy = jest + .spyOn(GetRevertReasonUtils, 'getRevertReason') + .mockImplementation(); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + web3Context.handleRevert = true; + await getTransactionError(web3Context, transaction); + expect(getRevertReasonSpy).toHaveBeenCalledWith(web3Context, transaction, undefined); + }); + + it('should call getRevertReason to get error from transactionFormatted with contractAbi', async () => { + const getRevertReasonSpy = jest + .spyOn(GetRevertReasonUtils, 'getRevertReason') + .mockImplementation(); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + web3Context.handleRevert = true; + await getTransactionError(web3Context, transaction, undefined, undefined, SimpleRevertAbi); + expect(getRevertReasonSpy).toHaveBeenCalledWith(web3Context, transaction, SimpleRevertAbi); + }); + + describe('TransactionRevertedWithoutReasonError', () => { + it('should throw TransactionRevertedWithoutReasonError without receipt', async () => { + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + expect(await getTransactionError(web3Context, transaction)).toMatchObject( + new TransactionRevertedWithoutReasonError(), + ); + }); + + it('should throw TransactionRevertedWithoutReasonError with receipt', async () => { + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + const receipt = { + transactionHash: + '0x55de60905fb9efdaa5dc5ac6a2e05736e92067d44b8a3077c80ec849545cbcf0', + transactionIndex: BigInt(0), + blockHash: '0xc150c0a7f7f5c9014ea965d19b1be5f5ced07a6b17ea3b1126769d745dde9b2d', + blockNumber: BigInt(16738176), + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + cumulativeGasUsed: BigInt(23605), + gasUsed: BigInt(23605), + effectiveGasPrice: BigInt(2000000000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + root: '', + status: BigInt(0), + type: BigInt(0), + }; + + expect(await getTransactionError(web3Context, transaction, receipt)).toMatchObject( + new TransactionRevertedWithoutReasonError(receipt), + ); + }); + }); + + describe('TransactionRevertInstructionError', () => { + it('should throw TransactionRevertInstructionError without transaction and receipt', async () => { + const receivedError = new InvalidResponseError( + { + jsonrpc: '2.0', + id: '3f839900-afdd-4553-bca7-b4e2b835c687', + error: { code: -32000, message: 'intrinsic gas too low' }, + }, + { + jsonrpc: '2.0', + id: '2568856d-8ee5-43f4-a8db-dbd22cf97a53', + method: 'eth_sendTransaction', + params: [ + { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + gas: '0x1', + gasPrice: '0x15b61074', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }, + ], + }, + ); + + expect( + await getTransactionError(web3Context, undefined, undefined, receivedError), + ).toMatchObject(new TransactionRevertInstructionError('intrinsic gas too low')); + }); + + it('should throw TransactionRevertInstructionError without transaction and with receipt', async () => { + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + const receipt = { + transactionHash: + '0x55de60905fb9efdaa5dc5ac6a2e05736e92067d44b8a3077c80ec849545cbcf0', + transactionIndex: BigInt(0), + blockHash: '0xc150c0a7f7f5c9014ea965d19b1be5f5ced07a6b17ea3b1126769d745dde9b2d', + blockNumber: BigInt(16738176), + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + cumulativeGasUsed: BigInt(23605), + gasUsed: BigInt(23605), + effectiveGasPrice: BigInt(2000000000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + root: '', + status: BigInt(0), + type: BigInt(0), + }; + const receivedError = new InvalidResponseError( + { + jsonrpc: '2.0', + id: '3f839900-afdd-4553-bca7-b4e2b835c687', + error: { code: -32000, message: 'intrinsic gas too low' }, + }, + { + jsonrpc: '2.0', + id: '2568856d-8ee5-43f4-a8db-dbd22cf97a53', + method: 'eth_sendTransaction', + params: [ + { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + gas: '0x1', + gasPrice: '0x15b61074', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }, + ], + }, + ); + + expect( + await getTransactionError(web3Context, transaction, receipt, receivedError), + ).toMatchObject( + new TransactionRevertInstructionError('intrinsic gas too low', undefined, receipt), + ); + }); + + it('should throw TransactionRevertInstructionError without receipt', async () => { + jest.spyOn(GetRevertReasonUtils, 'getRevertReason').mockResolvedValueOnce({ + reason: 'execution reverted', + signature: '0xc85bda60', + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + }); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + web3Context.handleRevert = true; + expect( + await getTransactionError( + web3Context, + transaction, + undefined, + undefined, + SimpleRevertAbi, + ), + ).toMatchObject( + new TransactionRevertInstructionError( + 'execution reverted', + '0xc85bda60', + undefined, + '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + ), + ); + }); + + it('should throw TransactionRevertInstructionError with receipt', async () => { + jest.spyOn(GetRevertReasonUtils, 'getRevertReason').mockResolvedValueOnce({ + reason: 'execution reverted', + signature: '0xc85bda60', + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + }); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + const receipt = { + transactionHash: + '0x55de60905fb9efdaa5dc5ac6a2e05736e92067d44b8a3077c80ec849545cbcf0', + transactionIndex: BigInt(0), + blockHash: '0xc150c0a7f7f5c9014ea965d19b1be5f5ced07a6b17ea3b1126769d745dde9b2d', + blockNumber: BigInt(16738176), + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + cumulativeGasUsed: BigInt(23605), + gasUsed: BigInt(23605), + effectiveGasPrice: BigInt(2000000000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + root: '', + status: BigInt(0), + type: BigInt(0), + }; + + web3Context.handleRevert = true; + expect( + await getTransactionError( + web3Context, + transaction, + receipt, + undefined, + SimpleRevertAbi, + ), + ).toMatchObject( + new TransactionRevertInstructionError( + 'execution reverted', + '0xc85bda60', + receipt, + '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + ), + ); + }); + }); + + describe('TransactionRevertWithCustomError', () => { + it('should throw TransactionRevertWithCustomError without receipt', async () => { + jest.spyOn(GetRevertReasonUtils, 'getRevertReason').mockResolvedValueOnce({ + reason: 'execution reverted', + signature: '0xc85bda60', + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + customErrorName: 'ErrorWithParams', + customErrorDecodedSignature: 'ErrorWithParams(uint256,string)', + customErrorArguments: { + code: BigInt(42), + message: 'This is an error with params', + }, + }); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + + web3Context.handleRevert = true; + expect( + await getTransactionError( + web3Context, + transaction, + undefined, + undefined, + SimpleRevertAbi, + ), + ).toMatchObject( + new TransactionRevertWithCustomError( + 'execution reverted', + 'ErrorWithParams', + 'ErrorWithParams(uint256,string)', + { + code: BigInt(42), + message: 'This is an error with params', + }, + '0xc85bda60', + undefined, + '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + ), + ); + }); + + it('should throw TransactionRevertWithCustomError with receipt', async () => { + jest.spyOn(GetRevertReasonUtils, 'getRevertReason').mockResolvedValueOnce({ + reason: 'execution reverted', + signature: '0xc85bda60', + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + customErrorName: 'ErrorWithParams', + customErrorDecodedSignature: 'ErrorWithParams(uint256,string)', + customErrorArguments: { + code: BigInt(42), + message: 'This is an error with params', + }, + }); + + const transaction = { + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + data: '0x819f48fe', + gasPrice: '0x15ab8f14', + maxPriorityFeePerGas: undefined, + maxFeePerGas: undefined, + }; + const receipt = { + transactionHash: + '0x55de60905fb9efdaa5dc5ac6a2e05736e92067d44b8a3077c80ec849545cbcf0', + transactionIndex: BigInt(0), + blockHash: '0xc150c0a7f7f5c9014ea965d19b1be5f5ced07a6b17ea3b1126769d745dde9b2d', + blockNumber: BigInt(16738176), + from: '0x4fec0a51024b13030d26e70904b066c6d41157a5', + to: '0x36361143b7e2c676f8ccd67743a89d26437f0529', + cumulativeGasUsed: BigInt(23605), + gasUsed: BigInt(23605), + effectiveGasPrice: BigInt(2000000000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + root: '', + status: BigInt(0), + type: BigInt(0), + }; + + web3Context.handleRevert = true; + expect( + await getTransactionError( + web3Context, + transaction, + receipt, + undefined, + SimpleRevertAbi, + ), + ).toMatchObject( + new TransactionRevertWithCustomError( + 'execution reverted', + 'ErrorWithParams', + 'ErrorWithParams(uint256,string)', + { + code: BigInt(42), + message: 'This is an error with params', + }, + '0xc85bda60', + receipt, + '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + ), + ); + }); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/get_transaction_type.test.ts b/packages/web3-eth/test/unit/utils/get_transaction_type.test.ts new file mode 100644 index 00000000000..73111b42067 --- /dev/null +++ b/packages/web3-eth/test/unit/utils/get_transaction_type.test.ts @@ -0,0 +1,55 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EthExecutionAPI, Transaction, ETH_DATA_FORMAT } from 'web3-types'; +import HttpProvider from 'web3-providers-http'; +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; + +import { transactionSchema } from '../../../src/schemas'; +import { getTransactionType } from '../../../src/utils/transaction_builder'; + + +describe('getTransactionType', () => { + const expectedFrom = '0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01'; + + const transaction: Transaction = { + from: expectedFrom, + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: BigInt(21000), + data: '0x', + nonce: 0x42, + chain: 'mainnet', + chainId: 0x1, + networkId: 0x4, + }; + const formattedTransaction = format(transactionSchema, transaction, ETH_DATA_FORMAT); + + const web3Context = new Web3Context({ + provider: new HttpProvider('http://127.0.0.1:80'), + config: { + defaultAccount: expectedFrom, + }, + }); + + it('should default to 0x2 when transaction type cannot be inferred and use default transaction type', async () => { + + const transactionType = getTransactionType(formattedTransaction, web3Context); + expect(transactionType).toBe('0x2'); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/parse_transaction_error.test.ts b/packages/web3-eth/test/unit/utils/parse_transaction_error.test.ts new file mode 100644 index 00000000000..0aa638597fe --- /dev/null +++ b/packages/web3-eth/test/unit/utils/parse_transaction_error.test.ts @@ -0,0 +1,89 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { ContractExecutionError, InvalidResponseError } from 'web3-errors'; + +import { parseTransactionError } from '../../../src/utils/get_revert_reason'; +import { SimpleRevertAbi } from '../../fixtures/simple_revert'; + +describe('parseTransactionError', () => { + it('should return object of type RevertReason', () => { + const error = new ContractExecutionError({ + code: 3, + message: 'execution reverted: This is a send revert', + data: '0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + }); + + const result = parseTransactionError(error); + expect(result).toStrictEqual({ + reason: 'execution reverted: This is a send revert', + signature: '0x08c379a0', + data: '000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320612073656e64207265766572740000000000000000000000', + }); + }); + + it('should return object of type RevertReasonWithCustomError', () => { + const error = new ContractExecutionError({ + code: 3, + message: 'execution reverted', + data: '0xc85bda60000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + }); + + const result = parseTransactionError(error, SimpleRevertAbi); + expect(result).toStrictEqual({ + reason: 'execution reverted', + signature: '0xc85bda60', + data: '000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c5468697320697320616e206572726f72207769746820706172616d7300000000', + customErrorName: 'ErrorWithParams', + customErrorDecodedSignature: 'ErrorWithParams(uint256,string)', + customErrorArguments: { + '0': BigInt(42), + '1': 'This is an error with params', + __length__: 2, + code: BigInt(42), + message: 'This is an error with params', + }, + }); + }); + + it('should return object of type string', () => { + const error = new InvalidResponseError({ + jsonrpc: '2.0', + id: '3f839900-afdd-4553-bca7-b4e2b835c687', + error: { code: -32000, message: 'intrinsic gas too low' }, + }); + + const result = parseTransactionError(error); + expect(result).toBe('intrinsic gas too low'); + }); + + it('should throw an error', () => { + const error = new InvalidResponseError([ + { + jsonrpc: '2.0', + id: '3f839900-afdd-4553-bca7-b4e2b835c687', + error: { code: -32000, message: 'intrinsic gas too low' }, + }, + { + jsonrpc: '2.0', + id: '3f839900-afdd-4553-bca7-b4e2b835c687', + error: { code: -32000, message: 'intrinsic gas too low' }, + }, + ]); + + expect(() => parseTransactionError(error)).toThrow(error); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/wait_for_transaction_receipt.test.ts b/packages/web3-eth/test/unit/utils/wait_for_transaction_receipt.test.ts new file mode 100644 index 00000000000..4a598a00fe7 --- /dev/null +++ b/packages/web3-eth/test/unit/utils/wait_for_transaction_receipt.test.ts @@ -0,0 +1,176 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { DEFAULT_RETURN_FORMAT, Web3EthExecutionAPI } from 'web3-types'; +import { TransactionBlockTimeoutError } from 'web3-errors'; +import { waitForTransactionReceipt } from '../../../src/utils/wait_for_transaction_receipt'; + +describe('waitForTransactionReceipt unit test', () => { + let web3Context: Web3Context; + + it(`waitForTransactionReceipt should throw error after block timeout`, async () => { + let blockNum = 1; + + web3Context = new Web3Context({ + request: async (payload: any) => { + let response: { jsonrpc: string; id: any; result: string } | undefined; + + switch (payload.method) { + case 'eth_blockNumber': + blockNum += 50; + response = { + jsonrpc: '2.0', + id: payload.id, + result: `0x${blockNum.toString(16)}`, + }; + break; + + case 'eth_getTransactionReceipt': + response = undefined; + break; + + default: + throw new Error(`Unknown payload ${payload}`); + } + + return new Promise(resolve => { + resolve(response as any); + }); + }, + supportsSubscriptions: () => false, + }); + + await expect(async () => + waitForTransactionReceipt( + web3Context, + '0x0430b701e657e634a9d5480eae0387a473913ef29af8e60c38a3cee24494ed54', + DEFAULT_RETURN_FORMAT, + ), + ).rejects.toThrow(TransactionBlockTimeoutError); + }); + + it(`waitForTransactionReceipt should resolve immediately if receipt is available`, async () => { + let blockNum = 1; + const txHash = '0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5'; + const blockHash = '0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3'; + + web3Context = new Web3Context({ + request: async (payload: any) => { + const response = { + jsonrpc: '2.0', + id: payload.id, + result: {}, + }; + + switch (payload.method) { + case 'eth_blockNumber': + blockNum += 10; + response.result = `0x${blockNum.toString(16)}`; + break; + + case 'eth_getTransactionReceipt': + response.result = { + blockHash, + blockNumber: `0x1`, + cumulativeGasUsed: '0xa12515', + from: payload.from, + gasUsed: payload.gasLimit, + status: '0x1', + to: payload.to, + transactionHash: txHash, + transactionIndex: '0x66', + }; + break; + + default: + throw new Error(`Unknown payload ${payload}`); + } + + return new Promise(resolve => { + resolve(response as any); + }); + }, + supportsSubscriptions: () => false, + }); + + const res = await waitForTransactionReceipt( + web3Context, + '0x0430b701e657e634a9d5480eae0387a473913ef29af8e60c38a3cee24494ed54', + DEFAULT_RETURN_FORMAT, + ); + + expect(res).toBeDefined(); + expect(res.transactionHash).toStrictEqual(txHash); + expect(res.blockHash).toStrictEqual(blockHash); + }); + + it(`waitForTransactionReceipt should resolve immediately if receipt is available - when subscription is enabled`, async () => { + let blockNum = 1; + const txHash = '0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5'; + const blockHash = '0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3'; + + web3Context = new Web3Context({ + request: async (payload: any) => { + const response = { + jsonrpc: '2.0', + id: payload.id, + result: {}, + }; + + switch (payload.method) { + case 'eth_blockNumber': + blockNum += 10; + response.result = `0x${blockNum.toString(16)}`; + break; + + case 'eth_getTransactionReceipt': + response.result = { + blockHash, + blockNumber: `0x1`, + cumulativeGasUsed: '0xa12515', + from: payload.from, + gasUsed: payload.gasLimit, + status: '0x1', + to: payload.to, + transactionHash: txHash, + transactionIndex: '0x66', + }; + break; + + default: + throw new Error(`Unknown payload ${payload}`); + } + + return new Promise(resolve => { + resolve(response as any); + }); + }, + supportsSubscriptions: () => true, + }); + web3Context.enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout = true; + + const res = await waitForTransactionReceipt( + web3Context, + '0x0430b701e657e634a9d5480eae0387a473913ef29af8e60c38a3cee24494ed54', + DEFAULT_RETURN_FORMAT, + ); + + expect(res).toBeDefined(); + expect(res.transactionHash).toStrictEqual(txHash); + expect(res.blockHash).toStrictEqual(blockHash); + }); +}); \ No newline at end of file diff --git a/packages/web3-eth/test/unit/utils/watch_transaction_by_polling.test.ts b/packages/web3-eth/test/unit/utils/watch_transaction_by_polling.test.ts new file mode 100644 index 00000000000..125a6432274 --- /dev/null +++ b/packages/web3-eth/test/unit/utils/watch_transaction_by_polling.test.ts @@ -0,0 +1,95 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; +import * as rpcMethodWrappers from '../../../src/rpc_method_wrappers'; +import * as WaitForTransactionReceipt from '../../../src/utils/wait_for_transaction_receipt'; + +import * as WatchTransactionByPolling from '../../../src/utils/watch_transaction_by_polling'; +import { + expectedTransactionReceipt, + expectedTransactionHash, + testData, +} from '../rpc_method_wrappers/fixtures/send_signed_transaction'; +import { transactionReceiptSchema } from '../../../src/schemas'; +import { sleep } from '../../shared_fixtures/utils'; + +jest.mock('web3-rpc-methods'); +jest.mock('../../../src/utils/wait_for_transaction_receipt'); + +const mockBlockData = { + hash: '0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae', +}; + +const testMessage = + 'Title: %s\ninputSignedTransaction: %s\nexpectedTransactionHash: %s\nexpectedTransactionReceipt: %s\n'; +describe('watchTransactionByPolling', () => { + describe('should call getBlockByNumber', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context( + // dummy provider that does not supports subscription + { + request: jest.fn(), + }, + ); + + jest.spyOn(ethRpcMethods, 'getBlockByNumber').mockResolvedValue(mockBlockData as any); + }); + + it.each(testData)( + `watchTransactionByPolling logic\n ${testMessage}`, + async (_, inputTransaction) => { + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + + const promiEvent = rpcMethodWrappers.sendSignedTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + ); + await promiEvent; + WatchTransactionByPolling.watchTransactionByPolling({ + web3Context, + transactionReceipt: formattedTransactionReceipt, + transactionPromiEvent: promiEvent, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + + await sleep(1000); + expect(ethRpcMethods.getBlockByNumber).toHaveBeenCalled(); + + // to clear the interval inside the polling function: + web3Context.transactionConfirmationBlocks = 0; + }, + ); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/watch_transaction_by_subscription.test.ts b/packages/web3-eth/test/unit/utils/watch_transaction_by_subscription.test.ts new file mode 100644 index 00000000000..d7f4169aeaf --- /dev/null +++ b/packages/web3-eth/test/unit/utils/watch_transaction_by_subscription.test.ts @@ -0,0 +1,130 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context, Web3RequestManager } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, JsonRpcResponseWithResult, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; +import { WebSocketProvider } from 'web3-providers-ws'; +import * as rpcMethodWrappers from '../../../src/rpc_method_wrappers'; +import * as WatchTransactionBySubscription from '../../../src/utils/watch_transaction_by_subscription'; +import { + expectedTransactionReceipt, + expectedTransactionHash, + testData, +} from '../rpc_method_wrappers/fixtures/send_signed_transaction'; +import { transactionReceiptSchema } from '../../../src/schemas'; +import { registeredSubscriptions } from '../../../src'; + +jest.mock('web3-rpc-methods'); +jest.mock('web3-providers-ws'); +jest.mock('../../../src/utils/watch_transaction_by_polling'); + +const testMessage = + 'Title: %s\ninputSignedTransaction: %s\nexpectedTransactionHash: %s\nexpectedTransactionReceipt: %s\n'; + +async function waitUntilCalled(mock: jest.Mock, timeout = 1000): Promise { + return new Promise((resolve, reject) => { + let timeoutId: NodeJS.Timeout | undefined; + const intervalId = setInterval(() => { + if (mock.mock.calls.length > 0) { + clearInterval(intervalId); + if (timeoutId) { + clearTimeout(timeoutId); + } + resolve(mock); + } + }, 100); + timeoutId = setTimeout(() => { + clearInterval(intervalId); + if (timeoutId) { + clearTimeout(timeoutId); + } + reject(new Error('timeout')); + }, timeout); + }); +} + +describe('watchTransactionBySubscription', () => { + describe('should revert to polling in cases where getting by subscription did not workout', () => { + let web3Context: Web3Context; + + beforeEach(() => { + jest.spyOn(Web3RequestManager.prototype, 'send').mockImplementation(async () => { + return {} as Promise; + }); + jest.spyOn(WebSocketProvider.prototype, 'request').mockImplementation(async () => { + return {} as Promise>; + }); + + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValue( + expectedTransactionHash, + ); + (ethRpcMethods.getTransactionReceipt as jest.Mock).mockResolvedValue( + expectedTransactionHash, + ); + web3Context = new Web3Context({ + // dummy provider that does supports subscription + provider: new WebSocketProvider('ws://localhost:8546'), + registeredSubscriptions, + }); + (web3Context.provider as any).supportsSubscriptions = () => true; + }); + afterEach(() => { + // to clear the interval inside the subscription function: + web3Context.transactionConfirmationBlocks = 0; + }); + let counter = 0; + it.each(testData)( + `should call getBlockNumber if blockHeaderTimeout reached\n ${testMessage}`, + async (_, inputTransaction) => { + if (counter > 0) { + return; + } + counter += 1; + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + web3Context.enableExperimentalFeatures.useSubscriptionWhenCheckingBlockTimeout = + true; + // this will case the function to revert to polling: + web3Context.blockHeaderTimeout = 0; + + web3Context.transactionSendTimeout = 2; + + const promiEvent = rpcMethodWrappers.sendSignedTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + ); + // await promiEvent; + WatchTransactionBySubscription.watchTransactionBySubscription({ + web3Context, + transactionReceipt: formattedTransactionReceipt, + transactionPromiEvent: promiEvent, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + await waitUntilCalled(ethRpcMethods.getBlockNumber as jest.Mock, 5000); + + await promiEvent; + }, + 60000, + ); + }); +}); diff --git a/packages/web3-eth/test/unit/utils/watch_transaction_for_confirmations.test.ts b/packages/web3-eth/test/unit/utils/watch_transaction_for_confirmations.test.ts new file mode 100644 index 00000000000..d4a73939b05 --- /dev/null +++ b/packages/web3-eth/test/unit/utils/watch_transaction_for_confirmations.test.ts @@ -0,0 +1,229 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context, Web3PromiEvent } from 'web3-core'; +import { format } from 'web3-utils'; +import { DEFAULT_RETURN_FORMAT, TransactionReceipt, Web3EthExecutionAPI } from 'web3-types'; +import { ethRpcMethods } from 'web3-rpc-methods'; +import { + TransactionMissingReceiptOrBlockHashError, + TransactionReceiptMissingBlockNumberError, +} from 'web3-errors'; +import * as rpcMethodWrappers from '../../../src/rpc_method_wrappers'; +import * as WaitForTransactionReceipt from '../../../src/utils/wait_for_transaction_receipt'; + +import * as WatchTransactionForConfirmations from '../../../src/utils/watch_transaction_for_confirmations'; +import * as WatchTransactionByPolling from '../../../src/utils/watch_transaction_by_polling'; +import * as WatchTransactionBySubscription from '../../../src/utils/watch_transaction_by_subscription'; +import { + expectedTransactionReceipt, + expectedTransactionHash, + testData, +} from '../rpc_method_wrappers/fixtures/send_signed_transaction'; +import { transactionReceiptSchema } from '../../../src/schemas'; +import { SendSignedTransactionEvents } from '../../../src/types'; + +jest.mock('web3-rpc-methods'); +jest.mock('../../../src/utils/wait_for_transaction_receipt'); +jest.mock('../../../src/utils/watch_transaction_by_polling'); +jest.mock('../../../src/utils/watch_transaction_by_subscription'); + +const testMessage = + 'Title: %s\ninputSignedTransaction: %s\nexpectedTransactionHash: %s\nexpectedTransactionReceipt: %s\n'; +describe('watchTransactionForConfirmations', () => { + describe('should throw when transaction receipt has something wrong', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context( + // dummy provider that does not supports subscription + { + request: jest.fn(), + supportsSubscriptions: () => false, + }, + ); + }); + + afterEach(() => jest.resetAllMocks()); + + it(`should throw when transactionReceipt is undefined`, () => { + expect(() => + WatchTransactionForConfirmations.watchTransactionForConfirmations( + web3Context, + undefined as unknown as Web3PromiEvent< + TransactionReceipt, + SendSignedTransactionEvents + >, + undefined as unknown as TransactionReceipt, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ), + ).toThrow(TransactionMissingReceiptOrBlockHashError); + }); + + it(`should throw when transactionReceipt does not have a blockHash`, () => { + expect(() => + WatchTransactionForConfirmations.watchTransactionForConfirmations( + web3Context, + undefined as any, + { blockHash: undefined } as unknown as TransactionReceipt, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ), + ).toThrow(TransactionMissingReceiptOrBlockHashError); + }); + + it(`should throw when transactionReceipt does not have a blockNumber`, () => { + expect(() => + WatchTransactionForConfirmations.watchTransactionForConfirmations( + web3Context, + undefined as any, + { blockHash: '0x', blockNumber: undefined } as unknown as TransactionReceipt, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ), + ).toThrow(TransactionReceiptMissingBlockNumberError); + }); + }); + + describe('should call watchTransactionBySubscription when the provider supports subscription', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context( + // dummy provider that supports subscription + { + request: jest.fn(), + supportsSubscriptions: () => true, + }, + ); + }); + + afterEach(() => jest.resetAllMocks()); + + it.each(testData)( + `watchTransactionForConfirmations logic\n ${testMessage}`, + async (_, inputTransaction) => { + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + + const promiEvent = rpcMethodWrappers.sendSignedTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + ); + + jest.spyOn( + WatchTransactionBySubscription, + 'watchTransactionBySubscription', + ).mockResolvedValueOnce(undefined as never); + + WatchTransactionForConfirmations.watchTransactionForConfirmations( + web3Context, + promiEvent, + formattedTransactionReceipt, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + + await promiEvent; + + expect( + WatchTransactionBySubscription.watchTransactionBySubscription, + ).toHaveBeenCalledWith({ + web3Context, + transactionReceipt: formattedTransactionReceipt, + transactionPromiEvent: promiEvent, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + }, + ); + }); + + describe('should call watchTransactionByPolling when the provider does not support subscription', () => { + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context( + // dummy provider that does not supports subscription + { + request: jest.fn(), + supportsSubscriptions: () => false, + }, + ); + }); + + afterEach(() => jest.resetAllMocks()); + + it.each(testData)( + `watchTransactionForConfirmations logic\n ${testMessage}`, + async (_, inputTransaction) => { + const formattedTransactionReceipt = format( + transactionReceiptSchema, + expectedTransactionReceipt, + DEFAULT_RETURN_FORMAT, + ); + + ( + WaitForTransactionReceipt.waitForTransactionReceipt as jest.Mock + ).mockResolvedValueOnce(expectedTransactionReceipt); + + (ethRpcMethods.sendRawTransaction as jest.Mock).mockResolvedValueOnce( + expectedTransactionHash, + ); + + const promiEvent = rpcMethodWrappers.sendSignedTransaction( + web3Context, + inputTransaction, + DEFAULT_RETURN_FORMAT, + ); + + jest.spyOn( + WatchTransactionByPolling, + 'watchTransactionByPolling', + ).mockResolvedValueOnce(undefined as never); + + WatchTransactionForConfirmations.watchTransactionForConfirmations( + web3Context, + promiEvent, + formattedTransactionReceipt, + expectedTransactionHash, + DEFAULT_RETURN_FORMAT, + ); + + await promiEvent; + + expect(WatchTransactionByPolling.watchTransactionByPolling).toHaveBeenCalledWith({ + web3Context, + transactionReceipt: formattedTransactionReceipt, + transactionPromiEvent: promiEvent, + returnFormat: DEFAULT_RETURN_FORMAT, + }); + }, + ); + }); +}); diff --git a/packages/web3-eth/test/unit/validate_transaction_for_signing.test.ts b/packages/web3-eth/test/unit/validate_transaction_for_signing.test.ts new file mode 100644 index 00000000000..b2546dd5f3f --- /dev/null +++ b/packages/web3-eth/test/unit/validate_transaction_for_signing.test.ts @@ -0,0 +1,86 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable jest/no-conditional-expect */ + +import { InvalidTransactionObjectError } from 'web3-errors'; +import { validateTransactionForSigning } from '../../src/validation'; +import { + invalidNonceOrChainIdData, + invalidTransactionObject, + validateChainInfoData, + validateCustomChainInfoData, + validateGasData, +} from '../fixtures/validate_transaction_for_signing'; + +describe('validateTransactionForSigning', () => { + describe('should override validateTransactionForSigning method', () => { + it('should call override method', () => { + const overrideFunction = jest.fn(); + validateTransactionForSigning(invalidTransactionObject[0], overrideFunction); + expect(overrideFunction).toHaveBeenCalledWith(invalidTransactionObject[0]); + }); + }); + + describe('should throw InvalidTransactionObjectError', () => { + it.each(invalidTransactionObject)('%s', transaction => { + expect(() => validateTransactionForSigning(transaction)).toThrow( + new InvalidTransactionObjectError(transaction), + ); + }); + }); + + describe('validateCustomChainInfo', () => { + it.each(validateCustomChainInfoData)('%s should return %s', (transaction, output) => { + if (output instanceof Error) { + expect(() => validateTransactionForSigning(transaction)).toThrow(output); + } else { + expect(validateTransactionForSigning(transaction)).toBeUndefined(); + } + }); + }); + + describe('validateChainInfo', () => { + it.each(validateChainInfoData)('%s should return %s', (transaction, output) => { + if (output instanceof Error) { + expect(() => validateTransactionForSigning(transaction)).toThrow(output); + } else { + expect(validateTransactionForSigning(transaction)).toBeUndefined(); + } + }); + }); + + describe('validateGas', () => { + it.each(validateGasData)('%s should return %s', (transaction, output) => { + if (output instanceof Error) { + expect(() => validateTransactionForSigning(transaction)).toThrow(output); + } else { + expect(validateTransactionForSigning(transaction)).toBeUndefined(); + } + }); + }); + + describe('should throw InvalidNonceOrChainIdError', () => { + it.each(invalidNonceOrChainIdData)('%s', (transaction, output) => { + if (output instanceof Error) { + expect(() => validateTransactionForSigning(transaction)).toThrow(output); + } else { + expect(validateTransactionForSigning(transaction)).toBeUndefined(); + } + }); + }); +}); diff --git a/packages/web3-eth/test/unit/validation.test.ts b/packages/web3-eth/test/unit/validation.test.ts new file mode 100644 index 00000000000..c805cdd75d7 --- /dev/null +++ b/packages/web3-eth/test/unit/validation.test.ts @@ -0,0 +1,111 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable jest/no-conditional-expect */ + +import { InvalidTransactionCall, InvalidTransactionWithSender } from 'web3-errors'; +import { + isAccessList, + isAccessListEntry, + isBaseTransaction, + isTransaction1559Unsigned, + isTransaction2930Unsigned, + isTransactionCall, + isTransactionLegacyUnsigned, + isTransactionWithSender, + validateTransactionCall, + validateTransactionWithSender, +} from '../../src/validation'; +import { + isAccessListEntryValidData, + isAccessListValidData, + isBaseTransactionValidData, + isTransaction1559UnsignedValidData, + isTransaction2930UnsignedValidData, + isTransactionCallValidData, + isTransactionLegacyUnsignedValidData, + isTransactionWithSenderValidData, + validateTransactionCallInvalidData, + validateTransactionWithSenderInvalidData, +} from '../fixtures/validation'; + +describe('validation', () => { + describe('isBaseTransaction', () => { + it.each(isBaseTransactionValidData)('%s', (input, output) => { + expect(isBaseTransaction(input)).toEqual(output); + }); + }); + describe('isAccessListEntry', () => { + it.each(isAccessListEntryValidData)('%s', (input, output) => { + expect(isAccessListEntry(input)).toEqual(output); + }); + }); + describe('isAccessList', () => { + it.each(isAccessListValidData())('%s', (input, output) => { + expect(isAccessList(input)).toEqual(output); + }); + }); + describe('isTransaction1559Unsigned', () => { + it.each(isTransaction1559UnsignedValidData())('%s', (input, output) => { + expect(isTransaction1559Unsigned(input)).toEqual(output); + }); + }); + describe('isTransactionLegacyUnsigned', () => { + it.each(isTransactionLegacyUnsignedValidData())('%s', (input, output) => { + expect(isTransactionLegacyUnsigned(input)).toEqual(output); + }); + }); + describe('isTransaction2930Unsigned', () => { + it.each(isTransaction2930UnsignedValidData())('%s', (input, output) => { + expect(isTransaction2930Unsigned(input)).toEqual(output); + }); + }); + describe('isTransactionWithSender', () => { + it.each(isTransactionWithSenderValidData())('%s', (input, output) => { + expect(isTransactionWithSender(input)).toEqual(output); + }); + }); + describe('validateTransactionWithSender', () => { + it.each([ + ...validateTransactionWithSenderInvalidData(), + ...isTransactionWithSenderValidData(), + ])('%s', (input, output) => { + if (output instanceof InvalidTransactionWithSender) { + expect(() => validateTransactionWithSender(input)).toThrow(output); + } else { + expect(() => validateTransactionWithSender(input)).not.toThrow(); + } + }); + }); + describe('isTransactionCall', () => { + it.each(isTransactionCallValidData)('%s', (input, output) => { + expect(isTransactionCall(input)).toEqual(output); + }); + }); + describe('validateTransactionCall', () => { + it.each([...validateTransactionCallInvalidData(), ...isTransactionCallValidData])( + '%s', + (input, output) => { + if (output instanceof InvalidTransactionCall) { + expect(() => validateTransactionCall(input)).toThrow(output); + } else { + expect(() => validateTransactionCall(input)).not.toThrow(); + } + }, + ); + }); +}); diff --git a/packages/web3-eth/test/unit/web3_eth_calculate_fee_data.test.ts b/packages/web3-eth/test/unit/web3_eth_calculate_fee_data.test.ts new file mode 100644 index 00000000000..ed1b504a3be --- /dev/null +++ b/packages/web3-eth/test/unit/web3_eth_calculate_fee_data.test.ts @@ -0,0 +1,84 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ethRpcMethods } from 'web3-rpc-methods'; + +import Web3Eth from '../../src/index'; + +jest.mock('web3-rpc-methods'); + +describe('Web3Eth.calculateFeeData', () => { + let web3Eth: Web3Eth; + + beforeAll(() => { + web3Eth = new Web3Eth('http://127.0.0.1:8545'); + }); + + it('should return call getBlockByNumber, getGasPrice and getMaxPriorityFeePerGas', async () => { + await web3Eth.calculateFeeData(); + // web3Eth.getBlock = jest.fn(); + expect(ethRpcMethods.getBlockByNumber).toHaveBeenCalledWith( + web3Eth.requestManager, + 'latest', + false, + ); + expect(ethRpcMethods.getGasPrice).toHaveBeenCalledWith(web3Eth.requestManager); + expect(ethRpcMethods.getMaxPriorityFeePerGas).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('should calculate fee data', async () => { + const gasPrice = BigInt(20 * 1000); + const baseFeePerGas = BigInt(1000); + const maxPriorityFeePerGas = BigInt(100); + const baseFeePerGasFactor = BigInt(3); + + jest.spyOn(ethRpcMethods, 'getBlockByNumber').mockReturnValueOnce({ baseFeePerGas } as any); + jest.spyOn(ethRpcMethods, 'getGasPrice').mockReturnValueOnce(gasPrice as any); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + jest + .spyOn(ethRpcMethods, 'getMaxPriorityFeePerGas') + .mockReturnValueOnce(maxPriorityFeePerGas as any); + + const feeData = await web3Eth.calculateFeeData(baseFeePerGasFactor, maxPriorityFeePerGas); + expect(feeData).toMatchObject({ + gasPrice, + maxFeePerGas: baseFeePerGas * baseFeePerGasFactor + maxPriorityFeePerGas, + maxPriorityFeePerGas, + baseFeePerGas, + }); + }); + + it('should calculate fee data based on `alternativeMaxPriorityFeePerGas` if `getMaxPriorityFeePerGas` did not return a value', async () => { + const gasPrice = BigInt(20 * 1000); + const baseFeePerGas = BigInt(1000); + const alternativeMaxPriorityFeePerGas = BigInt(700); + const baseFeePerGasFactor = BigInt(3); + + jest.spyOn(ethRpcMethods, 'getBlockByNumber').mockReturnValueOnce({ baseFeePerGas } as any); + jest.spyOn(ethRpcMethods, 'getGasPrice').mockReturnValueOnce(gasPrice as any); + const feeData = await web3Eth.calculateFeeData( + baseFeePerGasFactor, + alternativeMaxPriorityFeePerGas, + ); + expect(feeData).toMatchObject({ + gasPrice, + maxFeePerGas: baseFeePerGas * baseFeePerGasFactor + alternativeMaxPriorityFeePerGas, + maxPriorityFeePerGas: alternativeMaxPriorityFeePerGas, + baseFeePerGas, + }); + }); +}); diff --git a/packages/web3-eth/test/unit/web3_eth_methods_no_parameters.test.ts b/packages/web3-eth/test/unit/web3_eth_methods_no_parameters.test.ts new file mode 100644 index 00000000000..a66a1ecdd46 --- /dev/null +++ b/packages/web3-eth/test/unit/web3_eth_methods_no_parameters.test.ts @@ -0,0 +1,85 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { ethRpcMethods } from 'web3-rpc-methods'; + +import Web3Eth from '../../src/index'; + +jest.mock('web3-rpc-methods'); + +describe('web3_eth_methods_no_parameters', () => { + let web3Eth: Web3Eth; + + beforeAll(() => { + web3Eth = new Web3Eth('http://127.0.0.1:8545'); + }); + + describe('should call RPC method with only request manager parameter', () => { + it('getProtocolVersion', async () => { + await web3Eth.getProtocolVersion(); + expect(ethRpcMethods.getProtocolVersion).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('isSyncing', async () => { + await web3Eth.isSyncing(); + expect(ethRpcMethods.getSyncing).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('getCoinbase', async () => { + await web3Eth.getCoinbase(); + expect(ethRpcMethods.getCoinbase).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('isMining', async () => { + await web3Eth.isMining(); + expect(ethRpcMethods.getMining).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('getAccounts', async () => { + await web3Eth.getAccounts(); + expect(ethRpcMethods.getAccounts).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('getWork', async () => { + await web3Eth.getWork(); + expect(ethRpcMethods.getWork).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('getPendingTransactions', async () => { + (ethRpcMethods.getPendingTransactions as jest.Mock).mockResolvedValueOnce([]); + + await web3Eth.getPendingTransactions(); + expect(ethRpcMethods.getPendingTransactions).toHaveBeenCalledWith( + web3Eth.requestManager, + ); + }); + + it('requestAccounts', async () => { + await web3Eth.requestAccounts(); + expect(ethRpcMethods.requestAccounts).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('getNodeInfo', async () => { + await web3Eth.getNodeInfo(); + expect(ethRpcMethods.getNodeInfo).toHaveBeenCalledWith(web3Eth.requestManager); + }); + + it('getMaxPriorityFeePerGas', async () => { + await web3Eth.getMaxPriorityFeePerGas(); + expect(ethRpcMethods.getMaxPriorityFeePerGas).toHaveBeenCalledWith(web3Eth.requestManager); + }); + }); +}); diff --git a/packages/web3-eth/test/unit/web3_eth_methods_with_parameters.test.ts b/packages/web3-eth/test/unit/web3_eth_methods_with_parameters.test.ts new file mode 100644 index 00000000000..c2f017b24cf --- /dev/null +++ b/packages/web3-eth/test/unit/web3_eth_methods_with_parameters.test.ts @@ -0,0 +1,382 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { ethRpcMethods } from 'web3-rpc-methods'; + +import { TransactionInfoAPI } from 'web3-types'; +import Web3Eth from '../../src/index'; +import * as rpcMethodWrappers from '../../src/rpc_method_wrappers'; +import { + getBlockNumberValidData, + getChainIdValidData, + getGasPriceValidData, + getHashRateValidData, +} from '../fixtures/rpc_methods_wrappers'; +import { + estimateGasValidData, + getBalanceValidData, + getBlockTransactionCountValidData, + getBlockUncleCountValidData, + getBlockValidData, + getCodeValidData, + getFeeHistoryValidData, + getPastLogsValidData, + getProofValidData, + getStorageAtValidData, + getTransactionCountValidData, + getTransactionFromBlockValidData, + getTransactionReceiptValidData, + getTransactionValidData, + getUncleValidData, + sendSignedTransactionValidData, + signValidData, + submitWorkValidData, + tx, + txReceipt, +} from '../fixtures/web3_eth_methods_with_parameters'; + +import { testData as createAccessListTestData } from './rpc_method_wrappers/fixtures/createAccessList'; + +jest.mock('web3-rpc-methods'); +jest.mock('../../src/rpc_method_wrappers'); +// eslint-disable-next-line @typescript-eslint/no-unsafe-call +jest.spyOn(rpcMethodWrappers, 'getTransaction').mockResolvedValue(tx as TransactionInfoAPI); +jest.spyOn(rpcMethodWrappers, 'getTransactionReceipt').mockResolvedValue(txReceipt); + +describe('web3_eth_methods_with_parameters', () => { + let web3Eth: Web3Eth; + + beforeAll(() => { + web3Eth = new Web3Eth('http://127.0.0.1:8545'); + }); + + describe('should call RPC method with expected parameters', () => { + describe('only has returnFormat parameter', () => { + describe('getHashRate', () => { + it.each(getHashRateValidData)('returnFormat: %s', async returnFormat => { + await web3Eth.getHashRate(returnFormat); + expect(rpcMethodWrappers.getHashRate).toHaveBeenCalledWith( + web3Eth, + returnFormat, + ); + }); + }); + + describe('getHashrate', () => { + it.each(getHashRateValidData)('returnFormat: %s', async returnFormat => { + // eslint-disable-next-line deprecation/deprecation + await web3Eth.getHashrate(returnFormat); + expect(rpcMethodWrappers.getHashRate).toHaveBeenCalledWith( + web3Eth, + returnFormat, + ); + }); + }); + + describe('getGasPrice', () => { + it.each(getGasPriceValidData)('returnFormat: %s', async returnFormat => { + await web3Eth.getGasPrice(returnFormat); + expect(rpcMethodWrappers.getGasPrice).toHaveBeenCalledWith( + web3Eth, + returnFormat, + ); + }); + }); + + describe('getBlockNumber', () => { + it.each(getBlockNumberValidData)('returnFormat: %s', async returnFormat => { + await web3Eth.getBlockNumber(returnFormat); + expect(rpcMethodWrappers.getBlockNumber).toHaveBeenCalledWith( + web3Eth, + returnFormat, + ); + }); + }); + + describe('getChainId', () => { + it.each(getChainIdValidData)('returnFormat: %s', async returnFormat => { + await web3Eth.getChainId(returnFormat); + expect(rpcMethodWrappers.getChainId).toHaveBeenCalledWith( + web3Eth, + returnFormat, + ); + }); + }); + }); + + describe('has multiple parameters', () => { + describe('has returnFormat parameter', () => { + describe('getBalance', () => { + it.each(getBalanceValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getBalance(...input); + expect(rpcMethodWrappers.getBalance).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getBlock', () => { + it.each(getBlockValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getBlock(...input); + expect(rpcMethodWrappers.getBlock).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getBlockTransactionCount', () => { + it.each(getBlockTransactionCountValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getBlockTransactionCount(...input); + expect(rpcMethodWrappers.getBlockTransactionCount).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getBlockUncleCount', () => { + it.each(getBlockUncleCountValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getBlockUncleCount(...input); + expect(rpcMethodWrappers.getBlockUncleCount).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getUncle', () => { + it.each(getUncleValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getUncle(...input); + expect(rpcMethodWrappers.getUncle).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getTransaction', () => { + it.each(getTransactionValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getTransaction(...input); + expect(rpcMethodWrappers.getTransaction).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getTransactionFromBlock', () => { + it.each(getTransactionFromBlockValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getTransactionFromBlock(...input); + expect(rpcMethodWrappers.getTransactionFromBlock).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getTransactionReceipt', () => { + it.each(getTransactionReceiptValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getTransactionReceipt(...input); + expect(rpcMethodWrappers.getTransactionReceipt).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getTransactionCount', () => { + it.each(getTransactionCountValidData)( + 'input: %s\rpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getTransactionCount(...input); + expect(rpcMethodWrappers.getTransactionCount).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('estimateGas', () => { + it.each(estimateGasValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.estimateGas(...input); + expect(rpcMethodWrappers.estimateGas).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getFeeHistory', () => { + it.each(getFeeHistoryValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getFeeHistory(...input); + expect(rpcMethodWrappers.getFeeHistory).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getProof', () => { + it.each(getProofValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getProof(...input); + expect(rpcMethodWrappers.getProof).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getStorageAt', () => { + it.each(getStorageAtValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getStorageAt(...input); + expect(rpcMethodWrappers.getStorageAt).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getCode', () => { + it.each(getCodeValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getCode(...input); + expect(rpcMethodWrappers.getCode).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('sendSignedTransaction', () => { + it.each(sendSignedTransactionValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.sendSignedTransaction(...input); + expect(rpcMethodWrappers.sendSignedTransaction).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('sign', () => { + it.each(signValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.sign(...input); + expect(rpcMethodWrappers.sign).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('getPastLogs', () => { + it.each(getPastLogsValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (input, rpcMethodParameters) => { + await web3Eth.getPastLogs(...input); + expect(rpcMethodWrappers.getLogs).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + describe('getPastLogs called with rpcMethodWrappers', () => { + it.each(getPastLogsValidData)( + 'input: %s\nrpcMethodParameters: %s', + async (_, rpcMethodParameters) => { + await rpcMethodWrappers.getLogs(web3Eth, ...rpcMethodParameters); + expect(rpcMethodWrappers.getLogs).toHaveBeenCalledWith( + web3Eth, + ...rpcMethodParameters, + ); + }, + ); + }); + + describe('createAccessList', () => { + it.each(createAccessListTestData)( + 'input: %s\nrpcMethodParameters: %s', + async (_, input) => { + await web3Eth.createAccessList(...input); + expect(rpcMethodWrappers.createAccessList).toHaveBeenCalledWith( + web3Eth, + ...input, + ); + }, + ); + }); + }); + + describe("doesn't have returnFormat parameter", () => { + describe('submitWork', () => { + it.each(submitWorkValidData)('input: %s', async input => { + await web3Eth.submitWork(...input); + expect(ethRpcMethods.submitWork).toHaveBeenCalledWith( + web3Eth.requestManager, + ...input, + ); + }); + }); + }); + }); + }); +}); diff --git a/packages/web3-eth/test/unit/web3_eth_subscription.test.ts b/packages/web3-eth/test/unit/web3_eth_subscription.test.ts new file mode 100644 index 00000000000..edbf28d215f --- /dev/null +++ b/packages/web3-eth/test/unit/web3_eth_subscription.test.ts @@ -0,0 +1,108 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3SubscriptionManager } from 'web3-core'; +import { Web3BaseProvider } from 'web3-types'; +import * as rpcMethodWrappers from '../../src/rpc_method_wrappers'; +import { LogsSubscription } from '../../src'; +import { Web3Eth } from '../../src/web3_eth'; +import { mockRpcResponse as mockGetLogsRpcResponse } from './rpc_method_wrappers/fixtures/get_logs'; +import { sleep } from '../shared_fixtures/utils'; + +jest.mock('../../src/rpc_method_wrappers'); + +describe('Web3Eth subscribe and clear subscriptions', () => { + let web3Eth: Web3Eth; + + it('should return the subscription data provided by the Subscription Manager', async () => { + const requestManager = { send: jest.fn(), on: jest.fn(), provider: { on: jest.fn() } }; + + const subManager = new Web3SubscriptionManager(requestManager as any, undefined as any); + const dummyLogs = { logs: { test1: 'test1' } }; + + jest.spyOn(subManager, 'subscribe').mockResolvedValueOnce(dummyLogs); + web3Eth = new Web3Eth({ + provider: { + on: jest.fn(), + } as unknown as Web3BaseProvider, + subscriptionManager: subManager, + }); + + const logs = await web3Eth.subscribe('logs'); + expect(logs).toStrictEqual(dummyLogs); + }); + + it('should call `_processSubscriptionResult` when the logs are of type LogsSubscription and the `fromBlock` is provided', async () => { + const requestManager = { send: jest.fn(), on: jest.fn(), provider: { on: jest.fn() } }; + const subManager = new Web3SubscriptionManager(requestManager as any, undefined as any); + + const dummyLogs = new LogsSubscription({}, { subscriptionManager: subManager }); + jest.spyOn(subManager, 'subscribe').mockResolvedValueOnce(dummyLogs); + jest.spyOn(rpcMethodWrappers, 'getLogs').mockResolvedValueOnce(mockGetLogsRpcResponse); + + web3Eth = new Web3Eth({ + provider: { + on: jest.fn(), + } as unknown as Web3BaseProvider, + subscriptionManager: subManager, + }); + jest.spyOn(dummyLogs, '_processSubscriptionResult'); + + const logs = await web3Eth.subscribe('logs', { + fromBlock: 0, + }); + await sleep(100); + + expect(logs).toStrictEqual(dummyLogs); + expect(dummyLogs._processSubscriptionResult).toHaveBeenCalled(); + }); + + it('should be able to clear subscriptions', async () => { + const requestManager = { send: jest.fn(), on: jest.fn(), provider: { on: jest.fn() } }; + const subManager = new Web3SubscriptionManager(requestManager as any, undefined as any); + + jest.spyOn(subManager, 'unsubscribe'); + + web3Eth = new Web3Eth({ + provider: { + on: jest.fn(), + } as unknown as Web3BaseProvider, + subscriptionManager: subManager, + }); + + await web3Eth.clearSubscriptions(); + + expect(subManager.unsubscribe).toHaveBeenCalledWith(undefined); + }); + + it('should be able to clear subscriptions and pass `shouldClearSubscription` when passing `notClearSyncing`', async () => { + const requestManager = { send: jest.fn(), on: jest.fn(), provider: { on: jest.fn() } }; + const subManager = new Web3SubscriptionManager(requestManager as any, undefined as any); + + jest.spyOn(subManager, 'unsubscribe'); + + web3Eth = new Web3Eth({ + provider: { + on: jest.fn(), + } as unknown as Web3BaseProvider, + subscriptionManager: subManager, + }); + + await web3Eth.clearSubscriptions(true); + + expect(subManager.unsubscribe).toHaveBeenCalledWith(Web3Eth['shouldClearSubscription']); + }); +}); diff --git a/packages/web3-eth/tsconfig.cjs.json b/packages/web3-eth/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-eth/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-eth/tsconfig.esm.json b/packages/web3-eth/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-eth/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-eth/tsconfig.json b/packages/web3-eth/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-eth/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-eth/tsconfig.types.json b/packages/web3-eth/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-eth/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-eth/tsdoc.json b/packages/web3-eth/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-eth/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-eth/types/index.d.ts b/packages/web3-eth/types/index.d.ts deleted file mode 100644 index c018c2dbcac..00000000000 --- a/packages/web3-eth/types/index.d.ts +++ /dev/null @@ -1,441 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @author Samuel Furter - * @author Prince Sinha - * @date 2018 - */ - -import * as net from 'net'; -import { - BatchRequest, - Extension, - Log, - PromiEvent, - provider, - Providers, - RLPEncodedTransaction, - Transaction, - TransactionConfig, - TransactionReceipt, - Common, - hardfork, - chain, - BlockNumber, - LogsOptions, - PastLogsOptions -} from 'web3-core'; -import {Subscription} from 'web3-core-subscriptions'; -import {AbiCoder} from 'web3-eth-abi'; -import {Accounts} from 'web3-eth-accounts'; -import {Contract, ContractOptions} from 'web3-eth-contract'; -import {Ens} from 'web3-eth-ens'; -import {Iban} from 'web3-eth-iban'; -import {Personal} from 'web3-eth-personal'; -import {Network} from 'web3-net'; -import {AbiItem} from 'web3-utils'; -import {BigNumber} from 'bignumber.js'; -import BN = require('bn.js'); - -export { - TransactionConfig, - RLPEncodedTransaction, - Transaction, - TransactionReceipt, - hardfork, - Common, - chain -} from 'web3-core'; - -export class Eth { - constructor(); - constructor(provider: provider); - constructor(provider: provider, net: net.Socket); - - Contract: new ( - jsonInterface: AbiItem[] | AbiItem, - address?: string, - options?: ContractOptions - ) => Contract; - Iban: new (iban: string) => Iban; - personal: Personal; - accounts: Accounts; - ens: Ens; - abi: AbiCoder; - net: Network; - - readonly givenProvider: any; - static readonly givenProvider: any; - defaultAccount: string | null; - defaultBlock: BlockNumber; - defaultCommon: Common; - defaultHardfork: hardfork; - defaultChain: chain; - transactionPollingTimeout: number; - transactionConfirmationBlocks: number; - transactionBlockTimeout: number; - handleRevert: boolean; - readonly currentProvider: provider; - - setProvider(provider: provider): boolean; - - BatchRequest: new () => BatchRequest; - static readonly providers: Providers; - - extend(extension: Extension): any; - - clearSubscriptions(callback: (error: Error, result: boolean) => void): void; - - subscribe( - type: 'logs', - options: LogsOptions, - callback?: (error: Error, log: Log) => void - ): Subscription; - subscribe( - type: 'syncing', - callback?: (error: Error, result: Syncing) => void - ): Subscription; - subscribe( - type: 'newBlockHeaders', - callback?: (error: Error, blockHeader: BlockHeader) => void - ): Subscription; - subscribe( - type: 'pendingTransactions', - callback?: (error: Error, transactionHash: string) => void - ): Subscription; - - getProtocolVersion( - callback?: (error: Error, protocolVersion: string) => void - ): Promise; - - isSyncing( - callback?: (error: Error, syncing: Syncing) => void - ): Promise; - - getCoinbase( - callback?: (error: Error, coinbaseAddress: string) => void - ): Promise; - - isMining( - callback?: (error: Error, mining: boolean) => void - ): Promise; - - getHashrate( - callback?: (error: Error, hashes: number) => void - ): Promise; - - getNodeInfo( - callback?: (error: Error, version: string) => void - ): Promise; - - getChainId( - callback?: (error: Error, version: number) => void - ): Promise; - - getGasPrice( - callback?: (error: Error, gasPrice: string) => void - ): Promise; - - getAccounts( - callback?: (error: Error, accounts: string[]) => void - ): Promise; - - getBlockNumber( - callback?: (error: Error, blockNumber: number) => void - ): Promise; - - getBalance( - address: string - ): Promise; - getBalance( - address: string, - defaultBlock: BlockNumber): Promise; - getBalance( - address: string, - callback?: (error: Error, balance: string) => void - ): Promise; - getBalance( - address: string, - defaultBlock: BlockNumber, - callback?: (error: Error, balance: string) => void - ): Promise; - - getStorageAt(address: string, position: number | BigNumber | BN | string): Promise; - getStorageAt( - address: string, - position: number | BigNumber | BN | string, - defaultBlock: BlockNumber - ): Promise; - getStorageAt( - address: string, - position: number | BigNumber | BN | string, - callback?: (error: Error, storageAt: string) => void - ): Promise; - getStorageAt( - address: string, - position: number | BigNumber | BN | string, - defaultBlock: BlockNumber, - callback?: (error: Error, storageAt: string) => void - ): Promise; - - getCode( - address: string - ): Promise; - getCode( - address: string, - defaultBlock: BlockNumber - ): Promise; - getCode( - address: string, - callback?: (error: Error, code: string) => void - ): Promise; - getCode( - address: string, - defaultBlock: BlockNumber, - callback?: (error: Error, code: string) => void - ): Promise; - - getBlock(blockHashOrBlockNumber: BlockNumber | string): Promise; - getBlock( - blockHashOrBlockNumber: BlockNumber | string, - returnTransactionObjects: boolean - ): Promise; - getBlock( - blockHashOrBlockNumber: BlockNumber | string, - callback?: (error: Error, block: BlockTransactionString) => void - ): Promise; - getBlock( - blockHashOrBlockNumber: BlockNumber | string, - returnTransactionObjects: boolean, - callback?: (error: Error, block: BlockTransactionObject) => void - ): Promise; - - getBlockTransactionCount( - blockHashOrBlockNumber: BlockNumber | string, - callback?: (error: Error, numberOfTransactions: number) => void - ): Promise; - - getBlockUncleCount( - blockHashOrBlockNumber: BlockNumber | string, - callback?: (error: Error, numberOfTransactions: number) => void - ): Promise; - - getUncle( - blockHashOrBlockNumber: BlockNumber | string, - uncleIndex: number | string | BN - ): Promise; - getUncle( - blockHashOrBlockNumber: BlockNumber | string, - uncleIndex: number | string | BN, - returnTransactionObjects: boolean - ): Promise; - getUncle( - blockHashOrBlockNumber: BlockNumber | string, - uncleIndex: number | string | BN, - callback?: (error: Error, uncle: any) => void - ): Promise; - getUncle( - blockHashOrBlockNumber: BlockNumber | string, - uncleIndex: number | string | BN, - returnTransactionObjects: boolean, - callback?: (error: Error, uncle: any) => void - ): Promise; - - getTransaction( - transactionHash: string, - callback?: (error: Error, transaction: Transaction) => void - ): Promise; - - getPendingTransactions( - callback?: (error: Error, result: Transaction[]) => void - ): Promise; - - getTransactionFromBlock( - blockHashOrBlockNumber: BlockNumber | string, - indexNumber: number | string | BN, - callback?: (error: Error, transaction: Transaction) => void - ): Promise; - - getTransactionReceipt( - hash: string, - callback?: ( - error: Error, - transactionReceipt: TransactionReceipt - ) => void - ): Promise; - - getTransactionCount(address: string): Promise; - getTransactionCount( - address: string, - defaultBlock: BlockNumber - ): Promise; - getTransactionCount( - address: string, - callback?: (error: Error, count: number) => void - ): Promise; - getTransactionCount( - address: string, - defaultBlock: BlockNumber, - callback?: (error: Error, count: number) => void - ): Promise; - - sendTransaction( - transactionConfig: TransactionConfig, - callback?: (error: Error, hash: string) => void - ): PromiEvent; - - sendSignedTransaction( - signedTransactionData: string, - callback?: (error: Error, hash: string) => void - ): PromiEvent; - - sign( - dataToSign: string, - address: string | number, - callback?: (error: Error, signature: string) => void - ): Promise; - - signTransaction( - transactionConfig: TransactionConfig, - callback?: ( - error: Error, - signedTransaction: RLPEncodedTransaction - ) => void - ): Promise; - signTransaction( - transactionConfig: TransactionConfig, - address: string - ): Promise; - signTransaction( - transactionConfig: TransactionConfig, - address: string, - callback: ( - error: Error, - signedTransaction: RLPEncodedTransaction - ) => void - ): Promise; - - call(transactionConfig: TransactionConfig): Promise; - call( - transactionConfig: TransactionConfig, - defaultBlock?: BlockNumber - ): Promise; - call( - transactionConfig: TransactionConfig, - callback?: (error: Error, data: string) => void - ): Promise; - call( - transactionConfig: TransactionConfig, - defaultBlock: BlockNumber, - callback: (error: Error, data: string) => void - ): Promise; - - estimateGas( - transactionConfig: TransactionConfig, - callback?: (error: Error, gas: number) => void - ): Promise; - - getPastLogs( - options: PastLogsOptions, - callback?: (error: Error, logs: Log[]) => void - ): Promise; - - getWork( - callback?: (error: Error, result: string[]) => void - ): Promise; - - submitWork( - data: [string, string, string], - callback?: (error: Error, result: boolean) => void - ): Promise; - - getProof( - address: string, - storageKey: number[] | BigNumber[] | BN[] | string[], - blockNumber: BlockNumber, - callback?: (error: Error, result: GetProof) => void - ): Promise; - - getProof( - address: string, - storageKey: number[] | BigNumber[] | BN[] | string[], - blockNumber: BlockNumber, - ): Promise; - - requestAccounts(): Promise - requestAccounts(callback: (error: Error, result: string[]) => void): Promise -} - -export interface Syncing { - StartingBlock: number; - CurrentBlock: number; - HighestBlock: number; - KnownStates: number; - PulledStates: number; -} - -export interface BlockHeader { - number: number; - hash: string; - parentHash: string; - nonce: string; - sha3Uncles: string; - logsBloom: string; - transactionRoot: string; - stateRoot: string; - receiptRoot: string; - miner: string; - extraData: string; - gasLimit: number; - gasUsed: number; - timestamp: number | string; -} - -// TODO: This interface does exist to provide backwards-compatibility and can get removed on a minor release -export interface Block extends BlockTransactionBase { - transactions: Transaction[] | string[]; -} - -export interface BlockTransactionBase extends BlockHeader { - size: number; - difficulty: number; - totalDifficulty: number; - uncles: string[]; -} - -export interface BlockTransactionObject extends BlockTransactionBase { - transactions: Transaction[]; -} - -export interface BlockTransactionString extends BlockTransactionBase { - transactions: string[]; -} - -export interface GetProof { - address: string; - balance: string; - codeHash: string; - nonce: string; - storageHash: string; - accountProof: string[]; - storageProof: StorageProof[]; -} - -export interface StorageProof { - key: string; - value: string; - proof: string[]; -} diff --git a/packages/web3-eth/types/tests/eth.tests.ts b/packages/web3-eth/types/tests/eth.tests.ts deleted file mode 100644 index 43475e0208c..00000000000 --- a/packages/web3-eth/types/tests/eth.tests.ts +++ /dev/null @@ -1,632 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file eth-tests.ts - * @author Josh Stevens - * @author Prince Sinha - * @date 2018 - */ - -import {Log} from 'web3-core'; -import { - BlockTransactionObject, - BlockTransactionString, - BlockHeader, - Eth, - GetProof, - Syncing, - RLPEncodedTransaction, - Transaction, - TransactionReceipt, - TransactionConfig, - hardfork, - Common, - chain -} from 'web3-eth'; -import BN = require('bn.js'); -import BigNumber from 'bignumber.js'; - -// $ExpectType Eth -const eth_empty = new Eth(); - -// $ExpectType Eth -const eth = new Eth('http://localhost:8545'); - -// $ExpectType provider -eth.currentProvider; - -// $ExpectType any -eth.givenProvider; - -// $ExpectType string | null -eth.defaultAccount; - -// $ExpectType BlockNumber -eth.defaultBlock; - -// $ExpectType Common -eth.defaultCommon; - -// $ExpectType hardfork -eth.defaultHardfork; - -// $ExpectType chain -eth.defaultChain; - -// $ExpectType number -eth.transactionPollingTimeout; - -// $ExpectType number -eth.transactionConfirmationBlocks; - -// $ExpectType number -eth.transactionBlockTimeout; - -// $ExpectType boolean -eth.handleRevert; - -// $ExpectType new (jsonInterface: AbiItem | AbiItem[], address?: string | undefined, options?: ContractOptions | undefined) => Contract -eth.Contract; - -// $ExpectType new (iban: string) => Iban -eth.Iban; - -// $ExpectType Personal -eth.personal; - -// $ExpectType Accounts -eth.accounts; - -// $ExpectType any -eth.extend({property: 'test', methods: [{name: 'method', call: 'method'}]}); - -// $ExpectType Ens -eth.ens; - -// $ExpectType AbiCoder -eth.abi; - -// $ExpectType Network -eth.net; - -// $ExpectType void -eth.clearSubscriptions(() => {}); - -// $ExpectType Subscription -eth.subscribe('logs', {}); -// $ExpectType Subscription -eth.subscribe('logs', {}, (error: Error, log: Log) => {}); - -// $ExpectType Subscription -eth.subscribe('syncing'); -// $ExpectType Subscription -eth.subscribe( - 'syncing', - (error: Error, result: Syncing) => {} -); - -// $ExpectType Subscription -eth.subscribe('newBlockHeaders'); -// $ExpectType Subscription -eth.subscribe( - 'newBlockHeaders', - (error: Error, blockHeader: BlockHeader) => {} -); - -// $ExpectType Subscription -eth.subscribe('pendingTransactions'); -// $ExpectType Subscription -eth.subscribe( - 'pendingTransactions', - (error: Error, transactionHash: string) => {} -); - -// $ExpectType boolean -eth.setProvider('https://localhost:2100'); - -// $ExpectType BatchRequest -new eth.BatchRequest(); - -// $ExpectType Promise -eth.getProtocolVersion(); -// $ExpectType Promise -eth.getProtocolVersion((error: Error, protocolVersion: string) => {}); - -// $ExpectType Promise -eth.isSyncing(); -// $ExpectType Promise -eth.isSyncing((error: Error, syncing: Syncing) => {}); - -// $ExpectType Promise -eth.getCoinbase(); -// $ExpectType Promise -eth.getCoinbase((error: Error, coinbaseAddress: string) => {}); - -// $ExpectType Promise -eth.isMining(); -// $ExpectType Promise -eth.isMining((error: Error, mining: boolean) => {}); - -// $ExpectType Promise -eth.getHashrate(); -// $ExpectType Promise -eth.getHashrate((error: Error, hashes: number) => {}); - -// $ExpectType Promise -eth.getNodeInfo(); -// $ExpectType Promise -eth.getNodeInfo((error: Error, version: string) => {}); - -// $ExpectType Promise -eth.getChainId(); -// $ExpectType Promise -eth.getChainId((error: Error, chainId: number) => {}); - -// $ExpectType Promise -eth.getGasPrice(); -// $ExpectType Promise -eth.getGasPrice((error: Error, gasPrice: string) => {}); - -// $ExpectType Promise -eth.getAccounts(); -// $ExpectType Promise -eth.getAccounts((error: Error, accounts: string[]) => {}); - -// $ExpectType Promise -eth.getBlockNumber(); -// $ExpectType Promise -eth.getBlockNumber((error: Error, blockNumber: number) => {}); - -// $ExpectType Promise -eth.getBalance('0x407d73d8a49eeb85d32cf465507dd71d507100c1'); -// $ExpectType Promise -eth.getBalance('0x407d73d8a49eeb85d32cf465507dd71d507100c1', '1000'); -// $ExpectType Promise -eth.getBalance( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - '1000', - (error: Error, balance: string) => {} -); -// $ExpectType Promise -eth.getBalance('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 1000); -// $ExpectType Promise -eth.getBalance( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 1000, - (error: Error, balance: string) => {} -); - -// $ExpectType Promise -eth.getStorageAt('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 2); -// $ExpectType Promise -eth.getStorageAt('0x407d73d8a49eeb85d32cf465507dd71d507100c1', new BN(2)); -// $ExpectType Promise -eth.getStorageAt('0x407d73d8a49eeb85d32cf465507dd71d507100c1', new BigNumber(2)); -// $ExpectType Promise -eth.getStorageAt('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 2, '1000'); -// $ExpectType Promise -eth.getStorageAt( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 2, - '1000', - (error: Error, balance: string) => {} -); -// $ExpectType Promise -eth.getStorageAt('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 2, 1000); -// $ExpectType Promise -eth.getStorageAt( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 2, - 1000, - (error: Error, balance: string) => {} -); - -// $ExpectType Promise -eth.getCode('0x407d73d8a49eeb85d32cf465507dd71d507100c1'); -// $ExpectType Promise -eth.getCode('0x407d73d8a49eeb85d32cf465507dd71d507100c1', '1000'); -// $ExpectType Promise -eth.getCode( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - '1000', - (error: Error, balance: string) => {} -); -// $ExpectType Promise -eth.getCode('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 1000); -// $ExpectType Promise -eth.getCode( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 1000, - (error: Error, balance: string) => {} -); - -// $ExpectType Promise -eth.getBlock('0x407d73d8a49eeb85d32cf465507dd71d507100c1'); -// $ExpectType Promise -eth.getBlock(345); -// $ExpectType Promise -eth.getBlock('0x407d73d8a49eeb85d32cf465507dd71d507100c1', true); -// $ExpectType Promise -eth.getBlock(345); -// $ExpectType Promise -eth.getBlock(345, true); -// $ExpectType Promise -eth.getBlock( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - (error: Error, block: BlockTransactionString) => {} -); -// $ExpectType Promise -eth.getBlock(345, (error: Error, block: BlockTransactionString) => {}); -// $ExpectType Promise -eth.getBlock(345, true, (error: Error, block: BlockTransactionObject) => {}); -// $ExpectType Promise -eth.getBlock( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - true, - (error: Error, block: BlockTransactionObject) => {} -); - -// $ExpectType Promise -eth.getBlockTransactionCount( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - (error: Error, numberOfTransactions: number) => {} -); -// $ExpectType Promise -eth.getBlockTransactionCount(345); -// $ExpectType Promise -eth.getBlockTransactionCount( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - (error: Error, numberOfTransactions: number) => {} -); -// $ExpectType Promise -eth.getBlockTransactionCount(345); - -// $ExpectType Promise -eth.getUncle('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 4); -// $ExpectType Promise -eth.getUncle(345, 4); -// $ExpectType Promise -eth.getUncle('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 4, true); -// $ExpectType Promise -eth.getUncle( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 4, - (error: Error, uncle: {}) => {} -); -// $ExpectType Promise -eth.getUncle(345, 4, (error: Error, uncle: {}) => {}); -// $ExpectType Promise -eth.getUncle(345, 4, true); -// $ExpectType Promise -eth.getUncle( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 4, - true, - (error: Error, uncle: {}) => {} -); -// $ExpectType Promise -eth.getUncle(345, 4, true, (error: Error, uncle: {}) => {}); - -// $ExpectType Promise -eth.getTransaction('0x407d73d8a49eeb85d32cf465507dd71d507100c1'); -// $ExpectType Promise -eth.getTransaction( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - (error: Error, transaction: Transaction) => {} -); - -// $ExpectType Promise -eth.getTransactionFromBlock('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 2); -// $ExpectType Promise -eth.getTransactionFromBlock(345, 2); -// $ExpectType Promise -eth.getTransactionFromBlock( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 2, - (error: Error, transaction: Transaction) => {} -); -// $ExpectType Promise -eth.getTransactionFromBlock( - 345, - 2, - (error: Error, transaction: Transaction) => {} -); - -// $ExpectType Promise -eth.getTransactionReceipt('0x407d73d8a49eeb85d32cf465507dd71d507100c1'); -// $ExpectType Promise -eth.getTransactionReceipt( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - (error: Error, transactionReceipt: TransactionReceipt) => {} -); - -// $ExpectType Promise -eth.getTransactionCount('0x407d73d8a49eeb85d32cf465507dd71d507100c1'); -// $ExpectType Promise -eth.getTransactionCount('0x407d73d8a49eeb85d32cf465507dd71d507100c1', 1000); -// $ExpectType Promise -eth.getTransactionCount('0x407d73d8a49eeb85d32cf465507dd71d507100c1', '1000'); -// $ExpectType Promise -eth.getTransactionCount( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - (error: Error, count: number) => {} -); -// $ExpectType Promise -eth.getTransactionCount( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - (error: Error, count: number) => {} -); -// $ExpectType Promise -eth.getTransactionCount( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - 1000, - (error: Error, count: number) => {} -); -// $ExpectType Promise -eth.getTransactionCount( - '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - '1000', - (error: Error, count: number) => {} -); - -const code = '603d80600c6000396000f3007c0'; - -// $ExpectType PromiEvent -eth.sendTransaction({ - from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', - data: 'code' -}); -// $ExpectType PromiEvent -eth.sendTransaction( - { - from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', - data: 'code' - }, - (error: Error, hash: string) => {} -); - -// $ExpectType PromiEvent -eth.sendSignedTransaction('0xf889808609184e72a0008227109'); -// $ExpectType PromiEvent -eth.sendSignedTransaction( - '0xf889808609184e72a0008227109', - (error: Error, hash: string) => {} -); - -// $ExpectType Promise -eth.sign('Hello world', '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'); -// $ExpectType Promise -eth.sign('Hello world', 3); -// $ExpectType Promise -eth.sign( - 'Hello world', - '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - (error: Error, signature: string) => {} -); -// $ExpectType Promise -eth.sign('Hello world', 3, (error: Error, signature: string) => {}); - -// $ExpectType Promise -eth.signTransaction({ - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' -}); -// $ExpectType Promise -eth.signTransaction( - { - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' - }, - '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0' -); -// $ExpectType Promise -eth.signTransaction( - { - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' - }, - (error: Error, signedTransaction: RLPEncodedTransaction) => {} -); -// $ExpectType Promise -eth.signTransaction( - { - from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - gasPrice: '20000000000', - gas: '21000', - to: '0x3535353535353535353535353535353535353535', - value: '1000000000000000000', - data: '' - }, - '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - (error: Error, signedTransaction: RLPEncodedTransaction) => {} -); - -// $ExpectType Promise -eth.call({ - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // contract address - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' -}); -// $ExpectType Promise -eth.call( - { - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // contract address - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' - }, - 100 -); -// $ExpectType Promise -eth.call( - { - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // contract address - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' - }, - '100' -); -// $ExpectType Promise -eth.call( - { - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // contract address - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' - }, - (error: Error, data: string) => {} -); -// $ExpectType Promise -eth.call( - { - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // contract address - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' - }, - '100', - (error: Error, data: string) => {} -); -// $ExpectType Promise -eth.call( - { - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // contract address - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' - }, - 100, - (error: Error, data: string) => {} -); - -// $ExpectType Promise -eth.call( - { - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // contract address - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' - }, - 100, - (error: Error, data: string) => {} -); - -// $ExpectType Promise -eth.estimateGas({ - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' -}); -// $ExpectType Promise -eth.estimateGas( - { - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: - '0xc6888fa10000000000000000000000000000000000000000000000000000000000000003' - }, - (error: Error, gas: number) => {} -); - -// $ExpectType Promise -eth.getPastLogs({ - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - topics: ['0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234'] -}); -// $ExpectType Promise -eth.getPastLogs( - { - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - topics: [ - '0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234' - ] - }, - (error: Error, logs: Log[]) => {} -); - -// $ExpectType Promise -eth.getWork(); -// $ExpectType Promise -eth.getWork((error: Error, result: string[]) => {}); - -// $ExpectType Promise -eth.submitWork([ - '0x0000000000000001', - '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', - '0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000' -]); - -// $ExpectType Promise -eth.submitWork( - [ - '0x0000000000000001', - '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', - '0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000' - ], - (error: Error, result: boolean) => {} -); - -// $ExpectType Promise -eth.getPendingTransactions(); - -// $ExpectType Promise -eth.getPendingTransactions((error: Error, result: Transaction[]) => {}); - -// $ExpectType Promise -eth.getProof( - '0x1234567890123456789012345678901234567890', - [ - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - 'latest' -); - -// $ExpectType Promise -eth.getProof( - '0x1234567890123456789012345678901234567890', - [ - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - 'latest', - (error: Error, result: GetProof) => {} -); - -// $ExpectType Promise -eth.getProof( - '0x1234567890123456789012345678901234567890', - [ - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - 10 -); - -// $ExpectType Promise -eth.getProof( - '0x1234567890123456789012345678901234567890', - [ - '0x0000000000000000000000000000000000000000000000000000000000000000', - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - 10, - (error: Error, result: GetProof) => {} -); diff --git a/packages/web3-eth/types/tsconfig.json b/packages/web3-eth/types/tsconfig.json deleted file mode 100644 index e9ea79fb47a..00000000000 --- a/packages/web3-eth/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth": ["."] - } - } -} diff --git a/packages/web3-eth/types/tslint.json b/packages/web3-eth/types/tslint.json deleted file mode 100644 index 871d605704b..00000000000 --- a/packages/web3-eth/types/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false - } -} diff --git a/packages/web3-eth2-beaconchain/.babelrc b/packages/web3-eth2-beaconchain/.babelrc deleted file mode 100644 index aecdb01cc4c..00000000000 --- a/packages/web3-eth2-beaconchain/.babelrc +++ /dev/null @@ -1,8 +0,0 @@ - -{ - "presets": ["@babel/env", "@babel/typescript"], - "plugins": [ - "@babel/proposal-class-properties", - "@babel/proposal-object-rest-spread" - ] - } \ No newline at end of file diff --git a/packages/web3-eth2-beaconchain/Makefile b/packages/web3-eth2-beaconchain/Makefile deleted file mode 100644 index 3d6b7bc8ef5..00000000000 --- a/packages/web3-eth2-beaconchain/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -.PHONY: lodestar-docker lighthouse-docker - -lodestar-docker: - docker run --network host chainsafe/lodestar beacon --testnet medalla --api.rest.enabled true - -lighthouse-docker: - docker run -p 9000:9000 -p 127.0.0.1:5052:5052 -v ${HOME}/.lighthouse:/root/.lighthouse sigp/lighthouse lighthouse --network mainnet beacon --http --http-address 0.0.0.0 diff --git a/packages/web3-eth2-beaconchain/jest.config.js b/packages/web3-eth2-beaconchain/jest.config.js deleted file mode 100644 index a5586a60e26..00000000000 --- a/packages/web3-eth2-beaconchain/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - roots: ['/test'], - transform: { - '^.+\\.tsx?$': 'ts-jest', - }, - testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$', - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], - } \ No newline at end of file diff --git a/packages/web3-eth2-beaconchain/package-lock.json b/packages/web3-eth2-beaconchain/package-lock.json deleted file mode 100644 index b0bf67a955a..00000000000 --- a/packages/web3-eth2-beaconchain/package-lock.json +++ /dev/null @@ -1,5349 +0,0 @@ -{ - "name": "web3-eth2-beaconchain", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jest/console": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", - "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.3.0", - "jest-util": "^26.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz", - "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/reporters": "^26.4.1", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.3.0", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-resolve-dependencies": "^26.4.2", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "jest-watcher": "^26.3.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0" - } - }, - "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" - } - }, - "@jest/globals": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz", - "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/types": "^26.3.0", - "expect": "^26.4.2" - } - }, - "@jest/reporters": { - "version": "26.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", - "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^5.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/source-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz", - "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz", - "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==", - "dev": true, - "requires": { - "@jest/test-result": "^26.3.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2" - } - }, - "@jest/transform": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", - "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.3.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.3.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@types/babel__core": { - "version": "7.1.10", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", - "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", - "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", - "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/node": { - "version": "14.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", - "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/prettier": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.1.tgz", - "integrity": "sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ==", - "dev": true - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.7.tgz", - "integrity": "sha512-Gf4u3EjaPNcC9cTu4/j2oN14nSVhr8PQ+BvBcBQHAhDZfl0bVIiLgvnRXv/dn58XhTm9UXvBpvJpDlwV65QxOA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true - }, - "babel-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz", - "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==", - "dev": true, - "requires": { - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.3.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz", - "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz", - "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.2.0", - "babel-preset-current-node-syntax": "^0.1.3" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", - "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emittery": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", - "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-regex-util": "^26.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.4.2.tgz", - "integrity": "sha512-LLCjPrUh98Ik8CzW8LLVnSCfLaiY+wbK53U7VxnFSX7Q+kWC4noVeDvGWIFw0Amfq1lq2VfGm7YHWSLBV62MJw==", - "dev": true, - "requires": { - "@jest/core": "^26.4.2", - "import-local": "^3.0.2", - "jest-cli": "^26.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-cli": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.2.tgz", - "integrity": "sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==", - "dev": true, - "requires": { - "@jest/core": "^26.4.2", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "prompts": "^2.0.1", - "yargs": "^15.3.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-changed-files": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz", - "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz", - "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.4.2", - "@jest/types": "^26.3.0", - "babel-jest": "^26.3.0", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.3.0", - "jest-environment-node": "^26.3.0", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.4.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", - "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.3.0", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz", - "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-jsdom": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz", - "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0", - "jsdom": "^16.2.2" - } - }, - "jest-environment-node": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz", - "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", - "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.3.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", - "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.3.0", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.4.2", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2", - "throat": "^5.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", - "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - } - }, - "jest-matcher-utils": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz", - "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.4.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", - "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz", - "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", - "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.3.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz", - "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.4.2" - } - }, - "jest-runner": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz", - "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.3.0", - "jest-leak-detector": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-runtime": "^26.4.2", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", - "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/globals": "^26.4.2", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-serializer": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", - "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz", - "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.4.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.4.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", - "natural-compare": "^1.4.0", - "pretty-format": "^26.4.2", - "semver": "^7.3.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", - "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz", - "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.4.2" - }, - "dependencies": { - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz", - "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.3.0", - "string-length": "^4.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "optional": true - }, - "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", - "dev": true, - "optional": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "pretty-format": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", - "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - } - } - }, - "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-to-istanbul": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", - "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.3.0.tgz", - "integrity": "sha512-BQRf/ej5Rp3+n7k0grQXZj9a1cHtsp4lqj01p59xBWFKdezR8sO37XnpafwNqiFac/v2Il12EIMjX/Y4VZtT8Q==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } -} diff --git a/packages/web3-eth2-beaconchain/package.json b/packages/web3-eth2-beaconchain/package.json deleted file mode 100644 index f25f8416ffb..00000000000 --- a/packages/web3-eth2-beaconchain/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "web3-eth2-beaconchain", - "version": "1.3.0", - "description": "Web3 ETH2 Beacon chain API wrappers.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth2-beaconchain", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types", - "test": "jest", - "tsc": "babel src --out-dir lib --extensions \".ts,.tsx\" --source-maps inline" - }, - "main": "lib/index.js", - "dependencies": { - "web3-eth2-core": "^1.3.0" - }, - "devDependencies": { - "@chainsafe/lodestar-types": "^0.11.0", - "@types/jest": "^26.0.14", - "@types/node": "^14.11.2", - "dtslint": "^3.4.1", - "jest": "^26.4.2", - "ts-jest": "^26.4.1", - "typescript": "^4.0.3" - } -} diff --git a/packages/web3-eth2-beaconchain/src/index.ts b/packages/web3-eth2-beaconchain/src/index.ts deleted file mode 100644 index 7859a21ddc1..00000000000 --- a/packages/web3-eth2-beaconchain/src/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -// @ts-ignore - types not full implemented yet -import { ETH2Core } from 'web3-eth2-core' -import { DefaultSchema } from './schema' - -import { IETH2BeaconChain } from '../types/index' -// @ts-ignore - types not full implemented yet -import { IBaseAPISchema } from 'web3-eth2-core' -// @ts-ignore - types not full implemented yet -import { ETH2BaseOpts } from 'web3-eth2-core' - -// @ts-ignore - ETH2BeaconChain incorrectly implements interface IETH2BeaconChain -export class ETH2BeaconChain extends ETH2Core implements IETH2BeaconChain { - constructor( - provider: string, - schema: IBaseAPISchema = DefaultSchema, - opts: ETH2BaseOpts = { protectProvider: true }) { - super(provider, schema, opts) - } -} diff --git a/packages/web3-eth2-beaconchain/src/schema.ts b/packages/web3-eth2-beaconchain/src/schema.ts deleted file mode 100644 index 5e63aabe1a0..00000000000 --- a/packages/web3-eth2-beaconchain/src/schema.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { IBaseAPISchema } from '../../web3-eth2-core/src/schema' - -export const DefaultSchema: IBaseAPISchema = { - packageName: 'eth2-beaconchain', - routePrefix: '/eth/v1/beacon/', - methods: [ - { - name: 'getGenesis', - route: 'genesis', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get genesis block:' - }, - { - name: 'getHashRoot', - route: 'states/${stateId}/root', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get state hash tree root:' - }, - { - name: 'getForkData', - route: 'states/${stateId}/fork', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get fork object for state:' - }, - { - name: 'getFinalityCheckpoint', - route: 'states/${stateId}/finality_checkpoints', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get state finality checkpoints:' - }, - { - name: 'getValidators', - route: 'states/${stateId}/validators', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get state validators:' - }, - { - name: 'getValidatorById', - route: 'states/${stateId}/validators/${validatorId}', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to validator from state by id:' - }, - { - name: 'getValidatorBalances', - route: 'states/${stateId}/validator_balances', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to validator balances from state:' - }, - { - name: 'getEpochCommittees', - route: 'states/${stateId}/committees/${epoch}', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to committees for epoch:' - }, - { - name: 'getBlockHeaders', - route: 'headers', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to block headers:' - }, - { - name: 'getBlockHeader', - route: 'headers/${blockId}', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get block header:' - }, - { - name: 'publishSignedBlock', - route: 'blocks', - restMethod: 'post', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to publish signed block:' - }, - { - name: 'getBlock', - route: 'blocks/${blockId}', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get block:' - }, - { - name: 'getBlockRoot', - route: 'blocks/${blockId}/root', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get block root:' - }, - { - name: 'getBlockAttestations', - route: 'blocks/${blockId}/attestations', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to block attestations:' - }, - { - name: 'getAttestationsFromPool', - route: 'pool/attestations', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to attestations from operations pool:' - }, - { - name: 'submitAttestation', - route: 'pool/attestations', - restMethod: 'post', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to submit attestations to operations pool:' - }, - { - name: 'getAttesterSlashings', - route: 'pool/attester_slashings', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get attester slashings from operations pool:' - }, - { - name: 'submitAttesterSlashings', - route: 'pool/attester_slashings', - restMethod: 'post', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to submit attester slashings to operations pool:' - }, - { - name: 'getProposerSlashings', - route: 'pool/proposer_slashings', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get proposer slashings from operations pool:' - }, - { - name: 'submitProposerSlashings', - route: 'pool/proposer_slashings', - restMethod: 'post', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to submit proposer slashings to operations pool:' - }, - { - name: 'getSignedVoluntaryExits', - route: 'pool/voluntary_exits', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to get signed voluntary exits from operations pool' - }, - { - name: 'submitVoluntaryExit', - route: 'pool/voluntary_exits', - restMethod: 'post', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Failed to submit voluntary exit to operations pool:' - }, - ] -} diff --git a/packages/web3-eth2-beaconchain/test/axiosMock.ts b/packages/web3-eth2-beaconchain/test/axiosMock.ts deleted file mode 100644 index 8549f501e7f..00000000000 --- a/packages/web3-eth2-beaconchain/test/axiosMock.ts +++ /dev/null @@ -1,3 +0,0 @@ -import jest from 'jest' - -export const get = jest.fn(() => Promise.resolve({ data: {} })) diff --git a/packages/web3-eth2-beaconchain/test/constructor.test.ts b/packages/web3-eth2-beaconchain/test/constructor.test.ts deleted file mode 100644 index 2ccc4ac2f7c..00000000000 --- a/packages/web3-eth2-beaconchain/test/constructor.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ETH2BeaconChain } from '../src/index' - -const provider = 'http://127.0.0.1:9596' -const providerSuffix = '/eth/v1/beacon/' - -it('constructs a ETH2BeaconChain instance with expected properties', () => { - const eth2BeaconChain = new ETH2BeaconChain(provider) - - // @ts-ignore - types not full implemented yet - expect(eth2BeaconChain.name).toBe('eth2-beaconchain') - // @ts-ignore - types not full implemented yet - expect(eth2BeaconChain.provider).toBe(`${provider}${providerSuffix}`) - // @ts-ignore - types not full implemented yet - expect(eth2BeaconChain.protectProvider) -}) diff --git a/packages/web3-eth2-beaconchain/test/schemaMethods.test.ts b/packages/web3-eth2-beaconchain/test/schemaMethods.test.ts deleted file mode 100644 index 6df3f5c55f1..00000000000 --- a/packages/web3-eth2-beaconchain/test/schemaMethods.test.ts +++ /dev/null @@ -1,358 +0,0 @@ -import { ETH2BeaconChain } from '../src/index' - -// Jest doesn't have a native method to test if value is boolean -expect.extend({ - toBeBoolean(received) { - return typeof received === 'boolean' ? { - message: () => `expected ${received} to be boolean`, - pass: true - } : { - message: () => `expected ${received} to be boolean`, - pass: false - } - } -}) - -let eth2BeaconChain: any // should be ETH2BeaconChain but types aren't implemented yet - -beforeAll(() => { - // const provider = 'http://127.0.0.1:9596' // default port for Lodestar - const provider = 'http://127.0.0.1:5052' // default port for Lighthouse - eth2BeaconChain = new ETH2BeaconChain(provider) -}) - -it('getGenesis', async () => { - const expectedResponse = { - genesis_validators_root: expect.stringMatching(/0x[a-f|A-F|\d]{64}/), - genesis_time: expect.stringMatching(/\d{10}/), - genesis_fork_version: expect.stringMatching(/0x[a-f|A-F|\d]{8}/) - } - - const response = await eth2BeaconChain.getGenesis() - expect(response).toMatchObject(expectedResponse) -}) - -it('getHashRoot', async () => { - const routeParameters = { stateId: 'head' } - const expectedResponse = { - root: expect.stringMatching(/0x[a-f|A-F|\d]{64}/), - } - - const response = await eth2BeaconChain.getHashRoot(routeParameters) - expect(response).toMatchObject(expectedResponse) -}) - -it('getForkData', async () => { - const routeParameters = { stateId: 'head' } - const expectedResponse = { - current_version: expect.stringMatching(/0x[a-f|A-F|\d]{8}/), - epoch: expect.stringMatching(/\d/), - previous_version: expect.stringMatching(/0x[a-f|A-F|\d]{8}/), - } - - const response = await eth2BeaconChain.getForkData(routeParameters) - expect(response).toMatchObject(expectedResponse) -}) - -it('getFinalityCheckpoint', async () => { - const routeParameters = { stateId: 'head' } - const expectedResponse = { - current_justified: { - epoch: expect.stringMatching(/\d+/), - root: expect.stringMatching(/0x[a-f|A-F|\d]{64}/), - }, - finalized: { - epoch: expect.stringMatching(/\d+/), - root: expect.stringMatching(/0x[a-f|A-F|\d]{64}/), - }, - previous_justified: { - epoch: expect.stringMatching(/\d+/), - root: expect.stringMatching(/0x[a-f|A-F|\d]{64}/), - }, - } - - const response = await eth2BeaconChain.getFinalityCheckpoint(routeParameters) - expect(response).toMatchObject(expectedResponse) -}) - -it('getValidators', async () => { - const routeParameters = { stateId: 'genesis' } - const expectedResponse = { - balance: expect.stringMatching(/\d+/), - index: expect.stringMatching(/\d+/), - status: expect.stringMatching(/pending_initialized|pending_queued|active_ongoing|active_exiting|active_slashed|exited_unslashed|exited_slashed|withdrawal_possible|withdrawal_done|active|pending|exited|withdrawal/), - validator: { - activation_eligibility_epoch: expect.stringMatching(/\d+/), - activation_epoch: expect.stringMatching(/\d+/), - effective_balance: expect.stringMatching(/\d+/), - exit_epoch: expect.stringMatching(/\d+/), - pubkey: expect.stringMatching(/0x[a-f|A-F|\d]{96}/), - slashed: false, - withdrawable_epoch: expect.stringMatching(/\d+/), - withdrawal_credentials: expect.stringMatching(/0x[a-f|A-F|\d]{64}/), - } - } - - const response = await eth2BeaconChain.getValidators(routeParameters) - expect(response[0]).toMatchObject(expectedResponse) -}) - -it('getValidatorById', async () => { - const routeParameters = { - stateId: 'head', - validatorId: '0x96fb9db98b540d8500711c45fcb3608cc3fd75212457976f5b11f9f93c26701e68f846a9751e3dc2d92fa3d972a8c6b0' - } - const expectedResponse = { - balance: expect.stringMatching(/\d+/), - index: expect.stringMatching(/\d+/), - status: expect.stringMatching(/pending_initialized|pending_queued|active_ongoing|active_exiting|active_slashed|exited_unslashed|exited_slashed|withdrawal_possible|withdrawal_done|active|pending|exited|withdrawal/), - validator: { - activation_eligibility_epoch: expect.stringMatching(/\d+/), - activation_epoch: expect.stringMatching(/\d+/), - effective_balance: expect.stringMatching(/\d+/), - exit_epoch: expect.stringMatching(/\d+/), - pubkey: expect.stringMatching(/0x[a-f|A-F|\d]{96}/), - slashed: false, - withdrawable_epoch: expect.stringMatching(/\d+/), - withdrawal_credentials: expect.stringMatching(/0x[a-f|A-F|\d]{64}/), - } - } - - const response = await eth2BeaconChain.getValidatorById(routeParameters) - expect(response).toMatchObject(expectedResponse) -}) - -it('getValidatorBalances', async () => { - const routeParameters = { - stateId: 'head', - } - const expectedResponse = { - balance: expect.stringMatching(/\d+/), - index: expect.stringMatching(/\d+/) - } - - const response = await eth2BeaconChain.getValidatorBalances(routeParameters) - expect(response[0]).toMatchObject(expectedResponse) -}) - -it('getEpochCommittees', async () => { - const routeParameters = { - stateId: 'head', - epoch: '' - } - const queryParameters = { - index: '1', - slot: '1' - } - const expectedResponse = { - index: expect.stringMatching(/\d+/), - slot: expect.stringMatching(/\d+/), - validators: expect.anything() // Only tests if not null or undefined - } - - const response = await eth2BeaconChain.getEpochCommittees(routeParameters, queryParameters) - expect(response[0]).toMatchObject(expectedResponse) -}) - -it('getBlockHeaders', async () => { - const expectedResponse = [ - { - root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - // @ts-ignore - method is added at top of file - canonical: expect.toBeBoolean(), - header: { - message: { - slot: expect.stringMatching(/\d/), - proposer_index: expect.stringMatching(/\d/), - parent_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - state_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - body_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - }, - signature: expect.stringMatching(/0x[a-f|A-F|\d]{192}/), - } - } - ] - - const response = await eth2BeaconChain.getBlockHeaders() - expect(response).toMatchObject(expectedResponse) -}) - -it('getBlockHeader', async () => { - const routeParameters = { - blockId: 'head', - } - const expectedResponse = { - root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - // @ts-ignore - method is added at top of file - canonical: expect.toBeBoolean(), - header: { - message: { - slot: expect.stringMatching(/\d/), - proposer_index: expect.stringMatching(/\d/), - parent_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - state_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - body_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - }, - signature: expect.stringMatching(/0x[a-f|A-F|\d]{192}/), - } - } - - const response = await eth2BeaconChain.getBlockHeader(routeParameters) - expect(response).toMatchObject(expectedResponse) -}) - -/** - * @TODO Doesn't actually test publishing signed block, but not sure how to go about - * setting this up in a test environment to test actual publishing of blocks - */ -it('publishSignedBlock', async () => { - const response = eth2BeaconChain.publishSignedBlock() - await expect(response).rejects.toThrow('Failed to publish signed block: Request failed with status code 400') -}) - -it('getBlock', async () => { - const routeParameters = { - blockId: 'head', - } - const expectedResponse = { - root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - // @ts-ignore - method is added at top of file - canonical: expect.toBeBoolean(), - header: { - message: { - slot: expect.stringMatching(/\d/), - proposer_index: expect.stringMatching(/\d/), - parent_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - state_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - body_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - }, - signature: expect.stringMatching(/0x[a-f|A-F|\d]{192}/), - } - } - - const response = await eth2BeaconChain.getBlockHeader(routeParameters) - expect(response).toMatchObject(expectedResponse) -}) - -it('getBlockRoot', async () => { - const routeParameters = { - blockId: 'head', - } - const expectedResponse = { - root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/) - } - - const response = await eth2BeaconChain.getBlockRoot(routeParameters) - expect(response).toMatchObject(expectedResponse) -}) - -it('getBlockAttestations', async () => { - const routeParameters = { - blockId: 'head', - } - const expectedResponse = { - aggregation_bits: expect.stringMatching(/0x[a-f|A-F|\d]{2}/), - signature: expect.stringMatching(/0x[a-f|A-F|\d]{192}/), - data: { - slot: expect.stringMatching(/\d/), - index: expect.stringMatching(/\d/), - beacon_block_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - source: { - epoch: expect.stringMatching(/\d/), - root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/) - }, - target: { - epoch: expect.stringMatching(/\d/), - root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/) - } - } - } - - const response = await eth2BeaconChain.getBlockAttestations(routeParameters) - expect(response[0]).toMatchObject(expectedResponse) -}) - -/** - * @TODO queryParameters don't seem to be taken into consideration - */ -it('getAttestationsFromPool', async () => { - const queryParameters = { - slot: 1, - committee_index: 1 - } - // const expectedResponse = { - // aggregation_bits: expect.stringMatching(/0x[a-f|A-F|\d]{2}/), - // signature: expect.stringMatching(/0x[a-f|A-F|\d]{192}/), - // data: { - // slot: expect.stringMatching(/\d/), - // index: expect.stringMatching(/\d/), - // beacon_block_root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/), - // source: { - // epoch: expect.stringMatching(/\d/), - // root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/) - // }, - // target: { - // epoch: expect.stringMatching(/\d/), - // root: expect.stringMatching(/0x[a-f|A-F|\d]{62}/) - // } - // } - // } - const expectedResponse: any[] = [] - - const response = await eth2BeaconChain.getAttestationsFromPool(null, queryParameters) - expect(response).toMatchObject(expectedResponse) -}) - -/** - * @TODO Doesn't actually test submitting attestation, but not sure how to go about - * setting this up in a test environment to test actual submission - */ -it('submitAttestation', async () => { - const response = eth2BeaconChain.submitAttestation() - await expect(response).rejects.toThrow('Failed to submit attestations to operations pool: Request failed with status code 400') -}) - -it('getAttesterSlashings', async () => { - const expectedResponse: any[] = [] - const response = await eth2BeaconChain.getAttesterSlashings() - expect(response).toMatchObject(expectedResponse) -}) - -/** - * @TODO Doesn't actually test submitting attester slashings, but not sure how to go about - * setting this up in a test environment to test actual submission - */ -it('submitAttesterSlashings', async () => { - const response = eth2BeaconChain.submitAttesterSlashings() - await expect(response).rejects.toThrow('Failed to submit attester slashings to operations pool: Request failed with status code 400') -}) - -it('getProposerSlashings', async () => { - const expectedResponse: any[] = [] - const response = await eth2BeaconChain.getProposerSlashings() - expect(response).toMatchObject(expectedResponse) -}) - -/** - * @TODO Doesn't actually test submitting proposer slashings, but not sure how to go about - * setting this up in a test environment to test actual submission - */ -it('submitProposerSlashings', async () => { - const response = eth2BeaconChain.submitProposerSlashings() - await expect(response).rejects.toThrow('Failed to submit proposer slashings to operations pool: Request failed with status code 400') -}) - -it('getSignedVoluntaryExits', async () => { - const expectedResponse: any[] = [] - const response = await eth2BeaconChain.getSignedVoluntaryExits() - expect(response).toMatchObject(expectedResponse) -}) - -/** - * @TODO Doesn't actually test submitting exit, but not sure how to go about - * setting this up in a test environment to test actual submission - */ -it('submitVoluntaryExit', async () => { - const response = eth2BeaconChain.submitVoluntaryExit() - await expect(response).rejects.toThrow('Failed to submit voluntary exit to operations pool: Request failed with status code 400') -}) diff --git a/packages/web3-eth2-beaconchain/tsconfig.json b/packages/web3-eth2-beaconchain/tsconfig.json deleted file mode 100644 index 68084889aeb..00000000000 --- a/packages/web3-eth2-beaconchain/tsconfig.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "compilerOptions": { - /* Basic Options */ - "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "lib", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - - /* Source Map Options */ - // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - // "declarationDir": "lib" /* Output directory for generated declaration files. */ - } -} \ No newline at end of file diff --git a/packages/web3-eth2-beaconchain/types/index.d.ts b/packages/web3-eth2-beaconchain/types/index.d.ts deleted file mode 100644 index 51356bca690..00000000000 --- a/packages/web3-eth2-beaconchain/types/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Genesis } from '@chainsafe/lodestar-types' - -export interface IETH2BeaconChain { - getGenesis(): Promise - getBlockHeader(): Promise -} diff --git a/packages/web3-eth2-beaconchain/types/tsconfig.json b/packages/web3-eth2-beaconchain/types/tsconfig.json deleted file mode 100644 index 812242a77b5..00000000000 --- a/packages/web3-eth2-beaconchain/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth2-beaconchain": ["."] - } - } -} diff --git a/packages/web3-eth2-beaconchain/types/tslint.json b/packages/web3-eth2-beaconchain/types/tslint.json deleted file mode 100644 index 0f8b285b7e7..00000000000 --- a/packages/web3-eth2-beaconchain/types/tslint.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false, - "no-redundant-jsdoc": false, - "interface-name": [true, "always-prefix"] - } -} diff --git a/packages/web3-eth2-core/jest.config.js b/packages/web3-eth2-core/jest.config.js deleted file mode 100644 index a5586a60e26..00000000000 --- a/packages/web3-eth2-core/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - roots: ['/test'], - transform: { - '^.+\\.tsx?$': 'ts-jest', - }, - testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$', - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], - } \ No newline at end of file diff --git a/packages/web3-eth2-core/package-lock.json b/packages/web3-eth2-core/package-lock.json deleted file mode 100644 index f3301960bda..00000000000 --- a/packages/web3-eth2-core/package-lock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "web3-eth2-core", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "14.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==", - "dev": true - }, - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - } - } -} diff --git a/packages/web3-eth2-core/package.json b/packages/web3-eth2-core/package.json deleted file mode 100644 index 5b78115d8d8..00000000000 --- a/packages/web3-eth2-core/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "web3-eth2-core", - "version": "1.3.0", - "description": "Web3 ETH2 core tools for sub-packages. This is an internal package.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-eth2-core", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types", - "test": "jest", - "tsc": "tsc -b tsconfig.json" - }, - "main": "lib/index.js", - "dependencies": { - "axios": "^0.20.0" - }, - "devDependencies": { - "@types/jest": "^26.0.14", - "@types/node": "^14.11.8", - "dtslint": "^3.4.1", - "jest": "^26.5.3", - "ts-jest": "^26.4.1", - "typescript": "^3.9.5" - } -} diff --git a/packages/web3-eth2-core/src/index.ts b/packages/web3-eth2-core/src/index.ts deleted file mode 100644 index 921b03bd370..00000000000 --- a/packages/web3-eth2-core/src/index.ts +++ /dev/null @@ -1,84 +0,0 @@ -import Axios, {AxiosInstance} from 'axios' - -Axios.defaults.adapter = require('axios/lib/adapters/http'); - -import { ETH2BaseOpts, ETH2Function } from '../types/index' -import { IBaseAPISchema } from './schema' - -export class ETH2Core { - private _httpClient: AxiosInstance - - [ key: string ]: ETH2Function | any; - - name: string - provider: string - protectProvider: boolean // Protects from global overwrite when using .use functionality - - constructor(provider: string, schema: IBaseAPISchema, opts: ETH2BaseOpts = {}) { - this.name = schema.packageName - this.setProvider(`${provider}${schema.routePrefix}`) - this.protectProvider = opts.protectProvider || false - this.buildAPIWrappersFromSchema(schema) - } - - static createHttpClient(baseUrl: string): AxiosInstance { - try { - return Axios.create({ - baseURL: baseUrl - }) - } catch (error) { - throw new Error(`Failed to create HTTP client: ${error.message}`) - } - } - - setProvider(provider: string) { - try { - if (!provider || typeof provider !== 'string' || !/^http(s)?:\/\//i.test(provider)) { - throw new Error(`Invalid HTTP(S) provider: ${provider}`) - } - - this._httpClient = ETH2Core.createHttpClient(provider) - this.provider = provider - } catch (error) { - throw new Error(`Failed to set provider: ${error.message}`) - } - } - - private routeBuilder(rawUrl: string, parameters: { [ key: string]: string }): string { - try { - let computedRoute = rawUrl - - // Find all: ${valuesWeWant} in rawUrl, returns array with only valuesWeWant - const foundIdentifiers = rawUrl.match(/(?<=\$\{).*?(?=\})/gm) // Matches ${valueWeWant}, but doesn't include ${} - if (foundIdentifiers !== null) { - for (const foundIdentifier of foundIdentifiers) { - if (parameters[foundIdentifier] === undefined) throw new Error(`The parameter ${foundIdentifier} was not provided`) - computedRoute = computedRoute.replace(`\${${foundIdentifier}}`, parameters[foundIdentifier]) - } - } - - return computedRoute - } catch (error) { - throw new Error(`Failed to build route: ${error.message}`) - } - } - - private buildAPIWrappersFromSchema(schema: IBaseAPISchema) { - for (const method of schema.methods) { - this[method.name] = async (routeParameters: any, queryParameters: any = {}): Promise => { - try { - if (method.inputFormatter) queryParameters = method.inputFormatter(queryParameters) - - const computedRoute = this.routeBuilder(method.route, routeParameters) - let {data} = await this._httpClient[method.restMethod](computedRoute, { params: queryParameters }) - if (data.data) data = data.data - - if (method.outputFormatter) data = method.outputFormatter(data) - return data - } catch (error) { - throw new Error(`${method.errorPrefix} ${error.message}`) - } - } - } - } -} diff --git a/packages/web3-eth2-core/src/schema.ts b/packages/web3-eth2-core/src/schema.ts deleted file mode 100644 index 1378ea4d1b1..00000000000 --- a/packages/web3-eth2-core/src/schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface IBaseAPISchema { - packageName: string, - routePrefix: string, - methods: IBaseAPIMethodSchema[] -} - -export interface IBaseAPIMethodSchema { - notImplemented?: true, - name: string, - route: string, - restMethod: string - inputFormatter: any, - outputFormatter: any, - errors: any - errorPrefix: string -} diff --git a/packages/web3-eth2-core/test/constructor.test.ts b/packages/web3-eth2-core/test/constructor.test.ts deleted file mode 100644 index 598a49faebb..00000000000 --- a/packages/web3-eth2-core/test/constructor.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ETH2Core } from '../src/index' - -const provider = 'http://127.0.0.1:9596' -const testAPISchema = { - packageName: 'testValue', - routePrefix: '/test/route/', - methods: [ - { - name: 'testMethod', - route: 'additional/route', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Test error prefix:' - } - ] -} - -it('constructs a ETH2Core instance with expected properties', () => { - const eth2Core = new ETH2Core(provider, testAPISchema, { protectProvider: true }) - - expect(eth2Core.name).toBe(testAPISchema.packageName) - expect(eth2Core.provider).toBe(`${provider}${testAPISchema.routePrefix}`) - expect(eth2Core.protectProvider) - expect(eth2Core.testMethod).toBeDefined() -}) diff --git a/packages/web3-eth2-core/test/routeBuild.test.ts b/packages/web3-eth2-core/test/routeBuild.test.ts deleted file mode 100644 index 829dc4d7cb2..00000000000 --- a/packages/web3-eth2-core/test/routeBuild.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { ETH2Core } from '../src/index' - -const provider = 'http://127.0.0.1:9596' -const testAPISchema = { - packageName: 'testValue', - routePrefix: '/test/route/', - methods: [ - { - name: 'testMethod', - route: 'additional/route/${replaceMe}', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Test error prefix:' - }, - { - name: 'testMethod2', - route: 'additional/route', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Test error prefix:' - }, - { - name: 'testMethod3', - route: '${replaceMe1}/foo/${replaceMe2}/${replaceMe3}/bar/${replaceMe4}', - restMethod: 'get', - inputFormatter: null, - outputFormatter: null, - errors: null, - errorPrefix: 'Test error prefix:' - } - ] -} - -let eth2Core - -beforeAll(() => { - eth2Core = new ETH2Core(provider, testAPISchema, { protectProvider: true }) -}) - -it('Should build expectedComputedRoute with 1 parameter', () => { - const routeParameter = { replaceMe: 'testValue' } - const expectedComputedRoute = `additional/route/${routeParameter.replaceMe}` - const computedRoute = eth2Core.routeBuilder(testAPISchema.methods[0].route, routeParameter) - expect(computedRoute).toBe(expectedComputedRoute) -}) - -it('Should throw missing parameter error', () => { - const routeParameter = {} - expect(() => { - eth2Core.routeBuilder(testAPISchema.methods[0].route, routeParameter) - }).toThrow('Failed to build route: The parameter replaceMe was not provided') -}) - -it('Should build expectedComputedRoute with 0 parameters', () => { - const routeParameter = {} - const expectedComputedRoute = testAPISchema.methods[1].route - const computedRoute = eth2Core.routeBuilder(testAPISchema.methods[1].route, routeParameter) - expect(computedRoute).toBe(expectedComputedRoute) -}) - -it('Should build expectedComputedRoute with 4 parameters', () => { - const routeParameters = { - replaceMe1: 'testValue', - replaceMe2: 'testValue2', - replaceMe3: 'testValue3', - replaceMe4: 'testValue4' - } - const expectedComputedRoute = `${routeParameters.replaceMe1}/foo/${routeParameters.replaceMe2}/${routeParameters.replaceMe3}/bar/${routeParameters.replaceMe4}` - const computedRoute = eth2Core.routeBuilder(testAPISchema.methods[2].route, routeParameters) - expect(computedRoute).toBe(expectedComputedRoute) -}) diff --git a/packages/web3-eth2-core/tsconfig.json b/packages/web3-eth2-core/tsconfig.json deleted file mode 100644 index f766506b599..00000000000 --- a/packages/web3-eth2-core/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "src" - ] - } \ No newline at end of file diff --git a/packages/web3-eth2-core/types/index.d.ts b/packages/web3-eth2-core/types/index.d.ts deleted file mode 100644 index 0d190b4f52c..00000000000 --- a/packages/web3-eth2-core/types/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ETH2BaseOpts { - protectProvider?: boolean -} - -export type ETH2Function = (...args: any[]) => Promise; diff --git a/packages/web3-eth2-core/types/tsconfig.json b/packages/web3-eth2-core/types/tsconfig.json deleted file mode 100644 index 8515b4d84ea..00000000000 --- a/packages/web3-eth2-core/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-eth2-core": ["."] - } - } -} diff --git a/packages/web3-eth2-core/types/tslint.json b/packages/web3-eth2-core/types/tslint.json deleted file mode 100644 index 2a4469808b0..00000000000 --- a/packages/web3-eth2-core/types/tslint.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false, - "no-redundant-jsdoc": false - } -} diff --git a/packages/web3-net/.eslintignore b/packages/web3-net/.eslintignore new file mode 100644 index 00000000000..e3d7e665285 --- /dev/null +++ b/packages/web3-net/.eslintignore @@ -0,0 +1,4 @@ +dist +lib +jest.config.js +.eslintrc.js diff --git a/packages/web3-net/.eslintrc.js b/packages/web3-net/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-net/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-net/.gitignore b/packages/web3-net/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-net/.npmignore b/packages/web3-net/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-net/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-net/.prettierignore b/packages/web3-net/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-net/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-net/.prettierrc.json b/packages/web3-net/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-net/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-net/CHANGELOG.md b/packages/web3-net/CHANGELOG.md new file mode 100644 index 00000000000..dd6227ecdd8 --- /dev/null +++ b/packages/web3-net/CHANGELOG.md @@ -0,0 +1,144 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Added + +- `web3-rpc-methods` dependency (#5441) + +### Changed + +- `Web3NetAPI` is now imported from `web3-types` instead of `web3_net_api.ts` (#5441) +- Replace the imported methods from `rpc_methods.ts` with `netRpcMethods` imports from `web3-rpc-methods` (#5441) + +### Removed + +- `rpcMethods` export, these methods are now exported via `web3-rpc-methods` as `netRpcMethods` (#5441) +- `Web3NetAPI` export, now exported via `web3-types` as `Web3NetAPI` (#5441) + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Changed + +- Updated dependencies (#5912) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [4.0.1-rc.2] + +### Changed + +- Dependencies updated + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Changed + +- Dependencies updated + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Changed + +- Dependencies updated + +## [4.0.7] + +### Changed + +- Dependencies updated + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-net/README.md b/packages/web3-net/README.md index 22d4dec312f..6e19cf6a079 100644 --- a/packages/web3-net/README.md +++ b/packages/web3-net/README.md @@ -1,38 +1,59 @@ -# web3-net +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Net -This is a sub-package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -This is the net package used in other [web3.js][repo] packages. +This is a sub-package of [web3.js][repo]. -Please read the [documentation][docs] for more. +`web3-net` package allows to interact with an Ethereum node’s network properties. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-net) or using [Yarn](https://yarnpkg.com/package/web3-net) + +### Using NPM ```bash npm install web3-net ``` -## Usage +### Using Yarn -```js -const Web3Net = require('web3-net'); - -const net = new Web3Net('ws://localhost:8546'); +```bash +yarn add web3-net ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-net.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-net +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-net%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-net -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-net -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-net -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-net -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-net +[downloads-image]: https://img.shields.io/npm/dm/web3-net?label=npm%20downloads diff --git a/packages/web3-net/assets/logo/web3js.ai b/packages/web3-net/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-net/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-net/assets/logo/web3js.jpg b/packages/web3-net/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-net/assets/logo/web3js.jpg differ diff --git a/packages/web3-net/assets/logo/web3js.svg b/packages/web3-net/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-net/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-net/package-lock.json b/packages/web3-net/package-lock.json deleted file mode 100644 index 70f26f734dd..00000000000 --- a/packages/web3-net/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-net", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-net/package.json b/packages/web3-net/package.json index 57d72e521a9..1397aa44c7a 100644 --- a/packages/web3-net/package.json +++ b/packages/web3-net/package.json @@ -1,25 +1,64 @@ { - "name": "web3-net", - "version": "1.3.0", - "description": "Web3 module to interact with the Ethereum nodes networking properties.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-net", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-net", + "version": "4.0.7", + "description": "Web3 module to interact with the Ethereum nodes networking properties.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "web3-core": "^4.3.0", + "web3-rpc-methods": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7" + } } diff --git a/packages/web3-net/src/index.js b/packages/web3-net/src/index.js deleted file mode 100644 index cdca9d6f980..00000000000 --- a/packages/web3-net/src/index.js +++ /dev/null @@ -1,67 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var core = require('web3-core'); -var Method = require('web3-core-method'); -var utils = require('web3-utils'); - - -var Net = function () { - var _this = this; - - // sets _requestmanager - core.packageInit(this, arguments); - - - [ - new Method({ - name: 'getId', - call: 'net_version', - params: 0, - outputFormatter: parseInt - }), - new Method({ - name: 'isListening', - call: 'net_listening', - params: 0 - }), - new Method({ - name: 'getPeerCount', - call: 'net_peerCount', - params: 0, - outputFormatter: utils.hexToNumber - }) - ].forEach(function(method) { - method.attachToObject(_this); - method.setRequestManager(_this._requestManager); - }); - -}; - -core.addProviders(Net); - - -module.exports = Net; - - diff --git a/packages/web3-net/src/index.ts b/packages/web3-net/src/index.ts new file mode 100644 index 00000000000..d2ba11d7682 --- /dev/null +++ b/packages/web3-net/src/index.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * The web3-net package allows you to interact with an Ethereum node’s network properties. + * + * ```ts + * import Net from 'web3-net'; + * + * const net = new Net(Net.givenProvider || 'ws://some.local-or-remote.node:8546'); + * // or using the web3 umbrella package + * import Web3 from 'web3'; + * const web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); + * + * // -> web3.eth.net + * + * // get the ID of the network + * await web3.eth.net.getId(); + * > 5777n + * + * // get the peer count + * await web3.eth.net.getPeerCount(); + * > 0n + * + * // Check if the node is listening for peers + * await web3.eth.net.isListening(); + * > true + * ``` + */ + +/** + * + */ +import { Net } from './net.js'; + +export * from './net.js'; +export * from './rpc_method_wrappers.js'; + +export default Net; diff --git a/packages/web3-net/src/net.ts b/packages/web3-net/src/net.ts new file mode 100644 index 00000000000..eb84e567bb5 --- /dev/null +++ b/packages/web3-net/src/net.ts @@ -0,0 +1,93 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; +import { DataFormat, DEFAULT_RETURN_FORMAT, Web3NetAPI } from 'web3-types'; + +import * as rpcMethodsWrappers from './rpc_method_wrappers.js'; + +/** + * Net class allows you to interact with an Ethereum node’s network properties. +* For using Net package, first install Web3 package using: `npm i web3` or `yarn add web3` based on your package manager, after that Net features can be used. +* ```ts +* +* import { Web3 } from 'web3'; +* const web3 = new Web3('https://mainnet.infura.io/v3/'); +* +* console.log(await web3.eth.net.getId()); +* +* ``` +* For using individual package install `web3-net` packages using: `npm i web3-net` or `yarn add web3-net`. +* +* ```ts +* import {Net} from 'web3-net'; +* +* const net = new Net('https://mainnet.infura.io/v3/'); +* console.log(await net.getId()); +* ``` +*/ +export class Net extends Web3Context { + /** + * Gets the current network ID + * + * @param returnFormat - Return format + * @returns A Promise of the network ID. + * @example + * ```ts + * const net = new Net(Net.givenProvider || 'ws://some.local-or-remote.node:8546'); + * await net.getId(); + * > 1 + * ``` + */ + public async getId( + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getId(this, returnFormat); + } + + /** + * Get the number of peers connected to. + * + * @param returnFormat - Return format + * @returns A promise of the number of the peers connected to. + * @example + * ```ts + * const net = new Net(Net.givenProvider || 'ws://some.local-or-remote.node:8546'); + * await net.getPeerCount(); + * > 0 + * ``` + */ + public async getPeerCount( + returnFormat: ReturnFormat = DEFAULT_RETURN_FORMAT as ReturnFormat, + ) { + return rpcMethodsWrappers.getPeerCount(this, returnFormat); + } + + /** + * Check if the node is listening for peers + * + * @returns A promise of a boolean if the node is listening to peers + * @example + * ```ts + * const net = new Net(Net.givenProvider || 'ws://some.local-or-remote.node:8546'); + * await net.isListening(); + * > true + * ``` + */ + public async isListening() { + return rpcMethodsWrappers.isListening(this); + } +} diff --git a/packages/web3-net/src/rpc_method_wrappers.ts b/packages/web3-net/src/rpc_method_wrappers.ts new file mode 100644 index 00000000000..f923615998e --- /dev/null +++ b/packages/web3-net/src/rpc_method_wrappers.ts @@ -0,0 +1,43 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { format } from 'web3-utils'; +import { Web3Context } from 'web3-core'; +import { DataFormat, Web3NetAPI } from 'web3-types'; +import { netRpcMethods } from 'web3-rpc-methods'; + +export async function getId( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await netRpcMethods.getId(web3Context.requestManager); + + return format({ format: 'uint' }, response as unknown as number, returnFormat); +} + +export async function getPeerCount( + web3Context: Web3Context, + returnFormat: ReturnFormat, +) { + const response = await netRpcMethods.getPeerCount(web3Context.requestManager); + + // Data returned is number in hex format + return format({ format: 'uint' }, response as unknown as number, returnFormat); +} + +export const isListening = async (web3Context: Web3Context) => + netRpcMethods.isListening(web3Context.requestManager); diff --git a/packages/web3-net/test/.eslintrc.js b/packages/web3-net/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-net/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-net/test/config/jest.config.js b/packages/web3-net/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3-net/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-net/test/config/setup.js b/packages/web3-net/test/config/setup.js new file mode 100644 index 00000000000..d6d6c564527 --- /dev/null +++ b/packages/web3-net/test/config/setup.js @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-net/test/fixtures/accounts.json b/packages/web3-net/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-net/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-net/test/fixtures/rpc_method_wrappers.ts b/packages/web3-net/test/fixtures/rpc_method_wrappers.ts new file mode 100644 index 00000000000..0e76bcdd39b --- /dev/null +++ b/packages/web3-net/test/fixtures/rpc_method_wrappers.ts @@ -0,0 +1,32 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { DataFormat, FMT_BYTES, FMT_NUMBER } from 'web3-types'; + +export const getIdValidData: [DataFormat, any, any][] = [ + [{ number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }, '3', '0x3'], + [{ number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX }, '3', '3'], + [{ number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX }, '3', 3], + [{ number: FMT_NUMBER.BIGINT, bytes: FMT_BYTES.HEX }, '3', BigInt('3')], +]; + +export const getPeerCountValidData: [DataFormat, any, any][] = [ + [{ number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }, '0x2', '0x2'], + [{ number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX }, '0x2', '2'], + [{ number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX }, '0x2', 2], + [{ number: FMT_NUMBER.BIGINT, bytes: FMT_BYTES.HEX }, '0x2', BigInt('2')], +]; diff --git a/packages/web3-net/test/fixtures/system_tests_utils.ts b/packages/web3-net/test/fixtures/system_tests_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-net/test/fixtures/system_tests_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-net/test/fixtures/web3_net_methods.ts b/packages/web3-net/test/fixtures/web3_net_methods.ts new file mode 100644 index 00000000000..85f2c4110b4 --- /dev/null +++ b/packages/web3-net/test/fixtures/web3_net_methods.ts @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { DataFormat, FMT_BYTES, FMT_NUMBER } from 'web3-types'; + +export const getDataFormat: DataFormat[] = [ + { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }, + { number: FMT_NUMBER.STR, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.BIGINT, bytes: FMT_BYTES.UINT8ARRAY }, + { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.UINT8ARRAY }, +]; diff --git a/packages/web3-net/test/integration/jest.config.js b/packages/web3-net/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-net/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-net/test/integration/setup.js b/packages/web3-net/test/integration/setup.js new file mode 100644 index 00000000000..339adf9ec52 --- /dev/null +++ b/packages/web3-net/test/integration/setup.js @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-net/test/integration/web3_net.test.ts b/packages/web3-net/test/integration/web3_net.test.ts new file mode 100644 index 00000000000..60b0438f555 --- /dev/null +++ b/packages/web3-net/test/integration/web3_net.test.ts @@ -0,0 +1,56 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { SupportedProviders, Web3NetAPI } from 'web3-types'; +import Net from '../../src'; + +import { closeOpenConnection, getSystemTestProvider } from '../fixtures/system_tests_utils'; + +describe('Web3 net', () => { + let clientUrl: string | SupportedProviders; + let web3Net: Net; + + beforeAll(async () => { + clientUrl = getSystemTestProvider(); + }); + + afterAll(async () => { + await closeOpenConnection(web3Net); + }); + + it('should be able to create instance', () => { + web3Net = new Net(clientUrl); + + expect(web3Net).toBeInstanceOf(Net); + }); + + it('should be able to get id', async () => { + const networkId = await web3Net.getId(); + // eslint-disable-next-line jest/no-conditional-expect + expect(networkId).toBe(BigInt(1337)); + }); + + it('should be able to listen', async () => { + const isListening = await web3Net.isListening(); + expect(isListening).toBeTruthy(); + }); + + it('should fetch peer count', async () => { + const peerCount = await web3Net.getPeerCount(); + expect(peerCount).toBe(BigInt(0)); + }); +}); diff --git a/packages/web3-net/test/tsconfig.json b/packages/web3-net/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-net/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-net/test/unit/jest.config.js b/packages/web3-net/test/unit/jest.config.js new file mode 100644 index 00000000000..6730195e8b5 --- /dev/null +++ b/packages/web3-net/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-net-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-net/test/unit/rpc_method_wrappers.test.ts b/packages/web3-net/test/unit/rpc_method_wrappers.test.ts new file mode 100644 index 00000000000..47d014e2b3e --- /dev/null +++ b/packages/web3-net/test/unit/rpc_method_wrappers.test.ts @@ -0,0 +1,65 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { netRpcMethods } from 'web3-rpc-methods'; + +import { Net } from '../../src'; +import { getIdValidData, getPeerCountValidData } from '../fixtures/rpc_method_wrappers'; +import { getId, getPeerCount, isListening } from '../../src/rpc_method_wrappers'; + +jest.mock('web3-rpc-methods'); + +describe('rpc_method_wrappers', () => { + let web3Net: Net; + + beforeAll(() => { + web3Net = new Net('http://127.0.0.1:8545'); + }); + + describe('should call RPC method', () => { + describe('getId', () => { + it.each(getIdValidData)( + 'returnType: %s mockRpcResponse: %s output: %s', + async (returnType, mockRpcResponse, output) => { + (netRpcMethods.getId as jest.Mock).mockResolvedValueOnce(mockRpcResponse); + const result = await getId(web3Net, returnType); + + expect(result).toBe(output); + expect(netRpcMethods.getId).toHaveBeenCalledWith(web3Net.requestManager); + }, + ); + }); + + describe('getPeerCount', () => { + it.each(getPeerCountValidData)( + 'returnType: %s mockRpcResponse: %s output: %s', + async (returnType, mockRpcResponse, output) => { + (netRpcMethods.getPeerCount as jest.Mock).mockResolvedValueOnce( + mockRpcResponse, + ); + + expect(await getPeerCount(web3Net, returnType)).toBe(output); + expect(netRpcMethods.getPeerCount).toHaveBeenCalledWith(web3Net.requestManager); + }, + ); + }); + + it('isListening', async () => { + await isListening(web3Net); + expect(netRpcMethods.isListening).toHaveBeenCalledWith(web3Net.requestManager); + }); + }); +}); diff --git a/packages/web3-net/test/unit/web3_net_methods.test.ts b/packages/web3-net/test/unit/web3_net_methods.test.ts new file mode 100644 index 00000000000..ede2c46a7e6 --- /dev/null +++ b/packages/web3-net/test/unit/web3_net_methods.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Net } from '../../src'; +import * as rpcMethodWrappers from '../../src/rpc_method_wrappers'; +import { getDataFormat } from '../fixtures/web3_net_methods'; + +jest.mock('../../src/rpc_method_wrappers'); + +describe('web3_eth_methods', () => { + let web3Net: Net; + + beforeAll(() => { + web3Net = new Net('http://127.0.0.1:8545'); + }); + + describe('should call RPC method', () => { + describe('getId', () => { + it.each(getDataFormat)('returnType: %s', async returnType => { + await web3Net.getId(returnType); + expect(rpcMethodWrappers.getId).toHaveBeenCalledWith(web3Net, returnType); + }); + }); + + describe('getPeerCount', () => { + it.each(getDataFormat)('returnType: %s', async returnType => { + await web3Net.getPeerCount(returnType); + expect(rpcMethodWrappers.getPeerCount).toHaveBeenCalledWith(web3Net, returnType); + }); + }); + + it('isListening', async () => { + await web3Net.isListening(); + expect(rpcMethodWrappers.isListening).toHaveBeenCalledWith(web3Net); + }); + }); +}); diff --git a/packages/web3-net/tsconfig.cjs.json b/packages/web3-net/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-net/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-net/tsconfig.esm.json b/packages/web3-net/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-net/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-net/tsconfig.json b/packages/web3-net/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-net/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-net/tsconfig.types.json b/packages/web3-net/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-net/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-net/tsdoc.json b/packages/web3-net/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-net/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-net/types/index.d.ts b/packages/web3-net/types/index.d.ts deleted file mode 100644 index 0ebdd612c06..00000000000 --- a/packages/web3-net/types/index.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -import { NetworkBase } from 'web3-core'; - -export class Network extends NetworkBase {} diff --git a/packages/web3-net/types/tests/network-test.ts b/packages/web3-net/types/tests/network-test.ts deleted file mode 100644 index 25a09ddbb2c..00000000000 --- a/packages/web3-net/types/tests/network-test.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file network-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import { Network } from 'web3-net'; - -// $ExpectType Network -const network_empty = new Network(); - -// $ExpectType Network -const network = new Network('http://localhost:5000'); - -// $ExpectType provider -network.currentProvider; - -// $ExpectType any -Network.givenProvider; - -// $ExpectType any -network.givenProvider; - -// $ExpectType boolean -network.setProvider('https://localhost:2100'); - -// $ExpectType BatchRequest -new network.BatchRequest(); - -// $ExpectType any -network.extend({property: 'test', methods: [{name: 'method', call: 'method'}]}); - -// $ExpectType Promise -network.getNetworkType((error, returnValue) => { - console.log(returnValue); -}); - -// $ExpectType Promise -network.getId(); -// $ExpectType Promise -network.getId((error: Error, id: number) => { - console.log(id); -}); - -// $ExpectType Promise -network.isListening(); -// $ExpectType Promise -network.isListening((error: Error, listening: boolean) => { - console.log(listening); -}); - -// $ExpectType Promise -network.getPeerCount(); -// $ExpectType Promise -network.getPeerCount((error: Error, peerCount: number) => { - console.log(peerCount); -}); diff --git a/packages/web3-net/types/tsconfig.json b/packages/web3-net/types/tsconfig.json deleted file mode 100644 index 1c940eabc19..00000000000 --- a/packages/web3-net/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-net": ["."] - } - } -} diff --git a/packages/web3-net/types/tslint.json b/packages/web3-net/types/tslint.json deleted file mode 100644 index 6429b0c446e..00000000000 --- a/packages/web3-net/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false - } -} diff --git a/packages/web3-providers-http/.eslintignore b/packages/web3-providers-http/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-providers-http/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers-http/.eslintrc.js b/packages/web3-providers-http/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-providers-http/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers-http/.gitignore b/packages/web3-providers-http/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-providers-http/.npmignore b/packages/web3-providers-http/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-providers-http/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers-http/.prettierignore b/packages/web3-providers-http/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-providers-http/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers-http/.prettierrc.json b/packages/web3-providers-http/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-providers-http/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-providers-http/CHANGELOG.md b/packages/web3-providers-http/CHANGELOG.md new file mode 100644 index 00000000000..6d57af6dcf7 --- /dev/null +++ b/packages/web3-providers-http/CHANGELOG.md @@ -0,0 +1,132 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `main` and `files` entries in `package.json` changed to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Added + +- Added named export for `HttpProvider` (#5771) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [4.0.1-rc.2] + +### Changed + +- Dependencies updated + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Changed + +- Dependencies updated + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Changed + +- Dependencies updated + +## [4.1.0] + +### Changed + +- Bump cross-fetch to version 4 (#6463). + +### Fixed + +- Fix issue lquixada/cross-fetch#78, enabling to run web3.js in service worker (#6463) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-providers-http/README.md b/packages/web3-providers-http/README.md index 0262087f305..12c52dd4c1e 100644 --- a/packages/web3-providers-http/README.md +++ b/packages/web3-providers-http/README.md @@ -1,45 +1,59 @@ -# web3-providers-http +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Http Provider -This is a HTTP provider sub-package for [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -Please read the [documentation][docs] for more. +This is a sub-package of [web3.js][repo]. + +`web3-providers-http` contains the Web3.js provider for the HTTP protocol. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-providers-http) or using [Yarn](https://yarnpkg.com/package/web3-providers-http) + +### Using NPM ```bash npm install web3-providers-http ``` -## Usage +### Using Yarn -```js -const http = require('http'); -const Web3HttpProvider = require('web3-providers-http'); +```bash +yarn add web3-providers-http +``` -const options = { - keepAlive: true, - timeout: 20000, // milliseconds, - headers: [{name: 'Access-Control-Allow-Origin', value: '*'},{...}], - withCredentials: false, - agent: {http: http.Agent(...), baseUrl: ''} -}; +## Getting Started -const provider = new Web3HttpProvider('http://localhost:8545', options); -``` +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new/choose) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) -## Types +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/dm/web3-providers-http.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-providers-http +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-providers-http%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-providers-http -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-providers-http -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-providers-http -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-providers-http -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-providers-http +[downloads-image]: https://img.shields.io/npm/dm/web3-providers-http?label=npm%20downloads diff --git a/packages/web3-providers-http/assets/logo/web3js.ai b/packages/web3-providers-http/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-providers-http/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-providers-http/assets/logo/web3js.jpg b/packages/web3-providers-http/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-providers-http/assets/logo/web3js.jpg differ diff --git a/packages/web3-providers-http/assets/logo/web3js.svg b/packages/web3-providers-http/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-providers-http/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-providers-http/cypress b/packages/web3-providers-http/cypress new file mode 120000 index 00000000000..4a671a7beac --- /dev/null +++ b/packages/web3-providers-http/cypress @@ -0,0 +1 @@ +../../templates/cypress \ No newline at end of file diff --git a/packages/web3-providers-http/cypress.config.js b/packages/web3-providers-http/cypress.config.js new file mode 120000 index 00000000000..8cd9ba29af0 --- /dev/null +++ b/packages/web3-providers-http/cypress.config.js @@ -0,0 +1 @@ +../../templates/cypress.config.js \ No newline at end of file diff --git a/packages/web3-providers-http/package-lock.json b/packages/web3-providers-http/package-lock.json deleted file mode 100644 index 7d065771704..00000000000 --- a/packages/web3-providers-http/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-providers-http", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-providers-http/package.json b/packages/web3-providers-http/package.json index 40af83a7ce0..f8b1eed8821 100644 --- a/packages/web3-providers-http/package.json +++ b/packages/web3-providers-http/package.json @@ -1,24 +1,68 @@ { - "name": "web3-providers-http", - "version": "1.3.0", - "description": "Module to handle web3 RPC connections over HTTP.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-http", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "types": "types/index.d.ts", - "main": "lib/index.js", - "dependencies": { - "web3-core-helpers": "1.3.0", - "xhr2-cookies": "1.1.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-providers-http", + "version": "4.1.0", + "description": "HTTP provider for Web3 4.x.x", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js", + "test:e2e:electron": "npx cypress run --headless --browser electron", + "test:e2e:chrome": "npx cypress run --headless --browser chrome", + "test:e2e:firefox": "npx cypress run --headless --browser firefox" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "jest-fetch-mock": "^3.0.3", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "cross-fetch": "^4.0.0", + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7" + } } diff --git a/packages/web3-providers-http/src/index.js b/packages/web3-providers-http/src/index.js deleted file mode 100644 index 6b2a7e2b0bf..00000000000 --- a/packages/web3-providers-http/src/index.js +++ /dev/null @@ -1,142 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file httpprovider.js - * @authors: - * Marek Kotewicz - * Marian Oancea - * Fabian Vogelsteller - * @date 2015 - */ - -var errors = require('web3-core-helpers').errors; -var XHR2 = require('xhr2-cookies').XMLHttpRequest; // jshint ignore: line -var http = require('http'); -var https = require('https'); - - -/** - * HttpProvider should be used to send rpc calls over http - */ -var HttpProvider = function HttpProvider(host, options) { - options = options || {}; - - this.withCredentials = options.withCredentials || false; - this.timeout = options.timeout || 0; - this.headers = options.headers; - this.agent = options.agent; - this.connected = false; - - // keepAlive is true unless explicitly set to false - const keepAlive = options.keepAlive !== false; - this.host = host || 'http://localhost:8545'; - if (!this.agent) { - if (this.host.substring(0,5) === "https") { - this.httpsAgent = new https.Agent({ keepAlive }); - } else { - this.httpAgent = new http.Agent({ keepAlive }); - } - } -}; - -HttpProvider.prototype._prepareRequest = function(){ - var request; - - // the current runtime is a browser - if (typeof XMLHttpRequest !== 'undefined') { - request = new XMLHttpRequest(); - } else { - request = new XHR2(); - var agents = {httpsAgent: this.httpsAgent, httpAgent: this.httpAgent, baseUrl: this.baseUrl}; - - if (this.agent) { - agents.httpsAgent = this.agent.https; - agents.httpAgent = this.agent.http; - agents.baseUrl = this.agent.baseUrl; - } - - request.nodejsSet(agents); - } - - request.open('POST', this.host, true); - request.setRequestHeader('Content-Type','application/json'); - request.timeout = this.timeout; - request.withCredentials = this.withCredentials; - - if(this.headers) { - this.headers.forEach(function(header) { - request.setRequestHeader(header.name, header.value); - }); - } - - return request; -}; - -/** - * Should be used to make async request - * - * @method send - * @param {Object} payload - * @param {Function} callback triggered on end with (err, result) - */ -HttpProvider.prototype.send = function (payload, callback) { - var _this = this; - var request = this._prepareRequest(); - - request.onreadystatechange = function() { - if (request.readyState === 4 && request.timeout !== 1) { - var result = request.responseText; - var error = null; - - try { - result = JSON.parse(result); - } catch(e) { - error = errors.InvalidResponse(request.responseText); - } - - _this.connected = true; - callback(error, result); - } - }; - - request.ontimeout = function() { - _this.connected = false; - callback(errors.ConnectionTimeout(this.timeout)); - }; - - try { - request.send(JSON.stringify(payload)); - } catch(error) { - this.connected = false; - callback(errors.InvalidConnection(this.host)); - } -}; - -HttpProvider.prototype.disconnect = function () { - //NO OP -}; - -/** - * Returns the desired boolean. - * - * @method supportsSubscriptions - * @returns {boolean} - */ -HttpProvider.prototype.supportsSubscriptions = function () { - return false; -}; - -module.exports = HttpProvider; diff --git a/packages/web3-providers-http/src/index.ts b/packages/web3-providers-http/src/index.ts new file mode 100644 index 00000000000..64dadd9895d --- /dev/null +++ b/packages/web3-providers-http/src/index.ts @@ -0,0 +1,129 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import fetch from 'cross-fetch'; +import { + EthExecutionAPI, + JsonRpcResponseWithResult, + Web3APIMethod, + Web3APIPayload, + Web3APIReturnType, + Web3APISpec, + Web3BaseProvider, + Web3ProviderStatus, +} from 'web3-types'; +import { InvalidClientError, MethodNotImplementedError, ResponseError } from 'web3-errors'; +import { HttpProviderOptions } from './types.js'; + +export { HttpProviderOptions } from './types.js'; + +export default class HttpProvider< + API extends Web3APISpec = EthExecutionAPI, +> extends Web3BaseProvider { + private readonly clientUrl: string; + private readonly httpProviderOptions: HttpProviderOptions | undefined; + + public constructor(clientUrl: string, httpProviderOptions?: HttpProviderOptions) { + super(); + if (!HttpProvider.validateClientUrl(clientUrl)) throw new InvalidClientError(clientUrl); + this.clientUrl = clientUrl; + this.httpProviderOptions = httpProviderOptions; + } + + private static validateClientUrl(clientUrl: string): boolean { + return typeof clientUrl === 'string' ? /^http(s)?:\/\//i.test(clientUrl) : false; + } + + /* eslint-disable class-methods-use-this */ + public getStatus(): Web3ProviderStatus { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public supportsSubscriptions() { + return false; + } + + public async request< + Method extends Web3APIMethod, + ResultType = Web3APIReturnType, + >( + payload: Web3APIPayload, + requestOptions?: RequestInit, + ): Promise> { + const providerOptionsCombined = { + ...this.httpProviderOptions?.providerOptions, + ...requestOptions, + }; + const response = await fetch(this.clientUrl, { + ...providerOptionsCombined, + method: 'POST', + headers: { + ...providerOptionsCombined.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + if (!response.ok) throw new ResponseError(await response.json()); + + return (await response.json()) as JsonRpcResponseWithResult; + } + + /* eslint-disable class-methods-use-this */ + public on() { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public removeListener() { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public once() { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public removeAllListeners() { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public connect() { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public disconnect() { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public reset() { + throw new MethodNotImplementedError(); + } + + /* eslint-disable class-methods-use-this */ + public reconnect() { + throw new MethodNotImplementedError(); + } +} + +export { HttpProvider }; diff --git a/packages/web3-providers-http/src/types.ts b/packages/web3-providers-http/src/types.ts new file mode 100644 index 00000000000..e6d109c573d --- /dev/null +++ b/packages/web3-providers-http/src/types.ts @@ -0,0 +1,20 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export interface HttpProviderOptions { + providerOptions: RequestInit; +} diff --git a/packages/web3-providers-http/test/.eslintrc.js b/packages/web3-providers-http/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-providers-http/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers-http/test/config/jest.config.js b/packages/web3-providers-http/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-providers-http/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-providers-http/test/config/setup.js b/packages/web3-providers-http/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-providers-http/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-providers-http/test/fixtures/accounts.json b/packages/web3-providers-http/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-providers-http/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-providers-http/test/fixtures/system_test_utils.ts b/packages/web3-providers-http/test/fixtures/system_test_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-providers-http/test/fixtures/system_test_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-providers-http/test/fixtures/test_data.ts b/packages/web3-providers-http/test/fixtures/test_data.ts new file mode 100644 index 00000000000..2a8bf5e4939 --- /dev/null +++ b/packages/web3-providers-http/test/fixtures/test_data.ts @@ -0,0 +1,65 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const validClients = [ + 'http://localhost:8545', + 'http://www.localhost', + 'http://localhost', + 'http://foo.com', + 'http://foo.ninja', + 'https://foo.com', + 'http://foo.com:8545', +]; + +export const invalidClients = [ + 'htt://localhost:8545', + 'http//localhost:8545', + 'ws://localhost:8545', + '', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + undefined, + /* eslint-disable @typescript-eslint/no-magic-numbers */ + 42, +]; + +export const httpProviderOptions = { + providerOptions: { + body: undefined, + cache: 'force-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json', + }, + integrity: 'foo', + keepalive: true, + method: 'GET', + mode: 'same-origin', + redirect: 'error', + referrer: 'foo', + referrerPolicy: 'same-origin', + signal: undefined, + window: undefined, + } as RequestInit, +}; + +export const mockGetBalanceResponse = { + id: 1, + jsonrpc: '2.0', + result: '0x0234c8a3397aab58', // 158972490234375000 +}; diff --git a/packages/web3-providers-http/test/integration/jest.config.js b/packages/web3-providers-http/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-providers-http/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-providers-http/test/integration/request.test.ts b/packages/web3-providers-http/test/integration/request.test.ts new file mode 100644 index 00000000000..9865b768f85 --- /dev/null +++ b/packages/web3-providers-http/test/integration/request.test.ts @@ -0,0 +1,48 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EthExecutionAPI, Web3APIPayload, JsonRpcResponseWithResult } from 'web3-types'; +import HttpProvider from '../../src/index'; +import { + getSystemTestProviderUrl, + describeIf, + createTempAccount, + isHttp, +} from '../fixtures/system_test_utils'; + +describeIf(isHttp)('HttpProvider - implemented methods', () => { + let httpProvider: HttpProvider; + let jsonRpcPayload: Web3APIPayload; + + beforeAll(async () => { + httpProvider = new HttpProvider(getSystemTestProviderUrl()); + const tempAcc = await createTempAccount(); + jsonRpcPayload = { + jsonrpc: '2.0', + id: 42, + method: 'eth_getBalance', + params: [tempAcc.address, 'latest'], + } as Web3APIPayload; + }); + + describe('httpProvider.request', () => { + it('should return expected response', async () => { + const response = await httpProvider.request(jsonRpcPayload); + expect(Number((response as JsonRpcResponseWithResult).id)).toBeGreaterThan(0); + }); + }); +}); diff --git a/packages/web3-providers-http/test/integration/setup.js b/packages/web3-providers-http/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-providers-http/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-providers-http/test/shared_fixtures b/packages/web3-providers-http/test/shared_fixtures new file mode 120000 index 00000000000..729a61c9ef4 --- /dev/null +++ b/packages/web3-providers-http/test/shared_fixtures @@ -0,0 +1 @@ +../../../fixtures \ No newline at end of file diff --git a/packages/web3-providers-http/test/tsconfig.json b/packages/web3-providers-http/test/tsconfig.json new file mode 120000 index 00000000000..c73c54e77b4 --- /dev/null +++ b/packages/web3-providers-http/test/tsconfig.json @@ -0,0 +1 @@ +../../../templates/test/tsconfig.json.tmpl \ No newline at end of file diff --git a/packages/web3-providers-http/test/unit/constructor.test.ts b/packages/web3-providers-http/test/unit/constructor.test.ts new file mode 100644 index 00000000000..cfc4349438b --- /dev/null +++ b/packages/web3-providers-http/test/unit/constructor.test.ts @@ -0,0 +1,60 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import HttpProvider from '../../src/index'; +import { httpProviderOptions, validClients, invalidClients } from '../fixtures/test_data'; + +describe('HttpProvider', () => { + it('should construct with expected methods', () => { + const httpProvider = new HttpProvider('http://localhost:8545'); + + expect(httpProvider.request).toBeDefined(); + expect(httpProvider.getStatus).toBeDefined(); + expect(httpProvider.supportsSubscriptions).toBeDefined(); + expect(httpProvider.request).toBeDefined(); + expect(httpProvider.on).toBeDefined(); + expect(httpProvider.removeListener).toBeDefined(); + expect(httpProvider.once).toBeDefined(); + expect(httpProvider.removeAllListeners).toBeDefined(); + expect(httpProvider.connect).toBeDefined(); + expect(httpProvider.disconnect).toBeDefined(); + expect(httpProvider.reset).toBeDefined(); + expect(httpProvider.reconnect).toBeDefined(); + }); + + it('Allows for providerOptions to be passed upon instantiation', () => { + expect(() => new HttpProvider('http://localhost:8545', httpProviderOptions)).not.toThrow(); + }); + + for (const validClient of validClients) { + it(`Instantiation with valid client - ${validClient}`, () => { + expect(() => new HttpProvider(validClient)).not.toThrow(); + }); + } + + for (const invalidClient of invalidClients) { + /* eslint-disable @typescript-eslint/restrict-template-expressions */ + it(`Instantiation with invalid client - ${invalidClient}`, () => { + expect( + () => + // @ts-expect-error - Purposefully passing invalid types to check validation + new HttpProvider(invalidClient), + /* eslint-disable @typescript-eslint/restrict-template-expressions */ + ).toThrow(`Client URL "${invalidClient}" is invalid.`); + }); + } +}); diff --git a/packages/web3-providers-http/test/unit/implemented_methods.test.ts b/packages/web3-providers-http/test/unit/implemented_methods.test.ts new file mode 100644 index 00000000000..892af84607b --- /dev/null +++ b/packages/web3-providers-http/test/unit/implemented_methods.test.ts @@ -0,0 +1,67 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// These need to be imported first in order for cross-fetch to be mocked correctly +import fetchMock from 'jest-fetch-mock'; + +jest.setMock('cross-fetch', fetchMock); + +/* eslint-disable-next-line import/first */ +import { Web3APIPayload, EthExecutionAPI } from 'web3-types'; +/* eslint-disable-next-line import/first */ +import { ResponseError } from 'web3-errors'; +/* eslint-disable-next-line import/first */ +import HttpProvider from '../../src/index'; +/* eslint-disable-next-line import/first */ +import { mockGetBalanceResponse } from '../fixtures/test_data'; + +describe('HttpProvider - implemented methods', () => { + const jsonRpcPayload = { + jsonrpc: '2.0', + id: 42, + method: 'eth_getBalance', + params: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', 'latest'], + } as Web3APIPayload; + + let httpProvider: HttpProvider; + + beforeAll(() => { + httpProvider = new HttpProvider('http://localhost:8545'); + }); + + describe('httpProvider.supportsSubscriptions', () => { + it('should return false', () => { + expect(httpProvider.supportsSubscriptions()).toBe(false); + }); + }); + + describe('httpProvider.request', () => { + it('should return expected response', async () => { + fetchMock.mockResponseOnce(JSON.stringify(mockGetBalanceResponse)); + + expect(await httpProvider.request(jsonRpcPayload)).toStrictEqual( + mockGetBalanceResponse, + ); + }); + + it('should return ResponseError', async () => { + fetchMock.mockResponseOnce(JSON.stringify(mockGetBalanceResponse), { status: 400 }); + + await expect(httpProvider.request(jsonRpcPayload)).rejects.toThrow(ResponseError); + }); + }); +}); diff --git a/packages/web3-providers-http/test/unit/jest.config.js b/packages/web3-providers-http/test/unit/jest.config.js new file mode 100644 index 00000000000..6e44877cd60 --- /dev/null +++ b/packages/web3-providers-http/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-providers-http-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-providers-http/test/unit/not_implemented_methods.test.ts b/packages/web3-providers-http/test/unit/not_implemented_methods.test.ts new file mode 100644 index 00000000000..683e60f6c91 --- /dev/null +++ b/packages/web3-providers-http/test/unit/not_implemented_methods.test.ts @@ -0,0 +1,82 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { MethodNotImplementedError } from 'web3-errors'; + +import HttpProvider from '../../src/index'; + +describe('HttpProvider - not implemented methods', () => { + let httpProvider: HttpProvider; + + beforeAll(() => { + httpProvider = new HttpProvider('http://localhost:8545'); + }); + + it('getStatus', () => { + expect(() => { + httpProvider.getStatus(); + }).toThrow(MethodNotImplementedError); + }); + + it('on', () => { + expect(() => { + httpProvider.on(); + }).toThrow(MethodNotImplementedError); + }); + + it('removeListener', () => { + expect(() => { + httpProvider.removeListener(); + }).toThrow(MethodNotImplementedError); + }); + + it('once', () => { + expect(() => { + httpProvider.once(); + }).toThrow(MethodNotImplementedError); + }); + + it('removeAllListeners', () => { + expect(() => { + httpProvider.removeAllListeners(); + }).toThrow(MethodNotImplementedError); + }); + + it('connect', () => { + expect(() => { + httpProvider.connect(); + }).toThrow(MethodNotImplementedError); + }); + + it('disconnect', () => { + expect(() => { + httpProvider.disconnect(); + }).toThrow(MethodNotImplementedError); + }); + + it('reset', () => { + expect(() => { + httpProvider.reset(); + }).toThrow(MethodNotImplementedError); + }); + + it('reconnect', () => { + expect(() => { + httpProvider.reconnect(); + }).toThrow(MethodNotImplementedError); + }); +}); diff --git a/packages/web3-providers-http/tsconfig.cjs.json b/packages/web3-providers-http/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-providers-http/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-providers-http/tsconfig.esm.json b/packages/web3-providers-http/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-providers-http/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-providers-http/tsconfig.json b/packages/web3-providers-http/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-providers-http/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-providers-http/tsconfig.types.json b/packages/web3-providers-http/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-providers-http/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-providers-http/tsdoc.json b/packages/web3-providers-http/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-providers-http/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-providers-http/types/index.d.ts b/packages/web3-providers-http/types/index.d.ts deleted file mode 100644 index 2f68ab35d75..00000000000 --- a/packages/web3-providers-http/types/index.d.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ -import * as http from 'http'; -import * as https from 'https'; - -import { HttpProviderBase, JsonRpcResponse } from 'web3-core-helpers'; - -export interface HttpHeader { - name: string; - value: string; -} - -export interface HttpProviderAgent { - baseUrl?: string; - http?: http.Agent; - https?: https.Agent; -} - -export interface HttpProviderOptions { - withCredentials?: boolean; - timeout?: number; - headers?: HttpHeader[]; - agent?: HttpProviderAgent; - keepAlive?: boolean; -} - -export class HttpProvider extends HttpProviderBase { - host: string; - - withCredentials: boolean; - timeout: number; - headers?: HttpHeader[]; - agent?: HttpProviderAgent; - connected: boolean; - - constructor(host?: string, options?: HttpProviderOptions); - - send( - payload: object, - callback?: ( - error: Error | null, - result: JsonRpcResponse | undefined - ) => void - ): void; - disconnect(): boolean; - supportsSubscriptions(): boolean; -} diff --git a/packages/web3-providers-http/types/tests/web3-provider-http-tests.ts b/packages/web3-providers-http/types/tests/web3-provider-http-tests.ts deleted file mode 100644 index 961ec583297..00000000000 --- a/packages/web3-providers-http/types/tests/web3-provider-http-tests.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file web3-provider-http-tests.ts - * @author Josh Stevens , Samuel Furter - * @date 2018 - */ - -import * as http from 'http'; -import * as https from 'https'; -import { HttpProvider } from 'web3-providers'; -import { JsonRpcResponse } from 'web3-core-helpers'; - -const httpProvider = new HttpProvider('http://localhost:8545', { - timeout: 20000, - headers: [ - { - name: 'Access-Control-Allow-Origin', - value: '*' - } - ], - withCredentials: false, - agent: { - baseUrl: 'base', - http: new http.Agent({}), - https: new https.Agent({}) - } -}); - -// $ExpectType void -httpProvider.send({}, (error: Error | null) => {}); - -// $ExpectType void -httpProvider.send({}, (error: Error | null, result: JsonRpcResponse | undefined) => {}); - -// $ExpectType boolean -httpProvider.disconnect(); diff --git a/packages/web3-providers-http/types/tsconfig.json b/packages/web3-providers-http/types/tsconfig.json deleted file mode 100644 index 74e0aeeb3a8..00000000000 --- a/packages/web3-providers-http/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-providers": ["."] - } - } -} diff --git a/packages/web3-providers-http/types/tslint.json b/packages/web3-providers-http/types/tslint.json deleted file mode 100644 index 6429b0c446e..00000000000 --- a/packages/web3-providers-http/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false - } -} diff --git a/packages/web3-providers-ipc/.eslintignore b/packages/web3-providers-ipc/.eslintignore new file mode 100644 index 00000000000..e3d7e665285 --- /dev/null +++ b/packages/web3-providers-ipc/.eslintignore @@ -0,0 +1,4 @@ +dist +lib +jest.config.js +.eslintrc.js diff --git a/packages/web3-providers-ipc/.eslintrc.js b/packages/web3-providers-ipc/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-providers-ipc/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers-ipc/.gitignore b/packages/web3-providers-ipc/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-providers-ipc/.npmignore b/packages/web3-providers-ipc/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-providers-ipc/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-providers-ipc/.prettierignore b/packages/web3-providers-ipc/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-providers-ipc/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers-ipc/.prettierrc.json b/packages/web3-providers-ipc/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-providers-ipc/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-providers-ipc/CHANGELOG.md b/packages/web3-providers-ipc/CHANGELOG.md new file mode 100644 index 00000000000..6f75b93995e --- /dev/null +++ b/packages/web3-providers-ipc/CHANGELOG.md @@ -0,0 +1,138 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Added + +- Show error message and return dummy promise if socket is not writable (#5294) + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) +- Refactor to use common SocketProvider class (#5683) +- Legacy Event `close` has been deprecated, superseded by `disconnect` (#5683) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Added + +- Added named export for `IpcProvider` (#5771) +- Pass `_socketOptions` from `IpcProvider` constructor to the underlying `Socket` (#5891) +- The getter of `SocketConnection` in `IpcProvider` (inherited from `SocketProvider`) returns `net.Socket` (#5891) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [4.0.1-rc.2] + +### Changed + +- Replaced Buffer for Uint8Array (#6004) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Changed + +- Dependencies updated + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Changed + +- Dependencies updated + +## [4.0.7] + +### Fixed + +- Fixed bug in chunks processing logic (#6496) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-providers-ipc/README.md b/packages/web3-providers-ipc/README.md index 23b7ddffce4..39913cd9584 100644 --- a/packages/web3-providers-ipc/README.md +++ b/packages/web3-providers-ipc/README.md @@ -1,37 +1,59 @@ -# web3-providers-ipc +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - IPC Provider -This is an IPC provider sub-package for [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -Please read the [documentation][docs] for more. +This is a sub-package of [web3.js][repo]. + +`web3-providers-ipc` contains the Web3.js provider for Inter Process Communication (IPC). ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-providers-ipc) or using [Yarn](https://yarnpkg.com/package/web3-providers-ipc) + +### Using NPM ```bash npm install web3-providers-ipc ``` -## Usage +### Using Yarn -```js -const Web3IpcProvider = require('web3-providers-ipc'); -const net = require(net); - -const ipc = new Web3IpcProvider('/Users/me/Library/Ethereum/geth.ipc', net); +```bash +yarn add web3-providers-ipc ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-providers-ipc.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-probiders-ipc +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-providers-ipc%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-providers-ipc -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-providers-ipc -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-providers-ipc -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-providers-ipc -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-providers-ipc +[downloads-image]: https://img.shields.io/npm/dm/web3-providers-ipc?label=npm%20downloads diff --git a/packages/web3-providers-ipc/assets/logo/web3js.ai b/packages/web3-providers-ipc/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-providers-ipc/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-providers-ipc/assets/logo/web3js.jpg b/packages/web3-providers-ipc/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-providers-ipc/assets/logo/web3js.jpg differ diff --git a/packages/web3-providers-ipc/assets/logo/web3js.svg b/packages/web3-providers-ipc/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-providers-ipc/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-providers-ipc/package-lock.json b/packages/web3-providers-ipc/package-lock.json deleted file mode 100644 index 0b1a7dcc00c..00000000000 --- a/packages/web3-providers-ipc/package-lock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "web3-providers-ipc", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==", - "dev": true - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-providers-ipc/package.json b/packages/web3-providers-ipc/package.json index 332d9c2db6e..e9a6db2d25b 100644 --- a/packages/web3-providers-ipc/package.json +++ b/packages/web3-providers-ipc/package.json @@ -1,26 +1,63 @@ { - "name": "web3-providers-ipc", - "version": "1.3.0", - "description": "Module to handle web3 RPC connections over IPC sockets.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ipc", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "types": "types/index.d.ts", - "main": "lib/index.js", - "dependencies": { - "oboe": "2.1.5", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0" - }, - "devDependencies": { - "@types/node": "^12.12.6", - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-providers-ipc", + "version": "4.0.7", + "description": "IPC provider for Web3 4.x.x", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7" + } } diff --git a/packages/web3-providers-ipc/src/index.js b/packages/web3-providers-ipc/src/index.js deleted file mode 100644 index e0fcdeefb70..00000000000 --- a/packages/web3-providers-ipc/src/index.js +++ /dev/null @@ -1,325 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file index.js - * @authors: - * Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var _ = require('underscore'); -var errors = require('web3-core-helpers').errors; -var oboe = require('oboe'); - - -var IpcProvider = function IpcProvider(path, net) { - var _this = this; - this.responseCallbacks = {}; - this.notificationCallbacks = []; - this.path = path; - this.connected = false; - - this.connection = net.connect({path: this.path}); - - this.addDefaultEvents(); - - // LISTEN FOR CONNECTION RESPONSES - var callback = function(result) { - /*jshint maxcomplexity: 6 */ - - var id = null; - - // get the id which matches the returned id - if(_.isArray(result)) { - result.forEach(function(load){ - if(_this.responseCallbacks[load.id]) - id = load.id; - }); - } else { - id = result.id; - } - - // notification - if(!id && result.method.indexOf('_subscription') !== -1) { - _this.notificationCallbacks.forEach(function(callback){ - if(_.isFunction(callback)) - callback(result); - }); - - // fire the callback - } else if(_this.responseCallbacks[id]) { - _this.responseCallbacks[id](null, result); - delete _this.responseCallbacks[id]; - } - }; - - // use oboe.js for Sockets - if (net.constructor.name === 'Socket') { - oboe(this.connection) - .done(callback); - } else { - this.connection.on('data', function(data){ - _this._parseResponse(data.toString()).forEach(callback); - }); - } -}; - -/** -Will add the error and end event to timeout existing calls - -@method addDefaultEvents -*/ -IpcProvider.prototype.addDefaultEvents = function(){ - var _this = this; - - this.connection.on('connect', function(){ - _this.connected = true; - }); - - this.connection.on('close', function(){ - _this.connected = false; - }); - - this.connection.on('error', function(){ - _this._timeout(); - }); - - this.connection.on('end', function(){ - _this._timeout(); - }); - - this.connection.on('timeout', function(){ - _this._timeout(); - }); -}; - - -/** - Will parse the response and make an array out of it. - - NOTE, this exists for backwards compatibility reasons. - - @method _parseResponse - @param {String} data - */ -IpcProvider.prototype._parseResponse = function(data) { - var _this = this, - returnValues = []; - - // DE-CHUNKER - var dechunkedData = data - .replace(/\}[\n\r]?\{/g,'}|--|{') // }{ - .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{ - .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{ - .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{ - .split('|--|'); - - dechunkedData.forEach(function(data){ - - // prepend the last chunk - if(_this.lastChunk) - data = _this.lastChunk + data; - - var result = null; - - try { - result = JSON.parse(data); - - } catch(e) { - - _this.lastChunk = data; - - // start timeout to cancel all requests - clearTimeout(_this.lastChunkTimeout); - _this.lastChunkTimeout = setTimeout(function(){ - _this._timeout(); - throw errors.InvalidResponse(data); - }, 1000 * 15); - - return; - } - - // cancel timeout and set chunk to null - clearTimeout(_this.lastChunkTimeout); - _this.lastChunk = null; - - if(result) - returnValues.push(result); - }); - - return returnValues; -}; - - -/** -Get the adds a callback to the responseCallbacks object, -which will be called if a response matching the response Id will arrive. - -@method _addResponseCallback -*/ -IpcProvider.prototype._addResponseCallback = function(payload, callback) { - var id = payload.id || payload[0].id; - var method = payload.method || payload[0].method; - - this.responseCallbacks[id] = callback; - this.responseCallbacks[id].method = method; -}; - -/** -Timeout all requests when the end/error event is fired - -@method _timeout -*/ -IpcProvider.prototype._timeout = function() { - for(var key in this.responseCallbacks) { - if(this.responseCallbacks.hasOwnProperty(key)){ - this.responseCallbacks[key](errors.InvalidConnection('on IPC')); - delete this.responseCallbacks[key]; - } - } -}; - -/** - Try to reconnect - - @method reconnect - */ -IpcProvider.prototype.reconnect = function() { - this.connection.connect({path: this.path}); -}; - - -IpcProvider.prototype.send = function (payload, callback) { - // try reconnect, when connection is gone - if(!this.connection.writable) - this.connection.connect({path: this.path}); - - - this.connection.write(JSON.stringify(payload)); - this._addResponseCallback(payload, callback); -}; - -/** -Subscribes to provider events.provider - -@method on -@param {String} type 'notification', 'connect', 'error', 'end' or 'data' -@param {Function} callback the callback to call -*/ -IpcProvider.prototype.on = function (type, callback) { - - if(typeof callback !== 'function') - throw new Error('The second parameter callback must be a function.'); - - switch(type){ - case 'data': - this.notificationCallbacks.push(callback); - break; - - // adds error, end, timeout, connect - default: - this.connection.on(type, callback); - break; - } -}; - -/** - Subscribes to provider events.provider - - @method on - @param {String} type 'connect', 'error', 'end' or 'data' - @param {Function} callback the callback to call - */ -IpcProvider.prototype.once = function (type, callback) { - - if(typeof callback !== 'function') - throw new Error('The second parameter callback must be a function.'); - - this.connection.once(type, callback); -}; - -/** -Removes event listener - -@method removeListener -@param {String} type 'data', 'connect', 'error', 'end' or 'data' -@param {Function} callback the callback to call -*/ -IpcProvider.prototype.removeListener = function (type, callback) { - var _this = this; - - switch(type){ - case 'data': - this.notificationCallbacks.forEach(function(cb, index){ - if(cb === callback) - _this.notificationCallbacks.splice(index, 1); - }); - break; - - default: - this.connection.removeListener(type, callback); - break; - } -}; - -/** -Removes all event listeners - -@method removeAllListeners -@param {String} type 'data', 'connect', 'error', 'end' or 'data' -*/ -IpcProvider.prototype.removeAllListeners = function (type) { - switch(type){ - case 'data': - this.notificationCallbacks = []; - break; - - default: - this.connection.removeAllListeners(type); - break; - } -}; - -/** -Resets the providers, clears all callbacks - -@method reset -*/ -IpcProvider.prototype.reset = function () { - this._timeout(); - this.notificationCallbacks = []; - - this.connection.removeAllListeners('error'); - this.connection.removeAllListeners('end'); - this.connection.removeAllListeners('timeout'); - - this.addDefaultEvents(); -}; - -/** - * Returns the desired boolean. - * - * @method supportsSubscriptions - * @returns {boolean} - */ -IpcProvider.prototype.supportsSubscriptions = function () { - return true; -}; - -module.exports = IpcProvider; - diff --git a/packages/web3-providers-ipc/src/index.ts b/packages/web3-providers-ipc/src/index.ts new file mode 100644 index 00000000000..641d36ea083 --- /dev/null +++ b/packages/web3-providers-ipc/src/index.ts @@ -0,0 +1,161 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Socket, SocketConstructorOpts } from 'net'; +import { ConnectionNotOpenError, InvalidClientError } from 'web3-errors'; +import { ReconnectOptions, SocketProvider, toUtf8 } from 'web3-utils'; +import { + EthExecutionAPI, + Web3APIMethod, + Web3APIPayload, + Web3APISpec, + Web3ProviderStatus, +} from 'web3-types'; +import { existsSync } from 'fs'; + +/** + * The IPC Provider could be used in node.js dapps when running a local node. And it provide the most secure connection. + * + * @example + * ```ts + * const provider = new IpcProvider( + * `path.ipc`, + * { + * writable: false, + * }, + * { + * delay: 500, + * autoReconnect: true, + * maxAttempts: 10, + * }, + * ); + * ``` + * + * The second and the third parameters are both optional. And you can for example, the second parameter could be an empty object or undefined. + * * @example + * ```ts + * const provider = new IpcProvider( + * `path.ipc`, + * {}, + * { + * delay: 500, + * autoReconnect: true, + * maxAttempts: 10, + * }, + * ); + * ``` + */ +export default class IpcProvider extends SocketProvider< + Uint8Array | string, + CloseEvent, + Error, + API +> { + protected readonly _socketOptions?: SocketConstructorOpts; + + protected _socketConnection?: Socket; + + /** + * This is a class used for IPC connections. It extends the abstract class SocketProvider {@link SocketProvider} that extends the EIP-1193 provider {@link EIP1193Provider}. + * @param socketPath - The path to the IPC socket. + * @param socketOptions - The options for the IPC socket connection. + * @param reconnectOptions - The options for the socket reconnection {@link ReconnectOptions} + */ + // this constructor is to specify the type for `socketOptions` for a better intellisense. + // eslint-disable-next-line no-useless-constructor + public constructor( + socketPath: string, + socketOptions?: SocketConstructorOpts, + reconnectOptions?: Partial, + ) { + super(socketPath, socketOptions, reconnectOptions); + } + + public getStatus(): Web3ProviderStatus { + if (this._socketConnection?.connecting) { + return 'connecting'; + } + return this._connectionStatus; + } + + protected _openSocketConnection() { + if (!existsSync(this._socketPath)) { + throw new InvalidClientError(this._socketPath); + } + if (!this._socketConnection || this.getStatus() === 'disconnected') { + this._socketConnection = new Socket(this._socketOptions); + } + + this._socketConnection.connect({ path: this._socketPath }); + } + + protected _closeSocketConnection(code: number, data?: string) { + this._socketConnection?.end(() => { + this._onDisconnect(code, data); + }); + } + + protected _sendToSocket>( + payload: Web3APIPayload, + ): void { + if (this.getStatus() === 'disconnected') { + throw new ConnectionNotOpenError(); + } + this._socketConnection?.write(JSON.stringify(payload)); + } + + protected _parseResponses(e: Uint8Array | string) { + return this.chunkResponseParser.parseResponse(typeof e === 'string' ? e : toUtf8(e)); + } + + protected _addSocketListeners(): void { + this._socketConnection?.on('data', this._onMessageHandler); + this._socketConnection?.on('connect', this._onOpenHandler); + this._socketConnection?.on('close', this._onClose.bind(this)); + this._socketConnection?.on('end', this._onCloseHandler); + this._socketConnection?.on('error', this._onErrorHandler); + } + + protected _removeSocketListeners(): void { + this._socketConnection?.removeAllListeners('connect'); + this._socketConnection?.removeAllListeners('end'); + this._socketConnection?.removeAllListeners('close'); + this._socketConnection?.removeAllListeners('data'); + // note: we intentionally keep the error event listener to be able to emit it in case an error happens when closing the connection + } + + protected _onCloseEvent(event: CloseEvent): void { + if (!event && this._reconnectOptions.autoReconnect) { + this._connectionStatus = 'disconnected'; + this._reconnect(); + return; + } + + this._clearQueues(event); + this._removeSocketListeners(); + this._onDisconnect(event?.code, event?.reason); + // disconnect was successful and can safely remove error listener + this._socketConnection?.removeAllListeners('error'); + } + + protected _onClose(event: CloseEvent): void { + this._clearQueues(event); + this._removeSocketListeners(); + } +} + +export { IpcProvider }; diff --git a/packages/web3-providers-ipc/test/.eslintrc.js b/packages/web3-providers-ipc/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-providers-ipc/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers-ipc/test/config/jest.config.js b/packages/web3-providers-ipc/test/config/jest.config.js new file mode 100644 index 00000000000..068de35aa8e --- /dev/null +++ b/packages/web3-providers-ipc/test/config/jest.config.js @@ -0,0 +1,45 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + + resetMocks: true, +}; diff --git a/packages/web3-providers-ipc/test/config/setup.js b/packages/web3-providers-ipc/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-providers-ipc/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-providers-ipc/test/fixtures/accounts.json b/packages/web3-providers-ipc/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-providers-ipc/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-providers-ipc/test/fixtures/helpers.ts b/packages/web3-providers-ipc/test/fixtures/helpers.ts new file mode 100644 index 00000000000..89aabfe22c9 --- /dev/null +++ b/packages/web3-providers-ipc/test/fixtures/helpers.ts @@ -0,0 +1,57 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { exec } from 'child_process'; +import path from 'path'; +import fs from 'fs'; + +const IPC_DIR_PATH = path.join(__dirname, '..', '..', '..', '..', 'tmp'); +const IPC_PATH = path.join(IPC_DIR_PATH, 'some.ipc'); +const IPC_ORIGIN_PATH = path.join(IPC_DIR_PATH, 'some.ipc'); + +const createSymlink = `ln -s ${path.join(IPC_DIR_PATH, 'ipc.ipc')} ${IPC_ORIGIN_PATH}`; + +const execPromise = async (command: string): Promise => + new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + reject(error); + return; + } + if (stderr) { + reject(stderr); + return; + } + resolve(stdout); + }); + }); + +const removeIfExists = () => { + if (fs.existsSync(IPC_PATH)) { + fs.unlinkSync(IPC_PATH); + } +}; +export const startGethServer = async (): Promise<{ path: string; close: () => void }> => { + removeIfExists(); + await execPromise(createSymlink); + return { + path: IPC_PATH, + close: (): void => { + removeIfExists(); + }, + }; +}; diff --git a/packages/web3-providers-ipc/test/fixtures/system_test_utils.ts b/packages/web3-providers-ipc/test/fixtures/system_test_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-providers-ipc/test/fixtures/system_test_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-providers-ipc/test/fixtures/test_data.ts b/packages/web3-providers-ipc/test/fixtures/test_data.ts new file mode 100644 index 00000000000..c1bddff0444 --- /dev/null +++ b/packages/web3-providers-ipc/test/fixtures/test_data.ts @@ -0,0 +1,45 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const validConnectionStrings = [ + 'ws://localhost:8545', + 'ws://www.localhost', + 'ws://localhost', + 'wss://foo.com', + 'ws://foo.ninja', + 'wss://foo.com', + 'ws://foo.com:8545', +]; + +export const invalidConnectionStrings = [ + 'htt://localhost:8545', + 'http//localhost:8545', + 'ipc://localhost:8545', + '', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + undefined, + 42, +]; + +export const wsProviderOptions = { + followRedirects: true, + handshakeTimeout: 1500, + maxRedirects: 3, + perMessageDeflate: true, +}; diff --git a/packages/web3-providers-ipc/test/integration/eip1193.test.ts b/packages/web3-providers-ipc/test/integration/eip1193.test.ts new file mode 100644 index 00000000000..74ab2b32aa8 --- /dev/null +++ b/packages/web3-providers-ipc/test/integration/eip1193.test.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { hexToNumber } from 'web3-utils'; +import { HexString, ProviderRpcError, ProviderConnectInfo } from 'web3-types'; +import { IpcProvider } from '../../src/index'; + +import { + describeIf, + getSystemTestProviderUrl, + isIpc, + waitForSocketConnect, + waitForSocketDisconnect, +} from '../fixtures/system_test_utils'; + +describeIf(isIpc)('IpcProvider - eip1193', () => { + let socketPath: string; + let socketProvider: IpcProvider; + + beforeAll(() => { + socketPath = getSystemTestProviderUrl(); + }); + beforeEach(() => { + socketProvider = new IpcProvider(socketPath); + }); + afterEach(async () => { + socketProvider.disconnect(1000); + await waitForSocketDisconnect(socketProvider); + }); + + describe('check events', () => { + it('should send connect event', async () => { + const providerConnectInfo = await new Promise(resolve => { + socketProvider.on('connect', (data: ProviderConnectInfo) => { + resolve(data); + }); + }); + expect(hexToNumber(providerConnectInfo.chainId)).toBeGreaterThan(0); + }); + it('should send disconnect event', async () => { + await waitForSocketConnect(socketProvider); + const disconnectPromise = new Promise(resolve => { + socketProvider.on('disconnect', (error: ProviderRpcError) => { + resolve(error); + }); + }); + socketProvider.disconnect(1000, 'Some extra data'); + + const err = await disconnectPromise; + expect(err.code).toBe(1000); + expect(err.data).toBe('Some extra data'); + }); + it('should send chainChanged event', async () => { + await waitForSocketConnect(socketProvider); + // @ts-expect-error set private variable + socketProvider._chainId = '0x1'; + socketProvider.disconnect(1000); + await waitForSocketDisconnect(socketProvider); + const chainChangedPromise = new Promise(resolve => { + socketProvider.on('chainChanged', (result: HexString) => { + resolve(result); + }); + }); + socketProvider.connect(); + await waitForSocketConnect(socketProvider); + const chainId = await chainChangedPromise; + expect(chainId).not.toBe('0x1'); + expect(hexToNumber(chainId)).toBeGreaterThan(0); + }); + it('should send accountsChanged event', async () => { + await waitForSocketConnect(socketProvider); + + // @ts-expect-error set private variable + socketProvider._accounts = ['1', '2']; + socketProvider.disconnect(1000); + await waitForSocketDisconnect(socketProvider); + const chainChangedPromise = new Promise(resolve => { + socketProvider.on('accountsChanged', (accounts: HexString[]) => { + resolve(accounts); + }); + }); + socketProvider.connect(); + await waitForSocketConnect(socketProvider); + const accounts = await chainChangedPromise; + + expect(JSON.stringify(accounts)).not.toBe(JSON.stringify(['1', '2'])); + }); + }); +}); diff --git a/packages/web3-providers-ipc/test/integration/jest.config.js b/packages/web3-providers-ipc/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-providers-ipc/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-providers-ipc/test/integration/reconnection.test.ts b/packages/web3-providers-ipc/test/integration/reconnection.test.ts new file mode 100644 index 00000000000..f7b1bcd05d5 --- /dev/null +++ b/packages/web3-providers-ipc/test/integration/reconnection.test.ts @@ -0,0 +1,112 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { IpcProvider } from '../../src'; + +import { startGethServer } from '../fixtures/helpers'; +import { + describeIf, + getSystemTestProviderUrl, + isIpc, + waitForSocketConnect, + waitForCloseSocketConnection, + waitForEvent, +} from '../fixtures/system_test_utils'; + +describeIf(isIpc)('IpcSocketProvider - reconnection', () => { + describe('subscribe event tests', () => { + let reconnectionOptions: { + delay: number; + autoReconnect: boolean; + maxAttempts: number; + }; + beforeAll(() => { + reconnectionOptions = { + delay: 50, + autoReconnect: true, + maxAttempts: 1000, + }; + }); + it('check defaults', async () => { + const web3Provider = new IpcProvider(getSystemTestProviderUrl()); + // @ts-expect-error-next-line + expect(web3Provider._reconnectOptions).toEqual({ + autoReconnect: true, + delay: 5000, + maxAttempts: 5, + }); + await waitForSocketConnect(web3Provider); + web3Provider.disconnect(1000, 'test'); + await waitForCloseSocketConnection(web3Provider); + }); + it('set custom reconnectOptions', async () => { + const web3Provider = new IpcProvider( + getSystemTestProviderUrl(), + {}, + reconnectionOptions, + ); + // @ts-expect-error-next-line + expect(web3Provider._reconnectOptions).toEqual(reconnectionOptions); + await waitForSocketConnect(web3Provider); + web3Provider.disconnect(1000, 'test'); + await waitForCloseSocketConnection(web3Provider); + }); + it('should emit connect and disconnected events', async () => { + const web3Provider = new IpcProvider(getSystemTestProviderUrl()); + expect(!!(await waitForEvent(web3Provider, 'connect'))).toBe(true); + const disconnectPromise = waitForEvent(web3Provider, 'disconnect'); + web3Provider.disconnect(); + expect(!!(await disconnectPromise)).toBe(true); + // @ts-expect-error read protected property + expect(web3Provider.isReconnecting).toBe(false); + }); + it('should connect, disconnect and reconnect', async () => { + const web3Provider = new IpcProvider( + getSystemTestProviderUrl(), + {}, + reconnectionOptions, + ); + expect(!!(await waitForEvent(web3Provider, 'connect'))).toBe(true); + const connectEvent = waitForEvent(web3Provider, 'connect'); + // @ts-expect-error call protected function + web3Provider._socketConnection?.end(); + expect(!!(await connectEvent)).toBe(true); + web3Provider.disconnect(); + await waitForEvent(web3Provider, 'disconnect'); + }); + it('should connect, disconnect, try reconnect and reach max attempts', async () => { + const server = await startGethServer(); + const web3Provider = new IpcProvider( + server.path, + {}, + { + ...reconnectionOptions, + delay: 1, + maxAttempts: 3, + }, + ); + expect(!!(await waitForEvent(web3Provider, 'connect'))).toBe(true); + server.close(); + // @ts-expect-error call protected function + web3Provider._socketConnection?.end(); + const errorEvent = waitForEvent(web3Provider, 'error'); + + const error = (await errorEvent) as Error; + expect(error.message).toBe(`Maximum number of reconnect attempts reached! (${3})`); + }); + }); +}); diff --git a/packages/web3-providers-ipc/test/integration/setup.js b/packages/web3-providers-ipc/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-providers-ipc/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-providers-ipc/test/tsconfig.json b/packages/web3-providers-ipc/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-providers-ipc/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-providers-ipc/test/unit/check_implementation.test.ts b/packages/web3-providers-ipc/test/unit/check_implementation.test.ts new file mode 100644 index 00000000000..cc13c1b0281 --- /dev/null +++ b/packages/web3-providers-ipc/test/unit/check_implementation.test.ts @@ -0,0 +1,176 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import * as fs from 'fs'; +import net from 'net'; +import { IpcProvider } from '../../src/index'; + +jest.mock('net'); +jest.mock('fs'); + +describe('IPCProvider', () => { + let socketPath: string; + + beforeEach(() => { + socketPath = '/test/test.ipc'; + jest.spyOn(fs, 'existsSync').mockReturnValue(true); + jest.spyOn(net.Socket.prototype, 'connect').mockImplementation(jest.fn()); + jest.spyOn(net.Socket.prototype, 'write').mockImplementation(jest.fn()); + }); + + describe('methods', () => { + it.each(['_openSocketConnection', '_addSocketListeners'])( + 'should call method %s', + method => { + const _method = jest.fn(); + // @ts-expect-error mock method + jest.spyOn(IpcProvider.prototype, method).mockImplementation(_method); + const ipc = new IpcProvider(socketPath); + expect(ipc).toBeDefined(); + expect(_method).toHaveBeenCalled(); + }, + ); + it('should construct with expected methods', () => { + const _closeSocketConnection = jest.fn(); + const _removeSocketListeners = jest.fn(); + const _onDisconnect = jest.fn(); + + const code = 1002; + const data = 'data'; + // @ts-expect-error mock method + jest.spyOn(IpcProvider.prototype, '_closeSocketConnection').mockImplementation( + _closeSocketConnection, + ); + // @ts-expect-error mock method + jest.spyOn(IpcProvider.prototype, '_removeSocketListeners').mockImplementation( + _removeSocketListeners, + ); + // @ts-expect-error mock method + jest.spyOn(IpcProvider.prototype, '_onDisconnect').mockImplementation(_onDisconnect); + const ipc = new IpcProvider(socketPath); + // @ts-expect-error mock method + ipc._parseResponses = jest.fn(); + ipc.disconnect(code, data); + expect(_removeSocketListeners).toHaveBeenCalled(); + expect(_onDisconnect).toHaveBeenCalledWith(code, data); + expect(_closeSocketConnection).toHaveBeenCalledWith(code, data); + }); + it('getStatus', () => { + const ipc = new IpcProvider(socketPath); + // @ts-expect-error mock field + ipc._socketConnection.connecting = true; + expect(ipc.getStatus()).toBe('connecting'); + }); + it('socketConnection.end', () => { + const ipc = new IpcProvider(socketPath); + const end = jest.fn((cb: () => void) => { + cb(); + }); + const _onDisconnect = jest.fn(); + // @ts-expect-error mock method + ipc._socketConnection.end = end; + // @ts-expect-error mock method + ipc._onDisconnect = _onDisconnect; + const code = 1002; + const data = 'data'; + // @ts-expect-error mock field + ipc._socketConnection.connecting = false; + // @ts-expect-error mock field + ipc._connectionStatus = 'connected'; + expect(ipc.getStatus()).toBe('connected'); + ipc.disconnect(code, data); + + expect(_onDisconnect).toHaveBeenCalledWith(code, data); + expect(end).toHaveBeenCalled(); + }); + + it('_onCloseHandler autoReconnect=false', () => { + const ipc = new IpcProvider(socketPath, {}, { autoReconnect: false }); + const _clearQueues = jest.fn(); + const _removeSocketListeners = jest.fn(); + const _onDisconnect = jest.fn(); + + // @ts-expect-error mock method + ipc._clearQueues = _clearQueues; + // @ts-expect-error mock method + ipc._removeSocketListeners = _removeSocketListeners; + // @ts-expect-error mock method + ipc._onDisconnect = _onDisconnect; + // @ts-expect-error mock method + ipc._socketConnection.connecting = false; + // @ts-expect-error emit method + ipc._connectionStatus = 'connected'; + + // @ts-expect-error emit method + ipc._onCloseHandler(); + expect(_clearQueues).toHaveBeenCalled(); + expect(_removeSocketListeners).toHaveBeenCalled(); + expect(_onDisconnect).toHaveBeenCalledWith(undefined, undefined); + }); + it('_onCloseHandler autoReconnect=true', () => { + const ipc = new IpcProvider(socketPath); + const _reconnect = jest.fn(); + // @ts-expect-error mock method + ipc._reconnect = _reconnect; + + // @ts-expect-error emit event + ipc._onCloseHandler(); + expect(_reconnect).toHaveBeenCalled(); + }); + it('listeners', () => { + const ipc = new IpcProvider(socketPath, undefined, { autoReconnect: false }); + // @ts-expect-error mock method + ipc.chunkResponseParser.parseResponse = jest.fn(() => { + return []; + }); + // @ts-expect-error mock method + ipc._socketConnection.listeners = () => { + throw new Error('error'); + }; + const on = jest.fn((event: string, cb: (data?: string) => void) => { + if (event === 'error') { + cb('error'); + } else if (event === 'data') { + cb('data'); + } else { + cb(); + } + }); + // @ts-expect-error mock method + ipc._socketConnection.on = on; + // @ts-expect-error mock method + ipc.isReconnecting = true; + // @ts-expect-error mock method + ipc._reconnect = jest.fn(); + // @ts-expect-error mock method + ipc._clearQueues = jest.fn(); + // @ts-expect-error mock method + ipc._addSocketListeners(); + // @ts-expect-error mock method + expect(on).toHaveBeenCalledWith('error', ipc._onErrorHandler); + const removeAllListeners = jest.fn(); + // @ts-expect-error mock method + ipc._socketConnection.removeAllListeners = removeAllListeners; + // @ts-expect-error mock method + ipc.isReconnecting = false; + ipc.disconnect(); + expect(removeAllListeners).toHaveBeenCalledWith('end'); + expect(removeAllListeners).toHaveBeenCalledWith('close'); + expect(removeAllListeners).toHaveBeenCalledWith('data'); + expect(removeAllListeners).toHaveBeenCalledWith('connect'); + }); + }); +}); diff --git a/packages/web3-providers-ipc/test/unit/ipc_provider.test.ts b/packages/web3-providers-ipc/test/unit/ipc_provider.test.ts new file mode 100644 index 00000000000..b607e8b92a0 --- /dev/null +++ b/packages/web3-providers-ipc/test/unit/ipc_provider.test.ts @@ -0,0 +1,107 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Socket } from 'net'; +import * as fs from 'fs'; +import { ConnectionError, InvalidClientError } from 'web3-errors'; +import { IpcProvider } from '../../src/index'; + +jest.mock('net'); +jest.mock('fs'); + +describe('IpcProvider', () => { + let socketPath: string; + + beforeEach(() => { + socketPath = '/test/test.ipc'; + jest.spyOn(fs, 'existsSync').mockReturnValue(true); + }); + + describe('constructor', () => { + it('should construct the instance of the provider', () => { + const provider = new IpcProvider(socketPath); + expect(provider).toBeInstanceOf(IpcProvider); + expect(provider.SocketConnection).toBeInstanceOf(Socket); + }); + + it('should try to connect', () => { + const connectSpy = jest.spyOn(IpcProvider.prototype, 'connect'); + // eslint-disable-next-line no-new + new IpcProvider(socketPath); + + expect(connectSpy).toHaveBeenCalled(); + }); + }); + + describe('connect', () => { + it('should verify socket path', () => { + // eslint-disable-next-line no-new + new IpcProvider(socketPath); + + expect(fs.existsSync).toHaveBeenCalledWith(socketPath); + expect(fs.existsSync).toHaveBeenCalledTimes(1); + }); + + it('should throw error if socket path does not exists', () => { + jest.spyOn(fs, 'existsSync').mockReturnValue(false); + expect(() => new IpcProvider(socketPath)).toThrow( + new ConnectionError( + `Error while connecting to ${socketPath}. Reason: ${ + new InvalidClientError(socketPath).message + }`, + ), + ); + }); + + it('should add listeners to socket', () => { + const provider = new IpcProvider(socketPath); + // @ts-expect-error-next-line + jest.spyOn(provider._socketConnection, 'on'); + + // @ts-expect-error-next-line + expect(provider._socketConnection.on).toHaveBeenCalledWith( + 'connect', + expect.any(Function), + ); + // @ts-expect-error-next-line + expect(provider._socketConnection.on).toHaveBeenCalledWith('end', expect.any(Function)); + // @ts-expect-error-next-line + expect(provider._socketConnection.on).toHaveBeenCalledWith( + 'close', + expect.any(Function), + ); + // @ts-expect-error-next-line + expect(provider._socketConnection.on).toHaveBeenCalledWith( + 'data', + expect.any(Function), + ); + }); + + it('should connect to socket path', () => { + const provider = new IpcProvider(socketPath); + // @ts-expect-error-next-line + jest.spyOn(provider._socketConnection, 'connect'); + + // @ts-expect-error-next-line + expect(provider._socketConnection.connect).toHaveBeenCalledTimes(1); + // @ts-expect-error-next-line + expect(provider._socketConnection.connect).toHaveBeenCalledWith({ + path: socketPath, + }); + }); + }); +}); diff --git a/packages/web3-providers-ipc/test/unit/jest.config.js b/packages/web3-providers-ipc/test/unit/jest.config.js new file mode 100644 index 00000000000..bd20de1a9bf --- /dev/null +++ b/packages/web3-providers-ipc/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-providers-ipc-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-providers-ipc/tsconfig.cjs.json b/packages/web3-providers-ipc/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-providers-ipc/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-providers-ipc/tsconfig.esm.json b/packages/web3-providers-ipc/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-providers-ipc/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-providers-ipc/tsconfig.json b/packages/web3-providers-ipc/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-providers-ipc/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-providers-ipc/tsconfig.types.json b/packages/web3-providers-ipc/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-providers-ipc/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-providers-ipc/tsdoc.json b/packages/web3-providers-ipc/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-providers-ipc/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-providers-ipc/types/index.d.ts b/packages/web3-providers-ipc/types/index.d.ts deleted file mode 100644 index b18f4326f51..00000000000 --- a/packages/web3-providers-ipc/types/index.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -import { IpcProviderBase } from 'web3-core-helpers'; - -export class IpcProvider extends IpcProviderBase { } diff --git a/packages/web3-providers-ipc/types/tests/web3-provider-ipc-tests.ts b/packages/web3-providers-ipc/types/tests/web3-provider-ipc-tests.ts deleted file mode 100644 index 19b0fcb4ab5..00000000000 --- a/packages/web3-providers-ipc/types/tests/web3-provider-ipc-tests.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file web3-provider-ipc-tests.ts - * @author Josh Stevens - * @date 2018 - */ - -import * as net from 'net'; -import { IpcProvider } from 'web3-providers'; -import { JsonRpcResponse } from 'web3-core-helpers'; - -const ipcProvider = new IpcProvider( - '/Users/myuser/Library/Ethereum/geth.ipc', - new net.Server() -); - -// $ExpectType any -ipcProvider.responseCallbacks; - -// $ExpectType any -ipcProvider.notificationCallbacks; - -// $ExpectType any -ipcProvider.connection; - -// $ExpectType boolean -ipcProvider.connected; - -// $ExpectType void -ipcProvider.addDefaultEvents(); - -// $ExpectType boolean -ipcProvider.supportsSubscriptions(); - -// $ExpectType void -ipcProvider.send({} as any, (error: Error | null) => {}); - -// $ExpectType void -ipcProvider.send({} as any, (error: Error | null, result: JsonRpcResponse | undefined) => {}); - -// $ExpectType void -ipcProvider.on('type', () => {}); - -// $ExpectType void -ipcProvider.once('type', () => {}); - -// $ExpectType void -ipcProvider.removeListener('type', () => {}); - -// $ExpectType void -ipcProvider.removeAllListeners('type'); - -// $ExpectType void -ipcProvider.reset(); - -// $ExpectType void -ipcProvider.reconnect(); diff --git a/packages/web3-providers-ipc/types/tsconfig.json b/packages/web3-providers-ipc/types/tsconfig.json deleted file mode 100644 index 74e0aeeb3a8..00000000000 --- a/packages/web3-providers-ipc/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-providers": ["."] - } - } -} diff --git a/packages/web3-providers-ipc/types/tslint.json b/packages/web3-providers-ipc/types/tslint.json deleted file mode 100644 index 6429b0c446e..00000000000 --- a/packages/web3-providers-ipc/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false - } -} diff --git a/packages/web3-providers-ws/.eslintignore b/packages/web3-providers-ws/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-providers-ws/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers-ws/.eslintrc.js b/packages/web3-providers-ws/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-providers-ws/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers-ws/.gitignore b/packages/web3-providers-ws/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-providers-ws/.npmignore b/packages/web3-providers-ws/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-providers-ws/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers-ws/.prettierignore b/packages/web3-providers-ws/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-providers-ws/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-providers-ws/.prettierrc.json b/packages/web3-providers-ws/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-providers-ws/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-providers-ws/CHANGELOG.md b/packages/web3-providers-ws/CHANGELOG.md new file mode 100644 index 00000000000..8648c09c9d3 --- /dev/null +++ b/packages/web3-providers-ws/CHANGELOG.md @@ -0,0 +1,132 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `main` and `files` entries in `package.json` changed to `lib/` directory from `dist/` (#5739) +- Refactor to use common SocketProvider class (#5683) +- Legacy Event `close` has been deprecated, superseded by `disconnect` (#5683) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Added + +- Added named export for `WebSocketProvider` (#5771) +- The getter of `SocketConnection` in `WebSocketProvider` (inherited from `SocketProvider`) returns isomorphic `WebSocket` (#5891) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [4.0.1-rc.2] + +### Changed + +- Dependencies updated + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Fixed + +- Fixed #6162 @types/ws issue (#6205) + +## [4.0.3] + +### Changed + +- Dependencies updated + +## [4.0.4] + +### Fixed + +- Ensure a fixed version for "@types/ws": "8.5.3" (#6309) + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Changed + +- Dependencies updated + + +## [4.0.7] + +### Fixed + +- Fixed bug in chunks processing logic (#6496) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-providers-ws/README.md b/packages/web3-providers-ws/README.md index cac2c7fd470..942839b6b23 100644 --- a/packages/web3-providers-ws/README.md +++ b/packages/web3-providers-ws/README.md @@ -1,65 +1,59 @@ -# web3-providers-ws +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js - Websocket Provider -This is a websocket provider sub-package for [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -Please read the [documentation][docs] for more. +This is a sub-package of [web3.js][repo]. + +`web3-providers-ws` contains the Web3.js provider for the Websocket protocol. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-providers-ws) or using [Yarn](https://yarnpkg.com/package/web3-providers-ws) + +### Using NPM ```bash npm install web3-providers-ws ``` -## Usage - -```js -const Web3WsProvider = require('web3-providers-ws'); - -const options = { - timeout: 30000, // ms +### Using Yarn - // Useful for credentialed urls, e.g: ws://username:password@localhost:8546 - headers: { - authorization: 'Basic username:password' - }, - - clientConfig: { - // Useful if requests are large - maxReceivedFrameSize: 100000000, // bytes - default: 1MiB - maxReceivedMessageSize: 100000000, // bytes - default: 8MiB +```bash +yarn add web3-providers-ws +``` - // Useful to keep a connection alive - keepalive: true, - keepaliveInterval: 60000 // ms - }, +## Getting Started - // Enable auto reconnection - reconnect: { - auto: true, - delay: 5000, // ms - maxAttempts: 5, - onTimeout: false - } -}; +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) -const ws = new Web3WsProvider('ws://localhost:8546', options); -``` +## Prerequisites -Additional client config options can be found [here](https://github.com/theturtle32/WebSocket-Node/blob/v1.0.31/docs/WebSocketClient.md#client-config-options). +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) -## Types +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-providers-ws.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-providers-ws +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-providers-ws%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-providers-ws -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-providers-ws -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-providers-ws -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-providers-ws -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-providers-ws +[downloads-image]: https://img.shields.io/npm/dm/web3-providers-ws?label=npm%20downloads diff --git a/packages/web3-providers-ws/assets/logo/web3js.ai b/packages/web3-providers-ws/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-providers-ws/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-providers-ws/assets/logo/web3js.jpg b/packages/web3-providers-ws/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-providers-ws/assets/logo/web3js.jpg differ diff --git a/packages/web3-providers-ws/assets/logo/web3js.svg b/packages/web3-providers-ws/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-providers-ws/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-providers-ws/package-lock.json b/packages/web3-providers-ws/package-lock.json deleted file mode 100644 index bda3aae6feb..00000000000 --- a/packages/web3-providers-ws/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-providers-ws", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-providers-ws/package.json b/packages/web3-providers-ws/package.json index 59e3038e006..2df7997c08c 100644 --- a/packages/web3-providers-ws/package.json +++ b/packages/web3-providers-ws/package.json @@ -1,26 +1,71 @@ { - "name": "web3-providers-ws", - "version": "1.3.0", - "description": "Module to handle web3 RPC connections over WebSockets.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-providers-ws", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "types": "types/index.d.ts", - "main": "lib/index.js", - "dependencies": { - "eventemitter3": "4.0.4", - "underscore": "1.9.1", - "web3-core-helpers": "1.3.0", - "websocket": "^1.0.32" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-providers-ws", + "version": "4.0.7", + "description": "Websocket provider for Web3 4.x.x", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js" + }, + "devDependencies": { + "@types/express": "^4.17.13", + "@types/jest": "^28.1.6", + "@types/morgan": "^1.9.3", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "express": "^4.18.1", + "ganache": "^7.7.6", + "http-proxy-middleware": "^2.0.6", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "@types/ws": "8.5.3", + "isomorphic-ws": "^5.0.0", + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7", + "ws": "^8.8.1" + } } diff --git a/packages/web3-providers-ws/src/helpers.js b/packages/web3-providers-ws/src/helpers.js deleted file mode 100644 index 25347e3f2ff..00000000000 --- a/packages/web3-providers-ws/src/helpers.js +++ /dev/null @@ -1,31 +0,0 @@ -var isNode = Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'; -var isRN = typeof navigator !== 'undefined' && navigator.product === 'ReactNative'; - -var _btoa = null; -var helpers = null; -if (isNode || isRN) { - _btoa = function(str) { - return Buffer.from(str).toString('base64'); - }; - var url = require('url'); - if (url.URL) { - // Use the new Node 6+ API for parsing URLs that supports username/password - var newURL = url.URL; - helpers = function(url) { - return new newURL(url); - }; - } else { - // Web3 supports Node.js 5, so fall back to the legacy URL API if necessary - helpers = require('url').parse; - } -} else { - _btoa = btoa.bind(window); - helpers = function(url) { - return new URL(url); - }; -} - -module.exports = { - parseURL: helpers, - btoa: _btoa -}; diff --git a/packages/web3-providers-ws/src/index.js b/packages/web3-providers-ws/src/index.js deleted file mode 100644 index 0596c033f51..00000000000 --- a/packages/web3-providers-ws/src/index.js +++ /dev/null @@ -1,425 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file WebsocketProvider.js - * @authors: Samuel Furter , Fabian Vogelsteller - * @date 2019 - */ - -'use strict'; - -var EventEmitter = require('eventemitter3'); -var helpers = require('./helpers.js'); -var errors = require('web3-core-helpers').errors; -var Ws = require('websocket').w3cwebsocket; - -/** - * @param {string} url - * @param {Object} options - * - * @constructor - */ -var WebsocketProvider = function WebsocketProvider(url, options) { - EventEmitter.call(this); - - options = options || {}; - this.url = url; - this._customTimeout = options.timeout || 1000 * 15; - this.headers = options.headers || {}; - this.protocol = options.protocol || undefined; - this.reconnectOptions = Object.assign({ - auto: false, - delay: 5000, - maxAttempts: false, - onTimeout: false - }, - options.reconnect - ); - this.clientConfig = options.clientConfig || undefined; // Allow a custom client configuration - this.requestOptions = options.requestOptions || undefined; // Allow a custom request options (https://github.com/theturtle32/WebSocket-Node/blob/master/docs/WebSocketClient.md#connectrequesturl-requestedprotocols-origin-headers-requestoptions) - - this.DATA = 'data'; - this.CLOSE = 'close'; - this.ERROR = 'error'; - this.CONNECT = 'connect'; - this.RECONNECT = 'reconnect'; - - this.connection = null; - this.requestQueue = new Map(); - this.responseQueue = new Map(); - this.reconnectAttempts = 0; - this.reconnecting = false; - - // The w3cwebsocket implementation does not support Basic Auth - // username/password in the URL. So generate the basic auth header, and - // pass through with any additional headers supplied in constructor - var parsedURL = helpers.parseURL(url); - if (parsedURL.username && parsedURL.password) { - this.headers.authorization = 'Basic ' + helpers.btoa(parsedURL.username + ':' + parsedURL.password); - } - - // When all node core implementations that do not have the - // WHATWG compatible URL parser go out of service this line can be removed. - if (parsedURL.auth) { - this.headers.authorization = 'Basic ' + helpers.btoa(parsedURL.auth); - } - - // make property `connected` which will return the current connection status - Object.defineProperty(this, 'connected', { - get: function () { - return this.connection && this.connection.readyState === this.connection.OPEN; - }, - enumerable: true - }); - - this.connect(); -}; - -// Inherit from EventEmitter -WebsocketProvider.prototype = Object.create(EventEmitter.prototype); -WebsocketProvider.prototype.constructor = WebsocketProvider; - -/** - * Connects to the configured node - * - * @method connect - * - * @returns {void} - */ -WebsocketProvider.prototype.connect = function () { - this.connection = new Ws(this.url, this.protocol, undefined, this.headers, this.requestOptions, this.clientConfig); - this._addSocketListeners(); -}; - -/** - * Listener for the `data` event of the underlying WebSocket object - * - * @method _onMessage - * - * @returns {void} - */ -WebsocketProvider.prototype._onMessage = function (e) { - var _this = this; - - this._parseResponse((typeof e.data === 'string') ? e.data : '').forEach(function (result) { - if (result.method && result.method.indexOf('_subscription') !== -1) { - _this.emit(_this.DATA, result); - - return; - } - - var id = result.id; - - // get the id which matches the returned id - if (Array.isArray(result)) { - id = result[0].id; - } - - if (_this.responseQueue.has(id)) { - if(_this.responseQueue.get(id).callback !== undefined) { - _this.responseQueue.get(id).callback(false, result); - } - _this.responseQueue.delete(id); - } - }); -}; - -/** - * Listener for the `open` event of the underlying WebSocket object - * - * @method _onConnect - * - * @returns {void} - */ -WebsocketProvider.prototype._onConnect = function () { - this.emit(this.CONNECT); - this.reconnectAttempts = 0; - this.reconnecting = false; - - if (this.requestQueue.size > 0) { - var _this = this; - - this.requestQueue.forEach(function (request, key) { - _this.send(request.payload, request.callback); - _this.requestQueue.delete(key); - }); - } -}; - -/** - * Listener for the `close` event of the underlying WebSocket object - * - * @method _onClose - * - * @returns {void} - */ -WebsocketProvider.prototype._onClose = function (event) { - var _this = this; - - if (this.reconnectOptions.auto && (![1000, 1001].includes(event.code) || event.wasClean === false)) { - this.reconnect(); - - return; - } - - this.emit(this.CLOSE, event); - - if (this.requestQueue.size > 0) { - this.requestQueue.forEach(function (request, key) { - request.callback(errors.ConnectionNotOpenError(event)); - _this.requestQueue.delete(key); - }); - } - - if (this.responseQueue.size > 0) { - this.responseQueue.forEach(function (request, key) { - request.callback(errors.InvalidConnection('on WS', event)); - _this.responseQueue.delete(key); - }); - } - - this._removeSocketListeners(); - this.removeAllListeners(); -}; - -/** - * Will add the required socket listeners - * - * @method _addSocketListeners - * - * @returns {void} - */ -WebsocketProvider.prototype._addSocketListeners = function () { - this.connection.addEventListener('message', this._onMessage.bind(this)); - this.connection.addEventListener('open', this._onConnect.bind(this)); - this.connection.addEventListener('close', this._onClose.bind(this)); -}; - -/** - * Will remove all socket listeners - * - * @method _removeSocketListeners - * - * @returns {void} - */ -WebsocketProvider.prototype._removeSocketListeners = function () { - this.connection.removeEventListener('message', this._onMessage); - this.connection.removeEventListener('open', this._onConnect); - this.connection.removeEventListener('close', this._onClose); -}; - -/** - * Will parse the response and make an array out of it. - * - * @method _parseResponse - * - * @param {String} data - * - * @returns {Array} - */ -WebsocketProvider.prototype._parseResponse = function (data) { - var _this = this, - returnValues = []; - - // DE-CHUNKER - var dechunkedData = data - .replace(/\}[\n\r]?\{/g, '}|--|{') // }{ - .replace(/\}\][\n\r]?\[\{/g, '}]|--|[{') // }][{ - .replace(/\}[\n\r]?\[\{/g, '}|--|[{') // }[{ - .replace(/\}\][\n\r]?\{/g, '}]|--|{') // }]{ - .split('|--|'); - - dechunkedData.forEach(function (data) { - - // prepend the last chunk - if (_this.lastChunk) - data = _this.lastChunk + data; - - var result = null; - - try { - result = JSON.parse(data); - } catch (e) { - - _this.lastChunk = data; - - // start timeout to cancel all requests - clearTimeout(_this.lastChunkTimeout); - _this.lastChunkTimeout = setTimeout(function () { - if (_this.reconnectOptions.auto && _this.reconnectOptions.onTimeout) { - _this.reconnect(); - - return; - } - - - _this.emit(_this.ERROR, errors.ConnectionTimeout(_this._customTimeout)); - - if (_this.requestQueue.size > 0) { - _this.requestQueue.forEach(function (request, key) { - request.callback(errors.ConnectionTimeout(_this._customTimeout)); - _this.requestQueue.delete(key); - }); - } - }, _this._customTimeout); - - return; - } - - // cancel timeout and set chunk to null - clearTimeout(_this.lastChunkTimeout); - _this.lastChunk = null; - - if (result) - returnValues.push(result); - }); - - return returnValues; -}; - -/** - * Does check if the provider is connecting and will add it to the queue or will send it directly - * - * @method send - * - * @param {Object} payload - * @param {Function} callback - * - * @returns {void} - */ -WebsocketProvider.prototype.send = function (payload, callback) { - var _this = this; - var id = payload.id; - var request = {payload: payload, callback: callback}; - - if (Array.isArray(payload)) { - id = payload[0].id; - } - - if (this.connection.readyState === this.connection.CONNECTING || this.reconnecting) { - this.requestQueue.set(id, request); - - return; - } - - if (this.connection.readyState !== this.connection.OPEN) { - this.requestQueue.delete(id); - - this.emit(this.ERROR, errors.ConnectionNotOpenError()); - request.callback(errors.ConnectionNotOpenError()); - - return; - } - - this.responseQueue.set(id, request); - this.requestQueue.delete(id); - - try { - this.connection.send(JSON.stringify(request.payload)); - } catch (error) { - request.callback(error); - _this.responseQueue.delete(id); - } -}; - -/** - * Resets the providers, clears all callbacks - * - * @method reset - * - * @returns {void} - */ -WebsocketProvider.prototype.reset = function () { - this.responseQueue.clear(); - this.requestQueue.clear(); - - this.removeAllListeners(); - - this._removeSocketListeners(); - this._addSocketListeners(); -}; - -/** - * Closes the current connection with the given code and reason arguments - * - * @method disconnect - * - * @param {number} code - * @param {string} reason - * - * @returns {void} - */ -WebsocketProvider.prototype.disconnect = function (code, reason) { - this._removeSocketListeners(); - this.connection.close(code || 1000, reason); -}; - -/** - * Returns the desired boolean. - * - * @method supportsSubscriptions - * - * @returns {boolean} - */ -WebsocketProvider.prototype.supportsSubscriptions = function () { - return true; -}; - -/** - * Removes the listeners and reconnects to the socket. - * - * @method reconnect - * - * @returns {void} - */ -WebsocketProvider.prototype.reconnect = function () { - var _this = this; - this.reconnecting = true; - - if (this.responseQueue.size > 0) { - this.responseQueue.forEach(function (request, key) { - request.callback(errors.PendingRequestsOnReconnectingError()); - _this.responseQueue.delete(key); - }); - } - - if ( - !this.reconnectOptions.maxAttempts || - this.reconnectAttempts < this.reconnectOptions.maxAttempts - ) { - setTimeout(function () { - _this.reconnectAttempts++; - _this._removeSocketListeners(); - _this.emit(_this.RECONNECT, _this.reconnectAttempts); - _this.connect(); - }, this.reconnectOptions.delay); - - return; - } - - this.emit(this.ERROR, errors.MaxAttemptsReachedOnReconnectingError()); - this.reconnecting = false; - - if (this.requestQueue.size > 0) { - this.requestQueue.forEach(function (request, key) { - request.callback(errors.MaxAttemptsReachedOnReconnectingError()); - _this.requestQueue.delete(key); - }); - } -}; - -module.exports = WebsocketProvider; diff --git a/packages/web3-providers-ws/src/index.ts b/packages/web3-providers-ws/src/index.ts new file mode 100644 index 00000000000..4591e2b0a26 --- /dev/null +++ b/packages/web3-providers-ws/src/index.ts @@ -0,0 +1,171 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ClientRequestArgs } from 'http'; +import WebSocket, { ClientOptions, CloseEvent } from 'isomorphic-ws'; +import { + EthExecutionAPI, + Web3APIMethod, + Web3APIPayload, + Web3APISpec, + Web3ProviderStatus, +} from 'web3-types'; +import { isNullish, ReconnectOptions, SocketProvider } from 'web3-utils'; +import { ConnectionNotOpenError } from 'web3-errors'; + +export { ClientRequestArgs } from 'http'; + +export { ClientOptions } from 'isomorphic-ws'; + +/** + * Use WebSocketProvider to connect to a Node using a WebSocket connection, i.e. over the `ws` or `wss` protocol. + * + * @example + * ```ts + * const provider = new WebSocketProvider( + * `ws://localhost:8545`, + * { + * headers: { + * // to provide the API key if the Node requires the key to be inside the `headers` for example: + * 'x-api-key': '', + * }, + * }, + * { + * delay: 500, + * autoReconnect: true, + * maxAttempts: 10, + * }, + * ); + * ``` + * + * The second and the third parameters are both optional. And you can for example, the second parameter could be an empty object or undefined. + * * @example + * ```ts + * const provider = new WebSocketProvider( + * `ws://localhost:8545`, + * {}, + * { + * delay: 500, + * autoReconnect: true, + * maxAttempts: 10, + * }, + * ); + * ``` + */ +export default class WebSocketProvider< + API extends Web3APISpec = EthExecutionAPI, +> extends SocketProvider { + protected readonly _socketOptions?: ClientOptions | ClientRequestArgs; + + protected _socketConnection?: WebSocket; + + // eslint-disable-next-line class-methods-use-this + protected _validateProviderPath(providerUrl: string): boolean { + return typeof providerUrl === 'string' ? /^ws(s)?:\/\//i.test(providerUrl) : false; + } + + /** + * This is a class used for Web Socket connections. It extends the abstract class SocketProvider {@link SocketProvider} that extends the EIP-1193 provider {@link EIP1193Provider}. + * @param socketPath - The path to the Web Socket. + * @param socketOptions - The options for the Web Socket client. + * @param reconnectOptions - The options for the socket reconnection {@link ReconnectOptions} + */ + // this constructor is to specify the type for `socketOptions` for a better intellisense. + // eslint-disable-next-line no-useless-constructor + public constructor( + socketPath: string, + socketOptions?: ClientOptions | ClientRequestArgs, + reconnectOptions?: Partial, + ) { + super(socketPath, socketOptions, reconnectOptions); + } + + public getStatus(): Web3ProviderStatus { + if (this._socketConnection && !isNullish(this._socketConnection)) { + switch (this._socketConnection.readyState) { + case this._socketConnection.CONNECTING: { + return 'connecting'; + } + case this._socketConnection.OPEN: { + return 'connected'; + } + default: { + return 'disconnected'; + } + } + } + return 'disconnected'; + } + + protected _openSocketConnection() { + this._socketConnection = new WebSocket( + this._socketPath, + undefined, + this._socketOptions && Object.keys(this._socketOptions).length === 0 + ? undefined + : this._socketOptions, + ); + } + + protected _closeSocketConnection(code?: number, data?: string) { + this._socketConnection?.close(code, data); + } + + protected _sendToSocket>( + payload: Web3APIPayload, + ): void { + if (this.getStatus() === 'disconnected') { + throw new ConnectionNotOpenError(); + } + this._socketConnection?.send(JSON.stringify(payload)); + } + + protected _parseResponses(event: WebSocket.MessageEvent) { + return this.chunkResponseParser.parseResponse(event.data as string); + } + + protected _addSocketListeners(): void { + this._socketConnection?.addEventListener('open', this._onOpenHandler); + this._socketConnection?.addEventListener('message', this._onMessageHandler); + this._socketConnection?.addEventListener('close', e => this._onCloseHandler(e)); + this._socketConnection?.addEventListener('error', this._onErrorHandler); + } + + protected _removeSocketListeners(): void { + this._socketConnection?.removeEventListener('message', this._onMessageHandler); + this._socketConnection?.removeEventListener('open', this._onOpenHandler); + this._socketConnection?.removeEventListener('close', this._onCloseHandler); + // note: we intentionally keep the error event listener to be able to emit it in case an error happens when closing the connection + } + + protected _onCloseEvent(event: CloseEvent): void { + if ( + this._reconnectOptions.autoReconnect && + (![1000, 1001].includes(event.code) || !event.wasClean) + ) { + this._reconnect(); + return; + } + this._clearQueues(event); + this._removeSocketListeners(); + this._onDisconnect(event.code, event.reason); + // disconnect was successful and can safely remove error listener + this._socketConnection?.removeEventListener('error', this._onErrorHandler); + } +} + +export { WebSocketProvider }; diff --git a/packages/web3-providers-ws/test/.eslintrc.js b/packages/web3-providers-ws/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-providers-ws/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-providers-ws/test/config/jest.config.js b/packages/web3-providers-ws/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-providers-ws/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-providers-ws/test/config/setup.js b/packages/web3-providers-ws/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-providers-ws/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-providers-ws/test/fixtures/accounts.json b/packages/web3-providers-ws/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-providers-ws/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-providers-ws/test/fixtures/proxy.ts b/packages/web3-providers-ws/test/fixtures/proxy.ts new file mode 100644 index 00000000000..37747506647 --- /dev/null +++ b/packages/web3-providers-ws/test/fixtures/proxy.ts @@ -0,0 +1,83 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocket from 'ws'; + +export const createProxy = async ( + port: number, + origin: string, +): Promise<{ + server: WebSocket.Server; + path: string; + close: () => Promise; + originWs: WebSocket; +}> => { + const originWs = new WebSocket(origin); + + await new Promise(resolve => { + originWs.on('open', () => { + resolve(true); + }); + }); + + const webSocketServer = new WebSocket.Server({ + host: '127.0.0.1', + port, + }); + // eslint-disable-next-line @typescript-eslint/no-empty-function + let closeFunc = async () => {}; + webSocketServer.on('connection', ws => { + ws.on('message', (d, isBinary) => { + originWs.send(d, { binary: isBinary }); + }); + originWs.on('message', (d, isBinary) => { + ws.send(d, { binary: isBinary }); + }); + closeFunc = async () => { + await new Promise(resolve => { + const timeOut = setTimeout(() => { + resolve(true); + }, 2000); + ws.on('close', () => { + ws.removeAllListeners(); + clearTimeout(timeOut); + resolve(true); + }); + ws.terminate(); + }); + await new Promise(resolve => { + const timeOut = setTimeout(() => { + resolve(true); + }, 2000); + originWs.on('close', () => { + clearTimeout(timeOut); + originWs.removeAllListeners(); + resolve(true); + }); + + originWs.terminate(); + }); + webSocketServer.close(); + }; + }); + + return { + path: `ws://127.0.0.1:${port}`, + server: webSocketServer, + originWs, + close: async () => closeFunc(), + }; +}; diff --git a/packages/web3-providers-ws/test/fixtures/system_test_utils.ts b/packages/web3-providers-ws/test/fixtures/system_test_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3-providers-ws/test/fixtures/system_test_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3-providers-ws/test/fixtures/test_data.ts b/packages/web3-providers-ws/test/fixtures/test_data.ts new file mode 100644 index 00000000000..c1bddff0444 --- /dev/null +++ b/packages/web3-providers-ws/test/fixtures/test_data.ts @@ -0,0 +1,45 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const validConnectionStrings = [ + 'ws://localhost:8545', + 'ws://www.localhost', + 'ws://localhost', + 'wss://foo.com', + 'ws://foo.ninja', + 'wss://foo.com', + 'ws://foo.com:8545', +]; + +export const invalidConnectionStrings = [ + 'htt://localhost:8545', + 'http//localhost:8545', + 'ipc://localhost:8545', + '', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + undefined, + 42, +]; + +export const wsProviderOptions = { + followRedirects: true, + handshakeTimeout: 1500, + maxRedirects: 3, + perMessageDeflate: true, +}; diff --git a/packages/web3-providers-ws/test/integration/basic_auth.test.ts b/packages/web3-providers-ws/test/integration/basic_auth.test.ts new file mode 100644 index 00000000000..f94774a92c5 --- /dev/null +++ b/packages/web3-providers-ws/test/integration/basic_auth.test.ts @@ -0,0 +1,94 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import express from 'express'; +import { Server } from 'http'; +import { createProxyMiddleware } from 'http-proxy-middleware'; +import WebSocketProvider from '../../src/index'; +import { + describeIf, + getSystemTestProviderUrl, + isWs, + waitForSocketConnect, + waitForCloseSocketConnection, +} from '../fixtures/system_test_utils'; + +describeIf(isWs)('Support of Basic Auth', () => { + let server: Server; + let clientWsUrl: string; + let webSocketProvider: WebSocketProvider; + + beforeAll(() => { + clientWsUrl = getSystemTestProviderUrl(); + const app = express(); + const port = 3000; + const host = 'localhost'; + + const wsProxy = createProxyMiddleware({ + target: clientWsUrl, + changeOrigin: true, + ws: true, + onError: () => { + console.warn('************** proxy error'); + }, + logLevel: 'silent', + }); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + app.use(wsProxy); + server = app.listen(port, host); + + server.on('upgrade', (req, socket, head) => { + if (!req.headers.authorization || !req.headers.authorization?.includes('Basic ')) { + socket.emit('error'); + socket.destroy(); + } + const base64Credentials = req.headers.authorization?.split(' ')[1]; + const credentials: string = Buffer.from(base64Credentials as string, 'base64').toString( + 'ascii', + ); + const [username, password] = credentials.split(':'); + if (username !== 'geth' || password !== 'authpass') { + socket.emit('error'); + socket.destroy(); + } + return wsProxy.upgrade?.(req as any, socket as any, head); + }); + }); + afterAll(() => { + server.close(); + }); + beforeEach(() => { + webSocketProvider = new WebSocketProvider( + 'ws://geth:authpass@localhost:3000', + {}, + { delay: 1, autoReconnect: false, maxAttempts: 1 }, + ); + }); + afterEach(async () => { + // make sure we try to close the connection after it is established + if (webSocketProvider.getStatus() === 'connecting') { + await waitForSocketConnect(webSocketProvider); + } + webSocketProvider.disconnect(); + await waitForCloseSocketConnection(webSocketProvider); + }); + // eslint-disable-next-line jest/expect-expect + test('should connect with basic auth', async () => { + await waitForSocketConnect(webSocketProvider); + expect(webSocketProvider.getStatus()).toBe('connected'); + }); +}); diff --git a/packages/web3-providers-ws/test/integration/eip1193.test.ts b/packages/web3-providers-ws/test/integration/eip1193.test.ts new file mode 100644 index 00000000000..04c36e3888a --- /dev/null +++ b/packages/web3-providers-ws/test/integration/eip1193.test.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { hexToNumber } from 'web3-utils'; +import { HexString, ProviderConnectInfo, ProviderRpcError } from 'web3-types'; +import WebSocketProvider from '../../src/index'; + +import { + describeIf, + getSystemTestProviderUrl, + isWs, + waitForSocketConnect, + waitForSocketDisconnect, +} from '../fixtures/system_test_utils'; + +describeIf(isWs)('WebSocketProvider - eip1193', () => { + let socketPath: string; + let socketProvider: WebSocketProvider; + + beforeAll(() => { + socketPath = getSystemTestProviderUrl(); + }); + beforeEach(() => { + socketProvider = new WebSocketProvider(socketPath); + }); + afterEach(async () => { + socketProvider.disconnect(1000); + await waitForSocketDisconnect(socketProvider); + }); + + describe('check events', () => { + it('should send connect event', async () => { + const providerConnectInfo = await new Promise(resolve => { + socketProvider.on('connect', (data: ProviderConnectInfo) => { + resolve(data); + }); + }); + expect(hexToNumber(providerConnectInfo.chainId)).toBeGreaterThan(0); + }); + it('should send disconnect event', async () => { + await waitForSocketConnect(socketProvider); + const disconnectPromise = new Promise(resolve => { + socketProvider.on('disconnect', (error: ProviderRpcError) => { + resolve(error); + }); + }); + socketProvider.disconnect(1000, 'Some extra data'); + + const err = await disconnectPromise; + expect(err.code).toBe(1000); + expect(err.data).toBe('Some extra data'); + }); + it('should send chainChanged event', async () => { + await waitForSocketConnect(socketProvider); + // @ts-expect-error set private variable + socketProvider._chainId = '0x1'; + socketProvider.disconnect(1000); + await waitForSocketDisconnect(socketProvider); + const chainChangedPromise = new Promise(resolve => { + socketProvider.on('chainChanged', (result: HexString) => { + resolve(result); + }); + }); + socketProvider.connect(); + await waitForSocketConnect(socketProvider); + const chainId = await chainChangedPromise; + expect(chainId).not.toBe('0x1'); + expect(hexToNumber(chainId)).toBeGreaterThan(0); + }); + it('should send accountsChanged event', async () => { + await waitForSocketConnect(socketProvider); + + // @ts-expect-error set private variable + socketProvider._accounts = ['1', '2']; + socketProvider.disconnect(1000); + await waitForSocketDisconnect(socketProvider); + const chainChangedPromise = new Promise(resolve => { + socketProvider.on('accountsChanged', (accounts: HexString[]) => { + resolve(accounts); + }); + }); + socketProvider.connect(); + await waitForSocketConnect(socketProvider); + const accounts = await chainChangedPromise; + + expect(JSON.stringify(accounts)).not.toBe(JSON.stringify(['1', '2'])); + }); + }); +}); diff --git a/packages/web3-providers-ws/test/integration/ganache_fault_tolerance.test.ts b/packages/web3-providers-ws/test/integration/ganache_fault_tolerance.test.ts new file mode 100644 index 00000000000..30078527ca2 --- /dev/null +++ b/packages/web3-providers-ws/test/integration/ganache_fault_tolerance.test.ts @@ -0,0 +1,415 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ProviderRpcError } from 'web3-types/src/web3_api_types'; +import ganache from 'ganache'; +import { EthExecutionAPI, Web3APIPayload, SocketRequestItem, JsonRpcResponse } from 'web3-types'; +import { InvalidResponseError, ConnectionNotOpenError } from 'web3-errors'; +import { Web3DeferredPromise } from 'web3-utils'; +import { + waitForSocketConnect, + waitForEvent, + describeIf, + getSystemTestBackend, + isWs, +} from '../fixtures/system_test_utils'; +import WebSocketProvider from '../../src/index'; + +// create helper functions to open server +describeIf(getSystemTestBackend() === 'ganache' && isWs)('ganache tests', () => { + describe('WebSocketProvider - ganache', () => { + jest.setTimeout(17000); + const port = 7547; + const host = `ws://localhost:${port}`; + const jsonRpcPayload = { + jsonrpc: '2.0', + id: 43, + method: 'eth_mining', + } as Web3APIPayload; + + // simulate abrupt disconnection, ganache server always closes with code 1000 so we need to simulate closing with different error code + const changeCloseCode = async (webSocketProvider: WebSocketProvider) => + new Promise(resolve => { + // @ts-expect-error replace close handler + // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-param-reassign + webSocketProvider._onCloseHandler = (_: CloseEvent) => { + // @ts-expect-error replace close event + webSocketProvider._onCloseEvent({ code: 1003 }); + }; + // @ts-expect-error run protected method + webSocketProvider._removeSocketListeners(); + // @ts-expect-error run protected method + webSocketProvider._addSocketListeners(); + resolve(); + }); + + it('"error" when there is no connection', async () => { + const reconnectionOptions = { + delay: 100, + autoReconnect: false, + maxAttempts: 1, + }; + const websocketProvider = new WebSocketProvider( + 'ws://localhost:7547', + {}, + reconnectionOptions, + ); + + expect(!!(await waitForEvent(websocketProvider, 'error'))).toBe(true); + websocketProvider.disconnect(); + await expect(websocketProvider.request(jsonRpcPayload)).rejects.toThrow( + 'Connection not open', + ); + }); + + it('"error" handler fires if the client closes unilaterally', async () => { + const server = ganache.server(); + await server.listen(port); + const webSocketProvider = new WebSocketProvider(host); + + await waitForSocketConnect(webSocketProvider); + + const disconnectPromise = waitForEvent(webSocketProvider, 'disconnect'); + await server.close(); + expect(!!(await disconnectPromise)).toBe(true); + webSocketProvider.disconnect(); + }); + + it('"error" handler *DOES NOT* fire if disconnection is clean', async () => { + const server = ganache.server(); + await server.listen(port); + const reconnectOptions = { + autoReconnect: false, + }; + const webSocketProvider = new WebSocketProvider(host, {}, reconnectOptions); + await waitForSocketConnect(webSocketProvider); + + const mockReject = jest.fn(); + webSocketProvider.once('error', () => { + mockReject(); + }); + webSocketProvider.disconnect(); + await new Promise(resolve => { + setTimeout(() => { + resolve(true); + }, 100); + }); + expect(mockReject).toHaveBeenCalledTimes(0); + + await server.close(); + }); + + it('can connect after being disconnected', async () => { + const server = ganache.server(); + await server.listen(port); + + const webSocketProvider = new WebSocketProvider(host); + const mockCallback = jest.fn(); + const connectPromise = new Promise(resolve => { + webSocketProvider.once('connect', () => { + mockCallback(); + resolve(true); + }); + }); + await connectPromise; + + webSocketProvider.disconnect(); + await waitForEvent(webSocketProvider, 'disconnect'); + + webSocketProvider.connect(); + const connectPromise2 = new Promise(resolve => { + webSocketProvider.once('connect', () => { + mockCallback(); + resolve(true); + }); + }); + await connectPromise2; + webSocketProvider.disconnect(); + expect(mockCallback).toHaveBeenCalledTimes(2); + await server.close(); + }); + + it('webSocketProvider supports subscriptions', async () => { + const server = ganache.server(); + await server.listen(port); + const webSocketProvider = new WebSocketProvider(host); + + await waitForSocketConnect(webSocketProvider); + expect(webSocketProvider.supportsSubscriptions()).toBe(true); + + webSocketProvider.disconnect(); + await server.close(); + }); + + it('times out when server is closed', async () => { + const server = ganache.server(); + await server.listen(port); + const reconnectionOptions = { + delay: 100, + autoReconnect: false, + maxAttempts: 1, + }; + const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); + const mockCallBack = jest.fn(); + const errorPromise = new Promise(resolve => { + webSocketProvider.on('error', (err: unknown) => { + if ((err as ProviderRpcError)?.message.startsWith('connect ECONNREFUSED')) { + mockCallBack(); + resolve(true); + } + }); + }); + await server.close(); + await errorPromise; + expect(mockCallBack).toHaveBeenCalled(); + }); + + it('with reconnect on, will try to connect until server is open then close', async () => { + const reconnectionOptions = { + delay: 10, + autoReconnect: true, + maxAttempts: 100, + }; + const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); + + const mockCallback = jest.fn(); + const connectPromise = new Promise(resolve => { + webSocketProvider.on('connect', () => { + mockCallback(); + resolve(true); + }); + }); + + const server = ganache.server(); + await server.listen(port); + await connectPromise; + webSocketProvider.disconnect(); + await server.close(); + expect(mockCallback).toHaveBeenCalledTimes(1); + }); + + it('allows disconnection on lost connection, when reconnect is enabled', async () => { + const reconnectionOptions = { + delay: 10, + autoReconnect: true, + maxAttempts: 100, + }; + const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); + + const connectPromise = waitForSocketConnect(webSocketProvider); + + const server = ganache.server(); + await server.listen(port); + await connectPromise; + await server.close(); + const disconnectEvent = waitForEvent(webSocketProvider, 'disconnect'); + webSocketProvider.disconnect(); + expect(!!(await disconnectEvent)).toBe(true); + }); + + it('errors when failing to reconnect after data is lost mid-chunk', async () => { + const server = ganache.server(); + await server.listen(port); + const reconnectionOptions = { + delay: 100, + autoReconnect: true, + maxAttempts: 1, + }; + const mockCallBack = jest.fn(); + const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); + await waitForSocketConnect(webSocketProvider); + + webSocketProvider.on('error', (err: any) => { + if (err.message === `Maximum number of reconnect attempts reached! (${1})`) { + mockCallBack(); + } + }); + + await server.close(); + + // when server is not listening send request, and expect that lib will try to reconnect and at end will throw con not open error + await expect( + webSocketProvider.request( + {"method":"eth_getBlockByNumber","params":["0xc5043f",false],"id":1,"jsonrpc":"2.0"} + )) + .rejects.toThrow(ConnectionNotOpenError); + + expect(mockCallBack).toHaveBeenCalled(); + }); + + it('times out when connection is lost mid-chunk', async () => { + const server = ganache.server(); + await server.listen(port); + const reconnectionOptions = { + delay: 0, + autoReconnect: false, + maxAttempts: 0, + }; + const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); + await waitForSocketConnect(webSocketProvider); + + await server.close(); + + const errorPromise = new Promise(resolve => { + webSocketProvider.on('error', (err: any) => { + expect(err).toBeInstanceOf(InvalidResponseError); + if (err.cause.message === 'Chunk timeout') { + resolve(true); + } + }); + }); + // send an event to be parsed and fail + const event = { + data: 'abc|--|ded', + type: 'websocket', + // @ts-expect-error run protected method + target: webSocketProvider._socketConnection, + }; + // @ts-expect-error run protected method + webSocketProvider._parseResponses(event); // simulate chunks + await errorPromise; + expect(true).toBe(true); + }); + + it('clears pending requests on maxAttempts failed reconnection', async () => { + const server = ganache.server(); + await server.listen(port); + const reconnectionOptions = { + delay: 1000, + autoReconnect: true, + maxAttempts: 1, + }; + const mockCallBack = jest.fn(); + + const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); + const defPromise = new Web3DeferredPromise>(); + // eslint-disable-next-line @typescript-eslint/no-empty-function + defPromise.catch(() => {}); + const reqItem: SocketRequestItem = { + payload: jsonRpcPayload, + deferredPromise: defPromise, + }; + await waitForSocketConnect(webSocketProvider); + + // add a request without executing promise + // @ts-expect-error run protected method + webSocketProvider._pendingRequestsQueue.set(jsonRpcPayload.id, reqItem); + + // simulate abrupt server close + await changeCloseCode(webSocketProvider); + const errorPromise = new Promise(resolve => { + webSocketProvider.on('error', (error: unknown) => { + if ( + (error as ProviderRpcError)?.message === + `Maximum number of reconnect attempts reached! (${1})` + ) { + mockCallBack(); + } + resolve(true); + }); + }); + + await server.close(); + await errorPromise; + // @ts-expect-error run protected method + expect(webSocketProvider._pendingRequestsQueue.size).toBe(0); + expect(mockCallBack).toHaveBeenCalled(); + }); + + it('queues requests made while connection is lost / executes on reconnect', async () => { + const server = ganache.server(); + await server.listen(port); + const reconnectionOptions = { + delay: 1000, + autoReconnect: true, + maxAttempts: 3, + }; + const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); + await waitForSocketConnect(webSocketProvider); + + // simulate abrupt close code + await changeCloseCode(webSocketProvider); + const errorPromise = new Promise(resolve => { + webSocketProvider.on('error', () => { + resolve(true); + }); + }); + await server.close(); + + await errorPromise; + // queue a request + const requestPromise = webSocketProvider.request(jsonRpcPayload); + + const server2 = ganache.server(); + await server2.listen(port); + + await waitForSocketConnect(webSocketProvider); + + // try to send a request + const result = await requestPromise; + expect(result.id).toEqual(jsonRpcPayload.id); + webSocketProvider.disconnect(); + await server2.close(); + }); + it('errors when requests continue after socket closed', async () => { + const server = ganache.server(); + await server.listen(port); + const reconnectOptions = { + autoReconnect: false, + }; + const webSocketProvider = new WebSocketProvider(host, {}, reconnectOptions); + await waitForSocketConnect(webSocketProvider); + + const disconnectPromise = waitForEvent(webSocketProvider, 'disconnect'); + await server.close(); + + await disconnectPromise; + const errorPromise = new Promise(resolve => { + webSocketProvider.on('error', () => { + resolve(true); + }); + }); + await expect(webSocketProvider.request(jsonRpcPayload)).rejects.toThrow( + 'Connection not open', + ); + await errorPromise; + }); + it('deferredPromise emits an error when request fails', async () => { + const server = ganache.server(); + await server.listen(port); + const webSocketProvider = new WebSocketProvider(host); + await waitForSocketConnect(webSocketProvider); + + // @ts-expect-error replace sendtoSocket so we don't execute request + // eslint-disable-next-line @typescript-eslint/no-empty-function + webSocketProvider._sendToSocket = () => {}; + webSocketProvider.on('error', (err: unknown) => { + expect(err).toBeInstanceOf(ConnectionNotOpenError); + }); + + // eslint-disable-next-line @typescript-eslint/no-empty-function + const request = webSocketProvider.request(jsonRpcPayload).catch(() => {}); + + // @ts-expect-error create a deferred promise error + webSocketProvider._clearQueues(); + + await request; + webSocketProvider.disconnect(); + await server.close(); + }); + }); +}); diff --git a/packages/web3-providers-ws/test/integration/jest.config.js b/packages/web3-providers-ws/test/integration/jest.config.js new file mode 100644 index 00000000000..c3ec1bb8d37 --- /dev/null +++ b/packages/web3-providers-ws/test/integration/jest.config.js @@ -0,0 +1,49 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + roots: ['/test/integration/'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-providers-ws/test/integration/reconnection.test.ts b/packages/web3-providers-ws/test/integration/reconnection.test.ts new file mode 100644 index 00000000000..aeb72838252 --- /dev/null +++ b/packages/web3-providers-ws/test/integration/reconnection.test.ts @@ -0,0 +1,144 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { CloseEvent } from 'ws'; +import { ProviderRpcError } from 'web3-types/src/web3_api_types'; +import WebSocketProvider from '../../src'; + +import { createProxy } from '../fixtures/proxy'; +import { + describeIf, + getSystemTestProviderUrl, + isBrowser, + waitForSocketConnect, + isWs, + waitForCloseSocketConnection, + waitForEvent, +} from '../fixtures/system_test_utils'; + +describeIf(isWs && !isBrowser)('WebSocketProvider - reconnection', () => { + describe('subscribe event tests', () => { + let reconnectionOptions: { + delay: number; + autoReconnect: boolean; + maxAttempts: number; + }; + beforeAll(() => { + reconnectionOptions = { + delay: 500, + autoReconnect: true, + maxAttempts: 100, + }; + }); + it('check defaults', async () => { + const web3Provider = new WebSocketProvider(getSystemTestProviderUrl()); + // @ts-expect-error-next-line + expect(web3Provider._reconnectOptions).toEqual({ + autoReconnect: true, + delay: 5000, + maxAttempts: 5, + }); + await waitForSocketConnect(web3Provider); + web3Provider.disconnect(1000, 'test'); + await waitForCloseSocketConnection(web3Provider); + }); + it('set custom reconnectOptions', async () => { + const web3Provider = new WebSocketProvider( + getSystemTestProviderUrl(), + {}, + reconnectionOptions, + ); + // @ts-expect-error-next-line + expect(web3Provider._reconnectOptions).toEqual(reconnectionOptions); + await waitForSocketConnect(web3Provider); + web3Provider.disconnect(1000, 'test'); + await waitForCloseSocketConnection(web3Provider); + }); + it('should emit connect and disconnected events', async () => { + const server = await createProxy(18545, getSystemTestProviderUrl()); + const web3Provider = new WebSocketProvider(server.path, {}, reconnectionOptions); + expect(!!(await waitForEvent(web3Provider, 'connect'))).toBe(true); + // @ts-expect-error set protected option + web3Provider._reconnectOptions = { + ...reconnectionOptions, + autoReconnect: false, + }; + + const disconnectPromise = waitForEvent(web3Provider, 'disconnect'); + // @ts-expect-error read protected property + expect(web3Provider.isReconnecting).toBe(false); + await server.close(); + + expect(!!(await disconnectPromise)).toBe(true); + }); + + it('should connect, disconnect and reconnect', async () => { + const server = await createProxy(18546, getSystemTestProviderUrl()); + const web3Provider = new WebSocketProvider(server.path, {}, reconnectionOptions); + expect(!!(await waitForEvent(web3Provider, 'connect'))).toBe(true); + web3Provider.disconnect(1002); + await server.close(); + const connectEvent = waitForEvent(web3Provider, 'connect'); + const server2 = await createProxy(18546, getSystemTestProviderUrl()); + expect(!!(await connectEvent)).toBe(true); + + web3Provider.disconnect(); + await waitForEvent(web3Provider, 'disconnect'); + await server2.close(); + }); + it('should connect, disconnect, try reconnect and reach max attempts', async () => { + const server = await createProxy(18547, getSystemTestProviderUrl()); + const web3Provider = new WebSocketProvider( + server.path, + {}, + { + ...reconnectionOptions, + delay: 1, + maxAttempts: 3, + }, + ); + expect(!!(await waitForEvent(web3Provider, 'connect'))).toBe(true); + + // @ts-expect-error replace close handler + // eslint-disable-next-line @typescript-eslint/no-unused-vars + web3Provider._onCloseHandler = (_: CloseEvent) => { + // @ts-expect-error replace close event + web3Provider._onCloseEvent({ code: 1002 }); + }; + // @ts-expect-error run protected method + web3Provider._removeSocketListeners(); + // @ts-expect-error run protected method + web3Provider._addSocketListeners(); + const errorEvent = new Promise(resolve => { + web3Provider.on('error', (error: unknown) => { + if ( + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + (error as ProviderRpcError)?.message?.startsWith( + 'Maximum number of reconnect attempts reached', + ) + ) { + resolve(error); + } + }); + }); + + await server.close(); + const error = (await errorEvent) as Error; + expect(error.message).toBe(`Maximum number of reconnect attempts reached! (${3})`); + }); + }); +}); diff --git a/packages/web3-providers-ws/test/integration/setup.js b/packages/web3-providers-ws/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-providers-ws/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-providers-ws/test/integration/web_socket_provider_integration.test.ts b/packages/web3-providers-ws/test/integration/web_socket_provider_integration.test.ts new file mode 100644 index 00000000000..ccc1a97714f --- /dev/null +++ b/packages/web3-providers-ws/test/integration/web_socket_provider_integration.test.ts @@ -0,0 +1,278 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3WSProviderError } from 'web3-errors'; +import { + EthExecutionAPI, + JsonRpcId, + JsonRpcNotification, + JsonRpcResponse, + JsonRpcSubscriptionResult, + ProviderRpcError, + SocketRequestItem, + Web3APIPayload, +} from 'web3-types'; +import { Web3DeferredPromise } from 'web3-utils'; +import WebSocketProvider from '../../src/index'; +import { + createTempAccount, + describeIf, + getSystemTestProviderUrl, + isWs, + waitForCloseSocketConnection, + waitForSocketConnect, +} from '../fixtures/system_test_utils'; + +type Resolve = (value?: unknown) => void; + +describeIf(isWs)('WebSocketProvider - implemented methods', () => { + let clientWsUrl: string; + let tempAccount: string; + let webSocketProvider: WebSocketProvider; + let jsonRpcPayload: Web3APIPayload; + // helper function + + beforeAll(async () => { + clientWsUrl = getSystemTestProviderUrl(); + tempAccount = (await createTempAccount()).address; + }); + beforeEach(() => { + jsonRpcPayload = { + jsonrpc: '2.0', + id: 42, + method: 'eth_getBalance', + params: [tempAccount, 'latest'], + } as Web3APIPayload; + webSocketProvider = new WebSocketProvider( + clientWsUrl, + {}, + { delay: 1, autoReconnect: false, maxAttempts: 1 }, + ); + }); + afterEach(async () => { + // make sure we try to close the connection after it is established + if (webSocketProvider.getStatus() === 'connecting') { + await waitForSocketConnect(webSocketProvider); + } + webSocketProvider.disconnect(1000); + }); + + describe('websocker provider tests', () => { + it('should connect', async () => { + await waitForSocketConnect(webSocketProvider); + expect(webSocketProvider).toBeInstanceOf(WebSocketProvider); + expect(webSocketProvider.getStatus()).toBe('connected'); + }); + }); + + describe('subscribe event tests', () => { + it('should subscribe to `message` event', async () => { + const messagePromise = new Promise((resolve: Resolve) => { + webSocketProvider.on( + 'message', + (result?: JsonRpcSubscriptionResult | JsonRpcNotification) => { + if (result?.id !== jsonRpcPayload.id) { + return; + } + expect(result?.id).toBe(jsonRpcPayload.id); + resolve(); + }, + ); + }); + await webSocketProvider.request(jsonRpcPayload); + await messagePromise; + }); + + it('should subscribe to `error` event that could happen at the underlying WebSocket connection', async () => { + await waitForSocketConnect(webSocketProvider); + const errorMsg = 'Custom WebSocket error occurred'; + + const errorPromise = new Promise((resolve: Resolve) => { + webSocketProvider.on('error', (err: any) => { + expect(err?.message).toBe(errorMsg); + resolve(); + }); + }); + + webSocketProvider['_socketConnection']?.emit( + 'error', + new Web3WSProviderError(errorMsg), + ); + await errorPromise; + }); + + it('should subscribe to `connect` event', async () => { + const openPromise = new Promise((resolve: Resolve) => { + webSocketProvider.on('connect', () => { + resolve('resolved'); + }); + }); + await expect(openPromise).resolves.toBe('resolved'); + }); + + it('should subscribe to `disconnect` event', async () => { + const code = 1000; + + const closePromise = new Promise(resolve => { + webSocketProvider.on('disconnect', (error: ProviderRpcError) => { + expect(error?.code).toEqual(code); + resolve(error); + }); + }); + await waitForSocketConnect(webSocketProvider); + webSocketProvider.disconnect(code); + await closePromise; + }); + + it('should error when no connection is established', async () => { + const wsProvider = new WebSocketProvider("ws://localhost:999",{}, { autoReconnect: false }); + let errored = false; + try{ + await wsProvider.request(jsonRpcPayload); + // should not be able to reach here + + }catch(e){ + // eslint-disable-next-line jest/no-conditional-expect + expect((e as any).message).toBe('Connection not open') + errored = true; + } + expect(errored).toBe(true); + }); + }); + + describe('disconnect and reset test', () => { + it('should disconnect', async () => { + await waitForSocketConnect(webSocketProvider); + const provider = new WebSocketProvider( + clientWsUrl, + {}, + { delay: 1, autoReconnect: false, maxAttempts: 1 }, + ); + await waitForSocketConnect(provider); + provider.disconnect(1000); + await waitForCloseSocketConnection(provider); + expect(provider.getStatus()).toBe('disconnected'); + }); + + it('should reset', async () => { + await waitForSocketConnect(webSocketProvider); + class TestReset extends WebSocketProvider { + public pendingRequestsSize() { + return this._pendingRequestsQueue.size; + } + + public sentRequestsSize() { + return this._pendingRequestsQueue.size; + } + + public setPendingRequest(id: JsonRpcId, reqItem: SocketRequestItem) { + this._pendingRequestsQueue.set(id, reqItem); + } + + public setSentRequest(id: JsonRpcId, reqItem: SocketRequestItem) { + this._sentRequestsQueue.set(id, reqItem); + } + } + const testResetProvider = new TestReset( + clientWsUrl, + {}, + { delay: 1, autoReconnect: false, maxAttempts: 1 }, + ); + + await waitForSocketConnect(testResetProvider); + + const defPromise = new Web3DeferredPromise>(); + + const reqItem: SocketRequestItem = { + payload: jsonRpcPayload, + deferredPromise: defPromise, + }; + + testResetProvider.setPendingRequest(jsonRpcPayload.id, reqItem); + expect(testResetProvider.pendingRequestsSize()).toBe(1); + + testResetProvider.setSentRequest(jsonRpcPayload.id, reqItem); + expect(testResetProvider.sentRequestsSize()).toBe(1); + + testResetProvider.reset(); + expect(testResetProvider.pendingRequestsSize()).toBe(0); + expect(testResetProvider.sentRequestsSize()).toBe(0); + + testResetProvider.disconnect(1000); + }); + }); + + describe('getStatus get and validate all status tests', () => { + it('should getStatus `connecting`', async () => { + expect(webSocketProvider.getStatus()).toBe('connecting'); + await waitForSocketConnect(webSocketProvider); + }); + + it('should getStatus `connected`', async () => { + await waitForSocketConnect(webSocketProvider); + expect(webSocketProvider.getStatus()).toBe('connected'); + }); + it('should getStatus `disconnected`', async () => { + await waitForSocketConnect(webSocketProvider); + webSocketProvider.disconnect(); + await waitForCloseSocketConnection(webSocketProvider); + expect(webSocketProvider.getStatus()).toBe('disconnected'); + }); + }); + describe('send multiple Requests on same connection with valid payload and receive response tests', () => { + // eslint-disable-next-line jest/expect-expect + let jsonRpcPayload2: Web3APIPayload; + let jsonRpcPayload3: Web3APIPayload; + beforeAll(() => { + jsonRpcPayload2 = { + jsonrpc: '2.0', + id: 43, + method: 'eth_mining', + } as Web3APIPayload; + jsonRpcPayload3 = { + jsonrpc: '2.0', + id: 44, + method: 'eth_hashrate', + } as Web3APIPayload; + }); + + it('should send multiple requests', async () => { + const prom1 = webSocketProvider.request(jsonRpcPayload); + + const prom2 = webSocketProvider.request(jsonRpcPayload2); + + const prom3 = webSocketProvider.request(jsonRpcPayload3); + + const values = await Promise.all([prom1, prom2, prom3]); + expect(values).toEqual( + expect.arrayContaining([ + expect.objectContaining({ id: jsonRpcPayload.id }), + expect.objectContaining({ id: jsonRpcPayload2.id }), + expect.objectContaining({ id: jsonRpcPayload3.id }), + ]), + ); + + // Execute request in connected stated too + const prom3Value = await prom3; + expect(prom3Value).toEqual( + expect.objectContaining({ + id: jsonRpcPayload3.id, + }), + ); + }); + }); +}); diff --git a/packages/web3-providers-ws/test/tsconfig.json b/packages/web3-providers-ws/test/tsconfig.json new file mode 120000 index 00000000000..c73c54e77b4 --- /dev/null +++ b/packages/web3-providers-ws/test/tsconfig.json @@ -0,0 +1 @@ +../../../templates/test/tsconfig.json.tmpl \ No newline at end of file diff --git a/packages/web3-providers-ws/test/unit/__mocks__/isomorphic-ws.ts b/packages/web3-providers-ws/test/unit/__mocks__/isomorphic-ws.ts new file mode 100644 index 00000000000..d5e9d79cef9 --- /dev/null +++ b/packages/web3-providers-ws/test/unit/__mocks__/isomorphic-ws.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EventEmitter } from 'web3-utils'; + +export default class WebSocket extends EventEmitter { + public readyState: number; + + public CONNECTING = 0; + public OPEN = 1; + + public constructor() { + super() + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + // Connected state + this.readyState = 1; + } + + public send(message: any) { + const data = JSON.parse(message); + + setTimeout(() => { + if (data.error) { + this.emit('message', { data: JSON.stringify({ ...data, error: data.error }) }); + } else { + this.emit('message', { data: JSON.stringify({ ...data, result: message }) }); + } + }, 100); + } + + public addEventListener(_event: any, _cb: () => void) { + this.on(_event, _cb) + + } + + public removeEventListener(_event: any, _cb: () => void) { + this.off(_event, _cb) + } +} diff --git a/packages/web3-providers-ws/test/unit/check_implementation.test.ts b/packages/web3-providers-ws/test/unit/check_implementation.test.ts new file mode 100644 index 00000000000..138855b9509 --- /dev/null +++ b/packages/web3-providers-ws/test/unit/check_implementation.test.ts @@ -0,0 +1,152 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocket from 'isomorphic-ws'; +import WebSocketProvider from '../../src/index'; + +jest.mock('isomorphic-ws'); +describe('WebSocketProvider', () => { + let send: () => void; + beforeAll(() => { + send = jest.fn(); + jest.spyOn(WebSocket.prototype, 'send').mockImplementation(send); + }); + + describe('methods', () => { + it.each(['_openSocketConnection', '_addSocketListeners'])( + 'should call method %s', + method => { + const _method = jest.fn(); + // @ts-expect-error mock method + jest.spyOn(WebSocketProvider.prototype, method).mockImplementation(_method); + const ws = new WebSocketProvider('ws://localhost:8545'); + expect(ws).toBeDefined(); + expect(_method).toHaveBeenCalled(); + }, + ); + it('should construct with expected methods', () => { + const _closeSocketConnection = jest.fn(); + const _removeSocketListeners = jest.fn(); + const _onDisconnect = jest.fn(); + const code = 1002; + const data = 'data'; + // @ts-expect-error mock method + jest.spyOn(WebSocketProvider.prototype, '_closeSocketConnection').mockImplementation( + _closeSocketConnection, + ); + // @ts-expect-error mock method + jest.spyOn(WebSocketProvider.prototype, '_removeSocketListeners').mockImplementation( + _removeSocketListeners, + ); + // @ts-expect-error mock method + jest.spyOn(WebSocketProvider.prototype, '_onDisconnect').mockImplementation( + _onDisconnect, + ); + const ws = new WebSocketProvider('ws://localhost:8545'); + expect(ws.getStatus()).toBe('connected'); + ws.disconnect(code, data); + expect(_removeSocketListeners).toHaveBeenCalled(); + expect(_onDisconnect).toHaveBeenCalledWith(code, data); + expect(_closeSocketConnection).toHaveBeenCalledWith(code, data); + }); + it('getStatus', () => { + const ws = new WebSocketProvider('ws://localhost:8545'); + expect(ws.getStatus()).toBe('connected'); + // @ts-expect-error mock field + ws._socketConnection.readyState = 0; + expect(ws.getStatus()).toBe('connecting'); + // @ts-expect-error mock field + ws._socketConnection.readyState = 2; + expect(ws.getStatus()).toBe('disconnected'); + // @ts-expect-error mock field + ws._socketConnection = undefined; + expect(ws.getStatus()).toBe('disconnected'); + }); + it('socketConnection.close', () => { + const ws = new WebSocketProvider('ws://localhost:8545'); + const close = jest.fn(); + // @ts-expect-error mock method + ws._socketConnection.close = close; + const code = 1002; + const data = 'data'; + ws.disconnect(code, data); + expect(close).toHaveBeenCalledWith(code, data); + }); + it('onCloseEvent autoReconnect=false', () => { + const ws = new WebSocketProvider('ws://localhost:8545', {}, { autoReconnect: false }); + const _clearQueues = jest.fn(); + const _removeSocketListeners = jest.fn(); + const _onDisconnect = jest.fn(); + // @ts-expect-error mock method + ws._socketConnection.close = jest.fn(); + + // @ts-expect-error mock method + ws._clearQueues = _clearQueues; + // @ts-expect-error mock method + ws._removeSocketListeners = _removeSocketListeners; + // @ts-expect-error mock method + ws._onDisconnect = _onDisconnect; + + const code = 1002; + const data = 'data'; + // @ts-expect-error emit method + ws._socketConnection.emit('close', { code, reason: data }); + expect(_clearQueues).toHaveBeenCalledWith({ code, reason: data }); + expect(_removeSocketListeners).toHaveBeenCalled(); + expect(_onDisconnect).toHaveBeenCalledWith(code, data); + }); + it('onCloseEvent autoReconnect=true', () => { + const ws = new WebSocketProvider('ws://localhost:8545'); + const _reconnect = jest.fn(); + // @ts-expect-error mock method + ws._socketConnection.close = jest.fn(); + // @ts-expect-error mock method + ws._reconnect = _reconnect; + + const code = 1002; + const data = 'data'; + // @ts-expect-error emit event + ws._socketConnection.emit('close', { code, reason: data }); + expect(_reconnect).toHaveBeenCalled(); + }); + it('listeners', () => { + const ws = new WebSocketProvider('ws://localhost:8545'); + // @ts-expect-error mock method + ws._socketConnection.listeners = () => { + throw new Error('error'); + }; + const addEventListener = jest.fn(); + // @ts-expect-error mock method + ws._socketConnection.addEventListener = addEventListener; + + // @ts-expect-error mock method + ws._addSocketListeners(); + // @ts-expect-error mock method + expect(addEventListener).toHaveBeenCalledWith('error', ws._onErrorHandler); + const removeEventListener = jest.fn(); + // @ts-expect-error mock method + ws._socketConnection.removeEventListener = removeEventListener; + // @ts-expect-error mock method + ws._removeSocketListeners(); + // @ts-expect-error mock method + expect(removeEventListener).toHaveBeenCalledWith('message', ws._onMessageHandler); + // @ts-expect-error mock method + expect(removeEventListener).toHaveBeenCalledWith('open', ws._onOpenHandler); + // @ts-expect-error mock method + expect(removeEventListener).toHaveBeenCalledWith('close', ws._onCloseHandler); + }); + }); +}); diff --git a/packages/web3-providers-ws/test/unit/jest.config.js b/packages/web3-providers-ws/test/unit/jest.config.js new file mode 100644 index 00000000000..0fb5407df6a --- /dev/null +++ b/packages/web3-providers-ws/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-providers-ws-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-providers-ws/test/unit/web_socket_provider.test.ts b/packages/web3-providers-ws/test/unit/web_socket_provider.test.ts new file mode 100644 index 00000000000..cfa68881f45 --- /dev/null +++ b/packages/web3-providers-ws/test/unit/web_socket_provider.test.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import WebSocket from 'isomorphic-ws'; +import { EthExecutionAPI, Web3APIPayload } from 'web3-types'; +import WebSocketProvider from '../../src/index'; +import { + invalidConnectionStrings, + validConnectionStrings, + wsProviderOptions, +} from '../fixtures/test_data'; + +jest.mock('isomorphic-ws'); + +describe('WebSocketProvider', () => { + let wsProvider: WebSocketProvider; + let jsonRpcPayload: Web3APIPayload; + let jsonRpcResponse: Record; + + beforeEach(() => { + jest.spyOn(WebSocket.prototype, 'send'); + + wsProvider = new WebSocketProvider('ws://localhost:8545'); + + jsonRpcPayload = { + jsonrpc: '2.0', + id: 42, + method: 'eth_getBalance', + params: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', 'latest'], + }; + jsonRpcResponse = { ...jsonRpcPayload, result: JSON.stringify(jsonRpcPayload) }; + }); + + describe('constructor', () => { + it('should construct with expected methods', () => { + expect(wsProvider.request).toBeDefined(); + expect(wsProvider.getStatus).toBeDefined(); + expect(wsProvider.supportsSubscriptions).toBeDefined(); + expect(wsProvider.request).toBeDefined(); + expect(wsProvider.on).toBeDefined(); + expect(wsProvider.removeListener).toBeDefined(); + expect(wsProvider.once).toBeDefined(); + expect(wsProvider.removeAllListeners).toBeDefined(); + expect(wsProvider.connect).toBeDefined(); + expect(wsProvider.disconnect).toBeDefined(); + expect(wsProvider.reset).toBeDefined(); + expect(wsProvider.SocketConnection).toBeInstanceOf(WebSocket); + }); + + it('should allow for providerOptions to be passed upon instantiation', () => { + expect( + () => new WebSocketProvider('ws://localhost:8545', wsProviderOptions), + ).not.toThrow(); + }); + + it.each(validConnectionStrings)( + 'should instantiation with valid client - %s', + validClient => { + expect(() => new WebSocketProvider(validClient)).not.toThrow(); + }, + ); + + it.each(invalidConnectionStrings)( + 'should instantiation with invalid client - %s', + invalidClient => { + expect( + () => + // @ts-expect-error - Purposefully passing invalid types to check validation + new WebSocketProvider(invalidClient), + ).toThrow(`Client URL "${invalidClient as unknown as string}" is invalid.`); + }, + ); + }); + + describe('supportsSubscriptions', () => { + it('should return true', () => { + expect(wsProvider.supportsSubscriptions()).toBe(true); + }); + }); + + describe('request', () => { + describe('success response', () => { + it('should return expected response', async () => { + const result = await wsProvider.request(jsonRpcPayload); + + expect(result).toEqual(jsonRpcResponse); + }); + }); + }); +}); diff --git a/packages/web3-providers-ws/tsconfig.cjs.json b/packages/web3-providers-ws/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-providers-ws/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-providers-ws/tsconfig.esm.json b/packages/web3-providers-ws/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-providers-ws/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-providers-ws/tsconfig.json b/packages/web3-providers-ws/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-providers-ws/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-providers-ws/tsconfig.types.json b/packages/web3-providers-ws/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-providers-ws/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-providers-ws/tsdoc.json b/packages/web3-providers-ws/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-providers-ws/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-providers-ws/types/index.d.ts b/packages/web3-providers-ws/types/index.d.ts deleted file mode 100644 index e8fec4bd7a5..00000000000 --- a/packages/web3-providers-ws/types/index.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -import { WebsocketProviderBase } from 'web3-core-helpers'; - -export class WebsocketProvider extends WebsocketProviderBase { } diff --git a/packages/web3-providers-ws/types/tests/web3-provider-ws-tests.ts b/packages/web3-providers-ws/types/tests/web3-provider-ws-tests.ts deleted file mode 100644 index 3d54e0f9473..00000000000 --- a/packages/web3-providers-ws/types/tests/web3-provider-ws-tests.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file web3-provider-ws-tests.ts - * @author Josh Stevens - * @date 2018 - */ - -import { WebsocketProviderOptions, JsonRpcResponse } from 'web3-core-helpers'; -import { WebsocketProvider } from 'web3-providers'; - -const options: WebsocketProviderOptions = { - timeout: 30000, - headers: { - authorization: 'Basic username:password' - } -}; - -const wsProvider = new WebsocketProvider('ws://localhost:8545', options); - -// $ExpectType boolean -wsProvider.connected; - -// $ExpectType void -wsProvider.disconnect(100, 'reason'); - -// $ExpectType void -wsProvider.reconnect(); - -// $ExpectType Map -wsProvider.requestQueue; - -// $ExpectType Map -wsProvider.responseQueue; - -// $ExpectType any -wsProvider.connection; - -// $ExpectType boolean -wsProvider.connected; - -// $ExpectType boolean -wsProvider.supportsSubscriptions(); - -// $ExpectType void -wsProvider.send({} as any, (error: Error | null) => {}); - -// $ExpectType void -wsProvider.send({} as any, (error: Error | null, result: JsonRpcResponse | undefined) => {}); - -// $ExpectType void -wsProvider.on('type', () => {}); - -// $ExpectType void -wsProvider.once('type', () => {}); - -// $ExpectType void -wsProvider.removeListener('type', () => {}); - -// $ExpectType void -wsProvider.removeAllListeners('type'); - -// $ExpectType void -wsProvider.reset(); diff --git a/packages/web3-providers-ws/types/tsconfig.json b/packages/web3-providers-ws/types/tsconfig.json deleted file mode 100644 index 74e0aeeb3a8..00000000000 --- a/packages/web3-providers-ws/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-providers": ["."] - } - } -} diff --git a/packages/web3-providers-ws/types/tslint.json b/packages/web3-providers-ws/types/tslint.json deleted file mode 100644 index 6429b0c446e..00000000000 --- a/packages/web3-providers-ws/types/tslint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false - } -} diff --git a/packages/web3-rpc-methods/.eslintignore b/packages/web3-rpc-methods/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/packages/web3-rpc-methods/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/packages/web3-rpc-methods/.eslintrc.js b/packages/web3-rpc-methods/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-rpc-methods/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-rpc-methods/.gitignore b/packages/web3-rpc-methods/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-rpc-methods/.npmignore b/packages/web3-rpc-methods/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/packages/web3-rpc-methods/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/packages/web3-rpc-methods/.npmrc b/packages/web3-rpc-methods/.npmrc new file mode 120000 index 00000000000..5cc817c4313 --- /dev/null +++ b/packages/web3-rpc-methods/.npmrc @@ -0,0 +1 @@ +../../templates/.npmrc.tmpl \ No newline at end of file diff --git a/packages/web3-rpc-methods/.prettierignore b/packages/web3-rpc-methods/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-rpc-methods/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-rpc-methods/.prettierrc.json b/packages/web3-rpc-methods/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/packages/web3-rpc-methods/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/packages/web3-rpc-methods/CHANGELOG.md b/packages/web3-rpc-methods/CHANGELOG.md new file mode 100644 index 00000000000..c2385435cac --- /dev/null +++ b/packages/web3-rpc-methods/CHANGELOG.md @@ -0,0 +1,141 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.0-alpha.1] + +### Changed + +- Updated Web3.js dependencies (#5664) + +## [0.1.0-alpha.2] + +### Changed + +- Updated dependencies (#5725) + +## [0.1.0-alpha.3] + +### Changed + +- `main` and `files` entries in `package.json` changed to `lib/` directory from `dist/` (#5739) + +## [0.1.0-alpha.4] + +### Changed + +- web3.js dependencies (#5757) + +## [1.0.0-rc.0] + +### Added + +- Added `createAccessList` functionality ( #5780 ) +- Added support of `safe` and `finalized` block tags (#5823) + +## [1.0.0-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [1.0.0-rc.2] + +### Changed + +- Dependencies updated + +## [1.0.0] + +Release Notes: + +Detailed List of change logs are mentioned under previous 1.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [1.0.1] + +### Changed + +- Dependencies updated + +## [1.0.2] + +### Fixed + +- Rpc method `getPastLogs` accept blockHash as a parameter https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs (#6181) + +## [1.1.0] + +### Added + +- A `signTypedData` method to `eth_rpc_methods` for the rpc calls `eth_signTypedData` and `eth_signTypedData_v4` (#6286) + +## [1.1.1] + +### Changed + +- Dependencies updated + +## [1.1.2] + +### Changed + +- Dependencies updated + +## [1.1.3] + +### Changed + +- Dependencies updated + +## [1.1.4] + +### Fixed + +- Fix web3-types import #6590 (#6589) + +## [1.2.0] + +### Added + +- Added `getMaxPriorityFeePerGas` method (#6748) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-rpc-methods/README.md b/packages/web3-rpc-methods/README.md new file mode 100644 index 00000000000..2b46d105286 --- /dev/null +++ b/packages/web3-rpc-methods/README.md @@ -0,0 +1,59 @@ +

+ web3.js +

+ +# Web3 RPC Methods + +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] + +This is a sub-package of [web3.js][repo]. + +`web3-rpc-methods` contains RPC methods for various ETH related protocols. + +## Installation + +You can install the package either using [NPM](https://www.npmjs.com/package/web3-rpc-methods) or using [Yarn](https://yarnpkg.com/package/web3-rpc-methods) + +### Using NPM + +```bash +npm install web3-rpc-methods +``` + +### Using Yarn + +```bash +yarn add web3-rpc-methods +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-rpc-methods +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-rpc-methods%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-rpc-methods +[downloads-image]: https://img.shields.io/npm/dm/web3-rpc-methods?label=npm%20downloads diff --git a/packages/web3-rpc-methods/assets/logo/web3js.ai b/packages/web3-rpc-methods/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-rpc-methods/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-rpc-methods/assets/logo/web3js.jpg b/packages/web3-rpc-methods/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-rpc-methods/assets/logo/web3js.jpg differ diff --git a/packages/web3-rpc-methods/assets/logo/web3js.svg b/packages/web3-rpc-methods/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-rpc-methods/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-rpc-methods/package.json b/packages/web3-rpc-methods/package.json new file mode 100644 index 00000000000..9a6605d1939 --- /dev/null +++ b/packages/web3-rpc-methods/package.json @@ -0,0 +1,63 @@ +{ + "name": "web3-rpc-methods", + "version": "1.2.0", + "description": "Ethereum RPC methods for Web3 4.x.x", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "web3-core": "^4.3.2", + "web3-types": "^1.5.0", + "web3-validator": "^2.0.4" + } +} diff --git a/packages/web3-rpc-methods/src/errors.ts b/packages/web3-rpc-methods/src/errors.ts new file mode 100644 index 00000000000..303b68944fe --- /dev/null +++ b/packages/web3-rpc-methods/src/errors.ts @@ -0,0 +1,16 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ diff --git a/packages/web3-rpc-methods/src/eth_rpc_methods.ts b/packages/web3-rpc-methods/src/eth_rpc_methods.ts new file mode 100644 index 00000000000..b33857d7d80 --- /dev/null +++ b/packages/web3-rpc-methods/src/eth_rpc_methods.ts @@ -0,0 +1,600 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3RequestManager } from 'web3-core'; +import { + Address, + BlockNumberOrTag, + Filter, + HexString32Bytes, + HexString8Bytes, + HexStringBytes, + TransactionCallAPI, + TransactionWithSenderAPI, + Uint, + Uint256, + Web3EthExecutionAPI, + Eip712TypedData, +} from 'web3-types'; +import { validator } from 'web3-validator'; + +export async function getProtocolVersion(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_protocolVersion', + params: [], + }); +} + +export async function getSyncing(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_syncing', + params: [], + }); +} + +export async function getCoinbase(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_coinbase', + params: [], + }); +} + +export async function getMining(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_mining', + params: [], + }); +} + +export async function getHashRate(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_hashrate', + params: [], + }); +} + +export async function getGasPrice(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_gasPrice', + params: [], + }); +} + +export async function getMaxPriorityFeePerGas(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_maxPriorityFeePerGas', + params: [], + }); +} + +export async function getAccounts(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_accounts', + params: [], + }); +} + +export async function getBlockNumber(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_blockNumber', + params: [], + }); +} + +export async function getBalance( + requestManager: Web3RequestManager, + address: Address, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['address', 'blockNumberOrTag'], [address, blockNumber]); + + return requestManager.send({ + method: 'eth_getBalance', + params: [address, blockNumber], + }); +} + +export async function getStorageAt( + requestManager: Web3RequestManager, + address: Address, + storageSlot: Uint256, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['address', 'hex', 'blockNumberOrTag'], [address, storageSlot, blockNumber]); + + return requestManager.send({ + method: 'eth_getStorageAt', + params: [address, storageSlot, blockNumber], + }); +} + +export async function getTransactionCount( + requestManager: Web3RequestManager, + address: Address, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['address', 'blockNumberOrTag'], [address, blockNumber]); + + return requestManager.send({ + method: 'eth_getTransactionCount', + params: [address, blockNumber], + }); +} + +export async function getBlockTransactionCountByHash( + requestManager: Web3RequestManager, + blockHash: HexString32Bytes, +) { + validator.validate(['bytes32'], [blockHash]); + + return requestManager.send({ + method: 'eth_getBlockTransactionCountByHash', + params: [blockHash], + }); +} + +export async function getBlockTransactionCountByNumber( + requestManager: Web3RequestManager, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['blockNumberOrTag'], [blockNumber]); + + return requestManager.send({ + method: 'eth_getBlockTransactionCountByNumber', + params: [blockNumber], + }); +} + +export async function getUncleCountByBlockHash( + requestManager: Web3RequestManager, + blockHash: HexString32Bytes, +) { + validator.validate(['bytes32'], [blockHash]); + + return requestManager.send({ + method: 'eth_getUncleCountByBlockHash', + params: [blockHash], + }); +} + +export async function getUncleCountByBlockNumber( + requestManager: Web3RequestManager, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['blockNumberOrTag'], [blockNumber]); + + return requestManager.send({ + method: 'eth_getUncleCountByBlockNumber', + params: [blockNumber], + }); +} + +export async function getCode( + requestManager: Web3RequestManager, + address: Address, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['address', 'blockNumberOrTag'], [address, blockNumber]); + + return requestManager.send({ + method: 'eth_getCode', + params: [address, blockNumber], + }); +} + +export async function sign( + requestManager: Web3RequestManager, + address: Address, + message: HexStringBytes, +) { + validator.validate(['address', 'hex'], [address, message]); + + return requestManager.send({ + method: 'eth_sign', + params: [address, message], + }); +} + +// TODO - Validation should be: +// isTransactionWithSender(transaction) +// ? validateTransactionWithSender(transaction) +// : validateTransactionWithSender(transaction, true) with true being a isPartial flag +export async function signTransaction( + requestManager: Web3RequestManager, + transaction: TransactionWithSenderAPI | Partial, +) { + return requestManager.send({ + method: 'eth_signTransaction', + params: [transaction], + }); +} + +// TODO - Validation should be: +// isTransactionWithSender(transaction) +// ? validateTransactionWithSender(transaction) +// : validateTransactionWithSender(transaction, true) with true being a isPartial flag +export async function sendTransaction( + requestManager: Web3RequestManager, + transaction: TransactionWithSenderAPI | Partial, +) { + return requestManager.send({ + method: 'eth_sendTransaction', + params: [transaction], + }); +} + +export async function sendRawTransaction( + requestManager: Web3RequestManager, + transaction: HexStringBytes, +) { + validator.validate(['hex'], [transaction]); + + return requestManager.send({ + method: 'eth_sendRawTransaction', + params: [transaction], + }); +} + +// TODO - validate transaction +export async function call( + requestManager: Web3RequestManager, + transaction: TransactionCallAPI, + blockNumber: BlockNumberOrTag, +) { + // validateTransactionCall(transaction); + validator.validate(['blockNumberOrTag'], [blockNumber]); + + return requestManager.send({ + method: 'eth_call', + params: [transaction, blockNumber], + }); +} + +// TODO Not sure how to best validate Partial +export async function estimateGas( + requestManager: Web3RequestManager, + transaction: Partial, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['blockNumberOrTag'], [blockNumber]); + + return requestManager.send({ + method: 'eth_estimateGas', + params: [transaction, blockNumber], + }); +} + +export async function getBlockByHash( + requestManager: Web3RequestManager, + blockHash: HexString32Bytes, + hydrated: boolean, +) { + validator.validate(['bytes32', 'bool'], [blockHash, hydrated]); + + return requestManager.send({ + method: 'eth_getBlockByHash', + params: [blockHash, hydrated], + }); +} + +export async function getBlockByNumber( + requestManager: Web3RequestManager, + blockNumber: BlockNumberOrTag, + hydrated: boolean, +) { + validator.validate(['blockNumberOrTag', 'bool'], [blockNumber, hydrated]); + + return requestManager.send({ + method: 'eth_getBlockByNumber', + params: [blockNumber, hydrated], + }); +} + +export async function getTransactionByHash( + requestManager: Web3RequestManager, + transactionHash: HexString32Bytes, +) { + validator.validate(['bytes32'], [transactionHash]); + + return requestManager.send({ + method: 'eth_getTransactionByHash', + params: [transactionHash], + }); +} + +export async function getTransactionByBlockHashAndIndex( + requestManager: Web3RequestManager, + blockHash: HexString32Bytes, + transactionIndex: Uint, +) { + validator.validate(['bytes32', 'hex'], [blockHash, transactionIndex]); + + return requestManager.send({ + method: 'eth_getTransactionByBlockHashAndIndex', + params: [blockHash, transactionIndex], + }); +} + +export async function getTransactionByBlockNumberAndIndex( + requestManager: Web3RequestManager, + blockNumber: BlockNumberOrTag, + transactionIndex: Uint, +) { + validator.validate(['blockNumberOrTag', 'hex'], [blockNumber, transactionIndex]); + + return requestManager.send({ + method: 'eth_getTransactionByBlockNumberAndIndex', + params: [blockNumber, transactionIndex], + }); +} + +export async function getTransactionReceipt( + requestManager: Web3RequestManager, + transactionHash: HexString32Bytes, +) { + validator.validate(['bytes32'], [transactionHash]); + + return requestManager.send({ + method: 'eth_getTransactionReceipt', + params: [transactionHash], + }); +} + +export async function getUncleByBlockHashAndIndex( + requestManager: Web3RequestManager, + blockHash: HexString32Bytes, + uncleIndex: Uint, +) { + validator.validate(['bytes32', 'hex'], [blockHash, uncleIndex]); + + return requestManager.send({ + method: 'eth_getUncleByBlockHashAndIndex', + params: [blockHash, uncleIndex], + }); +} + +export async function getUncleByBlockNumberAndIndex( + requestManager: Web3RequestManager, + blockNumber: BlockNumberOrTag, + uncleIndex: Uint, +) { + validator.validate(['blockNumberOrTag', 'hex'], [blockNumber, uncleIndex]); + + return requestManager.send({ + method: 'eth_getUncleByBlockNumberAndIndex', + params: [blockNumber, uncleIndex], + }); +} + +export async function getCompilers(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_getCompilers', + params: [], + }); +} + +export async function compileSolidity(requestManager: Web3RequestManager, code: string) { + validator.validate(['string'], [code]); + + return requestManager.send({ + method: 'eth_compileSolidity', + params: [code], + }); +} + +export async function compileLLL(requestManager: Web3RequestManager, code: string) { + validator.validate(['string'], [code]); + + return requestManager.send({ + method: 'eth_compileLLL', + params: [code], + }); +} + +export async function compileSerpent(requestManager: Web3RequestManager, code: string) { + validator.validate(['string'], [code]); + + return requestManager.send({ + method: 'eth_compileSerpent', + params: [code], + }); +} + +export async function newFilter(requestManager: Web3RequestManager, filter: Filter) { + validator.validate(['filter'], [filter]); + + return requestManager.send({ + method: 'eth_newFilter', + params: [filter], + }); +} + +export async function newBlockFilter(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_newBlockFilter', + params: [], + }); +} + +export async function newPendingTransactionFilter(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_newPendingTransactionFilter', + params: [], + }); +} + +export async function uninstallFilter(requestManager: Web3RequestManager, filterIdentifier: Uint) { + validator.validate(['hex'], [filterIdentifier]); + + return requestManager.send({ + method: 'eth_uninstallFilter', + params: [filterIdentifier], + }); +} + +export async function getFilterChanges(requestManager: Web3RequestManager, filterIdentifier: Uint) { + validator.validate(['hex'], [filterIdentifier]); + + return requestManager.send({ + method: 'eth_getFilterChanges', + params: [filterIdentifier], + }); +} + +export async function getFilterLogs(requestManager: Web3RequestManager, filterIdentifier: Uint) { + validator.validate(['hex'], [filterIdentifier]); + + return requestManager.send({ + method: 'eth_getFilterLogs', + params: [filterIdentifier], + }); +} + +export async function getLogs(requestManager: Web3RequestManager, filter: Filter) { + validator.validate(['filter'], [filter]); + + return requestManager.send({ + method: 'eth_getLogs', + params: [filter], + }); +} + +export async function getWork(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_getWork', + params: [], + }); +} + +export async function submitWork( + requestManager: Web3RequestManager, + nonce: HexString8Bytes, + hash: HexString32Bytes, + digest: HexString32Bytes, +) { + validator.validate(['bytes8', 'bytes32', 'bytes32'], [nonce, hash, digest]); + + return requestManager.send({ + method: 'eth_submitWork', + params: [nonce, hash, digest], + }); +} + +export async function submitHashrate( + requestManager: Web3RequestManager, + hashRate: HexString32Bytes, + id: HexString32Bytes, +) { + validator.validate(['bytes32', 'bytes32'], [hashRate, id]); + + return requestManager.send({ + method: 'eth_submitHashrate', + params: [hashRate, id], + }); +} + +export async function getFeeHistory( + requestManager: Web3RequestManager, + blockCount: Uint, + newestBlock: BlockNumberOrTag, + rewardPercentiles: number[], +) { + validator.validate(['hex', 'blockNumberOrTag'], [blockCount, newestBlock]); + + for (const rewardPercentile of rewardPercentiles) { + validator.validate(['number'], [rewardPercentile]); + } + + return requestManager.send({ + method: 'eth_feeHistory', + params: [blockCount, newestBlock, rewardPercentiles], + }); +} + +export async function getPendingTransactions( + requestManager: Web3RequestManager, +) { + return requestManager.send({ + method: 'eth_pendingTransactions', + params: [], + }); +} + +export async function requestAccounts(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_requestAccounts', + params: [], + }); +} + +export async function getChainId(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'eth_chainId', + params: [], + }); +} + +export async function getProof( + requestManager: Web3RequestManager, + address: Address, + storageKeys: HexString32Bytes[], + blockNumber: BlockNumberOrTag, +) { + validator.validate( + ['address', 'bytes32[]', 'blockNumberOrTag'], + [address, storageKeys, blockNumber], + ); + + return requestManager.send({ + method: 'eth_getProof', + params: [address, storageKeys, blockNumber], + }); +} + +export async function getNodeInfo(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'web3_clientVersion', + params: [], + }); +} + +export async function createAccessList( + requestManager: Web3RequestManager, + transaction: TransactionWithSenderAPI | Partial, + blockNumber: BlockNumberOrTag, +) { + validator.validate(['blockNumberOrTag'], [blockNumber]); + + return requestManager.send({ + method: 'eth_createAccessList', + params: [transaction, blockNumber], + }); +} + +export async function signTypedData( + requestManager: Web3RequestManager, + address: Address, + typedData: Eip712TypedData, + useLegacy = false, +): Promise { + // TODO Add validation for typedData + validator.validate(['address'], [address]); + + return requestManager.send({ + method: `eth_signTypedData${useLegacy ? '' : '_v4'}`, + params: [address, typedData], + }); +} diff --git a/packages/web3-rpc-methods/src/index.ts b/packages/web3-rpc-methods/src/index.ts new file mode 100644 index 00000000000..c2fc512f137 --- /dev/null +++ b/packages/web3-rpc-methods/src/index.ts @@ -0,0 +1,21 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import * as ethRpcMethods from './eth_rpc_methods.js'; +import * as netRpcMethods from './net_rpc_methods.js'; +import * as personalRpcMethods from './personal_rpc_methods.js'; + +export { ethRpcMethods, netRpcMethods, personalRpcMethods }; diff --git a/packages/web3-rpc-methods/src/net_rpc_methods.ts b/packages/web3-rpc-methods/src/net_rpc_methods.ts new file mode 100644 index 00000000000..7b638cf59a9 --- /dev/null +++ b/packages/web3-rpc-methods/src/net_rpc_methods.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3RequestManager } from 'web3-core'; +import { Web3NetAPI } from 'web3-types'; + +export async function getId(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'net_version', + params: [], + }); +} + +export async function getPeerCount(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'net_peerCount', + params: [], + }); +} + +export async function isListening(requestManager: Web3RequestManager) { + return requestManager.send({ + method: 'net_listening', + params: [], + }); +} diff --git a/packages/web3-rpc-methods/src/personal_rpc_methods.ts b/packages/web3-rpc-methods/src/personal_rpc_methods.ts new file mode 100644 index 00000000000..c73e1c534ab --- /dev/null +++ b/packages/web3-rpc-methods/src/personal_rpc_methods.ts @@ -0,0 +1,104 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3RequestManager } from 'web3-core'; +import { Address, EthPersonalAPI, HexString, Transaction } from 'web3-types'; + +export const getAccounts = async (requestManager: Web3RequestManager) => + requestManager.send({ + method: 'personal_listAccounts', + params: [], + }); + +export const newAccount = async ( + requestManager: Web3RequestManager, + password: string, +) => + requestManager.send({ + method: 'personal_newAccount', + params: [password], + }); + +export const unlockAccount = async ( + requestManager: Web3RequestManager, + address: Address, + password: string, + unlockDuration: number, +) => + requestManager.send({ + method: 'personal_unlockAccount', + params: [address, password, unlockDuration], + }); + +export const lockAccount = async ( + requestManager: Web3RequestManager, + address: Address, +) => + requestManager.send({ + method: 'personal_lockAccount', + params: [address], + }); + +export const importRawKey = async ( + requestManager: Web3RequestManager, + keyData: HexString, + passphrase: string, +) => + requestManager.send({ + method: 'personal_importRawKey', + params: [keyData, passphrase], + }); + +export const sendTransaction = async ( + requestManager: Web3RequestManager, + tx: Transaction, + passphrase: string, +) => + requestManager.send({ + method: 'personal_sendTransaction', + params: [tx, passphrase], + }); + +export const signTransaction = async ( + requestManager: Web3RequestManager, + tx: Transaction, + passphrase: string, +) => + requestManager.send({ + method: 'personal_signTransaction', + params: [tx, passphrase], + }); + +export const sign = async ( + requestManager: Web3RequestManager, + data: HexString, + address: Address, + passphrase: string, +) => + requestManager.send({ + method: 'personal_sign', + params: [data, address, passphrase], + }); + +export const ecRecover = async ( + requestManager: Web3RequestManager, + signedData: HexString, + signature: string, +) => + requestManager.send({ + method: 'personal_ecRecover', + params: [signedData, signature], + }); diff --git a/packages/web3-rpc-methods/test/.eslintrc.js b/packages/web3-rpc-methods/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-rpc-methods/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-rpc-methods/test/config/jest.config.js b/packages/web3-rpc-methods/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/packages/web3-rpc-methods/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/packages/web3-rpc-methods/test/config/setup.js b/packages/web3-rpc-methods/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-rpc-methods/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-rpc-methods/test/integration/jest.config.js b/packages/web3-rpc-methods/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-rpc-methods/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-rpc-methods/test/integration/setup.js b/packages/web3-rpc-methods/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-rpc-methods/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-rpc-methods/test/tsconfig.json b/packages/web3-rpc-methods/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-rpc-methods/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-rpc-methods/test/unit/constructor.test.ts b/packages/web3-rpc-methods/test/unit/constructor.test.ts new file mode 100644 index 00000000000..5d08d50bebc --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/constructor.test.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// import Web3ProviderBase from '../../src/index' +// import {ProviderOptions} from '../../types' + +describe('constructs a PLACEHOLDER instance with expected properties', () => { + // let providerOptions: ProviderOptions + + beforeEach(() => { + // providerOptions = { + // providerUrl: 'http://127.0.0.1:8545' + // } + }); + + it('should construct with expected properties', () => { + // const web3ProviderBase = new Web3ProviderBase(providerOptions) + // expect(web3ProviderBase).toMatchObject({ + // _providerUrl: providerOptions.providerUrl + // }) + expect(true).toBeTruthy(); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/call.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/call.test.ts new file mode 100644 index 00000000000..a40d68283a3 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/call.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/call'; + +jest.mock('web3-validator'); + +describe('call', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with call method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.call(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_call', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.call(requestManager, ...inputParameters); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [__, expectedBlockNumber] = inputParameters; + expect(validatorSpy).toHaveBeenCalledWith(['blockNumberOrTag'], [expectedBlockNumber]); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_lll.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_lll.test.ts new file mode 100644 index 00000000000..77829a85376 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_lll.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/compile_lll'; + +jest.mock('web3-validator'); + +describe('compileLLL', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with compileLLL method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.compileLLL(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_compileLLL', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.compileLLL(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['string'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_serpent.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_serpent.test.ts new file mode 100644 index 00000000000..2b1e2668319 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_serpent.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/compile_lll'; + +jest.mock('web3-validator'); + +describe('compileSerpent', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with compileSerpent method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.compileSerpent(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_compileSerpent', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.compileSerpent(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['string'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_solidity.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_solidity.test.ts new file mode 100644 index 00000000000..7587fa20c0f --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/compile_solidity.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/compile_solidity'; + +jest.mock('web3-validator'); + +describe('compileSolidity', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with compileSolidity method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.compileSolidity(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_compileSolidity', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.compileSolidity(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['string'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/createAccessList.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/createAccessList.test.ts new file mode 100644 index 00000000000..f90aa6e9f0f --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/createAccessList.test.ts @@ -0,0 +1,55 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/createAccessList'; + +describe('createAccessList', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with eth_createAccessList method with correct params', + async (_, inputParameters) => { + await ethRpcMethods.createAccessList(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_createAccessList', + params: inputParameters, + }); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/estimate_gas.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/estimate_gas.test.ts new file mode 100644 index 00000000000..b5873369e83 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/estimate_gas.test.ts @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/estimate_gas'; + +jest.mock('web3-validator'); + +describe('estimateGas', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with estimateGas method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.estimateGas(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_estimateGas', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.estimateGas(requestManager, ...inputParameters); + const [__, expectedBlockNumber] = inputParameters; + expect(validatorSpy).toHaveBeenCalledWith(['blockNumberOrTag'], [expectedBlockNumber]); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/call.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/call.ts new file mode 100644 index 00000000000..327a79fb8ba --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/call.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { TransactionCallAPI, BlockTags, BlockNumberOrTag } from 'web3-types'; + +export const mockRpcResponse = '0x5208'; + +const transaction: TransactionCallAPI = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transaction + * - blockNumber + */ +type TestData = [string, [TransactionCallAPI, BlockNumberOrTag]]; +export const testData: TestData[] = [ + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.LATEST`, + [transaction, BlockTags.LATEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.EARLIEST`, + [transaction, BlockTags.EARLIEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.PENDING`, + [transaction, BlockTags.PENDING], + ], + [`${JSON.stringify(transaction)}\nblockNumber = BlockTags.SAFE`, [transaction, BlockTags.SAFE]], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.FINALIZED`, + [transaction, BlockTags.FINALIZED], + ], + [`${JSON.stringify(transaction)}\nblockNumber = "0x4b7"`, [transaction, '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_lll.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_lll.ts new file mode 100644 index 00000000000..53c1ea4eeac --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_lll.ts @@ -0,0 +1,27 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - code + */ +type TestData = [string, [string]]; +export const testData: TestData[] = [ + ['code = (returnlll (suicide (caller)))', ['(returnlll (suicide (caller)))']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_serpent.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_serpent.ts new file mode 100644 index 00000000000..a3cc8c1ab53 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_serpent.ts @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - code + */ +type TestData = [string, [string]]; +export const testData: TestData[] = [['code = /* some serpent */', ['/* some serpent */']]]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_solidity.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_solidity.ts new file mode 100644 index 00000000000..84e9341e084 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/compile_solidity.ts @@ -0,0 +1,30 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - code + */ +type TestData = [string, [string]]; +export const testData: TestData[] = [ + [ + 'code = contract test { function multiply(uint a) returns(uint d) { return a * 7; } }', + ['contract test { function multiply(uint a) returns(uint d) { return a * 7; } }'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/createAccessList.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/createAccessList.ts new file mode 100644 index 00000000000..536b6781b93 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/createAccessList.ts @@ -0,0 +1,55 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, TransactionWithSenderAPI } from 'web3-types'; + +export const mockRpcResponse = + '{"accessList":[{"address":"0xc285289346689ee7cd63e4bb1a3b40f5f6e7973c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]}],"gasUsed":"0x6a5b"}'; + +const callObj: Partial = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0xc285289346689ee7cd63e4bb1a3b40f5f6e7973c', + value: '0x174876e800', + gas: '0x5208', + type: '0x2', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x9a67c8b100000000000000000000000000000000000000000000000000000000000004d0', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - callObj + * - blockNumber + */ +type TestData = [ + string, + [TransactionWithSenderAPI | Partial, BlockNumberOrTag], +]; + +export const testData: TestData[] = [ + [`${JSON.stringify(callObj)}\nblockNumber = BlockTags.LATEST`, [callObj, BlockTags.LATEST]], + [`${JSON.stringify(callObj)}\nblockNumber = BlockTags.EARLIEST`, [callObj, BlockTags.EARLIEST]], + [`${JSON.stringify(callObj)}\nblockNumber = BlockTags.PENDING`, [callObj, BlockTags.PENDING]], + [`${JSON.stringify(callObj)}\nblockNumber = BlockTags.SAFE`, [callObj, BlockTags.SAFE]], + [ + `${JSON.stringify(callObj)}\nblockNumber = BlockTags.FINALIZED`, + [callObj, BlockTags.FINALIZED], + ], + [`${JSON.stringify(callObj)}\nblockNumber = "0x4b7"`, [callObj, '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/estimate_gas.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/estimate_gas.ts new file mode 100644 index 00000000000..62f547eaa8b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/estimate_gas.ts @@ -0,0 +1,62 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { TransactionWithSenderAPI, BlockTags, BlockNumberOrTag } from 'web3-types'; + +export const mockRpcResponse = '0x5208'; + +const transaction: Partial = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', + nonce: '0x4', + chainId: '0x1', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transaction + * - blockNumber + */ +type TestData = [string, [Partial, BlockNumberOrTag]]; +export const testData: TestData[] = [ + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.LATEST`, + [transaction, BlockTags.LATEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.EARLIEST`, + [transaction, BlockTags.EARLIEST], + ], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.PENDING`, + [transaction, BlockTags.PENDING], + ], + [`${JSON.stringify(transaction)}\nblockNumber = BlockTags.SAFE`, [transaction, BlockTags.SAFE]], + [ + `${JSON.stringify(transaction)}\nblockNumber = BlockTags.FINALIZED`, + [transaction, BlockTags.FINALIZED], + ], + [`${JSON.stringify(transaction)}\nblockNumber = "0x4b7"`, [transaction, '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_balance.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_balance.ts new file mode 100644 index 00000000000..bd9a6247798 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_balance.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, BlockTags, BlockNumberOrTag } from 'web3-types'; + +export const mockRpcResponse = '0xe8d4a51000'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - blockNumber + */ +type TestData = [string, [Address, BlockNumberOrTag]]; +export const testData: TestData[] = [ + ['blockNumber = BlockTags.LATEST', [address, BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [address, BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [address, BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [address, BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [address, BlockTags.FINALIZED]], + ['blockNumber = "0x4b7"', [address, '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_by_hash.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_by_hash.ts new file mode 100644 index 00000000000..081b1192cd9 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_by_hash.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - hydrated + */ +type TestData = [string, [HexString32Bytes, boolean]]; +export const testData: TestData[] = [ + [ + 'blockNumber = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", hydrated = true', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', true], + ], + [ + 'blockNumber = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", hydrated = false', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', false], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_by_number.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_by_number.ts new file mode 100644 index 00000000000..421894fdbb7 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_by_number.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - hydrated + */ +type TestData = [string, [BlockNumberOrTag, boolean]]; +export const testData: TestData[] = [ + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', true], + ], + ['blockNumber = BlockTags.LATEST', [BlockTags.LATEST, true]], + ['blockNumber = BlockTags.EARLIEST', [BlockTags.EARLIEST, true]], + ['blockNumber = BlockTags.PENDING', [BlockTags.PENDING, true]], + ['blockNumber = BlockTags.SAFE', [BlockTags.SAFE, true]], + ['blockNumber = BlockTags.FINALIZED', [BlockTags.FINALIZED, true]], + ['blockNumber = "0x4b7"', ['0x4b7', true]], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_transaction_count_by_hash.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_transaction_count_by_hash.ts new file mode 100644 index 00000000000..a6b485b1f86 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_transaction_count_by_hash.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockHash + */ +type TestData = [string, [HexString32Bytes]]; +export const testData: TestData[] = [ + [ + 'blockNumber = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_transaction_count_by_number.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_transaction_count_by_number.ts new file mode 100644 index 00000000000..8bd2e8a04bb --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_block_transaction_count_by_number.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockTags, BlockNumberOrTag } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + */ +type TestData = [string, [BlockNumberOrTag]]; +export const testData: TestData[] = [ + ['blockNumber = BlockTags.LATEST', [BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [BlockTags.FINALIZED]], + ['blockNumber = "0x4b7"', ['0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_code.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_code.ts new file mode 100644 index 00000000000..78f2161f288 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_code.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, BlockTags, BlockNumberOrTag } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - blockNumber + */ +type TestData = [string, [Address, BlockNumberOrTag]]; +export const testData: TestData[] = [ + // blockNumber = BlockTag + ['blockNumber = BlockTags.LATEST', [address, BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [address, BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [address, BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [address, BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [address, BlockTags.FINALIZED]], + // blockNumber = Numbers + ['blockNumber = "0x4b7"', [address, '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_fee_history.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_fee_history.ts new file mode 100644 index 00000000000..c7791a1fb34 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_fee_history.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, Uint } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockCount + * - newestBlock + * - rewardPercentiles + */ +type TestData = [string, [Uint, BlockNumberOrTag, number[]]]; +export const testData: TestData[] = [ + [ + 'blockCount = "0x88df016", newestBlock = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0x88df016', '0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', [12, 4, 5]], + ], + [ + 'blockCount = "0x88df016", newestBlock = BlockTags.LATEST', + ['0x88df016', BlockTags.LATEST, []], + ], + [ + 'blockCount = "0x88df016", newestBlock = BlockTags.EARLIEST', + ['0x88df016', BlockTags.EARLIEST, []], + ], + [ + 'blockCount = "0x88df016", newestBlock = BlockTags.PENDING', + ['0x88df016', BlockTags.PENDING, []], + ], + ['blockCount = "0x88df016", newestBlock = BlockTags.SAFE', ['0x88df016', BlockTags.SAFE, []]], + [ + 'blockCount = "0x88df016", newestBlock = BlockTags.FINALIZED', + ['0x88df016', BlockTags.FINALIZED, []], + ], + ['blockCount = "0x88df016", newestBlock = "0x4b7"', ['0x88df016', '0x4b7', []]], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_filter_changes.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_filter_changes.ts new file mode 100644 index 00000000000..34d9698d645 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_filter_changes.ts @@ -0,0 +1,26 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Uint } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - filterIdentifier + */ +type TestData = [string, [Uint]]; +export const testData: TestData[] = [['filterIdentifier = "0x4b7"', ['0x4b7']]]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_filter_logs.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_filter_logs.ts new file mode 100644 index 00000000000..34d9698d645 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_filter_logs.ts @@ -0,0 +1,26 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Uint } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - filterIdentifier + */ +type TestData = [string, [Uint]]; +export const testData: TestData[] = [['filterIdentifier = "0x4b7"', ['0x4b7']]]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_logs.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_logs.ts new file mode 100644 index 00000000000..c64dee22c6d --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_logs.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Filter } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - filter + */ +type TestData = [string, [Filter]]; +export const testData: TestData[] = [ + [ + 'filter = fromBlock', + [ + { + fromBlock: '0xc0ff3', + }, + ], + ], + [ + 'filter = toBlock', + [ + { + toBlock: '0xc0ff3', + }, + ], + ], + [ + 'filter = address', + [ + { + address: '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + }, + ], + ], + [ + 'filter = address[]', + [ + { + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + }, + ], + ], + [ + 'filter = topics[]', + [ + { + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + ], + ], + [ + 'filter = fromBlock, toBlock, address[], topics[]', + [ + { + fromBlock: '0xc0ff3', + toBlock: '0xc0ff3', + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + ], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_proof.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_proof.ts new file mode 100644 index 00000000000..e3963c3ece9 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_proof.ts @@ -0,0 +1,35 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, HexString32Bytes, Uint } from 'web3-types'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - storageKey + * - blockNumber + */ +type TestData = [string, [Address, HexString32Bytes[], Uint]]; +export const testData: TestData[] = [ + [ + 'address = "0x407d73d8a49eeb85d32cf465507dd71d507100c1", storageKeys = ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"], blockNumber = "0x88"', + [address, ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b'], '0x88'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_storage_at.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_storage_at.ts new file mode 100644 index 00000000000..a098e4e7b74 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_storage_at.ts @@ -0,0 +1,49 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, Address, BlockTags, Uint256 } from 'web3-types'; + +export const mockRpcResponse = '0x033456732123ffff2342342dd12342434324234234fd234fd23fd4f23d4234'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - storageSlot + * - blockNumber + */ +type TestData = [string, [Address, Uint256, BlockNumberOrTag]]; +export const testData: TestData[] = [ + // Testing blockNumber cases + ['storageSlot = "0x4b7", blockNumber = BlockTags.LATEST', [address, '0x4b7', BlockTags.LATEST]], + [ + 'storageSlot = "0x4b7", blockNumber = BlockTags.EARLIEST', + [address, '0x4b7', BlockTags.EARLIEST], + ], + [ + 'storageSlot = "0x4b7", blockNumber = BlockTags.PENDING', + [address, '0x4b7', BlockTags.PENDING], + ], + ['storageSlot = "0x4b7", blockNumber = BlockTags.SAFE', [address, '0x4b7', BlockTags.SAFE]], + [ + 'storageSlot = "0x4b7", blockNumber = BlockTags.FINALIZED', + [address, '0x4b7', BlockTags.FINALIZED], + ], + ['storageSlot = "0x4b7", blockNumber = "0x4b7"', [address, '0x4b7', '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_block_hash_and_index.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_block_hash_and_index.ts new file mode 100644 index 00000000000..ea70cfce63b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_block_hash_and_index.ts @@ -0,0 +1,32 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes, Uint } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transactionHash + * - transactionIndex + */ +type TestData = [string, [HexString32Bytes, Uint]]; +export const testData: TestData[] = [ + [ + 'transactionHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", hydrated = true', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', '0x88'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_block_number_and_index.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_block_number_and_index.ts new file mode 100644 index 00000000000..006b65f6825 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_block_number_and_index.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags, Uint } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + * - transactionIndex + */ +type TestData = [string, [BlockNumberOrTag, Uint]]; +export const testData: TestData[] = [ + [ + 'blockNumber = "0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8"', + ['0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8', '0x88df016'], + ], + ['blockNumber = BlockTags.LATEST', [BlockTags.LATEST, '0x88df016']], + ['blockNumber = BlockTags.EARLIEST', [BlockTags.EARLIEST, '0x88df016']], + ['blockNumber = BlockTags.PENDING', [BlockTags.PENDING, '0x88df016']], + ['blockNumber = BlockTags.SAFE', [BlockTags.SAFE, '0x88df016']], + ['blockNumber = BlockTags.FINALIZED', [BlockTags.FINALIZED, '0x88df016']], + ['blockNumber = "0x4b7"', ['0x4b7', '0x88df016']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_hash.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_hash.ts new file mode 100644 index 00000000000..daede4bf5d6 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_by_hash.ts @@ -0,0 +1,35 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transactionHash + */ +type TestData = [string, [HexString32Bytes]]; +export const testData: TestData[] = [ + [ + 'transactionHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", hydrated = true', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b'], + ], + [ + 'transactionHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", hydrated = false', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_count.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_count.ts new file mode 100644 index 00000000000..78b2e69f4bb --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_count.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, Address, BlockTags } from 'web3-types'; + +export const mockRpcResponse = '0xe8d4a51000'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - blockNumber + */ +type TestData = [string, [Address, BlockNumberOrTag]]; +export const testData: TestData[] = [ + ['blockNumber = BlockTags.LATEST', [address, BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [address, BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [address, BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [address, BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [address, BlockTags.FINALIZED]], + ['blockNumber = "0x4b7"', [address, '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_receipt.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_receipt.ts new file mode 100644 index 00000000000..68b9639fe4f --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_transaction_receipt.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transactionHash + */ +type TestData = [string, [HexString32Bytes]]; +export const testData: TestData[] = [ + [ + 'transactionHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", hydrated = true', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b'], + ], + [ + 'transactionHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", hydrated = false', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_by_block_hash_and_index.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_by_block_hash_and_index.ts new file mode 100644 index 00000000000..8577efe646b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_by_block_hash_and_index.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes, Uint } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockHash + * - uncleIndex + */ +type TestData = [string, [HexString32Bytes, Uint]]; +export const testData: TestData[] = [ + [ + 'blockHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", uncleIndex = "0x88"', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', '0x88'], + ], + [ + 'blockHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", uncleIndex = "0x88"', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b', '0x88'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_count_by_block_hash.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_count_by_block_hash.ts new file mode 100644 index 00000000000..612ef639dce --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_count_by_block_hash.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockHash + */ +type TestData = [string, [HexString32Bytes]]; +export const testData: TestData[] = [ + [ + 'blockHash = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"', + ['0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_count_by_block_number.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_count_by_block_number.ts new file mode 100644 index 00000000000..40a2dfdf1d2 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/get_uncle_count_by_block_number.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { BlockNumberOrTag, BlockTags } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - blockNumber + */ +type TestData = [string, [BlockNumberOrTag]]; +export const testData: TestData[] = [ + // blockNumber = BlockTag + ['blockNumber = BlockTags.LATEST', [BlockTags.LATEST]], + ['blockNumber = BlockTags.EARLIEST', [BlockTags.EARLIEST]], + ['blockNumber = BlockTags.PENDING', [BlockTags.PENDING]], + ['blockNumber = BlockTags.SAFE', [BlockTags.SAFE]], + ['blockNumber = BlockTags.FINALIZED', [BlockTags.FINALIZED]], + // blockNumber = Numbers + ['blockNumber = "0x4b7"', ['0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/new_filter.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/new_filter.ts new file mode 100644 index 00000000000..c64dee22c6d --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/new_filter.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Filter } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - filter + */ +type TestData = [string, [Filter]]; +export const testData: TestData[] = [ + [ + 'filter = fromBlock', + [ + { + fromBlock: '0xc0ff3', + }, + ], + ], + [ + 'filter = toBlock', + [ + { + toBlock: '0xc0ff3', + }, + ], + ], + [ + 'filter = address', + [ + { + address: '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + }, + ], + ], + [ + 'filter = address[]', + [ + { + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + }, + ], + ], + [ + 'filter = topics[]', + [ + { + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + ], + ], + [ + 'filter = fromBlock, toBlock, address[], topics[]', + [ + { + fromBlock: '0xc0ff3', + toBlock: '0xc0ff3', + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + ], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/send_raw_transaction.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/send_raw_transaction.ts new file mode 100644 index 00000000000..1cc49936062 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/send_raw_transaction.ts @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexStringBytes } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transaction + */ +type TestData = [string, [HexStringBytes]]; +export const testData: TestData[] = [ + [ + 'signedTransaction = HexString', + ['0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675'], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/send_transaction.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/send_transaction.ts new file mode 100644 index 00000000000..936b846966b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/send_transaction.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { TransactionWithSenderAPI } from 'web3-types'; + +export const mockRpcResponse = '0x5208'; + +const transaction: Partial = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transaction + */ +type TestData = [string, [TransactionWithSenderAPI | Partial]]; +export const testData: TestData[] = [[`${JSON.stringify(transaction)}`, [transaction]]]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign.ts new file mode 100644 index 00000000000..a56832aac05 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, HexStringBytes } from 'web3-types'; + +export const mockRpcResponse = '0xb'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - message + */ +type TestData = [string, [Address, HexStringBytes]]; +export const testData: TestData[] = [ + [`address = ${address}, message = "0x4b7"`, [address, '0x4b7']], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign_transaction.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign_transaction.ts new file mode 100644 index 00000000000..936b846966b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign_transaction.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { TransactionWithSenderAPI } from 'web3-types'; + +export const mockRpcResponse = '0x5208'; + +const transaction: Partial = { + from: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', + to: '0x3535353535353535353535353535353535353535', + value: '0x174876e800', + gas: '0x5208', + gasPrice: '0x4a817c800', + type: '0x0', + maxFeePerGas: '0x1229298c00', + maxPriorityFeePerGas: '0x49504f80', + data: '0x', +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - transaction + */ +type TestData = [string, [TransactionWithSenderAPI | Partial]]; +export const testData: TestData[] = [[`${JSON.stringify(transaction)}`, [transaction]]]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign_typed_data.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign_typed_data.ts new file mode 100644 index 00000000000..37a5ee3171e --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/sign_typed_data.ts @@ -0,0 +1,98 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, Eip712TypedData } from 'web3-types'; + +const address = '0x407d73d8a49eeb85d32cf465507dd71d507100c1'; + +const typedData = { + types: { + EIP712Domain: [ + { + name: 'name', + type: 'string', + }, + { + name: 'version', + type: 'string', + }, + { + name: 'chainId', + type: 'uint256', + }, + { + name: 'verifyingContract', + type: 'address', + }, + ], + Person: [ + { + name: 'name', + type: 'string', + }, + { + name: 'wallet', + type: 'address', + }, + ], + Mail: [ + { + name: 'from', + type: 'Person', + }, + { + name: 'to', + type: 'Person', + }, + { + name: 'contents', + type: 'string', + }, + ], + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, +}; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - address + * - message + */ +type TestData = [string, [Address, Eip712TypedData, boolean | undefined]]; +export const testData: TestData[] = [ + ['useLegacy = undefined', [address, typedData, undefined]], + ['useLegacy = false', [address, typedData, false]], + ['useLegacy = true', [address, typedData, true]], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/submit_hashrate.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/submit_hashrate.ts new file mode 100644 index 00000000000..c41243ca1f3 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/submit_hashrate.ts @@ -0,0 +1,35 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - hashRate + * - id + */ +type TestData = [string, [HexString32Bytes, HexString32Bytes]]; +export const testData: TestData[] = [ + [ + 'hashRate = "0x0000000000000000000000000000000000000000000000000000000000500000", id = "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"', + [ + '0x0000000000000000000000000000000000000000000000000000000000500000', + '0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c', + ], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/submit_work.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/submit_work.ts new file mode 100644 index 00000000000..3757f663920 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/submit_work.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString32Bytes, HexString8Bytes } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - nonce + * - hash + * - digest + */ +type TestData = [string, [HexString8Bytes, HexString32Bytes, HexString32Bytes]]; +export const testData: TestData[] = [ + [ + 'nonce = "0x0000000000000001", hash = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", digest = "0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000"', + [ + '0x0000000000000001', + '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', + '0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000', + ], + ], +]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/uninstall_filter.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/uninstall_filter.ts new file mode 100644 index 00000000000..34d9698d645 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/fixtures/uninstall_filter.ts @@ -0,0 +1,26 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Uint } from 'web3-types'; + +/** + * Array consists of: + * - Test title + * - Input parameters: + * - filterIdentifier + */ +type TestData = [string, [Uint]]; +export const testData: TestData[] = [['filterIdentifier = "0x4b7"', ['0x4b7']]]; diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_accounts.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_accounts.test.ts new file mode 100644 index 00000000000..72ec86514bf --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_accounts.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getAccounts', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getAccounts method', async () => { + await ethRpcMethods.getAccounts(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_accounts', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_balance.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_balance.test.ts new file mode 100644 index 00000000000..e4f83d8bfa2 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_balance.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_balance'; + +jest.mock('web3-validator'); + +describe('getBalance', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getBalance method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getBalance(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBalance', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getBalance(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith( + ['address', 'blockNumberOrTag'], + inputParameters, + ); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_by_hash.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_by_hash.test.ts new file mode 100644 index 00000000000..782ba9e495f --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_by_hash.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_block_by_hash'; + +jest.mock('web3-validator'); + +describe('getBlockByHash', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getBlockByHash method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getBlockByHash(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBlockByHash', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getBlockByHash(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32', 'bool'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_by_number.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_by_number.test.ts new file mode 100644 index 00000000000..381991b4352 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_by_number.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_block_by_number'; + +jest.mock('web3-validator'); + +describe('getBlockByNumber', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getBlockByNumber method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getBlockByNumber(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBlockByNumber', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getBlockByNumber(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith( + ['blockNumberOrTag', 'bool'], + inputParameters, + ); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_number.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_number.test.ts new file mode 100644 index 00000000000..14c4146c338 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_number.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getBlockNumber', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getBlockNumber method', async () => { + await ethRpcMethods.getBlockNumber(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_blockNumber', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_transaction_count_by_hash.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_transaction_count_by_hash.test.ts new file mode 100644 index 00000000000..d8578c1f4e5 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_transaction_count_by_hash.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_block_transaction_count_by_hash'; + +jest.mock('web3-validator'); + +describe('getBlockTransactionCountByHash', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getBlockTransactionCountByHash method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getBlockTransactionCountByHash(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBlockTransactionCountByHash', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getBlockTransactionCountByHash(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_transaction_count_by_number.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_transaction_count_by_number.test.ts new file mode 100644 index 00000000000..9e092f62d0b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_block_transaction_count_by_number.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_block_transaction_count_by_number'; + +jest.mock('web3-validator'); + +describe('getBlockTransactionCountByNumber', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getBlockTransactionCountByNumber method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getBlockTransactionCountByNumber( + requestManager, + ...inputParameters, + ); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBlockTransactionCountByNumber', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getBlockTransactionCountByNumber( + requestManager, + ...inputParameters, + ); + expect(validatorSpy).toHaveBeenCalledWith(['blockNumberOrTag'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_chain_id.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_chain_id.test.ts new file mode 100644 index 00000000000..d13e893a9a2 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_chain_id.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getChainId', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getChainId method', async () => { + await ethRpcMethods.getChainId(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_chainId', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_code.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_code.test.ts new file mode 100644 index 00000000000..4c0f7327998 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_code.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_code'; + +jest.mock('web3-validator'); + +describe('getCode', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getCode method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getCode(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getCode', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getCode(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith( + ['address', 'blockNumberOrTag'], + inputParameters, + ); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_coinbase.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_coinbase.test.ts new file mode 100644 index 00000000000..3f875870fa2 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_coinbase.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getCoinbase', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getCoinbase method', async () => { + await ethRpcMethods.getCoinbase(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_coinbase', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_compilers.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_compilers.test.ts new file mode 100644 index 00000000000..bcaf636f0db --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_compilers.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getCompilers', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getCompilers method', async () => { + await ethRpcMethods.getCompilers(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getCompilers', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_fee_history.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_fee_history.test.ts new file mode 100644 index 00000000000..f5578f68d57 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_fee_history.test.ts @@ -0,0 +1,76 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_fee_history'; + +jest.mock('web3-validator'); + +describe('getFeeHistory', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getFeeHistory method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getFeeHistory(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_feeHistory', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getFeeHistory(requestManager, ...inputParameters); + const [expectedBlockCount, expectedNewestBlock, expectedRewardPercentiles] = + inputParameters; + expect(validatorSpy).toHaveBeenCalledWith( + ['hex', 'blockNumberOrTag'], + [expectedBlockCount, expectedNewestBlock], + ); + expectedRewardPercentiles.forEach(expectedRewardPercentile => { + expect(validatorSpy).toHaveBeenCalledWith(['number'], [expectedRewardPercentile]); + }); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_filter_changes.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_filter_changes.test.ts new file mode 100644 index 00000000000..418c28e3b73 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_filter_changes.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/uninstall_filter'; + +jest.mock('web3-validator'); + +describe('getFilterChanges', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getFilterChanges method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getFilterChanges(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getFilterChanges', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getFilterChanges(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_filter_logs.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_filter_logs.test.ts new file mode 100644 index 00000000000..81a6eb52b90 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_filter_logs.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/uninstall_filter'; + +jest.mock('web3-validator'); + +describe('getFilterLogs', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getFilterLogs method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getFilterLogs(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getFilterLogs', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getFilterLogs(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_gas_price.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_gas_price.test.ts new file mode 100644 index 00000000000..d96d1e04d3c --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_gas_price.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getGasPrice', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getGasPrice method', async () => { + await ethRpcMethods.getGasPrice(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_gasPrice', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_hash_rate.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_hash_rate.test.ts new file mode 100644 index 00000000000..7c7efa8fd2d --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_hash_rate.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getHashRate', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getHashRate method', async () => { + await ethRpcMethods.getHashRate(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_hashrate', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_logs.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_logs.test.ts new file mode 100644 index 00000000000..d850de4b330 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_logs.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/new_filter'; + +jest.mock('web3-validator'); + +describe('getLogs', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getLogs method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getLogs(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getLogs', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getLogs(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['filter'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_maxPriorityFeePerGas.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_maxPriorityFeePerGas.ts new file mode 100644 index 00000000000..bafe6a92c03 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_maxPriorityFeePerGas.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getMaxPriorityFeePerGas', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getMaxPriorityFeePerGas method', async () => { + await ethRpcMethods.getMaxPriorityFeePerGas(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_maxPriorityFeePerGas', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_mining.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_mining.test.ts new file mode 100644 index 00000000000..47f3a968646 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_mining.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getMining', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getMining method', async () => { + await ethRpcMethods.getMining(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_mining', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_node_info.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_node_info.test.ts new file mode 100644 index 00000000000..41d56e89fbb --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_node_info.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getNodeInfo', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getNodeInfo method', async () => { + await ethRpcMethods.getNodeInfo(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'web3_clientVersion', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_pending_transaction.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_pending_transaction.test.ts new file mode 100644 index 00000000000..4d50d55b745 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_pending_transaction.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getPendingTransactions', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getPendingTransactions method', async () => { + await ethRpcMethods.getPendingTransactions(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_pendingTransactions', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_proof.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_proof.test.ts new file mode 100644 index 00000000000..ae67f83da50 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_proof.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_proof'; + +jest.mock('web3-validator'); + +describe('getProof', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getProof method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getProof(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getProof', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getProof(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith( + ['address', 'bytes32[]', 'blockNumberOrTag'], + inputParameters, + ); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_protocol_version.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_protocol_version.test.ts new file mode 100644 index 00000000000..dd4943e2b29 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_protocol_version.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getProtocolVersion', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getProtocolVersion method', async () => { + await ethRpcMethods.getProtocolVersion(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_protocolVersion', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_storage_at.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_storage_at.test.ts new file mode 100644 index 00000000000..00eb96fa48b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_storage_at.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_storage_at'; + +jest.mock('web3-validator'); + +describe('getStorageAt', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getStorageAt method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getStorageAt(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getStorageAt', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getStorageAt(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith( + ['address', 'hex', 'blockNumberOrTag'], + inputParameters, + ); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_syncing.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_syncing.test.ts new file mode 100644 index 00000000000..176d25fe514 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_syncing.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getSyncing', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getSyncing method', async () => { + await ethRpcMethods.getSyncing(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_syncing', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_block_hash_and_index.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_block_hash_and_index.test.ts new file mode 100644 index 00000000000..879021f974b --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_block_hash_and_index.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_transaction_by_block_hash_and_index'; + +jest.mock('web3-validator'); + +describe('getTransactionByBlockHashAndIndex', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getTransactionByBlockHashAndIndex method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getTransactionByBlockHashAndIndex( + requestManager, + ...inputParameters, + ); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getTransactionByBlockHashAndIndex', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getTransactionByBlockHashAndIndex( + requestManager, + ...inputParameters, + ); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32', 'hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_block_number_and_index.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_block_number_and_index.test.ts new file mode 100644 index 00000000000..25d37df2058 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_block_number_and_index.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_transaction_by_block_number_and_index'; + +jest.mock('web3-validator'); + +describe('getTransactionByBlockNumberAndIndex', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getTransactionByBlockNumberAndIndex method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getTransactionByBlockNumberAndIndex( + requestManager, + ...inputParameters, + ); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getTransactionByBlockNumberAndIndex', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getTransactionByBlockNumberAndIndex( + requestManager, + ...inputParameters, + ); + expect(validatorSpy).toHaveBeenCalledWith(['blockNumberOrTag', 'hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_hash.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_hash.test.ts new file mode 100644 index 00000000000..f9041c60b6a --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_by_hash.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_transaction_by_hash'; + +jest.mock('web3-validator'); + +describe('getTransactionByHash', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getTransactionByHash method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getTransactionByHash(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getTransactionByHash', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getTransactionByHash(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_count.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_count.test.ts new file mode 100644 index 00000000000..6136449a8d0 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_count.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_transaction_count'; + +jest.mock('web3-validator'); + +describe('getTransactionCount', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getTransactionCount method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getTransactionCount(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getTransactionCount', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getTransactionCount(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith( + ['address', 'blockNumberOrTag'], + inputParameters, + ); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_receipt.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_receipt.test.ts new file mode 100644 index 00000000000..a0be658ec07 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_transaction_receipt.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_transaction_receipt'; + +jest.mock('web3-validator'); + +describe('getTransactionReceipt', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getTransactionReceipt method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getTransactionReceipt(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getTransactionReceipt', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getTransactionReceipt(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_by_block_hash_and_index.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_by_block_hash_and_index.test.ts new file mode 100644 index 00000000000..11ffc9e7b97 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_by_block_hash_and_index.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_uncle_by_block_hash_and_index'; + +jest.mock('web3-validator'); + +describe('getUncleByBlockHashAndIndex', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getUncleByBlockHashAndIndex method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getUncleByBlockHashAndIndex(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getUncleByBlockHashAndIndex', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getUncleByBlockHashAndIndex(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32', 'hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_count_by_block_hash.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_count_by_block_hash.test.ts new file mode 100644 index 00000000000..be943e95e93 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_count_by_block_hash.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_uncle_count_by_block_hash'; + +jest.mock('web3-validator'); + +describe('getUncleCountByBlockHash', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getUncleCountByBlockHash method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getUncleCountByBlockHash(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getUncleCountByBlockHash', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getUncleCountByBlockHash(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_count_by_block_number.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_count_by_block_number.test.ts new file mode 100644 index 00000000000..f9e0c6fb0b7 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_uncle_count_by_block_number.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/get_uncle_count_by_block_number'; + +jest.mock('web3-validator'); + +describe('getUncleCountByBlockNumber', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with getUncleCountByBlockNumber method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.getUncleCountByBlockNumber(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getUncleCountByBlockNumber', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.getUncleCountByBlockNumber(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['blockNumberOrTag'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_work.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_work.test.ts new file mode 100644 index 00000000000..ea3dbfca890 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/get_work.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('getWork', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with getWork method', async () => { + await ethRpcMethods.getWork(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getWork', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_block_filter.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_block_filter.test.ts new file mode 100644 index 00000000000..47d702a1be1 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_block_filter.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('newBlockFilter', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with newBlockFilter method', async () => { + await ethRpcMethods.newBlockFilter(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_newBlockFilter', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_filter.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_filter.test.ts new file mode 100644 index 00000000000..fbcfe892a27 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_filter.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/new_filter'; + +jest.mock('web3-validator'); + +describe('newFilter', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with newFilter method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.newFilter(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_newFilter', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.newFilter(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['filter'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_pending_transaction_filter.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_pending_transaction_filter.test.ts new file mode 100644 index 00000000000..bd31ab4184d --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/new_pending_transaction_filter.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('newPendingTransactionFilter', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with newPendingTransactionFilter method', async () => { + await ethRpcMethods.newPendingTransactionFilter(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_newPendingTransactionFilter', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/request_accounts.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/request_accounts.test.ts new file mode 100644 index 00000000000..5149ed5b32e --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/request_accounts.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; + +import { ethRpcMethods } from '../../../src/index'; + +describe('requestAccounts', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it('should call requestManager.send with requestAccounts method', async () => { + await ethRpcMethods.requestAccounts(requestManager); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_requestAccounts', + params: [], + }); + }); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/send_raw_transaction.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/send_raw_transaction.test.ts new file mode 100644 index 00000000000..2a4dea00ae0 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/send_raw_transaction.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/send_raw_transaction'; + +jest.mock('web3-validator'); + +describe('sendRawTransaction', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with sendRawTransaction method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.sendRawTransaction(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_sendRawTransaction', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.sendRawTransaction(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/send_transaction.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/send_transaction.test.ts new file mode 100644 index 00000000000..6e916be8904 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/send_transaction.test.ts @@ -0,0 +1,69 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/send_transaction'; + +jest.mock('web3-validator'); + +describe('sendTransaction', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with sendTransaction method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.sendTransaction(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_sendTransaction', + params: inputParameters, + }); + }, + ); + + // TODO Validation for sendTransaction method not implemented + it.skip.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.sendTransaction(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith([''], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign.test.ts new file mode 100644 index 00000000000..634135faebf --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/sign'; + +jest.mock('web3-validator'); + +describe('sign', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with sign method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.sign(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_sign', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.sign(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['address', 'hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign_transaction.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign_transaction.test.ts new file mode 100644 index 00000000000..861efac5998 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign_transaction.test.ts @@ -0,0 +1,69 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/sign_transaction'; + +jest.mock('web3-validator'); + +describe('signTransaction', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with signTransaction method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.signTransaction(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_signTransaction', + params: inputParameters, + }); + }, + ); + + // TODO Validation for signTransaction method not implemented + it.skip.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.signTransaction(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith([''], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign_typed_data.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign_typed_data.test.ts new file mode 100644 index 00000000000..a9674a8d381 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/sign_typed_data.test.ts @@ -0,0 +1,54 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/sign_typed_data'; + +jest.mock('web3-validator'); + +describe('signTypedData', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with signTypedData method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.signTypedData(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: `eth_signTypedData${inputParameters[2] ? '' : '_v4'}`, + params: [inputParameters[0], inputParameters[1]], + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.signTypedData(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['address'], [inputParameters[0]]); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/submit_hashrate.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/submit_hashrate.test.ts new file mode 100644 index 00000000000..a933733f0be --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/submit_hashrate.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/submit_hashrate'; + +jest.mock('web3-validator'); + +describe('submitHashrate', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with submitHashrate method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.submitHashrate(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_submitHashrate', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.submitHashrate(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['bytes32', 'bytes32'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/submit_work.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/submit_work.test.ts new file mode 100644 index 00000000000..6ec44aa6fef --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/submit_work.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/submit_work'; + +jest.mock('web3-validator'); + +describe('submitWork', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with submitWork method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.submitWork(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_submitWork', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.submitWork(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith( + ['bytes8', 'bytes32', 'bytes32'], + inputParameters, + ); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/eth_rpc_methods/uninstall_filter.test.ts b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/uninstall_filter.test.ts new file mode 100644 index 00000000000..10fda048587 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/eth_rpc_methods/uninstall_filter.test.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// web3.js is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// web3.js 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 Lesser General Public License for more details. + +// You should have received a copy of the GNU Lesser General Public License +// along with web3.js. If not, see . +// */ +import { Web3RequestManager } from 'web3-core'; +import { validator } from 'web3-validator'; + +import { ethRpcMethods } from '../../../src/index'; +import { testData } from './fixtures/uninstall_filter'; + +jest.mock('web3-validator'); + +describe('uninstallFilter', () => { + let requestManagerSendSpy: jest.Mock; + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager('http://127.0.0.1:8545'); + requestManagerSendSpy = jest.fn(); + requestManager.send = requestManagerSendSpy; + }); + + it.each(testData)( + 'should call requestManager.send with uninstallFilter method and expect parameters\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + await ethRpcMethods.uninstallFilter(requestManager, ...inputParameters); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_uninstallFilter', + params: inputParameters, + }); + }, + ); + + it.each(testData)( + 'should call validator.validate with expected params\n Title: %s\n Input parameters: %s', + async (_, inputParameters) => { + const validatorSpy = jest.spyOn(validator, 'validate'); + await ethRpcMethods.uninstallFilter(requestManager, ...inputParameters); + expect(validatorSpy).toHaveBeenCalledWith(['hex'], inputParameters); + }, + ); +}); diff --git a/packages/web3-rpc-methods/test/unit/jest.config.js b/packages/web3-rpc-methods/test/unit/jest.config.js new file mode 100644 index 00000000000..35542a2b387 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-rpc-methods-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-rpc-methods/test/unit/net_rpc_methods.test.ts b/packages/web3-rpc-methods/test/unit/net_rpc_methods.test.ts new file mode 100644 index 00000000000..588600a1ce1 --- /dev/null +++ b/packages/web3-rpc-methods/test/unit/net_rpc_methods.test.ts @@ -0,0 +1,62 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3RequestManager } from 'web3-core'; +import { Web3NetAPI } from 'web3-types'; + +import { netRpcMethods } from '../../src/index'; + +describe('rpc_methods', () => { + const requestManagerSendSpy = jest.fn(); + + let requestManager: Web3RequestManager; + + beforeAll(() => { + requestManager = new Web3RequestManager(); + requestManager.setProvider('http://127.0.0.1:8545'); + requestManager.send = requestManagerSendSpy; + }); + + describe('should make call with expected parameters', () => { + it('getId', async () => { + await netRpcMethods.getId(requestManager); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'net_version', + params: [], + }); + }); + + it('getPeerCount', async () => { + await netRpcMethods.getPeerCount(requestManager); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'net_peerCount', + params: [], + }); + }); + + it('isListening', async () => { + await netRpcMethods.isListening(requestManager); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'net_listening', + params: [], + }); + }); + }); +}); diff --git a/packages/web3-rpc-methods/tsconfig.cjs.json b/packages/web3-rpc-methods/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-rpc-methods/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-rpc-methods/tsconfig.esm.json b/packages/web3-rpc-methods/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-rpc-methods/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-rpc-methods/tsconfig.types.json b/packages/web3-rpc-methods/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-rpc-methods/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-rpc-methods/tsdoc.json b/packages/web3-rpc-methods/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-rpc-methods/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-shh/README.md b/packages/web3-shh/README.md deleted file mode 100644 index b940a8dc9a9..00000000000 --- a/packages/web3-shh/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# web3-shh - -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] - -This is a sub-package of [web3.js][repo] - -This is the whisper v5 package. - -Please read the [documentation][docs] for more. - -## Installation - -### Node.js - -```bash -npm install web3-shh -``` - -## Usage - -```js -const Web3Personal = require('web3-shh'); - -const shh = new Web3Personal('ws://localhost:8546'); -``` - -## Types - -All the TypeScript typings are placed in the `types` folder. - -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-shh.svg -[npm-url]: https://npmjs.org/package/web3-shh -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-shh -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-shh -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-shh -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-shh diff --git a/packages/web3-shh/package-lock.json b/packages/web3-shh/package-lock.json deleted file mode 100644 index b703f040e71..00000000000 --- a/packages/web3-shh/package-lock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "web3-shh", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "12.12.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz", - "integrity": "sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA==", - "dev": true - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3-shh/package.json b/packages/web3-shh/package.json deleted file mode 100644 index 9030258f851..00000000000 --- a/packages/web3-shh/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "web3-shh", - "version": "1.3.0", - "description": "Web3 module to interact with the Whisper messaging protocol.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-shh", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "web3-core": "1.3.0", - "web3-core-method": "1.3.0", - "web3-core-subscriptions": "1.3.0", - "web3-net": "1.3.0" - }, - "devDependencies": { - "@types/node": "^12.12.6", - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } -} diff --git a/packages/web3-shh/src/index.js b/packages/web3-shh/src/index.js deleted file mode 100644 index dc7e4d6fdab..00000000000 --- a/packages/web3-shh/src/index.js +++ /dev/null @@ -1,201 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -"use strict"; - -var core = require('web3-core'); -var Subscriptions = require('web3-core-subscriptions').subscriptions; -var Method = require('web3-core-method'); -// var formatters = require('web3-core-helpers').formatters; -var Net = require('web3-net'); - - -var Shh = function Shh() { - var _this = this; - - // sets _requestmanager - core.packageInit(this, arguments); - - // overwrite package setRequestManager - var setRequestManager = this.setRequestManager; - this.setRequestManager = function (manager) { - setRequestManager(manager); - - _this.net.setRequestManager(manager); - - return true; - }; - - // overwrite setProvider - var setProvider = this.setProvider; - this.setProvider = function () { - setProvider.apply(_this, arguments); - - _this.setRequestManager(_this._requestManager); - }; - - this.net = new Net(this); - - [ - new Subscriptions({ - name: 'subscribe', - type: 'shh', - subscriptions: { - 'messages': { - params: 1 - // inputFormatter: [formatters.inputPostFormatter], - // outputFormatter: formatters.outputPostFormatter - } - } - }), - - new Method({ - name: 'getVersion', - call: 'shh_version', - params: 0 - }), - new Method({ - name: 'getInfo', - call: 'shh_info', - params: 0 - }), - new Method({ - name: 'setMaxMessageSize', - call: 'shh_setMaxMessageSize', - params: 1 - }), - new Method({ - name: 'setMinPoW', - call: 'shh_setMinPoW', - params: 1 - }), - new Method({ - name: 'markTrustedPeer', - call: 'shh_markTrustedPeer', - params: 1 - }), - new Method({ - name: 'newKeyPair', - call: 'shh_newKeyPair', - params: 0 - }), - new Method({ - name: 'addPrivateKey', - call: 'shh_addPrivateKey', - params: 1 - }), - new Method({ - name: 'deleteKeyPair', - call: 'shh_deleteKeyPair', - params: 1 - }), - new Method({ - name: 'hasKeyPair', - call: 'shh_hasKeyPair', - params: 1 - }), - new Method({ - name: 'getPublicKey', - call: 'shh_getPublicKey', - params: 1 - }), - new Method({ - name: 'getPrivateKey', - call: 'shh_getPrivateKey', - params: 1 - }), - new Method({ - name: 'newSymKey', - call: 'shh_newSymKey', - params: 0 - }), - new Method({ - name: 'addSymKey', - call: 'shh_addSymKey', - params: 1 - }), - new Method({ - name: 'generateSymKeyFromPassword', - call: 'shh_generateSymKeyFromPassword', - params: 1 - }), - new Method({ - name: 'hasSymKey', - call: 'shh_hasSymKey', - params: 1 - }), - new Method({ - name: 'getSymKey', - call: 'shh_getSymKey', - params: 1 - }), - new Method({ - name: 'deleteSymKey', - call: 'shh_deleteSymKey', - params: 1 - }), - - new Method({ - name: 'newMessageFilter', - call: 'shh_newMessageFilter', - params: 1 - }), - new Method({ - name: 'getFilterMessages', - call: 'shh_getFilterMessages', - params: 1 - }), - new Method({ - name: 'deleteMessageFilter', - call: 'shh_deleteMessageFilter', - params: 1 - }), - - new Method({ - name: 'post', - call: 'shh_post', - params: 1, - inputFormatter: [null] - }), - - new Method({ - name: 'unsubscribe', - call: 'shh_unsubscribe', - params: 1 - }) - ].forEach(function(method) { - method.attachToObject(_this); - method.setRequestManager(_this._requestManager); - }); -}; - -Shh.prototype.clearSubscriptions = function () { - this._requestManager.clearSubscriptions(); -}; - -core.addProviders(Shh); - - - -module.exports = Shh; - - diff --git a/packages/web3-shh/tsconfig.json b/packages/web3-shh/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-shh/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-shh/types/index.d.ts b/packages/web3-shh/types/index.d.ts deleted file mode 100644 index a6954080a53..00000000000 --- a/packages/web3-shh/types/index.d.ts +++ /dev/null @@ -1,199 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens , Samuel Furter - * @date 2018 - */ - -import * as net from 'net'; -import { BatchRequest, provider, Providers, Extension } from 'web3-core'; -import { Network } from 'web3-net'; - -export class Shh { - constructor(); - constructor(provider: provider); - constructor(provider: provider, net: net.Socket); - - readonly givenProvider: any; - static readonly givenProvider: any; - static readonly providers: Providers; - readonly currentProvider: provider; - BatchRequest: new () => BatchRequest; - - setProvider(provider: provider): boolean; - - extend(extension: Extension): any; - - net: Network; - - getVersion( - callback?: (error: Error, version: string) => void - ): Promise; - - getInfo(callback?: (error: Error, info: Info) => void): Promise; - - setMaxMessageSize( - size: number, - callback?: (error: Error, result: boolean) => void - ): Promise; - - setMinPoW( - pow: number, - callback?: (error: Error, result: boolean) => void - ): Promise; - - markTrustedPeer( - enode: string, - callback?: (error: Error, result: boolean) => void - ): Promise; - - newKeyPair(callback?: (error: Error, key: string) => void): Promise; - - addPrivateKey( - privateKey: string, - callback?: (error: Error, privateKey: string) => void - ): Promise; - - deleteKeyPair( - id: string, - callback?: (error: Error, result: boolean) => void - ): Promise; - - hasKeyPair( - id: string, - callback?: (error: Error, result: boolean) => void - ): Promise; - - getPublicKey( - id: string, - callback?: (error: Error, publicKey: string) => void - ): Promise; - - getPrivateKey( - id: string, - callback?: (error: Error, privateKey: string) => void - ): Promise; - - newSymKey(callback?: (error: Error, key: string) => void): Promise; - - addSymKey( - symKey: string, - callback?: (error: Error, key: string) => void - ): Promise; - - generateSymKeyFromPassword( - password: string, - callback?: (error: Error, key: string) => void - ): Promise; - - hasSymKey( - id: string, - callback?: (error: Error, result: boolean) => void - ): Promise; - - getSymKey( - id: string, - callback?: (error: Error, key: string) => void - ): Promise; - - deleteSymKey( - id: string, - callback?: (error: Error, result: boolean) => void - ): Promise; - - post( - object: PostWithSymKey | PostWithPubKey, - callback?: (error: Error, result: string) => void - ): Promise; - - subscribe( - string: 'messages', - options: SubscriptionOptions, - callback?: ( - error: Error, - message: Notification, - subscription: any - ) => void - ): Subscribe; - - newMessageFilter( - options?: SubscriptionOptions, - callback?: (error: Error, result: string) => void - ): Promise; - - deleteMessageFilter( - id: string, - callback?: (error: Error, result: string) => void - ): Promise; - - getFilterMessages( - id: string, - callback?: (error: Error, result: string) => void - ): Promise; -} - -export interface Info { - messages: number; - maxMessageSize: number; - memory: number; - minPow: number; -} - -export interface PostBase { - sig?: string; - ttl: number; - topic: string; - payload: string; - padding?: number; - powTime?: number; - powTarget?: number; - targetPeer?: number; -} - -export interface PostWithSymKey extends PostBase { - symKeyID: string; -} - -export interface PostWithPubKey extends PostBase { - pubKey: string; -} - -export interface SubscriptionOptions { - symKeyID?: string; - privateKeyID?: string; - sig?: string; - topics?: string[]; - minPow?: number; - allowP2P?: boolean; - ttl?: number; -} - -export interface Notification { - hash: string; - sig?: string; - recipientPublicKey?: string; - timestamp: string; - ttl: number; - topic: string; - payload: string; - padding: number; - pow: number; -} - -export interface Subscribe { - on(type: 'data', handler: (data: Notification) => void): void; - - on(type: 'error', handler: (data: Error) => void): void; -} diff --git a/packages/web3-shh/types/tests/shh-test.ts b/packages/web3-shh/types/tests/shh-test.ts deleted file mode 100644 index ec7022f234c..00000000000 --- a/packages/web3-shh/types/tests/shh-test.ts +++ /dev/null @@ -1,254 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file shh-tests.ts - * @author Josh Stevens - * @date 2018 - */ - -import { Info, Notification, Shh } from 'web3-shh'; - -// $ExpectType Shh -const shh_empty = new Shh(); - -// $ExpectType Shh -const shh = new Shh('https://localhost:5000'); - -// $ExpectType provider -shh.currentProvider; - -// $ExpectType any -Shh.givenProvider; - -// $ExpectType any -shh.givenProvider; - -// $ExpectType boolean -shh.setProvider('https://localhost:2100'); - -// $ExpectType BatchRequest -new shh.BatchRequest(); - -// $ExpectType any -shh.extend({property: 'test', methods: [{name: 'method', call: 'method'}]}); - -// $ExpectType Promise -shh.net.getId(); -// $ExpectType Promise -shh.net.getId((error: Error, id: number) => {}); - -// $ExpectType Promise -shh.net.isListening(); -// $ExpectType Promise -shh.net.isListening((error: Error, listening: boolean) => {}); - -// $ExpectType Promise -shh.net.getPeerCount(); -// $ExpectType Promise -shh.net.getPeerCount((error: Error, peerCount: number) => {}); - -// $ExpectType Promise -shh.getVersion(); -// $ExpectType Promise -shh.getVersion((error: Error, version: string) => {}); - -// $ExpectType Promise -shh.getInfo(); -// $ExpectType Promise -shh.getInfo((error: Error, info: Info) => {}); - -// $ExpectType Promise -shh.setMaxMessageSize(1234565); -// $ExpectType Promise -shh.setMaxMessageSize(1234565, (error: Error, result: boolean) => {}); - -// $ExpectType Promise -shh.setMinPoW(0.9); -// $ExpectType Promise -shh.setMinPoW(0.9, (error: Error, result: boolean) => {}); - -// $ExpectType Promise -shh.markTrustedPeer('test'); -// $ExpectType Promise -shh.markTrustedPeer('test', (error: Error, result: boolean) => {}); - -// $ExpectType Promise -shh.newKeyPair(); -// $ExpectType Promise -shh.newKeyPair((error: Error, key: string) => {}); - -// $ExpectType Promise -shh.addPrivateKey( - '0x8bda3abeb454847b515fa9b404cede50b1cc63cfdeddd4999d074284b4c21e15' -); -// $ExpectType Promise -shh.addPrivateKey( - '0x8bda3abeb454847b515fa9b404cede50b1cc63cfdeddd4999d074284b4c21e15', - (error: Error, privateKey: string) => {} -); - -// $ExpectType Promise -shh.deleteKeyPair( - '3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f' -); -// $ExpectType Promise -shh.deleteKeyPair( - '3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - (error: Error, result: boolean) => {} -); - -// $ExpectType Promise -shh.hasKeyPair( - 'fe22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f' -); -// $ExpectType Promise -shh.hasKeyPair( - 'fe22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - (error: Error, result: boolean) => {} -); - -// $ExpectType Promise -shh.getPublicKey( - '3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f' -); -// $ExpectType Promise -shh.getPublicKey( - '3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - (error: Error, publicKey: string) => {} -); - -// $ExpectType Promise -shh.getPrivateKey( - '3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f' -); -// $ExpectType Promise -shh.getPrivateKey( - '3e22b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - (error: Error, privateKey: string) => {} -); - -// $ExpectType Promise -shh.newSymKey(); -// $ExpectType Promise -shh.newSymKey((error: Error, key: string) => {}); - -// $ExpectType Promise -shh.addSymKey( - '0x5e11b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f' -); -// $ExpectType Promise -shh.addSymKey( - '0x5e11b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - (error: Error, key: string) => {} -); - -// $ExpectType Promise -shh.generateSymKeyFromPassword('Never use this password - password!'); -// $ExpectType Promise -shh.generateSymKeyFromPassword( - 'Never use this password - password!', - (error: Error, key: string) => {} -); - -// $ExpectType Promise -shh.hasSymKey( - 'f6dcf21ed6a17bd78d8c4c63195ab997b3b65ea683705501eae82d32667adc92' -); -// $ExpectType Promise -shh.hasSymKey( - 'f6dcf21ed6a17bd78d8c4c63195ab997b3b65ea683705501eae82d32667adc92', - (error: Error, result: boolean) => {} -); - -// $ExpectType Promise -shh.getSymKey( - 'af33b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f' -); -// $ExpectType Promise -shh.getSymKey( - 'af33b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - (error: Error, key: string) => {} -); - -// $ExpectType Promise -shh.deleteSymKey( - 'bf31b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f' -); -// $ExpectType Promise -shh.deleteSymKey( - 'bf31b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - (error: Error, result: boolean) => {} -); - -// $ExpectType Promise -shh.post({ - symKeyID: 'sd3', - sig: 'sds5', - ttl: 10, - topic: '0xffaadd11', - payload: '0xffffffdddddd1122', - powTime: 3, - powTarget: 0.5 -}); -// $ExpectType Promise -shh.post( - { - symKeyID: 'sd3', - sig: 'sds5', - ttl: 10, - topic: '0xffaadd11', - payload: '0xffffffdddddd1122', - powTime: 3, - powTarget: 0.5 - }, - (error: Error, result: string) => {} -); - -// $ExpectType Subscribe -shh.subscribe('messages', { - symKeyID: - 'bf31b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - sig: - '0x04d1574d4eab8f3dde4d2dc7ed2c4d699d77cbbdd09167b8fffa099652ce4df00c4c6e0263eafe05007a46fdf0c8d32b11aeabcd3abbc7b2bc2bb967368a68e9c6', - ttl: 20, - topics: ['0xffddaa11'], - minPow: 0.8 -}); -// $ExpectType Subscribe -shh.subscribe( - 'messages', - { - symKeyID: - 'bf31b9ffc2387e18636e0a3d0c56b023264c16e78a2adcba1303cefc685e610f', - sig: - '0x04d1574d4eab8f3dde4d2dc7ed2c4d699d77cbbdd09167b8fffa099652ce4df00c4c6e0263eafe05007a46fdf0c8d32b11aeabcd3abbc7b2bc2bb967368a68e9c6', - ttl: 20, - topics: ['0xffddaa11'], - minPow: 0.8 - }, - (error: Error, message: Notification, subscription: any) => {} -); - -// $ExpectType Promise -shh.newMessageFilter(); - -// $ExpectType Promise -shh.deleteMessageFilter( - '2b47fbafb3cce24570812a82e6e93cd9e2551bbc4823f6548ff0d82d2206b326' -); - -// $ExpectType Promise -shh.getFilterMessages( - '2b47fbafb3cce24570812a82e6e93cd9e2551bbc4823f6548ff0d82d2206b326' -); diff --git a/packages/web3-shh/types/tsconfig.json b/packages/web3-shh/types/tsconfig.json deleted file mode 100644 index 5129cd82394..00000000000 --- a/packages/web3-shh/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-shh": ["."] - } - } -} diff --git a/packages/web3-shh/types/tslint.json b/packages/web3-shh/types/tslint.json deleted file mode 100644 index 871d605704b..00000000000 --- a/packages/web3-shh/types/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false - } -} diff --git a/packages/web3-types/.eslintignore b/packages/web3-types/.eslintignore new file mode 100644 index 00000000000..e3d7e665285 --- /dev/null +++ b/packages/web3-types/.eslintignore @@ -0,0 +1,4 @@ +dist +lib +jest.config.js +.eslintrc.js diff --git a/packages/web3-types/.eslintrc.js b/packages/web3-types/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-types/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-types/.gitignore b/packages/web3-types/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-types/.npmignore b/packages/web3-types/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-types/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-types/.prettierignore b/packages/web3-types/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-types/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-types/.prettierrc.json b/packages/web3-types/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-types/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-types/CHANGELOG.md b/packages/web3-types/CHANGELOG.md new file mode 100644 index 00000000000..05c944dc38c --- /dev/null +++ b/packages/web3-types/CHANGELOG.md @@ -0,0 +1,192 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.1-alpha.1] + +### Added + +- `Web3EthExecutionAPI` export (#5441) +- `Web3NetAPI` export (#5441) +- `EthPersonalAPI` export (#5441) + +### Changed + +- `Web3APISpec`, `Web3APIMethod`, and `Web3APIParams` now supports `unknown` APIs (#5393) + +## [0.1.1-alpha.2] + +### Added + +- These types were moved from `web3-eth-accounts` to `web3-types` package: Cipher, CipherOptions, ScryptParams, PBKDF2SHA256Params, KeyStore (#5581 ) + +### Fixed + +- Make the `request` method of `EIP1193Provider` class, compatible with EIP 1193 (#5591) + +## [0.1.1-alpha.3] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) +- These types were added: ProviderRpcError, EthSubscription, ProviderMessage, ProviderConnectInfo (#5683) + +## [0.1.1-alpha.4] + +### Added + +- Add `TransactionWithFromLocalWalletIndex`, `TransactionWithToLocalWalletIndex` and `TransactionWithFromAndToLocalWalletIndex` types (#5731) + +## [1.0.0-rc.0] + +### Added + +- Added types from `web3-eth-abi` and `TypedArray` from (#5771) +- Added `TypedArray` from `web3-utils` and `web3-validator` (it was defined twice) (#5771) +- Added `safe` and `finalized` block tags in `BlockTags` and `BlockTag` types (#5823) + +## [1.0.0-rc.1] + +### Added + +- Added hybrid build (ESM and CJS) of library (#5904) +- Added source files (#5956) + +### Changed + +- `data` property in `TransactionOutput` was renamed to `input` (#5915) +- The method `signTransaction` inside `Web3BaseWalletAccount` is now utilizing the type `Transaction` for its argument. (#5993) +- The types `FMT_NUMBER`, `NumberTypes`, `FMT_BYTES`, `ByteTypes`, `DataFormat`, `DEFAULT_RETURN_FORMAT`, `ETH_DATA_FORMAT` and `FormatType` moved from `web3-utils`. (#5993) +- The types `ContractInitOptions`, `NonPayableCallOptions` and `PayableCallOptions` are moved from `web3-eth-contract`. (#5993) + +## [1.0.0-rc.2] + +### Added + +- Added `filters` param to the `Filter` type (#6010) +- Added types `JsonRpcSubscriptionResultOld`, `Web3ProviderMessageEventCallback`. Added `.on('data')` type support for old providers (#6082) +- Export for `HardforksOrdered` enum (#6102) +- Export for `Web3ValidationErrorObject` type (#6102) + +### Changed + +- Removed chainId, to, data & input properties from NonPayableCallOptions +- Replaced Buffer for Uint8Array (#6004) +- types `FMT_BYTES.BUFFER`, `Bytes` and `FormatType` and encryption option types for `salt` and `iv` has replaced support for `Buffer` for `Uint8Array` (#6004) +- Added `internalType` property to the `AbiParameter` type. + +## [1.0.0] + +Release Notes: + +Detailed List of change logs are mentioned under previous 1.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [1.0.1] + +### Added + +- Added the `SimpleProvider` interface which has only `request(args)` method that is compatible with EIP-1193 (#6210) +- Added the `Eip1193EventName` type that contains the possible events names according to EIP-1193 (#6210) + +### Changed + +- The `EIP1193Provider` class has now all the events (for `on` and `removeListener`) according to EIP-1193 (#6210) + +### Fixed + +- Fixed bug #6185, now web3.js compiles on typescript v5 (#6195) + +## [1.0.2] + +### Fixed + +- type `Filter` includes `blockHash` (#6206) + +## [1.1.0] + +### Changed + +- `input` and `data` are now optional properties on `PopulatedUnsignedBaseTransaction` (previously `input` was a required property, and `data` was not available) (#6294) + +### Added + +- `eth_signTypedData` and `eth_signTypedData_v4` to `web3_eth_execution_api` (#6286) +- `Eip712TypeDetails` and `Eip712TypedData` to `eth_types` (#6286) + +## [1.1.1] + +### Changed + +- Dependencies updated + +## [1.2.0] + +### Added + +- add `asEIP1193Provider` to `Web3BaseProvider` so every inherited class can have the returned value of `request` method, fully compatible with EIP-1193. (#6407) + + +## [1.3.0] + +### Added + +- Interface `EventLog` was added. (#6410) + +## [1.3.1] + +### Added + +- Interface `MetaMaskProvider` added and is part of `SupportedProviders` (#6534) +- `gasPrice` was added to `Transaction1559UnsignedAPI` type. (#6539) + +## [1.4.0] + +### Added + +- Adds missing exported type `AbiItem` from 1.x to v4 for compatabiltiy (#6678) + +## [1.5.0] + +### Added + +- Type `FeeData` to be filled by `await web3.eth.calculateFeeData()` to be used with EIP-1559 transactions (#6795) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-types/README.md b/packages/web3-types/README.md new file mode 100644 index 00000000000..7c15e2dc2e0 --- /dev/null +++ b/packages/web3-types/README.md @@ -0,0 +1,59 @@ +

+ web3.js +

+ +# web3-types + +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] + +This is a sub-package of [web3.js][repo]. + +`web3-types` contains the common data structures and interfaces used in [web3.js][repo]. + +## Installation + +You can install the package either using [NPM](https://www.npmjs.com/package/web3-types) or using [Yarn](https://yarnpkg.com/package/web3-types) + +### Using NPM + +```bash +npm install web3-types +``` + +### Using Yarn + +```bash +yarn add web3-types +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-types +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-types%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-types +[downloads-image]: https://img.shields.io/npm/dm/web3-types?label=npm%20downloads diff --git a/packages/web3-types/assets/logo/web3js.ai b/packages/web3-types/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-types/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-types/assets/logo/web3js.jpg b/packages/web3-types/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-types/assets/logo/web3js.jpg differ diff --git a/packages/web3-types/assets/logo/web3js.svg b/packages/web3-types/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-types/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-types/package.json b/packages/web3-types/package.json new file mode 100644 index 00000000000..a254eb19f19 --- /dev/null +++ b/packages/web3-types/package.json @@ -0,0 +1,59 @@ +{ + "name": "web3-types", + "version": "1.5.0", + "description": "Provide the common data structures and interfaces for web3 modules.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --passWithNoTests --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js --passWithNoTests", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "devDependencies": { + "@humeris/espresso-shot": "^4.0.0", + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + } +} diff --git a/packages/web3-types/src/apis/eth_execution_api.ts b/packages/web3-types/src/apis/eth_execution_api.ts new file mode 100644 index 00000000000..3abb0b29af0 --- /dev/null +++ b/packages/web3-types/src/apis/eth_execution_api.ts @@ -0,0 +1,292 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + Address, + HexString32Bytes, + Uint, + HexStringBytes, + HexStringSingleByte, + HexString256Bytes, + FeeHistoryBase, + HexString8Bytes, + Uint256, + BlockNumberOrTag, + Filter, + AccessList, + TransactionHash, + TransactionReceiptBase, + BlockBase, + LogBase, +} from '../eth_types.js'; +import { HexString } from '../primitives_types.js'; + +// The types are generated manually by referring to following doc +// https://github.com/ethereum/execution-apis +// These types follow closely to the v1.0.0-alpha.9 Ethereum spec +export interface TransactionCallAPI { + readonly from?: Address; + readonly to: Address; + readonly gas?: Uint; + readonly gasPrice?: Uint; + readonly value?: Uint; + readonly data?: HexStringBytes; + readonly type?: HexStringSingleByte; + readonly maxFeePerGas?: Uint; + readonly maxPriorityFeePerGas?: Uint; + readonly accessList?: AccessList; +} + +export interface BaseTransactionAPI { + // eslint-disable-next-line @typescript-eslint/ban-types + readonly to?: Address | null; + readonly type: HexStringSingleByte; + readonly nonce: Uint; + readonly gas: Uint; + readonly value: Uint; + // TODO - https://github.com/ethereum/execution-apis/pull/201 + readonly input: HexStringBytes; + readonly data?: HexStringBytes; + readonly chainId?: Uint; + readonly hash?: HexString32Bytes; +} + +export interface Transaction1559UnsignedAPI extends BaseTransactionAPI { + readonly maxFeePerGas: Uint; + readonly maxPriorityFeePerGas: Uint; + readonly accessList: AccessList; + readonly gasPrice: Uint; +} + +export interface Transaction1559SignedAPI extends Transaction1559UnsignedAPI { + readonly yParity: Uint; + readonly r: Uint; + readonly s: Uint; + readonly v?: never; +} + +export interface Transaction2930UnsignedAPI extends BaseTransactionAPI { + readonly gasPrice: Uint; + readonly accessList: AccessList; + readonly maxFeePerGas?: never; + readonly maxPriorityFeePerGas?: never; +} + +export interface Transaction2930SignedAPI extends Transaction2930UnsignedAPI { + readonly yParity: Uint; + readonly r: Uint; + readonly s: Uint; + readonly v?: never; +} + +export interface TransactionLegacyUnsignedAPI extends BaseTransactionAPI { + readonly gasPrice: Uint; + readonly accessList?: never; + readonly maxFeePerGas?: never; + readonly maxPriorityFeePerGas?: never; +} + +export interface TransactionLegacySignedAPI extends TransactionLegacyUnsignedAPI { + readonly v: Uint; + readonly r: Uint; + readonly s: Uint; +} + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml#L144 +export type TransactionUnsignedAPI = + | Transaction1559UnsignedAPI + | Transaction2930UnsignedAPI + | TransactionLegacyUnsignedAPI; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml#L211 +export type TransactionSignedAPI = + | Transaction1559SignedAPI + | Transaction2930SignedAPI + | TransactionLegacySignedAPI; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml#L216 +export type TransactionInfoAPI = TransactionSignedAPI & { + readonly blockHash?: HexString32Bytes; + readonly blockNumber?: Uint; + readonly from: Address; + readonly hash: HexString32Bytes; + readonly transactionIndex?: Uint; +}; + +export interface SignedTransactionInfoAPI { + raw: HexStringBytes; + tx: TransactionSignedAPI; +} + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml#L244 +export type TransactionWithSenderAPI = TransactionUnsignedAPI & { from: Address }; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/block.yaml#L2 +export type BlockAPI = BlockBase< + HexString32Bytes, + HexString, + Uint, + HexStringBytes, + TransactionHash[] | TransactionInfoAPI[], + HexString256Bytes +>; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/receipt.yaml#L2 +export type LogAPI = LogBase; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/receipt.yaml#L36 +export type TransactionReceiptAPI = TransactionReceiptBase< + Uint, + HexString32Bytes, + HexString256Bytes, + LogAPI +>; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/client.yaml#L2 +export type SyncingStatusAPI = + | { startingBlock: Uint; currentBlock: Uint; highestBlock: Uint } + | boolean; + +// https://github.com/ethereum/execution-apis/blob/main/src/eth/fee_market.yaml#L42 +export type FeeHistoryResultAPI = FeeHistoryBase; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/filter.yaml#L2 +export type FilterResultsAPI = HexString32Bytes[] | LogAPI[]; + +export interface CompileResultAPI { + readonly code: HexStringBytes; + readonly info: { + readonly source: string; + readonly language: string; + readonly languageVersion: string; + readonly compilerVersion: string; + readonly abiDefinition: Record[]; + readonly userDoc: { + readonly methods: Record; + }; + readonly developerDoc: { + readonly methods: Record; + }; + }; +} + +/* eslint-disable camelcase */ +export type EthExecutionAPI = { + // https://github.com/ethereum/execution-apis/blob/main/src/eth/block.yaml + eth_getBlockByHash: (blockHash: HexString32Bytes, hydrated: boolean) => BlockAPI; + eth_getBlockByNumber: (blockNumber: BlockNumberOrTag, hydrated: boolean) => BlockAPI; + eth_getBlockTransactionCountByHash: (blockHash: HexString32Bytes) => Uint; + eth_getBlockTransactionCountByNumber: (blockNumber: BlockNumberOrTag) => Uint; + eth_getUncleCountByBlockHash: (blockHash: HexString32Bytes) => Uint; + eth_getUncleCountByBlockNumber: (blockNumber: BlockNumberOrTag) => Uint; + eth_getUncleByBlockHashAndIndex: (blockHash: HexString32Bytes, uncleIndex: Uint) => BlockAPI; + eth_getUncleByBlockNumberAndIndex: (blockNumber: BlockNumberOrTag, uncleIndex: Uint) => BlockAPI; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/transaction.yaml + eth_getTransactionByHash: (transactionHash: HexString32Bytes) => TransactionInfoAPI | undefined; + eth_getTransactionByBlockHashAndIndex: ( + blockHash: HexString32Bytes, + transactionIndex: Uint, + ) => TransactionInfoAPI | undefined; + eth_getTransactionByBlockNumberAndIndex: ( + blockNumber: BlockNumberOrTag, + transactionIndex: Uint, + ) => TransactionInfoAPI | undefined; + eth_getTransactionReceipt: ( + transactionHash: HexString32Bytes, + ) => TransactionReceiptAPI | undefined; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/client.yaml + eth_protocolVersion: () => string; + eth_syncing: () => SyncingStatusAPI; + eth_coinbase: () => Address; + eth_accounts: () => Address[]; + eth_blockNumber: () => Uint; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/execute.yaml + eth_call: (transaction: TransactionCallAPI, blockNumber: BlockNumberOrTag) => HexStringBytes; + eth_estimateGas: ( + transaction: Partial, + blockNumber: BlockNumberOrTag, + ) => Uint; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/fee_market.yaml + eth_gasPrice: () => Uint; + eth_feeHistory: ( + blockCount: Uint, + newestBlock: BlockNumberOrTag, + rewardPercentiles: number[], + ) => FeeHistoryResultAPI; + eth_maxPriorityFeePerGas: () => Uint; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/filter.yaml + eth_newFilter: (filter: Filter) => Uint; + eth_newBlockFilter: () => Uint; + eth_newPendingTransactionFilter: () => Uint; + eth_uninstallFilter: (filterIdentifier: Uint) => boolean; + eth_getFilterChanges: (filterIdentifier: Uint) => FilterResultsAPI; + eth_getFilterLogs: (filterIdentifier: Uint) => FilterResultsAPI; + eth_getLogs: (filter: Filter) => FilterResultsAPI; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/mining.yaml + eth_mining: () => boolean; + eth_hashrate: () => Uint; + eth_getWork: () => [HexString32Bytes, HexString32Bytes, HexString32Bytes]; + eth_submitWork: ( + nonce: HexString8Bytes, + hash: HexString32Bytes, + digest: HexString32Bytes, + ) => boolean; + eth_submitHashrate: (hashRate: HexString32Bytes, id: HexString32Bytes) => boolean; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/sign.yaml + eth_sign: (address: Address, message: HexStringBytes) => HexString256Bytes; + eth_signTransaction: ( + transaction: TransactionWithSenderAPI | Partial, + ) => HexStringBytes | SignedTransactionInfoAPI; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/state.yaml + eth_getBalance: (address: Address, blockNumber: BlockNumberOrTag) => Uint; + eth_getStorageAt: ( + address: Address, + storageSlot: Uint256, + blockNumber: BlockNumberOrTag, + ) => HexStringBytes; + eth_getTransactionCount: (address: Address, blockNumber: BlockNumberOrTag) => Uint; + eth_getCode: (address: Address, blockNumber: BlockNumberOrTag) => HexStringBytes; + + // https://github.com/ethereum/execution-apis/blob/main/src/eth/submit.yaml + eth_sendTransaction: ( + transaction: TransactionWithSenderAPI | Partial, + ) => HexString32Bytes; + eth_sendRawTransaction: (transaction: HexStringBytes) => HexString32Bytes; + + // https://geth.ethereum.org/docs/rpc/pubsub + eth_subscribe: ( + ...params: + | ['newHeads'] + | ['newPendingTransactions'] + | ['syncing'] + | ['logs', { address?: HexString; topics?: HexString[] }] + ) => HexString; + eth_unsubscribe: (subscriptionId: HexString) => HexString; + eth_clearSubscriptions: (keepSyncing?: boolean) => void; + // Non-supported by execution-apis specs + eth_getCompilers: () => string[]; + eth_compileSolidity: (code: string) => CompileResultAPI; + eth_compileLLL: (code: string) => HexStringBytes; + eth_compileSerpent: (code: string) => HexStringBytes; +}; diff --git a/packages/web3-types/src/apis/eth_personal_api.ts b/packages/web3-types/src/apis/eth_personal_api.ts new file mode 100644 index 00000000000..cab41b22dd8 --- /dev/null +++ b/packages/web3-types/src/apis/eth_personal_api.ts @@ -0,0 +1,30 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Address, Transaction } from '../eth_types.js'; +import { HexString } from '../primitives_types.js'; + +export type EthPersonalAPI = { + personal_listAccounts: () => Address[]; + personal_newAccount: (password: string) => Address; + personal_unlockAccount: (address: Address, password: string, unlockDuration: number) => boolean; + personal_lockAccount: (address: Address) => boolean; + personal_importRawKey: (keyData: HexString, passphrase: string) => HexString; + personal_sendTransaction: (tx: Transaction, passphrase: string) => HexString; + personal_signTransaction: (tx: Transaction, passphrase: string) => HexString; + personal_sign: (data: HexString, address: Address, passphrase: string) => HexString; + personal_ecRecover: (signedData: HexString, signature: HexString) => Address; +}; diff --git a/packages/web3-types/src/apis/web3_eth_execution_api.ts b/packages/web3-types/src/apis/web3_eth_execution_api.ts new file mode 100644 index 00000000000..fde1250b4a3 --- /dev/null +++ b/packages/web3-types/src/apis/web3_eth_execution_api.ts @@ -0,0 +1,60 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { EthExecutionAPI } from './eth_execution_api.js'; +import { + AccountObject, + Address, + BlockNumberOrTag, + Eip712TypedData, + HexString256Bytes, + HexString32Bytes, + TransactionInfo, + Uint, +} from '../eth_types.js'; + +export type Web3EthExecutionAPI = EthExecutionAPI & { + eth_pendingTransactions: () => TransactionInfo[]; + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1102.md + eth_requestAccounts: () => Address[]; + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-695.md + eth_chainId: () => Uint; + + web3_clientVersion: () => string; + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1186.md + eth_getProof: ( + address: Address, + storageKeys: HexString32Bytes[], + blockNumber: BlockNumberOrTag, + ) => AccountObject; + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md + eth_signTypedData: ( + address: Address, + typedData: Eip712TypedData, + useLegacy: true, + ) => HexString256Bytes; + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md + eth_signTypedData_v4: ( + address: Address, + typedData: Eip712TypedData, + useLegacy: false | undefined, + ) => HexString256Bytes; +}; diff --git a/packages/web3-types/src/apis/web3_net_api.ts b/packages/web3-types/src/apis/web3_net_api.ts new file mode 100644 index 00000000000..2cb3566f823 --- /dev/null +++ b/packages/web3-types/src/apis/web3_net_api.ts @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { HexString } from '../primitives_types.js'; + +export type Web3NetAPI = { + net_version: () => string; // https://eth.wiki/json-rpc/API#net_version + net_peerCount: () => HexString; // https://eth.wiki/json-rpc/API#net_peercount + net_listening: () => boolean; // https://eth.wiki/json-rpc/API#net_listening +}; diff --git a/packages/web3-types/src/data_format_types.ts b/packages/web3-types/src/data_format_types.ts new file mode 100644 index 00000000000..f0ffe3bc8aa --- /dev/null +++ b/packages/web3-types/src/data_format_types.ts @@ -0,0 +1,60 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Bytes, HexString, Numbers } from './primitives_types.js'; + +export enum FMT_NUMBER { + NUMBER = 'NUMBER_NUMBER', + HEX = 'NUMBER_HEX', + STR = 'NUMBER_STR', + BIGINT = 'NUMBER_BIGINT', +} + +export type NumberTypes = { + [FMT_NUMBER.NUMBER]: number; + [FMT_NUMBER.HEX]: HexString; + [FMT_NUMBER.STR]: string; + [FMT_NUMBER.BIGINT]: bigint; +}; + +export enum FMT_BYTES { + HEX = 'BYTES_HEX', + UINT8ARRAY = 'BYTES_UINT8ARRAY', +} + +export type ByteTypes = { + [FMT_BYTES.HEX]: HexString; + [FMT_BYTES.UINT8ARRAY]: Uint8Array; +}; + +export type DataFormat = { + readonly number: FMT_NUMBER; + readonly bytes: FMT_BYTES; +}; + +export const DEFAULT_RETURN_FORMAT = { number: FMT_NUMBER.BIGINT, bytes: FMT_BYTES.HEX } as const; +export const ETH_DATA_FORMAT = { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX } as const; + +export type FormatType = number extends Extract + ? NumberTypes[F['number']] | Exclude + : Uint8Array extends Extract + ? ByteTypes[F['bytes']] | Exclude + : T extends object | undefined + ? { + [P in keyof T]: FormatType; + } + : T; diff --git a/packages/web3-types/src/error_types.ts b/packages/web3-types/src/error_types.ts new file mode 100644 index 00000000000..4891b875a0a --- /dev/null +++ b/packages/web3-types/src/error_types.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export interface Web3Error extends Error { + readonly name: string; + readonly code: number; + readonly stack?: string; +} + +export type Web3ValidationErrorObject< + K extends string = string, + P = Record, + S = unknown, +> = { + keyword: K; + instancePath: string; + schemaPath: string; + params: P; + // Added to validation errors of "propertyNames" keyword schema + propertyName?: string; + // Excluded if option `messages` set to false. + message?: string; + schema?: S; + data?: unknown; +}; diff --git a/packages/web3-types/src/eth_abi_types.ts b/packages/web3-types/src/eth_abi_types.ts new file mode 100644 index 00000000000..07b9374f4db --- /dev/null +++ b/packages/web3-types/src/eth_abi_types.ts @@ -0,0 +1,386 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address } from './eth_types.js'; +import { Bytes, Numbers } from './primitives_types.js'; +import { FixedSizeArray } from './utility_types.js'; + +type _SolidityIndexRange = + | 1 + | 2 + | 3 + | 4 + | 5 + | 6 + | 7 + | 8 + | 9 + | 10 + | 11 + | 12 + | 13 + | 14 + | 15 + | 16 + | 17 + | 18 + | 19 + | 20 + | 21 + | 22 + | 25 + | 26 + | 27 + | 28 + | 29 + | 30; + +export type ConvertToNumber< + T extends string, + Range extends number = _SolidityIndexRange, +> = Range extends unknown ? (`${Range}` extends T ? Range : never) : never; + +export type Components = { + name: string; + type: string; + indexed?: boolean; + components?: Components[]; +}; + +export interface AbiStruct { + [key: string]: unknown; + name: string; + type: string; +} + +export interface AbiCoderStruct extends AbiStruct { + [key: string]: unknown; + components?: Array; +} + +// https://docs.soliditylang.org/en/latest/abi-spec.html#json +export type AbiParameter = { + readonly name: string; + readonly type: string; + readonly baseType?: string; + readonly indexed?: boolean; + readonly components?: ReadonlyArray; + readonly arrayLength?: number; + readonly arrayChildren?: ReadonlyArray; + readonly internalType?: string; +}; + +type FragmentTypes = 'constructor' | 'event' | 'function' | 'fallback' | 'receive'; + +export type AbiBaseFragment = { + // type will default to string if passed ABI is declared without "as const" + readonly type: string | FragmentTypes; +}; + +// To assign an ABI which is not declared `as const` need to specify a generic string + +// https://docs.soliditylang.org/en/latest/abi-spec.html#json +export type AbiConstructorFragment = AbiBaseFragment & { + readonly type: string | 'constructor'; + readonly stateMutability: string | 'nonpayable' | 'payable'; + readonly inputs?: ReadonlyArray; +}; + +// https://docs.soliditylang.org/en/latest/abi-spec.html#json +export type AbiFunctionFragment = AbiBaseFragment & { + readonly name: string; + readonly type: string | 'function'; + readonly stateMutability?: string | 'nonpayable' | 'payable' | 'pure' | 'view'; + readonly inputs?: ReadonlyArray; + readonly outputs?: ReadonlyArray; + + readonly constant?: boolean; // stateMutability == 'pure' or stateMutability == 'view' + readonly payable?: boolean; // stateMutability == 'payable' +}; + +export type AbiFallbackFragment = AbiBaseFragment & { + readonly name: never; + readonly type: string | 'fallback'; + readonly stateMutability: string | 'nonpayable' | 'payable' | 'pure' | 'view'; + readonly inputs: never; + readonly outputs: never; + + // legacy properties + readonly constant?: boolean; // stateMutability == 'pure' or stateMutability == 'view' + readonly payable?: boolean; // stateMutability == 'payable' +}; + +// https://docs.soliditylang.org/en/latest/abi-spec.html#json +export type AbiEventFragment = AbiBaseFragment & { + readonly name: string; + readonly type: string | 'event'; + readonly inputs?: ReadonlyArray; + readonly anonymous?: boolean; +}; + +// https://docs.soliditylang.org/en/latest/abi-spec.html#errors +export type AbiErrorFragment = AbiBaseFragment & { + readonly name: string; + readonly type: string | 'error'; + readonly inputs?: ReadonlyArray; +}; + + +export type AbiInput = + | string + | AbiParameter + | { + name: string; + type: string; + components?: Components; + index?: boolean; + internalType?: string; + } + | { readonly [key: string]: unknown }; + + export interface AbiOutput { + name: string; + type: string; + components?: AbiOutput[]; + internalType?: string; + } + + + +// https://docs.soliditylang.org/en/latest/abi-spec.html#json +export type AbiFragment = + | AbiConstructorFragment + | AbiFunctionFragment + | AbiEventFragment + | AbiErrorFragment + | AbiFallbackFragment + +// to be compatible with web3js v1 +export type AbiItem = AbiFragment +export type ContractAbi = ReadonlyArray | ReadonlyArray + + +// https://docs.soliditylang.org/en/develop/abi-spec.html#json +export type JsonFunctionInterface = { + type: 'function'; + name: string; + inputs: Components[]; + outputs?: AbiInput[]; + stateMutability?: string; +}; + +export type JsonEventInterface = { + type: 'event'; + name: string; + inputs: Components[]; + indexed: boolean; + anonymous: boolean; +}; + +export type FilterAbis = Abi extends Filter + ? Abi + : never; + +type _TypedArray = Size extends '' + ? Type[] + : FixedSizeArray>; + +export type PrimitiveAddressType = Type extends `address[${infer Size}]` + ? _TypedArray + : Type extends 'address' + ? Address + : never; + +export type PrimitiveStringType = Type extends `string${string}[${infer Size}]` + ? _TypedArray + : Type extends 'string' | `string${string}` + ? string + : never; + +export type PrimitiveBooleanType = Type extends `bool[${infer Size}]` + ? _TypedArray + : Type extends 'bool' + ? boolean + : never; + +export type PrimitiveIntegerType = Type extends + | `uint${string}[${infer Size}]` + | `int${string}[${infer Size}]` + ? _TypedArray + : Type extends 'uint' | 'int' | `int${string}` | `uint${string}` + ? Numbers + : never; + +export type PrimitiveBytesType = Type extends `bytes${string}[${infer Size}]` + ? _TypedArray + : Type extends 'bytes' | `bytes${string}` + ? Bytes + : never; + +export type PrimitiveTupleType< + Type extends string, + TypeComponents extends ReadonlyArray | undefined | unknown = [], +> = TypeComponents extends ReadonlyArray + ? Type extends 'tuple' + ? { + // eslint-disable-next-line no-use-before-define + [Param in TypeComponents[number] as Param['name']]: MatchPrimitiveType< + Param['type'], + Param['components'] + >; + } + : Type extends `tuple[${infer Size}]` + ? _TypedArray< + { + // eslint-disable-next-line no-use-before-define + [Param in TypeComponents[number] as Param['name']]: MatchPrimitiveType< + Param['type'], + Param['components'] + >; + }, + Size + > + : never + : never; + +type ObjectToArray = T extends [...infer R, infer A] + ? Record & ObjectToArray + : T; +type ArrToObjectWithFunctions = Array & ObjectToArray; + +export type MatchPrimitiveType< + Type extends string, + TypeComponents extends ReadonlyArray | undefined | unknown, +> = + | PrimitiveAddressType + | PrimitiveStringType + | PrimitiveBooleanType + | PrimitiveIntegerType + | PrimitiveBytesType + | PrimitiveTupleType + | never; + +type ContractMethodOutputParametersRecursiveArray< + Params extends ReadonlyArray | undefined, +> = + // check if params are empty array + Params extends readonly [] + ? [] + : Params extends readonly [infer H, ...infer R] // check if Params is an array + ? H extends AbiParameter + ? [ + MatchPrimitiveType, + ...ContractMethodOutputParametersRecursiveArray, + ] + : [] + : []; + +type ContractMethodOutputParametersRecursiveRecord< + Params extends ReadonlyArray | undefined, +> = + // check if params are empty array + Params extends readonly [] + ? [] + : Params extends readonly [infer H, ...infer R] // check if Params is an array + ? H extends AbiParameter + ? H['name'] extends '' // check if output param name is empty string + ? ContractMethodOutputParametersRecursiveRecord + : Record> & // sets key-value pair of output param name and type + ContractMethodOutputParametersRecursiveRecord + : ContractMethodOutputParametersRecursiveRecord + : Params extends undefined | unknown // param is not array, check if undefined + ? [] + : Params; + +export type ContractMethodOutputParameters | undefined> = + // check if params are empty array + Params extends readonly [] + ? void + : Params extends readonly [infer H, ...infer R] // check if Params is an array + ? R extends readonly [] // if only one output in array + ? H extends AbiParameter + ? MatchPrimitiveType + : [] + : // if more than one output + ArrToObjectWithFunctions<[...ContractMethodOutputParametersRecursiveArray]> & + ContractMethodOutputParametersRecursiveRecord + : []; + +export type ContractMethodInputParameters | undefined> = + Params extends readonly [] + ? [] + : Params extends readonly [infer H, ...infer R] + ? H extends AbiParameter + ? // TODO: Find a way to set name for tuple item + [MatchPrimitiveType, ...ContractMethodInputParameters] + : ContractMethodInputParameters + : Params extends undefined | unknown + ? [] + : Params; + +export type ContractConstructor = { + [Abi in FilterAbis as 'constructor']: { + readonly Abi: Abi; + readonly Inputs: ContractMethodInputParameters; + }; +}['constructor']; + +export type ContractConstructorArgs = FilterAbis< + Abis, + AbiConstructorFragment & { + type: 'constructor'; + } +> extends never + ? any + : { + [Abi in FilterAbis< + Abis, + AbiConstructorFragment & { + type: 'constructor'; + } + > as 'constructor']: ContractMethodInputParameters; + }['constructor']; + +export type ContractMethod = { + readonly Abi: Abi; + + readonly Inputs: ContractMethodInputParameters; + readonly Outputs: ContractMethodOutputParameters; +}; + +export type ContractMethods = { + [Abi in FilterAbis< + Abis, + AbiFunctionFragment & { type: 'function' } + > as Abi['name']]: ContractMethod; +}; + +export type ContractEvent = { + readonly Abi: Abi; + readonly Inputs: ContractMethodInputParameters; +}; + +export type ContractEvents = { + [Abi in FilterAbis< + Abis, + AbiEventFragment & { type: 'event' } + > as Abi['name']]: ContractEvent; +}; + +export interface DecodedParams extends Record { + __length__: number; +} diff --git a/packages/web3-types/src/eth_contract_types.ts b/packages/web3-types/src/eth_contract_types.ts new file mode 100644 index 00000000000..fb34328ce21 --- /dev/null +++ b/packages/web3-types/src/eth_contract_types.ts @@ -0,0 +1,171 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address, Uint } from './eth_types.js'; +import { SupportedProviders } from './web3_base_provider.js'; +import { Bytes, HexString } from './primitives_types.js'; +import { EthExecutionAPI } from './apis/eth_execution_api.js'; +import { AbiFragment, ContractAbi } from './eth_abi_types.js'; + +export interface ContractInitOptions { + /** + * The maximum gas provided for a transaction (gas limit). + */ + readonly gas?: Uint; + readonly gasLimit?: Uint; + /** + * The gas price in wei to use for transactions. + */ + readonly gasPrice?: Uint; + /** + * The address transactions should be made from + */ + readonly from?: Address; + /** + * The byte code of the contract. Used when the contract gets {@link Contract.deploy | deployed} + */ + readonly data?: Bytes; + readonly input?: Bytes; + + readonly provider?: SupportedProviders | string; + /** + * If `true`, the defaults of the contract instance will be updated automatically based on the changes of the context used to instantiate the contract. + */ + readonly syncWithContext?: boolean; + + readonly dataInputFill?: 'data' | 'input' | 'both'; + /** + * this will make calls default to `data`, `input` or `both` + */ +} + +export interface NonPayableCallOptions { + nonce?: HexString; + /** + * The address which is the call (the transaction) should be made from. For calls the `from` property is optional however it is + * highly recommended to explicitly set it or it may default to address(0) depending on your node or provider. + */ + from?: Address; + /** + * The maximum gas (gas limit) provided for this call (this transaction) + */ + gas?: string; + maxPriorityFeePerGas?: HexString; + maxFeePerGas?: HexString; + /** + * The gas price in wei to use for this call `transaction`. + */ + gasPrice?: string; + type?: string | number; + data?: HexString; + input?: HexString; +} + +export interface PayableCallOptions extends NonPayableCallOptions { + /** + * + */ + value?: string; +} + +export type ContractAbiWithSignature = ReadonlyArray; + +/** + * Represents the options for a contract. + */ +export interface ContractOptions { + /** + * The maximum gas provided for a transaction (gas limit). + */ + readonly gas?: Uint; + + /** + * The gas price in wei to use for transactions. + */ + readonly gasPrice?: Uint; + + /** + * The address transactions should be made from. + */ + readonly from?: Address; + + /** + * The byte code of the contract. Used when the contract gets {@link Contract.deploy | deployed} + */ + readonly input?: Bytes; + + /** + * The byte code of the contract. Used when the contract gets {@link Contract.deploy | deployed} + */ + readonly data?: Bytes; + + /** + * The {@doclink glossary/json_interface | json interface} object derived from the [ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) of this contract. + * + * Re-setting this will regenerate the methods and events of the contract instance. + * + * @example + * ```ts + * myContract.options.jsonInterface; + * > [{ + * "type":"function", + * "name":"foo", + * "inputs": [{"name":"a","type":"uint256"}], + * "outputs": [{"name":"b","type":"address"}], + * "signature": "0x...", + * },{ + * "type":"event", + * "name":"Event", + * "inputs": [{"name":"a","type":"uint256","indexed":true},{"name":"b","type":"bytes32","indexed":false}], + * "signature": "0x...", + * }] + * + * // Set a new ABI interface + * // Note: the "signature" of every function and event's ABI is not needed to be provided when assigning. + * // It will be calculated and set automatically inside the setter. + * myContract.options.jsonInterface = [...]; + * ``` + */ + get jsonInterface(): ContractAbiWithSignature; + set jsonInterface(value: ContractAbi); + + /** + * The address used for this contract instance. All transactions generated by web3.js from this contract will contain this address as the `to`. + * + * The address will be stored in lowercase. + * + * @example + * ```ts + * myContract.options.address; + * > '0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae' + * + * // set a new address + * myContract.options.address = '0x1234FFDD...'; + * ``` + */ + address?: Address; // All transactions generated by web3.js from this contract will contain this address as the "to". + + /** + * The max priority fee per gas to use for transactions. + */ + maxPriorityFeePerGas?: Uint; + + /** + * The max fee per gas to use for transactions. + */ + maxFeePerGas?: Uint; +} diff --git a/packages/web3-types/src/eth_types.ts b/packages/web3-types/src/eth_types.ts new file mode 100644 index 00000000000..cae32515332 --- /dev/null +++ b/packages/web3-types/src/eth_types.ts @@ -0,0 +1,576 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, HexString, Numbers } from './primitives_types.js'; + +export type ValueTypes = 'address' | 'bool' | 'string' | 'int256' | 'uint256' | 'bytes' | 'bigint'; +// Hex encoded 32 bytes +export type HexString32Bytes = HexString; +// Hex encoded 16 bytes +export type HexString16Bytes = HexString; +// Hex encoded 8 bytes +export type HexString8Bytes = HexString; +// Hex encoded 1 byte +export type HexStringSingleByte = HexString; +// Hex encoded 1 byte +export type HexStringBytes = HexString; +// Hex encoded 256 byte +export type HexString256Bytes = HexString; +// Hex encoded unsigned integer +export type Uint = HexString; +// Hex encoded unsigned integer 32 bytes +export type Uint256 = HexString; +// Hex encoded address +export type Address = HexString; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/filter.json#L59 +export type Topic = HexString32Bytes; + +export type TransactionHash = HexString; +export type Uncles = HexString32Bytes[]; +export enum BlockTags { + EARLIEST = 'earliest', + LATEST = 'latest', + PENDING = 'pending', + SAFE = 'safe', + FINALIZED = 'finalized', +} +export type BlockTag = `${BlockTags}`; + +export type BlockNumberOrTag = Numbers | BlockTag; + +export interface Proof { + readonly address: HexString; + readonly nonce: string; + readonly balance: string; +} + +export interface TransactionInput { + readonly [key: string]: unknown; + readonly to?: HexString; // If its a contract creation tx then no address wil be specified. + readonly from?: HexString; + readonly data?: string; + readonly input?: string; + readonly gas: HexString; + readonly gasLimit?: string; + readonly gasPrice?: string; + readonly maxPriorityFeePerGas?: string; + readonly maxFeePerGas?: string; + readonly nonce: string; + readonly value: string; + readonly blockNumber?: HexString; + readonly transactionIndex?: HexString; + readonly type?: HexString; + readonly chainId?: HexString; +} + +export type TransactionOutput = { + readonly [key: string]: unknown; + readonly to?: HexString; // If its a contract creation tx then no address wil be specified. + readonly from?: HexString; + readonly input: string; + readonly gas?: Numbers; + readonly gasLimit?: string; + readonly nonce: Numbers; + readonly value: Numbers; + readonly blockNumber?: Numbers; + readonly transactionIndex?: Numbers; +} & ( + | { maxPriorityFeePerGas: Numbers; maxFeePerGas: Numbers; gasPrice?: never } + | { maxPriorityFeePerGas?: never; maxFeePerGas?: never; gasPrice: Numbers } +); + +export interface LogsInput { + readonly blockHash?: HexString; + readonly transactionHash?: HexString; + readonly logIndex?: HexString; + readonly id?: string; + readonly blockNumber?: HexString; + readonly transactionIndex?: HexString; + readonly address: HexString; + readonly topics: HexString[]; + readonly data: HexString; +} +export interface LogsOutput { + readonly id?: string; + readonly removed: boolean; + readonly logIndex?: Numbers; + readonly transactionIndex?: Numbers; + readonly transactionHash?: HexString32Bytes; + readonly blockHash?: HexString32Bytes; + readonly blockNumber?: Numbers; + readonly address: string; + readonly topics: HexString[]; + readonly data: HexString; +} + +export interface BlockInput { + readonly gasLimit: HexString; + readonly gasUsed: HexString; + readonly size: HexString; + readonly timestamp: HexString; + readonly number?: HexString; + readonly difficulty?: HexString; + readonly totalDifficulty?: HexString; + readonly transactions?: TransactionInput[]; + readonly miner?: HexString; + readonly baseFeePerGas?: HexString; +} + +export interface BlockOutput { + readonly gasLimit: bigint | number; + readonly gasUsed: bigint | number; + readonly size: bigint | number; + readonly timestamp: bigint | number; + readonly number?: bigint | number; + readonly difficulty?: bigint | number; + readonly totalDifficulty?: bigint | number; + readonly transactions?: TransactionOutput[]; + readonly miner?: HexString; + readonly baseFeePerGas?: bigint | number; + readonly parentHash?: HexString32Bytes; +} + +export interface Withdrawals { + readonly index: Numbers; + readonly validatorIndex: Numbers; + readonly address: Address; + readonly amount: Numbers; +} + +export interface BlockHeaderOutput { + readonly hash?: HexString32Bytes; + readonly parentHash?: HexString32Bytes; + readonly receiptsRoot?: HexString32Bytes; + readonly miner?: HexString; + readonly stateRoot?: HexString32Bytes; + readonly transactionsRoot?: HexString32Bytes; + readonly withdrawalsRoot?: HexString32Bytes; + readonly logsBloom?: Bytes; + readonly difficulty?: Numbers; + readonly number?: Numbers; + readonly gasLimit: Numbers; + readonly gasUsed: Numbers; + readonly timestamp: Numbers; + readonly extraData?: Bytes; + readonly nonce?: Numbers; + readonly sha3Uncles: HexString32Bytes[]; + readonly baseFeePerGas?: Numbers; + + // These fields are returned when the RPC client is Nethermind, + // but aren't available in other clients such as Geth + readonly author?: Address; + readonly totalDifficulty?: Numbers; + readonly size?: Numbers; + readonly excessDataGas?: Numbers; + readonly mixHash?: HexString32Bytes; + readonly transactions?: TransactionOutput[]; + readonly uncles?: Uncles; + readonly withdrawals?: Withdrawals[]; +} + +export interface ReceiptInput { + readonly [x: string]: unknown; + readonly blockNumber?: HexString; + readonly transactionIndex?: HexString; + readonly cumulativeGasUsed: HexString; + readonly gasUsed: HexString; + readonly logs?: LogsInput[]; + readonly contractAddress?: HexString; + readonly status?: string; + readonly effectiveGasPrice?: HexString; +} + +export interface ReceiptOutput { + readonly blockNumber?: bigint | number; + readonly transactionIndex?: bigint | number; + readonly cumulativeGasUsed: bigint | number; + readonly gasUsed: bigint | number; + readonly logs?: LogsOutput[]; + readonly contractAddress?: HexString; + readonly status: boolean; + readonly effectiveGasPrice?: bigint | number; +} + +export interface PostInput { + readonly ttl?: HexString; + readonly workToProve?: HexString; + readonly priority?: HexString; + readonly expiry?: HexString; + readonly sent?: HexString; + readonly workProved?: HexString; + readonly topics?: HexString[]; +} + +export interface PostOutput { + readonly ttl?: bigint | number; + readonly workToProve?: bigint | number; + readonly priority?: bigint | number; + readonly expiry?: bigint | number; + readonly sent?: bigint | number; + readonly workProved?: bigint | number; + readonly topics?: string[]; +} + +export interface SyncInput { + readonly startingBlock: HexString; + readonly currentBlock: HexString; + readonly highestBlock: HexString; + readonly knownStates?: HexString; + readonly pulledStates?: HexString; +} + +export interface SyncOutput { + readonly startingBlock: Numbers; + readonly currentBlock: Numbers; + readonly highestBlock: Numbers; + readonly knownStates?: Numbers; + readonly pulledStates?: Numbers; +} + +export type Receipt = Record; + +type FilterOption = Record; + +// https://github.com/ethereum/execution-apis/blob/main/src/schemas/filter.json#L28 +export interface Filter { + readonly fromBlock?: BlockNumberOrTag; + readonly toBlock?: BlockNumberOrTag; + readonly address?: Address | Address[]; + readonly blockHash?: Address; + // Using "null" type intentionally to match specifications + // eslint-disable-next-line @typescript-eslint/ban-types + readonly topics?: (null | Topic | Topic[])[]; + readonly filter?: FilterOption; +} + +export interface AccessListEntry { + readonly address?: Address; + readonly storageKeys?: HexString32Bytes[]; +} +export type AccessList = AccessListEntry[]; + +export type AccessListResult = { + readonly accessList?: AccessList; + readonly gasUsed?: Numbers; +}; + +export type ValidChains = 'goerli' | 'kovan' | 'mainnet' | 'rinkeby' | 'ropsten' | 'sepolia'; + +// This list of hardforks is expected to be in order +// keep this in mind when making changes to it +export enum HardforksOrdered { + chainstart = 'chainstart', + frontier = 'frontier', + homestead = 'homestead', + dao = 'dao', + tangerineWhistle = 'tangerineWhistle', + spuriousDragon = 'spuriousDragon', + byzantium = 'byzantium', + constantinople = 'constantinople', + petersburg = 'petersburg', + istanbul = 'istanbul', + muirGlacier = 'muirGlacier', + berlin = 'berlin', + london = 'london', + altair = 'altair', + arrowGlacier = 'arrowGlacier', + grayGlacier = 'grayGlacier', + bellatrix = 'bellatrix', + merge = 'merge', + capella = 'capella', + shanghai = 'shanghai', +} + +export type Hardfork = `${HardforksOrdered}`; + +export interface LogBase { + readonly removed?: boolean; + readonly logIndex?: NumberType; + readonly transactionIndex?: NumberType; + readonly transactionHash?: ByteType; + readonly blockHash?: ByteType; + readonly blockNumber?: NumberType; + readonly address?: Address; + readonly data?: ByteType; + readonly topics?: ByteType[]; + readonly id?: string; +} +export interface Log extends LogBase { + readonly id?: string; +} + +export interface EventLog { + readonly event: string; + readonly id?: string; + readonly logIndex?: bigint | number | string; + readonly transactionIndex?: bigint | number | string; + readonly transactionHash?: HexString32Bytes; + readonly blockHash?: HexString32Bytes; + readonly blockNumber?: bigint | number | string; + readonly address: string; + readonly topics: HexString[]; + readonly data: HexString; + readonly raw?: { data: string; topics: unknown[] }; + readonly returnValues: Record; + readonly signature?: HexString; +} + +export interface TransactionReceiptBase { + readonly transactionHash: hashByteType; + readonly transactionIndex: numberType; + readonly blockHash: hashByteType; + readonly blockNumber: numberType; + readonly from: Address; + readonly to: Address; + readonly cumulativeGasUsed: numberType; + readonly gasUsed: numberType; + readonly effectiveGasPrice?: numberType; + readonly contractAddress?: Address; + readonly logs: logsType[]; + readonly logsBloom: logsBloomByteType; + readonly root: hashByteType; + readonly status: numberType; + readonly type?: numberType; + events?: { [key: string]: EventLog }; +} + +export type TransactionReceipt = TransactionReceiptBase; + +export interface CustomChain { + name?: string; + networkId: Numbers; + chainId: Numbers; +} + +export interface Common { + customChain: CustomChain; + baseChain?: ValidChains; + hardfork?: Hardfork; +} + +interface TransactionBase { + value?: Numbers; + accessList?: AccessList; + common?: Common; + gas?: Numbers; + gasPrice?: Numbers; + type?: Numbers; + maxFeePerGas?: Numbers; + maxPriorityFeePerGas?: Numbers; + data?: Bytes; + input?: Bytes; + nonce?: Numbers; + chain?: ValidChains; + hardfork?: Hardfork; + chainId?: Numbers; + networkId?: Numbers; + gasLimit?: Numbers; + yParity?: Uint; + v?: Numbers; + r?: Bytes; + s?: Bytes; +} + +export interface Transaction extends TransactionBase { + from?: Address; + // eslint-disable-next-line @typescript-eslint/ban-types + to?: Address | null; +} + +export interface TransactionForAccessList extends Transaction { + from: Address; +} + +export interface TransactionCall extends Transaction { + to: Address; +} + +export interface TransactionWithFromLocalWalletIndex extends Omit { + from: Numbers; +} + +export interface TransactionWithToLocalWalletIndex extends Omit { + to: Numbers; +} + +export interface TransactionWithFromAndToLocalWalletIndex extends Omit { + from: Numbers; + to: Numbers; +} + +export interface TransactionInfo extends Transaction { + readonly blockHash?: Bytes; + readonly blockNumber?: Numbers; + readonly from: Address; + readonly hash: Bytes; + readonly transactionIndex?: Numbers; +} + +export interface PopulatedUnsignedBaseTransaction { + from: Address; + to?: Address; + value: Numbers; + gas?: Numbers; + gasPrice: Numbers; + type: Numbers; + input?: Bytes; + data?: Bytes; + nonce: Numbers; + networkId: Numbers; + chain: ValidChains; + hardfork: Hardfork; + chainId: Numbers; + common: Common; + gasLimit: Numbers; +} + +export interface PopulatedUnsignedEip2930Transaction extends PopulatedUnsignedBaseTransaction { + accessList: AccessList; +} + +export interface PopulatedUnsignedEip1559Transaction extends PopulatedUnsignedEip2930Transaction { + gasPrice: never; + maxFeePerGas: Numbers; + maxPriorityFeePerGas: Numbers; +} +export type PopulatedUnsignedTransaction = + | PopulatedUnsignedBaseTransaction + | PopulatedUnsignedEip2930Transaction + | PopulatedUnsignedEip1559Transaction; + +export interface BlockBase< + ByteType, + HexStringType, + NumberType, + extraDataType, + TransactionTypes, + logsBloomType, +> { + readonly parentHash: ByteType; + readonly sha3Uncles: ByteType; + readonly miner: HexStringType; + readonly stateRoot: ByteType; + readonly transactionsRoot: ByteType; + readonly receiptsRoot: ByteType; + readonly logsBloom?: logsBloomType; + readonly difficulty?: NumberType; + readonly number: NumberType; + readonly gasLimit: NumberType; + readonly gasUsed: NumberType; + readonly timestamp: NumberType; + readonly extraData: extraDataType; + readonly mixHash: ByteType; + readonly nonce: NumberType; + readonly totalDifficulty: NumberType; + readonly baseFeePerGas?: NumberType; + readonly size: NumberType; + readonly transactions: TransactionTypes; + readonly uncles: Uncles; + readonly hash?: ByteType; +} + +export type Block = BlockBase< + Bytes, + Bytes, + Numbers, + Bytes, + TransactionHash[] | TransactionInfo[], + Bytes +>; + +export interface FeeHistoryBase { + readonly oldestBlock: NumberType; + readonly baseFeePerGas: NumberType; + readonly reward: NumberType[][]; + readonly gasUsedRatio: NumberType[]; +} + +export type FeeHistory = FeeHistoryBase; + +export interface StorageProof { + readonly key: Bytes; + readonly value: Numbers; + readonly proof: Bytes[]; +} + +export interface AccountObject { + readonly balance: Numbers; + readonly codeHash: Bytes; + readonly nonce: Numbers; + readonly storageHash: Bytes; + readonly accountProof: Bytes[]; + readonly storageProof: StorageProof[]; +} + +export interface Eip712TypeDetails { + name: string; + type: string; +} +export interface Eip712TypedData { + readonly types: { + EIP712Domain: Eip712TypeDetails[]; + [key: string]: Eip712TypeDetails[]; + }; + readonly primaryType: string; + readonly domain: Record; + readonly message: Record; +} + +/** + * To contain the gas Fee Data to be used with EIP-1559 transactions. + * EIP-1559 was applied to Ethereum after London hardfork. + * + * Typically you will only need `maxFeePerGas` and `maxPriorityFeePerGas` for a transaction following EIP-1559. + * However, if you want to get informed about the fees of last block, you can use `baseFeePerGas` too. + * + * + * @see https://eips.ethereum.org/EIPS/eip-1559 + * + */ +export interface FeeData { + /** + * This filed is used for legacy networks that does not support EIP-1559. + */ + readonly gasPrice?: Numbers; + + /** + * The baseFeePerGas returned from the last available block. + * + * If EIP-1559 is not supported, this will be `undefined` + * + * However, the user will only pay (the future baseFeePerGas + the maxPriorityFeePerGas). + * And this value is just for getting informed about the fees of last block. + */ + readonly baseFeePerGas?: Numbers; + + /** + * The maximum fee that the user would be willing to pay per-gas. + * + * However, the user will only pay (the future baseFeePerGas + the maxPriorityFeePerGas). + * And the `maxFeePerGas` could be used to prevent paying more than it, if `baseFeePerGas` went too high. + * + * If EIP-1559 is not supported, this will be `undefined` + */ + readonly maxFeePerGas?: Numbers; + + /** + * The validator's tip for including a transaction in a block. + * + * If EIP-1559 is not supported, this will be `undefined` + */ + readonly maxPriorityFeePerGas?: Numbers; +} \ No newline at end of file diff --git a/packages/web3-types/src/index.ts b/packages/web3-types/src/index.ts new file mode 100644 index 00000000000..694ffea34ff --- /dev/null +++ b/packages/web3-types/src/index.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './error_types.js'; +export * from './apis/eth_execution_api.js'; +export * from './apis/web3_eth_execution_api.js'; +export * from './apis/web3_net_api.js'; +export * from './apis/eth_personal_api.js'; +export * from './data_format_types.js'; +export * from './eth_types.js'; +export * from './eth_abi_types.js'; +export * from './eth_contract_types.js'; +export * from './json_rpc_types.js'; +export * from './primitives_types.js'; +export * from './utility_types.js'; +export * from './web3_api_types.js'; +export * from './web3_base_provider.js'; +export * from './web3_base_wallet.js'; +export * from './web3_deferred_promise_type.js'; diff --git a/packages/web3-types/src/json_rpc_types.ts b/packages/web3-types/src/json_rpc_types.ts new file mode 100644 index 00000000000..a361d018700 --- /dev/null +++ b/packages/web3-types/src/json_rpc_types.ts @@ -0,0 +1,94 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export type JsonRpcId = string | number | undefined; +export type JsonRpcResult = string | number | boolean | Record; +export type JsonRpcIdentifier = string & ('2.0' | '1.0'); + +export interface JsonRpcError { + readonly code: number; + readonly message: string; + readonly data?: T; +} + +export interface JsonRpcResponseWithError { + readonly id: JsonRpcId; + readonly jsonrpc: JsonRpcIdentifier; + readonly error: JsonRpcError; + readonly result?: never; +} + +export interface JsonRpcResponseWithResult { + readonly id: JsonRpcId; + readonly jsonrpc: JsonRpcIdentifier; + readonly error?: never; + readonly result: T; +} + +export interface SubscriptionParams { + readonly subscription: string; // for subscription id + readonly result: T; +} + +export interface JsonRpcSubscriptionResultOld { + readonly error?: never; + readonly params?: never; + readonly type: string; + readonly data: SubscriptionParams; +} + +export interface JsonRpcNotification { + readonly id?: JsonRpcId; + readonly jsonrpc: JsonRpcIdentifier; + readonly method: string; // for subscription + readonly params: SubscriptionParams; // for subscription results + readonly result: never; + readonly data?: never; +} + +export interface JsonRpcSubscriptionResult { + readonly id: number; + readonly jsonrpc: string; + readonly result: string; + readonly method: never; + readonly params: never; + readonly data?: never; +} + +export interface JsonRpcRequest { + readonly id: JsonRpcId; + readonly jsonrpc: JsonRpcIdentifier; + readonly method: string; + readonly params?: T; +} + +export interface JsonRpcOptionalRequest + extends Omit, 'id' | 'jsonrpc'> { + readonly id?: JsonRpcId; + readonly jsonrpc?: JsonRpcIdentifier; +} + +export type JsonRpcBatchRequest = JsonRpcRequest[]; + +export type JsonRpcPayload = JsonRpcRequest | JsonRpcBatchRequest; + +export type JsonRpcBatchResponse = + | (JsonRpcResponseWithError | JsonRpcResponseWithResult)[]; + +export type JsonRpcResponse = + | JsonRpcResponseWithError + | JsonRpcResponseWithResult + | JsonRpcBatchResponse; diff --git a/packages/web3-types/src/primitives_types.ts b/packages/web3-types/src/primitives_types.ts new file mode 100644 index 00000000000..387900e7b66 --- /dev/null +++ b/packages/web3-types/src/primitives_types.ts @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export type HexString = string; +export type Bytes = Uint8Array | HexString; +export type Numbers = number | bigint | string | HexString; + +// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment +export const TypedArray = Object.getPrototypeOf(Uint8Array); diff --git a/packages/web3-types/src/utility_types.ts b/packages/web3-types/src/utility_types.ts new file mode 100644 index 00000000000..168201fe9da --- /dev/null +++ b/packages/web3-types/src/utility_types.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Numbers } from './primitives_types.js'; + +// Make each attribute mutable by removing `readonly` +export type Mutable = { + -readonly [P in keyof T]: T[P]; +}; + +export type ConnectionEvent = { + code: number; + reason: string; + wasClean?: boolean; // if WS connection was closed properly +}; + +export type Optional = Pick, K> & Omit; +export type EncodingTypes = Numbers | boolean | Numbers[] | boolean[]; + +export type TypedObject = { + type: string; + value: EncodingTypes; +}; + +export type TypedObjectAbbreviated = { + t: string; + v: EncodingTypes; +}; + +export type Sha3Input = TypedObject | TypedObjectAbbreviated | Numbers | boolean | object; + +export type IndexKeysForArray = Exclude; + +export type ArrayToIndexObject> = { + [K in IndexKeysForArray]: T[K]; +}; + +type _Grow> = ((x: T, ...xs: A) => void) extends (...a: infer X) => void + ? X + : never; + +export type GrowToSize, N extends number> = { + 0: A; + 1: GrowToSize, N>; +}[A['length'] extends N ? 0 : 1]; + +export type FixedSizeArray = GrowToSize; diff --git a/packages/web3-types/src/web3_api_types.ts b/packages/web3-types/src/web3_api_types.ts new file mode 100644 index 00000000000..2fd94c9ecb8 --- /dev/null +++ b/packages/web3-types/src/web3_api_types.ts @@ -0,0 +1,65 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { JsonRpcId, JsonRpcIdentifier } from './json_rpc_types.js'; + +export interface ProviderMessage { + readonly type: string; + readonly data: unknown; +} + +export interface EthSubscription extends ProviderMessage { + readonly type: 'eth_subscription'; + readonly data: { + readonly subscription: string; + readonly result: unknown; + }; +} + +export interface ProviderRpcError extends Error { + code: number; + data?: unknown; +} + +export interface ProviderConnectInfo { + readonly chainId: string; +} +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Web3APISpec = Record any> | unknown; +export type Web3APIMethod = string & keyof Exclude; +export type Web3APIParams< + API extends Web3APISpec, + Method extends Web3APIMethod, +> = API extends Exclude ? Parameters : unknown; + +export interface Web3APIRequest> { + method: Method | string; + params?: Web3APIParams | readonly unknown[] | object; +} + +export interface Web3APIPayload> + extends Web3APIRequest { + readonly jsonrpc?: JsonRpcIdentifier; + readonly id?: JsonRpcId; + readonly requestOptions?: unknown; +} + +export type Web3APIReturnType< + API extends Web3APISpec, + Method extends Web3APIMethod, + // eslint-disable-next-line @typescript-eslint/no-explicit-any +> = API extends Record any> ? ReturnType : any; diff --git a/packages/web3-types/src/web3_base_provider.ts b/packages/web3-types/src/web3_base_provider.ts new file mode 100644 index 00000000000..5f840aa7488 --- /dev/null +++ b/packages/web3-types/src/web3_base_provider.ts @@ -0,0 +1,351 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Socket } from 'net'; + +import { Web3Error } from './error_types.js'; +import { EthExecutionAPI } from './apis/eth_execution_api.js'; +// eslint-disable-next-line require-extensions/require-extensions +import { + JsonRpcNotification, + JsonRpcPayload, + JsonRpcResponse, + JsonRpcResponseWithError, + JsonRpcResponseWithResult, + JsonRpcResult, + JsonRpcSubscriptionResult, +} from './json_rpc_types'; +// eslint-disable-next-line require-extensions/require-extensions +import { + Web3APISpec, + Web3APIMethod, + Web3APIReturnType, + Web3APIPayload, + ProviderConnectInfo, + ProviderRpcError, + ProviderMessage, +} from './web3_api_types'; +// eslint-disable-next-line require-extensions/require-extensions +import { Web3EthExecutionAPI } from './apis/web3_eth_execution_api'; +// eslint-disable-next-line require-extensions/require-extensions +import { Web3DeferredPromiseInterface } from './web3_deferred_promise_type'; + +const symbol = Symbol.for('web3/base-provider'); + +export interface SocketRequestItem< + API extends Web3APISpec, + Method extends Web3APIMethod, + ResponseType, +> { + payload: Web3APIPayload; + deferredPromise: Web3DeferredPromiseInterface; +} + +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md#connectivity +export type Web3ProviderStatus = 'connecting' | 'connected' | 'disconnected'; + +export type Web3ProviderEventCallback = ( + error: Error | ProviderRpcError | undefined, + result?: JsonRpcSubscriptionResult | JsonRpcNotification, +) => void; + +export type Web3ProviderMessageEventCallback = ( + result?: JsonRpcSubscriptionResult | JsonRpcNotification, +) => void; + +export type Web3Eip1193ProviderEventCallback = (data: T) => void; + +export type Web3ProviderRequestCallback = ( + // Used "null" value to match the legacy version + // eslint-disable-next-line @typescript-eslint/ban-types + err?: Error | Web3Error | null | JsonRpcResponseWithError, + response?: JsonRpcResponseWithResult, +) => void; + +export interface LegacySendProvider { + send( + payload: JsonRpcPayload

, + // Used "null" value to match the legacy version + // eslint-disable-next-line @typescript-eslint/ban-types + callback: (err: Error | null, response?: JsonRpcResponse) => void, + ): void; +} + +export interface LegacySendAsyncProvider { + sendAsync( + payload: JsonRpcPayload

, + ): Promise>; +} + +export interface LegacyRequestProvider { + request( + payload: JsonRpcPayload

, + // eslint-disable-next-line @typescript-eslint/ban-types + callback: (err: Error | null, response: JsonRpcResponse) => void, + ): void; +} + +export interface SimpleProvider { + request, ResponseType = Web3APIReturnType>( + args: Web3APIPayload, + ): Promise | unknown>; +} + +export interface ProviderInfo { + chainId: string; +} + +export type ProviderChainId = string; + +export type ProviderAccounts = string[]; + + +export type Eip1193EventName = + | 'connect' + | 'disconnect' + | 'message' + | 'chainChanged' + | 'accountsChanged'; + +export interface EIP1193Provider extends SimpleProvider { + on(event: 'connect', listener: (info: ProviderInfo) => void): void; + on(event: 'disconnect', listener: (error: ProviderRpcError) => void): void; + on(event: 'message', listener: (message: ProviderMessage) => void): void; + on(event: 'chainChanged', listener: (chainId: ProviderChainId) => void): void; + on(event: 'accountsChanged', listener: (accounts: ProviderAccounts) => void): void; + + removeListener(event: 'connect', listener: (info: ProviderInfo) => void): void; + removeListener(event: 'disconnect', listener: (error: ProviderRpcError) => void): void; + removeListener(event: 'message', listener: (message: ProviderMessage) => void): void; + removeListener(event: 'chainChanged', listener: (chainId: ProviderChainId) => void): void; + removeListener(event: 'accountsChanged', listener: (accounts: ProviderAccounts) => void): void; +} + +export interface MetaMaskProvider extends SimpleProvider { + on(event: 'connect', listener: (info: ProviderInfo) => void): void; + on(event: 'disconnect', listener: (error: ProviderRpcError) => void): void; + on(event: 'message', listener: (message: ProviderMessage) => void): void; + on(event: 'chainChanged', listener: (chainId: ProviderChainId) => void): void; + on(event: 'accountsChanged', listener: (accounts: ProviderAccounts) => void): void; + + removeListener(event: 'connect', listener: (info: ProviderInfo) => void): void; + removeListener(event: 'disconnect', listener: (error: ProviderRpcError) => void): void; + removeListener(event: 'message', listener: (message: ProviderMessage) => void): void; + removeListener(event: 'chainChanged', listener: (chainId: ProviderChainId) => void): void; + removeListener(event: 'accountsChanged', listener: (accounts: ProviderAccounts) => void): void; + isMetaMask: boolean; +} + + +export type Eip1193Compatible = Omit< + // eslint-disable-next-line no-use-before-define + Omit, + 'asEIP1193Provider' +> & { + request< + Method extends Web3APIMethod, + ResultType = Web3APIReturnType | unknown, + >( + request: Web3APIPayload, + ): Promise; +}; + +// Provider interface compatible with EIP-1193 +// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md +export abstract class Web3BaseProvider + implements LegacySendProvider, LegacySendAsyncProvider, EIP1193Provider +{ + public static isWeb3Provider(provider: unknown) { + return ( + provider instanceof Web3BaseProvider || + Boolean(provider && (provider as { [symbol]: boolean })[symbol]) + ); + } + + // To match an object "instanceof" does not work if + // matcher class and object is using different package versions + // to overcome this bottleneck used this approach. + // The symbol value for one string will always remain same regardless of package versions + // eslint-disable-next-line class-methods-use-this + public get [symbol]() { + return true; + } + + public abstract getStatus(): Web3ProviderStatus; + public abstract supportsSubscriptions(): boolean; + + /** + * @deprecated Please use `.request` instead. + * @param payload - Request Payload + * @param callback - Callback + */ + public send( + payload: JsonRpcPayload

, + // eslint-disable-next-line @typescript-eslint/ban-types + callback: (err: Error | null, response?: JsonRpcResponse) => void, + ) { + this.request, ResultType>( + payload as Web3APIPayload>, + ) + .then(response => { + // eslint-disable-next-line no-null/no-null + callback(null, response); + }) + .catch((err: Error | Web3Error) => { + callback(err); + }); + } + + /** + * @deprecated Please use `.request` instead. + * @param payload - Request Payload + */ + public async sendAsync(payload: JsonRpcPayload

) { + return this.request(payload as Web3APIPayload>) as Promise< + JsonRpcResponse + >; + } + + /** + * Modify the return type of the request method to be fully compatible with EIP-1193 + * + * [deprecated] In the future major releases (\>= v5) all providers are supposed to be fully compatible with EIP-1193. + * So this method will not be needed and would not be available in the future. + * + * @returns A new instance of the provider with the request method fully compatible with EIP-1193 + * + * @example + * ```ts + * const provider = new Web3HttpProvider('http://localhost:8545'); + * const fullyCompatibleProvider = provider.asEIP1193Provider(); + * const result = await fullyCompatibleProvider.request({ method: 'eth_getBalance' }); + * console.log(result); // '0x0234c8a3397aab58' or something like that + * ``` + */ + public asEIP1193Provider(): Eip1193Compatible { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const newObj = Object.create(this) as Eip1193Compatible; + // eslint-disable-next-line @typescript-eslint/unbound-method + const originalRequest = newObj.request; + newObj.request = async function request( + args: Web3APIPayload>, + ): Promise { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const response = (await originalRequest(args)) as JsonRpcResponseWithResult; + return response.result; + } as typeof newObj.request; + // @ts-expect-error the property should not be available in the new object because of using Object.create(this). + // But it is available if we do not delete it. + newObj.asEIP1193Provider = undefined; // to prevent the user for calling this method again + return newObj; + } + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md#request + public abstract request< + Method extends Web3APIMethod, + ResultType = Web3APIReturnType | unknown, + >(args: Web3APIPayload): Promise>; + + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md#events + + public abstract on( + type: 'disconnect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract on( + type: 'message' | string, + listener: + | Web3Eip1193ProviderEventCallback + | Web3ProviderMessageEventCallback, + ): void; + // for old providers + public abstract on( + type: 'data' | string, + listener: + | Web3Eip1193ProviderEventCallback + | Web3ProviderMessageEventCallback, + ): void; + public abstract on( + type: 'connect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract on( + type: 'chainChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract on( + type: 'accountsChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract removeListener( + type: 'disconnect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract removeListener( + type: 'message' | string, + listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback, + ): void; + public abstract removeListener( + type: 'connect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract removeListener( + type: 'chainChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract removeListener( + type: 'accountsChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract once( + type: 'disconnect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract once( + type: 'message' | string, + listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback, + ): void; + public abstract once( + type: 'connect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract once( + type: 'chainChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract once( + type: 'accountsChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public abstract removeAllListeners?(type: string): void; + public abstract connect(): void; + public abstract disconnect(code?: number, data?: string): void; + public abstract reset(): void; +} + +export type SupportedProviders = + | EIP1193Provider + | Web3BaseProvider + | LegacyRequestProvider + | LegacySendProvider + | LegacySendAsyncProvider + | SimpleProvider + | MetaMaskProvider; + +export type Web3BaseProviderConstructor = new ( + url: string, + net?: Socket, +) => Web3BaseProvider; diff --git a/packages/web3-types/src/web3_base_wallet.ts b/packages/web3-types/src/web3_base_wallet.ts new file mode 100644 index 00000000000..484e8072603 --- /dev/null +++ b/packages/web3-types/src/web3_base_wallet.ts @@ -0,0 +1,120 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Transaction } from './eth_types.js'; +import { HexString } from './primitives_types.js'; + +export type Cipher = 'aes-128-ctr' | 'aes-128-cbc' | 'aes-256-cbc'; + +export type CipherOptions = { + salt?: Uint8Array | string; + iv?: Uint8Array | string; + kdf?: 'scrypt' | 'pbkdf2'; + dklen?: number; + c?: number; // iterrations + n?: number; // cpu/memory cost + r?: number; // block size + p?: number; // parallelization cost +}; + +export type ScryptParams = { + dklen: number; + n: number; + p: number; + r: number; + salt: Uint8Array | string; +}; +export type PBKDF2SHA256Params = { + c: number; // iterations + dklen: number; + prf: 'hmac-sha256'; + salt: Uint8Array | string; +}; + +export type KeyStore = { + crypto: { + cipher: Cipher; + ciphertext: string; + cipherparams: { + iv: string; + }; + kdf: 'pbkdf2' | 'scrypt'; + kdfparams: ScryptParams | PBKDF2SHA256Params; + mac: HexString; + }; + id: string; + version: 3; + address: string; +}; + +export interface Web3BaseWalletAccount { + [key: string]: unknown; + readonly address: string; + readonly privateKey: string; + readonly signTransaction: (tx: Transaction) => Promise<{ + readonly messageHash: HexString; + readonly r: HexString; + readonly s: HexString; + readonly v: HexString; + readonly rawTransaction: HexString; + readonly transactionHash: HexString; + }>; + readonly sign: (data: Record | string) => { + readonly messageHash: HexString; + readonly r: HexString; + readonly s: HexString; + readonly v: HexString; + readonly message?: string; + readonly signature: HexString; + }; + readonly encrypt: (password: string, options?: Record) => Promise; +} + +export interface Web3AccountProvider { + privateKeyToAccount: (privateKey: string) => T; + create: () => T; + decrypt: ( + keystore: KeyStore | string, + password: string, + options?: Record, + ) => Promise; +} + +export abstract class Web3BaseWallet extends Array { + protected readonly _accountProvider: Web3AccountProvider; + + public constructor(accountProvider: Web3AccountProvider) { + super(); + this._accountProvider = accountProvider; + } + + public abstract create(numberOfAccounts: number): this; + public abstract add(account: T | string): this; + public abstract get(addressOrIndex: string | number): T | undefined; + public abstract remove(addressOrIndex: string | number): boolean; + public abstract clear(): this; + public abstract encrypt( + password: string, + options?: Record, + ): Promise; + public abstract decrypt( + encryptedWallet: KeyStore[], + password: string, + options?: Record, + ): Promise; + public abstract save(password: string, keyName?: string): Promise; + public abstract load(password: string, keyName?: string): Promise; +} diff --git a/packages/web3-types/src/web3_deferred_promise_type.ts b/packages/web3-types/src/web3_deferred_promise_type.ts new file mode 100644 index 00000000000..eadd39db2b2 --- /dev/null +++ b/packages/web3-types/src/web3_deferred_promise_type.ts @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export interface Web3DeferredPromiseInterface extends Promise { + state: 'pending' | 'fulfilled' | 'rejected'; + resolve(value: T | PromiseLike): void; + reject(reason?: unknown): void; + startTimer(): void; +} diff --git a/packages/web3-types/test/.eslintrc.js b/packages/web3-types/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-types/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-types/test/config/jest.config.js b/packages/web3-types/test/config/jest.config.js new file mode 100644 index 00000000000..7d959c45719 --- /dev/null +++ b/packages/web3-types/test/config/jest.config.js @@ -0,0 +1,40 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-types/test/config/setup.js b/packages/web3-types/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-types/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-types/test/integration/jest.config.js b/packages/web3-types/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-types/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-types/test/integration/setup.js b/packages/web3-types/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-types/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-types/test/tsconfig.json b/packages/web3-types/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-types/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-types/test/unit/jest.config.js b/packages/web3-types/test/unit/jest.config.js new file mode 100644 index 00000000000..81c51a857f5 --- /dev/null +++ b/packages/web3-types/test/unit/jest.config.js @@ -0,0 +1,11 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + coverageDirectory: '.coverage/unit', + collectCoverageFrom: ['src/**'], +}; diff --git a/packages/web3-types/test/unit/web3_base_provider.test.ts b/packages/web3-types/test/unit/web3_base_provider.test.ts new file mode 100644 index 00000000000..7e95bf9f8c3 --- /dev/null +++ b/packages/web3-types/test/unit/web3_base_provider.test.ts @@ -0,0 +1,65 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + EthExecutionAPI, + JsonRpcResponseWithResult, + Web3APIMethod, + Web3APIPayload, + Web3APIReturnType, + Web3BaseProvider, +} from '../../src/index.js'; + +// @ts-expect-error mock class for testing. The abstract methods are not implemented. +class Web3ChildProvider extends Web3BaseProvider { + // eslint-disable-next-line class-methods-use-this + public async request< + Method extends Web3APIMethod, + ResultType = Web3APIReturnType | unknown, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + >(_: Web3APIPayload): Promise> { + return new Promise(resolve => + // eslint-disable-next-line no-promise-executor-return + resolve({ + jsonrpc: '2.0', + id: 1, + result: 'result' as unknown as ResultType, + }), + ); + } +} + +describe('Web3BaseProvider', () => { + it('asEIP1193Provider will fix the returned result of the request method', async () => { + const childProvider = new Web3ChildProvider(); + const returnValue = await childProvider.request({ method: 'eth_getBalance' }); + expect(returnValue.result).toBe('result'); + + const eip1193CompatibleClass = childProvider.asEIP1193Provider(); + const returnValue2 = await eip1193CompatibleClass.request({ + method: 'eth_getBalance', + }); + expect(returnValue2).toBe('result'); + }); + + it('asEIP1193Provider would not be available inside the newly generated class', () => { + const childProvider = new Web3ChildProvider(); + + const eip1193CompatibleClass = childProvider.asEIP1193Provider(); + expect((eip1193CompatibleClass as any).asEIP1193Provider).toBeUndefined(); + }); +}); diff --git a/packages/web3-types/tsconfig.cjs.json b/packages/web3-types/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-types/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-types/tsconfig.esm.json b/packages/web3-types/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-types/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-types/tsconfig.types.json b/packages/web3-types/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-types/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-types/tsdoc.json b/packages/web3-types/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-types/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-utils/.eslintignore b/packages/web3-utils/.eslintignore new file mode 100644 index 00000000000..fea9beae6d6 --- /dev/null +++ b/packages/web3-utils/.eslintignore @@ -0,0 +1,6 @@ +dist +lib +jest.config.js +.eslintrc.js +cypress +cypress.config.js diff --git a/packages/web3-utils/.eslintrc.js b/packages/web3-utils/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-utils/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-utils/.gitignore b/packages/web3-utils/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-utils/.npmignore b/packages/web3-utils/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-utils/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-utils/.prettierignore b/packages/web3-utils/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-utils/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-utils/.prettierrc.json b/packages/web3-utils/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-utils/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-utils/CHANGELOG.md b/packages/web3-utils/CHANGELOG.md new file mode 100644 index 00000000000..f3a240fde97 --- /dev/null +++ b/packages/web3-utils/CHANGELOG.md @@ -0,0 +1,208 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.1-alpha.1] + +### Added + +- Added and exported three reusable utility functions: `pollTillDefined`, `rejectIfTimeout` and `rejectIfConditionAtInterval` which are useful when dealing with promises that involves polling, rejecting after timeout or rejecting if a condition was met when calling repeatably at every time intervals. + +## [4.0.1-alpha.2] + +### Added + +- Export a new function `uuidV4` that generates a random v4 Uuid (#5373). +- Enable passing a starting number, to increment based on it, for the Json Rpc Request `id` (#5652). +- Export a new function `isPromise` that checks if an object is a promise (#5652). + +### Fixed + +- Use Uuid for the response id, to fix the issue "Responses get mixed up due to conflicting payload IDs" (#5373). + +## [4.0.1-alpha.3] + +### Changed + +- Updated dependencies (#5725) + +## [4.0.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) +- Add SocketProvider class and Eip1193Provider abstract class (#5683) + +## [4.0.1-alpha.5] + +### Changed + +- web3.js dependencies (#5757) + +## [4.0.1-rc.0] + +### Removed + +- Moved `TypedArray` to `web3-types` (was also duplicated at `web3-validator`) (#5771) +- Removed support of `genesis` tag in `compareBlockNumbers` function (#5823) + +### Added + +- Added support of `safe` and `finalized` block tags (#5823) + +### Changed + +- `compareBlockNumbers` function now only supports comparison of both blocktags params ( except `earliest` vs number) or both block number params (#5842) +- `SocketProvider` abstract class now resolves JSON RPC response errors instead of rejecting them (#5844) +- Exposes the getter of `SocketConnection` in `SocketProvider` (#5891) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +### Changed + +- The types `FMT_NUMBER`, `NumberTypes`, `FMT_BYTES`, `ByteTypes`, `DataFormat`, `DEFAULT_RETURN_FORMAT`, `ETH_DATA_FORMAT` and `FormatType` moved to `web3-types`. (#5993) + +### Removed + +- Removed dependencies @ethereumjs/tx, @ethereumjs/common (#5963) + +## [4.0.1-rc.2] + +### Added + +- Optional `hexstrict` parameter added to numberToHex (#6004) + +### Changed + +- Replaced Buffer for Uint8Array (#6004) +- The methods `hexToBytes`, `randomBytes` does not return type `Buffer` but type `Uint8Array` (#6004) +- The methods `sha3` and `keccak256Wrapper` does not accept type `Buffer` but type `Uint8Array` (#6004) +- The method `bytesToBuffer` has been removed for the usage of `bytesToUint8Array` (#6004) + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Changed + +- Dependencies updated + +## [4.0.3] + +### Fixed + +- BigInts pass validation within the method `numberToHex` (#6206) + +## [4.0.4] + +### Changed + +- Dependencies updated + +## [4.0.5] + +### Changed + +- Dependencies updated + +## [4.0.6] + +### Fixed + +- `soliditySha3()` with BigInt support + +## [4.0.7] + +### Added + +- As a replacment of the node EventEmitter, a custom `EventEmitter` has been implemented and exported. (#6398) + +### Fixed + +- Fix issue with default config with babel (and React): "TypeError: Cannot convert a BigInt value to a number #6187" (#6506) +- Fixed bug in chunks processing logic (#6496) + +## [4.1.0] + +### Added + +- `SocketProvider` now contains public function `getPendingRequestQueueSize`, `getSentRequestsQueueSize` and `clearQueues` (#6479) +- Added `safeDisconnect` as a `SocketProvider` method to disconnect only when request queue size and send request queue size is 0 (#6479) +- Add `isContractInitOptions` method (#6555) + +### Fixed + +- Fix unnecessary array copy when pack encoding (#6553) + +## [4.1.1] + +### Fixed + +- Fixed an issue with detecting Uint8Array (#6486) + +## [4.2.0] + +### Added + +- Adds missing exported type `AbiItem` from 1.x to v4 for compatabiltiy (#6678) + +## [4.2.1] + +### Fixed + +- replaced our eventEmitter to EventEmitter3 to support react native builds (#6253) + +## [4.2.2] + +### Fixed + +- fixed erroneous parsing of big numbers in the `toNumber(...)` function (#6880) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-utils/README.md b/packages/web3-utils/README.md index d541723f10e..78cce56e322 100644 --- a/packages/web3-utils/README.md +++ b/packages/web3-utils/README.md @@ -1,21 +1,34 @@ +

+ web3.js +

+ # web3-utils -[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] This is a sub-package of [web3.js][repo]. -This contains useful utility functions for Dapp developers. - -Please read the [documentation][docs] for more. +`web3-utils` This contains useful utility functions for Dapp developers. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3-utils) or using [Yarn](https://yarnpkg.com/package/web3-utils) + +### Using NPM ```bash npm install web3-utils ``` +### Using Yarn + +```bash +yarn add web3-utils +``` + ## Usage ```js @@ -29,15 +42,31 @@ console.log(Web3Utils); } ``` -## Types +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts -All the TypeScript typings are placed in the `types` folder. +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[npm-image]: https://img.shields.io/npm/v/web3-utils.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-utils +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-utils%2Fpackage.json [npm-url]: https://npmjs.org/package/web3-utils -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3-utils -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3-utils -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3-utils -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3-utils +[downloads-image]: https://img.shields.io/npm/dm/web3-utils?label=npm%20downloads diff --git a/packages/web3-utils/assets/logo/web3js.ai b/packages/web3-utils/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-utils/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-utils/assets/logo/web3js.jpg b/packages/web3-utils/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-utils/assets/logo/web3js.jpg differ diff --git a/packages/web3-utils/assets/logo/web3js.svg b/packages/web3-utils/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-utils/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-utils/cypress b/packages/web3-utils/cypress new file mode 120000 index 00000000000..4a671a7beac --- /dev/null +++ b/packages/web3-utils/cypress @@ -0,0 +1 @@ +../../templates/cypress \ No newline at end of file diff --git a/packages/web3-utils/cypress.config.js b/packages/web3-utils/cypress.config.js new file mode 120000 index 00000000000..8cd9ba29af0 --- /dev/null +++ b/packages/web3-utils/cypress.config.js @@ -0,0 +1 @@ +../../templates/cypress.config.js \ No newline at end of file diff --git a/packages/web3-utils/package-lock.json b/packages/web3-utils/package-lock.json deleted file mode 100644 index 98fe803e4a7..00000000000 --- a/packages/web3-utils/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "web3-utils", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true - } - } -} diff --git a/packages/web3-utils/package.json b/packages/web3-utils/package.json index c5e16531b80..33be7953d0f 100644 --- a/packages/web3-utils/package.json +++ b/packages/web3-utils/package.json @@ -1,30 +1,72 @@ { - "name": "web3-utils", - "version": "1.3.0", - "description": "Collection of utility functions used in web3.js.", - "repository": "https://github.com/ethereum/web3.js/tree/1.x/packages/web3-utils", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "main": "lib/index.js", - "dependencies": { - "bn.js": "^4.11.9", - "eth-lib": "0.2.8", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - }, - "devDependencies": { - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3-utils", + "sideEffects": false, + "version": "4.2.2", + "description": "Collection of utility functions used in web3.js.", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests", + "test:e2e:electron": "npx cypress run --headless --browser electron", + "test:e2e:chrome": "npx cypress run --headless --browser chrome", + "test:e2e:firefox": "npx cypress run --headless --browser firefox" + }, + "devDependencies": { + "@humeris/espresso-shot": "^4.0.0", + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-extended": "^3.0.1", + "js-sha3": "^0.8.0", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + }, + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "eventemitter3": "^5.0.1", + "web3-errors": "^1.1.4", + "web3-types": "^1.5.0", + "web3-validator": "^2.0.5" + } } diff --git a/packages/web3-utils/src/chunk_response_parser.ts b/packages/web3-utils/src/chunk_response_parser.ts new file mode 100644 index 00000000000..76bd00504fe --- /dev/null +++ b/packages/web3-utils/src/chunk_response_parser.ts @@ -0,0 +1,99 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { JsonRpcResponse } from 'web3-types'; +import { InvalidResponseError } from 'web3-errors'; +import { EventEmitter } from 'eventemitter3'; +import { Timeout } from './promise_helpers.js'; + +export class ChunkResponseParser { + private lastChunk: string | undefined; + private lastChunkTimeout: Timeout | undefined; + private _clearQueues: (() => void) | undefined; + private readonly eventEmitter: EventEmitter; + private readonly autoReconnect: boolean; + private readonly chunkTimeout: number; + + public constructor(eventEmitter: EventEmitter, autoReconnect: boolean) { + this.eventEmitter = eventEmitter; + this.autoReconnect = autoReconnect; + this.chunkTimeout = 1000 * 15; + } + private clearQueues(): void { + if (typeof this._clearQueues === 'function') { + this._clearQueues(); + } + } + + public onError(clearQueues?: () => void) { + this._clearQueues = clearQueues; + } + + public parseResponse(data: string): JsonRpcResponse[] { + const returnValues: JsonRpcResponse[] = []; + + // DE-CHUNKER + const dechunkedData = data + .replace(/\}[\n\r]?\{/g, '}|--|{') // }{ + .replace(/\}\][\n\r]?\[\{/g, '}]|--|[{') // }][{ + .replace(/\}[\n\r]?\[\{/g, '}|--|[{') // }[{ + .replace(/\}\][\n\r]?\{/g, '}]|--|{') // }]{ + .split('|--|'); + + dechunkedData.forEach(_chunkData => { + // prepend the last chunk + let chunkData = _chunkData; + if (this.lastChunk) { + chunkData = this.lastChunk + chunkData; + } + + let result; + + try { + result = JSON.parse(chunkData) as unknown as JsonRpcResponse; + } catch (e) { + this.lastChunk = chunkData; + + // start timeout to cancel all requests + if (this.lastChunkTimeout) { + clearTimeout(this.lastChunkTimeout); + } + + this.lastChunkTimeout = setTimeout(() => { + if (this.autoReconnect) return; + this.clearQueues(); + this.eventEmitter.emit( + 'error', + new InvalidResponseError({ + id: 1, + jsonrpc: '2.0', + error: { code: 2, message: 'Chunk timeout' }, + }), + ); + }, this.chunkTimeout); + return; + } + + // cancel timeout and set chunk to null + clearTimeout(this.lastChunkTimeout); + this.lastChunk = undefined; + + if (result) returnValues.push(result); + }); + + return returnValues; + } +} diff --git a/packages/web3-utils/src/converters.ts b/packages/web3-utils/src/converters.ts new file mode 100644 index 00000000000..862e9e31d53 --- /dev/null +++ b/packages/web3-utils/src/converters.ts @@ -0,0 +1,662 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * @module Utils + */ + +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { bytesToUtf8, utf8ToBytes as ecUtf8ToBytes } from 'ethereum-cryptography/utils.js'; +import { Address, Bytes, HexString, Numbers, ValueTypes } from 'web3-types'; +import { + isAddress, + isHex, + isHexStrict, + isInt, + isUInt, + isNullish, + utils, + utils as validatorUtils, + validator, +} from 'web3-validator'; + +import { + HexProcessingError, + InvalidAddressError, + InvalidBooleanError, + InvalidBytesError, + InvalidNumberError, + InvalidUnitError, +} from 'web3-errors'; +import { isUint8Array } from './uint8array.js'; + +// Ref: https://ethdocs.org/en/latest/ether.html +// Note: this could be simplified using ** operator, but babel does not handle it well (https://github.com/babel/babel/issues/13109) +/** @internal */ +export const ethUnitMap = { + noether: BigInt(0), + wei: BigInt(1), + kwei: BigInt(1000), + Kwei: BigInt(1000), + babbage: BigInt(1000), + femtoether: BigInt(1000), + mwei: BigInt(1000000), + Mwei: BigInt(1000000), + lovelace: BigInt(1000000), + picoether: BigInt(1000000), + gwei: BigInt(1000000000), + Gwei: BigInt(1000000000), + shannon: BigInt(1000000000), + nanoether: BigInt(1000000000), + nano: BigInt(1000000000), + szabo: BigInt(1000000000000), + microether: BigInt(1000000000000), + micro: BigInt(1000000000000), + finney: BigInt(1000000000000000), + milliether: BigInt(1000000000000000), + milli: BigInt(1000000000000000), + ether: BigInt('1000000000000000000'), + kether: BigInt('1000000000000000000000'), + grand: BigInt('1000000000000000000000'), + mether: BigInt('1000000000000000000000000'), + gether: BigInt('1000000000000000000000000000'), + tether: BigInt('1000000000000000000000000000000'), +}; + +export type EtherUnits = keyof typeof ethUnitMap; +/** + * Convert a value from bytes to Uint8Array + * @param data - Data to be converted + * @returns - The Uint8Array representation of the input data + * + * @example + * ```ts + * console.log(web3.utils.bytesToUint8Array("0xab"))); + * > Uint8Array(1) [ 171 ] + * ``` + */ +export const bytesToUint8Array = (data: Bytes): Uint8Array | never => { + validator.validate(['bytes'], [data]); + + if (isUint8Array(data)) { + return data; + } + + if (Array.isArray(data)) { + return new Uint8Array(data); + } + + if (typeof data === 'string') { + return validatorUtils.hexToUint8Array(data); + } + + throw new InvalidBytesError(data); +}; + +/** + * @internal + */ +const { uint8ArrayToHexString } = validatorUtils; + +/** + * Convert a byte array to a hex string + * @param bytes - Byte array to be converted + * @returns - The hex string representation of the input byte array + * + * @example + * ```ts + * console.log(web3.utils.bytesToHex(new Uint8Array([72, 12]))); + * > "0x480c" + * + */ +export const bytesToHex = (bytes: Bytes): HexString => + uint8ArrayToHexString(bytesToUint8Array(bytes)); + +/** + * Convert a hex string to a byte array + * @param hex - Hex string to be converted + * @returns - The byte array representation of the input hex string + * + * @example + * ```ts + * console.log(web3.utils.hexToBytes('0x74657374')); + * > Uint8Array(4) [ 116, 101, 115, 116 ] + * ``` + */ +export const hexToBytes = (bytes: HexString): Uint8Array => { + if (typeof bytes === 'string' && bytes.slice(0, 2).toLowerCase() !== '0x') { + return bytesToUint8Array(`0x${bytes}`); + } + return bytesToUint8Array(bytes); +}; + +/** + * Converts value to it's number representation + * @param value - Hex string to be converted + * @returns - The number representation of the input value + * + * @example + * ```ts + * conoslle.log(web3.utils.hexToNumber('0xa')); + * > 10 + * ``` + */ +export const hexToNumber = (value: HexString): bigint | number => { + validator.validate(['hex'], [value]); + + // To avoid duplicate code and circular dependency we will + // use `hexToNumber` implementation from `web3-validator` + return validatorUtils.hexToNumber(value); +}; + +/** + * Converts value to it's number representation @alias `hexToNumber` + */ +export const toDecimal = hexToNumber; + +/** + * Converts value to it's hex representation + * @param value - Value to be converted + * @param hexstrict - Add padding to converted value if odd, to make it hexstrict + * @returns - The hex representation of the input value + * + * @example + * ```ts + * console.log(web3.utils.numberToHex(10)); + * > "0xa" + * ``` + */ +export const numberToHex = (value: Numbers, hexstrict?: boolean): HexString => { + if (typeof value !== 'bigint') validator.validate(['int'], [value]); + // To avoid duplicate code and circular dependency we will + // use `numberToHex` implementation from `web3-validator` + let updatedValue = validatorUtils.numberToHex(value); + if (hexstrict) { + if (!updatedValue.startsWith('-') && updatedValue.length % 2 === 1) { + // To avoid duplicate a circular dependency we will not be using the padLeft method + updatedValue = '0x0'.concat(updatedValue.slice(2)); + } else if (updatedValue.length % 2 === 0 && updatedValue.startsWith('-')) + updatedValue = '-0x0'.concat(updatedValue.slice(3)); + } + return updatedValue; +}; +/** + * Converts value to it's hex representation @alias `numberToHex` + * + */ +export const fromDecimal = numberToHex; + +/** + * Converts value to it's decimal representation in string + * @param value - Hex string to be converted + * @returns - The decimal representation of the input value + * + * @example + * ```ts + * console.log(web3.utils.hexToNumberString('0xa')); + * > "10" + * ``` + */ +export const hexToNumberString = (data: HexString): string => hexToNumber(data).toString(); + +/** + * Should be called to get hex representation (prefixed by 0x) of utf8 string + * @param str - Utf8 string to be converted + * @returns - The hex representation of the input string + * + * @example + * ```ts + * console.log(utf8ToHex('web3.js')); + * > "0x776562332e6a73" + * ``` + * + */ +export const utf8ToHex = (str: string): HexString => { + validator.validate(['string'], [str]); + + // To be compatible with 1.x trim null character + // eslint-disable-next-line no-control-regex + let strWithoutNullCharacter = str.replace(/^(?:\u0000)/, ''); + // eslint-disable-next-line no-control-regex + strWithoutNullCharacter = strWithoutNullCharacter.replace(/(?:\u0000)$/, ''); + + return bytesToHex(new TextEncoder().encode(strWithoutNullCharacter)); +}; + +/** + * @alias utf8ToHex + */ + +export const fromUtf8 = utf8ToHex; +/** + * @alias utf8ToHex + */ +export const stringToHex = utf8ToHex; + +/** + * Should be called to get utf8 from it's hex representation + * @param str - Hex string to be converted + * @returns - Utf8 string + * + * @example + * ```ts + * console.log(web3.utils.hexToUtf8('0x48656c6c6f20576f726c64')); + * > Hello World + * ``` + */ +export const hexToUtf8 = (str: HexString): string => bytesToUtf8(hexToBytes(str)); + +/** + * @alias hexToUtf8 + */ +export const toUtf8 = (input: HexString | Uint8Array) => { + if (typeof input === 'string') { + return hexToUtf8(input); + } + validator.validate(['bytes'], [input]); + return bytesToUtf8(input); +}; + +export const utf8ToBytes = ecUtf8ToBytes; + +/** + * @alias hexToUtf8 + */ +export const hexToString = hexToUtf8; + +/** + * Should be called to get hex representation (prefixed by 0x) of ascii string + * @param str - String to be converted to hex + * @returns - Hex string + * + * @example + * ```ts + * console.log(web3.utils.asciiToHex('Hello World')); + * > 0x48656c6c6f20576f726c64 + * ``` + */ +export const asciiToHex = (str: string): HexString => { + validator.validate(['string'], [str]); + let hexString = ''; + for (let i = 0; i < str.length; i += 1) { + const hexCharCode = str.charCodeAt(i).toString(16); + // might need a leading 0 + hexString += hexCharCode.length % 2 !== 0 ? `0${hexCharCode}` : hexCharCode; + } + return `0x${hexString}`; +}; + +/** + * @alias asciiToHex + */ +export const fromAscii = asciiToHex; + +/** + * Should be called to get ascii from it's hex representation + * @param str - Hex string to be converted to ascii + * @returns - Ascii string + * + * @example + * ```ts + * console.log(web3.utils.hexToAscii('0x48656c6c6f20576f726c64')); + * > Hello World + * ``` + */ +export const hexToAscii = (str: HexString): string => { + const decoder = new TextDecoder('ascii'); + return decoder.decode(hexToBytes(str)); +}; + +/** + * @alias hexToAscii + */ +export const toAscii = hexToAscii; + +/** + * Auto converts any given value into it's hex representation. + * @param value - Value to be converted to hex + * @param returnType - If true, it will return the type of the value + * + * @example + * ```ts + * console.log(web3.utils.toHex(10)); + * > 0xa + * + * console.log(web3.utils.toHex('0x123', true)); + * > bytes + *``` + */ +export const toHex = ( + value: Numbers | Bytes | Address | boolean | object, + returnType?: boolean, +): HexString | ValueTypes => { + if (typeof value === 'string' && isAddress(value)) { + return returnType ? 'address' : `0x${value.toLowerCase().replace(/^0x/i, '')}`; + } + + if (typeof value === 'boolean') { + // eslint-disable-next-line no-nested-ternary + return returnType ? 'bool' : value ? '0x01' : '0x00'; + } + + if (typeof value === 'number') { + // eslint-disable-next-line no-nested-ternary + return returnType ? (value < 0 ? 'int256' : 'uint256') : numberToHex(value); + } + + if (typeof value === 'bigint') { + return returnType ? 'bigint' : numberToHex(value); + } + + if (typeof value === 'object' && !!value) { + return returnType ? 'string' : utf8ToHex(JSON.stringify(value)); + } + + if (typeof value === 'string') { + if (value.startsWith('-0x') || value.startsWith('-0X')) { + return returnType ? 'int256' : numberToHex(value); + } + + if (isHexStrict(value)) { + return returnType ? 'bytes' : value; + } + if (isHex(value) && !isInt(value) && !isUInt(value)) { + return returnType ? 'bytes' : `0x${value}`; + } + if (isHex(value) && !isInt(value) && isUInt(value)) { + return returnType ? 'uint' : numberToHex(value); + } + + if (!Number.isFinite(value)) { + return returnType ? 'string' : utf8ToHex(value); + } + } + + throw new HexProcessingError(value); +}; + +/** + * Converts any given value into it's number representation, if possible, else into it's bigint representation. + * @param value - The value to convert + * @returns - Returns the value in number or bigint representation + * + * @example + * ```ts + * console.log(web3.utils.toNumber(1)); + * > 1 + * console.log(web3.utils.toNumber(Number.MAX_SAFE_INTEGER)); + * > 9007199254740991 + * + * console.log(web3.utils.toNumber(BigInt(Number.MAX_SAFE_INTEGER))); + * > 9007199254740991 + * + * console.log(web3.utils.toNumber(BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1))); + * > 9007199254740992n + * + * ``` + */ +export const toNumber = (value: Numbers): number | bigint => { + if (typeof value === 'number') { + if (value > 1e+20) { + // JavaScript converts numbers >= 10^21 to scientific notation when coerced to strings, + // leading to potential parsing errors and incorrect representations. + // For instance, String(10000000000000000000000) yields '1e+22'. + // Using BigInt prevents this + return BigInt(value); + } + return value; + } + + if (typeof value === 'bigint') { + return value >= Number.MIN_SAFE_INTEGER && value <= Number.MAX_SAFE_INTEGER + ? Number(value) + : value; + } + + if (typeof value === 'string' && isHexStrict(value)) { + return hexToNumber(value); + } + + try { + return toNumber(BigInt(value)); + } catch { + throw new InvalidNumberError(value); + } +}; + +/** + * Auto converts any given value into it's bigint representation + * + * @param value - The value to convert + * @returns - Returns the value in bigint representation + + * @example + * ```ts + * console.log(web3.utils.toBigInt(1)); + * > 1n + * ``` + */ +export const toBigInt = (value: unknown): bigint => { + if (typeof value === 'number') { + return BigInt(value); + } + + if (typeof value === 'bigint') { + return value; + } + + // isHex passes for dec, too + if (typeof value === 'string' && isHex(value)) { + if (value.startsWith('-')) { + return -BigInt(value.substring(1)); + } + return BigInt(value); + } + + throw new InvalidNumberError(value); +}; + +/** + * Takes a number of wei and converts it to any other ether unit. + * @param number - The value in wei + * @param unit - The unit to convert to + * @returns - Returns the converted value in the given unit + * + * @example + * ```ts + * console.log(web3.utils.fromWei("1", "ether")); + * > 0.000000000000000001 + * + * console.log(web3.utils.fromWei("1", "shannon")); + * > 0.000000001 + * ``` + */ +export const fromWei = (number: Numbers, unit: EtherUnits): string => { + const denomination = ethUnitMap[unit]; + + if (!denomination) { + throw new InvalidUnitError(unit); + } + + // value in wei would always be integer + // 13456789, 1234 + const value = String(toNumber(number)); + + // count number of zeros in denomination + // 1000000 -> 6 + const numberOfZerosInDenomination = denomination.toString().length - 1; + + if (numberOfZerosInDenomination <= 0) { + return value.toString(); + } + + // pad the value with required zeros + // 13456789 -> 13456789, 1234 -> 001234 + const zeroPaddedValue = value.padStart(numberOfZerosInDenomination, '0'); + + // get the integer part of value by counting number of zeros from start + // 13456789 -> '13' + // 001234 -> '' + const integer = zeroPaddedValue.slice(0, -numberOfZerosInDenomination); + + // get the fraction part of value by counting number of zeros backward + // 13456789 -> '456789' + // 001234 -> '001234' + const fraction = zeroPaddedValue.slice(-numberOfZerosInDenomination).replace(/\.?0+$/, ''); + + if (integer === '') { + return `0.${fraction}`; + } + + if (fraction === '') { + return integer; + } + + return `${integer}.${fraction}`; +}; + +/** + * Takes a number of a unit and converts it to wei. + * + * @param number - The number to convert. + * @param unit - {@link EtherUnits} The unit of the number passed. + * @returns The number converted to wei. + * + * @example + * ```ts + * console.log(web3.utils.toWei("0.001", "ether")); + * > 1000000000000000 //(wei) + * ``` + */ +// todo in 1.x unit defaults to 'ether' +export const toWei = (number: Numbers, unit: EtherUnits): string => { + validator.validate(['number'], [number]); + + const denomination = ethUnitMap[unit]; + + if (!denomination) { + throw new InvalidUnitError(unit); + } + + // if value is decimal e.g. 24.56 extract `integer` and `fraction` part + // to avoid `fraction` to be null use `concat` with empty string + const [integer, fraction] = String( + typeof number === 'string' && !isHexStrict(number) ? number : toNumber(number), + ) + .split('.') + .concat(''); + + // join the value removing `.` from + // 24.56 -> 2456 + const value = BigInt(`${integer}${fraction}`); + + // multiply value with denomination + // 2456 * 1000000 -> 2456000000 + const updatedValue = value * denomination; + + // count number of zeros in denomination + const numberOfZerosInDenomination = denomination.toString().length - 1; + + // check which either `fraction` or `denomination` have lower number of zeros + const decimals = Math.min(fraction.length, numberOfZerosInDenomination); + + if (decimals === 0) { + return updatedValue.toString(); + } + + // Add zeros to make length equal to required decimal points + // If string is larger than decimal points required then remove last zeros + return updatedValue.toString().padStart(decimals, '0').slice(0, -decimals); +}; + +/** + * Will convert an upper or lowercase Ethereum address to a checksum address. + * @param address - An address string + * @returns The checksum address + * @example + * ```ts + * web3.utils.toChecksumAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d'); + * > "0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d" + * ``` + */ +export const toChecksumAddress = (address: Address): string => { + if (!isAddress(address, false)) { + throw new InvalidAddressError(address); + } + + const lowerCaseAddress = address.toLowerCase().replace(/^0x/i, ''); + + // calling `Uint8Array.from` because `noble-hashes` checks with `instanceof Uint8Array` that fails in some edge cases: + // https://github.com/paulmillr/noble-hashes/issues/25#issuecomment-1750106284 + const hash = utils.uint8ArrayToHexString( + keccak256(validatorUtils.ensureIfUint8Array(utf8ToBytes(lowerCaseAddress))), + ); + + if ( + isNullish(hash) || + hash === '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' + ) + return ''; // // EIP-1052 if hash is equal to c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470, keccak was given empty data + + let checksumAddress = '0x'; + + const addressHash = hash.replace(/^0x/i, ''); + + for (let i = 0; i < lowerCaseAddress.length; i += 1) { + // If ith character is 8 to f then make it uppercase + if (parseInt(addressHash[i], 16) > 7) { + checksumAddress += lowerCaseAddress[i].toUpperCase(); + } else { + checksumAddress += lowerCaseAddress[i]; + } + } + return checksumAddress; +}; + +export const toBool = (value: boolean | string | number | unknown): boolean => { + if (typeof value === 'boolean') { + return value; + } + + if (typeof value === 'number' && (value === 0 || value === 1)) { + return Boolean(value); + } + + if (typeof value === 'bigint' && (value === BigInt(0) || value === BigInt(1))) { + return Boolean(value); + } + + if ( + typeof value === 'string' && + !isHexStrict(value) && + (value === '1' || value === '0' || value === 'false' || value === 'true') + ) { + if (value === 'true') { + return true; + } + if (value === 'false') { + return false; + } + return Boolean(Number(value)); + } + + if (typeof value === 'string' && isHexStrict(value) && (value === '0x1' || value === '0x0')) { + return Boolean(toNumber(value)); + } + + throw new InvalidBooleanError(value); +}; diff --git a/packages/web3-utils/src/event_emitter.ts b/packages/web3-utils/src/event_emitter.ts new file mode 100644 index 00000000000..bc7fee36f04 --- /dev/null +++ b/packages/web3-utils/src/event_emitter.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable max-classes-per-file */ + +import EventEmitter3 from 'eventemitter3'; + + +/** + * This class copy the behavior of Node.js EventEmitter class. + * It is used to provide the same interface for the browser environment. + */ +export class EventEmitter extends EventEmitter3 { + // must be defined for backwards compatibility + private maxListeners = Number.MAX_SAFE_INTEGER; + + public setMaxListeners(maxListeners: number) { + this.maxListeners = maxListeners; + return this; + } + + public getMaxListeners(): number { + return this.maxListeners; + } + +} \ No newline at end of file diff --git a/packages/web3-utils/src/formatter.ts b/packages/web3-utils/src/formatter.ts new file mode 100644 index 00000000000..1901e1fde21 --- /dev/null +++ b/packages/web3-utils/src/formatter.ts @@ -0,0 +1,303 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { FormatterError } from 'web3-errors'; +import { Bytes, DataFormat, FMT_BYTES, FMT_NUMBER, FormatType } from 'web3-types'; +import { isNullish, isObject, JsonSchema, utils, ValidationSchemaInput } from 'web3-validator'; +import { bytesToUint8Array, bytesToHex, numberToHex, toBigInt } from './converters.js'; +import { mergeDeep } from './objects.js'; +import { padLeft } from './string_manipulation.js'; +import { isUint8Array, uint8ArrayConcat } from './uint8array.js'; + +const { parseBaseType } = utils; + +export const isDataFormat = (dataFormat: unknown): dataFormat is DataFormat => + typeof dataFormat === 'object' && + !isNullish(dataFormat) && + 'number' in dataFormat && + 'bytes' in dataFormat; + +/** + * Finds the schema that corresponds to a specific data path within a larger JSON schema. + * It works by iterating over the dataPath array and traversing the JSON schema one step at a time until it reaches the end of the path. + * + * @param schema - represents a JSON schema, which is an object that describes the structure of JSON data + * @param dataPath - represents an array of strings that specifies the path to the data within the JSON schema + * @param oneOfPath - represents an optional array of two-element tuples that specifies the "oneOf" option to choose, if the schema has oneOf and the data path can match multiple subschemas + * @returns the JSON schema that matches the data path + * + */ +const findSchemaByDataPath = ( + schema: JsonSchema, + dataPath: string[], + oneOfPath: [string, number][] = [], +): JsonSchema | undefined => { + let result: JsonSchema = { ...schema } as JsonSchema; + let previousDataPath: string | undefined; + + for (const dataPart of dataPath) { + if (result.oneOf && previousDataPath) { + const path = oneOfPath.find(function (element: [string, number]) { + return (this as unknown as string) === element[0]; + }, previousDataPath ?? ''); + + if (path && path[0] === previousDataPath) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access + result = result.oneOf[path[1]]; + } + } + if (!result.properties && !result.items) { + return undefined; + } + + if (result.properties) { + result = (result.properties as Record)[dataPart]; + } else if (result.items && (result.items as JsonSchema).properties) { + const node = (result.items as JsonSchema).properties as Record; + + if (!node) { + return undefined; + } + + result = node[dataPart]; + } else if (result.items && isObject(result.items)) { + result = result.items; + } else if (result.items && Array.isArray(result.items)) { + result = result.items[parseInt(dataPart, 10)]; + } + + if (result && dataPart) previousDataPath = dataPart; + } + + return result; +}; +/** + * Converts a value depending on the format + * @param value - value to convert + * @param ethType - The type of the value to be parsed + * @param format - The format to be converted to + * @returns - The value converted to the specified format + */ +export const convertScalarValue = (value: unknown, ethType: string, format: DataFormat) => { + try { + const { baseType, baseTypeSize } = parseBaseType(ethType); + if (baseType === 'int' || baseType === 'uint') { + switch (format.number) { + case FMT_NUMBER.NUMBER: + return Number(toBigInt(value)); + case FMT_NUMBER.HEX: + return numberToHex(toBigInt(value)); + case FMT_NUMBER.STR: + return toBigInt(value).toString(); + case FMT_NUMBER.BIGINT: + return toBigInt(value); + default: + throw new FormatterError(`Invalid format: ${String(format.number)}`); + } + } + if (baseType === 'bytes') { + let paddedValue; + if (baseTypeSize) { + if (typeof value === 'string') paddedValue = padLeft(value, baseTypeSize * 2); + else if (isUint8Array(value)) { + paddedValue = uint8ArrayConcat( + new Uint8Array(baseTypeSize - value.length), + value, + ); + } + } else { + paddedValue = value; + } + switch (format.bytes) { + case FMT_BYTES.HEX: + return bytesToHex(bytesToUint8Array(paddedValue as Bytes)); + case FMT_BYTES.UINT8ARRAY: + return bytesToUint8Array(paddedValue as Bytes); + default: + throw new FormatterError(`Invalid format: ${String(format.bytes)}`); + } + } + } catch (error) { + // If someone didn't use `eth` keyword we can return original value + // as the scope of this code is formatting not validation + return value; + } + + return value; +}; +/** + * Converts the data to the specified format + * @param data - data to convert + * @param schema - The JSON schema that describes the structure of the data + * @param dataPath - A string array that specifies the path to the data within the JSON schema + * @param format - The format to be converted to + * @param oneOfPath - An optional array of two-element tuples that specifies the "oneOf" option to choose, if the schema has oneOf and the data path can match multiple subschemas + * @returns - The data converted to the specified format + */ +export const convert = ( + data: Record | unknown[] | unknown, + schema: JsonSchema, + dataPath: string[], + format: DataFormat, + oneOfPath: [string, number][] = [], +) => { + // If it's a scalar value + if (!isObject(data) && !Array.isArray(data)) { + return convertScalarValue(data, schema?.format as string, format); + } + + const object = data as Record; + + for (const [key, value] of Object.entries(object)) { + dataPath.push(key); + const schemaProp = findSchemaByDataPath(schema, dataPath, oneOfPath); + + // If value is a scaler value + if (isNullish(schemaProp)) { + delete object[key]; + dataPath.pop(); + + continue; + } + + // If value is an object, recurse into it + if (isObject(value)) { + convert(value, schema, dataPath, format); + dataPath.pop(); + continue; + } + + // If value is an array + if (Array.isArray(value)) { + let _schemaProp = schemaProp; + + // TODO This is a naive approach to solving the issue of + // a schema using oneOf. This chunk of code was intended to handle + // BlockSchema.transactions + // TODO BlockSchema.transactions are not being formatted + if (schemaProp?.oneOf !== undefined) { + // The following code is basically saying: + // if the schema specifies oneOf, then we are to loop + // over each possible schema and check if they type of the schema + // matches the type of value[0], and if so we use the oneOfSchemaProp + // as the schema for formatting + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + schemaProp.oneOf.forEach((oneOfSchemaProp: JsonSchema, index: number) => { + if ( + !Array.isArray(schemaProp?.items) && + ((typeof value[0] === 'object' && + (oneOfSchemaProp?.items as JsonSchema)?.type === 'object') || + (typeof value[0] === 'string' && + (oneOfSchemaProp?.items as JsonSchema)?.type !== 'object')) + ) { + _schemaProp = oneOfSchemaProp; + oneOfPath.push([key, index]); + } + }); + } + + if (isNullish(_schemaProp?.items)) { + // Can not find schema for array item, delete that item + delete object[key]; + dataPath.pop(); + + continue; + } + + // If schema for array items is a single type + if (isObject(_schemaProp.items) && !isNullish(_schemaProp.items.format)) { + for (let i = 0; i < value.length; i += 1) { + (object[key] as unknown[])[i] = convertScalarValue( + value[i], + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + _schemaProp?.items?.format, + format, + ); + } + + dataPath.pop(); + continue; + } + + // If schema for array items is an object + if (!Array.isArray(_schemaProp?.items) && _schemaProp?.items?.type === 'object') { + for (const arrObject of value) { + convert( + arrObject as Record | unknown[], + schema, + dataPath, + format, + oneOfPath, + ); + } + + dataPath.pop(); + continue; + } + + // If schema for array is a tuple + if (Array.isArray(_schemaProp?.items)) { + for (let i = 0; i < value.length; i += 1) { + (object[key] as unknown[])[i] = convertScalarValue( + value[i], + _schemaProp.items[i].format as string, + format, + ); + } + + dataPath.pop(); + continue; + } + } + + object[key] = convertScalarValue(value, schemaProp.format as string, format); + + dataPath.pop(); + } + + return object; +}; + +export const format = < + DataType extends Record | unknown[] | unknown, + ReturnType extends DataFormat, +>( + schema: ValidationSchemaInput | JsonSchema, + data: DataType, + returnFormat: ReturnType, +): FormatType => { + let dataToParse: Record | unknown[] | unknown; + + if (isObject(data)) { + dataToParse = mergeDeep({}, data); + } else if (Array.isArray(data)) { + dataToParse = [...data]; + } else { + dataToParse = data; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const jsonSchema: JsonSchema = isObject(schema) ? schema : utils.ethAbiToJsonSchema(schema); + + if (!jsonSchema.properties && !jsonSchema.items && !jsonSchema.format) { + throw new FormatterError('Invalid json schema for formatting'); + } + + return convert(dataToParse, jsonSchema, [], returnFormat) as FormatType< + typeof data, + ReturnType + >; +}; diff --git a/packages/web3-utils/src/hash.ts b/packages/web3-utils/src/hash.ts new file mode 100644 index 00000000000..6e498138c29 --- /dev/null +++ b/packages/web3-utils/src/hash.ts @@ -0,0 +1,399 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * This package provides utility functions for Ethereum dapps and other web3.js packages. + * + * For using Utils functions, first install Web3 package using `npm i web3` or `yarn add web3`. + * After that, Web3 Utils functions will be available as mentioned below. + * ```ts + * import { Web3 } from 'web3'; + * const web3 = new Web3(); + * + * const value = web3.utils.fromWei("1", "ether") + * + * ``` + * + * For using individual package install `web3-utils` package using `npm i web3-utils` or `yarn add web3-utils` and only import required functions. + * This is more efficient approach for building lightweight applications. + * ```ts + * import { fromWei, soliditySha3Raw } from 'web3-utils'; + * + * console.log(fromWei("1", "ether")); + * console.log(soliditySha3Raw({ type: "string", value: "helloworld" })) + * + * ``` + * @module Utils + */ + +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { utf8ToBytes } from 'ethereum-cryptography/utils.js'; +import { + InvalidAddressError, + InvalidBooleanError, + InvalidBytesError, + InvalidLargeValueError, + InvalidSizeError, + InvalidStringError, + InvalidUnsignedIntegerError, +} from 'web3-errors'; +import { + Bytes, + EncodingTypes, + Numbers, + Sha3Input, + TypedObject, + TypedObjectAbbreviated, +} from 'web3-types'; +import { utils as validatorUtils, isAddress, isNullish, isHexStrict } from 'web3-validator'; +import { + bytesToUint8Array, + bytesToHex, + hexToBytes, + toBigInt, + toHex, + toNumber, + utf8ToHex, +} from './converters.js'; +import { leftPad, rightPad, toTwosComplement } from './string_manipulation.js'; + +const SHA3_EMPTY_BYTES = '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'; + +/** + * computes the Keccak-256 hash of the input and returns a hexstring + * @param data - the input to hash + * @returns - the Keccak-256 hash of the input + * + * @example + * ```ts + * console.log(web3.utils.sha3('web3.js')); + * > 0x63667efb1961039c9bb0d6ea7a5abdd223a3aca7daa5044ad894226e1f83919a + * + * console.log(web3.utils.sha3('')); + * > undefined + * ``` + */ +export const sha3 = (data: Bytes): string | undefined => { + let updatedData: Uint8Array; + + if (typeof data === 'string') { + if (data.startsWith('0x') && isHexStrict(data)) { + updatedData = hexToBytes(data); + } else { + updatedData = utf8ToBytes(data); + } + } else { + updatedData = data; + } + const hash = bytesToHex(keccak256(validatorUtils.ensureIfUint8Array(updatedData))); + + // EIP-1052 if hash is equal to c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470, keccak was given empty data + return hash === SHA3_EMPTY_BYTES ? undefined : hash; +}; + +/** + * Will calculate the sha3 of the input but does return the hash value instead of null if for example a empty string is passed. + * @param data - the input to hash + * @returns - the Keccak-256 hash of the input + * + * @example + * ```ts + * conosle.log(web3.utils.sha3Raw('web3.js')); + * > 0x63667efb1961039c9bb0d6ea7a5abdd223a3aca7daa5044ad894226e1f83919a + * + * console.log(web3.utils.sha3Raw('')); + * > 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 + * ``` + */ +export const sha3Raw = (data: Bytes): string => { + const hash = sha3(data); + if (isNullish(hash)) { + return SHA3_EMPTY_BYTES; + } + + return hash; +}; + +/** + * A wrapper for ethereum-cryptography/keccak256 to allow hashing a `string` and a `bigint` in addition to `UInt8Array` + * @param data - the input to hash + * @returns - the Keccak-256 hash of the input + * + * @example + * ```ts + * console.log(web3.utils.keccak256Wrapper('web3.js')); + * > 0x63667efb1961039c9bb0d6ea7a5abdd223a3aca7daa5044ad894226e1f83919a + * + * console.log(web3.utils.keccak256Wrapper(1)); + * > 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6 + * + * console.log(web3.utils.keccak256Wrapper(0xaf12fd)); + * > 0x358640fd4719fa923525d74ab5ae80a594301aba5543e3492b052bf4598b794c + * ``` + */ +export const keccak256Wrapper = ( + data: Bytes | Numbers | string | ReadonlyArray, +): string => { + let processedData; + if (typeof data === 'bigint' || typeof data === 'number') { + processedData = utf8ToBytes(data.toString()); + } else if (Array.isArray(data)) { + processedData = new Uint8Array(data); + } else if (typeof data === 'string' && !isHexStrict(data)) { + processedData = utf8ToBytes(data); + } else { + processedData = bytesToUint8Array(data as Bytes); + } + return bytesToHex(keccak256(validatorUtils.ensureIfUint8Array(processedData))); +}; + +export { keccak256Wrapper as keccak256 }; + +/** + * returns type and value + * @param arg - the input to return the type and value + * @returns - the type and value of the input + */ +const getType = (arg: Sha3Input): [string, EncodingTypes] => { + if (Array.isArray(arg)) { + throw new Error('Autodetection of array types is not supported.'); + } + + let type; + let value; + // if type is given + if ( + typeof arg === 'object' && + ('t' in arg || 'type' in arg) && + ('v' in arg || 'value' in arg) + ) { + type = 't' in arg ? arg.t : arg.type; + value = 'v' in arg ? arg.v : arg.value; + + type = type.toLowerCase() === 'bigint' ? 'int' : type; + } else if (typeof arg === 'bigint') { + return ['int', arg]; + } + // otherwise try to guess the type + else { + type = toHex(arg, true); + value = toHex(arg); + + if (!type.startsWith('int') && !type.startsWith('uint')) { + type = 'bytes'; + } + } + + if ( + (type.startsWith('int') || type.startsWith('uint')) && + typeof value === 'string' && + !/^(-)?0x/i.test(value) + ) { + value = toBigInt(value); + } + return [type, value]; +}; + +/** + * returns the type with size if uint or int + * @param name - the input to return the type with size + * @returns - the type with size of the input + */ +const elementaryName = (name: string): string => { + if (name.startsWith('int[')) { + return `int256${name.slice(3)}`; + } + if (name === 'int') { + return 'int256'; + } + if (name.startsWith('uint[')) { + return `uint256'${name.slice(4)}`; + } + if (name === 'uint') { + return 'uint256'; + } + return name; +}; + +/** + * returns the size of the value of type 'byte' + */ +const parseTypeN = (value: string, typeLength: number): number => { + const typesize = /^(\d+).*$/.exec(value.slice(typeLength)); + return typesize ? parseInt(typesize[1], 10) : 0; +}; + +/** + * returns the bit length of the value + * @param value - the input to return the bit length + * @returns - the bit length of the input + */ +const bitLength = (value: bigint | number): number => { + const updatedVal = value.toString(2); + return updatedVal.length; +}; + +/** + * Pads the value based on size and type + * returns a string of the padded value + * @param type - the input to pad + * @returns = the padded value + */ +const solidityPack = (type: string, val: EncodingTypes): string => { + const value = val.toString(); + if (type === 'string') { + if (typeof val === 'string') return utf8ToHex(val); + throw new InvalidStringError(val); + } + if (type === 'bool' || type === 'boolean') { + if (typeof val === 'boolean') return val ? '01' : '00'; + throw new InvalidBooleanError(val); + } + + if (type === 'address') { + if (!isAddress(value)) { + throw new InvalidAddressError(value); + } + return value; + } + const name = elementaryName(type); + if (type.startsWith('uint')) { + const size = parseTypeN(name, 'uint'.length); + + if (size % 8 || size < 8 || size > 256) { + throw new InvalidSizeError(value); + } + const num = toNumber(value); + if (bitLength(num) > size) { + throw new InvalidLargeValueError(value); + } + if (num < BigInt(0)) { + throw new InvalidUnsignedIntegerError(value); + } + + return size ? leftPad(num.toString(16), (size / 8) * 2) : num.toString(16); + } + + if (type.startsWith('int')) { + const size = parseTypeN(name, 'int'.length); + if (size % 8 || size < 8 || size > 256) { + throw new InvalidSizeError(type); + } + + const num = toNumber(value); + if (bitLength(num) > size) { + throw new InvalidLargeValueError(value); + } + if (num < BigInt(0)) { + return toTwosComplement(num.toString(), (size / 8) * 2); + } + return size ? leftPad(num.toString(16), size / 4) : num.toString(16); + } + + if (name === 'bytes') { + if (value.replace(/^0x/i, '').length % 2 !== 0) { + throw new InvalidBytesError(value); + } + return value; + } + + if (type.startsWith('bytes')) { + if (value.replace(/^0x/i, '').length % 2 !== 0) { + throw new InvalidBytesError(value); + } + + const size = parseTypeN(type, 'bytes'.length); + + if (!size || size < 1 || size > 64 || size < value.replace(/^0x/i, '').length / 2) { + throw new InvalidBytesError(value); + } + + return rightPad(value, size * 2); + } + return ''; +}; + +/** + * returns a string of the tightly packed value given based on the type + * @param arg - the input to return the tightly packed value + * @returns - the tightly packed value + */ +export const processSolidityEncodePackedArgs = (arg: Sha3Input): string => { + const [type, val] = getType(arg); + + // array case + if (Array.isArray(val)) { + // go through each element of the array and use map function to create new hexarg list + const hexArg = val.map((v: Numbers | boolean) => solidityPack(type, v).replace('0x', '')); + return hexArg.join(''); + } + + const hexArg = solidityPack(type, val); + return hexArg.replace('0x', ''); +}; + +/** + * Encode packed arguments to a hexstring + */ +export const encodePacked = (...values: Sha3Input[]): string => { + const hexArgs = values.map(processSolidityEncodePackedArgs); + return `0x${hexArgs.join('').toLowerCase()}`; +}; + +/** + * Will tightly pack values given in the same way solidity would then hash. + * returns a hash string, or null if input is empty + * @param values - the input to return the tightly packed values + * @returns - the keccack246 of the tightly packed values + * + * @example + * ```ts + * console.log(web3.utils.soliditySha3({ type: "string", value: "31323334" })); + * > 0xf15f8da2ad27e486d632dc37d24912f634398918d6f9913a0a0ff84e388be62b + * ``` + */ +export const soliditySha3 = (...values: Sha3Input[]): string | undefined => + sha3(encodePacked(...values)); + +/** + * Will tightly pack values given in the same way solidity would then hash. + * returns a hash string, if input is empty will return `0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470` + * @param values - the input to return the tightly packed values + * @returns - the keccack246 of the tightly packed values + * + * @example + * ```ts + * console.log(web3.utils.soliditySha3Raw({ type: "string", value: "helloworld" })) + * > 0xfa26db7ca85ead399216e7c6316bc50ed24393c3122b582735e7f3b0f91b93f0 + * ``` + */ +export const soliditySha3Raw = (...values: TypedObject[] | TypedObjectAbbreviated[]): string => + sha3Raw(encodePacked(...values)); + +/** + * Get slot number for storage long string in contract. Basically for getStorage method + * returns slotNumber where will data placed + * @param mainSlotNumber - the slot number where will be stored hash of long string + * @returns - the slot number where will be stored long string + */ +export const getStorageSlotNumForLongString = (mainSlotNumber: number | string) => + sha3( + `0x${(typeof mainSlotNumber === 'number' + ? mainSlotNumber.toString() + : mainSlotNumber + ).padStart(64, '0')}`, + ); diff --git a/packages/web3-utils/src/index.js b/packages/web3-utils/src/index.js deleted file mode 100644 index fb26c6e1187..00000000000 --- a/packages/web3-utils/src/index.js +++ /dev/null @@ -1,443 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file utils.js - * @author Marek Kotewicz - * @author Fabian Vogelsteller - * @date 2017 - */ - - -var _ = require('underscore'); -var ethjsUnit = require('ethjs-unit'); -var utils = require('./utils.js'); -var soliditySha3 = require('./soliditySha3.js'); -var randombytes = require('randombytes'); -var BN = require('bn.js'); - - -/** - * Fires an error in an event emitter and callback and returns the eventemitter - * - * @method _fireError - * @param {Object} error a string, a error, or an object with {message, data} - * @param {Object} emitter - * @param {Function} reject - * @param {Function} callback - * @param {any} optionalData - * @return {Object} the emitter - */ -var _fireError = function (error, emitter, reject, callback, optionalData) { - /*jshint maxcomplexity: 10 */ - - // add data if given - if(_.isObject(error) && !(error instanceof Error) && error.data) { - if(_.isObject(error.data) || _.isArray(error.data)) { - error.data = JSON.stringify(error.data, null, 2); - } - - error = error.message +"\n"+ error.data; - } - - if(_.isString(error)) { - error = new Error(error); - } - - if (_.isFunction(callback)) { - callback(error, optionalData); - } - if (_.isFunction(reject)) { - // suppress uncatched error if an error listener is present - // OR suppress uncatched error if an callback listener is present - if ( - emitter && - (_.isFunction(emitter.listeners) && - emitter.listeners('error').length) || _.isFunction(callback) - ) { - emitter.catch(function(){}); - } - // reject later, to be able to return emitter - setTimeout(function () { - reject(error); - }, 1); - } - - if(emitter && _.isFunction(emitter.emit)) { - // emit later, to be able to return emitter - setTimeout(function () { - emitter.emit('error', error, optionalData); - emitter.removeAllListeners(); - }, 1); - } - - return emitter; -}; - -/** - * Should be used to create full function/event name from json abi - * - * @method _jsonInterfaceMethodToString - * @param {Object} json - * @return {String} full function/event name - */ -var _jsonInterfaceMethodToString = function (json) { - if (_.isObject(json) && json.name && json.name.indexOf('(') !== -1) { - return json.name; - } - - return json.name + '(' + _flattenTypes(false, json.inputs).join(',') + ')'; -}; - - -/** - * Should be used to flatten json abi inputs/outputs into an array of type-representing-strings - * - * @method _flattenTypes - * @param {bool} includeTuple - * @param {Object} puts - * @return {Array} parameters as strings - */ -var _flattenTypes = function(includeTuple, puts) -{ - // console.log("entered _flattenTypes. inputs/outputs: " + puts) - var types = []; - - puts.forEach(function(param) { - if (typeof param.components === 'object') { - if (param.type.substring(0, 5) !== 'tuple') { - throw new Error('components found but type is not tuple; report on GitHub'); - } - var suffix = ''; - var arrayBracket = param.type.indexOf('['); - if (arrayBracket >= 0) { suffix = param.type.substring(arrayBracket); } - var result = _flattenTypes(includeTuple, param.components); - // console.log("result should have things: " + result) - if(_.isArray(result) && includeTuple) { - // console.log("include tuple word, and its an array. joining...: " + result.types) - types.push('tuple(' + result.join(',') + ')' + suffix); - } - else if(!includeTuple) { - // console.log("don't include tuple, but its an array. joining...: " + result) - types.push('(' + result.join(',') + ')' + suffix); - } - else { - // console.log("its a single type within a tuple: " + result.types) - types.push('(' + result + ')'); - } - } else { - // console.log("its a type and not directly in a tuple: " + param.type) - types.push(param.type); - } - }); - - return types; -}; - - -/** - * Returns a random hex string by the given bytes size - * - * @param {Number} size - * @returns {string} - */ -var randomHex = function(size) { - return '0x' + randombytes(size).toString('hex'); -}; - -/** - * Should be called to get ascii from it's hex representation - * - * @method hexToAscii - * @param {String} hex - * @returns {String} ascii string representation of hex value - */ -var hexToAscii = function(hex) { - if (!utils.isHexStrict(hex)) - throw new Error('The parameter must be a valid HEX string.'); - - var str = ""; - var i = 0, l = hex.length; - if (hex.substring(0, 2) === '0x') { - i = 2; - } - for (; i < l; i+=2) { - var code = parseInt(hex.substr(i, 2), 16); - str += String.fromCharCode(code); - } - - return str; -}; - -/** - * Should be called to get hex representation (prefixed by 0x) of ascii string - * - * @method asciiToHex - * @param {String} str - * @returns {String} hex representation of input string - */ -var asciiToHex = function(str) { - if(!str) - return "0x00"; - var hex = ""; - for(var i = 0; i < str.length; i++) { - var code = str.charCodeAt(i); - var n = code.toString(16); - hex += n.length < 2 ? '0' + n : n; - } - - return "0x" + hex; -}; - - - -/** - * Returns value of unit in Wei - * - * @method getUnitValue - * @param {String} unit the unit to convert to, default ether - * @returns {BN} value of the unit (in Wei) - * @throws error if the unit is not correct:w - */ -var getUnitValue = function (unit) { - unit = unit ? unit.toLowerCase() : 'ether'; - if (!ethjsUnit.unitMap[unit]) { - throw new Error('This unit "'+ unit +'" doesn\'t exist, please use the one of the following units' + JSON.stringify(ethjsUnit.unitMap, null, 2)); - } - return unit; -}; - -/** - * Takes a number of wei and converts it to any other ether unit. - * - * Possible units are: - * SI Short SI Full Effigy Other - * - kwei femtoether babbage - * - mwei picoether lovelace - * - gwei nanoether shannon nano - * - -- microether szabo micro - * - -- milliether finney milli - * - ether -- -- - * - kether -- grand - * - mether - * - gether - * - tether - * - * @method fromWei - * @param {Number|String} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert to, default ether - * @return {String|Object} When given a BN object it returns one as well, otherwise a number - */ -var fromWei = function(number, unit) { - unit = getUnitValue(unit); - - if(!utils.isBN(number) && !_.isString(number)) { - throw new Error('Please pass numbers as strings or BN objects to avoid precision errors.'); - } - - return utils.isBN(number) ? ethjsUnit.fromWei(number, unit) : ethjsUnit.fromWei(number, unit).toString(10); -}; - -/** - * Takes a number of a unit and converts it to wei. - * - * Possible units are: - * SI Short SI Full Effigy Other - * - kwei femtoether babbage - * - mwei picoether lovelace - * - gwei nanoether shannon nano - * - -- microether szabo micro - * - -- microether szabo micro - * - -- milliether finney milli - * - ether -- -- - * - kether -- grand - * - mether - * - gether - * - tether - * - * @method toWei - * @param {Number|String|BN} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert from, default ether - * @return {String|Object} When given a BN object it returns one as well, otherwise a number - */ -var toWei = function(number, unit) { - unit = getUnitValue(unit); - - if(!utils.isBN(number) && !_.isString(number)) { - throw new Error('Please pass numbers as strings or BN objects to avoid precision errors.'); - } - - return utils.isBN(number) ? ethjsUnit.toWei(number, unit) : ethjsUnit.toWei(number, unit).toString(10); -}; - - - - -/** - * Converts to a checksum address - * - * @method toChecksumAddress - * @param {String} address the given HEX address - * @return {String} - */ -var toChecksumAddress = function (address) { - if (typeof address === 'undefined') return ''; - - if(!/^(0x)?[0-9a-f]{40}$/i.test(address)) - throw new Error('Given address "'+ address +'" is not a valid Ethereum address.'); - - - - address = address.toLowerCase().replace(/^0x/i,''); - var addressHash = utils.sha3(address).replace(/^0x/i,''); - var checksumAddress = '0x'; - - for (var i = 0; i < address.length; i++ ) { - // If ith character is 8 to f then make it uppercase - if (parseInt(addressHash[i], 16) > 7) { - checksumAddress += address[i].toUpperCase(); - } else { - checksumAddress += address[i]; - } - } - return checksumAddress; -}; - -/** - * Returns -1 if ab; 0 if a == b. - * For more details on this type of function, see - * developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort - * - * @method compareBlockNumbers - * - * @param {String|Number|BN} a - * - * @param {String|Number|BN} b - * - * @returns {Number} -1, 0, or 1 - */ -var compareBlockNumbers = function(a, b) { - if (a == b) { - return 0; - } else if (("genesis" == a || "earliest" == a || 0 == a) && ("genesis" == b || "earliest" == b || 0 == b)) { - return 0; - } else if ("genesis" == a || "earliest" == a) { - // b !== a, thus a < b - return -1; - } else if ("genesis" == b || "earliest" == b) { - // b !== a, thus a > b - return 1; - } else if (a == "latest") { - if (b == "pending") { - return -1; - } else { - // b !== ("pending" OR "latest"), thus a > b - return 1; - } - } else if (b === "latest") { - if (a == "pending") { - return 1; - } else { - // b !== ("pending" OR "latest"), thus a > b - return -1 - } - } else if (a == "pending") { - // b (== OR <) "latest", thus a > b - return 1; - } else if (b == "pending") { - return -1; - } else { - let bnA = new BN(a); - let bnB = new BN(b); - if(bnA.lt(bnB)) { - return -1; - } else if(bnA.eq(bnB)) { - return 0; - } else { - return 1; - } - } -}; - -module.exports = { - _fireError: _fireError, - _jsonInterfaceMethodToString: _jsonInterfaceMethodToString, - _flattenTypes: _flattenTypes, - // extractDisplayName: extractDisplayName, - // extractTypeName: extractTypeName, - randomHex: randomHex, - _: _, - BN: utils.BN, - isBN: utils.isBN, - isBigNumber: utils.isBigNumber, - isHex: utils.isHex, - isHexStrict: utils.isHexStrict, - sha3: utils.sha3, - sha3Raw: utils.sha3Raw, - keccak256: utils.sha3, - soliditySha3: soliditySha3.soliditySha3, - soliditySha3Raw: soliditySha3.soliditySha3Raw, - encodePacked: soliditySha3.encodePacked, - isAddress: utils.isAddress, - checkAddressChecksum: utils.checkAddressChecksum, - toChecksumAddress: toChecksumAddress, - toHex: utils.toHex, - toBN: utils.toBN, - - bytesToHex: utils.bytesToHex, - hexToBytes: utils.hexToBytes, - - hexToNumberString: utils.hexToNumberString, - - hexToNumber: utils.hexToNumber, - toDecimal: utils.hexToNumber, // alias - - numberToHex: utils.numberToHex, - fromDecimal: utils.numberToHex, // alias - - hexToUtf8: utils.hexToUtf8, - hexToString: utils.hexToUtf8, - toUtf8: utils.hexToUtf8, - stripHexPrefix: utils.stripHexPrefix, - - utf8ToHex: utils.utf8ToHex, - stringToHex: utils.utf8ToHex, - fromUtf8: utils.utf8ToHex, - - hexToAscii: hexToAscii, - toAscii: hexToAscii, - asciiToHex: asciiToHex, - fromAscii: asciiToHex, - - unitMap: ethjsUnit.unitMap, - toWei: toWei, - fromWei: fromWei, - - padLeft: utils.leftPad, - leftPad: utils.leftPad, - padRight: utils.rightPad, - rightPad: utils.rightPad, - toTwosComplement: utils.toTwosComplement, - - isBloom: utils.isBloom, - isUserEthereumAddressInBloom: utils.isUserEthereumAddressInBloom, - isContractAddressInBloom: utils.isContractAddressInBloom, - isTopic: utils.isTopic, - isTopicInBloom: utils.isTopicInBloom, - isInBloom: utils.isInBloom, - - compareBlockNumbers: compareBlockNumbers -}; diff --git a/packages/web3-utils/src/index.ts b/packages/web3-utils/src/index.ts new file mode 100644 index 00000000000..23eb49dde9a --- /dev/null +++ b/packages/web3-utils/src/index.ts @@ -0,0 +1,36 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './converters.js'; +export * from './event_emitter.js'; +export * from './validation.js'; +export * from './formatter.js'; +export * from './hash.js'; +export * from './random.js'; +export * from './string_manipulation.js'; +export * from './objects.js'; +export * from './promise_helpers.js'; +export * from './json_rpc.js'; +export * as jsonRpc from './json_rpc.js'; +export * from './web3_deferred_promise.js'; +export * from './chunk_response_parser.js'; +export * from './uuid.js'; +export * from './web3_eip1193_provider.js'; +export * from './socket_provider.js'; +export * from './uint8array.js'; +// for backwards compatibility with v1 +export { AbiItem } from 'web3-types'; diff --git a/packages/web3-utils/src/json_rpc.ts b/packages/web3-utils/src/json_rpc.ts new file mode 100644 index 00000000000..573d39197e3 --- /dev/null +++ b/packages/web3-utils/src/json_rpc.ts @@ -0,0 +1,130 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isNullish } from 'web3-validator'; +import { + JsonRpcPayload, + JsonRpcResponse, + JsonRpcResponseWithResult, + JsonRpcResponseWithError, + JsonRpcOptionalRequest, + JsonRpcBatchRequest, + JsonRpcNotification, + JsonRpcRequest, + JsonRpcBatchResponse, + JsonRpcSubscriptionResult, +} from 'web3-types'; +import { rpcErrorsMap } from 'web3-errors'; +import { uuidV4 } from './uuid.js'; + +// check if code is a valid rpc server error code +export const isResponseRpcError = (rpcError: JsonRpcResponseWithError) => { + const errorCode = rpcError.error.code; + return rpcErrorsMap.has(errorCode) || (errorCode >= -32099 && errorCode <= -32000); +}; + +export const isResponseWithResult = ( + response: JsonRpcResponse, +): response is JsonRpcResponseWithResult => + !Array.isArray(response) && + !!response && + response.jsonrpc === '2.0' && + // JSON RPC consider "null" as valid response + 'result' in response && + isNullish(response.error) && + (typeof response.id === 'number' || typeof response.id === 'string'); + +// To avoid circular package dependency, copied to code here. If you update this please update same function in `response_errors.ts` +export const isResponseWithError = ( + response: JsonRpcResponse, +): response is JsonRpcResponseWithError => + !Array.isArray(response) && + response.jsonrpc === '2.0' && + !!response && + isNullish(response.result) && + // JSON RPC consider "null" as valid response + 'error' in response && + (typeof response.id === 'number' || typeof response.id === 'string'); + +export const isResponseWithNotification = ( + response: JsonRpcNotification | JsonRpcSubscriptionResult, +): response is JsonRpcNotification => + !Array.isArray(response) && + !!response && + response.jsonrpc === '2.0' && + !isNullish(response.params) && + !isNullish(response.method); + +export const isSubscriptionResult = ( + response: JsonRpcNotification | JsonRpcSubscriptionResult, +): response is JsonRpcSubscriptionResult => + !Array.isArray(response) && + !!response && + response.jsonrpc === '2.0' && + 'id' in response && + // JSON RPC consider "null" as valid response + 'result' in response; + +export const validateResponse = ( + response: JsonRpcResponse, +): boolean => isResponseWithResult(response) || isResponseWithError(response); + +export const isValidResponse = ( + response: JsonRpcResponse, +): boolean => + Array.isArray(response) ? response.every(validateResponse) : validateResponse(response); + +export const isBatchResponse = ( + response: JsonRpcResponse, +): response is JsonRpcBatchResponse => + Array.isArray(response) && response.length > 0 && isValidResponse(response); + +// internal optional variable to increment and use for the jsonrpc `id` +let requestIdSeed: number | undefined; + +/** + * Optionally use to make the jsonrpc `id` start from a specific number. + * Without calling this function, the `id` will be filled with a Uuid. + * But after this being called with a number, the `id` will be a number staring from the provided `start` variable. + * However, if `undefined` was passed to this function, the `id` will be a Uuid again. + * @param start - a number to start incrementing from. + * Or `undefined` to use a new Uuid (this is the default behavior) + */ +export const setRequestIdStart = (start: number | undefined) => { + requestIdSeed = start; +}; + +export const toPayload = ( + request: JsonRpcOptionalRequest, +): JsonRpcPayload => { + if (typeof requestIdSeed !== 'undefined') { + requestIdSeed += 1; + } + return { + jsonrpc: request.jsonrpc ?? '2.0', + id: request.id ?? requestIdSeed ?? uuidV4(), + method: request.method, + params: request.params ?? undefined, + }; +}; + +export const toBatchPayload = (requests: JsonRpcOptionalRequest[]): JsonRpcBatchRequest => + requests.map(request => toPayload(request)) as JsonRpcBatchRequest; + +export const isBatchRequest = ( + request: JsonRpcBatchRequest | JsonRpcRequest | JsonRpcOptionalRequest, +): request is JsonRpcBatchRequest => Array.isArray(request) && request.length > 0; diff --git a/packages/web3-utils/src/objects.ts b/packages/web3-utils/src/objects.ts new file mode 100644 index 00000000000..feda5510e4f --- /dev/null +++ b/packages/web3-utils/src/objects.ts @@ -0,0 +1,65 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { TypedArray } from 'web3-types'; +import { isNullish } from 'web3-validator'; + +const isIterable = (item: unknown): item is Record => + typeof item === 'object' && + !isNullish(item) && + !Array.isArray(item) && + !(item instanceof TypedArray); + +// The following code is a derivative work of the code from the "LiskHQ/lisk-sdk" project, +// which is licensed under Apache version 2. +/** + * Deep merge two objects. + * @param destination - The destination object. + * @param sources - An array of source objects. + * @returns - The merged object. + */ +export const mergeDeep = ( + destination: Record, + ...sources: Record[] +): Record => { + if (!isIterable(destination)) { + return destination; + } + const result = { ...destination }; // clone deep here + for (const src of sources) { + // const src = { ..._src }; + // eslint-disable-next-line no-restricted-syntax + for (const key in src) { + if (isIterable(src[key])) { + if (!result[key]) { + result[key] = {}; + } + result[key] = mergeDeep( + result[key] as Record, + src[key] as Record, + ); + } else if (!isNullish(src[key]) && Object.hasOwnProperty.call(src, key)) { + if (Array.isArray(src[key]) || src[key] instanceof TypedArray) { + result[key] = (src[key] as unknown[]).slice(0); + } else { + result[key] = src[key]; + } + } + } + } + return result; +}; diff --git a/packages/web3-utils/src/promise_helpers.ts b/packages/web3-utils/src/promise_helpers.ts new file mode 100644 index 00000000000..c8e211fbbb7 --- /dev/null +++ b/packages/web3-utils/src/promise_helpers.ts @@ -0,0 +1,171 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isNullish } from 'web3-validator'; + +export type Timer = ReturnType; +export type Timeout = ReturnType; + + +/** + * An alternative to the node function `isPromise` that exists in `util/types` because it is not available on the browser. + * @param object - to check if it is a `Promise` + * @returns `true` if it is an `object` or a `function` that has a `then` function. And returns `false` otherwise. + */ +export function isPromise(object: unknown): boolean { + return ( + (typeof object === 'object' || typeof object === 'function') && + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + typeof (object as { then: unknown }).then === 'function' + ); +} + +export type AsyncFunction = (...args: K[]) => Promise; + +export function waitWithTimeout( + awaitable: Promise | AsyncFunction, + timeout: number, + error: Error, +): Promise; +export function waitWithTimeout( + awaitable: Promise | AsyncFunction, + timeout: number, +): Promise; + +/** + * Wait for a promise but interrupt it if it did not resolve within a given timeout. + * If the timeout reached, before the promise code resolve, either throw an error if an error object was provided, or return `undefined`. + * @param awaitable - The promise or function to wait for. + * @param timeout - The timeout in milliseconds. + * @param error - (Optional) The error to throw if the timeout reached. + */ +export async function waitWithTimeout( + awaitable: Promise | AsyncFunction, + timeout: number, + error?: Error, +): Promise { + let timeoutId: Timeout | undefined; + const result = await Promise.race([ + awaitable instanceof Promise ? awaitable : awaitable(), + new Promise((resolve, reject) => { + timeoutId = setTimeout(() => (error ? reject(error) : resolve(undefined)), timeout); + }), + ]); + if (timeoutId) { + clearTimeout(timeoutId); + } + if (result instanceof Error) { + throw result; + } + return result; +} + + +/** + * Repeatedly calls an async function with a given interval until the result of the function is defined (not undefined or null), + * or until a timeout is reached. It returns promise and intervalId. + * @param func - The function to call. + * @param interval - The interval in milliseconds. + */ +export function pollTillDefinedAndReturnIntervalId( + func: AsyncFunction, + interval: number, +): [Promise>, Timer] { + + let intervalId: Timer | undefined; + const polledRes = new Promise>((resolve, reject) => { + intervalId = setInterval(function intervalCallbackFunc(){ + (async () => { + try { + const res = await waitWithTimeout(func, interval); + + if (!isNullish(res)) { + clearInterval(intervalId); + resolve(res as unknown as Exclude); + } + } catch (error) { + clearInterval(intervalId); + reject(error); + } + })() as unknown; + return intervalCallbackFunc;}() // this will immediate invoke first call + , interval); + }); + + return [polledRes as unknown as Promise>, intervalId!]; +} + +/** + * Repeatedly calls an async function with a given interval until the result of the function is defined (not undefined or null), + * or until a timeout is reached. + * pollTillDefinedAndReturnIntervalId() function should be used instead of pollTillDefined if you need IntervalId in result. + * This function will be deprecated in next major release so use pollTillDefinedAndReturnIntervalId(). + * @param func - The function to call. + * @param interval - The interval in milliseconds. + */ +export async function pollTillDefined( + func: AsyncFunction, + interval: number, +): Promise> { + return pollTillDefinedAndReturnIntervalId(func, interval)[0]; +} +/** + * Enforce a timeout on a promise, so that it can be rejected if it takes too long to complete + * @param timeout - The timeout to enforced in milliseconds. + * @param error - The error to throw if the timeout is reached. + * @returns A tuple of the timeout id and the promise that will be rejected if the timeout is reached. + * + * @example + * ```ts + * const [timerId, promise] = web3.utils.rejectIfTimeout(100, new Error('time out')); + * ``` + */ +export function rejectIfTimeout(timeout: number, error: Error): [Timer, Promise] { + let timeoutId: Timer | undefined; + const rejectOnTimeout = new Promise((_, reject) => { + timeoutId = setTimeout(() => { + reject(error); + }, timeout); + }); + return [timeoutId!, rejectOnTimeout]; +} +/** + * Sets an interval that repeatedly executes the given cond function with the specified interval between each call. + * If the condition is met, the interval is cleared and a Promise that rejects with the returned value is returned. + * @param cond - The function/confition to call. + * @param interval - The interval in milliseconds. + * @returns - an array with the interval ID and the Promise. + */ +export function rejectIfConditionAtInterval( + cond: AsyncFunction, + interval: number, +): [Timer, Promise] { + let intervalId: Timer | undefined; + const rejectIfCondition = new Promise((_, reject) => { + intervalId = setInterval(() => { + (async () => { + const error = await cond(); + if (error) { + clearInterval(intervalId); + reject(error); + } + })() as unknown; + }, interval); + }); + return [intervalId!, rejectIfCondition]; +} + diff --git a/packages/web3-utils/src/random.ts b/packages/web3-utils/src/random.ts new file mode 100644 index 00000000000..705a6ecee61 --- /dev/null +++ b/packages/web3-utils/src/random.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * @module Utils + */ + +import { getRandomBytesSync } from 'ethereum-cryptography/random.js'; +import { bytesToHex } from './converters.js'; + +/** + * Returns a random byte array by the given bytes size + * @param size - The size of the random byte array returned + * @returns - random byte array + * + * @example + * ```ts + * console.log(web3.utils.randomBytes(32)); + * > Uint8Array(32) [ + * 93, 172, 226, 32, 33, 176, 156, 156, + * 182, 30, 240, 2, 69, 96, 174, 197, + * 33, 136, 194, 241, 197, 156, 110, 111, + * 66, 87, 17, 88, 67, 48, 245, 183 + * ] + * ``` + */ +export const randomBytes = (size: number): Uint8Array => getRandomBytesSync(size); + +/** + * Returns a random hex string by the given bytes size + * @param byteSize - The size of the random hex string returned + * @returns - random hex string + * + * ```ts + * console.log(web3.utils.randomHex(32)); + * > 0x139f5b88b72a25eab053d3b57fe1f8a9dbc62a526b1cb1774d0d7db1c3e7ce9e + * ``` + */ +export const randomHex = (byteSize: number): string => bytesToHex(randomBytes(byteSize)); diff --git a/packages/web3-utils/src/socket_provider.ts b/packages/web3-utils/src/socket_provider.ts new file mode 100644 index 00000000000..d847dcbccc9 --- /dev/null +++ b/packages/web3-utils/src/socket_provider.ts @@ -0,0 +1,573 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + ConnectionEvent, + Eip1193EventName, + EthExecutionAPI, + JsonRpcBatchRequest, + JsonRpcBatchResponse, + JsonRpcId, + JsonRpcNotification, + JsonRpcRequest, + JsonRpcResponse, + JsonRpcResponseWithResult, + JsonRpcResult, + ProviderConnectInfo, + ProviderMessage, + ProviderRpcError, + SocketRequestItem, + Web3APIMethod, + Web3APIPayload, + Web3APIReturnType, + Web3APISpec, + Web3Eip1193ProviderEventCallback, + Web3ProviderEventCallback, + Web3ProviderMessageEventCallback, + Web3ProviderStatus, +} from 'web3-types'; +import { + ConnectionError, + ConnectionNotOpenError, + InvalidClientError, + MaxAttemptsReachedOnReconnectingError, + PendingRequestsOnReconnectingError, + RequestAlreadySentError, + Web3WSProviderError, +} from 'web3-errors'; +import { Eip1193Provider } from './web3_eip1193_provider.js'; +import { ChunkResponseParser } from './chunk_response_parser.js'; +import { isNullish } from './validation.js'; +import { Web3DeferredPromise } from './web3_deferred_promise.js'; +import * as jsonRpc from './json_rpc.js'; + +export type ReconnectOptions = { + autoReconnect: boolean; + delay: number; + maxAttempts: number; +}; + +const DEFAULT_RECONNECTION_OPTIONS = { + autoReconnect: true, + delay: 5000, + maxAttempts: 5, +}; + +const NORMAL_CLOSE_CODE = 1000; // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close + +export abstract class SocketProvider< + MessageEvent, + CloseEvent, + ErrorEvent, + API extends Web3APISpec = EthExecutionAPI, +> extends Eip1193Provider { + protected isReconnecting: boolean; + protected readonly _socketPath: string; + protected readonly chunkResponseParser: ChunkResponseParser; + /* eslint-disable @typescript-eslint/no-explicit-any */ + protected readonly _pendingRequestsQueue: Map>; + /* eslint-disable @typescript-eslint/no-explicit-any */ + protected readonly _sentRequestsQueue: Map>; + protected _reconnectAttempts!: number; + protected readonly _socketOptions?: unknown; + protected readonly _reconnectOptions: ReconnectOptions; + protected _socketConnection?: unknown; + public get SocketConnection() { + return this._socketConnection; + } + protected _connectionStatus: Web3ProviderStatus; + protected readonly _onMessageHandler: (event: MessageEvent) => void; + protected readonly _onOpenHandler: () => void; + protected readonly _onCloseHandler: (event: CloseEvent) => void; + protected readonly _onErrorHandler: (event: ErrorEvent) => void; + + /** + * This is an abstract class for implementing a socket provider (e.g. WebSocket, IPC). It extends the EIP-1193 provider {@link EIP1193Provider}. + * @param socketPath - The path to the socket (e.g. /ipc/path or ws://localhost:8546) + * @param socketOptions - The options for the socket connection. Its type is supposed to be specified in the inherited classes. + * @param reconnectOptions - The options for the socket reconnection {@link ReconnectOptions} + */ + public constructor( + socketPath: string, + socketOptions?: unknown, + reconnectOptions?: Partial, + ) { + super(); + this._connectionStatus = 'connecting'; + + // Message handlers. Due to bounding of `this` and removing the listeners we have to keep it's reference. + this._onMessageHandler = this._onMessage.bind(this); + this._onOpenHandler = this._onConnect.bind(this); + this._onCloseHandler = this._onCloseEvent.bind(this); + this._onErrorHandler = this._onError.bind(this); + + if (!this._validateProviderPath(socketPath)) throw new InvalidClientError(socketPath); + + this._socketPath = socketPath; + this._socketOptions = socketOptions; + this._reconnectOptions = { + ...DEFAULT_RECONNECTION_OPTIONS, + ...(reconnectOptions ?? {}), + }; + + this._pendingRequestsQueue = new Map>(); + this._sentRequestsQueue = new Map>(); + + this._init(); + this.connect(); + this.chunkResponseParser = new ChunkResponseParser( + this._eventEmitter, + this._reconnectOptions.autoReconnect, + ); + this.chunkResponseParser.onError(() => { + this._clearQueues(); + }); + this.isReconnecting = false; + } + + protected _init() { + this._reconnectAttempts = 0; + } + + /** + * Try to establish a connection to the socket + */ + public connect(): void { + try { + this._openSocketConnection(); + this._connectionStatus = 'connecting'; + this._addSocketListeners(); + } catch (e) { + if (!this.isReconnecting) { + this._connectionStatus = 'disconnected'; + if (e && (e as Error).message) { + throw new ConnectionError( + `Error while connecting to ${this._socketPath}. Reason: ${ + (e as Error).message + }`, + ); + } else { + throw new InvalidClientError(this._socketPath); + } + } else { + setImmediate(() => { + this._reconnect(); + }); + } + } + } + + protected abstract _openSocketConnection(): void; + protected abstract _addSocketListeners(): void; + + protected abstract _removeSocketListeners(): void; + + protected abstract _onCloseEvent(_event: unknown): void; + + protected abstract _sendToSocket(_payload: Web3APIPayload): void; + + protected abstract _parseResponses(_event: MessageEvent): JsonRpcResponse[]; + + protected abstract _closeSocketConnection(_code?: number, _data?: string): void; + + // eslint-disable-next-line class-methods-use-this + protected _validateProviderPath(path: string): boolean { + return !!path; + } + + /** + * + * @returns the pendingRequestQueue size + */ + // eslint-disable-next-line class-methods-use-this + public getPendingRequestQueueSize() { + return this._pendingRequestsQueue.size; + } + + /** + * + * @returns the sendPendingRequests size + */ + // eslint-disable-next-line class-methods-use-this + public getSentRequestsQueueSize() { + return this._sentRequestsQueue.size; + } + + /** + * + * @returns `true` if the socket supports subscriptions + */ + // eslint-disable-next-line class-methods-use-this + public supportsSubscriptions(): boolean { + return true; + } + + /** + * Registers a listener for the specified event type. + * @param type - The event type to listen for + * @param listener - The callback to be invoked when the event is emitted + */ + public on( + type: 'disconnect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public on( + type: 'connect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public on(type: 'chainChanged', listener: Web3Eip1193ProviderEventCallback): void; + public on(type: 'accountsChanged', listener: Web3Eip1193ProviderEventCallback): void; + public on( + type: 'message', + listener: + | Web3Eip1193ProviderEventCallback + | Web3ProviderMessageEventCallback, + ): void; + public on( + type: string, + listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback, + ): void; + public on( + type: string | Eip1193EventName, + listener: + | Web3Eip1193ProviderEventCallback

+ | Web3ProviderMessageEventCallback + | Web3ProviderEventCallback, + ): void { + this._eventEmitter.on(type, listener); + } + + /** + * Registers a listener for the specified event type that will be invoked at most once. + * @param type - The event type to listen for + * @param listener - The callback to be invoked when the event is emitted + */ + public once( + type: 'disconnect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public once( + type: 'connect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public once(type: 'chainChanged', listener: Web3Eip1193ProviderEventCallback): void; + public once( + type: 'accountsChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public once( + type: 'message', + listener: + | Web3Eip1193ProviderEventCallback + | Web3ProviderMessageEventCallback, + ): void; + public once( + type: string, + listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback, + ): void; + public once( + type: string | Eip1193EventName, + listener: + | Web3Eip1193ProviderEventCallback

+ | Web3ProviderMessageEventCallback + | Web3ProviderEventCallback, + ): void { + this._eventEmitter.once(type, listener); + } + + /** + * Removes a listener for the specified event type. + * @param type - The event type to remove the listener for + * @param listener - The callback to be executed + */ + public removeListener( + type: 'disconnect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public removeListener( + type: 'connect', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public removeListener( + type: 'chainChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public removeListener( + type: 'accountsChanged', + listener: Web3Eip1193ProviderEventCallback, + ): void; + public removeListener( + type: 'message', + listener: + | Web3Eip1193ProviderEventCallback + | Web3ProviderMessageEventCallback, + ): void; + public removeListener( + type: string, + listener: Web3Eip1193ProviderEventCallback | Web3ProviderEventCallback, + ): void; + public removeListener( + type: string | Eip1193EventName, + listener: + | Web3Eip1193ProviderEventCallback

+ | Web3ProviderMessageEventCallback + | Web3ProviderEventCallback, + ): void { + this._eventEmitter.removeListener(type, listener); + } + + protected _onDisconnect(code: number, data?: string) { + this._connectionStatus = 'disconnected'; + super._onDisconnect(code, data); + } + + /** + * Disconnects the socket + * @param code - The code to be sent to the server + * @param data - The data to be sent to the server + */ + public disconnect(code?: number, data?: string): void { + const disconnectCode = code ?? NORMAL_CLOSE_CODE; + this._removeSocketListeners(); + if (this.getStatus() !== 'disconnected') { + this._closeSocketConnection(disconnectCode, data); + } + this._onDisconnect(disconnectCode, data); + } + + /** + * Safely disconnects the socket, async and waits for request size to be 0 before disconnecting + * @param forceDisconnect - If true, will clear queue after 5 attempts of waiting for both pending and sent queue to be 0 + * @param ms - Determines the ms of setInterval + * @param code - The code to be sent to the server + * @param data - The data to be sent to the server + */ + public async safeDisconnect(code?: number, data?: string, forceDisconnect = false,ms = 1000) { + let retryAttempt = 0; + const checkQueue = async () => + new Promise(resolve => { + const interval = setInterval(() => { + if (forceDisconnect && retryAttempt === 5) { + this.clearQueues(); + } + if (this.getPendingRequestQueueSize() === 0 && this.getSentRequestsQueueSize() === 0) { + clearInterval(interval); + resolve(true); + } + retryAttempt+=1; + }, ms) + }) + + await checkQueue(); + this.disconnect(code, data); + } + + + /** + * Removes all listeners for the specified event type. + * @param type - The event type to remove the listeners for + */ + public removeAllListeners(type: string): void { + this._eventEmitter.removeAllListeners(type); + } + + protected _onError(event: ErrorEvent): void { + // do not emit error while trying to reconnect + if (this.isReconnecting) { + this._reconnect(); + } else { + this._eventEmitter.emit('error', event); + } + } + + /** + * Resets the socket, removing all listeners and pending requests + */ + public reset(): void { + this._sentRequestsQueue.clear(); + this._pendingRequestsQueue.clear(); + + this._init(); + this._removeSocketListeners(); + this._addSocketListeners(); + } + + protected _reconnect(): void { + if (this.isReconnecting) { + return; + } + this.isReconnecting = true; + + if (this._sentRequestsQueue.size > 0) { + this._sentRequestsQueue.forEach( + (request: SocketRequestItem, key: JsonRpcId) => { + request.deferredPromise.reject(new PendingRequestsOnReconnectingError()); + this._sentRequestsQueue.delete(key); + }, + ); + } + + if (this._reconnectAttempts < this._reconnectOptions.maxAttempts) { + this._reconnectAttempts += 1; + setTimeout(() => { + this._removeSocketListeners(); + this.connect(); + this.isReconnecting = false; + }, this._reconnectOptions.delay); + } else { + this.isReconnecting = false; + this._clearQueues(); + this._removeSocketListeners(); + this._eventEmitter.emit( + 'error', + new MaxAttemptsReachedOnReconnectingError(this._reconnectOptions.maxAttempts), + ); + } + } + + /** + * Creates a request object to be sent to the server + */ + public async request< + Method extends Web3APIMethod, + ResultType = Web3APIReturnType, + >(request: Web3APIPayload): Promise> { + if (isNullish(this._socketConnection)) { + throw new Error('Connection is undefined'); + } + // if socket disconnected - open connection + if (this.getStatus() === 'disconnected') { + this.connect(); + } + + const requestId = jsonRpc.isBatchRequest(request) + ? (request as unknown as JsonRpcBatchRequest)[0].id + : (request as unknown as JsonRpcRequest).id; + + if (!requestId) { + throw new Web3WSProviderError('Request Id not defined'); + } + + if (this._sentRequestsQueue.has(requestId)) { + throw new RequestAlreadySentError(requestId); + } + const deferredPromise = new Web3DeferredPromise>(); + deferredPromise.catch(error => { + this._eventEmitter.emit('error', error); + }); + const reqItem: SocketRequestItem> = { + payload: request, + deferredPromise, + }; + + if (this.getStatus() === 'connecting') { + this._pendingRequestsQueue.set(requestId, reqItem); + + return reqItem.deferredPromise; + } + + this._sentRequestsQueue.set(requestId, reqItem); + + try { + this._sendToSocket(reqItem.payload); + } catch (error) { + this._sentRequestsQueue.delete(requestId); + + this._eventEmitter.emit('error', error); + } + + return deferredPromise; + } + + protected _onConnect() { + this._connectionStatus = 'connected'; + this._reconnectAttempts = 0; + super._onConnect(); + this._sendPendingRequests(); + } + + private _sendPendingRequests() { + for (const [id, value] of this._pendingRequestsQueue.entries()) { + this._sendToSocket(value.payload as Web3APIPayload); + this._pendingRequestsQueue.delete(id); + this._sentRequestsQueue.set(id, value); + } + } + + protected _onMessage(event: MessageEvent): void { + const responses = this._parseResponses(event); + if (isNullish(responses) || responses.length === 0) { + return; + } + + for (const response of responses) { + if ( + jsonRpc.isResponseWithNotification(response as JsonRpcNotification) && + (response as JsonRpcNotification).method.endsWith('_subscription') + ) { + this._eventEmitter.emit('message', response); + return; + } + + const requestId = jsonRpc.isBatchResponse(response) + ? (response as unknown as JsonRpcBatchResponse)[0].id + : (response as unknown as JsonRpcResponseWithResult).id; + + const requestItem = this._sentRequestsQueue.get(requestId); + + if (!requestItem) { + return; + } + + if ( + jsonRpc.isBatchResponse(response) || + jsonRpc.isResponseWithResult(response) || + jsonRpc.isResponseWithError(response) + ) { + this._eventEmitter.emit('message', response); + requestItem.deferredPromise.resolve(response); + } + + this._sentRequestsQueue.delete(requestId); + } + } + + public clearQueues(event?: ConnectionEvent) { + this._clearQueues(event); + } + + protected _clearQueues(event?: ConnectionEvent) { + if (this._pendingRequestsQueue.size > 0) { + this._pendingRequestsQueue.forEach( + (request: SocketRequestItem, key: JsonRpcId) => { + request.deferredPromise.reject(new ConnectionNotOpenError(event)); + this._pendingRequestsQueue.delete(key); + }, + ); + } + + if (this._sentRequestsQueue.size > 0) { + this._sentRequestsQueue.forEach( + (request: SocketRequestItem, key: JsonRpcId) => { + request.deferredPromise.reject(new ConnectionNotOpenError(event)); + this._sentRequestsQueue.delete(key); + }, + ); + } + + this._removeSocketListeners(); + } +} diff --git a/packages/web3-utils/src/soliditySha3.js b/packages/web3-utils/src/soliditySha3.js deleted file mode 100644 index 055f3e30f9e..00000000000 --- a/packages/web3-utils/src/soliditySha3.js +++ /dev/null @@ -1,275 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file soliditySha3.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -var _ = require('underscore'); -var BN = require('bn.js'); -var utils = require('./utils.js'); - - -var _elementaryName = function (name) { - /*jshint maxcomplexity:false */ - - if (name.startsWith('int[')) { - return 'int256' + name.slice(3); - } else if (name === 'int') { - return 'int256'; - } else if (name.startsWith('uint[')) { - return 'uint256' + name.slice(4); - } else if (name === 'uint') { - return 'uint256'; - } else if (name.startsWith('fixed[')) { - return 'fixed128x128' + name.slice(5); - } else if (name === 'fixed') { - return 'fixed128x128'; - } else if (name.startsWith('ufixed[')) { - return 'ufixed128x128' + name.slice(6); - } else if (name === 'ufixed') { - return 'ufixed128x128'; - } - return name; -}; - -// Parse N from type -var _parseTypeN = function (type) { - var typesize = /^\D+(\d+).*$/.exec(type); - return typesize ? parseInt(typesize[1], 10) : null; -}; - -// Parse N from type[] -var _parseTypeNArray = function (type) { - var arraySize = /^\D+\d*\[(\d+)\]$/.exec(type); - return arraySize ? parseInt(arraySize[1], 10) : null; -}; - -var _parseNumber = function (arg) { - var type = typeof arg; - if (type === 'string') { - if (utils.isHexStrict(arg)) { - return new BN(arg.replace(/0x/i,''), 16); - } else { - return new BN(arg, 10); - } - } else if (type === 'number') { - return new BN(arg); - } else if (utils.isBigNumber(arg)) { - return new BN(arg.toString(10)); - } else if (utils.isBN(arg)) { - return arg; - } else { - throw new Error(arg +' is not a number'); - } -}; - -var _solidityPack = function (type, value, arraySize) { - /*jshint maxcomplexity:false */ - - var size, num; - type = _elementaryName(type); - - - if (type === 'bytes') { - - if (value.replace(/^0x/i,'').length % 2 !== 0) { - throw new Error('Invalid bytes characters '+ value.length); - } - - return value; - } else if (type === 'string') { - return utils.utf8ToHex(value); - } else if (type === 'bool') { - return value ? '01' : '00'; - } else if (type.startsWith('address')) { - if(arraySize) { - size = 64; - } else { - size = 40; - } - - if(!utils.isAddress(value)) { - throw new Error(value +' is not a valid address, or the checksum is invalid.'); - } - - return utils.leftPad(value.toLowerCase(), size); - } - - size = _parseTypeN(type); - - if (type.startsWith('bytes')) { - - if(!size) { - throw new Error('bytes[] not yet supported in solidity'); - } - - // must be 32 byte slices when in an array - if(arraySize) { - size = 32; - } - - if (size < 1 || size > 32 || size < value.replace(/^0x/i,'').length / 2 ) { - throw new Error('Invalid bytes' + size +' for '+ value); - } - - return utils.rightPad(value, size * 2); - } else if (type.startsWith('uint')) { - - if ((size % 8) || (size < 8) || (size > 256)) { - throw new Error('Invalid uint'+size+' size'); - } - - num = _parseNumber(value); - if (num.bitLength() > size) { - throw new Error('Supplied uint exceeds width: ' + size + ' vs ' + num.bitLength()); - } - - if(num.lt(new BN(0))) { - throw new Error('Supplied uint '+ num.toString() +' is negative'); - } - - return size ? utils.leftPad(num.toString('hex'), size/8 * 2) : num; - } else if (type.startsWith('int')) { - - if ((size % 8) || (size < 8) || (size > 256)) { - throw new Error('Invalid int'+size+' size'); - } - - num = _parseNumber(value); - if (num.bitLength() > size) { - throw new Error('Supplied int exceeds width: ' + size + ' vs ' + num.bitLength()); - } - - if(num.lt(new BN(0))) { - return num.toTwos(size).toString('hex'); - } else { - return size ? utils.leftPad(num.toString('hex'), size/8 * 2) : num; - } - - } else { - // FIXME: support all other types - throw new Error('Unsupported or invalid type: ' + type); - } -}; - - -var _processSolidityEncodePackedArgs = function (arg) { - /*jshint maxcomplexity:false */ - - if(_.isArray(arg)) { - throw new Error('Autodetection of array types is not supported.'); - } - - var type, value = ''; - var hexArg, arraySize; - - // if type is given - if (_.isObject(arg) && (arg.hasOwnProperty('v') || arg.hasOwnProperty('t') || arg.hasOwnProperty('value') || arg.hasOwnProperty('type'))) { - type = arg.hasOwnProperty('t') ? arg.t : arg.type; - value = arg.hasOwnProperty('v') ? arg.v : arg.value; - - // otherwise try to guess the type - } else { - - type = utils.toHex(arg, true); - value = utils.toHex(arg); - - if (!type.startsWith('int') && !type.startsWith('uint')) { - type = 'bytes'; - } - } - - if ((type.startsWith('int') || type.startsWith('uint')) && typeof value === 'string' && !/^(-)?0x/i.test(value)) { - value = new BN(value); - } - - // get the array size - if(_.isArray(value)) { - arraySize = _parseTypeNArray(type); - if(arraySize && value.length !== arraySize) { - throw new Error(type +' is not matching the given array '+ JSON.stringify(value)); - } else { - arraySize = value.length; - } - } - - - if (_.isArray(value)) { - hexArg = value.map(function (val) { - return _solidityPack(type, val, arraySize).toString('hex').replace('0x',''); - }); - return hexArg.join(''); - } else { - hexArg = _solidityPack(type, value, arraySize); - return hexArg.toString('hex').replace('0x',''); - } - -}; - -/** - * Hashes solidity values to a sha3 hash using keccak 256 - * - * @method soliditySha3 - * @return {Object} the sha3 - */ -var soliditySha3 = function () { - /*jshint maxcomplexity:false */ - - var args = Array.prototype.slice.call(arguments); - - var hexArgs = _.map(args, _processSolidityEncodePackedArgs); - - // console.log(args, hexArgs); - // console.log('0x'+ hexArgs.join('')); - - return utils.sha3('0x'+ hexArgs.join('')); -}; - -/** - * Hashes solidity values to a sha3 hash using keccak 256 but does return the hash of value `null` instead of `null` - * - * @method soliditySha3Raw - * @return {Object} the sha3 - */ -var soliditySha3Raw = function () { - return utils.sha3Raw('0x'+ _.map(Array.prototype.slice.call(arguments), _processSolidityEncodePackedArgs).join('')); -}; - -/** - * Encode packed args to hex - * - * @method encodePacked - * @return {String} the hex encoded arguments - */ -var encodePacked = function () { - /*jshint maxcomplexity:false */ - - var args = Array.prototype.slice.call(arguments); - - var hexArgs = _.map(args, _processSolidityEncodePackedArgs); - - return '0x'+ hexArgs.join('').toLowerCase(); -}; - - -module.exports = { - soliditySha3: soliditySha3, - soliditySha3Raw: soliditySha3Raw, - encodePacked: encodePacked -}; diff --git a/packages/web3-utils/src/string_manipulation.ts b/packages/web3-utils/src/string_manipulation.ts new file mode 100644 index 00000000000..88a0a9a5534 --- /dev/null +++ b/packages/web3-utils/src/string_manipulation.ts @@ -0,0 +1,166 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * @module Utils + */ + +import { Numbers } from 'web3-types'; +import { NibbleWidthError } from 'web3-errors'; +import { isHexStrict, validator, utils as validatorUtils, bigintPower } from 'web3-validator'; +import { numberToHex, toHex, toNumber } from './converters.js'; + +/** + * Adds a padding on the left of a string, if value is a integer or bigInt will be converted to a hex string. + * @param value - The value to be padded. + * @param characterAmount - The amount of characters the string should have. + * @param sign - The sign to be added (default is 0). + * @returns The padded string. + * + * @example + * ```ts + * + * console.log(web3.utils.padLeft('0x123', 10)); + * >0x0000000123 + * ``` + */ +export const padLeft = (value: Numbers, characterAmount: number, sign = '0'): string => { + // To avoid duplicate code and circular dependency we will + // use `padLeft` implementation from `web3-validator` + + if (typeof value === 'string') { + if (!isHexStrict(value)) { + return value.padStart(characterAmount, sign); + } + return validatorUtils.padLeft(value, characterAmount, sign); + } + + validator.validate(['int'], [value]); + + return validatorUtils.padLeft(value, characterAmount, sign); +}; + +/** + * Adds a padding on the right of a string, if value is a integer or bigInt will be converted to a hex string. + * @param value - The value to be padded. + * @param characterAmount - The amount of characters the string should have. + * @param sign - The sign to be added (default is 0). + * @returns The padded string. + * + * @example + * ```ts + * console.log(web3.utils.padRight('0x123', 10)); + * > 0x1230000000 + * + * console.log(web3.utils.padRight('0x123', 10, '1')); + * > 0x1231111111 + * ``` + */ +export const padRight = (value: Numbers, characterAmount: number, sign = '0'): string => { + if (typeof value === 'string' && !isHexStrict(value)) { + return value.padEnd(characterAmount, sign); + } + + validator.validate(['int'], [value]); + + const hexString = typeof value === 'string' && isHexStrict(value) ? value : numberToHex(value); + + const prefixLength = hexString.startsWith('-') ? 3 : 2; + return hexString.padEnd(characterAmount + prefixLength, sign); +}; + +/** + * Adds a padding on the right of a string, if value is a integer or bigInt will be converted to a hex string. @alias `padRight` + */ +export const rightPad = padRight; + +/** + * Adds a padding on the left of a string, if value is a integer or bigInt will be converted to a hex string. @alias `padLeft` + */ +export const leftPad = padLeft; + +/** + * Converts a negative number into the two’s complement and return a hexstring of 64 nibbles. + * @param value - The value to be converted. + * @param nibbleWidth - The nibble width of the hex string (default is 64). + * + * @returns The hex string of the two’s complement. + * + * @example + * ```ts + * console.log(web3.utils.toTwosComplement(13, 32)); + * > 0x0000000000000000000000000000000d + * + * console.log(web3.utils.toTwosComplement('-0x1', 32)); + * > 0xffffffffffffffffffffffffffffffff + * + * console.log(web3.utils.toTwosComplement(BigInt('9007199254740992'), 32)); + * > 0x00000000000000000020000000000000 + * ``` + */ +export const toTwosComplement = (value: Numbers, nibbleWidth = 64): string => { + validator.validate(['int'], [value]); + + const val = toNumber(value); + + if (val >= 0) return padLeft(toHex(val), nibbleWidth); + + const largestBit = bigintPower(BigInt(2), BigInt(nibbleWidth * 4)); + if (-val >= largestBit) { + throw new NibbleWidthError(`value: ${value}, nibbleWidth: ${nibbleWidth}`); + } + const updatedVal = BigInt(val); + + const complement = updatedVal + largestBit; + + return padLeft(numberToHex(complement), nibbleWidth); +}; + +/** + * Converts the twos complement into a decimal number or big int. + * @param value - The value to be converted. + * @param nibbleWidth - The nibble width of the hex string (default is 64). + * @returns The decimal number or big int. + * + * @example + * ```ts + * console.log(web3.utils.fromTwosComplement('0x0000000000000000000000000000000d', 32')); + * > 13 + * + * console.log(web3.utils.fromTwosComplement('0x00000000000000000020000000000000', 32)); + * > 9007199254740992n + * ``` + */ +export const fromTwosComplement = (value: Numbers, nibbleWidth = 64): number | bigint => { + validator.validate(['int'], [value]); + + const val = toNumber(value); + + if (val < 0) return val; + + const largestBit = Math.ceil(Math.log(Number(val)) / Math.log(2)); + + if (largestBit > nibbleWidth * 4) + throw new NibbleWidthError(`value: "${value}", nibbleWidth: "${nibbleWidth}"`); + + // check the largest bit to see if negative + if (nibbleWidth * 4 !== largestBit) return val; + + const complement = bigintPower(BigInt(2), BigInt(nibbleWidth) * BigInt(4)); + + return toNumber(BigInt(val) - complement); +}; diff --git a/packages/web3-utils/src/uint8array.ts b/packages/web3-utils/src/uint8array.ts new file mode 100644 index 00000000000..cf5d7ee7a45 --- /dev/null +++ b/packages/web3-utils/src/uint8array.ts @@ -0,0 +1,58 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export function isUint8Array(data: unknown | Uint8Array): data is Uint8Array { + return ( + data instanceof Uint8Array || + (data as { constructor: { name: string } })?.constructor?.name === 'Uint8Array' + ); +} + +export function uint8ArrayConcat(...parts: Uint8Array[]): Uint8Array { + const length = parts.reduce((prev, part) => { + const agg = prev + part.length; + return agg; + }, 0); + const result = new Uint8Array(length); + let offset = 0; + for (const part of parts) { + result.set(part, offset); + offset += part.length; + } + return result; +} + +/** + * Returns true if the two passed Uint8Arrays have the same content + */ +export function uint8ArrayEquals(a: Uint8Array, b: Uint8Array): boolean { + if (a === b) { + return true; + } + + if (a.byteLength !== b.byteLength) { + return false; + } + + for (let i = 0; i < a.byteLength; i += 1) { + if (a[i] !== b[i]) { + return false; + } + } + + return true; +} diff --git a/packages/web3-utils/src/utils.js b/packages/web3-utils/src/utils.js deleted file mode 100644 index 63afa1c7dee..00000000000 --- a/packages/web3-utils/src/utils.js +++ /dev/null @@ -1,555 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . - */ -/** - * @file utils.js - * @author Fabian Vogelsteller - * @date 2017 - */ - -var _ = require('underscore'); -var BN = require('bn.js'); -var numberToBN = require('number-to-bn'); -var utf8 = require('utf8'); -var Hash = require("eth-lib/lib/hash"); -var ethereumBloomFilters = require('ethereum-bloom-filters'); - - - -/** - * Returns true if object is BN, otherwise false - * - * @method isBN - * @param {Object} object - * @return {Boolean} - */ -var isBN = function (object) { - return BN.isBN(object); -}; - -/** - * Returns true if object is BigNumber, otherwise false - * - * @method isBigNumber - * @param {Object} object - * @return {Boolean} - */ -var isBigNumber = function (object) { - return object && object.constructor && object.constructor.name === 'BigNumber'; -}; - -/** - * Takes an input and transforms it into an BN - * - * @method toBN - * @param {Number|String|BN} number, string, HEX string or BN - * @return {BN} BN - */ -var toBN = function(number){ - try { - return numberToBN.apply(null, arguments); - } catch(e) { - throw new Error(e + ' Given value: "'+ number +'"'); - } -}; - - -/** - * Takes and input transforms it into BN and if it is negative value, into two's complement - * - * @method toTwosComplement - * @param {Number|String|BN} number - * @return {String} - */ -var toTwosComplement = function (number) { - return '0x'+ toBN(number).toTwos(256).toString(16, 64); -}; - -/** - * Checks if the given string is an address - * - * @method isAddress - * @param {String} address the given HEX address - * @return {Boolean} - */ -var isAddress = function (address) { - // check if it has the basic requirements of an address - if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { - return false; - // If it's ALL lowercase or ALL upppercase - } else if (/^(0x|0X)?[0-9a-f]{40}$/.test(address) || /^(0x|0X)?[0-9A-F]{40}$/.test(address)) { - return true; - // Otherwise check each case - } else { - return checkAddressChecksum(address); - } -}; - - - -/** - * Checks if the given string is a checksummed address - * - * @method checkAddressChecksum - * @param {String} address the given HEX address - * @return {Boolean} - */ -var checkAddressChecksum = function (address) { - // Check each case - address = address.replace(/^0x/i,''); - var addressHash = sha3(address.toLowerCase()).replace(/^0x/i,''); - - for (var i = 0; i < 40; i++ ) { - // the nth letter should be uppercase if the nth digit of casemap is 1 - if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) { - return false; - } - } - return true; -}; - -/** - * Should be called to pad string to expected length - * - * @method leftPad - * @param {String} string to be padded - * @param {Number} chars that result string should have - * @param {String} sign, by default 0 - * @returns {String} right aligned string - */ -var leftPad = function (string, chars, sign) { - var hasPrefix = /^0x/i.test(string) || typeof string === 'number'; - string = string.toString(16).replace(/^0x/i,''); - - var padding = (chars - string.length + 1 >= 0) ? chars - string.length + 1 : 0; - - return (hasPrefix ? '0x' : '') + new Array(padding).join(sign ? sign : "0") + string; -}; - -/** - * Should be called to pad string to expected length - * - * @method rightPad - * @param {String} string to be padded - * @param {Number} chars that result string should have - * @param {String} sign, by default 0 - * @returns {String} right aligned string - */ -var rightPad = function (string, chars, sign) { - var hasPrefix = /^0x/i.test(string) || typeof string === 'number'; - string = string.toString(16).replace(/^0x/i,''); - - var padding = (chars - string.length + 1 >= 0) ? chars - string.length + 1 : 0; - - return (hasPrefix ? '0x' : '') + string + (new Array(padding).join(sign ? sign : "0")); -}; - - -/** - * Should be called to get hex representation (prefixed by 0x) of utf8 string - * - * @method utf8ToHex - * @param {String} str - * @returns {String} hex representation of input string - */ -var utf8ToHex = function(str) { - str = utf8.encode(str); - var hex = ""; - - // remove \u0000 padding from either side - str = str.replace(/^(?:\u0000)*/,''); - str = str.split("").reverse().join(""); - str = str.replace(/^(?:\u0000)*/,''); - str = str.split("").reverse().join(""); - - for(var i = 0; i < str.length; i++) { - var code = str.charCodeAt(i); - // if (code !== 0) { - var n = code.toString(16); - hex += n.length < 2 ? '0' + n : n; - // } - } - - return "0x" + hex; -}; - -/** - * Should be called to get utf8 from it's hex representation - * - * @method hexToUtf8 - * @param {String} hex - * @returns {String} ascii string representation of hex value - */ -var hexToUtf8 = function(hex) { - if (!isHexStrict(hex)) - throw new Error('The parameter "'+ hex +'" must be a valid HEX string.'); - - var str = ""; - var code = 0; - hex = hex.replace(/^0x/i,''); - - // remove 00 padding from either side - hex = hex.replace(/^(?:00)*/,''); - hex = hex.split("").reverse().join(""); - hex = hex.replace(/^(?:00)*/,''); - hex = hex.split("").reverse().join(""); - - var l = hex.length; - - for (var i=0; i < l; i+=2) { - code = parseInt(hex.substr(i, 2), 16); - // if (code !== 0) { - str += String.fromCharCode(code); - // } - } - - return utf8.decode(str); -}; - - -/** - * Converts value to it's number representation - * - * @method hexToNumber - * @param {String|Number|BN} value - * @return {String} - */ -var hexToNumber = function (value) { - if (!value) { - return value; - } - - if (_.isString(value) && !isHexStrict(value)) { - throw new Error('Given value "'+value+'" is not a valid hex string.'); - } - - return toBN(value).toNumber(); -}; - -/** - * Converts value to it's decimal representation in string - * - * @method hexToNumberString - * @param {String|Number|BN} value - * @return {String} - */ -var hexToNumberString = function (value) { - if (!value) return value; - - if (_.isString(value) && !isHexStrict(value)) { - throw new Error('Given value "'+value+'" is not a valid hex string.'); - } - - return toBN(value).toString(10); -}; - - -/** - * Converts value to it's hex representation - * - * @method numberToHex - * @param {String|Number|BN} value - * @return {String} - */ -var numberToHex = function (value) { - if (_.isNull(value) || _.isUndefined(value)) { - return value; - } - - if (!isFinite(value) && !isHexStrict(value)) { - throw new Error('Given input "'+value+'" is not a number.'); - } - - var number = toBN(value); - var result = number.toString(16); - - return number.lt(new BN(0)) ? '-0x' + result.substr(1) : '0x' + result; -}; - - -/** - * Convert a byte array to a hex string - * - * Note: Implementation from crypto-js - * - * @method bytesToHex - * @param {Array} bytes - * @return {String} the hex string - */ -var bytesToHex = function(bytes) { - for (var hex = [], i = 0; i < bytes.length; i++) { - /* jshint ignore:start */ - hex.push((bytes[i] >>> 4).toString(16)); - hex.push((bytes[i] & 0xF).toString(16)); - /* jshint ignore:end */ - } - return '0x'+ hex.join(""); -}; - -/** - * Convert a hex string to a byte array - * - * Note: Implementation from crypto-js - * - * @method hexToBytes - * @param {string} hex - * @return {Array} the byte array - */ -var hexToBytes = function(hex) { - hex = hex.toString(16); - - if (!isHexStrict(hex)) { - throw new Error('Given value "'+ hex +'" is not a valid hex string.'); - } - - hex = hex.replace(/^0x/i,''); - - for (var bytes = [], c = 0; c < hex.length; c += 2) - bytes.push(parseInt(hex.substr(c, 2), 16)); - return bytes; -}; - -/** - * Auto converts any given value into it's hex representation. - * - * And even stringifys objects before. - * - * @method toHex - * @param {String|Number|BN|Object|Buffer} value - * @param {Boolean} returnType - * @return {String} - */ -var toHex = function (value, returnType) { - /*jshint maxcomplexity: false */ - - if (isAddress(value)) { - return returnType ? 'address' : '0x'+ value.toLowerCase().replace(/^0x/i,''); - } - - if (_.isBoolean(value)) { - return returnType ? 'bool' : value ? '0x01' : '0x00'; - } - - if (Buffer.isBuffer(value)) { - return '0x' + value.toString('hex'); - } - - if (_.isObject(value) && !isBigNumber(value) && !isBN(value)) { - return returnType ? 'string' : utf8ToHex(JSON.stringify(value)); - } - - // if its a negative number, pass it through numberToHex - if (_.isString(value)) { - if (value.indexOf('-0x') === 0 || value.indexOf('-0X') === 0) { - return returnType ? 'int256' : numberToHex(value); - } else if(value.indexOf('0x') === 0 || value.indexOf('0X') === 0) { - return returnType ? 'bytes' : value; - } else if (!isFinite(value)) { - return returnType ? 'string' : utf8ToHex(value); - } - } - - return returnType ? (value < 0 ? 'int256' : 'uint256') : numberToHex(value); -}; - - -/** - * Check if string is HEX, requires a 0x in front - * - * @method isHexStrict - * @param {String} hex to be checked - * @returns {Boolean} - */ -var isHexStrict = function (hex) { - return ((_.isString(hex) || _.isNumber(hex)) && /^(-)?0x[0-9a-f]*$/i.test(hex)); -}; - -/** - * Check if string is HEX - * - * @method isHex - * @param {String} hex to be checked - * @returns {Boolean} - */ -var isHex = function (hex) { - return ((_.isString(hex) || _.isNumber(hex)) && /^(-0x|0x)?[0-9a-f]*$/i.test(hex)); -}; - -/** - * Remove 0x prefix from string - * - * @method stripHexPrefix - * @param {String} str to be checked - * @returns {String} - */ -var stripHexPrefix = function (str) { - if (str !== 0 && isHex(str)) - return str.replace(/^(-)?0x/i, '$1') - return str; -}; - -/** - * Returns true if given string is a valid Ethereum block header bloom. - * - * @method isBloom - * @param {String} bloom encoded bloom filter - * @return {Boolean} - */ -var isBloom = function (bloom) { - return ethereumBloomFilters.isBloom(bloom); -}; - -/** - * Returns true if the ethereum users address is part of the given bloom - * note: false positives are possible. - * - * @method isUserEthereumAddressInBloom - * @param {String} ethereumAddress encoded bloom filter - * @param {String} bloom ethereum addresss - * @return {Boolean} - */ -var isUserEthereumAddressInBloom = function (bloom, ethereumAddress) { - return ethereumBloomFilters.isUserEthereumAddressInBloom(bloom, ethereumAddress); -}; - -/** - * Returns true if the contract address is part of the given bloom - * note: false positives are possible. - * - * @method isUserEthereumAddressInBloom - * @param {String} bloom encoded bloom filter - * @param {String} contractAddress contract addresss - * @return {Boolean} - */ -var isContractAddressInBloom = function (bloom, contractAddress) { - return ethereumBloomFilters.isContractAddressInBloom(bloom, contractAddress); -}; - -/** - * Returns true if given string is a valid log topic. - * - * @method isTopic - * @param {String} topic encoded topic - * @return {Boolean} - */ -var isTopic = function (topic) { - return ethereumBloomFilters.isTopic(topic); -}; - -/** - * Returns true if the topic is part of the given bloom - * note: false positives are possible. - * - * @method isTopicInBloom - * @param {String} bloom encoded bloom filter - * @param {String} topic encoded topic - * @return {Boolean} - */ -var isTopicInBloom = function (bloom, topic) { - return ethereumBloomFilters.isTopicInBloom(bloom, topic); -}; - -/** - * Returns true if the value is part of the given bloom - * note: false positives are possible. - * - * @method isInBloom - * @param {String} bloom encoded bloom filter - * @param {String | Uint8Array} topic encoded value - * @return {Boolean} - */ -var isInBloom = function (bloom, topic) { - return ethereumBloomFilters.isInBloom(bloom, topic); -}; - -/** - * Hashes values to a sha3 hash using keccak 256 - * - * To hash a HEX string the hex must have 0x in front. - * - * @method sha3 - * @return {String} the sha3 string - */ -var SHA3_NULL_S = '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'; - -var sha3 = function (value) { - if (isBN(value)) { - value = value.toString(); - } - - if (isHexStrict(value) && /^0x/i.test((value).toString())) { - value = hexToBytes(value); - } - - var returnValue = Hash.keccak256(value); // jshint ignore:line - - if(returnValue === SHA3_NULL_S) { - return null; - } else { - return returnValue; - } -}; -// expose the under the hood keccak256 -sha3._Hash = Hash; - -/** - * @method sha3Raw - * - * @param value - * - * @returns {string} - */ -var sha3Raw = function(value) { - value = sha3(value); - - if (value === null) { - return SHA3_NULL_S; - } - - return value; -}; - - -module.exports = { - BN: BN, - isBN: isBN, - isBigNumber: isBigNumber, - toBN: toBN, - isAddress: isAddress, - isBloom: isBloom, - isUserEthereumAddressInBloom: isUserEthereumAddressInBloom, - isContractAddressInBloom: isContractAddressInBloom, - isTopic: isTopic, - isTopicInBloom: isTopicInBloom, - isInBloom: isInBloom, - checkAddressChecksum: checkAddressChecksum, - utf8ToHex: utf8ToHex, - hexToUtf8: hexToUtf8, - hexToNumber: hexToNumber, - hexToNumberString: hexToNumberString, - numberToHex: numberToHex, - toHex: toHex, - hexToBytes: hexToBytes, - bytesToHex: bytesToHex, - isHex: isHex, - isHexStrict: isHexStrict, - stripHexPrefix: stripHexPrefix, - leftPad: leftPad, - rightPad: rightPad, - toTwosComplement: toTwosComplement, - sha3: sha3, - sha3Raw: sha3Raw -}; diff --git a/packages/web3-utils/src/uuid.ts b/packages/web3-utils/src/uuid.ts new file mode 100644 index 00000000000..08b9152b71c --- /dev/null +++ b/packages/web3-utils/src/uuid.ts @@ -0,0 +1,59 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * @module Utils + */ + +import { bytesToHex } from './converters.js'; +import { randomBytes } from './random.js'; + +/** + * Generate a version 4 (random) uuid + * https://github.com/uuidjs/uuid/blob/main/src/v4.js#L5 + * @returns - A version 4 uuid of the form xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx + * @example + * ```ts + * console.log(web3.utils.uuidV4()); + * > "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed" + * ``` + */ +export const uuidV4 = (): string => { + const bytes = randomBytes(16); + + // https://github.com/ethers-io/ethers.js/blob/ce8f1e4015c0f27bf178238770b1325136e3351a/packages/json-wallets/src.ts/utils.ts#L54 + // Section: 4.1.3: + // - time_hi_and_version[12:16] = 0b0100 + /* eslint-disable-next-line */ + bytes[6] = (bytes[6] & 0x0f) | 0x40; + + // Section 4.4 + // - clock_seq_hi_and_reserved[6] = 0b0 + // - clock_seq_hi_and_reserved[7] = 0b1 + /* eslint-disable-next-line */ + bytes[8] = (bytes[8] & 0x3f) | 0x80; + + const hexString = bytesToHex(bytes); + + return [ + hexString.substring(2, 10), + hexString.substring(10, 14), + hexString.substring(14, 18), + hexString.substring(18, 22), + hexString.substring(22, 34), + ].join('-'); +}; diff --git a/packages/web3-utils/src/validation.ts b/packages/web3-utils/src/validation.ts new file mode 100644 index 00000000000..76f1de97742 --- /dev/null +++ b/packages/web3-utils/src/validation.ts @@ -0,0 +1,194 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * @module Utils + */ + +import { InvalidBlockError } from 'web3-errors'; +import { + checkAddressCheckSum as checkAddressCheckSumValidator, + isAddress as isAddressValidator, + isBlockTag, + isBloom as isBloomValidator, + isContractAddressInBloom as isContractAddressInBloomValidator, + isHex as isHexValidator, + isHexStrict as isHexStrictValidator, + isInBloom as isInBloomValidator, + isNullish as isNullishValidator, + isTopic as isTopicValidator, + isTopicInBloom as isTopicInBloomValidator, + isUserEthereumAddressInBloom as isUserEthereumAddressInBloomValidator, +} from 'web3-validator'; +import { BlockNumberOrTag, BlockTags, ContractInitOptions } from 'web3-types'; + +/** + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isHexStrict = isHexStrictValidator; + +/** + * returns true if input is a hexstring, number or bigint + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isHex = isHexValidator; + +/** + * Checks the checksum of a given address. Will also return false on non-checksum addresses. + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const checkAddressCheckSum = checkAddressCheckSumValidator; + +/** + * Checks if a given string is a valid Ethereum address. It will also check the checksum, if the address has upper and lowercase letters. + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isAddress = isAddressValidator; + +/** + * Returns true if the bloom is a valid bloom + * https://github.com/joshstevens19/ethereum-bloom-filters/blob/fbeb47b70b46243c3963fe1c2988d7461ef17236/src/index.ts#L7 + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isBloom = isBloomValidator; + +/** + * Returns true if the value is part of the given bloom + * note: false positives are possible. + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isInBloom = isInBloomValidator; + +/** + * Returns true if the ethereum users address is part of the given bloom note: false positives are possible. + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isUserEthereumAddressInBloom = isUserEthereumAddressInBloomValidator; + +/** + * Returns true if the contract address is part of the given bloom. + * note: false positives are possible. + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isContractAddressInBloom = isContractAddressInBloomValidator; + +/** + * Checks if its a valid topic + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isTopic = isTopicValidator; + +/** + * Returns true if the topic is part of the given bloom. + * note: false positives are possible. + * + * @deprecated Will be removed in next release. Please use `web3-validator` package instead. + */ +export const isTopicInBloom = isTopicInBloomValidator; + +/** + * Compares between block A and block B + * @param blockA - Block number or string + * @param blockB - Block number or string + * + * @returns - Returns -1 if a \< b, returns 1 if a \> b and returns 0 if a == b + * + * @example + * ```ts + * console.log(web3.utils.compareBlockNumbers('latest', 'pending')); + * > -1 + * + * console.log(web3.utils.compareBlockNumbers(12, 11)); + * > 1 + * ``` + */ +export const compareBlockNumbers = (blockA: BlockNumberOrTag, blockB: BlockNumberOrTag) => { + const isABlockTag = typeof blockA === 'string' && isBlockTag(blockA); + const isBBlockTag = typeof blockB === 'string' && isBlockTag(blockB); + + if ( + blockA === blockB || + ((blockA === 'earliest' || blockA === 0) && (blockB === 'earliest' || blockB === 0)) // only exception compare blocktag with number + ) { + return 0; + } + if (blockA === 'earliest' && blockB > 0) { + return -1; + } + if (blockB === 'earliest' && blockA > 0) { + return 1; + } + + if (isABlockTag && isBBlockTag) { + // Increasing order: earliest, finalized , safe, latest, pending + const tagsOrder = { + [BlockTags.EARLIEST as string]: 1, + [BlockTags.FINALIZED as string]: 2, + [BlockTags.SAFE as string]: 3, + [BlockTags.LATEST as string]: 4, + [BlockTags.PENDING as string]: 5, + }; + + if (tagsOrder[blockA] < tagsOrder[blockB]) { + return -1; + } + + return 1; + } + if ((isABlockTag && !isBBlockTag) || (!isABlockTag && isBBlockTag)) { + throw new InvalidBlockError('Cannot compare blocktag with provided non-blocktag input.'); + } + + const bigIntA = BigInt(blockA); + const bigIntB = BigInt(blockB); + + if (bigIntA < bigIntB) { + return -1; + } + if (bigIntA === bigIntB) { + return 0; + } + return 1; +}; + + +export const isContractInitOptions = (options: unknown): options is ContractInitOptions => + typeof options === 'object' && + !isNullishValidator(options) && + Object.keys(options).length !== 0 && + [ + 'input', + 'data', + 'from', + 'gas', + 'gasPrice', + 'gasLimit', + 'address', + 'jsonInterface', + 'syncWithContext', + 'dataInputFill', + ].some(key => key in options); + +export const isNullish = isNullishValidator; diff --git a/packages/web3-utils/src/web3_deferred_promise.ts b/packages/web3-utils/src/web3_deferred_promise.ts new file mode 100644 index 00000000000..01805b774be --- /dev/null +++ b/packages/web3-utils/src/web3_deferred_promise.ts @@ -0,0 +1,149 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { OperationTimeoutError } from 'web3-errors'; +import { Web3DeferredPromiseInterface } from 'web3-types'; +import { Timeout } from './promise_helpers.js'; + +/** + * The class is a simple implementation of a deferred promise with optional timeout functionality, + * which can be useful when dealing with asynchronous tasks. + * + */ +export class Web3DeferredPromise implements Promise, Web3DeferredPromiseInterface { + // public tag to treat object as promise by different libs + // eslint-disable-next-line @typescript-eslint/prefer-as-const + public [Symbol.toStringTag]: 'Promise' = 'Promise'; + + private readonly _promise: Promise; + private _resolve!: (value: T | PromiseLike) => void; + private _reject!: (reason?: unknown) => void; + private _state: 'pending' | 'fulfilled' | 'rejected' = 'pending'; + private _timeoutId?: Timeout; + private readonly _timeoutInterval?: number; + private readonly _timeoutMessage: string; + + /** + * + * @param timeout - (optional) The timeout in milliseconds. + * @param eagerStart - (optional) If true, the timer starts as soon as the promise is created. + * @param timeoutMessage - (optional) The message to include in the timeout erro that is thrown when the promise times out. + */ + public constructor( + { + timeout, + eagerStart, + timeoutMessage, + }: { timeout: number; eagerStart: boolean; timeoutMessage: string } = { + timeout: 0, + eagerStart: false, + timeoutMessage: 'DeferredPromise timed out', + }, + ) { + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + }); + + this._timeoutMessage = timeoutMessage; + this._timeoutInterval = timeout; + + if (eagerStart) { + this.startTimer(); + } + } + /** + * Returns the current state of the promise. + * @returns 'pending' | 'fulfilled' | 'rejected' + */ + public get state(): 'pending' | 'fulfilled' | 'rejected' { + return this._state; + } + /** + * + * @param onfulfilled - (optional) The callback to execute when the promise is fulfilled. + * @param onrejected - (optional) The callback to execute when the promise is rejected. + * @returns + */ + public async then( + onfulfilled?: (value: T) => TResult1 | PromiseLike, + onrejected?: (reason: unknown) => TResult2 | PromiseLike, + ): Promise { + return this._promise.then(onfulfilled, onrejected); + } + /** + * + * @param onrejected - (optional) The callback to execute when the promise is rejected. + * @returns + */ + public async catch( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onrejected?: (reason: any) => TResult | PromiseLike, + ): Promise { + return this._promise.catch(onrejected); + } + + /** + * + * @param onfinally - (optional) The callback to execute when the promise is settled (fulfilled or rejected). + * @returns + */ + public async finally(onfinally?: (() => void) | undefined): Promise { + return this._promise.finally(onfinally); + } + + /** + * Resolves the current promise. + * @param value - The value to resolve the promise with. + */ + public resolve(value: T | PromiseLike): void { + this._resolve(value); + this._state = 'fulfilled'; + this._clearTimeout(); + } + + /** + * Rejects the current promise. + * @param reason - The reason to reject the promise with. + */ + public reject(reason?: unknown): void { + this._reject(reason); + this._state = 'rejected'; + this._clearTimeout(); + } + + /** + * Starts the timeout timer for the promise. + */ + public startTimer() { + if (this._timeoutInterval && this._timeoutInterval > 0) { + this._timeoutId = setTimeout(this._checkTimeout.bind(this), this._timeoutInterval); + } + } + + private _checkTimeout() { + if (this._state === 'pending' && this._timeoutId) { + this.reject(new OperationTimeoutError(this._timeoutMessage)); + } + } + + private _clearTimeout() { + if (this._timeoutId) { + clearTimeout(this._timeoutId); + } + } +} diff --git a/packages/web3-utils/src/web3_eip1193_provider.ts b/packages/web3-utils/src/web3_eip1193_provider.ts new file mode 100644 index 00000000000..f0e2d4d30bf --- /dev/null +++ b/packages/web3-utils/src/web3_eip1193_provider.ts @@ -0,0 +1,116 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + EthExecutionAPI, + HexString, + ProviderConnectInfo, + Web3APIMethod, + Web3APIPayload, + Web3APISpec, + Web3BaseProvider, +} from 'web3-types'; +import { EventEmitter } from 'eventemitter3'; +import { EIP1193ProviderRpcError } from 'web3-errors'; +import { toPayload } from './json_rpc.js'; + +/** + * This is an abstract class, which extends {@link Web3BaseProvider} class. This class is used to implement a provider that adheres to the EIP-1193 standard for Ethereum providers. + */ +export abstract class Eip1193Provider< + API extends Web3APISpec = EthExecutionAPI, +> extends Web3BaseProvider { + protected readonly _eventEmitter: EventEmitter = new EventEmitter(); + private _chainId: HexString = ''; + private _accounts: HexString[] = []; + + private async _getChainId(): Promise { + const data = await (this as Web3BaseProvider).request< + Web3APIMethod, + ResponseType + >( + toPayload({ + method: 'eth_chainId', + params: [], + }) as Web3APIPayload>, + ); + return data?.result ?? ''; + } + + private async _getAccounts(): Promise { + const data = await (this as Web3BaseProvider).request, HexString[]>( + toPayload({ + method: 'eth_accounts', + params: [], + }) as Web3APIPayload>, + ); + return data?.result ?? []; + } + + protected _onConnect() { + Promise.all([ + this._getChainId() + .then(chainId => { + if (chainId !== this._chainId) { + this._chainId = chainId; + this._eventEmitter.emit('chainChanged', this._chainId); + } + }) + .catch(err => { + // todo: add error handler + console.error(err); + }), + + this._getAccounts() + .then(accounts => { + if ( + !( + this._accounts.length === accounts.length && + accounts.every(v => accounts.includes(v)) + ) + ) { + this._accounts = accounts; + this._onAccountsChanged(); + } + }) + .catch(err => { + // todo: add error handler + // eslint-disable-next-line no-console + console.error(err); + }), + ]) + .then(() => + this._eventEmitter.emit('connect', { + chainId: this._chainId, + } as ProviderConnectInfo), + ) + .catch(err => { + // todo: add error handler + // eslint-disable-next-line no-console + console.error(err); + }); + } + + // todo this must be ProvideRpcError with a message too + protected _onDisconnect(code: number, data?: unknown) { + this._eventEmitter.emit('disconnect', new EIP1193ProviderRpcError(code, data)); + } + + private _onAccountsChanged() { + // get chainId and safe to local + this._eventEmitter.emit('accountsChanged', this._accounts); + } +} diff --git a/packages/web3-utils/test/.eslintrc.js b/packages/web3-utils/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-utils/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-utils/test/config/jest.config.js b/packages/web3-utils/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3-utils/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-utils/test/config/setup.js b/packages/web3-utils/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-utils/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-utils/test/fixtures/accounts.json b/packages/web3-utils/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-utils/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-utils/test/fixtures/converters.ts b/packages/web3-utils/test/fixtures/converters.ts new file mode 100644 index 00000000000..0161c86cd6d --- /dev/null +++ b/packages/web3-utils/test/fixtures/converters.ts @@ -0,0 +1,372 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address, Bytes, HexString, Numbers, ValueTypes } from 'web3-types'; +import { EtherUnits, hexToBytes } from '../../src/converters'; + +export const bytesToHexValidData: [Bytes, HexString][] = [ + [new Uint8Array([72]), '0x48'], + [new Uint8Array([72, 12]), '0x480c'], + [new Uint8Array(hexToBytes('0c12')), '0x0c12'], + ['0x9c12', '0x9c12'], + ['0X12c6', '0x12c6'], +]; + +export const bytesToHexInvalidData: [any, string][] = [ + [[9.5, 12.9], 'value "[9.5,12.9]" at "/0" must pass "bytes" validation'], + [[-72, 12], 'value "[-72,12]" at "/0" must pass "bytes" validation'], + [[567, 10098], 'value "[567,10098]" at "/0" must pass "bytes" validation'], + [[786, 12, 34, -2, 3], 'value "[786,12,34,-2,3]" at "/0" must pass "bytes" validation'], + ['0x0c1g', 'value "0x0c1g" at "/0" must pass "bytes" validation'], + ['0c1g', 'value "0c1g" at "/0" must pass "bytes" validation'], + ['0x123', 'value "0x123" at "/0" must pass "bytes" validation'], + ['data', 'value "data" at "/0" must pass "bytes" validation'], + [12, 'value "12" at "/0" must pass "bytes" validation'], + [['string'], 'value "["string"]" at "/0" must pass "bytes" validation'], + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + [null, 'value "null" at "/0" must pass "bytes" validation'], + [undefined, 'Web3 validator found 1 error[s]:\nvalue at "/0" is required'], + [{}, 'value "{}" at "/0" must pass "bytes" validation'], + ['1', 'value "1" at "/0" must pass "bytes" validation'], + ['0', 'value "0" at "/0" must pass "bytes" validation'], +]; + +export const hexToBytesValidData: [HexString, Uint8Array][] = [ + ['0x48', new Uint8Array([72])], + ['0x3772', new Uint8Array([55, 114])], + ['0x480c', new Uint8Array([72, 12])], + ['0x0c12', new Uint8Array([12, 18])], + ['0x9c12', new Uint8Array([156, 18])], + ['0X12c6', new Uint8Array([18, 198])], +]; + +export const hexToBytesInvalidData: [any, string][] = [ + [[9.5, 12.9], 'value "[9.5,12.9]" at "/0" must pass "bytes" validation'], + [[-72, 12], 'value "[-72,12]" at "/0" must pass "bytes" validation'], + [[567, 10098], 'value "[567,10098]" at "/0" must pass "bytes" validation'], + [[786, 12, 34, -2, 3], 'value "[786,12,34,-2,3]" at "/0" must pass "bytes" validation'], + ['0x0c1g', 'value "0x0c1g" at "/0" must pass "bytes" validation'], + ['0c1g', 'value "0x0c1g" at "/0" must pass "bytes" validation'], + ['0x123', 'value "0x123" at "/0" must pass "bytes" validation'], + ['data', 'value "0xdata" at "/0" must pass "bytes" validation'], + [12, 'value "12" at "/0" must pass "bytes" validation'], + [['string'], 'value "["string"]" at "/0" must pass "bytes" validation'], + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + [null, 'Web3 validator found 1 error[s]:\nvalue "null" at "/0" must pass "bytes" validation'], + [undefined, 'Web3 validator found 1 error[s]:\nvalue at "/0" is required'], + [{}, 'value "{}" at "/0" must pass "bytes" validation'], +]; + +export const numberToHexValidData: [Numbers, HexString][] = [ + [1, '0x1'], + [255, '0xff'], + [256, '0x100'], + [54, '0x36'], + [BigInt(12), '0xc'], + ['768', '0x300'], + ['-768', '-0x300'], + [-255, '-0xff'], + ['0xFF0', '0xff0'], + ['-0xa0', '-0xa0'], + [0xff, '0xff'], + [-0xff, '-0xff'], +]; + +export const numberToHexstrictValidData: [Numbers, HexString][] = [ + [1, '0x01'], + [255, '0xff'], + [256, '0x0100'], + [54, '0x36'], + [BigInt(12), '0x0c'], + ['768', '0x0300'], + ['-768', '-0x0300'], + [-255, '-0xff'], + ['0xFF0', '0x0ff0'], + ['-0xa0', '-0xa0'], + [0xff, '0xff'], + [-0xff, '-0xff'], +]; + +export const numberToHexInvalidData: [any, string][] = [ + [12.2, 'value "12.2" at "/0" must pass "int" validation'], + ['0xag', 'value "0xag" at "/0" must pass "int" validation'], + ['122g', 'value "122g" at "/0" must pass "int" validation'], + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + [null, 'value "null" at "/0" must pass "int" validation'], + [undefined, 'Web3 validator found 1 error[s]:\nvalue at "/0" is required'], + [{}, 'value "{}" at "/0" must pass "int" validation'], +]; + +export const hexToNumberValidData: [HexString, Numbers][] = [ + ['0x1', 1], + ['0xff', 255], + ['0x100', 256], + ['0x36', 54], + ['0xc', 12], + ['0x300', 768], + ['-0x300', -768], + ['-0xff', -255], + ['0XFF0', 4080], + ['-0xa0', -160], + ['0x1fffffffffffff', 9007199254740991], // Number.MAX_SAFE_INTEGER + ['0x20000000000000', BigInt('9007199254740992')], // Number.MAX_SAFE_INTEGER + 1 + ['-0x1fffffffffffff', -9007199254740991], // Number.MIN_SAFE_INTEGER + ['-0x20000000000000', BigInt('-9007199254740992')], // Number.MIN_SAFE_INTEGER - 1 +]; + +export const hexToNumberInvalidData: [HexString, string][] = [ + ['1a', 'value "1a" at "/0" must pass "hex" validation'], + ['0xffdg', 'value "0xffdg" at "/0" must pass "hex" validation'], + ['xfff', 'value "xfff" at "/0" must pass "hex" validation'], + ['-123', 'value "-123" at "/0" must pass "hex" validation'], + ['-9x123', 'value "-9x123" at "/0" must pass "hex" validation'], +]; + +export const utf8ToHexValidData: [string, HexString][] = [ + ['I have 100£', '0x49206861766520313030c2a3'], + ['I \u1234data', '0x4920e188b464617461'], + ['I ♥ data', '0x4920e299a52064617461'], + ['I \u0000 data', '0x4920002064617461'], + ['\u0000 null suffix', '0x206e756c6c20737566666978'], + ['null prefix\u0000', '0x6e756c6c20707265666978'], + ['\u0000', '0x'], +]; + +export const utf8ToHexInvalidData: [any, string][] = [ + [12, 'value "12" at "/0" must pass "string" validation'], + [BigInt(12), 'value "12" at "/0" must pass "string" validation'], + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + [null, 'value "null" at "/0" must pass "string" validation'], + [undefined, 'Web3 validator found 1 error[s]:\nvalue at "/0" is required'], + [{}, 'value "{}" at "/0" must pass "string" validation'], + [true, 'value "true" at "/0" must pass "string" validation'], + [false, 'value "false" at "/0" must pass "string" validation'], +]; + +export const hexToUtf8ValidData: [HexString, string][] = [ + ['0x49206861766520313030c2a3', 'I have 100£'], + ['0x4920e188b464617461', 'I \u1234data'], + ['0x4920e299a52064617461', 'I ♥ data'], + ['0x4920002064617461', 'I \u0000 data'], + ['0x206e756c6c20737566666978', ' null suffix'], + ['0x6e756c6c20707265666978', 'null prefix'], + ['4d6172696e', 'Marin'], +]; + +export const toUtf8ValidData: [string | Uint8Array, string][] = [ + ...hexToUtf8ValidData, + [hexToBytes('0x206e756c6c20737566666978'), ' null suffix'], + [hexToBytes('0x4920002064617461'), 'I \u0000 data'], + [hexToBytes('0x49206861766520313030c2a3'), 'I have 100£'], +]; + +export const hexToUtf8InvalidData: [any, string][] = [ + [ + '0x4920686176652031303g0c2a3', + 'value "0x4920686176652031303g0c2a3" at "/0" must pass "bytes" validation', + ], + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + [null, 'value "null" at "/0" must pass "bytes" validation'], + [undefined, 'Web3 validator found 1 error[s]:\nvalue at "/0" is required'], + [{}, 'value "{}" at "/0" must pass "bytes" validation'], + [true, 'value "true" at "/0" must pass "bytes" validation'], +]; + +export const asciiToHexValidData: [string, HexString][] = [ + ['I have 100', '0x49206861766520313030'], + ['I \u0001data', '0x49200164617461'], + ['I data', '0x492064617461'], + ['I \u0000 data', '0x4920002064617461'], + ['\u0000 null suffix', '0x00206e756c6c20737566666978'], + ['null prefix\u0000', '0x6e756c6c2070726566697800'], + ['\u0000', '0x00'], + ['', '0x'], +]; + +export const hexToAsciiValidData: [string, HexString][] = [ + ['0x49206861766520313030', 'I have 100'], + ['0x49203464617461', 'I 4data'], + ['0x492064617461', 'I data'], + ['0x4920002064617461', 'I \u0000 data'], + ['0x00206e756c6c20737566666978', '\u0000 null suffix'], + ['0x6e756c6c2070726566697800', 'null prefix\u0000'], + ['0x00', '\u0000'], + ['0x', ''], +]; + +export const toHexValidData: [Numbers | Bytes | Address | boolean, [HexString, ValueTypes]][] = [ + [1, ['0x1', 'uint256']], + [255, ['0xff', 'uint256']], + [256, ['0x100', 'uint256']], + [BigInt(12), ['0xc', 'bigint']], + ['768', ['0x373638', 'string']], + ['-768', ['0x2d373638', 'string']], + [-255, ['-0xff', 'int256']], + ['I have 100£', ['0x49206861766520313030c2a3', 'string']], + ['I \u0000 data', ['0x4920002064617461', 'string']], + ['\u0000 null suffix', ['0x206e756c6c20737566666978', 'string']], + ['null prefix\u0000', ['0x6e756c6c20707265666978', 'string']], + ['\u0000', ['0x', 'string']], + [true, ['0x01', 'bool']], + [false, ['0x00', 'bool']], + ['0x123c', ['0x123c', 'bytes']], + [ + '0x72fdb1c1ddd4c67804f42b93de95cf6a8c51d2d1', + ['0x72fdb1c1ddd4c67804f42b93de95cf6a8c51d2d1', 'address'], + ], + ['-0x01', ['-0x1', 'int256']], + ['123c', ['0x123c', 'bytes']], +]; + +export const toHexInvalidData: [any, string][] = [ + [undefined, 'Invalid value given "undefined". Error: can not be converted to hex.'], +]; + +const conversionBaseData: [[Numbers, EtherUnits], string][] = [ + [[0, 'wei'], '0'], + [[123, 'wei'], '123'], + [['123', 'wei'], '123'], + [[BigInt(123), 'wei'], '123'], + [['1000', 'wei'], '1000'], + [['1', 'kwei'], '0.001'], + [['1', 'mwei'], '0.000001'], + [['1', 'gwei'], '0.000000001'], + [['1', 'micro'], '0.000000000001'], + [['1', 'milli'], '0.000000000000001'], + [['1', 'ether'], '0.000000000000000001'], + [['1', 'kether'], '0.000000000000000000001'], + [['1', 'mether'], '0.000000000000000000000001'], + [['1', 'gether'], '0.000000000000000000000000001'], + [['1', 'tether'], '0.000000000000000000000000000001'], + [['900000000000000000000000000001', 'tether'], '0.900000000000000000000000000001'], + [['1000', 'kwei'], '1'], + [['1000000', 'mwei'], '1'], + [['1000000000', 'gwei'], '1'], + [['1000000000000', 'micro'], '1'], + [['1000000000000000', 'milli'], '1'], + [['1000000000000000000', 'ether'], '1'], + [['1000000000000000000000', 'kether'], '1'], + [['1000000000000000000000000', 'mether'], '1'], + [['1000000000000000000000000000', 'gether'], '1'], + [['1000000000000000000000000000000', 'tether'], '1'], + [['1000000000000000000000000000000', 'tether'], '1'], + [['12345678', 'gwei'], '0.012345678'], + [['76912345678', 'gwei'], '76.912345678'], + [['134439381738', 'gwei'], '134.439381738'], + [['178373938391829348', 'ether'], '0.178373938391829348'], + [['879123456788877661', 'gwei'], '879123456.788877661'], + [['879123456788877661', 'tether'], '0.000000000000879123456788877661'], +]; + +export const fromWeiValidData: [[Numbers, EtherUnits], string][] = [ + ...conversionBaseData, + [['0xff', 'wei'], '255'], + [[1e+22, 'ether'], '10000'], + [[19999999999999991611392, 'ether'], '19999.999999999991611392'], + [[1.9999999999999991611392e+22, 'ether'], '19999.999999999991611392'], +]; + +export const toWeiValidData: [[Numbers, EtherUnits], string][] = [ + ...conversionBaseData, + [['255', 'wei'], '0xFF'], +]; + +export const fromWeiInvalidData: [[any, any], string][] = [ + // eslint-disable-next-line no-useless-escape + [['123.34', 'kwei'], 'Invalid value given "123.34". Error: can not parse as number data.'], + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + [[null, 'kwei'], 'Invalid value given "undefined". Error: can not parse as number data.'], + [[undefined, 'kwei'], 'Invalid value given "undefined". Error: can not parse as number data.'], + [[{}, 'kwei'], 'Invalid value given "{}". Error: can not parse as number data'], + [['data', 'kwei'], 'Invalid value given "data". Error: can not parse as number data.'], + [['1234', 'uwei'], 'Invalid value given "uwei". Error: invalid unit.'], +]; + +export const toWeiInvalidData: [[any, any], string][] = [ + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + [[null, 'kwei'], 'value "null" at "/0" must pass "number" validation'], + [[undefined, 'kwei'], 'Web3 validator found 1 error[s]:\nvalue at "/0" is required'], + [[{}, 'kwei'], 'value "{}" at "/0" must pass "number" validation'], + [['data', 'kwei'], 'value "data" at "/0" must pass "number" validation'], + [['1234', 'uwei'], 'Invalid value given "uwei". Error: invalid unit.'], +]; +export const toCheckSumValidData: [string, string][] = [ + ['0x0089d53f703f7e0843953d48133f74ce247184c2', '0x0089d53F703f7E0843953D48133f74cE247184c2'], + ['0x5fbc2b6c19ee3dd5f9af96ff337ddc89e30ceaef', '0x5FBc2b6C19EE3DD5f9Af96ff337DDC89e30ceAef'], + ['0xa54D3c09E34aC96807c1CC397404bF2B98DC4eFb', '0xa54d3c09E34aC96807c1CC397404bF2B98DC4eFb'], +]; +export const toCheckSumInvalidData: [string, string][] = [ + ['not an address', 'Invalid value given "not an address". Error: invalid ethereum address.'], +]; + +export const bytesToUint8ArrayInvalidData: [any, string][] = bytesToHexInvalidData; + +export const bytesToUint8ArrayValidData: [Bytes, Uint8Array][] = [ + [new Uint8Array([72]), new Uint8Array([72])], + [new Uint8Array([72, 12]), new Uint8Array([72, 12])], + ['0x9c12', new Uint8Array([156, 18])], + ['0X12c6', new Uint8Array([18, 198])], + ['0X01', new Uint8Array([1])], + ['0X00', new Uint8Array([0])], + ['0X00', new Uint8Array([0])], + ['0x1234', new Uint8Array([18, 52])], + ['0x1234', new Uint8Array([18, 52])], + [new Uint8Array(hexToBytes('0c12')), new Uint8Array(hexToBytes('0c12'))], +]; + +export const toBigIntValidData: [any, bigint][] = [ + [BigInt(1), BigInt(1)], + [24, BigInt(24)], + ['123', BigInt(123)], + ['0x04', BigInt(4)], + ['-0x1', -BigInt(1)], +]; + +export const toBigIntInvalidData: [any, string][] = [ + [new Uint8Array([]), 'can not parse as number data'], + ['wwwww', ' Error: can not parse as number data'], + ['zzzzee0xiiuu', ' Error: can not parse as number data'], +]; + +export const toBoolValidData: [boolean | string | number | unknown, boolean][] = [ + [true, true], + [false, false], + [0, false], + [1, true], + [BigInt(1), true], + [BigInt(0), false], + ['true', true], + ['false', false], + ['1', true], + ['0', false], + ['0x0', false], + ['0x1', true], +]; + +export const toBoolInvalidData: [boolean | string | number | unknown, string][] = [ + [100, 'not a valid boolean'], + [BigInt(100), 'not a valid boolean'], + ['100', 'not a valid boolean'], + [{}, 'not a valid boolean'], +]; diff --git a/packages/web3-utils/test/fixtures/formatter.ts b/packages/web3-utils/test/fixtures/formatter.ts new file mode 100644 index 00000000000..7437373d708 --- /dev/null +++ b/packages/web3-utils/test/fixtures/formatter.ts @@ -0,0 +1,58 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { FMT_NUMBER, FMT_BYTES } from 'web3-types'; +import { hexToBytes } from '../../src/converters'; + +export const isDataFormatValid: [any, boolean][] = [ + [{ number: 'number', bytes: 'number' }, true], + [{}, false], +]; + +export const convertScalarValueValid: [[any, any, any], any][] = [ + [[new Uint8Array(hexToBytes('FF')), 'bytes', { bytes: FMT_BYTES.HEX }], '0xff'], + [ + [ + '0xe84375b25f38de0e68f7f4884b7342e0814747143c790f48088d22e802cf7a3', + 'bytes32', + { bytes: FMT_BYTES.HEX }, + ], + '0x0e84375b25f38de0e68f7f4884b7342e0814747143c790f48088d22e802cf7a3', + ], + [[100, 'int', { number: FMT_NUMBER.NUMBER, bytes: FMT_BYTES.HEX }], 100], + [[100, 'int', { number: 'unknown', bytes: FMT_BYTES.HEX }], 100], + [[100, 'uint', { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }], '0x64'], + [[64, 'uint8', { number: FMT_NUMBER.STR }], '64'], + [ + [new Uint8Array(hexToBytes('FF')), 'bytes', { bytes: FMT_BYTES.UINT8ARRAY }], + new Uint8Array(new Uint8Array(hexToBytes('FF'))), + ], + [ + [new Uint8Array(hexToBytes('FF')), 'bytes32', { bytes: FMT_BYTES.HEX }], + '0x00000000000000000000000000000000000000000000000000000000000000ff', + ], + [ + [new Uint8Array(hexToBytes('FF')), 'unknown', { bytes: FMT_BYTES.HEX }], + new Uint8Array(hexToBytes('FF')), + ], + [ + [new Uint8Array(hexToBytes('FF')), 'bytes32', { bytes: FMT_BYTES.UINT8ARRAY }], + new Uint8Array( + hexToBytes('0x00000000000000000000000000000000000000000000000000000000000000ff'), + ), + ], +]; diff --git a/packages/web3-utils/test/fixtures/hash.ts b/packages/web3-utils/test/fixtures/hash.ts new file mode 100644 index 00000000000..6bfe9f63f33 --- /dev/null +++ b/packages/web3-utils/test/fixtures/hash.ts @@ -0,0 +1,351 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { TypedObject, TypedObjectAbbreviated, Bytes, Sha3Input } from 'web3-types'; +import { hexToBytes } from '../../src/converters'; + +export const sha3Data: [Bytes, string | undefined][] = [ + ['test123', '0xf81b517a242b218999ec8eec0ea6e2ddbef2a367a14e93f4a32a39e260f686ad'], + [ + '0x265385c7f4132228a0d54eb1a9e7460b91c0cc68:2382:image', + '0x74e687805c0cfbf0065120987739a5b0ba9b3686a1a778a463bddddcd18cc432', + ], + ['1234', '0x387a8233c96e1fc0ad5e284353276177af2186e7afa85296f106336e376669f7'], + ['helloworld', '0xfa26db7ca85ead399216e7c6316bc50ed24393c3122b582735e7f3b0f91b93f0'], + [ + new Uint8Array([91, 92, 93, 94]), + '0xafde16013fa7d7214985cb9219a059e063934a01bdb1dc2254f42cf53da68c89', + ], +]; + +export const sha3ValidData: [Bytes, string | undefined][] = [ + ...sha3Data, + ['', undefined], + [ + '0x265385c7f4132228a0d54eb1a9e7460b91c0cc68', + '0xb549c60e309fa734059e547a595c28b5ebada949c16229fbf2192650807694f5', + ], + ['0x80', '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421'], + [ + '0x265385c7f4132228a0d54eb1a9e7460b91c0cc68', + '0xb549c60e309fa734059e547a595c28b5ebada949c16229fbf2192650807694f5', + ], + ['0x1234', '0x56570de287d73cd1cb6092bb8fdee6173974955fdef345ae579ee9f475ea7432'], +]; + +export const compareSha3JSValidData: [string, any | undefined][] = [ + ['0x80', new Uint8Array(hexToBytes('0x80'))], + [ + '0x265385c7f4132228a0d54eb1a9e7460b91c0cc68', + new Uint8Array(hexToBytes('0x265385c7f4132228a0d54eb1a9e7460b91c0cc68')), + ], + ['0x1234', new Uint8Array(hexToBytes('0x1234'))], +]; + +export const sha3InvalidData: [any, string][] = [ + [1, 'Invalid value given "1". Error: not a valid string.'], + [BigInt(1010), 'Invalid value given "1010". Error: not a valid string.'], + [undefined, 'Invalid value given "undefined". Error: not a valid string.'], +]; + +export const sha3RawValidData: [Bytes, string | undefined][] = [ + ...sha3Data, + ['', '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'], +]; + +export const compareSha3JSRawValidData: [string, string][] = [...compareSha3JSValidData]; + +export const soliditySha3Data: [TypedObject[] | TypedObjectAbbreviated[], string | undefined][] = [ + [ + [{ type: 'string', value: '31323334' }], + '0xf15f8da2ad27e486d632dc37d24912f634398918d6f9913a0a0ff84e388be62b', + ], + [ + [ + { type: 'string', value: 'helloworld' }, + { type: 'string', value: '01' }, + ], + '0xfb0a9d38c4dc568cbd105866540986fabf3c08c1bfb78299ce21aa0e5c0c586b', + ], + [ + [ + { type: 'string', value: 'hell' }, + { type: 'string', value: 'oworld' }, + { type: 'uint16', value: 0x3031 }, + ], + '0xfb0a9d38c4dc568cbd105866540986fabf3c08c1bfb78299ce21aa0e5c0c586b', + ], + [ + [{ type: 'uint96', value: '32309054545061485574011236401' }], + '0xfb0a9d38c4dc568cbd105866540986fabf3c08c1bfb78299ce21aa0e5c0c586b', + ], + [ + [{ type: 'uint256', value: '234' }], + '0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2', + ], + [ + [{ t: 'int', v: BigInt('234') }], + '0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2', + ], + [ + [{ type: 'uint', value: '234' }], + '0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2', + ], + [ + [{ type: 'bytes', value: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1' }], + '0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b', + ], + [ + [ + { type: 'int16', value: -1 }, + { type: 'uint48', value: 12 }, + ], + '0x81da7abb5c9c7515f57dab2fc946f01217ab52f3bd8958bc36bd55894451a93c', + ], + [ + [ + { type: 'int16', value: -1 }, + { type: 'uint48', value: '0x0c' }, + ], + '0x81da7abb5c9c7515f57dab2fc946f01217ab52f3bd8958bc36bd55894451a93c', + ], + [ + [{ type: 'string', value: 'Hello!%' }], + '0x661136a4267dba9ccdf6bfddb7c00e714de936674c4bdb065a531cf1cb15c7fc', + ], + [ + [{ type: 'address', value: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1' }], + '0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b', + ], + [ + [{ t: 'bytes32', v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1' }], + '0x3c69a194aaf415ba5d6afca734660d0a3d45acdc05d54cd1ca89a8988e7625b4', + ], + [ + [ + { t: 'string', v: 'Hello!%' }, + { t: 'int8', v: -23 }, + { t: 'address', v: '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d' }, + ], + '0xa13b31627c1ed7aaded5aecec71baf02fe123797fffd45e662eac8e06fbe4955', + ], + [ + [{ t: 'int256', v: '32309054545061485574011236401' }], + '0x1594ff29e8161679724999598fb6b993f68549092dddc9f183b04c629aeb9d54', + ], +]; + +export const soliditySha3ValidData: [ + TypedObject[] | TypedObjectAbbreviated[], + string | undefined, +][] = [...soliditySha3Data, [[{ t: 'string', v: '' }], undefined]]; + +export const soliditySha3RawValidData: [ + TypedObject[] | TypedObjectAbbreviated[], + string | undefined, +][] = [ + ...soliditySha3Data, + [ + [{ t: 'string', v: '' }], + '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + ], +]; + +export const soliditySha3InvalidData: [any, string][] = [ + [{ t: 'int8', v: 500 }, 'Invalid value given "500". Error: value is larger than size.'], + [ + { t: 'bytes', v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c' }, + 'Invalid value given "0x407D73d8a49eeb85D32Cf465507dd71d507100c". Error: can not parse as byte data.', + ], + [ + { t: 'bytes8', v: '0x407D73d8a49eeb85D32Cf465507dd71d507100' }, + 'Invalid value given "0x407D73d8a49eeb85D32Cf465507dd71d507100". Error: can not parse as byte data.', + ], +]; + +export const encodePackData: [TypedObject[] | TypedObjectAbbreviated[], any][] = [ + [[{ type: 'string', value: '31323334' }], '0x3331333233333334'], + [ + [{ type: 'int[]', value: '01' }], + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + [ + [{ type: 'uint[]', value: '01' }], + '0x0000000000000000000000000000000000000000000000000000000000000001', + ], + [ + [{ type: 'int', value: 31323334 }], + '0x0000000000000000000000000000000000000000000000000000000001ddf4c6', + ], + [[{ type: 'string', value: '' }], '0x'], + [ + [{ type: 'address', value: '0xc1912fee45d61c87cc5ea59dae31190fffff232d' }], + '0xc1912fee45d61c87cc5ea59dae31190fffff232d', + ], + [[{ type: 'bool', value: true }], '0x01'], + [[{ type: 'bool', value: false }], '0x00'], + [[{ value: 'Hello!%', type: 'string' }], '0x48656c6c6f2125'], + [ + [{ t: 'uint256', v: BigInt('2345676856') }], + '0x000000000000000000000000000000000000000000000000000000008bd03038', + ], + [ + [{ type: 'uint256', value: '2342342342342342342345676856' }], + '0x000000000000000000000000000000000000000007918a48d0493ed3da6ed838', + ], + [[{ type: 'uint8', value: '56' }], '0x38'], + [[{ v: '256', t: 'uint16' }], '0x0100'], + [[{ v: '3256', t: 'uint32' }], '0x00000cb8'], + [[{ v: '44454256', t: 'uint128' }], '0x00000000000000000000000002a65170'], + [[{ v: '44454256', t: 'int128' }], '0x00000000000000000000000002a65170'], + [[{ v: '0x22', t: 'bytes2' }], '0x2200'], + [[{ v: '0x44222266', t: 'bytes4' }], '0x44222266'], + [ + [{ v: '0x44555ffffffffdd222222222222224444556553522', t: 'bytes32' }], + '0x44555ffffffffdd2222222222222244445565535220000000000000000000000', + ], + [ + [{ v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'address' }], + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + ], + [ + [{ v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'bytes' }], + '0x407d73d8a49eeb85d32cf465507dd71d507100c1', + ], + [[{ t: 'int', v: '0' }], '0x0000000000000000000000000000000000000000000000000000000000000000'], + [ + [{ type: 'int256', value: '1234' }], + '0x00000000000000000000000000000000000000000000000000000000000004d2', + ], + [ + [{ type: 'string', value: '1234' }], // should be encoded differently than int256 + '0x31323334', + ], + [ + [{ type: 'int256', value: 1234 }], // same as type int256 when value is a string + '0x00000000000000000000000000000000000000000000000000000000000004d2', + ], + [ + [{ type: 'int128[]', value: [12345, 324, 1, 2] }], + '0x00000000000000000000000000003039000000000000000000000000000001440000000000000000000000000000000100000000000000000000000000000002', + ], + [ + [ + { + type: 'bytes32[]', + value: [ + '0x1248', + '0x3c69a194aaf415ba5d6afca734660d0a3d45acdc05d54cd1ca89a8988e7625b4', + ], + }, + ], + '0x12480000000000000000000000000000000000000000000000000000000000003c69a194aaf415ba5d6afca734660d0a3d45acdc05d54cd1ca89a8988e7625b4', + ], + [[{ type: 'bytes4[]', value: ['0x11223344', '0x22334455'] }], '0x1122334422334455'], +]; + +export const encodePackedInvalidData: [any, string][] = [ + [{ type: 'string', value: 1234 }, 'Invalid value given "1234". Error: not a valid string.'], + [{ type: 'string', value: true }, 'Invalid value given "true". Error: not a valid string.'], + [{ type: 'string', value: 1234 }, 'Invalid value given "1234". Error: not a valid string.'], + [{ type: 'boolean', value: 1234 }, 'Invalid value given "1234". Error: not a valid boolean.'], + [ + { type: 'address', value: 1234 }, + 'Invalid value given "1234". Error: invalid ethereum address', + ], + [ + { type: 'address', value: '0x2' }, + 'Invalid value given "0x2". Error: invalid ethereum address', + ], + [{ type: 'uint612', value: 13 }, 'Invalid value given "13". Error: invalid size given.'], + [ + { type: 'uint8', value: 1000 }, + 'Invalid value given "1000". Error: value is larger than size.', + ], + [ + { type: 'uint256', value: -1 }, + 'Invalid value given "-1". Error: not a valid unsigned integer.', + ], + [{ type: 'int255', value: 100 }, 'Invalid value given "int255". Error: invalid size given.'], + [ + { type: 'bytes32', value: '0x1' }, + 'Invalid value given "0x1". Error: can not parse as byte data.', + ], +]; + +export const keccak256ValidData: [string | Uint8Array | bigint, string][] = [ + ['my data', '0x8e0c48154711500d6fa119cc31df4dec339091e8b426cf4109a769fe89baad31'], + [ + new Uint8Array(Buffer.from('my data')), + '0x8e0c48154711500d6fa119cc31df4dec339091e8b426cf4109a769fe89baad31', + ], + [ + '0x8e0c48154711500d6fa119cc31df4dec339091e8b426cf4109a769fe89baad31', + '0x2d19cd91fbcc44e6412f92c11da7907cdedb1ace04c47447b42a61f1cd63b85a', + ], + [BigInt(3), '0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de'], +]; + +export const elementaryNameValidData: [any, string][] = [ + ['uint128', '128'], + ['int256', '256'], +]; + +export const soliditySha3BigIntValidData: [Sha3Input[], string][] = [ + [[3434], '0xf219fa5590f999dc677e94dd9cf99cf14103d2f4323898edb31db982d5909687'], + [[BigInt(3434)], '0xf219fa5590f999dc677e94dd9cf99cf14103d2f4323898edb31db982d5909687'], + [ + [{ t: 'bigint', v: BigInt(3434) }], + '0xf219fa5590f999dc677e94dd9cf99cf14103d2f4323898edb31db982d5909687', + ], + + [[0], '0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563'], + [[BigInt(0)], '0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563'], + [ + [{ t: 'bigint', v: BigInt(0) }], + '0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563', + ], + + [[90071992547409], '0x290998ceba657b344f8ee112246f32b20ecaad06d8d9ad09748de1821b9ef73e'], + [ + [BigInt(90071992547409)], + '0x290998ceba657b344f8ee112246f32b20ecaad06d8d9ad09748de1821b9ef73e', + ], + [ + [{ t: 'bigint', v: BigInt(90071992547409) }], + '0x290998ceba657b344f8ee112246f32b20ecaad06d8d9ad09748de1821b9ef73e', + ], + + [['0x70696e67', 0], '0xe54a278c69f07b6b4f0736dc55c389cd2d3f31365b090c9f76a414fb51552c53'], + [ + ['0x70696e67', BigInt(0)], + '0xe54a278c69f07b6b4f0736dc55c389cd2d3f31365b090c9f76a414fb51552c53', + ], + + [['0x70696e67', 10], '0x418e921c5c859d5f560b89ad03a6672907d66de336392a5178ea69281feff40a'], + [ + ['0x70696e67', BigInt(10)], + '0x418e921c5c859d5f560b89ad03a6672907d66de336392a5178ea69281feff40a', + ], + + /* + //These hash values are generated using contract with function like: + + function func90071992547409() external pure returns (bytes32) { + return keccak256(abi.encodePacked(int(90071992547409))) ;} + */ +]; diff --git a/packages/web3-utils/test/fixtures/hugeData.ts b/packages/web3-utils/test/fixtures/hugeData.ts new file mode 100644 index 00000000000..0470ae6c807 --- /dev/null +++ b/packages/web3-utils/test/fixtures/hugeData.ts @@ -0,0 +1,29 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const hugeData = { + data: '{"jsonrpc":"2.0","id":"96aa3f13-077c-4c82-a64a-64b8626f8192","result":"0x1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"}\n{"jsonrpc":"2.0","id":"1b10c675-5eac-4c80-b300-36085d63d5f4","result":"0xd5"}\n{"jsonrpc":"2.0","id":"96aa3f13-077c-4c82-a64a-64b8626f819c","result":"0xd5"}\n{"jsonrpc":"2.0","id":"bba428bf-6726-425a-8cbc-2ed7c9448ee7","result":{"blockHash":"0xccfea468ce813e63d59be075dd71de76d4236fa3292dc3b4cc5e6f15c27c3ad1","blockNumber":"0xd4","contractAddress":null,"cumulativeGasUsed":"0xad8c516","effectiveGasPrice":"0x9502f907","from":"0x12b1d9d74d73b1c3a245b19c1c5501c653af1af9","gasUsed":"0x22b5a9e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":"0xf362b2285d41dc806fd61b92f7c192006b707f42","transactionHash":"0x01ab900543af6d9dbb27b21cf62339c07bfd6d1acdc01f66c932ed8f3c731412","transactionIndex":"0x4","type":"0x2"}}\n', + result: [ + JSON.parse( + '{"jsonrpc":"2.0","id":"96aa3f13-077c-4c82-a64a-64b8626f8192","result":"0x1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141"}', + ), + JSON.parse('{"jsonrpc":"2.0","id":"1b10c675-5eac-4c80-b300-36085d63d5f4","result":"0xd5"}'), + JSON.parse('{"jsonrpc":"2.0","id":"96aa3f13-077c-4c82-a64a-64b8626f819c","result":"0xd5"}'), + JSON.parse( + '{"jsonrpc":"2.0","id":"bba428bf-6726-425a-8cbc-2ed7c9448ee7","result":{"blockHash":"0xccfea468ce813e63d59be075dd71de76d4236fa3292dc3b4cc5e6f15c27c3ad1","blockNumber":"0xd4","contractAddress":null,"cumulativeGasUsed":"0xad8c516","effectiveGasPrice":"0x9502f907","from":"0x12b1d9d74d73b1c3a245b19c1c5501c653af1af9","gasUsed":"0x22b5a9e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":"0xf362b2285d41dc806fd61b92f7c192006b707f42","transactionHash":"0x01ab900543af6d9dbb27b21cf62339c07bfd6d1acdc01f66c932ed8f3c731412","transactionIndex":"0x4","type":"0x2"}}\n', + ), + ], +}; diff --git a/packages/web3-utils/test/fixtures/json_rpc.ts b/packages/web3-utils/test/fixtures/json_rpc.ts new file mode 100644 index 00000000000..516711abceb --- /dev/null +++ b/packages/web3-utils/test/fixtures/json_rpc.ts @@ -0,0 +1,66 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { JsonRpcNotification, SubscriptionParams } from 'web3-types'; + +const responseWithResult = { jsonrpc: '2.0', id: 1, result: '' }; +const responseWithError = { jsonrpc: '2.0', id: 1, error: { code: 1, message: 'string' } }; +const responseWithSubscription = { id: 1, jsonrpc: '2.0', result: '' }; +const responseWithNotfication = { + jsonrpc: '2.0', + method: 'subscribe', + params: { subscription: '', result: '' } as SubscriptionParams, +} as JsonRpcNotification; +export const isResponseWithResultValidTest: [any, boolean][] = [ + [responseWithResult, true], + [responseWithError, false], +]; + +export const isResponseWithErrorValidTest: [any, boolean][] = [ + [responseWithResult, false], + [responseWithError, true], +]; + +export const isResponseWithNotificationValidTest: [JsonRpcNotification, boolean][] = [ + [responseWithNotfication, true], +]; + +export const isSubscriptionResultValidTest: [any, boolean][] = [[responseWithSubscription, true]]; + +export const isValidResponseValidTest: [any, boolean][] = [ + [responseWithResult, true], + [responseWithError, true], +]; + +export const isBatchResponseValidTest: [any, boolean][] = [ + [[responseWithResult, responseWithError], true], + [[responseWithNotfication], false], +]; + +export const toPayloadValidTest: [any, any][] = [ + [ + { method: 'delete' }, + { + method: 'delete', + id: expect.stringMatching( + // Uuid + '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}', + ), + jsonrpc: '2.0', + params: undefined, + }, + ], +]; diff --git a/packages/web3-utils/test/fixtures/objects.ts b/packages/web3-utils/test/fixtures/objects.ts new file mode 100644 index 00000000000..6c98e127ef5 --- /dev/null +++ b/packages/web3-utils/test/fixtures/objects.ts @@ -0,0 +1,80 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const mergeDeepData: { + message: string; + destination: Record; + sources: Record[]; + output: Record; +}[] = [ + { + message: 'multiple sources', + destination: {}, + sources: [ + { a: undefined, b: true, c: new Uint8Array([1, 2, 3]) }, + { a: 3, d: 'string', e: { nested: BigInt(4) } }, + ], + output: { + a: 3, + b: true, + c: new Uint8Array([1, 2, 3]), + d: 'string', + e: { nested: BigInt(4) }, + }, + }, + + { + message: 'array elements', + destination: {}, + sources: [{ a: [1, 2] }, { a: [3, 4] }], + output: { a: [3, 4] }, + }, + + { + message: 'array elements with null values', + destination: {}, + sources: [{ a: [1, 2] }, { a: undefined }], + output: { a: [1, 2] }, + }, + + { + message: 'nested array elements', + destination: {}, + sources: [{ a: [[1, 2]] }, { a: [[3, 4]] }], + output: { a: [[3, 4]] }, + }, + + { + message: 'items pre-exists in the destination', + destination: { a: 4, b: false }, + sources: [ + { a: undefined, b: true, c: new Uint8Array([1, 2, 3]) }, + { a: undefined, d: 'string', e: { nested: 4 } }, + ], + output: { a: 4, b: true, c: new Uint8Array([1, 2, 3]), d: 'string', e: { nested: 4 } }, + }, + + { + message: 'items with different types', + destination: { a: 4, b: false }, + sources: [ + { a: undefined, b: true, c: new Uint8Array([1, 2, 3]) }, + { a: '4', b: 'true', d: 'string', e: { nested: 4 } }, + ], + output: { a: '4', b: 'true', c: new Uint8Array([1, 2, 3]), d: 'string', e: { nested: 4 } }, + }, +]; diff --git a/packages/web3-utils/test/fixtures/random.ts b/packages/web3-utils/test/fixtures/random.ts new file mode 100644 index 00000000000..16b25ecb519 --- /dev/null +++ b/packages/web3-utils/test/fixtures/random.ts @@ -0,0 +1,18 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const randomHexData: number[] = [2, 4, 8, 16, 32, 64, 128, 256]; diff --git a/packages/web3-utils/test/fixtures/string_manipulation.ts b/packages/web3-utils/test/fixtures/string_manipulation.ts new file mode 100644 index 00000000000..be5b298c803 --- /dev/null +++ b/packages/web3-utils/test/fixtures/string_manipulation.ts @@ -0,0 +1,125 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { HexString, Numbers } from 'web3-types'; + +export const padLeftData: [[Numbers, number, string], HexString][] = [ + [[0, 10, '0'], '0x0000000000'], + [['0x01', 64, 'f'], '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01'], + [['-0x01', 64, 'f'], '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01'], + [['5', 32, '0'], '00000000000000000000000000000005'], + [['-05', 32, 'f'], 'fffffffffffffffffffffffffffff-05'], + [['abcd', 8, '0'], '0000abcd'], + [['-abcd', 8, '0'], '000-abcd'], + [[BigInt('9007199254740992'), 32, '0'], '0x00000000000000000020000000000000'], + [[BigInt('-9007199254740992'), 32, '0'], '-0x00000000000000000020000000000000'], + [[-13, 10, '0'], '-0x000000000d'], + [['9.5', 8, '0'], '000009.5'], +]; + +export const padInvalidData: [[any, number, string], string][] = [ + [[9.5, 64, 'f'], 'value "9.5" at "/0" must pass "int" validation'], + // Using "null" value intentionally for validation + [ + // eslint-disable-next-line no-null/no-null + [null, 8, '0'], + 'Web3 validator found 1 error[s]:\nvalue "null" at "/0" must pass "int" validation', + ], + [[undefined, 8, '0'], 'Web3 validator found 1 error[s]:\nvalue at "/0" is required'], + [[{}, 3, 'f'], 'value "{}" at "/0" must pass "int" validation'], +]; + +export const padRightData: [[Numbers, number, string], HexString][] = [ + [[1, 5, '0'], '0x10000'], + [ + [-2000, 128, '0'], + '-0x7d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + ], + [['0x00', 5, 'f'], '0x00fff'], + [['-0x01', 64, 'f'], '-0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'], + [['zxy', 11, '0'], 'zxy00000000'], + [['-abcd', 32, '1'], '-abcd111111111111111111111111111'], + [[BigInt(10000), 8, '0'], '0x27100000'], + [[BigInt(-14), 8, '0'], '-0xe0000000'], + [['15.5', 8, '0'], '15.50000'], +]; + +export const toTwosComplementData: [[Numbers, number], HexString][] = [ + [[13, 32], '0x0000000000000000000000000000000d'], + [[256, 30], '0x000000000000000000000000000100'], + [[0, 32], '0x00000000000000000000000000000000'], + [['0x1', 32], '0x00000000000000000000000000000001'], + [['-0x1', 32], '0xffffffffffffffffffffffffffffffff'], + [[BigInt('9007199254740992'), 32], '0x00000000000000000020000000000000'], + [[BigInt('-9007199254740992'), 32], '0xffffffffffffffffffe0000000000000'], + [['13', 32], '0x0000000000000000000000000000000d'], + [['-13', 32], '0xfffffffffffffffffffffffffffffff3'], + [[-16, 2], '0xf0'], +]; + +export const fromTwosComplementData: [[Numbers, number], number | bigint][] = [ + [['0x0000000000000000000000000000000d', 32], 13], + [['0x000000000000000000000000000100', 30], 256], + [['0x00000000000000000020000000000000', 32], BigInt('9007199254740992')], + [['0xfffffffffffffffffffffffffffffff3', 32], -13], + [['0xf0', 2], -16], + [['0xffffffffffffffffffffffffffffff00', 32], -256], + [[1000, 64], 1000], + [[-1000, 64], -1000], + [[BigInt(9), 1], -7], +]; + +export const toTwosComplementInvalidData: [[Numbers, number], string][] = [ + // solidity only store 32 bytes numbers + [ + ['0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00', 64], + 'value "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00" at "/0" must pass "int" validation', + ], + [['ab', 32], 'value "ab" at "/0" must pass "int" validation'], + [['-ab', 3], 'value "-ab" at "/0" must pass "int" validation'], + [['ab0x', 2], 'value "ab0x" at "/0" must pass "int" validation'], + [[25.5, 32], 'value "25.5" at "/0" must pass "int" validation'], + [['-120.0', 4], 'value "-120.0" at "/0" must pass "int" validation'], + [ + [-256, 2], + 'Invalid value given "value: -256, nibbleWidth: 2". Error: value greater than the nibble width.', + ], + [ + ['-0x1000', 3], + 'Invalid value given "value: -0x1000, nibbleWidth: 3". Error: value greater than the nibble width.', + ], + [ + [BigInt(-160000), 1], + 'Invalid value given "value: -160000, nibbleWidth: 1". Error: value greater than the nibble width.', + ], +]; + +export const fromTwosComplementInvalidData: [[Numbers, number], string][] = [ + [['ab', 32], 'value "ab" at "/0" must pass "int" validation'], + [['-ab', 3], 'value "-ab" at "/0" must pass "int" validation'], + [['ab0x', 2], 'value "ab0x" at "/0" must pass "int" validation'], + [[25.5, 32], 'value "25.5" at "/0" must pass "int" validation'], + [['-120.0', 4], 'value "-120.0" at "/0" must pass "int" validation'], + [ + [1000, 2], + 'Invalid value given "value: 1000, nibbleWidth: 2". Error: value greater than the nibble width.', + ], + [ + ['0xa05', 1], + 'Invalid value given "value: 0xa05, nibbleWidth: 1". Error: value greater than the nibble width.', + ], +]; diff --git a/packages/web3-utils/test/fixtures/uint8array.ts b/packages/web3-utils/test/fixtures/uint8array.ts new file mode 100644 index 00000000000..c365dc51d02 --- /dev/null +++ b/packages/web3-utils/test/fixtures/uint8array.ts @@ -0,0 +1,77 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const uint8ArrayConcatData: [Uint8Array[], Uint8Array][] = [ + [[new Uint8Array([0]), new Uint8Array([0])], new Uint8Array([0, 0])], + [ + [ + new Uint8Array([ + 0xde, 0xc0, 0x51, 0x8f, 0xa6, 0x72, 0xa7, 0x00, 0x27, 0xb0, 0x4c, 0x28, 0x65, 0x82, + 0xe5, 0x43, + ]), + new Uint8Array([ + 0xab, 0x17, 0x31, 0x9f, 0xbd, 0xd3, 0x84, 0xfa, 0x7b, 0xc8, 0xf3, 0xd5, 0xa5, 0x42, + 0xc0, + ]), + ], + new Uint8Array([ + 0xde, 0xc0, 0x51, 0x8f, 0xa6, 0x72, 0xa7, 0x00, 0x27, 0xb0, 0x4c, 0x28, 0x65, 0x82, + 0xe5, 0x43, 0xab, 0x17, 0x31, 0x9f, 0xbd, 0xd3, 0x84, 0xfa, 0x7b, 0xc8, 0xf3, 0xd5, + 0xa5, 0x42, 0xc0, + ]), + ], + [ + [new Uint8Array([0x41]), new Uint8Array([0x42]), new Uint8Array([0x43])], + new Uint8Array([0x41, 0x42, 0x43]), + ], + [ + [new Uint8Array([12, 12]), new Uint8Array([13]), new Uint8Array([14])], + new Uint8Array([12, 12, 13, 14]), + ], +]; +const singleArray = new Uint8Array([0x13]); +export const uint8ArrayEqualsValidData: [[Uint8Array, Uint8Array], boolean][] = [ + [[new Uint8Array([0]), new Uint8Array([0])], true], + [ + [ + new Uint8Array([ + 0xde, 0xc0, 0x51, 0x8f, 0xa6, 0x72, 0xa7, 0x00, 0x27, 0xb0, 0x4c, 0x28, 0x65, 0x82, + 0xe5, 0x43, + ]), + new Uint8Array([ + 0xde, 0xc0, 0x51, 0x8f, 0xa6, 0x72, 0xa7, 0x00, 0x27, 0xb0, 0x4c, 0x28, 0x65, 0x82, + 0xe5, 0x43, + ]), + ], + true, + ], + [[new Uint8Array([12, 12]), new Uint8Array([12, 12])], true], + [[new Uint8Array([0]), new Uint8Array([1])], false], + [[new Uint8Array([0x00]), new Uint8Array([0])], true], + [[new Uint8Array([0x1]), new Uint8Array([1])], true], + [ + [ + new Uint8Array([ + 0xde, 0xc0, 0x51, 0x8f, 0xa6, 0x72, 0xa7, 0x00, 0x27, 0xb0, 0x4c, 0x28, 0x65, 0x82, + 0xe5, 0x43, + ]), + new Uint8Array([0]), + ], + false, + ], + [[singleArray, singleArray], true], +]; diff --git a/packages/web3-utils/test/fixtures/validation.ts b/packages/web3-utils/test/fixtures/validation.ts new file mode 100644 index 00000000000..3c216d3ff62 --- /dev/null +++ b/packages/web3-utils/test/fixtures/validation.ts @@ -0,0 +1,94 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Numbers, ContractInitOptions } from 'web3-types'; +import { InvalidBlockError } from 'web3-errors'; + +export const compareBlockNumbersValidData: [[Numbers, Numbers], number][] = [ + [[1, 1], 0], + [[1, 2], -1], + [[2, 1], 1], + [[BigInt(1), BigInt(1)], 0], + [[BigInt(1), BigInt(2)], -1], + [[BigInt(2), BigInt(1)], 1], + [[1, BigInt(1)], 0], + [[1, BigInt(2)], -1], + [[2, BigInt(1)], 1], + [['earliest', 0], 0], + [[0, 'earliest'], 0], + [['earliest', 'earliest'], 0], + [['pending', 'pending'], 0], + [['latest', 'latest'], 0], + [['earliest', 'pending'], -1], + [[BigInt('9007199254740992'), BigInt('9007199254740991')], 1], + [[13532346, 13532300], 1], + [['pending', 'latest'], 1], + [['safe', 'safe'], 0], + [['earliest', 'safe'], -1], + [['safe', 'pending'], -1], + [['pending', 'safe'], 1], + [['finalized', 'finalized'], 0], + [['earliest', 'finalized'], -1], + [['finalized', 'pending'], -1], + [['pending', 'finalized'], 1], + [['safe', 'latest'], -1], + [['latest', 'safe'], 1], + [['earliest', 2], -1], + [[2, 'earliest'], 1], +]; + +const errorObj = new InvalidBlockError('Cannot compare blocktag with provided non-blocktag input.'); +export const compareBlockNumbersInvalidData: [[Numbers, Numbers], InvalidBlockError][] = [ + [['pending', 'unknown'], errorObj], + [['', 'pending'], errorObj], + [[22, 'finalized'], errorObj], + [['finalized', 22], errorObj], + [['latest', 110], errorObj], + [[222, 'latest'], errorObj], + [['pending', 230], errorObj], + [[10000, 'pending'], errorObj], + [['latest', BigInt(1)], errorObj], + [['pending', BigInt(1)], errorObj], + [['safe', 0], errorObj], + [[0, 'safe'], errorObj], +]; + +export const isBloomValidData: [any, true][] = [ + [ + '0x00000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000008000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000010000000000000000000000000000000000010000000000402000000000000000000000020000010000000000000000000000000000000000000000000000000000000000000', + true, + ], + [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + true, + ], +]; + +export const isContractInitValidData: ContractInitOptions[] = [ + {dataInputFill: "data"}, + {syncWithContext: true}, + {gas: "100000", + syncWithContext: true, + dataInputFill: "data", + }, +]; + +export const isContractInitInvalidData: unknown[] = [ + "", + 12, + {} +]; \ No newline at end of file diff --git a/packages/web3-utils/test/integration/event_emitter.test.ts b/packages/web3-utils/test/integration/event_emitter.test.ts new file mode 100644 index 00000000000..68a35796887 --- /dev/null +++ b/packages/web3-utils/test/integration/event_emitter.test.ts @@ -0,0 +1,119 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EventEmitter } from '../../src/event_emitter'; + +describe('EventEmitter in the browser with Cypress', () => { + let emitter: EventEmitter; + + beforeEach(() => { + emitter = new EventEmitter(); + }); + + describe('on', () => { + it('should add a listener for the specified event', () => { + const callback = jest.fn(); + emitter.on('test', callback); + emitter.emit('test', 'hello'); + expect(callback).toHaveBeenCalledWith('hello'); + }); + }); + + describe('once', () => { + it('should add a listener for the specified event that is only called once', () => { + const callback = jest.fn(); + emitter.once('test', callback); + emitter.emit('test', 'hello'); + emitter.emit('test', 'world'); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith('hello'); + }); + }); + + describe('off', () => { + it('should remove a listener for the specified event', () => { + const callback = jest.fn(); + emitter.on('test', callback); + emitter.off('test', callback); + emitter.emit('test', 'hello'); + expect(callback).not.toHaveBeenCalled(); + }); + }); + + describe('emit', () => { + it('should call all listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + emitter.emit('test', 'hello'); + expect(callback1).toHaveBeenCalledWith('hello'); + expect(callback2).toHaveBeenCalledWith('hello'); + }); + }); + + describe('listenerCount', () => { + it('should return the number of listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + expect(emitter.listenerCount('test')).toBe(2); + }); + }); + + describe('listeners', () => { + it('should return an array of listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + expect(emitter.listeners('test')).toEqual([callback1, callback2]); + }); + }); + + describe('eventNames', () => { + it('should return an array of event names that have listeners', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test1', callback1); + emitter.on('test2', callback2); + expect(emitter.eventNames()).toEqual(['test1', 'test2']); + }); + }); + + describe('removeAllListeners', () => { + it('should remove all listeners for all events', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test1', callback1); + emitter.on('test2', callback2); + emitter.removeAllListeners(); + emitter.emit('test1', 'hello'); + emitter.emit('test2', 'world'); + expect(callback1).not.toHaveBeenCalled(); + expect(callback2).not.toHaveBeenCalled(); + }); + }); + + describe('setMaxListeners', () => { + it('should set the maximum number of listeners for an event', () => { + emitter.setMaxListeners(2); + expect(emitter.getMaxListeners()).toBe(2); + }); + }); +}); diff --git a/packages/web3-utils/test/integration/jest.config.js b/packages/web3-utils/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-utils/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-utils/test/integration/setup.js b/packages/web3-utils/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-utils/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-utils/test/tsconfig.json b/packages/web3-utils/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-utils/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-utils/test/unit/chunk_response_parser.test.ts b/packages/web3-utils/test/unit/chunk_response_parser.test.ts new file mode 100644 index 00000000000..22100a3e6a8 --- /dev/null +++ b/packages/web3-utils/test/unit/chunk_response_parser.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EventEmitter } from 'eventemitter3'; +import { InvalidResponseError } from 'web3-errors'; +import { ChunkResponseParser } from '../../src/chunk_response_parser'; +import { hugeData } from '../fixtures/hugeData'; + +jest.setTimeout(20000); +describe('chunk_response_parser', () => { + let parser: ChunkResponseParser; + let eventEmiter: EventEmitter; + beforeEach(() => { + eventEmiter = new EventEmitter(); + parser = new ChunkResponseParser(eventEmiter, false); + }); + it('clearQueue', () => { + const clearQueue = jest.fn(); + parser.onError(clearQueue); + // @ts-expect-error call private method + parser.clearQueues(); + expect(clearQueue).toHaveBeenCalled(); + }); + it('parse response', () => { + const res = parser.parseResponse(hugeData.data); + expect(res).toEqual(hugeData.result); + }); + + it('parse response with last chunk mechanism', () => { + parser.parseResponse( + '{"jsonrpc":"2.0","id":"96aa3f13-077c-4c82-a64a-64b8626f8192","result":"0x141414141', + ); + parser.parseResponse('123'); + const res = parser.parseResponse('14141"}\n'); + expect(res[0]).toEqual({ + jsonrpc: '2.0', + id: '96aa3f13-077c-4c82-a64a-64b8626f8192', + result: '0x14141414112314141', + }); + }); + + it('lastChunkTimeout error', async () => { + // @ts-expect-error set private property + parser.chunkTimeout = 10; + parser.parseResponse( + '{"jsonrpc":"2.0","id":"96aa3f13-077c-4c82-a64a-64b8626f8192","result":"0x141414141', + ); + const onError = jest.fn(); + eventEmiter.on('error', onError); + // eslint-disable-next-line no-promise-executor-return + await new Promise(resolve => setTimeout(resolve, 1000)); + expect(onError).toHaveBeenCalledWith( + new InvalidResponseError({ + id: 1, + jsonrpc: '2.0', + error: { code: 2, message: 'Chunk timeout' }, + }), + ); + }); +}); diff --git a/packages/web3-utils/test/unit/converters.test.ts b/packages/web3-utils/test/unit/converters.test.ts new file mode 100644 index 00000000000..cb6fa58caa0 --- /dev/null +++ b/packages/web3-utils/test/unit/converters.test.ts @@ -0,0 +1,423 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + asciiToHex, + bytesToHex, + fromAscii, + fromDecimal, + fromUtf8, + fromWei, + hexToAscii, + hexToBytes, + hexToNumber, + hexToNumberString, + hexToString, + hexToUtf8, + numberToHex, + stringToHex, + toAscii, + toDecimal, + toHex, + toNumber, + toUtf8, + toWei, + utf8ToHex, + toChecksumAddress, + bytesToUint8Array, + toBigInt, + toBool, +} from '../../src/converters'; + +import { + asciiToHexValidData, + bytesToHexInvalidData, + bytesToHexValidData, + fromWeiInvalidData, + fromWeiValidData, + hexToAsciiValidData, + hexToBytesInvalidData, + hexToBytesValidData, + hexToNumberInvalidData, + hexToNumberValidData, + hexToUtf8InvalidData, + hexToUtf8ValidData, + toUtf8ValidData, + numberToHexInvalidData, + numberToHexValidData, + toHexValidData, + toHexInvalidData, + toWeiInvalidData, + toWeiValidData, + utf8ToHexInvalidData, + utf8ToHexValidData, + toCheckSumValidData, + bytesToUint8ArrayInvalidData, + bytesToUint8ArrayValidData, + toBigIntValidData, + toBigIntInvalidData, + toCheckSumInvalidData, + numberToHexstrictValidData, + toBoolValidData, + toBoolInvalidData, +} from '../fixtures/converters'; + +describe('converters', () => { + describe('bytesToHex', () => { + describe('valid cases', () => { + it.each(bytesToHexValidData)('%s', (input, output) => { + expect(bytesToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(bytesToHexInvalidData)('%s', (input, output) => { + expect(() => bytesToHex(input)).toThrow(output); + }); + }); + }); + + describe('hexToBytes', () => { + describe('valid cases', () => { + it.each(hexToBytesValidData)('%s', (input, output) => { + expect(hexToBytes(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToBytesInvalidData)('%s', (input, output) => { + expect(() => hexToBytes(input)).toThrow(output); + }); + }); + }); + + describe('numberToHex', () => { + describe('valid cases', () => { + it.each(numberToHexValidData)('%s', (input, output) => { + expect(numberToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(numberToHexInvalidData)('%s', (input, output) => { + expect(() => numberToHex(input)).toThrow(output); + }); + }); + + describe('valid hexstrict cases', () => { + it.each(numberToHexstrictValidData)('%s', (input, output) => { + expect(numberToHex(input, true)).toEqual(output); + }); + }); + }); + + describe('fromDecimal', () => { + describe('valid cases', () => { + it.each(numberToHexValidData)('%s', (input, output) => { + expect(fromDecimal(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(numberToHexInvalidData)('%s', (input, output) => { + expect(() => fromDecimal(input)).toThrow(output); + }); + }); + }); + + describe('hexToNumber', () => { + describe('valid cases', () => { + it.each(hexToNumberValidData)('%s', (input, output) => { + expect(hexToNumber(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToNumberInvalidData)('%s', (input, output) => { + expect(() => hexToNumber(input)).toThrow(output); + }); + }); + }); + + describe('toDecimal', () => { + describe('valid cases', () => { + it.each(hexToNumberValidData)('%s', (input, output) => { + expect(toDecimal(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToNumberInvalidData)('%s', (input, output) => { + expect(() => toDecimal(input)).toThrow(output); + }); + }); + }); + + describe('hexToNumberString', () => { + it.each(hexToNumberValidData)('%s', (input, output) => { + expect(hexToNumberString(input)).toEqual(output.toString()); + }); + }); + + describe('utf8ToHex', () => { + describe('valid cases', () => { + it.each(utf8ToHexValidData)('%s', (input, output) => { + expect(utf8ToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => utf8ToHex(input)).toThrow(output); + }); + }); + }); + + describe('fromUtf8', () => { + describe('valid cases', () => { + it.each(utf8ToHexValidData)('%s', (input, output) => { + expect(fromUtf8(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => fromUtf8(input)).toThrow(output); + }); + }); + }); + + describe('stringToHex', () => { + describe('valid cases', () => { + it.each(utf8ToHexValidData)('%s', (input, output) => { + expect(stringToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => stringToHex(input)).toThrow(output); + }); + }); + }); + + describe('hexToUtf8', () => { + describe('valid cases', () => { + it.each(hexToUtf8ValidData)('%s', (input, output) => { + expect(hexToUtf8(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => hexToUtf8(input)).toThrow(output); + }); + }); + }); + + describe('toUtf8', () => { + describe('valid cases', () => { + it.each(toUtf8ValidData)('%s', (input, output) => { + expect(toUtf8(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => toUtf8(input)).toThrow(output); + }); + }); + }); + + describe('hexToString', () => { + describe('valid cases', () => { + it.each(hexToUtf8ValidData)('%s', (input, output) => { + expect(hexToString(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => hexToString(input)).toThrow(output); + }); + }); + }); + + describe('asciiToHex', () => { + describe('valid cases', () => { + it.each(asciiToHexValidData)('%s', (input, output) => { + expect(asciiToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => asciiToHex(input)).toThrow(output); + }); + }); + }); + + describe('fromAscii', () => { + describe('valid cases', () => { + it.each(asciiToHexValidData)('%s', (input, output) => { + expect(fromAscii(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => fromAscii(input)).toThrow(output); + }); + }); + }); + + describe('hexToAscii', () => { + describe('valid cases', () => { + it.each(hexToAsciiValidData)('%s', (input, output) => { + expect(hexToAscii(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => hexToAscii(input)).toThrow(output); + }); + }); + }); + + describe('toAscii', () => { + describe('valid cases', () => { + it.each(hexToAsciiValidData)('%s', (input, output) => { + expect(toAscii(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => toAscii(input)).toThrow(output); + }); + }); + }); + + describe('toHex', () => { + describe('return value', () => { + it.each(toHexValidData)('%s', (input, output) => { + expect(toHex(input)).toEqual(output[0]); + }); + }); + + describe('return type', () => { + it.each(toHexValidData)('%s', (input, output) => { + expect(toHex(input, true)).toEqual(output[1]); + }); + }); + + describe('invalid cases', () => { + it.each(toHexInvalidData)('%s', (input, output) => { + expect(() => toHex(input)).toThrow(output); + }); + }); + }); + + describe('toNumber', () => { + it.each([...hexToNumberValidData, [123, 123], ['123', 123]])('%s', (input, output) => { + expect(toNumber(input)).toEqual(output); + }); + }); + + describe('fromWei', () => { + describe('valid cases', () => { + it.each(fromWeiValidData)('%s', (input, output) => { + expect(fromWei(input[0], input[1])).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(fromWeiInvalidData)('%s', (input, output) => { + expect(() => fromWei(input[0], input[1])).toThrow(output); + }); + }); + }); + + describe('toWei', () => { + describe('valid cases', () => { + it.each(toWeiValidData)('%s', (input, output) => { + expect(toWei(output, input[1])).toEqual(input[0].toString()); + }); + }); + + describe('invalid cases', () => { + it.each(toWeiInvalidData)('%s', (input, output) => { + expect(() => toWei(input[0], input[1])).toThrow(output); + }); + }); + }); + describe('toChecksumAddress', () => { + describe('valid cases', () => { + it.each(toCheckSumValidData)('%s', (input, output) => { + expect(toChecksumAddress(input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(toCheckSumInvalidData)('%s', (input, output) => { + expect(() => toChecksumAddress(input)).toThrow(output); + }); + }); + }); + describe('bytesToUint8Array', () => { + describe('bytesToUint8Array', () => { + describe('valid cases', () => { + it.each(bytesToUint8ArrayValidData)('%s', (input, output) => { + expect(bytesToUint8Array(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(bytesToUint8ArrayInvalidData)('%s', (input, output) => { + expect(() => bytesToUint8Array(input)).toThrow(output); + }); + }); + }); + }); + describe('toBigInt', () => { + describe('valid cases', () => { + it.each(toBigIntValidData)('%s', (input, output) => { + expect(toBigInt(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(toBigIntInvalidData)('%s', (input, output) => { + expect(() => toBigInt(input)).toThrow(output); + }); + }); + }); + + describe('toBool', () => { + describe('valid cases', () => { + it.each(toBoolValidData)('%s', (input, output) => { + expect(toBool(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(toBoolInvalidData)('%s', (input, output) => { + expect(() => toBool(input)).toThrow(output); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/converters_dom.test.ts b/packages/web3-utils/test/unit/converters_dom.test.ts new file mode 100644 index 00000000000..e7ed91a9573 --- /dev/null +++ b/packages/web3-utils/test/unit/converters_dom.test.ts @@ -0,0 +1,439 @@ +/** + * @jest-environment jsdom + */ + +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// this file contains the unit test for the event emitter in the DOM environment +// it is executed in the jsdom environment (see "@jest-environment jsdom" in the top comment of this file) + +// ignore the following rule to allow keeping `@jest-environment jsdom` on top: +// eslint-disable-next-line header/header +import { TextDecoder, TextEncoder } from 'util'; +// polyfill for jsdom +// @ts-expect-error ignore the error 'Type 'typeof TextDecoder' is not assignable to type ...' +global.TextDecoder = TextDecoder; +global.TextEncoder = TextEncoder; + +/* eslint-disable import/first */ +import { + asciiToHex, + bytesToHex, + fromAscii, + fromDecimal, + fromUtf8, + fromWei, + hexToAscii, + hexToBytes, + hexToNumber, + hexToNumberString, + hexToString, + hexToUtf8, + numberToHex, + stringToHex, + toAscii, + toDecimal, + toHex, + toNumber, + toUtf8, + toWei, + utf8ToHex, + toChecksumAddress, + bytesToUint8Array, + toBigInt, + toBool, +} from '../../src/converters'; + +import { + asciiToHexValidData, + bytesToHexInvalidData, + bytesToHexValidData, + fromWeiInvalidData, + fromWeiValidData, + hexToAsciiValidData, + hexToBytesInvalidData, + hexToBytesValidData, + hexToNumberInvalidData, + hexToNumberValidData, + hexToUtf8InvalidData, + hexToUtf8ValidData, + toUtf8ValidData, + numberToHexInvalidData, + numberToHexValidData, + toHexValidData, + toHexInvalidData, + toWeiInvalidData, + toWeiValidData, + utf8ToHexInvalidData, + utf8ToHexValidData, + toCheckSumValidData, + bytesToUint8ArrayInvalidData, + bytesToUint8ArrayValidData, + toBigIntValidData, + toBigIntInvalidData, + toCheckSumInvalidData, + numberToHexstrictValidData, + toBoolValidData, + toBoolInvalidData, +} from '../fixtures/converters'; + +describe('converters', () => { + describe('bytesToHex', () => { + describe('valid cases', () => { + it.each(bytesToHexValidData)('%s', (input, output) => { + expect(bytesToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(bytesToHexInvalidData)('%s', (input, output) => { + expect(() => bytesToHex(input)).toThrow(output); + }); + }); + }); + + describe('hexToBytes', () => { + describe('valid cases', () => { + it.each(hexToBytesValidData)('%s', (input, output) => { + expect(hexToBytes(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToBytesInvalidData)('%s', (input, output) => { + expect(() => hexToBytes(input)).toThrow(output); + }); + }); + }); + + describe('numberToHex', () => { + describe('valid cases', () => { + it.each(numberToHexValidData)('%s', (input, output) => { + expect(numberToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(numberToHexInvalidData)('%s', (input, output) => { + expect(() => numberToHex(input)).toThrow(output); + }); + }); + + describe('valid hexstrict cases', () => { + it.each(numberToHexstrictValidData)('%s', (input, output) => { + expect(numberToHex(input, true)).toEqual(output); + }); + }); + }); + + describe('fromDecimal', () => { + describe('valid cases', () => { + it.each(numberToHexValidData)('%s', (input, output) => { + expect(fromDecimal(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(numberToHexInvalidData)('%s', (input, output) => { + expect(() => fromDecimal(input)).toThrow(output); + }); + }); + }); + + describe('hexToNumber', () => { + describe('valid cases', () => { + it.each(hexToNumberValidData)('%s', (input, output) => { + expect(hexToNumber(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToNumberInvalidData)('%s', (input, output) => { + expect(() => hexToNumber(input)).toThrow(output); + }); + }); + }); + + describe('toDecimal', () => { + describe('valid cases', () => { + it.each(hexToNumberValidData)('%s', (input, output) => { + expect(toDecimal(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToNumberInvalidData)('%s', (input, output) => { + expect(() => toDecimal(input)).toThrow(output); + }); + }); + }); + + describe('hexToNumberString', () => { + it.each(hexToNumberValidData)('%s', (input, output) => { + expect(hexToNumberString(input)).toEqual(output.toString()); + }); + }); + + describe('utf8ToHex', () => { + describe('valid cases', () => { + it.each(utf8ToHexValidData)('%s', (input, output) => { + expect(utf8ToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => utf8ToHex(input)).toThrow(output); + }); + }); + }); + + describe('fromUtf8', () => { + describe('valid cases', () => { + it.each(utf8ToHexValidData)('%s', (input, output) => { + expect(fromUtf8(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => fromUtf8(input)).toThrow(output); + }); + }); + }); + + describe('stringToHex', () => { + describe('valid cases', () => { + it.each(utf8ToHexValidData)('%s', (input, output) => { + expect(stringToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => stringToHex(input)).toThrow(output); + }); + }); + }); + + describe('hexToUtf8', () => { + describe('valid cases', () => { + it.each(hexToUtf8ValidData)('%s', (input, output) => { + expect(hexToUtf8(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => hexToUtf8(input)).toThrow(output); + }); + }); + }); + + describe('toUtf8', () => { + describe('valid cases', () => { + it.each(toUtf8ValidData)('%s', (input, output) => { + expect(toUtf8(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => toUtf8(input)).toThrow(output); + }); + }); + }); + + describe('hexToString', () => { + describe('valid cases', () => { + it.each(hexToUtf8ValidData)('%s', (input, output) => { + expect(hexToString(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => hexToString(input)).toThrow(output); + }); + }); + }); + + describe('asciiToHex', () => { + describe('valid cases', () => { + it.each(asciiToHexValidData)('%s', (input, output) => { + expect(asciiToHex(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => asciiToHex(input)).toThrow(output); + }); + }); + }); + + describe('fromAscii', () => { + describe('valid cases', () => { + it.each(asciiToHexValidData)('%s', (input, output) => { + expect(fromAscii(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(utf8ToHexInvalidData)('%s', (input, output) => { + expect(() => fromAscii(input)).toThrow(output); + }); + }); + }); + + describe('hexToAscii', () => { + describe('valid cases', () => { + it.each(hexToAsciiValidData)('%s', (input, output) => { + expect(hexToAscii(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => hexToAscii(input)).toThrow(output); + }); + }); + }); + + describe('toAscii', () => { + describe('valid cases', () => { + it.each(hexToAsciiValidData)('%s', (input, output) => { + expect(toAscii(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(hexToUtf8InvalidData)('%s', (input, output) => { + expect(() => toAscii(input)).toThrow(output); + }); + }); + }); + + describe('toHex', () => { + describe('return value', () => { + it.each(toHexValidData)('%s', (input, output) => { + expect(toHex(input)).toEqual(output[0]); + }); + }); + + describe('return type', () => { + it.each(toHexValidData)('%s', (input, output) => { + expect(toHex(input, true)).toEqual(output[1]); + }); + }); + + describe('invalid cases', () => { + it.each(toHexInvalidData)('%s', (input, output) => { + expect(() => toHex(input)).toThrow(output); + }); + }); + }); + + describe('toNumber', () => { + it.each([...hexToNumberValidData, [123, 123], ['123', 123]])('%s', (input, output) => { + expect(toNumber(input)).toEqual(output); + }); + }); + + describe('fromWei', () => { + describe('valid cases', () => { + it.each(fromWeiValidData)('%s', (input, output) => { + expect(fromWei(input[0], input[1])).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(fromWeiInvalidData)('%s', (input, output) => { + expect(() => fromWei(input[0], input[1])).toThrow(output); + }); + }); + }); + + describe('toWei', () => { + describe('valid cases', () => { + it.each(toWeiValidData)('%s', (input, output) => { + expect(toWei(output, input[1])).toEqual(input[0].toString()); + }); + }); + + describe('invalid cases', () => { + it.each(toWeiInvalidData)('%s', (input, output) => { + expect(() => toWei(input[0], input[1])).toThrow(output); + }); + }); + }); + describe('toChecksumAddress', () => { + describe('valid cases', () => { + it.each(toCheckSumValidData)('%s', (input, output) => { + expect(toChecksumAddress(input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(toCheckSumInvalidData)('%s', (input, output) => { + expect(() => toChecksumAddress(input)).toThrow(output); + }); + }); + }); + describe('bytesToUint8Array', () => { + describe('bytesToUint8Array', () => { + describe('valid cases', () => { + it.each(bytesToUint8ArrayValidData)('%s', (input, output) => { + expect(bytesToUint8Array(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(bytesToUint8ArrayInvalidData)('%s', (input, output) => { + expect(() => bytesToUint8Array(input)).toThrow(output); + }); + }); + }); + }); + describe('toBigInt', () => { + describe('valid cases', () => { + it.each(toBigIntValidData)('%s', (input, output) => { + expect(toBigInt(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(toBigIntInvalidData)('%s', (input, output) => { + expect(() => toBigInt(input)).toThrow(output); + }); + }); + }); + + describe('toBool', () => { + describe('valid cases', () => { + it.each(toBoolValidData)('%s', (input, output) => { + expect(toBool(input)).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(toBoolInvalidData)('%s', (input, output) => { + expect(() => toBool(input)).toThrow(output); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/event_emitter_dom.test.ts b/packages/web3-utils/test/unit/event_emitter_dom.test.ts new file mode 100644 index 00000000000..b58ab6de1a8 --- /dev/null +++ b/packages/web3-utils/test/unit/event_emitter_dom.test.ts @@ -0,0 +1,128 @@ +/** + * @jest-environment jsdom + */ + +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// this file contains the unit test for the event emitter in the DOM environment +// it is executed in the jsdom environment (see "@jest-environment jsdom" in the top comment of this file) + +// ignore the following rule to allow keeping `@jest-environment jsdom` on top: +// eslint-disable-next-line header/header +import { EventEmitter } from '../../src/event_emitter'; + +describe('EventEmitter with DOM', () => { + let emitter: EventEmitter; + + beforeEach(() => { + emitter = new EventEmitter(); + }); + + describe('on', () => { + it('should add a listener for the specified event', () => { + const callback = jest.fn(); + emitter.on('test', callback); + emitter.emit('test', 'hello'); + expect(callback).toHaveBeenCalledWith('hello'); + }); + }); + + describe('once', () => { + it('should add a listener for the specified event that is only called once', () => { + const callback = jest.fn(); + emitter.once('test', callback); + emitter.emit('test', 'hello'); + emitter.emit('test', 'world'); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith('hello'); + }); + }); + + describe('off', () => { + it('should remove a listener for the specified event', () => { + const callback = jest.fn(); + emitter.on('test', callback); + emitter.off('test', callback); + emitter.emit('test', 'hello'); + expect(callback).not.toHaveBeenCalled(); + }); + }); + + describe('emit', () => { + it('should call all listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + emitter.emit('test', 'hello'); + expect(callback1).toHaveBeenCalledWith('hello'); + expect(callback2).toHaveBeenCalledWith('hello'); + }); + }); + + describe('listenerCount', () => { + it('should return the number of listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + expect(emitter.listenerCount('test')).toBe(2); + }); + }); + + describe('listeners', () => { + it('should return an array of listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + expect(emitter.listeners('test')).toEqual([callback1, callback2]); + }); + }); + + describe('eventNames', () => { + it('should return an array of event names that have listeners', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test1', callback1); + emitter.on('test2', callback2); + expect(emitter.eventNames()).toEqual(['test1', 'test2']); + }); + }); + + describe('removeAllListeners', () => { + it('should remove all listeners for all events', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test1', callback1); + emitter.on('test2', callback2); + emitter.removeAllListeners(); + emitter.emit('test1', 'hello'); + emitter.emit('test2', 'world'); + expect(callback1).not.toHaveBeenCalled(); + expect(callback2).not.toHaveBeenCalled(); + }); + }); + + describe('setMaxListeners', () => { + it('should set the maximum number of listeners for an event', () => { + emitter.setMaxListeners(2); + expect(emitter.getMaxListeners()).toBe(2); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/event_emitter_node.test.ts b/packages/web3-utils/test/unit/event_emitter_node.test.ts new file mode 100644 index 00000000000..a78fe8f63e1 --- /dev/null +++ b/packages/web3-utils/test/unit/event_emitter_node.test.ts @@ -0,0 +1,122 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// this file will contain the unit test for the event emitter in the Node environment + +import { EventEmitter } from '../../src/event_emitter'; + +describe('EventEmitter with Node', () => { + // let emitter = new EventEmitter(); + let emitter: EventEmitter; + + beforeEach(() => { + emitter = new EventEmitter(); + }); + + describe('on', () => { + it('should add a listener for the specified event', () => { + const callback = jest.fn(); + emitter.on('test', callback); + emitter.emit('test', 'hello'); + expect(callback).toHaveBeenCalledWith('hello'); + }); + }); + + describe('once', () => { + it('should add a listener for the specified event that is only called once', () => { + const callback = jest.fn(); + emitter.once('test', callback); + emitter.emit('test', 'hello'); + emitter.emit('test', 'world'); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith('hello'); + }); + }); + + describe('off', () => { + it('should remove a listener for the specified event', () => { + const callback = jest.fn(); + emitter.on('test', callback); + emitter.off('test', callback); + emitter.emit('test', 'hello'); + expect(callback).not.toHaveBeenCalled(); + }); + }); + + describe('emit', () => { + it('should call all listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + emitter.emit('test', 'hello'); + expect(callback1).toHaveBeenCalledWith('hello'); + expect(callback2).toHaveBeenCalledWith('hello'); + }); + }); + + describe('listenerCount', () => { + it('should return the number of listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + expect(emitter.listenerCount('test')).toBe(2); + }); + }); + + describe('listeners', () => { + it('should return an array of listeners for the specified event', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test', callback1); + emitter.on('test', callback2); + expect(emitter.listeners('test')).toEqual([callback1, callback2]); + }); + }); + + describe('eventNames', () => { + it('should return an array of event names that have listeners', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test1', callback1); + emitter.on('test2', callback2); + expect(emitter.eventNames()).toEqual(['test1', 'test2']); + }); + }); + + describe('removeAllListeners', () => { + it('should remove all listeners for all events', () => { + const callback1 = jest.fn(); + const callback2 = jest.fn(); + emitter.on('test1', callback1); + emitter.on('test2', callback2); + emitter.removeAllListeners(); + emitter.emit('test1', 'hello'); + emitter.emit('test2', 'world'); + expect(callback1).not.toHaveBeenCalled(); + expect(callback2).not.toHaveBeenCalled(); + }); + }); + + describe('setMaxListeners', () => { + it('should set the maximum number of listeners for an event', () => { + emitter.setMaxListeners(2); + expect(emitter.getMaxListeners()).toBe(2); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/formatter.test.ts b/packages/web3-utils/test/unit/formatter.test.ts new file mode 100644 index 00000000000..b58f5459584 --- /dev/null +++ b/packages/web3-utils/test/unit/formatter.test.ts @@ -0,0 +1,740 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + Address, + Bytes, + DEFAULT_RETURN_FORMAT, + FMT_BYTES, + FMT_NUMBER, + FormatType, + HexString, + Numbers, +} from 'web3-types'; +import { expectTypeOf, typecheck } from '@humeris/espresso-shot'; +import { isDataFormatValid, convertScalarValueValid } from '../fixtures/formatter'; +import { format, isDataFormat, convertScalarValue } from '../../src/formatter'; +import { hexToBytes } from '../../src/converters'; + +type TestTransactionInfoType = { + readonly blockHash?: Bytes; + readonly blockNumber?: Numbers; + readonly from: Address; + readonly hash: Bytes; + readonly transactionIndex?: Numbers; +}; + +type TestBlockType = { + readonly parentHash: Bytes; + readonly sha3Uncles: Bytes; + readonly miner: Bytes; + readonly stateRoot: Bytes; + readonly transactionsRoot: Bytes; + readonly receiptsRoot: Bytes; + readonly logsBloom?: Bytes; + readonly difficulty?: Numbers; + readonly number?: Numbers; + readonly gasLimit: Numbers; + readonly gasUsed: Numbers; + readonly timestamp: Numbers; + readonly extraData: Bytes; + readonly mixHash: Bytes; + readonly nonce?: Numbers; + readonly totalDifficulty: Numbers; + readonly baseFeePerGas?: Numbers; + readonly size: Numbers; + readonly transactions: Bytes[] | TestTransactionInfoType[]; + readonly uncles: Bytes[]; + readonly hash?: Bytes; +}; + +describe('formatter', () => { + describe('types', () => { + describe('scalar types', () => { + typecheck('should not format non-formatable scalar type', () => { + type T = FormatType< + boolean, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + describe('number', () => { + typecheck('should format for FMT_NUMBER.BIGINT', () => { + type T = FormatType< + Numbers, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_NUMBER.HEX', () => { + type T = FormatType< + Numbers, + { number: FMT_NUMBER.HEX; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_NUMBER.NUMBER', () => { + type T = FormatType< + Numbers, + { number: FMT_NUMBER.NUMBER; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_NUMBER.STR', () => { + type T = FormatType< + Numbers, + { number: FMT_NUMBER.STR; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + }); + + describe('bytes', () => { + typecheck('should format for FMT_BYTES.UINT8ARRAY', () => { + type T = FormatType< + Bytes, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_BYTES.HEX', () => { + type T = FormatType; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_BYTES.UINT8ARRAY', () => { + type T = FormatType< + Bytes, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + }); + }); + + describe('array types', () => { + typecheck('should not format non-formatable array type', () => { + type T = FormatType< + boolean[], + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + describe('number', () => { + typecheck('should format for FMT_NUMBER.BIGINT', () => { + type T = FormatType< + Numbers[], + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_NUMBER.HEX', () => { + type T = FormatType< + Numbers[], + { number: FMT_NUMBER.HEX; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_NUMBER.NUMBER', () => { + type T = FormatType< + Numbers[], + { number: FMT_NUMBER.NUMBER; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_NUMBER.STR', () => { + type T = FormatType< + Numbers[], + { number: FMT_NUMBER.STR; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + }); + + describe('bytes', () => { + typecheck('should format for FMT_BYTES.UINT8ARRAY', () => { + type T = FormatType< + Bytes[], + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_BYTES.HEX', () => { + type T = FormatType< + Bytes[], + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.HEX } + >; + + return expectTypeOf().toBe(); + }); + + typecheck('should format for FMT_BYTES.UINT8ARRAY', () => { + type T = FormatType< + Bytes[], + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe(); + }); + }); + }); + + describe('objects', () => { + typecheck('should format correct types for simple object', () => { + type T = FormatType< + { + handleRevert: boolean; + timeout: number; + data: Uint8Array; + }, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe<{ + handleRevert: boolean; + timeout: bigint; + data: Uint8Array; + }>(); + }); + + typecheck('should format correct types for array', () => { + type T = FormatType< + { + handleRevert: boolean; + timeout: number[]; + data: Uint8Array[]; + }, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe<{ + handleRevert: boolean; + timeout: bigint[]; + data: Uint8Array[]; + }>(); + }); + + typecheck('should format correct types for nested object', () => { + type T = FormatType< + { + nested: { + handleRevert: boolean; + timeout: number[]; + data: Uint8Array[]; + }; + }, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe<{ + nested: { handleRevert: boolean; timeout: bigint[]; data: Uint8Array[] }; + }>(); + }); + + typecheck('should format correct types for tuple', () => { + type T = FormatType< + { + tuple: [Uint8Array, number]; + }, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe<{ + tuple: [Uint8Array, bigint]; + }>(); + }); + + typecheck('should format correct tuple type', () => { + type T = FormatType< + [Uint8Array, number], + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe<[Uint8Array, bigint]>(); + }); + + typecheck('should format block for number as "hex" and bytes as "hex"', () => { + type T = FormatType< + TestBlockType, + { number: FMT_NUMBER.HEX; bytes: FMT_BYTES.HEX } + >; + + return expectTypeOf().toBe<{ + readonly parentHash: string; + readonly sha3Uncles: string; + readonly miner: string; + readonly stateRoot: string; + readonly transactionsRoot: string; + readonly receiptsRoot: string; + readonly logsBloom?: string; + readonly difficulty?: string; + readonly number?: string; + readonly gasLimit: string; + readonly gasUsed: string; + readonly timestamp: string; + readonly extraData: string; + readonly mixHash: string; + readonly nonce?: string; + readonly totalDifficulty: string; + readonly baseFeePerGas?: string; + readonly size: string; + readonly transactions: + | string[] + | { + readonly blockHash?: string; + readonly blockNumber?: string; + readonly from: Address; + readonly hash: string; + readonly transactionIndex?: string; + }[]; + readonly uncles: string[]; + readonly hash?: string; + }>(); + }); + + typecheck( + 'should format block for number as "bigint" and bytes as "uint8array"', + () => { + type T = FormatType< + TestBlockType, + { number: FMT_NUMBER.BIGINT; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe<{ + readonly parentHash: Uint8Array; + readonly sha3Uncles: Uint8Array; + readonly miner: Uint8Array; + readonly stateRoot: Uint8Array; + readonly transactionsRoot: Uint8Array; + readonly receiptsRoot: Uint8Array; + readonly logsBloom?: Uint8Array; + readonly difficulty?: bigint; + readonly number?: bigint; + readonly gasLimit: bigint; + readonly gasUsed: bigint; + readonly timestamp: bigint; + readonly extraData: Uint8Array; + readonly mixHash: Uint8Array; + readonly nonce?: bigint; + readonly totalDifficulty: bigint; + readonly baseFeePerGas?: bigint; + readonly size: bigint; + readonly transactions: + | Uint8Array[] + | { + readonly blockHash?: Uint8Array; + readonly blockNumber?: bigint; + readonly from: Address; + readonly hash: Uint8Array; + readonly transactionIndex?: bigint; + }[]; + readonly uncles: Uint8Array[]; + readonly hash?: Uint8Array; + }>(); + }, + ); + + typecheck( + 'should format block for number as "number" and bytes as "uint8array"', + () => { + type T = FormatType< + TestBlockType, + { number: FMT_NUMBER.NUMBER; bytes: FMT_BYTES.UINT8ARRAY } + >; + + return expectTypeOf().toBe<{ + readonly parentHash: Uint8Array; + readonly sha3Uncles: Uint8Array; + readonly miner: Uint8Array; + readonly stateRoot: Uint8Array; + readonly transactionsRoot: Uint8Array; + readonly receiptsRoot: Uint8Array; + readonly logsBloom?: Uint8Array; + readonly difficulty?: number; + readonly number?: number; + readonly gasLimit: number; + readonly gasUsed: number; + readonly timestamp: number; + readonly extraData: Uint8Array; + readonly mixHash: Uint8Array; + readonly nonce?: number; + readonly totalDifficulty: number; + readonly baseFeePerGas?: number; + readonly size: number; + readonly transactions: + | Uint8Array[] + | { + readonly blockHash?: Uint8Array; + readonly blockNumber?: number; + readonly from: Address; + readonly hash: Uint8Array; + readonly transactionIndex?: number; + }[]; + readonly uncles: Uint8Array[]; + readonly hash?: Uint8Array; + }>(); + }, + ); + }); + }); + + describe('format', () => { + describe('scalar values', () => { + it('should not format non-formatable scalar type', () => { + expect(format({ format: 'boolean' }, true, DEFAULT_RETURN_FORMAT)).toBe(true); + }); + + describe('number', () => { + it('should format for FMT_NUMBER.BIGINT', () => { + expect( + format({ format: 'uint' }, 10, { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.HEX, + }), + ).toEqual(BigInt(10)); + }); + + it('should format for FMT_NUMBER.HEX', () => { + expect( + format({ format: 'uint' }, 10, { + number: FMT_NUMBER.HEX, + bytes: FMT_BYTES.HEX, + }), + ).toBe('0xa'); + }); + + it('should format for FMT_NUMBER.NUMBER', () => { + expect( + format({ format: 'uint' }, '0xa', { + number: FMT_NUMBER.NUMBER, + bytes: FMT_BYTES.HEX, + }), + ).toBe(10); + }); + + it('should format for FMT_NUMBER.STR', () => { + expect( + format({ format: 'uint' }, 10, { + number: FMT_NUMBER.STR, + bytes: FMT_BYTES.HEX, + }), + ).toBe('10'); + }); + }); + + describe('bytes', () => { + it('should format for FMT_BYTES.HEX', () => { + expect( + format({ format: 'bytes' }, new Uint8Array(hexToBytes('100bca')), { + number: FMT_NUMBER.STR, + bytes: FMT_BYTES.HEX, + }), + ).toBe('0x100bca'); + }); + + it('should format for FMT_BYTES.UINT8ARRAY', () => { + expect( + format({ format: 'bytes' }, '0x100bca', { + number: FMT_NUMBER.STR, + bytes: FMT_BYTES.UINT8ARRAY, + }), + ).toEqual(new Uint8Array([16, 11, 202])); + }); + }); + }); + + describe('array values', () => { + it('should format array values with single type', () => { + const schema = { + type: 'object', + properties: { + int_arr: { + type: 'array', + items: { + format: 'uint', + }, + }, + bytes_arr: { + type: 'array', + items: { + format: 'bytes', + }, + }, + }, + }; + + const data = { + int_arr: [10, 10, 10], + bytes_arr: [ + new Uint8Array(hexToBytes('FF')), + new Uint8Array(hexToBytes('FF')), + new Uint8Array(hexToBytes('FF')), + ], + }; + + const result = { + int_arr: ['0xa', '0xa', '0xa'], + bytes_arr: ['0xff', '0xff', '0xff'], + }; + + expect( + format(schema, data, { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }), + ).toEqual(result); + }); + + it('should format array values with object type', () => { + const schema = { + type: 'object', + properties: { + arr: { + type: 'array', + items: { + type: 'object', + properties: { + prop1: { + format: 'uint', + }, + prop2: { + format: 'bytes', + }, + }, + }, + }, + }, + }; + + const data = { + arr: [ + { prop1: 10, prop2: new Uint8Array(hexToBytes('FF')) }, + { prop1: 10, prop2: new Uint8Array(hexToBytes('FF')) }, + ], + }; + + const result = { + arr: [ + { prop1: '0xa', prop2: '0xff' }, + { prop1: '0xa', prop2: '0xff' }, + ], + }; + + expect( + format(schema, data, { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }), + ).toEqual(result); + }); + + it('should format array values with tuple type', () => { + const schema = { + type: 'object', + properties: { + tuple: { + type: 'array', + items: [ + { + format: 'uint', + }, + { + format: 'bytes', + }, + ], + }, + }, + }; + + const data = { + tuple: [10, new Uint8Array(hexToBytes('FF'))], + }; + + const result = { + tuple: ['0xa', '0xff'], + }; + + expect( + format(schema, data, { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }), + ).toEqual(result); + }); + + it('should format simple arrays', () => { + const schema = { + type: 'array', + items: { + format: 'uint', + }, + }; + + const data = [10, 10]; + + const result = ['0xa', '0xa']; + + expect( + format(schema, data, { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }), + ).toEqual(result); + }); + + it('should format simple tuple', () => { + const schema = { + type: 'array', + items: [ + { + format: 'uint', + }, + { + format: 'bytes', + }, + ], + }; + + const data = [10, new Uint8Array(hexToBytes('FF'))]; + + const result = ['0xa', '0xff']; + + expect( + format(schema, data, { number: FMT_NUMBER.HEX, bytes: FMT_BYTES.HEX }), + ).toEqual(result); + }); + }); + + describe('object values', () => { + it('should format simple object', () => { + const schema = { + type: 'object', + properties: { + handleRevert: { + format: 'bool', + }, + timeout: { + format: 'uint', + }, + data: { + format: 'bytes', + }, + }, + }; + + const data = { + handleRevert: true, + timeout: 10, + data: new Uint8Array(hexToBytes('FE')), + }; + + const expected = { + handleRevert: true, + timeout: '0xa', + data: '0xfe', + }; + + const result = format(schema, data, { + number: FMT_NUMBER.HEX, + bytes: FMT_BYTES.HEX, + }); + + expect(result).toEqual(expected); + }); + + it('should format nested objects', () => { + const schema = { + type: 'object', + properties: { + nested: { + type: 'object', + properties: { + handleRevert: { + format: 'bool', + }, + timeout: { + format: 'uint', + }, + data: { + format: 'bytes', + }, + }, + }, + }, + }; + + const data = { + nested: { + handleRevert: true, + timeout: 10, + data: new Uint8Array(hexToBytes('FE')), + }, + }; + + const expected = { + nested: { + handleRevert: true, + timeout: '0xa', + data: '0xfe', + }, + }; + + const result = format(schema, data, { + number: FMT_NUMBER.HEX, + bytes: FMT_BYTES.HEX, + }); + + expect(result).toEqual(expected); + }); + }); + describe('isDataFormat', () => { + describe('valid cases', () => { + it.each(isDataFormatValid)('%s', (input, output) => { + expect(isDataFormat(input)).toEqual(output); + }); + }); + }); + describe('convertScalar', () => { + describe('valid cases', () => { + it.each(convertScalarValueValid)('%s', (input, output) => { + expect(convertScalarValue(...input)).toEqual(output); + }); + }); + describe('convertScalar bigint', () => { + it.each(convertScalarValueValid)('%s', () => { + expect( + convertScalarValue(100, 'int', { + number: FMT_NUMBER.BIGINT, + bytes: FMT_BYTES.UINT8ARRAY, + }), + ).toBe(BigInt(100)); + }); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/hash.test.ts b/packages/web3-utils/test/unit/hash.test.ts new file mode 100644 index 00000000000..d381e3c4240 --- /dev/null +++ b/packages/web3-utils/test/unit/hash.test.ts @@ -0,0 +1,152 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { keccak256 } from 'js-sha3'; +import { + sha3, + sha3Raw, + soliditySha3, + soliditySha3Raw, + encodePacked, + keccak256 as web3keccak256, +} from '../../src/hash'; +import { + sha3Data, + sha3ValidData, + soliditySha3RawValidData, + sha3RawValidData, + soliditySha3ValidData, + soliditySha3InvalidData, + compareSha3JSValidData, + compareSha3JSRawValidData, + encodePackData, + encodePackedInvalidData, + keccak256ValidData, + soliditySha3BigIntValidData, +} from '../fixtures/hash'; + +describe('hash', () => { + describe('sha3', () => { + describe('valid cases', () => { + it.each(sha3ValidData)('%s', (input, output) => { + expect(sha3(input)).toEqual(output); + }); + }); + + describe('compare with js-sha3 normal cases', () => { + it.each(sha3Data)('%s', input => { + expect(sha3(input)).toBe(`0x${keccak256(input)}`); + }); + }); + + describe('compare with js-sha3 uint8array cases', () => { + it.each(compareSha3JSValidData)('%s', (input, output) => { + expect(sha3(input)).toBe(`0x${keccak256(output)}`); + }); + }); + }); + + describe('sha3Raw', () => { + describe('valid cases', () => { + it.each(sha3RawValidData)('%s', (input, output) => { + expect(sha3Raw(input)).toEqual(output); + }); + }); + describe('comparing with js-sha3 cases', () => { + it.each(compareSha3JSRawValidData)('%s', (input, output) => { + expect(sha3Raw(input)).toBe(`0x${keccak256(output)}`); + }); + }); + }); + + describe('soliditySha3', () => { + describe('valid cases', () => { + it.each(soliditySha3ValidData)('%s', (input, output) => { + expect(soliditySha3(...input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(soliditySha3InvalidData)('%s', (input, output) => { + expect(() => soliditySha3(input)).toThrow(output); + }); + }); + }); + + describe('soliditySha3Raw', () => { + describe('valid cases', () => { + it.each(soliditySha3RawValidData)('%s', (input, output) => { + expect(soliditySha3Raw(...input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(soliditySha3InvalidData)('%s', (input, output) => { + expect(() => soliditySha3Raw(input)).toThrow(output); + }); + }); + }); + + describe('encodePacked', () => { + describe('valid cases', () => { + it.each(encodePackData)('%s', (input, output) => { + expect(encodePacked(...input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(encodePackedInvalidData)('%s', (input, output) => { + expect(() => encodePacked(input)).toThrow(output); + }); + }); + }); + describe('keccak256', () => { + describe('valid cases', () => { + it.each(keccak256ValidData)('%s', (input, output) => { + expect(web3keccak256(input)).toEqual(output); + }); + }); + }); + + describe('extra types supporting', () => { + it('object', () => { + const res = soliditySha3({ + historicBlock: { + hash: '0xcba0b90a5e65512202091c12a2e3b328f374715b9f1c8f32cb4600c726fe2aa6', + height: 1, + }, + networkId: 5777, + }); + expect(res).toBe('0x00203462b63e3a8ca15da715e490c676b0e370f47823e31383fe43c25da3b78d'); + }); + it('object in string', () => { + const res = soliditySha3( + '{"contents":"pragma solidity >=0.4.21 <0.6.0;\\n\\ncontract Migrations {\\n address public owner;\\n uint public last_completed_migration;\\n\\n constructor() public {\\n owner = msg.sender;\\n }\\n\\n modifier restricted() {\\n if (msg.sender == owner) _;\\n }\\n\\n function setCompleted(uint completed) public restricted {\\n last_completed_migration = completed;\\n }\\n\\n function upgrade(address new_address) public restricted {\\n Migrations upgraded = Migrations(new_address);\\n upgraded.setCompleted(last_completed_migration);\\n }\\n}\\n","sourcePath":"/Users/gnidan/src/work/reproduce/2019/01/21/artifacts/contracts/Migrations.sol"}', + ); + expect(res).toBe('0xdb092e2751b8dcb7c8509baade3c0ac290414a71685823c3cbeb28667970b0bd'); + }); + it('another object in string', () => { + const res = soliditySha3( + '{"bytes":"608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610314806100606000396000f3fe608060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100b85780638da5cb5b146100e3578063fdacd5761461013a575b600080fd5b34801561007357600080fd5b506100b66004803603602081101561008a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610175565b005b3480156100c457600080fd5b506100cd61025d565b6040518082815260200191505060405180910390f35b3480156100ef57600080fd5b506100f8610263565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561014657600080fd5b506101736004803603602081101561015d57600080fd5b8101908080359060200190929190505050610288565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025a5760008190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561024057600080fd5b505af1158015610254573d6000803e3d6000fd5b50505050505b50565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102e557806001819055505b5056fea165627a7a7230582013359aba5684f88626fb6a58a003236e309ef1462172af4afb4afb9bd2532b510029","linkReferences":[]}', + ); + expect(res).toBe('0x46e99868594ceb46b7cd37e4b33d635f12a7751671f8c51dd8218fa0dcf82901'); + }); + + describe('BigInt soliditySha3', () => { + it.each(soliditySha3BigIntValidData)('%s', (input, output) => { + expect(soliditySha3(...input)).toEqual(output); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/hash_dom.test.ts b/packages/web3-utils/test/unit/hash_dom.test.ts new file mode 100644 index 00000000000..1e4dd67cf0c --- /dev/null +++ b/packages/web3-utils/test/unit/hash_dom.test.ts @@ -0,0 +1,166 @@ +/** + * @jest-environment jsdom + */ + +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// this file contains the unit test for the event emitter in the DOM environment +// it is executed in the jsdom environment (see "@jest-environment jsdom" in the top comment of this file) + +// ignore the following rule to allow keeping `@jest-environment jsdom` on top: +// eslint-disable-next-line header/header +import { TextEncoder } from 'util'; +// polyfill for jsdom +global.TextEncoder = TextEncoder; + +/* eslint-disable import/first */ +import { keccak256 } from 'js-sha3'; +import { + sha3, + sha3Raw, + soliditySha3, + soliditySha3Raw, + encodePacked, + keccak256 as web3keccak256, +} from '../../src/hash'; +import { + sha3Data, + sha3ValidData, + soliditySha3RawValidData, + sha3RawValidData, + soliditySha3ValidData, + soliditySha3InvalidData, + compareSha3JSValidData, + compareSha3JSRawValidData, + encodePackData, + encodePackedInvalidData, + keccak256ValidData, + soliditySha3BigIntValidData, +} from '../fixtures/hash'; + +describe('hash', () => { + describe('sha3', () => { + describe('valid cases', () => { + it.each(sha3ValidData)('%s', (input, output) => { + expect(sha3(input)).toEqual(output); + }); + }); + + describe('compare with js-sha3 normal cases', () => { + it.each(sha3Data)('%s', input => { + expect(sha3(input)).toBe(`0x${keccak256(input)}`); + }); + }); + + describe('compare with js-sha3 uint8array cases', () => { + it.each(compareSha3JSValidData)('%s', (input, output) => { + expect(sha3(input)).toBe(`0x${keccak256(output)}`); + }); + }); + }); + + describe('sha3Raw', () => { + describe('valid cases', () => { + it.each(sha3RawValidData)('%s', (input, output) => { + expect(sha3Raw(input)).toEqual(output); + }); + }); + describe('comparing with js-sha3 cases', () => { + it.each(compareSha3JSRawValidData)('%s', (input, output) => { + expect(sha3Raw(input)).toBe(`0x${keccak256(output)}`); + }); + }); + }); + + describe('soliditySha3', () => { + describe('valid cases', () => { + it.each(soliditySha3ValidData)('%s', (input, output) => { + expect(soliditySha3(...input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(soliditySha3InvalidData)('%s', (input, output) => { + expect(() => soliditySha3(input)).toThrow(output); + }); + }); + }); + + describe('soliditySha3Raw', () => { + describe('valid cases', () => { + it.each(soliditySha3RawValidData)('%s', (input, output) => { + expect(soliditySha3Raw(...input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(soliditySha3InvalidData)('%s', (input, output) => { + expect(() => soliditySha3Raw(input)).toThrow(output); + }); + }); + }); + + describe('encodePacked', () => { + describe('valid cases', () => { + it.each(encodePackData)('%s', (input, output) => { + expect(encodePacked(...input)).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(encodePackedInvalidData)('%s', (input, output) => { + expect(() => encodePacked(input)).toThrow(output); + }); + }); + }); + describe('keccak256', () => { + describe('valid cases', () => { + it.each(keccak256ValidData)('%s', (input, output) => { + expect(web3keccak256(input)).toEqual(output); + }); + }); + }); + + describe('extra types supporting', () => { + it('object', () => { + const res = soliditySha3({ + historicBlock: { + hash: '0xcba0b90a5e65512202091c12a2e3b328f374715b9f1c8f32cb4600c726fe2aa6', + height: 1, + }, + networkId: 5777, + }); + expect(res).toBe('0x00203462b63e3a8ca15da715e490c676b0e370f47823e31383fe43c25da3b78d'); + }); + it('object in string', () => { + const res = soliditySha3( + '{"contents":"pragma solidity >=0.4.21 <0.6.0;\\n\\ncontract Migrations {\\n address public owner;\\n uint public last_completed_migration;\\n\\n constructor() public {\\n owner = msg.sender;\\n }\\n\\n modifier restricted() {\\n if (msg.sender == owner) _;\\n }\\n\\n function setCompleted(uint completed) public restricted {\\n last_completed_migration = completed;\\n }\\n\\n function upgrade(address new_address) public restricted {\\n Migrations upgraded = Migrations(new_address);\\n upgraded.setCompleted(last_completed_migration);\\n }\\n}\\n","sourcePath":"/Users/gnidan/src/work/reproduce/2019/01/21/artifacts/contracts/Migrations.sol"}', + ); + expect(res).toBe('0xdb092e2751b8dcb7c8509baade3c0ac290414a71685823c3cbeb28667970b0bd'); + }); + it('another object in string', () => { + const res = soliditySha3( + '{"bytes":"608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610314806100606000396000f3fe608060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100b85780638da5cb5b146100e3578063fdacd5761461013a575b600080fd5b34801561007357600080fd5b506100b66004803603602081101561008a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610175565b005b3480156100c457600080fd5b506100cd61025d565b6040518082815260200191505060405180910390f35b3480156100ef57600080fd5b506100f8610263565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561014657600080fd5b506101736004803603602081101561015d57600080fd5b8101908080359060200190929190505050610288565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025a5760008190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561024057600080fd5b505af1158015610254573d6000803e3d6000fd5b50505050505b50565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102e557806001819055505b5056fea165627a7a7230582013359aba5684f88626fb6a58a003236e309ef1462172af4afb4afb9bd2532b510029","linkReferences":[]}', + ); + expect(res).toBe('0x46e99868594ceb46b7cd37e4b33d635f12a7751671f8c51dd8218fa0dcf82901'); + }); + + describe('BigInt soliditySha3', () => { + it.each(soliditySha3BigIntValidData)('%s', (input, output) => { + expect(soliditySha3(...input)).toEqual(output); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/jest.config.js b/packages/web3-utils/test/unit/jest.config.js new file mode 100644 index 00000000000..fc28d37c499 --- /dev/null +++ b/packages/web3-utils/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-utils-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-utils/test/unit/json_rpc.test.ts b/packages/web3-utils/test/unit/json_rpc.test.ts new file mode 100644 index 00000000000..89261009916 --- /dev/null +++ b/packages/web3-utils/test/unit/json_rpc.test.ts @@ -0,0 +1,94 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + isResponseWithResult, + isResponseWithError, + isResponseWithNotification, + isSubscriptionResult, + isValidResponse, + isBatchResponse, + toPayload, +} from '../../src/json_rpc'; +import { + isResponseWithResultValidTest, + isResponseWithErrorValidTest, + isResponseWithNotificationValidTest, + isSubscriptionResultValidTest, + toPayloadValidTest, + isValidResponseValidTest, + isBatchResponseValidTest, +} from '../fixtures/json_rpc'; + +describe('json rpc tests', () => { + describe('isResponseWithResult', () => { + describe('valid cases', () => { + it.each(isResponseWithResultValidTest)('%s', (input, output) => { + const result = isResponseWithResult(input); + expect(result).toBe(output); + }); + }); + }); + describe('isResponseWithError', () => { + describe('valid cases', () => { + it.each(isResponseWithErrorValidTest)('should error', (input, output) => { + const result = isResponseWithError(input); + expect(result).toBe(output); + }); + }); + }); + describe('isResponseWithNotification', () => { + describe('valid cases', () => { + it.each(isResponseWithNotificationValidTest)('should have notify', (input, output) => { + const result = isResponseWithNotification(input); + expect(result).toBe(output); + }); + }); + }); + describe('isSubscriptionResult', () => { + describe('valid cases', () => { + it.each(isSubscriptionResultValidTest)('subscription valid test', (input, output) => { + const result = isSubscriptionResult(input); + expect(result).toBe(output); + }); + }); + }); + describe('isValidResponse', () => { + describe('valid cases', () => { + it.each(isValidResponseValidTest)('isValidresponse valid test', (input, output) => { + const result = isValidResponse(input); + expect(result).toBe(output); + }); + }); + }); + describe('isBatchResponseValid', () => { + describe('valid cases', () => { + it.each(isBatchResponseValidTest)('isValidresponse valid test', (input, output) => { + const result = isBatchResponse(input); + expect(result).toBe(output); + }); + }); + }); + describe('toPayloadValid', () => { + describe('valid cases', () => { + it.each(toPayloadValidTest)('isValidresponse valid test', (input, output) => { + const result = toPayload(input); + expect(result).toStrictEqual(output); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/objects.test.ts b/packages/web3-utils/test/unit/objects.test.ts new file mode 100644 index 00000000000..1201b3b7345 --- /dev/null +++ b/packages/web3-utils/test/unit/objects.test.ts @@ -0,0 +1,83 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { mergeDeep } from '../../src/objects'; +import { mergeDeepData } from '../fixtures/objects'; + +describe('objects', () => { + describe('mergeDeep', () => { + it.each(mergeDeepData)('$message', ({ destination, sources, output }) => { + expect(mergeDeep(destination, ...sources)).toEqual(output); + }); + + it('should not mutate the sources', () => { + const before = { a: undefined, b: true, c: new Uint8Array([1, 2, 3]) }; + const result = mergeDeep({}, before, { + a: 3, + d: 'string', + e: { nested: BigInt(4) }, + }) as any; + + expect(before.a).toBeUndefined(); + expect(result.b).toBe(true); + expect(result.c).toEqual(new Uint8Array([1, 2, 3])); + }); + + it('should not overwrite if undefined', () => { + const result = mergeDeep( + {}, + { a: undefined, b: true, c: new Uint8Array([1, 2, 3]), f: 99 }, + { a: 3, d: 'string', e: { nested: BigInt(4) }, f: undefined }, + ) as any; + + expect(result.a).toBe(3); + expect(result.b).toBe(true); + expect(result.c).toEqual(new Uint8Array([1, 2, 3])); + expect(result.d).toBe('string'); + expect(result.e).toEqual({ nested: BigInt(4) }); + expect(result.f).toBe(99); + }); + + it('should not merge array values', () => { + const result = mergeDeep({}, { a: [1, 2] }, { a: [3, 4], b: [4, 5] }) as any; + + expect(result.a).toStrictEqual([3, 4]); + expect(result.b).toStrictEqual([4, 5]); + }); + + it('should not merge typed array values', () => { + const result = mergeDeep( + {}, + { a: new Uint8Array([1, 2]) }, + { a: new Uint8Array([3, 4]), b: new Uint8Array([4, 5]) }, + ) as any; + + expect(result.a).toStrictEqual(new Uint8Array([3, 4])); + expect(result.b).toStrictEqual(new Uint8Array([4, 5])); + }); + + it('should duplicate array values', () => { + const data = { a: new Uint8Array([1, 2]) }; + const result = mergeDeep({}, data) as any; + + // Mutate source object + data.a[0] = 3; + + expect(result.a).toStrictEqual(new Uint8Array([1, 2])); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/promise_helpers.test.ts b/packages/web3-utils/test/unit/promise_helpers.test.ts new file mode 100644 index 00000000000..b18f4f1a5b0 --- /dev/null +++ b/packages/web3-utils/test/unit/promise_helpers.test.ts @@ -0,0 +1,204 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + waitWithTimeout, + rejectIfTimeout, + isPromise, + pollTillDefined, + rejectIfConditionAtInterval, + pollTillDefinedAndReturnIntervalId, +} from '../../src/promise_helpers'; + +describe('promise helpers', () => { + describe('isPromise', () => { + it('detect Promise objects', () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + expect(isPromise(new Promise(() => {}))).toBe(true); + }); + it('detect Promise functions', () => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + const func = () => {}; + // eslint-disable-next-line @typescript-eslint/no-empty-function + func.then = () => {}; + expect(isPromise(func)).toBe(true); + }); + }); + + describe('waitWithTimeout', () => { + it('resolve', async () => { + await waitWithTimeout( + new Promise(resolve => { + resolve('resolved'); + }), + 1000, + ).then(val => expect(val).toBe('resolved')); + }); + it('timeout', async () => { + const asyncHelper = async () => { + await new Promise(resolve => { + setTimeout(() => { + resolve('resolved'); + }, 200); + }); + }; + await expect(waitWithTimeout(asyncHelper, 100, new Error('time out'))).rejects.toThrow( + new Error('time out'), + ); + }); + }); + describe('rejectIfTimeout', () => { + it('%s', async () => { + const [timerId, promise] = rejectIfTimeout(100, new Error('value')); + // eslint-disable-next-line jest/no-conditional-expect + await promise.catch(value => expect(value).toEqual(new Error('value'))); + clearTimeout(timerId); + }); + }); + + describe('rejectIfTimeout throw', () => { + it('%s', async () => { + const dummyError = new Error('error'); + const asyncHelper = async () => { + await new Promise((_, reject) => { + reject(dummyError); + }); + }; + await expect(waitWithTimeout(asyncHelper, 100, new Error('time out'))).rejects.toThrow( + dummyError, + ); + }); + }); + + describe('pollTillDefined', () => { + it('returns when immediately resolved', async () => { + const asyncHelper = async () => + new Promise(resolve => { + resolve('resolved'); + }); + await expect(pollTillDefined(asyncHelper, 100)).resolves.toBe('resolved'); + }); + it('returns if later resolved', async () => { + let counter = 0; + const asyncHelper = async () => { + if (counter === 0) { + counter += 1; + return undefined; + } + return new Promise(resolve => { + resolve('resolved'); + }); + }; + + await expect(pollTillDefined(asyncHelper, 100)).resolves.toBe('resolved'); + }); + it('throws if later throws', async () => { + const dummyError = new Error('error'); + let counter = 0; + const asyncHelper = async () => { + if (counter === 0) { + counter += 1; + return undefined; + } + return new Promise((_, reject) => { + reject(dummyError); + }); + }; + await expect(pollTillDefined(asyncHelper, 100)).rejects.toThrow(dummyError); + }); + }); + + describe('pollTillDefinedAndReturnIntervalId', () => { + it('returns when immediately resolved', async () => { + const asyncHelper = async () => + new Promise(resolve => { + resolve('resolved'); + }); + const [promise] = pollTillDefinedAndReturnIntervalId(asyncHelper, 100); + await expect(promise).resolves.toBe('resolved'); + }); + it('returns if later resolved', async () => { + let counter = 0; + const asyncHelper = async () => { + if (counter === 0) { + counter += 1; + return undefined; + } + return new Promise(resolve => { + resolve('resolved'); + }); + }; + const [promise] = pollTillDefinedAndReturnIntervalId(asyncHelper, 100); + await expect(promise).resolves.toBe('resolved'); + }); + + it('should return interval id if not resolved in specific time', async () => { + + let counter = 0; + const asyncHelper = async () => { + if (counter <= 3000000) { + counter += 1; + return undefined; + } + return "result"; + }; + + const testError = new Error('Test P2 Error'); + + const [neverResolvePromise, intervalId] = pollTillDefinedAndReturnIntervalId(asyncHelper, 100); + const promiCheck = Promise.race([neverResolvePromise, rejectIfTimeout(500,testError)[1]]); + + await expect(promiCheck).rejects.toThrow(testError); + expect(intervalId).toBeDefined(); + clearInterval(intervalId); + }); + + it('throws if later throws', async () => { + const dummyError = new Error('error'); + let counter = 0; + const asyncHelper = async () => { + if (counter === 0) { + counter += 1; + return undefined; + } + return new Promise((_, reject) => { + reject(dummyError); + }); + }; + const [promise] = pollTillDefinedAndReturnIntervalId(asyncHelper, 100); + await expect(promise).rejects.toThrow(dummyError); + }); + }); + + describe('rejectIfConditionAtInterval', () => { + it('reject if later throws', async () => { + const dummyError = new Error('error'); + let counter = 0; + const asyncHelper = async () => { + if (counter === 0) { + counter += 1; + return undefined; + } + return dummyError; + }; + const [intervalId, promiseToError] = rejectIfConditionAtInterval(asyncHelper, 100); + await expect(promiseToError).rejects.toThrow(dummyError); + + clearInterval(intervalId); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/random.test.ts b/packages/web3-utils/test/unit/random.test.ts new file mode 100644 index 00000000000..803c423c6bb --- /dev/null +++ b/packages/web3-utils/test/unit/random.test.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isHexStrict } from '../../src/validation'; +import { randomHex } from '../../src/random'; +import { randomHexData } from '../fixtures/random'; + +describe('random library tests', () => { + describe('randomHex', () => { + describe('valid cases', () => { + it.each(randomHexData)('%s', input => { + const hexResult = randomHex(input); + // eslint-disable-next-line deprecation/deprecation + expect(isHexStrict(hexResult)).toBe(true); + expect(hexResult.length === input * 2 + 2).toBe(true); // bytes + 2 because of hex prefix '0x' + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/socket_provider.test.ts b/packages/web3-utils/test/unit/socket_provider.test.ts new file mode 100644 index 00000000000..a09f1467ce0 --- /dev/null +++ b/packages/web3-utils/test/unit/socket_provider.test.ts @@ -0,0 +1,342 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3APIPayload, EthExecutionAPI, JsonRpcResponse, Web3ProviderStatus } from 'web3-types'; +import { EventEmitter } from '../../src/event_emitter'; +// eslint-disable-next-line import/no-relative-packages +import { sleep } from '../../../../fixtures/utils'; +import { SocketProvider } from '../../src/socket_provider'; + +const dummySocketConnection = { dummy: 'dummy' }; + +class TestProvider extends SocketProvider { + protected _socketConnection?: typeof dummySocketConnection; + + protected _openSocketConnection() { + this._socketConnection = dummySocketConnection; + } + + // Dummy implementation of the abstract base methods + // eslint-disable-next-line + protected _addSocketListeners(): void {} + // eslint-disable-next-line + protected _removeSocketListeners(): void {} + // eslint-disable-next-line + protected _onCloseEvent(_event: any): void {} + // eslint-disable-next-line + protected _sendToSocket(_payload: Web3APIPayload): void {} + // eslint-disable-next-line + protected _parseResponses(_event: any): JsonRpcResponse[] { + return [] as JsonRpcResponse[]; + } + public message(_event: any): void { + this._onMessage(_event); + } + + // eslint-disable-next-line + protected _closeSocketConnection( + _code?: number | undefined, + _data?: string | undefined, + // eslint-disable-next-line + ): void {} + // eslint-disable-next-line + getStatus(): Web3ProviderStatus { + return this._connectionStatus; + } + // eslint-disable-next-line + setStatus(status: Web3ProviderStatus) { + this._connectionStatus = status; + } +} + +describe('SocketProvider', () => { + const socketPath = `some_path`; + const socketOption = { dummyOption: true } as const; + + describe('socket_provider unit tests', () => { + describe('constructor', () => { + it('should construct the instance of the provider', () => { + const provider = new TestProvider(socketPath, socketOption); + expect(provider).toBeInstanceOf(SocketProvider); + expect(provider.SocketConnection).toEqual(dummySocketConnection); + }); + }); + describe('testing _reconnect() method', () => { + it('should not be called when { autoReconnect: false }', () => { + const reconnectOptions = { autoReconnect: false }; + const provider = new TestProvider(socketPath, socketOption, reconnectOptions); + // @ts-expect-error run protected method + jest.spyOn(provider, '_reconnect').mockReturnValue(''); + provider.message(''); + // @ts-expect-error run protected method + expect(provider._reconnect).not.toHaveBeenCalled(); + }); + it('should not call _reconnect with empty response when { autoReconnect: true }', () => { + const reconnectOptions = { autoReconnect: true }; + const provider = new TestProvider(socketPath, socketOption, reconnectOptions); + // @ts-expect-error run protected method + jest.spyOn(provider, '_reconnect').mockReturnValue(''); + provider.message(''); + // @ts-expect-error run protected method + expect(provider._reconnect).not.toHaveBeenCalled(); + }); + }); + + describe('testing connect() method', () => { + it('should call method reconnect in case of error at _openSocketConnection', async () => { + const provider = new TestProvider(socketPath, socketOption); + // @ts-expect-error run protected method + jest.spyOn(provider, '_openSocketConnection').mockImplementation(() => { + throw new Error(); + }); + // @ts-expect-error run protected method + jest.spyOn(provider, '_reconnect').mockReturnValue(''); + // @ts-expect-error run protected method + provider.isReconnecting = true; + provider.connect(); + + await sleep(100); + + // @ts-expect-error run protected method + expect(provider._reconnect).toHaveBeenCalled(); + }); + it('should call method reconnect in case of error at _addSocketListeners', async () => { + const provider = new TestProvider(socketPath, socketOption); + // @ts-expect-error run protected method + jest.spyOn(provider, '_addSocketListeners').mockImplementation(() => { + throw new Error(); + }); + // @ts-expect-error run protected method + jest.spyOn(provider, '_reconnect').mockReturnValue(''); + // @ts-expect-error run protected method + provider.isReconnecting = true; + provider.connect(); + + await sleep(100); + + // @ts-expect-error run protected method + expect(provider._reconnect).toHaveBeenCalled(); + }); + it('should throw "Error while connecting..." in case of error inside `connect()`', () => { + const dummyError = new Error('error'); + const provider = new TestProvider(socketPath, socketOption); + // @ts-expect-error run protected method + jest.spyOn(provider, '_addSocketListeners').mockImplementation(() => { + throw dummyError; + }); + expect(() => provider.connect()).toThrow( + `Error while connecting to ${socketPath}. Reason: ${dummyError.message}`, + ); + }); + it('should throw "Client URL ... is invalid" in case of error with no message inside `connect()`', () => { + const provider = new TestProvider(socketPath, socketOption); + // @ts-expect-error run protected method + jest.spyOn(provider, '_addSocketListeners').mockImplementation(() => { + throw new Error(); + }); + expect(() => provider.connect()).toThrow(`Client URL "${socketPath}" is invalid.`); + }); + }); + + describe('testing supportsSubscriptions() function', () => { + it('should returns false when calling `supportsSubscriptions()`', () => { + const provider = new TestProvider(socketPath, socketOption); + expect(provider.supportsSubscriptions()).toBe(true); + }); + }); + + describe('testing on() method', () => { + it('should internally call `_eventEmitter.on`', () => { + const provider = new TestProvider(socketPath, socketOption); + + // @ts-expect-error run protected method + const funcBSpy = jest.spyOn(provider._eventEmitter, 'on').mockReturnValue(); + const event = 'message'; + const func = () => { + // ... + }; + provider.on(event, func); + expect(funcBSpy).toHaveBeenCalledWith(event, func); + }); + }); + + describe('testing once() method', () => { + it('should internally call `_eventEmitter.once`', () => { + const provider = new TestProvider(socketPath, socketOption); + + // @ts-expect-error run protected method + const funcBSpy = jest.spyOn(provider._eventEmitter, 'once').mockReturnValue(); + const event = 'message'; + const func = () => { + // ... + }; + provider.once(event, func); + expect(funcBSpy).toHaveBeenCalledWith(event, func); + }); + }); + + describe('testing removeListener() method', () => { + it('should internally call `_eventEmitter.removeListener`', () => { + const provider = new TestProvider(socketPath, socketOption); + + const funcBSpy = jest + // @ts-expect-error run protected method + .spyOn(provider._eventEmitter, 'removeListener') + .mockReturnValue(new EventEmitter()); + const event = 'message'; + const func = () => { + // ... + }; + provider.removeListener(event, func); + expect(funcBSpy).toHaveBeenCalledWith(event, func); + }); + }); + + describe('testing disconnect() method', () => { + it('should internally call `super._onDisconnect` and change the connectionStatus to `disconnected`', () => { + const provider = new TestProvider(socketPath, socketOption); + + const funcBSpy = jest + // spy on provider.super._onDisconnect + .spyOn( + Object.getPrototypeOf( + Object.getPrototypeOf(Object.getPrototypeOf(provider)), + ), + '_onDisconnect', + ) + .mockReturnValue(new EventEmitter()); + const code = 0; + const data = '0x0'; + provider.disconnect(code, data); + // @ts-expect-error run protected method + expect(provider._connectionStatus).toBe('disconnected'); + expect(funcBSpy).toHaveBeenCalledWith(code, data); + }); + }); + + describe('testing reset() method', () => { + it('should set `_reconnectAttempts` to 0', () => { + const provider = new TestProvider(socketPath, socketOption); + provider.reset(); + // @ts-expect-error run protected method + expect(provider._reconnectAttempts).toBe(0); + }); + }); + + describe('testing request() method', () => { + it('should throw if the _socketConnection is null', async () => { + const provider = new TestProvider(socketPath, socketOption); + const payload = { method: 'some_rpc_method' }; + // @ts-expect-error run protected method + provider._socketConnection = undefined; + await expect(provider.request(payload)).rejects.toThrow('Connection is undefined'); + }); + it('should throw if the payload id was not provided', async () => { + const provider = new TestProvider(socketPath, socketOption); + const payload = { method: 'some_rpc_method' }; + await expect(provider.request(payload)).rejects.toThrow('Request Id not defined'); + }); + it('should throw if the payload id was provided twice', async () => { + const provider = new TestProvider(socketPath, socketOption); + const payload = { id: 1, method: 'some_rpc_method' }; + provider.setStatus('connected'); + const reqPromise = provider.request(payload); + expect(reqPromise).toBeInstanceOf(Promise); + await expect(provider.request(payload)).rejects.toThrow( + 'Request already sent with following id: 1', + ); + }); + + it('should call `connect` when the status is `disconnected`', () => { + const provider = new TestProvider(socketPath, socketOption); + const payload = { id: 1, method: 'some_rpc_method' }; + provider.setStatus('disconnected'); + jest.spyOn(provider, 'connect').mockReturnValue(); + // @ts-expect-error run protected method + jest.spyOn(provider, '_sendToSocket').mockReturnValue(); + provider + .request(payload) + .then(() => { + // the status of the provider is manipulate manually to be disconnected, + // for that, this request promise will never resolve + }) + .catch(() => { + // nothing + }); + expect(provider.connect).toHaveBeenCalled(); + }); + it('should add request to the `_pendingRequestsQueue` when the status is `connecting`', () => { + const provider = new TestProvider(socketPath, socketOption); + const payload = { id: 1, method: 'some_rpc_method' }; + provider.setStatus('connecting'); + const reqPromise = provider.request(payload); + expect(reqPromise).toBeInstanceOf(Promise); + // @ts-expect-error run protected method + expect(provider._pendingRequestsQueue.get(payload.id).payload).toBe(payload); + }); + + it('should add request to the `_sentRequestsQueue` when the status is `connected`', () => { + const provider = new TestProvider(socketPath, socketOption); + const payload = { id: 1, method: 'some_rpc_method' }; + provider.setStatus('connected'); + const reqPromise = provider.request(payload); + expect(reqPromise).toBeInstanceOf(Promise); + // @ts-expect-error run protected method + expect(provider._sentRequestsQueue.get(payload.id).payload).toBe(payload); + }); + }); + + describe('testing _clearQueues() method', () => { + it('should clear queues when called', () => { + const provider = new TestProvider(socketPath, socketOption); + const payload1 = { id: 1, method: 'some_rpc_method' }; + provider.setStatus('connecting'); + const req1 = provider.request(payload1); + // when the queues will be cleared the promise will reject + req1.catch(() => { + // nothing + }); + // @ts-expect-error run protected method + expect(provider._pendingRequestsQueue.size).toBe(1); + expect(provider.getPendingRequestQueueSize()).toBe(1); + const payload2 = { id: 2, method: 'some_rpc_method' }; + provider.setStatus('connected'); + const req2 = provider.request(payload2); + // when the queues will be cleared the promise will reject + req2.catch(() => { + // nothing + }); + + // @ts-expect-error run protected method + expect(provider._sentRequestsQueue.size).toBe(1); + expect(provider.getSentRequestsQueueSize()).toBe(1); + + provider.on('error', () => { + // nothing + }); + // @ts-expect-error run protected method + provider._clearQueues(); + // @ts-expect-error run protected method + expect(provider._pendingRequestsQueue.size).toBe(0); + expect(provider.getPendingRequestQueueSize()).toBe(0); + // @ts-expect-error run protected method + expect(provider._sentRequestsQueue.size).toBe(0); + expect(provider.getSentRequestsQueueSize()).toBe(0); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/string_manipulation.test.ts b/packages/web3-utils/test/unit/string_manipulation.test.ts new file mode 100644 index 00000000000..79e59119ce7 --- /dev/null +++ b/packages/web3-utils/test/unit/string_manipulation.test.ts @@ -0,0 +1,116 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + fromTwosComplement, + leftPad, + padLeft, + padRight, + rightPad, + toTwosComplement, +} from '../../src/string_manipulation'; + +import { + padLeftData, + padInvalidData, + padRightData, + toTwosComplementData, + toTwosComplementInvalidData, + fromTwosComplementData, + fromTwosComplementInvalidData, +} from '../fixtures/string_manipulation'; + +describe('string manipulation tests', () => { + describe('padLeft', () => { + describe('valid cases', () => { + it.each(padLeftData)('%s', (input, output) => { + expect(padLeft(input[0], input[1], input[2])).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(padInvalidData)('%s', (input, output) => { + expect(() => padLeft(input[0], input[1], input[2])).toThrow(output); + }); + }); + }); + + describe('padRight', () => { + describe('valid cases', () => { + it.each(padRightData)('%s', (input, output) => { + expect(padRight(input[0], input[1], input[2])).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(padInvalidData)('%s', (input, output) => { + expect(() => padRight(input[0], input[1], input[2])).toThrow(output); + }); + }); + }); + + describe('leftPad', () => { + describe('valid cases', () => { + it.each(padLeftData)('%s', (input, output) => { + expect(leftPad(input[0], input[1], input[2])).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(padInvalidData)('%s', (input, output) => { + expect(() => leftPad(input[0], input[1], input[2])).toThrow(output); + }); + }); + }); + + describe('rightPad', () => { + describe('valid cases', () => { + it.each(padRightData)('%s', (input, output) => { + expect(rightPad(input[0], input[1], input[2])).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(padInvalidData)('%s', (input, output) => { + expect(() => rightPad(input[0], input[1], input[2])).toThrow(output); + }); + }); + }); + + describe('toTwosComplement', () => { + describe('valid cases', () => { + it.each(toTwosComplementData)('%s', (input, output) => { + expect(toTwosComplement(input[0], input[1])).toEqual(output); + }); + }); + describe('invalid cases', () => { + it.each(toTwosComplementInvalidData)('%s', (input, output) => { + expect(() => toTwosComplement(input[0], input[1])).toThrow(output); + }); + }); + }); + + describe('fromTwosComplement', () => { + describe('valid cases', () => { + it.each(fromTwosComplementData)('%s', (input, output) => { + expect(fromTwosComplement(input[0], input[1])).toEqual(output); + }); + }); + + describe('invalid cases', () => { + it.each(fromTwosComplementInvalidData)('%s', (input, output) => { + expect(() => fromTwosComplement(input[0], input[1])).toThrow(output); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/uint8array.test.ts b/packages/web3-utils/test/unit/uint8array.test.ts new file mode 100644 index 00000000000..e03712f50a2 --- /dev/null +++ b/packages/web3-utils/test/unit/uint8array.test.ts @@ -0,0 +1,34 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { uint8ArrayConcat, uint8ArrayEquals } from '../../src/uint8array'; +import { uint8ArrayConcatData, uint8ArrayEqualsValidData } from '../fixtures/uint8array'; + +describe('uint8Array utils', () => { + describe('uint8ArrayConcat', () => { + it.each(uint8ArrayConcatData)('%s', (input, output) => { + expect(uint8ArrayConcat(...input)).toEqual(output); + }); + describe('uint8ArrayConcat', () => { + describe('cases', () => { + it.each(uint8ArrayEqualsValidData)('%s', (input, output) => { + expect(uint8ArrayEquals(input[0], input[1])).toEqual(output); + }); + }); + }); + }); +}); diff --git a/packages/web3-utils/test/unit/validation.test.ts b/packages/web3-utils/test/unit/validation.test.ts new file mode 100644 index 00000000000..9d087e3a2eb --- /dev/null +++ b/packages/web3-utils/test/unit/validation.test.ts @@ -0,0 +1,58 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable jest/no-conditional-expect */ + +import { InvalidBlockError } from 'web3-errors'; +import { compareBlockNumbers, isContractInitOptions } from '../../src/validation'; +import { + compareBlockNumbersInvalidData, + compareBlockNumbersValidData, + isContractInitValidData, + isContractInitInvalidData +} from '../fixtures/validation'; + +describe('validation', () => { + describe('compareBlockNumbers', () => { + it.each([...compareBlockNumbersValidData, ...compareBlockNumbersInvalidData])( + '%s', + (input, output) => { + if (output instanceof InvalidBlockError) { + expect(() => compareBlockNumbers(input[0], input[1])).toThrow(output); + } else { + expect(compareBlockNumbers(input[0], input[1])).toEqual(output); + } + }, + ); + }); + describe('isContractInit', () => { + describe('should return true', () => { + it.each([...isContractInitValidData])( + '%s', (input) => { + expect(isContractInitOptions(input)).toBe(true); + } + ) + }); + describe('should return false', () => { + it.each([...isContractInitInvalidData])( + '%s', (input) => { + expect(isContractInitOptions(input)).toBe(false); + } + ) + }); + }); +}); diff --git a/packages/web3-utils/test/unit/web3_deferred_promise.test.ts b/packages/web3-utils/test/unit/web3_deferred_promise.test.ts new file mode 100644 index 00000000000..b8180705969 --- /dev/null +++ b/packages/web3-utils/test/unit/web3_deferred_promise.test.ts @@ -0,0 +1,56 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3DeferredPromise } from '../../src/web3_deferred_promise'; + +describe('Web3DeferredPromise', () => { + describe('getState Web3DeferredPromise', () => { + it('%s', () => { + const promise = new Web3DeferredPromise(); + expect(promise.state).toBe('pending'); + }); + }); + describe('Web3DeferredPromise resolves promise', () => { + it('%s', () => { + const promise = new Web3DeferredPromise(); + promise.resolve('mockValue'); + expect(promise.state).toBe('fulfilled'); + }); + }); + describe('Web3DeferredPromise reject promise', () => { + it('%s', async () => { + const promise = new Web3DeferredPromise(); + promise.reject(new Error('fail')); + // eslint-disable-next-line jest/no-conditional-expect + await promise.catch(val => expect(val).toEqual(new Error('fail'))); + expect(promise.state).toBe('rejected'); + }); + }); + + describe('Web3DeferredPromise timeout', () => { + it('%s', async () => { + const promise = new Web3DeferredPromise({ + timeout: 100, + eagerStart: true, + timeoutMessage: 'DeferredPromise timed out', + }); + // eslint-disable-next-line jest/no-conditional-expect + await promise.catch(val => expect(val).toEqual(new Error('DeferredPromise timed out'))); + expect(promise.state).toBe('rejected'); + }); + }); +}); diff --git a/packages/web3-utils/tsconfig.cjs.json b/packages/web3-utils/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-utils/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-utils/tsconfig.esm.json b/packages/web3-utils/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-utils/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-utils/tsconfig.json b/packages/web3-utils/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3-utils/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3-utils/tsconfig.types.json b/packages/web3-utils/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-utils/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-utils/tsdoc.json b/packages/web3-utils/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-utils/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-utils/types/index.d.ts b/packages/web3-utils/types/index.d.ts deleted file mode 100644 index 59606095e47..00000000000 --- a/packages/web3-utils/types/index.d.ts +++ /dev/null @@ -1,241 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); - -export type Unit = - | 'noether' - | 'wei' - | 'kwei' - | 'Kwei' - | 'babbage' - | 'femtoether' - | 'mwei' - | 'Mwei' - | 'lovelace' - | 'picoether' - | 'gwei' - | 'Gwei' - | 'shannon' - | 'nanoether' - | 'nano' - | 'szabo' - | 'microether' - | 'micro' - | 'finney' - | 'milliether' - | 'milli' - | 'ether' - | 'kether' - | 'grand' - | 'mether' - | 'gether' - | 'tether'; - -export type Mixed = - | string - | number - | BN - | { - type: string; - value: string; - } - | { - t: string; - v: string | BN | number; - } - | boolean; - -export type Hex = string | number; - -// utils types -export function isBN(value: string | number): boolean; -export function isBigNumber(value: BN): boolean; -export function toBN(value: number | string): BN; -export function toTwosComplement(value: number | string | BN): string; -export function isAddress(address: string, chainId?: number): boolean; -export function isHex(hex: Hex): boolean; -export function isHexStrict(hex: Hex): boolean; -export function asciiToHex(string: string, length?: number): string; -export function hexToAscii(string: string): string; -export function toAscii(string: string): string; -export function bytesToHex(bytes: number[]): string; -export function numberToHex(value: number | string | BN): string; -export function checkAddressChecksum(address: string, chainId?: number): boolean; -export function fromAscii(string: string): string; -export function fromDecimal(value: string | number): string; -export function fromUtf8(string: string): string; -export function fromWei(value: string | BN, unit?: Unit): string; -export function hexToBytes(hex: Hex): number[]; -export function hexToNumber(hex: Hex): number; -export function hexToNumberString(hex: Hex): string; -export function hexToString(hex: Hex): string; -export function hexToUtf8(string: string): string; -export function keccak256(value: string | BN): string; -export function padLeft(value: string | number, characterAmount: number, sign?: string): string; -export function leftPad(string: string | number, characterAmount: number, sign?: string): string; -export function rightPad(string: string | number, characterAmount: number, sign?: string): string; -export function padRight(string: string | number, characterAmount: number, sign?: string): string; -export function sha3(value: string | BN): string | null; -export function sha3Raw(value: string | BN): string; -export function randomHex(bytesSize: number): string; -export function utf8ToHex(string: string): string; -export function stringToHex(string: string): string; -export function toChecksumAddress(address: string, chainId?: number): string; -export function toDecimal(hex: Hex): number; -export function toHex(value: number | string | BN): string; -export function toUtf8(string: string): string; -export function toWei(val: BN, unit?: Unit): BN; -export function toWei(val: string, unit?: Unit): string; -export function isBloom(bloom: string): boolean; -export function isInBloom(bloom: string, value: string | Uint8Array): boolean; -export function isUserEthereumAddressInBloom(bloom: string, ethereumAddress: string): boolean; -export function isContractAddressInBloom(bloom: string, contractAddress: string): boolean; -export function isTopicInBloom(bloom: string, topic: string): boolean; -export function isTopic(topic: string): boolean; -export function jsonInterfaceMethodToString(abiItem: AbiItem): string; -export function soliditySha3(...val: Mixed[]): string | null; -export function soliditySha3Raw(...val: Mixed[]): string; -export function encodePacked(...val: Mixed[]): string | null; -export function getUnitValue(unit: Unit): string; -export function unitMap(): Units; -export function testAddress(bloom: string, address: string): boolean; -export function testTopic(bloom: string, topic: string): boolean; -export function getSignatureParameters(signature: string): {r: string; s: string; v: number}; -export function stripHexPrefix(str: string): string; - -// interfaces -export interface Utils { - isBN(value: string | number): boolean; - isBigNumber(value: BN): boolean; - toBN(value: number | string): BN; - toTwosComplement(value: number | string | BN): string; - isAddress(address: string, chainId?: number): boolean; - isHex(hex: Hex): boolean; - isHexStrict(hex: Hex): boolean; - asciiToHex(string: string, length?: number): string; - hexToAscii(string: string): string; - toAscii(string: string): string; - bytesToHex(bytes: number[]): string; - numberToHex(value: number | string | BN): string; - checkAddressChecksum(address: string, chainId?: number): boolean; - fromAscii(string: string): string; - fromDecimal(value: string | number): string; - fromUtf8(string: string): string; - fromWei(value: string | BN, unit?: Unit): string; - hexToBytes(hex: Hex): number[]; - hexToNumber(hex: Hex): number; - hexToNumberString(hex: Hex): string; - hexToString(hex: Hex): string; - hexToUtf8(string: string): string; - keccak256(value: string | BN): string; - padLeft(value: string | number, characterAmount: number, sign?: string): string; - leftPad(string: string | number, characterAmount: number, sign?: string): string; - rightPad(string: string | number, characterAmount: number, sign?: string): string; - padRight(string: string | number, characterAmount: number, sign?: string): string; - sha3(value: string | BN): string | null; - randomHex(bytesSize: number): string; - utf8ToHex(string: string): string; - stringToHex(string: string): string; - toChecksumAddress(address: string, chainId?: number): string; - toDecimal(hex: Hex): number; - toHex(value: number | string | BN): string; - toUtf8(string: string): string; - toWei(val: BN, unit?: Unit): BN; - toWei(val: string, unit?: Unit): string; - isBloom(bloom: string): boolean; - isInBloom(bloom: string, value: string | Uint8Array): boolean; - isUserEthereumAddressInBloom(bloom: string, ethereumAddress: string): boolean; - isContractAddressInBloom(bloom: string, contractAddress: string): boolean; - isTopicInBloom(bloom: string, topic: string): boolean; - isTopic(topic: string): boolean; - jsonInterfaceMethodToString(abiItem: AbiItem): string; - soliditySha3(...val: Mixed[]): string | null; - soliditySha3Raw(...val: Mixed[]): string; - encodePacked(...val: Mixed[]): string | null; - getUnitValue(unit: Unit): string; - unitMap(): Units; - testAddress(bloom: string, address: string): boolean; - testTopic(bloom: string, topic: string): boolean; - getSignatureParameters(signature: string): {r: string; s: string; v: number}; - stripHexPrefix(str: string): string; -} - -export interface Units { - noether: string; - wei: string; - kwei: string; - Kwei: string; - babbage: string; - femtoether: string; - mwei: string; - Mwei: string; - lovelace: string; - picoether: string; - gwei: string; - Gwei: string; - shannon: string; - nanoether: string; - nano: string; - szabo: string; - microether: string; - micro: string; - finney: string; - milliether: string; - milli: string; - ether: string; - kether: string; - grand: string; - mether: string; - gether: string; - tether: string; -} - -export type AbiType = 'function' | 'constructor' | 'event' | 'fallback'; -export type StateMutabilityType = 'pure' | 'view' | 'nonpayable' | 'payable'; - -export interface AbiItem { - anonymous?: boolean; - constant?: boolean; - inputs?: AbiInput[]; - name?: string; - outputs?: AbiOutput[]; - payable?: boolean; - stateMutability?: StateMutabilityType; - type: AbiType; - gas?: number; -} - -export interface AbiInput { - name: string; - type: string; - indexed?: boolean; - components?: AbiInput[]; - internalType?: string; -} - -export interface AbiOutput { - name: string; - type: string; - components?: AbiOutput[]; - internalType?: string; -} diff --git a/packages/web3-utils/types/tests/ascii-to-hex-test.ts b/packages/web3-utils/types/tests/ascii-to-hex-test.ts deleted file mode 100644 index 0f2f750ce85..00000000000 --- a/packages/web3-utils/types/tests/ascii-to-hex-test.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file ascii-to-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {asciiToHex} from 'web3-utils'; - -// $ExpectType string -asciiToHex('I have 100!'); - -// $ExpectType string -asciiToHex('I have 100!', 32); - -// $ExpectError -asciiToHex(345); -// $ExpectError -asciiToHex(new BN(3)); -// $ExpectError -asciiToHex({}); -// $ExpectError -asciiToHex(true); -// $ExpectError -asciiToHex(['string']); -// $ExpectError -asciiToHex([4]); -// $ExpectError -asciiToHex(null); -// $ExpectError -asciiToHex(undefined); diff --git a/packages/web3-utils/types/tests/bytes-to-hex-test.ts b/packages/web3-utils/types/tests/bytes-to-hex-test.ts deleted file mode 100644 index af7253c352f..00000000000 --- a/packages/web3-utils/types/tests/bytes-to-hex-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file bytes-to-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {bytesToHex} from 'web3-utils'; - -// $ExpectType string -bytesToHex([72]); - -// $ExpectError -bytesToHex(['string']); -// $ExpectError -bytesToHex(345); -// $ExpectError -bytesToHex(new BN(3)); -// $ExpectError -bytesToHex({}); -// $ExpectError -bytesToHex(true); -// $ExpectError -bytesToHex(['string']); -// $ExpectError -bytesToHex(null); -// $ExpectError -bytesToHex(undefined); diff --git a/packages/web3-utils/types/tests/check-address-checksum-test.ts b/packages/web3-utils/types/tests/check-address-checksum-test.ts deleted file mode 100644 index 0ed905dc55b..00000000000 --- a/packages/web3-utils/types/tests/check-address-checksum-test.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file check-address-checksum-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {checkAddressChecksum} from 'web3-utils'; - -// $ExpectType boolean -checkAddressChecksum('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectType boolean -checkAddressChecksum('0xFb6916095CA1dF60bb79CE92ce3Ea74C37c5D359', 31); -// $ExpectType boolean -checkAddressChecksum('0xFb6916095CA1dF60bb79CE92ce3Ea74C37c5D359', undefined); - -// $ExpectError -checkAddressChecksum([4]); -// $ExpectError -checkAddressChecksum(['string']); -// $ExpectError -checkAddressChecksum(345); -// $ExpectError -checkAddressChecksum(new BN(3)); -// $ExpectError -checkAddressChecksum({}); -// $ExpectError -checkAddressChecksum(true); -// $ExpectError -checkAddressChecksum(null); -// $ExpectError -checkAddressChecksum(undefined); -// $ExpectError -checkAddressChecksum('0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', 'string'); -// $ExpectError -checkAddressChecksum('0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', [4]); -// $ExpectError -checkAddressChecksum('0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', new BN(3)); -// $ExpectError -checkAddressChecksum('0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', {}); -// $ExpectError -checkAddressChecksum('0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', true); -// $ExpectError -checkAddressChecksum('0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', null); diff --git a/packages/web3-utils/types/tests/encode-packed.ts b/packages/web3-utils/types/tests/encode-packed.ts deleted file mode 100644 index acfa7e7e52e..00000000000 --- a/packages/web3-utils/types/tests/encode-packed.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file solidity-sha3-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {encodePacked} from 'web3-utils'; - -// $ExpectType string | null -encodePacked('234564535', '0xfff23243', true, -10); -// $ExpectType string | null -encodePacked('Hello!%'); -// $ExpectType string | null -encodePacked('234'); -// $ExpectType string | null -encodePacked(0xea); -// $ExpectType string | null -encodePacked(new BN(3)); -// $ExpectType string | null -encodePacked({type: 'uint256', value: '234'}); -// $ExpectType string | null -encodePacked({t: 'uint', v: new BN('234')}); -// $ExpectType string | null -encodePacked({t: 'string', v: 'Hello!%'}, {t: 'int8', v: -23}, {t: 'address', v: '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'}); -// $ExpectType string | null -encodePacked('0x407D73d8a49eeb85D32Cf465507dd71d507100c1'); - -// $ExpectError -encodePacked(['hey']); -// $ExpectError -encodePacked([34]); -// $ExpectError -encodePacked(null); -// $ExpectError -encodePacked(undefined); diff --git a/packages/web3-utils/types/tests/from-ascii-test.ts b/packages/web3-utils/types/tests/from-ascii-test.ts deleted file mode 100644 index 504c6ee2698..00000000000 --- a/packages/web3-utils/types/tests/from-ascii-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file from-ascii-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {fromAscii} from 'web3-utils'; - -// $ExpectType string -fromAscii('I have 100!'); - -// $ExpectError -fromAscii(345); -// $ExpectError -fromAscii(new BN(3)); -// $ExpectError -fromAscii({}); -// $ExpectError -fromAscii(true); -// $ExpectError -fromAscii(['string']); -// $ExpectError -fromAscii([4]); -// $ExpectError -fromAscii(null); -// $ExpectError -fromAscii(undefined); diff --git a/packages/web3-utils/types/tests/from-decimal-test.ts b/packages/web3-utils/types/tests/from-decimal-test.ts deleted file mode 100644 index 3870aa3e701..00000000000 --- a/packages/web3-utils/types/tests/from-decimal-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file from-decimal-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {fromDecimal} from 'web3-utils'; - -// $ExpectType string -fromDecimal('232'); -// $ExpectType string -fromDecimal(232); - -// $ExpectError -fromDecimal(new BN(3)); -// $ExpectError -fromDecimal(['string']); -// $ExpectError -fromDecimal([4]); -// $ExpectError -fromDecimal({}); -// $ExpectError -fromDecimal(true); -// $ExpectError -fromDecimal(null); -// $ExpectError -fromDecimal(undefined); diff --git a/packages/web3-utils/types/tests/from-utf8-test.ts b/packages/web3-utils/types/tests/from-utf8-test.ts deleted file mode 100644 index 8ab06f87dd3..00000000000 --- a/packages/web3-utils/types/tests/from-utf8-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file from-utf8-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {fromUtf8} from 'web3-utils'; - -// $ExpectType string -fromUtf8('I have 100£'); - -// $ExpectError -fromUtf8(232); -// $ExpectError -fromUtf8(new BN(3)); -// $ExpectError -fromUtf8(['string']); -// $ExpectError -fromUtf8([4]); -// $ExpectError -fromUtf8({}); -// $ExpectError -fromUtf8(true); -// $ExpectError -fromUtf8(null); -// $ExpectError -fromUtf8(undefined); diff --git a/packages/web3-utils/types/tests/from-wei-test.ts b/packages/web3-utils/types/tests/from-wei-test.ts deleted file mode 100644 index 852616f6881..00000000000 --- a/packages/web3-utils/types/tests/from-wei-test.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file from-wei-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {fromWei} from 'web3-utils'; - -const bigNumber = new BN(3); - -// $ExpectType string -fromWei(bigNumber); -// $ExpectType string -fromWei('1'); -// $ExpectType string -fromWei(bigNumber, 'ether'); -// $ExpectType string -fromWei('1', 'ether'); - -// $ExpectError -fromWei(232); -// $ExpectError -fromWei(['string']); -// $ExpectError -fromWei([4]); -// $ExpectError -fromWei({}); -// $ExpectError -fromWei(true); -// $ExpectError -fromWei(null); -// $ExpectError -fromWei(undefined); -// $ExpectError -fromWei(new BN(3), 'blah'); diff --git a/packages/web3-utils/types/tests/get-signature-params-test.ts b/packages/web3-utils/types/tests/get-signature-params-test.ts deleted file mode 100644 index e1f442239c0..00000000000 --- a/packages/web3-utils/types/tests/get-signature-params-test.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file get-signature-params-tests.ts - * @author Aalok Singh - * @date 2018 - */ - -import BN = require('bn.js'); -import {getSignatureParameters} from 'web3-utils'; - -// $ExpectType { r: string; s: string; v: number; } -getSignatureParameters( - '0x90dc0e49b5a80eef86fcedcb863dcc727aeae5c11187c001fd3d18780ead2cc7701ba1986099a49164702f3d8b2c8dbbd45a6d1beb37d212d21fb1be4bb762a400' -); -// $ExpectError -getSignatureParameters(345); -// $ExpectError -getSignatureParameters(new BN(3)); -// $ExpectError -getSignatureParameters({}); -// $ExpectError -getSignatureParameters(true); -// $ExpectError -getSignatureParameters(['string']); -// $ExpectError -getSignatureParameters([4]); -// $ExpectError -getSignatureParameters(null); -// $ExpectError -getSignatureParameters(undefined); diff --git a/packages/web3-utils/types/tests/get-unit-value-test.ts b/packages/web3-utils/types/tests/get-unit-value-test.ts deleted file mode 100644 index 27ffc9ac857..00000000000 --- a/packages/web3-utils/types/tests/get-unit-value-test.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file get-unit-value-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {getUnitValue} from 'web3-utils'; - -// $ExpectType string -getUnitValue('ether'); - -// $ExpectError -getUnitValue('fake'); -// $ExpectError -getUnitValue(656); -// $ExpectError -getUnitValue(new BN(3)); -// $ExpectError -getUnitValue(['string']); -// $ExpectError -getUnitValue([4]); -// $ExpectError -getUnitValue({}); -// $ExpectError -getUnitValue(true); -// $ExpectError -getUnitValue(null); -// $ExpectError -getUnitValue(undefined); diff --git a/packages/web3-utils/types/tests/hex-to-ascii-test.ts b/packages/web3-utils/types/tests/hex-to-ascii-test.ts deleted file mode 100644 index 991e44ca461..00000000000 --- a/packages/web3-utils/types/tests/hex-to-ascii-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file hex-to-ascii-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {hexToAscii} from 'web3-utils'; - -// $ExpectType string -hexToAscii('0x4920686176652031303021'); - -// $ExpectError -hexToAscii(345); -// $ExpectError -hexToAscii(new BN(3)); -// $ExpectError -hexToAscii({}); -// $ExpectError -hexToAscii(true); -// $ExpectError -hexToAscii(['string']); -// $ExpectError -hexToAscii([4]); -// $ExpectError -hexToAscii(null); -// $ExpectError -hexToAscii(undefined); diff --git a/packages/web3-utils/types/tests/hex-to-bytes-test.ts b/packages/web3-utils/types/tests/hex-to-bytes-test.ts deleted file mode 100644 index 9a57e3559a8..00000000000 --- a/packages/web3-utils/types/tests/hex-to-bytes-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file hex-to-bytes-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {hexToBytes} from 'web3-utils'; - -// $ExpectType number[] -hexToBytes('0x000000ea'); -// $ExpectType number[] -hexToBytes(0x000000ea); - -// $ExpectError -hexToBytes([4]); -// $ExpectError -hexToBytes(['string']); -// $ExpectError -hexToBytes(new BN(3)); -// $ExpectError -hexToBytes({}); -// $ExpectError -hexToBytes(true); -// $ExpectError -hexToBytes(null); -// $ExpectError -hexToBytes(undefined); diff --git a/packages/web3-utils/types/tests/hex-to-number-string-test.ts b/packages/web3-utils/types/tests/hex-to-number-string-test.ts deleted file mode 100644 index 10d80d03912..00000000000 --- a/packages/web3-utils/types/tests/hex-to-number-string-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file hex-to-number-string-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {hexToNumberString} from 'web3-utils'; - -// $ExpectType string -hexToNumberString('0xea'); -// $ExpectType string -hexToNumberString(0xea); - -// $ExpectError -hexToNumberString(new BN(3); -// $ExpectError -hexToNumberString(['string']); -// $ExpectError -hexToNumberString([4]); -// $ExpectError -hexToNumberString({}); -// $ExpectError -hexToNumberString(true); -// $ExpectError -hexToNumberString(null); -// $ExpectError -hexToNumberString(undefined); diff --git a/packages/web3-utils/types/tests/hex-to-number-test.ts b/packages/web3-utils/types/tests/hex-to-number-test.ts deleted file mode 100644 index 597a65bfe5f..00000000000 --- a/packages/web3-utils/types/tests/hex-to-number-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file hex-to-number-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {hexToNumber} from 'web3-utils'; - -// $ExpectType number -hexToNumber('232'); -// $ExpectType number -hexToNumber(232); - -// $ExpectError -hexToNumber(new BN(3)); -// $ExpectError -hexToNumber(['string']); -// $ExpectError -hexToNumber([4]); -// $ExpectError -hexToNumber({}); -// $ExpectError -hexToNumber(true); -// $ExpectError -hexToNumber(null); -// $ExpectError -hexToNumber(undefined); diff --git a/packages/web3-utils/types/tests/hex-to-string-test.ts b/packages/web3-utils/types/tests/hex-to-string-test.ts deleted file mode 100644 index 000464e7968..00000000000 --- a/packages/web3-utils/types/tests/hex-to-string-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file hex-to-string-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {hexToString} from 'web3-utils'; - -// $ExpectType string -hexToString('0x49206861766520313030e282ac'); -// $ExpectType string -hexToString(0x49206861766520313030e282ac); - -// $ExpectError -hexToString(new BN(3)); -// $ExpectError -hexToString(['string']); -// $ExpectError -hexToString([4]); -// $ExpectError -hexToString({}); -// $ExpectError -hexToString(true); -// $ExpectError -hexToString(null); -// $ExpectError -hexToString(undefined); diff --git a/packages/web3-utils/types/tests/hex-to-utf8-test.ts b/packages/web3-utils/types/tests/hex-to-utf8-test.ts deleted file mode 100644 index 021fe0fc6f1..00000000000 --- a/packages/web3-utils/types/tests/hex-to-utf8-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file hex-to-utf8-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {hexToUtf8} from 'web3-utils'; - -// $ExpectType string -hexToUtf8('0x49206861766520313030e282ac'); - -// $ExpectError -hexToUtf8(656); -// $ExpectError -hexToUtf8(new BN(3)); -// $ExpectError -hexToUtf8(['string']); -// $ExpectError -hexToUtf8([4]); -// $ExpectError -hexToUtf8({}); -// $ExpectError -hexToUtf8(true); -// $ExpectError -hexToUtf8(null); -// $ExpectError -hexToUtf8(undefined); diff --git a/packages/web3-utils/types/tests/is-address-test.ts b/packages/web3-utils/types/tests/is-address-test.ts deleted file mode 100644 index 6c2847c9cfc..00000000000 --- a/packages/web3-utils/types/tests/is-address-test.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-address-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {isAddress} from 'web3-utils'; - -// $ExpectType boolean -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectType boolean -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', 30); -// $ExpectType boolean -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', undefined); - -// $ExpectError -isAddress(4); -// $ExpectError -isAddress(new BN(3)); -// $ExpectError -isAddress({}); -// $ExpectError -isAddress(true); -// $ExpectError -isAddress(['string']); -// $ExpectError -isAddress([4]); -// $ExpectError -isAddress(null); -// $ExpectError -isAddress(undefined); -// $ExpectError -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', new BN(3)); -// $ExpectError -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', {}); -// $ExpectError -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', true); -// $ExpectError -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', ['string']); -// $ExpectError -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', [4]); -// $ExpectError -isAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', null); diff --git a/packages/web3-utils/types/tests/is-big-number-test.ts b/packages/web3-utils/types/tests/is-big-number-test.ts deleted file mode 100644 index 99968cf8ff2..00000000000 --- a/packages/web3-utils/types/tests/is-big-number-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-big-number-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {isBigNumber} from 'web3-utils'; - -// $ExpectType boolean -isBigNumber(new BN(3)); - -// $ExpectError -isBigNumber(7); -// $ExpectError -isBigNumber('4325'); -// $ExpectError -isBigNumber({}); -// $ExpectError -isBigNumber(true); -// $ExpectError -isBigNumber(['string']); -// $ExpectError -isBigNumber([4]); -// $ExpectError -isBigNumber(null); -// $ExpectError -isBigNumber(undefined); diff --git a/packages/web3-utils/types/tests/is-bloom-test.ts b/packages/web3-utils/types/tests/is-bloom-test.ts deleted file mode 100644 index 2caaddbf80d..00000000000 --- a/packages/web3-utils/types/tests/is-bloom-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-bloom-tests.ts - * @author Josh Stevens - * @date 2019 - */ - -import BN = require('bn.js'); -import { isBloom } from 'web3-utils'; - -// $ExpectType boolean -isBloom('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'); - -// $ExpectError -isBloom(656); -// $ExpectError -isBloom(new BN(3)); -// $ExpectError -isBloom(['string']); -// $ExpectError -isBloom([4]); -// $ExpectError -isBloom({}); -// $ExpectError -isBloom(true); -// $ExpectError -isBloom(null); -// $ExpectError -isBloom(undefined); diff --git a/packages/web3-utils/types/tests/is-bn-test.ts b/packages/web3-utils/types/tests/is-bn-test.ts deleted file mode 100644 index 1a4c9d1efe7..00000000000 --- a/packages/web3-utils/types/tests/is-bn-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-bn-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {isBN} from 'web3-utils'; - -// $ExpectType boolean -isBN(7); -// $ExpectType boolean -isBN('4325'); - -// $ExpectError -isBN({}); -// $ExpectError -isBN(true); -// $ExpectError -isBN(new BN(3)); -// $ExpectError -isBN(['string']); -// $ExpectError -isBN([4]); -// $ExpectError -isBN(null); -// $ExpectError -isBN(undefined); diff --git a/packages/web3-utils/types/tests/is-contract-address-in-bloom.ts b/packages/web3-utils/types/tests/is-contract-address-in-bloom.ts deleted file mode 100644 index 37c587880fe..00000000000 --- a/packages/web3-utils/types/tests/is-contract-address-in-bloom.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-contract-address-in-bloom.ts - * @author Josh Stevens - * @date 2019 - */ - -import { isContractAddressInBloom } from 'web3-utils'; - -// $ExpectType boolean -isContractAddressInBloom('0x08200081a06415012858022200cc48143008908c0000824e5405b41520795989024800380a8d4b198910b422b231086c3a62cc402e2573070306f180446440ad401016c3e30781115844d028c89028008a12240c0a2c184c0425b90d7af0530002f981221aa565809132000818c82805023a132a25150400010530ba0080420a10a137054454021882505080a6b6841082d84151010400ba8100c8802d440d060388084052c1300105a0868410648a40540c0f0460e190400807008914361118000a5202e94445ccc088311050052c8002807205212a090d90ba428030266024a910644b1042011aaae05391cc2094c45226400000380880241282ce4e12518c', '0x494bfa3a4576ba6cfe835b0deb78834f0c3e3994'); diff --git a/packages/web3-utils/types/tests/is-hex-strict-test.ts b/packages/web3-utils/types/tests/is-hex-strict-test.ts deleted file mode 100644 index 70c7c469f48..00000000000 --- a/packages/web3-utils/types/tests/is-hex-strict-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-hex-strict-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {isHexStrict} from 'web3-utils'; - -// $ExpectType boolean -isHexStrict('0xc1912'); -// $ExpectType boolean -isHexStrict(345); - -// $ExpectError -isHexStrict(new BN(3)); -// $ExpectError -isHexStrict({}); -// $ExpectError -isHexStrict(true); -// $ExpectError -isHexStrict(['string']); -// $ExpectError -isHexStrict([4]); -// $ExpectError -isHexStrict(null); -// $ExpectError -isHexStrict(undefined); diff --git a/packages/web3-utils/types/tests/is-hex-test.ts b/packages/web3-utils/types/tests/is-hex-test.ts deleted file mode 100644 index 64ffa687ce9..00000000000 --- a/packages/web3-utils/types/tests/is-hex-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {isHex} from 'web3-utils'; - -// $ExpectType boolean -isHex('0xc1912'); -// $ExpectType boolean -isHex(345); - -// $ExpectError -isHex(new BN(3)); -// $ExpectError -isHex({}); -// $ExpectError -isHex(true); -// $ExpectError -isHex(['string']); -// $ExpectError -isHex([4]); -// $ExpectError -isHex(null); -// $ExpectError -isHex(undefined); diff --git a/packages/web3-utils/types/tests/is-in-bloom.ts b/packages/web3-utils/types/tests/is-in-bloom.ts deleted file mode 100644 index e2ef4fab346..00000000000 --- a/packages/web3-utils/types/tests/is-in-bloom.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-in-bloom-tests.ts - * @author Josh Stevens - * @date 2019 - */ - -import { isInBloom } from 'web3-utils'; - -// $ExpectType boolean -isInBloom('0x08200081a06415012858022200cc48143008908c0000824e5405b41520795989024800380a8d4b198910b422b231086c3a62cc402e2573070306f180446440ad401016c3e30781115844d028c89028008a12240c0a2c184c0425b90d7af0530002f981221aa565809132000818c82805023a132a25150400010530ba0080420a10a137054454021882505080a6b6841082d84151010400ba8100c8802d440d060388084052c1300105a0868410648a40540c0f0460e190400807008914361118000a5202e94445ccc088311050052c8002807205212a090d90ba428030266024a910644b1042011aaae05391cc2094c45226400000380880241282ce4e12518c', '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'); diff --git a/packages/web3-utils/types/tests/is-topic-in-bloom.ts b/packages/web3-utils/types/tests/is-topic-in-bloom.ts deleted file mode 100644 index e49126bf80a..00000000000 --- a/packages/web3-utils/types/tests/is-topic-in-bloom.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-topic-in-bloom.ts - * @author Josh Stevens - * @date 2019 - */ - -import { isTopicInBloom } from 'web3-utils'; - -// $ExpectType boolean -isTopicInBloom('0x08200081a06415012858022200cc48143008908c0000824e5405b41520795989024800380a8d4b198910b422b231086c3a62cc402e2573070306f180446440ad401016c3e30781115844d028c89028008a12240c0a2c184c0425b90d7af0530002f981221aa565809132000818c82805023a132a25150400010530ba0080420a10a137054454021882505080a6b6841082d84151010400ba8100c8802d440d060388084052c1300105a0868410648a40540c0f0460e190400807008914361118000a5202e94445ccc088311050052c8002807205212a090d90ba428030266024a910644b1042011aaae05391cc2094c45226400000380880241282ce4e12518c', '0x4d61726b65745061792e696f206973206465706c6f79696e6720536d61727420'); diff --git a/packages/web3-utils/types/tests/is-topic-test.ts b/packages/web3-utils/types/tests/is-topic-test.ts deleted file mode 100644 index bb600827c60..00000000000 --- a/packages/web3-utils/types/tests/is-topic-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-topic-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {isTopic} from 'web3-utils'; - -// $ExpectType boolean -isTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'); - -// $ExpectError -isTopic(656); -// $ExpectError -isTopic(new BN(3)); -// $ExpectError -isTopic(['string']); -// $ExpectError -isTopic([4]); -// $ExpectError -isTopic({}); -// $ExpectError -isTopic(true); -// $ExpectError -isTopic(null); -// $ExpectError -isTopic(undefined); diff --git a/packages/web3-utils/types/tests/is-topic.ts b/packages/web3-utils/types/tests/is-topic.ts deleted file mode 100644 index 468cc655c23..00000000000 --- a/packages/web3-utils/types/tests/is-topic.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-user-ethereum-address-in-bloom.ts - * @author Josh Stevens - * @date 2019 - */ - -import { isTopic } from 'web3-utils'; - -// $ExpectType boolean -isTopic('0x000000000000000000000000b3bb037d2f2341a1c2775d51909a3d944597987d'); diff --git a/packages/web3-utils/types/tests/is-user-ethereum-address-in-bloom.ts b/packages/web3-utils/types/tests/is-user-ethereum-address-in-bloom.ts deleted file mode 100644 index 2fadb639680..00000000000 --- a/packages/web3-utils/types/tests/is-user-ethereum-address-in-bloom.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file is-user-ethereum-address-in-bloom.ts - * @author Josh Stevens - * @date 2019 - */ - -import { isUserEthereumAddressInBloom } from 'web3-utils'; - -// $ExpectType boolean -isUserEthereumAddressInBloom('0x08200081a06415012858022200cc48143008908c0000824e5405b41520795989024800380a8d4b198910b422b231086c3a62cc402e2573070306f180446440ad401016c3e30781115844d028c89028008a12240c0a2c184c0425b90d7af0530002f981221aa565809132000818c82805023a132a25150400010530ba0080420a10a137054454021882505080a6b6841082d84151010400ba8100c8802d440d060388084052c1300105a0868410648a40540c0f0460e190400807008914361118000a5202e94445ccc088311050052c8002807205212a090d90ba428030266024a910644b1042011aaae05391cc2094c45226400000380880241282ce4e12518c', '0x494bfa3a4576ba6cfe835b0deb78834f0c3e3994'); diff --git a/packages/web3-utils/types/tests/json-interface-method-to-string-test.ts b/packages/web3-utils/types/tests/json-interface-method-to-string-test.ts deleted file mode 100644 index 7db99e00a1b..00000000000 --- a/packages/web3-utils/types/tests/json-interface-method-to-string-test.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file json-interface-method-to-string-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import {jsonInterfaceMethodToString, AbiItem} from 'web3-utils'; - -const abiItem: AbiItem = { - anonymous: false, - constant: true, - inputs: [ - { - name: 'testMe', - type: 'uint256[3]' - }, - { - name: 'inputA', - type: 'tuple', - components: [ - { - name: 'a', - type: 'uint8' - }, - { - name: 'b', - type: 'uint8' - } - ] - }, - { - name: 'inputB', - type: 'tuple[]', - components: [ - { - name: 'a1', - type: 'uint256' - }, - { - name: 'a2', - type: 'uint256' - } - ] - }, - { - name: 'inputC', - type: 'uint8', - indexed: false - } - ], - name: "testName", - outputs: [ - { - name: "test", - type: "uint256" - }, - { - name: 'outputA', - type: 'tuple', - components: [ - { - name: 'a', - type: 'uint8' - }, - { - name: 'b', - type: 'uint8' - } - ] - }, - { - name: 'outputB', - type: 'tuple[]', - components: [ - { - name: 'a1', - type: 'uint256' - }, - { - name: 'a2', - type: 'uint256' - } - ] - } - ], - payable: false, - stateMutability: "pure", - type: "function", - gas: 175875 -}; -// $ExpectType string -jsonInterfaceMethodToString(abiItem); - -// $ExpectError -jsonInterfaceMethodToString(['string']); -// $ExpectError -jsonInterfaceMethodToString(234); -// $ExpectError -jsonInterfaceMethodToString([4]); -// $ExpectError -jsonInterfaceMethodToString(true); -// $ExpectError -jsonInterfaceMethodToString(null); -// $ExpectError -jsonInterfaceMethodToString(undefined); diff --git a/packages/web3-utils/types/tests/keccak256-test.ts b/packages/web3-utils/types/tests/keccak256-test.ts deleted file mode 100644 index 7f3f571e19a..00000000000 --- a/packages/web3-utils/types/tests/keccak256-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file keccak256-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {keccak256} from 'web3-utils'; - -// $ExpectType string -keccak256('234'); -// $ExpectType string -keccak256(new BN(3)); - -// $ExpectError -keccak256(['string']); -// $ExpectError -keccak256(234); -// $ExpectError -keccak256([4]); -// $ExpectError -keccak256({}); -// $ExpectError -keccak256(true); -// $ExpectError -keccak256(null); -// $ExpectError -keccak256(undefined); diff --git a/packages/web3-utils/types/tests/left-pad-test.ts b/packages/web3-utils/types/tests/left-pad-test.ts deleted file mode 100644 index 936f198ea4c..00000000000 --- a/packages/web3-utils/types/tests/left-pad-test.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file left-pad-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {leftPad} from 'web3-utils'; - -const bigNumber = new BN(3); -// $ExpectType string -leftPad('0x3456ff', 20); -// $ExpectType string -leftPad(0x3456ff, 20); -// $ExpectType string -leftPad('Hello', 20, 'x'); - -// $ExpectError -leftPad(bigNumber, 20); -// $ExpectError -leftPad(['string'], 20); -// $ExpectError -leftPad([4], 20); -// $ExpectError -leftPad({}, 20); -// $ExpectError -leftPad(true, 20); -// $ExpectError -leftPad(null, 20); -// $ExpectError -leftPad(undefined, 20); -// $ExpectError -leftPad('0x3456ff', bigNumber); -// $ExpectError -leftPad('0x3456ff', ['string']); -// $ExpectError -leftPad('0x3456ff', [4]); -// $ExpectError -leftPad('0x3456ff', {}); -// $ExpectError -leftPad('0x3456ff', true); -// $ExpectError -leftPad('0x3456ff', null); -// $ExpectError -leftPad('0x3456ff', undefined); -// $ExpectError -leftPad('Hello', 20, bigNumber); -// $ExpectError -leftPad('Hello', 20, ['string']); -// $ExpectError -leftPad('Hello', 20, [4]); -// $ExpectError -leftPad('Hello', 20, {}); -// $ExpectError -leftPad('Hello', 20, true); -// $ExpectError -leftPad('Hello', 20, null); diff --git a/packages/web3-utils/types/tests/number-to-hex-test.ts b/packages/web3-utils/types/tests/number-to-hex-test.ts deleted file mode 100644 index 102e22f7518..00000000000 --- a/packages/web3-utils/types/tests/number-to-hex-test.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file number-to-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {numberToHex} from 'web3-utils'; - -// $ExpectType string -numberToHex('232'); -// $ExpectType string -numberToHex(232); -// $ExpectType string -numberToHex(new BN(3)); - -// $ExpectError -numberToHex(['72']); -// $ExpectError -numberToHex([4]); -// $ExpectError -numberToHex([ 36 ]); -// $ExpectError -numberToHex({}); -// $ExpectError -numberToHex(true); -// $ExpectError -numberToHex(null); -// $ExpectError -numberToHex(undefined); diff --git a/packages/web3-utils/types/tests/pad-left-test.ts b/packages/web3-utils/types/tests/pad-left-test.ts deleted file mode 100644 index e763df68fdf..00000000000 --- a/packages/web3-utils/types/tests/pad-left-test.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file pad-left-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {padLeft} from 'web3-utils'; - -const bigNumber = new BN(3); - -// $ExpectType string -padLeft('0x3456ff', 20); -// $ExpectType string -padLeft(0x3456ff, 20); -// $ExpectType string -padLeft('Hello', 20, 'x'); - -// $ExpectError -padLeft(bigNumber, 20); -// $ExpectError -padLeft(['string'], 20); -// $ExpectError -padLeft([4], 20); -// $ExpectError -padLeft({}, 20); -// $ExpectError -padLeft(true, 20); -// $ExpectError -padLeft(null, 20); -// $ExpectError -padLeft(undefined, 20); -// $ExpectError -padLeft('0x3456ff', bigNumber); -// $ExpectError -padLeft('0x3456ff', ['string']); -// $ExpectError -padLeft('0x3456ff', [4]); -// $ExpectError -padLeft('0x3456ff', {}); -// $ExpectError -padLeft('0x3456ff', true); -// $ExpectError -padLeft('0x3456ff', null); -// $ExpectError -padLeft('0x3456ff', undefined); -// $ExpectError -padLeft('Hello', 20, bigNumber); -// $ExpectError -padLeft('Hello', 20, ['string']); -// $ExpectError -padLeft('Hello', 20, [4]); -// $ExpectError -padLeft('Hello', 20, {}); -// $ExpectError -padLeft('Hello', 20, true); -// $ExpectError -padLeft('Hello', 20, null); diff --git a/packages/web3-utils/types/tests/pad-right-test.ts b/packages/web3-utils/types/tests/pad-right-test.ts deleted file mode 100644 index 97202a820b3..00000000000 --- a/packages/web3-utils/types/tests/pad-right-test.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file pad-right-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {padRight} from 'web3-utils'; - -const bigNumber = new BN(3); - -// $ExpectType string -padRight('0x3456ff', 20); -// $ExpectType string -padRight(0x3456ff, 20); -// $ExpectType string -padRight('Hello', 20, 'x'); - -// $ExpectError -padRight(bigNumber, 20); -// $ExpectError -padRight(['string'], 20); -// $ExpectError -padRight([4], 20); -// $ExpectError -padRight({}, 20); -// $ExpectError -padRight(true, 20); -// $ExpectError -padRight(null, 20); -// $ExpectError -padRight(undefined, 20); -// $ExpectError -padRight('0x3456ff', bigNumber); -// $ExpectError -padRight('0x3456ff', ['string']); -// $ExpectError -padRight('0x3456ff', [4]); -// $ExpectError -padRight('0x3456ff', {}); -// $ExpectError -padRight('0x3456ff', true); -// $ExpectError -padRight('0x3456ff', null); -// $ExpectError -padRight('0x3456ff', undefined); -// $ExpectError -padRight('Hello', 20, bigNumber); -// $ExpectError -padRight('Hello', 20, ['string']); -// $ExpectError -padRight('Hello', 20, [4]); -// $ExpectError -padRight('Hello', 20, {}); -// $ExpectError -padRight('Hello', 20, true); -// $ExpectError -padRight('Hello', 20, null); diff --git a/packages/web3-utils/types/tests/random-hex-test.ts b/packages/web3-utils/types/tests/random-hex-test.ts deleted file mode 100644 index 64465afb93e..00000000000 --- a/packages/web3-utils/types/tests/random-hex-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file random-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {randomHex} from 'web3-utils'; - -// $ExpectType string -randomHex(32); - -// $ExpectError -randomHex('234'); -// $ExpectError -randomHex(new BN(3)); -// $ExpectError -randomHex(['string']); -// $ExpectError -randomHex([4]); -// $ExpectError -randomHex({}); -// $ExpectError -randomHex(true); -// $ExpectError -randomHex(null); -// $ExpectError -randomHex(undefined); diff --git a/packages/web3-utils/types/tests/right-pad-test.ts b/packages/web3-utils/types/tests/right-pad-test.ts deleted file mode 100644 index f81ace7dc72..00000000000 --- a/packages/web3-utils/types/tests/right-pad-test.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file right-pad-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {rightPad} from 'web3-utils'; - -const bigNumber = new BN(3); - -// $ExpectType string -rightPad('0x3456ff', 20); -// $ExpectType string -rightPad(0x3456ff, 20); -// $ExpectType string -rightPad('Hello', 20, 'x'); - -// $ExpectError -rightPad(bigNumber, 20); -// $ExpectError -rightPad(['string'], 20); -// $ExpectError -rightPad([4], 20); -// $ExpectError -rightPad({}, 20); -// $ExpectError -rightPad(true, 20); -// $ExpectError -rightPad(null, 20); -// $ExpectError -rightPad(undefined, 20); -// $ExpectError -rightPad('0x3456ff', bigNumber); -// $ExpectError -rightPad('0x3456ff', ['string']); -// $ExpectError -rightPad('0x3456ff', [4]); -// $ExpectError -rightPad('0x3456ff', {}); -// $ExpectError -rightPad('0x3456ff', true); -// $ExpectError -rightPad('0x3456ff', null); -// $ExpectError -rightPad('0x3456ff', undefined); -// $ExpectError -rightPad('Hello', 20, bigNumber); -// $ExpectError -rightPad('Hello', 20, ['string']); -// $ExpectError -rightPad('Hello', 20, [4]); -// $ExpectError -rightPad('Hello', 20, {}); -// $ExpectError -rightPad('Hello', 20, true); -// $ExpectError -rightPad('Hello', 20, null); diff --git a/packages/web3-utils/types/tests/sha3-raw-test.ts b/packages/web3-utils/types/tests/sha3-raw-test.ts deleted file mode 100644 index deba336044a..00000000000 --- a/packages/web3-utils/types/tests/sha3-raw-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file sha3Raw-tests.ts - * @author Samuel Furter - * @date 2019 - */ - -import BN = require('bn.js'); -import {sha3Raw} from 'web3-utils'; - -// $ExpectType string -sha3Raw('234'); -// $ExpectType string -sha3Raw(new BN(3)); - -// $ExpectError -sha3Raw(['string']); -// $ExpectError -sha3Raw(234); -// $ExpectError -sha3Raw([4]); -// $ExpectError -sha3Raw({}); -// $ExpectError -sha3Raw(true); -// $ExpectError -sha3Raw(null); -// $ExpectError -sha3Raw(undefined); diff --git a/packages/web3-utils/types/tests/sha3-test.ts b/packages/web3-utils/types/tests/sha3-test.ts deleted file mode 100644 index 79eb50265da..00000000000 --- a/packages/web3-utils/types/tests/sha3-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file sha3-tests.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {sha3} from 'web3-utils'; - -// $ExpectType string | null -sha3('234'); -// $ExpectType string | null -sha3(new BN(3)); - -// $ExpectError -sha3(['string']); -// $ExpectError -sha3(234); -// $ExpectError -sha3([4]); -// $ExpectError -sha3({}); -// $ExpectError -sha3(true); -// $ExpectError -sha3(null); -// $ExpectError -sha3(undefined); diff --git a/packages/web3-utils/types/tests/solidity-sha3-raw-test.ts b/packages/web3-utils/types/tests/solidity-sha3-raw-test.ts deleted file mode 100644 index 38c568f9254..00000000000 --- a/packages/web3-utils/types/tests/solidity-sha3-raw-test.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file solidity-sha3-raw-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {soliditySha3Raw} from 'web3-utils'; - -// $ExpectType string -soliditySha3Raw('234564535', '0xfff23243', true, -10); -// $ExpectType string -soliditySha3Raw('Hello!%'); -// $ExpectType string -soliditySha3Raw('234'); -// $ExpectType string -soliditySha3Raw(0xea); -// $ExpectType string -soliditySha3Raw(new BN(3)); -// $ExpectType string -soliditySha3Raw({type: 'uint256', value: '234'}); -// $ExpectType string -soliditySha3Raw({t: 'uint', v: new BN('234')}); -// $ExpectType string -soliditySha3Raw({t: 'string', v: 'Hello!%'}, {t: 'int8', v: -23}, {t: 'address', v: '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'}); -// $ExpectType string -soliditySha3Raw('0x407D73d8a49eeb85D32Cf465507dd71d507100c1'); - -// $ExpectError -soliditySha3Raw(['hey']); -// $ExpectError -soliditySha3Raw([34]); -// $ExpectError -soliditySha3Raw(null); -// $ExpectError -soliditySha3Raw(undefined); diff --git a/packages/web3-utils/types/tests/solidity-sha3-test.ts b/packages/web3-utils/types/tests/solidity-sha3-test.ts deleted file mode 100644 index ea7d0343a21..00000000000 --- a/packages/web3-utils/types/tests/solidity-sha3-test.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file solidity-sha3-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {soliditySha3} from 'web3-utils'; - -// $ExpectType string | null -soliditySha3('234564535', '0xfff23243', true, -10); -// $ExpectType string | null -soliditySha3('Hello!%'); -// $ExpectType string | null -soliditySha3('234'); -// $ExpectType string | null -soliditySha3(0xea); -// $ExpectType string | null -soliditySha3(new BN(3)); -// $ExpectType string | null -soliditySha3({type: 'uint256', value: '234'}); -// $ExpectType string | null -soliditySha3({t: 'uint', v: new BN('234')}); -// $ExpectType string | null -soliditySha3({t: 'string', v: 'Hello!%'}, {t: 'int8', v: -23}, {t: 'address', v: '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'}); -// $ExpectType string | null -soliditySha3('0x407D73d8a49eeb85D32Cf465507dd71d507100c1'); - -// $ExpectError -soliditySha3(['hey']); -// $ExpectError -soliditySha3([34]); -// $ExpectError -soliditySha3(null); -// $ExpectError -soliditySha3(undefined); diff --git a/packages/web3-utils/types/tests/string-to-hex-test.ts b/packages/web3-utils/types/tests/string-to-hex-test.ts deleted file mode 100644 index a8c4370d344..00000000000 --- a/packages/web3-utils/types/tests/string-to-hex-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file string-to-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {stringToHex} from 'web3-utils'; - -// $ExpectType string -stringToHex('I have 100£'); - -// $ExpectError -stringToHex(232); -// $ExpectError -stringToHex(new BN(3)); -// $ExpectError -stringToHex(['string']); -// $ExpectError -stringToHex([4]); -// $ExpectError -stringToHex({}); -// $ExpectError -stringToHex(true); -// $ExpectError -stringToHex(null); -// $ExpectError -stringToHex(undefined); diff --git a/packages/web3-utils/types/tests/strip-hex-prefix-test.ts b/packages/web3-utils/types/tests/strip-hex-prefix-test.ts deleted file mode 100644 index 84a54c5ab04..00000000000 --- a/packages/web3-utils/types/tests/strip-hex-prefix-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file strip-hex-prefix-test.ts - * @author Alejandro Cavallero - * @date 2019 - */ - -import BN = require('bn.js'); -import {stripHexPrefix} from 'web3-utils'; - -// $ExpectType string -stripHexPrefix('0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb'); - -// $ExpectError -stripHexPrefix(123); -// $ExpectError -stripHexPrefix(new BN(3)); -// $ExpectError -stripHexPrefix(['string']); -// $ExpectError -stripHexPrefix([4]); -// $ExpectError -stripHexPrefix({}); -// $ExpectError -stripHexPrefix(true); -// $ExpectError -stripHexPrefix(null); -// $ExpectError -stripHexPrefix(undefined); diff --git a/packages/web3-utils/types/tests/test-address-test.ts b/packages/web3-utils/types/tests/test-address-test.ts deleted file mode 100644 index 8c47a1c91ac..00000000000 --- a/packages/web3-utils/types/tests/test-address-test.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file test-address-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {testAddress} from 'web3-utils'; - -const bigNumber = new BN(3); - -// $ExpectType boolean -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); - -// $ExpectError -testAddress(656, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress(bigNumber, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress(['string'], '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress([4], '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress({}, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress(true, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress(null, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress(undefined, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', 656); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', bigNumber); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', ['string']); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', [4]); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', {}); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', true); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', null); -// $ExpectError -testAddress('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', undefined); diff --git a/packages/web3-utils/types/tests/test-topic-test.ts b/packages/web3-utils/types/tests/test-topic-test.ts deleted file mode 100644 index 5c306083ed8..00000000000 --- a/packages/web3-utils/types/tests/test-topic-test.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file test-topic-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {testTopic} from 'web3-utils'; - -const bigNumber = new BN(3); - -// $ExpectType boolean -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); - -// $ExpectError -testTopic(656, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic(bigNumber, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic(['string'], '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic([4], '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic({}, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic(true, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic(null, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic(undefined, '0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', 656); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', bigNumber); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', ['string']); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', [4]); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', {}); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', true); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', null); -// $ExpectError -testTopic('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', undefined); diff --git a/packages/web3-utils/types/tests/to-ascii-test.ts b/packages/web3-utils/types/tests/to-ascii-test.ts deleted file mode 100644 index 9d086a2394a..00000000000 --- a/packages/web3-utils/types/tests/to-ascii-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-ascii-tests.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {toAscii} from 'web3-utils'; - -// $ExpectType string -toAscii('0x4920686176652031303021'); - -// $ExpectError -toAscii(345); -// $ExpectError -toAscii(new BN(3)); -// $ExpectError -toAscii({}); -// $ExpectError -toAscii(true); -// $ExpectError -toAscii(['string']); -// $ExpectError -toAscii([4]); -// $ExpectError -toAscii(null); -// $ExpectError -toAscii(undefined); diff --git a/packages/web3-utils/types/tests/to-bn-test.ts b/packages/web3-utils/types/tests/to-bn-test.ts deleted file mode 100644 index 0df148d7333..00000000000 --- a/packages/web3-utils/types/tests/to-bn-test.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-bn-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import {toBN} from 'web3-utils'; - -// $ExpectType BN -toBN(4); -// $ExpectType BN -toBN('443'); - -// $ExpectError -toBN({}); -// $ExpectError -toBN(true); -// $ExpectError -toBN(['string']); -// $ExpectError -toBN([4]); -// $ExpectError -toBN(null); -// $ExpectError -toBN(undefined); diff --git a/packages/web3-utils/types/tests/to-check-sum-address-test.ts b/packages/web3-utils/types/tests/to-check-sum-address-test.ts deleted file mode 100644 index a43aa7a8f80..00000000000 --- a/packages/web3-utils/types/tests/to-check-sum-address-test.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-check-sum-address-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {toChecksumAddress} from 'web3-utils'; - -// $ExpectType string -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51'); -// $ExpectType string -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', 31); -// $ExpectType string -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', undefined); - -// $ExpectError -toChecksumAddress([4]); -// $ExpectError -toChecksumAddress(['string']); -// $ExpectError -toChecksumAddress(345); -// $ExpectError -toChecksumAddress(new BN(3)); -// $ExpectError -toChecksumAddress({}); -// $ExpectError -toChecksumAddress(true); -// $ExpectError -toChecksumAddress(null); -// $ExpectError -toChecksumAddress(undefined); -// $ExpectError -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', [4]); -// $ExpectError -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', ['string']); -// $ExpectError -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', new BN(3)); -// $ExpectError -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', {}); -// $ExpectError -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', true); -// $ExpectError -toChecksumAddress('0x8ee7f17bb3f88b01247c21ab6603880b64ae53e811f5e01138822e558cf1ab51', null); diff --git a/packages/web3-utils/types/tests/to-decimal-test.ts b/packages/web3-utils/types/tests/to-decimal-test.ts deleted file mode 100644 index 77793f81165..00000000000 --- a/packages/web3-utils/types/tests/to-decimal-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-decimal-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {toDecimal} from 'web3-utils'; - -// $ExpectType number -toDecimal('232'); -// $ExpectType number -toDecimal(232); - -// $ExpectError -toDecimal(new BN(3)); -// $ExpectError -toDecimal(['string']); -// $ExpectError -toDecimal([4]); -// $ExpectError -toDecimal({}); -// $ExpectError -toDecimal(true); -// $ExpectError -toDecimal(null); -// $ExpectError -toDecimal(undefined); diff --git a/packages/web3-utils/types/tests/to-hex-test.ts b/packages/web3-utils/types/tests/to-hex-test.ts deleted file mode 100644 index 0c2be5b9709..00000000000 --- a/packages/web3-utils/types/tests/to-hex-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {toHex} from 'web3-utils'; - -// $ExpectType string -toHex('234'); -// $ExpectType string -toHex(234); -// $ExpectType string -toHex(new BN(3)); - -// $ExpectError -toHex(['string']); -// $ExpectError -toHex(true); -// $ExpectError -toHex([4]); -// $ExpectError -toHex({}); -// $ExpectError -toHex(null); -// $ExpectError -toHex(undefined); diff --git a/packages/web3-utils/types/tests/to-twos-compement-test.ts b/packages/web3-utils/types/tests/to-twos-compement-test.ts deleted file mode 100644 index 1162976b26f..00000000000 --- a/packages/web3-utils/types/tests/to-twos-compement-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-twos-compement-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {toTwosComplement} from 'web3-utils'; - -// $ExpectType string -toTwosComplement(4); -// $ExpectType string -toTwosComplement('443'); -// $ExpectType string -toTwosComplement(new BN(3)); - -// $ExpectError -toTwosComplement({}); -// $ExpectError -toTwosComplement(true); -// $ExpectError -toTwosComplement(['string']); -// $ExpectError -toTwosComplement([4]); -// $ExpectError -toTwosComplement(null); -// $ExpectError -toTwosComplement(undefined); diff --git a/packages/web3-utils/types/tests/to-utf8-test.ts b/packages/web3-utils/types/tests/to-utf8-test.ts deleted file mode 100644 index 54c10748f96..00000000000 --- a/packages/web3-utils/types/tests/to-utf8-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-utf8-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {toUtf8} from 'web3-utils'; - -// $ExpectType string -toUtf8('0x49206861766520313030e282ac'); - -// $ExpectError -toUtf8(656); -// $ExpectError -toUtf8(new BN(3)); -// $ExpectError -toUtf8(['string']); -// $ExpectError -toUtf8([4]); -// $ExpectError -toUtf8({}); -// $ExpectError -toUtf8(true); -// $ExpectError -toUtf8(null); -// $ExpectError -toUtf8(undefined); diff --git a/packages/web3-utils/types/tests/to-wei-test.ts b/packages/web3-utils/types/tests/to-wei-test.ts deleted file mode 100644 index ee725b53c04..00000000000 --- a/packages/web3-utils/types/tests/to-wei-test.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file to-wei-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {toWei} from 'web3-utils'; - -const bigNumber = new BN(3); - -// $ExpectType string -toWei('1'); -// $ExpectType BN -toWei(bigNumber); -// $ExpectType string -toWei('1', 'finney'); -// $ExpectType BN -toWei(bigNumber, 'finney'); - -// $ExpectError -toWei(['string']); -// $ExpectError -toWei([4]); -// $ExpectError -toWei({}); -// $ExpectError -toWei(true); -// $ExpectError -toWei(null); -// $ExpectError -toWei(undefined); -// $ExpectError -toWei(1, 'blah'); diff --git a/packages/web3-utils/types/tests/unit-map-test.ts b/packages/web3-utils/types/tests/unit-map-test.ts deleted file mode 100644 index ab75ed97cc5..00000000000 --- a/packages/web3-utils/types/tests/unit-map-test.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file unit-map-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import {unitMap} from 'web3-utils'; - -// $ExpectType Units -unitMap(); diff --git a/packages/web3-utils/types/tests/utf8-to-hex-test.ts b/packages/web3-utils/types/tests/utf8-to-hex-test.ts deleted file mode 100644 index 116551bc63b..00000000000 --- a/packages/web3-utils/types/tests/utf8-to-hex-test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file utf8-to-hex-test.ts - * @author Josh Stevens - * @date 2018 - */ - -import BN = require('bn.js'); -import {utf8ToHex} from 'web3-utils'; - -// $ExpectType string -utf8ToHex('I have 100£'); - -// $ExpectError -utf8ToHex(232); -// $ExpectError -utf8ToHex(new BN(3)); -// $ExpectError -utf8ToHex(['string']); -// $ExpectError -utf8ToHex([4]); -// $ExpectError -utf8ToHex({}); -// $ExpectError -utf8ToHex(true); -// $ExpectError -utf8ToHex(null); -// $ExpectError -utf8ToHex(undefined); diff --git a/packages/web3-utils/types/tsconfig.json b/packages/web3-utils/types/tsconfig.json deleted file mode 100644 index e0200c80d27..00000000000 --- a/packages/web3-utils/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3-utils": ["."] - } - } -} diff --git a/packages/web3-utils/types/tslint.json b/packages/web3-utils/types/tslint.json deleted file mode 100644 index 84e929c12dc..00000000000 --- a/packages/web3-utils/types/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-redundant-jsdoc": false, - "max-line-length": false - } -} diff --git a/packages/web3-validator/.eslintignore b/packages/web3-validator/.eslintignore new file mode 100644 index 00000000000..042635799ba --- /dev/null +++ b/packages/web3-validator/.eslintignore @@ -0,0 +1,5 @@ +dist +lib +jest.config.js +.eslintrc.js +webpack.config.js \ No newline at end of file diff --git a/packages/web3-validator/.eslintrc.js b/packages/web3-validator/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3-validator/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-validator/.gitignore b/packages/web3-validator/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3-validator/.npmignore b/packages/web3-validator/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3-validator/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3-validator/.prettierignore b/packages/web3-validator/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3-validator/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3-validator/.prettierrc.json b/packages/web3-validator/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3-validator/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3-validator/CHANGELOG.md b/packages/web3-validator/CHANGELOG.md new file mode 100644 index 00000000000..c2d2a645bb9 --- /dev/null +++ b/packages/web3-validator/CHANGELOG.md @@ -0,0 +1,171 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.1-alpha.1] + +### Removed + +- Removed direct function `toJSON()` in `Web3ValidatorError` class as its available via base class (#5435) + +## [0.1.1-alpha.2] + +### Changed + +- Updated Web3.js dependencies (#5664) + +### Fixed + +- Fix `isHex`returning `false` for `-123`, fix `isHexStrict` returning `true` for `-0x`, and fix `isHex` returning `true` for empty strings `` (#5373). + +## [0.1.1-alpha.3] + +### Fixed + +- Fix issue when importing `web3-validator` package within browser environments (webpack minified filename changed from `index.min.js` to `web3-validator.min.js`) (#5710) + +## [0.1.1-alpha.4] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [0.1.1-alpha.5] + +### Removed + +- `build` entry from `package.json` (#5755) + +## [1.0.0-rc.0] + +### Removed + +- Moved `TypedArray` to `web3-types` (was also duplicated at `web3-utils`) (#5771) + +### Added + +- Added support of `safe` and `finalized` block tags in `isBlockTag` method (#5823) + +## [1.0.0-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) +- Added functions `isHexString`, `isHexPrefixed`, `validateNoLeadingZeroes` (#5963) + +## [1.0.0-rc.2] + +### Changed + +- Replaced Buffer for Uint8Array (#6004) + +### Removed + +- `Web3ValidationErrorObject` type is now exported from `web3-types` package (#6102) + +## [1.0.0] + +Release Notes: + +Detailed List of change logs are mentioned under previous 1.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [1.0.1] + +### Changed + +- Dependencies updated + +## [1.0.2] + +### Changed + +- Dependencies updated + +## [2.0.0] + +### Changed + +- Replace `is-my-json-valid` with `zod` dependency. Related code was changed (#6264) +- Types `ValidationError` and `JsonSchema` were changed (#6264) + +### Removed + +- Type `RawValidationError` was removed (#6264) + +### Added + +- Added `json-schema` as a main json schema type (#6264) + +## [2.0.1] + +### Fixed + +- ESM import bug (#6359) + +## [2.0.2] + +### Changed + +- Dependencies updated + +## [2.0.3] + +### Fixed + +- Multi-dimensional arrays are now handled properly when parsing ABIs (#6435) +- Fix issue with default config with babel (and React): "TypeError: Cannot convert a BigInt value to a number #6187" (#6506) +- Validator will now properly handle all valid numeric type sizes: intN / uintN where 8 < = N < = 256 and N % 8 == 0 (#6434) +- Will now throw SchemaFormatError when unsupported format is passed to `convertToZod` method (#6434) + +## [2.0.4] + +### Fixed + +- Fixed an issue with detecting Uint8Array (#6486) + +## [2.0.5] + +### Fixed + +- Multi-dimensional arrays(with a fix length) are now handled properly when parsing ABIs (#6798) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3-validator/README.md b/packages/web3-validator/README.md new file mode 100644 index 00000000000..b0d1cc5c65a --- /dev/null +++ b/packages/web3-validator/README.md @@ -0,0 +1,98 @@ +

+ web3.js +

+ +# web3-validator + +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] + +This is a sub-package of [web3.js][repo]. + +`web3-validator` contains functions for validating objects. + +## Installation + +You can install the package either using [NPM](https://www.npmjs.com/package/web3-validator) or using [Yarn](https://yarnpkg.com/package/web3-validator) + +### Using NPM + +```bash +npm install web3-validator +``` + +### Using Yarn + +```bash +yarn add web3-validator +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +### Usage + +You can use the validator by importing as and using to validate; + +```ts +import { validator } from 'web3-validator'; + +// To validate and throw +validator.validate(['uint8', 'string'], [val1, val2]); + +// To validate and return error +const errors = validator.validate(['uint8', 'string'], [val1, val2], { silent: true }); +``` + +To see more examples of schema you can use to validate check [following file](./test/fixtures/abi_to_json_schema.ts). + +Following eth types are supported to validate. + +| Type | Input As | Description | +| ----- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| uint | `number`, `string`, `HexString` | Unsigned integer, all ethereum compatible variants are also supported e.g. `uint8`, `uint256`. You can also use array specifiers as `uint[]` or `uint[2]` | +| int | `number`, `string`, `HexString` | Signed integer, all ethereum compatible variants are also supported e.g. `int8`, `int256`. You can also use array specifiers as `int[]` or `int[2]` | +| bytes | `HexString`, `Uint8Array` | Raw bytes. You can also use fixed length bytes as `bytes[2]` | + +| string | `string` | String values | +| address | `string`, `HexString` | Ethereum network compatible address | +| bloom | `string`, `HexString` | Check if a given string is a Eth bloom | +| tuple | `array` | You can specify any tuple as nested arrays. e.g. `['uint', 'string']`. For a custom tuple or array tuple you can use syntax e.g. `['tuple[3]', ['uint', 'string']]` | + +For the ethereum compatible data values should be passed as arrays e.g. for schema `['uint', 'string']` value should be passed as `[2, 'my-string']`. + +You can also pass full ABI schema for the validation. e.g. + +```json +[{ "name": "owner", "type": "address" }] +``` + +The implementation of the validator is extension of [JSON-Schema-Draft07](https://json-schema.org/draft-07/json-schema-release-notes.html) with a custom keyword `eth`. So you can use JSON-Schema compatible schema to validate any object based data as well. + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3-validator +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-validator%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-validator +[downloads-image]: https://img.shields.io/npm/dm/web3-validator?label=npm%20downloads diff --git a/packages/web3-validator/assets/logo/web3js.ai b/packages/web3-validator/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3-validator/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3-validator/assets/logo/web3js.jpg b/packages/web3-validator/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3-validator/assets/logo/web3js.jpg differ diff --git a/packages/web3-validator/assets/logo/web3js.svg b/packages/web3-validator/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3-validator/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3-validator/package.json b/packages/web3-validator/package.json new file mode 100644 index 00000000000..f32cf8d44e4 --- /dev/null +++ b/packages/web3-validator/package.json @@ -0,0 +1,68 @@ +{ + "name": "web3-validator", + "version": "2.0.5", + "description": "JSON-Schema compatible validator for web3", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "browser": "./dist/web3-validator.min.js", + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*", + "dist/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check|web)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:web": "npx webpack", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.1.4", + "web3-types": "^1.5.0", + "zod": "^3.21.4" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + } +} diff --git a/packages/web3-validator/src/constants.ts b/packages/web3-validator/src/constants.ts new file mode 100644 index 00000000000..f4fd05d6692 --- /dev/null +++ b/packages/web3-validator/src/constants.ts @@ -0,0 +1,18 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const VALID_ETH_BASE_TYPES = ['bool', 'int', 'uint', 'bytes', 'string', 'address', 'tuple']; diff --git a/packages/web3-validator/src/default_validator.ts b/packages/web3-validator/src/default_validator.ts new file mode 100644 index 00000000000..ef42bfb22fc --- /dev/null +++ b/packages/web3-validator/src/default_validator.ts @@ -0,0 +1,20 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Validator } from './web3_validator.js'; + +export const validator = new Web3Validator(); diff --git a/packages/web3-validator/src/errors.ts b/packages/web3-validator/src/errors.ts new file mode 100644 index 00000000000..8faf361248b --- /dev/null +++ b/packages/web3-validator/src/errors.ts @@ -0,0 +1,46 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { BaseWeb3Error, ERR_VALIDATION } from 'web3-errors'; +import { Web3ValidationErrorObject } from 'web3-types'; + +const errorFormatter = (error: Web3ValidationErrorObject): string => { + if (error.message) { + return error.message; + } + + return 'unspecified error'; +}; + +export class Web3ValidatorError extends BaseWeb3Error { + public code = ERR_VALIDATION; + public readonly errors: Web3ValidationErrorObject[]; + + public constructor(errors: Web3ValidationErrorObject[]) { + super(); + + this.errors = errors; + + super.message = `Web3 validator found ${ + errors.length + } error[s]:\n${this._compileErrors().join('\n')}`; + } + + private _compileErrors(): string[] { + return this.errors.map(errorFormatter); + } +} diff --git a/packages/web3-validator/src/formats.ts b/packages/web3-validator/src/formats.ts new file mode 100644 index 00000000000..69d6fa9cf1f --- /dev/null +++ b/packages/web3-validator/src/formats.ts @@ -0,0 +1,55 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Filter } from 'web3-types'; +import { ValidInputTypes } from './types.js'; +import { isAddress } from './validation/address.js'; +import { isBlockNumber, isBlockNumberOrTag, isBlockTag } from './validation/block.js'; +import { isBloom } from './validation/bloom.js'; +import { isBoolean } from './validation/boolean.js'; +import { isBytes } from './validation/bytes.js'; +import { isFilterObject } from './validation/filter.js'; +import { isHexStrict, isString } from './validation/string.js'; +import { isNumber, isInt, isUInt } from './validation/numbers.js'; + +const formats: { [key: string]: (data: unknown) => boolean } = { + address: (data: unknown) => isAddress(data as ValidInputTypes), + bloom: (data: unknown) => isBloom(data as ValidInputTypes), + blockNumber: (data: unknown) => isBlockNumber(data as string | number | bigint), + blockTag: (data: unknown) => isBlockTag(data as string), + blockNumberOrTag: (data: unknown) => isBlockNumberOrTag(data as string | number | bigint), + bool: (data: unknown) => isBoolean(data as ValidInputTypes), + bytes: (data: unknown) => isBytes(data as ValidInputTypes | Uint8Array | number[]), + filter: (data: unknown) => isFilterObject(data as Filter), + hex: (data: unknown) => isHexStrict(data as ValidInputTypes), + uint: (data: unknown) => isUInt(data as ValidInputTypes), + int: (data: unknown) => isInt(data as ValidInputTypes), + number: (data: unknown) => isNumber(data as ValidInputTypes), + string: (data: unknown) => isString(data as ValidInputTypes), +}; +// generate formats for all numbers types +for (let bitSize = 8; bitSize <= 256; bitSize += 8) { + formats[`int${bitSize}`] = data => isInt(data as ValidInputTypes, { bitSize }); + formats[`uint${bitSize}`] = data => isUInt(data as ValidInputTypes, { bitSize }); +} +// generate bytes +for (let size = 1; size <= 32; size += 1) { + formats[`bytes${size}`] = data => + isBytes(data as ValidInputTypes | Uint8Array | number[], { size }); +} +formats.bytes256 = formats.bytes; + +export default formats; diff --git a/packages/web3-validator/src/index.ts b/packages/web3-validator/src/index.ts new file mode 100644 index 00000000000..4b816bc84e3 --- /dev/null +++ b/packages/web3-validator/src/index.ts @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './web3_validator.js'; +export * from './default_validator.js'; +export * from './types.js'; +export * as utils from './utils.js'; +export * from './errors.js'; +export * from './constants.js'; +export * from './validation/index.js'; diff --git a/packages/web3-validator/src/types.ts b/packages/web3-validator/src/types.ts new file mode 100644 index 00000000000..1a179e83b58 --- /dev/null +++ b/packages/web3-validator/src/types.ts @@ -0,0 +1,146 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiParameter } from 'web3-types'; +import { ZodIssueBase } from 'zod'; + +export type ValidInputTypes = Uint8Array | bigint | string | number | boolean; +export type EthBaseTypes = 'bool' | 'bytes' | 'string' | 'uint' | 'int' | 'address' | 'tuple'; +export type EthBaseTypesWithMeta = + | `string${string}` + | `string${string}[${number}]` + | `bytes${string}` + | `bytes${string}[${number}]` + | `address[${number}]` + | `bool[${number}]` + | `int${string}` + | `int${string}[${number}]` + | `uint${string}` + | `uint${string}[${number}]` + | `tuple[]` + | `tuple[${number}]`; + +export type EthExtendedTypes = + | 'hex' + | 'number' + | 'blockNumber' + | 'blockNumberOrTag' + | 'filter' + | 'bloom'; + +export type FullValidationSchema = ReadonlyArray; +export type ShortValidationSchema = ReadonlyArray< + string | EthBaseTypes | EthExtendedTypes | EthBaseTypesWithMeta | ShortValidationSchema +>; +export type ValidationSchemaInput = FullValidationSchema | ShortValidationSchema; + +export type Web3ValidationOptions = { + readonly silent: boolean; +}; + +export type Json = string | number | boolean | Array | { [id: string]: Json }; + +export type ValidationError = ZodIssueBase; + +export interface Validate { + (value: Json): boolean; + errors?: ValidationError[]; +} + +export type Schema = { + // version + $schema?: string; + $vocabulary?: string; + // pointers + id?: string; + $id?: string; + $anchor?: string; + $ref?: string; + definitions?: { [id: string]: Schema }; + $defs?: { [id: string]: Schema }; + $recursiveRef?: string; + $recursiveAnchor?: boolean; + // generic + type?: string | Array; + required?: Array | boolean; + default?: Json; + // constant values + enum?: Array; + const?: Json; + // logical checks + not?: Schema; + allOf?: Array; + anyOf?: Array; + oneOf?: Array; + if?: Schema; + then?: Schema; + else?: Schema; + // numbers + maximum?: number; + minimum?: number; + exclusiveMaximum?: number | boolean; + exclusiveMinimum?: number | boolean; + multipleOf?: number; + divisibleBy?: number; + // arrays, basic + maxItems?: number; + minItems?: number; + additionalItems?: Schema; + // arrays, complex + contains?: Schema; + minContains?: number; + maxContains?: number; + uniqueItems?: boolean; + // strings + maxLength?: number; + minLength?: number; + format?: string; + pattern?: string; + // strings content + contentEncoding?: string; + contentMediaType?: string; + contentSchema?: Schema; + // objects + properties?: { [id: string]: Schema }; + maxProperties?: number; + minProperties?: number; + additionalProperties?: Schema; + patternProperties?: { [pattern: string]: Schema }; + propertyNames?: Schema; + dependencies?: { [id: string]: Array | Schema }; + dependentRequired?: { [id: string]: Array }; + dependentSchemas?: { [id: string]: Schema }; + // see-through + unevaluatedProperties?: Schema; + unevaluatedItems?: Schema; + // Unused meta keywords not affecting validation (annotations and comments) + // https://json-schema.org/understanding-json-schema/reference/generic.html + // https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9 + title?: string; + description?: string; + deprecated?: boolean; + readOnly?: boolean; + writeOnly?: boolean; + examples?: Array; + $comment?: string; + // optimization hint and error filtering only, does not affect validation result + discriminator?: { propertyName: string; mapping?: { [value: string]: string } }; + readonly eth?: string; + items?: Schema | Schema[]; +}; + +export type JsonSchema = Schema; diff --git a/packages/web3-validator/src/utils.ts b/packages/web3-validator/src/utils.ts new file mode 100644 index 00000000000..36a65e3f122 --- /dev/null +++ b/packages/web3-validator/src/utils.ts @@ -0,0 +1,497 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { InvalidBytesError, InvalidNumberError } from 'web3-errors'; +import { VALID_ETH_BASE_TYPES } from './constants.js'; +import { + FullValidationSchema, + JsonSchema, + ShortValidationSchema, + ValidationSchemaInput, + ValidInputTypes, +} from './types.js'; +import { isAbiParameterSchema } from './validation/abi.js'; +import { isHexStrict } from './validation/string.js'; +import { Web3ValidatorError } from './errors.js'; + +const extraTypes = ['hex', 'number', 'blockNumber', 'blockNumberOrTag', 'filter', 'bloom']; + +export const parseBaseType = ( + type: string, +): { + baseType?: T; + baseTypeSize: number | undefined; + arraySizes: number[]; + isArray: boolean; +} => { + // Remove all empty spaces to avoid any parsing issue. + let strippedType = type.replace(/ /, ''); + let baseTypeSize: number | undefined; + let isArray = false; + let arraySizes: number[] = []; + + if (type.includes('[')) { + // Extract the array type + strippedType = strippedType.slice(0, strippedType.indexOf('[')); + // Extract array indexes + arraySizes = [...type.matchAll(/(?:\[(\d*)\])/g)] + .map(match => parseInt(match[1], 10)) + .map(size => (Number.isNaN(size) ? -1 : size)); + + isArray = arraySizes.length > 0; + } + + if (VALID_ETH_BASE_TYPES.includes(strippedType)) { + return { baseType: strippedType as unknown as T, isArray, baseTypeSize, arraySizes }; + } + + if (strippedType.startsWith('int')) { + baseTypeSize = parseInt(strippedType.substring(3), 10); + strippedType = 'int'; + } else if (strippedType.startsWith('uint')) { + baseTypeSize = parseInt(type.substring(4), 10); + strippedType = 'uint'; + } else if (strippedType.startsWith('bytes')) { + baseTypeSize = parseInt(strippedType.substring(5), 10); + strippedType = 'bytes'; + } else { + return { baseType: undefined, isArray: false, baseTypeSize: undefined, arraySizes }; + } + + return { baseType: strippedType as unknown as T, isArray, baseTypeSize, arraySizes }; +}; + +const convertEthType = ( + type: string, + parentSchema: JsonSchema = {}, +): { format?: string; required?: boolean } => { + const typePropertyPresent = Object.keys(parentSchema).includes('type'); + + if (typePropertyPresent) { + throw new Web3ValidatorError([ + { + keyword: 'eth', + message: 'Either "eth" or "type" can be presented in schema', + params: { eth: type }, + instancePath: '', + schemaPath: '', + }, + ]); + } + + const { baseType, baseTypeSize } = parseBaseType(type); + + if (!baseType && !extraTypes.includes(type)) { + throw new Web3ValidatorError([ + { + keyword: 'eth', + message: `Eth data type "${type}" is not valid`, + params: { eth: type }, + instancePath: '', + schemaPath: '', + }, + ]); + } + + if (baseType) { + if (baseType === 'tuple') { + throw new Error('"tuple" type is not implemented directly.'); + } + return { format: `${baseType}${baseTypeSize ?? ''}`, required: true }; + } + if (type) { + return { format: type, required: true }; + } + + return {}; +}; + +export const abiSchemaToJsonSchema = ( + abis: ShortValidationSchema | FullValidationSchema, + level = '/0', +) => { + const schema: JsonSchema = { + type: 'array', + items: [], + maxItems: abis.length, + minItems: abis.length, + }; + + for (const [index, abi] of abis.entries()) { + // eslint-disable-next-line no-nested-ternary + let abiType!: string; + let abiName!: string; + let abiComponents: ShortValidationSchema | FullValidationSchema | undefined = []; + + // If it's a complete Abi Parameter + // e.g. {name: 'a', type: 'uint'} + if (isAbiParameterSchema(abi)) { + abiType = abi.type; + abiName = abi.name; + abiComponents = abi.components as FullValidationSchema; + // If its short form string value e.g. ['uint'] + } else if (typeof abi === 'string') { + abiType = abi; + abiName = `${level}/${index}`; + + // If it's provided in short form of tuple e.g. [['uint', 'string']] + } else if (Array.isArray(abi)) { + // If its custom tuple e.g. ['tuple[2]', ['uint', 'string']] + if ( + abi[0] && + typeof abi[0] === 'string' && + abi[0].startsWith('tuple') && + !Array.isArray(abi[0]) && + abi[1] && + Array.isArray(abi[1]) + ) { + // eslint-disable-next-line prefer-destructuring + abiType = abi[0]; + abiName = `${level}/${index}`; + abiComponents = abi[1] as ReadonlyArray; + } else { + abiType = 'tuple'; + abiName = `${level}/${index}`; + abiComponents = abi; + } + } + + const { baseType, isArray, arraySizes } = parseBaseType(abiType); + + let childSchema: JsonSchema; + let lastSchema = schema; + for (let i = arraySizes.length - 1; i > 0; i -= 1) { + childSchema = { + type: 'array', + $id: abiName, + items: [], + maxItems: arraySizes[i], + minItems: arraySizes[i], + }; + + if (arraySizes[i] < 0) { + delete childSchema.maxItems; + delete childSchema.minItems; + } + + // lastSchema.items is a Schema, concat with 'childSchema' + if (!Array.isArray(lastSchema.items)) { + lastSchema.items = [lastSchema.items as JsonSchema, childSchema]; + } // lastSchema.items is an empty Scheme array, set it to 'childSchema' + else if (lastSchema.items.length === 0) { + lastSchema.items = [childSchema]; + } // lastSchema.items is a non-empty Scheme array, append 'childSchema' + else { + lastSchema.items.push(childSchema); + } + lastSchema = childSchema; + } + + if (baseType === 'tuple' && !isArray) { + const nestedTuple = abiSchemaToJsonSchema(abiComponents, abiName); + nestedTuple.$id = abiName; + (lastSchema.items as JsonSchema[]).push(nestedTuple); + } else if (baseType === 'tuple' && isArray) { + const arraySize = arraySizes[0]; + const item: JsonSchema = { + type: 'array', + $id: abiName, + items: abiSchemaToJsonSchema(abiComponents, abiName), + ...(arraySize >= 0 && { minItems: arraySize, maxItems: arraySize }), + }; + + (lastSchema.items as JsonSchema[]).push(item); + } else if (isArray) { + const arraySize = arraySizes[0]; + const item: JsonSchema = { + type: 'array', + $id: abiName, + items: convertEthType(abiType), + ...(arraySize >= 0 && { minItems: arraySize, maxItems: arraySize }), + }; + + (lastSchema.items as JsonSchema[]).push(item); + } else if (Array.isArray(lastSchema.items)) { + // Array of non-tuple items + lastSchema.items.push({ $id: abiName, ...convertEthType(abiType) }); + } else { + // Nested object + (lastSchema.items as JsonSchema[]).push({ + $id: abiName, + ...convertEthType(abiType), + }); + } + lastSchema = schema; + } + + return schema; +}; + +export const ethAbiToJsonSchema = (abis: ValidationSchemaInput) => abiSchemaToJsonSchema(abis); + +export const fetchArrayElement = (data: Array, level: number): unknown => { + if (level === 1) { + return data; + } + + return fetchArrayElement(data[0] as Array, level - 1); +}; + +export const transformJsonDataToAbiFormat = ( + abis: FullValidationSchema, + data: ReadonlyArray | Record, + transformedData?: Array, +): Array => { + const newData: Array = []; + + for (const [index, abi] of abis.entries()) { + // eslint-disable-next-line no-nested-ternary + let abiType!: string; + let abiName!: string; + let abiComponents: ShortValidationSchema | FullValidationSchema | undefined = []; + + // If it's a complete Abi Parameter + // e.g. {name: 'a', type: 'uint'} + if (isAbiParameterSchema(abi)) { + abiType = abi.type; + abiName = abi.name; + abiComponents = abi.components as FullValidationSchema; + // If its short form string value e.g. ['uint'] + } else if (typeof abi === 'string') { + abiType = abi; + + // If it's provided in short form of tuple e.g. [['uint', 'string']] + } else if (Array.isArray(abi)) { + // If its custom tuple e.g. ['tuple[2]', ['uint', 'string']] + if (abi[1] && Array.isArray(abi[1])) { + abiType = abi[0] as string; + abiComponents = abi[1] as ReadonlyArray; + } else { + abiType = 'tuple'; + abiComponents = abi; + } + } + + const { baseType, isArray, arraySizes } = parseBaseType(abiType); + const dataItem = Array.isArray(data) + ? (data as Array)[index] + : (data as Record)[abiName]; + + if (baseType === 'tuple' && !isArray) { + newData.push( + transformJsonDataToAbiFormat( + abiComponents as FullValidationSchema, + dataItem as Array, + transformedData, + ), + ); + } else if (baseType === 'tuple' && isArray) { + const tupleData = []; + for (const tupleItem of dataItem as Array) { + // Nested array + if (arraySizes.length > 1) { + const nestedItems = fetchArrayElement( + tupleItem as Array, + arraySizes.length - 1, + ); + const nestedData = []; + + for (const nestedItem of nestedItems as Array) { + nestedData.push( + transformJsonDataToAbiFormat( + abiComponents as FullValidationSchema, + nestedItem as Array, + transformedData, + ), + ); + } + tupleData.push(nestedData); + } else { + tupleData.push( + transformJsonDataToAbiFormat( + abiComponents as FullValidationSchema, + tupleItem as Array, + transformedData, + ), + ); + } + } + newData.push(tupleData); + } else { + newData.push(dataItem); + } + } + + // Have to reassign before pushing to transformedData + // eslint-disable-next-line no-param-reassign + transformedData = transformedData ?? []; + transformedData.push(...newData); + + return transformedData; +}; + +/** + * Code points to int + */ + +export const codePointToInt = (codePoint: number): number => { + if (codePoint >= 48 && codePoint <= 57) { + /* ['0'..'9'] -> [0..9] */ + return codePoint - 48; + } + + if (codePoint >= 65 && codePoint <= 70) { + /* ['A'..'F'] -> [10..15] */ + return codePoint - 55; + } + + if (codePoint >= 97 && codePoint <= 102) { + /* ['a'..'f'] -> [10..15] */ + return codePoint - 87; + } + + throw new Error(`Invalid code point: ${codePoint}`); +}; + +/** + * Converts value to it's number representation + */ +export const hexToNumber = (value: string): bigint | number => { + if (!isHexStrict(value)) { + throw new Error('Invalid hex string'); + } + + const [negative, hexValue] = value.startsWith('-') ? [true, value.slice(1)] : [false, value]; + const num = BigInt(hexValue); + + if (num > Number.MAX_SAFE_INTEGER) { + return negative ? -num : num; + } + + if (num < Number.MIN_SAFE_INTEGER) { + return num; + } + + return negative ? -1 * Number(num) : Number(num); +}; + +/** + * Converts value to it's hex representation + */ +export const numberToHex = (value: ValidInputTypes): string => { + if ((typeof value === 'number' || typeof value === 'bigint') && value < 0) { + return `-0x${value.toString(16).slice(1)}`; + } + + if ((typeof value === 'number' || typeof value === 'bigint') && value >= 0) { + return `0x${value.toString(16)}`; + } + + if (typeof value === 'string' && isHexStrict(value)) { + const [negative, hex] = value.startsWith('-') ? [true, value.slice(1)] : [false, value]; + const hexValue = hex.split(/^(-)?0(x|X)/).slice(-1)[0]; + return `${negative ? '-' : ''}0x${hexValue.replace(/^0+/, '').toLowerCase()}`; + } + + if (typeof value === 'string' && !isHexStrict(value)) { + return numberToHex(BigInt(value)); + } + + throw new InvalidNumberError(value); +}; + +/** + * Adds a padding on the left of a string, if value is a integer or bigInt will be converted to a hex string. + */ +export const padLeft = (value: ValidInputTypes, characterAmount: number, sign = '0'): string => { + if (typeof value === 'string' && !isHexStrict(value)) { + return value.padStart(characterAmount, sign); + } + + const hex = typeof value === 'string' && isHexStrict(value) ? value : numberToHex(value); + + const [prefix, hexValue] = hex.startsWith('-') ? ['-0x', hex.slice(3)] : ['0x', hex.slice(2)]; + + return `${prefix}${hexValue.padStart(characterAmount, sign)}`; +}; + +export function uint8ArrayToHexString(uint8Array: Uint8Array): string { + let hexString = '0x'; + for (const e of uint8Array) { + const hex = e.toString(16); + hexString += hex.length === 1 ? `0${hex}` : hex; + } + return hexString; +} + +// for optimized technique for hex to bytes conversion +const charCodeMap = { + zero: 48, + nine: 57, + A: 65, + F: 70, + a: 97, + f: 102, + } as const + + function charCodeToBase16(char: number) { + if (char >= charCodeMap.zero && char <= charCodeMap.nine) + return char - charCodeMap.zero + if (char >= charCodeMap.A && char <= charCodeMap.F) + return char - (charCodeMap.A - 10) + if (char >= charCodeMap.a && char <= charCodeMap.f) + return char - (charCodeMap.a - 10) + return undefined + } + +export function hexToUint8Array(hex: string): Uint8Array { + let offset = 0; + if (hex.startsWith('0') && (hex[1] === 'x' || hex[1] === 'X')) { + offset = 2; + } + if (hex.length % 2 !== 0) { + throw new InvalidBytesError(`hex string has odd length: ${hex}`); + } + const length = (hex.length - offset) / 2; + const bytes = new Uint8Array(length); + for (let index = 0, j = offset; index < length; index+=1) { + // eslint-disable-next-line no-plusplus + const nibbleLeft = charCodeToBase16(hex.charCodeAt(j++)) + // eslint-disable-next-line no-plusplus + const nibbleRight = charCodeToBase16(hex.charCodeAt(j++)) + if (nibbleLeft === undefined || nibbleRight === undefined) { + throw new InvalidBytesError( + `Invalid byte sequence ("${hex[j - 2]}${ + hex[j - 1] + }" in "${hex}").`, + ) + } + bytes[index] = nibbleLeft * 16 + nibbleRight + } + return bytes +} + +// @TODO: Remove this function and its usages once all sub dependencies uses version 1.3.3 or above of @noble/hashes +export function ensureIfUint8Array(data: T) { + if ( + !(data instanceof Uint8Array) && + (data as { constructor: { name: string } })?.constructor?.name === 'Uint8Array' + ) { + return Uint8Array.from(data as unknown as Uint8Array); + } + return data; +} diff --git a/packages/web3-validator/src/validation/abi.ts b/packages/web3-validator/src/validation/abi.ts new file mode 100644 index 00000000000..52e835db63a --- /dev/null +++ b/packages/web3-validator/src/validation/abi.ts @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { AbiParameter } from 'web3-types'; +// eslint-disable-next-line require-extensions/require-extensions +import { ShortValidationSchema } from '../types'; + +export const isAbiParameterSchema = ( + schema: string | ShortValidationSchema | AbiParameter, +): schema is AbiParameter => typeof schema === 'object' && 'type' in schema && 'name' in schema; diff --git a/packages/web3-validator/src/validation/address.ts b/packages/web3-validator/src/validation/address.ts new file mode 100644 index 00000000000..38ebebe65f6 --- /dev/null +++ b/packages/web3-validator/src/validation/address.ts @@ -0,0 +1,78 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { utf8ToBytes } from 'ethereum-cryptography/utils.js'; +import { ValidInputTypes } from '../types.js'; +import { ensureIfUint8Array, uint8ArrayToHexString } from '../utils.js'; +import { isHexStrict } from './string.js'; +import { isUint8Array } from './bytes.js'; + +/** + * Checks the checksum of a given address. Will also return false on non-checksum addresses. + */ +export const checkAddressCheckSum = (data: string): boolean => { + if (!/^(0x)?[0-9a-f]{40}$/i.test(data)) return false; + const address = data.slice(2); + const updatedData = utf8ToBytes(address.toLowerCase()); + + const addressHash = uint8ArrayToHexString(keccak256(ensureIfUint8Array(updatedData))).slice(2); + + for (let i = 0; i < 40; i += 1) { + // the nth letter should be uppercase if the nth digit of casemap is 1 + if ( + (parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || + (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i]) + ) { + return false; + } + } + return true; +}; + +/** + * Checks if a given string is a valid Ethereum address. It will also check the checksum, if the address has upper and lowercase letters. + */ +export const isAddress = (value: ValidInputTypes, checkChecksum = true) => { + if (typeof value !== 'string' && !isUint8Array(value)) { + return false; + } + + let valueToCheck: string; + + if (isUint8Array(value)) { + valueToCheck = uint8ArrayToHexString(value); + } else if (typeof value === 'string' && !isHexStrict(value)) { + valueToCheck = value.toLowerCase().startsWith('0x') ? value : `0x${value}`; + } else { + valueToCheck = value; + } + + // check if it has the basic requirements of an address + if (!/^(0x)?[0-9a-f]{40}$/i.test(valueToCheck)) { + return false; + } + // If it's ALL lowercase or ALL upppercase + if ( + /^(0x|0X)?[0-9a-f]{40}$/.test(valueToCheck) || + /^(0x|0X)?[0-9A-F]{40}$/.test(valueToCheck) + ) { + return true; + // Otherwise check each case + } + return checkChecksum ? checkAddressCheckSum(valueToCheck) : true; +}; diff --git a/packages/web3-validator/src/validation/block.ts b/packages/web3-validator/src/validation/block.ts new file mode 100644 index 00000000000..695ac3e3bbe --- /dev/null +++ b/packages/web3-validator/src/validation/block.ts @@ -0,0 +1,32 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { BlockTags } from 'web3-types'; +import { isUInt } from './numbers.js'; + +export const isBlockNumber = (value: string | number | bigint): boolean => isUInt(value); + +/** + * Returns true if the given blockNumber is 'latest', 'pending', 'earliest, 'safe' or 'finalized' + */ +export const isBlockTag = (value: string) => Object.values(BlockTags).includes(value as BlockTags); + +/** + * Returns true if given value is valid hex string and not negative, or is a valid BlockTag + */ +export const isBlockNumberOrTag = (value: string | number | bigint) => + isBlockTag(value as string) || isBlockNumber(value); diff --git a/packages/web3-validator/src/validation/bloom.ts b/packages/web3-validator/src/validation/bloom.ts new file mode 100644 index 00000000000..e9cde96b73d --- /dev/null +++ b/packages/web3-validator/src/validation/bloom.ts @@ -0,0 +1,121 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { keccak256 } from 'ethereum-cryptography/keccak.js'; +import { ValidInputTypes } from '../types.js'; +import { codePointToInt, hexToUint8Array, padLeft, uint8ArrayToHexString } from '../utils.js'; +import { isAddress } from './address.js'; +import { isHexStrict } from './string.js'; + +/** + * Returns true if the bloom is a valid bloom + * https://github.com/joshstevens19/ethereum-bloom-filters/blob/fbeb47b70b46243c3963fe1c2988d7461ef17236/src/index.ts#L7 + */ +export const isBloom = (bloom: ValidInputTypes): boolean => { + if (typeof bloom !== 'string') { + return false; + } + + if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) { + return false; + } + + if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) { + return true; + } + + return false; +}; + +/** + * Returns true if the value is part of the given bloom + * note: false positives are possible. + */ +export const isInBloom = (bloom: string, value: string | Uint8Array): boolean => { + if (typeof value === 'string' && !isHexStrict(value)) { + return false; + } + + if (!isBloom(bloom)) { + return false; + } + + const uint8Array = typeof value === 'string' ? hexToUint8Array(value) : value; + + const hash = uint8ArrayToHexString(keccak256(uint8Array)).slice(2); + + for (let i = 0; i < 12; i += 4) { + // calculate bit position in bloom filter that must be active + const bitpos = + // eslint-disable-next-line no-bitwise + ((parseInt(hash.slice(i, i + 2), 16) << 8) + parseInt(hash.slice(i + 2, i + 4), 16)) & + 2047; + + // test if bitpos in bloom is active + const code = codePointToInt(bloom.charCodeAt(bloom.length - 1 - Math.floor(bitpos / 4))); + + // eslint-disable-next-line no-bitwise + const offset = 1 << bitpos % 4; + + // eslint-disable-next-line no-bitwise + if ((code & offset) !== offset) { + return false; + } + } + + return true; +}; + +/** + * Returns true if the ethereum users address is part of the given bloom note: false positives are possible. + */ +export const isUserEthereumAddressInBloom = (bloom: string, ethereumAddress: string): boolean => { + if (!isBloom(bloom)) { + return false; + } + + if (!isAddress(ethereumAddress)) { + return false; + } + + // you have to pad the ethereum address to 32 bytes + // else the bloom filter does not work + // this is only if your matching the USERS + // ethereum address. Contract address do not need this + // hence why we have 2 methods + // (0x is not in the 2nd parameter of padleft so 64 chars is fine) + + const address = padLeft(ethereumAddress, 64); + + return isInBloom(bloom, address); +}; + +/** + * Returns true if the contract address is part of the given bloom. + * note: false positives are possible. + */ +export const isContractAddressInBloom = (bloom: string, contractAddress: string): boolean => { + if (!isBloom(bloom)) { + return false; + } + + if (!isAddress(contractAddress)) { + return false; + } + + return isInBloom(bloom, contractAddress); +}; diff --git a/packages/web3-validator/src/validation/boolean.ts b/packages/web3-validator/src/validation/boolean.ts new file mode 100644 index 00000000000..17593c8312c --- /dev/null +++ b/packages/web3-validator/src/validation/boolean.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ValidInputTypes } from '../types.js'; +import { isHexStrict } from './string.js'; + +export const isBoolean = (value: ValidInputTypes) => { + if (!['number', 'string', 'boolean'].includes(typeof value)) { + return false; + } + + if (typeof value === 'boolean') { + return true; + } + + if (typeof value === 'string' && !isHexStrict(value)) { + return value === '1' || value === '0'; + } + + if (typeof value === 'string' && isHexStrict(value)) { + return value === '0x1' || value === '0x0'; + } + + // type === number + return value === 1 || value === 0; +}; diff --git a/packages/web3-validator/src/validation/bytes.ts b/packages/web3-validator/src/validation/bytes.ts new file mode 100644 index 00000000000..68c431c50ee --- /dev/null +++ b/packages/web3-validator/src/validation/bytes.ts @@ -0,0 +1,75 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ValidInputTypes } from '../types.js'; +import { hexToUint8Array, parseBaseType } from '../utils.js'; +import { isHexStrict } from './string.js'; + +/** + * checks input if typeof data is valid Uint8Array input + */ +export const isUint8Array = (data: ValidInputTypes): data is Uint8Array => + data instanceof Uint8Array || data?.constructor?.name === 'Uint8Array'; + +export const isBytes = ( + value: ValidInputTypes | Uint8Array | number[], + options: { abiType: string; size?: never } | { size: number; abiType?: never } = { + abiType: 'bytes', + }, +) => { + if (typeof value !== 'string' && !Array.isArray(value) && !isUint8Array(value)) { + return false; + } + + // isHexStrict also accepts - prefix which can not exists in bytes + if (typeof value === 'string' && isHexStrict(value) && value.startsWith('-')) { + return false; + } + + if (typeof value === 'string' && !isHexStrict(value)) { + return false; + } + + let valueToCheck: Uint8Array; + + if (typeof value === 'string') { + if (value.length % 2 !== 0) { + // odd length hex + return false; + } + valueToCheck = hexToUint8Array(value); + } else if (Array.isArray(value)) { + if (value.some(d => d < 0 || d > 255 || !Number.isInteger(d))) { + return false; + } + valueToCheck = new Uint8Array(value); + } else { + valueToCheck = value; + } + + if (options?.abiType) { + const { baseTypeSize } = parseBaseType(options.abiType); + + return baseTypeSize ? valueToCheck.length === baseTypeSize : true; + } + + if (options?.size) { + return valueToCheck.length === options?.size; + } + + return true; +}; diff --git a/packages/web3-validator/src/validation/eth.ts b/packages/web3-validator/src/validation/eth.ts new file mode 100644 index 00000000000..774bba13a83 --- /dev/null +++ b/packages/web3-validator/src/validation/eth.ts @@ -0,0 +1,44 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { parseBaseType } from '../utils.js'; + +export const isValidEthBaseType = (type: string): boolean => { + const { baseType, baseTypeSize } = parseBaseType(type); + + if (!baseType) { + return false; + } + + if (baseType === type) { + return true; + } + + if ((baseType === 'int' || baseType === 'uint') && baseTypeSize) { + if (!(baseTypeSize <= 256 && baseTypeSize % 8 === 0)) { + return false; + } + } + + if (baseType === 'bytes' && baseTypeSize) { + if (!(baseTypeSize >= 1 && baseTypeSize <= 32)) { + return false; + } + } + + return true; +}; diff --git a/packages/web3-validator/src/validation/filter.ts b/packages/web3-validator/src/validation/filter.ts new file mode 100644 index 00000000000..2f13f08dbbf --- /dev/null +++ b/packages/web3-validator/src/validation/filter.ts @@ -0,0 +1,77 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Filter } from 'web3-types'; +import { isAddress } from './address.js'; +import { isBlockNumberOrTag } from './block.js'; +import { isNullish } from './object.js'; +import { isTopic } from './topic.js'; + +/** + * First we check if all properties in the provided value are expected, + * then because all Filter properties are optional, we check if the expected properties + * are defined. If defined and they're not the expected type, we immediately return false, + * otherwise we return true after all checks pass. + */ +export const isFilterObject = (value: Filter) => { + const expectedFilterProperties: (keyof Filter)[] = [ + 'fromBlock', + 'toBlock', + 'address', + 'topics', + 'blockHash', + ]; + if (isNullish(value) || typeof value !== 'object') return false; + + if ( + !Object.keys(value).every(property => + expectedFilterProperties.includes(property as keyof Filter), + ) + ) + return false; + + if ( + (!isNullish(value.fromBlock) && !isBlockNumberOrTag(value.fromBlock)) || + (!isNullish(value.toBlock) && !isBlockNumberOrTag(value.toBlock)) + ) + return false; + + if (!isNullish(value.address)) { + if (Array.isArray(value.address)) { + if (!value.address.every(address => isAddress(address))) return false; + } else if (!isAddress(value.address)) return false; + } + + if (!isNullish(value.topics)) { + if ( + !value.topics.every(topic => { + if (isNullish(topic)) return true; + + if (Array.isArray(topic)) { + return topic.every(nestedTopic => isTopic(nestedTopic)); + } + + if (isTopic(topic)) return true; + + return false; + }) + ) + return false; + } + + return true; +}; diff --git a/packages/web3-validator/src/validation/index.ts b/packages/web3-validator/src/validation/index.ts new file mode 100644 index 00000000000..17912899269 --- /dev/null +++ b/packages/web3-validator/src/validation/index.ts @@ -0,0 +1,28 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from './address.js'; +export * from './block.js'; +export * from './bloom.js'; +export * from './boolean.js'; +export * from './bytes.js'; +export * from './eth.js'; +export * from './filter.js'; +export * from './numbers.js'; +export * from './string.js'; +export * from './topic.js'; +export * from './object.js'; diff --git a/packages/web3-validator/src/validation/numbers.ts b/packages/web3-validator/src/validation/numbers.ts new file mode 100644 index 00000000000..276fb84dd1e --- /dev/null +++ b/packages/web3-validator/src/validation/numbers.ts @@ -0,0 +1,143 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ValidInputTypes } from '../types.js'; +import { parseBaseType, hexToNumber } from '../utils.js'; +import { isHexStrict } from './string.js'; + +/** + * Checks if a given value is a valid big int + */ +export const isBigInt = (value: ValidInputTypes): boolean => typeof value === 'bigint'; + +// Note: this could be simplified using ** operator, but babel does not handle it well +// you can find more at: https://github.com/babel/babel/issues/13109 and https://github.com/web3/web3.js/issues/6187 +/** @internal */ +export const bigintPower = (base: bigint, expo: bigint) => { + let res = base; + for (let index = 1; index < expo; index += 1) { + res *= base; + } + return res; +}; + +export const isUInt = ( + value: ValidInputTypes, + options: { abiType: string; bitSize?: never } | { bitSize: number; abiType?: never } = { + abiType: 'uint', + }, +) => { + if ( + !['number', 'string', 'bigint'].includes(typeof value) || + (typeof value === 'string' && value.length === 0) + ) { + return false; + } + + let size!: number; + + if (options?.abiType) { + const { baseTypeSize } = parseBaseType(options.abiType); + + if (baseTypeSize) { + size = baseTypeSize; + } + } else if (options.bitSize) { + size = options.bitSize; + } + + const maxSize = bigintPower(BigInt(2), BigInt(size ?? 256)) - BigInt(1); + + try { + const valueToCheck = + typeof value === 'string' && isHexStrict(value) + ? BigInt(hexToNumber(value)) + : BigInt(value as number); + + return valueToCheck >= 0 && valueToCheck <= maxSize; + } catch (error) { + // Some invalid number value given which can not be converted via BigInt + return false; + } +}; + +export const isInt = ( + value: ValidInputTypes, + options: { abiType: string; bitSize?: never } | { bitSize: number; abiType?: never } = { + abiType: 'int', + }, +) => { + if (!['number', 'string', 'bigint'].includes(typeof value)) { + return false; + } + + if (typeof value === 'number' && value > Number.MAX_SAFE_INTEGER) { + return false; + } + + let size!: number; + + if (options?.abiType) { + const { baseTypeSize, baseType } = parseBaseType(options.abiType); + + if (baseType !== 'int') { + return false; + } + + if (baseTypeSize) { + size = baseTypeSize; + } + } else if (options.bitSize) { + size = options.bitSize; + } + + const maxSize = bigintPower(BigInt(2), BigInt((size ?? 256) - 1)); + const minSize = BigInt(-1) * bigintPower(BigInt(2), BigInt((size ?? 256) - 1)); + + try { + const valueToCheck = + typeof value === 'string' && isHexStrict(value) + ? BigInt(hexToNumber(value)) + : BigInt(value as number); + + return valueToCheck >= minSize && valueToCheck <= maxSize; + } catch (error) { + // Some invalid number value given which can not be converted via BigInt + return false; + } +}; + +export const isNumber = (value: ValidInputTypes) => { + if (isInt(value)) { + return true; + } + + // It would be a decimal number + if ( + typeof value === 'string' && + /[0-9.]/.test(value) && + value.indexOf('.') === value.lastIndexOf('.') + ) { + return true; + } + + if (typeof value === 'number') { + return true; + } + + return false; +}; diff --git a/packages/web3-validator/src/validation/object.ts b/packages/web3-validator/src/validation/object.ts new file mode 100644 index 00000000000..1d1aba0a36e --- /dev/null +++ b/packages/web3-validator/src/validation/object.ts @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { TypedArray } from 'web3-types'; + +// Explicitly check for the +// eslint-disable-next-line @typescript-eslint/ban-types +export const isNullish = (item: unknown): item is undefined | null => + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + item === undefined || item === null; + +export const isObject = (item: unknown): item is Record => + typeof item === 'object' && + !isNullish(item) && + !Array.isArray(item) && + !(item instanceof TypedArray); diff --git a/packages/web3-validator/src/validation/string.ts b/packages/web3-validator/src/validation/string.ts new file mode 100644 index 00000000000..d586af70057 --- /dev/null +++ b/packages/web3-validator/src/validation/string.ts @@ -0,0 +1,90 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ValidInputTypes } from '../types.js'; + +/** + * checks input if typeof data is valid string input + */ +export const isString = (value: ValidInputTypes) => typeof value === 'string'; + +export const isHexStrict = (hex: ValidInputTypes) => + typeof hex === 'string' && /^((-)?0x[0-9a-f]+|(0x))$/i.test(hex); + +/** + * Is the string a hex string. + * + * @param value + * @param length + * @returns output the string is a hex string + */ +export function isHexString(value: string, length?: number): boolean { + if (typeof value !== 'string' || !value.match(/^0x[0-9A-Fa-f]*$/)) return false; + + if (typeof length !== 'undefined' && length > 0 && value.length !== 2 + 2 * length) + return false; + + return true; +} + +export const isHex = (hex: ValidInputTypes): boolean => + typeof hex === 'number' || + typeof hex === 'bigint' || + (typeof hex === 'string' && /^((-0x|0x|-)?[0-9a-f]+|(0x))$/i.test(hex)); + +export const isHexString8Bytes = (value: string, prefixed = true) => + prefixed ? isHexStrict(value) && value.length === 18 : isHex(value) && value.length === 16; + +export const isHexString32Bytes = (value: string, prefixed = true) => + prefixed ? isHexStrict(value) && value.length === 66 : isHex(value) && value.length === 64; + +/** + * Returns a `Boolean` on whether or not the a `String` starts with '0x' + * @param str the string input value + * @return a boolean if it is or is not hex prefixed + * @throws if the str input is not a string + */ +export function isHexPrefixed(str: string): boolean { + if (typeof str !== 'string') { + throw new Error(`[isHexPrefixed] input must be type 'string', received type ${typeof str}`); + } + + return str.startsWith('0x'); +} + +/** + * Checks provided Uint8Array for leading zeroes and throws if found. + * + * Examples: + * + * Valid values: 0x1, 0x, 0x01, 0x1234 + * Invalid values: 0x0, 0x00, 0x001, 0x0001 + * + * Note: This method is useful for validating that RLP encoded integers comply with the rule that all + * integer values encoded to RLP must be in the most compact form and contain no leading zero bytes + * @param values An object containing string keys and Uint8Array values + * @throws if any provided value is found to have leading zero bytes + */ +export const validateNoLeadingZeroes = function (values: { + [key: string]: Uint8Array | undefined; +}) { + for (const [k, v] of Object.entries(values)) { + if (v !== undefined && v.length > 0 && v[0] === 0) { + throw new Error(`${k} cannot have leading zeroes, received: ${v.toString()}`); + } + } +}; diff --git a/packages/web3-validator/src/validation/topic.ts b/packages/web3-validator/src/validation/topic.ts new file mode 100644 index 00000000000..4f5ed44c85d --- /dev/null +++ b/packages/web3-validator/src/validation/topic.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isBloom, isInBloom } from './bloom.js'; + +/** + * Checks if its a valid topic + */ +export const isTopic = (topic: string): boolean => { + if (typeof topic !== 'string') { + return false; + } + + if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) { + return false; + } + + if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) { + return true; + } + + return false; +}; + +/** + * Returns true if the topic is part of the given bloom. + * note: false positives are possible. + */ +export const isTopicInBloom = (bloom: string, topic: string): boolean => { + if (!isBloom(bloom)) { + return false; + } + + if (!isTopic(topic)) { + return false; + } + + return isInBloom(bloom, topic); +}; diff --git a/packages/web3-validator/src/validator.ts b/packages/web3-validator/src/validator.ts new file mode 100644 index 00000000000..82d7a596052 --- /dev/null +++ b/packages/web3-validator/src/validator.ts @@ -0,0 +1,180 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SchemaFormatError } from 'web3-errors'; +import { Web3ValidationErrorObject } from 'web3-types'; + +import { z, ZodType, ZodIssue, ZodIssueCode, ZodTypeAny } from 'zod'; + +import { RawCreateParams } from 'zod/lib/types'; +import { Web3ValidatorError } from './errors.js'; +import { Json, JsonSchema } from './types.js'; +import formats from './formats.js'; + +const convertToZod = (schema: JsonSchema): ZodType => { + if ((!schema?.type || schema?.type === 'object') && schema?.properties) { + const obj: { [key: string]: ZodType } = {}; + for (const name of Object.keys(schema.properties)) { + const zItem = convertToZod(schema.properties[name]); + if (zItem) { + obj[name] = zItem; + } + } + + if (Array.isArray(schema.required)) { + return z + .object(obj) + .partial() + .required(schema.required.reduce((acc, v: string) => ({ ...acc, [v]: true }), {})); + } + return z.object(obj).partial(); + } + + if (schema?.type === 'array' && schema?.items) { + if (Array.isArray(schema.items) && schema.items.length > 1 + && schema.maxItems !== undefined + && new Set(schema.items.map((item: JsonSchema) => item.$id)).size === schema.items.length) { + const arr: Partial<[ZodTypeAny, ...ZodTypeAny[]]> = []; + for (const item of schema.items) { + const zItem = convertToZod(item); + if (zItem) { + arr.push(zItem); + } + } + return z.tuple(arr as [ZodTypeAny, ...ZodTypeAny[]]); + } + const nextSchema = Array.isArray(schema.items) ? schema.items[0] : schema.items; + let zodArraySchema = z.array(convertToZod(nextSchema)); + + zodArraySchema = schema.minItems !== undefined ? zodArraySchema.min(schema.minItems) : zodArraySchema; + zodArraySchema = schema.maxItems !== undefined ? zodArraySchema.max(schema.maxItems) : zodArraySchema; + return zodArraySchema; + } + + if (schema.oneOf && Array.isArray(schema.oneOf)) { + return z.union( + schema.oneOf.map(oneOfSchema => convertToZod(oneOfSchema)) as [ + ZodTypeAny, + ZodTypeAny, + ...ZodTypeAny[], + ], + ); + } + + if (schema?.format) { + if (!formats[schema.format]) { + throw new SchemaFormatError(schema.format); + } + + return z.any().refine(formats[schema.format], (value: unknown) => ({ + params: { value, format: schema.format }, + })); + } + + if ( + schema?.type && + schema?.type !== 'object' && + typeof (z as unknown as { [key: string]: (params?: RawCreateParams) => ZodType })[ + String(schema.type) + ] === 'function' + ) { + return (z as unknown as { [key: string]: (params?: RawCreateParams) => ZodType })[ + String(schema.type) + ](); + } + return z.object({ data: z.any() }).partial(); +}; + +export class Validator { + // eslint-disable-next-line no-use-before-define + private static validatorInstance?: Validator; + + // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function + public static factory(): Validator { + if (!Validator.validatorInstance) { + Validator.validatorInstance = new Validator(); + } + return Validator.validatorInstance; + } + + public validate(schema: JsonSchema, data: Json, options?: { silent?: boolean }) { + const zod = convertToZod(schema); + const result = zod.safeParse(data); + if (!result.success) { + const errors = this.convertErrors(result.error?.issues ?? []); + if (errors) { + if (options?.silent) { + return errors; + } + throw new Web3ValidatorError(errors); + } + } + return undefined; + } + // eslint-disable-next-line class-methods-use-this + private convertErrors(errors: ZodIssue[] | undefined): Web3ValidationErrorObject[] | undefined { + if (errors && Array.isArray(errors) && errors.length > 0) { + return errors.map((error: ZodIssue) => { + let message; + let keyword; + let params; + let schemaPath; + + schemaPath = error.path.join('/'); + + const field = String(error.path[error.path.length - 1]); + const instancePath = error.path.join('/'); + if (error.code === ZodIssueCode.too_big) { + keyword = 'maxItems'; + schemaPath = `${instancePath}/maxItems`; + params = { limit: error.maximum }; + message = `must NOT have more than ${error.maximum} items`; + } else if (error.code === ZodIssueCode.too_small) { + keyword = 'minItems'; + schemaPath = `${instancePath}/minItems`; + params = { limit: error.minimum }; + message = `must NOT have fewer than ${error.minimum} items`; + } else if (error.code === ZodIssueCode.custom) { + const { value, format } = (error.params ?? {}) as { + value: unknown; + format: string; + }; + + if (typeof value === 'undefined') { + message = `value at "/${schemaPath}" is required`; + } else { + message = `value "${ + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + typeof value === 'object' ? JSON.stringify(value) : value + }" at "/${schemaPath}" must pass "${format}" validation`; + } + + params = { value }; + } + + return { + keyword: keyword ?? field, + instancePath: instancePath ? `/${instancePath}` : '', + schemaPath: schemaPath ? `#${schemaPath}` : '#', + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + params: params ?? { value: error.message }, + message: message ?? error.message, + } as Web3ValidationErrorObject; + }); + } + return undefined; + } +} diff --git a/packages/web3-validator/src/web3_validator.ts b/packages/web3-validator/src/web3_validator.ts new file mode 100644 index 00000000000..a165a36bef1 --- /dev/null +++ b/packages/web3-validator/src/web3_validator.ts @@ -0,0 +1,68 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3ValidationErrorObject } from 'web3-types'; + +import { Validator } from './validator.js'; +import { ethAbiToJsonSchema } from './utils.js'; +import { Json, ValidationSchemaInput, Web3ValidationOptions } from './types.js'; +import { Web3ValidatorError } from './errors.js'; + +export class Web3Validator { + private readonly _validator: Validator; + public constructor() { + this._validator = Validator.factory(); + } + public validateJSONSchema( + schema: object, + data: object, + options?: Web3ValidationOptions, + ): Web3ValidationErrorObject[] | undefined { + return this._validator.validate(schema, data as Json, options); + } + public validate( + schema: ValidationSchemaInput, + data: ReadonlyArray, + options: Web3ValidationOptions = { silent: false }, + ): Web3ValidationErrorObject[] | undefined { + const jsonSchema = ethAbiToJsonSchema(schema); + if ( + Array.isArray(jsonSchema.items) && + jsonSchema.items?.length === 0 && + data.length === 0 + ) { + return undefined; + } + + if ( + Array.isArray(jsonSchema.items) && + jsonSchema.items?.length === 0 && + data.length !== 0 + ) { + throw new Web3ValidatorError([ + { + instancePath: '/0', + schemaPath: '/', + keyword: 'required', + message: 'empty schema against data can not be validated', + params: data, + }, + ]); + } + + return this._validator.validate(jsonSchema, data as Json, options); + } +} diff --git a/packages/web3-validator/test/.eslintrc.js b/packages/web3-validator/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3-validator/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3-validator/test/config/jest.config.js b/packages/web3-validator/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3-validator/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3-validator/test/config/setup.js b/packages/web3-validator/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3-validator/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3-validator/test/fixtures/abi_to_json_schema.ts b/packages/web3-validator/test/fixtures/abi_to_json_schema.ts new file mode 100644 index 00000000000..35ed35bce6f --- /dev/null +++ b/packages/web3-validator/test/fixtures/abi_to_json_schema.ts @@ -0,0 +1,1780 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { FullValidationSchema, JsonSchema, ShortValidationSchema } from '../../src/types'; + +export type AbiToJsonSchemaCase = { + title: string; + abi: { + fullSchema: FullValidationSchema; + shortSchema: ShortValidationSchema; + data: Array; + }; + json: { + fullSchema: JsonSchema; + shortSchema: JsonSchema; + data: Record | Array; + }; +}; +const abiToJsonSchemaCases: AbiToJsonSchemaCase[] = [ + { + title: 'single param uint', + abi: { + fullSchema: [{ name: 'a', type: 'uint' }], + shortSchema: ['uint'], + data: [12], + }, + json: { + fullSchema: { + type: 'array', + items: [{ $id: 'a', format: 'uint', required: true }], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [{ $id: '/0/0', format: 'uint', required: true }], + minItems: 1, + maxItems: 1, + }, + data: [12], + }, + }, + { + title: 'single param address', + abi: { + fullSchema: [{ name: 'a', type: 'address' }], + shortSchema: ['address'], + data: ['0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b'], + }, + json: { + fullSchema: { + type: 'array', + items: [{ $id: 'a', format: 'address', required: true }], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [{ $id: '/0/0', format: 'address', required: true }], + minItems: 1, + maxItems: 1, + }, + data: ['0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b'], + }, + }, + { + title: 'single param bool', + abi: { + fullSchema: [{ name: 'a', type: 'bool' }], + shortSchema: ['bool'], + data: [true], + }, + json: { + fullSchema: { + type: 'array', + items: [{ $id: 'a', format: 'bool', required: true }], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [{ $id: '/0/0', format: 'bool', required: true }], + minItems: 1, + maxItems: 1, + }, + data: [true], + }, + }, + { + title: 'single param bytes', + abi: { + fullSchema: [{ name: 'a', type: 'bytes' }], + shortSchema: ['bytes'], + data: ['0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b'], + }, + json: { + fullSchema: { + type: 'array', + items: [{ $id: 'a', format: 'bytes', required: true }], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [{ $id: '/0/0', format: 'bytes', required: true }], + minItems: 1, + maxItems: 1, + }, + data: ['0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b'], + }, + }, + + { + title: 'multiple params', + abi: { + fullSchema: [ + { name: 'a', type: 'uint' }, + { name: 'b', type: 'int' }, + ], + shortSchema: ['uint', 'int'], + data: [12, -1], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { $id: 'a', format: 'uint', required: true }, + { $id: 'b', format: 'int', required: true }, + ], + minItems: 2, + maxItems: 2, + }, + shortSchema: { + type: 'array', + items: [ + { $id: '/0/0', format: 'uint', required: true }, + { $id: '/0/1', format: 'int', required: true }, + ], + minItems: 2, + maxItems: 2, + }, + data: [12, -1], + }, + }, + + { + title: 'single param array', + abi: { + fullSchema: [{ name: 'a', type: 'uint[]' }], + shortSchema: ['uint[]'], + data: [[12, 456]], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + $id: 'a', + type: 'array', + items: { format: 'uint', required: true }, + maxItems: undefined, + minItems: undefined, + }, + ], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + $id: '/0/0', + type: 'array', + items: { format: 'uint', required: true }, + }, + ], + minItems: 1, + maxItems: 1, + }, + data: [[12, 456]], + }, + }, + + { + title: 'single param fixed array', + abi: { + fullSchema: [{ name: 'a', type: 'uint[3]' }], + shortSchema: ['uint[3]'], + data: [[12, 456, 789]], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + $id: 'a', + type: 'array', + items: { format: 'uint', required: true }, + maxItems: 3, + minItems: 3, + }, + ], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + $id: '/0/0', + type: 'array', + items: { format: 'uint', required: true }, + maxItems: 3, + minItems: 3, + }, + ], + minItems: 1, + maxItems: 1, + }, + data: [[12, 456, 789]], + }, + }, + + { + title: 'multiple array params', + abi: { + fullSchema: [ + { name: 'a', type: 'uint[3]' }, + { name: 'b', type: 'int[]' }, + { name: 'c', type: 'string[5]' }, + ], + shortSchema: ['uint[3]', 'int[]', 'string[5]'], + data: [ + [12, 456, 789], + [-1, -2, -3, -4, -5], + ['a', 'b', 'c', 'd', 'e'], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + $id: 'a', + type: 'array', + items: { format: 'uint', required: true }, + maxItems: 3, + minItems: 3, + }, + { + $id: 'b', + type: 'array', + items: { format: 'int', required: true }, + maxItems: undefined, + minItems: undefined, + }, + { + $id: 'c', + type: 'array', + items: { format: 'string', required: true }, + maxItems: 5, + minItems: 5, + }, + ], + minItems: 3, + maxItems: 3, + }, + shortSchema: { + type: 'array', + items: [ + { + $id: '/0/0', + type: 'array', + items: { format: 'uint', required: true }, + maxItems: 3, + minItems: 3, + }, + { + $id: '/0/1', + type: 'array', + items: { format: 'int', required: true }, + maxItems: undefined, + minItems: undefined, + }, + { + $id: '/0/2', + type: 'array', + items: { format: 'string', required: true }, + maxItems: 5, + minItems: 5, + }, + ], + minItems: 3, + maxItems: 3, + }, + data: [ + [12, 456, 789], + [-1, -2, -3, -4, -5], + ['a', 'b', 'c', 'd', 'e'], + ], + }, + }, + + { + title: 'single tuple', + abi: { + fullSchema: [{ name: 'a', type: 'tuple', components: [{ name: 'b', type: 'uint' }] }], + shortSchema: [['uint']], + data: [[12]], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'a', + items: [{ $id: 'b', format: 'uint', required: true }], + minItems: 1, + maxItems: 1, + }, + ], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [{ $id: '/0/0/0', format: 'uint', required: true }], + minItems: 1, + maxItems: 1, + }, + ], + minItems: 1, + maxItems: 1, + }, + data: [{ b: 12 }], + }, + }, + + { + title: 'multiple tuple elements', + abi: { + fullSchema: [ + { + name: 'a', + type: 'tuple', + components: [ + { name: 'b', type: 'uint' }, + { name: 'c', type: 'string' }, + ], + }, + ], + shortSchema: [['uint', 'string']], + data: [[12, 'a']], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'a', + items: [ + { $id: 'b', format: 'uint', required: true }, + { $id: 'c', format: 'string', required: true }, + ], + minItems: 2, + maxItems: 2, + }, + ], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { $id: '/0/0/0', format: 'uint', required: true }, + { $id: '/0/0/1', format: 'string', required: true }, + ], + minItems: 2, + maxItems: 2, + }, + ], + minItems: 1, + maxItems: 1, + }, + data: [{ b: 12, c: 'a' }], + }, + }, + + { + title: 'tuple array', + abi: { + fullSchema: [ + { + name: 'a', + type: 'tuple[]', + components: [ + { name: 'a1', type: 'uint' }, + { name: 'a2', type: 'string' }, + ], + }, + ], + shortSchema: [['tuple[]', ['uint', 'string']]], + data: [ + [ + [12, 'a'], + [456, 'b'], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + $id: 'a', + type: 'array', + items: { + type: 'array', + items: [ + { $id: 'a1', format: 'uint', required: true }, + { $id: 'a2', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + maxItems: undefined, + minItems: undefined, + }, + ], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + $id: '/0/0', + type: 'array', + items: { + type: 'array', + items: [ + { $id: '/0/0/0', format: 'uint', required: true }, + { $id: '/0/0/1', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + maxItems: undefined, + minItems: undefined, + }, + ], + minItems: 1, + maxItems: 1, + }, + data: [ + [ + { a1: 12, a2: 'a' }, + { a1: 456, a2: 'b' }, + ], + ], + }, + }, + + { + title: 'fixed tuple array', + abi: { + fullSchema: [ + { + name: 'a', + type: 'tuple[3]', + components: [ + { name: 'a1', type: 'uint' }, + { name: 'a2', type: 'string' }, + ], + }, + ], + shortSchema: [['tuple[3]', ['uint', 'string']]], + data: [ + [ + [12, 'a'], + [456, 'b'], + [789, 'c'], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + $id: 'a', + type: 'array', + items: { + type: 'array', + items: [ + { $id: 'a1', format: 'uint', required: true }, + { $id: 'a2', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + maxItems: 3, + minItems: 3, + }, + ], + maxItems: 1, + minItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + $id: '/0/0', + type: 'array', + items: { + type: 'array', + items: [ + { $id: '/0/0/0', format: 'uint', required: true }, + { $id: '/0/0/1', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + maxItems: 3, + minItems: 3, + }, + ], + maxItems: 1, + minItems: 1, + }, + data: [ + [ + { a1: 12, a2: 'a' }, + { a1: 456, a2: 'b' }, + { a1: 789, a2: 'c' }, + ], + ], + }, + }, + + { + title: 'multiple tuple arrays', + abi: { + fullSchema: [ + { + name: 'a', + type: 'tuple[3]', + components: [ + { name: 'a1', type: 'uint' }, + { name: 'a2', type: 'string' }, + ], + }, + + { + name: 'b', + type: 'tuple[]', + components: [ + { name: 'b1', type: 'uint' }, + { name: 'b2', type: 'string' }, + ], + }, + ], + shortSchema: [ + ['tuple[3]', ['uint', 'string']], + ['tuple[]', ['uint', 'string']], + ], + data: [ + [ + [12, 'a1'], + [456, 'a2'], + [789, 'a3'], + ], + [ + [12, 'b1'], + [456, 'b2'], + [789, 'b3'], + [489, 'b4'], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'a', + items: { + type: 'array', + items: [ + { $id: 'a1', format: 'uint', required: true }, + { $id: 'a2', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + maxItems: 3, + minItems: 3, + }, + + { + type: 'array', + $id: 'b', + items: { + type: 'array', + items: [ + { $id: 'b1', format: 'uint', required: true }, + { $id: 'b2', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + maxItems: undefined, + minItems: undefined, + }, + ], + maxItems: 2, + minItems: 2, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: { + type: 'array', + items: [ + { $id: '/0/0/0', format: 'uint', required: true }, + { $id: '/0/0/1', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + maxItems: 3, + minItems: 3, + }, + { + type: 'array', + $id: '/0/1', + items: { + type: 'array', + items: [ + { $id: '/0/1/0', format: 'uint', required: true }, + { $id: '/0/1/1', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + }, + ], + maxItems: 2, + minItems: 2, + }, + data: [ + [ + { a1: 12, a2: 'a1' }, + { a1: 456, a2: 'a2' }, + { a1: 789, a2: 'a3' }, + ], + [ + { b1: 12, b2: 'b1' }, + { b1: 456, b2: 'b2' }, + { b1: 789, b2: 'b3' }, + { b1: 489, b2: 'b4' }, + ], + ], + }, + }, + + { + title: 'nested array example 1', + abi: { + fullSchema: [ + { + name: 'a', + type: 'uint[2][3]', + }, + ], + shortSchema: ['uint[2][3]'], + data: [ + [ + [1, 1], + [2, 2], + [3, 3], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'a', + items: [ + { + type: 'array', + $id: 'a', + items: { + format: 'uint', + required: true, + }, + minItems: 2, + maxItems: 2, + } + ], + maxItems: 3, + minItems: 3, + } + ], + maxItems: 1, + minItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { + type: 'array', + $id: '/0/0', + items: { + format: 'uint', + required: true, + }, + minItems: 2, + maxItems: 2, + } + ], + maxItems: 3, + minItems: 3, + } + ], + maxItems: 1, + minItems: 1, + }, + data: [ + [ + [1, 1], + [2, 2], + [3, 3], + ], + ], + }, + }, + + { + title: 'nested array example 2', + abi: { + fullSchema: [ + { + name: 'a', + type: 'uint[][3]', + }, + ], + shortSchema: ['uint[][3]'], + data: [ + [ + [1, 1], + [1, 2, 3], + [1, 2, 3, 4, 5, 6], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'a', + items: [ + { + type: 'array', + $id: 'a', + items: { + format: 'uint', + required: true, + } + } + ], + maxItems: 3, + minItems: 3, + } + ], + maxItems: 1, + minItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { + type: 'array', + $id: '/0/0', + items: { + format: 'uint', + required: true, + } + } + ], + maxItems: 3, + minItems: 3, + } + ], + maxItems: 1, + minItems: 1, + }, + data: [ + [ + [1, 1], + [1, 2, 3], + [1, 2, 3, 4, 5, 6], + ], + ], + }, + }, + + { + title: 'nested tuple example 1', + abi: { + fullSchema: [ + { + name: 'a', + type: 'tuple[][3]', + components: [ + { + name: 'level', + type: 'uint', + }, + { + name: 'message', + type: 'string', + }, + ], + }, + ], + shortSchema: [['tuple[][3]', ['uint', 'string']]], + data: [ + [ + [ + [1, '1'], + [2, '2'], + [3, '3'], + ], + [ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + [ + [1, '1'], + [2, '2'], + ], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'a', + items: [ + { + type: 'array', + $id: 'a', + items: { + type: 'array', + items: [ + { + $id: 'level', + format: 'uint', + required: true, + }, + { + $id: 'message', + format: 'string', + required: true, + } + ], + maxItems: 2, + minItems: 2, + } + } + ], + maxItems: 3, + minItems: 3, + } + ], + maxItems: 1, + minItems: 1 + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { + type: 'array', + $id: '/0/0', + items: { + type: 'array', + items: [ + { + $id: '/0/0/0', + format: 'uint', + required: true, + }, + { + $id: '/0/0/1', + format: 'string', + required: true, + } + ], + maxItems: 2, + minItems: 2, + } + } + ], + maxItems: 3, + minItems: 3, + } + ], + maxItems: 1, + minItems: 1 + }, + data: [ + [ + [ + { level: 1, message: '1' }, + { level: 2, message: '2' }, + { level: 3, message: '3' }, + ], + [ + { level: 1, message: '1' }, + { level: 2, message: '2' }, + { level: 3, message: '3' }, + { level: 4, message: '4' }, + { level: 5, message: '5' }, + { level: 6, message: '6' }, + ], + [ + { level: 1, message: '1' }, + { level: 2, message: '2' }, + ], + ], + ], + }, + }, + + { + title: 'nested tuple example 2', + abi: { + fullSchema: [ + { + name: 'a', + type: 'tuple[3][5]', + components: [ + { + name: 'level', + type: 'uint', + }, + { + name: 'message', + type: 'string', + }, + ], + }, + ], + shortSchema: [['tuple[3][5]', ['uint', 'string']]], + data: [ + [ + [ + [1, 'a'], + [2, 'b'], + [3, 'c'], + ], + [ + [1, 'a'], + [2, 'b'], + [3, 'c'], + ], + [ + [1, 'a'], + [2, 'b'], + [3, 'c'], + ], + [ + [1, 'a'], + [2, 'b'], + [3, 'c'], + ], + [ + [1, 'a'], + [2, 'b'], + [3, 'c'], + ], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'a', + items: [ + { + type: 'array', + $id: 'a', + items: { + type: 'array', + items: [ + { + $id: 'level', + format: 'uint', + required: true, + }, + { + $id: 'message', + format: 'string', + required: true, + } + ], + maxItems: 2, + minItems: 2, + }, + minItems: 3, + maxItems: 3, + } + ], + maxItems: 5, + minItems: 5, + } + ], + maxItems: 1, + minItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { + type: 'array', + $id: '/0/0', + items: { + type: 'array', + items: [ + { + $id: '/0/0/0', + format: 'uint', + required: true, + }, + { + $id: '/0/0/1', + format: 'string', + required: true, + } + ], + maxItems: 2, + minItems: 2, + }, + minItems: 3, + maxItems: 3, + } + ], + maxItems: 5, + minItems: 5, + } + ], + maxItems: 1, + minItems: 1, + }, + data: [ + [ + [ + { level: 1, message: 'a' }, + { level: 2, message: 'b' }, + { level: 3, message: 'c' }, + ], + [ + { level: 1, message: 'a' }, + { level: 2, message: 'b' }, + { level: 3, message: 'c' }, + ], + [ + { level: 1, message: 'a' }, + { level: 2, message: 'b' }, + { level: 3, message: 'c' }, + ], + [ + { level: 1, message: 'a' }, + { level: 2, message: 'b' }, + { level: 3, message: 'c' }, + ], + [ + { level: 1, message: 'a' }, + { level: 2, message: 'b' }, + { level: 3, message: 'c' }, + ], + ], + ], + }, + }, + + { + title: 'a user object example from truffle', + abi: { + fullSchema: [ + { + components: [ + { name: 'name', type: 'string' }, + { name: 'addr', type: 'address' }, + { + components: [ + { name: 'email', type: 'string' }, + { name: 'phone', type: 'string' }, + ], + name: 'contact', + type: 'tuple', + }, + ], + name: 'user', + type: 'tuple', + }, + ], + shortSchema: [['tuple', ['string', 'address', ['tuple', ['string', 'string']]]]], + data: [ + [ + 'Rick Sanchez', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + ['rick.c137@citadel.cfc', '+1 (555) 314-1593'], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'user', + items: [ + { $id: 'name', format: 'string', required: true }, + { $id: 'addr', format: 'address', required: true }, + { + type: 'array', + $id: 'contact', + items: [ + { $id: 'email', format: 'string', required: true }, + { $id: 'phone', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + ], + maxItems: 3, + minItems: 3, + }, + ], + maxItems: 1, + minItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { $id: '/0/0/0', format: 'string', required: true }, + { $id: '/0/0/1', format: 'address', required: true }, + { + type: 'array', + $id: '/0/0/2', + items: [ + { $id: '/0/0/2/0', format: 'string', required: true }, + { $id: '/0/0/2/1', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + ], + maxItems: 3, + minItems: 3, + }, + ], + maxItems: 1, + minItems: 1, + }, + data: [ + { + name: 'Rick Sanchez', + addr: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + contact: { + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + }, + ], + }, + }, + + { + title: 'a user object example from truffle', + abi: { + fullSchema: [ + { + components: [ + { name: 'name', type: 'string' }, + { name: 'addr', type: 'address' }, + { + components: [ + { name: 'email', type: 'string' }, + { name: 'phone', type: 'string' }, + ], + name: 'contact', + type: 'tuple', + }, + ], + name: 'user', + type: 'tuple', + }, + ], + shortSchema: [['tuple', ['string', 'address', ['tuple', ['string', 'string']]]]], + data: [ + [ + 'Rick Sanchez', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + ['rick.c137@citadel.cfc', '+1 (555) 314-1593'], + ], + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'user', + items: [ + { $id: 'name', format: 'string', required: true }, + { $id: 'addr', format: 'address', required: true }, + { + type: 'array', + $id: 'contact', + items: [ + { $id: 'email', format: 'string', required: true }, + { $id: 'phone', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + ], + maxItems: 3, + minItems: 3, + }, + ], + maxItems: 1, + minItems: 1, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { $id: '/0/0/0', format: 'string', required: true }, + { $id: '/0/0/1', format: 'address', required: true }, + { + type: 'array', + $id: '/0/0/2', + items: [ + { $id: '/0/0/2/0', format: 'string', required: true }, + { $id: '/0/0/2/1', format: 'string', required: true }, + ], + maxItems: 2, + minItems: 2, + }, + ], + maxItems: 3, + minItems: 3, + }, + ], + maxItems: 1, + minItems: 1, + }, + data: [ + { + name: 'Rick Sanchez', + addr: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + contact: { + email: 'rick.c137@citadel.cfc', + phone: '+1 (555) 314-1593', + }, + }, + ], + }, + }, + + { + title: 'nested tuple object in nested array', + abi: { + fullSchema: [ + { + components: [ + { + components: [ + { + name: 'x', + type: 'int256', + }, + { + name: 'y', + type: 'int256', + }, + ], + name: 'start', + type: 'tuple', + }, + { + components: [ + { + name: 'x', + type: 'int256', + }, + { + name: 'y', + type: 'int256', + }, + ], + name: 'end', + type: 'tuple', + }, + ], + name: 'rects', + type: 'tuple[][3]', + }, + { + name: 'numberValue', + type: 'uint256', + }, + { + name: 'boolValue', + type: 'bool', + }, + ], + shortSchema: [ + [ + 'tuple[][3]', + [ + ['int256', 'int256'], + ['int256', 'int256'], + ], + ], + 'uint256', + 'bool', + ], + data: [ + [ + [ + [ + [0, 0], + [1, 1], + ], + [ + [2, 2], + [3, 3], + ], + ], + [ + [ + [0, 0], + [-1, -1], + ], + [ + [-2, -2], + [-3, -3], + ], + [ + [-4, -4], + [-5, -5], + ], + ], + [ + [ + [4, 4], + [5, 5], + ], + ] + ], + 123, + true, + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'rects', + items: [ + { + type: 'array', + $id: 'rects', + items: { + type: 'array', + items: [ + { + type: 'array', + items: [ + { + $id: 'x', + format: 'int256', + required: true, + }, + { + $id: 'y', + format: 'int256', + required: true + } + ], + maxItems: 2, + minItems: 2, + $id: 'start', + }, + { + type: 'array', + items: [ + { + $id: 'x', + format: 'int256', + required: true, + }, + { + $id: 'y', + format: 'int256', + required: true, + } + ], + maxItems: 2, + minItems: 2, + $id: 'end', + } + ], + maxItems: 2, + minItems: 2, + } + } + ], + maxItems: 3, + minItems: 3, + }, + { + $id: 'numberValue', + format: 'uint256', + required: true, + }, + { + $id: 'boolValue', + format: 'bool', + required: true, + } + ], + maxItems: 3, + minItems: 3, + }, + shortSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: [ + { + type: 'array', + $id: '/0/0', + items: { + type: 'array', + items: [ + { + type: 'array', + items: [ + { + $id: '/0/0/0/0', + format: 'int256', + required: true, + }, + { + $id: '/0/0/0/1', + format: 'int256', + required: true, + } + ], + maxItems: 2, + minItems: 2, + $id: '/0/0/0', + }, + { + type: 'array', + items: [ + { + $id: '/0/0/1/0', + format: 'int256', + required: true, + }, + { + $id: '/0/0/1/1', + format: 'int256', + required: true, + } + ], + maxItems: 2, + minItems: 2, + $id: '/0/0/1', + } + ], + maxItems: 2, + minItems: 2, + } + } + ], + maxItems: 3, + minItems: 3, + }, + { + $id: '/0/1', + format: 'uint256', + required: true, + }, + { + $id: '/0/2', + format: 'bool', + required: true, + } + ], + maxItems: 3, + minItems: 3, + }, + data: [ + [ + [ + [ + { x: 0, y: 0 }, + { x: 1, y: 1 }, + ], + [ + { x: 2, y: 2 }, + { x: 3, y: 3 }, + ], + ], + [ + [ + { x: 0, y: 0 }, + { x: -1, y: -1 }, + ], + [ + { x: -2, y: -2 }, + { x: -3, y: -3 }, + ], + [ + { x: -4, y: -4 }, + { x: -5, y: -5 }, + ], + ], + [ + [ + { x: 4, y: 4 }, + { x: 5, y: 5 }, + ], + ], + ], + 123, + true, + ], + }, + }, + { + title: 'multi-dimensional array', + abi: { + fullSchema: [ + { + name: 'x1', + type: 'uint256[][]', + }, + { + name: 'x2', + type: 'uint256[][]', + }, + { + name: 'x3', + type: 'uint256', + }, + ], + shortSchema: ['uint256[][]', 'uint256[][]', 'uint256'], + data: [ + [ + [1, 1], + [2, 2], + ], + [ + [1, 1, 1], + [2, 2, 2], + [3, 3, 3], + ], + 42, + ], + }, + json: { + fullSchema: { + type: 'array', + items: [ + { + type: 'array', + $id: 'x1', + items: [ + { + type: 'array', + $id: 'x1', + items: { + format: 'uint256', + required: true, + } + } + ] + }, + { + type: 'array', + $id: 'x2', + items: [ + { + type: 'array', + $id: 'x2', + items: { + format: 'uint256', + required: true, + } + } + ] + }, + { + $id: 'x3', + format: 'uint256', + required: true, + } + ], + maxItems: 3, + minItems: 3, + }, + shortSchema: { + type: 'array', + items: [ + { + $id: '/0/0', + type: 'array', + items: [ + { + type: 'array', + $id: '/0/0', + items: { + format: 'uint256', + required: true, + }, + }, + ], + }, + { + $id: '/0/1', + type: 'array', + items: [ + { + type: 'array', + $id: '/0/1', + items: { + format: 'uint256', + required: true, + }, + }, + ], + }, + { + $id: '/0/2', + format: 'uint256', + required: true, + }, + ], + maxItems: 3, + minItems: 3, + }, + data: { + x1: [ + [1, 1], + [2, 2], + ], + x2: [ + [1, 1, 1], + [2, 2, 2], + [3, 3, 3], + ], + x3: 42, + }, + }, + }, +]; + +function generateSingleParamNumericCase(type: string, bitSize: number) { + return { + title: `single param ${type}${bitSize}`, + abi: { + fullSchema: [{ name: 'a', type: `${type}${bitSize}` }], + shortSchema: [`${type}${bitSize}`], + data: [12], + }, + json: { + fullSchema: { + type: 'array', + items: [{ $id: 'a', format: `${type}${bitSize}`, required: true }], + minItems: 1, + maxItems: 1, + }, + shortSchema: { + type: 'array', + items: [{ $id: '/0/0', format: `${type}${bitSize}`, required: true }], + minItems: 1, + maxItems: 1, + }, + data: [12], + }, + }; +} + +for (let i = 256; i >= 8; i -= 8) { + abiToJsonSchemaCases.unshift(generateSingleParamNumericCase('int', i)); + abiToJsonSchemaCases.unshift(generateSingleParamNumericCase('uint', i)); +} + +export { abiToJsonSchemaCases }; diff --git a/packages/web3-validator/test/fixtures/accounts.json b/packages/web3-validator/test/fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3-validator/test/fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3-validator/test/fixtures/errors.ts b/packages/web3-validator/test/fixtures/errors.ts new file mode 100644 index 00000000000..9b92474d582 --- /dev/null +++ b/packages/web3-validator/test/fixtures/errors.ts @@ -0,0 +1,50 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export const fullErrors: any[] = [ + { + instancePath: '', + schemaPath: '#/minItems', + keyword: 'minItems', + params: { limit: 1 }, + message: 'must NOT have fewer than 1 items', + }, + { + instancePath: '', + schemaPath: '#/minItems', + keyword: 'minItems', + params: { limit: 2 }, + message: 'must NOT have fewer than 2 items', + }, + { + instancePath: '', + schemaPath: '#/maxItems', + keyword: 'maxItems', + params: { limit: 1 }, + message: 'must NOT have more than 1 items', + }, +]; + +export const errorsWithInstanceNoParamsNoMessage: any[] = [ + { + keyword: 'eth', + instancePath: '/0', + schemaPath: '#/items/0/eth', + }, +]; + +export const unspecifiedErrors: any[] = [{}]; diff --git a/packages/web3-validator/test/fixtures/validation.ts b/packages/web3-validator/test/fixtures/validation.ts new file mode 100644 index 00000000000..6dc6b4c7388 --- /dev/null +++ b/packages/web3-validator/test/fixtures/validation.ts @@ -0,0 +1,768 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Filter } from 'web3-types'; +import { hexToBytes } from 'ethereum-cryptography/utils'; +import { ValidInputTypes } from '../../src/types'; + +export const validUintData: any[] = [ + '0x48', + '0x123c', + '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + '1', + 1, + BigInt(12), +]; + +// Using "null" value intentionally for validation +// eslint-disable-next-line no-null/no-null +export const invalidUintData: any[] = ['-0x48', '-12', -1, true, undefined, null, '']; + +export const validUintDataWithSize: [any, number][] = [ + ['0x48', 8], + ['0x123c', 16], + ['0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 256], + ['1', 16], + [1, 8], + [0, 8], + ['0x0', 8], + ['0x1', 8], + [BigInt(12), 64], +]; + +export const invalidUintDataWithSize: [any, number][] = [ + ['', 8], + [-1, 8], + ['-0x1233', 8], + ['0x4812', 8], + ['0x123ccdef', 16], + ['0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 8], +]; + +export const validUintDataWithAbiType: [any, string][] = [ + ['0x48', 'uint8'], + ['0x123c', 'uint16'], + ['0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 'uint256'], + ['1', 'uint16'], + [1, 'uint8'], + [BigInt(12), 'uint64'], +]; + +export const invalidUintDataWithAbiType: [any, string][] = [ + ['0x4812', 'uint8'], + ['0x123ccdef', 'uint16'], + ['0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 'uint8'], +]; + +export const validIntData: any[] = [ + '-0x48', + '-0x123c', + '-0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + '-1', + -1, + BigInt(-12), +]; + +// Using "null" value intentionally for validation +// eslint-disable-next-line no-null/no-null +export const invalidIntData: any[] = [true, undefined, null]; + +export const validIntDataWithSize: [any, number][] = [ + ['-0x48', 8], + ['-0x123c', 16], + ['-0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 256], + ['-1', 16], + [-1, 8], + [BigInt(-12), 64], +]; + +export const invalidIntDataWithSize: [any, number][] = [ + ['-0x4812', 8], + ['-0x123ccdef', 16], + ['-0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 8], + [Number.MAX_SAFE_INTEGER + 1, 256], +]; + +export const validIntDataWithAbiType: [any, string][] = [ + ['0x48', 'int8'], + ['0x123c', 'int16'], + ['0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 'int256'], + ['-1', 'int16'], + [-1, 'int8'], + [BigInt(-12), 'int64'], +]; + +export const invalidIntDataWithAbiType: [any, string][] = [ + ['-0x4812', 'uint8'], + ['-0x123ccdef', 'uint16'], + ['-0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', 'uint8'], +]; + +export const validHexStrictDataWithNumber: [string, number | bigint][] = [ + ['0x48', 72], + ['0x123c', 4668], + [ + '0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + BigInt('6297078121011128569053558207054331251192909352593326480842737114300118477835'), + ], + [ + '0xd115bffabbdd893a6f7cea402e7338643ced44a6', + BigInt('1193664110518272216229793131906554422260021413030'), + ], + [ + '0x2C941171bD2A7aEda7c2767c438DfF36EAaFdaFc', + BigInt('254497623817844434235817792799421766503337286396'), + ], + ['0x1', 1], + ['0xcd', 205], + ['-0xcd', -205], +]; +export const validHexStrictDataWithUint8Array: [string, Uint8Array][] = [ + ['0x48', new Uint8Array([72])], + ['0x123c', new Uint8Array([18, 60])], + [ + '0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0', + new Uint8Array([ + 0xde, 0xc0, 0x51, 0x8f, 0xa6, 0x72, 0xa7, 0x00, 0x27, 0xb0, 0x4c, 0x28, 0x65, 0x82, + 0xe5, 0x43, 0xab, 0x17, 0x31, 0x9f, 0xbd, 0xd3, 0x84, 0xfa, 0x7b, 0xc8, 0xf3, 0xd5, + 0xa5, 0x42, 0xc0, + ]), + ], + [ + '0xd115bffabbdd893a6f7cea402e7338643ced44a6', + new Uint8Array([ + 0xd1, 0x15, 0xbf, 0xfa, 0xbb, 0xdd, 0x89, 0x3a, 0x6f, 0x7c, 0xea, 0x40, 0x2e, 0x73, + 0x38, 0x64, 0x3c, 0xed, 0x44, 0xa6, + ]), + ], + ['0xcd', new Uint8Array([205])], + ['0x', new Uint8Array([])], + ['0x01', new Uint8Array([1])], + [ + '0x2C941171bD2A7aEda7c2767c438DfF36EAaFdaFc', + new Uint8Array([ + 0x2c, 0x94, 0x11, 0x71, 0xbd, 0x2a, 0x7a, 0xed, 0xa7, 0xc2, 0x76, 0x7c, 0x43, 0x8d, + 0xff, 0x36, 0xea, 0xaf, 0xda, 0xfc, + ]), + ], +]; + +export const invalidHexStrictStringData: [string][] = [ + ['0x1'], + ['-0x'], + // ['-0x1'], + ['0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c01'], + ['I have 100£'], +]; +export const validHexStrictData: any[] = [ + ...validHexStrictDataWithNumber.map(tuple => tuple[0]), + '-0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + '0x', + '0X', +]; + +export const invalidHexData: any[] = [ + 'Heeäööä👅D34ɝɣ24Єͽ', + '', + '-', + '-0x', + 'x', + '0x0x', + '0xH', + 'I have 100£', + '\u0000', + true, + false, + '0x407d73d8a49eeb85d32cf465507dd71d507100cG', // Invalid hex character "G" + {}, + // eslint-disable-next-line @typescript-eslint/no-empty-function + () => {}, + undefined, +]; + +export const invalidHexStrictData: any[] = [ + ...invalidHexData, + '45', + '-45', + '0', + 1, + BigInt(12), + BigInt(''), + BigInt(-255), + -42, + 4.2, +]; + +export const validHexData: any[] = [ + ...validHexStrictData, + '45', + '-45', + '0', + 1, + BigInt(12), + BigInt(-255), +]; + +export const isHexStringData: any[] = [ + { in: ['0x0000000000000000000000000000000000000000'], out: true }, + { in: ['0x0000000000000000000000000000000000000000', false], out: true }, + { in: ['0x0000000000000000000000000000000000000000', 2], out: false }, + { in: ['0x0000000000000000000000000000000000000000', undefined], out: true }, + { in: ['0x0001', 2], out: true }, + { in: ['0x0001', 3], out: false }, + { in: ['0x0001', 1], out: false }, + { in: ['123abcdefg'], out: false }, + { in: ['1x12345'], out: false }, + { in: ['123'], out: false }, + { in: [123], out: false }, + // eslint-disable-next-line no-null/no-null + { in: [null], out: false }, + { in: [false], out: false }, + { in: [{}], out: false }, +]; +export const isHexString8BytesData: any[] = [ + { in: ['0x0000000000000001', true], out: true }, + { in: ['0000000000000001', true], out: false }, + { in: ['0x0000000000000001', false], out: false }, + { in: ['0000000000000001', false], out: true }, + { in: [123, true], out: false }, + { in: [123, false], out: false }, + { in: [true, true], out: false }, + { in: [false, false], out: false }, + { in: [{}, true], out: false }, + { in: [{}, false], out: false }, +]; +export const isObjectData: any[] = [ + { in: 'asd', out: false }, + { in: [], out: false }, + { in: true, out: false }, + { in: false, out: false }, + { in: {}, out: true }, + // eslint-disable-next-line no-null/no-null + { in: null, out: false }, + { in: undefined, out: false }, + { in: new Uint8Array([0x61, 0x73, 0x64]), out: false }, +]; +export const isHexString32BytesData: any[] = [ + { in: ['0x0000000000000000000000000000000000000000000000000000000000000001', true], out: true }, + { in: ['0000000000000000000000000000000000000000000000000000000000000001', true], out: false }, + { + in: ['0x0000000000000000000000000000000000000000000000000000000000000001', false], + out: false, + }, + { in: ['0000000000000000000000000000000000000000000000000000000000000001', false], out: true }, + { in: [123, true], out: false }, + { in: [123, false], out: false }, + { in: [true, true], out: false }, + { in: [false, false], out: false }, + { in: [{}, true], out: false }, + { in: [{}, false], out: false }, +]; +export const isHexPrefixedData: any[] = [ + { in: '0x0000000000000000000000000000000000000000000000000000000000000001', out: true }, + { in: '0000000000000000000000000000000000000000000000000000000000000001', out: false }, +]; +export const validStringNumbersWithHex: [string, string][] = [ + ['72', '0x48'], + ['4668', '0x123c'], + [ + '6297078121011128569053558207054331251192909352593326480842737114300118477835', + '0xdec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + ], + [ + '1193664110518272216229793131906554422260021413030', + '0xd115bffabbdd893a6f7cea402e7338643ced44a6', + ], + [ + '254497623817844434235817792799421766503337286396', + '0x2C941171bD2A7aEda7c2767c438DfF36EAaFdaFc', + ], + ['1', '0x1'], + ['205', '0xcd'], + ['-205', '-0xcd'], +]; + +export const invalidStringNumbers: ValidInputTypes[] = [ + new Uint8Array([0x97, 0x98, 0x99]), + new Uint8Array(hexToBytes('abcd')), +]; +export const validCheckAddressCheckSumData: any[] = [ + '0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d', + '0x52908400098527886E0F7030069857D2E4169EE7', + '0x8617E340B3D01FA5F11F306F4090FD50E238070D', + '0x27b1fdb04752bbc536007a920d24acb045561c26', + '0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed', + '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', + '0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB', + '0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb', +]; + +export const invalidCheckAddressCheckSumData: any[] = [ + '0xc1912fee45d61c87cc5ea59dae31190fffff232d', + '0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', + '0XD1220A0CF47C7B9BE7A2E6BA89F429762E7B9ADB', + '1234', + '0xa1b2', +]; + +export const validAddressData: any[] = [ + '0xc6d9d2cd449a754c494264e1809c50e34d64562b', + 'c6d9d2cd449a754c494264e1809c50e34d64562b', + '0xE247A45c287191d435A8a5D72A7C8dc030451E9F', + '0xe247a45c287191d435a8a5d72a7c8dc030451e9f', + '0xE247A45C287191D435A8A5D72A7C8DC030451E9F', + '0XE247A45C287191D435A8A5D72A7C8DC030451E9F', + new Uint8Array(hexToBytes('0xE247A45C287191D435A8A5D72A7C8DC030451E9F')), +]; + +export const invalidAddressData: any[] = [ + ...invalidHexStrictData, + '0x1', + '0xE247a45c287191d435A8a5D72A7C8dc030451E9F', // Invalid checksum + '-0x407d73d8a49eeb85d32cf465507dd71d507100c1', +]; + +export const validBloomData: any[] = [ + '0x00000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000008000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000010000000000000000000000000000000000010000000000402000000000000000000000020000010000000000000000000000000000000000000000000000000000000000000', + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', +]; + +export const invalidBloomData: any[] = ['0x1100', '0x1212', 'test', 100]; + +export const validInBloomData: [string, string][] = [ + [ + '0x00000000200000000010000080000000000002000000000000000000000000000000000000020200000000000000000000800001000000000000000000200000000000000000000000000008000000800000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000080000000000000000000000100000000000000000000000002000000000001000080000000000000000000000000000000000020200010000000000000000000000000000000000000100000000000000000000000', + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + ], + [ + '0x00000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000008000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000010000000000000000000000000000000000010000000000402000000000000000000000020000010000000000000000000000000000000000000000000000000000000000000', + '0x6b175474e89094c44da98b954eedeac495271d0f', + ], + [ + '0x01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000800000000000000000000000000010018000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000010000000000000000000002000000000080000000000000000000000000000000000000000001000000100000000000000000000000000000000000000000000400000000000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000', + '0xf411903cbc70a74d22900a5de66a2dda66507255', + ], +]; + +export const invalidInBloomData: any[] = [ + [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + ], + [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0x6254B927ecC25DDd233aAECD5296D746B1C006B4', + ], + ['0x1100', '0x6254B927ecC25DDd233aAECD5296D746B1C006B4'], + ['0x1212', '0x6254B927ecC25DDd233aAECD5296D746B1C006B4'], + ['test', '0x6254B927ecC25DDd233aAECD5296D746B1C006B4'], + [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0xhello', + ], + [0, '0x6254B927ecC25DDd233aAECD5296D746B1C006B4'], + [ + // mix a and A + '0xaA000000200000000010000080000000000002000000000000000000000000000000000000020200000000000000000000800001000000000000000000200000000000000000000000000008000000800000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000080000000000000000000000100000000000000000000000002000000000001000080000000000000000000000000000000000020200010000000000000000000000000000000000000100000000000000000000000', + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + ], +]; + +export const validUserEthereumAddressInBloomData: any[] = [ + [ + '0x00000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000002000000000000000000000000000000100000000000000082000000000080000000000000000000000000000000000000000000000002000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + ], +]; + +export const invalidUserEthereumAddressInBloomData: any[] = [ + [ + '0x00000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000002000000000000000000000000000000100000000000000082000000000080000000000000000000000000000000000000000000000002000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0xea674fdde714fd979de3edf0f56aa9716b898ec8', + ], + [ + '0x00000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000002000000000000000000000000000000100000000000000082000000000080000000000000000000000000000000000000000000000002000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '0xH1', + ], + [ + // mix a and A + '0xaA000000200000000010000080000000000002000000000000000000000000000000000000020200000000000000000000800001000000000000000000200000000000000000000000000008000000800000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000080000000000000000000000100000000000000000000000002000000000001000080000000000000000000000000000000000020200010000000000000000000000000000000000000100000000000000000000000', + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + ], +]; + +export const validTopicData: any[] = [ + '0x0ce781a18c10c8289803c7c4cfd532d797113c4b41c9701ffad7d0a632ac555b', +]; + +export const invalidTopicData: any[] = [ + '0x0ce781a18c10c8289803c7c4cfd532d797113c4b41c9701ffad7d0a632ac55', +]; + +export const validTopicInBloomData: any[] = [ + [ + '0x00000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000001000000000000000000000000000000', + '0x0ce781a18c10c8289803c7c4cfd532d797113c4b41c9701ffad7d0a632ac555b', + ], +]; + +export const invalidTopicInBloomData: any[] = [ + [ + '0x00000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000001000000000000000000000000000000', + '0x9de781a18c10c8289803c7c4cfd532d797113c4b41c9701ffad7d0a632ac5567', + ], +]; + +export const validBigIntData: any[] = [BigInt('90071992547409911'), BigInt(42), BigInt('1337')]; + +export const invalidBigIntData: any[] = [3, '3', '3n']; + +// Uses same data defined in isHexStrictValidData minus negative hex strings +export const validBlockNumberData: any[] = [ + '0x48', + '0x123c', + '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + '0xd115bffabbdd893a6f7cea402e7338643ced44a6', + '0x2C941171bD2A7aEda7c2767c438DfF36EAaFdaFc', + '0x1', + '0xcd', + '1', + 0, + 12, + '0', + '0x0', + '0x12', +]; + +export const invalidBlockNumberData: any[] = [ + '45a', + '', + BigInt(-255), + -42, + 4.2, + '-0xcd', + '-0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', +]; + +export const validBlockTagData: string[] = ['latest', 'pending', 'earliest']; + +export const invalidBlockTagData: any[] = [ + 'User', + '0xal', + 'EARLIEST', + 'LATEST', + 'PENDING', + 'UNKNOWN', +]; + +export const validHexString8Bytes: (string | [string, false])[] = [ + '0x0000000000000001', + '0x00000000000c0ffe', + '0x0000123098409924', + ['0000000000000001', false], + ['00000000000c0ffe', false], + ['0000123098409924', false], +]; + +export const validHexString32BytesData: (string | [string, false])[] = [ + '0x22f30f0608f88c510de0016370f1525b330e5839026bdff93f9ceef24d2275e6', + '0x63a01bba0d4f0ad913a241aed52f5c55807be35f554536abd1e451d4e6515b29', + '0x687f28d48c22e9619b36776cf692501b3fc4e2143841efe3c7f45e49ea46b7f0', + ['22f30f0608f88c510de0016370f1525b330e5839026bdff93f9ceef24d2275e6', false], + ['63a01bba0d4f0ad913a241aed52f5c55807be35f554536abd1e451d4e6515b29', false], + ['687f28d48c22e9619b36776cf692501b3fc4e2143841efe3c7f45e49ea46b7f0', false], +]; + +export const validBooleanData: any[] = [true, false, 1, 0, '1', '0', '0x0', '0x1']; + +export const invalidBooleanData = invalidHexStrictData.filter( + data => data !== 1 && data !== 0 && data !== '0' && data !== '1' && typeof data !== 'boolean', +); +export const isTopicData: any[] = [ + { in: '0x0000000000000000000000000000000000000000000000000000000000000000', out: true }, + { in: '0x000000000000000000000000000000000000000000000000000000000000001a', out: true }, + { in: '0x000000000000000000000000000000000000000000000000000000000000001A', out: true }, + { in: '0x00000000000000000000000000000000000000000000000000000000000001aA', out: false }, + { in: '0x00000000000000000000000000000000000000000000000000000000000000000', out: false }, + { in: '0x000000000000000000000000000000000000000000000000000000000000000', out: false }, + { in: 123, out: false }, + // eslint-disable-next-line no-null/no-null + { in: null, out: false }, + { in: false, out: false }, + { in: {}, out: false }, +]; +export const isTopicInBloomData: any[] = [ + { in: [123, ''], out: false }, + // eslint-disable-next-line no-null/no-null + { in: [null, ''], out: false }, + { in: [false, ''], out: false }, + { in: [{}, ''], out: false }, + { + in: [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + 123, + ], + out: false, + }, + { + in: [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + // eslint-disable-next-line no-null/no-null + null, + ], + out: false, + }, + { + in: [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + false, + ], + out: false, + }, + { + in: [ + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + {}, + ], + out: false, + }, +]; +export const validFilterObjectData: Filter[] = [ + { + fromBlock: '0xc0ff3', + }, + { + toBlock: '0xc0ff3', + }, + { + address: '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + }, + { + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + }, + { + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + { + fromBlock: '0xc0ff3', + toBlock: '0xc0ff3', + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, +]; + +export const invalidFilterObjectData: any[] = [ + { + fromBlock: '42a', + }, + { + toBlock: -42, + }, + { + address: '0x98', + }, + { + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + ], + }, + { + topics: [ + '0x00000000000000000000000', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, + { + fromBlock: '0xc0ff3', + toBlock: '0xc0ff3', + address: [ + '0x98afe7a8d28bbc88dcf41f8e06d97c74958a47dc', + '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + 42, + ], + topics: [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + // Using "null" value intentionally for validation + // eslint-disable-next-line no-null/no-null + null, + [ + '0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b', + '0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc', + ], + ], + }, +]; + +export const validBytesData: any[] = [ + '0x10', + '0xafea', + [2, 3, 255], + new Uint8Array(hexToBytes('abce')), + new Uint8Array([0x91, 0x92]), +]; + +export const validBytesDataWithSize: [any, number][] = [ + ['0x10', 1], + [new Uint8Array(hexToBytes('abce')), 2], +]; + +export const invalidBytesDataWithSize: [any, number][] = [ + ['0x10', 2], + [new Uint8Array(hexToBytes('abce')), 1], +]; + +export const validBytesDataWithAbiType: [any, string][] = [ + ['0x10', 'bytes1'], + [new Uint8Array(hexToBytes('abce')), 'bytes2'], +]; + +export const invalidBytesDataWithAbiType: [any, string][] = [ + ['0x10', 'bytes2'], + [new Uint8Array(hexToBytes('abce')), 'bytes1'], +]; + +export const invalidBytesData: any[] = [ + '0xT1', + '1234', + // odd length hex string + '0x123', + 'hello', + [1, 2, -3, 4, 5], + [2, 3, 266], + ['world'], + '-0x12', +]; + +export const validEthTypeData: string[] = [ + 'int', + 'uint', + 'int8', + 'int16', + 'int32', + 'int64', + 'int128', + 'int256', + 'string', + 'int[]', + 'int8[]', + 'int8[]', + 'uint8[]', + 'int[2]', + 'int8[2]', + 'uint[2]', + 'uint8[2]', + 'string[]', + 'bytes[]', + 'bytes[2]', + 'bytes10', + 'bytes1', + 'bool', + 'address', + 'address[]', + 'address[2]', +]; + +export const invalidEthTypeData: string[] = [ + 'i', + 'int7', + 'int512', + 'int1024', + 'byte', + 'my-addresss', + 'boolean', +]; + +export const validCodePoints: [number, number][] = [ + [48, 0], + [51, 3], + [55, 7], + [57, 9], + [65, 10], + [70, 15], + [97, 10], + [100, 13], + [102, 15], +]; + +export const invalidCodePoints: number[] = [-100, -5, 0, 30, 58, 75, 90, 103, 200]; + +export const padLeftData: { padDigits: number; data: [ValidInputTypes, string][] } = { + padDigits: 64, + data: [ + [ + 'dfd5293d8e347dfe59e90efd55b2956a1343963d', + '000000000000000000000000dfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + [ + '-0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + '-0x000000000000000000000000dfd5293d8e347dfe59e90efd55b2956a1343963d', + ], + [2, '0x0000000000000000000000000000000000000000000000000000000000000002'], + ], +}; + +export const validNotBaseTypeData: { dataType: string; data: any }[] = [ + { dataType: 'hex', data: '0x000000000000000000000000dfd5293d8e347dfe59e90efd55b2956a1343963d' }, + { dataType: 'number', data: 42 }, + { dataType: 'blockNumber', data: 42 }, + { dataType: 'blockNumberOrTag', data: 'latest' }, + { + dataType: 'filter', + data: { + fromBlock: 'latest', + toBlock: 'latest', + }, + }, + { + dataType: 'bloom', + data: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + }, +]; diff --git a/packages/web3-validator/test/integration/jest.config.js b/packages/web3-validator/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3-validator/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3-validator/test/integration/setup.js b/packages/web3-validator/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/packages/web3-validator/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3-validator/test/integration/void.test.ts b/packages/web3-validator/test/integration/void.test.ts new file mode 100644 index 00000000000..9fe194cc5fc --- /dev/null +++ b/packages/web3-validator/test/integration/void.test.ts @@ -0,0 +1,22 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +describe('Web3 validator test', () => { + it('void', () => { + expect(1).toBe(1); + }); +}); diff --git a/packages/web3-validator/test/tsconfig.json b/packages/web3-validator/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3-validator/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3-validator/test/unit/convert_to_zod.test.ts b/packages/web3-validator/test/unit/convert_to_zod.test.ts new file mode 100644 index 00000000000..358e6a8b801 --- /dev/null +++ b/packages/web3-validator/test/unit/convert_to_zod.test.ts @@ -0,0 +1,79 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Validator } from '../../src/web3_validator'; + +describe('convert-to-zod', () => { + let validator: Web3Validator; + + beforeAll(() => { + validator = new Web3Validator(); + }); + + it('simple array', () => { + expect(() => + validator.validateJSONSchema( + { + type: 'array', + items: { type: 'string' }, + }, + ['a', 'b', 'c'], + ), + ).not.toThrow(); + }); + + it('simple object', () => { + expect(() => + validator.validateJSONSchema( + { + type: 'object', + properties: { + a: { type: 'number' }, + }, + }, + { a: 1 }, + ), + ).not.toThrow(); + }); + it('incorrect type to object', () => { + expect(() => + validator.validateJSONSchema( + { + type: 'object2', + properties: { + a: { type: 'number' }, + }, + }, + { a: 1 }, + ), + ).not.toThrow(); + }); + it('format with undefined value', () => { + expect(() => + validator.validateJSONSchema( + { + required: ['a'], + type: 'object', + properties: { + a: { format: 'uint' }, + }, + }, + { a: undefined }, + ), + ).toThrow(); + }); +}); diff --git a/packages/web3-validator/test/unit/default_validator.test.ts b/packages/web3-validator/test/unit/default_validator.test.ts new file mode 100644 index 00000000000..352cae826d2 --- /dev/null +++ b/packages/web3-validator/test/unit/default_validator.test.ts @@ -0,0 +1,26 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { validator } from '../../src/default_validator'; +import { Web3Validator } from '../../src/web3_validator'; + +describe('default web3-validator', () => { + it('should be instance', () => { + expect(validator).toBeDefined(); + expect(validator).toBeInstanceOf(Web3Validator); + }); +}); diff --git a/packages/web3-validator/test/unit/error.test.ts b/packages/web3-validator/test/unit/error.test.ts new file mode 100644 index 00000000000..14cf631c7c5 --- /dev/null +++ b/packages/web3-validator/test/unit/error.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3ValidationErrorObject } from 'web3-types'; + +import { Web3ValidatorError } from '../../src/errors'; +import { + fullErrors, + errorsWithInstanceNoParamsNoMessage, + unspecifiedErrors, +} from '../fixtures/errors'; + +describe('Web3ValidationError', () => { + it.each(fullErrors)('errors with message', (error: Web3ValidationErrorObject) => { + const validationError = new Web3ValidatorError([error]); + + expect(validationError).toBeInstanceOf(Web3ValidatorError); + expect(validationError.message).toBe(`Web3 validator found 1 error[s]:\n${error.message}`); + }); + + it.each(errorsWithInstanceNoParamsNoMessage)( + 'errors with only instance', + (error: Web3ValidationErrorObject) => { + const validationError = new Web3ValidatorError([error]); + + expect(validationError).toBeInstanceOf(Web3ValidatorError); + expect(validationError.message).toBe( + `Web3 validator found 1 error[s]:\nunspecified error`, + ); + }, + ); + + it.each(unspecifiedErrors)('unspecified errors', (error: Web3ValidationErrorObject) => { + const validationError = new Web3ValidatorError([error]); + + expect(validationError).toBeInstanceOf(Web3ValidatorError); + expect(validationError.message).toBe(`Web3 validator found 1 error[s]:\nunspecified error`); + }); +}); diff --git a/packages/web3-validator/test/unit/index.test.ts b/packages/web3-validator/test/unit/index.test.ts new file mode 100644 index 00000000000..efc2586580f --- /dev/null +++ b/packages/web3-validator/test/unit/index.test.ts @@ -0,0 +1,30 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import * as Validator from '../../src'; + +describe('main package', () => { + it('should import', () => { + expect(Validator.validator).toBeDefined(); + expect(Validator.Web3Validator).toBeDefined(); + expect(Validator.utils).toBeDefined(); + expect(Validator.Web3ValidatorError).toBeDefined(); + expect(Validator.VALID_ETH_BASE_TYPES).toBeDefined(); + + expect(Validator.validator).toBeInstanceOf(Validator.Web3Validator); + expect(Validator.VALID_ETH_BASE_TYPES).toBeInstanceOf(Array); + }); +}); diff --git a/packages/web3-validator/test/unit/jest.config.js b/packages/web3-validator/test/unit/jest.config.js new file mode 100644 index 00000000000..c524db4732b --- /dev/null +++ b/packages/web3-validator/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-validator-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3-validator/test/unit/utils.test.ts b/packages/web3-validator/test/unit/utils.test.ts new file mode 100644 index 00000000000..eac7d652bbf --- /dev/null +++ b/packages/web3-validator/test/unit/utils.test.ts @@ -0,0 +1,139 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { InvalidNumberError, InvalidBytesError } from 'web3-errors'; +import { ValidInputTypes } from '../../src/types'; +import { + ethAbiToJsonSchema, + transformJsonDataToAbiFormat, + codePointToInt, + hexToNumber, + numberToHex, + padLeft, + hexToUint8Array, + uint8ArrayToHexString, +} from '../../src/utils'; +import { abiToJsonSchemaCases } from '../fixtures/abi_to_json_schema'; +import { + validCodePoints, + invalidCodePoints, + validHexStrictDataWithNumber, + invalidHexData, + invalidHexStrictStringData, + validHexStrictData, + validStringNumbersWithHex, + invalidStringNumbers, + padLeftData, + validHexStrictDataWithUint8Array, +} from '../fixtures/validation'; + +describe('utils', () => { + describe('uint8Array', () => { + it.each(validHexStrictDataWithUint8Array)('uint8Array to hex', (res, input) => { + expect(uint8ArrayToHexString(input)).toEqual(res.toLowerCase()); + }); + describe('hex to uint8Array', () => { + it.each(validHexStrictDataWithUint8Array)('valid hex string data', (input, res) => { + expect(hexToUint8Array(input)).toEqual(res); + }); + + it.each(invalidHexStrictStringData)('invalidHexData', (input: string) => { + expect(() => { + hexToUint8Array(input); + }).toThrow(new InvalidBytesError(`hex string has odd length: ${input}`)); + }); + }); + }); + describe('ethAbiToJsonSchema', () => { + describe('full schema', () => { + it.each(abiToJsonSchemaCases)('$title', ({ abi, json }) => { + expect(ethAbiToJsonSchema(abi.fullSchema)).toEqual(json.fullSchema); + }); + }); + + describe('short schema', () => { + it.each(abiToJsonSchemaCases)('$title', ({ abi, json }) => { + expect(ethAbiToJsonSchema(abi.shortSchema)).toEqual(json.shortSchema); + }); + }); + }); + + describe('transformJsonDataToAbiFormat', () => { + describe('full schema', () => { + it.each(abiToJsonSchemaCases)('$title', ({ abi, json }) => { + expect(transformJsonDataToAbiFormat(abi.fullSchema, json.data)).toEqual(abi.data); + }); + }); + }); + + describe('codePointToInt', () => { + it.each(validCodePoints)('valid code points', (input, res) => { + expect(codePointToInt(input)).toEqual(res); + }); + + it.each(invalidCodePoints)('valid code points', (input: number) => { + expect(() => { + codePointToInt(input); + }).toThrow(new Error(`Invalid code point: ${input}`)); + }); + }); + + describe('hexToNumber', () => { + it.each(validHexStrictDataWithNumber)('valid hex string data', (input, res) => { + expect(hexToNumber(input)).toEqual(res); + }); + + it.each(invalidHexData)('invalidHexData', (input: string) => { + expect(() => { + hexToNumber(input); + }).toThrow(new Error('Invalid hex string')); + }); + }); + describe('numberToHex', () => { + it.each(validHexStrictDataWithNumber.map(tuple => [tuple[1], tuple[0]]))( + 'valid numbers and bigints', + (input, res) => { + expect(numberToHex(input)).toEqual((res as string).toLowerCase()); + }, + ); + + it.each(validHexStrictData)('valid hex strings', input => { + expect(numberToHex(input)).toEqual( + // if input is '' then numberToHex would return "0x0" + (input === '' ? '0x0' : (input as string)).toLowerCase(), + ); + }); + + it.each(validStringNumbersWithHex)('valid string numbers', (input, res) => { + expect(numberToHex(input)).toEqual(res.toLowerCase()); + }); + + it.each(invalidStringNumbers)('invalid string number', (input: ValidInputTypes) => { + expect(() => { + numberToHex(input); + }).toThrow(new InvalidNumberError(input)); + }); + }); + + describe('padLeft', () => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + it.each(padLeftData.data)('valid numbers and bigints', (input, res) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + expect(padLeft(input, padLeftData.padDigits)).toBe(res); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/address.test.ts b/packages/web3-validator/test/unit/validation/address.test.ts new file mode 100644 index 00000000000..8af782b79f4 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/address.test.ts @@ -0,0 +1,49 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { checkAddressCheckSum, isAddress } from '../../../src/validation/address'; +import { + validCheckAddressCheckSumData, + invalidAddressData, + validAddressData, +} from '../../fixtures/validation'; + +describe('validation', () => { + describe('address', () => { + describe('isAddress', () => { + describe('valid cases', () => { + it.each(validAddressData)('%s', input => { + expect(isAddress(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidAddressData)('%s', input => { + expect(isAddress(input)).toBeFalsy(); + }); + }); + }); + + describe('checkAddressCheckSum', () => { + describe('valid cases', () => { + it.each(validCheckAddressCheckSumData)('%s', input => { + expect(checkAddressCheckSum(input)).toBeTruthy(); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/block.test.ts b/packages/web3-validator/test/unit/validation/block.test.ts new file mode 100644 index 00000000000..d0007b3b3c3 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/block.test.ts @@ -0,0 +1,69 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isBlockNumber, isBlockNumberOrTag, isBlockTag } from '../../../src/validation/block'; +import { + invalidBlockNumberData, + invalidBlockTagData, + validBlockNumberData, + validBlockTagData, +} from '../../fixtures/validation'; + +describe('validation', () => { + describe('block', () => { + describe('isBlockNumber', () => { + describe('valid cases', () => { + it.each(validBlockNumberData)('%s', input => { + expect(isBlockNumber(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidBlockNumberData)('%s', input => { + expect(isBlockNumber(input)).toBeFalsy(); + }); + }); + }); + + describe('isBlockTag', () => { + describe('valid cases', () => { + it.each(validBlockTagData)('%s', input => { + expect(isBlockTag(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidBlockTagData)('%s', input => { + expect(isBlockTag(input)).toBeFalsy(); + }); + }); + }); + describe('isBlockNumberOrTag', () => { + describe('valid cases', () => { + it.each([...validBlockTagData, ...validBlockNumberData])('%j', input => { + expect(isBlockNumberOrTag(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each([...invalidBlockTagData, ...invalidBlockNumberData])('%o', input => { + expect(isBlockNumberOrTag(input)).toBeFalsy(); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/bloom.test.ts b/packages/web3-validator/test/unit/validation/bloom.test.ts new file mode 100644 index 00000000000..ef20809cf84 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/bloom.test.ts @@ -0,0 +1,84 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + isBloom, + isContractAddressInBloom, + isInBloom, + isUserEthereumAddressInBloom, +} from '../../../src/validation/bloom'; +import { + validBloomData, + invalidInBloomData, + validInBloomData, + invalidUserEthereumAddressInBloomData, + validUserEthereumAddressInBloomData, +} from '../../fixtures/validation'; + +describe('validation', () => { + describe('bloom', () => { + describe('isBloom', () => { + describe('valid cases', () => { + it.each(validBloomData)('%s', input => { + expect(isBloom(input)).toBeTruthy(); + }); + }); + }); + + describe('isInBloom', () => { + describe('valid cases', () => { + it.each(validInBloomData)('%s', (bloom, value) => { + expect(isInBloom(bloom, value)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidInBloomData)('%s', (bloom, value) => { + expect(isInBloom(bloom, value)).toBeFalsy(); + }); + }); + }); + + describe('isUserEthereumAddressInBloom', () => { + describe('valid cases', () => { + it.each(validUserEthereumAddressInBloomData)('%s', (bloom, address) => { + expect(isUserEthereumAddressInBloom(bloom, address)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidUserEthereumAddressInBloomData)('%s', (bloom, address) => { + expect(isUserEthereumAddressInBloom(bloom, address)).toBeFalsy(); + }); + }); + }); + + describe('isContractAddressInBloom', () => { + describe('valid cases', () => { + it.each(validInBloomData)('%s', (bloom, address) => { + expect(isContractAddressInBloom(bloom, address)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidUserEthereumAddressInBloomData)('%s', (bloom, address) => { + expect(isContractAddressInBloom(bloom, address)).toBeFalsy(); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/boolean.test.ts b/packages/web3-validator/test/unit/validation/boolean.test.ts new file mode 100644 index 00000000000..51670fdcb39 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/boolean.test.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isBoolean } from '../../../src/validation/boolean'; +import { invalidBooleanData, validBooleanData } from '../../fixtures/validation'; + +describe('validation', () => { + describe('boolean', () => { + describe('isBoolean', () => { + describe('valid cases', () => { + it.each(validBooleanData)('%s', input => { + expect(isBoolean(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidBooleanData)('%s', input => { + expect(isBoolean(input)).toBeFalsy(); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/bytes.test.ts b/packages/web3-validator/test/unit/validation/bytes.test.ts new file mode 100644 index 00000000000..cf538877048 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/bytes.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isBytes } from '../../../src/validation/bytes'; +import { + invalidBytesData, + invalidBytesDataWithAbiType, + invalidBytesDataWithSize, + validBytesData, + validBytesDataWithAbiType, + validBytesDataWithSize, +} from '../../fixtures/validation'; + +describe('validation', () => { + describe('bytes', () => { + describe('isBytes', () => { + describe('raw bytes', () => { + describe('valid cases', () => { + it.each(validBytesData)('%s', input => { + expect(isBytes(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidBytesData)('%s', input => { + expect(isBytes(input)).toBeFalsy(); + }); + }); + }); + + describe('bytes with size', () => { + describe('valid cases', () => { + it.each(validBytesDataWithSize)('%s', (input, size) => { + expect(isBytes(input, { size })).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidBytesDataWithSize)('%s', (input, size) => { + expect(isBytes(input, { size })).toBeFalsy(); + }); + }); + }); + + describe('bytes with abiType', () => { + describe('valid cases', () => { + it.each(validBytesDataWithAbiType)('%s', (input, abiType) => { + expect(isBytes(input, { abiType })).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidBytesDataWithAbiType)('%s', (input, abiType) => { + expect(isBytes(input, { abiType })).toBeFalsy(); + }); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/eth.test.ts b/packages/web3-validator/test/unit/validation/eth.test.ts new file mode 100644 index 00000000000..a7bbe2396ab --- /dev/null +++ b/packages/web3-validator/test/unit/validation/eth.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isValidEthBaseType } from '../../../src/validation/eth'; + +import { invalidEthTypeData, validEthTypeData } from '../../fixtures/validation'; + +describe('validation', () => { + describe('eth', () => { + describe('isValidEthType', () => { + describe('valid cases', () => { + it.each(validEthTypeData)('%s', input => { + expect(isValidEthBaseType(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidEthTypeData)('%s', input => { + expect(isValidEthBaseType(input)).toBeFalsy(); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/filter.test.ts b/packages/web3-validator/test/unit/validation/filter.test.ts new file mode 100644 index 00000000000..e279cef91e3 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/filter.test.ts @@ -0,0 +1,56 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isTopic, isTopicInBloom } from '../../../src/validation/topic'; +import { + invalidTopicData, + invalidTopicInBloomData, + validTopicData, + validTopicInBloomData, +} from '../../fixtures/validation'; + +describe('validation', () => { + describe('topic', () => { + describe('isTopic', () => { + describe('valid cases', () => { + it.each(validTopicData)('%s', input => { + expect(isTopic(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidTopicData)('%s', input => { + expect(isTopic(input)).toBeFalsy(); + }); + }); + }); + + describe('isTopicInBloom', () => { + describe('valid cases', () => { + it.each(validTopicInBloomData)('%s', (bloom, topic) => { + expect(isTopicInBloom(bloom, topic)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidTopicInBloomData)('%s', (bloom, topic) => { + expect(isTopicInBloom(bloom, topic)).toBeFalsy(); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/numbers.test.ts b/packages/web3-validator/test/unit/validation/numbers.test.ts new file mode 100644 index 00000000000..148a4515402 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/numbers.test.ts @@ -0,0 +1,140 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isBigInt, isInt, isUInt } from '../../../src/validation/numbers'; +import { + validBigIntData, + invalidBigIntData, + validUintData, + invalidUintData, + validUintDataWithSize, + invalidUintDataWithSize, + validUintDataWithAbiType, + invalidUintDataWithAbiType, + validIntData, + invalidIntData, + validIntDataWithSize, + invalidIntDataWithSize, + validIntDataWithAbiType, + invalidIntDataWithAbiType, +} from '../../fixtures/validation'; + +describe('validation', () => { + describe('numbers', () => { + describe('isBigInt', () => { + describe('valid cases', () => { + it.each(validBigIntData)('%s', value => { + expect(isBigInt(value)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidBigIntData)('%s', value => { + expect(isBigInt(value)).toBeFalsy(); + }); + }); + }); + + describe('isUInt', () => { + describe('raw number', () => { + describe('valid cases', () => { + it.each(validUintData)('%s', value => { + expect(isUInt(value)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidUintData)('%s', value => { + expect(isUInt(value)).toBeFalsy(); + }); + }); + }); + + describe('number with size', () => { + describe('valid cases', () => { + it.each(validUintDataWithSize)('%s', (value, bitSize) => { + expect(isUInt(value, { bitSize })).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidUintDataWithSize)('%s', (value, bitSize) => { + expect(isUInt(value, { bitSize })).toBeFalsy(); + }); + }); + }); + + describe('number with abi type', () => { + describe('valid cases', () => { + it.each(validUintDataWithAbiType)('%s', (value, abiType) => { + expect(isUInt(value, { abiType })).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidUintDataWithAbiType)('%s', (value, abiType) => { + expect(isUInt(value, { abiType })).toBeFalsy(); + }); + }); + }); + }); + + describe('isInt', () => { + describe('raw number', () => { + describe('valid cases', () => { + it.each(validIntData)('%s', value => { + expect(isInt(value)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidIntData)('%s', value => { + expect(isInt(value)).toBeFalsy(); + }); + }); + }); + + describe('number with size', () => { + describe('valid cases', () => { + it.each(validIntDataWithSize)('%s', (value, bitSize) => { + expect(isInt(value, { bitSize })).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidIntDataWithSize)('%s', (value, bitSize) => { + expect(isInt(value, { bitSize })).toBeFalsy(); + }); + }); + }); + + describe('number with abi type', () => { + describe('valid cases', () => { + it.each(validIntDataWithAbiType)('%s', (value, abiType) => { + expect(isInt(value, { abiType })).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidIntDataWithAbiType)('%s', (value, abiType) => { + expect(isInt(value, { abiType })).toBeFalsy(); + }); + }); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/object.test.ts b/packages/web3-validator/test/unit/validation/object.test.ts new file mode 100644 index 00000000000..debd89ec2f5 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/object.test.ts @@ -0,0 +1,29 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isObject } from '../../../src/validation/object'; +import { isObjectData } from '../../fixtures/validation'; + +describe('validation', () => { + describe('object', () => { + describe('isObject', () => { + it.each(isObjectData)('%s', data => { + expect(isObject(data.in)).toBe(data.out); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/string.test.ts b/packages/web3-validator/test/unit/validation/string.test.ts new file mode 100644 index 00000000000..862510edb22 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/string.test.ts @@ -0,0 +1,160 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'ethereum-cryptography/utils'; +import { + isString, + isHex, + isHexStrict, + isHexString, + isHexString8Bytes, + isHexString32Bytes, + isHexPrefixed, + validateNoLeadingZeroes, +} from '../../../src/validation/string'; +import { + invalidHexData, + invalidHexStrictData, + validHexStrictData, + validHexData, + isHexStringData, + isHexString8BytesData, + isHexString32BytesData, + isHexPrefixedData, +} from '../../fixtures/validation'; + +describe('validation', () => { + describe('string', () => { + describe('isString', () => { + it('should return true for a string value', () => { + expect(isString('string')).toBeTruthy(); + }); + + it.each([12, true, BigInt(12)])( + 'should return false for a non-string value: %s', + value => { + expect(isString(value)).toBeFalsy(); + }, + ); + }); + + describe('isHexStrict', () => { + describe('valid cases', () => { + it.each(validHexStrictData)('%s', input => { + expect(isHexStrict(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidHexStrictData)('%s', input => { + expect(isHexStrict(input)).toBeFalsy(); + }); + }); + }); + + describe('isHex', () => { + describe('valid cases', () => { + it.each(validHexData)('%s', input => { + expect(isHex(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidHexData)('%s', input => { + expect(isHex(input)).toBeFalsy(); + }); + }); + }); + describe('isHexString', () => { + it.each(isHexStringData)('%s', data => { + expect(isHexString(data.in[0], data.in[1])).toBe(data.out); + }); + }); + describe('isHexString8Bytes', () => { + it.each(isHexString8BytesData)('%s', data => { + expect(isHexString8Bytes(data.in[0], data.in[1])).toBe(data.out); + }); + }); + describe('isHexString32Bytes', () => { + it.each(isHexString32BytesData)('%s', data => { + expect(isHexString32Bytes(data.in[0], data.in[1])).toBe(data.out); + }); + }); + describe('isHexPrefixed', () => { + it.each(isHexPrefixedData)('%s', data => { + expect(isHexPrefixed(data.in)).toBe(data.out); + }); + it('should fails', () => { + expect(() => { + // @ts-expect-error no type validation + isHexPrefixed(1); + }).toThrow(`[isHexPrefixed] input must be type 'string', received type number`); + expect(() => { + // @ts-expect-error no type validation + isHexPrefixed(false); + }).toThrow(`[isHexPrefixed] input must be type 'string', received type boolean`); + expect(() => { + // @ts-expect-error no type validation + isHexPrefixed(true); + }).toThrow(`[isHexPrefixed] input must be type 'string', received type boolean`); + expect(() => { + // @ts-expect-error no type validation + isHexPrefixed({}); + }).toThrow(`[isHexPrefixed] input must be type 'string', received type object`); + expect(() => { + // @ts-expect-error no type validation + isHexPrefixed([]); + }).toThrow(`[isHexPrefixed] input must be type 'string', received type object`); + }); + }); + + describe('validateNoLeadingZeroes', () => { + it.each(isHexPrefixedData)('%s', data => { + expect(isHexPrefixed(data.in)).toBe(data.out); + }); + it('valid', () => { + const noLeadingZeroes = { + a: hexToBytes('0x1230'), + }; + const noleadingZeroBytes = { + a: hexToBytes('0x01'), + }; + const emptyUint8Array = { + a: hexToBytes('0x'), + }; + const undefinedValue = { + a: undefined, + }; + + expect(() => validateNoLeadingZeroes(noLeadingZeroes)).not.toThrow(); + expect(() => validateNoLeadingZeroes(emptyUint8Array)).not.toThrow(); + expect(() => validateNoLeadingZeroes(undefinedValue)).not.toThrow(); + expect(() => validateNoLeadingZeroes(noleadingZeroBytes)).not.toThrow(); + }); + it('fails', () => { + const leadingZeroBytes = { + a: hexToBytes('0x0010'), + }; + const onlyZeroes = { + a: hexToBytes('0x00'), + }; + + expect(() => validateNoLeadingZeroes(leadingZeroBytes)).toThrow(); + expect(() => validateNoLeadingZeroes(onlyZeroes)).toThrow(); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validation/topic.test.ts b/packages/web3-validator/test/unit/validation/topic.test.ts new file mode 100644 index 00000000000..fe062f8e9f5 --- /dev/null +++ b/packages/web3-validator/test/unit/validation/topic.test.ts @@ -0,0 +1,57 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { isFilterObject } from '../../../src/validation/filter'; +import { + invalidFilterObjectData, + isTopicData, + isTopicInBloomData, + validFilterObjectData, +} from '../../fixtures/validation'; +import { isTopic, isTopicInBloom } from '../../../src/validation/topic'; + +describe('validation', () => { + describe('filter', () => { + describe('isFilterObject', () => { + describe('valid cases', () => { + it.each(validFilterObjectData)('%s', input => { + expect(isFilterObject(input)).toBeTruthy(); + }); + }); + + describe('invalid cases', () => { + it.each(invalidFilterObjectData)('%s', input => { + expect(isFilterObject(input)).toBeFalsy(); + }); + }); + }); + }); + describe('isTopic', () => { + describe('valid cases', () => { + it.each(isTopicData)('%s', data => { + expect(isTopic(data.in)).toBe(data.out); + }); + }); + }); + describe('isTopicInBloom', () => { + describe('valid cases', () => { + it.each(isTopicInBloomData)('%s', data => { + expect(isTopicInBloom(data.in[0], data.in[1])).toBe(data.out); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/validator.test.ts b/packages/web3-validator/test/unit/validator.test.ts new file mode 100644 index 00000000000..e8afc8045d0 --- /dev/null +++ b/packages/web3-validator/test/unit/validator.test.ts @@ -0,0 +1,127 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Validator } from '../../src/validator'; +import formats from '../../src/formats'; + +const formatNames = [ + 'address', + 'bloom', + 'blockNumber', + 'blockTag', + 'blockNumberOrTag', + 'bool', + 'bytes', + 'filter', + 'hex', + 'uint', + 'int', + 'number', + 'string', +]; + +describe('instance of validator', () => { + let validator: Validator; + beforeAll(() => { + validator = Validator.factory(); + }); + it('instance', () => { + expect(validator).toBeDefined(); + expect(validator.validate).toBeDefined(); + }); + + it('convertErrors', () => { + const schema = { + type: 'array', + items: { + format: 'uint', + }, + }; + // @ts-expect-error-next-line + expect(validator.convertErrors(undefined, schema, [])).toBeUndefined(); + }); + it('formats exists', () => { + for (const f of formatNames) { + expect(typeof formats[f]).toBe('function'); + } + for (let i = 3; i <= 8; i += 1) { + const bitSize = 2 ** i; + expect(typeof formats[`int${bitSize}`]).toBe('function'); + expect(typeof formats[`uint${bitSize}`]).toBe('function'); + } + for (let size = 1; size <= 32; size += 1) { + expect(typeof formats[`bytes${size}`]).toBe('function'); + } + }); + it('formats call', () => { + expect(formats.address('0x7ab80aeb6bb488b7f6c41c58e83ef248eb39c882')).toBe(true); + expect(formats.address('0x7ab80aeb6bb488b7f6c41c58e83ef248eb39c88')).toBe(false); + + expect(formats.bloom(`0x${'0'.repeat(512)}`)).toBe(true); + expect(formats.bloom(`0x${'0'.repeat(511)}`)).toBe(false); + + expect(formats.blockNumber(1)).toBe(true); + expect(formats.blockNumber(-1)).toBe(false); + + expect(formats.uint(1)).toBe(true); + expect(formats.uint(-1)).toBe(false); + + expect(formats.int(1)).toBe(true); + expect(formats.int(1.1)).toBe(false); + + expect(formats.number(1)).toBe(true); + expect(formats.number([])).toBe(false); + + expect(formats.string('1')).toBe(true); + expect(formats.string(1)).toBe(false); + + expect(formats.hex('0x1')).toBe(true); + expect(formats.hex('1')).toBe(false); + + expect(formats.blockTag('latest')).toBe(true); + expect(formats.blockTag('latest2')).toBe(false); + + expect(formats.blockNumberOrTag(1)).toBe(true); + expect(formats.blockNumberOrTag('latest')).toBe(true); + expect(formats.blockNumberOrTag(-1)).toBe(false); + expect(formats.blockNumberOrTag('latest2')).toBe(false); + + expect(formats.bool(true)).toBe(true); + expect(formats.bool(false)).toBe(true); + expect(formats.bool('')).toBe(false); + expect(formats.bool([])).toBe(false); + + expect(formats.bytes([1, 2])).toBe(true); + expect(formats.bytes(-1)).toBe(false); + + expect(formats.filter({ fromBlock: 'latest' })).toBe(true); + expect(formats.filter({ fromBlock2: 'latest' })).toBe(false); + + for (let i = 3; i <= 8; i += 1) { + const bitSize = 2 ** i; + expect(formats[`int${bitSize}`](1)).toBe(true); + expect(formats[`int${bitSize}`](1.1)).toBe(false); + expect(formats[`uint${bitSize}`](1)).toBe(true); + expect(formats[`uint${bitSize}`](-1)).toBe(false); + } + for (let size = 1; size <= 32; size += 1) { + const value = `0x${'aa'.repeat(size)}`; + expect(formats[`bytes${size}`](value)).toBe(true); + expect(formats[`bytes${size}`](-1)).toBe(false); + } + }); +}); diff --git a/packages/web3-validator/test/unit/web3_validator.test.ts b/packages/web3-validator/test/unit/web3_validator.test.ts new file mode 100644 index 00000000000..ae04d036762 --- /dev/null +++ b/packages/web3-validator/test/unit/web3_validator.test.ts @@ -0,0 +1,172 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SchemaFormatError } from 'web3-errors' +import { abiToJsonSchemaCases } from '../fixtures/abi_to_json_schema'; +import { Web3Validator } from '../../src/web3_validator'; +import { Web3ValidatorError } from '../../src/errors'; +import { validNotBaseTypeData } from '../fixtures/validation'; + +describe('web3-validator', () => { + describe('Web3Validator', () => { + let validator: Web3Validator; + + beforeEach(() => { + validator = new Web3Validator(); + }); + + it('should initialize the validator', () => { + expect(validator['_validator']).toBeDefined(); + }); + + describe('validate', () => { + describe('should pass for valid data', () => { + it.each(abiToJsonSchemaCases)('$title', ({ abi }) => { + const arrayData: ReadonlyArray = abi.data as Array; + expect(validator.validate(abi.fullSchema, arrayData)).toBeUndefined(); + }); + }) + + it('should raise error with empty value', () => { + expect(() => validator.validate(['string'], [])).toThrow( + 'must NOT have fewer than 1 items', + ); + }); + + it('should raise error with less value', () => { + expect(() => validator.validate(['string', 'string'], ['value'])).toThrow( + 'must NOT have fewer than 2 items', + ); + }); + + it('should raise error with more value', () => { + expect(() => validator.validate(['string'], ['value', 'value2'])).toThrow( + 'must NOT have more than 1 items', + ); + }); + + it('should raise error by default', () => { + expect(() => validator.validate(['uint'], [-1])).toThrow( + 'Web3 validator found 1 error[s]:\nvalue "-1" at "/0" must pass "uint" validation', + ); + }); + + it('should return errors if set silent', () => { + expect(validator.validate(['uint'], [-1], { silent: true })).toEqual([ + { + instancePath: '/0', + keyword: '0', + message: 'value "-1" at "/0" must pass "uint" validation', + params: { value: -1 }, + schemaPath: '#0', + }, + ]); + }); + + it('should return undefined for empty schema and empty data', () => { + expect(validator.validate([], [])).toBeUndefined(); + }); + + it('should return error is schema is empty but data no', () => { + const data = [1]; + const testFunction = () => { + validator.validate([], data); + }; + expect(testFunction).toThrow('empty schema against data can not be validated'); + + expect(testFunction).toThrow(Web3ValidatorError); + }); + + it.each(validNotBaseTypeData)( + 'should pass for valid non base type data %s', + ({ dataType, data }: { dataType: string; data: any }) => { + expect(validator.validate([dataType], [data])).toBeUndefined(); + }, + ); + + it('should add id if empty', () => { + expect( + validator.validate( + [{ name: '', type: 'address' }], + ['0x2df0879f1ee2b2b1f2448c64c089c29e3ad7ccc5'], + ), + ).toBeUndefined(); + }); + + it('should throw due to unsupported format', () => { + expect(() => { + validator.validateJSONSchema( + { + type: 'array', + items: [{ $id: 'a', format: 'unsupportedFormat', required: true }], + minItems: 1, + maxItems: 1, + }, + ['0x2df0879f1ee2b2b1f2448c64c089c29e3ad7ccc5'], + ); + }).toThrow(SchemaFormatError); + }); + }); + describe('validateJsonSchema', () => { + // only single param test cases + it.each(abiToJsonSchemaCases.slice(0, 69))( + `$title - should pass for valid data`, + abi => { + const jsonSchema = abi.json; + expect( + validator.validateJSONSchema(jsonSchema.fullSchema, jsonSchema.data), + ).toBeUndefined(); + }, + ); + + it('should throw', () => { + expect(() => { + validator.validateJSONSchema( + { + type: 'array', + items: [{ $id: 'a', required: true, format: 'uint' }], + minItems: 1, + maxItems: 1, + }, + [], + ); + }).toThrow(Web3ValidatorError); + }); + it('should return errors on silent', () => { + expect( + validator.validateJSONSchema( + { + type: 'array', + items: [{ $id: 'a', format: 'uint' }], + minItems: 1, + maxItems: 1, + }, + [], + { silent: true }, + ), + ).toMatchObject([ + { + instancePath: '', + schemaPath: '#/minItems', + keyword: 'minItems', + params: { limit: 1 }, + message: 'must NOT have fewer than 1 items', + }, + ]); + }); + }); + }); +}); diff --git a/packages/web3-validator/test/unit/web3_validator_tuples.test.ts b/packages/web3-validator/test/unit/web3_validator_tuples.test.ts new file mode 100644 index 00000000000..811938d4514 --- /dev/null +++ b/packages/web3-validator/test/unit/web3_validator_tuples.test.ts @@ -0,0 +1,95 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Validator } from '../../src/web3_validator'; + +describe('web3-validator', () => { + describe('Web3Validator', () => { + let validator: Web3Validator; + + beforeEach(() => { + validator = new Web3Validator(); + }); + describe('validate', () => { + it('nested tuples', () => { + const schema = [['uint', 'uint'], 'uint']; + validator.validate(schema, [[7, 5], 3]); + }); + it('nested tuples deep', () => { + const address = '0x7ab80aeb6bb488b7f6c41c58e83ef248eb39c882'; + + const schema = [ + [ + ['uint', ['uint', ['uint', ['uint', 'uint'], 'address']]], + ['uint', 'uint'], + ], + 'uint', + ]; + validator.validate(schema, [ + [ + [7, [7, [7, [7, 5], address]]], + [7, 5], + ], + 3, + ]); + }); + it('nested tuples deep object schema', () => { + const schema = { + type: 'array', + items: [ + { + $id: '/0/0', + format: 'uint', + required: true, + }, + { + type: 'array', + items: [ + { + $id: '/0/0', + format: 'uint', + required: true, + }, + { + type: 'array', + items: [ + { + $id: '/0/0', + format: 'uint', + required: true, + }, + { + $id: '/0/1', + format: 'uint', + required: true, + }, + ], + maxItems: 2, + minItems: 2, + }, + ], + maxItems: 2, + minItems: 2, + }, + ], + maxItems: 2, + minItems: 2, + }; + expect(validator.validateJSONSchema(schema, [7, [7, [7, 5]]])).toBeUndefined(); + }); + }); + }); +}); diff --git a/packages/web3-validator/tsconfig.cjs.json b/packages/web3-validator/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3-validator/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3-validator/tsconfig.esm.json b/packages/web3-validator/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3-validator/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3-validator/tsconfig.types.json b/packages/web3-validator/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3-validator/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3-validator/tsdoc.json b/packages/web3-validator/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3-validator/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3-validator/webpack.config.js b/packages/web3-validator/webpack.config.js new file mode 100644 index 00000000000..59864af0ee2 --- /dev/null +++ b/packages/web3-validator/webpack.config.js @@ -0,0 +1,26 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const { getWebPackConfig } = require('../../webpack.base.config'); + +module.exports = getWebPackConfig( + __dirname, + 'web3-validator.min.js', + 'web3-validator', + 'src/index.ts', + 'tsconfig.cjs.json', +); diff --git a/packages/web3/.eslintignore b/packages/web3/.eslintignore new file mode 100644 index 00000000000..22d50895f3c --- /dev/null +++ b/packages/web3/.eslintignore @@ -0,0 +1,9 @@ +dist +lib +hardhat.config.js +jest.config.js +webpack.config.js +cypress +cypress.config.js +.eslintrc.js +webpack.analyze.js diff --git a/packages/web3/.eslintrc.js b/packages/web3/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/packages/web3/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3/.gitignore b/packages/web3/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/web3/.npmignore b/packages/web3/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/packages/web3/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/packages/web3/.prettierignore b/packages/web3/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/packages/web3/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/packages/web3/.prettierrc.json b/packages/web3/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/packages/web3/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/packages/web3/CHANGELOG.md b/packages/web3/CHANGELOG.md new file mode 100644 index 00000000000..d46d48112b7 --- /dev/null +++ b/packages/web3/CHANGELOG.md @@ -0,0 +1,223 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [4.0.0-alpha.1] + +### Breaking Changes + +#### Connection close is not supported + +In `1.x` user had access to raw connection object and can interact with it. e.g. + +```ts +web3.currentProvider.connection.close(); +``` + +But this internal behavior is not exposed any further. Though you can achieve same with this approach. + +```ts +web3.currentProvider.disconnect(); +``` + +## [4.0.1-alpha.2] + +### Changed + +- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739) + +## [4.0.1-alpha.5] + +### Removed + +- `build` entry from `package.json` (#5755) + +## [4.0.1-rc.0] + +### Added + +- `registeredSubscriptions` was added by default in web3 constructor (#5792) +- Add named exports for all objects which are the default-exported-object in their packages (#5771) +- Export all packages' objects organized by namespaces (#5771) +- Add Additional flat exports for all types and constants from `web3-types`, `web3-errors` and `web3`. (#5771) +- Fix few issues with `new Web3().eth.contract` (#5824) + +### Changed + +- `require('web3')` will now return all web3 exported-objects organized in namespaces . (#5771) + +### Removed + +- Private static `_contracts:Contract[]` and static `setProvider` function was removed (#5792) + +## [4.0.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +### Changed + +- No need for polyfilling nodejs `net` and `fs` modules (#5978) +- Removed IPC provider dependency, IPC path is no longer viable provider. If you wanna use IPC, please install `web3-providers-ipc` and instantiate provider yourself (#5978) + +## [4.0.1-rc.2] + +### Changed + +- Dependencies updated + +## [4.0.1] + +Release Notes: + +Detailed List of change logs are mentioned under previous 4.x alpha and RC releases. + +Documentation: +[Web3.js documentation](https://docs.web3js.org/) +[Web3 API](https://docs.web3js.org/api) +[Migration Guide from 1.x](https://docs.web3js.org/guides/web3_upgrade_guide/x/) + +## [4.0.2] + +### Added + +- Exported `Web3Context`, `Web3PluginBase`, `Web3EthPluginBase` from `'web3-core'`, and `Web3Validator` from `'web3-validator'` (#6165) + +### Fixed + +- Fixed bug #6185, now web3.js compiles on typescript v5 (#6195) +- Fixed #6162 @types/ws issue (#6205) + +## [4.0.3] + +## Added + +- Web3 constructor accepts `Web3ContextInitOptions` as alternative to the still supported `undefined`, `string`, and `SupportedProviders` (#6262). + +### Fixed + +- Fixed bug #6236 by adding personal type in web3.eth (#6245) + +## [4.1.0] + +### Added + +- Added minimum support of web3.extend function + +## [4.1.1] + +### Added + +- To fix issue #6190, added the functionality to introduce different timeout value for Web3. (#6336) + +## [4.1.2] + +### Fixed + +- Fix of incorrect provider warning behavior + +## [4.2.0] + +### Changed + +- Dependencies updated + +### Added + +- Various web3 sub packages has new functions details are in root changelog + +## [4.2.1] + +### Changed + +- Dependencies updated + +## [4.2.2] + +### Changed + +- Dependencies updated ( details are in root changelog ) + +## [4.3.0] + +### Added + +- Added methods (privateKeyToAddress, parseAndValidatePrivateKey, and privateKeyToPublicKey) to web3.eth.accounts (#6620) + +### Changed + +- Dependencies updated + +## [4.4.0] + +- Dependencies updated ( details are in root changelog ) + +## [4.5.0] + +- Dependencies updated ( details are in root changelog ) + +## [4.6.0] + +### Added + +- Added EIP-6963 utility function `requestEIP6963Providers` for multi provider discovery ( other details are in root changelog ) + + +## [4.7.0] + +### added + +#### web3-eth-contract + +- Types `ContractDeploySend`, `ContractMethodSend`, `Web3PromiEvent` was exported (#6883) + +#### web3-eth-ens + +- Added function getText and getName in ENS and resolver classes (#6914) + +### fixed + +#### web3-validator + +- Multi-dimensional arrays(with a fix length) are now handled properly when parsing ABIs (#6798) + +#### web3-utils + +- fixed erroneous parsing of big numbers in the `toNumber(...)` function (#6880) + +## [Unreleased] \ No newline at end of file diff --git a/packages/web3/README.md b/packages/web3/README.md index 613671f037e..53a0d16c806 100644 --- a/packages/web3/README.md +++ b/packages/web3/README.md @@ -1,29 +1,104 @@ -# web3 +

+ web3.js +

-[![NPM Package][npm-image]][npm-url] [![Dependency Status][deps-image]][deps-url] [![Dev Dependency Status][deps-dev-image]][deps-dev-url] +# web3.js -This is the main package of [web3.js][repo]. +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] -Please read the main [README][repo-readme] and [documentation][docs] for more. +This is the main package of [web3.js](repo), it contains a collection of comprehensive [TypeScript](https://www.typescriptlang.org/) libraries for Interaction with the [Ethereum JSON RPC API](https://ethereum.org/developers/docs/apis/json-rpc) and utility functions. + +## Features + +- **Web3.js Plugins](https://docs.web3js.org/guides/web3_plugin_guide/)**: Enhance or add any functionality by creating scalable web3 plugins for any project. +- **Abstractions over the [JSON-RPC API](https://ethereum.org/en/developers/docs/apis/json-rpc)**: Simplifying interaction for your Developer Experience. +- **Language aligned to the official [Ethereum terminology](https://ethereum.org/en/glossary** +- **Tree-shaking focus**: Include only what you need during bundling for optimized performance. +- **Dynamic contract types and full API in TypeScript**: Enforced with strict types for enhanced security and safety. +- **Complete utilities and functionalities for all your Ethereum needs** +- **More efficient ABI Encoder & Decoder** +- **Extensive [documentation](https://docs.web3js.org/) with guides and APIs** +- **Large collection of test cases** +- **First-class APIs for interacting with [Smart Contracts](https://ethereum.org/en/glossary#smart-contract** +- **ESM and CJS module builds**: Support for both ECMAScript module and CommonJS module builds for flexible integration with various project setups. +- **Contracts dynamic types](https://docs.web3js.org/guides/smart_contracts/infer_contract_types/) & full API in TypeScript** +- **Using native BigInt instead of large BigNumber libraries**: Use native BigInt for improved efficiency compared to using large external BigNumber libraries. +- **Custom Output formatters**: Format any returned value to be a string, number, BigInt, etc., providing flexibility in handling output data. ## Installation -### Node.js +You can install the package either using [NPM](https://www.npmjs.com/package/web3) or using [Yarn](https://yarnpkg.com/package/web3) + +### Using NPM ```bash npm install web3 ``` -## Types +### Using Yarn + +```bash +yarn add web3 +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Migration Guide + +- [Migration Guide from Web3.js 1.x to 4.x](https://docs.web3js.org/docs/guides/web3_migration_guide) + Breaking changes are listed in migration guide and its first step for migrating from Web3.js 1.x to 4.x. If there is any question or discussion feel free to ask in discord, and in case of any bug or new feature request [open issue](https://github.com/web3/web3.js/issues/new) or create a pull request for [contributions](https://github.com/web3/web3.js/blob/4.x/CONTRIBUTIONS.md). + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +## Web3.js Packages + +We encourage users to use only required individual packages listed in following table, for making lightweight application instead of importing main web3 package, and if you don't need functions from most of the packages that are implicitly included with main web3 package. -All the TypeScript typings are placed in the `types` folder. +| Package | Version | License | Docs | Description | +| ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| [web3](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3%2Fpackage.json)](https://www.npmjs.com/package/web3) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3) | :rotating_light: Entire Web3.js offering (includes all packages) | +| [web3-core](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-core) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-core%2Fpackage.json)](https://www.npmjs.com/package/web3-core) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-core) | Core functions for web3.js packages | +| [web3-errors](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-errors) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-errors%2Fpackage.json)](https://www.npmjs.com/package/web3-core) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-errors) | Errors Objects | +| [web3-eth](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth%2Fpackage.json)](https://www.npmjs.com/package/web3-eth) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-eth) | Modules to interact with the Ethereum blockchain and smart contracts | +| [web3-eth-abi](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth-abi) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-abi%2Fpackage.json)](https://www.npmjs.com/package/web3-eth-abi) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-eth-abi) | Functions for encoding and decoding EVM in/output | +| [web3-eth-accounts](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth-accounts) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-accounts%2Fpackage.json)](https://www.npmjs.com/package/web3-eth-accounts) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-eth-accounts) | Functions for managing Ethereum accounts and signing | +| [web3-eth-contract](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth-contract) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-contract%2Fpackage.json)](https://www.npmjs.com/package/web3-eth-contract) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-eth-contract) | The contract package contained in [web3-eth](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth) | +| [web3-eth-ens](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth-ens) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-ens%2Fpackage.json)](https://www.npmjs.com/package/web3-eth-ens) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-eth-ens) | Functions for interacting with the Ethereum Name Service | +| [web3-eth-iban](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth-iban) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-iban%2Fpackage.json)](https://www.npmjs.com/package/web3-eth-iban) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-eth-iban) | Functionality for converting Ethereum addressed to IBAN addressed and vice versa | +| [web3-eth-personal](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-eth-personal) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-eth-personal%2Fpackage.json)](https://www.npmjs.com/package/web3-eth-personal) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-eth-personal) | Module to interact with the Ethereum blockchain accounts stored in the node | +| [web3-net](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-net) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-net%2Fpackage.json)](https://www.npmjs.com/package/web3-net) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-net) | Functions to interact with an Ethereum node's network properties | +| [web3-providers-http](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-providers-http) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-providers-http%2Fpackage.json)](https://www.npmjs.com/package/web3-providers-http) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-providers-http) | Web3.js provider for the HTTP protocol | +| [web3-providers-ipc](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-providers-ipc) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-providers-ipc%2Fpackage.json)](https://www.npmjs.com/package/web3-providers-ipc) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-providers-ipc) | Web3.js provider for IPC | +| [web3-providers-ws](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-providers-ws) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-providers-ws%2Fpackage.json)](https://www.npmjs.com/package/web3-providers-ws) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-providers-ws) | Web3.js provider for the Websocket protocol | +| [web3-rpc-methods](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-rpc-methods) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-rpc-methods%2Fpackage.json)](https://www.npmjs.com/package/web3-types) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/) | RPC Methods | +| [web3-types](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-types) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-types%2Fpackage.json)](https://www.npmjs.com/package/web3-types) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-types) | Shared useable types | +| [web3-utils](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-utils) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-utils%2Fpackage.json)](https://www.npmjs.com/package/web3-utils) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-utils) | Useful utility functions for Dapp developers | +| [web3-validator](https://github.com/ChainSafe/web3.js/tree/4.x/packages/web3-validator) | [![npm](https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3-validator%2Fpackage.json)](https://www.npmjs.com/package/web3-validator) | [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) | [![documentation](https://img.shields.io/badge/typedoc-blue)](https://docs.web3js.org/api/web3-validator) | Utilities for validating objects | -[docs]: http://web3js.readthedocs.io/en/1.0/ -[repo]: https://github.com/ethereum/web3.js -[repo-readme]: https://github.com/ethereum/web3.js/blob/1.x/README.md -[npm-image]: https://img.shields.io/npm/v/web3.svg +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/packages/web3 +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=packages%2Fweb3%2Fpackage.json [npm-url]: https://npmjs.org/package/web3 -[deps-image]: https://david-dm.org/ethereum/web3.js/1.x/status.svg?path=packages/web3 -[deps-url]: https://david-dm.org/ethereum/web3.js/1.x?path=packages/web3 -[deps-dev-image]: https://david-dm.org/ethereum/web3.js/1.x/dev-status.svg?path=packages/web3 -[deps-dev-url]: https://david-dm.org/ethereum/web3.js/1.x?type=dev&path=packages/web3 \ No newline at end of file +[downloads-image]: https://img.shields.io/npm/dm/web3?label=npm%20downloads diff --git a/packages/web3/assets/logo/web3js.ai b/packages/web3/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/packages/web3/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/packages/web3/assets/logo/web3js.jpg b/packages/web3/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/packages/web3/assets/logo/web3js.jpg differ diff --git a/packages/web3/assets/logo/web3js.svg b/packages/web3/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/packages/web3/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/packages/web3/cypress b/packages/web3/cypress new file mode 120000 index 00000000000..4a671a7beac --- /dev/null +++ b/packages/web3/cypress @@ -0,0 +1 @@ +../../templates/cypress \ No newline at end of file diff --git a/packages/web3/cypress.config.js b/packages/web3/cypress.config.js new file mode 100644 index 00000000000..d9c99839969 --- /dev/null +++ b/packages/web3/cypress.config.js @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +const config = { + screenshotOnRunFailure: false, + video: false, + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require('./cypress/plugins/index.js')(on, config); + }, + specPattern: 'test/e2e_manual/**/**/*.test.ts', + excludeSpecPattern: [], + }, +}; + +module.exports = config; diff --git a/packages/web3/package-lock.json b/packages/web3/package-lock.json deleted file mode 100644 index cffaa025b75..00000000000 --- a/packages/web3/package-lock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "web3", - "version": "1.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "12.12.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz", - "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==", - "dev": true - }, - "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", - "dev": true - } - } -} diff --git a/packages/web3/package.json b/packages/web3/package.json index edb26853dd5..5d20596abe8 100644 --- a/packages/web3/package.json +++ b/packages/web3/package.json @@ -1,65 +1,106 @@ { - "name": "web3", - "version": "1.3.0", - "description": "Ethereum JavaScript API", - "repository": "https://github.com/ethereum/web3.js", - "license": "LGPL-3.0", - "engines": { - "node": ">=8.0.0" - }, - "main": "lib/index.js", - "bugs": { - "url": "https://github.com/ethereum/web3.js/issues" - }, - "keywords": [ - "Ethereum", - "JavaScript", - "API" - ], - "author": "ethereum.org", - "types": "types/index.d.ts", - "scripts": { - "tsc": "tsc -b tsconfig.json", - "dtslint": "dtslint --localTs ../../node_modules/typescript/lib types" - }, - "authors": [ - { - "name": "Fabian Vogelsteller", - "email": "fabian@ethereum.org", - "homepage": "http://frozeman.de" - }, - { - "name": "Marek Kotewicz", - "email": "marek@parity.io", - "url": "https://github.com/debris" - }, - { - "name": "Marian Oancea", - "url": "https://github.com/cubedro" - }, - { - "name": "Gav Wood", - "email": "g@parity.io", - "homepage": "http://gavwood.com" - }, - { - "name": "Jeffery Wilcke", - "email": "jeffrey.wilcke@ethereum.org", - "url": "https://github.com/obscuren" - } - ], - "dependencies": { - "web3-bzz": "1.3.0", - "web3-core": "1.3.0", - "web3-eth": "1.3.0", - "web3-eth-personal": "1.3.0", - "web3-net": "1.3.0", - "web3-shh": "1.3.0", - "web3-utils": "1.3.0" - }, - "devDependencies": { - "@types/node": "^12.12.6", - "dtslint": "^3.4.1", - "typescript": "^3.9.5" - } + "name": "web3", + "version": "4.7.0", + "description": "Ethereum JavaScript API", + "main": "./lib/commonjs/index.js", + "module": "./lib/esm/index.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "import": "./lib/esm/index.js", + "require": "./lib/commonjs/index.js" + } + }, + "repository": "https://github.com/ChainSafe/web3.js", + "engines": { + "node": ">=14.0.0", + "npm": ">=6.12.0" + }, + "author": "ChainSafe Systems", + "browser": "./dist/web3.min.js", + "license": "LGPL-3.0", + "keywords": [ + "Ethereum", + "JavaScript", + "API" + ], + "files": [ + "lib/**/*", + "src/**/*", + "dist/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "version:output": "[ -z $npm_package_version ] && rm ./src/version.ts || echo \"/* eslint-disable header/header */ export const Web3PkgInfo = { version: '$npm_package_version' };\" > ./src/version.ts", + "build": "yarn version:output && concurrently --kill-others-on-fail \"yarn:build:*(!web|check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > ./lib/commonjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{\"type\": \"module\"}' > ./lib/esm/package.json", + "build:types": "tsc --build tsconfig.types.json", + "build:web": "npx webpack", + "build:web:analyze": "npx webpack --config ./webpack.analyze.js", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --forceExit --coverage=true --coverage-reporters=text", + "test:e2e:mainnet": "jest --config=./test/e2e/jest.config.js --forceExit", + "test:e2e:sepolia": "jest --config=./test/e2e/jest.config.js --forceExit", + "test:sync:integration": "jest --config=./test/integration/jest.config.js ./test/integration/sync.test.ts", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --forceExit", + "test:integration:stress": "jest --config=./test/stress/jest.config.js --forceExit", + "test:blackbox:hardhat:http": "./scripts/black_box_test.sh hardhat http", + "test:blackbox:hardhat:ws": "./scripts/black_box_test.sh hardhat ws", + "test:blackbox:geth:http": "./scripts/black_box_test.sh geth http", + "test:blackbox:geth:ws": "./scripts/black_box_test.sh geth ws", + "test:blackbox:infura:http": "./scripts/black_box_test.sh infura http", + "test:blackbox:infura:ws": "./scripts/black_box_test.sh infura ws", + "test:e2e:chrome:stress": "npx cypress run --headless --browser chrome", + "test:benchmark": "npx ts-node --preferTsExts ../web3/test/benchmark/benchmark.ts" + }, + "devDependencies": { + "@truffle/hdwallet-provider": "^2.0.12", + "@types/benchmark": "^2.1.5", + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "benchmark": "^2.1.4", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "ethereum-cryptography": "^2.1.2", + "ganache": "^7.5.0", + "hardhat": "^2.19.4", + "in3": "^3.3.3", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4", + "web3-providers-ipc": "^4.0.7" + }, + "dependencies": { + "web3-core": "^4.3.2", + "web3-errors": "^1.1.4", + "web3-eth": "^4.5.0", + "web3-eth-abi": "^4.2.0", + "web3-eth-accounts": "^4.1.1", + "web3-eth-contract": "^4.3.0", + "web3-eth-ens": "^4.2.0", + "web3-eth-iban": "^4.0.7", + "web3-eth-personal": "^4.0.8", + "web3-net": "^4.0.7", + "web3-providers-http": "^4.1.0", + "web3-providers-ws": "^4.0.7", + "web3-rpc-methods": "^1.2.0", + "web3-types": "^1.5.0", + "web3-utils": "^4.2.2", + "web3-validator": "^2.0.5" + } } diff --git a/packages/web3/scripts/black_box_test.sh b/packages/web3/scripts/black_box_test.sh new file mode 100755 index 00000000000..508f2bd76de --- /dev/null +++ b/packages/web3/scripts/black_box_test.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +ORIGARGS=("$@") + +. scripts/env.sh + +helpFunction() { + echo "Usage: $0 " + exit 1 # Exit script after printing help +} + +BACKEND=${ORIGARGS[0]} +MODE=${ORIGARGS[1]} +PROVIDER_URL=${ORIGARGS[2]} + +SUPPORTED_BACKENDS=("geth" "infura" "hardhat") +SUPPORTED_MODE=("http" "ws") + +if [[ ! " ${SUPPORTED_BACKENDS[*]} " =~ " ${BACKEND} " ]]; then + helpFunction +fi + +if [[ ! " ${SUPPORTED_MODE[*]} " =~ " ${MODE} " ]]; then + helpFunction +fi + +echo "RPC client Provider: " $BACKEND +echo "RPC client Protocol: " $MODE + +export WEB3_SYSTEM_TEST_PROVIDER="$MODE://localhost:$WEB3_SYSTEM_TEST_PORT" +export WEB3_SYSTEM_TEST_BACKEND=$BACKEND + +cd test/esm_black_box +yarn --update-checksums +yarn + +if [[ ${BACKEND} == "infura" ]] +then + if [ ! $INFURA_HTTP ] || [ ! $INFURA_WSS ] + then + echo "No Infura provider URL specified" + exit 1 + elif [ $MODE == "http" ] + then + WEB3_SYSTEM_TEST_PROVIDER=$INFURA_HTTP + else + WEB3_SYSTEM_TEST_PROVIDER=$INFURA_WSS + fi +fi +yarn "test:$BACKEND:$MODE" + +cd test/cjs_black_box +yarn --update-checksums +yarn + +if [[ ${BACKEND} == "infura" ]] +then + if [ ! $INFURA_HTTP ] || [ ! $INFURA_WSS ] + then + echo "No Infura provider URL specified" + exit 1 + elif [ $MODE == "http" ] + then + WEB3_SYSTEM_TEST_PROVIDER=$INFURA_HTTP + else + WEB3_SYSTEM_TEST_PROVIDER=$INFURA_WSS + fi +fi +yarn "test:$BACKEND:$MODE" diff --git a/packages/web3/scripts/env.sh b/packages/web3/scripts/env.sh new file mode 100755 index 00000000000..b0f7051087b --- /dev/null +++ b/packages/web3/scripts/env.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +TMP_FOLDER=$(pwd)/tmp +IPC_PATH=$TMP_FOLDER/ipc + +export WEB3_SYSTEM_TEST_ENV=true +export WEB3_SYSTEM_TEST_BACKEND="" +export WEB3_SYSTEM_TEST_MNEMONIC="smart guide what forget tired jungle always expire rescue boring glue champion" +export WEB3_SYSTEM_TEST_PORT=8545 +export WEB3_SYSTEM_TEST_PROVIDER="" diff --git a/packages/web3/src/abi.ts b/packages/web3/src/abi.ts new file mode 100644 index 00000000000..5abe7536266 --- /dev/null +++ b/packages/web3/src/abi.ts @@ -0,0 +1,41 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + decodeLog, + decodeParameter, + decodeParameters, + encodeEventSignature, + encodeFunctionCall, + encodeFunctionSignature, + encodeParameter, + encodeParameters, +} from 'web3-eth-abi'; + +/** + * The object for `web3.abi` + */ +export default { + encodeEventSignature, + encodeFunctionCall, + encodeFunctionSignature, + encodeParameter, + encodeParameters, + decodeParameter, + decodeParameters, + decodeLog, +}; diff --git a/packages/web3/src/accounts.ts b/packages/web3/src/accounts.ts new file mode 100644 index 00000000000..b0c2765257f --- /dev/null +++ b/packages/web3/src/accounts.ts @@ -0,0 +1,109 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { EthExecutionAPI, Bytes, Transaction, KeyStore, ETH_DATA_FORMAT } from 'web3-types'; +import { format } from 'web3-utils'; +import { Web3Context } from 'web3-core'; +import { prepareTransactionForSigning } from 'web3-eth'; +import { + create, + decrypt, + encrypt, + hashMessage, + privateKeyToAccount, + recover, + recoverTransaction, + signTransaction, + sign, + Wallet, + privateKeyToAddress, + parseAndValidatePrivateKey, + privateKeyToPublicKey, +} from 'web3-eth-accounts'; + +/** + * Initialize the accounts module for the given context. + * + * To avoid multiple package dependencies for `web3-eth-accounts` we are creating + * this function in `web3` package. In future the actual `web3-eth-accounts` package + * should be converted to context aware. + */ +export const initAccountsForContext = (context: Web3Context) => { + const signTransactionWithContext = async (transaction: Transaction, privateKey: Bytes) => { + const tx = await prepareTransactionForSigning(transaction, context); + + const privateKeyBytes = format({ format: 'bytes' }, privateKey, ETH_DATA_FORMAT); + + return signTransaction(tx, privateKeyBytes); + }; + + const privateKeyToAccountWithContext = (privateKey: Uint8Array | string) => { + const account = privateKeyToAccount(privateKey); + + return { + ...account, + signTransaction: async (transaction: Transaction) => + signTransactionWithContext(transaction, account.privateKey), + }; + }; + + const decryptWithContext = async ( + keystore: KeyStore | string, + password: string, + options?: Record, + ) => { + const account = await decrypt(keystore, password, (options?.nonStrict as boolean) ?? true); + + return { + ...account, + signTransaction: async (transaction: Transaction) => + signTransactionWithContext(transaction, account.privateKey), + }; + }; + + const createWithContext = () => { + const account = create(); + + return { + ...account, + signTransaction: async (transaction: Transaction) => + signTransactionWithContext(transaction, account.privateKey), + }; + }; + + const wallet = new Wallet({ + create: createWithContext, + privateKeyToAccount: privateKeyToAccountWithContext, + decrypt: decryptWithContext, + }); + + return { + signTransaction: signTransactionWithContext, + create: createWithContext, + privateKeyToAccount: privateKeyToAccountWithContext, + decrypt: decryptWithContext, + recoverTransaction, + hashMessage, + sign, + recover, + encrypt, + wallet, + privateKeyToAddress, + parseAndValidatePrivateKey, + privateKeyToPublicKey, + } +}; diff --git a/packages/web3/src/eth.exports.ts b/packages/web3/src/eth.exports.ts new file mode 100644 index 00000000000..8b37f03f77e --- /dev/null +++ b/packages/web3/src/eth.exports.ts @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export * from 'web3-eth'; + +export * as abi from 'web3-eth-abi'; +export * as accounts from 'web3-eth-accounts'; +export * as contract from 'web3-eth-contract'; +export * as ens from 'web3-eth-ens'; +export * as personal from 'web3-eth-personal'; +export * as iban from 'web3-eth-iban'; diff --git a/packages/web3/src/index.js b/packages/web3/src/index.js deleted file mode 100644 index f7629944df0..00000000000 --- a/packages/web3/src/index.js +++ /dev/null @@ -1,80 +0,0 @@ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.js - * @authors: - * Fabian Vogelsteller - * Gav Wood - * Jeffrey Wilcke - * Marek Kotewicz - * Marian Oancea - * @date 2017 - */ - -"use strict"; - - -var version = require('../package.json').version; -var core = require('web3-core'); -var Eth = require('web3-eth'); -var Net = require('web3-net'); -var Personal = require('web3-eth-personal'); -var Shh = require('web3-shh'); -var Bzz = require('web3-bzz'); -var utils = require('web3-utils'); - -var Web3 = function Web3() { - var _this = this; - - // sets _requestmanager etc - core.packageInit(this, arguments); - - this.version = version; - this.utils = utils; - - this.eth = new Eth(this); - this.shh = new Shh(this); - this.bzz = new Bzz(this); - - // overwrite package setProvider - var setProvider = this.setProvider; - this.setProvider = function (provider, net) { - /*jshint unused: false */ - setProvider.apply(_this, arguments); - - _this.eth.setRequestManager(_this._requestManager); - _this.shh.setRequestManager(_this._requestManager); - _this.bzz.setProvider(provider); - - return true; - }; -}; - -Web3.version = version; -Web3.utils = utils; -Web3.modules = { - Eth: Eth, - Net: Net, - Personal: Personal, - Shh: Shh, - Bzz: Bzz -}; - -core.addProviders(Web3); - -module.exports = Web3; - diff --git a/packages/web3/src/index.ts b/packages/web3/src/index.ts new file mode 100644 index 00000000000..45d625b6e48 --- /dev/null +++ b/packages/web3/src/index.ts @@ -0,0 +1,365 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * This is the main (or 'umbrella') class of the web3.js library. + * + * ```ts + * import Web3 from 'web3'; + * + * > Web3.utils + * > Web3.version + * > Web3.givenProvider + * > Web3.providers + * > Web3.modules + * ``` + * + * # Web3.modules + * + * ```ts + * Web3.modules + * ``` + * + * Will return an object with the classes of all major sub modules, to be able to instantiate them manually. + * + * #### Returns + * + * `Object` A list of module constructors: + * + * + * + `Eth` - `Constructor`: The Eth module for interacting with the Ethereum network + * + * + * + `Net` - `Constructor`: The Net module for interacting with network properties. + * + * + * + `Personal` - `constructor`: The Personal module for interacting with the Ethereum accounts (web3.eth.personal). + * + * #### Example + * + * ```ts + * Web3.modules + * > { + * Eth: Eth(provider), + * Net: Net(provider), + * Personal: Personal(provider), + * } + * ``` + * + * See details: {@link Web3.modules} + * + * # Web3 Instance + * + * The Web3 class is an umbrella package to house all Ethereum related modules. + * + * ```ts + * import Web3 from 'web3'; + * + * // "Web3.givenProvider" will be set if in an Ethereum supported browser. + * const web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546'); + * + * > web3.eth + * > web3.utils + * > web3.version + * ``` + * + * ### version + * + * Contains the current package version of the web3.js library. + * + * #### Returns + * //todo enable when functionality added + * // @see Web3.version + * + * ### utils + * + * Static accessible property of the Web3 class and property of the instance as well. + * + * ```ts + * Web3.utils + * web3.utils + * ``` + * + * Utility functions are also exposed on the `Web3` class object diretly. + * + * //todo enable when implemented + * //See details: {@link Web3.utils} + * + * ### setProvider + * + * ```ts + * web3.setProvider(myProvider) + * web3.eth.setProvider(myProvider) + * ... + * ``` + * + * Will change the provider for its module. + * + * **_NOTE:_** When called on the umbrella package web3 it will also set the provider for all sub modules web3.eth etc. + * + * #### Parameters + * `Object` - `myProvider`: a valid provider. + * + * #### Returns + * `Boolean` + * + * See details: {@link Web3.setProvider} + * + * #### Example: Local Geth Node + * ```ts + * import Web3 from "web3"; + * let web3: Web3 = new Web3('http://localhost:8545'); + * // or + * let web3: Web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); + * + * // change provider + * web3.setProvider('ws://localhost:8546'); + * // or + * web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:8546')); + * + * //todo add IPC provider + * ``` + * + * #### Example: Remote Geth Node + * + * ```ts + * // Using a remote node provider, like Alchemy (https://www.alchemyapi.io/supernode), is simple. + * import Web3 from "web3"; + * let web3: Web3 = new Web3("https://eth-mainnet.alchemyapi.io/v2/your-api-key"); + * ``` + * + * ### providers + * + * ```ts + * web3.providers + * web3.eth.providers + * ``` + * Contains the current available providers. + * + * #### Returns + * `Object` with the following providers: + * + * + * + `Object` - `HttpProvider`: HTTP provider, does not support subscriptions. + * + * + * + `Object` - `WebSocketProvider`: The WebSocket provider is the standard for usage in legacy browsers. + * + * + * + `Object` - `IpcProvider`: The IPC provider is used in node.js dapps when running a local node. Gives the most secure connection. + * + * + * #### Example + * ```ts + * import { Web3 } from 'web3'; + * // use the given Provider or instantiate a new websocket provider + * let web3 = new Web3(Web3.givenProvider || 'ws://remotenode.com:8546'); + * // or + * let web3 = new Web3(Web3.givenProvider || new Web3.providers.WebsocketProvider('ws://remotenode.com:8546')); + * + * // Using the IPC provider in node.js + * import { Web3 } from 'web3'; + * import { IpcProvider } from 'web3-providers-ipc'; + * var web3 = new Web3(new IpcProvider('/Users/myuser/Library/Ethereum/geth.ipc')); // mac os path + * // on windows the path is: "\\\\.\\pipe\\geth.ipc" + * // on linux the path is: "/users/myuser/.ethereum/geth.ipc" + * ``` + * #### Configuration + * + * ```ts + * + * //=== + * //Http + * //=== + * + * import Web3HttpProvider, { HttpProviderOptions } from "web3-providers-http"; + * + * let options: HttpProviderOptions = { + * providerOptions: { + * keepalive: true, + * credentials: "omit", + * headers: { + * "Access-Control-Allow-Origin": "*", + * }, + * }, + * }; + * + * + * var provider = new Web3HttpProvider("http://localhost:8545", options); + * web3.setProvider(provider); + * + * //=== + * //WebSockets + * //=== + * import Web3WsProvider, { + * ClientOptions, + * ClientRequestArgs, + * ReconnectOptions, + * } from "web3-providers-ws"; + * + * + * let clientOptions: ClientOptions = { + * // Useful for credentialed urls, e.g: ws://username:password@localhost:8546 + * headers: { + * authorization: "Basic username:password", + * }, + * maxPayload: 100000000, + * }; + * + * // Enable auto reconnection + * let reconnectOptions: ReconnectOptions = { + * autoReconnect: true, + * delay: 5000, // ms + * maxAttempts: 5, + * }; + * + * //clientOptions and reconnectOptions are optional + * //clientOptions: ClientOptions | ClientRequestArgs + * let ws = new Web3WsProvider( + * "ws://localhost:8546", + * clientOptions, + * reconnectOptions + * ); + * web3.setProvider(ws); + * + * ``` + * More information for the Http and Websocket provider modules can be found here: + * + * + * - {@link HttpProvider} + * + * + * - {@link WebSocketProvider} + * + * See details: {@link Web3.providers} + * + * + * ### givenProvider + * + * ```ts + * web3.givenProvider + * web3.eth.givenProvider + * ... + * ``` + * When using web3.js in an Ethereum compatible browser, it will set with the current native provider by that browser. + * Will return the given provider by the (browser) environment, otherwise `undefined`. + * + * #### Returns + * `Object` - The given provider set or `undefined`. + * + * See details: {@link Web3.givenProvider} + * + * ### currentProvider + * + * ```ts + * web3.currentProvider + * web3.eth.currentProvider + * ... + * ``` + * Will return the current provider, otherwise `undefined`. + * + * #### Returns + * `Object`: The current provider, otherwise `undefined`. + * + * See details: {@link Web3.currentProvider} + * + * ### BatchRequest + * + * ```ts + * new web3.BatchRequest() + * new web3.BatchRequest() + * ... + * ``` + * Class to create and execute batch requests. + * + * #### Parameters + * none + * + * #### Returns + * `Object`: With the following methods: + * + * + `add(request)`: To add a request object to the batch call. + * + * + `execute()` : To execute the batch request. + * + * #### Example + * ```ts + * let request1: JsonRpcOptionalRequest = { + * id: 10, + * method: 'eth_getBalance', + * params: ["0xdc6bad79dab7ea733098f66f6c6f9dd008da3258", 'latest'], + * }; + * let request2: JsonRpcOptionalRequest = { + * id: 11, + * method: 'eth_getBalance', + * params: ["0x962f9a9c2a6c092474d24def35eccb3d9363265e", 'latest'], + * }; + * + * const batch = new web3.BatchRequest(); + * + * batch.add(request1); + * batch.add(request2); + * // add returns a deferred promise which can be used to run specific code after completion of each respective request. + * //const request2Promise = batch.add(request2); + * + * const response = await batch.execute(); + * ``` + * See details: {@link Web3.BatchRequest} + */ +/** + * This comment _supports3_ [Markdown](https://marked.js.org/) + */ + +import Web3 from './web3.js'; + +export * from './types.js'; +export default Web3; + +/** + * Named exports for all objects which are the default-exported-object in their packages + */ +export { Web3 }; +export { Web3Context, Web3PluginBase, Web3EthPluginBase, Web3PromiEvent } from 'web3-core'; +export { Web3Eth } from 'web3-eth'; +export { Contract, ContractDeploySend, ContractMethodSend } from 'web3-eth-contract'; +export { Iban } from 'web3-eth-iban'; +export { Personal } from 'web3-eth-personal'; +export { Net } from 'web3-net'; +export { HttpProvider } from 'web3-providers-http'; +export { WebSocketProvider } from 'web3-providers-ws'; +export { Web3Validator } from 'web3-validator'; + +/** + * Export all packages grouped by name spaces + */ +export * as core from 'web3-core'; +export * as errors from 'web3-errors'; +export * as eth from './eth.exports.js'; +export * as net from 'web3-net'; +export * as providers from './providers.exports.js'; +export * as rpcMethods from 'web3-rpc-methods'; +export * as types from 'web3-types'; +export * as utils from 'web3-utils'; +export * as validator from 'web3-validator'; + +/** + * Export all types from `web3-types` without a namespace (in addition to being available at `types` namespace). + * To enable the user to write: `function something(): Web3Api` without the need for `types.Web3Api`. + * And the same for `web3-errors`. Because this package contains error classes and constants. + */ +export * from 'web3-errors'; +export * from 'web3-types'; diff --git a/packages/web3/src/providers.exports.ts b/packages/web3/src/providers.exports.ts new file mode 100644 index 00000000000..c3d8bfcba08 --- /dev/null +++ b/packages/web3/src/providers.exports.ts @@ -0,0 +1,22 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +export { Eip1193Provider, SocketProvider } from 'web3-utils'; + +export * as http from 'web3-providers-http'; +export * as ws from 'web3-providers-ws'; +export * from './web3_eip6963.js'; \ No newline at end of file diff --git a/packages/web3/src/types.ts b/packages/web3/src/types.ts new file mode 100644 index 00000000000..fb14e6b2e1a --- /dev/null +++ b/packages/web3/src/types.ts @@ -0,0 +1,95 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Bytes, Transaction } from 'web3-types'; +import Eth from 'web3-eth'; +import { + decodeLog, + decodeParameter, + decodeParameters, + encodeFunctionCall, + encodeFunctionSignature, + encodeParameter, + encodeParameters, +} from 'web3-eth-abi'; +import { + encrypt, + hashMessage, + recover, + recoverTransaction, + sign, + signTransaction, + Wallet, + Web3Account, +} from 'web3-eth-accounts'; +import { Contract } from 'web3-eth-contract'; +import { ENS } from 'web3-eth-ens'; +import { Net } from 'web3-net'; +import { Iban } from 'web3-eth-iban'; +import { Personal } from 'web3-eth-personal'; + +/** + * The Ethereum interface for main web3 object. It provides extra methods in addition to `web3-eth` interface. + * + * {@link web3_eth.Web3Eth} for details about the `Eth` interface. + */ +export interface Web3EthInterface extends Eth { + /** + * Extended [Contract](/api/web3-eth-contract/class/Contract) constructor for main `web3` object. See [Contract](/api/web3-eth-contract/class/Contract) for further details. + * + * You can use `.setProvider` on this constructor to set provider for **all the instances** of the contracts which were created by `web3.eth.Contract`. + * Please check the {@doclink guides/web3_upgrade_guide/x/providers_migration_guide | following guide} to understand more about setting provider. + * + * ```ts + * web3.eth.Contract.setProvider(myProvider) + * ``` + */ + Contract: typeof Contract; + Iban: typeof Iban; + net: Net; + ens: ENS; + abi: { + encodeEventSignature: typeof encodeFunctionSignature; + encodeFunctionCall: typeof encodeFunctionCall; + encodeFunctionSignature: typeof encodeFunctionSignature; + encodeParameter: typeof encodeParameter; + encodeParameters: typeof encodeParameters; + decodeParameter: typeof decodeParameter; + decodeParameters: typeof decodeParameters; + decodeLog: typeof decodeLog; + }; + accounts: { + create: () => Web3Account; + privateKeyToAccount: (privateKey: Uint8Array | string) => Web3Account; + signTransaction: ( + transaction: Transaction, + privateKey: Bytes, + ) => ReturnType; + recoverTransaction: typeof recoverTransaction; + hashMessage: typeof hashMessage; + sign: typeof sign; + recover: typeof recover; + encrypt: typeof encrypt; + decrypt: ( + keystore: string, + password: string, + options?: Record, + ) => Promise; + wallet: Wallet; + }; + personal: Personal; +} diff --git a/packages/web3/src/version.ts b/packages/web3/src/version.ts new file mode 100644 index 00000000000..c6e779f738c --- /dev/null +++ b/packages/web3/src/version.ts @@ -0,0 +1 @@ +/* eslint-disable header/header */ export const Web3PkgInfo = { version: '4.7.0' }; diff --git a/packages/web3/src/web3.ts b/packages/web3/src/web3.ts new file mode 100644 index 00000000000..2953e67d364 --- /dev/null +++ b/packages/web3/src/web3.ts @@ -0,0 +1,223 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line max-classes-per-file +import { + Web3Context, + Web3ContextInitOptions, + Web3ContextObject, + Web3SubscriptionConstructor, + isSupportedProvider +} from 'web3-core'; +import { Web3Eth, RegisteredSubscription, registeredSubscriptions } from 'web3-eth'; +import Contract from 'web3-eth-contract'; +import { ENS, registryAddresses } from 'web3-eth-ens'; +import { Iban } from 'web3-eth-iban'; +import { Personal } from 'web3-eth-personal'; +import { Net } from 'web3-net'; +import * as utils from 'web3-utils'; +import { isNullish, isDataFormat, isContractInitOptions } from 'web3-utils'; +import { + Address, + ContractAbi, + ContractInitOptions, + EthExecutionAPI, + SupportedProviders, + DataFormat, + DEFAULT_RETURN_FORMAT +} from 'web3-types'; +import { InvalidMethodParamsError } from 'web3-errors'; +import abi from './abi.js'; +import { initAccountsForContext } from './accounts.js'; +import { Web3EthInterface } from './types.js'; +import { Web3PkgInfo } from './version.js'; +import { onNewProviderDiscovered, requestEIP6963Providers } from './web3_eip6963.js'; + +export class Web3< + CustomRegisteredSubscription extends { + [key: string]: Web3SubscriptionConstructor; + } = RegisteredSubscription, +> extends Web3Context { + public static version = Web3PkgInfo.version; + public static utils = utils; + public static requestEIP6963Providers = requestEIP6963Providers; + public static onNewProviderDiscovered = onNewProviderDiscovered; + public static modules = { + Web3Eth, + Iban, + Net, + ENS, + Personal, + }; + + public utils: typeof utils; + + public eth: Web3EthInterface; + + public constructor( + providerOrContext?: + | string + | SupportedProviders + | Web3ContextInitOptions, + ) { + if ( + isNullish(providerOrContext) || + (typeof providerOrContext === 'string' && providerOrContext.trim() === '') || + (typeof providerOrContext !== 'string' && + !isSupportedProvider(providerOrContext as SupportedProviders) && + !(providerOrContext as Web3ContextInitOptions).provider) + ) { + console.warn( + 'NOTE: web3.js is running without provider. You need to pass a provider in order to interact with the network!', + ); + } + + let contextInitOptions: Web3ContextInitOptions = {}; + if ( + typeof providerOrContext === 'string' || + isSupportedProvider(providerOrContext as SupportedProviders) + ) { + contextInitOptions.provider = providerOrContext as + | undefined + | string + | SupportedProviders; + } else if (providerOrContext) { + contextInitOptions = providerOrContext as Web3ContextInitOptions; + } else { + contextInitOptions = {}; + } + + contextInitOptions.registeredSubscriptions = { + // all the Eth standard subscriptions + ...registeredSubscriptions, + // overridden and combined with any custom subscriptions + ...(contextInitOptions.registeredSubscriptions ?? {}), + } as CustomRegisteredSubscription; + + super(contextInitOptions); + const accounts = initAccountsForContext(this); + + // Init protected properties + this._wallet = accounts.wallet; + this._accountProvider = accounts; + + this.utils = utils; + + // Have to use local alias to initiate contract context + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + + class ContractBuilder extends Contract { + public constructor(jsonInterface: Abi); + public constructor(jsonInterface: Abi, + addressOrOptionsOrContext?: Address | ContractInitOptions | Web3Context, + ); + public constructor( + jsonInterface: Abi, + addressOrOptionsOrContext?: Address | ContractInitOptions | Web3Context, + optionsOrContextOrReturnFormat?: ContractInitOptions | Web3Context | DataFormat, + ); + public constructor(jsonInterface: Abi, + addressOrOptionsOrContext?: Address | ContractInitOptions, + optionsOrContextOrReturnFormat?: ContractInitOptions, + contextOrReturnFormat?: Web3Context | DataFormat, + ); + public constructor(jsonInterface: Abi, + addressOrOptionsOrContext?: Address | ContractInitOptions, + optionsOrContextOrReturnFormat?: ContractInitOptions, + contextOrReturnFormat?: Web3Context | DataFormat, + ); + public constructor(jsonInterface: Abi, + addressOrOptionsOrContext?: Address | ContractInitOptions, + optionsOrContextOrReturnFormat?: ContractInitOptions, + contextOrReturnFormat?: Web3Context | DataFormat, + returnFormat?: DataFormat + ) + { + if (isContractInitOptions(addressOrOptionsOrContext) && isContractInitOptions(optionsOrContextOrReturnFormat)) { + throw new InvalidMethodParamsError( + 'Should not provide options at both 2nd and 3rd parameters', + ); + } + let address: string | undefined; + let options: object = {}; + let context: Web3ContextObject; + let dataFormat: DataFormat = DEFAULT_RETURN_FORMAT; + + // add validation so its not a breaking change + if (!isNullish(addressOrOptionsOrContext) && typeof addressOrOptionsOrContext !== 'object' && typeof addressOrOptionsOrContext !== 'string') { + throw new InvalidMethodParamsError(); + } + + if (typeof addressOrOptionsOrContext === 'string') { + address = addressOrOptionsOrContext; + } + if (isContractInitOptions(addressOrOptionsOrContext)){ + options = addressOrOptionsOrContext as object; + } else if (isContractInitOptions(optionsOrContextOrReturnFormat)) { + options = optionsOrContextOrReturnFormat as object; + } else { + options = {} + } + + if (addressOrOptionsOrContext instanceof Web3Context) { + context = addressOrOptionsOrContext; + } else if (optionsOrContextOrReturnFormat instanceof Web3Context) { + context = optionsOrContextOrReturnFormat; + } else if (contextOrReturnFormat instanceof Web3Context) { + context = contextOrReturnFormat; + } else { + context = self.getContextObject() as Web3ContextObject; + } + + if (returnFormat){ + dataFormat = returnFormat; + } else if (isDataFormat(optionsOrContextOrReturnFormat)) { + dataFormat = optionsOrContextOrReturnFormat as DataFormat; + } else if (isDataFormat(contextOrReturnFormat)) { + dataFormat = contextOrReturnFormat; + } + + super(jsonInterface,address, options, context, dataFormat) + super.subscribeToContextEvents(self); + } + } + + const eth = self.use(Web3Eth); + + // Eth Module + this.eth = Object.assign(eth, { + // ENS module + ens: self.use(ENS, registryAddresses.main), // registry address defaults to main network + + // Iban helpers + Iban, + + net: self.use(Net), + personal: self.use(Personal), + + // Contract helper and module + Contract: ContractBuilder, + + // ABI Helpers + abi, + + // Accounts helper + accounts, + }); + } +} +export default Web3; diff --git a/packages/web3/src/web3_eip6963.ts b/packages/web3/src/web3_eip6963.ts new file mode 100644 index 00000000000..787502a4125 --- /dev/null +++ b/packages/web3/src/web3_eip6963.ts @@ -0,0 +1,91 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3APISpec, EIP1193Provider } from "web3-types"; + + +export enum Eip6963EventName { + eip6963announceProvider = 'eip6963:announceProvider', + eip6963requestProvider = 'eip6963:requestProvider', +}; + +export interface EIP6963ProviderInfo { + uuid: string; + name: string; + icon: string; + rdns: string; +} + +export interface EIP6963ProviderDetail { + info: EIP6963ProviderInfo; + provider: EIP1193Provider; +} + +export interface EIP6963AnnounceProviderEvent extends CustomEvent { + type: Eip6963EventName.eip6963announceProvider; + detail: EIP6963ProviderDetail; +} + +export interface EIP6963RequestProviderEvent extends Event { + type: Eip6963EventName.eip6963requestProvider; +} + +export const eip6963ProvidersMap: Map = new Map(); + +export const web3ProvidersMapUpdated = "web3:providersMapUpdated"; +export interface EIP6963ProvidersMapUpdateEvent extends CustomEvent { + type: string; + detail: Map; +} + +export const requestEIP6963Providers = async () => + new Promise((resolve, reject) => { + if (typeof window === 'undefined') { + reject(new Error("window object not available, EIP-6963 is intended to be used within a browser")); + } + + window.addEventListener( + Eip6963EventName.eip6963announceProvider as any, + (event: EIP6963AnnounceProviderEvent) => { + + eip6963ProvidersMap.set( + event.detail.info.uuid, + event.detail); + + const newEvent: EIP6963ProvidersMapUpdateEvent = new CustomEvent( + web3ProvidersMapUpdated, + { detail: eip6963ProvidersMap } + ); + + window.dispatchEvent(newEvent); + resolve(eip6963ProvidersMap); + + } + ); + + window.dispatchEvent(new Event(Eip6963EventName.eip6963requestProvider)); + + }); + + +export const onNewProviderDiscovered = (callback: (providerEvent: EIP6963AnnounceProviderEvent) => void) => { + if (typeof window === 'undefined') { + throw new Error("window object not available, EIP-6963 is intended to be used within a browser"); + } + window.addEventListener(web3ProvidersMapUpdated as any, callback ); +} + diff --git a/packages/web3/test/.eslintrc.js b/packages/web3/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/packages/web3/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3/test/benchmark/abi.ts b/packages/web3/test/benchmark/abi.ts new file mode 100644 index 00000000000..36ff4a00404 --- /dev/null +++ b/packages/web3/test/benchmark/abi.ts @@ -0,0 +1,28 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { decodeParameters, encodeParameters } from 'web3-eth-abi'; + +export const abiDecode = async () => { + return decodeParameters( + ['uint256', 'string'], + '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000', + ); +}; +export const abiEncode = async () => { + return encodeParameters(['uint256', 'string'], ['2345675643', 'Hello!%']); +}; diff --git a/packages/web3/test/benchmark/benchmark.ts b/packages/web3/test/benchmark/benchmark.ts new file mode 100644 index 00000000000..2d0c6eb6006 --- /dev/null +++ b/packages/web3/test/benchmark/benchmark.ts @@ -0,0 +1,47 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Benchmark from 'benchmark'; +import fs from 'fs'; +import path from 'path'; + +import { processingTx } from './processingTx'; +import { + processingContractDeploy, + processingContractMethodSend, + processingContractMethodCall, +} from './processingContract'; +import { abiEncode, abiDecode } from './abi'; +import { sign, verify } from './wallet'; + +const suite = new Benchmark.Suite(); +const results: any[] = []; +suite + .add('processingTx', processingTx) + .add('processingContractDeploy', processingContractDeploy) + .add('processingContractMethodSend', processingContractMethodSend) + .add('processingContractMethodCall', processingContractMethodCall) + .add('abiEncode', abiEncode) + .add('abiDecode', abiDecode) + .add('sign', sign) + .add('verify', verify) + .on('cycle', (event: any) => { + results.push(String(event.target)); + }) + .run({ async: true }) + .on('complete', () => { + fs.writeFileSync(path.join('..', '..', 'benchmark-data.txt'), results.join('\n')); + }); diff --git a/packages/web3/test/benchmark/helpers.ts b/packages/web3/test/benchmark/helpers.ts new file mode 100644 index 00000000000..d70b6dc484f --- /dev/null +++ b/packages/web3/test/benchmark/helpers.ts @@ -0,0 +1,23 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3Context } from 'web3-core'; + +export const context = new Web3Context({ + // eslint-disable-next-line @typescript-eslint/no-empty-function + request: () => {}, +}); diff --git a/packages/web3/test/benchmark/processingContract.ts b/packages/web3/test/benchmark/processingContract.ts new file mode 100644 index 00000000000..2f1966cdf04 --- /dev/null +++ b/packages/web3/test/benchmark/processingContract.ts @@ -0,0 +1,56 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { AbiFunctionFragment, ContractOptions } from 'web3-types'; +// eslint-disable-next-line +import { getSendTxParams, getEthTxCallParams } from 'web3-eth-contract'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import accounts from '../shared_fixtures/accounts.json'; + +const abiConstructor = BasicAbi.find(j => j.type === 'constructor') as AbiFunctionFragment; +const abiSendMethod = BasicAbi.find( + j => j.type === 'function' && j.name === 'firesMultiValueEvent', +) as AbiFunctionFragment; +const abiCallMethod = BasicAbi.find( + j => j.type === 'function' && j.name === 'getBoolValue', +) as AbiFunctionFragment; + +export const processingContractDeploy = async () => { + return getSendTxParams({ + abi: abiConstructor, + params: [1123, 'asdasd'], + options: { dataInputFill: 'data', data: BasicBytecode }, + contractOptions: { from: accounts[0].address } as ContractOptions, + }); +}; + +export const processingContractMethodSend = async () => { + return getSendTxParams({ + abi: abiSendMethod, + params: ['asdasd', 1123, true], + options: { dataInputFill: 'data', to: accounts[1].address }, + contractOptions: { from: accounts[0].address } as ContractOptions, + }); +}; + +export const processingContractMethodCall = async () => { + return getEthTxCallParams({ + abi: abiCallMethod, + params: [], + options: { dataInputFill: 'data', to: accounts[1].address }, + contractOptions: { from: accounts[0].address } as ContractOptions, + }); +}; diff --git a/packages/web3/test/benchmark/processingTx.ts b/packages/web3/test/benchmark/processingTx.ts new file mode 100644 index 00000000000..ac748e64726 --- /dev/null +++ b/packages/web3/test/benchmark/processingTx.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { prepareTransactionForSigning } from 'web3-eth'; +import accounts from '../shared_fixtures/accounts.json'; +import { context } from './helpers'; + +export const processingTx = async () => { + return prepareTransactionForSigning( + { + from: accounts[0].address, + to: accounts[1].address, + value: BigInt(1), + nonce: 0, + chainId: 0, + gas: BigInt(100000), + gasPrice: BigInt(10000), + }, + context, + undefined, + false, + false, + ); +}; diff --git a/packages/web3/test/benchmark/wallet.ts b/packages/web3/test/benchmark/wallet.ts new file mode 100644 index 00000000000..d2237da407e --- /dev/null +++ b/packages/web3/test/benchmark/wallet.ts @@ -0,0 +1,42 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-extraneous-dependencies +import { Wallet, create, Web3Account, recover } from 'web3-eth-accounts'; +import { Web3AccountProvider } from 'web3-types'; +import { context } from './helpers'; + +const wallet = new Wallet(context.accountProvider as Web3AccountProvider); +const acc = create(); +wallet.add(acc); + +export const sign = async () => { + return (wallet.get(acc.address) as Web3Account).sign('Some data'); +}; + +const signedData = { + message: 'Some data', + messageHash: '0x1da44b586eb0729ff70a73c326926f6ed5a25f5b056e7f47fbc6e58d86871655', + v: '0x1c', + r: '0x297a764ab50bf53381d19ce1dc2b7dd4c456c91e38722ebced5b9f5bb54648f3', + s: '0x41f216d7482608ca295651a7fa4f66a5ee5336d06a9d5b344f8a9160e1e9c2aa', + signature: + '0x297a764ab50bf53381d19ce1dc2b7dd4c456c91e38722ebced5b9f5bb54648f341f216d7482608ca295651a7fa4f66a5ee5336d06a9d5b344f8a9160e1e9c2aa1c', +}; + +export const verify = async () => { + return recover(signedData.message, signedData.v, signedData.r, signedData.s); +}; diff --git a/packages/web3/test/cjs_black_box/.eslintrc.cjs b/packages/web3/test/cjs_black_box/.eslintrc.cjs new file mode 100644 index 00000000000..88d28e7e786 --- /dev/null +++ b/packages/web3/test/cjs_black_box/.eslintrc.cjs @@ -0,0 +1,12 @@ +module.exports = { + env: { + node: true, + commonjs: true, + es2021: true, + }, + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + ecmaVersion: 12 + }, +}; diff --git a/packages/web3/test/cjs_black_box/.yarnrc b/packages/web3/test/cjs_black_box/.yarnrc new file mode 100644 index 00000000000..c408289a8d4 --- /dev/null +++ b/packages/web3/test/cjs_black_box/.yarnrc @@ -0,0 +1 @@ +registry "http://localhost:4873" diff --git a/packages/web3/test/cjs_black_box/jest.config.js b/packages/web3/test/cjs_black_box/jest.config.js new file mode 100644 index 00000000000..af2cbbc57cf --- /dev/null +++ b/packages/web3/test/cjs_black_box/jest.config.js @@ -0,0 +1,11 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: '../config/tsconfig.cjs.json', + }, + ], + }, +}; diff --git a/packages/web3/test/cjs_black_box/package.json b/packages/web3/test/cjs_black_box/package.json new file mode 100644 index 00000000000..e5041d08c1d --- /dev/null +++ b/packages/web3/test/cjs_black_box/package.json @@ -0,0 +1,24 @@ +{ + "name": "web3_black_box_cjs_tests", + "version": "1.0.0", + "main": "index.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "type": "commonjs", + "scripts": { + "test:geth:http": "WEB3_SYSTEM_TEST_BACKEND=geth WEB3_SYSTEM_TEST_PROVIDER=http://localhost:8545 jest", + "test:geth:ws": "WEB3_SYSTEM_TEST_BACKEND=geth WEB3_SYSTEM_TEST_PROVIDER=ws://localhost:8545 jest --forceExit", + "test:infura:http": "WEB3_SYSTEM_TEST_BACKEND=infura jest", + "test:infura:ws": "WEB3_SYSTEM_TEST_BACKEND=infura jest --forceExit" + }, + "dependencies": { + "web3": "5.0.0" + }, + "devDependencies": { + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "web3-eth": "5.0.0", + "web3-eth-contract": "5.0.0", + "web3-validator": "5.0.0" + } +} diff --git a/packages/web3/test/cjs_black_box/test/batchRequest.test.ts b/packages/web3/test/cjs_black_box/test/batchRequest.test.ts new file mode 100644 index 00000000000..98035c0ce43 --- /dev/null +++ b/packages/web3/test/cjs_black_box/test/batchRequest.test.ts @@ -0,0 +1,67 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable import/no-relative-packages */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +import { + getSystemTestProvider, + closeOpenConnection, + isWs, +} from '../../shared_fixtures/system_tests_utils'; +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +const Web3 = require('web3').default; + +describe('CJS - Black Box Unit Tests - web3.BatchRequest', () => { + let web3: typeof Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should make a batch request', async () => { + const request1 = { + id: 42, + method: 'eth_getBalance', + params: ['0x4242000000000000000000000000000000000000', 'latest'], + }; + const request2 = { + id: 24, + method: 'eth_getBalance', + params: ['0x2424000000000000000000000000000000000000', 'latest'], + }; + + const batch = new web3.BatchRequest(); + const request1Promise = batch.add(request1); + const request2Promise = batch.add(request2); + + const executePromise = batch.execute(); + const response = await Promise.all([request1Promise, request2Promise, executePromise]); + + const expectedResponse = [ + '0x0', + '0x0', + [ + { jsonrpc: '2.0', id: 42, result: '0x0' }, + { jsonrpc: '2.0', id: 24, result: '0x0' }, + ], + ]; + expect(response).toStrictEqual(expectedResponse); + }); +}); diff --git a/packages/web3/test/cjs_black_box/test/web3-eth-accounts/create.test.ts b/packages/web3/test/cjs_black_box/test/web3-eth-accounts/create.test.ts new file mode 100644 index 00000000000..c5cb2f0260b --- /dev/null +++ b/packages/web3/test/cjs_black_box/test/web3-eth-accounts/create.test.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// TODO For some reason when running this test with a WebSocket provider +// the test takes a long time to run afterAll +import Web3 from 'web3'; +import { validator } from 'web3-validator'; +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; + +jest.setTimeout(15000); + +// TODO Consider adding this to web3.eth.accounts package +const accountSchema = { + type: 'object', + required: ['address', 'privateKey'], + // TODO Should validation functions as well + // required: ['address', 'privateKey', 'signTransaction', 'sign', 'encrypt'], + properties: { + address: { type: 'string' }, + privateKey: { type: 'string' }, + }, +}; + +describe('Black Box Unit Tests - web3.eth.accounts.create', () => { + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should create an account', () => { + const response = web3.eth.accounts.create(); + expect(response).toBeDefined(); + expect(response.signTransaction).toBeDefined(); + expect(response.sign).toBeDefined(); + expect(response.encrypt).toBeDefined(); + expect(validator.validateJSONSchema(accountSchema, response)).toBeUndefined(); + }); +}); diff --git a/packages/web3/test/cjs_black_box/test/web3-eth-accounts/hashMessage.test.ts b/packages/web3/test/cjs_black_box/test/web3-eth-accounts/hashMessage.test.ts new file mode 100644 index 00000000000..88959f84aa9 --- /dev/null +++ b/packages/web3/test/cjs_black_box/test/web3-eth-accounts/hashMessage.test.ts @@ -0,0 +1,47 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// TODO For some reason when running this test with a WebSocket provider +// the test takes a long time to run afterAll +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; +/* eslint-disable @typescript-eslint/no-unsafe-call */ +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +const Web3 = require('web3').default; + +jest.setTimeout(15000); + +describe('CJS - Black Box Unit Tests - web3.eth.accounts.hashMessage', () => { + let web3: typeof Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should hash provided message', () => { + expect(web3.eth.accounts.hashMessage('Hello World')).toBe( + '0xa1de988600a42c4b4ab089b619297c17d53cffae5d5120d82d8a92d0bb3b78f2', + ); + }); +}); diff --git a/packages/web3/test/cjs_black_box/test/web3-eth-contract/erc20.test.ts b/packages/web3/test/cjs_black_box/test/web3-eth-contract/erc20.test.ts new file mode 100644 index 00000000000..3f8f88238e0 --- /dev/null +++ b/packages/web3/test/cjs_black_box/test/web3-eth-contract/erc20.test.ts @@ -0,0 +1,101 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Contract from 'web3-eth-contract'; +import { + closeOpenConnection, + describeIf, + getSystemTestBackend, + isWs, + getSystemTestProvider, + createNewAccount, + BACKEND + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; +import { + ERC20TokenAbi, + ERC20TokenBytecode, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/contracts/ERC20Token'; +/* eslint-disable @typescript-eslint/no-unsafe-call */ +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +const Web3 = require('web3').default; + +describeIf(getSystemTestBackend() === BACKEND.INFURA)( + 'CJS - Black Box Unit Tests - web3.eth.Contract', + () => { + describe('Infura - ERC20', () => { + const mainNetUSDTAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; + + let web3: typeof Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + it('should get deployed contract info', async () => { + const contract = new web3.eth.Contract(ERC20TokenAbi, mainNetUSDTAddress); + + expect(await contract.methods.name().call()).toBe('Tether USD'); + expect(await contract.methods.symbol().call()).toBe('USDT'); + expect(await contract.methods.decimals().call()).toBe(BigInt(6)); + }); + }); + }, +); + +describeIf(getSystemTestBackend() === BACKEND.GETH || getSystemTestBackend() === BACKEND.GETH)( + 'Black Box Unit Tests - web3.eth.Contract', + () => { + describe('Geth || Hardhat - ERC20', () => { + let account; + let web3: typeof Web3; + let deployedContract: Contract; + + beforeAll(async () => { + account = await createNewAccount({ + unlock: true, + refill: true, + doNotImport: false, + }); + + web3 = new Web3(getSystemTestProvider()); + deployedContract = await new web3.eth.Contract(ERC20TokenAbi) + .deploy({ + data: ERC20TokenBytecode, + arguments: ['420'], + }) + .send({ from: account.address, gas: '10000000' }); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should get deployed contract info', async () => { + const contract = new web3.eth.Contract( + ERC20TokenAbi, + deployedContract.options.address, + ); + + expect(await contract.methods.name().call()).toBe('Gold'); + expect(await contract.methods.symbol().call()).toBe('GLD'); + expect(await contract.methods.decimals().call()).toBe(BigInt(18)); + expect(await contract.methods.totalSupply().call()).toBe(BigInt(420)); + }); + }); + }, +); diff --git a/packages/web3/test/cjs_black_box/test/web3-eth/getBlock.test.ts b/packages/web3/test/cjs_black_box/test/web3-eth/getBlock.test.ts new file mode 100644 index 00000000000..9eb415c9978 --- /dev/null +++ b/packages/web3/test/cjs_black_box/test/web3-eth/getBlock.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { validator } from 'web3-validator'; +import { blockSchema } from 'web3-eth'; +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; +/* eslint-disable @typescript-eslint/no-unsafe-call */ +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +const Web3 = require('web3').default; + +describe('CJS - Black Box Unit Tests - web3.eth.getBlock', () => { + let web3: typeof Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should get the latest block and validate it against blockSchema', async () => { + const response = await web3.eth.getBlock('latest'); + expect(response).toBeDefined(); + expect(validator.validateJSONSchema(blockSchema, response)).toBeUndefined(); + }); + + it('should get the latest block and validate it against blockSchema - hydrated = true', async () => { + const response = await web3.eth.getBlock('latest', true); + expect(response).toBeDefined(); + expect(validator.validateJSONSchema(blockSchema, response)).toBeUndefined(); + }); +}); diff --git a/packages/web3/test/cjs_black_box/test/web3-eth/getTransaction.test.ts b/packages/web3/test/cjs_black_box/test/web3-eth/getTransaction.test.ts new file mode 100644 index 00000000000..b65fe6e4135 --- /dev/null +++ b/packages/web3/test/cjs_black_box/test/web3-eth/getTransaction.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + itIf, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; +/* eslint-disable @typescript-eslint/no-unsafe-call */ +// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires +const Web3 = require('web3').default; + +describe('CJS - Black Box Unit Tests - web3.eth.getTransaction', () => { + let web3: typeof Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + itIf(process.env.WEB3_SYSTEM_TEST_BACKEND === 'infura')( + 'should get specific USDT transaction', + async () => { + const expectedTxObject = { + accessList: [], + blockHash: '0x8ad298dbdf859f953b97cc27218e7f7f2af4237817a8dbd1d987891520286612', + blockNumber: BigInt(15230806), + chainId: BigInt(1), + from: '0x4c9af439b1a6761b8e549d8d226a468a6b2803a8', + gas: BigInt(120000), + gasPrice: BigInt(9022588986), + hash: '0x133048bfcf6c0f7f8d1f5681df9607802894667acb46f4a3ba8ba187421dfc2b', + input: '0xa9059cbb000000000000000000000000d9e46776dbc0e37d6f89be3a23885234c75702b6000000000000000000000000000000000000000000000000000000012a05f200', + maxFeePerGas: BigInt(32251128981), + maxPriorityFeePerGas: BigInt(1000000000), + nonce: BigInt(83553), + r: '0x1240db6f5b2245729b8593ff43230795e3c4c1005776dd6841de68da926096e9', + s: '0x48678639e5b752a69dcc62b4ef9417b3f65e4d4c75ec99df8457b02b339799de', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: BigInt(190), + type: BigInt(2), + v: BigInt(1), + value: BigInt(0), + }; + + const response = await web3.eth.getTransaction( + '0x133048bfcf6c0f7f8d1f5681df9607802894667acb46f4a3ba8ba187421dfc2b', + ); + // eslint-disable-next-line jest/no-standalone-expect + expect(response).toStrictEqual(expectedTxObject); + }, + ); +}); diff --git a/packages/web3/test/cjs_black_box/tsconfig.json b/packages/web3/test/cjs_black_box/tsconfig.json new file mode 100644 index 00000000000..0a25a9556aa --- /dev/null +++ b/packages/web3/test/cjs_black_box/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.cjs.json", + "compilerOptions": { + "declaration": false, + "declarationMap": false + }, + "include": ["./**/*", "../node_modules/jest-extended/types/**/*.ts"] +} diff --git a/packages/web3/test/cjs_black_box/yarn.lock b/packages/web3/test/cjs_black_box/yarn.lock new file mode 100644 index 00000000000..58987d9d096 --- /dev/null +++ b/packages/web3/test/cjs_black_box/yarn.lock @@ -0,0 +1,3025 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@^1.8.8": + version "1.9.0" + resolved "http://localhost:4873/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" + integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "http://localhost:4873/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "http://localhost:4873/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.21.4": + version "7.21.4" + resolved "http://localhost:4873/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" + integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.21.4" + resolved "http://localhost:4873/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" + integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.4" + "@babel/types" "^7.21.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.21.4", "@babel/generator@^7.7.2": + version "7.21.4" + resolved "http://localhost:4873/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== + dependencies: + "@babel/types" "^7.21.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.21.4": + version "7.21.4" + resolved "http://localhost:4873/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" + integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== + dependencies: + "@babel/compat-data" "^7.21.4" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "http://localhost:4873/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.21.4" + resolved "http://localhost:4873/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + +"@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "http://localhost:4873/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0": + version "7.20.2" + resolved "http://localhost:4873/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "http://localhost:4873/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "http://localhost:4873/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "http://localhost:4873/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "http://localhost:4873/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "http://localhost:4873/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": + version "7.21.4" + resolved "http://localhost:4873/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "http://localhost:4873/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "http://localhost:4873/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "http://localhost:4873/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.21.4" + resolved "http://localhost:4873/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "http://localhost:4873/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4", "@babel/traverse@^7.7.2": + version "7.21.4" + resolved "http://localhost:4873/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" + integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.4" + "@babel/types" "^7.21.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.21.4" + resolved "http://localhost:4873/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "http://localhost:4873/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "http://localhost:4873/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "http://localhost:4873/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + +"@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "http://localhost:4873/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "http://localhost:4873/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "http://localhost:4873/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "http://localhost:4873/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "http://localhost:4873/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" + micromatch "^4.0.4" + pretty-format "^28.1.3" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + dependencies: + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + dependencies: + expect "^28.1.3" + jest-snapshot "^28.1.3" + +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" + +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "http://localhost:4873/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + dependencies: + "@jridgewell/trace-mapping" "^0.3.13" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + dependencies: + "@jest/test-result" "^28.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" + +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "http://localhost:4873/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "http://localhost:4873/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "http://localhost:4873/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "http://localhost:4873/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "http://localhost:4873/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "http://localhost:4873/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "http://localhost:4873/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "http://localhost:4873/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@scure/base@~1.1.0": + version "1.1.1" + resolved "http://localhost:4873/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "http://localhost:4873/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "http://localhost:4873/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "http://localhost:4873/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "http://localhost:4873/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "http://localhost:4873/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "http://localhost:4873/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "http://localhost:4873/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "http://localhost:4873/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "http://localhost:4873/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/bn.js@^5.1.0": + version "5.1.1" + resolved "http://localhost:4873/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "http://localhost:4873/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "http://localhost:4873/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "http://localhost:4873/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "http://localhost:4873/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/node@*": + version "18.15.11" + resolved "http://localhost:4873/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "http://localhost:4873/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "http://localhost:4873/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "http://localhost:4873/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "http://localhost:4873/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "http://localhost:4873/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "http://localhost:4873/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +ajv@^8.11.0: + version "8.12.0" + resolved "http://localhost:4873/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "http://localhost:4873/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "http://localhost:4873/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "http://localhost:4873/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +babel-jest@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== + dependencies: + "@jest/transform" "^28.1.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "http://localhost:4873/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== + dependencies: + babel-plugin-jest-hoist "^28.1.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "http://localhost:4873/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "http://localhost:4873/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +blakejs@^1.1.0: + version "1.2.1" + resolved "http://localhost:4873/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@^4.11.9: + version "4.12.0" + resolved "http://localhost:4873/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "http://localhost:4873/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "http://localhost:4873/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "http://localhost:4873/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "http://localhost:4873/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "http://localhost:4873/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserslist@^4.21.3: + version "4.21.5" + resolved "http://localhost:4873/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bs-logger@0.x: + version "0.2.6" + resolved "http://localhost:4873/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bs58@^4.0.0: + version "4.0.1" + resolved "http://localhost:4873/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "http://localhost:4873/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +bser@2.1.1: + version "2.1.1" + resolved "http://localhost:4873/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "http://localhost:4873/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "http://localhost:4873/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "http://localhost:4873/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001449: + version "1.0.30001477" + resolved "http://localhost:4873/caniuse-lite/-/caniuse-lite-1.0.30001477.tgz#a2ffb2276258233034bbb869d4558b02658a511e" + integrity sha512-lZim4iUHhGcy5p+Ri/G7m84hJwncj+Kz7S5aD4hoQfslKZJgt0tHc/hafVbqHC5bbhHb+mrW2JOUHkI5KH7toQ== + +chalk@^2.0.0: + version "2.4.2" + resolved "http://localhost:4873/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "http://localhost:4873/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^3.2.0: + version "3.8.0" + resolved "http://localhost:4873/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "http://localhost:4873/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "http://localhost:4873/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cliui@^8.0.1: + version "8.0.1" + resolved "http://localhost:4873/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "http://localhost:4873/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "http://localhost:4873/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "http://localhost:4873/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "http://localhost:4873/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "http://localhost:4873/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "http://localhost:4873/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +crc-32@^1.2.0: + version "1.2.2" + resolved "http://localhost:4873/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "http://localhost:4873/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "http://localhost:4873/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "http://localhost:4873/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "http://localhost:4873/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "http://localhost:4873/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +dedent@^0.7.0: + version "0.7.0" + resolved "http://localhost:4873/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "http://localhost:4873/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^28.1.1: + version "28.1.1" + resolved "http://localhost:4873/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + +electron-to-chromium@^1.4.284: + version "1.4.356" + resolved "http://localhost:4873/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz#b75a8a8c31d571f6024310cc980a08cd6c15a8c5" + integrity sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A== + +elliptic@6.5.4, elliptic@^6.5.4: + version "6.5.4" + resolved "http://localhost:4873/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.10.2: + version "0.10.2" + resolved "http://localhost:4873/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "http://localhost:4873/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "http://localhost:4873/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "http://localhost:4873/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +esprima@^4.0.0: + version "4.0.1" + resolved "http://localhost:4873/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "http://localhost:4873/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.1.2: + version "1.2.0" + resolved "http://localhost:4873/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "http://localhost:4873/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.0.0: + version "5.1.1" + resolved "http://localhost:4873/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "http://localhost:4873/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "http://localhost:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "http://localhost:4873/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "http://localhost:4873/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "http://localhost:4873/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "http://localhost:4873/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "http://localhost:4873/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "http://localhost:4873/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "http://localhost:4873/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "http://localhost:4873/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "http://localhost:4873/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "http://localhost:4873/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "http://localhost:4873/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.2.9: + version "4.2.11" + resolved "http://localhost:4873/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "http://localhost:4873/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "http://localhost:4873/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +human-signals@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +import-local@^3.0.2: + version "3.1.0" + resolved "http://localhost:4873/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "http://localhost:4873/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "http://localhost:4873/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "http://localhost:4873/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "http://localhost:4873/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-core-module@^2.11.0: + version "2.11.0" + resolved "http://localhost:4873/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "http://localhost:4873/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "http://localhost:4873/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-stream@^2.0.0: + version "2.0.1" + resolved "http://localhost:4873/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "http://localhost:4873/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "http://localhost:4873/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "http://localhost:4873/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "http://localhost:4873/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== + dependencies: + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-docblock@^28.1.1: + version "28.1.1" + resolved "http://localhost:4873/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== + dependencies: + detect-newline "^3.0.0" + +jest-each@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== + dependencies: + "@jest/types" "^28.1.3" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" + +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +jest-get-type@^28.0.2: + version "28.0.2" + resolved "http://localhost:4873/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== + dependencies: + "@jest/types" "^28.1.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "http://localhost:4873/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "http://localhost:4873/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" + +jest-resolve@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + natural-compare "^1.4.0" + pretty-format "^28.1.3" + semver "^7.3.5" + +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== + dependencies: + "@jest/types" "^28.1.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.3" + +jest-watcher@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== + dependencies: + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" + import-local "^3.0.2" + jest-cli "^28.1.3" + +js-sha3@0.8.0: + version "0.8.0" + resolved "http://localhost:4873/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "http://localhost:4873/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "http://localhost:4873/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "http://localhost:4873/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.2.1, json5@^2.2.2: + version "2.2.3" + resolved "http://localhost:4873/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keccak@^3.0.0: + version "3.0.3" + resolved "http://localhost:4873/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kleur@^3.0.3: + version "3.0.3" + resolved "http://localhost:4873/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "http://localhost:4873/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "http://localhost:4873/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "http://localhost:4873/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "http://localhost:4873/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "http://localhost:4873/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +md5.js@^1.3.4: + version "1.3.5" + resolved "http://localhost:4873/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "http://localhost:4873/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "http://localhost:4873/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "http://localhost:4873/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "http://localhost:4873/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "http://localhost:4873/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2.6.7: + version "2.6.7" + resolved "http://localhost:4873/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.6.0" + resolved "http://localhost:4873/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "http://localhost:4873/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.8: + version "2.0.10" + resolved "http://localhost:4873/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "http://localhost:4873/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "http://localhost:4873/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "http://localhost:4873/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "http://localhost:4873/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "http://localhost:4873/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^5.2.0: + version "5.2.0" + resolved "http://localhost:4873/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "http://localhost:4873/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "http://localhost:4873/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "http://localhost:4873/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "http://localhost:4873/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.5" + resolved "http://localhost:4873/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "http://localhost:4873/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "http://localhost:4873/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +punycode@^2.1.0: + version "2.3.0" + resolved "http://localhost:4873/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-is@^18.0.0: + version "18.2.0" + resolved "http://localhost:4873/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +readable-stream@^3.6.0: + version "3.6.2" + resolved "http://localhost:4873/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "http://localhost:4873/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "http://localhost:4873/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve@^1.20.0: + version "1.22.2" + resolved "http://localhost:4873/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rimraf@^3.0.0: + version "3.0.2" + resolved "http://localhost:4873/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "http://localhost:4873/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4: + version "2.2.7" + resolved "http://localhost:4873/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "http://localhost:4873/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +scrypt-js@^3.0.0: + version "3.0.1" + resolved "http://localhost:4873/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "http://localhost:4873/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semver@7.x, semver@^7.3.5: + version "7.3.8" + resolved "http://localhost:4873/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "http://localhost:4873/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "http://localhost:4873/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "http://localhost:4873/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@0.5.13: + version "0.5.13" + resolved "http://localhost:4873/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "http://localhost:4873/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "http://localhost:4873/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "http://localhost:4873/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "http://localhost:4873/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "http://localhost:4873/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "http://localhost:4873/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "http://localhost:4873/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "http://localhost:4873/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "http://localhost:4873/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "http://localhost:4873/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "http://localhost:4873/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "http://localhost:4873/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +terminal-link@^2.0.0: + version "2.1.1" + resolved "http://localhost:4873/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +tmpl@1.0.5: + version "1.0.5" + resolved "http://localhost:4873/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "http://localhost:4873/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-jest@^28.0.7: + version "28.0.8" + resolved "http://localhost:4873/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "http://localhost:4873/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "http://localhost:4873/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "http://localhost:4873/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "http://localhost:4873/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "http://localhost:4873/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "http://localhost:4873/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +walker@^1.0.8: + version "1.0.8" + resolved "http://localhost:4873/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +web3-core@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-core/-/web3-core-5.0.0.tgz#35e8df92dff96d46b7e9c565946a2e54fa5aa4f1" + integrity sha512-vVtZMUbZasYd/4bqHOP3t/l3dHOFzYCPnsxZM+ptc2p96GvryC6/OwwZZ6eh14bkih7VvSmUX/heuajCK4HQ1g== + dependencies: + web3-errors "^5.0.0" + web3-eth-iban "^5.0.0" + web3-providers-http "^5.0.0" + web3-providers-ipc "^5.0.0" + web3-providers-ws "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-errors@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-errors/-/web3-errors-5.0.0.tgz#3bee981fc4cb31229eeadc0a3c365f2e59fd26ee" + integrity sha512-9ctSvRebarCS6rTQIwNo+w+bKn1KKC52R9W3fJjD13X47G/tQ1zTTGcsVkNRq5qgsyjJmbmDe8pJhYOLfDj1gg== + dependencies: + web3-types "^5.0.0" + +web3-eth-abi@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-abi/-/web3-eth-abi-5.0.0.tgz#f88c78121a3f65107b44b34638e9a534e8cbdff6" + integrity sha512-TYsp6uXzXKSxJOEmWVkwyaFeFYrLCiu++Y4kAYXKFXOY+pSWGQ1owml/24KE+nLO9INvXir4ATxGVC3SuhZeYA== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-eth-accounts@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-accounts/-/web3-eth-accounts-5.0.0.tgz#75d223096e899db803bed2c684b8d542ea9b3cda" + integrity sha512-btDSO3A4EgAe3ibGQRjJOHPkA6ngMWWcgpvmQCQFBolCQQhGSiV72ywtjrDakJQtDPbdjKDGnFKQCzTC+dudWw== + dependencies: + "@ethereumjs/tx" "^3.5.2" + ethereum-cryptography "^1.1.2" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth-contract@5.0.0, web3-eth-contract@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-contract/-/web3-eth-contract-5.0.0.tgz#f54ccbc1194227f0e319358c924cd15732f01504" + integrity sha512-dmzzYo56rzIAWHYIyU7drf5pRNTqHzfV/gyZIhZr/r5/9B4fwnmaROeDmiYvvGHtRa7bYbQ4/BFbyBvc+Mv6Ag== + dependencies: + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth "^5.0.0" + web3-eth-abi "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth-ens@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-ens/-/web3-eth-ens-5.0.0.tgz#938bf7982ab7208cb281745e9be9854a94d5f1ba" + integrity sha512-bz/brHWOvW8nSkt/8RPTi6aEuyNZHkl9W8siIpPHMPfNPpV49IGHhLz8WA9UuEhVbs+VJj5/7qMWkRVujS+omA== + dependencies: + "@adraffy/ens-normalize" "^1.8.8" + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth "^5.0.0" + web3-eth-contract "^5.0.0" + web3-net "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth-iban@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-iban/-/web3-eth-iban-5.0.0.tgz#381a800d82d0a9cff5d812d672b304391ddbb836" + integrity sha512-jB2uQynx4/30ODjGKPr/v3ftHYnqfAq/JGOZaBSdj5uZnCOnwZO5zHQE7LeBDsvyR0D5zkSVtKfGJHyChrod9Q== + dependencies: + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth-personal@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-personal/-/web3-eth-personal-5.0.0.tgz#2bef135325ce087db83b2965d6bf81b32a3b1cac" + integrity sha512-RjTPVrXQ1xHNtLDBiMwBctBQRyddEt2pdvS/Ew7NJLJUHYLD4guzc1u/iszx5skrGA7TV5PCQGwFVFkUg08Bug== + dependencies: + web3-core "^5.0.0" + web3-eth "^5.0.0" + web3-rpc-methods "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth@5.0.0, web3-eth@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth/-/web3-eth-5.0.0.tgz#e3c0767117191415b912288689bdc40790e1e1e7" + integrity sha512-K0i1CT/aFJFEVPfo8GHSVMvFz+XkFxVeOSjNlXyjD5lmOhZc95axxjlqFRwDXphy//GilggTlVuYC4NWpueQaw== + dependencies: + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + setimmediate "^1.0.5" + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth-abi "^5.0.0" + web3-eth-accounts "^5.0.0" + web3-net "^5.0.0" + web3-providers-ws "^5.0.0" + web3-rpc-methods "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-net@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-net/-/web3-net-5.0.0.tgz#425fe8b4d705464a7aebe39e9de09f9f50581dd2" + integrity sha512-07nnQR+dDLq59Hmj385MhP2DsDu764VigX0pzwb/2G0CtVQcchSzztNi2YQZESxY9kOq4IVhH0Q9A6qEUFoA2A== + dependencies: + web3-core "^5.0.0" + web3-rpc-methods "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-providers-http@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-providers-http/-/web3-providers-http-5.0.0.tgz#cdb7bda362562347c362984e885baa52a1f7cb79" + integrity sha512-jYCwF84OkBPzoLOdOc3v+NvxUK9JKgPh5eF02L9ZlplnpIigznUvw+XaOwjeq607Zr00kxphF+oIvqCQLAuTaw== + dependencies: + cross-fetch "^3.1.5" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-providers-ipc@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-providers-ipc/-/web3-providers-ipc-5.0.0.tgz#8f96f4a080274c24a76038c2364cac2cd97870c1" + integrity sha512-zk/xyKhRl5Uqhdl7ltI7flE0GXgRFol/fzxHqTex1DPj9tg99sgB7aGzpA2w9BKN+WdEChM3i1nvWE762uAbXw== + dependencies: + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-providers-ws@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-providers-ws/-/web3-providers-ws-5.0.0.tgz#4e7f21ce49fdfe3b05d96c47f69bc17fdd75463b" + integrity sha512-RK2I2m/FsGrT2xDdMoAn5R21IVz9y4R6JqIy6hREm0f2034rTP4F9GR0q73ATRUsabBxZWDzqfOGgfVY24dKcw== + dependencies: + isomorphic-ws "^5.0.0" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + ws "^8.8.1" + +web3-rpc-methods@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-rpc-methods/-/web3-rpc-methods-5.0.0.tgz#2ce95e104b792b8d8ff49524e8b7eb6245c77c0f" + integrity sha512-FVNfCz028ITOB7kbcremCCrgMbR8OxFeki4/LOFaT/99mX91wWhoDTqO0ti6mCgHuwbsL6MPHEIN0hlpM1hCmQ== + dependencies: + web3-core "^5.0.0" + web3-types "^5.0.0" + web3-validator "^5.0.0" + +web3-types@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-types/-/web3-types-5.0.0.tgz#ca2220b31c4ac1fed3df1e75b3a4a2bb7ffca1c6" + integrity sha512-OmwTiV9ddciIUMhf0a2meXqp/luFE2GUylAeIT4voxZt7zpkyKqlMQmFFr5SBgR0KSrk6sIqra8yBtbthDSaIw== + +web3-utils@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-utils/-/web3-utils-5.0.0.tgz#26c686f3c7b694c4675370e0408e052f1ac7d79c" + integrity sha512-Tr5UO94aWwiWwEH2LLNhrEGWJ47lo+HodCR9sAVgKiVwFokxlfnymPON/L+X341InNkhm+t7s7KFQy7Qp1xu+g== + dependencies: + ethereum-cryptography "^1.1.2" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-validator "^5.0.0" + +web3-validator@5.0.0, web3-validator@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-validator/-/web3-validator-5.0.0.tgz#7a4cf25685db65daa68fab8523f8344514f14720" + integrity sha512-oILXo8Ro/5z20JVVyVWOpfeEzf6xmOWacm/gBH19OEEODkVIct5g+1onbMF2MiEFnC02wEEt4JgasQT6awwW/g== + dependencies: + ajv "^8.11.0" + ethereum-cryptography "^1.1.2" + web3-errors "^5.0.0" + web3-types "^5.0.0" + +web3@5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3/-/web3-5.0.0.tgz#a14d330d3fe8e61237be12e5df2d77cb6e8277ea" + integrity sha512-JYeggG2AwhsAfM16ntasw1Zxrj3tpJddw5jc8QTYR3fdthVmaG+CiPokRd482/7aS0aE1qSb+Ybr3JVXlp2Mog== + dependencies: + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth "^5.0.0" + web3-eth-abi "^5.0.0" + web3-eth-accounts "^5.0.0" + web3-eth-contract "^5.0.0" + web3-eth-ens "^5.0.0" + web3-eth-iban "^5.0.0" + web3-eth-personal "^5.0.0" + web3-net "^5.0.0" + web3-providers-http "^5.0.0" + web3-providers-ipc "^5.0.0" + web3-providers-ws "^5.0.0" + web3-rpc-methods "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "http://localhost:4873/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "http://localhost:4873/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "http://localhost:4873/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "http://localhost:4873/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.1: + version "4.0.2" + resolved "http://localhost:4873/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.8.1: + version "8.13.0" + resolved "http://localhost:4873/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +y18n@^5.0.5: + version "5.0.8" + resolved "http://localhost:4873/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "http://localhost:4873/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "http://localhost:4873/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.1" + resolved "http://localhost:4873/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "http://localhost:4873/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/packages/web3/test/config/jest.config.js b/packages/web3/test/config/jest.config.js new file mode 100644 index 00000000000..74597df99d0 --- /dev/null +++ b/packages/web3/test/config/jest.config.js @@ -0,0 +1,43 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/packages/web3/test/config/setup.js b/packages/web3/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/packages/web3/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/packages/web3/test/config/tsconfig.cjs.json b/packages/web3/test/config/tsconfig.cjs.json new file mode 100644 index 00000000000..21349129d4f --- /dev/null +++ b/packages/web3/test/config/tsconfig.cjs.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./lib/commonjs", + "esModuleInterop": true, + "declaration": true, + "module": "commonjs" + }, + "include": ["src/**/*"] +} diff --git a/packages/web3/test/config/tsconfig.esm.json b/packages/web3/test/config/tsconfig.esm.json new file mode 100644 index 00000000000..fc026594930 --- /dev/null +++ b/packages/web3/test/config/tsconfig.esm.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./lib/esm", + "esModuleInterop": true, + "module": "es2020" + }, + "include": ["src/**/*"] +} diff --git a/packages/web3/test/e2e/e2e_utils.ts b/packages/web3/test/e2e/e2e_utils.ts new file mode 100644 index 00000000000..91165ddd899 --- /dev/null +++ b/packages/web3/test/e2e/e2e_utils.ts @@ -0,0 +1,85 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/** + * @NOTE This Util method is kept separate from shared system_test_utils.ts file because + * of it's import of .secrets.json. For this method to exist in shared system_test_utils.ts + * file, the import path would be ../.secrets.json which doesn't resolve when the file is + * copied over to each package's test directory. Because web3 package is the only package + * running these E2E tests that use Sepolia and Mainnet, this util exists here for now. + */ + +import { getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +// eslint-disable-next-line import/no-relative-packages +import secrets from '../../../../.secrets.json'; + +export const getSystemE2ETestProvider = (): string => { + if (process.env.WEB3_SYSTEM_TEST_MODE === 'http') { + return getSystemTestBackend() === BACKEND.SEPOLIA + ? process.env.INFURA_SEPOLIA_HTTP ?? secrets.SEPOLIA.HTTP + : process.env.INFURA_MAINNET_HTTP ?? secrets.MAINNET.HTTP; + } + return getSystemTestBackend() === BACKEND.SEPOLIA + ? process.env.INFURA_SEPOLIA_WS ?? secrets.SEPOLIA.WS + : process.env.INFURA_MAINNET_WS ?? secrets.MAINNET.WS; +}; + +export const getE2ETestAccountAddress = (): string => { + if (process.env.TEST_ACCOUNT_ADDRESS !== undefined) { + return process.env.TEST_ACCOUNT_ADDRESS; + // eslint-disable-next-line no-else-return + } else if (getSystemTestBackend() === BACKEND.SEPOLIA || getSystemTestBackend() === BACKEND.MAINNET) { + return secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'].ACCOUNT + .address; + } + + throw new Error('Unable to get test account address'); +}; + +export const getE2ETestContractAddress = () => + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'] + .DEPLOYED_TEST_CONTRACT_ADDRESS as string; + +export const getAllowedSendTransaction = (): boolean => { + if (process.env.ALLOWED_SEND_TRANSACTION !== undefined) { + // https://github.com/actions/runner/issues/1483 + if (process.env.ALLOWED_SEND_TRANSACTION === 'false') { + return false; + } + + return Boolean(process.env.ALLOWED_SEND_TRANSACTION); + // eslint-disable-next-line no-else-return + } else if (getSystemTestBackend() === BACKEND.SEPOLIA || getSystemTestBackend() === BACKEND.MAINNET) { + return secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'] + .ALLOWED_SEND_TRANSACTION; + } + + return false; +}; + +export const getE2ETestAccountPrivateKey = (): string => { + if (process.env.TEST_ACCOUNT_PRIVATE_KEY !== undefined) { + return process.env.TEST_ACCOUNT_PRIVATE_KEY; + // eslint-disable-next-line no-else-return + } else if (getSystemTestBackend() === BACKEND.SEPOLIA || getSystemTestBackend() === BACKEND.MAINNET) { + return secrets[getSystemTestBackend().toUpperCase() as 'SEPOLIA' | 'MAINNET'].ACCOUNT + .privateKey; + } + + throw new Error('Unable to get test account private key'); +}; diff --git a/packages/web3/test/e2e/estimate_gas.test.ts b/packages/web3/test/e2e/estimate_gas.test.ts new file mode 100644 index 00000000000..cfad9595b02 --- /dev/null +++ b/packages/web3/test/e2e/estimate_gas.test.ts @@ -0,0 +1,108 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { toHex } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER, Transaction } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { mainnetBlockData } from './fixtures/mainnet'; +import { sepoliaBlockData } from './fixtures/sepolia'; + +describe(`${getSystemTestBackend()} tests - estimateGas`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + const simpleEthTransaction: Transaction = { + from: '0x0000000000000000000000000000000000000000', + to: '0x0000000000000000000000000000000000000000', + value: '0x1', + }; + const expectedSimpleEthTransactionGas = 21000; + const contractDeploymentTransaction: Transaction = { + from: '0x0000000000000000000000000000000000000000', + data: '0x60806040523480156200001157600080fd5b5060405162000a6a38038062000a6a8339818101604052810190620000379190620002a4565b80600090805190602001906200004f92919062000057565b505062000359565b828054620000659062000324565b90600052602060002090601f016020900481019282620000895760008555620000d5565b82601f10620000a457805160ff1916838001178555620000d5565b82800160010185558215620000d5579182015b82811115620000d4578251825591602001919060010190620000b7565b5b509050620000e49190620000e8565b5090565b5b8082111562000103576000816000905550600101620000e9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001708262000125565b810181811067ffffffffffffffff8211171562000192576200019162000136565b5b80604052505050565b6000620001a762000107565b9050620001b5828262000165565b919050565b600067ffffffffffffffff821115620001d857620001d762000136565b5b620001e38262000125565b9050602081019050919050565b60005b8381101562000210578082015181840152602081019050620001f3565b8381111562000220576000848401525b50505050565b60006200023d6200023784620001ba565b6200019b565b9050828152602081018484840111156200025c576200025b62000120565b5b62000269848285620001f0565b509392505050565b600082601f8301126200028957620002886200011b565b5b81516200029b84826020860162000226565b91505092915050565b600060208284031215620002bd57620002bc62000111565b5b600082015167ffffffffffffffff811115620002de57620002dd62000116565b5b620002ec8482850162000271565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61070180620003696000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae32171461006c575b600080fd5b6100556004803603810190610050919061043f565b61008a565b60405161006392919061052b565b60405180910390f35b6100746101b0565b604051610081919061055b565b60405180910390f35b600060607f0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b756000846040516100c0929190610672565b60405180910390a182600090805190602001906100de929190610242565b507f7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e600060405161010f91906106a9565b60405180910390a160016000808054610127906105ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610153906105ac565b80156101a05780601f10610175576101008083540402835291602001916101a0565b820191906000526020600020905b81548152906001019060200180831161018357829003601f168201915b5050505050905091509150915091565b6060600080546101bf906105ac565b80601f01602080910402602001604051908101604052809291908181526020018280546101eb906105ac565b80156102385780601f1061020d57610100808354040283529160200191610238565b820191906000526020600020905b81548152906001019060200180831161021b57829003601f168201915b5050505050905090565b82805461024e906105ac565b90600052602060002090601f01602090048101928261027057600085556102b7565b82601f1061028957805160ff19168380011785556102b7565b828001600101855582156102b7579182015b828111156102b657825182559160200191906001019061029b565b5b5090506102c491906102c8565b5090565b5b808211156102e15760008160009055506001016102c9565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61034c82610303565b810181811067ffffffffffffffff8211171561036b5761036a610314565b5b80604052505050565b600061037e6102e5565b905061038a8282610343565b919050565b600067ffffffffffffffff8211156103aa576103a9610314565b5b6103b382610303565b9050602081019050919050565b82818337600083830152505050565b60006103e26103dd8461038f565b610374565b9050828152602081018484840111156103fe576103fd6102fe565b5b6104098482856103c0565b509392505050565b600082601f830112610426576104256102f9565b5b81356104368482602086016103cf565b91505092915050565b600060208284031215610455576104546102ef565b5b600082013567ffffffffffffffff811115610473576104726102f4565b5b61047f84828501610411565b91505092915050565b60008115159050919050565b61049d81610488565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156104dd5780820151818401526020810190506104c2565b838111156104ec576000848401525b50505050565b60006104fd826104a3565b61050781856104ae565b93506105178185602086016104bf565b61052081610303565b840191505092915050565b60006040820190506105406000830185610494565b818103602083015261055281846104f2565b90509392505050565b6000602082019050818103600083015261057581846104f2565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806105c457607f821691505b6020821081036105d7576105d661057d565b5b50919050565b60008190508160005260206000209050919050565b600081546105ff816105ac565b61060981866104ae565b94506001821660008114610624576001811461063657610669565b60ff1983168652602086019350610669565b61063f856105dd565b60005b8381101561066157815481890152600182019150602081019050610642565b808801955050505b50505092915050565b6000604082019050818103600083015261068c81856105f2565b905081810360208301526106a081846104f2565b90509392505050565b600060208201905081810360008301526106c381846105f2565b90509291505056fea2646970667358221220fe0f28c9f8ef0a13a95934b974e7bc2ca6762b40a5b93ccd6ca2038f454bf52764736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000017736f6c79656e7420677265656e2069732070656f706c65000000000000000000', + }; + const expectedContractDeploymentTransactionGas = + getSystemTestBackend() === BACKEND.SEPOLIA ? 475494 : 475494; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + transaction: Transaction; + block: 'latest' | 'pending' | 'finalized' | 'safe' | 'blockHash' | 'blockNumber'; + format: string; + }>({ + transaction: [simpleEthTransaction, contractDeploymentTransaction], + block: ['latest', 'pending', 'safe', 'finalized', 'blockHash', 'blockNumber'], + format: Object.values(FMT_NUMBER), + }), + )('estimateGas', async ({ transaction, block, format }) => { + let _blockData = blockData[block]; + if ( + getSystemTestBackend() === BACKEND.MAINNET && + (block === 'blockHash' || block === 'blockNumber') + ) { + /** + * @NOTE Getting a block too far back in history + * results in a missing trie node error, so + * we get latest block for this test + */ + const latestBlock = await web3.eth.getBlock('finalized'); + _blockData = + block === 'blockHash' ? (latestBlock.hash as string) : toHex(latestBlock.number); + } + + const expectedGasEstimate = + transaction.data !== undefined + ? expectedContractDeploymentTransactionGas + : expectedSimpleEthTransactionGas; + const result = await web3.eth.estimateGas(transaction, _blockData, { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + + switch (format) { + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(expectedGasEstimate); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(toHex(expectedGasEstimate)); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(`${expectedGasEstimate}`); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(BigInt(expectedGasEstimate)); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/fixtures/mainnet.ts b/packages/web3/test/e2e/fixtures/mainnet.ts new file mode 100644 index 00000000000..2d858a6c9a1 --- /dev/null +++ b/packages/web3/test/e2e/fixtures/mainnet.ts @@ -0,0 +1,300 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const mainnetBlock = { + baseFeePerGas: '0x474472184', + difficulty: '0x0', + extraData: '0xd883010b05846765746888676f312e32302e32856c696e7578', + gasLimit: '0x1c9c380', + gasUsed: '0x143f430', + hash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + logsBloom: + '0x4df74c536feb5b9b15f957639771c6a373e719164f8593a74f9bbea57eaafd57bc3713cc5f12770cff1397fa4347c99e0f7d1e2edb5aedd4bf21d5e21ea43963fd767ad75fefcb3dffefe37b5d3a0879e29b14a80deefa730dd29ccd9e7134833aa03fb27b97d98982427405ac0abedd425a3bd70b7d5ff34f5d2cda3e7fd29fcf23d71d0a4c370005d82dfe53be067656d2bce157469cf97ff5ab7ce330166f9ed87d5717a46a3b603affe5b13cedca2b5a46bdeab6abab0dd72c3f14e2fdda4e38bd6e5e0b3e5bc04edb366cef95faf8f96edba7fb645a770e3daeca8de47f54736b5881078d85882d16ada151ea84e6779b30cb7ca4d68f8dbf31f296fc87', + miner: '0x4675c7e5baafbffbca748158becba61ef3b0a263', + mixHash: '0x4ec3b909884d099f633243913328e65d659c646e349c14ced389280fefab41c3', + nonce: '0x0', + number: '0x103dab0', + parentHash: '0x28ad78b5598691f1eb3aee2a17540496b539fb4f72ca5eaa461a331791cfc7cd', + receiptsRoot: '0x78017242efd230482ca0a6ca47a5c3bed5a275b6e3b09223ff8e2354f3136772', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + size: '0x493d0', + stateRoot: '0x637b62addfc277cb5ae4aac3c8b3bfc8e49ebe9369d07d9757c5f1f2ec937306', + timestamp: '0x64363eef', + totalDifficulty: '0xc70d815d562d3cfa955', + transactions: [ + '0xfe87d41469efbea299780c8e218590753e0893ee2d2d65f867d9c9c7b9ed591f', + '0x603caf7d4be62e5946268fa1b594029c40fab23826d388729367c37649ea3967', + '0x4f8da807b7f0f44a4fd67eaa16cc4ef6f1071a0d8ae06349bef904f8f14f0903', + '0x199eb2a37faf1af74c752de5f378859c40a8929c52af1402bf98c9acc309438e', + '0x9775612f318528221f773a926a72c758f5b6d1eb7871b7a4309fe2d870ea1452', + '0xdc7f7a7c4d7017c13c795fc303c5b24814e27f102f908bcb33b8f5b7e943a8e4', + '0x19d1a0d3ec5c0edb9f5e92fb5f8707ae92b56505093e602bea42be92a07e44af', + '0x9c3c1a113ed268ea222e7d9c35ce0abf5bd15f7f7dd4c00b31fd4de1a9cb57dd', + '0x2ad8b77960551ee3fa86b1ede54219db9490e5320bb479a467be1563f49070fa', + '0xee84b1ac8feb236190b84717a4d186b92278939d36346c81a0ee35c316763900', + '0x1789d5fc0756c57f5035cf7e0776c908d20350a2474b6a24f06d0c0f5aec9671', + '0xc6b456b175dd46508260658d2730e30f92a79ffc5be7310098a45dd70e4292fa', + '0x94e1c3b9a52d7a5e1c6c79dff79ef48d6b9e66aebebbc416a70f006c4382fb23', + '0x7aa9ab138d57ba3ca97edde17570ec90bad03e5c0e2e39ef6f2d57b06906e947', + '0x0aa9988e0a851495beb7ea8d0f48e30042167dd98d932cf32535ea60c7c39e2b', + '0x1752d428626dd31ea7546beb62e2c5d6a27ef9f37e14954a8e6d2e4e290b8d92', + '0xdaa6805bdf1f554cfc744fe22a6661642c87141467b7f14edd0f946c9cb0f8ce', + '0x3fd6e1a5c50cf84d53f9b6809db62d919121259b0de6869a8ee3ff9622c75806', + '0x608372f0608f5466eeb44c5b28408a80af6e1feb410bfe57fa5f6c6e267bec3d', + '0x9295f62e92616619793b77a3b7577b2b6617a3cd21dd13f87164689c444d64f5', + '0x11b54c9e279fcbb97484fbf4a27860f9c13768ca21f11e4df82041b0ca33df8f', + '0x2c8a744c0124abfe06295471c805dd0cfbb6a42675cf56d54c1ba851fa8dc3a2', + '0x90cb790f159d0a8fb4de0bf9c53d95ce48748251da20e254591c8a29960ddd23', + '0xc94887918fa6e72ecb1e92297b4e6d8bd157dda8be8e71d21015bef1c5da2758', + '0x7c9a5723528a8c953a6d89d5a3e11d939bb22073763cfaa9b67f23bc643754b5', + '0x75d304122e20c4e61e1be6f10e8a2bfd7172a3d2f44f123ce439e2697adc37c3', + '0x5b0805bcb55a457729c0e23541205aace38077d5d0ec38f8c4981b6ac10ad444', + '0x87a851cef867e8b76c0f00049bccf3eb95f41a4e0ed5f2656d3f029ec321aefd', + '0xc4fb4a90055b52891b9ee9ea13e59bfa08fedd2521212a2538a54ac15948694c', + '0x9a6210559642f06ad096806f546af798f6b9d1a69f246f830a23ba96df23c70e', + '0xc36c5f21974222581b9626833fe32d99e1953be7a84f8de99289799b6c28cfdc', + '0x5555125fe67d3a36555050d41b8ca19ff036d6a338add7c285eef925100b7d49', + '0xc9b0ffd52b2d3179cab61f22302eed123144dca2367455f0b26cbd57a54d6d6f', + '0xb47865548d28112a9b37e3909fe2310918a4a70054b2e10f0a25b81ad2bfd695', + '0xeba0d7487248cc40f7a9784f20c879cc358231ac73cb56900629b11a2de6ef23', + '0x77fab2e3ef8460a5259e7107cf0cbc1a1e31678d112aaf248b2108159b4416a3', + '0x216b046ab639e61930add4323bf64b76d91db121963350632ed82f26bb6de7e6', + '0xd39d9a75f852bcb051393709ddb894ee043b7ea18bc21ce4ebd5a3560142b60c', + '0xb7f3dbb72b2f8fe579b81a3ec11a56008b09d90f2a5267180fd8f966a1b76cce', + '0x2bb7f5e1d071f0dc7040fc1ae745274a456e25610cfcfcd38e9cb3205f227222', + '0x6c53f5e35d76bfaab1d1eaa75b553da7bed8fe046f90961441474c6852b0469f', + '0x346d0ad3d6a351797184f880b08b913dd095d12f36ade9e75eb7cba6980dbf34', + '0x209624ade75ef69c5b0b1c8d85ebb1be2a084380f3eff7fb15fafc6d607da908', + '0xc76320b5a1943478674adc1c81ec441e0798525ff8c5aba49a13e0feccfbb6b3', + '0x79474757728de960eb4e7da5bd14cd3bbaa342a1f15a0e02920020bc17293e98', + '0xcbd72caf3b24a675faac5188b7bc15768c2bdd4e6a2a8c60ce79f1875b36b4e8', + '0x2350e1d8dbaaef1c51429dd50f319f7ae0c60681b17e925abe7f6b79b85bdf6c', + '0x76c881e0add6fbe11dfc4396ff8f373f2bb1cc27db929b95a21cd64b7dc41e11', + '0x3ec134ed1e10df2b1b78311fcd38325b2da8e5da5ecfb60573909450a04693e4', + '0x8587b3eb001a4d9c367b44d3c66d864bd086f7def58681fa568c25c1632197fe', + '0x4e52482e36a15ab65b1ee34d20f93b54cd1873e1b596c874364c59125dd23b62', + '0x5512e2f3ae0e44b1993cbfcea2f91fbc8e6cf2ef6bc73b606f19db051935c30b', + '0x47effec3066af633b7b8e31eb958720b3c26101a660b68294cfd5d1da9df660e', + '0xd6356b5d6aba735dad22a19dc1c6f1e90dc5b9cae6981e3242b551da32a56420', + '0xd2ae45072ed92e1c0f0dc9770700e2aea61c564c3cf9966043fcb4ff503e6bc5', + '0x3a9d565f5193dbfd7bdae074e6405d6cd0d6334a99b23d4780afdf70730ea265', + '0xe3a4f72856bfda9647b3699182bd386445ac649dcc8b1ce16e00ffcfbf4ab7ed', + '0xd8640e034189ad0e1c19c56cc4283d58a6fb953eb4b07490f1908de722939c36', + '0x52afd7942b5e6b188b162fbef65fea001d87904a218a1863cd55e35c38152d32', + '0xb261c0e8b9db2323039cd792af63941d6891e59f9a47fb920a1cfa70188284a3', + '0x545a0dafc33502a9e74440ffe4aaeb896a6c2248c1d5e02b2a211936f97fe375', + '0x5e48f0c28319b84d3ea08d316b91dc23d6ddcff46c4064760d2f83d848ede467', + '0x848514cee29d37999e27991e25c2cd58edc0486fdbcd2bf673a14d0e37bc3d12', + '0x5c1464d4fd1ef55d3fc1c1e9338917273b1d2280fd06fe04afa607557ab9c9d9', + '0x461702cf4d7d04f70337251a6ce8aa386f96a55214eae9e71697ad2e3d686acf', + '0x4d0b6bd0b7dc8b332fc7f80c3c5774c467080976fa2460d85a9c032a3e230d94', + '0x06ad8cefc9d677ea422fedbbc23fe323f830070fbc93ee394abf986453026dc5', + '0xd77ad6002fc4ccec33de15972123777c0e036cf8f2ce5e1a4d858dd99b11cbd3', + '0x3c829847832f898dd18a8674e81eba1e7179912397f48a53e31b6d98ad79026d', + '0xd90e21f60f14d0d6734a06a08ea72718c0da1dde84d927578f8bc3817eec2cfa', + '0x6d6269d0e0c72d8683f741cfb76b0d5e9f2dad7fe0a31cd84a655a5f48e2a3fa', + '0x16405e445187de6e1282740494fc6af3a25cdfdea2de89014ace9a91f68ba6c3', + '0xe622306295b723bf0da62a8946e0c624a3375096669cd379bc437ba3a0e2b6b1', + '0x804e7b2c8b74700c58f930f56e09e49a037b9dc454245ed87e469af5d73d7db6', + '0x9944ff3b953f8a03d29719d2f1921d2f7ad23f28435aabc7a1cc16633c4c3efc', + '0xb6b4ef98d38a6a05809d1bf3f54ad65ce4c5b5ed5ae5bb77efc9448b46809735', + '0x93b1efe0e8e99c39e0196bd596d4558863ffa78edc8c3b7a223a6a12a7b39ad4', + '0xa7665ef46de3416737bb9768e48908a625d89395dfe14e47f863da8fea76db6f', + '0x28d9b81fe5974728f846e2c752a43dae559687dfa4aa5732c184e25e65dde89f', + '0x2ed95ae311604dda2a370282bd6f3449cc1a4f2756f118f1aeb1d60c98c90ebc', + '0x04bff1f526355878a5a79105a6fa4a4947ec23a6267afb8a2e7c7ce40fa2eda7', + '0x78e4f8d6d388ebaf4a1b43f3232b97a5f25655ab2e18b2c8cf509940f0a57a62', + '0x39fc3a2f506b038e3b502727345edcf6c42127bd97c906bf5cd69c1d5e9ceec4', + '0x9c850596d23bfc226f4177a827d27cbfd13373ab3c6c8f083de69da4d4aba82a', + '0x30f4c85342e02c43297d2720b034d8b724f38281d34a7c2dfb84328317da549b', + '0xbc83390bc39958798cb3066bf330a5611945aa5ca5112a55b92d6c689554ad60', + '0xf0a99df33c3ab18658dd8625fd41cf41dc83dc44f19688f3cf17f04514a0d4cb', + '0x080d36e7596e73af440400f2542d2b93c0b3cf3af6cfe400ac3fd469d958b338', + '0xc27d72675970b34668bea3e241a10e3f8e963a9bbae7b69f1cf27dc6aecbcbe5', + '0xf062f350fcb7ceb7eda9cb8265e9a5922249ceddcb1a40b67ba1af43bb5c8597', + '0x76a287becd9daa920e1d26b9ee1843d03ce6df36b5434076738b90c323ba3a82', + '0x51bfb597e154b9df1dfab45885c8219dd3ba99c0fa80631acba6b635471f74a5', + '0x0d7b43abc4b92337b064b74f7e2ff87c337cf0a5690a54dac34f2edf555d0733', + '0x6d9cf19ee0ca152ae9c5634caae877ab6011a70ee330225d9546589d74b3e087', + '0x1fef29d91355611b129ff67f970f6d1da96104df0310bd3b72237367723757d8', + '0xa1ad417520e8fc7d9c8d480e98b929487614daac0c8864879182dfad732054ef', + '0x7fcdfa9acd5255dafc8ddff55a2d8f06c93476eed34b511b7f504fc3eb0a4fa1', + '0x69297bc8fafd076c18fa178358ebf0782730e1efe1c5d0dc057c4a42c7d13bc7', + '0x885dedc7616cefc16490d6dbec79b7ccc7dd1615367d2c4101084d60f2fdbea1', + '0x03a87bf75fb7637fff63350513f286fdf23a5c0c5a561122f1e768c76ec6ea2b', + '0xf76389acc92906f1290f3a854aa7bdff09ee6b7194a6cdbe3867b3b2f7b16fc3', + '0xa7cecd23fab592aa7f3aa37045b16a35c73b2bcfa51d9d5a7a7d15424b78e4af', + '0x0fb59a5f28f25c78c39c72e0232934bd6b8646064ddd4d66e8c8b5695fa8184b', + '0x2343a15826c2683c027de01886924efeef1418ca43eef7f1e386e1e691cc14a4', + '0xe69e2160e90c6ef7f1a72c8bf4bdaf8e04fd679990acbacf1e9d9942eb2e21e3', + '0x0853356e276a49527201727e5e994403d7071fd8c20c4fe3513be09eb26422da', + '0x5c9d87e4015d92c11f2153f8133f8709294a3aedcf446523b48d8ca9f90cf999', + '0x410a2d3073786f43ba1c0dcd5715031940b1eac224ddfbc09a2533b98e1961ce', + '0xd074a2e071d48cd543a4c2f78cbb494a5f5b7e205d2f9f16b749d3e79fc744c1', + '0xfc7ae9cd5806dcc1bd8521581ce0187472dd6d2551e512e7a5d99e31692ce753', + '0x90910adfad4d375b9f1fe068c38cfb61fa27f8f3fffd5449a056410db031af0e', + '0xd4b42ed78389a43e47061ee844c2b68ed631da72ceea389363a9bab05cc8e5e8', + '0x504e3f22373700cb294db5b5b5402f45d8c4a02d7e996e52b51a0502a6b7cc87', + '0x96b93b9a250a2c76261558470c0242115dc1ebda5e1a5206489ee033fb31284a', + '0x0d16cbef0f3df967f3dd0a10606785c4d7ae9bb6cc4ae8018402a5a839a1f497', + '0xf80ba14af91cdf4a398fc6d7ab439f721af496428eb789749cb2da23eaf31052', + '0xb8c7acb46336a721893b6171ce9ae326e8b861913ee8502560798dc03a4b428a', + '0x585f52cc267bc31ed76456e10e26462e8ba898419cc8b9d59f6f76c5869e4b41', + '0x07158ecabeaa23e23a2b4af3bf54be3f29da81f282cd031358c66addaff2e8d5', + '0xbe213bb3cf09088600a8a4d6dcaa6e43e22c730a2b79686b99cb2dd23c89b0ac', + '0x16c47e6331c4356d92def58627a88982ba34e0fdc5d38a0967a79faa2ba59c28', + '0xa7eb4f13bd122d16890db32cc95498c41c899d90db6ded546595635be8afd65f', + '0x0f306416f5f9ba69fcc20348dce199ad14402c5d0956c34d1d68535b7b456a6f', + '0xc8ca24a0da8b3403305b9cadb26dadcf547d8f23487b5ad1f8d63269786ff46e', + '0xef8be164d94c0eb5f2bdee4e23897d7992cf6eed26ea29543070ee2798f7469e', + '0x3fbd6a8181c0fbfb48689db9bc12e4615ca4afc49607a06c8899c5eace3c087c', + '0x446b5bd934e67d7c6549077efee4b02f439fd2e1115914173ed449f223b45aee', + '0xe65b6bec825c8ce3df9456cdd55390cbc09fc5f86c20e19455d67968339ac0e8', + '0x9aa4c2aebcb87337eaafd0768324e964af29fe34948a73c3f65205578874faa6', + '0xef8f8c6d22ee2165d735ed573e867e701dda02189a7ab991b788ccaaa132f8d0', + '0x260725511b21a06d2232db5c7f6f88ea5bbdacccec4b78569a818927a80d839b', + '0xd8b7c50d281e37dc01810fbd1c3cf314d707d175feb50f1c94e5cd07722a8e6c', + '0xa78b1dbfda5a5cc59a760c03e3e38064db95dfcb7f6b8d5d5810ecd31f445335', + '0x5470c161462213629f4d2b7402fdfda71a6fd3721d6bd5d699dcb9bc24c50d21', + '0x0943c536186591acb818e8ace6fcfd4af0df06b8853c30ddf185f78ae54ccbef', + '0x66fd0cb4264aa2e61fa2e4abc224f9682d09092865e1025974a4bde51ad906d8', + '0x13e1fddea8ffcfb5847041614af2e1502a7be4f0507645fa5216ed8b661e6c23', + '0xdf214d4148f2ac955b0c1097b2c633b5dfae2751a965cd9260b12874ae12bfd9', + '0x9e0b6d88702128b00efba753c85fdedf93c4c91e242f8610e539571bca485932', + '0xffc4ee5481e35cf09f5675a05593f8bcd1fbe3c0bfd742ba64655bfbfe5cdc59', + '0x8628c214d87f83b8b6325d648383d3a34a9abc54d7be64606b9e9393c5bb2c87', + '0x57840573da6aee90a1df7c054e694cea1bdbbcc0ce5504a4c47296bf93b75301', + '0x7495e9e0cf9f848a202fc3e051bce519b26967c4933ea9f4a3744d75964124b3', + '0xff7d2273873f7b16e131755ed47ed8de55e540a4bb8d47449d84127ddd3a8bb5', + '0x2dd3225299367625b920766f718ecd62d0d66738ece52fd44c4adb0f8f794c75', + '0xd600a0365ebc112528c0464dd4562de2a74eb692004be7a08b60a821c8dddd19', + '0xdb05f67a2e1f965826ca9aae165d96ec1883129ba84718da14f7c35a6e1e342d', + '0x50734d83880b3f249d60c15226df34c22e222faa5079c3d7ed7665dddc906ece', + '0x6173d906ffd35d3b326a3e750b6d663d2955fdc6deeab20e409af5385cf8e4c8', + '0x00c1a4dc51c377b6bb00af16bb30526543f727c11a6370741191979c471d1ffc', + '0x8c7518bea80f39a803930123b6782845ce8f8d99a782163aadfa924cbb28ee91', + '0x4ceca9cf5bff5da1d3d1837fb77f1f576767b8a9d6d4062de0eee706b7773d6a', + '0x03f236728362e5cfc12a712b822a3ab1d79e0eb0268ea771dac94c17750283f1', + '0x57574acd1a26c9e233f2ba2c5a7c8b81f6dc05ac9b80b1f87a586937322df147', + '0x2f51883b48c322148fc624e8c4c974f4ffe960cc65bdd9bed9085c899eed8926', + '0xa335d36a424727d3d6a533abd8c1d55c1647272140e20590852266f66bb21055', + '0xab5f09775f84c67c0105a2a0708a0d8e0944f6104357944074efc7e0933fbcf3', + '0xfc344b84da81960aa983cbeed2a393d9b1fa7aabb0d844e6f82a5f6c94a3c086', + '0xe64be15aecd91f995ace79f4019a9527a8abe979a3468b35600da437a1478c70', + '0x004a9a2ab277e27f7004aa54b28981e62cdc495d3186fb06e158e8424cf5967c', + '0x684e32bbc27f76e759dc9f785c98be14d26f6e1010ef75cc025c70945f530fce', + '0xddc2aba98e71ea83790e0d5cbab037f6e70bf5a58d9790364cab6f4d852ae897', + '0x2fe22d7a6493b92654f01e5ded1cb917c5c2924a38e663128046a7952a2c93ec', + '0x7fcbb7a587ba7d0165a58b5e6e3020988dd4920b318ba340080b1ad762998f0e', + '0x86b6bcf0ceb9b60090994f3dd76788cef71d348ca69fffdab38754815b73e85c', + '0x8eadb42b3a03ff3e8523f5830f6c95a3264fb9276317ddbc3e8cc97fc189db1d', + '0x022ac2d203c97313448c6439f25af381448c5fb250067c96abad48c52ea63b25', + '0xe71bed152a7e265fcdc08eb8f6f5217141c1660c79e0a2315801b48a17de9443', + '0xbe2db43eb64a29a1305510cee016accf743960735aed99bb4aeb831956531f5b', + '0x80f00d868b70689d383cdab459c9c68f606de18d4d5a4fc25258870e42aa65ae', + '0x2a69d29b4302deff2515e87041b722bb229603429ea4d31fe81c878efed67f81', + '0x6323bd97a58dab264aaeea1aa12ece39b5eef1a1488e65f813609e1c47fdc66f', + '0x9ff09456b9098544e68e8e27cd3f1445d8606fdfcdebfa74d24d1bc87a9c2462', + '0x8d7f6f64c5cbdb533b579647746392c50db5fd0247981c7b430f4fe206bad302', + '0xb94ff102a30dcdcf8c2b1385246a2f205f4a7937b58182b7df04e38dc4fba63a', + '0x61ca13084a53b8edfc2beb3d1f967fdfca93359043a5da9c3678889b012ad0f3', + '0x76a199229278cdd8e6dd40093b64e7664626618e7c36fd623ab630786b6dfac5', + '0x74d69e566e8bd62900e891081905009a1c2ed074165d15c0e0a096b63b1b49a7', + '0x14036d43579058171105216738457b35167820a7effb8d9386c65e20d236eb77', + '0x25c1684f6966caff802e85749b550d9be2934820d5c91c6f62487287675a629e', + '0x9c00826fd016714e191a685e31c918e5f9151d807d1b5b955a3ea514ffcd19de', + '0xe04b3af4d15e1edcae6e981f5f1d9d75af4f7cd06f12c73ee42e51c00ef14364', + '0x0357d246c9ddd57f05170a038ddb04c4c2554371a5cd1e1d7bdda50b6080939f', + '0x002ec16d799ba0c7c3251ba82a68151016066f4c49ea22c6441711184aff4799', + '0x2393a72f9b086878d13a8dae1e44607cb9033fd94d4777ea907dc457db3dbc44', + '0x870c8c1508aecd4147d0f9e6cd1a84227b743ed2589d013e18d481674ca8f42e', + '0x91af138e974e7f4c84f22362bc8f7247ec806baaa7d6cbc68a67e9689955e78b', + '0xf37b9efe2a4130127072a2f6a3ae5c7311e48bf3022a1433b7dba6423bf977d3', + '0x241263ac0c3c04d623485fb5d4e7a2af103a7db5eabfe0b2d2afe0506585e509', + '0x8df5d0fcd95081999a6c417f8be98633d1bc3d0f6fcb6795eeb600ca9e676f8f', + '0x4176e756b40466a7126aef4fa046a728ad62f51266a2a3b4a92b15366ac688b1', + '0xbd6b5651c5c324e8c2ebe6e89c633bf3b33ca9bcd2c5d730608d3fecd11bf031', + '0x0f48823439c41ab6b36752bb865cc156d1f56d9e5284eb0c9d0b0177f298f79f', + '0x12d7dbfb0bee81eb327e32170b201fbc8445ce3d780f446b50cc10b2c6a08ed2', + '0xc6f78588f68038b676f7a0ca3324f2c6b24618bf43b5c6e68704262e3fceba4a', + '0xfaeaf9b4a6c5fcac8005239112a27f9c059e7aeb436f31f192a80c1691c29f29', + ], + transactionsRoot: '0x2b0f787500743395385ad4a4142693bffd51d508cae1fdd675d269842b9bc2b0', + uncles: [], +}; + +export const mainnetBlockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + finalized: 'finalized'; + safe: 'safe'; + blockNumber: number; + blockHash: string; +} = { + earliest: 'earliest', + latest: 'latest', + pending: 'pending', + finalized: 'finalized', + safe: 'safe', + blockNumber: 17029808, + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', +}; + +export const mainnetProof = { + accountProof: [ + '0xf90211a061a42629d4371789fb5c083c33fbb0a212366d19b5b418b482200b4eac0503cda0921eeb15c07b42918862c7669a33a2f64ac87fd76865ac27ffd47fc442296dd6a020fc23de86ad57edf44fc277658e7c51027b013997fbdf257813ae0483a9424aa08650d9f1b91cb0453a89de3c28934c33bbda62490a3b139960f5dc8696edee50a0938ae249d931088e1418698eef515883741002e4eb7630e5ae7c1065ca91d452a06e28819dfc085c8eb967b35b29940a2bf8b1e724cd4ea28b798161664f9091afa012d5225b6862724fe95cc27ed50629263e92d28044f1366964168c91e415cc86a03732489e3d9a4708cd5bd9985dcac215ed8104492f9e6b6e58d3a57718abc323a092e057e0b1f1c83a62b12483cb6816d3e8105d15108f990a78d98ded473b67d6a0ef6ec99e06a731a8a16b6d27ae505fa92c7078dd4e91cee5a6d6e2ce78c8a0bda073110a92b87d5f004fa8222c9bf298cb3a4974c34dd724c147ae72cb6e9f2af5a0af556072c40c1e93cfae2c11f630250049a1738977d8614aabf48ac48d4ceaa1a0e49322e3a8c8273d277bce7c075f28e809fe9fba975ff0a68b4c19a2086f6c10a090dc4797623b5e1c1df464cf68165cb250363c529e70884c033d789a9fb535c6a083d55b28d20db57407779adce1e5f3297ce6333c2db058d4b9e730b69cde535ea0fd6d0de8e61255d5165318f4d2e0747944a97bec1b472e77519bc1246f285e2f80', + '0xf90211a013b0863f23ec7ba9005f61eaf0c0e6466672ee3d13984f66639613773e63ae82a0c698de006df5eb411649fa119d350fe2cdcf6e0bcd50d5caca18173929570ec5a094a13b12f3724a211533f38a1bc56f837897a571b6672cbcbe4e07588ae887e0a089af3d2fcd47e0d524b5bdddcf8c188818c888ce71c968b20b0daf3f69979edfa00edd32eb159f02fe50999f9dc8adebb5dd9c48f1dbc3cff2026428ca05c5f471a00819550c6855bd618c9713d677a97ede25cf36fe09e045c0b1cc93a1b505b08da0eafcb8050d2a14bf7e6fcb07268fd40243183c24865a4e74d56940e2799c0e80a0991ccc5e472da616ed0ab870b4c8702e8e2bafaf6efde1bfaa81cf112dc8ef54a052785d9dbf1232d67ac025bf782bd9f9e619e75783b39fc8ea8f4f7b670813daa0dbc8204ab52d4420c62c1777133eafbea8cf868327ca9646a2872a43ee3613e6a00bf50322cb36599d21aed1aa81849ea3642159ed4b432bedc2ada82111866877a03fdc880ef977282a7396f6d5badee955e7c476a7da12ebec0766c4f0a00b5ed7a06927da4c320d8d36551479cf6c8634f6ae1876065a6d98656c9ad5148750fa35a0652010f361c5ccc80e4b80cbb0a8e17abef8ad7ecb520eca45d74fe5b810ad28a0a1cbb1d8e9fc8a447535f4aa0f3eb568f484be5aa7ab47c89a55280ce0285e3ca079c75ec928e6b992a9b6e943e5f696ac4a0911459e0d92d8166983dcb30261e780', + '0xf90211a0906d3fa01a6131a7f8b1b7b1021a9b03cead0061a0fb78b48e563f94e143b912a0c3bef88301ebbee8ee60d6d776c15f4f285f91077d220f794bd7ed391de1887aa08929f87db85fbc2686425225014b861df6835290f5fc922d26112b17c281d563a0aff6ded52e896cd26ab3298a84f5a2042e9983c50f47e219db834e02b923ebffa081467a1e2b5e7e98f3f2e91c50262fe3d152f9e18fa7019b9882deca0f11c227a0a1eda943a62beca8423f07ae31227cb8480a334982b66eceb8c5fb33b504a92ba09e355f61268c67f4d90bc94f1da49e5cb1a5555af643e5e41d474cc21198e0c4a02fd628b96d10a7b1174dddf2db933151dfbeeb2bea8599508fa5050ee9807029a0e304e1af1fc7f7a8bde11525b3962540e63ab6768629fb589be7b66a364b2c49a0434c3fd226f8b07a712a2908c22d132fa20ca536aebcf7036e135de1c9053959a00d1752d6848a2b0858f42ce0b34270e11d35191627d82953d9a4e04eb5109431a0cd9328b0c001a9bba15a9451a5e04e8f39e92f1498d9e5e140aca53bd853c3bba031faf17595f51f9d67a4ebad0bca3dc04681acb6cafc15be3bc340eb56ecf248a0817b6a339a574f6a12bc528c0800c2aa35c2766d0c1bece3654c0952cf94c7bba0d01ea4603336af9083b15f18d178d7051b74928bc1c2af2409d0649d9d367018a0ea65ae8a236519a85d7b56bac8d61f7e924409f587b47cb90aeb5eba23286f8f80', + '0xf90211a03ea22514219f296232ec043cc9be748640d4179974bfc579013738669fa6c1cba0c786b901e1677b1c828383db755df4759225421afeaea3de3c6ef799a7ba1655a03c4759afd6725715e5e3cab40b07a6ac3cc63b3cbf771a589ad9b50c695a2d1fa08b11fd26f0e921cd3cb55e7b3a4664a3ebeca818a4e69a633eee1cfbf7c22afba0c23177bf3c8a4f0d6bd1165e7402189338c25cc99fa27d7ae7479fbf7f8faa1ea02b90384b9f669b9ea73251ac7f889063bc8ed939ad23f059015a996e561dbdf1a0ad19658ea306c0cf9364e13138111c747e2d20b873f74696ab07bd35ebeb8822a09fac5b614101deee5129bff38028cb022439b7d2bf6add205c9e6f0b336c6da5a08017980585eb89c0ae157808040d231e36cc51ad0aea07ee9281f4481aaa3239a0b1322e1fe5f7632d8f5c5b9f8c23601d3820b591f2ebfd1b24254bdf1badfaeea05527e4c9c1930123bee9262149ad7f966d7249f533bc18b09a398213885e5285a083ea949b3c88fc1b2720993d4ab9465b1e07c39faa2102f991ddd58d4b9d21fba04209281a3ceb6f985957619d6901e61be7dfcaae0aa836d83de4e7e77d3c31bca0ad5021570629b773143685a343a93c9a46428c6bc19707cf61eaee477b3dc5e7a01da1a77a07f6020e670df0f739f053d7e3b3ec1a16279b52a0a594c4ed111856a041741f7de82565d93d05006e3abaa5cbf0026a36dca2fd785371151fb6922a3080', + '0xf90211a0c5922554164fd80e50dd9aa0e947d3cbec6f7ec1e905e7993a02a0ad6b63b428a03e8934fb021a44636cfdee14738bdefd52bf2cb877221d62a902dda4c9e20af2a0e60f11787f7d63ae9fbd87c90ebd33bb24c933d307fbc657d844a143288d871ea04a4737d77380e7517f2e54fafbb14ce71e4161dec871076f6dc2fafa4a372af8a05c011c4181c90849e4293bd2ca6d4c66d5eb30de23bc23202c1b9faf5a3dc80ea01e5b26350fb090cf79adabe4a49f07983beb2520ff0b3fda578a6a6a8513668da061096fee35ea62dfe1272dc2ed693f2a4609d1444eca46dd002df24bc6da01bea0c2366e8b160756be7b4ecf8f4e16e36f7e8f6b9c4ede78442d2e5b9bfd229b08a0e1a4e9ab4aa65c7aa7de1a9f0131bc6df85a4ee26543afd973ca0770b6a48b77a0074c7f93753cd5b3a2708253a78b8f7d208c8e6bc17b0517b3ed54385efbe44da07e9b01e890594903f9ca5c976630f71cc33c2d89d6f4cb590a8a45835f802894a0471cf580a1a9512b3611d237930598450b878532b14627ff1744bfcf022928b8a01f69dd332c5f488cdbdeec5e3d9d9f3f89f8ed8e4b2494c958ed494b4569f2a9a025523d65f51a0c24e4e2c5c7cba8bf07d93419929dd3e462b33078ed5c1a1b5aa098d2b8f2f925cbafea85d99674e3c46a9c3d891693ba02a2ed910bc8e94778e0a03a92aa841b80df9db77b6119a94b765311901a0e7f7c1f569da587ab41c0fe6c80', + '0xf90211a0d4cab5a47d8043340092eba307d3b479837e51edf2975224c46b78fa5d9f2bdea0ba8ac3bfa7a33f5d711782f010d55b300c0291356ac7a5df0c7926bc6debb839a0adfea25bac8862fb080a091f6e19a00bd137427f7a0886c8f50aeb4a3872c5a0a08179a51d62c8ee0f3ad5eb3535c56dd975a9e52260c202c36e159129779448a4a0c0f682c90f18feaa067339a7a42b583f305a79503b16d61a56f10551132773c0a028df3d931fa6fad2f30a3c471ac1a79f038980e262287030b0699bffba133ea4a0e2b138a12ce1b81f04de0f18c5cda2c1e6aedc3aa492a851f4d74d02fb8eb938a0e377cd14019780bea727694e4aaf3f354fc0dfc6635cb501b562447c90366311a0651f49adb9572e81a082469d2823d728b9d40755534c997057f0085d464cd5aca0b7d9e9ca48f3c7beae701128ecd079dc62071464d505015ac54ccda9bad97216a003a0946cf1ced04b70824b889e5d78198d87948e4b039bec65a2414924df8144a0e434d71446bc0e7e57212c6e9c51404aeaef72793a78573d11b5b52ea93364eea003b39a423c7ce0663d5fa748919a7039b7f4fcbcd00db13582de55435f5d0d0da0ebfd28715bfd53b7d382584d359028ffda90da7708131a666701a4703f258ca8a03768dc2f979daec77db519b61c2629389fe2f9f71940d04fc6d5af2f6ce5f2c7a0b4d261157f8b020cf954cdb60cd3fa1744bcb61f8da0cd49e7f91165fd83a07380', + '0xf9011180a03464dee21bd9b7f1712c25a7bf48517d93f6cd02bc5e069e85ca98eef103792b80a0ac233ce7e7018541d154a3abf88a2d3d564777b116c94fec994ce36d0ae1582ba0fd874c87366c0aaaf7fccf6065684b0745c3dcb1632d64ebb023cfe15512924e808080a02073bcfe0a91dc4b71e13226cefc82d938a69b86d682b838f1db53f367510f8f80a040c3c8f7a9522d6df5c0028d90d360f73c5169b4cf434d95350beed43e167390a0ce16551be1e0a52b73b88c006ac4f69cd4ddfa15d94f885ca37f46f2eeb84037a0a856e72e69c2131a5d4e0ac7b583725e9a400db1263a6f0b13fd298c5df84327a0598f8e0f6c6ea52b62e04c655de5e5494597c2902078b98091861dd0bf237873808080', + '0xf85180808080a06cb96634150a4bf19ad1cd1d29ead274d327b6c478fe4624570e3b7f848fea318080a014b2529162240ccb5e3b71491dcb7e3c043f6a82627f349d4cdcbcea92e6a8e7808080808080808080', + '0xf8709d20ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312ab850f84e808a0272380c74083753ca3ba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + ], + balance: BigInt('11551700520686660602427'), + codeHash: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + nonce: BigInt(0), + storageHash: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + storageProof: [], +}; + +export const mainnetCode = + '0x606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461019b5780630753c30c14610229578063095ea7b3146102625780630e136b19146102a45780630ecb93c0146102d157806318160ddd1461030a57806323b872dd1461033357806326976e3f1461039457806327e235e3146103e9578063313ce56714610436578063353907141461045f5780633eaaf86b146104885780633f4ba83a146104b157806359bf1abe146104c65780635c658165146105175780635c975abb1461058357806370a08231146105b05780638456cb59146105fd578063893d20e8146106125780638da5cb5b1461066757806395d89b41146106bc578063a9059cbb1461074a578063c0324c771461078c578063cc872b66146107b8578063db006a75146107db578063dd62ed3e146107fe578063dd644f721461086a578063e47d606014610893578063e4997dc5146108e4578063e5b5019a1461091d578063f2fde38b14610946578063f3bdc2281461097f575b600080fd5b34156101a657600080fd5b6101ae6109b8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101ee5780820151818401526020810190506101d3565b50505050905090810190601f16801561021b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561023457600080fd5b610260600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a56565b005b341561026d57600080fd5b6102a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b73565b005b34156102af57600080fd5b6102b7610cc1565b604051808215151515815260200191505060405180910390f35b34156102dc57600080fd5b610308600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cd4565b005b341561031557600080fd5b61031d610ded565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610392600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ebd565b005b341561039f57600080fd5b6103a761109d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f457600080fd5b610420600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506110c3565b6040518082815260200191505060405180910390f35b341561044157600080fd5b6104496110db565b6040518082815260200191505060405180910390f35b341561046a57600080fd5b6104726110e1565b6040518082815260200191505060405180910390f35b341561049357600080fd5b61049b6110e7565b6040518082815260200191505060405180910390f35b34156104bc57600080fd5b6104c46110ed565b005b34156104d157600080fd5b6104fd600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506111ab565b604051808215151515815260200191505060405180910390f35b341561052257600080fd5b61056d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611201565b6040518082815260200191505060405180910390f35b341561058e57600080fd5b610596611226565b604051808215151515815260200191505060405180910390f35b34156105bb57600080fd5b6105e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611239565b6040518082815260200191505060405180910390f35b341561060857600080fd5b610610611348565b005b341561061d57600080fd5b610625611408565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561067257600080fd5b61067a611431565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106c757600080fd5b6106cf611456565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561070f5780820151818401526020810190506106f4565b50505050905090810190601f16801561073c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561075557600080fd5b61078a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506114f4565b005b341561079757600080fd5b6107b6600480803590602001909190803590602001909190505061169e565b005b34156107c357600080fd5b6107d96004808035906020019091905050611783565b005b34156107e657600080fd5b6107fc600480803590602001909190505061197a565b005b341561080957600080fd5b610854600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b0d565b6040518082815260200191505060405180910390f35b341561087557600080fd5b61087d611c52565b6040518082815260200191505060405180910390f35b341561089e57600080fd5b6108ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c58565b604051808215151515815260200191505060405180910390f35b34156108ef57600080fd5b61091b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c78565b005b341561092857600080fd5b610930611d91565b6040518082815260200191505060405180910390f35b341561095157600080fd5b61097d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db5565b005b341561098a57600080fd5b6109b6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e8a565b005b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b505050505081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ab157600080fd5b6001600a60146101000a81548160ff02191690831515021790555080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcc358699805e9a8b7f77b522628c7cb9abd07d9efb86b6fb616af1609036a99e81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b604060048101600036905010151515610b8b57600080fd5b600a60149054906101000a900460ff1615610cb157600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aee92d333385856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610c9857600080fd5b6102c65a03f11515610ca957600080fd5b505050610cbc565b610cbb838361200e565b5b505050565b600a60149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d2f57600080fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f42e160154868087d6bfdc0ca23d96a1c1cfa32f1b72ba9ba27b69b98a0d819dc81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000600a60149054906101000a900460ff1615610eb457600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e9257600080fd5b6102c65a03f11515610ea357600080fd5b505050604051805190509050610eba565b60015490505b90565b600060149054906101000a900460ff16151515610ed957600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610f3257600080fd5b600a60149054906101000a900460ff161561108c57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638b477adb338585856040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050600060405180830381600087803b151561107357600080fd5b6102c65a03f1151561108457600080fd5b505050611098565b6110978383836121ab565b5b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915090505481565b60095481565b60045481565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561114857600080fd5b600060149054906101000a900460ff16151561116357600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600060149054906101000a900460ff1681565b6000600a60149054906101000a900460ff161561133757600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561131557600080fd5b6102c65a03f1151561132657600080fd5b505050604051805190509050611343565b61134082612652565b90505b919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a357600080fd5b600060149054906101000a900460ff161515156113bf57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b505050505081565b600060149054906101000a900460ff1615151561151057600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561156957600080fd5b600a60149054906101000a900460ff161561168f57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e18980a3384846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b151561167657600080fd5b6102c65a03f1151561168757600080fd5b50505061169a565b611699828261269b565b5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116f957600080fd5b60148210151561170857600080fd5b60328110151561171757600080fd5b81600381905550611736600954600a0a82612a0390919063ffffffff16565b6004819055507fb044a1e409eac5c48e5af22d4af52670dd1a99059537a78b31b48c6500a6354e600354600454604051808381526020018281526020019250505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117de57600080fd5b60015481600154011115156117f257600080fd5b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115156118c257600080fd5b80600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550806001600082825401925050819055507fcb8241adb0c3fdb35b70c24ce35c5eb0c17af7431c99f827d44a445ca624176a816040518082815260200191505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d557600080fd5b80600154101515156119e657600080fd5b80600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611a5557600080fd5b8060016000828254039250508190555080600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a44816040518082815260200191505060405180910390a150565b6000600a60149054906101000a900460ff1615611c3f57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611c1d57600080fd5b6102c65a03f11515611c2e57600080fd5b505050604051805190509050611c4c565b611c498383612a3e565b90505b92915050565b60035481565b60066020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cd357600080fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd7e9ec6e6ecd65492dce6bf513cd6867560d49544421d0783ddf06e76c24470c81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e1057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515611e8757806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ee757600080fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611f3f57600080fd5b611f4882611239565b90506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806001600082825403925050819055507f61e6e66b0d6339b2980aecc6ccc0039736791f0ccde9ed512e789a7fbdd698c68282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b60406004810160003690501015151561202657600080fd5b600082141580156120b457506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1515156120c057600080fd5b81600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a3505050565b60008060006060600481016000369050101515156121c857600080fd5b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061227061271061226260035488612a0390919063ffffffff16565b612ac590919063ffffffff16565b92506004548311156122825760045492505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84101561233e576122bd8585612ae090919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6123518386612ae090919063ffffffff16565b91506123a585600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ae090919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061243a82600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008311156125e4576124f983600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000806040600481016000369050101515156126b657600080fd5b6126df6127106126d160035487612a0390919063ffffffff16565b612ac590919063ffffffff16565b92506004548311156126f15760045492505b6127048385612ae090919063ffffffff16565b915061275884600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ae090919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127ed82600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000831115612997576128ac83600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af990919063ffffffff16565b600260008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050565b6000806000841415612a185760009150612a37565b8284029050828482811515612a2957fe5b04141515612a3357fe5b8091505b5092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000808284811515612ad357fe5b0490508091505092915050565b6000828211151515612aee57fe5b818303905092915050565b6000808284019050838110151515612b0d57fe5b80915050929150505600a165627a7a72305820645ee12d73db47fd78ba77fa1f824c3c8f9184061b3b10386beb4dc9236abb280029'; + +export const mainnetTransactionFromBlock = { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: BigInt(17029808), + chainId: BigInt(1), + from: '0x38abab9766e0b27d2912718a884292b8e7eb2803', + gas: BigInt(500000), + gasPrice: BigInt(44546465904), + hash: '0x603caf7d4be62e5946268fa1b594029c40fab23826d388729367c37649ea3967', + data: '0x3df021240000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043c33c1937564800000000000000000000000000000000000000000000000000427a6327d90554fc361', + input: '0x3df021240000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043c33c1937564800000000000000000000000000000000000000000000000000427a6327d90554fc361', + maxFeePerGas: BigInt(108571383800), + maxPriorityFeePerGas: BigInt(25415778028), + nonce: BigInt(6346), + r: '0x601ab6acc74820bf5d8d8675ed0828447937869c985ec46bf8010de898aabbcb', + s: '0x17da59e605337ada87592aac2952cbf731575a8eb0fe4bdefd4fa8ce35260bde', + to: '0x3f1b0278a9ee595635b61817630cc19de792f506', + transactionIndex: BigInt(1), + type: BigInt(2), + v: BigInt(0), + value: BigInt(0), +}; diff --git a/packages/web3/test/e2e/fixtures/mainnet_block_hydrated.ts b/packages/web3/test/e2e/fixtures/mainnet_block_hydrated.ts new file mode 100644 index 00000000000..a736f79412c --- /dev/null +++ b/packages/web3/test/e2e/fixtures/mainnet_block_hydrated.ts @@ -0,0 +1,4113 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const mainnetBlockHydrated = { + baseFeePerGas: '0x474472184', + difficulty: '0x0', + extraData: '0xd883010b05846765746888676f312e32302e32856c696e7578', + gasLimit: '0x1c9c380', + gasUsed: '0x143f430', + hash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + logsBloom: + '0x4df74c536feb5b9b15f957639771c6a373e719164f8593a74f9bbea57eaafd57bc3713cc5f12770cff1397fa4347c99e0f7d1e2edb5aedd4bf21d5e21ea43963fd767ad75fefcb3dffefe37b5d3a0879e29b14a80deefa730dd29ccd9e7134833aa03fb27b97d98982427405ac0abedd425a3bd70b7d5ff34f5d2cda3e7fd29fcf23d71d0a4c370005d82dfe53be067656d2bce157469cf97ff5ab7ce330166f9ed87d5717a46a3b603affe5b13cedca2b5a46bdeab6abab0dd72c3f14e2fdda4e38bd6e5e0b3e5bc04edb366cef95faf8f96edba7fb645a770e3daeca8de47f54736b5881078d85882d16ada151ea84e6779b30cb7ca4d68f8dbf31f296fc87', + miner: '0x4675c7e5baafbffbca748158becba61ef3b0a263', + mixHash: '0x4ec3b909884d099f633243913328e65d659c646e349c14ced389280fefab41c3', + nonce: '0x0', + number: '0x103dab0', + parentHash: '0x28ad78b5598691f1eb3aee2a17540496b539fb4f72ca5eaa461a331791cfc7cd', + receiptsRoot: '0x78017242efd230482ca0a6ca47a5c3bed5a275b6e3b09223ff8e2354f3136772', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + size: '0x493d0', + stateRoot: '0x637b62addfc277cb5ae4aac3c8b3bfc8e49ebe9369d07d9757c5f1f2ec937306', + timestamp: '0x64363eef', + totalDifficulty: '0xc70d815d562d3cfa955', + transactions: [ + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x0df433e890793b488c13d18f5d113cf194ddf7ec', + gas: '0xfde8', + gasPrice: '0xd8111c400', + hash: '0xfe87d41469efbea299780c8e218590753e0893ee2d2d65f867d9c9c7b9ed591f', + input: '0xa9059cbb000000000000000000000000913cec99a2afb5ec7008831998bf4eebf1ddb830000000000000000000000000000000000000000000000a39bd57ecedc547b000', + nonce: '0xf8', + r: '0xf511d0f14c7ad3fbd118136e006dd7327ffd0614cb415e41bf2dddea1c733251', + s: '0x1174d5a1e42be8c4ca43acbad607a33d4fa39dca036dd7c7a981f3fceb465c77', + to: '0xd04e772bc0d591fbd288f2e2a86afa3d3cb647f8', + transactionIndex: '0x0', + type: '0x0', + v: '0x25', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x38abab9766e0b27d2912718a884292b8e7eb2803', + gas: '0x7a120', + gasPrice: '0xa5f2d2070', + hash: '0x603caf7d4be62e5946268fa1b594029c40fab23826d388729367c37649ea3967', + input: '0x3df021240000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043c33c1937564800000000000000000000000000000000000000000000000000427a6327d90554fc361', + maxFeePerGas: '0x19475bd7f8', + maxPriorityFeePerGas: '0x5eae5feec', + nonce: '0x18ca', + r: '0x601ab6acc74820bf5d8d8675ed0828447937869c985ec46bf8010de898aabbcb', + s: '0x17da59e605337ada87592aac2952cbf731575a8eb0fe4bdefd4fa8ce35260bde', + to: '0x3f1b0278a9ee595635b61817630cc19de792f506', + transactionIndex: '0x1', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xa0bc68a45bca874f2a7195fd0e946041ccd2ba92', + gas: '0xd6d8', + gasPrice: '0x8aeec0f9c', + hash: '0x4f8da807b7f0f44a4fd67eaa16cc4ef6f1071a0d8ae06349bef904f8f14f0903', + input: '0xa9059cbb0000000000000000000000000fd5b4633eda5b1daaa6a2cd6b852167318aad990000000000000000000000000000000000000000000000000000012687e02a00', + maxFeePerGas: '0x8aeec0f9c', + maxPriorityFeePerGas: '0x8aeec0f9c', + nonce: '0x2a', + r: '0x66d297d50616d83c4f46b2ecb07bfe58785ddc1f412565c1fa19175841f314e3', + s: '0x42d0bbf71e2de38a839d0016c5e2fd9a387621c8fd511d83f554aef09c94a3af', + to: '0x15d4c048f83bd7e37d49ea4c83a07267ec4203da', + transactionIndex: '0x2', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xae45a8240147e6179ec7c9f92c5a18f9a97b3fca', + gas: '0x5208', + gasPrice: '0x70cfb96cf', + hash: '0x199eb2a37faf1af74c752de5f378859c40a8929c52af1402bf98c9acc309438e', + input: '0x', + nonce: '0x1e5511', + r: '0x209ef9dbdeaf6807ab08d3191c00af17727ea4ae22ed8fc127a55cfb287b0672', + s: '0x51551c439baf3cab9a8b93cd1502e3a40a9b4cdef927fbd274d40d0dfcdc9329', + to: '0x7a408b5230d123574eb8c057904e4f364b980770', + transactionIndex: '0x3', + type: '0x0', + v: '0x25', + value: '0x5a119fe21ed87', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xae45a8240147e6179ec7c9f92c5a18f9a97b3fca', + gas: '0x5208', + gasPrice: '0x70cfb96cf', + hash: '0x9775612f318528221f773a926a72c758f5b6d1eb7871b7a4309fe2d870ea1452', + input: '0x', + nonce: '0x1e5512', + r: '0x4f68a9a02c74f6ac4059d3dda87db886050847822b1a3fde4fcde65c175a8f38', + s: '0x3ce0ec0d5a776d84f835a6eed0f2cdf59356ffe6d014af9b283ac84e2c5ad362', + to: '0x40fc4596608b20c97244922060dcfd2de7fdf9ea', + transactionIndex: '0x4', + type: '0x0', + v: '0x26', + value: '0x8f90791f1038e', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xae45a8240147e6179ec7c9f92c5a18f9a97b3fca', + gas: '0x5208', + gasPrice: '0x70cfb96cf', + hash: '0xdc7f7a7c4d7017c13c795fc303c5b24814e27f102f908bcb33b8f5b7e943a8e4', + input: '0x', + nonce: '0x1e5513', + r: '0x644543ff07aa6aa3197b93f8a6f333860c1f6a51889113c9b984c4cfe53ddd84', + s: '0x6cb061b61f1bb84e5435927a904884b0196b43c93a872822e1abd35caf38ec1a', + to: '0x0d2895a34520624ad6171476d62837b5e285d8f1', + transactionIndex: '0x5', + type: '0x0', + v: '0x25', + value: '0x9451e0bec42d1', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x37b94141bca7000241b87b4b361f155197181002', + gas: '0x1fbd0', + gasPrice: '0x6fc23ac00', + hash: '0x19d1a0d3ec5c0edb9f5e92fb5f8707ae92b56505093e602bea42be92a07e44af', + input: '0x23b872dd000000000000000000000000381e840f4ebe33d0153e9a312105554594a98c420000000000000000000000002d68d9aa1ff311406593887999d14db57aaf14ba000000000000000000000000000000000000000000000000000000bdc1c91600', + nonce: '0x2e3e5', + r: '0x4b06ba58fc3f9dc92be0055c55cddad9205e16c7d29bb6dede6787559e858b2e', + s: '0x2b4b4f8ad723577860d89b6311573260e450a74461b1324b727097cb1ea3f0f6', + to: '0x15d4c048f83bd7e37d49ea4c83a07267ec4203da', + transactionIndex: '0x6', + type: '0x0', + v: '0x26', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc6e282c9f4981b2036da4ca3f4fef3d68e66f75a', + gas: '0x249f0', + gasPrice: '0x6fc23ac00', + hash: '0x9c3c1a113ed268ea222e7d9c35ce0abf5bd15f7f7dd4c00b31fd4de1a9cb57dd', + input: '0xa9059cbb00000000000000000000000067de33ebc8252df671330939ee02d70d27df265a00000000000000000000000000000000000000000000000347e512f272760000', + nonce: '0x2cb4', + r: '0xfeced6d2b4be2108e88d961423c3ddbade22425464538f63c047829bf1d8c2a5', + s: '0x7ee24854c7c79582649d25c66bc1b462c57ecb73925d94881b081577ffa04920', + to: '0x795dbf627484f8248d3d6c09c309825c1563e873', + transactionIndex: '0x7', + type: '0x0', + v: '0x25', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xb01cb49fe0d6d6e47edf3a072d15dfe73155331c', + gas: '0x15f90', + gasPrice: '0x5d9e7dd84', + hash: '0x2ad8b77960551ee3fa86b1ede54219db9490e5320bb479a467be1563f49070fa', + input: '0x', + maxFeePerGas: '0x45d964b800', + maxPriorityFeePerGas: '0x165a0bc00', + nonce: '0xa669f', + r: '0xa89f7f812e3b621a89a218f2c22da423d87dc0c2eac90505799a1b63fcea6337', + s: '0x449f43dfc141d298f61728c3f160c536ef741d4295453fc19fb22588faca1965', + to: '0x5ebe4a90a99d8d02204552079572ff962ce554ba', + transactionIndex: '0x8', + type: '0x2', + v: '0x0', + value: '0x6a94d74f430000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x62ebc97e159e60915948a4f226f18d7460f9a80b', + gas: '0xaafbc', + gasPrice: '0x5d21dba00', + hash: '0xee84b1ac8feb236190b84717a4d186b92278939d36346c81a0ee35c316763900', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645df00000000000000000000000000000000000000000000000000000000000000030b090c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000214e88de46721510000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000004351bb9127d783b9a00000000000000000000000000000000000000000000000000000214e88de467215100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000bfbcd9b16d0a55e8b0070551271180e0b7b8388e000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x5d21dba00', + maxPriorityFeePerGas: '0x1836e2100', + nonce: '0x389', + r: '0x201f89c979366c6789dc138b8d36047fc0ebd78956ddd1fcff547d982ce74af8', + s: '0x4b469d49d4dcdb1f8f91c8f75713a77851c020d7d19e6e9a9859896a277ffb23', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x9', + type: '0x2', + v: '0x0', + value: '0x214e88de4672151', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x5436aa53d2b25190d2e54c4dd9117a14eb1d3d6f', + gas: '0x5208', + gasPrice: '0x5c8ad1ad2', + hash: '0x1789d5fc0756c57f5035cf7e0776c908d20350a2474b6a24f06d0c0f5aec9671', + input: '0x', + nonce: '0x1', + r: '0xc2886750f2308b50265de5c28daf2d7d05087103d8879a63064e454031fa7f9a', + s: '0x3026bc52e581f4ba9233eaca623d7ab55463466fa5cfcab568e6e86b153c0b72', + to: '0xa28c1a1330d7634c9bc5a04cb2a3b64cb866f19e', + transactionIndex: '0xa', + type: '0x0', + v: '0x25', + value: '0xfd9728a9242400', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x3e9df16ac4dd2738c9ffa5eb2981cefd04d8cea3', + gas: '0x5208', + gasPrice: '0x5b6b2af00', + hash: '0xc6b456b175dd46508260658d2730e30f92a79ffc5be7310098a45dd70e4292fa', + input: '0x', + nonce: '0x0', + r: '0x965cd3cc650e1592528d8acdf957f1c588c327513a1ae1380c996d3e129099c7', + s: '0x263967109771cb590a72b9383d8822183b452114e8fee7800184857b15b979b0', + to: '0x6dfc34609a05bc22319fa4cce1d1e2929548c0d7', + transactionIndex: '0xb', + type: '0x0', + v: '0x25', + value: '0x5d2c45892ec400', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x112200eaa6d57120c86b8b51a8b6049d56b82211', + gas: '0x7a1200', + gasPrice: '0x59e4d1384', + hash: '0x94e1c3b9a52d7a5e1c6c79dff79ef48d6b9e66aebebbc416a70f006c4382fb23', + input: '0x0c4dd810000000000000000000000000000000000000000000000000000000000000383b0c799eec0c8269e6f66433183bf6c37f7e2234fad4e8619a9372c537e1919cc9000000000000000000000000000000000000000000000000000000000082663d00000000000000000000000000000000000000000000000000000000000000109d7468151d8ce8d8cebd40a39adfd37c97df96ccd5be350407ebe07aafe0ed07be59bbd66be38ea02192e92e3620ac73fe74a4ba782333f6912a6cfc2720480e0000000000000000000000000000000000000000000000000000000064363da0536f4cde074ebf59770fcd0c104be5abf522c7b45d6304fb78b204926cf10301000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000383c0000000000000000000000000000000000000000000000000000000064363dfb000000000000000000000000000000000000000000000000000000000082689a86740d370d5ddebe0d02c0213b810e4c7743c3f93d5374c8cdf053a9d428e991000000000000000000000000000000000000000000000000000000000000001b819ce85261f50be1de19276f26e5ca11a848228ee6210c25cb59dc36f351dc360ff93be68c9ff97a26ef6bec24bd43f19b98490ef6e53e3d25a9b095e0cac0e80000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000990000000000000000000000000000000000000000000000000000000000000157e000000000000000000000000000000000000000000000000000000000000162c0000000000000000000000000000000000000000000000000000000000001648000000000000000000000000000000000000000000000000000000000000097440000025d60c4d13fd5e61e8002cedae0b934a332f744aabb60ab2c4045c0bbdb0579e8ee00000000000000000000000000000000000000000000000000000000000000018abc516ed905f4cd2f75e529e5e37e29e9289343fde880ae66b24b0f565853ae0000000000000000000000000000000000000000000000000000000000000001be76ea648005e24e93088e8d659cbbeb2b35d2faab5c9ca93a19244a6be3d12c0000000000000000000000000000000000000000000000000000000000000006ca2b2246ce791549583c2223e325fc09370d1bc3ab8a7fb90fe95d7f84c18b9b0000000000000000000000000000000000000000000000000000000000000001032fcb196b9985790ce5d010f9ad1d3ed1098603297a45bebb94a4243d5bf81c0000000000000000000000000000000000000000000000000000000000000004b4e0299791aa0f9f1b27a66dfbb346e10181ff7bc2f1e0dd3ce1533b205ce30c000000000000000000000000000000000000000000000000000000000000000111a306f44c250416ee4e6f836b7e8f4f39d68850b32043fdffedfd02b6cfa9540000000000000000000000000000000000000000000000000000000000000001802346705a406cfd46fb98940d21d0a55708d1d2a2bacfc1e51563885e440fe40000000000000000000000000000000000000000000000000000000000000001d747b73d89ce8e9562906c6ceaaef75e663cf4bb9417e2020dcc7e61fb70649b0000000000000000000000000000000000000000000000000000000000000001dd249cc6e1d54c058fa10b0a8eb3efa2abe97e7337383a9c063ad713d9ba13f00000000000000000000000000000000000000000000000000000000000000003501c8b17b08592ef77746faf27ce73e4bda08f1cd34258cc84a898975ecfe2f800000000000000000000000000000000000000000000000000000000000000019b32991c1904bd3fec1e827fa2cbd2cf95fb60a1933575375ac662d94f531f340000000000000000000000000000000000000000000000000000000000000001fd354efb5ae3a973112f4661c3a0738be9828c7c3b38cca9c4347542417d7956000000000000000000000000000000000000000000000000000000000000000221ebcda1219518a7ef173346adb7085d22d5ceac869e3c2dbebdfa98f33c49380000000000000000000000000000000000000000000000000000000000000001efb54ced7b1332e89eb3f543d10d5cc7ea920b27a5bbde793f94bafedb2df9a0000000000000000000000000000000000000000000000000000000000000000152c0c38ce38aaa444503c1176163a7ddbb34adee20f1718a5a2fc72df56113990000000000000000000000000000000000000000000000000000000000000001000bbd8d1d92156fbe8958c81e7c544053675cc73392204f998dd02f66b31d190000000000000000000000000000000000000000000000000000000000000001060d5ef2d198303e44fd97bc33f038852fc53780d9a8221a556b1c671d358b6a0000000000000000000000000000000000000000000000000000000000000003e567182bc48dcef99fccb7044d5c2451e32fe8461b2f26c00b5674600078415a0000000000000000000000000000000000000000000000000000000000000001d02b2774b947ffd572c255da723d08b2660838e8173d7c7938f1431660bd40cd000000000000000000000000000000000000000000000000000000000000000186735298a63049fd790ee7ea2b312fcbf59889e147153b445061c59cb58449120000000000000000000000000000000000000000000000000021706fde04f800a73475f474aad72020b5b750b134f58cdd13ac9b0f7fc04aa155776a7ffeba3e000000000000000000000000000000000000000000000000008ebf301b8c84765c79d51c54d3539ff139330c3148948e11bc6d228b1b08d6c0be0dc4ed935d5e000000000000000000000000000000000000000000000000044e090e4db9661ad939b110fec3b904a308b2ff6ee56654fc8209f989724e63bcfe853fb2d56ebd00000000000000000000000000000000000000000000000000217112d94550001fefaa527022cff5885aab179784ea4aac29fe488d8f67bff3460e946c213567000000000000000000000000000000000000000000000000004981720467200002acd1eeb97c30be87feeda1372ee36d83b85c3ce931afd2e27b5057f16393120000000000000000000000000000000000000000000000000040543876f2b00996a26f6ed760f665efa6f5d10ba47673e2c525c376f226865884b6b727c1103a00000000000000000000000000000000000000000000000000b9798958eb98c635f474747e31bf6372044cd1a296a239774d49934f0b0a8bf2f8747180ab66c800000000000000000000000000000000000000000000000000b199a3e0526000d29bf2e0f2fb05525980d8d48972280bdee43e8f7211db5a6331539d704e0bc200000000000000000000000000000000000000000000000003aa35ab6a48e87afa349a81830c2f303df48abbb66a29c3c20320c464fc6b4ffb3cec7d91be44ef00000000000000000000000000000000000000000000000000bd3dbbe7c2cc90029b691b3026b8f65f1fcc7ac7d08039e9ed360ec4e6184f278ed85f8776564f0000000000000000000000000000000000000000000000000041d063ac76d00a3a75345e199693e329dc9df746ffa04cdbb5c2a4972ee2589074425573fee5c4000000000000000000000000000000000000000000000000009cacb762984000c09cd23372820611a27a87e215f18b5567f919b703d3a14c8c3bc09c5b9496f700000000000000000000000000000000000000000000000000d5cd14fb0e8476f2da5be34629960152c21b34dc2beb35f2f3f442a45d237c5371c4246d67b53b0000000000000000000000000000000000000000000000000047b5724d257f6c51c7064ba3282a34a19e8e0620eefcc6163b2d098fc1ce2ffcbf8d59c89de98800000000000000000000000000000000000000000000000009e1fa9df2addc61b17e807aa6a031d771c0be552a8855ae48e828a01873d31d122f80e38fb3870b000000000000000000000000000000000000000000000000003604a9a590669678dbd0ec8c7fb535f3a3005b303d04132b4103932f6b2ea8e42fb0c946ae3cff00000000000000000000000000000000000000000000000000242b05af6dc3ee73fe8cc3b3981107f063f10e0f429a6e0440148921a434550692b6e740704b89000000000000000000000000000000000000000000000000004ad2e2810e40b2e9c567c483bf77a57deaf9f0b8596671e446b11f8e101231d0314d51ff5a6695000000000000000000000000000000000000000000000000003983c4b860e177fb08d0b312a0de3f311b2d33d46cd48f25a9029c98cafdcb9c275b4a41eee30f00000000000000000000000000000000000000000000000001805f06c9388c5f9e90532d68eadc90dc2dc0c9bb3dc65b30ec673afa239b3c5f4e7c3245b83ae3000000000000000000000000000000000000000000000000004193740543a00803a706e02c4f6982f728dbbf9f06b3dd4315678f0765bda2034ac001e43714b900000000000000000000000000000000000000000000000001aaff37a904e1777d81a06e3d4f1145f08dcb7e2c5a1b0bc07c049b7ee4b294de50eacceaf20004000000000000000000000000000000000000000000000000005724fedbb2100837e2575fd4309d637bb9f7f8d68d3d6513a6c06ddca1acfa7142115e0f22ea230000000000000000000000000000000000000000000000000011ba60e96de274ded310bf19530f83dd14b4c9104b86d92905a23ad48781eb5555e92e36238a3d00000000000000000000000000000000000000000000000000adb21affb6b025122ce1fd6dafaace345a6e8e8053288852c2804d829fa0b2f53dacc822293a35000000000000000000000000000000000000000000000000010ce6b40483a177744adf0702b12168006ed31d0ae5059bad72c218445d69fb1cd849ffa9553e75000000000000000000000000000000000000000000000000002bd225d092ee3882b345b5454e16c7d778917c214cc21a704ad18effc433ab76b3742f818776180000000000000000000000000000000000000000000000000039fb34ea4e5ef6967d6923ed83e1edf338abc3db62ca170836b6805d034f1c8aa9be3f173759a8000000000000000000000000000000000000000000000000003ecf8ea01a447655553bd9d902714e1a6a68355ffd2a48c0f05bcff2d7275133ee53a68c11fb4100000000000000000000000000000000000000000000000000a2cc89b2f602c34a99726bc821373dca937c2e1e1a04e729e24cd6416ce1a6c7946659a08655a400000000000000000000000000000000000000000000000000b5ec0ab42518c6f4b90caed20cf03f677275ad7f39a49c3e2c4957e4877f6d6a35bb894987a5d60c799eec0c8269e6f66433183bf6c37f7e2234fad4e8619a9372c537e1919cc9ec74508765aee93de110aefc09270ee9fb53f1999f29fc5ebc24dd0ede2c3a7500000000000000000000000000000000000000000000000000000000000000016c621809c6ca711a4d6b302551121c359ff76f7c4d5a320a16f341b56c79669e0000000000000000000000000000000000000000000000000000000000000001d80cff06f9ec1f38bed97afc84f89bdef6d82be0392af92ea32ef38ffbe1182c0000000000000000000000000000000000000000000000000000000000000001e4a233e169bee20c990f4d9c9c7a6bbcb843eecbb9ccc98358c16bedcc8dd66a00000000000000000000000000000000000000000000000000000000000000010f8b24c7e20ebf5e83a1f1de070860220742571115555dc952e9c62b95781b20000000000000000000000000000000000000000000000000000000000000532521a74e15bd64217fff71d34ea4bce501c76025371d9658f1d91c94e18a437ebb0000000000000000000000000000000000c097ce7bc90715b34b9f10000000007d6f2a52f218804936029c26e0e001a02da3bdcfddf634a63fa219e0825e912d0000000000000000000000000000000000000000000000000000000000000002c1d6d9ea700c86529fc733cf35e6cfeb3f385a62ae5ba56c306e301e75b691fe0000000000000000000000000000000000000000000000000000000000005327a3547bcb69c7cdde770097cff6c3057413a48c8908bf09738429448e7335bd4b0000000000000000000000000000000000000000000000000000000000000001dd6fe47e73fdd91b61539ecc3a7d7c694b7a3cc037fec9454e23747d6fe5ffeb0000000000000000000000000000000000c097ce7bc90715b34b9f1000000000c04a7afdfef05f20990cb7f77bba23955f9cbfafb1c843dd21713c72b18ee6b600000000000000000000000000000000000000000000000000000000000053266f3af6c93ffe6f128ac3807149259a66e8c2e2ea135191d30f4e9eb3f89237580000000000000000000000000000000000c097ce7bc90715b34b9f1000000000c3fa4ce9f2ef06c073e4bcb5cad193a4a60ddcfcca818bf7602e556a08167fca0000000000000000000000001bbd33384869b30a323e15868ce46013c82b86fbe19a1805d2343e0bdf763c94738363a08b6226b211a527531a5afc61efdf47920000000000000000000000001181d7be04d80a8ae096641ee1a87f7d557c6aeb3073ca8c7b2d587def01896e8450fffe2ed9425db7d6feb6db29b22fb221bce20000000000000000000000000000000000c097ce7bc90715b34b9f10000000007f641b3caed3e1b14310e3906ded619543a8d5d8730acaa16379dff5e35f72730000000000000000000000000000000000000000000000000000000000000001a95d63f25941c77119899ad7caf9be8bb51766a4680dfe0a01367c3d3fd8ac780000000000000000000000000000000000000000000000000000000000000001d05b36c39d6b6639c18998a2c3520c301a8fd557cdc4c0a6c35a30a1bad40a4a00000000000000000000000000000000000000000000000000000000000000017dcafe000bcfe104b30ff5b7b1e64e1beda4639c4b7aa20cfcb6d8277b026b630000000000000000000000000000000000000000000000000000000000000001239b3f3a3532fd99cd898aecc9f2e864b06a0ad4c1cc5d8a577ab2050d96bbcf0000000000000000000000000000000000c097ce7bc90715b34b9f10000000002832f0b95cde62d42470c34e942dfbf7c0887f821b6c2c266e4c52597a486d0d0000000000000000000000000000000000c097ce7bc90715b34b9f100000000032ad0072320054479e49136cb6b90c3c4c5ccf28146486dbf2b08786224533a20000000000000000000000001181d7be04d80a8ae096641ee1a87f7d557c6aebd1b813f59e366147c60432977ecf25dea77ea7778fd50742abd1ed9f600121cc000000000000000000000000000000000000000000000000000000000000532375aecf25407ed718ee36486846ac75e4783d6b3694e2f46158317122c49d65fd0000000000000000000000000000000000c097ce7bc90715b34b9f10000000000895bf9e8adf5d538599804c19b4b119dd5fbcb901aa3c61ed5c6c315fba10c90000000000000000000000000000000000000000000000000000000000000001bf5c1efc0fa728c1b241e677e4f0113c57e97ab8c989251d107f31ed381c2cfb0000000000000000000000000000000000c097ce7bc90715b34b9f1000000000186ad8718a785ba5ffadc8b82e7b306ef412529a789bedde9a3af932d92959860000000000000000000000001bbd33384869b30a323e15868ce46013c82b86fbc11189fd192e49260d5a6a467e532ee12a352ce84da8d8b431bcbdd9bdbd831b0000000000000000000000000000000000c097ce7bc90715b34b9f100000000092a0c7ab913202406cb3535446b840c0abd5ebb7dac53b1ad7eb9c52a50905510000000000000000000000001bbd33384869b30a323e15868ce46013c82b86fb22d813e55679668e7dae5e0fb78ebab1ad7a0126f7d6708a661ce8a0c15b9f1c0000000000000000000000001181d7be04d80a8ae096641ee1a87f7d557c6aeb0c8d990122d0e605658ba102420eb2e7bca22950d1af75f4ca95e8426b46704c000000000000000000000000000000000000000000000000000000000000000164fe36456c72f3e73fcac704a7eb35c7f6fec0ea2992749a89634e7d54fef6d10000000000000000000000000000000000000000000000000000000000005324f5a5261cc6dbb7e205e22024cdda8dda3e3df110e2073b795620fdf262db607a0000000000000000000000001181d7be04d80a8ae096641ee1a87f7d557c6aeb000122eadb4be54a3873e8173e1793025d6fbc481246f4b19d678634eb40508e0000000000000000000000000000000000000000000000000000000000005328e4a10d5c41a83b4373f6a30eb989e5d1cc6261221d107adc598e2a16813f91470000000000000000000000000000000000c097ce7bc90715b34b9f1000000000b4ac1da6748b6fa2d2eff40f16873f196cf57a034a791dd45235a93fd262c2890000000000000000000000000000000000c097ce7bc90715b34b9f1000000000de18e3d3c16a5d7b49c9379881f4c53f3394812be05471d3a26f992f1548dbb3000000000000000000000000000000000000000000000000000000000000000154a0255bc06d95a5f483d2ed8f8cc979503e3398dafebec5cb937bc4895aaff30000000000000000000000000000000000000000000000000000000000000001c4582d2c56c952de46681cfb4a3d6b3560a3a7ede9a7b62a3ed045d544bed6ef00000000000000000000000034e1f1dc7914e31b40a261bf4a059daffdcee2b0aa6e8a1925227edc9d2dcca29ae0dce28dad8d8a7a18cb88096ceb806f7acbe000000000000000000000000085d50ab0ca08766295aa66e960ffe87454093ef0055648334a815a05a4a403e23ebd966a52d4febda73603f3513cb8b50907af2100000000000000000000000066f1c3daf78feb6611a269dc9361290d1fbd7cb39be7d12f40ae5897052a8c4c64c29fd53756c85e4bc5ea5e1d0d74aa9a471c230000000000000000000000007f68a6610ce77e77d843ef6ef9edd63abf12ae40a0853462274d1dbc0d3987bb50812a1b0fdab4ccef332329a9f43ecfef699c44000000000000000000000000de1f048761425969bd5295e24fd2c462018e167f71be57b5f95615201bbe2c0890c2438a2fe15d8982a25a161b7d1d61fe8cc114000000000000000000000000ee8ab75f6e1d5247ad7abc7b8e8f0fbc6a45d5330d1c6c8f9c71da5e255a2c72823172eaba41e48765c53ed0051f1a3c4146eba5000000000000000000000000ca4039046f0e9a34f86b5376ba76f2d5e5a2709ef3ed0f048f3081fed52ab9f5824bd7b3b0cdd32160c636807c032dcf3368b0fa000000000000000000000000d0886275a97757676f051b29d3b636badcb1acb532f1870ebc983cac8ddcaf500f22e99c16bb224fc84d5fefaf77be5a476c7bad0000000000000000000000000000000000000000000000000000000000000001355c4181a1f385cd951e3e85512f85180eac48e86dd87f63bad6fc3b66a112c40000000000000000000000000000000000c097ce7bc90715b34b9f1000000000601883d52eea5c0f070804d3a3b570ab791cec8fdf60af57ef7689cf80ea4d2e0000000000000000000000000000000000000000000000000000000000000002f739116597fba66958a8ae7320e536f4923a98940096ea44b42b34cb3c274942000000000000000000000000000000000000000000000000000000000000000131480590300340fbda02744a999d41b561f4b1783ca7ecf37533f1db5585bb150000000000000000000000000000000000000000000000000000000000000001cd7662cb630c3bce57f358c7f18521ca7ebbac87d2b277e90922d44580cd07220000000000000000000000000000000000000000000000000000000000000001258f0071c2b94862666a92b9ade2035e2b81bc5d4628ed15ee350c4494b393760000000000000000000000000000000000000000000000000000000000005329d772f6921d2e16c1b1d06fca2880bfa70f0dd5af8fc0ffce3e6194328a4a67a90000000000000000000000000000000000c097ce7bc90715b34b9f1000000000519f80024a1b0fa173429d48ad2956521b22b80eba0145cad116dc163247dc90000000000000000000000000000000000000000000000000000000000000000121ee69fa01f5edb77053d977f2e35e653a35263f869b042636e0ed5a7761009000000000000000000000000000000000000000000000000000000000000000013f0ba6e7fc6bf2b4376bb6e59679a6e284082bd149bbcddca5402e9ea2db148f0000000000000000000000000000000000000000000000000000000000000001c932f8ee79a3d0d6c47143ac27233e3a4cbcc75e77d10b0fb71b1d58b9fef8260000000000000000000000000000000000000000000000000000000000000001a24fb3177314e8d21aed8f00da95ec8d93285b5782905fd3695148c10927cf130000000000000000000000000000000000c097ce7bc90715b34b9f1000000000190860ece26801259777b27e911a8c6cf84b71442a89bafac0c87e9695f7f0bd0000000000000000000000000000000000000000000000000000000000000001d758e9de19dd3aae54bdb580ea083a47c00fb7489dc2d0aa7c57dafb9d29e1870000000000000000000000000000000000000000000000000000000000000001a936a7af23bda6667f6d1701ebf8db01f8fd92bc17d2a141f4bc047ef1fe349f0000000000000000000000000000000000c097ce7bc90715b34b9f1000000000e53af2a22c23acf8ffdd7f89671ed7bca96a85f3ac09853b1e24abd331f5a52d0000000000000000000000001bbd33384869b30a323e15868ce46013c82b86fb7f88a4b07198da13302eca3727d25f2443e06d2c74f3f4564c5a9954da31b3870000000000000000000000000000000000c097ce7bc90715b34b9f100000000038c91f2f8ee91af9030d79078e67193af7776c541561f3a5c04a8fd672c8f56d0000000000000000000000000000000000000000000000000000000000000001c868a7872fb51d1bc8d3722633ce972ad77eae13992ffe658499c68bbb98acab0000000000000000000000001bbd33384869b30a323e15868ce46013c82b86fbfd3eedcf3857ce47d69930858115ebafb1597fed0fdb4eedda1941f83105f9b20000000000000000000000001181d7be04d80a8ae096641ee1a87f7d557c6aeb8a77e7189c7823b8409c80844c8c2ec67b279cd000ff7fcfc78afa87f8fa6ecb0000000000000000000000000000000000c097ce7bc90715b34b9f10000000001897ddffb22f42ef8d458a588604ebaf3fce2f0cf5bff631daf30dcb4ec6600400000000000000000000000000000000000000000000000000000000000053228d71897e54088e8d69d9be15f84180c23674caf2e94ba817fe17632116360d010000000000000000000000004f790f2289c46e45ed197bce7763c84591e1f223885c1867c12fb315aa3a20b25b33884ad89f1a61e298feac4091c38727585e9d0000000000000000000000000000000000000000000000000000000069d9d87bf7b47579072c0e5d88d41b03a212acba091cf55a2a3ed13817b1aeb30798be2a0000000000000000000000000000000000000000000000000000000000000001c78a47a92380c8dbf37310759f082b97ff66ab05c324fffae22e36aec594b7460000000000000000000000000000000000000000000000000000000064363dfb4b0ba283d3637db427313ef64fcb7d8e7048a4094034ec5615a79009f9dda2f100000000000000000000000000000000000000000000000000000000000136bb155fdded8547f39194ea063fc8162e38dc7681ef9bb608031c7d57cc17167d080000000000000000000000000000000000000000000000000000000064363dfb1fa6925db7ad574f041ba2b1120737ae5523f4e0c985de9a5286ca539acf4199746167732e7a6b0000000000000000000000000000000000000000000000000ec28b78b9a6cc048b9e448d7252ceb0bf19733bfae675783e1c94a8ca48cc5340000000000000000000000000000000000000000000000000000000006617717b090256300cb97bd4459eb2b17446b9cd9e2ddd18b40136b0abee0632466a5fc4000000000000000000000000000000000000000000000000000000006617717b4dc07bbc50d9368cbe3a65ed14bf69dc9c42e2664e553df808a8970b9910c7ed000000000000000000000000000000000000000000000000000000006617717b43b93274c939f90a2ca713911c929042393d717d1bebcb752999ae734b810a710000000000000000000000000000000000000000000000000000000069d9d87b75408f7853d73646871fe0770433167946ec4246cb30c474d1fb19def29dffb300000000000000000000000000000000000000000000000000000000000136ba5dce6e9652f05bda38f6fa178fa00ea88a6ead8e7a26462c1f7f2fb38fc0a4c200000000000000000000000029ab060bd02cd22e4042095679cfc5118098d46c0799ddd86d56ff7a585393097d4a81eca304ce6da5aa4e54b1f86224729ece300000000000000000000000000000000000000000000000000000000000000001ba24ead0f5db6db5ea050b324c8ad172e063ba117eec1ed8a721d8fce19ba85e00000000000000000000000000000000000000000000000000000000000136b9c2289ebea213d7254c6ef728943c6c612bb2cb418c78b160f1411ceb3fe374470000000000000000000000000000000000000000000000000000000000000001e8828539bcdd93d3b84912dfbc88158f0984827860ce590b71e5dfc76aa9dfd10000000000000000000000000000000000000000000000000000000064363dfb916e3e21ed153df4d663f64eb114213b5be8073d740ab7538c7f1f38b5ecd83a000000000000000000000000c93d85b91dbe985400f41a81755ee842132848f711319507b731730a059906232ac8e3eba32e0b0d0329c8db128f63ee28a9fe070000000000000000000000000000000000000000000000000000000000000001e412c7ecfca70aa5de8d51b67e16ce0b6a7ab01f340d7cdde589e4df73034ccca7c7eb2f3f1b9f43cf927bfab2e8246db35e5765c6c8ac050224d53a7ab796af1f2e0fbc0ff4b698c8c86960936f324893b6ef6d786bd7bb80044cfff10cd363d3379c30e4c7b8a24443e23afa9272bac62d5dfcdac5aeebdea3ef70b7d7b9c4417d1ea2925a68dc3e7519b099bff6fbfcfbea2c9f6bc7501271f2ba69e69d96d82ca3b18d89bb6022e1547d6e4bfd9489b2a9c994579bdaac61c72c30c4a6e04ae320275846ba7fd1a649dc68e1e9a4980e8806c2ab6c100bd08535f60adeefca94efed4891bbba446ba73a989209b8cfcc282dbfd42e9bb380b8cca056fbfdb4a893f44ba48cd2b09fb0d9d1b82f11c541d1c8b2f3f2e652ef64106648b650fb42070b36bf61425b6319a9ef8464060bf5c749de4d5c420c9408d4267180891768027fca9ed429742dffc5700584bf3ba189b49f226d87208a2d66e16841f747ea769a77acd9536510b935e5f4214f4a3750b272bcc3f0c5b609a2c48ba2fcef54787fd3962f4d55b0ca87813a163ff8bab696ba2a58fb4c1c845bf155118a6a3030303000000000000000000000000000000000000000000000000000000a42bf46ca4942ad411d5efd6053fc72758e806e11bd4f4c5057eed5e0461d6be869747379696e67746f6e672e7a6b00000000000000000000000000000000001c99954d9dd84c9a8304a73a05b645bef88010ab5d10a5b569f1c120422c0ca5d5000000000000000000000000000000000000000000000000000000006617717b4f7a864a85e42cbf20158fc1b4e85cfc43a44a09d3e5a7126084e68536c37b0a0000000000000000000000000000000000000000000000000000000064363dfb3cc34c2a528abb8ac6d7b5e239fd36d1519068d9c6d868fec805b5077707715b000000000000000000000000491237018f89a5e7ddd694cf913f6c520268df68e2335a2b8b2d5c40481717c1a314c65f375c160b785fbedb8ef3a16899102b986c6f73746769726c2e7a6b00000000000000000000000000000000000000001687cda33238e453efa1e565c1c1f06c61677aee60d0b31f755b84bd1f0cd2052d0000000000000000000000000000000000000000000000000000000064363dfb00ba6a13414748b1ef36b6b171b5f19cbf88fe7b300e5af3aef2c4fdcfe4ad816c6f73746769726c0000000000000000000000000000000000000000000000107f67f2c7782ebcd3b3ff8ebf366d6dd2dc5ab7c88f76eb778b48ed52f4df78070000000000000000000000000000000000000000000000000000000000000001d5c0cb57a330b31225c11b0f53707564e8f1a14409a00772b0b148b9bc9f389a00000000000000000000000000000000000000000000000000000000000136b86daaa96f059f166dc407aad6278b5af15efe4fe10a3cd31a98974ffb5f30095273686d696e742e7a6b0000000000000000000000000000000000000000000012ef729f80464970381eb9145f866dfc283ff8b556e78697d92a834fc2018a124d73686d696e74000000000000000000000000000000000000000000000000000cea64b6adaa40952850ec2c35667d9f747617a546205498b4ae0fa6dcf92c388e0000000000000000000000000000000000000000000000000000000064363dfbe8706c847a174d16cfdc986ee037fb7f63bd5e00dbefcdcdf426cf5abf4dbd8d6a303030302e7a6b0000000000000000000000000000000000000000000000100d7235a25bcb0486ffa3af6c17ec67031c81f5cf2a91220e9a5510173acb4ab00000000000000000000000006924da629a9fd4c6f0e0c903e3254cb4e79bde7573cdc6d962cd4f23e714a51747ab1f643f4af7304b9b3ad7858dc974d9b4b0e000000000000000000000000000000000000000000000000000000000000136b70f594d11e78d366f73c65f16e85addc51f08a7cce0dc4311938b71b9d4282fb87461677300000000000000000000000000000000000000000000000000000008af297cbf23f7c4ef4cddc43d9c26270b9f7491178802f720dcd2800e3cdd9c3469747379696e67746f6e67000000000000000000000000000000000000000016b8a1cd86dcfe7e9acd8c0abeb6a210b0af6675adf5430ee4a7d554fcfc341abb000000000000000000000000e1240ffc4816af172f8fec0e9b705088e34964dc8fb262251decff49f605258f6f35161dc7ce936e6e6042ef9305a204ba971c077965736368726973746f6679657300000000000000000000000000000000001cd428a8cc57a462e1d8f27713893aed6f2be39178338fa3440d9ee06120b40d787965736368726973746f667965732e7a6b000000000000000000000000000022d7e70cf11ee325dca919a6a31b651049f214804fbae4cbdc4a817dd69baa747100000000000000000000000000000000000000000000000000000000000136bc9d4ed2097103f70dcc6fc6ecf4f29056f511985f365c0d264b036799aabb8229000000000000000000000000000000000000000000000008a0d48bb155d2517eb58c151666030ba908c1e368c855bfcf7d3ebf76171c03950e64f86b70d7d3d1000000000000000000000000000000000000000000000000000000005b0cd4ba3cf750cb637a033dedf97562e377a4d97385cbb531ea2ca8ba1578ff79834e640000000000000000000000000000000000000000000000000000000950269753c346491b306a599e06c9b42537432b230aa21106b707ad0c61dd13ec6c8d16c90000000000000000000000000000000000000000000000000000001d1a7898e5bb9c76e26838b78f745025b92a2a36a9584fa5e376507a4120b24750b6cde1760000000000000000000000000000000000000000000000000de0eef7f7e47c9bd02873f330e5cd67197d88043fb5255d082c85c2c1604b6b1981f11d407e86c50000000000000000000000000000000000000000000000000000000cf36b232a3388e98088472b674a08a86ab4aeae60d4d0d6d7451a247d80572fd11f7a45950000000000000000000000000000000000000000000000000000000001406f405ff1d3d1ab630cb88dbc07f4253dad9497a74275866ad99ec1976aa3cc0d03eb0000000000000000000000000000000000000000000000000de0eef7f7e47c9b336dc688158fd77d159351d9b51e1777d68331bf46092e4f5788e45d37f90d020000000000000000000000000000000000000000000000000000000002b0fd7bb0de2b55a8dea9e6e71ea9016a6d90bdec82a33319f76c88486fb58a4a89e09e000000000000000000000000000000000000000000000000000000000026259f6dd2e16d9b0cd56071419ae152d97435e5642eaee5f49aad2dfbc4d87800688e00000000000000000000000000000000000000000000000000000000017d783fdb57d2cfcb157fb367ec66e4c8324067317997d9a198f0bd4962233da333dc5300000000000000000000000000000000000000000000000000000000046a0cfabb83cc7091c1b9a042c99e726d285387219e21679236362f46444bfae0cd0b3a000000000000000000000000000000000000000000000000000000000a1d684ccb6534715527fdce0a23dbe2ee275a140be8097fa11e84459f6b3a02c1f1cf0f00000000000000000000000000000000000000000000000000000000000a957b1ebea139b1dcfde4ff4e6dade88ef3672dc0dd6f21853d7b5b4fac86e78424f000000000000000000000000000000000000000000000000000000000003e5b670b5006588117c35063b903588558c5bc040c9fd0003898416bedc3783f41a18200000000000000000000000000000000000000000000000000000000017d783fd65fd101d4bd179939f3decba3b9befc15103d766bd579f2d7552553a132b27100000000000000000000000000000000000000000000000000000000013959c72f6cbb181ddb6d13bd8a579bc42e4e82b4e65a988f6698c6aafe7e04b2af7d95000000000000000000000000000000000000000000000000000000000053b2c2f5cdd6305f23335ad6a7c3e2881139c02423c7ef14317c86189ebde8c90d899600000000000000000000000000000000000000000000000000000000000000011080bb9e1ba16709eb3903c52245e42b38bb67c296c2dcb9cf4d235150899d3f00000000000000000000000000000000000000000000000027b967efd738733800e22b650554b0cfd471177516b0b6d4a6684a639f69654f5333bb775d037eb60000000000000000000000003637b5a0a7bfe3045e0d96533d6dbedbc04ca93231720c657e95008736d6e155350b1bb22caec9e6572b4424f7cb3805dbd36ad400000000000000000000000000000000000000000000000000000000000000017f4d2bbbe9dc9c1519b105ad5cf3d226b7c8aa26b7122944f45ccc3ce4dbcbcf00000000000000000000000000000000000000000000000000000000000000012d10026f0ef46edb66759cb64fde8b145cdfcfe0f1be0c094e3e0eb12418af8c00000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05cbe6f6a400f5d4927f923ba57f56b79135dbc76afa8a2919429a2615ecaf2b0d500000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c06b0be10f5614c5ce73af5efb84ab4b2bb4cd6e339198a97def095cf211273b600000000000000000000000000000000000000000000000000000000000000018dd7f6399a34b75fdb4bdedb5eaaa13ecc71422e2942b8b58a154d1670595e9b00000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c8d8fbd660b1f9bbef4e5c37d2f8c146fc79e1d33a340786babc75df5af222b150000000000000000000000000000000000000000000000000000000000000001070842ffbb3b588c880aa5498b712add6ffb379e749f45544e1089cd89e3c33e00000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05cb25f80a852cd29e9638707bb3c3644d41a19fcb988c14c03bafedf59b67bebd000000000000000000000000000000000000000000000000000000000000000017040a4c342f27e4438da71afc92c45cf119b79f8e66be57041c90a5bfea60ed700000000000000000000000000000000000000000000000000000000000000013ca743c2b0ff637e016bf03f48fe69107b9f4f3ce061f3beb874b338bf968b34000000000000000000000000000000000000000000000000000000000000000184f999f18c5fc86ad5127ed162dc6e44ed0c805c2e5fb61f3f2e88a41e48af1f00000000000000000000000000000000000000000000000000000000000000019a9e639e0f11dfe7cba571283d6ffa33448471b41e765f484c0c61339f0279dd00000000000000000000000000000000000000000000000000000000000000017d79b34588a5f2b46a9a044bcf17548b73ae483cf7390ce8a0b5c05292b9bf7a00000000000000000000000000000000000000000000000000000000000000018d12a7c285824d5e9c387937842b8844b94f4cd431af43259fe188385f9dc0040000000000000000000000000000000000000000000000000000000000000001b233ba95d46f75cac29ea63fa9db25ff39f770a6d493ee10352f5cd0237c1843000000000000000000000000000000000000000000000000000000000000000100cd9b9f33ad3f67f9e8484907d8ad60deda0b85ce48778ef7f910a8ce42bf7100000000000000000000000000000000000000000000000000000000000000019b6fd8a07ba9acdd0bf5715c1158c7a5f8884fe681edbc7b140ad41f665693fd00000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05cfafc88cfd45e24ea176dde65c19a1d5e417b2cf7b3d3340d560e39f27f1c019600000000000000000000000069b9a2eface47419d496d9a550a162185999ace5492b0d203b0786612b9560ca2781f60d8f38d83cd9b9d67bf11a3311dd04f3fe00000000000000000000000000000000000000000000000000000000000000016507d45886c3612c2f7c6ce8522a3a32175d82df803dc207fc38766c6b51de2100000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c70096f976f8bd50ac2b995ca1f43aaf4e24a97639a5b1af1fbc8300334a7cc7100000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c4cb7eeec2940d0d28503add7d427aa40078ac2fca00b6e1e790787539fda3a400000000000000000000000000000000000000000000000000000000000000001449ece3c3c13f80ae4ba5e02be7615a9383f840f5b8ba6be82177e39174fadff0000000000000000000000000000000000000000000000000000000000000001bff8d7879923b12e94084d53d755dd177e051e0ece0f430bde3dd0564ffecade0000000000000000000000000000000000000000000000000000000000000001e5ed14855c6e3f0bcfdd2519135e0cc9fa25a94cd93d02e021602969ab5093b000000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c3dc0901c79b419f72c4e302e4e0c49e8d45e1edea4981a068711744133f3f38000000000000000000000000000000000000000000000000000000000000000014a9b577b99a8bbd3e5d01edd52e6dae62d38e707cdeb812a5b45a748153423d5000000000000000000000000000000000000000000000000000000000000000128851093ee8c0ff564aa1df9845bef45afc818194dd01927eaada0c498616d69000000000000000000000000000000000000000000000000000000000000000132a1ac55686ea3afb0f7855e1e4c445f618d97178defbf354ee2feb28bccbb3e0000000000000000000000000000000000000000000000000000000000000001432cac2f5e7b5e0f34494c1d075f520d06f20e720d54c2fbf4ad50436a027f180000000000000000000000000000000000000000000000000000000000000001bd7df1df2177af71bc906fe09362eb2435410230f1f1ccc74c2593a251617ce500000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c96f308c51169961294223a9847026d5aab947578021457838e1a1dc98bbe4c7300000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05cca520a736c615efda99ac4f297542760c45dae3260fa41bda9cd3be9d033acc400000000000000000000000000000000000000000000000000000000000000010a2e315343568c54d8310a3ab86ba8240c2cb23e2d13bd22e79e29c31f131b9f00000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05ce9d31e439b3f9fd501afdfa1aa9d184cf810f214f5fbbe22630531598277010b000000000000000000000000d0dfdbc1eb17555480b4f5168b3cb31303d37e01183cd7ab63c4c86f9f08cee2a6644a7476267a85e8904f8d2cf65de2a00e92b100000000000000000000000000000000000000000000000000000000000000019b71e8d29ae1c6c5b3aceb05fea362ca9a0032aaf65072506d6f0d7801987b0700000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c115bbeaef2fb9bada249ab20cbc8a242d548165fa0ff265a765a85306baf31c500000000000000000000000000000000000000000000000000000000000000011fb243e2559396c24473e7bbd4e13b71d3adbe872cb2b07946d5259fbd5b0744000000000000000000000000000000000000000000000000000000000000000116663a83addd52602c78a2b350afaa8b206a080fc782ace28bbb10f1f35233380000000000000000000000000000000000000000000000000000000000000001111717afbc66ebad9c17adc192d484a20a67581859695fff119e6aefae1892f4000000000000000000000000a929cf2f30ce13e9ee0c498719d53add892be1b3c8b30c3affefe6af167f681ab039189bb97662440fa6e387689a5516a9aa58f200000000000000000000000000000000000000000000000000000000000000012fbfacef1042ff172442c7433cd799f84abfad65647dd0964a21e5677c72a93a0000000000000000000000000000000000000000000000000000000000000001a64b6e191381dd2bd86d8c02b0a3b2dbf48c849991c00d1b1c4a18feee7974050000000000000000000000000000000000000000000000000000000000000001bbae4730b9312a44ab28f0024866154b1a7c61715096e1ba173382daeff28d6d0000000000000000000000000000000000000000000000000000000000000001bc68b3f28ae5f7c3bf4677b63a0373da8aaa4a0c650245ea56dc609352ed02cb00000000000000000000000080115c708e12edd42e504c1cd52aea96c547c05c64faece2bff31bfe42f12cfb5ed3e958d8ee35875c5a5d5939cc36b7916e84dd00000000000000000000000000000000000000000000000000000000035504e16306007254348ece09b745fffef010f00639c02ca5eb9b4284427b4c897d230e000000000000000000000000000000000000000000000000000000020ee3e5436cdd57696054672795aa6cc505844b8268801b3846aaa8d847f756dae6f2b0dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d8dece7e5182a55eb430b97cf5422d9dcbabd99e2613d5323d6739f5ac6932b000000000000000000000000000000000000000000000000000000000284ba72a90a198c8ebc3933237cbd63b295cdf66ae488ffdf64e3ff245e49e6ab43bfc5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdb3283fbc9c56f2e3c11e8804586e0df655caf519a8223bd4030a4daa9e1337d0000000000000000000000000000000000000000000000000000000006a60e163207dfc1e8d0c4963c2b7c7c5bc7f6373a922404f8f50eeec8f7de13261e736dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1da871809d2fa74a9d214541b963c751929b57dcc92f9ad3ead774cbf2d5b13000000000000000000000000000000000000000000000000000000183962ee807d688df259319002bf0a69cf84a38f5a9a1952d9e5ed495535008b39190b7a5f00000000000000000000000000000000000000000000000000000000009bc1a9dd453aac4697b8706c5060edc8bd0d1d0e5f675cc0923a12a9ea9e3a7a01a2880000000000000000000000000000000000000000000000000000000000b71b004880fb40bf49bbf83b60cac573e6637b1ba756d97fa2ee04e5387493fb07b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff54c9d6e990ad1008d80dfaae1d1c856bcb69f179c5cb5f088f0765694ae1bcca0000000000000000000000000000000000000000000000000000000000000012f96e7744bd6fe6ce572de9ad582918ed3911204099ae26879bbd79bb43a8e67100000000000000000000000000000000000000000000000000000000000443db454b9b7a26427c4185c1f0827da16fb538e51d523ae6d04199b7796ea115a4ce00000000000000000000000000000000000000000000000000000000000000581aa5622fab5a3e709f7e98a26e41f9e5da5ca0afaecb495717dbdf596b61fa16fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe313355d07e97c9fda15836821e96d035d44449381d73a06710a7c436c49060000000000000000000000000000000000000000000000000000000016381c3023386afc4c43b1d726330cf3c35d494f9547459cc9b371a09ef3b5d1ceabcf800000000000000000000000000000000000000000000000000000000000000025bcfe44bddab639d880b15e8d430dd8a2da39adbc10d4f2d05140f4e9d45eeabfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82d748678e71427173a35a26e9a70cc1b14d08b03578e8d875284e846a005cdf0000000000000000000000000000000000000000000000000000000000000004542e5ca8b4243a8c184b75a34dd8c4ebb3460c41afb8dc5b10d658139fe28e380000000000000000000000000000000000000000000000000000000001ab6908f37c751b39cd0155e40d0d6aad76f4be2ff99040aeeacff914b06057e8fce86200000000000000000000000000000000000000000000000000000000086486feba2db460b23097cab83b67f4f10fda4258f7330aa10af44bb34810d032840b380000000000000000000000000000000000000000204fce5e3e25026110000000bd04f03ee6c35fbd639c07e07a4116a67d3d13dbd6899819dc7387e0c24a581700000000000000000000000000000000000000000000000000000000000dfc4b67eb334d4b97e2457787035f007ff4459a47abb92a3e769c346f2dce86bed50f00000000000000000000000000000000000000000000000000000000002dc6c098f13f115bd0f0ec805999f7117db96a2992cc48a6352f2dfdfcec3495874e7c00000000000000000000000000000000000000000000000000000000001c4f51e4f6e80987d9809a3f0e88f78358f7c548baa94826b4f6897e42b15ad997df57000000000000000000000000000000000000000000000000000000000336f22fb7e98fada23bc141f459eb3b32f8115178141fac1b04ce555e85ba0fe0efa181000000000000000000000000000000000000000000000000000000001ded65bb13eded76a409afc6e9c197ea3e3714bd81fb917bfe9fb8c443720f8a79b6d61d00000000000000000000000000000000000000000000000000000000061a5228564cb166b1a8b3097730929560761f077f70921161db5d0f1c70cebaa96d49fc000000000000000000000000000000000000000000000000000000000165b323b738c905125decd48083c07704b8924eb44d958839dfc2527476d0b56504b95a00000000000000000000000000000000000000000000000000000000003d10144ba3e9c5e152b80efe5d40641419ff4eb2ea9092b45aa6ed5d691a4c3223b2b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07fb8aba2402591917486138102ef47ba79233b3200b8c3cfb0a7b528599acae0000000000000000000000000000000000000000000000000000000000989680befd7795b606cebcf6c0b6bce64c6593e1e47d450dfe93bf7d3effa6f42c9fc7000000000000000000000000000000000000000000000000000000000234e081e7f3132e569ad81e88b5818fd06552747ed81a1287ed86b35d79f2f559987e6a00000000000000000000000000000000000000000000000000000000017d99aa97caa6ccf2340a919921e962edb2a6d9c716a4068e8d80dd7bef78ce960333d2000000000000000000000000000000000000000000000000000000002c1b810005aad69ac436239e900702ca2ad47b2277cf027ebb5650d68baa59d0e3f42538000000000000000000000000000000000000000000000000000000000024a0f52892544af5a50730f8f909f5b4ce01376433d4a4e6817e25b8e8e2f0bd21af7400000000000000000000000000000000000000000000000000000000040d9900026458645a448f61b61036c5136cedcfb55e0d81d295c7602a59d7f9d10d83f800000000000000000000000000000000000000000000000000000000011b30ef199aa67233dfdadf5e4ceb8c1156527ade36b63cbeac6da34a13a6e6310c3adb0000000000000000000000000000000000000000000000000000000006314ee0eb961797cb90071e7191d6b4466b5e2b606e1104fda6cdd2f9cccfc01aa71ac3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff68d248a23fe1400fbcd2a477b106d0b82646049faf48b48970be24ec02725c7d000000000000000000000000000000000000000000000000000000001dcbde60fb19997b52f731d5f90ccb9d682d0b7ebd59c336598d394b11a349820e99e5b10000000000000000000000000000000000000000000000000000000005f5e1009c116e232db078e5b7226f3fd40787462bfe06dda11d873ec63761bfa0b4f58200000000000000000000000000000000000000000000000000000000000eb810ab77a453d345bf9e41a8bfbea3b9661f1980b6737224eb2f3dbc70e79b15404300000000000000000000000000000000000000000000000000000000011ae2210147b9ab7773f865e390ea675d7d05a98cae7b9cf1d6cae650c324df85337bb900000000000000000000000000000000000000000000000000000000002391bbd428c841c5c8ba399dc36a509ec2175ea6e17d4df3fff18cde8d9b5b110b926d00000000000000000000000000000000000000000000000000000000038d7eb20541434e4ee56219e2299e72637983e033efb2e6f5b1ff7cee7497bb1cc30d99000000000000000000000000000000000000000000000000000000000e60633d33926fa187a645acc07cc8eedb970630389c8a9adabc56fe0331c507281f3decffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2c6da1d8719f79378a3a37a03ede9b81aced3ede24dcb5147fba7015bbe351f50000000000000000000000000000000000000000000000000000000000706dea0c1fd3a973a0f6b080ede1fd30e52be6ef3c032de26656f573d05f52f188de73ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd22f0f7e0493705ce3560a397ef02ae22fa8a31a68f16b3aeef11271aae95d870000000000000000000000000000000000000000000000000000000000389a34d1f375de24007d700c831525bcd9cf36b4ab7f2fe83f0a6c9b4e713adb62fd7800000000000000000000000000000000000000000000000000000000048e173938eafe27c0926cdb1eb4bd00b565a45cd8ef8994b5ba1ef296fb99fc47d32126000000000000000000000000000000000000000000000000000000002133bf489d3a6aed6fcf373bb30e89515898032c0206a22df27a9af6c4246b0dfe9b2b60000000000000000000000000000000000000000000000000000000003a52ee845fe470195bc23095cdfe237b35f24e0436718ca6d320844811a55bfbb3befb6f00000000000000000000000000000000000000000000000005f9f4fa86b8b15a1387ff6556991f162dcd99d4752bbeded7e5f306b5abeec1d83e291fd387bc8700000000000000000000000000000000000000000000000000290334f34980000a2ba3647f6c3061cf88fe057bee5ae089004645f5c660802e47c1c5f4c0bf150000000000000000000000000000000000000000000000080f62f31ae992deff340f038bed5bf7bd990976869f0c5d7be3d3de17eb2328c922391314b1cd78a000000000000000000000000090a8b2e9afef2d2f0b2c5b60de6225dd41d70e32fd86d5a104ca901259ac4ba6f8542baa4798d1ad0cf405f356ae9a58038cd3a9000000000000000000000000000000000000000000000000000000000001dab4e281c7fbddba7c76a0d1227f92faaf35f329626e1d4689742e792bc9bbc3a59a000000000000000000000000000000000000000000000000000000000001dab47a1d8982db7449b61fd05a4da88c1988c63918fdb0ecde16b0cc9b3d940b2e4b000000000000000000000000000000000000000000000000000000000001daaf2f170f5acf9a9a20fbff27a10fadb19ac3f69bb4cbf9bef29d3301d2681d0c21000000000000000000000000000000000000000000000000000000000000006b418c13fcb615d4e98e77ec583e6fab70cb4c289e8a63ddf77409e904f21b39ef697066733a2f2f516d51726a4266374a42594d6477316a68366e5a4e706e315184f2204c782eddf23758beef8ee3fc6968148046d2bdc79022f3a443e816ef0e3631473943734d4869437453657779323273795848000000000000000000000001f0aa36249b6f86e438743643ff6c7749442a5f302b75ba4ba64c95db614c1a000000000000000000000000cf55389a4d1050f6a4cd04d58e93a12bfa24c280b3e75fdf7a0633602dc3ff20e64021622b0ec76e5e25bb4a24a75a51bbd72f3d000000000000000000000000000000000000000000000000000000000000000156a4e6f05f9da48ffabf7adb812fc139fee6c0e38186e347c94c982a83ecb4bd000000000000000000000000615b274fd1a404fe5f6c59f0b8310cc7f889a9cf6322221a731487570e52c59c6356b30ca6793138fb5057a78687ccc28343db550000000000000000000000000000000000000000000000000000000000000001e47ed93d4ee2a4413be008500eaa7c18d080ced0f1cbbe46f295f70a86a0bf4f000000000000000000000000000000000000000000000000000000000001dab2274106fb5a1dd25a012daee1a1ccd4ff6db087a4234e214a09e06f8a87d833a9000000000000000000000000000000000000000000000000000000000000000132219137078879d95ff985e03d465872cca065501f2811f1e6575b0fee0d5bd0000000000000000000000000000000000000000000000000000000000000006b5832730fe590ba3eb8139c479b82dc3f474f84bc10f6e1e000d30992358b5fc0000000000000000000000000000000000000000000000000000000000001dab12241d81014290ab4adc60f6df90ee000cf326aea602363870f7c66ad770346c5697066733a2f2f516d517a4c50597a73546239536a4a6d77447333444671487083dcc535156d005c386ce2f86005ee38ff25012a40c106d7a64d7ec851468d9f59624c784e3539636f63375437757931397233313900000000000000000000006bb21e8ed55fbd7460d9fed88404f77a54b62c47f1b15cc98b4301841acec7500000000000000000000000000000000000000000000000000000000000000001447708768b8f4bba7fc8beb2ec34581eb9045f8a99e953af24437160d89a5a54697066733a2f2f516d664564576175514b476f5a32386e6351504b63766b415121af26c1a16d25a2d304ab22ce3324e0f28168345053a0cf1cd94bea5cfc96e64271467a5a455a706f635363483943644e646845640000000000000000000000cb2e42f1580a4e5ef5819f18029c9742566b637a56c4083135fa11f5cfe3fce9000000000000000000000000000000000000000000000000000000000000006b5b666c0a2b32a203383c486c5eaa87297701e2ad393a461d5ec5d04e7972723900000000000000000000000000000000000000000000000000000000000000019f292e0e63bcd3a35b64595743e53b5b48a394eff1162eae0c1eb512460472b7697066733a2f2f516d5869396a576a6d677652524e4c614757747845354d3643d69e37be41e9344994575065af5376d964e49c7444375a7dbbd511e9f55e513869724754397948766e57666f7835363237775748360000000000000000000000f286d67dcc76d3aa235bcbc4cd423be38d05b2a08261b5b33e89d628193e2502000000000000000000000000000000000000000000000000000000000000006bbfca2069b2536d97a0f74cb941dba11f1ff937227bcb4740de8aef45b9144658000000000000000000000000000000000000000000000000000000000001dab34f421e6f3cf73ab338ffc938e965a4f4f0f0569fcb3e31c7cc4fec18764d7844000000000000000000000000000000000000000000000000000000000001daaf5826d6f848519571158dec0b34273d6c89d478cc16cb8158465069fd6a9d5cbd000000000000000000000000000000000000000000000000000000000001daad6fe9a71ee8e6a9c9bbadbb0bf46390660e7e4b9936268e65551dba249a4b63e600000000000000000000000008c03472c4a8fa35d79f43766a7c0ea38269fcea1d41d72b50504c018693e07bb235012f10d0208e392f050e6601c48ce7e34121000000000000000000000000615b274fd1a404fe5f6c59f0b8310cc7f889a9cf217df1cf42d1acb52803199663204d54943bf64ea21126d97fee3c276768727b697066733a2f2f516d64766e433752766d71596f5944475a5a31746572767262a74b5061fd800f1f448b66fb0b3069df4b886f0b70238d78357674f428708a1951396934354e5133644e766576397164737a786b720000000000000000000000154ebdc05d67a719e5c948ea28f75a4ba5890c2fbcd44ead9d13990780f3bf9b000000000000000000000000486e3cd0b5711b0c5120d774e3f269e8c6aab5e7ff95914b031210921491028388c1ea0c3bf85a6bd60fb1209cc35f35384b8ad0697066733a2f2f516d546a4532724573666a31656d46593762575a346242636ed3cb27b641da24b2240e89588ce7e16b3417c0bd2dbfda41dc0b1c80eaa68f9e62514b47376d6139787865655357316d7965416f4c00000000000000000000007cc0aa209011b08ea3bfd39d454a508bf1c16ee5e46c9acf230201bd9b1c942a000000000000000000000000000000000000000000000000000000000001dab23f650c2dff8ca48dbed79d4948743fb185a8202b1fd09b66fc94049c6ef643cb000000000000000000000000000000000000000000000000000000000000006b9912032952100ff1ef8f17f9bf8d113787774dc71bf335d3a7e107b5c422e14d000000000000000000000000000000000000000000000000000000000001dab195b1f2a3da752f8daa2129c546c7b6b2413cb79f52542d2b39be124bafb1a730000000000000000000000000000000000000000000000000000000000001dab354a46a435ff514bb414c3126a417648a793a5f6696895e0c69820302e40f557100000000000000000000000000000000000000000000000000000000000000019d133f372d432c8d1f0ca801c379e63a95162f215500da14c7e2477a3b74eabe0000000000000000000000000000000000000000000000000000000000000001705f4484f0725f2555c00892226b2aeca30a7a603c746177048ec6ab51909896000000000000000000000000ab56da5518e70688a1fe993c11e56497a8a207d2b30e53c914ebf102c98dacba176c4d57735d17de61979523b87f59deca63840d000000000000000000000000000000000000000000000000000000000000006b7d82f83e2738656d176e26c31ed37875929477dc6bc094c6667caf5607ecee48000000000000000000000000000000000000000000000000000000000000006be1f91535d4b33f4b27e55c14d04407922421b9da2e17bc575cdd7ba671c9f30f000000000000000000000000000000000000000000000000000000000001dab0db3776011bed59227e43025995f32b0662114a8f78216031465ee99bfce6eed8697066733a2f2f516d5466316779596442424531564868504c6a474578687976719f629886079feaeeb42a9e0205134254e6380941d075ffe26a2160207ddc8a316a716932513766766d323368693367427434416b00000000000000000000006e628674fe9bd2e64322cf7b94f8474db3fd7562617ebe4b4b8b1f898e203969000000000000000000000000000000000000000000000000000000000001daae57ce0d04fac4b6e42cac71810e4bcb951a4fed2dff6fbb1d42add4f33613058700000000000000000000000000000000000000000000000000000000000000015bf9841ea08265792a33ef68f0b767d87a60017e852b6866c2bf54e07028b753000000000000000000000000000000000000000000000000000000000000006b5d255b3819502bf5af779d9608516d47a9b877fc111f449654c91ddbf832c175000000000000000000000000000000000000000000000000000000000001d7623914410bebfa4bdee56e73a4a60bf999b0efd42d038cdd01aae334fda32250140000000000000000000000000000000000000000000000000000000000000002154db85c127f5d160acb53b5b153ef9510bf65e3eaf542772e14ff9a19a45edf000000000000000000000000000000000000000000000000000000000001dab0f0dba6a4b9b66fc6e88a172d4bbb344cff6a8fa2579dff31e3debdadf86ebfdb000000000000000000000000000000000000000000000000000000000001daae29be4473d26823213b234936c60b4d98d2de6564ac99c3faaa04b53a9b4b7b1e000000000000000000000000000000000000000000000000000000000001dab5ba585759fa154cdd0669bb285bd3e0953f4517a449807b3ca7842bc8c4d4d934000000000000000000000000000000000000000000000000000000000001daaefbf885fe6e9ac05ac5513891e24e8dcbce1c825405d4ef80eb7e1be7cd9a0e76000000000000000000000000000000000000000000000000000000000001daafd91ccda355f70aabafd7a3931bcd0d60992dd3fc3cb1264c7362b28975b0f201000000000000000000000000000000000000000000000000000000000001dab08d6986b664316ac0f26c48d0b03ee7d3af99a45cb643d9e8782d9bfdbfe2dda5000000000000000000000000000000000000000000000000000000000001dab1d216a3ac2241ec8d95178e85c54e381a7cc8ea97b3b6658135526e50f18b9db6000000000000000000000000000000000000000000000000000000000001dab27850f4000af6f820b967284a0b38270faae8504a0e4eb4c886cab73599f578a7000000000000000000000000000000000000000000000000000000000001dab36068b9d7204b8d6e2b0c61c7e596d5bc078467e1dd617b6df1fff7d715fb6065000000000000000000000000000000000000000000000000000000000001dab40793cd4db51c203bd3463359fd6b2ea97a9ead7904bc3a9dc1f0f41aac486b09000000000000000000000000000000000000000000000000000000000001dab54ddaec608ac0a67a9b79161d78c881747556e45539e61955fa5a3f653828dc5d00000000000000000000000049934f40b765cce756c708f8874170ac91c0eee9e05eda535268e76a318737e29faf8080fa0745c2cdd011c6029505e2a1d68ef2697066733a2f2f516d53345659524166524c3744774a4c46727973733842363513cd1f39d9b675d61c321eddc8aeb8a18a4be8fed6cfe73bb41bdb15afb51d8756556438695373684b55354a6364586a33366541640000000000000000000000960c21432e15d8f9083e89ec04ecea5d6064314b0d17ed3419b0cd1d46096fa200000000000000000000000000000000000000000000000000000000000000012ee4bd11690bb4b9e41f0f318724a6f724297422bbeda4218b2806dccdd328aa0000000000000000000000000000000000000000000000000074d007d42d04eecfb16b5513470ec1617e2fbed660c0e2292ac0ead57023de89b7dabb7b9b461200000000000000000000000000000000000000000000000000071afd498d00004e72f3304740c0a5099286cac6ca65a6b3afe53edf139ea55c515868e10aaa1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff759285d661b4a9286be9dbb7a2c4868f531eee4854b84b10b1dfe0148906df0000000000000000000000000000000000000000000000000000000000000000013bfe3db4e15cc11b3dad0f873880e6ab50687800b9b9a5113d5faedec9fc75960000000000000000000000000000000000000000000000000000000000000001a6a9cf1eea046ec92f28fe2793297346d939c7b5aff2ce8235e2c8feceb546a9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff245b5f50b6c75a2578cdbce4a282edd6ee4c9fe6f48b80baf0b77bd4576af32800000000000000000000000000000000000000000000000000038d7ea4c680002b462fbbad15533dd420fd0080d7171bc5aaf9d7d012eb09bb6773ce92b577a90000000000000000000000000000000000000000000000175407376ca75d7844257b363e7d0d55c54ab580f8d7d0b4f7c0c63c828b3a3560bb426e47bd124c840000000000000000000000000000000000000000000000015af1d78b58c4000023b5f931d07d4f0b943dc4ea514dd0f27c68e68d0df6a3ea2db4231e172461700000000000000000000000000000000000000000000000000805597d6796e76edc5b9b7e6cb2644ec9da21e8053385d16a8f1529e1148844d13905c28707564f0000000000000000000000000000000000000000000000000186cc6acd4b000021f66497e3b8ec695b91ee3401a8dfcf0fe73b6eebddce893a68060480b9dd6b0000000000000000000000000000000000000000000000083effb3774288be7f99ad8f5d76198e8f27ee9c6791b924cf81ca2fa35b1e11e67bd38c6392cc1ccb00000000000000000000000000000000000000000000000000000000000000014630da00c532bd8de7aa413e437ff1233c4dc007eebb718938e09c6402cd78bf0000000000000000000000000000000000000000000000000000000000000001b70712003d04fef9179708b8cf503ab833c9cb9c51315b5d5ab4220c676d8aa50000000000000000000000000000000000000000000000000000000000000001c8492e35fbd402e5e0300364f25f3503985564204ed2692e195cd29bad37d34b00000000000000000000000000000000000000000000000000000000000000010db94ea815f121e2810e096d4ed9c021af5bdfdd4fb69c7c8a14376267b191bb000000000000000000000000000000000000000000000000000000000000000122e8974e2b35aa50bd8d939b6f42d95b03693d3c5688c6bae34c07461aaa4085000000000000000000000000000000000000000000000000000000000000000173510ea76ff5bfff623082a04d1dd6168823d4ad400f118301128ea5987f43e1000000000000000000000000000000000000000000000000000000000000000108253b704153ecd592ef787984abfaa4de466bd2223b57d43b1002c540a5f273000000000000000000000000000000000000000000000000000b027736ea84965dbb0629e1540fa7e9819a1950af87e99ccde7bcf8335e1ba22eb81da95778c00000000000000000000000000000000000000000000000000000000000000001a70ac0b4c917cd9af5980aba2f38ac437c04c8d76137ef17e6723691f3833bb300000000000000006435934836a13c33f16ad3a8ed11e3908449624cf50b7793aed53590927076a800b19bf05606bad23435a5b3903681792bbf0aedd54c4ee70000000000000000000000000000000000000000000000000000000000000001fdc0387fea715fd361486e5fb86ee3412c004e756ff5e5f6900e37bbb53245bd00000000000000006435934836a13c33f16ad3a8ed11e3908449624cf50b7793e5a4a486ee5fa301fd6b7493141e94b662febf652a31d487554da78356fbc26b000000020000000064363dfb10a1db5d3a971cf1e565b28a86d5ce9e576a7b81e216912df44290b84fecab9f5959d5d4f3f17db1bc0d9e1028e75ff2e2c2d0db0000000000000000000000000000000000000000000000000000000000000001d1f0fb8ec50177e83b4c116142dee46a65480afedc3532fc5b84e1575e185a88ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5433d7f5840d783b98c4ce547cf65157167973a86859b01518732a44ce93f0c800000000000000000000000000000000000000000000000000000979b3d480175611f6a641908f05d0c5884cc4ebcfb6a64a2bf8e6fb5a00574e47dc0ce23b3b0000000000000000000000000000000000000000000000000000005f5d9ebcbb08b5b7009a9ae73898471d00154e1a86dfde83e192271b7d6a14fc73a4d6b33c0000000000000000000000000000000000000000000000000000000000000001622ea98de859bfd562a14874ecf7729d92ffe6571093221dcfe5d1943c7402810000000000000000000000000000000000000000000000000000000000000001db5e3734a8b796dc60773b7500ea60ad6c0ddf323cac766cb1abecd13c5ea43700000000000000000000000000000000000000000000000000000000000000012d55a6f5ece4f1c978fe6b9045db805e726d5ed423af7eee4115fbda839ba5dd0000000000000000000000000000000000000000000000000000000000000001d915358e3206c0e32908bb454e9a9ddbdc0de52497c16f7dc3a213413820a9f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff42aa56c450312dd3ed4e31ba04e986837abaaa2067e91c1c70ad21735fdf87a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff154ed46f5f69f73bd1f0a2c8a34d78496aa764f382663dd9d58939ba007c6e6d0000000000000000000000000000000000000000000000000000003a346804720045988c6cb0684e8354009f337ad2808955148601a7161f74e2f7e3a9577720000000000000000000000000000000000000000000000000000021a5c8bf74f2660681a983965ecc6d20f3b2c8fed925d3c9a341b37355a14e6d33d5a8facc680000000000000000000000000000000000000000000000000000000000000001d852c5c784e44e8d140f0f7f7eaa724f0db0e8740e1c214e9c3bce9b26fe976effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff974be7b513959fd455b764a3c21b5fde7b42f69645f371aa4c9645e5e78f3c8f0000000000000000000000000000000000000000000000000000000079aad093a1fbc865ddfaf0b8954f170e7034fd783e256d0946c68361b004720cdf462a02fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff43c5e9af77b21fd6add8046d1bcf5f5bd45408dbe1577a230f52c6ad4cb3d50fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd36160c3ace9179a08183d5e23eff874b90e3420b25ea1968fb77008082739300000000000000000000000000000000000000000000000000000009e1beb70b29ac836ed73b9bb2e021d44b0bd2e1677acd38481fd66d872fcdee12d43f7a8e000000000000000000000000000000000000000000000000000000000001ac90b332f712b93ff6b17d51f9f79a0a935a42c9232cbbe32e3cba4b1c63a569177f000000000000000000000000000000000000000000000000000000382ffe8c9dad1bf17c83c255269c9f63feb559c94bd93ccb1eaf6d691c8420d5dd7f852a41ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9a647aeecee771edc136f7e932bfae9db257ef8c8b2d252304d5e6964a1770c2000000000000000000000000000000000000000000000000000000000000000191e06a9399b708e8044b7a6e5b6bcf786ab69005e614ff394778ce4a08d20ef90000000000000000000000000000000000000000000000000000004c9dcba2ee50fa9c86b6316d4783161a922f7b3f20260ea10af9e087a20087718e0fbf5f780000000000000000000000000000000000000000000000000000000082c63275edf33b9b65a61ed1664e2b2fa4b05eaea73ec6b91347bc47cf9df128279a018f0000000000000000000000000000000000000000000000000000000000000001da34ae09177da263b07168355e12bcbc34379e1f432e70ee0fea8d3036b7c3c50000000000000000000000000000000000000000000000000000001b57b51bf8ec68f5289d5dd78dce9cf82cfe97348165a386da555da0f36cf0e47e27618057ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff976f218301b14856f9da925532ddabea8929c3dd9eca063b5ffba7ab06fa3cbb0000000000000000000000000000000000000000000000000000000000000001328a66f33490ad40a42eb8b7ea0537ebc9788b5194b95e92f859e498eb8ef73d00000000000000000000000000000000000000000000000000000026403c0e54220ad0c7753aa82ea9816c8af8d0dde9a181111acd4f0b1017166ead11efafbf0000000000000000000000000000000000000000000000000000006847e89169cdd503362c765037dfd77b4e73639d3af73a8cae506078a1af86746c6864874e0000000000000000000000000000000000000000000000000000001989e90aa4e119bcc6bcddd5140e32504510e1dcff59b9d1eaefd5d607a002b822e958f23fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5273391ddaea235ffb036e826068ccca0ac156762d098d2f757190f21f533070000000000000000000000000000000000000000000000000000000000006930f933626a73f0cb84760bb2e8f3b83cccf28c8544b4c83155bb4b1e85cb6ff285fffffffffffffffffffffffffffffffffffffffffffffffffffc7d38d5cca86c98b6c741e2c3e00534122d7ba8c5d078e9df105643172e94ebd205b804c6d11000000000000000000000000000000000000000000000000000000000000007d94b7526ba7f81a43d722dd299d3cca9dc8dbf4eb561ada0284ad054905f52cfa20000000000000000000000000000000000000000000000000000000fe9ef6e42ceb8cca94928c269cf8146940e0af9ccf1a5bc598e0c281639fe957260f08b620000000000000000000000008c4188fc25dc437021a7c0ed5457d9d0605edcde81b5086e5c239b37388b0e150bda92b23a5539fb2e815c9031e08c0db12b92e0000000000000000000000000000000000000000000000ba58e545582d4600000ce6b2f11b3ae72cbdcb257753abdf44dc7cea8a0e1945229fb0eaf14774b56f10000000000000000000000000000000000000000000000001bc16d674ec800002e91a5c679b9fa430ed0d01e3fa2a6a4a60edc49e4adce9d84bf867f47871d79ca94efed4891bbba446ba73a989209b8cfcc282dbfd42e9bb380b8cca056fbfdabcbd28c2557d9ed7a2e368dcaf1873a23636ccfecab01d56384cf2404c2e1a62ac251a3c64e8801e28b563ad5c82b9df8b98005914704bc5355fc9fe126bdb79d7bbe80a951f2b44e2c91cf0b0c5eda08d542e04c0ae198d8c5f228e29d2f70e1240ffc4816af172f8fec0e9b705088e34964dc000000000000000000000028c4b4a1271c67cd4233a0172f79336555ced41b93a309fb4296b9ba8182df881f29ab060bd02cd22e4042095679cfc5118098d46c00000000000000000000002873114f54fbb6e9a20816121128de3f1e5f5986f75fedd7a4d22293049c2a95040000000000000000000000006924da629a9fd4c6f0e0c903e3254cb4e79bde751aa1b77255084f5fd8f20a5015ea0fb0990771de124936ef4adb2e91442d21af6a696c73616e6465722e7a6b0000000000000000000000000000000000000018777c7c0f9bbcdfd3a23efcdce0415edd89d9f6b6aa1b2d3744a36b110892d6e0a7c7eb2f3f1b9f43cf927bfab2e8246db35e5765c6c8ac050224d53a7ab796afb2b95bf54049a5daeee501ebe016a4ba5e0ed96ad4ddaf3cdd603b0aea68a25369747379696e67746f6e672e7a6b00000000000000000000000000000000001c13ecd5760eafa3f0f53d3d2ab124696ef0032f58ebac150315e346e71b504a71000000000000000000000000c93d85b91dbe985400f41a81755ee842132848f7a1b6bd9ab8f6a220a487f732fa642d54948940cf27aa6ee1211756296e1288a900000000000000000000000013692c356dcb8532e48bde836de80a48b4215782321b955e9ba83fd1dd499b5eec1de0204af5c9dff7c04ec29c374941070361f7491237018f89a5e7ddd694cf913f6c520268df680000000000000000000000288888039f32c864c8743f59e505c33ef9b7a27ea93a8aa9b5603a9a11694fd09fc93d85b91dbe985400f41a81755ee842132848f70000000000000000000000284c8cba0fae28b7836fb7b3656a357a432c01081dcbb5c39c14019af07160c0506924da629a9fd4c6f0e0c903e3254cb4e79bde75000000000000000000000028c6e6cf1f22804dd91ce7ef3842c3ef6007f15cec932d39ebec58be02db08c45f000000000000000000000000fb7be4c6065920beae195e7fc1ce1982f8dbfe7f8e0d92b64f3cd20e39111ef8e9992be1fcae2e87b0fc4054cc18c829a0f7e98baf02d1249a76e1fcce695e9e7f4130d0661950c696d13c22068a90d2e7eccb02c406fcf6629531b8e342b4d23b0a9f904dfc7ef54a44d3cd97fa7386fe6a3d9c4f790f2289c46e45ed197bce7763c84591e1f223000000000000000000000028775cebf88977d079f93407da9f8225208109f5a5fad4f7edcd70a5900d9ff5506a303030302e7a6b00000000000000000000000000000000000000000000001086f9a1e2215dd7e1514a55494846b4f114344ce2bb9e1b86d97c342773c956127b7c156aa685986fd8f0ae95e2e8cf70ccce6b0dc04b10b509ba6dd09667344479e86e49f9b04626ef3fce564009dff0808ad450991aada3ed704c5d273d0d1d00000000000000000000000029ab060bd02cd22e4042095679cfc5118098d46ca884106b21f85a320e12378bc55e459de3c5444b100b065682f53d0d01415af9626f7963727970746f2e7a6b000000000000000000000000000000000000001832d0db2d901b97843fd4be1aaa8aacc2bb886a0fee1fd337fdbe2dd203af39861fae860de50a501e36b55482c26ee64036236b5ce30c166688706f9ebdd4d8a16d77303b71f19ec9606033b1c903ad9fc72daa7a45dd42ff977a67e107c122fae7f34476be06fcda2e32e13d498fbcb76c8708419b8d0b3debfddb129668cfc856ff8c840341bd46c601a0e9489a26887ee6e80fe04fca92e2d3b516f34c445d881f55d3e130ad793c205ad7fdfcfb66a5d573bfed4a09a95158baecfa300b24896b2337514081113a8fb38da80d1e2b1d7f44132c9db2d288f842475fad36020000000000000000000000000000000000000000000000000000004d75ee126571a463dee9e08c756395eeaa929f3ccf8432b3b390358839ca30c60d85525b09000000000000000000000000000000000000000000000000000000000000000144023035317343017fce6ee8c2dd42a1139d7bae95a0d665892d1d99a1e5c05d00000000000000000000000036f649e8c5418de722d9f5f56d0d74f22ecaeaedb09efed3e44795d803c98f845da16961af84184fe8e9955762c112c0b723a0f70000000000000000000000000000000000000000000000015af1d78b58c40000b500066e2ee083d0db3a86e508ea0200ba969e269f488f678957d1540a00c15300000000000000000000000000000000000000000000003045dafcdf1d9e7abf9793b949e040d3021bfc7c687daf29fcdc6ff7691a96b21c5efeccd811b077c50000000000000000000000000000000000000000000000000000000064363dfb0cb01fb508dc3371b61576fb6a7bc2d230065ffe426ff01c25fe9da81047946f0000000000000000000000000000000000000000000000083effb3774288be7ffc2fc554b15de579d344c1f6b46b6bce558a645bf2d771126253ade98432c876000000000000000000000000000000000000000000000125b7dd33e5dceec9f51d7f362e9600b52105ba43e7de5767597135efb92775a17c40e74d94abcd44de0000000000000000000000000000000000000000000000000000000064363dfb72dca86aa47226da664c099e1be87e2902b520e34b1fb7d20e438bedca79ceaa00000000000000000000000000000000000000000000000000000000000000013ac357bf78ae43d2af28e82136c96d08955e1eff9ea57e61d4a8cab6fc1f9f830000000000000000000000006c272d134ab69ce9d9fb7f6ac770fe815a3112eec4d6c4bddd08d475f222e71c9051f74cdc613466e890ea695b5e3eefaf63cd670000000000000000000000000000000000000000000000000000000064363dfb7cd447b95586077f3e7bd13ed6015a0b3289ce20901a9343cf7a0144f2593c4f00000000000000000000000000000000000000000000000002a2f8f1255067f456a27c1a7e4044b8c2ad74f81ac0210b4242ee993156026b1a536427229a39850000000000000000000000000000000000000000000000000000000064363dfb4216d7a62ad15dbd2cdf714d03a2222442788a63342a43ab29a4b2998a98d2c3000000000000000000000000000000000000000000047600ddf32e866e941e97c29c2cef0da413a9dab698abaabeeeb53449f9ade5818996d829124dfe8c79740000000000000000000000000000000000000000000000000000000064363dfb7bd97bf7f2a4098f035df1a863fdecc9f08ff09d42e26ad832e25693844e60b200000000000000000000000000000000000000a7d8c00000016d0000643be340ef6a46aeb1c25ea0e5b29e275b0efbafea888a37c9587c5e6313e0f41f5302460000000000000000000000000000000000000000000000000000000000000001336e880f4e64033dcea460c6d9d870dd534842b11d360ae61ca074866466e98e000000000000000000000000000000000000000000000000000000000000000153b2f1f237095a1fb82415f065a94131f1cde50da5bc43f1e0d54a2e9ccb03db00000000000000000000000000000000000000000000640af523345e9583681cbc195d46938d86add94c36b00f405c424721b908c1653acb8792af053e0111bb0000002b7e02316a0000000064363dfb0000000070ef63ca0000000861c46800c9110b4c010ff89cd6adf0a027b043f27f3578fd349fe1dff67220525c844f7c0000000000000000000000000000000000000000000000000000003b4cbcccba5a007dcb8f1a747edcdb80332dce1c36688ab003dbe3ece99a5bd690e46af9090000000000000000000000000000000000000000000000000000000532e6df44450fcd4cee5297e3eec1710f563804521e11855e0519a3722ba6277bcab76d3600000000000000000000000000000000000000000000000000000060a98236e6407b1cb76f0c066d9dc268315643c8b094d85cabf244ae4acd65d8845863162800000000000000000000000000000000000000000000000000000b53403d592c13e8e616ced7a28ca279ca4916a320cb159a6e4c477aae618bc6a6813445997e00000000000000000000000000000000000000000000000000000007b29d6b4291e4aa7e2aff6a7b35ca3d19f5565a53a2f2a54c307aa6784267196d5ad1a03e00000000000000000000000000000000000000000000000000000000000000013e1b1670ceea56c529315359efa41851259e2987f3818736d8c6f8ee4435db39000000000000000000000000000000000000000000000000000000000000000104981732c9d3a7ed59ecc5b54b2db70fb2a2df73d048950fa8ac47286abf78260000000000000000000000000000000000000000000000000000000014c419ed65d46e620597c33c77669fedf8b8d1216511fb70aad2638688780fcea9ef22b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefb67037e6ba08c269abed12af1302ec0d2588616dfdd5fb077435594a11a9d800000000000000000000000000000000000000000000000049bdb27b890cd2cd31197404ff35991fbadfc5844f1efa98d14b7a0bc4eb14feb693878cf610e32b0000000000000000000000000000000000000000000000000000000000000004a7ead4d564d2638d3e032f4ed63e5ccb6e55b8087397aa9f121591dfd61169ae00000000000000000000000029ab060bd02cd22e4042095679cfc5118098d46c1dbf57fb3e3b200b5131320214bb615bca30d742514079d60feb2c9fbc1b11be000000000000000000000000a37fe7e6447c204b5debf9489f2d5635ac078bd6bf1d592dea02aeb90da8fe647f4efd4e9a0d2c1208b783e8f456c88a94c7316c000000000000000000000000c93d85b91dbe985400f41a81755ee842132848f7f1e382d11af04eb8155b32b96ccff44f1c4a74797901d44d3ecebbc1fe0fd564000000000000000000000000a37fe7e6447c204b5debf9489f2d5635ac078bd644e3fbae2f29736fc6783945f08183d37979b7e7ab4a221ce10765c89ee0fb450000000000000000000000006924da629a9fd4c6f0e0c903e3254cb4e79bde753a5f1907cc7134f6d5f15d4e222c2164d048f977c697e166882c86bd50b726ce000000000000000000000000a37fe7e6447c204b5debf9489f2d5635ac078bd62a3d31574ebe1e0469e086ee84d38dfe6a5c49bb7de1782518c9d77caf451bca000000000000000000000000491237018f89a5e7ddd694cf913f6c520268df68b40f7cb544524f55c409aea5df5bf29d00e0dd0f3d91a089cd2531fe737b35d9000000000000000000000000a37fe7e6447c204b5debf9489f2d5635ac078bd69a7cf5b7099eeeece78e9eecba0ad3df33d0c4ab40effe50c3bba63e342aa14a0000000000000000000000004f790f2289c46e45ed197bce7763c84591e1f2237f2feb05dccc8e3baf8487f924cde31436df52447007c5d8f4559307f2755cf1000000000000000000000000a37fe7e6447c204b5debf9489f2d5635ac078bd67b0b5d35031bb62d6a4d3ed3261a22116c9327c7c4d94a98a7eddd7005ba6910000000000000000000000000e1240ffc4816af172f8fec0e9b705088e34964dc4734144681b608439e5b29200052b53f35ae90a859346023d0eeb8b615e5284d000000000000000000000000a37fe7e6447c204b5debf9489f2d5635ac078bd6457cebe2896ce6666d3082f4447b77bcc8a3df18b125b442204e3f38b6c570220000000000000000000000000000000000000000000000000000000000000001ad7f8765478f5c8de2847be4f24603eb1fb77fc6ad255178e292c7a32234279f00000000000000000000000000000000000000000000007423491c5aa4a88101794b0015bfdf4be933927f0d171fac631a213fb8d74c8aee9ef78d5f03e23eba000000000000000000000000000000000000000000000000000000008a061af3e55ed7b70c5cbce4c05319f5f1b3a7c66e1909f09823124b6572de26c41fc4de0000000000000000000000002a2f171bdb7b7ed6a93ee3302ed763d27e03f0c286d22a600d534dc699ac1a1c212746a585b8e9e265b0c16d38f7683e26fd46210000000000000000000000000000000000000000000000000000000000070955cc96280321f391858c82f55015bc685d21f25393bc0b96a1f9066faaa55d4ff700000000000000000000000028c1908f8af53340b5b2414721a40af7862c5e5afa09fdb7726f7164ef2031b63678dd1d9b46c6276a0f7ebcd2eb637580444320000000000000000000000000000000000000000000000000000000000000383c7a045e8b4eba83f1828cf238e2a1df5953497984f6f85533b239a6ffdceaef4c00000000000000000000000000000000000000000000000000000035ea628716f66be3274640e8c6e119915ba4e5c35286b762ac4cc953947f240c0cbd315d62000000000000000000000000000000000000000000000000000000000000383c700ac49dbeb225fb64775662b34fde5703ca1be10d08cfd26c4ffd7352ab58fc000000000000000000000000000000000000000000000000000000000000383c3631645b0ad9d2016669704d42b34ccd0ee037fc059d19abb0ba316caea8d57c000000000000000000000000000000000000000000000000000000000000000178ead8bb607e5b1ce85ea22070208b3e607a21820515ee5551f8caf1e89208180000000000000000000000000000000000000000000000000000035ae28f3384f3f760c0a811faaf40d41dd57e44e5de437dfd8c88abbb6e720d801043a7bce70000000000000000000000000000000000000000000000000000000000000001fb1b578bb65229c585aad09b2dacfc2cbd0cf818f5191a935b76d964c0252446000000000000000000000000000000000000000000000000000000000000383ca07b3b474538b2aa4d7ba8f35f8172c6d7fd3f36d85c686a2dea6f07f9695561000000000000000000000000000000000000000000000000000000008a02952fda02b9dafbfdf677ce9c3ae29cfe0ee0255319db90da6ae9062407da851ea0910000000000000000000000000000000000000000000000000000035ae15f67e0e98ed3efaa8fbcc6ce4cec2aa0333d4c9e2eb2294587c1dad96deeff9d800cec0000000000000000000000000000000000000000000000000000035ae15f67e06b31959cf77a38fb2f32293e4ef999cf2f3a2dfcef11f8b3e733efded1d9804a000000000000000000000000000000000000000000000000000000000000383cc688711fc0063ab0b0b354558d495b2872f707b3cc77770f949ff28f16e196c4000000000000000000000000000000000000000000000000000000008a061af32fce53d2ed05ae6c93f6609696b9110552701ca48d0af15146442d11e0f08d5700000000000000000000000000000000000000000000007423491c5aa4a881016da9126e31bbc4d2b8d71968efc219c372c28ab5c8d501f3ac96f420f6d78efb000000000000000000000000000000000000000000000000000000000000383cbae3dd70bc82a2ecec583970cc0af678e5961f9ec3fbd11f263539263edb2807000000000000000000000000000000000000000000000000000000000290cb03c667fa7f8c471f96615acaeae2c1dbcbff7ac37946f198ab010c75c40c1a36190000000000000000000000006ac625d107ceee595a35c464ed4c113cdbf20fede103eca9ee6ed87e24519f6722db2d0ce8fa7b995d30d2c2c5151a83f12ca3fd0000000000000000000000000000000000000000000000000000035ae27c9ab3fb081bb525c9c66877c9461cd0317b3e0ae7494e69a21cd83f0b6f5c483a84500000000000000000000000000000000000000000000000000000000283188669146c97aaab58459120487370ff4961138d852783f7d8a7a46cbcf005e064f2e700000000000000000000000000000000000000000000000000000035ea6287166956094754d6e421dae05ce6cf31c06600af75ba8337e74337b8b976eaecf847000000000000000000000000000000000000000000000074234e107f0108680813980fc2eac42418188c5687f5cc1e5bcf0ead80cae9e3a5d573d6cc2928d70800000000000000000000000000000000000000000000000000000000000000010010d44d3c8c7db2ef26a554d9aac519ac32f96ea1c17eeca8fcc5a4c5de8e210000000000000000000000000000000000000000000000000000035ae27c9ab3528f7e932cf1b5dac72ac6dc4067626ec848e8112f2b6fac0be0b77ed5e6e1e200000000000000000000000028a48ed0fffed9c574f35ea87ae50ef50cbe18b3435c2e53eae09f13265045b7b6220f3e310c7f025f02520db68c7fade2a0b802000000000000000000000000000000000000000000000000000000000290cb03a903f52d9b77df3d67471ae48c4846c9d25e8b97cd01d05e54efac9dd7335cb0000000000000000000000000000000000000000000000000000000000000383c1328dabbbd8db77f42fa541437e9bd11a7e7adf7a00a224ef1694ac64b7233c0000000000000000000000000000000000000000000000074234a7a33f70108d254962eaeeb85132e75ded7014b12a469deb3eeddf6067fc1eb69657c81c68bc600000000000000000000000000000000000000000000000000000000000000011c4b284244d50c12ac7617fb10f178b20cb112e54ba2598b4be40cf1202779a2000000000000000000000000000000000000000000000000000000000000006c4d7241644c801884f92bb9e3710b7f939a80845c7646bf95fbb64d3edb3b66b3000000000000000000000000a82749bcb138d6c0ae8e096e26c63ef42e74aef8b74de169571690d2cc90c666a1b89483ebfcdcd04f1af53a731b358200875b1a000000000000000000000000000000000000000000000000000000008a02952f7452372bcf78ca1b3440a6d97a7034a630d01e609e86c4fa605d125850dc4864000000000000000000000000000000000000000000000074234a7a33f70108d29168feeafcff9494f3b1cbb1a8ec8132d4c6d2d8373d1f5e9d376e33715c5cea0000000000000000000000000000000000000000000000000000ed935bbbe49acf4362fbe525d2657a21a61d85ff292cf5a2f6377467546af770c03005ec701100000000000000000000000000000000000000000000000000142fbfb79d2000e14e6a2beb6d6d07232ab12875d19eb9c2a5d5470ddc4e305925d203b246fe4b000000000000000000000000000000000000000000000000001476b081e800005f4a8dbf39f8b8d868041c8b75bda68ca51be057ece3cfb51c01c2d6ef2ef9250000000000000000000000000000000000000000000000000449ab4dc788000082a84780b4115e37ab86330a79a539e790da6ff8a6a5fe772cb47945abcf7bfc000000000000000000000000000000000000000000000000008f3ed38d580000d277388966326d8597752e47678aaf1d7d08e060c526adeca99d6f8dac1df2180000000000000000000000000000000000000000000000000008dac8663f6300ebed5cfb3eaea4e5c2516abec2b05d1e84b0e43f9efa1c97b5088656d4fac7f30000000000000000000000000000000000000000000000000731ba0dab90000033a858b6016f3327d8a2c78c10731712fe2a7d2cd2272fdeafefd173f2eb07f900000000000000000000000000000000000000000000000006646ee6ed377000943bf09f3a3027407e1be6a435ed90ed0a24d4acaf296e9fecaa79a7f7d623a70000000000000000000000000000000000000000000000000731ba0dab9000005a18065086a11de6a3fc65ddbf55a096a5dd884e4c5e65174833bc1dbdf6411600000000000000000000000000000000000000000000000006646ee6ed37700032b6346140eeafa17a38dbd1e82032f3a49e2135e0c48d2c73246b4f469118c60000000000000000000000000000000000000000000000000265e8af39300000b29ee8ea349b9298d9679000141a2c6ea2edec33e21c50b99c0c49640120573a000000000000000000000000000000000000000000000000001476b081e800003afa1dcd1e0b897312b05b3182004d9fb439da940bfd93871b6e167870d40c4f0000000000000000000000000000000000000000000000000066517289880000f24b6f9b8cd4aa4260ce8216513f41a41a6ddb3a785c3d59e17153da29e0b26f0000000000000000000000000000000000000000000000000031495668e1a08078203473274e6d079068ec03088b6994204a6f2c28aaf10e192394980b605f9e000000000000000000000000000000000000000000000000001476b081e80000377029ac0f40bc3b1fb8417c3b1913749f5c1f58029acbc87446e9aeba35a7f3000000000000000000000000000000000000000000000000001476b081e800003c5c66ffd2f5128c82c7f7ff3cc0d6a3f49f19c328c5f8c5b21c41fbd5701db40000000000000000000000000000000000000000000000000479f69c6ac0000003fe90a39af0b7f5090fd7418eebc3b568e7c1f8badaa8e0da026aaae0c1b23800000000000000000000000000000000000000000000000005728a99f65ca7007837d59fec13acb5a73d786a5f5087c6a449d0a34e678add10ffbdc4a35ffd5200000000000000000000000000000000000000000000000005728a99f65ca7009c8d3599ff77c190dd0f59ed2962f67e104463451daacc56ea5a3d50ab33d6c200000000000000000000000000000000000000000000000000e1c6c67f3680002047452c9bc170aab4073d31fd58aafabded2cdcaabcb99a7564d56962e8ea890000000000000000000000000000000000000000000000000449ab4dc7880000182734d5d350064423409f67be643cd08466afd6cf174820734e03f5caf2ad6c00000000000000000000000000000000000000000000000000044280bc34a200a93d4cf2f8f0ddc95882b7d198d61f03d4e70c5cbbc1d2040b7ff4549688049b00000000000000000000000000000000000000000000000000312edcdc2c5100a541f02f506acb32ed4b9074a05395406046a83585aff3567afaac02757b6ae500000000000000000000000000000000000000000000000007fe5cf2bea00000e7b141148e5bcd950e1a9cc0545034bf21a962b8432cb83026bfab4ee3e585a1000000000000000000000000000000000000000000000000001476b081e800007b62333ce03a624fcaac16d1210083d663ff4b27f476bf47cdb91580f941ea7b00000000000000000000000000000000000000000000000000142fbfb79d20006990bcdf5c403ac8af74286be8f9ba4bb1540da89e658dcc1c90689a6cde4fb40000000000000000000000000000000000000000000000011494299bc3a00000f0871a4bc721ed54fa123eaf0ec06b03d4d1f7f06c83dde6e544b5ab39e40a5c00000000000000000000000000000000000000000000000029f767fa68c80000e4e1bb0616cee12764f6d1b66a4a7c511e88619cc61ffc3aa0532607ff826b52000000000000000000000000000000000000000000000000048333c2dbc83080daeb764c4084fc16dff9e9daf2effdf303810613b4fb88eef33bf7db01eea89f000000000000000000000000000000000000000000000000006a4d9d45324200e2341fe2c4e83fd3f4baf6d20168fd2a515e643cb0ce6b5a34b796c78ebd62ee00000000000000000000000000000000000000000000000003470244ce280000ed46c467b5d42fec63cf77408f111729f160c582d80c12f7d2e343f69653c1e700000000000000000000000000000000000000000000000028c473a2cc300000846f3b8c38b8656c5c9dd17e75e800d8d2bce928d63358d0309d789f6fc724840000000000000000000000000000000000000000000000000265e8af39300000e85a72b3c98d16256b46fbdd6c2b38dffa7e2e65204dadb19d4e7c3ae580c4f20000000000000000000000000000000000000000000000000019945ca2620000e07b55ae6fa7ac8a7f1479fdcafdd658847307de69fa931edc08ffc3026d68b20000000000000000000000000000000000000000000000000479f69c6ac00000823863af36c5b192269ff2ea09de9c84a64228226222337440732a6f7c0948700000000000000000000000000000000000000000000000000066517289880000d0c6e07f96489aad02aa67d09b63225ac0a45804e52c3a5a65d0c771a65d9a6600000000000000000000000000000000000000000000000096eb55be0f000000a4237428331a440d2d2bc6b8157d43133c63c82423e1c637ecbd2672238abf6000000000000000000000000000000000000000000000000029f767fa68c800009600cfffdae22bd61f13511f6a6f025720d350b6da5d7b500c93829af3193233000000000000000000000000000000000000000000000000001476b081e800007b6b6b008272524289c98babc54251d67cfca6e47cdcec4cf5abc7356fc71e1200000000000000000000000000000000000000000000000007fe5cf2bea000009a606210db5a3aec4efb20472f3d94397705300b4a5de03d7cadd6f0e654610500000000000000000000000000000000000000000000000003716da573a3c5006b651e57ce215f28d11d41d94c5b2615389b991f5a0dbd4b6ac7e5b183b29e240000000000000000000000000000000000000000000000000ffcb9e57d40000004838a665bd8e93f060926a6f3dcbf4c09dd3d67c7d413264613c1b2f0fa761100000000000000000000000000000000000000000000000010ab850928330000a40eccac501f866cb12531573f6443bb00e2ef8e2254b22153ae77ee2c42f0a6000000000000000000000000000000000000000000000000001476b081e800004ac7dcf01022b60ce4561921f6e4ee89c3fd22a65cc8811b666be8fa853f6691000000000000000000000000000000000000000000000000001476b081e80000895b9525e6c5572f2db651167c2648e8445055ddceb8a52d63f1f8b854831653000000000000000000000000000000000000000000000000006a4d9d45324200d6f9272f823d460bf5b9155a61e59bf93eb7eaa3a779bd9e8d8f4dfc612bd48000000000000000000000000000000000000000000000000000cca2e5131000004fe5fedd65c9adecaeb35a6fe8beed34fd5611944b444193196dfb8e19f1532400000000000000000000000000000000000000000000000003716da573a3c500d610b76d137f82b07231cc32f3b3b546c7bbff3ef87cc85c6c8a0f8bd97dae00000000000000000000000000000000000000000000000000000a3b5840f40000893bf48adb1c25d46e6702fcc1c37cd0f7d91e6ebf3acbc14dee3d4d769a0e9300000000000000000000000000000000000000000000000003470244ce280000382cda9a5a521c7b3d4da194c3d21e2231866866192b8ac5de76c49a4af7e6d900000000000000000000000000000000000000000000000000044280bc34a2008a0eff893c6295616f3929ad1436ad95275964690d20de4f3ef422d8fdbdf84f000000000000000000000000000000000000000000000000008f3ed38d5800006c1a65030553cb64bcf15ec4a427d28edd208cb18ff1b48800bbcf17beb6e32400000000000000000000000000000000000000000000000000e1c6c67f36800022b86b0674647d5fbd6cda793ed6271f029423dff7a53bc6505690b3304a24ef00000000000000000000000000000000000000000000000028c473a2cc3000002d66c9884c3742512e59ef4a94b10c7e3b945929cfce46f1842f4d22376e2dc30000000000000000000000000000000000000000000000000008dac8663f63009832334c45f37d42d77c3ee43b69a51ef3fd784fefe7bec752bf38eada8b7742000000000000000000000000000000000000000000000000000a3b5840f40000ab4f36254d622ebae64d8115f77c2b5c186d1dd52a872799fa463e602ffc486900000000000000000000000000000000000000000000000002ea11e32ad500001c35181f375d81b83d2a584e6145ad8f8599d0a15d85f0408bf3f7b7bcd4309a00000000000000000000000000000000000000000000000096eb55be0f000000bb4173746ba713b30b708edd5a767093e58ba7552e35fb43562eeae5814a668700000000000000000000000000000000000000000000000000312edcdc2c5100ef6a01e04793478e5126665710382ea7d71dd5293cad59463b2f57b8b3817eaf00000000000000000000000000000000000000000000000010ab850928330000edc977314640762057dcd9fcec1f985221a1d09ea8b26066ad8f03bc6049b5ca0000000000000000000000000000000000000000000000011494299bc3a00000571ad3df0993c393824406d6206e1e1e2016164f4e260b493cf3b94eebcd85810000000000000000000000000000000000000000000000000031495668e1a080b192b4354f71c264720b5922994fb620790efc3613ec8ee769b8711351e0e9ae00000000000000000000000000000000000000000000000000cca2e51310000092ff94fd20220ec44975163aef565f9639fc951296a66b5571f3b8d5e2e9d739000000000000000000000000000000000000000000000000048333c2dbc830801fe3316e2f828e3a2731d75bb786a10cfb57b2ac6f1b6c4453fcf4094a9b1e5400000000000000000000000000000000000000000000000002ea11e32ad50000ea12a8a476441d437758dd76042c83c9812551378f1e332687bdbda4bff8b73f0000000000000000000000000000000000000000000000000ffcb9e57d4000001894503da320552e38151748fa7e092e2a20bcfb865d22b96f766a35c1537d370000000000000000000000000000000000000000000000000019945ca2620000cc63dd7ff2c9dba450953d981bac9b211204aadad5ed2a095da35a099ddda812000000020000000064363dfbcc7d0e5411dc82f9302e8ed2453d908bbc8670f38bbef1adad6f4a7c3933f57ce6f4655272b20da9f57acbb0760bd80fbcbe82b5000000000000000064356eb0f5912370c56c12ab5a074bfb4bc09f65ce20a78a1675c41371fd82beb25cdbfb09d1768cee0607aa9dffd7432fc81f962c5e1f380000000000000000000000000000000000000000000000000000000000000001897011b2ec9ee7d7ccab48b833d89e8f69fcefb2ce84092445de06e8a620653b00000000000000000000000000000000000000000000000000000000000000013542e7ea54ebbb98bec3c50987f3b59c88d05bca29c8be88870a141662757fe8000000020000000064363dfbbbc0e91ab31d766c649f4a958d70cbc6cac718781a8a0b8d4d73354bf2f1abf110590a06ed6fa81e549455ba4d04c149cce539d8000000000000000000000000000000000000000000000000000000000000000150f88c7890afaf00d847789882225e5375549b744218183ccee10cf3a55eb522000000000000000000000000000000000000000000000000000000000000014ce846dc707bfd4b3ca500e64a6f2a28cc3b16854d9b21e2eb39e16275914c566d00000000000000000000000047377e35ebf039fda09655a528e78de3d918c54ed7192783d73f1c4155e7a9ea3c727cfb57bfec0d1ba07f1520bf02bda65160ee0000000000000000000000000000000000000000000000000000000000a7d8c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bea4000004c400000000003cab3f000000000000000000000000000000000000000000000000000000000000000c0000000000752f90000000000000000000000000000000000000000000000000000000000000000f0000000000003567000000000000000000000000000000000000000000000000000000000000bac80000000000825f3600000000000000000000000000000000000000000000000000000000000000020000000000375275000000000000000000000000000000000000000000000000000000000000000c0000000000824ca2000000000000000000000000000000000000000000000000000000000000000d0000000000226cda000000000000000000000000000000000000000000000000000000000000000d000000000082641a00000000000000000000000000000000000000000000000000000000000000030000000000825cd2000000000000000000000000000000000000000000000000000000000000000500000000008248220000000000000000000000000000000000000000000000000000000000000008000000000000501500000000000000000000000000000000000000000000000000000000000000bf000000000022fecf000000000000000000000000000000000000000000000000000000000000000700000000008255ad0000000000000000000000000000000000000000000000000000000000000006000000000082584b00000000000000000000000000000000000000000000000000000000000000100000000000034014000000000000000000000000000000000000000000000000000000000000001200000000008211df0000000000000000000000000000000000000000000000000000000000000021000000000052983a0000000000000000000000000000000000000000000000000000000000000020000000000081dbb1000000000000000000000000000000000000000000000000000000000000000c000000000082641c0000000000000000000000000000000000000000000000000000000000000003000000000024e9c8000000000000000000000000000000000000000000000000000000000000001c000000000081dbb2000000000000000000000000000000000000000000000000000000000000000a000000000082584d000000000000000000000000000000000000000000000000000000000000000200000000003e25bb000000000000000000000000000000000000000000000000000000000000001300000000005c5c890000000000000000000000000000000000000000000000000000000000000030000000000058fc3100000000000000000000000000000000000000000000000000000000000000100000000000004125000000000000000000000000000000000000000000000000000000000000000700000000001b75530000000000000000000000000000000000000000000000000000000000000053000000000035940f0000000000000000000000000000000000000000000000000000000000000044000000000019d516000000000000000000000000000000000000000000000000000000000000001f000000000025f1f000000000000000000000000000000000000000000000000000000000000000250000000000825a88000000000000000000000000000000000000000000000000000000000000000e000000000026ea620000000000000000000000000000000000000000000000000000000000000036000000000081bdc0000000000000000000000000000000000000000000000000000000000000000300000000000b098c000000000000000000000000000000000000000000000000000000000000001400000000002e4e1f000000000000000000000000000000000000000000000000000000000000000a000000000043bf150000000000000000000000000000000000000000000000000000000000000006000000000060d74a000000000000000000000000000000000000000000000000000000000000001a00000000004bfdd300000000000000000000000000000000000000000000000000000000000000120000000000822ec200000000000000000000000000000000000000000000000000000000000000070000000000715d4f000000000000000000000000000000000000000000000000000000000000000f0000000000639380000000000000000000000000000000000000000000000000000000000000000d0000000000025e6b000000000000000000000000000000000000000000000000000000000000000f00000000007b55d300000000000000000000000000000000000000000000000000000000000000070000000000028ea0000000000000000000000000000000000000000000000000000000000000006e000000000006b1cc000000000000000000000000000000000000000000000000000000000000003f000000000014436a000000000000000000000000000000000000000000000000000000000000002400000000005e9f5400000000000000000000000000000000000000000000000000000000000000100000000000756bc40000000000000000000000000000000000000000000000000000000000000008000000000066183c000000000000000000000000000000000000000000000000000000000000001b00000000004e8701000000000000000000000000000000000000000000000000000000000000000a00000000006d41ea000000000000000000000000000000000000000000000000000000000000001900000000007d217500000000000000000000000000000000000000000000000000000000000000100000000000824ca7000000000000000000000000000000000000000000000000000000000000000d00000000002944bf0000000000000000000000000000000000000000000000000000000000000016000000000023114b000000000000000000000000000000000000000000000000000000000000000900000000002e485d000000000000000000000000000000000000000000000000000000000000000a0000000000230362000000000000000000000000000000000000000000000000000000000000000800000000004e769300000000000000000000000000000000000000000000000000000000000000080000000000213e9f000000000000000000000000000000000000000000000000000000000000001f000000000079a5660000000000000000000000000000000000000000000000000000000000000006000000000081e3de000000000000000000000000000000000000000000000000000000000000000f00000000002313b5000000000000000000000000000000000000000000000000000000000000000300000000000e6229000000000000000000000000000000000000000000000000000000000000002b0000000000501592000000000000000000000000000000000000000000000000000000000000000d000000000012d5df00000000000000000000000000000000000000000000000000000000000000150000000000145df70000000000000000000000000000000000000000000000000000000000000016000000000064ec090000000000000000000000000000000000000000000000000000000000000007000000000081b162000000000000000000000000000000000000000000000000000000000000000600000000008233bf0000000000000000000000000000000000000000000000000000000000000009000000000025724e000000000000000000000000000000000000000000000000000000000000000600000000003e824d00000000000000000000000000000000000000000000000000000000000000160000000000825cda0000000000000000000000000000000000000000000000000000000000000004000000000008f4a5000000000000000000000000000000000000000000000000000000000000003a000000000032ddbb00000000000000000000000000000000000000000000000000000000000000070000000000825853000000000000000000000000000000000000000000000000000000000000001300000000006340d600000000000000000000000000000000000000000000000000000000000000110000000000823ada0000000000000000000000000000000000000000000000000000000000000006000000000062c15b000000000000000000000000000000000000000000000000000000000000006b0000000000232c35000000000000000000000000000000000000000000000000000000000000000a000000000082641f000000000000000000000000000000000000000000000000000000000000000600000000007a08de000000000000000000000000000000000000000000000000000000000000000c0000000000124c20000000000000000000000000000000000000000000000000000000000000002a000000000082642000000000000000000000000000000000000000000000000000000000000000020000000000826421000000000000000000000000000000000000000000000000000000000000000200000000008264220000000000000000000000000000000000000000000000000000000000000006000000000057f03a000000000000000000000000000000000000000000000000000000000000001200000000005ae7d200000000000000000000000000000000000000000000000000000000000000030000000000077b09000000000000000000000000000000000000000000000000000000000000004f000000000011dbb00000000000000000000000000000000000000000000000000000000000000036000000000002bc0300000000000000000000000000000000000000000000000000000000000000cb000000000026ffe7000000000000000000000000000000000000000000000000000000000000001a0000000000574f070000000000000000000000000000000000000000000000000000000000000020000000000082458c0000000000000000000000000000000000000000000000000000000000000005000000000080b128000000000000000000000000000000000000000000000000000000000000000b0000000000825cdd00000000000000000000000000000000000000000000000000000000000000090000000000536799000000000000000000000000000000000000000000000000000000000000003f0000000000296721000000000000000000000000000000000000000000000000000000000000000e00000000005bc3280000000000000000000000000000000000000000000000000000000000000004000000000082642300000000000000000000000000000000000000000000000000000000000000040000000000825cde000000000000000000000000000000000000000000000000000000000000000f00000000007fb65d00000000000000000000000000000000000000000000000000000000000000130000000000301cb4000000000000000000000000000000000000000000000000000000000000000700000000007f980a000000000000000000000000000000000000000000000000000000000000001700000000005dc4e6000000000000000000000000000000000000000000000000000000000000000a00000000007b5805000000000000000000000000000000000000000000000000000000000000000700000000002d913a0000000000000000000000000000000000000000000000000000000000000011000000000009542200000000000000000000000000000001000000000000000000000000000000280000000000815fa0000000000000000000000000000000000000000000000000000000000000005d00000000001268ea00000000000000000000000000000000000000000000000000000000000000070000000000826192000000000000000000000000000000000000000000000000000000000000000500000000000163cf000000000000000000000000000000000000000000000000000000000000003c00000000006b3814000000000000000000000000000000000000000000000000000000000000000400000000001f4ede000000000000000000000000000000000000000000000000000000000000001900000000004bad69000000000000000000000000000000000000000000000000000000000000004b0000000000774216000000000000000000000000000000000000000000000000000000000000002600000000000043ae0000000000000000000000000000000000000000000000000000000000000022000000000000c6e0000000000000000000000000000000000000000000000000000000000000004400000000000a4683000000000000000000000000000000000000000000000000000000000000000b0000000000001fa30000000000000000000000000000000000000000000000000000000000026e6d00000000008207be000000000000000000000000000000000000000000000000000000000000000500000000007cb86e00000000000000000000000000000000000000000000000000000000000000040000000000825ce000000000000000000000000000000000000000000000000000000000000000030000000000826195000000000000000000000000000000000000000000000000000000000000000900000000004a0c4e000000000000000000000000000000000000000000000000000000000000000a00000000002255dc0000000000000000000000000000000000000000000000000000000000000013000000000006964d00000000000000000000000000000000000000000000000000000000000000ea00000000001ff13900000000000000000000000000000000000000000000000000000000000000170000000000529d40000000000000000000000000000000000000000000000000000000000000000a00000000007a78f2000000000000000000000000000000000000000000000000000000000000000f000000000012d5e800000000000000000000000000000000000000000000000000000000000000130000000000826197000000000000000000000000000000000000000000000000000000000000000500000000002702b600000000000000000000000000000000000000000000000000000000000000120000000000021d8a000000000000000000000000000000000000000000000000000000000000005a000000000032163f000000000000000000000000000000000000000000000000000000000000001f000000000014464500000000000000000000000000000000000000000000000000000000000000180000000000010084000000000000000000000000000000000000000000000000000000000000003800000000005634d5000000000000000000000000000000000000000000000000000000000000000d00000000007a07870000000000000000000000000000000000000000000000000000000000000007000000000076e2b70000000000000000000000000000000000000000000000000000000000000004000000000082514f00000000000000000000000000000000000000000000000000000000000000110000000000126a47000000000000000000000000000000000000000000000000000000000000000600000000002c3ca6000000000000000000000000000000000000000000000000000000000000003500000000005d4e95000000000000000000000000000000000000000000000000000000000000003b000000000082585b000000000000000000000000000000000000000000000000000000000000000800000000005e7cff0000000000000000000000000000000000000000000000000000000000000007000000000000502a00000000000000000000000000000000000000000000000000000000000000ba000000000052d2e5000000000000000000000000000000000000000000000000000000000000000d00000000001087e40000000000000000000000000000000000000000000000000000000000000051000000000076d3e7000000000000000000000000000000000000000000000000000000000000000c0000000000826198000000000000000000000000000000000000000000000000000000000000000400000000005c89a60000000000000000000000000000000000000000000000000000000000000010000000000067d9a0000000000000000000000000000000000000000000000000000000000000002a00000000004cf32e000000000000000000000000000000000000000000000000000000000000000400000000004230fb00000000000000000000000000000000000000000000000000000000000000280000000000824316000000000000000000000000000000000000000000000000000000000000001c00000000005f856f000000000000000000000000000000030000000000000000000000000000059f00000000003512c6000000000000000000000000000000000000000000000000000000000000000f000000000082619a0000000000000000000000000000000000000000000000000000000000000003000000000082619b00000000000000000000000000000000000000000000000000000000000000060000000000824cb1000000000000000000000000000000000000000000000000000000000000000c00000000005de9fe000000000000000000000000000000000000000000000000000000000000000a000000000029e881000000000000000000000000000000000000000000000000000000000000001700000000008253b200000000000000000000000000000000000000000000000000000000000000050000000000824f03000000000000000000000000000000000000000000000000000000000000000e00000000003b2bbf000000000000000000000000000000000000000000000000000000000000003200000000006395b90000000000000000000000000000000000000000000000000000000000000039000000000022908e000000000000000000000000000000000000000000000000000000000000000800000000004b08f6000000000000000000000000000000000000000000000000000000000000000a0000000000190376000000000000000000000000000000000000000000000000000000000000000a0000000000099812000000000000000000000000000000000000000000000000000000000000004b00000000000351f5000000000000000000000000000000000000000000000000000000000000001f00000000006d0d32000000000000000000000000000000000000000000000000000000000000000500000000007dc80200000000000000000000000000000000000000000000000000000000000000050000000000108c760000000000000000000000000000000000000000000000000000000000000020000000000082482d00000000000000000000000000000000000000000000000000000000000000070000000000001fa4000000000000000000000000000000000000000000000000000000000002751200000000000c68b80000000000000000000000000000000000000000000000000000000000000030000000000082585e000000000000000000000000000000000000000000000000000000000000000b00000000002aaece00000000000000000000000000000000000000000000000000000000000000160000000000131549000000000000000000000000000000000000000000000000000000000000000d0000000000019a0f00000000000000000000000000000000000000000000000000000000000000330000000000825a9d00000000000000000000000000000000000000000000000000000000000000060000000000825f430000000000000000000000000000000000000000000000000000000000000003000000000048a952000000000000000000000000000000000000000000000000000000000000001600000000007e18e200000000000000000000000000000000000000000000000000000000000000160000000000822c6a000000000000000000000000000000000000000000000000000000000000000a0000000000126a4f0000000000000000000000000000000000000000000000000000000000000006000000000082619c000000000000000000000000000000000000000000000000000000000000000400000000002e4b5000000000000000000000000000000000000000000000000000000000000000200000000000822a3d0000000000000000000000000000000000000000000000000000000000000009000000000081bb7c000000000000000000000000000000000000000000000000000000000000000a000000000082215e000000000000000000000000000000000000000000000000000000000000000400000000000c3fcb0000000000000000000000000000000000000000000000000000000000000067000000000081e1ce000000000000000000000000000000000000000000000000000000000000000f0000000000824f08000000000000000000000000000000000000000000000000000000000000000500000000007b66070000000000000000000000000000000000000000000000000000000000000009000000000047c716000000000000000000000000000000000000000000000000000000000000001a000000000000252700000000000000000000000000000000000000000000000000000000000058fe000000000081e412000000000000000000000000000000000000000000000000000000000000001000000000008240ae000000000000000000000000000000000000000000000000000000000000000f0000000000126a50000000000000000000000000000000000000000000000000000000000000000600000000006b1cd0000000000000000000000000000000000000000000000000000000000000000d000000000075695b0000000000000000000000000000000000000000000000000000000000000022000000000011dde60000000000000000000000000000000000000000000000000000000000000008000000000003052b000000000000000000000000000000000000000000000000000000000000002100000000007ce2bc000000000000000000000000000000000000000000000000000000000000000400000000001a540c000000000000000000000000000000000000000000000000000000000000000d00000000002cc4bf000000000000000000000000000000000000000000000000000000000000001600000000002f029d0000000000000000000000000000000000000000000000000000000000000011000000000008bfae000000000000000000000000000000000000000000000000000000000000008e000000000000d0cf000000000000000000000000000000000000000000000000000000000000004b00000000007a078b000000000000000000000000000000000000000000000000000000000000000700000000007e2822000000000000000000000000000000000000000000000000000000000000000f00000000005779bc000000000000000000000000000000000000000000000000000000000000001900000000002f9b44000000000000000000000000000000000000000000000000000000000000000800000000002db242000000000000000000000000000000000000000000000000000000000000004d000000000003f44c000000000000000000000000000000000000000000000000000000000000002300000000005de2b4000000000000000000000000000000000000000000000000000000000000000f00000000008261a0000000000000000000000000000000000000000000000000000000000000000800000000004b27a800000000000000000000000000000000000000000000000000000000000000210000000000006f740000000000000000000000000000000000000000000000000000000000000055000000000075f4ce0000000000000000000000000000000000000000000000000000000000000007000000000043bb5300000000000000000000000000000000000000000000000000000000000002280000000000820a5f000000000000000000000000000000000000000000000000000000000000000700000000004e3f9c00000000000000000000000000000000000000000000000000000000000000090000000000825ce600000000000000000000000000000000000000000000000000000000000000090000000000575d75000000000000000000000000000000000000000000000000000000000000000c000000000028acc4000000000000000000000000000000000000000000000000000000000000003500000000008253b40000000000000000000000000000000000000000000000000000000000000013000000000071857c0000000000000000000000000000000000000000000000000000000000000004000000000037d7e7000000000000000000000000000000000000000000000000000000000000000600000000007b30a50000000000000000000000000000000000000000000000000000000000000002000000000039edae000000000000000000000000000000000000000000000000000000000000000500000000005bfaea000000000000000000000000000000000000000000000000000000000000000700000000002aaed300000000000000000000000000000000000000000000000000000000000000180000000000513a09000000000000000000000000000000000000000000000000000000000000000b00000000007b55e20000000000000000000000000000000000000000000000000000000000000007000000000082515a00000000000000000000000000000000000000000000000000000000000000130000000000825aa4000000000000000000000000000000000000000000000000000000000000000d0000000000824cb4000000000000000000000000000000000000000000000000000000000000000d000000000081e41f000000000000000000000000000000000000000000000000000000000000000f0000000000251142000000000000000000000000000000000000000000000000000000000000003600000000000793e10000000000000000000000000000000000000000000000000000000000004a0c00000000008261a300000000000000000000000000000000000000000000000000000000000000040000000000059d2c00000000000000000000000000000000000000000000000000000000000000090000000000825ce700000000000000000000000000000000000000000000000000000000000000070000000000821ba3000000000000000000000000000000000000000000000000000000000000000900000000006dae180000000000000000000000000000000000000000000000000000000000000021000000000000038d0000000000000000000000000000000000000000000000000000000000005296000000000052f5bc000000000000000000000000000000000000000000000000000000000000001000000000000d932d000000000000000000000000000000000000000000000000000000000000001900000000008261a40000000000000000000000000000000000000000000000000000000000000005000000000001315200000000000000000000000000000000000000000000000000000000000000230000000000210d5e000000000000000000000000000000000000000000000000000000000000000200000000008255c6000000000000000000000000000000000000000000000000000000000000000a00000000002dcaf8000000000000000000000000000000000000000000000000000000000000000300000000008255c7000000000000000000000000000000000000000000000000000000000000001200000000008261a50000000000000000000000000000000000000000000000000000000000000006000000000045ef66000000000000000000000000000000000000000000000000000000000000000a00000000003df8b2000000000000000000000000000000000000000000000000000000000000000c00000000007f7a72000000000000000000000000000000000000000000000000000000000000001900000000007a078f0000000000000000000000000000000000000000000000000000000000000007000000000014e56b000000000000000000000000000000000000000000000000000000000000002000000000001e99580000000000000000000000000000000000000000000000000000000000000021000000000055b5eb000000000000000000000000000000000000000000000000000000000000000300000000006927b000000000000000000000000000000000000000000000000000000000000000040000000000821202000000000000000000000000000000000000000000000000000000000000000300000000000412a800000000000000000000000000000000000000000000000000000000000000440000000000824cb6000000000000000000000000000000000000000000000000000000000000000d00000000000b06c90000000000000000000000000000000000000000000000000000000000000014000000000043775e000000000000000000000000000000000000000000000000000000000000000d0000000000825f4d000000000000000000000000000000000000000000000000000000000000000500000000001df736000000000000000000000000000000000000000000000000000000000000002800000000002ca8b5000000000000000000000000000000000000000000000000000000000000001000000000000a774c0000000000000000000000000000000000000000000000000000000000000034000000000000002f000000000000000000000000000000000000000000000dd5c05263e62cd67458000000000020dfe90000000000000000000000000000000000000000000000000289fef3a8e5c9a1000000000075244400000000000000000000000000000000000000000000000000261710b55d180a00000000000026a60000000000000000000000000000000000000000000000000c4973000968ba9200000000007e2d34000000000000000000000000000000000000000000000000001b7fc42d9f37ae000000000010fa71000000000000000000000000000000000000000000000000003f2e11b22ff1a50000000000374dc300000000000000000000000000000000000000000000000000521e5d257ca3e00000000000824329000000000000000000000000000000000000000000000000004095d45c5a584b000000000022658c0000000000000000000000000000000000000000000000000048b89f4fb1932400000000008261a70000000000000000000000000000000000000000000000000299dfbba42fe8620000000000825aaa0000000000000000000000000000000000000000000000000146e8a1b746183c000000000082459e0000000000000000000000000000000000000000000000000003c7d6491a6ae40000000000004848000000000000000000000000000000000000000000000000000bbf291a18cbf2000000000022ff070000000000000000000000000000000000000000000000000732c087bcebb47b00000000007d94880000000000000000000000000000000000000000000000000054af43f880efa4000000000081fb1800000000000000000000000000000000000000000000000000791dbe8698d60d0000000000032d5000000000000000000000000000000000000000000000000000de81390662505600000000005cb57e000000000000000000000000000000000000000000000000018b591a84c813d8000000000052939c000000000000000000000000000000000000000000000000006ed65bfb18c8f500000000008264260000000000000000000000000000000000000000000000000001138837d67057000000000081d20c00000000000000000000000000000000000000000000000006f5abd5f3a124740000000000323a900000000000000000000000000000000000000000000000000299307caa12730000000000008261aa000000000000000000000000000000000000000000000000044fa71ecf38709c000000000024bf26000000000000000000000000000000000000000000000000006f77cb3a947e35000000000081d20d0000000000000000000000000000000000000000000000000023f574499af807000000000060578f000000000000000000000000000000000000000000000000005c0e5447ade21700000000001a112f000000000000000000000000000000000000000000000000004c23f55466404a00000000005c4c3a00000000000000000000000000000000000000000000000000f8c73e6d5ec6b8000000000058e4aa000000000000000000000000000000000000000000000000001c8acb6935f7ce0000000000042cc3000000000000000000000000000000000000000000000000005c5030c84a678500000000008225340000000000000000000000000000000000000000000000000061ace89a58a2d00000000000003f000000000000000000000000000000000000000000000000000005d7c6cea0399200000000001acb6b0000000000000000000000000000000000000000000000000584ee826687c2bc0000000000358e2d00000000000000000000000000000000000000000000000003549610044d96a5000000000019d27900000000000000000000000000000000000000000000000001304c0e5e090f050000000000175b4a00000000000000000000000000000000000000000000000000f5451f3c2ccb32000000000025efb40000000000000000000000000000000000000000000000000125783ba897c365000000000081ecec00000000000000000000000000000000000000000000000000bb277d2bbd07bb000000000013880600000000000000000000000000000000000000000000000001ae58857a28e385000000000081b1750000000000000000000000000000000000000000000000000012dfeca48afd3e000000000003e9b400000000000000000000000000000000000000000000001d4139fcd0d9be67b000000000000b047600000000000000000000000000000000000000000000000003c28752fa83cef70000000000826427000000000000000000000000000000000000000000000000001cfac37692aa1600000000002e4b6c00000000000000000000000000000000000000000000000000f3ba0b4493ef8d0000000000436f8c0000000000000000000000000000000000000000000000000022d23716759080000000000060d5f50000000000000000000000000000000000000000000000000024d71c5db951f100000000004bc66b0000000000000000000000000000000000000000000000000020716415d775590000000000822c7f000000000000000000000000000000000000000000000000057292e43a9f373d0000000000714a85000000000000000000000000000000000000000000000000001f1a4490c239a7000000000068ace20000000000000000000000000000000000000000000000000079f6f87ec6383f0000000000638ef3000000000000000000000000000000000000000000000000009d8b70b32714310000000000025c730000000000000000000000000000000000000000000000000115d1b73b05749800000000007aee54000000000000000000000000000000000000000000000000001db56b86a99d80000000000061799c0000000000000000000000000000000000000000000000000ef884545c8090f40000000000002062000000000000000000000000000000000000000000000003f943784f5bc96775000000000006af6300000000000000000000000000000000000000000000000002d55ce881b73a0400000000000a0edc0000000000000000000000000000000000000000000000000001282fd6e01dca00000000005cdd4100000000000000000000000000000000000000000000000000981b0f869634310000000000753989000000000000000000000000000000000000000000000000034b48c3073476ae00000000000b94f3000000000000000000000000000000000000000000000000001337b6ddad4aaf00000000004e83210000000000000000000000000000000000000000000000000123f7cb374984eb00000000006ca7d10000000000000000000000000000000000000000000000000af71f870d7a1fc300000000007ced6e00000000000000000000000000000000000000000000000000f8284167fb5a88000000000082432c0000000000000000000000000000000000000000000000000040a714e5e67c430000000000139edb00000000000000000000000000000000000000000000000000438e0aa9b5fe6d0000000000230f090000000000000000000000000000000000000000000000000687effda6131f1f00000000002df4a4000000000000000000000000000000000000000000000000005bd3280b16224d000000000023038e00000000000000000000000000000000000000000000000006bd3150f73314ed00000000004e60540000000000000000000000000000000000000000000000000307eafbd78df55f0000000000212bec00000000000000000000000000000000000000000000000000470409151844f6000000000050911b000000000000000000000000000000000000000000000000006c6a8c03ce467500000000006c1ce5000000000000000000000000000000000000000000000000002aa3d1ca3788f6000000000081defe000000000000000000000000000000000000000000000000003709e49ff3606000000000001519f1000000000000000000000000000000000000000000000000000a0f45aa708ca9000000000000255600000000000000000000000000000000000000000000001e54b773954a7adf5e00000000000e5564000000000000000000000000000000000000000000000000000e324a4001b99c0000000000500b57000000000000000000000000000000000000000000000000019cf12461da4d20000000000012b68e000000000000000000000000000000000000000000000000001ea21508d318b6000000000009b5a1000000000000000000000000000000000000000000000000003f3e3da2a0c9c60000000000630f1f0000000000000000000000000000000000000000000000000040280f4027db54000000000082642a0000000000000000000000000000000000000000000000000001138837d67057000000000081a9870000000000000000000000000000000000000000000000000016c5533eccfd2b0000000000822ee600000000000000000000000000000000000000000000000000191a33e7b75e5a00000000002567be00000000000000000000000000000000000000000000000000e204e8fc787b98000000000000214d000000000000000000000000000000000000000000000292a6dafe2ec4c484a300000000004ecda800000000000000000000000000000000000000000000000001adc09ff8938cae00000000003e54720000000000000000000000000000000000000000000000000009dd8a44ee02c600000000007d92370000000000000000000000000000000000000000000000000021038f788d20f6000000000008ba1f00000000000000000000000000000000000000000000000003dce2989577495000000000002d33d600000000000000000000000000000000000000000000000000239e0ff1773cb900000000008253cd000000000000000000000000000000000000000000000000067ff4dfa61d416c0000000000825cee000000000000000000000000000000000000000000000000017b9fe8ac20a5d7000000000082642b00000000000000000000000000000000000000000000000000ce34db63283a8800000000006339bb0000000000000000000000000000000000000000000000000221e0a8fe20ee33000000000080d221000000000000000000000000000000000000000000000000007e6265f5102c1c000000000062bf270000000000000000000000000000000000000000000000000563aefd37e2c4d40000000000007a1c0000000000000000000000000000000000000000000000120728e35fe44a9a26000000000023278d0000000000000000000000000000000000000000000000000004e6fffe7be2a300000000008255d300000000000000000000000000000000000000000000000000416bc9ed4c6d0b00000000007a057d0000000000000000000000000000000000000000000000000179f6eceb00bd2400000000001247a00000000000000000000000000000000000000000000000000016870a9b7796960000000000825ab400000000000000000000000000000000000000000000000000031f3d897e3e270000000000825ab60000000000000000000000000000000000000000000000000015dac9ae88ec500000000000821baf0000000000000000000000000000000000000000000000001c711df07561c7c4000000000082642e00000000000000000000000000000000000000000000000005779b273fe53c32000000000057eb83000000000000000000000000000000000000000000000000000054b0244cf3000000000000136c4b0000000000000000000000000000000000000000000000000bc7bd93fd1c6920000000000002111600000000000000000000000000000000000000000000000001cb45f3630910ae00000000001067e60000000000000000000000000000000000000000000000000025e722d888177e000000000002b8020000000000000000000000000000000000000000000000000eea192d5688ed4c0000000000210682000000000000000000000000000000000000000000000000001e69a1fd66405a0000000000574cfc000000000000000000000000000000000000000000000000001d01ee00793dd900000000007e68e60000000000000000000000000000000000000000000000000019e688d9801f2700000000007b6f85000000000000000000000000000000000000000000000000000523e0b2ef0cd4000000000082587a000000000000000000000000000000000000000000000000082ff988238ed6e5000000000053655e000000000000000000000000000000000000000000000000019d0cb159707c45000000000028bbfb0000000000000000000000000000000000000000000000000045acf85aa5abf80000000000459eaf000000000000000000000000000000000000000000000000000a3ba277ef03c700000000008261b400000000000000000000000000000000000000000000000000873d231eed1fcc000000000082587b0000000000000000000000000000000000000000000000000193c7025a914c010000000000046bc90000000000000000000000000000000000000000000000001b5e60a8f9be4cbc00000000007fb67a00000000000000000000000000000000000000000000000000053acfae3cef4b000000000002f28f00000000000000000000000000000000000000000000000000c632c8f0ce175b0000000000300f94000000000000000000000000000000000000000000000000000b5696c2665e9400000000007f884e00000000000000000000000000000000000000000000000000072fedb062e38000000000005d2503000000000000000000000000000000000000000000000000003bb5cf507d1ae700000000006913260000000000000000000000000000000000000000000000000012599c692b2fc000000000007aee7c000000000000000000000000000000000000000000000000001cc2e505e39a80000000000066c3e400000000000000000000000000000000000000000000000001ddbe4470b36820000000000010c4200000000000000000000000000000000000000000000000000039ac370e5dcd12000000000008f004000000000000000000000000000000000000000000000000003deca4c3db5229000000000082642f0000000000000000000000000000000000000000000000000001138837d670570000000000814f6c0000000000000000000000000000000000000000000000000086d6fadcd618790000000000125ba000000000000000000000000000000000000000000000000000518214f781843900000000000d24ef000000000000000000000000000000000000000000000000006b9f395e2cba350000000000824cc600000000000000000000000000000000000000000000000000346cc05becdede0000000000014c26000000000000000000000000000000000000000000000000003a77d1dbac4bd70000000000421d650000000000000000000000000000000000000000000000000018918507df067600000000001ee1bd000000000000000000000000000000000000000000000000001b443f2d03310000000000004b73e6000000000000000000000000000000000000000000000000000a6a2a277891b10000000000825cf30000000000000000000000000000000000000000000000004d27098c9af7f3c30000000000773e96000000000000000000000000000000000000000000000000002113428add9b8000000000000035c600000000000000000000000000000000000000000000000000155b6c409ded88000000000000c1960000000000000000000000000000000000000000000000000018c07c83ac24d5000000000002130c000000000000000000000000000000000000000000000000046f3bf1a5d7709f000000000008734f0000000000000000000000000000000000000000000000000005853c4a2073040000000000001fa50000000000000000000000000000000000000000000000047eb310d1ea4fae1400000000007b581e00000000000000000000000000000000000000000000000000558ae99f3ebe5f00000000007cb882000000000000000000000000000000000000000000000000001116854a4f7534000000000082433900000000000000000000000000000000000000000000000000190c8402fdc868000000000081f60300000000000000000000000000000000000000000000000000411e256a53f1370000000000498efe000000000000000000000000000000000000000000000000016ebcd546b147d40000000000028ab60000000000000000000000000000000000000000000000000028580e5ef1c93000000000000691ad0000000000000000000000000000000000000000000000000c9a2aec3641a8cd000000000081bde600000000000000000000000000000000000000000000000000ab20308653559000000000001ff167000000000000000000000000000000000000000000000000008fe92af19ffa8100000000000b215d000000000000000000000000000000000000000000000000004a773d8479c87c00000000004d4cf7000000000000000000000000000000000000000000000000003d5680e74baf8800000000007a6e1e000000000000000000000000000000000000000000000000004fa7a6c2dcb5c3000000000005b42d000000000000000000000000000000000000000000000000004333d8ebd1872100000000007d842e0000000000000000000000000000000000000000000000000005c6354f021954000000000013620d000000000000000000000000000000000000000000000000000b43deacff99890000000000021bfb00000000000000000000000000000000000000000000000002152a30b128a7b600000000008264310000000000000000000000000000000000000000000000000001138837d67057000000000031148300000000000000000000000000000000000000000000000000088589c07b390000000000008264320000000000000000000000000000000000000000000000000010c2faba43f98500000000001440fc000000000000000000000000000000000000000000000000020f6a8c0227ec9c000000000000f86d0000000000000000000000000000000000000000000000000001c82ee58a83350000000000563117000000000000000000000000000000000000000000000000004c092a00ec20860000000000285a98000000000000000000000000000000000000000000000000008702d0d129080400000000006b0abf0000000000000000000000000000000000000000000000000019fa67cb80061a000000000001e66200000000000000000000000000000000000000000000000000b113f3712701cb0000000000824ab1000000000000000000000000000000000000000000000000001d67c7c85b02680000000000125dcc0000000000000000000000000000000000000000000000000053bfd8dcf5159b0000000000002a3b000000000000000000000000000000000000000000000009aa621e5ca3114ea000000000002b42bf0000000000000000000000000000000000000000000000000054c8bb8a9b268600000000005d43ef000000000000000000000000000000000000000000000000017bc4b5ba09ef2f00000000008245ae00000000000000000000000000000000000000000000000000235552d025f5f100000000005e7b13000000000000000000000000000000000000000000000000000f43a2e1a353000000000000004f7e00000000000000000000000000000000000000000000000002109e20ed74c87f000000000052cb8000000000000000000000000000000000000000000000000001fffb7323b9a12300000000000313d9000000000000000000000000000000000000000000000000002b73f694d86e40000000000076c9be0000000000000000000000000000000000000000000000000002fd36a8b152280000000000825f5c00000000000000000000000000000000000000000000000000667691e20fc60f00000000005c70610000000000000000000000000000000000000000000000000071d331e35986c0000000000067c57b000000000000000000000000000000000000000000000000002cb264839f558000000000004ce6bd0000000000000000000000000000000000000000000000000002b3d23e3597550000000000422cf00000000000000000000000000000000000000000000000000017bcc54cc9c6fc0000000000823c230000000000000000000000000000000000000000000000000048bf4c3dfbbb5500000000005f3a33000000000000000000000000000000000000000000000000017e46d23503f83d00000000003510aa0000000000000000000000000000000000000000000000000014692d4340025d00000000007f6b2000000000000000000000000000000000000000000000000000056b6c9bffc57a00000000008255e4000000000000000000000000000000000000000000000000000e23e115c8c1ae000000000082433b000000000000000000000000000000000000000000000000002006318e1e4ecb00000000005d72de0000000000000000000000000000000000000000000000000029af78df0fad6d00000000002693ed00000000000000000000000000000000000000000000000000134d551c950e25000000000082643600000000000000000000000000000000000000000000000000adda50d4fb766d0000000000824f2100000000000000000000000000000000000000000000000000a95293759ad9660000000000824ab40000000000000000000000000000000000000000000000000075600edbeba87d000000000035f8c000000000000000000000000000000000000000000000000001273a0f1ee9fdb100000000006371980000000000000000000000000000000000000000000000000a1770ad54af71990000000000225e66000000000000000000000000000000000000000000000000002acf5a995db05600000000004af5ce000000000000000000000000000000000000000000000000004430b2cb531b7500000000001903a9000000000000000000000000000000000000000000000000002dc9edfbd9dc27000000000009670b00000000000000000000000000000000000000000000000000c281098d4f522300000000001fd624000000000000000000000000000000000000000000000000009d27622bf7b3f5000000000001f3c900000000000000000000000000000000000000000000000000629f9f8d079f5e00000000006951b8000000000000000000000000000000000000000000000000000cb77b0c197ee000000000008225460000000000000000000000000000000000000000000000000b1c1c14fc61bd3400000000007a66d100000000000000000000000000000000000000000000000002b4a966adc03f400000000000108825000000000000000000000000000000000000000000000000021d021f2115f687000000000073ce0f000000000000000000000000000000000000000000000000003f64a688db435b0000000000256a470000000000000000000000000000000000000000000000000182933c3c676d480000000000001e0b00000000000000000000000000000000000000000000000a685df5f30e5927060000000000823c2400000000000000000000000000000000000000000000000005d3d306a027307000000000000c65fe0000000000000000000000000000000000000000000000000075cd24502eb33c00000000008255e5000000000000000000000000000000000000000000000000515e336ed9a7f81100000000008253dc000000000000000000000000000000000000000000000000014061de709aa4e30000000000024182000000000000000000000000000000000000000000000000001ac683d1b6fd5200000000001312e400000000000000000000000000000000000000000000000000565e1d3dee59fe00000000007b4531000000000000000000000000000000000000000000000000000c2c32a512fd860000000000825cf6000000000000000000000000000000000000000000000000006309dc5ce017800000000000010cd8000000000000000000000000000000000000000000000000017863ff18a298ef00000000008258890000000000000000000000000000000000000000000000000004f257f856e9b40000000000825172000000000000000000000000000000000000000000000000000813ab87a8b08200000000004894230000000000000000000000000000000000000000000000000258ecded62853650000000000550ca900000000000000000000000000000000000000000000000000181d32ae40c03a000000000082254900000000000000000000000000000000000000000000000000610c7998c2608e0000000000125dd30000000000000000000000000000000000000000000000000053bfa73a39b9d30000000000825f5d0000000000000000000000000000000000000000000000000055341d8ab9f3a400000000002ea0c200000000000000000000000000000000000000000000000000be3ad056017d3d00000000002e42f6000000000000000000000000000000000000000000000000000317a809b48d7a000000000081f431000000000000000000000000000000000000000000000000000390686ab8109a000000000081b93200000000000000000000000000000000000000000000000000004a6b99a9d4000000000000826437000000000000000000000000000000000000000000000000005f224902d20816000000000081d962000000000000000000000000000000000000000000000000004af4f9c403bc6e00000000000c3af9000000000000000000000000000000000000000000000000005578d4cc1cae800000000000183dc10000000000000000000000000000000000000000000000000304530312b05406000000000081dbd90000000000000000000000000000000000000000000000000037d0c95703fede0000000000757521000000000000000000000000000000000000000000000000008fecc9520ffbb900000000007b650f000000000000000000000000000000000000000000000000001f76d5522f570b000000000047bfbc0000000000000000000000000000000000000000000000000069877390ecf67d00000000000020f3000000000000000000000000000000000000000000000000340f6b0c3245e36a000000000081e1e90000000000000000000000000000000000000000000000000036eab25e70ac7500000000007ed7230000000000000000000000000000000000000000000000000022d975e1dcacb40000000000125bb40000000000000000000000000000000000000000000000000053b4af91cf3a19000000000066f7d1000000000000000000000000000000000000000000000000000a93b439220c74000000000073855f00000000000000000000000000000000000000000000000000219d46cfe945de000000000000003e0000000000000000000000000000000000000000000000000f3d416b9d2e2494000000000011d72b0000000000000000000000000000000000000000000000000022b2dad0c1f2530000000000003b100000000000000000000000000000000000000000000000000057ec8a61c22b6d00000000007cd091000000000000000000000000000000000000000000000000001fc4423aabfe9100000000001a4c90000000000000000000000000000000000000000000000000005c146c6bc916e000000000000fce7b000000000000000000000000000000000000000000000000003c05e8eb81666a00000000002229b6000000000000000000000000000000000000000000000000005a04dd2cb33502000000000082643900000000000000000000000000000000000000000000000007990d524f4e179c00000000002260da0000000000000000000000000000000000000000000000000114985a03cf4123000000000008bfdc0000000000000000000000000000000000000000000000000018ca5f7178a631000000000000b05200000000000000000000000000000000000000000000000007b79dc46af399c900000000006af30f000000000000000000000000000000000000000000000000001647c55315477500000000007dd10b000000000000000000000000000000000000000000000000013b37832b75672e000000000000406500000000000000000000000000000000000000000000035f798ec2aeec63af9b00000000002e3414000000000000000000000000000000000000000000000000001208de1721fad600000000002f5da3000000000000000000000000000000000000000000000000037efc2485adf03200000000002da6c1000000000000000000000000000000000000000000000000002b22ca23131e6c00000000000389d3000000000000000000000000000000000000000000000000005fa4121b9d0ed50000000000566b02000000000000000000000000000000000000000000000000000895298e141834000000000081ed0b000000000000000000000000000000000000000000000000006343aabfae04f4000000000017591700000000000000000000000000000000000000000000000000fadb997100343200000000004a586700000000000000000000000000000000000000000000000063d8acc60a6a4b8500000000000065a5000000000000000000000000000000000000000000000000068f12d1d0bf14db000000000075ccb7000000000000000000000000000000000000000000000000002dc066a2a68a00000000000043b7900000000000000000000000000000000000000000000000000ddff10432bbb68f00000000007b651300000000000000000000000000000000000000000000000000144ff5f08f98d0000000000082643b00000000000000000000000000000000000000000000000011580100e80b600500000000004e399000000000000000000000000000000000000000000000000000071d289fd389360000000000825894000000000000000000000000000000000000000000000000002f0b9ed4ce38e5000000000057578f000000000000000000000000000000000000000000000000002cf66f1644a9b1000000000023a478000000000000000000000000000000000000000000000000001c200bf825a54f0000000000824cd8000000000000000000000000000000000000000000000000014e57b53c7d0e6700000000006478dd000000000000000000000000000000000000000000000000000af9e5bd55ea47000000000037cc5c000000000000000000000000000000000000000000000000000af5a69cde00b000000000000077fc000000000000000000000000000000000000000000000000d642957badd8107e000000000072ffa40000000000000000000000000000000000000000000000000008804c7ff869c2000000000036f0bc000000000000000000000000000000000000000000000000013b4254f67e525a000000000081ef880000000000000000000000000000000000000000000000000f3ebd28d901443c0000000000824f2d000000000000000000000000000000000000000000000000000b140fd6862e0c00000000005be372000000000000000000000000000000000000000000000000000df350c7416f4700000000002a6fb60000000000000000000000000000000000000000000000000018a0abd7d0d8aa0000000000513a370000000000000000000000000000000000000000000000000008c3b79171d88400000000007aeedc000000000000000000000000000000000000000000000000001be12e91ad81000000000000824f2f00000000000000000000000000000000000000000000000050740119fd81fbdb000000000082643f0000000000000000000000000000000000000000000000000011c44531ec3ae300000000002c82fc00000000000000000000000000000000000000000000000003b4aa0d75c2483600000000008258970000000000000000000000000000000000000000000000000134a073947d03e800000000008243440000000000000000000000000000000000000000000000000040a719bab25bc3000000000081dbe2000000000000000000000000000000000000000000000000003645e31904b2e50000000000116d6c00000000000000000000000000000000000000000000000001a1af8cddebb3d9000000000001e42e000000000000000000000000000000000000000000000000004a6eaa4d7b249b0000000000076ff800000000000000000000000000000000000000000000000003754e4be0f649b100000000001903b900000000000000000000000000000000000000000000000000366c04f943940000000000008253e20000000000000000000000000000000000000000000000000119cbf69df653e3000000000005931400000000000000000000000000000000000000000000000000174a99f50c029200000000008004910000000000000000000000000000000000000000000000000279958544b845ef000000000082025f000000000000000000000000000000000000000000000000002b0da27beab7f100000000006d9e420000000000000000000000000000000000000000000000000200ac03dc5fe5d3000000000000015e00000000000000000000000000000000000000000000000001eabb31f25e1b8800000000004e22f6000000000000000000000000000000000000000000000000004533b9958358a500000000000ce49d00000000000000000000000000000000000000000000000001ea40aa2bdd8334000000000021869a00000000000000000000000000000000000000000000000000150c8a37cc09330000000000824cdd000000000000000000000000000000000000000000000000003f471dac4d89e6000000000000275500000000000000000000000000000000000000000000000000277ba121873ddb0000000000195883000000000000000000000000000000000000000000000000009126371343ab24000000000082364900000000000000000000000000000000000000000000000006ac78944579a663000000000000543e000000000000000000000000000000000000000000000000005eababb37ef2150000000000824cde00000000000000000000000000000000000000000000000000b967d59aad888800000000008233fe000000000000000000000000000000000000000000000000001fa5ae1c8e230e000000000045df5f0000000000000000000000000000000000000000000000000044d2aa6072f946000000000076b1760000000000000000000000000000000000000000000000000bbdf09aefd7e1b100000000003dd2f1000000000000000000000000000000000000000000000000003651061a412e1b00000000007f761300000000000000000000000000000000000000000000000000761b18de587b5b00000000006b0ad500000000000000000000000000000000000000000000000000193205c12fe1ac000000000014d50b0000000000000000000000000000000000000000000000000a8d9a8f8438ff9e000000000017a7e70000000000000000000000000000000000000000000000000b1349c781c81eee0000000000559bb300000000000000000000000000000000000000000000000000386f052f025b8000000000006925e000000000000000000000000000000000000000000000000000745c9085fe1ad00000000000682971000000000000000000000000000000000000000000000000239afa2090a8e424000000000000780b000000000000000000000000000000000000000000000000051b102cb446b3df0000000000824348000000000000000000000000000000000000000000000000004095d5dfc8794b00000000000b04b600000000000000000000000000000000000000000000000003c1a104409e9a0f00000000006e16360000000000000000000000000000000000000000000000000022e5dd381b2b00000000000043757a000000000000000000000000000000000000000000000000016f826212592cf30000000000821f0c00000000000000000000000000000000000000000000000010e07b07ce11544f00000000001de69700000000000000000000000000000000000000000000000000196109e91e089c000000000011c066000000000000000000000000000000000000000000000000001a104f9d97e72200000000000909a00000000000000000000000000000000000000000000000000063dd33620d770f00000000000000240000000000000000000000000000383c00000000000000000000000064363dfb000000000005383f000000000000000000000000000000000000000000000000000000000000532a000000000003e2320000383c00000000000000000000000000c097ce7bc90715b34b9f1000000000000000000003e2350000383c00000000000000000000000000c097ce7bc90715b34b9f1000000000000000000003e2380000383c00000000000000000000000000c097ce7bc90715b34b9f1000000000000000000000e5b30000000000000000000000000000000000000000000000022eb9a0853267ec39000000000000e5b4000000000000000000000000000000000000000003de3e7570899859a58eacf1000000000000e5b50000000000000000000000000000000000000000000000000000000064363dfb000000000000e807000000000000000000000000000000000000000000289041ae9c3515732282a4000000000000e80800000000000000000000000000000000000048ba1c953d3c97a283061346333e000000000000e80900000000000000000000000000000000000000000000000000000f78bfebf54e00000000001735e964363e27000000000000000000000000000000000888904ac863400064363dfb0000000000007a5a00000000000000000000000000000000000000000000000000000000000136bd00000000008258d900000000000000000000000000000000000000000000000000000000000000050000000000824f9a0000000000000000000000000000000000000000000000000000000000000002000000000000215000000000000000000000000000000000000000000001209d154b77c34c4e2b93000000000003dfee000000000000000000000000000000000000000000000000000000000000383c000000000003dfef0000000000000000000000000000000000000000000000000de0eef7f7e47c9b000000000005388900000000000000000000000000000000000000000000000000000041d298132e000000000026383200000000000000000000000000000000000000000000000000000000025dd50700000000000535ff00000000000000000000000000000000000000000000000000125f48c7b703ea00000000003bcdd4000000000000000000000000000000000000000000000000000000000000000000000000003bcdd50000000000000000000000000000000000000000000000000de0eef7f7e47c9b00000000001733cb64363e27000000000000000000000000000000000834b83797b0400064363dfb0000000000079494000000000000000000000000000000000000000000000000000000000000005a00000000005e14ad00000000000000000000000000000000000000000000000000000013765feaf000000000005e14ae00000000000000000000000000000000000000000000000000000012f0ebdc250000000000172dbe64363e27000000000000000000000000000000653af6f13fed31000064363dfb000000000062ca5b00000000000000000000000000000000000000000000000013773666d4fb1db1000000000062ca5c000000000000000000000000000000000000000000000000000000009c7110c7000000000003dff9000000000000000000000000000000000000000000000000000000000000383c000000000003ea55000000000000000000000000000000000000000000000000000002743c1772b300000000007cc1f000000000000000000000000000000000000000000000000000000016b29a31bb00000000007cc1f10000000000000000000000000000000000000000000000000000603096836ed0000000000082623a000000000000000000000000000000000000000000000000000000000000002600000000008264a1000000000000000000000000000000000000000000000000000000000000000000000000008264a20000000000000000000000000000000000000000000000000000000000000000000000000082623b0000000000000000000000000000000000000000000000000000000000000049000000000077b37700000000000000000000000000000000000000000000015fed4499039083eb7e00000000008264a300000000000000000000000000000000000000000000000000000000000000000000000000825d520000000000000000000000000000000000000000000000000000000000000012000000000052ea9100000000000000000000000000000000000000000000a294a1a0cd1d6cbbc6a400000000007f2298000000000000000000000000000000000000000000000002074e822eda11d75900000000008264a40000000000000000000000000000000000000000000000000000000000000049000000000082544900000000000000000000000000000000000000000000000000000000000000120000000000172a5464363e2700000000000000000000000000000657a4ca3b1e6e16000064363dfb00000000001c22cb000000000000000000000000000000000000000000009cb049ac684587be9d1d00000000001c27cdfffffffffffffffffffffffffffffffffffffffffffffd80174ad2257a89a48400000000001c2507000000000000000000000000000000000000000000000000000000000000000000000000002cc587000000000000000000000000000000000000000000000000000000000000000200000000008264d9000000000000000000000000000000000000000000000000000000000000000100000000001fb5930000000000000000000000000000000000000000000000000000001386342bbb000000000023237900000000000000000000000000000000000000000000005867ca083cff01300000000000005502ae0000000000000000000000000000000000000000000000000000000154ad472400000000005502af0000000000000000000000000000000000000000000000000e26142a88784e3600000000005502b00000000000000000000000000000000000000000000000000000000064363dfb00000000005506dc000000000000000000000000000000000000000000000000000946f331a9cbe500000000005506dd000000000000000000000000000000000000000000006237eab346d4f7879dda0000000000001f3e00000000000000000000000000000000000000000000000000004194a5f3be680000000000084ea0000000000000000000000000000000000000000000000000000000000000000000000000000d5c8d0000000000000000000000000000000000000000000000000000000000000000000000000001674d000000000000000000000000000000000000000000000000000000000000000000000000004dda400000000000000000000000000000000000000000000000000000000000a7d8de0000000000825b7d00000000000000000000000000000000000000000000000000000000000000000000000000213fc500000000000000000000000000000000000000000000000000000000008e4694000000000052a08200000000000000000000000000000000000000000000000000000000047672cc00000000008264e10000000000000000000000000000000000000000000000000000000000000007000000000019e5b200000000000000000000000000000000000000000000000000000000033a9e4f000000000081d6a4000000000000000000000000000000000000000000000000000000000000003800000000007f7b470000000000000000000000000000000000000000000000000000000000b8b0550000000000824152000000000000000000000000000000000000000000000000000000000000cd01000000000075544d00000000000000000000000000000000000000000000000000000001df4143bd00000000001447330000000000000000000000000000000000000000000000000000000000a390b600000000007a10c5000000000000000000000000000000000000000000000000000000000427e5350000000000577a7b00000000000000000000000000000000000000000000000000000000002b468e0000000000145f010000000000000000000000000000000000000000000000000000000003407333000000000048a9fc000000000000000000000000000000000000000000000000000000000645898800000000007a7df5000000000000000000000000000000000000000000000000000000000791cd63000000000046083400000000000000000000000000000000000000000000000000000778cfb1e4a3000000000082601e000000000000000000000000000000000000000000000000000000000e60633d0000000000235d2b0000000000000000000000000000000000000000000000000000000000000025000000000000219f0000000000000000000000000000000000000000000000000000042013959852000000000082626d000000000000000000000000000000000000000000000000000000000daa267000000000004b058b000000000000000000000000000000000000000000000000000000028c5c43f30000000000059e1f000000000000000000000000000000000000000000000000000000000053cc0200000000000050c300000000000000000000000000000000000000000000000000000000005111ea00000000007516eb0000000000000000000000000000000000000000204fce5e3e25026103d6f12800000000001a5804000000000000000000000000000000000000000000000000000000000000003500000000008254740000000000000000000000000000000000000000000000000000000000e4e1c00000000000190450000000000000000000000000000000000000000000000000000000000000002d00000000005bfba600000000000000000000000000000000000000000000000000000000009cfade0000000000826270000000000000000000000000000000000000000000000000000000000102dde800000000002c9f4c000000000000000000000000000000000000000000000000000000001d22cb480000000000825b8a00000000000000000000000000000000000000000000000000000002700c5d8e0000000000826273000000000000000000000000000000000000000000000000000000000000000000000000005dcf0b0000000000000000000000000000000000000000000000000000000000000058000000000082627400000000000000000000000000000000000000000000000000000000009d818b00000000005d4f57000000000000000000000000000000000000000000000000000000000000003e000000000047b96700000000000000000000000000000000000000000000000000000000011b307d0000000000136576000000000000000000000000000000000000000000000000000000d7fb590c1c000000000008f5ff000000000000000000000000000000000000000000000000000000000000000000000000002aafcc0000000000000000000000000000000000000000000000000000000000447fad000000000081b2360000000000000000000000000000000000000000000000000000000000000004000000000042319e00000000000000000000000000000000000000000000000000000000d1c7a2310000000000825b900000000000000000000000000000000000000000000000000000000023894d9600000000000021d100000000000000000000000000000000000000000000000000000006d2dc20dc0000000000825d98000000000000000000000000000000000000000000000000000000000000003f00000000008264ee00000000000000000000000000000000000000000000000000000000000000000000000000442786000000000000000000000000000000000000000000000000000000000000005e00000000002605e10000000000000000000000000000000000000000000000000000000000000009000000000081d83b0000000000000000000000000000000000000000000000000000000000000038000000000082627a0000000000000000000000000000000000000000000000000003f28cb5d1c82b00000000000c69cc000000000000000000000000000000000000000000000000000000001498f6b7000000000043ab570000000000000000000000000000000000000000000000000000000000101b8a000000000082627d0000000000000000000000000000000000000000000000000000000000000000000000000007797f00000000000000000000000000000000000000000000000000000009f925d01100000000000b0a9b000000000000000000000000000000000000000000000000000000000003e1c700000000007be23d000000000000000000000000000000000000000000000000000000001fe15f6200000000003b2ce5000000000000000000000000000000000000000000000000000000000000cd01000000000081dd590000000000000000000000000000000000000000000000000000000000000029000000000082627f000000000000000000000000000000000000000000000000000000000e009fa70000000000825b97000000000000000000000000000000000000000000000000000000003e6dd13700000000001d1dc000000000000000000000000000000000000000000000000000000000001f0e93000000000026a1cd0000000000000000000000000000000000000000000000000000000010bb833d00000000000b0d02000000000000000000000000000000000000000000000000000000000004f5d6000000000035f71d0000000000000000000000000000000000000000000000000000005fa42c94d00000000000536b1400000000000000000000000000000000000000000000000000000000000000490000000000162489000000000000000000000000000000000000000000000000000000006d6ac542000000000043a93c000000000000000000000000000000000000000000000000000000000000078800000000008264f2000000000000000000000000000000000000000000000000000000001738dd2900000000004d86a50000000000000000000000000000000000000000000000000000020a6ca9dd0000000000008264f4000000000000000000000000000000000000000000000000000000000e009fa700000000000999480000000000000000000000000000000000000000000000000000000001f6d5db00000000003e27040000000000000000000000000000000000000000000000000000000000e28e63000000000054bb4d00000000000000000000000000000000000000000000000000000001c139bbc400000000008264f50000000000000000000000000000000000000000000000000000000000706dea000000000080b23f0000000000000000000000000000000000000000000000000000000004d6299c00000000008264f6000000000000000000000000000000000000000000000000000000003a2bbd2800000000008234a000000000000000000000000000000000000000000000000000000000006df6a6000000000024ea9f00000000000000000000000000000000000000000000000000000000000000510000000000824b68000000000000000000000000000000000000000000000000000000000234e0810000000000633e2f00000000000000000000000000000000000000000000000000000000001f4a2a000000000044619200000000000000000000000000000000000000000000000000000000007194600000000000077c0800000000000000000000000000000000000000000000000000000002261d97690000000000760088000000000000000000000000000000000000000000000000000000000055bee300000000000083300000000000000000000000000000000000000000000000000000000145e9d49400000000007a09870000000000000000000000000000000000000000000000000000000000000000000000000081ebd000000000000000000000000000000000000000000000000000000002288dcc2500000000007e309c000000000000000000000000000000000000000000000000000000000000000000000000003074360000000000000000000000000000000000000000000000000000000006428e1e0000000000825b9f000000000000000000000000000000000000000000000000000000003e6dd13700000000008264fc0000000000000000000000000000000000000000000000000000000000000000000000000082602f00000000000000000000000000000000000000000000000000000000000000160000000000822b1500000000000000000000000000000000000000000000000000000000000c4da5000000000082628a000000000000000000000000000000000000000000000000000000000000000000000000001ea48b000000000000000000000000000000000000000000000000000000000000001a00000000005dc5e4000000000000000000000000000000000000000000000000000000000005eb01000000000082628b00000000000000000000000000000000000000000000000000000000038d7eb20000000000532384ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008264fe0000000000000000000000000000000000000000000000000000000001a7207100000000004a0d620000000000000000000000000000000000000000000000000000000000000000000000000001d3c600000000000000000000000000000000000000000000000000000000000000000000000000359ade000000000000000000000000000000000000000000000000000000000000002500000000008264ff000000000000000000000000000000000000000000000000000000001d258c40000000000030718d0000000000000000000000000000000000000000000000000000000006428e1e00000000006b38f40000000000000000000000000000000000000000000000000000000000445b490000000000826500000000000000000000000000000000000000000000000000000000000000002d0000000000301df20000000000000000000000000000000000000000000000000000000000a822db00000000000040a600000000000000000000000000000000000000000000000000001c3106fdc9d20000000000826501000000000000000000000000000000000000000000000000000000001738dd2900000000003df9cc0000000000000000000000000000000000000000000000000000000000a2c94d000000000011e11600000000000000000000000000000000000000000000000000000000000dfc4b00000000007e292d00000000000000000000000000000000000000000000000000000000023663a600000000001d1ae000000000000000000000000000000000000000000000000000000000001f131f0000000000529e2000000000000000000000000000000000000000000000000000000000000000470000000000824b7100000000000000000000000000000000000000000000000000000000008de44200000000007a07f70000000000000000000000000000000000000000000000000000000000c6b9b800000000003e8399000000000000000000000000000000000000000000000000000000000048fae300000000006d42e000000000000000000000000000000000000000000000000000000000177e1666000000000082134e000000000000000000000000000000000000000000000000000000000000000000000000007ce38800000000000000000000000000000000000000000000000000000000002189e20000000000820b8c0000000000000000000000000000000000000000000000000000000006314ee0000000000081e7b00000000000000000000000000000000000000000000000000000000000000029000000000008c0f9000000000000000000000000000000000000000000000000000000000000004c00000000005e19980000000000000000000000000000000000000000000000000000000004da63ee00000000007f9fa30000000000000000000000000000000000000000000000000000000001312d0000000000008260390000000000000000000000000000000000000000000000000000000023d21fbe00000000001d1dd600000000000000000000000000000000000000000000000000000000001f0e5a00000000000d941c0000000000000000000000000000000000000000000000000000000000c6faf3000000000037d8e70000000000000000000000000000000000000000000000000000000005f5378d0000000000025f94000000000000000000000000000000000000000000000000000000000117b5b4000000000071862d0000000000000000000000000000000000000000000000000000000001682e880000000000575e7300000000000000000000000000000000000000000000000000000000048e13bc0000000000825db0000000000000000000000000000000000000000000000000000000000238f6af00000000007cb92100000000000000000000000000000000000000000000000000000000001627cb000000000082629400000000000000000000000000000000000000000000000000000000000994f500000000008265030000000000000000000000000000000000000000000000000000000000000000000000000064ed3b000000000000000000000000000000000000000000000000000000000000003a000000000012566300000000000000000000000000000000000000000000000000000000035502650000000000822fb500000000000000000000000000000000000000000000000000000000013400990000000000371cba000000000000000000000000000000000000000000000000000000000000000000000000008254940000000000000000000000000000000000000000000000000000000000000000000000000082650400000000000000000000000000000000000000000000000000000000086486fe000000000082650500000000000000000000000000000000000000000000000000000000000000000000000000661941000000000000000000000000000000000000000000000000000000000000dee20000000000821ca4000000000000000000000000000000000000000000000000000000000098ba7e000000000082650600000000000000000000000000000000000000000000000000000000000000070000000000825bae00000000000000000000000000000000000000000000000000000000000c8a8100000000008259810000000000000000000000000000000000000000000000000000000001a533f20000000000211d84000000000000000000000000000000000000000000000000000000000004f5d600000000000049f000000000000000000000000000000000000000000000000000000001804fff2b000000000026060a0000000000000000000000000000000000000000000000000000000037876de800000000001abe4d000000000000000000000000000000000000000000000000000000000d0554ac000000000059676a000000000000000000000000000000000000000000000000000000000000005e00000000000536b2000000000000000000000000000000000000000000000000000000aeff910b1200000000000e68b2000000000000000000000000000000000000000000000000000000000007f0ed00000000004bb0720000000000000000000000000000000000000000000000000000000002fe02fe000000000082492c000000000000000000000000000000000000000000000000000000000000000000000000002db31b000000000000000000000000000000000000000000000000000000000000002f00000000007a08020000000000000000000000000000000000000000000000000000000000a6c22f000000000033544e000000000000000000000000000000000000000000000000000000000000001a0000000000368fb50000000000000000000000000000000000000000000000000000000003c15c1a00000000005502ec0000000000000000000000000000000000000000000000000000000154ad4724000000000082650a000000000000000000000000000000000000000000000000000000000000000000000000002a6e170000000000000000000000000000000000000000000000000000000010c2a6250000000000251260000000000000000000000000000000000000000000000000000000000000000000000000008262a4000000000000000000000000000000000000000000000000000000000010a9ac00000000005635c40000000000000000000000000000000000000000000000000000000002a3443200000000005bc423000000000000000000000000000000000000000000000000000000000026285500000000004427c0000000000000000000000000000000000000000000000000000000000000005e000000000081dd730000000000000000000000000000000000000000000000000000000037de06ca000000000082650b000000000000000000000000000000000000000000000000000000000000000000000000007e2e470000000000000000000000000000000000000000000000000000000000000000000000000082650c000000000000000000000000000000000000000000000000000000000daa267000000000000024ee0000000000000000000000000000000000000000000000000000030366ae227100000000008045e900000000000000000000000000000000000000000000000000000000075873af0000000000824b8100000000000000000000000000000000000000000000000000000000061501b1000000000006906a0000000000000000000000000000000000000000000000000000000000ee103e0000000000824933000000000000000000000000000000000000000000000000000000000000000000000000006bc9c5000000000000000000000000000000000000000000000000000000000000003a000000000082598c00000000000000000000000000000000000000000000000000000000000994f5000000000019507200000000000000000000000000000000000000000000000000000012d91cf57f00000000000415b60000000000000000000000000000000000000000000000000000000000000000000000000082501f0000000000000000000000000000000000000000000000000000000003151b3000000000007a08080000000000000000000000000000000000000000000000000000000000ac87f500000000000413dd0000000000000000000000000000000000000000000000000000000000000000000000000082598e000000000000000000000000000000000000000000000000000000000000001600000000001b3d4a0000000000000000000000000000000000000000000000000000006c954a38c0000000000012d74d00000000000000000000000000000000000000000000000000000000154dc9a100000000001d1afe00000000000000000000000000000000000000000000000000000000001f11390000000000211d95000000000000000000000000000000000000000000000000000000000003e1c700000000001365c864363dfb00000000001ad778f53cc6f64bdc000000000000000000d7fb590c1c0000000000138c09000000000000000000000002b06a18a2968b9798d28d0621496a676cc00ee49a0000000000138c0a00000000000000000000000000000000000000a5b904cf3f50a9fb8bfc5d0ace000000000080f093000000000000000000000000000000000000000000000000000006b09aece2dc000000000053449a00000000000000000000000000000000000000000000000df0b2473deda3b73c000000000080ee7e00000000000000000000000000000000000000000000000df0b2473deda3b73c000000000080ee7f000000000000000000000000000000000000000000000000000037287bb9c68c000000000081337d0000000000000000000000000000000000000000000000000000000007b0091f0000000000649e990000000000000000000000000000000000000000000000000000000007b0091f00000000002ff2aa000000000000000000000000000000000000000000000000000006b09aece2dc00000000001a6671000000000000000000000000000000000000000000000000000037287bb9c68c000000000022f40a000000000000000000000000000000000000000000024b36903bc7ee818787c800000000001e7c870000000000000000000000000000000000000000001af4ff4ebb7dd4abe11b6800000000001eb1db0000000000000000000000000000000000000000000026f683bc4df2b3a66c6000000000008262c100000000000000000000000000000000000000000000000000290334f34980000000000000513d9d00000000000000000000000000000000000000000000000000000000000000000000000000246ee0000000000000000000000000000000000000000000004219a208b499fa2648fd00000000001eb46a00000000000000000000000000000000000000000000b5057d581bca740396d000000000001eb46cffffffffffffffffffffffffffffffffffffffffffffe8c09ee6402ad072fb54000000000076ade6000000000000000000000000000000000000000000000000f56c779bb61e6308000000000039fd31000000000000000000000000000000000000000000000000007857b6b89d8e42000000000060da5e000000000000000000000000000000000000000000000000000000000000000000000000000039e6000000000000000000000000000000000000000000000000000000000001dab500000000000039e8000000000000000000000000000000000000000000000000000000000001dab50000000000826525000000000000000000000000000000000000000000000000000000000000000000000000008257200000000000000000000000000000000000000000000000000000000000000001000000000032fd87000000000000000000000000000000000000000000000000000000000000000000000000008259ad0000000000000000000000000000000000000000000000000000000000000002000000000081aae50000000000000000000000001e144b9b431926eeeab6146c1382e2ca672dd67c000000000082653700000000000000000000000000000000000000000000000000000000000000020000000000002156000000000000000000000000000000000000000000000292a6dafe2ec4c484a3000000000003420a000000000000000000000000000000000000000000000000000000000000000000000000004608840000000000000000000000000000000000000000000000eed99f2838b2a9e17700000000001c238a00000000000000000000000000000000000000000000000cadd86dac27eb7001000000000054a6d400000000000000000000000000000000000000000000002df6a64a0ea7cc512b00000000000021a3000000000000000000000000000000000000000000000083d36cefce65cd6ced000000000013664a00000000000000000000000000000000000000000000001ad778f53cc6f64bdc00000000007973270000000000000000000000000000000000000000000000000000000000000000000000000082505700000000000000000000000000000000000000000000000000206cdaa9cdeb8000000000000023f7000000000000000000000000000000000000000000000000ddb00a376882239b000000000000e6ba0000000000000000000000000000000000000000000000022eb9a0853267ec3900000000007b31cf000000000000000000000000000000000000000000000000001e112e791ff29e0000000000547fa700000000000000000000000000000000000000000000000037892834cac8416d0000000000009e8e0000000000000000000000000000000000000000000000001732cae65919879100000000002dd059000000000000000000000000000000000000000000000000000000000000000000000000005dc88d00000000000000000000000000000000000000000000000000000000000000410000000000246f1900000000000000000000000000000000000000000000000367d349178c49ce93000000000000e8fa0000000000000000000000000000000000000000000000001c24fd7fcd79e7b000000000005cb6d90000000000000000000000000000000000000000000000000000000000000000000000000000215700000000000000000000000000000000000000000000002dbae41b21f2577d71000000000054bbaf000000000000000000000000000000000000000000000000d6b2ad78f665c3250000000000826310000000000000000000000000000000000000000000000000000000000000001900000000000024f1000000000000000000000000000000000000000000000000b009dfbe1f0c873500000000005503380000000000000000000000000000000000000000000000000e26142a88784e3600000000000024f20000000000000000000000000000000000000000000000604f67cbf343ab63ac0000000000825e43000000000000000000000000000000000000000000000000000000000000000000000000005a974b000000000000000000000000000000000000000000000000000000000ba6e08100000000005a974c000000000000000000000000000000000000000000000053cc526f7f6716988400000000000040fe00000000000000000000000000000000000000000000035f798ec2aeec63af9b00000000005e15ae00000000000000000000000000000000000000000000000000000013765feaf000000000000040ff000000000000000000000000000000000000000000000355dd849816815d2d71000000000063423900000000000000000000000000000000000000000000023c99e13804769c63b600000000005e15af000000000000000000000000000000000000000000000000000000138ef125f800000000002fc8fb0000000000000000000000000000000000000000000035e392f6087438029d6000000000004f7bdf000000000000000000000000000000000000000000000000000000000c35dbfa000000000000410000000000000000000000000000000000000000000000000000001ac6a7fb1bd300000000000b4f8500000000000000000000000000000000000000000000000220a56828f21d790b000000000062cb65000000000000000000000000000000000000000000000000000000009c7110c7000000000052ebc3000000000000000000000000000000000000000000009cffea1947d748dcd08b00000000005e15b000000000000000000000000000000000000000000000000000000012f0ebdc2500000000000b4f8600000000000000000000000000000000000000000000000c676161174c6d80ba00000000007cc2b60000000000000000000000000000000000000000000000000000603096836ed000000000007cc2b70000000000000000000000000000000000000000000000000000603096836ed000000000002fc8fc000000000000000000000000000000000000000000006f97038be93aa59b1f8a000000000052ebc4000000000000000000000000000000000000000000000000000000e5d172c476000000000054c33d0000000000000000000000000000000000000000000000bf8a850202f20ab59600000000002fc8fd000000000000000000000000000000000000000000000000000000231bee6107000000000030075f000000000000000000000000000000000000000000000004ad2e6702482371f0000000000063423a00000000000000000000000000000000000000000000000000000002744013e400000000005a9752000000000000000000000000000000000000000000000000000000000ba6e081000000000052ebc500000000000000000000000000000000000000000000a294a1a0cd1d6cbbc6a4000000000000410100000000000000000000000000000000000000000000000000001c3106fdc9d200000000000b4f8700000000000000000000000000000000000000000000000c581a2a219240431f00000000005a9753000000000000000000000000000000000000000000000053cc526f7f6716988400000000007cc2b800000000000000000000000000000000000000000000000000000016b29a31bb00000000004f7be000000000000000000000000000000000000000000000000008cced662252a75400000000003007600000000000000000000000000000000000000000000039a582640956d5559ac8000000000062cb6600000000000000000000000000000000000000000000000013773666d4fb1db10000000000300766000000000000000000000000000000000000000000000004ad2e6702482371f000000000003007670000000000000000000000000000000000000000000039a582640956d5559ac8000000000052ebc600000000000000000000000000000000000000000000b009f78c3c4382452aba000000000052ebc7000000000000000000000000000000000000000000009cffea1947d748dcd08b000000000052ebc8000000000000000000000000000000000000000000000000000000e5d172c476000000000052ebc9000000000000000000000000000000000000000000016e034eba5aa2c5adea13000000000053452d000000000000000000000000000000000000000000000051195470f56c4f02ee00000000001eb50f00000000000000000000000000000000000000000000b5057d581bca740388ee00000000001eb510000000000000000000000000000000000000000000002b924b6031dc0396887c00000000001eb5110000000000000000000000000000000000000000000037254fbabec0354f8b8f0000000000826548000000000000000000000000000000000000000000000000000000000000000000000000001eb7e2000000000000000000000000000000000000000000000beaa356ee1ffed588ab00000000005f100c00000000000000000000000000000000000000000000000410d586a20a4c0000000000000023185700000000000000000000000000000000000000000000495aa07cca1caa86026300000000002332300000000000000000000000000000000000000000000017a3718b4be7af5ea21b000000000082654a0000000000000000000000000000000000000000000000000000000000000000000000000082654b0000000000000000000000000000000000000000000000000000000000000000000000000082654c0000000000000000000000000000000000000000000000000000000000000000000000000082654d000000000000000000000000000000000000000000000000000000000000000000000000002332310000000000000000000000000000000000000000000008460157275de3c77cc800000000007643f30000000000000000000000000000000000000000000000000000000000000000000000000082654e0000000000000000000000000000000000000000000000000000000000000000000000000082654f00000000000000000000000000000000000000000000000000000000000000000000000000826557000000000000000000000000000000000000000000000000000000000000000c00000000000b4f8a00000000000000000000000000000000000000000000000c676161174c6d80ba0000000000826558000000000000000000000000000000000000000000000000000000000000000c00000000007fa90d000000000000000000000000000000000000000000000258000000000000022f0000000000817966000000020000000064363dfbbd857ed6015781d666fcf6f0e4fc1847ca301213000000000000410400000000000000000000000000000000000000000000000008f6cb239ded15ad000000000000410500000000000000000000000000000000000000000000000000001ac6a7fb1bd30000000000004106000000000000000000000000000000000000000000000355dd849816815d2d710000000000004107000000000000000000000000000000000000000000000000097349a827a312e1000000000082655a0000000000000000000000000000000000000000000000000000000000000000000000000082655c0000000000000000000000000000000000000000000000000000000000000000000000000019e9430000000000000000000000000000000000000000000000000000000000000000000000000013b4e6000000000000000000000000000000000000000000000000000001daff0384bc000000000023030e000000000000000000000000000000000000000000000000000000000000000000000000001aa07d000000000000000000000000000000000000000000000000000000000000000000000000000771f5000000000000000000000000000000000000000000000000000000000000000000000000001a672800000000000000000000000000000000000000000000000000087e5db4d062bd0000000000231319000000000000000000000000000000000000000000000000000000000000000000000000006b2276000000000000000000000000000000000000000000000000000001b8e3a84faf0000000000823a0200000000000000000000000000000000000000000000000000000000000000000000000000177ab600000000000000000000000000000000000000000000000000001605fc4ce38300000000002307950000000000000000000000000000000000000000000000000000000000000000000000000054a70a00000000000000000000000000000000000000000000002df6a64a0ea7cc512b000000000054a70b00000000000000000000000000000000000000000009fbf38c74a42b70e765e2000000000054a70c0000000000000000000000000000000000000000000000000000000064363dfb000000000054ba210000000000000000000000000000000000000000014c50447167d420e19b2176000000000054ba2200000000000000000000000000000000000000432a18b7079e386d59b9649bae00000000001b3e710000000000000000000000000000000000000000000000000000006c954a38c000000000001cb83900000000000000000000000000000000000000000000447ce3dffd6b1c4cdf8900000000001cb83a000000000000000000000000000000000000000000000038481c6443b4c0ad9b00000000007840100000000000000000000000000000000000000000000000000000000000000000000000000054e670000000000000000000000000000000000000000000000000000000000000000000000000008213b80000000000000000000000000000000000000000000000000000000000000000000000000054c3730000000000000000000000000000000000000000000000bf8a850202f20ab59600000000005503610000000000000000000000000000000000000000000000000000000000000000000000000054a71100000000000000000000000000000000000000000009fbf38c74a42b70e765e200000000006342590000000000000000000000000000000000000000000000000000000000000000000000000054e42d000000000000000000000000000000000000000000000000000000000000000000000000006b30e40000000000000000000000000000000000000000000000000000000000000000000000000055b787000000000000000000000000000000000000000000000000000000000000000000000000006d3f120000000000000000000000000000000000000000000000000000000000000000000000000054bc44000000000000000000000000000000000000000000002c6f71127755853922e600000000006a329e000000000000000000000000000000000000000000000000000000000014c98e00000000004ce5e000000000000f424000000000f12d17ae00000000000000000000020a6ca9dd000000000000553f7e000000000000000000000000000000000000000000002c6bf44fa0e3d2ecc23a0000000000553f80000000000000000000000000000000000000000000000000d6a742f5de3bdfb400000000000b4fa900000000000000000000000000000000000000000000000220a56828f21d790b00000000000b4faa00000000000000000000000000000000000000000000000c581a2a219240431f000000000047dc2b00000000000000000000000000000000000000000000000000000000000007d9000000000082657a000000000000000000000000000000000000000000000000000d7df30cc7848f000000000082657b0000000000000000000000000000000000000000000000000000000fe9ef6e4100000000005e15f600000000000000000000000000000000000000000000000452a8f765c9f728fb00000000008125020000000000000000000000008aaaf6e6167825829ab29f260f246afe742fb2430000000000812503000000000000000000000000000000000000000000000000011c37937e080000000000000000266a00000000000000000000000000000000000000000000001e5493eca2dab9df5e0000000000826583d82ca3b18d89bb6022e1547d6e4bfd9489b2a9c994579bdaac61c72c30c4a6e0000000000082658bacde630a7fa322a76c2490a548e3bc1fa710b50e1bdf455fd3b1fb6d770cce10000000000082658d73686d696e742e7a6b00000000000000000000000000000000000000000000120000000000077aa7000000000000000000000000000000000000000000006f38d83306d38b1ba80000000000002fc94600000000000000000000000000000000000000000000000000bf80c88a05ab2e00000000002fc947000000000000000000000000000000000000000000000000000000231bee610700000000002fc9480000000000000000000000000000000000000000000035e392f6087438029d6000000000002fc94900000000000000000000000000000000000000000000000002b7f3e97ba4f8ba00000000002ff3600000000000000000000000000000000000000000000000000007dbd9e789125200000000006909e400000000000000000000000000000000000000000000021a71b8e3b5cbe7dd8000000000004d77c000000000000000000000000000000000000000000000000002a2f8f1255067f400000000004d77c100000000000000000000000000000000000000000000000002a2f8f1255067f400000000004d77c200000000000000000000000000000000000000000000000000000000000006d8000000000054bc5c0000000000000000000000000000000000000000000000000000000064363dfb0000000000553fa300000000000000000000000000000000000000000000000000000000000006a1000000000054bc5e0000000000000000000000000000000000000000000000000000000064363dfb00000000005541f6000000000000000000000000000000000000000000047600ddf32e866e941e9700000000008265a70000000000000000000000000000000000000000000000000000000000000000000000000054bc5f0000000000000000000000000000000000000000000000000000000064363dfb00000000008265ac000000000000000000000000000000000000000000000000000000000000000200000000008265ad000000000000000000000000000000000000000000000000000000000000000000000000002305470000000000000000000000000000000000000000000153cf34e2d2fcd1f6026300000000001ebad60000000000000000000000000000000000000000000000000000000064363dfb0000000000231896000000000000000000000000000000000000000000004b6d262b1c9e479fcac1000000000022ab7d0000000000000000000000000000000000000000000000000000000000000cfc0000000000231d710000000000000000000000000000000000000000000000000000000064363dfb00000000002342b2000000000000000000000000000000000000057450909be535381bbd41ecfa4d000000000000216f00000000000000000000000000000000000000000001209d154b77c34c4e2b93000000000000217000000000000000000000000000000000000000000000002dbae41b21f2577d7100000000000021710000000000000000000000000000000000000000000000000000000064363dfb00000000000021d400000000000000000000000000000000000000145b677d2349437baa516ea9f800000000000021d500000000000000000000000000000000000000000329445fb9a36c2f6dcfd3c100000000000024f4000000000000000000000000000000000000000000000000000fcc14c4ca760b000000000000e708000000000000000000000000000000000000000003de3e7570899859a58eacf1000000000007960e000000000000000000000000000000000000000000000000000000000225510000000000004608fb00000000000000000000000000000000000000000000000002a3ecd5bc592a3500000000004608fe00000000000000000000000000000000000000000000000000000778cfb1e4a300000000004608ff0000000000000000000000000000000000000000000000eed99f2838b2a9e17700000000004609000000000000000000000000000000000000000000000000000000000064363dfb000000000054801e0000000000000000000000000000000000000000000000002e954dc08c97ef30000000000054801f000000000000000000000000000000000000000005caef3c482c1172a902ec5b00000000004d77de00000000000000000000000000000000000000000000000002a2f8f1255067f4000000000082272100000000000000000000000000000000000000000000000000000000000000000000000000822be3000000000000000000000000000000000000000000000000000000000000000000000000008265c50000000000000000000000000000000000000000005be8b1658c6b810cb0d95200000000007cc9fb0000000000000000000000000000000043b55eb3910fa136fa77720066370d1800000000007cc3320000000000000000000000000000000000000000000000000000603096836ed000000000007ccbe5fffffffffffffffffffffffffffffffffffffffffffffffffffa2057e53d011700000000007cc334000000000000000000000000000000000000000000000000002321d435e354bb00000000000024f50000000000000000000000000000000000000000000000000106dabc0aff69c200000000000024fa64363dfb0000000000604f67cbf343ab63ac0000000000000000030366ae227100000000000026750000000000000000000000032b2479deaf1a557ca4d19f9e4330657016335a93000000000000267600000000000000000000000000000000000000bfd1222b23e5abf163f6d3acaa00000000000024fb0000000000000000000000000000000000012235bbc56b6a41077b83752b6c5600000000001460340000000000000000000000000000000000000000000000000000000000000000000000000017b32c00000000000000000000000000000000000000000000000000019e0e9265555f000000000025263f0000000000000000000000000000000000000000000000000000000000000000000000000081ec57000000000000000000000000000000000000000000000000000000000000000000000000006342ac0000000000000000000000000000000000000000000000000000009b2b3ebfb200000000006342ad00000000000000000000000000000000000000000000023c99e13804769c63b600000000006342ae00000000000000000000000000000000000000000000000000000002744013e400000000006342af00000000000000000000000000000000000000000000000000257c7bbc983ce90000000000649f5b000000000000000000000000000000000000000000000000000000001c6f864c00000000006e321b000000000000000000000000000000000000000000000002b2dd16ff127b8ab400000000008265ce000000000000000000000000000000000000000000000000000000000000000000000000005df095000000000000000000000000000000000000000000000000000000000000000400000000002fc958000000000000000000000000000000000000000000006f97038be93aa59b1f8a00000000000021ab00000000000000000000000000000000000000000000000001751e95ff44ff7000000000000021b2000000000000000000000000000000000000000000000000000004201395985200000000000021b3000000000000000000000000000000000000000000000083d36cefce65cd6ced00000000000021b40000000000000000000000000000000000000000000000000000000064363dfb00000000000021da0000000000000000000000000000000000000000000000004ccba03dfe89db6200000000000021db000000000000000000000000000000000000000009bbc288832710c24ef15d2900000000000021dc0000000000000000000000000000000000000000000000000000035ae28f6f060000000000002408000000000000000000000000000000000000000000000074234f6ae41eada22400000000000260880000000000000000000000000000000000000000000000000000000000000002000000000002608f0000000000000000000000000000000000000000000000000000035ae28f6f060000000000002fbd000000000000000000000000000000000000000000000074234f6ae41eada224000000000002609000000000000000000000000000000000000000000000000000000000000000000000000000002fc30000000000000000000000000000000000000000000000000000035ae28f6f060000000000026091000000000000000000000000000000000000000000000074234f6ae41eada2240000000000002fc90000000000000000000000000000000000000000000000000000000000002943000000000073ada70000000000000000000000000000000000000000000031a375ee981463164f7000000000008265ed0000000000000000000000000000000000000000000000000a01038c9240920000000000008263bb000000000000000000000000000000000000000000000000024d57875290d000000000000081de9f0000000000000000000000000000000000000000000000013ab635af2363c000000000000081dea10000000000000000000000000000000000000000000000013ab635af2363c00000000000007733d30000000000000000000000000000000000000000000000a028340e28f0abed100000000000825eda0000000000000000000000000000000000000000000000002df81d6691789fb2000000000082556b000000000000000000000000000000000000000000000000056dec66b09257e40000000000825c780000000000000000000000000000000000000000000000003328b944c40000000000000000788b650000000000000000000000000000000000000000000000000cc94f7daf07b00000000000008263c000000000000000000000000000000000000000000000000011b9cc6d07f07b00000000000081b36d00000000000000000000000000000000000000000000000000da896b90658000000000000078eeb0000000000000000000000000000000000000000000000000003b1ee6bdb5100000000000008265f2000000000000000000000000000000000000000000000000285a032d3e9d8a00000000000078eeb1000000000000000000000000000000000000000000000000003b1ee6bdb51000000000000082556e000000000000000000000000000000000000000000000000056dec66b09257e40000000000825ee200000000000000000000000000000000000000000000000fe7c9cdba96bc4000000000000082405b0000000000000000000000000000000000000000000000003dc9bf42bd78c000000000000077ad47000000000000000000000000000000000000000000000003b98532106d9874eb0000000000824549000000000000000000000000000000000000000000000000015b1abd3afce1800000000000821b69000000000000000000000000000000000000000000000007bd76d18d4c83270000000000008265f500000000000000000000000000000000000000000000000000989959c11095800000000000825ee90000000000000000000000000000000000000000000000006e590313a497e000000000000081deaa00000000000000000000000000000000000000000000000118dc2ae7ab8b200000000000008265f90000000000000000000000000000000000000000000000010d6dea21e754f00000000000008265fb0000000000000000000000000000000000000000000000000a01038c9240920000000000007733eb0000000000000000000000000000000000000000000000a028340e28f0abed100000000000826601000000000000000000000000000000000000000000000000285a032d3e9d8a00000000000081deb500000000000000000000000000000000000000000000000118dc2ae7ab8b20000000000000825c96000000000000000000000000000000000000000000000001f3939d1e4eda10000000000000825ef600000000000000000000000000000000000000000000000004c091e8a1042000000000000082406c0000000000000000000000000000000000000000000000003dc9bf42bd78c00000000000007fb935000000000000000000000000000000000000000000000000017e4dcd9eea31000000000000825ca10000000000000000000000000000000000000000000000003328b944c4000000000000000082660700000000000000000000000000000000000000000000000000989959c11095800000000000826608000000000000000000000000000000000000000000000000021faf62444e350000000000007b485b0000000000000000000000000000000000000000000000017127a36ab18391340000000000825f040000000000000000000000000000000000000000000000000484f0bb39fdc000000000000081b38b00000000000000000000000000000000000000000000000000da896b906580000000000000825f050000000000000000000000000000000000000000000000002df81d6691789fb200000000008263e6000000000000000000000000000000000000000000000000024d57875290d00000000000007a0fd400000000000000000000000000000000000000000000000581293e53128c7000000000000082536f0000000000000000000000000000000000000000000000002bd9d5d32f9feb0000000000008253700000000000000000000000000000000000000000000000002bd9d5d32f9feb0000000000007fb93d000000000000000000000000000000000000000000000000017e4dcd9eea31000000000000825f0900000000000000000000000000000000000000000000000004c091e8a10420000000000000821b77000000000000000000000000000000000000000000000007bd76d18d4c83270000000000007c163e0000000000000000000000000000000000000000000000011c03ac0da5ed24000000000000825f0d0000000000000000000000000000000000000000000000006e590313a497e00000000000007a0fe000000000000000000000000000000000000000000000000581293e53128c700000000000007de4e100000000000000000000000000000000000000000000000012fe36476ac49d6a000000000081d6f00000000000000000000000000000000000000000000000009a3bfa8f91c98000000000000073ada90000000000000000000000000000000000000000000031a375ee981463164f7000000000007a3f22000000000000000000000000000000000000000000000000bf709da72e6fb00000000000007b485f0000000000000000000000000000000000000000000000017127a36ab183913400000000007de4e500000000000000000000000000000000000000000000000012fe36476ac49d6a0000000000825f1b0000000000000000000000000000000000000000000000000484f0bb39fdc000000000000082384800000000000000000000000000000000000000000000000008a7885b80e510000000000000825f1c00000000000000000000000000000000000000000000000fe7c9cdba96bc4000000000000082384e00000000000000000000000000000000000000000000000008a7885b80e51000000000000082661d0000000000000000000000000000000000000000000000003dfd0c84a94a0180000000000082661e0000000000000000000000000000000000000000000000003dfd0c84a94a018000000000007c16740000000000000000000000000000000000000000000000011c03ac0da5ed240000000000008266220000000000000000000000000000000000000000000000010d6dea21e754f000000000000082456d000000000000000000000000000000000000000000000000015b1abd3afce1800000000000825cc0000000000000000000000000000000000000000000000001f3939d1e4eda1000000000000082640400000000000000000000000000000000000000000000000011b9cc6d07f07b0000000000007a3f36000000000000000000000000000000000000000000000000bf709da72e6fb0000000000000788ba00000000000000000000000000000000000000000000000000cc94f7daf07b0000000000000826627000000000000000000000000000000000000000000000000021faf62444e3500000000000081d6f60000000000000000000000000000000000000000000000009a3bfa8f91c98000000000000077ad97000000000000000000000000000000000000000000000003b98532106d9874eb00000000004f7cab000000000000000000000000000000000000000000000000000000000c35dbfa00000000004f7cac00000000000000000000000000000000000000000000000008cced662252a754000000000055401100000000000000000000000000000000000000000000000000000001c139b38400000000005540120000000000000000000000000000000000000000000000003789272cfac7ebeb00000000007ef0ce0000000000000000000000000000000000000000000001bc00000000000001ad00000000007efc1a000000000000000000000000000000000000000000000000000000000000000800000000001c23fe00000000000000000000000000000000000000000000029b8c5a73dceec8dc9500000000001c23ff64363dfb00000000000cadd86dac27eb7001000000009cb049ac684587be9d1d00000000001c27130000000000000000000000000000000002e68fd71261410edf4c4bd43f2fc85300000000001c271400000000000000000000000000008fb3c4899df802cc6a71d2850c21394567d300000000001c24000000000000000000000000000007c2ab0dbcfd70322c01f28d3b620e911a4d1d00000000003a6c06000000000000000000000000000000000000000000000000000000000000027b000000000039fe2600000000000000000000000000000000000000000000014c08624d700b68ccf700000000001c29a20000000000000000000000000000000000000000000000047b409a74d8d04d9c00000000006e1ac60000000000000000000000000000000000000000000000030000000000000002000000000082457700000000000000000000000000000000000000000000000000000000000000000000000000825f30000000000000000000000000000000000000000000000000000000000000000000000000006e7139000000020000000064363dfb0e8e857d9874c31dc1236a8cf97ae66e2549726b00000000007851c1000000020000000064363dfbd820e2750ae3d163882d8a18bde16c0665a2a43e00000000003a012500000000000000000000000000000000000000000000a650854ecfc08cec427000000000003a01260000000000000000000000000000000000000000000000028904b30b599b541200000000003a6c0d000000000000000000000000000000000000000000000005cac75b5eea3da72800000000003a6c0e00000000000000000000000000000000000000000000034431ec79a94feb751500000000003b16010000000000000000000000000000000000000000000000e346d1c5a8f23f3fc500000000003b19ed00000000000000000000000000000000000000000000000002c8dbf0e3270d1c000000000060dcae00000000000000000000000000000000000000000000000000012297c2e81665000000000060dcaf00000000000000000000000000000000000000000000003d212dfbd575591c4e000000000039c1de0000000000000000000000000000000000000000000000000000000064363dfb00000000003a015e0000000000000000000000000000000000000000000000000000834d504bfee4000000000039feb900000000000000000000000000000000000000000000014c08624d700b68ccf7000000000039c6b20000000000000000000000000000000000000000000000000000000064363dfb00000000003a06ee00000000000000000000000000000000000000000000000030fa89443898b14a000000000039feba000000000000000000000000000000000000000000000000007857b6b89d8e4200000000001b4443000000000000000000000000000000000000000000000000000000000000014c00000000004d88070000000000000000000000000000000000000000000000000000020a6ca9dd00000000000024713f64363dfb00000000000367d349178c49ce93000000004219a208b499fa2648fd00000000002793ab0000000000000000000000000000000000f839e12d33b59818ef2c75ad6cb62600000000002793ac00000000000000000000000000015b276619b7e44b88581c3b3ec8c73105dbdd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aac0000001f00000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000064363dfb0c799eec0c8269e6f66433183bf6c37f7e2234fad4e8619a9372c537e1919cc9000100000000000000000000000000000000000000008001c03b33a8add9c7d31e3233f60e0c693b42d934fb0d3f52bddab5333ea0e279240000000000000000000000000000000000000000000000000000000000000001000100010000000000000000000000000000000000008001f7f4833dc97c132294428efeec422636ce1c239bce5bf02e636880857dcd3e7e0000000000000000000000000000000000000000000000000000000000000001000100020000000000000000000000000000000000008001975be6534935da63cb520e30c8a9674feb305536e7cbae0736e1c5dc31145c47000000000000000000000000000000000000000000000000000000000000000100010003000000000000000000000000000000000000800159f59282ad1c7590cb1526beffcda45a315accdbdcdb0a5b7bde54b03ae7fb75000000000000000000000000000000000000000000000000000000000000000100010004000000000000000000000000000000000000800171546ea868c52cba8983fe98c452f2f4048163ebc93f62fdb24bfedc4ed986a600000000000000000000000000000000000000000000000000000000000000010001004a0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800af872dd3e6a02ebeda4ba3deafc051cd84f7589d62ebd8e7fbcf7c73ea51c9dca0001007c00000000000000000000000000000000000080012963987791446a9a1058ac351feb16420deac2b985d28e115eca5f10dce666b400000000000000000000000000000000000000000000000000000000000000010001007d00000000000000000000000000000000000080015cd3a005f0904bca3af40f994d5de14e58d2315bb5422bca81c1e742857a510500000000000000000000000000000000000000000000000000000000000000010001007e0000000000000000000000000000000000008001fba597fd840795242426cb836d79b47b73bfa4a0aeeed075ca8b5a6e0640080800000000000000000000000000000000000000000000000000000000000000010001007f00000000000000000000000000000000000080017c6e5a48c6fc660047c525a4604536863abccddf9ef782a2caefaf8a539f4eef0000000000000000000000000000000000000000000000000000000000000001000100af0000000000000000000000000000000000008001e00c0902f17bebd8dcb0f957c663c2ebed77e035e56eeef005120598a37408df0000000000000000000000000000000000000000000000000000000000000001000100b00000000000000000000000000000000000008001c8fab4d4a01713e89a1e1f88ccd60656025137cf1bb270d9a94a1f13c7bd40e00000000000000000000000000000000000000000000000000000000000000001000100b100000000000000000000000000000000000080011eddcd8a2b51a7cae7f21f7aeda4415a7eccf7b927f4a5faaad03a67317fa3ff0000000000000000000000000000000000000000000000000000000000000001000100b200000000000000000000000000000000000080014f624f9bef0b037e57c770f7d6f52bbab01dc8963c42ddb9a0df431c2b7ddc080000000000000000000000000000000000000000000000000000000000000001000100b300000000000000000000000000000000000080016dc40a41bc043fea35c416748c077c040b8d06c32e2b526915d2c9b6631fe8b80000000000000000000000000000000000000000000000000000000000000001000100e400000000000000000000000000000000000080019239609296398f27dcf3a37832dfd9e1ae6fd027a7295c28e706b094dd3c2d260000000000000000000000000000000000000000000000000000000000000001000100e50000000000000000000000000000000000008001f77444a11c97a6ef1f5b30e03bf54987fc3130dc434183caf5ba83433adfa4910000000000000000000000000000000000000000000000000000000000000001000101380000000000000000000000000000000000008001770985e53debc8d564ca5b526f481d70a6923f54d101f8536d39052ea6a73f52000000000000000000000000000000000000000000000000000000000000000100010139000000000000000000000000000000000000800154b2ad76d78ddb6e0eda879d19e5f6d8ef664b079279ff4d5a7ccfaa237da4b300000000000000000000000000000000000000000000000000000000000000010001013a00000000000000000000000000000000000080015c038eac451eb63f8228043052e2da8f6b179cc1037853ea383dcef9f783e18d00000000000000000000000000000000000000000000000000000000000000010001016200000000000000000000000000000000000080011059b4af132470b41a8cbbe00bf8cec579af3d2b92e3eb53f3f40c0170534e0f0000000000000000000000000000000000000000000000000000000000000001000101630000000000000000000000000000000000008001039b3db807b4064349c2eeae9505c8feabb6cd6df246de52fcc5224daca8dc5b00000000000000000000000000000000000000000000000000000000000000010001016400000000000000000000000000000000000080016ecc8fe04ac2ec406e6cc4dda464e527314faf6b6820bfa23b1d0890187cdffb00000000000000000000000000000000000000000000000000000000000000010001017c0000000000000000000000000000000000008008000000000000000000000000000000000000000000000000000000000000800aafa525a5601ad6b13b4af46ee182408bdf274fff952906d8e96384295da873f8000101a7000000000000000000000000000000000000800800000000000000000000000011f943b2c77b743ab90f4a0ae7d5a4e7fca3e102c0529a669e67a5b046aa1953a8cb653709c50fd578d44458697057bd9afcab7f000101ae00000000000000000000000000000000000080010069271e837be755eb1acd27f8bda5f7e70ce9a7f3282f08bbd83466ba9905630000000000000000000000000000000000000000000000000000000000000001000101af0000000000000000000000000000000000008001f4cce52bae043ef682e0205cca5506f68691acaaa2a1ca9eb1377ad7e58870040000000000000000000000000000000000000000000000000000000000000001000101b00000000000000000000000000000000000008001869fc245dcc1222f3de063ef076585c13e7b7da9e1aa603649e0c67f12d9d3640000000000000000000000000000000000000000000000000000000000000001000101b10000000000000000000000000000000000008001ac5ef41f6c56d8fe802391ebf021fa8b4c3eff8e8f1465ecf8f6fa77f7f4c3640000000000000000000000000000000000000000000000000000000000000001000101e900000000000000000000000000000000000080014cd602db8143a019049a222b0f72d9c0174891ee29f52c82b71059d613ca131e000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000386c0960f908cd937b3f1ede7c1aeefe72d26de8437582712400000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000000000000000000000000000000000386c0960f9e167792774202aa62eece5e445327f35cec4572200000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000000000000000000000000000000000004c11a2ccc14afdbcabcc441b61ac0b036e30722c7d763f3cc2a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000c4b2010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x63335c163', + maxPriorityFeePerGas: '0x12a05f200', + nonce: '0x7349', + r: '0x97ade2e1fe48c2c35194fbb64becbe062f0db4efb96dfd12e578d35a034b8d98', + s: '0x55ac6721ff4947496e861c50990600dd8c0d108d848c6cd84c0c0745a4f09f58', + to: '0x3db52ce065f728011ac6732222270b3f2360d919', + transactionIndex: '0xc', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x133d3eaae97b599d7d7d3538b81c0b393bd00620', + gas: '0x5208', + gasPrice: '0x595e276a3', + hash: '0x7aa9ab138d57ba3ca97edde17570ec90bad03e5c0e2e39ef6f2d57b06906e947', + input: '0x', + nonce: '0xed', + r: '0x86b3a704ae340159752e67577fe3ddada1e797fc1b73108377f42ef6f33d3406', + s: '0x6cc32eba9bb9d489399e4c91a9d08225462de2235e12652b1f9474fe67e479d9', + to: '0xcbd6832ebc203e49e2b771897067fce3c58575ac', + transactionIndex: '0xd', + type: '0x0', + v: '0x25', + value: '0xebba65a5bc3344', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x2b6ad3b0a4ad782a553fe9ae179219f877bd0c47', + gas: '0x5208', + gasPrice: '0x57ae1ff95', + hash: '0x0aa9988e0a851495beb7ea8d0f48e30042167dd98d932cf32535ea60c7c39e2b', + input: '0x', + maxFeePerGas: '0x57ae1ff95', + maxPriorityFeePerGas: '0x57ae1ff95', + nonce: '0x26', + r: '0xc517daac09fdfa297b8ba5c19a6edf0c6c84321134384505f3cddc759eb11e18', + s: '0x441ba8e95813878382988533fbd81f8e3bec9425d7c721679306e74aac434517', + to: '0xf34b40c1e9fd13f3aef7e31b69926b2ae97cc5f0', + transactionIndex: '0xe', + type: '0x2', + v: '0x1', + value: '0x2302bf1686f0de2', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc2978441f46a76c60e0cd59e986498b75a40572d', + gas: '0x1fe9b', + gasPrice: '0x55ae82600', + hash: '0x1752d428626dd31ea7546beb62e2c5d6a27ef9f37e14954a8e6d2e4e290b8d92', + input: '0x0ce28dc4', + nonce: '0x3437', + r: '0x230800eb5628222c1b97d09d1cb91e26e2e4e003cea1b1061d3f35d0e340f770', + s: '0x250c820942d9a1138a731a5de121921ca1d2a328e64bd35c42531b02f2836790', + to: '0x52a494dbf47107cc0c624ee10703abecaf586776', + transactionIndex: '0xf', + type: '0x0', + v: '0x25', + value: '0x58d15e176280000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xec30d02f10353f8efc9601371f56e808751f396f', + gas: '0x186a0', + gasPrice: '0x513db5909', + hash: '0xdaa6805bdf1f554cfc744fe22a6661642c87141467b7f14edd0f946c9cb0f8ce', + input: '0xa9059cbb000000000000000000000000735d8715bc1b4a404f19236fed05744ab6da094200000000000000000000000000000000000000000000000000000000e6fb16b1', + maxFeePerGas: '0xad83f8d9a', + maxPriorityFeePerGas: '0x9f943785', + nonce: '0x873bb', + r: '0x81f54732c008f3fd03812f57a6deb5822533e3b5e9b50b97574d84c3e31a40e0', + s: '0x25ac62ba0d877945882f4430861effec04ce0e69903b04fd38124c881c395d2e', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x10', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf16e9b0d03470827a95cdfd0cb8a8a3b46969b91', + gas: '0x186a0', + gasPrice: '0x513db5909', + hash: '0x3fd6e1a5c50cf84d53f9b6809db62d919121259b0de6869a8ee3ff9622c75806', + input: '0xa9059cbb0000000000000000000000008c897cfe223374d2ba76cf9562283647efa842e100000000000000000000000000000000000000000000079e4e62fe1916184000', + maxFeePerGas: '0xad83f8d9a', + maxPriorityFeePerGas: '0x9f943785', + nonce: '0x1ae4ee', + r: '0xdb8d01754137e016371d9b69b1516509ac98eea529e2b027d853be60fe3fb0b4', + s: '0x7818762d95b751f04d905e25843191891c8047d7bd3ad3a3d11366aac70cda1c', + to: '0x4a527d8fc13c5203ab24ba0944f4cb14658d1db6', + transactionIndex: '0x11', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xcbec560dae217b1d6303f23e25e547ce008d10bd', + gas: '0x2aee5', + gasPrice: '0x5094a1a84', + hash: '0x608372f0608f5466eeb44c5b28408a80af6e1feb410bfe57fa5f6c6e267bec3d', + input: '0xe2bbb15800000000000000000000000000000000000000000000000000354a6ba7a180000619a3f4a80e465251b5ab251d36993b9b2d074b539fb1041a69f9cccb3f20ef', + maxFeePerGas: '0x91d3fadf6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x271', + r: '0xe04214b243d0671e37a53582b0eab23c8b313f6391805053a8ec1bc5d3494c3a', + s: '0x76174f10b93f6cb35ad6d51e2931b0eb3841353ae17ad0583b4a78ea2a4428e4', + to: '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419', + transactionIndex: '0x12', + type: '0x2', + v: '0x1', + value: '0x36e7825f3e4e4c', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x46e0ebb66c75743ea7cf223830b6d01d26c9d2e5', + gas: '0x2aee5', + gasPrice: '0x5094a1a84', + hash: '0x9295f62e92616619793b77a3b7577b2b6617a3cd21dd13f87164689c444d64f5', + input: '0xe2bbb15800000000000000000000000000000000000000000000000000038d7ea4c680000441f477690a582f4f52b0380bc84e65830e76fcd3bdf8079bb13c8bc3abd6c6', + maxFeePerGas: '0x99315cec6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x42', + r: '0xd19f281c9210eff7c37c0bfbbf22837cb6fd997e8aa3544d9ef310abf139f4ba', + s: '0x260e9f08a252f6333a8a6ab4bc604a56864c7baf0262270e4d1e90f851a4fc06', + to: '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419', + transactionIndex: '0x13', + type: '0x2', + v: '0x1', + value: '0x51fc9fd45496f', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x8d456f39cca30dfd46f9be8e2fb38d396a3bb986', + gas: '0x2c08e', + gasPrice: '0x5094a1a84', + hash: '0x11b54c9e279fcbb97484fbf4a27860f9c13768ca21f11e4df82041b0ca33df8f', + input: '0xa1fba2c7', + maxFeePerGas: '0x9b078d0f6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x8', + r: '0x5f9624fb030af3719a6e80a5ec7acfe618c5c69cc339e1ee6981deb160beb577', + s: '0x024061ab760e7608b5354782d67bddae9efa30b4a9046380db24c53734cf33da', + to: '0x1785982cb0386d9862ec1968e0152656d44d14de', + transactionIndex: '0x14', + type: '0x2', + v: '0x1', + value: '0x5543df729c0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xfb53f899904110fdc3235531b0cf86676064db0d', + gas: '0x2aed3', + gasPrice: '0x5094a1a84', + hash: '0x2c8a744c0124abfe06295471c805dd0cfbb6a42675cf56d54c1ba851fa8dc3a2', + input: '0xe2bbb158000000000000000000000000000000000000000000000000006d6c6fd3150000017158a89a490a43c8482e8d04d68d0c796de7d1309f32e0a086646979119e0f', + maxFeePerGas: '0xa2e1a1790', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x0', + r: '0xf1c2dcc6602bda7edeb16a34321c9eacc2d8501a4ffcd9cce95e143ce41f3ca3', + s: '0x4729ae054e94b1460aeea560cf6809203d61aeb2f6ef64c052eea07e4b0a421b', + to: '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419', + transactionIndex: '0x15', + type: '0x2', + v: '0x1', + value: '0x6f09868ab1ce4c', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x345dc49ee5636a43395687a898bc0c3c9ee5ff0b', + gas: '0x2a234', + gasPrice: '0x5094a1a84', + hash: '0x90cb790f159d0a8fb4de0bf9c53d95ce48748251da20e254591c8a29960ddd23', + input: '0x7ba0e2e7000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000416097a47543c8d60cd5bf5cafe3ee94e07ed04747405d965d1ff864c6aef2fd177a6ee6b9f8286d9f37bdd0eb63d4b2cfef30f253fa850ffc4b062a4d13c216b91b00000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x91d3fadf6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x5', + r: '0xb3360d4cd6c110385f6e6416239ddfd53ba09a49425090d899b6fa286f062a17', + s: '0x038ed6befae17a39a04d0da0c11541a8ae3e34a81d5e0218c2cd59f2fc106db5', + to: '0x85c4209f7965d36742291f9222bd2cdb104df75c', + transactionIndex: '0x16', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xa077f842d93c51b7b951c2f9935d33251d7fd774', + gas: '0x2a234', + gasPrice: '0x5094a1a84', + hash: '0xc94887918fa6e72ecb1e92297b4e6d8bd157dda8be8e71d21015bef1c5da2758', + input: '0x7ba0e2e700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000041cdc740e94dc367f680e9f3206f8981512af64d2abbcd486762c803a993b49f3b7d2358851f6acbd6fb2035ea06f026cd707cd66483b32dae34d34599d8d601ac1b00000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x91d3fadf6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x5', + r: '0x8776838f6f0b5880ad1f47d293a59784fdfc1da6a213afaa394dc39c819f66ca', + s: '0x5e06ead719af63b45434941b53a7235820e6392652968f704f47f7ac88a54da3', + to: '0x85c4209f7965d36742291f9222bd2cdb104df75c', + transactionIndex: '0x17', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x22d3a981255bd90994b8acbe3d92a0a7a32f5120', + gas: '0x2a234', + gasPrice: '0x5094a1a84', + hash: '0x7c9a5723528a8c953a6d89d5a3e11d939bb22073763cfaa9b67f23bc643754b5', + input: '0x7ba0e2e700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000041faad3bab3c95fe38e7dbc756151801f249731190c6a2b5a8d8d2625e0f3abc684d85d460d453db0b9faa5a3186c17394495e4d51e59faa3f4a43de038ed32ac21b00000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x91d3fadf6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x5', + r: '0x77576eb7635253c0111415988d87d125cccc034e3e0a5537d45f542dc6d9fb17', + s: '0x51a3782c39cfd538278762b099ae388da8e4563110cafb577e14387e7bb5bf8a', + to: '0x85c4209f7965d36742291f9222bd2cdb104df75c', + transactionIndex: '0x18', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc956aee2bdf34512a2f770d1d38e63f1f40710ee', + gas: '0x2a25c', + gasPrice: '0x5094a1a84', + hash: '0x75d304122e20c4e61e1be6f10e8a2bfd7172a3d2f44f123ce439e2697adc37c3', + input: '0x7ba0e2e70000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004188f77ebc61cf68343a92f7c4b74709787bf867ad808c8c7c1c3b0b30a25d50e23e6685adcdbf01ba9e0796ec8c4764f2afe3dd3f2cc34d3106a3cba7371132921c00000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x9b078d0f6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x5', + r: '0x77cbab6be06d2c0d7e7e281e6b74bf86d54b1e6eb0d25164e34f74ffc4b13491', + s: '0x76ddd4fe48f97b00c8222b87d281531a8602657c5fa47b1b1e3beb0a68f76db0', + to: '0x85c4209f7965d36742291f9222bd2cdb104df75c', + transactionIndex: '0x19', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9a41a21ee7ea7337dd60d05f39ae3bd5d265dbe2', + gas: '0x31165', + gasPrice: '0x5094a1a84', + hash: '0x5b0805bcb55a457729c0e23541205aace38077d5d0ec38f8c4981b6ac10ad444', + input: '0xf0300d60', + maxFeePerGas: '0x9ae3aec86', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x1ce', + r: '0xdee01e58066f39f49053a1caec721704b27d4455cb7f66051567babff2eb0207', + s: '0x5d57933f7f188c8bc3df76c4eddfed42952b24852cb5e99cc46c021d032635d6', + to: '0x5e9dc0b770db326612bb31605bb928ad125c95b3', + transactionIndex: '0x1a', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xb253c877efad2a87b18fba1687d41456141891a5', + gas: '0x2a244', + gasPrice: '0x5094a1a84', + hash: '0x87a851cef867e8b76c0f00049bccf3eb95f41a4e0ed5f2656d3f029ec321aefd', + input: '0x7ba0e2e7000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000413b8f759048704a4af30717de9e4ad5fa72c6412d7689d2bb73b40c01bcc020301a36256724ee3be2d7ccee88bcbc25e2388ed2d01383bea4397c94a44b00cdc51c00000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x9b078d0f6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x5', + r: '0xef7fa2775201d5e1f5101efde47666dbfc1263000898b2ccb39302b5f57b0cf5', + s: '0x0c36ff2062572a18a4ac9452b0530737d655c4cb0a688c5219a8f2b40a94ef1e', + to: '0x85c4209f7965d36742291f9222bd2cdb104df75c', + transactionIndex: '0x1b', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x7050b357db12b47c03380d5786950214677cb4a0', + gas: '0x2aee5', + gasPrice: '0x5094a1a84', + hash: '0xc4fb4a90055b52891b9ee9ea13e59bfa08fedd2521212a2538a54ac15948694c', + input: '0xe2bbb158000000000000000000000000000000000000000000000000010a741a462780000100c4bce2633a97e0e5325143024b3070c458d89194d53a6fcc18d780a36b22', + maxFeePerGas: '0xa2e1a1790', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x3', + r: '0x27e5b0cdb7348293f5deacfb04ae58a846bf98f175a10eb24739e972012365e5', + s: '0x3226f6635c7c552345d376494cdfb148e5a055f4ecb0cc478de88ff8786ea6d8', + to: '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419', + transactionIndex: '0x1c', + type: '0x2', + v: '0x0', + value: '0x10c1130fdc44e50', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x48231a84eb1d70ac7cc33aa8cb6069332ce56ec9', + gas: '0x2aee5', + gasPrice: '0x5094a1a84', + hash: '0x9a6210559642f06ad096806f546af798f6b9d1a69f246f830a23ba96df23c70e', + input: '0xe2bbb15800000000000000000000000000000000000000000000000000677d94a64ea0000250cd770ed0fb0328249c83c6ca6b96041eaa60f240fb3f1c0ccb54a7287169', + maxFeePerGas: '0x9ae3aec86', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x0', + r: '0x04702957442572f72da0ae712be49cc269bb8f2974b340a7df77394d4ca8e853', + s: '0x20cee42bc08f88c23a9a1ebe77475786f1f3459a3d14a783caa38e4484066d39', + to: '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419', + transactionIndex: '0x1d', + type: '0x2', + v: '0x1', + value: '0x691aab5deb6e4c', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x4184bc5e5444f250767e8d33a49817a9b4fb0df3', + gas: '0x2a234', + gasPrice: '0x5094a1a84', + hash: '0xc36c5f21974222581b9626833fe32d99e1953be7a84f8de99289799b6c28cfdc', + input: '0x7ba0e2e7000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000410b166aab505f074b7a0719c22c6e910af13c500c439dadf57e05b7d02197f1526e851f81f4e0788cb80b9486810f59d741d836f8bac1752e4eb4d65c401c8ec21b00000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x91d3fadf6', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x4a', + r: '0x2ce125ff66ac8118b1f129c2588ab2ea350a8c63c5b66fdfdc95a0910f92ab1c', + s: '0x317975d171208e5d462074dd336c22f95b81cce40e9689f9f4df9249327335bb', + to: '0x85c4209f7965d36742291f9222bd2cdb104df75c', + transactionIndex: '0x1e', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x151b381058f91cf871e7ea1ee83c45326f61e96d', + gas: '0x5208', + gasPrice: '0x4eb8bf7c4', + hash: '0x5555125fe67d3a36555050d41b8ca19ff036d6a338add7c285eef925100b7d49', + input: '0x', + maxFeePerGas: '0xaf75aedb8', + maxPriorityFeePerGas: '0x7744d640', + nonce: '0x74102', + r: '0xc4935d7c1a6ea5a50d1c66a75518c30b60646f6bfd1891aef7d58f0fab97353a', + s: '0x03a60cb1ceb8d9a92e170cbf290c99a9b97492b471f33f92e0cdcf7299e9f33f', + to: '0x29d0b29472432459eeb43003876bc3124334cdc5', + transactionIndex: '0x1f', + type: '0x2', + v: '0x1', + value: '0x3e6aaf5ee5cc000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x59e0cda5922efba00a57794faf09bf6252d64126', + gas: '0x1d4c0', + gasPrice: '0x4eb8bf7c4', + hash: '0xc9b0ffd52b2d3179cab61f22302eed123144dca2367455f0b26cbd57a54d6d6f', + input: '0xa9059cbb0000000000000000000000006767526a362ec6c6b1df185478e4f01506b73ff300000000000000000000000000000000000000000000000007caa2b492b20000', + maxFeePerGas: '0xaf75aedb8', + maxPriorityFeePerGas: '0x7744d640', + nonce: '0x6c27', + r: '0x58746264bcce9d42ce4d35a4677aa1adddc9996e9be421dbaa99f3d2a20aa391', + s: '0x334e4d5cea9d1860d914e7796cf68f97677c87772b3885e0f93f7a4379abafdd', + to: '0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e', + transactionIndex: '0x20', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x867bfa133d64fad734c89f886d2a169b6504ab2b', + gas: '0xc350', + gasPrice: '0x4eb8bf7c4', + hash: '0xb47865548d28112a9b37e3909fe2310918a4a70054b2e10f0a25b81ad2bfd695', + input: '0x', + maxFeePerGas: '0xe8990a4600', + maxPriorityFeePerGas: '0x7744d640', + nonce: '0x1227b', + r: '0x59b0898abc04ad8077c95c705e2df2ae6824b40685159f03107f68188ea5361c', + s: '0x4a1e52473086dc9cb96768bdd8b02cc153aa6b0bdd9f08e12c047c176b800ae8', + to: '0x99383ffe2031379e1e829e106e29a785c9f7f498', + transactionIndex: '0x21', + type: '0x2', + v: '0x1', + value: '0x22ddf7aac722000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x5ab96bd81c33a620dba024c797a78b02b3964849', + gas: '0x5208', + gasPrice: '0x4eb7cb584', + hash: '0xeba0d7487248cc40f7a9784f20c879cc358231ac73cb56900629b11a2de6ef23', + input: '0x', + maxFeePerGas: '0x684ee1800', + maxPriorityFeePerGas: '0x77359400', + nonce: '0xa', + r: '0x41643f403bbe3262d39ee6c1449d33d96bdd1227f2d6967ab193a53f1f0bfc48', + s: '0x31ae8fa9994acb3d17ce5ac4028f139999a674732a0cd9e095d6dea890d0c550', + to: '0x1164c6c18b6de4831305050f5b32e2807e2bfc32', + transactionIndex: '0x22', + type: '0x2', + v: '0x1', + value: '0x263bee6bf38e8', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc5a93444cc4da6efb9e6fc6e5d3cb55a53b52396', + gas: '0x5208', + gasPrice: '0x4eb7cb584', + hash: '0x77fab2e3ef8460a5259e7107cf0cbc1a1e31678d112aaf248b2108159b4416a3', + input: '0x', + maxFeePerGas: '0x9c7652400', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x13403f', + r: '0x673b786b4a389f7fb0df5862ab0703e3685ca0081d321b8ac8b8c2ecbf7ee412', + s: '0x6be2172fda36ea57d7c77dcc46de306545d4f3abf96e7db6e24a3c9e44427974', + to: '0xc8898aba27d521c47055ed2c493cbfd6b95a31d4', + transactionIndex: '0x23', + type: '0x2', + v: '0x1', + value: '0x11e7da71ab0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x28c6c06298d514db089934071355e5743bf21d60', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x216b046ab639e61930add4323bf64b76d91db121963350632ed82f26bb6de7e6', + input: '0xa9059cbb0000000000000000000000007f263315e03eeef6c03ee385b15695bdf87cbeb1000000000000000000000000000000000000000000000012f5e3653d5caf6000', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x62108f', + r: '0x93f820e51bbd9cee9f3f1b94fe8f7676d4346fe9eacd549a2d07e434ab807cb6', + s: '0x030da66baf90a7e72379224c0863eb3b4e31cc94b0d86177b91950d644c8f406', + to: '0xc18360217d8f7ab5e7c516566761ea12ce7f9d72', + transactionIndex: '0x24', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x56eddb7aa87536c09ccc2793473599fd21a8b17f', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0xd39d9a75f852bcb051393709ddb894ee043b7ea18bc21ce4ebd5a3560142b60c', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x46e01c', + r: '0xee36304a0224b72a556eb71ff13d8cc1d3bdf6d864c6ee0ab0e9b832d556185f', + s: '0x50e293db57ca81487fc0f896665b4e9d5802a15c24fa0dce5803e1e663a84c10', + to: '0x69f1918cf0661b1b8dce3aa2137e4659d8493e79', + transactionIndex: '0x25', + type: '0x2', + v: '0x1', + value: '0x70f9ee77db8000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x575cc48e711d8faacf051502a757b90c11f8547d', + gas: '0x30d40', + gasPrice: '0x4eb7cb584', + hash: '0xb7f3dbb72b2f8fe579b81a3ec11a56008b09d90f2a5267180fd8f966a1b76cce', + input: '0x23b872dd000000000000000000000000a2afeae98f8ad0d8c30be323ca461754380fce49000000000000000000000000d1cd4e06e6034c31bd9392013a55d954e6fdcb740000000000000000000000000000000000000000000000000000000024bb178a', + maxFeePerGas: '0xa104cb290', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x90b', + r: '0x0a45e7222c8203898f7f894dfa7ade58603a8d7d4332697d37ac69a7a027cd75', + s: '0x06ff5b1b6e1fce12a9ff1f52acaa153fcf89d4fb6ee4e6afcbbc146630707c40', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x26', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xd1ff134d20fc3a224bd9bc0877bb24a23784dd56', + gas: '0x5208', + gasPrice: '0x4eb7cb584', + hash: '0x2bb7f5e1d071f0dc7040fc1ae745274a456e25610cfcfcd38e9cb3205f227222', + input: '0x', + maxFeePerGas: '0x5d21dba00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0xb', + r: '0x4b287ee6e4333f64742044706f5c8c00e6e60d7501682c1314cb5211b8c8bf4e', + s: '0x37f5eaba2b575d587d019257d29b5bc097705571aa6280526a9007c2ae8aece1', + to: '0x8412abafccf6f5756684f14e0aabd23834af7789', + transactionIndex: '0x27', + type: '0x2', + v: '0x0', + value: '0x1301c7dd343156', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf89d7b9c864f589bbf53a82105107622b35eaa40', + gas: '0x15f90', + gasPrice: '0x4eb7cb584', + hash: '0x6c53f5e35d76bfaab1d1eaa75b553da7bed8fe046f90961441474c6852b0469f', + input: '0xa9059cbb0000000000000000000000000cca85946f37dfb7d7af154155c1eff595479e530000000000000000000000000000000000000000000000dad417aeaff88fc000', + maxFeePerGas: '0x174876e800', + maxPriorityFeePerGas: '0x77359400', + nonce: '0xb2615', + r: '0x6faa89b9d6e984f3df4d9c1fefd468f54099081ae3aa06de5fc80a9251ccdb55', + s: '0x293017e31f66be92bdfd04c3302a0c2ed173751ceec4fd14b9c4ef64656f8c62', + to: '0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24', + transactionIndex: '0x28', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x28c6c06298d514db089934071355e5743bf21d60', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x346d0ad3d6a351797184f880b08b913dd095d12f36ade9e75eb7cba6980dbf34', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x621090', + r: '0x883dbc540ae0a26dabcc4463651a74b8d2782a590e0bf0de731df0572429b928', + s: '0x207fd537c0809bbc87d42cf79f08f7f73795c7ae21ef01c79479485519a415fa', + to: '0xfed930b2dbbc52996b2e107f1396d82256f41c41', + transactionIndex: '0x29', + type: '0x2', + v: '0x0', + value: '0xe26ea512c27000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x56eddb7aa87536c09ccc2793473599fd21a8b17f', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x209624ade75ef69c5b0b1c8d85ebb1be2a084380f3eff7fb15fafc6d607da908', + input: '0xa9059cbb0000000000000000000000000f380d4a0afb298faa4cf6d1d16534470140480f00000000000000000000000000000000000000000000000000000004a817c800', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x46e01d', + r: '0x78a34604e863d7e6467d40f21d161d99794bcf9424b95d5bc6f942c6d2e7d5f4', + s: '0x3d4a493c0aba95406299f7afbf026ca87e9c21fd9d864d16884ee777979c54c5', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x2a', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0xc76320b5a1943478674adc1c81ec441e0798525ff8c5aba49a13e0feccfbb6b3', + input: '0xa9059cbb0000000000000000000000008fef490d614fce8b93bd6f28835dd35a8b3229a900000000000000000000000000000000000000000000000000000e789541059e', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x599696', + r: '0x7cbc768027ad0dee1b9d3d31f2d2d9f95c116c24ec80efc69fda640fcac35705', + s: '0x6d0cf162a13339f2caf1a4f323671a88684ddd29d7a8fb554e45abb00599fea4', + to: '0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac', + transactionIndex: '0x2b', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x4976a4a02f38326660d17bf34b431dc6e2eb2327', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x79474757728de960eb4e7da5bd14cd3bbaa342a1f15a0e02920020bc17293e98', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x264d0a', + r: '0x27451446f19d4db1ec9a7523ba550878049af134e6e91bb4cfc706bab8ac9df0', + s: '0x2924823e0512b4ac49c5eb479231ad53d15459f4a78309d7c669bab355e27086', + to: '0x8bb27f2b2240f2ee95648a216bda95e7d7ad59a9', + transactionIndex: '0x2c', + type: '0x2', + v: '0x0', + value: '0xd6f06df0e94000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x3ab28ecedea6cdb6feed398e93ae8c7b316b1182', + gas: '0x2934c', + gasPrice: '0x4eb7cb584', + hash: '0xcbd72caf3b24a675faac5188b7bc15768c2bdd4e6a2a8c60ce79f1875b36b4e8', + input: '0xa9059cbb00000000000000000000000019697dfab84c1982138419a3be21eaaa7c05c1c700000000000000000000000000000000000000000000000527c712237ba60000', + maxFeePerGas: '0xe2d17967f', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x59e4f', + r: '0x58e964390fae81b120e526d35bdafca451d00d77f72cabcadaa63b2141ec3eb0', + s: '0x2fdc669bc14bc9903b59ac152858f082f534624a501f2f0009dd0a956918be0d', + to: '0xba11d00c5f74255f56a5e366f4f77f5a186d7f55', + transactionIndex: '0x2d', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x21a31ee1afc51d94c2efccaa2092ad1028285549', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x2350e1d8dbaaef1c51429dd50f319f7ae0c60681b17e925abe7f6b79b85bdf6c', + input: '0xa9059cbb0000000000000000000000008263a4b989d756babaf651a9cbf171231466666600000000000000000000000000000000000000000000000000000000b2d05e00', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x5e0f0e', + r: '0x3a36d0faf9eb3c59ca4e7bbed74a3491b5fd2d05c17c34fa02d84cee2071c7b2', + s: '0x64bdeda9880342582fab87c9b05e98823fa49bb8dfbd772dc2a246fc863b7bc6', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x2e', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x76c881e0add6fbe11dfc4396ff8f373f2bb1cc27db929b95a21cd64b7dc41e11', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x599697', + r: '0x6e69d854012faf58c3ade90b0953359b8d8f3f7619960e9fc6a745be6afad0cc', + s: '0x74473994719dd6c24c8d850b1dabcd7a8a993217c16d542ed7f4a1ec34a8906e', + to: '0x655da9d1fdba5d7cbe0738f71022918ad75144f8', + transactionIndex: '0x2f', + type: '0x2', + v: '0x0', + value: '0x859d63b3453e6000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xbd310c947981b291a1abb439ab0713f6a6018f35', + gas: '0xfbac', + gasPrice: '0x4eb7cb584', + hash: '0x3ec134ed1e10df2b1b78311fcd38325b2da8e5da5ecfb60573909450a04693e4', + input: '0x095ea7b3000000000000000000000000e66b31678d6c16e9ebf358268a790b763c133750ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + maxFeePerGas: '0x649534e00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x0', + r: '0xafbb17abe38e32f14f34cfa09f93876fddfe80b07f2bc54b27cf5ff6093e3bf2', + s: '0x553821eca4f13c424737eac999b1a7997295252802abe049884554766202fc68', + to: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + transactionIndex: '0x30', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xbd310c947981b291a1abb439ab0713f6a6018f35', + gas: '0x460af', + gasPrice: '0x4eb7cb584', + hash: '0x8587b3eb001a4d9c367b44d3c66d864bd086f7def58681fa568c25c1632197fe', + input: '0x5cf5402600000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000bcd3d800000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb3900000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000000001286af479b20000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000bcd3d800000000000000000000000000000000000000000000000000000003e2b71f0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb82b591e99afe9f32eaa6214f7b7629768c40eeb39000000000000000000000000000000000000000000869584cd000000000000000000000000382ffce2287252f930e1c8dc9328dac5bf282ba100000000000000000000000000000000000000000000006acdf8f63164363ecf000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x649534e00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x1', + r: '0x5da32c14819244d81966203f8ece7d4330dfc90d43237b769679b89e308ef01d', + s: '0x0bb911307432a6dd7acc0155a43f398a66865e941202c8f37fa31f87a7be5748', + to: '0xe66b31678d6c16e9ebf358268a790b763c133750', + transactionIndex: '0x31', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xcbf04eac5a3443941ce6a41ff38d7e238406f0e4', + gas: '0x186a0', + gasPrice: '0x4eb7cb584', + hash: '0x4e52482e36a15ab65b1ee34d20f93b54cd1873e1b596c874364c59125dd23b62', + input: '0xa9059cbb0000000000000000000000006cc5f688a315f3dc28a7781717a9a798a59fda7b0000000000000000000000000000000000000000000000258a3df7f069706400', + maxFeePerGas: '0xa3e9ab800', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x1260', + r: '0x526cda6518d213796112450510e637aab66ca0e7cf37e17ba16c95b05e799bb6', + s: '0x24e98f8aae7e8393654d1c5d6ca56d07776bba3985d930fc13753729a8b53fff', + to: '0x0b38210ea11411557c13457d4da7dc6ea731b88a', + transactionIndex: '0x32', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x89e51fa8ca5d66cd220baed62ed01e8951aa7c40', + gas: '0x7a120', + gasPrice: '0x4eb7cb584', + hash: '0x5512e2f3ae0e44b1993cbfcea2f91fbc8e6cf2ef6bc73b606f19db051935c30b', + input: '0xa9059cbb00000000000000000000000016c9d209a906bbf06bd29c233c7f45b76e42a5180000000000000000000000000000000000000000000000000000000002dbf090', + maxFeePerGas: '0x1329a0487f', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x16cd82', + r: '0x60a123cc67d102617f60161435641e16dcaea9dde4c80fc1a1c4b3324f8c57f2', + s: '0x4dfb246eebc7ca04821a922fca1177f453462a2ae8803e33e87285fbd5f8eb9d', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x33', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x3ab28ecedea6cdb6feed398e93ae8c7b316b1182', + gas: '0x107a5', + gasPrice: '0x4eb7cb584', + hash: '0x47effec3066af633b7b8e31eb958720b3c26101a660b68294cfd5d1da9df660e', + input: '0xa9059cbb00000000000000000000000019697dfab84c1982138419a3be21eaaa7c05c1c700000000000000000000000000000000000000000000009c8315610cda546000', + maxFeePerGas: '0xe2d17967f', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x59e50', + r: '0xed0cc2008fa60ceef899c73967869cabfe3ca8aaaa9abf6c94fa0c7f211fd82b', + s: '0x6644f22c84aedc9f50595a80c99641db7ed63487cef46bc98324f214b1ac1088', + to: '0x3593d125a4f7849a1b059e64f4517a86dd60c95d', + transactionIndex: '0x34', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x56eddb7aa87536c09ccc2793473599fd21a8b17f', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0xd6356b5d6aba735dad22a19dc1c6f1e90dc5b9cae6981e3242b551da32a56420', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x46e01e', + r: '0xf9f8024c8a5a8d315e8a0ccf510e8547d62c69b9636919f377ee842232859567', + s: '0x5390ff89bea1d8b8266a335008feec1c358b4bd1becf0dffde1786ccdc31201a', + to: '0xf229c5f132d805bc540347f4f09cae4beb1ce2fc', + transactionIndex: '0x35', + type: '0x2', + v: '0x0', + value: '0x44913f6c2a40000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x21a31ee1afc51d94c2efccaa2092ad1028285549', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0xd2ae45072ed92e1c0f0dc9770700e2aea61c564c3cf9966043fcb4ff503e6bc5', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x5e0f0f', + r: '0x7ef2595e0b05eb9a2780638182a91cf79fa9a4176f9664c429812813729fca60', + s: '0x46cb312550a3e0f046798aff756ab0ac2517a1e44272e2928351d0ecc2192359', + to: '0xd5e7c8051bb55471e65c77735246037b88887794', + transactionIndex: '0x36', + type: '0x2', + v: '0x0', + value: '0x7357ed86abd800', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x4976a4a02f38326660d17bf34b431dc6e2eb2327', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x3a9d565f5193dbfd7bdae074e6405d6cd0d6334a99b23d4780afdf70730ea265', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x264d0b', + r: '0x014efa044805a0b57331d02fdc260ed97eddd05a65671ca559349f0740c02f5d', + s: '0x5acb03bf01c45c1d54cc92048c16cfb0c1502e37977351dfeffab81516b3d530', + to: '0x7959c8788c426988cb5dc3d7d164458af8ffc1d6', + transactionIndex: '0x37', + type: '0x2', + v: '0x0', + value: '0x109e2955efd8000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9696f59e4d72e237be84ffd425dcad154bf96976', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0xe3a4f72856bfda9647b3699182bd386445ac649dcc8b1ce16e00ffcfbf4ab7ed', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x41987b', + r: '0x26586b1e9ee91d0d5a1a67c115e3ef25af632bd04f669dabd629cc2ff73b7bad', + s: '0x5a5f39c4da031bff3bc027f717750ca4aee70a2fcba228fd3cf89a15eb1208e0', + to: '0xe0b27a0f1bae4128dd35cd1cd9591e2c9e25c14e', + transactionIndex: '0x38', + type: '0x2', + v: '0x1', + value: '0x124d2084a70f6800', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x3dce71f75f239acf6d96e21185b171113997cb94', + gas: '0xc350', + gasPrice: '0x4eb7cb584', + hash: '0xd8640e034189ad0e1c19c56cc4283d58a6fb953eb4b07490f1908de722939c36', + input: '0x095ea7b30000000000000000000000003018018c44338b9728d02be12d632c6691e020d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + maxFeePerGas: '0x773594000', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x0', + r: '0x06a9fade08677d36f80060a150829cf89b6a5d93a6bd49125ed445c06e8a2070', + s: '0x71caad84e2b4ad5abf4f0e7819a0c75b78d82cec724bc00f9871c6cff20cc1ee', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x39', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf51cd688b8744b1bfd2fba70d050de85ec4fb9fb', + gas: '0x33450', + gasPrice: '0x4eb7cb584', + hash: '0x52afd7942b5e6b188b162fbef65fea001d87904a218a1863cd55e35c38152d32', + input: '0x', + maxFeePerGas: '0x5d21dba000', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x1106f', + r: '0x71ed70b9d1c74ae1ad4feb6b4df85667ffdb140cd33598a671ce6132b4705023', + s: '0x522d3672a3ccd0d19a9219b07cfa50330016c40eb6747a3b0d01d429de6b9162', + to: '0x53d583a2e9d318f770355a502730e074a77704a5', + transactionIndex: '0x3a', + type: '0x2', + v: '0x1', + value: '0x1aa535d3d0c0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf51cd688b8744b1bfd2fba70d050de85ec4fb9fb', + gas: '0x33450', + gasPrice: '0x4eb7cb584', + hash: '0xb261c0e8b9db2323039cd792af63941d6891e59f9a47fb920a1cfa70188284a3', + input: '0x', + maxFeePerGas: '0x5d21dba000', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x11070', + r: '0x79abe4e602462702a701e8e8dafb766b49e1d0b5090f7d07067e8712d0fc1d79', + s: '0x68fae44682a2c1eb0f4c61013f26716b3146e0874b46ca5f3956c882d577c3a0', + to: '0x6a53202a46f1d598bb3e1bd75e76325be9e85a62', + transactionIndex: '0x3b', + type: '0x2', + v: '0x0', + value: '0xd2c6806d3c0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf60c2ea62edbfe808163751dd0d8693dcb30019c', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x545a0dafc33502a9e74440ffe4aaeb896a6c2248c1d5e02b2a211936f97fe375', + input: '0xa9059cbb000000000000000000000000e64fe3abefb9ef257a5468e3af3ce839d2801ad2000000000000000000000000000000000000000000000000000000001af6d8e8', + maxFeePerGas: '0xdf8475800', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x19015b', + r: '0xdccc9185a0dabffd612a8e3e7965e7e3e1827ea11375eeca23fa17f0e313f092', + s: '0x242f817d6ac64b27ce324d57167990b12050ce197d875b7a77407dfaee1fe34a', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x3c', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xdfd5293d8e347dfe59e90efd55b2956a1343963d', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x5e48f0c28319b84d3ea08d316b91dc23d6ddcff46c4064760d2f83d848ede467', + input: '0xa9059cbb000000000000000000000000df90abe5ed346a74977b5d92ac6a264e25a9c51f0000000000000000000000000000000000000000000000008ae2b2e0ac12e000', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x599698', + r: '0xd42ab7d5efa8e62fc0aeb51c5f9b674f936d282c31f601fe51bc4cb00d958f59', + s: '0x04b83091ca937fc4f64b29c36406d4fed6b47f6c247ca86b5c0b4b3eec3110bd', + to: '0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e', + transactionIndex: '0x3d', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x56eddb7aa87536c09ccc2793473599fd21a8b17f', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x848514cee29d37999e27991e25c2cd58edc0486fdbcd2bf673a14d0e37bc3d12', + input: '0x', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x46e01f', + r: '0xc30f5f8b8d05b1a5c3b74669ff383d2588fa86c0f35d5066e2815b144a61199d', + s: '0x16b0c495b6cf1d01675d907a480460a57e715da42365140dba84cd035629a213', + to: '0xa294cca691e4c83b1fc0c8d63d9a3eef0a196de1', + transactionIndex: '0x3e', + type: '0x2', + v: '0x0', + value: '0x31e0da46bd4a88000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x28c6c06298d514db089934071355e5743bf21d60', + gas: '0x32918', + gasPrice: '0x4eb7cb584', + hash: '0x5c1464d4fd1ef55d3fc1c1e9338917273b1d2280fd06fe04afa607557ab9c9d9', + input: '0xa9059cbb0000000000000000000000003aff86656a65f3d81b3e0b4c4f8d4199f3b3fbde0000000000000000000000000000000000000000000003825cc1b4837cd61c00', + maxFeePerGas: '0x17bfac7c00', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x621091', + r: '0x3d047d1e1b05d563adc9206ffa9c210d01018ec50bf674c50783a6428347bc9b', + s: '0x3063c3dc89bba20743758230f5015d30926c7da5ecaa150bd969d8fc80d1981c', + to: '0x0f5d2fb29fb7d3cfee444a200298f468908cc942', + transactionIndex: '0x3f', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9d98180089adfe81f4a6c76e6b978284bd2bb3f5', + gas: '0x5208', + gasPrice: '0x4e3b29200', + hash: '0x461702cf4d7d04f70337251a6ce8aa386f96a55214eae9e71697ad2e3d686acf', + input: '0x', + nonce: '0xbb', + r: '0xdc70f934495c5a38a3e2418e0d075223094a899dea70cf95f10f1c5facbb772b', + s: '0x063b2d0f20585b959447460b5daa22c5bd0696c074ded4d31d4078b0dcae653a', + to: '0x6d1ea4bd89865bbd8c675261585ae566dcda9d53', + transactionIndex: '0x40', + type: '0x0', + v: '0x26', + value: '0x2386f26fc10000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x8f339591b959e8fe2e6127124812613e482f84ab', + gas: '0x73f68', + gasPrice: '0x4e3b29200', + hash: '0x4d0b6bd0b7dc8b332fc7f80c3c5774c467080976fa2460d85a9c032a3e230d94', + input: '0xeb6724190000000000000000000000008f339591b959e8fe2e6127124812613e482f84ab000000000000000000000000000000000000000000000000002aa1efb94dffff00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000b54a3000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001000000000000000000000000008f339591b959e8fe2e6127124812613e482f84ab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x4e3b29200', + maxPriorityFeePerGas: '0xacda7d00', + nonce: '0x0', + r: '0xd96426125d5a851dccec746787824af395da54613e62f1a5d53ce45754c2d00a', + s: '0x7a089b28b3426eb5624136e3fb7c7336eabf8d3a7b4f10f11cd1d3c86bea8967', + to: '0x32400084c286cf3e17e7b677ea9583e60a000324', + transactionIndex: '0x41', + type: '0x2', + v: '0x1', + value: '0x2c732b36ea6937', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x670bb2fa1231550fccaec308e6ed03b98d2f90fa', + gas: '0x3f13b', + gasPrice: '0x4e3b29200', + hash: '0x06ad8cefc9d677ea422fedbbc23fe323f830070fbc93ee394abf986453026dc5', + input: '0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000084fc6f78650000000000000000000000000000000000000000000000000000000000076d3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404b7c00000000000000000000000000000000000000000000000002b2c9dcaace8ec1000000000000000000000000670bb2fa1231550fccaec308e6ed03b98d2f90fa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064df2ab5bb00000000000000000000000080f0c1c49891dcfdd40b6e0f960f84e6042bcb6f0000000000000000000000000000000000000000000000009be96c72185d79e7000000000000000000000000670bb2fa1231550fccaec308e6ed03b98d2f90fa00000000000000000000000000000000000000000000000000000000', + nonce: '0x12b', + r: '0x6364548a5358fd5fd6a6d7693261455e859e9e6e12bc1571d67e894992c31836', + s: '0x377afabdffa95ce2f6b7738a9663500e128046be8f7ff08cf53e1a7fa54f9f13', + to: '0xc36442b4a4522e871399cd717abdd847ab11fe88', + transactionIndex: '0x42', + type: '0x0', + v: '0x26', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xa50c14352cce7a143afa38555fdc7354dd78c379', + gas: '0x24a50', + gasPrice: '0x4cdaf5084', + hash: '0xd77ad6002fc4ccec33de15972123777c0e036cf8f2ce5e1a4d858dd99b11cbd3', + input: '0xeb672419000000000000000000000000a50c14352cce7a143afa38555fdc7354dd78c379000000000000000000000000000000000000000000000000006ab07fb082640000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000b54a300000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000a50c14352cce7a143afa38555fdc7354dd78c37900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x78c3985ec', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x0', + r: '0xd3a28cbf01498f92e51523725981c11a34f07b11ac6a7ef89de5ce17e4b868d5', + s: '0x779ba46af5a72f75f32fda1d33f9f7bd8330e75dada67021deb98b72785820f8', + to: '0x32400084c286cf3e17e7b677ea9583e60a000324', + transactionIndex: '0x43', + type: '0x2', + v: '0x1', + value: '0x6c81bb2e1ecd38', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf4c0d5993b8c5ebc8857e631b1fa659c8c665421', + gas: '0x24a41', + gasPrice: '0x4cdaf5084', + hash: '0x3c829847832f898dd18a8674e81eba1e7179912397f48a53e31b6d98ad79026d', + input: '0xeb672419000000000000000000000000f4c0d5993b8c5ebc8857e631b1fa659c8c66542100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000b54a300000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000f4c0d5993b8c5ebc8857e631b1fa659c8c66542100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x78c3985ec', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x8', + r: '0x958ac379821e137003d336592f95d3d095e2fc38b02de6284bd4a3958fbe0f84', + s: '0x1c654cd5b76f2e9ab14e2f1b13d7c9b80a05176667e13ed741b77bb6605d445c', + to: '0x32400084c286cf3e17e7b677ea9583e60a000324', + transactionIndex: '0x44', + type: '0x2', + v: '0x0', + value: '0xb373f7ac616938', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x3651317060a0005dac1084a6f71a7285de1b6886', + gas: '0x15f90', + gasPrice: '0x4cdaf5084', + hash: '0xd90e21f60f14d0d6734a06a08ea72718c0da1dde84d927578f8bc3817eec2cfa', + input: '0xa9059cbb00000000000000000000000049a2fcfcf2b2025c667732ef0435f548aa6cd9dd000000000000000000000000000000000000000000000000000000001a6f45e0', + maxFeePerGas: '0x72c5225a5', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x3', + r: '0x5bfb19d897e19784d61a740277f615f275a80e32252d643860ade726d304feee', + s: '0x6d43017d363606b8a2cdf87f79c4becc33358b9cb8da6cc472470bfce3cee39d', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x45', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xa09bd3fb7924fbad29ce3f9d7bc6cadc7bf050a6', + gas: '0x5208', + gasPrice: '0x4c5efac04', + hash: '0x6d6269d0e0c72d8683f741cfb76b0d5e9f2dad7fe0a31cd84a655a5f48e2a3fa', + input: '0x', + maxFeePerGas: '0x62cb71600', + maxPriorityFeePerGas: '0x51a88a80', + nonce: '0x18', + r: '0x73c8c63f06b84cc19a11072e7a94b969625a0d11057268cba1cb7c464b3ca61b', + s: '0x6e8f89b8254a2ca4af5b97fd25d331c6aaf334872dc7b3af13982ebaeedd9576', + to: '0xbe8d2aea314be080df55bc01d79e98259bec836e', + transactionIndex: '0x46', + type: '0x2', + v: '0x1', + value: '0x38d7ea4c68000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x5565b5362ff9f468ba2f144f38b87187c9a010a8', + gas: '0xb4aa0', + gasPrice: '0x4b8d2bd04', + hash: '0x16405e445187de6e1282740494fc6af3a25cdfdea2de89014ace9a91f68ba6c3', + input: '0xc9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000480010100010100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000004efab6bc6b8f34ca595ba160e7d99ac0000e9ac06050f0312090211100a06080b01040d070e0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000010622b851b000000000000000000000000000000000000000000000000000000106260fc80000000000000000000000000000000000000000000000000000000106260fc800000000000000000000000000000000000000000000000000000001063b0ae000000000000000000000000000000000000000000000000000000001064c356800000000000000000000000000000000000000000000000000000001064c356800000000000000000000000000000000000000000000000000000001064c356800000000000000000000000000000000000000000000000000000001064c3568000000000000000000000000000000000000000000000000000000010657dcce0000000000000000000000000000000000000000000000000000000106640cec0000000000000000000000000000000000000000000000000000000106650110000000000000000000000000000000000000000000000000000000010665011000000000000000000000000000000000000000000000000000000001066f7e9c0000000000000000000000000000000000000000000000000000000106762b980000000000000000000000000000000000000000000000000000000106762b980000000000000000000000000000000000000000000000000000000106762b980000000000000000000000000000000000000000000000000000000106884a440000000000000000000000000000000000000000000000000000000106daa1aa8000000000000000000000000000000000000000000000000000000106e379dff000000000000000000000000000000000000000000000000000000000000000716291fd074f7de8fa92346545486f1dd995174dbe082996a7f0070b390de1e3e8b6a944decd2a3e9667049ce16489bf299b9f557e25dbaea206ff5cbc6223bf44133d275dbeab4b6ac419d309e6ef432249fb601dddef3250e2c399ce70ae4a98b470c2a9f473fd67b1e1f82767e021cbb31bcbb012b52b2b20248d1aecf6e458159922125614956f06004f4a7c48093748141d402146613d8621bb0dc8be128195e7ea4bc57cd50acbd2580433388724587941ac374bdbe1e39965dec28d47bd9253b0d64a175286d2e124985256ef7d3e18491f8ac2f92812f50c1afd48ccb00000000000000000000000000000000000000000000000000000000000000076a5840595a11b5bca0e9a0f3c3229401d9ad633639697002c528561a48496951557690ceb40c387dda55305b362f70116883c67528075d3e21f63118a6b911340ef0f068c83ffaeae51608c7469ce6bf3669b7332929dd526f206adddfcc151d0eaa18655434b9a1c6945bd6a6fdd073b2d74ca04aac93a9920fc20532c5a7a1630071172c65a953750d254e632cc43bf16ee417cd4f79b332c97a25c0726a7d732239bf5df083d299d2312ecc7539f6e8d634faa6f80989ce2627766b58974823a1bbeccfcf0ae22dbebadc6cccd896888c42badaf2bd2cb764556de10bce50', + maxFeePerGas: '0xaa4aaa893', + maxPriorityFeePerGas: '0x448b9b80', + nonce: '0x11bc2', + r: '0x471c79d7bcb68cfe81aca71eaca7fc70a90dfcb9ca8669687266add051625b44', + s: '0x4e284dab507e32122c3fbc9f46801f3790af234597bc420f063e1f4f3e76bb83', + to: '0x908edc7e1974ecab1ca7164424bc4cac287d83ad', + transactionIndex: '0x47', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x79672062c5a45e3808d6b784129cf3ecf59d4224', + gas: '0x1e848', + gasPrice: '0x4b53bf297', + hash: '0xe622306295b723bf0da62a8946e0c624a3375096669cd379bc437ba3a0e2b6b1', + input: '0xa9059cbb0000000000000000000000008a900d289a028cd59cae6cebacfd932c60978df3000000000000000000000000000000000000000000000000000000000bebc200', + maxFeePerGas: '0xe056b8297', + maxPriorityFeePerGas: '0x40f4d113', + nonce: '0x20779', + r: '0x8cf782f3d4aa7d417fcd9b0c9347b4f7539db2cff70b07ccd35974cc1e1c0acb', + s: '0x56d09c40b55fcdd1d62fa826aca514daa096571286ac77dcf05f00734dde69f8', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x48', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xd007058e9b58e74c33c6bf6fbcd38baab813cbb6', + gas: '0x3002c', + gasPrice: '0x4b2dcdc04', + hash: '0x804e7b2c8b74700c58f930f56e09e49a037b9dc454245ed87e469af5d73d7db6', + input: '0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c4219f5d170000000000000000000000000000000000000000000000000000000000076e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aae0a5d29921ff595000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004aae0a5d29921ff59500000000000000000000000000000000000000000000000000000000643645c700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210e8a00000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x18727cda00', + maxPriorityFeePerGas: '0x3e95ba80', + nonce: '0x102b', + r: '0x7527fd3053f801b20b55ae53a479a4fa15ce6fc6fe85f8f651995f65921d2c0a', + s: '0x7cfbe3d717d5e8db13d0a72c30e6716a81ae3f79dd209b9fda4a10c38f43a0fd', + to: '0xc36442b4a4522e871399cd717abdd847ab11fe88', + transactionIndex: '0x49', + type: '0x2', + v: '0x1', + value: '0x4aae0a5d29921ff595', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xb1bb676c7d99e64e8aa95a7a2a22b962596e041f', + gas: '0x272a4', + gasPrice: '0x4afe1eb84', + hash: '0x9944ff3b953f8a03d29719d2f1921d2f7ad23f28435aabc7a1cc16633c4c3efc', + input: '0x1249c58b', + maxFeePerGas: '0x5a9bf167b', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x12', + r: '0xe8c011f8dffc52c797faa8deac946b39ffca8bf3ab44126a40bb506f1cf02386', + s: '0x5313b99bfba1bad60fe829b008341fbd8269cea4d4fb5843ac7f4b1d130088f6', + to: '0x5f5cf9f5eb0e1dbb2b9ec771e015575d2e80eb6e', + transactionIndex: '0x4a', + type: '0x2', + v: '0x0', + value: '0x2c68af0bb140000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xeb5730d84f55206cdb742379c22c7c6abfc88ae9', + gas: '0xcaf8', + gasPrice: '0x4afe1eb84', + hash: '0xb6b4ef98d38a6a05809d1bf3f54ad65ce4c5b5ed5ae5bb77efc9448b46809735', + input: '0xa9059cbb000000000000000000000000a0d139723d6b9ddd967055e9af10734faf6daca600000000000000000000000000000000000000000000130ee8e7179044400000', + maxFeePerGas: '0x5fddbdc56', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x4', + r: '0xb73372f12b0891276107875cbf41880a5d908b33cfa4e7951f193de4876c16b5', + s: '0x058df26ec5a80b5b8796524849e637c97bb08e9168f5f86b68eafad64b1b4f5d', + to: '0xa1f7c9c6d19e2d0bf20729cb0bf03338a90bed9b', + transactionIndex: '0x4b', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x80c67432656d59144ceff962e8faf8926599bcf8', + gas: '0x186a0', + gasPrice: '0x4afe1eb84', + hash: '0x93b1efe0e8e99c39e0196bd596d4558863ffa78edc8c3b7a223a6a12a7b39ad4', + input: '0x', + maxFeePerGas: '0x45d964b800', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x41192', + r: '0xbf67e3864f000307e7af8acbbfc7961a3fd0b6b1372eb29d42de824a161068b8', + s: '0x018ddbd9adc27937567010cb339711b2730e534f81e34744e989489246c3a01a', + to: '0x585e94276ead330002fa0c51f3952be45404e1e8', + transactionIndex: '0x4c', + type: '0x2', + v: '0x0', + value: '0x1342a7adc76503d', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xcfc0f98f30742b6d880f90155d4ebb885e55ab33', + gas: '0x5208', + gasPrice: '0x4afe1eb84', + hash: '0xa7665ef46de3416737bb9768e48908a625d89395dfe14e47f863da8fea76db6f', + input: '0x', + maxFeePerGas: '0xabbb0e178', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x42473', + r: '0x759cf933d5eaa4ae2424d1b0a3f738e6426f46aae34fbfb728fcc5d44bad86d4', + s: '0x48ba7d2d59c11b2924f4c5cec339a13f2e488a30167db2d5f5e0e66c9dcd4f45', + to: '0x88c5f536d1514800dfd328d1e8dc2d8f3b4d60e4', + transactionIndex: '0x4d', + type: '0x2', + v: '0x1', + value: '0x320ec7c4e2a000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xe4edb277e41dc89ab076a1f049f4a3efa700bce8', + gas: '0x186a0', + gasPrice: '0x4afe1eb84', + hash: '0x28d9b81fe5974728f846e2c752a43dae559687dfa4aa5732c184e25e65dde89f', + input: '0x', + maxFeePerGas: '0x45d964b800', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x10a8f', + r: '0xe52632ff849af71f4d046b96682c9dbb1ce0991c424db42d45b013275f8ae538', + s: '0x09bbb3a4b6135e7b48116ebfaeb37c92fbfadf5a5ba590e11e4cc96095110326', + to: '0x72cd4e3777e0df0a53a991f55fe816329d9f7c21', + transactionIndex: '0x4e', + type: '0x2', + v: '0x1', + value: '0x12312e6a272a00c', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x80c67432656d59144ceff962e8faf8926599bcf8', + gas: '0x186a0', + gasPrice: '0x4afe1eb84', + hash: '0x2ed95ae311604dda2a370282bd6f3449cc1a4f2756f118f1aeb1d60c98c90ebc', + input: '0x', + maxFeePerGas: '0x45d964b800', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x41193', + r: '0x41f1b4ea4b9948a5bdd2e92f0f51922c450c6fa334d9fce39d27207799d1c2dc', + s: '0x2f09fd651476778e7eb470b5c1b1f5987690b09c4140b95b601b0f89d37cfe95', + to: '0x5eca6ce07dc82e150f23a988d2f6b29631ae2dbc', + transactionIndex: '0x4f', + type: '0x2', + v: '0x0', + value: '0xd889b3bb0f602d', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x4c9af439b1a6761b8e549d8d226a468a6b2803a8', + gas: '0x5208', + gasPrice: '0x4afe1eb84', + hash: '0x04bff1f526355878a5a79105a6fa4a4947ec23a6267afb8a2e7c7ce40fa2eda7', + input: '0x', + maxFeePerGas: '0xabbb0e178', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x33c48', + r: '0x56198513035d28dd33b6f52996425678e19068c5aa465426b217e317ed060ccd', + s: '0x34774b646c8d2767ceb4ae3eed4d1c4a7ffabb76a3abd516500dbd3ad92574a1', + to: '0x6bc39906da272535c3cda74aada15366c44badd0', + transactionIndex: '0x50', + type: '0x2', + v: '0x0', + value: '0x57979784eff000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x17fb84a661d2f5f353d257a6fafc3d38b97da83a', + gas: '0x4878a', + gasPrice: '0x4afe1eb84', + hash: '0x78e4f8d6d388ebaf4a1b43f3232b97a5f25655ab2e18b2c8cf509940f0a57a62', + input: '0xf2d12b12000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000017fb84a661d2f5f353d257a6fafc3d38b97da83a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000fe080f9d773f7bc4d00cfdbc84408712536927c9000000000000000000000000000000e7ec00e7b300774b00001314b8610022b80000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000064363b9c0000000000000000000000000000000000000000000000000000000064436a9d000000000000000000000000000000000000000000000000000000000000000072db8c0b000000000000000000000000000000000000000055796030a90137f00000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b71d8b8e3d000000000000000000000000000000000000000000000000000001b71d8b8e3d000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000be9371326f91345777b04394448c23e2bfeaa8265c704b53dbf792236eed1b294a4576c12e61685bf06bbc766717138bf1e7edd500000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000fe080f9d773f7bc4d00cfdbc84408712536927c90000000000000000000000000000000000000000000000000000000000000040b3f1402e9455208c9664fd784ffc4995d08c39bad48c8994574c55031a432c553546f016378f00b18a2af71bb14547baf60b6531e2b3846f66de01b61d5e1eec000000000000000000000000000000000000000000000000000000000000007e0017fb84a661d2f5f353d257a6fafc3d38b97da83a0000000064363fa714b3694381555bc394cc0dfba14401a2e6e2a103af5e6ecd7d47f1cbb4242256807c5b993754489be391ffac8291f413f2270fca507c36a485e77c30a6cbc1c1000000000000000000000000000000000000000000000000000000000000011dd2000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000017fb84a661d2f5f353d257a6fafc3d38b97da83a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000064363b9c0000000000000000000000000000000000000000000000000000000064436a9d0000000000000000000000000000000000000000000000000000000000000000360c6ebe0000000000000000000000000000000000000000faf73bc19aab78a80000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000be9371326f91345777b04394448c23e2bfeaa8260000000000000000000000000000000000000000000000000000000000011dd20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000925f2e84bf000000000000000000000000000000000000000000000000000000925f2e84bf000000000000000000000000000017fb84a661d2f5f353d257a6fafc3d38b97da83a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011dd200000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000011173ab0545f5b0f66005dc939c112d62517cd3c7af924ea3de2acdfb153ac7d79ac6498b24ed19f9d7e28267807f9745320c104d38388de01d723f540a41f0599f667ee66f59f02f291e822b78cc5afdcbe5fe0ae9837edfb5fb7b05aa4741d8279f6165f5fbe78cfc64738fc31c2b07d67d6e62984a87b8bd9cd5b54cd1e19d8ad2097c33b2f3b9ddb8d17ae1a4c46db08358602cefcec18e9ee88f4442f88a4bf122b8e37844f6a89a4f1c65a23c56a5755227f515e72deb64a600fdc4b059174aad4416d2a179bc57f8b84ba9ed2667a2befd75280091d8a861b0d3aca6119c8c0c1588ffa4f9a4caefc9532dc7aa31f711da2b112fe6b5a7bf29101df6fb34cfddda642fe5466fe08397bca3da9de8238622cce70b493e9f9d382b677c0bf65fb1c7f600e101b72c1eb4de0dc9e78c11c5b93b730fc37160b79d6e4a680f3faaea664643ed4cda9c0b98b402920642aaf8c3f43f50660cbf24f4830f1914a952b4ef4945010d54e4648b15b9c60b61fbb9c369b0a88e0dacce742f413424e86f655bd8a1adbbe325db62c241e236560b22bdee51b0c4891d9b98f892facef3d02a4de31bb51dc0c2d6566babfd3b6a24bb45f453a7d44ca41200fe6ad2fa6e29bccd4586238fcfe090bf77dfcd81c40788ad6a3b2bf6850917f5652f6d667fdcca82aaf7113b1cf7e93b45bfe3c42643711581ebf8cb4de854d92cb17fae64184487b4716217f80905633831ca5c512c3286ecceb89a409168ddb344c3a32000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000360c6ebe', + maxFeePerGas: '0x5b122c283', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x290', + r: '0x0ffb80eb321c5882261b75971226c4ea3280e4e7f13b699ac3655b1a918ceb92', + s: '0x12b0f3cdf17d32f848d129e17af8a6fb1ed15fbdd089bccb9c119b4ddbc16c56', + to: '0x00000000000001ad428e4906ae43d8f9852d0dd6', + transactionIndex: '0x51', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xb976d01275b809333e3efd76d1d31fe9264466d0', + gas: '0xb4aa0', + gasPrice: '0x4afe1eb84', + hash: '0x39fc3a2f506b038e3b502727345edcf6c42127bd97c906bf5cd69c1d5e9ceec4', + input: '0xc9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000400010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000caafb4c342b69dadd6d791c56ba7d1b000000be8010f010c0b030009070a02050e04060d08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000019b1f4200000000000000000000000000000000000000000000000000000000019b452800000000000000000000000000000000000000000000000000000000019b52d400000000000000000000000000000000000000000000000000000000019b5c4300000000000000000000000000000000000000000000000000000000019b5c4f00000000000000000000000000000000000000000000000000000000019b5ec200000000000000000000000000000000000000000000000000000000019b5ec200000000000000000000000000000000000000000000000000000000019b608000000000000000000000000000000000000000000000000000000000019b608000000000000000000000000000000000000000000000000000000000019b697700000000000000000000000000000000000000000000000000000000019b70aa00000000000000000000000000000000000000000000000000000000019b879000000000000000000000000000000000000000000000000000000000019b9b9500000000000000000000000000000000000000000000000000000000019be57700000000000000000000000000000000000000000000000000000000019c035c00000000000000000000000000000000000000000000000000000000019c394000000000000000000000000000000000000000000000000000000000000000066e66d4d238abf2a84f5fc465a2e41735d21c720bc516264bcb846d423ed9efeaad22d072207791393fbd6ce8ed4a4365e8b24f93f4141483c4bb929cf68488ec49cac06d656d22b921a569e39b94de94ec68fdaca2274ffcc97cfc60a11f012702cb49c28a4d286875512b500bc4ae3bc2ded30381fb4bb050457302292c7f0f60b5a478972e9a36e306fba6a8464f4c4c1e1ab47dc59601df9caecbb82d544f692563216de85072ae876992de6b9fa1ad8c40e7104e51375a50350a673d44530000000000000000000000000000000000000000000000000000000000000006618235e5c012f1fd7489d13b278a66b678a3ac29a196bd40681ee39ed3dfa7111b6255c44008a68b2aa5e2ed7b7e6129989edbb66017570b23e1ba6f3fb6625d44996832badcc32a6b4057181b1e171f84c05d5d7469b557b870980d32807d930a1549998782d5637e4ae74f6d371b8324f7abb1590a12ca961454fd26945f8735cbd4b5a079631be754fce2cc0f24da5a0cbc010ee0f98a4ef46b39045df0d00db817ce3c076fcbc70e3d85e9c4bea1eb5a33dea5b19dad02ca8d2e102e1902', + maxFeePerGas: '0x6b5cedf1e', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x1b09f', + r: '0x7e01f3f231b2d8a9fb7e56043e21e8896ce19fbeb33517d407427d87631e7655', + s: '0x16f1192dd60fd55c7f917ba2a9fd6e7241f9330e795d08a4a38881145f3107a4', + to: '0x98e3f1be8e0609ac8a7681f23e15b696f8e8204d', + transactionIndex: '0x52', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xcfc0f98f30742b6d880f90155d4ebb885e55ab33', + gas: '0x5208', + gasPrice: '0x4afe1eb84', + hash: '0x9c850596d23bfc226f4177a827d27cbfd13373ab3c6c8f083de69da4d4aba82a', + input: '0x', + maxFeePerGas: '0xa9b736ffb', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x42474', + r: '0x915fabc6157bd8cd9a68c1014f8b732ba10e45933c47132b6d8d2ed13ca7a3f2', + s: '0x4f83e6070627d7255faf3ff9bd831a78f7704b2155263edfeec7008eff435ba9', + to: '0xedcb80a23f36923377ca239aecb6e582ef6362c7', + transactionIndex: '0x53', + type: '0x2', + v: '0x0', + value: '0x21afacba393a400', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xe4edb277e41dc89ab076a1f049f4a3efa700bce8', + gas: '0x186a0', + gasPrice: '0x4afe1eb84', + hash: '0x30f4c85342e02c43297d2720b034d8b724f38281d34a7c2dfb84328317da549b', + input: '0x', + maxFeePerGas: '0x45d964b800', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x10a90', + r: '0x0eb75546ed9b0a261b663e095c7f93f10bdc8900a2cf9fb0a1cb4afb0e40a966', + s: '0x76961fa9c1f5c5054339c79950581cc8b32c5fe15e9730ac2af740cddc9b2d98', + to: '0xd44f54bd8cacb0bbf5f568be436f3ebb5204022e', + transactionIndex: '0x54', + type: '0x2', + v: '0x0', + value: '0x11ba60e96de00d', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x11f813a59d746eb051f1249e17c01ed4ecb7637a', + gas: '0x1e7ff', + gasPrice: '0x4afe1eb84', + hash: '0xbc83390bc39958798cb3066bf330a5611945aa5ca5112a55b92d6c689554ad60', + input: '0x5c11d7950000000000000000000000000000000000000000000000fae266e7ce1bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000005f3dcfa04bd883e89de8970424a77504fc9e4a390000000000000000000000000000000000000000000000000000000064363f7b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000675bbc7514013e2073db7a919f6e4cbef576de37000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + maxFeePerGas: '0xb7f54b003', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x186', + r: '0x300c8ab86d498fa6ca5368659b988ca063d6795c0708ebd6797c7932d10671ef', + s: '0x4cf593213a0c878c0ee7faad552d0c5916162a5a2d2a64c335b75f6194ca9403', + to: '0x7a250d5630b4cf539739df2c5dacb4c659f2488d', + transactionIndex: '0x55', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x30a465f4dd49105cc535e6607b4e47d124c3ed1f', + gas: '0x1afee', + gasPrice: '0x4afe1eb84', + hash: '0xf0a99df33c3ab18658dd8625fd41cf41dc83dc44f19688f3cf17f04514a0d4cb', + input: '0x44bc937b000000000000000000000000f65c1595b64e73dcb551bd7eedcb43eb2c769be200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006436426400000000000000000000000000000000000000000000000000000000000000413d3a424e422e424e423a626e6231356d6e366d766a3364636c6c6b6c3268776c3676633439797565756c3661656d6573733432713a323037393138323a74653a3000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x63ce38e90', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x2', + r: '0xa453f3a177d595a27298500aa7e77787bc20907c9b00f30826c998ee7c1dff85', + s: '0x7369e5b46c440dfad01acefe6f26c5b708b19210b52d31af4be4d73b262b1d3f', + to: '0xd37bbe5744d730a1d98d8dc97c42f0ca46ad7146', + transactionIndex: '0x56', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xcfc0f98f30742b6d880f90155d4ebb885e55ab33', + gas: '0x1d4c0', + gasPrice: '0x4afe1eb84', + hash: '0x080d36e7596e73af440400f2542d2b93c0b3cf3af6cfe400ac3fd469d958b338', + input: '0xa9059cbb000000000000000000000000cdcedde8f0690fa8da7cdacdbcce7c8550bdce390000000000000000000000000000000000000000000000000000000006bb7af0', + maxFeePerGas: '0xa9b736ffb', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x42475', + r: '0xfd42464897da80d7e801c323400d9fd9023320a8b3d4f0567793443d8348f4ab', + s: '0x40e14c1cc01cb5170ab3f0a1add8b2b2d65b7da65e29480d3c87df1ee67c3d77', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x57', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xddeb598fe902a13cc523aaff5240e9988edce170', + gas: '0xb4aa0', + gasPrice: '0x4a8badd84', + hash: '0xc27d72675970b34668bea3e241a10e3f8e963a9bbae7b69f1cf27dc6aecbcbe5', + input: '0xc98075390000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000004000000000101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000008b1e35ccde892fe56c722420bdc588160000e9c401020106050e0c08070a0903000f040b0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000878155e000000000000000000000000000000000000000000000000000000000878cc79000000000000000000000000000000000000000000000000000000000878cc790000000000000000000000000000000000000000000000000000000008795e140000000000000000000000000000000000000000000000000000000008795e1400000000000000000000000000000000000000000000000000000000087ae02300000000000000000000000000000000000000000000000000000000087ae02300000000000000000000000000000000000000000000000000000000087bce3d00000000000000000000000000000000000000000000000000000000087e54f100000000000000000000000000000000000000000000000000000000088009a000000000000000000000000000000000000000000000000000000000088009a000000000000000000000000000000000000000000000000000000000088215d80000000000000000000000000000000000000000000000000000000008828818000000000000000000000000000000000000000000000000000000000882bfc4000000000000000000000000000000000000000000000000000000000884a230000000000000000000000000000000000000000000000000000000000888fde4000000000000000000000000000000000000000000000000000000000000000697b49b869116d98c339ccec078201a086eeff8a1079a0ad8cf549e03e5116eae935d24b28b7999659595eaaadf4cff5e3196f5682ac22ca1ddcebb39026b69d9865d7c0f6553fa9c551b03d4f8a641755ea3347ca4c6a65162759d51df61c821223e39ebde460b257af0d8ada9bacba166054fb28dd7c0111e708ba749e8a808fc8da138d00e279ae2779606d364348d5c46ba6f37d5e8521ccfce6d940c24273990bd131c37ce33e29b82bb5551c7efd38aac7dfdf8d08090b76566ae18bcf000000000000000000000000000000000000000000000000000000000000000063d03f6364fd18561ca03cef54f44484f61bb3b620f99adfddef40d6565ffe5be7bf8aaec763d43f79fcbe7319c620ba4a407a7e49c9b7ec6093e60b5bf1a772d62999830f88b3d844988b09e5228487fde2ee2b3fd12abf54e7cbbf97221b74830e567ff8d676921f7275bd9a446e16287c1a82fabaa1b4272f35915eb03bd432a3647b9125bf089a81c231c97bdbee706fa68e43173cc9fa3e6a39b8ba825573d107a84d20a0db4e61fa881aba7c527cd83fd37b3de86dbaf6cfafd69de400b', + maxFeePerGas: '0xefa4ff21e', + maxPriorityFeePerGas: '0x3473bc00', + nonce: '0xe555', + r: '0xeb2632aa69af6c352644493291a00b9ed63fc8eb439b138bf9dd298bc5ff2545', + s: '0x405b026b89862bc6b824067d2c6a6e1ae354ab735d1dc3b47c159d6449fd3a22', + to: '0x34b41725cf934866a4b89d65395f15af2cb9ae89', + transactionIndex: '0x58', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xa4e5961b58dbe487639929643dcb1dc3848daf5e', + gas: '0x55f0', + gasPrice: '0x4a817c800', + hash: '0xf062f350fcb7ceb7eda9cb8265e9a5922249ceddcb1a40b67ba1af43bb5c8597', + input: '0x', + nonce: '0xc89e2', + r: '0x49b22ad44cbe9b0775944b6153021b501f2bb5a4aacf9a10ee8da7df87ccdfcb', + s: '0x0dee73e0614bdfdb0e5d2e6b30d4d2f53a96be5f1421bb9d903e814989790ed6', + to: '0x2c3113d1a6433d6c88ae92888346cf7f23fcb171', + transactionIndex: '0x59', + type: '0x0', + v: '0x26', + value: '0x9ff516e65e000', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x48c04ed5691981c42154c6167398f95e8f38a7ff', + gas: '0x2bf20', + gasPrice: '0x4a817c800', + hash: '0x76a287becd9daa920e1d26b9ee1843d03ce6df36b5434076738b90c323ba3a82', + input: '0xa9059cbb0000000000000000000000002c20b005df1d28e09d35b2d2b683779faa3e06cf0000000000000000000000000000000000000000000000000000000005fb7191', + nonce: '0x97e97', + r: '0x316288aa6f36438a65c22bd08bfcc8a6ac6f038e17f5b704b0ef00d770fbe83f', + s: '0x2263c2789374197fde54cd758502ca6b2b58de839d0be37a3ef2537b415329d2', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x5a', + type: '0x0', + v: '0x26', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x876543cc6549d633de96b62a51f79160a904273d', + gas: '0x18b33', + gasPrice: '0x4a817c800', + hash: '0x51bfb597e154b9df1dfab45885c8219dd3ba99c0fa80631acba6b635471f74a5', + input: '0x6a761202000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000044a9059cbb0000000000000000000000004c15ed742031843d43d4495ad4285bf6323efa3c000000000000000000000000000000000000000000000000000000000744a820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082000000000000000000000000876543cc6549d633de96b62a51f79160a904273d000000000000000000000000000000000000000000000000000000000000000001569d1270ca49270c51a5a43fe149d858171ac371537a8b5dc3a97116fe33c0ba7dc8d9bda9230591b7f10e2bdbe37c00771c631ed5fd3dcffd8d501e9f5fcc1a1f000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x4a817c800', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x7', + r: '0xf3d9a7ab2185b2d61daa3e9b5aa4536817f94f496509a849ea882fb716c58f87', + s: '0x6633d928531f98b3f501f137a52bf139918608181de3957efc41238b60b6fdb6', + to: '0xec5f4829854d1f0478b5b7a1c6f7dc50c4545fc0', + transactionIndex: '0x5b', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x490ac3d62b3e71621687724ad894b2f15eee1167', + gas: '0xda8f', + gasPrice: '0x4a2fbf519', + hash: '0x0d7b43abc4b92337b064b74f7e2ff87c337cf0a5690a54dac34f2edf555d0733', + input: '0x095ea7b30000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + nonce: '0x2ee', + r: '0x932266958a75019c8b5b922453b1a17acd707cc942d51fc9f569aeb256f44b82', + s: '0x2378e8c4aa7059f894ff3dc7ac65108d6649c75d347ac99de96997486a931bcd', + to: '0xee8253a7c009fad5fe047af648d29586c24d56d3', + transactionIndex: '0x5c', + type: '0x0', + v: '0x26', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x8cd94a71532f1f361f79a715f862c3ac621a9ceb', + gas: '0x10231', + gasPrice: '0x498586792', + hash: '0x6d9cf19ee0ca152ae9c5634caae877ab6011a70ee330225d9546589d74b3e087', + input: '0xa9059cbb000000000000000000000000b8001c3ec9aa1985f6c747e25c28324e4a361ec1000000000000000000000000000000000000000000000000000000001bb75640', + nonce: '0x0', + r: '0x2e518bb0c931b43e236d7c56ed2526fd9b0842a8add6ece75acc76380237a762', + s: '0x2b411dd4544bd94c7dce7f65c4dc0eef761568f12cb56a9da80a847545d6ac55', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x5d', + type: '0x0', + v: '0x26', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xd29a9fd180fb8da993576959bc9965962d7112b8', + gas: '0x10231', + gasPrice: '0x498586792', + hash: '0x1fef29d91355611b129ff67f970f6d1da96104df0310bd3b72237367723757d8', + input: '0xa9059cbb000000000000000000000000b8001c3ec9aa1985f6c747e25c28324e4a361ec1000000000000000000000000000000000000000000000000000000019b45a500', + nonce: '0x29', + r: '0x486be4009aab14d1968cc4f6ea0f60bf2e60333737051ec4c16be637ad9f92be', + s: '0x3fdaee939cae609f0d789d54d5bf5ab5edbfbf927a83bd4e5f5376b9898cb594', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x5e', + type: '0x0', + v: '0x25', + value: '0x0', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xbdac639e17f40fe595a6f683fb031d5d14e454e2', + gas: '0x10225', + gasPrice: '0x498586792', + hash: '0xa1ad417520e8fc7d9c8d480e98b929487614daac0c8864879182dfad732054ef', + input: '0xa9059cbb000000000000000000000000b8001c3ec9aa1985f6c747e25c28324e4a361ec1000000000000000000000000000000000000000000000000000000003b9aca00', + nonce: '0x0', + r: '0x50e569b6a8052f1a7f8c142dcb5e9a6f0b0a9bc008020551cb095c413b8cd0d1', + s: '0x5e8e22aea92826c27fc90b46d5f104b95ec52613d3352efa56af8023eed21cd0', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x5f', + type: '0x0', + v: '0x26', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf87acd73088f39c8fcaa77a036d9bdf3671cf0db', + gas: '0x2be83', + gasPrice: '0x497104f79', + hash: '0x7fcdfa9acd5255dafc8ddff55a2d8f06c93476eed34b511b7f504fc3eb0a4fa1', + input: '0xe449022e0000000000000000000000000000000000000000000001b1ae4d6e2ef500000000000000000000000000000000000000000000000000000000000000e4235bd900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000371a0985d104c706cafa26ffb990f55ba55bf6c5e26b9977', + maxFeePerGas: '0x60cc725d8', + maxPriorityFeePerGas: '0x22c92df5', + nonce: '0x20a8', + r: '0x28ba948112aa8cee0b471ca955055a4825f6f563ea34d36a9da0e6e146a2c433', + s: '0x03b1bb8df287aab578a3dd40f302faeb043ac5e5c2f34b22ab9e0d27e73b11b1', + to: '0x1111111254eeb25477b68fb85ed929f73a960582', + transactionIndex: '0x60', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x03aec61b209f8017a6a8aa974dce8252c69296ca', + gas: '0x13615', + gasPrice: '0x492148684', + hash: '0x69297bc8fafd076c18fa178358ebf0782730e1efe1c5d0dc057c4a42c7d13bc7', + input: '0xa9059cbb000000000000000000000000343821d3226c9f2f9a988c3d95c98c8c93cb75090000000000000000000000000000000000000000000000000000000005f5e100', + maxFeePerGas: '0x979be1ff0', + maxPriorityFeePerGas: '0x1dcd6500', + nonce: '0x6', + r: '0xd9d01006b01c45425b865e62f65c7c8cddc2816681ccbb29a08ec5287b49ea43', + s: '0x7127820875586008d07fafecdbd55103e102d921d203c095e9992efd51cef753', + to: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + transactionIndex: '0x61', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x57e65e1099ff2e2f1878ba820deb2a59377ac79c', + gas: '0x2bff5', + gasPrice: '0x492148684', + hash: '0x885dedc7616cefc16490d6dbec79b7ccc7dd1615367d2c4101084d60f2fdbea1', + input: '0xfb0f3ee10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d975d41e5000000000000000000000000000593afcc8ba197e8c1ff17cfd2f1a94e8119e79c0000000000000000000000000004c00500000ad104d7dbd00e3ae0a5c00560c0000000000000000000000000079f725f5c91384615270135d113efc7adcd8ee390000000000000000000000000000000000000000000000000000000000000776000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064362d6800000000000000000000000000000000000000000000000000000000645dba680000000000000000000000000000000000000000000000000000000000000000360c6ebe000000000000000000000000000000000000000037b453c98f8a79a90000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f00000000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000001fd5129130000000000000000000000000000000a26b00c1f0df003000390027140000faa71900000000000000000000000000000000000000000000000000000000000000633b5706d50a116101ac05ae95e2183168bb41cdfa3ded99a4e155291e6d6674462e6131fb77cd79a066548742049e828bc322115be1d9e5449d717febef7985ff00000073f8473e961ce955c014453147c9b5f24f0199ad5210ca60aab99b5b0f1394770000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x5057e4dc0', + maxPriorityFeePerGas: '0x1dcd6500', + nonce: '0x5', + r: '0xb58385ce65a6a3cb5669f5f1ab1f6f2256ecfa7518ec314ec41eb98bc0837e60', + s: '0x29ea698c40672c0dbd004d705439542f22791af7a1c1e37dcbe83b56b9e7c9be', + to: '0x00000000000001ad428e4906ae43d8f9852d0dd6', + transactionIndex: '0x62', + type: '0x2', + v: '0x1', + value: '0x4f94ae6af8000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x231d3839825cbfa5887d5539fb297539627d74c8', + gas: '0x5208', + gasPrice: '0x492148684', + hash: '0x03a87bf75fb7637fff63350513f286fdf23a5c0c5a561122f1e768c76ec6ea2b', + input: '0x', + maxFeePerGas: '0x9474decf6', + maxPriorityFeePerGas: '0x1dcd6500', + nonce: '0x13', + r: '0xb43ba165e5311936a02abdd5ce68b320deaa86957455f2b81493e7814266ea34', + s: '0x4e607d1700fec1e31441aa8b1f5c6b0df6604dea4e2008503bece4fc892f82ba', + to: '0x599f79493f478a8899c9e0b9ce986030e40b8192', + transactionIndex: '0x63', + type: '0x2', + v: '0x1', + value: '0x2c68af0bb140000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xcc175d966ea179dddf2cd2d2a79973da5ce387f1', + gas: '0x15f90', + gasPrice: '0x491f600d5', + hash: '0xf76389acc92906f1290f3a854aa7bdff09ee6b7194a6cdbe3867b3b2f7b16fc3', + input: '0x2d2da806000000000000000000000000cc175d966ea179dddf2cd2d2a79973da5ce387f1', + maxFeePerGas: '0x491f600d5', + maxPriorityFeePerGas: '0x491f600d5', + nonce: '0x14', + r: '0xc529468d6f5ac6d3a93472c2342c571a7e173217fb2545fbe84d9698965b87dd', + s: '0x4f2bbee0e0b09d3030df61f434611ca2c7c6fcbd3a2172a0f787a1e3bee3bb40', + to: '0xabea9132b05a70803a4e85094fd0e1800777fbef', + transactionIndex: '0x64', + type: '0x2', + v: '0x1', + value: '0x1b9ac619e7a000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x66aa29c0d03bf1577c69748faac2c74b2b7b5176', + gas: '0x5208', + gasPrice: '0x49147ae63', + hash: '0xa7cecd23fab592aa7f3aa37045b16a35c73b2bcfa51d9d5a7a7d15424b78e4af', + input: '0x', + maxFeePerGas: '0x4e3b29200', + maxPriorityFeePerGas: '0x1d008cdf', + nonce: '0x2', + r: '0x7a738a0fd33a5d35321d30e38e983c559b4959da75b4047b6a24a7b39aad42a3', + s: '0x133773f7173e767f09f91abbc05c0189ea2b4523f4a0be0ba0cb608fa1bb2ecc', + to: '0x98bc423fbfd9935ab439c70eaa2f503d193b8827', + transactionIndex: '0x65', + type: '0x2', + v: '0x0', + value: '0x18b5d979b5acc8', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x8264e9e0f4cbcbbbb3f8ecaec0a625b590ae790e', + gas: '0x9ac1', + gasPrice: '0x48628c484', + hash: '0x0fb59a5f28f25c78c39c72e0232934bd6b8646064ddd4d66e8c8b5695fa8184b', + input: '0x2e1a7d4d000000000000000000000000000000000000000000000000016345785d8a0000', + maxFeePerGas: '0x7527ba338', + maxPriorityFeePerGas: '0x11e1a300', + nonce: '0x2311', + r: '0x4d9cd6af35da7055ec9f7666a8775974617c78416497d26b607a4e00e6e24df0', + s: '0x0473e36c9a23e1f51baf6e937153de71c26c04be9d2d3086941ad041afb53160', + to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + transactionIndex: '0x66', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xba973782ea45705bbf3d9146d1d0c7085ea67d09', + gas: '0x3e51d', + gasPrice: '0x48628c484', + hash: '0x2343a15826c2683c027de01886924efeef1418ca43eef7f1e386e1e691cc14a4', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645d300000000000000000000000000000000000000000000000000000000000000010800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000006f05b59d3b20000000000000000000000000000000000000000000000195350072d49c51359cebc00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000308516e6daac88d719af5a6d7ea2a82d8c8e7356', + maxFeePerGas: '0x83a687cfb', + maxPriorityFeePerGas: '0x11e1a300', + nonce: '0x78', + r: '0xffe855a41faa47c558849944f960e16ec0b51b50d7232588df35649a53d3c8d2', + s: '0x780adf86a100a512bcb52d4d5b7942a0c2ffca51f888f606b0ff57da3182af65', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x67', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x7b229afc19d062e215426cd6ccddae15eec72bd2', + gas: '0x20fc6', + gasPrice: '0x48628c484', + hash: '0xe69e2160e90c6ef7f1a72c8bf4bdaf8e04fd679990acbacf1e9d9942eb2e21e3', + input: '0xeb6724190000000000000000000000007b229afc19d062e215426cd6ccddae15eec72bd20000000000000000000000000000000000000000000000000226abadc42f800000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000ab5b4000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001000000000000000000000000007b229afc19d062e215426cd6ccddae15eec72bd200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x7cf9f675e', + maxPriorityFeePerGas: '0x11e1a300', + nonce: '0x14', + r: '0x5913f6ba1e292387d9edbd31c42cea5781ef507a54f5f0ff9b24d9e51324ae1b', + s: '0x0062fb9c767a87c8bc796bf3d813d8a078f6a4a1c34edb566910d0c5b853d16a', + to: '0x32400084c286cf3e17e7b677ea9583e60a000324', + transactionIndex: '0x68', + type: '0x2', + v: '0x0', + value: '0x2284df9f711176c', + }, + { + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x00873b5fa9dc2a7336bd7d9d9ec187235d75f65c', + gas: '0x5208', + gasPrice: '0x4846371f5', + hash: '0x0853356e276a49527201727e5e994403d7071fd8c20c4fe3513be09eb26422da', + input: '0x', + nonce: '0x4f', + r: '0x6e20c681c7547f14baa4b1d4433abdaaa06f8df72dd0266e81f0d5748e71f7cf', + s: '0x4a388342be339075192c0f59bd1cde4e18adf73cf794fc74fd04c00b7d465eef', + to: '0x974caa59e49682cda0ad2bbe82983419a2ecc400', + transactionIndex: '0x69', + type: '0x0', + v: '0x26', + value: '0xb2c858de4655390', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x00bdb5699745f5b860228c8f939abf1b9ae374ed', + gas: '0x27a42', + gasPrice: '0x483db8aca', + hash: '0x5c9d87e4015d92c11f2153f8133f8709294a3aedcf446523b48d8ca9f90cf999', + input: '0xfb90b3200000000000000000000000001522900b6dafac587d499a862861c0869be6e428000000000000000000000000000000000000000000000000000000000005f930', + maxFeePerGas: '0x897d11e3c', + maxPriorityFeePerGas: '0xf946946', + nonce: '0x18ada3', + r: '0x41d5426a523b9e1045201a5145cd78109077cc1fc2f9d5882f6b58d5f691a3b1', + s: '0x2a79396d96f9c362f0dd287b9fdfd6f39367a8964b3b96895a3f9737b1f67b80', + to: '0xffa397285ce46fb78c588a9e993286aac68c37cd', + transactionIndex: '0x6a', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x00bdb5699745f5b860228c8f939abf1b9ae374ed', + gas: '0x27a42', + gasPrice: '0x483db8aca', + hash: '0x410a2d3073786f43ba1c0dcd5715031940b1eac224ddfbc09a2533b98e1961ce', + input: '0xfb90b3200000000000000000000000001522900b6dafac587d499a862861c0869be6e428000000000000000000000000000000000000000000000000000000000005f931', + maxFeePerGas: '0x897d11e3c', + maxPriorityFeePerGas: '0xf946946', + nonce: '0x18ada4', + r: '0x13cbb4f6a61b5bdcb4950e324769b71a02eb937594c8aa09769b27f0d88594e9', + s: '0x261f42e105031f0b934b7253f3886c1e89e698443f33244429195ee5a7f07746', + to: '0xffa397285ce46fb78c588a9e993286aac68c37cd', + transactionIndex: '0x6b', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x00bdb5699745f5b860228c8f939abf1b9ae374ed', + gas: '0x27a42', + gasPrice: '0x488d769c4', + hash: '0xd074a2e071d48cd543a4c2f78cbb494a5f5b7e205d2f9f16b749d3e79fc744c1', + input: '0xfb90b3200000000000000000000000001522900b6dafac587d499a862861c0869be6e428000000000000000000000000000000000000000000000000000000000005f932', + maxFeePerGas: '0x9ada766d0', + maxPriorityFeePerGas: '0x14904840', + nonce: '0x18ada5', + r: '0x052804f66111beebc748bcd7926ebe9d4b6a9d0a793656213b15c33415eb4112', + s: '0x6e27a106d4b2d72152ceb54be11b71538539fc8c58101722bc91da558d8d8858', + to: '0xffa397285ce46fb78c588a9e993286aac68c37cd', + transactionIndex: '0x6c', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x00bdb5699745f5b860228c8f939abf1b9ae374ed', + gas: '0x27a42', + gasPrice: '0x488d769c4', + hash: '0xfc7ae9cd5806dcc1bd8521581ce0187472dd6d2551e512e7a5d99e31692ce753', + input: '0xfb90b3200000000000000000000000001522900b6dafac587d499a862861c0869be6e428000000000000000000000000000000000000000000000000000000000005f933', + maxFeePerGas: '0x9ada766d0', + maxPriorityFeePerGas: '0x14904840', + nonce: '0x18ada6', + r: '0x1162bd0ef817cd7729fa1bf0ebef928242f0a63ddf13de691cb9d930c250107c', + s: '0x4486854997407eab272e2af97e6a7515ea40f5ff7d21710b413c6526c5052bd6', + to: '0xffa397285ce46fb78c588a9e993286aac68c37cd', + transactionIndex: '0x6d', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x00bdb5699745f5b860228c8f939abf1b9ae374ed', + gas: '0x27a42', + gasPrice: '0x48631cdc8', + hash: '0x90910adfad4d375b9f1fe068c38cfb61fa27f8f3fffd5449a056410db031af0e', + input: '0xfb90b3200000000000000000000000001522900b6dafac587d499a862861c0869be6e428000000000000000000000000000000000000000000000000000000000005f934', + maxFeePerGas: '0x92b229fca', + maxPriorityFeePerGas: '0x11eaac44', + nonce: '0x18ada7', + r: '0x4fe0a6957957717c5ad46c067e30a0902e445cb77f908a033dbd79b98b9888d6', + s: '0x392ce598e7c79cb36da56f19ec951194cc1d8941c53664dbabf14c9e3fa5d11e', + to: '0xffa397285ce46fb78c588a9e993286aac68c37cd', + transactionIndex: '0x6e', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x00bdb5699745f5b860228c8f939abf1b9ae374ed', + gas: '0x27a42', + gasPrice: '0x48631cdc8', + hash: '0xd4b42ed78389a43e47061ee844c2b68ed631da72ceea389363a9bab05cc8e5e8', + input: '0xfb90b3200000000000000000000000001522900b6dafac587d499a862861c0869be6e428000000000000000000000000000000000000000000000000000000000005f935', + maxFeePerGas: '0x92b229fca', + maxPriorityFeePerGas: '0x11eaac44', + nonce: '0x18ada8', + r: '0x650a4b34cdcd4631c7829a32a134a4c4fddda05d6ce3740febc8b65181fcaf0a', + s: '0x5704562d0e2b28f1513637b6162897b6f9b0b7b5127642970fd053f761d178d7', + to: '0xffa397285ce46fb78c588a9e993286aac68c37cd', + transactionIndex: '0x6f', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x41aa3c59e2d0023765c972ef25067de147095e90', + gas: '0x2aef7', + gasPrice: '0x4832dd404', + hash: '0x504e3f22373700cb294db5b5b5402f45d8c4a02d7e996e52b51a0502a6b7cc87', + input: '0xe2bbb15800000000000000000000000000000000000000000000000001bc16d674ec800007f17690441d1ee627275ba60f1909e51840326e8b087a917a030ef1a58df575', + maxFeePerGas: '0x91d3fadf6', + maxPriorityFeePerGas: '0xee6b280', + nonce: '0x3', + r: '0x15bc32bb35846cd316ea4b2ef352cbde5c4db3e90118a155f7d6d9d56ac42047', + s: '0x332c8e70d2d73246da61880965b6a8e18e2a49029d5c9f44d70a757a40632347', + to: '0xae0ee0a63a2ce6baeeffe56e7714fb4efe48d419', + transactionIndex: '0x70', + type: '0x2', + v: '0x1', + value: '0x1bdb3ed2c894e50', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xe370cf76e4aa132b2709a842f6db1978e13493da', + gas: '0xc612', + gasPrice: '0x481641084', + hash: '0x96b93b9a250a2c76261558470c0242115dc1ebda5e1a5206489ee033fb31284a', + input: '0xa9059cbb000000000000000000000000bfa08b5ca8ca1acb8a118725759d0bd6c8039f75000000000000000000000000000000000000000000000000000000000bebc200', + maxFeePerGas: '0x57339f031', + maxPriorityFeePerGas: '0xd1cef00', + nonce: '0xc', + r: '0x4f09c205bc80daf565372757b4dea13e8f38b49f6d61f59e59dc244e2237e9f3', + s: '0x09856fc5ff01fe8b4f8771d78e7d3793db60b112cbb01fa113dced14f6d8d587', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0x71', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x1990bbc7bf55ca3836910bb8064af5aea1aa3990', + gas: '0x12496', + gasPrice: '0x47a3d0284', + hash: '0x0d16cbef0f3df967f3dd0a10606785c4d7ae9bb6cc4ae8018402a5a839a1f497', + input: '0xfd9f1e100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000001990bbc7bf55ca3836910bb8064af5aea1aa3990000000000000000000000000000000e7ec00e7b300774b00001314b8610022b80000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000064363ea600000000000000000000000000000000000000000000000000000000643f791d0000000000000000000000000000000000000000000000000000000000000000360c6ebe00000000000000000000000000000000000000002d7e65655d5e24100000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096fd865af440000000000000000000000000000000000000000000000000000096fd865af44000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000f7d1f4f8a7818ca3d92b1ca01b8051520b054d578e88c852463068f49131297f1cae4402df7b3d67c920a72a48897a5a4a347c03000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000001990bbc7bf55ca3836910bb8064af5aea1aa39900000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c6568f12e8000000000000000000000000000000000000000000000000000003c6568f12e80000000000000000000000000000000a26b00c1f0df003000390027140000faa71900000000360c6ebe', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x17c', + r: '0xef833814a5f922ffb7809d56150f90cfc1ce6d151c7620447ff9e8670b10193e', + s: '0x236c8b6eedb771851d6d7de5a93f6ecf039250754e169f1caee2a45687b253d9', + to: '0x00000000000001ad428e4906ae43d8f9852d0dd6', + transactionIndex: '0x72', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x91cfe6dbb2b98ce6fb549cb3334a90dd3a69e584', + gas: '0x14f43', + gasPrice: '0x47a3d0284', + hash: '0xf80ba14af91cdf4a398fc6d7ab439f721af496428eb789749cb2da23eaf31052', + input: '0xa9059cbb00000000000000000000000008f918c66d54f4c51f9a76cb9a956faab2d49abe000000000000000000000000000000000000000000000000487ef0daa63d5ba1', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x3e', + r: '0x6b04df15be2426dca5090d73052f6eb01d4b495d869ebff7da8f85298cb5868c', + s: '0x2f25a9a6120c3b912ccad0d7ce8eedda62ef4e7bc82fc5557a06f74ed1c27582', + to: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', + transactionIndex: '0x73', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc7d255accc1b4dc16c2856ac4c5193bfe29801f6', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0xb8c7acb46336a721893b6171ce9ae326e8b861913ee8502560798dc03a4b428a', + input: '0x', + maxFeePerGas: '0x62bb2392d', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x2', + r: '0xc09606be9f624ec8f63206c830e3f769e7af2bb6084f63961a786996e408d252', + s: '0x1953afb0eb09319d8aca73c6afc537db8965a79a8751e398c2627ccf70e79737', + to: '0x7ab9889cf7f17ab6303d2992c874bc583f125a2e', + transactionIndex: '0x74', + type: '0x2', + v: '0x0', + value: '0x1c288e25fbbf52d', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x06bda28316d3681cc513d3fb6820b6837e838be2', + gas: '0xed72', + gasPrice: '0x47a3d0284', + hash: '0x585f52cc267bc31ed76456e10e26462e8ba898419cc8b9d59f6f76c5869e4b41', + input: '0xa22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001', + maxFeePerGas: '0x62bb2392d', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x29f', + r: '0xc6422e0c8c19d97517db3a0e4e791ea556c8fc1a1eaa5fe4548b06df398d8cad', + s: '0x1da6feebf8207e3c861173dd64f96e636ca0681383fae3953ef5bd9885b3e9ec', + to: '0xd44078705456c4f4517a659953f5296e5328f8b8', + transactionIndex: '0x75', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x067872abb9a5ebb9435bedc994d5e276b82c2e00', + gas: '0x81a8', + gasPrice: '0x47a3d0284', + hash: '0x07158ecabeaa23e23a2b4af3bf54be3f29da81f282cd031358c66addaff2e8d5', + input: '0xd0e30db0', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x6a8', + r: '0x560aa95ec05030c84f9edb33ffa6a64f14e95c7edf902b9762c8393e424ee8d4', + s: '0x4fdf9270b586f36d185097e54832e318f1f1e2dbdec3a5b70b678c6c98374387', + to: '0x0000000000a39bb272e79075ade125fd351887ac', + transactionIndex: '0x76', + type: '0x2', + v: '0x1', + value: '0x1aa535d3d0c0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf464720e933a4818e332005f65e85ca38198ed0e', + gas: '0xeb04', + gasPrice: '0x47a3d0284', + hash: '0xbe213bb3cf09088600a8a4d6dcaa6e43e22c730a2b79686b99cb2dd23c89b0ac', + input: '0x095ea7b30000000000000000000000001e0049783f008a0085193e00003d00cd54003c71000000000000000000000000000000000000000000000000001ff973cafa8000', + maxFeePerGas: '0x62bb2392d', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x39', + r: '0xd41571e5da0691205d0ac01a2752e6ebd93adb2ab3ee49fc8eca982a5a59eb34', + s: '0x1ef672723869b506f46d903606f702b642a499958642962e358cc3633488dde5', + to: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + transactionIndex: '0x77', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x2d7fdca2a80343dc46ad0129856e8b82ead945cb', + gas: '0xd7aa', + gasPrice: '0x47a3d0284', + hash: '0x16c47e6331c4356d92def58627a88982ba34e0fdc5d38a0967a79faa2ba59c28', + input: '0xa22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x62bb2392d', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xe44', + r: '0xf65542a721d9f35f30d90288e4e416fed7c107a802adc0d626d732937e3beb42', + s: '0x0cbb23391c0657b540dd143d84d54430d05accf1391a192dce9d4971b165becd', + to: '0x2969fed452f73ea8a87ca427e27b13a40fc390ee', + transactionIndex: '0x78', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x5c8e20a9b79c9e25597994fb868b98f92097de33', + gas: '0x38673', + gasPrice: '0x47a3d0284', + hash: '0xa7eb4f13bd122d16890db32cc95498c41c899d90db6ded546595635be8afd65f', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000064363f6700000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000214e8348c4f0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000002b6d6556409d58500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f1e029ae5743fd4a324132a0be6eeebc81060f55', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x39', + r: '0x6ebc6fa0e15b11f8b528105d10e0a5036d80a65b5492ad55c15682e096bfb62c', + s: '0x742cc33888a16df24ed65b2e6c29df694a2ada7e217b2f350ba01598ac641430', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x79', + type: '0x2', + v: '0x1', + value: '0x214e8348c4f0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xcb280c6b371d3f872d791e5bee09dc4a0670892b', + gas: '0x1fe9b', + gasPrice: '0x47a3d0284', + hash: '0x0f306416f5f9ba69fcc20348dce199ad14402c5d0956c34d1d68535b7b456a6f', + input: '0x0ce28dc4', + maxFeePerGas: '0x5c2f99757', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xb', + r: '0xaa5a9f7a4e46e240de1a97541c078bdec6c38d01385a12c7417a43a9535879ab', + s: '0x0f9668132ff0306a7713e6d6caa3f37d2b24208cb1574d72707e3cc7d0786531', + to: '0x52a494dbf47107cc0c624ee10703abecaf586776', + transactionIndex: '0x7a', + type: '0x2', + v: '0x0', + value: '0x1dc104a3fe70000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xec2a9a192929ed1f280f7fd8935b881e3a649dc0', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0xc8ca24a0da8b3403305b9cadb26dadcf547d8f23487b5ad1f8d63269786ff46e', + input: '0x', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xb80', + r: '0xf6675a6518006fec1f26f7b84c188c7d59d8f41f9c289cf7805733be3c36078a', + s: '0x5996c346dfa0606e2a9982990428f1da60bb5af13cb3ff213530061533fd6f84', + to: '0x32b30adef7c9dcb888d97f7b743db457e67f2142', + transactionIndex: '0x7b', + type: '0x2', + v: '0x0', + value: '0xb1310c5a2c30000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf14cbf8d2c9913169ece7d9b38ed562cc3601065', + gas: '0x12c78', + gasPrice: '0x47a3d0284', + hash: '0xef8be164d94c0eb5f2bdee4e23897d7992cf6eed26ea29543070ee2798f7469e', + input: '0xa9059cbb0000000000000000000000006c4d1d6d66ded59850bc86b3421501e51cf02e3000000000000000000000000000000000000000000000021e19e0c9bab2400000', + maxFeePerGas: '0x62bb2392d', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x33', + r: '0x25181587b27718980f719f401a5f6013cd6925827d16c2ad44be78edd2235590', + s: '0x601f289cfde285f95add07c1c6248a3257f08683ed100d58cb2816edc5619e91', + to: '0x090185f2135308bad17527004364ebcc2d37e5f6', + transactionIndex: '0x7c', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xeaced7279d1afb93ec00a7990a45a8a1b2996ddb', + gas: '0x267f4', + gasPrice: '0x47a3d0284', + hash: '0x3fbd6a8181c0fbfb48689db9bc12e4615ca4afc49607a06c8899c5eace3c087c', + input: '0x4488c7cd000000000000000000000000000000000000000000000000000000000000038c0000000000000000000000000000000000000000000000000000000000000002', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x8', + r: '0x8b5040ac315a9c89b115670c17f8535b9598e5bc87342a7f5c3071aa637c793d', + s: '0x77d5b8dfcb4f235dd14f1cee059c49e7d8218c7190782a969912c68172f1ab25', + to: '0x4623900e6d0495cca743665dce8fd815b0433e5b', + transactionIndex: '0x7d', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x250e1215ee94b57caa6dc759bd8d09572e953e1a', + gas: '0xf01f', + gasPrice: '0x47a3d0284', + hash: '0x446b5bd934e67d7c6549077efee4b02f439fd2e1115914173ed449f223b45aee', + input: '0xf90a82c800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000011da', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xfb', + r: '0xe679055f660c0595492297288a7e9503f489383c7a74849d849a125b153fc770', + s: '0x4aafb347706a36f9be7196c27531f8c43b2d07c0a51af60da89532a33f37e22e', + to: '0x39ee2c7b3cb80254225884ca001f57118c8f21b6', + transactionIndex: '0x7e', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xb9ba3f911fe7f16413da6d9b8e4726f7ad31bd77', + gas: '0x17fc6', + gasPrice: '0x47a3d0284', + hash: '0xe65b6bec825c8ce3df9456cdd55390cbc09fc5f86c20e19455d67968339ac0e8', + input: '0x441a3e7003b89c46295889c5aadce5b73ae8551f3dbf83530ce27c345d6fe94fc43f337e016807a4e2986bc9d4c2c6a2fff6b2c6f351989c0f7a6d2164377848aac7c5d5', + maxFeePerGas: '0x62bb2392d', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x1a', + r: '0xf347daef28fd1489cf97fb24456ac33928ff5138d8f607957d0001e341d37f33', + s: '0x3a14d4de05e89b99eb732b60ba9aa187bd71898ac7e941ed370efbb8e49b2021', + to: '0x5fdcca53617f4d2b9134b29090c87d01058e27e9', + transactionIndex: '0x7f', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x6587d861b7cea89e0e78ae4897a1a757bb40cee5', + gas: '0x517cf', + gasPrice: '0x47a3d0284', + hash: '0x9aa4c2aebcb87337eaafd0768324e964af29fe34948a73c3f65205578874faa6', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000064363f2b00000000000000000000000000000000000000000000000000000000000000010800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000043c33c19375648000000000000000000000000000000000000000000000000000000000000006510e0700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000138c2f1123cf3f82e4596d097c118eac6684940b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x64', + r: '0xbfe992343bd6b9596ab42bc31ee97e82f4bf9c80c63c67ca0cc96b708c3cd032', + s: '0x4bc0740e037b12397c1611036fbff0c71179edc73db0f9089d6f8e886b1214ca', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x80', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xfa756425b596a6f602460320c1447902457be9cb', + gas: '0x3b699', + gasPrice: '0x47a3d0284', + hash: '0xef8f8c6d22ee2165d735ed573e867e701dda02189a7ab991b788ccaaa132f8d0', + input: '0x5f5755290000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000017616972737761704c696768743346656544796e616d696300000000000000000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000007aeadc0000000000000000000000000000000000000000000000000000000064363f85000000000000000000000000b3c839dbde6b96d37c56ee4f9dad3390d49310aa0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0000000000000000000000000000000000000000000000001d750cac918e850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004686be3d4b5000000000000000000000000000000000000000000000000000000000000000001cbcd6a8d79453d9080adad1120abd9f94ba6fb23ce2828e5a434247ad8679971918bded729941b84e7090a75edd53f3d553aebd05d4a193f306b4ac1ce369103200000000000000000000000000000000000000000000000000008726a236b000000000000000000000000000f326e4de8f66a0bdc0970b79e0924e33c79f19150000000000000000000000000000000000000000000000000000000000000000d4', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x2', + r: '0xbd79bee27f16a4031e0e63d950fdce905c6252022690654106987e87b7307dde', + s: '0x13a1b7292f7bd63906e40c7545fc3dece31bba4423b475e5c113109e1996a532', + to: '0x881d40237659c251811cec9c364ef91dc08d300c', + transactionIndex: '0x81', + type: '0x2', + v: '0x1', + value: '0x470de4df820000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x65a8f07bd9a8598e1b5b6c0a88f4779dbc077675', + gas: '0x249b3', + gasPrice: '0x47a3d0284', + hash: '0x260725511b21a06d2232db5c7f6f88ea5bbdacccec4b78569a818927a80d839b', + input: '0x0b86a4c10000000000000000000000000335a7610d817aeca1bebbefbd392ecc2ed587b8000000000000000000000000000000000000000000001159db99924a0b63247a00000000000000000000000000000000000000000000000003d335486200732c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000004de473465ca7f47e82033303e5d0aa0f49700e960eae', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x133f0', + r: '0x7ab0c2b5c6dc410da3f42d236a3d94c7da6c12c182465c26fa0c17b430e6c956', + s: '0x6618d10da00ede136502805d6375a2596085183a79fe6e508024d9cf3d2c3550', + to: '0xdef171fe48cf0115b1d80b88dc8eab59176fee57', + transactionIndex: '0x82', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x0d29bc8f8e5ca0bf78727f83ab9b577414abed0d', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0xd8b7c50d281e37dc01810fbd1c3cf314d707d175feb50f1c94e5cd07722a8e6c', + input: '0x', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x6', + r: '0xd4c34b8c853fc0ec5a5e6684de1b416439162be033d48b3d01abd294005b6c9f', + s: '0x6fbb55f270eb517a4eddc48c57f912188b7d95ec7803df7f943486022a5cfea7', + to: '0xab22705c4adae6503edfc3077b2884ea1761b7db', + transactionIndex: '0x83', + type: '0x2', + v: '0x0', + value: '0x20c0169a35ac5ef', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x7d8859caf443181d2bb13ac2dfea8b44cb663166', + gas: '0x183ac', + gasPrice: '0x47a3d0284', + hash: '0xa78b1dbfda5a5cc59a760c03e3e38064db95dfcb7f6b8d5d5810ecd31f445335', + input: '0xa9059cbb000000000000000000000000bb34867d3e8129223fd1c5369099b1c89302185c00000000000000000000000000000000000000000000000000000000a2308de3', + maxFeePerGas: '0x67cf7f4cd', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x7b', + r: '0x171001f29b776d199fbba9586b240043d587102d654a8b9e9e5f06131dd89a60', + s: '0x152d296ccb9c487edb05e4276c2796414c5a8929c7f127a3d08d09fb3e8219e6', + to: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + transactionIndex: '0x84', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x22d2df0ce76a61aeb1a8a75582220d67da14226a', + gas: '0x16843', + gasPrice: '0x47a3d0284', + hash: '0x5470c161462213629f4d2b7402fdfda71a6fd3721d6bd5d699dcb9bc24c50d21', + input: '0x439370b1', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x0', + r: '0x12e091f6e84b915b7c343453731b4ac8a8225aab24f57fae2e37b0fdc9eb7625', + s: '0x3f14a8cf96eaafc238eaff987ee29e462b790d83ff7aeeb65c0635d82f94f8ca', + to: '0xc4448b71118c9071bcb9734a0eac55d18a153949', + transactionIndex: '0x85', + type: '0x2', + v: '0x1', + value: '0x38d7ea4c680000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x6b1a08b839e9e0b17654cb136cf6bc256da482d8', + gas: '0x3a02f', + gasPrice: '0x47a3d0284', + hash: '0x0943c536186591acb818e8ace6fcfd4af0df06b8853c30ddf185f78ae54ccbef', + input: '0x5ae401dc000000000000000000000000000000000000000000000000000000006436437b00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e404e45aaf000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000000001f40000000000000000000000006b1a08b839e9e0b17654cb136cf6bc256da482d80000000000000000000000000000000000000000000000000035c63d009cfebd0000000000000000000000000000000000000000000000000000000001acaebe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x6', + r: '0xe28a0a218e0699a8c592d5468c915ec4088659ce637c0969533bd8a32f00deca', + s: '0x401ef72021a21de34b623e75fb01293d335e6f0ebf4389eba6b1a38076e74d9a', + to: '0x13f4ea83d0bd40e75c8222255bc855a974568dd4', + transactionIndex: '0x86', + type: '0x2', + v: '0x0', + value: '0x35c63d009cfebd', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x296fa974a8a4e3d749a4d4e3b9ccca7bbcad423c', + gas: '0x4d4b0', + gasPrice: '0x47a3d0284', + hash: '0x66fd0cb4264aa2e61fa2e4abc224f9682d09092865e1025974a4bde51ad906d8', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645d300000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000044c5662810cd9d000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000044c5662810cd9d0000000000000000000000000000000000000000003a9ee6b1a463c311449d4300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f0bef9840e4f7166e52c7af2d72ec566bbf39bdb', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x6f', + r: '0xfa9298dfdecc4b63821071e864c0cca273ff63f0d8ad3bcdfd03dc9883d7d905', + s: '0x0d234fb1b27f627e25edded27bacff2946b348c29e5c89f268a405765a7ff65f', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x87', + type: '0x2', + v: '0x1', + value: '0x44c5662810cd9d', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xa4026608c63744182f8b07de8379fd689e2826f9', + gas: '0xfe52', + gasPrice: '0x47a3d0284', + hash: '0x13e1fddea8ffcfb5847041614af2e1502a7be4f0507645fa5216ed8b661e6c23', + input: '0x42842e0e000000000000000000000000a4026608c63744182f8b07de8379fd689e2826f90000000000000000000000007adb81180ac5a676a2030520d5a5fc3e81421003000000000000000000000000000000000000000000000000000000000003fcec', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x94', + r: '0x089406d0133a909552145bb4b3b9088117aa3fc80fba3d91e760a649c2529a3d', + s: '0x5ba6c1e240821b42d1faa648e9324421a51053e5c06659a2a727d196f6ec9b8e', + to: '0xe42cad6fc883877a76a26a16ed92444ab177e306', + transactionIndex: '0x88', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x4c949d612269b654e7e18990752cb3b1d3878113', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0xdf214d4148f2ac955b0c1097b2c633b5dfae2751a965cd9260b12874ae12bfd9', + input: '0x', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x12', + r: '0xe844d08332e69f6dd257146dee8d95648c43056b5163ac81eca2f5773b9c3852', + s: '0x04dd4396702a1dc05e74ca5e5cd39b506d991d0f5dced3fc3bc3c0d5080325d7', + to: '0x3c19a291b31f92ef45b847a89fe5d21acfacc632', + transactionIndex: '0x89', + type: '0x2', + v: '0x0', + value: '0x853a0d2313c0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x7fbb9dfa7bda66a9f2ef19ee8392fbde244cca0b', + gas: '0x18100', + gasPrice: '0x47a3d0284', + hash: '0x9e0b6d88702128b00efba753c85fdedf93c4c91e242f8610e539571bca485932', + input: '0xa9059cbb00000000000000000000000035369b9f5643d3fde9e392c7e2e2ce263664024400000000000000000000000000000000000000000000006c6b935b8bbd400000', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xb', + r: '0xf472e0c5841a33dd6b12f27e3a0280f41beb8807d57b21166d4cf4049a8e523b', + s: '0x6c9ffdb00da3b3afae3b7a197eec25eb71ef0fec9a77b2b21ba1e5e537fb5326', + to: '0xd1420af453fd7bf940573431d416cace7ff8280c', + transactionIndex: '0x8a', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x08be4c9c14aa9a39cd07bb4310559b3ae503ff1e', + gas: '0x3cfc1', + gasPrice: '0x47a3d0284', + hash: '0xffc4ee5481e35cf09f5675a05593f8bcd1fbe3c0bfd742ba64655bfbfe5cdc59', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645df00000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000001ae5f29d27e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dde90a7dd65f0eee5cb61cfb973d735208308bad', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x45e', + r: '0xf48152acd401687a6273974d723be29405c3ad5001f0330f2967d87e88685120', + s: '0x70d0ecf89b9d2b8351e6ccd728034add7a9ffdbe1ffa70a20862e1c30a2941ac', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x8b', + type: '0x2', + v: '0x0', + value: '0xb1a2bc2ec50000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x22d44bb13a8935af45a9d85be518be256a2f5ec7', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x8628c214d87f83b8b6325d648383d3a34a9abc54d7be64606b9e9393c5bb2c87', + input: '0x', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xc8', + r: '0x39287564d388296ef932ad463ef6be1d3cd70e421c3db343f2622f814e848eba', + s: '0x6b0e433c0f0577aca309ddcc2144d28da94a9033fa3fa10846195dc3a602afa3', + to: '0x22769f975be0632bccc29392a66bcdd353246f74', + transactionIndex: '0x8c', + type: '0x2', + v: '0x0', + value: '0x30d98d59a960000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x941dcc59efdae9570c7618fddb351c657d0643c3', + gas: '0x27111', + gasPrice: '0x47a3d0284', + hash: '0x57840573da6aee90a1df7c054e694cea1bdbbcc0ce5504a4c47296bf93b75301', + input: '0x9ff054df00000000000000000000000000000000000000000000000000000000000001c1', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x0', + r: '0xc6d1fe1d09c919751d1938a970e92553bd0ce6fdbc5a257607b22fcddf2792f5', + s: '0x16f43b2fbf8d7a5e555d56707e3b8cd91b7a4fa29d046da608c07ebd5f437f40', + to: '0x06450dee7fd2fb8e39061434babcfc05599a6fb8', + transactionIndex: '0x8d', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x3d9aa2631c4c10654bbfe03208a572dbf0b40b7a', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x7495e9e0cf9f848a202fc3e051bce519b26967c4933ea9f4a3744d75964124b3', + input: '0x', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x2', + r: '0xd2d2622af6f8847b9d4cae57e2432e51186f916ad83fca7e596b862c1d3b779a', + s: '0x5c1a52734132e091d26f17eb9f28d2379b2b19b67b0d0f763e269374acb852fe', + to: '0xc5b1f58cea87704cc87510320d8390964b6fe88c', + transactionIndex: '0x8e', + type: '0x2', + v: '0x0', + value: '0x1caf12ad1c106c0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9ceab4d15f394e3074239fe6f761dfaed566422b', + gas: '0x7016', + gasPrice: '0x47a3d0284', + hash: '0xff7d2273873f7b16e131755ed47ed8de55e540a4bb8d47449d84127ddd3a8bb5', + input: '0xe56461ad00000000000000000000000000000000000000000000000000000000000000890000000000000000000000009ceab4d15f394e3074239fe6f761dfaed566422b', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xb', + r: '0x307eb7a3dc0fcdcea16fe4cf43e3be64ae57ee1700b95712d065a771bf5b135a', + s: '0x134b00a67f5d7188ed38752373ce88f4e81226b2fbd514cca6c418d94e8e46df', + to: '0xb584d4be1a5470ca1a8778e9b86c81e165204599', + transactionIndex: '0x8f', + type: '0x2', + v: '0x1', + value: '0xeebe0b40e8000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x399b15d63ee62bf2f07a14069d3256bd656a1f90', + gas: '0x3ee36', + gasPrice: '0x47a3d0284', + hash: '0x2dd3225299367625b920766f718ecd62d0d66738ece52fd44c4adb0f8f794c75', + input: '0x5ae401dc00000000000000000000000000000000000000000000000000000000643645af00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e4472b43f3000000000000000000000000000000000000000000000000017fb16d83be00000000000000000000000000000000000000000000000000000000206f9e7348ad0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000399b15d63ee62bf2f07a14069d3256bd656a1f900000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000da4dd9586d27202a338843dd6b9824d26700678300000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x1', + r: '0x156cb4ab98cba596713e343fd3ab2f8a90203f8cd7d316bd375d111895f92ae1', + s: '0x2117eff2c33ae5e1103367254bb32efb37abeec4cf598dfddd663c1cb0c2fd32', + to: '0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45', + transactionIndex: '0x90', + type: '0x2', + v: '0x0', + value: '0x17fb16d83be0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xfa4535d38843f78788edb2188485663db5a1c273', + gas: '0x42273', + gasPrice: '0x47a3d0284', + hash: '0xd600a0365ebc112528c0464dd4562de2a74eb692004be7a08b60a821c8dddd19', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645d30000000000000000000000000000000000000000000000000000000000000002080c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000003913517ebd3c0c650000000000000000000000000000000000000000000000000000000c49b43985820d5200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000308516e6daac88d719af5a6d7ea2a82d8c8e7356000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000c49b43985820d52', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xa2', + r: '0xd1d608c88b68bd71672371bdfe112966a15d6244cceed691388e836a0e6c5259', + s: '0x2e6d9e638035e9e493f0edbd874205e1d1d4c4d7a8d0d826e98e7e1dc92b5c83', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x91', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x61098ee5109aa530c2fd73c059465ebf813fbdd4', + gas: '0x31418', + gasPrice: '0x47a3d0284', + hash: '0xdb05f67a2e1f965826ca9aae165d96ec1883129ba84718da14f7c35a6e1e342d', + input: '0x6933e79a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000cda72070e455bb31c7690a170224ce43623d0b6f000000000000000000000000000000000000000000000000000000000000003c516d525976506b32726935417836734b4577734144466362316377365a4e53704d376965627654444337713757672f6d657461646174612e6a736f6e00000000', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x6a', + r: '0x128e7fe55747469b4be913e4706a22b206f994208b64aabc39d3825606c00555', + s: '0x185f45cb1c7c6d16f30ffaabd347b5b2cfe7c2c0f17f4e48b3e9a6654a132ce6', + to: '0x2791b93591de3fad825e41bd593c53481f407f82', + transactionIndex: '0x92', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xade95db92eb86329b08f1c67bee2636fe922f9aa', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x50734d83880b3f249d60c15226df34c22e222faa5079c3d7ed7665dddc906ece', + input: '0x', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x2', + r: '0x69d4b620c6a3d91efadbc9b3e3d8be839e226d0636eca2b3b472a07404d22630', + s: '0x1dd6083f4de1ab299ea3afb89aca0fbe749bf4654f0b1595caf2dd36ee49cb8f', + to: '0x9d281056b1591889c481b48c9ada12afbaedb758', + transactionIndex: '0x93', + type: '0x2', + v: '0x0', + value: '0x449c9dce3988000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9ffb5f8a0f2c4ae6538e531bb1e5ae44847a3c40', + gas: '0x396cf', + gasPrice: '0x47a3d0284', + hash: '0x6173d906ffd35d3b326a3e750b6d663d2955fdc6deeab20e409af5385cf8e4c8', + input: '0xfb0f3ee10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e18405b53e50000000000000000000000000000968a15596c0f760a3813b79fa85d442a35760a95000000000000000000000000004c00500000ad104d7dbd00e3ae0a5c00560c00000000000000000000000000769272677fab02575e84945f03eca517acc544cc00000000000000000000000000000000000000000000000000000000000017c40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000643639070000000000000000000000000000000000000000000000000000000064378a870000000000000000000000000000000000000000000000000000000000000000360c6ebe0000000000000000000000000000000000000000ef0b1e2cff64c8340000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000027f7d0bdb9200000000000000000000000000000000a26b00c1f0df003000390027140000faa7190000000000000000000000000000000000000000000000000353cc731f590000000000000000000000000000cf398a1ed09a38613d2c76366e9a4b2cf21eb03f000000000000000000000000000000000000000000000000000000000000004006ea7ad410c362854f8903280b5650fb214f8ccc0cc9dfbd0ddd4f1cd7b0251fd239906faaec755675273f21b5389ea77b09d432257ae26b006898e2cfffcc511f6e66746e657264732e61691f', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x3a', + r: '0xe14680f20870065765c3c1e48dba3ff8fefb013b84a98a9eb0bfd11e8b535d45', + s: '0x5ac7f29ac66342e710db290258958d7f9dabfc475cf71e2ec01a92cf91e0b47d', + to: '0x00000000000001ad428e4906ae43d8f9852d0dd6', + transactionIndex: '0x94', + type: '0x2', + v: '0x1', + value: '0x63eb89da4ed00000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xab234769c7b777736fe0296190e9b6f69dcf6ddc', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x00c1a4dc51c377b6bb00af16bb30526543f727c11a6370741191979c471d1ffc', + input: '0x', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x4e1', + r: '0xc83c53992ea82dc9ca2b48702930f9e296fcf84c6cddc12dd36f5cb36f771143', + s: '0x52e4d4b69c01b5a39874c92c78ccddbd47afc5b8b72cc6053c88b6ac1985b555', + to: '0x5b235e2844eab73c073a54f6928b7f8358e51e32', + transactionIndex: '0x95', + type: '0x2', + v: '0x0', + value: '0xbfbd6dd6872000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x5c91a8f7147e6ab2765e6cae4a283c0055e2ee8d', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x8c7518bea80f39a803930123b6782845ce8f8d99a782163aadfa924cbb28ee91', + input: '0x', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x7', + r: '0x3f518ed2dbd15a13948873b15a61e35a685a2819d330c17a6c896fb577887f92', + s: '0x209ab4820a10c06cfc24ae4dc64fe98106eece4bf69c5ef0c26ee6524f1b88d8', + to: '0x036b16b5067a1c0c6923c9526bf76fb125619a9d', + transactionIndex: '0x96', + type: '0x2', + v: '0x0', + value: '0x214e8348c4f0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x609946cccb57a391dc7cce2cff8cbe8a29343d0a', + gas: '0x52c11', + gasPrice: '0x47a3d0284', + hash: '0x4ceca9cf5bff5da1d3d1837fb77f1f576767b8a9d6d4062de0eee706b7773d6a', + input: '0x8af033fb000000000000000000000000555b6ee8fab3dfdbcca9121721c435fd4c7a1fd10000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002d886570a0da04885bfd6eb48ed8b8ff01a0eb7e000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000609946cccb57a391dc7cce2cff8cbe8a29343d0a000000000000000000000000000000000000000000000000000006406d04bd1c000000000000000000000000000000000000000000000000007f6ed61eb47df2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000064364371000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003beeab9d5624e487045e01d12332975204a04a8a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000006406d04bd1c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040d07961740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000003beeab9d5624e487045e01d12332975204a04a8a0000000000000000000000002d886570a0da04885bfd6eb48ed8b8ff01a0eb7e000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000555b6ee8fab3dfdbcca9121721c435fd4c7a1fd100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f87b22536f75726365223a226b7962657273776170222c22416d6f756e74496e555344223a2236332e3337383736343437373833333236222c22416d6f756e744f7574555344223a2237312e3232333835333933393134343833222c22526566657272616c223a22222c22466c616773223a332c22496e74656772697479496e666f223a7b224b65794944223a2231222c225369676e6174757265223a22625a6658774a7632434643422f5767677736704c39536c6f776e6c305368684c34725a416e346b784a2f2f39385935584c6f34354f585a72424b387746423076786673356b576f753374334b76322f6c7a734952352f3039445a3566696132567169743970632b644c324f6e663052766948716949636f5a5172707a6a64414538747171586967743761543354723045584b465855373078466559427157426e6144536d436774636a696b566a666f452f6376314a686234716b4f6e626338307530744b4258487279525a3576412b4133373656614f70776c5531315a665275773567734b3963626171735a61487831674f596b52547658786337524c4939326b73324c386175787631756943574a5653574b44446254335059594d4c6c623046492f66396e5a694638345048376f706c48512f69686875724d4879444531774868383430665845422f6b4347674a4451592f7771673d3d227d7d0000000000000000', + maxFeePerGas: '0x62bb2392d', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x32', + r: '0xfb775bca5c6dc8f9920b24e4108bb822cd272a68e46c22ca9599d234a309e572', + s: '0x6a9a15cac84e1b5f1cc71130261b746317ef68066b46806e783324ada7583854', + to: '0x6131b5fae19ea4f9d964eac0408e4408b66337b5', + transactionIndex: '0x97', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x92265f4c85619ec8b70bb179ff1f86c56e54d348', + gas: '0x36a70', + gasPrice: '0x47a3d0284', + hash: '0x03f236728362e5cfc12a712b822a3ab1d79e0eb0268ea771dac94c17750283f1', + input: '0x00000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017d074e88292000000000000000000000000000ed7c461fb6569c1e462d9da7f3ac2e99285f268d000000000000000000000000004c00500000ad104d7dbd00e3ae0a5c00560c000000000000000000000000002969fed452f73ea8a87ca427e27b13a40fc390ee0000000000000000000000000000000000000000000000000000000000001175000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064363c4c000000000000000000000000000000000000000000000000000000006436400c0000000000000000000000000000000000000000000000000000000000000000360c6ebe000000000000000000000000000000000000000098a48709306da1660000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f00000000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000009c51c4521e0000000000000000000000000000000a26b00c1f0df003000390027140000faa7190000000000000000000000000000000000000000000000000000000000000040551bdcf4ed7c88982d6e5142da8d2cdd76cb0176504a2db01df6faaceb0880c6ca1b733e4434382965114c4aa595080f087f132036a1bd56c40e32493640a5f900000000360c6ebe', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xda', + r: '0x7755f3a5db7f2d6c3bbfca52413d7231f949b00cad3ca483f570d7da82d2b58a', + s: '0x7f7853211ea73c04bdd968bab6856533ad10b6aef7c972796ed816ec817f3f44', + to: '0x00000000000001ad428e4906ae43d8f9852d0dd6', + transactionIndex: '0x98', + type: '0x2', + v: '0x1', + value: '0x186cc6acd4b0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x224030f891006c76ef26b3a768d7792e8c89a960', + gas: '0xfdfe', + gasPrice: '0x47a3d0284', + hash: '0x57574acd1a26c9e233f2ba2c5a7c8b81f6dc05ac9b80b1f87a586937322df147', + input: '0xa9059cbb000000000000000000000000f31ea0f0704545c68e9faa02e8d27d59990d40970000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x7', + r: '0xdd2f51f56265814170f0f1829001633009f61a04a79158242ba614804a60f925', + s: '0x24e18bddb2120817f0a86f22a729a249ad74f88f846c86dd616e9c57d1f7c3f6', + to: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + transactionIndex: '0x99', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xd6bbc0a9dd616c806e05e281955982f2f561bf3b', + gas: '0x120b7', + gasPrice: '0x47a3d0284', + hash: '0x2f51883b48c322148fc624e8c4c974f4ffe960cc65bdd9bed9085c899eed8926', + input: '0xf242432a000000000000000000000000d6bbc0a9dd616c806e05e281955982f2f561bf3b000000000000000000000000a52687331bf9548f01409cbd819176cb79e9e1e20000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000360c6ebe', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x204', + r: '0xce97b3a6b4fb2bda791367c6566290d8ee38a5d39625ec5260cfb21eb3dbe73f', + s: '0x2f50aeaced4b502f667f2ca74d6e929a0b4be6350f4090a4364d58c8281a0514', + to: '0x4faab2f1851b58c26028ab7ba2873ff3c7b52d4c', + transactionIndex: '0x9a', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x98784a6f846289821f3cd18fc053be007b3a3a82', + gas: '0x2b75b', + gasPrice: '0x47a3d0284', + hash: '0xa335d36a424727d3d6a533abd8c1d55c1647272140e20590852266f66bb21055', + input: '0x000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014ad425897c0000000000000000000000000001faeffe0ef6020ce181e6ff14f3824cc114020cd000000000000000000000000004c00500000ad104d7dbd00e3ae0a5c00560c00000000000000000000000000dcb1cdfe2b5f592e7bdc2696b7a68c6e866c4cc200000000000000000000000000000000000000000000000000000000000009fb000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064361c2b00000000000000000000000000000000000000000000000000000000645da92b0000000000000000000000000000000000000000000000000000000000000000360c6ebe0000000000000000000000000000000000000000675eb253775aa98d0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f00000000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f00000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000886c98b760000000000000000000000000000000a26b00c1f0df003000390027140000faa71900000000000000000000000000000000000000000000000000001b48eb57e000000000000000000000000000531a0dd30906366fa738acc2d48e790de54bd33e000000000000000000000000000000000000000000000000000000000000004022815c7a06981c9c774bab95b640d57b0f7e7501cdaf5c0e579c52d79385b8dd7221abb8312af27d27e6951cb7cd5177ee7eee435c77398d532f1db2f6acf0d400000000360c6ebe', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xbb', + r: '0x49c82cf38ce3a5299818ea25b4e6ecddaf08763b39dc9c280625ee6ef154321c', + s: '0x0de8fb753fbdffec681cc6803a71f93783a6a1a8f2189870e70db2e6cfe30559', + to: '0x00000000000001ad428e4906ae43d8f9852d0dd6', + transactionIndex: '0x9b', + type: '0x2', + v: '0x1', + value: '0x1550f7dca70000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x77964f036e1b7bf6d06e0948146f10653891b4ca', + gas: '0x42c19', + gasPrice: '0x47a3d0284', + hash: '0xab5f09775f84c67c0105a2a0708a0d8e0944f6104357944074efc7e0933fbcf3', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645c700000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000dbd2fc137a30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000dbd2fc137a3000000000000000000000000000000000000000000000000035be3ef062482df432200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000054b8d105aa09342fad6b352d41a0bad3e1a9aa9d', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x0', + r: '0x4e8f50c8c6a483fb296f7c10525d1ae2ccf45cd1156cc6c4a04931fbf89adfc3', + s: '0x4ad31852b9fc33f8cdd02ac393de63af02542aba2dbf1cc80c5d410c26594356', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0x9c', + type: '0x2', + v: '0x0', + value: '0xdbd2fc137a30000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x05c250120ce07ba6fe361b39ac344148435c25ca', + gas: '0x286ea', + gasPrice: '0x47a3d0284', + hash: '0xfc344b84da81960aa983cbeed2a393d9b1fa7aabb0d844e6f82a5f6c94a3c086', + input: '0x357a150b0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000003d3f39a68d44300000000000000000000000000000000000000000000000000000000643669090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005c250120ce07ba6fe361b39ac344148435c25ca0000000000000000000000000000000000000000000000000000000000000000614b494a645ca1534a5d114f720c85e71c2931a1b0be75fc36875b9bc272c4172042345e6d1af8c10e6a2ba3e9a842015bc766d23af0abfcad29d4394e1b0c54000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000133ac9b351b069cf4fbac6240ae74b9a000000000000000000000000c92b2d2dfd0083aaa38ff07d543e2b3a937edcd400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000645dcb24000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c0d9ebc70c37844d0f729f054bdad42e09782252866dbf15f847bb31818da7a317128963519528264e89d394d6bd813ecf9ef501e92c5f3c547618a50768bb436d000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000d71b0fe0a28e00000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ed5af388653567af2f388e6224dc7c4b3241c544000000000000000000000000000000000000000000000000000000000000090300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d71b0fe0a28e000078d1f73e7e9d57b89b236154f0d04434bb5c8e241111656c94dd04f9b3721b35000000000000000000000000f849de01b080adc3a814fabe1e2087475cf2e3540000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x39e', + r: '0xe77bef1808fb6fe5657d92b672e75390856cab77a4e3bb6fc8e5651d262f077e', + s: '0x303f114a56069f8248e68b97a1f567f06c8329658413e66d6a1eca8f331fae29', + to: '0x74312363e45dcaba76c59ec49a7aa8a65a67eed3', + transactionIndex: '0x9d', + type: '0x2', + v: '0x0', + value: '0xd71b0fe0a28e0000', + }, + { + accessList: [ + { + address: '0xca37a2f2d84867dcaa7f6ef07dc06ae3e7fc06a4', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000000', + ], + }, + { + address: '0x498c00e1ccc2afff80f6cc6144eaeb95c46cc3b5', + storageKeys: [ + '0x0000000000000000000000000000000000000000000000000000000000000008', + ], + }, + ], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x1cac7a07e8cb87b73d94747028845638d55d3fde', + gas: '0x29b6c', + gasPrice: '0x47a3d0284', + hash: '0xe64be15aecd91f995ace79f4019a9527a8abe979a3468b35600da437a1478c70', + input: '0x8119c065001300010000000000000000000000000000000000000040fdaee81f16de231d5f18ea482ad5cc6bc65803817c99f477043dce850001000100000000000f1b30ca37a2f2d84867dcaa7f6ef07dc06ae3e7fc06a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20100040000000000000f3688498c00e1ccc2afff80f6cc6144eaeb95c46cc3b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x221f', + r: '0xf8b669d3e358375cf0dd8d88497bdf4769b2ce9897468657d91a96b884bdec63', + s: '0x36236400a44bf6bd812afefa5deaf53450bd3597e57932c019a7e831ac05e224', + to: '0xd6fca65266adac7a35d679ad53dd3aea1f94b95f', + transactionIndex: '0x9e', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xd17fb9fb5a0f3f4f3e6e921ba6029bd267e32bab', + gas: '0x748c9', + gasPrice: '0x47a3d0284', + hash: '0x004a9a2ab277e27f7004aa54b28981e62cdc495d3186fb06e158e8424cf5967c', + input: '0x883164560000000000000000000000005f18ea482ad5cc6bc65803817c99f477043dce85000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000002710fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea6b0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebee800000000000000000000000000000000000000000000021e19e0c9bab23ffff6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021e19e0c9bab23ffff60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d17fb9fb5a0f3f4f3e6e921ba6029bd267e32bab00000000000000000000000000000000000000000000000000000000643645df', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x48', + r: '0x43e933dbf91ec15bc5918ae2859f34eea3377a27c6c9ae4b03fe54e7d8e68970', + s: '0x57de9c8cefd00fabf794f6902d9b3fa572e4ef7d89bb963476893cd2a0fb475b', + to: '0xc36442b4a4522e871399cd717abdd847ab11fe88', + transactionIndex: '0x9f', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x4e2d8c65ab9fa2c793c32dceacb83e97f3736de1', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x684e32bbc27f76e759dc9f785c98be14d26f6e1010ef75cc025c70945f530fce', + input: '0x', + maxFeePerGas: '0x55ae82600', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x1d', + r: '0x77f429777d123871ff3684cd1270b395776660622b5418337126c8b25e252e6b', + s: '0x313052affd142ecc6d29050bea16d93f419c6f03f42a2bf36d05c770b43bab4b', + to: '0xa456dbd1bedee6467ef103fc58b079b0f790335d', + transactionIndex: '0xa0', + type: '0x2', + v: '0x0', + value: '0x4e0ee6386378e9', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x91cfe6dbb2b98ce6fb549cb3334a90dd3a69e584', + gas: '0x14079', + gasPrice: '0x47a3d0284', + hash: '0xddc2aba98e71ea83790e0d5cbab037f6e70bf5a58d9790364cab6f4d852ae897', + input: '0xa9059cbb00000000000000000000000008f918c66d54f4c51f9a76cb9a956faab2d49abe000000000000000000000000000000000000000000000009cc9419a32267574d', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x3f', + r: '0x744a97f9d54ffe6b867fb382b4f0aa3424b65d7681d6c21d9e5357686a5c18f3', + s: '0x44a8ee67be7916293e2e9aa0c739741026bb4d3f8a4b902258548e99b2b14f21', + to: '0xf063fe1ab7a291c5d06a86e14730b00bf24cb589', + transactionIndex: '0xa1', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc50ab42130bc706b7d191451a7ef34ad3eec2a16', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x2fe22d7a6493b92654f01e5ded1cb917c5c2924a38e663128046a7952a2c93ec', + input: '0x', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x19b5', + r: '0x83d760f376a400bb79c0f72c49d735ded55eaf3052823d309f46b823001d12fd', + s: '0x58744ee0289fafd6b66b7284defc673650cd37b56802b96a6ed786140fa504a2', + to: '0x8fe4243374d944921e7e2409763b558e217c7467', + transactionIndex: '0xa2', + type: '0x2', + v: '0x0', + value: '0x1587a89f94ac2000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xede7a7548c40cfed7d4449ace8a5803bc0ca15be', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x7fcbb7a587ba7d0165a58b5e6e3020988dd4920b318ba340080b1ad762998f0e', + input: '0x', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xa1d', + r: '0x9861b090ae2e89e38637a8bad32fe050497210a735651e5289796cb5366f1c15', + s: '0x014545f75104bc56668f7a4ad21417ea7c75f4b38b3592b7701d232177fe231e', + to: '0x73d7385bdd6493e88e348b3b6c0b02bcb77779a4', + transactionIndex: '0xa3', + type: '0x2', + v: '0x0', + value: '0x7b3c18f3a578000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xa99d4976eddb861137802bfd210550fb054ad62f', + gas: '0x1526e', + gasPrice: '0x47a3d0284', + hash: '0x86b6bcf0ceb9b60090994f3dd76788cef71d348ca69fffdab38754815b73e85c', + input: '0xb88d4fde000000000000000000000000a99d4976eddb861137802bfd210550fb054ad62f0000000000000000000000009e027ca9b35b1dad472200c27660545246953c4c0000000000000000000000000000000000000000000000000000000000013abe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000360c6ebe', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xdb', + r: '0x69a986ebcab6f5c0f19b849353b3de5e576c866e72577d1ed8a92f3358e4b6a8', + s: '0x70d0b38161ae8f4098b59b26d6f3fd613cef0fea5c8b08b33d5cff5fa00de22a', + to: '0x5b1085136a811e55b2bb2ca1ea456ba82126a376', + transactionIndex: '0xa4', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x78a3e8804f97618b5aa5b35f5a0caccc8c91adb0', + gas: '0x49d40', + gasPrice: '0x47a3d0284', + hash: '0x8eadb42b3a03ff3e8523f5830f6c95a3264fb9276317ddbc3e8cc97fc189db1d', + input: '0x6ab49a5b0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000004b2000000000000000000000000000000000000000000000000000000000000071700000000000000000000000000000000000000000000000000000000000007330000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000090c0000000000000000000000000000000000000000000000000000000000000fc10000000000000000000000000000000000000000000000000000000000000fd90000000000000000000000000000000000000000000000000000000000000fd80000000000000000000000000000000000000000000000000000000000000fd70000000000000000000000000000000000000000000000000000000000000fcf0000000000000000000000000000000000000000000000000000000000000fcc0000000000000000000000000000000000000000000000000000000000000fc70000000000000000000000000000000000000000000000000000000000000fda0000000000000000000000000000000000000000000000000000000000000ff20000000000000000000000000000000000000000000000000000000000001165000000000000000000000000000000000000000000000000000000000000123700000000000000000000000000000000000000000000000000000000000012da00000000000000000000000000000000000000000000000000000000000012db00000000000000000000000000000000000000000000000000000000000013ce00000000000000000000000000000000000000000000000000000000000012dc', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x5', + r: '0x42b676d851eee42c7402532a95e6bd3c19cb6f97f5372110cfa2caa965d8723b', + s: '0x7106db6691b9bd61e380e5f9b9931e54f94355aa4a93314e1875ecc4059ce445', + to: '0x06f841244907a2c886f1e292ca19bd0c3e20fe4c', + transactionIndex: '0xa5', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x038e2f8244de9561e81eb4504062372aba7b3c4a', + gas: '0x5c176', + gasPrice: '0x47a3d0284', + hash: '0x022ac2d203c97313448c6439f25af381448c5fb250067c96abad48c52ea63b25', + input: '0x893419ca00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000038e2f8244de9561e81eb4504062372aba7b3c4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000064372cc400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020aa443a4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000008dd05800000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x11', + r: '0xe913c42b7e398941841f07b7c89b4016000b164e8794f71d66e6caac0493ef4f', + s: '0x7433145cbf40a5b8c40e79c1ec6b78761ca2fa8e00f8c1d288afad0cac8bb795', + to: '0xa9cc6d2b54cade299c5a86d959eeb8efc80df773', + transactionIndex: '0xa6', + type: '0x2', + v: '0x1', + value: '0x11c37937e08000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc39434996553087bc8dd76c55a5ef6b4caaa43da', + gas: '0x122a9', + gasPrice: '0x47a3d0284', + hash: '0xe71bed152a7e265fcdc08eb8f6f5217141c1660c79e0a2315801b48a17de9443', + input: '0xf242432a000000000000000000000000c39434996553087bc8dd76c55a5ef6b4caaa43da00000000000000000000000036ecf53bf3a9023122e8f6d94217cf4f2e32fae02218e854019d3ac7989333470e8cf7bda8b930f30000000000046a0000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000360c6ebe', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x1d', + r: '0xbec77779f6740f8b0cc2b3bf3541136da1011d8e6c9823110696501aa6b4ac65', + s: '0x5796326ce663e67c69f9d1da51c610c25e4c28fb254344342333c7402386f268', + to: '0x495f947276749ce646f68ac8c248420045cb7b5e', + transactionIndex: '0xa7', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x284861646298b1424f22543adf3cac028ac7af31', + gas: '0x37317', + gasPrice: '0x47a3d0284', + hash: '0xbe2db43eb64a29a1305510cee016accf743960735aed99bb4aeb831956531f5b', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645df00000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000027f7d0bdb920000000000000000000000000000000000000000000000000b93d99b22a768d419a300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006aa40d02115090d40dc33c7c5f3cf05112fa4f83', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xb', + r: '0x17eeaea751accb34ab696825afed4cf5852c84836306c73b89cbc4dcec7f2e6d', + s: '0x040b0bcba55c653c094ed116f2fd453770843b3cdbc6ed861f3a09084cc5149b', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0xa8', + type: '0x2', + v: '0x0', + value: '0x27f7d0bdb920000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x8bd2830aeed8c79ba6bfae868f005618b470429c', + gas: '0x1ab29', + gasPrice: '0x47a3d0284', + hash: '0x80f00d868b70689d383cdab459c9c68f606de18d4d5a4fc25258870e42aa65ae', + input: '0xdeace8f500000000000000000000000000000000000000000000000000000000000000890000000000000000000000008bd2830aeed8c79ba6bfae868f005618b470429c000000000000000000000000000000000000000000000000000000001e19b040000000000000000000000000000000000000000000000000000000001deff18300000000000000000000000000000000000000000000000000000000643f7965000000000000000000000000a6a688f107851131f0e1dce493ebbebfaf99203e0000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x15', + r: '0xdbe15946cfad124c7f3dc5d895e874ccd4431168738359cc4346f0b97ee7fb32', + s: '0x1ca6cd3b3433aa8051c582e77fc199c7db72cc5e82380d4eabc5b9afb90c9c70', + to: '0x3666f603cc164936c1b87e207f36beba4ac5f18a', + transactionIndex: '0xa9', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x631a717b14ae7de2305b5a3d6051984ffac61707', + gas: '0x2542c', + gasPrice: '0x47a3d0284', + hash: '0x2a69d29b4302deff2515e87041b722bb229603429ea4d31fe81c878efed67f81', + input: '0xb1a1a8820000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x7e', + r: '0xa992964c4535a1200cfba38f056d0700fadd5c5e0a8e5b0789a260fd3c669aa2', + s: '0x618b195d75a3d2a791d0e4b75040408edd888eab7c165e92ab22fb20a9ad0b59', + to: '0x99c9fc46f92e8a1c0dec1b1747d010903e884be1', + transactionIndex: '0xaa', + type: '0x2', + v: '0x0', + value: '0x6a94d74f430000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xeeaa1e883c352edb52e583f341a7f1067f0bc8b5', + gas: '0x29476', + gasPrice: '0x47a3d0284', + hash: '0x6323bd97a58dab264aaeea1aa12ece39b5eef1a1488e65f813609e1c47fdc66f', + input: '0xa9059cbb000000000000000000000000d2954377b6b13aae5bbcb88c8523ca648c5ad91f0000000000000000000000000000000000000000000000008ac7230489e80000', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x74', + r: '0xe09dc226594df121c0d40a9652e941282a521edb26ed138e3def76954a990141', + s: '0x2f7c710c8d3e3dbf9915a1607e223cb0ba78f27be41f89261f7e3b2d1885b089', + to: '0xba11d00c5f74255f56a5e366f4f77f5a186d7f55', + transactionIndex: '0xab', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xab954aca1a699b10db15bc027a17c9c57aace3f3', + gas: '0xb1b1d', + gasPrice: '0x47a3d0284', + hash: '0x9ff09456b9098544e68e8e27cd3f1445d8606fdfcdebfa74d24d1bc87a9c2462', + input: '0xac9650d800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000224e962172a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000128d9627aa400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000007aad0aad8063df7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000000000ddb71cddca64363df5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224e962172a0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000007aad0aad8063df78000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000128d9627aa400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000007aad0aad8063df7800000000000000000000000000000000000000000000000000000000007fc58f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48869584cd00000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000000000d4a6ce8f8b64363e52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224e962172a000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fc58f000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000128d9627aa4000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000007fc58f000000000000000000000000000000000000000000000000000f1aeace3dbdf300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee869584cd000000000000000000000000100000000000000000000000000000000000001100000000000000000000000000000000000000000000003ef84ccf4964363ed600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x5c8520e5a', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x4ea', + r: '0x068326fe3e2ef5f98b8661ac64adc95a38ae966bdeaf3b29f00a82d9ea6d9557', + s: '0x1f6b5b58f58cb4aa7c2491ec73fbbac5bd357d8fd41cb1602f602c9f60083114', + to: '0x5724b5bc7f54a52f4014e5f496ae380f89c881a1', + transactionIndex: '0xac', + type: '0x2', + v: '0x1', + value: '0x11c37937e08000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9f0bc974937f37d61ddf909d4124e9631a6986ea', + gas: '0x2b496', + gasPrice: '0x47a3d0284', + hash: '0x8d7f6f64c5cbdb533b579647746392c50db5fd0247981c7b430f4fe206bad302', + input: '0x6933e79a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000cda72070e455bb31c7690a170224ce43623d0b6f000000000000000000000000000000000000000000000000000000000000003c516d553678534c61556655616e5768554e32325236794459754245657861657278664b7266355844594c4e6371362f6d657461646174612e6a736f6e00000000', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x3b', + r: '0x7c1fec91a460221ac132cbe6f3cc850734e3e825f4391fe25313d2447c3a9724', + s: '0x3c1881ef1d6d43dafa41cc91572fe3f4526ff1f19007e85e98d4c6df2c16147a', + to: '0x626eb7f29d179e0e1e9deb97b3e5938a646616c9', + transactionIndex: '0xad', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xce3f52a81d998f37692ac85e6aa26029a3faf24d', + gas: '0x161b3', + gasPrice: '0x47a3d0284', + hash: '0xb94ff102a30dcdcf8c2b1385246a2f205f4a7937b58182b7df04e38dc4fba63a', + input: '0xb88d4fde000000000000000000000000ce3f52a81d998f37692ac85e6aa26029a3faf24d00000000000000000000000095d8bdb4a91f446d4ff00f95d42dd0f1f146a2c8000000000000000000000000000000000000000000000000000000000000010900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000360c6ebe', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x2cf', + r: '0x64fb24029162079701a1163f1957f15aa7bc1160f13450c19d4f7ef69441441b', + s: '0x4856e9bb26f1c490a9866ed11ee160ea127d80861662b5555aff436ecf889180', + to: '0x92c93fafc20fe882a448f86e594d9667259c42c8', + transactionIndex: '0xae', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x58aea486186fb1c6f93d38b9a7916750bd59c1ac', + gas: '0x32529', + gasPrice: '0x47a3d0284', + hash: '0x61ca13084a53b8edfc2beb3d1f967fdfca93359043a5da9c3678889b012ad0f3', + input: '0x21938f7500000000000000000000000000000000000000000000000000a1609b560d93cc00000000000000000000000000000000000000000000000001e7a5fb25a0b80400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000058aea486186fb1c6f93d38b9a7916750bd59c1ac000000000000000000000000000000000000000000000000000000000000000200000000000000000000000083a48a032a0de0d84e3c01882148364e41f57934000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000001a75f7db182ce7fca969f029e1ef573f7aee9cb5', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x15b', + r: '0x90a309abfe52ff76a25c3ab1fc5d38c53eaf9c4f3ef9728c9a88a168dacf365b', + s: '0x3b1af0c97a0f88c6c4800b29549eff3b757b6145074726ad4c20f29efd2b7ff3', + to: '0x8967ba97f39334c9e6f8e34b8a3d7556306af568', + transactionIndex: '0xaf', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x2c6fb912d9658100b8686bca700ae855f8e5f2bb', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x76a199229278cdd8e6dd40093b64e7664626618e7c36fd623ab630786b6dfac5', + input: '0x', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x2', + r: '0xbcf5af6296d751ce07bae4d289e54c3c9bdbe0629de6d170bce00f546a24cdbe', + s: '0x7a18cc73b88f984a846a03026e0ba64acf3a0e6d892065cc01a51ccab4a5c76b', + to: '0x86b050c27d689ba91917377de4a39310e79c2b74', + transactionIndex: '0xb0', + type: '0x2', + v: '0x0', + value: '0x1d1f2a3bd7d7020', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9d5efcee1119e47f53a216a6b9289e0e7fb6a2a0', + gas: '0x71af', + gasPrice: '0x47a3d0284', + hash: '0x74d69e566e8bd62900e891081905009a1c2ed074165d15c0e0a096b63b1b49a7', + input: '0x095ea7b300000000000000000000000068b3465833fb72a70ecdf485e0e4c7bd8665fc450000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x4', + r: '0x2b8aa171ca6a259fa65f52c397cc13c5a9fbd2b295402251139ae33a3a28fd24', + s: '0x3bdf546fa3d5a7c07869a23c90539137322d30cd1ac6614d8566386629b4afa7', + to: '0xcfcffe432a48db53f59c301422d2edd77b2a88d7', + transactionIndex: '0xb1', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x79fd0a95523b4287b5717d02e256c3861f68f9d7', + gas: '0x38690', + gasPrice: '0x47a3d0284', + hash: '0x14036d43579058171105216738457b35167820a7effb8d9386c65e20d236eb77', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000064363f7f00000000000000000000000000000000000000000000000000000000000000020b080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000019adace86241a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000019adace86241a00000000000000000000000000000000000000000000000000021ad6b9519056cb00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f1e029ae5743fd4a324132a0be6eeebc81060f55', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x28', + r: '0xd4238279c5197a8e85d0bf2f68f7b73fcd25002e5d8b692dc6a7b53521bdf075', + s: '0x7ed6c80b5bbda6257d52f9b74989880865942dcd324f30f8defc231b1ee5cc2c', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0xb2', + type: '0x2', + v: '0x0', + value: '0x19adace86241a00', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9680f3957510cf85751a096c2194520c36a4a003', + gas: '0x3f787', + gasPrice: '0x47a3d0284', + hash: '0x25c1684f6966caff802e85749b550d9be2934820d5c91c6f62487287675a629e', + input: '0x9b6528e2000000000000000000000000e23cedadbba887bf6bbb6f161ff9281f6c39b5eb', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x530', + r: '0xaf5eac6b32b9d2d8c4b0273bffa0f32b180c4beed468f92379d56ad407d58138', + s: '0x620e4931e4c0cd991109e04f223ee4f3fbcf5630fc4945d418dfe9ed3a9561a1', + to: '0x9c4c49c3c3bd7ab49d91576d0103a25514cad1d6', + transactionIndex: '0xb3', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xadb7c1e5cdb6e92d816b4a86f25f9da5baea95d9', + gas: '0x5208', + gasPrice: '0x47a3d0284', + hash: '0x9c00826fd016714e191a685e31c918e5f9151d807d1b5b955a3ea514ffcd19de', + input: '0x', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x2', + r: '0x7fc9b2ff15c31daa91ea1875de068e4e12a7a7e86a4ad0f281c3f3b2c3c8f2c5', + s: '0x1650b4c74cd44f7e317837bc36c7b3652312adf404835f60053ed18bddd70af5', + to: '0xabf7d7b1a434b684541aea4d6bf2e65b57b1aadf', + transactionIndex: '0xb4', + type: '0x2', + v: '0x0', + value: '0xe35fa931a0000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x75a50269c66e6ba81c5062fc84ef199e86a317dc', + gas: '0x2d10d', + gasPrice: '0x47a3d0284', + hash: '0xe04b3af4d15e1edcae6e981f5f1d9d75af4f7cd06f12c73ee42e51c00ef14364', + input: '0xbaa2abde0000000000000000000000009992ec3cf6a55b00978cddf2b27bc6882d88d1ec000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000df31a0928400000000000000000000000000000000000000000000002f38c2775b77862166000000000000000000000000000000000000000000000000000000000b03b76400000000000000000000000075a50269c66e6ba81c5062fc84ef199e86a317dc00000000000000000000000000000000000000000000000000000000643645f0', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x50', + r: '0x9bf9c27d293970699ecccca63a6e691fe6be4095e348bd7c06df516a609471be', + s: '0x09113c049db4b93fd9129b188fe3980727b1f16ff32353e2dea5ac40b63d3ffa', + to: '0x9a5132e149c547f254c73226da7f770d43d9ea44', + transactionIndex: '0xb5', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xb84688d617ce18b7f8865b6417cd771d0d42e509', + gas: '0x27c06', + gasPrice: '0x47a3d0284', + hash: '0x0357d246c9ddd57f05170a038ddb04c4c2554371a5cd1e1d7bdda50b6080939f', + input: '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000643645d300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000046ebe6d0000000000000000000000000000000000000000000000000000001702dca3b100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000bb82b591e99afe9f32eaa6214f7b7629768c40eeb39000000000000000000000000000000000000000000', + maxFeePerGas: '0x4a817c800', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0xd', + r: '0xe7393a07e07f04a9b43a841014852cd12ebc1079a4290276e67b7c01bd38a4b1', + s: '0x2e74e7c66a3f46e2ce31018771b811d16c1544fb3df6664588420111ee36fcad', + to: '0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b', + transactionIndex: '0xb6', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x5405161f081f773c4bf97a2f086d358ebc643b3e', + gas: '0xbec5', + gasPrice: '0x47a3d0284', + hash: '0x002ec16d799ba0c7c3251ba82a68151016066f4c49ea22c6441711184aff4799', + input: '0x095ea7b3000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000000000000000000000000000000000001661ace0', + maxFeePerGas: '0x5c2f99757', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x19', + r: '0x51e49b423093e8f7d580d349423b5a6ff02b8677999d96c60a106b9f155cd571', + s: '0x7556ea05a4035a9863f0758c2a9ded646edaf9a76e2a7810dc7b276421288ee9', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: '0xb7', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc44fd102415ff62769a4e37c70dea27033a5291f', + gas: '0x493e0', + gasPrice: '0x47a3d0284', + hash: '0x2393a72f9b086878d13a8dae1e44607cb9033fd94d4777ea907dc457db3dbc44', + input: '0xe8eda9df000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000005d20728484000000000000000000000000c44fd102415ff62769a4e37c70dea27033a5291f0000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x62a2ed895', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x579', + r: '0xe9eeed92f4dd20c08048f7a1ab85d4a998cfe54fbc4f8b1ecf3d152a4ec87648', + s: '0x3e9e7796691c23617522a914b7d00375fe239d7e006a107906bd576c1eb0feb6', + to: '0x7d2768de32b0b80b7a3454c06bdac94a69ddc7a9', + transactionIndex: '0xb8', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xf3b9b75178f29d551a9c7fa4ef53840871ea662d', + gas: '0x6210d', + gasPrice: '0x47a3d0284', + hash: '0x870c8c1508aecd4147d0f9e6cd1a84227b743ed2589d013e18d481674ca8f42e', + input: '0xf2d12b1200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000da0000000000000000000000000f3b9b75178f29d551a9c7fa4ef53840871ea662d00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000058000000000000000000000000042c8eaf9e2469423637f3e4a96c42774cb7b8cdb000000000000000000000000000000e7ec00e7b300774b00001314b8610022b8000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000006434db7300000000000000000000000000000000000000000000000000000000643e15d60000000000000000000000000000000000000000000000000000000000000000360c6ebe00000000000000000000000000000000000000009d6d9ce40da95cd60000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000161513f82e9a0000000000000000000000000000000000000000000000000000161513f82e9a000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000040000000000000000000000006609e542e0626bc3fc2110f0ead172030fbe97abf7dbbb663c28d9c3594629d993b73cf35c403e1bc89beeeb37d1ea21c9e538860000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000042c8eaf9e2469423637f3e4a96c42774cb7b8cdb0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d53b3012a4000000000000000000000000000000000000000000000000000008d53b3012a4000000000000000000000000000000a26b00c1f0df003000390027140000faa7190000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d53b3012a4000000000000000000000000000000000000000000000000000008d53b3012a400000000000000000000000000c71df678a0026861d1975ebd7478e73f3845a2ce0000000000000000000000000000000000000000000000000000000000000040674d4e33d5ff9fb69a7bac2986d02709192a5209920599cfce618fdd85c8c0122af5d7f5dc9529f9036dddbda213e1d32869a9df89490709b6cdb16ffaa58a33000000000000000000000000000000000000000000000000000000000000007e00f3b9b75178f29d551a9c7fa4ef53840871ea662d0000000064364012ab2e3169b84b421a4c96a4fde49759e07d37688b9cc9775d0cfbfe0e6929ac7f4f3e5bb465fdf4361e02d3fa2c9abd3085fedc49b3abf2db542976ef26b4f2b800000000000000000000000000000000000000000000000000000000000000281b000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000f3b9b75178f29d551a9c7fa4ef53840871ea662d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000006434db7300000000000000000000000000000000000000000000000000000000643e15d60000000000000000000000000000000000000000000000000000000000000000360c6ebe0000000000000000000000000000000000000000c899523fcdd7c7670000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000006609e542e0626bc3fc2110f0ead172030fbe97ab000000000000000000000000000000000000000000000000000000000000281b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043215b6d5a78000000000000000000000000000000000000000000000000000043215b6d5a7800000000000000000000000000f3b9b75178f29d551a9c7fa4ef53840871ea662d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000281b00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000e554fc02a54272a5f7b40a973422fefebe357092b947802df3e5be9bd190c7e7f6386478b4538994ede9ab9e3a4b208fd15fbb1b64954ab09d34db832383b5b518507d4ee55d74fc16c96194955e4a39ed0480a373163df26f37a6eafcf74217d642f78b8908d37fd99f0ea6910481dada63087f2c494967287d24b8ae7fbd87c47006333c80d092cc6bddb77c298cb7df8d43bcc41470a27a05567b54d449ab6c31650f73c091e5fce34389fa80ef01351e4f27dacf4b30a2d7ccf5c342ccfc8e20d80f8f1d4532156017c00282a0666cc64098f56729cb5bfd065461a742598bf25d4121c849fee257393892c1c7c400c617ab8550bfcab713abc57b52ff9dccca07dd79dc95adef44e1ec131b1d71201253936d696c7d232ac0a5d78b8085d43a0b88bc4601eb528e73a14d7937f5159d6994f986723702be764f6cb3d3d5e48424dbd6d4a1ce490f9ebbdf1aac5530975f1a6644e535534d77094ef1c2bd1f73116f2689900115b4b2b14c8cdf812ea29856e0b743b4c5f5e8660344212b065e2bdb776f0631ef5f923db94d2c5bdc6121b772e277388d7963a860e0f5c8b06622a17818abc8df6876e8d1a71b814b4117825427187b1ca5ea39953c65fcf00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000360c6ebe', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x4b8', + r: '0x78a596b319d9980c3397d80f55a2fcc69453cc762174334eae561ed558364894', + s: '0x39f35a020f30acf5b2911165f8fcbaf9504cdf11013715316e8a7041e450a17a', + to: '0x00000000000001ad428e4906ae43d8f9852d0dd6', + transactionIndex: '0xb9', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x96a00d569fddcd6570f39365592d0115d27765df', + gas: '0x22ef8', + gasPrice: '0x47a3d0284', + hash: '0x91af138e974e7f4c84f22362bc8f7247ec806baaa7d6cbc68a67e9689955e78b', + input: '0x3eca9c0a000000000000000000000000000000000000000064363f4b00000000001ce41c0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000b3c839dbde6b96d37c56ee4f9dad3390d49310aa00000000000000000000000096a00d569fddcd6570f39365592d0115d27765df0000000000000000000000000000000000000000000000000fee30738cbaa00000000000000000000000000000000000000000000000000000022f56d8897000000000000000000000000000000000000000000000000000000000000000012050000000000000000000000000000000000000000000000000022e6e03e4600000000000000000000000000000000000000000000000000000000000000000451c0b7518dd48654f03558b9cac8608e0e481d961570e4da2d7878b2b6d2efd41fc75e9648bbf16ac155f2ab2f1a41c1c2f2d3b3cc2958638134b3553bdbe45d73264363ed3000000000000000000000000000000000000000000000000000000e26b9977', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x0', + r: '0x6c57bedc3293558c09a4ba971650c9e9c334d9d30afd1af7f8b3afda4b774bda', + s: '0x4c73428de95a5847aa1d9cee18d65ce3c87c65d118460901240058fe0e531036', + to: '0x1111111254eeb25477b68fb85ed929f73a960582', + transactionIndex: '0xba', + type: '0x2', + v: '0x1', + value: '0x22e6e03e46000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x6541fc8b4d1fd2961241a982b40d8ae0fbd7433c', + gas: '0x27105', + gasPrice: '0x47a3d0284', + hash: '0xf37b9efe2a4130127072a2f6a3ae5c7311e48bf3022a1433b7dba6423bf977d3', + input: '0x9ff054df0000000000000000000000000000000000000000000000000000000000000077', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x0', + r: '0x60734366ba975b8870db2c22d943cc0cca3e255f4a28833794549e2146be2561', + s: '0x18ac390f8fee9fa30c6ec211b36a3a4196008e52cbe862eecf4de33f3f244ef1', + to: '0x06450dee7fd2fb8e39061434babcfc05599a6fb8', + transactionIndex: '0xbb', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x6abfc4629e609a1482878346c338f6e2007531af', + gas: '0x16843', + gasPrice: '0x47a3d0284', + hash: '0x241263ac0c3c04d623485fb5d4e7a2af103a7db5eabfe0b2d2afe0506585e509', + input: '0x439370b1', + maxFeePerGas: '0x6807f15a2', + maxPriorityFeePerGas: '0x5f5e100', + nonce: '0x35', + r: '0x18a1cae998156ebab7452e1a352a6ddf9c89c25c13c7cf329a37e7ed92b5c6e4', + s: '0x1dc0a408aa000e858bebbf484c3ac1bc3cf31791d5d9fa03bb9e3c48c84aaa28', + to: '0xc4448b71118c9071bcb9734a0eac55d18a153949', + transactionIndex: '0xbc', + type: '0x2', + v: '0x1', + value: '0x354a6ba7a18000', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x3843845731be3cadaf77307cbbfd92323fefbcab', + gas: '0x506df', + gasPrice: '0x479e17504', + hash: '0x8df5d0fcd95081999a6c417f8be98633d1bc3d0f6fcb6795eeb600ca9e676f8f', + input: '0x9a1fc3a7000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103daab0000000000000000000000003843845731be3cadaf77307cbbfd92323fefbcab00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000b92d5d043faf7cecf7e2ee6aaed232000000000000000000000000aa462106da447c0440a4be29614c19387a59a331000000000000000000000000000000000000000000000000000000000000200500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000a39bb272e79075ade125fd351887ac000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000063f67f2b0000000000000000000000000000000000000000000000000000000064364cc400000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000dd874e7cc83b21cbb9da54913c9cc83200000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001b14b1c63748e26c2eb32d7376053a63dc0affa64038b3dfb1c9e3f339f64eceb327eddca1a30b3c3cc88ab5255a43016de7eab3dc701b8df6f67b56f9e8a2ec7b00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001b8b296b0b8f9cf8ee244f391c2fea09f79fc0229a7ff61ec4cb6d90f653da259d77dfc2c29be714db8babc1e85b8e44093f4cba1b6f83ebf61723b9b57491e8ee00000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000103daab000000000000000000000000286a2103ddf789b5414c684a055bce98847f776e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b92d5d043faf7cecf7e2ee6aaed232000000000000000000000000aa462106da447c0440a4be29614c19387a59a331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000a39bb272e79075ade125fd351887ac000000000000000000000000000000000000000000000000006a94d74f4300000000000000000000000000000000000000000000000000000000000063f67f2a0000000000000000000000000000000000000000000000000000000065d7b2a900000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000de35910b8089671968b0bc3481af2ec500000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001bb4e687d7e252aebe5636542f4848a9476529df218d37174c7c497445ad4d78005825ee792de917c3f69ce0dbaf175f2f06eb095d9c0ca30030f13dbc92fd778500000000000000000000000000000000000000000000000000000000000000050ce7b713dd7348ae4628b782afe05c072f8d0c06949cd25476af96f50c17a41cb7411e43d03b61a3035f12cbe47f27c99e2e379322d8786828b6b66ab45df0babb5da7165a28ad190feb007f60c85072381fd4de3f0d85c23797283b76daee40c1d0ede1bb1ac1243bbe201ffaa94f693e95c32ee01cd0befcd4e931cd9170b053cd365a69daf6b52e6526d164641a34833a08afa3486ca113446ee07f99049c', + maxFeePerGas: '0x4d225e2c8', + maxPriorityFeePerGas: '0x59a5380', + nonce: '0xe3', + r: '0x2a379538c84ab1c570861f806c4d18a8d99a00c0787aa4ddf9194389008af4d7', + s: '0x6810427871577c34d495eb563158587559e2380811740130c1342c3d44845b35', + to: '0x000000000000ad05ccc4f10045630fb830b95127', + transactionIndex: '0xbd', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x9ee50074bb69897e77ebadceac4c03e3ec5898b8', + gas: '0xb71c', + gasPrice: '0x479e17504', + hash: '0x4176e756b40466a7126aef4fa046a728ad62f51266a2a3b4a92b15366ac688b1', + input: '0xa22cb4650000000000000000000000001e0049783f008a0085193e00003d00cd54003c710000000000000000000000000000000000000000000000000000000000000001', + maxFeePerGas: '0x4d225e2c8', + maxPriorityFeePerGas: '0x59a5380', + nonce: '0x2', + r: '0xd5502ed0648a8a7a02cae26729c382602009560990d904686de10e00e45c4250', + s: '0x70587220f358a55dbc4529f918ebfc7f823fc4dce3f09b0d1d4a7144f9497b48', + to: '0xf2665d9fb3a0ad17a7454da077bec9cc159f644a', + transactionIndex: '0xbe', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xc1b634853cb333d3ad8663715b08f41a3aec47cc', + gas: '0x1ca4cc', + gasPrice: '0x479a12896', + hash: '0xbd6b5651c5c324e8c2ebe6e89c633bf3b33ca9bcd2c5d730608d3fecd11bf031', + input: '0x8f111f3c000000000000000000000000000000000000000000000000000000000002359900000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000b9181000000000000000000000000e64a54e2533fd126c2e452c5fab544d80e2e4eb500000000000000000000000000000000000000000000000000000000036b620c00000000000000000000000000000000000000000000000000000000036b630a0000000000000000000000000000000000000000000000000000000000018085005baf09c588447d08d0081d3ee73d8073fbcf89ee9090a144b4544bb5a48284a494c2ffff996afda2312c10f0889c99cddc9826856fb4844259eb06a1d0b09767819da33d94f760dd240fcfa1e4eeaeae2a9922281b12a9484fc832274a9c10abbbeabe079028400120a84537680980e8d180f6520338736224b4d21ec64d01a86acf125ddd13a3339655280794350933226c9e857a532a801b9ad51b9ae0ec3914f4032ff7839b41db1fb477f3f797f73b4a98cc8f2f7feefcee57d2d9af143ebf170ac6fccf594c2bdc25213e45444af35bad159559cc3e37c2b91cdb4654e42c0aa1cad4a8ac66dc9fe7b41cd139a0e174bbe260626cf8c432e3a0316098edea1e24100806f4cba0a3150a796e8c2a6f418a884140fe33148da8be9cf33bf5fd3031290cc9f0492b1cde126ee34485d22fa25b468648cc03448d202e5405268182c6b96a5686c080c69b643cbfb1d4955d43f825ca9e7d49196fff1df5e1d794160e1c06f7dea35680942e6a0e2e9e871955bee513603ad3bee235afe569c95c9ed5288b23a9a4d9b1d77d127c28e4058c1555de0213930b7901c500d77da0681cf39b1caac9b46b975a7b3ff14aa5f7c4bccd6b6e5622b688eef202d1dc85539042e186044c51606ac9d4a9a37e080ca40c146e79c2fd89ad9a1aa69670dd65ed652e5e786ea6e86f2b7412b59714f80260acf93f1d0f81b42b1b32de1d8a4239124bbf39bfe2fd732fa83da0e316d52b107b71098c2ec3cf34e6fc47709e9c3751209d2b8ebd3809281bea2c9ded610e44b3aa366dd6fe162d64eaa2ba9d90ee38c292307daf578e8703b22e85e42b48f95b183ce4501e51a427f48db41c5bbcd1f68fa7b5ad69da6839977ce166abc05740718fcb3ab4b63fb96d2535d5a1c0899fa53d3a7b9dee5310aa15ce3c2cf0bd97ec1c477a05e9e10f1898ff2573d01bc9646c8d9a1d68f39cd217e27bce13ea2c3d227ac03404651c7147f78d08e96d88b43db129ff8a539b03468d329abb5077026455035c68a2700aaaf323fc9d59486bb5e046e002537c8960d41e3a031cef7dc20005996a60f5c907212e4e4d6fafdfb7a5cf82d2e52b6169d36598e84a5493a24c6812fcf140ee00aadebd96a496786fcb67a803341401d0655a77ce35b49f4dd165c5ba82b97f986f9f7d8a6b3e0ea1e01c71ff02f99105689baaaadd4f371df0f2ffeb2c8ce59f498a7849a672e0c17ed1f8b3f4c5f7b58f41cd2df4f93a4a543306f6f110148d819698838b6470fef39be3dc0569afd179089eeb5420ad6044778c8734dee991998fdde7d874d88fcd07c94e665eb3858d2c8dd511f1e4b20f713d9340e63f86c7daadfbf80a83f3d6c3424b53cace4a9a1fc9ea42053b2a5fb7636605c9be326a1a97a7f09d558f062bc601e79d1314d2ca07d8a6ebf28fc9e9bf52600bd18a02c216829aa5b33eb0ed7685012ccf52c68f27e6096a3e7926c36ca6fa6ecaaafc4219d3c2d2e49f5f4d3c6261401f38e881ea405fa01ad1e8ed9018787a3450f4f782a61cfc50be9d237a22d51da64d0ed528abb41eca8d8c881e98135af660f0f15773fa179acecb1ae55b7b7c3022a15aeaf077e120a663b06d6f1b0ce11f2a441288bff267deecefd4c830803aaf211549643f95aee67b6c09feea5a1aeaf6bb9100b2240ce9549087dba5eaddd0c53cbac7976877b578d38a13032e0b38e265d8b334905309319ee3a4308ce8bb7ca311d8a62eef076d8f0cc8edbc43dd2ad6321b06364c026475388cdd45c4c5d31e1ae299e6af872fe807c8d41f23c744e009701f812470b89002dafa49384aed94fb5a6d98ac10196628eacaaef759937507881a45988520f5161da10f5acef5e589fd49189f37e6f734076daab59b552a65a5b0a87a4dd7469cca43fd3fa342dbf541c72fca7bda617bdf62be853c9ced26e06c9bcc85a5a13876884c0e567437aecce5c2cc02aa38c7dfdf562f3bdb14b71185bfb4b295f87da387464f83be3c2e0517d067b86ba517f4d91d1aadfeb3012e713be77a697011197354732bb907a2f8ec561893de419a80dcf83736849f1a14110d568c053aae8a7c987edb5862a876d5fcd19ba32aee96e5642609aebc836fdcba3247e4025073a4288bfc1f50984303e6df6a4ba273ca0e56bec77d8d330e647b03cb4e13f740a34130201008040281c5a19017b05054790b620cece3212806f660be870e7f253ba7f04a2821afdafcbc7a669ca548821591d9aa9023018cb385a4facff5b07b2c7404c65fb5e5231fc91250262953e02917373dd1161bd831990259ec27d514a41b21e4094ebad0a5f4c8581413fda435ba5ba477e57f76a4b144ea713fab622802e093664ed61f6423e627cc498170d25d5744ecdc38fb8f666c69718cbdd87dd0012686cbe6f6cb79d5f95c43fde4c148c47c14e03e9a1bcb3aea11e6da76192c818ff86877d0e73fd1e89aa90f09d3a017f89603cc71efb92b10ae7a5359e90732bd53a38d4e844774c7c83d0b6b80301fa716afbed3765af3d05c6cc68887f0fda809375d33b794c808f6350452a2b54f73fb2085428761e56b104e65f39f86565b616c446555dad9d1fdf3fd0b7b9288c204c9d41de26b0a80c0af668388ba1651262b09bb6c325eda7bb78bad941facdb44a9798ed6823be730674f7d9a699935e1fc17efc391e449190a46b54bf151367304e1bf662ab65cb73a5647eb220032b4e48fc2b840aae15d1d781264ea50ef5f7b73dfc726fe9d2236574156f829f8d41a0df05ce717c90f09fe87d7c8ad183c7fb7fc5b508904cf285cd3322ddaf3e75601019560b1e4aa43f01a2831b7cf991384097e9078eab83bf76121fe4d9332594e33650849b0a03f650ddfa3b48193cfb60a54803e499416b25d97144e571b99a94b6bf6cfc9b6fac66270446527b27484d15a9d14486e1265080c84bef20f30c39776b8de86cbd80a9cd1c1a9c436ef61218ed51b922b0cb4e96800d8b3b278deac8393ffb0de72257e992e6dcb5f92c7b0d34a6f716c85eeb47a9cf5c034e7ab9880447dba697d779beb317ce4d8051979733046a268055a5d6546fecd5886380d671f94285d02da072de52758b18946b5199768859850b4927bc4914507113bb9b34846973bd9643b864701acf9e072c5e6df6d8faf359aca2da7b594015a61b3d177fa27a1ada4110d0c635be0ecc74837de5b68e881cb7412fa9f436b56a7c9e49f4fb56545c4f13b9df28846fe34c9fc6ba400e63e00e64a469fe0be2271d2c82299202c0d5353c323b1c86d5689ba688a5181448b8b7a3ed3dad87a142cd8e43e23837a9e3a8e35af81c4ec7979a771ce09484d38471628bf00da874f6a8805ba695573b0c26697a654a7ba9c0c6dc6104d4ac148064ce228fe2495f11b175c00bfb7993b9922eaf4ff02198e54a65e921fde7b669c4dfbdefbb6a8d1c60fd3577cbedd50c8737b54794b14f83e06dedb50e23ba6134d45bc99a345f1d1c51164bf8a61f5c5f2fd11db16cf3adc36a25be6cbd7a1d9b39042eb266140436060baa834c6848ed7fb47436cdde2bdf5a0a8a6b5211bbdc04ff70371daaf6905aa40789e42cdd078d3a1982df7079d80717efc1fb8d5803fd55d7c08b25c48a7fafc3d1081c443368f837d45e4d7885f1eb287d01a22e23d50bca64933ff364d53aa1ac848dca3fe6abee21e0bfd590ca60389875dedd5a6b4d08cadd6120539923c3d22ab38bbe0896caabeba77cf2485a1a78f1e4874e393f298ec5a074c93fa4fb2278ed82df38b13858a25efad677d531aed01a95de5ec1b00f77e68956fe344c7ca3992ce222cf1dc89bf51aacb2ca15008c5f85b151c5ac54730c1df26f9a3bc7859167f73d01c172480d3752a9c70e4a3d5fbb5fee829e4b1ed032ad3014a963500a36aa6430ceca9046b594733de38296993168d8318541ef668821155343fa4bc2818700fda4708ca8311ca83e15d370a62f904351d0cddf71c83162966cab5a49ff0c255ade9d7564fd07fb482113d90b1a87620e67c2039b9068023dc14018458147876321c64b8c8b0926123c34946888c30093a901f1ed281e0a48aa108a089eacb63e759baad028f8c549fb2726b15e2ad8669c6be3055d9b4314a517b0820c05ef47139df64ab3f5f769dc1ad1bc8e607ad77f7588ada3b0ce82eb9fa8b2926d9648b198f50aff6fe021fab65ba94bac02f495901fbf876f9067ffb75960fbcf97f9ba4f2041c86ac0321abb3838d84424ff879063ad35c0cc79d7854095d3949433b3647118501a8f914bb66a679b8b24e0b21f18d176f384f7bb525971401329435bccae921d9532565c87bf1f22d340802da072de5af7eb592f2e9d874527ad5c9d6dcf813bfc0a4229d0ce17877b2b05b28fd5abe06744ae96a8f0c6224f8f6f55ffa7e1494a9494530c67cbf119de0cc1dc921dc91e363fa4221cf9e51e52de0f2f12f4db05e8739bef4df7e5acee58c9f93543d40b95bbd69f8a5261250428dbefdffab1b113104068829cd2f92c6eb68299de65a29bbfdedffb5ee66c1d57b3d9a6f1846e8971d12039c3ee81c1ed2b197544f5bcf1c8891567efb5fe76ed24c9076ba1dd79d63c67a41201008c477ac56e873533484903a4632a30e144dd03d94232c6feece2e19cb0fd734fdeae49c627afbc54b25a25ba606b6b8cfa3b4012518592ba393daf08f7db4983ab2e7e2e1d2e75c90b52aaad84842f03d67318bfc7d42e7fab1cd7292195df3e6eae7ff4d4de465df6f2d1ccb1d9cda532784135c81701f4c6b46be5423c1fae7be795926cec5b97f39caf708817482fc2e5350257a3e3a980bfa02668bd2c77ccebcc2a5c0409393245766f916dbea26c08f77ce5ad355950caba91cd13da6d4bc94e124a2c2625614f6dc16f315aa988c7b3bd4822753f1c03caecbbd3ac768f7e00b6253aa8ca6f95ba145ffda782cdc4e66ce6f8efece5aafe312cc24fccf71f84129ad1f6b06da5a6bc3273ef07fbf2744a1bbbb9848fe648adbbc6a7e4d763dd3de7c19bdd0d00f94a8eed8d6cb39fba5569e6fe48b3b007b1b913449a1990fee0e54e94ced070a67decd5b61c198f2b097a8d9c5df83f69d5682f3127a8ecc155110dd1f6f3346265cce67b7a727a3cd54b51d954fb4d3ca7ec5c6a8569175326d60531d4c3fbbead23795267bf6ce4c237f2ba44d7e761f62888cde11eb13a431ed87b7dc96015992a4eb44a400e60f014ab6b37e39dcae8917d7c58ddeb66afc6544f0b4eca1e9a6e78076bda9d0f77b8924540909941c63ef8b4ee662d7c2f96f3da4cf738422e5bf4e40225f7dd7b76c0662e4a79e5a454bfacc7166ae42606a2aab89486d856b740d6636182af63a80bc1bcc0292d630a793961e7047128535f3a47707cb0a9f3f8fee86052d3207ac31d051c6f0b50073435fc0ecd1906be4c07d870ee75ff3bafe3f419fefed3a2fcd305f7d780ab239e1af3c3a570f1dc40afa512b5ba12aadfb947c33176e26243e4e33f572651220498ef2acb5cebf91bea66ba4976169a03e2bfc8f719b94b55445ff17dc5ac61ee04eb40420175d62049bc7cc2d1957640d594eb698e79967abef7cf1e51bd614f0cbf67cd379cbbad6f342ed7793376a39b59f5e9d1d9bb1fdec8a02a13e0d1096cb7574f698cabffe4a37e8afd6e71b761f8216783ce24c0b097c73ff333714012cddacbce6b9cf32712bcee83c36fdc797494a574360e03c43447c689228d50503663c75416ab79e859dc6624c541d669a8d40ce11064cf8982085fd843c488f1c0402814020982228e405262faabc258a852006dedb50229b390800870648e4182777a3b37a2d4e99d4a5b7389ee123c14e2b3745f4c0d034eafcdf0759d5c0a64f9c66098b4252eca3d935dd3d96cde74b5c9b1b4bdcf409b1d5d7773281c35ace9f98f35f26dd34cd62036b30766cefb519e987496d5f66526e7c90fc1592e638f241a67ee6bfe439d85dfe3f3e883e1b01c2e2283ecd3d941a3a28ce557a1b3eb1840840e00cb90e0a6810594cf665e885824bec381df1e99fa3e8d78871cb061afcabe0bb3b64bbdf0ce2b4f5f8ecfb1119188fb280878081204f5f06ffbe6ab716b2142cf89d31b563b28d1cae6d936dfe774df0a5146a29452dd2df859b2c85fcf03633162deecafbdb6ae0226be1e4367ff1e3c01dcafe314fb30d0f5e6c42ab1e91e35626b752720ffac49a4f816bd9dcd5f303df6e65fd84200a11b54ad3cdaab1abb968289ed7437f4ae0667db5779425caef81b6258c30c464f7d7fd040fc4733bf1af0c35e5d091969ccc802f1bb7a872f40e2db5ab2aec86531a35593077e51f718714ee633a1ca5648ec2a7bb81bc2aba431b0f2fc5c9cd8d07edd0a00b7b2cdda4751e27e398cd687c109f94e8feddb7d6d320146e8d76d0dc6b085f143212dd178a0f6b1367f44eac0fa6d4e107deb3d7dc025c1aa4e5b4ba98bf794bab6d659b979ce4c24c2e414829c12cd38b209a97aec6d1cf4fbb18bb86ada68ab2b1431180fb7fa7e28a5123833f2e0b32c930254b4b02ecd11f5f9e331a8abefb5bf1147c03b4178addf94f6eefe6d7510c2d085eeed5167240b49fd57e5f26e9f24faf3972f6c06983604020100804825985bec02c46a3b7c3c4c0d3a381a21badd473f043f976ea95c9da50e73a18c2b246d02fd41692f9646af9ffcd4a28e90571a20d68cd08ff1527ed7de5e832c6feddc8e014799fbf1982435641aee0b3da0f3951ac23cbb197014e619d2483514c8dcbbf7f4d6838c5790b8c45d71fba1c859c255ed065bf3e890779b99521d00532740a43790f3ea24e8ccc303536d24047f4f38c2b5d92dfed69ad46ed5017173ea7eac34080ba5c47dff0a2c47f67c65a2fffafe68ad6a8c3adb76f250eef82b97df6f2141a0e7f87f757b928c84a8c70e10c28463e2e05148d70b291737b32b2dafac92584a7a312dbc17243c0a4f94c3a22c680f9aa7c080c70fcfd728123ba7bf2b894ead4cf2d543c8cdd83c5ed3184cf87277b1ebee6bd0e185f3036d398bd66e204ab7eb6e8dbdcaf9bcf7fd33d5866adb20dbfabd7e2ef380447fb1b3557742471b61823273ee79eb0dce3e74a174594ba1652aad759035c3b67306743e6eed059c42558e3ab542664386f36972fcbcf4d84b46f35396298cf67bb7848dae85535b50df2b910d60911af87597964da0778eeb872b1cae111347bcb13daf01859b214ec5a724acdb00ea36f34a60a2dd90c935f3bc920f20e93b105e6f4bf7e9d64c391494aac526e435d1560dcaa480de184bf98fd8c0a8c719ca5f426849c6b7de8f75f4fc67a42cb7f5294919af23ea78fc5f163626e9a830d08aaa637ee4b97904516f74a821467c0f50cc25a470bd6c21e912335809b213df7f21192d708832d09a3d9a80bbfa027dde8b77bf925b616f4def794fe1ea84aab4e3544009e24d483d973d2428605f6aa01c7fc6be2f8fd4a7c7df855a55e338c87b17de500c713967e41ee3576f312ebb7c6b6a6527fb97fb03f245b92e62aa27b27932bd0e11aff65c9fe14e48b11906b18ccad7bc0b7db3cbe8e6863ac806a317168b3c1ba95b1e7106983ac60e9c2ef60fa1dd8af3f2ffe3395c5650d3c7ff89678ca32db2cce408dfb408d03c518e589dfda376ae551661d366ee378fddd7d51cd66def89f3f1e11db9e1e647edd0a004188d9699d5e285caf0e80facecfa69b991292cda6bb8689ac963a290be1155f983a0bca05ccc7f67a4257a49e4863ecb24f9ccb2ea77ab085de31496101438ffce35d5385f4840a49e8fba0157543a8569bd5465d83d03566dad2401167e5b1230e116ceddb709d16b6d30ee13a208412cf04721ea5efc89950bceb6fd3f430c1cc865f388b5f0aeda52feeea4b9330676f93826d3b12c2510f31007d2ca74d9cdfffacb5a17921bc5a5e475998e9ef724e889e567d012aa0016b6b7e7df4ff5dba52f9f5e72407924e15b85573e5351210792eeb6aeee0ed816ba8e8cb367318ee8330c7183ab083626cb56f41d1d8f81b39dfa86e6e63fa677fd3a5dec797973e52a72e8b49c443be622d9b788d779f60e2cc339d5035f77fa10f834a82ea5429fa36514c4f36ccc96a5aae2e398f204b6c59ce93f4ff34060e4892708e4b154360e060770fe4f097f4c6c0fc07b520010a1724108f7ce41677585231330927e1a20e302d728567fdfaf4f7a26ab3dedcb0381653bba8c700ac35f5eba07d152c3fac085b20416075994e9d3ea7cfa41c993de8bee5c3b4ffe07c2ee0f95b35fe02734468a05268e9438b82eb862abc8785d65751ce8da1daff70864da7cae9f8494d7aa6dc255cfe4bbf5abea7d2e3723ac4f886eac45e23b45ac99fb605ef286c4976eadad05eb1ae36bf14ea19ef61a23b19bfe5a343e7dd430302981d72fe4b8c70c295440c171d51b55c759a10fabca5a44d24d1193169ebc3a1c296523dd811f31d4ae88106458a95dcb4a2fdd935a9157e31a6dad8e284bf9331972f78533bb66f0f8d327b287e3f45a2bbdab33d976db191142c2a9a5f0b511e554ac403ae1fb7792afdea83562bed0be46d435a215faa64116b8ab9acc2a9182084269ccc7cc772366bd5df8d8998f9f26dabb8d84a7ccf56eae2d49fa1f33507f6694ea0b588c0a098d3900e7733fe778343394434ca7ff25f13184168b6ade4df9c8ca93444e59ef5951abbac59fb4a5f3692a01ee002e84dc162d4c26c93b95304bf145061caebdf7c461412303beb45aad1e5da953183b9f00f761c7b87b012126bbad9747dc094feb046bc9ca81aa344a19c7087c9e08f279e2ca2170cfb11f41e346ea8b41b3eba71836dd3a2e258d5fa42b1462cc40119cc4e45a273c5aa30633af1cb0f4b7fd0fb8ed6d1d030eb9ddcd38ada7c178500b89b9dd69f9b02154b9b66d5cd2eb246ca6413c3835f2a8ac2a45655d0d775f9e04a75a71ddf61daef9f72ee8e4ee829c77caa3af97ec85b0a21c9a51c6e6272c29ff6015930db0335d37f15b96f09d8aa6c41299654144935f09e8abfd2f5f716ede97e1b2b4f5c6ee1ab2596911a3c228f9ee152b7cc31ee7274753d7bebba97adfc5840786e2ab32a9c6ee935a9ee2506de6aebf7c7863706fe975c3609356bae4a47eed6053361c7f32085d784e45694358d3be953bcfb3c12e7e7f5c8db4fd103a129fd86f1cf907042585ea0c99ce1353580ec23c1e84ccfe82f13956b132c1265fcd948f16e1aa216969f6e08984258f3e35845c6e294709095c1d42a8ebf87b46262080c64e09b2961906866fa2cb89c9ae41648669b561a420bcf301dcd0e2ebe697f0d0560c88fe65b7f6b6170eb53721e1e7ec3ed680edc7fc45e9709046fb74c9c766c88bdd14fbafa9b6bb57987f65d11bb71f0177072483d0f4f65cef0ba6b919538e16f37944102d4a25091360a195a8b25df2eff5a53662ffcb7deac87129f1f4e2304c5f192f2beb27e198359eccbd42d6bff8b4a43682269947ff1bb9846bee80fa61635c0c8a01a92bbe478c2b388cfff92adbc7c66f089f050518a50bef40de59d79b2f56225783f4dbabaad66b72d32888de67431782e8a4b0e9a9b31007ac03663a697f42c04a5ed4080bb35c9a44fb638ea821a1ffb09b5839dd14b438f35368d7a44056ad08eac091b6d85539017a16f021097e19ba0d11b8b07908223a97e59ddb44eb0b62ce18777163179af9b3db3b9c162b41bbef926027119fe31624d1a3c0c22591e8a00aea2b97c3ace9da9a3878a84aaf351ceef682ae3e2c25a70630f45cb559f76b400620f59a7904e0f4ff736bda4ee0276e5d1e54738f4cd3126182b95c853f81fdf7bc005a519d6efc6f898810cc9dfed66b579d80d714a60a2d4bc171f1c93b89337b23becb14c3dec5dcd7ac82e0224abc831ecc2fb8e55b7646d2b5d57f1cd213698ac2dd3fb93b37b983f6928dfc905ad5ef8bc5804472c6f31f261424e5a975de0d31513db108e51fc3bef7af8dfc3c24ace6213a33b44aa078c547b75a9701affae7f0c21a6cdab682923173e9f4a84601ea9962130b0e1cb21cf4017d543625733f5bdcb6a28c03cb250e254ab66bb77365d9a93b911084b889ec7ea4ea983f98e18e37dbf65d93f26b2101684f7e313177aec2bd90975b71fa8014a7e84ad4178ecfd776817c2853066e52818e1a5376d79559300aed5361545915777a711c0e715d10a238be80dea1edf0a0dd26cc978ff6972a21d382d7573c9d59a42df29808c9c32453e10638e7cce84f8145f604e86c3a34bf43078d2fcd83591ec8a74ad07ea0282018140c54404c2431fe3267511800a04f428b18f09ce85e09f9b28bb548318baf0608d1c5f2157a34ace1af3ad1edd5514a9dff18683dbc10d3580019b7a390bf16ef1abf6717c47e336c9ec719680969eef2cebeb8c64acdec2795240a0209d69b07266fb3ec1c42a3617099c05ae0432e460fc74e320f6f7bf9c1e44d87c2c01e93212a65f8eb7150bdf574b92da20aa7f8c920bbf4cf10def3668cb583888fee040fdb19f43a81ede81d60eee1ebe566c965e568e7c5bd4133542d225e495fa96fe8639ca0fb024876f9665866eed677a4da934fe5bca3c06785c4952676430282137d392bd7433c75ddf5cb82670f8b2de09576cb71d4762bd954dd0e77ae7a74db3108735e4c334599632d3d1abcad5f8d5f64dbbf8091831a4d0a8e70ae4c69e7a08e5512faf1c43f3bd3b93a802425da88b9dab3aee6a260e1dee475a44eac8ffa1cc011eacdf274b6312137b8c241ac7de46111fa6e03e43ab54a4fa5592b65fb23c0a70043bfcffe8150d6b4b1011e3cf9b038a164504e5c08880fe67313d20db45bf6b7b0a2070567493ea4724c38020206466691032b3c41018b88bbe1d1320fb8a52e0956148f5f2376c6fbfc0a38b0355f6221e8f11c2331e057013edfc7a087069def45db4ee104a247475fef8e86cdc2bc5623217ceab96790281402050349ee2906cec2cc82b1c57f7bb7ed216be59ebb2da960b662c4a107c9c14ad048a2475f1760b48b1e55ceaa200a514913f719d342b437d86560f0433338e5e4f02ed117ab55c57fb7ac1d7ab31198a9910a1dfd1205fe8b357342c6f430ce6e1575034ebc4500e1559d092f8c272d04bfe080d3d558c1f2b1c016c02fc505335dc434e1fbda83b141b8f22b8638ac66ef2a2e21e5915ef18101eafd6ba7791313a6da991b21900d205e35f7c2d2b4e8d50ad2bb992edf27fa0130407ec26fdd066c79468047124b8afec81429e3baee2e568b33d3f04aa925a84bf81e6b4a1176a7da729194eb65bc28bc6de7f99433a5a91f2f90417d0a7b92a012d533db3dbbf7841f9b10758b5f05fa485666a4e3ca6e9eb57fe28e10eb5b5a3e92ff3bda07f72760b00f3b473f7661a65525b5a28a5a513e79885f7693e828fdaf2e8556f25cf3bbc074c012ae542e663670eb60da4beb4dab835774e8f1ffac9ffb26ee9ef3b9a3e538fb61deecc2dd188249c7dd0972f2e2e732f70034addcc5ca57648607e5d5be8d07fdff9d396f7ddd18283bfcb1c731008689b8ae9230a9a3605ffc3ff1a839431b76744bea7365e5d13d230183d638fd703253774efce6958fee7e50e4db64e757facae567ed2ffe7c76235ef9570fa0697806a751ae11e71a2588803d27d11e53cf73651554b112eaa59ff2db1fbd360e10dc75570fe18518af649ff063051d2fbc624eb2b77c605109e8a162af5cde09512c496c4f19e3254f0c598ec7c78503ba054d1e4808170bfb2cdac51c39f9625aa9bd094adb50477cf2f3773f790313ca0b3187289519246a7d2e0d8681fd1bfc33e9a98a40cff4adfb0245621b0fbae60ddf3f5cc71c4757c214da0c78a684c7d6a49fff7373e133bec26aa96a0ebe010cf413f7efe5f0d18be2b772b69794922d96c6fdf2e7d4ca87cf40812ff5f2ef81c95629fa74dd959c875f86997e86a69a07d34ded8c316d751546a2bbaca8ee20457809e9e658849de7f738816bfa4ed86f46fbab012cd4af68952c6f8e209cd6b819bf35a95b2bd6ee745188ef983a9dac6c87f574bcb4d72051a896e63e59188b7f1bbc0424aefb472fb170dade866ecd0c8fc17e3359b0798c4baed6b4b6e8be286fdf91635afdafcd6778ec92f27e9421a5fa62f9566b432b9bf43296491d623b59df55a7f917b1bf90ff08e0fd889c72d8d5484697b27af5743453b338cc4f24322ed7d8da85342576117ae623c9e0591be00734ee9f3b596eb0da40a09aada7deebd65089bbf353b1a0bfa8761b373d72016e13036436000dde8fb4114a575a12f3a7e5ab5729e9a77ddbdbfb7e927ec26c2969e2f7c219b8046775174e4e45f20e12189e0a4d8c445dc60915a844828d38c747d5b09feeaa80711130403028140201068150a795e8c2a6f8982df8e8841b8598a8846be25ce49cb2de84ab5e4ffc7decf717789e5010c061856c583eb4eb090b591ff97449fda671ad5c6e29ec016d926da6ac563f954ab91059dd1897178997b5f21c029d5059d16ab69d216a33885905528b957d325d452ba099a61027775218ba1ab552104d017080e4d55fe779098881caafcc60101fef8328b3dd4524f8d4805bf6ca9e37898d4b0f28908500fb89ce50772aef488343cf859b2b3ea2bd21fe4fc98e43fd532189ab790933be27d342201979b10ed9c509f03c89262b149d12baa2b11ebc4d00bc5749c64a68d1fdf129eb1838de762c49f854f9712fa31a9bc443eff6d1dd120536cff619016a502223268d9ec43f0e215aff3a34af8f8550ad0acff443b5287f5764eafad1e6a3abf4f44a3824fa722a6b099f9f24ee1a7f5474fc507faec190dcbdb98bcda951ede22cbff4303bff47154769bf4421f45fbbe2ac7e31461f6b546fca0bc5bff3f6bd199ed50e42e354b4e6c63cb85d803432b668d9a4b84a692e9ee2f2d807f48545ee93848fabe9b88268ca7126b06fdf74c1cf8ed50457f864ba56c46027efab8900855c2343d1401e0f5fee3baea6afdfe03ed81e3b0e2a872b447e1564c8d21d10ef239f3d76d5b2b20e135463cdeba79f81351c775ef73dad1d6534e7e49937660bc411251014a91154c47165bcc4a1f79257f05aa9421f137c1a4ed7bf89b6ec868ea01ce1b01f5f356c8485b1d4daf8d4a09809ab6683aeb13f9f89d302f78598557928189e5eab3cce9438a240ceaebbb7e14abc010405f60709aad7f0725d2a8c8d195d645b58d1421afb292a20ae903be2431fa7bc6c3a83aaa47b365f440cae17ee9370b007599d7348ea8396abdb44a092a131a7b5bd11eb42c8d5a00e6a3209bb85be756a81ab26d573b6658f5813b5ad80fc94ed12e58e124b37569d9347f39b40a64810ab3833f4457f0a5e8d4cae7fea3d3ae60f425a164b55e8450340bd43572ee68fe98d60921f02750fa44ca811b903f384140e521e8c241409063a83772b70b3a8252fe211bf773b7cc8357757a735b7004747345ca537d805aadd34a40a5fbda29c919e05de09da5cb52691893aab83652fecc8c10d377d11b059b50388a6b2066f12e069373a25c78e07739df722948393582f5bea1caed07d62d6be3ea3098f64b229c200459037ffc528908be8c621fb4e2022a784d1a4ee75725911f0dbeba113821a097b51c40b3dad1101e537c8f48b3025470d67f8755b50b07d88a7e56a6fc28df788bb2c86f7597e158934289a239c2ee5e03959bce802a1f6e0c3f741b42dc2aa48db47ea38922a62e71aed088bce9b4a94f4f8a91b4607bd20c38631faafbeb092f3a2910851a61a46a259b1e303f2fb3f0dc3ea8672bb063ce2256da756c010e269e4cecd98883096a61a27eedbfedadeedd0941a7f8e3f5e23701366c5ae9050a336106d8ba9f6bdc5ed78ddf213f1eb486cf1c3e73880abae858c9b5cb4445f9859cf0657ef9a46f3f39809fe8fd570d5bd5c8d0212230d49eb65da8ad95235d840b2cc58fff192ea13c478466979740a152918e91eca08cae5d1d4524deafd1d075bf33e403b1830c69c06287faa8df5756da265cd79a622d20d6b9b7457fa8ee628c7d2566c4d9d4c88fc5bd727454448490c102fa5fdf1cbb1c1ef4218af19f3db6f631a25f7e805b17c83ae3f42dde1cd2801eb00c1b2e750ac80255ec1604780a4523104cf30327e980f1623f096758dd53ca6255afc7aeca672cff9748e490e1f92268934215b33504ac322a483c0c818132526d8193ef76f2e0dc6fab14ae653df137fa36f19f0e3f665dd52b6e8a0f2e8110fbdfeace6db9fb602f388aed9423d7d9cc0d74ee2c62a2e9a35751cd2d8384f353ef84429e5ba3ca5bd82bef5a44a13dcfa92e132a13141c5b42ca87e5337f40e191c8d77f758db95037daa782a5cef18d4f1ff72431dfdf3f87839065b3c55b0da0b3a534606d45e9d2e726f22b7cfc1aa63cc43946397ab8953193a1da9aa07dd003f603c18040201008d42aa75e6894857121a56b903d0efb3eda40eb32373d218ec7b5a9719a0591534886c040bb1526e0b459e41f7f2b650d25944e537d2131bd2c5d223ebb112e3f75068501b24833ac31a6be2066fc5636da76bbe064c7a6a66058498b9c83854e21338391a327d0bb0c7ff323472e3fe1dded735ee4c4c5fdb7805fffe9fe8175e4785e1b883b45f0f6b1b7b17467b3f57100595dba7f4f71f11d547a638f02fdf3e72e1c540df9e0d66e65d4781bf7ff795ddac5309c28adfa3c543b8a83d9205ddca083dfe5832f44db1108bd7f0e31dff9ab47e5430e258076af8df35c0169189859d1eee6e97e122e973dd0bf2028e4057a1355dea079708044f91e116df76f28a764dbed7e8b70ba3f21764d0ff1d3571b28e7d9cf881e68acb9be2e232192299af412aefaa4895f95426484da17a9f44263a05dda4e3b33bbc2cc4c5ba0b102e5b0fa47d8ee6eb68a6ed60e7abc72b6b632816e96ae8ed620ab3a4c9484ec1c40829de3bc4826f03f7bde078b6d67521e586240f4cb5f5d5df9dd8eb267d5d3ad9aaa5389f84d76dbeda30c8e10c831940371c0aa1569ea131bbf24211aeddbb3fdcfd2e7acb6fff84ea6e35905f2475076a34fc85596c21b0db964a95ed6906a15a3a28eb99243d02424069db78122b1bfeef8ab5e31bf9e3ff568647300bb0ef322456be649799cb90120a82481b3038d6801b26a3263b2eab3f29a3492a0f2b7e6d31e324ca20b5edbeb9704670c3606ca4614aaba690c68c8121313134be7ba55c7bf33bddb6c8bf149280f7670dff6d42966be83acc536a33827825a72ab90dbef46dce3ef8982cc714aeb1b04433f23bc65befe6411c463774f03c247cbf50afcab9b2dee12ceb033edb378e91cd472eea6825c2446748a3a5a3b7b6094538d8bb1933e0eb42ca6ef88f0c91c63d1283b5839490382ee5ca8151a3f9f096e62566e1f098951ca22bacb5de53d8776eb934f8dbf61e20d95d393c802660e8d5f0a891a6803d0d665e6785f5299f840adf73fa4013f8f0ce196d3d14156eb6df8c4e2dd9c4e3ce077828b17c62c9833ceffb161604de5d63b70c875cce11f02035bbf2e25ed969de3ee8d7a63d3103ce1bfb3917cdfae92f0e61c207435d970530768730d6d3e011a94778a222b39f29a5629f717cb5dad5aec4ab8bdc10cc3b92920100804023dd608db6641404b6c22a2ab74b59e83c5f3814a2a19d2831017074567d95aef07f2d0d7e91bc54d95905a385ae93672a4e5ed5c86b16896f7f2d41e73403a9e427e580750ccb2c2b8c5a555911d9e0e8bc8adf9669991440fda345fee33a5fd22ab525b83d0dce3903f6e730aa80457921e91c10edbdc3caeb16f5859c52af0757afa4273aee626f6efdb779f3c8fa75f72be08788a453c202b291a8a00506dffeafad565e6ca53157acbfd2c8a0afbf28d5f1db3c84c73ef69d03447bb10401aaf7a31d9ef4486eefd593b1c3b4fea3b8c2c31a4b377e3596baaa609c92e3d7aeb37cbc9734ee8797d6ae2cd72e8ea9cf2c8477730bc3d53d9dbe7e6548d49b70e550b73f4eeeb29c02ca555cae918b8bb7b1ccac51e715591790a25ad53d3db190ed69a4f07151bd6e94e7fbc32010a798e29fc2b11cca4dd8a023038e6b9909bf6bb6f0acd9c7a00298240d250046040f56c2c1378478bc64002bfab3dca8c97269a50e945fb44c429e4c3ee51f11b30a46b2047c1e8548b473cb8d8352c25dfa25b337b6974c4236129ac540e7f45038140201008620c85bc40f4a2ca5bc822621090ff0c45132e8273f0e6055a3ad482be7184b43a86b166539e49afd5c683f3cb2fa2f1d37bc027b1579b8d201008644b707723f249704bb2d6995132cdcd8cddc52c7ee39f59a3fbc30f34852a339cb5e0ae8a399005188bab0c367cb6a57f0800441c4a3bbe8ca4dc453c3fbd4d2ac07cb3a6928e8b875127b0be78ee82250d8b8f168c890a2a8ec89d441927a34b1e2f5d2f982ff57aa85cfa13f2fd855408347844638270ce1b94f92a0934fb204122007691e4dff019c7b54ff77f7f7b74157a7cc7a1bcf51ab1405d0da22b06368f590176ec9f6d813dce0f53c5c20421b5a465bd89ba5a8ba3dc17a78d24f01a13eec23de080b07ff516e873631464a7e5d4408d8bfc25472f6c48f5bbcb754cc1edbb234aad0c78e41a4f33a25bc6e064d9242a8c60cc96efe02f6f598f2c1652bed82da55a444b72cec49e383e6b6b38b455cb748254f4f446b5bbfea5d6142003427d38747e12f79189dcd236457a39e9faa50a1cf5777b7e16cd5449abb98dfda12b3ba090e796bc3f3febd82c082fa44d4974b5178b8a8a8a2a35b95c3637c917f050d573be9bd2ee7061e8d9a9b16ae19df97a2c40ff1bbf3b0f5b35fa7b52aa121922eb4ca5f3044d29eb0abff6334ad02c35226440bd7d9baf6647d167fc02fe8b2efc6f9b43b05c0f9828039307c659350aca1a8370b354c7b7c524760e39ee43c6a1ef3a26ab09e7aba17adfebabd31dbf1c7296f244511a563d729efb1aeefa7b56e41f907b93eeea35610afe94021417f2da0bddf1a695cf70b4377a7db2b6f3f2c62a4c0ed4aae162336b080cd4e868fff073b43758cff19ef1156f65636b4a8004e30411e3f6cf6b4f9bb540016c54361a7ee6249aeee2587d75c07744705ae33d5abd6308f3549e28f425d6ac07ec0382be80dda3a8aec2e48b8d8e16c839cd920a42ba3c673dbeba262738c00d818dc3b589e8014377c4280b0c68f048c4b324ac063ca4bda62acebc7273f8cd1934fe2a631894358166a32c81ac56d9f089a3b9f04c2a7972a9c65d4467c17882a2da297c13bfec90e3dd6fa73f4437a87d56b3b0e6f40fbc5b9effa7e8d138169bbe511fbba9ae36ca7708b0ece353b48386c1c3579c56fc2a24401766825820b5cdf64b2c1accc55713443f0df9051a4c1d942d6677eb54432c709703eba12b5efffcd31eaf9b495511bad48faddda348d2af2e29606aeb956006309210a68dedb9d2bc97b9f2d8d8c597a8c6055e73eac3a8bcc3ebbbc220fcf4c3df34a70a6bddf40ea24c3186b3f9d179e4bf4ed7c5cad620b505756245247010f15344120ed92a213ec7da8e700a87b660c4fc8479cbca4780b398359da434de4b21b7e2af478b730718a6dd5b45ecbe5ac5179a0c597f34b3e662aebdec2ddda1300dd66278bfdbe5f680cd3c7f651114f29c5fff488a28abce8194f5fe5584f91184cc7c074266be0121335f839099af40c8cce72064e69f2064e63d1032f3ee5004209fed941bcb77a78af9caa88801be2df33bd1d2f4f634cf5abd4083d16025b307d83e2a3e675450cc892a05e0deab43318d6fd7a2f8b1ca126cd734928390bd3836fa897111024cacb5c715e445e4887e827ff9ead080a43968f1b42d9cff3d07316a3389aa49c8b28ad7df3ddaef48d0d882db727f18695dd609f351e0fd8362ebbcf7863c392132daf8e42365d683d54ef41fc3c3706ac0691177cca96fac19e16eb2dfd1e04e01d17e2e7bc6685812b186a8900d1733874a494a69bf3bd7898535cd4f55a9f6023d107e1c9b8ed58f1255ad1603b73d32f41df388c64f11cb6143ea185c0168c14429f2b873ad6a50530427e1886e1ba45eb834902595c24ddc97cb9c2842d8f0e5a5474508f9f514c864f411b443c8252dc825c128e34360e008a5ea2f4aa84af9484a33d9d58e0a86209961aa1d758baa959b9c7f32064e07404ff115214d7137b8fbbb5cb8c3522aba6d82ea9b2d762ef21ce40fa416bb7db8796e84871930947b1c02ac4e8e61e04687dc719aa47a580195a6f2897479042ce34391d67313d5aa370c3aa6ebfef9df76a1c9e4afbc2d100457193588e05d7ecc4fe855b7a2281423077c4967dee948fa12542f537b0beb811e4ab778cbe50680d38e410566f978902fbbc274321e9d7f3ca6ee7baef2c9e85895b3cba57571389f0928130a794e8d2a6f813dfa30e0eea88b516f5c6e4258d32da3b78bfce2c531d361f16b9dc44963093c8a31c1520686c0406cd0e20161dae6924d4479224b47a755bf89a9c0c75ad96837b920a747c325087047ea7d8e74382b3a3d44205c4794c237fd92fd8b5d8a3f9296931aa4f7df6fb8074615040302b132190a798ebf3d4911671539e0b2e27299fee432cde532cde6324d271253f05004a08c259d384a877cdbfbae2aa95c19e621f6922f9532a0fc1b730c7618c3fc7e1b087874f0e9f8849c4324bd2db1e577a3ed4c1fc3774e4606a7a17cf71511f2ae06028140a0a89af21cf371ef364a6d5addd45e17c738591edddcd1bd4840e319afab359a271768dabe23b44412ce3ee8fb59fec6272bf3ea4f2511c87fbabec73e5d72ef2a30088838b99223a7f5d618b6ae6503ccd29c70f185e44aa885f3d697d7df8abf1aa29e45f40fa1235f5a540e6e46f79b4a7067222abb6519242cc40cd8f89d4c39c490ed94e6c5fc8b54fd32dfee94d064f94fbe70113d6019812b7cc113080fed676bcee31cc1507cc9317e2b730d7e5c6beb5fbe1ffff23076ca7c589659a643ffa61e7e302783acb6d8f0c9669ae0f23b5037235062a74f5c58e00291c5c444040ed98ed823a3db82b0af75e9d21ddf6f9f0edc3f793589e9466aabb586e4b422875bcf5f826831c52479e85077df57d6a9e306d0c0fa3cab4cea669e6f18ed4df22c758005fdef6f64fdecbb0e96a6cffd2c783f399c893efeadc1c0671bf5d022ccf91bd57b2e0e4901e7c1f82d65be7c8305ccbb1c150b58ec98015611f0b729d9efe6ca32fd8325a7f10451be6b1b65793d3050de6c3d1590052aa12c3010910d9ff8ec474f2a1864300ac84881f9df41e700eac929e540a0998c0a06612e05c0c03a5d8a73d4ee82aaad6ece2b0c3f06a9a004b3f86dcdcc5988b50e7e985b4dd0025d039827fe81c25004103ad5493fe58cd13f869fe5cf3fb9cf6a5114b4d59057c02ba6f4f741dde2d910e00e0d0a5ab3aadab08d2094061f98c26344063fe039d43a7e48aabfa69c256df7c03da5874e752e7e5f9945418ef4bebce51066bd7a9040ec37a5571b6153016d2e7e716633a15b6782885f9ebfcd5f467eb6f6cbaf0d5ef00f13c197961ff8d5826fa673a1b1414cdcdde60ad94a27734200f598b7ae85f2dff4969527ea2b1acdd478cdbdcf2be672ab11e3ec553ec4419b0c7aa038d01728461445492c4407f904147d72389423b76f770b23dd51543f1afad2f63764716e98f26b440f4cf97484afe0d143da314981dcc27509332c5c7047eccf11b1cb0f82f023ecf457f9790428edb28f6f11a866e06011413050387804c86781a2a002236d38b8a78557370fc367ec980cb669a608e3a2ae2f6344f20237ae07824349a2d683edad3fb927e293a49bfcaa1e24b65579d49a874736ae0ada47bd430c20aec42fb725e7e8fe4148d2ec8e8d556177b1f938fbdb4188b4658096e67abbe32673be45febd1a675cb1dda912a56c7f63af379166288371c68bcef1a6b3d6138619f7bbf7ab46a754326b467c0faf91dcb7704f85b4c8f1d70c7a5fbb581f3008c4577ca87588036c5bd75a3d8ce4ee71dc33dc45c8d5662cc672f94c1b856f8220fee984cc96d408acfb8f075f6986f41bc5b9a511d5d1c6ef619626fff22badd9ecedcd8d363c7adc7709f411492bea03f35a4a6fff1eede409377f66f4393437e1a27f1730d641e77f04edc8f9fa94a4d1b77f6142d0e57043e563b2d65ecb0cce340e4844469d58027e7ae063fb67ca6449a86a638d4149677d4645a88406cc976d3a4dcf4b15402667fabebaef349d2dcfa4f16751104b13f693d4149267fae779c14ca863c488755c5e6906d8ad45f81bed9cae924212ec592a465775e83b5a59916b8ec0e57f72df60f71f800dd6e925690cd76660c7c21ca46c8a6ec89d8f74c26dfba58e03802730537e74e28c5f93ad071441775b226108c5517f8925dec033b17d727380532e98f7f21730c70910765b4c080272446a8fcc7ee2dd4d1d8af86c23604bb0358a2b3a73963112df63472d5c0ee117d4f825e7a27d3aef76fc844c833ad4f248eb14b19632290fcc610061d18793842697fed35ec875be91189333f66efb3e24eb78d5784b22814048744360e03f35f3e8b5bf0d6260614979d74f86881a56ec5992f529e1c6c26a815f88b625004b382473dd126d718fbb39fa8856a44e0ad516ee997194b7ebb75a915b1657440f326af56976bfa36b4514ac872fde43314057edc68ed7b0e7ebed8a4ff7bccedcaf1471b44301612f54e167c87f0941dc99f51966a04079a3388d963f9f5029e7a22f163522aeeeb7ee7e0ae03efa36cadebde0903f8e7a020ce72d074d063cd460e64e4c90817361ddb5fd838a658109fd3ff01f5da64e0298d6b0948b9896bb0b1796f25d8626e48cca3a08e7dbdaf8f2fb8f9f3ae1655d2f8aceff0c575706819184b30f9f8983380041905db56fc979f78010b3e11c8da7f565113f52eb93c062ce3e0c9aa4a95326604d945f385958cea72cdfcf6e2d6da79aa4a444aec9eef53579a8b6d4f76ce44c98b3b749d1ac7fd461e6a1acd3aacb161a123ff78a19b0267482278fb884aa13b1e89ddd09eaf98b01aac3ce4638edbe160fff3ae2f82a4c8911c4050dad893d356e8eea4d96d9f4b0cdd63313447b1c92ebcf1cd4c71f5b8676bee2e0d9885fae23683506d4297208b6188655f8a8000c10dbc81459e9ef97c4c455538456639f5b5b36ffcaa2629ef620dff87bfb93c10550f4137fe5853182ab4592a38093c3fbb2a6126a1cdf41af73ac80abbd2982710d3e242c0914f2028b3f2956c5e8f16f2d75e4480e8a254fdd501259d3e8d16ea1d122751fc276dc68026422e9a60f874df640cb43205a461f52d71ba93676a2d60cbfd4329acd2742a7788d56401668ac5da70850bba63e91e020d46c128fe81ef651a90ad3c5245d19de2903748c9a642c16396cf4e41614d8478f4f5f4babd5f77a9b0aeb1522ccb774607ee66f8158439b21df4116d6a19a25c138028daf14fc1bd66bc03368fc4812f4460812b26be857196cf8a4b9ea12d2fd0296e9c4ba0f1212a089ad423cf6fb04576a1176a34b44bbca54652b89c8f97e973e8619507103a230e0bf87dac6febff653c73e901fbd907083a9bcdd7dbdac6da984a8ec1cbd6cad1cbd6ca842f13fd6156f75b10e58a8e6067ba946701be18d679beb44fb5f16cb643bcb68d367b29420966283c6a6fdcf633b7e04b149c6a0bf947d21bdeef43b9f6f4df8fbf078ccc7a92bdba090e7a66892a8bad389a8e898f34fcb3fb2315f3c9273976e6f876907018584dc30a25be6a8afc50064c5c350046063663b1b10b35430e1a36fbe46318cfbe9c5717ece566840abd4c05e40533f13f0d547774dd5d36f40704f002e9ae0ccf8c9924f5946250c2dd01eb2dc8977660d611f4e846158c8db790da042d68d69f97c7cd1c7477af0ffb03b8b118e336734b113cefbe2ddc09f243fcc8f2974f7657166f1af0a107c6abbb031c94f6bc698aced781f781eb91c0dc0e0faee0218ed8767be81df8c59764d89447cf006870ce8fcbc494210fa475c308bb31e3e7a205c20181008040281da6fa9c4eb61080c602df86bb676b8c7f4b2ff90f3b7cc1c22d86793e0fda1fd69c3d547d356820a1910fa4dff3751a9d3d2541a55f988e1204db3217c93718223230ce61fc49c811fcd30d52036999b12545eee67948dfeb25a82cbb506ded58ce55a171b4fc0c5cbba6af97f16523f81421300e76c9160f9ac7fe1e5a918b98fd492a872dfc736e0ef52855af52fa16dd4f24dcef3d1b59e3da6fcda5e27fa9c93ab56ff13d2a9c266bfb21bc587af7faa40fd67f11c5e9321f3de7c832ef57c1546f517a51731556e0758aeb6f48a5b10220adf8571d8f3741956fd342277036086cf162734178e133e711afbbe138a07e5a988dd343aa229e39b25dedb774e682b70b27f29cf331f7787488683225614c786876c2c21710b8c33bddf7c817a362a41c2c4712623a86a48c2d9077d059437ce36af0839525063c72e34ec4b43922c0c4c0f395492fc2f3c66577e30779207984e9a3c8b7c0b4bd46cee9f662cb47c88dc963d3f8f8679834588bd18fbc1f40be6eca9cf372d371add6eea667f2ddb1426ed50f1ffd8a36e3af998c2f2ff3e9d4895cbfd313300640213242583247a86cb9f29e3f3e392cdfb7efb1c74b8afdcf705df492787b4d0b248fa5602e1bf678a898c030dc8d4863dbc19066fa44445fee4c388bfac9acafe2fbcbd26ee81f97df1a92f30ad51b420f9e3b86d49c39c6f991d3e3ed4db1b096f5bdc9f0c842d28e5223af9eb0019da0b869e28010abdd1f7a1f259b472aea6761fc80ba668b63dbeb6e402cdf60f15c97f5d00b1aef4cefb9456a1f412ee46d48785e384e761079b91f4988df97bcecf704f2d43f927f3716a282a2c1b89f9811aad94c1d5109eb4dad520d5c1f1c5a3596e86a6b424bfbe9c6d47415993edc49ce941a740ec08fd936610785db1a869372c944e933afdded73fff89388803521a9fe71b573c72a709753f8e5fefcd109ad13cbb66361aeb3ddc56617469da0152adcf17e892526d6f1999c4681f4cfcabd81e73867d5728fb191ad849d37e859f4cd6d316c56ef8bbc35860801ddd90c3935fc4e107fde0417c8183c620fcb1ed7e4bc6f47fcbbb5694dd5f8014491c6a1d22cba3e41f2f2ec4fadac5149d9ee6ae081dc2dd8efac22041536ec64837f1eb7ed7df5ecd9b5d640b95d9495a4cb03e4b9ae7fc8dcd8d7617dcc1917957f44f7bfc14f08cba9721fc2571c5b50367ca92608b0c13534f6ca1ea849282b284fc7f39c47fac775eda2cc5bf0dd7a51a30545e67080ca0390409397c75cbb1c1ee21e1d9f4e4bd5b6db7448b19cc5ce1ec417504447101f7ef1a6026dcff47c040b4269f8cd6a76c27b4f819c1b3bd42af5dd25b49a33431772ce585e6e37eacfdf49f666bf87ae16a4be50fce63087180f01d3e841e3be72bfaed93a2ff029270f6414b7e2edb334cc57cb1f68babb24ad5be0bbcd9c41db3c020415f45e7b5466fcfb21580761ba1a895fbb9b6dc5438deecffb90c9bf8b7051e5a1feaeafc8615c3c8e8497e7381b5a02f60b528eedb1899e4a288681565891c87363903ee37af2ab4f987d88393c98138db7fb29ce5047a62d464e986949a42ca15f79527bda6406b497e3c28106a2c39f6844d87da7dccfe37339a3bb9f330c24690e0ed8e32e2b4ef2aeff1eb0bbed4ad22cdbb29aa7e6123656a06fa3739ae55b64e2d79c1ce0ff8be17201036f3266fba340b17c6292454792d3bce6f9ca9f0ae7d7a9fe9365f7621a3574c8c608b128f7faf14dffb64676cfce3b8c3aa07e5e367435e3972890a7a91ab80002870e31af7c77b3160785aa20341609f557bf2532c24d18efe267ab03a86b2c7a46a6515e7bce7d2d096378236413e9ee0b1cfa1c99e982b8d0dd8774b68614438d524818825767cabb80f97de7c440b17af0402a9bf8756921c0130eca732722df652a32242c15c01bcdf92cffe0cd0fb6085bfe3fdae94eab78a061cedbe26b49cfc1c8122fc4fdd72a869ba2266d4fb4adebaaccbed96f853fef6b007fd7f8e3607bca7dd24e7641ae91e3b81198c706e4c7f9e916d2d24fab3a721382392940f4b154311002c359f1ef8df775ef05784ae2bcf540042d4f9afaaad2d71a479d6e4cb4d4d1a40786e869b1a7999a012f4ec3046d043f885e0eee3dfe3fd022db6f6c29fa0413dc3ab99ac000d64db2c2822ae8f5b4d0ebf9deb4cdea992b445d7a54cd6464ce6a9e13e651661df0a8ffc4937e9af9a92cd938fddcf474922b18cb06db1cc727907338f6ade09cd7236d280d458ea86e45633e2fee16b119ec1b3fef1347dba1bb95082818567744da18d2557c0ac42a72db40128a0e9b7314eef6d0d73a0ac51971037b8b411305bcf5f72e6d68a40a92454190ccaa2fe48a7db61ad54fd2043f5bc942d2c82edc8c2bfadb36883cc52352682ff9d388803e2f8fdc658f0a45a42227af39c17d8ac935749a2fc70d65f48cabcc5c4c4ccca000fc1d3b93d1a8e011949f6b81fdcde144c471c9cf080d6a58475cfbaa42d8daf33c91e5b94ccf27ba5bcecae56feddeec4b20bbcb23fe7002d565c908121ce63dbafc8ff32c16cd85a8480fcebdeb5e3819d86400f945596408f67f8b59929fc96321eb60d2830974ae054a8fe71944495a03bd0e7f23587c283577e3149c4d0fda481dc7822931d25cf27e48745a962dee9bbf24f792761ceff7df580cfcf79df48ba76fb2761c98bd455be10e1498d7f8f24d187e3421513613bc5ff612e1bf552a675ce74c58433432ab82ef7fad66d3518122c1a180807a56a359f69d04a3809fe0e681f3ec5422c80e9734c42e65246eb8bf997f0fa7fde637d45de220ae7bc34f1c7c89adae83c1fe09ece714bffcae674d232704bdb4e5cbde6f75a598e8f1eb7008703238b3b4fc0d5e15ea19017b8c7be04830af86fe511d19cbf027218ed7ff595d4ea63d673b334c52baf86bd140950c4e370b093a7c1d8f5c0c55cffa89a3f0f50520f960f01450152dc4dc1c1ee67bc229f0ec2fb5fd04b0092049794947020901f829648011b8082047cfdc080692556a0b9c16c52acf5f95280cfc92236271c994595d1c92f1634cff99b840d9f5826ccc819d3be46c7e6a64f209c55bcd69fa3ff73fe76e36d336d0ef95e7379598d761f64b0ce5cd74fc20937f153e9c779b12b4a880e29534499c11fc5830759582b53414dd821aa23f0124ee0d718f404bf5e104e4fd45a025978f7518720ad11a7520f91e91430cd9072aaa143503808be0f91c643a5b3e1cfc0025fe792649273ae99b980ab11c10fde87c2244143e0529c6f23bd0022e1c42ebc4b99bc6f873c335ec92cff94d6970cb77573c6e69f40402aaeb00016d46dfd5e9022135df8f64e46dc61d1af89e33f8fb3f5311b5041457d9169edc88c63a81a8c1f11e6a3553b3be60317363811d62afc2983360786da3b05f680f6e1536f88035aac1144ac247ff5aee583b61ead6f258b477ef14a1f259ffc8604ade46809b2004c0cebf31caf458c24fc980e675fe0564e3ddbcdc7b2c386dd7f3f05c9ff2794ea5dc4cd11b4185c5a950dbe4114e4f32a721a29e666891aa7030bcae94abac3fbd7ff9908e3d8e296d7f51241665ac67415145c3dd46720d7bed7a621e5e173a6c7ba8dabc480f84f5eff4b57ce7817afdd152d44610209536113312777bac2036f1eb79fbe65b3c76e13235766df8589db9946f4c7efab72fa6149880330c0bcf7790e317d15a3fd071b57f7bb756b77b2ab9de74f64de040912d373878f554015af71e1ccacfca418ba4b9cdaf199354da24796179ee599c5cf9cd15ac5f0b1c3a4516d523a9c2a2f7953ada18302efccb6bd227b49e271afeca149a0b73dad2d7c0230b2f80c140134cf040fe1a98d70eeb3e8e67b7dfe51cb26dc29f3895ed2dee3817981bdc68586397b9b94a997488abee032a91cb3a4e3a4ff1a74f956e76470423769798c5d3292e0c6a3f268b22403d8e6ad09726f7b477860f3567d62fad3fe6ffb7b0e6a70197e969d630caf0592780fec5cf571b1bbc99a8f93fe562f4b785de950c28bd5c2b7695101c11656e29cbe51b50a959b78aa5d523a24a1ec83f682a107b911c942916358ba7cd612367e2797f6186e12fba94111611b109296b6bb50011c87d466c40f5d563e2c1fae0378f4c325f6223dc5ec268f4a8c333dbce0ba8e0ce5c503bf8be34998b655bbc524d25575730f2b62afdafeff8fd74f4caeefbbda278c7af3d544045f46617c52432c40f5a7cb41131e411ef2c77617ae4184d8323b30bbe8e79d684a7abe48f9ef1fd2004c7c46fb719c75fd3c3d7bf2d0ad4af2e11f88f2df1ef5ca03643955a70d946fb0cbd3c90fd93e7c2b76fbb3c1a5580216837c68e3041244fca13e013cb4441276ad7282f29fcc2394985885e2752950d29151abfc1d9d4855c711944aa6e3c86dd334684f0139608bf1e3e270f8f35c4f40b6af32e5443bd14cbb6f1455db2a9ff49f3b7971fcd3344d830f0b69c368d27bbc8dca2e2763bc338ac30b8c2f7ab7a668721db4f07cce5413f647c1670bb60832b429fe628e7436770a78bbe374de99e47252312fda2cf7dcff87b8ca3b2d709b3920adcbdab99f881c3aafc285a01d4f70cf65d0f4cbceed505533bf77f72c43ca81ffcac3fbb77567b89fe61f71af360e1b03a4fe2ea484f05c8b57f84ac3ac05a546b7bbfa64ef2b8a755d00daca0a735543107a0d61d303f03daffe2e3a1def0f0f84c98610588b6ce7c68955ebb1277ce5ff521c6578c6d583810f3bbd1b811e16aa1af97a69228a6f250ba200efb876d1d74bdca564a64b62e4037cf553058d49f47717fb031279c8267faac23dc6aff61d77cd8eae0331b975879b6faac69c3f735b62227f72cffcf2d0024805e75a025dfaa2882de1d03ff591e58d962fc766b95ccb9fa1f2fa71edfe9b250facfb20b0c63208ff12875ecca82fe09c60dd08d40336f94f4fcd482c9facf5756c60c59d22ba4fbe9fbbf45244b6ac45bfbe5b84b8826504f79ef65e45cc0bf3c5ccaf312d2bce39b3b78d7348f593f00c142767c8421596ce809d459e098a804cf2024c42823b2147fde7ed9791bb4f9686af632e89ab83711582b6b83b0e908ae93c1e3309e3f5a85780e39b5dcf61e9b479d89e615fa39f0b3e56702039fcf691f89814acda5f90621cc4069de93029c98c7f06b82075a96717bd36eb75f23243a9c6a56b471f6a4c55ef8afccc1af83477e642a1bb546b40bb7eda9eb8d4a9777eaef6294bf8bc09fa69e436206b3f115949b1c4f02c2c601e3b744cc664c47f7c518fbb465922e4825af1f3277928ff1e84f2b40cdc7782830579aca91cc599f5ed046579cbc01d0cf3ad683df7828fcf7671f3bd4a1537a01e9418867c9f1a9005e9837c2a64097d70b126341c98ec492a9f429b38f5123d155813d801096b0d1209093270a0439004eddf367a6ef4b0b2cf2b6f2e32bd4383cbb16a7e2f70d288a11bc48faf13c6a1c310689063ac02c572a08213d0310ade35e225a56b85550d6a719f10173448721d82ac1a8253e6b960a74f2c1188627de05b80dfeee19a74b5d581d67f2edcc390e831eff3ed3861eb5b22ccae42cda1f3db22b06a0d2ca4e1f966b31159c714d6b02624c0398a0d4b1171c7fbccb72dc692549dfa261301ebcd0331c7453887400f075b3710a060531d260e3774938431fc052850920823b2dd5e8de105d31e4d02d69fb10d8b9b7b30ba58984e1e729fcc0dd9032c26c75c82e72b0a3e44c9d5ea38f04c0fd075e8933672bb5a11b2006deb9b7823629fa3e0d8ff7693f40939f2f8342ec116ccd050fec0b90fbe5cbb1407029a4ea7f79cbea15a42a9f8632fe1f9d2c74a9be75419b73aa70c5f0b2328cd4428dfbda7ab9ea06fdb059112f6db0f41e174028f293055a7a0d7a10e52b50bbe8dfc5e8c290e8359201d9c0048fe39d55db6c668830d9fc4b981c4c1a19e1b48738050b3ef27a9a77dbe545cce483bfe93694ff68bb0eec09fd5829ac05131633f2de18a6a987db9d16f0b0e19067f82c261e5fdfea92de1657b1866f848c9577ec36f7ef0f3ff5dc01f4311408dbfe45586a593f16ffe6f040a7a3905dc98424f315a94f7764eba0d21c88a4200c36b77d65a6debb58bbfe4f87caf7637ddc4cfc0bdf490bfd1ad5fe40d739fb5bbbd40d06737708e7957112f30724c663671be764598bf9c987f4c3f93d13219e38cc6830dffbb3d314c6ddcfdae4f961eeccf2bb9318b058194567a4a39090b7d0b7f48e8e40c5fa704dda42d01e8cfb3937ca91330b18496d602fea3cb57a64a06a1740ffb77ba9200ea4242fbea9f15505dd04abca7c1de4387cad38908bb2861453e3857fc630973a0a45377386edc010b442c0a306b9c14acdffaebaf6f24742b85366d338b78bf44b4a8c02ec7fc57f857e7ca8f3460bf8d5fe46c7f913d876865aa9730ead4416c17cbcd754b7ef0ba32d82de1adf2d754b3931602a7660b1591533aed4b533b8f1cabc5bccb2c0f9779c55385e1319643a15a28c7d30f7614dc3722134c2f30bbc5e419bd863e77331d347c30a653cc68f5bd71505857ed9ba57bdcf2e3c8d4292c803ffbf4051d3e58552e522aa39ccba2f0cbaab7a64036f4ea8bc785dff6721d520facee809579b0ea44807950eaade5441d74cf6f223d66a3c8684dc4fc2289c354b84c8ae8819e881c0b7f802c74d9e890f2476f1081b20adf3c23bb38da394ada587af8d87a81142295d52fc3e2dcef7cf4f9fc77c151fa8b6fd9ca2f0577b5463742a61a92407e84b459531be0f1113c04696a743a0cd80c5dd09bb137e1e39ec31b70503c6ae75c3ddb37a3fe462740ca7fd2f2e0b98334a7731b9ee62102b8b6b15934dce64f7f44ba8f57c48f5899afda2ebf9a59e71f4cac33e8232a7d71d71af5f9ad99d10d7bef79fcc5d6a29943f51059f1b0ac05fa2c66679faaa80a5aca27bee65e4216281c1942095c189a793fd1964fd8544dc1af36838e0c6df900864bc46d36188c83bbc79e9eefa1bbdafa58ba5a7a3bb35a7939dad8db12474311403364e487c520ba2df2d12d41dd53cb4c045ebb9eab3ee65689e30db9a7fd376a40359d56aa7516af0aa2b5388b608fb153dce96f118df961ca712a54dcf649142f0a0aee41deae47e2dea2c006e000ad7b19e7ba9a2d61d2c30c4aa29b049fc2d5b88e12323eebe633531ec6b553ac2c678ea189c017b4ce65f8fc952a118da85e66d81d963784935b408a2508fd94fcf5291662012eedbdfe8afb3ef44e12bda797aaecaed7e1aaed5b89c61be7c31c7279e99fa7800a667589b87178799c8a1fcd13081b13c3b44503f3c2677bf60757899c54032e5cfc6203f07943d07a9871aeb7d912c61e33e31791b2804aa2fd2324952b28b8f8b8ac7d69c142a0d9d10e5cd9d4527db9fa76f1cb6b5a72f3636830f59900d9d6df6fe8be435bb8f66bd74618dbe49f46062508624e44ec49758d259eba3f9e2175fafcfda76d1f7fa365ec0d4fdc0e60f18daae8defd8f2aea667ceff97f746ba4ad4331b5e670663f1f62b7e6429168020b5620905ce16998b45d7a30f0a425087c141695afc1976e1f2e5a30257cf267582d2b0ce20fe5b3f81c5521b464515fb57be0feb49fa7a438e0da5d858f992a7da14398df1c85bd7fa34bf2146b868352d3f3682978dfbc0f50cfe13ccafcb617aa2be16a7761f179e285c4368b301a9ee9f84d3d471ce16ab807d137816f03080f61d09b2ce07c53064b98f4308b0625100f3193c2c8721dfbc7b89cc051c44260b9073e0bdeaeec1b3a4612cceb6c64dd8aefcb27142b520651c8899ad89c71dce055d4f7f26a4863c932c55bef7f3845d8d1b9179b373f5908717a581b96e1bbe13699017c5a29158803849f3973bb043c6ebfe90ad62bf18f7f6ad0f3be20771f73587e5430adea6db1a43f8157434f9b833e6bf347b0b853e9865ffec826fb413409cadaf9c84b7895194c55087c29801416b0bb3efb94d2f61c6d0d3004a3942975d4a95138c2116c16bc9e047c048afacfa685882fe8f7c7a9cafd6ac0a95679bda787d3776744ce2979bc94ea9eb5f94dc609d03e68c93f7c87defb50bb216d33672c44c324d2947888e4da56207d233275f3323007f403b03361058ceb16f259a7148ca05812dbaa0ac3c0330d995f7725e789e4af7063e4c2107fe81718bca8f216f8b6f1f5b89e4e7dcddff4e83d7c11e7168293018813f35138746bc01e5211790e1cbb98d2fd3d3a1882a9f740e8bac4504f146e5dce50d3882004fe347a085d38c0addd6228026884fdd1e29a8bf799caf053728feed793651ba6ded4d238b7bbbcd1f3e79f83d900ca640f7975c23cf552fe1d1393e52a1c01c80358458ef0837f4b483a697c60ab0e5f0edffb3b372c0ff58894ba9b56954b9dc1d28b228aa81fd29a334996b699d29e98ca2f5a073a732e7c1df9382937d6d77d7f70efaa20770fa25c8f2048467d72469be7e7b4d3560c3e8468ea125558b4a812d0e1f3bfa339d59e2d428299909f64d663a09b8f639cb36ea19c08d561309fbf3475666e9d46b0a0a2fa319e1dc26b0c5d9635163bbb271ac73006faa3def74f65c46607c3c8df834a04571cd39126e786559726dbbde25befde6a2e53c4a796a657e9cb26e808b0d370bf6eaf973e759cba0749c7550b9cdc74502c693d3034b4d6dcfa1f183dc2dddf36808469e13016465af8d2b04b598dd3da4df005e265f7e0c989943039af67922c9c67316d2341699f1a9e4560aed8d9f1e83e4a31b0168f89f01898d33662fb7af24660f9a5c3ca3684a1db8cd97500bcc2d7fb59c08f4ff81ebc68492ab124c48c720b3fcdd99eb830311f885a302974bde190761d616f9894a15a645fe30a0a107a0671b978ef7e8d20fa22ccd6e1dcd85f229518f9e7736afc746ba26c3a194e0f92e53006d987d9bb0f0e466e9a49786f4dab9b299eb0a5d36e65c8e2c7f20260847744d8a5fa64b088c1c10736e6fd0f20a944bbeeaf3e9481c50228c58c2e5bb83104fb7e91ae89bd661b8f73df40c7a8493d612f7fe2792609a19b20f664e709d7adb12437361b1242fbfd4d69009e62010ce01330edd4c65c937023042cc7924aff62b35d76adb7d917ecef635fe33c34de03549295b686d88513aa1979d3440c3248cc48baad56996843508308a3a18c7009e262731b40c6b470bf712c114b52daed1e9809e39bdb89623dbf1496d209657acb1a06c5c6bb35b819094afbd4f12cbc2ea7dea8aec1d18ae67225ab452bb1708b696f98491c5e4f734be59b0c15e14277588c37156ca1de28cb84d24a833155190a71100bf4e73e7cd59bbecb74d2abc8612fb52ceebe0706a5cc34650fbd6b5dc719e69601729aaa06fe4472f9a1ffe16abe3095e45962738f08189693f4be085c94fb416bc461173755d5e46d0f9a0579d57a58577dc991fcb7722a50ad86c534f1713ce4833f7b4a3a0db27c1afa363b8208a6b15a13dbeaf22e98ca81f4bfc92e1a490e96350ff2326bf3ee2bfd80bd6b5d18cf90c104cccd7c0441ccfa01ba14a91423bba4674ddbe5248d203c333680123b9996d76d29c6fe29eaf6e3e827a92f425c6acad6ea12d87fd07cc6294f2b76a4589cdc8c04a57d1a78162ce01dcdf63fe22885d8d54b53e03110ebe7a9378b8d020b7c4d289fdb14b70c5d7e147c6f2102934776c5ec380f9c9db87aefd23b4961d07cd6818d92a2e977c2f2f782ff37cf747c3546bb76c30d121fcab4faa26a59808fbdb66ee6497266517291709babd9b5a92401f6d72e10915b90d067062c82ad1ee8e6542e94970efc2ec5a170a11602033071169bb216cbd08f0bdd8b1c09a1a64f9e79ffa4339028028908be8c621f3ec5421c00fc375a71d9505cd2f6c697314a32244f09eae1aa4d7aeb14b03e1ada2936a00050a2046d056541480f66d00c412fd5352f579b4ff9614be3c552bfb402689709e1a2371b40c5b47c8feac4d0df4d4b24df6e689c3d744472397f2e14047231cf52f6c7874261b1dd8c04a57d9a781686a8174d3e74f768852376176a60ee7c10258d36266f18621eae676c0b0c15754ae3c53e5c21f9f49ef224e158a8c1b3ea7b3fbf19e28069cbbad79ba4f2a148e8c8d0a39e5959ed3f8cbe93391f5a394ace9dcc1f45b0fc4e205a8f2e5cfff5e73c2fc5eaa1f1c05e1ca49211f22fba848c9dbfdefe7f40550fae059f01cc1bf405e6291abd1ded263ff39643f7e79578e867fd755e09500f4c0c2c420ed9a1e2bdd74d6b192c606044ca75933aad7d19edcaaf64d171662c779a4415088aa3be30f22c710391d3811e8c7effd140625388a05b1f75db17b236d9feaaf3b2af88e28203450bac9b78b5d2ddb68455ed87362247f936e82f030d88d5fbb0955b065961c34a7e316da081edf8750498e302c4610d22f96199c9fa3a93b4aab4255b3e2945e747d61604b665bccef460b30647cff764a001fe46afda605ef68ba1c483b56e99346a631c0aa51ed214ae7feb21240bcac52de28da246908c2778c68be8020d5964f7ccceec56fb5b3315d60777958b6efe2b45b86c3ea48daf05a9bf0b497102bb2aa628b9cc08df877f01b27ca0be374536051e92d33b7f0cfa3fcfe511f14078ea7c748d54eff84e175e7dca4c98e4f0a7a106d7f96785a4338f7fb9466ff1c6d5c11cd017300bed53ca6c08ba1e7306ccfb84e9305664788ef10e7bfb8af935f582ed23bac73cd36938646b6037f4ddadbc1556ffe841d629823902db6fdc4598dbd09f85e14a864b25502ebd4989f9ae1d4012594abaa9336db229b03b18d6c057b3a6db4d390b9957136b03782e0c6ca3e76af8d01708b6d3c40c8314a585839cee2069e7ec8ff30d1393d7e0fa8f171b8ee60287b8af1d31e812a01e7079f0af25c9230c0e785acece442bdde52469a7531a54c7e63b78d3f8cf78017cc27a3e07a63d15f044275239f834a5a302b27e9f4edd4a4e17d95492603f2cd98d4e35e44e3a7b13d8c7b778b0d3fe9fc24be99cd0103d1086c70a789595151c44040bc068c9afac74c3eb52eef429b730a730126b4f5585156e9f84f5e73f3151c78fdde6d30ec092e6f9e10d714f73e076d6199bcd82b3f80582bd452366b72c676054bf26744625b8affaa46ae7f0997fb00c33232587b87e84421b4b5bda776a2982847e39dac3d6e5231ee6fa3fdfe36e7f0f586686ba4fc5719afd4461b2333708b62ed2fe9feac53d7f586d8793c7d0c8c1eef0bfb7fc58ca8550b65aed45f4c7dafaf12b60c8de09e70f57329344ce2e6c68f746dc1734a01a6f4956117491e831f0f802ad9818020333bae53f0e5464f5b54885f278faefbf1c0f609b0ef9b0480116df6a662e335a00b782cfeb4df87cce1cb135a4e2558745c330b5b4e6a1a3be9fe462c83a5bf17e6b31ec65cc8625c49a266de3e97afdcd697cc1986c837e04a80756a607363a8bf9289ce62905d5dbdddad9d6e7e7ead0b8aa5f360a96ecd47fa0b4d2da356c620bd92989cf3a6c76236459b4f7ea46e5bb61d30ee611c5f6febd05b01e577c419b14c43db0e7090cb45cb90fd789428f48b86be842557f12ca21c8a6cd9d187f92ebe9b99144fa23dc1f40b77aea80236c50fda990c1d5e49b366b0b036459ec189dc19ac8bdd01a2cb8dc17ca66f9a4a72a7a972d0381e2d3cee38f123ebb6becc9b45d3232676d498f81e3bdffd65ca1de076a3f2a30961a8622009cb5fa09b50ab7cb0b9465b8dda8cda42085c116c831e47375f187a306fe9529e07c7758d8166f7fcbfc25e3c8e42d2aa9bb9ba4d2e16b563edfa9a56d619bcc6770c5ac36808e69a56f7534c5248dfec7139a116f85b890239ecd5137b184e7cc5fb77ddc52db60b819094afbb4e968106e75de18a5c23651998a2aedd44e18c654c32c4ddab875bfaf282564e80aeea5b1b9acd397ffedc6ac0f47d348388908d4d3f37bdf626f60b6bd3b8f0e100dd0e7fdd7f113c9dfe3fe4bf3aba89f80e68b9709003c996fb1869c89f1ee9a820c870351f6e55b9df1bb394a4e21bc26c38284125b73ad4ce7fbc858d017305a147940ccf0ee7b5d34464e614e15b6769fe75e19ec4a7433fbc81e3e8baae09fe488ee72b06fcbd830631d21c719409ddc684245344bbc25a0171a8c193452e50edfa02f5270eb489fc8308ac9b8aa9f12defa5f5361e8ce7e361dab37468b707110b5c8c79a447b175cf3ff4b2a942bdf78738ec0d0fc920627ce445c0896a963931f7f02bf98bf8e0bbc23e13bbf3d26c97ecdf0d1fdeb72c9a9492c678e027cd402383466aef2878e6904828a2af546c704ab423d18d43988e617c7c3d387873ab85509cecd873832964756bc93ccecfe0bea5884d47874a8abd2197c1283a4f1ff87acca1e4817c8efaa967d65a8bec9edc0faa5564ced12894031996da971d6fb7a3578a53c3c119c1eae509ac5db65848f0353b572c8a7698c60e9cf1315000bf4dbd1e92b00e7cf199b5b505a1694871a7946e5936c30270033f461215049792e8ca885570c3b27457e97ede330493c9bc851cfb6c2e53f104bafdbca73c1704e80cbb941f7f75e051117fae7ec60146f31a8a551ab01dfea5998fdc1bd5cf755528198e9abcfc47f635e404dcdb3cf035f7ff0d41b2fe1c1f7a464bfe4cce561b2ca28de078d07f907757d0f5ce4cdb318d293251b42c08581115af5260c8f1838b51c3ef01f4ebfcc8a207ca0f4709ca9389eb0f87b94abea643fe70668f7b1fe60ebdbdc8432a8cfc1d22a11cc6206e0c86362280268abaef61c9bfae5733ab67ff9923c99dac96e6e353d6682398f9e57626df03f08a0f03ff58991bb12975a8efe25d015fb1f06d196c840a9f47a53ef018b5d1fe5375c1a8a7a0c4aed40af8280f355132c603e61304138c8aef7cefec4a4ca1e071354d645df95a0a0922883c12cb88ea77458170c6460e8fede5b93bcc116ea5710dbeaba1834d530c6c4cfa2bcdaf3c1512a0342309329e29701359726c23bd90b3e8118a79aa4d3dc300b865820d48d91dec27f1a7545e9eb0cafb0342a5dc84ad5427889429a02c29a231bf25f9e30000a79f69902230c84cbfb37674c447e141832997eb598ab4fdaf04311c073e245288bf3b30c878e2722e9ccdf9d069649fff0fbaf7bc2894e913c8b134e00fd1fb41b223edd3aa573a3b6fae6449e7edb68946574991484a760bfcbc413ef1ed8d4def99f890014f202e58e2a6f613b9216296afb7386237ea58ae881999a6100d4050f94f905194da24681ba1ed11a6eca65e2ff0f7ac3fe6d8536b646bb4714ffafd0bf83cdb118478d6d8e8f89512e42c8bf911c82c0b32000fe7468d95156d58bca19045207016f5df3702077614e46f765d9b05ed719e12bdbcbc00317acdc63bc5e98bb0b24b8ce546d94e6c2543d6afae7c4adc3bd73beb24694ce596148dea59ef5cab3d0d0b411a1a00e7020d51cfcdf1b04f15b8b09a840be1a8511f41fdceb5247316a381784dffdfb7508c21c508a97fcac1b78c7bfdebc3a40b03d18e8ce60a5ac570d5f73b5fba8de4ad69d160354438342b4ce1d7f37105a5320b0af8856dbdb5a678a9e05c805869f61592146ebca2828e439ac934a83c63316c5ba2c1beae74bf86e94cba0597d697ae561fcd62f6f2c730f70c3dcfbc79ee5b17688f3291f5dc4865efff1aecafe1ef801f84f12168815e1301aaca887be0cfdae734c0c7d8b2aad5517b9ed106cea9437877d21aa0a0d6d35fc9969ced001538529c67182eea1b04df5a14010d48108140f95b619ef038114d1a98d652b2d278118ef612885528c0ff267acfacf3f0a4a5b0d6922170e4500095a8fe982b843d3e47ffa93047c700a4c8ff71295dc3e604ae4ff0a25d1e0b7003cd51767468427036550337caa0be2eca18c0d3bfe343f64232d6e89217e5bb41ec8290806c413de4121cfd7d98216499e5772de60a3bc88ee187da1fd48a4f3604404ffaf214f1cfc844df43450f79566da708c150d4063003544539ca4791f8a0024c2aafe0271ef1cfbd4b1697ba489357d0268d935a3a661acd5f5c1978fadb300ce4881b9d0bfafa9abe113b9e2aedc6df881072e7f7bd7fd44c45ffa82167826412010080402bf4daa13bc2b4d740f6fabe7df1f5a86e8dae0c22175c043cc02b682899f459341a5c0ec855fbd034d0c9d07a0e352c5500410c6f0ca64636251b177a01994bfd980e192696e1defdd5ab46a40d2b03ffe710a087fa51bb1e8271724fffd725196a982c6fb5be791f7a077cff69fea40c7cb7e05fc97db2924923c66899eb7ce38f9cf8de44389f9e6d4ac6ef327755b8e78be3aa7ce9a4e386392b4a1aa14c0a8920f4437b9451f82124488584dfd988e62b757de393852d9c96dca3ae0c32d3bca99e07da1232e8298f78e785769dad731656a041bb1011e8a007652afb584bfb4f439797cb64f4a1017758ad1074d54183d7a8f79efc9c7d5ec022c7351cd57c45e9e8781baa1bdb9b5c9840e1f1feb9286787fd657ac2b2d37bd550989c8c23b82ab5a77cf6b113f6a2667d4e35f3c012680b5fe7cab937a20d03fba7f731e4e12fb04b6488fa606fe7789d1211c3d4a2fb802551aca7ed60838fa995d2e5376218e7a8cbb926fe4b54d84ae1b4379d43cc65767fecf62586884dd3e21dd3a3f94ba7f56cd68222a65e9c49f3c88a1284793f47f2a2f5539c53c5cd32f33a952663d6a52bd1dc27ad548d6b70448aebe2e3e8ed60e968e6e7cc339f9ba7ad87ab1d906583b58baa18aa108a0682568673245e22dec7f09c12cdbec05e31359e913f246d417af1307b0e2b410e095c08fbcd1d6996fbc3134fc302019b45120e8fc3df94ca43e9bbda20adb747477ec42c0f2cb6d57c4840f97adab218eca9f17abb3d7e72cdb4ffdcff15c784f62cdda8224c4ca6051bcc9d6510a9eafd4960331e87a5b33def1ff3177e00e9a87487cd9b20ca0f71caed70c5fa531956df49981b787ea53b3129bc704acba6243e5370dccd1fd1e78483ee2a361435fa0e8510a0377c1fd160ceb8a39adc8cbaca26c4656b1d42bc1a2577ab905173645cb6cbd00bc327fbcfa512e9ed03752059178ab970f0bcf4bfe232e10181c0c07038583c0222280e0995421dd1f5da9bb6e8eda1e847b320a4a8d2d051929b5f0d92a5da9e3e15f08db54c59661a107049fa531c732fbb5b92b6adf1797e4642ed5f251c4b9ab60e0868d8a74f435c6332b28953d924f39682d2685c6778dc06926748e3106ce9e2c2610a386665e47158fa54e5931eeee70f7a29a5975b3ea535368158990dc4f07fe4e7943eece7afc96e8d334bcfb3a9a67d9121c35e78d5689f368da863e2875a54a0c6fdf355f35070281407c85d7d4f296f7c6734670f2a15e86f55c7eef8a57163dd86931504af43a5d788d8cf4101cbfa74bd67d32eb5d8668e1949b714015049f53b7666a62517f4921e2fc355ed3ab35fdf594a85970efbd5ffc3aaaac33603a5f304379b751a3a569bb8f241da6e1191a10968d7f7d730bafd91566ba6c3df8a2f5f7cff9265385edcaa51af2479d0444a27788afbfbcfeb588b81a2b10d1d79ca13bc51e671542463ae77943070c67a9f4d9f0a70e77a881e249aa1dde87bf1f908bf39497e63c56693b55e24672217b97bd40361ff4cba17c0d79062927b639a33652ede55a6cf1d89fe63d830636e5eb30df13e221c24d90d5c3bb1e884d7d9ec626642870ce56095a4c7339609b044e1b3d508d06ba2fd40abd854d8ff16135e0ce2fb8d7133531edca78b7282d32d483ceb62aebffb61d0511920a7f969e71b210d48d65d2d2c599052d57fd548a77e9beea14733c32af5468b3c7a974565ef224b2e1134f0159ed866251a22569b8180203b672703f15b99af0bf49c6d38cf038d090389bbdef9f8cd1f5e7b3609a7f6a3d07b41bb910bb2afcfa117ec87f2c17c148f611d7d7551e472edac96ef794444c0c74878092d485449a304cd34360a0ab783b26139abaf08ca874218fc9496a396ff72c4bea44ea8d137f048359dd0ed8fcc56178e8d2b40e147c6654014b9ed986db0ed91f3ee4c7398313131efda97ba0233d055e8cbeedd190239657a91ef0507f1e8988b76a7ec78c48ebfcde310fdfcd484b8d548610f0f879a4d7683bd48dc959b8b860cd821b80f48cf2a50babf4b90f1e2452114ddef0e6d89761d028b717ed5e17fd37f73fdbe27427005b07f3a93e17c754a83699cfbfb43856d6ca5623de681f1cbe9199cf598f9cfe3be5bff44721d9cf60d69eb618076060cb726e11a5d9815e267b5557cc7f1ea370ee9423a8940d51eaa5ba6bcf7bd40d30aa602b7857e1548f17730b236992ff08fd5cd4d1d111db49fd7f84f2e918ff8639af45d77c6e982a7f7d2122c24f595f30480c817908cb65881487c0a58c10d8c89c65fbcc50674d9fa37e0d2206ef4c0a313d57c52fe8a25fa7c7f500fe7257c3be4238df89d139cbe218b79d38378d632a9dbaaaeefe01e2380a7944716f274dfe64c01323956b54585f36d1282df4110ebe5a78a5bd5581b465c0d532e04cfab9fbbe325a04431500fe8f7da4eee2521c9e8734ff44dbf75661ff1cf3c7f81c5d2ada9014036d8dbc009b5f166ccd1fc9c81f94d4ff3907bee73e9b621dc351fe329a69940ce745107f32cc92186c526e30c79e1f1f595625922ac9246480bceb667e93e7c9164df62ab87dbefef9c641811ef915f0b8fc42e9b7f551107697eba4b33343f70f13f68f5bd17756b4dd9e99c7dfba8d93b6adc1ab3ca011a0c92325e8ea0b8706e25bd571641b77b079997eb6abf7c8773ee4cfe798087d2e72e6eef4f24669b856bec48c75397b47d0c56048e4d4136f85f90560049df7a47025bc2d076b1bf659b2308d7f9ff39535f5ba5c4dfba2c664f1fd18f68b08421e6bc09b7ed95176b2722532d924e8db6df2e73c20f29fb53ea2c4ac70d94675ecf37b629408ff6a880318be6ad045f4420d6902f5566620ed9e685a01a3f76c26de9a5d9dc7e27fb165009e9e394fb31ea759b651917e90a36d8bf014dbba30c9d50132bc8806ac5c368dd8a8a30a8af789fd32759cf097489df2962877a2422758f1f4bcc0a7b0a1de97046f20dada0bda0471e0b4c69ba1a71d6b4f04f0d95b1a9bfbc2f0894850d0dcb79db5ddb25567c54243728e9f7f107010652ef5b7274cf817c764bbc2f5d84d9300ec3953c1afcd89d0179cb1e3a09b865f3dbd2af6097fc80bb9231326ca859a51570adfdbb6bf38ca6c24e2b2d1ad50b26376cd182a152a118ea654b8f67d8c6b029b94d225fdf42df55f25f1b543aea6ea32ae1ddc25129701efc20d4d7bd166f8a52ffa52b4a1ff8fda7964acd70be7d6ba6fe06e2465bc1c7a202393f357dbc6ad7b754fab37c861a7c74c13a5e66aea5ab2c541b9edc30aabcc37455fa49c7d897acd153395df56cb4e8cae114b7cfdb941563c0c4500d31d979546723b956ab88bf907cf8b7e6409e8e3081fa52f23dab23a2f469c5900af5ec874126b7cc72f424d01daa71a8dad5d66de80f286e479c4c5da92eedcbc09f3eeb9f99ab66481192c875d30c75158c23fad81b714ee3adccb5b065bd673655b1fc80f06075b0f41a3e3da1a0e99d6914affc26d1ef6a1d54febea74b71debc2f034030615b4e8ac322d25cfe839cdff1054abb4082bc70d97d388d549e82c323c37ef6162bc930ca2205f868713febec705fb225c9d8d0c49efe9a49f215e5240f1e2e21442f98a7f1e3818e42728a937489cd2843de9007ea6f8d897c6178bbdd6448daeed9d164bd878089dbd02653000c3a089d5051ed7485267a43eade7dfde3479db764537622c85fa09b5a81e8eb61ec84c82d784a8d7ef6c31919d71ce2fb6a84eaf8d952338ae1078abf308f36fb333597a92824f062e955e83196b36580ac880ca61c9483859f449ba885672e58f7d5ab1f1d0e09266d394fe2c7d71698a9a7d75390385d363653da817a132e48c9e803196cd8480ecd73128fc0cb2402bf6aa350937a88e31e160c3df680e172a299d872280576e522f537ada7fa64ddfae25865379499264f262e1ee7b68d339878c36bc25007d45137c132b1f98deb66a691754c5495d2bd2f5af2813eac1d92cbb2ad4457f7ba00f27c3c40bf99ab7e873d9d6e7e6b95f537ce96a946c0c4aa1548a8475bc25e2c80653ec08e5cdec97878b87d20a22a2edd8a7da5e7c3b771160d5fe51daaabead4dd41138af009ca6db304458f11f67e767146eff6b6419adbe7768df5878481e5f7eddd7bad38079205de338ee592ef6eb3a70c2dfbe41d7635449df12f57f9173bff1ee3491d8057bb492754235dcf2a70fc76277c9cfddd7d6f05d89b139712d480466d0319c98d90567f559eb446f8ea19141d04c06a04a8550898f40cba312461797cfa48b0455951c4462fbbaf08f69ca68b05efe920b115807c243f6d2392f94764eb378d1fe17f7ff48f369e5e20e2529146f1c2f43db96b166bbdf53121505dfc32942932f1feeb8149a25863347ba4f849eed6b925c9d0a68830d9fd89230be8a07ee81be41d113d6decce80612176cd51bc8420e39b299cb1b7bece855edcbbc29cf9643c4aec3b05f3949c96ee93e586bb90e8201ece67ef739a1166d4cd86acb958ef38f2f95185d4e86eb7c046458058548974e502e6f5a4e482aeefa95845c3e1f15ee7f79e1788b8923104687fe7536189173ef8dac7cbe7a9250f6e133bb431cb05f6e2c4b6fd4417e50f92b033d3ac427c2820239cd51d97c633da1dafc20a614e0f95c4b83146132c7aaf5a544315e0f7ebf09d9e42c47abb06ec036b15744f0819998c1b9c8c6ebbe20ebbd01e6608149ed3e47bb3975c0832b38f86b5782fb7441f074ecb297557c8de115afec27c11ea4135b77511b600dd64043298082725dc20a6bfb5432f0a05b09d3393c492b5f25243c3b12e2b5702e9806b4243dd025280264480a8c9b10c7a82bf6fded8f7fbc5307e82f06e21b58fb0df6b1b825375018daf7215153d41f5390d378798a95c50f1ab788670d09d581c612436a14e6b74e6b3d99ecd655727e9b6dc6dbdb3b6fe06c744d8cbd76a87fba52b8fd9953a1761d698b0fba4080ee1c2d10c682fd1814d50b46397502b23aa7f249f28bfa6df21e40d7105feba49b0d96ddd552a8fd00dda314f1921a48c1062735117f868587a6426af549b2a0eb8f0c575d66f682ea5f1bd27b06f3a859e8421b47f45b30580069430d5e560f81001f43194f473b0e4d2d25654b1f01dbef93a0a83d4813452181e6cc210367e9b18e70e6d241bba83d701b659ccb830ca1cef9babb127ef880be81ae31e81e0a3e075df188b36273edc91030c6600d9cc522c809ef50ac015d2905c88f40f7a0d0063ac7e0633c05a9e0302c788fab62080c7052854a57be4ff997c7fc8f7dac26c2f81cac92aca59090cbead8d1e2843cf10d50793d3c041f22f05094745bc6f493f67fe09691c0672494b33ba2bfe8ec9550b1b209fa5c0f2d5d586f6404ab03584bf9b0e8fc91fce803f3595d77f8dc4ea6802fe4b473a7f042c3ba79eb1bbb513ab211c639e20080be2d355a49f8f25cc4cabdc672a1aff8cb65a3a120ba0fb0ea4a83530fe3c1a2121cd4b2d8e15b01ee85db3476cfeafb045e19d7f193e2218f7d16a8a4f27d22e8e1a40bff8c88dc9afdbe4c36c05d514da38679a2f13620116222284df621ed3d288a1fa36badc7c49e3b26f0b95b923d32a5b4e193780c9c8a38cd1b4c2dd1884c18197f69b5fc84a313bd9c70f47b061ef8230ff0cb6c1a2cf67bbc8f63f57946c708b8714b220099a0586e1d857006c1d3457d45730ebc13a9a20ee5087982e8f546e898ff0029bc51f82aa08b280b030fde41f301ab08ab4b6a62cab8a2c947633e29dde2cbc2bf959e887ad870dbd936a08eb40144efa0e0e69096774368fd5d40ca63585e5e79b0161018cb2c4f82ce956ca5223df15f1c986930fe94edbf8c1ad601dc4349d72929efd259915419ffba977aff67275e1385f3e9edfa44ed0e545984c1be7a37f93f03dea0893a62c4f35ff81e72c49d7dac34c56f799bbe6eb25bda2af4a8ccf819a37b8cf8e2cb80bcfae31fa8825b52bb3b2dceee28e97f57d39a3f221f7acd0f84b6a6ef2396451c09a7df007ffc6e057304867d7913d393f386dcd0457635ea50e384679b5e09fb7a4d9cd41e481b08060402814020302ff405cc190d23101acb9671b5088a01635547e460ae33c06f9f6101b7fa58d272c82fd2b40fc25d11dd63fa6ac383201008442e5ec53762e21b1049140f781acf87086cf8c4deff347cf8009d8765c3418b03418b0be93193b1946f690cd3ee199f71417bf826aa41d2294ef6a22af8967bc0b1e24f6e901b880a0f304d4c1e9f9d7921abeacb6119c37f45a27abf9af1b927c4356b982ec1a4b2ec13da7062eb403dfd13eec5dc5e438a963b274134cd17beaa3645cfc760cfec9c453f2a7744fb1ec27ff523447e1e5a5c4e64f161ac5e1ba4eef9bd9faf49015d122fb1c2444dbfd4bdbe06fe1d014285d7448befc6c5e8969e0d0922ac20bd38297f3edb68c367fd9f140afcc3418011346890581bde1d8a00e63fc1486c49d79c65637a7a44de5cb793cd702848849f0951735f38be0cabab00ee5c56fa39721ea193bea26276ff26c8ee505aa5522ddd275a1694718d26778a7b60fd40d017584f70726938ac0b3feabb1e54b00800d5e0c24a2dffdc6bc3e37e233cf24e236da2fe5a5e5c95028902b70e3c2572c063317f6b0991fe08321e128cf4a704030b82fc0141da40904f083f0e894b190ffa7beef1100f4d0a727ff6affd749c16bf11fbf016889cd3875edb9c0e4a9b4e6e2811abf93a51f4a9e79274e845e780117f0cdaf4f93e3db2b47e86363e85f8be08d662341e719026caf3cae05c007da3c77a684141cb1283db63457cd0e91481b57019cc5645ac5c14ebf63744635a001ec4ded2cdc6d2c5cec7c1d6cacbdddfcd3ec035c0cd1144801bda8df70827b027e37d0f49554c58e5e92b4b93cf5f080857099fcb74343b8f492b476b717bb906de9944922015fce5f8467f31f24ec3153233d11e07642ac16ed4711f2395ea5d88e7fd1b8a565d8425a62698a0ef8f903ac19240c7cb2fef81bca2cc77c34b8a6f30967911f4d9f299785afd0ccbd761fa831adc6ee064c29e02f46485ff112c03e4ff17f83bf6160fb1e945684ef2dad0731f3eef39ffac12b4b2d8b54968b958ec0197a8e74f90a01a9c35d27bc7bb315b993e50791359012c4bca7540b32d706c46cffef31b005f866dc2a8eb8af12561c504b51a607068c044ecc30bd30ca5f26ace5248a9d159d52a1693289ed8604725a9d7c68363cbb146a0364d7c726f8582af7b7c98525777e010a8db465ee571dc78206314e84ab72af5b90c566dede7e59f9d90f9a50596424b59fa63c3dd6ff45e40b1c1916e86f94fd2116b6a31f982c137fb57298fc51970790e62bcd705a83445ff962227e8caf07b736a6cd3d2f829b1790b36d22548bc578b87330eebca4cb0213712d31cb8d9d128729b68e7e84dde4516f041677807a82a4b7f11bc6092ea492bdea435771a3ee3437b8930a15e9263f52b60a2b7eff1481f124f6092aea1a40184fb6cb923717969495d6ba9d8a54d18f527e07b53dd184ecb9d430935b4b4d585ed4fab2aa6690c518d4644f05a2fe563112f4311c0e02d0947bcc370cf333790476437e414fc2396e2b1466e4e7715d3916ad861163042be8fbef567c7fa8c4770303d5437771ba9ba8c1958c39d2ae9897d5c9ae3d8831de78286789b3a64500318a0afce084cb329cd14ee3724ae119376d2fd6e06cf4cb68029c989d8ba9763420ff8209189dc469678c8fc6890fac75d372e928333c8852029178048b4a8524421862b57a090e7ef4d97a5f890769e7380a1f23ab7c97ca7da7391f3df3f2fec6b4cd6a3ecd7cb172d891a134a4fd96a540d92d8f57afffa7b11411e11ebfb3f7a5092996305f793d80b878d3d80eb8d1cab7d16811fa68cfefc402cd26ebc4e945074ce99b2bfb81285a3c2ba9f8f81e6c983a0993360a89a262129187de8448fe881d20c3b94d4e8418b040228231bf41121324a051bc208a2e0e9289acd67633a6b1b38c1632d5aca62c3275b0aca68fb23c12485cacd1b1a22caffd9b726fe6a1b0c678d1cc1f6ab09eeefcda0c38fac69b4753435fd5b1c82475f7dd3fa5d1949835d92b4db04a6bd2f58a80edd1209150ef28b04b480c5b40b066146f82b729df6cb05d4f1498f8b12b7d6b16b660e37237e58a68c1ff8187564f74b5384277e448e622ca8122acfe4dc97a4e3909b7c7abd84c14d8784485d40e9919f25439b19377691f91429b3fa705074bec58f2dba6570c2e176208ab21d8cec90aafe03d7df5a5c5da31cbe539771d620a447b8255b7b5b4d942d8e0fdcdc0408ce194f8a3a9e693d60a8d496c92448fc4d069f6a0ba34fec000bd67fba0dc479e6bdab9a9336b4f2b0eb06102c041d44d49e0fcb8d157f1baedf7bc76303eb1531311401a8c3edc09efd578cf8d4c89ec63322e9f1ec7cab2c20b37f4d12a147018b43c70918d3c6a0595bc1dfb704ca7f446547a9fe339ec3d6e48bb8c528fd3598e3c419c84f074917fa82a4198dde8e994ed09e18f018e64abb7b0d453ce932cac949b038987846c43a31345e24d0789090892ee80c17ede454ff39f3bab4c8349608158f8df37404acef09c82d460ac23ab0e083f3164706047b62fceda3fdac091c67016bf2aa4d9eaaad931ecd1427e138183c080e7dbc5f73d9fa97bd9944a32216bb0e9c46e10ec6a46065ef096061f096c428e86a8390a23a7d30245c0984a51afaf6d6455776e5df1fb39f3323801def35cef4681a1675ddb079f8c428e7379b1cadc633f9cbcdba06629387b643c01ab17701ec6e5a493e5010de0fb2a8b53d6cf8cc14275220bb359785a6ed8a0b28d72051914ac57760312f8c1c1dd1eca817c70e5c3719a074e101daff7f65b902d5cfd4395de11aaabe81912a512fccef312ec519a4194229b99dba744ea77cf1115248a03d098ef0050e8fa2070e0bf20287068e46244cebb9e806d2350884f7c4c000495cba9760fcccfdab8a8824986512127f40ff3b7e5100e6b702a9534b10fe09d7383dbb16b7f9aa0ce2a05a2271f33c45e84d458030202510ce87ac4e6ff1bd30401818de14f884d552dc88f6ee175898e7a21c5ce612f45d89a13cdf707d24cd939c01e51c318d676b60ef4eab81f868aac871a4d9e11f7f6a6d2e73d5adf558191ec3a391ea2375db9f402b785207af2478550204fb30c13c923bf823d629c687a71797a1c64bea9e52a16431f77b3038434fad8c64c614485393a33db4f0c92b8ecf0639f36c7c54abd193bbb1e65ea7bf5f77d7fceb03da0f811f9463b85d69cbba2cd3f9588ac74cb042fd3f1182900edeee9f523bf09578b2b7fe0dd8e55dfd9e6b1cf2fc92d3f0a897e6d53cc1f5684e462ccc221af54076e2e9dc3e848e6e1a33df342c6940dced1ba4de5d980f533c2440dcc69d015cfef7a19eb7728c74deb578ce30e55cb5ed62aca2b94472a5315a0f0135c96bec0391b503199bf80e9aff63497febef5ce055eb777e7476f8b4b344ca751f3374666e125a043f1fa1bbc73e73047677b547438b9eb78eeccb7ee70357e634e57869eac20f6a20c6944fc254fc4e0d2906937b359e493ab3bfa3ba8bd808719a69cb35dc20a79d97e6f695c41db84bc13c92eefa9ffb9b941e8c3dc7009be4d3dd5a9c3c5796021e5790124b8fd92ea1caca7e4ee2421bbac4b792c7c22387f06486ad149a812f015d14230c08b48d40c765f203fa44ab912c73b2259eea58be3755c5c2046f626bcabfda8bfc03b61aa4465201bf0abd6aa2737cb816f9f30d71340b51b4d6dffe16ad228d3ccdb38692092bb5a8048747f2571764a2aeefa662a58372904aa35460abd4f583b49d9250ec39a3abbd7e3cc48343d2757feab5f480a18d1c7fbbf5682573d5fefd1a9d059b83e7a765c7d799835361bfcc8cf593d1b79f0e3bb7265183d6c5fec84db9e6d8ffa35e483a906471080c9086ffce73c33d9afe20b659d89f3feb1df4e840de5f68a7c99f6587097e705b0674c2db838d0795a51ee1991d1e4679fc938c5de8a0e31ff67d4247b5d99a9f1e7b202e9d5fdb24507542feb11f923f970a2d6fa59e723028bc66bac21199ba7984566e172c6745f0b3a91b001176dad715217ac5a3bbbb5fc42f59bd5fb84f39481b4455a6ce1888b419c13fc9a5c2e7d058743c77aae1caadb71d8a005843066904f055e9fb38d2f48a9bf8d27546d8fff18e89be315c657dd088270d00320efb220f04ab26035e17d897f2fa29c74534c174db792abc2562db8dd93c4cc86abca80e72e60c50c81508396f9b8a3f41e145a373ac6e2d8643b2ddbb761087886e19db7f02bd417430d8e87623d940af191f2fb7315b69ee392e4a073fc50d2975fdf3afb1a87d9b39897cfba1b5241db1667b6a57764b3355950e40831b06a9af4a502ed195d884c28aeb66a49da6dc7e915e26c934319259d467f4c0b20639beb53c9781ddfdbed931feb15ba88b1b53b4f845b3fd770e135db8029e497a23b8cfbe64faff62cbf0b0769fb778c56c331705f508815c6362550c4500ec24b7f50f9f49e796f358c02b01b64e9187e6ca162d381604e6e398aee24477807b10ca4e8cf8435c195f68d06367319edfe7ee8d4545a1d9d1a629e9bf260786e45b77804a72f9cf05cae139706bed9fe0f2b7bc6ccfee3c3e986af6c277895f6f91055006f5db00faeabc9255f90ade4fffdfde291d9f2ca842be6230ee677eab503df1ca6fd3eec76248f3dcd990aae0fb458b38c89e3976abe8ac881ef09856df60feb4d341ff4ad5f1bbc18b63506df160c60abf3266b7838b2b396881751b21d96af836244fbed06df8f49070b9bfd2a78b674aae3d5394c5fc5606872f5047ad06d3db24c8594ab1f488e0bf953ffec2a2e2aa180203d604019757c28285138323776b1d481cb97419bbde595ff0c81e944c1cfe27ea011ca35a3291a90f037f7f6322e426157bfe93127c9f9a7835b20c5ad1b772832c087ba59fae5b28a834911882c127ef06c6a67a60f74ba5067c7190bed682f7d093219dbedc622611303f529dbe85c2c132466bc37e064834bdfacc12f1cd72c6a2a8ec193bdc704269946d5c0f44c34c387f0690936067455e37f237fda508ac62bb80a7d0b641490486a8c069e80a0bc8f7ff001afb0fb26574d77d7e633829e83658ecdf86dbd26d9d15cfc7a29a9189871dd8658852f52cc5fe218dc202c5512a512b2566008f41e7befc0612368ee2f8dad3574704cc345425c1ab78df0dd96ec60dd351b73cc269b7e1dad8110bb1c0fbcca261572fe74f9f1dc60966be340c95d61add024859093c546fe71b16761440d6c2fc5f8b2148ead0395f52df537d65d8599602e11b9fa960ec50e139029c3304acce63d91284793e14ca2f185f31c561ea0ee7b23752565fa55138d2661734dab729c567a554969cff9900c26868f1f0dbc2e1fb2f94398df39b474dfe6b84c887a1420bf5717d9f3f51126cd09f51930db90a6b0c3c4262c42f3ec1683cecbf3976a25948440f048196b287a32feb2ff1aa1e7360558424b637d6a53137960924cb3d69117683e6953a7158c9b0c32680d2f6b0b769f69a92bda8b047efd04fe47636c3cf1138d805f76bf0677d485823050e2ed3ae2b5a2f4bca57293fb55d01ebda3b9f467af93f0ada743a00f991a05f4bf9581414d4161bfe0c64f9a70a314b7e8d741df5d55f410cf4b65f041caf3109c354efea02adc5b9b34d06dcd716ba2601116816a3416d816b2894b857bc866dc6822fe2db53234088f229edcfe323e74ffe436000a5b5309810992a4b8ea7f2f6f8666548507cbf5516e97c9d7d2043534ed2640810fef8440cb7ad96a691798a4edfd6c92822963280cb3d6e3be9e4da6e909e6a07028158092d2aca5035cf949b779c97292967ffd6f35de13b18b76513396137adce10dffd5a3fbe36ecbce981d2e81cdf13a31b8cb8a6f54418d8207a6cd606f71f37dbb7ae8be0e0f0c739f19572bf114073cb0c9d8a75b7ae1eb1b9a02b768198bfae73d23481247100aa7458041889104616ea9301bf71cb06728b8a0bb169156f51fb0d81f19e32e802edae2c579a11116a5f0b3529d67881210fef05dfc904d9855063680829fd511bbeaca7aab592487c47a9d3ee8c8f254793811e328377518fda49b762bc519ba21ec770128f88264bcc842dfb2e3ecb49e657664750380a26828adbc1fb893a3f1a5599047d523de9d238e2c9df927a20f837854a5695579f7715af8387e805d6aa3b644e44063104feeb7faaee5d511d83a242befa729dfd878fab4ad1e7e2c92fbd59b51770652471ddbd7a05c440a862a078dd5ae2e37a9485aca3ed5f15c1ee692f569cb20b0bf31eb28fe345f91e700e08fa024e8fbac989796eed3276d5424eac4bc7e8ece067364a46211ba5b2173e916bcc339c8586d332ea2bd2a4801bc249d07e333da2680e34fc3ee115dd2b33e49811c98f22e75f58e14dd489d579601893da6071398f6bc444d062c729e26da91f0b4c8f8215bec1727a1bc3ba661316955e0beeec0b3fa058c9d93c7aa6fff58ad8ae2479c57fdbc713ef89dcf62dd370b55dd75dedaaf499528adecf1d6319c58086aa2125c1dc1af2cb0bb6ed0a729369345dcbaeb16ebe6929446632d641aeba07f2d80a59d53f8558c3c19df957fc2dd3213120d35c87901f785b41837c475cc5ab7c6cd535d5462d8fd3a415cf7892869866104ee518e964fda0570c8101865845de4fc7b09fadb349b11b70b796d7d373d32628a2ed849462aead79f51801af6a167ab9c3e377bbcd01948037799b3f92045351df94792cbc96ad87fd53bc7b9e59b6064a4ea87becce34297502e98a8a5317552bb8b1f12c5b0b5d7c0b20cb00f323f76b06c37f86cb1993131ae6800d0186ce13c3822a88288870995ec35393cfdc7df94fac9e1b46deb01be27f471dad0eb43ab17fddeae6362e273ea9c4e24bb3faedba97a07595071091ba61fab1935327dff897464d22aa314638ad1513287e42e4f903193e97cfee817c02415f2039f0ede709a60f78f96470e6d9213104aa5d9e32eed0e42f99044f5c7c28f037f739e5534d75cb39a0ef2f28355c8075d4110d9c5c6b3090fa5b48e2dc46a0a3d784f0f98e73e1f268a77694cb9449633b37733bd21b5885a8e3284d2bbc75685e59002804e7f2a3335457e8cc9add058aa6c34b8c55d4c0535868649ad5ccb127130cf6c0c866ff651b57d5b35b45d3d85f10bab67b724fa06a73433a19b192ac2189b15eff987dd3fb4651c78689f9029cf1e672dfc183542d53c35441f38e2ad6020b6f6a08b45f3eca7f990e6dc4671a886ffd3049fab2539a58e3f8bd98e661c3ff17fc90c0de92c93ea0ea6e334b1f51142d7f3b80047adf45fc79c6f7e9127688b6b976822aa8e1e11778de9c13e14255d77c0e8e2d24411e36246e3b5d14663db0767de5b9bdc8451e7abd13e209f02038fa61593170de81a3a022c32e072051c55004b07fbdf9fa31b302ab44202b92f317bea76cab2a9afc6f742ae53c49133397e61820f0c9c4bb3f025a1172a94ba64f2720273910e567ec35b2f725ede8bfcce0ea22d84ef3f3630b1a1ce1a32420908d26f1bd52ff17174ca35acebc2e984567dbeb76ec846d8cd535a6a28b383a420bb097acca455f1c00a9a96744de4e676da5ef254c7a542c1428b77e72ebdccf0c02eba37c9c58955b3db0f0b21c26d870384b238c0a5f0f2888c702308d969b7b8f2bd2d3713087c292a4594f44faef08df07cc4e38e16214a1fc92384fd3211427dd549fbdb5f2e8d9c48d98923cb2b9e5cd2479fc7f6a851df9019481479ae998837fe28e620b7fe56bdbae47e2e93d80a3363875d061a6272719c86b5369dd286dd9be5abb8ef29b2967f7f7417c38ab172bd920dd2d7ebb3aaaa51fd43d821119b32be9120bfa96a0a3141c0aad36f626f111a3f6c412e1927e2c3ea486e99ba930cae251b87b604d274e7a13b295e7e1fdb856d59fd4467de160e99db6f65e4c35dcddf177da01c03310ed1289d945b3b4f658d8a5eff0c8b7f1d8542c3fc695adf7224377e4127b600841030e70c51865d226ea72457b6846e0a3b0b07c858eef21bd6a0853c2f12682d6b5f1dc672f65948eac9d4e079120dffd01f7a7fd3c763fb7fdf65c8e7dd20de9eb6bfd55bbe32b9a0755cf1fdfbd65744af4c25c36af0cc09cead37cf439d3b216bac2b0371567bced755a072563ed215c00cffadb4f69f5849eeb82eb2cde59ec6e0ae6e36e7293fd0f634e10d7f60cf1dd48c77c077e5a545042a521cdbc68fb3031bdfe2f24e16c83a6e253080d5d76d20186fd5cefdff7dc80609dff0e9d70a8f5a2520b215f49a7b9af0179d1fac07ff2696c2e5ad85e1b4b2256acbb5f8665cee664f04dc4f43f51841ce780cd831e2f1a2638ae43d6fb35be91accdfa96a6514e2749db77da3e885a8425c4223540f8513ddd01fe8a6264bedc4c39724cf7c2dc611044691a0c03824584c2c3b10da090afbfd729c6f28222d4771767a33c899222340345e8cc68d000111f105c6028a48297a3cc2bfaa0e6a7dbe2b00dd1cbb563a7e2fb17e48b26a785cae6895095198c73366a38d8d67d4b40a8222c55786135fce694a831aa7a1a48673ff9afc9a091340fa532a9e0b709af5374e981da66088a909bf917e0f019fd5bd8dc42588606de15267af25ece7823133b4b9e52a0b1d6898c63ef8494874bbec424080402e1cbbcb6ca7dad1761a7419b7c4476435f27dc86114171d585b1ada1b5d156f481c8ab13b011bf877ff5350d2e4912fc92f8b06b66658fc7005fc5a775d006dafcad41f6407695d1cbc190c28f6a2697fa63b081311df20fc268530d3590331cf9e682d3eaf845bde32fa6bc988042f1b7b92745199a56ad4c1f1e8a5d75058d240649c4422c4094f8fddb9151ae9376bc350d830bed31262125fed8d71bd5600e81df21e1e98b8000492658ec53555cc56fa6437d5363aef1d124d81f1e898ab826c9e3ad9e76b9e097429e01af719b31a95b73100b9cd5688d45742224bf22b11d63bde3db738e2022c0c36fa24da450b8e033534f04b0e869cdfe8e6f1ada75a5629fb4974f791665729cca974b57d61d21a164f0052e7d745e24fbdfb83f6c9cfb1b5023f0dffd1ae03083323ae57445bb681f357480db391027a94a2a81b3a0ef2f8c14fd71bba4f0b3ad09f3814559b14c958e11bb00e1afab0d8696b4cc9c4f96a672510f9c9639001b5fd95785c6afd3dfcf7dea755e9ae9744e012b7f900699f16764712c32a6fa1e38cc9b17f58aa6e57497a33bfd3c2f534d3864f1e5f4e2f4475c29e5aed4b5b08806adc002e6c65780b6410750e5376d5908c353385604b477ab6a8e0a8b9337ae50b99ea7e67f3666f95bab1d6a03dc1ab435f0b9a5a9b63c02bbc60eb19ac8cfb757cd2c7de9afb882c5a22a37792ef0edc744cdb2dbb697f2b7736c9cc9d8ca6007e7e311defce4caa4f8116a1f5e5bd8f15fdf5508c77266137038dbfcd3698509e4615fff14e87774bb7a759081da75c59b8f479a508b9457a312863065c38173cdc893c2de4de32e7546f1d71411b707f52f8caa30f3231bd9d36fc6231ffb71ee1bd13b0958724a35efe48824a18da7b0449d34dc21c6832c434c33830bf813d0fc8d2347ac120e50d065f0832a8622807b95bfb73277461adfc2b3954560742a52fac534fe8efcbd30a6891212a6093c0514f54398f2d011ccdc78199d457532496a0e8fa6d368317497f2be3f56cebf2f92b93052af645a5a2c4e9cf44e14ce43277e3b67fba06356636d5908c3be46a16122d8e4b72200d03668268591754b86860902665e319ecc03c82483b2849a5d74f045939f47c8008c3cdf5a801d0e74949684fc1a70c85ff5fe1fd38c1d0ee15d3aa1cffe0f6ee837393e51d41e18cfba6a947f311f772e098abe9642df02e96afd9ec4695f65276b99ef3ea3bb2e2e4c788ba7ca9d8d908423b417c8af2473ee34de1c9fdae3bba079be622eec7523eaf7a9d894fa76883ff86d8258055014c7dc431bc671b08dff6afd8951bdf74c49cc6fcb9ca6661e044f24925b29237c2b9fcd8481bfadf3d23953deefb32b3a8f156ea05f183d680f14a4ad32a92855bd40766fc783916e049589ecda872d0ba2b5aaaad3909e95703eacfbc7d6fc44b705b985b3a65346ec4e7703295ada62c3272dbe5a35180a1a5e2e88c8ebb8a862080c9c8a9ec2b1a932dea9b44ec0350c90da987e4d84c7c80c177235cf4597901578004ca1170fa2f4f983cd7561a275c7f6cd651a29fd19a27f1013ab40183b4c8c07f0b71a7f7e448fbeb4e9bd5098c347539f4b828be3d40d8abe695753c262f851b599d54ae03d21247dfdb976bd2254264ad69ed3ffd2adbecf13d508aed21789445fe942bdd5aec3a9152798e218c0fb0ceea2fe916d913c4285f3708b49a3c1e87d3af23a46b53cfaaf19565a87bb072a6a544c077f55c4e2ddee107582d62acc94512941576ad061037d86a638ccafa1c483abbd4985e971fc523f2f44e04e7e13c6127535072ddaa0a7b523bcd688362aa50b10da6732041e04de0281d3b51ef29126c008492f9d7a927057d7d6c3a7e0aecc06ca5ed9493b4690b0123b74684d46c28dffa06ab4341742506f5df1a6066d755ba6a3c244e9a1f714ff6fd25ebd7fa1f59070b4e3890adcbd3adb25d3cfa9cf853df48c16e44544002e6a33f45b4364af4b7a4117cfdf5d23806f15c717ce3dda328d86827fa7ff94d25c11fc6c951943f7cc33fd5565e4053b00989f64921a3795ae7362be62391d5cb5e4efb7e4eede6c07e85d2dd8a9043dc847c180bb734050c8737a54794b14c420220601b9a26f2e1e699f5b93150eae35355ba5791f2720fb500be46d514494ffef782f9022b866b23c14010ccb32adf41ef30b7ff60423c6ac960a2ff0fb2f0d729e675692f531767e0f7702586f876946beab666607bf8e38277b0e09e54408cf8931ca6cc5be959df08638f7803b1b602522f638c478b69c27eb572ed6f1d46b8328add7f7d3078533eb4e6ee88b2567c7ebe1e7f2972d9bdf43126932089dd6fc1d1f0b1f95d774bfa7ce63e221da5db21df1dc5e142276a754ab97035a7ae644a48446da4b8010180513e491bf0be8684b19784df7a12a3a927853ca6e4bca85b4635301531f606282b6a81c158a9138a0e7ae39f540ddcd7dc5aa9935be4ab13dd912055b1fdeda75d69db7a7fbce9b0080b309743cc079fbf5bdb494e9125dae7f452c09b1d95447cfc7914e9e7deae1aafb1e14ffb3c5afd1df5e1007f43b38086b058feec79709ba2bfab09299db38ac48735d695828d8a2b3d7f8c0005e9f8b68e79a2bb8407de1c8d2fcdd2223efc604538bfb249fec26ac8d506992f36722f0f0ba10618d85379ee07e6c28f1ac0b022b7efdbff9cf8ac9de3e0ffd37ebff2669169885fd7c330820f5f7d08c0530c0bf92399ec9856ffcbfe679270c05e1c5b31279312645fc8bae4c5acce8262909e091f34c046b4356fe722705edbb8015cbcda88bb4568958b4c189fcd3fe4df627b99aca3680a3e728c8d626386d796209490b7454487f6703e1edc5944178832130737dbbe136427fe7e12d7c60044355f258e6b79372fd1acd13d02d4935c444964b7185388805089d9808f88e14aa2fd43c43dbce11d00ed1c99e08fb57b7ebd5e0d5d2bffde805ac8bc16cbe8415833830979ecada038d38076b5829c24c6416569464e823887bc0443c2857310fd7f8753739cf02cdd4648da85e46a700b9afbd0c286ed972318dedf88fff7bf5dad02008681b34957fd7f3de22689fce2822e7df8d6b56c228de596c6a4b6e4edf2778d760e16ee2071889be2ba4a63000cf9f267998348a31a9ca6c586d03880e98e26eb19842b6addcc8a9a39d5757f0c7cbfdbf7e096b37af529bbee18c467f1dfb3e901e6b24796045b3eb1d5df0f6cea60330bd235090eddd9749e6d165c609750b20d95ef8347dff64c78780f3a77f1c9bbe07aa0e82018140201008ec0785bc803da3ca5ba2e0772262106e9622a271543873f84e5ddad3951ed18eeea91e1c40e6b51e69240176a56dfb6d7faf3a95f6f595491f88ba32c499f4d6df8123334b8b9ccaa376d35b4860b53291b396c76ce7b31115e41a10a612162f9e55f13e5d13d5a2ebd98333687dc230e8b1f2af360aa59a6e6dfa1e4cb2a52d966765a9210e400f36127121332adfb358f0f00972d0de92a60994b878215c635fe4b42f0b7a00d4fb4e8df2b4d06b9f09230c593fa45c605db2c88aadba636e57506f2d036054c81965b682f0dce93256c1738ea1e7f5aed27148f899d3139e779809e19fc5a008cef1226803afed0e8aab031551a95d21810165b2df4a94950eef1f3f160df827b18ecbffab232ba9fca8e0e87343dfe7341372754a7eccb429f2df8257762e309c8b8d0927f24f84252203b864c13600d3c3d59c3d214d3fb736f30edbb063b51a5271846c91d1d30155c74a72ed0f571048cd8222a19a30a807f036ab0a8d59b6a54b06bb9131cdd7817adfc96c3a72a9716a843c005826775df8e5d0fab7f8ead095dde10336aed8b7bdaa5dfba4a490ce1ea123574f20fcceeaf5ddb48208754c90db8b7c885d7ad4dbedcbafdf18d6b85b0582f4aa353d68362018100804028140b950c8736654790b634c2ee40514035cf781a291dbae72083c905ee9450db82256537c372c6aec223db5aa23ca1dd142104120d0521de021303070dabafde917cdcbd3d15a47b184e0d3c6b7d96b42e4ffcd46b86d87193bc2fe0066f5e0d5f77177c2fba7bbbd3f84ab81857efe75d235efaec2b48b8d259391a1e24f6f5d02db8d589749db1c72307ca31b6af97f2ccd213ffa1308bf606b2efa60638e21a5240c1c3d74aa210ed04e80d1278144ceed29925f3c92128b182a25a3311efdfbf4f651ee90e17279017073ff6e4f7ef426bc9988de7172fea3ccb92d5ffb3361da4641992a4bfb5138998e2e47db774d4231ad8b66a05822756d265034627c44ce9ee30eeddf758aaade15888829971f29afa8e8f9dd4650972c31bc2a5ca46e399fdf41e694fc108cd81bc4f069dbf806bafa26b898271cf9448d6f1955915e8c0d17bf5291ab00564575dc5301dbedb2dfd6b440610c4ce7ca64096d25585a796d826aaaeaf90c5cecdf067001b2e5094e5ba15842d2035d885f00590611b735a10cf63b86cbcb3b135a2480ec19866a3f73538c637f5002563e2f4ee9bf01df3f01f51a443f0ea0dc05ff877d4aa3dd6ba4c1491f70c30f205e2f59290221ba73f49a0ae8b22701b8f72f267effc90d759dde69fea211c9ffc1c262d4a8c46eb82f0d0ea452a8d1cf9ddf36800790d193701a55c91292fee90d10c7a3457403e35089a3159e0047a8197319371d618cd1b6a2f652438b4563a6a10b6cfdec9d03639696f427f033f1c63d6a5e763c18439f8e60e3a4bd9b068df4ae2001741255744f30a273b85a0d7d871dd9d5a9ac441a1097cffdbb0d60cbb27668f3fe2379eefe517e1d25cd7a2f4d7914345e965a28e16c001f20b3e1e1344b9e25242dd4bf7797415405fd288303f2e0f23de38416d50d2e83a1dac3e661d4bd0aa4e47de095f8cf5b4178ebe8788bacd868b75c4dfd4d494768290c4bef12571617342031daa26a141a32b88f44a02b8305f0d8c65273337fdb70e6ebe1f4de66a92d6727058b0a36e2ded0772b0affa54fbbe68c1547d4b78882f39093e482d382621f123e7923aacad72cf1eae56f954204f58410964e8749d988d07566cd4adca04e16338e8766429579543bc33240ccfa8ff0a6ad2ab544339a686164e0375218c727a30a9deb0d18b5f0f1d916a4319bda00014076b6c369c73b4b48da67804508b6a6e8e14b734b9d3421bdc007eb2d3c05e2debabb7138394e83adf55567c260ad60e8f4926fc592c88ec5fe8c1e8a245e63d1e571196760e8dba42e36838d08dc8d306018fd9e6c3a4a97d1579150ed7c64fb6251e8f97618090494aa7f96a777b11f60a2afb1e52cab19bfe7ec8e8feed1c2e56304f109ca89c3060801b27a124eab2a5942d23e43743808de67e61f6b3b3f1314ad0ebf931d0802e3b58e4471d286f7bd318297a0a16b3ccdaf5b12e52523fbc9ae87bad2693ca2a86a82ee5792a5f2def5a0a358394ccb2f5c729234b041b994e46f930ae2c8135810963e05acce2f2dd7c6ff3ef646ceeef3f37c4a783ffdab4d7978c3cea548e571936b395f66e5bab1f5eee1364004907946719a7fd412921e1aa50b96c4a11c2b85d7e1fad2c361ed79b90b4327d9dde397d7f0f9262e4c7c7275192925edd36510e44f743d612ce0f92ee43134465b09364cea2be8cec94582d848dc0f617e4456820074db4aefef26342655cd444dcf5103cd3a701762b4136a23aaa7997fdc85a971900bc1c983604c237627957db4a8e0722717c1d14989e76008efd8e2330b1c648884245e43deb5a81edea727a2f4516c3d0ebb44572c42c699c9cf761d8cfc6d00aad56910e568f2ef44cd2e3cd6fb69e17a5ebe6d6f200ee9b15a5eb93b895450cbc0779560d41790cb1df3d5113f108645acb745a448d6d5ff63e9312390aee6345ae0c50620c67f05b9f941b0278272cd6f1714df1a8f3c9da4dcee45db423e0719b1fdf0570fea83e17034e8674ff95f5b68d6db174bb2a9c2102fcf4b372c06733cdc3f420f3d638a6c99a3454af101622d51a7987f7ee6ada3faaca3bf12647e950f7e9afe0d9387ff2cd3fc3f15d710b9f02657bcc0eb0f4b9db647fe99bb02e4df9cc6c313fd574c05817ae04ecd928f6ec17c144ef9e480e361e965e9ed6fe9f1df5a830339747a1277183c32d6908c83740e33b28ad875eeef9213a20b53de04faef44854afaa8cd920f918c828eb5cc3e62fcf19325f3259b8f1f263512d1b5bc2e247847918ad115011ad18fcc86149bfd1de0d152368b980adbd5cd99eb05ba365c105b196e9202332c1ea3365bf74db04302f1748f4fa515125699455d8005b17ad60889b59b4a502d2b507dea824110f82dbec5e2ff958165176a6b321fde41540a1aee1514e21996446f451d1303446e9532d7ffade4be00cae15d7b21a839111b358bfd0c84f471875b7f535b3c0beb702ec9298e38c707c13d5fd9000940b6b7c469db4b4b48fa679c3eea59c27d15543c569ba394298a41ac131e63a4affe57953c5913217e1610c6ae80a1b244f83d49cb5d5512cbca3ec18327fcf807eb4408c9502cb0fed74f055bbde11bce7f667e28838a23f63ccdd4d8eb7a92a6ca783c02e2ed2210d49c316f6e2e7fba553fdab6dbde409a6504750a399d739c06712467986a65d00648615a539680f843d0f2e1bb4961fd16af92d2efc3b244b9586a02f027ede709a6d09575460253ff15b74b91c4ec0c5b22398df6e2ec6f7804359383f73c0a5c06b32485732bdf07f6ce965c7e124af4c58a3f491a3e1571eccaaacf998522261cd99ab501ee8936f34d35d50d65a5838c574724e99453a52fcb1c3d89ad346c84821515a83d10eea61028af300d176c9aa19a030f24138e525d2ad1c6c05629a5ac3c641d64ae941c851ea6a7e8732922f8328a6df82416e28086dbb33ae70eaffd38117ca38f8b7e63dd110fe5819cb5c97498255d2234ff73803d2ade910fa19ba9736391228417f9155e08d7803600af0935eca6a54329d80b01dd6eaf00e7d90fb26ce71158b472f21beef032e592ec667b8e1fbb2f245489568a7313044eeaac9c062dc0541e236298ff88c5f92f52b025c2cc33f9bded8dd190649b37caee3d091d1045aa0be8fa5a0c34a0df0e4529ff2b425df56d3eb5edfb3750157df3228c55d53ba713e2d892bb290eed2f78165aa1bdc4b05adf9e6f834592fadda1edb66b3aef02b6ef3589d2a923249f54b72c88cc40ef183040eb301fb4bdf3299de4d11778e650f84cbe3531a0183fcfd93958881ff45fa107c20e820181402010681866446e23606a4e0bd32200e76d891661661e74222cb1ddaa4d9eb985435017263dcb4b3f7d8e42523634a96416d09f4ccaf20dc6c1dea104e503ebbcc92ede1df78f2a9b41f27bad164ff53bdaa5321a68eae845df274b185b00f6fe4ca76fc473ee82d593f063f79c4d8192f33530b9c3a91af13322d70372dde0eb5f5f480e2771be2ecf42dba761114db5adca6f9ea8f40037dae9574774f9f86fe4f1aff0025918572673ad102258c0b5359d8fbca4d1f583b0293f24e0aa2fd1361b5b799a17b3bce1db54902388a907a2a54971a0a9ebfcc83b346cdb89b870611327a15bec19f2dbe3a76b8df04102dae7a93abc1f436343531e9d2ff28f3e684a2ae2c92ae86bd8e6667a58dfb15fefe75e615e074aa3ae947b40afb793f87c3d6e71bf42ad9c25e6c682bee3a37f25e6b3caefbd0b4dab0f4f1e71685ea11ab9d10c548b2cd3133933c5f44c8fe83e89de08b8002d6a6ed9fe5f7bbff037997db0e5e33fe8ebec2cc81a31b05ec4fb5c8c3b293dd0f97ed4756e52e93c4e114018f6173843f18c1922d743f2f51ee3f5741ae023789dcc6c80b604a1350c715dfcec49d7884db9f5a5cbed1d0e5ba8815f7c0c88a9bdd07bae7c022fe8b33b47571122ecfaef6f149e616f8805ec393f497f461112576c952a33cace8dd95633034c12c6460acc0fab27b94643013436d986cb2471b616e725784edd4f50c9b0e73fea9e122197945879461765aeb30bb15aab7b982d5656278b855860e61d892bbc048ba45ee7a2c8e68e6e8a8d4f9c482d48b8025e42bbfe58987f021040ccc4fe5eeaefc3c6fcc533b2d924a8dbc12b924de84657ed24eeece98b2d2278f344e7c4e40ad6ef87f796117d7aaba1716c45cdcc29e61642f4ce89f0104d4d3df635a5c3020be6c1b0959700ed978fc302573fb1f048305f1423f877f493be032e9367dbd596d7b6829ad379389120b91000951bbb6c62ab4d17349c5a7a0ef02b0bef65a1a8d909dea38255fc04b323b9dd9d02eac0bc3028b20c7299f59633eb0ef2c7c75ea53c04066014212e02f25f5dbfc1752989b9423df4cde2046bfb9c9b252ef2bd4c59aa5d0177ee27bfb87fadcb2d6a6cd979ccb5d81a94553c290861aca8207d55a90ac56f3db0c520181068c99b6a42a2d130c2dfbde520a46c3efee1d3b212a15a4dc683dd7d8f43d980f643fde160d947473adf7333a8860840f800e5e091f33f2acb358fea8bd86ac701d1b57b4fde8e3e8fdadfb958de3f85801c7458ac8afb8225189ee68283768196a2311700f3f127832d356087672af6b1983fe03ab8aa7234ccd72c04ccdb93180b326015282d972f1d0c56c5a4d868a9565f2ee2df3572f44b5d8a8fdbfdf4efc277dfed46699df694079f0a1729611d9fc8dfb449d5bb7bcf34f81ef377753607b4c8cbb2a3f95558f5e4b60c6f11c0d6ff0ff0e795c22fec28867c7d903970123431c0472095f3212821c940a862ea4e331800afe90602d30d1cbdd5f9002f30f673ec079e292914a41efc3f7cb76a64b92f16cce096e924bbbfbf8f13ef633102708fc33a635317b72ca85f8545869db56ed0fa5b28e2dc86ff2457fe5ffe4cda13cf910b6c2fd3cc225ff4da1aff7c6b45000cfffb6d7d7398e03223401998448a5b1ef0772fd5256ec84a097114ea7aa8b8e8dce6ccc25b3c27cc82e8ce7b64e5f3ed857305e4bafaf1e0b7112a6d6d0e6d9dd87fad9ff270910b30216b72bb165e8e0a2b11dd31e31b3320304826b92862c8237fcae7682dd45c14de58b2e1d3ae80a10153338213aa7e30c6c521cf92158a7b9b30a5f81ceb8ff3f88244406614895da6ff8f674c8a7f43f5cb85d417d6a5a57fe32091137381ab5d7dfe76ae7b15385983f03941b84dc6f807d81e43d4a03d2e67b1958888f160669b2af8eb0cfe018141d358855499816c2662d894d7256a075a66d0405aa31ae924b6d85e2632f21220fa7d5d2e2d2ab59d1a74db26addb5016a1deec00c6e8b3e96956b545633223ec817dbd44cf048bee69371d3962ce1c94dbedaa172f1c9930a8df667f68c929bd43cbf07e1163bf5b04b67352583f9d91fb2dd93670b5c81b53a8b7fef472d119ae4360a0211d03352a9bde7ca212b91fbfb46c8657f6cb9e21e3113e7a7e868fb31c0d3ba0bcbbb0a4e7abaab0f987eb15ecb3e39aa29a9a264c9aa110d76ce84b75a9138d55209ad017886a4f3061611df45875b32d27dc58821181539d78ea8a83235b1f1a5d9ff43fdba771c9bac014cdca5662900060454e40279ef833bf2df096db3ceb34801744c895a5114f3ce50f85802459d8dc07e7119402c32991dae6e217597979fd332b5e8a257b83743534a8191b2d44a42b90f85e2b685dda74c27224e36e0a2a9509e46a4e2b7fed1b7f4b44502721fdb020ffc4ac0db1a2458b54f659b9e11a8cca8f565021e2096633c6670bd540d6fa2f3f0021e1b2234a573ae6db775d4d497a87500ba6af573f3eb8aedafe3b6821cea1a7a012b273f3aaba3e28c23048a3a9c62cf4ea11cc309b95c9005b08d6c205b028c8dd64540ad6ce78b7182e3a8855a9ddc138fb799c6730bd458d3770ee1706b12420c5f73fe6e7d39546d8e924adfb5e5ad7738fca9b756fefaf394c5948e57ef4fca93007c2d7af4ed7c1eb7e7c93c4dcd2abf129ae35579b93395abfe9fd95473b81f0ba1cd3afc4ea792c282dd3ee5e2d0217218c3802c89f45588dec1b5c478616343d9c0ee68f07ae9028e989ae527e3e37e4ccc0b0bf0d9190d4fd8f7a03f13eb72716f246f3155352d492c8c51c06a04b037bb69562eb9520fcb338eb06b9f8a5237c84d63aa6da3128b5ad56edd902ecf8c5b222687d0efddc11c7b7e95c758dc43373ecf71afffd4602f704db9378ccd140fe8388f4966171e26d96b1926f0afe54b21581f74b5dbee56591044298089580d962ec8abcda14e08ad4c4598ec515d59eb59270cc076ae88193687611dcf2813d31305c762391ee81d14ff1a1d357f3396cdfb0f97ee8109a01d5a94558ceb495da6c8fd8f050029a82414d7c280509d410073096af43fd348650f6190517ea94fc64859fa5bac9c621b93f414175438329dc80864465afe273c3bfe096155f32f7b1af9771fc58393ef32386a3a7e912855dbce0dd847330110d4244d79666c855fb6cf4311ed76a32836a62ca7d691e0ae1a5f25859f9ca957ff848287e2e3812e072201946d7230953b0b4758c5eacc8d661a903b253dadb12efeb7a5362f645dfc8bebaff8dbed58cf0b8584bb24e48a6680e3e029b6763036400198f029f712a2c22a9ff86dbc5f7f1caad24f1cf986dcd6f12fba854008f7be22f5ca4bffd921007d04e3ac1f7ba221a2a48ca4047e973cef6c4f34f5609077bc441ef364f92266300866511c1dd043d3edc315d78f7beebccf3ffdaf7e4effc4317e207a3a9be6eca98be95d5fa9e4d51bf2f9fa05b05516aa579f80fd9e087a62894bab9bfc691c915eb30eed44fb0cb9ec878b6819bb029fa2b44fd5c2de83af6328dbefeeaba827afcd92d7c627cf44fc1202bfc45a03fca21f73a0011b5f2407a796c77c2c86ae710acfe4a40ffc90d96368f9c96a29ec973752cf99baf01271dc7dc62f8e2e49cf0174e73edd4a74bbf4b055c9a921558422f1b0bb6bfbc07e30db4780c449dca1f776b5ccafd2afc215195c218b27c365ae10173b7c0e42fd44c1fd16e6ccfaa00c809e747f83c688a5ec7812315427d04735ce7c855653bf159dbd7782c901f5ec00db872f68c189f0467af96cc44f0500480ccd352ede87b187c70b13ca506718dbe958f49cf2b94beb94dc4b98d2ab8ce0198e5bea288712e09c6d6ac175bf02905afbb62d04d59fecba06862b609ea43510693a04979d5c0ef62f55bac2ecf0bb39b6e4ba46d85510f4c943fd72059157071a4ea24cacbe5b28f88e0cb28b6413329be54708db576c6d18137f6eac4b8833710bd2d6e80379cb14d92c11e69a375fc0dc81cd2f490887345411bc229b1343ed7760d486a146a05e7bb55fbe0d00df8c9f5c087b5a44af8360b52a072035908e764d3cb59e07f42aaf27f08c555fd9d1af1fa669e7972813e3263f53f9944175f4344b68ea1a3bb9ee70fc0ef51336f2efe68e11d3970c2a8972b5aca8be24c4b8f34f623c8cc6f53e10ac37d48b85e28e405ae231c2d859bf984171b3d5165cefeedd0fed6e0e46d993d02613497c40d7dabd947440f9c82a4ae6db3801aef45db83983b3732e49b0732e28ec5fe9e7b63e5d0f50f28b480c4ae2541450ace3a90cf280a8c05ba128ed63a46b036bc1b1186621dd7210722c3088a45edc1f45324c490db780f2c5d37c742d1f0f6fe318771746a25a1b631b11409a98154b85ab34d0bdf6b19b93b94419c55abe4d0021ad83dc88fa41c3850181c39fd9fa2ca79e016378acb8d99a716158d9861f4be4b217f048b43ec72f9b862922a55bcd9bdb0289959326df8c4f287c0806124368c367e8cb1ba6aee8b4a49c3456343f1c9b6666264c7278802d52f6c1a4092cb788f854e6573c55299f63f7bbab4e5a6c752b468a504bbf767cfe7b5abca27d899883f7361bf5dfe02dbfb04b5d4790ab81e32b9ef074d80d5117d621ce261db032b5bef82fd289cc439155c6b0d6a4164cdf183bfe306624c0d90121fd7a7f9e2264980d72a0c43cf1d206225b2a9e0821f870d776116075a585a5c0047fd6cb00d08ccd7249184e473aebfae82b64b73d1718b7611471dfde05e1ac6349047f63e5ef6b0a404ed23fb171d6c08fa9135bac5804c65576c040d45001878ea3cecebf13435d9ea2e5f3b0ef3ed3a62a93dc3bf7a2d0dc9feaf6735c50094cad9a36e26b02dbadddbfc168910c6bff2b16d30710f9afe12a73464853fbd139e39c7880837f0104193b522d6f16fb3020f301f8583b706d27c416fad547d38a774c7a943d6514a57e6990a9a8af54061c5e9ed030444e04ffb751cf2be45fddbe6ef7a4963e51923581dba758b7f3eb4c0507c8fc6d40253eb38fa7c07080dbcd6c220db6794fa4abca245668f3124e89e877c170e873da81e81041fe6bca6bcdabcec028d4c53962ae9d7a74a320c063a323cd3187109b40fb7ca34e319135720053dd8665893aa2153a64b2cf747a6a7d00b3c46010b47821b3fdf6013ff7e8e14648776fc5e150b20f30b3513e461b9cb580bb123db14b67f7d6c110e0e28c8d3e79645e0ab1bab0424fe6a132fe8287b15e4771852ee2b5567e90d4f7c08bf4d9009f047a11f8ca4f480c7413020100884c7854121cf4171bdf3fbb3eae95f7c258a4648f6c8c190f4e701615afdc6fe9c0c557d67d8e96e4d5a8c6ff9d2cf360e02c5ec386bc90d81017a6ee85bd593b041e69b8cc89b0426d2a6f68d4d59f5494e5b6a479ff6037c12104aad71e55a2531f6a9252e5f8dd36d2a7898e559ecef9da83ba257ff11c4565cf893ee320322df658ca7eb1cefb0261c38f29fe9d00f956a0aa3efdab1baffa610d1e7b7ff59a3a0b83fce01d24812eedf1b96379d40431140300f61cbf2afdfdb44f9ee3e931a620dd8489e6262bf7abf2826e3b6311f1753027c63f0239fb6318413dc4abec2d13e53a29390d856f255a7d9f52d7e5cf2d10c4541213d30f787936ba08be87da8c0cf90a29a7499b80281aa314c1d716eee87c040386c76d9cc57fac4c8519e92a8e4e129f558eb0339bf38691adaf105230b9b76c022c9867b3eb5cbdb7cb1ce4fba158f162e499cf41fd8946c056bfa80b07138e3904df623a49a05c5e8c7682d34391a9ef28545f34e26a4e52de807d1f50f64966865c40c085d4a62080cf45d1999187ec9cf9440b494e53f80084129a7f677e7fa8614e0fd14f68ff5e601bf6c465b8adb3111b6fb41f70e15e5489dd2ee51395656864eb5924ab3db9f4ee44d8fdfba5110abf26ce1a037fe9d4dfd790296c9d09c3b073dda9240d8cf992d7d550c810169899145ebcea68def10a5a52645a9c56a7185df2cf305fc63cdc1a1f7bd925f015fd14593e67d3e265b9a4bd8ad7631ba5384de9b32bc85f7eb005fb68f0fbe3b84ecb80b673d0c18bd1c4e96730b423fecc0623c32af6526949a969dc993260323af5edd41dd6411f97742809342f2f559121f27e6542aa5f6e3917fe72036f524f1ceebe7192c549b882abb6e3f10f4d92b1a96b7657023bbf4228b4d24f4f82dd5955b173d8c48840edf868c2f01b1f3a752da04684482dd2fcb113857e358835263a5406e5f4f60b1edbb50f48d6f7ea44cd4eded13a9711ec0c3d3c752ca5dfa52b9804caadf26f1da421b3d0bfa50ffabd79427023268f0e988ad91da40538b2a58040cea6709d10639d9fb93c442536beb5b8dfb736608ee0f55f39fa5ef92147d0fef96d4853340e0351e03a689d2f2717e1491f2ee4f7a4951bfe8c915db1f1718b90504f0e3703d30bbcd08059b95d1150eeb49fbc1febf987c06021f8585e59b00f1e454cced53c29d49438bc5cf25f1ddd2f2ff9b6a9ba455a2ad9800ee4ffb798c7a9615e02a3640d9ef65fe635c5fb724be89dea02df6cd5a30658eadbb219b22148044c92dcbc7c8e5df578a321fdb70fce2905146ef078422d6ea3704bf90173f4333c3a629dc004dbe0dcd1f8d6bc7b77bf268bf704230b82887ebb5c24f408931e815b5f904e188e7ffabb348e6c8c49bc64f3e082316d57691eb5a8e108ddd20838b80ddf53fc7c9378968f5cc9f8881e6ef122af7aced3cc7e4724c69ce8ac3b9114b3d60bc395fcbc6580a1e0dd38b19679c2007bb995802813669476c405f3e089746ddf1c52d37a2bb9c93be44c55a3db2ba3275b80aecc6dd1397a9bcd9a294f8aef7d133143ad56dfa248bfc93e7e7ce2162e574e4aa7ca1109a44321f24c4786de5f0318b6ed5b76a3827f7c622295b743a1a82a108c0275b9afbac4db4bb329cda90607100d53e01f140f9738545916f5995c0df351fc0970805603145f8ac9fefd3bf2316c87cd9df29489bd4959d9298fc29b24c6ab5071c02820181371060a7943d2dca3e07ff1f8859ceed5262fb8cff9ff2e94460f6de803b04275211caa10f6e2ce67b96655ccf7cc439d318c35c04495af8dbafd638edd2e9599a9913c25ec0ecca2028879458afb04ed58cbacba4ac4b56aef7a141aca8c893205a6096a68329ced26dd22c30f4277dcf870e8bb407dbee8b1755a4f632f4e4edb5c82cffe51eb7ec6e1a9d9ac71cb03300fc242e65678a2f6ed197a2727faa39fe8b8525471c96914908521d17b368ecd13018e0c9b7d900b9a66c20c598712ade6c09490b73500658560ac70c466283cbc341131a96f51213868ed7ad5ba2b099d05b1abfde38344cd0e69fda901014175d6e000cf7a70e88f256f43f6d5ef2d623f438b005a6c50a1d1097c7261b6302f63ff3e71382d62857759a50155b936a3768af69aeb8c8ad6ca89a8f37af94742917a895e306f67ef7310dd1f81b777e1274e1404832ce9b351174fc4c2a628ebfebdf2679238d2234348f4d754940b0b07667aa68fd5d80ca6b787fad274613daa272fe3ac1a7a2cd88735e00394a8b56f61b1be48fe80b6c06041ea55c6de274ebf10239eeb5ebfe287b6cc15e03cc076497c4a552382b45fb64efa1b58cf9e886b4d8e865c4e8a1c589959fa9275cf83b7e518505aabde78799c1e8d2be84e3471fb8d8ced5782e10633003a494d6f1d6ff24df8e78e30d67bb5c24f64c7dc08ae905a1f94fdcf80819583873a527f4d92de2beb9d308e442393271bb037f982935a4e82a84b973bc50e7027fa0c62bdea4a459a8a1472ae3e2c7b31b0ec19a329a281732e49a59a644ebf1ce15bd380164ed997dc64f16fc1b707c0c0714ae423458efbb051f5ca2c1aada9efa1db4a0115413d362be2d6adc1e28e99d3b608385c78b06ebbbe8fd33a536451ae16976e32d2a4f36566429410335b4da12699ec33e47fc73d5f9937f7f16c437e0282d94c1b1fce6d2670e16110c03854580c03730889fa58e1f7f3f083f7e32d60fdd8f9fe3da70f1739afdebb8bf284ef0b05b9f1c72fba4b7ac4d0994203a7940b00ff843d8d4fff800c35c42d76b7eb9caf034f5c484dc893952bdb41360d840b97c12898af0ff5e6683d38a437b54109925d4c3fbb69db95b89cd07fe7dc738f3d5fee803248536fa9d60ae11b732a4a832f1285ca4f18dfc7ea722c9faf79cf2708a8637acffe9bbbab9e8c64d679f2ca7616b4ba9566c53002398c32f798412040281f0653e1c8f21ead8752ce794c15063978ca293d0ebf8047cc0f065b67ee33183a14e948df13566e86604761a28f58cc7dbdfcbd9a0dbee7dfd89e8af24bf5dbfb399a9b75c7013a036043ee772ed22d61bf8fc83ac95c0beb8d6571d3af0656af88b0f7ec5d239817365dfd3b7f982feef914a7bdeeefe3a8ecd5d36f9c805e2c3d1391856e24ac3cd85f2452b57d2c76a51ff5d76b6c60de43bd513bfa26725a093bb1fc57500bc30e69194954c6ed05876c0613cb024a42b4599c01b2e6bec979c9daabb8c570fc4140403028140a08133550d4f014635bba69a924d19604a1b2c8ef6f4e12bed148f43e2203a5de2d40556ce1da3a993ebcd1b0203927edb8f44c2145dd59dfb9c7c8271ee89ac66ffb84760b87fd1613dfbf5dbb400dab0050d82312b169984903a3776c7e156b5ab59ea05c74f7c46d244c5ba435f853f66a6d4a1821a228038e29933d21a6d3ebd6336b2f3c41162ee68cc214497d78b484674ef163ab973807066c77325ade7e945fea21ed9cfd59e92a92bf853cb22f94ec790e0c9982831989e826d513593cecb7f479ec3dc8fef44cae389acd63f1e607f38c0e6d167f977d8bbf0d058cc7e1436adb7022e3eeb9611aad3bd8952f4d13f0682b8694b95beb065c349d4429ed7926c6e7c7b203a20181008040281c0dc50c80b982daabc4528220601f9cf503426cc738e7758134ee6587117e147dd603cdc12b168fd8b21d1ab6ea6cc73f6b883622509fa682cb78a148b177bdb35e08468d77e059ba145706dcfa63bb9afc1b44b020a517d1d0d3a24c4b624be295ec1563760555c690eb84685c176a9d6a8f9ffc4cdcce7b2806993cbef394a2a878d7b7b436040a7438c5ed16b478be0ed773069a35aeaa2c1fb670b050e84bb61b2aff0794ff5004dd96879dd546ecb205c05bfdcd9132dd1ff20136088a6b88f88f509d32129130ebfc55eb20c6cb57be2e697e997ce2870e7323e66effec49c2936699a9f7fc0e6a529dda956f4769f91e5522537b0ccfd19b2ea438dcb009c410bad64a9bd1041a1065b64712a43dcb04ecc893f1dad147c577df9def750bc09bc2e5f337feaa8e3000cac28b50dc92bc3820971908c971a4f3161d6c7515fb8778f957568b3f188e123009bd5ef9259f2de8b67a19ce2b4c7417de6d763fb197d07e4e346cc93613f70d3b1d90bea55e86310131d40bfb07a9e8ce24b1f8d104a8c624d8f07ad0009fcec2f46ea59959bbced333fa5cfebe4d7edf9008d894da500028ced1155ddbb683335e567ff04d7d1986f4f1e300bfd39a374113fa1a6195cb0fc7c4c2394fa09c111852e587db63a3f6408ba35552682c760860a1b7f695b42115687c6a665072ca8e3372c81ea3b9468fd2d14716ec34ff995166f2e2c7b70824872fe85b8ed944ced898dd2e0e0e02b910db8b785e4436001da64ba51ee4bdcdfb9b61a1943cb13f057e50a22aaf61dfe83d81131e50d1808580c29da9b0da91a31ccb71671a67ee78cdfed9bd3f841f5d16f2a95973d1099c119ea59d4f09fc76256cdaf65850d6f4ec75e2d8b1db3a6750c62bf8c5a1298cc23b16f84779d3f1848ee976f98ab955907b440a7260be315789ccff96386a2d94a1b3eb12fcedf3c5d788ab1a0c119be335bc6721ceff382d114e010cd23c87887ff2a931df621de8da66b6f6f4a1ab284fe9ecbfaff9b9fd36d7528365b205ad9233409adab75d222bb437a7733c1207fbdb9c717f9fff6db57a1fc22e7399a6880039ba05bc151a70a574baa688d0f8a2de6d1b0e33a1a86ddee1f0036c57e7a636f12dd0d5f185adddd98fb2c5aec349b6c4ef25bf6ef8f5c174633b23777026d8be193197346644acd0b9496380277d716222c046cd8f92d7f2082ce0e73cbc5bc998ab2c49f749d7a0c54d2a73b6ea4ab453f7b74f327b268ec91c7cc8f10e5dd788561b8fdab0d48fa628b8094021dbe324d79a6a5d8d93dd9a73bf79726b17c234e87662e0e6176a783a0cfc95831f0de8612d178c71639dc9f64f263db5d3c1dafcd70f3e3a6d2668c99a922caf726b8ac40201068793e4c32c61f6189cd91143c1f659c92c2f781f4a3e7b4fd4b8c04fd5e7ce47e7a7dc59cba09c534809b77b75b795feb0d27d8e5f879cabe783e5013b15ebe87ee33b6ed00a48775bebb19047dae478a817d3c04454f9e3ae836eae37018070443bc621854b29ac47cb9c3175f13f34e02868b24f66fd46dc7bfd26c32fe0e05d0bc3f632798ee3c9e30d06c9b704b8cda2d6f86be157e15ae6fa5155fce528f7ac345044640dadfb849ce49a48fbd17d93f62e2687cd2b88b3d4c2180a2884d329178be599175df566b246240be6a0a6ae42a272666f341aafe18cfcfd8bfbadefca2cd724ee03594c0cecefabe6943ba3e0ec41cef4256b39974ac2fc71355d97b142d54b70b0bbeba3317ecb3ee0bd83de21916faccab2d12a88622ad64157221052a852681c356073dfe54ff2f76f5b87a313c9f77da6156e9e6473df258883db7bdb3c524e2ea576e510052b09b5b1c73f7651911ff5003cce0578a0c2df0b7a6fc7f2ec45bf0edcbaccd33de046cc48db290386f1614e39949c0d795d0eb4c79d6d031571601a66bc757c337f45d07789015505e9f65e4a9fe9e2ed8f608ef4b14a58cfc6f84acdf8f97aef3af7a59c541ed4ec780b783f4caf4c6c8d23099306f4c3c35dd43c24de681a984be057e7de1b839ffb363dbd0cc8f26ac2aeedb01b7aac8725f5a33c6c5271327bcb1c32bf1570c2251a1fd332bea869943fc7c3613258995f6158fd20400cdfc7d388ea51064ac0bebfe822b0ae5e722babdb3a5d034f96172ff699da1b807e6007910ef6b42dcf4d7080beff7853e75850a45a5bdc5271fc8656c49bcae367b1b37e9378c6f78feb40ff7c968585452d8d8382dbbf94b3a8df7bac6301f5afea221acf2e6fe74dfc7ffa58668c9d83fdabd27fb5b67183c028a5984e9d113f6278b4d411640d430042eb55155eba89a2abd916a796ea5f2abac8aa401a4b2f560c7a3f30247f0963600552736d9efb4fcfd18761d20331ba210e1a445e0a1ffd4c1bb58f01a1b80bdf9240155945d69f83f5fc76940583aee0ccdc7c0777192e82d51c2f2ae95bec25ac34989b91eb436a6b6dbc91caf5e9ebd1e21d47e0dd07e25cb436040e96e60a1bef327fe5e8bd8e154e9175f99f6a260fccd64ffa501b53e6d6a4329c0acd79374558c4d02742d2054c0237215f41945352c273987b062ce243c1412d003c9b803a73814c902e4796e64080ca4af337abb17a3a37ed1af86fd53f8259d9bca169226e82a806008fdc75cb5d208e02fa468cb81686d5a9e8fc4590804e263d716ba12f98df7e82e576f09859e5a4f28763735d372f7b03c901b7a76222548fa12fa5746fcbee1cb682776ebfc9de97a0bea27218967734938dba04579fd2243a770107e4f49f7d1e59131142ce9e1141d5675e15c2b7ae40e73765d0488a253c306e5bc22c9be9234126c88a17fa2e9befa434e2d6e59220b0da1c73b1276ca3f08e2c38ea13df44576580812aae61ddc93f07b2fdf4dbd14616fe8fe9a66f45d6ab676e2bc87fcee69080c7878ffc450cba23266f80561d4fb041e7479449bd53afa229c007979e84a393e0790fc3f2117d978f350d0ff458c423c9151c4fbfeb5107cfa1df53b6a59c7a41d530f4c1908062442c92b6389d47cab97df1f0abe7f6796c2264e7c7a79eaa647c8a4cf164c2dad40b4fe168a38b7e1e7b37e41de87be60e4b39338624bc0b790c78429c1b45833de72e34b032eec4cd1077e009f8ea195ba9abef417d66c7ec7f3d48dc437e7f8c3acf5cddf79291f8eed8d5ab8e2f90eaee0648b3e7597391aa030e53f3e7e77cc94c1a3e2ec68156b7e989d1c0ef9833f7d05ea7e05fccfa7ad528d26844f5f19977e3062cd5422dbbe69c8440c54b8c4f2fabd4e009c794ff16c9ec815f5263f38e453f3767e791ecdc6cf91bdd5f6741e143b1057c4bec38386804ed5f104fbecb5288c2efcf67c9fdf661c3c9fa4fc34aef055bfb51b660a0e45e88838a46dd3005a7f1710e53d8bad1edc18f612c3d1a7d404bdd9460a59cc5d43d59cf1797f5bff84b309c5035405f2470cee6e4b3c51f516d0b5547e842b8f214508135c2bd90dfbe8c5868ce251ebe258ae8ad062ba25df4093f26016d3b9b2ac5cbad4721b1073f475767cf692d8c978fc57fce6c3592b947fc34dbb48d8d7fa4fb13de7da8572152f99472f0e7dcd87364ea735a34f11eb021ab7bf075c4d9d4f25fb99c0eb0c85415f90a2d8cd0e63cd1cad513ea2f72bf5c9c481a85737ad5d1f02a2af8430415c04f24c09992b6bff7234e15391de9a69c8b43572b477c401da868fbb551cf0c33845010aab7abf6cc322fdb6d882b2a100337e316b9553415360b4b5f7fd1dd0e7052f091b10346dbf499889b052f74847900a55b6ca8b74927ec9cfbf459bed818906c180402050b952ff25c8e14ee88585536d350c93548782cc3cd632a538138060bb207ea55681b1a91ed8592b3df51c639b8f23b7c03bcc1231fac1a3e9775015431180b4a240bcc7c349ca976b4d5bb9b1b55fbc04b1dfb81779e078d57c7fd52345c800e2ecd2de0c6996c6f173dadfded88635a63a7757d9b60dc4eabfa3696ec2cadce271ffa190e79732f6152a01b069b29c9c68f805898deb6da23b0632feef59b0cea7bcd022f816223cdff2c30118700c8c3d0d25e0aef7961514bda71df67ffb7d811af56fa872ec9aaa1d2eb2ee2f80c03deb59ca6ddfe78a50f873ba70541f4b84f501bbd47e6f5451eaf1fbf88fd2aa61298057954ef4b77a37cfca713093e2936c8d811aff5de415cdd10e50eaacd842b851b3a5f793568f195106ccfc9f46809b70f8eca8e8eb03fec9a17cce7657ed09b940e978815cf31b872aabe7502f670f58e8b997e0b4ead8c967b14f4702cabb789654a277a8a3e48cd3b41e3d258aadf7da78a36c16c5a1e118712c59d686019699d0dcf010f1d0b4989aa5dd63c645d3eb4a30cb368b9ef81f8a14df451f38f00a14e4a714b653d7557024c8ea04acd9fd0eaf50a5fb170e0981e511ca26a031803a98ab81b06fa51d8e84cec0d26dc008f08d56198a0145996bfbf99f2ebe8e627dd2ccaa6e9a4f18948033abd5a3eaedc04c64f3c03b47400d395253b98424e26d342201eb3a2104f57718f5180b7180b7eba78fde2e7f251e22895efe1f219e2bcefb12155b47c49b8e17076249d75780a3fbc23c2973a0ba1e41b4d757ffd3b8b85f12435258bf09956d32441781d125548243d3ef1c018f8d82acdca0af9fca4a6db8cd1c9fcc75226ca8a6ac3ddce99ea81540aff0c42833026797dacf2a405ee1a3fc127712cec41ef3f73fe8a2fc4afa0932a8a9f6415f846cc2fa901f0930abf13f01f4e7f2c8971a622223d9b95e755b1895665f93bf6031e6c904715fa93eab6037221766250fe6bb0d5074f30ad21f0ea77e729690b4cf041d0c9a58a3f963fc34bc41c1f1f4f303be102ded24857f903a90b33571df8eec8299868a1e5bfda18cc7976136742b3039d8b096a6951c032a882bbd801f64e5f6f5dbfaff5d1fbf14538b7b62d3ca963daca193b53d47effbc2066030829957ac4578267a81796a721cced64b968fab4cce4798f53c25db121931ebd8384c0eed5aa1878d8269aa10f58b34010ec2ef311a4ca7a7ae40949cd9fc0abc9f7b7560540ee5f7540ae5df8fb4bf216811070e4f90a72dce046b220df986d7dbcbca80ff64c3000d8a6b0bdc2a0b55513348bc185108ce67b71a96548ed845f51dd36bf6184d114226c7776d837da28bf84a0fc1ff5178780be2eb7b82a701634a3a420fb4074e9ae0c7bdc943b503982080e06f003aa1feb45fc7e14069cc15c27687dda67f8741baaec7521d16da24f93b8d346022e5386a1aebe20a08a1b6e5c3e199ff043fa1cfcb5132592eaa406f7abec8c9b2c43a9d1f288b67d003337be18e9cec8c156015e139c9ff27043cdd444e5ae0944510c33bd9a85660e65429e967bea5dead88f26b5f9af2fa842f1ce241833bbf1ea42323be6146efef5d06b984f1106e01f46e8f4e021c4311404377426cb1d9c5aac8ef7dba235f6367ce863f961dcffa55019ffc5496869fb900343fbffa52afdf985d1c526765e1df48d04b336e76cfc6be76419137114fd3de412010089590eec417475b35acb2850f797ee2408b2854d82f83c7fdfd85a108378555116958df2a9e2a172d44621d4b0d7d6583205cc05270b38049243ad66cd4551c8906177d1a8b3da5719f17be3ae6b66dd95dce332bcddb215982cdc5a507cd51cd1e257ffc65df49698a16537444e9586dbead81d523385cc9bc5f2233925120b4f52d1dd232666632b78c8490dfbc4bf962b7cee93176ac124dd99cf554bea19df23cffa0aabaa9607a168108a80d7a195a1a1269834fbc3feac19ae82befce0bd58f110eb671b9c580c5a7cb1e6483938c7b79406633f8bb2e0854c0e69e7863a884c3a8f8fe3e570b8cd6f5dd4451cdbc14c7bdd276ddc2c11ef83188efc52734966ece0043c5f4e46cbc37f868267fc7b409b8fd8a7919b3f8c5cbd8e2e9ad8abe3fa6b6c917edd6d243fe5dba30eb595ef14e83aa78fa318d40986b136b17dfafc9df7e73d40b4eed566df789c4b597945c11f1ec562ca83dc4dbd5cc9dc968fd2d14716ec3cb58000344add5f9bb512a818f86cb62e977f3b2855cc9975e1c89740b025f3bb69a7f8100df9ee26b41bbdf155b5915063aa31a4383f9c9a6d1fa2521912d82ef5f11e1bbc0b590610394cfa72095ac71aa7c6d09b10b53f58e28839432328901c6c360c267e465c7488493e3fd35737d39e836da3c06e84562c14e43658d5f6e106e95ab68bce5005ddf4e44e243633c821a62816f51a8667eac37dadcd5df9d6e3c309a5d4da450fe999d94f008589ab3410016809f6eacecbe73dafcc77f27f67c3fd0bfed32b1ff432f1f130dbb668c7bfcc14a5c590c853c1774474fca31ab81f9b6cb883058559c6caf3b1766f907c958188a2875357b4175cb27dc1d694493d7ffd368575380631affd7646f3415d3de03fd0fc0087b992ceb22b1822dbd50dee11ceeb44ddbc643f7addaa17d6f3a92b058d0199d03e986be40dab1c7bbf78b43becfe67f4d17a45aa6d670d6d1b4fe2f89dba3741d6a8aaaa5ea444ba2495b2746d4f4dc2063da6ee3a3f5ab6b06e4d8b94375ad21c45a03139dbfa35ed089eccfea9e19518f4faac325e916de23fb752396c7705275670e685079a702afcde8337740d5fa9ffd4af0b2a824c9ad77efd2a0ebd26d3155e6929f1bcbf2f2093d5a21fbab67409f53a3b09b02f1c00c376b9d13ce3ef6fe99347f1172f5ed36ce33438e0a9b8c36a21caa75656bd3c7818768313f9dff49d1880af4abc72f691cba086171bed418f973f629d8f84b6e0fa44fc660314bd607c09afabd14d9afc67dd8a1e95b936e7fdbfdc0208aeecb68786799eca1ed670cc91ea4ea2efa8bdd4dc33cdcc512fe4689d63a001aabf1fabaec8c6b3281014efd4d7a6b253238e0696e0e32340884b30d9a434ea9b96edbbb864f9de8562a46fea062bff27f650781bb6ee1b99dee28bb90971bc07298dfe63ccca79be0bfcf07e9751111ea4f6c676600810474bc2b843129fcedc744cd1ac4421c90e92651f3e0c412eba3f2723dec3bf4dfc6d853ef4fea550116ff02852a7e1236c06a42939bfefbb7b5ff77932652d8f0a8fb7a4bd428e745f327b94b9d1ee1725b70913a1ba00268e4393847b66309490bccf4752b3d61393ba9db49f752658045125fc95cc4df701bd46f35a16191e1c861e844fa2cedea355cfb1add71be2462eae166fda21a81fc32021134537d9fff6b52c3365c1005c73657b41e8eff09c5384bdb1acf025ebd80e01dd24184a43f343ab2e0a5eb08159f1d78bf096d926a5745cb0cdf9e8a9b0e70e7b70d50033468089c8392b084a47de699899e456cd9311a786d3e4ab1b17cedcae131b09359e767968d436c33983d57df1c330ddde4b33e635cfda5d8ba169eb836574225f1f830b5931f1dedc67049628d5716fd98ee571edd2dc57b49641d8c2ef73314e265f0d4ba065888d01356d29fde7cc20a803ac71ebc5d6cce0d71a9600cb5821d6f501dbeac828db5505e6b5e765af48d1575331e09d3034f5e31f6314ba5d010b6cf42b27252e84f468900af2e40dbf0b137c402c4121a3bcb05bd069e1bb98fa5e3350f6ecfcb282cffa872106cf4253ece3d3f034ea2ad86dfd46ddf2d50a3fb82c0db9cdb28b7b2a4af7979301a69235fc5b9574bb2e76ce581c3f2c0818f8d82ad6850b81e34dbe662990fc0d6b201a649a77b82224c09fb00c79346bff5a2def3b94a4c603ea881090555e0d21811eb153e463d907fe93cea13307ceaf1af87d5eb7ab99a90fd30ff843c6efd235cc0e05b3e3e00a5fbf21ec5361d552ff088ccc0c626537ab260fea705f1e03fa0972ffb80b89f4c58b4c9bafa5ccaa7fffad46a54e28e83844ff84cfd3bb39b6cf5716358e13020005b22ac34d8ba0c08fc0a0fe173a5df693ff251a9f7d5b28c1efa51f326bc52f65069be3beaad4c8f954dd0e77ab4b0d72ca46d014511f585d25959b9e6fe17a19743dc8a12be4f0c7df2bfc68f057df1905fb79a729c6d7ff918b5f6b7ff37f60c011aff4a1505cf0c4247439dd9dae1efff011954f31f84255f31fb237ee94bfa8ec73ccd54b5399c7d940ce16ac8bb0c2e5fa0125c70eaac2e5bb193f585e1e8f9ce629d4acc4857569c299bacbfa2063c7e571fe5dd2174f8af92fb0112b2c52a66b4cf7b538f9428c660766ed33870cbf0ae30f1f2fe14586360020feb5e1d43a7dbfd0762b836c665d832538cdd52a49ae3c2ac53334e2476bc8519ff95d097caaefb78524813015132fe2633e6142186cde640daeb64bdd9a62a64278e572876ca46606f488e07c0eb11b5308439e38424633ce14290b36213ca6baf324637ddf7ac1eb55936aa7b30eb7756828d0e5455dd2e1cc2c03e735317677ea6159a13cdef813534f7497768f685934d9ceaee647a9f1bddb44557740079abd23a0f446d18f02bfa80a0fd8a89a10840ef41ad90c957f5eb8899c9aa2f062144185a54a541fad9525c86492c9913640bf810757ca540e5c7182578bcb682ef7ffc1c6d3a8ea624c52622a1f8e1ec77fb13c166190bf872861fdeb0d620ebe841bfb022ddaa5fc0115eb07d42b8156aa9fe4e739c30027429091ed2b2753bb4fe2e40f9b7c3bea852852323fba40fe5a3f8d8c0980b3534af605b7166db5bab93a5b36900ba76295135527fa74f52e3a4ef67c3fab741d8c17343455652dd5487a71d469810ca101e4b2c1ea00baae174d012fbffc8e95ff24a1849e957c0d2118a18ad1bacb602d1fa5b28e2dc869ff263fc2b3c1e792e21c152f8e9b1719eab2fef07e2e3b399e341db09f99d62d43e02c09f918ce8deae3a6429a8b5ac8978cf16164fc371b4c95367733deb68a056f2a3121eda997ef6c74743e58d0533c1de817ed572b4c046b135165eaf4a4026621eb9d400817ae06214ff4456788cdd15315c348e8d280b46097d1d4f9f3c1dfb727d6eeabe640739487891021bde9d61ef13ee32e8d4b7a2acd250f2c2e4f0c81a11153bcc9c9622c0493c4f8a6fab4b288347b715466313b249c810e79a24140b0da64f82ff7b66fd72cd45e09a0c6ec7aa3d938496a4160171d7f09590940e775be58afe902b1b09a353d91b346993a0bb10e4ba156213a8150b95f24d40fb28055df016f21ce9ca978af3a78d821f8f45f06a400a8bac6de4ee32af68d88850d002b28d22801d8a004971090403b9465b436262280228e4582375ed739d78481e2e9a1126f9f57552911476018faa496cf18b3374c005608e273b142cc94ca26d53c9fc3c3044f3eddb7cf0066739fdad9f3298d48bf30bb9f476ea6928750529388751813a2bc8bd2470c8fadb0ae63243591950ee557a329730086e834fd02634caa392240c9d98c5fc52075e85d04888c25a42e4e3cc99602d0613e135a2ef6978affa7965effb4b224a7eee46ac501a5dad53fd540858b71a6bda1f08875ba3370510398e55c8d9e21393484d87db3fa105af298159633e5eda36797ac0bd8c38c059e0c74223bfd8f9ff7aa3730c93cdf0c5bdcea27efc25f3f7a3e69adb9705eea3c5b6e1234a40329996f397ce6eb0f8887f82ec87ad4946e4d6e1af8f3c651d98074b811a4103b9e385a49877081a2021a20b0eda8f92428b7f312a4d051d44ace59b82a3644adb0f328493b42bb66123288e38c053c619806415ca607129602afd90bd059fcc4759ac754fc1b75dbcc0212c622834c26dd4036ba2dfa14dd6376c21ff87179ff286202a998cf9398d541307020d6176ff7d60c46fb84d05b3470edb25002652c8ea0710b193074a3e215ffbe175b7b90cb6e020a6beb5ca293c55b81d26ef619d801d4ff082c387e8a7c9497fe6bbecd4068e89edbf5f99f51470c05941f3516ab4427b89235ab4f84e0220f577212a8fe4bc19423dc45a5ad51d72782b07d6514d25f4dc3cbffced0655b6331a3f3305d84c438d2bbfa8eef51d98c40e46c71597aebfc33e6a2f307d7a9a3f6beaec5ce453ef87429ebba3ca5b4c93fdbf7786bcae33a7c7b4a3c57ec3cc154a15f2f16a0997adb0ecf9188748a0e60580ba65b4ab6b61a826a9cbe867dd96e3a108603dc4be60796961d196b0f6cec6cd0e6b25d7475737ac728f2897b35c56677016704433558e04fd6fc272ecdd16f5cc589cbc4b3acbe3feab72ea2f1cdbb2667d0be61a437983f93809d0f2f7363ff34ca8fd8f002cbb0d1536126f54894676b41736c83764b2ebf32009651b347b3ef57c80fe2fa62e91e070b7cee7fe1a5f82971f9fa9528cf1714fc5244058db2880e41e12c7a2d7f3ba9e57810127dcc3e110de4a93e99dad758ae1bfecaf86bff335e85cc31f7dc5d6459bed7ddd99fc6d496c57ce2e126e2ca98922d3e8d0d3112ead7301fe6455fc840093699d0608d126ed9ea38fd4106363cc7593d2a6ec8a3bd458719fec8bfd1f60b3a4dfa2bf450cf0f6c47b51f0c931358859f59ee03b702d39505d6e84b199f152d1b23d988fb1a612fc236fc2b15d152e348541957e3d1d57f306c556b3f27da969218898ffb11338736441f3440e22ba8cd7f62255075f6b13b44e804eee6b902219a91ac1f11ca5eaf0ff194dbcd812f5e0c06d41bc5e796676979d11d60a5a576b36c945b7ef248a08df84ba4e31b0e2017dc917582196d01fe1a0a07c799d0da32f8606a2f7a0985821e646c26fa56bc513b9d076466038fd1d69cfb1c8631917fe4759776690f19fb4676fee2d211ee5a96acb8d027f4050ccd080965704f05ee77a8d2d9b3a66619c1ad8bc35e07404577dffb6a09ee401d06181144bf3f6705f21ee365052ef0364937845c537b52772b0e351dee28ff01e588a507f466024876d91d0b6c90c6715689b1cfc3a9e90de94d8ee8a2a134fec33effc4f06b1000678263b18d9fae469bf3c8539bc49f0fed06ad32013b7d8ab6d182bae5f018ba103c23ba86e3821f7f5eaa197b2eff5e13518aabb2a8cf7bf4ad85ec72ef099983f230ff2370f72fbd8284853ede783764dd76a28e9d81a382d4745f1380d41dbd9ff4f1fa00c413dceeed920e46eb27ee0a3fca7ce08d8ee5b185bb764b09a4fcb628a0cfe0998eeacd9c98118cfac48a66d1c8016997d1943dd13d1f90b58fb4f90e31bff21a684f48910ba393943d1d30def38f9ea23e7c4cd7e1efb4500e399e8e70c351cea0464381695b4bbe1fa0b5017569ac2cd500f6b5367815d9216edb0302a97d3511cec072248084bcc55280a2baee93c13fd9f74a4230c9cac2dab28c1fd6296b20727d1aed93c40d62ec1edeacd3b53fa98482b36a205233ab15d063dcc95492a9c854e37c3b9b40766fb32e97870dcac8882385fa24c0ae335286747bb83453a22e6ea6d594d91ff5c629e3a087622a23b46654dcbd23fc121508faa9025dc293087a8905ad99797c5c9435754e75e7e12d019a40e96a10820a881ae55638884a5c7b9837aab4f99a12cb4dc4679c5278e9c4dd150f9ffbb2b805b269adde2c3984a7831144511aa19d42dfa6d669271e8c9fab464034ff68a0c4c9d059bd42c0727bf670276e62bd27a934ca586d479a742c9820642c2af23ac70c2daec3ac8654d1380bcf0f2180c93cbad01bb64757fdee43f0604067319a8b06c75b5d8ce9e363bb012bc7d6e3ad62ae07e34cdb8871e0feba4b8e3cf5b608b19515b088cf24a205eca5dc27d9a5376410c568eb7a8a05098c1b484f07cee4e7d2d6c1408c3ecbe2899ffa00cf7a3976dc440a6fc9320952843118055e6ebeea9f452584cf5bbcb2f148d348c0518f5bf9469ab40af560cb9e19f3380261aac9331d34bfea64fb229376dba9599f858ea917efabdb3eefcb93f3ba1a7075934dd69f1cea1aebafee2ab8581953735893bbf38f8062a639504fbf16cfc6a100b45f0580cd82e1b9995d9f5ce09ec6279fb2dfc74c9b23b7c1a4232929f8fadc32943706bfee13a50904cc26344edfe56a4b6fb589ce5f5641334242f48ab93eb4cb619a8d112ac93bcb3dee06f167d8166d4c1e5e94ba6768960085618fbd10dea20579278c3a47da16c392dca4fdba2643e80edc8b06f19cd1c9d9bbd266b55aeafdbcb077ddd197be69fb9dc9abab2ca5e78fd647e0b7dbe8e46d76cbc8e0dfc2e0005ec51a889ae050f7fdafd033ae6afabf7fbeb6c5ab4aaf71180a8e974d50611c197516cc347e5e3801c83d7d47fa885fafedd38d326415a99b963e03f0d18b79fa4094451c806d5924bedf389250c7567762495dda015634a3e98f31f72485e1c2059ce2bc6f26f49f98be13a3acb86abaaf238d9346de0e0f41170ed12760a9c8c2e85159e83c4a2060110d019923f3e592f7da8b88d63ae21388ed93ff3b9d644f7fb157bf734a2d96dc4a38ca0b999d5f43b5efadb317dd757c8b5c7e802a1f6327b6fdc77ae4f120b5752095e90e05c1ced7c6d5d40b347005980be83130548352cc4aa638570e8ee854c508708ce4699c614c8990268e8e6c817ec4fe319898591d450e7af2dc55f018844780b6bd81e7518b44e786c451c238952c51018f83fe25b91181dda13039e78618691a68685ff71a56fb53746e2a43262b41baa03e0763a72c746ad44a50a7e26d77a3386e86769e887df4d9ac8a66c087f75e61945c851dd5afccd718aba0d77ff0f05ed258527f7891923d9f9f70d540cec1e95d79bbe4344a0a9934e05a0d594cdcb837e1a2f4f23efd4153ad40cde69294c09fa350fa1e308cd817db9438c9c76f6cbd9ef9fbc57174bf049b8990c8f6dea8e7fb5dffbf4f910ee9df2e10e86c0c060fc55a5b787f92a4ed28d5de1589a95f3dcf0ed4206f1ac108d51c590ec4c34c04e8ea6b4997e83ff8583d9359dced43d5745c1019f329eb3be4429dcd78e33350a06dc03d97b46e6bf2364f9fb1e2a08dccf9ad0b7ad186bf46cb96e13944f15e91dbb8716cd2c8cb70b8e75d9dc60222f1852fe23f2b7adf4424a7c88e2c1afda46eff705d614381ead694ddac63e229899a237c0d2e9a73263c050110d8744ea4e14243254a0a945c3f27d4da7b81586e29e6e1e9cce5844f5fa4254f47d2348c881bd94ff79ddae25b3fe45e754b5e71c5c698fb1108426016eddb8b8f109ef6be25db604cc96e94fbfc371dd8bb19b0616ee8e77b354ac2f752288ee981e07e093021de1c805ebffba5fc05a51e52d449d456f315ebe604e0ddcbdc02c65a449bff254d0c26787a9b0e7cd5b34e309475711e451771d7f4719c9e0506435f6ef90f2eb311b0462644ef831c3cbdf6ec6ec8a605ab37864cb5230c0dbf5521169c22d24dcabaae1516b6da1157975f84dfbed3e54e9fc61dfd7f64f0f0c6abb0d946b998f1346d63a9f6188d31cc267ec93661ad94fbf6383aef5fccb4b61f0d8fc1a96f3e82109651b3ec6421c00eef85c6d853ca5dc3fe57b7b3b02a1ea235ac92e681416fd4b9182dd4ee7f01f70f53f7626c3503a1e2736f14d2ff411f81cf961579a31a16d9bff2abf74033243d010b797e6d7e36824ea419eee89eb6c4a98c0b8e5a94a2f2d2349026f7ea26aefe44660f1065ce8cdfa54c003e788c304d285c5c4503e12e44058abf8b7986d9b73f41ed5fa5f15cbb948fcf799775a38c2d5505a142c80e4ebe7959c0d0a4eb1eb53168141de58aa0a1f4eab01daa40f371123f82e5f06f0bba6af4b9a31177c4948308ade5013803e6ae01f071eb88d7dabbad1d49770dd3182eac0fced24f95b042028b44b759bfee56958fd1faaa8d1f9d5bb05adbad5dde9e156ed4aa99a0814d103813fabc691b7943538d4a044bb974f02f160c8e766d62994821864ecd0d5e9f901697083b527c8330a09ff8464f7e7085c5062fe66ee065a7f17e0de8f46a04940e1d23ee1f28e090f716b1144a7b0044b9b22393f3b5fde27c4874403043e1e491881d5775f0ba406dcd3b246ba39dffb6dd8fe62e6bd9e4a5d4ab8604c9344e1d1c64804c0b2b94ac2b624cebb278e834f1413748bfa28a3608299756921976203d2a2e500685418461b7d17663255ee6b3ea12db5395d257b50e060ecb5a97be17b9df1d045c1807b9a9e861c0ee988f4a84ae65ae644e3ef03a849d5f740a877f393a17fe1299401b3f958f794f0ca53fe95f5d96f90ba1b8c631df096a49ae716045f02780c32f91223284d80af8af351c81a7f8d0dd671cc20dbaa33db5be6e2ed5d1ddbfaa700f89335144613a6b8f506cc4761e1ad30fd3facb854129ea7748fb4da7e32e19ecaa6768f49dd9a58c0e1fc525f4304feb49f475544931b960739556aff75d0b4e440161e12a2e0504cfc1744cfd735dce76c9b3a031087d193810e85576c6e3fa9fbd5cfaaca7c551fa8bf17e805f2412d49cd6e98dd59a0cef50904445a737409ada3590406e6ee21649334f884dee8f98ac7d78fb1a955f86651b76f522cf6bbc73a76a78c2438e0161f8d52cb31c6abe79698ad7a1f500862f9dcdf8e4c8cf75df25459ef3c1f2343a3ab1901bc46d22c654effbe99d083f402820181402010088917fa82c4198dde3ea773ed8a01cffdcd36206bad8e4dda12daa31611a72648a11490c228189db50dc49ac250d425581fa2ff263bd0fdf32d604843f7816197738c4244b53cfafbd9b620a2e885c286515fa8362f2ba321dc0c4874ec74709bca3b18f60c7cb2dd009c4599b35ef6b8aecffffc7da741e78f5403f805f433697e398d4b551a9b26d464ffdab4621b84e387173daa39738f95cd81029c8ed1d749b06f3bf826ccd70a2605af88693d1ff3a375a98e3f33e0120a74c880e0a06ff1562b8946d79a1925b3f40ee1b25edf9496b0a97723f6974f33965fa701c94d0e7d63aaf78ff052c5cfd7446e228389d451a3d0d10c6de4ed0e4be1b9b68808e0abe580ea5107c1a067e77def74dfb1d011fcccaf6fb53119df76d31f9d3f478644444444444444e401fc67b5db9e5b00dfe05df6619f12c9ea4f2a68d8610a2c3d57af9229eaff042a3bcb7c65bd19bc810b3ac80efc51308601422de680777248ece6e09985c5f76b4d9c5da2920c2d43a0bb31b8aedc14e9ffcde2060373f3db2c33d62fed5fda7ca273db21743245c86640952052a25deffef508974b8ffa70c3b0874bf88323b7de41d4f77ade3ee10a74e0a6d949b2b3c2b2243fbb6c7fa5779454354c30ec872fa51b1c8efa2b6dd06d6e44444484815e9f33b0c62fb006143db03a2fb09ae0e84fc716f66d5d1de4f6732d0cd00de994302e905863cd08aa565683067d6615ff8eaf9ec2beada704a2efa56056c1f8377cfa3f6849c4df84fcba1741212e0f2ad72f7dda0f4b725efbbc4aa46c7e0a0968ebbac78ef9015d2bcdb01d357513bd2695ae4611e2fb9d9e2cef8edac38b387e1074e97f2cd06b1ab567839c2f412c5f5497530ed53b1e63940d63c961766fa34cc8da7148ddd7b387aa70c6468531950148a15a2b024e4d10472913b13ae108863c713c76c330f778cc1a52a0656c1f90ddce4b738b14089e257ec71821c447e173d152849dace8ce669660078a03c0129e40ebd031dba8436637cce7837a6fa9f7d719e6bd34b5853a7a6e5439cf16e19810bee06dabfc05506694935dbdb475cc87467d6d13df5bcddd41fc1461f5b4e40482358119e052f7a187dbb656d0425b5712348b8e6861d48cedf9d6fedc6023775d0a3cfc1f46de63853b219d461f6ea7d771ffa1b1ef28d95f59000292aef9decbc5b79f56fc5daa230f9732a4d6928f5c7a76aae390f8c587db6cd536cecf556fb26a7ac43c2cac5239ad420e741a5089ec646199d9cb48308455e5e0df68dfba87c040f8c78f892b9524e5e21d0c2ecfcd3f6be3667f16f92f8c4b30f394d8c9b5eb5f002bdd668263277c06b193d2fd72138d0efd934d3fd7a8fc0cf2e1ccaf1f9cf2553dc85aa5f2adff3403c6ee9e817584004dff84d69ac61f67d823c4b8eafe408eb06b8db75780d3c104371b0a6734696984898d38f32f1f051a18b76665a96f7d58b041da320abc9706b10006ba9683478b24ec1f185293fd3918714b6c39e858f4a3b7b9b3f0e4b2835ffd0500aa1726faa59af4ca9b486b0afc7e6cd04635976d03397b48c5eb75c95d88823f6f1dec0714f202fb5a22a804343fda8a1d36e6476d4cd8745eb427e5f7ad92920cd7c61af5e512daf182e3ffc99d130f333bfebe20439f6e63808a074ce1f7502e272c2dff656f4c8350cba8453e9696faadc70250303ee9659976c7ceb7e26cfe0346847d65a75dd448d3801de311c6946200e87b8e1832e7818d4db19ea022d63c9481c92a7be146b04aa373df84237cb9fbc47aaebe7fadcf8ec96e89353a6f42f050890be2e24bd4244311801d8a8a06fdedd7242959e9bf1f35bfc23c3a0deb136766bf8e769351c8f3a03f018e51a837355f6d511e7fa185fe8a899e16fe021dc15cc70f78a79731a567c9e8438a73f7f13d0b441613213f1053c4d59a760fbf75b18d597397ea082517cb703ee034b8ebcc491bf88b6207d043c9a6d31c93e7c608c0321dd4f9a282ff7c05147f86906ee32cf9498e8dcfe2f381f186bec0b847798ac7205f6250bc136082a68defac881e18a894758f392af05513437a5940faced4e0be2de08cc07a145c5e3fd8ceedaf2ae7c4dea7f894d473da3f6cf66affca11f893dca6cb1a93dc09c40cf5a0428ee82eedcc7b6723864f07be05e276e4ce7b458e0ee83b842628fbf78f840249be6b157c7592a581e9b2bb59ac7970d5682a7d262fa609e47813e1d9349dffb7ac10fee3640821748a7594874054db789f681b8f048a2707f7f02c74735cf7e1490c3aa7302ea4c09ef06ea4e3af1ed325b501f9ea5c9ba731717cbe255e3418d3f30876041300141b7ab3fe22ff5101b391b1f51377b091d61da40d47407828b920b480d6c8d583651bc5ff0c301ea12f18b7d1e8ed74390ff5832498adbba81831c1d4747e92b0894d98d2a76c21a62f69ddf41f878fecf088886315f4fa1e835ecf63644e17660e372a98616233033df03f6d9d41ab3c995331508ce811b0b9204d6104820a2f4882b969ffb7b6f2bc803981625b4b2b940f7a67f7a68da4902f3656c6cb331a5d02e79d0351e219f92e09c180937f854f8dd87d50b816d6eafc56d9cd7fe7eea21d5617c4ca0339d8f8275f12c0b39d07cdb9c6e5b29ebefaaca0bfb9422bf277cb13ed5c9c11c719bb1a7b723d5063e5899e58ddcadf5187fc83cbe389f5089fba13cde43e9f9c27d8ddae36ff00f81e34616a96640d2d960e3ef11e0cde4624f8e185d3dc7dbc8ba2e5eca0ca0b0b3c8ccbf7591bcde4ef2080dfb6b596c5be1b9010d7f5f27badaa732846c2e42f00756e36671e377c5b0aa6be2df585111caf7010298de7038b88937f715851c95f01567a78aa0474e754535144ef0503d285a0aeacc91e1fed77084ed711dce06b21f0c1adf632ea4c4014c97d6b9c4bc5e7f1a33eb894c40eca2be8a2e6e187e549131191f4ffff1e12acf302d604f6607fbeb96e067eb1e6019809c9bedaca6add0192fb051fef1620325b36732c80b8f62a6294f90922b2f3fdc5f6e7bb6fee8cac4f6775102aaba857530eacaf3fc0d4475b4bb3e567a426658d986d431e6bd6245051631c657b712fc58f8db6570e549f343f3d0ee431663b24e39bdcd787afb1f7c2f9231e2dfc633491642474d500e26b76a224d533f129ce0f7f18a3c06ecd24297b94e7f442ffe2ad9e1e5d4e8903ae1b736f70f17b356f8a9f9fdfd4e372d672466f66c1cc3f58e595d66d1afaa380e9bc1c680ae146ac150cc1da85441dd4a4c44db5dcc024ada337e74d6b209f0f78b7d288f6eed6b6a449f7969eac99ba8419a73a29cca649b2ffce2c6e594eee0e84b4ef8de049d92adf7efed94275d39a4fed543f994fe15cc77c6cfa0bf49dcf09e8aa4b3b23932bcfa19550e87a3799ce6ed1f963194675e62f5773b14436c8221f11710c3e6f64ec17640c8a1e649417644470b4efd7939c975302fbfffc7ce81f045d356a20e1f2492ec6f897817b7505825961af15013df796206cbf3202e1171518992934997cfa2c896b4029725e0216cca3e900bb0a41c8a1c8c1ca910890a0a8c04800a03ffbd217c47727783d474ac16b2e26b2afe7afe5f82a74af3dd1277e06c37d4be47889820037c0eb7f367a079fff30c76729a0e3e70159e00b96fd2e7efb4f4e55535518435196eb83b776ad2e8d018fdf462f005c80b20c9a57cba768c8eef877f430377c0a8baa3d81e1229f3c98fb31bae4c188e7a21c09198b898aaba3cdcc3346ff5c3af57dab863edf67eb1025b88fc1d4344dba3410d1c8a3a828d5d135cd6953ce2b057d1dd86e1ec27a8194ece19de6c32c8ba697e02c94d03b0f8c0ca18be254e6d3158c2f130134dfc57105dd54f050c31e4be3b2ff4316a07bf85364b984d42739109fdb2713c5aab52864d433fa86a3f522e19b7716f48b0d544c4cc2b7179210075d5777e0555e2e8240f6ae5eb6aeee3eb6d20e968e6e8a3604766e2e8e565e965e817ab65ede8eee6e60776b77371f2f4b6b1f491b1b2f5b6f6f9d2f7ae7c1d5daddcdced1cbd5d2c7d1ddcd1bc7c1cac5ddda59cdd7d5912380d39283cbc6aad3d6165fc0ff7282cfa0e8590ad8dcb81c8b40a57dd55e80f1ba1592742dc8080abbdf5c19d8287e78f7d52ab6058e5dc37ac0c11874828b12c1206ca9e0714463c3270ee0fa9fb7aecda34a8e39baa7bf472320f09ecdf95b15b9b006c23b2fcded2b89baa1fadb9908e4980b6ec65a8445b2d0c5c240ef3fb2e002f48c4a021e56322f90732eff624b32c989e35c93e5f8e2ec379bddc0c6255bd14da58073c75f7fbf1fc16d95011692de47f48fe7352accccfea335058309f42a2d1c5f935e7f549d84e3cca8268237c268270657e8a61fdef1d63e2f56864680f9619d03a3656c9b0e5905efd6f551636491040b2ce888b0b5f906b45f3e76ff5398b715f673c295d2c8c9a98ac86293eb3a0369890009cdb77bac00d6dd8363c0a5787db2ec9e16493b2030b7d162c22f0cdbb06399f901a100aee4677415c3561d13365030934c95af759766b42e4626d823e70254937fa6f9c5ac2da9b1e52620fe7f6077530041f9b43a35c726182ec4070a4daae515967729e1745e03316294f58ea61729edad7840112d05d7711ac543551fd40d183e1fa6b0dbe18949fca4eca1a9fd26c611b30187fe526ddb9fd623a2ef10b3ef51345a1a9adca4ada6f736487ec087ad717797572d74c656169ea33cac6e0848159e57949d4a3697aef3a0fda21313958fd112898d47121611ceddfe2ff6083b2fb721f5fd895c851916dd6c87c4b35a1cf04ff29f6dc0b93642274e90048f6eb607e9eb05dd5718ec6cdb1b0f0e719f2d93d56d39a877ac6681ff856ea5293dd8a82daa9ca90f86f24d63e7ddb15454dde3d9b4a672a9e27193eb79b8ad1d3bdca1440e8f64013a1fdc98359629dbdfabe41fdfc9889fe59a6659d600d33844ad452a51ce41e2d6fbe7c64ec9af28c6fffa2ea9bdd3e0e05d7ec6211e5af89737a1e5bc51951203a8dec3454dd9cb01a7eb9cdaeefccb2e0d912973c313af6de3a4baa8bcb9e392c7d6e33c872280bf79d4aebee2260704073f7fdd869a7bda301a6668dedacce7ddf951eee0799400745a710c90bf229780fbcf02a9f4a8d9426ed6ef91d67e95c6a2b8ba157175cce42abc5e30b3fbb5a29a09440b2aa38dcf0219dcfdd8eadf22cfd58b17d596bd6ea2bf596dd6ca141791ca4278b1bba77e8f22f9192331605761ff3679c8fbb5ebe1c4ffe660a15fb14166a621fdc4bac2d9dc1dead97e5de1f8e3699e5e4362fda7cbd270817ed66a84bffcb429c5db105eba505fbdd366a83108c08ad5a18b1c7f4fbebbc1067daf4bc6bedf5cd324536aef5059d5b15d093ef1cf0fa311003ec38fd26272ce0545643bee7de6a5c66f90409865b46ee1da83344458e2b6fef7719ead9e3de44fe86deaa6abf1cc215a2e7fd89d1396ebd79f0bbbdda97824c12fa3f5e8d48b05686847e397c46cb1630c211f05fae562565bcb133a750f23fec028e5a3ef98bce3f5599603e3ca4faa9b9d45840bd1fab4f74b8b5c5d7035a98f7f6f0bf4dd2440a10fd957851613b45f3e26c237ff7f71fee507173e59a106b1845bb522b6b9215929bc4ba36c64bdfcb38d06806509b955399354a8981efedfc07383b27581a9f5322e65510ffa0ee81dd617df1ef831ff2d8714d5742448ddc121969a042a144714bcc64dfe5b68104d3622dfcdaf184bc9fcc62d85aa3eb014a0dfc2998652335b993e1cd13233adcd13a9bf87a61ac0c0893f424904b7f26ca966420b679590a453ee4b7626456dfa3371d188faaffb5a40a1c58324909d7b199f14a53b38d367f9472237d978b5d8994abc28013544a884cce0740a3750934bc85e0c7e1eed8922511ed664dd90c135787f61c04f20791a973ffe8ade596988b034abbcdb5d3d148b208de28f50888ee5f438d1d0cf12696c30806562d8e891f6a4f9d3e6a62a97729a6cddec777ba2e41730ce953c5ecc79f81f5642fe9d608e2742b969a2deaf6dbdbe364800c7cd39cd2b83406dbe929ac4f9ee4fe0649d824ae78b13d6ab018bba01af04f98c7306a6a433a58f62aea8b611019088e81d680fa7c7b050f8c18adacee37fedffc1e61a77c25d226a64879818020324fa677b8b29d1af0fa116b2c3c63cb59a691e26ffd6597efef9c70b11a03816005891aa72a2ba2bb93272031a18f95de614b8e17ecdf384ff292b0875cd9fcb3a452538f85e5ed56fe65bc2218b89989b837986f82fab16c5af941527eabce7325c179f4bd3098af27ed9a40f5feeedca43f3d4f0c1ac91f185544864c7e43ad6638244005444ec2477e7b9dfbfc97357186f0ade1501276916cd8a241d188a94450bc9f8806c73917ee3f9e4b229a7dc2c2fc1d9be5ead9b010de736aa00db9a2abad48b760f3408ecb8b0abc2e90bb81360c38d9e5c4cdcb7dc4953d4cf180152e470bea2f108edd2d86dad6f2bafd2b09a442639f2351a988daec2f9468f530aff5979040d8ef084cd1de1730b1c20194af50bc1cbfafa847ce70e7614b5d77ea07669ae1075404e5a3d9ce240e0bfe30f382275e8100b606050ba070ff21c9d94a519c2fe289cb099b56718caebc8af797b5b1df70f25f827a0f06b54627f2276e2ee9f30a59ed6040173074d3a7b10a788d6c45d9e38e55c3c78bd6e1018e309f64e8a12abbae0e6d4f5772657f29bb85bde9ce8f07f6d06fe5b02ece78fe506adbf0b88f26d787d3bd7b0b5e7eda9ccacc2ff37bf972d36f28dcdddd40f4aa2b5f10ce8db036e9325e36e05e50a0616cb1c197b74b6ee78cad195e860e788d7b97e98455b4df83b085f82a06457b320158eebf926a85b26d42589b18015af450aeed3b6189dbaacd2ab4f8b92d9a16a6f41c09cd5e61f67c3c9f15a1b4042e514313dec191ec9d79e718d6125bcd1afa7b064d3ccebf3961b49580dfa500fc4b5371f9b6c6a5648fe0bcea1d8fc9813b092f89fff4f0ae6b2d38ad10bdf29aec88d63145eed59672680500310e21d675789407ae3e6d860cbf1e3a7cc8811e398739ca535952c47f27a04bd355f8151a2d48ed0043ca27d9bac2e05c7014ef95fb207880d24e4be450bea998af14af977251b760c2e30d90eb89767e51da91d80ddce7a3e8541bd7fc46840eb1a2d8a4551c2b0b0d832329df122f1d8bd395508fc614e0ab66efbf0371a596ce2f7ca1ffadb1c69af9696ecbc4d25fcb5a10f9dc58e5183b202c4cb4721732fd9e65f1f23fd6aa69aa4d255003547ecf0baa5c6aa6538698ccef2bd5b81d4f340f58210653984dc083955f497a86df598f73c49b8fa71fed24ae5c1cb7dd27cca3f0ffa3f07fd0c76d82d75aef1c14c33bcb31973633d99ca956badfe51ad1f250f38a1266038d5a9ac2c956e26117bf78b47f4126adcc725e0407fec7dc341281a23bf35a3baa49ffa86449807c94f85097fbab05f8ae2079ee62413957a735959469cc0f4e9ce96237e1300199597ab374ffb71d444b69359c9c36cd427ba0fbfe3e01bb85ff363a5a0f0ad1e78437cf06e7404be1b789145c734da157367029c89e3d264bf2622d43b5fcc7f7b1d2a2fd6463461bd47145e08dfb372fc338e683d71955bd9af649487cdae9fe3bb9f973d73a6ee77a52bb159a785f2ad9d3e914283df4a59a786583bd19299af14268be1827eaad37fb3a42b7b37b2072078d11e7a59c4071cf2aa2afc0e41c7c7161354181558e9912edf283ddf0033b2676e7e64e121b27c30bc74a53c6d18c60118e0e64cfeaef17d6327d88721affa78fae866e84867a06f85ea954be05c2310a00224bb52fe8221628e24fdb0c96c177f08ceb104e3912379ed68e1a713637faffbb1ffa2b704f14add2c18f643ed396a8a9339859f7006c62f0545c268e22b283db502c2395785dbd758eebc7d6fb9a5e7d7e8ed1246fc7f8efc32ee1550288b903775ce2315583d4efe5c29f812637f6a03a070b9db071c35a61ac439fcea7c343d6aa573b97315534ac7c138b49a239e5d205755e02f4249a05f467df289c1eef7cf48a60a78de42d8b36f4d7dfbdc80751a82aa3d68d6c06aa2398748740406ec3b8426b0aac0eff73c7a13374fcdb78b232adfb7e63ad71b34b2b0288ef4955a42f8176a1c1e4fc01cfe270fd130ec9dc6f6467336c3dbd240c6a28ae8f42d10767fb14f91f824590171120b8cae1817a30dafbc53d4a36e522b0da9cedd696dc687926373ee8a260d6968af017ad282dfbf25b61d7dab220d53714c4e741c9a61a470ed0e609a7ff4841123b8ef81d9036f5afc73a02e2460bc15d88efe444392018f24e93712f80af642eb5743b9b4db1812c7fe7c932327cbbf219b83448e1a7e0130b6770fe294b82f9b9ed8fde7d32f4c1cf3c808ddebc658db0d32c0e30b01c64204700efce1b969db5f831b3c4fd0f8065f2e4feb91d845ffeff299e3b3b2e4082804b08a9c105657e3a85da14cbf7d374119689af2249fd4acdc9de11acf479425e504cf04df5220e9549d18f70d59fb8fca8fb933bac708923897210fae76d41b0566f7cb9073c86953605396ddad89a6dd1b886b88bbfe10ae63452aaff1a98a643ae4421cd9694dfc074c1c34e677f61c02b4619ac4846fa890e93727e0573c8e70ea36579cf5e5867080904c696665d6df5231a0e6f07b4ae4d62ff53f9b5b99067d4ed6bdfffa13f9fb1ef90f175e1882c72d361e7c570bc961d1c853b75344f91f1def907dbbb8a654d12d16df6a8b0e3ca0a3107336d1b9ef5769f851878a088d0b3b07f0b1f20536ae33504b141605d3f6c7f1e28fe41acb87ea0a0092b28423fc577ff43252ee59d036e63c050c8a2d89ebaec3ba83f4e452c7c735ccc45aec6eda96ef1f7277880526520daae9211d7e3db6fec8f1cff4213d3fef0ac2b6b35f3b36db03a59ab675000842cf44d647014bb707a42d6723d1d3c8b73e829a9d0415ca26501f965d968999f882bc4e8172e05d88ea9b4732661366089f8ea5b0206263fcc1499c1dd0d96a054651e0b10bcd5553e933fbcbeef6e52caf12bea27caaaa9129ac96f4918d3d614995ffa0f27de2a7293461cb45899f5539aea39af6dda26cc3b5474b0dd761edfb4ec860a7006c4cf7686d8b5778bf261e2c35312707cbaecf396ef8fc24bbdc5b3723589734645266286f361f772c09f597e5ccf86ea4ccab746fc58bcda9b0f558285e26d7beebdcf171b1a42824e16c83a6fc86f2242dfcf624bcd58f8c1c790e8afbc7d96511b74ec20d47889a30a63d2e3c0044801bfbe900b7f6b7f4bc9d43e2b260f1e7184375e49c3f4b81b61aa050e4627c741c6de80b8e7a1474f6aaf3e23e4571c949addae890e7100a37630d5b3e66d9ec8d1412958ee8c13e21f908cc2fd6855fbee39ff5ac0c831792daa559e004e0117515a201cab1da286c1b1496782f46a7af821021d77329a8cfb9758a5681eff92a8697adb5a4a59fad1eb79c8a96ad87e58cd1810a40829a1584ac2305c98f405d60d629d86405906dc0d229b0b6180021a8d591da039730b7cc6063041b9f19610b4908b9d2a030107c0c05af47c8d6b1cc7323763f6e8bdba2ac3431bfd8b5e205efc3a1eaa0bbf6d02702bf46c49d7bbfb8ddf8f57d1fa940ecaf950d0c01e44f88a05357a23be0348609b20f20030b5bc641eb0809994e808ed5a805fcf91cc2f87c827a1dae8df67f46a67331985b48be200b6c9b208569a6d30162e2b6e39b43c6d6ce51dbd2cfd66b41044d6658a6aa3dffc4623d4820a87d957e6da4ec32485a72b402ddf5354bf9d60cbd7e89ee3bea828fd9a480eec224cd67f387e9bdc839dbf6e5fc1aea86debb0c46291cd185b81787d87f1dd838627d72a92e8704f11fa8012ac31297996d565b5c91f6105efa061d2308595d423e83ee4b1ac31abf98df8b27905d6a56a3fc40ed1f61b375223b20032d7fe89a8403c8fa6487e1dddfa324a177372e2e993edb8761f421cd5ba8c711ab6f3d96ee5a0f7d09850622d3ea7026745e2b35be835864845e958aaf718b349ce788b060e94948c0b21c056b25b518d57b760e3b0e64100ee12020597a1ea72c18faf26242f4af761a8c98d3450d1345e0ea8a67120f50d0a3c7fc4cabbc6a32c3b35cb2c90690be25eed391e821b4bb0b1d2ab277906a98b59672ff5db00c59fccf14695c37da1d0dca4c9c423299665799cdf4e0f530d887e03fca8685cdf4d68f89d7e5fc3784479670cf57c6ffd76ef5c3c53f084a2e60f651f79ac835e13c30947130f69fea20903e902f2c8866b1a5b49f0d4571fcbe27ae4a367b8553848958880068b578b1d1106fbe3abd50fe583d71086c28c8b142ada0de99ade6428c1f5ebf006c48261b68f71a97107785f211984c73d02a92ef431d3d680ddc9c8d113e4d7ac22b97bde591397e70d443692565284f04a79c0d75693bdd133dc794b2d15c52c39df1a5a973999946bfdb61479fd12fa4d46c41cca4f029ea0df9913e29ffbcce4052d1874b9f985f451094dc880979cc9c8311ea34baf57500ad81e7dfc33be4d7c404712fe3f6dd3d0a8223b2074abfaad6fb597e1e76a98663bebad61a7d68f144d7fe0111d2f5ecd845c4df1cc6611a61ad840372a98fa4675db4a07fe5dd15a934fcdb8880fc50af9e472c87f12ba6cc8a657ac7fcfbef420e4dee7f928f2b4317837b6c7d3db0fc6fa6e618ef697d43395b01cf0a9fb164f5e2a11241f2859eff1698ded3d194506cba489986f9c18117755b89d8395c0d06c50fde7619142972a54e5d08557e7dd58a70de1936d2341e1f95f7959f102b2907c9d73f11544a26e12a330a7e5180282a12f152f107fd6fdcc391173deaa6d0ba42a397663607b1740f8d15ce5c4172c13897bd80d1570122e2653c9423c61c5b56faa1277acf0513bfff12687b96ed70f5aef911dde5998ebad544025dafe33043f1b6be098baac331edc7f754d613a91f3336e28154436060a8e1e29cb5ae9ae8155f5ae5a9e203fb5873e8ef5725642b48ce6682ad8c6d3040093b7f4a29c1506b3b8b5eb9170a4bc9c590d96eff48df20844bd3f1f4677089cf0c46170a7981d1882a6f61cf849833d7f4a16fde881e48864f2273904dd24805554060dfcc63bb7bd8baa95bdb5aba653e4c88c30bd038202b9400f83896a0946310727fe27460776c8b653e4c39a0b1fe88db6a6499ff029f0e910005414277fd46937fa3bd5664759ec60d4a4e28f014d2639a657e74d13b56872200ead8c1fda03fbe62577471de185e2ac21e33ee8265d38ae75e2c6197323c795b808d4116c283e2963059284d4f17b2bca27dc49a6178c8afa0edd950a6af9d5451e5b991f3b712962a84fcd591e6cbfe9953f25abe1e15c797b9de3404ea815607eedd2fb3e1e1cda92bd23bcf88ff5679c76ddaaac24a8e8fa6a1bbdc99e2dc6f06b2da1868d656a6afd0b144a7b304342aa2f43a183849b37f5cde43011760f09f6990171064160489cc9dfd9f0d3105818f6a3e1500f81eaa40f1ab790196eeed382f83b74c76fadc9154b584d2e59fb821b32d5120fc96b9f1049a5bb4de0cdcb1f41ecc91d9ac53d57f379f0b4e6b5336a03c1b3eb115439d3b35fb1e2459a35de1b4c70f45d31972cce7ecba36c1ad95f15dd57f37e085d92e15adcd19bccf1e309a4faa5cd5e3e8600d49accad275f0c67c91457fe99e3271a7951ac3015a5abc6a3da7a29af42229ae66c35d2f0ac5fff3d2e9c0f5e713435583784218cfeacb1392c8f5e270bbd3093c2601887562e803a2ec1906276986af642b25cf583a3ffa412b7790de09384dd586856c5aef1d04382d89b95d9f180a0e4dbc9882e192df9296c2ff597f241ff6d32d728a8922cc42daefbcda458142ac8b451c5ad19f8e8031ec171ce3450186a09ceebeb2c4c73659fa9cea099aa45fe828036e148567bce48147f2c003378c42e5734b340cfc318fbacd3a1f2c7e32b46e08a7c2ee78edd887e2f174622bcc0d724740ada3f88900e4ff7cd9fb34f592070dd12fa434e343b931869172f3d9be6c34598047e539e305947d6348164afefa58dec77447162282b7cb44fe9f9d7e9b8e9041b9e6311b308e82827be0e5f67f3c5f519ccc33feb336276cbcd119b0996ffc4f61cf7cfd7436bd286eb59f28f9ab71d592b52bf135e2476714baf24799c1a9915566025f99ed52bc3db8a222906c97bfd4cb84f45186747214354400a1e5158c524a0379ea394ce8c5c5b90927c4969d95ddf322643af0097846ce8a006311854deb2686f399d273498c81280ecb573babf8439bcd842eb308db94b319045b26c54e25bb30d22a5e80e3786ffbc365387ad956c71aa91210540af3560eaf22a84906917e2e0f53cc7f35087a5d32b85ffcb97330629a05b97ffdf9bb8f9009939503a03eda09794e2f97ef9b759546468de890d0ff34a9cacdc3e765fb9bb4c26faab10726d05b0c5bd47988580db1c063b6c1fdc2eb9f7652c84a482dfca574eadd573d1eb5d9c58b14a11155a34f7d80d88e11b37dfff5c2a408ec9af1a9a5387741bc96a03e18f9b70d9da062d2aabbb1974f0b190169c66acc420275c1c8afc6f74bb9f5db9f4efbdafa3f8caf8234bad576f2356f2ee0fbe6829c7b579016a09d6421bde4eb9efc1a77771d9a829c691c20ab4d9f1d4b9dadc089317143da05ef95a51c385780d25f68341db0bf3b60c27716ca9f338a08e6a13caba0f9cbb4eb2cd8900623ffc6a1931a782b3788574460c33925ce60165c656c035f1b6395d8dfa5f8fbaf490412baf04c0556c301f08b48934f0a0249ce6667d40c5b5a93b79ffe3894739e5788060ae02e9c62006177f2d08bc437bc902101871f7e1fbc3362c2a7b9fa5e8e70d7ad6da75ffcb77aa021873ef5bf50c8f35d54798bdd716c8bc468833935ad7a5311dd31640b7c4e1dd2c24b01266508d88b8921309092b530e569af351b90796354f8ece27461f125af2d107f835a79a4421f39920d30671329fde8bae27cfba04edcf976a4f573579ab2cfea91eedaeb6b93656b4d9e04826c194f709ccf9306ad0b0839a8ec0b59c38de3901b947286966704e5bfb014210e38a489a907ed740b259cc3f02fa5caf7206cf5adb194e739caa060685081db780b72e864359add2294e10a433fbd408140445fae2f3fba8bacb0a824a4c881077bd174777fa93c9d212b2b8272fe994963f68fd4eb9ad689b1d796a85eb45d2fad6165623bdfc67f5aaa3fdbcb689df47c1a99fb68eb11803a9f54150798f7e563d4ff44ee620c4da4b75ff9de55a916f8c4fe043fdd384286b0e2cb5b0fe81c529c6d7d17cca63ed2d5ac425841011fec65d35a9f811c925ed568a4b87e44c180bb434050c8b3939527e7b82d4800e1876b140a5fe13df3c0351f071a6ce25f9578a87764b487037f201001dc8871c7eda2a1ec7401fa8eea01d8a37ffb6cb985e2eb675cd4137961f7e10d0025b7761753a6b7b09107d7cf90acba3f3321b3ec3f5ece9dfbadda32520f5129ebd26bf1bbe999d60b1e970d7c78cc8ad3dbb1b57a6185e04e3b172db57b5f3e636d2c1a65e46716401d3d0fb61a1ecbe6b5dc6f766bc793dff4bdbda792ff4870c0bb34dbed67663fbf690df12c2f6eeb3f5cc2e8a678ef2d8885bc97ee36ddac6d5a298a47fa0ecebfb57f32da7758b1bbe90ffc2e8ad301eb7400e8089bb37ec681f057bb9fcbaae997cf444513cc0c557de3f93f8808be8cc2680d3d7b57dc4bb384447f5390bca2f9650a97e3a5f8f98f8d0328a4973abfdbc2fd130434a42b2b51963ccd43c9595658d26b546efcfb039dd53c86dc2e33849efcc9a5a0dec0b40cd8683e2afa96861d6f05be6c3be6b6e5b6233e3fe5e4d93c771a201a930aaa0312ada187de5ecb2be57a4c0466c37474afbc9643fd283d5e72387c94a699ebb8d437c41df0ce15f8c50be2f42f7e821bb04283d001eafbd2db330a1be55f38f6cd2acffe41b9a1f9b82f7c82a1b7188c9e46521eedebf8375b6d06f538b541123f17aaeb8f50bfc08345128ee8b18f8bdfe3c4baee8ec6ad27b34457347f1cc3cf18a74e1be5b7d6e43f48fed9c3b476002c926e8d6eae9dc73134f05f0f6edba4ce0f049802e99b87be2a0c88e3e8785374b78382772656c2429fa02bc0d052794a55562e62ed6c92418d4004e4cbec627fee21ba5f47d9e4d0a128d4784e07c355c731eff1f1fc679435bf288f7b9d9572a8c0275740f455e770e2a8dce7a535a169a8ee6893ac6fd991376c4129cda701c538f8bfffadb89984cb9c9fdf36409fa61e90a3cb381d69b684a5051609a003f4802a039a171d62e692b8e1364cbed88446f3ddeac008ae7abd0e0898d47f51522fabf6d1f5f816774fd0edfda4e0a97d8d302ef3edeb70b65a7b43523f51552664c5e9ade4acc4f0e101792400fc047744d719812b89b5752466403d5d5ecbc1ad119fb4d6d2ab9c6eaa7c9343b1bb1999977bb43fff920a1be3c88388bac6bca2d280f6e502ecab1c1113f822df3786913603d030e8b11f7a50c905bfccc9ffa5b8ab4b9a2bb39ab7d5ab6c295744fa62b761de3a5647efad02906ba9fe249a63167855ae8fa4e407cf097142e952a19f0eb3d1871ebc304cbe40bdb169597a667d217b6944d512eafef7ef5127d916c6cf564947fe7fe6d5d5852b523e2f20d1bacb399dce30749dd211a4a86e1bfb954b41d563e2669e3e26a3bfd6cc6348e8a2720034670a39dc42ca7c1732e66ecb8a4a8868589ab5de8ef967db29dcba120861e15507ae0d11fa61216e737ad7060d3d4f94de3c86b41e51022387fcda1beed919a3afa98a2f1b22c081cebcca73ac7d911fcddf555485d57f0fdd9f017a5a951e4d5e15dccaa4f9a5bd44afe6b7f654ca9163b80cdebd8cbd8c4db109b86f9f039b9178f8953a93c9ff85ad7e02c3efb3f934b8868b61c1c628aada27cf526adaf7ff79a6c1f40311753821f19242c19bff21d093f0e1acc444412b72859a57e382e9d7e6ab7ccd9c8a188dd20ff526a675fcb75e52e50f34b388af3b2cc6c734f4e4e327e74215fbc936917555ff539f0aa061d04b5cd45b0c1fdd7edcaa7fe968e21e40631fba500ce6ef35f4dbdd7ac6d1dddefda2c40d70ff3fbd8a3417eefbb1e4c78f781b2bf5f1d17e4cbde1ff4b3a2b942fb23168b967c69e7a53d35251c8d4f199c05dadbda230094f3035f6b98faef35874be9cf614c79a67dd9c05d4f9a48658806eaca7453671c82ec2a549f0b7e82d663dc8bcc0794e7a288ef558b282105b00a0cdc81a28379f327c5375dde440588ef7f727b1b79dc73b3cbca6deedb6537123e0e768b1bb9999971d78abcffc9529d3e6ee2868a7e2740e1dce7215fdc6d084936e7a87154ee83044a0ce6ff297ca556ecbb107304b200fde5352b1dd1f696dc9f0d06f6ae8694c92c170db8803cc969dd50848cb42e954bf1d4233d04fde35dec4e96d2edcfaa3741a8c7e143ff3194079a02f508e68f47606abdf237ca5fe4bedb183c688a8b31112978733f17a202b8c557bb44c8459666272d0e12068c917a1dcd7172728224ece84bc2a657d3c522b5369ac2c6d886b696bb03e0b650a51657472d9047fb4aacbeaff7fbe27dc864f2c0b86daae9bdb993c15a75f5c0d51a78ec57726e8bc2d9fe2b6079bb2860807d4a37719f227e9c21aff664d36db2794ea4b229c76511d97552d7607ee76393adcf7f6bcf500d181b0c66204383bda2e3ff9fdf54a01afb13eec11fa1c85501554315f5a366c84ea74c45f55a5d38aa1d4b856fc13b3bb5d4406f6c15bd8a5935a5598d7e10d6f88fd001a9c49cfd845b36be1becdcb82ec638f87d978dacbc0c39d59f035fdff7c7eafc345fa3ef2f329e5c3157b6113d40397c93237afd9798434aa2f2a3f8d2840378efbfffa3ec3305fd06e237cfa817dcb05ea9b9b7bf1f91958f972e8737370abeb0bf21af01a26f563e9a2068308aee3c3e25004f0bb390456719094798c0b8ef01269c1a943847d4de04795fad586f103916e123910ae3541935b382dacaca89acc47487715a28e2489c54fc64462e32163c08e7f5320aa36c0783f07947a459ca963b484a57f5619add07e5af9bf978711144e54457dbf34cd25ac67e85cd2a44dabda32422381a16b6e2d809c29c0f5a04d1cd6cca37597a48f235a7609a120b601c1675d358d37200e33dbebf0c24ea3fc8e115f2bd0bb52ff1a83735f0e102f9b750999291352c08563ae8e63de6e3ae8c03dab479de02718d705cb1ad0f440b01e2b61b3db86c04095527c5d7114131b413a4892c02e29d01f8f34c19c80cb4f85ecfa903bfc3d8708a97cb6cf5b4271d6b49c76cb2caa3e23de512503a44e8d5e5a777a0604e42ef145db711fb18d36bc23cc953f2aa06951edd57f4c10640c22fb5a09553c0702f3b044c443be014067bd9257cab31744c0b033e1af46eae7d642949c2a24d0c3287409ba318c4a5052a3583a7a001b181dac98d6bffd06e4c994a56b413d366cde2830ae155eba06f4a95f3f90d5f06a9567cf6878cae1dc46de5972e19cfc9cf64aac68a21ca1921ffca6ba6a9b2a1dbdd0789d99b3e7ed66cc879d7ac5fccc4d95cc999198e1c63cf9534986ededb1da5a7c61a41a5e190f03fe9ac6578071ee5c34d963b01b1312ac6b6b6cdd81ee995df3bc9a398599902151bcb686dd03e9f210d8d1b2224a4a2c8cecffd23d29fc60cefb17e720b7eae6336264dcfcb269648c0326f5c3881e888c51743505fa0d65c092fa661ada370eb7cc90e5b8df0c06256c9f474e982986b290f40ec4f01726c2e9757deb3eba05ff9fbeb57c8209f9d15bafe700d25ac795e1527f6346e3eee1568b843acfe28a9ff879f57fe6e0211ba836b8499bf8c2859fa718a784a78a17520fc9aa71c4337d46cbc43d2b13e74d16cc7432ace31e44e137bbdf869f531bc8470fc20fe71cb53cc109e1c5be9e141c077ee379976914ca177aa6d1d420f3ae7fd250c62858de4ff99904c124852dfe824fda28d88246c9b5d804c686680a60e8be637931a8cb7a80e190bbf82647fa72b620f5eef2308d17bdff31448739092d1522e9acaa748a261df7b8122c7ae4243348b1edebc510ba8187b86f120cb08efdefcf6e843229cf1802d1accb8642fe6abed2bdfbb3bbb88b5e9c83efbb2467fabb7113bc57721e9eadb0248d7b4a5e3be9ad78ff62761a5ecd3ef36ca56d26b800471a23ce7e72f9621a3185c6b3153cd7b55ab8fb2c76b05b6048ed9ca4cab355d7d90d23d0c7e55bcf3e59602e73c007cfd65350a7f64c14bd70f0eb26d434b6dc83e7b1f1653970dc13b548565868ebeee4a50cff0dbfeeff8e256af6bdcbbb8d12b3082e4203e9666bb0ca98870898e90be762259d41c305028edc198d4678256b52e26f36d38305073eb5f8f36375fb883a5a2df03e49313c82723d280e6fc339c965bce31b276c1068863b965d9b489ba8709ab28be73de39d2ee67491611e303cbf78763f7fbbe487b44f12b376dc9845c481c8be42d5f248ad3d160ff908b100064c9f413b2aebd154bd1cec175ff257bef3d7aa9d853f82b8361419c9a135e2e400cb7f1f79a6f1be4fb667539901334b41fa9f33458bbfc92d2ca982783814493de19ea4a49e89523b50da6d70a60dc702365e800922eaf49565af03b7fb3bb9c57589ca8071765f98b994f2b80de5419ad018570a17182accad6aa3e92adca725562d390dd95f3df0db89c2c4422c80c7b21a4abd380319ff8d3498ebd597a0778385d94e7db75ef7aa1d74d0e3600770815c09417c5ad812a398c006d7f868a8103f47250391f76380d413ac8af320bc771673c02eb492bf95ef3bff18314d063cb6fcdb0ed209a8d36c0dbbea713a582b6ab7346cd4de21fa6f5df55cccc4a218b7b080d6a2f36253e276e398b83bc818a318c39b0cfecd393b3064c4bb0acf546015172f64ea5eaad1587a8444e7f19c74bc2aa4eb9e4226c8b6f9cc7b0054a8dc731c104d55b1231b534a91a7a3db90b86cb1abae88de9287a9e3710e0dea93759a55ed81158197506c27ce622b10a0d290cc26a586fb7cba878558c35969b6ad3266ab5232227ea7498c71bbe3de823a911b753011d0340204fab2baef0fe5af98d0e78b0ef401d600fbc4ecbc7f03b8a861487e5de919a821024812f22be9b89b477a784a9aaa88b18caebe80d9fa7e37a9963e1b80f8d3e7290da085e9833d5674b3c3beb91f87ca7d18b0b0b24de551e131fb336b4e85838d9df5045ed06777c19c9010519c0bfe98ef38c97fe61d5992f56fb830beb085acdde67faaea5a5f5099006e6f28f1be26e2504b0140bb4dd55f6e94b1ea4c1cac5048ce908552cdb5d906fbcff62c1f1bebfd15e3b74264ceab0b34889335d4649271859f03e64f6151f976ac648ad7b21a53ba4d244f462b92a726cea74dc67256bc11838f726141309df6eb9424c601befb37f5fd7503779ebcd85d8f363929c3477ddfc4cdbe74c69e1e588ed637f601a128e8f5ad3144b35b186b71776d5244bc28414a4b94ba6a6434fc34b04737783df002b1e8db64cb4b5ef28b35fca240ac16bae391c33fa73b2813f0e002167aa952d91882556ed04acf7800ddb648a7afe2e04a224751fcf17c7d5382eda97f0a176d7bd9d774223176cd95e2bdee4d701de6d885a088cbd1458aa0c9da09f7937fff78980ab1d15a4f29f8da263bcdfd277cf6e9483ba2654fd1eb37a4d35d487b3f055b2d523874a0647e912b897f88eb1aa15a90797612f77cf5aebe5030095207e0a9e6392be3324d0ced3b187269517f6dfb041e7bc704406f4d7e07e45f7f7a74c5afd96a5afdd2ff6d2ea2923fcba4a9861041e61d902ef82ac20839b2c6656113b5e45f78010d8396e29f4d1870e7bae02df15f3b642fe4b9a8a5d28c5d7980f65b3e7f38f20f833f45800bc2207f6340ecd58514c6f78fa6d929ea32cb6cbf944818a6fca8af3c9670cf6e8f619082b202d764a6f1f4ee3f56539b8eadcba2fd3aaa2925adfcf9941ae5c3f1e58806a528df0da4d32da4700ec3afe13516e859cf2ec2ffe4f803436a0e0f25c815a15fcda7e13ba3f127a4c2b9407594101a80199bd17f3e71b183417a6c599dfc8f7447485aad6d7fb69a9e08b69b19356e6e0f341e0403028140a064cf11705b8c7e7494c30efbebd304b1058a2d7552c98dc54caff54e5a00bf447b108febe9dd1caadd544e7a1413be06b70be93cb9d2ba48d39909b745b4d9c9213cc8d20cdbe0a15bda517f47480f1642699de2fcdd98180203601f1759de68fc388f9fb4ff4e726e353e0c7fd026669d8f714a569d6a0cde7600aa19015f14459251e6b62e89dc3ee5b1d943c9eb7e43088a528b8a8f84c9dea1124adcfe5822331d248c2ec44c4be0530366f3ee623db4deb201f7fb08e4b4ece7e5141ddae9164a3887e157cfa327586f7ad377b2baa31b65aecaf2b3cf7b55cec8ed129369c29787ece43286024470f94c96573f62f5cb7cb649bf7e061fd1ac9dafe97259e738517f3f9f6d7d724d64fa40c878170e5ff82d4de2000c30eebd9c8612f40794b82ad9b3eb86b9b36eb3299ea35b7ad6daa309e55fa59a03cca3b9bd7a5fe79815aeb9c9cee1afdf19071fe337d36126743df4d61d40f66bcaca1728e4f9d123b525b59771689facc2420923f64aeda7686acad7ad807efe59b0e93fbdd75db1c02755755233826126c091757f87f9c5f43a0e434fb0ff97df1ec76c15ea754a982f228ab3fbb3223f507ed273bbdcf295536ce14a5926f021fe921540cc29948adf2846c9a42030244f0f028140a0fed7007015e9ec7b2e1f5833f6a77190dae9401d0b9cdc50048039f019de2db874342604d8ab79096ddf5221de9f5ce9cce42ded606e63541e06a423711d44c5d6107cbd1cbb4e04d5cc1cc3b5531e5358e9719dcd7b2ec366c77be0034130201008043adeb3c9b66046f67e2d9dfb4c0dde4fbdcfaf52bd55fb2b7868b4084b6b24e09c959cf4c553986d10c06cfcc2dbd84b262ec5ae673cc64384aa36abda69bc8e9115df37525458bcf19b3152b3fd95f6bd7fc49632917387d5d77642a351a2903e74a0fe27d67044ed4003228bf73542a630a03aac8bc6d7eff2dbe6ae1c6e64b50e9dc28958d1b387693e60e082ad70e86d9a3151b3e3555baf9437fffbbfff612779e8e6ffda2390beba9484fd08fe871df4add0d789467d71b20d08a5cec2e6367c7930916da70149cd1a2aee23af2e793ebff95e7dcd6eeb80fc878b6665066cf71e077f539e9367ce98a6b4af39d4dc4773cc5772e1126a2ca88926bc1a74439415a3edbd08d0595f20779cbd9eec5ec49824cbcf6c6b054650cbe4101878b454ba97e4c9bbfeaf8a7fb924683a477aebd235e7e9591ebbe95f374ea2520108877d4287fb81d8e29704ab78546ff3efcc4d6b476f6ae78710aaa6694bcfb74c027580e9c0a44257d4b8be7ea9fbbdff112c12a458c1a29ad54659bc48fa7fcdde8fb4f01bd93eb1d88c2671eaacfd2f6b507dc4f21c23d66c4d12061f010821c41fc01a437c5085158a42badb175ca7fd1bd20c335fcccbca29ec9e46aa8e75e436ca18a9d9199085f241c5829421bac1735f03ed2f14a1896f6ad9399b78054c3e6ac12d3469fd9a0c80e1a8395519f173767a9b559568f13f904b3676826221d96ae458c4af12ba2358f82e0cd51d4362ccbc7af917a0d840b1a4e409cffda6b72eb023db9123a132735a247d13bab075d727502205f07bc989c2ab3460ee73fea493955961580de1465df822692fd976a45a699aa7582ffe6db12bb087642016283ddcabf333b934d0a9edbcc535b31b67b60c0ef0a8f36cfa556985b3d409f9069073f8dbf287c153e29725b709ba7989aaeb33a7e929313ab5b1e5852efa1d5e88fa6ed3c279d68b5a98cb222588d72fc5dbb5e9e4a1fafe851d8aeb51e226462ef853bd12d030e8e53129c61ab6c7b9faa37969f58bd9bd1ee9c1bcf8d63ee7f65d8d387ab1249b5cf2db1260b54a32951e7c8e61fdb79a61ba365efee7c337d7c94e589c859f01e9f6ee03f63d10af036782c5a2f5ee826ed3143e29dffd87a2e78764b3c056c761da96d04f4e8e143a21cd1f07083a03485b3ebb3c1d805692b67ae2db936ae5b785dafc6fc1c2c7cceef79b15332be0fab6be63e6e3753133cf167b422254432ca06c334b6b3c52405d0593326b1534a98c9dd3ab7b3026e94c7b7a70a6fe7d770e08a57312fdbadf25a92f29be8f2eacacc2100bef396cbdb66a449bdfa3758b50002f863602be69248dc24b2f3ecdf185a5dd568fc8408a01e2a024502ca11808240a9ad70189e471afff91f8eed75ad3f33580a0e2df95c85cbafd16998b49cc2956ee1c2c2a7766c6e5d2fb6f09e01dec5248b5c1891effa2b4e1b5bf6587f18a74ca9d1a8b2cce9e137e96fb9376c23613896631ccf307040c5de7dddda051d07d3d9d6a456904e5f3690f8c0c54a28a1cc6c650b8be42e3dfe95c8f104c3b3b3481a160bea32409fda416e10f4c82d139d50e2376e37af39e5e8bbaf403aca35406f554310406043e1895f71ae2f860e624027eeca629b4c6c5deb6c1d1592e9065d652e451440221946be35c863759a1914467b576cb2b3298273fd4d6e6126c6cad2798ab5c88c4049344b9b9f938756eccfe3c60886e30e9f2adf28cf98156e9e3781901ff5ffb917d4be20f5b823e925086414b7952b16064cf972ece7a4529efc70f245c79057d04d2fd5ff19f073cb71eea8b1f00f01c73e322097640e9e5aeb6dcda9eed0deca703714489aa85c84526b5ac363cf8651153788c6a00037312bbfde73e7d1d6d9d7348c287063f1d6ffcff302b4b7fdd6ee4a0f99a36400b849b7913caa26f66ed47ecca4ffcfd1ad48d7fefe52f3eec59d5afa0d10aa17581d903da626f38c85e0d794d7dd7ad380ff7fc4a02b23a65c6a8aeeeff55e435bc734938b5b2b09fd5e21900123d2e1d99de3cfc1f5b8b5bf3c14fb34e7cdc34e43c8f636d856b9e031fc32710d4f79956ff8fbd4bfa6ea6fea1b28e99078cb020584497821f4588bb094ebca943f565a58086414b79fdeb20065453b385d10695c1822d29ac381fa5f836d91ac1acaad4fc108443720041d52a8cb038497724b8248fbdc2202e05efab74ff8043921a9eca6211e63e3eccd8db637fe85c4900f080d0cca12c87f7a134a1c443d575c3cad9fca9a2d822e1c9dbb00b208db318047c5cd13c3656e898b4027c166eabb36b5c00d5d550a1f8b26694102acdf41b0a513ef0be1e201822699908bce7577bc2e9d8f0a70e68e5ec1b7b1d65f2707d7ccf19defbb2b61d5680a2d349193bb5ef9c00cd2768c78779f95d0d4307c56208c99133fca2025f9a642016104167032aa0eb3ffcb2fe7d75faa31bd9f7a65956baff07bbc8e3ea7426c4951e50bc149e12e2ddc2d74611e123be5c31ee9aaf6c78124ebfba6cf943ec09e27980f241f3719f127468a4769af67d31f7e35fc84f2b17b55857fa5ca0475935f0374e3e48231b4938c3a0e77b4234d3fd880ca26b73b451e988a72d845b3f44cff6cc54fcf8415871e25df351470c0810b4ba59ae9ad66c06fdac3a35c361c33ce8d6533c3eb426e1e297114bb2f3ec41417bbc313bc0e15d552423ecba8cf9f54fce339f6fbd4d99d416158f0371d09b3380fe35f543730335c1dcc87da6e3630c309fbbeb26b4598db2c0c037763b019afcd02e2b2ef7c4fe3309f197b8582ef1f813d9c7a4ca62c3276d530dd2f5c913d00d1779996deaba75df5440f733f95362a82bc2c5621e0b11c07d509747a54e8ebb69c0082ed3d0e7df68c1ccdf614b0f81987184ac078e7b6320c010ef339595b5ac01fd2ead6e79b0f6b304adc1407bc8c19854a84deac383269560a279b004f7f644fe3a775003bb37aa3c2a247eaef099f6ba22c7e9d4847f31ffbe79c45188fdfaf5d6c12cd2e7b2c7c4436b75475272730ff761e682152a68be1cbac7ea539dec33c239abdfa094b07376f9bf399b56488558a24aa0496ccf1fe3bafcefbaf0bf3d11d5f14b28bc98c7094356fa076cd43a7b42dab112d0fec1279f4d030a7f53b90b4871fc5fde66763b180a7ae889d0d40dfd3e4c2bd83cd9fe7dae4d84f7ae9f9366c6678f72c206cb36486382eda7cada5409d6af6f5df6eacb66d44d9941226c8e4f453b5162f9e88a500b03e5f6234b6c41f990396cb887c87e9e9e097f791b636221027014fe476f70c25657f439e5eea84c14cb09013bed6cd10292641c88e6fe8b1c07084f04a59e517d0bf0b623529d73c3dae9c6a70f8615c43b1ee76730a9e086ed86e7b0f8f2c804c72132fc6f97a7be8506d6e482e9cf7167af499b6ffce707687b50322f6dbe634a0d7199a96b10c431cb90f6f38474ba8756828081eba89e8f12fae34c7fc970aea8f1927b3163eaf191ee6d34d2a719c9086b3649005ee5e9e9ff8e18f065e90ce9b2873da90dd5cf66e307c32616fba7f72ad994f21ee8f449019bb92f395f0b9cfd32db77f74b82f1f1af29bcdd329f5888e824514e443a63482d0994d55c29538fc1e16812ab48adcfc7597ceb3241a1f8a433f7639050e767e60708c6658d6df48df2f237e4bd03135d090dea06aef3702a946ded2245c8c3bb85247621a3cbc975ee00c501616523859f2c2ed6294186f5aff20db41136d84f6a013271ee753bc2ae2b1d734d8e7a0bd342a1b5bfec3da6249eac25c91cd79df1960ad874a9f6bd2ab0aa1c34be2eb37c04340c5aca7b551126d6cf877daaf34e6cd2c3cc145a3d31d036f8bb9b635d8eae725fac1408686c80cbd7229c415abe0fdf1402c45813a19082ea0fdd8ac4f529463e91184498b1a7dcd2b45cdfe2dc51a6e30ddb0d5f035f209ba3728a19bb53e199b6f80c474e4c06010297f125813ada869e9366985d765913c687bcfdd43dbd167318915b7a138f84475ea7657fab6f7175004e2771fa86c3dae36f7fafe6c6a6af6768ab96bc9ad356d3dc0f843e457ab8f7506f655afedf4f46a18e4d4eb7dad70a3e0bf5737ed9e781be7fbbc0f28cd0d1ff85c82780444b7953960881292c8987f898edbb63c918f3e6dc4718b511fd49dcd076917ca9809f8030c58c873c28d751a17f5f9f9efba32d40e950e26a90db31b918c78d425c6d06360910f9519b05059733f90c82052327ca7adbeef777c08562fd76080c2c4c7f02c01588bc3347685a0cc2dcd39bacd088720847b7d42e2c2779c69b3de0ae75ce86b6ab9338c0db43fe318f37b1b80683b11cfc552d8beba5e037f6737c77262863f98866bd5a37cfd1d56bc218ce73fb868c8d95fba5097bffd29f78813707e97ea3f3b2ebf90460a3b7910879e6fcd082d14753fe97f4c753d44684c7edc9f7cfb26acd204e000f5d11558210b6f12b19ceb256e45e318ec3d1975cb530c1c192959347c501ebdc3a5b6df9e300d47f33adad639be80c1fa50ab0488ff077dd4dab5ef139e1675596930a37cc44d9f3d93840c3a035f4e475bae2ff51d0cd424c3b783e89d6415a79ae71e0bfad7abfa758c3b0a05dcc00502574bef59a0b4409bc584fdc5d2cc89b9863725c180de6ddff51f16c386a13c316875628af861c8ffc9a5aa4ff09615b51d85ac26fc70923fd6437361531cdc28fd948d341a57280e5d6a7844a2903f8656724243277bc11055f73410b722c1097a70bae8f4a6d0b0f1823358737a27bffc548fdd085e289bd2ae03f5d048a1d42be4380fd5660a219753ff66bd5cc6715608b12394b5fbb4d3f3e6d9225942a262288ef1d21cb4d52fcda0cfdd8a9bedf634cd41cd9710e037100d510621a7b73817aee8b4b1386f9da760f4c1c26fc279445ec9a95254f5fb64980e9f375809737aa5da6cc2c9b34cdb262a6f7c2794e8079ef12e2117341326103780c3cfd7120c0b9a9e3d5de47ce70573d4ddd51c38d65fd1ad199a480a93aa1d9ce28c7e6a65f70806a1d5904c89c88a95471946f647caefb9cc47d59a1f98aef91ede4c437c5edf7080ee3442f2702b6510a2ec51e85eb4fbd4dc7065355cad8fa88a9bc0aac31dc4e1133f55358cc4e18bb84803822832abafc81c417a76c6b9bf3b46d00bdb9f6b322823cddeedfefbcfa45cfd62157b4a9a4643113dfddead9d14bff6769e53614f2bc9e8c8e401cc1d77f0bce9c60aeee3b21ae5e57ba96616548e4beab5c399c55af636252d2985559b74a120406741ed0854b501ca84527887bdd8df3a80e021ed53f7bf5a0b382cd5fcc32a86400db649a2df942754b4cad97826130f1897f3f9360f74056835be3caa9ffd4373746291f351f278dc654f1cc0fab2bd913ac56896cda3e5ea80d193afae4b73b9ca45324bf990224a10cc3a76125164865d368ce45ffaa1dc4483814dd5ff12b0927f29869657dfbeb3d8d66be267b2a00b370cbeacaf99e0bcfc734d956c034f74afed08dc92357fa892bf8f1a458b8a307ec0f82018140a04940f998f9d85ae562370dff3c6b965e2ddd795682fc7271dd16c9ffa0995073f71fb1b6c06860dbd11375b702faa3db2ec40d926508df90153873bedcc18790ff9d966aee698ca78b450d71409f408a52f4da91319aaa4ecab0480b738486788a1e4b474ced27099a25d4b2054081cdb4206e48d851006e5736b1b3de76583fd80d3e3f55cf87ae38e30965f1528ff386429edd9f4e260cb713eec93ea756ab64f1676985b031e347e46b5e34d9b5e4896c448c9ae716ebbb007b5dd4f0b1a41df902ece44c95d2d4a77454a91ec74ad942bfe201c4a6604d2d3c4068fd2bfb400de1b0418f35012bed004c3343a487114d71763fcff7692e2a998e56edc47bc489c04255d06c82ae4e4115edbf11871e6e66b41e1c8e84fe301f2f94b84b528b5b3cf7ac954c8d93b1aa12d28053fb20929ee9134ba41d95d5925ef97782ef3ce42e186443e79da2ddb86c5b06f6989c726bf3b06b8c401d34cd0bde6ace771d7c98304efc3e14c1c5dfa08f7280a2303785fab441834038c3a0971cf97b6bdad064bf455172067d670ec32c1feced9188973566faac1e9594b7e978e90d04fe391b33f414f88d626cf073185b7af07f43390281d3fdbe3280a2a7bc78d202bfc88166c06b7619390c21476ab698e6fa7f3b38f6d719bdd24fcf0f4992b76fbc12fb45bcfda1b87db97a3e8397331984781d5760498e99eb4d5ce00a6efb55c03daa15faad221c99a1c313e077e889104712fbbf3e59deb9ecd015184c947600c7f0a0a99cd4f303c2d90f7e8d2974f516a67c7ce077fd3a93aa87cd12ce8cbb9b8080d1b9eec2b74a56d16b71d0daefce5fd6f7f8a24944200868183ec5412c0017feb2e70742ce42667abed4a64497f942f9f51f6d38ed027f11623743d970022096c71f326ce46f4cd9a1b63be0894ec78bff179fd197bcce9abb27d8c7a03634245e66b112b0eb0b29a0b41a6f1518c224928bd31fc8952f31e09571b76fdbf73d098e690917e03c320b0d450077d5c2ae43674fdef30c555a3c3e7317daec5e2f3f3fc56aa10721d435c1877201b2d612a28478c4e5ccbb8c3e925559c3e31f472d877c08b15ad583e7db2bb45bdd7ea076a4b0450ab940c0a2499887905ea1fbc4acf84073f8d814bf34463733a9fc0d90142e49170b8d842bab75fc828ed5aaf338643f1b34142f782ecb312132be60a32503eee3f6e75dda7d48132ef0f998ff0fdf0f6375630c2f6d35c3f87dab585a82b67a109c172b5b9c78524b0d7100f1974390198f17813493ee17a668f2bd9d87f6ebe187c8eb021aefb71e84afdc4088db7e73870b557f09fee956fbfc5552d8b9e777756775117b7c6832dba16903ccd8dbe4e4f658fe4b9ca3dfa297b70ceb8305fc2b88a11153da7856c79b9a1b3faeb4b0f958c8970029e1fae9b1d0efc908f543b47f77f0361a83636190f6217b28e7e88293abd89670c59d6703cc80322b065f66c858c4a8ff07ba8f789bcec333311385d175f70f165ad4b2a43bd1568828090bfc94b4d7a34dfe7a4ffe4fd1313b411153e7e7387a6783c8d3c6ade3691fd8ffd40c22f5afc826015144d7f8ba1284cc94edc80ea4845a96a7ad6e2d1c20f9dda1391e0f28e042b7ab4335a12f5055f41397a6f5297d727fee668de88139c9f53990e7132863b8693fb8a648c6f433ee0f69b8aecfbfebce1dce07ca6b0fe6feaa2144f83a524d78bc1f3423a01218e5d8b640b278c2ff1003a0288afb95367cd9b0491c5fa6ac6dd4563abeb3c1c87e577620f82bea51c90ae3a3248eddd6c158c287976671cdfbcdec511cd8033b6c215c82962329a0613c05816cf824de403dac7700c994e30ddd93deb8c4454c45266ddfe6c66be26273baf8f9e91d1b23fb4d73a73ddc11e4cd95d7c4e518d04dd4e8dfde95737c23a4ae1faf3261f24483f32fcdad0c84992244bed2b533e881df591f8232618ad0bbcd58e728396a9d2edf3cec83d03827b857f2b5ced3708986a88848e14e602641b6f0b02375d04310a068f6706e28427c4923e91388d1a54aa709d85a8f123008fc3ec14297aa332c8d49c4dd218ba353b0b3f23866343106313104065c2e53a01d01bd9679efc4b3fedd25d50254bab897d729d2926fe53f5d0c6201005e5d48a28f58af1286ba196e5472632aa6fa2b632d4f39d9f0e42a9e5a374c13dcb1970db0006aed6ef85ad39b452cf5ff1733e3ed8a3d635498d0c1c35a776bb8f0d0e390218ec122c74598b3388805fc8131c0683a82f6d3ccf18f84ef7c28afe1032ea3afebc5fcedb37f6bbe7dd20404fe2dec6d63c01cf489fc68ce4ce1ff645bf4d4134c93c0889a5b941d1b2f73858a9f58a7546242f936c78e6e554c3f21eed0dc6044c56e5b322ee1e009c74607e8a34f5286849f1de04d1a73feb5e58e5bdc78bbf397e5184500d13e97220f784757d477c3fdddec007611b601564025a588af24162d62a9ff8e2ed21a1c1572015778f137ac409188ada9292c4f15bd210e085e106fb232ccfa7668bedd1b26acdae922694b63b59b9ee8fae3331193be7e18a0dd7a06031d74fcfff37a61f2b8a95492aab046128b9d374689a896ba7463e4fa2ad5f45ba69de3e56bdb115a7de2e21c8e1bad7f7edb6f3defbd9817174a9ef19b1edc0ccb1824421c7064899061dafae72e7b90d9dc7df8329a3b38d1e32e1c11535c3f960479fb0b1b40b6d51a16b4cc3cd75da5ae65bd44693be44fdb4264c8332f4ca50c2bf9c98febef075231939f6f47286c63297d806401bd84e8c082d905d0368be3747c0787d04a7284f33351bf4e50efeb0af9df3a7bc9644daae24c41b28a35e84c4d1e47fc12807a727d970418a8fc7435ca7fef69aaffcd61ad63b9b3a8b79b3ddff22745bde9df2c2187def47daf3fd0e74b0b8b249daa96b3ce717655f3036db49ed766ea912ea576b77d893fa211396efa3c09db980921a5ae3410bde51a0eeeab2f0f1190ae6c12dcbcfedebe8f5a1f577f872c58c789acce6094f6287aee012eced56f290a184f959d1b0309bbf84321626e3fea514849840d61ff89d19690f5c034bb297ec00575c95cb031f22329a4c9b325ac2a2bbd78b028f74989436995415de5899a6bb86c524affa83501bc866a9e5c3c13b6d8f09dc1da995a47503df260f08bbd6530659f76ddbf985572219f2f7f817c4a47292fc37ac613dc6be2dcbcd354e747fcaad52ccdd79b28736daeada18a31a1e31be61682455e17f1b7b410f440920c504e7741295fa7229cdac3a7edee60d7444bfd09b142e770d9a31eab9a546b7a4e3ef03c6e14b00ed22694d3d8e487c0fc94e1fcf6e4c7d1689aa97b8f5c18516a6c2ab73c1500af487973c29bbc29cf69ab5a42d224df616939743731aa07c11f2ff24726c5b35ecb675da261b8e51fdc7ed5a61b0203f9ddfcca376992edc89bdfa654797a2283709c428de4b29ed2f6b130fdfb715f00fc8211023296c6fa7ac7659516ffe08df679c5e5663386b73d99f39fca56548a3d30df4fe9b87c0877c2febe886949e609d179f627e74a124bae7d8c3eccc3f047f7796dfa8b358fac855f9f89dcfe777dfb8ac9c9c7ca2c2466f739e45e5d774d0fbf4f758f0c4b21a26341cd9aafcb3f305b9c126dd5f1d71ca09e20c79d9f60d85b86f2fb5f9f7df6ed1d3ce6f3810bcf85f89593d42a4217a10aded7e249a96e9b4b2f80a05247fc906a077527960342c4103d7256a508bb62706da321eb9afa5657526d4c1a70f3b5ef522a8b4b94c6d0e3a53015e313150571888539ebaf04b866d47056a921a2fedb1bfe7e74bf15afc5dc03feaef50f71d6cd6fa57f8e7f6e4640e42f44e23e9f010396f76089b7954f03d30a244a8e64dd20263fc23b5789280d77a4d84f209d43167e81411792139721d3e731eb1204814c2500b090ae44d408124de21a0e844f7160825f5642b403d5ead4bc7ba1a12210dcdd0016c4fab396885648459d1ad81f5c61dad58598a689abbb29b6320eda8cc9af86c9aea1dc66e07701f7d70d556aa794d3375f07a7c9b0e6160bf9dcad4dbe452fd5c77f1c30451b13117c19c5307cda1de2808657be9e099800484c0caa90c4ffdd5e796a82b8ecc0725e1dd148436ee745274067ab43253c4766898d9baad19a3f5b91c947eb09012e7562c026ce3c91ac7d9a99303b8166517355cae51838291689d45ca128df534df9fdb39486b5d8213df5c7e98ac01a570b19d6ef15de3cb295ee0f730d0415c402ddb74b9f620d121b7a37d9b1aacc2914c57f1a221e8ce1e711c694089869a88a02943fcc5d3f29859a118696fc61285610dd148479bb816375cdadf2ad79b13afa268f8621d0652f30d8b711f90fbb8683275057b1c25e8490f21e937a062115571a68c7054ea686e401b9350552d4c357e9dd7badd90a75c509abcb88cf80422a694409502ff84007e4fa31eadd04c6032990c372c0d357d03193b8e3b0cd020eaafbb1f61a592bbce3982c0e45001333ea2fa5364908a26d0a840926ddeb0aed4332623b21d53a44922d696f9db780b136e68b1d2bcb880fe365b4c0224c2607f64a512ff637bc21b2266e01d5dfa43d9070afd46cd1f6d909af14bfdcd05abdd2514481b5507f68bf43df4217ca5bc36918a14860ca083725fcb5015096ca0066f05977f8f99d047645d958067ba089a48e55dc3a59f351d3a22ff0d2014a0efe6cd2b3b98f3cccdd281e8bead9ebf4849ca5cf53da5cb824c422b74aa8d462df51c0ef0c4c5c1289a6fc048a7a4cfc298e2f3364a08ff55b6340cfa30b96c46f7b873ea416ffef0293e691a43f8d259ef9ca45a3e10f3c7d1aaf1e701e0e2f87dbf2c89aa3fd7a88cdbba8a49a1845189394213080e3097198235b290e66258b31fba2cde16fe2e315986687e4cf8ccbe34ebf5208b0e73edfc56a0b94902755c8b76f8ea55632484cf9a760ac8f12f2b7bd35c5fb0eced468e6937888fc47198225cde8b31b0605f44c5a4d13bc5f6a04dba739345c32ecc1d60492137fb97905416981824ef0be9120b9dac82a07f86adb5b796741ef3ee383fd4b2373b551e733b8a97511a5dddf6a30f49716ec519a31bb1d9adde385810380e74eec64edd9935441f2eeee25c9b21a21cf88fb1166c58e28dab161bb8e73d1032902055d4e40dcc00b7c3fa6f90b843bd8aca7c9509343d3e1ea98a1ed2d2f9483cf46e2dc2dd10f67a9848f0413d4fd3509f16ff5901e49c1e3b5afda3a085f904eb790c2390cbf12629c13691a8fcb0b83fd93f9e00dc23332cb56465356398f55c4cc817a7966061cc0fb27782f4f7b5e0cf95d847e13a810893f444eaeee7bf8d0c4548cf5974e648c82011f95536e673e1e08738a5f7864ad5049e20d9f871739e1385cbc0a39c2cefd770c5fa810eb22288d142cbd666eb58c91a4f0d17e5237d1cfb7ef98368e08b143ef2a4dcefae5aafc62705db867bd6c2d3a72629f8b557448313ef70ace941f6a5052cb0f1a98e6f7299e1477658f11b27aae7881b41fccb6261a8ff573c4264c3819f833851d9d21ad18e4a0ca547e444b2dbffdb9b34c652c17a7bbfe19f52971a1f26f1bbcbbdacb3e3f93e982b6d2435aa51b544fb54846b0f94528009fb86ed03c76a3cf4ce11edaf56e00dee657a7e39fdab4ff776073e45a5e69ed87860db001f2cb16a7dfb796b0b4cf9a4508117aa5f21d4bb99b44a1d6529d889a7848dbf43eaa05e9380d11d63caefb2faf8aa1abcd7c54614f0b3056b1067e95c223af3ff48cc8f2ac3f3b695ac314f999dbf0b5ed90f92b69fa7f932ab4406497356bbe10f9cf19f29f0103c062391cce3ae39bd4e4468d0f0f51cc50d6bfbeae39cda0f7b53387818def3b639bb40f5eaee7473224fb97b4ea823f0d1fb89545fc566d0971a8c09ef10f58b3d23a5aa6f1fc0b10b15ea77ccec2e924237d404e4591dfff34f874c79f7c560b8ab162a88f9351be3cb6bc1f140a6f05e435b63018c313742c00777e5f67c1b7834a3060181180c3727568cab78674d0f5295a372549860b6e7546e7541d8cbcd21b15fcd14b7f8e2974a2c7986bac495d4c22f530ff7f2df6382f386feba40e8e2b4222babb7edefb419d375cc3488e8d2da65f2d167fb530bd7ce101fe6eef85d96bb11a4906a0b54ebcac37b6e5b3fa3873b893899c7b358f8278fbd73ccf584bc09dabbf9ba6eaf62c0317acc25b8cf66b2567775078556bb6fb57d19bd587d90e7f1f813eaab86ac6562127130c5ca8626afa3698bbb13a04068ccf12db43d0f24a16a9071ccb4d4e90f78d788b3fbfd851454ed8f1963da36f01644671d12b43ff0cfef292b082e1cb94df89b5dc786338267eb3e7a308959f6f6d506dd2e1c5c9ad2de2efef26fddf084e6560039dc2c75cc37323cec4f08a563884dd12b5538df21d406e16edf596997d4641fdb0aefe3b182f4643489e94df04baf8a3dd9db7d0c2a707293dd681faf09ce3b756a2039f1641aa1b82ff09cd575d8227eaf86fedb67a5e699865ae6c462272b895b06b3e93bf6e9620358fefa14098db75f9ba80ca0bb9b1b2842ad9eab528d1f22dc5a3ae06706850eb4560bcac15ca5dd9956ae0e04fefa323b8a49f5216a4ff9b791a908406d7662aa6b18fe80611024ad927ce94835ac2d2a25c4aff2a30b152121db7a954aea4e0da92745a0cec28a585a03a3b7449ccfe7b37449f5d19f9f1ebc13b471c3ddc2f56e8983f56aa2cf9555abefe94b64886e200b8f0282c9ed0aec3765ed285d2feae0d82332ed8b598358702a578737e92153ac0488cef17c78f0ae614ed7698b2efc32e878f98520e54acaa1a87b924c69399a6d800c7f60594ce759ce968b784a5877994c49c923185fb701df5785c36679f64d3f01d5dea09dbe3d3d0d09c0b37905ca112d61095efbb3ab0dde7b0b1ff23d72380dcda3b81581d75b679216b9ee91c0f19a41c84d0072f3a9cb4fbe281072b98d7cfe71a84f9081800ccd46bc92ae18fade501912999e1e5e874ae1fe6ba3661237e42a6f334ed3d67526c054626109b05c5e8361b2434f93142a5aa59838b7c37069a94c1ae6fe8f1e5a09ade82e2c4f37b2802a878b0e394385b90d2e561fc6cabd8d5be8c764db51a484a1a83199d50fa3d66bbf4a7c2c46ac5ba9c20e222464252fec492e4564a51e4d13d3111078ab2cdb1765c3aab0ff074da063801459d89336a4e4bd821900da8068fcc7dc3dedbf1af12b47bd566b0bf0baeefc11dd6039324e858de8d93f8f4ff99ef2edb5fcef8c79489e623dab20e40438f4636b768e961207b2add43a04880d709b5ce2b82fa2fbc77da9deff22003944d80637624bd92153423e9e649237ebd82ef20a4caebc1f9aee56896bc1c86ad9edbd9a263fc0fb1100b38f79066abab4eeffda053f383bedeb00c0b261a3f5a241bbee55767da94ddfa00e8222938dc1e6d1f35560a4ba2d2dc82ce534646ff9e60689377a330ee71548dc56fee7c33c0c84da33f5e56b49e0f1e674320ed8be2a7393433f4f874453b2764783e76013197f9df39a5b115d135eda522520a3f53a08385287e05b2b55be9b1507f07480f7681b04e71fe6e4c0c818118ff0d4461655f50b95b8ecf1dbc056f4bdf58a3af884bf63ec514780dd6261910a7bad82c03c722fee3be84c2cb4c50a576ab99f236294ea5cecd7f2af1f22313b777a29e8b523b509c3538e3c4b180dd3b021344d606f57bb55f85f130748d8cb8197045089501a8448d520db06346d5f7bac4458dd29688e83e6cad441664028c26c71f30ab3a73f62a33470e69edfdf97bba0970a30c78e1ed6e7ec1576584622c29b4b429677d3ff0baeb57dc62e3e22163eee981bb3bfce47ca69ec67dd0deffa141d2083178e38c21dc12668fb66428c6011e4638303779ae9ea8987e866ccc255879eab3d3dfa4110efb8b6eb893f515e693157ff597f2cf3880b2a75d48684cff0cca51d95e64f61bd03a4e81f28a1f6e5672b65621eb618d973f75066384b3f622ca791d359134cfaf261ddb2301d261f1a80d4e7f0256b70b927f75e362977b5a93b2709f1bbcedd658265bbc978d39bca5dec9ea312f7b1575c612135be988dd8501dacc8423eaa8f305df41492ad9772f8ca0d1b353785a048006d1f3db78865edaaca386d1fcd16f8b4adfabbda312ac700e3aba2fa5139f8277e5951bb3536a9391b63959d36609a9210238f1ec70933ddeebc0454deb55e42146c839a862e0f13d903997ac221c6ec9d207d028b7ecfbfd8558ca3543924598ac683d8c0d4ecf8a591922965df0e6aecd3461e61ef5ce56f7cac6ab5ea9bc40e53e3b96d6a06b792bf198faf2ecf49c2d3f9437428d935544ad24f2da081833cd5c08f7acb985255cf94ddb13fb6cdd5b04bcfe9f12d71d4169a3b2ac34ee412704c18040201008047d86be401f6063eeba6e25cb134bce3d971f89bdb0612bf9df1fd50de5aa01c3ac7f10e371359e76abe8b41e684c370a7b830b0c32d005327437b899af22be17768d09a595c1864f650e6b1aeaeb089abe6cf038620e2406eb3070ba8f80701a634d03fefd22326237048751ab88fd4f4f39ab88fdbf55bc4726bb7e123dc62899ce64b563cfbfc1391c3e91478ca531f2726984059a47b0171b201d3a3f8e2de6677651c00f819db7fcd924dfd0faf4f75ed2d6bf8030346d31075deb1d6a5d83176f77f2e4b7045f2000d5e1c68fdbdaa7568bf700ead07a93e06611578c71c561a8e9c37f1c96c9017478e50eb72cf2ffc599a631cef6f2999c6d168a8f42ee4a61ffd1e9f44d04e15cd9398e7b39e05d5d4e111a1c8bd190bfd8163675ba53bd4aeac162fff95373f6f5bf1add9029ea2e7851b25e7e92fb4c716a0f7fbbb252d4fb822bde02cb733a56742ecbe19082d87f52b2d4a40bb73400766b758ea01dde8ed6736ce84e40cb1bf7a9761118cdc1771f780de6fb072d87bdbc62033c02394080d3c1024b58da67c72204ab93fcbc11a0d1994421d992c44c487888e36a0d4a36799c06ab6b38c0e9bbd262a8c456ab9458a8575bb624a284359c67d20e9edbd1888558609fe2fa826262d2188fbc9a970867033ff1ab5df3675e576d4a33849192495636406b10bc1b853e6b4fee6e790a952fd36b0cbdb78552e82de73134423710f13ec3addf36c00b287a779cd1c75bc2d23e7b3a1c240f79fd357e4cb2fe925ba71b6212c45a8b6426737fe2d73679d4931f1174623643f567ee8b8f99df12c33f9e9e9711b9bdc7d9ad2837e2200e10f5be658bd70e8ae73509d02faefdf0226378fcc6c87c07f9ac814425fef44d1b086e5c61e56bb2a93fb14dfda97f6a1752198e85f1bbfc573296b96ae9fe4de5890aebe9364172f831a054b78cf0f204c4e4825b7106c5142a69525cbfcee56134ac30d36b9d5e6f41c710a3133add7da8ee06a20e33e05b37b7f703c8e32abebe25b9520c17fc977a0f9c4bed58486893f361dd57736fdda3350892ebc15c781ec106f88039b384d159264b585ae8401944419272191c00c6e533fc092d8a586686a1929dc666529ff1362b64324fa3c40d2bd1edc370430db140da016ca5e6871b6eb8b04b532a5dd2ddb271fd9d4ce438a0f62443fafbaec914a032dcb31ad4c7d35e7af966dc36dc2642b7fc3bb4540ec4a2d81fd0731e0d2522501c5e448bdead6be730b897bf70b6bbff1c835aaa8ad535eae8fe4f8ee7e730db897e1251411c8049f38f9c163b70b18b4962fa065e389f70b7c5c27461a426778014f3e738de04a0f38d061fbe904237f8cb7f2b77cee4232b34ed9cfdfa771fa3f174a6dd8ad3efc66d77a8e7a7d41514731fc69801ad60f70ac1211ba5395206b8b95bcecc45b5a0fea0f7ef30a1e1e6ff8dc8d08d8877827265597e8a2973ac14ba99893bef16c377ca5bd7b84c283cb11913f0e9e1af4aa4d4c3fd0eca30afc244ee66b860b312f1bb0050dd5e989ba3bd39dfb4b1bfd97264d187e1700f2129888c75699bde7f44d9f3c3dc6e4801172cefedc9de2f839ef085d501d1cce65beec1a3ce8d8c05a485fea453253c30e384f347b4eb30a0989869cf19e722fc91bfcabf398e8542e1b3e9229223b063415ec04c01db3947b1bbb99a973b69e28c45f0369727200ceb965cba6c1ce8ada10fe89dff51a3c974631b30fcc50e0322f81be0648c563d984b4bd027aacba5bb83ffb272ddff5e3d69de07336a7fcdf7a1a74d66914f6a3159cc94e8f082334ddefccb5751e703c83b23f251ad03b2ef123fe0ca6caede35d81d452a368f8d1e57102f090a2ee9ff37c8aa41fb0cfa626cc600e56ee665c7cbaf18a160ac16fb77bdde224e7ac7d1e25742a2695437ab5b8ab6f5b8bac71740c3a035f474c5157b4e8675c40647a3a38af7a151247c09c182af925de1d5aae4ba840ffb0ab0e43512ff481e48bc7a9ed601f5b7f774701927f975c240c99d326debe97e6f74d44f99d6e760b87ef182648132bdd02ff17a1c359c396814bd13e6769f35fd8aa37b794f01192dc5919d53902e5fae9c322ecc62de760ab44522d8d197bdccabc3710148f3c7ff5d403d0f2dfef114cecc7faaea0da1e56be1f3f66f1f922617ccabdaafb9adb314a746ab8035a02f60952a15bf9e8474afaa114e917e6889fe4c2b5021152d7a3d7d1dc599db32d4c98a9d815888057e4f5ca1bfc348e9523e9531a51983f5ea2202ddcbc3c95382030d675d76dd7a00734749b0ec1921f7c978a56dfec5c1a83d23ada78bd558b3017d607c6e5d4319dc433ad304eea90f07ef3428fed5bd5d9ceef35ac2ecd191c31393e60e0f439fe3b5a69a272ae2a42d0d7309ea998bac7f9519faa2f4b329823b39bc30cbcc9cce89398338b0440d7a3293012cdd6279da38c3a9fde2213767ec0eb1c0a52c7a456d6c09abe71569b4fc973fc17c9241625bd5113898f11b8faf20e66f80c9f89b241e57614a5c2c1cd58ca6112a4a9a7390c5620b32474d70820afc74d63b2633d1f278891bcb81b8804df81a3bc84fea2ddd5bbcc60162fe97fe93210ce97f22f16fa772c7d845e78aedf87ea0689b7a6b02dee066e2356cf7e8e78b8dcfe06e70dc299c298256dc7de819dd67c0292e4e1d6c0e4be871184d2f87f52ca0cc6957f4f0f9e7c5d9fe42817637a95c2335985f3fe43fe8c6d102cbd808b5632d62be5f6bb79e267fdd10a4227504da6d844f3f306f597b561f4d4e556b5977594e4b5d3e3b55430e2e015ed304d16efad9241d8ce03a1e134360e0f32f07570641d1478872645ed33496c03cf7875aba11e6c2f2ef099592a3141820acb66f826a1d9b79bd4237aff67d53fb5f4b143cbdce7fe5d6638d73317160007eecf933a03461a0748de477b75773e088c31e62ada896a8d429e0d3eed7f4a3d4b2b7c9c674b6c57ca6fc3f820f0e8abf858c8804ca39f3acab31913a42bd776b0f9688697b3942a7ab7a00591999b7903941a9e791af025e0c1b28e6ed995c529e64587525a4a8852ecbcd986b8694bb8f008f55f6feae543b5395ccf8326a132ab6c29c95db2f65443d32ffa33357e581761fc72a5f80641f21d48b9e6b5644641ab35f608aa2cb08a68bdc2cacd1dd6bf6edc8ef6d9bc677f39069b9d6955d145410efb105a20a469a8ee0326ccd9a4cf0585935f5477527ff3a2903340c7aec93e28e8a8350e5fea3a80bc7bfc772dfcd55631771752bd82962360c4bde52ad5eff0381943b43b438e0d3e1a3dbd89d613598aeb03e431b4196635c485ba0df8e41620f62e30307362008c8935c9c9eea5ac2d243274af099ed5b0607f2e3fa07dd615d554582a1b26887f33e4ea2bb3db012fef1d06fd9a1fd91b38b1ae280271b5b1b2253fb14dd4b469e4e4c8c09fef0bd93cca149430d8d7606512f15072038d7d4eb057ceeae12dd73e7201838746b476b316bd990b76760d868b38e3e02b379b345cfdb215e453d4691a42f38806c04d6d2b587343e4b1bae0ec63b43dde9536b99fc869b0c533040ae41ff5b05cbf5da2dcb868d143601d2d798a6623814f3f3cb43404ce956fe0347ccd853ee3502ea8d95fcddafb7393c99745e7d87cf5185e10a71fde39262023f3e1d3a167c6a8241d90c04fce2628da31e891b72df211b4ba77a44ffea674367e30e4d37f17c747b360a37e1b6e9362004c80f659c7e2e5bc2d24267ca8085f2b52073a9a3701bf2a5724263a13b0e61a86c869ebaf8ebd35d29798f5b8afe914d00140e9324462c2057778fad8a1d9ed637f1758d0edb71a7e6a544178efdd81e6f307a5e7404790ae0383b291d69a66dfbcd7dc68cd7cd243954b290cb081f1e6acac029ac9af5f9a1073e5beff3a0c4d5a0e5d2ec0e7142c171999c1f039721a20786c09fc2a37253ea29e96b3c742540b993f56e4d800a25e1050babeb2f1a7a75421b38af5684b81aa12b7c6a2b524f85d2b0d8bfa67f4f61786b2afa443508f2376e02749254fd808c1e3d09f412226f64c9bc509fa55461e4791843c6ca255de47446301fd0dd91b1d8154f5eaf3f570fc98b5a8cbb8694d81233615078676338f85c6d10d213adbc6ae18c31ce3ed038202da7bcb28005df86c58f673230040610bfddf914489dd8389aa92338c29e5f87cf45bf61186ffc95711b686faba1c806bc817d92a13c9788abe7cf73d2a842e4fa447211f41cc3aa0d30b96f743b3a6d04add8ddbccdc7fd4ba36eab1b669754eacbcf91eed95a7637175b26571e329c73d63aeeb9a299419384330cdae4177ffca44ad1a7ac0a37da67c6d2428f46972052bf84c6d54e7e13b62ac1ff2904c0daa8e49eeaa2a0b4b9abc60ed67babfca64b71902da845a10a37b942b9f09c043bf694fb58dee1aa588803e89f0a18f68a8b6c872f3ae88c856bd1bdf94867ad075e281ae42e6ebc5782ed0155b90b1a7b3a14f7119dc022947295ccb387d6b91f518870c6a32e2335af684ce225442cc7d0853ad05b81c941a20b2e1ef0e2da45a9b74e1aeefba397d4b83346d01b7da7466343c378b23b53266f701285b805f0c4372deb35734a9c79b17d9c17abfc05ffe5e05ac3b099a690a0e2a5f04c0556f23b7c9ebbce383bfbe10e63f205956283a5d7e38fb384542d9bc33e158753485313e0ae0d530cb0d5d3f336b98585f1eb393754a4e7fd760ea383a15f3ca79d93aa2fae940af4747a369a6471759c92f2d1a357b99e27dfd2f690b598c35676c44ccca6ba7419e09aaa890bfd747b65fdd38174fa8f0e8004cac6ce0a50a85012f64e13a0e5c2ac0b531d74ada1b52008af4238f5784ff46860ba1c5747918a3826c7d81b23135f06d9ced8fc293fd73ec3b6709af7c5c0f2277e5f95c0683fc2f2bc18cc0211fa669ebce1175c04802c5893fff96b262af1df1f739d4cc5c6bd90f7418a573842e5e62a5cc2fc925c588fdc082d4b37a373afeefa8331e02d96533bc3a514b9cec3957109f868c21f7fcabfc780edb68c237d7c71009675c10e69536ecbef4f51655a8fc30716e087f3f66e43d395ed5a1c2639cacf7531e5d1901555be405e6f221cc320be6a4ec4eba67a2036152a6fd49d1e5de0da441e1f0717e3efaa18a10bd0a766c62c362e6c4c0147047a35475724081a3e9f21e34dc68b8c27190f32ee64dcc8b8927121e34cc6898c23190732f63161371401f43b45d268b44cd6c7fb39321bf5a55e11ffbea7c87b2b8f4784fbeda82d83eb5bca8572b52097d22d736ec8428bd5d473daf513bd9beb070f65d24990912c079eb88b133620fc9609c843428c1e185ac3d2c24dca80723b3197b984feb80d3e5e9fd028f76384183a86e1cdf3af1e15d7d4d5130fcfdf2551cd8d9ac3d8fb8fee632c7a78f73f7609ce90c0592c0f672765ef563733c49b35de4e4c39f28180b56ce6e3e7bb10f7ca0b3283d9b82413427006a7ee05abec860d2c8be84bf80063a4e6f449c7deef855be83c6f9aebbffb340c8b1278f9e3740777d00bf59191e65c9273b53fc219503280eb64828974efb2ce53a33535fe3136b6b02725066a9a2342b789bc1632ae806354b2dcf5a5ae9e1045695433730482ad62dcc7582053fcad3a2cede277829d88279116d64068cbaa49699b3d11a941a1218990df28f2d0b72f492f4497dd95d0efd1d8b7f2d928cbce109b9c79f165eff7c67aff2be2f4ebc75c0086d5eeff1d3f7126a7ab045b67dbf325a1f1d297ea61206cb559e73fcdbf82ff280150efd26097416952fb5f14fee3e2ed776ce97f3d9a2876cd59f372bf7d1e187346b90d9cc8452b457edc430ea1fa997eb5cd19cc049a6bf896739b036818f4d8cbafb9f44d832beb7b405f6c2401a955d401427ac9d71fb45bd32ad9f6bc228207100087c0ee66a4513c01753f7bd7faf7791e7cde51c02d3b753fe1f5c84658559a19cb61751aab23411f0e355c875b62850b05555b03d015c5205b64a482979fb1badaeb3d076d2471f6a3655c30a1cdd1382f5d5e6424480c1dc4500948419f7f6210080f289f22cb7e8a39602ba8c91dcfc10902ca8c43a4850fead5c10e5628005171f319b69ca23011eb4eedd8842f77a3c3a8e277431d309d28351e0ca82709dc901f4928583ccee55e311401680afef7b683ad8fe6645df19d354e8255941a6439e361a7c2f9efa92fea2cae0ad8a0e638ff50925bd3b9bbf5d2bb99eb80813557cfb3b6c4d9d727d12d6605495ce898def69e4dd0e7fa52609c70d1c82c79bf9f151f05447f1cd823242bbf7b88fa1bab27bf335b1c3a99f3af3dd6b02a99bf85780e928528743c30866955fc3a3f014952c1d39b2e1d8c6f3abba24b9b0789f7fa7db9ae3141732a970495dc119b51df31974529f71df85d96f5a568101c98d85a6da38d2525e7febdfe44b75eccd01942cec89f73d5e0882222f8328a61d04a886ffc0e303716c5b1e2376269183eb5ff2d650717d29888fb262a11e3763a9c9c01d70703089b9a0d72ef59bf96580cbefcb4b091b5e9cf346a8cbf79cab14dadb23df0325755b8b4d711f0e309ee9f330f87343992e5955dc5fb0d7647f5e8cfd9c9eaecf76ee578850d371ba1bfa505c18dccdf8074ba0b59d4ebad9444df1e08dd2c233e65358994d5e0dbe34fb76f20bea43187f5ae6a716501419fef8f1c30ae7f4594057f8be021976ad8e59b1efbfadbe61baa86b2ca8fc04d053f252c85c71a0b1140484b9344d08482458b7f5a40c5a8fc61fba7cea71e32f96179cbbe853ebd440f007134ddacc88cc58ed0b7fa926e3f2e06d9ba94cb12e7fee79fce0a6670f3c8099550dcfbca0e8ce591b3d71eeb238951e48f990e530ea9239c81eb611599a1e0690073eb51a827da9acfc674b6c46451b77f014a07dfe0d984134dbd56cf5743bd1c5925fc6ec11f2bff4861167ff557b3a0de542c36cf13a9c0028eb99ae6bfbd953a31ca73c3bd9f82e69fb006195ebe8c6c3fae0802b6003e543f15e565e0382de8f3bb912dd0cbd2c454b42d6435886258d031e7c7e5fc7ee361665f10a4b3b8a470943fa3ca73ee6e40b3ac4f43590fdd04b44a0ae297a18476591e4fb873b867c5baf42007d6aefb345aa418d96b023c200a0afe7d87c8cfbb7d446ef1ff0f5a755afed95dff3de7f321af0fa0624b80a8fafc55da06f392144e2e7f0f656ce1f760272d1802eeb77a5c4b725058991f1e6443085dc60cfffa0121e4eb3e7afec976626e83eb195cbe350472990bfaf7e05ee9d023383f865ad81ed8e56b1ab638179c8557430fc37777a529bb55239856d9086a26a2391c81b8efc82e6295c1296c0f52e7a55c804a47c193d18ecf4799ddff7c1800d2d62f1d14e9fb8d2bfbe266b64ec879ae17cae72defe0462cc401e9f33e7c25d0ca3096f0413fa210c1467b06b75f6798d9bce1d42b4935dd0000b8baef2dabfdd238b58fddc4feafa2fe4fe2651a8f027eeb75ca3554f099e6379cb81b06d48b50ea04722a1ca7d3e216b07b45a0b3fc3a49048aafb40c70bdb5e4198c2a82cb6f71131aaeaff5104377e658363431b22a720011483de20528f0cfaf2cb59be4f5999350627d558a73fb72e037a964ec91abcd392268934eff7b30e91bc69a19a0a6349721d17cbd39968c381134127934dd2e89fe3b2954a2733b3b3e94feb0320a06dc1db64f7104363872af5e5731d1130494181100490f4210f9160b87c0d697871a05843f14e7e77bb54b30e65c3a1d08b8eacdaa806afcee0c7a6104f5a7dd3106a35e74fafa56079ff7c63a61a49b8a37a61ab5881ec44af7c9c5896c03a280fc3ac6e937b2252c3d2ca024aae39729fc09d7918dc765d5a503160297f09a9bf2b9a7ddd07cc83bb21127c2e4c5f95f908e37e691bcae9667f00821e6349b6e72c86e4b99277bc5e02b5822fdfeb591d873d0fb3cf3534b4a63466a7cd421342b06d0bf2d4c874015489fe523321fcc192aeb11dd0911b57995c3ff1dfb349e5726c3bb2743488e3f5483372c324afe709dd94add32cfc16a36117f736f7e752dac8e6333a60d09ff42b30ea4631414a944dcb48eb7a702d13205b69cfe592f0d8760403855572a7f14110e16bf4872556a454ae52e9ff0afeca764e9f9f43dd79e7558c0affe2cdaca59152eed87a60ef3ebf102c5eec03420cb216b13e465b955ecbbdad8636d40ecb80df49437cea7c82d61e9e1274a905e8990c160225cc7791e97d3fb8958086c5715039ccfcf6443a36fa9fd99145329fae575b4365691f1eb85c437541e01ccb64e692b94a4381794b828317377b43ca05cf989cc0fb0849123662d6612cc433348febc617409409efece5d30e8150d82290a0d493e5ee86dd7fd3b2c0c94edb7535c042a89bb7b10438244b001f118b7412eefe374a9df1276a04491b2b0d4ff952336c476ebc0fa4bf3a80c303e11b6190c3787cb3bbb131ac6d71a15431706f36dbd5aba324a27a1c7f6affcb0e9c90cd912517f6fdf07531490747db4c84df4ca3e89a311e36677c8a8b9c5af46096d1420a5025a76a0668febd654e53f87f87b26ba554432c4d8458b49fb4bdb1fbfa6f3ecdbeb1297d27e02fb95192b632ba770718fecd061f941c4420490c8b71464f6a965b366d3ad81623433d4777ce921837e6f3bc63fdb9f632dc91bc0bcfe26b2fca0eda6838d8570d9a9148e9170f712c07ec5966fc90c79611d218257811b2be8ac4534a1f19c8a44f26611dd53ad867d90e6ccd765ba4e914800f5d09d3df6e746d75c52d9db92a87b08aa92c35354b9e4e4e683f9bb4d3cb0650372dd2626909ce8b7cbbbfb9f981037d9c36bc5951478ade77288439ef9f632329254992c2fff491ef3e3c2cf1fd72081ac3501f95c83bdd0237e8b7fb8542cef5f275a586cffdc2eaf3c719b67d179e2d84fc78ab9e9648b0be1217925bf2e8bceb24940615169610d5507e233552c0e76aa0aa92456227b761b6c21f404a028e0cc7f92c458278013c361b06df77516cb97b2f8661fce6b663aa1e881d70d2f8ff549c19ccd8e7bd890fab9d3dc1e8107ce654859b48733e1b60dfdb2584c1d4fe5eeff015caeef0415c7cf4dedf921529fb1a2869e7ee2c999e4051482c950ff90b19ffa435871ac2c99a296208ca6a84c255724520071ba6e838f535bdadacc335c10ac8bc640230837c683ab7c17291b0f32cca5cf97c533429beddf16cb3080728b6505c3fc34ecdf2514ed70f24032389eff537e563f05ff765e3010d2f4b9a5260a43b615e6c3a575684e5cdd85aa18798f3c0c49a58470cd536a0708f37a557b98bcc90aa8ad399d9242b8f85fa13a9b100e5dc3d6a4f39cc80838efde004121cfcb51e52d8c31860eeca018db92812de717a1ea7b6c768c53fabec30f5623d7538c6c944dd33686413cd52c862280ef8cbd5c8490375af32b6ad661ad352647d5ae23ab07e7c34a499abe82af730680446619542fa93960d2f8792468b17c592f92d5b615f370aaec132ec5fb8298770f9c100806f47758c7cff34b0bd65136b6a6aafaa7ee908b1effa50ffe1de9f4cff0bf2018738fe25ac4d69424591be4eb9037b0dd854822808e613412f4360046ec1026a30e7110856995ddf19d459b36c375731a2bb1ab02b53620f1fa17c8b9588ccecb5ac3d2c22dca002ad308c85cb0286e83f0532734a8cc510a43e741b78125a53874b3956094561197565a45a87687f2a3428cebe7f31a44b862fba39ff83f5a7893edb51ffe59fb33a4b5e5578d93ff052851221edbca3eff4c5da7137d767d4788199b7a8d84edd7c14e067b87a9ad9f90e555e11e97ff2ec3256ee7a8af44165482cd7a60f5d4beb9da82f078eaebef12908c2c703730fd5cd997bf7f3df434d16af7de5b69a3e43bdaaf57b2ee93a354481ce7d636c4a19c5b8f09101b100dbcb4bd1bfe383c1d4795650a54b83430982c5da9da88ab284acdb65e8257064c4e08ae18af3cbce7687dc8a20c0dcc4f948b765f7cd7f4d9a89a7a62cb9d92e8222d165830dd4ecb3a06e87bf9149b1336547ed0a161aab1ccaff97af9d241e5bc944befe501d5144ff75d83b1f0ad00718e6e960363521b8dae8221d40c27539227d3b0e02acd794f917d4bde3c79a207d51a04030281402010722ef40539331abdbd1db0b72a06ac6cdc96638b8a4ce3648bb63e0844045641706b0fe4b61ec6aef69042e615e84941fc1b23ba84438b0a23f1ff09cfe989110cc31292d26e58692210ff51c3cce8876f3d81de3394ac536488a2fd0e0c61dd63a4c7893fffabed20231edbe8b63ec394af6a6a117feb2310ba3e951304522373d249f2bf6b124114c01c3101e4a6b8e5c70f6b83be3c4a768bdc6e652780e7d18f93e9ac1b571e6ce9e8f7c6cf9d36ec7c8c20396303ba77e1df53390c5b40bbef33dcfd606587ca94cb8ede7bc8dde4e156df69dbfcd066c6e7bfb6794f66809e5e32a446b5ec1ef1b2b816a1a1d263ec2e53440a85e57e9f2c62f096040d3fa2799efcbfa704e7bc803381e6fb08dfc62e389c6bb9d1244121a7fc5593bc50bb235f73051458320b033775e0384e5b74ff7d5740e4682282043e28bedecf42bee627a708ebf887712f63d23890ede63fc5f0f97ca20949fbdb5f925f5453a59fad104303e54b1702b0daba99ff010cd7846d6f2f4cf62ef99db39f5a49790d8d2752550b26b8e9ecbf7d4b25b7930748917039f2f53b07e3867410c8cc9b1a3c1dbae27954880dad405529215c0e9240452113d184c914be0e43cea1f18a54a4c01d640f9fe2579101e96b8ef552fc36f0b9f24489f4a8ea934655ed797bb46429c40c9c51fad3d7c187dc99f7b130eb17a0ba3d57f5a6bb0de4d8cbf552abf06a4e39b0a55d3b003463948e7fd475113000c92f1c43caa499051cf6457d4fb863c7fe692b5ce44914e8369a296165c71d62001eec97cc67292024067e278a7ce8eff142ec51540316108bc439d4a6b442a105acd688e0213d5208fcfcfab47bce4ebb1bae374ae6e0b55b053f9b3aa49e35740dd085da128d93db6dc4eaf6242df27c34f710c1b4c2b5e8aa7d9f70f68c1a380266621fc0eebcc06e52f4c0ae425e6017c1d13e249e4538ba14a163351b2410f2814e017a1d12d010e1f30d83351de404091a6a50f34411f8925c61c2558ffcbfcea7b04721581e74bc5fdaa499d9bc4f9fe215b73e39e7d4d997e4ddcbb24e9ffe0ada1a6fb2e066a539d526d6acecfa4b8a1c0f83e01f12a5370f77636cb8d20a326419ec889ec6d630abf81cfcb6ec55fc61c605089f79551a9420ef50b3185f84a3b0dc4b1ea5e4842eb85088fcc73f7924ed24515d7c79010b954a99b49e131e3214d3da5bc66c01d97efdda76ab030ba296176e2580688d38ab9ea87fe0fa9fb7d6f6ef853d04ecd4e80243f631e5f6fef554ac3cec5be2971663b63ac67eea43fc19f72085cfbc6c14c4c27aa32aaa07fa87f0c68c459f0b292f7beb60d41fb784a67a594d7ff01dbdefeae1f1af42c9148f59d794a95df70a0a405dba77fa52be1f6bd5a7d095c615293196794e766cf1a7a0c7f9e6638266d902ced133b6e65bd503b339f4b78f9900fe45f8cc7060a6f9af01af5278ef7ace33342e4f15a25c746b48c1a9c3492ff113ce85a750596ab0047ca44d9daa34e84c81733525ae2b30be79c0e3f1096bd9f4ffa8ff3a78708f5e1c2c5381d1ee00061a529d62515ac702f8f5a2cebc35b668c2ba179405f543ec0c8dd1668d8d20b6005552b2499f5568b0e45e53c62ffbceb60c1dac99ac74577d38433cc25ba7b9c20ba05937573c5fc2a7afa259b460799a7e9ee0fd02291f3d64f6eb35b87cbdcb8c61e0efac06363e79b7d55597b2d658781362826d704d9bb67ea8ee3ae385c6b9b699ceca849d2e7b073fdb0884c91389d206880ac234b59a088d669976b3a22b627990f07a37df5fe3be141758937f5a7a5fef818cad67fc341da5121bf2b7189fc82473fca641b95f16eddac7e0e3426bb741171dd03f75c8fa3127213b04601cbc90fa9ffd714f24faf1f0c8b22b6ae7a64c3cd0802c8d208b1ef9bbe1521edefd01520867f370dad73464ee425b38cf3cce6518c28edbdb58dfc247a3e40144fd2085c67ccbdba414d92c8ff3ef3c267691baca3f1c0d1b49e21786be55e62f9c006a19774bcfd9e7302872e14ffb506a91f5b14622ab5872f6854fa5f6e36f6b81e6b279859f22ccdc1d8081d0fe8f9b6337f3a093f9d9cf704d63a0e697cc21dae9c6fe6470ebb5c8d2542b606089d3d2392976e9f281b72fb9dfd80061736b4db2765af9db8afa21f1d598e4a734c37f294c1257fe44fd0c812b7c41afa25e428af3270135c6de0adec1d7f5c59f3417bee3074322edf00137fa0add5e9705804bfce0933c8aeec353153431a277fdad74c9e644e06ff2e8b4a4ef1697215f3cbe5c79f8cfc0140f073d06f737e1e16463344d87aa16ee6bfa56bcf9880676443b9ce1fbc54a1f0b2624ebd07836b6d4bf6c24026f560d07e597bf1b016fdbf4f7c712388c4eb0ee49b2865e69e42624257b25d880fa176cae00ba9ade5f1e71b9389fb3af7cd6e95a2244f34807aa62dec689f7b77a605bf4d9c78418415f207a518819d7a7ea111af08b47f0cfebf1ae08363e0c14a01ef049d51d054da9d0bfce042013aea303100549d3ee3d6688883a66830b4ec2fe8dc88b2266d2fd2c113339c5e829178c21f9f6771da1a8eb44f7605567945ecf94ce0f53eb2cbf9af40e1dd39d5b88a11fc1ce72ce8d78ea36ae87054e47a12da2a5550d0c8b5bac163f997db517712db65d7a627a4e4258de2fd84fd5cbd0652293e39506005b8eb2eb198765ae85f68ce74f313790934a82c000ea22236618d33b32ade827e5bbc535cf1bf23a92b01c1484c992520e8e94efa600a1ec427e8438ffbaf8dca17005d6897bcdfc4f1e99d5d89a14ae697276868348aa6cd12f7c2f35c401728f561426cec2ee10e5955922bea73d2a6d17e7e13f49b43bb52926b1df5566004111940f9f48efd0a52081ecd85ed5b6bab6c6573c340db1f3b8a2a093e35342f1938e451dfbee10015061db3fe2337e4ff5337c9cdd690adca69ab927a37837e3116e28ea210f81b3042451f90fddafb90f4e74980c77903fa2cd9bda8d79634d3fed511ae8752a990c068b73ddb0794f4c522f45a907e835659caf415bc0beff0a90403bc84316205383deaa0729d9432625e3c7ff525170cfdfdcf530c82ee266d2bb0cd4be7ae5992b3b8cdbb0acc6139a3a687a0843170fcf2534d3db4241218ac5adb8261bef86c964c1566751ed9784b845f823cac250385fa6b78d7bbc7aba25d9b43aef03503cd9780e7675b5c0585ee78f4e74a753c4508b453c4136a7d7b02a3f95f27705597c1ebb2765733bd89645fed8f38d5318bf66aa3e647167a52b8e625659ade410e255b547df3784fbdc441c6147ab0fde58578cc85ad12997282c75ca29daf8dba3f01cd509f5b079d0a9a03ecad59344a14de6475fa3fff3abb163924c95af6397e86b086341f2332b977b284e03ad1304abf8ff9c13d0da6ee0eee169888ba2d017823cef9fbe28e2b510e63e35c3e7043157ffedd6be0db2b6054027a40aa05fad49dc244bf40e792bb588ecba2d52dd809580dcdb970669546b343905c8f540dc36ce59e0c787bc80bfe7976f58c4a48c4d28a0fd365ab52a54125d2ceb4f6ee093b28b2e3556339432e22c136d9f2f50a13b34a4ac33a336b8bbff9421e3eb04c59accd63ed9d6041b7b2f603e05611ab77457413f43f62e6f103c1a53c51018f043b318a6c83995f024e9c9eec18973b97e6b3fa43f66fd99888bfc3f1b43610a409d3ac9b278429b51b67f3a3ac0be32ad4bed4db234fcdcaea93ab8d8a033d42a2e4d5c2584b5e56097fd3746263a09b21d6f4360e0eb635e9bd310c65727d376de37bed27d96182e8bb533c68323dca690856bb24940c70eeb970d272eee8aff8e777bc0eccaf3cc7d5905eb8ab865bd66caa464bb790f321c080604028140a09f81a26934cd427629f0ebe0a14910f4aa8d01860c0b614253171ab749f342908e351f12e2a2b7df2c4ca1bb83586069e08a11ed2d3a662556dfb6a215bd97a981521a4f5f2a8a32284746f8cc1e17087cc62e433ab7e3408cf2907848cd6c4d57a228fa4ae54059c0f573a00e70f2fef6eb403d8356581445aba549619618320ede04925e456d8f01c9697bd2526783b64ad2243534f14cf213249d1f3b7722b5fa03c878f7d2d9ff2f4c17264342a24d6e0cd436c9e95e4c01f8af8c7e3cd3e4dbc8a6e639e9235b0d4a2bf585bb589deda24663b4689a54dce422f0bc3f0247347afb4f29403897f7ec4760b3157e0cf98319a0845b80126681d18a11eea038e100d0349640a18f03bbf702bb1d451171ebf927422e5aaa4bec412b24be0dfdbf56c710e8d6b3d0679681a1072a4b23ee6607b45ac8ad673250dea7421df7846e1547fc2eb80c5b033a1ffcb543a95fcaee0e3fff9d372147f9618c6952fd4ef9d1cd370343724e4b117fbc1ed8172dbb58f7797a828c89141ba77bbbe064a97f9bc8c9328b464cebba622ce32d71124050e67aaf8b55fb7313c2df87412043d1971f059d48f0047ea4cb095670c913a5d7ea08b2667a03727088b40c5b0ef2f8fa56116f25004970d5132bc12f3f4265c1511521d8390a7d6149f973c3c439bf19ba940307011971da04eefa89c36b3b946878fef50c79be759522405fdd3b5900cd7c2f4d68dbed256da9eae1f703dcfcabed83fca55eb44eb0f13c6c5c49041daa7267d697ba7ef34fd6c545ceb3063aaa3fa07f2a23d8256c3e7a3ec94fff9a18cc8108efb74d41dfd0c6ccc31a7ddc1c30ce86df0667eb979995b63b0e70bc647a8d53b668a1e3589c9442a364404424f5a5500bcf96ddf0b5c8c42b593601ca82429ed34e4d5f4cb414c5391753a6320b6f58d91ec1984ff00322973ced6baf11e5fe5ca5bc8a718f729ede01e664f628d8c7fd3c1afb25bb0192fa213050f8c26209662c2f07cbb19f968b7cff4d9be5f25c7377c193f397a1dc4a154508e0b193a1e26aeb79528651c3b99a191f085e76bc90853719beec52108cce45eae981b106c18008f1bbb1e03294aca6a01e2c47f32f6fc39d37f97742448e0cb16ebe61d739883dcd1562b21a141fc9352aa0eedfab58253d422b01965e0cb5159134520be6bdb1c920138fc09dfe6491b0d08f0d1491a7ffa4e804544280c0921d45eb46c1fc4b26e178827b6f1564b226ff6294c9a57021d7a2deb8192f02a99c7bfac14a223a484fba77af463944cfd04eb750c2390caf7627305091f04d8514fdc5b7abfdc08c4b051825c0820bb9694910252ab6dd7cace8b300c466870724029f354ba5ad196d1ff77f5188b57e5fd211c5ee7f4e5401bfbfe147c180bbdb40d0e733b67cc1281221a9291e70bb9d7e6fbe1838d395e1f7ed4c96136a70f0bc798434596630dac9f0100758e8f84f89b9cdcdb736796406a144e60ebb9acc4fab7cf132fdb1d837f505830f305ac020cb23e8b8a4b0e77c2b7d678b1996bc991ed5417c01b95536ea90e2cdf6c0fff8dfb08d096c3a6201eae6eb2055a3339b0c5db5b337334378af3c072c8dbab3881c7c6164789191ffb38249e371e1e9a7779be4b88eeda3bac47f968d9e99b202661e3c06530491758009192e8d5f10d141d07467ea207633d9907b05d653cd2995940c2acdf5409e8b05eadb1935d448b3a52ca4100fc342423d0ea39e6221164064961a4e9f482c359e133709121bcc3a525e0d95dd9de2686786ef50a1ff5909d02ebd424642fe46ff70da45ef329c09932728d1799dfc42f4fd5b25539a1519187ee2d6678015eeb1787673b58b241dfb4547be982e5fd2cf1d74c769fa33383fb23e3b768d4abfbe23ec34f049f9855f95f3866832bfc9bd0f5ac27616556e5099a7f3895a92d663714c1b4623b000ec8e933b80aef0ff5e97b4e25150df0daa31994a2ef3efdf207dbe41b104e1a92e1bcf81f95ed190ebfa7cd90d0bcd92361b90da54313de1924379fb5c583d21517a0178eb669cc7ecaceb3663f9b9f5d35973bd77cee945b368a41c45eb9faa92286a4c9cb7d806f94b2c51ff9ef42d2bcd5a144dc3d209b97482f6c8017d265e86c000f19385cd8d294ecf36c9a2164f340d6d46e20cdc218fba449559dd82cdab9414405d399937b551bb4d5fe23524b533475ac4b6ac6732431e34fbf9fee419cd8fb1bb0394cae31950b7664140653d2941dad8f02f63eca1dfedc505a569ecca54ed4d0d7faef6c993e7bc72271b2d1ad733ae84f084099951a23c36002712bace587fcfc3e95f4ea87cb069a9e3f41372c68aaa90a04cac6dbabae4d003a1ecf859514718e92ed2e2660ea85a0a26c95e0eef6f4d98d53318b382cf3f2a2a93824b0da782c83acb0edf2775ab0ba46f0849ec9871dd8c00bbcb9923dea3fb5fcc833e4237f23f7fdaa76fe84d6a67d788bdec4e3f58a0b3c9967fa53f0b0570877d3e4a8f6c249a60fcca9e7c3d4670fd05a477dee1601738e9894ec29f1d8650d4ba86a6d23ba5d5edb3e5b1355c0d6d6459a6a8334ca2beda4994a5d8f74df30e4cc850d0139f0afa5e3eebfe1b6a9ddf57e1b847fda10d34ef536b441793a82b4bb726a779012f13645ef31300ec714597f37f7bed326fd1bdaed6c0d044ecc4b671bd553cc26263c533fd3f7d07ae5cf55520f0b7985053372725d85c1ea2f9beca7d1c855b6378fd671ab4954b78e317bf0396fd08474d946ada01c909ea9d64d27cb424fcfffde779c9e30d1f408a65799a63aedac92588b984c24a75c13d001dda57b7839a5425e24de3bd8922a3d6daa9bbd14965ec767faf7fefa712f1e83d907d100c0804028140a06c28e4393daabce5b7a782fe8ecd011f1d5abd16e235256571414e9162a9f387f61f3f27d65b8c0face3213050b9b5fb460332e7b5fa70eb5591e28852f1209f45f88df82249bd6812b488210db8b7f06f10f233e0d1ca536c92a53f776dbb7810d99c927174fca997eec465094121647d4bdce31093e472263b5316d19d503f5fa3da7cc8c1ca2cbbfe561447f01721459cd40481fbcf56aca93a040686418c39a3c3068995ab0cc156fd957f728a4512f5e4e4e63486a31774cad403012422d977ec998c1aaf50be6af724d6aa2a18f1afe26ef0fd5a593ca76bf2fdab8868f357ae28849fcd28a8e658e7dc71926c2f599ccbe0e472ff4702023ffa659d09ff8d6dc5c3fee8c4dbd3bcdc4d2c3bdb6a547fc68ada1d3ef50787835c52fe673878db2e87bf2b320abee17e7a42f4b65540bf7b49fae70a907f3bcdbf1738c0f764e8376b8af5c8e29fd2c491e8eee976387ae1bf09ae1fe97e59f11c0feb4689e4ce0693c0d047cdd1c14c5490fa8931b6f8f74a859ab53251023da72ca23b86e0fe7fea0d4b006ffc8ef964ff6e61080c901f9c4b932d75d4cb952b7a5c9b39f5d62905eef4a54cd3a490f2f1947dd7b0038233fd6c39e3fe0d5724fd79f2af354c888e83b2e9729648a5146d3a5a592059fc5201b12b11816cd58220510d1c2cb5f85004801f77ac522a53daad58152094537eaa14b812162dbaadf3654c71dc1ec7818d0c107c3f90faa3e2f85216c3534a1ad9d9a7c17021e83d3f0d1cfc0dbccfd0afad8757d9318a1f627f2afc8c2961fcf277305a8614ffc98834af2916ad707a725dc470a57de6ee65a6823ecdecf9217175080c48a639155a1a952e3d16528d5bd1edd198c556db067f9d3b540c433b8b754d97034246833bfcbc2a9cd2c838f824e677bae15fde55910b30fc0ee59fffba762c8f24ac95727ff3b15d7f0e0f8550c4786fa4cba5970a4cabac54e9a86dc12afbd6ee3ec1f1f6e4fa20097d18810b35f1d0a4501e5a8a210e4f61a1d3364155f8e73154cc2de037d6e4a365146a062a11e09461f683966601a691166955181e0dc5a747705abbf669784e56a7ad889460b807ad99cf04b103fa82d8128dde2ef3547938a428f737d7d72aa28c1f3582398c275e11c1a04ac4c30b8a6717a3c1ea6304e4330d41a090956faeff5c78e9177889cf005ee8059e1f1c0d83bb72bb8dfe0ffc7beb41278b5e55c5f8db7ead0ee1cbd458e2dc72a94419b307ba37022d8322fcdfcc35e5d0e35e73968e3faa8b31067d6d0c90b1435c2358d53146c03fe44ff40b1ccb0bd834c3fbbe233ec7004a82bb70ab433b13ca1e4d19ff1d93a88534932a16c30c4d0b845360e9a69ede0ecffb850c8b25ed92c8302b2b5806989659fdb8381958841f12ece12d8975ac0eb1e0fd8cd17b36c889fc95755a0312199efaa6eb08a0f3749afa36e3bf95fe2a74554a93ddd52325834195188d1e0f70c641b729678d9a6d0a01368bc15a16ba03b97ffdda75db37593cbf27d788b3eda82550cfda2b7990d5eb796f7b6a7a79c9a89617dfa54f37dc368397c7aed9a9daf38a4a55ca3f737b0fd15eed995d2cbb40dd79256f2722b473bce549fc9b541a2f39eff6dd7df5e602e45e8f36f827f7d1c444b47bd5067d467c0ffc70432cc402bf71b1682851fbf9142c251dff0fd99574e9b30ec586a738dbc6e019cda9289000e6dfbedcd5c23ffe58ab1838bd87f727cb691bd134ad24608b7fa17d7f4e62e6807b2dc506647de002b93c8dd3a56a4b585ae84219e09403e73217c50ab741178a131a4ec5d31f4397a4bd2cdc0f43cc1a8efaae81a344a3d42c23f19da8cf1b75d3d7e9d7d3dcb32d7e28b3018bdd40782c8538aa3bdfdf1f978bb9f64a00d68c06b32e023b4be4fb86e6a2fbeb5b61cf6f506ff9d177916fcffd1fb7bff7166c38a6f9d5858bdf968e3aee7cea464fab7c3df2089a71d5f2e711e4fe1ebf0819e421594bff1c2f812ad20353fc5f82fdff011a3ef8f1d2a9f7b3d32f716a08bfbfff58f401e3e47618edb4cf554f095b0fd8185bb73f7322d686d7fd75d22e157795500724bf14c17cad2afc639b6a2b78470d2b55ed41d1f98295eb85848a5bf341df03247ca1452d4e65bc66d7d4184979bb0869801eb1e52c8d293c942fc807e0d82498b4ab974d28fb8e27c874d96d65c7c2ebd1837a06820181402010a8297058377efa374f03b78a353d5aa27825820199206b304e48839c3c365af8b4965a6783cca6db457d41cd43d8764d05a05af51f9f688e9cbca50dd62be01573675127e1c863add0faa49fff5625336135e336d8362007c8f7489cbe4d5ac2d23fd7847a78d6a9ed47d3ee87f951ba74ee1ef91f8fa1e768cb552c4ed64e63b297d9f42c183ae38abf56fc534e5e1350b43301c5fa450117824ac99f22cefe8afb23853f79257ed8c31426ff084533bf8ce6d25fb8314b652dbf2f05308e7ba2baad5c4870c6c4c0c953f846413e17ae797ad7b58971f069ecff392e195747d084be20a806677747383269ad9e2cfd32e14fee53fe9ccb69b9b10f33b7eed071762125f8babf19f585820b4702570ffd0c19183210326012a0a2d47d9079277342e698cc1199433207647e90d927b3476697cc0e996d325b6436c96c905927b3466695cc0a9965324b6416c97c27b340669ecc1c9959323364a6c94c9199243341669ccc18995132236486c90c91f94662b0289fcac97c25f3854c1919804c2999cf644ac8149329225348e653206bd1a2fed034cff4f2b7d37d7982e1d1c7f587388e628e97820573dc43be9fe37bea6743003b1b15a387df4c2341ee173cd278bd32ed80bb43d39e3a230fd60b12749d794c99d060a80f30adb92daa0dcaa7d26240eafd1b82e0e545767d638b0d7ca7c2c4d27849145f3a0aa061d0ba5bd491f9dcdff20e87c056e24ca8b8d87be47934f5611f5c66c47749c77f3b2c9208588a1b0ff3b73c68afdfe6e9ad374dfefa4fc5fdffbfb085be91bcf5b7e69f2e5e3db01ba77bd3905015b4389e36d9a9bc3fde09b5d0869e2f332c43ebdc318c3f43714b6c821f7376dfdb9b88d7e1177240c5e18a8951c5da9ab12cceca09d836ec519cb27638ae1918444da552a88df2802b30ff1c44179a10e66b708525d2372343e355c6dee4e374c39d3425c41ff697f37f80b3ff221e0481f015fccebc6a1b3e534db440dfcb27f9090ff4a20fd1b9fe1ce5b96da58be4c2a063fdd8f19b7434f132b6fca17f55ef0fa8c5782c8e2c6059cd28484ebb40f514630c956f12f28197cd078dafa64ac7485a15f20a7d81fc8d0c78221c89889ba2bcff1b427c30f66a9af4ec1266525b53d0bff1ca8704ca1113aadf4d117a3b1375d8f29cf90f1bc6c2aff7303ef986339644d28de49b832bf99908eb72c3b3231600e44f53a009a7efa17481b5b77e19cff7f4a7b7e9ce9582842908d19f0d6f89e032e9e01cae00c366c41fd52c2aca1215d940938df68af8d9f5a6e1fc544e0ea543ce07decccf78780f90709485f5bcbdeab30ee5e9b8fa2c56972ccc274b86528af61de26724676305dc578ae06a41c02daf34d85296b179afc1da1817ff3de9c993f14e88e77e4d02b09a08f9db1b16a856ce59252c69dcf10e826591639bca7bedd4ceb6bf16357f7f9467e18e5ed2b24cb31c24d3c8d2fa8b9bf6c44104004334fe479853a8953f24ddc33f4c4d05d5ca9282c60eae307d3c8cb02bed9b01603fc0f2151d37a4f907e66dc50ae31389d2a426f2e48b75cc8d27d5724e98e984e4d77023a781d9d25eac49566b0e7420380df86761dfce520a26f72ea7ce9f7615b2f86703c4dd91180eace16f90baf2feb3be9987383aba974fbd88f7e2dbaa944d051bd36edeb42c9e013a96422dc8cf8c1ec776dd80f00f0a8f9e747541be0ad0bf8fd7b264045f82eb1e68a8c157864021cf0163725a309cc1cec27a1de6f0dd0b08728e95601b4edefdd9955da224a482522780c1362794af351f40f98633daf840811f1496c33d184cdb0f32106d6582b5a4e1a61fbe7ef4128626d1801372c73d51d587ec2d32529bd79aa16ee75916ecbe1bd6ff2ce63e8fa6755f3d98d329ea034d0bd6cbc80559ca7e80661cae9759a373051302aa545b26cefdd9a11a554e5f26c236c340e62f32ede73c9bbf7bda755051cdee8e25bbc536a678d6946f189bf17c2122fab100aa34750c7efa7815ce0585db5fa22398c62b2174b69d3074c441789bc729991f80f7ed7a7a5d306aad7125969f5ccaff30863debacb9b627a46a343b4d5cb2f69c9707febb1c7c9b597af419558bc4909c9c1fdb8ed646f480632a7ad6331fc14414772397450755cd96fb7b58486b7ef5af341b3ef1ed35d5d6ecea20d5f2ff862315dcb3524ec6f9e50fb65b796e11fbe4f4de8704091d187088062c65f91d6234bc3871f9cd77d785d52ca01ac06ebb7f9971d2061b46620cd6ce93e14b7c61e3f684dbb65ffd916314c81c7962ccb24f7d90691de95ccf0a750e784a55ee5f2df1edc0f0337f46d91f3af3bed9fc23b3a7774d0768183e0dab71c0c6e41e2cab4db9dfe687058d22a6cbdfb84f3798fe75be44c3f0158a4e472a6100efe8988d8160da29112f8f9604cac59aeef45a1c2a74803b72d4d9b295f371bb07b3050403028140b75e6d401e500a8471a670d8129616ba3d275306e1c730a1ccf57dc06d84619a092dfcdea185a1b339d048fde68a77273b184bf3c520426c1dce2a10e54f4b9e3f31ad7d0747eff333e89f9c3e436720b10da93934de26ce2aacb738e340202502d3ddbf067bd712271f5bfe63c179b9cee72f606f22f96f46123fa06f29b0793a9ae25eb0011bfa34e4b5206ffe726f91e01d809ffe4d386fa41f512dc5a78b63287e665806400ae47001527bda304a332c5beafd49718e0145ccc6281a53289a12ebfbfb1da321aa810fd794078f805fca13f90da8fb9d89f69ae3316003e0442b3a673b8afb5ee04e190b0ceb11aa3330e4a201ad07a4ca22b8a015ce52cb5a944c2bee54fffd73658e362afe2b570d0b5fca7b1e03a7a73c38cd155160c1d3ff7a50fa578af69b8ce8813df1ea1db45345ba535f7fa2b8b055cb710e11673d215d31b80cbc9a4ae22b0de915ad76502dd35055f638ef70c674095a8f43642de0c82aa60affd9c5e19c14f5a64203819623d44d260462b503de57e8ca31f9f93502c39dee256760bbf1c0f85f78375d5440d76fdb7dc280461fa690f308eb7a66c44e5a7f4c31faefb12e84a5f2271a39a56bccb6678d60ca808e1546d23ad089f80318c78bb23700b0aad0c0a34b6bfa8a0530b04106b1d964977cd5e2380b9b8aa61b86cd65b7c6b021fffbaf6684de54cc6300306ee33c03ffbaeaa925eb9cf03b632c0a305f540a5af73412508a77b733b450e64ad80ee80bec6b8d84823b04a2e8990d2b73d81f1165854272f17126471f62b303aa638fee806ace94f81ed0ca4005176f9fb9527f701bfa343fa1a99047a8c19884b2106e70e951e5a245bf61d0e7a691d093c4faa0cd37a3c7e0a75571be52755f0998c2574a4bcb805f43cdc6859fcf5945ca4bc39d57c61beb9461b89061bd4aef6401da9da39e47c13dfaf4e0928c0a450df5126bb0a113cc5febfedafdfa161d1f370b3712888e8ced8c965e410ec0053af9ddfd597cc43fff9f113ce8ee9d1aee3a73894b7fe062bc6e0a3a667bec8143bb6e63038a80b2b20367567958c2d2410fe61e06a208d37df8c25e18e1ae877fe3510d03f9663784a1ea1085674c7639d630288a8ec9def20f48b2afdc470d7180c88f9c5de6fae36509d34a8b29e306ab9226ecc2c5ed55ebaaa01183236a4a47807121b27ced96a9d4fe0b486eccfe843d94b9ddfd932147c40d56d7c5c57757557879dc57cbcc41326bf977577ad7ad070aa153e74ad62b71534c0a1ab1ec48f13f22e4b367357ea3861ccaaa58ed4ba4f0871668cdd6f62e8121446dc739f2b745b5812eb60380cab544de5d928be481f8eb1353108437d290c981257cf60f1ae4a548baf187a18e0d6586b0bccf02498328278ffa5b380c0351c94675876b8f2cbec2d52aca7836fa7b35e4dab6be8e9dc0c3ea864b1ec6fbc6434f6193f53d938fd2aa1e1b1154b8d44036007db20ac54775137ccdd35fd53c37a558af54891be12bbe7755c6c6e37365b6f07146c4cf5f9657ddafac734e494ddecb4419bafaf3d87022e48fb90d69c05cb7bd4fc0ad82dcd6c126109203dca576b59f52e7058d15c6c1ffc8b3adf61d175306cb8148feaeb0cb6801000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x99e7125a2', + maxPriorityFeePerGas: '0x55a0712', + nonce: '0x16d54', + r: '0x2526349ebcb7239ed6f66843a7368519723cc3316abd509c7cef841783f81ab2', + s: '0x0c7d6950bdd3fcf6045dfb4455b93930587822ebdda88377f3df852e0c8736a1', + to: '0x1c479675ad559dc151f6ec7ed3fbf8cee79582b6', + transactionIndex: '0xbf', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x6887246668a3b87f54deb3b94ba47a6f63f32985', + gas: '0xcc579', + gasPrice: '0x479a12896', + hash: '0x0f48823439c41ab6b36752bb865cc156d1f56d9e5284eb0c9d0b0177f298f79f', + input: '0xd0f8934400055279680000d20000060000000000000000000000000000000000002d0000000064363eb8000103da790000160000000064363eb8000103da7b00003f0000000064363ec7000103da7b0000180000000064363ec7000103da7c0000380000000064363ed6000103da7c789cecfd0558964bf3388e3f0fdddd252022208da4743788744a97840a28d22d29ca4387378a8a84084897484bb748838020ddedff7af1785e3d2f701f8f9ef7f39edff73fd7e585f7b33bbbb3353b3b3b330b812c6c7ff2c326e5f1c353f1f6837ef684012d5cc30eb2a43d37694db45c990ecf62d5d47b7917fb4b6f5f52859c0e36ef75714853345010f0968bc616f5d795e553614f53420943ea5a1b3eccf3335b82e063c0acb121f5c36c5d87d3ce9de7ab967d1b346224638799748d6dad5e08f97962f202fee64b3748d956dc4c5f25ded88913b683a468d0d80b48cf38498cc420f5296801948f518709568910779d15441967b11d1b989a580f6d759d4d2d0a0d261123a821d0ee1d68c7553f6c71513f78fe5b3036c499f87af2ab18e667439297afbe2d351d8cb81d04e5b4e20f1e882d819a2915d3da7c4b224347f22b3174f8ee6e3c6d5ce307e584049178a420adb23f3d190a820e9a01fa93f481152f0a9281e067ebe403f8b04389943b18baaed93f93ae8fa8c67726b5ae42aed47d944dd9a6cbaa212c0ce00ed75e6a0468e842f1abe644b6696e0b6220aef6905a18618fd758dfd634178640d177a028e47ed832f87ee8333b30df2ce60fc25c5682da958a43a2b186373354d775bc8bd3201909c1dfd61cb832268e419faebd4f2dc023354cc613788f64ea2f751204026db84c4ceddddfa1f51904c07bc3f220de56b9e5d95698c521f7ce4211eb5363daac416fbe9017e98eac1acfd22301b38a4bab1db3af3f20f4ba15698a89da84349fe1c0b27f619a9f4cc003f34b6c85409e6f3fe3f3c3418cf44d128589ff671de2dec592cf1193cabefd8d5228fc52bb6676ea6b1a7ae3f2266e8a844132a193da8a4b695946fe1202e105ac794be1daf3b0b435ace5ec9bd7ce1177535fd50f2a233379a597939ce20dcf0870d44935cea9bebf5d2f45fa2a15763fa6be79e4eaa4bd63a1f459e2c330150c7508c476dbda17faf26841a23c71820541decf73e7dcdb0e23aa58160b726a16728e7fe5ed1f2bb647cb0b54e5e30d1a60a138d55440ca1bb7f22448c2af74a4e4e2d1e5bc4551bc39592d0ed0a699cda463ed847239455ab96cbe6333291cbb5591aa7fdde20082d076f30a3604e2b06de707ffe8c65175d04000f6f451bee6f57b39616d8e33f790aeb3514cddf74008c22dbd3a6b374ee3cd070ced5af83373c21fdceb9b22761c32cbf4519ec00eb71ba9a9567e119b3cc360007816f9d08c5013a13e71159e26bb57e9b87d518ecf17219ccec0ce0f7e48c2f8d1d158e8ffab3adf0f73302f7d17c572821d8bc4bb7eeea972186f896b88908f198ba7cd34ea1a9d22f0f68e428af06775bb0dd282044f9b33b2c4e844bc4058d6b96dd9f2802d199dbb6edd6d58f4e76bdb112f73dd850f1ae046f27230750724ac1da53e6fda6e2cf9bebcca55c42f0943f5e5a061978d4f86e64d87bdb3780f81646ca74b1c750d9cdcf29f9d389f3e62c32552c0055e4809717c36c5e18eb4c9fce2043ae1261af85cd0294521bc807a176b0d19f99b4bba6e186d97053cb216d4fd1304874423891ebf7cc858af8d0d883e82d6531a25f8500ebfb274603437eb1a3cdcd491016230bc1f16b6a4b567403054763014fdb0c9748f762ed4596798cfcc83a9e710c1eac62a0d6b00fb62a181f34b62ef12f40fe7d8dcc098a8c5b71f8c0e1adb7b0c1fe28ab53bcadf230d68e4358bc49e8a0d5544491d205b8c10bc2edb18ed75d9a3009eb90043273a8c3dad78724fbd18e7fdb2d6846ba5ec07f828394d91b55778ab46a6c5e3d5eca9ebe7f177670b30821df90110fa5e9f9e8c0e820eb97a7a329a37083e02483afccfd50f05691f58f5d08b3b500ec0ce88260b98342b0ea25f9ac614e8225ed716de24f15c103f9081d56fd5c269017e51cb10355c1ef373ca8f92e227523cf1c84877a1bedd2f7a3c7d4807726f6b005cf4e88a0ad666872f34b52fb8a5f593a47a92bc94607a635da7aecc5e13f9ae0920b21721750aee5ac7e81532c7dab3c18b30a5478adcd24115d24c47dedaed3407cca7913e686601cdc96f532bb0653d26aae3e1af2697c23525df8e10c1cf1de206e8e617af20cc2aad633d1a56ee9792984ff3a299e6565fd2e389107ee01b452e03d40dbfe872254a88e0df7d6eb16bf9a9b4c6437e2ab4eace47d6540525016efe4980e64c89db2a527d24f2f961d7cead7ab70f13fa575fa13d31e9f089fd1431344000e8f20bb1855d5434bc871080d4916a78e69949ef4be0a96f03ea7d74c317ed5746bd7f03904efd06e00876e070016f4903693d631201f2270d2952d6db7a88f1677b87c2d2488af3de5c38e03c2b0584bff02674e38c90eca33df7f85e2ce1b06a60df759dd4cc25f1647f7b77bee768805f89f368f36bf719151e39459dac94e461e7e9cccb573b990994ecc487f51dfc00f706b77aab4546ce46e574cf54a1f7b1e18f77cba0915c930d46fcfd36d56b8d8063d7ccd9ddfddac5f09889d019339d14149c013363e530ba3e21129c372db93020591435ee7d757f2543e492ac889cf68e978ee539cded9c1ef1b70e38b792c4090031572734e43a0ead5707c5e6ca81dcf0f3a21406098a99ea2667cf09a76862d001e59126525dd4d96d7625be37db3b149e47bc40c19cb47ba8b89f4f4eb81b3ca209c838f00cddc866bceb2d44b1725dc744de719dabf0ee7309d4ee3ca2cae859cd0c409d206f2339ca2035de43e3159cd4aed412c1cd4ea1684a26f57483e857ab4f2d806798cdb725663377b6a2d966222a4d360f44d6f36782c4136e5de110b6ca72c707169a6b7663fd463edf1fa608ceab68b1741c3cef64bd21fd79191bcd246f8b621518be295a4176474e830dd2da849bf3388aa4d61dfd6c344ef1bd745d22864fce9180ae8199e77398dd9bb91be7270b9c76776dea88e365ca02ab8294e7424cb8bb1a81a8574687b8bcf14914d9e5f645dcba8bee04968d51d0a4fbea36061d94f5aace80b9c863e71ebadef946a3f74fce505d3c2065fea4c7a760dc4c2be36aff80de65f607e60fe2fb1dc47eea12c4ee1dc40ea85f422eb4e43f18321c04f255d23cfa8bf32fc1f677d913e79842ff2d98a21cfda3fe433ac251a1df6481fcb1b4ff602b0cdfa21c5501776cbedf8a81fb57b9bf1546edfd1d2e350407e2fd7b3b20df26fc46ce0e42dd7622ec652fdc2cdf8291d2eab4cfa1bdd8c3d5188ebe0bdba6c0f0aa5a36f94463a2f59b9756fbbce119d1179ead98d6a612316ce82a6d9ccd5ffa6ebf408de1428a3511ee85c368b82b9b0adb2b7f15170bb6a1404eca80c43c7975ade7a137645b1bf6e80ef323a5aeb07195820d7f059d8033f0432bbee3c0284d2d615144970673532c9edc2413a240f934ca1db4b1bdb5adf00262f98b5127578db090baeaab36b33d0053ba995d74a1669827d862a163398fc01f9a7a7b621c7859cfb96144457e8959c8779deac375db57afb1b10dfc5b73aac5b4c98b9defa81483b50aecac022606d082e4802aa29c5ec0f6004c57fd50ede2475c69bb2b16fe267e9c82d1123879e380b2d822fe9860ef98a4595001dd416dc866d6ea3564a5acc1d1c202a757cc3ed2a04d730049076b1ac1b71fc7cdba133111cc447a224ddfed40054e18b6d98a0523ba34a208954bebca10c6b0f84bb4bc36d961da0dc3cfaf87a837cff9fee762ff23fc71e9fe115e7df983820fb1389674871f16d94e9e2bbf2f001020386ed99d94797be0d8953e0e5828d3bbba8fe04a0fef973ce95e1f31267e98849b671d105f863a1db82e4e7ce1a7e7c54992d7dfd2cc13014c3e440449071500f9802b3af05e599f1d2b2c3a036de69f8597328bd520dbdd2aa6be316a2c749f668806800e21288a359cb74aa49b87268db5d6f54b49a760e9de24f6c33115c49b789f0a81646d67f80e4a1d1d8082d5fff4c9f98a8854bfba7d2c23769c9a048bf7d91680349ef00432e1682bbcf8af3b62879303baa678eaad3d63026c95704b4f2f611be3185406db256ff98663ca50f5ed601d02448e6f37a72f3fdd0adefafcb82b5809b75c8632d5fce232acaeeeb5fcb55af25e085cf70e5c87e397e39ab13b8cc42a32e1ddd28ba003ec725becdbb1baf33845a5417037c3e9a6a821257066714f67a3403a11847b42c7befdf2777b7899952d8bd13258218461e03122adab633448f9ffc700059beb27b3a9dfbaf15b583c067e86ba5b50e66767b5e7de0b18d5be43b3cc6768a976dff244972f4e2dbdb69eaa8ee3f296f2b9d5cf940f8140c4e20edd88f55572c42f885c7d27e6b0dbde9b36366f55efa459f002638a78a1bfdd2615aa2697d0c1dadda22658df08c5559cd83e584400aa5434da17609b580ee42015f001674307fd6e98e43e6b7c7e36993d653028db58b052734f8ce2dc4a50ebf324615a40587af8d2856c4fec87cac9c34cb2726a1f28435bb69635b84221fe82e367d81c20d09b3b5047f2a3598d44e60d437be8ab88f84c45ebce159b100c4b0ebff41ba3eb41704cfdd1ef145d4aa0082fd8374fee75687d959ae9c9935a204b31c8ef71583948a312befdd0bf5c1da7b5ac201ca0138daaa8bea87da95bb2f847d2ff028c8165e003289e329dcf6dde621c5f24594a88126c587d5dd1567f6dc81bcd3156c4f115441c5041d4f2716e7741047a58a5b369eaa4d10bcec822eac61d88bf88dca552443d73a4a5ba72a4a5ea483c494b856af82cffdb7a8fdbd0c0b49fbc801b76c450e2547900c7353f2f32d2f0771f46f3716a85f25503aff0b11922a1840132678d3b2dd4a0e70cd7103de50865b591f346f29ebb9b340ef3a224ccd9c61c7cbdb1e0fd053716f675d89474d50a739d8542012e0b68eb98e43e07fdf8480d67e8a76274ac19ae3780e01380e1f302581e38b3162c244fee842af97571104713c59d4b7efe14355cf23aba4e8f6ec84580a934623f7c4e6867a06fc1bca87767baaa82ebf64eb48df455a0bbf15ae99dd75fdbcbf72bdadba8922a3ecb69ed2e4c03443bc8e9058eb18729282d8c09c6fbea4876ad3b9faa65fc577bc1f079814d1655bc1484b734a109a2ca718a6549b5d02e2fc765ea31d3c778f4f763bbee029a9fe8f9d726e8deba84ab7cd4bab0dad441983f92f6968ac28f60ee5da12c5df0d7f6f2ff8af632bbed5eccb953bf5999de13cde221d3aefa2132fb9c72668d5a9ce3c1c8bb67bb60ed05c3e705184d550284ec023ad9b25b6fb092a02479acaef5477d8087081a31984b7e58780b601cb84cf6f56f977e92533ecb52d426fd7cfcfd5afc83b23b0ada566f6982ef661dad3de80faebdc032538270e21ea9852b714bf41988552ec37a3aa73504d9c7898317184b7eecd6c9334aa169e027971d24ad432c76a972e5c93e15ff45377f57461d4c8087c777d2e433a336feb9d0bb09efda97fa8a59278b361a0c1157e262f9a3929dbe884814977e579fc35ea26440b492f0915f2e31cb250c84844d45681f2322693d2079caaef556ce6986c6ec9c90c9b05fa3b2dc69e46230dd1ee3038466c8c57d5ae03dc628a31734b9dd443a1b5e15b1120b8eb2380c91752a2d400115d79277460e84f89dd22fa6dab17525aecdddf0a47921cfab59ca921be5fb010782b6b683b67cd4b77ee84d4eb0507ebbd1483b8d0b6c71e933fd12c3daad980fb083302ac898dc6caa4ad0fccd1d84cc402604981e13041d0a26cd83c9b960004600c8f115820692fed7e9434b775bbcf2032aa3bf0660f481100076d90905d98ce1c1c6f7bb74916715c09a1be9a309d1e90aac42ea4db50f673141f0c1c69742cc252a66b7366f168abced9d4d307fc310d2f3a4ca2d3fec216d024151e0388f030f42b49a7c42c7c29d6e8669fbabc1191b4be31cfc8dfa77aeb63d73eeed980729ff8706d031d084d5ae24924f0f87c5b5198f04e65520f7fcc4ccbf647e80aeafef64f863ce77482762a2a5585767ac9f6ec2a03ed40452ff5f3f827c81efe8ffa1fefd02600ab2eff81b58ff1cc74e41ca07691f981ae07b638ae3f6ca9fab1fdc1ae357c29597e1158e9c6e6e8f8bee3a34c5b9350574dd30f936fd87f9030e33207147dd5e8cdb4649ca5cc6d5dc414149474653f6f69fa608ec1e0e0e4451070736bfe140d2c1f6a793d7e79f2bff6701ac7c90f50586fe63fceb732c9a31a040912a7b314dc4e0c315e18a41fd4610fc9301ed41d56b3e0926905cbf947fcd57cab80cf961ec3311e044313a79cdad4db9df03c1ff21fe05d63f60ebef18006bdf77f4f9e6c8497a84204f564457606aaea989a98994e67e9b7edcfae6054623157c6485495fb96debcb4e92d1de6a40f3e35869d9bed1a09b3612f520dc14b0baf4b0c94c76441223df846e1ca937fb70cfc663c2eee388525288ad957c41fd17c5a0f76f8ac14858a0f2e8322c2d567162d33c6380351c714127b8f96f540ca2db7a12b1fbc8d7ca31043ae95d840a635fecfe59c5d5df0cffeb8a41cb120c26d3a8fd6057d63726e7326ed0da32bb5b9a1a71b0d124c2bff9f042ab83f5d9cf940f8140c47c9ae3b3cd941eaef5bc501c69f0becf9a97295294d6412f934effa9927a4ebffcb632a5ff806a5030f2d8350b125be3b3cfd307d9ad5d246dc5b6e6e396053ed3538054c0071ca04f40cea50a6a18784cb759e393a7debd438138f95ca761257acff4cea80e0b606aae9a8565653abb30f96e90b60563657cc9a1f7aae5f201201d88c0749fe2fd57b580c0af500b742f4d273957f45539ea954875a77a8aedbd6e4164bfb0e87e9ee1129159586508083e01183e1fc043841dde5687da1aa9b6c8ae26d7b35dded438ee6a06e7d38bc7fc1c25e6fa1d8050fe323ef9dcde5854e119e6896d571b1631ff34bafa6b673587d82ef3e7f97f3e32c6c2fa72d09ebd01539a4bb91f6612fc84b9c7fa6dbdda0d373731e62eef62494932614710624f9cbcf0f9f7748b9a6d76f90075c4e480b9c82ce518e88670a7727c31e275341c3f59a9e75d08ef856aab21ea0089c98c87b4e5482260e4fe6272287ac439ab9da1022be2ed93d24a76b941f88aaf8373e9570cce6e15f32e757c148d8239a65fc1dcd273daf105179c7331b7b025a6b81059c6c18ee80460f87c00752bc36367a44ed7cfde5c1bb11e229a1b64b3db9a650a616ff547d84dd898e701cb0ff6f5f556d3f74239f59c9b7ddec9f826a9346c962ddad389bfcae6190e423cd2d9901ce96c0a6660232d18a835059bb3aceb2462e77acd422c26d5e28ed1d91c3784a7b684cab4990f7892bcecfeeaa36502796a9db18cc755a55e266b8a33c333963becb604d15287fd804e518adbe777be17fcf39a3e798fca0ea90de735715fdc3f98c09a4f2ac594e887405977a017fca097bfec08c8a9d4b0744a3a791202e9b09bca7a62d0ad92d775b7d2f7bd8b6b85f0d275bfad5f94109eaed54528371e9f36c76dd7acd29a21ffd49b3f6442f5f697aaac6fa768d53059a3784242ee907a6fca065ad6a6eac1878d3cb645f58c3bfd0601996efdb464a4fcda5339b519efbd0d5e007f779b6ee066e5a306cf49ccf4def3dbc57bc94c7468d46182ed23c538236e3c802b5322145f9f7d2f2d7dcf48d0de7d470f4e3f5e3009353eac1fab7fddab72e08b492a1cdd970d740b07e648af74eb6143a97345435fc81c7b1264a2ae6ac5db5ff9fa000b1ff02091be5fa0b5fbf144ffc8627db072445fad7a071d331d46d59de7339c07af0a0019ca5c03dbb83b1f09724afc732344cc433568e3864c6ea3ac3250a69e417dfd0c0209de0e423caa8ba5fe350c76aec4cc241786e56cdaeaa26ec68e6d734b16d13bed296c5fe08446e38876d5447d8cd3ede40332fb1185b485bbfc1f2137965f3d1b47b9aec8d4cf925736fa22e04c4732ea9987004a488084c3680046fdc3043f3ec38c687a2ce7b0cda77e4a28b5ef14c936242620700a3b70b2c447f37a61161679cbdcace0d6763c2a0bf1a433a7d67c98c65d44ef12e8071b17bcef04595fece1811cdd34833dd9fdb72dc5757367e05fd09e38487fea9c0f6a74fe0f0728881e1114c4befdf8a1feff4a01483a2ff0ec29d638ef41931c712983eaf04ec7016741c1f910af1994653712a9aaa10e2a80c6566bed43994a70ea85ea29aec26a9b21f190ec4033d7b5b17cb8b6cab9294b08b46b07da6efcc5d58275f058578bc0738135a2cf8b8ef1b4e036d0c654e4dc777febacc633b72582daa213550a42b3ddcf35f9c794037f813eb0e2413d2d7eb64e3e807fa9b816d99388fd8ac75dd21462e1290193f6617ba5612fb8fcc4311995223b806163a3412f995d209b6f72bc06ce6192d0a36c9a4b88ae7d7b70665baeddfff6979d1eab4bfd57ecf4870fe6b71d51976a998a43baeb6e0f75fabe1799bcf10ebf00fb95a1c0434e8224b0fe90c028ff78fe7aa9515a6fc1d6331ecddc475cfb0bcd15461d888a6485a8113a0ff980bec72c89b73eab529f6f68a24344c45c6fbd4b769e21a07ee9d1e6a121174c5e1ed04756368d6fe76b0a7de5f5beed01bd93b5a09db288e4cdfe560dc587bd0b19a11048e6f6735f38b9239e18defe3377a3a735c58d4266990f407e1862e0937adfd349c4e4cc1305da7bca07d03025fed28e0ba2667e01d3d83c005e90e0eb8b9f4c64d117899fc6308c6a37c80597ee3185c3a9b0b437baa3e8201c098dc85f84c636d84942e34459aef69f9e33c70136c7142f60d8c86548e0b4acf1a826634b26911f7d8bf590925a29003f243b7981873ebb15a03d57a6516bab18a397bca3bfdfcb187bfb011e6a4ec15ac3b595388438bdfe9123210aeb175c3a9f462ab18686172fa0f736f7aee82bf9279202f891576f4ea52c5c63d456a861b05e732950ac7a898c025cd993f3a71712f8d851eb7fa6b8feadf07d63e3e07b8321fbaacf70fc84d804de1fd10aff37d30ad1f372e4039e6d6735cede7a326d3f48d4782985ecc6044ce3fdec5556bbd4828033aa1fd82080c88bc58d0564b42214aed8b3314e0bb876de0456c51c1ead8e938a070a13188310c8dbed46b8a34980f824f258bb33ef62b3a03caa7d90613e951fa22c777eb78b9bbfcba8bc21414db1962d3d68356a8381105258c007200d6d2f0a1138ce17368a389211ade9c63db5a31918156208fbe4fd763dc3d801b87a19c95ca04110a91f9d6783585d22c2807b21b13f0ba77798e55d16afee79c9a38e57f841ff99191991c55714411af05bb1ebba6ac581086dcc03a7b50569a8999917403326aad561440be561bfd4d0b8be07bb46389a64dd32b6dd84e89b61dc3a800bb02d0a083f401e7506184b280aadfb91f30f2f31c711acabd27b3fd0d6840f5dfe7a0a12fc15bc5102f671d8140d673103161be9e5e92f2f192076e9511591eab530ded08bb5734a20f80460f8bcc007433ccf988fa967f0e79e5814dbfb0a3fbcaa4b95a3f5ae1c853829813fd92305907a4abce0e39f84763553de8f0385d1097bec6d440edefabdce8535a0112f4aeceb5ea0f1cf3892b3b2ec5b0ca606c51708395b380cf059345199c26e9c8f444f7f91363a9fffb10420bcaf1d8dcf16f7ea1d0346bc84d5c32b45dae7c23012d4c9b1011be11c5fc728087cfb0e7c8b1f3699de5183c5a11b27b81cc19bfd0997a3efa41d47b268c73b709159a191f9d75322a6f2707850fc4ec5c6334569dd3f7fa197b928702df3ce75757a7201ac2c6d27b6fca03ea6d88857d6c1f96360e920f4815d05387dfb759c61f097148503884d32399175c32578a1439917ba50b3cc98d173259210871f6ef3cf5fdffc8dd73b50598ae1a2add37220499980e8c930347f31517f8039f3d35291a4b5fb4fc707bd1e02238060239c6477c9d799b07b0fad0caa43dbf4a05c1d1f0ce924e0038a64c6f6b71defaefa188945aad9d554ad53c1e1b20e2fb56acad9d6f304b2c8025c3ca93c06ce5eecab527587946fd4702c6a486a6bc2b6c20e5fe46abfcfc48f8620a8ec2028fa6193e91fad688d9bbd27ade83fe344f8732b9a785c5669d6108f3588de17adc9e576e6c0334a4614e9115477e3142e82abc5ac2f2f5583a583d007367adf295f4e59d187ff98158de8f9138a04f0154de349e5797a1962937fbdfe3f010893a7964fe32729797a013fbfa22b5f9023c192e1859e32940aebae5ad6cc88ca2980217d03276a82d052b6e19f99119dfff6b7ca62d5d26edad159b11b5ec3fee6677b3d9fb2197f9bfe23572f08b44954ce03b267befd8d1780397022864fdcdd5cd9101ca678adc0d3e4fe4c9fd718e92e908041a8c484870d08236990ead318ae25e4a760badfe1d244b1ef281c3fb04450a9dd96cf5831ab3f3a81a17f511df695c30443cde1b4da0b566f6cc56f4cbc9a568d4a25433ce6a480617c31f37508554ecdc450826ec7d93294f7813560a6b47c4064f07555ab87814151a595d7f62ed77b771725f461e04f25167273d056b952a803c6d08e4a7b1a2631be095f32ca61c66d978edb24b0e50082db1c0ace83174925bf0a709aff0481950fc8b849715fc9369bdb2a38a3c64e7e9015b5c7066723c439c8c792db76f7d11976409cb6d19f4bdc1cea071147d34bec758ab52a63e53ec092f57ff912d7d8b587e16b7bb5fe19a6b413025c936d4ae83b5d93c9f7a8926ef4f195ab5e7239781bf87a31874acfca47197028d209bb212fdbe463a3da2f7a4da23611e5058ba35f6e147be0449386edd985afedd5fe275ccbf002a5f245751e320491e5726e3700bab9d94fb7a5d3ea5e2bbca7a3f3fab8d743df016864020879b80c8eeb8e0c5d15a416cd9fee7aafbd6d3428404fcac04043176a8340c377a0213ed35f548e4fcfc392f0a2a222111949733834d6c9d789b0bb2d6c1cbc4ba074ebc416ef4e23166e77f924c604e512b61837dc253e29c6c157f8ce92e389a03a25a13ed2d37d744cf139fa6c27827675b7d390cd78c40840caff6ee303b3843ace9309a47c082f7009be53f96cfd83dd74e84dc62806347b2d5f542c1d26fa555c6ac2be518cc7910011d1eb47b64b532156072e156b4fb8b761ac2edeafdaea92aa82313cefa235b4ff7e6032f81507a6ef6cbffeca8149d13eb824ed0a2b1bc902d9455a1c1a2b9ef503f5cf13821f0fed09223ebeca05c0d241e8fb350726349568883d378baf73c6e4d81b51a587569b6d63fe0595f9c37f8b7805666f0a96fe57815f439bf3dcdca8eccb933240fd4a2ef19f3badcbe1765f776cff3dd41d015f928aefc9862b50bff52e3957b0327e5ebcb21f2ca2362c41b4284b8b2e454f74d42cad17b90b867412f0025897521a32669a4b1248ef23a568cac8360ebbad56fb78e44a0488b04c90575b0312d5be236f98de1846d55e2280a503d1b7449a994a17bb3e290faee6ea7f0c533f52c7d1fecdca7008eb0a2d1f10c975b561ffc6b29536614d4f0f7cabec05ec0bc3af9437fd9faa3c7e6cff7ed40ed011962bc6e6155ef09e1167675555dd0cc6ba93a9b8f3226fefae79b9e4dc80f2efdcc7f07f82fbd06a3fd6e65481f3d9a3cab978c79da78d1d7ecff396701a7d2815abd061802013583a087dbf8afbc4fc7f81fb205187ba15eaea9c640d0cca7d2050ae71fc82538d51e10cb20bff2a797f0698d73ef89e9c0abd88632e031aede0a7b98f751ee67d58129700ea4d98b7a35078f8a4b3013d18d249c0075c3a409433727b6f7026c16b3be735c6e55b439729c9e5283250a6a879e0f4465d01c90946464b27b25a0a4af8e04e441c94a4104aa303a9e2f5a02580f122bd2bf277968d55d4ff6d97e70cdbcd1b54c896031406995230a31a513c9f34b6bfda1bff1df85fb76cb40ec92766cf1b9a93a442e81a6d615fa931bfb21a1e6125b06d5fae7ac1c0d2e34ec1cf940f8140c438759934e3a983f5490786e6af5058dcf558ecaabca780103564f470204b922a4fe6e5f6f2033a7a96807c62792ce4ac686a65ece54334a4784d850b4db28a1aea60968dbc008719960491ecdd5b9cd975ddd7741daac4c5736dca309e668bf5c6959b3ea06005ae653624bf1668afb0b6e91e272015f6a66fc0970d10293b3c97bb2c9b6a7b7ef7bf60e9178e4c4973e5722b2fc0d42564287ed6f135fd3b63da37827e45a24c352e83ecf10f5b0b3bb9559afbf9012a2328f76b5b3525eb6222ad8a8e006b5f29335c6c14c5bcaa50abf2e004ca3c085cd40e5ce4177b25e4cfcf8ebd5d0c823252c3f5d52596c0d13dacc201bb6504898ff9631ac07a211b72d10481c4d09558a9ead2b133f5e6c9574e43464d8f7639353d892f1ca47a1097889f66c23f0b60a646c71d347fe49e84e047fbfc8fc007b846f073f6614d8538dd8d19a9901c79b05a397279311eb6b68aadc0c4d1eb3101a833f88e2365e2959aabdc126ce5a59fe0ec5a5a122e6979149013942f57c7420681aaed4055be6c0c48a9f1b05749ca5650a7498e6634afb54ced9ca69be146a141ad4454ebab5289c51f70095ac1a4a9ef26a5ba279caa5a9ca4ddd07df6ba49467abb61cc854f20f8271f5c9ae70f57c94f61cb6f67b6c3b122418a871080d1c407e4db2920571bb314d52f08d8e6128cf4d350277359df6557136dcb2e7b3b96bb0be045293fb1a14e17dbaba60ebc9468b63de6cc5f816d48760b82f6ec5d4a2cb3d7d7eb6ca17f86a94f89685de273315b236ffef0e6c4f437321464d75c1039da880524cbb3c27dac2b01868cf2ac6645490f3e6b8db55bfc9f71a8b09ef17cde4acfd8783cddbf4fc3660f4160de4160d43c9a4408c604b0028d858da16d23f1b6a5333cec4f987022349eaa7b97c0d77247692a82900bb6e64e552598f188f482e0c381f9e982e183a4838945203ced7bf3c6e37cc4bf4dffd128b96606cd1920f47fc7bf8e1bc753cbe791ca03291fecee5cac29e5ed0ad7cd0ab5b45b659030b16ce5e9c574f882e1f94f15d22f81a5c714cd3c738dc5d0216118e66322435beaa6ed7b2f6d1d20c5946baaf7ef0ea3ad12bc00133b4e07b03d0984bfb33c1a0749075bee60aa32b0fd45fcf83963f61e07925461803c8c315f6f6cbc1fd5df04c14c8540cc7edc119417b0528aa3087a782ed8a6269868b1ed3057fe8e510a5777ab88ce9bd2473e699794004a9bab24e5fe9f2d5684df86cf7cc4ea7d32ddf81cba123e7966d50f3b5caac7ff2b7b14fe15ecd185cdee8914fc6c14ea80a1e864f34088f238bf73bcfccb255b71772b431c691b107c02307c5ea05adf36d005ee9c86c29589aaeb172e2277ddeca6924ac0887e1a9fc4bc1944420ae83a70563cb281f64956bdbb8619ef7bb589974cc9e70261bbfac6470eb3e754255f2f1374fe19713934df876f49852008125ca343ce5448b4ba7d48ca1228c2d1b4505352e07ab18308909af82cb84dab75c6d053cb8d1c219278353f57b920d43606fbe193958296c08b47aa2e2e3fcc32c07794eecfc6029b9eaceb9e6d69877772f22ae27ac222fde8b52bff096da09328d578cf9229748b0f10ef79dee3a896247aee8d3d51e8bd82718b2441615fc38292a7be85519a1a49b400cacaf0ed838cc0b56151fba414c5bab22d2bf48b07b95cd138d261d899680c6f8f8e106e5fe25c5c7f09732d0fede5942c0f490a3baf9ac0a2c5a39ace75d3bb58f27346df936f290814bd428628c0e25c838b7a1faf6b62a0a77ae57485aa4ccb061f70463f793920209d82b59a33b70b61eb6c4481654ec4e2448207b98bf9cdb2d9db004aa2c8640d464f232c56c4cdb1ae955547c36b5c749a97658d658551866242ff885884df4388fc4925a2f5309f9991935625be1699bfd741a4514273cea9f6de2873fbe27c00c7c1c785ed00b9ed62698feb6f201b0b5c055e1e1b1261e9a3d3bb7bddb5e8aa00995a8a60512e1eee5c1f6bfa6c8aef396659baf67c1ab4ebfce2c3010351591610b8073b70f77e3befac771f7bde0944d5abe28a0df973c79dbf7c883b2edd038126487a388d2bf03a69709773b43c4d68d2a9e1ace0354fb7578057e303dbfaff9f3feefc689fff11788118be2651946111aa122c172a4ce2a54bc44eb12ac64835d43938fc6f2f9663b702fccd7a0b0ca9ce06929b5dfbb2fd76a10eabee688cb3db1e3ab43532dcee9f038f5690e29715843a040b7360585d79dce8851d151ad3e54c3de04cd53870cc0a22f2144f6dc85418e3357b44cb94a5b5b1e92c890b462c1f50a66242b49e0ea42b25d20c0e3eb1b7bf51132eccc2206f29c36197902d53150cd0ad7524dee4c9976bdefe24b018aa12aca768d2c91f63389e4958fa98ba3d05070299df9ef3c3ead2fd15fb863cfd7c4b1f64694308eeee5b29265cbe3cf7fb129dcb21510398089564b4926f41f009c0f0791f92a8703ecd037cf43f49a03eb187b954c5c694f5d178f5ed73dd6ac98de9ea03b097af48d832d2506555a493d6693a0de4f4908638cf6438e43d21c5e0c079c30281846e07fbc2557e3946c05f85b9ca1b73875b49e9a8c086285f329dbba0274b90ed9db6f5eca49586395698ffccec5f1c8c175882edf9e60ae2cc2c228cd78e0d74935b5a6d2b2d61d4453b2347213f4ed92700f48dda575c85145f4b51007111624c0698a6615b197aa16f6ab5c2eebc7632cd86c0bdd881cbf4a5733a2287dd5c1f46943e60ff51f89e7976638b3ab3e095b2e94d444fef123849d64d87b66fc920e1aa3435e3916afed724380a0c04f7fddae5dba6d97798fb1c552796c4ac4f73238c634aca0ba4f7c182ef809d2aa841e4bcefe82bd449ec36c1c36cc094154d0c41b97b1719112c3608289cc426c82229f347cc7fcac91d1a74738a1d2cf8c0cf8298377d37150adcebcb1db12a489d322facec26a76be20d68d9c9691779f46e1929d3079acb4418e605e232bca083db55d2cdad1e64e8514474f6ae44b5a7d9d3ca068bffc80bdc71dc747113a58ed5a38893819fad855f255cb99d3a7d4d1921abed3a3f5afe2c70c375c191b42cd44214a3ca2a74427a4ac14db35b7d27db0767d20e43b38420e0ab94a9f72bb8054507825795214c8f6851902c31f33dcadaeecd4ee4ed4273ed61efa847abf26b20f80460f87c00177a98013169d1cbd8a66e1616fcdd8dcb940f50fb3d082ec1ab91854a9d679900e00438f99a11773f9c39ccec550be148caf473f3a16dc7655da55ee40876f1fa5dc922f28fe08e001a5387d246b10d4d645379085b5952381a29d3250a53f1b10ddfd59788a4286f01f70ff79f3272228ab76a192190dfc1c9225f2adf37b825d08fdd3619f6c841fc01041e7f071ee78b8b12f2857dd84227c9d8fdc5b199dd944f894a45c497ef69361306213fc3bcf80e8094c0a521cd687de7ca087605f14327c1dfaa0181d3b99260e377218f120a85f4d3ef26e2081b85dc48e5ea31e18f6ffa5981ef3b810bab2b136bffa9dc3e66a6c9656d14ff6a6c197129107c30818e6ec920f324e7e23fdb4760d74c60fa12b03ef88eb38385a5faf561a1a0a7baa5f301708fe1f9a3c5cc791deac5ccc6a35a6cedca096b7cddb3d7f6a35089fcad3b42015e4fe2b35a420dcdc1f47448b205cff9f0291e48265d8b3d545510b1d6875fcf8720e7ed20e7f8c2151cad0bdc7c6f182e2e2e9eba0bf69dfc1533aec5e7ec62f4439df1de25c8b2ee706adf55be6c2ddf92022327b6272e597a207c7da6384fe60e4863c162187e3798c7c996dfa6832d4830fa62916ec5df9db8c4aae2e4d5d615cbe633faccacef04c2c8c93ef44d2c9dc204e17339e1741ae640c408b018813feb2382187a7292120491170234cde8cb7efd09f9e4c8e888a810787208803cf5fab83011705b10b83208dc35089442829d8f329f7ae88a38eae7a88ba10c54816f344b51874fa311a57f400f4247974f86f1edaf7f612efd107c3e08365deadcb75135bb2b67104da9661a177e0e04e587e2611d37572fd3a772be2fc41bd42fd94fa8a5075a68742f9edd693a9645208059859e02f08fc4b122749e1b8afd487b7eb4bfcd04fb8441caffdbad42e14e1c1128195dd339990d9e45d3ea29c8fe19ce18a97b894ce78112ca7e2b0a51eab164c4e3aa13831ecbcd1158c93cc00cc621272e0de85b08340202158140544e26f75f40f0488df088dc73cc159fef5fb7bea53751a036ffd0d227277a66f3d8d9443db79215113c87362e8c0d6f2aafb2ca0da7e648776c3f4b7abc81ffce80076c34ac56bcf7dbac78ac2222fd97b9d95318abd0a8c102ea9fceaa701f7fe7fc0136dbeea3aff6623f19233840b2709032f6edc9740fed3ab9fbe01e28295cc470913feabe809a33bbbc489d2db3bde7006c0a0f79465c67c5e39af333a3fddaf8b82df184cca76f15ed8bee287c8044ee045a276de1dc67b1094add476a0113af62f36f0770d81d2e0ed3cf5561a4000a3886fb6995be8376d7c8d5d7ed51ab531880e171a38a92c307b24196d7bb2dbf3c256af8579f120d992dedfa6c8410f82aa410f1004e1a40ead43dd5d9e8bffd94e85fa00fac78d000173f5b272f508a312b3362ad05e0a53d469b09bac031142a35a1d9a05c144a1ad264be25990a3854644cabe23b8cb0cb2b3013ec72efaf29e1e314c6b698dfd12a0e7ea7ad58f8f500aaff4f082fcf077c644f8ccfee5b8f3346cd5f67ee531df4e622a354c28bba80acfd56472c2aa716a080d59aab5a4d539958bdd9bd63e4d5eb6aa1de66b2187205c9b355fc6aa5462204817507e1822f14ffcbedc1a1e0b14732ef12f8da3f9ec5c0ee757f540e176c8d0333283d55b4136ce6bbf1edf739e9ecf3892f927b2c62e6453398a2a7d008dbc1c21bffd27bf18db61d28c5b96827572f3e8aaca57de86d6e03b07b6bb0f211224dd198bffd059fb772289976bed2c56e05b1c9849ff691abe9776dfcd563f46762989e964865d1022a62fc2a7890d67c08c1271476eccadda903dc3e856474fcd537a1be425a2604e1542f5b2a8b96ef44c0bfa1ff7fca23961760eb7b231a6ab12547fc44167d694c3352352199a9ca19bde3dec05566c00dde10e086cc1baa7240ca35148887f4b033560b1e5d88c5bfe757196e3d38178df266e6b7177bebbf5c3f44b4c35048710b219561cb93eabad83b62faa849e40187defe787275a1bc004e3aafb575caa11f4fd6de9b6bd86e2fb67a9d9409227197a11d96f8791269d38055757964ce755456bf585573151967600259b696694083af1ebe19913b1ac5e9ffd8e417ed45f9742abdaf2642b2c58d01cc5e3eb71b9ffec74393fdaf9bfc36a5b336c94fd619f594d82ff2bf7764419c1a41e9bddfdc9ccba2269424ca6b5190f633e5432010b1c8bbf41b9637b66c1babe6a17bd5f762da6a286fa16e079876200f11ae868b8f8a3f93afb614dd1eb9818f4641e331ff46d42f3284ef62ab669c6b3bfd59dd976be05aee211984e55101692bfcb82bd8b91b3060e1216941131d1346eb476e23426e2929000d6dfa16c303f4f5b51185a876bc4d69ff078fb6daf72165f5374dcfd64f634d42a09c3b5036822f4b88b413b6eebd16c6639751cb6e50eb9f977d47ce6119632ee8ec833a41da0e4871ad3a66ef774c9f29a1472d478cc564690b05c3ff9a5a552245ca7d109ac1743e206ee21026f6dbe216dcec6216dc521725793824f9d939244cd9c54ca5c4cd4df8243938b9a4b824cda5a53878c4f84eeab4e7974566f1e41d1ae1bd1de349a8c85f055050395cc7edfe3c40ccdac1a4765801a00d356f294895453ddc75376997dcafaa26e9fe98eecf80e0fa6ca1d057ad83e5c82003e14bd04de4e30c32908eb9f4e461a2276634297b5aaf33f7917af50c71551a1129b867b5912095ab79da451b5bddb040aaebe9a5d88ace872de28d8192d72e9b50ea5f080798d0382953bb1aedce583e467c710b1634e37eb0bac98d458fb7ae3a32c2664170442bd2df1c2f0aaaf78c9017e8fbeccc8430f4541ac6b9cb1f5041c891dd015b2dabda51d65d247a5e006dbb0d9ccd3c08d8e5e7dde7d593d975685fdb0ab7ba919deab0535f5cdb24a230e56ef3f50a42f45748bc414f070bb563eedf1f9f6e742de17cdd33cde37433fede2555acac62b5077748c1a47902307c5ec03db3e5d267bd068abeb6ab74ae968dd1b3eb33c46dcf9d87345999372e4b89b7020654789d24b25d699dcfa7345b2c466ec3751ce21d6422f0abbdf9b8e95d21b20a416bdf416bf1c326333a6a301eeee513fcc2d0cc1051605420147f77a6a38d7d51c1c71b947a7518f3e175551f599728f1d30340c07744bed7c5214dd14041c05b2e1a5bd45f57964f853d4d09250ca96b6df830cfcf6c09b3c686d40fb3751d4e3b779eaf5af66dd088918c1d66d235b6b57a21e4e709e623f5dd7616ff2e54ac34dff3ddd2545da8c643b59ea728c92091e050c1ec2940d251c054ff604f3efce4cbe260570f602f1a40ae6c5f06d4f2de790e20631fdad261554237286aa10d561e18092137970a5f316a19cde3fef69e3690f3e961f4dc6651f02d74c1e76b94ae1537491372de151b5d313f30be6cfde923ef8f3fbc0d8112ec4071bd018269e3491c02aa8ed0b9766f8b44cb105bc9e73d2aa45b770e059c253d0d91d5019cb99a3621824e55ca2ba4124b58071730f15e4f5e184c239be613c013ff64ef0ebc74707a416b6a38782da5a35b1fdd59bb7ae062ffb9e6b714f9386a1dfab678ebc053563fd31525c6f88789e9b646f4330d196f22a9a349d816441ab07dcb36285801b8fa4f7ec22be34b53c30275b467051f38b8dc858d52893b9b22f5631c006d4b40c5a4466a5529036422e06d48d9f585f7f7d7a2b85559a6b048e1b66645946c65817787d27baa885349c57808b475c9e1fe75db660d360d29571ce744514a7cdbbc00ccc5db166ad63a13d49a7442e596c094e365e19265c03c2393c3ebb5091e4def8f772012e90e12117509121edc0e1216d48f8871e6b8d768e18e84baaffe7e383810d1af8f501ffdfb1dc3fb3795b3e8d78fdf9e9efe237c7bc580f30dee7f3e3dfd7bd10c907fabb3e17e7b7a5af4987c4755237c797afadb16fc3b2b0e0407c7fb5b2cea3f0abd3b88f0db8930c20bc9d843a2af639cbdb4d02e7f805528c084557ff4e9e9e318ca77198ee388204afd39ac93890bd31b9ffa34efa1d7a9725ddc83ca7f6d189ee0f5561e23951e355a63434dc9b9bf9d3808645b1bd6caca43dbe3d730146074636a6e77a8f756d6ed573ff32ef695d6be3aceebb4db3b7ff55d6cb02baf9f7d175b13e4d40fdf01eab172fad6f3bffb6ef67737643fb4bf2bf327e7c7dc373cf1b573b067b3419b06b675197cf9434600b139967007d0e69c3c687358ff1ab572d871456cfb03efce3415ab715c5c30e6735c804b36766c2e1278fab49c833cc18c3e782f79230174d47e6c218366f84f386ac09f0030f9030cc05e2c82f20298ef3b0239e5272a0938b5068be611ddb37be208f35135700814c7422e23c26800640b7c2b9a85a6759ebab6e2f318845d0e5223992b398ee34ef877ecc86d625a8e543247115f7dd550602bfdc45efcd66bdbaace67aa7765de32090033d841f0e19e69f5de106f5e60328e79e0f5b3bbae3897af95279270dcbc8cf8cc97c33d633f942546ee392d5c0220dbf608ae0cf902f11c32b2655d54fd5dffcf1751485e1822b430dd65b3cd9a708640afec4055bf3adb351deb6c7717b53d11df3f4694ebc7bdedde98d4ddef2fa551abddb88e3f1642cbd2fa7c830704ffc4a1466dbbbee6537527eec4f4ea0fb0015b35d0d8546034f102bcf68fd71766df4f73d6ab8c859a61cb12ae09140e970be139110477d3e56dae02c670a32981981d9e15ca0f42999092e6f4d34b5063d657ddd2433b97f9289823be789f717e318c82c0fd5f7a9f7d00c1ff47799f816958ff82f7591908fddfb5ef2f789fd580940fea7d26c95227f5d1f90e81d8de47e3275b9a634592686e150cc67d3ccc12142ff56c8ce96f7f4e5576885bc076cf334b21cc1119c8b970dde19afb79a47326b96a8587e2601ab0d3e1e7bccfb0a6f34e12efaf0b7e524187f225518294ffb3de673ac7cf99e3bdcfa0ebc7de69a317abd6ddd0917bbadcc07a4ddeec0c1d42c27d8f97cdbf25f3015e338c3abb9c8a7b0c87407ae4b9e6f312167aab99834f39da9eae3fd7177f5a05dc9843b4bda7b412581d512b883be5b25ad3be4cdb6a816b795ec5df0b25c228e8abd246ec57286d0e9422de701c84276fde1a78afb22bad593a2ca95a6bc692e13546c63614e37106049f000c9f17f07fa3fce17ef16e18672fdea6bb145b21f992a46de5a16d587767b3bbee988e09804825f029435777ed1d5127aae04ee7468c0fdd27ab446f19297437a75ad3c3c1afed15ff15ed1db7a35077c4a45530a135b6812bdfec3e288fab7dc69193f0de16ae0689be002c222dc1f55c05aacf67b39e8fbfbff712f75da370927615ca4d7aa5a8e0aa73e6e60464597c40f646dd7e3fae574a5fd8132afbfcf625c10c7703ce2140a95f24b5f3bd9c3a0b200710f0b43efd5442222bc3b7d04e399b12b2485bc4d0ecbff43903ff23ab9adf918b87cfc2df1c6949c68511991790525063a333a265d3a2f6d1bbe0ea906bf1d97c1d55f5ca0331528ce537c16b2100b796cb9dee034b22eb0c0268a1e9fbce5eeee597d17e0eb18ced28fd5106fbd647c4a2f9b1d4bff6837b51f967a3b43f9fc7db2ca65e3fe87b296f1eabddec392929b0741ab18bbe500a3e00c3e333ad6e6d3f7cc0169c67ac9007db93bab094b767e2c887caea18b0adb203006354921a696281382e5daa01e2cbf873be623e95ca112db8960bddc36b3ae77bbff8a360934afc829964a1d4d5592559ef3ee38a51b2fbac2abfb7f4caf6b4825712138ac87dfd8ce08915b0990486cffb10405de117223d2cf219b28dc6455ed4116827ecbeb3d385c1b2c9afe744550aa058b921675f6eef6f23f43da3f90cdd22e920fc435e47f8d875854fbafaa9ad461028cb0e94c997aaed48b220a2c6814120915810644cef48a24848d7cbc8422f0c1c55efe25a138f5e9b7f4bbbd05ee3124ca5cdcee398db71e37b1cb73b0e171542e8da8477b8415d0961be60af352f413771752d4215820a211c190fb07373ce5cafaed8097caf4c71edb6599f28040542e0e7be428c1f3732b3e175e0c2e269876a2db04574427ff20195f507fe23237794d752e4ea7257efe42c9ace57d91acfb1ad5fbc9902ddbcb60a088e06d007cb37db7b4c2c6caa97042aa137c4ddbc6fec9392a0eef1f889098ef857fb0f837fc2f4e00394b2cd7374f010df0b85d214eb142d7d0a8ff7d13f7f1315d72e8b76ae58d64200c0a4ce446814c97a366029dba18a7947bb31af2ab74539065142fda1e3e8799794a39b0aa1233e1376f3cff2193c8e91c20da794cd366b8947cea9dd33b20ecaa7c6c3a414e5a9e0038c600f514a2e38f63ac05b613e7cd3efb9067d045b41b3e956bb4d3c20d0c4450c30d3cbb05251c058935315518a55b7d4f90f8bbd1fa065100e1155915bf47e8087c0e7efc0bf84f3c3efa3f6c3cabc0863b49c294bced0c2cde262ce0952e8f1dc49e4a30e82ca1b21da24f595c04b2e8e3e6b3dbd83c14415d0c31f98286101927eaaf61b297fe2f4e033d0c58e6f3f8feb8ed3ab870713d540444d50510fc49801f41d2c900138fdbd5ca4fe756990f2a98514b0cf7c6abb3c2660d9b666ffb1f2289cb4198f702a7c9d0df67dd2a06c107c82585fe4d2041426c7a827cd7517912c44544a3b0f4170bec3ff0b0620dfe1cfceb43d1e197a1227e35dbaaf93d897308ce2f14b1f11e0030a5f087cbc407dfb55dc6eec064ebac1d4427659e3a7ca91d11d66d8a5fe1eff40809ac8872b53489dfeaaf6a7e59164b16523da98715326ee8101778b46f257622a5fec24cd7eb393bcf2a376926e4abaa49b996d2c23d4fd2384ca44ac3bf9cd6044ff57ed24ff027d60c583da49fe6c9d7c404eb7392135121f83bc606e622336a3070b26baa5b9e052655bfa4de8540dc52c8036fbda4d622d5ae0c299d1c8b0a19633f39c67e4e22749d00d8b1d62946603d68ef68d2325906fbbc29fdd376a0cb20b55f1e6b562aed80e042abfbb2550ee547b1a9df0cfdba8798172e1ba79d4a0730fc208e3bccd9e594bbea45a789dfed2065e10e56690edfa462f4095b05e4465121445bd17797d62ccd4ed1aaaa3787a1286717d1a3dd2c7488c775f0f0f92ff0ca7c2a4201473b889f444ddddc6f7186d6924706cac2cf63888dd6725cae00b241f3a0304b7506ec6545f6a9c273acfcc5b43207f87ca38d43a0765313b0a728fdda873120269d97eeb8b547bb4e4b00aa4619217aca3ee60e6244b4b245cd7f4ca9c6eb6decbf12e360b58d62d38de04628f5973c087b405e7e499481589605909e18128684929ab9fe2f6c00bf0745cc6b14eb14345ae77c452f3530bb49b923547617d77b902239c49097dd40aa04623080dce8b474772173e4028810a2dbab4db3da133dc5b32e941f07539f08040b177a018beabd4bfbf92a992497ee94a79e7797ece377468eca4ecc90fd3a8bd8b9f8e33be2a86278440210ce771767a611867f14dcda533e3d4b865af0e4d380f661f7b528742cea39dc7394ef83c6e52134021e8c5e7718e93498f138191cc46350ee78b51a08f6c70e0b5085e7fe911e49b55089def0cc3505bd9425b4da6d5a3b8e9e6667c2cf314852b0aacf7580201f103ed47db28e3180b9f6a7ddd3be8228a9026d2b0e337647cd3ea862d58b783bf8dc287a217f1bf16858f2eeb8cfcb0bd9621328fedad3802aff31164e74f55e1de781fab726aba4cd40148f5ffcf87a5f8d13eff23f002ea08e79d973fcf0da7af5505fb4923a6934fb8a3140985d61646f42e733b466d0304f6d66aad5451566bda552db3c3076506ba22fb4be614d9bb0d577518a868c2beac538c2f1b3de57398c0d91d09120294b95a3a5c9bad22570c5873ec13efe2f47ff1f5f314043da75103a5903d352ee31f61fd3ed3a3f958f15e4324e77ea2c5b187e32d7b3f6b671bcc0794bd0aa894f5edbf4ba555dab8a7d6b4534ab8bb4042b8998830b2e46d7735b40130b9f2b044a2196594b1943cc7af3b3be9a3701db22e515d8069517414052be7e6d12689fac5644d0c769cfef0984df2c8cf65314ffd56e1bd62c301c62d8118c41323015f64d37a2c3360d8ca0bbc7b84ca14a9eee6c40ad9d2a2cf552f7d563bee9e6c427a50edd7469de73b1f07908ebde98f8f0da0224b1f86246bb4ecc1b5733d7cca81e09bcc18af7eaff853c1976b1dc4d3af7508b28d71310685d57ffc5a077e8a434644ca0aa5322db3abd4d2c91f87d1b90804ff44e19e208b77050de176c989e9f7aba7474bb9ef81944f0046131f20c8e0e2569f3c12477f49f9da07ca9b920c258ba5ee3a38f9f6aeeb1ee82e360e80c0ae890c477bb5bd2179407e6cef9b8c575e027e3a3ad0a63a8218c54eaebb32475773085fafe6da66e65b13357795e1b993e79283bb1f2b3058b4076171ef46914120debcc0fbe7d94af6f39b4dabf5d40ffdcbfd560478ef96e06de70edabfcde7acb9b8f218e0781103b0458796a438ed1110d98d5af1ebb6a4eaa44ec747e814e391873e55ffaabc30fc6798f2c9aebdf72fb731c6be8d69496eded514f334da832600f3c0b3b2cb75233e7aaf0db8f184868ce6e5f2f228d94e1efd64deab616a557a1cd9302497edb794bb7125d8df86ce4da7fc5b42e7be9afdd072d15b9a0f48d7b23b2ba6bb6cb9eee2513eb8dbd3f5e44ca1ae4382f3801c8f59b4b0992b39c0b328a10793a4a8ad9ab147666f7d3e55ee1186ef7a4dd5c208817a4dc5bcc5170225d98112fab2f27d799a930902cbdde4c818b670ae6d09676b1acca35816e8f58ff22eceb936236320be1345eb1d7a3183f0ea48e3c1eb549927b16677d59817e0e34837bd64e313984624a979cf49a074d847a46b553f5646364468a9bbd7bf133d105874486ec6233c0741e8e16c3c8eed1d27e9a0d1f4a8491c271d7142a110cea378e810c8bff21c27f7f002d3894458280cf7554d186e654df3b369e2db301ddebeb059f3b2b3fa4a72d5fa5d40dc365058d9de5ec75abf8fe173c36b78f807cb8f2b1e1a67ceb8f04ae6d6d1cc412059db19be83d2473d13ac2efa67c3ad61e6153111f598254a9b6ebca17b53fa2205f371fe49234c4c41f4ca22d8a19e1c9889d7a65459ed5a0198ef5dbe2b368afeccf485cddbab29ecd67054aff1afcb750067b3831a15fbfd2882ca43e8de3169a7ede0e54fe55ae4f56478f55fc87c36d4f4db93faf09dc3bf3fa9efb749a7f0cec504373c66e0698f0aeae867827cac639ed47f5dab603d4005e439e87dcc59a80e095b64203bf9cd3d241ebadb3ef7fac8e6d4df6d3b6425e1f46e0df349be4ffbe04144a125e9704d2f5b91537bfb4ac089f890a17496b853628922ca28eed2879f126b0f1a7473c1f2022f306056923153636656d8ce2e9b88d7fee92a11565316d49efe45ca1ea0cdfbb21fb04397306eda5fb8a86bec3dbee94177b9597b6ad9db764328c5c5d6d3af2209fd2b5f32fa67dc56794b754687143d6143874621e622f258cfb7c8fab86b3f32d2bcc51dcfddb2b30a5cfb44b338e9dcde4012ec609dc4a0ee9fb2fd840809cd721661f010eb0a0a05ed97a871eabf458d6b383e6adcb96e235b12823f279e833c6dfe63e239a589abe7cafa657ee227baee6993a23b9b93c11ea7623fda613c3d9de1ff1f241b04ff87fbfc0fc007e85e0fc3201196fe5c7ebd7d03c3b7274216553dc4682d4c8683073ba12fd29b1620c25a1df0868b5a8c8a2dc88fc776bb23ff187b079f642033d52676614cbfbe1982dabe83dae2874d76f56815a679ee9c60f78efa67ecdebf13ee7ed8ee9da5fe35584468b088cf20f47da7b936a8a3789bcf4b6c8ccc58c07af1d39b5bcc3c1a34a7a3a3fca4dd3b32989106481492bfdbee1d6cc51dd9bda3df8d5a39ff8c5294bc9a772864ddcac95a4ab2844a519f2598b5241f819ce3e557bbf7971b9433913157764706af2a8beb0b8cd319489b9e6b64b4307913bccbe9b938f717ecde21f9dbb9dec0fd84b39710ed64e5b3b87b91b61b0a47e52af788f9ae52aa526d99bc26e531c6043aeff32b0d6ee1a7bedc33c1d5d2bd559bfb60872645833060979f4106569438085c7845d9607d36a060ff9942df356c32712c090dcf029301758cc757e34487d25581bdbafb3895651f3a8305eeb74b1670479d1d5b13edbec44bda2e868f0134bdd106e09b3d782a29e2d2fc171ca9d37b1eb1843cc787de9cb851f9923bb6e5a2546aa2f7bfe1079a87e8b683789bba04d16907f13ad40f2b2fea1bb374d1effff7bb59fa77269fffe64838df67f7867c6f92eefd6ff689f0db7fbfcd72bc59faefc0f087ef93ccd2bf609f66964e0dc1f9639ca82f8aeedfcbd841b0d84e3cdea2f407cdd2e7d75739655f8a56df7f53fc4160dbf279889d4d1ca86137480612966d6d18b107cfe0c47932a541a677ec4abe26112534fd913f63f90de9c8a8eafd54f3cfb5fc66a907a30084f96e0f1c2b0bfe0f587e7fb7e7ffd80e57b593b2b593f87f6ef97de925c4fe2f5a7e1fb782bea490b0fc172dbf4117f25f58e9470d00859fb5fb0695c8f980847013f8ad42d23b56e902a2ebae728274412264e1def9b309f050219120c52c40be626498286d59a87545caf2a618a72a2272d375f9dce236422da1f383a9ec185fec21a047f61068c503c7db43a0bced3ff880effadfb18700f34604bb6638191f692344340fc4cb0457f2bbd7c9fe3f680f01e24d708a3d0432d9c1ff8fbdb78eab6a5d1e87f7a6bb1ba40405e9dc1b1024a5a4a453ba3b0569101409e986058834228874a89420a1a08494a0221d922af27e84e37d8fe70aeb7ad07bcef9feeefca11fd6b3679e59cf7a62669e0959102dedab3f84d4350f1ce82cb5ff509bd5bef7a029bfc8234452c536257b14b03871a2c2e867e1899ba7b9dc44aea278b785f895b44d1c5d4ce20ff83ff0db5f810f0a70a070a572fd6a15e13d6168318c893c00e28e84658e79873baa1491bc7afc52ba0d80d03aaf5c1cf21cdda950ca2e56b7f6bcd725b812c59ba8f5fe38ab1b16390faabf1a430c7fca6d74feba6d04ca03c7bb91729fd3aeae8e1b5d54e178cf4b332f78933d2b20d8d803049f080c1f06b47d2ce65363ea515e9c9b48365171c6c5edb6557b4bd1db8e7a292fac775799101095af10bf5ee775e5b47955fff01dfff94048709cd75e55a4cae9da04b4e2cf2a10843b3b08c5fefb6f8b80131ff73de7b150ea88bcebf8fe901a04d15af3861410ae0f5f258a13f896ef8e565d4df98599562165ed2ca891b657fb5d98115dfacad1de9c96224fa4bb6b77b57b5a7746196c95820528fc90a20306ea46a318e4de1068faa7f113296f650516a97cf20ffdf16fc37834dcbafb33f9fb0ea01899383bb8b8fc697c5c6b373b47336776b3cb269646f61666fff6833eeccf8be3258dcbd7b9e74fd60e37bcd4db263ab515e8997bd656c8090ee8c5b5eb87b5169c67228b60371ce461dd286b79e5fdc83ea2b98456ebf9a50fa50027c76baedd88d712179134284c55461f9f64074862297604fa893debabf247bcbeae50a39fb1427ba202e96ba7f4c6e2c2ad6e07ea2920aecb95f610113b16757fb4ea4062f96403824f04860f0386a7b1a98658ee6f212ff62c3eb52021357b9bd4b2cdebf3d006be18481cecab087041f50c5f1277c56cc0219e12bc1773d258885f89f5934a5929b128907a25964010e27610a203defce64fe0fe77f327e00e93ea5b3e179b9aeb7f1a87520cee7e612ae2e85ce9490947af81c47e4e90eeff9f3758fef098ff01e0c02e6e46fd0ba84154dcdc20fff4cd8ef57b33e570d61a44ea1ba7270a64eb23e6009a8c0aaa11a9de53d2e102d7463ab3f19ddd9f9fd9c47adc822f13b0ac5dee6cffaf02ce467f8b02ce6035968e59c3e96715704efcbf50c01904c0cbc7073b205bdd38ead617e1d329a77bbf86bb7d80df1f71d43bb4151a5c586d6d079aaaebd8059cf71a7acf51050d0b93dfaaeaaf4b29d46e177d72a8d70418c080f1049b9ad01826bf0a5e6eccc4394e844b917c02b6d519978b5caa4dcfefc2de02e63988b948ecf9ef158d43e6de77e257d074649258c6b22d8f2a3ee92218e0a6f8d78a36fe5bac68b02a62c7ac52f6b35674d27f71458329507f5ac1225bb2805e2112a2f87eeba9b9e4590fbd8888738747803552ebf92cc61e116602759b78e178446156817a3fed813fdab37f8f9f5763edb773783b1a51abbfe3d3c3f933cac9ce908d391c1ff25356747df6f59147a72a1565153295289e0a870dbfd63909867418c0013a0b929eeb8d619704d2f88591b88b8cebf1303ba596622f6eb423a65f3a0dab016463fafaf92910260cd2cf104666e34112053fe63ba67fb8195f99a99a8333d405813edb81f6e21ff8fcb1bffcae737f0863c823d182aaeff8f62fb1df87a5505d7d1d1a95df5d912c6953f93895158467909bf09febdbff27f803230feadb7fdc3e6180035638b7b697c42410e16d4e90281c2c64e4cf1028eaca1daede41934ed954005c78a4dab8279ccf26e55919ecc3bebab2c744a782a75cbace05bf654a70f9523504a17807a100fd20e966585edca376550445b1215e739726adba284b8ba74b105cff1a04496b77826f26ecf77ef7a746e95f003a5cff7000bd8695c4d6e2f8261e99d44e62305b8e10d69e604ad508cd978c97309001ebe4180c7ee3d9ef7ef57c83c1cc65b86dddc6a618b194fec3061eb05c08a09dc3012419f101740eb7934fcc3d6ff6b517de651473e5a8aa69b641968c86719dc227024e87c4a7e172dc7d82a1b64b194b30694cf9aad64e6399c44886485cff3995cfee81373cdedfd51bfe951cc71616896edb7d3d029b5d7762efe5f7ad59472123af79e21dd93e370a9201e47fdaeb8f8ef91f010eac95c3241f48cdb944c6c0d7438af899515157b5dbece0b72391d1673969b0730105e1ec02111a23bfc95e3481e4b94d6581b295ad76175f0749ea16246cf250eb7ddf54f203dfd4970387f9a64ed5dd05c9c00802d4265d306081fd7eb1cd1b8917db7ece62563b94988a4adc5e0ef29765c2df78af56d55d7700f4f9a5dc9fa24a0c06896f72148fb1aa3c6c343d59ff022348b5c4dac2886b23f65f82b9c9df423007cb7b7fccbcfa3f4b304ffebfa06a63781a1586e15b1ea68b0aa86b4a2bfb5de53adc607632c0c765eac83b57a961d3ea3fcbde7f00c81cf49e879bc4212743d61c8e4cda0ef92982f9fbb0351c8b94f63b5c4a0ed41a19a5f6aac2fd4726fa390a6000e75a6a69ee7c7266ebb9425657e47b142110e6c730cba9a2b7bdd343bd86d427018c66ea886146d20aad13dc544f1a9fbcd76ed4dcc97f5038147d33f0d6b5cebb6f2010db6d6be8d7c003049811e20652f25c598aa6dab5754e1a35137feb6be89a590c8b1dafd2fc6180668e74002a859fab532e2379ff234ac26d847c243548f78adfe3c5228d526a3400499b8a0627f45ddcee5e53f91cbca5bd2071fba3fa5e412347ab9b8cb77e27ef5f9ca71de582bc8a1fb248c3ce53f6f1b31aadb9f31e8b067f76f0ff3bf0f7cfd3de46b6b31c6160187deae6d2200adacd7bdcd62e3a7e4fb8b3a8b0ea6ed848aa815f261f0d62780e439fdfbf2608823d9e85cef75cb3121cd972722e4d2a49a92528a589322bd0593a435c5876b94cad743af49d90113aa06f9b874b0cebf67448d22335d9dd05cfd38ee65c4b2bfafaba9f97fbc6798abaedced4b8be9575dd886004cfbecfcd588639004df8481c47fd2dd2dc0b6e37e2c3dc4a1fee098b27cad389ee266a6f49316e701dc444418f8e8982aaa105c9912a4efe784cd48ceabc79cf2c6b6ced3abb4cb01a6d5ea557209895f8f0f25b17274ca445af1f5a0d12aac296e5efbbf411843e11184f30a07991c22ed75dc7edae7166cc5e0911fa07bb971c4b13c99d55095d78498e8e26c0e5a8a292f14a51938fcdda54e3f89bb9d9352e9df22905c8a3e9ea3e5194cb025fafd78c7fc6f51aa1b4e0342b9d4ffb5913a4dd41dc68f7cf0bf8b192320bb6fd7b7e369bfca960093888c0f061c0ca20065b9ec5fc0c037174d8f0bb07025d8f676b19954b27abd3d0d8c33b336a003a95990a08f6f5bde79b08814caaf7d9589e13ba49e25f6bbd7eed247cdd305cf2dbf48cee3439b6e75406fbdb06effb4edfe3d340171fdc0c45c9eb7892917fde1f06e8cad8b768f3267cbe778d4ce4f374933cbd4e94ed89b84fbe8957cad046cc78a080358f285b5a13dcf35495738c01b7b883f16a9c36db64bbe9786da86ecfdb288e6f7662a39b71218a132b71b7122f4c6d9a150eb347202f6a5feffa853bf1b99c33269fc93f24bf87eab015c2f9891a6d6e9e06a1ff17c3df7e272ef4b9244c24bf5ca21fc1dcf5f8fd226d5bdccea0343bd4b0eb0cfd38e2ed7aa5c6e3d0ffb213d35e3b3922bd24d85dce3a661649814c9bc4f6e0c5bc7c8ec5a31e0786fe018c47981c4ffb6da29fbd4dee9c18d3e5e723b0a29b9b15b1751ac4c3a84070551d66a502e9000e04f7af726027e3784d69b43e78a7142318516f6cf670fc1cbc6750b9497ecf300b501c4066beae23fb60a282bdd1a60e251b9f74b045dfb0b33ccc689e31345457040275de813a1c14a942a1f08fc3c80cbc809ca7a4e9a56a1d8665c11594ef3cb11e62c77963b5cbbd068a54cab979c4a0a393c978371dda0a6535bd4d9072b71fe49dbef15179d8db9f76bb6b83bee723ab2f92c61bac20b512aa1f69ff1300165f008103d27679365c4d9bfa8c74235abb25629a7e414d133b61c44deb4be351d41c5cd701ebddf1e461eb193a7a8ae8312742b913a36d06e8b39553cc4ade986e7ce72b8621484a3b48178270294cf7776a7597e7876985af7fb95648fa4a4622eedd980906de52615ce24d3fdf6039c9ab6242d94d24cab6e1b01bbc2d730a60ed20fc816900df14013e422b4cf9c76885c8be7fd6bc0aae1562dc1e7abe75a49705d1ba0d5810cc71001a7972f5083b1946fe9525d55f7f01db584a8912978e287c9ba9564467cde2d18ca8ac3c18d2efe05006d1f17709af71c57d23ee0d9094bf7db41bb7594d327266a8d96d89dbd9f89ba3f747eabdd2577abc0da2ecfbc6530c0e54ac388e647f767f80857e4d3e1e783aef83457d2fc655023695a8c8559b9fec062865c7219645579fb55ff3ba6c799d37de83410b8b12c2bbf8f8731ed567e44fe70e8413a7df8413efffb670127c2553859da398d9e2ba7c18d3700e32bda723588dd5bf18feeec28955d849adb911c14b2d431816154c4f1e786ff962ca5567d5daae67a9e1b9779e28b03c0efd2fc289e70e914587fb732499e1cf752961e2e5e8a5dda8b16fd7d556e0db0e8f510632a8c4b19353bdc553853f2e0709265cd0b8f86c0376ab7204fb03559e3dc36b982fb89af826ff3cd34c06d750c26d1dfb9da470d74fb6ba1f8966aa4ab38cd31e8b32273403a7ace488c4d294ea824a2cdb94e1f0fbcae867cbf09d76fb142b6542f3bad3d2ff653d35fb5b584f3b94b2c467b9adbc45e880780759dd9049ce707985c5c9b3c981da92cfd6ddce82b583f0f7b3aca7a9ff9873f2cf8380ba863681945dd5111eb7af36b771378fa201adbf86f5533d8aff00b49fc9168fa03f455e5eb60242e2f8e7249c65fd0527dedd96915398174856ed36941ff6fd6909190e7857e22c5624b2da479bf7297a1024afa396073c9659af8c7665bcd0e668e9810c70989f7d27da2459816cf2ee8c3edb4eedba852ffae656c54b7177fa7ba8b9e25bff5ad1e67f8b15fda189f5036d722c9dbc197650e5dc7201fdab45773cc6040f5c89373cc86caf4cc1da41f8fb592b3aed7f2b1a0281d08dba5aa88a3d3e8286783aa5fbf62fe16e1f90560bd007bc0e6da67b955f723942e8681ac75fd1f161c3773e5720245ede33d3adae722e44ea343bd438090630e053cd331a76bc9ba2a97b6ec6c332509d4e5b62e4e43c2ab66cf3216891d85922c02dc321d82c1e76279691ecfe25df5503998c33f906934b9e243ebe77da29b3cc0eb2901afed92ca4feca90c1181f8c5edbcb5eb67e542511f09e127d10a6ffab5948ff047f60e4413d958edb271cb05c603ccde26e70436f53549f07776acb8fa3104b6494bcfdf104f946e216a506a0251147717b339a64b6d4b0b7d86dfb235ff07936e7a9a40e3bd4332ed12ffa0abe9a924dfe196501b84e20db9d2e17beb8221fd7f32c7120b3ffe4de658adeb18eba5b0a827c85ad290087efd28747ca5bf216a2f9dc88bacf1caa923767d6d20c83463355b56202ae681fe84f0807fa53a84a5c77d2b894cd49e1c04849f2792a067125802d9428143d32ccdef997e84fb7daa98685a32d22a557b25f9d9e22b2d41029021b95bf188ea13ffd368cbf875f61dce5664ef1f2ed8ebc9c81c5f139d7bf669da519f30e7154498ec8597a07cb33dab6c7a1ff457f0a6b7c8f703f588a11f55aa8cfe3a79f6b3d9f525b3719bca04109f454e198d6c373f7f02fd7961e532a3c713b9ce0de1ce7c615c9c267865e2b2455e1f4379f4a818a61704086c9349dee34c070a186d341cd7409f5169482268dee755fbd647e5548807d38009d44e80d25dbe2bc87c7bf8596bbbe53892e11ad4fc4de087ff6fe839acee78c7f495b167f0b69ab7ff96d9a5bc38b2647dd1aa9fe2c5fb18fcd4f90395996bc4f3309919886378681b583f0f7b3a4adf4ff495bfff33ef90d88ce2ece73df516aedadf0741b22c33aed3dae809406867418c0817c4cced5f270e21cf3332f59c2b9dc3f842013e26d7e140edbb60ce812aa26a3047835b021e6b8e22677a7bbc93f65f3e45fe529e7d33bd16ada25b1d1d9efc3aaf6af156df9b758d172a7169ebc802c6f08235ceb943a830f2ff78e9678ba12163b8c8dd448412fd909d60ec2dfcf5ad119ffc5150d36a58ee3340cd6358efa72d3cc51bf60d114af3d9a863a5811bce30146eb91e73a8bb1fefad1048ebfa275684613735bc2a39b78c4b1951a9e5ed6bccb1509867418c000cdda114a8f6e0bf77c7ec1bb5a0a995e3c05cd12679c4a0d9d8b7436d95348ae019c3ef9e7c884177d57953b70101fcb56d2873abfa811111c48dbd4796218646c702079daff55967b5ba57c8ef2992c3c71262a18717b990a570e1b4806b7bf1afefe96fbca4b5c39e984f402967a9ed6a70daba970e3c9acb122ea249d0202ac0957d08f1b1d29c6be42a48baea9c094b3c52dbb141e1e889728b3c733f3ce40d7bb77e8514ad034c9e5ba4a82b2d69286e8eee76f3078960ad80c4e663e7737b573dcb822a12a2d0566b98703845eef5b958d36e771f8ceb6055e90996c21a3131c49988795d9c5301ac6561b01674d6ff33a94652ad213990e5ca982893ed7d3e57b8fdd556797fc9258dfe54d17047a7107aa84fe9b8357f2771dbc42697407aed823a7feb87f972f7f4a2e2aa642c767b52a0f61dc06b4d07455b0773a5c92a1e6be7739f18835438d85cdc24906421e4204c6130cd04b11ad0a95607da74ff4ea8347dfc78dabfc78860f96d86aaad5a32cb0b950af037266c1f0b17096dec8ad7982f2916445468624b39066197e81b4bb3a92ac3607a54130f6fd9dfa527f55e93a64755f00067c2ed0dfeedd89742e709e88b9bfcb8438c033756fd7bb38fdd21db6891755d9f180738f286a8b7137b387b052be23d3c51977f1bc498d4df451819910b727c6450fbe1a104c7f8201c18ec610bff2de0499e1d06deee19c20aba0627391824f0bf6f71ed76c2d44c42b80d468418080e1c38153f43776d361fa84c218eb0f2af0214451d32ed9a48199f4ce21ae01819f87c501a91b1df6e32b3c241cb45617f3d4a1bb2fba60e119caddd9fedee48e2a4a64195f4ba148fd0c830999d4ed7eb58e8dcfad8457cfc0bbcf351662cb639dae8c650f8f27d844a49b04cbb34504860f07425dbcacc222c3879bbd068376a333a49a155cab8b05ceca42bdedbc0b9584df008c2e92dcd4fcb99751aeba4619bfce85c7dfe56be97b7fe3eac7d78a30d2f7b6ef20a87776508b837029acf65fd85b99f110411455f2970ba2f451f960c55f8e595c0644e840f9c621fd084134f3bf28881eaf1d8ff548dd6febccbb2b87b7225d9ad3ca38d28f19994f0d24c20de3dcd1edc78587c547b522f3d3dd3e1afff882e80d01bb899b76ea2c1c49f9338312635addd8313f10d589f88d18a7bc24bb1c3c3a924a0d7525e9193d253e20d30d16240192cd0f74fa189ef7d4bc74c999df5dcbd88d5393879347495380ef0762aec006080da41dac00fcaf0eb63b66b56d503df18772551eb3dcddb79053dc1225ac05e6fdfae7c5f003f8867fc7106376bb9a9b705d3c36cf2e02b238bf4ad902107cb06b941faa56fe27d622d8fb7dc3df772b64fd0ec0d62f0c30533bb1155814f20e96ecf37966d86dc1ec2eefbb22b4a6acd949a134177ab776006bf23d6ae2f49b6b231a45f3daf7ea937a67216dbc372e7bab2e4c7fea183f4ffd2fd391f5cf301d7de3ffff674c476025588f59e2f5e7988e2057f921e6e671bcb8cdb4ad6f6bcc2c8285b327a0e53dd4f7ffaf998e20bd34da721d47fd8045cf0c24de40fda716c8fc37c068e73baa99c522a0fc6802c73fb169aedd4c36261a10a8189e6e7394bc6aac4be772030ce93080018f583e2006299a5af737b29fbcfdf293c079d17cabd8f3ada54101d0f4c9ad8668006d16eec84c9679eda3afa138da385a9a8de90a6ffbc206fa2bdc538b838a659fbfea1ce7ff19f13eababeac53d77bd3a12023267b9ca1613539d5d652c6d3004df422fcdd6cfdb53007c8c962eafebfa1d898dbc9def5c6619d8c0bfada83747ddd23350215e41aac1b91ff9ad7010f98dd91b17eec0b4b69ad3e1871b7b23e1991bedb01b75c7f0771460125ff1acf622f949986936fd9962cd8d4d3749fcc3de026a2275593feccbc7d11ff2e9c2f03cabc391364fdac0d04482caada81c379a1584681ad8b8888ab503e8f20723d3ccebde7a22f1c43a5bbd59a21e41f8f2a79af8539bfafc1c69a798f121f8ac3bf8cc0765bfbc88cfc4c1ccd2fc3bda1d1a67c4cbb8dee1e24aa9330cb1fad7e0b5c4223de605195b90a87e64b0a87f3000b964029344a0202113082059131040f84700e91f01a47fb0e4c38820fd2382f48f08d23f1248ff4820fd2381498284aa9ef6ae9666ae5697d994cd9c1dd9dcb9d8b94150fe87ff3ffcffcbf83c3f827fccfd0f6cff02dd7fc0f60f90fec1f67f1490fe5140fa4705e91faca40f3a48ffe820fd6380ed7fc19e26f8df24a8d72e439d9d8bba5e66d5722e4a2a4881f3aa087ff2f7eb31ffff00d2c7af847fe35ff9a6736ea95c68f1f54f11a6c372a3f7e407aa23ff49fc7faf2cf63f89ff8788591ccce13322925b033a4adab7849b3ed32afc93f827cc8c7bbdf20a8f8ac83487ae2b9ff8918256e5f03f897f5d9b79cf59edc28766a94b869fb1d1ae9ebfb11df24fe21f553e8afc53f48bf2791522111a325b60acda5ffc9fc43fba685981ad01658ee0120f45663c66f9edb58f8cff24fe7180f4c47b680a57639916e4b7e77b339e643b9cf827f1cf95659606e01af9868cbaeb9ac6dd99c1d049a3f827f19ff4a4de99aad980298b314ed80a3155a0d19a6ef6efcc7fb15ce6376e4f2c42f7da829a5a4fa62244732dbdbffb8c483ae230a79b4d7aa7c784743583878785fc7a3005ace7d67effe07bfc1f36ee7756cb9cd019ac0eaf76fb1f385ac200e2d917cc55178b2e53c858165f62c48825e1fe744e27ad58d383b7e1fab9823b5d80c1a926f3d1e59eac4b9a72a2ac673646146374ae9cb3b2e059c952c959f2b9781602b1dc3647d9f76d18f388cbe9a0a1614c7afe514d7a580738c75597b73a46e71f4c20db7a0306687bdc7fed81e4be45d89ec1ed99b1cd9424cd5251bdc4e56b58be8c1fdae2c20848d32fe0cd3f87bd55747a38c687fe31cbd5ea06fd1c23ce4b8570ebea01dc1302fb66249403872b56846314b73e12c228f33961c033bb9112c2c5a567725c01137a9b1aa16e1be225bc748402a616776fe32c30de05ec6f54ec84df15564653bc8fcb219796f8a803b7b38e50fa094eeaf835c2c17779fbcc4aee338be95416e7597fe339b7647d585af869e514364d7ee57c1e17ff6ac938c7b286df773ed6b339499b1e14587c77e09a616e32aacde8e8913142509fcba230a0f72145c45294cddd3a22589a8615a2773814ea2bc5353451f1316fb35ce5e51ac057f596074b2b1893e83afc84e20a04a76dd1b0e2dcfb0c33b919b6c59c9e04ba7d079583a2ecbd3cffa9834adabb308da7b49c10236d91ad1254394a2748dce1a595bf08f73e09fa30202aa25b51ab1e35d58231f4faf5d053b4b90d38dc5883167811ba568edd21fa5d00072b1bd16e5d426d95815ccfb9a153461b8a1e185637988693b508fd263939632090ceed8e7d5e8390f2fdbf9bdbd4bfda34b49c1a2ca7e9d156795dbf6f66d1e65443daadb7f3952c34bb94c8d9fac14e1c420fe00065c5d9400bd2eb1908a196ac2445066aeaa776ef4811001eded68ab06003d362e002a6144fa568dababfd2d08a017ed0733d0a01c4803e769d05822b185cd5419dfb03bf5fe53b30e0d27f3af09615e7b5783e3ae7e174af5f9d7cddde1062f60934900c0ed42c1b2ade7c73f38e44374f3d917c841893c8d094f5bc21ed1d2cb3fbf62f61f1802c4b6cb58273a124838b3ad9541d0b53711f3a8dbea5a9de4d2e94cb0d76f10f2090a2ed824028fb3eb7c30171237890b4067dd431ac853623a34fb1838f21d859df9b2604b1b1379199c9ef70a9af53ae93e0f69b5b1f5a8890c8d58c77f872083f1cc0cc444ba3230e8dd63e43817f3de3836727477837a7596b97681c79613ac67b7e4020d6fca57070c9dc8b114dc94cbebb53c91fdd6e66eeb1fa17e1c42e5e51be217650411d11e94757602f5f6ff1fa5a8fabbaa1e9f3136ac86f6e4c9f3edab3555893160630cc3b25203b4799c75bf1a0f85c97c09e969076b86770859e3baab6fdf2b8e138204f29e839e06e88cdb58291c0989daa369990b2a2fa9aa9ed4173e6f394a8fcbc0376a1650746727cc7ff742e5cb5ad7cd4d598c14ec72c682a97b5c37f7609ffdd51dc62a1639c840318cd495458a6f3973fe5e561abd7c557f89f7ab047de523953e55f696068549f0058b05c7661d32deb1ec475c2454f4f8d324aee83f66f5dcef77c599749001b10d99fb798fb3321a2f75779b441d846146040da4bb55eedacfa06bdd36d66e54fd2f1a473a6f25f8b79c3919996fcb3375fa900ec97ab1c0d4b3edfc070df996994a3f89813b5da9bdad2635bea389afdb2f341c4d7db16e97f467931283744f8d48ba4a567aa92332f04bd8576426ea2847db0a148e5f308405fd591044c56334a4517505b1dbd6fbebfb056e5aacde6421c8a769e22fb254d443e97eec131891a4448d0f72b8fc91bb3a42430e0791c3756d3f5ac7a6913d1e00fbb8e750bc4be9721fe74cfce5e20a06b68dd84014289f40201d40a2dcaaf021f741b3b0e27cd105b5194260db1193e3d45f600dff4205535ee4161f8bdbcbf5baa6a4216375cf856c4a51a35c70d9eabacd2d79be5b48f42265557f73bb25d49ef2248f7ffcfa7aafed131ff23c080a48f40de93ca0f6f5c65da48dfb5e24bac69e8744e302306929c0cb0ccc832b103b8cff2153cccf421b590a4f343471ee97f169bcbe36de462eda96ef974d56cd0617f09053cfec51ebb2452f07218504dafd4a8cd9bb490556934a93a8d24d294b494942d3bda691a5a7cbe86eff37dc01620dbb974f36490f7345e919e979a29493e1a0c97d5d1f55ef23b16cc76e382834004e85f95df7059a6a555b59bef83636d490a0c19db9f0816970bfa8dfe52f8bb0722f817be68f3d7273defa3624c6e82511c56b8baa28ebbd016a2a78a8c5fb33a8ce723701cfa1008448c8a54ba734ce97c91a45ef07d31555d43ae6dc1f3ba3a05adee443db6c1d18d0df4d10f5dc8cec6b5bd48deeb29290e7220eeb922e2fee2448d7496a056de06391d58082c0c183aebd77636a69af3b59b6ff199d0f60a15ae661fc05065b8daf2bdd0ba53b806c09461fae6b354d54d9b53a73967a3ef602abc5c1bb2202a4d378cb48ebfc1a75ef1f5d496f927f8a1c3007915195a96402f2fb1be2731646704477224edd91cd861ad7016dec7b27e73f4c0090f37882f51284ffc867db10ad96d2653cb9b8f642ae3d5dc722ac2cbee9a891cd48d31fc937563f6644d78e27db89797bdc3252b046e92d3157734800dcad1cd3f371bc39fe00f8c3c683686e3f609039c152ff6142e08a4a5b57af5d53b140a1060e4a586f804d24df487d366f047140058bc5cd979efd83f14898ee72f694c6020fa0e06566a54f0abdaf45e972781a04220f6dbb6416830c1afb96e5f97b1ab926864a9cbc06c44b870641ebabac49f0a454d8969a52e83f8c3009532093df244fd92097b83ae74710cd7cbd6599644a9c64da822b138847453b9000be9fbeb1b22f792a2b34e4fb9cc2c585f671f6fb9dbf7606b59843d37a2e3243204eab003b50d8272f9065107fb075d90178d0b2c667d2dc2637956abf1c2a868a2814ba1f2bab67f0d14e9feddfb8f7effbac49465549eeb2ab62705645ea4970a84a43ea982817d833fd90eb5fd64904fd686005696e04830e53f77ec540b70e0913b7312f5724c5d7ba1325bc42b6ddac7271494f1bde033af521c9df4a2afd1025718cc07c87b6c73337adced7b486687bba767c832836d5f53693975a62f7ec8ffcd28f5aba5edf9717738d0376df65e1bc2d45054c451225882e1de34aab7e49de401cd6397a52bb831e509b0ddc53b7197022f96312bfc0cfd9d00131569a34136b119d747f9343c416344f11068e90eb4281041657f9b41c6458dbb689c6cb44545c568da5a480f63bd5bf321a356c4bf062ae9ce95019650d590e05d1e9f83a12c9a49b279421e11b26f50831457e3f0bc09eae855a1f010ca6386fd431838e1e63c3073011e366e5323381b2fccd89ccd88df889f0d2660ccc70de3e3e38173ff7b25dcff1cc444c4900b71c28ca3ddfa93cc4d8d197dc84b2f6f3c86c2b6724bcaafa066d9f9c98f5531dcf58bdf24985b94099dbdd178d581d727c7b65b60b362f9a662ca562cf829c81681265fe62b4e607ce1f4aa0acee32c07f4e16b1e3ecce2afd1f85655961c9601ced7c4d67b35f3bc39e1657e3dd979d76aa091fd51eefcd04f76f9643c59be1b5f4f41d99fa1bb863156b3d26d50739e55d37addfb5849567296cf134968ce2993861b29f6e6c5232ac1ed03d1b56773eb9c2be91b44cba788b69b46b1046e24b6d2584f9bb56b5561d2599627c2818bb72ff293f125a3bb63b4dc5fde4988ecb85bd615a91612f8a0afbec36ce31103c085946f5384b2920a10cb8d3ecfd52a291158b737875bd54e0df92f77bfddb284a0beda411d0f2433da9fa0af5f35c7f9e70062ad33518d7205591295c5bef85b61f764a035a81e4f1089a27ecf1d98e9ff7b6e7c202f0ca6e9fc90a3fcbf034ac5170288d8906d80faea39e58e2c2a6561c4b814cbdb8ffc35c7c48c7c86a02d75f99a4a14e2fc231771d401b70b1fb55a65128b95661942dbf8955fe7f7ce5b683e95bae1d50d81a66c5366d93a098a2471763df9c47dfd1de3e4e97399571536f0a56ee75ce50dbf6b6afccabaeba5ba4368fa3337a5cb08585ee7232c96d9b7a8063bea56d3b0e549a008a1f7718d3f21da3f627329658d735ee52a2a28085be3df8179ba184c2f3c8ebbcd4f80ac6d7e26f485c20db373752fa58df21333e72ff61450ea8b2bed92e45b5a4090ee51bc754de68de9b27d98d0440f8bbee3cb92040f3539734b6da2a2888c2334849261876c442faf8f94a79c9eaf35760cab14f19955429e6edab9dd930b9b9b541094119eb77a6fa9f95ca59fde0a2db1a0aa68af0a51637e5c54667fe6a4d1509e5b3214f06c900c308d96dbccce1ad6bf8612aae08cd6238c43d746272e1ae31a3e07417b7f75b5da9395693381c3e5c395d653dbd398d838f9956b582a121988fd7720b9a71f7df2d8cdc820622c88a8d579510e0ce69927a3d754623a285cdab1e71b9d8060a084fb28b05f8d507bec3165e62db86c41f4368c0326ab8bb0423e9346887bc251d96f4cfaf620b1bbc5e640ac5868201cc35d8e596351e17dc7f5c1331772fa422098eb0630e58170e5a19bd26f4db2a22ac8afc40f6131ddf0d7221ae3bd980c7fcecf284da18399e7010f8fb3c12c16a9af512b8cb852ebdaa997e257e8c6e599058362592ebe7226ed50e62b48ba9d94dc9310352b752f7a9dfc2317ce8586fb43a378fea7ce5d3f85aa9a14d85ac94ce3c82ccc841a553ce038e75bd395f2184fbc6118098aed2c4e987b51aa6ccdfb3e85b05600a5e01d537f2adddca2b556e8a7362dda7785fa22a5ea7342e9a63ca392d7af57b7c93e44559856de28ef35ea651a362fbf1102c5d53016134d94eca53af134c06db3d3e7020af5f25ecd3acaa3c72f9a9f775d63b9c25e9ee171562bb2b1fa5d8b08da2ccda5cc9df357c49b5f3c6beea6597db4f5e023042f8f8d9cbbb313c7d94c0ecdcb32fe266fadc1e391c6f0cb82a718d82ebbc97dbc892c09bf42c50c30bf16fe58956e70fd74fce04e1e9e380a69c77aae8399afb51d94a0a6b76bd135593e459b746875cc8b4e6b9e21f113594aae07fec0960bdbd83d6eaba0f2400a36460ed4e1fa9b8defa7551f3b67ddfe702b03ebd3ebb89ec5d95a748829bfc8e0fe52a3d8ee3ef9b028faa407a7076623106104d11b03922464de6f2e75a927c09bebf61d958853928da0cadc9a32104408140245802043d29110a26a6505f97cbbdfca3c2774bb25d543556379226b0eff8d71251f7d6e7fa85f12cd4d3befcfb19b64fe4a27de654093e7fa51169be9fb4f628a0421bf8f2efbb231099bd0ecef24e46f5681bdbdbded2fcff88d29f753a490932edb7ed90550bfc64d7d65f977ffbff82391afcfdf36d33ec85235aff2ccef709c3443e0d7ec080fac66d32af87cd532e116a23c12f1c2d8333bd957f9abe3b1eef3f3cd02248bef5c24bd09d49f3dbf4e19d3a3490a814058039ee2ece79c46c520c4f98d39564fa6acfdfc3028ef72acbf3087fc35e8e510e65803faeeefef75a8e87567be3e6ff3146d149d7ce2f721abb82c72fa4305ba7a56e208f5c3c4224261058921fbb77b46b214b1f80463ab0d01d2dd94a6846e5b995a8c0476e66afea1e77977317abebc7428c193fd449b4865c3db5f47ceffcec3fd0140f4a478f585390208044279d4c885528691ec13a949a4fefa3cc21bdd8920324cda744673fc253783c860b22629ca1d41cb226b37e98c5c86bd60eb570df7393103bc972e8d4fdd1e213fed86885d69a41b77cb6c4368004db9f24b9f9b3c7e195f9443925845eadf98a31c3bd5b92fd5e4de1adf979ebe7c56f4ef316792fda4e88f44be3e571372baf530c655e15c6f801c6bf7edad665c266129bfa0429716eaf4e552447980518537f19cd20447d465343e71d79cbbf36d4b1237de25f549bdabb4c9fafc6f42f16fcc7df7f8faee673d0a60802b8e40fe9dc4d017eeed76a9e3069308b7190749bb7dc49639ce206a5d35c260022cc8edd87893db479325e8efa93faa85cf358e8c3eed6ab3f6a1c72f29beb5fbe2b7337e0cf587cff8efb9a7fdbe5da9a0be0fa777c1ac43e2446616a922a7995b7c14c8fbfcb7ce78d59e6c0207267d7d9b0d2d6b2ee75e31212dd522e38a0b941f6424ec7b364d6f21597a0a345c6e5bb876e616199f71b91a0d364c792f4f790c7a6fc36b5bbc20158a2088fd9ce3765ae9181f3462c8c3fdf3898e135b6552c10ee7faab1d3223b01a64dd4495ae69ad3b0afa4b3919bf31e5363bf5e221b1dbd3e526a99dcbceef120a58214872ca8af7ac994217dd654fd9052fec468f876bc62d1979916b20f59f7bdcc7c2705165a799e69d50ee62ff1b942a7559cb7cbafacdc2bc0777cf1a72efc592b1724051a4ca34640c6baeada848b27904f4f73fcbaa133899d9b4306ac9103608c4d5e61b950d593c799fd83a5febabed5e14629bdcb15d1c351ff6fac5fb2cdbc753255c10b4f7844fad741c17356faa3d2cbc762a1ea7ee63e55501821ab10b49be6b9dd24212acfc8849cdc3b4456b1a2f1af434f52457e2c8995aa31266fb1bae08b77b8e5241301ae41bbd6fefb1d7ad5312d3a8217b9f70f7333f798b41dcf3044115a47f4d7a59b388d4a078d1968a8adcc58c5de15adf35b6f681c07caea7653dae5cfe53a2c6504ce9f4feac5b508fddbc0e17a42ccb94bb38b1f7eba814671c91709bc442fde62a5c537716bcb18d13d2cebdfdacde29b8469912a051a000d30f926cb2a0445db28260a530cf72659c9d2ba2df149224296334508d6a665eeeeceab5a9cd8f67904c0e3f2d6dfc9ca6260b994188deb7a99b4a270cd7554e37df7b63ccb6d251d5e4290d047bdcc4536a435afdf36bde22a5cd25276eaf69db415337f3e83920f0e4a710960dd1b32edca1b76ea65a5f31725ca6625f2690a5d0157e87703aeba2ab4f4cdc730b28ce46b7c39521d505dd1eb7b214aa41f5244a794e7b8559319613d4321e66d131d1124324f37c5c4f0563d377a2676eb93b5261293af9166b5855899f86087f4ac986e0364bc73c36cddc2a0d5fb6a948881c7eb8dea8a8cd835ebbaab42c6b4f9132b060b763fc21aec44abb74ec3472a02661fd0aa17721656423cbc08984b07c63d655085e8db7ddbca2921235e1278f95a0ad8f76c6ab4efc33627405cb5a842fbd48fa16cef750533db2e163c780cb2633a051a83daf7a764bb94cca526a59f3217bea134d28c11c4aff4e55168978e4a56c24dc1a0dab263e28056bcd4891b24354dfdb06ed7445823b667cad0fdf7f6ce7288f7d6ebce21bcc70df025720e693ff9eb9d8c2ab07d01f3ee3cdff78c67760611285d526cb339acfa9e545ad447e1036c079d4d73387f50138b7c0b8946d7fee5c3e23dfb589d8535a50ff932255d19342928242795943313370d757296a5ff66ffa61739a7d2e94af51fdb6df22d0fb5d3a28442b13bebf8d104320907d95f190930a817e44f620f3883a6bc5d7e7a2c2c2dc75da213c019c348ea3596864850b73fdb2e591fc37466a7007ee279dd79f168c26785805a9eec70ce3457880a819de9bedae91204dd5e6dca0b759bc7fd984e26ff79bb16cfbd4d7c300c537f637efeca9d62fcce1402010922398fb86c8d7e7bd689c7a11bc7cd2449b48615531388c75ebf8f1f6929c78d14a440132d518562dc4e311ecb53ee524177df6e40ddfbdcfe5a272c52e29e7792542a0e64b6fb1afb0628efa1d1802101cf7be3287d9ef2779f06caaf40b73f8100884f428e67e4fe4ebf3b3ac1c8fa35fdb0ad5594cd847e1295b2507d32cc223ae734b1a51ace2791862c32f990ec76e55f904042e2a230e7b1b16f218bdefe99dc1575360d32631489df842079bbb7d6e9f2ea2e2d3afcc61b309901ff4d53706fded7cc73c8ab9df13f9fabcecd5d9e953d8d7e49148dbee3dbd38a0cb41984c7135e6224709c4f256fdf444c3ca739f85dc2bc2d99f4d6ec5ae3fd466dcdd8d9c0892a7dd11a1097ef9545941eee06ccafd7ad1a2b4b7b77790321d7a2be7b7676aff895cf90d91afcfe1808c3e3e6f8f412adbc3b31cef8be4b41478a9b9cdbde8f1b2cb946c77b4b3035980d34fc3d3a133380c76ceda367bd83e1cb1d2de0d704d0d6b564bac8e32ca7b285fb3c898fd13b2aac0804e5cd8b895e05a18760c2ddb5a54c6f3a7141ec40f4e7a7f4a1acce8bb4baf3305883994b8d35a48de37bd743623a47df8ed650d06bd10147e676594828fd7e92e91fe2b46dbe66f91de2ff4f6cbfb5a09d1d1afde7678d670370fbce57775498e1252c629aebe18e345be05d60ec2dfcf4aef07fc63b2aa1c0bc0b3aa60ed5a4f1f4d83fcb8d5258f06e89beb473563ed59ed801038768cf699d6a8ea65e38e21abf267c2f56a0ae1e9e5b04430a4c3000e389eb2b4f13422bbe31731debc65ffdea05e22279c5c6d2d5c549a9c6c1a36c108786ca8a3b2cc3d9e785dd68bf7a46e2a2d98f51e69f7438513536f4f75a5564ba8ed7b38a1fc620f27f4fc787738a02b55a34b9b18e4a6d01bc0aba226eb2e825c3f7e67c289cae93cc6ec9d8a9bcc003c32c722024d8e940152c29b5bbeb5a5279b6cb9155ab4e00e7323c3a30e43fdbadb9aff8cdd96821712f46c98b7943967355754422428a584973fe744a507b96a324deba3453d107c22307c18f0e00c677e05370faa943c9597c254bbc7b4ceec849f3e89269509c4627294fd3c20142c342ea40759a0ce7fa7efe2f6c879034592ac9db8aaf98e2781cf87cfdde910248e1d24d6205c0adbfd1796b51c396cb76df9e5bb2d91abfdae42e443aedd88f44d8fe111a50fe7356ac724955b4cd90afd26293846137c68c0da41f8035b5903bfffeb88dd36eb1f931e1901fff0ac054cbb5d06e2280187b4fe07c528482dd2e8f18eea5d8cdcedb839c68f02a481e9aa23cabcd151f9242bfefa326ccc163375e9859af8c53cac7742e5077c7752e120a68c6f409e163a4bed3fd466c5222c8f4b2375cde38bfef04578bc8728b262b7f239aa90284409e10556667ff799a43b691a10dfb4a87b0d64dff30d030718a07be9da8bfec4e267866df1e6cafe112a17911be89c749324f1936aca5361797b80dc9c13023e4bd784ac9cad478b3f85eeebfe358d0576472c97eb99db6c1f5363beee90163f638754232f89e59b71b9e63d949142b44307d5c859288e1ccd9daa64653febe7a60d72924388c0f0e1c0f5dab6d224811d590f2eca1291562b41bce5eda147cd444bb1eea8d4f91309a7016bdee24221452e1cf63a4f8a96fc672bf251780461c10a4293ccb5f7d3432eed42204edb0e01bb073e61eb6fe21cd2897ae550c6d21cdd6d9e1af54648845a8a5086224998b6d64120c158e7c389e0c0e3dbe49267c4529fac1b14dd7a6491049949af2968b2f58c6eca88dfd1f1d0b603ac85ab52c778dcce905e887c1e517a3ae844217de97aaf80ba1c56aa2b224146f4fe8929b27f623e7e1247c37df721af3abcb96d23f05319bd4b9a1cb962dd774ecc1b002b97864ef12477640106e98790815aea96a1c3060e8919cd63b37cfa1c0c2859c669971adef436755d6ad456ba7521119f00e0b442cb7816542ed4825e310bf87514ea38ceaebcb4612c36c4e78b68875ccaf190b2a85458192962526f717d0d8116ef400b840fbcad0b4ec6b18baf119df733f57b1bba9bc2f2be76ec838bab997f0d545221b29afec88f0915fa46306ae34a9dbc7a325cdb427778dd2cf3f66e91a7f391ce5aa8462f657e84fe77e05067fadf00ec9a5dccbb8505666e1534197c5fac13bf2cce6abae3d3137a5c796aad1bda9cf178615009ff293fa63ed5993eb8d74000a9e6f44ccb397d60672dbd7f1a3e9c10cbb0057e0dce1bccbc4d6b92bc774ae5b4aea9d7505a96a922a9dcbb7bbbf7cd553379b26a2500aec489b05483a54460ed4965c3edd60a1dd8d34421f72ada213a5e08e2e49b73ff1d278be4b75df570e0d2831cdef0d3580db8141df6564d59d21aac97ee912d9ebcb180ac146f66a5b30ab0f55ab55e8ee9cbb8dd807e7537e54a806580832fe5464a8eb44274e8951412fddf5cf9edc1220ff60a5f7ce32829aa8c386b3f43b61c4c166330afbef74a4ff7c9d1899ba883fde1004caf69237d46464c68928ed0e496b0fb1ea400cd621472dee7d985e5d7ad2c6c00ef52f0acbd7cb675a68096d9cd1d31f1eb4fa0530ea8f8fed55b6eab889d55b37f7179ec27f7eca5a6ab6ea7325d5bbac8d432a5ef20b13d0bf6a1fe5af8bbbb8f5a85c9ae5c72a7a621d5b661caf7e3c345616bf07b9f2b2f7bfe61ab37cb29e6c5274ec7a1ff65c708af3335702dca116421ba4065ad6b7b47422884a633e864c8354a7b89b3091d66eec4b7ced3d9909c72343953653df9c9e482f5e9fa0b2734ea35f3831d6c9680d3e03b46b1c380c9f0c329364cdd0bfcb7b0d91f5866b7b439d85f5219a86478284672c20bc0cafce06463744d30c63a134d1b96b2bd51b5935d07cd360d794d6d30d8a9900fc1e4d8c1fca222d8ed9ff8b8513587a808183fac227ccf33f3486c446c51b04a4a60959240f803d9e3c1127580dd82a183dd9281952d463c5eff60b5bda160f8aadb2ac00bab89b3cd7e1e0e9e5bf332eb09a97b641ed04f9c52edbb518d751efd9a3c52fe0700946d9c98b999a0fa61fca5a1a2b89ee02b06fdf3268c1dcce6c60faf7fe0f65d9afbed773f548052755bc51f70c25492edac839a546a8fdabe482bbf8a4db5d7f442dec1f52a25fde87c6e0d3720c5f6da09d9afc08e28b9a81f63ceebd1830906424891fbfbe5f96647143dba6dff6fe007ba4715df413d475b832a84b0830a83066187b2d4eccff8fd7f44ffa50c89fe7ee3c6fbe67293e8c08e0c3d78fedbcf8fea52f4cba440dad743f6393d480afb87d4b0487f9c397f74411385201c50daef8cf6db658a84f72dc56f48d142f0fe98e8f4009b16ef37fd6807857507aaff5d3febed60404e601465a0f9659bbce39d9bbb5661270555c272fb7cb5f59384c2914f756c7dfc26b54db0df73945184fbaf172fce47aa75fa99a19bbeacf9b11f7c0faac12437300fe8e3267a3d76fbb6561ca90fffcba9d3140a2fcf0c712a041a47d6d00dde7c054cd0b51057453e53677d9c48203b7d0659b0fe2d9a17c6e4c7f75b1195a472bcb1478ccdba7fbcdb82e6f670dcf72c1daf80b236ee8d4bd49442acc281ebd4af9d6cee35e3e2ea0777df7920a64559ede6a5540d36ec60830af6d2f420bf40c406e9617bf8bbbae92b40516c8970f2ecf34949d3d04a86dd96b0cde2355b5485e29713f72b5defb1069c077d35304d01ecd5bed1de7fec146cdac9d8da49dd818e1cf2d9661b162f31dc228954125a57843087270bd1c3ac4bc2b5dac70a9cc2d4bae6026b7e2cabf277deedb7acbc27a821f6df65dde1878f75f0630b8c67b06399e87bfb0608ceefe1972ff0dfffb13d76d85e9a7003db68be57e2cda0fdd095672d4b1cf4f71252332fdccae07169665c1c3398079db7e07b29559e646116c7bd44d7129b2edbfe2962a2f3f673b06b67c957ba17996f52aa0a571f77591fef7a084cfe010350eee000d9962a51a7ba416cafeffda4b13d3933eaec33a102eef6e2eac50ffbaee24fbe01986cc669e972a1b5b00da7f76bccf95ded1f4ab0edb4f5ac7530e5a99686c4deeeebd868071691d0f4c374eca9babb3f902afefb0003c81c0774f03cf24e3ac40e9d4926642846b761dc7e7a55cd5653d34dde3650231d603cbd1260d349f554ffdd3d123186acb571be54421ca9675b3b15739e971c5d388f172d65f75012abfca4caf55d47159204ca781849532158f5e1ff6ab4d49fe00f8c3c68b4d471fb8401c40121ca43cee376907c8d79bc53294456c45595af7c522ea7964acd1215a61702a6e3fa0e7c8de970663fb6cf8f58dc895a13423d1aeda36ccd0c4c781b9fccff2b505fee6718697ba202e96ba7f4c6e2c2ad6e07ea2920aecb95f610113b16757fb4ea4062f96403361e60f8702023b38523e33915caa6e83bd14e6e52c45ede732a865b35f3f99cd00bcf0943e08083f36e624806c294cb66b42c7a82caf2930a1ac2455d95ad08bbbefeba6b1898df585e9a68e3c82c6fa60c2d9786eee2d6dbe05e4ed459c0abaafd859617d24decedcca7218a338e7145b812b36770aebcf9c5a53b8e0b7f77cb8b7f612249dbc7aefa0c347fcc7371b10427442eaac78a8b3b0c3c3775eea59d74cedf380e7d080422368a234195697d4a4fe04ef2c74c9394ed08bdfba46745dc1b1962d483992b9813e590aeb9290f9ff74ceca6c4e623a514ceb5e432158bc60916daa5adb84e7cd61cdcf2f2b9cd8b04af6cbd5c4522ec6ae673a4888ae2f3aa7745b9c5376fce7cfe1ceec305782ab20e5ac7ada31924d6da3c907bf4ccd63590b96b18485936b1a77d81d718034170d841b00d42389710849bcc1984143b19775e56bbe4fc5bd1f3d5d11bc6bd6b08b7cc9ed3bff7af4140f2b4e8f7056108ec8b835906c0560498ecf1cd4d9ae5aaffa71e4b7ecbc89bc12b7c9c19cc4d18b4f1bf6f072b160146ff0f4d35ac31479aea5842556f838dcfe1f4a16d4d174d8e181eb07630fa1008620a0adf5104a06790d72030a04ae0d33948e5638f9e2e1d47e614aa206b13ec133e73c4f34a6b3ecc8d1b58f58009765aeced223944237effda47bc5ca7cb19d1572b0058185662abdeabb96996fd8b27c41f4cd6d0584a8912978e287c9ba9564467cde2d18ca8acfc512f8a66702b070e7c9a1a56afba88e3dd691a13f43981fa91b8b492eebb429d0da6b51cd1d49d1653002ebf4c779757c448b2d633c788ccb4779090455e9bd388ea7c09c1fd0a675bb5af179196ff8c803e1fc189c2084fb62e920eeb909a47546f696d99453efa2faf337baba3ccad016380cbd30f172f688ade252f3078b9177e076e725ba75efa25a510e9cb87c0fca81fece0a28dfbb78b3682bff2a2ed3babf370fadf81635fb4b99da269b56cbcfb8cfa2345d0a7b11abd4b7ebe89c44f93d5ef2feac2ede619da55499d9b7a5b2c6dc9f402735287f0b7228374335da71f22b8b6c3f17a4e4b9a80977f540d36e029dd24407347552258832d07a39b40a3d49b4bd95fb68f2e8cb7e8c60117e2fd2f9cbf26e733275cb12e757576bcf4f14796fcc591bd9566937b909833c11088d5b68545105ec7641032c43f2efe4581eec26e521e227b5ffbb0f29e3d6efe8b44ff6061b21a023810c4e3814c7a2ff03e45ecc5629c11daa7a5b9baacb1a2ce6723dee8506766fa4200316eafb4ab684ce75d11d516ab1e19bff988e88134217a46770452542aaf58ad7e904f0c41ee17fb585da1925e81038f3344ddfa9f198f3ac9ce5f95e3c22478554ada4c9b1da10c4c6a59965204cc02f8a95cf45526bb351b7779cb161503cee72c0e9e469dd519e1db68a91e6729397370abf7527a7f265f57138dfbce7412f7af962c404efba6405a3f312265536e427748798b6513e52dc2069284e0433845a06ff0137072c48da004309e8cdf1a253b87a5da4fd81bb269771a2e538cac53e0b35513cc6fca6d81a80a601448935f0ec6d2e395e3b50af0687e9dbdd68b34271f83837989a49489c6ab0c827a7907d52d20f4a090e7b992b8f1d5a269564445f5f03155cd68d3b35a59824ff04291ebf26fabef75d7a0a289a99b95fd9e1730e1e887ea56fdd6cd515f09c2d606b67ec08eea635e328069684860fc815d82809da5dfb4ff9070fa9f8c2f040256170b843fb06a1b6016b86f07184c54faf1ba6860a21e68367fb06a27478b9ae0f31704c0faffe1503402757b2b170f23470dd09a0a3f677d8289a2dfe0bf8911f7c25898659b5e5ca2219b24f6460e213605c1075b3fe2df9d53d0f5efe5a984404c7f6ae53dc82faef205f91a647204808d0f98b5196cfe81d1ff21550a6cfdff19e53c243ef89b391c02114252721c692eeac0e8887741be0f438b5d3c04d56474537ac7945f64100ee88d0e7fe895a2641031dfcd7bca2a543d0df00dd65c7c74615b610ca57624c50ae01b7932617b45558eda2353d6e88c23ea037c942669e52ee937569c91341c38b85fcd58f2ff0c6f6ce33cbc166bc70d8581bbfcf75af87d49169929997bd869d70772aa6d4a36ebdf011a0ce7d7d95150f74406ced93cf6f741bf6c9de95ae8f8326e8d84037139a95c05028ddc81de0824b5094a4af00f2299368cfb5eca57ff1a28c33aa9f9a1ce7d5fc0832fee9016c4d9c261e20555a30c905271df4ec21cfcad4e91f28f490482fe7ea991f2752f47cb8f9c44a6fce7c841e87fb3c8c1b610e556676dd9db2bedecb672a6340c4829d13e6520a9c6be08f14e37d3b885b5a42013b1519c1dfe2dd1be57c6fc7b1f48a30eed318b554a2bf20062711cfe45825790eb4fd4e5cbc1af047b7eeea752edbe72f3210d2c3228dbab1002b1d9b60aa464db97fd88abf2e3da05274ee407fb61872950913e7b5611429deb51ea1fbc5b0988c00102521235d956d3298ff413fa5df69c1ca83de48f9e8db29ac12699b21f7b0b5400ceabdb33aba27619852a2d77cb12eaaedd1ce4d6376a254ea6b9dd5e3da653088340a376a0e1811402c142299d902f73e04f7ffff23e83435a905f3db706e8ea5f1ee9b80df9e3f7bf707f6519675ef99cbfd91d0a7b3bfd01a3c4fee1a3904df925c0c26cfe0bdf5f3415a1d974a7bc544942d76ff121cda7c9ae8c74299a30c4f75cf6f8dc75433400ced38c9376e7188b823b66ad3b1e91a6549c1e620a08b5f0b44ebad3e5a02a74ff20a7eabe41647f397e37a72ae23ba74ad166c85f9053955d5fe60161fb8dbac74f308097ce27e959e2042c8f424679107a64496794885b60c149fff89caa3f3a663f191f020790b4c234ad338702baa12e7b2730f8b4a968d88c9bdccecf2a5e68cbc79f59bc0f6819232a6b06754fe4882896204ce9ac89cdd3c5d02990b3e690c1de3fc09bbbf5ad9fa9f77fdbcfb4206eb0cfd56a3d0d5ec2554c2772f281e0a3e5230aa1ff1de0ef7edb615143ad2a85bd194cbca218c77a4f5bcc95fb2c2aa695322b3bb1f2d90b3ca22e52d4c7a10f8140c498086daa8df4df3ea6bf1033e8fab0b7c8a137f979e6c333b511ef9c32f4a1d165027aa419aa1c752141540c7734af519b8ecbb9e8da641306d1a2f70ed224ec688119cc60c0d00da18bd76fdfc1c77de443d413a87e72fbd5fc885dc564c13ce300bc3e6b581e806b75aae50560c9ebf6ef72a765a7d9d8069eb21a7dd3c2cd26a1deb2e650bfb96f301338306f46f6c6a191e3df873486af4cabe9e0ee88e9a1a7515efd7c50ff020ea04be86553bdcc92be818d7d12f3fcfdf9f8488bb10f1378ab1622b1c1ccda1e5e809d17b6d3d6e7d7553ec1342d17238a247d144ea261d984c5e4aec251599b497421e86b3be8cb07897e31e5eae3be57fb3ac46729061277bf063dd8cc41184ca33aa64504f4f204cc220206c7adbb8c01d27e5cfe7e3580f107b241805e7e81d57f05fbbedfb497777d8ce8e8547ca3ffb0080d4b6e7840db3f9102041fecfb52d1ee358d4da1b3486bdf7ff5ae52dbdfe0ec4531a9a1b134710f2c11e647a8c5afc448b6a5444d6829663426745fd69cd89a588bfd981ee34fa062619e2f25f71e2cbfe837e30726ccfd89f73b12106fafb680fc04f811fefe4425fce3f207f2fd90c1baf8c6a9e64fd863fec298fe7f87be1b9744aeaf4ebd28b39804ba5ea22bda8bcd78ffbefd87e70f1e2be0626ba4626be568a2a5e6a6a06ea5e46cce2bc3a5fe1f73042ad682593cfffce5f201a081b41fe372fca700187d90fd13b4ecff0ff9ac9e8eaecf5a1b3f6fb4782d072b39af4032255fcc1504ff50c63e98366bdc9dca0713c08eeb20fe0dffc10e73c27189f63b21b4a2c31f0b1e4517badd3af242fd3fb0287e239f808d0fd8fafb0e80bddf37fc612b639e888c7c4f4df738fd44cd6d4905c109826fa20dbfb7bee1c08c7f25234d0131dd4b57bffc0f0b2e371d1ece9ea0288b5f702fa0b3503ad92208d07a7ed25c47ef43c3dbb0647bf16a6cea56ebebb326c4c5315177c2ae36a2b0214020b6dbd6885ff3875fc2bee04a25111187d4c0b3dccac12926a1ee71e21a54e42d8fa9c0f35bfe30003ff2255ae3b04e9d67afd06ee7409ebf255fbc6906a66687c23a217af624f7208089cb85cca6a968b9e65f927711cb445c0efff556198a4694b23739feb635b5c357e3e5859f61bcbc838b949f299edf2d67696d9df8dcf0c1c517d1ca1b897c7d82a76ebfe7a618f90c824f04860f074c160cb2e2976ace2a7120095f7d238f10a5a6ede4b2b16e625ee4eec4c55e5308b83ea4f10e7e03a18e986de2c9bd427afa14c9d979fe840c2c84ecb567042a1d8a10a8c20e542e10c1675faa2652dd89bb73a7eae47dd1ca1e6a5a44fb3c799990699a9671ffead75e33bd95bf674e2dbd61af41ba4143608737b231f0ad0847a607582941b0e96e7a7545a7f2b0464e863b9aade50687e52cb65b619d828ea0fb432465a424a541cb817d1fe0c0dbe71c3c21d1722f9838a12a2132224d69368b964d2cedb7a47cb73a669aa23a003e1d6dbc73d9c9a9ed4b4cf26375c26ffd50f426c70453c5873a69b91813a41e7ef56fb1fa19f3871071d46795c7fad4455c8f146f775697976c1aa11933f595b277cf226aa6cf801d1f4460f87040b6ccd57a2c6abdc034b09b211b3f4ff4063ab28d72a88a63ef595802177e651d00e7c2f5a3d55131b77fe67846758a3ee6b50df0a25ad05e5bdaea043016cf2f0141b8b083202bb53f7b282549e3881c3b7cd92a19bcf8dbb0a75fe87b27b21acfe1fad7405f974bd90afe9eb71f2df4f71f9ca6604624b0fb2330fae820ed60da1658ff5820ed6039457040dac1a46130db323e483b011c18d357275d2792dcc69c282eec4bdd71cc9bcfa7c95fe9219c71d2cbed9b515900b87547ebc9d518d893252e1903d8b352d3020f92650730e508af6813df2d45f4f8bafd2afc13960f0c7822b8249118f0faf2e287ad8b0d52f444a87c91bb28b609e65d5335cf88eafab30092ff4f97f3cf1c69db64c2a9c0733e7efb79afe78b363e591758ac7a4c6ed551f1f0094719188b7e32e68b4056a948354ce19adfe4c3badc3fbc2a38ab8b27ddb07945d1fd2f6da98c125232653b1959d6197cc33766f5e2ca523c7128c7a5f442eccd61029e9e85cc3974fef29c65a7bf2a9dfbad53c712f694a73964ad0c29f264004293b40ce60b340ecf3afd31eca2d4baf84ddf0f062a4eadd9f5e4fea58335ac374a746f719dbeb66c41b5d5bad97e7f6bdb1678dcbef9ad22d7b67c9ee796653587635f2e96da303d708309200000ffffbf4b7011', + maxFeePerGas: '0x91e91fa98', + maxPriorityFeePerGas: '0x55a0712', + nonce: '0xb02cd', + r: '0x0113be49a7e3226dbdba535e64da2d61aa66921904bcb5c88138ded11819f160', + s: '0x02f8b000478f11787977257fee2c20085a16c7b8f460d7cbdee5bb58c372d491', + to: '0x5e4e65926ba27467555eb562121fac00d24e9dd2', + transactionIndex: '0xc0', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xe1a9ac6a6fc957d2cb2633af61c451e3366c9ffa', + gas: '0x5208', + gasPrice: '0x479a12896', + hash: '0x12d7dbfb0bee81eb327e32170b201fbc8445ce3d780f446b50cc10b2c6a08ed2', + input: '0x', + maxFeePerGas: '0x57ae1ff95', + maxPriorityFeePerGas: '0x55a0712', + nonce: '0x13', + r: '0x891c8e4fb5416707bffdb3796101e4bab549d6d809bc8107dd3c64ab161d6ac5', + s: '0x739b527d8da18e099b86fb623f6a1c8436a2139c2ec8a49cde40f1cd35c70659', + to: '0x8b70497d9ef243a66111d43f567aeda3ebbe608b', + transactionIndex: '0xc1', + type: '0x2', + v: '0x0', + value: '0x20925741e3d00', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0x082c948908b571ed87be70f6ec2363b8da4fd3a9', + gas: '0x76094', + gasPrice: '0x479a12896', + hash: '0xc6f78588f68038b676f7a0ca3324f2c6b24618bf43b5c6e68704262e3fceba4a', + input: '0xfec53fc50000000000000000000000000000000000000000000000000000010ec833ae000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000db40e4269400d90142a2e5593b21b56a17fce57d690840a068530b08ac1fc53f0121c6db7bf8c081274b66467d9cd15335921f79bfcf67d4e25bb29571be71de4611e599d961c469f06e10bb1315a348df4b0cde7e1378e9378a8ab08b325816ff2ae0a693ded4304d333a0108aba908b94e4faa3ebb211f3be184f42247b099b1ae2aabbdd0bb1c1b9d79903935f4231667e4cda6ef1925667ddd45cecf693603d1804a2eca24c9340e579cd789042313e240d08fbb24745b7726c54247e1ed8e8e3ce759d01cf6d8a56fd5f0b9ac88c56767c92bf6c72d42cc6f03262b6a6e63690f73aadd76d215896895cb137552f0f1905cba732c22514921d0c3cd9027f66d309109d4f1c5e5eb8d51cc79c2261cdf49ba240c6cdd67fe5d91862c7ed25fb5902cd5e6c0366fc658042b60d554949d176b89a1633e33d9ea7bf857e7cd3f68516df72ac60398183e2756a5823ca91427e542cf897e54a6304a98e1146974e3153342d9c8c304f91e13aa8918576e0869296fd570b36120f990c2185fc04a5ac2bfaf676a9e23eb3617d17e60e034f123e71e7782dd34bdb84ab8f230481', + maxFeePerGas: '0x57ae1ff95', + maxPriorityFeePerGas: '0x55a0712', + nonce: '0x1', + r: '0x8c2590402601bfb04153ffc112a7b649d9a2e810fcb287acbed5fff1853d5a9e', + s: '0x2d4aee8e065ff06be42d1020b95bc35d21249c6b66b149ec15824f41eb3d54e6', + to: '0x1fe0fba03dcfa2bb97ba9047a5c523115fea9c8b', + transactionIndex: '0xc2', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + blockNumber: '0x103dab0', + chainId: '0x1', + from: '0xb121e5aeb374e80081d0cc180e50d3877401c249', + gas: '0xc91a', + gasPrice: '0x479a12896', + hash: '0xfaeaf9b4a6c5fcac8005239112a27f9c059e7aeb436f31f192a80c1691c29f29', + input: '0xa9059cbb000000000000000000000000890741ba72b148b70b4bafc631e27f75a8295406000000000000000000000000000000000000000000000002b5e3af16b1880000', + maxFeePerGas: '0x91e91fa98', + maxPriorityFeePerGas: '0x55a0712', + nonce: '0x876', + r: '0xe7a96ca63eab2a40e2a1c137bf0b2bf2133fd9fd07c5e05fbb0af11cb9ef28d0', + s: '0x128151f2fb774ee942a67b98b352e8b52bf07065bc07809220c115c313ffeddb', + to: '0x01659335fc8ad471c7079f6f04e7532c7d001d43', + transactionIndex: '0xc3', + type: '0x2', + v: '0x0', + value: '0x0', + }, + ], + transactionsRoot: '0x2b0f787500743395385ad4a4142693bffd51d508cae1fdd675d269842b9bc2b0', + uncles: [], +}; diff --git a/packages/web3/test/e2e/fixtures/sepolia.ts b/packages/web3/test/e2e/fixtures/sepolia.ts new file mode 100644 index 00000000000..9ab06b665db --- /dev/null +++ b/packages/web3/test/e2e/fixtures/sepolia.ts @@ -0,0 +1,751 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const sepoliaBlockHydrated = { + baseFeePerGas: '0x9', + difficulty: '0x0', + extraData: '0x496c6c756d696e61746520446d6f63726174697a6520447374726962757465', + gasLimit: '0x1c9c380', + gasUsed: '0x4952f0', + hash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + logsBloom: + '0x0000000c0000000002000410a0101000080100004000001000000040200040020008800000800450001040004000000008004040008000000000000000a004000000400000002080008c020800006080010c22004000010100002001400008000082a040080211000c01010002000b00080000000800000004000010200100044020008008082100010008200805800001210000200000000004000004200000820800800000000010140040504400082404000300000000100080000000400000400002113000000000000040040008240000200000000110002011000001000018122010020000002400008000000008090810000002001000200800300000', + miner: '0x1e2cd78882b12d3954a049fd82ffd691565dc0a5', + mixHash: '0xddbb2beaede8c4a7c401156c0a02c58b3c0732e25bd5bfd350a599c54309929c', + nonce: '0x0', + number: '0x3148fe', + parentHash: '0x26b0438b6b537ec888afe7b673f633a0fdd3732c3629e1dee30e962a46444e9d', + receiptsRoot: '0x1ca1776ebf36ae37a1f48770684da37fe1c8fc134954b229b1f619e5e0ad2c51', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + size: '0xd66e', + stateRoot: '0xc9e235dd0e663f36fee8f80d860961f2e8056f4cdcce501372a77bc1fed20534', + timestamp: '0x642d14c0', + totalDifficulty: '0x3c656d23029ab0', + transactions: [ + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x030b1cddf635e9e71ad70b8668e235e8ec3c67c4', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0x5d703f823e7e4d6719def234cf8683d0d34708c2b0ce0285f4b008bf555b0481', + input: '0x', + nonce: '0xb2ee', + r: '0x2fa59cd01f8bfe1e878f790b73fa281f03e7a97d667234727ce5b671370d9eb9', + s: '0x5cffb682215ab7a1c29fe90f3a0f414843399056a4d7bdc05d370ce9d2979913', + to: '0xb87a21184906b99477d9cca63a452a073ed9c1e5', + transactionIndex: '0x0', + type: '0x0', + v: '0x1546d71', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xf0046e53d11c6e7a6badb4c9e849fcc26509dc16', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0xa8a6e1f58adfe40a059e037c6c2b6e07bd23aa3d32d892bfcc6f40d85f22c907', + input: '0x', + nonce: '0x1a3a', + r: '0xa0f6ce97f49e3bd2e539430890ef4dddf2f3b1c4713b374234ed6ebceb80604b', + s: '0x33712ef7984df3ca434d854724b2b1d5be58012ccb39bd5f3a8b729a0c4d7931', + to: '0x83f3229e66fd1997961f76cbfb6e077f66ae1962', + transactionIndex: '0x1', + type: '0x0', + v: '0x1546d72', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xfcf06e39a2961e12f5e3de9376f09be9de3830d2', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0xa4335f3948675d7cd43b84078e3567860b4e1ffa79e9f6e5278f1d3fc860699d', + input: '0x', + nonce: '0x1a14', + r: '0x9476a6d314e82c5b7cdfb15c2a2d27038e8ab61c647a5dcffd987c9e3fee1dc9', + s: '0x2e9bc3125ae89165cd47329b9f4e9b319514f64f6c4dc58562501c345ee167e5', + to: '0x3eac72bba356e497e5cd2ad1e4190e81810a0502', + transactionIndex: '0x2', + type: '0x0', + v: '0x1546d72', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x8b8a3c7b9a182f3176885cf4c72ac53271eb9d7e', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0x25553d98cc5c2758b653b122a461e08250a0613752258ff1ecbea813632f08ef', + input: '0x', + nonce: '0x19f7', + r: '0x82c42ae6667858b3edc1fa02d3016900341786d0e17bdc2ef1e3e3107c0d0314', + s: '0x14c9a378c116c1dc4b5492493e11ecdd046c7b433dd006d8b92ac65fe722add4', + to: '0xa3c3f6a0e31362fb240ce2766ebe9ff9e18fc9d1', + transactionIndex: '0x3', + type: '0x0', + v: '0x1546d71', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x8c6484155c97eea1c2770c2952a99888b6ae9c3f', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0x5b7ae021605d0fad23fd882d48762851858bf0b6188641d619481f5ea230c502', + input: '0x', + nonce: '0x19d8', + r: '0x334c062cdd23a1a8fcae387e9d3c3e8704728fda13c7d2c0052ddedbb90e1b35', + s: '0x5a25e1af29531c78a1653a2d4136a5688437d29a3ceec2d2d3da537bc57f4152', + to: '0x76fa422f8aa368d09bd93016c76c2dcf889306eb', + transactionIndex: '0x4', + type: '0x0', + v: '0x1546d71', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x39d2ba91296029afbe725436b4824ca803e27391', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0x6ff0dbf6f27ac5bd4cedebca54424e4ddf5bc6db1aeba945c2d980e7d759e5c5', + input: '0x', + nonce: '0xb747', + r: '0xae33f8741cdf375ef0a3978f94b8e61057c8dc387cd28ee3a6d84a574a060b95', + s: '0x141acb4124481f63e871c8f3f29f2adf28954ed42e47770fd112a83b0ef1c35e', + to: '0x203c2affd9bf0026b618fbb3983eba728d2b1cf5', + transactionIndex: '0x5', + type: '0x0', + v: '0x1546d71', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x9c193fb011cce9c176ba3e9a9f58dd02489437a8', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0x234db0c295cf5d70729dc85b36a3df18007c80e1e6c5dd3465f739be81b062c5', + input: '0x', + nonce: '0xb62e', + r: '0xe38f1b6fac252e016f3e846eb61894ed4379cd984838d1a0b694af4b7ed80881', + s: '0x37d9434359fd0afb45b08856915d7a35d57593e0ef3da9d6d3957f181181aef8', + to: '0x29c2e3d277b851a6486ad69bf9ec227fb9b2017a', + transactionIndex: '0x6', + type: '0x0', + v: '0x1546d72', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x086d404656dfa47972f8647271a1cd1456e2657c', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0x745ebf4cddbadb01df7eb32e393df6f712bad3d6f45d935151eb402fa2bee5d6', + input: '0x', + nonce: '0xacf8', + r: '0x8c8e4f396124ef46c5f4ca96108fa37de7b1ae67445eab91be23094e5d0fafa2', + s: '0x721509d52b20ab40d76d53415f9899bfbe546a241a1a4283508a5c70a1df12e9', + to: '0xed8814e2af46748658f96998596cfca17df94360', + transactionIndex: '0x7', + type: '0x0', + v: '0x1546d72', + value: '0xde0b6b3a7640000', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xf555e6826bcca97e5cdd649fc8a648b6465b0e76', + gas: '0xf618', + gasPrice: '0xb2d05e1b', + hash: '0x35607880ee334b3e5a2bfc419aa32d4ec2b87445a0c58b347c945265ffc8e57e', + input: '0x', + nonce: '0xb4cd', + r: '0xc5b971c8e80eeb211366f03c486dd97189d640b45d7ebada8ac40d0ea402427d', + s: '0x1b18cb0e10ea701f2b81dd37442afd63f98b7d1d6e57524c03af8721e5207c39', + to: '0x93dc0eae2a8a63829ec1ac09096a00b84c2d11d1', + transactionIndex: '0x8', + type: '0x0', + v: '0x1546d72', + value: '0xde0b6b3a7640000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xfed9f12df6a0d72a9ad4a4875a6153e737c8b980', + gas: '0x131dd', + gasPrice: '0x9502f909', + hash: '0xb3f527bc8306499630857a4d92578b2d492762e7828580af536ed10128953327', + input: '0xa9059cbb000000000000000000000000c1b7d14504f8441db63d0175cb4ed985d71c15bf0000000000000000000000000000000000000000000000000000000000002710', + maxFeePerGas: '0x9502f912', + maxPriorityFeePerGas: '0x9502f900', + nonce: '0x3', + r: '0xc98fb9abe0676d6a7101982010b3bc37d727c5cd2189a91710804a5ee98ff768', + s: '0x27c6fbb3ebd78df9dac8c292c6a9bd543f7538f5bd18883ad5ffa1c41dbd93da', + to: '0xf03df67abef78b29b2381f529651ab07d55bd42d', + transactionIndex: '0x9', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x6cc9397c3b38739dacbfaa68ead5f5d77ba5f455', + gas: '0x5208', + gasPrice: '0x77359409', + hash: '0x59b21c5451f4c6bbaef6758aa4ddac3d350ee9d6f7f79cbc8aea1e4d6d30f32a', + input: '0x', + maxFeePerGas: '0x2e90edd000', + maxPriorityFeePerGas: '0x77359400', + nonce: '0x1abd5', + r: '0xbaf97590694daf5555139cbafa03406fe7d158f203d5b0b45ece306aab1af770', + s: '0x2359e6e389613e518025c2d0f2ac9749499c46118af96fb007f9f523b56bd54d', + to: '0xa127c5e6a7e3600ac34a9a9928e52521677e7211', + transactionIndex: '0xa', + type: '0x2', + v: '0x0', + value: '0x53222d0fbe8000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xea4d57b2dd421c5bfc893d126ec15bc42b3d0bcd', + gas: '0x55f0', + gasPrice: '0x59682f09', + hash: '0xe3708d5286b2a3fdb73db6b9409c70e121e65cd5896682f011e97b578906245c', + input: '0x', + maxFeePerGas: '0x77359400', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x1602d', + r: '0xa3811d6c91a939c9a684eb1061c090c1459de3817cf6dfb02b57c344bdffb10d', + s: '0x2d2410b861ad3fc0895e59f918d9945dc888c48f1fdb032307fa4759ecc16843', + to: '0x4acc290a701ff39da78cde151176dee141b70656', + transactionIndex: '0xb', + type: '0x2', + v: '0x1', + value: '0x6f05b59d3b20000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xb47300dc06756ab667b47d87523f9e3f44967db6', + gas: '0x5208', + gasPrice: '0x59682f09', + hash: '0x738a0a811d13a8735bd7b5ea4b784a0dff23e6bfd2b1897303f731bb49ef19bb', + input: '0x', + maxFeePerGas: '0x59682f0a', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x4', + r: '0xfc0ab73abf97792641c05c82911ca19f77816ad45ca95bd0053c77044ce31bce', + s: '0x79c4de0d3e8d022cc449298a4abdcaf31fbfba8be042684bab86393893db2d4b', + to: '0x337381cc3d723b86a2acb97f34832d4673cbb5f8', + transactionIndex: '0xc', + type: '0x2', + v: '0x0', + value: '0xde0b6b3a7640000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xe3a97e0d58e58f9871fdd7d9a74d061cc3736bbb', + gas: '0x17ab1', + gasPrice: '0x59682f09', + hash: '0xd63d4edc0ca6567cea22cb342eda67d37bd4a5a5a36cb66e233f368a8f98c7cb', + input: '0x96e1785200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000e3a97e0d58e58f9871fdd7d9a74d061cc3736bbb0000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c000000000000000000000000e3a97e0d58e58f9871fdd7d9a74d061cc3736bbb000000000000000000000000e3a97e0d58e58f9871fdd7d9a74d061cc3736bbb000000000000000000000000e3a97e0d58e58f9871fdd7d9a74d061cc3736bbb00000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fe5cf2bea000000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x59682f0a', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0xf', + r: '0x95c807dbb20dacd1715759f369eb08c5b0cd431d42170bc44b62210a7adc7161', + s: '0x1c8ae2ba0a32668e606edd3d9792e96e54a033365d0d9a209456dd0572fccf41', + to: '0x2ab7c0ab9ab47fcf370d13058bfee28f2ec0940c', + transactionIndex: '0xd', + type: '0x2', + v: '0x1', + value: '0x7704128ff9c0000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x59aa96058b9e61588c3b4bb6800ea4aa48ef0492', + gas: '0x17aa5', + gasPrice: '0x59682f09', + hash: '0xd383977c4ab373914a2199b5673eb43b1cb3c86a129c29a440b67b8ee491bad2', + input: '0x96e178520000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000059aa96058b9e61588c3b4bb6800ea4aa48ef04920000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c00000000000000000000000059aa96058b9e61588c3b4bb6800ea4aa48ef049200000000000000000000000059aa96058b9e61588c3b4bb6800ea4aa48ef049200000000000000000000000059aa96058b9e61588c3b4bb6800ea4aa48ef0492000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fe5cf2bea000000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x59682f0a', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x1a', + r: '0xcc783d6b756263a49826c016982daa7ec589d1d55fafc3964ba187bf488bac0f', + s: '0x10d1019e31e0a2956586a382e73b96f8986a6f49eacad9533add0c6d3deb8741', + to: '0x2ab7c0ab9ab47fcf370d13058bfee28f2ec0940c', + transactionIndex: '0xe', + type: '0x2', + v: '0x1', + value: '0xa36cc19bab0000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x877e0fa351f2014157f28af9c1dbe7922c42def8', + gas: '0x36500', + gasPrice: '0x59682f09', + hash: '0x554c50ff5d6578a8ea4a352651106151d0d4b5fc683fc4071096463744b3013a', + input: '0xee1490b20000000000000000000000000000000000000000000000000000000000028c5c000000000000000000000000877e0fa351f2014157f28af9c1dbe7922c42def80000000000000000000000005b9fedd37f0b92e7e282b19cebcf06f57b77c6040000000000000000000000000000000000000000000000015af1d78b58c4000000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000001b88957d0260000000000000000000000000000877e0fa351f2014157f28af9c1dbe7922c42def800000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x59682f0a', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x4', + r: '0x19a785d3beb63d2dce1c835d847e86293abc590503ee1fd3beb93a0fc4b6cae0', + s: '0x5313cb8e23be69b7507a15179012c9e41ba0c2e3de4d4bc38c4b0501348c821c', + to: '0x4284890d4acd0bcb017ece481b96fd4cb457cac8', + transactionIndex: '0xf', + type: '0x2', + v: '0x0', + value: '0x1b88957d0260000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xb1d1db7481fcb2acaf5765942b8fe4514e18c55c', + gas: '0xb4a7', + gasPrice: '0x59682f09', + hash: '0x92d5693632cfc366be1a143bf63aef7b6307db1227e40d7806d1fb21e67137f7', + input: '0x095ea7b30000000000000000000000004284890d4acd0bcb017ece481b96fd4cb457cac8000000000000000000000000000000000000000000000002b5e3af16b1880000', + maxFeePerGas: '0x59682f0a', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x4', + r: '0x535f4d4aa8e5c826549c0d67a65ecfa7847871a214e180a0599ec149a92effce', + s: '0x3b16af47e38f2be732c01bb42d1b35d6d69ec21f631fcdf97c1d393f647aac08', + to: '0x5b9fedd37f0b92e7e282b19cebcf06f57b77c604', + transactionIndex: '0x10', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x8257f8eb8b24a8a8be5dc570dfea56d313339da6', + gas: '0x5b8d80', + gasPrice: '0x59682f09', + hash: '0x72bb6a4add14cb640948ebd801898076372c86bf2eac41154f414738da1d1a32', + input: '0xb1dc65a40001cd794ebe9e15991da9e85cede9ba7e00f407a77e6e7c91fec8c52515aff7000000000000000000000000000000000000000000000000000000000018ae02bfae234dbec1dcbff6f466c498914bcc14f45604fdb229d66827335946592d2100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000ac00100010000000101000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000280f0000000000000000000000000000000000000000000000000000000000002810000000000000000000000000000000000000000000000000000000000000281100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000280f00000000000000000000000000000000000000000000000000106322a2b0bca000000000000000000000000046887bd86d18cca57e9e6cb15b3de67318107d3c0000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031f5b934a60f2c9b649a657e14f1a2b2e83f8ac7000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000dc2cc710e42857672e7907cf474a69b63b93089ffb23f387bb217874b85e28017885db557c2fc43ad249a67a9ace1beb372bbff70000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000128f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000281000000000000000000000000000000000000000000000000000106322a2b0bca000000000000000000000000046887bd86d18cca57e9e6cb15b3de67318107d3c0000000000000000000000000000000000000000000000000000000000001b610000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031f5b934a60f2c9b649a657e14f1a2b2e83f8ac7000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000dc2cc710e42857672e7907cf474a69b63b93089f1ac28f841a31750f6b1e51d99bfe27b6c849bae45963eda319df4d9ccffd87a70000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a4000000000000000000000000000000000000000000000000000000000000281100000000000000000000000000000000000000000000000000106322a2b0bca000000000000000000000000046887bd86d18cca57e9e6cb15b3de67318107d3c0000000000000000000000000000000000000000000000000000000000001b620000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031f5b934a60f2c9b649a657e14f1a2b2e83f8ac7000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000dc2cc710e42857672e7907cf474a69b63b93089f6a4d522654518006fa7a0635541df6dac30d6978e992434835d5cdcfc67d8c09000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000011a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000b822c253e2eef8c82a895a0a6b0160e90a19b338a3507476113f114d781c664b706bd156aca371e0edf8a64b50fb211ede4dee6521e1316f371ca70e1f8a23d0fee0298af1997c78de533ed09facf1b9c5d772599a63e611cb71c2cd5f6d70b9ad648d5d9c1eb6779f3052cd0b19dd901c497c8b8fb352ecf19bcf020ddfa2aeef6ec6ae42cc7d2e5b1334055984fff0ba453677118eeba8c7b574e8a5a8e9525201fcf1239f0c38ec7c7ef6c27ab0c986372454fe44aca63a2fa6fc2c18d69fdfef89f67cb0b67d429b8ff0c0c164c56d37ed2b485d2c6e1b1f92176e1e4f25ae604f86f4914bc93999a539a7126fc3acaa323290bb0d4ba83e2f4faab74cd9e4c5bb621782e03826d56444a7dcd335c4b0c53ff7885fb97a9a1030180b10f4f535bdbb52018d064ff3f5e65772ab52fdbe8c8b7be34ce7984656859ca40d27c17f1db276c98eea1c46e3647a38c6aab78b3e526e73a57c4b02bd2f739b5534e000000000000000000000000000000000000000000000000000000000000000b3f81065f01ea8076809914067b3f23d37ef688763ffa3abca1f40a979e70e68b4007acd2a670c007944913238eb8ba6f0298227f2410b42fa3a1f0c0f48620e36465bf0d82c6fdf68ffb9e7cee4dc8f593a0fbfe4d2f2da55df96eac8688d6ac20da73d05d8e2b3eed6a90029cbc88bad3988c24803bffc490caf8c197e3d97d593cd78187c91fb6622738da192048d73466f6a63ee9998861324273496d2083642d808408bdb076385472f0547e99630a102096f9f4ac41bf31b0eb5148ead678a4ab1d4ba54f057daf6890c32e9edea25f7bd22e233abe3fb36b0e7f9be6da14d5bce7a84f5d66a0daeb6a1c8aad5e26ad0a2235d00e9c07ba6f7cf3b1c5b2553be10486ee4d282fef1b8a5a4b6e68741b15323bacdb84306bb7b7073677f95afe62e9fec3549a3ef1e8858819f7c21d5863a2fcf805cc64d4316b2eff40a9785e3dcaab9bb6f7d9249aba9d0845bce51066199f7c7875ac4d506a72a238ec', + maxFeePerGas: '0x59682f0e', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0xebc', + r: '0x1bdd1518602b3172a4b5693466cb7e54bc07679c9deca2acbd99bf589d10248d', + s: '0x2a8889157f2264bf396394d10f46facfc5e032dac8b07d720bbc959268509a21', + to: '0xd2ca6d383917259dc2445bd6470dbad386d4b67a', + transactionIndex: '0x11', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xea4d57b2dd421c5bfc893d126ec15bc42b3d0bcd', + gas: '0x55f0', + gasPrice: '0x59682f09', + hash: '0xc33480b85a113f779725fd2c1788ab95b066792a898ee0eebb0e98c8fa605989', + input: '0x', + maxFeePerGas: '0x77359400', + maxPriorityFeePerGas: '0x59682f00', + nonce: '0x1602e', + r: '0x1dd8238b1b4eb1148d4b3b6fa829cf047dcf7da6040c14ed1373c6d7c6c1a3f7', + s: '0x2de0a31bec48447a395537d36ef16414fe729ed282585e125fff8d50b7e960fc', + to: '0x0d3a7d69859a0dd6971d39703b15379e05ae2ec4', + transactionIndex: '0x12', + type: '0x2', + v: '0x0', + value: '0x6f05b59d3b20000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xc88b48a292f0b26d4dedd281b58cc6eabbf857bc', + gas: '0x6dfe', + gasPrice: '0x3b9aca09', + hash: '0xa8685562865ab1e6c73816fad05a38d6ea0670565ef27add5f4bd16db852eb46', + input: '0x0f5022140000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000cd0bfd180d0b8d0b2d0b5d1820000000000000000000000000000000000000000', + maxFeePerGas: '0x3b9aca09', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x27', + r: '0x792a33def1b103539418608bf306204927a964e640e39f379377efeb3af59174', + s: '0x1aba77c1fe4f5fc626ae96e41acb6626c0c567e41a25a6f8c1a957c12a868e69', + to: '0x3a6658a57c5e78cf4b4f6e774bfd1a812865d197', + transactionIndex: '0x13', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x43c92d390d3ed89716e4a0776d8aea1fb965d55d', + gas: '0x2bf20', + gasPrice: '0x3b9aca09', + hash: '0x7cff5abea75fd389d37b08fa73f8d4ea6c2a00f36c715fda422c8d92f05aed78', + input: '0xd45b6292000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000006f05b59d3b20000000000000000000000000000000000000000000000000000000000000000c35000000000000000000000000000000000000000000000000000000000000000020000000000000000000000004384ea50ec75a46a7dda1fd2a928d1280c45695d000000000000000000000000a6147b3802d51f47b348817ad43e647566d6df46', + nonce: '0x5c92', + r: '0xdd56ccd20763ac884900623962a5cd5d7919dff4e5530111bf83b30b21ae2202', + s: '0x4ea28f710dee138499d2f2683cf54325b3646c47d1b380dd4cf67f4f5e012ceb', + to: '0x041eac26aab0d7afe408c3ad3c07ea3f749e7453', + transactionIndex: '0x14', + type: '0x0', + v: '0x1546d71', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xe7e9ee3f2dca42b224aecc1610d3b7efbcc07200', + gas: '0x27f2c', + gasPrice: '0x3b9aca09', + hash: '0xd844bf22fcdd8fd5c472638540f114824082359ef753a4f9c929889226dec5f2', + input: '0xa043dbdf000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b39c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000005208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd5200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x3b9aca12', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x325e', + r: '0xefa5a4334b9c8a51a4a3cdc8f3ed55f03df079a5a4d88bc282da50e3a1204802', + s: '0x5f079ef81581100613c84ba82c05279ffff68672e2f5010d3e2f68d265f64476', + to: '0xede510d93a3a6c5e8b8be88f7719716063140197', + transactionIndex: '0x15', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xe09e4ff4353fbf984f99fa824524277f704e7475', + gas: '0xf4240', + gasPrice: '0x3b9aca09', + hash: '0xbafae79055a392cea650f90096a305d1338a170a66b58dacaf69a7feb2b3f187', + input: '0xa043dbdf000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000777700000000000000000000000000000001fa79306e7ac0966731a58de98cb2ba2f79542474af67f9d696783bac7161961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000055a7f5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061e2f961dff90154128511a903268083023c6e94ae5c05d961b834bc5752d4bc6774b1d47e53a64c873c6568f12e8000b8e47ff36ab5000000000000000000000000000000000000000000000016426a792f94ac9b8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000008fcdc43cc17ea9047a770762f20b6d1e816313cf00000000000000000000000000000000000000000000000000000000642d194a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eac2bd4753c659c909c92f62b3b3a8836c2bd86c000000000000000000000000cea5bfe9542edf828ebc2ed054ca688f0224796f830518dca0dcbb81456ef28db9f78ba53d032804183435a2d240d344b8c3d7a1a5395a4ac0a05c628f436c4eb2827edfc67931073efefddcde7647ea707a8308a27e556d8fa9f9013405850ba43b74008302f8c894ae5c05d961b834bc5752d4bc6774b1d47e53a64c87470de4df820000b8c4f305d7190000000000000000000000006048e5ca54c021d39cd33b63a44980132bcfa66d00000000000000000000000000000000000000000000002b9451bb9dcd5e11a700000000000000000000000000000000000000000000002b5c89a4eb17dc51900000000000000000000000000000000000000000000000000046b2f1cf07c0000000000000000000000000007b741bb145ed7bbc1ef23e7650b5b03c67681ceb00000000000000000000000000000000000000000000000000000000642d1948830518dca07979aca687e96a60c032839e3a9e74007dd49ee05d770affed59fdd63edac960a07723c3a7400e4912d4da98e3074eb18b00daa82311dc2336117fcae96215ecbaf91d0e01850a3e9ab800830f424094000077770000000000000000000000000000000480b91ca4fee99b22000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000004bd3b0000000000000000000000004284890d4acd0bcb017ece481b96fd4cb457cac80000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c000000000000000000000000b865612584aec3737f0d4520954491a6dea83d3a0000000000000000000000000000777700000000000000000000000000000002000000000000000000000000b865612584aec3737f0d4520954491a6dea83d3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002150c95c619800000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000001a40c6fab820000000000000000000000000000000000000000000000000000000000000080000000000000000000000000b865612584aec3737f0d4520954491a6dea83d3a000000000000000000000000b865612584aec3737f0d4520954491a6dea83d3a000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000001e8c104d068f22d351859cdbfe41a697a98e6ea2000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000005484f525345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b486f72736520546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000380999aafe268642f1363a30eb43fb543d0e33a55f341c1ea469f9a33a09ebdf1221dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000009b7e335088762ad8061c04d08c37902abc8acb87abf6d70b5ff1fc5a1373b5de54208c25a40423a327ae085501f3c5d18695aa0360ce76abc100bd3bfe97b7f1f20447047d2f8e2c7e6bfd41f0cf66c94935066bf48db3727031c390da1d98f28ae0525f280597666f8311868a2423033acf6f82000010000010000022000e0000000000000000400100001000404002000001020000010000000444000200430080000000004200000000010200040000240002010000000000001002040009000000200120020000040000000000480000080000000400030200000801000102000820180000008000011004002210409300004000008010002100010200000000000000001881000000000000001020240000020008000002000100000000810000000004014020000000000080120000000000000002101000000000000840800000002020230000000000088040000060000018022000000000040400000004004880000010000000410080000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003148f10000000000000000000000000000000000000000000000000000000001c9c380000000000000000000000000000000000000000000000000000000000043a98300000000000000000000000000000000000000000000000000000000642d141800000000000000000000000000000000000000000000000000000000000003002db892ff219e7700915f8a8b31f759e1b5c2d48fde6dabb6d9907e978e5d676900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009252a7040b39fd2a7d353c2ee4fb10c9e68b5d2c7faf1a2b45566f4831064a4400000000000000000000000000000000000000000000000000000000000000019d883010b02846765746888676f312e32302e31856c696e75780000000000000000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000af6f90af3b90214f90211a0e8a3c36316ce8c880120788f4533c1cbcf55da5a172b5c69cb53660b170fba52a0d86141ccd3bc25c9b4b9ca29cb536f25fc96da550ed6c14d7e508d5f4ef832a8a03babc1e29182c92322288322d36482bc36b0a6e7350412cacf38ab9ed81c69b2a041f800a512bd2733ad8291ff52a1f0bcab58f8981d570fec7a10d1dd3b4cd768a0a45b86b234fdce46035c71a60be34c5e3a3882e7f146cdf8a1a476e9fff30eb0a04f262f18cdbcfa40a7da85df010e8d3b7f37b04ef8e53bd9c547c30f5125adcca0a5e6d00bd39f85f1747a10fb1f837859f0bfcd540a346984ab86aea9844ddf22a05edd61ea627ac91bb516f94fed66860de3fc6bbed55f9ef9d4cc361d22208b7fa0c9a45bb6dbff27575e1163cda01f313d55df0025a240f09705ce37d718607bcaa02002cf35560566563ec0ab146e815b6cf70a5791a6b52ff55fc38740e562a76ba0df8fc7adfd97841212763e8895801c1d91c0da27375d45ca1dd6a980a31706d8a012034f55ec22d3497f2b8477b2ce21844684017e26e8e70fb634758da89d7bb1a04bf105ec9101c37b53ed744d6e29341cacaac8b4ca7de1b9bce027d766a477d9a0999b8512fda4fddaff0261e63edef3cbfa23038ad423b27f701ac43b872921e2a0fad97c330d39f4afacf64d34b52b5b9543155f9e6a91abeaea5617ecb1443e8da0c274643ff637699b38077f2c2c5e1c4902fd8c8d1e92e0645fbf0a3b42fcd0bc80b90214f90211a0ce44a7136381da9670e6a6170cd022bbc27a9c37170cfc8f7bfc219b2c0faabaa0d12741db1e9e672829a34e0be3c0596ef6d6c5eda81db65b8e0921f997c5b279a0ae255bbec9240630c05df2f2cf55d2b4dde112e747fd416ec7403730d3d9dccaa065eb21066db33e00eed2ea1771a9d745b3e7fe370ba59aaa107a7d6ad74a3b11a0af8763c3cf574f21fc7bbea6448fcf3c43998c2e6a1da2684b0f8fbe73ac9735a0374c4400cba54cad4956c667c623c5ed2b943da43a43759fb8a00264bb56b7c3a0b0d2f252bfe6ec639eae3f3955af0c6e140cdcebae67c11c17de58b5f00908e0a03ab50f5335e85ad35204b88ec7bb6f59286ba58ae8d2a6bb719aa9b1d0b581c6a0798f57b72788da7a66a0518bf5b5757b2953dc0fc24baf31ac21108598569ff9a025e82f74e80614ce295bd19ad290fc44fc9c24a0321a671a9cc5ad90ece2de66a0d5fa0dbfeb4b26cf8194bc284492e6b9da201942d0f534d0cee51f01622c54f5a0f72b2521817730b4360c256f002a55e5bfdd7a57dfd26a8a5253e27331402c79a05ceccc223372493580cb3fcc50d965fd92efb39957b1d590121d745e4fca36c3a0591623557d7b0559583aa9d89327b7895437478033e087097a4ca8ffd6672be5a0a77394ec78baf2d57955a44bb7610551ae052adf71a26fcc1094135b54f432aca0c425242acdc30f6ca12ddb1d00aee89d77e1b1128724690e96c6d08e1291754e80b90214f90211a0f1a115b1ccf575bffd5e20db76caac0cb639bae3d313fab7356882615a0583cda09316d64025f33cf5cda2e32e7b40bd4ff31db2e99e106da4e4dfa32a42e48189a02292614c13e0cd22c7d48a1952468293b885eb3b0f9519b7ae4ae13ea74acd7ba0f4548120c1fbe0d005058e667a85dccfc29d53b9683cd95c0062efc93dd0d020a04f9eb068fca53d383732e579bb1fa11f9f6c8540b7dcca2972a1a8146cb04e12a0778d7699916e807277a84b80802760f27d2117d8400e5b65a43758119d3c0369a0e83a591cbb8140afb0c30d79b954642b779e4ea2d7d41d95ede952d936db7633a085263e23a13a7ef85543662bcde96e5f98475ca6fe7a7cf9734787cc78040559a0bd926540a9cbb9e49be905af3035947bf233f612775263a9e5a344dea5e59d55a03b320ff6896bfecc2ffd218c17f253b6ed59d712eda26de98689d74a3593080ca04aa12df643f7d663ea71f76983243c32f72ad1cfd56d0790380269ec4fa1d398a02784ea76fb653f621c955dc9b5c76b3aa101bddf0b1dc77b09d7193ee3977ff2a0bcb4f825cebdcd5d726bacdc4bbbd6dc0bf95672ee35e1a518c2eac429a76eeaa00b99cf6211844d2fd3b6ac0ab25cb31f135297e90f5c5613ca1fb35c16d5be4aa082331a041db97ec1b9a5b4feed27453d7fb7ab6647a50e5e0a3be4f858181b06a0ac395c2196d298cd789910237b87d2b85a5696d15ae0c48c167dd32e98607ad080b90214f90211a0fb8ff560ca9504c5b571eb6a26c4a9e2b1480b1287e086fab1794517ea64dfdea096f8275a2fefa5ae97c7804cf017a46ff8da47113bc4a93a0ddf991bc621a8d7a063854d37d08448143def60bb81b6eef240a6c22504b6e2199b3d3f8c9dfe63c1a07b877adb359eda7830883ca8a3387da29ddc0422280cc6a7a98ebabc8c0dc4e3a0941d5b10d77efa5da043478200f2094bdb78504d5ee6eeebd92fda34b2151e35a07e53446fee6bb173e36a191fef2ff174b493be5c5d9c38f0e1af97144e025f61a03da10497ba8eee352c98ac78d7f55c297478196d048d93cfe2298ed889b9fc35a0b01689a2bba4a40e9c901e6ae215e5acdb2cfa42dd0af19607e1ef4b374108b5a0567e23606d43dbbfb8d35c52a876dfd411a7c5a66997319df928967ad437893aa0da99677795f76062a5c1927baf3fa32fd66c64e3ce8d0d4bb55685e7411b307aa004e6bc1d64ba72d89542266e946e7b24413131de4553934285f53dd2d966f14da0d18e5f84e70f8f4c8d62d95901a22e2f1f99dabd2fb79126d97e3614d2feb06ba0493e106ecae86a1a4c1a34fd2ddbc5538dc275838f82e7e17295e6f309196d61a0a6944951f8a22cac7ac02cf30d71bbe357cd5dd2904b49c450dc13504d9cf17da0ede98000b5e538c24d1d428f46f9bb60f4fd869aeff5cfe6432259e861417ceaa09e3548a8b2c15c778d70010e9ff5a82005a5955a55a1d1d3c7f13c1c5bfcc15480b901d4f901d180a03a82e40aac6b4b665b910256c2ac0673b9b8c7e2c18b846fdb17b19b38c79a01a0c2810e576f9a91de5be7774f18bcd3b8f32020c1b9051d7c6bbf212f954acad3a0e93274f3773d34269a28f86cd1c6dafd18b30f42f29808932a5d00c68c60dfd3a0b5208edc16ec4ebf968be0767439f69f24f3511c64fd2e1fec45be43a15f591ba0238e86031d6f812bfbfca85d204e6676534aca4a1e84d29260b2d1d48a687961a06f05395b7e998bfd1a5c57183a670b397a4aa50b0b102243d474aa724d89a46da0df367e8b5585cbc73aa2a0e9b06e138d7fda554b4fd3839fbc5445958e7d8313a0d3ef4210936892dd7a4b3fa191bd56583dd4b73b0d20c4b4ff8632ae09934c43a0a10cd7efab9147cb2fcc9cbbb2e67e09aab92542f970446b4773a2f613b0fae2a01f6b383ea1e5dadbc4bfcba833902c120c3d0448d04daf725df9f3afd619aa53a0c2fe0a493bcda2348f94385b85a2bfb882be9da8c7e46b4ea8ba5ef7462523b980a08220bae99bbce785e55a5f57633c059225d129a21748480ff5a35bf74f2aeb6da0a155a41a0bba49577953fa96701b75b3dbdc8c334824f34a702e2a84da00309fa09d6ad83ab9088859dca18089953e4b20f4ee820b09c6300ccb4533fafe7a648a80b853f85180808080a09f62c7586f7bfef17f50d84630afe9636af8eb5e4a8b736b4325ac79d1fc5d1f808080808080808080a012ef7fc37216a7288d799939f075fc145c8aba8774d94e943353c8e96d5ae7fe8080b869f8679e20016e8b63360d8bcd376eb61bf80f4e2e872ed064a0eac1ff06dd24db81b846f8440180a0f87ea7e5ea8fd1aaa75fe4ef2e4bdc95c49b2ead39fc52784a5c145c8b59e012a0b16944c8bb850059f91dc8cd33437c5002f7b19b721bfe36d3c5122cd47361cf00000000000000000000000000000000000000000000000000000000000000000000000000000000094bf90948b90214f90211a041ea73d589b499b3ca297f66d72fd42d32ac894d7342b9f1f5ba7df0766cc88fa0557554e81eff7a46810781361db3034e479996fc09996d31efc92083900b257fa0f852ed745b6b938dfdfdbb05907bd125d062d9bdf153f14b91965fbd373b4aeba095057628aabdf0895061932a702a7c3279cbc86fec951f3a9ef979b63bf77c42a0dff38b4d64d00d06db4cbf74f9277e58dafb07561745d5a9aaba45b02c344a68a0e742f0ff9b0c6b37825e640721e8f52e28f7496113dc739df7909f98b8d107ffa09c7d25dc86534637ed0ddca306af8ed926c69327a77256d656be65c574f48c39a02c7fced9043cdc8a8ed118b39934472292b458ea7b48892fcb7a917719bf6aa3a098b3b17535b51569cbdbc27c85a4a42b644a4ac78fa4acdccff33dc90c596f33a057eb0ba87b13ebf4a0ac86d488057a133a456573121a03920d6b016a5fce5463a0a22c8b42caf8e675b0415a034ebd819e8cf36b65a5417b96ab57155b1f37952fa09d8ce5996a6cb45c4cd772058d9e451559412d23e4e8649abc7d15f66620da22a00c8a07bf34ec6b444a2488df1e6dee30497ac0a0694edb0c491a92f8a3fd1ac3a0ab1f8c0851abae9f70f3d4fabc621a26f9113c9987a4ec6755e3e41717f28d66a0a28ef869f39a2b28799d430b3630ba2fe5a2fbb3e646505fee166c0dcb48c785a09b94dca3e9dfe985430f13bb45a3b699cc3a83498bc2b3fc5e31c305eef0960580b90214f90211a07544850744de7c220c6bcdb412a182a0faf4e592aa69eb2d521ade613332e02ea06f14ef90bb358061a456cfbad7dd52f7a79cd30b6622c9ff50f6020f03006930a01023cdfa47b2b47cb541da20367f11b2f91538d0b016d7120d4ce002bbcf728ea099803b259163e9a1cbde4a9a6543b3f774547ba3c9aa6f3a2369bb0b2d08ea71a0121f6deef8f8f6ca6f2b71b384d3490a19ac03d3f3082c71f8508f01e34a95b2a0fbd01048a7d9e98499f036f0cc5fc417cbb7ea879be6880f1b6e37855c7de23ca018fbbb79b0ab120d104c779f8ee612e1bb6ddf588240b80069950d57918187c7a0f6f9f34b7c39b4603bf855c6baba28f316ec71df886257dc25216f93103336d6a069daf4734db758f1b5f3b456f40c6ad56ebe62dbd56bb5cbe35ce38bf2205e90a0fd4319bd2c4af456ed04f731d154b1b98585ad79fa30660d8ec98503097b4209a0048f140b2b4347b9afa2aa947b7f46ad35362b06a95a0a3fb87b4ee3dfa1e78ea0f6bc8cf95443c45b8fd8e75e1a491c4a03d1d5729a55d57a959a7571e264a062a0fb3113550bea737b86e3dc4e72a8072a0e9b890bf63befec6d39f297dedd0796a0687c05fe5c12a70e56da4c77e00c5d4bc438fabe07c31f62503494dde8016978a0bfca8dea7c05e8270db239c82e794ad4242dd6924e20fb5b9d136e91021c5c95a0872c183cd12d7d0397abf5ed3e81fd999da65f88146ece15f4c65f48e3b46a6b80b90214f90211a0ba41b83e2ad6904279383f09fbdf8c459a35706ba25f43811f74b4d23f52f627a05a84e84952f0cafcaa6fd61a91ad8dfacb561a2fddadcdb8997a7de6a1f72b9fa0b8c0e2792b73a3fae088e89ef0cc53b9b13eb958152dd167f80992e34a09b23ea08db0903564f4be659fb086d2dba8e4bbbbc061cc887f9c298db8d5aa681a838aa0080129c83b673253a5ce9cdcc262b622cf65255af81cef6b2febe1e3a9f809e4a022171d91e75860c4f05072904fb672bc082d82272e3580991a300483e61feb2aa056abad306dad645a4bca0ecaae00ee951269dd8eb64d1bb9d96a4599c908ca62a0bafa662a4e9aa6c78a9409bcf89f01441a59da4d92499af9b1db380bcc099eaea0150825a048bb3ef04fdf8598effbf180dcd602cbd20afa028a4ee9955fe7b48ba021b740b6628824174434d0e5f9e5e6bb9bfbff61b3fe80c0f1b0346c1460c3fea071843fcad7ea6725c5c8d0e3031e2e3a08515ecdb5f8c5104e26df32514b3b3ba074d4f14fa46dc830fde8ec0c8f2c2b0c8ab9eec5ff6cddb294cfdccdfee161f6a04e58ecc875f43d81bcb03386f2a12c947a23d8451a6732617d5d3306b219a643a075a1d4100f45c5c11e118ad5e0551eae251b903447e754a0ab12b2b728eb7a70a006da9f19628e3cddb66c385c90b9d23397bf62cef30b9fe66a5cfce2cc4c2ce9a0b58d48c116e39334ccd93cef254d4a518042bef38eb4c5dbc579f8195608ee9080b90214f90211a0d7b4576eb42d968aff244c750d5473a43387d686fc412b70a2ca1a46d5e2e1a7a0b4aee2fe792e51c501c92081aa0ab6bacfc976f5e2dd4a83cfcd5253bb98969da0ddac590296ec991bcbffeffb8f55e989fde4618b02954073c480d883c8e5ace2a05a157f2ca6d6bd23255cc8d4c7ce53256fbc6e5b45ac2c4376e2d28f256415eba0759acd7f6212e706d1d3a8aea6e56a5a2e011f173ba1908a478aa87682f3c3dfa0b074f019a44b29c1deee41a4aa2ee93b4ac6ea0fefd50c3e5c74d23c0bfdf5a8a07c481dbc9e5949799bd08beeb62d422c2d91077f4550838555d76cc2443dab8da08d418428e9bc68bfb38750869077845f5b45a63d64eed70c6be344955954cc23a009fb661af65cf20697ef6c3ce87c01f0c9d72590620302f124a8a1efc49ed99fa03e634a4fe3e00a6ad4e0371468744fd19d71387c7067afc7d8d45f5789ae49e3a0e8110b5781de15ca775891e2e8c397b4f53afa9162450eb1e09deaabdc616227a0e2ab0eb32c800e837602ff7cf21959cb82c0c87c5313f2328d3516ccabf2680ca06c8d94d3591977a92da8f193e21275622ad67cc4589574033c97eded025a0d60a003c6ed7f4ced0b67a8459c0a99ba607ef2db9e98916f4f923e9af2bd1eae2d1da06acf2da1a1d47b6eaf994d32f6f991cb35095fc4178b32026182227a23c35009a0fd79d10811fe5b8f75077dd9ff52363915dc6e4d83a5ae5ae4e029e1f03543d080b873f87180808080808080808080a03f956bd8c44a9d7be9298f63278403b7e1b33227717b6626657625eb9f3c19dfa0fd96ad74cb7142dae07af9131f62d5e3a23a6233b0d73d1aafb12a0ec160d469808080a00776bbd5d115ccd841149960c470ac9e444010856d14987e7494c47813a8597680b853f85180a06c00ded51c34267fccdb1db0688a48706cf0bea7fd28a70193d4a2e0bfd2927e808080808080808080a0fcb61cb560e6d1ffbf88eadc60bc8cb593c6b088f79227f92beef54e5ab458b48080808080a1e09e20bfb62297e61f7629b2f51b1a4edcf7e8ecf6dbe50f9afa17c11f7d835501000000000000000000000000000000000000000000830518dca0ed2a8749a3816e817b88c3479df01d0685499e164dd0c803b84fcf1d5bb650eba02d3af26b95b65eadcaa4f0d71afbed99e19406e005cdcc3e3d51a2c38b6c4335f91d0e05850a3e9ab80083100aa394000077770000000000000000000000000000000480b91ca4fee99b22000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000004c1ba0000000000000000000000004284890d4acd0bcb017ece481b96fd4cb457cac80000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c000000000000000000000000d7fbf53d3e18372672e67df8bf83aa7f8ac4e2c90000000000000000000000000000777700000000000000000000000000000002000000000000000000000000d7fbf53d3e18372672e67df8bf83aa7f8ac4e2c90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b88957d026000000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000001a40c6fab820000000000000000000000000000000000000000000000000000000000000080000000000000000000000000d7fbf53d3e18372672e67df8bf83aa7f8ac4e2c9000000000000000000000000d7fbf53d3e18372672e67df8bf83aa7f8ac4e2c9000000000000000000000000000000000000000000000001a055690d9db800000000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000005b9fedd37f0b92e7e282b19cebcf06f57b77c604000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003424c4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a42756c6c20546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000380a44175b6e8d234a76c98202dbb7b012498baa271457d6ed1f4111d79c7010b201dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000c4bfccb1668d6e464f33a76badd8c8d7d341e04a596d8395e1c02ccd1ba1b826229b001759bdb9656a7f0ae7c0536efc55a63f8020f13ab81b1bc3ae52082eb26856839a49ef0573423b9073241567251e28b9d3b0d40afe714bb431c309207e5a97877a729eff49b6334dad55ebad5981d07d9d0240000000041c00020008008000000000000040000000100040400221000002000000000000405000000040000000004000400008000000000000000020000000000000000000002084010800000000010022020000000000000004000008010000040002280000080100000240080008000000000102000400001000030100410000001c0001608100400004040000010010b0200000004094004000200000020000002100000008000000000200002004000000000040000080020000400000010002001000000002000040000000000010210000000000090300000160000018020000000000000508000000000000000490000000000000000800800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003148f50000000000000000000000000000000000000000000000000000000001c9c380000000000000000000000000000000000000000000000000000000000027859a00000000000000000000000000000000000000000000000000000000642d144800000000000000000000000000000000000000000000000000000000000003003ad69e5da91cb5e54b112fd57b95b9046cb2eb03983264e65a6151b1a103c65800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ca3963e30a41d2a880d35fb19d5b17a6f5ea2e6cfd506da3425ec598f1da01bf0000000000000000000000000000000000000000000000000000000000000019d883010b03846765746888676f312e31392e35856c696e75780000000000000000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000af6f90af3b90214f90211a019087213f44f688c0dcd49f983e583a9a329639709b1ee9a53101c23f26a0491a0fb087b9d0e040f002faaa7fde0e00785d52e65bab10aae8f6f9f77975967ccfda06806e17247225591351b0ef94ca66b243011f5177593a2b5781cadf7f4c414f3a02c15a958ac502bc76357ebd5227a147ab196da16a290d4f48f13daf5633e483ea0aaf5b7baf232ce3494ba8bc5a0f3e078816245087baf4f5a1a1d0751758e34aaa01c9abd9c070cc1aa478c5299ba183d910445d9d86e811d70a5a202d57a239b1ba073015359d4d590bac73425d43d096ec005f75bf4dc27ed7eef22bda4601cd2c6a045a19c11c50d7c744faeb9d064de95ddb60ca455f0f6682d8b50f62c2fae676ba037fc061c94b0e5a536a44478805429dd3b0110dee138f8ed80a7ab24dbc52ed4a0e65f4d9f4068c76e3bb660debec15576ed5207e588e22c9545d177db6ea1e321a0ce25e076b36d304c549c274777e72c5aed5ba0dfc471e670c53f4fc53bcce537a02dfe9fc01544248ebb72038c7a397231fa24b61e9ce9a5ae6e94bb5c2fcdfb1ba084f1962da79b4e6d7332a75b607b74a5cceb446115d2124b8e6c18a9b5373efea0582146f29eadb36a8a3fa5dec2985c3ab280326ffe759ddf6e43a1479c27a94ea0743ef5d9567359ac79d07652a3eb4376723965f4191df796919969db3470e4c9a08464b7740824eb4ef540072517c845aee4fb7c48c881049f38da2d49578326e380b90214f90211a0ce44a7136381da9670e6a6170cd022bbc27a9c37170cfc8f7bfc219b2c0faabaa0d12741db1e9e672829a34e0be3c0596ef6d6c5eda81db65b8e0921f997c5b279a0ae255bbec9240630c05df2f2cf55d2b4dde112e747fd416ec7403730d3d9dccaa0beb881a361c4a87d62fad952118eeae07ffbe058cdb1ff1854d79bb218c191b1a0af8763c3cf574f21fc7bbea6448fcf3c43998c2e6a1da2684b0f8fbe73ac9735a0374c4400cba54cad4956c667c623c5ed2b943da43a43759fb8a00264bb56b7c3a0806f7890e808603a81b7ab946b2108b84f9a52834a3a50c4ec01e712d287ba45a03ab50f5335e85ad35204b88ec7bb6f59286ba58ae8d2a6bb719aa9b1d0b581c6a0798f57b72788da7a66a0518bf5b5757b2953dc0fc24baf31ac21108598569ff9a0f1c4450cbf3ce67d50acfbc67efc17c9aafcad146c27b07f8c6b033d3b54c9fea0d5fa0dbfeb4b26cf8194bc284492e6b9da201942d0f534d0cee51f01622c54f5a0f72b2521817730b4360c256f002a55e5bfdd7a57dfd26a8a5253e27331402c79a063b19fbba61d7e28feb257250bd501aed1b5d090b1affbee3cc9c7b9e790e4b6a02490033191c954ad3f8deb6160c2ea280cd270ad6262c59d4117c7d03889ee38a0a77394ec78baf2d57955a44bb7610551ae052adf71a26fcc1094135b54f432aca0c425242acdc30f6ca12ddb1d00aee89d77e1b1128724690e96c6d08e1291754e80b90214f90211a0e2a7a4f00362bd1010c4e56ece897be4b0d0d63f2fe4eef9f826ae57b0d51451a09316d64025f33cf5cda2e32e7b40bd4ff31db2e99e106da4e4dfa32a42e48189a02292614c13e0cd22c7d48a1952468293b885eb3b0f9519b7ae4ae13ea74acd7ba0f4548120c1fbe0d005058e667a85dccfc29d53b9683cd95c0062efc93dd0d020a04f9eb068fca53d383732e579bb1fa11f9f6c8540b7dcca2972a1a8146cb04e12a0778d7699916e807277a84b80802760f27d2117d8400e5b65a43758119d3c0369a0e83a591cbb8140afb0c30d79b954642b779e4ea2d7d41d95ede952d936db7633a085263e23a13a7ef85543662bcde96e5f98475ca6fe7a7cf9734787cc78040559a0bd926540a9cbb9e49be905af3035947bf233f612775263a9e5a344dea5e59d55a03b320ff6896bfecc2ffd218c17f253b6ed59d712eda26de98689d74a3593080ca04aa12df643f7d663ea71f76983243c32f72ad1cfd56d0790380269ec4fa1d398a02784ea76fb653f621c955dc9b5c76b3aa101bddf0b1dc77b09d7193ee3977ff2a0bcb4f825cebdcd5d726bacdc4bbbd6dc0bf95672ee35e1a518c2eac429a76eeaa00b99cf6211844d2fd3b6ac0ab25cb31f135297e90f5c5613ca1fb35c16d5be4aa082331a041db97ec1b9a5b4feed27453d7fb7ab6647a50e5e0a3be4f858181b06a0ac395c2196d298cd789910237b87d2b85a5696d15ae0c48c167dd32e98607ad080b90214f90211a0fb8ff560ca9504c5b571eb6a26c4a9e2b1480b1287e086fab1794517ea64dfdea096f8275a2fefa5ae97c7804cf017a46ff8da47113bc4a93a0ddf991bc621a8d7a063854d37d08448143def60bb81b6eef240a6c22504b6e2199b3d3f8c9dfe63c1a07b877adb359eda7830883ca8a3387da29ddc0422280cc6a7a98ebabc8c0dc4e3a0941d5b10d77efa5da043478200f2094bdb78504d5ee6eeebd92fda34b2151e35a07e53446fee6bb173e36a191fef2ff174b493be5c5d9c38f0e1af97144e025f61a03da10497ba8eee352c98ac78d7f55c297478196d048d93cfe2298ed889b9fc35a0b01689a2bba4a40e9c901e6ae215e5acdb2cfa42dd0af19607e1ef4b374108b5a0567e23606d43dbbfb8d35c52a876dfd411a7c5a66997319df928967ad437893aa0da99677795f76062a5c1927baf3fa32fd66c64e3ce8d0d4bb55685e7411b307aa004e6bc1d64ba72d89542266e946e7b24413131de4553934285f53dd2d966f14da0d18e5f84e70f8f4c8d62d95901a22e2f1f99dabd2fb79126d97e3614d2feb06ba0493e106ecae86a1a4c1a34fd2ddbc5538dc275838f82e7e17295e6f309196d61a06c5fa2d0981473409efc193cef5faf4328a50fd0716c7e0b4051addf7e5fef27a0ede98000b5e538c24d1d428f46f9bb60f4fd869aeff5cfe6432259e861417ceaa09e3548a8b2c15c778d70010e9ff5a82005a5955a55a1d1d3c7f13c1c5bfcc15480b901d4f901d180a03a82e40aac6b4b665b910256c2ac0673b9b8c7e2c18b846fdb17b19b38c79a01a0c2810e576f9a91de5be7774f18bcd3b8f32020c1b9051d7c6bbf212f954acad3a0e93274f3773d34269a28f86cd1c6dafd18b30f42f29808932a5d00c68c60dfd3a0b5208edc16ec4ebf968be0767439f69f24f3511c64fd2e1fec45be43a15f591ba0238e86031d6f812bfbfca85d204e6676534aca4a1e84d29260b2d1d48a687961a06f05395b7e998bfd1a5c57183a670b397a4aa50b0b102243d474aa724d89a46da0df367e8b5585cbc73aa2a0e9b06e138d7fda554b4fd3839fbc5445958e7d8313a0d3ef4210936892dd7a4b3fa191bd56583dd4b73b0d20c4b4ff8632ae09934c43a0a10cd7efab9147cb2fcc9cbbb2e67e09aab92542f970446b4773a2f613b0fae2a01f6b383ea1e5dadbc4bfcba833902c120c3d0448d04daf725df9f3afd619aa53a0c2fe0a493bcda2348f94385b85a2bfb882be9da8c7e46b4ea8ba5ef7462523b980a069cf29178b35168344d55ac9cdf13b3c9517a2099aa7b6568319e02c03fe0313a0a155a41a0bba49577953fa96701b75b3dbdc8c334824f34a702e2a84da00309fa09d6ad83ab9088859dca18089953e4b20f4ee820b09c6300ccb4533fafe7a648a80b853f85180808080a0bc3bab8c81feae47b198f1bc1f2b9728336e3537281a2c6eee74d1331903b44f808080808080808080a012ef7fc37216a7288d799939f075fc145c8aba8774d94e943353c8e96d5ae7fe8080b869f8679e20016e8b63360d8bcd376eb61bf80f4e2e872ed064a0eac1ff06dd24db81b846f8440180a06e5f26163739b4053f6fdb1653ffa968e6e000f2b18b91f76234eaa0729d0caaa0b16944c8bb850059f91dc8cd33437c5002f7b19b721bfe36d3c5122cd47361cf00000000000000000000000000000000000000000000000000000000000000000000000000000000094bf90948b90214f90211a041ea73d589b499b3ca297f66d72fd42d32ac894d7342b9f1f5ba7df0766cc88fa07a762cbff3e0e9b739b06be7f151cfac3e1fff0cbc478a7df06a80d0d237958ca0f852ed745b6b938dfdfdbb05907bd125d062d9bdf153f14b91965fbd373b4aeba095057628aabdf0895061932a702a7c3279cbc86fec951f3a9ef979b63bf77c42a0dff38b4d64d00d06db4cbf74f9277e58dafb07561745d5a9aaba45b02c344a68a0e742f0ff9b0c6b37825e640721e8f52e28f7496113dc739df7909f98b8d107ffa08633a70716914d7e00573b6062745303dc8c50b532511667628f3036b0f0d88ba02c7fced9043cdc8a8ed118b39934472292b458ea7b48892fcb7a917719bf6aa3a098b3b17535b51569cbdbc27c85a4a42b644a4ac78fa4acdccff33dc90c596f33a0f2c484ab188760c2ca3253316d40b8668e7a3edb7485422a15ee0e1bad6bbf57a0dc8b8508c79a703e331d2cbd5d336ad327ce8047ca3719e3f4722d816871418ea07c9c89253637b06276978263682f31813025cf1e3e19cebb9b357783a09486b4a0cd74cf3e3946d2f8891fe0da0228e060b1147b2f171ce4dd8827ab70717eb767a0ab1f8c0851abae9f70f3d4fabc621a26f9113c9987a4ec6755e3e41717f28d66a0a28ef869f39a2b28799d430b3630ba2fe5a2fbb3e646505fee166c0dcb48c785a09b94dca3e9dfe985430f13bb45a3b699cc3a83498bc2b3fc5e31c305eef0960580b90214f90211a089201bb14180b19fb7df34063be2a7481b966e0e6272c36f828fc2a72a8630e0a0c90abd0029dec4e29c90aa6f351052601963d9c4b46f4e9fab46fc01bfde74c5a02adfeb4442c94f1f7c683bcdd5a33ebd1f30b7c20b68de726047f77590c94461a00ef122f9df924fa30e3a5356f189d21277bc242505ef320cbef05199010cf434a07811840bf06d862d735b4d6bfaf7d0300b789c64951f812114792a46f510de4ca0b838654503c0c0f1c717c30a16ddf1cdddaa1ede040d866f94e45368c6251c34a0a755455454546f6b85ea2c42097814835bb0e1ec30ace8654754534a974da5cea0bec74448dfd5902ac00a46e19f1e01ddd01219b3168d9debe9337b0b94037fada03242d6db52f2282a11853e9e19eb7ce48597e28e1317460a170999fa42d01b7ba0513c5c46a49afc25311a73f07eb8dd5bc47acdd97da2d5a8624d045cad1c3465a098a581e4a4c691bedd27e92aa5777ee4c7d9e5a7f1576d9f269d4f7cd0b77b97a0f6eac7ade1285bd9cc6691590979b2cf9b97a9e2068d5e26bdebb689b2eb6e92a0e61db35edd0fe645ca88f6d4dfbde75dc30024e43a776b22c57d3e398876ad88a07c07253ad6c92a1baa55c1dce017527ee7bf3612c5b0357e919b5f9057aa0949a05cd25cb29d58fd8b189695a7d96642334c84ee6454d932567f4470a3388ef80fa023951d6382b1d670313b2b6688987c86ea7ecbca27db72b0012fd43a537ff1b280b90214f90211a076814edc0895fe07658ada513c48af2f596ed7a9b611be321fd40a2f16194821a00fd1ff4f6c03b018f613ebb17d3a9f9a796bb00d733771f7d70056ac83587a03a04628bfd681977471eeccb07d549d480413dd931ed52bbec7db35ffe853b7462aa073d8cdacf622b48eeaa47d955641e85c40e7b3876b2e31ed9d5bbe9acfe4d213a07c35c17c3dda60e885ad10bd1f208ada6fc7b59b72cdcf493a6122fe5a3dcc9ba0db94a6cedeb519468e034b8199b4af37df3afcbd4ca5bad43c9cc8c6656ef3a1a0d4383c73c539c0fb0c01aff683349a0532efc1d9fdfe5f547d9c8a59bdbc28e4a0390e71a361ad7616a6e5162c535767ebcb58dac4717602e2b4842ff11ca95180a01bf070fb6366513fd315ed8dbca5a638c1cdd018f31ee419b183012599c75de9a0d0e359814cd0c97cb6a3784dec04ff63b832d0d41e8591cc4359e68d875eeebda08665f1035982d0d07e8fb80deddd8ea09180acf2589cba51fdd54e58131a1980a0710fc2165bb51a3c6a6c1f64dd03845da5e7cfc42fcdca6a60083213faa42d82a0e0a633f23669f0a9c333455b15c4ebf72b80f2b1dd4666a25df7f6ff0c8c5531a091b03b12098b70acc3ea664805b9ce003480085696d15ad3c6a1df64fcb495dea06d52d15099a0ad155e272442cdf9348300b50818edd35e313d160f9bf0888052a0e76435832c5426c1dd744e8e67d73e10b62793144c74517542e16e673bd5c34b80b90214f90211a0092e1220355187fac17a3eaf00596827d709338f5d43320381109596f2de9063a04868b9d1ea13db80e3a084c78eb5c5ab1ec9f369b100a85476a420c111d97a17a09c80c33524dcb325d9437e92fc367936c6183462a52df740c175898def1836c6a0258f325e2e7610aee21f183abb6be744118f289f0c53f3ef1eee232ff31bf9a6a023c16f96779b17da4905b3a5db19f681502c30f35a22d5e02ba9b96be2220970a09bd09a4616c3466d29377c99dac342e979494a3ce0d8d427dc231480fd520feea00b51043a67bcaa5bd08c0d86680fc95fcc131c919701b3f290ef541d08b9e7e5a017a361e510305ab01f0215b581c0d3be5ed04b445fc55d3ca9b6d61b2b92db3ba080c1ad78714bdf4301e7bd15520c6138825a5f437213a4410755794857b831b9a07ba9f0216277f53ea6491be0416497c4bf8a17fda48f6df5dace66e1b54ee74fa070ca4b58e48b7f85b0e9cccd7ae45b7bfd1aa32b944d259e92d2ae1985d702c7a0b5610a1133cdc9946048d3f1a7535e7cac687027f2a27613660265bd4238866da057b5f8e30cd24f15ee4ae6e37ea6943a7d5e2004cc6075b399c75db3163642a2a027fe02fd5e8e5e5ef339cb6662bafd4581f176154f9394bace17850619d3a36ea043e186e6dd5d28e5518b833e52b468fe2c0a3eacc5dcbb343349670506303acea009d38fd63881892d26b3d8568be37ce5f938266249512584f277b57bee68fb7980b873f87180808080808080a037bc769ec3332f0db4f5236033c8caa5bc7cd3e3f8e7c1a6d545d58edc467980a0b72651e2305a4bdd706c066b9710bcc5a5da25fbb8fb1a741150c42537027d7c8080808080a03fc64cabb2a299de986e031e44556f1b13b06823cc417ef76bcf9c7c185f16548080b853f8518080a065849fb1d635249f88023195daae6e05e4dbca1f8b19d795990c88eab40e1c2e80a04a1dd3c44fdc0808d8d1c05ab23bbc1f0d6d459e2fb92b12525286d47bf84c3d808080808080808080808080a1e09e207bcbf4b320d9565d4e40863938e75405cc2a240dffd3b8f7d37a7fc0ff01000000000000000000000000000000000000000000830518dba0abb10d4aa5a4c17595500ddc9281ce7df349cb94ee33c0a325cb6cfb5a6a3c9ba00689d7118eb556b5859aa88b78f908174237397f333ee01913fd191d15bddb64f9019520850a3e9ab800830389569400007777000000000000000000000000000000028703e871b5d7cfe0b90124ee1490b20000000000000000000000000000000000000000000000000000000000aa36a7000000000000000000000000b2fd0dc2c2e7b8b3da558e7c6da444770945646e000000000000000000000000cea5bfe9542edf828ebc2ed054ca688f0224796f00000000000000000000000000000000000000000000004ab248a86a443cf33100000000000000000000000000000000000000000000000000000000002fe9a00000000000000000000000000000000000000000000000000003e871b5d7cfe0000000000000000000000000b2fd0dc2c2e7b8b3da558e7c6da444770945646e00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000830518dca090f8cb38410c4e5f51f1c3dab9fad9107571cf2985e350736310fde6b0e02404a055f0571255ffc9d2f8fc6784141c2a8c62c8ba41c3248dde022329a773c486e8f91b6e808509502f9000830f180694000077770000000000000000000000000000000480b91b04fee99b22000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000038477000000000000000000000000485f2de5569a504ea701162f4ee235301c1cab2c0000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000028c5c000000000000000000000000485f2de5569a504ea701162f4ee235301c1cab2c000000000000000000000000485f2de5569a504ea701162f4ee235301c1cab2c000000000000000000000000485f2de5569a504ea701162f4ee235301c1cab2c000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5886a555c952000000000000000000000000000000000000000000000000000000000000222e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000038012823b70d9b15f6d91739609b7d182ecb6a57964e186d5c4b4b900226d3364251dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000455e5aa18469bc6ccef49594645666c587a3a71b7e9cf267a604c9c38c44eeb5b4416231ba157f385728e3f3c65875c3714d6bd82418bfb480a9bc956dedf1e95e81bd8ab52a0e648c3fc15beda5cac1c9f55256f3492058a4aee540756073d9f9ae5acb218ca2adfac746f3a2ff486b24be3ce400000000800000000040000000100000000500003000001000002000000000000000000000000040008000000000000002000000040000000000000020200000000400000000000000040188000001002102020000000000000000000000080000000000020100000000000002020902080000000000000024000010000000040000000000020000010000000004000000000000000400020000000000200004020000000000000400000000000000001004000000000000000000c00000000000020002001000200010000040800000000000200000000000000000000020020018020001000000000000000000000000200000101000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003148ea0000000000000000000000000000000000000000000000000000000001c9c3800000000000000000000000000000000000000000000000000000000000a17f5500000000000000000000000000000000000000000000000000000000642d13ac00000000000000000000000000000000000000000000000000000000000003000d5b96fcf24f97334763c284d18e74a1977bc6e118a0207cf8b99ca1f7037b3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813ad9dffe265df3d9fd155afe856e61538a665e864cf6a97a5bfdaa155874b870000000000000000000000000000000000000000000000000000000000000019d883010b05846765746888676f312e32302e32856c696e757800000000000000000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000af6f90af3b90214f90211a0e30639f36b4f7e8dda04e70a6adf46bb204483197bf989493da77d6d9c4c3a7da08b28f54f1e6fe13276e794bb0aa6228d0fd66f39111228e8207294e57c5788afa03287ef512557901399fc9b36c886fd4449d7f7e21ecb8e9606a8dbf53110d29ca0b34b7c77be6718012ba8bcfa4bfd3f8f99e85e5c07d4e3da98b9d2ac22b8062fa07c2677985344c377465b76c516ad97f6e507ca73a6293e3d92e1e5d1f021513ea02fcaf4048f087d7f1e26f3bac80925a2d5481e3a25110b3f2a5f388db1516986a04a7f47f0d0f928ae915507126f6e6d4429308b8327295460db833498bec11722a023eec22e60be0b65237da54922ca7f9ff9ef12bb2ea35d1b9ce38f8f2b66ab60a07bdaf46d75ce4d8429fed261e9673e7cfebab1d048b11bdc38f72fd7aad937b8a065193dfcd636417a3664080432b78fe4a6700703aa363ac11c6d63d4d5cc623fa041fe9f162a0f5be223c14f9956113a1c457f0576b91cf051b453371834a81846a010155771c6678681c2c8f566ab512fc0ebeff5192645d97411e451713602f847a0ccd7e792c7062cd05bfd887eedde84a2035b0400bc6a1700c9227bfc2593c9cea0dce33695bd479ca72de377c4aa89c01824099c9ab03652414c7e8d8dcd625974a05991ba033f429fc26d03ef859889ffd7438fc2fc0e01baf30e76467680a4c447a0809cc61e72a3b6c9d7daa1b0c6ba85adf10d16937b71271992c950b013c2da4b80b90214f90211a04168a79841ec63f1a27be1f13685a1a5fb73316410852540dd69c1dc354ecde0a08b39f24d9a123f404f7d6e8d9f2f5b138c7d748895076a44ed43ee4b4b3fbb4fa0e5e59873fdb14815394d861c1ba6a51682d5d4465bb4a10bec975ef9db599517a07a81d42fa6b60f8556e1e1f9b3a48b1d321fa3c4eaedcf6b62209704b4a58c2aa0978b4d6a9b154db57057c7fa36d516b68fd509b741c62655f76edcf14075076fa0374c4400cba54cad4956c667c623c5ed2b943da43a43759fb8a00264bb56b7c3a0d037e1cdc4dea2de2a42c68b171f85ab68f7f51bacfa41dd6f8c64a57a1a5f7fa093b12cb830bc3a9121b799da0be5a8d8a6682fb31d3c2892d5e2490690266af1a01e85fc0850a48e747dc9360238a6d04dab5189551c40e21bf475a3e36a566bf7a0907333ae3fbdf50263770f5a2d595329f5569d5b9c08023d79c01f5fbaf1f1ada0864910243de5af344acef3dbea807b8043537b0e5dfdc430f6917ae9e7c5e1c6a0fe82de6d286cd5f8c1cb3509bf4ecd8081b3c08ab92a2c752d7aea90e1204356a0058afdff89116e9ba922f184b932e53610208a9897e4fce11bc36929067fa422a0b9816c9c9a8b563e0d5edffda89bf316985bfd341eb5f09c28daddbc4dbc6e1fa054ff13ee87def15b2ed83fe56d99ca15f5a3dbe2321a16d18494a0e5241fb277a0daafcb8d2b18dc684616d118eebc77a0e892c9f617003f0de0098ac555290aae80b90214f90211a01767acda67ad081991ce0902646b21161177aca7aab2bf09c9d3577c8e996850a09316d64025f33cf5cda2e32e7b40bd4ff31db2e99e106da4e4dfa32a42e48189a02292614c13e0cd22c7d48a1952468293b885eb3b0f9519b7ae4ae13ea74acd7ba0f4548120c1fbe0d005058e667a85dccfc29d53b9683cd95c0062efc93dd0d020a04f9eb068fca53d383732e579bb1fa11f9f6c8540b7dcca2972a1a8146cb04e12a0778d7699916e807277a84b80802760f27d2117d8400e5b65a43758119d3c0369a0e83a591cbb8140afb0c30d79b954642b779e4ea2d7d41d95ede952d936db7633a085263e23a13a7ef85543662bcde96e5f98475ca6fe7a7cf9734787cc78040559a0bd926540a9cbb9e49be905af3035947bf233f612775263a9e5a344dea5e59d55a03b320ff6896bfecc2ffd218c17f253b6ed59d712eda26de98689d74a3593080ca04aa12df643f7d663ea71f76983243c32f72ad1cfd56d0790380269ec4fa1d398a02784ea76fb653f621c955dc9b5c76b3aa101bddf0b1dc77b09d7193ee3977ff2a0bcb4f825cebdcd5d726bacdc4bbbd6dc0bf95672ee35e1a518c2eac429a76eeaa00b99cf6211844d2fd3b6ac0ab25cb31f135297e90f5c5613ca1fb35c16d5be4aa082331a041db97ec1b9a5b4feed27453d7fb7ab6647a50e5e0a3be4f858181b06a0ac395c2196d298cd789910237b87d2b85a5696d15ae0c48c167dd32e98607ad080b90214f90211a0fb8ff560ca9504c5b571eb6a26c4a9e2b1480b1287e086fab1794517ea64dfdea096f8275a2fefa5ae97c7804cf017a46ff8da47113bc4a93a0ddf991bc621a8d7a063854d37d08448143def60bb81b6eef240a6c22504b6e2199b3d3f8c9dfe63c1a07b877adb359eda7830883ca8a3387da29ddc0422280cc6a7a98ebabc8c0dc4e3a0941d5b10d77efa5da043478200f2094bdb78504d5ee6eeebd92fda34b2151e35a07e53446fee6bb173e36a191fef2ff174b493be5c5d9c38f0e1af97144e025f61a03da10497ba8eee352c98ac78d7f55c297478196d048d93cfe2298ed889b9fc35a0b01689a2bba4a40e9c901e6ae215e5acdb2cfa42dd0af19607e1ef4b374108b5a0567e23606d43dbbfb8d35c52a876dfd411a7c5a66997319df928967ad437893aa0da99677795f76062a5c1927baf3fa32fd66c64e3ce8d0d4bb55685e7411b307aa004e6bc1d64ba72d89542266e946e7b24413131de4553934285f53dd2d966f14da0d18e5f84e70f8f4c8d62d95901a22e2f1f99dabd2fb79126d97e3614d2feb06ba0493e106ecae86a1a4c1a34fd2ddbc5538dc275838f82e7e17295e6f309196d61a0bf3e450b07bbc9a997d408aa561f958551b9152fcdde28860881f1e3e6f8b43ea0ede98000b5e538c24d1d428f46f9bb60f4fd869aeff5cfe6432259e861417ceaa09e3548a8b2c15c778d70010e9ff5a82005a5955a55a1d1d3c7f13c1c5bfcc15480b901d4f901d180a03a82e40aac6b4b665b910256c2ac0673b9b8c7e2c18b846fdb17b19b38c79a01a0c2810e576f9a91de5be7774f18bcd3b8f32020c1b9051d7c6bbf212f954acad3a0e93274f3773d34269a28f86cd1c6dafd18b30f42f29808932a5d00c68c60dfd3a0b5208edc16ec4ebf968be0767439f69f24f3511c64fd2e1fec45be43a15f591ba0238e86031d6f812bfbfca85d204e6676534aca4a1e84d29260b2d1d48a687961a06f05395b7e998bfd1a5c57183a670b397a4aa50b0b102243d474aa724d89a46da0df367e8b5585cbc73aa2a0e9b06e138d7fda554b4fd3839fbc5445958e7d8313a0d3ef4210936892dd7a4b3fa191bd56583dd4b73b0d20c4b4ff8632ae09934c43a0a10cd7efab9147cb2fcc9cbbb2e67e09aab92542f970446b4773a2f613b0fae2a01f6b383ea1e5dadbc4bfcba833902c120c3d0448d04daf725df9f3afd619aa53a0c2fe0a493bcda2348f94385b85a2bfb882be9da8c7e46b4ea8ba5ef7462523b980a0d0af2c60146ca870fb47a71d6deb019df6d90aa7cda6c7407009bda2a23d5cb7a0a155a41a0bba49577953fa96701b75b3dbdc8c334824f34a702e2a84da00309fa09d6ad83ab9088859dca18089953e4b20f4ee820b09c6300ccb4533fafe7a648a80b853f85180808080a0a3f51c2d0692164012dc9bcf40ffbd3578152cdb07fad54121dbc37d1e3abc71808080808080808080a012ef7fc37216a7288d799939f075fc145c8aba8774d94e943353c8e96d5ae7fe8080b869f8679e20016e8b63360d8bcd376eb61bf80f4e2e872ed064a0eac1ff06dd24db81b846f8440180a0c3a9aa0c9b4e4ac49ceda1e79136460afa072dc8a5c06a61afaf0acdcf2f3dffa0b16944c8bb850059f91dc8cd33437c5002f7b19b721bfe36d3c5122cd47361cf00000000000000000000000000000000000000000000000000000000000000000000000000000000096bf90968b90214f90211a041ea73d589b499b3ca297f66d72fd42d32ac894d7342b9f1f5ba7df0766cc88fa08409a88a9cd0446e5d86cb48699da9fba28f16bccbaff729f40f995187de292ca0f852ed745b6b938dfdfdbb05907bd125d062d9bdf153f14b91965fbd373b4aeba023d3a917bec1f8ffdb722b43a2fbc564d88e2cac88b750f77c4b24ec2f60a5eba0dff38b4d64d00d06db4cbf74f9277e58dafb07561745d5a9aaba45b02c344a68a0e742f0ff9b0c6b37825e640721e8f52e28f7496113dc739df7909f98b8d107ffa09c7d25dc86534637ed0ddca306af8ed926c69327a77256d656be65c574f48c39a0955aa5238a644da8f41346bbbbef37a125ba325cd82bd8c828a90fa62b25e3d8a098b3b17535b51569cbdbc27c85a4a42b644a4ac78fa4acdccff33dc90c596f33a057eb0ba87b13ebf4a0ac86d488057a133a456573121a03920d6b016a5fce5463a0236bd37c9f80cc33f7c13e0d8d762c7a9ef57d198bdff09074bdd0c61640a174a09d8ce5996a6cb45c4cd772058d9e451559412d23e4e8649abc7d15f66620da22a0622ea2bb068aff3062c77c06e2f4ee3d77142278fbe763313d24e26e0c9da1dba0ab1f8c0851abae9f70f3d4fabc621a26f9113c9987a4ec6755e3e41717f28d66a01edd4ebccdb98e98cb368bf113363e18d31c8a5045ba892184d1a1e7812d9343a0f9c3d074c6ffeb0ee9a54072526219c148471588c56867dd90fee70f9ff9b69e80b90214f90211a0ef35ebc10af238adea3cfd94edb733b63302f5a9a711628f26bd8e9c1ed5b85ea0c3d41a4c9b3997884183896e3c650ccb9fadb4e33076ca358b07e1bf07078594a085a29ed883efab0c8334470dabb77adc7f167cb67bcbdcd2e1758f1035f93cfaa0e451fbf995657f8cb28e2856665852fe413a31bb9474ae79686267262ca55079a049fa5a9ac382be66ace1d14c4241a0c40f5dabdacaf7b9c21e62ab35d97707e6a00dc228f7da2aa8f32939e493ee932134c6ff7392037f626b30248dfe0ecb9d22a0b474a23c26c6a63ac74bebeeb067584c39689b7634458b44f2c0137462d68088a022b697290e06ae32434d2475772462823f5737fa90015508338be0999d21878da082dacfca193987b94a1d121c60a95e7353dffceaf6de6e12ca555795f6370139a06131be7275213f6deaf1d2cb00b86206fd6316151a444124fe52e569e853f21aa066ad2a157f4ae81dfddc8d607d25f47d5d78f13004c724b6d4b4d8c97a989a93a06910ce53afd6e378ae9ddae2c18083738be6187e08e30f522d4012cbad9a8c72a07f118b2da0b7ae475be06a6848cc5fcfb84d61157f0c015fabffc84c3032a90ba04187f4230bafd2aa02cfeff072b352c4cb69608556487060c9605d63cde0f592a0620bc91f688b094206e63f99af0f588e1e0c34b4d5c730d50d9a6e0116459a44a0a4117f732e200c2e5817e83040900fd27af1f453188f4ddb338558078969af6f80b90214f90211a0c094b100f8398d844396723498fd0962bb5c4288212a8ff304c0d70c10dca6c6a02e75e7d79fd0fa9f6da10a0700e0c1b1ed932f8a99810c44babfb9ff75bd16c3a0cde74cb1e0a33182a8f3e50b76163dcbf304d667e38495280d5e0c2bf22541e7a0ee94499ed79fe328dd65a0e2e7bc9c6156e315b5d76881e9e53c416378ac8ccfa0b982f68b8ee4c39d25c74af3de3969447068567825b97dffd4a70b5f1047de70a05ff44a7bb582930859321130d46489efdbfb930b4568d10779b230884aea6bc1a03e76e4457a07d55758cb4542f59b143615428024a823bcb21c9b2d9e621a583fa0374622b546d2fdf29ce25bd6a47755110cb9d4e674a1259979a8ae7b971478bba06b6a8b1b89c50240bfab8eb7f98530bd20e166049b73e07ba98001374b9262a1a0265c7d0ddc2bd1d1732a5c341b26aeb99c324a005dc22c81f160aa2520df75f7a0af9885504e2d9bcf536f80c60f3f662533805d89971fe5d00a0aaa9d0530fae2a04df0c53be7f9bbd3ecbb0243d5312298939482b82c8eaed906c8265c916a19f4a00145ffc14555f9ae81e8c4540da0f73eb58418ac99ade8c78b248f458bfa8dd1a0234d972256b55fec4a83fba4cd0f952c342cb5e3d52fb879841ebfa88b6865b2a051997e3f9206b9b09c5ca7326dc448f123158e4c454917fcd13e3254c05eeb70a0609a0630cb48a43eedebd57516a220ac8e34faca884126fc25b78af8ebd8d9c980b901f4f901f1a0414069dffe8252e52a1a8896384784ef1aabc71ac8719e92e7c63960f02ecf34a0254db1a77f0c2288a0f390f691dbd08226b6db72d6a0b1dbc135e7705cf5e7bda052be66186fa5334849180233f16120b5baefc73bc99b89a665e84243eef8b982a0ae2b3fdc9e20552ea4a446493e0114ad56f39eed8184f1ce80dd5d63adab0bc7a0f645824e46620c0aa97a23502c9e271a3f510517f9c19f172103806287155d67a04f64fbd6f9f28c485f0fa46c55e0318ccd8c33bae97b2bf47dc0e2d77e5e05d1a0b4153067f6b6eb040fb63ab71bb4321cde525349bb11e411fdbebfe5b256324aa029bf330284c50674f23e35e251c52cc0c7d4c835cb9368ca0936bf07fa458706a04f3a05566c5cf1284c0d281507b12c0492cf8cee077fff204d6cbc34efde4d5fa0eae652fe309e69fef05ff51f198a241df3d5ddf772c15f0ed2fae5f30a037f18a0679aecc867f03867b8c4dfdfd28c4432fc6672850844a24c941ddf101c740651a0500aa8840cc931ee91740358021cb6a687149300c8edf13e79b1668d47aafc5da02d25b017323c0d995fe82f1f6312b721426d28e14c35ad5f82708685a7d47499a0bfb65c61addbdd4282051105c450e6f67129c306f4e6fcb44bb8392a0c0266cda03fa25bfdeacbfb5791361399d18a053de988b0eead21f6514a12431c5862c46d8080b893f89180a073fdf1307b9d69ba7c0da51a4d6d32b591523f02b9e627bd6e97aafdc4563db480808080a0c5bfa6e8b459945156f33737f4697e53bbaa100fa50ae9786b8924f791f15efb8080808080a01f1e2c58b1eaa96bceb967b8881d24b05aad95eb5a718aad4713a08f0f17885580a0bfb51940722cc8a40fb96c9371ce6d16a31273e4ab9cf2469a06a6409ee0fe518080b873f8718080a06950e9dc1e08db4958546dd1c1c4f04c2ab26e15c6898b5456b0cd0aeda480d0a02f092488a6ff995d1cec3e0b77d75ba474f3e3bc64da7b7a757e7a4389594b01808080a08a0627e9d8f667102e284ffea65f818feb1187959d9908ee07d464e230d27d61808080808080808080a1e09e206bb61e2074de886d6d4cdc48df7562b7f63e1d7457cd7881164323190101000000000000000000000000000000000000000000830518dba0359f2a8467b2f212e9f540083652954389c9bf2a55f1d8dbfb39ec0531da6972a071e059149dac7a8c03fa165d6a5dce7193e6a114681d9517f5b38d7d34cd584ff90410820a788509502f9000830f424094fa1072f0cdbefd5b8ddeb64ffd2fda8eb7e1cc3380b903a409779927000000000000000000000000fa1072f0cdbefd5b8ddeb64ffd2fda8eb7e1cc330000000000000000000000000000000000000000000000000000018750152ae8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002540be400000000000000000000000000000000000000000000000000000000000007a1200000000000000000000000000000000000000000000000000000000000014c08000000000000000000000000db5c4078ec50ad4cdc47f4597a377528b1d7bcdb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001a42e9feb79000000000000000000000000ae5c05d961b834bc5752d4bc6774b1d47e53a64c0000000000000000000000000000000000000000000000000005915cdb3384770000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4fb3bdb410000000000000000000000000000000000000000000000022b1c8c1227a000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000fa1072f0cdbefd5b8ddeb64ffd2fda8eb7e1cc3300000000000000000000000000000000000000000000000000000000642d18690000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eac2bd4753c659c909c92f62b3b3a8836c2bd86c000000000000000000000000cea5bfe9542edf828ebc2ed054ca688f0224796f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420990e2c26966b1923e150eb584d99556a49f5bed5edd719ce87639431260afec079f4e529e02697b2c0fe1bb45565be94b40699438432bbd11072363a64faceb1b02000000000000000000000000000000000000000000000000000000000000830518dca023938095c841c02c94271e4d5c71490f4b09799f102e453897f99e425ac1866ea052eeb3d59062ba2e61d5d5c0d4f296d243fc804960bfab1ebca57149eca354c4f904108207118509502f9000830f424094810964c10ada4289e6c860eefa5bad4ed3a6b04480b903a409779927000000000000000000000000810964c10ada4289e6c860eefa5bad4ed3a6b044000000000000000000000000000000000000000000000000000001875015320d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002540be400000000000000000000000000000000000000000000000000000000000007a1200000000000000000000000000000000000000000000000000000000000014c08000000000000000000000000db5c4078ec50ad4cdc47f4597a377528b1d7bcdb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001a42e9feb79000000000000000000000000ae5c05d961b834bc5752d4bc6774b1d47e53a64c00000000000000000000000000000000000000000000000000016bcc41e900000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e47ff36ab50000000000000000000000000000000000000000000000008daec643bfb5fe9e0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000810964c10ada4289e6c860eefa5bad4ed3a6b04400000000000000000000000000000000000000000000000000000000642d18680000000000000000000000000000000000000000000000000000000000000002000000000000000000000000eac2bd4753c659c909c92f62b3b3a8836c2bd86c000000000000000000000000cea5bfe9542edf828ebc2ed054ca688f0224796f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042260055507625a83c3cfff9998d8448143be49dc90739579ef0952e6f5a5deaf84a6c6ceecb56f315f4870cc67684b8bb59cccac49e79e6186d6ffd71a95918191c02000000000000000000000000000000000000000000000000000000000000830518dba08e14fba1eb2c1e46e275b64fdd83976f8c741a835bfbab4d1d480b45c438d4a5a0167506d4eb7472a0184b6ebe2955980fe4dd8b1171488385a3802ac6751d9561000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x3b9aca12', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x1b86f', + r: '0x175362275825f1596f359970832405998bba012efc299cef4d9394f06c6b9b75', + s: '0x43d9acb8616d9251462c23141de510f86ea0f531247e04f3d34636f8dd391411', + to: '0xac9251ee97ed8bef31706354310c6b020c35d87b', + transactionIndex: '0x16', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xa1f4764640f5204a6adc12fe66f1aaeeca9515ae', + gas: '0x1a2c8', + gasPrice: '0x3b9aca09', + hash: '0xc9f12beaeff3325c3b58c03f66f6526593432f623d2a873bd8ca7e9f9d3c48dc', + input: '0x22c90a990000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffab9278060000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000373756d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005507269636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x3b9aca12', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x242', + r: '0xff8ca84b00f420a78380434fbace90d79ad66d69b3ab838674a2dd2757308ad8', + s: '0x7311d273c8f440d364efa011c3f7416dc97d8e34567a9b98f37e775ae9809821', + to: '0xd12fa5c13cff2be2b2527b745a7f96680bb28050', + transactionIndex: '0x17', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xe31c5bff7904c3a102434ffd75701cd8ff80d79b', + gas: '0x100fc', + gasPrice: '0x3b9aca09', + hash: '0xc8314b15135d8629e2423065b853fe91d7909d7cc9450e9477e667ba84eb45a9', + input: '0xd0e30db0', + maxFeePerGas: '0x3b9aca0b', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x12', + r: '0x2fa6f8bf60f49a700e3d7c99843af1a4acb2c17f38c6367531e1e701ea4a86dd', + s: '0x6e7b0b7d4bce277491217d269719128e4c1b4b4823c7c0a87345a54829214b5b', + to: '0x2f37b8ab86428671974ba67465ac867754fb2bdc', + transactionIndex: '0x18', + type: '0x2', + v: '0x1', + value: '0x16345785d8a0000', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x113ce23c9e0cc50f4d41d7ce6da02dcaff8bff85', + gas: '0xd0e71', + gasPrice: '0x3b9aca09', + hash: '0xc96f60d36bee10caaf4b40ddc2c90e752d7d4abebdd29646efff6b8a6454d070', + input: '0xfee99b22000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000c59200000000000000000000000000007777000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000028c5c0000000000000000000000000000000000000000000000000000000000aa36a7000000000000000000000000b2fd0dc2c2e7b8b3da558e7c6da444770945646e0000000000000000000000004284890d4acd0bcb017ece481b96fd4cb457cac8000000000000000000000000b2fd0dc2c2e7b8b3da558e7c6da444770945646e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e871b5c7070000000000000000000000000000000000000000000000000000000000002fe9a000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000001a40c6fab820000000000000000000000000000000000000000000000000000000000000080000000000000000000000000b2fd0dc2c2e7b8b3da558e7c6da444770945646e000000000000000000000000b2fd0dc2c2e7b8b3da558e7c6da444770945646e0000000000000000000000000000000000000000000000b397f5c2384446e3e40000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000005b9fedd37f0b92e7e282b19cebcf06f57b77c604000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003424c4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a42756c6c20546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000360635eb59f4e56ee875feeb613c7ed68ea8bd7773d453b6dbdf44811be702b967b1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001897ab168dfafe07e4c26bbf873c9d580efd28d0ce2565506047e788057b60e20f27911504675e6587a70a8759164f8c270a225e319423ad2c296aa298dd1ee11a305f695a5ea33e6859f353ccb80d14a9f5ef67e89e544d5a960a4d435dcaabd402000400020000000000000802000004000000000000000000000000000010000000000100000000000000001a000000000008000000040000802044020000000000000220000000008000802004020000001000000000000000000880000000020000002000100000010000000080000000000002820000000001011000000000000008000002000000000810000000000000110000008000004c0000000000200002000000004002808000000000220000200000000008000000040000001000200020040000000000000040200010100000000000010002000020000200004100000000000000900a800000100040000000000000040400000200000810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014b41000000000000000000000000000000000000000000000000000000000025b415000000000000000000000000000000000000000000000000000000000014ec2f00000000000000000000000000000000000000000000000000000000642d14180000000000000000000000000000000000000000000000000000000000000300d7b65f05c1bf243167fe41c970fc12bcaa604ddd049f26eca84ce033a5fae1b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000008bff908bcb90214f90211a034af0f449ddd390928628256b6b82e5a62ae461ae28fcc38e297dd6f856bf0daa01b5c06879ab72540da901c73ba855717eaa7cbe5ac569b6bccd04f9cc78bebc1a090025b072a56a132b1fa8a30d59f2973521a4c23856385e7234c4febaafe96fda05da187651f0a998a909d86cfa9ac6363f94ec2ddef2906145d7de87c70d40584a00186235f90d15dcd1623417d4513099b313a62cdfa111aee8cb7bcb4142f1fa3a0fa29813f52a6a43e3abf2a51c1f3ef40c5a9a4d92f404da3520d0b5cff6c2e1ba09caf07709579182f27fb05f453e61935c3bc7ef4d2b597fe008ea1bfd322b3f3a0224f31434147ed03c5267cbc2a90b8e289ab377b5259ea57395c77868652d6c0a04e1e98000d792172b04c376e5e6b2c6f3b07786d66675f00d2aa7c515d86491fa076016edbd69faa9d65a60fd9453e8b7888f6be1b77fc5ea99dd187cd0ce27c5da0bd01d3e33f29301cdce2964d255e255008d6ff2210cdcdd21dd211148ea939e9a01f6557012edcaadfead88ebf12284615e04fbc4fb74f407740cc989a1f4b561aa0d267eee3d5c73e1f516445f7c5f9659cc058fbd05bc0ea13227f1af502cddb33a0f4a4656d2a1d89cecb9a5439cbc74745118c688d7e8b91a5ea20a51fc02c1d5da09488a79f75111c590842276247157c99ced6567b0c656d175db145538f8b4db3a03a59c6298e83c06ebc4efd1a445c00ba703647a86dc27d02440bf906e5430e1080b90214f90211a022b5bff55cc753b8386a29039a69bf06cc780551bbdbc6476375f8252c9acda6a0f3314118d029e09e6fb762ba0b4e81dd23718817eb7ddd67901c9f81a234e628a09faa8606558839ae524942d936fd360dab883562c1019f9bf2a6ea984a6abd09a0935cc557b83b8208653e33a1b02f3e39a302b9a780f7574cae248426698a54a0a07786d2b213b506b7e99fe7560ae6b88d120f41632b053a6885b6ebcf7e6c17f6a069b3b12ec66c2685578c342474433c21d1a9923f62c0f4f5ee116646ac4e72b5a0baa06480959c44b71089167b8550a2fba5b57464128ce9d82a111a562bb3d40fa0e43356fd5ba6edeec033418994b9abe0b3fa5dbc7e7eaca2fc905d7901b9dc1ea05160c6be64ea1192cfc7b587b9885626c6a9aadfed447879f1db8c49f0cf5f9ea0bb4f9fa3aea6851dd72365a846f77afc8c7baa818058efcc341e9dcd139078ada02d6bc148b394f015531eae2e3e1b2a3123ee7fc79e406d1235910b4b2a5b034da0e23628d70d3d0bcb04709378547a5149b092237931aed0deee0390f947616c31a00e07e5e2afc8e4edaac25e24ebca0ac035e8022f7730ebc2c14a3126db234320a0a48d64177f73d47230b0b7338e60554309f5fe77aecbd743f29d1eb6d3b62fa0a001a89c298decda4e4ad69e68d55db08d249e7f6b21a8a1a632990eeaea75b3a6a0129da127678f4d08c62b6d217e3fc900f147370f7cc050b56058a34f06cf919a80b90214f90211a0058b5c68803bb3adcf5cbc1559a4f96537330e4a9292cb772f4b273af79d1d77a0b23d6f6699535e9f1bed236a4b703465b1e15f0e81a7c5fe15014329aeddc4bfa0bafb8b56f68d791a2c73e0a3d321255ab48abca8cace945d31fc29cb89083be6a011e0b6974f0ef35e775f72659b5d6758257150224003152803f33f862541b427a01615babd46293d546db4b116207d7ef1aeb70b622b297c5bbc8554baaa6a0706a06df286d178ecffc118a3b316cff7c8571c8b6237a49b2c4c4be49db774a3531ea00e33eaefbbce215525a69d515656233f4bed4678e3e8dca0d39cbcc4923f0098a07413c9c9131c12fb98fc3276409f4a4e64a91ca9cdd98349e66838882fe44ed7a053920c26f3c2b7db1f3e8b7fe344fb0c2cc193644c9cb3c34f06d30e15b1c6a1a0cdb9a2fcc496b55bc249c5b46aea99f89055e4299d655f06acfe635388883d09a0e965d2f6ed723a86ec5157ed292522519505f65d9f888c098abee18ab49e00f2a08358af1733207d020f3cfe1d3acf1514ee84f96abf6a88c85ac8d75b5bd6936fa063665e7268dae7271a42e5695b217af12e7e2867a9e4513e324c5b19e637b8bda044a16cada2d885dbf801c28d6fa0551519c121b02c8b070768574098605c23ada09ad946a45a28264fa6268b10af6f8312cb847bb5430ff0224c0038c96a86d519a0bb835b2d8a7964cb35179a0743f82c064e008d298fb2373a619c4f1da787b07a80b901b4f901b1a02c5c8117c46e1c793f9f9c185a884d0e008b4da11811cefd0ffa5f9f92f94d0ca0f590e995526db9695176be42d62f6166eb9259a48cc049cce2d5ca16a2faf3afa037b2b4ae1dc3b6b028c63a963caf3c8c377ae3aeec3a7718668c75a0b0dd07dfa020cbef76677a8dbe17b9fa837c7ddb84f003613510c455c318de71a801dc9a0fa0599cedb5c60be89661537ee75ef8a91a2a7735300122d5c47eac5b2a171d9b55a0af953822ac983a2eed99c2b6c6ff83afeb7c25d87fa07805f415e4073f79e1678080a0548fc8dc803a5821bcdf7ed20664fd20fb5175f6d6ad6a8a716ff9ec830a0475a0ec364d661ae9f61324b5e48569b26138160b675e265c210b0f1117f5761efa79a0c09b6ade00c77463ca078699c68bd96fdeedd435e3af56a2fe7ab813ab25f92da05760f02a169893d2a86d8793946a7868f0afff463a1262667d695efebd5fd172a0bf65cac3bb5affaef46f5296678a557a5da43e0b3d9d4d7521b2e2f51b38fc86a07c4b791d546d46550b59f094061f5c7de27f57aa669b83e6d549c39da3f4f4f980a0a8ce6683a46ed8d524f85f30ed02b79b194e5b9d443944d57a17ed947b95633c80b853f8518080a0607f4b81fba20cc28a9befdd29999bea6775787367a0de8f69ebae31218516fb8080808080808080a0655d31aff8515489fc365adfde0a64ea71741c8883f1e83afd73082936fe785a8080808080b869f8679e3990ccafcb92f5855a1f4e1da52ebf72581fbb6b64c0d911513fe2f507b8b846f8440180a0a25fb907de6bc04edcd901638030f57574708c23417bbce8d073781a12e685cda095f9b3037c0e121b55f25fe3c1a83375541f5ffdd4548499458f0c60a645b9ac000000000000000000000000000000000000000000000000000000000000000782f9077fb90214f90211a04e6e3d7884aaef4383c74f71a74cd0d5c97922a50a73bd00fadbf5de10ef3b6ba0ac404cb6b6b51a678c9c06dbd2e1a15ae678a4e40e45c0e3044ba545d326b624a0159ed1937e2843cd20f16f08c88fec03d6392aea6267ed7909aad36c333cc4cfa088ab73a650eb400216ec7d319941852eadec6ecb9379b37114b24ab25405cff5a06240a2ec09e987f0201218e0c5d38ecee676ad7044ca6c3d6e5ba4d7a74a6f8da0f441e11ee8d6c5d255dd04913036e3514f57e6d0bfa4e3aa75389138f4294684a0f79ec2f068a3db745acbffffb06d40fbede425e38450d8cb2b2cd474689388afa0452c5041c45b3907552d475f48d26eae46da9a28e3c69de53a34cc68c9f84c30a09392cf77e4f00cf4f211da330703449303c53bf169708e9dd7dbfd4cff216bc2a03349153ec08c8905f90508fc26a8474e1f85f40f7aa9ea1f58738149a782de54a0c55fa252f7c0ea9d40175a14b65ddc2eba80de4724f105f75141d7dc0be8a3e6a0f37c275ba8aa253861287156aba9da4a47ad2e5cf0ce8dfaf78d7ce4c3dbef1da0d45cf6c6ee3dc0886437e53aee397260b304ba0b5763e11e55b82da8e0286e10a0188c1e354f05e773cc8d961799ca4ea9c2550383e82893759bd6f6eb60da23cba0a0aed233e3be15d0b2ae078063557a33add09b1ef89d3e2cfd2cc1ab9951aefba054d325d668c5023a880d1c137115f7af33df6d0806c3b5e0fd268ae278b0897780b90214f90211a0f9375ae5ecb619ea78f6eb465c5552f72c84a814e3f6c03f8544ca4bc3848d40a0c1108a07a7122b25e024e2d2e1c4522957c59ab0da06c84182cd196676474d29a0261ef34b508d3ae4ef115f5df93915b6921a6256008fbd29889101322b2ea234a072daca21e6475db55cc8334134cd848228349f791ca125d496d0260e3fa86cfda0f58147b85a898dde2e5923ec213564d30797f27ccb9ddb4e91f58c61c8cc9d80a0bde4914226f29e6ba355f544de3b2e41118e30147ee0aee348e5247545702ccaa0046017a655a7fc483469c36cba84e540f6e3e6210d84546414da9a008290bed6a07dd938ac80ac244d043b8a65843b304f2977e4d9d68e7af3d0e99505ae40c48aa0580acc0e48575954db44fd664804485f830eb11b301f12abcb3ea7884d4522d4a02a0df37e5e34f32e3d54dc9efa4179079c03ed06a622be0a57c23c63d4aeb689a0e5de958862bfd483180364b09b5fca66f675f06078f69143f5e087fb9fe67eb7a0371255278057176f8764c2d4e46bfcdab491331f8e0689f3d1f0d91dbe9d47f7a0ff80a85e7ad89b56543f2e8ec75ce302db46dbabb0e95e91d36e6393aa6e9b88a067a83b2529f108b7e8d373d4579ec19d16f764fa4dd137da441fc1bcf4adb39ea06ae1191deb90637ae41a08620f786b37277e38ed828e86b53416ea2605a25285a0a1cfde0e3b25bfc04760733e23b94c69e241e2df1e0da16ff197adc87a92a7aa80b90214f90211a0cd89739ddb8de2187359bf1fb97e5becfce2084ee7d35d838e6cf14a20c6c0b2a0dfb6a6df062bb342caf38b4ecc5d76ba83742e0d113d2cd5feddfc5ad5fba116a097633f086b46789d874ec6a70cb46000ec51a67665cd864aab03b3096381eecaa02fbc9da965bfab882704738606614d5c1d01838893f68a609b6f52c4dc98298ea017401ba05d6b395c213f2c26af295aae58a489690376d79ba1f732a1ce80a3eea0993db5d3fbfec116ede1625679ea6694233e46469a8172f32688cee8ba1c11a5a071c159c3afdcf2a2a71ad3bb662397db55ab5a708ce64402772ec997ecf46dbda0b5e0b63a49d2a61d9dc0ac72c83b1bbe75f8d9c8d106e1be20991bd224c8981da077f3ebe2680d284f3aa233966c32e42947a608f3a61cd86d578331826eaac663a06e56203c00b08c5fa5435cf90d9fb531186a2204ce3b044d8334762425aa3022a0e167c9c0090fb097e6c628fbf5d681950bef9ef491f726ad434da1afc71418c1a072c3bbdd8e01cc228db2640a27bff504a8acfb9033222cec1e488973fbd9170da0405027c929d71ddc2da325f083f0146e11af13e1be4c64a3ecf7763d242dd30ba02ca40b009934c77dbc45e1ea31707477da52c99f2e399eca348577bd04a86a23a03aeb7c5a907110d9904f7629ff6f8d4efff24a86e351fe12e7f3bb3db65b165da032af17e766d7560489c1f6cd7280ab1bed9b670afd6a99ff8e63f6af0d824bbb80b90114f90111808080a01d8c31c0497c7953f6d3c6be0a6413ce90962e3242ff56405e119ee48cd8de988080a0ec9dadb2a13b7880a7224184424dcafb1b5902bf8bc67dbd52a22a9486d54d9ca006f22293fd983b97b544fbc94a24804cf39409d43859e339765e200ef7888ddca027d6bc7b4f2c344c3cd60ebceb2a5118bf0d4c953ec8840247aa1740933760a6a0fd73cc3433e21fd601bac29afdb0d984b615dd3ed30a7cd65a44ecf60971e1c78080a08f4288c71f60261055795b541df25b55da481e01f1780eb90cca11dcb6f0a95aa09309fae74949de4c2ff7b9d37cf8e12541fd1c44c86ced9d8928c6642a60e0b780a0551c1bffb82addd464b3018ae95671295441bdcab322751e0a015b5a9333d4ad80a2e19f20d2dfed097155b4ed77a70788e2a2538cd6acf54cef17f92ee8272433306801000000000000000000000000000000000000000000000000000000000000', + maxFeePerGas: '0x3b9aca12', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0xc377', + r: '0xbdd0b4327329360ee358a8026009fd9f2a6b13005e5af55eeb377e641037698b', + s: '0x0f7e90c4a14653e8fb3591844de75a884086c80a52d6df34df73716639a3ef2d', + to: '0x2ab7c0ab9ab47fcf370d13058bfee28f2ec0940c', + transactionIndex: '0x19', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x1567cdab5f7a69154e61a16d8ff5ee6a3e991b39', + gas: '0x763ba', + gasPrice: '0x3b9aca09', + hash: '0x61f293e6fc8978ee7e4f8c47e678f44ab08bc475134952452422c9ed96ea0b65', + input: '0x8ed7b3be0000000000000000000000000000000000000000000000000000000000014b4c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000960000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000001567cdab5f7a69154e61a16d8ff5ee6a3e991b39000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014b4c00000000000000000000000000000000000000000000000000000000003148fc39c9a8534f0f63e3762a6acb0dbc650c4833e08f3cf6e6e80d6d05c9e72650700000000000000000000000000000777700000000000000000000000000000001859620d37816a8fe33f24568dd2466b4430ac8e9516fdea857fb772764cca82f0e76cf63a11fef75cc0cc7b53f049996c64c4d815b0e8b4852b2a2573dd6b90d000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000004dab7900000000000000000000000000000000000000000000000000000000642d14b400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd520000000000000000000000000000000000000000000000000000000000000000b5bcc88c61252dca03d1edd77745973d5ec00db9c9a1d3a086cd0c3843a610c81dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000007777000000000000000000000000000000011fc2211bacd10d06b4a33ed4ee685e8fed00cd154c8658a51544d62605a78f6a6213dcbb514ba91b66c3f80b7cab9b129742be85808eac98232c60415e62cb8c6fd280bc3ec0dfc246c389bc54af9243f4adf6f1d4aa6941e9c4a46684a6be30002000000020200000000000800000020000004002000000000000000200800000000002800000000000000001000000000000c0000000400000920040000000000000000000020000080008000008200000000100400000000000008a0000000000000000000000400000000000000000000000000004000000001001000804000000000000000100000000014040000000010040000018000083c00010000010000020000000040000084000000004200002000000000080000000000062000002000280000000000000800400000000000000000000100000000200000100040000000000001001002800020100001010000000000000400000200000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014b4c0000000000000000000000000000000000000000000000000000000000517c09000000000000000000000000000000000000000000000000000000000026616000000000000000000000000000000000000000000000000000000000642d14b400000000000000000000000000000000000000000000000000000000000002e00e76cf63a11fef75cc0cc7b53f049996c64c4d815b0e8b4852b2a2573dd6b90d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000001ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a0d22c857853b67e2ecd1a36be5fd4fb57b847071e19a3f61c7cc6332d2ab3c2e280808080808080a054f43064a171ad1b429b9fef38d81a0f159d2c745e366f610d20b88149a7e8ec8080808080808080b8b2f8b030b8adf8ab83014b4b808303d09094000077770000000000000000000000000000000180b844a0ca2d0800000000000000000000000000000000000000000000000000000000003148fc39c9a8534f0f63e3762a6acb0dbc650c4833e08f3cf6e6e80d6d05c9e7265070830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05d1f57379d42e3cc1882aa8a2ae15031e199951301ec70f0965d96b68ba04116000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a06115dcce3745caad12377ae6b95d4e5ae98d1678771214c080e486001d4d070d80808080808080a06b769c80467ec45da082aa3eb5907263f384138da48baf3e70dc4cbaff1b76728080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000800040000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000100000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a000000000000000000000000000000000000000000000000000000000003148fca039c9a8534f0f63e3762a6acb0dbc650c4833e08f3cf6e6e80d6d05c9e726507000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab83014b4b808303d09094000077770000000000000000000000000000000180b844a0ca2d0800000000000000000000000000000000000000000000000000000000003148fc39c9a8534f0f63e3762a6acb0dbc650c4833e08f3cf6e6e80d6d05c9e7265070830518dca079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a05d1f57379d42e3cc1882aa8a2ae15031e199951301ec70f0965d96b68ba04116000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000800040000000000000000000000000000000000000000000000100000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000100000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a000000000000000000000000000000000000000000000000000000000003148fca039c9a8534f0f63e3762a6acb0dbc650c4833e08f3cf6e6e80d6d05c9e72650700000000000000000000000000000000000000000000000', + maxFeePerGas: '0x3b9aca12', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x1565e', + r: '0x70a9000a0ef35877d7f22f39c88f7ab5e50655eb0ceb75a02a97633a69f7cb10', + s: '0x05a1c9c7a9ae2615d4840367bd42176a279386fe245607869e6a85a851bd2adb', + to: '0xac9251ee97ed8bef31706354310c6b020c35d87b', + transactionIndex: '0x1a', + type: '0x2', + v: '0x1', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0xf921640daca3cbadc982e4cd3e1352dfc3a6b39e', + gas: '0x156c4', + gasPrice: '0x3b9aca09', + hash: '0xd463fb86b29f6fe631756bf475c210bac81a596486947e1439f6e63cfed71e84', + input: '0x5a045f78a44038d11401dbec7df63285e67ae6630cfab0cdd51dd840f1f73502442e412b00000000000000000000000000000000000000000000000000000000000351d826b0438b6b537ec888afe7b673f633a0fdd3732c3629e1dee30e962a46444e9d00000000000000000000000000000000000000000000000000000000003148fd', + maxFeePerGas: '0x3b9aca12', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0x2e5d', + r: '0x721ec552c6693810a0cc42b632f48ad7fe4da1ff2ee4e776eee3d951499c4988', + s: '0x62f4ebb094b6cea8e803d110944073c740428934f64ea7d07b662b3e3242b4fa', + to: '0x29674fcfc8f24e96de1c0cabf6366be9e8a00fa1', + transactionIndex: '0x1b', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x81ee20921f17db2a4413793640242cbee450de9a', + gas: '0x15be70', + gasPrice: '0x3b9aca09', + hash: '0xcc3a340e784872ba9dba17f268029e94ed3c7a49f44a4b8c7a4b8cfe7325b9c4', + input: '0x8ed7b3be0000000000000000000000000000000000000000000000000000000000014b470000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000001fe000000000000000000000000000000000000000000000000000000000000020c00000000000000000000000000000000000000000000000000000000000001f60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002200000000000000000000000002408e37489c231f883126c87e8aadbad782a040a000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014b4700000000000000000000000000000000000000000000000000000000003148f63248d87b672dba6ba432253a0f0234f5a5651d75e62e4b01ef9bc38e216aa8bf000000000000000000000000000077770000000000000000000000000000000161392851f9e4f80dfdd5e53164038d4eab9d409064f46c477f24fdf122243f7326633e046a9634e080e562c66b0324def962a4006378fe0f13a406c6111baf40000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000003ca21100000000000000000000000000000000000000000000000000000000642d146000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d65822107fcfd5200000000000000000000000000000000000000000000000000000000000000002d41fd4239a27793a7f50ef1d76d707d7caa032dea3d15dc9a6ddc6d5d123cc41dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000777700000000000000000000000000000001ee180edcf187969cd241e7b501b6d656532e368c638b3cf0a57452e80c5a00910e6c0f5afbd8352a3221c8e16a0788b77071e4caab301dd1460c63a5f5b573eb79338ffac4100fb29cefb1bf8d25d31ce802be5bb478c228300da91d391d348301200000002020000000100280000202000000400200000000000000000101000000020690000000000000000100000000000080000000400020120040210a00000000002000020000080088001000200800400000000000000000008a0000000000000002000000480000000000080400000000000800000200001001010804400000000000000100000000014000020000010110000008200082c00000000012000020000000040000184410010002200002400000000080000000400082000002000280001000000000000402000001000000000000100200000200002902041000000000000001442800000500000010000000000040400000200000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014b4700000000000000000000000000000000000000000000000000000000004072a100000000000000000000000000000000000000000000000000000000002b71d600000000000000000000000000000000000000000000000000000000642d146000000000000000000000000000000000000000000000000000000000000002e026633e046a9634e080e562c66b0324def962a4006378fe0f13a406c6111baf400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000016202bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b0ea95e7cecd43cceb9ffc714f4ba0bcdc123b8a4f20e92f13a1f02593a06357f0ad6942c184312ac915c8257e7861522c254623309d3c80715fef6cbe94241fd0f08e557b5dce0aa7f49996a67c4aeb80da9ac6f8a59b17a42deae4fbb0d0cf427501d2a701bf47ac4bdda9edceccc79fbc2206a84575182910ee2177f842ac024b24b4eeb776f98c6148c70af4507793a9498a37912ea2dd3df171a246e39f0040a1eaaecb4e85f3e205a797bcf35f61f95e9e44ab7bb8944fb92c12319436f1b9285ddc38316f4ebf6b9994fab4e19b0e435fbe00cd5e226dc9104239c954a06f5769d595f0fdb2f898988326b186c1e58060d04b1b41550e251c92966d99c276d00a69728aeb2267d0418c449a8917a7a200615e9b13a9f235d2b5fd7e4870b431542bba9db9887e7e6bbe4cea702143a430cc71b2849ef31120ebc2eb6862ec1f3dc58875ca2bca527d44ee0092790742aba0d80cd6123f9306bb1ac9f7c2e2878692ac62cc461c7c7d705589f776258d8ab6b61319034bbde9e09e8094d1f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f124a9b47bdc5b67578a43da803f237718e4466a7332fde04fe7f7e95359c41d0d0a30ba1f87af98ff63fa8fad3dab09a9ac5f441eeba3d6ac745dfb16366684e70dccda298015b84abcb05eef07b122a8b89d151125c2d80a936fddfbc6ddfd6327774a9effdf97052d1e1da625c9ebd9a7d112bb11e00398dec228256c662d04293d37b7d902a1f963b5607481f6562bb1724a67d2ed32b18cd8b54cc428162f1ca82274ef593f6c23dd0a29a74ddd3fe8a72e6086824bac9713de2750041a391d7a23ea5dc60b5f0a4b559d4cecec4de8f9305645ca2ed85db7ea2ed03289c30667df22a0fa810f67c200700542abece092d7b5e8a947d1fb4c0e128cf68fcc1af7be52603bd54144505dc737c294a191826b6acadc58bd650a4ab26e27da961dbfa5d4f40a1c249676f4b2fd88265ed6b23942ef4fb1afd2f1bfb808fdb53c0d6fbc3535b14cec095851e5e40d1402560966dc5b7c47cf75c0412bb78addd71a838d7f3d86fe3fe3e083c852ced873d023178496d6cf7313b4a6221b9f62632887363beb7267e0480c0d4618dea58a2674887b3e3f85d0b795518c2d9a0f66054878b7556fb2438981a67961b72c7e153610338839573a6b1ccc12425fbeea1e13209866b3023609f91667a324c7d4428ae28b8e022656e087680adaa4a9fe2936ce41c44f1e0ed8f9c7cd65c68b1b8506b8e75bcd59264e450bbb4d348402195db45a9ffe868ab920485d66d23a7625d1b9892b4a2ac859f91daf6613fbd702addcab7a7cf571319efb37880817e04740f060190e441d231d492f286d99f72c23a1ac53940f261541002268dc9c73adbaad064622c60ddf605a331b16b1bb1efe52cb9d73ec837a69926f28271aeaf4c61f4f50996a913d35b8a87d0f66f8163f23a65e66eb5e73b17d02f88299254808157022094c1020bc5767cd421ed30bc948ce794f70ca50ca6204aeedc6f6e796848895494ae73fc62df3ec9eaf6a0c38a99ee1cd24137da2616f25283852b77a7441a7435ae2dd90f7baed98ca0b19a10d20c1797afdda343a4fae32b01b3c3d2481de39dd9cfebc6c2fe6e44e081ca7994177168fce45be9b3c1f5428805ef91f262d68f47d08ce1b9e884910cb0cb6d39b55f1f3eaee3faefd6a3326c7fbc3b23ec1bf88dbadd85d24d68342b9129e79b98fc11d88190e3de7381ac3609d1205eafa1a71a506f0eb7ed7a5ee78170c11d33c30f76a1b24108587e5d6872568bfbb1f084e8dfc73df6e0f4be89d1f0f344a9b233f287b2bb1607b7946fd20ea44dd33a33d64361e57ec59f5f11f12ebdc318118aa421e1a73f41a21092b48b56a0d8d4049740f327a4197688e2d0870d46ed0b715be2bf14888e3c041d07f45efb8eee2f0e7f8d4e417604cedcb289749fa70d1e564d08411684887c72288692a86756968a38167559bbf143eee0c6570b2b27926d3c243c7df6483f22fbd0e96a9bc4cc39e8ac3d6a58e4ac80d147f188e8e9a002873589a76c9d4f308cf346acaa48353c6fdbd3329ca39c56d1b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c501a1a8456e7b562dee9eb814f525bc166583117e8da765b63d0c16b76934b46870fdca9ce6594b76b5e4872c05eb95bda7098574c78cf73d517b5ae6e5d0c7b1f2b3bd4735aa3c92529df74b20a6895b437507fc1f44cdc88fb2d5e8468ed2fc0188fd50402d78574867667b3bfce7befe91d569edabfe217be4ac2dd8101d63728a08b0d02c6f725e3c14c0f47f4b7ce1483bddae55ee7e95dea6691597fa6db17a326f43dbac5ba1e3408fb2eac7ca167e8483575097d9dc804c23ba18bfd6f05abad37349c8584fc581608dd8d2fef8ab93c62ec82f50be7f87ddde40fa2a809c87ee8fc92fd87dbac398573ea193060575c87c6768c45494e7fa005df93480ffb3f375da875f2ba0e29c56295674d4d183d339bdbcfd26bf96c5f27f65a631c9042429fd3c3d670dc95b83954d9ddbc465b380fe59ce05927a6be8173569a0c84a5344c3aaf0dafdfe58e9284e6af05c034905d71ec2bc32b8d10069a87db2c8c35b4c4293954b6c0def975b3ca0ce484970c73a6edbc8b16f561c5d61cce1c10f3b1fe9d7ab286469a6564af7075382ce7a3ce10c5ab9184d5fd493f3d4c207a79ce978290537e704d612be188ec67e9e8872e03a51838856958a3c656430463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea091cb5ef81b351c4285af9541ce297346db590831516f2df062c8877ae8f1852481e36d3873e806faa86a7fc5637f716db5b02a56db3aa483c344a001c25a8b6c6225ddc4ade14a5a09f647e6fc93608a7db35bfea1fe027e777a3bffee81cca151a06b44c6ff05c06711df8ebf241e92e2c14dd0100eb5cea607bfba67f41e4ec0f852db2d456600fa346f2c17073677406268e73f212abb1cb94fea99c8b996517d80e2892266757606fb78597a9a05a331480446dc07a1d89fc58faad15be2d05508c9a55988c822834db73ca745755cf77975ed577b23fc092b574497c6c992018836986a2a4b0facaa47ed1f40eebacb8cd53301f4ec7fa016f97211905bf05354a05fce802ed398737a699b089fcab8959f4c77d8214ba2374db718e481120881343903805c37499ac6bba1da7dca697c266c9e568b64e56890295f76cbf19c27f56572aa103dce1f100a14eac719d8c51b08c4533e1f1d203045106bbdc180e09061be491621237be12f8432c950d09bd6a6809421265e2e15911d9107f16933682e6831182dec2b2c4bbddb7afa67e9a02fcdbf47b3efb21121217bea50a9e2b57943e2b29d7c41ca458d1dffb84f68a65b4fa5f0abae20125aa0126b32ca8127fbbef4f975fac1107c2ed708ff1b75ac0f16a3e10bd846f045d4737222ae159016f7dd9fc4bb866af4854833992dfe8dd3f990f782add743a930012d3168a34b0ca765ef2ab4e470068ab13302ba4973c6bd9d2e9fba518ec41ebfd310ab9f21bf6c769c41c8b45b6ff3fd300df2ff8087c42fc91b9115e1910f089192eda200a2f58e1d6ff8f4f63a899838e0917d0b076af83131da73a62a0e0b77f09c9f039ae81639b318f3854299fdadcd73784dacea2257838ee8bf988dea7181040d11baf575eeb983b1302d68b004cba286e8bc80b7a9ddeb6d56bf155f3ab0cf18d1403e14ea037377e7f95b49f38b22cc657a053f3ad45fdc33b32457995024516142200f791d61578579daee3ac9d7918e282d4584c79631189af38dd9925f79c0cab0fba6ebe24d9df162434b70ad2137a3600ba01daa5551d07a2b1701010c130c299f8764c69c14cceb50fca46295b409e1cdc393533d034894182cd01907a72f435bf4e4cebccdb59e3faf40163a13314cfc1335315d194586a0541254fc915b805e6d2e141dc63cbab4c49eac4935a8b4cc9c77a431e3db4159d8025bca474bbb209dfe7566541abf6485f81d8be4663cd339d95a3b34d4f8a42d51a26894d6e65d9450ecab365b0b19ad44db4af7432a5b459ed2dcb119de74b6e15dda8c38011f120ffb6884ea329037b0bdb5a4a5004cb456daf9b32f5cd1c0f1e1048af2a49e9cf2303f59efba6e1abb882d112311ad2add10776ef94afd2e916fc3a8205ca02dce8cb27b10ba26bf0d1b04d03b71f03d5f434c8af51dbf77702efdb10b5dcd0809a6da828b0eab03eacfd1554d44a807ef2c5de63e4a5c398259cb476fdd0dd2c304c4ae01f6b7b2e10d9bd86eef4ffa4397c2cd4084778dd2ea6228a4f17fc8b341a34ee7ccfb240dd01e283396965ce2448d73fd5b8e5d203b307ee73583771b93e28e8f177c825af0f8f8b4f16e6df18e9d9d0e49e859621407fcb4cd07ab64145026fa670a9698c261ef0cb76b47c6ad6b008dac8c6f92098fd0b2ee74f50c009cecae4eda22a080c0c86986b84f86f03ac28e7d79283018922c535833ead6a1b16ea042ee0ecd1af9b126c4bba84e11b60377c5bbff5163c8940526855472f7c786a8694e003a00ffd1da1e16fbab04eee6fe2ec5a6d2bbfe13c5c2af082fdf2d1818bfb3cc9ddc604db743b13832b89bd65ac9bcaaa1f602034c07d2bc913276d1632a2e9dbfe2ac1beb5ba1b469d1fea029b8a2b8c1d574d523edd2a5bee0780530aaee255436c338c1cfc0454d903318e3a00f4c5101c9b501ed89bc8b2b92ff724ebc50e0d1c8767d9ee4d5e58d78d7239a7cdbc1afc710fa8ec879cab3203d51091b9541bc36087419a211ee32109b77e327dbd082a0c91f5bb3516abf4bdaa71a8648e100866004295a9e50a0ad4243b4583cc111d5b8098fa7dc34ca98f99997eb8004ec212e0f5d58f903f54082b3d072b682ce1b7d0d2cfb3cdc55213daaa780ea1150cd9042d5883a1137db6b7a0afcef826a9c2e694f20669cb53787de5addeeac7c8641b3d668e9cf4d31b504976b127210fb83d80051bdbcae80f5aa9030cbd616d8bbdbb0b7d9d2a7862e8917cb79b204d9301d418ca96fd93e218e7187618b2f0ec47821592b9c52b3eebecdfc80a1a5c28caa8b56f42a2ccfa30f6e290a64396796b6fed903ce630b57528e9348107f6e0a0a5a2958144078fe1185e9cfb8f4b4ad7bd74cdc2a3c05122e24ee66b24c6b5d84b0b671eb48d3a928692222210405af3b2d5156970cab5f8d642ff730fe04e3e88dab94466803aa0b28e2a539bda7bc023fdc83a485b526b6e5582452f5e99730a994763a792d0e2542333b7b79a47c1d8aeb3e035505168836d6e7c2ff1fcedfaf2583e33081894764a6e1619be587762d3b9c9699cd046e8ea0eef21dbd595fcd9c71df2f02bc72a29b43ad5dcbe598afb785bde612708c73228d70768a8f37ed1be14e7905a812b46c915728e188e8d3e895fe223279aa5c7336b23221735362e209e2889b68505f20c41d60e731fb48af1e6fdbe8fa1bcb5e69b269ae9866cde5b68f479671a68334e4571a02c0fd1520086f9860c0328ee41c42dd52ea913d72ae6126584d42b15c1a2a5100236df160157f7fd213b031bcee528a1b8c0bb475069a918cbefbcf2dbdac8676483b2471e8adae1132e5beeb3b6210b43f3abcf96caf95692b855cf0e5db4eab0145fa54fb83d30ecf48fb16c001873ca92de8bd0d2b09cfcf49b5b0d8b50c6f99309602d17fa3c809830fd468f1a49d67be412fe930c2011ed756ca6f5197be70a04dee1686a07bc30ec6cf57c2a877f667410839e6882ab38bda1b51a54be67771dc8c80e1a8d515a33cafe092822b78463c3965d7c773b303f990a802b1c63a303b781c579273bfba954383919ee9238aa15231a80d75570a62e3dd08e9423275b3748c554f1bdc73c86e6572006491e1aa8f09f9d65583e97536fc0d913317b1aee89f537946ac387a7e5c6227a860e26fe3cea6dfea1bfcf3195104eea752d05525093c23841703a6e26a0112651daaa1072b3373a87235d4e80558f8f89b503ddb0448abdc4ecea5b907f0a424151ec50f6e8c813f08e3f37b695c68a1da8a35037985994291f97d7e78312981efa8ae18e5097ef5a39ec20e278aa6e7bdb36a5fe9cfda8b8b21814b0082ed09628ae5ff87cd89c81c2718ad0d55d9b00fbf3f96f4643f9c6b4b863309d09c7f64e51f2e419c8f74ba5bca8b33184e788309c3e9bfdf357c9abdcfaf58624c58b0978639536e838e7b37329155f72ddfcbd169156d272aa9f26857de30419ec04071ff9d2c7f56adaf08865b3aa55cd9cbcfc3ce4d2f292b319578df3811eb8f283a49d00adf709afc2a3bd646158ccd8846fbe77a850a77ec62bc3c18d038cc76d62c7a40bcec980d14fd291e17950985299a6cb6fac49167464dd734a11f4553a8f202609a1edacd64b680c003b711561f0b680f9760bedf215f62dce1d2fd2105ffe428d6ea1697a4e78187121df225472a09d4253835a8cd3244f2508846c4a1b6c59153ed263edf250bf64dea18a214e6425edfe0303eb8a6a8ee714010d1bddf92de313c209d0577f1fa845229b2ad06aeac09b2e880e74a6d3d61c544f2710b9d8634a7b75d3914e857c218b6fb077a14dac3c6953e91ff9e47322dfd143da2656b32ff72a3e5f2577cc05bcc0728f1c6218629c14a1995c96ad20af3782e3f8f7350c23d8cd1f16163fdc499a83d6f338d3de6908ef4523c015197f334696777b71ac026ab03225e22a65ffa07440de66c5e12e89e7d896d8942b895e01dee383588084337dcc9186473074499e8a9b64b42c1dfaf56216cde7188af85aa7549c42d4737b867514e5c53b7709b21770c868a88b69bc19b3ec3912773dcd4c4f80865be517d7a71a3a84648669f0109efc47561cdfbae366b9911c5f16af4dd990a55a1e97776419804b6f0cf129aae0a65565d9a1672c4d454805569db0397b08aaeb1094dd0ca8527463f247630bd239e9133ef2ec6fd8e7a00dca0f10ebf122ee1c3854e242307c94a8d954359ed923c1e22c4f9447b6aa7306a4eadd067e8c2713d8626540b0dc09305e6e352f809614a29848d69e9413b42242cf4450c9ec9168d3b6cd4785399e52fcf07e996f3b3838476dc6a4f7f2542183edf2b088899927498bc653196bd4b885d737ad926351b58def91759b1f35186159f9a180ec1e55d681781cd1f9d2fa1da758dcf4ab70108db61c0bcf1ac319dd3d266693eac735b312ea2fefa6e83fefbc3d515d56d885bfe2af3d8e970f0015b6881b6b88c6b40dbcba8546600d3171dc1429c875c9ddd874dda1e4424325b443b47d88bdb2a43f0937e96052b971803041112a7b000431e585af9134be16f30d90412876d38329ac1166c222cc9ea68bb11eb73d6d736452c13010640a2ece76ac65f5545069390f93bedbb77ad3e24064ffead9b509a020fa1e6d58eb0e1eed845b788a17e7ecd5cf5cb49683154c6aaf61464ee494ea530d77d6867b0252bba60f34de96239d0be4db7ededbd8562cb5fc898e4c93c14c35f0e46934000000000000000000000000000000000000000000000000000000000000010cf90109b853f851a039fee3b1b52c4050fee3645ef3892dcf67dd49afe451d52da9628f78b30f93da80808080808080a0bfd2c2c6fdcb0e0addc8f03535632e4c26491b593ae1dcca799a189ea6f78f7e8080808080808080b8b2f8b030b8adf8ab83014b46808303d09094000077770000000000000000000000000000000180b844a0ca2d0800000000000000000000000000000000000000000000000000000000003148f63248d87b672dba6ba432253a0f0234f5a5651d75e62e4b01ef9bc38e216aa8bf830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a00a10a46dcd1ff9dcdf23a3b70ffbaaeed9017652f829a35fe91c796442c03e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebf901e8b853f851a00c1232913970f6ba64121513c54de53cec3b12062b1d763a60fd3159dc04b84180808080808080a0fe254438a68341820f132398f2ae2b48b5bad3ecc0796b53ac119791061da3c58080808080808080b90190f9018d30b90189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000100000000000000100000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a000000000000000000000000000000000000000000000000000000000003148f6a03248d87b672dba6ba432253a0f0234f5a5651d75e62e4b01ef9bc38e216aa8bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf8ab83014b46808303d09094000077770000000000000000000000000000000180b844a0ca2d0800000000000000000000000000000000000000000000000000000000003148f63248d87b672dba6ba432253a0f0234f5a5651d75e62e4b01ef9bc38e216aa8bf830518dba079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798a00a10a46dcd1ff9dcdf23a3b70ffbaaeed9017652f829a35fe91c796442c03e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189f901860183039445b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000100000000000000100000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f87cf87a940000777700000000000000000000000000000001f842a058313b60ec6c5bfc381e52f0de3ede0faac3cdffea26f7d6bcc3d09b61018691a000000000000000000000000000000000000000000000000000000000003148f6a03248d87b672dba6ba432253a0f0234f5a5651d75e62e4b01ef9bc38e216aa8bf0000000000000000000000000000000000000000000000', + maxFeePerGas: '0x3b9aca12', + maxPriorityFeePerGas: '0x3b9aca00', + nonce: '0xafad', + r: '0x4ff829fe4720ebe3a48ed0ef37da1586961d6791a210b6ea57410db3aa875c28', + s: '0x663e7092e6e93c97a9451f1354cc6e29b862563cb0155d0bd971811a628c1749', + to: '0xac9251ee97ed8bef31706354310c6b020c35d87b', + transactionIndex: '0x1c', + type: '0x2', + v: '0x0', + value: '0x0', + }, + { + accessList: [], + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: '0x3148fe', + chainId: '0xaa36a7', + from: '0x1e2cd78882b12d3954a049fd82ffd691565dc0a5', + gas: '0x5208', + gasPrice: '0x9', + hash: '0x31e1fd8c0516fba03ebaddf860ca4d16a63904e23b412ed7c2832c7906cf199b', + input: '0x', + maxFeePerGas: '0x9', + maxPriorityFeePerGas: '0x0', + nonce: '0xbecb', + r: '0x5c720720ae8fb9cd9a075e5dbbcf54b67cb4448db579a5cbb2518d1f24abaf74', + s: '0x7d52476bd7fbfeccd82b32f01280b304f02b44ec6f3e1be0f4692eca07cdb8e2', + to: '0x388ea662ef2c223ec0b047d41bf3c0f362142ad5', + transactionIndex: '0x1d', + type: '0x2', + v: '0x1', + value: '0x143c70de9f84c8', + }, + ], + transactionsRoot: '0xbd2f86bc39fbe1ac6e24ce390d268404c199da060116437803875d2c0bfe7970', + uncles: [], +}; + +export const sepoliaBlock = { + difficulty: '0x0', + extraData: '0x496c6c756d696e61746520446d6f63726174697a6520447374726962757465', + gasLimit: '0x1c9c380', + gasUsed: '0x4952f0', + hash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + logsBloom: + '0x0000000c0000000002000410a0101000080100004000001000000040200040020008800000800450001040004000000008004040008000000000000000a004000000400000002080008c020800006080010c22004000010100002001400008000082a040080211000c01010002000b00080000000800000004000010200100044020008008082100010008200805800001210000200000000004000004200000820800800000000010140040504400082404000300000000100080000000400000400002113000000000000040040008240000200000000110002011000001000018122010020000002400008000000008090810000002001000200800300000', + miner: '0x1e2cd78882b12d3954a049fd82ffd691565dc0a5', + mixHash: '0xddbb2beaede8c4a7c401156c0a02c58b3c0732e25bd5bfd350a599c54309929c', + nonce: '0x0', + number: '0x3148fe', + parentHash: '0x26b0438b6b537ec888afe7b673f633a0fdd3732c3629e1dee30e962a46444e9d', + receiptsRoot: '0x1ca1776ebf36ae37a1f48770684da37fe1c8fc134954b229b1f619e5e0ad2c51', + sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', + size: '0xd66e', + stateRoot: '0xc9e235dd0e663f36fee8f80d860961f2e8056f4cdcce501372a77bc1fed20534', + totalDifficulty: '0x3c656d23029ab0', + timestamp: '0x642d14c0', + baseFeePerGas: '0x9', + transactions: [ + '0x5d703f823e7e4d6719def234cf8683d0d34708c2b0ce0285f4b008bf555b0481', + '0xa8a6e1f58adfe40a059e037c6c2b6e07bd23aa3d32d892bfcc6f40d85f22c907', + '0xa4335f3948675d7cd43b84078e3567860b4e1ffa79e9f6e5278f1d3fc860699d', + '0x25553d98cc5c2758b653b122a461e08250a0613752258ff1ecbea813632f08ef', + '0x5b7ae021605d0fad23fd882d48762851858bf0b6188641d619481f5ea230c502', + '0x6ff0dbf6f27ac5bd4cedebca54424e4ddf5bc6db1aeba945c2d980e7d759e5c5', + '0x234db0c295cf5d70729dc85b36a3df18007c80e1e6c5dd3465f739be81b062c5', + '0x745ebf4cddbadb01df7eb32e393df6f712bad3d6f45d935151eb402fa2bee5d6', + '0x35607880ee334b3e5a2bfc419aa32d4ec2b87445a0c58b347c945265ffc8e57e', + '0xb3f527bc8306499630857a4d92578b2d492762e7828580af536ed10128953327', + '0x59b21c5451f4c6bbaef6758aa4ddac3d350ee9d6f7f79cbc8aea1e4d6d30f32a', + '0xe3708d5286b2a3fdb73db6b9409c70e121e65cd5896682f011e97b578906245c', + '0x738a0a811d13a8735bd7b5ea4b784a0dff23e6bfd2b1897303f731bb49ef19bb', + '0xd63d4edc0ca6567cea22cb342eda67d37bd4a5a5a36cb66e233f368a8f98c7cb', + '0xd383977c4ab373914a2199b5673eb43b1cb3c86a129c29a440b67b8ee491bad2', + '0x554c50ff5d6578a8ea4a352651106151d0d4b5fc683fc4071096463744b3013a', + '0x92d5693632cfc366be1a143bf63aef7b6307db1227e40d7806d1fb21e67137f7', + '0x72bb6a4add14cb640948ebd801898076372c86bf2eac41154f414738da1d1a32', + '0xc33480b85a113f779725fd2c1788ab95b066792a898ee0eebb0e98c8fa605989', + '0xa8685562865ab1e6c73816fad05a38d6ea0670565ef27add5f4bd16db852eb46', + '0x7cff5abea75fd389d37b08fa73f8d4ea6c2a00f36c715fda422c8d92f05aed78', + '0xd844bf22fcdd8fd5c472638540f114824082359ef753a4f9c929889226dec5f2', + '0xbafae79055a392cea650f90096a305d1338a170a66b58dacaf69a7feb2b3f187', + '0xc9f12beaeff3325c3b58c03f66f6526593432f623d2a873bd8ca7e9f9d3c48dc', + '0xc8314b15135d8629e2423065b853fe91d7909d7cc9450e9477e667ba84eb45a9', + '0xc96f60d36bee10caaf4b40ddc2c90e752d7d4abebdd29646efff6b8a6454d070', + '0x61f293e6fc8978ee7e4f8c47e678f44ab08bc475134952452422c9ed96ea0b65', + '0xd463fb86b29f6fe631756bf475c210bac81a596486947e1439f6e63cfed71e84', + '0xcc3a340e784872ba9dba17f268029e94ed3c7a49f44a4b8c7a4b8cfe7325b9c4', + '0x31e1fd8c0516fba03ebaddf860ca4d16a63904e23b412ed7c2832c7906cf199b', + ], + transactionsRoot: '0xbd2f86bc39fbe1ac6e24ce390d268404c199da060116437803875d2c0bfe7970', + uncles: [], +}; + +export const sepoliaBlockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + finalized: 'finalized'; + safe: 'safe'; + blockNumber: number; + blockHash: string; +} = { + earliest: 'earliest', + latest: 'latest', + pending: 'pending', + finalized: 'finalized', + safe: 'safe', + blockNumber: 3229950, + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', +}; + +export const sepoliaProof = { + accountProof: [ + '0xf90211a0bd15c5367fed7268b977d52e8e7aa9f961baaeb2bffb6d90c55cbe3b23c50867a074309ab894fa7cf4e291e0a61ec8e6add0c0b7698577dba557f91858743f7440a0135795d3fa69c75454cf6cacd210209f7c225ddfeefacafa1447330e82859e87a0f542e94a9320b7d615d95378262578df550f6a80a6217bc2f503088d4bf601d3a023e652402f5a6a44da6c71c3cd4a8b6f4c4a4f9451698b789cd4a7da37bb3196a0888fae0375d4cf0fe295979f015de598f2f7fb058d846c7fcd7fa8268e81163aa0eb060a257f3eee39a4579962233ea5cb521b3a1a9386005c9dbc3c9ce6174d28a0debaae98c52e95e669ac3b8d296a21c89193097a45fd4c4a0823ca55194a8d9ba0a86b400ecc676f1804ffa3ff941dbfaa6ccebe550c20209fe0665b6af927c3fba0eb9018f4d1782ea2adb33a473f710bc7d198aa882b8b0820fbf62f043c5dde5ea024c8e4ed90f41d7bdc598eba97abe9381da68f226453c89a136861f32a5bff26a0c7ce63cdedc4d07a451006586e16da4bb3c9e5d139af517ba1d278e4533efc90a0b16abc82bf81370bef07ee95a13d6a14d2188b0d8ad0696680e0b256bb2176f8a051ffa6ed1eff6147e636b0a8c49f1da1374d99942dfd4545ba857d879de5c629a06c32f72dda0421587d7c3b084f6c13c0dd6f35521fa23ef8e2bcf2d1f194e5d6a0f6f6120a27d4e3b14126d7f23e3f4542a5bf4f491f944dc151b3163472fb322b80', + '0xf90211a038929c628a18707795bb89a867c0b7495eaf95e40df84f4c6aedf8d5478ab59ea0a31f46c866a8a2dd599078744d9555a0a48f53b3529970cba5ef63fa6c4685a9a05d562bcb524148adac94e00e9f17756c426c53cd46fc31bf1ea467acd80413dda0614e03f044983248f1b19855ac7b38d4bb6bb34767ec8a60271bb5bc0c079171a0ffdaf1a1991f7fbbbebb23767a41c22117582260745b168c06ca7a4ff013591ba0ca57a67a4c02700c3cec0656710e2ca4728965b5cdcda8307b16db08b090a2d2a0a9f60bb268e9d96708dbb484e8a4ff1da76c6686691eac2c6481bc6e324f0536a03b20d5bed13d41810838c43581ed081d9a7c9d971c3e83476952a5d2fb60016aa07df274d27362ec672894d49ad82f521c1ab2d847cb0af304b8f7b1f6712e40d2a0d3b62b154087675f4523b66aa7859b2d73a55f6857a61383b85a4aa3888b027ea0f07c097aafb7b80cebdca5e31b17df8da434b1850c3a5d451ad0750a6359b1ffa08749e3e8a244fe9192d82b86478987cdb02496d121e1964fd8d41cf2fd94998aa03e170d58c142ff03585365200af853b786e9a44d72577aedbf6683b84625aefca085dcf138627c56661db6af1c4c7e44934d7f91a5d14ae6245320120dfa2aabfaa011cc33f31468451e493e4dd011ce880d60eabd6de4e2d00e489a0c4929f2a624a0a8334a9cd0b427828c2e9dfef0ff0047d5716358e4eea8195cf5780abd36333680', + '0xf90211a004a2e57b23ac28e0e6602053a68a67e3939a4b4679c1620ce59c638b4f7c58aca00384344638ceaeec259c4f6fb1f50a1993b56f93bcc10f074de47f3fecc78a25a03336ad1d963218b80d3a7ef692e74750d732b933491f377af2c9eb10bda9cc1aa0d70c044c14fd50d526bf3606cbfdf07f23d53a89f1e236aea1441b3ccffdba4ea0014fb6658cfb3c6a2f8c73213309017bec76ede238848061b7b6c8e6d34cd2fba0a8d1dcb19a8b0c79c25bf526d558e16c064f164a1c252620867c4a986d80805ea0fdd22438d97b4a42ed0d9210be8e1b00ab09d2e745c9a74880e0ac89265ebfd8a0dbdd2ae84eab9fbb4ad6782f8194edca15149a70c136a712e147a0e6c14b6025a0691f4ccc7ea60181f9a1fbb0c50d0fb8f87855f52725d99d51761800a8e1a898a0d4a1033a557673b58c44dd5d8933e3b9e6836073b62e81c51e393891e1c08406a084bc2853de7cb71cec627953a0244eb79715bcea8f98ba20c3172a91094e087ca046b189afc77399b676156153dcffdf015c9ed1e1e2de47964324f809f05f8028a083c10c2ffaab82d1bf06fcc2c688d9b2649eb2e7f6a2bcdf421871878ffbf0f3a0a784810c6a3b134e0efdb3673415ace91355301a85e4aacadb48c1bcdbed5b6ea0e8d8ea2dc934168667b82b7d0aa5ea98ff65827ddd5e6a1c7c79260c1b3772c0a0d74896fc22af6786c882135339c29b6247d0217fe1aec73b1e977a847558924d80', + '0xf90211a08d4d210a3e60087a4eb5f36727a3a56a9311278567c97d59fc50aa74f165bd8ba0d1a18b6ad21cd0f14238879fe57b6f09d14298a5928f6379ff80fd763459a4afa07bd9f101833e378d43e09fad08ce5509780f2ec57403598abe602b2a2af45ac0a093379828ca29052df58f45cd404e8b12c01c4ca26f86f1f923806bc06e72fd84a03392ad52fafa40ecf85d8847631bf161acf3431b3731af5e98fdf874d7647d37a00167dffc916786580e139b274b8b8b80c2e1a6db831777baf2b16296c05e5a58a0b6317e14b722a02c7e195028ac66b6ccd8cbd89914933ba30835b14c2c49cb65a0c959acdf92f6c065c1225bada0ef9b2b9ce4b59fa7647ae1c27c9a850742b8c8a0b20e9ed80d852af613897b6b44280d9ecadf531a089b917279e6128b0c010baaa02561c3d2cefe9e8b61f8603c89c9b0777ec90f97c79113c4e4a39140177429eca00de6d0d0b3871224e6a253b35b7da0f1b66d31fdb3a63ffeb9ce9d319f35700ba0828996f22bc8faa91b4290e70dc0a9a3084726049fd01084f737f7e1b9b888aca05305056bd62a34b39fe0a35dda9c4ded845a7ed1851b3f3b093e5e033d0c4aada0992d0e606f03e8ae4a4a7d2e1f0eda43768a25428fb925a3dd867b8a95b8ab17a07cd265da902a8955576d3efacdf91366c96866a6a0d552708baa98ed2ba977d9a0459eed6e81c723f98973c5eb34f2864bf893f0ca0b55c5392768956b17d7d95580', + '0xf901f1a058da106a0328d4a8fa604556b7f8a2b42996771251b58868d98b4ee9940b5a26a0cfd6ba241820c3367bbb70460455a3a7c0ab28cef4a12485d33e77882699e552a03dcef268450bb0cac9677fb51477e12944c1ec8d6e7d9c44ede32daa700de2dca0e7db3fa45aabf1d311be857d8b52fe3bd6406ce219bf694535071d6e2f734a8aa03a7fd296a5c7b18b5cf0ce2d400ff96c512aa89777a00daaa50c7e64b5728195a08c18b256d1caa08d692bdcdc4da7eb597dbd77908f3c6d704dded57b39d013bba0b95e5cb7469465246e4705e216a5244c56adac2c40ec49798e6771b48d26585480a0304cfc03edfb7f777c82331d3d34b4d8c77eafc9d6ba0a4a96347ebf83be4982a05edb92ab1d3707d6aee70be0f8f9271983c86d0b2a19ca490d3eed9b0e28f732a0d28b01f8c9eba67bde4dbaeab359f156e44598fae182bae9544979880ee034b6a00063032eced2cdb17d5b507b850dc45e2cfa9bf8a032011670b60ca80a2c2991a0315eaab728c1d381befe0ea772d95b8a0884f6076ae1865e970f410640cb2efca089e4aa4ec84ee7528ffede0f3d9e3d8b06f4ff39bbb4f717c7ec380ecff6546ba05f09cd4612d3eab1988a27dd387c5c8f97722a5108090f587af73fb70f9e71d6a003d3b1eec463fc3e82704b3abbc928d0a0ea17417c38d77d8f8d71f8d631d58480', + '0xf8709e37b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312ab84ff84d80891c2f286a1800abedffa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + ], + balance: BigInt('519906916634041511423'), + codeHash: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + nonce: BigInt(0), + storageHash: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + storageProof: [], +}; + +export const sepoliaTransactionFromBlock = { + blockHash: '0x241dab30227f58633e69fc4128b1c2b09699ec274cd575e39e697c1e460e5791', + blockNumber: BigInt(3229950), + chainId: BigInt(11155111), + from: '0xf0046e53d11c6e7a6badb4c9e849fcc26509dc16', + gas: BigInt(63000), + gasPrice: BigInt(3000000027), + hash: '0xa8a6e1f58adfe40a059e037c6c2b6e07bd23aa3d32d892bfcc6f40d85f22c907', + input: '0x', + nonce: BigInt(6714), + r: '0xa0f6ce97f49e3bd2e539430890ef4dddf2f3b1c4713b374234ed6ebceb80604b', + s: '0x33712ef7984df3ca434d854724b2b1d5be58012ccb39bd5f3a8b729a0c4d7931', + to: '0x83f3229e66fd1997961f76cbfb6e077f66ae1962', + transactionIndex: BigInt(1), + type: BigInt(0), + v: BigInt(22310258), + value: BigInt('1000000000000000000'), + data: '0x', +}; diff --git a/packages/web3/test/e2e/get_accounts.test.ts b/packages/web3/test/e2e/get_accounts.test.ts new file mode 100644 index 00000000000..c7bf588231e --- /dev/null +++ b/packages/web3/test/e2e/get_accounts.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; + +describe(`${getSystemTestBackend()} tests - getAccounts`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it('should get the accounts for the connected node', async () => { + const result = await web3.eth.getAccounts(); + expect(result).toBeInstanceOf(Array); + }); +}); diff --git a/packages/web3/test/e2e/get_balance.test.ts b/packages/web3/test/e2e/get_balance.test.ts new file mode 100644 index 00000000000..daba0c6397f --- /dev/null +++ b/packages/web3/test/e2e/get_balance.test.ts @@ -0,0 +1,113 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { isBigInt, isHexStrict, isString } from 'web3-validator'; +import { toHex } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../src'; +import { getSystemE2ETestProvider, getE2ETestAccountAddress } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { sepoliaBlockData } from './fixtures/sepolia'; +import { mainnetBlockData } from './fixtures/mainnet'; + +describe(`${getSystemTestBackend()} tests - getBalance`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + const expectedBalance = + getSystemTestBackend() === BACKEND.SEPOLIA ? '172530374997217200' : '2099795781954790368'; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + format: string; + }>({ + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + format: [FMT_NUMBER.BIGINT, FMT_NUMBER.HEX, FMT_NUMBER.STR], + }), + )('getBalance', async ({ block, format }) => { + const result = await web3.eth.getBalance(getE2ETestAccountAddress(), blockData[block], { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + + if (block === 'blockHash' || block === 'blockNumber') { + switch (format) { + case 'NUMBER_HEX': + /** + * @NOTE toHex assumes if a string is passed it's a hexadecimal + * which is why the number string, expectedBalance, is being + * converted to a BigInt + */ + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(toHex(BigInt(expectedBalance))); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(expectedBalance); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(BigInt(expectedBalance)); + break; + default: + throw new Error('Unhandled format'); + } + } else { + switch (format) { + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(isHexStrict(result)).toBeTruthy(); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(isString(result)).toBeTruthy(); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(isBigInt(result)).toBeTruthy(); + break; + default: + throw new Error('Unhandled format'); + } + } + }); +}); diff --git a/packages/web3/test/e2e/get_block.test.ts b/packages/web3/test/e2e/get_block.test.ts new file mode 100644 index 00000000000..bd9753992b6 --- /dev/null +++ b/packages/web3/test/e2e/get_block.test.ts @@ -0,0 +1,100 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { validator } from 'web3-validator'; +import { blockSchema } from 'web3-eth'; +import { Block, Transaction } from 'web3-types'; +import { format as formatter } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { sepoliaBlock, sepoliaBlockData, sepoliaBlockHydrated } from './fixtures/sepolia'; +import { mainnetBlockHydrated } from './fixtures/mainnet_block_hydrated'; +import { mainnetBlock, mainnetBlockData } from './fixtures/mainnet'; + +describe(`${getSystemTestBackend()} tests - getBlock`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + hydrated: boolean; + format: string; + }>({ + block: ['earliest', 'latest', 'safe', 'finalized', 'blockHash', 'blockNumber'], + hydrated: [true, false], + format: Object.values(FMT_NUMBER), + }), + )('getBlock', async ({ hydrated, block, format }) => { + const result = { + ...(await web3.eth.getBlock(blockData[block], hydrated, { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + })), + }; + let expectedBlock: Block = ((): Block => { + if (getSystemTestBackend() === BACKEND.SEPOLIA) { + return hydrated ? sepoliaBlockHydrated : sepoliaBlock; + } + + return hydrated ? mainnetBlockHydrated : mainnetBlock; + })(); + if (format !== FMT_NUMBER.HEX) + expectedBlock = formatter(blockSchema, result as unknown as Block, { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + + if (blockData[block] === 'pending') { + result.nonce = '0x0'; + result.miner = '0x0000000000000000000000000000000000000000'; + result.totalDifficulty = '0x0'; + } + + if (block === 'blockHash' || block === 'blockNumber') { + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toEqual(expectedBlock); + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(validator.validateJSONSchema(blockSchema, result)).toBeUndefined(); + + if (hydrated && result.transactions?.length > 0) { + // eslint-disable-next-line jest/no-conditional-expect + expect(result.transactions).toBeInstanceOf(Array); + } + } + }); +}); diff --git a/packages/web3/test/e2e/get_block_number.test.ts b/packages/web3/test/e2e/get_block_number.test.ts new file mode 100644 index 00000000000..f2aecabca2f --- /dev/null +++ b/packages/web3/test/e2e/get_block_number.test.ts @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { isBigInt, isHexStrict, isNumber, isString } from 'web3-validator'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - getBlockNumber`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + format: string; + }>({ + format: Object.values(FMT_NUMBER), + }), + )('getBlockNumber', async ({ format }) => { + const result = await web3.eth.getBlockNumber({ + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + + switch (format) { + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(isNumber(result)).toBeTruthy(); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(isHexStrict(result)).toBeTruthy(); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(isString(result)).toBeTruthy(); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(isBigInt(result)).toBeTruthy(); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/get_block_transaction_count.test.ts b/packages/web3/test/e2e/get_block_transaction_count.test.ts new file mode 100644 index 00000000000..ef65b08a2bb --- /dev/null +++ b/packages/web3/test/e2e/get_block_transaction_count.test.ts @@ -0,0 +1,115 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { isBigInt, isHexStrict, isNumber, isString } from 'web3-validator'; +import { toHex } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { sepoliaBlockData } from './fixtures/sepolia'; +import { mainnetBlockData } from './fixtures/mainnet'; + +describe(`${getSystemTestBackend()} tests - getBlockTransactionCount`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + const expectedTransactionCount = getSystemTestBackend() === BACKEND.SEPOLIA ? 30 : 196; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + format: string; + }>({ + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + format: Object.values(FMT_NUMBER), + }), + )('getBlockTransactionCount', async ({ block, format }) => { + const result = await web3.eth.getBlockTransactionCount(blockData[block], { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + + if (block === 'blockHash' || block === 'blockNumber') { + switch (format) { + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(expectedTransactionCount); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(toHex(expectedTransactionCount)); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(`${expectedTransactionCount}`); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(BigInt(expectedTransactionCount)); + break; + default: + throw new Error('Unhandled format'); + } + } else { + switch (format) { + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(isNumber(result)).toBeTruthy(); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(isHexStrict(result)).toBeTruthy(); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(isString(result)).toBeTruthy(); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(isBigInt(result)).toBeTruthy(); + break; + default: + throw new Error('Unhandled format'); + } + } + }); +}); diff --git a/packages/web3/test/e2e/get_block_uncle_count.test.ts b/packages/web3/test/e2e/get_block_uncle_count.test.ts new file mode 100644 index 00000000000..eb13f823585 --- /dev/null +++ b/packages/web3/test/e2e/get_block_uncle_count.test.ts @@ -0,0 +1,64 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, describeIf, BACKEND} from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { sepoliaBlockData } from './fixtures/sepolia'; +import { mainnetBlockData } from './fixtures/mainnet'; + +describeIf(getSystemTestBackend() !== 'hardhat')(`${getSystemTestBackend()} tests - getBlockUncleCount`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + // eslint-disable-next-line jest/consistent-test-it + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + }>({ + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + }), + )('getBlockUncleCount', async ({ block }) => { + const result = await web3.eth.getBlockUncleCount(blockData[block]); + + expect(result).toBe(BigInt(0)); + }); +}); diff --git a/packages/web3/test/e2e/get_chain_id.test.ts b/packages/web3/test/e2e/get_chain_id.test.ts new file mode 100644 index 00000000000..c58fe360c1b --- /dev/null +++ b/packages/web3/test/e2e/get_chain_id.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { toHex } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - getChainId`, () => { + const provider = getSystemE2ETestProvider(); + const expectedChainId = getSystemTestBackend() === BACKEND.SEPOLIA ? 11155111 : 1; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + format: string; + }>({ + format: Object.values(FMT_NUMBER), + }), + )('getChainId', async ({ format }) => { + const result = await web3.eth.getChainId({ + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + + switch (format) { + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(expectedChainId); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(toHex(expectedChainId)); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(`${expectedChainId}`); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(BigInt(expectedChainId)); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/get_fee_history.test.ts b/packages/web3/test/e2e/get_fee_history.test.ts new file mode 100644 index 00000000000..9097b310e90 --- /dev/null +++ b/packages/web3/test/e2e/get_fee_history.test.ts @@ -0,0 +1,84 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { feeHistorySchema } from 'web3-eth'; + +import Web3, { FMT_BYTES, FMT_NUMBER, Numbers } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - estimateGas`, () => { + const provider = getSystemE2ETestProvider(); + const blockData: { + earliest: 'earliest'; + latest: 'latest'; + pending: 'pending'; + finalized: 'finalized'; + safe: 'safe'; + blockNumber: number; + blockHash: string; + } = { + earliest: 'earliest', + latest: 'latest', + pending: 'pending', + finalized: 'finalized', + safe: 'safe', + blockNumber: getSystemTestBackend() === 'sepolia' ? 3240768 : 17029884, + blockHash: + getSystemTestBackend() === 'sepolia' + ? '0xe5e66eab79bf9236eface52c33ecdbad381069e533dc70e3f54e2f7727b5f6ca' + : '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + }; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + blockCount: Numbers; + newestBlock: 'earliest' | 'latest' | 'pending' | 'finalized' | 'safe' | 'blockNumber'; + rewardPercentiles: Numbers[]; + format: string; + }>({ + blockCount: [1, '2', 3, BigInt(4)], + newestBlock: ['earliest', 'latest', 'pending', 'safe', 'finalized', 'blockNumber'], + rewardPercentiles: [['0xa', '20', 30, BigInt(40)]], + format: Object.values(FMT_NUMBER), + }), + )('getFeeHistory', async ({ blockCount, newestBlock, rewardPercentiles, format }) => { + const result = await web3.eth.getFeeHistory( + blockCount, + blockData[newestBlock], + rewardPercentiles, + { + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }, + ); + + const resultKeys = Object.keys(result); + const schemaProperties = Object.keys(feeHistorySchema.properties); + resultKeys.forEach(prop => expect(schemaProperties).toContain(prop)); + }); +}); diff --git a/packages/web3/test/e2e/get_gas_price.test.ts b/packages/web3/test/e2e/get_gas_price.test.ts new file mode 100644 index 00000000000..8bbb9e856ff --- /dev/null +++ b/packages/web3/test/e2e/get_gas_price.test.ts @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { isBigInt, isHexStrict, isNumber, isString } from 'web3-validator'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - getGasPrice`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + format: string; + }>({ + format: Object.values(FMT_NUMBER), + }), + )('getGasPrice', async ({ format }) => { + const result = await web3.eth.getGasPrice({ + number: format as FMT_NUMBER, + bytes: FMT_BYTES.HEX, + }); + + switch (format) { + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(isNumber(result)).toBeTruthy(); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(isHexStrict(result)).toBeTruthy(); + break; + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(isString(result)).toBeTruthy(); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(isBigInt(result)).toBeTruthy(); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/get_id.test.ts b/packages/web3/test/e2e/get_id.test.ts new file mode 100644 index 00000000000..191c355340b --- /dev/null +++ b/packages/web3/test/e2e/get_id.test.ts @@ -0,0 +1,39 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; + +describe(`${getSystemTestBackend()} tests - getId`, () => { + const provider = getSystemE2ETestProvider(); + const expectedChainId = getSystemTestBackend() === BACKEND.SEPOLIA ? BigInt(11155111) : BigInt(1); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it('should get the network id for the connected node', async () => { + const result = await web3.eth.net.getId(); + expect(result).toBe(expectedChainId); + }); +}); diff --git a/packages/web3/test/e2e/get_peer_count.test.ts b/packages/web3/test/e2e/get_peer_count.test.ts new file mode 100644 index 00000000000..f5803eaa91e --- /dev/null +++ b/packages/web3/test/e2e/get_peer_count.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; + +describe(`${getSystemTestBackend()} tests - getPeerCount`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it('should get the peer count for the connected node', async () => { + const result = await web3.eth.net.getPeerCount(); + expect(typeof result).toBe('bigint'); + }); +}); diff --git a/packages/web3/test/e2e/get_proof.test.ts b/packages/web3/test/e2e/get_proof.test.ts new file mode 100644 index 00000000000..711abf0fac3 --- /dev/null +++ b/packages/web3/test/e2e/get_proof.test.ts @@ -0,0 +1,92 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable jest/no-conditional-expect */ + +import Web3, { AccountObject } from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { mainnetBlockData, mainnetProof } from './fixtures/mainnet'; +import { sepoliaBlockData, sepoliaProof } from './fixtures/sepolia'; + +describe(`${getSystemTestBackend()} tests - getProof`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + const expectedProof = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaProof : mainnetProof; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + }>({ + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + }), + )('getProof', async ({ block }) => { + const result = await web3.eth.getProof( + '0x0000000000000000000000000000000000000000', + [], + blockData[block], + ); + + if (block === 'blockHash' || block === 'blockNumber') { + expect(result).toEqual(expectedProof); + } + else if(block === 'pending') { + expect(result).toMatchObject({ + balance: expect.any(BigInt), + codeHash: expect.any(String), + nonce: expect.any(BigInt), + storageHash: expect.any(String), + storageProof: expect.any(Array), + }); + } + else { + expect(result).toMatchObject({ + accountProof: expect.any(Array), + balance: expect.any(BigInt), + codeHash: expect.any(String), + nonce: expect.any(BigInt), + storageHash: expect.any(String), + storageProof: expect.any(Array), + }); + } + }); +}); diff --git a/packages/web3/test/e2e/get_protocol_version.test.ts b/packages/web3/test/e2e/get_protocol_version.test.ts new file mode 100644 index 00000000000..49da2e4550b --- /dev/null +++ b/packages/web3/test/e2e/get_protocol_version.test.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { isHexStrict } from 'web3-validator'; + +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; + +describe(`${getSystemTestBackend()} tests - getProtocolVersion`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it('should get the protocol version for the connected node', async () => { + const result = await web3.eth.getProtocolVersion(); + expect(isHexStrict(result)).toBeTruthy(); + }); +}); diff --git a/packages/web3/test/e2e/get_transaction_count.test.ts b/packages/web3/test/e2e/get_transaction_count.test.ts new file mode 100644 index 00000000000..7f679ca32c4 --- /dev/null +++ b/packages/web3/test/e2e/get_transaction_count.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../src'; +import { getSystemE2ETestProvider, getE2ETestAccountAddress } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { sepoliaBlockData } from './fixtures/sepolia'; +import { mainnetBlockData } from './fixtures/mainnet'; + +describe(`${getSystemTestBackend()} tests - getTransactionCount`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + }>({ + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + }), + )('getTransactionCount', async ({ block }) => { + const result = await web3.eth.getTransactionCount( + getE2ETestAccountAddress(), + blockData[block], + ); + + if (block === 'blockHash' || block === 'blockNumber') { + const expectedTxCount = getSystemTestBackend() === BACKEND.SEPOLIA ? BigInt(1) : BigInt(11); + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(expectedTxCount); + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(typeof result).toBe('bigint'); + } + }); +}); diff --git a/packages/web3/test/e2e/get_transaction_from_block.test.ts b/packages/web3/test/e2e/get_transaction_from_block.test.ts new file mode 100644 index 00000000000..20fd48b5f4e --- /dev/null +++ b/packages/web3/test/e2e/get_transaction_from_block.test.ts @@ -0,0 +1,103 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable jest/no-conditional-expect */ + +import { Numbers, TransactionInfo } from 'web3-types'; + +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { sepoliaBlockData, sepoliaTransactionFromBlock } from './fixtures/sepolia'; +import { mainnetBlockData, mainnetTransactionFromBlock } from './fixtures/mainnet'; + +describe(`${getSystemTestBackend()} tests - getTransactionFromBlock`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + transactionIndex: Numbers; + format: string; + }>({ + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + transactionIndex: ['0x1', '1', 1, BigInt(1)], + }), + )('getTransactionFromBlock', async ({ block, transactionIndex }) => { + const result = await web3.eth.getTransactionFromBlock(blockData[block], transactionIndex); + + if (blockData[block] === 'earliest') { + // eslint-disable-next-line no-null/no-null + expect(result).toBeNull(); + } else if (block === 'blockHash' || block === 'blockNumber') { + const expectedTransaction = + getSystemTestBackend() === BACKEND.SEPOLIA + ? sepoliaTransactionFromBlock + : mainnetTransactionFromBlock; + expect(result).toStrictEqual(expectedTransaction); + } else { + expect(result).toMatchObject({ + hash: expect.any(String), + nonce: expect.any(BigInt), + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + transactionIndex: expect.any(BigInt), + from: expect.any(String), + gasPrice: expect.any(BigInt), + gas: expect.any(BigInt), + input: expect.any(String), + type: expect.any(BigInt), + v: expect.any(BigInt), + s: expect.any(String), + r: expect.any(String), + // TODO These values are included when fetching the transaction from + // Nethermind, but not Infura + // https://github.com/web3/web3.js/issues/5997 + // data: '0x608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a36104dc806100de6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80632e64cec1146100515780636057361d1461006f578063893d20e81461008b578063a6f9dae1146100a9575b600080fd5b6100596100c5565b60405161006691906102fb565b60405180910390f35b61008960048036038101906100849190610347565b6100ce565b005b610093610168565b6040516100a091906103b5565b60405180910390f35b6100c360048036038101906100be91906103fc565b610192565b005b60008054905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461015e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015590610486565b60405180910390fd5b8060008190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021990610486565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000819050919050565b6102f5816102e2565b82525050565b600060208201905061031060008301846102ec565b92915050565b600080fd5b610324816102e2565b811461032f57600080fd5b50565b6000813590506103418161031b565b92915050565b60006020828403121561035d5761035c610316565b5b600061036b84828501610332565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061039f82610374565b9050919050565b6103af81610394565b82525050565b60006020820190506103ca60008301846103a6565b92915050565b6103d981610394565b81146103e457600080fd5b50565b6000813590506103f6816103d0565b92915050565b60006020828403121561041257610411610316565b5b6000610420848285016103e7565b91505092915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000610470601383610429565b915061047b8261043a565b602082019050919050565b6000602082019050818103600083015261049f81610463565b905091905056fea26469706673582212201fcfa803d5c15c78e1e356cc1946c1bf14f9809acd349df1fd41362fa1a9e4d564736f6c63430008120033', + // to: null, + // value: '0x0', + // yParity: '0x0' + }); + } + }); +}); diff --git a/packages/web3/test/e2e/get_uncle.test.ts b/packages/web3/test/e2e/get_uncle.test.ts new file mode 100644 index 00000000000..586026b82a7 --- /dev/null +++ b/packages/web3/test/e2e/get_uncle.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Numbers } from 'web3-types'; + +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend, BACKEND } from '../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../shared_fixtures/utils'; +import { mainnetBlockData } from './fixtures/mainnet'; +import { sepoliaBlockData } from './fixtures/sepolia'; + +describe(`${getSystemTestBackend()} tests - getUncle`, () => { + const provider = getSystemE2ETestProvider(); + const blockData = getSystemTestBackend() === BACKEND.SEPOLIA ? sepoliaBlockData : mainnetBlockData; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + uncleIndex: Numbers; + }>({ + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + uncleIndex: ['0x1', '1', 1, BigInt(1)], + }), + )('getUncle', async ({ block, uncleIndex }) => { + // TODO Returns Position Index is incorrect RPC error + // when the client is Nethermind, but not Geth + const result = await web3.eth.getUncle(blockData[block], uncleIndex); + + // eslint-disable-next-line no-null/no-null + expect(result).toBeNull(); + }); +}); diff --git a/packages/web3/test/e2e/is_listening.test.ts b/packages/web3/test/e2e/is_listening.test.ts new file mode 100644 index 00000000000..0686291f327 --- /dev/null +++ b/packages/web3/test/e2e/is_listening.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; + +describe(`${getSystemTestBackend()} tests - isListening`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it('should get the listening status for the connected node', async () => { + const result = await web3.eth.net.isListening(); + expect(typeof result).toBe('boolean'); + }); +}); diff --git a/packages/web3/test/e2e/is_syncing.test.ts b/packages/web3/test/e2e/is_syncing.test.ts new file mode 100644 index 00000000000..c58dc8c1c47 --- /dev/null +++ b/packages/web3/test/e2e/is_syncing.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; + +describe(`${getSystemTestBackend()} tests - isSyncing`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it('should get the syncing status for the connected node', async () => { + const result = await web3.eth.isSyncing(); + expect(typeof result).toBe('boolean'); + }); +}); diff --git a/packages/web3/test/e2e/jest.config.js b/packages/web3/test/e2e/jest.config.js new file mode 100644 index 00000000000..cc3c69f72ff --- /dev/null +++ b/packages/web3/test/e2e/jest.config.js @@ -0,0 +1,36 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/e2e/setup.js'], + testMatch: [ + `/test/e2e/*.(spec|test).(js|ts)`, + `/test/e2e/${process.env.WEB3_SYSTEM_TEST_BACKEND}/**/*.(spec|test).(js|ts)`, + ], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: `.coverage/e2e/${process.env.WEB3_SYSTEM_TEST_BACKEND}`, +}; diff --git a/packages/web3/test/e2e/mainnet/call.test.ts b/packages/web3/test/e2e/mainnet/call.test.ts new file mode 100644 index 00000000000..45778deb761 --- /dev/null +++ b/packages/web3/test/e2e/mainnet/call.test.ts @@ -0,0 +1,71 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { bytesToHex } from 'web3-utils'; +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; + +describe(`${getSystemTestBackend()} tests - call`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + format: string; + }>({ + format: Object.values(FMT_BYTES), + }), + )('should call retrieve method from deployed contract', async ({ format }) => { + const result = await web3.eth.call( + { + to: getE2ETestContractAddress(), + input: '0x18160ddd', + }, + undefined, + { + number: FMT_NUMBER.HEX, + bytes: format as FMT_BYTES, + }, + ); + + switch (format) { + case 'BYTES_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toMatch(/0[xX][0-9a-fA-F]{64}/i); + break; + case 'BYTES_UINT8ARRAY': + // eslint-disable-next-line jest/no-conditional-expect + expect(bytesToHex(result)).toMatch(/0[xX][0-9a-fA-F]{64}/i); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/mainnet/get_code.test.ts b/packages/web3/test/e2e/mainnet/get_code.test.ts new file mode 100644 index 00000000000..0bcb6026510 --- /dev/null +++ b/packages/web3/test/e2e/mainnet/get_code.test.ts @@ -0,0 +1,83 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; +import { mainnetCode } from '../fixtures/mainnet'; + +describe(`${getSystemTestBackend()} tests - getCode`, () => { + const provider = getSystemE2ETestProvider(); + const blockData: { + latest: 'latest'; + pending: 'pending'; + finalized: 'finalized'; + safe: 'safe'; + blockNumber: number; + blockHash: string; + } = { + latest: 'latest', + pending: 'pending', + finalized: 'finalized', + safe: 'safe', + blockNumber: 17029884, + blockHash: '0x2850e4a813762b2de589fa5268eacb92572defaf9520608deb129699e504cab2', + }; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: 'latest' | 'pending' | 'finalized' | 'safe' | 'blockHash' | 'blockNumber'; + format: string; + }>({ + block: ['latest', 'pending', 'safe', 'finalized', 'blockHash', 'blockNumber'], + format: Object.values(FMT_BYTES), + }), + )('should getCode for deployed contract', async ({ block, format }) => { + const result = await web3.eth.getCode(getE2ETestContractAddress(), blockData[block], { + number: FMT_NUMBER.HEX, + bytes: format as FMT_BYTES, + }); + + switch (format) { + case 'BYTES_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(mainnetCode); + break; + case 'BYTES_UINT8ARRAY': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toStrictEqual(new Uint8Array(hexToBytes(mainnetCode))); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/mainnet/get_past_logs.test.ts b/packages/web3/test/e2e/mainnet/get_past_logs.test.ts new file mode 100644 index 00000000000..33fdaef06ee --- /dev/null +++ b/packages/web3/test/e2e/mainnet/get_past_logs.test.ts @@ -0,0 +1,160 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +import { hexToBytes, numberToHex, hexToNumber } from 'web3-utils'; +import { Log } from 'web3-types'; +import Web3, { FMT_BYTES, FMT_NUMBER, LogAPI } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; + +describe(`${getSystemTestBackend()} tests - getPastLogs`, () => { + const provider = getSystemE2ETestProvider(); + const expectedLog: LogAPI = { + address: getE2ETestContractAddress(), + blockHash: '0x89515ecc5eda6f038ce612fd7a285dc81ad0fc3cec1a1c2d2166565ac99d48db', + blockNumber: '0x103dc29', + data: '0x0000000000000000000000000000000000000000000000000000000146ee7540', + logIndex: '0x63', + removed: false, + topics: [ + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + '0x000000000000000000000000b840fe2b3fd8f75275240c671d6ec659e4c9a500', + '0x000000000000000000000000780a2d8ed56eede2f9d9b4dfd6fd3101ac20cab8', + ], + transactionHash: '0x4284538004b3a8478835861d4354a33dba37a6daedcb692523478e5f9e7d8520', + transactionIndex: '0xc', + }; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + byteFormat: string; + numberFormat: string; + }>({ + byteFormat: Object.values(FMT_BYTES), + numberFormat: Object.values(FMT_NUMBER), + }), + )('should getPastLogs for deployed contract', async ({ byteFormat, numberFormat }) => { + const result = ( + await web3.eth.getPastLogs( + { + fromBlock: '0x103dc29', + toBlock: '0x103dc30', + address: getE2ETestContractAddress(), + }, + { + number: numberFormat as FMT_NUMBER, + bytes: byteFormat as FMT_BYTES, + }, + ) + )[0] as unknown as Log; + + switch (numberFormat) { + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(result.blockNumber).toBe( + hexToNumber(expectedLog.blockNumber as string).toString(), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.logIndex).toBe( + hexToNumber(expectedLog.logIndex as string).toString(), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.transactionIndex).toBe( + hexToNumber(expectedLog.transactionIndex as string).toString(), + ); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.blockNumber).toBe(BigInt(expectedLog.blockNumber as string)); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.logIndex).toBe(BigInt(expectedLog.logIndex as string)); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.transactionIndex).toBe( + BigInt(expectedLog.transactionIndex as string), + ); + break; + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.blockNumber).toBe(hexToNumber(expectedLog.blockNumber as string)); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.logIndex).toBe(hexToNumber(expectedLog.logIndex as string)); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.transactionIndex).toBe( + hexToNumber(expectedLog.transactionIndex as string), + ); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.blockNumber).toBe(numberToHex(expectedLog.blockNumber as string)); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.logIndex).toBe(numberToHex(expectedLog.logIndex as string)); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.transactionIndex).toBe( + numberToHex(expectedLog.transactionIndex as string), + ); + break; + default: + throw new Error('Unhandled format'); + } + switch (byteFormat) { + case 'BYTES_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result.blockHash).toBe(expectedLog.blockHash as string); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.data).toBe(expectedLog.data as string); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.transactionHash).toBe(expectedLog.transactionHash as string); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.topics).toStrictEqual(expectedLog.topics); + break; + case 'BYTES_UINT8ARRAY': + // eslint-disable-next-line jest/no-conditional-expect + expect(result.blockHash).toStrictEqual( + new Uint8Array(hexToBytes(expectedLog.blockHash as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.data).toStrictEqual( + new Uint8Array(hexToBytes(expectedLog.data as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.transactionHash).toStrictEqual( + new Uint8Array(hexToBytes(expectedLog.transactionHash as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.topics).toStrictEqual( + expectedLog.topics?.map((topic: string) => new Uint8Array(hexToBytes(topic))), + ); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/mainnet/get_storage_at.test.ts b/packages/web3/test/e2e/mainnet/get_storage_at.test.ts new file mode 100644 index 00000000000..05512d99ec4 --- /dev/null +++ b/packages/web3/test/e2e/mainnet/get_storage_at.test.ts @@ -0,0 +1,82 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3, { Numbers } from '../../../src'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { mainnetBlockData } from '../fixtures/mainnet'; + +describe(`${getSystemTestBackend()} tests - getStorageAt`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + storageSlot: Numbers; + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + }>({ + storageSlot: ['0x1', '1', 1, BigInt(1)], + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + }), + )('getStorageAt', async ({ storageSlot, block }) => { + const result = await web3.eth.getStorageAt( + getE2ETestContractAddress(), + storageSlot, + mainnetBlockData[block], + ); + + if (mainnetBlockData[block] === 'earliest') { + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toMatch(/0[xX][0-9a-fA-F]{64}/i); + } else if (block === 'blockHash' || block === 'blockNumber') { + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe( + '0x000000000000000000000000000000000000000000000000007d5a864f06b2d5', + ); + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toMatch(/0[xX][0-9a-fA-F]{64}/i); + } + }); +}); diff --git a/packages/web3/test/e2e/mainnet/get_transaction.test.ts b/packages/web3/test/e2e/mainnet/get_transaction.test.ts new file mode 100644 index 00000000000..294ddb00219 --- /dev/null +++ b/packages/web3/test/e2e/mainnet/get_transaction.test.ts @@ -0,0 +1,88 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, TransactionInfo } from 'web3-types'; +import { bytesToUint8Array, hexToBytes } from 'web3-utils'; + +import Web3 from '../../../src'; +import { getSystemE2ETestProvider } from '../e2e_utils'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - getTransaction`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + transactionHash: Bytes; + }>({ + transactionHash: [ + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + bytesToUint8Array( + hexToBytes( + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + ), + ), + new Uint8Array( + hexToBytes( + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + ), + ), + ], + }), + )('getTransaction', async ({ transactionHash }) => { + const result = await web3.eth.getTransaction(transactionHash); + + expect(result).toMatchObject({ + hash: '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + nonce: BigInt(2264), + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + transactionIndex: BigInt(91), + from: '0xd67da12dc33d9730d9341bbfa4f0b67d0688b28b', + gasPrice: BigInt(19330338402), + maxPriorityFeePerGas: BigInt(100000000), + maxFeePerGas: BigInt(26848942133), + gas: BigInt(300858), + input: '0x6d78f47a000000000000000000000000a6e265667e1e18c28f2b5dc529f775c5f0d56d4a000000000000000000000000000000000000000000000001a055690d9db80000000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + chainId: BigInt(1), + type: BigInt('0x2'), + v: BigInt('0x0'), + s: '0x72ca073bc16b35b3191b35fd8fb0eebdd536675ecb8459b110fcad2890a98ec9', + r: '0x45496fc11c7bf9972cb732bdc579f5d9d01e4df276dd49626e75fc3b5f8b6ec4', + // TODO These values are included when fetching the transaction from + // Nethermind, but not Infura + // https://github.com/web3/web3.js/issues/5997 + // data: '0x608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a36104dc806100de6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80632e64cec1146100515780636057361d1461006f578063893d20e81461008b578063a6f9dae1146100a9575b600080fd5b6100596100c5565b60405161006691906102fb565b60405180910390f35b61008960048036038101906100849190610347565b6100ce565b005b610093610168565b6040516100a091906103b5565b60405180910390f35b6100c360048036038101906100be91906103fc565b610192565b005b60008054905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461015e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015590610486565b60405180910390fd5b8060008190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021990610486565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000819050919050565b6102f5816102e2565b82525050565b600060208201905061031060008301846102ec565b92915050565b600080fd5b610324816102e2565b811461032f57600080fd5b50565b6000813590506103418161031b565b92915050565b60006020828403121561035d5761035c610316565b5b600061036b84828501610332565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061039f82610374565b9050919050565b6103af81610394565b82525050565b60006020820190506103ca60008301846103a6565b92915050565b6103d981610394565b81146103e457600080fd5b50565b6000813590506103f6816103d0565b92915050565b60006020828403121561041257610411610316565b5b6000610420848285016103e7565b91505092915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000610470601383610429565b915061047b8261043a565b602082019050919050565b6000602082019050818103600083015261049f81610463565b905091905056fea26469706673582212201fcfa803d5c15c78e1e356cc1946c1bf14f9809acd349df1fd41362fa1a9e4d564736f6c63430008120033', + // to: null, + // value: '0x0', + // yParity: '0x0' + }); + }); +}); diff --git a/packages/web3/test/e2e/mainnet/get_transaction_receipt.test.ts b/packages/web3/test/e2e/mainnet/get_transaction_receipt.test.ts new file mode 100644 index 00000000000..7c1ad00fcbb --- /dev/null +++ b/packages/web3/test/e2e/mainnet/get_transaction_receipt.test.ts @@ -0,0 +1,175 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes } from 'web3-types'; +import { bytesToUint8Array, hexToBytes } from 'web3-utils'; + +import Web3 from '../../../src'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - getTransactionReceipt`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + transactionHash: Bytes; + }>({ + transactionHash: [ + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + bytesToUint8Array( + hexToBytes( + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + ), + ), + new Uint8Array( + hexToBytes( + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + ), + ), + ], + }), + )('getTransactionReceipt', async ({ transactionHash }) => { + const result = await web3.eth.getTransactionReceipt(transactionHash); + + expect(result).toMatchObject({ + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + // contractAddress: '0xedfd52255571b4a9a9d4445989e39f5c14ff0447', + cumulativeGasUsed: BigInt(9010200), + effectiveGasPrice: BigInt(19330338402), + from: '0xd67da12dc33d9730d9341bbfa4f0b67d0688b28b', + gasUsed: BigInt(245737), + logs: [ + { + address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + data: '0x0000000000000000000000000000000000000000000000000000000000668442', + logIndex: BigInt(200), + removed: false, + topics: [ + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + '0x000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + '0x000000000000000000000000a6e265667e1e18c28f2b5dc529f775c5f0d56d4a', + ], + transactionHash: + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + transactionIndex: BigInt(91), + }, + { + address: getE2ETestContractAddress(), + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + data: '0x0000000000000000000000000000000000000000000000000000000000015bb2', + logIndex: BigInt(201), + removed: false, + topics: [ + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + '0x000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + '0x000000000000000000000000a6e265667e1e18c28f2b5dc529f775c5f0d56d4a', + ], + transactionHash: + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + transactionIndex: BigInt(91), + }, + { + address: '0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef', + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + data: '0x00000000000000000000000000000000000000003fff92b9d57d1d7fca09d7dc', + logIndex: BigInt(202), + removed: false, + topics: [ + '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925', + '0x000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + '0x00000000000000000000000069a592d2129415a4a1d1b1e309c17051b7f28d57', + ], + transactionHash: + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + transactionIndex: BigInt(91), + }, + { + address: '0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef', + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + data: '0x000000000000000000000000000000000000000000006d462a82e28035f62824', + logIndex: BigInt(203), + removed: false, + topics: [ + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + '0x000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + '0x000000000000000000000000a6e265667e1e18c28f2b5dc529f775c5f0d56d4a', + ], + transactionHash: + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + transactionIndex: BigInt(91), + }, + { + address: '0xa6e265667e1e18c28f2b5dc529f775c5f0d56d4a', + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + data: '0x000000000000000000000000000000000000000000000001a055690d9db80000', + logIndex: BigInt(204), + removed: false, + topics: [ + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', + '0x0000000000000000000000000000000000000000000000000000000000000000', + '0x000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + ], + transactionHash: + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + transactionIndex: BigInt(91), + }, + { + address: '0x69a592d2129415a4a1d1b1e309c17051b7f28d57', + blockHash: '0xabc81c29235c7962f5a0420644761627bdc064a560c7d1842cdf9517f7d7984e', + blockNumber: BigInt(17030310), + data: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a055690d9db8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + logIndex: BigInt(205), + removed: false, + topics: [ + '0x1abc43bc3dd8b6c8bb9bcf1a14a84f83981bf5335700ef07758efefcb03a8c75', + '0x000000000000000000000000a6e265667e1e18c28f2b5dc529f775c5f0d56d4a', + '0x000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + '0x000000000000000000000000d67da12dc33d9730d9341bbfa4f0b67d0688b28b', + ], + transactionHash: + '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + transactionIndex: BigInt(91), + }, + ], + status: BigInt(1), + transactionHash: '0x9a968248400868beb931ed96ee37517275794ff44e8d968c29f0f3430a504594', + transactionIndex: BigInt(91), + type: BigInt(2), + }); + }); +}); diff --git a/packages/web3/test/e2e/sepolia/call.test.ts b/packages/web3/test/e2e/sepolia/call.test.ts new file mode 100644 index 00000000000..33a3f7db398 --- /dev/null +++ b/packages/web3/test/e2e/sepolia/call.test.ts @@ -0,0 +1,120 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { + getSystemE2ETestProvider, + getE2ETestAccountAddress, + getE2ETestContractAddress, +} from '../e2e_utils'; + +describe(`${getSystemTestBackend()} tests - call`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + format: string; + }>({ + format: Object.values(FMT_BYTES), + }), + )('should call retrieve method from deployed contract', async ({ format }) => { + const result = await web3.eth.call( + { + to: getE2ETestContractAddress(), + input: '0x2e64cec1', + }, + undefined, + { + number: FMT_NUMBER.HEX, + bytes: format as FMT_BYTES, + }, + ); + + switch (format) { + case 'BYTES_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe( + '0x0000000000000000000000000000000000000000000000000000000000000000', + ); + break; + case 'BYTES_UINT8ARRAY': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toStrictEqual( + new Uint8Array( + hexToBytes( + '0x0000000000000000000000000000000000000000000000000000000000000000', + ), + ), + ); + break; + default: + throw new Error('Unhandled format'); + } + }); + + it.each( + toAllVariants<{ + format: string; + }>({ + format: Object.values(FMT_BYTES), + }), + )('should call getOwner method from deployed contract', async ({ format }) => { + const expectedResult = `0x000000000000000000000000${getE2ETestAccountAddress() + .substring(2) + .toLowerCase()}`; + const result = await web3.eth.call( + { + to: getE2ETestContractAddress(), + input: '0x893d20e8', + }, + undefined, + { + number: FMT_NUMBER.HEX, + bytes: format as FMT_BYTES, + }, + ); + + switch (format) { + case 'BYTES_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(expectedResult); + break; + case 'BYTES_UINT8ARRAY': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toStrictEqual(new Uint8Array(hexToBytes(expectedResult))); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/sepolia/contract.test.ts b/packages/web3/test/e2e/sepolia/contract.test.ts new file mode 100644 index 00000000000..cc1917a28c7 --- /dev/null +++ b/packages/web3/test/e2e/sepolia/contract.test.ts @@ -0,0 +1,161 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, + itIf, +} from '../../shared_fixtures/system_tests_utils'; +import { GreeterAbi, GreeterBytecode } from '../../shared_fixtures/build/Greeter'; +import { + getAllowedSendTransaction, + getE2ETestAccountAddress, + getE2ETestAccountPrivateKey, + getSystemE2ETestProvider, +} from '../e2e_utils'; + +describe(`${getSystemTestBackend()} tests - contract`, () => { + const provider = getSystemE2ETestProvider(); + const initialGreet = 'Soylent green is people'; + + let web3: Web3; + let deployedContractAddress: string; + + beforeAll(() => { + if (getAllowedSendTransaction()) { + web3 = new Web3(provider); + web3.eth.accounts.wallet.add(getE2ETestAccountPrivateKey()); + } + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + itIf(getAllowedSendTransaction())('should deploy a contract', async () => { + const contract = new web3.eth.Contract(GreeterAbi, undefined, { + provider: getSystemE2ETestProvider(), + }).deploy({ + data: GreeterBytecode, + arguments: [initialGreet], + }); + const signedTransaction = await web3.eth.accounts.signTransaction( + { + from: getE2ETestAccountAddress(), + input: contract.encodeABI(), + gas: await contract.estimateGas(), + }, + getE2ETestAccountPrivateKey(), + ); + const result = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); + deployedContractAddress = result.contractAddress as string; + + // TODO This should work, but throws a type error + // for root not being included in expected object. + // However, root is not apart of result object. + // expect(result).toMatchObject({ + // eslint-disable-next-line jest/no-standalone-expect + expect(result).toMatchObject({ + // root: expect.any(String), + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + cumulativeGasUsed: expect.any(BigInt), + effectiveGasPrice: expect.any(BigInt), + from: getE2ETestAccountAddress().toLowerCase(), + contractAddress: expect.any(String), + gasUsed: expect.any(BigInt), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(1), + transactionHash: expect.any(String), + transactionIndex: expect.any(BigInt), + type: BigInt(2), + }); + }); + + itIf(getAllowedSendTransaction())('should call setGreeting on deployed contract', async () => { + const expectedGreet = 'Where we’re going, we don’t need roads'; + const contract = new web3.eth.Contract(GreeterAbi, deployedContractAddress, { + provider: getSystemE2ETestProvider(), + }); + + let greeting = await contract.methods.greet().call(); + // eslint-disable-next-line jest/no-standalone-expect + expect(greeting).toBe(initialGreet); + + const signedTransaction = await web3.eth.accounts.signTransaction( + { + from: getE2ETestAccountAddress(), + to: deployedContractAddress, + input: contract.methods.setGreeting(expectedGreet).encodeABI(), + gas: await contract.methods.setGreeting(expectedGreet).estimateGas(), + }, + getE2ETestAccountPrivateKey(), + ); + + const result = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); + + greeting = await contract.methods.greet().call(); + // eslint-disable-next-line jest/no-standalone-expect + expect(greeting).toBe(expectedGreet); + + // TODO This should work, but throws a type error + // for root not being included in expected object. + // However, root is not apart of result object. + // expect(result).toMatchObject({ + // eslint-disable-next-line jest/no-standalone-expect + expect(result).toMatchObject({ + // root: expect.any(String), + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + cumulativeGasUsed: expect.any(BigInt), + effectiveGasPrice: expect.any(BigInt), + from: getE2ETestAccountAddress().toLowerCase(), + gasUsed: expect.any(BigInt), + logs: [ + { + address: deployedContractAddress, + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + data: '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000017536f796c656e7420677265656e2069732070656f706c65000000000000000000000000000000000000000000000000000000000000000000000000000000002a5768657265207765e28099726520676f696e672c20776520646f6ee2809974206e65656420726f61647300000000000000000000000000000000000000000000', + logIndex: expect.any(BigInt), + removed: false, + topics: ['0x0d363f2fba46ab11b6db8da0125b0d5484787c44e265b48810735998bab12b75'], + transactionHash: expect.any(String), + transactionIndex: expect.any(BigInt), + }, + { + address: deployedContractAddress, + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002a5768657265207765e28099726520676f696e672c20776520646f6ee2809974206e65656420726f61647300000000000000000000000000000000000000000000', + logIndex: expect.any(BigInt), + removed: false, + topics: ['0x7d7846723bda52976e0286c6efffee937ee9f76817a867ec70531ad29fb1fc0e'], + transactionHash: expect.any(String), + transactionIndex: expect.any(BigInt), + }, + ], + logsBloom: expect.any(String), + status: BigInt(1), + transactionHash: expect.any(String), + transactionIndex: expect.any(BigInt), + type: BigInt(2), + }); + }); +}); diff --git a/packages/web3/test/e2e/sepolia/get_code.test.ts b/packages/web3/test/e2e/sepolia/get_code.test.ts new file mode 100644 index 00000000000..43373feb180 --- /dev/null +++ b/packages/web3/test/e2e/sepolia/get_code.test.ts @@ -0,0 +1,74 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { hexToBytes } from 'web3-utils'; + +import Web3, { FMT_BYTES, FMT_NUMBER } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; +import { sepoliaBlockData } from '../fixtures/sepolia'; + +describe(`${getSystemTestBackend()} tests - getCode`, () => { + const provider = getSystemE2ETestProvider(); + const expectedCode = + '0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80632e64cec1146100515780636057361d1461006f578063893d20e81461008b578063a6f9dae1146100a9575b600080fd5b6100596100c5565b60405161006691906102fb565b60405180910390f35b61008960048036038101906100849190610347565b6100ce565b005b610093610168565b6040516100a091906103b5565b60405180910390f35b6100c360048036038101906100be91906103fc565b610192565b005b60008054905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461015e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015590610486565b60405180910390fd5b8060008190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021990610486565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000819050919050565b6102f5816102e2565b82525050565b600060208201905061031060008301846102ec565b92915050565b600080fd5b610324816102e2565b811461032f57600080fd5b50565b6000813590506103418161031b565b92915050565b60006020828403121561035d5761035c610316565b5b600061036b84828501610332565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061039f82610374565b9050919050565b6103af81610394565b82525050565b60006020820190506103ca60008301846103a6565b92915050565b6103d981610394565b81146103e457600080fd5b50565b6000813590506103f6816103d0565b92915050565b60006020828403121561041257610411610316565b5b6000610420848285016103e7565b91505092915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000610470601383610429565b915061047b8261043a565b602082019050919050565b6000602082019050818103600083015261049f81610463565b905091905056fea26469706673582212201fcfa803d5c15c78e1e356cc1946c1bf14f9809acd349df1fd41362fa1a9e4d564736f6c63430008120033'; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + block: 'latest' | 'pending' | 'finalized' | 'safe' | 'blockHash' | 'blockNumber'; + format: string; + }>({ + block: ['latest', 'pending', 'safe', 'finalized', 'blockHash', 'blockNumber'], + format: Object.values(FMT_BYTES), + }), + )('should getCode for deployed contract', async ({ block, format }) => { + const result = await web3.eth.getCode( + getE2ETestContractAddress(), + sepoliaBlockData[block], + { + number: FMT_NUMBER.HEX, + bytes: format as FMT_BYTES, + }, + ); + + switch (format) { + case 'BYTES_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe(expectedCode); + break; + case 'BYTES_UINT8ARRAY': + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toStrictEqual(new Uint8Array(hexToBytes(expectedCode))); + break; + default: + throw new Error('Unhandled format'); + } + }); +}); diff --git a/packages/web3/test/e2e/sepolia/get_past_logs.test.ts b/packages/web3/test/e2e/sepolia/get_past_logs.test.ts new file mode 100644 index 00000000000..b7ada0c6d09 --- /dev/null +++ b/packages/web3/test/e2e/sepolia/get_past_logs.test.ts @@ -0,0 +1,178 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +import { hexToBytes, numberToHex, hexToNumber } from 'web3-utils'; +import { Log } from 'web3-types'; +import Web3, { FMT_BYTES, FMT_NUMBER, LogAPI } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; + +describe(`${getSystemTestBackend()} tests - getPastLogs`, () => { + const provider = getSystemE2ETestProvider(); + const expectedLogs: LogAPI[] = [ + { + address: getE2ETestContractAddress(), + blockHash: '0xdb1cb1fc3867fa28e4ba2297fbb1e65b81a3212beb1b73cbcbfe40c4192ee948', + blockNumber: '0x314675', + data: '0x', + logIndex: '0x4', + removed: false, + topics: [ + '0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', + '0x0000000000000000000000000000000000000000000000000000000000000000', + '0x000000000000000000000000a127c5e6a7e3600ac34a9a9928e52521677e7211', + ], + transactionHash: '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + transactionIndex: '0x8', + }, + ]; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + byteFormat: string; + numberFormat: string; + }>({ + byteFormat: Object.values(FMT_BYTES), + numberFormat: Object.values(FMT_NUMBER), + }), + )('should getPastLogs for deployed contract', async ({ byteFormat, numberFormat }) => { + const result = ( + await web3.eth.getPastLogs( + { + fromBlock: 'earliest', + toBlock: 'latest', + address: getE2ETestContractAddress(), + }, + { + number: numberFormat as FMT_NUMBER, + bytes: byteFormat as FMT_BYTES, + }, + ) + )[0] as unknown as Log; + if (typeof result !== 'string') { + switch (numberFormat) { + case 'NUMBER_STR': + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.blockNumber).toBe( + hexToNumber(numberToHex(expectedLogs[0].blockNumber as string)).toString(), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.logIndex).toStrictEqual( + hexToNumber(numberToHex(expectedLogs[0].logIndex as string)).toString(), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.transactionIndex).toStrictEqual( + hexToNumber( + numberToHex(expectedLogs[0].transactionIndex as string), + ).toString(), + ); + break; + case 'NUMBER_BIGINT': + // eslint-disable-next-line jest/no-conditional-expect + expect(result.blockNumber).toBe(BigInt(expectedLogs[0].blockNumber as string)); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.logIndex).toStrictEqual( + BigInt(expectedLogs[0].logIndex as string), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.transactionIndex).toStrictEqual( + BigInt(expectedLogs[0].transactionIndex as string), + ); + break; + case 'NUMBER_NUMBER': + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.blockNumber).toStrictEqual( + hexToNumber(numberToHex(expectedLogs[0].blockNumber as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.logIndex).toStrictEqual( + hexToNumber(numberToHex(expectedLogs[0].logIndex as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.transactionIndex).toStrictEqual( + hexToNumber(numberToHex(expectedLogs[0].transactionIndex as string)), + ); + break; + case 'NUMBER_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.blockNumber).toStrictEqual( + numberToHex(expectedLogs[0].blockNumber as string), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.logIndex).toStrictEqual( + numberToHex(expectedLogs[0].logIndex as string), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result?.transactionIndex).toStrictEqual( + numberToHex(expectedLogs[0].transactionIndex as string), + ); + break; + default: + throw new Error('Unhandled format'); + } + + switch (byteFormat) { + case 'BYTES_HEX': + // eslint-disable-next-line jest/no-conditional-expect + expect(result.blockHash).toBe(expectedLogs[0].blockHash as string); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.data).toBe(expectedLogs[0].data as string); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.transactionHash).toBe(expectedLogs[0].transactionHash as string); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.topics).toStrictEqual(expectedLogs[0].topics); + break; + case 'BYTES_UINT8ARRAY': + // eslint-disable-next-line jest/no-conditional-expect + expect(result.blockHash).toStrictEqual( + new Uint8Array(hexToBytes(expectedLogs[0].blockHash as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.data).toStrictEqual( + new Uint8Array(hexToBytes(expectedLogs[0].data as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.transactionHash).toStrictEqual( + new Uint8Array(hexToBytes(expectedLogs[0].transactionHash as string)), + ); + // eslint-disable-next-line jest/no-conditional-expect + expect(result.topics).toStrictEqual( + expectedLogs[0].topics?.map( + (topic: string) => new Uint8Array(hexToBytes(topic)), + ), + ); + break; + default: + throw new Error('Unhandled format'); + } + } + }); +}); diff --git a/packages/web3/test/e2e/sepolia/get_storage_at.test.ts b/packages/web3/test/e2e/sepolia/get_storage_at.test.ts new file mode 100644 index 00000000000..7702da89ffb --- /dev/null +++ b/packages/web3/test/e2e/sepolia/get_storage_at.test.ts @@ -0,0 +1,89 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3, { Numbers } from '../../../src'; +import { + getSystemE2ETestProvider, + getE2ETestAccountAddress, + getE2ETestContractAddress, +} from '../e2e_utils'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; +import { sepoliaBlockData } from '../fixtures/sepolia'; + +describe(`${getSystemTestBackend()} tests - getStorageAt`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + storageSlot: Numbers; + block: + | 'earliest' + | 'latest' + | 'pending' + | 'finalized' + | 'safe' + | 'blockHash' + | 'blockNumber'; + }>({ + storageSlot: ['0x1', '1', 1, BigInt(1)], + block: [ + 'earliest', + 'latest', + 'pending', + 'safe', + 'finalized', + 'blockHash', + 'blockNumber', + ], + }), + )('getStorageAt', async ({ storageSlot, block }) => { + const result = await web3.eth.getStorageAt( + getE2ETestContractAddress(), + storageSlot, + sepoliaBlockData[block], + ); + + if (sepoliaBlockData[block] === 'earliest') { + // Nethermind returns 0x while Geth returns 0x0000000000000000000000000000000000000000000000000000000000000000 + // eslint-disable-next-line jest/no-conditional-expect + expect( + result === '0x' || + result === '0x0000000000000000000000000000000000000000000000000000000000000000', + ).toBeTruthy(); + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(result).toBe( + `0x000000000000000000000000${getE2ETestAccountAddress() + .substring(2) + .toLowerCase()}`, + ); + } + }); +}); diff --git a/packages/web3/test/e2e/sepolia/get_transaction.test.ts b/packages/web3/test/e2e/sepolia/get_transaction.test.ts new file mode 100644 index 00000000000..4c52583919d --- /dev/null +++ b/packages/web3/test/e2e/sepolia/get_transaction.test.ts @@ -0,0 +1,86 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes, TransactionInfo } from 'web3-types'; +import { bytesToUint8Array, hexToBytes } from 'web3-utils'; + +import Web3 from '../../../src'; +import { getSystemE2ETestProvider } from '../e2e_utils'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - getTransaction`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + transactionHash: Bytes; + }>({ + transactionHash: [ + '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + bytesToUint8Array( + hexToBytes( + '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + ), + ), + new Uint8Array( + hexToBytes( + '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + ), + ), + ], + }), + )('getTransaction', async ({ transactionHash }) => { + const result = await web3.eth.getTransaction(transactionHash); + + expect(result).toMatchObject({ + hash: '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + nonce: BigInt('0x0'), + blockHash: '0xdb1cb1fc3867fa28e4ba2297fbb1e65b81a3212beb1b73cbcbfe40c4192ee948', + blockNumber: BigInt('0x314675'), + transactionIndex: BigInt('0x8'), + from: '0xa127c5e6a7e3600ac34a9a9928e52521677e7211', + gasPrice: BigInt('0x9502f908'), + maxPriorityFeePerGas: BigInt('0x9502f900'), + maxFeePerGas: BigInt('0x9502f910'), + gas: BigInt('0x54eca'), + input: '0x608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a36104dc806100de6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80632e64cec1146100515780636057361d1461006f578063893d20e81461008b578063a6f9dae1146100a9575b600080fd5b6100596100c5565b60405161006691906102fb565b60405180910390f35b61008960048036038101906100849190610347565b6100ce565b005b610093610168565b6040516100a091906103b5565b60405180910390f35b6100c360048036038101906100be91906103fc565b610192565b005b60008054905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461015e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015590610486565b60405180910390fd5b8060008190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021990610486565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000819050919050565b6102f5816102e2565b82525050565b600060208201905061031060008301846102ec565b92915050565b600080fd5b610324816102e2565b811461032f57600080fd5b50565b6000813590506103418161031b565b92915050565b60006020828403121561035d5761035c610316565b5b600061036b84828501610332565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061039f82610374565b9050919050565b6103af81610394565b82525050565b60006020820190506103ca60008301846103a6565b92915050565b6103d981610394565b81146103e457600080fd5b50565b6000813590506103f6816103d0565b92915050565b60006020828403121561041257610411610316565b5b6000610420848285016103e7565b91505092915050565b600082825260208201905092915050565b7f43616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000610470601383610429565b915061047b8261043a565b602082019050919050565b6000602082019050818103600083015261049f81610463565b905091905056fea26469706673582212201fcfa803d5c15c78e1e356cc1946c1bf14f9809acd349df1fd41362fa1a9e4d564736f6c63430008120033', + chainId: BigInt('0xaa36a7'), + type: BigInt('0x2'), + v: BigInt('0x0'), + s: '0x58f3924a7c468ab3df1a46ecef93910b4c05a13c3c3a9f4bf87b11f912b2748a', + r: '0x7fcc0285117b5613d0766b0bcd6cab69538bc0991b2bc4ddebbcc3cb5b4d8fb0', + // TODO These values are included when fetching the transaction from + // Nethermind, but not Infura + // to: null, + // value: '0x0', + // yParity: '0x0' + }); + }); +}); diff --git a/packages/web3/test/e2e/sepolia/get_transaction_receipt.test.ts b/packages/web3/test/e2e/sepolia/get_transaction_receipt.test.ts new file mode 100644 index 00000000000..063be95cb21 --- /dev/null +++ b/packages/web3/test/e2e/sepolia/get_transaction_receipt.test.ts @@ -0,0 +1,96 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Bytes } from 'web3-types'; +import { bytesToUint8Array, hexToBytes } from 'web3-utils'; + +import Web3 from '../../../src'; +import { getSystemE2ETestProvider, getE2ETestContractAddress } from '../e2e_utils'; +import { + closeOpenConnection, + getSystemTestBackend, +} from '../../shared_fixtures/system_tests_utils'; +import { toAllVariants } from '../../shared_fixtures/utils'; + +describe(`${getSystemTestBackend()} tests - getTransactionReceipt`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it.each( + toAllVariants<{ + transactionHash: Bytes; + }>({ + transactionHash: [ + '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + bytesToUint8Array( + hexToBytes( + '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + ), + ), + new Uint8Array( + hexToBytes( + '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + ), + ), + ], + }), + )('getTransactionReceipt', async ({ transactionHash }) => { + const result = await web3.eth.getTransactionReceipt(transactionHash); + + expect(result).toMatchObject({ + blockHash: '0xdb1cb1fc3867fa28e4ba2297fbb1e65b81a3212beb1b73cbcbfe40c4192ee948', + blockNumber: BigInt(3229301), + contractAddress: getE2ETestContractAddress(), + cumulativeGasUsed: BigInt(579732), + effectiveGasPrice: BigInt(2500000008), + from: '0xa127c5e6a7e3600ac34a9a9928e52521677e7211', + gasUsed: BigInt(347850), + logs: [ + { + address: getE2ETestContractAddress(), + blockHash: '0xdb1cb1fc3867fa28e4ba2297fbb1e65b81a3212beb1b73cbcbfe40c4192ee948', + blockNumber: BigInt(3229301), + data: '0x', + logIndex: BigInt(4), + removed: false, + topics: [ + '0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', + '0x0000000000000000000000000000000000000000000000000000000000000000', + '0x000000000000000000000000a127c5e6a7e3600ac34a9a9928e52521677e7211', + ], + transactionHash: + '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + transactionIndex: BigInt(8), + }, + ], + logsBloom: + '0x00000000000000000000000000000000000000000400000001000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000060000000000040010000800000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000010000000000000000000000000000000', + status: BigInt(1), + transactionHash: '0xe3d28c23ffcd8b94b8f2fd802b4c8dd17a5f19992660acd082ac229ab410b959', + transactionIndex: BigInt(8), + type: BigInt(2), + }); + }); +}); diff --git a/packages/web3/test/e2e/sepolia/send_signed_transaction.test.ts b/packages/web3/test/e2e/sepolia/send_signed_transaction.test.ts new file mode 100644 index 00000000000..cab4be964c4 --- /dev/null +++ b/packages/web3/test/e2e/sepolia/send_signed_transaction.test.ts @@ -0,0 +1,164 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3, { Transaction } from '../../../src'; +import { + closeOpenConnection, + getSystemTestBackend, + itIf, +} from '../../shared_fixtures/system_tests_utils'; +import { + getAllowedSendTransaction, + getE2ETestAccountAddress, + getE2ETestAccountPrivateKey, + getSystemE2ETestProvider, +} from '../e2e_utils'; + +describe(`${getSystemTestBackend()} tests - sendSignedTransaction`, () => { + const provider = getSystemE2ETestProvider(); + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + itIf(getAllowedSendTransaction())( + 'should send a simple value transfer - type 0x0', + async () => { + const transaction: Transaction = { + from: getE2ETestAccountAddress(), + to: getE2ETestAccountAddress(), + value: 1, + gas: 21000, + type: 0, + }; + const signedTransaction = await web3.eth.accounts.signTransaction( + transaction, + getE2ETestAccountPrivateKey(), + ); + const result = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); + + // TODO This should work, but throws a type error + // for root not being included in expected object. + // However, root is not apart of result object. + // expect(result).toMatchObject({ + // eslint-disable-next-line jest/no-standalone-expect + expect(result).toMatchObject({ + // root: expect.any(String), + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + cumulativeGasUsed: expect.any(BigInt), + effectiveGasPrice: expect.any(BigInt), + from: getE2ETestAccountAddress().toLowerCase(), + gasUsed: BigInt(21000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(1), + to: getE2ETestAccountAddress().toLowerCase(), + transactionHash: expect.any(String), + transactionIndex: expect.any(BigInt), + type: BigInt(0), + }); + }, + ); + + itIf(getAllowedSendTransaction())( + 'should send a simple value transfer - type 0x1', + async () => { + const transaction: Transaction = { + from: getE2ETestAccountAddress(), + to: getE2ETestAccountAddress(), + value: 1, + gas: 21000, + type: 1, + }; + const signedTransaction = await web3.eth.accounts.signTransaction( + transaction, + getE2ETestAccountPrivateKey(), + ); + const result = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); + + // TODO This should work, but throws a type error + // for root not being included in expected object. + // However, root is not apart of result object. + // expect(result).toMatchObject({ + // eslint-disable-next-line jest/no-standalone-expect + expect(result).toMatchObject({ + // root: expect.any(String), + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + cumulativeGasUsed: expect.any(BigInt), + effectiveGasPrice: expect.any(BigInt), + from: getE2ETestAccountAddress().toLowerCase(), + gasUsed: BigInt(21000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(1), + to: getE2ETestAccountAddress().toLowerCase(), + transactionHash: expect.any(String), + transactionIndex: expect.any(BigInt), + type: BigInt(1), + }); + }, + ); + + itIf(getAllowedSendTransaction())( + 'should send a simple value transfer - type 0x2', + async () => { + const transaction: Transaction = { + from: getE2ETestAccountAddress(), + to: getE2ETestAccountAddress(), + value: 1, + gas: 21000, + }; + const signedTransaction = await web3.eth.accounts.signTransaction( + transaction, + getE2ETestAccountPrivateKey(), + ); + const result = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); + + // TODO This should work, but throws a type error + // for root not being included in expected object. + // However, root is not apart of result object. + // expect(result).toMatchObject({ + // eslint-disable-next-line jest/no-standalone-expect + expect(result).toMatchObject({ + // root: expect.any(String), + blockHash: expect.any(String), + blockNumber: expect.any(BigInt), + cumulativeGasUsed: expect.any(BigInt), + effectiveGasPrice: expect.any(BigInt), + from: getE2ETestAccountAddress().toLowerCase(), + gasUsed: BigInt(21000), + logs: [], + logsBloom: + '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + status: BigInt(1), + to: getE2ETestAccountAddress().toLowerCase(), + transactionHash: expect.any(String), + transactionIndex: expect.any(BigInt), + type: BigInt(2), + }); + }, + ); +}); diff --git a/packages/web3/test/e2e/setup.js b/packages/web3/test/e2e/setup.js new file mode 100644 index 00000000000..fddbec59a1e --- /dev/null +++ b/packages/web3/test/e2e/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 30000; // Sometimes `in3` takes long time because of its decentralized nature. + +jest.setTimeout(jestTimeout); diff --git a/packages/web3/test/e2e/web3_extend.test.ts b/packages/web3/test/e2e/web3_extend.test.ts new file mode 100644 index 00000000000..36e52b0c35c --- /dev/null +++ b/packages/web3/test/e2e/web3_extend.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { isNumber } from 'web3-validator'; + +import Web3 from '../../src'; +import { getSystemE2ETestProvider } from './e2e_utils'; +import { closeOpenConnection, getSystemTestBackend } from '../shared_fixtures/system_tests_utils'; + +declare module 'web3' { + interface Web3Context { + L2Module: { + getL2BlockInfo(): Promise; + }; + } +} + +describe(`${getSystemTestBackend()} tests - Web3 extend`, () => { + it('Web3 extend test - getL2BlockInfo', async () => { + const provider = getSystemE2ETestProvider(); + const web3 = new Web3(provider); + + web3.extend({ + property: 'L2Module', + methods: [ + { + name: 'getL2BlockInfo', + call: 'eth_blockNumber', + }, + ], + }); + + const result = await web3.L2Module.getL2BlockInfo(); + expect(isNumber(result)).toBeTruthy(); + + await closeOpenConnection(web3); + }); +}); diff --git a/packages/web3/test/esm_black_box/.eslintrc.mjs b/packages/web3/test/esm_black_box/.eslintrc.mjs new file mode 100644 index 00000000000..6867ddc2934 --- /dev/null +++ b/packages/web3/test/esm_black_box/.eslintrc.mjs @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/packages/web3/test/esm_black_box/.yarnrc b/packages/web3/test/esm_black_box/.yarnrc new file mode 100644 index 00000000000..c408289a8d4 --- /dev/null +++ b/packages/web3/test/esm_black_box/.yarnrc @@ -0,0 +1 @@ +registry "http://localhost:4873" diff --git a/packages/web3/test/esm_black_box/jest.config.js b/packages/web3/test/esm_black_box/jest.config.js new file mode 100644 index 00000000000..55447c6ee20 --- /dev/null +++ b/packages/web3/test/esm_black_box/jest.config.js @@ -0,0 +1,11 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +export default { + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: '../config/tsconfig.esm.json', + }, + ], + }, +}; diff --git a/packages/web3/test/esm_black_box/package.json b/packages/web3/test/esm_black_box/package.json new file mode 100644 index 00000000000..252793ca6cc --- /dev/null +++ b/packages/web3/test/esm_black_box/package.json @@ -0,0 +1,25 @@ +{ + "name": "web3_black_box_esm_tests", + "version": "1.0.0", + "main": "index.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "type": "module", + "scripts": { + "test:hardhat:http": "WEB3_SYSTEM_TEST_BACKEND=hardhat WEB3_SYSTEM_TEST_PROVIDER=http://localhost:8545 jest", + "test:geth:http": "WEB3_SYSTEM_TEST_BACKEND=geth WEB3_SYSTEM_TEST_PROVIDER=http://localhost:8545 jest", + "test:geth:ws": "WEB3_SYSTEM_TEST_BACKEND=geth WEB3_SYSTEM_TEST_PROVIDER=ws://localhost:8545 jest --forceExit", + "test:infura:http": "WEB3_SYSTEM_TEST_BACKEND=infura jest", + "test:infura:ws": "WEB3_SYSTEM_TEST_BACKEND=infura jest --forceExit" + }, + "dependencies": { + "web3": "5.0.0" + }, + "devDependencies": { + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "web3-eth": "5.0.0", + "web3-eth-contract": "5.0.0", + "web3-validator": "5.0.0" + } +} diff --git a/packages/web3/test/esm_black_box/test/batchRequest.test.ts b/packages/web3/test/esm_black_box/test/batchRequest.test.ts new file mode 100644 index 00000000000..857a55410a5 --- /dev/null +++ b/packages/web3/test/esm_black_box/test/batchRequest.test.ts @@ -0,0 +1,66 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable import/no-relative-packages */ +import Web3 from 'web3'; + +import { + closeOpenConnection, + isWs, + getSystemTestProvider, +} from '../../shared_fixtures/system_tests_utils'; + +describe('ESM - Black Box Unit Tests - web3.BatchRequest', () => { + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should make a batch request', async () => { + const request1 = { + id: 42, + method: 'eth_getBalance', + params: ['0x4242000000000000000000000000000000000000', 'latest'], + }; + const request2 = { + id: 24, + method: 'eth_getBalance', + params: ['0x2424000000000000000000000000000000000000', 'latest'], + }; + + const batch = new web3.BatchRequest(); + const request1Promise = batch.add(request1); + const request2Promise = batch.add(request2); + + const executePromise = batch.execute(); + const response = await Promise.all([request1Promise, request2Promise, executePromise]); + + const expectedResponse = [ + '0x0', + '0x0', + [ + { jsonrpc: '2.0', id: 42, result: '0x0' }, + { jsonrpc: '2.0', id: 24, result: '0x0' }, + ], + ]; + expect(response).toStrictEqual(expectedResponse); + }); +}); diff --git a/packages/web3/test/esm_black_box/test/web3-eth-accounts/create.test.ts b/packages/web3/test/esm_black_box/test/web3-eth-accounts/create.test.ts new file mode 100644 index 00000000000..c5cb2f0260b --- /dev/null +++ b/packages/web3/test/esm_black_box/test/web3-eth-accounts/create.test.ts @@ -0,0 +1,61 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// TODO For some reason when running this test with a WebSocket provider +// the test takes a long time to run afterAll +import Web3 from 'web3'; +import { validator } from 'web3-validator'; +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; + +jest.setTimeout(15000); + +// TODO Consider adding this to web3.eth.accounts package +const accountSchema = { + type: 'object', + required: ['address', 'privateKey'], + // TODO Should validation functions as well + // required: ['address', 'privateKey', 'signTransaction', 'sign', 'encrypt'], + properties: { + address: { type: 'string' }, + privateKey: { type: 'string' }, + }, +}; + +describe('Black Box Unit Tests - web3.eth.accounts.create', () => { + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should create an account', () => { + const response = web3.eth.accounts.create(); + expect(response).toBeDefined(); + expect(response.signTransaction).toBeDefined(); + expect(response.sign).toBeDefined(); + expect(response.encrypt).toBeDefined(); + expect(validator.validateJSONSchema(accountSchema, response)).toBeUndefined(); + }); +}); diff --git a/packages/web3/test/esm_black_box/test/web3-eth-accounts/hashMessage.test.ts b/packages/web3/test/esm_black_box/test/web3-eth-accounts/hashMessage.test.ts new file mode 100644 index 00000000000..b1f0eb087de --- /dev/null +++ b/packages/web3/test/esm_black_box/test/web3-eth-accounts/hashMessage.test.ts @@ -0,0 +1,45 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// TODO For some reason when running this test with a WebSocket provider +// the test takes a long time to run afterAll +import Web3 from 'web3'; +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; + +jest.setTimeout(15000); + +describe('ESM - Black Box Unit Tests - web3.eth.accounts.hashMessage', () => { + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should hash provided message', () => { + expect(web3.eth.accounts.hashMessage('Hello World')).toBe( + '0xa1de988600a42c4b4ab089b619297c17d53cffae5d5120d82d8a92d0bb3b78f2', + ); + }); +}); diff --git a/packages/web3/test/esm_black_box/test/web3-eth-contract/erc20.test.ts b/packages/web3/test/esm_black_box/test/web3-eth-contract/erc20.test.ts new file mode 100644 index 00000000000..dda2509ac97 --- /dev/null +++ b/packages/web3/test/esm_black_box/test/web3-eth-contract/erc20.test.ts @@ -0,0 +1,96 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable import/no-relative-packages */ +import Web3 from 'web3'; +import Contract from 'web3-eth-contract'; + +import { + closeOpenConnection, + describeIf, + getSystemTestBackend, + isWs, + getSystemTestProvider, + createNewAccount, + BACKEND +} from '../../../shared_fixtures/system_tests_utils'; +import { ERC20TokenAbi, ERC20TokenBytecode } from '../../../shared_fixtures/contracts/ERC20Token'; + +describeIf(getSystemTestBackend() === BACKEND.INFURA)( + 'ESM - Black Box Unit Tests - web3.eth.Contract', + () => { + describe('Infura - ERC20', () => { + const mainNetUSDTAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + it('should get deployed contract info', async () => { + const contract = new web3.eth.Contract(ERC20TokenAbi, mainNetUSDTAddress); + + expect(await contract.methods.name().call()).toBe('Tether USD'); + expect(await contract.methods.symbol().call()).toBe('USDT'); + expect(await contract.methods.decimals().call()).toBe(BigInt(6)); + }); + }); + }, +); + +describeIf(getSystemTestBackend() === BACKEND.GETH || getSystemTestBackend() === BACKEND.HARDHAT)( + 'Black Box Unit Tests - web3.eth.Contract', + () => { + describe('Geth || Hardhat - ERC20', () => { + let account; + let web3: Web3; + let deployedContract: Contract; + + beforeAll(async () => { + account = await createNewAccount({ + unlock: true, + refill: true, + doNotImport: false, + }); + + web3 = new Web3(getSystemTestProvider()); + deployedContract = await new web3.eth.Contract(ERC20TokenAbi) + .deploy({ + data: ERC20TokenBytecode, + arguments: ['420'], + }) + .send({ from: account.address, gas: '10000000' }); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should get deployed contract info', async () => { + const contract = new web3.eth.Contract( + ERC20TokenAbi, + deployedContract.options.address, + ); + + expect(await contract.methods.name().call()).toBe('Gold'); + expect(await contract.methods.symbol().call()).toBe('GLD'); + expect(await contract.methods.decimals().call()).toBe(BigInt(18)); + expect(await contract.methods.totalSupply().call()).toBe(BigInt(420)); + }); + }); + }, +); diff --git a/packages/web3/test/esm_black_box/test/web3-eth/getBlock.test.ts b/packages/web3/test/esm_black_box/test/web3-eth/getBlock.test.ts new file mode 100644 index 00000000000..9b383028cfb --- /dev/null +++ b/packages/web3/test/esm_black_box/test/web3-eth/getBlock.test.ts @@ -0,0 +1,49 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from 'web3'; +import { validator } from 'web3-validator'; +import { blockSchema } from 'web3-eth'; +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; + +describe('ESM - Black Box Unit Tests - web3.eth.getBlock', () => { + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + it('should get the latest block and validate it against blockSchema', async () => { + const response = await web3.eth.getBlock('latest'); + expect(response).toBeDefined(); + expect(validator.validateJSONSchema(blockSchema, response)).toBeUndefined(); + }); + + it('should get the latest block and validate it against blockSchema - hydrated = true', async () => { + const response = await web3.eth.getBlock('latest', true); + expect(response).toBeDefined(); + expect(validator.validateJSONSchema(blockSchema, response)).toBeUndefined(); + }); +}); diff --git a/packages/web3/test/esm_black_box/test/web3-eth/getTransaction.test.ts b/packages/web3/test/esm_black_box/test/web3-eth/getTransaction.test.ts new file mode 100644 index 00000000000..385af52226f --- /dev/null +++ b/packages/web3/test/esm_black_box/test/web3-eth/getTransaction.test.ts @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from 'web3'; +import { + closeOpenConnection, + getSystemTestProvider, + isWs, + itIf, + // eslint-disable-next-line import/no-relative-packages +} from '../../../shared_fixtures/system_tests_utils'; + +describe('ESM - Black Box Unit Tests - web3.eth.getTransaction', () => { + let web3: Web3; + + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + + afterAll(async () => { + if (isWs) await closeOpenConnection(web3); + }); + + itIf(process.env.WEB3_SYSTEM_TEST_BACKEND === 'infura')( + 'should get specific USDT transaction', + async () => { + const expectedTxObject = { + accessList: [], + blockHash: '0x8ad298dbdf859f953b97cc27218e7f7f2af4237817a8dbd1d987891520286612', + blockNumber: BigInt(15230806), + chainId: BigInt(1), + from: '0x4c9af439b1a6761b8e549d8d226a468a6b2803a8', + gas: BigInt(120000), + gasPrice: BigInt(9022588986), + hash: '0x133048bfcf6c0f7f8d1f5681df9607802894667acb46f4a3ba8ba187421dfc2b', + data: '0xa9059cbb000000000000000000000000d9e46776dbc0e37d6f89be3a23885234c75702b6000000000000000000000000000000000000000000000000000000012a05f200', + input: '0xa9059cbb000000000000000000000000d9e46776dbc0e37d6f89be3a23885234c75702b6000000000000000000000000000000000000000000000000000000012a05f200', + maxFeePerGas: BigInt(32251128981), + maxPriorityFeePerGas: BigInt(1000000000), + nonce: BigInt(83553), + r: '0x1240db6f5b2245729b8593ff43230795e3c4c1005776dd6841de68da926096e9', + s: '0x48678639e5b752a69dcc62b4ef9417b3f65e4d4c75ec99df8457b02b339799de', + to: '0xdac17f958d2ee523a2206206994597c13d831ec7', + transactionIndex: BigInt(190), + type: BigInt(2), + v: BigInt(1), + value: BigInt(0), + }; + + const response = await web3.eth.getTransaction( + '0x133048bfcf6c0f7f8d1f5681df9607802894667acb46f4a3ba8ba187421dfc2b', + ); + // eslint-disable-next-line jest/no-standalone-expect + expect(response).toStrictEqual(expectedTxObject); + }, + ); +}); diff --git a/packages/web3/test/esm_black_box/yarn.lock b/packages/web3/test/esm_black_box/yarn.lock new file mode 100644 index 00000000000..e726d718315 --- /dev/null +++ b/packages/web3/test/esm_black_box/yarn.lock @@ -0,0 +1,2999 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "http://localhost:4873/@ampproject%2fremapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fcode-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "http://localhost:4873/@babel%2fcompat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.18.10" + resolved "http://localhost:4873/@babel%2fcore/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.10", "@babel/generator@^7.7.2": + version "7.18.12" + resolved "http://localhost:4873/@babel%2fgenerator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" + integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== + dependencies: + "@babel/types" "^7.18.10" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "http://localhost:4873/@babel%2fhelper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhelper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "http://localhost:4873/@babel%2fhelpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fhighlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11": + version "7.18.11" + resolved "http://localhost:4873/@babel%2fparser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" + integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "http://localhost:4873/@babel%2fplugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "http://localhost:4873/@babel%2fplugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "http://localhost:4873/@babel%2fplugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "http://localhost:4873/@babel%2fplugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.18.6" + resolved "http://localhost:4873/@babel%2fplugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": + version "7.18.10" + resolved "http://localhost:4873/@babel%2ftemplate/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": + version "7.18.11" + resolved "http://localhost:4873/@babel%2ftraverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" + integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.11" + "@babel/types" "^7.18.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.18.10" + resolved "http://localhost:4873/@babel%2ftypes/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" + integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "http://localhost:4873/@bcoe%2fv8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "http://localhost:4873/@ethereumjs%2fcommon/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "http://localhost:4873/@ethereumjs%2ftx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + +"@ethersproject/abi@^5.6.4": + version "5.6.4" + resolved "http://localhost:4873/@ethersproject%2fabi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" + integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/abstract-provider@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fabstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" + integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + +"@ethersproject/abstract-signer@^5.6.2": + version "5.6.2" + resolved "http://localhost:4873/@ethersproject%2fabstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" + integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/address@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2faddress/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + +"@ethersproject/base64@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fbase64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" + integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + +"@ethersproject/bignumber@^5.6.2": + version "5.6.2" + resolved "http://localhost:4873/@ethersproject%2fbignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" + integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fbytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/constants@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fconstants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" + integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + +"@ethersproject/hash@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fhash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" + integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/keccak256@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fkeccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" + integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "http://localhost:4873/@ethersproject%2flogger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== + +"@ethersproject/networks@^5.6.3": + version "5.6.4" + resolved "http://localhost:4873/@ethersproject%2fnetworks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" + integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "http://localhost:4873/@ethersproject%2fproperties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/rlp@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2frlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" + integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/signing-key@^5.6.2": + version "5.6.2" + resolved "http://localhost:4873/@ethersproject%2fsigning-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" + integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fstrings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" + integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/transactions@^5.6.2": + version "5.6.2" + resolved "http://localhost:4873/@ethersproject%2ftransactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" + integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + +"@ethersproject/web@^5.6.1": + version "5.6.1" + resolved "http://localhost:4873/@ethersproject%2fweb/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" + integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== + dependencies: + "@ethersproject/base64" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "http://localhost:4873/@istanbuljs%2fload-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "http://localhost:4873/@istanbuljs%2fschema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fconsole/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fcore/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" + micromatch "^4.0.4" + pretty-format "^28.1.3" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fenvironment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + dependencies: + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fexpect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fexpect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + dependencies: + expect "^28.1.3" + jest-snapshot "^28.1.3" + +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2ffake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fglobals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" + +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2freporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2fschemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "http://localhost:4873/@jest%2fsource-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + dependencies: + "@jridgewell/trace-mapping" "^0.3.13" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2ftest-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2ftest-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + dependencies: + "@jest/test-result" "^28.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" + +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2ftransform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "http://localhost:4873/@jest%2ftypes/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "http://localhost:4873/@jridgewell%2fgen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "http://localhost:4873/@jridgewell%2fgen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "http://localhost:4873/@jridgewell%2fresolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "http://localhost:4873/@jridgewell%2fset-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "http://localhost:4873/@jridgewell%2fsourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "http://localhost:4873/@jridgewell%2ftrace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@noble/hashes@1.1.2", "@noble/hashes@~1.1.1": + version "1.1.2" + resolved "http://localhost:4873/@noble%2fhashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": + version "1.6.3" + resolved "http://localhost:4873/@noble%2fsecp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== + +"@scure/base@~1.1.0": + version "1.1.1" + resolved "http://localhost:4873/@scure%2fbase/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.0": + version "1.1.0" + resolved "http://localhost:4873/@scure%2fbip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" + integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== + dependencies: + "@noble/hashes" "~1.1.1" + "@noble/secp256k1" "~1.6.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.0": + version "1.1.0" + resolved "http://localhost:4873/@scure%2fbip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" + integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== + dependencies: + "@noble/hashes" "~1.1.1" + "@scure/base" "~1.1.0" + +"@sinclair/typebox@^0.24.1": + version "0.24.28" + resolved "http://localhost:4873/@sinclair%2ftypebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794" + integrity sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "http://localhost:4873/@sinonjs%2fcommons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "http://localhost:4873/@sinonjs%2ffake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@types/babel__core@^7.1.14": + version "7.1.19" + resolved "http://localhost:4873/@types%2fbabel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "http://localhost:4873/@types%2fbabel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "http://localhost:4873/@types%2fbabel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.0" + resolved "http://localhost:4873/@types%2fbabel__traverse/-/babel__traverse-7.18.0.tgz#8134fd78cb39567465be65b9fdc16d378095f41f" + integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "http://localhost:4873/@types%2fbn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.5" + resolved "http://localhost:4873/@types%2fgraceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "http://localhost:4873/@types%2fistanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "http://localhost:4873/@types%2fistanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "http://localhost:4873/@types%2fistanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/node@*": + version "18.7.6" + resolved "http://localhost:4873/@types%2fnode/-/node-18.7.6.tgz#31743bc5772b6ac223845e18c3fc26f042713c83" + integrity sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "http://localhost:4873/@types%2fpbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.5": + version "2.7.0" + resolved "http://localhost:4873/@types%2fprettier/-/prettier-2.7.0.tgz#ea03e9f0376a4446f44797ca19d9c46c36e352dc" + integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "http://localhost:4873/@types%2fsecp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "http://localhost:4873/@types%2fstack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "http://localhost:4873/@types%2fyargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.11" + resolved "http://localhost:4873/@types%2fyargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" + integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== + dependencies: + "@types/yargs-parser" "*" + +ajv@^8.11.0: + version "8.11.0" + resolved "http://localhost:4873/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "http://localhost:4873/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "http://localhost:4873/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.2" + resolved "http://localhost:4873/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "http://localhost:4873/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +babel-jest@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== + dependencies: + "@jest/transform" "^28.1.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "http://localhost:4873/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== + dependencies: + babel-plugin-jest-hoist "^28.1.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "http://localhost:4873/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "http://localhost:4873/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +blakejs@^1.1.0: + version "1.2.1" + resolved "http://localhost:4873/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@^4.11.9: + version "4.12.0" + resolved "http://localhost:4873/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "http://localhost:4873/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "http://localhost:4873/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "http://localhost:4873/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "http://localhost:4873/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "http://localhost:4873/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserslist@^4.20.2: + version "4.21.3" + resolved "http://localhost:4873/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== + dependencies: + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" + node-releases "^2.0.6" + update-browserslist-db "^1.0.5" + +bs-logger@0.x: + version "0.2.6" + resolved "http://localhost:4873/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bs58@^4.0.0: + version "4.0.1" + resolved "http://localhost:4873/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "http://localhost:4873/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +bser@2.1.1: + version "2.1.1" + resolved "http://localhost:4873/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "http://localhost:4873/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "http://localhost:4873/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "http://localhost:4873/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001370: + version "1.0.30001378" + resolved "http://localhost:4873/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz#3d2159bf5a8f9ca093275b0d3ecc717b00f27b67" + integrity sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA== + +chalk@^2.0.0: + version "2.4.2" + resolved "http://localhost:4873/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "http://localhost:4873/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "http://localhost:4873/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^3.2.0: + version "3.3.2" + resolved "http://localhost:4873/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "http://localhost:4873/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "http://localhost:4873/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cliui@^7.0.2: + version "7.0.4" + resolved "http://localhost:4873/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "http://localhost:4873/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "http://localhost:4873/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "http://localhost:4873/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "http://localhost:4873/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "http://localhost:4873/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "http://localhost:4873/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "http://localhost:4873/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +crc-32@^1.2.0: + version "1.2.2" + resolved "http://localhost:4873/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "http://localhost:4873/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "http://localhost:4873/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "http://localhost:4873/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "http://localhost:4873/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "http://localhost:4873/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +dedent@^0.7.0: + version "0.7.0" + resolved "http://localhost:4873/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "http://localhost:4873/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^28.1.1: + version "28.1.1" + resolved "http://localhost:4873/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + +electron-to-chromium@^1.4.202: + version "1.4.222" + resolved "http://localhost:4873/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz#2ba24bef613fc1985dbffea85df8f62f2dec6448" + integrity sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg== + +elliptic@6.5.4, elliptic@^6.5.4: + version "6.5.4" + resolved "http://localhost:4873/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@^0.10.2: + version "0.10.2" + resolved "http://localhost:4873/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "http://localhost:4873/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "http://localhost:4873/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "http://localhost:4873/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +esprima@^4.0.0: + version "4.0.1" + resolved "http://localhost:4873/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "http://localhost:4873/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.1.2: + version "1.1.2" + resolved "http://localhost:4873/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" + integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== + dependencies: + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" + "@scure/bip32" "1.1.0" + "@scure/bip39" "1.1.0" + +ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "http://localhost:4873/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.0.0: + version "5.1.1" + resolved "http://localhost:4873/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "http://localhost:4873/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "http://localhost:4873/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "http://localhost:4873/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "http://localhost:4873/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "http://localhost:4873/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "http://localhost:4873/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "http://localhost:4873/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "http://localhost:4873/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "http://localhost:4873/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "http://localhost:4873/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "http://localhost:4873/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "http://localhost:4873/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "http://localhost:4873/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.2.9: + version "4.2.10" + resolved "http://localhost:4873/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "http://localhost:4873/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "http://localhost:4873/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "http://localhost:4873/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +human-signals@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +idna-uts46-hx@^3.5.0: + version "3.5.0" + resolved "http://localhost:4873/idna-uts46-hx/-/idna-uts46-hx-3.5.0.tgz#fad856b480bce4ff7477e7e0a42b5a39a8a4bcdc" + integrity sha512-0gMFl+zjvA8ZOohPQmLiWcd2Ad60AB9oKzqvLucEC5TyDzHl5mIB6ralW6h8BayVRm4ZmAVYnlI1pCYD2O7lBw== + dependencies: + punycode "^2.1.1" + +import-local@^3.0.2: + version "3.1.0" + resolved "http://localhost:4873/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "http://localhost:4873/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "http://localhost:4873/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "http://localhost:4873/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "http://localhost:4873/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-core-module@^2.9.0: + version "2.10.0" + resolved "http://localhost:4873/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "http://localhost:4873/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "http://localhost:4873/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-stream@^2.0.0: + version "2.0.1" + resolved "http://localhost:4873/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "http://localhost:4873/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "http://localhost:4873/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "http://localhost:4873/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "http://localhost:4873/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== + dependencies: + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-docblock@^28.1.1: + version "28.1.1" + resolved "http://localhost:4873/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== + dependencies: + detect-newline "^3.0.0" + +jest-each@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== + dependencies: + "@jest/types" "^28.1.3" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" + +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +jest-get-type@^28.0.2: + version "28.0.2" + resolved "http://localhost:4873/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== + dependencies: + "@jest/types" "^28.1.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "http://localhost:4873/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "http://localhost:4873/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" + +jest-resolve@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + natural-compare "^1.4.0" + pretty-format "^28.1.3" + semver "^7.3.5" + +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== + dependencies: + "@jest/types" "^28.1.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.3" + +jest-watcher@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== + dependencies: + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" + import-local "^3.0.2" + jest-cli "^28.1.3" + +js-sha3@0.8.0: + version "0.8.0" + resolved "http://localhost:4873/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "http://localhost:4873/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "http://localhost:4873/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "http://localhost:4873/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.2.1: + version "2.2.1" + resolved "http://localhost:4873/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +keccak@^3.0.0: + version "3.0.2" + resolved "http://localhost:4873/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kleur@^3.0.3: + version "3.0.3" + resolved "http://localhost:4873/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "http://localhost:4873/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "http://localhost:4873/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "http://localhost:4873/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "http://localhost:4873/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "http://localhost:4873/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +md5.js@^1.3.4: + version "1.3.5" + resolved "http://localhost:4873/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "http://localhost:4873/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "http://localhost:4873/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "http://localhost:4873/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "http://localhost:4873/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "http://localhost:4873/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "http://localhost:4873/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2.6.7: + version "2.6.7" + resolved "http://localhost:4873/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.5.0" + resolved "http://localhost:4873/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + +node-int64@^0.4.0: + version "0.4.0" + resolved "http://localhost:4873/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.6: + version "2.0.6" + resolved "http://localhost:4873/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "http://localhost:4873/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "http://localhost:4873/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "http://localhost:4873/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "http://localhost:4873/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.1.0: + version "3.1.0" + resolved "http://localhost:4873/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "http://localhost:4873/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "http://localhost:4873/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^5.2.0: + version "5.2.0" + resolved "http://localhost:4873/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "http://localhost:4873/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "http://localhost:4873/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "http://localhost:4873/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "http://localhost:4873/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "http://localhost:4873/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.5" + resolved "http://localhost:4873/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "http://localhost:4873/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "http://localhost:4873/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "http://localhost:4873/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "http://localhost:4873/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-is@^18.0.0: + version "18.2.0" + resolved "http://localhost:4873/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +readable-stream@^3.6.0: + version "3.6.0" + resolved "http://localhost:4873/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "http://localhost:4873/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "http://localhost:4873/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "http://localhost:4873/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.20.0: + version "1.22.1" + resolved "http://localhost:4873/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rimraf@^3.0.0: + version "3.0.2" + resolved "http://localhost:4873/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "http://localhost:4873/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4: + version "2.2.7" + resolved "http://localhost:4873/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "http://localhost:4873/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "http://localhost:4873/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +scrypt-js@^3.0.0: + version "3.0.1" + resolved "http://localhost:4873/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "http://localhost:4873/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semver@7.x, semver@^7.3.5: + version "7.3.7" + resolved "http://localhost:4873/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "http://localhost:4873/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "http://localhost:4873/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "http://localhost:4873/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "http://localhost:4873/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@0.5.13: + version "0.5.13" + resolved "http://localhost:4873/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "http://localhost:4873/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "http://localhost:4873/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.5" + resolved "http://localhost:4873/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "http://localhost:4873/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "http://localhost:4873/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "http://localhost:4873/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "http://localhost:4873/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "http://localhost:4873/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "http://localhost:4873/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "http://localhost:4873/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "http://localhost:4873/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "http://localhost:4873/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "http://localhost:4873/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +terminal-link@^2.0.0: + version "2.1.1" + resolved "http://localhost:4873/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "http://localhost:4873/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +tmpl@1.0.5: + version "1.0.5" + resolved "http://localhost:4873/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "http://localhost:4873/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "http://localhost:4873/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "http://localhost:4873/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-jest@^28.0.7: + version "28.0.8" + resolved "http://localhost:4873/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "http://localhost:4873/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "http://localhost:4873/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +update-browserslist-db@^1.0.5: + version "1.0.5" + resolved "http://localhost:4873/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "http://localhost:4873/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "http://localhost:4873/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "http://localhost:4873/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +walker@^1.0.8: + version "1.0.8" + resolved "http://localhost:4873/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +web3-core@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-core/-/web3-core-5.0.0.tgz#c0196de89b79784b17eea10116f14f9ecda4c100" + integrity sha512-BjWC0apqv48vK+tgjBtNXxef6Ujgkwmupum5Ld+uAgP9lssEPlUtvGkho1myPKY45dWzC3rAbxfT2H7FwscA6Q== + dependencies: + web3-errors "^5.0.0" + web3-eth-iban "^5.0.0" + web3-providers-http "^5.0.0" + web3-providers-ipc "^5.0.0" + web3-providers-ws "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-errors@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-errors/-/web3-errors-5.0.0.tgz#83e9186b3d3cdde51eb342fb227bbeec75b3c15f" + integrity sha512-zw0gk7dH1lB4zcn+s7WD/X+LtA4yEpDimnFi9LTbKnGGFi9keYIpsXsINqUmy4NelIM+xzY0oFOvwdBRXpl5PA== + dependencies: + web3-types "^5.0.0" + +web3-eth-abi@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-abi/-/web3-eth-abi-5.0.0.tgz#29b1e45e7f64e432ddad903328a2cc41c193456b" + integrity sha512-y6GjMi95Fq4Djt1nm3GBCrxrY+2/yDpUon4UwA2tDikFSnMr2xQx8vmymF1IIQjkDWQnhS8KdbJYUXgb4cKd6A== + dependencies: + "@ethersproject/abi" "^5.6.4" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-eth-accounts@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-accounts/-/web3-eth-accounts-5.0.0.tgz#c8f4b2fdf1bbf2324a687c1c1e9ed98e5c578985" + integrity sha512-DGzzO5hRfMm/DK+xU5GEJ53dihS1PShT6U8X+oFQkENhHZDx5/+zD6znyVpbcZ/ypRgf12q1YVRm2PAh45NRCw== + dependencies: + "@ethereumjs/tx" "^3.5.2" + ethereum-cryptography "^1.1.2" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth-contract@5.0.0, web3-eth-contract@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-contract/-/web3-eth-contract-5.0.0.tgz#dde4856bc8b3e00c35499cbbc260ba8d6bf10e4d" + integrity sha512-FYtL4W3sFyXmMVtIRX7qaN7c07gMXyha5i3tti2MnroojteqFm0cY2q8qvAPatDrCincx4Xi+OhXw+BBmhDYFw== + dependencies: + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth "^5.0.0" + web3-eth-abi "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth-ens@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-ens/-/web3-eth-ens-5.0.0.tgz#825fb84cab99785f6f621ecffca3f8088b3828cf" + integrity sha512-+DWenDS2Yt7N4jidWPmxbvKFFyhHOIyvqQJSWOFtajZ04Lk8Nxc4G1zELJuau49B16rC3yBL/9MwtIr8WMIxQQ== + dependencies: + idna-uts46-hx "^3.5.0" + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth "^5.0.0" + web3-eth-contract "^5.0.0" + web3-net "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-eth-iban@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-iban/-/web3-eth-iban-5.0.0.tgz#63f40186331c9fc6b38f3686d1605714956c2b4e" + integrity sha512-pp7MpmKgQmf/LAuM0S7Ufv0xCzsSqPnCmLGaUApLi8gHMsPZY07uxeiH/oEZyzYkdaR+nbkPF/Y/Ztj0N3PNHQ== + dependencies: + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-eth-personal@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth-personal/-/web3-eth-personal-5.0.0.tgz#623c687163a784d1edacb395614e986623d358cd" + integrity sha512-rt6fbYTpTo89KejPcf81rnzGHU9CSDH6M2W+S06e6vZEFVzyoSa/kyTgMKrzKI2Q7widLM4JSz/aMNEMgY2vWw== + dependencies: + web3-core "^5.0.0" + web3-eth "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-eth@5.0.0, web3-eth@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-eth/-/web3-eth-5.0.0.tgz#5b2b19677ee3c61aa26215cbe6b7dec6dbb16ddc" + integrity sha512-pp8yuLKiO1Vpjp1yY7x+OUd2Pf4fAg1hC4Cv2muP4Pmy/MhqJBRJcxsS6fmPWbj9y9IV/lbdbFF6DBSunUYppw== + dependencies: + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth-accounts "^5.0.0" + web3-net "^5.0.0" + web3-providers-ws "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + web3-validator "^5.0.0" + +web3-net@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-net/-/web3-net-5.0.0.tgz#0c4e6bb1e7c8f85de60f8852d2bafadecfe1aea8" + integrity sha512-nEgVdgS8KeRc6MwkewwmKnLKjXFEP1FV0qBBCQaBTQ0AAIyKhq/F7b+n89N/84isYeLL7/MnR9jLQSxdB9Jm8g== + dependencies: + web3-core "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-providers-http@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-providers-http/-/web3-providers-http-5.0.0.tgz#e664e4d16d4d5aa7c677e8aa9dda8e1e67fa8949" + integrity sha512-Kv13bM3PSGb3LBlTEZ7Ym1XoXXg+DXGqKMITo2QIjgGHRDz/eUgtPmfPndZmPZLODjMA5hvF2k17PADEs0Mn0A== + dependencies: + cross-fetch "^3.1.5" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-providers-ipc@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-providers-ipc/-/web3-providers-ipc-5.0.0.tgz#31f9b3e8382fab9319c422c1b2d431d5a6284163" + integrity sha512-a56U/wNcjk1mXXhLh3Zpgh1Tq8QByf1MHFWrgjunAzAiaPuE/b9CrzsXdzuY/VGv0Ndj5QiICHWZmUwuQHd/QQ== + dependencies: + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +web3-providers-ws@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-providers-ws/-/web3-providers-ws-5.0.0.tgz#1fdacaccb87c120628873413729fc79e074e1325" + integrity sha512-Hf+7686ZWWi0WYxnc+7TdSjjsPCnDhPhAEQSS78kBuV7m4GaUOwk6mK62MvuhPDxFYpe5H8VR8m0dnYR235MAQ== + dependencies: + isomorphic-ws "^5.0.0" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + ws "^8.8.1" + +web3-types@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-types/-/web3-types-5.0.0.tgz#ca76e2748db9c95e92e35074bd9148b21769b347" + integrity sha512-FrrWv1pePYA0jObcqhFlxY9LzgkAGsuRbKgjWgNToTBUlhrXyjZ05netpfpI/6zQ7BDxu483I7CRvjy+n/tQdw== + +web3-utils@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-utils/-/web3-utils-5.0.0.tgz#7e73ad17ad0719f5c5531fe2fbbf5d00a7eb438a" + integrity sha512-KeEeG84NAxRdNiMn1V65seHBCQtQ4A/QDZRkX9HEUvKqPEu0IPd8x3wW9IMEGRPKABROCG3ZKWblkYwqjcFU6A== + dependencies: + ethereum-cryptography "^1.1.2" + web3-errors "^5.0.0" + web3-types "^5.0.0" + web3-validator "^5.0.0" + +web3-validator@5.0.0, web3-validator@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3-validator/-/web3-validator-5.0.0.tgz#eff9a9f2f380ecbfdd093c5255f14519cef9d6bd" + integrity sha512-Sb/DgnJIthsVCxu0XA7/KOXtWo4RPnYoo6USbJIivo2jlaZy45Wyt9kChB9e2Zvt6ewvVoHVdZ9afcL0DGed+w== + dependencies: + ajv "^8.11.0" + ethereum-cryptography "^1.1.2" + web3-types "^5.0.0" + +web3@5.0.0: + version "5.0.0" + resolved "http://localhost:4873/web3/-/web3-5.0.0.tgz#e1f74c9ee528bb430fc6e17a55d948d63563b5d8" + integrity sha512-dELMyViyZTpcGf41VWSa/vRQRpxD7M9SBjMDvcrsKRGXr04qZP/2PRFa448jiGEfHGvTUuAd9u9VJY3ZnDpb0A== + dependencies: + web3-core "^5.0.0" + web3-errors "^5.0.0" + web3-eth "^5.0.0" + web3-eth-abi "^5.0.0" + web3-eth-accounts "^5.0.0" + web3-eth-contract "^5.0.0" + web3-eth-ens "^5.0.0" + web3-eth-iban "^5.0.0" + web3-eth-personal "^5.0.0" + web3-net "^5.0.0" + web3-types "^5.0.0" + web3-utils "^5.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "http://localhost:4873/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "http://localhost:4873/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "http://localhost:4873/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "http://localhost:4873/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "http://localhost:4873/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.1: + version "4.0.2" + resolved "http://localhost:4873/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.8.1: + version "8.8.1" + resolved "http://localhost:4873/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" + integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== + +y18n@^5.0.5: + version "5.0.8" + resolved "http://localhost:4873/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "http://localhost:4873/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.0.0, yargs-parser@^21.0.1: + version "21.1.1" + resolved "http://localhost:4873/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.5.1" + resolved "http://localhost:4873/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "http://localhost:4873/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/packages/web3/test/fixtures/transactions.json b/packages/web3/test/fixtures/transactions.json new file mode 100644 index 00000000000..99ae2c08aeb --- /dev/null +++ b/packages/web3/test/fixtures/transactions.json @@ -0,0 +1,5264 @@ +[ + { + "name": "random-2", + "transaction": { + "to": "0xD0F118AFa9C2c9cc50F10d94cCC1cbDda2758b36", + "nonce": 15, + "gasLimit": "0x331bce0f90", + "gasPrice": "0xe15a1b", + "maxFeePerGas": "0x58e8d1dda1", + "maxPriorityFeePerGas": "0x91bcff", + "data": "0xe0d1a7227d34c2ca72e3c0", + "value": "0x91e32e2f5a", + "accessList": [ + { + "address": "0x032f5546f1B932555cB43e2b16C844d118078430", + "storageKeys": [] + } + ], + "chainId": "0xac9f74e3" + }, + "privateKey": "0xa248ca1e9bd9c10fb163baefd567da6658f7419f3b7ec8bb13800ef2c546cdc9", + "unsignedLegacy": "0xf20f83e15a1b85331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c0", + "unsignedEip155": "0xf8390f83e15a1b85331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c084ac9f74e38080", + "unsignedBerlin": "0x01f84f84ac9f74e30f83e15a1b85331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c0d7d694032f5546f1b932555cb43e2b16c844d118078430c0", + "unsignedLondon": "0x02f85584ac9f74e30f8391bcff8558e8d1dda185331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c0d7d694032f5546f1b932555cb43e2b16c844d118078430c0", + "signedLegacy": "0xf8750f83e15a1b85331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c01ba0bde01f2c9907b076015708bff05e24058fd153bfc2f551a0adafcd7d61a088a0a01035bfd65df2799749536217c832d8d81b915448ac0ab31935d50917136e4c18", + "signedEip155": "0xf87a0f83e15a1b85331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c08501593ee9e9a0f42dbeea4337d8b48ed8f2bc257c83eb16725af6f3077e99fba6bac48c5e65f8a01869eaf77bc621843ba6c8b23919f7c9ebf0ac0001a840045609e1e96f14ab5a", + "signedBerlin": "0x01f89284ac9f74e30f83e15a1b85331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c0d7d694032f5546f1b932555cb43e2b16c844d118078430c080a05cc5457e6561e9831b8e52fb09765dc00eaa07ba68f05dc7558ad0dab2d2b8c3a020c19425fafafdc458dd119f6a59780fc4dd3bbd7ae65f351d3adf5b217d2f4e", + "signedLondon": "0x02f89884ac9f74e30f8391bcff8558e8d1dda185331bce0f9094d0f118afa9c2c9cc50f10d94ccc1cbdda2758b368591e32e2f5a8be0d1a7227d34c2ca72e3c0d7d694032f5546f1b932555cb43e2b16c844d118078430c001a0e97853a3f394ebb19b1a152324c7f3f7ffde2e2a0dfa295dc61f8788dcfebe00a02f0c9626e967c4494ccd02f4e60c840ecce64216438f051efa95f0b8f196f7c9", + "signatureLegacy": { + "r": "0xbde01f2c9907b076015708bff05e24058fd153bfc2f551a0adafcd7d61a088a0", + "s": "0x1035bfd65df2799749536217c832d8d81b915448ac0ab31935d50917136e4c18", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xf42dbeea4337d8b48ed8f2bc257c83eb16725af6f3077e99fba6bac48c5e65f8", + "s": "0x1869eaf77bc621843ba6c8b23919f7c9ebf0ac0001a840045609e1e96f14ab5a", + "v": "0x1593ee9e9" + }, + "signatureBerlin": { + "r": "0x5cc5457e6561e9831b8e52fb09765dc00eaa07ba68f05dc7558ad0dab2d2b8c3", + "s": "0x20c19425fafafdc458dd119f6a59780fc4dd3bbd7ae65f351d3adf5b217d2f4e", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xe97853a3f394ebb19b1a152324c7f3f7ffde2e2a0dfa295dc61f8788dcfebe00", + "s": "0x2f0c9626e967c4494ccd02f4e60c840ecce64216438f051efa95f0b8f196f7c9", + "v": "0x1" + } + }, + { + "name": "random-3", + "transaction": { + "to": "0x8Bee13B1D7E29953a7484A3aE8e344D86b4Ad2C5", + "nonce": 530, + "gasLimit": "0xccb4", + "gasPrice": "0x18956c24", + "maxFeePerGas": "0x57f3c57a41", + "maxPriorityFeePerGas": "0x5a492a", + "data": "0x4c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbd", + "value": "0x3b04", + "accessList": [], + "chainId": "0xb3" + }, + "privateKey": "0xa9e5fdc17c2302fce888f2dc9d6ec2b3d3fc06aa212ec06b07f4035f64fcc58f", + "unsignedLegacy": "0xf8688202128418956c2482ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbd", + "unsignedEip155": "0xf86c8202128418956c2482ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbd81b38080", + "unsignedBerlin": "0x01f86b81b38202128418956c2482ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbdc0", + "unsignedLondon": "0x02f87081b3820212835a492a8557f3c57a4182ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbdc0", + "signedLegacy": "0xf8ab8202128418956c2482ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbd1ca07be350194f44b6a86cd7199f2c6a2dea34815d20abbd0f389cf3c55ef5a13566a0239482099fd9289999f06db6fb95194ac1a92fcd13c1639d2e99e3b66ab2f0b1", + "signedEip155": "0xf8ad8202128418956c2482ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbd820189a0541bc2b78ae53dd11ac2c9845fe30878c493d34311513dfda43a92dbee1b4121a03f4ff8d77c247fc2238c02e2d5ca68dcd77e8f7a20d0d2f99145925af07beec0", + "signedBerlin": "0x01f8ae81b38202128418956c2482ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbdc001a035a7324dd7552976ee86c94623e89be43fddfa1ceed1354822a33726db13d9fba047347aee2460910314bbf20fbc091befb91a0ac236d30905312f828af49b2420", + "signedLondon": "0x02f8b381b3820212835a492a8557f3c57a4182ccb4948bee13b1d7e29953a7484a3ae8e344d86b4ad2c5823b04b8434c4aaeceaa35f9cd275639e2319057a18f3c4d8bf242707b08a1a2a32531d3975a4dc67b8a92f5a11adbf12b6f8d8809d1544aed6f9da9b1f5e753307165e3e85afdbdc080a0c458cee1b97cfb1f6fa52b2adaa135d8501d63ba908c113f48796d40884496b1a03abaf292f68e0fc6a5c1012455d49d2d566cb4cf2eeebc8d52f1f5e3e20c808b", + "signatureLegacy": { + "r": "0x7be350194f44b6a86cd7199f2c6a2dea34815d20abbd0f389cf3c55ef5a13566", + "s": "0x239482099fd9289999f06db6fb95194ac1a92fcd13c1639d2e99e3b66ab2f0b1", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x541bc2b78ae53dd11ac2c9845fe30878c493d34311513dfda43a92dbee1b4121", + "s": "0x3f4ff8d77c247fc2238c02e2d5ca68dcd77e8f7a20d0d2f99145925af07beec0", + "v": "0x189" + }, + "signatureBerlin": { + "r": "0x35a7324dd7552976ee86c94623e89be43fddfa1ceed1354822a33726db13d9fb", + "s": "0x47347aee2460910314bbf20fbc091befb91a0ac236d30905312f828af49b2420", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xc458cee1b97cfb1f6fa52b2adaa135d8501d63ba908c113f48796d40884496b1", + "s": "0x3abaf292f68e0fc6a5c1012455d49d2d566cb4cf2eeebc8d52f1f5e3e20c808b", + "v": "0x0" + } + }, + { + "name": "random-5", + "transaction": { + "to": "0x4d1060d970674619005137921969b4bfe3EeA6B8", + "nonce": 577, + "gasLimit": "0xbe431918", + "gasPrice": "0xb3b1aaeb58", + "maxFeePerGas": "0x6bb02a65c7", + "maxPriorityFeePerGas": "0xa5", + "data": "0x7f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60f", + "value": "0x95927b2d76", + "accessList": [ + { + "address": "0x8A632C23BF807681570c3fb6632Ce99FD98BdB23", + "storageKeys": [ + "0x1c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25c", + "0x2b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919", + "0xc266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5", + "0xf49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e" + ] + }, + { + "address": "0x2D78B31bA09E8a2888d655e3d000FE95c63789c4", + "storageKeys": [ + "0x1c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25c", + "0x2b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919", + "0xc266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5", + "0xf49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e" + ] + }, + { + "address": "0x3199b3433EE7f3eDcAE901cbce64C4E81125F7da", + "storageKeys": [ + "0x1c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25c", + "0x2b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919", + "0xc266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5", + "0xf49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e" + ] + }, + { + "address": "0xb8d669949683a728f76919fe2CC9896216E00A81", + "storageKeys": [ + "0x1c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25c", + "0x2b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919", + "0xc266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5", + "0xf49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e" + ] + } + ], + "chainId": "0x60a7" + }, + "privateKey": "0x77065b8ddb2f89d3d2d83f46d0147efc081e3a3f1012406c698a9ce364b324e9", + "unsignedLegacy": "0xf89c82024185b3b1aaeb5884be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60f", + "unsignedEip155": "0xf8a182024185b3b1aaeb5884be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60f8260a78080", + "unsignedBerlin": "0x01f903168260a782024185b3b1aaeb5884be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60ff90274f89b948a632c23bf807681570c3fb6632ce99fd98bdb23f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b942d78b31ba09e8a2888d655e3d000fe95c63789c4f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b943199b3433ee7f3edcae901cbce64c4e81125f7daf884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b94b8d669949683a728f76919fe2cc9896216e00a81f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e", + "unsignedLondon": "0x02f903188260a782024181a5856bb02a65c784be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60ff90274f89b948a632c23bf807681570c3fb6632ce99fd98bdb23f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b942d78b31ba09e8a2888d655e3d000fe95c63789c4f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b943199b3433ee7f3edcae901cbce64c4e81125f7daf884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b94b8d669949683a728f76919fe2cc9896216e00a81f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e", + "signedLegacy": "0xf8df82024185b3b1aaeb5884be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60f1ba098cadec7a4cd4297f92828b79459baed65817cd8fcd40cb2025b750c8bb3d046a00c2e6848654d045d1502a9c1777bc917a63718e8a494dae94720f519ff07b3db", + "signedEip155": "0xf8e182024185b3b1aaeb5884be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60f82c172a009f309ce844417f1035eff7a0b3bc191253843fb29068769f09fed81a464e622a0722660636b83fcac33759285b9704a5976b7cf9aeeceacab451702ff454469dc", + "signedBerlin": "0x01f903598260a782024185b3b1aaeb5884be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60ff90274f89b948a632c23bf807681570c3fb6632ce99fd98bdb23f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b942d78b31ba09e8a2888d655e3d000fe95c63789c4f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b943199b3433ee7f3edcae901cbce64c4e81125f7daf884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b94b8d669949683a728f76919fe2cc9896216e00a81f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e01a07c8b37dd82c37b9783d328b99528bdbf4abdc7956d5e3da3a65f4a165e4acb74a04db2486fbb725825041d85e055d0adf75e02790041d668d13662717695436410", + "signedLondon": "0x02f9035b8260a782024181a5856bb02a65c784be431918944d1060d970674619005137921969b4bfe3eea6b88595927b2d76b8717f2239c398167e747939f64b2ed9458db8aa10eb367bfab1976a0bc6693cf152dd8d13aa16e4d655a38d6ac64eae0932e13d649f9516fca834cd5a49c7b6e5ba1286a30eea1ac2e89c78441c5418250f8e307cc72c95ef36a8e4cee60b56ece34984ed3302672e6183d28ef30f3e43d60ff90274f89b948a632c23bf807681570c3fb6632ce99fd98bdb23f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b942d78b31ba09e8a2888d655e3d000fe95c63789c4f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b943199b3433ee7f3edcae901cbce64c4e81125f7daf884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824ef89b94b8d669949683a728f76919fe2cc9896216e00a81f884a01c3124f271ea52d9e881bdd52c63020fb7c08a1b96263030415e4bc8146db25ca02b6d4aa754fa44f0e86e6fa0a936048674ffc4fef24c5a2b317c740630901919a0c266c51508b93a8f933e2e64505e458ac26cdb93e8e0bc7bd1609552b6210aa5a0f49934500a155bedea4f0bf25bfc62161fcb74fbf17ca480333f4747d5ad824e01a09f9feb4b5bf570aa4f121fcc51de36dd7de80d0e4398f3dc99a6a615d12570c9a05d6f01ed28fda456c5f63f5f652735161cb5eede641262e296d62d94c7b628f8", + "signatureLegacy": { + "r": "0x98cadec7a4cd4297f92828b79459baed65817cd8fcd40cb2025b750c8bb3d046", + "s": "0x0c2e6848654d045d1502a9c1777bc917a63718e8a494dae94720f519ff07b3db", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x09f309ce844417f1035eff7a0b3bc191253843fb29068769f09fed81a464e622", + "s": "0x722660636b83fcac33759285b9704a5976b7cf9aeeceacab451702ff454469dc", + "v": "0xc172" + }, + "signatureBerlin": { + "r": "0x7c8b37dd82c37b9783d328b99528bdbf4abdc7956d5e3da3a65f4a165e4acb74", + "s": "0x4db2486fbb725825041d85e055d0adf75e02790041d668d13662717695436410", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x9f9feb4b5bf570aa4f121fcc51de36dd7de80d0e4398f3dc99a6a615d12570c9", + "s": "0x5d6f01ed28fda456c5f63f5f652735161cb5eede641262e296d62d94c7b628f8", + "v": "0x1" + } + }, + { + "name": "random-6", + "transaction": { + "to": "0x47F8627a7925083e80e0d94dBB979ce2c44A2c74", + "nonce": 432, + "gasLimit": "0xa1fca9f195", + "gasPrice": "0x39", + "maxFeePerGas": "0x98501809f1", + "maxPriorityFeePerGas": "0xfb", + "data": "0xc90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a8", + "value": "0x79ef27", + "accessList": [], + "chainId": "0xf76e64" + }, + "privateKey": "0xd9f6e52112da85a6f822054409e83460b9da070ce6c48843e4793c5720ad6910", + "unsignedLegacy": "0xf84b8201b03985a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a8", + "unsignedEip155": "0xf8518201b03985a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a883f76e648080", + "unsignedBerlin": "0x01f85083f76e648201b03985a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a8c0", + "unsignedLondon": "0x02f85783f76e648201b081fb8598501809f185a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a8c0", + "signedLegacy": "0xf88e8201b03985a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a81ba091ad22bc10dbc50ad469a26c6be65d65213a54b5de2ea949f8b7f47ee641d0aba03e69a58405b8bdcd6e41097b828b222b02fa2bfd6b001616a15241c41275c2df", + "signedEip155": "0xf8928201b03985a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a88401eedceba0b19933ddedae4fae6d63ed9ea7a4df4d1e48be652394203245429ef61e2728d6a033d8ab838c3eb536725ccd32ce73e75551eb660acd0608344887e838c41d7e3f", + "signedBerlin": "0x01f89383f76e648201b03985a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a8c001a0538d5ec11ad5bc2755057e684243d103469145984c437d317a231cd4ed7f891fa02f6051be9067d1e9322dc667dbd22f423a27354134b5070819f262eb85e8f754", + "signedLondon": "0x02f89a83f76e648201b081fb8598501809f185a1fca9f1959447f8627a7925083e80e0d94dbb979ce2c44a2c748379ef27a7c90411dca095641b87f3229df9e7613b2e73477c57fc4e28b4c06f436f9825b5aa4d839c3d07a8c080a07e88de3723e5ed269a26ebb27c5edf39da43e0246506f7c20861c286ed2e0118a0304a806691fee1223b8b505dc97142ad8eefaf949a7d8828e0483659accecfdd", + "signatureLegacy": { + "r": "0x91ad22bc10dbc50ad469a26c6be65d65213a54b5de2ea949f8b7f47ee641d0ab", + "s": "0x3e69a58405b8bdcd6e41097b828b222b02fa2bfd6b001616a15241c41275c2df", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xb19933ddedae4fae6d63ed9ea7a4df4d1e48be652394203245429ef61e2728d6", + "s": "0x33d8ab838c3eb536725ccd32ce73e75551eb660acd0608344887e838c41d7e3f", + "v": "0x1eedceb" + }, + "signatureBerlin": { + "r": "0x538d5ec11ad5bc2755057e684243d103469145984c437d317a231cd4ed7f891f", + "s": "0x2f6051be9067d1e9322dc667dbd22f423a27354134b5070819f262eb85e8f754", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x7e88de3723e5ed269a26ebb27c5edf39da43e0246506f7c20861c286ed2e0118", + "s": "0x304a806691fee1223b8b505dc97142ad8eefaf949a7d8828e0483659accecfdd", + "v": "0x0" + } + }, + { + "name": "random-7", + "transaction": { + "to": "0xD6E75AAf5C27963b31DD4Ad638e4C1d07b2Cc010", + "nonce": 667, + "gasLimit": "0x95ead5c7", + "gasPrice": "0x86", + "maxFeePerGas": "0x2e54dcae", + "maxPriorityFeePerGas": "0x0cb9", + "data": "0xe931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d4977910294", + "value": "0x632af6c3", + "accessList": [ + { + "address": "0xD0a4e08ACDA2A8B3AE50Db94DB3246C4a2F34b60", + "storageKeys": [ + "0xe85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11", + "0x2c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b" + ] + }, + { + "address": "0x3e4eE3DE26502A40C8dc33886c1bB7e079916194", + "storageKeys": [ + "0xe85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11", + "0x2c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b" + ] + }, + { + "address": "0xe54E80bd490910C719D5F11602a97FaE4D5C0F11", + "storageKeys": [ + "0xe85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11", + "0x2c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b" + ] + }, + { + "address": "0x6D1fd21ed3E7D4DE1F58361cB78De7a882dEcC79", + "storageKeys": [ + "0xe85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11", + "0x2c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b" + ] + } + ], + "chainId": "0x295d" + }, + "privateKey": "0xa6fe9bfe96da66b7788f98b3107c588bee30ccc844e129a7772df540c3193239", + "unsignedLegacy": "0xf86f82029b81868495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d4977910294", + "unsignedEip155": "0xf87482029b81868495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d497791029482295d8080", + "unsignedBerlin": "0x01f901e182295d82029b81868495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d4977910294f9016cf85994d0a4e08acda2a8b3ae50db94db3246c4a2f34b60f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859943e4ee3de26502a40c8dc33886c1bb7e079916194f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf85994e54e80bd490910c719d5f11602a97fae4d5c0f11f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859946d1fd21ed3e7d4de1f58361cb78de7a882decc79f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b", + "unsignedLondon": "0x02f901e782295d82029b820cb9842e54dcae8495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d4977910294f9016cf85994d0a4e08acda2a8b3ae50db94db3246c4a2f34b60f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859943e4ee3de26502a40c8dc33886c1bb7e079916194f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf85994e54e80bd490910c719d5f11602a97fae4d5c0f11f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859946d1fd21ed3e7d4de1f58361cb78de7a882decc79f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b", + "signedLegacy": "0xf8b282029b81868495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d49779102941ca02bacdc3053183b5f2a6f56ed6c2f126a6bbb592ef64d912bc704293d5620e188a0163d3e7cb0ad4ab63d10314c24728248699e5f5acebf84e84d67ca21ebe835ca", + "signedEip155": "0xf8b482029b81868495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d49779102948252dda0988356e8e6b000200035901fa00b736677e25d01022d8e7ff0c6f9a9f44cb530a01d04ca133497f2a7f07a36022a132027df576c9d53935fee792fa6a01e2d18d0", + "signedBerlin": "0x01f9022482295d82029b81868495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d4977910294f9016cf85994d0a4e08acda2a8b3ae50db94db3246c4a2f34b60f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859943e4ee3de26502a40c8dc33886c1bb7e079916194f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf85994e54e80bd490910c719d5f11602a97fae4d5c0f11f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859946d1fd21ed3e7d4de1f58361cb78de7a882decc79f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b01a0f243d534dfae5cfb18cf59a41daa31520d91f03fc9b5830ee8a512dca82bbdcda02507b456d89080c847848fa2199998ffc363cbb0d4835ce8d03621980a3f135a", + "signedLondon": "0x02f9022a82295d82029b820cb9842e54dcae8495ead5c794d6e75aaf5c27963b31dd4ad638e4c1d07b2cc01084632af6c3b849e931d4333e6bb3d32f215bfdb13209a0905f740b180cadcea26405d9c79e108e50e87b78a1e7192c313e22f09632ed2882774f8e7536b7dfa987f7d063fc8db54ad5bd8d4977910294f9016cf85994d0a4e08acda2a8b3ae50db94db3246c4a2f34b60f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859943e4ee3de26502a40c8dc33886c1bb7e079916194f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf85994e54e80bd490910c719d5f11602a97fae4d5c0f11f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0bf859946d1fd21ed3e7d4de1f58361cb78de7a882decc79f842a0e85938a8c29ab7b82264cc2e0822673fe17637364d6b384eb49f89e1adf61a11a02c10ec7831da9a49dbf10818882d783f6511dda96c06b8ad2999aeb9f9f82d0b80a08e1d67786ffd5edb50e2aff66566c76a1523e9dcabc667b92f540f536d47bccea05d6a00e50ad155e59fbba841afda7592ec16788da4cfd895b447f4c13197d1ab", + "signatureLegacy": { + "r": "0x2bacdc3053183b5f2a6f56ed6c2f126a6bbb592ef64d912bc704293d5620e188", + "s": "0x163d3e7cb0ad4ab63d10314c24728248699e5f5acebf84e84d67ca21ebe835ca", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x988356e8e6b000200035901fa00b736677e25d01022d8e7ff0c6f9a9f44cb530", + "s": "0x1d04ca133497f2a7f07a36022a132027df576c9d53935fee792fa6a01e2d18d0", + "v": "0x52dd" + }, + "signatureBerlin": { + "r": "0xf243d534dfae5cfb18cf59a41daa31520d91f03fc9b5830ee8a512dca82bbdcd", + "s": "0x2507b456d89080c847848fa2199998ffc363cbb0d4835ce8d03621980a3f135a", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x8e1d67786ffd5edb50e2aff66566c76a1523e9dcabc667b92f540f536d47bcce", + "s": "0x5d6a00e50ad155e59fbba841afda7592ec16788da4cfd895b447f4c13197d1ab", + "v": "0x0" + } + }, + { + "name": "random-9", + "transaction": { + "to": "0x671a63481F6AdF6E231296c3ec838D21919b5Ec0", + "nonce": 776, + "gasLimit": "0x905469", + "gasPrice": "0xe8", + "maxFeePerGas": "0x64b085b92ba07f", + "maxPriorityFeePerGas": "0xbe", + "data": "0x6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6f", + "value": "0x4f88", + "accessList": [], + "chainId": "0x348f3fcb" + }, + "privateKey": "0x63dd633e51d725e1f444b9a724729fb8bd052ec4737eceba804e846a32b4530c", + "unsignedLegacy": "0xf87d82030881e88390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6f", + "unsignedEip155": "0xf88482030881e88390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6f84348f3fcb8080", + "unsignedBerlin": "0x01f88384348f3fcb82030881e88390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6fc0", + "unsignedLondon": "0x02f88b84348f3fcb82030881be8764b085b92ba07f8390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6fc0", + "signedLegacy": "0xf8c082030881e88390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6f1ba0d567c29e1775043d150df4e740d0e581d723f4950b2d35a5adb5a3a1b527686ea00fbcddbd1e8f33eb73a957c985b1ab85c333a42074c8801fe230ace1f246f826", + "signedEip155": "0xf8c482030881e88390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6f84691e7fb9a0900464b1bcd8e581911e8761960913c5b23ef063886533b4a9759c74ffcd4d80a0319be70fd62d7b2722aa1572b456755ae71fc7d1d3c02cdaafebbf4941033409", + "signedBerlin": "0x01f8c684348f3fcb82030881e88390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6fc080a0d2418f0ef98efb8120c5f35803fcc2b0def21e7bad27537fa8be144169393df7a0561b3ee3efe7f4cc07ff4289897c8b316eb6d4de32f60eddd71833d70c13c488", + "signedLondon": "0x02f8ce84348f3fcb82030881be8764b085b92ba07f8390546994671a63481f6adf6e231296c3ec838d21919b5ec0824f88b85a6e8a5785fbcffa9d6303b7a22818c0c67aa5e3b1c097aa35af45f95038224f7b1e0724b14a2de88e07469fa80c6c1e172353269d5bd75af8c91b77585a6aa1b99c462b9fbf7010a9b8f4194260bfb307da9ba5b6202da6f0ef6fc080a04dfe6f43e3da767dcb2d717d7555f67448a47d8329ba40ba0b25e19ef217837da01612656de7ebf9929a66b7479a63927bb895b225af797adf3d32a890b279ab82", + "signatureLegacy": { + "r": "0xd567c29e1775043d150df4e740d0e581d723f4950b2d35a5adb5a3a1b527686e", + "s": "0x0fbcddbd1e8f33eb73a957c985b1ab85c333a42074c8801fe230ace1f246f826", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x900464b1bcd8e581911e8761960913c5b23ef063886533b4a9759c74ffcd4d80", + "s": "0x319be70fd62d7b2722aa1572b456755ae71fc7d1d3c02cdaafebbf4941033409", + "v": "0x691e7fb9" + }, + "signatureBerlin": { + "r": "0xd2418f0ef98efb8120c5f35803fcc2b0def21e7bad27537fa8be144169393df7", + "s": "0x561b3ee3efe7f4cc07ff4289897c8b316eb6d4de32f60eddd71833d70c13c488", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x4dfe6f43e3da767dcb2d717d7555f67448a47d8329ba40ba0b25e19ef217837d", + "s": "0x1612656de7ebf9929a66b7479a63927bb895b225af797adf3d32a890b279ab82", + "v": "0x0" + } + }, + { + "name": "random-10", + "transaction": { + "to": "0xe80B2a2b7a84c886319faB83dF55E63C7539D2E7", + "nonce": 11, + "gasLimit": "0x66745b0460", + "gasPrice": "0x19b27a8a", + "maxFeePerGas": "0x9bc10525", + "maxPriorityFeePerGas": "0xde6421", + "data": "0xc67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184", + "value": "0x452f964f", + "accessList": [ + { + "address": "0x9C1010eBD297f0af2110e4Be1356a99e088B70b0", + "storageKeys": [ + "0x8f4489956d5c84285dd2337de059733fd7caff5e3bc562d2e19f4c8416f7adcd", + "0xecacb47c7f3b429a188ae196d5f6905999bdd4909022d3d5b3566399ef44b513" + ] + } + ], + "chainId": "0x4e33268bd8" + }, + "privateKey": "0x937f09851dd891844eee05f469dc776fe07a398b47ee3d064460f74fb00b8454", + "unsignedLegacy": "0xf8710b8419b27a8a8566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184", + "unsignedEip155": "0xf8790b8419b27a8a8566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184854e33268bd88080", + "unsignedBerlin": "0x01f8d4854e33268bd80b8419b27a8a8566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184f85bf859949c1010ebd297f0af2110e4be1356a99e088b70b0f842a08f4489956d5c84285dd2337de059733fd7caff5e3bc562d2e19f4c8416f7adcda0ecacb47c7f3b429a188ae196d5f6905999bdd4909022d3d5b3566399ef44b513", + "unsignedLondon": "0x02f8d8854e33268bd80b83de6421849bc105258566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184f85bf859949c1010ebd297f0af2110e4be1356a99e088b70b0f842a08f4489956d5c84285dd2337de059733fd7caff5e3bc562d2e19f4c8416f7adcda0ecacb47c7f3b429a188ae196d5f6905999bdd4909022d3d5b3566399ef44b513", + "signedLegacy": "0xf8b40b8419b27a8a8566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a9531841ba0f9c1a46fcbbeaa4915050ffc5e33043e372ab5b8e55e40c99bcea824b07ae62ba03a78b26033934d062ab52ac1b527df5b27bd08ced030d392832c89ca779dcc93", + "signedEip155": "0xf8b90b8419b27a8a8566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184859c664d17d4a008a210072105a1ad68dc2b2811abd43dcd1dabaa2c2d2a2f669fb0dea7903535a028817f47aa0014375ed11fde0b733a5b3b648e5ffb2f66e3b4a0fc8db3000bcf", + "signedBerlin": "0x01f90117854e33268bd80b8419b27a8a8566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184f85bf859949c1010ebd297f0af2110e4be1356a99e088b70b0f842a08f4489956d5c84285dd2337de059733fd7caff5e3bc562d2e19f4c8416f7adcda0ecacb47c7f3b429a188ae196d5f6905999bdd4909022d3d5b3566399ef44b51380a0a972d4365dac9b214ae1c1cdbdb70d5c10877eac1edaee2398012e6f084b99fca0184054b4a0b98483664b9469564eb21a28439982883f61bb1e538e968f74ce9d", + "signedLondon": "0x02f9011b854e33268bd80b83de6421849bc105258566745b046094e80b2a2b7a84c886319fab83df55e63c7539d2e784452f964fb849c67a6a742250a5b9144dbfac7342e66a31df07bc2de714d5700d4a328600e6c274a8713cd12df6c64ca6f8088e1a49108dc171457cfcc9a4daf0625786bdf689e568fd61a63a953184f85bf859949c1010ebd297f0af2110e4be1356a99e088b70b0f842a08f4489956d5c84285dd2337de059733fd7caff5e3bc562d2e19f4c8416f7adcda0ecacb47c7f3b429a188ae196d5f6905999bdd4909022d3d5b3566399ef44b51301a0abb1f9fd744bd588e3cc73caf61ea9a023aa8b486356f5bc97910ca01fe6453ca062ae4642f50df606c7587957e497e3867510554f88ba57a2bb93a4f8883329e5", + "signatureLegacy": { + "r": "0xf9c1a46fcbbeaa4915050ffc5e33043e372ab5b8e55e40c99bcea824b07ae62b", + "s": "0x3a78b26033934d062ab52ac1b527df5b27bd08ced030d392832c89ca779dcc93", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x08a210072105a1ad68dc2b2811abd43dcd1dabaa2c2d2a2f669fb0dea7903535", + "s": "0x28817f47aa0014375ed11fde0b733a5b3b648e5ffb2f66e3b4a0fc8db3000bcf", + "v": "0x9c664d17d4" + }, + "signatureBerlin": { + "r": "0xa972d4365dac9b214ae1c1cdbdb70d5c10877eac1edaee2398012e6f084b99fc", + "s": "0x184054b4a0b98483664b9469564eb21a28439982883f61bb1e538e968f74ce9d", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xabb1f9fd744bd588e3cc73caf61ea9a023aa8b486356f5bc97910ca01fe6453c", + "s": "0x62ae4642f50df606c7587957e497e3867510554f88ba57a2bb93a4f8883329e5", + "v": "0x1" + } + }, + { + "name": "random-12", + "transaction": { + "to": "0x4F18B878B82C8931c4A6d67FC28b857AaFf6D764", + "nonce": 547, + "gasLimit": "0xfa26c05691", + "gasPrice": "0x892d19ea64", + "maxFeePerGas": "0x6bf86f84", + "maxPriorityFeePerGas": "0xf627", + "data": "0x57d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f8", + "value": "0x64660ccd", + "accessList": [ + { + "address": "0x275677ef49D8315ed641fe3b6519C4dC3f099112", + "storageKeys": [ + "0x819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457b", + "0xb76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6d" + ] + }, + { + "address": "0xa02363D8A2921bF57F7Dc48B42Ccc04548554E81", + "storageKeys": [ + "0x819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457b", + "0xb76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6d" + ] + }, + { + "address": "0x8D6796be448CEFf2333157dEE56C74AF0aFb0BD5", + "storageKeys": [ + "0x819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457b", + "0xb76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6d" + ] + } + ], + "chainId": "0x44af2c" + }, + "privateKey": "0x3d04ff4d2657142a58d3cc787e089ca7f20a6b66776ed5b04dc9d4dceef253d7", + "unsignedLegacy": "0xf87182022385892d19ea6485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f8", + "unsignedEip155": "0xf87782022385892d19ea6485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f88344af2c8080", + "unsignedBerlin": "0x01f901898344af2c82022385892d19ea6485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f8f90111f85994275677ef49d8315ed641fe3b6519c4dc3f099112f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df85994a02363d8a2921bf57f7dc48b42ccc04548554e81f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df859948d6796be448ceff2333157dee56c74af0afb0bd5f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6d", + "unsignedLondon": "0x02f9018b8344af2c82022382f627846bf86f8485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f8f90111f85994275677ef49d8315ed641fe3b6519c4dc3f099112f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df85994a02363d8a2921bf57f7dc48b42ccc04548554e81f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df859948d6796be448ceff2333157dee56c74af0afb0bd5f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6d", + "signedLegacy": "0xf8b482022385892d19ea6485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f81ca01c1a043ba56d5a6edec9efd4b24695f996204caec12978d32bf086d8e21bcf96a04a5144d22ab0ddd5335bc3e1b22cd24e66bd742865f1a4447e2675ee00a2227f", + "signedEip155": "0xf8b782022385892d19ea6485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f883895e7ca06d75cb007c3b91b7465c095e28b841d93da110bbb66280a0f5920083ad4e80f2a026b07e9427fd6dc320c23ced73fb8aae9872af808f20db04f0bb67287da0373b", + "signedBerlin": "0x01f901cc8344af2c82022385892d19ea6485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f8f90111f85994275677ef49d8315ed641fe3b6519c4dc3f099112f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df85994a02363d8a2921bf57f7dc48b42ccc04548554e81f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df859948d6796be448ceff2333157dee56c74af0afb0bd5f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6d80a0f69b776f4eee48cf9a220abb4e132d2cd915b320e409fe99376535aa6984f69ea045b9071a002c820e368070525657f2cd47053ea600d24c1da75b7adbd076cfcf", + "signedLondon": "0x02f901ce8344af2c82022382f627846bf86f8485fa26c05691944f18b878b82c8931c4a6d67fc28b857aaff6d7648464660ccdb84657d10e77f6d8cd44acf5914b7b73eca98b9afe235e07b9db2d1712c4adc287e3e474a377404de19203f5127b676c88c839a76e15e665f183709a3460025556e5fd5f2a2f17f8f90111f85994275677ef49d8315ed641fe3b6519c4dc3f099112f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df85994a02363d8a2921bf57f7dc48b42ccc04548554e81f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6df859948d6796be448ceff2333157dee56c74af0afb0bd5f842a0819da32335b67b104a5c786c41f2811e1167a1245b4998eb9297d0b777db457ba0b76e298e9f4a7cb7e30809076edbb99bcbc310ec27d7a563cbc24cddd0a2ae6d01a074ffa09bd37c038326cebdd9794d5f90fe95aa9210e903fb6a5c44a735bbafc6a01605e0f1db258100a878445341892825483f14cfa7b9bde7bd001f4f3e6eed4a", + "signatureLegacy": { + "r": "0x1c1a043ba56d5a6edec9efd4b24695f996204caec12978d32bf086d8e21bcf96", + "s": "0x4a5144d22ab0ddd5335bc3e1b22cd24e66bd742865f1a4447e2675ee00a2227f", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x6d75cb007c3b91b7465c095e28b841d93da110bbb66280a0f5920083ad4e80f2", + "s": "0x26b07e9427fd6dc320c23ced73fb8aae9872af808f20db04f0bb67287da0373b", + "v": "0x895e7c" + }, + "signatureBerlin": { + "r": "0xf69b776f4eee48cf9a220abb4e132d2cd915b320e409fe99376535aa6984f69e", + "s": "0x45b9071a002c820e368070525657f2cd47053ea600d24c1da75b7adbd076cfcf", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x74ffa09bd37c038326cebdd9794d5f90fe95aa9210e903fb6a5c44a735bbafc6", + "s": "0x1605e0f1db258100a878445341892825483f14cfa7b9bde7bd001f4f3e6eed4a", + "v": "0x1" + } + }, + { + "name": "random-14", + "transaction": { + "to": "0xd4Ed79414A9F8bF363E9CAaa5A74380716F7dBE0", + "nonce": 355, + "gasLimit": "0xc3393abf8e", + "gasPrice": "0x530f336b", + "maxFeePerGas": "0xc4550ba0e2", + "maxPriorityFeePerGas": "0xf9fe", + "data": "0x9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe82", + "value": "0x5590f0f87b", + "accessList": [ + { + "address": "0x3acE6cc41a8DF5B6518B24e6ecd490c13aCfC677", + "storageKeys": [] + }, + { + "address": "0x65F3540A4A7aa93d074A77313622786513f0199d", + "storageKeys": [] + }, + { + "address": "0x0dad5e012C02f680FB256bf6b0e0d9999c8c74A0", + "storageKeys": [] + } + ], + "chainId": "0x602a" + }, + "privateKey": "0x6c268eef2efdb15a96ae69774e732b9214a3ebb03c0fd01602bc7a5fcd21c060", + "unsignedLegacy": "0xf85782016384530f336b85c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe82", + "unsignedEip155": "0xf85c82016384530f336b85c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe8282602a8080", + "unsignedBerlin": "0x01f8a182602a82016384530f336b85c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe82f845d6943ace6cc41a8df5b6518b24e6ecd490c13acfc677c0d69465f3540a4a7aa93d074a77313622786513f0199dc0d6940dad5e012c02f680fb256bf6b0e0d9999c8c74a0c0", + "unsignedLondon": "0x02f8a582602a82016382f9fe85c4550ba0e285c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe82f845d6943ace6cc41a8df5b6518b24e6ecd490c13acfc677c0d69465f3540a4a7aa93d074a77313622786513f0199dc0d6940dad5e012c02f680fb256bf6b0e0d9999c8c74a0c0", + "signedLegacy": "0xf89a82016384530f336b85c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe821ca03e5ece8f862a9b5d42b42c314dceef20c98a55ae8e89e76ea36574f2dbcd0a6fa06cf670f45c89f30ccf175619d7a48c30c0303d723e8c942afe3bf99bb622a365", + "signedEip155": "0xf89c82016384530f336b85c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe8282c077a07984b5662bf52721770ca23a49f719f0dca47263a736a7cb6da28b359c3275d5a0080a94bd846cb4d5d71a41c78f5f4a893f9cd8316a52f3bba02b2e6d5865d13e", + "signedBerlin": "0x01f8e482602a82016384530f336b85c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe82f845d6943ace6cc41a8df5b6518b24e6ecd490c13acfc677c0d69465f3540a4a7aa93d074a77313622786513f0199dc0d6940dad5e012c02f680fb256bf6b0e0d9999c8c74a0c001a0a0983d54539712f6f848fe9fad8631479338d8277207d75ccf4a26ae3ed34e79a00acd07196e5fa670c9109ced9ccf4722f2c33ae49eec06f14ea3766c6d0e7c3e", + "signedLondon": "0x02f8e882602a82016382f9fe85c4550ba0e285c3393abf8e94d4ed79414a9f8bf363e9caaa5a74380716f7dbe0855590f0f87bad9421f8e15d313f08424f56798539e338ff345b530bef1256810200922813e50a176ca7e987dbedb94917acfe82f845d6943ace6cc41a8df5b6518b24e6ecd490c13acfc677c0d69465f3540a4a7aa93d074a77313622786513f0199dc0d6940dad5e012c02f680fb256bf6b0e0d9999c8c74a0c001a0990f968b8f06d13ac77614e1acd01591259050753e76bc7419062bdf6ac71a11a0201883043f4f176b82d7cc14ffd524f28fcf9cc490cea858bacac84d7373261a", + "signatureLegacy": { + "r": "0x3e5ece8f862a9b5d42b42c314dceef20c98a55ae8e89e76ea36574f2dbcd0a6f", + "s": "0x6cf670f45c89f30ccf175619d7a48c30c0303d723e8c942afe3bf99bb622a365", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x7984b5662bf52721770ca23a49f719f0dca47263a736a7cb6da28b359c3275d5", + "s": "0x080a94bd846cb4d5d71a41c78f5f4a893f9cd8316a52f3bba02b2e6d5865d13e", + "v": "0xc077" + }, + "signatureBerlin": { + "r": "0xa0983d54539712f6f848fe9fad8631479338d8277207d75ccf4a26ae3ed34e79", + "s": "0x0acd07196e5fa670c9109ced9ccf4722f2c33ae49eec06f14ea3766c6d0e7c3e", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x990f968b8f06d13ac77614e1acd01591259050753e76bc7419062bdf6ac71a11", + "s": "0x201883043f4f176b82d7cc14ffd524f28fcf9cc490cea858bacac84d7373261a", + "v": "0x1" + } + }, + { + "name": "random-15", + "transaction": { + "to": "0x2C4Ad0E9a08DD6fE31Ba497fd4a893A0C1fc6B34", + "nonce": 252, + "gasLimit": "0x50ef8434", + "gasPrice": "0xd9ca73", + "maxFeePerGas": "0x280244cd52ab", + "maxPriorityFeePerGas": "0x143b17", + "data": "0x59a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92d", + "value": "0x6f9f", + "accessList": [ + { + "address": "0x3266CE0AB053240CE5d95993d420c6b9a1dA1fDC", + "storageKeys": [ + "0xa0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211", + "0x80b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0", + "0xa628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8", + "0x35167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1" + ] + }, + { + "address": "0xf199b9f871065E2E18291CdeC3BF7C1eD32FBa0a", + "storageKeys": [ + "0xa0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211", + "0x80b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0", + "0xa628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8", + "0x35167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1" + ] + } + ], + "chainId": "0x18314c" + }, + "privateKey": "0xffe260f37af5da6e4a18799bc6b7f0fab7d57bc456346bca7261a53cb04fb48d", + "unsignedLegacy": "0xf85781fc83d9ca738450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92d", + "unsignedEip155": "0xf85d81fc83d9ca738450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92d8318314c8080", + "unsignedBerlin": "0x01f901988318314c81fc83d9ca738450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92df9013af89b943266ce0ab053240ce5d95993d420c6b9a1da1fdcf884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1f89b94f199b9f871065e2e18291cdec3bf7c1ed32fba0af884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1", + "unsignedLondon": "0x02f9019f8318314c81fc83143b1786280244cd52ab8450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92df9013af89b943266ce0ab053240ce5d95993d420c6b9a1da1fdcf884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1f89b94f199b9f871065e2e18291cdec3bf7c1ed32fba0af884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1", + "signedLegacy": "0xf89a81fc83d9ca738450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92d1ba0c32aaeca7f3f7d189f6493edfb99452baa5e5a4c3ba136275b92c28a722a59f7a07073e03733555ceb1a3479c3193cfac043530c657b1c26cf2d12ffac912d132d", + "signedEip155": "0xf89d81fc83d9ca738450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92d833062bca02a5acf0ccf63515e394899176fdc70cfc880e8f34ba5199de5baa72e0dc11e8fa07560075eef0250df34dd68a1854864b219ab0972e96e3d70017b21f608c5e928", + "signedBerlin": "0x01f901db8318314c81fc83d9ca738450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92df9013af89b943266ce0ab053240ce5d95993d420c6b9a1da1fdcf884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1f89b94f199b9f871065e2e18291cdec3bf7c1ed32fba0af884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b101a0c46f5930fbf08b22c97615c2d8db15697dfa5d0a269bb91a9afd7ddb7ac44768a066e4c7ad9c783be0dd722b4b85dc6518892f8c632c09b2ec2c0980c84fb897b7", + "signedLondon": "0x02f901e28318314c81fc83143b1786280244cd52ab8450ef8434942c4ad0e9a08dd6fe31ba497fd4a893a0c1fc6b34826f9fb359a1b826916e4a012ffaaf5e21251e27317a1f565a716b8ff184d8c689f93f5a7359abcbffd18d7bea36ee123ce5cddbbdd92df9013af89b943266ce0ab053240ce5d95993d420c6b9a1da1fdcf884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b1f89b94f199b9f871065e2e18291cdec3bf7c1ed32fba0af884a0a0568d48a6cc9e0c92080dec2155382a276181f25c746da97f8199f3a8464211a080b165a49183e897da692ca460c5c88a0597e5e4ad7b43471bac25bfd9a780e0a0a628e4d1cfbcc69964473b21b3df585f15eca27bdd2e0c0d7e2f1db3e2c0a1f8a035167ab9f9061b5f986f5c960aebe912340a5a72935aa334afa8fbfe586d05b180a0bdebff14388befbaf0d7c8509f82355aafd0cbdad7ba5d721fa6357e239cf380a06efc7089e04a05f4e52b43fb3799e6ebd9274128566e870efef293a9d8624271", + "signatureLegacy": { + "r": "0xc32aaeca7f3f7d189f6493edfb99452baa5e5a4c3ba136275b92c28a722a59f7", + "s": "0x7073e03733555ceb1a3479c3193cfac043530c657b1c26cf2d12ffac912d132d", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x2a5acf0ccf63515e394899176fdc70cfc880e8f34ba5199de5baa72e0dc11e8f", + "s": "0x7560075eef0250df34dd68a1854864b219ab0972e96e3d70017b21f608c5e928", + "v": "0x3062bc" + }, + "signatureBerlin": { + "r": "0xc46f5930fbf08b22c97615c2d8db15697dfa5d0a269bb91a9afd7ddb7ac44768", + "s": "0x66e4c7ad9c783be0dd722b4b85dc6518892f8c632c09b2ec2c0980c84fb897b7", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xbdebff14388befbaf0d7c8509f82355aafd0cbdad7ba5d721fa6357e239cf380", + "s": "0x6efc7089e04a05f4e52b43fb3799e6ebd9274128566e870efef293a9d8624271", + "v": "0x0" + } + }, + { + "name": "random-16", + "transaction": { + "to": "0xb26832F9Eebe1bb94cb67D5C6bABF358d15f834E", + "nonce": 306, + "gasLimit": "0xfb38", + "gasPrice": "0x7029692f45", + "maxFeePerGas": "0xf631d7b0a81f", + "maxPriorityFeePerGas": "0xb5", + "data": "0x3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b059629779", + "value": "0xb3", + "accessList": [ + { + "address": "0x820A408021ed575Bd94e89AF5672C9C4FaAA93AD", + "storageKeys": [] + } + ], + "chainId": "0x03" + }, + "privateKey": "0x504264c14141b98fdad31cff441c443d69458e4033c11eeb0b4928ce9452c5a1", + "unsignedLegacy": "0xf890820132857029692f4582fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b059629779", + "unsignedEip155": "0xf893820132857029692f4582fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b059629779038080", + "unsignedBerlin": "0x01f8a903820132857029692f4582fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b059629779d7d694820a408021ed575bd94e89af5672c9c4faaa93adc0", + "unsignedLondon": "0x02f8ac0382013281b586f631d7b0a81f82fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b059629779d7d694820a408021ed575bd94e89af5672c9c4faaa93adc0", + "signedLegacy": "0xf8d3820132857029692f4582fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b0596297791ca09eb445c3fb16cea6f435cca3fd89869351b0152442c77013ee2787ab9363c64fa012daa8f1bbc55ef013376a0b10a608634e9fe03ce051bcf11874132f4b37b1c1", + "signedEip155": "0xf8d3820132857029692f4582fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b05962977929a03aacb5053d4586e75d7c2f59a16aa559f1b335a1e5b81d5e04ee3f10370e0b78a00c4062ee9c4f3c10b72331bdbbe8b8f896cecaa7f79d291dca3cb6182473d6f3", + "signedBerlin": "0x01f8ec03820132857029692f4582fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b059629779d7d694820a408021ed575bd94e89af5672c9c4faaa93adc080a0cc30fef0ed85c2d3df5dae8321402cd6ee6cfec5778a191674d295a861be14b3a00874a36ad883e39d70744772063a504ff5887f020ece23afa159ec3d092f7dac", + "signedLondon": "0x02f8ef0382013281b586f631d7b0a81f82fb3894b26832f9eebe1bb94cb67d5c6babf358d15f834e81b3b86b3c5c6cbe06f0c46868590f0951afc1b55f38598f5caf4d2f811ed3bbb8a87de83f074bc2cf19ca7225a65533cbe03aed1f43fa7cd1ef178e1ec2de6076d3ec1a22729c8645de5442bc8e3c3c7781d68293d34ae667c247189089a4959ef7c0d35e4600be23b5b059629779d7d694820a408021ed575bd94e89af5672c9c4faaa93adc080a0fe006607f7e8089cc51cafca96b281cd8c3a95d6f88a5a1175b3a8cc958b6b74a0105054c0d7d120b19d8eb03a67dccd82c2add7b8c04e6438fd30ab6e31cd4364", + "signatureLegacy": { + "r": "0x9eb445c3fb16cea6f435cca3fd89869351b0152442c77013ee2787ab9363c64f", + "s": "0x12daa8f1bbc55ef013376a0b10a608634e9fe03ce051bcf11874132f4b37b1c1", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x3aacb5053d4586e75d7c2f59a16aa559f1b335a1e5b81d5e04ee3f10370e0b78", + "s": "0x0c4062ee9c4f3c10b72331bdbbe8b8f896cecaa7f79d291dca3cb6182473d6f3", + "v": "0x29" + }, + "signatureBerlin": { + "r": "0xcc30fef0ed85c2d3df5dae8321402cd6ee6cfec5778a191674d295a861be14b3", + "s": "0x0874a36ad883e39d70744772063a504ff5887f020ece23afa159ec3d092f7dac", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xfe006607f7e8089cc51cafca96b281cd8c3a95d6f88a5a1175b3a8cc958b6b74", + "s": "0x105054c0d7d120b19d8eb03a67dccd82c2add7b8c04e6438fd30ab6e31cd4364", + "v": "0x0" + } + }, + { + "name": "random-17", + "transaction": { + "to": "0x7b9830530eFD81a5BB21Ed03A1E20ac977c13003", + "nonce": 103, + "gasLimit": "0xa193e9", + "gasPrice": "0xfcb9", + "maxFeePerGas": "0x9288e311910556", + "maxPriorityFeePerGas": "0xac", + "data": "0xee2035dab48b94002f3fa4ba662590127a2fcb9e978af4", + "value": "0xf9eff8", + "accessList": [ + { + "address": "0x469ED43B08A100e13e84b7746fA7206d3A11a5F7", + "storageKeys": [ + "0x434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950", + "0x56498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5", + "0xe83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e" + ] + }, + { + "address": "0x588C330B029E06B820Dfb1d3a5b774EdcF6a9FEE", + "storageKeys": [ + "0x434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950", + "0x56498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5", + "0xe83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e" + ] + }, + { + "address": "0xd7Bb918eB068B37E44b12A19402F5112dE656566", + "storageKeys": [ + "0x434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950", + "0x56498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5", + "0xe83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e" + ] + }, + { + "address": "0x29EFB653e6b98eA36995EC81968b0EAC36678A60", + "storageKeys": [ + "0x434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950", + "0x56498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5", + "0xe83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e" + ] + } + ], + "chainId": "0x6653a6" + }, + "privateKey": "0x58f3d57fde2c0dae771d5cb66092b8905ba5691226740d7398459c60712a5793", + "unsignedLegacy": "0xf8396782fcb983a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af4", + "unsignedEip155": "0xf83f6782fcb983a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af4836653a68080", + "unsignedBerlin": "0x01f90230836653a66782fcb983a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af4f901f0f87a94469ed43b08a100e13e84b7746fa7206d3a11a5f7f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94588c330b029e06b820dfb1d3a5b774edcf6a9feef863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94d7bb918eb068b37e44b12a19402f5112de656566f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a9429efb653e6b98ea36995ec81968b0eac36678a60f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e", + "unsignedLondon": "0x02f90237836653a66781ac879288e31191055683a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af4f901f0f87a94469ed43b08a100e13e84b7746fa7206d3a11a5f7f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94588c330b029e06b820dfb1d3a5b774edcf6a9feef863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94d7bb918eb068b37e44b12a19402f5112de656566f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a9429efb653e6b98ea36995ec81968b0eac36678a60f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e", + "signedLegacy": "0xf87c6782fcb983a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af41ca0b889cf400786bc43a9bc32317a5368a1f0898b5f60fec9c4da7931867fe5c3fca06dd97c8b894c3a14ec5099eaa39b76f369f49c0ad9330dd852f797b22fb6962e", + "signedEip155": "0xf87f6782fcb983a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af483cca770a04ad07bd0c147962802aee8e943f48a5adfadbc5d14c502e10fe108b6a3206691a039150202e4bacfbda9757c56c93858d0dc2ae5c36d69e7f5d61e6d2fb9a4d7e0", + "signedBerlin": "0x01f90273836653a66782fcb983a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af4f901f0f87a94469ed43b08a100e13e84b7746fa7206d3a11a5f7f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94588c330b029e06b820dfb1d3a5b774edcf6a9feef863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94d7bb918eb068b37e44b12a19402f5112de656566f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a9429efb653e6b98ea36995ec81968b0eac36678a60f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e80a0bbeb29da87bb1efcc76efc18dc3fb4d06c2fbe9d0a8695e3bc887f84ab35796ea046f04724d13b40f6e5f8ca963862c821857f58772169706ab4a286feec54196f", + "signedLondon": "0x02f9027a836653a66781ac879288e31191055683a193e9947b9830530efd81a5bb21ed03a1e20ac977c1300383f9eff897ee2035dab48b94002f3fa4ba662590127a2fcb9e978af4f901f0f87a94469ed43b08a100e13e84b7746fa7206d3a11a5f7f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94588c330b029e06b820dfb1d3a5b774edcf6a9feef863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a94d7bb918eb068b37e44b12a19402f5112de656566f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94ef87a9429efb653e6b98ea36995ec81968b0eac36678a60f863a0434cab87455b41c8023691c4e836ec1e1d90fd639e1207274b07574059394950a056498d76fcc165010f94437317015d8a9a939ab1fd21216c5fcfed335f5d6ad5a0e83f7815e6bf7d521dd0341e9445415ab565b2471ab4dbbf0a0ddcc564bdb94e80a0d6593cf036acec58fa43ac9b1a19b961b26acf1b27f23ed3cfa5fc2dd63b1b73a06cf24189b044480b469c1b6bbe97bd3caf522e0a9c141d9d8a5b7e5ad225bebc", + "signatureLegacy": { + "r": "0xb889cf400786bc43a9bc32317a5368a1f0898b5f60fec9c4da7931867fe5c3fc", + "s": "0x6dd97c8b894c3a14ec5099eaa39b76f369f49c0ad9330dd852f797b22fb6962e", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x4ad07bd0c147962802aee8e943f48a5adfadbc5d14c502e10fe108b6a3206691", + "s": "0x39150202e4bacfbda9757c56c93858d0dc2ae5c36d69e7f5d61e6d2fb9a4d7e0", + "v": "0xcca770" + }, + "signatureBerlin": { + "r": "0xbbeb29da87bb1efcc76efc18dc3fb4d06c2fbe9d0a8695e3bc887f84ab35796e", + "s": "0x46f04724d13b40f6e5f8ca963862c821857f58772169706ab4a286feec54196f", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xd6593cf036acec58fa43ac9b1a19b961b26acf1b27f23ed3cfa5fc2dd63b1b73", + "s": "0x6cf24189b044480b469c1b6bbe97bd3caf522e0a9c141d9d8a5b7e5ad225bebc", + "v": "0x0" + } + }, + { + "name": "random-18", + "transaction": { + "to": "0x0bbe326563703D26cB074Ef29Ed04404Ab1Fd0cC", + "nonce": 503, + "gasLimit": "0xa5cdc1", + "gasPrice": "0x2a", + "maxFeePerGas": "0x52b5f1114c1a", + "maxPriorityFeePerGas": "0x59d1ad", + "data": "0xb477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a871", + "value": "0x8a1d", + "accessList": [ + { + "address": "0x47421DbF48444B1c15748fFB721AC9b341c35347", + "storageKeys": [ + "0x1e4e2be542b128bf053d245b5efe9be008785740189d3b5b2324a395630c3279", + "0xed8dbc976b685b16dc203291d38dd688d247ae09d2fea99189d5171ddcd7c90e", + "0x4ba4902e9df30d2ea5dc662cfa7887d327dc09fcd28d3dbf5c64f5e78f5e599b" + ] + } + ], + "chainId": "0x27" + }, + "privateKey": "0xea795d7cacc6025f7bd6650aedd689f688617f9d8ca86236fa8ca5e654b767c4", + "unsignedLegacy": "0xf8418201f72a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a871", + "unsignedEip155": "0xf8448201f72a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a871278080", + "unsignedBerlin": "0x01f8c0278201f72a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a871f87cf87a9447421dbf48444b1c15748ffb721ac9b341c35347f863a01e4e2be542b128bf053d245b5efe9be008785740189d3b5b2324a395630c3279a0ed8dbc976b685b16dc203291d38dd688d247ae09d2fea99189d5171ddcd7c90ea04ba4902e9df30d2ea5dc662cfa7887d327dc09fcd28d3dbf5c64f5e78f5e599b", + "unsignedLondon": "0x02f8ca278201f78359d1ad8652b5f1114c1a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a871f87cf87a9447421dbf48444b1c15748ffb721ac9b341c35347f863a01e4e2be542b128bf053d245b5efe9be008785740189d3b5b2324a395630c3279a0ed8dbc976b685b16dc203291d38dd688d247ae09d2fea99189d5171ddcd7c90ea04ba4902e9df30d2ea5dc662cfa7887d327dc09fcd28d3dbf5c64f5e78f5e599b", + "signedLegacy": "0xf8848201f72a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a8711ca0c888e9068c768fa7d14a6298902c6b4be841794498ab8f5a5b4ec8027197ee14a04561fbe2803fd2d4ffd8f491c6371816b213832776a93dc48c922887e8bbc671", + "signedEip155": "0xf8848201f72a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a87172a052aea6be6b07d11486dc584c42cf1bd34ff8ec9096894fbd34cb7cc0d1aecce8a074220e1ac0c3ef2b2b60d1dea95db96d17872e1a55dc55b4835333d2c4ecdf95", + "signedBerlin": "0x01f90103278201f72a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a871f87cf87a9447421dbf48444b1c15748ffb721ac9b341c35347f863a01e4e2be542b128bf053d245b5efe9be008785740189d3b5b2324a395630c3279a0ed8dbc976b685b16dc203291d38dd688d247ae09d2fea99189d5171ddcd7c90ea04ba4902e9df30d2ea5dc662cfa7887d327dc09fcd28d3dbf5c64f5e78f5e599b80a0e6a87722ab1ce90d062a73fe2fe3ebf7135d9b3946b7bd7edb3b4b298504e8c5a01cfad4408ddaa8e38d031b99277a81b7cd118f760acc8946b5025d2d77200197", + "signedLondon": "0x02f9010d278201f78359d1ad8652b5f1114c1a83a5cdc1940bbe326563703d26cb074ef29ed04404ab1fd0cc828a1da0b477bf440adf79ace31d2590393c7bbd5c191c2e40b4523e94b9c75afce3a871f87cf87a9447421dbf48444b1c15748ffb721ac9b341c35347f863a01e4e2be542b128bf053d245b5efe9be008785740189d3b5b2324a395630c3279a0ed8dbc976b685b16dc203291d38dd688d247ae09d2fea99189d5171ddcd7c90ea04ba4902e9df30d2ea5dc662cfa7887d327dc09fcd28d3dbf5c64f5e78f5e599b01a0f8825407a5607db5184718258869e3ba1eef9bd4c1bf4826315cfc8693593894a07aad01abea832c052973a749a3a623d63922fbbb090f5bbdb4582992d5bd508f", + "signatureLegacy": { + "r": "0xc888e9068c768fa7d14a6298902c6b4be841794498ab8f5a5b4ec8027197ee14", + "s": "0x4561fbe2803fd2d4ffd8f491c6371816b213832776a93dc48c922887e8bbc671", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x52aea6be6b07d11486dc584c42cf1bd34ff8ec9096894fbd34cb7cc0d1aecce8", + "s": "0x74220e1ac0c3ef2b2b60d1dea95db96d17872e1a55dc55b4835333d2c4ecdf95", + "v": "0x72" + }, + "signatureBerlin": { + "r": "0xe6a87722ab1ce90d062a73fe2fe3ebf7135d9b3946b7bd7edb3b4b298504e8c5", + "s": "0x1cfad4408ddaa8e38d031b99277a81b7cd118f760acc8946b5025d2d77200197", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xf8825407a5607db5184718258869e3ba1eef9bd4c1bf4826315cfc8693593894", + "s": "0x7aad01abea832c052973a749a3a623d63922fbbb090f5bbdb4582992d5bd508f", + "v": "0x1" + } + }, + { + "name": "random-19", + "transaction": { + "to": "0x6D9186AD35Ba39086D341c03B212a22dAd55A70c", + "nonce": 47, + "gasLimit": "0x8e2d", + "gasPrice": "0xed", + "maxFeePerGas": "0x8f001cace664", + "maxPriorityFeePerGas": "0x86495d", + "data": "0xa6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad9", + "value": "0x4028", + "accessList": [ + { + "address": "0x27CBC99f4161665Fc37a013015B0B99A959f6fcb", + "storageKeys": [] + }, + { + "address": "0x296e9Be34584A14761c7b4cE82E99d4394A5f109", + "storageKeys": [] + }, + { + "address": "0xeD1C55cDE477E627081Ac4D17376f4Bf9A2dc51E", + "storageKeys": [] + }, + { + "address": "0x7a46971171Aa87E7Ef026C381053940714f4Ad91", + "storageKeys": [] + } + ], + "chainId": "0xf9bf2e" + }, + "privateKey": "0x1b01010d8955e5cecc6705b73064baa37a703d65cb970a5b97c1cc9b76aa9473", + "unsignedLegacy": "0xf89d2f81ed828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad9", + "unsignedEip155": "0xf8a32f81ed828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad983f9bf2e8080", + "unsignedBerlin": "0x01f8ff83f9bf2e2f81ed828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad9f85cd69427cbc99f4161665fc37a013015b0b99a959f6fcbc0d694296e9be34584a14761c7b4ce82e99d4394a5f109c0d694ed1c55cde477e627081ac4d17376f4bf9a2dc51ec0d6947a46971171aa87e7ef026c381053940714f4ad91c0", + "unsignedLondon": "0x02f9010883f9bf2e2f8386495d868f001cace664828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad9f85cd69427cbc99f4161665fc37a013015b0b99a959f6fcbc0d694296e9be34584a14761c7b4ce82e99d4394a5f109c0d694ed1c55cde477e627081ac4d17376f4bf9a2dc51ec0d6947a46971171aa87e7ef026c381053940714f4ad91c0", + "signedLegacy": "0xf8e02f81ed828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad91ba0804162984a09f440a312f2231b192dc7b43fb49546ede924e1ef2b4b54abcd31a04635d7370c171b9e6ac7fa3bca544d0c227d32f0a1c5d065cc0bb02b79e8eaa1", + "signedEip155": "0xf8e42f81ed828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad98401f37e80a05914063f10cf79eea0d3c5cf10bf7765ffc648638c656ddf0c678057b6d570aaa00a89d79bcfa95f96290ec7938ab7c5552423736a16e0a39d84b140c5307a8bab", + "signedBerlin": "0x01f9014283f9bf2e2f81ed828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad9f85cd69427cbc99f4161665fc37a013015b0b99a959f6fcbc0d694296e9be34584a14761c7b4ce82e99d4394a5f109c0d694ed1c55cde477e627081ac4d17376f4bf9a2dc51ec0d6947a46971171aa87e7ef026c381053940714f4ad91c080a0888f5e0b4c258b4f7c488d4e1f7dafc82d7835381b5470bc1e9571ad6bd21929a07a8a19227f4f2cb93bccbc7b4bcb0b731701a0284df8ed3fb90936e6ac0a18d1", + "signedLondon": "0x02f9014b83f9bf2e2f8386495d868f001cace664828e2d946d9186ad35ba39086d341c03b212a22dad55a70c824028b87da6e0079be77374ee2617550eadd15e206a8c7eb76eca2de96d48c4824b4646206720dfeb24956f1e712b58b9ef96fc92e637cf4c30614d86532d3110f670c5a70e5bdeef3dc5cf94ef8d3afffc50151c00a5ad1289fae8168bb120e9dbdb24c422eacfc4d8291c6dc942a872545c76b5c697806c84f478d361026a2ad9f85cd69427cbc99f4161665fc37a013015b0b99a959f6fcbc0d694296e9be34584a14761c7b4ce82e99d4394a5f109c0d694ed1c55cde477e627081ac4d17376f4bf9a2dc51ec0d6947a46971171aa87e7ef026c381053940714f4ad91c001a0f9ba41389da7c4a5471d8af8235fb765d90ec76b370516ec0108d43eda880c84a00bca4f8cb35a6023cbeee50d38e0b62588b6cfc47d3e8023413f2bdfb04f3a8e", + "signatureLegacy": { + "r": "0x804162984a09f440a312f2231b192dc7b43fb49546ede924e1ef2b4b54abcd31", + "s": "0x4635d7370c171b9e6ac7fa3bca544d0c227d32f0a1c5d065cc0bb02b79e8eaa1", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x5914063f10cf79eea0d3c5cf10bf7765ffc648638c656ddf0c678057b6d570aa", + "s": "0x0a89d79bcfa95f96290ec7938ab7c5552423736a16e0a39d84b140c5307a8bab", + "v": "0x1f37e80" + }, + "signatureBerlin": { + "r": "0x888f5e0b4c258b4f7c488d4e1f7dafc82d7835381b5470bc1e9571ad6bd21929", + "s": "0x7a8a19227f4f2cb93bccbc7b4bcb0b731701a0284df8ed3fb90936e6ac0a18d1", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xf9ba41389da7c4a5471d8af8235fb765d90ec76b370516ec0108d43eda880c84", + "s": "0x0bca4f8cb35a6023cbeee50d38e0b62588b6cfc47d3e8023413f2bdfb04f3a8e", + "v": "0x1" + } + }, + { + "name": "random-20", + "transaction": { + "to": "0x60fC630156D46bF9b1BF5B7d251C6CbE64702BF3", + "nonce": 812, + "gasLimit": "0xe010b5", + "gasPrice": "0x41f1af255d", + "maxFeePerGas": "0xc2214fa5", + "maxPriorityFeePerGas": "0x4a", + "data": "0x647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d94", + "value": "0x6e7b", + "accessList": [ + { + "address": "0x36aAaa454aAB9A9409b890C32E9304C42EC8b05A", + "storageKeys": [] + }, + { + "address": "0x7F7Ac0f60Be35f1e8F7c70A7AA5d596bC7648745", + "storageKeys": [] + }, + { + "address": "0xf9Fb9Bb09b08C0Fa137E76615BBd50B5cc63BCc4", + "storageKeys": [] + }, + { + "address": "0x69C6c93f57A0C11a765F2B9076a9575c4b015d03", + "storageKeys": [] + } + ], + "chainId": "0x08454b" + }, + "privateKey": "0x6efb2ce4981ad5555974b8b6b4f767d774c32f9e09e0009d5d914e29614ec739", + "unsignedLegacy": "0xf89e82032c8541f1af255d83e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d94", + "unsignedEip155": "0xf8a482032c8541f1af255d83e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d948308454b8080", + "unsignedBerlin": "0x01f901008308454b82032c8541f1af255d83e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d94f85cd69436aaaa454aab9a9409b890c32e9304c42ec8b05ac0d6947f7ac0f60be35f1e8f7c70a7aa5d596bc7648745c0d694f9fb9bb09b08c0fa137e76615bbd50b5cc63bcc4c0d69469c6c93f57a0c11a765f2b9076a9575c4b015d03c0", + "unsignedLondon": "0x02f901008308454b82032c4a84c2214fa583e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d94f85cd69436aaaa454aab9a9409b890c32e9304c42ec8b05ac0d6947f7ac0f60be35f1e8f7c70a7aa5d596bc7648745c0d694f9fb9bb09b08c0fa137e76615bbd50b5cc63bcc4c0d69469c6c93f57a0c11a765f2b9076a9575c4b015d03c0", + "signedLegacy": "0xf8e182032c8541f1af255d83e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d941ca0707fd3dbc3b260752493e64be389a2689bf3b8b181a4e7baa7eeb0176ba84283a04868672b9d487c34906166770fd51f0598b026b3368bb5f4d0a99ca4fc0706e9", + "signedEip155": "0xf8e482032c8541f1af255d83e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d9483108abaa014c49179d7be5caf2590610b76eeace610c536ff3e1d1eab3b43c164fe90e472a06bb4caad9a679371ce6527da4f3a404d3cd1b36712a47774112f19add1ca4d2e", + "signedBerlin": "0x01f901438308454b82032c8541f1af255d83e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d94f85cd69436aaaa454aab9a9409b890c32e9304c42ec8b05ac0d6947f7ac0f60be35f1e8f7c70a7aa5d596bc7648745c0d694f9fb9bb09b08c0fa137e76615bbd50b5cc63bcc4c0d69469c6c93f57a0c11a765f2b9076a9575c4b015d03c001a0b445c3c80cfa7df6401a7f0c46094a0fcb63749ff073b44d72c6d1f88f5212a6a07d418e8c1f5bb3a928ea11e3049943f7c60bacbaef1c78c90f9899331574336e", + "signedLondon": "0x02f901438308454b82032c4a84c2214fa583e010b59460fc630156d46bf9b1bf5b7d251c6cbe64702bf3826e7bb877647daf6b789306d2daeb51be942c40d66194d5e0e9dca946aa830d686d493c1d1a07090d9cde8d73c6b982f5d00161b6ee0b302cdc24f29ebd146e99149adc7666f4d1d12146f077cc6e7f78addae71d399b445a14ff15a67efb8f39dcfd32af41968639dd3665d282e4065caef58441e6ac3ebc4b8d94f85cd69436aaaa454aab9a9409b890c32e9304c42ec8b05ac0d6947f7ac0f60be35f1e8f7c70a7aa5d596bc7648745c0d694f9fb9bb09b08c0fa137e76615bbd50b5cc63bcc4c0d69469c6c93f57a0c11a765f2b9076a9575c4b015d03c080a0dafce44a782685fd338895386a5b13b4183706b3621c55b92dc0e43b3dd947d0a0697a9b17a80710efd85c62104a68156c67399c69b50bc951c4888a2f6446cad4", + "signatureLegacy": { + "r": "0x707fd3dbc3b260752493e64be389a2689bf3b8b181a4e7baa7eeb0176ba84283", + "s": "0x4868672b9d487c34906166770fd51f0598b026b3368bb5f4d0a99ca4fc0706e9", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x14c49179d7be5caf2590610b76eeace610c536ff3e1d1eab3b43c164fe90e472", + "s": "0x6bb4caad9a679371ce6527da4f3a404d3cd1b36712a47774112f19add1ca4d2e", + "v": "0x108aba" + }, + "signatureBerlin": { + "r": "0xb445c3c80cfa7df6401a7f0c46094a0fcb63749ff073b44d72c6d1f88f5212a6", + "s": "0x7d418e8c1f5bb3a928ea11e3049943f7c60bacbaef1c78c90f9899331574336e", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xdafce44a782685fd338895386a5b13b4183706b3621c55b92dc0e43b3dd947d0", + "s": "0x697a9b17a80710efd85c62104a68156c67399c69b50bc951c4888a2f6446cad4", + "v": "0x0" + } + }, + { + "name": "random-22", + "transaction": { + "to": "0x3EeaD538405af1E9715eF7Ef27e9Ecd9FD85966d", + "nonce": 524, + "gasLimit": "0xf78a2b", + "gasPrice": "0xab54814774", + "maxFeePerGas": "0x933edd83", + "maxPriorityFeePerGas": "0x620be6", + "data": "0x64f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be4", + "value": "0x3028b71dff", + "accessList": [ + { + "address": "0xfbFcb3B14f834e21f104979F550EA5C6f9917bf3", + "storageKeys": [ + "0x133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209" + ] + }, + { + "address": "0xdA6219fFFE19545Fb89fB47A28A68E7bB978Ae4b", + "storageKeys": [ + "0x133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209" + ] + }, + { + "address": "0x5B4bBA3F79A3fcF5fcBEeAFc38571D72f039660D", + "storageKeys": [ + "0x133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209" + ] + } + ], + "chainId": "0x96bf694bb4" + }, + "privateKey": "0x5f02e67d44e5363b38914b63ccfe012685ce3d2e65121a050eb869209c1ee3d0", + "unsignedLegacy": "0xf84982020c85ab5481477483f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be4", + "unsignedEip155": "0xf85182020c85ab5481477483f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be48596bf694bb48080", + "unsignedBerlin": "0x01f8f98596bf694bb482020c85ab5481477483f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be4f8a8f794fbfcb3b14f834e21f104979f550ea5c6f9917bf3e1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f794da6219fffe19545fb89fb47a28a68e7bb978ae4be1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f7945b4bba3f79a3fcf5fcbeeafc38571d72f039660de1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209", + "unsignedLondon": "0x02f8fc8596bf694bb482020c83620be684933edd8383f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be4f8a8f794fbfcb3b14f834e21f104979f550ea5c6f9917bf3e1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f794da6219fffe19545fb89fb47a28a68e7bb978ae4be1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f7945b4bba3f79a3fcf5fcbeeafc38571d72f039660de1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209", + "signedLegacy": "0xf88c82020c85ab5481477483f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be41ba050f88ecfab80f64dcc70c6a2570284072cac3946b09836d468eeef525484734ea0283c116d864d66680b60b35bea97b97cc691f5d4b23b8caa58a28db65ef4fc41", + "signedEip155": "0xf89282020c85ab5481477483f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be486012d7ed2978ca04dd4a600b5bc18da318ba8fdbca617598159ee3420354dacdb7fc5730dd2b74ea047d47d63e6f92b4221ab7b86cd63540bf14bbafda10df3096721ce468ad57e11", + "signedBerlin": "0x01f9013c8596bf694bb482020c85ab5481477483f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be4f8a8f794fbfcb3b14f834e21f104979f550ea5c6f9917bf3e1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f794da6219fffe19545fb89fb47a28a68e7bb978ae4be1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f7945b4bba3f79a3fcf5fcbeeafc38571d72f039660de1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f20980a0fd1a19c355394f6b6d7adba72660878ef8b1b75d8ecc03a003badfdacf17a821a03a30dcead31009099b34f7611c2182adb49cf1d69a3de8131b1db15d7cac0eab", + "signedLondon": "0x02f9013f8596bf694bb482020c83620be684933edd8383f78a2b943eead538405af1e9715ef7ef27e9ecd9fd85966d853028b71dffa064f75ffaff53fc0e7030aed910e80d5396eda41fdc1bf8f351ee7e5e46fc9be4f8a8f794fbfcb3b14f834e21f104979f550ea5c6f9917bf3e1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f794da6219fffe19545fb89fb47a28a68e7bb978ae4be1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f209f7945b4bba3f79a3fcf5fcbeeafc38571d72f039660de1a0133608308a4992cd937928afb6f8048fb448b7504bcce324addceda39d36f20980a0d99ac0fbc8916aef1ab64c4eb89f982048033e20d165dc9c818510c8372bee37a0145d46622a7b96ca74f7ba25c79bd55b4d3b78aea7026bfe5603a345fc1be85c", + "signatureLegacy": { + "r": "0x50f88ecfab80f64dcc70c6a2570284072cac3946b09836d468eeef525484734e", + "s": "0x283c116d864d66680b60b35bea97b97cc691f5d4b23b8caa58a28db65ef4fc41", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x4dd4a600b5bc18da318ba8fdbca617598159ee3420354dacdb7fc5730dd2b74e", + "s": "0x47d47d63e6f92b4221ab7b86cd63540bf14bbafda10df3096721ce468ad57e11", + "v": "0x12d7ed2978c" + }, + "signatureBerlin": { + "r": "0xfd1a19c355394f6b6d7adba72660878ef8b1b75d8ecc03a003badfdacf17a821", + "s": "0x3a30dcead31009099b34f7611c2182adb49cf1d69a3de8131b1db15d7cac0eab", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xd99ac0fbc8916aef1ab64c4eb89f982048033e20d165dc9c818510c8372bee37", + "s": "0x145d46622a7b96ca74f7ba25c79bd55b4d3b78aea7026bfe5603a345fc1be85c", + "v": "0x0" + } + }, + { + "name": "random-23", + "transaction": { + "to": "0x250b57d24dEd36525C873c672D0766e136D56820", + "nonce": 287, + "gasLimit": "0x56263e1c", + "gasPrice": "0x1c", + "maxFeePerGas": "0xb998f63a", + "maxPriorityFeePerGas": "0x54", + "data": "0xc7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a3", + "value": "0x121d7531", + "accessList": [], + "chainId": "0x184c7a" + }, + "privateKey": "0xabce7ed3e3cc9591b447a56e476ef3e14f05b67e3d5ffb7a5240e9754b2cf68f", + "unsignedLegacy": "0xf85282011f1c8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a3", + "unsignedEip155": "0xf85882011f1c8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a383184c7a8080", + "unsignedBerlin": "0x01f85783184c7a82011f1c8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a3c0", + "unsignedLondon": "0x02f85c83184c7a82011f5484b998f63a8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a3c0", + "signedLegacy": "0xf89582011f1c8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a31ba0dcfd0e45ae4d78e53dc517fe6941859969e52e5ba7692310c9b63d65c1075973a0261af27653a8894a6b6d5f4183f5ba951456c398947a3a822b3235869b583882", + "signedEip155": "0xf89882011f1c8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a383309918a0e6d4a159292d73bec5ddd040560252c891c4bda809e23636a5dfd41b9c649a6da043ca10498511a3671ac84dbd78fd643b9c79fff3b8121835624d864def928169", + "signedBerlin": "0x01f89a83184c7a82011f1c8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a3c080a08a979d9861c813a67d5122cb847731c95cf3912b74956c5a3e689267df2d0a6fa061c9a96aa7b45b2b70817617e3ba592421b66cdd2e2f21e372e226839a19245e", + "signedLondon": "0x02f89f83184c7a82011f5484b998f63a8456263e1c94250b57d24ded36525c873c672d0766e136d5682084121d7531aec7333a6694328c9056423b4ca4f74b2bc4e04332d128de428c037a5c21174f0bf6d889fd4199d1c5904c1676b9a3c001a0026e8dccb910486d101371a358cea6ddec054efe4acfadfc0a4103c3f65fe1c3a058ab825b4a2faf3f1c37934f92f1f7bb071cdfc7bde044796b40fa823ce677a6", + "signatureLegacy": { + "r": "0xdcfd0e45ae4d78e53dc517fe6941859969e52e5ba7692310c9b63d65c1075973", + "s": "0x261af27653a8894a6b6d5f4183f5ba951456c398947a3a822b3235869b583882", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xe6d4a159292d73bec5ddd040560252c891c4bda809e23636a5dfd41b9c649a6d", + "s": "0x43ca10498511a3671ac84dbd78fd643b9c79fff3b8121835624d864def928169", + "v": "0x309918" + }, + "signatureBerlin": { + "r": "0x8a979d9861c813a67d5122cb847731c95cf3912b74956c5a3e689267df2d0a6f", + "s": "0x61c9a96aa7b45b2b70817617e3ba592421b66cdd2e2f21e372e226839a19245e", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x026e8dccb910486d101371a358cea6ddec054efe4acfadfc0a4103c3f65fe1c3", + "s": "0x58ab825b4a2faf3f1c37934f92f1f7bb071cdfc7bde044796b40fa823ce677a6", + "v": "0x1" + } + }, + { + "name": "random-24", + "transaction": { + "to": "0x598EebD2F9A25472fD69820f0CCA768875cBbeEc", + "nonce": 392, + "gasLimit": "0xea0d56", + "gasPrice": "0xb81f5f33", + "maxFeePerGas": "0xc1f6d69235", + "maxPriorityFeePerGas": "0xb8", + "data": "0xe50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219d", + "value": "0x60d1", + "accessList": [], + "chainId": "0xc2" + }, + "privateKey": "0xf40e65e608c7a41a2812f302436d74f6322e3d24f7d0894d445bfbd8fa199050", + "unsignedLegacy": "0xf87282018884b81f5f3383ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219d", + "unsignedEip155": "0xf87682018884b81f5f3383ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219d81c28080", + "unsignedBerlin": "0x01f87581c282018884b81f5f3383ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219dc0", + "unsignedLondon": "0x02f87881c282018881b885c1f6d6923583ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219dc0", + "signedLegacy": "0xf8b582018884b81f5f3383ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219d1ca0f54e699c658c14a9d324aa9c0a7f11b29225340ebf39494ed719ede2d3cd19d1a034ad07b2b5eb010eeabdd7ad9688cce5095b073b70ee54cfff785689c7b7e488", + "signedEip155": "0xf8b782018884b81f5f3383ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219d8201a8a0e91ac04de39d06a938fb6e21fc0b03ad2940e1ce6aa8d48817a51376acb2a209a0065d0ef3f4ef9c6c5c08133b0ff7bcdacffea35fa08ee7478a6f7f3719c81e03", + "signedBerlin": "0x01f8b881c282018884b81f5f3383ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219dc080a0eb9b9355f5aa190f507eb76b87e95e63d7c9f11104ce451bf456b5dc02157d70a041f645283f1e7cf7dcccc74945c557699f1949d1ef7f86f55dff2380651b0c3e", + "signedLondon": "0x02f8bb81c282018881b885c1f6d6923583ea0d5694598eebd2f9a25472fd69820f0cca768875cbbeec8260d1b84ce50c65fb865722ebddf1090ab06faa55d174ac4f87be35133cd12ccdace4aea5730ad26b05af094ca97699f862126e8775bc5f9d815a71b7dec5e1cc1a31d3553f90d725a7008c2e83cc219dc080a037aa4254ae9e2741828440cfdc7465a05103423a06ffb37f2c83682585163be0a046099869dfc2d52dd4f123c7211ff8a2717188f5b075853e55c3996beb884f80", + "signatureLegacy": { + "r": "0xf54e699c658c14a9d324aa9c0a7f11b29225340ebf39494ed719ede2d3cd19d1", + "s": "0x34ad07b2b5eb010eeabdd7ad9688cce5095b073b70ee54cfff785689c7b7e488", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xe91ac04de39d06a938fb6e21fc0b03ad2940e1ce6aa8d48817a51376acb2a209", + "s": "0x065d0ef3f4ef9c6c5c08133b0ff7bcdacffea35fa08ee7478a6f7f3719c81e03", + "v": "0x1a8" + }, + "signatureBerlin": { + "r": "0xeb9b9355f5aa190f507eb76b87e95e63d7c9f11104ce451bf456b5dc02157d70", + "s": "0x41f645283f1e7cf7dcccc74945c557699f1949d1ef7f86f55dff2380651b0c3e", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x37aa4254ae9e2741828440cfdc7465a05103423a06ffb37f2c83682585163be0", + "s": "0x46099869dfc2d52dd4f123c7211ff8a2717188f5b075853e55c3996beb884f80", + "v": "0x0" + } + }, + { + "name": "random-25", + "transaction": { + "to": "0xCF3Aae72e10af9157ca91a07aacB76FF5F4E714b", + "nonce": 941, + "gasLimit": "0x4e2767a5", + "gasPrice": "0xb7dbab6d", + "maxFeePerGas": "0x917fe51b9396d7", + "maxPriorityFeePerGas": "0x00c0f6", + "data": "0x151c1c2efc8678b90a90db505c748b8a3af7c2de", + "value": "0x40a3c72c", + "accessList": [ + { + "address": "0x5382A3B7AE58E3b83ed04B361Dd24e858604e086", + "storageKeys": [ + "0xf9f0fff83c5992655ea60b4ee4d87962402cf1e24ad838b2dff3ce1ceb5cf89d" + ] + } + ], + "chainId": "0x8080" + }, + "privateKey": "0xe81f01e0b6a747274a2c74800e1c5e8d98e793c508605de14b557517086a154a", + "unsignedLegacy": "0xf83c8203ad84b7dbab6d844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2de", + "unsignedEip155": "0xf8418203ad84b7dbab6d844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2de8280808080", + "unsignedBerlin": "0x01f8798280808203ad84b7dbab6d844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2def838f7945382a3b7ae58e3b83ed04b361dd24e858604e086e1a0f9f0fff83c5992655ea60b4ee4d87962402cf1e24ad838b2dff3ce1ceb5cf89d", + "unsignedLondon": "0x02f87f8280808203ad82c0f687917fe51b9396d7844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2def838f7945382a3b7ae58e3b83ed04b361dd24e858604e086e1a0f9f0fff83c5992655ea60b4ee4d87962402cf1e24ad838b2dff3ce1ceb5cf89d", + "signedLegacy": "0xf87f8203ad84b7dbab6d844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2de1ca0782b75519a49dffe583e337ef4c6b4ff3b23b96457b2612106ede4a4826e7d15a05eeae5cc138d347ae39d1620dc4bf583423133e88b664a02a86a5e5b15c6abf3", + "signedEip155": "0xf8828203ad84b7dbab6d844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2de83010123a0ae5894969e38574b78989de44c0cddab3b3273ee9d25290c9a4465f3a18d8d05a02940c46197256d623bfc554651f41b753b99b459d044cb37a5d1ab3cc1f8e3de", + "signedBerlin": "0x01f8bc8280808203ad84b7dbab6d844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2def838f7945382a3b7ae58e3b83ed04b361dd24e858604e086e1a0f9f0fff83c5992655ea60b4ee4d87962402cf1e24ad838b2dff3ce1ceb5cf89d01a07b8c32f20b1286cf27a448045d2f7e3a1470508fd026ddbd0dd0e07c0631c9dca071f50cbb7dc155ce8fce9b71f951e0f5113e59cd4bc5293c8d30d416530704c5", + "signedLondon": "0x02f8c28280808203ad82c0f687917fe51b9396d7844e2767a594cf3aae72e10af9157ca91a07aacb76ff5f4e714b8440a3c72c94151c1c2efc8678b90a90db505c748b8a3af7c2def838f7945382a3b7ae58e3b83ed04b361dd24e858604e086e1a0f9f0fff83c5992655ea60b4ee4d87962402cf1e24ad838b2dff3ce1ceb5cf89d01a0734f9c033c0ef450e5da4d10f9f90a8b209b49e0315bb08a448ff56fe457ad42a079d28d004765bd0dff0bdd80c3f44dcaa20902105f98760510d326918fd98282", + "signatureLegacy": { + "r": "0x782b75519a49dffe583e337ef4c6b4ff3b23b96457b2612106ede4a4826e7d15", + "s": "0x5eeae5cc138d347ae39d1620dc4bf583423133e88b664a02a86a5e5b15c6abf3", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xae5894969e38574b78989de44c0cddab3b3273ee9d25290c9a4465f3a18d8d05", + "s": "0x2940c46197256d623bfc554651f41b753b99b459d044cb37a5d1ab3cc1f8e3de", + "v": "0x10123" + }, + "signatureBerlin": { + "r": "0x7b8c32f20b1286cf27a448045d2f7e3a1470508fd026ddbd0dd0e07c0631c9dc", + "s": "0x71f50cbb7dc155ce8fce9b71f951e0f5113e59cd4bc5293c8d30d416530704c5", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x734f9c033c0ef450e5da4d10f9f90a8b209b49e0315bb08a448ff56fe457ad42", + "s": "0x79d28d004765bd0dff0bdd80c3f44dcaa20902105f98760510d326918fd98282", + "v": "0x1" + } + }, + { + "name": "random-26", + "transaction": { + "to": "0x758Bc398A6a885CFdbd6Fc38454aEfe6028B368d", + "nonce": 283, + "gasLimit": "0x7ad47983", + "gasPrice": "0x886642", + "maxFeePerGas": "0xf91a5fd1939a01", + "maxPriorityFeePerGas": "0x6d20", + "data": "0x999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db53", + "value": "0x30f7bbbe", + "accessList": [ + { + "address": "0x7Aa04EF339c6F02a32c1293268EFf86EE908BBeE", + "storageKeys": [ + "0x8b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19a", + "0x77ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17", + "0x867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2", + "0x3c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55" + ] + }, + { + "address": "0x5F66D25CFEcB5CC61Ddb2f3b74766C6B42fbD4dd", + "storageKeys": [ + "0x8b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19a", + "0x77ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17", + "0x867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2", + "0x3c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55" + ] + }, + { + "address": "0x4056252dA35B2f81Ac719EE07a88f3883EbcDAd9", + "storageKeys": [ + "0x8b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19a", + "0x77ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17", + "0x867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2", + "0x3c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55" + ] + }, + { + "address": "0x068887646de0cCff30cA7133e47ECa5AA01F9Ac6", + "storageKeys": [ + "0x8b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19a", + "0x77ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17", + "0x867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2", + "0x3c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55" + ] + } + ], + "chainId": "0xcac3" + }, + "privateKey": "0x3a7272d9d920215e9cef3f5d2c992b29d02c44006f0bc484ecb12e99120d7e16", + "unsignedLegacy": "0xf88182011b83886642847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db53", + "unsignedEip155": "0xf88682011b83886642847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db5382cac38080", + "unsignedBerlin": "0x01f902fb82cac382011b83886642847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db53f90274f89b947aa04ef339c6f02a32c1293268eff86ee908bbeef884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b945f66d25cfecb5cc61ddb2f3b74766c6b42fbd4ddf884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b944056252da35b2f81ac719ee07a88f3883ebcdad9f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b94068887646de0ccff30ca7133e47eca5aa01f9ac6f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55", + "unsignedLondon": "0x02f9030282cac382011b826d2087f91a5fd1939a01847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db53f90274f89b947aa04ef339c6f02a32c1293268eff86ee908bbeef884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b945f66d25cfecb5cc61ddb2f3b74766c6b42fbd4ddf884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b944056252da35b2f81ac719ee07a88f3883ebcdad9f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b94068887646de0ccff30ca7133e47eca5aa01f9ac6f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55", + "signedLegacy": "0xf8c482011b83886642847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db531ba0e4a8dbbe0700d94a4f56ff2b2b274dcd57c347a7d469acf56d22e046df829d00a07b3ebc12a647afbf4a68798cf2fad936b2c05001fd456c1628f9948fe3dc4a15", + "signedEip155": "0xf8c782011b83886642847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db53830195aaa099ec2ed61e71e3c8ff67c0884260cb1988f43791f189d9b1067e6ec9c0350117a07272abbc1de123c18837f64d138df1337c6f09036d70ff9c157df639350624b7", + "signedBerlin": "0x01f9033e82cac382011b83886642847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db53f90274f89b947aa04ef339c6f02a32c1293268eff86ee908bbeef884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b945f66d25cfecb5cc61ddb2f3b74766c6b42fbd4ddf884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b944056252da35b2f81ac719ee07a88f3883ebcdad9f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b94068887646de0ccff30ca7133e47eca5aa01f9ac6f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e5501a08fa376ef64811d90bb3e182d9e3bf1d0855e23196e6ee58160f606c9233684a6a0310394f8bf89d44b9610a399819e7438f03dc274c03df786bfc0eafb45ba0b5a", + "signedLondon": "0x02f9034482cac382011b826d2087f91a5fd1939a01847ad4798394758bc398a6a885cfdbd6fc38454aefe6028b368d8430f7bbbeb859999e99f8d3ab49b5fff3d7d260ff6317b74d9adb4f8e590178c8e47ae02ec8504dd961b793cf3299f84d5a31629bfda6fd8406d7a812804073372fdd6e95cb6172775f963510d705ed6ca6ef662c437fbd9b89566bc0d4db53f90274f89b947aa04ef339c6f02a32c1293268eff86ee908bbeef884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b945f66d25cfecb5cc61ddb2f3b74766c6b42fbd4ddf884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b944056252da35b2f81ac719ee07a88f3883ebcdad9f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55f89b94068887646de0ccff30ca7133e47eca5aa01f9ac6f884a08b41f3a1712b04779027244978e3c14e6b779bff43a49fc7a99200a588fac19aa077ee4b58a944e970a8222af116a065fd9ed3023f0f8f0ec4f4db6596474efc17a0867078827bfb48a319552dc5a224d8376b24f5cdbcb59d141f07c7352efd4cd2a03c7d6019705980a16f927c04d147b33cd7d79410323c584acfa8b1f3adcb6e55809f3b7db6623399d0eb59fb065f50b7ec6ec1779889572e5a29f39d582a3b1762a049b53db01df57bec3f8ae55e6139825aa050f46cd2bfd7da8c0a8b480017d2da", + "signatureLegacy": { + "r": "0xe4a8dbbe0700d94a4f56ff2b2b274dcd57c347a7d469acf56d22e046df829d00", + "s": "0x7b3ebc12a647afbf4a68798cf2fad936b2c05001fd456c1628f9948fe3dc4a15", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x99ec2ed61e71e3c8ff67c0884260cb1988f43791f189d9b1067e6ec9c0350117", + "s": "0x7272abbc1de123c18837f64d138df1337c6f09036d70ff9c157df639350624b7", + "v": "0x195aa" + }, + "signatureBerlin": { + "r": "0x8fa376ef64811d90bb3e182d9e3bf1d0855e23196e6ee58160f606c9233684a6", + "s": "0x310394f8bf89d44b9610a399819e7438f03dc274c03df786bfc0eafb45ba0b5a", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x003b7db6623399d0eb59fb065f50b7ec6ec1779889572e5a29f39d582a3b1762", + "s": "0x49b53db01df57bec3f8ae55e6139825aa050f46cd2bfd7da8c0a8b480017d2da", + "v": "0x0" + } + }, + { + "name": "random-27", + "transaction": { + "to": "0x4eD78781224E8D9546c3003b83A25337ce362738", + "nonce": 501, + "gasLimit": "0xe9e61f7d6e", + "gasPrice": "0xcdf3", + "maxFeePerGas": "0x343e21df97", + "maxPriorityFeePerGas": "0xcdf1", + "data": "0x78347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4b", + "value": "0xa4d6b5", + "accessList": [], + "chainId": "0x8972db" + }, + "privateKey": "0xd4b7564ff7521fc756148cc2e94ee6bd3bd036ec2a7abbfea50d6aa0beb75414", + "unsignedLegacy": "0xf8468201f582cdf385e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4b", + "unsignedEip155": "0xf84c8201f582cdf385e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4b838972db8080", + "unsignedBerlin": "0x01f84b838972db8201f582cdf385e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4bc0", + "unsignedLondon": "0x02f851838972db8201f582cdf185343e21df9785e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4bc0", + "signedLegacy": "0xf8898201f582cdf385e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4b1ca07829ed3567007c1eccd893d3f99d8dcccfd66264d7666d4013b9b43655708869a015b973dc54b7bbb9c58f19eef8a2b55b2530e3921665dc51140197c188c5175f", + "signedEip155": "0xf88d8201f582cdf385e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4b840112e5daa0e04450f3273d06e53c44d8081a72a97a8e3b20047ea337c56ecf040d17aa53a3a0023542d35dba84fbf979dbc6c75073e4b08f10899b8e3b62e1549d71a2255015", + "signedBerlin": "0x01f88e838972db8201f582cdf385e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4bc080a0e4a17f7e16e2ac8985a4844a894c54a880a8d6e355d0adf5ee40d644e92fc35fa04c8193634854a8e13622c6320e583e48c5dbead6d4704a39d23addf7b56070f1", + "signedLondon": "0x02f894838972db8201f582cdf185343e21df9785e9e61f7d6e944ed78781224e8d9546c3003b83a25337ce36273883a4d6b5a078347e0a5ff997181fd3db5905870ee21ce97b1d842fe70903b458f9c0e40a4bc001a00c087ab4a077e9f9c6da6f249514c722ae46f0c921422a62fdbec7e0ae96e8e2a032bed662a402795ec0ff814eeece8c140f601b772f209dcad03d73032eab69ec", + "signatureLegacy": { + "r": "0x7829ed3567007c1eccd893d3f99d8dcccfd66264d7666d4013b9b43655708869", + "s": "0x15b973dc54b7bbb9c58f19eef8a2b55b2530e3921665dc51140197c188c5175f", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xe04450f3273d06e53c44d8081a72a97a8e3b20047ea337c56ecf040d17aa53a3", + "s": "0x023542d35dba84fbf979dbc6c75073e4b08f10899b8e3b62e1549d71a2255015", + "v": "0x112e5da" + }, + "signatureBerlin": { + "r": "0xe4a17f7e16e2ac8985a4844a894c54a880a8d6e355d0adf5ee40d644e92fc35f", + "s": "0x4c8193634854a8e13622c6320e583e48c5dbead6d4704a39d23addf7b56070f1", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x0c087ab4a077e9f9c6da6f249514c722ae46f0c921422a62fdbec7e0ae96e8e2", + "s": "0x32bed662a402795ec0ff814eeece8c140f601b772f209dcad03d73032eab69ec", + "v": "0x1" + } + }, + { + "name": "random-29", + "transaction": { + "to": "0x39EF92dBF568890EC4e3c297849DaeFBcdfD5b62", + "nonce": 655, + "gasLimit": "0x7f42bd93", + "gasPrice": "0xbec8", + "maxFeePerGas": "0xd608ba4fb5c7", + "maxPriorityFeePerGas": "0xc23b", + "data": "0xa1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8d", + "value": "0x6ddff0", + "accessList": [ + { + "address": "0x736704601aDEe519B7bB78a863Aa4dbe8404c28d", + "storageKeys": [ + "0x0cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0", + "0xa747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3", + "0xe4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc" + ] + }, + { + "address": "0x6d998366ed8753D04e8657365cE8C51a835D523B", + "storageKeys": [ + "0x0cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0", + "0xa747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3", + "0xe4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc" + ] + }, + { + "address": "0x738fa560278f8094220Bff4aA29372c6660187f7", + "storageKeys": [ + "0x0cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0", + "0xa747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3", + "0xe4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc" + ] + }, + { + "address": "0x6A8433E54C68febECE19B8F73A09137358680EC7", + "storageKeys": [ + "0x0cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0", + "0xa747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3", + "0xe4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc" + ] + } + ], + "chainId": "0x63e7bbb7b9" + }, + "privateKey": "0x24dda9adc8b5dc359425dfe39c92f8e3f77a00da6ed3e8ee5cad62009b97cd2a", + "unsignedLegacy": "0xf86f82028f82bec8847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8d", + "unsignedEip155": "0xf87782028f82bec8847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8d8563e7bbb7b98080", + "unsignedBerlin": "0x01f902688563e7bbb7b982028f82bec8847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8df901f0f87a94736704601adee519b7bb78a863aa4dbe8404c28df863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946d998366ed8753d04e8657365ce8c51a835d523bf863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a94738fa560278f8094220bff4aa29372c6660187f7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946a8433e54c68febece19b8f73a09137358680ec7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc", + "unsignedLondon": "0x02f9026f8563e7bbb7b982028f82c23b86d608ba4fb5c7847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8df901f0f87a94736704601adee519b7bb78a863aa4dbe8404c28df863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946d998366ed8753d04e8657365ce8c51a835d523bf863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a94738fa560278f8094220bff4aa29372c6660187f7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946a8433e54c68febece19b8f73a09137358680ec7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc", + "signedLegacy": "0xf8b282028f82bec8847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8d1ba0eaf749d722c432fd4435ae78243ced0d57de87a2d457c5c7cf664f6183d95eaaa05aa7bbb7feabe6b7feeda1da2223c5d385a1c14178eb47573abed249ac19183e", + "signedEip155": "0xf8b782028f82bec8847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8d85c7cf776f95a00f90aa8f3adac27ec0d9ac957ba4e424f31a7cc0411f343d23d8060e0c3d17f2a06fb73ecf12fbdf682c07d6558bf55d9a2a6d9bbe4e5ff20d8650726c0e017bbd", + "signedBerlin": "0x01f902ab8563e7bbb7b982028f82bec8847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8df901f0f87a94736704601adee519b7bb78a863aa4dbe8404c28df863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946d998366ed8753d04e8657365ce8c51a835d523bf863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a94738fa560278f8094220bff4aa29372c6660187f7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946a8433e54c68febece19b8f73a09137358680ec7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc80a09b5a033899a449b7311c97018d36c4a487596534091489b994e848eb8148902ca0221b7344481e71cc1fcb939ec303f8b8462fedc6bdfb4d8de1a463735c9681e3", + "signedLondon": "0x02f902b28563e7bbb7b982028f82c23b86d608ba4fb5c7847f42bd939439ef92dbf568890ec4e3c297849daefbcdfd5b62836ddff0b849a1332d86cf1b22f26350e4fdca8cf06930a3c5580f1757ba5e2d313f3a72d3cf4b402f359e21556f4df4faf3043343d7d8252f0f6fe930847db5ca0917527f642227f8a190755f2b8df901f0f87a94736704601adee519b7bb78a863aa4dbe8404c28df863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946d998366ed8753d04e8657365ce8c51a835d523bf863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a94738fa560278f8094220bff4aa29372c6660187f7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfcf87a946a8433e54c68febece19b8f73a09137358680ec7f863a00cb5823fe4963551b7448da2cb255c54cb952b1d29aa906d0db8a0369b07acc0a0a747cdaee63c094c448b58b76e9b7555459bf28fe41e33d8e485334b3955dee3a0e4495e263b85cf99f8f4805be8aa418a6da0e7e9d9bb74ef62fbea129fb02bfc80a0bdee7e9fe7b0edd0b7ac9c6c0f0cd410a9a425fb60492bd9890f5b962ff62beca043ced401ab83efea9ec600617bdd94d7377c5c99fca2ac949bcb11eff3da6854", + "signatureLegacy": { + "r": "0xeaf749d722c432fd4435ae78243ced0d57de87a2d457c5c7cf664f6183d95eaa", + "s": "0x5aa7bbb7feabe6b7feeda1da2223c5d385a1c14178eb47573abed249ac19183e", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x0f90aa8f3adac27ec0d9ac957ba4e424f31a7cc0411f343d23d8060e0c3d17f2", + "s": "0x6fb73ecf12fbdf682c07d6558bf55d9a2a6d9bbe4e5ff20d8650726c0e017bbd", + "v": "0xc7cf776f95" + }, + "signatureBerlin": { + "r": "0x9b5a033899a449b7311c97018d36c4a487596534091489b994e848eb8148902c", + "s": "0x221b7344481e71cc1fcb939ec303f8b8462fedc6bdfb4d8de1a463735c9681e3", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xbdee7e9fe7b0edd0b7ac9c6c0f0cd410a9a425fb60492bd9890f5b962ff62bec", + "s": "0x43ced401ab83efea9ec600617bdd94d7377c5c99fca2ac949bcb11eff3da6854", + "v": "0x0" + } + }, + { + "name": "random-30", + "transaction": { + "to": "0xD81feE96A6c49D66C3e949Cd679792e10bf9A7c3", + "nonce": 237, + "gasLimit": "0x0e4296f22b", + "gasPrice": "0x320fd5", + "maxFeePerGas": "0x64b320ccf8845e", + "maxPriorityFeePerGas": "0x4d2d71", + "data": "0x0eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be8", + "value": "0x02", + "accessList": [ + { + "address": "0x8EFDe420199EaEf765D5E17902088f022F45b497", + "storageKeys": [ + "0x3150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0" + ] + }, + { + "address": "0xda1cEB33c33Ea5d07374973b279c80c734917381", + "storageKeys": [ + "0x3150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0" + ] + }, + { + "address": "0x18665e49f685c3b280c48cF8A18b16fD7C704338", + "storageKeys": [ + "0x3150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0" + ] + } + ], + "chainId": "0xad9c" + }, + "privateKey": "0x348a5bf7826e17ff90d6b8db8462ae492818e4cd25c75a33ca07eb43400ad713", + "unsignedLegacy": "0xf87981ed83320fd5850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be8", + "unsignedEip155": "0xf87e81ed83320fd5850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be882ad9c8080", + "unsignedBerlin": "0x01f9012682ad9c81ed83320fd5850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be8f8a8f7948efde420199eaef765d5e17902088f022f45b497e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f794da1ceb33c33ea5d07374973b279c80c734917381e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f79418665e49f685c3b280c48cf8a18b16fd7c704338e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0", + "unsignedLondon": "0x02f9012e82ad9c81ed834d2d718764b320ccf8845e850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be8f8a8f7948efde420199eaef765d5e17902088f022f45b497e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f794da1ceb33c33ea5d07374973b279c80c734917381e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f79418665e49f685c3b280c48cf8a18b16fd7c704338e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0", + "signedLegacy": "0xf8bc81ed83320fd5850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be81ba046bb2bee44c7bf835db706e3c3e2cba9374ca7d36335c45f9a256dc1ea570717a076aa194b82defe5e50b555362afc723990ae4ef804b18c644d2cae1da86e1635", + "signedEip155": "0xf8bf81ed83320fd5850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be883015b5ca053e4bdad98b727331a383da2ee9f10a25d4897161fba691b25072a04fb9d3e30a00d032b391b1d3adccc69eabbaa133c63d0c3322c235742aae095322792817a1f", + "signedBerlin": "0x01f9016982ad9c81ed83320fd5850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be8f8a8f7948efde420199eaef765d5e17902088f022f45b497e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f794da1ceb33c33ea5d07374973b279c80c734917381e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f79418665e49f685c3b280c48cf8a18b16fd7c704338e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a080a058dad2bfa45ad1b083596e6336b7afe5ab1f2afa8f24b65ed46012f91b5f172fa03c4709c38ce7cc11714b3f5fb025ef0becf89cdc09bdcc9acd1f570d75c99234", + "signedLondon": "0x02f9017182ad9c81ed834d2d718764b320ccf8845e850e4296f22b94d81fee96a6c49d66c3e949cd679792e10bf9a7c302b8550eeb3b5f46d0cdc7570c13b39ce3461489ff1b6ebb6f11c0f81a429fc934947eeb320a2cfaaab19769fba90621774868fdffba3e1ccd2837809aafcdef89b18b1c2b9d4b6c58ee3c7f3e91cfdcdf5a134225388be8f8a8f7948efde420199eaef765d5e17902088f022f45b497e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f794da1ceb33c33ea5d07374973b279c80c734917381e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a0f79418665e49f685c3b280c48cf8a18b16fd7c704338e1a03150715b5ad9a1e19f9e5d7acb57041c056751bf3517085406225bc939a1a6a001a09fca68ea04bc5d2dee86e7bc7e6e19308c0ad61446df8c9380e9124f49d64e1ea018f5ca014333339cac69ee07abd855cd735f27ad77e72da1ed3c36ae6406efb7", + "signatureLegacy": { + "r": "0x46bb2bee44c7bf835db706e3c3e2cba9374ca7d36335c45f9a256dc1ea570717", + "s": "0x76aa194b82defe5e50b555362afc723990ae4ef804b18c644d2cae1da86e1635", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x53e4bdad98b727331a383da2ee9f10a25d4897161fba691b25072a04fb9d3e30", + "s": "0x0d032b391b1d3adccc69eabbaa133c63d0c3322c235742aae095322792817a1f", + "v": "0x15b5c" + }, + "signatureBerlin": { + "r": "0x58dad2bfa45ad1b083596e6336b7afe5ab1f2afa8f24b65ed46012f91b5f172f", + "s": "0x3c4709c38ce7cc11714b3f5fb025ef0becf89cdc09bdcc9acd1f570d75c99234", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x9fca68ea04bc5d2dee86e7bc7e6e19308c0ad61446df8c9380e9124f49d64e1e", + "s": "0x18f5ca014333339cac69ee07abd855cd735f27ad77e72da1ed3c36ae6406efb7", + "v": "0x1" + } + }, + { + "name": "random-31", + "transaction": { + "to": "0x1Cf101d4301Ac8FF0178FC31684b57E9Da7C4b4b", + "nonce": 940, + "gasLimit": "0x4e35a394", + "gasPrice": "0xb382", + "maxFeePerGas": "0xc8acf4154649", + "maxPriorityFeePerGas": "0xb576", + "data": "0xdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f93", + "value": "0xe3", + "accessList": [], + "chainId": "0x50bd950901" + }, + "privateKey": "0xc706fac1164ede0deacb3773e5137435f4d889ed859498566aa862dd238d0e2d", + "unsignedLegacy": "0xf8938203ac82b382844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f93", + "unsignedEip155": "0xf89b8203ac82b382844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f938550bd9509018080", + "unsignedBerlin": "0x01f89a8550bd9509018203ac82b382844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f93c0", + "unsignedLondon": "0x02f8a18550bd9509018203ac82b57686c8acf4154649844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f93c0", + "signedLegacy": "0xf8d68203ac82b382844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f931ba057b0d5b14c86070871e941e941e85272365bb47b92601a421f8a93d15f5f8d91a00e1290362a622ed03e81f243e42605ec87a31b6a335fab9eda54fed7ec46fda4", + "signedEip155": "0xf8db8203ac82b382844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f9385a17b2a1226a01dbff0cdb89d3975749c63a423d4e641d916e4841ed3260690239dca35902090a0591867f7bb5eca7c4244680707fcc88d8952257a9ac3099426c0333bb1263317", + "signedBerlin": "0x01f8dd8550bd9509018203ac82b382844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f93c001a0f4d9ed06f4dea378a24d3b7e125a7c5cf1eda60208b341106f84e664b28d3a51a043b8de316dce58ca60a30e68680d4dd3734bce7137a401c1f74f70a17d7bf8d1", + "signedLondon": "0x02f8e48550bd9509018203ac82b57686c8acf4154649844e35a394941cf101d4301ac8ff0178fc31684b57e9da7c4b4b81e3b86fdadd8255817f91d587d8029128a8607a5b15079038b9ad7a5a35fc45f7f989fb7bb8d9b45037d5849d340f69a82ba7195035ac19495beb4222e9d3155d8079480a0204d70ffb052afee620da13419377e0da95ee5bbb89a34e9ad9837a568677ad17b64846be6ab4d157dd6a599f93c001a0a7649f2b700fcad4d1217489345c400cdbc056e1f2cc1f90d1b23fca4b1db890a01bb786854eae85c75995506ed8042b934abad0a419f246e24eacc99ec9dbbfe9", + "signatureLegacy": { + "r": "0x57b0d5b14c86070871e941e941e85272365bb47b92601a421f8a93d15f5f8d91", + "s": "0x0e1290362a622ed03e81f243e42605ec87a31b6a335fab9eda54fed7ec46fda4", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x1dbff0cdb89d3975749c63a423d4e641d916e4841ed3260690239dca35902090", + "s": "0x591867f7bb5eca7c4244680707fcc88d8952257a9ac3099426c0333bb1263317", + "v": "0xa17b2a1226" + }, + "signatureBerlin": { + "r": "0xf4d9ed06f4dea378a24d3b7e125a7c5cf1eda60208b341106f84e664b28d3a51", + "s": "0x43b8de316dce58ca60a30e68680d4dd3734bce7137a401c1f74f70a17d7bf8d1", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xa7649f2b700fcad4d1217489345c400cdbc056e1f2cc1f90d1b23fca4b1db890", + "s": "0x1bb786854eae85c75995506ed8042b934abad0a419f246e24eacc99ec9dbbfe9", + "v": "0x1" + } + }, + { + "name": "random-32", + "transaction": { + "to": "0x1A8A6D0172522dD3D6a3314Fa10CeD54CaB044e4", + "nonce": 545, + "gasLimit": "0x9061a1", + "gasPrice": "0x4165f6af", + "maxFeePerGas": "0xc0325b06337a", + "maxPriorityFeePerGas": "0x58110d", + "data": "0x0dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c628", + "value": "0xdead4d57", + "accessList": [ + { + "address": "0x1a0D647D3edeB04c6250716EDeA6EC1E65814397", + "storageKeys": [ + "0x5c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409a", + "0xe0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758", + "0xc28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0", + "0xf7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b" + ] + }, + { + "address": "0x2e1c0387Ea755faF64D810BF994a5Dc0a6782bB3", + "storageKeys": [ + "0x5c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409a", + "0xe0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758", + "0xc28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0", + "0xf7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b" + ] + }, + { + "address": "0x3D3699852f4E73fd6C3A68A2255c2Dc62f165937", + "storageKeys": [ + "0x5c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409a", + "0xe0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758", + "0xc28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0", + "0xf7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b" + ] + }, + { + "address": "0x16eA1932E71e76Dc1C3A7B58fffCC2427dE9E4eB", + "storageKeys": [ + "0x5c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409a", + "0xe0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758", + "0xc28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0", + "0xf7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b" + ] + } + ], + "chainId": "0x0a" + }, + "privateKey": "0xf6cc080d6c90be0787826b5393f109bc81e8f99145553fe9501cd453cf5f8c87", + "unsignedLegacy": "0xf888820221844165f6af839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c628", + "unsignedEip155": "0xf88b820221844165f6af839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c6280a8080", + "unsignedBerlin": "0x01f903000a820221844165f6af839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c628f90274f89b941a0d647d3edeb04c6250716edea6ec1e65814397f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b942e1c0387ea755faf64d810bf994a5dc0a6782bb3f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b943d3699852f4e73fd6c3a68a2255c2dc62f165937f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b9416ea1932e71e76dc1c3a7b58fffcc2427de9e4ebf884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b", + "unsignedLondon": "0x02f903060a8202218358110d86c0325b06337a839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c628f90274f89b941a0d647d3edeb04c6250716edea6ec1e65814397f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b942e1c0387ea755faf64d810bf994a5dc0a6782bb3f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b943d3699852f4e73fd6c3a68a2255c2dc62f165937f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b9416ea1932e71e76dc1c3a7b58fffcc2427de9e4ebf884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b", + "signedLegacy": "0xf8cb820221844165f6af839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c6281ca06baad45ef8cc014230317e0851e9a7571c66ff0b74ee4f32baa04546086708a8a00cecfba685b97554fd04f8ca8834da3a501aab84998f6133feb8747ae643d97f", + "signedEip155": "0xf8cb820221844165f6af839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c62837a02537907b26c9d686c4531cd39b30d5adf49a04922c2a126e948ca8c0b92c92c5a0535f96ec680d27238b6dc8e1cec5accd4ffedd85057196c17f80e7177579c6f6", + "signedBerlin": "0x01f903430a820221844165f6af839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c628f90274f89b941a0d647d3edeb04c6250716edea6ec1e65814397f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b942e1c0387ea755faf64d810bf994a5dc0a6782bb3f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b943d3699852f4e73fd6c3a68a2255c2dc62f165937f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b9416ea1932e71e76dc1c3a7b58fffcc2427de9e4ebf884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b80a02454eef2ffc624242b5f6529bb99809d05eac940c507f3e6b3018156da2a13f4a064f26228a7659383534d2fc40000a21c3ce85badfef9c9e63b339aff3e97c444", + "signedLondon": "0x02f903490a8202218358110d86c0325b06337a839061a1941a8a6d0172522dd3d6a3314fa10ced54cab044e484dead4d57b8600dd7f6bdf2f4d7d028c8952d130bd73220cc16b716fd4910b38322a0083feb5caed66f073c273138b5c65bc8c01fb7dc5fdb6d35b4cbd5887870e517ab25e4d1ac3dbb2e886f65362238649528a2ebb445dd0f5c800784d0d139498af454c628f90274f89b941a0d647d3edeb04c6250716edea6ec1e65814397f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b942e1c0387ea755faf64d810bf994a5dc0a6782bb3f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b943d3699852f4e73fd6c3a68a2255c2dc62f165937f884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7bf89b9416ea1932e71e76dc1c3a7b58fffcc2427de9e4ebf884a05c4c743f9e849af25a6bcbde357f3147fe050a8243b24324599b07443a44409aa0e0ae5f4e9cfb53ea5657c6f71a9f6d180ef603b14915939bb5cc4641fd491758a0c28f1334074c4fd8c30d72e8915cb65dcc860a0e50434a1e67fea76e2ecaadd0a0f7a34606a5a7a79039bbd2738722f49a7a10b34a89be4701d18545207a60ed7b01a0932c39d7b2caef3be93795e673656a981d6ff6a4ed01773c4607334f5a663744a00fb9b255b4759e79a25b662a5f70b0f5ca59700b5e8efd89a4f0048ae7ba8a52", + "signatureLegacy": { + "r": "0x6baad45ef8cc014230317e0851e9a7571c66ff0b74ee4f32baa04546086708a8", + "s": "0x0cecfba685b97554fd04f8ca8834da3a501aab84998f6133feb8747ae643d97f", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x2537907b26c9d686c4531cd39b30d5adf49a04922c2a126e948ca8c0b92c92c5", + "s": "0x535f96ec680d27238b6dc8e1cec5accd4ffedd85057196c17f80e7177579c6f6", + "v": "0x37" + }, + "signatureBerlin": { + "r": "0x2454eef2ffc624242b5f6529bb99809d05eac940c507f3e6b3018156da2a13f4", + "s": "0x64f26228a7659383534d2fc40000a21c3ce85badfef9c9e63b339aff3e97c444", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x932c39d7b2caef3be93795e673656a981d6ff6a4ed01773c4607334f5a663744", + "s": "0x0fb9b255b4759e79a25b662a5f70b0f5ca59700b5e8efd89a4f0048ae7ba8a52", + "v": "0x1" + } + }, + { + "name": "random-35", + "transaction": { + "to": "0xC1C06f6eb9ae61550a85218E64CDEced5b2D925c", + "nonce": 955, + "gasLimit": "0x9e15f1", + "gasPrice": "0x02ff", + "maxFeePerGas": "0xbdfd807b67", + "maxPriorityFeePerGas": "0xe87a", + "data": "0x3f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04d", + "value": "0x44da7f0bf5", + "accessList": [ + { + "address": "0xB3062Cc649929f0661f023168871C712710E3E2b", + "storageKeys": [ + "0x323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c" + ] + }, + { + "address": "0xcfb86cEa245Bfa0313Ee0bD52bb541AfAd49e1cA", + "storageKeys": [ + "0x323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c" + ] + }, + { + "address": "0xF855839b588f5C71AF66f23f55acf048975b059f", + "storageKeys": [ + "0x323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c" + ] + }, + { + "address": "0x4A7B3DbC879Af23AF6bc942194d4a4Cc7ab64705", + "storageKeys": [ + "0x323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c" + ] + } + ], + "chainId": "0x7068cfb1" + }, + "privateKey": "0x94e4379b160cb06d5b8e2c382bcf3f732b63a56fd3a40216ce312c135083ffd5", + "unsignedLegacy": "0xf8488203bb8202ff839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04d", + "unsignedEip155": "0xf84f8203bb8202ff839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04d847068cfb18080", + "unsignedBerlin": "0x01f9012f847068cfb18203bb8202ff839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04df8e0f794b3062cc649929f0661f023168871c712710e3e2be1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794cfb86cea245bfa0313ee0bd52bb541afad49e1cae1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794f855839b588f5c71af66f23f55acf048975b059fe1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf7944a7b3dbc879af23af6bc942194d4a4cc7ab64705e1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c", + "unsignedLondon": "0x02f90135847068cfb18203bb82e87a85bdfd807b67839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04df8e0f794b3062cc649929f0661f023168871c712710e3e2be1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794cfb86cea245bfa0313ee0bd52bb541afad49e1cae1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794f855839b588f5c71af66f23f55acf048975b059fe1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf7944a7b3dbc879af23af6bc942194d4a4cc7ab64705e1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c", + "signedLegacy": "0xf88b8203bb8202ff839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04d1ba010bade5bfbb74c6cdad243e4a3c4bcba001dddf243c700af91a18320744f5d0aa05baf9b514ae3dbade4690574f1bd83842e6cb927576ce9d8b92f84968c907cef", + "signedEip155": "0xf88f8203bb8202ff839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04d84e0d19f86a063263879573cf7bbf6931c04de65f6afd8ef8076a343a63d8d0b0b254e80ffb9a005d780093b281ea96c2935421685fde416fc9811e77772a6ea54a6d550d7b508", + "signedBerlin": "0x01f90172847068cfb18203bb8202ff839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04df8e0f794b3062cc649929f0661f023168871c712710e3e2be1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794cfb86cea245bfa0313ee0bd52bb541afad49e1cae1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794f855839b588f5c71af66f23f55acf048975b059fe1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf7944a7b3dbc879af23af6bc942194d4a4cc7ab64705e1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c80a06594cbfa50286dd8badc08f6a5d2d733a891231e3a7f7c0713637e56a30234bba078898e0e28741a229c528983d6d504be5c8abd55fbfa53accc70efe2ac5f9313", + "signedLondon": "0x02f90178847068cfb18203bb82e87a85bdfd807b67839e15f194c1c06f6eb9ae61550a85218e64cdeced5b2d925c8544da7f0bf5a23f5f95d302de886f2e7efbc709e7f1090f1382977a6dc8553a74adc52767c75de04df8e0f794b3062cc649929f0661f023168871c712710e3e2be1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794cfb86cea245bfa0313ee0bd52bb541afad49e1cae1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf794f855839b588f5c71af66f23f55acf048975b059fe1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7cf7944a7b3dbc879af23af6bc942194d4a4cc7ab64705e1a0323397d458a568e0b5677f5b037db50782531e27d65f066c6b45dfa30efc1f7c80a0de821b668e3ddcb15a1b3d20f3d04aae7143a5ddd182ab0c1dbd2051bbd4b281a0555dd617c19dd35e15a5b4cbe4e0e3aa0d5e2b45bf28a6e34e1111075acc1143", + "signatureLegacy": { + "r": "0x10bade5bfbb74c6cdad243e4a3c4bcba001dddf243c700af91a18320744f5d0a", + "s": "0x5baf9b514ae3dbade4690574f1bd83842e6cb927576ce9d8b92f84968c907cef", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x63263879573cf7bbf6931c04de65f6afd8ef8076a343a63d8d0b0b254e80ffb9", + "s": "0x05d780093b281ea96c2935421685fde416fc9811e77772a6ea54a6d550d7b508", + "v": "0xe0d19f86" + }, + "signatureBerlin": { + "r": "0x6594cbfa50286dd8badc08f6a5d2d733a891231e3a7f7c0713637e56a30234bb", + "s": "0x78898e0e28741a229c528983d6d504be5c8abd55fbfa53accc70efe2ac5f9313", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xde821b668e3ddcb15a1b3d20f3d04aae7143a5ddd182ab0c1dbd2051bbd4b281", + "s": "0x555dd617c19dd35e15a5b4cbe4e0e3aa0d5e2b45bf28a6e34e1111075acc1143", + "v": "0x0" + } + }, + { + "name": "random-36", + "transaction": { + "to": "0x211b8c009161BF91E56e56fD187cAACEBF627F0f", + "nonce": 892, + "gasLimit": "0x733167f072", + "gasPrice": "0x540579", + "maxFeePerGas": "0x0d6c8dfe0662c2", + "maxPriorityFeePerGas": "0xa3a5d4", + "data": "0x24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a79", + "value": "0x8efbe0", + "accessList": [ + { + "address": "0x79B07Ad3d83848A872fEce3b3d46E7dB4C2B77d3", + "storageKeys": [ + "0x838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285" + ] + }, + { + "address": "0xF860E29327ade4d046e2E86e4b87355Dc82f424c", + "storageKeys": [ + "0x838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285" + ] + }, + { + "address": "0x6Be9715ED3f7b01749F5A2caD60DDee6f5a84d61", + "storageKeys": [ + "0x838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285" + ] + }, + { + "address": "0x7C6865F9dbfbdA8FE60C8695fBcb025073e83A7d", + "storageKeys": [ + "0x838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285" + ] + } + ], + "chainId": "0x5d26b144" + }, + "privateKey": "0x78a1164a30cb35cc295f854f3a0b5239f98961c682c7368edabada6e6c5e7141", + "unsignedLegacy": "0xf85682037c8354057985733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a79", + "unsignedEip155": "0xf85d82037c8354057985733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a79845d26b1448080", + "unsignedBerlin": "0x01f9013d845d26b14482037c8354057985733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a79f8e0f79479b07ad3d83848a872fece3b3d46e7db4c2b77d3e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f794f860e29327ade4d046e2e86e4b87355dc82f424ce1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7946be9715ed3f7b01749f5a2cad60ddee6f5a84d61e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7947c6865f9dbfbda8fe60c8695fbcb025073e83a7de1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285", + "unsignedLondon": "0x02f90145845d26b14482037c83a3a5d4870d6c8dfe0662c285733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a79f8e0f79479b07ad3d83848a872fece3b3d46e7db4c2b77d3e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f794f860e29327ade4d046e2e86e4b87355dc82f424ce1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7946be9715ed3f7b01749f5a2cad60ddee6f5a84d61e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7947c6865f9dbfbda8fe60c8695fbcb025073e83a7de1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285", + "signedLegacy": "0xf89982037c8354057985733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a791ca0a98d9b5585bdd36185813c3bc7993e62ee19f5e3402fb452bb1fd620b8ab436ca07907200c9ad11d211405e5b44904c5163ad667aca5ea7c5c1e2dd67276e034f0", + "signedEip155": "0xf89d82037c8354057985733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a7984ba4d62aca0f7fd80f4f644415d13351ae2f1526bd007c19051303b47d6745dd4dd8d3254fea06331bf6e2587261fa5eacbbe1191e4706f5ea5edc9a121ddaf425dccb1722e3c", + "signedBerlin": "0x01f90180845d26b14482037c8354057985733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a79f8e0f79479b07ad3d83848a872fece3b3d46e7db4c2b77d3e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f794f860e29327ade4d046e2e86e4b87355dc82f424ce1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7946be9715ed3f7b01749f5a2cad60ddee6f5a84d61e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7947c6865f9dbfbda8fe60c8695fbcb025073e83a7de1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c028580a0107681f3fd5ec3d8411de85fc7ddde763b8975b4243670de60e8b70de10db1ada045a2c8ba218485e5d92b195a8e5e9d0a35d352df35ef6932f2e450ee1a48166a", + "signedLondon": "0x02f90188845d26b14482037c83a3a5d4870d6c8dfe0662c285733167f07294211b8c009161bf91e56e56fd187caacebf627f0f838efbe0af24739389fe1988f44e7480698fad28a3f4c31396cb5cff9b27474bfbad8fbb090cd66349e1100fda561095bc217a79f8e0f79479b07ad3d83848a872fece3b3d46e7db4c2b77d3e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f794f860e29327ade4d046e2e86e4b87355dc82f424ce1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7946be9715ed3f7b01749f5a2cad60ddee6f5a84d61e1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c0285f7947c6865f9dbfbda8fe60c8695fbcb025073e83a7de1a0838f6bd62528490e9f3541d2e204060d97e7b8712d44f94bfb3544d58d6c028580a0c153f7a10900b75f267fb32c770819b1bf461cdc9fe293590da53023b75a246da00770a94880bd5daa43f7a8c3ed710ee697345c33a4468dcc8368137d890b81e5", + "signatureLegacy": { + "r": "0xa98d9b5585bdd36185813c3bc7993e62ee19f5e3402fb452bb1fd620b8ab436c", + "s": "0x7907200c9ad11d211405e5b44904c5163ad667aca5ea7c5c1e2dd67276e034f0", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xf7fd80f4f644415d13351ae2f1526bd007c19051303b47d6745dd4dd8d3254fe", + "s": "0x6331bf6e2587261fa5eacbbe1191e4706f5ea5edc9a121ddaf425dccb1722e3c", + "v": "0xba4d62ac" + }, + "signatureBerlin": { + "r": "0x107681f3fd5ec3d8411de85fc7ddde763b8975b4243670de60e8b70de10db1ad", + "s": "0x45a2c8ba218485e5d92b195a8e5e9d0a35d352df35ef6932f2e450ee1a48166a", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xc153f7a10900b75f267fb32c770819b1bf461cdc9fe293590da53023b75a246d", + "s": "0x0770a94880bd5daa43f7a8c3ed710ee697345c33a4468dcc8368137d890b81e5", + "v": "0x0" + } + }, + { + "name": "random-37", + "transaction": { + "to": "0x56f6318c36A9907b3F2d9f5f7f58B0c4ad07b037", + "nonce": 879, + "gasLimit": "0x40d29e1243", + "gasPrice": "0x2467", + "maxFeePerGas": "0xd1b6316897", + "maxPriorityFeePerGas": "0x3b", + "data": "0xd96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d213", + "value": "0x190691dc95", + "accessList": [], + "chainId": "0xa0b9" + }, + "privateKey": "0x6c42b4c60ac6c7f42ee6883129f9a32d659b97d714e749190d4e60c3da66ed41", + "unsignedLegacy": "0xf8a982036f8224678540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d213", + "unsignedEip155": "0xf8ae82036f8224678540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d21382a0b98080", + "unsignedBerlin": "0x01f8ad82a0b982036f8224678540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d213c0", + "unsignedLondon": "0x02f8b182a0b982036f3b85d1b63168978540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d213c0", + "signedLegacy": "0xf8ec82036f8224678540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d2131ba0eb93ef10059e8e02f62d54114ed1040a763b63eff1f7f1a98e8223b742837b70a07f33041f80e6ecbc6ce3865261f87486a19dc0a108e74207361a38eeedceb4b1", + "signedEip155": "0xf8ef82036f8224678540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d21383014196a02c61dda64f605b280e9970a02801bd20b657c42204a9fa9a4c38db1f3f8e7097a032d7e7052b4208f39f905ecc5cdc3aa6ff9001fe8d8d6d4592a29315e6549d75", + "signedBerlin": "0x01f8f082a0b982036f8224678540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d213c080a0a97c9472add46edd21a58d728fa0fed91997b27bd6295c39800764e694e01d73a07ddbdd45971e4c4ada54767cf6aa447a4314713b99f702b18aadfc1e7f1c1bd8", + "signedLondon": "0x02f8f482a0b982036f3b85d1b63168978540d29e12439456f6318c36a9907b3f2d9f5f7f58b0c4ad07b03785190691dc95b880d96ea6a31daf37145852d93a2adc141f60ca340910001858455d6f3f7f717ac8bfda2e95effc8540a8bccd204db19b2eadc451a46bfa81e83e9d3af36b511c8231947f43ab6093778483b11641e0d33fe6ad96220d8b68fe31d67e8a5fb55a63ab4f41e6066d039c9f220d23ee38944e0eb484332729276bac396e173179d213c080a09580231c766858d281a8c56aecb14feac1fa5d6a3da53f8faad5797d7f1980eaa01fbeb3622d9c1e02777aea4ba33daa894c3e337990fff6460275645bd87a25cb", + "signatureLegacy": { + "r": "0xeb93ef10059e8e02f62d54114ed1040a763b63eff1f7f1a98e8223b742837b70", + "s": "0x7f33041f80e6ecbc6ce3865261f87486a19dc0a108e74207361a38eeedceb4b1", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x2c61dda64f605b280e9970a02801bd20b657c42204a9fa9a4c38db1f3f8e7097", + "s": "0x32d7e7052b4208f39f905ecc5cdc3aa6ff9001fe8d8d6d4592a29315e6549d75", + "v": "0x14196" + }, + "signatureBerlin": { + "r": "0xa97c9472add46edd21a58d728fa0fed91997b27bd6295c39800764e694e01d73", + "s": "0x7ddbdd45971e4c4ada54767cf6aa447a4314713b99f702b18aadfc1e7f1c1bd8", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x9580231c766858d281a8c56aecb14feac1fa5d6a3da53f8faad5797d7f1980ea", + "s": "0x1fbeb3622d9c1e02777aea4ba33daa894c3e337990fff6460275645bd87a25cb", + "v": "0x0" + } + }, + { + "name": "random-38", + "transaction": { + "to": "0x4BBA4f66b87A2529E70E52BcdD8b94A913E2767F", + "nonce": 192, + "gasLimit": "0xaccf9abbcc", + "gasPrice": "0xfc", + "maxFeePerGas": "0x91eb68de49c85c", + "maxPriorityFeePerGas": "0xb798", + "data": "0x1a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc97", + "value": "0x837185bce5", + "accessList": [ + { + "address": "0x3A72660413E06d13511ead0eD048Bb7C536238f9", + "storageKeys": [ + "0x2b0ae05eea3e40b74365927909af95849ea0e6482d4979aa97b6de40184c5a96", + "0x4560e6afe698397a9a11b3a85c45a3f2a6929fa2120c0710256df5b8617b56ab", + "0x4e970ecb45687241b20ee7e62a70ad70e85bfa354d2d77584f01424ab20bf542", + "0x46cd73ab4de9cfb90f17050cb48fc7df57f1614be6482ecb497806c761f7b1c6" + ] + } + ], + "chainId": "0x93" + }, + "privateKey": "0xb109e30e6271d301aedc2d2eace8d5c39530cb69fa33c0874eee756a5c2cd1aa", + "unsignedLegacy": "0xf88d81c081fc85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc97", + "unsignedEip155": "0xf89181c081fc85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc9781938080", + "unsignedBerlin": "0x01f9012e819381c081fc85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc97f89df89b943a72660413e06d13511ead0ed048bb7c536238f9f884a02b0ae05eea3e40b74365927909af95849ea0e6482d4979aa97b6de40184c5a96a04560e6afe698397a9a11b3a85c45a3f2a6929fa2120c0710256df5b8617b56aba04e970ecb45687241b20ee7e62a70ad70e85bfa354d2d77584f01424ab20bf542a046cd73ab4de9cfb90f17050cb48fc7df57f1614be6482ecb497806c761f7b1c6", + "unsignedLondon": "0x02f90137819381c082b7988791eb68de49c85c85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc97f89df89b943a72660413e06d13511ead0ed048bb7c536238f9f884a02b0ae05eea3e40b74365927909af95849ea0e6482d4979aa97b6de40184c5a96a04560e6afe698397a9a11b3a85c45a3f2a6929fa2120c0710256df5b8617b56aba04e970ecb45687241b20ee7e62a70ad70e85bfa354d2d77584f01424ab20bf542a046cd73ab4de9cfb90f17050cb48fc7df57f1614be6482ecb497806c761f7b1c6", + "signedLegacy": "0xf8d081c081fc85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc971ba02062b236675901492e76b6ad262005163e30b988e6428096d2ed0433a642a0dba0661ff701f6c1a9069cd018e6c206442a2ab1a51544c7bd11c428d59f5e0861a9", + "signedEip155": "0xf8d281c081fc85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc97820149a0134cdeef7235c96708b182bf62e0f593cebb51a8f87f8d7ce9ed071f3ca3d1b2a00b57fdf1ef1d3ff41e5d9f4e3ccb760e56a3951a9447d65e81081adf8ced2693", + "signedBerlin": "0x01f90171819381c081fc85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc97f89df89b943a72660413e06d13511ead0ed048bb7c536238f9f884a02b0ae05eea3e40b74365927909af95849ea0e6482d4979aa97b6de40184c5a96a04560e6afe698397a9a11b3a85c45a3f2a6929fa2120c0710256df5b8617b56aba04e970ecb45687241b20ee7e62a70ad70e85bfa354d2d77584f01424ab20bf542a046cd73ab4de9cfb90f17050cb48fc7df57f1614be6482ecb497806c761f7b1c680a050b7645600735307a5e5a1965488ec360e403d84d50c181126f06562a5408383a07feb5f51431ea451885bea667b219f838b2c3688e2e42cfbeadcc49ddd333edd", + "signedLondon": "0x02f9017a819381c082b7988791eb68de49c85c85accf9abbcc944bba4f66b87a2529e70e52bcdd8b94a913e2767f85837185bce5b8661a17a68b3cdf76066b519ebe4019e03f256f8f0767fa615451229d5f7585008fcb2fa8ceafe114f260c6ce30f73bd1ab35be5d2f3ddb1e94fa9c60c9e89779b0c15ea36cdd83921631dc3cac418c8bba914c163d414e83c8598544c0dd6cddc6337f4d9ebc97f89df89b943a72660413e06d13511ead0ed048bb7c536238f9f884a02b0ae05eea3e40b74365927909af95849ea0e6482d4979aa97b6de40184c5a96a04560e6afe698397a9a11b3a85c45a3f2a6929fa2120c0710256df5b8617b56aba04e970ecb45687241b20ee7e62a70ad70e85bfa354d2d77584f01424ab20bf542a046cd73ab4de9cfb90f17050cb48fc7df57f1614be6482ecb497806c761f7b1c601a0ba6627db62ad6ca800912c9b036e4169dd6ed97ed6f9f095f36e51fb9056bf7fa0517d26dc80e34a462429f3e2973ced95555b54247d8489bd838b51e5e16a836f", + "signatureLegacy": { + "r": "0x2062b236675901492e76b6ad262005163e30b988e6428096d2ed0433a642a0db", + "s": "0x661ff701f6c1a9069cd018e6c206442a2ab1a51544c7bd11c428d59f5e0861a9", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x134cdeef7235c96708b182bf62e0f593cebb51a8f87f8d7ce9ed071f3ca3d1b2", + "s": "0x0b57fdf1ef1d3ff41e5d9f4e3ccb760e56a3951a9447d65e81081adf8ced2693", + "v": "0x149" + }, + "signatureBerlin": { + "r": "0x50b7645600735307a5e5a1965488ec360e403d84d50c181126f06562a5408383", + "s": "0x7feb5f51431ea451885bea667b219f838b2c3688e2e42cfbeadcc49ddd333edd", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xba6627db62ad6ca800912c9b036e4169dd6ed97ed6f9f095f36e51fb9056bf7f", + "s": "0x517d26dc80e34a462429f3e2973ced95555b54247d8489bd838b51e5e16a836f", + "v": "0x1" + } + }, + { + "name": "random-39", + "transaction": { + "to": "0x275E9AC566C97647fD5216b229ce2Cb8128bF948", + "nonce": 139, + "gasLimit": "0xabdb21e8", + "gasPrice": "0x17", + "maxFeePerGas": "0x497e4daed53d", + "maxPriorityFeePerGas": "0x4118", + "data": "0x9433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef0044320", + "value": "0xda320b2a", + "accessList": [ + { + "address": "0x366AF0fb6B459916877728cb9a5c87A7d6535aa7", + "storageKeys": [ + "0x10f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0a", + "0xa250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbf", + "0x207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357", + "0x08684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9" + ] + }, + { + "address": "0xD9D3ab2DC5218e176Ae93Ce71C9adA512c042668", + "storageKeys": [ + "0x10f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0a", + "0xa250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbf", + "0x207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357", + "0x08684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9" + ] + }, + { + "address": "0x6a5f00E589a5F8c57e42987F7b143d35522d72eC", + "storageKeys": [ + "0x10f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0a", + "0xa250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbf", + "0x207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357", + "0x08684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9" + ] + } + ], + "chainId": "0x60" + }, + "privateKey": "0x80ca6dce69fdf87fd598f412f6cc1bbfcf7a728db8d83d87ae6f884edc90368a", + "unsignedLegacy": "0xf866818b1784abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef0044320", + "unsignedEip155": "0xf869818b1784abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef0044320608080", + "unsignedBerlin": "0x01f9024160818b1784abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef0044320f901d7f89b94366af0fb6b459916877728cb9a5c87a7d6535aa7f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b94d9d3ab2dc5218e176ae93ce71c9ada512c042668f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b946a5f00e589a5f8c57e42987f7b143d35522d72ecf884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9", + "unsignedLondon": "0x02f9024a60818b82411886497e4daed53d84abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef0044320f901d7f89b94366af0fb6b459916877728cb9a5c87a7d6535aa7f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b94d9d3ab2dc5218e176ae93ce71c9ada512c042668f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b946a5f00e589a5f8c57e42987f7b143d35522d72ecf884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9", + "signedLegacy": "0xf8a9818b1784abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef00443201ba041a6af4ceab25851b3769ffaa4a5699589faa1a17def6e0820790bc0e5b5b3a4a0378eb4b39701dd4c665e08f6038d2a48a23716827e787542237a5c1d904950c1", + "signedEip155": "0xf8aa818b1784abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef004432081e4a0d243d6d8dc2660874c03057ecbff435a54520a23bb823b6c73495edb3e1dc16ba0706cf3c866fe84328a4c78e85787bbd5acbbd3fce17fb9e5bba149c75e5c4de5", + "signedBerlin": "0x01f9028460818b1784abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef0044320f901d7f89b94366af0fb6b459916877728cb9a5c87a7d6535aa7f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b94d9d3ab2dc5218e176ae93ce71c9ada512c042668f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b946a5f00e589a5f8c57e42987f7b143d35522d72ecf884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a901a0031d8ffad6caca8069c73ac4c64707137f1e935ed64e9fd476ce0161434277a6a05b75a90fedac9c839598c384ae54f85ab777a02bbc09721e48dfd5c92301aba4", + "signedLondon": "0x02f9028d60818b82411886497e4daed53d84abdb21e894275e9ac566c97647fd5216b229ce2cb8128bf94884da320b2ab8429433426361d2e570b6e96780b7c9c6f3fd68517b2e28fffad2568551757910abbe4e7333e691dfd4b7de22da7ce269d623c2fe26cdb730da20dc78ee5c5ef0044320f901d7f89b94366af0fb6b459916877728cb9a5c87a7d6535aa7f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b94d9d3ab2dc5218e176ae93ce71c9ada512c042668f884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a9f89b946a5f00e589a5f8c57e42987f7b143d35522d72ecf884a010f4aad66f745c48095fb1992a3c978cac33fbf371667044df4188f43d12dc0aa0a250b183fce60762c98a54246dd7b9bb956bd6341da3e3b8b72dc336b24a1bbfa0207488efe80ffcb2fcac731fd7663809b3d2fc49ba7dfc4156252fa0e3ac4357a008684db0ae31e22bbefb1e44317338c4d4e26aafa719c7da18b0ded1aa1520a980a0f6aadb5b3874832195d613075b3094e9bdfa60a398c47395cb27da9bd625fbffa03def31f8037aa2e288a469ba5423b12b9cb3ba5190582bab1cbacdc63db6488c", + "signatureLegacy": { + "r": "0x41a6af4ceab25851b3769ffaa4a5699589faa1a17def6e0820790bc0e5b5b3a4", + "s": "0x378eb4b39701dd4c665e08f6038d2a48a23716827e787542237a5c1d904950c1", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xd243d6d8dc2660874c03057ecbff435a54520a23bb823b6c73495edb3e1dc16b", + "s": "0x706cf3c866fe84328a4c78e85787bbd5acbbd3fce17fb9e5bba149c75e5c4de5", + "v": "0xe4" + }, + "signatureBerlin": { + "r": "0x031d8ffad6caca8069c73ac4c64707137f1e935ed64e9fd476ce0161434277a6", + "s": "0x5b75a90fedac9c839598c384ae54f85ab777a02bbc09721e48dfd5c92301aba4", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xf6aadb5b3874832195d613075b3094e9bdfa60a398c47395cb27da9bd625fbff", + "s": "0x3def31f8037aa2e288a469ba5423b12b9cb3ba5190582bab1cbacdc63db6488c", + "v": "0x0" + } + }, + { + "name": "random-40", + "transaction": { + "to": "0x4cfC498D0352AfF969b9961A3E595cf1e5c06d40", + "nonce": 943, + "gasLimit": "0x17b0021c20", + "gasPrice": "0x35", + "maxFeePerGas": "0x1295d39b889d", + "maxPriorityFeePerGas": "0x1585", + "data": "0x1caf66c287", + "value": "0x95bc", + "accessList": [ + { + "address": "0xee94f0bFfE39C63B53c94d0a9fCBc1384C7de72D", + "storageKeys": [] + }, + { + "address": "0x69EDF19eed3FEFf59D5Ff3D202299B0a2f7Cfd47", + "storageKeys": [] + }, + { + "address": "0x1953C708C84Ff2c8eF15e3Bd7838F8537eeB5592", + "storageKeys": [] + } + ], + "chainId": "0xf9" + }, + "privateKey": "0x7724f2244faf4961b17878b5ba9013de1d9fd0f3642f1e729441828af7cf2aa9", + "unsignedLegacy": "0xe88203af358517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c287", + "unsignedEip155": "0xec8203af358517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c28781f98080", + "unsignedBerlin": "0x01f87181f98203af358517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c287f845d694ee94f0bffe39c63b53c94d0a9fcbc1384c7de72dc0d69469edf19eed3feff59d5ff3d202299b0a2f7cfd47c0d6941953c708c84ff2c8ef15e3bd7838f8537eeb5592c0", + "unsignedLondon": "0x02f87a81f98203af821585861295d39b889d8517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c287f845d694ee94f0bffe39c63b53c94d0a9fcbc1384c7de72dc0d69469edf19eed3feff59d5ff3d202299b0a2f7cfd47c0d6941953c708c84ff2c8ef15e3bd7838f8537eeb5592c0", + "signedLegacy": "0xf86b8203af358517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c2871ba09a27d6fff0a32facfe782a6f313da13410105af5aa8dc58de9c11db395d69b92a00ece93db036abb6a3ebba3228cbc075b3758440cab06f4fd93e490961645e5a9", + "signedEip155": "0xf86d8203af358517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c287820216a02f6c89405c28fe39a6e855f086ae307bed12c63ba96ac7c02fb33ccd157c394fa03dd3a80920a7a432aac71721435149392e4a107ff0eec216f2f7633871480a3d", + "signedBerlin": "0x01f8b481f98203af358517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c287f845d694ee94f0bffe39c63b53c94d0a9fcbc1384c7de72dc0d69469edf19eed3feff59d5ff3d202299b0a2f7cfd47c0d6941953c708c84ff2c8ef15e3bd7838f8537eeb5592c001a08538332ef13e023d44f02cc46a9963aa8627cbff51698e3e0f4ecdd7f613c845a073f4083a079d8a9274da07599f3d42642f766e3641def42e3f3e862d9c15fc35", + "signedLondon": "0x02f8bd81f98203af821585861295d39b889d8517b0021c20944cfc498d0352aff969b9961a3e595cf1e5c06d408295bc851caf66c287f845d694ee94f0bffe39c63b53c94d0a9fcbc1384c7de72dc0d69469edf19eed3feff59d5ff3d202299b0a2f7cfd47c0d6941953c708c84ff2c8ef15e3bd7838f8537eeb5592c080a0f8f8a37429e776dd5367d21ae0a0d5cd452e73eebefbc08298adf3c295ae5425a00a83b72e5047ec663d6b9bf89e222a927788f50197e61e01192e840518008b33", + "signatureLegacy": { + "r": "0x9a27d6fff0a32facfe782a6f313da13410105af5aa8dc58de9c11db395d69b92", + "s": "0x0ece93db036abb6a3ebba3228cbc075b3758440cab06f4fd93e490961645e5a9", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x2f6c89405c28fe39a6e855f086ae307bed12c63ba96ac7c02fb33ccd157c394f", + "s": "0x3dd3a80920a7a432aac71721435149392e4a107ff0eec216f2f7633871480a3d", + "v": "0x216" + }, + "signatureBerlin": { + "r": "0x8538332ef13e023d44f02cc46a9963aa8627cbff51698e3e0f4ecdd7f613c845", + "s": "0x73f4083a079d8a9274da07599f3d42642f766e3641def42e3f3e862d9c15fc35", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xf8f8a37429e776dd5367d21ae0a0d5cd452e73eebefbc08298adf3c295ae5425", + "s": "0x0a83b72e5047ec663d6b9bf89e222a927788f50197e61e01192e840518008b33", + "v": "0x0" + } + }, + { + "name": "random-41", + "transaction": { + "to": "0xbEEb2C2d9c5Fd84B19Dc8406f3e7cB3b383d98a4", + "nonce": 555, + "gasLimit": "0x6cfaad", + "gasPrice": "0x4e0ecb", + "maxFeePerGas": "0x3c7d01215a", + "maxPriorityFeePerGas": "0xe7", + "data": "0x615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab20", + "value": "0xdc6f8f5d", + "accessList": [ + { + "address": "0xC454EEb7ee4BdFdCE3BFf554800152182EF7C097", + "storageKeys": [ + "0x4b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67" + ] + }, + { + "address": "0xe155ba1797cc067cF6cdD6e5018cd62ebE9977F3", + "storageKeys": [ + "0x4b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67" + ] + }, + { + "address": "0xA8C0F3ac9f2e3C11e6E8765E94306c3a97104Fb2", + "storageKeys": [ + "0x4b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67" + ] + } + ], + "chainId": "0x2879e0" + }, + "privateKey": "0xf82f55a04b8e30377e18f40628703dd9fee4a7a6caaa8d2f5aedc9f93123eec8", + "unsignedLegacy": "0xf88b82022b834e0ecb836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab20", + "unsignedEip155": "0xf89182022b834e0ecb836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab20832879e08080", + "unsignedBerlin": "0x01f90139832879e082022b834e0ecb836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab20f8a8f794c454eeb7ee4bdfdce3bff554800152182ef7c097e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794e155ba1797cc067cf6cdd6e5018cd62ebe9977f3e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794a8c0f3ac9f2e3c11e6e8765e94306c3a97104fb2e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67", + "unsignedLondon": "0x02f9013d832879e082022b81e7853c7d01215a836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab20f8a8f794c454eeb7ee4bdfdce3bff554800152182ef7c097e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794e155ba1797cc067cf6cdd6e5018cd62ebe9977f3e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794a8c0f3ac9f2e3c11e6e8765e94306c3a97104fb2e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67", + "signedLegacy": "0xf8ce82022b834e0ecb836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab201ca08e6ce5e63cace5a18354d28ca6477ad74e02cbdb91057fbb8420c3721ae1b32aa046b3fa23841abde8f5d742370b7b13b3b674b0238a22fadaff8aefa81bba0d93", + "signedEip155": "0xf8d182022b834e0ecb836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab208350f3e4a056ea51270defc34b40baeab26e74af9143cc704281610039865ab7370af8ba83a07bb038ec920ce66e0b8f83ae8fd81a6dc556cba6dcb0c61b744e38b62709b478", + "signedBerlin": "0x01f9017c832879e082022b834e0ecb836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab20f8a8f794c454eeb7ee4bdfdce3bff554800152182ef7c097e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794e155ba1797cc067cf6cdd6e5018cd62ebe9977f3e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794a8c0f3ac9f2e3c11e6e8765e94306c3a97104fb2e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e6780a0f2aeb12cbd6168c7bf151d8376bd002ce41700df4c3dd9d1ab3dba4078d9c3daa03aa99c5c5f5cb34bc95c39c529b7e7d606c881f89e90e0f4732b96dd76e99fca", + "signedLondon": "0x02f90180832879e082022b81e7853c7d01215a836cfaad94beeb2c2d9c5fd84b19dc8406f3e7cb3b383d98a484dc6f8f5db864615d6f2cb0cca6f85cb5478633d0f0887e23e007405f03a4e1b9994b3e3e9dabee20754ea877032eacffca736cc3547210d81d06f02e1da8c2496faa7634fb602c2b61ae080c287ae87483b89b6545fec8267d66b7806488bbb136ccfd2e387a60c5ab20f8a8f794c454eeb7ee4bdfdce3bff554800152182ef7c097e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794e155ba1797cc067cf6cdd6e5018cd62ebe9977f3e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e67f794a8c0f3ac9f2e3c11e6e8765e94306c3a97104fb2e1a04b2b8301b1edbcc86612a691376d7ac3ced7229835b3516e1c75b47e8c6c9e6780a0582e1e9fde9a213765b7f609a3dde291c574f70332ec22c1790e149d84c23edaa0156dde50e29d5688883f442b8b8eef163829f9fe71f05f3d50876bc8a03a9475", + "signatureLegacy": { + "r": "0x8e6ce5e63cace5a18354d28ca6477ad74e02cbdb91057fbb8420c3721ae1b32a", + "s": "0x46b3fa23841abde8f5d742370b7b13b3b674b0238a22fadaff8aefa81bba0d93", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x56ea51270defc34b40baeab26e74af9143cc704281610039865ab7370af8ba83", + "s": "0x7bb038ec920ce66e0b8f83ae8fd81a6dc556cba6dcb0c61b744e38b62709b478", + "v": "0x50f3e4" + }, + "signatureBerlin": { + "r": "0xf2aeb12cbd6168c7bf151d8376bd002ce41700df4c3dd9d1ab3dba4078d9c3da", + "s": "0x3aa99c5c5f5cb34bc95c39c529b7e7d606c881f89e90e0f4732b96dd76e99fca", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x582e1e9fde9a213765b7f609a3dde291c574f70332ec22c1790e149d84c23eda", + "s": "0x156dde50e29d5688883f442b8b8eef163829f9fe71f05f3d50876bc8a03a9475", + "v": "0x0" + } + }, + { + "name": "random-42", + "transaction": { + "to": "0x99D259fA0C36DeA65ec8fDE1D3C7081BeA430DF1", + "nonce": 677, + "gasLimit": "0xeb0b358297", + "gasPrice": "0x621ef8", + "maxFeePerGas": "0xf32df1dc4b", + "maxPriorityFeePerGas": "0x0c53", + "data": "0x94d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec400", + "value": "0xf5fe", + "accessList": [ + { + "address": "0x3d8F00870C1739B6E5f72d0109F2064fB32e6C22", + "storageKeys": [ + "0xee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70" + ] + }, + { + "address": "0x911aC905fB319EF0CeE5A43a0CA1FB3d6077a402", + "storageKeys": [ + "0xee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70" + ] + }, + { + "address": "0x783877cEFF53159419b8DB718d43b33fe40f8418", + "storageKeys": [ + "0xee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70" + ] + } + ], + "chainId": "0x59b77c1375" + }, + "privateKey": "0xd7e8821b3701fdbe3b9ca4b5f6b5e21e938265fa8c67e1caf4aab1f01b17be03", + "unsignedLegacy": "0xf88d8202a583621ef885eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec400", + "unsignedEip155": "0xf8958202a583621ef885eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec4008559b77c13758080", + "unsignedBerlin": "0x01f9013d8559b77c13758202a583621ef885eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec400f8a8f7943d8f00870c1739b6e5f72d0109f2064fb32e6c22e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794911ac905fb319ef0cee5a43a0ca1fb3d6077a402e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794783877ceff53159419b8db718d43b33fe40f8418e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70", + "unsignedLondon": "0x02f901428559b77c13758202a5820c5385f32df1dc4b85eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec400f8a8f7943d8f00870c1739b6e5f72d0109f2064fb32e6c22e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794911ac905fb319ef0cee5a43a0ca1fb3d6077a402e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794783877ceff53159419b8db718d43b33fe40f8418e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70", + "signedLegacy": "0xf8d08202a583621ef885eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec4001ba0cbf3e146abb5f274935468ada3c659168a90199d16336acf804ef29c73363f1ca03e589c3ab80c41cff21c887588e60e0f7e7816d587320641801369c3ce4b3c10", + "signedEip155": "0xf8d58202a583621ef885eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec40085b36ef8270ea08a4651cc8cabd30cee1761af175cf4419ee3a17dd2ab0e5361408796a2da1ce3a0702a09546977e6519bf3eeb219b3220a038487252bbb52f55317aafb0e8151e7", + "signedBerlin": "0x01f901808559b77c13758202a583621ef885eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec400f8a8f7943d8f00870c1739b6e5f72d0109f2064fb32e6c22e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794911ac905fb319ef0cee5a43a0ca1fb3d6077a402e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794783877ceff53159419b8db718d43b33fe40f8418e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a7001a0999316db33ec39370e4c70219dc3cff231b8e8a56dd965b7a35209326e44fb36a021686604de607fa16f6e73f9a34aafbe1308636d40d9668ab0817ed7feb383be", + "signedLondon": "0x02f901858559b77c13758202a5820c5385f32df1dc4b85eb0b3582979499d259fa0c36dea65ec8fde1d3c7081bea430df182f5feb86694d441390bd900c56843909a0799e8f3908c6702c89c67a3ea68dbf5fd6b3eb68a640bf3a2b9933414a30c6c9b7ff0900f7a8c959947d863edb9ee876d4516f786eb86176ec2d2437517ae2e29b9854ffa1cd1c50c3ac51a8c6f4b0c27b6169bd39d7c2ec400f8a8f7943d8f00870c1739b6e5f72d0109f2064fb32e6c22e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794911ac905fb319ef0cee5a43a0ca1fb3d6077a402e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a70f794783877ceff53159419b8db718d43b33fe40f8418e1a0ee2d6635a495847dedc266f2a7c2e5567b52e52be5d343699d241b2b53540a7001a0ce27650e0a7c6ae4a99ce7587181e878a2e14647c6f36237d298a6c09caed34ba02bc7d420359a65365436b97ea664b789d2c9338cb8802436cd29fa6e9c3d15ca", + "signatureLegacy": { + "r": "0xcbf3e146abb5f274935468ada3c659168a90199d16336acf804ef29c73363f1c", + "s": "0x3e589c3ab80c41cff21c887588e60e0f7e7816d587320641801369c3ce4b3c10", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x8a4651cc8cabd30cee1761af175cf4419ee3a17dd2ab0e5361408796a2da1ce3", + "s": "0x702a09546977e6519bf3eeb219b3220a038487252bbb52f55317aafb0e8151e7", + "v": "0xb36ef8270e" + }, + "signatureBerlin": { + "r": "0x999316db33ec39370e4c70219dc3cff231b8e8a56dd965b7a35209326e44fb36", + "s": "0x21686604de607fa16f6e73f9a34aafbe1308636d40d9668ab0817ed7feb383be", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xce27650e0a7c6ae4a99ce7587181e878a2e14647c6f36237d298a6c09caed34b", + "s": "0x2bc7d420359a65365436b97ea664b789d2c9338cb8802436cd29fa6e9c3d15ca", + "v": "0x1" + } + }, + { + "name": "random-45", + "transaction": { + "to": "0x65E04b5881b4c6fB2285Cf279851a2159956b06A", + "nonce": 234, + "gasLimit": "0x1fe5d1", + "gasPrice": "0x0fb4", + "maxFeePerGas": "0x12855148", + "maxPriorityFeePerGas": "0x7c", + "data": "0x58a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d9094", + "value": "0xa171", + "accessList": [ + { + "address": "0x022A0e71D11AAb373afabfe9BeFd44681E9371Ef", + "storageKeys": [ + "0x59f7bf413b8e4fe25c1c744f85d99604ca804e2244bd4dab2ce6f5887da8e1d4", + "0x4ff150224b771fa7fcfdd80522c67e2315e1a2fd352991e254a0d65a793057f9", + "0x08b572b2ece8b7d3fec3ecae6317f9144e19cc170e1b5685f1ebda98e6fcf947" + ] + } + ], + "chainId": "0xff" + }, + "privateKey": "0xad73e2e29bce2e8bc51a1cd258fe6d63ac29ace059b760205588a0a9161c84c8", + "unsignedLegacy": "0xf87981ea820fb4831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d9094", + "unsignedEip155": "0xf87d81ea820fb4831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d909481ff8080", + "unsignedBerlin": "0x01f8f981ff81ea820fb4831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d9094f87cf87a94022a0e71d11aab373afabfe9befd44681e9371eff863a059f7bf413b8e4fe25c1c744f85d99604ca804e2244bd4dab2ce6f5887da8e1d4a04ff150224b771fa7fcfdd80522c67e2315e1a2fd352991e254a0d65a793057f9a008b572b2ece8b7d3fec3ecae6317f9144e19cc170e1b5685f1ebda98e6fcf947", + "unsignedLondon": "0x02f8fc81ff81ea7c8412855148831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d9094f87cf87a94022a0e71d11aab373afabfe9befd44681e9371eff863a059f7bf413b8e4fe25c1c744f85d99604ca804e2244bd4dab2ce6f5887da8e1d4a04ff150224b771fa7fcfdd80522c67e2315e1a2fd352991e254a0d65a793057f9a008b572b2ece8b7d3fec3ecae6317f9144e19cc170e1b5685f1ebda98e6fcf947", + "signedLegacy": "0xf8bc81ea820fb4831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d90941ba02f87ea5c3e1c312086023d4e0abb184095dd796a36ba237b8b597a59580c2fc5a07e1009c25e6e9c9dbf9f590259d646b39faf6852afba7cc6a21107c723a87b7d", + "signedEip155": "0xf8be81ea820fb4831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d9094820222a0a95dd6e42d318d6534baabf8e67f28e3290a3f28d91c83fdb0e3670d89b1890aa018acdfbedd486cf553b5470a4e5b5c58e4c81bb97eee3f32d3c695839ced604a", + "signedBerlin": "0x01f9013c81ff81ea820fb4831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d9094f87cf87a94022a0e71d11aab373afabfe9befd44681e9371eff863a059f7bf413b8e4fe25c1c744f85d99604ca804e2244bd4dab2ce6f5887da8e1d4a04ff150224b771fa7fcfdd80522c67e2315e1a2fd352991e254a0d65a793057f9a008b572b2ece8b7d3fec3ecae6317f9144e19cc170e1b5685f1ebda98e6fcf94701a09f37dfeff391049c13007dd139cb3b5b80f615fe66d14949a9967099ded07bbea008aab334a01393b36fc3babda6b2b42f0385f803618b0818a64d7de660b468b8", + "signedLondon": "0x02f9013f81ff81ea7c8412855148831fe5d19465e04b5881b4c6fb2285cf279851a2159956b06a82a171b85658a9f5e2882a35d966f0a20d1dd924cae16ec675fbc07673c9b46a7b56d7b38e5553651d8efb26438905ca05ad263d629a847164ac3dd274f43643b89ef6fb2481ac31a2ec93fffd7dd77c48518074e0d14ed79d9094f87cf87a94022a0e71d11aab373afabfe9befd44681e9371eff863a059f7bf413b8e4fe25c1c744f85d99604ca804e2244bd4dab2ce6f5887da8e1d4a04ff150224b771fa7fcfdd80522c67e2315e1a2fd352991e254a0d65a793057f9a008b572b2ece8b7d3fec3ecae6317f9144e19cc170e1b5685f1ebda98e6fcf94701a08f453d8e8e48447f2ce1b259dc8e568e3f1861e968fbfda21dcdf5417ebea5f1a02b7859bff470645d6b8328300c16a02b744179a5ae0c1c000d0a562ad6296800", + "signatureLegacy": { + "r": "0x2f87ea5c3e1c312086023d4e0abb184095dd796a36ba237b8b597a59580c2fc5", + "s": "0x7e1009c25e6e9c9dbf9f590259d646b39faf6852afba7cc6a21107c723a87b7d", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xa95dd6e42d318d6534baabf8e67f28e3290a3f28d91c83fdb0e3670d89b1890a", + "s": "0x18acdfbedd486cf553b5470a4e5b5c58e4c81bb97eee3f32d3c695839ced604a", + "v": "0x222" + }, + "signatureBerlin": { + "r": "0x9f37dfeff391049c13007dd139cb3b5b80f615fe66d14949a9967099ded07bbe", + "s": "0x08aab334a01393b36fc3babda6b2b42f0385f803618b0818a64d7de660b468b8", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x8f453d8e8e48447f2ce1b259dc8e568e3f1861e968fbfda21dcdf5417ebea5f1", + "s": "0x2b7859bff470645d6b8328300c16a02b744179a5ae0c1c000d0a562ad6296800", + "v": "0x1" + } + }, + { + "name": "random-46", + "transaction": { + "to": "0x0cf2069a11a3B48173897Db9134CAfCAda3B8354", + "nonce": 465, + "gasLimit": "0xebd9", + "gasPrice": "0xb7", + "maxFeePerGas": "0x2ab05f48", + "maxPriorityFeePerGas": "0x6e55", + "data": "0xf0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b2", + "value": "0x2af005ea", + "accessList": [ + { + "address": "0x434d7Ca3CA8C2Fba48E8dDFCCf1d30eF7B12aE51", + "storageKeys": [ + "0x8b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54", + "0x37806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20", + "0x4d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2b", + "0x109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3" + ] + }, + { + "address": "0x55AADff2F7735D40FFbC4ffa3dC344A0A50408Fd", + "storageKeys": [ + "0x8b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54", + "0x37806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20", + "0x4d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2b", + "0x109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3" + ] + } + ], + "chainId": "0x91bdcc" + }, + "privateKey": "0x013e161cd76a200390e2d448828af2bff4cea1847888835dd26ef6454409196f", + "unsignedLegacy": "0xf8978201d181b782ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b2", + "unsignedEip155": "0xf89d8201d181b782ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b28391bdcc8080", + "unsignedBerlin": "0x01f901d88391bdcc8201d181b782ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b2f9013af89b94434d7ca3ca8c2fba48e8ddfccf1d30ef7b12ae51f884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3f89b9455aadff2f7735d40ffbc4ffa3dc344a0a50408fdf884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3", + "unsignedLondon": "0x02f901de8391bdcc8201d1826e55842ab05f4882ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b2f9013af89b94434d7ca3ca8c2fba48e8ddfccf1d30ef7b12ae51f884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3f89b9455aadff2f7735d40ffbc4ffa3dc344a0a50408fdf884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3", + "signedLegacy": "0xf8da8201d181b782ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b21ca030affe0222e2c8153ca6c8ae33521d1fad0bb9bb01a4abcb155394d796374e8da065ed0a3871dfd83a094e32b0ea9d9597567ef32ebe21d33a01b1ca87dcc9a2e8", + "signedEip155": "0xf8de8201d181b782ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b28401237bbca0844bf29bd92674d62ab2b96d2830ec2baa47bbe6bf0b619f6187c6d2b75e976aa065a997e4bde3ed9db480b9427f43d3abf822b5f5c325b52d5460dedee5d3e513", + "signedBerlin": "0x01f9021b8391bdcc8201d181b782ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b2f9013af89b94434d7ca3ca8c2fba48e8ddfccf1d30ef7b12ae51f884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3f89b9455aadff2f7735d40ffbc4ffa3dc344a0a50408fdf884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c380a039545e9fca9a290aa7c978bbc8d3ea59bbd9dcc3fc9442b3a31bf1ab33b610c3a06fac20bc46b616182c01800f950ae8776bd652878c7ae4b1d9c3fe57f4ba1d8f", + "signedLondon": "0x02f902218391bdcc8201d1826e55842ab05f4882ebd9940cf2069a11a3b48173897db9134cafcada3b8354842af005eab873f0132f763bb6f7a3e68007ff95b988a1e8338e6a13343c2023d26890f7d90a9dc67200f94079f3c9e5ab0d67f39787aca865aa767e1e473d9a19750425ce60377c5c7ee741b3a30de627fecffa0fbb5d509c0d54ad0ab8ddb3f3c914290708064503b70ba40e59533fbedab3b5fc4a54d357b2f9013af89b94434d7ca3ca8c2fba48e8ddfccf1d30ef7b12ae51f884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c3f89b9455aadff2f7735d40ffbc4ffa3dc344a0a50408fdf884a08b9a6cf730d48a2bbc521bcf10327bfecf3263e82fc76fafb04048946693ee54a037806f0dbb413600b101c313d365edd55f6065ba8c27f63bd5baf5c6fdfaca20a04d3d7bda2653c7735bf1579cb60ca68edb90b8e1a71c313e89d4d60230695b2ba0109cce912233f26218363565b1726b177bdd687d6f799569682d450bb95332c380a00783f362296e2de35b1676c565ef3551611de838ea4f7189060e41b479859f63a0389179ac6bdd9ba2feb09d752fd510c77d7c494802d9072a9abc56369e44ccfa", + "signatureLegacy": { + "r": "0x30affe0222e2c8153ca6c8ae33521d1fad0bb9bb01a4abcb155394d796374e8d", + "s": "0x65ed0a3871dfd83a094e32b0ea9d9597567ef32ebe21d33a01b1ca87dcc9a2e8", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x844bf29bd92674d62ab2b96d2830ec2baa47bbe6bf0b619f6187c6d2b75e976a", + "s": "0x65a997e4bde3ed9db480b9427f43d3abf822b5f5c325b52d5460dedee5d3e513", + "v": "0x1237bbc" + }, + "signatureBerlin": { + "r": "0x39545e9fca9a290aa7c978bbc8d3ea59bbd9dcc3fc9442b3a31bf1ab33b610c3", + "s": "0x6fac20bc46b616182c01800f950ae8776bd652878c7ae4b1d9c3fe57f4ba1d8f", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x0783f362296e2de35b1676c565ef3551611de838ea4f7189060e41b479859f63", + "s": "0x389179ac6bdd9ba2feb09d752fd510c77d7c494802d9072a9abc56369e44ccfa", + "v": "0x0" + } + }, + { + "name": "random-47", + "transaction": { + "to": "0x3aA0502f1644DD08cE5B717E08F3eec80232527d", + "nonce": 313, + "gasLimit": "0x8da2bcbf", + "gasPrice": "0x39", + "maxFeePerGas": "0xd9587c1f", + "maxPriorityFeePerGas": "0x6715ce", + "data": "0x19bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b8", + "value": "0xc101", + "accessList": [ + { + "address": "0x69ab4C6cf7a0098464D6Fd4CC4dAb8916aC0221f", + "storageKeys": [] + }, + { + "address": "0x3ee8Ea47479755ffbfdDaD11241aDFE1c3d9fF84", + "storageKeys": [] + }, + { + "address": "0x87A28064A49b65e77955dd25cBD4a6874161C9c9", + "storageKeys": [] + } + ], + "chainId": "0x0305ec" + }, + "privateKey": "0x7980f7b7b4d6a62db3a4a47e275d04f54c4501eb2d7ec4de963cce5e65b51c8a", + "unsignedLegacy": "0xf87482013939848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b8", + "unsignedEip155": "0xf87a82013939848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b8830305ec8080", + "unsignedBerlin": "0x01f8bf830305ec82013939848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b8f845d69469ab4c6cf7a0098464d6fd4cc4dab8916ac0221fc0d6943ee8ea47479755ffbfddad11241adfe1c3d9ff84c0d69487a28064a49b65e77955dd25cbd4a6874161c9c9c0", + "unsignedLondon": "0x02f8c7830305ec820139836715ce84d9587c1f848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b8f845d69469ab4c6cf7a0098464d6fd4cc4dab8916ac0221fc0d6943ee8ea47479755ffbfddad11241adfe1c3d9ff84c0d69487a28064a49b65e77955dd25cbd4a6874161c9c9c0", + "signedLegacy": "0xf8b782013939848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b81ba051a1d4078e6a95a45bd34efde5ff639d83192e80209a98280ec77809ee036f05a036b1cb0eab89d8205905dbcc533e64a57796711d7092e8ba4859afb14f69e092", + "signedEip155": "0xf8ba82013939848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b883060bfba099f65f8d767d7bda3c7e4f9e45695c46f15cc9c0ed109c58b023497da12159f0a0080dbf7dd30dbbb83cfac8b2a68877ae12c61c052016f148fe13f0f8e7381116", + "signedBerlin": "0x01f90102830305ec82013939848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b8f845d69469ab4c6cf7a0098464d6fd4cc4dab8916ac0221fc0d6943ee8ea47479755ffbfddad11241adfe1c3d9ff84c0d69487a28064a49b65e77955dd25cbd4a6874161c9c9c001a0603d85eeea77ac11878471c5f489fde067b5f371c1b2f8bf10b8c924751c2eeea055fdb52e233f1c2d330d900531326b67feb985625694f11025b7f898f2687d49", + "signedLondon": "0x02f90109830305ec820139836715ce84d9587c1f848da2bcbf943aa0502f1644dd08ce5b717e08f3eec80232527d82c101b85119bc705651755df645ab3a8f64614b1f0e4819c6fa07df21eaba82b14185bf405877677729bd3cf35984e2de6795d26af8e54021ed5d7bbdc05c51a6b9a61be558d36f8faaf89a3f805a4b2d714c0001b8f845d69469ab4c6cf7a0098464d6fd4cc4dab8916ac0221fc0d6943ee8ea47479755ffbfddad11241adfe1c3d9ff84c0d69487a28064a49b65e77955dd25cbd4a6874161c9c9c001a03389836cb2482eedde630892c9ecd41e5eb360269a61a3942f141f6fe82b2c469f9bef6660e1476ffb208e6ce92e25554d4257555be9cc4c93b920943456dd69", + "signatureLegacy": { + "r": "0x51a1d4078e6a95a45bd34efde5ff639d83192e80209a98280ec77809ee036f05", + "s": "0x36b1cb0eab89d8205905dbcc533e64a57796711d7092e8ba4859afb14f69e092", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x99f65f8d767d7bda3c7e4f9e45695c46f15cc9c0ed109c58b023497da12159f0", + "s": "0x080dbf7dd30dbbb83cfac8b2a68877ae12c61c052016f148fe13f0f8e7381116", + "v": "0x60bfb" + }, + "signatureBerlin": { + "r": "0x603d85eeea77ac11878471c5f489fde067b5f371c1b2f8bf10b8c924751c2eee", + "s": "0x55fdb52e233f1c2d330d900531326b67feb985625694f11025b7f898f2687d49", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x3389836cb2482eedde630892c9ecd41e5eb360269a61a3942f141f6fe82b2c46", + "s": "0x009bef6660e1476ffb208e6ce92e25554d4257555be9cc4c93b920943456dd69", + "v": "0x1" + } + }, + { + "name": "random-51", + "transaction": { + "to": "0x4e69f72240ac6Aaf17136AC50eaa0537386559A5", + "nonce": 325, + "gasLimit": "0xea85", + "gasPrice": "0xd5aaa99c", + "maxFeePerGas": "0x3fa7d3a2be", + "maxPriorityFeePerGas": "0x57c317", + "data": "0x7b6016ee17355d87", + "value": "0x66", + "accessList": [ + { + "address": "0xD222671eAD9dfc329d5D8c026eaE8Cd365055A85", + "storageKeys": [ + "0xee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6" + ] + }, + { + "address": "0x62E4aA34CF93eC006c48bA16d99C6A572425637E", + "storageKeys": [ + "0xee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6" + ] + }, + { + "address": "0x732A9Ea0DC31cF2777fA3591e4d92E44B68f531f", + "storageKeys": [ + "0xee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6" + ] + }, + { + "address": "0xe304770850F193Bb64Fd886BbB4490a31d7aB87a", + "storageKeys": [ + "0xee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6" + ] + } + ], + "chainId": "0x7b91" + }, + "privateKey": "0x654940aea19dcc610d8b16d4700edea808dc2e1e1937df49f85355a1244560c5", + "unsignedLegacy": "0xea82014584d5aaa99c82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d87", + "unsignedEip155": "0xef82014584d5aaa99c82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d87827b918080", + "unsignedBerlin": "0x01f9010f827b9182014584d5aaa99c82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d87f8e0f794d222671ead9dfc329d5d8c026eae8cd365055a85e1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f79462e4aa34cf93ec006c48ba16d99c6a572425637ee1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794732a9ea0dc31cf2777fa3591e4d92e44b68f531fe1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794e304770850f193bb64fd886bbb4490a31d7ab87ae1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6", + "unsignedLondon": "0x02f90114827b918201458357c317853fa7d3a2be82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d87f8e0f794d222671ead9dfc329d5d8c026eae8cd365055a85e1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f79462e4aa34cf93ec006c48ba16d99c6a572425637ee1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794732a9ea0dc31cf2777fa3591e4d92e44b68f531fe1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794e304770850f193bb64fd886bbb4490a31d7ab87ae1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6", + "signedLegacy": "0xf86d82014584d5aaa99c82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d871ca0900052b11f5d174f31eea36be35630286e100540adbd6adbc84369612fd0e229a016080f943398b8ba89dde1da6f5cb340adc8b2e5fdc8263dd3e60ad010b51fb2", + "signedEip155": "0xf86f82014584d5aaa99c82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d8782f746a04eaaea56717c0549da1a6e037a99461afaaaa1a3959f865e59ee9bacfae3dcc1a07071e4740ff6ccd1e73b0ac71679c52aec7ba2f9eadafa07016044df8cd6f499", + "signedBerlin": "0x01f90152827b9182014584d5aaa99c82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d87f8e0f794d222671ead9dfc329d5d8c026eae8cd365055a85e1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f79462e4aa34cf93ec006c48ba16d99c6a572425637ee1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794732a9ea0dc31cf2777fa3591e4d92e44b68f531fe1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794e304770850f193bb64fd886bbb4490a31d7ab87ae1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc601a0e2aae0c324b90fa3a12f3b1a6f9fc7dd998afbde5c409446b89b3992dd645f29a019f7e7f961fd01b0c5a20dfd74a65dd99258d0a281e47fc8e6a5b6dc5440d2ef", + "signedLondon": "0x02f90157827b918201458357c317853fa7d3a2be82ea85944e69f72240ac6aaf17136ac50eaa0537386559a566887b6016ee17355d87f8e0f794d222671ead9dfc329d5d8c026eae8cd365055a85e1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f79462e4aa34cf93ec006c48ba16d99c6a572425637ee1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794732a9ea0dc31cf2777fa3591e4d92e44b68f531fe1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc6f794e304770850f193bb64fd886bbb4490a31d7ab87ae1a0ee0f927beda950cfbd87cd0595d90eff86a4bf9be7f5aa686d98e2c790748cc601a04126aaae682f639fdb7d4695e76e25acbcc3ef8724755b64e72ab9b70760a41da048243ab65dfca0b16edcd142a61e8f7d9cac69ac92aa762ee1d2ca29f4d8096a", + "signatureLegacy": { + "r": "0x900052b11f5d174f31eea36be35630286e100540adbd6adbc84369612fd0e229", + "s": "0x16080f943398b8ba89dde1da6f5cb340adc8b2e5fdc8263dd3e60ad010b51fb2", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x4eaaea56717c0549da1a6e037a99461afaaaa1a3959f865e59ee9bacfae3dcc1", + "s": "0x7071e4740ff6ccd1e73b0ac71679c52aec7ba2f9eadafa07016044df8cd6f499", + "v": "0xf746" + }, + "signatureBerlin": { + "r": "0xe2aae0c324b90fa3a12f3b1a6f9fc7dd998afbde5c409446b89b3992dd645f29", + "s": "0x19f7e7f961fd01b0c5a20dfd74a65dd99258d0a281e47fc8e6a5b6dc5440d2ef", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x4126aaae682f639fdb7d4695e76e25acbcc3ef8724755b64e72ab9b70760a41d", + "s": "0x48243ab65dfca0b16edcd142a61e8f7d9cac69ac92aa762ee1d2ca29f4d8096a", + "v": "0x1" + } + }, + { + "name": "random-52", + "transaction": { + "to": "0x3e00e0B5C5CcFA5c38527D655b6172dd8bBd2Ea4", + "nonce": 202, + "gasLimit": "0xcda9bd8a", + "gasPrice": "0x9a", + "maxFeePerGas": "0xa7dce37f49df12", + "maxPriorityFeePerGas": "0x90a6", + "data": "0x4e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a5", + "value": "0x57534b", + "accessList": [ + { + "address": "0x9F06365D9DC6532A44a10142967a1646Cf90444A", + "storageKeys": [] + } + ], + "chainId": "0x288bdcb0ac" + }, + "privateKey": "0x0c9141b6a6f541969356556163aeb412c35f24ab354aa949c8cc6f13588f8079", + "unsignedLegacy": "0xf89881ca819a84cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a5", + "unsignedEip155": "0xf8a081ca819a84cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a585288bdcb0ac8080", + "unsignedBerlin": "0x01f8b685288bdcb0ac81ca819a84cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a5d7d6949f06365d9dc6532a44a10142967a1646cf90444ac0", + "unsignedLondon": "0x02f8bf85288bdcb0ac81ca8290a687a7dce37f49df1284cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a5d7d6949f06365d9dc6532a44a10142967a1646cf90444ac0", + "signedLegacy": "0xf8db81ca819a84cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a51ba08a71cea78f99d8f986e83f6366450a1bebe9707f3c87aad09b503f09b9bb6ac4a07f9e913ce4137b0c676187e8542510d945e92a989fef1a51482b1190a3a5190b", + "signedEip155": "0xf8e081ca819a84cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a5855117b9617ba088d9e6905b32c45f1f3dbd3d8c0056e7925b228a5c58f811c63df65401b08cf5a06b60bebba0d4c51fbaffcfa27949b7104d414cbf80d2dad3da7849c3f8acac4b", + "signedBerlin": "0x01f8f985288bdcb0ac81ca819a84cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a5d7d6949f06365d9dc6532a44a10142967a1646cf90444ac080a0a203d99158ce9ea8c1b361d8ff8ab8003c0435fce82fa5911109082dd44b337da03b78df7f2ad389471892636f1cea4cadcaac5204995b02791c68f8eb6546a051", + "signedLondon": "0x02f9010285288bdcb0ac81ca8290a687a7dce37f49df1284cda9bd8a943e00e0b5c5ccfa5c38527d655b6172dd8bbd2ea48357534bb8744e447bcb11ac2fb3d165deab35002bd126820952bb44438b2a342cefd29a7e41533cf101af42d980f231e5d599912e4823878f98e76ad09d0127f87fdd2eb386f0954d451337c6671efd06cf06f07219b5c05dd9904bf970ea106bb6271662290a26d775d7290149ca8a98f6ae4a52b32c63c8a5d7d6949f06365d9dc6532a44a10142967a1646cf90444ac001a0559c27f4e75acc7331bcc8b875d62dba7e543a84a856427be60cce36eb414028a025d690c27c7894475231f56bf167a3c27c1cb420b644e3df25f716bf5b00cf41", + "signatureLegacy": { + "r": "0x8a71cea78f99d8f986e83f6366450a1bebe9707f3c87aad09b503f09b9bb6ac4", + "s": "0x7f9e913ce4137b0c676187e8542510d945e92a989fef1a51482b1190a3a5190b", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x88d9e6905b32c45f1f3dbd3d8c0056e7925b228a5c58f811c63df65401b08cf5", + "s": "0x6b60bebba0d4c51fbaffcfa27949b7104d414cbf80d2dad3da7849c3f8acac4b", + "v": "0x5117b9617b" + }, + "signatureBerlin": { + "r": "0xa203d99158ce9ea8c1b361d8ff8ab8003c0435fce82fa5911109082dd44b337d", + "s": "0x3b78df7f2ad389471892636f1cea4cadcaac5204995b02791c68f8eb6546a051", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x559c27f4e75acc7331bcc8b875d62dba7e543a84a856427be60cce36eb414028", + "s": "0x25d690c27c7894475231f56bf167a3c27c1cb420b644e3df25f716bf5b00cf41", + "v": "0x1" + } + }, + { + "name": "random-53", + "transaction": { + "to": "0x3b3B6D650025ABf5599bf26ADABCEDF4A63CDb34", + "nonce": 922, + "gasLimit": "0x1a3b0c", + "gasPrice": "0x4d", + "maxFeePerGas": "0xd3fd4bca49", + "maxPriorityFeePerGas": "0xc2e0a8", + "data": "0x8be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1a", + "value": "0xb4f60d69ef", + "accessList": [ + { + "address": "0x1B6918B4DAAB3915815357dD5AF7bE83dcAd25a5", + "storageKeys": [] + }, + { + "address": "0xF6dCa07C60494bdBcb3B463baF59d14dbce5C797", + "storageKeys": [] + }, + { + "address": "0xcfA40043C444874077612568938d89404251Bb43", + "storageKeys": [] + }, + { + "address": "0x5364966cd61C60B5eB2Fef17A1CdD14f962E6f7d", + "storageKeys": [] + } + ], + "chainId": "0xe28d72" + }, + "privateKey": "0xe5f155384029218e2a82f8de19144e48d8bd0ca7dcdcffc3efdcad1c261eb97b", + "unsignedLegacy": "0xf87882039a4d831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1a", + "unsignedEip155": "0xf87e82039a4d831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1a83e28d728080", + "unsignedBerlin": "0x01f8da83e28d7282039a4d831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1af85cd6941b6918b4daab3915815357dd5af7be83dcad25a5c0d694f6dca07c60494bdbcb3b463baf59d14dbce5c797c0d694cfa40043c444874077612568938d89404251bb43c0d6945364966cd61c60b5eb2fef17a1cdd14f962e6f7dc0", + "unsignedLondon": "0x02f8e383e28d7282039a83c2e0a885d3fd4bca49831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1af85cd6941b6918b4daab3915815357dd5af7be83dcad25a5c0d694f6dca07c60494bdbcb3b463baf59d14dbce5c797c0d694cfa40043c444874077612568938d89404251bb43c0d6945364966cd61c60b5eb2fef17a1cdd14f962e6f7dc0", + "signedLegacy": "0xf8bb82039a4d831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1a1ca04a07725156a0a0cf4aaf75a3005c94c57cc9f1ba9773de86c780c81bd1db3a43a05a7b3935859dd78390b21c0fcc1018337d89b7df57ccbc65289005ac72e2e509", + "signedEip155": "0xf8bf82039a4d831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1a8401c51b07a0726f6f773ab0f273b93ce92b1018e48c3ce68f63e72750a40223953fa07ce038a0379085e3a60a16ebbd5db8c9bd13925c5fcb8c1c8111ee6abc495a8a9dac9ecd", + "signedBerlin": "0x01f9011d83e28d7282039a4d831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1af85cd6941b6918b4daab3915815357dd5af7be83dcad25a5c0d694f6dca07c60494bdbcb3b463baf59d14dbce5c797c0d694cfa40043c444874077612568938d89404251bb43c0d6945364966cd61c60b5eb2fef17a1cdd14f962e6f7dc001a0917df8f39d122b383d4344c870b89b44985f43201d2534e2d6af4a581138a67ea02fddca418f6bd459f3e26abe7eeb622f7d63ddb99c89602d7f64aff008e70a39", + "signedLondon": "0x02f9012683e28d7282039a83c2e0a885d3fd4bca49831a3b0c943b3b6d650025abf5599bf26adabcedf4a63cdb3485b4f60d69efb8538be3026408a8fcd18d9f3a9cb0d6f9a1664806a3628008a16b0226c1d239afde18bc4358d3342c5476fdfbf24ff6f16bcf034f9c822ec25954a45aa061a64a0f5fc50d40d1bfac466419e3a626e0abf245ce1af85cd6941b6918b4daab3915815357dd5af7be83dcad25a5c0d694f6dca07c60494bdbcb3b463baf59d14dbce5c797c0d694cfa40043c444874077612568938d89404251bb43c0d6945364966cd61c60b5eb2fef17a1cdd14f962e6f7dc080a06321ab229ef8cf2675f3d47dc63b91ab5acab467717cc480a2f2055c8ab48a2da0207601d794539aa72129157bc83e29a2cb87b7c8b4f9ee2c2272a132472c053a", + "signatureLegacy": { + "r": "0x4a07725156a0a0cf4aaf75a3005c94c57cc9f1ba9773de86c780c81bd1db3a43", + "s": "0x5a7b3935859dd78390b21c0fcc1018337d89b7df57ccbc65289005ac72e2e509", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x726f6f773ab0f273b93ce92b1018e48c3ce68f63e72750a40223953fa07ce038", + "s": "0x379085e3a60a16ebbd5db8c9bd13925c5fcb8c1c8111ee6abc495a8a9dac9ecd", + "v": "0x1c51b07" + }, + "signatureBerlin": { + "r": "0x917df8f39d122b383d4344c870b89b44985f43201d2534e2d6af4a581138a67e", + "s": "0x2fddca418f6bd459f3e26abe7eeb622f7d63ddb99c89602d7f64aff008e70a39", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x6321ab229ef8cf2675f3d47dc63b91ab5acab467717cc480a2f2055c8ab48a2d", + "s": "0x207601d794539aa72129157bc83e29a2cb87b7c8b4f9ee2c2272a132472c053a", + "v": "0x0" + } + }, + { + "name": "random-54", + "transaction": { + "to": "0x627b9201a0BeDE5524ac0Ff8f95af471f2cBA572", + "nonce": 235, + "gasLimit": "0x5b9169", + "gasPrice": "0x1cc7887efd", + "maxFeePerGas": "0xb9cd0e540d8d79", + "maxPriorityFeePerGas": "0xe4764b", + "data": "0xfbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf24", + "value": "0x6aa38d50", + "accessList": [ + { + "address": "0xe8F9ac8eEd79272F2865E5Fad50B407dba179200", + "storageKeys": [ + "0x147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acf", + "0x3899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38", + "0x2fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8", + "0x6b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfd" + ] + }, + { + "address": "0xc87c5Cf7175827146469C29e281258f5eA4Fb13A", + "storageKeys": [ + "0x147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acf", + "0x3899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38", + "0x2fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8", + "0x6b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfd" + ] + } + ], + "chainId": "0xb1d83657bc" + }, + "privateKey": "0x918683982947996514ab3b4831d707bc8e95a960e9a83b777c7862a94e8110fe", + "unsignedLegacy": "0xf89a81eb851cc7887efd835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf24", + "unsignedEip155": "0xf8a281eb851cc7887efd835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf2485b1d83657bc8080", + "unsignedBerlin": "0x01f901dd85b1d83657bc81eb851cc7887efd835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf24f9013af89b94e8f9ac8eed79272f2865e5fad50b407dba179200f884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfdf89b94c87c5cf7175827146469c29e281258f5ea4fb13af884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfd", + "unsignedLondon": "0x02f901e385b1d83657bc81eb83e4764b87b9cd0e540d8d79835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf24f9013af89b94e8f9ac8eed79272f2865e5fad50b407dba179200f884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfdf89b94c87c5cf7175827146469c29e281258f5ea4fb13af884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfd", + "signedLegacy": "0xf8dd81eb851cc7887efd835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf241ba003210206de97071ddfad589a05d072bc1eb3113977e5f09d9ff24b79760d9a94a036d618fde6e25ab9e9934b7417618e2c732928e34f5f0e76d09c58d75043c871", + "signedEip155": "0xf8e381eb851cc7887efd835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf24860163b06caf9ba086dc8667987f4e9d5d452ba9b6ca056c142453a5da206b5b252519ab64cbc400a074f0841beba40a22a2639886dac6ffbcd06740c7c028e901ca79554e4d4e4e33", + "signedBerlin": "0x01f9022085b1d83657bc81eb851cc7887efd835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf24f9013af89b94e8f9ac8eed79272f2865e5fad50b407dba179200f884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfdf89b94c87c5cf7175827146469c29e281258f5ea4fb13af884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfd80a05d1fd8cdc59c77d5e9d8d7bb6983e2c510c9bd802c782fac786502570839f5f9a01d2c5f7c41b07b83f2a847f4e5ec97e4a6659b12f6c64296aa2ce8f21cc9c2f0", + "signedLondon": "0x02f9022685b1d83657bc81eb83e4764b87b9cd0e540d8d79835b916994627b9201a0bede5524ac0ff8f95af471f2cba572846aa38d50b872fbf7e3c457459b3bdd12e04bacd531cae09b4a2c3c058c743bde847c7d092bf2dc921a06af5594a9fbae14f7afbb98ce088a5893d926c615419cdb465e69832def1c0106a84ddb685568f8df6fe7b9110b7720b57298883db0d8411bc8bd6e94f9358f749719587937197be545317978cf24f9013af89b94e8f9ac8eed79272f2865e5fad50b407dba179200f884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfdf89b94c87c5cf7175827146469c29e281258f5ea4fb13af884a0147ad1e04dc4a163ed1ab1e06cc767561b953956bfbea7da6801191105959acfa03899cbf0de63ad1a2a4e59b2b89c9f07c9050dac577c70427948960a7f8eda38a02fffac1b3728b3dc6c9470bc5c576fac560163565b19d58c2ffab0f4cd511de8a06b527be8895ca1a8a5bf53d19aa463dc9626e5e35a42ceddb273f6986cb19dfd80a06ae588bdfc7a47891d548f249851b14d11e4aedd09fd5c04d7902a24831da997a0480cf2c49c9f80491ac8e174b3bf87b596bbe88d32f1e2d5b228ea1425503007", + "signatureLegacy": { + "r": "0x03210206de97071ddfad589a05d072bc1eb3113977e5f09d9ff24b79760d9a94", + "s": "0x36d618fde6e25ab9e9934b7417618e2c732928e34f5f0e76d09c58d75043c871", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x86dc8667987f4e9d5d452ba9b6ca056c142453a5da206b5b252519ab64cbc400", + "s": "0x74f0841beba40a22a2639886dac6ffbcd06740c7c028e901ca79554e4d4e4e33", + "v": "0x163b06caf9b" + }, + "signatureBerlin": { + "r": "0x5d1fd8cdc59c77d5e9d8d7bb6983e2c510c9bd802c782fac786502570839f5f9", + "s": "0x1d2c5f7c41b07b83f2a847f4e5ec97e4a6659b12f6c64296aa2ce8f21cc9c2f0", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x6ae588bdfc7a47891d548f249851b14d11e4aedd09fd5c04d7902a24831da997", + "s": "0x480cf2c49c9f80491ac8e174b3bf87b596bbe88d32f1e2d5b228ea1425503007", + "v": "0x0" + } + }, + { + "name": "random-55", + "transaction": { + "to": "0x16956bB9eb69550DE37fC267501e14A5515D6dFA", + "nonce": 983, + "gasLimit": "0x9d1947", + "gasPrice": "0xf8ddddaf", + "maxFeePerGas": "0xb72fb36f12", + "maxPriorityFeePerGas": "0x41f0", + "data": "0xcca9d435f73a63ff", + "value": "0xde694d", + "accessList": [ + { + "address": "0xf31afb826f3BfD3071FaA91340129D449a0c889a", + "storageKeys": [ + "0x46e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cb", + "0x2939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389" + ] + }, + { + "address": "0xe3431Bd6A55eaf5E6e3EfFB8c9Da31422fd58A31", + "storageKeys": [ + "0x46e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cb", + "0x2939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389" + ] + }, + { + "address": "0xaE9f344D1207d4499BacF56edE4Ef4b85D17aAB4", + "storageKeys": [ + "0x46e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cb", + "0x2939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389" + ] + }, + { + "address": "0xF4Ada8bC0115258EAF149196f358e374FECB6f7d", + "storageKeys": [ + "0x46e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cb", + "0x2939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389" + ] + } + ], + "chainId": "0x6bba4364" + }, + "privateKey": "0x137ea6a6eacd95abf006c234ec8ada1a0a1efe733fb8fecf37db48c17ce44df6", + "unsignedLegacy": "0xee8203d784f8ddddaf839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63ff", + "unsignedEip155": "0xf58203d784f8ddddaf839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63ff846bba43648080", + "unsignedBerlin": "0x01f901a2846bba43648203d784f8ddddaf839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63fff9016cf85994f31afb826f3bfd3071faa91340129d449a0c889af842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994e3431bd6a55eaf5e6e3effb8c9da31422fd58a31f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994ae9f344d1207d4499bacf56ede4ef4b85d17aab4f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994f4ada8bc0115258eaf149196f358e374fecb6f7df842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389", + "unsignedLondon": "0x02f901a6846bba43648203d78241f085b72fb36f12839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63fff9016cf85994f31afb826f3bfd3071faa91340129d449a0c889af842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994e3431bd6a55eaf5e6e3effb8c9da31422fd58a31f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994ae9f344d1207d4499bacf56ede4ef4b85d17aab4f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994f4ada8bc0115258eaf149196f358e374fecb6f7df842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389", + "signedLegacy": "0xf8718203d784f8ddddaf839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63ff1ca070e544a02ece6a47bc00e68838cae01bd65a0065603b87f09203bb59b5efd99fa05d46cd43fd26a0b982acd5c7993cb41e4de80b77969b6a0470c7cf6f3c9f054a", + "signedEip155": "0xf8758203d784f8ddddaf839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63ff84d77486eba08e1191fe12b393310f8fb2abb6074a136ae4f98bd0442fa890475a50562f97b9a00f4bacd10be5df1c17ba82236d3781dbded8a52d706cba8197781bc015de7081", + "signedBerlin": "0x01f901e5846bba43648203d784f8ddddaf839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63fff9016cf85994f31afb826f3bfd3071faa91340129d449a0c889af842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994e3431bd6a55eaf5e6e3effb8c9da31422fd58a31f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994ae9f344d1207d4499bacf56ede4ef4b85d17aab4f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994f4ada8bc0115258eaf149196f358e374fecb6f7df842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c2438901a005f5f2ec9356791f65e15da49518059ce948c67d486a4e36f7a9c12bb3bcce0aa010c58f445aaddcbaf83fcf287c39ca39b6e7a07c712d722ae7dfd2c4689c3182", + "signedLondon": "0x02f901e9846bba43648203d78241f085b72fb36f12839d19479416956bb9eb69550de37fc267501e14a5515d6dfa83de694d88cca9d435f73a63fff9016cf85994f31afb826f3bfd3071faa91340129d449a0c889af842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994e3431bd6a55eaf5e6e3effb8c9da31422fd58a31f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994ae9f344d1207d4499bacf56ede4ef4b85d17aab4f842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c24389f85994f4ada8bc0115258eaf149196f358e374fecb6f7df842a046e816297a43ce7d94b8c6bdb6cca1159fd7b6242778aa1964c438a31f0e78cba02939d4452e9498a49b3765a9a401a5ac36223086ae576012c6ca8311a9c2438980a02f5e0e0b5ada76f4d4fa9fbbdd9c55f5b0f71a4c307de72d22d0641be70868f9a0213abf45ab63703d83d449501a2d91b808b2462fc196c06da8aada39d1832073", + "signatureLegacy": { + "r": "0x70e544a02ece6a47bc00e68838cae01bd65a0065603b87f09203bb59b5efd99f", + "s": "0x5d46cd43fd26a0b982acd5c7993cb41e4de80b77969b6a0470c7cf6f3c9f054a", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x8e1191fe12b393310f8fb2abb6074a136ae4f98bd0442fa890475a50562f97b9", + "s": "0x0f4bacd10be5df1c17ba82236d3781dbded8a52d706cba8197781bc015de7081", + "v": "0xd77486eb" + }, + "signatureBerlin": { + "r": "0x05f5f2ec9356791f65e15da49518059ce948c67d486a4e36f7a9c12bb3bcce0a", + "s": "0x10c58f445aaddcbaf83fcf287c39ca39b6e7a07c712d722ae7dfd2c4689c3182", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x2f5e0e0b5ada76f4d4fa9fbbdd9c55f5b0f71a4c307de72d22d0641be70868f9", + "s": "0x213abf45ab63703d83d449501a2d91b808b2462fc196c06da8aada39d1832073", + "v": "0x0" + } + }, + { + "name": "random-57", + "transaction": { + "to": "0x8D587B077f84921E7B45A2Fc1209c3580be37956", + "nonce": 389, + "gasLimit": "0x3590c0", + "gasPrice": "0x54", + "maxFeePerGas": "0x71fa92e5e1cc", + "maxPriorityFeePerGas": "0xd4b6", + "data": "0xde568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596ee", + "value": "0x90fa", + "accessList": [ + { + "address": "0xbc779883FF90455a2E6008776951485719472bE6", + "storageKeys": [ + "0x2bc39a03b5f8bf3405e1df4450634b4a33cd60dc1d00fd79173c97d5fdebacaa", + "0x6fd0e4c4e3dcb01d49d0d0b5169fd3f8f46bae2676d80f6d7ed7eebfe927e808", + "0xa1a9d7f16bb9c5733025eb1c54fb3cd7de7e4a67eec53992191281f034ec7ecf" + ] + } + ], + "chainId": "0xda" + }, + "privateKey": "0x5d7cbce511e04fffbb632f04623d274c69004680bbfe47f642d781933cc43401", + "unsignedLegacy": "0xf86482018554833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596ee", + "unsignedEip155": "0xf86882018554833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596ee81da8080", + "unsignedBerlin": "0x01f8e481da82018554833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596eef87cf87a94bc779883ff90455a2e6008776951485719472be6f863a02bc39a03b5f8bf3405e1df4450634b4a33cd60dc1d00fd79173c97d5fdebacaaa06fd0e4c4e3dcb01d49d0d0b5169fd3f8f46bae2676d80f6d7ed7eebfe927e808a0a1a9d7f16bb9c5733025eb1c54fb3cd7de7e4a67eec53992191281f034ec7ecf", + "unsignedLondon": "0x02f8ed81da82018582d4b68671fa92e5e1cc833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596eef87cf87a94bc779883ff90455a2e6008776951485719472be6f863a02bc39a03b5f8bf3405e1df4450634b4a33cd60dc1d00fd79173c97d5fdebacaaa06fd0e4c4e3dcb01d49d0d0b5169fd3f8f46bae2676d80f6d7ed7eebfe927e808a0a1a9d7f16bb9c5733025eb1c54fb3cd7de7e4a67eec53992191281f034ec7ecf", + "signedLegacy": "0xf8a782018554833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596ee1ba0daee610c21d26de0d296b5be04d683b488760a7848b789d742dfd9f28d3832dfa009ec88625ad3f3d3083cf70e7de44de6382e001397bbf7cee9e5cdc2d5834c20", + "signedEip155": "0xf8a982018554833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596ee8201d8a09f327c24ae39283fe49ea21d60ce7af7d44680f9e2191e244cd8f7270ee53203a0740bc5ca8b8b393caa49ec981c567269614b3bcc5e64df0f1020f4832ddd95aa", + "signedBerlin": "0x01f9012781da82018554833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596eef87cf87a94bc779883ff90455a2e6008776951485719472be6f863a02bc39a03b5f8bf3405e1df4450634b4a33cd60dc1d00fd79173c97d5fdebacaaa06fd0e4c4e3dcb01d49d0d0b5169fd3f8f46bae2676d80f6d7ed7eebfe927e808a0a1a9d7f16bb9c5733025eb1c54fb3cd7de7e4a67eec53992191281f034ec7ecf01a0f67940ac1017f768c5c5e24a2a4decbca9f004762cfded4dd46f5ca3603178eca012f23bf646c2c3cffd652fd94a1045db4fb16541e3b0075afafb6f119c8b2e83", + "signedLondon": "0x02f9013081da82018582d4b68671fa92e5e1cc833590c0948d587b077f84921e7b45a2fc1209c3580be379568290fab842de568480020f1e491e429456dc8a200ce1e693ad33110d110c458f848d767d1496756035ce2a29357cee04ef33f8deae3fa54fcbf9d669a552e38dd1354a4e2596eef87cf87a94bc779883ff90455a2e6008776951485719472be6f863a02bc39a03b5f8bf3405e1df4450634b4a33cd60dc1d00fd79173c97d5fdebacaaa06fd0e4c4e3dcb01d49d0d0b5169fd3f8f46bae2676d80f6d7ed7eebfe927e808a0a1a9d7f16bb9c5733025eb1c54fb3cd7de7e4a67eec53992191281f034ec7ecf01a02e6fb20ea115ecfd8c1e78b39f4da06e8afff2c89b98b4f02bed77c6946e30f5a013cbbacab6fe5b963901683afccff8c2248161ac8828316e3ec70c9988504fa8", + "signatureLegacy": { + "r": "0xdaee610c21d26de0d296b5be04d683b488760a7848b789d742dfd9f28d3832df", + "s": "0x09ec88625ad3f3d3083cf70e7de44de6382e001397bbf7cee9e5cdc2d5834c20", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x9f327c24ae39283fe49ea21d60ce7af7d44680f9e2191e244cd8f7270ee53203", + "s": "0x740bc5ca8b8b393caa49ec981c567269614b3bcc5e64df0f1020f4832ddd95aa", + "v": "0x1d8" + }, + "signatureBerlin": { + "r": "0xf67940ac1017f768c5c5e24a2a4decbca9f004762cfded4dd46f5ca3603178ec", + "s": "0x12f23bf646c2c3cffd652fd94a1045db4fb16541e3b0075afafb6f119c8b2e83", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x2e6fb20ea115ecfd8c1e78b39f4da06e8afff2c89b98b4f02bed77c6946e30f5", + "s": "0x13cbbacab6fe5b963901683afccff8c2248161ac8828316e3ec70c9988504fa8", + "v": "0x1" + } + }, + { + "name": "random-58", + "transaction": { + "to": "0x75d29838Cea84FCa64D51c6Ec1a8569EB7DC50Ab", + "nonce": 429, + "gasLimit": "0xfdf81cbd", + "gasPrice": "0xc7698e80", + "maxFeePerGas": "0x624be7e9ac40fc", + "maxPriorityFeePerGas": "0x9a7ccc", + "data": "0x8c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52c", + "value": "0x57627fbfba", + "accessList": [], + "chainId": "0x3e78" + }, + "privateKey": "0xc50b3899129411ea0f9d8e13e45e85a35d02b4523d47aed0e2acb5650c861e08", + "unsignedLegacy": "0xf84a8201ad84c7698e8084fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52c", + "unsignedEip155": "0xf84f8201ad84c7698e8084fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52c823e788080", + "unsignedBerlin": "0x01f84e823e788201ad84c7698e8084fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52cc0", + "unsignedLondon": "0x02f855823e788201ad839a7ccc87624be7e9ac40fc84fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52cc0", + "signedLegacy": "0xf88d8201ad84c7698e8084fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52c1ba070ea0b2283eff406478a3aec263220e343e0194d2d40be6eef804c83cea75f74a07de5ca832515fb951911c9ad0638ea43ed072ea74712dcbb430ded8e4d2f5fbd", + "signedEip155": "0xf88f8201ad84c7698e8084fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52c827d13a01bd7f8dd351c6dd9d56d7a40b3b4c387b1772ce70eca80be6900eb055723d337a073fcf25e7be207d894fb377bc3581cdf541af33ce8abcd603dcffa4733e698c8", + "signedBerlin": "0x01f891823e788201ad84c7698e8084fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52cc080a00b7426fe4242d01693dc430a6c10036b0a06f017e282bf2a20b93cebe17260c9a07d7b51b8715c7b8bccdd0954cdbed5933d49c98fca2a35ab7afc365567227ce2", + "signedLondon": "0x02f898823e788201ad839a7ccc87624be7e9ac40fc84fdf81cbd9475d29838cea84fca64d51c6ec1a8569eb7dc50ab8557627fbfbaa18c155565770c9988b3eae6c8edbc5e933c560fa7022445f1f49bc17d6dad44a52cc001a00a50c2a7c9245468e7ddf8220baabd71fc4504602c33efaa4f23833c5c667d7aa03778391d9f2fae27737a08b5a416c57efd5e842a74eddfe347c8a72c22538924", + "signatureLegacy": { + "r": "0x70ea0b2283eff406478a3aec263220e343e0194d2d40be6eef804c83cea75f74", + "s": "0x7de5ca832515fb951911c9ad0638ea43ed072ea74712dcbb430ded8e4d2f5fbd", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x1bd7f8dd351c6dd9d56d7a40b3b4c387b1772ce70eca80be6900eb055723d337", + "s": "0x73fcf25e7be207d894fb377bc3581cdf541af33ce8abcd603dcffa4733e698c8", + "v": "0x7d13" + }, + "signatureBerlin": { + "r": "0x0b7426fe4242d01693dc430a6c10036b0a06f017e282bf2a20b93cebe17260c9", + "s": "0x7d7b51b8715c7b8bccdd0954cdbed5933d49c98fca2a35ab7afc365567227ce2", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x0a50c2a7c9245468e7ddf8220baabd71fc4504602c33efaa4f23833c5c667d7a", + "s": "0x3778391d9f2fae27737a08b5a416c57efd5e842a74eddfe347c8a72c22538924", + "v": "0x1" + } + }, + { + "name": "random-59", + "transaction": { + "to": "0x760dB83f7B207A736F8588A22106af54F936524e", + "nonce": 852, + "gasLimit": "0x9fbf", + "gasPrice": "0x0a", + "maxFeePerGas": "0x04b726a269", + "maxPriorityFeePerGas": "0xb06f", + "data": "0x7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824b", + "value": "0x993bc7c3", + "accessList": [], + "chainId": "0x90a8e085c5" + }, + "privateKey": "0x82ab59938e77af5fd4c82d25507f079711e94366216b3db9f773265034311ecd", + "unsignedLegacy": "0xf8728203540a829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824b", + "unsignedEip155": "0xf87a8203540a829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824b8590a8e085c58080", + "unsignedBerlin": "0x01f8798590a8e085c58203540a829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824bc0", + "unsignedLondon": "0x02f8818590a8e085c582035482b06f8504b726a269829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824bc0", + "signedLegacy": "0xf8b58203540a829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824b1ba046bdb17647bae97038423a77566f002c15ffd27b425c4d673d487668857bd27ea07193f81712f19872dea3d11c40c97afdc1d1e84f3553cfd0b7898b53007bc2c1", + "signedEip155": "0xf8bb8203540a829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824b86012151c10baea03dc69952e1f9d5e2fdba43226d76fed64fb1125cbd4c75f0f1b1e5b34a1e8ce9a0700ef41aa70699b67bb7bea476f6eb9e7b979c922c7fd9322ee601198abb618a", + "signedBerlin": "0x01f8bb8590a8e085c58203540a829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824bc0809f092b2451c26150f293f67b0a3506669aaab9b76f6946194e393dfe38cabb9da064bbac715ab68588bcfa79a64b85345c9339e900c5b4ef23f5c696013bb8e47c", + "signedLondon": "0x02f8c48590a8e085c582035482b06f8504b726a269829fbf94760db83f7b207a736f8588a22106af54f936524e84993bc7c3b84f7b6360232a0d6cb301d443473c9bc014381b26671af0d96f734fd2bdd2bc88d00e0d2b59230a1c65134e967795db7ad1310a277986a7bb5d23ca83a53a2faa223bbf66381a6778c9ecaf32579d824bc001a09396b1fc222afa6ba054712ad53cc25e27261f7e5d9f605ad9bf4d64b0821b84a0430504071e428a448609849fdcc0962e69f9ed39708d068caac0ae7c24c5487b", + "signatureLegacy": { + "r": "0x46bdb17647bae97038423a77566f002c15ffd27b425c4d673d487668857bd27e", + "s": "0x7193f81712f19872dea3d11c40c97afdc1d1e84f3553cfd0b7898b53007bc2c1", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x3dc69952e1f9d5e2fdba43226d76fed64fb1125cbd4c75f0f1b1e5b34a1e8ce9", + "s": "0x700ef41aa70699b67bb7bea476f6eb9e7b979c922c7fd9322ee601198abb618a", + "v": "0x12151c10bae" + }, + "signatureBerlin": { + "r": "0x00092b2451c26150f293f67b0a3506669aaab9b76f6946194e393dfe38cabb9d", + "s": "0x64bbac715ab68588bcfa79a64b85345c9339e900c5b4ef23f5c696013bb8e47c", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x9396b1fc222afa6ba054712ad53cc25e27261f7e5d9f605ad9bf4d64b0821b84", + "s": "0x430504071e428a448609849fdcc0962e69f9ed39708d068caac0ae7c24c5487b", + "v": "0x1" + } + }, + { + "name": "random-62", + "transaction": { + "to": "0xdc1Fde9eaDDb50Aff5a565E490D14CBB29464a04", + "nonce": 257, + "gasLimit": "0xc569764d7a", + "gasPrice": "0x900dc629ce", + "maxFeePerGas": "0x9819e85255", + "maxPriorityFeePerGas": "0x4e7b", + "data": "0xa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e7", + "value": "0x1e049e3c71", + "accessList": [ + { + "address": "0x61885BBb4861f6C13c7dBd00a6a3D5eA3A36914F", + "storageKeys": [ + "0xf3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7d", + "0xa827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24", + "0x6cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54" + ] + }, + { + "address": "0xE2a1D257A226DE30d8371f648D5b9673629CD457", + "storageKeys": [ + "0xf3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7d", + "0xa827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24", + "0x6cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54" + ] + }, + { + "address": "0x3F272680b8FFd6DE85Bf93b0C5E9C22d708c2D71", + "storageKeys": [ + "0xf3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7d", + "0xa827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24", + "0x6cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54" + ] + } + ], + "chainId": "0xf82dcbe5" + }, + "privateKey": "0x8e38480b740fa4337bd501dc8adfc1e062ad2c26c3e712a0cdc5797b0e2cd0fc", + "unsignedLegacy": "0xf88b82010185900dc629ce85c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e7", + "unsignedEip155": "0xf89282010185900dc629ce85c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e784f82dcbe58080", + "unsignedBerlin": "0x01f9020784f82dcbe582010185900dc629ce85c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e7f90174f87a9461885bbb4861f6c13c7dbd00a6a3d5ea3a36914ff863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a94e2a1d257a226de30d8371f648d5b9673629cd457f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a943f272680b8ffd6de85bf93b0c5e9c22d708c2d71f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54", + "unsignedLondon": "0x02f9020a84f82dcbe5820101824e7b859819e8525585c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e7f90174f87a9461885bbb4861f6c13c7dbd00a6a3d5ea3a36914ff863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a94e2a1d257a226de30d8371f648d5b9673629cd457f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a943f272680b8ffd6de85bf93b0c5e9c22d708c2d71f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54", + "signedLegacy": "0xf8ce82010185900dc629ce85c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e71ba05e84bd2ecdd7e7ea421bfd4a859fbe7b478ca88442bd3b20adf85e49293d2312a031f44666a5cca48b6b2826a878e858143b3d5cb0ba67dc555190a94660396bbd", + "signedEip155": "0xf8d382010185900dc629ce85c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e78501f05b97eda01ffd81ec5dfc0ef32e8546bc90e52e20505ebebb59f22c0a03cf3d04ef9d0574a027d5b8fca35bcf33f81601e3da32dd7b7a55329e70c4eef9bc8b93b1e073863a", + "signedBerlin": "0x01f9024a84f82dcbe582010185900dc629ce85c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e7f90174f87a9461885bbb4861f6c13c7dbd00a6a3d5ea3a36914ff863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a94e2a1d257a226de30d8371f648d5b9673629cd457f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a943f272680b8ffd6de85bf93b0c5e9c22d708c2d71f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d5480a048da43f5985816fc18f85baa8ec561529b50686fbdca4cfdfbbb0406c167a77fa065c6116280fb31c7d105a2d5e9eac260168e92bc99e90cb34d666faedf90f2a6", + "signedLondon": "0x02f9024d84f82dcbe5820101824e7b859819e8525585c569764d7a94dc1fde9eaddb50aff5a565e490d14cbb29464a04851e049e3c71b85fa2162f5f8fa934704347147c5c76135cc29d2507f9e775dcbcf09d42e6c4e99412d0889d84ed584e3f8303cf406fe846709aa0e64c5b97c5cbb930311425bcf940d855af054c635b9895a02420778ddc72b2804043c9752cff12f2a7bce5e7f90174f87a9461885bbb4861f6c13c7dbd00a6a3d5ea3a36914ff863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a94e2a1d257a226de30d8371f648d5b9673629cd457f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d54f87a943f272680b8ffd6de85bf93b0c5e9c22d708c2d71f863a0f3d63d0b40060713983bb1ca15151c0920f3b1c6cc3505fbb69f72c212d52a7da0a827cf299e1063d0f5481a10aba398911b6be26e46725a5a9b2f66813850cb24a06cf850f316a8abd17c3255a59b1b73436c7721793c44a28f0c28410f08546d5480a086ecaf1d98ab1f04ea04517c2c1b022d035ee8476b6082dd785487b1d8bc103da074d83dc523ea9fa01d6fb698ced3d5f2143ca700f35cfda327a45b0a6d9d5180", + "signatureLegacy": { + "r": "0x5e84bd2ecdd7e7ea421bfd4a859fbe7b478ca88442bd3b20adf85e49293d2312", + "s": "0x31f44666a5cca48b6b2826a878e858143b3d5cb0ba67dc555190a94660396bbd", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x1ffd81ec5dfc0ef32e8546bc90e52e20505ebebb59f22c0a03cf3d04ef9d0574", + "s": "0x27d5b8fca35bcf33f81601e3da32dd7b7a55329e70c4eef9bc8b93b1e073863a", + "v": "0x1f05b97ed" + }, + "signatureBerlin": { + "r": "0x48da43f5985816fc18f85baa8ec561529b50686fbdca4cfdfbbb0406c167a77f", + "s": "0x65c6116280fb31c7d105a2d5e9eac260168e92bc99e90cb34d666faedf90f2a6", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x86ecaf1d98ab1f04ea04517c2c1b022d035ee8476b6082dd785487b1d8bc103d", + "s": "0x74d83dc523ea9fa01d6fb698ced3d5f2143ca700f35cfda327a45b0a6d9d5180", + "v": "0x0" + } + }, + { + "name": "random-63", + "transaction": { + "to": "0xB85AE10711562BCB3974dfB1EaE1beda3Bc67dBd", + "nonce": 512, + "gasLimit": "0x678622c5", + "gasPrice": "0x4d61", + "maxFeePerGas": "0xfa139367d1ea", + "maxPriorityFeePerGas": "0xbd", + "data": "0x189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a816", + "value": "0x94eacf62ef", + "accessList": [ + { + "address": "0x59A9aa6004324B4C1E5Ca16b31E5062d65d69f02", + "storageKeys": [] + }, + { + "address": "0x59Cb2199dB7c40F512dcADe23d726F6Bc4300247", + "storageKeys": [] + }, + { + "address": "0x1e14CE82C1FcEcB1D3786a7657Da422Dd7B1b475", + "storageKeys": [] + }, + { + "address": "0xFD9e6D34C58d53ad14A216700677D4452EBAfd36", + "storageKeys": [] + } + ], + "chainId": "0x0833" + }, + "privateKey": "0xe5ff5923aacdb3a189dcefe4c03d3e22bfaf4192ea7bbd24be98894f62171a57", + "unsignedLegacy": "0xf875820200824d6184678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a816", + "unsignedEip155": "0xf87a820200824d6184678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a8168208338080", + "unsignedBerlin": "0x01f8d6820833820200824d6184678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a816f85cd69459a9aa6004324b4c1e5ca16b31e5062d65d69f02c0d69459cb2199db7c40f512dcade23d726f6bc4300247c0d6941e14ce82c1fcecb1d3786a7657da422dd7b1b475c0d694fd9e6d34c58d53ad14a216700677d4452ebafd36c0", + "unsignedLondon": "0x02f8dc82083382020081bd86fa139367d1ea84678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a816f85cd69459a9aa6004324b4c1e5ca16b31e5062d65d69f02c0d69459cb2199db7c40f512dcade23d726f6bc4300247c0d6941e14ce82c1fcecb1d3786a7657da422dd7b1b475c0d694fd9e6d34c58d53ad14a216700677d4452ebafd36c0", + "signedLegacy": "0xf8b8820200824d6184678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a8161ca0d100a5c518d6f29d7de500c124105a22a15addf8ca5e4f31f3b4b3720658242fa00c21b393bc705b9aa8e68075448641b3a9d408066a9fd12a7b17e44980d756c2", + "signedEip155": "0xf8ba820200824d6184678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a81682108aa05f09e2cf8d6c18ce021226999a1a5f01fe563e1ada5b994e404472abd23b6634a06d481fc532616c1f5302f0947f2e0661b53839ef435fec2906f5e6d910733a90", + "signedBerlin": "0x01f90119820833820200824d6184678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a816f85cd69459a9aa6004324b4c1e5ca16b31e5062d65d69f02c0d69459cb2199db7c40f512dcade23d726f6bc4300247c0d6941e14ce82c1fcecb1d3786a7657da422dd7b1b475c0d694fd9e6d34c58d53ad14a216700677d4452ebafd36c080a00ced1859b647e40df4d6e32e413b6589eabcead59f7d5dd4d538fb3e5988da7ba075419572d86c97c46f6763007a203dba5edd6e86a0f9aceff809f615b4d51fe7", + "signedLondon": "0x02f9011f82083382020081bd86fa139367d1ea84678622c594b85ae10711562bcb3974dfb1eae1beda3bc67dbd8594eacf62efb84d189c5bf9b458be808435ba5e5c9436050c855aef11641fc00a329863a0b8d00ebb49dc92aa7466795df26f52f7f097a8951212994dcf084f3115eeeabd49d8215bea1e541872f3c7dbdab7a816f85cd69459a9aa6004324b4c1e5ca16b31e5062d65d69f02c0d69459cb2199db7c40f512dcade23d726f6bc4300247c0d6941e14ce82c1fcecb1d3786a7657da422dd7b1b475c0d694fd9e6d34c58d53ad14a216700677d4452ebafd36c080a0acd28e8cfb3fd1dffa4cfb2572db96a5ee26f0b355c43f4823dfac161fd0a41ea06cece03756ae904b414a82e9835e94d66426f2e114f6a6b27e8ec6ef301fb14c", + "signatureLegacy": { + "r": "0xd100a5c518d6f29d7de500c124105a22a15addf8ca5e4f31f3b4b3720658242f", + "s": "0x0c21b393bc705b9aa8e68075448641b3a9d408066a9fd12a7b17e44980d756c2", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x5f09e2cf8d6c18ce021226999a1a5f01fe563e1ada5b994e404472abd23b6634", + "s": "0x6d481fc532616c1f5302f0947f2e0661b53839ef435fec2906f5e6d910733a90", + "v": "0x108a" + }, + "signatureBerlin": { + "r": "0x0ced1859b647e40df4d6e32e413b6589eabcead59f7d5dd4d538fb3e5988da7b", + "s": "0x75419572d86c97c46f6763007a203dba5edd6e86a0f9aceff809f615b4d51fe7", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xacd28e8cfb3fd1dffa4cfb2572db96a5ee26f0b355c43f4823dfac161fd0a41e", + "s": "0x6cece03756ae904b414a82e9835e94d66426f2e114f6a6b27e8ec6ef301fb14c", + "v": "0x0" + } + }, + { + "name": "random-64", + "transaction": { + "to": "0x5539b0d27740010A98894024d7bc891BA7831c89", + "nonce": 202, + "gasLimit": "0xce08", + "gasPrice": "0xa98f2fe0", + "maxFeePerGas": "0xb6def202b0f4", + "maxPriorityFeePerGas": "0xaadc80", + "data": "0xee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf0", + "value": "0x1a", + "accessList": [ + { + "address": "0xfe6cb2C3e37532B4Ef13e79C233Ca64C7fFfCFD2", + "storageKeys": [ + "0x3f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4da", + "0x3c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afb", + "0x042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69", + "0x19bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42e" + ] + }, + { + "address": "0x832f5283Be3D816CF155e453F9841bDE8e7F7B4c", + "storageKeys": [ + "0x3f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4da", + "0x3c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afb", + "0x042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69", + "0x19bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42e" + ] + } + ], + "chainId": "0x8f57" + }, + "privateKey": "0xd735911d166a6cc3b7288e08e58d1d810440dff7199e28d035f17c5475cfcba9", + "unsignedLegacy": "0xf86581ca84a98f2fe082ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf0", + "unsignedEip155": "0xf86a81ca84a98f2fe082ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf0828f578080", + "unsignedBerlin": "0x01f901a5828f5781ca84a98f2fe082ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf0f9013af89b94fe6cb2c3e37532b4ef13e79c233ca64c7fffcfd2f884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42ef89b94832f5283be3d816cf155e453f9841bde8e7f7b4cf884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42e", + "unsignedLondon": "0x02f901ab828f5781ca83aadc8086b6def202b0f482ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf0f9013af89b94fe6cb2c3e37532b4ef13e79c233ca64c7fffcfd2f884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42ef89b94832f5283be3d816cf155e453f9841bde8e7f7b4cf884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42e", + "signedLegacy": "0xf8a881ca84a98f2fe082ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf01ca0d6fa62491249727468d0fac1e118d3bba3a1aca4fa8ccf70f0b48191ee28dcd2a07a6449ef22046b3ee78dcbb679f6cc3e0e958f45953fef0f208d4623fdde5060", + "signedEip155": "0xf8ab81ca84a98f2fe082ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf083011ed1a0c431dae73c4ea339bcb4b405e8893c214cb226988be2e3f86e9fe2f950748a54a01a37da795992fb7ab283bab65288f6ba4dee8a697e44f2643f25d5e30ca654d9", + "signedBerlin": "0x01f901e8828f5781ca84a98f2fe082ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf0f9013af89b94fe6cb2c3e37532b4ef13e79c233ca64c7fffcfd2f884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42ef89b94832f5283be3d816cf155e453f9841bde8e7f7b4cf884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42e01a02b095db07b5ea8f065f4f435584402fb7730fe7fca5b789240933e301180b74ea002db343bc2c8222cfb725ebbd52ba8b1b3803306be88e25c1f6dffa16d80575b", + "signedLondon": "0x02f901ee828f5781ca83aadc8086b6def202b0f482ce08945539b0d27740010a98894024d7bc891ba7831c891ab843ee92680b2bc0569bc3f3da09f480bf73551977592ba8c6d35dfb61252044ccd69b7b02817756a04db6a62c707c8e64911decd90558ac036a710035b9ca8e452f13daf0f9013af89b94fe6cb2c3e37532b4ef13e79c233ca64c7fffcfd2f884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42ef89b94832f5283be3d816cf155e453f9841bde8e7f7b4cf884a03f7287d0cdd0cfadcc6d18290da205685c27be85e3d12daef93a1806094cb4daa03c776b188d069ebea086ee553dd81252288e85dd97888241729f1fd7bc325afba0042759b1a75adf64c51a69af2c6adbc31be5048fe0cb67ac78a7824d4371df69a019bdc1e9a710c49b222bd23a56d135ed44d0d9ea50920b279b5182683484b42e01a0c215cbfc101481356dfe98ad23d60186c05a0ed15f3d74f1deedc7f1fe4dfe0aa05ca25ede5de59283cf790b50316b7a183075832a4ba96446692ba34c2235a32c", + "signatureLegacy": { + "r": "0xd6fa62491249727468d0fac1e118d3bba3a1aca4fa8ccf70f0b48191ee28dcd2", + "s": "0x7a6449ef22046b3ee78dcbb679f6cc3e0e958f45953fef0f208d4623fdde5060", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xc431dae73c4ea339bcb4b405e8893c214cb226988be2e3f86e9fe2f950748a54", + "s": "0x1a37da795992fb7ab283bab65288f6ba4dee8a697e44f2643f25d5e30ca654d9", + "v": "0x11ed1" + }, + "signatureBerlin": { + "r": "0x2b095db07b5ea8f065f4f435584402fb7730fe7fca5b789240933e301180b74e", + "s": "0x02db343bc2c8222cfb725ebbd52ba8b1b3803306be88e25c1f6dffa16d80575b", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xc215cbfc101481356dfe98ad23d60186c05a0ed15f3d74f1deedc7f1fe4dfe0a", + "s": "0x5ca25ede5de59283cf790b50316b7a183075832a4ba96446692ba34c2235a32c", + "v": "0x1" + } + }, + { + "name": "random-65", + "transaction": { + "to": "0x68c3a6aDe6160bB4d252B0ea8d223dA0951a2063", + "nonce": 472, + "gasLimit": "0x5def6e", + "gasPrice": "0x74eaf6c0cc", + "maxFeePerGas": "0xfe5088f3cad2", + "maxPriorityFeePerGas": "0xa480", + "data": "0x7fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e8", + "value": "0x1673", + "accessList": [ + { + "address": "0x4D979db5bEE701133889ea708339B375fb56831b", + "storageKeys": [ + "0x182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564" + ] + }, + { + "address": "0x5C9617f35247456fbcAF1aB61B432B5e729010e8", + "storageKeys": [ + "0x182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564" + ] + }, + { + "address": "0x310eb4f10aEfd6269e5385375572494a24ECB360", + "storageKeys": [ + "0x182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564" + ] + }, + { + "address": "0xDeCbfbaA3737177d2a7C7Dc27f14A79491973946", + "storageKeys": [ + "0x182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564" + ] + } + ], + "chainId": "0xa8a896edd1" + }, + "privateKey": "0x0196beebe69b390cc377f38c830788cc31eae008a54fbec9894f004d66fa8717", + "unsignedLegacy": "0xf8a08201d88574eaf6c0cc835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e8", + "unsignedEip155": "0xf8a88201d88574eaf6c0cc835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e885a8a896edd18080", + "unsignedBerlin": "0x01f9018885a8a896edd18201d88574eaf6c0cc835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e8f8e0f7944d979db5bee701133889ea708339b375fb56831be1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f7945c9617f35247456fbcaf1ab61b432b5e729010e8e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794310eb4f10aefd6269e5385375572494a24ecb360e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794decbfbaa3737177d2a7c7dc27f14a79491973946e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564", + "unsignedLondon": "0x02f9018c85a8a896edd18201d882a48086fe5088f3cad2835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e8f8e0f7944d979db5bee701133889ea708339b375fb56831be1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f7945c9617f35247456fbcaf1ab61b432b5e729010e8e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794310eb4f10aefd6269e5385375572494a24ecb360e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794decbfbaa3737177d2a7c7dc27f14a79491973946e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564", + "signedLegacy": "0xf8e38201d88574eaf6c0cc835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e81ba06f5a397896cacc9fdcfc309d6db7804d956af9b3877c809f5844e0770b40a678a052a2a350241383d880c6f22e32c676e89cccb505029b1878a712dda6ecb17bb9", + "signedEip155": "0xf8e98201d88574eaf6c0cc835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e8860151512ddbc5a0dfc9a95aa99b9ab290111a6d5bc1e4ddb57839f32fb8492ee3653b06d769edd0a0233a48bf6e77172ebee9657c77c263c3a0504b704d4d4e415a6baf326fefd9ed", + "signedBerlin": "0x01f901cb85a8a896edd18201d88574eaf6c0cc835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e8f8e0f7944d979db5bee701133889ea708339b375fb56831be1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f7945c9617f35247456fbcaf1ab61b432b5e729010e8e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794310eb4f10aefd6269e5385375572494a24ecb360e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794decbfbaa3737177d2a7c7dc27f14a79491973946e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e56480a042910f829ff90848c079361d939a3c0fb795b76919a54032c2d9f31634b4187fa046c0393cee7f0a10a968b3477af968e251e67e5ad03e2a9e6f741d1ea75277ac", + "signedLondon": "0x02f901cf85a8a896edd18201d882a48086fe5088f3cad2835def6e9468c3a6ade6160bb4d252b0ea8d223da0951a2063821673b8797fd0f819e99e145c44de537c87b550115a1b2868b263b3c1bf95740b190c18c8995e01f9570c542235f8af4ef3da155313886b30008504cfbbbd43a49123434a373fd66bcebc52bf350fa404ac4d1c5c50e2b53afb0a011bd471aea1417da3ca727efce00c4dd0ed4c533e6396c5113ecba0ce46adc69f35e8f8e0f7944d979db5bee701133889ea708339b375fb56831be1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f7945c9617f35247456fbcaf1ab61b432b5e729010e8e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794310eb4f10aefd6269e5385375572494a24ecb360e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e564f794decbfbaa3737177d2a7c7dc27f14a79491973946e1a0182e6573d2e5f00a759cc4140e2d37298eb6dfeb8f41a0ff205c437012c2e56401a08b330b5fb43ebfd218ee8fdb6421da9a929b511cc6e0f4d66268bb5d75da7805a04e3c38fdc5bb0958e25af21aea4fcfe7cbd84b44e243952f0f0143a1a2c1c096", + "signatureLegacy": { + "r": "0x6f5a397896cacc9fdcfc309d6db7804d956af9b3877c809f5844e0770b40a678", + "s": "0x52a2a350241383d880c6f22e32c676e89cccb505029b1878a712dda6ecb17bb9", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xdfc9a95aa99b9ab290111a6d5bc1e4ddb57839f32fb8492ee3653b06d769edd0", + "s": "0x233a48bf6e77172ebee9657c77c263c3a0504b704d4d4e415a6baf326fefd9ed", + "v": "0x151512ddbc5" + }, + "signatureBerlin": { + "r": "0x42910f829ff90848c079361d939a3c0fb795b76919a54032c2d9f31634b4187f", + "s": "0x46c0393cee7f0a10a968b3477af968e251e67e5ad03e2a9e6f741d1ea75277ac", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x8b330b5fb43ebfd218ee8fdb6421da9a929b511cc6e0f4d66268bb5d75da7805", + "s": "0x4e3c38fdc5bb0958e25af21aea4fcfe7cbd84b44e243952f0f0143a1a2c1c096", + "v": "0x1" + } + }, + { + "name": "random-67", + "transaction": { + "to": "0x89A700BB31E28153A4904E7Ae0A99f74dDc126e0", + "nonce": 930, + "gasLimit": "0x429e45d2", + "gasPrice": "0x3237", + "maxFeePerGas": "0xb01f2238", + "maxPriorityFeePerGas": "0x0c58", + "data": "0x044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b4", + "value": "0x94855320", + "accessList": [ + { + "address": "0x79C87d509790ba8A99E257dEe7B1C09a84913a27", + "storageKeys": [ + "0xe738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471f", + "0x5689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573f", + "0x8b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b" + ] + }, + { + "address": "0xa7613fCdD57d826382B56A2d673523b17A9dB066", + "storageKeys": [ + "0xe738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471f", + "0x5689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573f", + "0x8b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b" + ] + }, + { + "address": "0x8869d6A468767d70E03E9C4a02382700D5Cdd48F", + "storageKeys": [ + "0xe738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471f", + "0x5689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573f", + "0x8b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b" + ] + }, + { + "address": "0x6679ED71c578838654D6BEB1569e8116E9Ec15F8", + "storageKeys": [ + "0xe738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471f", + "0x5689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573f", + "0x8b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b" + ] + } + ], + "chainId": "0x576d" + }, + "privateKey": "0xd4a5c39efa31b07c0708005fd7d75ffe47282a9219dbca69a0c393869c199fa1", + "unsignedLegacy": "0xf8908203a282323784429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b4", + "unsignedEip155": "0xf8958203a282323784429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b482576d8080", + "unsignedBerlin": "0x01f9028682576d8203a282323784429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b4f901f0f87a9479c87d509790ba8a99e257dee7b1c09a84913a27f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a94a7613fcdd57d826382b56a2d673523b17a9db066f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a948869d6a468767d70e03e9c4a02382700d5cdd48ff863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a946679ed71c578838654d6beb1569e8116e9ec15f8f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b", + "unsignedLondon": "0x02f9028b82576d8203a2820c5884b01f223884429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b4f901f0f87a9479c87d509790ba8a99e257dee7b1c09a84913a27f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a94a7613fcdd57d826382b56a2d673523b17a9db066f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a948869d6a468767d70e03e9c4a02382700d5cdd48ff863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a946679ed71c578838654d6beb1569e8116e9ec15f8f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b", + "signedLegacy": "0xf8d38203a282323784429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b41ca0987cbad27d43c34ed15dedcc1c1d70497f50bb09c2805afbcd3e1a2413a53846a0229576ba9a603657fedca5696c545cc4b75907d7ccc71efe572fa4b8d367f0cc", + "signedEip155": "0xf8d58203a282323784429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b482aefda0fc1b5b23bb933dc5ae3ef80353742eeb006ec5f311d1fcebff79571a99b1a20aa03f5c984ac4ebf149396187ad5520a3d1f6e1409835dc3270400262deaf451087", + "signedBerlin": "0x01f902c982576d8203a282323784429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b4f901f0f87a9479c87d509790ba8a99e257dee7b1c09a84913a27f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a94a7613fcdd57d826382b56a2d673523b17a9db066f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a948869d6a468767d70e03e9c4a02382700d5cdd48ff863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a946679ed71c578838654d6beb1569e8116e9ec15f8f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b80a0fcd80a65ee3afd07e36b5535e6f849274ac7c51d9fcec73d28d2ae2a6192b3f9a06437810dc8cd94a9d00b4abd1c500a4dfaa01381e2b4c82a9a4ac1eda735cf19", + "signedLondon": "0x02f902ce82576d8203a2820c5884b01f223884429e45d29489a700bb31e28153a4904e7ae0a99f74ddc126e08494855320b869044bb9027fd7df7777bd14b1747cc7d121f48ab7aa6ffde96b131abd03fdf87e49dfcfb1c1106167e237c60ff3c4d7f0b9e0e444cb3144452a48e97c8289d4195a4ae3b6b0e333838cf5a91b0c5783e1e873d8849add7b6ec0973467e062cbd9a71fab62154c2109b4f901f0f87a9479c87d509790ba8a99e257dee7b1c09a84913a27f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a94a7613fcdd57d826382b56a2d673523b17a9db066f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a948869d6a468767d70e03e9c4a02382700d5cdd48ff863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698bf87a946679ed71c578838654d6beb1569e8116e9ec15f8f863a0e738c0dadcf9238c561501f1c7135483bf477f7052c596fac359ffbaae6b471fa05689e65d939dd50612ad80b0229a9698f7a067613292c883720b994cb924573fa08b7af9eab406250e2fc6f17d7039ba448f2a6a0846d69c042afcb9f6f6d1698b01a056ec9993dcd6ac4550cc0ccf4ab7b8a87fe24c722fa3da5dd5089e7b344d7dc1a04013bd0965c9692ed6e6bcad454530c96db49f95450d4c3a1c4d20739c498ca5", + "signatureLegacy": { + "r": "0x987cbad27d43c34ed15dedcc1c1d70497f50bb09c2805afbcd3e1a2413a53846", + "s": "0x229576ba9a603657fedca5696c545cc4b75907d7ccc71efe572fa4b8d367f0cc", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xfc1b5b23bb933dc5ae3ef80353742eeb006ec5f311d1fcebff79571a99b1a20a", + "s": "0x3f5c984ac4ebf149396187ad5520a3d1f6e1409835dc3270400262deaf451087", + "v": "0xaefd" + }, + "signatureBerlin": { + "r": "0xfcd80a65ee3afd07e36b5535e6f849274ac7c51d9fcec73d28d2ae2a6192b3f9", + "s": "0x6437810dc8cd94a9d00b4abd1c500a4dfaa01381e2b4c82a9a4ac1eda735cf19", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x56ec9993dcd6ac4550cc0ccf4ab7b8a87fe24c722fa3da5dd5089e7b344d7dc1", + "s": "0x4013bd0965c9692ed6e6bcad454530c96db49f95450d4c3a1c4d20739c498ca5", + "v": "0x1" + } + }, + { + "name": "random-68", + "transaction": { + "to": "0x9524ce938E047293438C52e03b324352D34593C0", + "nonce": 280, + "gasLimit": "0xb4939d7e", + "gasPrice": "0x0d", + "maxFeePerGas": "0x824e95a56e47", + "maxPriorityFeePerGas": "0x8ae4", + "data": "0x9440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a3", + "value": "0x99988435", + "accessList": [], + "chainId": "0x9aa6034b" + }, + "privateKey": "0xf9d4cd92848833fbcb50303589ea325e170fd069b2bd70372ec91ea345352484", + "unsignedLegacy": "0xf86a8201180d84b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a3", + "unsignedEip155": "0xf8718201180d84b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a3849aa6034b8080", + "unsignedBerlin": "0x01f870849aa6034b8201180d84b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a3c0", + "unsignedLondon": "0x02f879849aa6034b820118828ae486824e95a56e4784b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a3c0", + "signedLegacy": "0xf8ad8201180d84b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a31ba03d738eb1eaab36c57136eff96da0a2aa545b547b73cd212e6b9e148568496736a071fe1214a6803882b844a36bb36b165babc3284dbb005f7bb6d5f637f5aef6c6", + "signedEip155": "0xf8b28201180d84b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a38501354c06baa0e615d28dabd7b6ffa7af6de91173e81dfbcaf3991fa5bb71161de35b372ea538a07c3d89c52e7c104fd1e0fab20c87356c1edb6907694c0f6dd078a0ea79c06302", + "signedBerlin": "0x01f8b3849aa6034b8201180d84b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a3c080a046ab3b0f895704ccae052f6ff4cc972e4ce081e27cb9acd8e77d259abc79da72a0270996e0ac119aac883a2e7ba7a6f5f4ecc0d1ddae17d07d81cc04e5dfaacb8e", + "signedLondon": "0x02f8bc849aa6034b820118828ae486824e95a56e4784b4939d7e949524ce938e047293438c52e03b324352d34593c08499988435b8459440450061562557959483782307e321335e3aea1faee312302a887999b819faec194991d2457160559cf9c9713d3ddbcf853cb95641746ae12c408c77ef070063842b84a3c001a008e6395d2abf034bccc98cc9ac235bf4cd5cf17e45f8baee6174ed337c94c0a0a049ab1b9429e79832042302ca14c1cd6e431d8f390ed670ec096e53652d4bd192", + "signatureLegacy": { + "r": "0x3d738eb1eaab36c57136eff96da0a2aa545b547b73cd212e6b9e148568496736", + "s": "0x71fe1214a6803882b844a36bb36b165babc3284dbb005f7bb6d5f637f5aef6c6", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xe615d28dabd7b6ffa7af6de91173e81dfbcaf3991fa5bb71161de35b372ea538", + "s": "0x7c3d89c52e7c104fd1e0fab20c87356c1edb6907694c0f6dd078a0ea79c06302", + "v": "0x1354c06ba" + }, + "signatureBerlin": { + "r": "0x46ab3b0f895704ccae052f6ff4cc972e4ce081e27cb9acd8e77d259abc79da72", + "s": "0x270996e0ac119aac883a2e7ba7a6f5f4ecc0d1ddae17d07d81cc04e5dfaacb8e", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x08e6395d2abf034bccc98cc9ac235bf4cd5cf17e45f8baee6174ed337c94c0a0", + "s": "0x49ab1b9429e79832042302ca14c1cd6e431d8f390ed670ec096e53652d4bd192", + "v": "0x1" + } + }, + { + "name": "random-69", + "transaction": { + "to": "0xDB6B9cee3B75D2f57Ab542C5C2b54A1f138F622A", + "nonce": 157, + "gasLimit": "0xca819420", + "gasPrice": "0xa401f8", + "maxFeePerGas": "0x32247e55", + "maxPriorityFeePerGas": "0x92", + "data": "0x039a55ffd8579f0a7f93", + "value": "0xde5f1bf5", + "accessList": [ + { + "address": "0x42d315226060386Ed14fB1a1E31022eB9c7c8291", + "storageKeys": [ + "0x2c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3", + "0xeb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54", + "0xce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8" + ] + }, + { + "address": "0xEdEb4505Fd64BC9d450F802127d74cc9a6823d57", + "storageKeys": [ + "0x2c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3", + "0xeb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54", + "0xce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8" + ] + }, + { + "address": "0xB3D4489b9Ab879e8Ec8AcCC76fA5434399Dca4Cc", + "storageKeys": [ + "0x2c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3", + "0xeb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54", + "0xce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8" + ] + } + ], + "chainId": "0x0b337151fa" + }, + "privateKey": "0x10ada5023bdd824518b68d26baa46978e389d86ffce76fc865b6c0beab0c26b7", + "unsignedLegacy": "0xf0819d83a401f884ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f93", + "unsignedEip155": "0xf838819d83a401f884ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f93850b337151fa8080", + "unsignedBerlin": "0x01f901ad850b337151fa819d83a401f884ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f93f90174f87a9442d315226060386ed14fb1a1e31022eb9c7c8291f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94edeb4505fd64bc9d450f802127d74cc9a6823d57f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94b3d4489b9ab879e8ec8accc76fa5434399dca4ccf863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8", + "unsignedLondon": "0x02f901b0850b337151fa819d81928432247e5584ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f93f90174f87a9442d315226060386ed14fb1a1e31022eb9c7c8291f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94edeb4505fd64bc9d450f802127d74cc9a6823d57f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94b3d4489b9ab879e8ec8accc76fa5434399dca4ccf863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8", + "signedLegacy": "0xf873819d83a401f884ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f931ca0f32073c2a636a8493cd172998730e6c50cfc6f5af645053d4a543c5b0d25ed93a0186200c2a4cf61d242554e15a37f296ba802ba416433ce2d241a82a796e12ef5", + "signedEip155": "0xf878819d83a401f884ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f93851666e2a417a0980818e9f5f613d3dc19c737b45e4d583aa2e7dc39117e73d25f4973e8b5affba02ce6816ae4b00206466e5cf39e809d11c0b978d0a6c49137753c89ea235e6c24", + "signedBerlin": "0x01f901f0850b337151fa819d83a401f884ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f93f90174f87a9442d315226060386ed14fb1a1e31022eb9c7c8291f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94edeb4505fd64bc9d450f802127d74cc9a6823d57f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94b3d4489b9ab879e8ec8accc76fa5434399dca4ccf863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f801a019c981e8b208dac380aa95263527bb24bef0d5a46c6ff446b3fb92b97bd9e232a07128ea728ace5cc7f99875efd1b1ece58d83f5b77f29a7580aefdfa2086c939a", + "signedLondon": "0x02f901f3850b337151fa819d81928432247e5584ca81942094db6b9cee3b75d2f57ab542c5c2b54a1f138f622a84de5f1bf58a039a55ffd8579f0a7f93f90174f87a9442d315226060386ed14fb1a1e31022eb9c7c8291f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94edeb4505fd64bc9d450f802127d74cc9a6823d57f863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f8f87a94b3d4489b9ab879e8ec8accc76fa5434399dca4ccf863a02c57a1f776da58e57e209e7bb6f234813ed04147c8e1ba4dc24e1fbd1f405fe3a0eb3a68ea63c796c5afca5b52e14d41456ce1c41c3d581d10c26cb759d4a47f54a0ce1a9368f438e2a81977f51d936b6bd6324d537b3702dced5b9d44b7274379f801a0bd7a271f24c49c5f7648cb93e73f20be83451c14509e424dcf6edebc21388398a03a43018abf91791894d1b0422ddaab2d2316433f87a2e7ea8233b5dfa678cc0d", + "signatureLegacy": { + "r": "0xf32073c2a636a8493cd172998730e6c50cfc6f5af645053d4a543c5b0d25ed93", + "s": "0x186200c2a4cf61d242554e15a37f296ba802ba416433ce2d241a82a796e12ef5", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x980818e9f5f613d3dc19c737b45e4d583aa2e7dc39117e73d25f4973e8b5affb", + "s": "0x2ce6816ae4b00206466e5cf39e809d11c0b978d0a6c49137753c89ea235e6c24", + "v": "0x1666e2a417" + }, + "signatureBerlin": { + "r": "0x19c981e8b208dac380aa95263527bb24bef0d5a46c6ff446b3fb92b97bd9e232", + "s": "0x7128ea728ace5cc7f99875efd1b1ece58d83f5b77f29a7580aefdfa2086c939a", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xbd7a271f24c49c5f7648cb93e73f20be83451c14509e424dcf6edebc21388398", + "s": "0x3a43018abf91791894d1b0422ddaab2d2316433f87a2e7ea8233b5dfa678cc0d", + "v": "0x1" + } + }, + { + "name": "random-74", + "transaction": { + "to": "0xcEB734369e4A893a10E1dB8aF36Ac91487260de2", + "nonce": 223, + "gasLimit": "0x2c88b8c9c2", + "gasPrice": "0x587bb8", + "maxFeePerGas": "0xa8b0d55066a5a1", + "maxPriorityFeePerGas": "0x9a", + "data": "0x536577acdb20eb21adec1c95d34a56660027a358784598f47b", + "value": "0x6cf16f303b", + "accessList": [ + { + "address": "0xe43aEc2BB451dc4C289eb890dd242d5Bc5f6d0cC", + "storageKeys": [ + "0xe6597d2ea26a458922c08275eb23909ccfca4daf11662e5dd0b8ba95f1c666da", + "0x449afb4fa7c7a806ebced6ce2968e6e635e80a318e4a1371e8938a417feb93b2", + "0x6381c81f0d15db370860feeba70f3953279dba52f02a3a04612484aefa84f316", + "0x63d9e5227e1d6c937b4b44d64d9e02720e67ef020ebab90f8df39c3b8e47b04e" + ] + } + ], + "chainId": "0xd5cb" + }, + "privateKey": "0xe252164de96a27f2c060b4d4a59107f2806640ef8eb40ace87b08ffe0e7aefbe", + "unsignedLegacy": "0xf84181df83587bb8852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47b", + "unsignedEip155": "0xf84681df83587bb8852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47b82d5cb8080", + "unsignedBerlin": "0x01f8e382d5cb81df83587bb8852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47bf89df89b94e43aec2bb451dc4c289eb890dd242d5bc5f6d0ccf884a0e6597d2ea26a458922c08275eb23909ccfca4daf11662e5dd0b8ba95f1c666daa0449afb4fa7c7a806ebced6ce2968e6e635e80a318e4a1371e8938a417feb93b2a06381c81f0d15db370860feeba70f3953279dba52f02a3a04612484aefa84f316a063d9e5227e1d6c937b4b44d64d9e02720e67ef020ebab90f8df39c3b8e47b04e", + "unsignedLondon": "0x02f8e982d5cb81df819a87a8b0d55066a5a1852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47bf89df89b94e43aec2bb451dc4c289eb890dd242d5bc5f6d0ccf884a0e6597d2ea26a458922c08275eb23909ccfca4daf11662e5dd0b8ba95f1c666daa0449afb4fa7c7a806ebced6ce2968e6e635e80a318e4a1371e8938a417feb93b2a06381c81f0d15db370860feeba70f3953279dba52f02a3a04612484aefa84f316a063d9e5227e1d6c937b4b44d64d9e02720e67ef020ebab90f8df39c3b8e47b04e", + "signedLegacy": "0xf88481df83587bb8852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47b1ca0713955d8f00f1a05bd6608139661b71c376a9e16660d4edd617699669a679831a03b8e5544dadad730744896cf9d2eb0a2416c3d97b63a41ffa58601a280a154e1", + "signedEip155": "0xf88781df83587bb8852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47b8301abbaa01487e3f1fb264e38a70baf273a4583016c7ec1ff9ca632e8d710ce6ae78126ada04443666de576afbecc34b6639466f79e52737a6f77418071f1be8f73ed32bf00", + "signedBerlin": "0x01f9012682d5cb81df83587bb8852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47bf89df89b94e43aec2bb451dc4c289eb890dd242d5bc5f6d0ccf884a0e6597d2ea26a458922c08275eb23909ccfca4daf11662e5dd0b8ba95f1c666daa0449afb4fa7c7a806ebced6ce2968e6e635e80a318e4a1371e8938a417feb93b2a06381c81f0d15db370860feeba70f3953279dba52f02a3a04612484aefa84f316a063d9e5227e1d6c937b4b44d64d9e02720e67ef020ebab90f8df39c3b8e47b04e01a0e19d2cf6337957c432be2cf48c9bbf30655a8016656ea82dc8e4fa417ed3b236a05d6658a432cd827b560efc40c0802c5bcfc8bbb79ed3f765b13bdd14034d5912", + "signedLondon": "0x02f9012c82d5cb81df819a87a8b0d55066a5a1852c88b8c9c294ceb734369e4a893a10e1db8af36ac91487260de2856cf16f303b99536577acdb20eb21adec1c95d34a56660027a358784598f47bf89df89b94e43aec2bb451dc4c289eb890dd242d5bc5f6d0ccf884a0e6597d2ea26a458922c08275eb23909ccfca4daf11662e5dd0b8ba95f1c666daa0449afb4fa7c7a806ebced6ce2968e6e635e80a318e4a1371e8938a417feb93b2a06381c81f0d15db370860feeba70f3953279dba52f02a3a04612484aefa84f316a063d9e5227e1d6c937b4b44d64d9e02720e67ef020ebab90f8df39c3b8e47b04e80a027ec2fc739cc17acace3f76f28fc35b73c5146974cfb6f2ef8bc872de093b9e5a017258a2b01e7a7429c2cf2c9d1b224b268f5c61069296d4f1abfe9cc7a4c2814", + "signatureLegacy": { + "r": "0x713955d8f00f1a05bd6608139661b71c376a9e16660d4edd617699669a679831", + "s": "0x3b8e5544dadad730744896cf9d2eb0a2416c3d97b63a41ffa58601a280a154e1", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x1487e3f1fb264e38a70baf273a4583016c7ec1ff9ca632e8d710ce6ae78126ad", + "s": "0x4443666de576afbecc34b6639466f79e52737a6f77418071f1be8f73ed32bf00", + "v": "0x1abba" + }, + "signatureBerlin": { + "r": "0xe19d2cf6337957c432be2cf48c9bbf30655a8016656ea82dc8e4fa417ed3b236", + "s": "0x5d6658a432cd827b560efc40c0802c5bcfc8bbb79ed3f765b13bdd14034d5912", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x27ec2fc739cc17acace3f76f28fc35b73c5146974cfb6f2ef8bc872de093b9e5", + "s": "0x17258a2b01e7a7429c2cf2c9d1b224b268f5c61069296d4f1abfe9cc7a4c2814", + "v": "0x0" + } + }, + { + "name": "random-76", + "transaction": { + "to": "0xa2F1A45d981cD8Cd8D71f6200BdeA3FaC6d9eee5", + "nonce": 213, + "gasLimit": "0x982ed799a4", + "gasPrice": "0xef8b61", + "maxFeePerGas": "0x80db6bcb", + "maxPriorityFeePerGas": "0x52", + "data": "0xd08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e730568208", + "value": "0xd557be586d", + "accessList": [ + { + "address": "0x3F28a17091824b3c3DAb8e15ec297dAf2313C675", + "storageKeys": [] + }, + { + "address": "0x5B3E40E58F96C9B1797888866a0D9Fd11E4155f8", + "storageKeys": [] + }, + { + "address": "0x6A404ABD58f6653062AEE230181c369Ccc30145C", + "storageKeys": [] + }, + { + "address": "0xe00b333798298F4ec75a934ca1F97129F72E15e0", + "storageKeys": [] + } + ], + "chainId": "0xb126" + }, + "privateKey": "0x2a1c3a0cba0c53b27c471b7897a7d6b055079c47d51817fdb9ff77e4905ef543", + "unsignedLegacy": "0xf85181d583ef8b6185982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e730568208", + "unsignedEip155": "0xf85681d583ef8b6185982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e73056820882b1268080", + "unsignedBerlin": "0x01f8b282b12681d583ef8b6185982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e730568208f85cd6943f28a17091824b3c3dab8e15ec297daf2313c675c0d6945b3e40e58f96c9b1797888866a0d9fd11e4155f8c0d6946a404abd58f6653062aee230181c369ccc30145cc0d694e00b333798298f4ec75a934ca1f97129f72e15e0c0", + "unsignedLondon": "0x02f8b482b12681d5528480db6bcb85982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e730568208f85cd6943f28a17091824b3c3dab8e15ec297daf2313c675c0d6945b3e40e58f96c9b1797888866a0d9fd11e4155f8c0d6946a404abd58f6653062aee230181c369ccc30145cc0d694e00b333798298f4ec75a934ca1f97129f72e15e0c0", + "signedLegacy": "0xf89481d583ef8b6185982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e7305682081ca02d1c16c852de9ea5aa6245489a3c6a694d5ccfcd11dd90dfa8da9a1c6e4b3c2aa046ba1c17023144187272aed0290bb6ac3d7c44cf3793faf4c137e60ae839d644", + "signedEip155": "0xf89781d583ef8b6185982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e73056820883016270a047950367bbd41c480e891b0e3f8d9bb2b9450bb3a88bd754470267d5c77e78d8a0626745c6a7c8117c37d454e0153844cebc4f0711b45a2ee2c74aabd1e0596705", + "signedBerlin": "0x01f8f582b12681d583ef8b6185982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e730568208f85cd6943f28a17091824b3c3dab8e15ec297daf2313c675c0d6945b3e40e58f96c9b1797888866a0d9fd11e4155f8c0d6946a404abd58f6653062aee230181c369ccc30145cc0d694e00b333798298f4ec75a934ca1f97129f72e15e0c080a0c8b9fd6c964963658de382980e7a8a34264fc15d28443b989f79ceed3f246c33a01fe42921ee1b5d03c60aec6da27e1c350efa1363d7ed66931e627b73937707a6", + "signedLondon": "0x02f8f782b12681d5528480db6bcb85982ed799a494a2f1a45d981cd8cd8d71f6200bdea3fac6d9eee585d557be586da9d08b7231cb458842dde5e57d222b6e7b54c77d0d6bfdfccd4a93d9c0d5a94578c1bc7391e730568208f85cd6943f28a17091824b3c3dab8e15ec297daf2313c675c0d6945b3e40e58f96c9b1797888866a0d9fd11e4155f8c0d6946a404abd58f6653062aee230181c369ccc30145cc0d694e00b333798298f4ec75a934ca1f97129f72e15e0c080a0fb59b0eaee411300397ebaa46acd8ae1e7dc3adc011b69f640755b9dd763e28da045a31466ddca739ee964bbdc59147531d332eca56c3c7f9fbb38c15dc24b7a6c", + "signatureLegacy": { + "r": "0x2d1c16c852de9ea5aa6245489a3c6a694d5ccfcd11dd90dfa8da9a1c6e4b3c2a", + "s": "0x46ba1c17023144187272aed0290bb6ac3d7c44cf3793faf4c137e60ae839d644", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x47950367bbd41c480e891b0e3f8d9bb2b9450bb3a88bd754470267d5c77e78d8", + "s": "0x626745c6a7c8117c37d454e0153844cebc4f0711b45a2ee2c74aabd1e0596705", + "v": "0x16270" + }, + "signatureBerlin": { + "r": "0xc8b9fd6c964963658de382980e7a8a34264fc15d28443b989f79ceed3f246c33", + "s": "0x1fe42921ee1b5d03c60aec6da27e1c350efa1363d7ed66931e627b73937707a6", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xfb59b0eaee411300397ebaa46acd8ae1e7dc3adc011b69f640755b9dd763e28d", + "s": "0x45a31466ddca739ee964bbdc59147531d332eca56c3c7f9fbb38c15dc24b7a6c", + "v": "0x0" + } + }, + { + "name": "random-77", + "transaction": { + "to": "0x9Ef34f85EFC31a77A1C73F86AE9bc4D4B98900E0", + "nonce": 68, + "gasLimit": "0x161d3f33", + "gasPrice": "0xb182e488", + "maxFeePerGas": "0x4fc300c826", + "maxPriorityFeePerGas": "0xd982", + "data": "0x3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21f", + "value": "0xd34e0b79", + "accessList": [ + { + "address": "0x22A46e974d6A904697713925B1A6d2F7F9eC9057", + "storageKeys": [ + "0x7f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abe", + "0xcfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82", + "0xf56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7c", + "0xaf2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99" + ] + }, + { + "address": "0x949F0877867dbdaC6C520C7ce67a0366BB17DB72", + "storageKeys": [ + "0x7f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abe", + "0xcfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82", + "0xf56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7c", + "0xaf2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99" + ] + }, + { + "address": "0x05f68290940DA75DaF7052d1F95Af0423e9D034A", + "storageKeys": [ + "0x7f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abe", + "0xcfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82", + "0xf56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7c", + "0xaf2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99" + ] + }, + { + "address": "0xc344b1f4960786E2dDf5aDd3c6cc9bb7A6c621D7", + "storageKeys": [ + "0x7f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abe", + "0xcfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82", + "0xf56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7c", + "0xaf2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99" + ] + } + ], + "chainId": "0xba9f0619" + }, + "privateKey": "0xc2ec5321390d242a247fb10bcefc759af65e3c57c8d8673355b650ee38c9e6fd", + "unsignedLegacy": "0xf8a54484b182e48884161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21f", + "unsignedEip155": "0xf8ac4484b182e48884161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21f84ba9f06198080", + "unsignedBerlin": "0x01f9032184ba9f06194484b182e48884161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21ff90274f89b9422a46e974d6a904697713925b1a6d2f7f9ec9057f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94949f0877867dbdac6c520c7ce67a0366bb17db72f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b9405f68290940da75daf7052d1f95af0423e9d034af884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94c344b1f4960786e2ddf5add3c6cc9bb7a6c621d7f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99", + "unsignedLondon": "0x02f9032584ba9f06194482d982854fc300c82684161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21ff90274f89b9422a46e974d6a904697713925b1a6d2f7f9ec9057f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94949f0877867dbdac6c520c7ce67a0366bb17db72f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b9405f68290940da75daf7052d1f95af0423e9d034af884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94c344b1f4960786e2ddf5add3c6cc9bb7a6c621d7f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99", + "signedLegacy": "0xf8e84484b182e48884161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21f1ba01080bb8b4be23b2b044bb4759e7d66001709a254231589698140633ecb31c457a073c3425b6d217bbd89dab94e084d4c8f05f10831fa11492a4cbaf20e4221c792", + "signedEip155": "0xf8ed4484b182e48884161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21f8501753e0c55a0f689c81c8f7747e7e8b9b6552e7436645af67ac7f44d0c83213a4debd4ad510ea00784d985af8efbd7932530c1ebe8e537b6b62e74675d3f63ec4068aba763bee0", + "signedBerlin": "0x01f9036484ba9f06194484b182e48884161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21ff90274f89b9422a46e974d6a904697713925b1a6d2f7f9ec9057f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94949f0877867dbdac6c520c7ce67a0366bb17db72f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b9405f68290940da75daf7052d1f95af0423e9d034af884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94c344b1f4960786e2ddf5add3c6cc9bb7a6c621d7f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc9901a02136f932ef60aed49ecb9277ac4b2c4533286e33dd72112444e8584f8ed064e9a012894b7246a7d5d6582462e6f11089b64165c77867b7038b5c70fbaf2fd1248d", + "signedLondon": "0x02f9036884ba9f06194482d982854fc300c82684161d3f33949ef34f85efc31a77a1c73f86ae9bc4d4b98900e084d34e0b79b87e3e0915e3c0499f4ccf8448b35e51217978f73639c3aa70b947140c751f9abade7f7e308c073e87e2760e8bef521c14efffba23b6a686775f66cd21607fdb3a9ae7d9a06d1562cfd9a8b1a62075889e53fafcc15c75bdb3fafbec1367a3b05c220cd5e02d4819526050d50a74df96ec803132d408562542c3ce9ccc30d21ff90274f89b9422a46e974d6a904697713925b1a6d2f7f9ec9057f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94949f0877867dbdac6c520c7ce67a0366bb17db72f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b9405f68290940da75daf7052d1f95af0423e9d034af884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc99f89b94c344b1f4960786e2ddf5add3c6cc9bb7a6c621d7f884a07f5a61220a34e055900fcc6bea011d74662a83b0e7c59c739e273e0543352abea0cfac541c820be3ae3096e8fbb6fd65d5bfd12d5e6056e043711e7c767afbaf82a0f56421c6b4b3311aa2393001e116d976d5781661c2acf2245bfa0cdc7a264c7ca0af2bc45fca0e45e7b67133967a7c33896ef6609531d1258d4f8615af82b5cc9980a0c62ac7edae5e85fa17b57f4c6d3d7ca44141761c673d71fdb99c86c03e3b6b58a01737a611778aeca2ffb51967c3557db8b539eb2bb6e00c262245dfd3122fbd36", + "signatureLegacy": { + "r": "0x1080bb8b4be23b2b044bb4759e7d66001709a254231589698140633ecb31c457", + "s": "0x73c3425b6d217bbd89dab94e084d4c8f05f10831fa11492a4cbaf20e4221c792", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xf689c81c8f7747e7e8b9b6552e7436645af67ac7f44d0c83213a4debd4ad510e", + "s": "0x0784d985af8efbd7932530c1ebe8e537b6b62e74675d3f63ec4068aba763bee0", + "v": "0x1753e0c55" + }, + "signatureBerlin": { + "r": "0x2136f932ef60aed49ecb9277ac4b2c4533286e33dd72112444e8584f8ed064e9", + "s": "0x12894b7246a7d5d6582462e6f11089b64165c77867b7038b5c70fbaf2fd1248d", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xc62ac7edae5e85fa17b57f4c6d3d7ca44141761c673d71fdb99c86c03e3b6b58", + "s": "0x1737a611778aeca2ffb51967c3557db8b539eb2bb6e00c262245dfd3122fbd36", + "v": "0x0" + } + }, + { + "name": "random-78", + "transaction": { + "to": "0x935889a09Ce334DeB51E7Ff46C648259d6eEF9Dd", + "nonce": 41, + "gasLimit": "0x9ee497b3", + "gasPrice": "0xb938", + "maxFeePerGas": "0x8868c7a10ab2", + "maxPriorityFeePerGas": "0xe5", + "data": "0xf6a9562b", + "value": "0x2189", + "accessList": [ + { + "address": "0xAd986854513eEb4817BBfA4d13C6b9022F1EE4d3", + "storageKeys": [ + "0x1e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72", + "0x2e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03", + "0x45e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbf" + ] + }, + { + "address": "0x553bD39AE42E47C31344B918eCA2f6165d8C3c76", + "storageKeys": [ + "0x1e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72", + "0x2e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03", + "0x45e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbf" + ] + } + ], + "chainId": "0x7eea39" + }, + "privateKey": "0xa93a3174751b7260217b1a8953bfec781042b8770a7595189f2faee657bb9af8", + "unsignedLegacy": "0xe62982b938849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562b", + "unsignedEip155": "0xec2982b938849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562b837eea398080", + "unsignedBerlin": "0x01f90124837eea392982b938849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562bf8f8f87a94ad986854513eeb4817bbfa4d13c6b9022f1ee4d3f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbff87a94553bd39ae42e47c31344b918eca2f6165d8c3c76f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbf", + "unsignedLondon": "0x02f9012a837eea392981e5868868c7a10ab2849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562bf8f8f87a94ad986854513eeb4817bbfa4d13c6b9022f1ee4d3f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbff87a94553bd39ae42e47c31344b918eca2f6165d8c3c76f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbf", + "signedLegacy": "0xf8692982b938849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562b1ba0f3e713b56dd4e1b7172c86d17d4c35fca75258efd4d5435ccf56bb74670824eda06cfcd15194c4ecf33319a45874c6bf76c70baa83acd1038956a160600002d293", + "signedEip155": "0xf86c2982b938849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562b83fdd496a06ff9b3709e59616fd476f547be2d5b7d776725db0ef7f4504ed2973dfb3a1398a0730ee27fcea344e7a3c157918361fa14146d7c7413db60459bdbb8c9f2c4bef0", + "signedBerlin": "0x01f90167837eea392982b938849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562bf8f8f87a94ad986854513eeb4817bbfa4d13c6b9022f1ee4d3f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbff87a94553bd39ae42e47c31344b918eca2f6165d8c3c76f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbf80a01b5a5629526ac903cbed23916064dda6f3936fd7702209f82d4b506514babfa1a0055cf0302e536eeee94f32a3bcdbcddadf0962edc29a60e0280174c870ddbfc4", + "signedLondon": "0x02f9016d837eea392981e5868868c7a10ab2849ee497b394935889a09ce334deb51e7ff46c648259d6eef9dd82218984f6a9562bf8f8f87a94ad986854513eeb4817bbfa4d13c6b9022f1ee4d3f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbff87a94553bd39ae42e47c31344b918eca2f6165d8c3c76f863a01e603e4c79a4f3ec3f3117dc294b46a36297214095a50f193489bb428ebf6b72a02e40b5c1958f337422e80e7b684ee29234c863f46f358f4f00886ad29d965e03a045e712d751f525eb227aa7db80dd8731190b785eb9277dc56e2538ebb2008bbf01a09bf23be2d7c292b55e8dc4a8be64a5e2bf11dea1df9fbaa01d1830e46240ec23a0126cee7a17b6615c7fce7cac63f05c519f103167109fafbdef6039dcee3f8698", + "signatureLegacy": { + "r": "0xf3e713b56dd4e1b7172c86d17d4c35fca75258efd4d5435ccf56bb74670824ed", + "s": "0x6cfcd15194c4ecf33319a45874c6bf76c70baa83acd1038956a160600002d293", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x6ff9b3709e59616fd476f547be2d5b7d776725db0ef7f4504ed2973dfb3a1398", + "s": "0x730ee27fcea344e7a3c157918361fa14146d7c7413db60459bdbb8c9f2c4bef0", + "v": "0xfdd496" + }, + "signatureBerlin": { + "r": "0x1b5a5629526ac903cbed23916064dda6f3936fd7702209f82d4b506514babfa1", + "s": "0x055cf0302e536eeee94f32a3bcdbcddadf0962edc29a60e0280174c870ddbfc4", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x9bf23be2d7c292b55e8dc4a8be64a5e2bf11dea1df9fbaa01d1830e46240ec23", + "s": "0x126cee7a17b6615c7fce7cac63f05c519f103167109fafbdef6039dcee3f8698", + "v": "0x1" + } + }, + { + "name": "random-79", + "transaction": { + "to": "0xa157CcBcf04529C709c339ec45949C50bfc820a2", + "nonce": 89, + "gasLimit": "0x7f95cf4d", + "gasPrice": "0xc670af", + "maxFeePerGas": "0x6f52dfd7", + "maxPriorityFeePerGas": "0x1c", + "data": "0x0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81a", + "value": "0x4f", + "accessList": [ + { + "address": "0x94f6079d381EAe96318Cbf4651aFb2092299eC7C", + "storageKeys": [ + "0x81452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328", + "0x71e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18f", + "0x0f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1" + ] + }, + { + "address": "0x7d6dAfbCC17E0c840F3a2949a6f1d224d4643603", + "storageKeys": [ + "0x81452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328", + "0x71e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18f", + "0x0f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1" + ] + }, + { + "address": "0xdA6C839aD214B9d42C4eC4BD9be37123d71a3C27", + "storageKeys": [ + "0x81452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328", + "0x71e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18f", + "0x0f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1" + ] + }, + { + "address": "0x8ecE6d0241992F7a6DCdD60d67A5733d0D3910C8", + "storageKeys": [ + "0x81452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328", + "0x71e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18f", + "0x0f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1" + ] + } + ], + "chainId": "0x9b4ebc" + }, + "privateKey": "0xbb6139cdb75a526d4b768c8b52a6ddb851805f50e5ee67443ff0216414a468f6", + "unsignedLegacy": "0xf84d5983c670af847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81a", + "unsignedEip155": "0xf8535983c670af847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81a839b4ebc8080", + "unsignedBerlin": "0x01f90244839b4ebc5983c670af847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81af901f0f87a9494f6079d381eae96318cbf4651afb2092299ec7cf863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a947d6dafbcc17e0c840f3a2949a6f1d224d4643603f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a94da6c839ad214b9d42c4ec4bd9be37123d71a3c27f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a948ece6d0241992f7a6dcdd60d67a5733d0d3910c8f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1", + "unsignedLondon": "0x02f90246839b4ebc591c846f52dfd7847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81af901f0f87a9494f6079d381eae96318cbf4651afb2092299ec7cf863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a947d6dafbcc17e0c840f3a2949a6f1d224d4643603f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a94da6c839ad214b9d42c4ec4bd9be37123d71a3c27f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a948ece6d0241992f7a6dcdd60d67a5733d0d3910c8f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1", + "signedLegacy": "0xf8905983c670af847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81a1ba0ebda722ef1a871d15876683b8e563d53f21f5fd66c6304c871dfbe4ff686a1fca072a57daa388220f223fd569baab64649622073c3d1d512344130fc44eaae0736", + "signedEip155": "0xf8945983c670af847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81a8401369d9ca0a4a14f9a4823c2c8489a03107979570539640f13e86afa985a02b23fe70e9094a04dc1739ae2e2706db183fc3bbb8e315b2a1d7e2c1c1e1aa43b0593f8534c1efd", + "signedBerlin": "0x01f90287839b4ebc5983c670af847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81af901f0f87a9494f6079d381eae96318cbf4651afb2092299ec7cf863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a947d6dafbcc17e0c840f3a2949a6f1d224d4643603f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a94da6c839ad214b9d42c4ec4bd9be37123d71a3c27f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a948ece6d0241992f7a6dcdd60d67a5733d0d3910c8f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f180a056000bbb319873079c205e22f4f963a7d983437dc3f53ca3613d0f921b93a685a05efa1e32616bbcae8c7ded42d4fd7e4f2de19c410e47964c701443fcfc2ad321", + "signedLondon": "0x02f90289839b4ebc591c846f52dfd7847f95cf4d94a157ccbcf04529c709c339ec45949c50bfc820a24fac0f7cf0380cb848853cc19aabdabdd15cbb8dbe760f13c49fec520e195d0779fe179da9e98820100421b0b81af901f0f87a9494f6079d381eae96318cbf4651afb2092299ec7cf863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a947d6dafbcc17e0c840f3a2949a6f1d224d4643603f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a94da6c839ad214b9d42c4ec4bd9be37123d71a3c27f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f1f87a948ece6d0241992f7a6dcdd60d67a5733d0d3910c8f863a081452d24074125978a7c7161dd90da510a700714562a8e29d7bf559f25962328a071e65c9a55f4aa781b99afe9ce65b85e20b467cbdec997e623d75addf63aa18fa00f29299d3d0fdcf8d30fbd2e57f3b71b003620554e9649c893255c8ae8f581f101a04c6297e64e5dcdff6cb93e12460b86a3aedb4d491fc8ed406ad7da9abba82048a021f10deaadaf6f9c86db3aa9966cc043dea040e8b01e69f0422771e982237899", + "signatureLegacy": { + "r": "0xebda722ef1a871d15876683b8e563d53f21f5fd66c6304c871dfbe4ff686a1fc", + "s": "0x72a57daa388220f223fd569baab64649622073c3d1d512344130fc44eaae0736", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xa4a14f9a4823c2c8489a03107979570539640f13e86afa985a02b23fe70e9094", + "s": "0x4dc1739ae2e2706db183fc3bbb8e315b2a1d7e2c1c1e1aa43b0593f8534c1efd", + "v": "0x1369d9c" + }, + "signatureBerlin": { + "r": "0x56000bbb319873079c205e22f4f963a7d983437dc3f53ca3613d0f921b93a685", + "s": "0x5efa1e32616bbcae8c7ded42d4fd7e4f2de19c410e47964c701443fcfc2ad321", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x4c6297e64e5dcdff6cb93e12460b86a3aedb4d491fc8ed406ad7da9abba82048", + "s": "0x21f10deaadaf6f9c86db3aa9966cc043dea040e8b01e69f0422771e982237899", + "v": "0x1" + } + }, + { + "name": "random-80", + "transaction": { + "to": "0xccD6EC986CB3c323dd9767dE263F40532360916e", + "nonce": 310, + "gasLimit": "0xbdc97afa88", + "gasPrice": "0xd1cf", + "maxFeePerGas": "0x72d1185cc524", + "maxPriorityFeePerGas": "0x5f60", + "data": "0x21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e1", + "value": "0x5ebd", + "accessList": [ + { + "address": "0x6565C18218E3d5C30FB8C3eD8AA5368B9270D1E5", + "storageKeys": [ + "0x8af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219" + ] + }, + { + "address": "0x0F96dAe8c01C9524BD6620ab109A076A8790556d", + "storageKeys": [ + "0x8af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219" + ] + }, + { + "address": "0x3fc38b5896DFA30e7035DED8458dFefc553b79C6", + "storageKeys": [ + "0x8af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219" + ] + }, + { + "address": "0x2786E0D96D6A5AaaE1772d15a38cfbB320274286", + "storageKeys": [ + "0x8af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219" + ] + } + ], + "chainId": "0xb715" + }, + "privateKey": "0xa016e358479651f4089446d4fac6b978ebc92cb8c136a3ec12d4189fa41910cc", + "unsignedLegacy": "0xf86282013682d1cf85bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e1", + "unsignedEip155": "0xf86782013682d1cf85bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e182b7158080", + "unsignedBerlin": "0x01f9014782b71582013682d1cf85bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e1f8e0f7946565c18218e3d5c30fb8c3ed8aa5368b9270d1e5e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7940f96dae8c01c9524bd6620ab109a076a8790556de1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7943fc38b5896dfa30e7035ded8458dfefc553b79c6e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7942786e0d96d6a5aaae1772d15a38cfbb320274286e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219", + "unsignedLondon": "0x02f9014e82b715820136825f608672d1185cc52485bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e1f8e0f7946565c18218e3d5c30fb8c3ed8aa5368b9270d1e5e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7940f96dae8c01c9524bd6620ab109a076a8790556de1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7943fc38b5896dfa30e7035ded8458dfefc553b79c6e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7942786e0d96d6a5aaae1772d15a38cfbb320274286e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219", + "signedLegacy": "0xf8a582013682d1cf85bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e11ba0985012c464fcef9731760e0fe6671be97e97af38ab4d16170335718c530b2711a075ce1207ca0f35125ca7f56b056dbb2ea57225ac95277fec1847fdeb69bd1572", + "signedEip155": "0xf8a882013682d1cf85bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e183016e4ea071d40494d37ce7329ceb5a129b9bfbb91764a33a59105e8dfd181aaf775db0e6a02e03d936be568a0fa56d04b5dcb7bda08fbda5c054920db841c495f5a2a6cc44", + "signedBerlin": "0x01f9018a82b71582013682d1cf85bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e1f8e0f7946565c18218e3d5c30fb8c3ed8aa5368b9270d1e5e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7940f96dae8c01c9524bd6620ab109a076a8790556de1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7943fc38b5896dfa30e7035ded8458dfefc553b79c6e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7942786e0d96d6a5aaae1772d15a38cfbb320274286e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c2121901a0d68081e9a88638a225287428000ae6c4e9187a5b404d10a27518666186899735a00c43155636161c045678c2734aba266f9859b256cd4f50a30f2384685082f018", + "signedLondon": "0x02f9019182b715820136825f608672d1185cc52485bdc97afa8894ccd6ec986cb3c323dd9767de263f40532360916e825ebdb83c21f979b5b485b68ab66549fc5efbe31e7e0ef7469ebc2295845c56e500e1d542c5358a1c38eada73694f26f486d90b13491ff181d495962d4ba3f7e1f8e0f7946565c18218e3d5c30fb8c3ed8aa5368b9270d1e5e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7940f96dae8c01c9524bd6620ab109a076a8790556de1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7943fc38b5896dfa30e7035ded8458dfefc553b79c6e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c21219f7942786e0d96d6a5aaae1772d15a38cfbb320274286e1a08af68e30d0b55cd77e2a766ab742aacb53609d2f836b328fcba74f2010c2121901a0562579cd83d40f11a74619db6e611a457b79a5d102cb75878ce9421141b5caf8a048dd4fc821416ff641299f52110a3df7f189dd5bb1746c203f1d7fdf2c6feacb", + "signatureLegacy": { + "r": "0x985012c464fcef9731760e0fe6671be97e97af38ab4d16170335718c530b2711", + "s": "0x75ce1207ca0f35125ca7f56b056dbb2ea57225ac95277fec1847fdeb69bd1572", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x71d40494d37ce7329ceb5a129b9bfbb91764a33a59105e8dfd181aaf775db0e6", + "s": "0x2e03d936be568a0fa56d04b5dcb7bda08fbda5c054920db841c495f5a2a6cc44", + "v": "0x16e4e" + }, + "signatureBerlin": { + "r": "0xd68081e9a88638a225287428000ae6c4e9187a5b404d10a27518666186899735", + "s": "0x0c43155636161c045678c2734aba266f9859b256cd4f50a30f2384685082f018", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x562579cd83d40f11a74619db6e611a457b79a5d102cb75878ce9421141b5caf8", + "s": "0x48dd4fc821416ff641299f52110a3df7f189dd5bb1746c203f1d7fdf2c6feacb", + "v": "0x1" + } + }, + { + "name": "random-83", + "transaction": { + "to": "0xdEA0bD7fb350AF2bAF9E1878C127D2Ab62367C57", + "nonce": 715, + "gasLimit": "0xb4efc87514", + "gasPrice": "0x0a", + "maxFeePerGas": "0x1f7d3bf5b9", + "maxPriorityFeePerGas": "0xd4", + "data": "0xbedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02ff", + "value": "0x293b625665", + "accessList": [ + { + "address": "0x451964d8207FB75278caC13fb991bB4DFf4c6dDe", + "storageKeys": [ + "0xfee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808" + ] + }, + { + "address": "0x00456d5236A93FD20edC2081B46C087d9Fa6a413", + "storageKeys": [ + "0xfee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808" + ] + } + ], + "chainId": "0x1e" + }, + "privateKey": "0x615cfbe298a8d0e93b8862d7d84411af5f1bf3a027ad30dc440fff233a7cc1bb", + "unsignedLegacy": "0xf85a8202cb0a85b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02ff", + "unsignedEip155": "0xf85d8202cb0a85b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02ff1e8080", + "unsignedBerlin": "0x01f8cd1e8202cb0a85b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02fff870f794451964d8207fb75278cac13fb991bb4dff4c6ddee1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808f79400456d5236a93fd20edc2081b46c087d9fa6a413e1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808", + "unsignedLondon": "0x02f8d41e8202cb81d4851f7d3bf5b985b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02fff870f794451964d8207fb75278cac13fb991bb4dff4c6ddee1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808f79400456d5236a93fd20edc2081b46c087d9fa6a413e1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808", + "signedLegacy": "0xf89d8202cb0a85b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02ff1ba0e0e954fe6e08e3f4d1265663aa0d43a845a71b75cce5bb970d81524266a8aafca0714a340884a63df9998132928358e1d725dc22c742295672252cd89dca206b96", + "signedEip155": "0xf89d8202cb0a85b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02ff5fa0b28bce642330c23c472853e2d3a5138b0e6da1cb04bfa274bcd35c9d9a9f9b8ea01e8116ce66625e8f779673a2dafdafa13eb70b1cb89861ef56c60c68185cb9ca", + "signedBerlin": "0x01f901101e8202cb0a85b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02fff870f794451964d8207fb75278cac13fb991bb4dff4c6ddee1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808f79400456d5236a93fd20edc2081b46c087d9fa6a413e1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b180880a08a0d7ff01052049a2a55a0e8056b7103fa152bca0270f02d8a6ed514294294a3a02c9772fed884149b65f2b361151cdfec1f662e1f82733d61e6dfd4e62901a0c4", + "signedLondon": "0x02f901171e8202cb81d4851f7d3bf5b985b4efc8751494dea0bd7fb350af2baf9e1878c127d2ab62367c5785293b625665b4bedbdeee6681d6cb7a454978d6b2db56718cbc96a605ae9624a29a2432db87f2ff1cc1f86e2e70648a98acf0528b0b65c36e02fff870f794451964d8207fb75278cac13fb991bb4dff4c6ddee1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b1808f79400456d5236a93fd20edc2081b46c087d9fa6a413e1a0fee7c5273eff291e2f99cea4de43e53fca9177478563526d0765abe7705b180880a09c7c67faaffa61cb9650a41f8765510af1d4876d87dc8f2b3c89c187cd6c1088a05b0b8c14f0b39267f16cfdf7ceb95c4e93cde6c05e8d18fd9f5d43a9b7d485c8", + "signatureLegacy": { + "r": "0xe0e954fe6e08e3f4d1265663aa0d43a845a71b75cce5bb970d81524266a8aafc", + "s": "0x714a340884a63df9998132928358e1d725dc22c742295672252cd89dca206b96", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xb28bce642330c23c472853e2d3a5138b0e6da1cb04bfa274bcd35c9d9a9f9b8e", + "s": "0x1e8116ce66625e8f779673a2dafdafa13eb70b1cb89861ef56c60c68185cb9ca", + "v": "0x5f" + }, + "signatureBerlin": { + "r": "0x8a0d7ff01052049a2a55a0e8056b7103fa152bca0270f02d8a6ed514294294a3", + "s": "0x2c9772fed884149b65f2b361151cdfec1f662e1f82733d61e6dfd4e62901a0c4", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x9c7c67faaffa61cb9650a41f8765510af1d4876d87dc8f2b3c89c187cd6c1088", + "s": "0x5b0b8c14f0b39267f16cfdf7ceb95c4e93cde6c05e8d18fd9f5d43a9b7d485c8", + "v": "0x0" + } + }, + { + "name": "random-85", + "transaction": { + "to": "0x738e00821d153Dcec376712b6ADD16fc47F338aE", + "nonce": 13, + "gasLimit": "0xa738", + "gasPrice": "0x8ab887", + "maxFeePerGas": "0x3f509676", + "maxPriorityFeePerGas": "0x7096", + "data": "0x72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89ed", + "value": "0x8f", + "accessList": [ + { + "address": "0x4efD2cC4d144c522A33221C79d2154af3C43976e", + "storageKeys": [] + } + ], + "chainId": "0xc5" + }, + "privateKey": "0x16968fd6ccf45729052a8df3ec292a9a6fc134632dc9c34586ca5cef83ea62b8", + "unsignedLegacy": "0xf84b0d838ab88782a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89ed", + "unsignedEip155": "0xf84f0d838ab88782a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89ed81c58080", + "unsignedBerlin": "0x01f86581c50d838ab88782a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89edd7d6944efd2cc4d144c522a33221c79d2154af3c43976ec0", + "unsignedLondon": "0x02f86981c50d827096843f50967682a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89edd7d6944efd2cc4d144c522a33221c79d2154af3c43976ec0", + "signedLegacy": "0xf88e0d838ab88782a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89ed1ba03364ba030396677ca70340ba0044dfce09dd1f2772a51a8819e5292460277554a005722c69970a666eaf084c25cc9e63aae9d3cebf8077c5428a11b850a619ba0e", + "signedEip155": "0xf8900d838ab88782a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89ed8201aea03039dbb81e50a266a28c41dadd65504106cbd615c0ffbb2ad49b1ffc3abe9233a0377cddcef12d808e2c3f765e98d3f03a617356ad7dcddda7d9c58e0c8b9c37a9", + "signedBerlin": "0x01f8a881c50d838ab88782a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89edd7d6944efd2cc4d144c522a33221c79d2154af3c43976ec001a0bb8c89e7a442d509f0e7ba28341125eed2d1b0ceaded88ff778eb7e6c0532bb7a045587dd1741070a310a343be14576a5520fcc1f07b71b380bb135021b108484f", + "signedLondon": "0x02f8ac81c50d827096843f50967682a73894738e00821d153dcec376712b6add16fc47f338ae818fab72fd97f95ee06836ba1e1f7a38687b2373a869368e8e4ed6aa13fe1a51314a9d6fcefe2def5cb03b0e89edd7d6944efd2cc4d144c522a33221c79d2154af3c43976ec001a0e67e8c8dad53d2b81d30e8334c2f2ff69bc1ebe78fb04ad99a55bd4578ce6f59a0373f4b15e3d4188413ad5b223bc5364a2923bd0208f1ca7d97065c39d1d46725", + "signatureLegacy": { + "r": "0x3364ba030396677ca70340ba0044dfce09dd1f2772a51a8819e5292460277554", + "s": "0x05722c69970a666eaf084c25cc9e63aae9d3cebf8077c5428a11b850a619ba0e", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x3039dbb81e50a266a28c41dadd65504106cbd615c0ffbb2ad49b1ffc3abe9233", + "s": "0x377cddcef12d808e2c3f765e98d3f03a617356ad7dcddda7d9c58e0c8b9c37a9", + "v": "0x1ae" + }, + "signatureBerlin": { + "r": "0xbb8c89e7a442d509f0e7ba28341125eed2d1b0ceaded88ff778eb7e6c0532bb7", + "s": "0x45587dd1741070a310a343be14576a5520fcc1f07b71b380bb135021b108484f", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xe67e8c8dad53d2b81d30e8334c2f2ff69bc1ebe78fb04ad99a55bd4578ce6f59", + "s": "0x373f4b15e3d4188413ad5b223bc5364a2923bd0208f1ca7d97065c39d1d46725", + "v": "0x1" + } + }, + { + "name": "random-86", + "transaction": { + "to": "0xf5a539AaB57701a95d60e29F6743ffb6B85B3c10", + "nonce": 370, + "gasLimit": "0x45de63", + "gasPrice": "0xc91e7847a9", + "maxFeePerGas": "0x3a7ee3f1a271", + "maxPriorityFeePerGas": "0x7ba262", + "data": "0xb50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656", + "value": "0x80c31f", + "accessList": [ + { + "address": "0x7686321bB0cA6Be92Dd3141B8Fa55E763720cf41", + "storageKeys": [ + "0xba3c3083c0d3ed74b0db8ec526727ffdc6e32a84bafe2b709c861d35f39cbd3c" + ] + } + ], + "chainId": "0x0c8bd0a121" + }, + "privateKey": "0x585d6263c410504874d57b4ef8afc891f456d50b15a06bed33d6809fb021193e", + "unsignedLegacy": "0xf89b82017285c91e7847a98345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656", + "unsignedEip155": "0xf8a382017285c91e7847a98345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656850c8bd0a1218080", + "unsignedBerlin": "0x01f8db850c8bd0a12182017285c91e7847a98345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656f838f7947686321bb0ca6be92dd3141b8fa55e763720cf41e1a0ba3c3083c0d3ed74b0db8ec526727ffdc6e32a84bafe2b709c861d35f39cbd3c", + "unsignedLondon": "0x02f8e0850c8bd0a121820172837ba262863a7ee3f1a2718345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656f838f7947686321bb0ca6be92dd3141b8fa55e763720cf41e1a0ba3c3083c0d3ed74b0db8ec526727ffdc6e32a84bafe2b709c861d35f39cbd3c", + "signedLegacy": "0xf8de82017285c91e7847a98345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f626561ca0c823c403a9bd9ee2c6025d2e2250997deda18d8c9e0fd4cba8548bff12aaee9da04536df200e2fb59abd6ccce6b6e1379cfdfd51945fd3a875a72ff0be4b0dccba", + "signedEip155": "0xf8e382017285c91e7847a98345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656851917a14266a0505e87152fa123879b064936b25867fe12029b13ed44c3003e76e6f8cb63c973a03599cdd431e62c26240bdb8f034dc5aa18a284909f94cdcd7283115484879046", + "signedBerlin": "0x01f9011e850c8bd0a12182017285c91e7847a98345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656f838f7947686321bb0ca6be92dd3141b8fa55e763720cf41e1a0ba3c3083c0d3ed74b0db8ec526727ffdc6e32a84bafe2b709c861d35f39cbd3c01a00c82805cb9358ce0e95b71d4e39683d4ca6d15c5ca6ae9a190ea0b28e169b0b9a04345450885a5f363f8a2a61e2e54dea426aa1af9267d69cd987b0609e14ec0a4", + "signedLondon": "0x02f90123850c8bd0a121820172837ba262863a7ee3f1a2718345de6394f5a539aab57701a95d60e29f6743ffb6b85b3c108380c31fb873b50e9b2bc808c09b7604fadea791fcb725e38a1175b2a355d0d826386850b38f372a76cd81ac2e9095e122b5fda203c064a54c9ebb5578b66331450984a1c8c73e7148388409eedb458114ee896567efcfaa65fff345ab914dc45ab23f8b5f258016f433b64100e194d96e9deeb142d8f62656f838f7947686321bb0ca6be92dd3141b8fa55e763720cf41e1a0ba3c3083c0d3ed74b0db8ec526727ffdc6e32a84bafe2b709c861d35f39cbd3c80a04e2af0d5d20ae5bd986fca87d75180c8538da43829ad6fbd3c73741ac20b17faa0340c83c84c8aba15d660e33462fbfd08d02025cc1e1c32d1c48f59683919320e", + "signatureLegacy": { + "r": "0xc823c403a9bd9ee2c6025d2e2250997deda18d8c9e0fd4cba8548bff12aaee9d", + "s": "0x4536df200e2fb59abd6ccce6b6e1379cfdfd51945fd3a875a72ff0be4b0dccba", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x505e87152fa123879b064936b25867fe12029b13ed44c3003e76e6f8cb63c973", + "s": "0x3599cdd431e62c26240bdb8f034dc5aa18a284909f94cdcd7283115484879046", + "v": "0x1917a14266" + }, + "signatureBerlin": { + "r": "0x0c82805cb9358ce0e95b71d4e39683d4ca6d15c5ca6ae9a190ea0b28e169b0b9", + "s": "0x4345450885a5f363f8a2a61e2e54dea426aa1af9267d69cd987b0609e14ec0a4", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x4e2af0d5d20ae5bd986fca87d75180c8538da43829ad6fbd3c73741ac20b17fa", + "s": "0x340c83c84c8aba15d660e33462fbfd08d02025cc1e1c32d1c48f59683919320e", + "v": "0x0" + } + }, + { + "name": "random-87", + "transaction": { + "to": "0x438d2b3609CC8abE7b995bF1cf049583e8E6f593", + "nonce": 568, + "gasLimit": "0xdd7404edd9", + "gasPrice": "0xed", + "maxFeePerGas": "0x440ae26b", + "maxPriorityFeePerGas": "0xde7708", + "data": "0x936aa1b33e9fe589ec829de82a24cfdfb4f51b", + "value": "0xb494d92d76", + "accessList": [ + { + "address": "0xa79B83cd6f7271Df23726BF834747F26064eF2e6", + "storageKeys": [] + } + ], + "chainId": "0xdce47d" + }, + "privateKey": "0x0471f676418c1f3cc8305025ce913e271c62064302cfc52a3cbcee02ffae444e", + "unsignedLegacy": "0xf83a82023881ed85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51b", + "unsignedEip155": "0xf84082023881ed85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51b83dce47d8080", + "unsignedBerlin": "0x01f85683dce47d82023881ed85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51bd7d694a79b83cd6f7271df23726bf834747f26064ef2e6c0", + "unsignedLondon": "0x02f85d83dce47d82023883de770884440ae26b85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51bd7d694a79b83cd6f7271df23726bf834747f26064ef2e6c0", + "signedLegacy": "0xf87d82023881ed85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51b1ba005e2d32fd18f63a1013a66b39ed99094921723320adae275c2c8a49e20a34e37a0781b99b673417bf219dbdc8701eab78fa959307017be62358f66f31f6b4a0a49", + "signedEip155": "0xf88182023881ed85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51b8401b9c91ea09cc5a99d7e0ee3d2ab127db8204b86c874308e1223355fe30faad9274daab53aa051def6b7adcb32a43c95811d2c33022b0fcb018f525af3e68b31670d6f6654f7", + "signedBerlin": "0x01f89983dce47d82023881ed85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51bd7d694a79b83cd6f7271df23726bf834747f26064ef2e6c080a02d3a89c5598c9c7f767e8f33dcbeee7bae03d8cca5feb60fa25b1290c5a254bca04145f646a8cf45458351e477f3f79e8226098d6cbf5429336f2f499fb4a5c5c7", + "signedLondon": "0x02f8a083dce47d82023883de770884440ae26b85dd7404edd994438d2b3609cc8abe7b995bf1cf049583e8e6f59385b494d92d7693936aa1b33e9fe589ec829de82a24cfdfb4f51bd7d694a79b83cd6f7271df23726bf834747f26064ef2e6c001a0382efc39572d37d44ecea76edcbce133dc0838c9538320eb72959fbff6821613a06aa004ef7b52fd7b120bdd9deb70f4adc42dceb531ee3f3e8d41c9cbb0adf177", + "signatureLegacy": { + "r": "0x05e2d32fd18f63a1013a66b39ed99094921723320adae275c2c8a49e20a34e37", + "s": "0x781b99b673417bf219dbdc8701eab78fa959307017be62358f66f31f6b4a0a49", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x9cc5a99d7e0ee3d2ab127db8204b86c874308e1223355fe30faad9274daab53a", + "s": "0x51def6b7adcb32a43c95811d2c33022b0fcb018f525af3e68b31670d6f6654f7", + "v": "0x1b9c91e" + }, + "signatureBerlin": { + "r": "0x2d3a89c5598c9c7f767e8f33dcbeee7bae03d8cca5feb60fa25b1290c5a254bc", + "s": "0x4145f646a8cf45458351e477f3f79e8226098d6cbf5429336f2f499fb4a5c5c7", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x382efc39572d37d44ecea76edcbce133dc0838c9538320eb72959fbff6821613", + "s": "0x6aa004ef7b52fd7b120bdd9deb70f4adc42dceb531ee3f3e8d41c9cbb0adf177", + "v": "0x1" + } + }, + { + "name": "random-89", + "transaction": { + "to": "0xe9245ea707d23326d211e9A21481F16CBc1577d5", + "nonce": 655, + "gasLimit": "0xc95753e036", + "gasPrice": "0x10ad61c66e", + "maxFeePerGas": "0xd4d682c966ad", + "maxPriorityFeePerGas": "0x67a304", + "data": "0xe029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a4", + "value": "0x784b51db", + "accessList": [ + { + "address": "0x0D7379d9879dF8545034E0F3a04c9a8B5685c470", + "storageKeys": [ + "0x9fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967a", + "0x1dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccd", + "0x16ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829" + ] + }, + { + "address": "0x07c936c01804b467d098543215BE81115dE41555", + "storageKeys": [ + "0x9fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967a", + "0x1dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccd", + "0x16ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829" + ] + } + ], + "chainId": "0x32" + }, + "privateKey": "0x29027af6a9843bfac96994bcecebe57b40d67942fdededc72a513a0bb2a9d8b0", + "unsignedLegacy": "0xf86882028f8510ad61c66e85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a4", + "unsignedEip155": "0xf86b82028f8510ad61c66e85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a4328080", + "unsignedBerlin": "0x01f901633282028f8510ad61c66e85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a4f8f8f87a940d7379d9879df8545034e0f3a04c9a8b5685c470f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829f87a9407c936c01804b467d098543215be81115de41555f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829", + "unsignedLondon": "0x02f901683282028f8367a30486d4d682c966ad85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a4f8f8f87a940d7379d9879df8545034e0f3a04c9a8b5685c470f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829f87a9407c936c01804b467d098543215be81115de41555f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829", + "signedLegacy": "0xf8ab82028f8510ad61c66e85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a41ba006094d0eef80081f45f9c9d33007e9ab3861502a254f4ca53ff29c16ebd79344a00db1643b02f824a4f34af615083ae242fea5d42e5b00904178f93e7048d3ea42", + "signedEip155": "0xf8ac82028f8510ad61c66e85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a48188a0cdbbeebc9ccb72d569ed2ca99b19c4917089b70221c112e3b30f999d8170ec97a057220efd894a5232d4534c3c12c9d8d9cbe1748855356ae97095dc14099ef805", + "signedBerlin": "0x01f901a63282028f8510ad61c66e85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a4f8f8f87a940d7379d9879df8545034e0f3a04c9a8b5685c470f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829f87a9407c936c01804b467d098543215be81115de41555f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e0882901a03f49f7dd99e5a849a6d2186dd917c175c9509a28ee8e2fd9e91d7daebe303618a06bf3a37f3d53b658d9c002859805632e5659653d6bc66fd45780ac61d5d66c99", + "signedLondon": "0x02f901ab3282028f8367a30486d4d682c966ad85c95753e03694e9245ea707d23326d211e9a21481f16cbc1577d584784b51dbb83de029fe6e6042731ea3cd9a61a5e5010a715ad49ab352b8887efdeffa3413ab90c2ed60ccbd37a96bcd3d5843c89253629d0bf20a9bbb0f02b14b2e61a4f8f8f87a940d7379d9879df8545034e0f3a04c9a8b5685c470f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e08829f87a9407c936c01804b467d098543215be81115de41555f863a09fbd0c94635f66de2183db6259f79af345603071ebd06f5275530690f2dd967aa01dbc647cb094104688cc800c04a9f4ce356606469f7aaf0889a4ccd084925ccda016ac0a852763036118c175fe5a86811c7ed8ba75bd427a63985b8a3c81e0882980a094f608852e3f9a76627cc3a0150dc018d47e3766b6dabcc77ea3beaf77a67df3a0109c49c96c7c19bbf823362d0f2a1ce25fb50991b81a8f622055bf33f83508d5", + "signatureLegacy": { + "r": "0x06094d0eef80081f45f9c9d33007e9ab3861502a254f4ca53ff29c16ebd79344", + "s": "0x0db1643b02f824a4f34af615083ae242fea5d42e5b00904178f93e7048d3ea42", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xcdbbeebc9ccb72d569ed2ca99b19c4917089b70221c112e3b30f999d8170ec97", + "s": "0x57220efd894a5232d4534c3c12c9d8d9cbe1748855356ae97095dc14099ef805", + "v": "0x88" + }, + "signatureBerlin": { + "r": "0x3f49f7dd99e5a849a6d2186dd917c175c9509a28ee8e2fd9e91d7daebe303618", + "s": "0x6bf3a37f3d53b658d9c002859805632e5659653d6bc66fd45780ac61d5d66c99", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x94f608852e3f9a76627cc3a0150dc018d47e3766b6dabcc77ea3beaf77a67df3", + "s": "0x109c49c96c7c19bbf823362d0f2a1ce25fb50991b81a8f622055bf33f83508d5", + "v": "0x0" + } + }, + { + "name": "random-92", + "transaction": { + "to": "0x9843b8294222B557E29E6c5cC5f5Df02614c0d26", + "nonce": 146, + "gasLimit": "0xbfb56a65", + "gasPrice": "0x6364", + "maxFeePerGas": "0x985d56a8", + "maxPriorityFeePerGas": "0xb8", + "data": "0x4008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e0057", + "value": "0x72c6a7", + "accessList": [ + { + "address": "0xa62597d755fbf70449378EE68a20c5A9868b638d", + "storageKeys": [ + "0xeecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90ec", + "0xf1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2", + "0xcb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875", + "0x667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6" + ] + }, + { + "address": "0xa7Ba97561236A12Ae145CeB37e68e9B70032Ac24", + "storageKeys": [ + "0xeecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90ec", + "0xf1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2", + "0xcb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875", + "0x667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6" + ] + }, + { + "address": "0x9E5cbFb2431afB1CE946dF03f001091261612DE5", + "storageKeys": [ + "0xeecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90ec", + "0xf1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2", + "0xcb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875", + "0x667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6" + ] + }, + { + "address": "0xee14B71526DEF4c5e602d7ae747dd9a6875C7714", + "storageKeys": [ + "0xeecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90ec", + "0xf1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2", + "0xcb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875", + "0x667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6" + ] + } + ], + "chainId": "0xa1ff150e5f" + }, + "privateKey": "0xeaac01457a987ac5262cad6c2757468a689aee11bdc7dbc3630fafa2b4a3929e", + "unsignedLegacy": "0xf879819282636484bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e0057", + "unsignedEip155": "0xf881819282636484bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e005785a1ff150e5f8080", + "unsignedBerlin": "0x01f902f685a1ff150e5f819282636484bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e0057f90274f89b94a62597d755fbf70449378ee68a20c5a9868b638df884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94a7ba97561236a12ae145ceb37e68e9b70032ac24f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b949e5cbfb2431afb1ce946df03f001091261612de5f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94ee14b71526def4c5e602d7ae747dd9a6875c7714f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6", + "unsignedLondon": "0x02f902fa85a1ff150e5f819281b884985d56a884bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e0057f90274f89b94a62597d755fbf70449378ee68a20c5a9868b638df884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94a7ba97561236a12ae145ceb37e68e9b70032ac24f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b949e5cbfb2431afb1ce946df03f001091261612de5f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94ee14b71526def4c5e602d7ae747dd9a6875c7714f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6", + "signedLegacy": "0xf8bc819282636484bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e00571ba0fec23e4aae3048d18e280b673d538d807880a11b2bb7b359958aaba7d632b2a4a072037853902de0902ded8214442b52d1f0e17c3c2b40b478fcecec2e9ec3aa2c", + "signedEip155": "0xf8c2819282636484bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e0057860143fe2a1ce2a03deca8f7b9fc2280637737690b067c927d9c5ace5947832ac2326a26f9fcd506a05324db486f82fa900f675c8d6a3d23d212ee89ba4936523e730e4123573b530f", + "signedBerlin": "0x01f9033985a1ff150e5f819282636484bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e0057f90274f89b94a62597d755fbf70449378ee68a20c5a9868b638df884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94a7ba97561236a12ae145ceb37e68e9b70032ac24f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b949e5cbfb2431afb1ce946df03f001091261612de5f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94ee14b71526def4c5e602d7ae747dd9a6875c7714f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa601a066b63baa4a5f4194863b54e043e5f773b1da30949211723c4a408f4a893d84c5a0017d52eddaec3a2b4487046e12cfd360c89fda2d0889dc64d2a976614df212cd", + "signedLondon": "0x02f9033d85a1ff150e5f819281b884985d56a884bfb56a65949843b8294222b557e29e6c5cc5f5df02614c0d268372c6a7b8544008bf93ddd614e9ae1f7d5fd93803c63187564ee380cb49a59eef242d474d8b5d6d5d3e00db2c1f42d056bc41facf40928ec4f863c47fa0f33f63498ee0443d9ab6cf40d51147e22a4d0f8de5e5915f931e0057f90274f89b94a62597d755fbf70449378ee68a20c5a9868b638df884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94a7ba97561236a12ae145ceb37e68e9b70032ac24f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b949e5cbfb2431afb1ce946df03f001091261612de5f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa6f89b94ee14b71526def4c5e602d7ae747dd9a6875c7714f884a0eecff36ca4a793303bfeb2f7666d3015f472177f92799c87fff30d28ad6e90eca0f1036466716147ac2615ed333a1a592cf8784c6692de2d848e6aba67379e98f2a0cb2d7d4ab4d9226e508aa2d9cd2d6016dbcbedce517f727e5aadf6b0ebe21875a0667066601b50ad91163654013e109e51fae6a8bf19a988a51adfda6aea130fa601a0c1525bd11266bbaa0b5e660e667070672396e978edb5b7a987cb8a77d5f3e4d8a01160d38ae48cbf52af90ecdb665f3c7b2662807c8b17b8d6b3d67396f6a5f7c6", + "signatureLegacy": { + "r": "0xfec23e4aae3048d18e280b673d538d807880a11b2bb7b359958aaba7d632b2a4", + "s": "0x72037853902de0902ded8214442b52d1f0e17c3c2b40b478fcecec2e9ec3aa2c", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x3deca8f7b9fc2280637737690b067c927d9c5ace5947832ac2326a26f9fcd506", + "s": "0x5324db486f82fa900f675c8d6a3d23d212ee89ba4936523e730e4123573b530f", + "v": "0x143fe2a1ce2" + }, + "signatureBerlin": { + "r": "0x66b63baa4a5f4194863b54e043e5f773b1da30949211723c4a408f4a893d84c5", + "s": "0x017d52eddaec3a2b4487046e12cfd360c89fda2d0889dc64d2a976614df212cd", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xc1525bd11266bbaa0b5e660e667070672396e978edb5b7a987cb8a77d5f3e4d8", + "s": "0x1160d38ae48cbf52af90ecdb665f3c7b2662807c8b17b8d6b3d67396f6a5f7c6", + "v": "0x1" + } + }, + { + "name": "random-95", + "transaction": { + "to": "0x7FCf2593fb964D4bAeA7ffE87B3f412100DAC621", + "nonce": 423, + "gasLimit": "0xf7cf0c5075", + "gasPrice": "0xe964c88a", + "maxFeePerGas": "0xa9ff5ad499bb", + "maxPriorityFeePerGas": "0x5296", + "data": "0xdb69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca8", + "value": "0xb9e88f4f", + "accessList": [], + "chainId": "0x602e72d185" + }, + "privateKey": "0x1a9ae40ca84938a9ee766abe7a928c112125e65ffb984ace323a3613418bc9b1", + "unsignedLegacy": "0xf89d8201a784e964c88a85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca8", + "unsignedEip155": "0xf8a58201a784e964c88a85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca885602e72d1858080", + "unsignedBerlin": "0x01f8a485602e72d1858201a784e964c88a85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca8c0", + "unsignedLondon": "0x02f8a985602e72d1858201a782529686a9ff5ad499bb85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca8c0", + "signedLegacy": "0xf8e08201a784e964c88a85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca81ba0c0a14ae7d5ef91085d32333a2699c87d211a67bb934199873a8e9cf230fc0a85a0064ec5e7127e4113334183dc84cd5438b54573a3555d559bcb1ad4a86d96d704", + "signedEip155": "0xf8e58201a784e964c88a85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca885c05ce5a32da0d47a417515ceec5eace31667efd6b7ff461a336591a023e5cfa581bf5491e668a07543ba18110c17e6b2042efa6f946246e08c494da18e89e7fe59cd35edb38557", + "signedBerlin": "0x01f8e785602e72d1858201a784e964c88a85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca8c080a047e527561d734444853b99d7382335c41a8e566718384440b4a1d506afda5862a074c0de65b5239ab601a3841f714dff0b0760066fb00ad66f21b9bdafa258c74a", + "signedLondon": "0x02f8ec85602e72d1858201a782529686a9ff5ad499bb85f7cf0c5075947fcf2593fb964d4baea7ffe87b3f412100dac62184b9e88f4fb873db69d4bccca65789f9ffe0b83c58b282f59dab153145206de2a94e5c2c9c8d4df192ee0d7b4f74e1c862e1cefdc608b7b4766cfd5089710627b93c6f9ff2a70056479bc675acdc49a4f457a0762daa9a1924ff6cc3a46386d6830ed26411b34c50c1ef36a393a66d4447ea57ef6b275f8fbca8c001a0345ebb601a19e7e4e4c33142f3c0c3e168a77f64c0623b05835c6afc1511a1cba0236d2616a8f14bd61fc3eb07f097002c0abae5f9bcacd4924f8b6a9f395de57e", + "signatureLegacy": { + "r": "0xc0a14ae7d5ef91085d32333a2699c87d211a67bb934199873a8e9cf230fc0a85", + "s": "0x064ec5e7127e4113334183dc84cd5438b54573a3555d559bcb1ad4a86d96d704", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xd47a417515ceec5eace31667efd6b7ff461a336591a023e5cfa581bf5491e668", + "s": "0x7543ba18110c17e6b2042efa6f946246e08c494da18e89e7fe59cd35edb38557", + "v": "0xc05ce5a32d" + }, + "signatureBerlin": { + "r": "0x47e527561d734444853b99d7382335c41a8e566718384440b4a1d506afda5862", + "s": "0x74c0de65b5239ab601a3841f714dff0b0760066fb00ad66f21b9bdafa258c74a", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x345ebb601a19e7e4e4c33142f3c0c3e168a77f64c0623b05835c6afc1511a1cb", + "s": "0x236d2616a8f14bd61fc3eb07f097002c0abae5f9bcacd4924f8b6a9f395de57e", + "v": "0x1" + } + }, + { + "name": "random-99", + "transaction": { + "to": "0x9f71e4c7FD19c4D5b29e886c54304468aC1d2F7c", + "nonce": 441, + "gasLimit": "0xe18b", + "gasPrice": "0xed805a23", + "maxFeePerGas": "0x83b12a8e1860", + "maxPriorityFeePerGas": "0xcf", + "data": "0xb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad4", + "value": "0xdec4c4c466", + "accessList": [ + { + "address": "0xb3E549AeB64c243D88782e927d6764E8dEBD78A4", + "storageKeys": [ + "0x4891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700", + "0x697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0", + "0xb40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82" + ] + }, + { + "address": "0x86562A635B72301Ad01B3AE2800254e67c6f0b11", + "storageKeys": [ + "0x4891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700", + "0x697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0", + "0xb40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82" + ] + }, + { + "address": "0x11Dc99a2F61C8e4391f3F23658E81ae4Aa4C1aCD", + "storageKeys": [ + "0x4891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700", + "0x697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0", + "0xb40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82" + ] + } + ], + "chainId": "0x54ba26e0" + }, + "privateKey": "0x8a6ecc29cc77c8ed30964f4ad426b83e5a079c394eeb6108670d59ea82bbef12", + "unsignedLegacy": "0xf8438201b984ed805a2382e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad4", + "unsignedEip155": "0xf84a8201b984ed805a2382e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad48454ba26e08080", + "unsignedBerlin": "0x01f901bf8454ba26e08201b984ed805a2382e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad4f90174f87a94b3e549aeb64c243d88782e927d6764e8debd78a4f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9486562a635b72301ad01b3ae2800254e67c6f0b11f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9411dc99a2f61c8e4391f3f23658e81ae4aa4c1acdf863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82", + "unsignedLondon": "0x02f901c38454ba26e08201b981cf8683b12a8e186082e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad4f90174f87a94b3e549aeb64c243d88782e927d6764e8debd78a4f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9486562a635b72301ad01b3ae2800254e67c6f0b11f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9411dc99a2f61c8e4391f3f23658e81ae4aa4c1acdf863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82", + "signedLegacy": "0xf8868201b984ed805a2382e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad41ba0c1c0630513436194dfe7e21ca8041d95546094535d3c695df1ecba74e87df700a07306bd300b67489bcb342d77ac7bff4aaed41200c6476bcb4ac6a38c62dfeef9", + "signedEip155": "0xf88a8201b984ed805a2382e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad484a9744de4a06c840ab0fb36ba469dc10d1bb4fe545cb307183d11097d9125904ddfff765e90a02ea3aea65a682f3576e3ae5e44334fe18b0acad3a6d5b57e1786cba14af70e99", + "signedBerlin": "0x01f902028454ba26e08201b984ed805a2382e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad4f90174f87a94b3e549aeb64c243d88782e927d6764e8debd78a4f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9486562a635b72301ad01b3ae2800254e67c6f0b11f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9411dc99a2f61c8e4391f3f23658e81ae4aa4c1acdf863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f8280a0e2ee977e552b0aa707061ff7a34a3904e8f1fbdfb97f2bed4a62db17914a0c7ba005bc2df7c6e25368bd9d5e3f3d8b219c04853b139323f415e698632d3e1b015a", + "signedLondon": "0x02f902068454ba26e08201b981cf8683b12a8e186082e18b949f71e4c7fd19c4d5b29e886c54304468ac1d2f7c85dec4c4c4669cb4d954d784ad5653fa633d0cbe5cd8a77877715fefac840fab383ad4f90174f87a94b3e549aeb64c243d88782e927d6764e8debd78a4f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9486562a635b72301ad01b3ae2800254e67c6f0b11f863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f82f87a9411dc99a2f61c8e4391f3f23658e81ae4aa4c1acdf863a04891561ee7a491b1762774c7ed021932602719f6897461f4f631759e8e737700a0697afd06f621b7f4a36588735cd00df8e4ffacbbe4b650bea69ce4e831b10fa0a0b40e5f70447e0386807c47454fd24880248b440f23135643f6ae65534f7a2f8280a093cf6184ebc5a03ca4d80a98a7010c1f3ecd29c3f030a54dcb3f35c246f85f43a064244ac73a4da7dd65d66c8ba8a975bab944301148a49f7556c29517c2b94872", + "signatureLegacy": { + "r": "0xc1c0630513436194dfe7e21ca8041d95546094535d3c695df1ecba74e87df700", + "s": "0x7306bd300b67489bcb342d77ac7bff4aaed41200c6476bcb4ac6a38c62dfeef9", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x6c840ab0fb36ba469dc10d1bb4fe545cb307183d11097d9125904ddfff765e90", + "s": "0x2ea3aea65a682f3576e3ae5e44334fe18b0acad3a6d5b57e1786cba14af70e99", + "v": "0xa9744de4" + }, + "signatureBerlin": { + "r": "0xe2ee977e552b0aa707061ff7a34a3904e8f1fbdfb97f2bed4a62db17914a0c7b", + "s": "0x05bc2df7c6e25368bd9d5e3f3d8b219c04853b139323f415e698632d3e1b015a", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x93cf6184ebc5a03ca4d80a98a7010c1f3ecd29c3f030a54dcb3f35c246f85f43", + "s": "0x64244ac73a4da7dd65d66c8ba8a975bab944301148a49f7556c29517c2b94872", + "v": "0x0" + } + }, + { + "name": "random-101", + "transaction": { + "to": "0x266Cc277694E42AeD00e176912b316d8a91aD200", + "nonce": 38, + "gasLimit": "0xabd316d639", + "gasPrice": "0xed4f", + "maxFeePerGas": "0x9c8c9e7256", + "maxPriorityFeePerGas": "0x26", + "data": "0x9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20b", + "value": "0x8420", + "accessList": [ + { + "address": "0x0Ab340b68F32b8d15469BB5A8cDDeB0167cD8430", + "storageKeys": [] + }, + { + "address": "0x2a4e426eb67e11405ab05AAC13b295828323E287", + "storageKeys": [] + }, + { + "address": "0xc95DF22A50869d5dd7cEf85456f8009EB577a667", + "storageKeys": [] + }, + { + "address": "0xFEc8439a686E117fC007519326C10D2E9E55D870", + "storageKeys": [] + } + ], + "chainId": "0x4d5819" + }, + "privateKey": "0x561fa09ba3b1e6efe0a2900a3c04a6321b6dcdf91a71234de95982294b661b0b", + "unsignedLegacy": "0xf8812682ed4f85abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20b", + "unsignedEip155": "0xf8872682ed4f85abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20b834d58198080", + "unsignedBerlin": "0x01f8e3834d58192682ed4f85abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20bf85cd6940ab340b68f32b8d15469bb5a8cddeb0167cd8430c0d6942a4e426eb67e11405ab05aac13b295828323e287c0d694c95df22a50869d5dd7cef85456f8009eb577a667c0d694fec8439a686e117fc007519326c10d2e9e55d870c0", + "unsignedLondon": "0x02f8e7834d58192626859c8c9e725685abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20bf85cd6940ab340b68f32b8d15469bb5a8cddeb0167cd8430c0d6942a4e426eb67e11405ab05aac13b295828323e287c0d694c95df22a50869d5dd7cef85456f8009eb577a667c0d694fec8439a686e117fc007519326c10d2e9e55d870c0", + "signedLegacy": "0xf8c42682ed4f85abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20b1ba0d3f9083b362511f3d80bd62f9e54474eeafb117412fad6ccd360ab55852bfde3a057ad4573c784a6d2bd8a6cadf5aed50d2951817480e5273ef717cc5824cf028d", + "signedEip155": "0xf8c72682ed4f85abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20b839ab056a0f55070e5898ea0ec3380c21b0ea8a44a588c70c0f2d6b895fc764e58d295efd0a06ccac28c32f7f9d8b2d6280a1c626c13e81c6e1c629aac30dfdf18f6b82212c2", + "signedBerlin": "0x01f90126834d58192682ed4f85abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20bf85cd6940ab340b68f32b8d15469bb5a8cddeb0167cd8430c0d6942a4e426eb67e11405ab05aac13b295828323e287c0d694c95df22a50869d5dd7cef85456f8009eb577a667c0d694fec8439a686e117fc007519326c10d2e9e55d870c001a0ecfc0f4dd4c43f2d34ee4d8d7380fe6eadda6e9c2a113ae1955782616959b1e1a0058750bfad3b12c020aeba7b12ff681d5427310511251105607ddfd646b5cf29", + "signedLondon": "0x02f9012a834d58192626859c8c9e725685abd316d63994266cc277694e42aed00e176912b316d8a91ad200828420b85d9073b6eecdf3c4c6d47c27e2754a923f461b79c523362b936ae59adaff5dc1857e78e568e4a1d128d73b117e42c94eef176f86a9782d9191463852afd6dd3a1abae36e821dcdcc749da3ccacd453a49ba1484ca8cc05a77fdca8e2b20bf85cd6940ab340b68f32b8d15469bb5a8cddeb0167cd8430c0d6942a4e426eb67e11405ab05aac13b295828323e287c0d694c95df22a50869d5dd7cef85456f8009eb577a667c0d694fec8439a686e117fc007519326c10d2e9e55d870c080a08fbe3ecdac8542e92b28b6bc17d81a11cccabed96fd7829073a430faa3896d8ba031964fc2c71fc59431d39c68d3108d1da263abe22d8e4485984bfd569dab58e6", + "signatureLegacy": { + "r": "0xd3f9083b362511f3d80bd62f9e54474eeafb117412fad6ccd360ab55852bfde3", + "s": "0x57ad4573c784a6d2bd8a6cadf5aed50d2951817480e5273ef717cc5824cf028d", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xf55070e5898ea0ec3380c21b0ea8a44a588c70c0f2d6b895fc764e58d295efd0", + "s": "0x6ccac28c32f7f9d8b2d6280a1c626c13e81c6e1c629aac30dfdf18f6b82212c2", + "v": "0x9ab056" + }, + "signatureBerlin": { + "r": "0xecfc0f4dd4c43f2d34ee4d8d7380fe6eadda6e9c2a113ae1955782616959b1e1", + "s": "0x058750bfad3b12c020aeba7b12ff681d5427310511251105607ddfd646b5cf29", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x8fbe3ecdac8542e92b28b6bc17d81a11cccabed96fd7829073a430faa3896d8b", + "s": "0x31964fc2c71fc59431d39c68d3108d1da263abe22d8e4485984bfd569dab58e6", + "v": "0x0" + } + }, + { + "name": "random-103", + "transaction": { + "to": "0x32838632F7848fBa09DcCbBbfc4dD0d0fc1a21ae", + "nonce": 334, + "gasLimit": "0xb6aa8d247a", + "gasPrice": "0x67b6a74b", + "maxFeePerGas": "0x9bfd9f5335", + "maxPriorityFeePerGas": "0x481b", + "data": "0x7c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d8", + "value": "0xb31f69", + "accessList": [], + "chainId": "0x98bcc6250d" + }, + "privateKey": "0x8f467fa56631c82400b54743f81e79d07dbe7589e7130815622ec9b9ed40337a", + "unsignedLegacy": "0xf86b82014e8467b6a74b85b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d8", + "unsignedEip155": "0xf87382014e8467b6a74b85b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d88598bcc6250d8080", + "unsignedBerlin": "0x01f8728598bcc6250d82014e8467b6a74b85b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d8c0", + "unsignedLondon": "0x02f8768598bcc6250d82014e82481b859bfd9f533585b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d8c0", + "signedLegacy": "0xf8ae82014e8467b6a74b85b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d81ba007a29fc8d356948ad9c0d77e885f675f87a51fad01225eb8ccbe1475e34d5362a04406509959883f33c9a3a01c96602a1108058164527593d59d3bd83cad4b5f1b", + "signedEip155": "0xf8b482014e8467b6a74b85b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d8860131798c4a3da021a88922756891963d2c5c7a2c914076320c34d94757088268679e6159817ab9a03d64ef41d3224104c3e0b33753df16c1d5fbada2be58fa3e233caec3102952a1", + "signedBerlin": "0x01f8b58598bcc6250d82014e8467b6a74b85b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d8c080a0a7045de9f9eff8a4ba51094aec8eb107b9d367ef309dca419dfa61982ea5af6da0729d13493f40a410497c47a467b3c9c076887b886b1a602c2b34368647e4b55a", + "signedLondon": "0x02f8b98598bcc6250d82014e82481b859bfd9f533585b6aa8d247a9432838632f7848fba09dccbbbfc4dd0d0fc1a21ae83b31f69b8427c10c28566ee5e565fb0249f6f01c876967d304870de1a4a8133da1a9112b8a8c767041017f896d1df4f9c564ee73ae83c5efa0df93fd52bd963199b39760b59c2d8c001a018e50900802d8c6edd30617c7efd0ab74d6dcbad97657673f2f3482003f60fc0a0481644568083fb9005be4cb3751a5ba2d433252f4e47dc9e79d7d0ef96d097ce", + "signatureLegacy": { + "r": "0x07a29fc8d356948ad9c0d77e885f675f87a51fad01225eb8ccbe1475e34d5362", + "s": "0x4406509959883f33c9a3a01c96602a1108058164527593d59d3bd83cad4b5f1b", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x21a88922756891963d2c5c7a2c914076320c34d94757088268679e6159817ab9", + "s": "0x3d64ef41d3224104c3e0b33753df16c1d5fbada2be58fa3e233caec3102952a1", + "v": "0x131798c4a3d" + }, + "signatureBerlin": { + "r": "0xa7045de9f9eff8a4ba51094aec8eb107b9d367ef309dca419dfa61982ea5af6d", + "s": "0x729d13493f40a410497c47a467b3c9c076887b886b1a602c2b34368647e4b55a", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x18e50900802d8c6edd30617c7efd0ab74d6dcbad97657673f2f3482003f60fc0", + "s": "0x481644568083fb9005be4cb3751a5ba2d433252f4e47dc9e79d7d0ef96d097ce", + "v": "0x1" + } + }, + { + "name": "random-108", + "transaction": { + "to": "0xabe72878a51e28AbaFcAa14ac99bDB97B2e4D170", + "nonce": 480, + "gasLimit": "0x891f", + "gasPrice": "0x2e61c0a7d1", + "maxFeePerGas": "0x1f96cabb630b77", + "maxPriorityFeePerGas": "0x0f13", + "data": "0x08e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9b", + "value": "0xfb", + "accessList": [ + { + "address": "0xB93b1cFDd998346a406f9C5631eeA082f8DDe274", + "storageKeys": [ + "0x08af322c4e39cff34a1319599a15d75f12aef677e43bdaa89783ee4572178e3b", + "0xf2a74ec9c790bad178bb9bd5ff86e47b56b27505902cc94b3d6329a1ed9f3e8f", + "0x1b422075f7d91b17bbfdff3c53d189dd0fbaaf4781652671e9565316b41ca290" + ] + } + ], + "chainId": "0xf85c705ab2" + }, + "privateKey": "0xf5c0dbb8231a075941ea87d5775f575911a32e6eda699d2f278b0c3ece418625", + "unsignedLegacy": "0xf88c8201e0852e61c0a7d182891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9b", + "unsignedEip155": "0xf8948201e0852e61c0a7d182891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9b85f85c705ab28080", + "unsignedBerlin": "0x01f9011085f85c705ab28201e0852e61c0a7d182891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9bf87cf87a94b93b1cfdd998346a406f9c5631eea082f8dde274f863a008af322c4e39cff34a1319599a15d75f12aef677e43bdaa89783ee4572178e3ba0f2a74ec9c790bad178bb9bd5ff86e47b56b27505902cc94b3d6329a1ed9f3e8fa01b422075f7d91b17bbfdff3c53d189dd0fbaaf4781652671e9565316b41ca290", + "unsignedLondon": "0x02f9011585f85c705ab28201e0820f13871f96cabb630b7782891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9bf87cf87a94b93b1cfdd998346a406f9c5631eea082f8dde274f863a008af322c4e39cff34a1319599a15d75f12aef677e43bdaa89783ee4572178e3ba0f2a74ec9c790bad178bb9bd5ff86e47b56b27505902cc94b3d6329a1ed9f3e8fa01b422075f7d91b17bbfdff3c53d189dd0fbaaf4781652671e9565316b41ca290", + "signedLegacy": "0xf8cf8201e0852e61c0a7d182891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9b1ca05bd78dffac38190ad4c94a753513319045baa4b7139b4ee8ac4b55a108b82b3fa007165c4da8ed4b7abc3ccd859de3278e1ed8b6a39c349f6aecd6140bdd09816b", + "signedEip155": "0xf8d58201e0852e61c0a7d182891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9b8601f0b8e0b588a06ad7dc232ebe61f13d1d5cc25a88f6192f6fc026c1a64ab231d93219a31d816da04636fc5a441d8a907fcecf9c8978cbd6b71be7f763f393bd0b9e6c19917e5d6f", + "signedBerlin": "0x01f9015385f85c705ab28201e0852e61c0a7d182891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9bf87cf87a94b93b1cfdd998346a406f9c5631eea082f8dde274f863a008af322c4e39cff34a1319599a15d75f12aef677e43bdaa89783ee4572178e3ba0f2a74ec9c790bad178bb9bd5ff86e47b56b27505902cc94b3d6329a1ed9f3e8fa01b422075f7d91b17bbfdff3c53d189dd0fbaaf4781652671e9565316b41ca29001a0a4c6719e28efb2fd8bd3ca8c6cfb23ad7e782891b7b1be42ca378bbe6ed11849a05cd95d3bc178e48d4d4396a4f3d869c44121afa8d9cb9bff5102b2e4edc5f0b5", + "signedLondon": "0x02f9015885f85c705ab28201e0820f13871f96cabb630b7782891f94abe72878a51e28abafcaa14ac99bdb97b2e4d17081fbb86708e7bc02435de0563f47dd2507bdf653e9f930b70fd49816c80affbe8119cc5d7bc6cbcece614100e8887f042681186daae9ff25ea16cc095cf7eb6555858bab20f76b1f4584d9da2b9b58c8a73a2c5c17f201f060a6b73e4eb5e30e6ca86dd6afa4215187aa9bf87cf87a94b93b1cfdd998346a406f9c5631eea082f8dde274f863a008af322c4e39cff34a1319599a15d75f12aef677e43bdaa89783ee4572178e3ba0f2a74ec9c790bad178bb9bd5ff86e47b56b27505902cc94b3d6329a1ed9f3e8fa01b422075f7d91b17bbfdff3c53d189dd0fbaaf4781652671e9565316b41ca29001a095324dc2342f0e88e7451b7fe59f135080efd92353fcde537cd7a529616cb5a1a06c1f881e580f87e6c83c31a3b5e97e75ec99ee1f1d42be80065eebedee276770", + "signatureLegacy": { + "r": "0x5bd78dffac38190ad4c94a753513319045baa4b7139b4ee8ac4b55a108b82b3f", + "s": "0x07165c4da8ed4b7abc3ccd859de3278e1ed8b6a39c349f6aecd6140bdd09816b", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x6ad7dc232ebe61f13d1d5cc25a88f6192f6fc026c1a64ab231d93219a31d816d", + "s": "0x4636fc5a441d8a907fcecf9c8978cbd6b71be7f763f393bd0b9e6c19917e5d6f", + "v": "0x1f0b8e0b588" + }, + "signatureBerlin": { + "r": "0xa4c6719e28efb2fd8bd3ca8c6cfb23ad7e782891b7b1be42ca378bbe6ed11849", + "s": "0x5cd95d3bc178e48d4d4396a4f3d869c44121afa8d9cb9bff5102b2e4edc5f0b5", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x95324dc2342f0e88e7451b7fe59f135080efd92353fcde537cd7a529616cb5a1", + "s": "0x6c1f881e580f87e6c83c31a3b5e97e75ec99ee1f1d42be80065eebedee276770", + "v": "0x1" + } + }, + { + "name": "random-109", + "transaction": { + "to": "0x6d5Ae1C06aFDAD46BBB50f3ad16E7747388dCa09", + "nonce": 385, + "gasLimit": "0x3c8b1604", + "gasPrice": "0x8ea240", + "maxFeePerGas": "0xd01e3d18", + "maxPriorityFeePerGas": "0x1f36", + "data": "0x9f281da66d85bcd6adab318a3463", + "value": "0xc4efe6de17", + "accessList": [ + { + "address": "0x40190a254747d0c0157B7510dcc9568AB212e0b7", + "storageKeys": [ + "0x73eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7", + "0xf03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8de", + "0x92425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4", + "0x6e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94" + ] + }, + { + "address": "0x515B29FEfF4Aba799B1a26b4Ef10884A7B44df8D", + "storageKeys": [ + "0x73eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7", + "0xf03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8de", + "0x92425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4", + "0x6e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94" + ] + } + ], + "chainId": "0x025b5f20f6" + }, + "privateKey": "0xa8ae3e3a26fd49effb2b9eb331163da92c413824164a25f6f94e6e101867847a", + "unsignedLegacy": "0xf6820181838ea240843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a3463", + "unsignedEip155": "0xf83e820181838ea240843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a346385025b5f20f68080", + "unsignedBerlin": "0x01f9017985025b5f20f6820181838ea240843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a3463f9013af89b9440190a254747d0c0157b7510dcc9568ab212e0b7f884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94f89b94515b29feff4aba799b1a26b4ef10884a7b44df8df884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94", + "unsignedLondon": "0x02f9017d85025b5f20f6820181821f3684d01e3d18843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a3463f9013af89b9440190a254747d0c0157b7510dcc9568ab212e0b7f884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94f89b94515b29feff4aba799b1a26b4ef10884a7b44df8df884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94", + "signedLegacy": "0xf879820181838ea240843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a34631ba08f09c14d14b2bd156f39caa81b84f90e6d464c8e993d73c4905842e6bc384d6aa075120539879a34856ce2adf2c78ac509a9b3e5ebcc2490c42f784a02d90208e6", + "signedEip155": "0xf87e820181838ea240843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a34638504b6be420fa07dc2e754d45cc22794ed5cc6ec25c291dd949928e5825ca5eea2fa22c724d6b4a0376df2f8eac448316d8e6d42cc7dc9db47385bbc4433a1295e30ee4db11c8496", + "signedBerlin": "0x01f901bc85025b5f20f6820181838ea240843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a3463f9013af89b9440190a254747d0c0157b7510dcc9568ab212e0b7f884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94f89b94515b29feff4aba799b1a26b4ef10884a7b44df8df884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a9401a09ba89ad913928dfaadfffa31d7b726567c3d56c682807b82b7793b961d0557dea011d64c4e1d1c4f1cbd83f1289392eb3891d383846f302848a06549dfb2635a57", + "signedLondon": "0x02f901c085025b5f20f6820181821f3684d01e3d18843c8b1604946d5ae1c06afdad46bbb50f3ad16e7747388dca0985c4efe6de178e9f281da66d85bcd6adab318a3463f9013af89b9440190a254747d0c0157b7510dcc9568ab212e0b7f884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a94f89b94515b29feff4aba799b1a26b4ef10884a7b44df8df884a073eb550e5587bcf8737d49f18648d069dbeb0a88bd48c4806a0bd22d07fe7ee7a0f03096ae61f1904e98da0af5b3624ecb8b9758006fd1e1f04431d5d9d1f3e8dea092425a724a4b5f5f34ff462f4a21c022a6bc92a39b51b11fe26a4b7c9b5c9dc4a06e4eed900408b0acdaade7ef2d2000f2180c3f42bd1151e0e29202e38a922a9480a0f4271827d0b9e72a6183e69d1a6606dc246a5827826c9c1e49fa31e0916c2dfba01ac600f935bd7affbca7859bf6064e0c1d1c1eabee740f3d12f2569406dd307b", + "signatureLegacy": { + "r": "0x8f09c14d14b2bd156f39caa81b84f90e6d464c8e993d73c4905842e6bc384d6a", + "s": "0x75120539879a34856ce2adf2c78ac509a9b3e5ebcc2490c42f784a02d90208e6", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x7dc2e754d45cc22794ed5cc6ec25c291dd949928e5825ca5eea2fa22c724d6b4", + "s": "0x376df2f8eac448316d8e6d42cc7dc9db47385bbc4433a1295e30ee4db11c8496", + "v": "0x4b6be420f" + }, + "signatureBerlin": { + "r": "0x9ba89ad913928dfaadfffa31d7b726567c3d56c682807b82b7793b961d0557de", + "s": "0x11d64c4e1d1c4f1cbd83f1289392eb3891d383846f302848a06549dfb2635a57", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xf4271827d0b9e72a6183e69d1a6606dc246a5827826c9c1e49fa31e0916c2dfb", + "s": "0x1ac600f935bd7affbca7859bf6064e0c1d1c1eabee740f3d12f2569406dd307b", + "v": "0x0" + } + }, + { + "name": "random-110", + "transaction": { + "to": "0xCDfF444EB48A465c6021e011BAfAd0310066ac09", + "nonce": 672, + "gasLimit": "0x90fbe11597", + "gasPrice": "0xd8", + "maxFeePerGas": "0x10ca0474270fb7", + "maxPriorityFeePerGas": "0x11db", + "data": "0xfb09882fbb87", + "value": "0x9df1f1bf", + "accessList": [ + { + "address": "0x7E414511c1f33E767Cf826b6E1028DE7aDFeD4FC", + "storageKeys": [] + }, + { + "address": "0xd0d08305D67aBbDD3B2fd4f51cbE3fc0fB19429C", + "storageKeys": [] + }, + { + "address": "0x078117171875de96a1F41B79C9aF58bEC8B31385", + "storageKeys": [] + }, + { + "address": "0xeCf4c6F1418A351adD6fabFeABfA2014583520E4", + "storageKeys": [] + } + ], + "chainId": "0x4ae9aa" + }, + "privateKey": "0xf2e395cc4c6efbe873a413fc1c6885bc0c48bf8084ef2521d68ee45bc1e23b79", + "unsignedLegacy": "0xec8202a081d88590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb87", + "unsignedEip155": "0xf28202a081d88590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb87834ae9aa8080", + "unsignedBerlin": "0x01f88e834ae9aa8202a081d88590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb87f85cd6947e414511c1f33e767cf826b6e1028de7adfed4fcc0d694d0d08305d67abbdd3b2fd4f51cbe3fc0fb19429cc0d694078117171875de96a1f41b79c9af58bec8b31385c0d694ecf4c6f1418a351add6fabfeabfa2014583520e4c0", + "unsignedLondon": "0x02f897834ae9aa8202a08211db8710ca0474270fb78590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb87f85cd6947e414511c1f33e767cf826b6e1028de7adfed4fcc0d694d0d08305d67abbdd3b2fd4f51cbe3fc0fb19429cc0d694078117171875de96a1f41b79c9af58bec8b31385c0d694ecf4c6f1418a351add6fabfeabfa2014583520e4c0", + "signedLegacy": "0xf86f8202a081d88590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb871ca01a89d79129d963896b865ea7ee6b5338110238bc5eebc4e8d7b1a11bca70ab20a0382f99832f3923451bde9dbae185d2a4e9fefb3ff13b95bf7c735050d3773183", + "signedEip155": "0xf8728202a081d88590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb878395d377a0ade912e32ad2fa54bbfc6adb4b54c7369973ce16309855cf37738b6cb4fd7a8fa04034ecad0678cd5fa747b093e147087fb83ed3b25875e1969625982e92987d3b", + "signedBerlin": "0x01f8d1834ae9aa8202a081d88590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb87f85cd6947e414511c1f33e767cf826b6e1028de7adfed4fcc0d694d0d08305d67abbdd3b2fd4f51cbe3fc0fb19429cc0d694078117171875de96a1f41b79c9af58bec8b31385c0d694ecf4c6f1418a351add6fabfeabfa2014583520e4c001a056f064c3b8971a0a05521c0bc38f27bd69a663e3ae361d97ba746bf9514ed309a03b037e153a07763be7579944ec8a57fe2f929e45dc30e037c0a7910861d6292a", + "signedLondon": "0x02f8da834ae9aa8202a08211db8710ca0474270fb78590fbe1159794cdff444eb48a465c6021e011bafad0310066ac09849df1f1bf86fb09882fbb87f85cd6947e414511c1f33e767cf826b6e1028de7adfed4fcc0d694d0d08305d67abbdd3b2fd4f51cbe3fc0fb19429cc0d694078117171875de96a1f41b79c9af58bec8b31385c0d694ecf4c6f1418a351add6fabfeabfa2014583520e4c080a0f95c0e8227a48177cc93b0994eeef18e16336cca7cddeb002a2f94d8e403296da0453c67524f3d9d590ee58c2400728be2b3545dcb8aba6bac22f29b5e09ca69f9", + "signatureLegacy": { + "r": "0x1a89d79129d963896b865ea7ee6b5338110238bc5eebc4e8d7b1a11bca70ab20", + "s": "0x382f99832f3923451bde9dbae185d2a4e9fefb3ff13b95bf7c735050d3773183", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xade912e32ad2fa54bbfc6adb4b54c7369973ce16309855cf37738b6cb4fd7a8f", + "s": "0x4034ecad0678cd5fa747b093e147087fb83ed3b25875e1969625982e92987d3b", + "v": "0x95d377" + }, + "signatureBerlin": { + "r": "0x56f064c3b8971a0a05521c0bc38f27bd69a663e3ae361d97ba746bf9514ed309", + "s": "0x3b037e153a07763be7579944ec8a57fe2f929e45dc30e037c0a7910861d6292a", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xf95c0e8227a48177cc93b0994eeef18e16336cca7cddeb002a2f94d8e403296d", + "s": "0x453c67524f3d9d590ee58c2400728be2b3545dcb8aba6bac22f29b5e09ca69f9", + "v": "0x0" + } + }, + { + "name": "random-111", + "transaction": { + "to": "0x617965D6808bd4BaD380e3eCa6A0fa4B22c6Ee1b", + "nonce": 313, + "gasLimit": "0x15e86701", + "gasPrice": "0x1986e1bf", + "maxFeePerGas": "0xeb80b568c33885", + "maxPriorityFeePerGas": "0x4ea622", + "data": "0xbb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b5", + "value": "0x46e692ed", + "accessList": [], + "chainId": "0x2270" + }, + "privateKey": "0x1d731f1ba2e5ab0e4473cd96733f3f5e8bcff66190bf82dc5523bbc814545653", + "unsignedLegacy": "0xf87f820139841986e1bf8415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b5", + "unsignedEip155": "0xf884820139841986e1bf8415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b58222708080", + "unsignedBerlin": "0x01f883822270820139841986e1bf8415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b5c0", + "unsignedLondon": "0x02f88a822270820139834ea62287eb80b568c338858415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b5c0", + "signedLegacy": "0xf8c2820139841986e1bf8415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b51ca0c10d9745a0574003565a9c3ac2a243d2ff6da1f6e65cca87e1e0c4aa99c3801fa074c49c340ebd9d112666bd9cfcdafc6798d54cb8ebd61950e8c4fac4da98aaa0", + "signedEip155": "0xf8c4820139841986e1bf8415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b5824504a08d1a8d5e65747ed17e48a1a3d1850d155a279e9755e95b9d299120c76817b0aaa02aa9aa307e29d16a5cc46b98cd5d2358fb69a42fc5ea6773aa880824065728f0", + "signedBerlin": "0x01f8c6822270820139841986e1bf8415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b5c080a08d8eb316e1ca885a59e2f28289e9feab46971623c8def85f5109d548dc31bf33a062a96371dbac956a1815e0a47cfb419299cb511ff00c28fb41e1c93d71a2a4fd", + "signedLondon": "0x02f8cd822270820139834ea62287eb80b568c338858415e8670194617965d6808bd4bad380e3eca6a0fa4b22c6ee1b8446e692edb856bb29f01730daa95263d2618d629a44c5515ba1dfbb1c93a2916243cea463500dc69416c18956e97ad1c50faf45548f6e34ad966ffc0febfb3a4ec1a1d5c66825db9593228d2feb78adc466a8ade52d62653acbd435b5c001a0af81d8ed6a9fed2c565226f8b81889e68b6893ad5aff775c6de6e4659a9ee9eba05a389ca446f99359f5683962de3b1943c5e21ea8a8785783c546cda28662fe3c", + "signatureLegacy": { + "r": "0xc10d9745a0574003565a9c3ac2a243d2ff6da1f6e65cca87e1e0c4aa99c3801f", + "s": "0x74c49c340ebd9d112666bd9cfcdafc6798d54cb8ebd61950e8c4fac4da98aaa0", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x8d1a8d5e65747ed17e48a1a3d1850d155a279e9755e95b9d299120c76817b0aa", + "s": "0x2aa9aa307e29d16a5cc46b98cd5d2358fb69a42fc5ea6773aa880824065728f0", + "v": "0x4504" + }, + "signatureBerlin": { + "r": "0x8d8eb316e1ca885a59e2f28289e9feab46971623c8def85f5109d548dc31bf33", + "s": "0x62a96371dbac956a1815e0a47cfb419299cb511ff00c28fb41e1c93d71a2a4fd", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xaf81d8ed6a9fed2c565226f8b81889e68b6893ad5aff775c6de6e4659a9ee9eb", + "s": "0x5a389ca446f99359f5683962de3b1943c5e21ea8a8785783c546cda28662fe3c", + "v": "0x1" + } + }, + { + "name": "random-112", + "transaction": { + "to": "0x1E5Bddb820F1AA68115E620695ec590344e54665", + "nonce": 131, + "gasLimit": "0x35856c60", + "gasPrice": "0xf53a", + "maxFeePerGas": "0xa9d43adae7", + "maxPriorityFeePerGas": "0x6faec3", + "data": "0x924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a7", + "value": "0x72", + "accessList": [], + "chainId": "0x44e6" + }, + "privateKey": "0xcb76ec53e290167ed1ab54e61a59de9271cf657d72cc1fed2256d52d003f3ca0", + "unsignedLegacy": "0xf848818382f53a8435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a7", + "unsignedEip155": "0xf84d818382f53a8435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a78244e68080", + "unsignedBerlin": "0x01f84c8244e6818382f53a8435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a7c0", + "unsignedLondon": "0x02f8538244e68183836faec385a9d43adae78435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a7c0", + "signedLegacy": "0xf88b818382f53a8435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a71ba0d92b69c6590bdb90c9f22260e09704a43cc07fb746b1c153849713acb9e1eefba05f27f206f893e7756358967776d59842a221e6834c04950c8dcecdbbf3a09b2a", + "signedEip155": "0xf88d818382f53a8435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a78289f0a0977ab968c6968dc287b2507b9d8955bd025c55286bdcccde43df597b59664a71a02ada928b86cd1eb47d0fda8298f940b221dad5dbe742509ee6c3a915614563d4", + "signedBerlin": "0x01f88f8244e6818382f53a8435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a7c001a0cc2ab0bf07eff522961806ed391510042fe5949b6c713ded5a37ea8edae9960ca0381aef446661c6906b8f53980782f58005633a93a3c1496e9d08ecd29d58de4e", + "signedLondon": "0x02f8968244e68183836faec385a9d43adae78435856c60941e5bddb820f1aa68115e620695ec590344e5466572a7924229a3675e1d0698a9ce0473dbe7dd4951c4e60764b4461d2585b2a34e2365edd8bb9ee728a7c080a0961f7ab7eddea5dce2765d3234e6e1949ea9e5a6f6a6e779174cf299dce90b24a030f128f0deb735b8ad29108ac10d8f949fe335331e6acb5eadb18af99bb18604", + "signatureLegacy": { + "r": "0xd92b69c6590bdb90c9f22260e09704a43cc07fb746b1c153849713acb9e1eefb", + "s": "0x5f27f206f893e7756358967776d59842a221e6834c04950c8dcecdbbf3a09b2a", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x977ab968c6968dc287b2507b9d8955bd025c55286bdcccde43df597b59664a71", + "s": "0x2ada928b86cd1eb47d0fda8298f940b221dad5dbe742509ee6c3a915614563d4", + "v": "0x89f0" + }, + "signatureBerlin": { + "r": "0xcc2ab0bf07eff522961806ed391510042fe5949b6c713ded5a37ea8edae9960c", + "s": "0x381aef446661c6906b8f53980782f58005633a93a3c1496e9d08ecd29d58de4e", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x961f7ab7eddea5dce2765d3234e6e1949ea9e5a6f6a6e779174cf299dce90b24", + "s": "0x30f128f0deb735b8ad29108ac10d8f949fe335331e6acb5eadb18af99bb18604", + "v": "0x0" + } + }, + { + "name": "random-114", + "transaction": { + "to": "0xC1803F91d08af3Fd5D7534F11c6f29476eF6c730", + "nonce": 179, + "gasLimit": "0x5cdb7e40", + "gasPrice": "0xb95bf6", + "maxFeePerGas": "0xd9b05ef7", + "maxPriorityFeePerGas": "0x3ed5", + "data": "0x97818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6", + "value": "0x9dd6d4", + "accessList": [ + { + "address": "0x9e3903c19B7D37766AE856D49D18d3d9012D313a", + "storageKeys": [ + "0x338f2e2f812a703007e9b0efd6b563e140f758ee6339392fbd707f0e31c2d906" + ] + } + ], + "chainId": "0x8c57520f" + }, + "privateKey": "0xbc9063b2aee3c3e5efc795069c358388b3f891b191fae431455542adeab9270b", + "unsignedLegacy": "0xf87981b383b95bf6845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6", + "unsignedEip155": "0xf88081b383b95bf6845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6848c57520f8080", + "unsignedBerlin": "0x01f8b8848c57520f81b383b95bf6845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6f838f7949e3903c19b7d37766ae856d49d18d3d9012d313ae1a0338f2e2f812a703007e9b0efd6b563e140f758ee6339392fbd707f0e31c2d906", + "unsignedLondon": "0x02f8bc848c57520f81b3823ed584d9b05ef7845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6f838f7949e3903c19b7d37766ae856d49d18d3d9012d313ae1a0338f2e2f812a703007e9b0efd6b563e140f758ee6339392fbd707f0e31c2d906", + "signedLegacy": "0xf8bc81b383b95bf6845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff61ba0e177a92fe10de3e8143d69bb8ae730d010550fc575aa7b329cdcfdd107249a20a04230aa305e077574c6cacbf0e932b981a2dae10e8cf7f401ccee7e494753cfc6", + "signedEip155": "0xf8c181b383b95bf6845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6850118aea441a02740e3845ff810ec1942e8740ad3bc5b76c7b2edca07e6ff0557f2cecba35248a00eb2d443bc4044cd5622b3cf9eb4a18765bd61a7c9ae103ddcf8809d1ce99bf3", + "signedBerlin": "0x01f8fb848c57520f81b383b95bf6845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6f838f7949e3903c19b7d37766ae856d49d18d3d9012d313ae1a0338f2e2f812a703007e9b0efd6b563e140f758ee6339392fbd707f0e31c2d90601a0c21cbe9c5455fa3769902385ff44ca373732e8e98afe29fe58d07c1c17209b9ba027d473eaeda692caab6ae881679a2373ae4959add9f277e4499813eab69022f7", + "signedLondon": "0x02f8ff848c57520f81b3823ed584d9b05ef7845cdb7e4094c1803f91d08af3fd5d7534f11c6f29476ef6c730839dd6d4b85397818978c3d09f7a600e4ced53dd66e28993d92f3726c54eebc889ee1feb5de9e6956f17916a70af94a9be8c9ad22c0603988dd674546ac7100da4c4c6705cd4378a7db1a85060f6c9c041ff3a3a8f591a9ff6f838f7949e3903c19b7d37766ae856d49d18d3d9012d313ae1a0338f2e2f812a703007e9b0efd6b563e140f758ee6339392fbd707f0e31c2d90601a0aef8bb02790762781228a43a1d1c22061f4dbc2ba9317983862bb5ed5c3e5895a020535564b27f2a5d868841dd29612bea4a9a0440c74bf8c5d6f243d03a724a7c", + "signatureLegacy": { + "r": "0xe177a92fe10de3e8143d69bb8ae730d010550fc575aa7b329cdcfdd107249a20", + "s": "0x4230aa305e077574c6cacbf0e932b981a2dae10e8cf7f401ccee7e494753cfc6", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x2740e3845ff810ec1942e8740ad3bc5b76c7b2edca07e6ff0557f2cecba35248", + "s": "0x0eb2d443bc4044cd5622b3cf9eb4a18765bd61a7c9ae103ddcf8809d1ce99bf3", + "v": "0x118aea441" + }, + "signatureBerlin": { + "r": "0xc21cbe9c5455fa3769902385ff44ca373732e8e98afe29fe58d07c1c17209b9b", + "s": "0x27d473eaeda692caab6ae881679a2373ae4959add9f277e4499813eab69022f7", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xaef8bb02790762781228a43a1d1c22061f4dbc2ba9317983862bb5ed5c3e5895", + "s": "0x20535564b27f2a5d868841dd29612bea4a9a0440c74bf8c5d6f243d03a724a7c", + "v": "0x1" + } + }, + { + "name": "random-115", + "transaction": { + "to": "0xF4E39EE71c0047c70e39802a5C647e1C3D19F6fe", + "nonce": 675, + "gasLimit": "0x2364a952", + "gasPrice": "0xa8", + "maxFeePerGas": "0x69bfa185da", + "maxPriorityFeePerGas": "0xe2", + "data": "0x48adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f460", + "value": "0x18eddef200", + "accessList": [], + "chainId": "0x63" + }, + "privateKey": "0xd8e1ba22c154c839e9791a23dd5b36e844d8ff6f162b51fe79f412ab64ecfc0a", + "unsignedLegacy": "0xf8998202a381a8842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f460", + "unsignedEip155": "0xf89c8202a381a8842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f460638080", + "unsignedBerlin": "0x01f89b638202a381a8842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f460c0", + "unsignedLondon": "0x02f8a1638202a381e28569bfa185da842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f460c0", + "signedLegacy": "0xf8dc8202a381a8842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f4601ca0104347b31a52cc0b53297d757196cae8ab9c602662addc967322a4288f10d420a04bd9503be935eadc21680dbb66fc6e9d84aa1785bac600e5d11d933f08516727", + "signedEip155": "0xf8dd8202a381a8842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f46081e9a0247e60cef6c2445669d41b084352473cc8f3617bb607b06695b4b0f2136c9deda0075e81db4b282653bdd77bbad646de48cccdc0cc492f24bf09a5f343113da854", + "signedBerlin": "0x01f8de638202a381a8842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f460c001a0cfc98bf050dd27f8f2af87320fe070a85981bf0530759e35b9abdf25a3000880a041583cd0ff4eff107b7db59e4e192e59754bac37f0f07e1953e353d05d52ffcd", + "signedLondon": "0x02f8e4638202a381e28569bfa185da842364a95294f4e39ee71c0047c70e39802a5c647e1c3d19f6fe8518eddef200b87248adb4d3c507f8862f6b97ee77de7ee8c35d8b2b56e00e3cc3f0b34b669b0ba3a259fd69df02d29c52eb0609c8ab7b2956e0568b048795948b8888a7657392ccb0c64e06177acf4ac74c2a81aadd3e52b8ecaf0dd2aaa85f7a4577b029ee10a7466b583609c8f267133eb9f2207ef689f460c080a09289601e554d30a01682558aa90fc08e2d1861d783d4552233ad4e0fc9a409e7a00ce11d39638f4c4052ae4b2204188bbfbccce3011c3b244bc993ad831ebea31e", + "signatureLegacy": { + "r": "0x104347b31a52cc0b53297d757196cae8ab9c602662addc967322a4288f10d420", + "s": "0x4bd9503be935eadc21680dbb66fc6e9d84aa1785bac600e5d11d933f08516727", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x247e60cef6c2445669d41b084352473cc8f3617bb607b06695b4b0f2136c9ded", + "s": "0x075e81db4b282653bdd77bbad646de48cccdc0cc492f24bf09a5f343113da854", + "v": "0xe9" + }, + "signatureBerlin": { + "r": "0xcfc98bf050dd27f8f2af87320fe070a85981bf0530759e35b9abdf25a3000880", + "s": "0x41583cd0ff4eff107b7db59e4e192e59754bac37f0f07e1953e353d05d52ffcd", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x9289601e554d30a01682558aa90fc08e2d1861d783d4552233ad4e0fc9a409e7", + "s": "0x0ce11d39638f4c4052ae4b2204188bbfbccce3011c3b244bc993ad831ebea31e", + "v": "0x0" + } + }, + { + "name": "random-116", + "transaction": { + "to": "0xc51adFA4d4ce845349870b816fFA1153a0D0D74A", + "nonce": 311, + "gasLimit": "0x3a536acba8", + "gasPrice": "0x78009463", + "maxFeePerGas": "0xa8185361b4", + "maxPriorityFeePerGas": "0x57", + "data": "0xc74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336f", + "value": "0xc17b", + "accessList": [ + { + "address": "0x7666B14Ff056f859623D70b9C3d3590Df445CD2a", + "storageKeys": [ + "0xd46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e" + ] + }, + { + "address": "0x809FF3fd39d14633Ed606Db74AA08d1dA2D00B53", + "storageKeys": [ + "0xd46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e" + ] + }, + { + "address": "0x5738481C5D2E74F9C0CB268De05d11dc06945110", + "storageKeys": [ + "0xd46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e" + ] + }, + { + "address": "0xDC2331d4D36e6625c582a213F159Fd3785E81A1a", + "storageKeys": [ + "0xd46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e" + ] + } + ], + "chainId": "0x34" + }, + "privateKey": "0x49b98fe567a1bb957458ac2ba8653556c06464d2e4d69be214b7b1e40a654367", + "unsignedLegacy": "0xf87b8201378478009463853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336f", + "unsignedEip155": "0xf87e8201378478009463853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336f348080", + "unsignedBerlin": "0x01f9015e348201378478009463853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336ff8e0f7947666b14ff056f859623d70b9c3d3590df445cd2ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794809ff3fd39d14633ed606db74aa08d1da2d00b53e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef7945738481c5d2e74f9c0cb268de05d11dc06945110e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794dc2331d4d36e6625c582a213f159fd3785e81a1ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e", + "unsignedLondon": "0x02f90160348201375785a8185361b4853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336ff8e0f7947666b14ff056f859623d70b9c3d3590df445cd2ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794809ff3fd39d14633ed606db74aa08d1da2d00b53e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef7945738481c5d2e74f9c0cb268de05d11dc06945110e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794dc2331d4d36e6625c582a213f159fd3785e81a1ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e", + "signedLegacy": "0xf8be8201378478009463853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336f1ba0556f4dfe1329504979be0816307e0ce78037211ea2e7bec5d6b8bc9f60a04afda06e37059fbe0d544dc1a2770b8996c6a55047cb9aaddb94cbe72b495faf906658", + "signedEip155": "0xf8bf8201378478009463853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336f818ba0c173a5d7f128ed52878958c11f8b74f9009dd0a5979a2cce34fc7fde936050d4a04400759b6c528ae80bc6f7555e3198549e580d49034cd276155b47bdfd9236ea", + "signedBerlin": "0x01f901a1348201378478009463853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336ff8e0f7947666b14ff056f859623d70b9c3d3590df445cd2ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794809ff3fd39d14633ed606db74aa08d1da2d00b53e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef7945738481c5d2e74f9c0cb268de05d11dc06945110e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794dc2331d4d36e6625c582a213f159fd3785e81a1ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e80a080351a108556bd4808150fc3bfb79033a54f9ea8a3265b1ebfa39d06126bf7daa064d5c9c646d7ec44762af857a39b85068cca3a833b786edadb72b832681056c8", + "signedLondon": "0x02f901a3348201375785a8185361b4853a536acba894c51adfa4d4ce845349870b816ffa1153a0d0d74a82c17bb853c74d0bc23c99281b20fa1f21efc8f9e70260cd78fdf6de1f91e96fff152dfb1e0f099d339a469d3e5c59a720f8b9b8fb68312bf1153291d7e60f50493d9bef0386f2e52efa990e8ef60f067395b548a323336ff8e0f7947666b14ff056f859623d70b9c3d3590df445cd2ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794809ff3fd39d14633ed606db74aa08d1da2d00b53e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef7945738481c5d2e74f9c0cb268de05d11dc06945110e1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562ef794dc2331d4d36e6625c582a213f159fd3785e81a1ae1a0d46d42eefa6aa7583582ad890407c9a7db193b4a23423edabd2ca74f7bff562e01a04d082af3ac7c0a7e99a6064a568f81bfb96b0f595d101ed7d569cd81959952e3a0583b5e75f7d4d4d7609bb8ed349918275a0ddd6dc4a5f49c453316db57183dff", + "signatureLegacy": { + "r": "0x556f4dfe1329504979be0816307e0ce78037211ea2e7bec5d6b8bc9f60a04afd", + "s": "0x6e37059fbe0d544dc1a2770b8996c6a55047cb9aaddb94cbe72b495faf906658", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0xc173a5d7f128ed52878958c11f8b74f9009dd0a5979a2cce34fc7fde936050d4", + "s": "0x4400759b6c528ae80bc6f7555e3198549e580d49034cd276155b47bdfd9236ea", + "v": "0x8b" + }, + "signatureBerlin": { + "r": "0x80351a108556bd4808150fc3bfb79033a54f9ea8a3265b1ebfa39d06126bf7da", + "s": "0x64d5c9c646d7ec44762af857a39b85068cca3a833b786edadb72b832681056c8", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x4d082af3ac7c0a7e99a6064a568f81bfb96b0f595d101ed7d569cd81959952e3", + "s": "0x583b5e75f7d4d4d7609bb8ed349918275a0ddd6dc4a5f49c453316db57183dff", + "v": "0x1" + } + }, + { + "name": "random-118", + "transaction": { + "to": "0x281B936F3d59e957c3EA922E37a95c73332e5b96", + "nonce": 600, + "gasLimit": "0xf1794e37ae", + "gasPrice": "0xd5d4d7", + "maxFeePerGas": "0x2d25e687116261", + "maxPriorityFeePerGas": "0x94", + "data": "0x9a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4a", + "value": "0x8b", + "accessList": [ + { + "address": "0x760D8945682bf8c342ede429A9f25ab89C72e13a", + "storageKeys": [ + "0x6d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582", + "0x7968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471d", + "0x804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8" + ] + }, + { + "address": "0x75f5D5E7fA1F1c543E039f87ea335A7Ae83aaFD9", + "storageKeys": [ + "0x6d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582", + "0x7968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471d", + "0x804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8" + ] + } + ], + "chainId": "0xee7de188d8" + }, + "privateKey": "0x4d69955b756fa187410677f35e34d7d2d4a67323f45587a17a7513f55b61db9e", + "unsignedLegacy": "0xf85a82025883d5d4d785f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4a", + "unsignedEip155": "0xf86282025883d5d4d785f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4a85ee7de188d88080", + "unsignedBerlin": "0x01f9015a85ee7de188d882025883d5d4d785f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4af8f8f87a94760d8945682bf8c342ede429a9f25ab89c72e13af863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8f87a9475f5d5e7fa1f1c543e039f87ea335a7ae83aafd9f863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8", + "unsignedLondon": "0x02f9016085ee7de188d88202588194872d25e68711626185f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4af8f8f87a94760d8945682bf8c342ede429a9f25ab89c72e13af863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8f87a9475f5d5e7fa1f1c543e039f87ea335a7ae83aafd9f863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8", + "signedLegacy": "0xf89d82025883d5d4d785f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4a1ca05c53b4d7768e1081257a8649817aa051dc9e6bffb6b3ce5dd4b69688d8191327a07df454a32fe81781abaa138687f55875452ccc6bfea40223d616f1237aa983d0", + "signedEip155": "0xf8a382025883d5d4d785f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4a8601dcfbc311d3a077d65126f0f4702e1597cf0a3890e84c477938ea671bdfe927b8a1a341d13fd0a038933aef9e60c6fef28974d284408e91ac7067a7a1c6a64860386c41789f3ef6", + "signedBerlin": "0x01f9019d85ee7de188d882025883d5d4d785f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4af8f8f87a94760d8945682bf8c342ede429a9f25ab89c72e13af863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8f87a9475f5d5e7fa1f1c543e039f87ea335a7ae83aafd9f863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f801a012b4eb1aa0e8fdd3c8a4fc76ea9d100f5300059ac8762cfbe6d9edd1c8c27d31a0783a1340ab3cc912580c6943ca0d5cecfe067c82fdc1039a3f62909f2482d0a3", + "signedLondon": "0x02f901a385ee7de188d88202588194872d25e68711626185f1794e37ae94281b936f3d59e957c3ea922e37a95c73332e5b96818bb59a6566a30dbb14b9f76ff2a6d52305e89ce2db8a9c5a77d60eb617011031524bfc87882be44dd563b44d178e4c3674622d05ed7c4af8f8f87a94760d8945682bf8c342ede429a9f25ab89c72e13af863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f8f87a9475f5d5e7fa1f1c543e039f87ea335a7ae83aafd9f863a06d9b97b43e7aed946139aecc1c7b84a373fdaee6c1e13ff563a28fb7c2765582a07968665c76c6c5bede5966f35feb84c225c636d193fd8a5426ca88b11ec1471da0804c9ac01ecbbcdc2dd2c953ebf57914f28183814a2b941a5d15857199d889f801a02c02440b2e29e05b3a4d3f26890ad0a39a04051ca34e291ea8078699bebe3097a01b8e1f69a1c503c6722dd04df35e3fd2d63215b1a043a31efd2f22010b4d452b", + "signatureLegacy": { + "r": "0x5c53b4d7768e1081257a8649817aa051dc9e6bffb6b3ce5dd4b69688d8191327", + "s": "0x7df454a32fe81781abaa138687f55875452ccc6bfea40223d616f1237aa983d0", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x77d65126f0f4702e1597cf0a3890e84c477938ea671bdfe927b8a1a341d13fd0", + "s": "0x38933aef9e60c6fef28974d284408e91ac7067a7a1c6a64860386c41789f3ef6", + "v": "0x1dcfbc311d3" + }, + "signatureBerlin": { + "r": "0x12b4eb1aa0e8fdd3c8a4fc76ea9d100f5300059ac8762cfbe6d9edd1c8c27d31", + "s": "0x783a1340ab3cc912580c6943ca0d5cecfe067c82fdc1039a3f62909f2482d0a3", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x2c02440b2e29e05b3a4d3f26890ad0a39a04051ca34e291ea8078699bebe3097", + "s": "0x1b8e1f69a1c503c6722dd04df35e3fd2d63215b1a043a31efd2f22010b4d452b", + "v": "0x1" + } + }, + { + "name": "random-119", + "transaction": { + "to": "0x8B84e80340de4a3955151ff288F23D13c832B4C0", + "nonce": 227, + "gasLimit": "0xd55f", + "gasPrice": "0x7a4f4acd51", + "maxFeePerGas": "0x3cd477caa236a9", + "maxPriorityFeePerGas": "0x76ecec", + "data": "0xd16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d165553862", + "value": "0xe4b74643f6", + "accessList": [ + { + "address": "0xa9dD79F179cB4b7F2daED039bA84cb965d2cd1F0", + "storageKeys": [ + "0x97da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bd", + "0xca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265f", + "0x47cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51", + "0x16c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2a" + ] + }, + { + "address": "0x2dFC27050a7a53F0CB9Cf2ca5d6A1DA625365190", + "storageKeys": [ + "0x97da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bd", + "0xca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265f", + "0x47cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51", + "0x16c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2a" + ] + } + ], + "chainId": "0x3522" + }, + "privateKey": "0x1cbe3ca8e7e64bdec3ba659e7e6f07c4c61e087123d5b3662f747d1a110b7696", + "unsignedLegacy": "0xf89081e3857a4f4acd5182d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d165553862", + "unsignedEip155": "0xf89581e3857a4f4acd5182d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d1655538628235228080", + "unsignedBerlin": "0x01f901d082352281e3857a4f4acd5182d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d165553862f9013af89b94a9dd79f179cb4b7f2daed039ba84cb965d2cd1f0f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2af89b942dfc27050a7a53f0cb9cf2ca5d6a1da625365190f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2a", + "unsignedLondon": "0x02f901d682352281e38376ecec873cd477caa236a982d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d165553862f9013af89b94a9dd79f179cb4b7f2daed039ba84cb965d2cd1f0f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2af89b942dfc27050a7a53f0cb9cf2ca5d6a1da625365190f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2a", + "signedLegacy": "0xf8d381e3857a4f4acd5182d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d1655538621ba093c8ab075f172ad33c29b3451907bc225cfd8a86c2c5097db1a8ff8436773725a041c2efc764fc902a8af50ad84dd1e34ca89247ee8e51a613ee03877b440fb719", + "signedEip155": "0xf8d581e3857a4f4acd5182d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d165553862826a67a06a6b3bec6ccbe24b2730a3ff687705184f12028a3c1fb97db52d8bc9aecfeea6a07d9bb6a11f3e0bef63940117b4eec7d5a9641ffaf3cec283e5a8e8af718e2cc4", + "signedBerlin": "0x01f9021382352281e3857a4f4acd5182d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d165553862f9013af89b94a9dd79f179cb4b7f2daed039ba84cb965d2cd1f0f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2af89b942dfc27050a7a53f0cb9cf2ca5d6a1da625365190f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2a80a08135947897cbbfc3f69d40280aa1aa6d763ce073fb0de83f8cd68b2fb2bdb410a0658008ab7e27450a69fb3f1f37d039984928c646b7f73883b12e6ed14d21d9b8", + "signedLondon": "0x02f9021982352281e38376ecec873cd477caa236a982d55f948b84e80340de4a3955151ff288f23d13c832b4c085e4b74643f6b868d16f9f341d021261f40223ff282a0e93bf458349bfcbc04646cde253a49b54cd5fe52714a6650a81a6f43fa496ac347d82af861d69a38fd5dccab51efc5b97fead04975f7b713df368055b8968a61e40a10d0cace1d1da4217c2ef4b590fc3b80b4405d165553862f9013af89b94a9dd79f179cb4b7f2daed039ba84cb965d2cd1f0f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2af89b942dfc27050a7a53f0cb9cf2ca5d6a1da625365190f884a097da5aa3419b1d5830e2bc5ddfa29e585ffec28eba8cdd8454e8a263553157bda0ca7dde1812980486a5d9f4369c0217f370dcbd5580c2d5e29455d1f4579a265fa047cd3ea4395937253b8823cc9ad5de0fac3e26e0107dc1f9bf3b07aac69b3f51a016c419acdb50d30c2a770bfac0073fa44180f192acaf8a54c6aff76d860fec2a80a04d2e2795cb72a49d1c72de9da28f3c0e1ea4449df0c1fa1dceb31d4017e6a160a068edeb9541beca90b858f51b5c35e113a2a75051d6f94d5ee5cf7cc7f4a58a2c", + "signatureLegacy": { + "r": "0x93c8ab075f172ad33c29b3451907bc225cfd8a86c2c5097db1a8ff8436773725", + "s": "0x41c2efc764fc902a8af50ad84dd1e34ca89247ee8e51a613ee03877b440fb719", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x6a6b3bec6ccbe24b2730a3ff687705184f12028a3c1fb97db52d8bc9aecfeea6", + "s": "0x7d9bb6a11f3e0bef63940117b4eec7d5a9641ffaf3cec283e5a8e8af718e2cc4", + "v": "0x6a67" + }, + "signatureBerlin": { + "r": "0x8135947897cbbfc3f69d40280aa1aa6d763ce073fb0de83f8cd68b2fb2bdb410", + "s": "0x658008ab7e27450a69fb3f1f37d039984928c646b7f73883b12e6ed14d21d9b8", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x4d2e2795cb72a49d1c72de9da28f3c0e1ea4449df0c1fa1dceb31d4017e6a160", + "s": "0x68edeb9541beca90b858f51b5c35e113a2a75051d6f94d5ee5cf7cc7f4a58a2c", + "v": "0x0" + } + }, + { + "name": "random-121", + "transaction": { + "to": "0x6c4C6E45F345188ccC31DD88902F3011A8b6B70C", + "nonce": 4, + "gasLimit": "0xd283b1aa91", + "gasPrice": "0x9d114e0e31", + "maxFeePerGas": "0x29df1081", + "maxPriorityFeePerGas": "0x62ca", + "data": "0x19081f72421ff9499adc13", + "value": "0xf1", + "accessList": [ + { + "address": "0x9555dd9b86149C029e09EbAEea77b2fC0E747660", + "storageKeys": [ + "0x76a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8", + "0x34cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb" + ] + }, + { + "address": "0x6A53d3c2edEF29BAc6083b24B52606AdfdBb87a1", + "storageKeys": [ + "0x76a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8", + "0x34cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb" + ] + }, + { + "address": "0x0A3EF36c5c01aaCe09Be3eF3E664a5e961F9147E", + "storageKeys": [ + "0x76a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8", + "0x34cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb" + ] + }, + { + "address": "0xeA37493E3834073CC4f030a17D9e0b752994b21D", + "storageKeys": [ + "0x76a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8", + "0x34cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb" + ] + } + ], + "chainId": "0x1b120e3c" + }, + "privateKey": "0x388452e27ffab2112fc5b44925f7690e2d76f7285fa15ee95e0a3474436add3d", + "unsignedLegacy": "0xf004859d114e0e3185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc13", + "unsignedEip155": "0xf704859d114e0e3185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc13841b120e3c8080", + "unsignedBerlin": "0x01f901a4841b120e3c04859d114e0e3185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc13f9016cf859949555dd9b86149c029e09ebaeea77b2fc0e747660f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859946a53d3c2edef29bac6083b24b52606adfdbb87a1f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859940a3ef36c5c01aace09be3ef3e664a5e961f9147ef842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf85994ea37493e3834073cc4f030a17d9e0b752994b21df842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb", + "unsignedLondon": "0x02f901a6841b120e3c048262ca8429df108185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc13f9016cf859949555dd9b86149c029e09ebaeea77b2fc0e747660f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859946a53d3c2edef29bac6083b24b52606adfdbb87a1f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859940a3ef36c5c01aace09be3ef3e664a5e961f9147ef842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf85994ea37493e3834073cc4f030a17d9e0b752994b21df842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb", + "signedLegacy": "0xf87304859d114e0e3185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc131ba00a97672f57ce59c1fe21f0c5c8df731533cb920fbc5248da879f3778e298a159a015e7e2961417886b1949be9fab6740ca7cf5a018e21036861aab2045ddea237d", + "signedEip155": "0xf87704859d114e0e3185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc138436241c9ca06024bd23106f98ea90b6a496cd733d77a9d67cd06810bf97e5c8cfed4087f5fea02746d913bf78257216d991fe4fd0375954e3e6edc28210dff563858b0e8fda10", + "signedBerlin": "0x01f901e7841b120e3c04859d114e0e3185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc13f9016cf859949555dd9b86149c029e09ebaeea77b2fc0e747660f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859946a53d3c2edef29bac6083b24b52606adfdbb87a1f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859940a3ef36c5c01aace09be3ef3e664a5e961f9147ef842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf85994ea37493e3834073cc4f030a17d9e0b752994b21df842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb80a0b7e30c3d6779a2f98f152621e45c101ea93d1613effa22572e85076e39d877fba007c2ecc8546cf64acbd68ec5e1cb7924720973e406a913f7b292b603e01075b8", + "signedLondon": "0x02f901e9841b120e3c048262ca8429df108185d283b1aa91946c4c6e45f345188ccc31dd88902f3011a8b6b70c81f18b19081f72421ff9499adc13f9016cf859949555dd9b86149c029e09ebaeea77b2fc0e747660f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859946a53d3c2edef29bac6083b24b52606adfdbb87a1f842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf859940a3ef36c5c01aace09be3ef3e664a5e961f9147ef842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfcebf85994ea37493e3834073cc4f030a17d9e0b752994b21df842a076a6cfa747fd225ff39be058e74a7ded9af856100b560c7134a71db1072188c8a034cce4732a6cd97a50f061077c007ac06af2c53d2397db1655418f361a5bfceb01a0f64ad9c5cd94cceafea949f1cd4e9d034a5c83dc649019cb04c96c3783a0ee2da035283288111df0300afe61a915d9dc5af533bad8d7211ef606af1f11b7372245", + "signatureLegacy": { + "r": "0x0a97672f57ce59c1fe21f0c5c8df731533cb920fbc5248da879f3778e298a159", + "s": "0x15e7e2961417886b1949be9fab6740ca7cf5a018e21036861aab2045ddea237d", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x6024bd23106f98ea90b6a496cd733d77a9d67cd06810bf97e5c8cfed4087f5fe", + "s": "0x2746d913bf78257216d991fe4fd0375954e3e6edc28210dff563858b0e8fda10", + "v": "0x36241c9c" + }, + "signatureBerlin": { + "r": "0xb7e30c3d6779a2f98f152621e45c101ea93d1613effa22572e85076e39d877fb", + "s": "0x07c2ecc8546cf64acbd68ec5e1cb7924720973e406a913f7b292b603e01075b8", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xf64ad9c5cd94cceafea949f1cd4e9d034a5c83dc649019cb04c96c3783a0ee2d", + "s": "0x35283288111df0300afe61a915d9dc5af533bad8d7211ef606af1f11b7372245", + "v": "0x1" + } + }, + { + "name": "random-122", + "transaction": { + "to": "0xA73a0e91A0D9399Ef30b3B187e39aB2A28CBC5A2", + "nonce": 416, + "gasLimit": "0x8114", + "gasPrice": "0xb595ab12", + "maxFeePerGas": "0xc2522180dd0a", + "maxPriorityFeePerGas": "0x294a", + "data": "0xce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a83225282", + "value": "0xe469cc73", + "accessList": [], + "chainId": "0x43bfc93eb5" + }, + "privateKey": "0x6613b0f304cc1e668b1a97d3dd8afe04195e4cf65f6642bb9abf0e30d05438b3", + "unsignedLegacy": "0xf89c8201a084b595ab1282811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a83225282", + "unsignedEip155": "0xf8a48201a084b595ab1282811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a832252828543bfc93eb58080", + "unsignedBerlin": "0x01f8a38543bfc93eb58201a084b595ab1282811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a83225282c0", + "unsignedLondon": "0x02f8a88543bfc93eb58201a082294a86c2522180dd0a82811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a83225282c0", + "signedLegacy": "0xf8df8201a084b595ab1282811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a832252821ba0b7716067f0a3e600e71023acdac68130f1db127836bf3f7e8368a8e82fab0564a0661f26907aea9407a87a6d748d0fd38b349a336c947c6e6a856b67edfd135a1c", + "signedEip155": "0xf8e48201a084b595ab1282811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a8322528285877f927d8da0168b2aab3dcc2b7d438c97bb5abf0f8626d13482ba1cdc780d7b7db35fc550aaa07a58703d81ecccabde7cbaa3de3712ab628469373cfc963413377823f1edbcf3", + "signedBerlin": "0x01f8e68543bfc93eb58201a084b595ab1282811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a83225282c080a0540452ba0cbd3e7f719b579f29130999cdaf1ec530683495e6398f4cae63eddaa06ecf2829d59c28a8cb07e24d443df71b4a107c8755e7bf1ee974c40253a7b188", + "signedLondon": "0x02f8eb8543bfc93eb58201a082294a86c2522180dd0a82811494a73a0e91a0d9399ef30b3b187e39ab2a28cbc5a284e469cc73b875ce61bdd15d94e3dbeeaf31a57ef94d630c822d1a1862476a1574c7b193a0aaece9ecd08954282c4d7bf9cf7d0baa3810b1e11d6c8ee7bb2aa4ef0d0357ec65bd1f6f9da441899141fe039f3775f8894afbd83ea79002323ff33fd25955dd2d40ea1bab508e46506c510454d615a35cfe5a83225282c001a01050becd594b58dfa9b86ac8c2f65b62500efee9dbc2207fb15923f7098e3638a04e8df8d21823712ada89d6389904b2f646a9176394be95ae808432c3e0d7bcc4", + "signatureLegacy": { + "r": "0xb7716067f0a3e600e71023acdac68130f1db127836bf3f7e8368a8e82fab0564", + "s": "0x661f26907aea9407a87a6d748d0fd38b349a336c947c6e6a856b67edfd135a1c", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x168b2aab3dcc2b7d438c97bb5abf0f8626d13482ba1cdc780d7b7db35fc550aa", + "s": "0x7a58703d81ecccabde7cbaa3de3712ab628469373cfc963413377823f1edbcf3", + "v": "0x877f927d8d" + }, + "signatureBerlin": { + "r": "0x540452ba0cbd3e7f719b579f29130999cdaf1ec530683495e6398f4cae63edda", + "s": "0x6ecf2829d59c28a8cb07e24d443df71b4a107c8755e7bf1ee974c40253a7b188", + "v": "0x0" + }, + "signatureLondon": { + "r": "0x1050becd594b58dfa9b86ac8c2f65b62500efee9dbc2207fb15923f7098e3638", + "s": "0x4e8df8d21823712ada89d6389904b2f646a9176394be95ae808432c3e0d7bcc4", + "v": "0x1" + } + }, + { + "name": "random-123", + "transaction": { + "to": "0x9A1dE66d73edd6bf4dA00706FC62009eA2887a82", + "nonce": 630, + "gasLimit": "0x0be3df34", + "gasPrice": "0xd0efc1", + "maxFeePerGas": "0xd65073437d2d5c", + "maxPriorityFeePerGas": "0x97", + "data": "0x5e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b7", + "value": "0x036154a5", + "accessList": [ + { + "address": "0x12e2Eb6DCb47C31ae6C2B0af06eE8eeDcd60BC19", + "storageKeys": [ + "0x0d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25f", + "0x6f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcd", + "0xed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f" + ] + }, + { + "address": "0x7F1D0e802b100708c45e0b5563c863454788C896", + "storageKeys": [ + "0x0d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25f", + "0x6f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcd", + "0xed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f" + ] + }, + { + "address": "0x53EFc66D1A86FA1eCA0b0076e7f00ab97135029C", + "storageKeys": [ + "0x0d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25f", + "0x6f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcd", + "0xed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f" + ] + }, + { + "address": "0x212Fa5665990D424e21a1E6201FdD22cdE697B5d", + "storageKeys": [ + "0x0d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25f", + "0x6f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcd", + "0xed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f" + ] + } + ], + "chainId": "0xb4e2" + }, + "privateKey": "0x6e271ce4d1f004a769a4d83c51ef78ae86c9f45497820157afe0d9e55cad9e4b", + "unsignedLegacy": "0xf85082027683d0efc1840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b7", + "unsignedEip155": "0xf85582027683d0efc1840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b782b4e28080", + "unsignedBerlin": "0x01f9024682b4e282027683d0efc1840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b7f901f0f87a9412e2eb6dcb47c31ae6c2b0af06ee8eedcd60bc19f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a947f1d0e802b100708c45e0b5563c863454788c896f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a9453efc66d1a86fa1eca0b0076e7f00ab97135029cf863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a94212fa5665990d424e21a1e6201fdd22cde697b5df863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f", + "unsignedLondon": "0x02f9024c82b4e2820276819787d65073437d2d5c840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b7f901f0f87a9412e2eb6dcb47c31ae6c2b0af06ee8eedcd60bc19f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a947f1d0e802b100708c45e0b5563c863454788c896f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a9453efc66d1a86fa1eca0b0076e7f00ab97135029cf863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a94212fa5665990d424e21a1e6201fdd22cde697b5df863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f", + "signedLegacy": "0xf89382027683d0efc1840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b71ba0b4bc51d01f0f495391225d9819a394904c6f5ea81f391d211fc32b8f0ba2607ca006e0e1df2ed72eec2870c338e0bcabdec7201cc90d726141f79cbcca9abdeb18", + "signedEip155": "0xf89682027683d0efc1840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b7830169e8a06c634b55b2fc9ee07a462bb2a4006f1a7e832cf04bedee1effa0f580f110c423a0089de3b3d46ae8f9817d4e4a6533c71c8789a05e509eb86b9c2ded9f1e5331bd", + "signedBerlin": "0x01f9028982b4e282027683d0efc1840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b7f901f0f87a9412e2eb6dcb47c31ae6c2b0af06ee8eedcd60bc19f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a947f1d0e802b100708c45e0b5563c863454788c896f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a9453efc66d1a86fa1eca0b0076e7f00ab97135029cf863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a94212fa5665990d424e21a1e6201fdd22cde697b5df863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f80a0b92f283cbac1231bb38d388d1d6f810ff4531f83033ccb84369cfc8fce346872a003009bd70c6bb785c50ef188030dc51022f498e16d89719fd40932c839bc89fb", + "signedLondon": "0x02f9028f82b4e2820276819787d65073437d2d5c840be3df34949a1de66d73edd6bf4da00706fc62009ea2887a8284036154a5a95e26e59532786c3814729085ed0348339a071794d0df2a304e1f3dceb09423af33ac1c441b0130e5b7f901f0f87a9412e2eb6dcb47c31ae6c2b0af06ee8eedcd60bc19f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a947f1d0e802b100708c45e0b5563c863454788c896f863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a9453efc66d1a86fa1eca0b0076e7f00ab97135029cf863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044ff87a94212fa5665990d424e21a1e6201fdd22cde697b5df863a00d28f683a8b540bae49488db6a5facbb94daca4bf5a6b585a6641ade2a60b25fa06f5a8e8104b542b54214764e66af6fb9e64197fbfffeb79e710b1786fad0adcda0ed2ac950e5121d17089bc449b8a20c541511a7fdd92d31a6e6f028fccd96044f80a0ae0bc6207b9d6bd37b7326d2934068785d86c7e5d746f0aa579ea57c0832a4b6a06bcce61e969c6bf7c7ac78404758a8d2342be08e83689ef91161a2dcd2ef949b", + "signatureLegacy": { + "r": "0xb4bc51d01f0f495391225d9819a394904c6f5ea81f391d211fc32b8f0ba2607c", + "s": "0x06e0e1df2ed72eec2870c338e0bcabdec7201cc90d726141f79cbcca9abdeb18", + "v": "0x1b" + }, + "signatureEip155": { + "r": "0x6c634b55b2fc9ee07a462bb2a4006f1a7e832cf04bedee1effa0f580f110c423", + "s": "0x089de3b3d46ae8f9817d4e4a6533c71c8789a05e509eb86b9c2ded9f1e5331bd", + "v": "0x169e8" + }, + "signatureBerlin": { + "r": "0xb92f283cbac1231bb38d388d1d6f810ff4531f83033ccb84369cfc8fce346872", + "s": "0x03009bd70c6bb785c50ef188030dc51022f498e16d89719fd40932c839bc89fb", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xae0bc6207b9d6bd37b7326d2934068785d86c7e5d746f0aa579ea57c0832a4b6", + "s": "0x6bcce61e969c6bf7c7ac78404758a8d2342be08e83689ef91161a2dcd2ef949b", + "v": "0x0" + } + }, + { + "name": "random-126", + "transaction": { + "to": "0x6D1474B69F191290ee87b7241509865DBfD65028", + "nonce": 999, + "gasLimit": "0x41f3afcb82", + "gasPrice": "0x85197d7a", + "maxFeePerGas": "0x5d34697dc6", + "maxPriorityFeePerGas": "0x34", + "data": "0x4f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d212", + "value": "0x25", + "accessList": [ + { + "address": "0x97103eAD47f549Ccc2c01a98071ADaF61dF7b54f", + "storageKeys": [ + "0x20dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478", + "0xc7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0", + "0x9169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eb", + "0x465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3" + ] + }, + { + "address": "0x6d483D9c7072203369522074C55383C4Bceb24d3", + "storageKeys": [ + "0x20dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478", + "0xc7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0", + "0x9169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eb", + "0x465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3" + ] + } + ], + "chainId": "0xaa1850a210" + }, + "privateKey": "0xcffb9d8944699452a2d881117e693d6cac9f032d82af63c2d077790354598cd1", + "unsignedLegacy": "0xf8868203e78485197d7a8541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d212", + "unsignedEip155": "0xf88e8203e78485197d7a8541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d21285aa1850a2108080", + "unsignedBerlin": "0x01f901c985aa1850a2108203e78485197d7a8541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d212f9013af89b9497103ead47f549ccc2c01a98071adaf61df7b54ff884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3f89b946d483d9c7072203369522074c55383c4bceb24d3f884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3", + "unsignedLondon": "0x02f901cb85aa1850a2108203e734855d34697dc68541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d212f9013af89b9497103ead47f549ccc2c01a98071adaf61df7b54ff884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3f89b946d483d9c7072203369522074c55383c4bceb24d3f884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3", + "signedLegacy": "0xf8c98203e78485197d7a8541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d2121ca08ba9001595c682949942e757cc026826be0f10ff6c0b802e141bb35eeae891d7a04a74007fc09b47fed88aa9bc88111f9f7ec100318f27e1c83544cc8fa58a31ee", + "signedEip155": "0xf8cf8203e78485197d7a8541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d21286015430a14444a0f00638a8fdd7eb539b862f5b0aaf81b3a2d33cfeaca9d9727c5f136bc7a4be73a02487488b619da3a5bd226799bd95fd1e1ca6a8c8bf6cc847b7d438b709cf1b09", + "signedBerlin": "0x01f9020c85aa1850a2108203e78485197d7a8541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d212f9013af89b9497103ead47f549ccc2c01a98071adaf61df7b54ff884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3f89b946d483d9c7072203369522074c55383c4bceb24d3f884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa301a04aa90159f536810755a6b5ea45206ef5572a56db2a24308f77210aee9f165a26a030a27cc3c1f6545f6f9ce17b7c6cbf6e83fc7c5d8fda6a1347ddb0880eaae96f", + "signedLondon": "0x02f9020e85aa1850a2108203e734855d34697dc68541f3afcb82946d1474b69f191290ee87b7241509865dbfd6502825b8604f55080dff2cc699a2164ffc9e3edf4f07428067ded4ae40def88766ca89789a1e2d4e76bd1a8718ed8c07c78c649a200a6e7ab03835190d678acb114e50bf51cbcc2ad094b65efb21bb7d91a1278db416eae0cd9c72829ae8c0d295f773d212f9013af89b9497103ead47f549ccc2c01a98071adaf61df7b54ff884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa3f89b946d483d9c7072203369522074c55383c4bceb24d3f884a020dadcf9996b63587cb52c1c1c757ca7e8e302bb125a1f76f3a6d46e00d2c478a0c7277aca05b03c06ae3649e4c75b94c2c532f0f1889c0ee7d477f6df2fe3cbc0a09169bb6fe55edef1607e89a2b0720fd2df5ca5d6be75c10f11c8ce8e423057eba0465576542851c8ae163f44bef21226c1d07969f1d690e29347f7998d71b4caa301a0287c641c904907b3349cd174e6f821e3fd57e3eb5a95ddb88e0f77ca5c917248a0627b16cd06c617ca4033cbbb914c361a8dfd992ae476f4daedc5277f7587c06c", + "signatureLegacy": { + "r": "0x8ba9001595c682949942e757cc026826be0f10ff6c0b802e141bb35eeae891d7", + "s": "0x4a74007fc09b47fed88aa9bc88111f9f7ec100318f27e1c83544cc8fa58a31ee", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xf00638a8fdd7eb539b862f5b0aaf81b3a2d33cfeaca9d9727c5f136bc7a4be73", + "s": "0x2487488b619da3a5bd226799bd95fd1e1ca6a8c8bf6cc847b7d438b709cf1b09", + "v": "0x15430a14444" + }, + "signatureBerlin": { + "r": "0x4aa90159f536810755a6b5ea45206ef5572a56db2a24308f77210aee9f165a26", + "s": "0x30a27cc3c1f6545f6f9ce17b7c6cbf6e83fc7c5d8fda6a1347ddb0880eaae96f", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x287c641c904907b3349cd174e6f821e3fd57e3eb5a95ddb88e0f77ca5c917248", + "s": "0x627b16cd06c617ca4033cbbb914c361a8dfd992ae476f4daedc5277f7587c06c", + "v": "0x1" + } + }, + { + "name": "random-127", + "transaction": { + "to": "0x62cd925478862D00220C8B25825E8F88c234D33e", + "nonce": 9, + "gasLimit": "0x4aa2ba", + "gasPrice": "0xbc3ec789", + "maxFeePerGas": "0xcb4b125c81402b", + "maxPriorityFeePerGas": "0x2ffe7d", + "data": "0x498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0", + "value": "0x6acf13702d", + "accessList": [ + { + "address": "0x92e6912e4f3BDAe4E15c968065966fC4c6Ed0Ac6", + "storageKeys": [ + "0xaf16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78ab", + "0x621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48", + "0xa64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866" + ] + }, + { + "address": "0xDB44867f5318a94AF0a679178A61d20d3257294d", + "storageKeys": [ + "0xaf16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78ab", + "0x621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48", + "0xa64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866" + ] + }, + { + "address": "0x8a17f9B4CE04AbAab4a50174C4CCd4EE01922261", + "storageKeys": [ + "0xaf16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78ab", + "0x621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48", + "0xa64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866" + ] + }, + { + "address": "0x9339B8c51E00c3B6d9ee93B4514eC4090F08cdE2", + "storageKeys": [ + "0xaf16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78ab", + "0x621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48", + "0xa64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866" + ] + } + ], + "chainId": "0x0fdfa162" + }, + "privateKey": "0xd2fbaab4412326ef90c23514858ee78a0c48eed140f7e6f2069c90466326aca3", + "unsignedLegacy": "0xf8520984bc3ec789834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0", + "unsignedEip155": "0xf8590984bc3ec789834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0840fdfa1628080", + "unsignedBerlin": "0x01f9024a840fdfa1620984bc3ec789834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0f901f0f87a9492e6912e4f3bdae4e15c968065966fc4c6ed0ac6f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a94db44867f5318a94af0a679178a61d20d3257294df863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a948a17f9b4ce04abaab4a50174c4ccd4ee01922261f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a949339b8c51e00c3b6d9ee93b4514ec4090f08cde2f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866", + "unsignedLondon": "0x02f90251840fdfa16209832ffe7d87cb4b125c81402b834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0f901f0f87a9492e6912e4f3bdae4e15c968065966fc4c6ed0ac6f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a94db44867f5318a94af0a679178a61d20d3257294df863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a948a17f9b4ce04abaab4a50174c4ccd4ee01922261f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a949339b8c51e00c3b6d9ee93b4514ec4090f08cde2f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866", + "signedLegacy": "0xf8950984bc3ec789834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d01ca01de79bc8f85eacbf081c70925e344a2770c58c348ec0e80081772230533e931fa00e6dc772a4f3a147c21c3b34285ee8aaf6aa2c647205c9e103bbb79b7163af94", + "signedEip155": "0xf8990984bc3ec789834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0841fbf42e8a082537131eca02ad876f9897b51f90015b2773f62d4a0333831eb31b5d7d57fb8a0103ef8915e3e7e151b91af799811a0d8731bbaebc63a4ace4fe9fb68ee285f70", + "signedBerlin": "0x01f9028d840fdfa1620984bc3ec789834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0f901f0f87a9492e6912e4f3bdae4e15c968065966fc4c6ed0ac6f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a94db44867f5318a94af0a679178a61d20d3257294df863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a948a17f9b4ce04abaab4a50174c4ccd4ee01922261f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a949339b8c51e00c3b6d9ee93b4514ec4090f08cde2f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec86601a0ccf27eba8e2a1beb251c13ba64a72a8c6441203fea6b277f26e3c492fd406f76a0607bf8be89be3289bb67aa366f2f01a426b052cc64ade1c7fda5b78d6b89c18c", + "signedLondon": "0x02f90294840fdfa16209832ffe7d87cb4b125c81402b834aa2ba9462cd925478862d00220c8b25825e8f88c234d33e856acf13702dac498871d8b15e1c4474f384316b5944637564b9a54751e2efa3ced23f6a84dc1c84a91d7bbe4e90e54dfae7d0f901f0f87a9492e6912e4f3bdae4e15c968065966fc4c6ed0ac6f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a94db44867f5318a94af0a679178a61d20d3257294df863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a948a17f9b4ce04abaab4a50174c4ccd4ee01922261f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec866f87a949339b8c51e00c3b6d9ee93b4514ec4090f08cde2f863a0af16d981a974e26ca941fdd7a8fe8bfed7614a3a7ce12d949025684e32ab78aba0621caa0c219b81e0367f33c3face28f7ca0f98f42a3aad3f532de0a9f45f1a48a0a64f182328abd18e3c88f7b41cdb54f9a02dec1f9f2138b6c4f3718241bec86601a0bcc1ceac78f8ef73ef92aa78582cac6b52969f971326985fabd7d7306a00e33aa0408e2f2c3912fb7179a4296f93cf8e4fa4da709a8ace6ff9237fb2c8e2d2d9d0", + "signatureLegacy": { + "r": "0x1de79bc8f85eacbf081c70925e344a2770c58c348ec0e80081772230533e931f", + "s": "0x0e6dc772a4f3a147c21c3b34285ee8aaf6aa2c647205c9e103bbb79b7163af94", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x82537131eca02ad876f9897b51f90015b2773f62d4a0333831eb31b5d7d57fb8", + "s": "0x103ef8915e3e7e151b91af799811a0d8731bbaebc63a4ace4fe9fb68ee285f70", + "v": "0x1fbf42e8" + }, + "signatureBerlin": { + "r": "0xccf27eba8e2a1beb251c13ba64a72a8c6441203fea6b277f26e3c492fd406f76", + "s": "0x607bf8be89be3289bb67aa366f2f01a426b052cc64ade1c7fda5b78d6b89c18c", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xbcc1ceac78f8ef73ef92aa78582cac6b52969f971326985fabd7d7306a00e33a", + "s": "0x408e2f2c3912fb7179a4296f93cf8e4fa4da709a8ace6ff9237fb2c8e2d2d9d0", + "v": "0x1" + } + }, + { + "name": "masked-1110110001", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xdf8203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080", + "unsignedEip155": "0xe28203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080648080", + "unsignedBerlin": "0x01e1648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080c0", + "unsignedLondon": "0x02eb648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080c0", + "signedLegacy": "0xf8628203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80801ca01824be9b512435421450e39c03604e44962beba31c09b1d4622e99dcad871cf8a048fdf3c98503be7232f1eb46c8399aa5694dd9cf4df793f99b403d2a2eb9ca6d", + "signedEip155": "0xf8638203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca808081eba0501207b3ccf000fee958ef7ffac557dd296e3f8ae47366418f64aa8831cc7145a06f4be87613b371f54ec08eeefc9e6cf9aa5c7371d526d36cce12450b5b63f866", + "signedBerlin": "0x01f864648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080c001a02774c1cc70847e2697bfb0e26e9f57beaea07240b5a2da032c00b0108977dd4ca019a674c86f659df7eba73979d4d74f2aac0932be70822182624d47b8e071014d", + "signedLondon": "0x02f86e648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080c001a022189be9d017d017a63b002afe2a9572203a363ac12c60a9aaa610104f0a5ee5a01cf01c1c3e2af873bfdb1a7b084e3c237b2b69d7ef945360f94d72f4011409c5", + "signatureLegacy": { + "r": "0x1824be9b512435421450e39c03604e44962beba31c09b1d4622e99dcad871cf8", + "s": "0x48fdf3c98503be7232f1eb46c8399aa5694dd9cf4df793f99b403d2a2eb9ca6d", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x501207b3ccf000fee958ef7ffac557dd296e3f8ae47366418f64aa8831cc7145", + "s": "0x6f4be87613b371f54ec08eeefc9e6cf9aa5c7371d526d36cce12450b5b63f866", + "v": "0xeb" + }, + "signatureBerlin": { + "r": "0x2774c1cc70847e2697bfb0e26e9f57beaea07240b5a2da032c00b0108977dd4c", + "s": "0x19a674c86f659df7eba73979d4d74f2aac0932be70822182624d47b8e071014d", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x22189be9d017d017a63b002afe2a9572203a363ac12c60a9aaa610104f0a5ee5", + "s": "0x1cf01c1c3e2af873bfdb1a7b084e3c237b2b69d7ef945360f94d72f4011409c5", + "v": "0x1" + } + }, + { + "name": "masked-1110111001", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "data": "0x14a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xf8a08203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "unsignedEip155": "0xf8a38203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78648080", + "unsignedBerlin": "0x01f8a2648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c0", + "unsignedLondon": "0x02f8ac648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c0", + "signedLegacy": "0xf8e38203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b781ca0c3c353687252c7b25a9b64755195ccc163258f7763f0f2451945f8b351cd6b6ba012a7808af4276b86519ecf0e22d3fe7dad5022bb7c697c1b51bda0ba2a29ef37", + "signedEip155": "0xf8e48203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b7881eca0128787002e3eeee5fb68cc96f12bd88298eb55dee53b2b31f81ea8e0e5ead798a002cff2a04d25928e356db52898da06e214b0df31f20fda2fd42a4db712531007", + "signedBerlin": "0x01f8e5648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c001a006819daef46b862e73f75b9c8c8928cb42e4b3848fef9b4fd92e40c7cc027e57a07ef7590664a9be87e5fef21bece92857bd6448aa64388f17d0f885f80c1140fb", + "signedLondon": "0x02f8ef648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c080a073de6359f48d52106c5c8c6b843fe6f8d217cb98a5b787d2c258376a42f5e6c5a004ee431fb95c479efa4a268f15e03ba54ea0c157534f424a3e090e7f174a2fa2", + "signatureLegacy": { + "r": "0xc3c353687252c7b25a9b64755195ccc163258f7763f0f2451945f8b351cd6b6b", + "s": "0x12a7808af4276b86519ecf0e22d3fe7dad5022bb7c697c1b51bda0ba2a29ef37", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x128787002e3eeee5fb68cc96f12bd88298eb55dee53b2b31f81ea8e0e5ead798", + "s": "0x02cff2a04d25928e356db52898da06e214b0df31f20fda2fd42a4db712531007", + "v": "0xec" + }, + "signatureBerlin": { + "r": "0x06819daef46b862e73f75b9c8c8928cb42e4b3848fef9b4fd92e40c7cc027e57", + "s": "0x7ef7590664a9be87e5fef21bece92857bd6448aa64388f17d0f885f80c1140fb", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x73de6359f48d52106c5c8c6b843fe6f8d217cb98a5b787d2c258376a42f5e6c5", + "s": "0x04ee431fb95c479efa4a268f15e03ba54ea0c157534f424a3e090e7f174a2fa2", + "v": "0x0" + } + }, + { + "name": "masked-1110110101", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "value": "0xe53c2b", + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xe28203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80", + "unsignedEip155": "0xe58203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80648080", + "unsignedBerlin": "0x01e4648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80c0", + "unsignedLondon": "0x02ee648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80c0", + "signedLegacy": "0xf8658203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b801ca06d873f2ec911fa35ad9ed7a8169c7db7d05624343a8ae6cfec5e7a66ae6ec164a038e28f6e5bb165b8adee528d73080a96ca810e593203f04ce1606f2ee446f860", + "signedEip155": "0xf8668203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b8081eca0140eb84256aa8faffb595ab2d3fe2ccb9be8b9f9ff1e48433965db8950d62508a075e32722100763539b1ced45d22e670dc53297f5d04b29d4cecbf0e95b1eee35", + "signedBerlin": "0x01f867648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80c080a03611858b6ac50345933deeaf21b172fd19cb17f9894cefd32049f730a13e09f8a00100dd919ee8e3d2dfcbc9a61b979d19bd5ef7ce3ac0d2961405dcf3141f8078", + "signedLondon": "0x02f871648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80c080a0ffe6b573d722dfaf1079260d45cd25aa2d2f79ceee104fbd7b7d6fc08ede9814a019514da58673a83e9f15c30ade66dc89330cf5a3bf08d5ce0ad30902c9c73d1c", + "signatureLegacy": { + "r": "0x6d873f2ec911fa35ad9ed7a8169c7db7d05624343a8ae6cfec5e7a66ae6ec164", + "s": "0x38e28f6e5bb165b8adee528d73080a96ca810e593203f04ce1606f2ee446f860", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x140eb84256aa8faffb595ab2d3fe2ccb9be8b9f9ff1e48433965db8950d62508", + "s": "0x75e32722100763539b1ced45d22e670dc53297f5d04b29d4cecbf0e95b1eee35", + "v": "0xec" + }, + "signatureBerlin": { + "r": "0x3611858b6ac50345933deeaf21b172fd19cb17f9894cefd32049f730a13e09f8", + "s": "0x0100dd919ee8e3d2dfcbc9a61b979d19bd5ef7ce3ac0d2961405dcf3141f8078", + "v": "0x0" + }, + "signatureLondon": { + "r": "0xffe6b573d722dfaf1079260d45cd25aa2d2f79ceee104fbd7b7d6fc08ede9814", + "s": "0x19514da58673a83e9f15c30ade66dc89330cf5a3bf08d5ce0ad30902c9c73d1c", + "v": "0x0" + } + }, + { + "name": "masked-1110111101", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "data": "0x14a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "value": "0xe53c2b", + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xf8a38203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "unsignedEip155": "0xf8a68203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78648080", + "unsignedBerlin": "0x01f8a5648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c0", + "unsignedLondon": "0x02f8af648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c0", + "signedLegacy": "0xf8e68203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b781ca03db67909302c521e616973cc478933dbf061c643e7e166b961e4c20cf60449aca0550e92db2b4903c1b308afccfa40ede5bc01a9a3bfb5ef7500dda44bd78e6627", + "signedEip155": "0xf8e78203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b7881eca0e79adae00f239f15bc8f362b1492321435920e5557efbc2ddd3d7c360f435f71a02a71c1301df20d48d89a0ffd5cc6d7c0b8bfd2a5793fd7eb67b671a329748418", + "signedBerlin": "0x01f8e8648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c001a0feb17927e9a2a8f9fa226afa5bd933c42777269a70c93fdc5bd185d36c7d050aa066504a8487b90a4297a01574d118e7dcd4b8eb8e87f35b108f2a78bd7c76930f", + "signedLondon": "0x02f8f2648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78c080a0e9bb4b0f2226278c7c8b980231449dea696b4e0baaf8679096eb154c1ffeecdca00599156fc921066983613fb7e44ca855c1e92cb9b87e1de0de1f73c00c50da94", + "signatureLegacy": { + "r": "0x3db67909302c521e616973cc478933dbf061c643e7e166b961e4c20cf60449ac", + "s": "0x550e92db2b4903c1b308afccfa40ede5bc01a9a3bfb5ef7500dda44bd78e6627", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xe79adae00f239f15bc8f362b1492321435920e5557efbc2ddd3d7c360f435f71", + "s": "0x2a71c1301df20d48d89a0ffd5cc6d7c0b8bfd2a5793fd7eb67b671a329748418", + "v": "0xec" + }, + "signatureBerlin": { + "r": "0xfeb17927e9a2a8f9fa226afa5bd933c42777269a70c93fdc5bd185d36c7d050a", + "s": "0x66504a8487b90a4297a01574d118e7dcd4b8eb8e87f35b108f2a78bd7c76930f", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xe9bb4b0f2226278c7c8b980231449dea696b4e0baaf8679096eb154c1ffeecdc", + "s": "0x0599156fc921066983613fb7e44ca855c1e92cb9b87e1de0de1f73c00c50da94", + "v": "0x0" + } + }, + { + "name": "masked-1110110011", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "accessList": [ + { + "address": "0xd25d95a6D3bbD713a24d5130536Bb29d1969f1CD", + "storageKeys": [ + "0x490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0", + "0x9fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018", + "0xa83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9" + ] + } + ], + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xdf8203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080", + "unsignedEip155": "0xe28203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080648080", + "unsignedBerlin": "0x01f89e648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "unsignedLondon": "0x02f8a8648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "signedLegacy": "0xf8628203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80801ca01824be9b512435421450e39c03604e44962beba31c09b1d4622e99dcad871cf8a048fdf3c98503be7232f1eb46c8399aa5694dd9cf4df793f99b403d2a2eb9ca6d", + "signedEip155": "0xf8638203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca808081eba0501207b3ccf000fee958ef7ffac557dd296e3f8ae47366418f64aa8831cc7145a06f4be87613b371f54ec08eeefc9e6cf9aa5c7371d526d36cce12450b5b63f866", + "signedBerlin": "0x01f8e1648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b901a08ac65b8c1d789e497f80e8b663450e74213d215e77cde2ed05f2869e4180e0a4a03086a21838ed4ea76e49eb7d2f1dbc96f5b742180e763901fdb773d12dfd3677", + "signedLondon": "0x02f8eb648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca8080f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b901a00d0d634b21f731d097fc70020835692cc883b56cb385374525a082d6d670148ba0549bbb8e3af9081415351f662c45d4d9d5dee6cf974da78dd1f27419f290434a", + "signatureLegacy": { + "r": "0x1824be9b512435421450e39c03604e44962beba31c09b1d4622e99dcad871cf8", + "s": "0x48fdf3c98503be7232f1eb46c8399aa5694dd9cf4df793f99b403d2a2eb9ca6d", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x501207b3ccf000fee958ef7ffac557dd296e3f8ae47366418f64aa8831cc7145", + "s": "0x6f4be87613b371f54ec08eeefc9e6cf9aa5c7371d526d36cce12450b5b63f866", + "v": "0xeb" + }, + "signatureBerlin": { + "r": "0x8ac65b8c1d789e497f80e8b663450e74213d215e77cde2ed05f2869e4180e0a4", + "s": "0x3086a21838ed4ea76e49eb7d2f1dbc96f5b742180e763901fdb773d12dfd3677", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x0d0d634b21f731d097fc70020835692cc883b56cb385374525a082d6d670148b", + "s": "0x549bbb8e3af9081415351f662c45d4d9d5dee6cf974da78dd1f27419f290434a", + "v": "0x1" + } + }, + { + "name": "masked-1110111011", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "data": "0x14a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "accessList": [ + { + "address": "0xd25d95a6D3bbD713a24d5130536Bb29d1969f1CD", + "storageKeys": [ + "0x490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0", + "0x9fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018", + "0xa83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9" + ] + } + ], + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xf8a08203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "unsignedEip155": "0xf8a38203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78648080", + "unsignedBerlin": "0x01f9011f648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "unsignedLondon": "0x02f90129648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "signedLegacy": "0xf8e38203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b781ca0c3c353687252c7b25a9b64755195ccc163258f7763f0f2451945f8b351cd6b6ba012a7808af4276b86519ecf0e22d3fe7dad5022bb7c697c1b51bda0ba2a29ef37", + "signedEip155": "0xf8e48203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b7881eca0128787002e3eeee5fb68cc96f12bd88298eb55dee53b2b31f81ea8e0e5ead798a002cff2a04d25928e356db52898da06e214b0df31f20fda2fd42a4db712531007", + "signedBerlin": "0x01f90162648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b901a0fc663683953088f2947862fdb00f4ec8afb602220170075ac9d88713d56ff0e2a03caf6100875ca728137ad478af03fbe77b3b4271044cd8c57277c6bf817704b9", + "signedLondon": "0x02f9016c648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca80b88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b980a014f3c82c9fcbda75e84a2fa48ca01b46be64f3483d8d38819f99ced76560f4cda04ca3051410c1f8326a29499e061047b28355a48fbe93670b06e82c19ead3abf2", + "signatureLegacy": { + "r": "0xc3c353687252c7b25a9b64755195ccc163258f7763f0f2451945f8b351cd6b6b", + "s": "0x12a7808af4276b86519ecf0e22d3fe7dad5022bb7c697c1b51bda0ba2a29ef37", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x128787002e3eeee5fb68cc96f12bd88298eb55dee53b2b31f81ea8e0e5ead798", + "s": "0x02cff2a04d25928e356db52898da06e214b0df31f20fda2fd42a4db712531007", + "v": "0xec" + }, + "signatureBerlin": { + "r": "0xfc663683953088f2947862fdb00f4ec8afb602220170075ac9d88713d56ff0e2", + "s": "0x3caf6100875ca728137ad478af03fbe77b3b4271044cd8c57277c6bf817704b9", + "v": "0x1" + }, + "signatureLondon": { + "r": "0x14f3c82c9fcbda75e84a2fa48ca01b46be64f3483d8d38819f99ced76560f4cd", + "s": "0x4ca3051410c1f8326a29499e061047b28355a48fbe93670b06e82c19ead3abf2", + "v": "0x0" + } + }, + { + "name": "masked-1110110111", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "value": "0xe53c2b", + "accessList": [ + { + "address": "0xd25d95a6D3bbD713a24d5130536Bb29d1969f1CD", + "storageKeys": [ + "0x490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0", + "0x9fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018", + "0xa83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9" + ] + } + ], + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xe28203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80", + "unsignedEip155": "0xe58203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80648080", + "unsignedBerlin": "0x01f8a1648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "unsignedLondon": "0x02f8ab648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "signedLegacy": "0xf8658203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b801ca06d873f2ec911fa35ad9ed7a8169c7db7d05624343a8ae6cfec5e7a66ae6ec164a038e28f6e5bb165b8adee528d73080a96ca810e593203f04ce1606f2ee446f860", + "signedEip155": "0xf8668203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b8081eca0140eb84256aa8faffb595ab2d3fe2ccb9be8b9f9ff1e48433965db8950d62508a075e32722100763539b1ced45d22e670dc53297f5d04b29d4cecbf0e95b1eee35", + "signedBerlin": "0x01f8e4648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b901a0cb7b283ffaddf3fa971cfbe83fb7d683eea1a39f55b49d31685459e12daa96d7a0228ec111a98516d65571fcfdbdc08e8fb48b4b2652e80952d17bf08acefd58fa", + "signedLondon": "0x02f8ee648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2b80f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b980a0c28a545da41bf3fa73fc08307dc05860d7e4a7a985f7a05833b275d884c2c55ba047e132fd8e39a1265733b7dc02aa27273bb828647ddc3fae839ed8015e7d4c5d", + "signatureLegacy": { + "r": "0x6d873f2ec911fa35ad9ed7a8169c7db7d05624343a8ae6cfec5e7a66ae6ec164", + "s": "0x38e28f6e5bb165b8adee528d73080a96ca810e593203f04ce1606f2ee446f860", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0x140eb84256aa8faffb595ab2d3fe2ccb9be8b9f9ff1e48433965db8950d62508", + "s": "0x75e32722100763539b1ced45d22e670dc53297f5d04b29d4cecbf0e95b1eee35", + "v": "0xec" + }, + "signatureBerlin": { + "r": "0xcb7b283ffaddf3fa971cfbe83fb7d683eea1a39f55b49d31685459e12daa96d7", + "s": "0x228ec111a98516d65571fcfdbdc08e8fb48b4b2652e80952d17bf08acefd58fa", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xc28a545da41bf3fa73fc08307dc05860d7e4a7a985f7a05833b275d884c2c55b", + "s": "0x47e132fd8e39a1265733b7dc02aa27273bb828647ddc3fae839ed8015e7d4c5d", + "v": "0x0" + } + }, + { + "name": "masked-1110111111", + "transaction": { + "to": "0x8f3e9c1Bd65EB267d19B176A73217524DC21A5ca", + "nonce": 951, + "gasLimit": "0x67b8bf", + "maxFeePerGas": "0xacd3ccc06a", + "maxPriorityFeePerGas": "0x180c3ca0", + "data": "0x14a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "value": "0xe53c2b", + "accessList": [ + { + "address": "0xd25d95a6D3bbD713a24d5130536Bb29d1969f1CD", + "storageKeys": [ + "0x490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0", + "0x9fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018", + "0xa83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9" + ] + } + ], + "chainId": "0x64" + }, + "privateKey": "0x0f8592102198f565b00937d2da3cd00475866ebdb18053243355dd6aa0222ab4", + "unsignedLegacy": "0xf8a38203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78", + "unsignedEip155": "0xf8a68203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78648080", + "unsignedBerlin": "0x01f90122648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "unsignedLondon": "0x02f9012c648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b9", + "signedLegacy": "0xf8e68203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b781ca03db67909302c521e616973cc478933dbf061c643e7e166b961e4c20cf60449aca0550e92db2b4903c1b308afccfa40ede5bc01a9a3bfb5ef7500dda44bd78e6627", + "signedEip155": "0xf8e78203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b7881eca0e79adae00f239f15bc8f362b1492321435920e5557efbc2ddd3d7c360f435f71a02a71c1301df20d48d89a0ffd5cc6d7c0b8bfd2a5793fd7eb67b671a329748418", + "signedBerlin": "0x01f90165648203b7808367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b901a09e6108157fada5740a0930efcc0deb2541dd8e027fca48480375b2f47a57dc03a0264baf762bdf809a898c15ae38e27dc8f7d7453a845f8f2fc328cbdfd14e4932", + "signedLondon": "0x02f9016f648203b784180c3ca085acd3ccc06a8367b8bf948f3e9c1bd65eb267d19b176a73217524dc21a5ca83e53c2bb88014a75dcfbe3b2ad41355d1768c038967219cf7189782e8dd20d61d4724136c705fe64ad7f34ba7ebc7bca0b325804461d4dd4d091cb40aa83431efad17159d8995b2392891ec41129a8fa2fa9cd1552ac1fcf86f55391c9500acce27a972ed381df53aaffa8de478f5d905cc37a26a3632a7d3416facaa93aba359d895500b78f87cf87a94d25d95a6d3bbd713a24d5130536bb29d1969f1cdf863a0490abded7314f322ca7f5be6de4f88932795db0a5efaa9f341bbc92b0c7550a0a09fad3dc0d449aba9f76ca580b484b8c887df8d6a4db1f657e6d3d93c7cef6018a0a83596da61d6ee00116d30dc064c5781995d1c3b4f4260f6d198bc5c9fabd5b901a0ff54728feb78f711daf4b834cc13497d0bee40607a089fb85fa789611575f0d1a01deb3bb286b3a33144305ee3ebd20a1dc55efe5645de32f519d7239e32cc4190", + "signatureLegacy": { + "r": "0x3db67909302c521e616973cc478933dbf061c643e7e166b961e4c20cf60449ac", + "s": "0x550e92db2b4903c1b308afccfa40ede5bc01a9a3bfb5ef7500dda44bd78e6627", + "v": "0x1c" + }, + "signatureEip155": { + "r": "0xe79adae00f239f15bc8f362b1492321435920e5557efbc2ddd3d7c360f435f71", + "s": "0x2a71c1301df20d48d89a0ffd5cc6d7c0b8bfd2a5793fd7eb67b671a329748418", + "v": "0xec" + }, + "signatureBerlin": { + "r": "0x9e6108157fada5740a0930efcc0deb2541dd8e027fca48480375b2f47a57dc03", + "s": "0x264baf762bdf809a898c15ae38e27dc8f7d7453a845f8f2fc328cbdfd14e4932", + "v": "0x1" + }, + "signatureLondon": { + "r": "0xff54728feb78f711daf4b834cc13497d0bee40607a089fb85fa789611575f0d1", + "s": "0x1deb3bb286b3a33144305ee3ebd20a1dc55efe5645de32f519d7239e32cc4190", + "v": "0x1" + } + } +] diff --git a/packages/web3/test/fixtures/tx-type-15/index.ts b/packages/web3/test/fixtures/tx-type-15/index.ts new file mode 100644 index 00000000000..8dd34b35e25 --- /dev/null +++ b/packages/web3/test/fixtures/tx-type-15/index.ts @@ -0,0 +1,446 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { keccak256 } from 'ethereum-cryptography/keccak'; +import { validateNoLeadingZeroes } from 'web3-validator'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { RLP } from '@ethereumjs/rlp'; +import { bytesToHex, hexToBytes, uint8ArrayConcat, uint8ArrayEquals } from 'web3-utils'; +import { + BaseTransaction, + FeeMarketEIP1559Transaction, + txUtils, + Common, + bigIntToHex, + toUint8Array, + ecrecover, + uint8ArrayToBigInt, + bigIntToUnpaddedUint8Array, + AccessList, + AccessListUint8Array, + FeeMarketEIP1559TxData, + FeeMarketEIP1559ValuesArray, + JsonTx, + TxOptions, +} from 'web3-eth-accounts'; + +const { getAccessListData, getAccessListJSON, getDataFeeEIP2930, verifyAccessList } = txUtils; + +const MAX_INTEGER = BigInt('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'); +export const TRANSACTION_TYPE = 15; +const TRANSACTION_TYPE_UINT8ARRAY = hexToBytes(TRANSACTION_TYPE.toString(16).padStart(2, '0')); + +/** + * Typed transaction with a new gas fee market mechanism + * + * - TransactionType: 2 + * - EIP: [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) + */ +// eslint-disable-next-line no-use-before-define +export class SomeNewTxTypeTransaction extends BaseTransaction { + public readonly chainId: bigint; + public readonly accessList: AccessListUint8Array; + public readonly AccessListJSON: AccessList; + public readonly maxPriorityFeePerGas: bigint; + public readonly maxFeePerGas: bigint; + + public readonly common: Common; + + /** + * The default HF if the tx type is active on that HF + * or the first greater HF where the tx is active. + * + * @hidden + */ + protected DEFAULT_HARDFORK = 'london'; + + /** + * Instantiate a transaction from a data dictionary. + * + * Format: { chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, v, r, s } + * + * Notes: + * - `chainId` will be set automatically if not provided + * - All parameters are optional and have some basic default values + */ + public static fromTxData(txData: FeeMarketEIP1559TxData, opts: TxOptions = {}) { + return new SomeNewTxTypeTransaction(txData, opts); + } + + /** + * Instantiate a transaction from the serialized tx. + * + * Format: `0x02 || rlp([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS])` + */ + public static fromSerializedTx(serialized: Uint8Array, opts: TxOptions = {}) { + if (!uint8ArrayEquals(serialized.subarray(0, 1), TRANSACTION_TYPE_UINT8ARRAY)) { + throw new Error( + `Invalid serialized tx input: not an EIP-1559 transaction (wrong tx type, expected: ${TRANSACTION_TYPE}, received: ${bytesToHex( + serialized.subarray(0, 1), + )}`, + ); + } + const values = RLP.decode(serialized.subarray(1)); + + if (!Array.isArray(values)) { + throw new Error('Invalid serialized tx input: must be array'); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + return FeeMarketEIP1559Transaction.fromValuesArray(values as any, opts); + } + + /** + * Create a transaction from a values array. + * + * Format: `[chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS]` + */ + public static fromValuesArray(values: FeeMarketEIP1559ValuesArray, opts: TxOptions = {}) { + if (values.length !== 9 && values.length !== 12) { + throw new Error( + 'Invalid EIP-1559 transaction. Only expecting 9 values (for unsigned tx) or 12 values (for signed tx).', + ); + } + + const [ + chainId, + nonce, + maxPriorityFeePerGas, + maxFeePerGas, + gasLimit, + to, + value, + data, + accessList, + v, + r, + s, + ] = values; + + this._validateNotArray({ chainId, v }); + validateNoLeadingZeroes({ + nonce, + maxPriorityFeePerGas, + maxFeePerGas, + gasLimit, + value, + v, + r, + s, + }); + + return new FeeMarketEIP1559Transaction( + { + chainId: uint8ArrayToBigInt(chainId), + nonce, + maxPriorityFeePerGas, + maxFeePerGas, + gasLimit, + to, + value, + data, + accessList: accessList ?? [], + v: v !== undefined ? uint8ArrayToBigInt(v) : undefined, // EIP2930 supports v's with value 0 (empty Uint8Array) + r, + s, + }, + opts, + ); + } + + /** + * This constructor takes the values, validates them, assigns them and freezes the object. + * + * It is not recommended to use this constructor directly. Instead use + * the static factory methods to assist in creating a Transaction object from + * varying data types. + */ + public constructor(txData: FeeMarketEIP1559TxData, opts: TxOptions = {}) { + super({ ...txData, type: TRANSACTION_TYPE }, opts); + const { chainId, accessList, maxFeePerGas, maxPriorityFeePerGas } = txData; + + this.common = this._getCommon(opts.common, chainId); + this.chainId = this.common.chainId(); + + if (!this.common.isActivatedEIP(1559)) { + throw new Error('EIP-1559 not enabled on Common'); + } + this.activeCapabilities = this.activeCapabilities.concat([1559, 2718, 2930]); + + // Populate the access list fields + const accessListData = getAccessListData(accessList ?? []); + this.accessList = accessListData.accessList; + this.AccessListJSON = accessListData.AccessListJSON; + // Verify the access list format. + verifyAccessList(this.accessList); + + this.maxFeePerGas = uint8ArrayToBigInt( + toUint8Array(maxFeePerGas === '' ? '0x' : maxFeePerGas), + ); + this.maxPriorityFeePerGas = uint8ArrayToBigInt( + toUint8Array(maxPriorityFeePerGas === '' ? '0x' : maxPriorityFeePerGas), + ); + + this._validateCannotExceedMaxInteger({ + maxFeePerGas: this.maxFeePerGas, + maxPriorityFeePerGas: this.maxPriorityFeePerGas, + }); + + BaseTransaction._validateNotArray(txData); + + if (this.gasLimit * this.maxFeePerGas > MAX_INTEGER) { + const msg = this._errorMsg( + 'gasLimit * maxFeePerGas cannot exceed MAX_INTEGER (2^256-1)', + ); + throw new Error(msg); + } + + if (this.maxFeePerGas < this.maxPriorityFeePerGas) { + const msg = this._errorMsg( + 'maxFeePerGas cannot be less than maxPriorityFeePerGas (The total must be the larger of the two)', + ); + throw new Error(msg); + } + + this._validateYParity(); + this._validateHighS(); + + const freeze = opts?.freeze ?? true; + if (freeze) { + Object.freeze(this); + } + } + + /** + * The amount of gas paid for the data in this tx + */ + public getDataFee(): bigint { + if (this.cache.dataFee && this.cache.dataFee.hardfork === this.common.hardfork()) { + return this.cache.dataFee.value; + } + + let cost = super.getDataFee(); + cost += BigInt(getDataFeeEIP2930(this.accessList, this.common)); + + if (Object.isFrozen(this)) { + this.cache.dataFee = { + value: cost, + hardfork: this.common.hardfork(), + }; + } + + return cost; + } + + /** + * The up front amount that an account must have for this transaction to be valid + * @param baseFee The base fee of the block (will be set to 0 if not provided) + */ + public getUpfrontCost(baseFee = BigInt(0)): bigint { + const prio = this.maxPriorityFeePerGas; + const maxBase = this.maxFeePerGas - baseFee; + const inclusionFeePerGas = prio < maxBase ? prio : maxBase; + const gasPrice = inclusionFeePerGas + baseFee; + return this.gasLimit * gasPrice + this.value; + } + + /** + * Returns a Uint8Array Array of the raw Uint8Arrays of the EIP-1559 transaction, in order. + * + * Format: `[chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS]` + * + * Use {@link FeeMarketEIP1559Transaction.serialize} to add a transaction to a block + * with {@link Block.fromValuesArray}. + * + * For an unsigned tx this method uses the empty Uint8Array values for the + * signature parameters `v`, `r` and `s` for encoding. For an EIP-155 compliant + * representation for external signing use {@link FeeMarketEIP1559Transaction.getMessageToSign}. + */ + public raw(): FeeMarketEIP1559ValuesArray { + return [ + bigIntToUnpaddedUint8Array(this.chainId), + bigIntToUnpaddedUint8Array(this.nonce), + bigIntToUnpaddedUint8Array(this.maxPriorityFeePerGas), + bigIntToUnpaddedUint8Array(this.maxFeePerGas), + bigIntToUnpaddedUint8Array(this.gasLimit), + this.to !== undefined ? this.to.buf : Uint8Array.from([]), + bigIntToUnpaddedUint8Array(this.value), + this.data, + this.accessList, + this.v !== undefined ? bigIntToUnpaddedUint8Array(this.v) : Uint8Array.from([]), + this.r !== undefined ? bigIntToUnpaddedUint8Array(this.r) : Uint8Array.from([]), + this.s !== undefined ? bigIntToUnpaddedUint8Array(this.s) : Uint8Array.from([]), + ]; + } + + /** + * Returns the serialized encoding of the EIP-1559 transaction. + * + * Format: `0x02 || rlp([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, + * accessList, signatureYParity, signatureR, signatureS])` + * + * Note that in contrast to the legacy tx serialization format this is not + * valid RLP any more due to the raw tx type preceding and concatenated to + * the RLP encoding of the values. + */ + public serialize(): Uint8Array { + const base = this.raw(); + return uint8ArrayConcat(TRANSACTION_TYPE_UINT8ARRAY, RLP.encode(base)); + } + + /** + * Returns the serialized unsigned tx (hashed or raw), which can be used + * to sign the transaction (e.g. for sending to a hardware wallet). + * + * Note: in contrast to the legacy tx the raw message format is already + * serialized and doesn't need to be RLP encoded any more. + * + * ```javascript + * const serializedMessage = tx.getMessageToSign(false) // use this for the HW wallet input + * ``` + * + * @param hashMessage - Return hashed message if set to true (default: true) + */ + public getMessageToSign(hashMessage = true): Uint8Array { + const base = this.raw().slice(0, 9); + const message = uint8ArrayConcat(TRANSACTION_TYPE_UINT8ARRAY, RLP.encode(base)); + if (hashMessage) { + return keccak256(message); + } + return message; + } + + /** + * Computes a sha3-256 hash of the serialized tx. + * + * This method can only be used for signed txs (it throws otherwise). + * Use {@link FeeMarketEIP1559Transaction.getMessageToSign} to get a tx hash for the purpose of signing. + */ + public hash(): Uint8Array { + if (!this.isSigned()) { + const msg = this._errorMsg('Cannot call hash method if transaction is not signed'); + throw new Error(msg); + } + + if (Object.isFrozen(this)) { + if (!this.cache.hash) { + this.cache.hash = keccak256(this.serialize()); + } + return this.cache.hash; + } + return keccak256(this.serialize()); + } + + /** + * Computes a sha3-256 hash which can be used to verify the signature + */ + public getMessageToVerifySignature(): Uint8Array { + return this.getMessageToSign(); + } + + /** + * Returns the public key of the sender + */ + public getSenderPublicKey(): Uint8Array { + if (!this.isSigned()) { + const msg = this._errorMsg('Cannot call this method if transaction is not signed'); + throw new Error(msg); + } + + const msgHash = this.getMessageToVerifySignature(); + const { v, r, s } = this; + + this._validateHighS(); + + try { + return ecrecover( + msgHash, + v! + BigInt(27), // Recover the 27 which was stripped from ecsign + bigIntToUnpaddedUint8Array(r!), + bigIntToUnpaddedUint8Array(s!), + ); + } catch (e: any) { + const msg = this._errorMsg('Invalid Signature'); + throw new Error(msg); + } + } + + public _processSignature(v: bigint, r: Uint8Array, s: Uint8Array) { + const opts = { ...this.txOptions, common: this.common }; + + return FeeMarketEIP1559Transaction.fromTxData( + { + chainId: this.chainId, + nonce: this.nonce, + maxPriorityFeePerGas: this.maxPriorityFeePerGas, + maxFeePerGas: this.maxFeePerGas, + gasLimit: this.gasLimit, + to: this.to, + value: this.value, + data: this.data, + accessList: this.accessList, + v: v - BigInt(27), // This looks extremely hacky: /util actually adds 27 to the value, the recovery bit is either 0 or 1. + r: uint8ArrayToBigInt(r), + s: uint8ArrayToBigInt(s), + }, + opts, + ); + } + + /** + * Returns an object with the JSON representation of the transaction + */ + public toJSON(): JsonTx { + const accessListJSON = getAccessListJSON(this.accessList); + + return { + chainId: bigIntToHex(this.chainId), + nonce: bigIntToHex(this.nonce), + maxPriorityFeePerGas: bigIntToHex(this.maxPriorityFeePerGas), + maxFeePerGas: bigIntToHex(this.maxFeePerGas), + gasLimit: bigIntToHex(this.gasLimit), + to: this.to !== undefined ? this.to.toString() : undefined, + value: bigIntToHex(this.value), + data: bytesToHex(this.data), + accessList: accessListJSON, + v: this.v !== undefined ? bigIntToHex(this.v) : undefined, + r: this.r !== undefined ? bigIntToHex(this.r) : undefined, + s: this.s !== undefined ? bigIntToHex(this.s) : undefined, + }; + } + + /** + * Return a compact error string representation of the object + */ + public errorStr() { + let errorStr = this._getSharedErrorPostfix(); + errorStr += ` maxFeePerGas=${this.maxFeePerGas} maxPriorityFeePerGas=${this.maxPriorityFeePerGas}`; + return errorStr; + } + + /** + * Internal helper function to create an annotated error message + * + * @param msg Base error message + * @hidden + */ + protected _errorMsg(msg: string) { + return `${msg} (${this.errorStr()})`; + } +} diff --git a/packages/web3/test/integration/contract.test.ts b/packages/web3/test/integration/contract.test.ts new file mode 100644 index 00000000000..51481e72c4e --- /dev/null +++ b/packages/web3/test/integration/contract.test.ts @@ -0,0 +1,95 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import * as Web3Eth from 'web3-eth'; +import { Web3, Contract } from '../../src/index'; + +import { + ERC20TokenAbi, + // eslint-disable-next-line import/no-relative-packages +} from '../shared_fixtures/contracts/ERC20Token'; + +jest.mock('web3-eth'); + +describe('Contract', () => { + describe('Contract use the context wallet', () => { + it('should work when created as web.eth.Contract', async () => { + const web3 = new Web3('https://rpc2.sepolia.org'); + const contract = new web3.eth.Contract( + ERC20TokenAbi, + '0x7af963cF6D228E564e2A0aA0DdBF06210B38615D', + ); + + // could be add wallet also as: + // const account = web3.eth.accounts.wallet.add('Private Key').get(0); + const account = web3.eth.accounts.create(); + + expect(contract.wallet).toBeDefined(); + + const sendTransactionSpy = jest + .spyOn(Web3Eth, 'sendTransaction') + .mockImplementation((_objInstance, tx) => { + expect(tx.from).toStrictEqual(account.address); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return { on: jest.fn() } as any; + }); + + await contract.methods.transfer(account.address, 100).send({ from: account?.address }); + + expect(sendTransactionSpy).toHaveBeenLastCalledWith( + expect.any(Object), + expect.objectContaining({ + from: account.address, + }), + expect.any(Object), + expect.any(Object), + ); + }); + it('should work when passed to constructor as Contract(..., web3Context)', async () => { + const web3 = new Web3('https://rpc2.sepolia.org'); + const contract = new Contract( + ERC20TokenAbi, + '0x7af963cF6D228E564e2A0aA0DdBF06210B38615D', + web3, + ); + + // could be add wallet also as: + // const account = web3.eth.accounts.wallet.add('Private Key').get(0); + const account = web3.eth.accounts.create(); + + expect(contract.wallet).toBeDefined(); + + const sendTransactionSpy = jest + .spyOn(Web3Eth, 'sendTransaction') + .mockImplementation((_objInstance, tx) => { + expect(tx.from).toStrictEqual(account.address); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return { on: jest.fn() } as any; + }); + + await contract.methods.transfer(account.address, 100).send({ from: account?.address }); + + expect(sendTransactionSpy).toHaveBeenLastCalledWith( + expect.any(Object), + expect.objectContaining({ + from: account.address, + }), + expect.any(Object), + expect.any(Object), + ); + }); + }); +}); diff --git a/packages/web3/test/integration/external-providers/extremely_simple.test.ts b/packages/web3/test/integration/external-providers/extremely_simple.test.ts new file mode 100644 index 00000000000..ba1ebdfa300 --- /dev/null +++ b/packages/web3/test/integration/external-providers/extremely_simple.test.ts @@ -0,0 +1,38 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import Web3 from '../../../src/index'; + +describe('compatibility with extremely simple external provider', () => { + it('should accept a simple instance that is compatible with EIP1193', () => { + interface RequestArguments { + readonly method: string; + readonly params?: readonly unknown[] | object; + } + + class Provider { + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/require-await, @typescript-eslint/no-unused-vars + public async request(_: RequestArguments): Promise { + return undefined as unknown; + } + } + + const testProvider = new Provider(); + const { provider } = new Web3(testProvider); + expect(provider).toBeDefined(); + }); +}); diff --git a/packages/web3/test/integration/external-providers/ganache.test.ts b/packages/web3/test/integration/external-providers/ganache.test.ts new file mode 100644 index 00000000000..a0494db0161 --- /dev/null +++ b/packages/web3/test/integration/external-providers/ganache.test.ts @@ -0,0 +1,33 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line import/no-extraneous-dependencies +import ganache from 'ganache'; +import { performBasicRpcCalls } from './helper'; +import { getSystemTestMnemonic } from '../../shared_fixtures/system_tests_utils'; + +describe('compatibility with `ganache` provider', () => { + it('should initialize Web3, get accounts & block number and send a transaction', async () => { + const { provider } = ganache.server({ + wallet: { + mnemonic: getSystemTestMnemonic(), + }, + }); + + await performBasicRpcCalls(provider); + }); +}); diff --git a/packages/web3/test/integration/external-providers/hardhat.test.ts b/packages/web3/test/integration/external-providers/hardhat.test.ts new file mode 100644 index 00000000000..989424199fb --- /dev/null +++ b/packages/web3/test/integration/external-providers/hardhat.test.ts @@ -0,0 +1,28 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line import/no-extraneous-dependencies +import hardhat from 'hardhat'; + +import { performBasicRpcCalls } from './helper'; + +describe('compatibility with `hardhat` provider', () => { + it('should initialize Web3, get accounts & block number and send a transaction', async () => { + // use the hardhat provider for web3.js + await performBasicRpcCalls(hardhat.network.provider); + }); +}); diff --git a/packages/web3/test/integration/external-providers/helper.ts b/packages/web3/test/integration/external-providers/helper.ts new file mode 100644 index 00000000000..c1f88dd86b0 --- /dev/null +++ b/packages/web3/test/integration/external-providers/helper.ts @@ -0,0 +1,48 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { SupportedProviders } from 'web3-types'; +import Web3 from '../../../src/index'; + +/** + * Performs basic RPC calls (like `eth_accounts`, `eth_blockNumber` and `eth_sendTransaction`) + * @param provider - an instance of a compatible provider + */ +export async function performBasicRpcCalls(provider: SupportedProviders) { + const web3 = new Web3(provider); + const accounts = await web3.eth.getAccounts(); + expect(accounts).toBeDefined(); + expect(accounts.length).toBeGreaterThan(0); + // get the last block number + const blockNumber0 = await web3.eth.getBlockNumber(); + expect(typeof blockNumber0).toBe('bigint'); + + // send a transaction + const tx = await web3.eth.sendTransaction({ + to: accounts[1], + from: accounts[0], + value: '1', + gas: 21000 + }); + expect(tx.status).toBe(BigInt(1)); + + const blockNumber1 = await web3.eth.getBlockNumber(); + expect(typeof blockNumber1).toBe('bigint'); + + // After sending a transaction, the blocknumber is supposed to be greater than or equal the block number before sending the transaction + expect(blockNumber1).toBeGreaterThanOrEqual(blockNumber0); +} diff --git a/packages/web3/test/integration/external-providers/in3.test.ts b/packages/web3/test/integration/external-providers/in3.test.ts new file mode 100644 index 00000000000..72fe0d72be3 --- /dev/null +++ b/packages/web3/test/integration/external-providers/in3.test.ts @@ -0,0 +1,52 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { waitWithTimeout, setRequestIdStart } from 'web3-utils'; +// eslint-disable-next-line import/no-extraneous-dependencies +import In3Client from 'in3'; + +import Web3 from '../../../src/index'; + +// Actually it could take long time to get something from `in3` because of its decentralized nature. +// And because of that, this test only try to get the last block number. And this also simplifies the configuration needed. +describe('compatibility with `in3` provider', () => { + it.skip('should get last block number', async () => { + // use the In3Client as Http-Provider for web3.js + const web3 = new Web3( + new In3Client({ + proof: 'none', + signatureCount: 0, + requestCount: 1, + chainId: 'mainnet', + }).createWeb3Provider(), + ); + + // TODO: remove the next line after this issue is closed: https://github.com/blockchainsllc/in3/issues/46 + setRequestIdStart(0); + + // get the last block number + const blockNumber = await waitWithTimeout(web3.eth.getBlockNumber(), 25000); + + if (typeof blockNumber === 'undefined') { + console.warn( + 'It took too long for in3 provider to get a block. The test of in3 will be skipped', + ); + return; + } + expect(typeof blockNumber).toBe('bigint'); + }); +}); diff --git a/packages/web3/test/integration/external-providers/infura-rpc.test.ts b/packages/web3/test/integration/external-providers/infura-rpc.test.ts new file mode 100644 index 00000000000..479949c06f8 --- /dev/null +++ b/packages/web3/test/integration/external-providers/infura-rpc.test.ts @@ -0,0 +1,41 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import Web3 from '../../../src/index'; +import { describeIf, isIpc, itIf } from '../../shared_fixtures/system_tests_utils'; + +describeIf(!isIpc)('compatibility with `infura` remote rpc providers', () => { + itIf( + process.env.INFURA_GOERLI_WS + ? process.env.INFURA_GOERLI_WS.toString().includes('ws') + : false, + )('should create Web3 class instance with `ws` string connection', () => { + const web3 = new Web3(process.env.INFURA_GOERLI_WS); + // eslint-disable-next-line jest/no-standalone-expect + expect(web3).toBeInstanceOf(Web3); + }); + + itIf( + process.env.INFURA_GOERLI_HTTP + ? process.env.INFURA_GOERLI_HTTP.toString().includes('http') + : false, + )('should create Web3 class instance with `http` string connection', () => { + const web3 = new Web3(process.env.INFURA_GOERLI_HTTP); + // eslint-disable-next-line jest/no-standalone-expect + expect(web3).toBeInstanceOf(Web3); + }); +}); diff --git a/packages/web3/test/integration/external-providers/truffle-hdwallet.test.ts b/packages/web3/test/integration/external-providers/truffle-hdwallet.test.ts new file mode 100644 index 00000000000..17a2b088d43 --- /dev/null +++ b/packages/web3/test/integration/external-providers/truffle-hdwallet.test.ts @@ -0,0 +1,53 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import HDWalletProvider from '@truffle/hdwallet-provider'; + +import { performBasicRpcCalls } from './helper'; +import { + createNewAccount, + describeIf, + getSystemTestProvider, + isIpc, +} from '../../shared_fixtures/system_tests_utils'; +import Web3 from '../../../src'; + +describeIf(!isIpc)('compatibility with `truffle` `HDWalletProvider` provider', () => { + let provider: HDWalletProvider; + + beforeAll(async () => { + const clientUrl = getSystemTestProvider(); + const account1 = await createNewAccount({ unlock: true, refill: true }); + const account2 = await createNewAccount({ unlock: true, refill: true }); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + provider = new HDWalletProvider({ + privateKeys: [account1.privateKey, account2.privateKey], + providerOrUrl: clientUrl, + }); + }); + afterAll(() => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + provider?.engine?.stop(); + }); + test('should create instance with external wallet provider', () => { + const web3 = new Web3(provider); + expect(web3).toBeInstanceOf(Web3); + }); + test('should initialize Web3, get accounts & block number and send a transaction', async () => { + await performBasicRpcCalls(provider); + }); +}); diff --git a/packages/web3/test/integration/handle_revert.test.ts b/packages/web3/test/integration/handle_revert.test.ts new file mode 100644 index 00000000000..89304c1414e --- /dev/null +++ b/packages/web3/test/integration/handle_revert.test.ts @@ -0,0 +1,136 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { TransactionRevertInstructionError } from 'web3-errors'; +import { Contract } from 'web3-eth-contract'; +import WebSocketProvider from 'web3-providers-ws'; +import Web3 from '../../src/index'; +import { BasicAbi, BasicBytecode } from '../shared_fixtures/build/Basic'; +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + getSystemTestProviderUrl, + isWs, +} from '../shared_fixtures/system_tests_utils'; + +Error.stackTraceLimit = Infinity; + +describe.skip('eth', () => { + let web3: Web3; + let accounts: string[] = []; + let clientUrl: string; + + let contract: Contract; + let deployOptions: Record; + let sendOptions: Record; + + beforeEach(async () => { + clientUrl = getSystemTestProviderUrl(); + const acc1 = await createTempAccount(); + const acc2 = await createTempAccount(); + accounts = [acc1.address, acc2.address]; + web3 = new Web3(getSystemTestProvider()); + if (isWs) { + web3 = new Web3( + new WebSocketProvider( + clientUrl, + {}, + { delay: 1, autoReconnect: false, maxAttempts: 1 }, + ), + ); + } else { + web3 = new Web3(clientUrl); + } + + if (isWs) { + contract = new web3.eth.Contract(BasicAbi, undefined, { + provider: new WebSocketProvider( + clientUrl, + {}, + { delay: 1, autoReconnect: false, maxAttempts: 1 }, + ), + }); + } else { + contract = new web3.eth.Contract(BasicAbi, undefined, { + provider: clientUrl, + }); + } + + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + + sendOptions = { from: accounts[0], gas: '1000000' }; + + contract = await contract.deploy(deployOptions).send(sendOptions); + }); + afterAll(async () => { + await closeOpenConnection(web3); + await closeOpenConnection(contract); + }); + + describe('handleRevert', () => { + // todo enable when figure out what happening in eth_call (doesn't throw error) + // eslint-disable-next-line jest/expect-expect + it('should get revert reason', async () => { + contract.handleRevert = true; + await expect(contract.methods.reverts().send({ from: accounts[0] })).rejects.toThrow( + new TransactionRevertInstructionError( + 'Returned error: execution reverted: REVERTED WITH REVERT', + ), + ); + }); + + it('should get revert reason for eth tx', async () => { + web3.eth.handleRevert = true; + await expect( + web3.eth.sendTransaction({ + from: accounts[0], + gas: '0x3d0900', + gasPrice: '0x3B9ACBF4', + input: '0x608060405234801561001057600080fdklkl', + nonce: '0x10', + to: undefined, + value: '0x0', + type: '0x0', + v: '0xa96', + r: '0x1ba80b16306d1de8ff809c00f67c305e8636326096aba282828d331aa2ec30a1', + s: '0x39f77e0b68d5524826e4385ad4e1f01e748f32c177840184ae65d9592fdfe5c', + }), + ).rejects.toThrow( + new TransactionRevertInstructionError( + 'Returned error: invalid argument 0: json: cannot unmarshal invalid hex string into Go struct field TransactionArgs.data of type hexutil.Bytes', + ), + ); + }); + + it('should execute transaction', async () => { + web3.eth.handleRevert = true; + await expect( + web3.eth.sendTransaction({ + from: accounts[0], + to: accounts[1], + gas: '0x76c0', + gasPrice: '0x9184e72a000', + value: '0x9184e72a', + data: '0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675', + }), + ).resolves.toBeDefined(); + }); + }); +}); diff --git a/packages/web3/test/integration/ipc.test.ts b/packages/web3/test/integration/ipc.test.ts new file mode 100644 index 00000000000..e22c3cc3d04 --- /dev/null +++ b/packages/web3/test/integration/ipc.test.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { IpcProvider } from 'web3-providers-ipc'; +import { + getSystemTestProvider, + describeIf, + isIpc, + closeOpenConnection, + waitForSocketConnect, +} from '../shared_fixtures/system_tests_utils'; +import Web3, { EthExecutionAPI, SupportedProviders } from '../../src/index'; + +describe('Web3 instance', () => { + let provider: SupportedProviders | string; + let web3: Web3; + + beforeAll(() => { + provider = getSystemTestProvider(); + web3 = new Web3(provider); + }); + afterAll(async () => { + await closeOpenConnection(web3); + }); + + describeIf(isIpc)('Create Web3 class instance with ipc string providers', () => { + // https://ethereum.stackexchange.com/questions/52574/how-to-connect-to-ethereum-node-geth-via-ipc-from-outside-of-docker-container + // https://github.com/ethereum/go-ethereum/issues/17907 + it('should create instance with string of IPC provider', async () => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + + expect(web3).toBeInstanceOf(Web3); + await waitForSocketConnect(web3.provider as IpcProvider); + expect((web3.provider as IpcProvider).getStatus()).toBe('connected'); + }); + }); +}); diff --git a/packages/web3/test/integration/jest.config.js b/packages/web3/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/packages/web3/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3/test/integration/setup.js b/packages/web3/test/integration/setup.js new file mode 100644 index 00000000000..fddbec59a1e --- /dev/null +++ b/packages/web3/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 30000; // Sometimes `in3` takes long time because of its decentralized nature. + +jest.setTimeout(jestTimeout); diff --git a/packages/web3/test/integration/sync.test.ts b/packages/web3/test/integration/sync.test.ts new file mode 100644 index 00000000000..f699e6d75ac --- /dev/null +++ b/packages/web3/test/integration/sync.test.ts @@ -0,0 +1,102 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import Web3 from '../../src/index'; +import { + closeOpenConnection, + describeIf, + getSystemTestProviderUrl, + isIpc, + isSyncTest, + isWs, +} from '../shared_fixtures/system_tests_utils'; + +const addPeer = async (web3: Web3, eNode: string) => { + return web3.requestManager.send({ + method: 'admin_addPeer', + params: [eNode], + }); +}; +const removePeer = async (web3: Web3, eNode: string) => { + return web3.requestManager.send({ + method: 'admin_removePeer', + params: [eNode], + }); +}; +const minerStart = async (web3: Web3, start: number) => { + return web3.requestManager.send({ + method: 'miner_start', + params: [start], + }); +}; +const nodeInfo = async (web3: Web3) => { + return web3.requestManager.send({ + method: 'admin_nodeInfo', + params: [], + }); +}; +const addAccount = async (web3: Web3) => { + return web3.requestManager.send({ + method: 'personal_newAccount', + params: ['1234'], + }); +}; +describeIf((isIpc || isWs) && isSyncTest)('Sync nodes test', () => { + let web3Node1: Web3; + let web3Node2: Web3; + beforeAll(async () => { + const providerPath1 = isWs + ? getSystemTestProviderUrl().replace('8545', '18545') + : getSystemTestProviderUrl().replace('/tmp/ipc', '/tmp/ipc1'); + const providerPath2 = isWs + ? getSystemTestProviderUrl().replace('8545', '28545') + : getSystemTestProviderUrl().replace('/tmp/ipc', '/tmp/ipc2'); + + web3Node1 = new Web3(providerPath1); + await addAccount(web3Node1); + web3Node2 = new Web3(providerPath2); + await addAccount(web3Node2); + }); + afterAll(async () => { + await closeOpenConnection(web3Node1); + await closeOpenConnection(web3Node2); + }); + + describe('Start/end syncing', () => { + it('should emit start syncing and end syncing events', async () => { + const subs = await web3Node2.eth.subscribe('syncing'); + const dataPromise = new Promise(resolve => { + subs.on('data', resolve); + }); + const syncStartPromise = new Promise(resolve => { + subs.on('changed', resolve); + }); + await minerStart(web3Node1, 0); + const node1Info = await nodeInfo(web3Node1); + await addPeer(web3Node2, node1Info.enode); + await minerStart(web3Node1, 1); + + expect(await syncStartPromise).toBe(true); + await dataPromise; + const syncEndPromise = new Promise(resolve => { + subs.on('changed', resolve); + }); + expect(await syncEndPromise).toBe(false); + await removePeer(web3Node2, node1Info.enode); + }); + }); +}); diff --git a/packages/web3/test/integration/web3-plugin-add-tx.test.ts b/packages/web3/test/integration/web3-plugin-add-tx.test.ts new file mode 100644 index 00000000000..9b5bad43fa1 --- /dev/null +++ b/packages/web3/test/integration/web3-plugin-add-tx.test.ts @@ -0,0 +1,73 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable @typescript-eslint/no-magic-numbers */ + +import { Transaction, Web3Account } from 'web3-eth-accounts'; +import { SupportedProviders, Web3, Web3PluginBase } from '../../src'; +import { + createAccount, + createLocalAccount, + getSystemTestProvider, + waitForOpenConnection, +} from '../shared_fixtures/system_tests_utils'; +import { SomeNewTxTypeTransaction, TRANSACTION_TYPE } from '../fixtures/tx-type-15'; + +class Eip4844Plugin extends Web3PluginBase { + public pluginNamespace = 'txType3'; + public constructor() { + super(); + // eslint-disable-next-line + this.registerNewTransactionType(TRANSACTION_TYPE, SomeNewTxTypeTransaction); + } +} + +describe('Add New Tx as a Plugin', () => { + let web3: Web3; + let clientUrl: string | SupportedProviders; + let account1: Web3Account; + let account2: Web3Account; + beforeEach(async () => { + clientUrl = getSystemTestProvider(); + web3 = new Web3(clientUrl); + account1 = await createLocalAccount(web3); + account2 = createAccount(); + web3.eth.accounts.wallet.add(account1); + await waitForOpenConnection(web3.eth); + }); + it('should receive correct type of tx', async () => { + web3.registerPlugin(new Eip4844Plugin()); + const tx = { + from: account1.address, + to: account2.address, + value: '0x1', + type: TRANSACTION_TYPE, + maxPriorityFeePerGas: BigInt(5000000), + maxFeePerGas: BigInt(5000000), + }; + const sub = web3.eth.sendTransaction(tx); + + const waitForEvent: Promise = new Promise(resolve => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + sub.on('sending', txData => { + resolve(txData as unknown as Transaction); + }); + }); + expect(Number((await waitForEvent).type)).toBe(TRANSACTION_TYPE); + await expect(sub).rejects.toThrow(); + }); +}); diff --git a/packages/web3/test/integration/web3.abi.test.ts b/packages/web3/test/integration/web3.abi.test.ts new file mode 100644 index 00000000000..14e3f8c227f --- /dev/null +++ b/packages/web3/test/integration/web3.abi.test.ts @@ -0,0 +1,50 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { validEncodeParametersData } from '../shared_fixtures/data'; +import { + getSystemTestProvider, + waitForOpenConnection, + closeOpenConnection, +} from '../shared_fixtures/system_tests_utils'; +import Web3, { SupportedProviders } from '../../src/index'; + +describe('web3.abi', () => { + let clientUrl: string | SupportedProviders; + let web3: Web3; + + beforeAll(async () => { + clientUrl = getSystemTestProvider(); + web3 = new Web3(clientUrl); + + await waitForOpenConnection(web3); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + it('hash correctly', () => { + const validData = validEncodeParametersData[0]; + + const encodedParameters = web3.eth.abi.encodeParameters( + validData.input[0], + validData.input[1], + ); + expect(encodedParameters).toEqual(validData.output); + }); +}); diff --git a/packages/web3/test/integration/web3.accounts.test.ts b/packages/web3/test/integration/web3.accounts.test.ts new file mode 100644 index 00000000000..22a0c83a8c1 --- /dev/null +++ b/packages/web3/test/integration/web3.accounts.test.ts @@ -0,0 +1,208 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Account } from 'web3-eth-accounts'; +import { + getSystemTestProvider, + createNewAccount, + waitForOpenConnection, + closeOpenConnection, + createTempAccount, +} from '../shared_fixtures/system_tests_utils'; +import Web3, { SupportedProviders } from '../../src/index'; + +const hexRegx = /0[xX][0-9a-fA-F]+/; + +describe('web3.accounts', () => { + let clientUrl: string | SupportedProviders; + let tempAccount: string; + let web3: Web3; + + beforeAll(async () => { + clientUrl = getSystemTestProvider(); + web3 = new Web3(clientUrl); + await waitForOpenConnection(web3); + }); + beforeEach(async () => { + tempAccount = (await createTempAccount()).address; + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + describe('create', () => { + it('should create account', () => { + const account: Web3Account = web3.eth.accounts.create(); + + expect(account).toEqual( + expect.objectContaining({ + address: expect.stringMatching(hexRegx), + privateKey: expect.stringMatching(hexRegx), + }), + ); + }); + + describe('signTransaction', () => { + it('should be able to sign the transaction from created account', async () => { + const account: Web3Account = web3.eth.accounts.create(); + const tx = { + from: account.address, + to: tempAccount, + value: web3.utils.toWei('0.00001', 'ether'), + gas: '0x5218', + data: '0x1', + }; + + // Fund this account with some ether + await expect( + web3.eth.sendTransaction({ + from: tempAccount, + to: account.address, + value: web3.utils.toWei('0.00005', 'ether'), + }), + ).resolves.toBeDefined(); + + const txWithGas = { + ...tx, + gasPrice: '0x271000', + }; + // Sign the tx from that account + const signedTx = await account.signTransaction(txWithGas); + + expect(signedTx).toEqual( + expect.objectContaining({ + messageHash: expect.stringMatching(hexRegx), + rawTransaction: expect.stringMatching(hexRegx), + transactionHash: expect.stringMatching(hexRegx), + v: expect.stringMatching(hexRegx), + r: expect.stringMatching(hexRegx), + s: expect.stringMatching(hexRegx), + }), + ); + + // The signed transaction is accepted by the node + await expect( + web3.eth.sendSignedTransaction(signedTx.rawTransaction), + ).resolves.toEqual( + expect.objectContaining({ transactionHash: signedTx.transactionHash }), + ); + }); + + it('should throw error if gas is to low', async () => { + const account: Web3Account = web3.eth.accounts.create(); + + const tx = { + from: account.address, + to: tempAccount, + value: web3.utils.toWei('0.1', 'ether'), + gas: '0x1', + data: '0x1', + gasPrice: '0x38562', + }; + + await expect(account.signTransaction(tx)).rejects.toThrow('gasLimit is too low.'); + }); + + // TODO This test should fail, but it's not. Need to debug further to figure out why. + // eslint-disable-next-line jest/no-disabled-tests + it.skip('should throw error if signed by private key not associated with "from" field', async () => { + const account: Web3Account = web3.eth.accounts.create(); + + const tx = { + from: tempAccount, + to: account.address, + value: web3.utils.toWei('0.1', 'ether'), + gas: '0x1', + data: '0x1', + }; + + await expect(account.signTransaction(tx)).rejects.toThrow('Error'); + }); + }); + }); + + describe('signTransaction', () => { + it('should be able to sign the transaction from created account', async () => { + const account: Web3Account = web3.eth.accounts.create(); + + const tx = { + from: account.address, + to: tempAccount, + value: web3.utils.toWei('0.1', 'ether'), + gas: '0x5218', + data: '0x1', + gasPrice: '0x48523', + }; + + // Fund this account with some ether + await expect( + web3.eth.sendTransaction({ + from: tempAccount, + to: account.address, + value: web3.utils.toWei('0.5', 'ether'), + }), + ).resolves.toBeDefined(); + + // Sign the tx from that account + const signedTx = await web3.eth.accounts.signTransaction(tx, account.privateKey); + + expect(signedTx).toEqual( + expect.objectContaining({ + messageHash: expect.stringMatching(hexRegx), + rawTransaction: expect.stringMatching(hexRegx), + transactionHash: expect.stringMatching(hexRegx), + v: expect.stringMatching(hexRegx), + r: expect.stringMatching(hexRegx), + s: expect.stringMatching(hexRegx), + }), + ); + + // The signed transaction is accepted by the node + await expect(web3.eth.sendSignedTransaction(signedTx.rawTransaction)).resolves.toEqual( + expect.objectContaining({ transactionHash: signedTx.transactionHash }), + ); + }); + + it('should throw error if gas is to low', async () => { + const account: Web3Account = web3.eth.accounts.create(); + + const tx = { + from: account.address, + to: tempAccount, + value: web3.utils.toWei('0.1', 'ether'), + gas: '0x1', + data: '0x1', + gasPrice: '0x1', + }; + + await expect(web3.eth.accounts.signTransaction(tx, account.privateKey)).rejects.toThrow( + 'gasLimit is too low.', + ); + }); + }); + + describe('privateKeyToAccount', () => { + it('should create account from private key', async () => { + const acc = await createNewAccount(); + const createdAccount: Web3Account = web3.eth.accounts.privateKeyToAccount( + acc.privateKey, + ); + expect(acc.address.toLowerCase()).toBe(createdAccount.address.toLowerCase()); + }); + }); +}); diff --git a/packages/web3/test/integration/web3.config.test.ts b/packages/web3/test/integration/web3.config.test.ts new file mode 100644 index 00000000000..33a3e8e2ad0 --- /dev/null +++ b/packages/web3/test/integration/web3.config.test.ts @@ -0,0 +1,83 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { SupportedProviders, Web3BaseProvider } from 'web3-types'; +import { + closeOpenConnection, + createTempAccount, + getSystemTestProvider, + isWs, + waitForOpenConnection, +} from '../shared_fixtures/system_tests_utils'; +import Web3 from '../../src/index'; + +describe('Web3 instance', () => { + let provider: string | SupportedProviders; + let accounts: string[]; + let web3: Web3; + let currentAttempt = 0; + + beforeEach(() => { + currentAttempt = 0; + }); + + beforeAll(async () => { + provider = getSystemTestProvider(); + const acc1 = await createTempAccount(); + const acc2 = await createTempAccount(); + accounts = [acc1.address, acc2.address]; + web3 = new Web3(provider); + }); + afterAll(async () => { + try { + await closeOpenConnection(web3); + } catch (e) { + console.warn("Failed to close open con", e) + } + }); + + afterEach(async () => { + if (isWs) { + // make sure we try to close the connection after it is established + if ( + web3?.provider && + (web3.provider as unknown as Web3BaseProvider).getStatus() === 'connecting' + ) { + await waitForOpenConnection(web3, currentAttempt); + } + + if (web3?.provider) { + (web3.provider as unknown as Web3BaseProvider).disconnect(1000, ''); + } + } + }); + + it('should be send transaction, change for defaultTransactionType and successfully send transaction with different type', async () => { + const transaction = { + from: accounts[0], + to: accounts[0], + value: 100000, + } + + const receipt = await web3.eth.sendTransaction(transaction); + expect(receipt.type).toEqual(BigInt(2)) + + web3.setConfig({defaultTransactionType: "0x0"}); + + const receipt2 = await web3.eth.sendTransaction(transaction); + expect(receipt2.type).toEqual(BigInt(0)) + }) +}) \ No newline at end of file diff --git a/packages/web3/test/integration/web3.eth.transaction.test.ts b/packages/web3/test/integration/web3.eth.transaction.test.ts new file mode 100644 index 00000000000..3a33984a9e9 --- /dev/null +++ b/packages/web3/test/integration/web3.eth.transaction.test.ts @@ -0,0 +1,121 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import * as httpProvider from 'web3-providers-http'; +import { Web3Account } from 'web3-eth-accounts'; +import Web3, { DEFAULT_RETURN_FORMAT, Transaction } from '../../src'; +import testsData from '../fixtures/transactions.json'; + +jest.mock('web3-providers-http'); + +describe('signTransaction', () => { + let blockNum = 1; + + it.each(testsData)( + 'Integration test of transaction %s with Web3, Web3.Eth, Web3.Accounts and Provider should pass', + async txObj => { + const web3: Web3 = new Web3('http://127.0.0.1:8080'); + + const account: Web3Account = web3.eth.accounts.privateKeyToAccount(txObj.privateKey); + + web3.eth.wallet?.add(txObj.privateKey); + + const normalTx: Transaction = { + ...txObj.transaction, + from: account.address, + }; + + // either make it legacy or type 0x2 tx, instead of keeping both gasPrice and (maxPriorityFeePerGas maxFeePerGas) + if (txObj.transaction?.maxPriorityFeePerGas) { + delete normalTx['gasPrice']; + } else { + delete normalTx['maxPriorityFeePerGas']; + delete normalTx['maxFeePerGas']; + } + + jest.spyOn(httpProvider.HttpProvider.prototype, 'request').mockImplementation( + async (payload: any) => { + const response = { + jsonrpc: '2.0', + id: payload.id, + result: {}, + }; + + switch (payload.method) { + case 'net_version': + response.result = '1'; + break; + + case 'eth_chainId': + response.result = '0x1'; + break; + + case 'eth_blockNumber': + blockNum += 10; + response.result = `0x${blockNum.toString(16)}`; + break; + + case 'eth_getTransactionReceipt': + response.result = { + blockHash: + '0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3', + blockNumber: `0x${blockNum.toString(16)}`, + cumulativeGasUsed: '0xa12515', + // "effectiveGasPrice": payload.effectiveGasPrice, + from: payload.from, + gasUsed: payload.gasLimit, + // "logs": [{}], + // "logsBloom": "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3", // 256 byte bloom filter + status: '0x1', + to: payload.to, + transactionHash: + '0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5', + transactionIndex: '0x66', + // "type": payload.type + }; + break; + + case 'eth_sendRawTransaction': + if (txObj.transaction.maxPriorityFeePerGas !== undefined) { + // eslint-disable-next-line jest/no-conditional-expect + expect(payload.params[0]).toBe(txObj.signedLondon); // validate transaction for London HF + } else { + // eslint-disable-next-line jest/no-conditional-expect + expect(payload.params[0]).toBe(txObj.signedBerlin); // validate transaction for Berlin HF + } + response.result = + '0x895ebb29d30e0afa891a5ca3a2687e073bd2c7ab544117ac386c8d8ff3ad583b'; + break; + + default: + throw new Error(`Unknown payload ${payload}`); + } + + return new Promise(resolve => { + resolve(response as any); + }); + }, + ); + + const res = await web3.eth.sendTransaction(normalTx, DEFAULT_RETURN_FORMAT, { + ignoreGasPricing: true, + checkRevertBeforeSending: false, + }); + expect(res).toBeDefined(); + }, + ); +}); diff --git a/packages/web3/test/integration/web3.setProvider.test.ts b/packages/web3/test/integration/web3.setProvider.test.ts new file mode 100644 index 00000000000..6853ddaa8db --- /dev/null +++ b/packages/web3/test/integration/web3.setProvider.test.ts @@ -0,0 +1,80 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import Web3 from '../../src/index'; +import { + closeOpenConnection, + describeIf, + getSystemTestProviderUrl, + isHttp, + isWs, + waitForOpenConnection, +} from '../shared_fixtures/system_tests_utils'; + +describeIf(isWs || isHttp)('web3.contract.setProvider', () => { + let clientUrl: string; + let secontUrl: string; + let web3: Web3; + + beforeAll(async () => { + clientUrl = getSystemTestProviderUrl(); + secontUrl = clientUrl.startsWith('http') + ? clientUrl.replace('http', 'ws') + : clientUrl.replace('ws', 'http'); + web3 = new Web3(clientUrl); + + await waitForOpenConnection(web3); + }); + + afterAll(async () => { + await closeOpenConnection(web3); + }); + + test('create few contracts and check providers', () => { + const c1 = new web3.eth.Contract([]); + const c2 = new web3.eth.Contract([]); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + }); + + test('create few contracts and check providers. set different provider', () => { + const c1 = new web3.eth.Contract([]); + const c2 = new web3.eth.Contract([]); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + + web3.setProvider(secontUrl); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + }); + + test('create few contracts, set different provider to contract and check other contract', () => { + const c1 = new web3.eth.Contract([]); + const c2 = new web3.eth.Contract([]); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + + c1.setProvider(secontUrl); + + expect(c1.provider).toBe(web3.provider); + expect(c2.provider).toBe(web3.provider); + }); +}); diff --git a/packages/web3/test/integration/web3.test.ts b/packages/web3/test/integration/web3.test.ts new file mode 100644 index 00000000000..18a49dd0fcc --- /dev/null +++ b/packages/web3/test/integration/web3.test.ts @@ -0,0 +1,342 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import Contract from 'web3-eth-contract'; +import HttpProvider from 'web3-providers-http'; +import { IpcProvider } from 'web3-providers-ipc'; +import WebSocketProvider from 'web3-providers-ws'; +import { JsonRpcOptionalRequest, SupportedProviders, Web3BaseProvider } from 'web3-types'; +import { Web3 } from '../../src/index'; +import { BasicAbi } from '../shared_fixtures/Basic'; +import { GreeterAbi } from '../shared_fixtures/build/Greeter'; +import { validEncodeParametersData } from '../shared_fixtures/data'; +import { + closeOpenConnection, + createTempAccount, + describeIf, + getSystemTestProvider, + getSystemTestProviderUrl, + isHttp, + isIpc, + isSocket, + isWs, + itIf, + waitForOpenConnection +} from '../shared_fixtures/system_tests_utils'; + +/* eslint-disable jest/no-standalone-expect */ + +describe('Web3 instance', () => { + let provider: string | SupportedProviders; + let providerUrl: string; + let accounts: string[]; + let web3: Web3; + let currentAttempt = 0; + + beforeAll(async () => { + provider = getSystemTestProvider(); + providerUrl = getSystemTestProviderUrl(); + const acc1 = await createTempAccount(); + const acc2 = await createTempAccount(); + accounts = [acc1.address, acc2.address]; + }); + afterAll(async () => { + try { + await closeOpenConnection(web3); + } catch (e) { + console.warn("Failed to close open con", e) + } + }); + + beforeEach(() => { + currentAttempt = 0; + }); + + afterEach(async () => { + if (isWs) { + // make sure we try to close the connection after it is established + if ( + web3?.provider && + (web3.provider as unknown as Web3BaseProvider).getStatus() === 'connecting' + ) { + await waitForOpenConnection(web3, currentAttempt); + } + + if (web3?.provider) { + (web3.provider as unknown as Web3BaseProvider).disconnect(1000, ''); + } + } + }); + + it('should be able to create web3 object without provider', () => { + expect(() => new Web3()).not.toThrow(); + }); + + it('check disconnect function', async () => { + const web3Instance = new Web3(provider); + await web3Instance.eth.getBlockNumber(); + expect(typeof web3Instance.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.currentProvider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.currentProvider?.disconnect).toBe('function'); + if (isSocket) { + web3Instance.currentProvider?.disconnect(); + } + }); + itIf(isWs)('check disconnect function for WebSocket provider', async () => { + const web3Instance = new Web3(new WebSocketProvider(providerUrl)); + await web3Instance.eth.getBlockNumber(); + expect(typeof web3Instance.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.currentProvider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.currentProvider?.disconnect).toBe('function'); + web3Instance.currentProvider?.disconnect(); + }); + itIf(isIpc)('check disconnect function for ipc provider', async () => { + const web3Instance = new Web3(new IpcProvider(providerUrl)); + await web3Instance.eth.getBlockNumber(); + expect(typeof web3Instance.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.currentProvider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.currentProvider?.disconnect).toBe('function'); + web3Instance.currentProvider?.disconnect(); + }); + itIf(isHttp)('check disconnect function for http provider', async () => { + const web3Instance = new Web3(new HttpProvider(providerUrl)); + await web3Instance.eth.getBlockNumber(); + expect(typeof web3Instance.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.provider?.disconnect).toBe('function'); + expect(typeof web3Instance.currentProvider?.disconnect).toBe('function'); + expect(typeof web3Instance.eth.currentProvider?.disconnect).toBe('function'); + }); + + it('should be able use "utils" without provider', () => { + web3 = new Web3(); + + expect(web3.utils.hexToNumber('0x5')).toBe(5); + }); + + it('should be able use "abi" without provider', () => { + web3 = new Web3(); + const validData = validEncodeParametersData[0]; + + const encodedParameters = web3.eth.abi.encodeParameters( + validData.input[0], + validData.input[1], + ); + expect(encodedParameters).toEqual(validData.output); + }); + + it('should throw error when we make a request when provider not available', async () => { + web3 = new Web3(); + + await expect(web3.eth.getChainId()).rejects.toThrow('Provider not available'); + }); + + describeIf(isHttp)('Create Web3 class instance with http string providers', () => { + it('should create instance with string provider', () => { + web3 = new Web3(provider); + expect(web3).toBeInstanceOf(Web3); + }); + }); + + describeIf(isWs)('Create Web3 class instance with ws string providers', () => { + it('should create instance with string of ws provider', () => { + web3 = new Web3(provider); + expect(web3).toBeInstanceOf(Web3); + }); + }); + + describe('Web3 providers', () => { + it('should set the provider with `.provider=`', async () => { + web3 = new Web3('http://dummy.com'); + + web3.provider = provider; + + expect(web3).toBeInstanceOf(Web3); + if (isWs) { + await waitForOpenConnection(web3, 0); + } + const response = await web3.eth.getBalance(accounts[0]); + + expect(response).toEqual(expect.any(BigInt)); + }); + + it('should set the provider with `.setProvider`', () => { + let newProvider: Web3BaseProvider; + web3 = new Web3('http://dummy.com'); + if (isHttp) { + newProvider = new Web3.providers.HttpProvider(providerUrl); + } else if (isWs) { + newProvider = new Web3.providers.WebsocketProvider(providerUrl); + } else { + newProvider = new IpcProvider(providerUrl); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + web3.setProvider(newProvider as SupportedProviders); + + expect(web3.provider).toBe(newProvider); + }); + + it('should set the provider with `.setProvider` of empty initialized object', async () => { + web3 = new Web3(); + + web3.setProvider(getSystemTestProvider()); + + await expect(web3.eth.getChainId()).resolves.toBeDefined(); + }); + + it('should set the provider with `.provider=` of empty initialized object', async () => { + web3 = new Web3(); + + web3.provider = getSystemTestProvider(); + + await expect(web3.eth.getChainId()).resolves.toBeDefined(); + }); + + it('should unset the provider with `.setProvider`', async () => { + web3 = new Web3(getSystemTestProvider()); + await expect(web3.eth.getChainId()).resolves.toBeDefined(); + + web3.setProvider(undefined); + await expect(web3.eth.getChainId()).rejects.toThrow('Provider not available'); + }); + + it('should unset the provider with `.provider=`', async () => { + web3 = new Web3(getSystemTestProvider()); + await expect(web3.eth.getChainId()).resolves.toBeDefined(); + + web3.provider = undefined; + await expect(web3.eth.getChainId()).rejects.toThrow('Provider not available'); + }); + + it('providers', () => { + const res = Web3.providers; + + expect(Web3.providers.HttpProvider).toBe(HttpProvider); + expect(res.WebsocketProvider).toBe(WebSocketProvider); + }); + + it('currentProvider', () => { + web3 = new Web3(provider); + + let checkWithClass; + if (isWs) { + checkWithClass = Web3.providers.WebsocketProvider; + } else if (isHttp) { + checkWithClass = Web3.providers.HttpProvider; + } else { + checkWithClass = IpcProvider; + } + expect(web3.currentProvider).toBeInstanceOf(checkWithClass); + }); + + it('givenProvider', () => { + const { givenProvider } = web3; + expect(givenProvider).toBeUndefined(); + }); + }); + + describe('Module instantiations', () => { + it('should create contract', () => { + const basicContract = new web3.eth.Contract(BasicAbi); + expect(basicContract).toBeInstanceOf(Contract); + }); + }); + + // TODO: remove describeIf when finish #5144 + describeIf(!isIpc)('Batch Request', () => { + let request1: JsonRpcOptionalRequest; + let request2: JsonRpcOptionalRequest; + beforeEach(() => { + request1 = { + id: 10, + method: 'eth_getBalance', + params: [accounts[0], 'latest'], + }; + request2 = { + id: 11, + method: 'eth_getBalance', + params: [accounts[1], 'latest'], + }; + }); + + it('should execute batch requests', async () => { + web3 = new Web3(provider); + if (isWs) { + await waitForOpenConnection(web3, 0); + } + const batch = new web3.BatchRequest(); + + const request1Promise = batch.add(request1); + const request2Promise = batch.add(request2); + + const executePromise = batch.execute(); + const response = await Promise.all([request1Promise, request2Promise, executePromise]); + expect(response[0]).toEqual(expect.stringMatching(/0[xX][0-9a-fA-F]+/)); + expect(response[1]).toEqual(expect.stringMatching(/0[xX][0-9a-fA-F]+/)); + + expect(response[2]).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: request1.id, + result: response[0], + }), + expect.objectContaining({ + id: request2.id, + result: response[1], + }), + ]), + ); + }); + }); + + describe('defaults', () => { + let contract: Contract; + + beforeAll(() => { + web3 = new Web3(provider); + }); + + afterAll(() => { + try { + web3.provider?.disconnect(); + } catch (e) { + // ignored + } + }) + + it('should update defaults on contract instance', () => { + const hardfork = 'berlin'; + + contract = new web3.eth.Contract(GreeterAbi, undefined, { + provider: getSystemTestProvider(), + syncWithContext: true, + }); + + web3.defaultHardfork = hardfork; + + expect(contract.defaultHardfork).toBe(hardfork); + try { + contract.provider?.disconnect(); + } catch (e) { + // ignored + } + }); + + }); +}); diff --git a/packages/web3/test/integration/ws.test.ts b/packages/web3/test/integration/ws.test.ts new file mode 100644 index 00000000000..7a11403fb32 --- /dev/null +++ b/packages/web3/test/integration/ws.test.ts @@ -0,0 +1,43 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { WebSocketProvider } from 'web3-providers-ws'; +import { + describeIf, getSystemTestProvider, isWs, +} from '../shared_fixtures/system_tests_utils'; +import Web3 from '../../src/index'; + + + +describe('Web3 instance', () => { + let web3: Web3; + + beforeEach(() => { + const provider = getSystemTestProvider(); + web3 = new Web3(provider); + }); + + describeIf(isWs)('web3 ws tests', () => { + it('should connect and disconnect using safe disconnect subscription successfully', async () => { + const subscription = await web3.eth.subscribe("newBlockHeaders"); + // eslint-disable-next-line + subscription.unsubscribe(); + // eslint-disable-next-line + await expect((web3.currentProvider as WebSocketProvider).safeDisconnect()).resolves.not.toThrow(); + }); + }); +}); \ No newline at end of file diff --git a/packages/web3/test/shared_fixtures/Basic.ts b/packages/web3/test/shared_fixtures/Basic.ts new file mode 120000 index 00000000000..66f39e5cacc --- /dev/null +++ b/packages/web3/test/shared_fixtures/Basic.ts @@ -0,0 +1 @@ +../../../../fixtures/build/Basic.ts \ No newline at end of file diff --git a/packages/web3/test/shared_fixtures/Greeter.ts b/packages/web3/test/shared_fixtures/Greeter.ts new file mode 120000 index 00000000000..21eaea8e5e9 --- /dev/null +++ b/packages/web3/test/shared_fixtures/Greeter.ts @@ -0,0 +1 @@ +../../../../fixtures/build/Greeter.ts \ No newline at end of file diff --git a/packages/web3/test/shared_fixtures/accounts.json b/packages/web3/test/shared_fixtures/accounts.json new file mode 120000 index 00000000000..7dbcddb60a2 --- /dev/null +++ b/packages/web3/test/shared_fixtures/accounts.json @@ -0,0 +1 @@ +../../../../scripts/accounts.json \ No newline at end of file diff --git a/packages/web3/test/shared_fixtures/build b/packages/web3/test/shared_fixtures/build new file mode 120000 index 00000000000..0e47c00b882 --- /dev/null +++ b/packages/web3/test/shared_fixtures/build @@ -0,0 +1 @@ +../../../../fixtures/build \ No newline at end of file diff --git a/packages/web3/test/shared_fixtures/contracts/ERC20Token.ts b/packages/web3/test/shared_fixtures/contracts/ERC20Token.ts new file mode 100644 index 00000000000..b13578a62d1 --- /dev/null +++ b/packages/web3/test/shared_fixtures/contracts/ERC20Token.ts @@ -0,0 +1,141 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const ERC20TokenAbi = [ + { + inputs: [{ internalType: 'uint256', name: 'initialSupply', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'spender', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'address', name: 'spender', type: 'address' }, + ], + name: 'allowance', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'approve', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'decimals', + outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'subtractedValue', type: 'uint256' }, + ], + name: 'decreaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'addedValue', type: 'uint256' }, + ], + name: 'increaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const ERC20TokenBytecode = + '0x60806040523480156200001157600080fd5b50604051620017a8380380620017a8833981810160405281019062000037919062000362565b6040518060400160405280600481526020017f476f6c64000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474c4400000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000bb92919062000272565b508060049080519060200190620000d492919062000272565b505050620000e93382620000f060201b60201c565b5062000535565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000162576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200015990620003f5565b60405180910390fd5b62000176600083836200026860201b60201c565b80600260008282546200018a919062000446565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001e1919062000446565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002489190620004b4565b60405180910390a362000264600083836200026d60201b60201c565b5050565b505050565b505050565b828054620002809062000500565b90600052602060002090601f016020900481019282620002a45760008555620002f0565b82601f10620002bf57805160ff1916838001178555620002f0565b82800160010185558215620002f0579182015b82811115620002ef578251825591602001919060010190620002d2565b5b509050620002ff919062000303565b5090565b5b808211156200031e57600081600090555060010162000304565b5090565b600080fd5b6000819050919050565b6200033c8162000327565b81146200034857600080fd5b50565b6000815190506200035c8162000331565b92915050565b6000602082840312156200037b576200037a62000322565b5b60006200038b848285016200034b565b91505092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620003dd601f8362000394565b9150620003ea82620003a5565b602082019050919050565b600060208201905081810360008301526200041081620003ce565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004538262000327565b9150620004608362000327565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000498576200049762000417565b5b828201905092915050565b620004ae8162000327565b82525050565b6000602082019050620004cb6000830184620004a3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200051957607f821691505b6020821081036200052f576200052e620004d1565b5b50919050565b61126380620005456000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b1e565b60405180910390f35b6100e660048036038101906100e19190610bd9565b610308565b6040516100f39190610c34565b60405180910390f35b61010461032b565b6040516101119190610c5e565b60405180910390f35b610134600480360381019061012f9190610c79565b610335565b6040516101419190610c34565b60405180910390f35b610152610364565b60405161015f9190610ce8565b60405180910390f35b610182600480360381019061017d9190610bd9565b61036d565b60405161018f9190610c34565b60405180910390f35b6101b260048036038101906101ad9190610d03565b6103a4565b6040516101bf9190610c5e565b60405180910390f35b6101d06103ec565b6040516101dd9190610b1e565b60405180910390f35b61020060048036038101906101fb9190610bd9565b61047e565b60405161020d9190610c34565b60405180910390f35b610230600480360381019061022b9190610bd9565b6104f5565b60405161023d9190610c34565b60405180910390f35b610260600480360381019061025b9190610d30565b610518565b60405161026d9190610c5e565b60405180910390f35b60606003805461028590610d9f565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d9f565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610dff565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d9f565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d9f565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610ec7565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610feb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c5e565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611057565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d19061117b565b60405180910390fd5b6108e5838383610a7b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109629061120d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109fe9190610dff565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a629190610c5e565b60405180910390a3610a75848484610a80565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abf578082015181840152602081019050610aa4565b83811115610ace576000848401525b50505050565b6000601f19601f8301169050919050565b6000610af082610a85565b610afa8185610a90565b9350610b0a818560208601610aa1565b610b1381610ad4565b840191505092915050565b60006020820190508181036000830152610b388184610ae5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b7082610b45565b9050919050565b610b8081610b65565b8114610b8b57600080fd5b50565b600081359050610b9d81610b77565b92915050565b6000819050919050565b610bb681610ba3565b8114610bc157600080fd5b50565b600081359050610bd381610bad565b92915050565b60008060408385031215610bf057610bef610b40565b5b6000610bfe85828601610b8e565b9250506020610c0f85828601610bc4565b9150509250929050565b60008115159050919050565b610c2e81610c19565b82525050565b6000602082019050610c496000830184610c25565b92915050565b610c5881610ba3565b82525050565b6000602082019050610c736000830184610c4f565b92915050565b600080600060608486031215610c9257610c91610b40565b5b6000610ca086828701610b8e565b9350506020610cb186828701610b8e565b9250506040610cc286828701610bc4565b9150509250925092565b600060ff82169050919050565b610ce281610ccc565b82525050565b6000602082019050610cfd6000830184610cd9565b92915050565b600060208284031215610d1957610d18610b40565b5b6000610d2784828501610b8e565b91505092915050565b60008060408385031215610d4757610d46610b40565b5b6000610d5585828601610b8e565b9250506020610d6685828601610b8e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610db757607f821691505b602082108103610dca57610dc9610d70565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e0a82610ba3565b9150610e1583610ba3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610e4a57610e49610dd0565b5b828201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610eb1602583610a90565b9150610ebc82610e55565b604082019050919050565b60006020820190508181036000830152610ee081610ea4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f43602483610a90565b9150610f4e82610ee7565b604082019050919050565b60006020820190508181036000830152610f7281610f36565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fd5602283610a90565b9150610fe082610f79565b604082019050919050565b6000602082019050818103600083015261100481610fc8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611041601d83610a90565b915061104c8261100b565b602082019050919050565b6000602082019050818103600083015261107081611034565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006110d3602583610a90565b91506110de82611077565b604082019050919050565b60006020820190508181036000830152611102816110c6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611165602383610a90565b915061117082611109565b604082019050919050565b6000602082019050818103600083015261119481611158565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111f7602683610a90565b91506112028261119b565b604082019050919050565b60006020820190508181036000830152611226816111ea565b905091905056fea264697066735822122039c50588d39e359807efa398bd1b3aff1b082ef738dddcfa8475048e11f9024e64736f6c634300080d0033'; diff --git a/packages/web3/test/shared_fixtures/contracts/ERC721Token.ts b/packages/web3/test/shared_fixtures/contracts/ERC721Token.ts new file mode 100644 index 00000000000..e5891dbe3f0 --- /dev/null +++ b/packages/web3/test/shared_fixtures/contracts/ERC721Token.ts @@ -0,0 +1,174 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const ERC721TokenAbi = [ + { inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'approved', type: 'address' }, + { indexed: true, internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'operator', type: 'address' }, + { indexed: false, internalType: 'bool', name: 'approved', type: 'bool' }, + ], + name: 'ApprovalForAll', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: true, internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'approve', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'player', type: 'address' }, + { internalType: 'string', name: 'tokenURI', type: 'string' }, + ], + name: 'awardItem', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'owner', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'getApproved', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'address', name: 'operator', type: 'address' }, + ], + name: 'isApprovedForAll', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'ownerOf', + outputs: [{ internalType: 'address', name: '', type: 'address' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + { internalType: 'bytes', name: '_data', type: 'bytes' }, + ], + name: 'safeTransferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'operator', type: 'address' }, + { internalType: 'bool', name: 'approved', type: 'bool' }, + ], + name: 'setApprovalForAll', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }], + name: 'supportsInterface', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }], + name: 'tokenURI', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'tokenId', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const ERC721TokenBytecode = + '0x60806040523480156200001157600080fd5b506040518060400160405280600881526020017f47616d654974656d0000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f49544d0000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620000b8565b508060019080519060200190620000af929190620000b8565b505050620001cc565b828054620000c69062000197565b90600052602060002090601f016020900481019282620000ea576000855562000136565b82601f106200010557805160ff191683800117855562000136565b8280016001018555821562000136579182015b828111156200013557825182559160200191906001019062000118565b5b50905062000145919062000149565b5090565b5b80821115620001645760008160009055506001016200014a565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001b057607f821691505b602082108103620001c657620001c562000168565b5b50919050565b612bb680620001dc6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063cf378343146102a7578063e985e9c5146102d7576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b6101096004803603810190610104919061191a565b610307565b6040516101169190611962565b60405180910390f35b6101276103e9565b6040516101349190611a16565b60405180910390f35b61015760048036038101906101529190611a6e565b61047b565b6040516101649190611adc565b60405180910390f35b61018760048036038101906101829190611b23565b610500565b005b6101a3600480360381019061019e9190611b63565b610617565b005b6101bf60048036038101906101ba9190611b63565b610677565b005b6101db60048036038101906101d69190611a6e565b610697565b6040516101e89190611adc565b60405180910390f35b61020b60048036038101906102069190611bb6565b610748565b6040516102189190611bf2565b60405180910390f35b6102296107ff565b6040516102369190611a16565b60405180910390f35b61025960048036038101906102549190611c39565b610891565b005b61027560048036038101906102709190611dae565b6108a7565b005b610291600480360381019061028c9190611a6e565b610909565b60405161029e9190611a16565b60405180910390f35b6102c160048036038101906102bc9190611ed2565b610a5a565b6040516102ce9190611bf2565b60405180910390f35b6102f160048036038101906102ec9190611f2e565b610a91565b6040516102fe9190611962565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103d257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103e257506103e182610b25565b5b9050919050565b6060600080546103f890611f9d565b80601f016020809104026020016040519081016040528092919081815260200182805461042490611f9d565b80156104715780601f1061044657610100808354040283529160200191610471565b820191906000526020600020905b81548152906001019060200180831161045457829003601f168201915b5050505050905090565b600061048682610b8f565b6104c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104bc90612040565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061050b82610697565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361057b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610572906120d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661059a610bfb565b73ffffffffffffffffffffffffffffffffffffffff1614806105c957506105c8816105c3610bfb565b610a91565b5b610608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612164565b60405180910390fd5b6106128383610c03565b505050565b610628610622610bfb565b82610cbc565b610667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065e906121f6565b60405180910390fd5b610672838383610d9a565b505050565b610692838383604051806020016040528060008152506108a7565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073690612288565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107af9061231a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461080e90611f9d565b80601f016020809104026020016040519081016040528092919081815260200182805461083a90611f9d565b80156108875780601f1061085c57610100808354040283529160200191610887565b820191906000526020600020905b81548152906001019060200180831161086a57829003601f168201915b5050505050905090565b6108a361089c610bfb565b8383611000565b5050565b6108b86108b2610bfb565b83610cbc565b6108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee906121f6565b60405180910390fd5b6109038484848461116c565b50505050565b606061091482610b8f565b610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094a906123ac565b60405180910390fd5b600060066000848152602001908152602001600020805461097390611f9d565b80601f016020809104026020016040519081016040528092919081815260200182805461099f90611f9d565b80156109ec5780601f106109c1576101008083540402835291602001916109ec565b820191906000526020600020905b8154815290600101906020018083116109cf57829003601f168201915b5050505050905060006109fd6111c8565b90506000815103610a12578192505050610a55565b600082511115610a47578082604051602001610a2f929190612408565b60405160208183030381529060405292505050610a55565b610a50846111df565b925050505b919050565b600080610a676007611286565b9050610a738482611294565b610a7d818461146d565b610a8760076114e1565b8091505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610c7683610697565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610cc782610b8f565b610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd9061249e565b60405180910390fd5b6000610d1183610697565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610d535750610d528185610a91565b5b80610d9157508373ffffffffffffffffffffffffffffffffffffffff16610d798461047b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610dba82610697565b73ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790612530565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e76906125c2565b60405180910390fd5b610e8a8383836114f7565b610e95600082610c03565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ee59190612611565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f3c9190612645565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ffb8383836114fc565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611065906126e7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161115f9190611962565b60405180910390a3505050565b611177848484610d9a565b61118384848484611501565b6111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990612779565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606111ea82610b8f565b611229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112209061280b565b60405180910390fd5b60006112336111c8565b90506000815111611253576040518060200160405280600081525061127e565b8061125d84611688565b60405160200161126e929190612408565b6040516020818303038152906040525b915050919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90612877565b60405180910390fd5b61130c81610b8f565b1561134c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611343906128e3565b60405180910390fd5b611358600083836114f7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a89190612645565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611469600083836114fc565b5050565b61147682610b8f565b6114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90612975565b60405180910390fd5b806006600084815260200190815260200160002090805190602001906114dc92919061180b565b505050565b6001816000016000828254019250508190555050565b505050565b505050565b60006115228473ffffffffffffffffffffffffffffffffffffffff166117e8565b1561167b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261154b610bfb565b8786866040518563ffffffff1660e01b815260040161156d94939291906129ea565b6020604051808303816000875af19250505080156115a957506040513d601f19601f820116820180604052508101906115a69190612a4b565b60015b61162b573d80600081146115d9576040519150601f19603f3d011682016040523d82523d6000602084013e6115de565b606091505b506000815103611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90612779565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611680565b600190505b949350505050565b6060600082036116cf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506117e3565b600082905060005b600082146117015780806116ea90612a78565b915050600a826116fa9190612aef565b91506116d7565b60008167ffffffffffffffff81111561171d5761171c611c83565b5b6040519080825280601f01601f19166020018201604052801561174f5781602001600182028036833780820191505090505b5090505b600085146117dc576001826117689190612611565b9150600a856117779190612b20565b60306117839190612645565b60f81b81838151811061179957611798612b51565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856117d59190612aef565b9450611753565b8093505050505b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461181790611f9d565b90600052602060002090601f0160209004810192826118395760008555611880565b82601f1061185257805160ff1916838001178555611880565b82800160010185558215611880579182015b8281111561187f578251825591602001919060010190611864565b5b50905061188d9190611891565b5090565b5b808211156118aa576000816000905550600101611892565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118f7816118c2565b811461190257600080fd5b50565b600081359050611914816118ee565b92915050565b6000602082840312156119305761192f6118b8565b5b600061193e84828501611905565b91505092915050565b60008115159050919050565b61195c81611947565b82525050565b60006020820190506119776000830184611953565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156119b757808201518184015260208101905061199c565b838111156119c6576000848401525b50505050565b6000601f19601f8301169050919050565b60006119e88261197d565b6119f28185611988565b9350611a02818560208601611999565b611a0b816119cc565b840191505092915050565b60006020820190508181036000830152611a3081846119dd565b905092915050565b6000819050919050565b611a4b81611a38565b8114611a5657600080fd5b50565b600081359050611a6881611a42565b92915050565b600060208284031215611a8457611a836118b8565b5b6000611a9284828501611a59565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ac682611a9b565b9050919050565b611ad681611abb565b82525050565b6000602082019050611af16000830184611acd565b92915050565b611b0081611abb565b8114611b0b57600080fd5b50565b600081359050611b1d81611af7565b92915050565b60008060408385031215611b3a57611b396118b8565b5b6000611b4885828601611b0e565b9250506020611b5985828601611a59565b9150509250929050565b600080600060608486031215611b7c57611b7b6118b8565b5b6000611b8a86828701611b0e565b9350506020611b9b86828701611b0e565b9250506040611bac86828701611a59565b9150509250925092565b600060208284031215611bcc57611bcb6118b8565b5b6000611bda84828501611b0e565b91505092915050565b611bec81611a38565b82525050565b6000602082019050611c076000830184611be3565b92915050565b611c1681611947565b8114611c2157600080fd5b50565b600081359050611c3381611c0d565b92915050565b60008060408385031215611c5057611c4f6118b8565b5b6000611c5e85828601611b0e565b9250506020611c6f85828601611c24565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611cbb826119cc565b810181811067ffffffffffffffff82111715611cda57611cd9611c83565b5b80604052505050565b6000611ced6118ae565b9050611cf98282611cb2565b919050565b600067ffffffffffffffff821115611d1957611d18611c83565b5b611d22826119cc565b9050602081019050919050565b82818337600083830152505050565b6000611d51611d4c84611cfe565b611ce3565b905082815260208101848484011115611d6d57611d6c611c7e565b5b611d78848285611d2f565b509392505050565b600082601f830112611d9557611d94611c79565b5b8135611da5848260208601611d3e565b91505092915050565b60008060008060808587031215611dc857611dc76118b8565b5b6000611dd687828801611b0e565b9450506020611de787828801611b0e565b9350506040611df887828801611a59565b925050606085013567ffffffffffffffff811115611e1957611e186118bd565b5b611e2587828801611d80565b91505092959194509250565b600067ffffffffffffffff821115611e4c57611e4b611c83565b5b611e55826119cc565b9050602081019050919050565b6000611e75611e7084611e31565b611ce3565b905082815260208101848484011115611e9157611e90611c7e565b5b611e9c848285611d2f565b509392505050565b600082601f830112611eb957611eb8611c79565b5b8135611ec9848260208601611e62565b91505092915050565b60008060408385031215611ee957611ee86118b8565b5b6000611ef785828601611b0e565b925050602083013567ffffffffffffffff811115611f1857611f176118bd565b5b611f2485828601611ea4565b9150509250929050565b60008060408385031215611f4557611f446118b8565b5b6000611f5385828601611b0e565b9250506020611f6485828601611b0e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611fb557607f821691505b602082108103611fc857611fc7611f6e565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061202a602c83611988565b915061203582611fce565b604082019050919050565b600060208201905081810360008301526120598161201d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006120bc602183611988565b91506120c782612060565b604082019050919050565b600060208201905081810360008301526120eb816120af565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061214e603883611988565b9150612159826120f2565b604082019050919050565b6000602082019050818103600083015261217d81612141565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006121e0603183611988565b91506121eb82612184565b604082019050919050565b6000602082019050818103600083015261220f816121d3565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612272602983611988565b915061227d82612216565b604082019050919050565b600060208201905081810360008301526122a181612265565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612304602a83611988565b915061230f826122a8565b604082019050919050565b60006020820190508181036000830152612333816122f7565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b6000612396603183611988565b91506123a18261233a565b604082019050919050565b600060208201905081810360008301526123c581612389565b9050919050565b600081905092915050565b60006123e28261197d565b6123ec81856123cc565b93506123fc818560208601611999565b80840191505092915050565b600061241482856123d7565b915061242082846123d7565b91508190509392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612488602c83611988565b91506124938261242c565b604082019050919050565b600060208201905081810360008301526124b78161247b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061251a602583611988565b9150612525826124be565b604082019050919050565b600060208201905081810360008301526125498161250d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125ac602483611988565b91506125b782612550565b604082019050919050565b600060208201905081810360008301526125db8161259f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061261c82611a38565b915061262783611a38565b92508282101561263a576126396125e2565b5b828203905092915050565b600061265082611a38565b915061265b83611a38565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156126905761268f6125e2565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006126d1601983611988565b91506126dc8261269b565b602082019050919050565b60006020820190508181036000830152612700816126c4565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612763603283611988565b915061276e82612707565b604082019050919050565b6000602082019050818103600083015261279281612756565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006127f5602f83611988565b915061280082612799565b604082019050919050565b60006020820190508181036000830152612824816127e8565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612861602083611988565b915061286c8261282b565b602082019050919050565b6000602082019050818103600083015261289081612854565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006128cd601c83611988565b91506128d882612897565b602082019050919050565b600060208201905081810360008301526128fc816128c0565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b600061295f602e83611988565b915061296a82612903565b604082019050919050565b6000602082019050818103600083015261298e81612952565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006129bc82612995565b6129c681856129a0565b93506129d6818560208601611999565b6129df816119cc565b840191505092915050565b60006080820190506129ff6000830187611acd565b612a0c6020830186611acd565b612a196040830185611be3565b8181036060830152612a2b81846129b1565b905095945050505050565b600081519050612a45816118ee565b92915050565b600060208284031215612a6157612a606118b8565b5b6000612a6f84828501612a36565b91505092915050565b6000612a8382611a38565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ab557612ab46125e2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612afa82611a38565b9150612b0583611a38565b925082612b1557612b14612ac0565b5b828204905092915050565b6000612b2b82611a38565b9150612b3683611a38565b925082612b4657612b45612ac0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212201d5bf152bd3c08a2f94fc5923da9ecbb5197e3afa514c296a8686031f251632764736f6c634300080d0033'; diff --git a/packages/web3/test/shared_fixtures/data.ts b/packages/web3/test/shared_fixtures/data.ts new file mode 100644 index 00000000000..20f19bd5e80 --- /dev/null +++ b/packages/web3/test/shared_fixtures/data.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { encodeParameters } from 'web3-eth-abi'; + +export const validEncodeParametersData: { + input: Parameters; + output: ReturnType; +}[] = [ + { + input: [ + ['uint256', 'string'], + ['2345675643', 'Hello!%'], + ], + output: '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000', + }, + { + input: [ + ['uint', 'tuple(uint256, string)'], + [1234, [5678, 'Hello World']], + ], + output: '', + }, +]; diff --git a/packages/web3/test/shared_fixtures/system_tests_utils.ts b/packages/web3/test/shared_fixtures/system_tests_utils.ts new file mode 120000 index 00000000000..2ab08a83752 --- /dev/null +++ b/packages/web3/test/shared_fixtures/system_tests_utils.ts @@ -0,0 +1 @@ +../../../../scripts/system_tests_utils.ts \ No newline at end of file diff --git a/packages/web3/test/shared_fixtures/utils.ts b/packages/web3/test/shared_fixtures/utils.ts new file mode 120000 index 00000000000..e928d1c9917 --- /dev/null +++ b/packages/web3/test/shared_fixtures/utils.ts @@ -0,0 +1 @@ +../../../../fixtures/utils.ts \ No newline at end of file diff --git a/packages/web3/test/stress/data.test.ts b/packages/web3/test/stress/data.test.ts new file mode 100644 index 00000000000..e7bc4915369 --- /dev/null +++ b/packages/web3/test/stress/data.test.ts @@ -0,0 +1,72 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable */ +import { Web3 } from 'web3'; +import WebSocketProvider from 'web3-providers-ws'; +import accounts from '../../../../scripts/accounts.json'; +import { BasicAbi, BasicBytecode } from '../../../../fixtures/build/Basic'; +import { getSystemTestProvider, isWs, isIpc } from '../shared_fixtures/system_tests_utils'; + +const DATA_AMOUNT = 50 * 1024; // 50 kB + +const sendAndGetData = async (web3: Web3, i: number) => { + const sendOptions = { from: accounts[i].address }; + const deployOptions = { + data: BasicBytecode, + arguments: [0, ''] as [number, string], + gasPrice: await web3.eth.getGasPrice(), + gas: BigInt(9000000000000), + gasLimit: BigInt(9000000000000), + type: BigInt(0), + }; + const c = new web3.eth.Contract(BasicAbi); + const contract = await c.deploy(deployOptions).send(sendOptions); + + await expect( + contract.methods + .setValues(1, 'A'.repeat(DATA_AMOUNT), true) + .send({ from: accounts[i].address }), + ).resolves.toBeDefined(); + + await expect(contract.methods.getStringValue().call()).resolves.toBe('A'.repeat(DATA_AMOUNT)); +}; + +describe('huge data', () => { + let web3: Web3; + beforeAll(() => { + web3 = new Web3(getSystemTestProvider()); + }); + afterAll(() => { + if (isWs || isIpc) { + (web3.provider as unknown as WebSocketProvider).disconnect(); + } + }); + + it('send and get large data', async () => { + for (const a of accounts) { + const acc = web3.eth.accounts.privateKeyToAccount(a.privateKey); + web3.eth.accounts.wallet.add(acc); + } + + const prs = []; + for (let i = 0; i < 15; i++) { + prs.push(sendAndGetData(web3, i)); + } + await expect(Promise.all(prs)).resolves.toBeDefined(); + }); +}); diff --git a/packages/web3/test/stress/jest.config.js b/packages/web3/test/stress/jest.config.js new file mode 100644 index 00000000000..de1e19d4ace --- /dev/null +++ b/packages/web3/test/stress/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/stress/setup.js'], + testMatch: ['/test/stress/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/packages/web3/test/stress/long_ws_tests/browser_test/connection.html b/packages/web3/test/stress/long_ws_tests/browser_test/connection.html new file mode 100644 index 00000000000..8b3c8c346fd --- /dev/null +++ b/packages/web3/test/stress/long_ws_tests/browser_test/connection.html @@ -0,0 +1,94 @@ + + + + + + Manual browser tests + + + + + +

Manual browser test - for this test you will need to provide an ws infura endpoint in this html page. This will test the web3js ws provider by sending a request every 10 minutes for 10 hours

+

Have this html test open in a browser of your choice

+

Keep dev console open in case of any unintended errors occur

+ +

Start time:

+ + +

End Time:

+ + +

Number of requests sent:

+ + +

Has ran for minutes

+ + +

Block number:

+ + +

Result:

+ + + + + + + + diff --git a/packages/web3/test/stress/long_ws_tests/nodejs_test/long_connection_ws.js b/packages/web3/test/stress/long_ws_tests/nodejs_test/long_connection_ws.js new file mode 100644 index 00000000000..6d7a60a04cb --- /dev/null +++ b/packages/web3/test/stress/long_ws_tests/nodejs_test/long_connection_ws.js @@ -0,0 +1,70 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +/* eslint-disable */ +const { Web3 } = require('../../../../lib/commonjs'); +const secrets = require('../../../../../../.secrets.json'); + +let web3; +let attempt = 0; +let intervalId; +let start; +let end; + +// constantly send requests through WS for 10 hours +const sendRequests = () => { + start = new Date(); + console.log("start:",start) + return new Promise((resolve, reject) => { + // send a request in intervals of 10 minutes + intervalId = setInterval( async() => { + try{ + const block = await web3.eth.getBlock() + attempt++; + console.log(block) + console.log("successful calls:", attempt, "has ran for:", attempt*10, "minutes") + if (attempt === 144) { // after 10 hours + clearInterval(intervalId); + resolve(""); + } + } catch (error) { + clearInterval(intervalId); + reject(error); + } + },600000) // every 10 minutes + }) + +} + +const main = async () => { + + try { + // You will need to set mainnet infura provider + const provider = secrets.MAINNET.WS; + web3 = new Web3(provider); + const promise = sendRequests(); + await promise; + end = new Date(); + console.log("websocket test successful") + } catch (e) { + console.warn("error occurred during ws test, on attempt: ", attempt, "program ran for: ", attempt ,"minutes with error: ", e) + } + console.log("start", start) + console.log("end", end) + process.exit(); +} + +main(); diff --git a/packages/web3/test/stress/requests.test.ts b/packages/web3/test/stress/requests.test.ts new file mode 100644 index 00000000000..6b082265674 --- /dev/null +++ b/packages/web3/test/stress/requests.test.ts @@ -0,0 +1,147 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable */ +import WebSocketProvider from 'web3-providers-ws'; +import { Web3Account } from 'web3-eth-accounts'; +import { Web3, Contract, Numbers, EventLog } from 'web3'; +import { BasicBytecode, BasicAbi } from '../../../../fixtures/build/Basic'; +import { isWs, isIpc, getSystemTestProvider } from '../../../../scripts/system_tests_utils'; + +const contracts: { [key: string]: Contract } = {}; + +const deployContracts = async (web3: Web3, accounts: Web3Account[]) => { + const prs = []; + for (let i = 0; i < accounts.length; i++) { + const account = accounts[i]; + const sendOptions = { from: account.address }; + const deployOptions = { + data: BasicBytecode, + arguments: [123, ''] as [number, string], + gas: BigInt(9000000000000), + gasLimit: BigInt(9000000000000), + type: BigInt(0), + }; + const c = new web3.eth.Contract(BasicAbi); + prs.push( + c + .deploy(deployOptions) + .send(sendOptions) + .then((contract: typeof c) => { + contracts[account.address] = contract; + }), + ); + } + await Promise.all(prs); +}; + +const addAccount = async ( + web3: Web3, + mainAcc: string, + address: string, + privateKey: string, + nonce: Numbers, +) => { + web3.eth.accounts.wallet.add(privateKey); + return web3.eth.sendTransaction({ + from: mainAcc, + to: address, + nonce, + gas: 1500000, + value: '1000000000000000000', + }); +}; + +const prepareAccounts = async (web3: Web3, n = 1000) => { + const prs = []; + const list = await web3.eth.personal.getAccounts(); + const mainAcc = list[0]; + const accountList: Web3Account[] = []; + const nonce = await web3.eth.getTransactionCount(mainAcc); + for (let i = 0; i < n; i++) { + const acc = web3.eth.accounts.create(); + prs.push(addAccount(web3, mainAcc, acc.address, acc.privateKey, Number(nonce) + i)); + accountList.push(acc); + } + await Promise.all(prs); + return accountList; +}; + +const sendData = async (account: Web3Account) => { + const contract = contracts[account.address]; + return contract.methods + .firesStringEvent(`String event: ${account.address}`) + .send({ from: account.address }); +}; + +const getData = async (account: Web3Account) => { + const contract = contracts[account.address]; + await contract.methods.getStringValue().call(); +}; + +const receivedEvents: { [key: string]: EventLog } = {}; +const subscribeContract = (acc: Web3Account) => { + const contract = contracts[acc.address]; + const event = contract.events.StringEvent(); + + event.on('data', res => { + if (res.returnValues.str !== `String event: ${acc.address}`) { + throw new Error('Event is not correct'); + } + receivedEvents[acc.address] = res; + }); +}; +const contractSubscriptions = (accounts: Web3Account[]) => { + for (const acc of accounts) { + subscribeContract(acc); + } +}; + +describe('huge data', () => { + let web3: Web3; + let parallelCount = 100; + let accounts: Web3Account[] = []; + beforeAll(async () => { + parallelCount = parallelCount; + web3 = new Web3(getSystemTestProvider()); + accounts = await prepareAccounts(web3, parallelCount); + await deployContracts(web3, accounts); + }); + afterAll(() => { + if (isWs || isIpc) { + (web3.provider as unknown as WebSocketProvider).disconnect(); + } + }); + it('send requests large number of requests', async () => { + const sendPrs = []; + for (let i = 0; i < parallelCount; i++) { + sendPrs.push(sendData(accounts[i])); + } + await expect(Promise.all(sendPrs)).resolves.toBeDefined(); + // if socket subscribe to events + if (isIpc || isWs) { + contractSubscriptions(accounts); + } + }); + it('get requests', async () => { + const getPrs = []; + for (let i = 0; i < parallelCount; i++) { + getPrs.push(getData(accounts[i])); + } + await expect(Promise.all(getPrs)).resolves.toBeDefined(); + }); +}); diff --git a/packages/web3/test/stress/setup.js b/packages/web3/test/stress/setup.js new file mode 100644 index 00000000000..e9757a61e1c --- /dev/null +++ b/packages/web3/test/stress/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 300000; + +jest.setTimeout(jestTimeout); diff --git a/packages/web3/test/stress/validation.test.ts b/packages/web3/test/stress/validation.test.ts new file mode 100644 index 00000000000..7ef7e44ef4c --- /dev/null +++ b/packages/web3/test/stress/validation.test.ts @@ -0,0 +1,183 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Validator, Json, JsonSchema, ValidationSchemaInput } from 'web3-validator'; + +const abi = [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, +]; + +const abiJsonSchema = { + type: 'array', + items: [ + { name: 'from', format: 'address' }, + { name: 'to', format: 'address' }, + { name: 'value', format: 'uint256' }, + ], +}; + +const abiData = [ + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', +]; + +const simpleSchema = { + type: 'object', + required: ['blockHash', 'blockNumber', 'from', 'to', 'data'], + properties: { + blockHash: { + format: 'bytes32', + }, + blockNumber: { + format: 'uint', + }, + from: { + format: 'address', + }, + to: { + oneOf: [{ format: 'address' }, { type: 'null' }], + }, + data: { + format: 'bytes', + }, + }, +}; + +const simpleData = { + blockHash: '0x0dec0518fa672a70027b04c286582e543ab17319fbdd384fa7bc8f3d5a542c0b', + blockNumber: BigInt(2), + from: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + to: '0xCB00CDE33a7a0Fba30C63745534F1f7Ae607076b', + data: '0xafea', +} as unknown as ValidationSchemaInput; + +const createHugeSchema = ( + schema: JsonSchema, + data: Json, + n = 3, +): { schema: JsonSchema; data: Json } => { + if (n > 0) { + const { data: resultData, schema: resultSchema } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + n - 1, + ); + return { + data: { ...(data as unknown as object), simple: resultData }, + schema: { ...schema, properties: { ...schema.properties, simple: resultSchema } }, + }; + } + return { + schema, + data, + }; +}; + +const { schema: hugeSchema, data: hugeData } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + 500, +); + +const { schema: hugeSchema1000, data: hugeData1000 } = createHugeSchema( + { ...simpleSchema } as JsonSchema, + { ...simpleData } as Json, + 1000, +); +describe('validator', () => { + let validator: Web3Validator; + beforeAll(() => { + validator = new Web3Validator(); + }); + + it('huge schema', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + validator.validateJSONSchema(hugeSchema, hugeData as object); + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(6000); + expect(t).toBeGreaterThan(0); + }); + + it('huge schema 1000', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + validator.validateJSONSchema(hugeSchema1000, hugeData1000 as object); + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(6000); + expect(t).toBeGreaterThan(0); + }); + + it('simple schema multiple times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 500; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(3000); + expect(t).toBeGreaterThan(0); + }); + + it('simple schema 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(simpleSchema, simpleData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); + + it('simple JSON schema 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validateJSONSchema(abiJsonSchema, abiData as object); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); + + it('simple ABI 1000 times', () => { + let t = 0; + expect(() => { + const t1 = Number(new Date()); + for (let i = 0; i < 1000; i += 1) { + validator.validate(abi, abiData); + } + t = Number(new Date()) - t1; + }).not.toThrow(); + expect(t).toBeLessThan(4000); + expect(t).toBeGreaterThan(0); + }); +}); diff --git a/packages/web3/test/tsconfig.json b/packages/web3/test/tsconfig.json new file mode 120000 index 00000000000..d60693467ab --- /dev/null +++ b/packages/web3/test/tsconfig.json @@ -0,0 +1 @@ +../../../config/test/tsconfig.json \ No newline at end of file diff --git a/packages/web3/test/unit/accounts.test.ts b/packages/web3/test/unit/accounts.test.ts new file mode 100644 index 00000000000..9cc2618d24b --- /dev/null +++ b/packages/web3/test/unit/accounts.test.ts @@ -0,0 +1,96 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import * as eth from 'web3-eth'; +import * as ethAccounts from 'web3-eth-accounts'; +import { SignTransactionResult, Web3Account } from 'web3-eth-accounts'; +import { Web3EthInterface } from '../../src/types'; +import { Web3 } from '../../src'; + +jest.mock('web3-eth-accounts'); +jest.mock('web3-eth'); + +describe('test new Web3().eth.accounts', () => { + let accounts: Web3EthInterface['accounts']; + + beforeAll(() => { + const web3 = new Web3(); + accounts = web3.eth.accounts; + }); + + beforeEach(() => { + jest.spyOn(eth, 'prepareTransactionForSigning').mockReturnValue({} as Promise); + jest.spyOn(ethAccounts, 'signTransaction').mockReturnValue( + undefined as unknown as Promise, + ); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + + it('`signTransaction` should call the original `prepareTransactionForSigning` and `signTransaction`', async () => { + await accounts.signTransaction({}, ''); + + expect(eth.prepareTransactionForSigning).toHaveBeenCalledTimes(1); + expect(ethAccounts.signTransaction).toHaveBeenCalledTimes(1); + }); + + it('`privateKeyToAccount` should call the original `privateKeyToAccount` and add `signTransaction`', async () => { + jest.spyOn(ethAccounts, 'privateKeyToAccount').mockReturnValue({ + privateKey: '', + } as unknown as Web3Account); + + const account = accounts.privateKeyToAccount(''); + expect(ethAccounts.privateKeyToAccount).toHaveBeenCalledTimes(1); + + await account.signTransaction({}); + + expect(eth.prepareTransactionForSigning).toHaveBeenCalledTimes(1); + expect(ethAccounts.signTransaction).toHaveBeenCalledTimes(1); + }); + + it('`decrypt` should call the original `decrypt` and add `signTransaction`', async () => { + jest.spyOn(ethAccounts, 'decrypt').mockReturnValue({ + privateKey: '', + } as unknown as Promise); + + await accounts.decrypt('', '', { nonStrict: false }); + expect(ethAccounts.decrypt).toHaveBeenCalledWith('', '', false); + + const account = await accounts.decrypt('', ''); + expect(ethAccounts.decrypt).toHaveBeenCalledWith('', '', true); + + await account.signTransaction({}); + + expect(eth.prepareTransactionForSigning).toHaveBeenCalledTimes(1); + expect(ethAccounts.signTransaction).toHaveBeenCalledTimes(1); + }); + + it('`create` should call the original `create` and add `signTransaction`', async () => { + jest.spyOn(ethAccounts, 'create').mockReturnValue({ + privateKey: '', + } as unknown as Web3Account); + const account = accounts.create(); + + expect(ethAccounts.create).toHaveBeenCalledTimes(1); + + await account.signTransaction({}); + + expect(eth.prepareTransactionForSigning).toHaveBeenCalledTimes(1); + expect(ethAccounts.signTransaction).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/web3/test/unit/index.test.ts b/packages/web3/test/unit/index.test.ts new file mode 100644 index 00000000000..be402a68166 --- /dev/null +++ b/packages/web3/test/unit/index.test.ts @@ -0,0 +1,63 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Eth } from 'web3-eth'; + +import * as abi from 'web3-eth-abi'; +import * as accounts from 'web3-eth-accounts'; +import * as contract from 'web3-eth-contract'; +import * as ens from 'web3-eth-ens'; +import * as personal from 'web3-eth-personal'; +import * as iban from 'web3-eth-iban'; + +import * as http from 'web3-providers-http'; +import * as ws from 'web3-providers-ws'; + +import Web3Default, { Web3, providers, eth } from '../../src/index'; + +describe('exports of web3 package', () => { + describe('eth exports', () => { + it('`Web3` is the default exported class', () => { + expect(Web3).toEqual(Web3Default); + }); + + it('`Web3Eth` is available under `eth`', () => { + expect(eth.Web3Eth).toEqual(Web3Eth); + }); + + it('eth sub-namespaces are available under `eth`', () => { + expect(eth.abi).toEqual(abi); + expect(eth.accounts).toEqual(accounts); + expect(eth.contract).toEqual(contract); + expect(eth.ens).toEqual(ens); + expect(eth.personal).toEqual(personal); + expect(eth.iban).toEqual(iban); + }); + }); + + describe('providers exports', () => { + it('providers main objects are available under `providers`', () => { + expect(providers.Eip1193Provider).toBeTruthy(); + expect(providers.SocketProvider).toBeTruthy(); + }); + + it('providers sub-namespaces are available under `providers`', () => { + expect(providers.http).toEqual(http); + expect(providers.ws).toEqual(ws); + }); + }); +}); diff --git a/packages/web3/test/unit/jest.config.js b/packages/web3/test/unit/jest.config.js new file mode 100644 index 00000000000..36386477f13 --- /dev/null +++ b/packages/web3/test/unit/jest.config.js @@ -0,0 +1,18 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '../../.coverage/unit', + collectCoverageFrom: ['src/**'], + collectCoverage: true, + coverageReporters: [ + [ + 'json', + { + file: 'web3-unit-coverage.json', + }, + ], + ], +}; diff --git a/packages/web3/test/unit/version.test.ts b/packages/web3/test/unit/version.test.ts new file mode 100644 index 00000000000..dbbd1723b9f --- /dev/null +++ b/packages/web3/test/unit/version.test.ts @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3PkgInfo } from '../../src/version'; +import packageFile from '../../package.json'; + +describe('web3 package info', () => { + it('should Web3PkgInfo.version returns the same version set at package.json', () => { + expect(packageFile.version).toEqual(Web3PkgInfo.version); + }); +}); diff --git a/packages/web3/test/unit/web3-custom-subscriptions.test.ts b/packages/web3/test/unit/web3-custom-subscriptions.test.ts new file mode 100644 index 00000000000..9da93f35504 --- /dev/null +++ b/packages/web3/test/unit/web3-custom-subscriptions.test.ts @@ -0,0 +1,98 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Web3Subscription, Web3SubscriptionManager } from 'web3-core'; +import { Web3 } from '../../src/web3'; + +class CustomSubscription extends Web3Subscription< + { + data: string; + }, + { + readonly customArgs?: string; + } +> { + protected _buildSubscriptionParams() { + return ['someCustomSubscription', this.args]; + } + + public get subscriptionManager() { + return super.subscriptionManager; + } +} + +const CustomSub = { + custom: CustomSubscription, +}; + +describe('Web3 Custom Subscriptions', () => { + let web3: Web3<{ custom: typeof CustomSubscription }>; + beforeAll(() => { + web3 = new Web3({ + registeredSubscriptions: CustomSub, + }); + }); + + it('should be able to define and subscribe to custom subscription', async () => { + const args = { + customArgs: 'hello custom', + }; + const exec = new Promise((resolve, reject) => { + const provider = { + send: jest.fn().mockImplementation((obj: unknown) => { + expect(obj).toMatchObject({ + id: expect.stringMatching( + // match a Guid: + /[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}/i, + ), + jsonrpc: '2.0', + method: 'eth_subscribe', + params: ['someCustomSubscription', args], + }); + resolve(true); + }), + supportsSubscriptions: () => { + return true; + }, + }; + + try { + web3.provider = provider; + + // eslint-disable-next-line no-void + void web3.subscriptionManager.subscribe('custom', args); + } catch (error) { + reject(error); + } + }); + await expect(exec).resolves.toBe(true); + }); + + it('should access subscriptionManager from derived class', async () => { + const sub = new CustomSubscription( + { customArgs: undefined }, + { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + subscriptionManager: web3.subscriptionManager as Web3SubscriptionManager< + unknown, + any + >, + }, + ); + expect(web3.subscriptionManager).toBe(sub.subscriptionManager); + }); +}); diff --git a/packages/web3/test/unit/web3.config.test.ts b/packages/web3/test/unit/web3.config.test.ts new file mode 100644 index 00000000000..dbe6682c391 --- /dev/null +++ b/packages/web3/test/unit/web3.config.test.ts @@ -0,0 +1,152 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { ETH_DATA_FORMAT } from 'web3-types'; +import {Web3Context} from 'web3-core'; +import { Web3 } from '../../src'; + +describe('web3config web3 tests', () => { + + describe('web3config contract', () => { + + it('create web3context with configs and should set it for web3', async () => { + const context = new Web3Context("http://127.0.0.1:8545"); + context.setConfig({defaultTransactionType: "0x0"}); + const web3 = new Web3(context); + expect(web3.getContextObject().config.defaultTransactionType).toBe("0x0"); + expect(web3.config.defaultTransactionType).toBe("0x0"); + expect(web3.eth.getContextObject().config.defaultTransactionType).toBe("0x0") + }); + + it('should be able to create web3 and setconfig for contracts', async () => { + const web3 = new Web3("http://127.0.0.1:8545"); + web3.setConfig({defaultTransactionType: "0x0"}); + expect(web3.getContextObject().config.defaultTransactionType).toBe("0x0"); + expect(web3.config.defaultTransactionType).toBe("0x0"); + expect(web3.eth.getContextObject().config.defaultTransactionType).toBe("0x0") + + const contract = new web3.eth.Contract([], ""); + expect(contract.config.defaultTransactionType).toBe("0x0") + expect(contract.getContextObject().config.defaultTransactionType).toBe("0x0"); + + contract.setConfig({contractDataInputFill:"both"}); + expect(contract.getContextObject().config.contractDataInputFill).toBe("both"); + + // web3 config shouldn't change + expect(web3.getContextObject().config.contractDataInputFill).toBe("data"); + expect(web3.config.contractDataInputFill).toBe("data"); + expect(web3.eth.getContextObject().config.contractDataInputFill).toBe("data") + }); + it('should change web3 config context but not contract config context', async () => { + const web3 = new Web3("http://127.0.0.1:8545"); + const contract = new web3.eth.Contract([]) + web3.setConfig({defaultTransactionType:"0x0"}); + expect(contract.getContextObject().config.defaultTransactionType).toBe("0x2") + expect(web3.getContextObject().config.defaultTransactionType).toBe("0x0"); + }); + + it('should not change web3config when changing contract config context', async () => { + const web3 = new Web3("http://127.0.0.1:8545"); + const contract = new web3.eth.Contract([]) + contract.setConfig({defaultTransactionType:"0x0"}); + expect(contract.getContextObject().config.defaultTransactionType).toBe("0x0") + expect(web3.getContextObject().config.defaultTransactionType).toBe("0x2"); + }); + + it('should create two contracts with different configs', () => { + const web3 = new Web3('http://127.0.0.1:8545'); + + web3.setConfig({ contractDataInputFill: "data" }); + const c1 = new web3.eth.Contract([], '') + + const c2 = new web3.eth.Contract([], new Web3Context({config: {contractDataInputFill: "input"}})) + + const c3 = new web3.eth.Contract([], {dataInputFill: "input"}) + expect(web3.config.contractDataInputFill).toBe("data") + expect(c1.config.contractDataInputFill).toBe("data") + expect(c2.config.contractDataInputFill).toBe("input"); + expect(c3.config.contractDataInputFill).toBe("input"); + + }); + + it('should create a contract with context and returnFormat properly with different parameters', () => { + const web3 = new Web3('http://127.0.0.1:8545'); + web3.setConfig({ contractDataInputFill: "data" }); + + // create contract with context in second param + const c1 = new web3.eth.Contract([], new Web3Context({config: {contractDataInputFill: "input"}})) + + // create contract with context in third param + const c2 = new web3.eth.Contract([], "", new Web3Context({config: {contractDataInputFill: "both"}})) + + // create contract with context in fourth param + const c3 = new web3.eth.Contract([], "", {gas: "gas"}, new Web3Context({config: {contractDataInputFill: "both"}})) + + expect(c1.config.contractDataInputFill).toBe("input") + expect(c1.getContextObject().config.contractDataInputFill).toBe("input"); + + expect(c2.config.contractDataInputFill).toBe("both") + expect(c2.getContextObject().config.contractDataInputFill).toBe("both"); + + expect(c3.config.contractDataInputFill).toBe("both") + expect(c3.getContextObject().config.contractDataInputFill).toBe("both"); + + // create contract with returnFormat in fourth param + const c4 = new web3.eth.Contract([], "", {gas: "gas"}, ETH_DATA_FORMAT); + + // create contract with returnFormat in fifth param + const c5 = new web3.eth.Contract([], "", {gas: "gas"}, new Web3Context({config: {contractDataInputFill: "data"}}), ETH_DATA_FORMAT) + + expect(c4.config.contractDataInputFill).toBe("data") + expect(c4.getContextObject().config.contractDataInputFill).toBe("data"); + + expect(c5.config.contractDataInputFill).toBe("data") + expect(c5.getContextObject().config.contractDataInputFill).toBe("data"); + }) + + it('should create contracts with different ways to configure', () => { + const web3 = new Web3('http://127.0.0.1:8545'); + web3.setConfig({ contractDataInputFill: "data" }); + + const c1 = new web3.eth.Contract([], '') + + const c2 = new web3.eth.Contract([], new Web3Context({config: {contractDataInputFill: "input"}})) + + const c3 = new web3.eth.Contract([], {dataInputFill: "input"}) + + expect(web3.config.contractDataInputFill).toBe("data") + expect(c1.config.contractDataInputFill).toBe("data") + expect(c2.config.contractDataInputFill).toBe("input"); + expect(c3.config.contractDataInputFill).toBe("input"); + + }); + + it('should populate dataInputFill properly', () => { + const web3 = new Web3("http://127.0.0.1:8545"); + // create a contract with options as second parameter + const c1 = new web3.eth.Contract([], {dataInputFill: "both"}); + expect((c1.config.contractDataInputFill)).toBe("both"); + + // create a contract with options as third parameter + const c2 = new web3.eth.Contract([], "", {dataInputFill: "both"}); + expect((c2.config.contractDataInputFill)).toBe("both"); + + }); + }) + // TODO: finish config unit tests + +}); diff --git a/packages/web3/test/unit/web3.extend.test.ts b/packages/web3/test/unit/web3.extend.test.ts new file mode 100644 index 00000000000..4847cf0d898 --- /dev/null +++ b/packages/web3/test/unit/web3.extend.test.ts @@ -0,0 +1,104 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Address, BlockTag } from 'web3-types'; +import { Web3 } from '../../src/web3'; + +declare module 'web3' { + interface Web3Context { + // for first test like web3.myModule.getL2Balance(...) + myModule: { + getBalance(address: Address, blockTag: BlockTag): Promise; + getL2Balance(address: Address, blockTag: BlockTag): Promise; + }; + + // for second test, if user want to define these method types on web3 obj like web3.getBalance(...) + getBalance(address: Address, blockTag: BlockTag): Promise; + getL2Balance(address: Address, blockTag: BlockTag): Promise; + } +} + +describe('Web3 extend tests', () => { + it('web3 extend should send correct rpc call', async () => { + const web3 = new Web3('http://127.0.0.1:7545'); + + const requestManagerSendSpy = jest.fn(); + web3.requestManager.send = requestManagerSendSpy; + + web3.extend({ + property: 'myModule', + methods: [ + { + name: 'getBalance', + call: 'eth_getBalance', + }, + { + name: 'getL2Balance', + call: 'eth_getBalance', + }, + ], + }); + + await web3.myModule.getBalance('0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBalance', + params: ['0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'], + }); + + await web3.myModule.getL2Balance('0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBalance', + params: ['0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'], + }); + }); + + it('web3 extend should send correct rpc call without property field defined', async () => { + const web3 = new Web3('http://127.0.0.1:7545'); + + const requestManagerSendSpy = jest.fn(); + web3.requestManager.send = requestManagerSendSpy; + + web3.extend({ + methods: [ + { + name: 'getBalance', + call: 'eth_getBalance', + }, + { + name: 'getL2Balance', + call: 'eth_getBalance', + }, + ], + }); + + await web3.getBalance('0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBalance', + params: ['0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'], + }); + + await web3.getL2Balance('0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'); + + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_getBalance', + params: ['0x5b43746580AAF00A69019fA59D9ed7d9c85dDd70', 'latest'], + }); + }); +}); diff --git a/packages/web3/test/unit/web3.test.ts b/packages/web3/test/unit/web3.test.ts new file mode 100644 index 00000000000..3d520f38e36 --- /dev/null +++ b/packages/web3/test/unit/web3.test.ts @@ -0,0 +1,98 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { Contract } from 'web3-eth-contract'; +import { ContractInitOptions } from 'web3-types'; +import { Web3 } from '../../src/web3'; + +describe('Web3 object', () => { + it('should be able to set and read web3 providers', () => { + const web3NoProvider = new Web3(); + expect(web3NoProvider).toBeTruthy(); + expect(web3NoProvider.provider).toBeUndefined(); + + const web3 = new Web3('http://somenode'); + expect(web3).toBeTruthy(); + expect(web3.provider).toEqual({ + clientUrl: 'http://somenode', + httpProviderOptions: undefined, + }); + }); + describe('creating a Contract object with the constructor at Web3 -> eth.Contract', () => { + const Web3Contract = new Web3().eth.Contract; + const abi = [{ name: 'any', type: 'function' }]; + const address = '0x0000000000000000000000000000000000000000'; + const options = { gas: '100' }; + + it('should work when `address`=`undefined` and `options`=`undefined`', () => { + const contract1 = new Web3Contract(abi, undefined, undefined); + expect(contract1).toBeInstanceOf(Contract); + expect(contract1.options.address).toBeUndefined(); + expect(contract1.options.gas).toBeUndefined(); + }); + it('should accept when not passing `address` or `options`', () => { + const contract2 = new Web3Contract(abi); + expect(contract2).toBeInstanceOf(Contract); + expect(contract2.options.address).toBeUndefined(); + expect(contract2.options.gas).toBeUndefined(); + }); + it('should work when `address`=`undefined` and `options` is an object', () => { + const contract3 = new Web3Contract(abi, undefined, options); + expect(contract3).toBeInstanceOf(Contract); + expect(contract3.options.address).toBeUndefined(); + expect(contract3.options.gas).toEqual(options.gas); + }); + it('should work when `address` is an empty string and `options` is an object', () => { + const contract4 = new Web3Contract(abi, '', options); + expect(contract4).toBeInstanceOf(Contract); + expect(contract4.options.address).toBe(''); + expect(contract4.options.gas).toEqual(options.gas); + }); + it('should work when `address` is a string and `options` is not passed', () => { + const contract5 = new Web3Contract(abi, address); + expect(contract5).toBeInstanceOf(Contract); + expect(contract5.options.address).toEqual(address); + expect(contract5.options.gas).toBeUndefined(); + }); + it('should work when second parameter is an `options` object', () => { + const contract6 = new Web3Contract(abi, options); + expect(contract6).toBeInstanceOf(Contract); + expect(contract6.options.address).toBeUndefined(); + expect(contract6.options.gas).toEqual(options.gas); + }); + it('should work when `address` is a string and `options` is an object', () => { + const contract7 = new Web3Contract(abi, address, options); + expect(contract7).toBeInstanceOf(Contract); + expect(contract7.options.address).toEqual(address); + expect(contract7.options.gas).toEqual(options.gas); + }); + it('should throw if the second and the third parameters are both options', () => { + expect(() => { + // eslint-disable-next-line no-new + new Web3Contract(abi, options as unknown as string, options); + }).toThrow(); + }); + it('should throw if `options` is a function', () => { + expect(() => { + // eslint-disable-next-line no-new + new Web3Contract(abi, (() => { + /* nothing */ + }) as ContractInitOptions); + }).toThrow(); + }); + }); +}); diff --git a/packages/web3/test/unit/web3eip6963.test.ts b/packages/web3/test/unit/web3eip6963.test.ts new file mode 100644 index 00000000000..1f465aba124 --- /dev/null +++ b/packages/web3/test/unit/web3eip6963.test.ts @@ -0,0 +1,91 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +import { + onNewProviderDiscovered, + requestEIP6963Providers +} from "../../src/web3_eip6963"; + +describe('requestEIP6963Providers', () => { + it('should reject with an error if window object is not available', async () => { + // Mocking window object absence + (global as any).window = undefined; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + await expect(requestEIP6963Providers()).rejects.toThrow("window object not available, EIP-6963 is intended to be used within a browser"); + }); + + it('should resolve with updated providers map when events are triggered', async () => { + class CustomEventPolyfill extends Event { + public detail: any; + public constructor(eventType: string, eventInitDict: any) { + super(eventType, eventInitDict); + this.detail = eventInitDict.detail; + } + } + + (global as any).CustomEvent = CustomEventPolyfill; + + const mockProviderDetail = { + info: { uuid: 'test-uuid', name: 'Test Provider', icon: 'test-icon', rdns: 'test-rdns' }, + provider: {} // Mock provider object + }; + + const mockEvent = { + type: 'eip6963:announceProvider', + detail: mockProviderDetail + }; + + // Mock window methods + (global as any).window = { + addEventListener: jest.fn().mockImplementation( + + (_event, callback) => callback(mockEvent)), // eslint-disable-line + dispatchEvent: jest.fn() + }; + + const result = await requestEIP6963Providers(); + + expect(result).toEqual(new Map([['test-uuid', mockProviderDetail]])); + }); + + it('onNewProviderDiscovered should throw an error if window object is not available', () => { + // Mock the window object not being available + (global as any).window = undefined; + + // Expect an error to be thrown + expect(() => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + onNewProviderDiscovered((_providerEvent) => {}); + }).toThrow("window object not available, EIP-6963 is intended to be used within a browser"); + + + }); + + it('onNewProviderDiscovered should add an event listener when window object is available', () => { + (global as any).window = { + addEventListener: jest.fn(), + }; + + const callback = jest.fn(); + onNewProviderDiscovered(callback); + + // Expect the callback to have been called when the event listener is added + expect(global.window.addEventListener).toHaveBeenCalledWith('web3:providersMapUpdated', callback); + }); + +}); \ No newline at end of file diff --git a/packages/web3/tsconfig.cjs.json b/packages/web3/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/packages/web3/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/packages/web3/tsconfig.esm.json b/packages/web3/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/packages/web3/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/packages/web3/tsconfig.json b/packages/web3/tsconfig.json deleted file mode 100644 index 06cc6c15b8c..00000000000 --- a/packages/web3/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./lib" - }, - "include": [ - "./src" - ] - } \ No newline at end of file diff --git a/packages/web3/tsconfig.types.json b/packages/web3/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/packages/web3/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/packages/web3/tsdoc.json b/packages/web3/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/packages/web3/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/packages/web3/types/index.d.ts b/packages/web3/types/index.d.ts deleted file mode 100644 index 555e7762aa4..00000000000 --- a/packages/web3/types/index.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file index.d.ts - * @author Josh Stevens , Samuel Furter - * @date 2018 - */ - -import * as net from 'net'; -import { Bzz } from 'web3-bzz'; -import { BatchRequest, provider, Providers, Extension } from 'web3-core'; -import { Eth } from 'web3-eth'; -import { Personal } from 'web3-eth-personal'; -import { Network } from 'web3-net'; -import { Shh } from 'web3-shh'; -import { Utils } from 'web3-utils'; - -export default class Web3 { - constructor(); - constructor(provider: provider); - constructor(provider: provider, net: net.Socket); - - static modules: Modules; - readonly givenProvider: any; - static readonly givenProvider: any; - defaultAccount: string | null; - defaultBlock: string | number; - readonly currentProvider: provider; - setProvider(provider: provider): boolean; - BatchRequest: new () => BatchRequest; - static readonly providers: Providers; - - utils: Utils; - eth: Eth; - shh: Shh; - bzz: Bzz; - version: string; - static readonly version: string; - static readonly utils: Utils; - extend(extension: Extension): any; -} - -export interface Modules { - Eth: new (provider: provider, net: net.Socket) => Eth; - Net: new (provider: provider, net: net.Socket) => Network; - Personal: new (provider: provider, net: net.Socket) => Personal; - Shh: new (provider: provider, net: net.Socket) => Shh; - Bzz: new (provider: provider) => Bzz; -} diff --git a/packages/web3/types/tests/web3-test.ts b/packages/web3/types/tests/web3-test.ts deleted file mode 100644 index fe55c20597d..00000000000 --- a/packages/web3/types/tests/web3-test.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* - This file is part of web3.js. - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - web3.js 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 Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file web3-test.ts - * @author Josh Stevens , Samuel Furter - * @date 2018 - */ - -import Web3 from 'web3'; -import * as net from 'net'; -import { AbstractProvider, RequestArguments } from 'web3-core'; -import { JsonRpcPayload, JsonRpcResponse } from 'web3-core-helpers'; - -// $ExpectType Utils -Web3.utils; - -// $ExpectType string -Web3.version; - -// $ExpectType Modules -Web3.modules; - -// $ExpectType Providers -Web3.providers; - -// $ExpectType any -Web3.givenProvider; - -// $ExpectType Web3 -const web3_empty = new Web3(); - -// $ExpectType Web3 -let web3 = new Web3('https://localhost:5000/'); - -// $ExpectType provider -web3.currentProvider; - -// $ExpectType any -web3.extend({property: 'test', methods: [{name: 'method', call: 'method'}]}); - -// $ExpectType any -web3.givenProvider; - -// $ExpectType string | null -web3.defaultAccount; - -// $ExpectType string | number -web3.defaultBlock; - -// $ExpectType boolean -web3.setProvider('https://localhost:2100'); - -// $ExpectType BatchRequest -new web3.BatchRequest(); - -// $ExpectType Utils -web3.utils; - -// $ExpectType string -web3.version; - -// $ExpectType Eth -web3.eth; - -// $ExpectType Shh -web3.shh; - -// $ExpectType Bzz -web3.bzz; - -// $ExpectType Socket -const netSocket = new net.Socket(); - -// $ExpectType Web3 -web3 = new Web3('https://localhost:5000/', netSocket); - -// $ExpectType Web3 -web3 = new Web3(); - -class CustomProvider1 implements AbstractProvider { - sendAsync(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void) {} -} - -// $ExpectType Web3 -web3 = new Web3(new CustomProvider1()); - -class CustomProvider2 implements AbstractProvider { - send(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void) {} - sendAsync(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void) {} -} - -// $ExpectType Web3 -web3 = new Web3(new CustomProvider2()); - -class CustomProvider3 implements AbstractProvider { - async request(args: RequestArguments) {} - sendAsync(payload: JsonRpcPayload, callback: (error: Error | null, result?: JsonRpcResponse) => void) {} -} - -// $ExpectType Web3 -web3 = new Web3(new CustomProvider3()); diff --git a/packages/web3/types/tsconfig.json b/packages/web3/types/tsconfig.json deleted file mode 100644 index b82402012fa..00000000000 --- a/packages/web3/types/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "lib": ["es6"], - "target": "es6", - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noEmit": true, - "allowSyntheticDefaultImports": false, - "baseUrl": ".", - "paths": { - "web3": ["."] - } - } -} diff --git a/packages/web3/types/tslint.json b/packages/web3/types/tslint.json deleted file mode 100644 index 871d605704b..00000000000 --- a/packages/web3/types/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "semicolon": false, - "no-import-default-of-export-equals": false, - "file-name-casing": [true, "kebab-case"], - "whitespace": false, - "no-unnecessary-class": false, - "unified-signatures": false - } -} diff --git a/packages/web3/webpack.analyze.js b/packages/web3/webpack.analyze.js new file mode 100644 index 00000000000..24d91808c6f --- /dev/null +++ b/packages/web3/webpack.analyze.js @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const { getWebPackConfig } = require('../../webpack.base.config'); + +const config = getWebPackConfig( + __dirname, + 'web3.min.js', + 'Web3', + 'src/web3.ts', + 'tsconfig.cjs.json', +); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); + +module.exports = { + ...config, + plugins: [ + ...config.plugins, + new BundleAnalyzerPlugin({ + generateStatsFile: true, + statsFilename: process.env.STATS_FILE ?? 'stats.json', + defaultSizes: process.env.ANALYZE_SERVER ? 'stat' : 'gzip', + analyzerMode: process.env.ANALYZE_SERVER ? 'server' : 'json', + }), + ], +}; diff --git a/packages/web3/webpack.config.js b/packages/web3/webpack.config.js new file mode 100644 index 00000000000..b2b1ae8050b --- /dev/null +++ b/packages/web3/webpack.config.js @@ -0,0 +1,26 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const { getWebPackConfig } = require('../../webpack.base.config'); + +module.exports = getWebPackConfig( + __dirname, + 'web3.min.js', + 'Web3', + 'src/web3.ts', + 'tsconfig.cjs.json', +); diff --git a/scripts/accounts.json b/scripts/accounts.json new file mode 100644 index 00000000000..2acfbfdd702 --- /dev/null +++ b/scripts/accounts.json @@ -0,0 +1,82 @@ +[ + { + "address": "0xe2597eb05cf9a87eb1309e86750c903ec38e527e", + "privateKey": "0x1f953dc9b6437fb94fcafa5dabe3faa0c34315b954dd66f41bf53273339c6d26" + }, + { + "address": "0x7ed0e85b8e1e925600b4373e6d108f34ab38a401", + "privateKey": "0x31d1742901ee5635260a672684540cc9d165a5c1ad8b8777468fe842f04c0a79" + }, + { + "address": "0xe4beef667408b99053dc147ed19592ada0d77f59", + "privateKey": "0xb45b02f408a0dd0996aab2b55a54f4ed7735f82b133c0786a9ff372ffaaf11bd" + }, + { + "address": "0x7ab80aeb6bb488b7f6c41c58e83ef248eb39c882", + "privateKey": "0xfbb99648a0be014a2334c7fc38f50898d7058e8e2478ef532cbaefa96ecedad0" + }, + { + "address": "0x12b1d9d74d73b1c3a245b19c1c5501c653af1af9", + "privateKey": "0x17668bbc76c60f0a703a6d1a1db7bd420e4cea4d36b3b9f652d4888676a2e9a9" + }, + { + "address": "0x1a6075a263ee140e00dbf8e374fc5a443d097894", + "privateKey": "0xceb7bf56521381180d988809c5e3e1fdba56b813d3f0112d55e83b103d733f9b" + }, + { + "address": "0x4fec0a51024b13030d26e70904b066c6d41157a5", + "privateKey": "0x2ec2d297af7a6150fafb91f65c1b458fe04116a1192fa4af16b595305e1f1ec5" + }, + { + "address": "0x03095dc4857bb26f3a4550c5651df8b7f6b6b1ef", + "privateKey": "0x7cb9148b39f9138760d9a79db5f69957adab062a6773f874f76e374e835ec448" + }, + { + "address": "0xac0b9b6e8a17991cb172b2abaf45fb5eb769e540", + "privateKey": "0xd175db54516beb96490015e593373e2b8c0e5791a50c6f5b343d6c1cf59879b6" + }, + { + "address": "0xec7e2fca825bafcbfdb94ff6fbfd9579cde7f01c", + "privateKey": "0x603aff3be98b343dddfea6b420b455e557bb0301acf67533928a2e2fdbc5d856" + }, + { + "address": "0x75dd0faa3b5db63b4e122b659f3e92fd7984029d", + "privateKey": "0xdf1c4c98fd785976d924baccf1041af5bbfb372070b917a4e84b06bfc08a8ab8" + }, + { + "address": "0x40d00abacfbfb7e2a1d86bb6cc88a649ec7146ac", + "privateKey": "0xa0b69a60e0f15e552940de907ed8a909ed827d263590f9a28fa8d61c2d5f3701" + }, + { + "address": "0xf1e4df637e764eb7bd9b9f2aab391cc757b875a0", + "privateKey": "0x2afb1070b72c0820388fd3d4c256bc28a85915f2f4e46d2a2297a3757dd40669" + }, + { + "address": "0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab", + "privateKey": "0xbeeacc5793ed0e39e595d4a293f570c3556bd1e99f79dbe6597d306bc7bebfec" + }, + { + "address": "0xc8fae455deaf7cd62c3eb57cccd544eb3009ce07", + "privateKey": "0xf8f27d1f4ea727918421e2e68ac86f10e980e91c093a5840bf2ea2ab9691e8cc" + }, + { + "address": "0x9c5015fc062fd3adee0ff4dd850149d28f0bca2e", + "privateKey": "0xda09a5a43d1a8d163f74d2ebe2f866f32669146de4026abf21081d51065a11d7" + }, + { + "address": "0xce27b0f1e86863a0d547ba375823368da3975e8d", + "privateKey": "0x41447c0edaafc196646a1b7111b826eef793949cbbe901be1b8d6bceaacfdf40" + }, + { + "address": "0x2d085f612100e857c415ea6b4279aea20ed16155", + "privateKey": "0x79a83cdd069299dec19e143039cca634190c12d4171359c3379b6e4eb25b2d5f" + }, + { + "address": "0x58422b64d0e95ab4e93a9d95b755d9b53545c9ef", + "privateKey": "0x0239a110b68e6ffd2f5a1736e431d55bc1ffb2ec399264b3642eccccda892ebe" + }, + { + "address": "0x0d4aa485ecbc499c70860feb7e5aaeaf5fd8172e", + "privateKey": "0x2013f1178ac26e6ce1e098bac5fde47fce97ebf237d0b2738107551a2e3c1ab3" + } +] diff --git a/scripts/changelog/src/add_changelog_entry.ts b/scripts/changelog/src/add_changelog_entry.ts new file mode 100644 index 00000000000..4c5b32a4369 --- /dev/null +++ b/scripts/changelog/src/add_changelog_entry.ts @@ -0,0 +1,69 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { readFileSync, writeFileSync } from 'fs'; + +// eslint-disable-next-line import/no-cycle +import { ChangelogConfig, DEFAULT_CHANGELOG_CONFIG } from './types'; +import { getPackageGroupedUnreleasedEntries, getUnreleasedSection } from './sync'; + +export const addChangelogEntry = (commandName: string, args: string[]) => { + let CHANGELOG_CONFIG: ChangelogConfig; + if (args?.[0] !== undefined && args[0].endsWith('.json')) { + CHANGELOG_CONFIG = JSON.parse(readFileSync(args[0], 'utf8')) as ChangelogConfig; + args.shift(); + } else { + CHANGELOG_CONFIG = DEFAULT_CHANGELOG_CONFIG; + } + + const [packageName, changelogEntry] = args; + const parsedChangelog = readFileSync( + `${CHANGELOG_CONFIG.packagesDirectoryPath}/${packageName}/${CHANGELOG_CONFIG.packagesChangelogPath}`, + 'utf8', + ).split(/\n/); + const groupedUnreleasedEntries = getPackageGroupedUnreleasedEntries( + getUnreleasedSection(parsedChangelog), + ); + const formattedCommandName = `### ${ + commandName.charAt(0).toUpperCase() + commandName.slice(1) + }`; + const formattedChangelogEntry = `- ${changelogEntry}`; + + if (groupedUnreleasedEntries[formattedCommandName] !== undefined) { + groupedUnreleasedEntries[formattedCommandName].push(formattedChangelogEntry); + } else { + groupedUnreleasedEntries[formattedCommandName] = [formattedChangelogEntry]; + } + + const flattenedModifiedUnreleasedEntries: string[] = []; + for (const entryHeader of Object.keys(groupedUnreleasedEntries)) { + const entries = groupedUnreleasedEntries[entryHeader]; + flattenedModifiedUnreleasedEntries.push(entryHeader); + flattenedModifiedUnreleasedEntries.push(''); + for (const [index, entry] of entries.entries()) { + flattenedModifiedUnreleasedEntries.push(entry); + if (index + 1 === entries.length) flattenedModifiedUnreleasedEntries.push(''); + } + } + + // +2 is so the header, ## [Unreleased], and the newline after it don't get removed + parsedChangelog.splice(parsedChangelog.findIndex(item => item === '## [Unreleased]') + 2); + parsedChangelog.push(...flattenedModifiedUnreleasedEntries); + writeFileSync( + `${CHANGELOG_CONFIG.packagesDirectoryPath}/${packageName}/${CHANGELOG_CONFIG.packagesChangelogPath}`, + parsedChangelog.join('\n'), + ); +}; diff --git a/scripts/changelog/src/helpers.ts b/scripts/changelog/src/helpers.ts new file mode 100644 index 00000000000..b0ce1af0acf --- /dev/null +++ b/scripts/changelog/src/helpers.ts @@ -0,0 +1,40 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { readdirSync } from 'fs'; + +// eslint-disable-next-line import/no-cycle +import { Command, getCommands } from './types'; + +export const parseArgs = (commands: Command[] = getCommands()): unknown => { + const commandArg = process.argv[2]; + for (const command of commands) { + if (command.name === commandArg) { + return command.commandFunction(command.name, process.argv.slice(3)); + } + } + + // eslint-disable-next-line no-console + console.log('Invalid command, please refer to below table for expected commands:'); + // eslint-disable-next-line no-console + console.table(commands); + return undefined; +}; + +export const getListOfPackageNames = (packagesDirectory: string) => + readdirSync(packagesDirectory, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .map(dirent => dirent.name); diff --git a/scripts/changelog/src/index.ts b/scripts/changelog/src/index.ts new file mode 100644 index 00000000000..b4e1caccb8a --- /dev/null +++ b/scripts/changelog/src/index.ts @@ -0,0 +1,20 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-cycle +import { parseArgs } from './helpers'; + +parseArgs(); diff --git a/scripts/changelog/src/sync.ts b/scripts/changelog/src/sync.ts new file mode 100644 index 00000000000..03f1b020bf8 --- /dev/null +++ b/scripts/changelog/src/sync.ts @@ -0,0 +1,184 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { readFileSync, writeFileSync } from 'fs'; + +// eslint-disable-next-line import/no-cycle +import { + ChangelogConfig, + DEFAULT_CHANGELOG_CONFIG, + ENTRY_SECTION_HEADERS, + GroupedUnreleasedEntries, +} from './types'; +// eslint-disable-next-line import/no-cycle +import { getListOfPackageNames } from './helpers'; + +export const getUnreleasedSection = (parsedChangelog: string[]) => { + const unreleasedSectionHeaderIndex = parsedChangelog.findIndex( + item => item === '## [Unreleased]', + ); + const unreleasedSection = parsedChangelog.slice(unreleasedSectionHeaderIndex); + return unreleasedSection; +}; + +const skipSection = (section: string, unreleasedSection: string[]): string[] => { + const index = unreleasedSection.indexOf(section); + if (index !== -1) { + const nextSectionIndex = unreleasedSection.findIndex( + (el, i) => el.startsWith('###') && i > index, + ); + if (nextSectionIndex !== -1) { + unreleasedSection.splice(index, nextSectionIndex - index); + } + } + return unreleasedSection; +}; + +export const getRootGroupedUnreleasedEntries = (unreleasedSection: string[]) => { + const groupedUnreleasedEntries: GroupedUnreleasedEntries = {}; + + let lastPackageHeaderIndex = 0; + let lastEntryHeaderIndex = 0; + // skip '### Breaking Changes' section from unreleasedSection array + // eslint-disable-next-line no-param-reassign + unreleasedSection = skipSection('### Breaking Changes', unreleasedSection); + + for (const [index, item] of unreleasedSection.entries()) { + // substring(4) removes "### " from entry headers (e.g. "### Changed" -> "Changed") + if (ENTRY_SECTION_HEADERS.includes(item.substring(4))) { + groupedUnreleasedEntries[unreleasedSection[index]] = {}; + lastEntryHeaderIndex = index; + } else if (item.startsWith('#### ')) { + groupedUnreleasedEntries[unreleasedSection[lastEntryHeaderIndex]][item] = []; + lastPackageHeaderIndex = index; + } else if (item.startsWith('-')) { + const entryHeader = unreleasedSection[lastEntryHeaderIndex]; + const packageHeader = unreleasedSection[lastPackageHeaderIndex]; + groupedUnreleasedEntries[entryHeader][packageHeader].push(item); + } + } + + return groupedUnreleasedEntries; +}; + +export const getPackageGroupedUnreleasedEntries = (unreleasedSection: string[]) => { + const groupedUnreleasedEntries: Record = {}; + + let lastEntryHeaderIndex = 0; + for (const [index, item] of unreleasedSection.entries()) { + // substring(4) removes "### " from entry headers (e.g. "### Changed" -> "Changed") + if (ENTRY_SECTION_HEADERS.includes(item.substring(4))) { + groupedUnreleasedEntries[item] = []; + lastEntryHeaderIndex = index; + } else if (item.startsWith('- ')) { + const entryHeader = unreleasedSection[lastEntryHeaderIndex]; + groupedUnreleasedEntries[entryHeader].push(item); + } + } + + return groupedUnreleasedEntries; +}; + +export const getSyncedGroupedUnreleasedEntries = ( + listOfPackageNames: string[], + changelogConfig: ChangelogConfig, + rootGroupedUnreleasedEntries: GroupedUnreleasedEntries, +) => { + const _rootGroupedUnreleasedEntries: GroupedUnreleasedEntries = rootGroupedUnreleasedEntries; + for (const packageName of listOfPackageNames) { + const parsedChangelog = readFileSync( + `${changelogConfig.packagesDirectoryPath}/${packageName}/${changelogConfig.packagesChangelogPath}`, + 'utf8', + ).split(/\n/); + const packageGroupedUnreleasedEntries = getPackageGroupedUnreleasedEntries( + getUnreleasedSection(parsedChangelog), + ); + + for (const entrySectionHeader of ENTRY_SECTION_HEADERS) { + const formattedEntrySectionHeader = `### ${entrySectionHeader}`; + const formattedPackageEntryHeader = `#### ${packageName}`; + + const packageEntrySection = + packageGroupedUnreleasedEntries[formattedEntrySectionHeader]; + if (packageEntrySection !== undefined) { + // PackageName has a formattedEntrySectionHeader listed in packageName/CHANGELOG.md + + if (_rootGroupedUnreleasedEntries[formattedEntrySectionHeader] === undefined) { + // Root CHANGELOG.md is missing formattedEntrySectionHeader + _rootGroupedUnreleasedEntries[formattedEntrySectionHeader] = {}; + } + + _rootGroupedUnreleasedEntries[formattedEntrySectionHeader][ + formattedPackageEntryHeader + ] = packageGroupedUnreleasedEntries[formattedEntrySectionHeader]; + } + } + } + + return _rootGroupedUnreleasedEntries; +}; + +export const flattenSyncedUnreleasedEntries = ( + syncedGroupedUnreleasedEntries: GroupedUnreleasedEntries, + listOfPackageNames: string[], +) => { + const flattenedSyncedUnreleasedEntries: string[] = []; + for (const key of Object.keys(syncedGroupedUnreleasedEntries)) { + const element = syncedGroupedUnreleasedEntries[key]; + flattenedSyncedUnreleasedEntries.push(key); + flattenedSyncedUnreleasedEntries.push(''); + for (const packageName of listOfPackageNames) { + const formattedPackageEntryHeader = `#### ${packageName}`; + const element2 = element[formattedPackageEntryHeader]; + if (element[formattedPackageEntryHeader] !== undefined) { + flattenedSyncedUnreleasedEntries.push(formattedPackageEntryHeader); + flattenedSyncedUnreleasedEntries.push(''); + flattenedSyncedUnreleasedEntries.push(...element2); + flattenedSyncedUnreleasedEntries.push(''); + } + } + } + + return flattenedSyncedUnreleasedEntries; +}; + +// @ts-expect-error 'commandName' is declared but its value is never read +export const syncChangelogs = (commandName: string, args?: string[]) => { + const CHANGELOG_CONFIG: ChangelogConfig = + args?.[0] !== undefined && args[0].endsWith('.json') + ? (JSON.parse(readFileSync(args[0], 'utf8')) as ChangelogConfig) + : DEFAULT_CHANGELOG_CONFIG; + const parsedRootChangelog = readFileSync(CHANGELOG_CONFIG.rootChangelogPath, 'utf8').split( + /\n/, + ); + const listOfPackageNames = getListOfPackageNames(CHANGELOG_CONFIG.packagesDirectoryPath); + const syncedGroupedUnreleasedEntries = getSyncedGroupedUnreleasedEntries( + listOfPackageNames, + CHANGELOG_CONFIG, + getRootGroupedUnreleasedEntries(getUnreleasedSection(parsedRootChangelog)), + ); + const flattenedSyncedUnreleasedEntries = flattenSyncedUnreleasedEntries( + syncedGroupedUnreleasedEntries, + listOfPackageNames, + ); + + // +2 is so the header, ## [Unreleased], and the newline after it don't get removed + parsedRootChangelog.splice( + parsedRootChangelog.findIndex(item => item === '## [Unreleased]') + 2, + ); + parsedRootChangelog.push(...flattenedSyncedUnreleasedEntries); + writeFileSync(CHANGELOG_CONFIG.rootChangelogPath, parsedRootChangelog.join('\n')); +}; diff --git a/scripts/changelog/src/types.ts b/scripts/changelog/src/types.ts new file mode 100644 index 00000000000..57c3f172876 --- /dev/null +++ b/scripts/changelog/src/types.ts @@ -0,0 +1,76 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +// eslint-disable-next-line import/no-cycle +import { addChangelogEntry } from './add_changelog_entry'; +// eslint-disable-next-line import/no-cycle +import { syncChangelogs } from './sync'; + +export interface ChangelogConfig { + packagesDirectoryPath: string; + packagesChangelogPath: string; + rootChangelogPath: string; +} + +export interface Command { + name: string; + description: string; + arguments: string[]; + example: string; + commandFunction: (commandName: string, args: string[]) => unknown; +} + +export type GroupedUnreleasedEntries = Record>; + +export const DEFAULT_CHANGELOG_CONFIG = { + packagesDirectoryPath: './packages', + packagesChangelogPath: 'CHANGELOG.md', + rootChangelogPath: './CHANGELOG.md', +}; + +export const ENTRY_SECTION_HEADERS = [ + 'Added', + 'Changed', + 'Deprecated', + 'Removed', + 'Fixed', + 'Security', +]; + +export const getCommands = () => { + const commands: Command[] = []; + + commands.push({ + name: 'sync', + description: + 'Checks CHANGELOG.md for each package in ./packages/ for entries not included in root CHANGELOG.md', + arguments: [], + example: 'sync', + commandFunction: syncChangelogs, + }); + + for (const entrySectionHeader of ENTRY_SECTION_HEADERS) { + commands.push({ + name: entrySectionHeader.toLowerCase(), + description: `Adds changelogEntry to packageName's CHANGELOG.md under ${entrySectionHeader} header`, + arguments: ['packageName', 'changelogEntry'], + example: `yarn changelog ${entrySectionHeader.toLowerCase()} [packageName] [changelogEntry]`, + commandFunction: addChangelogEntry, + }); + } + + return commands; +}; diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/CHANGELOG.md b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/CHANGELOG.md new file mode 100644 index 00000000000..40e0e4d3846 --- /dev/null +++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/CHANGELOG.md @@ -0,0 +1,192 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.0-alpha.0] + +### Added + +- I've added feature XY (#1000) + +### Changed + +- I've cleaned up XY (#1000) + +### Deprecated + +- I've deprecated XY (#1000) + +### Removed + +- I've removed XY (#1000) + +### Fixed + +- I've fixed XY (#1000) + +### Security + +- I've improved the security in XY (#1000) + +## [0.1.0-alpha.1] + +### Added + +- I've added feature XY (#1001) + +### Changed + +- I've cleaned up XY (#1001) + +### Deprecated + +- I've deprecated XY (#1001) + +### Removed + +- I've removed XY (#1001) + +### Fixed + +- I've fixed XY (#1001) + +### Security + +- I've improved the security in XY (#1001) + +## [0.1.0] + +### Added + +- I've added feature XY (#1002) + +### Changed + +- I've cleaned up XY (#1002) + +### Deprecated + +- I've deprecated XY (#1002) + +### Removed + +- I've removed XY (#1002) + +### Fixed + +- I've fixed XY (#1002) + +### Security + +- I've improved the security in XY (#1002) + +## [0.1.1] + +### Added + +- I've added feature XY (#1003) + +### Changed + +- I've cleaned up XY (#1003) + +### Deprecated + +- I've deprecated XY (#1003) + +### Removed + +- I've removed XY (#1003) + +### Fixed + +- I've fixed XY (#1003) + +### Security + +- I've improved the security in XY (#1003) + +## [1.0.0] + +### Added + +- I've added feature XY (#1004) + +### Changed + +- I've cleaned up XY (#1004) + +### Deprecated + +- I've deprecated XY (#1004) + +### Removed + +- I've removed XY (#1004) + +### Fixed + +- I've fixed XY (#1004) + +### Security + +- I've improved the security in XY (#1004) + +## [Unreleased] + +### Added + +- I've added feature XY (#1005) + +### Changed + +- I've cleaned up XY (#1005) + +### Deprecated + +- I've deprecated XY (#1005) + +### Removed + +- I've removed XY (#1005) + +### Fixed + +- I've fixed XY (#1005) + +### Security + +- I've improved the security in XY (#1005) diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json new file mode 100644 index 00000000000..b6f9ba8a2d9 --- /dev/null +++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json @@ -0,0 +1,196 @@ +[ + "# Changelog", + "", + "All notable changes to this project will be documented in this file.", + "", + "The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),", + "and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).", + "", + "", + "", + "## [0.1.0-alpha.0]", + "", + "### Added", + "", + "- I've added feature XY (#1000)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1000)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1000)", + "", + "### Removed", + "", + "- I've removed XY (#1000)", + "", + "### Fixed", + "", + "- I've fixed XY (#1000)", + "", + "### Security", + "", + "- I've improved the security in XY (#1000)", + "", + "## [0.1.0-alpha.1]", + "", + "### Added", + "", + "- I've added feature XY (#1001)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1001)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1001)", + "", + "### Removed", + "", + "- I've removed XY (#1001)", + "", + "### Fixed", + "", + "- I've fixed XY (#1001)", + "", + "### Security", + "", + "- I've improved the security in XY (#1001)", + "", + "## [0.1.0]", + "", + "### Added", + "", + "- I've added feature XY (#1002)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1002)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1002)", + "", + "### Removed", + "", + "- I've removed XY (#1002)", + "", + "### Fixed", + "", + "- I've fixed XY (#1002)", + "", + "### Security", + "", + "- I've improved the security in XY (#1002)", + "", + "## [0.1.1]", + "", + "### Added", + "", + "- I've added feature XY (#1003)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1003)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1003)", + "", + "### Removed", + "", + "- I've removed XY (#1003)", + "", + "### Fixed", + "", + "- I've fixed XY (#1003)", + "", + "### Security", + "", + "- I've improved the security in XY (#1003)", + "", + "## [1.0.0]", + "", + "### Added", + "", + "- I've added feature XY (#1004)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1004)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1004)", + "", + "### Removed", + "", + "- I've removed XY (#1004)", + "", + "### Fixed", + "", + "- I've fixed XY (#1004)", + "", + "### Security", + "", + "- I've improved the security in XY (#1004)", + "", + "## [Unreleased]", + "", + "### Added", + "", + "- I've added feature XY (#1005)", + "- Some new change (#42)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1005)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1005)", + "", + "### Removed", + "", + "- I've removed XY (#1005)", + "", + "### Fixed", + "", + "- I've fixed XY (#1005)", + "", + "### Security", + "", + "- I've improved the security in XY (#1005)", + "" +] diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json new file mode 100644 index 00000000000..540f24ac25e --- /dev/null +++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json @@ -0,0 +1,199 @@ +[ + "# Changelog", + "", + "All notable changes to this project will be documented in this file.", + "", + "The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),", + "and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).", + "", + "", + "", + "## [0.1.0-alpha.0]", + "", + "### Added", + "", + "- I've added feature XY (#1000)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1000)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1000)", + "", + "### Removed", + "", + "- I've removed XY (#1000)", + "", + "### Fixed", + "", + "- I've fixed XY (#1000)", + "", + "### Security", + "", + "- I've improved the security in XY (#1000)", + "", + "## [0.1.0-alpha.1]", + "", + "### Added", + "", + "- I've added feature XY (#1001)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1001)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1001)", + "", + "### Removed", + "", + "- I've removed XY (#1001)", + "", + "### Fixed", + "", + "- I've fixed XY (#1001)", + "", + "### Security", + "", + "- I've improved the security in XY (#1001)", + "", + "## [0.1.0]", + "", + "### Added", + "", + "- I've added feature XY (#1002)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1002)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1002)", + "", + "### Removed", + "", + "- I've removed XY (#1002)", + "", + "### Fixed", + "", + "- I've fixed XY (#1002)", + "", + "### Security", + "", + "- I've improved the security in XY (#1002)", + "", + "## [0.1.1]", + "", + "### Added", + "", + "- I've added feature XY (#1003)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1003)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1003)", + "", + "### Removed", + "", + "- I've removed XY (#1003)", + "", + "### Fixed", + "", + "- I've fixed XY (#1003)", + "", + "### Security", + "", + "- I've improved the security in XY (#1003)", + "", + "## [1.0.0]", + "", + "### Added", + "", + "- I've added feature XY (#1004)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1004)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1004)", + "", + "### Removed", + "", + "- I've removed XY (#1004)", + "", + "### Fixed", + "", + "- I've fixed XY (#1004)", + "", + "### Security", + "", + "- I've improved the security in XY (#1004)", + "", + "## [Unreleased]", + "", + "### Added", + "", + "- I've added feature XY (#1005)", + "", + "### Changed", + "", + "- I've cleaned up XY (#1005)", + "", + "### Deprecated", + "", + "- I've deprecated XY (#1005)", + "", + "### Removed", + "", + "- I've removed XY (#1005)", + "", + "### Fixed", + "", + "- I've fixed XY (#1005)", + "", + "### Security", + "", + "- I've improved the security in XY (#1005)", + "", + "### Newheader", + "", + "- Some new change (#42)", + "" +] diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-2/CHANGELOG.md b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-2/CHANGELOG.md new file mode 100644 index 00000000000..af08bb229bd --- /dev/null +++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-2/CHANGELOG.md @@ -0,0 +1,166 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.0-alpha.1] + +### Added + +- I've added feature XY #2 (#1001) + +### Changed + +- I've cleaned up XY #2 (#1001) + +### Deprecated + +- I've deprecated XY #2 (#1001) + +### Removed + +- I've removed XY #2 (#1001) + +### Fixed + +- I've fixed XY #2 (#1001) + +### Security + +- I've improved the security in XY #2 (#1001) + +## [0.1.0] + +### Added + +- I've added feature XY #2 (#1002) + +### Changed + +- I've cleaned up XY #2 (#1002) + +### Deprecated + +- I've deprecated XY #2 (#1002) + +### Removed + +- I've removed XY #2 (#1002) + +### Fixed + +- I've fixed XY #2 (#1002) + +### Security + +- I've improved the security in XY #2 (#1002) + +## [0.1.1] + +### Added + +- I've added feature XY #2 (#1003) + +### Changed + +- I've cleaned up XY #2 (#1003) + +### Deprecated + +- I've deprecated XY #2 (#1003) + +### Removed + +- I've removed XY #2 (#1003) + +### Fixed + +- I've fixed XY #2 (#1003) + +### Security + +- I've improved the security in XY #2 (#1003) + +## [1.0.0] + +### Added + +- I've added feature XY #2 (#1004) + +### Changed + +- I've cleaned up XY #2 (#1004) + +### Deprecated + +- I've deprecated XY #2 (#1004) + +### Removed + +- I've removed XY #2 (#1004) + +### Fixed + +- I've fixed XY #2 (#1004) + +### Security + +- I've improved the security in XY #2 (#1004) + +## [Unreleased] + +### Added + +- I've added feature XY #2 (#1005) + +### Changed + +- I've cleaned up XY #2 (#1005) + +### Deprecated + +- I've deprecated XY #2 (#1005) + +### Removed + +- I've removed XY #2 (#1005) + +### Fixed + +- I've fixed XY #2 (#1005) + +### Security + +- I've improved the security in XY #2 (#1005) diff --git a/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-3/CHANGELOG.md b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-3/CHANGELOG.md new file mode 100644 index 00000000000..f6ef8c19809 --- /dev/null +++ b/scripts/changelog/test/fixtures/mock_packages_directory/mock-package-3/CHANGELOG.md @@ -0,0 +1,170 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.0] + +### Added + +- I've added feature XY #3 (#1002) + +### Changed + +- I've cleaned up XY #3 (#1002) + +### Deprecated + +- I've deprecated XY #3 (#1002) + +### Removed + +- I've removed XY #3 (#1002) + +### Fixed + +- I've fixed XY #3 (#1002) + +### Security + +- I've improved the security in XY #3 (#1002) + +## [0.1.1] + +### Added + +- I've added feature XY #3 (#1003) +- I've added feature XY #4 (#1003) + +### Changed + +- I've cleaned up XY #3 (#1003) +- I've cleaned up XY #4 (#1003) + +### Deprecated + +- I've deprecated XY #3 (#1003) +- I've deprecated XY #4 (#1003) + +### Removed + +- I've removed XY #3 (#1003) +- I've removed XY #4 (#1003) + +### Fixed + +- I've fixed XY #3 (#1003) +- I've fixed XY #4 (#1003) + +### Security + +- I've improved the security in XY #3 (#1003) +- I've improved the security in XY #4 (#1003) + +## [1.0.0] + +### Added + +- I've added feature XY #3 (#1004) +- I've added feature XY #4 (#1004) +- I've added feature XY #5 (#1004) + +### Changed + +- I've cleaned up XY #3 (#1004) +- I've cleaned up XY #4 (#1004) +- I've cleaned up XY #5 (#1004) + +### Deprecated + +- I've deprecated XY #3 (#1004) +- I've deprecated XY #4 (#1004) +- I've deprecated XY #5 (#1004) + +### Removed + +- I've removed XY #3 (#1004) +- I've removed XY #4 (#1004) +- I've removed XY #5 (#1004) + +### Fixed + +- I've fixed XY #3 (#1004) +- I've fixed XY #4 (#1004) +- I've fixed XY #5 (#1004) + +### Security + +- I've improved the security in XY #3 (#1004) +- I've improved the security in XY #4 (#1004) +- I've improved the security in XY #5 (#1004) + +## [Unreleased] + +### Added + +- I've added feature XY #3 (#1005) +- I've added feature XY #4 (#1005) +- I've added feature XY #5 (#1005) + +### Changed + +- I've cleaned up XY #3 (#1005) +- I've cleaned up XY #4 (#1005) +- I've cleaned up XY #5 (#1005) + +### Deprecated + +- I've deprecated XY #3 (#1005) +- I've deprecated XY #4 (#1005) +- I've deprecated XY #5 (#1005) + +### Removed + +- I've removed XY #3 (#1005) +- I've removed XY #4 (#1005) +- I've removed XY #5 (#1005) + +### Fixed + +- I've fixed XY #3 (#1005) +- I've fixed XY #4 (#1005) +- I've fixed XY #5 (#1005) + +### Security + +- I've improved the security in XY #3 (#1005) +- I've improved the security in XY #4 (#1005) +- I've improved the security in XY #5 (#1005) diff --git a/scripts/changelog/test/fixtures/package_parsed_changelog.ts b/scripts/changelog/test/fixtures/package_parsed_changelog.ts new file mode 100644 index 00000000000..a812d3e1d09 --- /dev/null +++ b/scripts/changelog/test/fixtures/package_parsed_changelog.ts @@ -0,0 +1,114 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const packageUnreleasedSection = [ + '## [Unreleased]', + '', + '### Added', + '', + '- random text (#425)', + '', + '### Removed', + '', + '- `build` entry from `package.json` (#420)', + '- `bar` (#424)', + '', + '### Changed', + '', + '- `tsc` compiled files moved to `lib/` directory from `dist/` (#421)', + '- `foo` (#423)', + '', +]; + +export const parsedPackageChangelog = [ + '# Changelog', + '', + 'All notable changes to this project will be documented in this file.', + '', + 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),', + 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).', + '', + '', + '', + '## [4.0.0-alpha.1]', + '', + '### Breaking Changes', + '', + '#### Connection close is not supported', + '', + 'In `1.x` user had access to raw connection object and can interact with it. e.g.', + '', + '```ts', + 'web3.currentProvider.connection.close();', + '```', + '', + 'But this internal behavior is not exposed any further. Though you can achieve same with this approach.', + '', + '```ts', + 'web3.currentProvider.disconnect();', + '```', + '', + '## [4.0.1-alpha.2]', + '', + '### Changed', + '', + '- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739)', + '', + '## [4.0.1-alpha.5]', + '', + '### Removed', + '', + '- `build` entry from `package.json` (#5755)', + '', + ...packageUnreleasedSection, +]; + +export const packageGroupedUnreleasedEntries = { + '### Added': ['- random text (#425)'], + '### Removed': ['- `build` entry from `package.json` (#420)', '- `bar` (#424)'], + '### Changed': [ + '- `tsc` compiled files moved to `lib/` directory from `dist/` (#421)', + '- `foo` (#423)', + ], +}; diff --git a/scripts/changelog/test/fixtures/root_parsed_changelog.ts b/scripts/changelog/test/fixtures/root_parsed_changelog.ts new file mode 100644 index 00000000000..1081a15aeff --- /dev/null +++ b/scripts/changelog/test/fixtures/root_parsed_changelog.ts @@ -0,0 +1,1160 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const rootUnreleasedSection = [ + '## [Unreleased]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1005)", + "- I've added feature XY #4 (#1005)", + "- I've added feature XY #5 (#1005)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1005)", + "- I've cleaned up XY #4 (#1005)", + "- I've cleaned up XY #5 (#1005)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1005)", + "- I've deprecated XY #4 (#1005)", + "- I've deprecated XY #5 (#1005)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1005)", + '', + '#### mock-package-3', + "- I've removed XY #3 (#1005)", + "- I've removed XY #4 (#1005)", + "- I've removed XY #5 (#1005)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1005)", + "- I've fixed XY #4 (#1005)", + "- I've fixed XY #5 (#1005)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1005)", + '', + '#### mock-package-3', + "- I've improved the security in XY #3 (#1005)", + "- I've improved the security in XY #4 (#1005)", + "- I've improved the security in XY #5 (#1005)", + '', +]; + +export const parsedRootChangelog = [ + '# Changelog', + '', + 'All notable changes to this project will be documented in this file.', + '', + 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),', + 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).', + '', + '', + '## [0.1.0-alpha.0]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1000)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1000)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1000)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1000)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1000)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1000)", + '', + '## [0.1.0-alpha.1]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1001)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1001)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1001)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1001)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1001)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1001)", + '', + '## [0.1.0]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1002)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1002)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1002)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've removed XY #3 (#1002)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1002)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've improved the security in XY #3 (#1002)", + '', + '## [0.1.1]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1003)", + "- I've added feature XY #4 (#1003)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1003)", + "- I've cleaned up XY #4 (#1003)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1003)", + "- I've deprecated XY #4 (#1003)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've removed XY #3 (#1003)", + "- I've removed XY #4 (#1003)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1003)", + "- I've fixed XY #4 (#1003)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've improved the security in XY #3 (#1003)", + "- I've improved the security in XY #4 (#1003)", + '', + '## [1.0.0]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1004)", + "- I've added feature XY #4 (#1004)", + "- I've added feature XY #5 (#1004)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1004)", + "- I've cleaned up XY #4 (#1004)", + "- I've cleaned up XY #5 (#1004)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1004)", + "- I've deprecated XY #4 (#1004)", + "- I've deprecated XY #5 (#1004)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1004)", + '', + '#### mock-package-3', + "- I've removed XY #3 (#1004)", + "- I've removed XY #4 (#1004)", + "- I've removed XY #5 (#1004)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1004)", + "- I've fixed XY #4 (#1004)", + "- I've fixed XY #5 (#1004)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1004)", + '', + '#### mock-package-3', + "- I've improved the security in XY #3 (#1004)", + "- I've improved the security in XY #4 (#1004)", + "- I've improved the security in XY #5 (#1004)", + '', + ...rootUnreleasedSection, +]; + +export const rootGroupedUnreleasedEntries = { + '### Added': { + '#### mock-package-1': ["- I've added feature XY (#1005)"], + '#### mock-package-2': ["- I've added feature XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've added feature XY #3 (#1005)", + "- I've added feature XY #4 (#1005)", + "- I've added feature XY #5 (#1005)", + ], + }, + '### Changed': { + '#### mock-package-1': ["- I've cleaned up XY (#1005)"], + '#### mock-package-2': ["- I've cleaned up XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've cleaned up XY #3 (#1005)", + "- I've cleaned up XY #4 (#1005)", + "- I've cleaned up XY #5 (#1005)", + ], + }, + '### Deprecated': { + '#### mock-package-1': ["- I've deprecated XY (#1005)"], + '#### mock-package-2': ["- I've deprecated XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've deprecated XY #3 (#1005)", + "- I've deprecated XY #4 (#1005)", + "- I've deprecated XY #5 (#1005)", + ], + }, + '### Removed': { + '#### mock-package-1': ["- I've removed XY (#1005)"], + '#### mock-package-2': ["- I've removed XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've removed XY #3 (#1005)", + "- I've removed XY #4 (#1005)", + "- I've removed XY #5 (#1005)", + ], + }, + '### Fixed': { + '#### mock-package-1': ["- I've fixed XY (#1005)"], + '#### mock-package-2': ["- I've fixed XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've fixed XY #3 (#1005)", + "- I've fixed XY #4 (#1005)", + "- I've fixed XY #5 (#1005)", + ], + }, + '### Security': { + '#### mock-package-1': ["- I've improved the security in XY (#1005)"], + '#### mock-package-2': ["- I've improved the security in XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've improved the security in XY #3 (#1005)", + "- I've improved the security in XY #4 (#1005)", + "- I've improved the security in XY #5 (#1005)", + ], + }, +}; + +export const rootSyncedGroupedUnreleasedEntries = { + '### Added': { + '#### mock-package-1': ["- I've added feature XY (#1005)"], + '#### mock-package-2': ["- I've added feature XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've added feature XY #3 (#1005)", + "- I've added feature XY #4 (#1005)", + "- I've added feature XY #5 (#1005)", + ], + }, + '### Changed': { + '#### mock-package-1': ["- I've cleaned up XY (#1005)"], + '#### mock-package-2': ["- I've cleaned up XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've cleaned up XY #3 (#1005)", + "- I've cleaned up XY #4 (#1005)", + "- I've cleaned up XY #5 (#1005)", + ], + }, + '### Deprecated': { + '#### mock-package-1': ["- I've deprecated XY (#1005)"], + '#### mock-package-2': ["- I've deprecated XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've deprecated XY #3 (#1005)", + "- I've deprecated XY #4 (#1005)", + "- I've deprecated XY #5 (#1005)", + ], + }, + '### Removed': { + '#### mock-package-1': ["- I've removed XY (#1005)"], + '#### mock-package-2': ["- I've removed XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've removed XY #3 (#1005)", + "- I've removed XY #4 (#1005)", + "- I've removed XY #5 (#1005)", + ], + }, + '### Fixed': { + '#### mock-package-1': ["- I've fixed XY (#1005)"], + '#### mock-package-2': ["- I've fixed XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've fixed XY #3 (#1005)", + "- I've fixed XY #4 (#1005)", + "- I've fixed XY #5 (#1005)", + ], + }, + '### Security': { + '#### mock-package-1': ["- I've improved the security in XY (#1005)"], + '#### mock-package-2': ["- I've improved the security in XY #2 (#1005)"], + '#### mock-package-3': [ + "- I've improved the security in XY #3 (#1005)", + "- I've improved the security in XY #4 (#1005)", + "- I've improved the security in XY #5 (#1005)", + ], + }, +}; + +export const rootFlattenedSyncedUnreleasedEntries = [ + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1005)", + "- I've added feature XY #4 (#1005)", + "- I've added feature XY #5 (#1005)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1005)", + "- I've cleaned up XY #4 (#1005)", + "- I've cleaned up XY #5 (#1005)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1005)", + "- I've deprecated XY #4 (#1005)", + "- I've deprecated XY #5 (#1005)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've removed XY #3 (#1005)", + "- I've removed XY #4 (#1005)", + "- I've removed XY #5 (#1005)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1005)", + "- I've fixed XY #4 (#1005)", + "- I've fixed XY #5 (#1005)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1005)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1005)", + '', + '#### mock-package-3', + '', + "- I've improved the security in XY #3 (#1005)", + "- I've improved the security in XY #4 (#1005)", + "- I've improved the security in XY #5 (#1005)", + '', +]; + +export const rootSyncedChangelog = [ + '# Changelog', + '', + 'All notable changes to this project will be documented in this file.', + '', + 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),', + 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).', + '', + '', + '', + '## [0.1.0-alpha.0]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1000)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1000)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1000)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1000)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1000)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1000)", + '', + '## [0.1.0-alpha.1]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1001)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1001)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1001)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1001)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1001)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1001)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1001)", + '', + '## [0.1.0]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1002)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1002)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1002)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've removed XY #3 (#1002)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1002)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1002)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1002)", + '', + '#### mock-package-3', + '', + "- I've improved the security in XY #3 (#1002)", + '', + '## [0.1.1]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1003)", + "- I've added feature XY #4 (#1003)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1003)", + "- I've cleaned up XY #4 (#1003)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1003)", + "- I've deprecated XY #4 (#1003)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've removed XY #3 (#1003)", + "- I've removed XY #4 (#1003)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1003)", + "- I've fixed XY #4 (#1003)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1003)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1003)", + '', + '#### mock-package-3', + '', + "- I've improved the security in XY #3 (#1003)", + "- I've improved the security in XY #4 (#1003)", + '', + '## [1.0.0]', + '', + '### Added', + '', + '#### mock-package-1', + '', + "- I've added feature XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've added feature XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've added feature XY #3 (#1004)", + "- I've added feature XY #4 (#1004)", + "- I've added feature XY #5 (#1004)", + '', + '### Changed', + '', + '#### mock-package-1', + '', + "- I've cleaned up XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've cleaned up XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've cleaned up XY #3 (#1004)", + "- I've cleaned up XY #4 (#1004)", + "- I've cleaned up XY #5 (#1004)", + '', + '### Deprecated', + '', + '#### mock-package-1', + '', + "- I've deprecated XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've deprecated XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've deprecated XY #3 (#1004)", + "- I've deprecated XY #4 (#1004)", + "- I've deprecated XY #5 (#1004)", + '', + '### Removed', + '', + '#### mock-package-1', + '', + "- I've removed XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've removed XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've removed XY #3 (#1004)", + "- I've removed XY #4 (#1004)", + "- I've removed XY #5 (#1004)", + '', + '### Fixed', + '', + '#### mock-package-1', + '', + "- I've fixed XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've fixed XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've fixed XY #3 (#1004)", + "- I've fixed XY #4 (#1004)", + "- I've fixed XY #5 (#1004)", + '', + '### Security', + '', + '#### mock-package-1', + '', + "- I've improved the security in XY (#1004)", + '', + '#### mock-package-2', + '', + "- I've improved the security in XY #2 (#1004)", + '', + '#### mock-package-3', + '', + "- I've improved the security in XY #3 (#1004)", + "- I've improved the security in XY #4 (#1004)", + "- I've improved the security in XY #5 (#1004)", + '', + '## [Unreleased]', + '', + ...rootFlattenedSyncedUnreleasedEntries, +]; diff --git a/scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl b/scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl new file mode 100644 index 00000000000..cad5393ff66 --- /dev/null +++ b/scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl @@ -0,0 +1,474 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.0-alpha.0] + +### Added + +#### mock-package-1 + +- I've added feature XY (#1000) + +### Changed + +#### mock-package-1 + +- I've cleaned up XY (#1000) + +### Deprecated + +#### mock-package-1 + +- I've deprecated XY (#1000) + +### Removed + +#### mock-package-1 + +- I've removed XY (#1000) + +### Fixed + +#### mock-package-1 + +- I've fixed XY (#1000) + +### Security + +#### mock-package-1 + +- I've improved the security in XY (#1000) + +## [0.1.0-alpha.1] + +### Added + +#### mock-package-1 + +- I've added feature XY (#1001) + +#### mock-package-2 + +- I've added feature XY #2 (#1001) + +### Changed + +#### mock-package-1 + +- I've cleaned up XY (#1001) + +#### mock-package-2 + +- I've cleaned up XY #2 (#1001) + +### Deprecated + +#### mock-package-1 + +- I've deprecated XY (#1001) + +#### mock-package-2 + +- I've deprecated XY #2 (#1001) + +### Removed + +#### mock-package-1 + +- I've removed XY (#1001) + +#### mock-package-2 + +- I've removed XY #2 (#1001) + +### Fixed + +#### mock-package-1 + +- I've fixed XY (#1001) + +#### mock-package-2 + +- I've fixed XY #2 (#1001) + +### Security + +#### mock-package-1 + +- I've improved the security in XY (#1001) + +#### mock-package-2 + +- I've improved the security in XY #2 (#1001) + +## [0.1.0] + +### Added + +#### mock-package-1 + +- I've added feature XY (#1002) + +#### mock-package-2 + +- I've added feature XY #2 (#1002) + +#### mock-package-3 + +- I've added feature XY #3 (#1002) + +### Changed + +#### mock-package-1 + +- I've cleaned up XY (#1002) + +#### mock-package-2 + +- I've cleaned up XY #2 (#1002) + +#### mock-package-3 + +- I've cleaned up XY #3 (#1002) + +### Deprecated + +#### mock-package-1 + +- I've deprecated XY (#1002) + +#### mock-package-2 + +- I've deprecated XY #2 (#1002) + +#### mock-package-3 + +- I've deprecated XY #3 (#1002) + +### Removed + +#### mock-package-1 + +- I've removed XY (#1002) + +#### mock-package-2 + +- I've removed XY #2 (#1002) + +#### mock-package-3 + +- I've removed XY #3 (#1002) + +### Fixed + +#### mock-package-1 + +- I've fixed XY (#1002) + +#### mock-package-2 + +- I've fixed XY #2 (#1002) + +#### mock-package-3 + +- I've fixed XY #3 (#1002) + +### Security + +#### mock-package-1 + +- I've improved the security in XY (#1002) + +#### mock-package-2 + +- I've improved the security in XY #2 (#1002) + +#### mock-package-3 + +- I've improved the security in XY #3 (#1002) + +## [0.1.1] + +### Added + +#### mock-package-1 + +- I've added feature XY (#1003) + +#### mock-package-2 + +- I've added feature XY #2 (#1003) + +#### mock-package-3 + +- I've added feature XY #3 (#1003) +- I've added feature XY #4 (#1003) + +### Changed + +#### mock-package-1 + +- I've cleaned up XY (#1003) + +#### mock-package-2 + +- I've cleaned up XY #2 (#1003) + +#### mock-package-3 + +- I've cleaned up XY #3 (#1003) +- I've cleaned up XY #4 (#1003) + +### Deprecated + +#### mock-package-1 + +- I've deprecated XY (#1003) + +#### mock-package-2 + +- I've deprecated XY #2 (#1003) + +#### mock-package-3 + +- I've deprecated XY #3 (#1003) +- I've deprecated XY #4 (#1003) + +### Removed + +#### mock-package-1 + +- I've removed XY (#1003) + +#### mock-package-2 + +- I've removed XY #2 (#1003) + +#### mock-package-3 + +- I've removed XY #3 (#1003) +- I've removed XY #4 (#1003) + +### Fixed + +#### mock-package-1 + +- I've fixed XY (#1003) + +#### mock-package-2 + +- I've fixed XY #2 (#1003) + +#### mock-package-3 + +- I've fixed XY #3 (#1003) +- I've fixed XY #4 (#1003) + +### Security + +#### mock-package-1 + +- I've improved the security in XY (#1003) + +#### mock-package-2 + +- I've improved the security in XY #2 (#1003) + +#### mock-package-3 + +- I've improved the security in XY #3 (#1003) +- I've improved the security in XY #4 (#1003) + +## [1.0.0] + +### Added + +#### mock-package-1 + +- I've added feature XY (#1004) + +#### mock-package-2 + +- I've added feature XY #2 (#1004) + +#### mock-package-3 + +- I've added feature XY #3 (#1004) +- I've added feature XY #4 (#1004) +- I've added feature XY #5 (#1004) + +### Changed + +#### mock-package-1 + +- I've cleaned up XY (#1004) + +#### mock-package-2 + +- I've cleaned up XY #2 (#1004) + +#### mock-package-3 + +- I've cleaned up XY #3 (#1004) +- I've cleaned up XY #4 (#1004) +- I've cleaned up XY #5 (#1004) + +### Deprecated + +#### mock-package-1 + +- I've deprecated XY (#1004) + +#### mock-package-2 + +- I've deprecated XY #2 (#1004) + +#### mock-package-3 + +- I've deprecated XY #3 (#1004) +- I've deprecated XY #4 (#1004) +- I've deprecated XY #5 (#1004) + +### Removed + +#### mock-package-1 + +- I've removed XY (#1004) + +#### mock-package-2 + +- I've removed XY #2 (#1004) + +#### mock-package-3 + +- I've removed XY #3 (#1004) +- I've removed XY #4 (#1004) +- I've removed XY #5 (#1004) + +### Fixed + +#### mock-package-1 + +- I've fixed XY (#1004) + +#### mock-package-2 + +- I've fixed XY #2 (#1004) + +#### mock-package-3 + +- I've fixed XY #3 (#1004) +- I've fixed XY #4 (#1004) +- I've fixed XY #5 (#1004) + +### Security + +#### mock-package-1 + +- I've improved the security in XY (#1004) + +#### mock-package-2 + +- I've improved the security in XY #2 (#1004) + +#### mock-package-3 + +- I've improved the security in XY #3 (#1004) +- I've improved the security in XY #4 (#1004) +- I've improved the security in XY #5 (#1004) + +## [Unreleased] + +### Added + +#### mock-package-1 + +- I've added feature XY (#1005) + +#### mock-package-3 + +- I've added feature XY #3 (#1005) +- I've added feature XY #5 (#1005) + +### Changed + +#### mock-package-1 + +- I've cleaned up XY (#1005) + +#### mock-package-3 + +- I've cleaned up XY #5 (#1005) + +### Deprecated + +#### mock-package-1 + +- I've deprecated XY (#1005) + +### Removed + +#### mock-package-1 + +- I've removed XY (#1005) + +#### mock-package-3 + +- I've removed XY #3 (#1005) +- I've removed XY #4 (#1005) + +### Fixed + +#### mock-package-1 + +- I've fixed XY (#1005) + +#### mock-package-3 + +- I've fixed XY #4 (#1005) + +### Security + +#### mock-package-1 + +- I've improved the security in XY (#1005) + +#### mock-package-3 + +- I've improved the security in XY #3 (#1005) +- I've improved the security in XY #4 (#1005) +- I've improved the security in XY #5 (#1005) diff --git a/scripts/changelog/test/unit/add_changelog_entry.test.ts b/scripts/changelog/test/unit/add_changelog_entry.test.ts new file mode 100644 index 00000000000..3043d2b162a --- /dev/null +++ b/scripts/changelog/test/unit/add_changelog_entry.test.ts @@ -0,0 +1,76 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { copyFileSync, readFileSync, unlinkSync } from 'fs'; + +import { addChangelogEntry } from '../../src/add_changelog_entry'; +import { getListOfPackageNames } from '../../src/helpers'; +import TestChangelogConfig from './test_changelog_config.json'; +import ModifiedTestChangelogConfig from './test_changelog_config_for_add_changelog_entry_tests.json'; +import ExpectedModifiedChangelog from '../fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG.json'; +import ExpectedModifiedChangelog2 from '../fixtures/mock_packages_directory/mock-package-1/expected_modified_CHANGELOG_2.json'; + +describe('Add Changelog Entry tests', () => { + it('should add an entry under the Added header`', () => { + const listOfPackageNames = getListOfPackageNames(TestChangelogConfig.packagesDirectoryPath); + + copyFileSync( + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${TestChangelogConfig.packagesChangelogPath}`, + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`, + ); + + addChangelogEntry('added', [ + './scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json', + listOfPackageNames[0], + 'Some new change (#42)', + ]); + + const parsedModifiedChangelog = readFileSync( + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`, + 'utf8', + ).split(/\n/); + expect(parsedModifiedChangelog).toEqual(ExpectedModifiedChangelog); + + unlinkSync( + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`, + ); + }); + + it('should add the header Newheader and add an entry under it`', () => { + const listOfPackageNames = getListOfPackageNames(TestChangelogConfig.packagesDirectoryPath); + + copyFileSync( + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${TestChangelogConfig.packagesChangelogPath}`, + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`, + ); + + addChangelogEntry('newheader', [ + './scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json', + listOfPackageNames[0], + 'Some new change (#42)', + ]); + + const parsedModifiedChangelog = readFileSync( + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`, + 'utf8', + ).split(/\n/); + expect(parsedModifiedChangelog).toEqual(ExpectedModifiedChangelog2); + + unlinkSync( + `${TestChangelogConfig.packagesDirectoryPath}/${listOfPackageNames[0]}/${ModifiedTestChangelogConfig.packagesChangelogPath}`, + ); + }); +}); diff --git a/scripts/changelog/test/unit/helpers.test.ts b/scripts/changelog/test/unit/helpers.test.ts new file mode 100644 index 00000000000..10c35467247 --- /dev/null +++ b/scripts/changelog/test/unit/helpers.test.ts @@ -0,0 +1,80 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { getListOfPackageNames, parseArgs } from '../../src/helpers'; +import { Command } from '../../src/types'; + +describe('Changelog Helpers tests', () => { + const mockCommandFunction = jest.fn(); + const mockCommandFunction2 = jest.fn(); + const commands: Command[] = [ + { + name: 'mockCommand', + description: 'mockCommand', + arguments: [], + example: 'mockCommand', + commandFunction: mockCommandFunction, + }, + { + name: 'mockCommand2', + description: 'mockCommand2', + arguments: ['argument1', 'argument2'], + example: 'mockCommand2', + commandFunction: mockCommandFunction2, + }, + ]; + + it('should parse args and execute mockCommandFunction with no arguments', () => { + process.argv = ['', '', 'mockCommand']; + parseArgs(commands); + + expect(commands[0].commandFunction).toHaveBeenCalledWith('mockCommand', []); + }); + + it('should parse args and execute mockCommandFunction2 with two arguments', () => { + const expectedArguments = ['arg1', 'arg2']; + process.argv = ['', '', 'mockCommand2', ...expectedArguments]; + parseArgs(commands); + + expect(commands[1].commandFunction).toHaveBeenCalledWith('mockCommand2', expectedArguments); + }); + + it('should parse args, not execute either commandFunctions, and call console.log and console.table', () => { + // eslint-disable-next-line no-console + console.log = jest.fn(); + // eslint-disable-next-line no-console + console.table = jest.fn(); + process.argv = ['', '']; + + parseArgs(commands); + + expect(commands[0].commandFunction).not.toHaveBeenCalledWith(); + expect(commands[1].commandFunction).not.toHaveBeenCalledWith(); + // eslint-disable-next-line no-console + expect(console.log).toHaveBeenLastCalledWith( + 'Invalid command, please refer to below table for expected commands:', + ); + // eslint-disable-next-line no-console + expect(console.table).toHaveBeenCalledWith(commands); + }); + + it('should get list of directory names in ../fixtures/mock_packages_directory', () => { + const result = getListOfPackageNames( + './scripts/changelog/test/fixtures/mock_packages_directory', + ); + expect(result).toEqual(['mock-package-1', 'mock-package-2', 'mock-package-3']); + }); +}); diff --git a/scripts/changelog/test/unit/sync.test.ts b/scripts/changelog/test/unit/sync.test.ts new file mode 100644 index 00000000000..b9ef50f64f2 --- /dev/null +++ b/scripts/changelog/test/unit/sync.test.ts @@ -0,0 +1,104 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { copyFileSync, readFileSync, unlinkSync } from 'fs'; + +import { + flattenSyncedUnreleasedEntries, + getPackageGroupedUnreleasedEntries, + getRootGroupedUnreleasedEntries, + getSyncedGroupedUnreleasedEntries, + getUnreleasedSection, + syncChangelogs, +} from '../../src/sync'; +import { getListOfPackageNames } from '../../src/helpers'; +import { + parsedPackageChangelog, + packageUnreleasedSection, + packageGroupedUnreleasedEntries, +} from '../fixtures/package_parsed_changelog'; +import { + rootFlattenedSyncedUnreleasedEntries, + rootGroupedUnreleasedEntries, + rootSyncedChangelog, + rootSyncedGroupedUnreleasedEntries, + rootUnreleasedSection, +} from '../fixtures/root_parsed_changelog'; +import TestChangelogConfig from './test_changelog_config.json'; + +describe('Changelog Sync tests', () => { + let listOfPackageNames: string[]; + + beforeAll(() => { + listOfPackageNames = getListOfPackageNames( + './scripts/changelog/test/fixtures/mock_packages_directory', + ); + }); + + it('should get package unreleased section', () => { + const result = getUnreleasedSection(parsedPackageChangelog); + expect(result).toEqual(packageUnreleasedSection); + }); + + it('should get root grouped unreleased entries', () => { + const result = getRootGroupedUnreleasedEntries(rootUnreleasedSection); + expect(result).toEqual(rootGroupedUnreleasedEntries); + }); + + it('should get package grouped unreleased entries', () => { + const result = getPackageGroupedUnreleasedEntries(packageUnreleasedSection); + expect(result).toEqual(packageGroupedUnreleasedEntries); + }); + + it('should get synced grouped unreleased entries', () => { + const result = getSyncedGroupedUnreleasedEntries( + listOfPackageNames, + TestChangelogConfig, + rootGroupedUnreleasedEntries, + ); + expect(result).toEqual(rootSyncedGroupedUnreleasedEntries); + }); + + it('should flatten synced unreleased entries', () => { + const syncedGroupedUnreleasedEntries = getSyncedGroupedUnreleasedEntries( + listOfPackageNames, + TestChangelogConfig, + rootGroupedUnreleasedEntries, + ); + const result = flattenSyncedUnreleasedEntries( + syncedGroupedUnreleasedEntries, + listOfPackageNames, + ); + expect(result).toEqual(rootFlattenedSyncedUnreleasedEntries); + }); + + it('should sync all package CHANGELOGs with root CHANGELOG.md', () => { + copyFileSync( + './scripts/changelog/test/fixtures/root_unsynced_CHANGELOG.tmpl', + TestChangelogConfig.rootChangelogPath, + ); + + syncChangelogs('sync', ['./scripts/changelog/test/unit/test_changelog_config.json']); + + const parsedRootChangelog = readFileSync( + TestChangelogConfig.rootChangelogPath, + 'utf8', + ).split(/\n/); + expect(parsedRootChangelog).toEqual(rootSyncedChangelog); + + unlinkSync(TestChangelogConfig.rootChangelogPath); + }); +}); diff --git a/scripts/changelog/test/unit/test_changelog_config.json b/scripts/changelog/test/unit/test_changelog_config.json new file mode 100644 index 00000000000..95555719f3a --- /dev/null +++ b/scripts/changelog/test/unit/test_changelog_config.json @@ -0,0 +1,5 @@ +{ + "packagesDirectoryPath": "./scripts/changelog/test/fixtures/mock_packages_directory", + "packagesChangelogPath": "CHANGELOG.md", + "rootChangelogPath": "./scripts/changelog/test/fixtures/mock_packages_directory/CHANGELOG.md" +} diff --git a/scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json b/scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json new file mode 100644 index 00000000000..40bcfb7045c --- /dev/null +++ b/scripts/changelog/test/unit/test_changelog_config_for_add_changelog_entry_tests.json @@ -0,0 +1,5 @@ +{ + "packagesDirectoryPath": "./scripts/changelog/test/fixtures/mock_packages_directory", + "packagesChangelogPath": "MODIFIED_CHANGELOG.md", + "rootChangelogPath": "./scripts/changelog/test/fixtures/mock_packages_directory/CHANGELOG.md" +} diff --git a/scripts/changelog/tsconfig.json b/scripts/changelog/tsconfig.json new file mode 100644 index 00000000000..205930ac6db --- /dev/null +++ b/scripts/changelog/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "esModuleInterop": true, + "module": "commonjs", + "declaration": false, + "declarationMap": false + }, + "include": ["src/**/*"] +} diff --git a/scripts/ci.sh b/scripts/ci.sh deleted file mode 100755 index c8e6555c000..00000000000 --- a/scripts/ci.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash - -# ----------------------------- -# CI matrix job selector -# ----------------------------- - -# Exit immediately on error -set -o errexit - -if [ "$TEST" = "unit" ]; then - - npm run build - npm run test:unit - -elif [ "$TEST" = "build_and_lint" ]; then - - npm run build - npm run dtslint - npm run depcheck - npm run bundlesize - -elif [ "$TEST" = "unit_and_e2e_clients" ]; then - - npm run build - npm run test:e2e:ganache - npm run test:e2e:geth:insta - npm run test:e2e:geth:auto - npm run test:unit - npm run cov:merge_reports - -elif [ "$TEST" = "e2e_browsers" ]; then - - npm run build - npm run test:e2e:chrome - npm run test:e2e:firefox - npm run test:e2e:min - npm run test:e2e:cdn - -elif [ "$TEST" = "e2e_truffle" ]; then - - npm run test:e2e:publish - npm run test:e2e:truffle - -elif [ "$TEST" = "e2e_mosaic" ]; then - - npm run test:e2e:publish - npm run test:e2e:mosaic - -elif [ "$TEST" = "e2e_windows" ]; then - - bash ./scripts/e2e.npm.publish.sh - bash ./scripts/e2e.windows.sh - -elif [ "$TEST" = "e2e_ganache" ]; then - - npm run test:e2e:publish - npm run test:e2e:ganache:core - -elif [ "$TEST" = "e2e_gnosis_dex" ]; then - - npm run test:e2e:publish - npm run test:e2e:gnosis:dex - -fi diff --git a/scripts/compile_contracts.js b/scripts/compile_contracts.js new file mode 100755 index 00000000000..7ef1cb4d7bf --- /dev/null +++ b/scripts/compile_contracts.js @@ -0,0 +1,117 @@ +#!/usr/bin/env node + +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +/* eslint-disable header/header */ +/* eslint-disable @typescript-eslint/no-var-requires */ + +const { promisify } = require('util'); +const { resolve } = require('path'); +const { compile } = require('solc'); +const { rm, readdirSync, readFileSync, writeFileSync, mkdirSync, existsSync } = require('fs'); + +const rmPromise = promisify(rm); + +// Fetch path of build +const buildPath = resolve(__dirname, '../fixtures/build'); +const contractsPath = resolve(__dirname, '../fixtures/contracts'); +const importDir = resolve(__dirname, '../node_modules'); + +function findImports(path) { + const importPath = resolve(importDir, path); + + if (existsSync(importPath)) { + return { + contents: readFileSync(importPath, 'utf8'), + }; + } + + return { error: 'File not found' }; +} + +(async () => { + try { + await rmPromise(buildPath, { recursive: true }); + } catch (error) { + // Ignore if directory does not exists + if (error.code !== 'ENOENT') { + throw error; + } + } + + // Fetch all Contract files in Contracts folder + const fileNames = readdirSync(contractsPath); + + // Gets ABI of all contracts into variable input + const input = fileNames.reduce( + (previousValue, fileName) => { + const filePath = resolve(contractsPath, fileName); + const source = readFileSync(filePath, 'utf8'); + + return { sources: { ...previousValue.sources, [fileName]: { content: source } } }; + }, + { sources: {} }, + ); + + const compileInput = { + ...input, + language: 'Solidity', + settings: { outputSelection: { '*': { '*': ['abi', 'evm.bytecode.object'] } } }, + }; + + const compileResult = JSON.parse( + compile(JSON.stringify(compileInput), { import: findImports }), + ); + if (compileResult.errors) { + console.error(compileResult.errors); + console.log('Error while compiling'); + } + // Compile all contracts + const output = compileResult.contracts; + + // Re-Create build folder for output files from each contract + mkdirSync(buildPath); + + console.log(output); + + // Output contains all objects from all contracts + // Write the contents of each to different files + for (let contract in output) { + const contractName = contract.replace('.sol', ''); + const contractBuild = output[contract][contractName]; + + if (!contractBuild || (contractBuild && !contractBuild['abi'])) { + continue; + } + + const contractTsInterface = `export const ${contractName}Abi = ${JSON.stringify( + contractBuild['abi'], + )} as const; \n export const ${contractName}Bytecode = '0x${ + contractBuild['evm']['bytecode']['object'] + }';`; + + writeFileSync( + resolve(buildPath, contractName + '.json'), + JSON.stringify(contractBuild, null, '\t'), + ); + writeFileSync(resolve(buildPath, contractName + '.ts'), contractTsInterface); + } + + console.info('Compiled successfully'); + process.exit(0); +})().catch(console.error); diff --git a/scripts/copyCommitCommentToPrComment.js b/scripts/copyCommitCommentToPrComment.js new file mode 100755 index 00000000000..2571c0eea03 --- /dev/null +++ b/scripts/copyCommitCommentToPrComment.js @@ -0,0 +1,88 @@ +#!/usr/bin/env node + +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +const { Octokit } = require('@octokit/core'); +const token = process.argv[2]; +const commitSha = process.argv[3]; +const prNumber = process.argv[4]; + +const owner = 'web3'; +const repo = 'web3.js'; + +const octokit = new Octokit({ + auth: token, +}); + +const run = async () => { + const list = await octokit.request( + `GET /repos/${owner}/${repo}/commits/${commitSha}/comments`, + { + owner, + repo, + commit_sha: commitSha, + headers: { + 'X-GitHub-Api-Version': '2022-11-28', + }, + }, + ); + // get latest commit comment body + let body = list.data[list.data.length - 1].body; + // remove
tag + body = body.replace('
', '').replace('
', ''); + // find if there is already a comment in PR + const comments = await octokit.request( + `GET /repos/${owner}/${repo}/issues/${prNumber}/comments`, + { + owner, + repo, + issue_number: prNumber, + headers: { + 'X-GitHub-Api-Version': '2022-11-28', + }, + }, + ); + const benchMarkComment = comments.data.find(c => c.body.includes(`# Benchmark`)); + if (benchMarkComment) { + // update benchMarkComment + await octokit.request( + `PATCH /repos/${owner}/${repo}/issues/comments/${benchMarkComment.id}`, + { + owner, + repo, + comment_id: benchMarkComment.id, + body, + headers: { + 'X-GitHub-Api-Version': '2022-11-28', + }, + }, + ); + } else { + // create new comment in PR + await octokit.request(`POST /repos/${owner}/${repo}/issues/${prNumber}/comments`, { + owner, + repo, + issue_number: prNumber, + body, + headers: { + 'X-GitHub-Api-Version': '2022-11-28', + }, + }); + } +}; + +run().catch(console.error); diff --git a/scripts/docshelper/base.config.js b/scripts/docshelper/base.config.js new file mode 100644 index 00000000000..25c6ac83d44 --- /dev/null +++ b/scripts/docshelper/base.config.js @@ -0,0 +1,59 @@ +module.exports = { + entryPointStrategy: "expand", + out: "./docs/docs/libdocs/", + + // "exclude": [ + // "**/*.test.ts" + // ], + plugin: [ + "typedoc-plugin-markdown", + "typedoc-plugin-merge-modules" + ], + + mergeModulesRenameDefaults: true, // NEW option of TypeDoc added by typedoc-plugin-merge-modules plugin + + hideInPageTOC: true, + hideBreadcrumbs: true, + hidePageTitle: true, + + //publicPath: "https://docs.web3js.org/libdocs/", + //filenameSeparator : "-", + //indexTitle: "", + //preserveAnchorCasing: true, + disableSources:true, + excludeExternals: true, + excludeReferences: true, + tsconfig: "./docs/tsconfig.docs.json", + excludeNotDocumented: true, + + excludeNotDocumentedKinds: [ + "Namespace", + "Enum", + "EnumMember", + "Variable", + "Function", + "Class", + "Interface", + "Constructor", + "Property", + "Method", + "CallSignature", + "IndexSignature", + "ConstructorSignature", + "Accessor", + "GetSignature", + "SetSignature", + "TypeAlias", + "Reference" + ], + excludeInternal: true, + excludePrivate: true, + excludeProtected: true, + + visibilityFilters: { + "protected": false, + "private": false, + "inherited": false, + "external": false + } +}; diff --git a/scripts/docshelper/classesdoc.config.js b/scripts/docshelper/classesdoc.config.js new file mode 100644 index 00000000000..1c8a9d45cb2 --- /dev/null +++ b/scripts/docshelper/classesdoc.config.js @@ -0,0 +1,20 @@ +const baseDocConfig = require('./base.config.js'); + +module.exports = { + ... baseDocConfig, + + entryPoints: [ + "./packages/web3-eth/src/web3_eth.ts", + "./packages/web3-eth-accounts/src/wallet.ts", + "./packages/web3-eth-accounts/src/account.ts", + "./packages/web3-eth-contract/src/contract.ts", + "./packages/web3-eth-ens/src/ens.ts", + "./packages/web3-eth-iban/src/iban.ts", + "./packages/web3-eth-personal/src/personal.ts", + "./packages/web3-net/src/net.ts", + ], + + excludeCategories: "ContractEvent", // for exluding being in module.md file and invalid link in contract.md + mergeModulesMergeMode: "project", // NEW option of TypeDoc added by typedoc-plugin-merge-modules plugin + +}; diff --git a/scripts/docshelper/functionsdoc.config.js b/scripts/docshelper/functionsdoc.config.js new file mode 100644 index 00000000000..2d9b1e8b4f4 --- /dev/null +++ b/scripts/docshelper/functionsdoc.config.js @@ -0,0 +1,28 @@ + +const baseConfig = require('./base.config.js'); + +module.exports = { + ... baseConfig, + + entryPoints: [ + "./packages/web3-eth-accounts/src/account.ts", + //utils + "./packages/web3-utils/src/converters.ts", + "./packages/web3-utils/src/hash.ts", + "./packages/web3-utils/src/validation.ts", + "./packages/web3-utils/src/random.ts", + "./packages/web3-utils/src/string_manipulation.ts", + "./packages/web3-utils/src/uuid.ts", + //ABI + "./packages/web3-eth-abi/src/api/functions_api.ts", + "./packages/web3-eth-abi/src/eip_712.ts", + "./packages/web3-eth-abi/src/api/errors_api.ts", + "./packages/web3-eth-abi/src/api/events_api.ts", + "./packages/web3-eth-abi/src/api/logs_api.ts", + "./packages/web3-eth-abi/src/api/parameters_api.ts" + ], + + mergeModulesMergeMode: "module", // NEW option of TypeDoc added by typedoc-plugin-merge-modules plugin + cleanOutputDir: false, + +}; diff --git a/scripts/docshelper/generatedoc.js b/scripts/docshelper/generatedoc.js new file mode 100644 index 00000000000..835478f5dc1 --- /dev/null +++ b/scripts/docshelper/generatedoc.js @@ -0,0 +1,130 @@ +const TypeDoc = require("typedoc"); +const fs = require('fs'); +const path = require('path'); + +const functionsDocConfig = require("./functionsdoc.config.js"); +const classesDocsConfig = require("./classesdoc.config.js"); + + +async function run() { + await generateDocs(classesDocsConfig); + postProcessClassesDocs(classesDocsConfig); + + await generateDocs(functionsDocConfig); + postProcessFunctionsDocs(functionsDocConfig); + + if (fs.existsSync(classesDocsConfig.out + "/modules.md")) { + fs.unlinkSync(classesDocsConfig.out + "/modules.md"); + } +} + +run().catch(console.log); + +///// Post process docs +function postProcessClassesDocs(configOptions) { + + const packagesPath = configOptions.out + '/classes/'; + + copyDir(packagesPath, configOptions.out); + cleanDir(packagesPath); + + try { + const files = fs.readdirSync(configOptions.out); + files.forEach(function (file) { + const filePath = path.join(configOptions.out, file); + const data = fs.readFileSync(filePath, 'utf8'); + const replacedData = data.replace(/\.md/g, ''); + fs.writeFileSync(filePath, replacedData, 'utf8'); + }); + } catch (err) { + console.log('Error getting directory information.'); + } + +} + +function postProcessFunctionsDocs(configOptions) { + + const packagesPath = configOptions.out + '/modules/'; + //post process functions + + copyDir(packagesPath, configOptions.out); + cleanDir(packagesPath); + + removeFile("./docs/docs/libdocs/README.md"); + +} + +///// utils +async function generateDocs(config) { + const app = await TypeDoc.Application.bootstrapWithPlugins(config); + + const project = await app.convert(); + + if (project) { + await app.generateDocs(project, config.out); + } +} + +function removeFile(filePath){ + const stats = fs.statSync(filePath); + if (stats.isFile()) { + // If it's a file, delete it + fs.unlinkSync(filePath); + } +} + +function copyDir(src, dest) { + // Create the destination folder if it doesn't exist + if (!fs.existsSync(dest)) { + fs.mkdirSync(dest); + } + + // Read the source directory + const files = fs.readdirSync(src); + + // Loop through all the files in the source directory + for (let file of files) { + // Get the full path of the file + const srcPath = path.join(src, file); + const destPath = path.join(dest, file); + + // Get the file's stats + const stats = fs.statSync(srcPath); + + // If the file is a directory, recursively copy it + if (stats.isDirectory()) { + copyDir(srcPath, destPath); + } else { + // If the file is a file, copy it + fs.copyFileSync(srcPath, destPath); + } + } +} + +function cleanDir(dirPath) { + // Check if the directory exists + if (fs.existsSync(dirPath)) { + // Get all the files and subdirectories in the directory + const files = fs.readdirSync(dirPath); + + // Loop through all the files and subdirectories + for (let file of files) { + // Get the full path of the file or subdirectory + const filePath = path.join(dirPath, file); + + // Check if it's a file or a subdirectory + const stats = fs.statSync(filePath); + if (stats.isFile()) { + // If it's a file, delete it + fs.unlinkSync(filePath); + } else { + // If it's a subdirectory, recursively delete it + cleanDir(filePath); + } + } + + // Finally, delete the directory itself + fs.rmdirSync(dirPath); + } +} + diff --git a/scripts/e2e.cdn.sh b/scripts/e2e.cdn.sh deleted file mode 100755 index 37ad6d32c41..00000000000 --- a/scripts/e2e.cdn.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------------------------- -# Prepares a small test site that uses the packages/web3/dist/min -# -------------------------------------------------------------------- - -if [ -z "$CI" ]; then - - echo "======================================================================" - echo "This script prepares a test site for Netlify. Only run in CI. " - echo "======================================================================" - - exit 1 - -fi - -echo "======================================================================" -echo "Preparing test site for web3-staging.netlify.app " -echo "======================================================================" - -cp packages/web3/dist/web3.min.js scripts/html - -cd scripts/html - -BUNDLE_SIZE=$(wc -c web3.min.js | awk '{print $1}') - -# Mark file with current commit, branch, and bundle size. -sed -i "s|__COMMIT_HASH__|$COMMIT_REF|g" index.html -sed -i "s|__BRANCH__|$BRANCH|g" index.html -sed -i "s|__BUNDLE_SIZE__|$BUNDLE_SIZE|g" index.html - diff --git a/scripts/e2e.chrome.sh b/scripts/e2e.chrome.sh deleted file mode 100755 index 0ef21beac2d..00000000000 --- a/scripts/e2e.chrome.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -# ------------------------------------------------------------------------------------- -# Runs mocha tests tagged 'e2e' vs chrome headless + insta-mining ganache client -# ------------------------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -# Run cleanup on exit -trap cleanup EXIT - -cleanup() { - if [ -n "$client" ]; then - kill -9 $client - fi -} - -echo " " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "E2E: chrome headless browser " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo " " - -# Launch ganache, track its PID and wait until port is open -npx ganache-cli --noVMErrorsOnRPCResponse > /dev/null & -client=$! -npx wait-port 8545 - -# Test -karma start \ - --single-run \ - --browsers ChromeHeadless diff --git a/scripts/e2e.firefox.sh b/scripts/e2e.firefox.sh deleted file mode 100755 index 05cad282331..00000000000 --- a/scripts/e2e.firefox.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -# ------------------------------------------------------------------------------------- -# Runs mocha tests tagged 'e2e' vs firefox headless + insta-mining ganache client -# ------------------------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -# Run cleanup on exit -trap cleanup EXIT - -cleanup() { - if [ -n "$client" ]; then - kill -9 $client - fi -} - -echo " " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "E2E: firefox headless browser " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo " " - -# Launch ganache, track its PID and wait until port is open -npx ganache-cli --noVMErrorsOnRPCResponse > /dev/null & -client=$! -npx wait-port 8545 - -# Test -karma start \ - --single-run \ - --browsers FirefoxHeadless diff --git a/scripts/e2e.ganache.core.sh b/scripts/e2e.ganache.core.sh deleted file mode 100755 index ef79af1a1ba..00000000000 --- a/scripts/e2e.ganache.core.sh +++ /dev/null @@ -1,56 +0,0 @@ -# ---------------------------------------------------------------------------------------- -# Run trufflesuite/ganache-core using a candidate branch of web3 which has been published -# to a proxy npm registry in `e2e.npm.publish.sh` -# -# This test's purpose is to watch web3 execute a long, complex test suite -# ---------------------------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -# Install ganache-core -git clone https://github.com/trufflesuite/ganache-core -cd ganache-core -git checkout tags/v2.13.0 - -# Install via registry and verify -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "Installing updated web3 via virtual registry " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" - -npm config set fetch-retry-mintimeout 100000 -npm config set fetch-retry-maxtimeout 600000 - -npm install -npm uninstall --save-dev web3 -npm install --save-dev web3@e2e --registry http://localhost:4873 - -npm list web3 -npm list web3-utils -npm list web3-core -npm list web3-core-promievent - -cat ./package.json - -# Test -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "Running trufflesuite/ganache-core unit tests. " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" - -npm run build - -# There are two failing ganache tests: -# 1. "should return instance of StateManager on start": -# Checks whether the object returned by the server is an -# instanceof StateManager. Also fails locally & doesn't -# seem web3 related. -# 2. "should handle events properly via the data event handler": -# Upstream issue. Also fails locally & doesn't -# seem web3 related. -# Skipping them with grep / invert. -TEST_BUILD=node npx mocha \ - --grep "should return instance of StateManager on start|should handle events properly via the data event handler" \ - --invert \ - --check-leaks \ - --recursive \ - --globals _scratch diff --git a/scripts/e2e.ganache.sh b/scripts/e2e.ganache.sh deleted file mode 100755 index 5692cd33f21..00000000000 --- a/scripts/e2e.ganache.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------------------------- -# Runs mocha tests tagged 'e2e' using an insta-mining ganache client -# -------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -# Run cleanup on exit -trap cleanup EXIT - -cleanup() { - if [ -n "$client" ]; then - kill -9 $client - fi -} - -echo " " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "E2E: ganache insta-mining " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo " " - -# Launch ganache, track its PID and wait until port is open -npx ganache-cli --noVMErrorsOnRPCResponse > /dev/null & -client=$! -npx wait-port 8545 - -# Test -GANACHE=true nyc --no-clean --silent _mocha -- \ - --reporter spec \ - --require ts-node/register \ - --grep 'E2E' \ - --timeout 5000 \ - --exit diff --git a/scripts/e2e.geth.automine.sh b/scripts/e2e.geth.automine.sh deleted file mode 100755 index 0282d15d4e7..00000000000 --- a/scripts/e2e.geth.automine.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------------------------- -# Runs mocha tests tagged 'e2e' using an auto-mining geth dev client -# -------------------------------------------------------------------- - - -# Exit immediately on error -set -o errexit - -# Run cleanup on exit -trap cleanup EXIT - -cleanup(){ - docker stop geth-client -} - -echo " " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "E2E: geth auto-mining 2s (requires docker) " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo " " - -# Launch client w/ two unlocked accounts. -# + accounts[0] default geth unlocked bal = ~infinity -# + accounts[1] unlocked, signing password = 'left-hand-of-darkness' -geth-dev-assistant --period 2 --accounts 1 --tag 'stable' - -# Test -GETH_AUTOMINE=true nyc --no-clean --silent _mocha -- \ - --reporter spec \ - --grep 'E2E' \ - --timeout 15000 \ - --exit diff --git a/scripts/e2e.geth.instamine.sh b/scripts/e2e.geth.instamine.sh deleted file mode 100755 index df4f7d048ba..00000000000 --- a/scripts/e2e.geth.instamine.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------------------------- -# Runs mocha tests tagged 'e2e' using an insta-mining geth dev client -# -------------------------------------------------------------------- - - -# Exit immediately on error -set -o errexit - -# Run cleanup on exit -trap cleanup EXIT - -cleanup(){ - docker stop geth-client -} - -echo " " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "E2E: geth insta-mining (requires docker) " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo " " - -# Launch client w/ two unlocked accounts. -# + accounts[0] default geth unlocked bal = ~infinity -# + accounts[1] unlocked, bal=50 eth, signing password = 'left-hand-of-darkness' -geth-dev-assistant --accounts 1 --tag 'stable' - -# Test -GETH_INSTAMINE=true nyc --no-clean --silent _mocha -- \ - --reporter spec \ - --grep 'E2E' \ - --timeout 15000 \ - --exit diff --git a/scripts/e2e.gnosis.dex.sh b/scripts/e2e.gnosis.dex.sh deleted file mode 100755 index f286f47a7e1..00000000000 --- a/scripts/e2e.gnosis.dex.sh +++ /dev/null @@ -1,57 +0,0 @@ -# ------------------------------------------------------------------------------------------- -# Run gnosis/dex-react using a candidate branch of web3 which has been published to a -# proxy npm registry in `e2e.npm.publish.sh` -# -# The test's purpose is to verify web3 latest state runs successfully on an actively -# developed production project which uses. -# + react -# + webpack production build -# + typescript compilation -# + ~200 jest tests -# -------------------------------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -# To mimic `npm install web3` correctly, this test does not install Web3's dev deps. -# However, we need the npm package `semver` to coerce yarn resolutions correctly. -# It must be installed as a dev dep or Node complains. We also need web3's package.json -# to resolve the current version + patch increment. So some file renaming is necessary here... -cp package.json original.package.json -rm package.json -rm package-lock.json -npm init --yes -npm install --save-dev semver - -# Install mosaic and set yarn resolutions to virtually published patch version -git clone https://github.com/gnosis/dex-react.git -scripts/js/resolutions.js dex-react -cd dex-react - -# Install via registry and verify -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "Installing updated web3 via virtual registry " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" - -yarn --registry http://localhost:4873 - -yarn list web3 -yarn list web3-utils -yarn list web3-core -yarn list web3-core-promievent - -cat ./package.json - -# Build -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "Running gnosis/dex-react: build " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" - -APP_ID=1 npm run build - -# Test -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "Running gnosis/dex-react: test " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" - -APP_ID=1 npm test diff --git a/scripts/e2e.min.sh b/scripts/e2e.min.sh deleted file mode 100755 index f6e2cafecda..00000000000 --- a/scripts/e2e.min.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash - -# ------------------------------------------------------------------------------------- -# Runs basic min bundle loading check on chrome headless -# ------------------------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -echo " " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "E2E: web3/dist/web3.min.js (Chrome). " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo " " - -BROWSER_BUNDLE_TEST="publishedDist" karma start \ - --single-run \ - --browsers ChromeHeadless - -echo " " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "E2E: web3/dist/web3.min.js (Chrome). " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo " " - -BROWSER_BUNDLE_TEST="gitRepoDist" karma start \ - --single-run \ - --browsers ChromeHeadless diff --git a/scripts/e2e.mosaic.sh b/scripts/e2e.mosaic.sh deleted file mode 100755 index ec2907399ec..00000000000 --- a/scripts/e2e.mosaic.sh +++ /dev/null @@ -1,56 +0,0 @@ -# ------------------------------------------------------------------------------------------- -# Run mosaicdao/mosaic-1 fork (w/ buidler truffle5 plugin) using a candidate -# branch of web3 which has been published to a proxy npm registry in `e2e.npm.publish.sh` -# -# This test's purpose is to watch web3 execute a long, complex test suite -# It uses buidler-adapted fork of mosaicdao because that tool is simpler and -# more modular than Truffle and lets us resolve arbitrary versions of web3 more easily. -# -------------------------------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -# To mimic `npm install web3` correctly, this test does not install Web3's dev deps. -# However, we need the npm package `semver` to coerce yarn resolutions correctly. -# It must be installed as a dev dep or Node complains. We also need web3's package.json -# to resolve the current version + patch increment. So some file renaming is necessary here... -cp package.json original.package.json -rm package.json -rm package-lock.json -npm init --yes -npm install --save-dev semver - -# Install mosaic and set yarn resolutions to virtually published patch version -git clone https://github.com/cgewecke/mosaic-1.git -scripts/js/resolutions.js mosaic-1 -cd mosaic-1 - -# Install via registry and verify -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "Installing updated web3 via virtual registry " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" - -git submodule update --init --recursive -yarn --registry http://localhost:4873 - -yarn add web3@e2e --registry http://localhost:4873 --network-timeout 600000 - -yarn list web3 -yarn list web3-utils -yarn list web3-core -yarn list web3-core-promievent - -cat ./package.json - -# Test -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" -echo "Running mosaicdao/mosaic-1 unit tests. " -echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" - -# Launch ganache -./tools/run_ganache_cli.sh /dev/null 2>&1 & -sleep 10 - -# Compile and test -npx buidler compile -npm test diff --git a/scripts/e2e.npm.publish.sh b/scripts/e2e.npm.publish.sh deleted file mode 100755 index f832655db44..00000000000 --- a/scripts/e2e.npm.publish.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------------------------- -# Publishes web3 to a local npm proxy registry in CI so the package -# can be E2E tested by installing it in another project -# -------------------------------------------------------------------- - -# Exit immediately on error -set -o errexit - -if [ -z "$CI" ]; then - - echo "======================================================================" - echo "This script publishes web3 to an npm proxy registry. Only run in CI." - echo "======================================================================" - - exit 1 - -fi - -# To model publication correctly, this script needs to run -# without web3's dev deps being installed. It installs -# what it needs here. -npm install -g verdaccio@4.4.4 -npm install -g npm-auth-to-token@1.0.0 -npm install -g lerna@^3.20.2 -npm install -g typescript@^3.9.5 -npm install -g webpack@^4.44.1 webpack-cli@^3.3.12 clean-webpack-plugin@^3.0.0 - -# Launch npm proxy registry and save pid to kill server (req. in Windows env) -verdaccio --config verdaccio.yml & -VERDACCIO_PID=$! -echo "VERDACCIO_PID=$VERDACCIO_PID" > verdaccio_pid - -npx wait-port 4873 - -# `npm add user` -curl -XPUT \ - -H "Content-type: application/json" \ - -d '{ "name": "test", "password": "test" }' \ - 'http://localhost:4873/-/user/org.couchdb.user:test' - -# `npm login` -npm-auth-to-token \ - -u test \ - -p test \ - -e test@test.com \ - -r http://localhost:4873 - -# Lerna version -lerna version minor \ - --force-publish=* \ - --no-git-tag-version \ - --no-push \ - --yes - -# Set identity prior to publishing (necessary for Windows) -git config user.email "you@example.com" -git config user.name "Your Name" - -# Commit changes because lerna checks git before -git commit -a -m 'virtual-version-bump' - -# Lerna publish to e2e tag -lerna publish from-package \ - --dist-tag e2e \ - --registry http://localhost:4873 \ - --ignore-scripts \ - --yes - diff --git a/scripts/e2e.windows.sh b/scripts/e2e.windows.sh deleted file mode 100755 index 364f8b84d08..00000000000 --- a/scripts/e2e.windows.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -# This script installs Web3 from virtual registry in a -# Windows env and runs some simple Web3 calls. - -# Exit immediately on error -set -o errexit - -# Setup mock project to install web3 from virtual registry -mkdir windows_test -cp scripts/js/basic_usage.js windows_test/basic_usage.js -cd windows_test - -# Install web3 as dep -npm init --yes -npm install web3@e2e --save --registry http://localhost:4873 -./basic_usage.js - -# Shutdown verdaccio server -cd .. -source verdaccio_pid -kill -9 $VERDACCIO_PID - -# Terminate stray node process -if [ ! -z "$CI" ]; then - kill -9 $(grep node <(ps -ef) | sed 's/.*\travis *\([0-9]*\).*/\1/') -fi diff --git a/scripts/env.sh b/scripts/env.sh new file mode 100755 index 00000000000..3dfd1b7dfdc --- /dev/null +++ b/scripts/env.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +TMP_FOLDER=$(pwd)/tmp +IPC_PATH=$TMP_FOLDER/ipc.ipc +IPC_PATH_1=$TMP_FOLDER/ipc1.ipc +IPC_PATH_2=$TMP_FOLDER/ipc2.ipc + +export WEB3_SYSTEM_TEST_ENV=true +export WEB3_SYSTEM_TEST_BACKEND="" +export WEB3_SYSTEM_TEST_MNEMONIC="smart guide what forget tired jungle always expire rescue boring glue champion" +export WEB3_SYSTEM_TEST_PORT=8545 +export WEB3_SYSTEM_TEST_PROVIDER="" diff --git a/scripts/gen_accounts.js b/scripts/gen_accounts.js new file mode 100644 index 00000000000..75d29bbe610 --- /dev/null +++ b/scripts/gen_accounts.js @@ -0,0 +1,54 @@ +const { Personal } = require('web3-eth-personal'); +const { Web3Eth } = require('web3-eth'); +const tempAccountList = require('./accounts.json'); + +const getEnvVar = name => (global.Cypress ? Cypress.env(name) : process.env[name]); + +const DEFAULT_SYSTEM_PROVIDER = 'http://localhost:8545'; + +const getSystemTestProvider = () => DEFAULT_SYSTEM_PROVIDER; + +const getSystemTestBackend = () => getEnvVar('WEB3_SYSTEM_TEST_BACKEND') ?? ''; + +let mainAcc; +let accountList = []; +const addAccount = async (address, privateKey) => { + let clientUrl = getSystemTestProvider(); + + const web3Personal = new Personal(clientUrl); + if (accountList.length === 0) { + accountList = await web3Personal.getAccounts(); + mainAcc = accountList[0]; + } + const web3Eth = new Web3Eth(clientUrl); + + if (!accountList.find(acc => acc.address === address)) { + await web3Personal.importRawKey( + ['geth', 'geth-manual'].includes(getSystemTestBackend()) + ? privateKey.slice(2) + : privateKey, + '123456', + ); + } + + await web3Eth.sendTransaction({ + from: mainAcc, + to: address, + gas: 1500000, + value: '1000000000000000000', + }); +}; + +const createWallets = () => + new Promise(async resolve => { + for (const acc of tempAccountList) { + try { + await addAccount(acc.address, acc.privateKey); + } catch (e) { + console.log('error', e); + } + } + resolve(); + }); + +createWallets().catch(console.error); diff --git a/scripts/genesis.json b/scripts/genesis.json new file mode 100644 index 00000000000..a9820c0b0dc --- /dev/null +++ b/scripts/genesis.json @@ -0,0 +1,12 @@ +{ + "config": { + "chainId": 4321, + "homesteadBlock": 0, + "eip155Block": 0, + "eip158Block": 0, + "eip150Block": 0 + }, + "alloc": {}, + "difficulty": "0x20000", + "gasLimit": "0x8880000" +} diff --git a/scripts/geth.sh b/scripts/geth.sh new file mode 100755 index 00000000000..62c7213ccfb --- /dev/null +++ b/scripts/geth.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +ORIGARGS=("$@") + +helpFunction() { + echo "Usage: $0 [start|stop] [background]" + exit 1 # Exit script after printing help +} + +start() { + . scripts/env.sh + if [ -z "${ORIGARGS[1]}" ] + then + echo "Starting geth..." + echo "docker run -p $WEB3_SYSTEM_TEST_PORT:$WEB3_SYSTEM_TEST_PORT ethereum/client-go:v1.13.14-amd64 --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev" + docker run -p $WEB3_SYSTEM_TEST_PORT:$WEB3_SYSTEM_TEST_PORT ethereum/client-go:v1.13.14-amd64 --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev + else + echo "Starting geth..." + echo "docker run -d -p $WEB3_SYSTEM_TEST_PORT:$WEB3_SYSTEM_TEST_PORT ethereum/client-go:v1.13.14-amd64 --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev" + docker run -d -p $WEB3_SYSTEM_TEST_PORT:$WEB3_SYSTEM_TEST_PORT ethereum/client-go:v1.13.14-amd64 --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev + echo "Waiting for geth..." + npx wait-port -t 10000 "$WEB3_SYSTEM_TEST_PORT" + echo "Geth started" + fi +} + +stop() { + echo "Stopping geth ..." + docker ps -q --filter ancestor="ethereum/client-go" | xargs -r docker stop +} + +case $1 in +start) start ;; +stop) stop ;; +*) helpFunction ;; # Print helpFunction in case parameter is non-existent +esac diff --git a/scripts/geth_binary.sh b/scripts/geth_binary.sh new file mode 100755 index 00000000000..96212d04a77 --- /dev/null +++ b/scripts/geth_binary.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env bash +# TODO: use this code in #5185 +ORIGARGS=("$@") +. scripts/env.sh + +helpFunction() { + echo "Usage: $0 [start|stop] [background]" + exit 1 # Exit script after printing help +} +getOS(){ + case "$OSTYPE" in + solaris*) OS="SOLARIS" ;; + darwin*) OS="OSX" ;; + linux*) OS="LINUX" ;; + bsd*) OS="BSD" ;; + msys*) OS="WINDOWS" ;; + cygwin*) OS="ALSO WINDOWS" ;; + *) OS="unknown: $OSTYPE" ;; + esac +} +getDownloadLink(){ + case "$OS" in + SOLARIS*) LINK="-" ;; + OSX*) LINK="https://gethstore.blob.core.windows.net/builds/geth-darwin-arm64-1.13.14-2bd6bd01.tar.gz" ;; + LINUX*) LINK="https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.13.14-2bd6bd01.tar.gz" ;; + BSD*) LINK="https://gethstore.blob.core.windows.net/builds/geth-darwin-arm64-1.13.14-2bd6bd01.tar.gz" ;; + WINDOWS*) LINK="https://gethstore.blob.core.windows.net/builds/geth-windows-amd64-1.13.14-2bd6bd01.exe" ;; + "ALSO WINDOWS"*) LINK="https://gethstore.blob.core.windows.net/builds/geth-windows-amd64-1.13.14-2bd6bd01.exe" ;; + *) LINK="-" ;; + esac +} +setArchiveFolder(){ + for entry in $TMP_FOLDER/* + do + FOLDER=$entry + done +} +download(){ + if [ ! -e "$TMP_FOLDER/geth" ] + then + getOS + getDownloadLink + + if [[ ! -e "$TMP_FOLDER" ]]; then + mkdir "$TMP_FOLDER" + fi + + wget -O "$TMP_FOLDER/geth.tar.gz" "$LINK" + tar -xf "$TMP_FOLDER/geth.tar.gz" -C "$TMP_FOLDER" + rm "$TMP_FOLDER/geth.tar.gz" + setArchiveFolder + echo "$FOLDER" + mv "$FOLDER/geth" "$TMP_FOLDER/geth" + rm -rf "$FOLDER" + fi +} + +start() { + download + if [ -z "${ORIGARGS[1]}" ]; then + echo "Starting geth..." + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal + else + echo "Starting geth..." + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 &>/dev/null &" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal &>/dev/null & + echo "Waiting for geth..." + npx wait-port -t 10000 "$WEB3_SYSTEM_TEST_PORT" + fi +} + +startManual() { + download + + echo "Starting manual geth..." + echo "geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null &" + ${TMP_FOLDER}/geth --ipcpath $IPC_PATH --nodiscover --nousb --ws --ws.addr 0.0.0.0 --ws.port $WEB3_SYSTEM_TEST_PORT --http --http.addr 0.0.0.0 --http.port $WEB3_SYSTEM_TEST_PORT --allow-insecure-unlock --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net --dev --mine --dev.period=0 --rpc.enabledeprecatedpersonal --dev.gaslimit 9000000000000000 --rpc.txfeecap=1000000 &>/dev/null & + echo "Waiting for geth..." + npx wait-port -t 10000 "$WEB3_SYSTEM_TEST_PORT" + +} + +startSync() { + download + + ${TMP_FOLDER}/geth --datadir ./tmp/data1 init ./scripts/genesis.json + ${TMP_FOLDER}/geth --datadir ./tmp/data2 init ./scripts/genesis.json + ${TMP_FOLDER}/geth --datadir ./tmp/data1 --ipcpath $IPC_PATH_1 --nodiscover --networkid 1234 --ws --ws.addr 0.0.0.0 --ws.port 18545 --http --http.addr 0.0.0.0 --http.port 18545 --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net &>/dev/null & + ${TMP_FOLDER}/geth --datadir ./tmp/data2 --ipcpath $IPC_PATH_2 --nodiscover --networkid 1234 --port 30304 --authrpc.port 8552 --ws --ws.addr 0.0.0.0 --ws.port 28545 --http --http.addr 0.0.0.0 --http.port 28545 --http.api personal,web3,eth,admin,debug,txpool,net --ws.api personal,web3,eth,admin,debug,miner,txpool,net &>/dev/null & + + npx wait-port -t 10000 18545 + npx wait-port -t 10000 28545 +} + +syncStop() { + WEB3_SYSTEM_TEST_PORT=18545 + stop + WEB3_SYSTEM_TEST_PORT=28545 + stop +} +stop() { + echo "Stopping geth ..." + processID=`lsof -Fp -i:${WEB3_SYSTEM_TEST_PORT}| grep '^p'` + kill -9 ${processID##p} +} + +case $1 in +manualStart) startManual ;; +syncStart) startSync ;; +syncStop) syncStop ;; +start) start ;; +stop) stop ;; +download) download ;; +*) helpFunction ;; # Print helpFunction in case parameter is non-existent +esac diff --git a/scripts/hardhat.sh b/scripts/hardhat.sh new file mode 100755 index 00000000000..04d1700f52d --- /dev/null +++ b/scripts/hardhat.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +ORIGARGS=("$@") + +helpFunction() { + echo "Usage: $0 [start|stop] [background]" + exit 1 # Exit script after printing help +} + +start() { + . scripts/env.sh + + if [ -z "${ORIGARGS[1]}" ] + then + echo "Starting hardhat ..." + npx hardhat node + fi +} + +stop() { + echo "Stopping hardhat ..." + PID=$(lsof -t -i :8545) + kill $PID + +} + +case $1 in +start) start ;; +stop) stop ;; +*) helpFunction ;; # Print helpFunction in case parameter is non-existent +esac diff --git a/scripts/html/index.html b/scripts/html/index.html deleted file mode 100644 index 3ff8a06bfa6..00000000000 --- a/scripts/html/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - -

Web3.js!

-

-

Latest Block

- -

-

-

-

-

-

- - - - diff --git a/scripts/init.ts b/scripts/init.ts new file mode 100644 index 00000000000..fe3a46f642c --- /dev/null +++ b/scripts/init.ts @@ -0,0 +1,22 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { existsSync, writeFileSync, readFileSync } from 'fs'; + +if (!existsSync('.secrets.json')) { + const data = readFileSync('templates/.secrets.json.tmpl'); + writeFileSync('.secrets.json', data); +} diff --git a/scripts/jest.config.js b/scripts/jest.config.js new file mode 100644 index 00000000000..a4f84339593 --- /dev/null +++ b/scripts/jest.config.js @@ -0,0 +1,25 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + globals: { + 'ts-jest': { + tsconfig: './scripts/changelog/tsconfig.json', + }, + }, +}; diff --git a/scripts/js/basic_usage.js b/scripts/js/basic_usage.js deleted file mode 100755 index 9d33bc85ed9..00000000000 --- a/scripts/js/basic_usage.js +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env node - -// This script runs some simple Web3 calls. -// Useful for validating the published version in different OS environments. -const Web3 = require('web3'); -const util = require('util'); -const log = console.log; - -async function delay(secs=0){ - return new Promise(resolve => setTimeout(() => resolve(), secs * 1000)) -} - -// A workaround for how flaky the infura connection can be... -// Tries to fetch data 10x w/ 1 sec delays. Exits on first success. -async function getBlockWithRetry(web3){ - let i = 0; - let block; - - while(true){ - await delay(1); - - try { - - block = await web3.eth.getBlock('latest'); - break; - - } catch(err){ - - i++; - if (i === 10){ - throw new Error('Failed to connect to Infura over websockets after 10 tries'); - } - - } - } - return block; -} - -async function main(){ - let web3; - let block; - - // Providers - log(); - log('>>>>>>'); - log('HTTP:MAINNET getBlock'); - log('>>>>>>'); - - // Http - web3 = new Web3('https://mainnet.infura.io/v3/1d13168ffb894ad2827f2152620bd27c'); - block = await getBlockWithRetry(web3); - log(util.inspect(block)); - - log(); - log('>>>>>>'); - log('WS:MAINNET getBlock'); - log('>>>>>>'); - - // WebSockets - web3 = new Web3('wss://mainnet.infura.io/ws/v3/1d13168ffb894ad2827f2152620bd27c'); - block = await getBlockWithRetry(web3); - web3.currentProvider.disconnect(); - log(util.inspect(block)); - - - // Accounts - web3 = new Web3(); - - log(); - log('>>>>>>'); - log('eth.accounts.createAccount'); - log('>>>>>>'); - - const account = web3.eth.accounts.create(); - log(util.inspect(account)); - - log(); - log('>>>>>>'); - log('eth.accounts.hashMessage'); - log('>>>>>>'); - - const hash = web3.eth.accounts.hashMessage('Hello World'); - log(util.inspect(hash)); -} - -main() - .then(() => process.exit(0)) - .catch(err => { - log(err); - process.exit(1) - }); - diff --git a/scripts/js/ens.js b/scripts/js/ens.js deleted file mode 100644 index e9c7e4a965c..00000000000 --- a/scripts/js/ens.js +++ /dev/null @@ -1,107 +0,0 @@ -const ENSArtifact = require("@ensdomains/ens/build/contracts/ENSRegistry"); -const FIFSRegistrarArtifact = require("@ensdomains/ens/build/contracts/FIFSRegistrar"); -const ReverseRegistrarArtifact = require("@ensdomains/ens/build/contracts/ReverseRegistrar"); -const PublicResolverArtifact = require("@ensdomains/resolver/build/contracts/PublicResolver"); -const namehash = require('eth-ens-namehash'); - -const addressZero = "0x0000000000000000000000000000000000000000"; -const addressOne = "0x0000000000000000000000000000000000000001"; -const tld = "test"; - -async function setupENS(web3) { - - const options = { - bytecode: undefined, - gasPrice: '1', - gas: 5500000 - } - - const accounts = await web3.eth.getAccounts(); - const from = { from: accounts[0] }; - - // ENS - options.data = ENSArtifact.bytecode; - const ENS = new web3.eth.Contract(ENSArtifact.abi, options) - - const ens = await ENS - .deploy() - .send(from); - - // PublicResolver - options.data = PublicResolverArtifact.bytecode; - const PublicResolver = new web3.eth.Contract(PublicResolverArtifact.abi, options) - - const resolver = await PublicResolver - .deploy({ arguments: [ens.options.address] }) - .send(from); - - await setupResolver(ens, resolver, accounts[0], web3); - - // Registrar - options.data = FIFSRegistrarArtifact.bytecode; - const FIFSRegistrar = new web3.eth.Contract(FIFSRegistrarArtifact.abi, options) - - const registrar = await FIFSRegistrar - .deploy({ arguments: [ens.options.address, namehash.hash(tld)] }) - .send(from); - - await setupRegistrar(ens, registrar.options.address, accounts[0], web3); - - // Reverse Registrar - options.data = ReverseRegistrarArtifact.bytecode; - const ReverseRegistrar = new web3.eth.Contract(ReverseRegistrarArtifact.abi, options) - - const reverse = await ReverseRegistrar - .deploy({ arguments: [ens.options.address, resolver.options.address] }) - .send(from); - - await setupReverseRegistrar(ens, reverse.options.address, accounts[0], web3); - - return { - registry: ens.options.address, - resolver: resolver.options.address, - fifsRegistrar: registrar.options.address, - reverseRegistrar: reverse.options.address - } -}; - -async function setupResolver(ens, resolver, account, web3) { - const node = namehash.hash("resolver"); - const label = web3.utils.sha3("resolver"); - - await ens - .methods - .setSubnodeOwner(addressZero, label, account) - .send({from: account}); - - await ens - .methods - .setResolver(node, resolver.options.address) - .send({from: account}); - - await resolver - .methods - .setAddr(node, addressOne) - .send({from: account}); -} - -async function setupRegistrar(ens, address, account, web3) { - await ens - .methods - .setSubnodeOwner(addressZero, web3.utils.sha3(tld), address) - .send({from: account}); -} - -async function setupReverseRegistrar(ens, address, account, web3) { - await ens - .methods - .setSubnodeOwner(addressZero, web3.utils.sha3("reverse"), account) - .send({from: account}); - - await ens - .methods - .setSubnodeOwner(namehash.hash("reverse"), web3.utils.sha3("addr"), address) - .send({from: account}); -} - -module.exports = setupENS diff --git a/scripts/js/resolutions.js b/scripts/js/resolutions.js deleted file mode 100755 index 9690556fd55..00000000000 --- a/scripts/js/resolutions.js +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env node - -/** - * This script is a helper for running a buidler based e2e unit test target and is - * used in combination with the npm virtual publishing script. - * - * It discovers the current web3 package version, gets its minor increment - * (also the value of the virtually published version) and attaches a yarn resolutions field - * to the target's package.json to coerce any Web3 packages up when target is - * installed. - * - * USAGE: resolutions.js - * EXAMPLE: node scripts/js/resolutions.js mosaic-1 - * - */ -const fs = require('fs'); -const path = require('path'); - -const semver = require('semver'); -const web3PackagePath = path.join(process.cwd(), 'original.package.json'); -const targetPackagePath = path.join(process.cwd(), process.argv[2], 'package.json'); - -const web3Package = require(web3PackagePath); -const targetPackage = require(targetPackagePath); - -// Use version least likely to conflict with what's been -// published to npm. (Maps to `lerna version` command -// in e2e.npm.publish.sh) -const version = semver.inc(web3Package.version, 'minor'); - -const web3Modules = [ - "web3", - "web3-bzz", - "web3-core-helpers", - "web3-core-method", - "web3-core-promievent", - "web3-core-requestmanager", - "web3-core-subscriptions", - "web3-core", - "web3-eth-abi", - "web3-eth-accounts", - "web3-eth-contract", - "web3-eth-ens", - "web3-eth-iban", - "web3-eth-personal", - "web3-eth", - "web3-net", - "web3-providers-http", - "web3-providers-ipc", - "web3-providers-ws", - "web3-shh", - "web3-utils" -]; - - -targetPackage.resolutions = {}; - -// Coerce every version of web3 in the sub-dependency tree to -// the virtually published version -for ( const mod of web3Modules ){ - targetPackage.resolutions[`*/**/${mod}`] = version; -} - -// Remove any outer-level web3 modules so yarn flat-packs a single -// set of web3 modules at the outerlevel -if (targetPackage.devDependencies){ - for ( const mod of web3Modules ){ - delete targetPackage.devDependencies[mod]; - } -} - -if (targetPackage.dependencies){ - for ( const mod of web3Modules ){ - delete targetPackage.dependencies[mod]; - } -} - -console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); -console.log(`Yarn will resolve Web3 packages in "${process.argv[2]}"" to...`); -console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - -console.log(JSON.stringify(targetPackage.resolutions, null, ' ')); - -fs.writeFileSync(targetPackagePath, JSON.stringify(targetPackage, null, ' ')); diff --git a/scripts/system_tests_utils.ts b/scripts/system_tests_utils.ts new file mode 100644 index 00000000000..a502c44825e --- /dev/null +++ b/scripts/system_tests_utils.ts @@ -0,0 +1,506 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// eslint-disable-next-line import/no-extraneous-dependencies +import { format, SocketProvider } from 'web3-utils'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { + create as _createAccount, + decrypt, + privateKeyToAccount, + signTransaction, +} from 'web3-eth-accounts'; + +// eslint-disable-next-line import/no-extraneous-dependencies +import HardhatPlugin from 'web3-hardhat-plugin'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { prepareTransactionForSigning, Web3Eth } from 'web3-eth'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Web3Context } from 'web3-core'; + +// eslint-disable-next-line import/no-extraneous-dependencies +import { + EthExecutionAPI, + Bytes, + Web3BaseProvider, + Transaction, + KeyStore, + ProviderConnectInfo, + Web3ProviderEventCallback, + ProviderRpcError, + JsonRpcSubscriptionResult, + JsonRpcNotification, + ETH_DATA_FORMAT, + SupportedProviders, + Web3APISpec, + Web3EthExecutionAPI, +} from 'web3-types'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Personal } from 'web3-eth-personal'; +// eslint-disable-next-line import/no-extraneous-dependencies +import Web3 from 'web3'; + +// eslint-disable-next-line import/no-extraneous-dependencies +import { NonPayableMethodObject } from 'web3-eth-contract'; +// eslint-disable-next-line import/no-extraneous-dependencies +import HttpProvider from 'web3-providers-http'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { IpcProvider } from 'web3-providers-ipc'; +import accountsString from './accounts.json'; + +/** + * Get the env variable from Cypress if it exists or node process + */ +export const getEnvVar = (name: string): string | undefined => + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access + global.Cypress ? Cypress.env(name) : process.env[name]; + +export const DEFAULT_SYSTEM_PROVIDER = 'http://127.0.0.1:8545'; +export const DEFAULT_SYSTEM_ENGINE = 'node'; +export const BACKEND = { + GETH: 'geth', + HARDHAT: 'hardhat', + INFURA: 'infura', + SEPOLIA: 'sepolia', + MAINNET: 'mainnet', +}; + +export const getSystemTestProviderUrl = (): string => + getEnvVar('WEB3_SYSTEM_TEST_PROVIDER') ?? DEFAULT_SYSTEM_PROVIDER; + +export const getSystemTestProvider = (): + | string + | SupportedProviders => { + const url = getSystemTestProviderUrl(); + if (url.includes('ipc')) { + return new IpcProvider(url); + } + return url; +}; + +export const getSystemTestEngine = (): string => + getEnvVar('WEB3_SYSTEM_TEST_ENGINE') ?? DEFAULT_SYSTEM_ENGINE; + +export const isHttp: boolean = getSystemTestProviderUrl().startsWith('http'); +export const isWs: boolean = getSystemTestProviderUrl().startsWith('ws'); +export const isIpc: boolean = getSystemTestProviderUrl().includes('ipc'); +export const isChrome: boolean = getSystemTestEngine() === 'chrome'; +export const isFirefox: boolean = getSystemTestEngine() === 'firefox'; +export const isElectron: boolean = getSystemTestEngine() === 'electron'; +export const isNode: boolean = getSystemTestEngine() === 'isNode'; +export const isSyncTest: boolean = getEnvVar('TEST_OPTION') === 'sync'; +export const isSocket: boolean = isWs || isIpc; +export const isBrowser: boolean = ['chrome', 'firefox'].includes(getSystemTestEngine()); + +export const getSystemTestMnemonic = (): string => getEnvVar('WEB3_SYSTEM_TEST_MNEMONIC') ?? ''; + +export const getSystemTestBackend = (): string => getEnvVar('WEB3_SYSTEM_TEST_BACKEND') ?? ''; + +export const isGeth: boolean = getSystemTestBackend() === BACKEND.GETH; + +export const createAccount = _createAccount; + +export const itIf = (condition: (() => boolean) | boolean) => + (typeof condition === 'function' ? condition() : condition) ? test : test.skip; + +export const describeIf = (condition: (() => boolean) | boolean) => + (typeof condition === 'function' ? condition() : condition) ? describe : describe.skip; + +const maxNumberOfAttempts = 100; +const intervalTime = 500; // ms + +export const waitForOpenConnection = async ( + web3Context: Web3Context, + currentAttempt = 1, + status = 'connected', +) => + new Promise((resolve, reject) => { + if (!isSocket) { + resolve(); + return; + } + + const interval = setInterval(() => { + if (currentAttempt > maxNumberOfAttempts - 1) { + clearInterval(interval); + reject(new Error('Maximum number of attempts exceeded')); + } else if ( + (web3Context.provider as unknown as Web3BaseProvider).getStatus() === status + ) { + clearInterval(interval); + resolve(); + } + // eslint-disable-next-line no-plusplus, no-param-reassign + currentAttempt++; + }, intervalTime); + }); + +export const closeOpenConnection = async (web3Context: Web3Context) => { + if (!isSocket || web3Context?.provider instanceof HttpProvider) { + return; + } + + // make sure we try to close the connection after it is established + if ( + web3Context?.provider && + (web3Context.provider as unknown as Web3BaseProvider).getStatus() === 'connecting' + ) { + await waitForOpenConnection(web3Context); + } + + // If an error happened during closing, that is acceptable at tests, just print a 'warn'. + if (web3Context?.provider) { + (web3Context.provider as unknown as Web3BaseProvider).on('error', (err: any) => { + console.warn('error while trying to close the connection', err); + }); + } + + // Wait a bit to ensure the connection does not have a pending data that + // could cause an error if written after closing the connection. + await new Promise(resolve => { + setTimeout(resolve, 500); + }); + + if ( + web3Context?.provider && + 'disconnect' in (web3Context.provider as unknown as Web3BaseProvider) + ) { + (web3Context.provider as unknown as Web3BaseProvider).disconnect(1000, ''); + } +}; + +export const createAccountProvider = (context: Web3Context) => { + const signTransactionWithContext = async (transaction: Transaction, privateKey: Bytes) => { + const tx = await prepareTransactionForSigning(transaction, context); + + const privateKeyBytes = format({ format: 'bytes' }, privateKey, ETH_DATA_FORMAT); + + return signTransaction(tx, privateKeyBytes); + }; + + const privateKeyToAccountWithContext = (privateKey: Uint8Array | string) => { + const account = privateKeyToAccount(privateKey); + + return { + ...account, + signTransaction: async (transaction: Transaction) => + signTransactionWithContext(transaction, account.privateKey), + }; + }; + + const decryptWithContext = async ( + keystore: string | KeyStore, + password: string, + options?: Record, + ) => { + const account = await decrypt(keystore, password, (options?.nonStrict as boolean) ?? true); + + return { + ...account, + signTransaction: async (transaction: Transaction) => + signTransactionWithContext(transaction, account.privateKey), + }; + }; + + const createWithContext = () => { + const account = _createAccount(); + + return { + ...account, + signTransaction: async (transaction: Transaction) => + signTransactionWithContext(transaction, account.privateKey), + }; + }; + + return { + create: createWithContext, + privateKeyToAccount: privateKeyToAccountWithContext, + decrypt: decryptWithContext, + }; +}; + +export const refillAccount = async (from: string, to: string, value: string | number) => { + const web3Eth = new Web3Eth(DEFAULT_SYSTEM_PROVIDER); + + await web3Eth.sendTransaction({ + from, + to, + value, + }); +}; + +let mainAcc: string; +export const createNewAccount = async (config?: { + unlock?: boolean; + refill?: boolean; + privateKey?: string; + password?: string; + doNotImport?: boolean; +}): Promise<{ address: string; privateKey: string }> => { + const acc = config?.privateKey ? privateKeyToAccount(config?.privateKey) : _createAccount(); + + const clientUrl = DEFAULT_SYSTEM_PROVIDER; + if (config?.unlock) { + if (getSystemTestBackend() === BACKEND.HARDHAT) { + const url = getSystemTestProviderUrl(); + const web3 = new Web3(url); + web3.registerPlugin(new HardhatPlugin()); + await web3.hardhat.impersonateAccount(acc.address); + // await impersonateAccount(acc.address); + await web3.hardhat.setBalance(acc.address, web3.utils.toHex('100000000')); + } else { + const web3Personal = new Personal(clientUrl); + if (!config?.doNotImport) { + await web3Personal.importRawKey( + getSystemTestBackend() === BACKEND.GETH + ? acc.privateKey.slice(2) + : acc.privateKey, + config.password ?? '123456', + ); + } + + await web3Personal.unlockAccount(acc.address, config.password ?? '123456', 100000000); + } + } + + if (config?.refill) { + if (getSystemTestBackend() === BACKEND.HARDHAT) { + const url = getSystemTestProviderUrl(); + const web3 = new Web3(url); + web3.registerPlugin(new HardhatPlugin()); + await web3.hardhat.setBalance(acc.address, web3.utils.toHex('100000000')); + } else { + const web3Personal = new Personal(clientUrl); + if (!mainAcc) { + [mainAcc] = await web3Personal.getAccounts(); + } + await refillAccount(mainAcc, acc.address, '100000000000000000'); + } + } + + return { address: acc.address.toLowerCase(), privateKey: acc.privateKey }; +}; +let tempAccountList: { address: string; privateKey: string }[] = []; +const walletsOnWorker = 20; + +if (tempAccountList.length === 0) { + tempAccountList = accountsString; +} +let currentIndex = Math.floor(Math.random() * (tempAccountList ? tempAccountList.length : 0)); +export const createTempAccount = async ( + config: { + unlock?: boolean; + refill?: boolean; + privateKey?: string; + password?: string; + } = {}, +): Promise<{ address: string; privateKey: string }> => { + if ( + config.unlock === false || + config.refill === false || + config.privateKey || + config.password + ) { + return createNewAccount({ + unlock: config.unlock ?? true, + refill: config.refill ?? true, + privateKey: config.privateKey, + password: config.password, + }); + } + if (currentIndex >= walletsOnWorker || !tempAccountList[currentIndex]) { + currentIndex = 0; + } + + const acc = tempAccountList[currentIndex]; + await createNewAccount({ + unlock: true, + refill: false, + privateKey: acc.privateKey, + doNotImport: true, + }); + currentIndex += 1; + + return acc; +}; + +export const getSystemTestAccountsWithKeys = async (): Promise< + { + address: string; + privateKey: string; + }[] +> => { + const acc = await createTempAccount(); + const acc2 = await createTempAccount(); + const acc3 = await createTempAccount(); + return [acc, acc2, acc3]; +}; + +export const getSystemTestAccounts = async (): Promise => + (await getSystemTestAccountsWithKeys()).map(a => a.address); + +export const signTxAndSendEIP1559 = async ( + provider: unknown, + tx: Transaction, + privateKey: string, +) => { + const web3 = new Web3(provider as Web3BaseProvider); + const acc = web3.eth.accounts.privateKeyToAccount(privateKey); + web3.eth.wallet?.add(privateKey); + + const txObj = { + ...tx, + type: '0x2', + gas: tx.gas ?? '1000000', + from: acc.address, + }; + + return web3.eth.sendTransaction(txObj, undefined, { checkRevertBeforeSending: false }); +}; + +export const signTxAndSendEIP2930 = async ( + provider: unknown, + tx: Transaction, + privateKey: string, +) => { + const web3 = new Web3(provider as Web3BaseProvider); + const acc = web3.eth.accounts.privateKeyToAccount(privateKey); + web3.eth.wallet?.add(privateKey); + const txObj = { + ...tx, + type: '0x1', + gas: tx.gas ?? '1000000', + from: acc.address, + }; + + return web3.eth.sendTransaction(txObj, undefined, { checkRevertBeforeSending: false }); +}; + +export const signAndSendContractMethodEIP1559 = async ( + provider: unknown, + address: string, + method: NonPayableMethodObject, + privateKey: string, +) => + signTxAndSendEIP1559( + provider, + { + to: address, + data: method.encodeABI(), + }, + privateKey, + ); + +export const signAndSendContractMethodEIP2930 = async ( + provider: unknown, + address: string, + method: NonPayableMethodObject, + privateKey: string, +) => + signTxAndSendEIP2930( + provider, + { + to: address, + data: method.encodeABI(), + }, + privateKey, + ); + +export const createLocalAccount = async (web3: Web3) => { + const account = web3.eth.accounts.create(); + await refillAccount((await createTempAccount()).address, account.address, '10000000000000000'); + web3.eth.accounts.wallet.add(account); + return account; +}; +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +// eslint-disable-next-line arrow-body-style +export const waitForSocketConnect = async (provider: SocketProvider) => { + return new Promise(resolve => { + provider.on('connect', (( + _error: Error | ProviderRpcError | undefined, + data: JsonRpcSubscriptionResult | JsonRpcNotification | undefined, + ) => { + resolve(data as unknown as ProviderConnectInfo); + }) as Web3ProviderEventCallback); + }); +}; + +// eslint-disable-next-line arrow-body-style +export const waitForSocketDisconnect = async (provider: SocketProvider) => { + return new Promise(resolve => { + provider.on('disconnect', (( + _error: ProviderRpcError | Error | undefined, + data: JsonRpcSubscriptionResult | JsonRpcNotification | undefined, + ) => { + resolve(data as unknown as ProviderRpcError); + }) as Web3ProviderEventCallback); + }); +}; + +export const waitForOpenSocketConnection = async (provider: SocketProvider) => + new Promise(resolve => { + provider.on('connect', ((_error, data) => { + resolve(data as unknown as ProviderConnectInfo); + }) as Web3ProviderEventCallback); + }); + +export const waitForCloseSocketConnection = async (provider: SocketProvider) => + new Promise(resolve => { + provider.on('disconnect', ((_error, data) => { + resolve(data as unknown as ProviderRpcError); + }) as Web3ProviderEventCallback); + }); + +export const waitForEvent = async ( + web3Provider: SocketProvider, + eventName: string, +) => + new Promise(resolve => { + web3Provider.on(eventName, (data: any) => { + resolve(data); + }); + }); + +export const sendFewSampleTxs = async (cnt = 1) => { + const web3 = new Web3(DEFAULT_SYSTEM_PROVIDER); + const fromAcc = await createLocalAccount(web3); + const toAcc = createAccount(); + const res = []; + for (let i = 0; i < cnt; i += 1) { + res.push( + // eslint-disable-next-line no-await-in-loop + await web3.eth.sendTransaction({ + to: toAcc.address, + value: '0x1', + from: fromAcc.address, + gas: '300000', + }), + ); + } + await closeOpenConnection(web3); + return res; +}; + +export const objectBigintToString = (obj: object): object => + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + JSON.parse( + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + JSON.stringify(obj, (_, value) => (typeof value === 'bigint' ? value.toString() : value)), + ); diff --git a/scripts/test-runner.sh b/scripts/test-runner.sh new file mode 100755 index 00000000000..da2cf2e69bb --- /dev/null +++ b/scripts/test-runner.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash + +ORIGARGS=("$@") + +. scripts/env.sh + +helpFunction() { + echo "Usage: $0 [node | electron | firefox | chrome] [coverage | sync]" + exit 1 # Exit script after printing help +} +BACKEND=${ORIGARGS[0]} +MODE=${ORIGARGS[1]} +ENGINE=${ORIGARGS[2]} +TEST_OPTION=${ORIGARGS[3]} + +SUPPORTED_BACKENDS=("geth" "hardhat" "sepolia" "mainnet" "geth-manual") +SUPPORTED_MODE=("http" "ws" "ipc") +# if you will add a new browser please also add it in the system_test_utils.ts => isBrowser +SUPPORTED_ENGINES=("node" "electron" "firefox" "chrome" "") +SUPPORTED_TEST_OPTIONS=("coverage" "sync" "manual" "") + +if [[ ! " ${SUPPORTED_BACKENDS[*]} " =~ " ${BACKEND} " ]]; then + helpFunction +fi + +if [[ ! " ${SUPPORTED_MODE[*]} " =~ " ${MODE} " ]]; then + helpFunction +fi + +if [[ ! " ${SUPPORTED_ENGINES[*]} " =~ " ${ENGINE} " ]]; then + helpFunction +fi + +if [[ ! " ${SUPPORTED_TEST_OPTIONS[*]} " =~ " ${TEST_OPTION} " ]]; then + helpFunction +fi + +echo "Node software used for tests: " $BACKEND +echo "Node running on: " "$MODE://127.0.0.1:$WEB3_SYSTEM_TEST_PORT" + +export WEB3_SYSTEM_TEST_MODE=$MODE +export WEB3_SYSTEM_TEST_PROVIDER="$MODE://127.0.0.1:$WEB3_SYSTEM_TEST_PORT" +export WEB3_SYSTEM_TEST_BACKEND=$BACKEND +export WEB3_SYSTEM_TEST_ENGINE=$ENGINE + +TEST_COMMAND="" + +if [[ $MODE == "ipc" ]]; then + export WEB3_SYSTEM_TEST_PROVIDER=$IPC_PATH + if [[ $BACKEND != "geth-manual" ]]; then + BACKEND=geth-binary + fi +fi + + + +if [[ $ENGINE == "node" ]] || [[ $ENGINE == "" ]]; then + if [[ $TEST_OPTION == "manual" ]]; then + TEST_COMMAND="test:integration:stress" + elif [[ $TEST_OPTION == "coverage" ]]; then + TEST_COMMAND="test:coverage:integration" + elif [[ $BACKEND == "sepolia" || $BACKEND == "mainnet" ]]; then + TEST_COMMAND="lerna run test:e2e:$BACKEND" + else + TEST_COMMAND="test:integration" + fi +else + if [[ $TEST_OPTION == "manual" ]]; then + TEST_COMMAND="lerna run test:e2e:$ENGINE:stress --stream" + else + TEST_COMMAND="lerna run test:e2e:$ENGINE --stream" + fi +fi + + +if [[ $BACKEND == "geth" || $BACKEND == "geth-binary" || $BACKEND == "geth-manual" ]]; then + yarn "$BACKEND:start:background" && yarn generate:accounts && yarn $TEST_COMMAND && yarn "$BACKEND:stop" +elif [[ $BACKEND == "hardhat" ]]; then + yarn $TEST_COMMAND && yarn "$BACKEND:stop" +else + yarn $TEST_COMMAND +fi diff --git a/scripts/verdaccio.sh b/scripts/verdaccio.sh new file mode 100755 index 00000000000..f0187e94ce4 --- /dev/null +++ b/scripts/verdaccio.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +ORIGARGS=("$@") + +helpFunction() { + echo "Usage: $0 [start|stop|publish|startAndPublish] [background]" + exit 1 # Exit script after printing help +} + +start() { + . scripts/env.sh + if [[ ${ORIGARGS[1]} == "background" ]]; then + startBackground + else + echo "Starting verdaccio..." + docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio + fi +} + +startBackground() { + echo "Starting verdaccio in background..." + docker run -d --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio +} + +stop() { + echo "Stopping verdaccio ..." + docker ps -q --filter ancestor="verdaccio/verdaccio" | xargs -r docker stop +} + +createVerdaccioNPMUser() { + curl -XPUT \ + -H "Content-type: application/json" \ + -d '{ "name": "test", "password": "test" }' \ + 'http://localhost:4873/-/user/org.couchdb.user:test' +} + +loginNPMUser() { + npx npm-auth-to-token \ + -u test \ + -p test \ + -e test@test.com \ + -r http://localhost:4873 +} + +lernaUpdatePackageVersions() { + npx lerna version 5.0.0 \ + --ignore-scripts \ + --no-push \ + --no-private \ + --no-git-tag-version \ + --yes +} + +lernaBuildAndCommit() { + yarn build + + git add . + git commit -m "Comitting for black box publish" +} + +lernaPublish() { + npx lerna publish from-package \ + --dist-tag blackbox \ + --no-git-tag-version \ + --no-push \ + --registry http://localhost:4873 \ + --ignore-scripts \ + --yes +} + +publish() { + echo "Publishing to verdaccio ..." + + npx wait-port -t 60000 4873 + + createVerdaccioNPMUser + loginNPMUser + lernaUpdatePackageVersions + lernaBuildAndCommit + lernaPublish +} + +startBackgroundAndPublish() { + startBackground && publish +} + +case $1 in +start) start ;; +stop) stop ;; +publish) publish ;; +startBackgroundAndPublish) startBackgroundAndPublish ;; +createVerdaccioNPMUser) createVerdaccioNPMUser ;; +loginNPMUser) loginNPMUser ;; +lernaUpdatePackageVersions) lernaUpdatePackageVersions ;; +lernaBuildAndCommit) lernaBuildAndCommit ;; +lernaPublish) lernaPublish ;; +*) helpFunction ;; # Print helpFunction in case parameter is non-existent +esac diff --git a/templates/.eslintignore.tmpl b/templates/.eslintignore.tmpl new file mode 100644 index 00000000000..ffb881be6b5 --- /dev/null +++ b/templates/.eslintignore.tmpl @@ -0,0 +1,9 @@ +dist +lib +jest.config.js +.eslintrc.js +cypress +cypress.config.js +src/common/chains/** +src/common/eips/** +src/common/hardforks/** \ No newline at end of file diff --git a/templates/.eslintrc.js.tmpl b/templates/.eslintrc.js.tmpl new file mode 100644 index 00000000000..8b7fd410b8d --- /dev/null +++ b/templates/.eslintrc.js.tmpl @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/templates/.npmignore.tmpl b/templates/.npmignore.tmpl new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/templates/.npmignore.tmpl @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/templates/.npmrc.tmpl b/templates/.npmrc.tmpl new file mode 100644 index 00000000000..a4c610ea284 --- /dev/null +++ b/templates/.npmrc.tmpl @@ -0,0 +1,2 @@ +message = ":arrow_up: Version %s" +save-exact = false diff --git a/templates/.prettierignore.tmpl b/templates/.prettierignore.tmpl new file mode 100644 index 00000000000..76075e77df3 --- /dev/null +++ b/templates/.prettierignore.tmpl @@ -0,0 +1,46 @@ +# Files +LICENSE +.gitkeep +mocha.opts +.DS_Store +REVISION + +# rc files +.*rc +## ignore files +.*ignore + +# Ignore extensions +*.png +*.jpg +*.svg +*.ai +*.sql +*.sh +*.html +*.info +*.xml +*.log +*.proto +*.csv +*.cmd +*.tsbuildinfo + +## jest snapshot +*.snap + +# project specific paths +coverage/ +dist/ +lib/ +tmp/ +browsertest.build/ +.coverage +.coverage-unit +cypress/.cert +*.lock + +# Eth2 specs +*.yaml +*.yml +.tool-versions diff --git a/templates/.prettierrc.json.tmpl b/templates/.prettierrc.json.tmpl new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/templates/.prettierrc.json.tmpl @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/templates/.secrets.json.tmpl b/templates/.secrets.json.tmpl new file mode 100644 index 00000000000..4208a3a9df5 --- /dev/null +++ b/templates/.secrets.json.tmpl @@ -0,0 +1,22 @@ +{ + "SEPOLIA": { + "HTTP": "", + "WS": "", + "ACCOUNT": { + "address": "0xa127C5E6a7E3600Ac34A9a9928E52521677e7211", + "privateKey": "" + }, + "ALLOWED_SEND_TRANSACTION": false, + "DEPLOYED_TEST_CONTRACT_ADDRESS": "0xedfd52255571b4a9a9d4445989e39f5c14ff0447" + }, + "MAINNET": { + "HTTP": "", + "WS": "", + "ACCOUNT": { + "address": "0x98AF911164f9d4E0f5983ed114949c3Bfe3ADc9d", + "privateKey": "" + }, + "ALLOWED_SEND_TRANSACTION": false, + "DEPLOYED_TEST_CONTRACT_ADDRESS": "0xdac17f958d2ee523a2206206994597c13d831ec7" + } +} \ No newline at end of file diff --git a/templates/cypress.config.js b/templates/cypress.config.js new file mode 100644 index 00000000000..95874902d93 --- /dev/null +++ b/templates/cypress.config.js @@ -0,0 +1,31 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +const config = { + screenshotOnRunFailure: false, + video: false, + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require('./cypress/plugins/index.js')(on, config); + }, + specPattern: 'test/integration/**/**/*.test.ts', + excludeSpecPattern: ['**/contract_defaults_extra.test.ts'], + }, +}; + +module.exports = config; diff --git a/templates/cypress/plugins/index.js b/templates/cypress/plugins/index.js new file mode 100644 index 00000000000..32a81d2aeda --- /dev/null +++ b/templates/cypress/plugins/index.js @@ -0,0 +1,33 @@ +/// +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +const webpackPreprocessor = require('@cypress/webpack-preprocessor'); +const webpackOptions = require('../webpack.config.js'); + +/** + * @type {Cypress.PluginConfig} + */ +// eslint-disable-next-line no-unused-vars +module.exports = (on, config) => { + on('file:preprocessor', webpackPreprocessor({ webpackOptions })); + + config.env.WEB3_SYSTEM_TEST_ENV = process.env.WEB3_SYSTEM_TEST_ENV; + config.env.WEB3_SYSTEM_TEST_BACKEND = process.env.WEB3_SYSTEM_TEST_BACKEND; + config.env.WEB3_SYSTEM_TEST_MNEMONIC = process.env.WEB3_SYSTEM_TEST_MNEMONIC; + config.env.WEB3_SYSTEM_TEST_PORT = process.env.WEB3_SYSTEM_TEST_PORT; + config.env.WEB3_SYSTEM_TEST_PROVIDER = process.env.WEB3_SYSTEM_TEST_PROVIDER; + config.env.WEB3_SYSTEM_TEST_ENGINE = process.env.WEB3_SYSTEM_TEST_ENGINE; + + return config; +}; diff --git a/templates/cypress/support/commands.js b/templates/cypress/support/commands.js new file mode 100644 index 00000000000..119ab03f7cd --- /dev/null +++ b/templates/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/templates/cypress/support/e2e.js b/templates/cypress/support/e2e.js new file mode 100644 index 00000000000..0aaa3eac194 --- /dev/null +++ b/templates/cypress/support/e2e.js @@ -0,0 +1,46 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands'; + +// Alternatively you can use CommonJS syntax: +// require('./commands') + +import 'cypress-jest-adapter'; + +// Enable the hook to match Jest +global.beforeAll = global.before; +global.afterAll = global.after; + +// In e2e tests we just need to use jest mocking API +global.jest = { + fn: global.cy.stub, + spyOn: global.cy.spy, +}; + +global.it = it; +global.test = it; +global.it.each = data => (describe, test) => { + const prs = []; + for (const d of data) { + if (Array.isArray(d)) { + prs.push(global.it(describe, test.bind(undefined, ...d))); + } else { + prs.push(global.it(describe, test.bind(undefined, d))); + } + } + return Promise.all(prs); +}; diff --git a/templates/cypress/webpack.config.js b/templates/cypress/webpack.config.js new file mode 100644 index 00000000000..cffd3d85576 --- /dev/null +++ b/templates/cypress/webpack.config.js @@ -0,0 +1,38 @@ +const webpack = require('webpack'); + +module.exports = { + // mode: 'development', + target: 'web', + stats: { + modules: true, + colors: true, + }, + module: { + rules: [ + { + test: /\.ts?$/, + use: 'ts-loader', + exclude: [/node_modules/, /unit/], + }, + ], + }, + resolve: { + extensions: ['.ts', '.js'], + fallback: { + fs: false, + net: false, + util: require.resolve('util'), + http: require.resolve('http-browserify'), + https: require.resolve('https-browserify'), + stream: require.resolve('readable-stream'), + }, + extensionAlias: { + '.js': ['.js', '.ts'], + }, + }, + plugins: [ + new webpack.ProvidePlugin({ + process: 'process/browser', + }), + ], +}; diff --git a/templates/jest.config.js.tmpl b/templates/jest.config.js.tmpl new file mode 100644 index 00000000000..e4d70e55a94 --- /dev/null +++ b/templates/jest.config.js.tmpl @@ -0,0 +1,60 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +module.exports = { + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/templates/test/.eslintrc.js.tmpl b/templates/test/.eslintrc.js.tmpl new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/templates/test/.eslintrc.js.tmpl @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/templates/test/tsconfig.json.tmpl b/templates/test/tsconfig.json.tmpl new file mode 100644 index 00000000000..831ffc02b5d --- /dev/null +++ b/templates/test/tsconfig.json.tmpl @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.cjs.json", + "compilerOptions": { + "declaration": false, + "declarationMap": false + }, + "include": ["./**/*", "../node_modules/jest-extended/types/**/*.ts"] +} diff --git a/templates/tsconfig.json.tmpl b/templates/tsconfig.json.tmpl new file mode 100644 index 00000000000..7af3885edd9 --- /dev/null +++ b/templates/tsconfig.json.tmpl @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "outDir": "lib", + "esModuleInterop": true + }, + "include": ["src/**/*"] +} diff --git a/test/1_givenProvider-ethereumProvider.js b/test/1_givenProvider-ethereumProvider.js deleted file mode 100644 index 5571b82af98..00000000000 --- a/test/1_givenProvider-ethereumProvider.js +++ /dev/null @@ -1,87 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var decache = require('decache'); - -describe('Web3.providers.givenProvider', function () { - - // Setting of 'global.' requires a deep reset - beforeEach(function(){ - decache('../packages/web3'); - decache('../packages/web3-eth'); - decache('../packages/web3-bzz'); - }); - - describe('should be set if window.ethereum is available', function () { - beforeEach(function(){ - global.ethereum = {bzz: 'http://givenProvider:8501'}; - }); - - it('when instantiating Web3', function () { - var Web3 = require('../packages/web3'); - assert.deepEqual(Web3.givenProvider, global.ethereum); - }); - - it('when instantiating Eth', function () { - var Eth = require('../packages/web3-eth'); - assert.deepEqual(Eth.givenProvider, global.ethereum); - }); - - it('when instantiating Bzz', function () { - var Bzz = require('../packages/web3-bzz'); - assert.deepEqual(Bzz.givenProvider, global.ethereum.bzz); - }); - }); - - describe('should use request() if available, otherwise falling back to sendAsync() and send()', function () { - - after(function(){ - global.ethereum = undefined; - }) - - it('should use request()', async function () { - global.ethereum = { - request: async () => { return '0x64' }, - sendAsync: () => { throw new Error('used sendAsync') }, - send: () => { throw new Error('used send') } - }; - const Web3 = require('../packages/web3'); - const web3 = new Web3(Web3.givenProvider); - const blockNumber = await web3.eth.getBlockNumber(); - assert.equal(blockNumber, 100) - }); - - it('should use sendAsync()', async function () { - global.ethereum = { - sendAsync: (args, callback) => { return callback(null, {jsonrpc: '2.0', id: 0, result: 101}) }, - send: () => { throw new Error('used send') } - }; - const Web3 = require('../packages/web3'); - const web3 = new Web3(Web3.givenProvider); - const blockNumber = await web3.eth.getBlockNumber(); - assert.equal(blockNumber, 101) - }); - - it('should use send()', async function () { - global.ethereum = { - send: (args, callback) => { return callback(null, {jsonrpc: '2.0', id: 0, result: 102}) } - }; - const Web3 = require('../packages/web3'); - const web3 = new Web3(Web3.givenProvider); - const blockNumber = await web3.eth.getBlockNumber(); - assert.equal(blockNumber, 102) - }); - - it('should error without any request or send method', async function () { - global.ethereum = {}; - const Web3 = require('../packages/web3'); - const web3 = new Web3(Web3.givenProvider); - try { - await web3.eth.getBlockNumber(); - assert.fail('should error'); - } catch (error) { - assert.equal(error.message, 'Provider does not have a request or send method to use.'); - } - }); - }); -}); - diff --git a/test/2_givenProvider-currentProvider.js b/test/2_givenProvider-currentProvider.js deleted file mode 100644 index 95c7b9759b3..00000000000 --- a/test/2_givenProvider-currentProvider.js +++ /dev/null @@ -1,30 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var decache = require('decache'); - -describe('Web3.providers.currentProvider', function () { - - // Setting of 'global.' requires a deep reset - beforeEach(function(){ - decache('../packages/web3'); - decache('../packages/web3-eth'); - decache('../packages/web3-bzz'); - }); - - describe('should be set if web3.currentProvider is available', function () { - beforeEach(function(){ - global.web3 = {currentProvider: {bzz: 'http://givenProvider:8501'}}; - }); - - it('when instantiating Web3', function () { - var Web3 = require('../packages/web3'); - assert.deepEqual(Web3.givenProvider, global.web3.currentProvider); - }); - - it('when instantiating Eth', function () { - var Eth = require('../packages/web3-eth'); - assert.deepEqual(Eth.givenProvider, global.web3.currentProvider); - }); - }); -}); - diff --git a/test/3_givenProvider-ganache.js b/test/3_givenProvider-ganache.js deleted file mode 100644 index 2050058aee2..00000000000 --- a/test/3_givenProvider-ganache.js +++ /dev/null @@ -1,62 +0,0 @@ -var assert = require('assert'); -var ganache = require('ganache-cli'); -var Web3 = require('../packages/web3'); -var Basic = require('./sources/Basic'); - -describe('web.providers.givenProvider (ganache)', function(){ - var web3; - var accounts; - var basic; - var provider; - - var basicOptions = { - data: Basic.bytecode, - gasPrice: '1', - gas: 4000000 - }; - - before(async function(){ - provider = ganache.provider(); - web3 = new Web3(provider); - accounts = await web3.eth.getAccounts(); - basic = new web3.eth.Contract(Basic.abi, basicOptions); - }) - - after(function(done){ - provider.close(done); - }) - - it('requestManager attaches 4 listeners', async function(){ - assert.equal(1, web3.currentProvider.listenerCount('data')) - assert.equal(1, web3.currentProvider.listenerCount('connect')) - assert.equal(1, web3.currentProvider.listenerCount('error')) - // TODO: Remove close once the standard allows it - assert( - web3.currentProvider.listenerCount("disconnect") === 1 || web3.currentProvider.listenerCount("close") === 1 - ); - }); - - it('deploys a contract', async function(){ - var instance = await basic.deploy().send({from: accounts[0]}) - assert(web3.utils.isAddress(instance.options.address)); - }); - - it('can repeatedly setProvider without triggering MaxListeners', function(done){ - let failed = false; - - process.once('warning', function(msg){ - failed = msg.toString().includes("MaxListenersExceededWarning"); - }); - - // Setting the provider more than 9X triggers the warning in 1.2.7-rc.0 - for (var i=1; i<=10; i++) { - basic.setProvider(provider); - } - - setTimeout(function(){ - if(failed) assert.fail("MaxListenersExceededWarning"); - done(); - },500); - }) - -}) diff --git a/test/abi.decodeParam-ethjs.js_ b/test/abi.decodeParam-ethjs.js_ deleted file mode 100644 index 65baaaf356b..00000000000 --- a/test/abi.decodeParam-ethjs.js_ +++ /dev/null @@ -1,409 +0,0 @@ -var _ = require('underscore'); -var chai = require('chai'); -var assert = chai.assert; -var utils = require('../packages/web3-utils'); -var coder = require('ethjs-abi'); - -// TODO check line 108 again! - -var convertResult = function (result) { - var resultArray = []; - _.each(result, function (res, i) { - if(isFinite(i)) - resultArray.push(res); - }); - var convert = function (resultArray) { - return _.map(resultArray, function (res) { - if(res.constructor.name === 'BN') { - res = res.toString(10); - } else if(_.isArray(res)) { - res = convert(res); - } else if(_.isString(res) && utils.isAddress(res)) { - res = utils.toChecksumAddress(res); - } - return res; - }); - }; - return convert(resultArray); -}; - -describe('lib/solidity/coder', function () { - describe('decodeParam', function () { - var test = function (t) { - it('should turn ' + t.type +': ' + t.value + ' to ' + t.expected, function () { - // assert.deepEqual(coder.decodeParam(t.type, t.value), t.expected); - - var value = (typeof t.value === 'string') ? '0x'+ t.value.replace('0x','') : t.value; - var result = coder.decodeMethod({type: 'function', outputs: [{type: t.type, name: 'TestName'}]}, value); - - - var resultArray = convertResult(result); - - if(resultArray.length === 1) - resultArray = resultArray[0]; - - - assert.deepEqual(resultArray, t.expected); - }); - }; - - - test({ type: 'address', expected: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ type: 'address[2]', expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3'], - value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[]', expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3'], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[][2]', expected: [['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407d73d8a49EEB85d32Cf465507dD71D507100c2'], - ['0x407D73d8A49eEB85D32Cf465507Dd71d507100c3', '0x407D73d8a49eeb85D32CF465507dd71d507100C4']], - value: '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000002' + /* 40 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + /* 60 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '0000000000000000000000000000000000000000000000000000000000000002' + /* a0 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'address[2][]', expected: [['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407d73d8a49EEB85d32Cf465507dD71D507100c2'], - ['0x407D73d8A49eEB85D32Cf465507Dd71d507100c3', '0x407D73d8a49eeb85D32CF465507dd71d507100C4']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + /* 20 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'address[][]', expected: [['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407d73d8a49EEB85d32Cf465507dD71D507100c2'], - ['0x407D73d8A49eEB85D32Cf465507Dd71d507100c3', '0x407D73d8a49eeb85D32CF465507dd71d507100C4']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + /* 20 */ - '0000000000000000000000000000000000000000000000000000000000000080' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000002' + /* 80 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + /* a0 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '0000000000000000000000000000000000000000000000000000000000000002' + /* e0 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'bool', expected: true, value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'bool', expected: false, value: '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[2]', expected: [true, false], - value: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[]', expected: [true, true, false], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - - test({ type: 'int', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int', expected: '-1', value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'int256', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int256', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int256', expected: '-1', value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'int8', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int8[2]', expected: ['16', '2'], - value: '0000000000000000000000000000000000000000000000000000000000000010' + - '0000000000000000000000000000000000000000000000000000000000000002'}); - test({ type: 'int32', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int64', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int128', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int[]', expected: [], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'int[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int256[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int[]', expected: ['1', '2', '3'], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int[3][]', expected: [['1', '2', '3'], ['4', '5', '6']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006'}); - - test({ type: 'uint', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639935', // old 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'uint256', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint256', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint8', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint32', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint64', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint128', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint[]', expected: [], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'uint[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint256[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint[]', expected: ['1', '2', '3'], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint[3][]', expected: [['1', '2', '3'], ['4', '5', '6']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006'}); - test({ type: 'bytes', expected: '0x6761766f66796f726b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'bytes', expected: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', expected: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', expected: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes[2]', expected: ['0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134a', - '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'], - value: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134a' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes[][2]', expected: [['0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134a'], - ['0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134c', - '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134d']], - value: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - - '0000000000000000000000000000000000000000000000000000000000000001' + // 40 // - '00000000000000000000000000000000000000000000000000000000000000e0' + - - '0000000000000000000000000000000000000000000000000000000000000002' + // 80 // - '0000000000000000000000000000000000000000000000000000000000000120' + - '0000000000000000000000000000000000000000000000000000000000000180' + - - '0000000000000000000000000000000000000000000000000000000000000020' + // e0 // - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134a' + - - '0000000000000000000000000000000000000000000000000000000000000040' + // 120 // - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134c' + - '0000000000000000000000000000000000000000000000000000000000000020' + // 180 // - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134d'}); - - test({ type: 'bytes1', expected: '0xcf', - value: 'cf00000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes1[4]', expected: ['0xcf', '0x68', '0x4d', '0xfb'], - value: 'cf00000000000000000000000000000000000000000000000000000000000000' + - '6800000000000000000000000000000000000000000000000000000000000000' + - '4d00000000000000000000000000000000000000000000000000000000000000' + - 'fb00000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes32', expected: '0x6761766f66796f726b0000000000000000000000000000000000000000000000', - value: '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - - test({ type: 'string', expected: 'gavofyork', value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: 'ää', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000008' + - 'c383c2a4c383c2a4000000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: 'ü', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c3bc000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: 'Ã', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c383000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'string[]', expected: ['gavofyork','34ɝɣ24'], value: '0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000096761766f66796f726b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083334c99dc9a33234000000000000000000000000000000000000000000000000'}); - - test({ type: 'bytes', expected: '0xc3a40000c3a4', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000006' + - 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes32', expected: '0xc3a40000c3a40000000000000000000000000000000000000000000000000000', - value: 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - test({ type: 'address', expected: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ type: 'string', expected: 'welcome to ethereum. welcome to ethereum. welcome to ethereum.', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000003e' + - '77656c636f6d6520746f20657468657265756d2e2077656c636f6d6520746f20' + - '657468657265756d2e2077656c636f6d6520746f20657468657265756d2e0000'}); - test({ type: 'bytes', expected: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000009f' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff100'}); - }); -}); - -describe('lib/solidity/coder', function () { - describe('decodeParams', function () { - var test = function (t) { - it('should turn ' + t.values + ' to ' + t.expected, function () { - // assert.deepEqual(coder.decodeParams(t.types, t.values), t.expected); - var outputs = t.types.map(function (type, i) { - return {type: type, name: 'TestName'+ i}; - }); - - var value = (typeof t.values === 'string') ? '0x'+ t.values.replace('0x','') : t.values; - var result = coder.decodeMethod({type: 'function', outputs: outputs}, value); - - var resultArray = convertResult(result); - - - assert.deepEqual(resultArray, t.expected); - }); - }; - - - test({ types: ['address'], expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1'], - values: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ types: ['address', 'address'], expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3'], - values: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3'}); - test({ types: ['bool[2]', 'bool[3]'], expected: [[true, false], [false, false, true]], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int[2]', 'int256[3]'], expected: [['1', '2'], ['3', '4', '5']], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['int'], expected: ['1'], values: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['uint[2]', 'uint256[3]'], expected: [['1', '2'], ['3', '4', '5']], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['uint'], expected: ['1'], values: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['bytes1', 'bytes1'], expected: ['0xaa', '0xbb'], - values: 'aa00000000000000000000000000000000000000000000000000000000000000' + - 'bb00000000000000000000000000000000000000000000000000000000000000'}); - test({ types: ['bytes1[2]', 'bytes1'], expected: [['0xaa', '0xbb'], '0xcc'], - values: 'aa00000000000000000000000000000000000000000000000000000000000000' + - 'bb00000000000000000000000000000000000000000000000000000000000000' + - 'cc00000000000000000000000000000000000000000000000000000000000000'}); - test({ types: ['bytes', 'bytes'], expected: ['0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134c'], - values: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134c'}); - test({ types: ['int', 'string', 'int'], expected: ['1', 'gavofyork', '5'], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['bytes32', 'int'], expected: ['0x6761766f66796f726b0000000000000000000000000000000000000000000000', '5'], - values: '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['int', 'bytes32'], expected: ['5', '0x6761766f66796f726b0000000000000000000000000000000000000000000000'], - values: '0000000000000000000000000000000000000000000000000000000000000005' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['int', 'string', 'int', 'int', 'int', 'int[]'], expected: ['1', 'gavofyork', '2', '3', '4', - ['5', '6', '7']], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000100' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0000000000000000000000000000000000000000000000000000000000000007'}); - test({ types: ['int', 'bytes', 'int', 'bytes'], expected: [ - '5', - '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - '3', - '0x331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - ], - values: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ types: ['address[2][1]', 'bool'], expected: [[['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3']], false], - values: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ types: ['bool[2][1]', 'bool'], expected: [[[true, false]], true], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['bytes1[2][1]', 'bool'], expected: [[['0xaa', '0xbb']], true], - values: 'aa00000000000000000000000000000000000000000000000000000000000000' + - 'bb00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int[2][1]', 'bool'], expected: [[['1', '2']], true], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['uint[2][1]', 'bool'], expected: [[['1', '2']], true], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - }); -}); diff --git a/test/abi.decodeParameter.js b/test/abi.decodeParameter.js deleted file mode 100644 index e79fab2c927..00000000000 --- a/test/abi.decodeParameter.js +++ /dev/null @@ -1,655 +0,0 @@ -var _ = require('underscore'); -var chai = require('chai'); -var assert = chai.assert; -var coder = require('../packages/web3-eth-abi'); - -// TODO check line 108 again! - -describe('lib/solidity/coder', function () { - describe('decodeParam', function () { - var test = function (t) { - it('should turn ' + t.type +': ' + t.value + ' to ' + t.expected, function () { - if (t.type === 'tuple') { - console.log(t); - } - assert.deepEqual(coder.decodeParameter(t.type, t.value), t.expected); - }); - }; - - test({ type: 'address', expected: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ type: 'address[2]', expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3'], - value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[]', expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3'], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[][2]', expected: [['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407d73d8a49EEB85d32Cf465507dD71D507100c2'], - ['0x407D73d8A49eEB85D32Cf465507Dd71d507100c3', '0x407D73d8a49eeb85D32CF465507dd71d507100C4']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4'}); - test({ type: 'address[2][]', expected: [['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407d73d8a49EEB85d32Cf465507dD71D507100c2'], - ['0x407D73d8A49eEB85D32Cf465507Dd71d507100c3', '0x407D73d8a49eeb85D32CF465507dd71d507100C4']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + /* 20 */ - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - // test({ type: 'address[][]', expected: [['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407d73d8a49EEB85d32Cf465507dD71D507100c2'], - // ['0x407D73d8A49eEB85D32Cf465507Dd71d507100c3', '0x407D73d8a49eeb85D32CF465507dd71d507100C4']], - // value: '0000000000000000000000000000000000000000000000000000000000000020' + - // '0000000000000000000000000000000000000000000000000000000000000002' + /* 20 */ - // '0000000000000000000000000000000000000000000000000000000000000080' + - // '00000000000000000000000000000000000000000000000000000000000000e0' + - // '0000000000000000000000000000000000000000000000000000000000000002' + /* 80 */ - // '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + /* a0 */ - // '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - // '0000000000000000000000000000000000000000000000000000000000000002' + /* e0 */ - // '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - // '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'bool', expected: true, value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'bool', expected: false, value: '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[2]', expected: [true, false], - value: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[]', expected: [true, true, false], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - - test({ type: 'int', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int', expected: '-1', value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'int256', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int256', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int256', expected: '-1', value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'int8', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int8[2]', expected: ['16', '2'], - value: '0000000000000000000000000000000000000000000000000000000000000010' + - '0000000000000000000000000000000000000000000000000000000000000002'}); - test({ type: 'int32', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int64', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int128', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int[]', expected: [], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'int[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int256[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int[]', expected: ['1', '2', '3'], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int[3][]', expected: [['1', '2', '3'], ['4', '5', '6']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006'}); - - test({ type: 'uint', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639935', // old 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'uint256', expected: '1', value: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint256', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint8', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint32', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint64', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint128', expected: '16', value: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint[]', expected: [], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'uint[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint256[]', expected: ['3'], value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint[]', expected: ['1', '2', '3'], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint[3][]', expected: [['1', '2', '3'], ['4', '5', '6']], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006'}); - test({ type: 'bytes', expected: '0x6761766f66796f726b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'bytes', expected: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', expected: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', expected: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes[2]', expected: ['0x00000c8c18f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff', - '0x21f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff'], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000022' + - '00000c8c18f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f61' + - '7fff000000000000000000000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000001e' + - '21f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff0000'}); - - - test({ type: 'bytes[][2]', expected: [['0x00000c8c18f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff', - '0x21f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff'], - ['0x00000c8c18f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff', - '0x21f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff']], - value: '0000000000000000000000000000000000000000000000000000000000000020'+ - '0000000000000000000000000000000000000000000000000000000000000040'+ - '0000000000000000000000000000000000000000000000000000000000000140' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000022' + - '00000c8c18f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f61' + - '7fff000000000000000000000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000001e' + - '21f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff0000' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000022' + - '00000c8c18f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f61' + - '7fff000000000000000000000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000001e' + - '21f9252830fb3c56471c51335a8262f16a6d70e276417a7c7d897f617fff0000'}); - - test({ type: 'bytes1', expected: '0xcf', - value: 'cf00000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes1[4]', expected: ['0xcf', '0x68', '0x4d', '0xfb'], - value: 'cf00000000000000000000000000000000000000000000000000000000000000' + - '6800000000000000000000000000000000000000000000000000000000000000' + - '4d00000000000000000000000000000000000000000000000000000000000000' + - 'fb00000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes32', expected: '0x6761766f66796f726b0000000000000000000000000000000000000000000000', - value: '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - - test({ type: 'string', expected: 'gavofyork', value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: 'ää', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000008' + - 'c383c2a4c383c2a4000000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: 'ü', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c3bc000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: '', - value: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: 'Ã', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c383000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'string', expected: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', - value: '00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000026486565c3a4c3b6c3b6c3a4f09f9185443334c99dc9a33234d084cdbd2d2e2cc3a4c3bc2b232f0000000000000000000000000000000000000000000000000000'}); - - test({ type: 'bytes', expected: '0xc3a40000c3a4', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000006' + - 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes32', expected: '0xc3a40000c3a40000000000000000000000000000000000000000000000000000', - value: 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - test({ type: 'address', expected: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ type: 'string', expected: 'welcome to ethereum. welcome to ethereum. welcome to ethereum.', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000003e' + - '77656c636f6d6520746f20657468657265756d2e2077656c636f6d6520746f20' + - '657468657265756d2e2077656c636f6d6520746f20657468657265756d2e0000'}); - test({ type: 'bytes', expected: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1', - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000009f' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff100'}); - test({ type: 'tuple(address)', expected: ['0xbBF289D846208c16EDc8474705C748aff07732dB'], - value: '000000000000000000000000bbf289d846208c16edc8474705c748aff07732db'}); - test({ type: 'tuple(address,address)', expected: ['0xbBF289D846208c16EDc8474705C748aff07732dB', '0xbBF289D846208c16EDc8474705C748aff07732dB'], - value: '000000000000000000000000bbf289d846208c16edc8474705c748aff07732db' + - '000000000000000000000000bbf289d846208c16edc8474705c748aff07732db'}) - test({ type: 'tuple(uint256,uint256)', expected: ["5","5"], - value: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000005'}) - test({ type: 'tuple(string,string)', expected: ["hello", "world"], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '68656c6c6f000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '776f726c64000000000000000000000000000000000000000000000000000000'}) - test({ type: 'tuple(bytes,bytes)', expected: ["0x01fe517acd15ff","0xabcdef12345678"], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000007' + - '01fe517acd15ff00000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000007' + - 'abcdef1234567800000000000000000000000000000000000000000000000000'}) - test({ type: 'tuple(bool,bool)', expected: [false, true], - value: '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}) - - test({ type: 'tuple(uint256,string,bytes)', expected: ["4", "what what", "0xabcdef12345678"], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '7768617420776861740000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000007' + - 'abcdef1234567800000000000000000000000000000000000000000000000000'}) - test({ type: 'tuple(uint128,string,bytes)', expected: ["666", "encode your kids", "0x656e636f646520796f75722077696665"], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000029a' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000010' + - '656e636f646520796f7572206b69647300000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000010' + - '656e636f646520796f7572207769666500000000000000000000000000000000' }) - test({ type: 'tuple(string,bytes32,uint256,bool)', expected: ["foo bar", "0xaabbccddeeff0000000000000000000000000000000000000000000000000000", "321", true], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000080' + - 'aabbccddeeff0000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000141' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000007' + - '666f6f2062617200000000000000000000000000000000000000000000000000'}) - test({ type: 'tuple(uint8,uint8,uint8,uint8,string,address,bool)', expected: ["1", "2", "3", "4", "five", "0x0000000000000000000000000000000000000006", true], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '6669766500000000000000000000000000000000000000000000000000000000' }) - test({ type: 'tuple(tuple(address,address),tuple(uint256,uint256))', expected: [["0x1234567890123456789012345678901234567890","0x1234567890123456789012345678901234567890"],["5", "6"]], - value: '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' }) - test({ type: 'tuple(tuple(address,address),tuple(uint256,uint256),tuple(string,string))', expected: [["0x1234567890123456789012345678901234567890","0x1234567890123456789012345678901234567890"],["5","6"],["a string", "another string"]], - value: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000008' + - '6120737472696e67000000000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000e' + - '616e6f7468657220737472696e67000000000000000000000000000000000000' - }) - }); -}); - - -describe('lib/solidity/coder', function () { - describe('decodeParams', function () { - var test = function (t) { - it('should turn ' + t.values + ' to ' + t.expected, function () { - var result = coder.decodeParameters(t.types, t.values); - - var resultArray = []; - _.each(result, function (res, key) { - if(_.isFinite(key)) - resultArray.push(res); - }); - - - - assert.deepEqual(resultArray, t.expected); - }); - }; - - - test({ types: ['address'], expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1'], - values: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ types: ['address', 'address'], expected: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3'], - values: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3'}); - test({ types: ['bool[2]', 'bool[3]'], expected: [[true, false], [false, false, true]], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int[2]', 'int256[3]'], expected: [['1', '2'], ['3', '4', '5']], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['int'], expected: ['1'], values: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['uint[2]', 'uint256[3]'], expected: [['1', '2'], ['3', '4', '5']], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['uint'], expected: ['1'], values: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['bytes1', 'bytes1'], expected: ['0xaa', '0xbb'], - values: 'aa00000000000000000000000000000000000000000000000000000000000000' + - 'bb00000000000000000000000000000000000000000000000000000000000000'}); - test({ types: ['bytes1[2]', 'bytes1'], expected: [['0xaa', '0xbb'], '0xcc'], - values: 'aa00000000000000000000000000000000000000000000000000000000000000' + - 'bb00000000000000000000000000000000000000000000000000000000000000' + - 'cc00000000000000000000000000000000000000000000000000000000000000'}); - test({ types: ['bytes', 'bytes'], expected: ['0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134c'], - values: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134c'}); - test({ types: ['int', 'string', 'int'], expected: ['1', 'gavofyork', '5'], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['bytes32', 'int'], expected: ['0x6761766f66796f726b0000000000000000000000000000000000000000000000', '5'], - values: '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['int', 'bytes32'], expected: ['5', '0x6761766f66796f726b0000000000000000000000000000000000000000000000'], - values: '0000000000000000000000000000000000000000000000000000000000000005' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['int', 'string', 'int', 'int', 'int', 'int[]'], expected: ['1', 'gavofyork', '2', '3', '4', - ['5', '6', '7']], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000100' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0000000000000000000000000000000000000000000000000000000000000007'}); - test({ types: ['int', 'bytes', 'int', 'bytes'], expected: [ - '5', - '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - '3', - '0x331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - ], - values: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ types: ['address[2][1]', 'bool'], expected: [[['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - '0x407D73d8A49eEB85D32Cf465507Dd71d507100c3']], false], - values: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ types: ['bool[2][1]', 'bool'], expected: [[[true, false]], true], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['bytes1[2][1]', 'bool'], expected: [[['0xaa', '0xbb']], true], - values: 'aa00000000000000000000000000000000000000000000000000000000000000' + - 'bb00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int[2][1]', 'bool'], expected: [[['1', '2']], true], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['uint[2][1]', 'bool'], expected: [[['1', '2']], true], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['tuple(address,address)', 'tuple(string,string)', 'bool'], - expected: [['0x1234567890123456789012345678901234567890', '0x1234567890123456789012345678901234567890'],["hello", "world"], false], - values: '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '68656c6c6f000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '776f726c64000000000000000000000000000000000000000000000000000000' }) - - test({ types: ['string', 'tuple(uint256,string)', 'bool', 'tuple(bytes32,bytes)'], - expected: ["the string", ["56","some string"], true, ["0x1234567890123456789012345678901234567890123456789012345678901234", "0x129581"]], - values: '0000000000000000000000000000000000000000000000000000000000000080' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000140' + - '000000000000000000000000000000000000000000000000000000000000000a' + - '74686520737472696e6700000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000038' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '736f6d6520737472696e67000000000000000000000000000000000000000000' + - '1234567890123456789012345678901234567890123456789012345678901234' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '1295810000000000000000000000000000000000000000000000000000000000'}) - test({ types: ['bool', 'tuple(bool,tuple(bool,tuple(bool,bool)))', 'tuple(uint256,tuple(uint256,uint256,tuple(uint256,string)))', 'string'], - expected: [true, [false, [true, [false, true]]], ["256",["76","67",["1337","hello"]]], "last param"], - values: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000200' + - '0000000000000000000000000000000000000000000000000000000000000100' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '000000000000000000000000000000000000000000000000000000000000004c' + - '0000000000000000000000000000000000000000000000000000000000000043' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000539' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '68656c6c6f000000000000000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000a' + - '6c61737420706172616d00000000000000000000000000000000000000000000' }) - - test({types: ['string', 'tuple(string,string,tuple(string,string))', 'bytes', 'tuple(bytes,tuple(bytes,string))'], - expected: ["hello world", ["what","is",["even","happening"]], '0x696e', ['0x74686973', ['0x676f64666f7273616b656e', "test"]]], - values: '0000000000000000000000000000000000000000000000000000000000000080' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000260' + - '00000000000000000000000000000000000000000000000000000000000002a0' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '68656c6c6f20776f726c64000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '7768617400000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '6973000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '6576656e00000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '68617070656e696e670000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '696e000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '7468697300000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '676f64666f7273616b656e000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '7465737400000000000000000000000000000000000000000000000000000000' }) - test({ types: ["string", "bool", "tuple(string,tuple(tuple(bool,string,bool),tuple(string,bytes32,bytes)))", "bytes", "tuple(bool,tuple(bytes32,address),bytes)"], - expected: ["this",true, ["is", [[true, "utter", true],["madness","0x1234567890123456789012345678901234567890123456789012345678901234", "0x6275742049206c6f7665206974"]]],"0x6265636175736520697420776f726b73", [true,["0x1234567890123456789012345678901234567890123456789012345678901234","0x1337133713371337133713371337133713371337"],"0x6265636175736520697420776f726b736265636175736520697420776f726b73"]], - values: '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000320' + - '0000000000000000000000000000000000000000000000000000000000000360' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '7468697300000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '6973000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '7574746572000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '1234567890123456789012345678901234567890123456789012345678901234' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000007' + - '6d61646e65737300000000000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000d' + - '6275742049206c6f766520697400000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000010' + - '6265636175736520697420776f726b7300000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '1234567890123456789012345678901234567890123456789012345678901234' + - '0000000000000000000000001337133713371337133713371337133713371337' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '6265636175736520697420776f726b736265636175736520697420776f726b73'}) - test( { types: ['tuple(string,tuple(bool,bool))','address','bytes','tuple(bytes,bytes,string,bool,address)','int256','tuple(int256,uint256,tuple(string,int256,address))'], - expected: [ ["this is more reasonable", [true, false]],"0x1b3F5FE0Fd513E6cbdEE459F0b0e19095FE91958","0x6c6f6c6f6c6f6c6f6c",["0xabcdef12345678", "0x87654321fedcba", "bazbar", false, "0xd13b6e9058E58B8677233CEc2315e1D9e77C79C4"], "-6", ["-7", "5", ["foobar","-8","0xB1eeF147028E9f480DbC5ccaA3277D417D1b85F0"]]], - values: '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000001b3f5fe0fd513e6cbdee459f0b0e19095fe91958' + - '0000000000000000000000000000000000000000000000000000000000000160' + - '00000000000000000000000000000000000000000000000000000000000001a0' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa' + - '0000000000000000000000000000000000000000000000000000000000000300' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000017' + - '74686973206973206d6f726520726561736f6e61626c65000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6c6f6c6f6c6f6c6f6c0000000000000000000000000000000000000000000000' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000120' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '000000000000000000000000d13b6e9058e58b8677233cec2315e1d9e77c79c4' + - '0000000000000000000000000000000000000000000000000000000000000007' + - 'abcdef1234567800000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000007' + - '87654321fedcba00000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '62617a6261720000000000000000000000000000000000000000000000000000' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000060' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8' + - '000000000000000000000000b1eef147028e9f480dbc5ccaa3277d417d1b85f0' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '666f6f6261720000000000000000000000000000000000000000000000000000'}) - test( { types: ['tuple(bytes32,bool,bytes32)', 'address', 'tuple(bytes32,bytes32,string)', 'tuple(tuple(address,bool),tuple(address,bytes32),tuple(int256,uint256))'], - expected: [["0xffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae", true, "0xffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae"], "0x1234567890123456789012345678901234567890" ,["0x0ab3e6dfa1594c15af0000000000000000000000000000000000000000000000","0xffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae","string"], [["0x1234567890123456789012345678901234567890", true],["0x1234567890123456789012345678901234567890","0xffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae"],["-6124612", "89000"]]], - values: 'ffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'ffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae' + - '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000000000000000000000000000000000000000000160' + - '0000000000000000000000001234567890123456789012345678901234567890' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000001234567890123456789012345678901234567890' + - 'ffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa28bbc' + - '0000000000000000000000000000000000000000000000000000000000015ba8' + - '0ab3e6dfa1594c15af0000000000000000000000000000000000000000000000' + - 'ffffffffffffffffffffffffffffffffabdef123849181759adebfadecaefbae' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '737472696e670000000000000000000000000000000000000000000000000000'}) - }); -}); - -describe('/lib/solidity/coder', function() { - describe('decodeParam', function () { - it('should not alter inputs', function () { - const t = { - type: "function", - name: "f", - internalType: "function () external" - }; - const copyOfT = Object.assign({}, t); - coder.decodeParameter(t, '063e4f349a9e91c6575aedab0e70087fab642ecac04062260000000000000000'); //must not alter t! - assert.deepEqual(t, copyOfT); - }); - }); -}); diff --git a/test/abi.encodeParam-ethjs.js_ b/test/abi.encodeParam-ethjs.js_ deleted file mode 100644 index 2ba38f620d5..00000000000 --- a/test/abi.encodeParam-ethjs.js_ +++ /dev/null @@ -1,352 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var coder = require('ethjs-abi'); - - -describe('lib/solidity/coder', function () { - describe('encodeParam', function () { - var test = function (t) { - it('should turn ' + t.value + ' to ' + t.expected, function () { - console.log(); - var result = coder.encodeParams([t.type], [t.value]); - - assert.equal(result, '0x'+ t.expected); - }); - }; - - - test({ type: 'address', value: '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - expected: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ type: 'address[2]', value: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c3'], - expected: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[]', value: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c3'], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[][2]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c2'], - ['0x407d73d8a49eeb85d32cf465507dd71d507100c3', '0x407d73d8a49eeb85d32cf465507dd71d507100c4']], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'address[2][]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c2'], - ['0x407d73d8a49eeb85d32cf465507dd71d507100c3', '0x407d73d8a49eeb85d32cf465507dd71d507100c4']], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - //test({ type: 'address[][]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100c5'], - //['0x407d73d8a49eeb85d32cf465507dd71d507100c3']], - //expected: '0000000000000000000000000000000000000000000000000000000000000020' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'0000000000000000000000000000000000000000000000000000000000000080' + - //'00000000000000000000000000000000000000000000000000000000000000c0' + - //'0000000000000000000000000000000000000000000000000000000000000001' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c5' + - //'0000000000000000000000000000000000000000000000000000000000000001' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - //test({ type: 'address[][]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100cf', '0x407d73d8a49eeb85d32cf465507dd71d507100c2'], - //['0x407d73d8a49eeb85d32cf465507dd71d507100c3', '0x407d73d8a49eeb85d32cf465507dd71d507100c4']], - //expected: '0000000000000000000000000000000000000000000000000000000000000020' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'0000000000000000000000000000000000000000000000000000000000000080' + - //'00000000000000000000000000000000000000000000000000000000000000e0' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100cf' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'bool', value: true, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'bool', value: false, expected: '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[1][2]', value: [[false], [false]], - expected: '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[2]', value: [true, false], - expected: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[]', value: [true, true, false], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - - test({ type: 'int', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int', value: -1, expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'int', value: 0.1, expected: '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'int', value: 3.9, expected: '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int256', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int256', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int256', value: -1, expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - - test({ type: 'uint', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint', value: 0.1, expected: '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'uint', value: 3.9, expected: '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint256', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint256', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint256', value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', - expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'bytes32', value: '0x6761766f66796f726b', - expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'bytes32', value: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes32', value: '0x02838654a83c213dae3698391eabbd54a5b6e1fb3452bc7fa4ea0dd5c8ce7e29', - expected: '02838654a83c213dae3698391eabbd54a5b6e1fb3452bc7fa4ea0dd5c8ce7e29'}); - test({ type: 'bytes', value: '0x6761766f66796f726b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'bytes', value: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000009f' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff100'}); - test({ type: 'string', value: 'gavofyork', expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'bytes', value: '0xc3a40000c3a4', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000006' + - 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes1', value: '0xc3', - expected: 'c300000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes24', value: '0xc3a40000c3a4', - expected: 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - - test({ type: 'bytes32', value: '0xc3a40000c3a4', - expected: 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - - test({ type: 'string', value: 'ää', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000008' + - 'c383c2a4c383c2a4000000000000000000000000000000000000000000000000'}); - test({ type: 'string', value: 'ü', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c3bc000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'string', value: 'Ã', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c383000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'int[]', value: [], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'int[]', value: [3], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int256[]', value: [3], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int[]', value: [1,2,3], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'bytes1[4]', value: ['0xcf', '0x68', '0x4d', '0xfb'], - expected: 'cf00000000000000000000000000000000000000000000000000000000000000' + - '6800000000000000000000000000000000000000000000000000000000000000' + - '4d00000000000000000000000000000000000000000000000000000000000000' + - 'fb00000000000000000000000000000000000000000000000000000000000000'}); - - - - test({ type: 'bytes', value: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', value: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'string', value: 'welcome to ethereum. welcome to ethereum. welcome to ethereum.', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000003e' + - '77656c636f6d6520746f20657468657265756d2e2077656c636f6d6520746f20' + - '657468657265756d2e2077656c636f6d6520746f20657468657265756d2e0000'}); - }); -}); - - -describe('lib/solidity/coder', function () { - describe('encodeParams', function () { - var test = function (t) { - it('should turn ' + t.values + ' to ' + t.expected, function () { - - var result = coder.encodeParams(t.types, t.values); - assert.equal(result, '0x'+ t.expected); - }); - }; - - - test({ types: ['address', 'address'], values: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c3'], - expected: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3'}); - test({ types: ['bool[2]', 'bool[3]'], values: [[true, false], [false, false, true]], - expected: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int'], values: [1], expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int'], values: [16], expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ types: ['int'], values: [-1], expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ types: ['int256'], values: [1], expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int256'], values: [16], expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ types: ['int256'], values: [-1], expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ types: ['int[]'], values: [[3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int256[]'], values: [[3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int256[]'], values: [[1,2,3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int[]', 'int[]'], values: [[1,2], [3,4]], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004'}); - test({ types: ['int[]', 'int[]', 'int[]'], values: [[1,2], [3,4], [5,6,7]], - expected: '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000120' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0000000000000000000000000000000000000000000000000000000000000007'}); - test({ types: ['bytes32'], values: ['0x6761766f66796f726b'], - expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string'], values: ['gavofyork'], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string', 'string'], values: ['gavofyork', 'gavofyork'], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - - - test({ types: ['bytes32', 'int'], values: ['0x6761766f66796f726b', 5], - expected: '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['int', 'bytes32'], values: [5, '0x6761766f66796f726b'], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['int', 'string'], values: [5, 'gavofyork'], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string', 'int'], values: ['gavofyork', 5], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string', 'bool', 'int[]'], values: ['gavofyork', true, [1, 2, 3]], - expected: '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['string', 'int[]'], values: ['gavofyork', [1, 2, 3]], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int', 'string'], values: [5, 'gavofyork'], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['int', 'string', 'int', 'int', 'int', 'int[]'], values: [1, 'gavofyork', 2, 3, 4, [5, 6, 7]], - expected: '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000100' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0000000000000000000000000000000000000000000000000000000000000007'}); - test({ types: ['int', 'bytes', 'int', 'bytes'], values: [ - 5, - '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - 3, - '0x331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - ], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - - test({ types: ['bytes3', 'bytes'], values: ['0xcf0011', '0x4d00000000000000000000000000000000000000000000000000000000000012'], - expected: 'cf00110000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '4d00000000000000000000000000000000000000000000000000000000000012'}); - - }); -}); - - diff --git a/test/abi.encodeParameter.js b/test/abi.encodeParameter.js deleted file mode 100644 index a27f3018ec0..00000000000 --- a/test/abi.encodeParameter.js +++ /dev/null @@ -1,764 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var BN = require('bn.js'); -var BigNumber = require('bignumber.js'); -var coder = require('../packages/web3-eth-abi'); - - -describe('lib/solidity/coder', function () { - describe('encodeParameter', function () { - var test = function (t) { - it('should turn ' + t.value + ' to ' + t.expected + ' for '+ t.type, function () { - assert.equal(coder.encodeParameter(t.type, t.value).replace('0x',''), t.expected); - }); - }; - - - test({ type: 'address', value: '0x407d73d8a49eeb85d32cf465507dd71d507100c1', - expected: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'}); - test({ type: 'address[2]', value: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c3'], - expected: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[]', value: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c3'], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - test({ type: 'address[][2]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c2'], - ['0x407d73d8a49eeb85d32cf465507dd71d507100c3', '0x407d73d8a49eeb85d32cf465507dd71d507100c4']], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'address[2][]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c2'], - ['0x407d73d8a49eeb85d32cf465507dd71d507100c3', '0x407d73d8a49eeb85d32cf465507dd71d507100c4']], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - //test({ type: 'address[][]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100c5'], - //['0x407d73d8a49eeb85d32cf465507dd71d507100c3']], - //expected: '0000000000000000000000000000000000000000000000000000000000000020' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'0000000000000000000000000000000000000000000000000000000000000080' + - //'00000000000000000000000000000000000000000000000000000000000000c0' + - //'0000000000000000000000000000000000000000000000000000000000000001' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c5' + - //'0000000000000000000000000000000000000000000000000000000000000001' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' }); - //test({ type: 'address[][]', value: [['0x407d73d8a49eeb85d32cf465507dd71d507100cf', '0x407d73d8a49eeb85d32cf465507dd71d507100c2'], - //['0x407d73d8a49eeb85d32cf465507dd71d507100c3', '0x407d73d8a49eeb85d32cf465507dd71d507100c4']], - //expected: '0000000000000000000000000000000000000000000000000000000000000020' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'0000000000000000000000000000000000000000000000000000000000000080' + - //'00000000000000000000000000000000000000000000000000000000000000e0' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100cf' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c2' + - //'0000000000000000000000000000000000000000000000000000000000000002' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3' + - //'000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c4' }); - test({ type: 'bool', value: true, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'bool', value: false, expected: '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[1][2]', value: [[false], [false]], - expected: '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[2]', value: [true, false], - expected: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'bool[]', value: [true, true, false], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - - test({ type: 'int', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int', value: -1, expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - // test({ type: 'int', value: 0.1, expected: '0000000000000000000000000000000000000000000000000000000000000000'}); - // test({ type: 'int', value: 3.9, expected: '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int256', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'int256', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'int256', value: -1, expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - - test({ type: 'uint', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - // test({ type: 'uint', value: 0.1, expected: '0000000000000000000000000000000000000000000000000000000000000000'}); - // test({ type: 'uint', value: 3.9, expected: '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'uint256', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ type: 'uint256', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ type: 'uint256', value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', - expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ type: 'bytes32', value: '0x6761766f66796f726b', - expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'bytes32', value: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes32', value: '0x02838654a83c213dae3698391eabbd54a5b6e1fb3452bc7fa4ea0dd5c8ce7e29', - expected: '02838654a83c213dae3698391eabbd54a5b6e1fb3452bc7fa4ea0dd5c8ce7e29'}); - test({ type: 'bytes', value: '0x6761766f66796f726b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ type: 'bytes', value: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000009f' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff100'}); - test({ type: 'string', value: 'gavofyork', expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - - test({ type: 'string', value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', - expected: '00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000026486565c3a4c3b6c3b6c3a4f09f9185443334c99dc9a33234d084cdbd2d2e2cc3a4c3bc2b232f0000000000000000000000000000000000000000000000000000'}); - - test({ type: 'bytes', value: '0xc3a40000c3a4', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000006' + - 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - test({ type: 'bytes32', value: '0xc3a40000c3a4', - expected: 'c3a40000c3a40000000000000000000000000000000000000000000000000000'}); - test({ type: 'string', value: 'ää', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000008' + - 'c383c2a4c383c2a4000000000000000000000000000000000000000000000000'}); - test({ type: 'string', value: 'ü', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c3bc000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'string', value: 'Ã', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - 'c383000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'int[]', value: [], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000000'}); - test({ type: 'int[]', value: [3], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int256[]', value: [3], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'int[]', value: [1,2,3], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ type: 'bytes1[4]', value: ['0xcf', '0x68', '0x4d', '0xfb'], - expected: 'cf00000000000000000000000000000000000000000000000000000000000000' + - '6800000000000000000000000000000000000000000000000000000000000000' + - '4d00000000000000000000000000000000000000000000000000000000000000' + - 'fb00000000000000000000000000000000000000000000000000000000000000'}); - - - - test({ type: 'bytes', value: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'bytes', value: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ type: 'string', value: 'welcome to ethereum. welcome to ethereum. welcome to ethereum.', - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '000000000000000000000000000000000000000000000000000000000000003e' + - '77656c636f6d6520746f20657468657265756d2e2077656c636f6d6520746f20' + - '657468657265756d2e2077656c636f6d6520746f20657468657265756d2e0000'}); - test({ - type: 'tuple(string,string)', - value: ["welcome to ethereum.", "welcome to ethereum."], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000014' + - '77656c636f6d6520746f20657468657265756d2e000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000014' + - '77656c636f6d6520746f20657468657265756d2e000000000000000000000000' }) - test({ - type: 'tuple(bytes,bytes)', - value: ["0x77656c636f6d6520746f20657468657265756d2e", "0x77656c636f6d6520746f20657468657265756d2e"], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000014' + - '77656c636f6d6520746f20657468657265756d2e000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000014' + - '77656c636f6d6520746f20657468657265756d2e000000000000000000000000' }) - test({ - type: 'tuple(bytes,bool,uint256)', - value: ["0x77656c636f6d6520746f20657468657265756d2e", true, 124515], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '000000000000000000000000000000000000000000000000000000000001e663' + - '0000000000000000000000000000000000000000000000000000000000000014' + - '77656c636f6d6520746f20657468657265756d2e000000000000000000000000' }) - test({ - type: 'tuple(string,tuple(bool,int256),address)', - value: ["hello", [true,-151], "0x0175010374017501037401750103740175010374"], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69' + - '0000000000000000000000000175010374017501037401750103740175010374' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '68656c6c6f000000000000000000000000000000000000000000000000000000' }) - test({ - type: 'tuple(tuple(bool,bool),tuple(address,address),tuple(string,string))', - value: [[true, false],["0x81017589ab81017589ab81017589ab81017589ab", "0x81017589ab81017589ab81017589ab81017589ab"],["string One", "string Two"]], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '00000000000000000000000081017589ab81017589ab81017589ab81017589ab' + - '00000000000000000000000081017589ab81017589ab81017589ab81017589ab' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '000000000000000000000000000000000000000000000000000000000000000a' + - '737472696e67204f6e6500000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000a' + - '737472696e672054776f00000000000000000000000000000000000000000000'}) - test({ - type: 'tuple(tuple(tuple(bool,bool),tuple(bytes,bytes),tuple(address,bool)),address)', - value: [[[false, false],["0xab1394581edfa2ef9ca71", "0x15abe391df19aef19a4561"],["0xec2270c849236333c86834728e783cd2f789088e", true]], "0x81017589ab81017589ab81017589ab81017589ab"], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000081017589ab81017589ab81017589ab81017589ab' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '000000000000000000000000ec2270c849236333c86834728e783cd2f789088e' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '0ab1394581edfa2ef9ca71000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '15abe391df19aef19a4561000000000000000000000000000000000000000000' }) - test({ - type: 'tuple(bool,string,bool,tuple(address,address))', - value: [true, "testing", false, ["0x1981710abe1981710abe1981710abe1981710abe", "0x1981710abe1981710abe1981710abe1981710abe"]], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000001981710abe1981710abe1981710abe1981710abe' + - '0000000000000000000000001981710abe1981710abe1981710abe1981710abe' + - '0000000000000000000000000000000000000000000000000000000000000007' + - '74657374696e6700000000000000000000000000000000000000000000000000' }) - test({ - type: 'tuple(address,address,tuple(string,tuple(int256,int256),string))', - value: ["0x1981710abe1981710abe1981710abe1981710abe", "0x1981710abe1981710abe1981710abe1981710abe", ["structs are great", [-1951, 194018], "so many possibilities"]], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000001981710abe1981710abe1981710abe1981710abe' + - '0000000000000000000000001981710abe1981710abe1981710abe1981710abe' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000080' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861' + - '000000000000000000000000000000000000000000000000000000000002f5e2' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000011' + - '7374727563747320617265206772656174000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000015' + - '736f206d616e7920706f73736962696c69746965730000000000000000000000' }) - test({ - type: 'tuple(bool,tuple(bytes32,int256,tuple(bytes24,bytes8)),tuple(bool,bool,bool),string)', - value: [true, ["0xabdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18", -18291849, ["0xabdef18710a18a18abdef18710a18a18abdef18710a18a18","0xabdef18710a18a18"]], [false, true, false], "testing testing"], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'abdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffee8e377' + - 'abdef18710a18a18abdef18710a18a18abdef18710a18a180000000000000000' + - 'abdef18710a18a18000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000120' + - '000000000000000000000000000000000000000000000000000000000000000f' + - '74657374696e672074657374696e670000000000000000000000000000000000' }); - test({ - type: 'tuple(bool,tuple(bytes32,int256,tuple(bytes24,bytes8)),tuple(bool,bool,bool),string)', - value: [true, ["0xabdef", -18291849, ["0xabdef18710a18a18abdef18710a18a18abdef18710a18a18","0xabdef18710a18a18"]], [false, true, false], "testing testing"], - expected: - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'abdef00000000000000000000000000000000000000000000000000000000000' + - 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffee8e377' + - 'abdef18710a18a18abdef18710a18a18abdef18710a18a180000000000000000' + - 'abdef18710a18a18000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000120' + - '000000000000000000000000000000000000000000000000000000000000000f' + - '74657374696e672074657374696e670000000000000000000000000000000000' }); - test({ - type: 'uint256', - value: new BN(42), - expected: '000000000000000000000000000000000000000000000000000000000000002a' - }); - test({ - type: 'uint256', - value: new BigNumber(42), - expected: '000000000000000000000000000000000000000000000000000000000000002a' - }); - test({ - type: 'uint256[]', - value: ['42'], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '000000000000000000000000000000000000000000000000000000000000002a' - }); - test({ - type: 'uint256[]', - value: [new BN(42)], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '000000000000000000000000000000000000000000000000000000000000002a' - }); - test({ - type: 'uint256[]', - value: [new BigNumber(42)], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '000000000000000000000000000000000000000000000000000000000000002a' - }); - test({ - type: 'uint256[]', - value: [new BN(42), new BN(42)], - expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '000000000000000000000000000000000000000000000000000000000000002a' + - '000000000000000000000000000000000000000000000000000000000000002a' - }); - }); -}); - - -describe('lib/solidity/coder', function () { - describe('encodeParameters', function () { - var test = function (t) { - it('should turn ' + t.values + ' to ' + t.expected, function () { - assert.equal(coder.encodeParameters(t.types, t.values).replace('0x',''), t.expected); - }); - }; - - - test({ types: ['address', 'address'], values: ['0x407d73d8a49eeb85d32cf465507dd71d507100c1', '0x407d73d8a49eeb85d32cf465507dd71d507100c3'], - expected: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1' + - '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c3'}); - test({ types: ['bool[2]', 'bool[3]'], values: [[true, false], [false, false, true]], - expected: '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int'], values: [1], expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int'], values: [16], expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ types: ['int'], values: [-1], expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ types: ['int256'], values: [1], expected: '0000000000000000000000000000000000000000000000000000000000000001'}); - test({ types: ['int256'], values: [16], expected: '0000000000000000000000000000000000000000000000000000000000000010'}); - test({ types: ['int256'], values: [-1], expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}); - test({ types: ['int[]'], values: [[3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int256[]'], values: [[3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int256[]'], values: [[1,2,3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int[]', 'int[]'], values: [[1,2], [3,4]], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004'}); - test({ types: ['int[]', 'int[]', 'int[]'], values: [[1,2], [3,4], [5,6,7]], - expected: '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000120' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0000000000000000000000000000000000000000000000000000000000000007'}); - test({ types: ['bytes32'], values: ['0x6761766f66796f726b'], - expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string'], values: ['gavofyork'], expected: '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string', 'string'], values: ['gavofyork', 'gavofyork'], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - - - test({ types: ['bytes32', 'int'], values: ['0x6761766f66796f726b', 5], - expected: '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000005'}); - test({ types: ['int', 'bytes32'], values: [5, '0x6761766f66796f726b'], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['int', 'string'], values: [5, 'gavofyork'], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string', 'int'], values: ['gavofyork', 5], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['string', 'bool', 'int[]'], values: ['gavofyork', true, [1, 2, 3]], - expected: '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['string', 'int[]'], values: ['gavofyork', [1, 2, 3]], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003'}); - test({ types: ['int', 'string'], values: [5, 'gavofyork'], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000'}); - test({ types: ['int', 'string', 'int', 'int', 'int', 'int[]'], values: [1, 'gavofyork', 2, 3, 4, [5, 6, 7]], - expected: '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000100' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '6761766f66796f726b0000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0000000000000000000000000000000000000000000000000000000000000007'}); - test({ types: ['int', 'bytes', 'int', 'bytes'], values: [ - 5, - '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - 3, - '0x331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b', - ], - expected: '0000000000000000000000000000000000000000000000000000000000000005' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000003' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' + - '431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'}); - test({ types: ['bytes3', 'bytes'], values: ['0xcf0011', '0x4d00000000000000000000000000000000000000000000000000000000000012'], - expected: 'cf00110000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '4d00000000000000000000000000000000000000000000000000000000000012'}); - test({ - types: ['string', 'tuple(string,string)'], - values: ["what", ["what what", "what what"]], - expected: '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '7768617400000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '7768617420776861740000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000009' + - '7768617420776861740000000000000000000000000000000000000000000000'}) - test({ - types: ['tuple(bytes32,bool)', 'tuple(bool,address)'], - values: [["0xabdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18", true], [true, "0x77656c636f6d6520746f20657468657265756d2e"]], - expected: 'abdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e'}) - test({ - types: ['tuple(bytes32,bool)', 'tuple(bool,address)'], - values: [["0xabdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18", true], [true, "0x77656c636f6d6520746f20657468657265756d2e"]], - expected: 'abdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e'}) - test({ - types: ['tuple(address,uint256)', 'tuple(uint256,bool)', 'tuple(bytes32,bytes32)'], - values: [["0x77656c636f6d6520746f20657468657265756d2e", "148"],["5910", true],["0xabdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18", "0xabdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18"]], - expected: '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000094' + - '0000000000000000000000000000000000000000000000000000000000001716' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'abdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18' + - 'abdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18' }) - - test({ - types: ['tuple(tuple(address,address),tuple(bool,bool))', 'tuple(tuple(bool,bool),tuple(bytes,bytes),tuple(uint256,uint256))', 'address'], - values: [[["0x77656c636f6d6520746f20657468657265756d2e", "0x77656c636f6d6520746f20657468657265756d2e"], [true, false]], [[false, true],["0xab1394581edfa2ef9ca71","0x15abe391df19aef19a4561"],["182", "1937"]], "0x77656c636f6d6520746f20657468657265756d2e"], - expected: '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '00000000000000000000000000000000000000000000000000000000000000b6' + - '0000000000000000000000000000000000000000000000000000000000000791' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '0ab1394581edfa2ef9ca71000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '15abe391df19aef19a4561000000000000000000000000000000000000000000' }) - - test({ - types: ['tuple(tuple(uint256,bool),tuple(uint256,tuple(bytes,bytes)))', 'bytes', 'tuple(bool,tuple(bytes,address),bytes)'], - values: [[["18320", true],["691", ["0xab1394581edfa2ef9ca71", "0x15abe391df19aef19a4561"]]], "0xab1394581edfa2ef9ca71", [false, ["0xfe", "0x77656c636f6d6520746f20657468657265756d2e"], "0xabdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18"]], - expected: '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000001c0' + - '0000000000000000000000000000000000000000000000000000000000000200' + - '0000000000000000000000000000000000000000000000000000000000004790' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000002b3' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '0ab1394581edfa2ef9ca71000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '15abe391df19aef19a4561000000000000000000000000000000000000000000' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '0ab1394581edfa2ef9ca71000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'fe00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000020' + - 'abdef18710a18a18abdef18710a18a18abdef18710a18a18abdef18710a18a18' }) - - test({ - types: ['address', 'tuple(bool,tuple(address,address))', 'tuple(tuple(address,tuple(int256,int256)),bool)'], - values: ["0x77656c636f6d6520746f20657468657265756d2e", [true,["0x77656c636f6d6520746f20657468657265756d2e", "0x77656c636f6d6520746f20657468657265756d2e"]], [["0x77656c636f6d6520746f20657468657265756d2e", ["-12451", "-12451018"]], false]], - expected: '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf5d' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff420336' + - '0000000000000000000000000000000000000000000000000000000000000000' }) - - test({ - types: ['bytes', 'tuple(tuple(bool,bool,bool),tuple(bytes,bytes,bytes),tuple(bytes,bool,address),tuple(uint256,int256,address))', 'tuple(bytes,tuple(tuple(int256,bool),tuple(uint256,bytes)))'], - values: ["0xabef15", [[true, false, true], ["0xabef15", "0xcdef151", "0xabfe151"],["0x15abe391df19aef19a4561", true, "0x77656c636f6d6520746f20657468657265756d2e"],["1840181", "-819184919", "0x77656c636f6d6520746f20657468657265756d2e"]], ["0x77656c636f6d6520746f20657468657265756d2e", [["-18491",false],["1918491", "0xabdcf151dae"]]]], - expected: '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '0000000000000000000000000000000000000000000000000000000000000360' + - '0000000000000000000000000000000000000000000000000000000000000003' + - 'abef150000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000100' + - '0000000000000000000000000000000000000000000000000000000000000220' + - '00000000000000000000000000000000000000000000000000000000001c1435' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf2c3ae9' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000003' + - 'abef150000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0cdef15100000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000004' + - '0abfe15100000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '000000000000000000000000000000000000000000000000000000000000000b' + - '15abe391df19aef19a4561000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000014' + - '77656c636f6d6520746f20657468657265756d2e000000000000000000000000' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7c5' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000001d461b' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000006' + - '0abdcf151dae0000000000000000000000000000000000000000000000000000' }) - - test({ - types: ['tuple(bytes,tuple(address,address))', 'tuple(address,address,address,bytes,address)', 'tuple(address,tuple(address,tuple(address,bool)))'], - values: [["0xabef15",["0x77656c636f6d6520746f20657468657265756d2e", "0x77656c636f6d6520746f20657468657265756d2e"]],["0x77656c636f6d6520746f20657468657265756d2e", "0x77656c636f6d6520746f20657468657265756d2e", "0x77656c636f6d6520746f20657468657265756d2e", "0xabef15", "0x77656c636f6d6520746f20657468657265756d2e"],["0x81017589ab81017589ab81017589ab81017589ab",["0x77656c636f6d6520746f20657468657265756d2e",["0x81017589ab81017589ab81017589ab81017589ab", false]]]], - expected: '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000160' + - '00000000000000000000000081017589ab81017589ab81017589ab81017589ab' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000081017589ab81017589ab81017589ab81017589ab' + - '0000000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000003' + - 'abef150000000000000000000000000000000000000000000000000000000000' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '00000000000000000000000077656c636f6d6520746f20657468657265756d2e' + - '0000000000000000000000000000000000000000000000000000000000000003' + - 'abef150000000000000000000000000000000000000000000000000000000000' }) - - test({ - types: ['tuple(bytes,bytes)', 'bytes', 'tuple(tuple(bytes),tuple(bytes,bytes),tuple(bytes,bytes,bytes))'], - values: [["0xabef15", "0xa"], "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", [["0xaf"],["0xaf", "0xbc"],["0xaf", "0xbc", "0xde"]]], - expected: '0000000000000000000000000000000000000000000000000000000000000060' + - '0000000000000000000000000000000000000000000000000000000000000120' + - '0000000000000000000000000000000000000000000000000000000000000160' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000003' + - 'abef150000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0a00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000020' + - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000c0' + - '0000000000000000000000000000000000000000000000000000000000000180' + - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'af00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000040' + - '0000000000000000000000000000000000000000000000000000000000000080' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'af00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'bc00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000060' + - '00000000000000000000000000000000000000000000000000000000000000a0' + - '00000000000000000000000000000000000000000000000000000000000000e0' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'af00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'bc00000000000000000000000000000000000000000000000000000000000000' + - '0000000000000000000000000000000000000000000000000000000000000001' + - 'de00000000000000000000000000000000000000000000000000000000000000' }) - test({ - types: ['uint256', 'uint256'], - values: [new BN(42), new BN(42)], - expected: '000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a' - }); - test({ - types: ['uint256', 'uint256'], - values: [new BigNumber(42), new BigNumber(42)], - expected: '000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a' - }); - test({ - types: ['bytes', 'bytes32'], - values: [Buffer.from('cool'), Buffer.from('beans')], - expected: '00000000000000000000000000000000000000000000000000000000000000406265616e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004636f6f6c00000000000000000000000000000000000000000000000000000000' - }); - test({ - types: ['bytes6', 'bytes12'], - values: [Buffer.from('super'), Buffer.from('man')], - expected: '73757065720000000000000000000000000000000000000000000000000000006d616e0000000000000000000000000000000000000000000000000000000000' - }); - test({ - types: ['bytes12[]'], - values: [[Buffer.from('buff'), Buffer.from('man')]], - expected: '0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000262756666000000000000000000000000000000000000000000000000000000006d616e0000000000000000000000000000000000000000000000000000000000' - }); - test({ - types: ['uint16', 'uint24'], - values: ['10000', '100000'], - expected: '000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000186a0' - }); - test({ - types: ['tuple(string,uint)'], - values: [['item1', 2]], - expected: '00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000056974656d31000000000000000000000000000000000000000000000000000000' - }); - test({ - types: ['tuple(string,uint)[]'], - values: [[['item1', 2], ['item2', 3]]], - expected: '00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000056974656d310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000056974656d32000000000000000000000000000000000000000000000000000000' - }); - test({ - types: ['tuple(string,uint16)[]'], - values: [[['item1', 2], ['item2', 3]]], - expected: '00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000056974656d310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000056974656d32000000000000000000000000000000000000000000000000000000' - }); - }); -}); - - diff --git a/test/async.js b/test/async.js deleted file mode 100644 index 910ed2d5d96..00000000000 --- a/test/async.js +++ /dev/null @@ -1,132 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Web3 = require('../packages/web3'); -var FakeHttpProvider = require('./helpers/FakeIpcProvider'); - -var web3 = new Web3(); - -// use sendTransaction as dummy -var method = 'call'; - -var tests = [{ - input: { - 'from': 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', - 'to': 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS' - }, - formattedInput: [{ - 'from': '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - 'to': '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8' - }, 'latest'], - result: '0xb', - formattedResult: '0xb', - call: 'eth_'+ method -}]; - -describe('async', function () { - tests.forEach(function (test, index) { - it('test callback: ' + index, function (done) { - - // given - var provider = new FakeHttpProvider(); - web3.setProvider(provider); - provider.injectResult(test.result); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedInput); - }); - - // when - web3.eth[method](test.input, function(error, result){ - - // then - assert.isNull(error); - assert.strictEqual(test.formattedResult, result); - - done(); - }); - - }); - - it('test promise: ' + index, function (done) { - - // given - var provider = new FakeHttpProvider(); - web3.setProvider(provider); - provider.injectResult(test.result); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedInput); - }); - - // when - web3.eth[method](test.input) - .then(function(result){ - - // then - assert.strictEqual(test.formattedResult, result); - - done(); - }); - - }); - - it('error test callback: ' + index, function (done) { - - // given - var provider = new FakeHttpProvider(); - web3.setProvider(provider); - provider.injectError({ - message: test.result, - code: -32603 - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedInput); - }); - - // when - web3.eth[method](test.input, function(error, result){ - - // then - assert.isUndefined(result); - assert.strictEqual(test.formattedResult, error.message); - - done(); - }).catch(function () { - - }); - - }); - - it('error test promise: ' + index, function (done) { - - // given - var provider = new FakeHttpProvider(); - web3.setProvider(provider); - provider.injectError({ - message: test.result, - code: -32603 - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedInput); - }); - - // when - web3.eth[method](test.input) - .catch(function(error){ - - // then - assert.strictEqual(test.formattedResult, error.message); - - done(); - }); - - }); - }); -}); - diff --git a/test/batch.js b/test/batch.js deleted file mode 100644 index 02e1798ce46..00000000000 --- a/test/batch.js +++ /dev/null @@ -1,323 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Web3 = require('../packages/web3'); -var FakeIpcProvider = require('./helpers/FakeIpcProvider'); - - - -describe('lib/web3/batch', function () { - describe('execute', function () { - it('should execute batch request', function (done) { - - var provider = new FakeIpcProvider(); - var web3 = new Web3(provider); - - var result = '0x126'; - var resultVal = '294'; - var result2 = '0x127'; - var result2Val = '295'; - provider.injectBatchResults([result, result2]); - - var counter = 0; - var callback = function (err, r) { - counter++; - assert.deepEqual(r, resultVal); - }; - - var callback2 = function (err, r) { - assert.equal(counter, 1); - assert.deepEqual(r, result2Val); - done(); - }; - - provider.injectValidation(function (payload) { - var first = payload[0]; - var second = payload[1]; - - assert.equal(first.method, 'eth_getBalance'); - assert.deepEqual(first.params, ['0x0000000000000000000000000000000000000000', 'latest']); - assert.equal(second.method, 'eth_getBalance'); - assert.deepEqual(second.params, ['0x0000000000000000000000000000000000000005', 'latest']); - }); - - var batch = new web3.BatchRequest(); - batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback)); - batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000005', 'latest', callback2)); - batch.execute(); - }); - - it('should execute batch request for async properties', function (done) { - - var provider = new FakeIpcProvider(); - var web3 = new Web3(provider); - - var result = []; - var result2 = '0xb'; - provider.injectBatchResults([result, result2]); - - var counter = 0; - var callback = function (err, r) { - counter++; - assert.isArray(result, r); - }; - - var callback2 = function (err, r) { - assert.equal(counter, 1); - assert.equal(r, 11); - done(); - }; - - provider.injectValidation(function (payload) { - var first = payload[0]; - var second = payload[1]; - - assert.equal(first.method, 'eth_accounts'); - assert.deepEqual(first.params, []); - assert.equal(second.method, 'shh_post'); - assert.deepEqual(second.params, [{}]); - }); - - var batch = new web3.BatchRequest(); - batch.add(web3.eth.getAccounts.request(callback)); - batch.add(web3.shh.post.request({}, callback2)); - batch.execute(); - }); - - it('should execute batch request with contract', function (done) { - - var provider = new FakeIpcProvider(); - var web3 = new Web3(provider); - - var abi = [{ - "name": "balance", - "type": "function", - "inputs": [{ - "name": "who", - "type": "address" - }], - "constant": true, - "outputs": [{ - "name": "value", - "type": "uint256" - }] - }]; - - - var address = '0x1000000000000000000000000000000000000001'; - var result = '0x126'; - var resultVal = '294'; - var result2 = '0x0000000000000000000000000000000000000000000000000000000000000123'; - var result2Val = '291'; - - var counter = 0; - var callback = function (err, r) { - counter++; - assert.deepEqual(r, resultVal); - }; - - var callback2 = function (err, r) { - assert.equal(counter, 1); - assert.deepEqual(r, result2Val); - }; - - var callback3 = function (err, r) { - counter++; - assert.equal(counter, 2); - assert.deepEqual(r, result2Val); - done(); - }; - - provider.injectValidation(function (payload) { - - - assert.equal(payload[0].method, 'eth_getBalance'); - assert.deepEqual(payload[0].params, ['0x0000000000000000000000000000000000000022', 'latest']); - - assert.equal(payload[1].method, 'eth_call'); - assert.deepEqual(payload[1].params, [{ - 'to': '0x1000000000000000000000000000000000000001', - 'data': '0xe3d670d70000000000000000000000001000000000000000000000000000000000000001' - }, - 'latest' // default block - ]); - - assert.equal(payload[2].method, 'eth_call'); - assert.deepEqual(payload[2].params, [{ - 'to': '0x1000000000000000000000000000000000000001', - 'from': '0x1000000000000000000000000000000000000002', - 'data': '0xe3d670d70000000000000000000000001000000000000000000000000000000000000001' - }, - 'latest' // default block - ]); - - assert.equal(payload[3].method, 'eth_call'); - assert.deepEqual(payload[3].params, [{ - 'to': '0x1000000000000000000000000000000000000001', - 'from': '0x1000000000000000000000000000000000000003', - 'data': '0xe3d670d70000000000000000000000001000000000000000000000000000000000000001' - }, - '0xa' // default block - ]); - - assert.equal(payload[4].method, 'eth_call'); - assert.deepEqual(payload[4].params, [{ - 'to': '0x1000000000000000000000000000000000000001', - 'data': '0xe3d670d70000000000000000000000001000000000000000000000000000000000000001' - }, - '0xa' // default block - ]); - }); - - - var batch = new web3.BatchRequest(); - batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000022', 'latest', callback)); - batch.add(new web3.eth.Contract(abi, address).methods.balance(address).call.request(callback2)); - batch.add(new web3.eth.Contract(abi, address).methods.balance(address).call.request({from: '0x1000000000000000000000000000000000000002'}, callback2)); - batch.add(new web3.eth.Contract(abi, address).methods.balance(address).call.request({from: '0x1000000000000000000000000000000000000003'}, 10, callback2)); - batch.add(new web3.eth.Contract(abi, address).methods.balance(address).call.request(10, callback3)); - provider.injectBatchResults([result, result2, result2, result2, result2]); - batch.execute(); - }); - - it('should execute batch requests and receive errors', function (done) { - - var provider = new FakeIpcProvider(); - var web3 = new Web3(provider); - - var abi = [{ - "name": "balance", - "type": "function", - "inputs": [{ - "name": "who", - "type": "address" - }], - "constant": true, - "outputs": [{ - "name": "value", - "type": "uint256" - }] - }]; - - - var address = '0x1000000000000000000000000000000000000001'; - var result = 'Something went wrong'; - var result2 = 'Something went wrong 2'; - - - var counter = 0; - var callback = function (err, r) { - counter++; - assert.isNotNull(err); - }; - - var callback2 = function (err, r) { - assert.equal(counter, 1); - assert.isNotNull(err); - done(); - }; - - provider.injectValidation(function (payload) { - var first = payload[0]; - var second = payload[1]; - - assert.equal(first.method, 'eth_getBalance'); - assert.deepEqual(first.params, ['0x0000000000000000000000000000000000000000', 'latest']); - assert.equal(second.method, 'eth_call'); - assert.deepEqual(second.params, [{ - 'to': '0x1000000000000000000000000000000000000001', - 'from': '0x0000000000000000000000000000000000000000', - 'data': '0xe3d670d70000000000000000000000001000000000000000000000000000000000000001' - }, - '0xa']); - }); - - var batch = new web3.BatchRequest(); - batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback)); - batch.add(new web3.eth.Contract(abi, address).methods.balance(address).call.request({from: '0x0000000000000000000000000000000000000000'}, 10, callback2)); - provider.injectBatchResults([result, result2], true); // injects error - batch.execute(); - }); - - it('should propagate output formatter error to callback', function(done) { - const provider = new FakeIpcProvider(); - const web3 = new Web3(provider); - - const abi = [{ - name: 'symbol', - type: 'function', - inputs: [], - constant: true, - outputs: [{ - name: 'symbol', - type: 'string' - }] - }]; - - const address = '0x1000000000000000000000000000000000000001'; - const result = '0x0000000000000000000000000000000000000000000000000000000000000123'; - - const callback = (err, _r) => { - assert.isNotNull(err); - done(); - }; - - provider.injectValidation((payload) => { - assert.equal(payload[0].method, 'eth_call'); - assert.deepEqual(payload[0].params, [{ - to: '0x1000000000000000000000000000000000000001', - data: '0x95d89b41' - }, - 'latest']); - }); - - const batch = new web3.BatchRequest(); - batch.add(new web3.eth.Contract(abi, address) - .methods.symbol() - .call.request(callback)); - provider.injectBatchResults([result]); // no explicit error, it'll be thrown when formatting - batch.execute(); - }); - - it('should execute batch request with provider that supports sendAsync', function (done) { - - var provider = new FakeIpcProvider(); - var web3 = new Web3(provider); - - provider.sendAsync = provider.send - provider.send = () => { throw new Error('send was called instead of sendAsync') } - var result = '0x126'; - var resultVal = '294'; - var result2 = '0x127'; - var result2Val = '295'; - provider.injectBatchResults([result, result2]); - - var counter = 0; - var callback = function (err, r) { - counter++; - assert.deepEqual(r, resultVal); - }; - - var callback2 = function (err, r) { - assert.equal(counter, 1); - assert.deepEqual(r, result2Val); - done(); - }; - - provider.injectValidation(function (payload) { - var first = payload[0]; - var second = payload[1]; - - assert.equal(first.method, 'eth_getBalance'); - assert.deepEqual(first.params, ['0x0000000000000000000000000000000000000000', 'latest']); - assert.equal(second.method, 'eth_getBalance'); - assert.deepEqual(second.params, ['0x0000000000000000000000000000000000000005', 'latest']); - }); - - var batch = new web3.BatchRequest(); - batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback)); - batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000005', 'latest', callback2)); - batch.execute(); - }); - - }); -}); diff --git a/test/config/ensAddresses.json b/test/config/ensAddresses.json deleted file mode 100644 index 8bc57225223..00000000000 --- a/test/config/ensAddresses.json +++ /dev/null @@ -1 +0,0 @@ -{"registry":"0xDC9fdC7554013F17eBDEAFD00F5027373a42D006","resolver":"0xCBbB6622a8A1c97fdA8e314b3812E53b33443799","fifsRegistrar":"0x78331aC1b53ea39A5b442A5c8656b556abCA7FeB","reverseRegistrar":"0x003A653191147bF09880aA162b30956AF3714AC1"} \ No newline at end of file diff --git a/test/contract.encodeABI.js b/test/contract.encodeABI.js deleted file mode 100644 index 00b1b8a1e02..00000000000 --- a/test/contract.encodeABI.js +++ /dev/null @@ -1,108 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); -var sha3 = require('../packages/web3-utils').sha3; -var FakeIpcProvider = require('./helpers/FakeIpcProvider'); -var FakeHttpProvider = require('./helpers/FakeHttpProvider'); - -var abi = [ - { - constant: true, - inputs: [ - { - name: "a", - type: "bytes32" - }, - { - name: "b", - type: "bytes32" - } - ], - name: "takesTwoBytes32", - outputs: [ - { - name: "", - type: "bytes32" - } - ], - payable: false, - type: "function", - stateMutability: "view", - gas: 175875 - } -]; - -describe('contract', function () { - describe('method.encodeABI', function () { - it('should handle bytes32 arrays that only contain 1 byte', function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - - var contract = new eth.Contract(abi); - - var result = contract.methods.takesTwoBytes32('0x'.concat('a'.repeat(2)), '0x'.concat('b'.repeat(2))).encodeABI(); - - assert.equal(result, [ - '0x1323517e', - 'aa00000000000000000000000000000000000000000000000000000000000000', - 'bb00000000000000000000000000000000000000000000000000000000000000' - ].join('')); - }); - - it('should handle bytes32 arrays that are short 1 byte', function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - - var contract = new eth.Contract(abi); - - var result = contract.methods.takesTwoBytes32('0x'.concat('a'.repeat(62)), '0x'.concat('b'.repeat(62))).encodeABI(); - - assert.equal(result, [ - '0x1323517e', - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa00', - 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00' - ].join('')); - }); - - // it('should throw an exception on bytes32 arrays that have an invalid length', function () { - // var provider = new FakeIpcProvider(); - // var eth = new Eth(provider); - // - // var contract = new eth.Contract(abi); - // - // var test = function () { - // return contract.methods.takesTwoBytes32('0x'.concat('a'.repeat(63)), '0x'.concat('b'.repeat(63))).encodeABI(); - // }; - // - // assert.throws(test, 'Given parameter bytes has an invalid length: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"'); - // }); - - it('should handle bytes32 arrays that are full', function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - - var contract = new eth.Contract(abi); - - var result = contract.methods.takesTwoBytes32('0x'.concat('a'.repeat(64)), '0x'.concat('b'.repeat(64))).encodeABI(); - - assert.equal(result, [ - '0x1323517e', - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' - ].join('')); - }); - - // it('should throw an exception on bytes32 arrays that are too long', function () { - // var provider = new FakeIpcProvider(); - // var eth = new Eth(provider); - // - // var contract = new eth.Contract(abi); - // - // var test = function() { - // contract.methods.takesTwoBytes32('0x'.concat('a'.repeat(66)), '0x'.concat('b'.repeat(66))).encodeABI(); - // }; - // - // assert.throws(test, 'Given parameter bytes is too long: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"'); - // }); - }); -}); diff --git a/test/contract.errors.js b/test/contract.errors.js deleted file mode 100644 index eeb57586588..00000000000 --- a/test/contract.errors.js +++ /dev/null @@ -1,179 +0,0 @@ -const assert = require('assert'); -const Eth = require('../packages/web3-eth'); -const FakeIpcProvider = require('./helpers/FakeIpcProvider'); - -const abi = [{ - name: "simpleMethod", - payable: false, - constant: true, - type: "function", - stateMutability: "view", - inputs: [{ name: "a", type: "bytes32" }], - outputs: [{ name: "b", type: "bytes32" }], -}]; - -describe('contract: errors', function () { - let provider; - let eth; - const contractAddress = '0xEE221E529cF6DB20179E7bAeb4442e9CbdCa83d7'; - - before(function () { - provider = new FakeIpcProvider(); - eth = new Eth(provider); - }) - - it('errors when no ABI is provided', function () { - const expected = 'You must provide the json interface of the ' + - 'contract when instantiating a contract object.'; - - try { - new eth.Contract(); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }) - - it('errors when provided ABI is not array', function () { - const expected = 'You must provide the json interface of the ' + - 'contract when instantiating a contract object.'; - - try { - new eth.Contract({}); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }) - - it('errors when event listener is not provided with callback', function () { - const expected = 'Once requires a callback as the second parameter'; - const contract = new eth.Contract(abi); - - try { - contract.once('data'); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }) - - it('errors when a non-existant event is listened for', function () { - const expected = 'Event "void" doesn\'t exist in this contract'; - const contract = new eth.Contract(abi); - - try { - contract.once('void', () => {}); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }) - - it('errors when listening for event without setting address', function () { - const expected = 'This contract object doesn\'t have address set yet, ' + - 'please set an address first'; - - const eventAbi = [{ - "anonymous": false, - "inputs": [], - "name": "BasicEvent", - "type": "event" - }]; - - const contract = new eth.Contract(eventAbi); - - try { - contract.once('BasicEvent', () => {}); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }) - - it('errors when an event name is reserved', function () { - const expected = 'The event "newListener" is a reserved event name, ' + - 'you can\'t use it.'; - - const newListenerEventAbi = [{ - "anonymous": false, - "inputs": [], - "name": "newListener", - "type": "event" - }]; - - const contract = new eth.Contract(newListenerEventAbi, contractAddress); - - try { - contract.once('newListener', () => {}); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }) - - it('errors when deploy is called without data (throw)', function () { - const expected = 'No "data" specified in neither the given options, ' + - 'nor the default options.'; - - const contract = new eth.Contract(abi); - - try { - contract.deploy(); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }); - - it('errors when deploy is called without data (callback)', function (done) { - const expected = 'No "data" specified in neither the given options, ' + - 'nor the default options.'; - - const contract = new eth.Contract(abi); - - // Callback format - contract.deploy({}, function (err) { - assert(err.message.includes(expected)); - done(); - }); - }) - - it('errors when send is called without a *contract address* set', function () { - const expected = 'This contract object doesn\'t have address set yet, ' + - 'please set an address first.'; - - const contract = new eth.Contract(abi); - try { - contract.methods.simpleMethod("0xaaa").send(); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }); - - it('errors when send is called without a *from address* being set (promise)', async function () { - const expected = 'No "from" address specified in neither the given options, ' - 'nor the default options.'; - - const contract = new eth.Contract(abi, contractAddress); - try { - await contract.methods.simpleMethod("0xaaa").send({}); - assert.fail(); - } catch (err) { - assert(err.message.includes(expected)); - } - }); - - it('errors when send is called without a *from address* being set (callback)', function (done) { - const expected = 'No "from" address specified in neither the given options, ' - 'nor the default options.'; - - const contract = new eth.Contract(abi, contractAddress); - - contract.methods.simpleMethod("0xaaa").send({}, function (err) { - assert(err.message.includes(expected)) - done(); - }); - }); -}); diff --git a/test/contract.js b/test/contract.js deleted file mode 100644 index 63d5386ab11..00000000000 --- a/test/contract.js +++ /dev/null @@ -1,3253 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); -var sha3 = require('../packages/web3-utils').sha3; -var FakeIpcProvider = require('./helpers/FakeIpcProvider'); -var FakeHttpProvider = require('./helpers/FakeHttpProvider'); -var StandAloneContract = require('../packages/web3-eth-contract'); - -var abi = [{ - "type": "constructor", - "inputs": [{ - "name": "who", - "type": "address" - },{ - "name": "myValue", - "type": "uint256" - }] -},{ - "constant": false, - "inputs": [ - { - "components": [ - {"name": "status", "type": "bool"} - ], - "name": "nestedStruct", - "type": "tuple" - } - ], - "name": "addStruct", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" -},{ - "constant": true, - "inputs": [ - { - "name": "", - "type": "address" - } - ], - "name": "listOfNestedStructs", - "outputs": [ - { - "components": [ - {"name": "status", "type": "bool"} - ], - "name": "nestedStruct", - "type": "tuple" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" -},{ - "name": "balance", - "type": "function", - "inputs": [{ - "name": "who", - "type": "address" - }], - "constant": true, - "outputs": [{ - "name": "value", - "type": "uint256" - }] -},{ - "name": "hasALotOfParams", - "inputs": [ - { - "name": "_var1", - "type": "bytes32" - }, - { - "name": "_var2", - "type": "string" - }, - { - "name": "_var3", - "type": "bytes32[]" - } - ], - "outputs": [ - { - "name": "owner", - "type": "address" - } - ], - "constant": false, - "payable": false, - "type": "function" -},{ - "name": "getStr", - "type": "function", - "inputs": [], - "constant": true, - "outputs": [{ - "name": "myString", - "type": "string" - }] -},{ - "name": "owner", - "type": "function", - "inputs": [], - "constant": true, - "outputs": [{ - "name": "owner", - "type": "address" - }] -}, { - "name": "mySend", - "type": "function", - "inputs": [{ - "name": "to", - "type": "address" - }, { - "name": "value", - "type": "uint256" - }], - "outputs": [], - "stateMutability": "payable" -},{ - "name": "myDisallowedSend", - "type": "function", - "inputs": [{ - "name": "to", - "type": "address" - }, { - "name": "value", - "type": "uint256" - }], - "outputs": [], - "payable": false -}, { - "name": "testArr", - "type": "function", - "inputs": [{ - "name": "value", - "type": "int[]" - }], - "constant": true, - "outputs": [{ - "name": "d", - "type": "int" - }] -}, { - "name":"Changed", - "type":"event", - "inputs": [ - {"name":"from","type":"address","indexed":true}, - {"name":"amount","type":"uint256","indexed":true}, - {"name":"t1","type":"uint256","indexed":false}, - {"name":"t2","type":"uint256","indexed":false} - ] -}, { - "name":"Unchanged", - "type":"event", - "inputs": [ - {"name":"value","type":"uint256","indexed":true}, - {"name":"addressFrom","type":"address","indexed":true}, - {"name":"t1","type":"uint256","indexed":false} - ] -}, { - "name":"overloadedFunction", - "type":"function", - "inputs":[ - {"name":"a","type":"uint256"} - ], - "constant":true, - "outputs":[ - {"name":"", "type":"uint256"} - ], - "payable":false, - "stateMutability":"view" -}, { - "name":"overloadedFunction", - "type":"function", - "inputs":[], - "constant":true, - "outputs":[ - {"name":"","type":"uint256"} - ], - "payable":false, - "stateMutability":"view" - }]; - -var address = '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'; -var addressLowercase = '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae'; -var address2 = '0x5555567890123456789012345678901234567891'; - -var getStandAloneContractInstance = function(abi, address, options, provider) { - - // if no address supplied - if (address && typeof address != 'string') { - - // no options provided, either - if (!options && !provider) { - provider = address; - address = undefined; - options = undefined; - } else if (options) { - // options provided, but no address - options = address; - provider = options; - address = undefined; - } - } else if (!provider) { - // address provided, but no options - provider = options; - options = undefined; - } - - - StandAloneContract.setProvider(provider); - return new StandAloneContract(abi, address, options); -} - -var getEthContractInstance = function(abi, address, options, provider) { - - // if no address supplied - if (address && typeof address != 'string') { - - // no options provided, either - if (!options && !provider) { - provider = address; - address = undefined; - options = undefined; - } else if (options) { - // options provided, but no address - options = address; - provider = options; - address = undefined; - } - } else if (!provider) { - // address provided, but no options - provider = options; - options = undefined; - } - - var eth = new Eth(provider); - eth.setProvider(provider); - return new eth.Contract(abi, address, options); -} - -var account = { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', -}; - -var runTests = function(contractFactory) { - describe('instantiation', function () { - it('should transform address from checksum addressess', function () { - var provider = new FakeIpcProvider(); - - var contract = contractFactory(abi, address, provider); - - assert.equal(contract.options.address, address); - }); - it('should transform address to checksum address', function () { - var provider = new FakeIpcProvider(); - - var contract = contractFactory(abi, address, provider); - - assert.equal(contract.options.address, address); - }); - it('should fail on invalid address', function () { - var provider = new FakeIpcProvider(); - - var test = function () { - contractFactory(abi, '0x11F4D0A3c12e86B4b5F39B213F7E19D048276DAe', provider); - }; - - assert.throws(test); - }); - it('should fail on invalid address as options.from', function () { - var provider = new FakeIpcProvider(); - - var test = function () { - contractFactory(abi, address, {from: '0x11F4D0A3c12e86B4b5F39B213F7E19D048276DAe'}, provider); - }; - - assert.throws(test); - }); - it('should define the handleRevert object property if passed over the options', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {handleRevert: true}, provider); - - assert.equal(contract.handleRevert, true); - assert.equal(contract.options.handleRevert, true); - }); - it('should update the handleRevert property in the options object', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {handleRevert: false}, provider); - - contract.handleRevert = true; - - assert.equal(contract.options.handleRevert, true); - }); - it('should define the defaultCommon object property if passed over the options', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {common: true}, provider); - - assert.equal(contract.defaultCommon, true); - assert.equal(contract.options.common, true); - }); - it('should update the defaultCommon property in the options object', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {common: false}, provider); - - contract.defaultCommon = true; - - assert.equal(contract.options.common, true); - }); - it('should define the defaultHardfork object property if passed over the options', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {hardfork: 'istanbul'}, provider); - - assert.equal(contract.defaultHardfork, 'istanbul'); - assert.equal(contract.options.hardfork, 'istanbul'); - }); - it('should update the defaultHardfork property in the options object', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {hardfork: false}, provider); - - contract.defaultHardfork = true; - - assert.equal(contract.options.hardfork, true); - }); - it('should define the defaultChain object property if passed over the options', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {chain: 'mainnet'}, provider); - - assert.equal(contract.defaultChain, 'mainnet'); - assert.equal(contract.options.chain, 'mainnet'); - }); - it('should update the defaultChain property in the options object', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {chain: false}, provider); - - contract.defaultChain = true; - - assert.equal(contract.options.chain, true); - }); - it('should define the transactionPollingTimeout object property if passed over the options', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {transactionPollingTimeout: 0}, provider); - - assert.equal(contract.transactionPollingTimeout, 0); - assert.equal(contract.options.transactionPollingTimeout, 0); - }); - it('should update the transactionPollingTimeout property in the options object', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {transactionPollingTimeout: 1}, provider); - - contract.transactionPollingTimeout = 0; - - assert.equal(contract.options.transactionPollingTimeout, 0); - }); - it('should define the transactionConfirmationBlocks object property if passed over the options', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {transactionConfirmationBlocks: 0}, provider); - - assert.equal(contract.transactionConfirmationBlocks, 0); - assert.equal(contract.options.transactionConfirmationBlocks, 0); - }); - it('should update the transactionConfirmationBlocks property in the options object', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {transactionConfirmationBlocks: 1}, provider); - - contract.transactionConfirmationBlocks = 0; - - assert.equal(contract.options.transactionConfirmationBlocks, 0); - }); - it('should define the transactionBlockTimeout object property if passed over the options', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {transactionBlockTimeout: 0}, provider); - - assert.equal(contract.transactionBlockTimeout, 0); - assert.equal(contract.options.transactionBlockTimeout, 0); - }); - it('should update the transactionBlockTimeout property in the options object', function() { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, {transactionBlockTimeout: 1}, provider); - - contract.transactionBlockTimeout = 0; - - assert.equal(contract.options.transactionBlockTimeout, 0); - }); - it('.clone() should properly clone the contract instance', function () { - var provider = new FakeIpcProvider(); - - var fromAddress = '0xDDfFD0A3C12e86b4b5f39B213f7e19d048276daE'; - var abi2 = [{ - "name": "ballerRo", - "type": "function", - "inputs": [{ - "name": "So", - "type": "address" - }], - "constant": true, - "outputs": [{ - "name": "man", - "type": "uint256" - }] - }]; - - var contract1 = contractFactory(abi, - address, - { - gas: 1222, - gasPrice: 12345678, - from: fromAddress - }, - provider); - - var contract2 = contract1.clone(); - - assert.equal(contract1.options.address, address); - assert.equal(contract1.options.gas, 1222); - assert.equal(contract1.options.gasPrice, '12345678'); - assert.deepEqual(contract1.options.jsonInterface, abi); - - - contract2.options.jsonInterface = abi2; - contract2.options.address = fromAddress; - contract2.options.gas = 300; - contract2.options.gasPrice = '234234'; - - assert.isFunction(contract2.methods.ballerRo); - assert.equal(contract2.options.address, fromAddress); - assert.equal(contract2.options.gas, 300); - assert.equal(contract2.options.gasPrice, '234234'); - assert.deepEqual(contract2.options.jsonInterface, abi2); - }); - }); - - describe('provider assignment', function() { - it('should assign a provider to a new instance without modifying old instance', function () { - var provider1 = new FakeIpcProvider(); - var provider2 = new FakeHttpProvider(); - - var contract1 = getStandAloneContractInstance(abi, address, provider1); - var contract2 = getStandAloneContractInstance(abi, address, provider2); - - assert.deepEqual(contract1.currentProvider, provider1); - assert.deepEqual(contract2.currentProvider, provider2); - }); - }); - - describe('internal method', function () { - it('_encodeEventABI should return the encoded event object without topics', function () { - var provider = new FakeIpcProvider(); - - var contract = contractFactory(abi, address, provider); - - var result = contract._encodeEventABI({ - signature: '0x1234', - "name":"Changed", - "type":"event", - "inputs": [ - {"name":"from","type":"address","indexed":true}, - {"name":"amount","type":"uint256","indexed":true}, - {"name":"t1","type":"uint256","indexed":false}, - {"name":"t2","type":"uint256","indexed":false} - ] - }); - - assert.deepEqual(result, { - address: addressLowercase, - topics: [ - '0x1234', - null, - null - ] - }); - - }); - it('_encodeEventABI should return the encoded event object with topics', function () { - var provider = new FakeIpcProvider(); - - var contract = contractFactory(abi, address, provider); - - var result = contract._encodeEventABI({ - signature: '0x1234', - "name":"Changed", - "type":"event", - "inputs": [ - {"name":"from","type":"address","indexed":true}, - {"name":"amount","type":"uint256","indexed":true}, - {"name":"t1","type":"uint256","indexed":false}, - {"name":"t2","type":"uint256","indexed":false} - ] - }, {filter: {amount: 12}, fromBlock: 2}); - - assert.deepEqual(result, { - address: addressLowercase, - fromBlock: '0x2', - topics: [ - '0x1234', - null, - '0x000000000000000000000000000000000000000000000000000000000000000c' - ] - }); - - }); - it('_encodeEventABI should return the encoded event object with topics and multiple choices', function () { - var provider = new FakeIpcProvider(); - var contract = contractFactory(abi, address, provider); - - var result = contract._encodeEventABI({ - signature: '0x1234', - "name":"Changed", - "type":"event", - "inputs": [ - {"name":"test","type":"uint256","indexed":true}, - {"name":"from","type":"address","indexed":true}, - {"name":"amount","type":"uint256","indexed":true}, - {"name":"t1","type":"uint256","indexed":false}, - {"name":"t2","type":"uint256","indexed":false} - ] - }, {filter: {amount: [12,10], from: address}, fromBlock: 2}); - - assert.deepEqual(result, { - address: addressLowercase, - fromBlock: '0x2', - topics: [ - '0x1234', - null, - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - ['0x000000000000000000000000000000000000000000000000000000000000000c', '0x000000000000000000000000000000000000000000000000000000000000000a'] - ] - }); - - }); - it('_decodeEventABI should return the decoded event object with topics', function () { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - var contract = contractFactory(abi, address, provider); - - var result = contract._decodeEventABI.call({ - signature: sha3(signature), - "name":"Changed", - "type":"event", - "inputs": [ - {"name":"from","type":"address","indexed":true}, - {"name":"amount","type":"uint256","indexed":true}, - {"name":"t1","type":"uint256","indexed":false}, - {"name":"t2","type":"uint256","indexed":false} - ] - }, { - address: address, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ address.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - transactionIndex: '0x0', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }); - - assert.equal(result.blockNumber, 3); - assert.equal(result.blockHash, '0x1345'); - assert.equal(result.logIndex, 4); - assert.equal(result.id, 'log_9ff24cb4'); - assert.equal(result.transactionIndex, 0); - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - - }); - it('_decodeMethodReturn should return the decoded values', function () { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - var contract = contractFactory(abi, address, provider); - - var result = contract._decodeMethodReturn([{ - "name": "myAddress", - "type": "address" - },{ - "name": "value", - "type": "uint256" - }], '0x000000000000000000000000'+ address.replace('0x','')+ - '000000000000000000000000000000000000000000000000000000000000000a'); - - assert.isObject(result); - assert.equal(result[0], address); - assert.equal(result.myAddress, address); - assert.equal(result[1], 10); - assert.equal(result.value, 10); - - }); - it('_decodeMethodReturn should return a single decoded value', function () { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - var contract = contractFactory(abi, address, provider); - - var result = contract._decodeMethodReturn([{ - "name": "myAddress", - "type": "address" - }], '0x000000000000000000000000'+ address.replace('0x','')); - - assert.equal(result, address); - - }); - it('_executeMethod as instantSealEngine should sendTransaction and check for receipts', function (done) { - var provider = new FakeIpcProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature +'000000000000000000000000'+ addressLowercase.replace('0x','') +'000000000000000000000000000000000000000000000000000000000000000a', - from: address2, - to: addressLowercase, - gasPrice: "0x5af3107a4000" - }]); - }); - provider.injectResult('0x1234000000000000000000000000000000000000000000000000000000056789'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - // with instant seal we get the receipt right away - provider.injectResult({ - contractAddress: addressLowercase, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xbf1234', - gasUsed: '0x0' - }); - - var contract = contractFactory(abi, address, provider); - - var txObject = {}; - txObject._method = { - signature: signature, - "name": "send", - "type": "function", - "inputs": [{ - "name": "to", - "type": "address" - }, { - "name": "value", - "type": "uint256" - }], - "outputs": [] - }; - txObject._parent = contract; - txObject.encodeABI = contract._encodeMethodABI.bind(txObject); - txObject.arguments = [address, 10]; - - var deploy = contract._executeMethod.call(txObject, 'send', {from: address2, gasPrice: '100000000000000' }, function (err, result) { - // tx hash - assert.equal(result, '0x1234000000000000000000000000000000000000000000000000000000056789'); - }) - .on('receipt', function(result){ - - assert.deepEqual(result, { - contractAddress: address, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xbf1234', - gasUsed: 0 - }); - done(); - }); - - }); - it('_executeMethod should sendTransaction and check for receipts', function (done) { - var provider = new FakeIpcProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature +'000000000000000000000000'+ addressLowercase.replace('0x','') +'000000000000000000000000000000000000000000000000000000000000000a', - from: address2, - to: addressLowercase, - gasPrice: "0x5af3107a4000" - }]); - }); - provider.injectResult('0x1234000000000000000000000000000000000000000000000000000000056789'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult({ - contractAddress: addressLowercase, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xbf1234', - gasUsed: '0x0' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_unsubscribe'); - assert.deepEqual(payload.params, ['0x1234567']); - }); - provider.injectResult('0x321'); - - - var contract = contractFactory(abi, address, provider); - - var txObject = {}; - txObject._method = { - signature: signature, - "name": "send", - "type": "function", - "inputs": [{ - "name": "to", - "type": "address" - }, { - "name": "value", - "type": "uint256" - }], - "outputs": [] - }; - txObject._parent = contract; - txObject.encodeABI = contract._encodeMethodABI.bind(txObject); - txObject.arguments = [address, 10]; - - var deploy = contract._executeMethod.call(txObject, 'send', {from: address2, gasPrice: '100000000000000' }, function (err, result) { - // tx hash - assert.equal(result, '0x1234000000000000000000000000000000000000000000000000000000056789'); - }) - .on('receipt', function(result){ - assert.deepEqual(result, { - contractAddress: address, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xbf1234', - gasUsed: 0 - }); - done(); - }).catch(console.log); - - }); - it('_executeMethod should call and return values', function (done) { - var provider = new FakeIpcProvider(); - var signature = sha3('balance(address)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: signature + '000000000000000000000000'+ addressLowercase.replace('0x',''), - from: address2, - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x000000000000000000000000000000000000000000000000000000000000000a'); - - - var contract = contractFactory(abi, address, provider); - - var txObject = {}; - txObject._method = { - signature: signature, - "name": "balance", - "type": "function", - "inputs": [{ - "name": "who", - "type": "address" - }], - "constant": true, - "outputs": [{ - "name": "value", - "type": "uint256" - }] - }; - txObject._parent = contract; - txObject.encodeABI = contract._encodeMethodABI.bind(txObject); - txObject.arguments = [address]; - - var deploy = contract._executeMethod.call(txObject, 'call', {from: address2}, function (err, result) { - assert.equal(result, '10'); - }) - .then(function(result){ - assert.equal(result, '10'); - done(); - }); - - }); - }); - - describe('event', function () { - it('should create event subscription', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [ - sha3(signature), - ('0x000000000000000000000000' + addressLowercase.replace('0x', '')), - null - ], - address: addressLowercase - }); - }); - provider.injectResult('0x123'); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - done(); - - }); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x123', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - ('0x000000000000000000000000' + addressLowercase.replace('0x', '')), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - var contract = contractFactory(abi, address, provider); - - var event = contract.events.Changed({filter: {from: address}}, function (err, result, sub) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - - sub.unsubscribe(); - }); - - }); - - it('should create event from the events object and use the fromBlock option', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getLogs'); - }); - provider.injectResult([{ - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000002' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000009' - }, - { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000003' - ], - blockNumber: '0x4', - transactionHash: '0x1235', - blockHash: '0x1346', - logIndex: '0x1', - data: '0x0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005' - }]); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - null - ], - address: addressLowercase - }); - }); - provider.injectResult('0x321'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - done(); - }); - provider.injectResult(true); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - var contract = contractFactory(abi, address, provider); - var count = 0; - var event = contract.events.Changed({fromBlock: 0,filter: {from: address}}) - .on('data', function (result) { - count++; - - if(count === 1) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 2); - assert.equal(result.returnValues.t1, 2); - assert.equal(result.returnValues.t2, 9); - - } - if(count === 2) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 3); - assert.equal(result.returnValues.t1, 4); - assert.equal(result.returnValues.t2, 5); - - } - if(count === 3) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - - event.unsubscribe(); - } - - }); - }); - - - it('should create event from the events object using a signature and callback', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - null - ], - address: addressLowercase - }); - }); - provider.injectResult('0x321'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - done(); - }); - provider.injectResult(true); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - var contract = contractFactory(abi, address, provider); - var event = contract.events['0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651']({filter: {from: address}}, function (err, result) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - - event.unsubscribe(); - }); - }); - - it('should create event from the events object using event name and parameters', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - null - ], - address: addressLowercase - }); - }); - provider.injectResult('0x321'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - done(); - }); - provider.injectResult(true); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - var contract = contractFactory(abi, address, provider); - var event = contract.events[signature]({filter: {from: address}}, function (err, result) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - - event.unsubscribe(); - }); - }); - - it('should create event using the function and unsubscribe after one log received', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - null - ], - address: addressLowercase - }); - }); - provider.injectResult('0x321'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - }); - provider.injectResult(true); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - var count = 1; - var contract = contractFactory(abi, address, provider); - contract.once('Changed', {filter: {from: address}}, function (err, result, sub) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - assert.deepEqual(sub.options.requestManager.subscriptions, new Map()); - - assert.equal(count, 1); - count++; - - setTimeout(done, 10); - }); - }); - - it('should create event using the function and unsubscribe after one log received when no options are provided', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [ - sha3(signature), - null, - null - ], - address: addressLowercase - }); - }); - provider.injectResult('0x321'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - }); - provider.injectResult(true); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - var count = 1; - var contract = contractFactory(abi, address, provider); - contract.once('Changed', function (err, result, sub) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - assert.deepEqual(sub.options.requestManager.subscriptions, new Map()); - - assert.equal(count, 1); - count++; - - setTimeout(done, 10); - }); - }); - - it('should throw an error when using the once() function and no callback is provided', function () { - var provider = new FakeIpcProvider(); - - var contract = contractFactory(abi, address, provider); - assert.throws(contract.once.bind(contract, 'Changed', {filter: {from: address}})); - }); - - it('should create event subscription and fire the changed event, if log.removed = true', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - null - ], - address: addressLowercase - }); - }); - provider.injectResult('0x321'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - }); - provider.injectResult(true); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x321', - result: { - address: addressLowercase, - topics: [ - sha3(signature), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - removed: true, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - var count = 1; - var contract = contractFactory(abi, address, provider); - contract.events.Changed({filter: {from: address}}) - .on('data', function(result) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - - assert.equal(count, 1); - count++; - - }) - .on('changed', function(result) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - assert.equal(result.removed, true); - - assert.equal(count, 2); - }); - - setTimeout(done, 60); - - }); - - it('should create all event filter and receive two logs', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'Changed(address,uint256,uint256,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params[1], { - topics: [], - address: addressLowercase - }); - }); - provider.injectResult('0x333'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_unsubscribe'); - done(); - }); - provider.injectResult(true); - - - var contract = contractFactory(abi, address, provider); - - var count = 0; - var event = contract.events.allEvents(function (err, result) { - count++; - - if(count === 1) { - assert.equal(result.returnValues.from, address); - assert.equal(result.returnValues.amount, 1); - assert.equal(result.returnValues.t1, 1); - assert.equal(result.returnValues.t2, 8); - } - if(count === 2) { - assert.equal(result.returnValues.addressFrom, address); - assert.equal(result.returnValues.value, 2); - assert.equal(result.returnValues.t1, 5); - - event.unsubscribe(); - } - - }); - - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x333', - result: { - address: address, - topics: [ - sha3('Changed(address,uint256,uint256,uint256)'), - '0x000000000000000000000000'+ address.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - } - }); - - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x333', - result: { - address: address, - topics: [ - sha3('Unchanged(uint256,address,uint256)'), - '0x0000000000000000000000000000000000000000000000000000000000000002', - '0x000000000000000000000000'+ address.replace('0x','') - ], - blockNumber: '0x3', - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000005' - } - } - }); - }); - }); - describe('with methods', function () { - it('should change the address', function () { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - var contract = contractFactory(abi, address, provider); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase, - from: address2 - }, 'latest']); - }); - - contract.methods.balance(address).call({from: address2}); - - // change address - contract.options.address = address2; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: address2, - from: addressLowercase - }, 'latest']); - }); - - contract.methods.balance(address).call({from: address}); - }); - - it('should reset functions when resetting json interface', function () { - var provider = new FakeIpcProvider(); - - var contract = contractFactory(abi, provider); - - assert.isFunction(contract.methods.mySend); - assert.isFunction(contract.events.Changed); - - contract.options.jsonInterface = [{ - "name": "otherSend", - "type": "function", - "inputs": [{ - "name": "to", - "type": "address" - }, { - "name": "value", - "type": "uint256" - }], - "outputs": [] - }, { - "name":"Unchanged", - "type":"event", - "inputs": [ - {"name":"value","type":"uint256","indexed":true}, - {"name":"addressFrom","type":"address","indexed":true}, - {"name":"t1","type":"uint256","indexed":false} - ] - }]; - - assert.isFunction(contract.methods.otherSend); - assert.isFunction(contract.events.Unchanged); - - assert.isUndefined(contract.methods.mySend); - assert.isUndefined(contract.events.Changed); - }); - - it('should encode a function call', function () { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - var contract = contractFactory(abi, provider); - - var result = contract.methods.balance(address).encodeABI(); - - assert.equal(result, sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x','')); - }); - - it('should encode a constructor call with pre set data', function () { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - var contract = contractFactory(abi, {data: '0x1234'}, provider); - - var result = contract.deploy({ - arguments: [address, 10] - }).encodeABI(); - - assert.equal(result, '0x1234' + '000000000000000000000000'+ addressLowercase.replace('0x','')+ '000000000000000000000000000000000000000000000000000000000000000a'); - }); - - it('should encode a constructor call with passed data', function () { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - var contract = contractFactory(abi, provider); - - var result = contract.deploy({ - arguments: [address, 10], - data: '0x1234' - }).encodeABI(); - - assert.equal(result, '0x1234' + '000000000000000000000000'+ addressLowercase.replace('0x','')+ '000000000000000000000000000000000000000000000000000000000000000a'); - }); - - - it('should estimate a function', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_estimateGas'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase - }]); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.balance(address).estimateGas(function (err, res) { - assert.deepEqual(res, 50); - done(); - }); - }); - - it('should estimate the constructor', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_estimateGas'); - assert.deepEqual(payload.params, [{ - data: '0x1234000000000000000000000000'+ addressLowercase.replace('0x','') +'0000000000000000000000000000000000000000000000000000000000000032' - }]); - }); - provider.injectResult('0x000000000000000000000000000000000000000000000000000000000000000a'); - - var contract = contractFactory(abi, address, {data: '0x1234'}, provider); - - contract.deploy({ - arguments: [address, 50] - }).estimateGas(function (err, res) { - assert.deepEqual(res, 10); - done(); - }); - }); - - it('should send with many parameters', function (done) { - var provider = new FakeIpcProvider(); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: '0x8708f4a12454534500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000c30786666323435343533343500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ff24545345000000000000000000000000000000000000000000000000000000534500000000000000000000000000000000000000000000000000000000000045450000000000000000000000000000000000000000000000000000000000004533450000000000000000000000000000000000000000000000000000000000', - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x000000000000000000000000'+ addressLowercase.replace('0x','')); - - var contract = contractFactory(abi, address, provider); - - contract.methods.hasALotOfParams("0x24545345", "0xff24545345", ["0xff24545345", "0x5345", "0x4545", "0x453345"]).call(function (err, res) { - assert.deepEqual(res, address); - done(); - }); - }); - - it('should send overload functions with zero parameters', function(done) { - var provider = new FakeIpcProvider(); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: '0xbb853481', - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000005'); - - var contract = contractFactory(abi, address, provider); - contract.methods.overloadedFunction().call(function (err, res) { - assert.equal(res, 5); - done(); - }); - }); - - it('should send overload functions with one parameters', function(done) { - var provider = new FakeIpcProvider(); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: '0x533678270000000000000000000000000000000000000000000000000000000000000006', - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000006'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.overloadedFunction(6).call(function (err, res) { - assert.equal(res, 6); - done(); - }); - }); - - it('should call constant function', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.balance(address).call(function (err, res) { - assert.deepEqual(res, '50'); - done(); - }); - }); - - it('should call constant function with default block', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase - }, '0xb']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.balance(address).call(11) - .then(function (r) { - assert.deepEqual(r, '50'); - done(); - }); - }); - - it('should call constant concurrently', function (done) { - var provider = new FakeIpcProvider(); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('balance(address)').slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x000000000000000000000000000000000000000000000000000000000000000a'); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('owner()').slice(0, 10), - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x00000000000000000000000011f4d0a3c12e86b4b5f39b213f7e19d048276dae'); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('getStr()').slice(0, 10), - to: addressLowercase - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'); - - var contract = contractFactory(abi, address, provider); - - - Promise.all([ - contract.methods.balance(address).call(), - contract.methods.owner().call(), - contract.methods.getStr().call() - ]).then(results => { - assert.deepEqual(results[0], '10'); - assert.deepEqual(results[1], '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'); - assert.deepEqual(results[2], 'Hello!%!'); - - done(); - }); - }); - - it('should return an error when returned string is 0x', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'getStr()'; - - var contract = contractFactory(abi, address, provider); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10), - to: addressLowercase, - from: address2 - }, 'latest']); - }); - - provider.injectResult('0x'); - - contract.methods.getStr().call({from: address2}, function (err, result) { - // console.log(err, result) - assert.isTrue(err instanceof Error); - done(); - }); - - }); - - it('should return an empty string when 0x0', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'getStr()'; - - var contract = contractFactory(abi, address, provider); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10), - to: addressLowercase, - from: address2 - }, 'latest']); - }); - - provider.injectResult('0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000'); - - contract.methods.getStr().call({from: address2}, function (err, result) { - assert.equal(result, ''); - done(); - }); - - }); - - it('should sendTransaction and check for receipts with formatted logs', function (done) { - var provider = new FakeIpcProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature +'000000000000000000000000'+ addressLowercase.replace('0x','') +'000000000000000000000000000000000000000000000000000000000000000a', - from: address2, - to: addressLowercase, - gasPrice: "0x1369ed97fb71" - }]); - }); - provider.injectResult('0x1234000000000000000000000000000000000000000000000000000000056789'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult({ - contractAddress: null, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - transactionHash: '0x1234', - blockNumber: '0xa', - blockHash: '0x1234', - gasUsed: '0x0', - logs: [{ - address: address, - topics: [ - sha3('Unchanged(uint256,address,uint256)'), - '0x0000000000000000000000000000000000000000000000000000000000000002', - '0x000000000000000000000000'+ addressLowercase.replace('0x','') - ], - blockNumber: '0xa', - transactionHash: '0x1234', - transactionIndex: '0x0', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000005' - },{ - address: address, - topics: [ - sha3('Changed(address,uint256,uint256,uint256)'), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0xa', - transactionHash: '0x1234', - transactionIndex: '0x0', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_unsubscribe'); - assert.deepEqual(payload.params, ['0x1234567']); - }); - provider.injectResult('0x321'); - - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 10).send({from: address2, gasPrice: '21345678654321'}) - .on('receipt', function (receipt) { - // console.log(receipt); - // console.log(receipt.events[0].raw); - // console.log(receipt.events[1].raw); - - // wont throw if it errors ?! - assert.deepEqual(receipt, { - contractAddress: null, - cumulativeGasUsed: 10, - transactionIndex: 3, - transactionHash: '0x1234', - blockNumber: 10, - blockHash: '0x1234', - gasUsed: 0, - events: { - Unchanged: { - address: address, - blockNumber: 10, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: 4, - id: 'log_9ff24cb4', - transactionIndex: 0, - returnValues: { - 0: '2', - 1: address, - 2: '5', - value: '2', - addressFrom: address, - t1: '5' - }, - event: 'Unchanged', - signature: "0xf359668f205d0b5cfdc20d11353e05f633f83322e96f15486cbb007d210d66e5", - raw: { - topics: ['0xf359668f205d0b5cfdc20d11353e05f633f83322e96f15486cbb007d210d66e5', - '0x0000000000000000000000000000000000000000000000000000000000000002', - '0x000000000000000000000000' + addressLowercase.replace('0x', '')], - data: '0x0000000000000000000000000000000000000000000000000000000000000005', - } - }, - Changed: { - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - blockNumber: 10, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: 4, - id: 'log_9ff24cb4', - transactionIndex: 0, - returnValues: { - 0: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 1: '1', - 2: '1', - 3: '8', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - amount: '1', - t1: '1', - t2: '8' - }, - event: 'Changed', - signature: "0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651", - raw: { - topics: ['0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651', - '0x000000000000000000000000' + addressLowercase.replace('0x', ''), - '0x0000000000000000000000000000000000000000000000000000000000000001'], - data: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008', - } - } - } - }); - - done(); - }); - - - }); - - it('should sendTransaction and check for receipts with formatted logs when multiple of same event', function (done) { - var provider = new FakeIpcProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature +'000000000000000000000000'+ addressLowercase.replace('0x','') +'000000000000000000000000000000000000000000000000000000000000000a', - from: address2, - to: addressLowercase, - gasPrice: "0x1369ed97fb71" - }]); - }); - provider.injectResult('0x1234000000000000000000000000000000000000000000000000000000056789'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult({ - contractAddress: null, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - transactionHash: '0x1234', - blockNumber: '0xa', - blockHash: '0x1234', - gasUsed: '0x0', - logs: [{ - address: address, - topics: [ - sha3('Changed(address,uint256,uint256,uint256)'), - '0x000000000000000000000000' + addressLowercase.replace('0x', ''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0xa', - transactionHash: '0x1234', - transactionIndex: '0x0', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - },{ - address: address, - topics: [ - sha3('Changed(address,uint256,uint256,uint256)'), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000002' - ], - blockNumber: '0xa', - transactionHash: '0x1234', - transactionIndex: '0x0', - blockHash: '0x1345', - logIndex: '0x5', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_unsubscribe'); - assert.deepEqual(payload.params, ['0x1234567']); - }); - provider.injectResult('0x321'); - - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 10).send({from: address2, gasPrice: '21345678654321'}) - .on('receipt', function (receipt) { - - // wont throw if it errors ?! nope: causes a timeout - assert.deepEqual(receipt, { - contractAddress: null, - cumulativeGasUsed: 10, - transactionIndex: 3, - transactionHash: '0x1234', - blockNumber: 10, - blockHash: '0x1234', - gasUsed: 0, - events: { - Changed: [ - { - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - blockNumber: 10, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: 4, - id: 'log_9ff24cb4', - transactionIndex: 0, - returnValues: { - 0: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 1: '1', - 2: '1', - 3: '8', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - amount: '1', - t1: '1', - t2: '8' - }, - event: 'Changed', - signature: "0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651", - raw: { - topics: [ '0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651', - '0x000000000000000000000000' + addressLowercase.replace('0x', ''), - '0x0000000000000000000000000000000000000000000000000000000000000001' ], - data: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008', - } - }, { - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - blockNumber: 10, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: 5, - id: 'log_8b8a2b7f', - transactionIndex: 0, - returnValues: { - 0: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 1: '2', - 2: '1', - 3: '8', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - amount: '2', - t1: '1', - t2: '8' - }, - event: 'Changed', - signature: "0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651", - raw: { - topics: [ '0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651', - '0x000000000000000000000000' + addressLowercase.replace('0x', ''), - '0x0000000000000000000000000000000000000000000000000000000000000002' ], - data: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008', - } - } - ] - } - }); - - done(); - }); - - - }); - - it('should sendTransaction and check for receipts with formatted logs using the HTTP provider', function (done) { - var provider = new FakeHttpProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature +'000000000000000000000000'+ addressLowercase.replace('0x','') +'000000000000000000000000000000000000000000000000000000000000000a', - from: address2, - to: addressLowercase, - gasPrice: "0x1369ed97fb71" - }]); - }); - provider.injectResult('0x1234000000000000000000000000000000000000000000000000000000056789'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult(null); - - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult({ - contractAddress: null, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - transactionHash: '0x1234', - blockNumber: '0xa', - blockHash: '0x43ffdd', - gasUsed: '0x0', - logs: [{ - address: address, - topics: [ - sha3('Unchanged(uint256,address,uint256)'), - '0x0000000000000000000000000000000000000000000000000000000000000002', - '0x000000000000000000000000'+ addressLowercase.replace('0x','') - ], - blockNumber: '0xa', - transactionHash: '0x1234', - transactionIndex: '0x0', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000005' - },{ - address: address, - topics: [ - sha3('Changed(address,uint256,uint256,uint256)'), - '0x000000000000000000000000'+ addressLowercase.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000001' - ], - blockNumber: '0xa', - transactionHash: '0x1234', - transactionIndex: '0x0', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_unsubscribe'); - assert.deepEqual(payload.params, ['0x1234567']); - }); - provider.injectResult('0x321'); - - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 10).send({from: address2, gasPrice: '21345678654321'}) - .on('receipt', function (receipt) { - // console.log(receipt); - // console.log(receipt.events[0].raw); - // console.log(receipt.events[1].raw); - - // wont throw if it errors ?! - assert.deepEqual(receipt, { - contractAddress: null, - cumulativeGasUsed: 10, - transactionIndex: 3, - transactionHash: '0x1234', - blockNumber: 10, - blockHash: '0x43ffdd', - gasUsed: 0, - events: { - Unchanged: { - address: address, - blockNumber: 10, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: 4, - id: 'log_9ff24cb4', - transactionIndex: 0, - returnValues: { - 0: '2', - 1: address, - 2: '5', - value: '2', - addressFrom: address, - t1: '5' - }, - event: 'Unchanged', - signature: '0xf359668f205d0b5cfdc20d11353e05f633f83322e96f15486cbb007d210d66e5', - raw: { - topics: ['0xf359668f205d0b5cfdc20d11353e05f633f83322e96f15486cbb007d210d66e5', - '0x0000000000000000000000000000000000000000000000000000000000000002', - '0x000000000000000000000000' + addressLowercase.replace('0x', '')], - data: '0x0000000000000000000000000000000000000000000000000000000000000005', - } - }, - Changed: { - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - blockNumber: 10, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: 4, - id: 'log_9ff24cb4', - transactionIndex: 0, - returnValues: { - 0: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - 1: '1', - 2: '1', - 3: '8', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - amount: '1', - t1: '1', - t2: '8' - }, - event: 'Changed', - signature: '0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651', - raw: { - topics: ['0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651', - '0x000000000000000000000000' + addressLowercase.replace('0x', ''), - '0x0000000000000000000000000000000000000000000000000000000000000001'], - data: '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008', - } - } - } - }); - - done(); - }); - - - }); - - it('should sendTransaction and receive multiple confirmations', function(done){ - var provider = new FakeIpcProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature +'000000000000000000000000'+ addressLowercase.replace('0x','') +'000000000000000000000000000000000000000000000000000000000000000a', - from: address2, - to: addressLowercase, - gasPrice: "0x1369ed97fb71" - }]); - }); - provider.injectResult('0x1234000000000000000000000000000000000000000000000000000000056789'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - - provider.injectResult({ - contractAddress: null, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - transactionHash: '0x1234', - blockNumber: '0xa', - blockHash: '0x1234', - gasUsed: '0x0', - logs: [] - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); - - var contract = contractFactory(abi, address, provider); - - var count = 0; - contract.methods.mySend(address, 10) - .send({from: address2, gasPrice: '21345678654321'}) - .on('confirmation', function (confirmationNumber, receipt) { - count++; - if(count === 1) { - assert.deepEqual(receipt, { - contractAddress: null, - cumulativeGasUsed: 10, - transactionIndex: 3, - transactionHash: '0x1234', - blockNumber: 10, - blockHash: '0x1234', - gasUsed: 0, - events: {} - }); - - assert.equal(confirmationNumber, 0); - } - if(count === 2) { - assert.deepEqual(receipt, { - contractAddress: null, - cumulativeGasUsed: 10, - transactionIndex: 3, - transactionHash: '0x1234', - blockNumber: 10, - blockHash: '0x1234', - gasUsed: 0, - events: {} - }); - - assert.equal(confirmationNumber, 1); - done(); - } - }); - - // fake newBlocks - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x11' - } - } - }); - }); - - it('should sendTransaction to contract function', function () { - var provider = new FakeIpcProvider(); - var signature = 'mySend(address,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - from: addressLowercase, - to: addressLowercase, - gasPrice: "0x369d1f7fd2" - }]); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 17).send({from: address, gasPrice: '234564321234'}); - }); - - it('should throw error when trying to send ether to a non payable contract function', function () { - var provider = new FakeIpcProvider(); - - var contract = contractFactory(abi, address, provider); - - try{ - contract.methods.myDisallowedSend(address, 17).send({from: address, value: 123}) - .on('error', function (e) { - assert.isTrue(e instanceof Error, 'Should throw error'); - }) - .catch(function (e) { - assert.isTrue(e instanceof Error, 'Should throw error'); - }); - - } catch(e){ - assert.isTrue(e instanceof Error, 'Should throw error'); - } - }); - - it('should not throw error when trying to not send ether to a non payable contract function', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'myDisallowedSend(address,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - from: addressLowercase, - to: addressLowercase, - gasPrice: "0x1555757ee6b1" - }]); - - done(); - }); - - var contract = contractFactory(abi, address, provider); - - try{ - contract.methods.myDisallowedSend(address, 17).send({from: address, gasPrice: '23456787654321'}) - .on('error', function (e) { - assert.isFalse(e instanceof Error, 'Should not throw error'); - }) - .catch(function (e) { - assert.isFalse(e instanceof Error, 'Should not throw error'); - }); - - } catch(e){ - assert.isFalse(e instanceof Error, 'Should not throw error'); - } - }); - - - it('should sendTransaction to contract function using the function namen incl. parameters', function () { - var provider = new FakeIpcProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - from: addressLowercase, - to: addressLowercase, - gasPrice: "0x1555757ee6b1" - }]); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods['mySend(address,uint256)'](address, 17).send({from: address, gasPrice: '23456787654321'}); - }); - - it('should sendTransaction to contract function using the signature', function () { - var provider = new FakeIpcProvider(); - var signature = sha3('mySend(address,uint256)').slice(0, 10); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: signature + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - from: addressLowercase, - to: addressLowercase, - gasPrice: "0x49504f80" - }]); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods[signature](address, 17).send({from: address, gasPrice: '1230000000'}); - }); - - it('should throw when trying to create a tx object and wrong amount of params', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'mySend(address,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - to: addressLowercase, - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8', - value: '0x2710' - }]); - - done(); - }); - - var contract = contractFactory(abi, address, provider); - - assert.throws(function () { - contract.methods.mySend(address); - }); - - setTimeout(done, 1); - }); - - it('should make a call with optional params', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - var count = 0; - - - provider.injectValidation(function (payload) { - count++; - if(count > 1) return; - - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase, - from: addressLowercase, - gas: '0xc350' - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032'); - - - var contract = contractFactory(abi, address, provider); - - contract.methods.balance(address).call({from: address, gas: 50000}) - .then(function (r) { - assert.deepEqual(r, '50'); - done(); - }); - }); - - it('should explicitly make a call with optional params', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase, - from: addressLowercase, - gas: '0xc350' - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.balance(address).call({from: address, gas: 50000}) - .then(function (r) { - assert.deepEqual(r, '50'); - done(); - }); - - }); - - it('should explicitly make a call with optional params and defaultBlock', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'balance(address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '000000000000000000000000'+ addressLowercase.replace('0x',''), - to: addressLowercase, - from: addressLowercase, - gas: '0xc350' - }, '0xb']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000032'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.balance(address).call({from: address, gas: 50000}, 11) - .then(function (r) { - assert.deepEqual(r, '50'); - done(); - }); - - }); - - it('should sendTransaction with optional params', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'mySend(address,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - to: addressLowercase, - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8', - value: '0x2710' - }]); - - done(); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 17).send({from: address, gas: 50000, gasPrice: 3000, value: 10000}); - }); - - it('should sendTransaction and fill in default gasPrice', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'mySend(address,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_gasPrice'); - assert.deepEqual(payload.params, []); - }); - - provider.injectResult('0x45656456456456'); - - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - to: addressLowercase, - from: addressLowercase, - gasPrice: '0x45656456456456' - }]); - - done(); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 17).send({from: address}); - }); - - it('should explicitly sendTransaction with optional params', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'mySend(address,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - to: addressLowercase, - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8', - value: '0x2710' - }]); - - done(); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 17).send({from: address, gas: 50000, gasPrice: 3000, value: 10000}); - }); - - - it('should explicitly call sendTransaction with optional params and call callback without error', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'mySend(address,uint256)'; - - provider.injectValidation(function (payload) { - - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000'+ addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - to: addressLowercase, - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8', - value: '0x2710' - }]); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 17).send({from: address, gas: 50000, gasPrice: 3000, value: 10000}, function (err) { - assert.equal(err, null); - done(); - }); - }) - - it('should explicitly estimateGas with optional params', function () { - var provider = new FakeIpcProvider(); - var signature = 'mySend(address,uint256)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_estimateGas'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '000000000000000000000000' + addressLowercase.replace('0x','') + - '0000000000000000000000000000000000000000000000000000000000000011' , - to: addressLowercase, - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8', - value: '0x2710' - }]); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods.mySend(address, 17).estimateGas({from: address, gas: 50000, gasPrice: 3000, value: 10000}); - }); - - it('getPastEvents should get past events and format them correctly', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'testArr(int[])'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getLogs'); - assert.deepEqual(payload.params, [{ - address: addressLowercase, - topics: [ - "0x792991ed5ba9322deaef76cff5051ce4bedaaa4d097585970f9ad8f09f54e651", - "0x000000000000000000000000" + address2.replace('0x',''), - null - ] - }]); - }); - - var topic1 = [ - sha3(signature), - '0x000000000000000000000000'+ address.replace('0x',''), - '0x000000000000000000000000000000000000000000000000000000000000000a' - ]; - var topic2 = [ - sha3(signature), - '0x000000000000000000000000'+ address.replace('0x',''), - '0x0000000000000000000000000000000000000000000000000000000000000003' - ]; - - provider.injectResult([{ - address: address, - topics: topic1, - blockNumber: '0x3', - transactionHash: '0x1234', - transactionIndex: '0x0', - blockHash: '0x1345', - logIndex: '0x4', - data: '0x0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000009' - }, - { - address: address, - topics: topic2, - blockNumber: '0x4', - transactionHash: '0x1235', - transactionIndex: '0x0', - blockHash: '0x1346', - logIndex: '0x1', - data: '0x0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005' - }]); - - var contract = contractFactory(abi, address, provider); - contract.getPastEvents('Changed', {filter: {from: address2}}) - .then(function (result) { - - assert.deepEqual(result, [{ - event: "Changed", - signature: "0xc00c1c37cc8b83163fb4fddc06c74d1d5c00d74648e7cb28c0ebada3e32fd62c", - id: "log_9ff24cb4", - address: address, - blockNumber: 3, - transactionHash: '0x1234', - blockHash: '0x1345', - logIndex: 4, - transactionIndex: 0, - raw: { - data: '0x0000000000000000000000000000000000000000000000000000000000000002' + - '0000000000000000000000000000000000000000000000000000000000000009', - topics: topic1 - }, - returnValues: { - 0: address, - 1: '10', - 2: '2', - 3: '9', - from: address, - amount: '10', - t1: '2', - t2: '9' - } - }, - { - event: "Changed", - signature: "0xc00c1c37cc8b83163fb4fddc06c74d1d5c00d74648e7cb28c0ebada3e32fd62c", - id: "log_29c93e15", - address: address, - blockNumber: 4, - transactionHash: '0x1235', - blockHash: '0x1346', - logIndex: 1, - transactionIndex: 0, - raw: { - data: '0x0000000000000000000000000000000000000000000000000000000000000004' + - '0000000000000000000000000000000000000000000000000000000000000005', - topics: topic2 - }, - returnValues: { - 0: address, - 1: '3', - 2: '4', - 3: '5', - from: address, - amount: '3', - t1: '4', - t2: '5' - } - }]); - - done(); - }).catch(done); - - }); - - it('should call testArr method and properly parse result', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'testArr(int[])'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003', - to: addressLowercase - }, - 'latest' - ]); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000005'); - - var contract = contractFactory(abi, address, provider); - contract.methods.testArr([3]).call() - .then(function (result) { - assert.deepEqual(result, '5'); - done(); - }); - - }); - - it('should call testArr method, properly parse result and return the result in a callback', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'testArr(int[])'; - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + - '0000000000000000000000000000000000000000000000000000000000000020' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000003', - to: addressLowercase - }, - 'latest' - ]); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000005'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.testArr([3]).call(function (err, result) { - assert.deepEqual(result, '5'); - done(); - }); - - }); - - it('should call owner method, properly', function (done) { - var provider = new FakeIpcProvider(); - var signature = 'owner()'; - - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10), - to: addressLowercase - }, - 'latest' - ]); - }); - provider.injectResult('0x000000000000000000000000'+ addressLowercase.replace('0x','')); - - var contract = contractFactory(abi, address, provider); - - contract.methods.owner().call(function (err, result) { - assert.deepEqual(result, address); - done(); - }); - - }); - - - it('should decode an struct correctly', function (done) { - var provider = new FakeIpcProvider(); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: '0x2a4aedd50000000000000000000000009cc9a2c777605af16872e0997b3aeb91d96d5d8c', - to: addressLowercase - }, - 'latest' - ]); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - var contract = contractFactory(abi, address, provider); - - contract.methods.listOfNestedStructs('0x9CC9a2c777605Af16872E0997b3Aeb91d96D5D8c').call().then(function(result) { - var expectedArray = []; - expectedArray[0] = true; - expectedArray['status'] = true; - - assert.deepEqual(result, expectedArray); - done(); - }); - }); - - it('should call an contract method with an struct as parameter', function (done) { - var provider = new FakeIpcProvider(); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: '0x814a4d160000000000000000000000000000000000000000000000000000000000000001', - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8', - to: addressLowercase - }]); - - done(); - }); - - var contract = contractFactory(abi, address, provider); - - contract.methods.addStruct({status: true}).send({ - from: address, - gas: 50000, - gasPrice: 3000 - }); - }); - }); - describe('with data', function () { - it('should deploy a contract and use callback', function (done) { - var provider = new FakeIpcProvider(); - - provider.injectResult('0x1234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: '0x1234567000000000000000000000000555456789012345678901234567890123456789100000000000000000000000000000000000000000000000000000000000000c8' , - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8' - }]); - }); - - var contract = contractFactory(abi, provider); - - contract.deploy({ - data: '0x1234567', - arguments: ['0x5554567890123456789012345678901234567891', 200] - }).send({ - from: address, - gas: 50000, - gasPrice: 3000 - }, function (err, result) { - assert.equal(err, null); - assert.equal(result, '0x1234567'); - done(); - }); - }); - - it('should deploy a contract and use all promise steps', function (done) { - var provider = new FakeIpcProvider(); - - provider.injectValidation(function (payload) { - - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - data: '0x1234567000000000000000000000000'+ addressLowercase.replace('0x','') +'00000000000000000000000000000000000000000000000000000000000000c8' , - from: addressLowercase, - gas: '0xc350', - gasPrice: '0xbb8' - }]); - - }); - provider.injectResult('0x5550000000000000000000000000000000000000000000000000000000000032'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x5550000000000000000000000000000000000000000000000000000000000032']); - }); - provider.injectResult(null); - - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x5550000000000000000000000000000000000000000000000000000000000032']); - }); - provider.injectResult({ - contractAddress: addressLowercase, - blockHash: '0xffdd' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getCode'); - assert.deepEqual(payload.params, [addressLowercase, 'latest']); - }); - provider.injectResult('0x321'); - - - var contract = contractFactory(abi, provider); - - contract.deploy({ - data: '0x1234567', - arguments: [address, 200] - }).send({ - from: address, - gas: 50000, - gasPrice: 3000 - }) - .on('transactionHash', function (value) { - assert.equal('0x5550000000000000000000000000000000000000000000000000000000000032', value); - }) - .on('receipt', function (receipt) { - assert.equal(address, receipt.contractAddress); - assert.isNull(contract.options.address); - }) - .then(function(newContract) { - assert.equal(newContract.options.address, address); - assert.isTrue(newContract !== contract, 'contract objects shouldn\'t the same'); - - setTimeout(function () { - done(); - }, 1); - }); - // .on('error', function (value) { - // console.log('error', value); - // done(); - // }); - - }); - - }); -} - -describe('typical usage', function() { - runTests(getEthContractInstance); - - it('should update contract instance provider when assigned a provider to eth instance that contract instance came from', function () { - var provider1 = new FakeIpcProvider(); - var provider2 = new FakeHttpProvider(); - - var eth = new Eth(provider1); - var contract = new eth.Contract(abi, address); - assert.deepEqual(contract.currentProvider, provider1); - assert.deepEqual(eth.currentProvider, provider1); - - eth.setProvider(provider2); - assert.deepEqual(contract.currentProvider, provider2); - assert.deepEqual(eth.currentProvider, provider2); - }); - - it('should update contract instance provider when calling setProvider on itself', function () { - var provider1 = new FakeIpcProvider(); - var provider2 = new FakeHttpProvider(); - - var eth = new Eth(provider1); - var contract = new eth.Contract(abi, address); - assert.deepEqual(contract.currentProvider, provider1); - - contract.setProvider(provider2); - assert.deepEqual(contract.currentProvider, provider2); - }); - - it('errors when invoked without the "new" operator', function () { - try { - var provider = new FakeHttpProvider(); - var eth = new Eth(provider); - - eth.Contract(abi, address); - - assert.fail(); - } catch(err) { - assert(err.message.includes('the "new" keyword')); - } - }); - - it('should deploy a contract, sign transaction, and return contract instance', async function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - eth.accounts.wallet.add(account.privateKey); - - const tx = await eth.accounts.wallet[0].signTransaction({ - data: '0x1234567000000000000000000000000' + account.address.toLowerCase().replace('0x', '') + '00000000000000000000000000000000000000000000000000000000000000c8', - from: account.address.toLowerCase(), - gas: '0xd658', - gasPrice: '0xbb8', - chainId: '0x1', - nonce: '0x1', - chain: 'mainnet', - hardfork: 'petersburg' - }); - - provider.injectValidation(function (payload) { - const expected = tx.rawTransaction; - assert.equal(payload.method, 'eth_sendRawTransaction'); - assert.deepEqual(payload.params, [expected]); - }); - - provider.injectResult('0x5550000000000000000000000000000000000000000000000000000000000032'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x5550000000000000000000000000000000000000000000000000000000000032']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x5550000000000000000000000000000000000000000000000000000000000032']); - }); - - provider.injectResult({ - contractAddress: addressLowercase, - blockHash: '0xffdd' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getCode'); - assert.deepEqual(payload.params, [addressLowercase, 'latest']); - }); - provider.injectResult('0x321'); - - - var contract = new eth.Contract(abi); - - let heardTxHashEvent = false; - let heardReceiptEvent = false; - - await new Promise(function(resolve, reject){ - contract.deploy({ - data: '0x1234567', - arguments: [account.address, 200] - }).send({ - from: account.address, - gas: 54872, - gasPrice: 3000, - chainId: 1, - nonce: 1, - chain: 'mainnet', - hardfork: 'petersburg' - }) - .on('transactionHash', function (value) { - assert.equal('0x5550000000000000000000000000000000000000000000000000000000000032', value); - heardTxHashEvent = true; - }) - .on('receipt', function (receipt) { - assert.equal(address, receipt.contractAddress); - assert.isNull(contract.options.address); - heardReceiptEvent = true; - }) - .then(function (newContract) { - assert.equal(newContract.options.address, address); - assert.isTrue(newContract !== contract, 'contract objects shouldn\'t the same'); - assert.isTrue(heardTxHashEvent, 'transactionHash event should have fired'); - assert.isTrue(heardReceiptEvent, 'receipt event should have fired'); - resolve(); - }); - }); - }); - // TODO add error check -}); - -describe('standalone usage', function() { - runTests(getStandAloneContractInstance); -}); diff --git a/test/e2e.contract.deploy.js b/test/e2e.contract.deploy.js deleted file mode 100644 index 3301555887b..00000000000 --- a/test/e2e.contract.deploy.js +++ /dev/null @@ -1,291 +0,0 @@ -var assert = require('assert'); -var Basic = require('./sources/Basic'); -var Reverts = require('./sources/Reverts'); -var utils = require('./helpers/test.utils'); -var Web3 = utils.getWeb3(); - -describe('contract.deploy [ @E2E ]', function() { - var web3; - var accounts; - var basic; - var reverts; - var noBytecode; - var options; - - // Error message variants - var revertMessage = "revert"; - var couldNotBeStoredMessage = "code couldn't be stored"; - var creationWithoutDataMessage = "contract creation without any data provided"; - - var basicOptions = { - data: Basic.bytecode, - gasPrice: '1', - gas: 4000000 - }; - - var revertsOptions = { - data: Reverts.bytecode, - gasPrice: '1', - gas: 4000000 - } - - var noBytecodeOptions = { - data: '0x', - gasPrice: '1', - gas: 4000000 - } - - describe('http', function() { - before(async function(){ - web3 = new Web3('http://localhost:8545'); - accounts = await web3.eth.getAccounts(); - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - reverts = new web3.eth.Contract(Reverts.abi, revertsOptions); - noBytecode = new web3.eth.Contract(Basic.abi, noBytecodeOptions); - }) - - it('returns an instance', async function(){ - var instance = await basic - .deploy() - .send({from: accounts[0]}); - - assert(web3.utils.isAddress(instance.options.address)); - }); - - // Clients reject this kind of OOG is early because - // the gas is obviously way too low. - it('errors on "intrinic gas too low" OOG', async function(){ - try { - await basic - .deploy() - .send({from: accounts[0], gas: 1000}); - - assert.fail(); - } catch(err){ - assert(err.message.includes('gas')) - assert(err.receipt === undefined); - } - }); - - // Clients reject this kind of OOG when the EVM runs out of gas - // while running the code. A contractAddress is set on the - // receipt, but the status will be false. - it('errors on OOG reached while running EVM', async function(){ - const estimate = await basic - .deploy() - .estimateGas({from: accounts[0]}) - - const gas = estimate - 1000; - - try { - await basic - .deploy() - .send({from: accounts[0], gas: gas}); - - assert.fail(); - } catch(err){ - assert(err.message.includes(couldNotBeStoredMessage)); - assert(err.receipt.status === false); - } - }); - - // Geth immediately rejects a zero length bytecode without mining, - // Ganache accepts and mines it, returning a receipt with status === true - it('errors deploying a zero length bytecode', async function(){ - try { - await noBytecode - .deploy() - .send({from: accounts[0]}); - - assert.fail(); - } catch(err){ - assert( - err.message.includes(creationWithoutDataMessage) || - err.message.includes(couldNotBeStoredMessage) - ); - } - }) - - it('errors on revert', async function(){ - try { - await reverts - .deploy() - .send({from: accounts[0]}); - - assert.fail(); - } catch(err){ - assert( - err.message.includes(couldNotBeStoredMessage) || - err.message.includes(revertMessage) - ); - - assert(err.receipt.status === false); - } - }); - - it('fires the confirmation handler', function(){ - // Http confirmations poll at 1s interval. - // Automine has a 2s interval. - if (!process.env.GETH_AUTOMINE) return; - - return new Promise(async (resolve, reject) => { - var startBlock = await web3.eth.getBlockNumber(); - - await basic - .deploy() - .send({from: accounts[0]}) - .on('confirmation', async (number, receipt, latestBlockHash) => { - assert(receipt.contractAddress); - - if (number === 1) { // Confirmation numbers are zero indexed - var endBlock = await web3.eth.getBlock('latest'); - assert(endBlock.number >= (startBlock + 2)); - assert(endBlock.hash === latestBlockHash); - resolve(); - } - }) - }); - }); - }); - - describe('ws', function() { - // Websockets extremely erratic for geth instamine... - if (process.env.GETH_INSTAMINE) return; - var port; - - before(async function(){ - port = utils.getWebsocketPort(); - - web3 = new Web3('ws://localhost:' + port); - accounts = await web3.eth.getAccounts(); - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - reverts = new web3.eth.Contract(Reverts.abi, revertsOptions); - }) - - it('returns an instance', async function(){ - var instance = await basic - .deploy() - .send({from: accounts[0]}) - - assert(web3.utils.isAddress(instance.options.address)); - }); - - it('errors on OOG', async function(){ - try { - await basic - .deploy() - .send({from: accounts[0], gas: 1000}); - - assert.fail(); - } catch(err){ - assert(err.message.includes('gas')) - } - }); - - it('errors on revert', async function(){ - try { - await reverts - .deploy() - .send({from: accounts[0]}); - - assert.fail(); - } catch(err){ - assert( - err.message.includes(couldNotBeStoredMessage) || - err.message.includes(revertMessage) - ); - } - }); - - it('fires the sending event with the payload', function(done){ - basic - .deploy() - .send({from: accounts[0]}) - .on('sending', (payload) => { - assert(basic.options.data === payload.params[0].data) - done(); - }) - }); - - it('fires the sent event with the payload', function(done){ - basic - .deploy() - .send({from: accounts[0]}) - .on('sent', (payload) => { - assert(basic.options.data === payload.params[0].data) - done(); - }) - }); - - it('fires the transactionHash event', function(done){ - basic - .deploy() - .send({from: accounts[0]}) - .on('transactionHash', hash => { - assert(web3.utils.isHex(hash)) - done(); - }) - }); - - it('fires the receipt event', function(done){ - basic - .deploy() - .send({from: accounts[0]}) - .on('receipt', receipt => { - assert(web3.utils.isAddress(receipt.contractAddress)) - done(); - }) - }) - - it('fires the confirmation handler', function(){ - return new Promise(async (resolve, reject) => { - var startBlock = await web3.eth.getBlockNumber(); - - await basic - .deploy() - .send({from: accounts[0]}) - .on('confirmation', async (number, receipt, latestBlockHash) => { - if (number === 1) { // Confirmation numbers are zero indexed - var endBlock = await web3.eth.getBlock('latest'); - assert(endBlock.number >= (startBlock + 2)); - assert(endBlock.hash === latestBlockHash); - resolve(); - } - }) - - // Necessary for instamine, should not interfere with automine. - await utils.mine(web3, accounts[0]); - }); - }); - - it('fires the error handler on OOG', function(done){ - basic - .deploy() - .send({from: accounts[0], gas: 1000}) - .on('error', err => { - assert(err.message.includes('gas')) - done(); - }) - }) - - it('fires the error handler on revert', function(done){ - reverts - .deploy() - .send({from: accounts[0]}) - .on('error', err => { - assert( - err.message.includes(couldNotBeStoredMessage) || - err.message.includes(revertMessage) - ); - done(); - }) - }) - - it('can connect over wss with username:password header', function(){ - const _web3 = new Web3('wss://usr:psswrd@localhost:' + port); - }); - }); -}); - diff --git a/test/e2e.contract.events.js b/test/e2e.contract.events.js deleted file mode 100644 index 2b51a570694..00000000000 --- a/test/e2e.contract.events.js +++ /dev/null @@ -1,461 +0,0 @@ -var assert = require('assert'); -var Basic = require('./sources/Basic'); -var Child = require('./sources/Child'); -var Parent = require('./sources/Parent'); -var utils = require('./helpers/test.utils'); -var Web3 = utils.getWeb3(); - -describe('contract.events [ @E2E ]', function() { - // `getPastEvents` not working with Geth instamine over websockets. - if (process.env.GETH_INSTAMINE) return; - - var web3; - var accounts; - var basic; - var instance; - var port; - - var basicOptions = { - data: Basic.bytecode, - gasPrice: '1', - gas: 4000000 - }; - - beforeEach(async function(){ - port = utils.getWebsocketPort(); - - web3 = new Web3('ws://localhost:' + port); - accounts = await web3.eth.getAccounts(); - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - instance = await basic.deploy().send({from: accounts[0]}); - }); - - it('contract.getPastEvents', async function(){ - await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - - await instance - .methods - .firesEvent(accounts[0], 2) - .send({from: accounts[0]}); - - const events = await instance.getPastEvents({ - fromBlock: 0, - toBlock: 'latest' - }); - - assert.equal(events.length, 2); - assert.equal(events[0].event, 'BasicEvent'); - assert.equal(events[1].event, 'BasicEvent'); - assert.notEqual(events[0].id, events[1].id); - }); - - it('contract.events.', function(){ - return new Promise(async resolve => { - instance - .events - .BasicEvent({ - fromBlock: 0 - }) - .on('data', function(event) { - assert.equal(event.event, 'BasicEvent'); - this.removeAllListeners(); - resolve(); - }); - - await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - }); - }); - - - it('works also when toBlock is passed to contract.events.', function () { - const originalWarn = console.warn - let message - console.warn = function(str) { message = str } - - return new Promise(async resolve => { - instance - .events - .BasicEvent({ - fromBlock: 0, - toBlock: 'latest' - }).on('data', function(event) { - assert.equal(event.event, 'BasicEvent'); - this.removeAllListeners(); - resolve(); - }); - - assert.equal(message, 'Invalid option: toBlock. Use getPastEvents for specific range.'); - console.warn = originalWarn - - await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - }); - }); - - it('works also when toBlock is passed to contract.events.allEvents', function () { - const originalWarn = console.warn - let message - console.warn = function(str) { message = str } - - return new Promise(async (resolve, reject) => { - instance - .events - .allEvents({ - fromBlock: 0, - toBlock: 'latest' - }).on('data', function(event) { - this.removeAllListeners(); - resolve(); - }); - - assert.equal(message, 'Invalid option: toBlock. Use getPastEvents for specific range.'); - console.warn = originalWarn - - await instance - .methods - .firesEvent(accounts[0], 1) - .send({ from: accounts[0] }); - }); - }); - - it('should not hear the error handler when connection.closed() called', function(){ - this.timeout(15000); - - let failed = false; - - return new Promise(async (resolve, reject) => { - instance - .events - .BasicEvent({ - fromBlock: 0 - }) - .on('error', function(err) { - failed = true; - this.removeAllListeners(); - reject(new Error('err listener should not hear connection.close')); - }); - - await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - - web3.currentProvider.connection.close(); - - // Resolve only if we haven't already rejected - setTimeout(() => { if(!failed) resolve() }, 2500) - }); - }); - - it('should not hear the error handler when provider.disconnect() called', function(){ - this.timeout(15000); - - let failed = false; - - return new Promise(async (resolve, reject) => { - instance - .events - .BasicEvent({ - fromBlock: 0 - }) - .on('error', function(err) { - failed = true; - this.removeAllListeners(); - reject(new Error('err listener should not hear provider.disconnect')); - }); - - await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - - web3.currentProvider.disconnect(); - - // Resolve only if we haven't already rejected - setTimeout(() => { if(!failed) resolve() }, 2500) - }); - }); - - // Regression test for a race-condition where a fresh web3 instance - // subscribing to past events would have its call parameters deleted while it - // made initial Websocket handshake and return an incorrect response. - it('can immediately listen for events in the past', async function(){ - this.timeout(15000); - - const first = await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - - const second = await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - - // Go forward one block... - await utils.mine(web3, accounts[0]); - const latestBlock = await web3.eth.getBlockNumber(); - - assert(first.blockNumber < latestBlock); - assert(second.blockNumber < latestBlock); - - // Re-instantiate web3 & instance to simulate - // subscribing to past events as first request - web3 = new Web3('ws://localhost:' + port); - const newInstance = new web3.eth.Contract(Basic.abi, instance.options.address); - - let counter = 0; - await new Promise(async resolve => { - newInstance - .events - .BasicEvent({ - fromBlock: 0 - }) - .on('data', function(event) { - counter++; - assert(event.blockNumber < latestBlock); - - if (counter === 2){ - this.removeAllListeners(); - resolve(); - } - }); - }); - }); - - it('hears events when subscribed to "logs" (emitter)', function(){ - return new Promise(async function(resolve, reject){ - - assert(typeof instance.options.address === 'string'); - assert(instance.options.address.length > 0); - - const subscription = web3.eth.subscribe( - "logs", - { - address: instance.options.address - }) - .once("data", function(log) { - assert.equal(log.address, instance.options.address); - subscription.unsubscribe(); - resolve(); - }); - - await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - }); - }); - - it('hears events when subscribed to "logs" (callback)', function(){ - return new Promise(async function(resolve, reject){ - - assert(typeof instance.options.address === 'string'); - assert(instance.options.address.length > 0); - - const subscription = web3.eth.subscribe( - "logs", - { - address: instance.options.address - }, - function(error, log) { - assert.equal(log.address, instance.options.address); - subscription.unsubscribe(); - resolve(); - }); - - await instance - .methods - .firesEvent(accounts[0], 1) - .send({from: accounts[0]}); - }); - }); - - // Test models event signature shadowing when one contract calls another. - // Child and parent contracts have an event named `similar` which has the same - // function signature but indexes arguments differently. - it('handles child events with shadowed signatures', async function(){ - this.timeout(25000); - - let contract; - - const options = { - gasPrice: '1', - gas: 4000000 - }; - - options.data = Child.bytecode; - contract = new web3.eth.Contract(Child.abi, options); - const child = await contract.deploy().send({from: accounts[0]}); - - options.data = Parent.bytecode; - contract = new web3.eth.Contract(Parent.abi, options); - const parent = await contract.deploy().send({from: accounts[0]}); - - await parent - .methods - .fireChildSimilarEvent(child.options.address) - .send({from: accounts[0]}); - - await parent - .methods - .fireChildIdenticalEvent(child.options.address) - .send({from: accounts[0]}); - - const childEvents = await child.getPastEvents({ - fromBlock: 0, - toBlock: 'latest' - }); - - const parentEvents = await parent.getPastEvents({ - fromBlock: 0, - toBlock: 'latest' - }); - - assert.equal(childEvents.length, 2); - assert.equal(parentEvents.length, 0); - - assert.equal(childEvents[0].event, 'Similar'); - assert.equal(typeof childEvents[0].returnValues._owner, 'string'); - - assert.equal(childEvents[1].event, 'Identical'); - assert.equal(typeof childEvents[1].returnValues.childA, 'string'); - }); - - // This test only runs against the ganache client launched in scripts/e2e.ganache.sh - // It's too complicated for geth auto-mining (we'd have to poll for blocks) - // and geth instamine's websockets connection is too fragile for the tests in this file. - it('backfills missed events when auto-reconnecting', function(){ - if(!process.env.GANACHE) return; - this.timeout(10000); - - let counter = 0; - const acc = accounts[0]; - - // Create a parallel connection & contract instance - // so we can trigger events while the WS provider is down... - const _web3 = new Web3('http://localhost:8545'); - const shadow = new _web3.eth.Contract(Basic.abi, instance.options.address); - - // Create a reconnect-enabled WS provider and set the default Web3 with it. - const provider = new Web3.providers.WebsocketProvider( - 'ws://localhost:' + port, - { - reconnect: { - auto: true, - delay: 4000, - maxAttempts: 1 - } - } - ); - - web3.setProvider(provider); - - return new Promise(async function (resolve) { - instance - .events - .BasicEvent() - .on('data', function(event) { - counter++; - - if (counter === 2){ - assert(finalBlock === event.blockNumber + 2); - this.removeAllListeners(); - resolve(); - } - }); - - // First: a regular event - const firstReceipt = await instance.methods.firesEvent(acc, 1).send({from: acc}); - - // Close connection and let it settle... - provider.connection.close(4000); - await utils.waitSeconds(1); - - // Submit another event on parallel connection and mine forward 2 blocks - const secondReceipt = await shadow.methods.firesEvent(acc, 1).send({from: acc}); - utils.mine(_web3, acc); - utils.mine(_web3, acc); - - const finalBlock = await _web3.eth.getBlockNumber(); - assert(finalBlock === secondReceipt.blockNumber + 2) - }); - }); - - it('when event param is a simple string', async function(){ - const msg = 'simplestring'; - - await instance - .methods - .firesStringEvent(msg) - .send({from: accounts[0]}); - - const events = await instance.getPastEvents({ - fromBlock: 0, - toBlock: 'latest' - }); - - assert.equal(events[0].returnValues.str, msg) - }); - - // Malformed utf-8 sequence in the following two tests comes from - // https://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html - // Section: 3.1.8 - it('when an invalid utf-8 string is passed in JS as param to emit', async function(){ - const msg = '�������'; - - await instance - .methods - .firesStringEvent(msg) - .send({from: accounts[0]}); - - const events = await instance.getPastEvents({ - fromBlock: 0, - toBlock: 'latest' - }); - - assert.equal(msg, events[0].returnValues.str) - }); - - it('when Solidity emits an invalid utf-8 string', async function(){ - await instance - .methods - .firesIllegalUtf8StringEvent() - .send({from: accounts[0]}); - - const events = await instance.getPastEvents({ - fromBlock: 0, - toBlock: 'latest' - }); - - assert.equal('�������', events[0].returnValues.str) - }); - - it('when wide unicode characters are passed in JS as param to emit', async function(){ - const msg = '💐'; - - await instance - .methods - .firesStringEvent(msg) - .send({from: accounts[0]}); - - const events = await instance.getPastEvents({ - fromBlock: 0, - toBlock: 'latest' - }); - - assert(msg.length > 'a'.length); - assert.equal(msg, events[0].returnValues.str) - }) - - -}); diff --git a/test/e2e.ens.js b/test/e2e.ens.js deleted file mode 100644 index 13b3cc4145d..00000000000 --- a/test/e2e.ens.js +++ /dev/null @@ -1,182 +0,0 @@ -const setupENS = require('../scripts/js/ens'); -const utils = require('./helpers/test.utils'); -const Web3 = utils.getWeb3(); -const assert = require('assert'); - -describe('ENS [ @E2E ]', function () { - this.timeout(50000); - - let web3; - let account; - let accounts; - let addresses; - let registryAddr; - let resolverAddr; - let options; - - before(async function(){ - web3 = new Web3('http://localhost:8545'); - accounts = await web3.eth.getAccounts(); - account = accounts[0]; - - addresses = await setupENS(web3); - registryAddr = addresses.registry; - resolverAddr = addresses.resolver; - web3.eth.ens.registryAddress = registryAddr; - - options = { - from: account, - gas: 4000000, - gasPrice: 1 - } - }); - - it('custom registry got defined in the ENS module', function () { - assert(web3.eth.ens.registryAddress, registryAddr); - }); - - it('should return the subnode owner of "resolver"', async function () { - const owner = await web3.eth.ens.registry.getOwner('resolver'); - - assert.equal( - owner, - account - ); - }); - - it('should fetch the registered resolver for the subnode "resolver"', async function () { - const resolver = await web3.eth.ens.registry.getResolver('resolver'); - assert.equal(resolver.options.address, resolverAddr); - }); - - it('should return the addr record for the subnode "resolver"', async function () { - const address = await web3.eth.ens.getAddress('resolver'); - - assert.equal( - address, - '0x0000000000000000000000000000000000000001' - ); - }); - - it('should get/set a publickey', async function(){ - const x = "0x3078303030303030303030303030303030303030303030303030303030303030"; - const y = "0x3030303030303030303030303030303030303030303030303030303030303030"; - - await web3.eth.ens.setPubkey('resolver', x, y, options); - const coords = await web3.eth.ens.getPubkey('resolver'); - - assert.equal(coords.x, x); - assert.equal(coords.y, y); - }); - - it('should error when calling "getContent" if resolver does not support it', async function () { - try { - await web3.eth.ens.getContent('resolver'); - assert.fail(); - } catch(err){ - assert(err.message.includes(resolverAddr)); - assert(err.message.includes('does not implement requested method: "content"')) - } - }) - - it('should error when calling "setContent" if resolver does not support it', async function () { - try { - await web3.eth.ens.setContent('resolver', web3.utils.sha3('test')); - assert.fail(); - } catch(err){ - assert(err.message.includes(resolverAddr)); - assert(err.message.includes('does not implement requested method: "setContent"')) - } - }); - - // This test must be run before any contentHashes are set - it('getContenthash return object keys are null if no contentHash is set', async function(){ - const val = await web3.eth.ens.getContenthash('resolver'); - - assert.equal(val.protocolType, null); - assert.equal(val.decoded, null); - assert.equal(val.error, null); - }); - - /** - * NB: hash values for these tests are borrowed from unit tests at @ensdomains/ui - * Link: https://github.com/ensdomains/ui/blob/3e62e440b53466eeec9dd1c63d73924eefbd88c1/src/utils/contents.test.js#L1-L151 - */ - it('should get/set an IPFS contenthash (ipfs://)', async function(){ - const prefix = "ipfs://" - const hash = "QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn"; - - await web3.eth.ens.setContenthash('resolver', prefix + hash, options); - const val = await web3.eth.ens.getContenthash('resolver'); - - assert.equal(val.protocolType, 'ipfs'); - assert.equal(val.decoded, hash); - }); - - it('should get/set an IPFS contenthash (/ipfs/)', async function(){ - const prefix = "/ipfs/" - const hash = "QmaEBknbGT4bTQiQoe2VNgBJbRfygQGktnaW5TbuKixjYL"; - - await web3.eth.ens.setContenthash('resolver', prefix + hash, options); - const val = await web3.eth.ens.getContenthash('resolver'); - - assert.equal(val.protocolType, 'ipfs'); - assert.equal(val.decoded, hash); - }); - - it('should get/set a bzz contenthash', async function(){ - const prefix = "bzz://"; - const hash = "d1de9994b4d039f6548d191eb26786769f580809256b4685ef316805265ea162"; - - await web3.eth.ens.setContenthash('resolver', prefix + hash, options); - const val = await web3.eth.ens.getContenthash('resolver'); - - assert.equal(val.protocolType, 'bzz'); - assert.equal(val.decoded, hash); - }); - - it('should get/set an onion contenthash', async function(){ - const prefix = "onion://" - const hash = "3g2upl4pq6kufc4m"; - - await web3.eth.ens.setContenthash('resolver', prefix + hash, options); - const val = await web3.eth.ens.getContenthash('resolver'); - - assert.equal(val.protocolType, 'onion'); - assert.equal(val.decoded, hash); - }); - - it('should get/set an onion3 contenthash', async function(){ - const prefix = "onion3://" - const hash = "p53lf57qovyuvwsc6xnrppyply3vtqm7l6pcobkmyqsiofyeznfu5uqd"; - - await web3.eth.ens.setContenthash('resolver', prefix + hash, options); - const val = await web3.eth.ens.getContenthash('resolver'); - - assert.equal(val.protocolType, 'onion3'); - assert.equal(val.decoded, hash); - }); - - it('setContenthash errors when encoding an invalid contenthash (promise)', async function(){ - // Missing required protocol prefix - const hash = "p53lf57qovyuvwsc6xnrppyply3vtqm7l6pcobkmyqsiofyeznfu5uqd"; - - try { - await web3.eth.ens.setContenthash('resolver', hash, options); - assert.fail(); - } catch(err) { - assert(err.message.includes(`Could not encode ${hash}`)); - } - }); - - it('setContentHash errors when encoding an invalid contenthash (callback)', function(done){ - // Missing required protocol prefix - const hash = "p53lf57qovyuvwsc6xnrppyply3vtqm7l6pcobkmyqsiofyeznfu5uqd"; - - web3.eth.ens.setContenthash('resolver', hash, options, function(err, result){ - assert(err.message.includes(`Could not encode ${hash}`)); - done(); - }); - }); -}); - diff --git a/test/e2e.method.call.js b/test/e2e.method.call.js deleted file mode 100644 index c9641d13418..00000000000 --- a/test/e2e.method.call.js +++ /dev/null @@ -1,102 +0,0 @@ -var assert = require('assert'); -var Basic = require('./sources/Basic'); -var Misc = require('./sources/Misc'); -var utils = require('./helpers/test.utils'); -var Web3 = utils.getWeb3(); - -describe('method.call [ @E2E ]', function () { - var web3; - var accounts; - var basic; - var instance; - var options; - - var basicOptions = { - data: Basic.bytecode, - gasPrice: '1', - gas: 4000000 - }; - - var miscOptions = { - data: Misc.bytecode, - gasPrice: '1', - gas: 4000000 - }; - - describe('http', function () { - before(async function () { - web3 = new Web3('http://localhost:8545'); - accounts = await web3.eth.getAccounts(); - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - instance = await basic.deploy().send({from: accounts[0]}); - }) - - it('retrieves a uint value', async function () { - var expected = '1'; - - await instance - .methods - .setValue(expected) - .send({from: accounts[0]}); - - var value = await instance - .methods - .getValue() - .call({from: accounts[0]}); - - assert.equal(value, expected); - }); - - it('errors correctly when abi and bytecode do not match', async function () { - // Misc n.eq Basic - var wrong = new web3.eth.Contract(Basic.abi, miscOptions); - var wrongInstance = await wrong.deploy().send({from: accounts[0]}); - - try { - await wrongInstance - .methods - .getValue() - .call({from: accounts[0]}); - - assert.fail(); - - } catch (err) { - // ganache | geth <= 1.9.13 - const nullDataResponse = err.message.includes("Returned values aren't valid") && - err.message.includes('the correct ABI'); - - // geth >= 1.9.15 - const gethErrResponse = err.message.includes("revert"); - - assert(nullDataResponse || gethErrResponse); - } - }) - }); - - describe('revert handling', function () { - before(async function () { - web3 = new Web3('http://localhost:8545'); - accounts = await web3.eth.getAccounts(); - - web3.eth.handleRevert = true; - basic = new web3.eth.Contract(Basic.abi, basicOptions); - instance = await basic.deploy().send({from: accounts[0]}); - }); - - it('returns the expected revert reason string', async function () { - try { - await instance - .methods - .reverts() - .call({from: accounts[0]}); - - assert.fail(); - } catch(error) { - assert(error.message.includes('reverted')); - assert.equal(error.reason, 'REVERTED WITH REVERT'); - assert.equal(error.signature, 'Error(String)'); - } - }); - }); -}); diff --git a/test/e2e.method.send.js b/test/e2e.method.send.js deleted file mode 100644 index b17fb403484..00000000000 --- a/test/e2e.method.send.js +++ /dev/null @@ -1,363 +0,0 @@ -var assert = require('assert'); -var Basic = require('./sources/Basic'); -var utils = require('./helpers/test.utils'); -var Web3 = utils.getWeb3(); - -describe('method.send [ @E2E ]', function () { - var web3; - var accounts; - var basic; - var instance; - var options; - - var basicOptions = { - data: Basic.bytecode, - gasPrice: '1', - gas: 4000000 - }; - - describe('http', function () { - before(async function () { - web3 = new Web3('http://localhost:8545'); - accounts = await web3.eth.getAccounts(); - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - instance = await basic.deploy().send({from: accounts[0]}); - }); - - it('returns a receipt', async function () { - var receipt = await instance - .methods - .setValue('1') - .send({from: accounts[0]}); - - assert(receipt.status === true); - assert(web3.utils.isHexStrict(receipt.transactionHash)); - }); - - it('errors on OOG', async function () { - try { - await instance - .methods - .setValue('1') - .send({from: accounts[0], gas: 100}); - - assert.fail(); - - } catch (err) { - assert(err.message.includes('gas')); - } - }); - - it('errors on revert', async function () { - try { - await instance - .methods - .reverts() - .send({from: accounts[0]}); - - assert.fail(); - - } catch (err) { - var receipt = utils.extractReceipt(err.message); - - assert(err.message.includes('revert')); - assert(receipt.status === false); - } - }); - - describe('transactionPollingTimeout', function(){ - // Test requires a node auto mining at intervals - if(!process.env.GETH_AUTOMINE) return; - - // Geth interval is 2s so these txs w/ .25s polling timeouts - // should error before a single block resolves. - it('is configurable for web3.eth methods', async function(){ - web3.eth.transactionPollingTimeout = .25; - - try { - await web3.eth.sendTransaction({ - from: accounts[0], - to: accounts[1], - value: web3.utils.toWei('1', 'ether'), - gas: 21000, - gasPrice: 1 - }); - assert.fail(); - } catch(err){ - assert(err.message.includes('Transaction was not mined within 0.25 seconds')) - } - }); - - it('is configurable for contract methods', async function(){ - web3.eth.transactionPollingTimeout = .25; - - try { - await instance - .methods - .setValue('1') - .send({from: accounts[0]}); - assert.fail(); - } catch(err){ - assert(err.message.includes('Transaction was not mined within 0.25 seconds')) - } - }) - }); - }); - - describe('ws', function () { - // Websockets extremely erratic for geth instamine... - if (process.env.GETH_INSTAMINE) return; - - before(async function () { - var port = utils.getWebsocketPort(); - - web3 = new Web3('ws://localhost:' + port); - accounts = await web3.eth.getAccounts(); - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - instance = await basic.deploy().send({from: accounts[0]}); - }) - - it('returns a receipt', async function () { - var receipt = await instance - .methods - .setValue('1') - .send({from: accounts[0]}); - - assert(receipt.status === true); - assert(web3.utils.isHexStrict(receipt.transactionHash)); - }); - - it('errors on OOG', async function () { - try { - await instance - .methods - .setValue('1') - .send({from: accounts[0], gas: 100}); - - assert.fail(); - - } catch (err) { - assert(err.message.includes('gas')); - } - }); - - it('errors on revert', async function () { - try { - await instance - .methods - .reverts() - .send({from: accounts[0]}); - - assert.fail(); - - } catch (err) { - var receipt = utils.extractReceipt(err.message); - - assert(err.message.includes('revert')); - assert(receipt.status === false); - } - }); - - it('fires the transactionHash event', function (done) { - instance - .methods - .setValue('1') - .send({from: accounts[0]}) - .on('transactionHash', hash => { - assert(web3.utils.isHex(hash)); - done(); - }); - }); - - it('fires the receipt event', function (done) { - instance - .methods - .setValue('1') - .send({from: accounts[0]}) - .on('receipt', receipt => { - assert(receipt.status === true); - done(); - }); - }); - - it('fires the confirmation handler', function () { - return new Promise(async (resolve, reject) => { - - var startBlock = await web3.eth.getBlockNumber(); - - await instance - .methods - .setValue('1') - .send({from: accounts[0]}) - .on('confirmation', async (number, receipt) => { - if (number === 1) { // Confirmation numbers are zero indexed - var endBlock = await web3.eth.getBlockNumber(); - assert(endBlock >= (startBlock + 2)); - resolve(); - } - }); - - // Necessary for instamine, should not interfere with automine. - await utils.mine(web3, accounts[0]); - }); - }); - - it('fires the error handler on OOG', function (done) { - instance - .methods - .setValue('1') - .send({from: accounts[0], gas: 100}) - .on('error', err => { - assert(err.message.includes('gas')); - done(); - }); - }); - - it('fires the error handler on revert', function (done) { - instance - .methods - .reverts() - .send({from: accounts[0]}) - .on('error', err => { - assert(err.message.includes('revert')); - done(); - }); - }); - }); - - describe('with revert handling activated', function () { - before(async function () { - web3 = new Web3('http://localhost:8545'); - accounts = await web3.eth.getAccounts(); - - web3.eth.handleRevert = true; - basic = new web3.eth.Contract(Basic.abi, basicOptions); - - instance = await basic.deploy().send({from: accounts[0]}); - }); - - it('errors on OOG', async function () { - try { - await instance - .methods - .setValue('1') - .send({from: accounts[0], gas: 100}); - - assert.fail(); - - } catch (err) { - assert(err.message.includes('gas')); - } - }); - - it('Promise throws on revert', async function () { - try { - await instance - .methods - .reverts() - .send({from: accounts[0]}); - - assert.fail(); - - } catch (err) { - assert.equal(err.signature, 'Error(String)'); - assert.equal(err.reason, 'REVERTED WITH REVERT'); - assert(err.message.includes('reverted')); - } - }); - - it('Promise throws on failing require with a revert reason given', async function () { - try { - await instance - .methods - .requireWithReason() - .send({from: accounts[0]}); - - assert.fail(); - - } catch (err) { - assert.equal(err.signature, 'Error(String)'); - assert.equal(err.reason, 'REVERTED WITH REQUIRE'); - assert(err.message.includes('reverted')); - } - }); - - it('Promise throws on failing require without a revert reason given', async function () { - try { - await instance - .methods - .requireWithoutReason() - .send({from: accounts[0]}); - - assert.fail(); - - } catch (err) { - var receipt = utils.extractReceipt(err.message); - - assert.equal(receipt.status, false); - assert.equal(err.signature, undefined); - assert.equal(err.reason, undefined); - assert(err.message.includes('EVM')); - } - }); - - it('fires the error handler on OOG', function (done) { - instance - .methods - .setValue('1') - .send({from: accounts[0], gas: 100}) - .on('error', err => { - assert(err.message.includes('gas')); - done(); - }); - }); - - it('fires the error handler on failing require without a revert reason given', function (done) { - instance - .methods - .requireWithoutReason() - .send({from: accounts[0]}) - .on('error', (err, receipt) => { - assert.equal(receipt.status, false); - assert.equal(err.signature, undefined); - assert.equal(err.reason, undefined); - assert(err.message.includes('EVM')); - - done(); - }); - }); - - it('fires the error handler on failing require with a revert reason given', function (done) { - instance - .methods - .requireWithReason() - .send({from: accounts[0]}) - .on('error', (err, receipt) => { - assert.equal(receipt.status, false); - assert.equal(err.signature, 'Error(String)'); - assert.equal(err.reason, 'REVERTED WITH REQUIRE'); - assert(err.message.includes('reverted')); - - done(); - }); - }); - - it('fires the error handler on revert', function (done) { - instance - .methods - .reverts() - .send({from: accounts[0]}) - .on('error', (err, receipt) => { - assert.equal(receipt.status, false); - assert.equal(err.signature, 'Error(String)'); - assert.equal(err.reason, 'REVERTED WITH REVERT'); - assert(err.message.includes('reverted')); - - done(); - }); - }); - }); -}); - diff --git a/test/e2e.method.signing.js b/test/e2e.method.signing.js deleted file mode 100644 index 3976a000606..00000000000 --- a/test/e2e.method.signing.js +++ /dev/null @@ -1,419 +0,0 @@ -var assert = require('assert'); -var EJSCommon = require('ethereumjs-common'); -var EJSTx = require('ethereumjs-tx'); -var Basic = require('./sources/Basic'); -var utils = require('./helpers/test.utils'); -var Web3 = utils.getWeb3(); - -describe('transaction and message signing [ @E2E ]', function() { - let web3; - let accounts; - let wallet; - let basic; - let instance; - - const basicOptions = { - data: Basic.bytecode, - gasPrice: '1', - gas: 4000000 - }; - - before(async function(){ - web3 = new Web3('http://localhost:8545'); - accounts = await web3.eth.getAccounts(); - - // Create a funded account w/ a private key - wallet = web3.eth.accounts.wallet.create(10); - - await web3.eth.sendTransaction({ - from: accounts[0], - to: wallet[0].address, - value: web3.utils.toWei('50', 'ether'), - }); - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - instance = await basic.deploy().send({from: accounts[0]}); - }); - - it('sendSignedTransaction (with eth.signTransaction)', async function(){ - // ganache does not support eth_signTransaction - if (process.env.GANACHE || global.window ) return - - const destination = wallet[1].address; - const source = accounts[0]; // Unlocked geth-dev account - - const txCount = await web3.eth.getTransactionCount(source); - - const rawTx = { - nonce: web3.utils.toHex(txCount), - to: destination, - from: source, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(21000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')) - }; - - const signed = await web3.eth.signTransaction(rawTx); - const receipt = await web3.eth.sendSignedTransaction(signed.raw); - - assert(receipt.status === true); - }); - - it('sendSignedTransaction (accounts.signTransaction with signing options)', async function(){ - const source = wallet[0].address; - const destination = wallet[1].address; - - const txCount = await web3.eth.getTransactionCount(source); - const networkId = await web3.eth.net.getId(); - const chainId = await web3.eth.getChainId(); - - - const customCommon = { - baseChain: 'mainnet', - customChain: { - name: 'custom-network', - networkId: networkId, - chainId: chainId, - }, - harfork: 'petersburg', - }; - - const txObject = { - nonce: web3.utils.toHex(txCount), - to: destination, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(21000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - common: customCommon - }; - - const signed = await web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey); - const receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction); - - assert(receipt.status === true); - }); - - it('sendSignedTransaction (accounts.signTransaction / without signing options)', async function(){ - const source = wallet[0].address; - const destination = wallet[1].address; - - const txCount = await web3.eth.getTransactionCount(source); - - const txObject = { - nonce: web3.utils.toHex(txCount), - to: destination, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(21000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - }; - - const signed = await web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey); - const receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction); - - assert(receipt.status === true); - }); - - it('accounts.signTransaction, (with callback, nonce not specified)', function(done){ - const source = wallet[0].address; - const destination = wallet[1].address; - - const txObject = { - to: destination, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(21000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - }; - - web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey, async function(err, signed){ - const receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction); - assert(receipt.status === true); - done(); - }); - }); - - it('accounts.signTransaction errors when common, chain and hardfork all defined', async function(){ - const source = wallet[0].address; - const destination = wallet[1].address; - - const txCount = await web3.eth.getTransactionCount(source); - - const txObject = { - nonce: web3.utils.toHex(txCount), - to: destination, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(21000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - chain: "ropsten", - common: {}, - hardfork: "istanbul" - }; - - try { - await web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey); - assert.fail() - } catch (err) { - assert(err.message.includes('common object or the chain and hardfork')); - } - }); - - it('accounts.signTransaction errors when chain specified without hardfork', async function(){ - const source = wallet[0].address; - const destination = wallet[1].address; - - const txCount = await web3.eth.getTransactionCount(source); - - const txObject = { - nonce: web3.utils.toHex(txCount), - to: destination, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(21000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - chain: "ropsten" - }; - - try { - await web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey); - assert.fail() - } catch (err) { - assert(err.message.includes('both values must be defined')); - } - }); - - it('accounts.signTransaction errors when hardfork specified without chain', async function(){ - const source = wallet[0].address; - const destination = wallet[1].address; - - const txCount = await web3.eth.getTransactionCount(source); - - const txObject = { - nonce: web3.utils.toHex(txCount), - to: destination, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(21000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - hardfork: "istanbul" - }; - - try { - await web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey); - assert.fail() - } catch (err) { - assert(err.message.includes('both values must be defined')); - } - }); - - it('accounts.signTransaction errors when tx signing is invalid', async function(){ - const source = wallet[0].address; - const destination = wallet[1].address; - - const txCount = await web3.eth.getTransactionCount(source); - - // Using gas === 0 / ethereumjs-tx checks this wrt common baseFee - const txObject = { - nonce: web3.utils.toHex(txCount), - to: destination, - value: web3.utils.toHex(web3.utils.toWei('0.1', 'ether')), - gasLimit: web3.utils.toHex(0), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - hardfork: "istanbul", - chain: "ropsten", - }; - - try { - await web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey); - assert.fail() - } catch (err) { - assert(err.message.includes('gas limit is too low')); - } - }) - - it('accounts.signTransaction errors when no transaction is passed', async function(){ - try { - await web3.eth.accounts.signTransaction(undefined, wallet[0].privateKey); - assert.fail() - } catch (err) { - assert(err.message.includes('No transaction object')); - } - }); - - it('wallet executes method call using chain & hardfork options', async function(){ - // Geth --dev errors with 'invalid sender' when using these options. - // Requires a custom common configuration (see next test). Ganache doesn't care - if(!process.env.GANACHE) return; - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - basic.defaultChain = 'mainnet'; - basic.defaultHardfork = 'istanbul'; - - instance = await basic - .deploy() - .send({from: wallet[0].address}); - - const receipt = await instance - .methods - .setValue('1') - .send({from: wallet[0].address}); - - assert(receipt.status === true); - assert(web3.utils.isHexStrict(receipt.transactionHash)); - }); - - it('wallet executes method call using customCommon option', async function(){ - const networkId = await web3.eth.net.getId(); - const chainId = await web3.eth.getChainId(); - - const customCommon = { - baseChain: 'mainnet', - customChain: { - name: 'custom-network', - networkId: networkId, - chainId: chainId, - }, - harfork: 'istanbul', - }; - - basic = new web3.eth.Contract(Basic.abi, basicOptions); - basic.defaultCommon = customCommon; - - instance = await basic - .deploy() - .send({from: wallet[0].address}); - - const receipt = await instance - .methods - .setValue('1') - .send({from: wallet[0].address}); - - assert(receipt.status === true); - assert(web3.utils.isHexStrict(receipt.transactionHash)); - }); - - it('transactions sent with wallet throws error correctly (with receipt)', async function(){ - const data = instance - .methods - .reverts() - .encodeABI(); - - const tx = { - from: wallet[0], - to: instance.options.address, - data: data, - gasPrice: '1', - gas: 4000000 - } - - try { - await web3.eth.sendTransaction(tx); - assert.fail(); - } catch(err){ - var receipt = utils.extractReceipt(err.message); - - assert(err.message.includes('revert')) - assert(receipt.status === false); - } - }); - - it('sendSignedTransaction reverts with reason', async function(){ - const data = instance - .methods - .reverts() - .encodeABI(); - - const source = wallet[0].address; - const txCount = await web3.eth.getTransactionCount(source); - - const txObject = { - nonce: web3.utils.toHex(txCount), - to: instance.options.address, - gasLimit: web3.utils.toHex(400000), - gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')), - data: data - }; - - const signed = await web3.eth.accounts.signTransaction(txObject, wallet[0].privateKey); - - web3.eth.handleRevert = true; - try { - await web3.eth.sendSignedTransaction(signed.rawTransaction); - assert.fail(); - } catch(err){ - assert.equal(err.receipt.status, false); - assert.equal(err.reason, "REVERTED WITH REVERT"); - } - }); - - it('transactions sent with wallet error correctly (OOG)', function(done){ - const data = instance - .methods - .reverts() - .encodeABI(); - - const tx = { - from: wallet[0], - to: instance.options.address, - data: data, - gasPrice: '1', - gas: 10 - } - - web3 - .eth - .sendTransaction(tx) - .on('error', function(err){ - assert(err.message.includes('gas')) - done(); - }) - }); - - it('eth.personal.sign', async function(){ - // ganache does not support eth_sign - if (process.env.GANACHE || global.window ) return - - const message = 'hello'; - - const signature = await web3.eth.personal.sign( - message, - accounts[1], // Unlocked geth-dev acct - "left-hand-of-darkness" // Default password at geth-dev - ); - - const recovered = await web3.eth.personal.ecRecover(message, signature); - assert.equal(accounts[1].toLowerCase(), recovered.toLowerCase()); - }); - - it('eth.accounts.sign', async function(){ - if (process.env.GANACHE || global.window ) return - - const message = 'hello'; - - const signed = web3.eth.accounts.sign(message, wallet[0].privateKey); - const recovered = await web3.eth.personal.ecRecover(message, signed.signature); - assert.equal(wallet[0].address.toLowerCase(), recovered.toLowerCase()); - }) - - // Smoke test to validate browserify's buffer polyfills (feross/buffer@5) - // A companion regression test for Webpack & feross/buffer@4.9.2 exists at: - // test/eth.accounts.webpack.js - it("encrypt then decrypt wallet", function(done) { - this.timeout(20000); - try { - const password = "qwerty"; - const addressFromWallet = wallet[0].address; - - const keystore = wallet.encrypt(password); - - // Wallet created w/ 10 accounts in before block - assert.equal(keystore.length, 10); - - wallet.decrypt(keystore, password); - assert.equal(wallet.length, 10); - - const addressFromKeystore = wallet[0].address; - assert.equal(addressFromKeystore, addressFromWallet); - done() - } catch(error) { - done(error) - } - }); -}); - diff --git a/test/e2e.minified.js b/test/e2e.minified.js deleted file mode 100644 index d39aa6295c0..00000000000 --- a/test/e2e.minified.js +++ /dev/null @@ -1,11 +0,0 @@ -// Simple check to make sure window.web3 is defined for the karma min loading tests -describe('window.Web3 is defined', function () { - - // Referencing `process` throws w/out browserify. - // We want to be skipped during the browserified units tests here. - it("loads", function(){ - try { if (process) return } catch (e) {} - - if (!window.Web3) throw new Error('"window.Web3" was not defined'); - }); -}) diff --git a/test/errors.js b/test/errors.js deleted file mode 100644 index b983c65d9f4..00000000000 --- a/test/errors.js +++ /dev/null @@ -1,18 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; - -var errors = require('../packages/web3-core-helpers/src/errors.js'); - -describe('lib/web3/method', function () { - describe('getCall', function () { - - for(var key in errors) { - it('should return and error', function () { - - assert.instanceOf(errors[key](), Error); - }); - } - - }); -}); - diff --git a/test/eth.Iban.js b/test/eth.Iban.js deleted file mode 100644 index fca29a01137..00000000000 --- a/test/eth.Iban.js +++ /dev/null @@ -1,46 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); -var eth = new Eth(); - -var tests = [ - { - direct: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', - address: '0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8' // checksum address - }, - { - direct: 'XE1222Q908LN1QBBU6XUQSO1OHWJIOS46OO', - address: '0x11c5496AEE77c1bA1f0854206a26dDa82A81D6D8' - }, - { - direct: 'XE75JRZCTTLBSYEQBGAS7GID8DKR7QY0QA3', - address: '0xa94f5374Fce5edBC8E2a8697C15331677e6EbF0B' // checksum address - }, - { - error: true, - direct: 'XE81ETHXREGGAVOFYORK', - address: '0xHELLO' // checksum address - } -]; - -describe('eth', function () { - describe('Iban', function () { - tests.forEach(function (test) { - it('toAddress() should transform iban to address: ' + test.address, function () { - if(test.error) { - assert.throws(eth.Iban.toAddress.bind(eth.Iban, test.direct)); - } else { - assert.deepEqual(eth.Iban.toAddress(test.direct), test.address); - } - }); - it('toIban() should transform address to iban: ' + test.address, function () { - if(test.error) { - assert.throws(eth.Iban.toIban.bind(eth, test.address)); - } else { - assert.deepEqual(eth.Iban.toIban(test.address), test.direct); - } - }); - }); - }); -}); - diff --git a/test/eth.abi.decodeLog.js b/test/eth.abi.decodeLog.js deleted file mode 100644 index 1d71dabab9e..00000000000 --- a/test/eth.abi.decodeLog.js +++ /dev/null @@ -1,182 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Web3Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: [[{ - type: 'string', - name: 'myString' - },{ - type: 'uint256', - name: 'myNumber', - indexed: true - },{ - type: 'uint8', - name: 'mySmallNumber', - indexed: true - }], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000', - ['0x000000000000000000000000000000000000000000000000000000000000f310', '0x0000000000000000000000000000000000000000000000000000000000000010']], - result: { - '0': 'Hello%!', - '1': '62224', - '2': '16', - myString: 'Hello%!', - myNumber: '62224', - mySmallNumber: '16', - "__length__": 3 - } -},{ - params: [[{ - type: 'bytes', - name: 'HelloBytes' - },{ - type: 'uint8', - name: 'myNumberWork', - indexed: true - }], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000748656c6c6f252100000000000000000000000000000000000000000000000000', - ['0x00000000000000000000000000000000000000000000000000000000000000f3']], - result: { - '0': '0x48656c6c6f2521', - '1': '243', - HelloBytes: '0x48656c6c6f2521', - myNumberWork: '243', - "__length__": 2 - } -},{ - params: [[{ - type: 'bytes32', - name: 'HelloBytes', - indexed: true - },{ - type: 'bool', - name: 'IsTrue', - indexed: true - },{ - type: 'uint8', - name: 'myNumberWork', - indexed: true - }], '', - ['0xffdd0000000000000000000000000000000000000000000000000000000000f3','0x0000000000000000000000000000000000000000000000000000000000000001','0x00000000000000000000000000000000000000000000000000000000000000f3']], - result: { - '0': '0xffdd0000000000000000000000000000000000000000000000000000000000f3', - '1': true, - '2': '243', - HelloBytes: '0xffdd0000000000000000000000000000000000000000000000000000000000f3', - IsTrue: true, - myNumberWork: '243', - "__length__": 3 - } -},{ - params: [[{ - type: 'string', - name: 'MyString', - indexed: true - },{ - type: 'bool', - name: 'IsTrue', - indexed: true - },{ - type: 'uint8', - name: 'myNumberWork', - indexed: true - }], '', - ['0xffdd000000000000000000000000000000000000000000000000000000000003','0x0000000000000000000000000000000000000000000000000000000000000000','0x000000000000000000000000000000000000000000000000000000000000fd44']], - result: { - '0': '0xffdd000000000000000000000000000000000000000000000000000000000003', - '1': false, - '2': '68', - MyString: '0xffdd000000000000000000000000000000000000000000000000000000000003', - IsTrue: false, - myNumberWork: '68', - "__length__": 3 - } -},{ - params: [[{ - indexed: true, name: "from", type: "address" - }, - { - indexed: true, name: "to", type: "address" - }, - { - indexed: false, name: "amount", type: "uint256" - }, - { - indexed: false, name: "narrative", type: "string" - }], '0x0000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000067465737420780000000000000000000000000000000000000000000000000000', - ['0x000000000000000000000000ae653250b4220835050b75d3bc91433246903a95', '0x00000000000000000000000094011c67bc1e6448ed4b8682047358ca6cd09470']], - result: { - '0': '0xae653250B4220835050B75D3bC91433246903A95', - '1': '0x94011c67BC1E6448ed4b8682047358ca6cD09470', - '2': '10000', - '3': 'test x', - from: '0xae653250B4220835050B75D3bC91433246903A95', - to: '0x94011c67BC1E6448ed4b8682047358ca6cD09470', - amount: '10000', - narrative: 'test x', - __length__: 4 - } -},{ - params: [[{ - indexed: true, name: "from", type: "address" - }, - { - indexed: true, name: "to", type: "address" - }, - { - indexed: false, name: "amount", type: "uint256" - }, - { - indexed: false, name: "narrative", type: "string" - }], '0x00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000', - ['0x000000000000000000000000ae653250b4220835050b75d3bc91433246903a95', '0x00000000000000000000000094011c67bc1e6448ed4b8682047358ca6cd09470']], - result: { - '0': '0xae653250B4220835050B75D3bC91433246903A95', - '1': '0x94011c67BC1E6448ed4b8682047358ca6cD09470', - '2': '10000', - '3': 'Hello!%!', - from: '0xae653250B4220835050B75D3bC91433246903A95', - to: '0x94011c67BC1E6448ed4b8682047358ca6cD09470', - amount: '10000', - narrative: 'Hello!%!', - __length__: 4 - } -},{ - params: [[ - { - indexed: false, - internalType: "function () external", - name: "fn", - type: "function" - }], "0xfba657cfc72d1933c9949b383a77a14b6ad29912c04062260000000000000000", - [] ], - result: { - "0": "0xfba657cfc72d1933c9949b383a77a14b6ad29912c0406226", - "fn": "0xfba657cfc72d1933c9949b383a77a14b6ad29912c0406226", - "__length__": 1 - } -},{ - params:[[ - { - type: 'string', - name: 'a', - },{ - type: 'string', - name: 'b' - }], '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000141000000000000000000000000000000000000000000000000000000000000000141', - ['0x0000000000000000000000000000000000000000000000000000000000000000']], - result: { - "0": "A", - "1": "A", - "a": "A", - "b": "A", - "__length__": 2 - } -}]; - -describe('decodeLog', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.deepEqual(Web3Abi.decodeLog.apply(Web3Abi, test.params), test.result); - }); - }); -}); diff --git a/test/eth.abi.decodeParameter.js b/test/eth.abi.decodeParameter.js deleted file mode 100644 index 99d1bef5286..00000000000 --- a/test/eth.abi.decodeParameter.js +++ /dev/null @@ -1,19 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: ['uint256', '0x0000000000000000000000000000000000000000000000000000000000000010'], - result: "16" -},{ - params: ['string', '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'], - result: "Hello!%!" -}]; - -describe('decodeParameter', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.equal(Abi.decodeParameter.apply(Abi, test.params), test.result); - }); - }); -}); diff --git a/test/eth.abi.decodeParameters.js b/test/eth.abi.decodeParameters.js deleted file mode 100644 index 6e32a9f55db..00000000000 --- a/test/eth.abi.decodeParameters.js +++ /dev/null @@ -1,91 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: [['string', 'uint256'], '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'], - result: { - '0': 'Hello!%!', - '1': '234', - "__length__": 2 - } -},{ - params: [[{ - type: 'string', - name: 'myString' - },{ - type: 'uint256', - name: 'myNumber' - }], '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'], - result: { - '0': 'Hello!%!', - '1': '234', - myString: 'Hello!%!', - myNumber: '234', - "__length__": 2 - } -},{ - params: [['string'], '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'], - result: {'0': "", "__length__": 1} -},{ - params: [['int256'], '0x0000000000000000000000000000000000000000000000000000000000000000'], - result: {'0': "0", "__length__": 1} -},{ - params: [['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000000'], - result: {'0': "0", "__length__": 1} -},{ - params: [['bytes'], '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'], - result: {'0': null, "__length__": 1} -},{ - params: [['address'], '0x0000000000000000000000000000000000000000000000000000000000000000'], - result: {'0': "0x0000000000000000000000000000000000000000", "__length__": 1} -},{ - params: [['bytes32'], '0x0000000000000000000000000000000000000000000000000000000000000000'], - result: {'0': "0x0000000000000000000000000000000000000000000000000000000000000000", "__length__": 1} -},{ - params: [['bool'], '0x0000000000000000000000000000000000000000000000000000000000000000'], - result: {'0': false, "__length__": 1} -}]; - -describe('decodeParameters', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.deepEqual(Abi.decodeParameters.apply(Abi, test.params), test.result); - }); - }); -}); - - -var failures = [{ - params: [['string', 'uint256'], '0x'] -},{ - params: [[{ - type: 'string', - name: 'myString' - },{ - type: 'uint256', - name: 'myNumber' - }], '0x'] -},{ - params: [['string'], '0x'] -},{ - params: [['int256'], '0x'] -},{ - params: [['uint256'], '0x'] -},{ - params: [['bytes'], '0x'] -},{ - params: [['address'], '0x'] -},{ - params: [['bytes32'], '0x'] -},{ - params: [['bool'], '0x'] -}]; - -describe('decodeParameters', function () { - failures.forEach(function (test) { - it('should not convert '+test.params[1]+' to '+test.params[0], function () { - assert.throws(_ => {Abi.decodeParameters.apply(Abi, test.params)}); - }); - }); -}); diff --git a/test/eth.abi.encodeEventSignature.js b/test/eth.abi.encodeEventSignature.js deleted file mode 100644 index 76f69cdcaf4..00000000000 --- a/test/eth.abi.encodeEventSignature.js +++ /dev/null @@ -1,46 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: [{ - name: 'myEvent', - type: 'event', - inputs: [{ - type: 'uint256', - name: 'myNumber' - },{ - type: 'bytes32', - name: 'myBytes' - }] - }], - result: '0xf2eeb729e636a8cb783be044acf6b7b1e2c5863735b60d6daae84c366ee87d97' -},{ - params: [{ - name: 'SomeEvent', - type: 'event', - inputs: [{ - type: 'bytes', - name: 'somebytes' - },{ - type: 'byte16', - name: 'myBytes' - }] - }], - result: '0xab132b6cdd50f8d4d2ea33c3f140a9b3cf40f451540c69765c4842508bb13838' -},{ - params: [{ - name: 'AnotherEvent', - type: 'event', - inputs: [] - }], - result: '0x601d819e31a3cd164f83f7a7cf9cb5042ab1acff87b773c68f63d059c0af2dc0' -}]; - -describe('encodeEventSignature', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.equal(Abi.encodeEventSignature.apply(Abi, test.params), test.result); - }); - }); -}); diff --git a/test/eth.abi.encodeFunctionCall.js b/test/eth.abi.encodeFunctionCall.js deleted file mode 100644 index 719b3d21df6..00000000000 --- a/test/eth.abi.encodeFunctionCall.js +++ /dev/null @@ -1,52 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: [{ - name: 'myMethod', - type: 'function', - inputs: [{ - type: 'uint256', - name: 'myNumber' - },{ - type: 'string', - name: 'myString' - }] - }, ['2345675643', 'Hello!%']], - result: '0x24ee0097000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000' -},{ - params: [{ - name: 'myOtherMethod', - type: 'function', - inputs: [{ - type: 'uint16', - name: 'myNumberdd' - },{ - type: 'bytes32', - name: 'myBytes' - }] - }, [2323, '0x234567432145678543213456']], - result: '0xed6d6f8500000000000000000000000000000000000000000000000000000000000009132345674321456785432134560000000000000000000000000000000000000000' -},{ - params: [{ - name: 'myMethod', - type: 'function', - inputs: [{ - type: 'uint256', - name: 'myNumber' - },{ - type: 'bytes', - name: 'myBytes' - }] - }, ['2345675643', '0x23456743214567854321ffffdddddd']], - result: '0x4c6a9980000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000f23456743214567854321ffffdddddd0000000000000000000000000000000000' -}]; - -describe('encodeFunctionCall', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.equal(Abi.encodeFunctionCall.apply(Abi, test.params), test.result); - }); - }); -}); diff --git a/test/eth.abi.encodeFunctionSignature.js b/test/eth.abi.encodeFunctionSignature.js deleted file mode 100644 index 2182df00d53..00000000000 --- a/test/eth.abi.encodeFunctionSignature.js +++ /dev/null @@ -1,59 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: [{ - name: 'myMethod', - type: 'function', - inputs: [{ - type: 'uint256', - name: 'myNumber' - },{ - type: 'string', - name: 'myString' - }] - }], - result: '0x24ee0097' -},{ - params: [{ - name: 'myMethod', - type: 'function', - inputs: [{ - type: 'string', - name: 'myNumber' - },{ - type: 'bytes8', - name: 'myString' - }] - }], - result: '0x27b00c93' -},{ - params: [{ - name: 'Somthing', - type: 'function', - inputs: [{ - type: 'uint16', - name: 'myNumber' - },{ - type: 'bytes', - name: 'myString' - }] - }], - result: '0x724ff7a1' -},{ - params: [{ - name: 'something', - type: 'function', - inputs: [] - }], - result: '0xa7a0d537' -}]; - -describe('encodeFunctionSignature', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.equal(Abi.encodeFunctionSignature.apply(Abi, test.params), test.result); - }); - }); -}); diff --git a/test/eth.abi.encodeParameter.js b/test/eth.abi.encodeParameter.js deleted file mode 100644 index 4ba9548fd05..00000000000 --- a/test/eth.abi.encodeParameter.js +++ /dev/null @@ -1,22 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: ['uint256', '2345675643'], - result: '0x000000000000000000000000000000000000000000000000000000008bd02b7b' -},{ - params: ['bytes32', '0xdf3234'], - result: '0xdf32340000000000000000000000000000000000000000000000000000000000' -},{ - params: ['bytes32[]', ['0xdf3234', '0xfdfd']], - result: '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000' -}]; - -describe('encodeParameter', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.equal(Abi.encodeParameter.apply(Abi, test.params), test.result); - }); - }); -}); diff --git a/test/eth.abi.encodeParameters.js b/test/eth.abi.encodeParameters.js deleted file mode 100644 index 2f7428f5323..00000000000 --- a/test/eth.abi.encodeParameters.js +++ /dev/null @@ -1,22 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Abi = require('../packages/web3-eth-abi'); - -var tests = [{ - params: [['uint256','string'], ['2345675643', 'Hello!%']], - result: '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000' -},{ - params: [['uint64[]','bytes32'], [['34','434'], '0x324567dfff']], - result: '0x0000000000000000000000000000000000000000000000000000000000000040324567dfff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000001b2' -},{ - params: [['address','address','address', 'address'], ['0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1','0x10f8bf6a479f320ead074411a4b0e7944ea8c9c1','0xfff8bf6a479f320ead074411a4b0e7944ea8c9c1', '0xddd8bf6a479f320ead074411a4b0e7944ea8c9c1']], - result: '0x00000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c100000000000000000000000010f8bf6a479f320ead074411a4b0e7944ea8c9c1000000000000000000000000fff8bf6a479f320ead074411a4b0e7944ea8c9c1000000000000000000000000ddd8bf6a479f320ead074411a4b0e7944ea8c9c1' -}]; - -describe('encodeParameters', function () { - tests.forEach(function (test) { - it('should convert correctly', function () { - assert.equal(Abi.encodeParameters.apply(Abi, test.params), test.result); - }); - }); -}); diff --git a/test/eth.accounts.create.js b/test/eth.accounts.create.js deleted file mode 100644 index 4ca1317d276..00000000000 --- a/test/eth.accounts.create.js +++ /dev/null @@ -1,34 +0,0 @@ -var Accounts = require("./../packages/web3-eth-accounts"); -var ethers = require('ethers'); -var chai = require('chai'); -var assert = chai.assert; -var Web3 = require('../packages/web3'); -var web3 = new Web3(); - -var tests = []; -for (var i = 0; i < 1000; i++) { - tests.push(i); -} - - -describe("eth", function () { - describe("accounts", function () { - - tests.forEach(function (test, i) { - it("create eth.account, and compare to ethers wallet", function() { - var ethAccounts = new Accounts(); - - // create account - var acc = ethAccounts.create(); - - // create ethers wallet - var ethWall = new ethers.Wallet(acc.privateKey); - - // compare addresses and private keys - assert.equal(acc.address, ethWall.address); - assert.equal(acc.privateKey, ethWall.privateKey); - }); - - }); - }); -}); diff --git a/test/eth.accounts.encrypt-decrypt.js b/test/eth.accounts.encrypt-decrypt.js deleted file mode 100644 index 12545b7d825..00000000000 --- a/test/eth.accounts.encrypt-decrypt.js +++ /dev/null @@ -1,250 +0,0 @@ -var Accounts = require("./../packages/web3-eth-accounts/src/index.js"); -var ethers = require('ethers'); -var chai = require('chai'); -var assert = chai.assert; -var Web3 = require('../packages/web3'); -var web3 = new Web3(); - -var tests = []; -for (var i = 0; i < 50; i++) { - tests.push(i); -} -var n = 256; -var r = 8; -var p = 1; -var salt = '3a1012583f8be138537bc7cf8a50c925b6fcc01a9f7744c85a18fbdc07999f10'; -var iv = Buffer.from('653195c3e2791ac53f3f19b125c18f8c', 'hex'); -var uuid = Buffer.from('ff31ddc3e2791ac53f3f19b125c18fff', 'hex'); -var pw = 'test'; - -// tests from https://github.com/Gustav-Simonsson/go-ethereum/blob/7cc6b801e0967e5ebfa26b9f670675acea6e3a20/accounts/testdata/v3_test_vector.json -var staticTests = [ - { - "json": { - "crypto" : { - "cipher" : "aes-128-ctr", - "cipherparams" : { - "iv" : "83dbcc02d8ccb40e466191a123791e0e" - }, - "ciphertext" : "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c", - "kdf" : "scrypt", - "kdfparams" : { - "dklen" : 32, - "n" : 262144, - "r" : 1, - "p" : 8, - "salt" : "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19" - }, - "mac" : "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097" - }, - "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6", - "version" : 3 - }, - "password": "testpassword", - "priv": "7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d" - }, { - "json": { - "crypto" : { - "cipher" : "aes-128-ctr", - "cipherparams" : { - "iv" : "6087dab2f9fdbbfaddc31a909735c1e6" - }, - "ciphertext" : "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", - "kdf" : "pbkdf2", - "kdfparams" : { - "c" : 262144, - "dklen" : 32, - "prf" : "hmac-sha256", - "salt" : "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd" - }, - "mac" : "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2" - }, - "id" : "3198bc9c-6672-5ab3-d995-4942343ae5b6", - "version" : 3 - }, - "password": "testpassword", - "priv": "7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d" - }, { - "json": { - "crypto" : { - "cipher" : "aes-128-ctr", - "cipherparams" : { - "iv" : "e0c41130a323adc1446fc82f724bca2f" - }, - "ciphertext" : "9517cd5bdbe69076f9bf5057248c6c050141e970efa36ce53692d5d59a3984", - "kdf" : "scrypt", - "kdfparams" : { - "dklen" : 32, - "n" : 2, - "r" : 8, - "p" : 1, - "salt" : "711f816911c92d649fb4c84b047915679933555030b3552c1212609b38208c63" - }, - "mac" : "d5e116151c6aa71470e67a7d42c9620c75c4d23229847dcc127794f0732b0db5" - }, - "id" : "fecfc4ce-e956-48fd-953b-30f8b52ed66c", - "version" : 3 - }, - "password": "foo", - "priv": "fa7b3db73dc7dfdf8c5fbdb796d741e4488628c41fc4febd9160a866ba0f35" - },{ - "json": { - "crypto" : { - "cipher" : "aes-128-ctr", - "cipherparams" : { - "iv" : "3ca92af36ad7c2cd92454c59cea5ef00" - }, - "ciphertext" : "108b7d34f3442fc26ab1ab90ca91476ba6bfa8c00975a49ef9051dc675aa", - "kdf" : "scrypt", - "kdfparams" : { - "dklen" : 32, - "n" : 2, - "r" : 8, - "p" : 1, - "salt" : "d0769e608fb86cda848065642a9c6fa046845c928175662b8e356c77f914cd3b" - }, - "mac" : "75d0e6759f7b3cefa319c3be41680ab6beea7d8328653474bd06706d4cc67420" - }, - "id" : "a37e1559-5955-450d-8075-7b8931b392b2", - "version" : 3 - }, - "password": "foo", - "priv": "81c29e8142bb6a81bef5a92bda7a8328a5c85bb2f9542e76f9b0f94fc018" - } -]; - -describe("eth", function () { - describe("accounts", function () { - runTests(); - }); - - // Verify that `Buffer` in web3-eth-accounts is backwards - // compatible with a deprecated node Buffer substitute injected into - // builds by webpack (and React). - describe("with feross/buffer@4.9.1", function(){ - before(function(){ - original_Buffer = global.Buffer; - global.Buffer = require('buffer/').Buffer; - }); - - describe("accounts", function(){ - runTests(); - }); - - after(function(){ - global.Buffer = original_Buffer; - }); - }); -}); - -function runTests(){ - tests.forEach(function (test, i) { - it("encrypt eth.account, and compare to ethers wallet", async () => { - var ethAccounts = new Accounts(); - - // create account - var acc = ethAccounts.create(); - - // create ethers wallet - var ethWall = new ethers.Wallet(acc.privateKey); - - // compare addresses and private keys - assert.equal(acc.address, ethWall.address); - assert.equal(acc.privateKey, ethWall.privateKey); - - var encrypt = acc.encrypt( - pw, - {n: n, r: r, p: p, - salt: salt, iv: iv, uuid: uuid} - ); - - var ethWallEncrypt = JSON.parse((await ethWall.encrypt( - pw, - {scrypt: {N: n, r: r, p: p}, - salt: '0x' + salt, iv: '0x' + iv.toString('hex'), - uuid: '0x' + uuid.toString('hex')} - )).toLowerCase()); - - assert.deepEqual(encrypt, ethWallEncrypt); - }); - - it("encrypt eth.account, and decrypt with ethers wallet", async () => { - var ethAccounts = new Accounts(); - - // create account - var acc = ethAccounts.create(); - var encrypt = acc.encrypt(pw, {n: n}); - - // create ethers wallet - var ethWall = await ethers.Wallet.fromEncryptedJson(JSON.stringify(encrypt), pw); - - // compare addresses and private keys - assert.equal(acc.address, ethWall.address); - assert.equal(acc.privateKey, ethWall.privateKey); - }); - - it("encrypt ethers wallet, and decrypt with eth.account", async () => { - var ethAccounts = new Accounts(); - - // create ethers wallet - var ethWall = ethers.Wallet.createRandom(); - var encrypt = await ethWall.encrypt(pw, {scrypt: {N: n}}); - - // create account using encrypted json (nonStrict) - var acc = ethAccounts.decrypt(encrypt, pw, true); - - // compare addresses and private keys - assert.equal(acc.address, ethWall.address); - assert.equal(acc.privateKey, ethWall.privateKey); - }); - - it("decrypt static signature using ethers wallet and eth.account and compare", async () => { - var ethAccounts = new Accounts(); - - var encrypt = { version: 3, - id: '6dac4ae5-7604-498e-a2a2-e86cfb289d0c', - address: '143f8913e0417997304fc179b531ff4cb9cab582', - crypto: - { ciphertext: '8b20d7797fee1c36ec2fff176e1778170745794ad2f124862f7f4bfc028daa27', - cipherparams: { iv: 'c6170befc885c940e0d0553f3ba01c6a' }, - cipher: 'aes-128-ctr', - kdf: 'scrypt', - kdfparams: - { dklen: 32, - salt: 'd78584e30aaf56781b4432116b1de9b1560b3ca6f4624624c14fb6e6d5638a48', - n: 256, - r: 8, - p: 1 }, - mac: '23d4497c779a6bc421f5cc54358309228389597f594448c5c900ad747f97401b' } }; - - var acc = ethAccounts.decrypt(encrypt, pw); - var ethWall = await ethers.Wallet.fromEncryptedJson(JSON.stringify(encrypt), pw); - - // compare addresses - assert.equal(acc.address, ethWall.address); - assert.equal(web3.utils.toChecksumAddress('0x143f8913e0417997304fc179b531ff4cb9cab582'), acc.address); - assert.equal(web3.utils.toChecksumAddress('0x143f8913e0417997304fc179b531ff4cb9cab582'), ethWall.address); - assert.equal(ethers.utils.getAddress('0x143f8913e0417997304fc179b531ff4cb9cab582'), acc.address); - assert.equal(ethers.utils.getAddress('0x143f8913e0417997304fc179b531ff4cb9cab582'), ethWall.address); - - // compare private keys - assert.equal(acc.privateKey, ethWall.privateKey); - }); - }); - - staticTests.forEach(function (test, i) { - it("decrypt staticTests and compare to private key", function() { - // disable the test timeout - this.timeout(0); - - var ethAccounts = new Accounts(); - - // create account - var acc = ethAccounts.decrypt(test.json, test.password); - - // compare addresses - assert.equal(acc.privateKey, '0x'+ test.priv); - }); - }); -}; - diff --git a/test/eth.accounts.sign.js b/test/eth.accounts.sign.js deleted file mode 100644 index 292a79d8a7d..00000000000 --- a/test/eth.accounts.sign.js +++ /dev/null @@ -1,159 +0,0 @@ -var Accounts = require("./../packages/web3-eth-accounts"); -var chai = require('chai'); -var assert = chai.assert; -var Web3 = require('../packages/web3'); -var web3 = new Web3(); - -var tests = [ - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - data: 'Some data', - // signature done with personal_sign - signature: '0xa8037a6116c176a25e6fc224947fde9e79a2deaa0dd8b67b366fbdfdbffc01f953e41351267b20d4a89ebfe9c8f03c04de9b345add4a52f15bd026b63c8fb1501b' - }, { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - data: 'Some data!%$$%&@*', - // signature done with personal_sign - signature: '0x05252412b097c5d080c994d1ea12abcee6f1cae23feb225517a0b691a66e12866b3f54292f9cfef98f390670b4d010fc4af7fcd46e41d72870602c117b14921c1c' - }, { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - data: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', - // signature done with personal_sign - signature: '0xddd493679d80c9c74e0e5abd256a496dfb31b51cd39ea2c7c9e8a2a07de94a90257107a00d9cb631bacb85b208d66bfa7a80c639536b34884505eff352677dd01c' - } -]; - - -describe("eth", function () { - describe("accounts", function () { - - tests.forEach(function (test, i) { - it("sign data using a string", function() { - var ethAccounts = new Accounts(); - - var data = ethAccounts.sign(test.data, test.privateKey); - - assert.equal(data.signature, test.signature); - }); - - it("sign data using a utf8 encoded hex string", function() { - var ethAccounts = new Accounts(); - - var data = web3.utils.isHexStrict(test.data) ? test.data : web3.utils.utf8ToHex(test.data); - var data = ethAccounts.sign(data, test.privateKey); - - assert.equal(data.signature, test.signature); - }); - - - it("recover signature using a string", function() { - var ethAccounts = new Accounts(); - - var address = ethAccounts.recover(test.data, test.signature); - - assert.equal(address, test.address); - }); - - it("recover signature using a string and preFixed", function() { - var ethAccounts = new Accounts(); - - var address = ethAccounts.recover(ethAccounts.hashMessage(test.data), test.signature, true); - - assert.equal(address, test.address); - }); - - it("recover signature using a hash and r s v values and preFixed", function() { - var ethAccounts = new Accounts(); - - var sig = ethAccounts.sign(test.data, test.privateKey); - var address = ethAccounts.recover(ethAccounts.hashMessage(test.data), sig.v, sig.r, sig.s, true); - - assert.equal(address, test.address); - }); - - it("recover signature (pre encoded) using a signature object", function() { - var ethAccounts = new Accounts(); - - var data = web3.utils.isHexStrict(test.data) ? test.data : web3.utils.utf8ToHex(test.data); - var sig = ethAccounts.sign(data, test.privateKey); - var address = ethAccounts.recover(sig); - - assert.equal(address, test.address); - }); - - it("recover signature using a signature object", function() { - var ethAccounts = new Accounts(); - - var sig = ethAccounts.sign(test.data, test.privateKey); - var address = ethAccounts.recover(sig); - - assert.equal(address, test.address); - }); - - it("recover signature (pre encoded) using a hash and r s v values", function() { - var ethAccounts = new Accounts(); - - var data = web3.utils.isHexStrict(test.data) ? test.data : web3.utils.utf8ToHex(test.data); - var sig = ethAccounts.sign(data, test.privateKey); - var address = ethAccounts.recover(test.data, sig.v, sig.r, sig.s); - - assert.equal(address, test.address); - }); - - it("recover signature using a hash and r s v values", function() { - var ethAccounts = new Accounts(); - - var sig = ethAccounts.sign(test.data, test.privateKey); - var address = ethAccounts.recover(test.data, sig.v, sig.r, sig.s); - - assert.equal(address, test.address); - }); - }); - }); - - it('should add the "0x" prefix and sign the given message correctly', function() { - assert.equal( - '0xa8037a6116c176a25e6fc224947fde9e79a2deaa0dd8b67b366fbdfdbffc01f953e41351267b20d4a89ebfe9c8f03c04de9b345add4a52f15bd026b63c8fb1501b', - new Accounts().sign('Some data', 'be6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728').signature - ); - }); - - it('should add the "0x" prefix to the privateKey', function() { - assert.equal( - '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - new Accounts().privateKeyToAccount('be6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728').privateKey - ); - }); - - it('should throw if a privateKey is given with a invalid length', function() { - try { - new Accounts().privateKeyToAccount('0000be6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728'); - assert.fail(); - } catch(err) { - assert(err.message.includes('Private key must be 32 bytes long')); - } - }); - - it('should throw if a privateKey is given with a invalid length', function() { - try { - new Accounts().sign('data', '00be6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728'); - assert.fail(); - } catch(err) { - assert(err.message.includes('Private key must be 32 bytes long')); - } - }); - - it('should sign data correctly using an emoji character', function() { - const message = '🤗' - const ethAccounts = new Accounts(); - - const hashMessage = ethAccounts.hashMessage(message) - assert.equal(hashMessage, '0x716ce69c5d2d629c168bc02e24a961456bdc5a362d366119305aea73978a0332') - - const hashMessageHex = ethAccounts.hashMessage(web3.utils.utf8ToHex(message)) - assert.equal(hashMessageHex, '0x716ce69c5d2d629c168bc02e24a961456bdc5a362d366119305aea73978a0332') - }); -}); diff --git a/test/eth.accounts.signTransaction.js b/test/eth.accounts.signTransaction.js deleted file mode 100644 index c9ab4776e86..00000000000 --- a/test/eth.accounts.signTransaction.js +++ /dev/null @@ -1,690 +0,0 @@ -var FakeHttpProvider = require('./helpers/FakeIpcProvider'); -var Web3 = require('../packages/web3'); -var Accounts = require("./../packages/web3-eth-accounts"); -var ethjsSigner = require("ethjs-signer"); -var chai = require('chai'); -var _ = require('underscore'); -var assert = chai.assert; - -var common = { - baseChain: 'mainnet', - customChain: { - name: 'custom-network', - networkId: 1, - chainId: 1, - }, - harfork: 'petersburg', -}; - -var clone = function (object) { return object ? _.clone(object) : []; }; - -var tests = [ - { - address: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', - iban: 'XE0556YCRTEZ9JALZBSCXOK4UJ5F3HN03DV', - privateKey: '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "20000000000", - gas: 21000, - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - toIban: 'XE04S1IRT2PR8A8422TPBL9SR6U0HODDCUT', // will be switched to "to" in the test - value: "1000000000", - data: "", - common: common - }, - // signature from eth_signTransaction - rawTransaction: "0xf868808504a817c80082520894f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008026a0afa02d193471bb974081585daabf8a751d4decbb519604ac7df612cc11e9226da04bf1bd55e82cebb2b09ed39bbffe35107ea611fa212c2d9a1f1ada4952077118", - oldSignature: "0xf868808504a817c80082520894f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008026a0afa02d193471bb974081585daabf8a751d4decbb519604ac7df612cc11e9226da04bf1bd55e82cebb2b09ed39bbffe35107ea611fa212c2d9a1f1ada4952077118", - transactionHash: "0xab0f71614c37231d71ae521ce188a9c7c9d5e976124a91f62f9f125348dd0326", - messageHash: "0x2c7903a33b55caf582d170f21595f1a7e598df3fa61b103ea0cd9d6b2a92565d" - }, - { - address: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', - iban: 'XE0556YCRTEZ9JALZBSCXOK4UJ5F3HN03DV', - privateKey: '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "0", - gas: 31853, - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - toIban: 'XE04S1IRT2PR8A8422TPBL9SR6U0HODDCUT', // will be switched to "to" in the test - value: "0", - data: "", - common: common - }, - // expected r and s values from signature - r: "0x22f17b38af35286ffbb0c6376c86ec91c20ecbad93f84913a0cc15e7580cd9", - s: "0x83d6e12e82e3544cb4439964d5087da78f74cefeec9a450b16ae179fd8fe20", - // signature from eth_signTransaction - rawTransaction: "0xf85d8080827c6d94f0109fc8df283027b6285cc889f5aa624eac1f558080269f22f17b38af35286ffbb0c6376c86ec91c20ecbad93f84913a0cc15e7580cd99f83d6e12e82e3544cb4439964d5087da78f74cefeec9a450b16ae179fd8fe20", - oldSignature: "0xf85d8080827c6d94f0109fc8df283027b6285cc889f5aa624eac1f558080269f22f17b38af35286ffbb0c6376c86ec91c20ecbad93f84913a0cc15e7580cd99f83d6e12e82e3544cb4439964d5087da78f74cefeec9a450b16ae179fd8fe20", - transactionHash: "0xb0c5e2c6b29eeb0b9c1d63eaa8b0f93c02ead18ae01cb7fc795b0612d3e9d55a", - messageHash: "0x21975b15072795e610d2937abcf15ed4aecd0650b8a62204274bef3b57a8501a" - }, - { - address: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', - iban: 'XE0556YCRTEZ9JALZBSCXOK4UJ5F3HN03DV', - privateKey: '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "234567897654321", - gas: 2000000, - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - toIban: 'XE04S1IRT2PR8A8422TPBL9SR6U0HODDCUT', // will be switched to "to" in the test - value: "1000000000", - data: "", - common: common - }, - // expected r and s values from signature - r: "0x9ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9c", - s: "0x440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428", - // signature from eth_signTransaction - rawTransaction: "0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428", - oldSignature: "0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428", - transactionHash: "0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60", - messageHash: "0x6893a6ee8df79b0f5d64a180cd1ef35d030f3e296a5361cf04d02ce720d32ec5" - }, - { - address: '0x2c7536E3605D9C16a7a3D7b1898e529396a65c23', - iban: 'XE0556YCRTEZ9JALZBSCXOK4UJ5F3HN03DV', - privateKey: '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "0", - gas: 31853, - to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55', - toIban: 'XE04S1IRT2PR8A8422TPBL9SR6U0HODDCUT', // will be switched to "to" in the test - value: "0", - data: "", - common: common - }, - // expected r and s values from signature - r: "0x22f17b38af35286ffbb0c6376c86ec91c20ecbad93f84913a0cc15e7580cd9", - s: "0x83d6e12e82e3544cb4439964d5087da78f74cefeec9a450b16ae179fd8fe20", - // signature from eth_signTransaction - rawTransaction: "0xf85d8080827c6d94f0109fc8df283027b6285cc889f5aa624eac1f558080269f22f17b38af35286ffbb0c6376c86ec91c20ecbad93f84913a0cc15e7580cd99f83d6e12e82e3544cb4439964d5087da78f74cefeec9a450b16ae179fd8fe20", - oldSignature: "0xf85d8080827c6d94f0109fc8df283027b6285cc889f5aa624eac1f558080269f22f17b38af35286ffbb0c6376c86ec91c20ecbad93f84913a0cc15e7580cd99f83d6e12e82e3544cb4439964d5087da78f74cefeec9a450b16ae179fd8fe20", - transactionHash: "0xb0c5e2c6b29eeb0b9c1d63eaa8b0f93c02ead18ae01cb7fc795b0612d3e9d55a", - messageHash: "0x21975b15072795e610d2937abcf15ed4aecd0650b8a62204274bef3b57a8501a" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - iban: 'XE25RG8S3H5TX5RD7QTL5UPVW90AHN2VYDC', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "20000000000", - gas: 21000, - to: '0x3535353535353535353535353535353535353535', - toIban: 'XE4967QZMA14MI680T89KSPPJEJMU68MEYD', // will be switched to "to" in the test - value: "1000000000000000000", - data: "", - common: common - }, - // signature from eth_signTransaction - rawTransaction: "0xf86c808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a76400008025a04f4c17305743700648bc4f6cd3038ec6f6af0df73e31757007b7f59df7bee88da07e1941b264348e80c78c4027afc65a87b0a5e43e86742b8ca0823584c6788fd0", - oldSignature: "0xf86c808504a817c800825208943535353535353535353535353535353535353535880de0b6b3a7640000801ba0300e0d8f83ac82943e468164fa80236fdfcff21f978f66dd038b875cea6faa51a05a8e4b38b819491a0bb4e1f5fb4fd203b6a1df19e2adbec2ebdddcbfaca555f0", - transactionHash: "0xda3be87732110de6c1354c83770aae630ede9ac308d9f7b399ecfba23d923384", - messageHash: "0x7dbc5644b83abd32d014d170ba9bdc855c126328c0cb41af0ed6422bef0bb32e" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - // web3.eth.signTransaction({from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", gasPrice: "230000000000", gas: "50000", to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', value: "1000000000000000000", data: "0x0123abcd"}).then(console.log); - // signature from eth_signTransaction - rawTransaction: "0xf8708085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a031bb05bd1535150d312dcaa870a4a69c130a51aa80537659c1f308bf1f180ac6a012c938a8e04ac4e279d0b7c29811609031a96e949ad98f1ca74ca6078910bede", - oldSignature: "0xf8708085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd1ba081bba037015419ab5ce36e930b987da71b0ed5f0efb1849613223bf72399f598a05d2c1f109ad13f98a7693cfc35291e404ea8795755a176eb58a818de44f3756d", - transactionHash: "0xe86ab542020b3f386af1a1c79881d5db06f5fac58da79f697308f1d1e1799f2c", - messageHash: "0x044d45bc28c2126e98c9cd0103a6559f5a92e01ecc201f48472f1e10a4c3ae27" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 10, - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - // web3.eth.signTransaction({from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", gasPrice: "230000000000", gas: "50000", to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', value: "1000000000000000000", data: "0x0123abcd"}).then(console.log); - // signature from eth_signTransaction - rawTransaction: "0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029", - oldSignature: "0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029", - transactionHash: "0x42fb18cc20b10438c6b4bcb4f3fc777a72195caf3e8b6ddc671df4a249e84ba7", - messageHash: "0xa75c245723fedf4b739771f5eeedeb3dc6ecd3b9ea79277a33dc5ab27be0c911" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: '0xa', - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - // web3.eth.signTransaction({from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", gasPrice: "230000000000", gas: "50000", to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', value: "1000000000000000000", data: "0x0123abcd"}).then(console.log); - // signature from eth_signTransaction - rawTransaction: "0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029", - oldSignature: "0xf8700a85358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a0496e628e8348a24312ded09ee3d99d85b1b8f947725aa382dcf4003b7389d5aaa00c1b1cfdd66c510fd708d33279a1a61e53dff3c6ced67cf7f7b830862d6e2029", - transactionHash: "0x42fb18cc20b10438c6b4bcb4f3fc777a72195caf3e8b6ddc671df4a249e84ba7", - messageHash: "0xa75c245723fedf4b739771f5eeedeb3dc6ecd3b9ea79277a33dc5ab27be0c911" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: '16', - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - // web3.eth.signTransaction({from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", gasPrice: "230000000000", gas: "50000", to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', value: "1000000000000000000", data: "0x0123abcd"}).then(console.log); - // signature from eth_signTransaction - rawTransaction: "0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d", - oldSignature: "0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d", - transactionHash: "0xa2db7be5398c250e3ecf569c573f222255d46c509199ff649cca5e806edf5212", - messageHash: "0x9c8c1fb88a95974c5ac75b6c58af2b5a62d9ccb9dffad7552a3182344bf37c27" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 16, - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - // web3.eth.signTransaction({from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", gasPrice: "230000000000", gas: "50000", to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', value: "1000000000000000000", data: "0x0123abcd"}).then(console.log); - // signature from eth_signTransaction - rawTransaction: "0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d", - oldSignature: "0xf8701085358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd25a04ba217e16f62ac277698e8853bcc010db07285b457606e9f3487c70ccc5e6508a05c6cfaa17fc1a52bede0cf25c8bd2e024b4fb89ed205f62cb3e177a83654f29d", - transactionHash: "0xa2db7be5398c250e3ecf569c573f222255d46c509199ff649cca5e806edf5212", - messageHash: "0x9c8c1fb88a95974c5ac75b6c58af2b5a62d9ccb9dffad7552a3182344bf37c27" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: '0x16', - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - // web3.eth.signTransaction({from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", gasPrice: "230000000000", gas: "50000", to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', value: "1000000000000000000", data: "0x0123abcd"}).then(console.log); - // signature from eth_signTransaction - rawTransaction: "0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0", - oldSignature: "0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0", - transactionHash: "0x3135f97ac8d534b4b487cc2965fb1dcf427b92fd233577900dab3420e7afca13", - messageHash: "0x77fd104f011a0085a9fa80f6f77cb213bce71fe8b4585d6fa9e3217117263a5b" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: '0x16', - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - input: "0x0123abcd", - common: common - }, - // web3.eth.signTransaction({from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0", gasPrice: "230000000000", gas: "50000", to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', value: "1000000000000000000", data: "0x0123abcd"}).then(console.log); - // signature from eth_signTransaction - rawTransaction: "0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0", - oldSignature: "0xf8701685358d117c0082c35094fcad0b19bb29d4674531d6f115237e16afce377c880de0b6b3a7640000840123abcd26a0e027ec9e9921975678b73de44f7d2cd6b987a6655b9d0291b2cdff15836c6efba051b4e20835793bf0cdf268339111a24d80a4a7bb141e975a66d0edbcc20542d0", - transactionHash: "0x3135f97ac8d534b4b487cc2965fb1dcf427b92fd233577900dab3420e7afca13", - messageHash: "0x77fd104f011a0085a9fa80f6f77cb213bce71fe8b4585d6fa9e3217117263a5b" - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 2, - gasPrice: "20000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - input: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 2, - gasPrice: "20000", - gas: 0, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - input: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 2, - gasPrice: "0A", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 2, - gasPrice: "200000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "test", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 2, - gasPrice: "A", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 'a', - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: -1, - nonce: 1, - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: -1, - nonce: 0, - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: -2, - gasPrice: "230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "-230000000000", - gas: 50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - transaction: { - chainId: 1, - nonce: 0, - gasPrice: "230000000000", - gas: -50000, - to: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - toIban: 'XE63TIJX31ZHSLZ6F601ZPKVDKKYHMIK03G', // will be switched to "to" in the test - value: "1000000000000000000", - data: "0x0123abcd", - common: common - }, - error: true - }, -]; - -describe("eth", function () { - describe("accounts", function () { - - // For each test - tests.forEach(function (test, i) { - if (test.error) { - - it("signTransaction must error", function(done) { - var ethAccounts = new Accounts(); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - testAccount.signTransaction(test.transaction).catch(function (err) { - assert.instanceOf(err, Error); - done(); - }); - }); - - } else { - - it("signTransaction must compare to eth_signTransaction", function(done) { - var ethAccounts = new Accounts(); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - testAccount.signTransaction(test.transaction).then(function (tx) { - assert.equal(tx.messageHash, test.messageHash); - assert.equal(tx.transactionHash, test.transactionHash); - assert.equal(tx.rawTransaction, test.rawTransaction); - done(); - }); - }); - - it("signTransaction using the iban as \"to\" must compare to eth_signTransaction", function(done) { - var ethAccounts = new Accounts(); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - var transaction = clone(test.transaction); - transaction.to = transaction.toIban; - delete transaction.toIban; - testAccount.signTransaction(transaction).then(function (tx) { - assert.equal(tx.rawTransaction, test.rawTransaction); - done(); - }); - }); - - it("signTransaction will call for nonce", function(done) { - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - provider.injectResult('0xa'); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getTransactionCount'); - assert.deepEqual(payload.params, [test.address, "latest"]); - }); - - var ethAccounts = new Accounts(web3); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - var transaction = clone(test.transaction); - delete transaction.nonce; - testAccount.signTransaction(transaction) - .then(function (tx) { - assert.isObject(tx); - assert.isString(tx.rawTransaction); - - done(); - }); - }); - - it("signTransaction will call for gasPrice", function(done) { - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - provider.injectResult('0x5022'); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_gasPrice'); - assert.deepEqual(payload.params, []); - }); - - var ethAccounts = new Accounts(web3); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - var transaction = clone(test.transaction); - delete transaction.gasPrice; - testAccount.signTransaction(transaction) - .then(function (tx) { - assert.isObject(tx); - assert.isString(tx.rawTransaction); - - done(); - }); - }); - - it("signTransaction will call for chainId", function(done) { - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_chainId'); - assert.deepEqual(payload.params, []); - }); - - var ethAccounts = new Accounts(web3); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - var transaction = clone(test.transaction); - delete transaction.chainId; - testAccount.signTransaction(transaction) - .then(function (tx) { - assert.isObject(tx); - assert.isString(tx.rawTransaction); - - done(); - }); - }); - - it("signTransaction will call for networkId", function(done) { - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_networkId'); - assert.deepEqual(payload.params, []); - }); - - var ethAccounts = new Accounts(web3); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - var transaction = clone(test.transaction); - delete transaction.common; - testAccount.signTransaction(transaction) - .then(function (tx) { - assert.isObject(tx); - assert.isString(tx.rawTransaction); - - done(); - }); - }); - - it("signTransaction will call for nonce, gasPrice, chainId and networkId", function(done) { - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_chainId'); - assert.deepEqual(payload.params, []); - }); - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_gasPrice'); - assert.deepEqual(payload.params, []); - }); - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getTransactionCount'); - assert.deepEqual(payload.params, [test.address, "latest"]); - }); - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_networkId'); - assert.deepEqual(payload.params, []); - }); - - var ethAccounts = new Accounts(web3); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - var transaction = clone(test.transaction); - delete transaction.chainId; - delete transaction.gasPrice; - delete transaction.nonce; - delete transaction.common; - testAccount.signTransaction(transaction) - .then(function (tx) { - assert.isObject(tx); - assert.isString(tx.rawTransaction); - - done(); - }); - }); - - it("recoverTransaction, must recover signature", function() { - var ethAccounts = new Accounts(); - - var testAccount = ethAccounts.privateKeyToAccount(test.privateKey); - assert.equal(testAccount.address, test.address); - - testAccount.signTransaction(test.transaction).then(function (tx) { - assert.equal(ethAccounts.recoverTransaction(tx.rawTransaction), test.address); - }); - }); - - it("recoverTransaction, must also recover old signature from eth-signer", function() { - var ethAccounts = new Accounts(); - - var oldSignature = ethjsSigner.sign(test.transaction, test.privateKey); - - assert.equal(ethAccounts.recoverTransaction(oldSignature), test.address); - }); - } - }); - }); -}); diff --git a/test/eth.accounts.wallet.js b/test/eth.accounts.wallet.js deleted file mode 100644 index d27da2b417d..00000000000 --- a/test/eth.accounts.wallet.js +++ /dev/null @@ -1,321 +0,0 @@ -var Accounts = require("./../packages/web3-eth-accounts"); -var chai = require('chai'); -var assert = chai.assert; -var Web3 = require('../packages/web3'); -var web3 = new Web3(); - -var tests = [ - { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - data: 'Some data', - // signature done with personal_sign - signature: '0xa8037a6116c176a25e6fc224947fde9e79a2deaa0dd8b67b366fbdfdbffc01f953e41351267b20d4a89ebfe9c8f03c04de9b345add4a52f15bd026b63c8fb1501b' - }, { - address: '0xEB014f8c8B418Db6b45774c326A0E64C78914dC0', - privateKey: '0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728', - data: 'Some data!%$$%&@*', - // signature done with personal_sign - signature: '0x05252412b097c5d080c994d1ea12abcee6f1cae23feb225517a0b691a66e12866b3f54292f9cfef98f390670b4d010fc4af7fcd46e41d72870602c117b14921c1c' - } -]; - - -describe("eth", function () { - describe("accounts.wallet", function () { - - tests.forEach(function (test, i) { - it("creates the right number of wallets", function() { - var ethAccounts = new Accounts(); - - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.create(2, '542342f!@#$$'); - - assert.equal(ethAccounts.wallet.length, 2); - assert.equal(wallet.length, 2); - - wallet = ethAccounts.wallet.create(3); - - assert.equal(ethAccounts.wallet.length, 5); - assert.equal(wallet.length, 5); - - assert.isTrue(web3.utils.isAddress(wallet[1].address)); - assert.isTrue(web3.utils.isAddress(ethAccounts.wallet[2].address)); - }); - - it("add wallet using a privatekey", function() { - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.add(test.privateKey); - assert.equal(wallet.address, test.address); - assert.equal(wallet.privateKey, test.privateKey); - assert.isFunction(wallet.signTransaction); - assert.isFunction(wallet.sign); - assert.equal(wallet.index, 0); - - // test if its retrievabe via address and index - assert.equal(ethAccounts.wallet[test.address].address, test.address); - assert.equal(ethAccounts.wallet[test.address.toLowerCase()].address, test.address); - assert.equal(ethAccounts.wallet[0].address, test.address); - - assert.equal(ethAccounts.wallet.length, 1); - }); - - it("add wallet using an account", function() { - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.add({ - address: test.address, - privateKey: test.privateKey - }); - assert.equal(wallet.address, test.address); - assert.equal(wallet.privateKey, test.privateKey); - assert.isFunction(wallet.signTransaction); - assert.isFunction(wallet.sign); - assert.equal(wallet.index, 0); - - // test if its retrievabe via address and index - assert.equal(ethAccounts.wallet[test.address].address, test.address); - assert.equal(ethAccounts.wallet[test.address.toLowerCase()].address, test.address); - assert.equal(ethAccounts.wallet[0].address, test.address); - - assert.equal(ethAccounts.wallet.length, 1); - }); - - it("add wallet double shouldn't work", function() { - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.add({ - address: test.address, - privateKey: test.privateKey - }); - wallet = ethAccounts.wallet.add({ - address: test.address, - privateKey: test.privateKey - }); - wallet = ethAccounts.wallet.add(test.privateKey); - - assert.equal(wallet.address, test.address); - assert.equal(wallet.privateKey, test.privateKey); - assert.isFunction(wallet.signTransaction); - assert.isFunction(wallet.sign); - assert.equal(wallet.index, 0); - - // test if its retrievabe via address and index - assert.equal(ethAccounts.wallet[test.address].address, test.address); - assert.equal(ethAccounts.wallet[test.address.toLowerCase()].address, test.address); - assert.equal(ethAccounts.wallet[0].address, test.address); - - assert.equal(ethAccounts.wallet.length, 1); - }); - - it("remove wallet using an index", async function() { - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.add(test.privateKey); - assert.equal(ethAccounts.wallet.length, 1); - - // await setImmediate to fix wallet race condition when calling `wallet.remove` immediately after `wallet.add` - await new Promise(resolve => setImmediate(resolve)); - - ethAccounts.wallet.remove(0); - - assert.isUndefined(ethAccounts.wallet[0]); - assert.isUndefined(ethAccounts.wallet[wallet.address]); - assert.isUndefined(ethAccounts.wallet[wallet.address.toLowerCase()]); - - assert.equal(ethAccounts.wallet.length, 0); - - }); - - it("remove wallet using an address", async function() { - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.add(test.privateKey); - assert.equal(ethAccounts.wallet.length, 1); - - // await setImmediate to fix wallet race condition when calling `wallet.remove` immediately after `wallet.add` - await new Promise(resolve => setImmediate(resolve)); - - ethAccounts.wallet.remove(test.address); - - assert.isUndefined(ethAccounts.wallet[0]); - assert.isUndefined(ethAccounts.wallet[wallet.address]); - assert.isUndefined(ethAccounts.wallet[wallet.address.toLowerCase()]); - - assert.equal(ethAccounts.wallet.length, 0); - - }); - - it("remove wallet using an lowercase address", async function() { - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.add(test.privateKey); - assert.equal(ethAccounts.wallet.length, 1); - - // await setImmediate to fix wallet race condition when calling `wallet.remove` immediately after `wallet.add` - await new Promise(resolve => setImmediate(resolve)); - - ethAccounts.wallet.remove(test.address.toLowerCase()); - - assert.isUndefined(ethAccounts.wallet[0]); - assert.isUndefined(ethAccounts.wallet[wallet.address]); - assert.isUndefined(ethAccounts.wallet[wallet.address.toLowerCase()]); - - assert.equal(ethAccounts.wallet.length, 0); - - }); - - it("create 5 wallets, remove two, create two more and check for overwrites", async function() { - var count = 5; - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.create(count); - var initialAddresses = [0,1,2,3,4].map(function(n) { return wallet[n].address } ); - assert.equal(ethAccounts.wallet.length, count); - - var thirdAddress = ethAccounts.wallet[2].address; - var lastAddress = ethAccounts.wallet[4].address; - var remainingAddresses = [0,1,3]; - var beforeRemoval = remainingAddresses.map(function(n) { return wallet[n].address } ); - - // await setImmediate to fix wallet race condition when calling `wallet.remove` immediately after `wallet.add` - await new Promise(resolve => setImmediate(resolve)); - - ethAccounts.wallet.remove(2); - ethAccounts.wallet.remove(4); - - assert.isUndefined(ethAccounts.wallet[2]); - assert.isUndefined(ethAccounts.wallet[thirdAddress]); - assert.isUndefined(ethAccounts.wallet[thirdAddress.toLowerCase()]); - assert.isUndefined(ethAccounts.wallet[4]); - assert.isUndefined(ethAccounts.wallet[lastAddress]); - assert.isUndefined(ethAccounts.wallet[lastAddress.toLowerCase()]); - - var afterRemoval = remainingAddresses.map(function(n) { return wallet[n].address } ); - - assert.equal(ethAccounts.wallet._findSafeIndex(), 2); - assert.equal(ethAccounts.wallet.length, 3); - - ethAccounts.wallet.create(2); - assert.isTrue(web3.utils.isAddress(wallet[2].address)); - assert.isTrue(web3.utils.isAddress(wallet[4].address)); - assert.isUndefined(ethAccounts.wallet[5]); - - var afterMoreCreation = remainingAddresses.map(function(n) { return wallet[n].address } ); - var newAddresses = [0,1,2,3,4].map(function(n) { return wallet[n].address } ); - - // Checks for account overwrites - assert.sameOrderedMembers(beforeRemoval, afterMoreCreation, "same ordered members"); - assert.sameOrderedMembers(afterRemoval, afterMoreCreation, "same ordered members"); - assert.notSameMembers(initialAddresses, newAddresses, "not same members"); - - assert.equal(ethAccounts.wallet.length, count); - }); - - it("clear wallet", async function() { - this.timeout(10000); - - var count = 10; - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.create(count); - assert.equal(ethAccounts.wallet.length, count); - - var addresses = []; - for (var i = 0; i < count; i++) { - addresses.push(wallet[i].address); - } - - // await setImmediate to fix wallet race condition when calling `wallet.remove` immediately after `wallet.add` - await new Promise(resolve => setImmediate(resolve)); - - ethAccounts.wallet.clear(); - - for (var i = 0; i < count; i++) { - assert.isUndefined(ethAccounts.wallet[i]); - assert.isUndefined(ethAccounts.wallet[addresses[i]]); - assert.isUndefined(ethAccounts.wallet[addresses[i].toLowerCase()]); - } - - assert.equal(ethAccounts.wallet.length, 0); - }); - - it("remove accounts then clear wallet", async function() { - this.timeout(10000); - - var count = 10; - var ethAccounts = new Accounts(); - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.create(count); - assert.equal(ethAccounts.wallet.length, count); - - var addresses = []; - for (var i = 0; i < count; i++) { - addresses.push(wallet[i].address); - } - - // await setImmediate to fix wallet race condition when calling `wallet.remove` immediately after `wallet.add` - await new Promise(resolve => setImmediate(resolve)); - - ethAccounts.wallet.remove(0); - assert.isUndefined(ethAccounts.wallet[0]) - ethAccounts.wallet.remove(5); - assert.isUndefined(ethAccounts.wallet[5]) - - ethAccounts.wallet.clear(); - - await new Promise(resolve => setImmediate(resolve)); - - for (var i = 0; i < count; i++) { - assert.isUndefined(ethAccounts.wallet[i]); - assert.isUndefined(ethAccounts.wallet[addresses[i]]); - assert.isUndefined(ethAccounts.wallet[addresses[i].toLowerCase()]); - } - - assert.equal(ethAccounts.wallet.length, 0); - }); - - it("encrypt then decrypt wallet", async function() { - this.timeout(10000); - - var ethAccounts = new Accounts(); - var password = "qwerty"; - - assert.equal(ethAccounts.wallet.length, 0); - - var wallet = ethAccounts.wallet.create(5); - var addressFromWallet = ethAccounts.wallet[0].address; - assert.equal(ethAccounts.wallet.length, 5); - - // await setImmediate to fix wallet race condition when calling `wallet.remove` immediately after `wallet.add` - await new Promise(resolve => setImmediate(resolve)); - - ethAccounts.wallet.remove(2); - assert.equal(ethAccounts.wallet.length, 4); - - var keystore = ethAccounts.wallet.encrypt(password); - assert.equal(keystore.length, 4); - - ethAccounts.wallet.clear(); - assert.equal(ethAccounts.wallet.length, 0); - - ethAccounts.wallet.decrypt(keystore, password); - assert.equal(ethAccounts.wallet.length, 4); - - var addressFromKeystore = ethAccounts.wallet[0].address; - assert.equal(addressFromKeystore, addressFromWallet); - }); - }); - }); -}); diff --git a/test/eth.call.js b/test/eth.call.js deleted file mode 100644 index eea4b019cab..00000000000 --- a/test/eth.call.js +++ /dev/null @@ -1,40 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'call'; - -var tests = [{ - args: [{ - to: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - data: '0x23455654', - gas: 11, - gasPrice: 11 - }], - formattedArgs: [{ - to: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - data: '0x23455654', - gas: '0xb', - gasPrice: '0xb' - }, 'latest'], - result: '0x31981', - formattedResult: '0x31981', - call: 'eth_'+ method -},{ - args: [{ - to: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - data: '0x23455654', - gas: 11, - gasPrice: 11 - }, 11], - formattedArgs: [{ - to: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - data: '0x23455654', - gas: '0xb', - gasPrice: '0xb' - }, '0xb'], - result: '0x31981', - formattedResult: '0x31981', - call: 'eth_'+ method -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.defaultAccount.js b/test/eth.defaultAccount.js deleted file mode 100644 index 1e61dcea693..00000000000 --- a/test/eth.defaultAccount.js +++ /dev/null @@ -1,53 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); -var Web3 = require('../packages/web3'); - -var eth = new Eth(); - -var setValue = '0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855'; - -describe('web3.eth', function () { - describe('defaultAccount', function () { - it('should check if defaultAccount is set to proper value', function () { - assert.equal(eth.defaultAccount, null); - assert.equal(eth.personal.defaultAccount, null); - assert.equal(eth.Contract.defaultAccount, null); - assert.equal(eth.getCode.method.defaultAccount, null); - }); - it('should set defaultAccount for all sub packages is set to proper value, if Eth package is changed', function () { - eth.defaultAccount = setValue; - - assert.equal(eth.defaultAccount, setValue); - assert.equal(eth.personal.defaultAccount, setValue); - assert.equal(eth.Contract.defaultAccount, setValue); - assert.equal(eth.getCode.method.defaultAccount, setValue); - }); - it('should fail if address is invalid, wich is to be set to defaultAccount', function () { - - assert.throws(function(){ eth.defaultAccount = '0x17F33b27Bb249a2DBab4C0612BF9CaF4C1950855'; }); - - }); - it('should have different values for two Eth instances', function () { - - var eth1 = new Eth(); - eth1.defaultAccount = setValue; - assert.equal(eth1.defaultAccount, setValue); - - var eth2 = new Eth(); - assert.equal(eth2.defaultAccount, null); - - }); - it('should have different values for two Web3 instances', function () { - - var web31 = new Web3(); - web31.eth.defaultAccount = setValue; - assert.equal(web31.eth.defaultAccount, setValue); - - var web32 = new Web3(); - assert.equal(web32.eth.defaultAccount, null); - - }); - }); -}); - diff --git a/test/eth.defaultBlock.js b/test/eth.defaultBlock.js deleted file mode 100644 index b8dec964100..00000000000 --- a/test/eth.defaultBlock.js +++ /dev/null @@ -1,27 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var setValue = 123; - -describe('web3.eth', function () { - describe('defaultBlock', function () { - it('should check if defaultBlock is set to proper value', function () { - assert.equal(eth.defaultBlock, 'latest'); - assert.equal(eth.personal.defaultBlock, 'latest'); - assert.equal(eth.Contract.defaultBlock, 'latest'); - assert.equal(eth.getCode.method.defaultBlock, 'latest'); - }); - it('should set defaultBlock for all sub packages is set to proper value, if Eth package is changed', function () { - eth.defaultBlock = setValue; - - assert.equal(eth.defaultBlock, setValue); - assert.equal(eth.personal.defaultBlock, setValue); - assert.equal(eth.Contract.defaultBlock, setValue); - assert.equal(eth.getCode.method.defaultBlock, setValue); - }); - }); -}); - diff --git a/test/eth.ens.js b/test/eth.ens.js deleted file mode 100644 index 5bf4f6a714b..00000000000 --- a/test/eth.ens.js +++ /dev/null @@ -1,2490 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var FakeIpcProvider = require('./helpers/FakeIpcProvider'); -var FakeHttpProvider = require('./helpers/FakeHttpProvider'); -var Web3 = require('../packages/web3'); -var sha3 = require('../packages/web3-utils').sha3; -var formatters = require('web3-core-helpers').formatters; -var abiCoder = require('web3-eth-abi'); -var utils = require('web3-utils'); -var namehash = require('eth-ens-namehash'); -var asciiToHex = require('../packages/web3-utils').asciiToHex; - -/** - * Injects the required validations and results for the `eth_sendTransaction` call - * - * @method prepareProviderForSetter - * - * @param {FakeIpcProvider} provider - * @param {String} signature - * @param {Array} types - * @param {Array} params - * @param {Boolean} error - * - * @returns {void} - */ -function prepareProviderForSetter(provider, signature, types, params, error) { - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual( - payload.params, - [{ - from: '0x0123456701234567012345670123456701234567', - gas: '0x64', - gasPrice: '0x64', - nonce: '0x1', - data: sha3(signature).slice(0, 10) + abiCoder.encodeParameters(types, params).substr(2), - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e' - }] - ); - }); - provider.injectResult('0x1234000000000000000000000000000000000000000000000000000000056789'); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234000000000000000000000000000000000000000000000000000000056789']); - }); - provider.injectResult({ - contractAddress: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xbf1234', - gasUsed: '0x0', - status: error ? '0x0' : '0x1' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_unsubscribe'); - assert.deepEqual(payload.params, ['0x1234567']); - }); - provider.injectResult('0x321'); -} - -/** - * Checks if the receipt got mapped as expected and not manipulated in a strange way within the ENS module - * - * @method isExpectedReceipt - * - * @param {Object} receipt - * - * @returns {void} - */ -function isExpectedReceipt(receipt) { - assert.equal(receipt.contractAddress, '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'); - assert.equal(receipt.cumulativeGasUsed, 10); - assert.equal(receipt.transactionIndex, 3); - assert.equal(receipt.blockNumber, 10); - assert.equal(receipt.blockHash, '0xbf1234'); - assert.equal(receipt.gasUsed, 0); -} - -describe('ens', function () { - let provider; - let web3; - const hashedName = namehash.hash('foobar.eth'); - const name = 'foobar.eth'; - - describe('setters', function () { - beforeEach(function () { - provider = new FakeIpcProvider(); - web3 = new Web3(provider); - - provider.injectResult({ - timestamp: Math.floor(new Date() / 1000) - 60, - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['latest', false]); - }); - - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'net_version'); - assert.deepEqual(payload.params, []); - }); - - provider.injectResult({ - hash: '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', - blockNumber: '0x0' - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['0x0', false]); - }); - }); - - it('should set the property "registryAddress" to "null" and not throw any error', function() { - web3.eth.ens.registryAddress = null; - - assert.equal(web3.eth.ens.registryAddress, null); - }); - - it('should set the owner record for a name', async function () { - this.timeout(10000); - const signature = 'setOwner(bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address'], - [hashedName, '0x0123456701234567012345670123456701234567'], - false - ); - - const receipt = await web3.eth.ens.setOwner( - name, - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should set the owner record for a name and throw the expected error (callback)', function (done) { - const signature = 'setOwner(bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address'], - [hashedName, '0x0123456701234567012345670123456701234567'], - true - ); - - web3.eth.ens.setOwner( - name, - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }, - function (error, result) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should set the owner record for a name and throw the expected error (promise)', async function () { - const signature = 'setOwner(bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address'], - [hashedName, '0x0123456701234567012345670123456701234567'], - true - ); - - try { - await web3.eth.ens.setOwner( - name, - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - } - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - } - }); - - it('should set the record for a name', async function () { - const signature = 'setRecord(bytes32,address,address,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address', 'address', 'uint64'], - [ - hashedName, - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000 - ], - false - ); - - const receipt = await web3.eth.ens.setRecord( - name, - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should set the record for a name and throw the expected error (callback)', function (done) { - const signature = 'setRecord(bytes32,address,address,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address', 'address', 'uint64'], - [ - hashedName, - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000 - ], - true - ); - - web3.eth.ens.setRecord( - name, - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }, - function (error, result) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should set the record for a name and throw the expected error (promise)', async function () { - const signature = 'setRecord(bytes32,address,address,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address', 'address', 'uint64'], - [ - hashedName, - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000 - ], - true - ); - - try { - await web3.eth.ens.setRecord( - name, - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - } - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - } - }); - - it('should set the owner, resolver, and ttl for a name', async function () { - const signature = 'setSubnodeRecord(bytes32,bytes32,address,address,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address', 'address', 'uint64'], - [ - hashedName, - utils.sha3('label'), - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000 - ], - false - ); - - const receipt = await web3.eth.ens.setSubnodeRecord( - name, - 'label', - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should set the owner, resolver, and ttl for a name with already hashed label', async function () { - const signature = 'setSubnodeRecord(bytes32,bytes32,address,address,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address', 'address', 'uint64'], - [ - hashedName, - utils.sha3('label'), - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000 - ], - false - ); - - const receipt = await web3.eth.ens.setSubnodeRecord( - name, - utils.sha3('label'), - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should set the owner, resolver, and ttl for a name and throw the expected error (callback)', function (done) { - const signature = 'setSubnodeRecord(bytes32,bytes32,address,address,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address', 'address', 'uint64'], - [ - hashedName, - utils.sha3('label'), - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000 - ], - true - ); - - web3.eth.ens.setSubnodeRecord( - name, - 'label', - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }, - function (error, result) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should set the owner, resolver, and ttl for a name and throw the expected error (promise)', async function () { - const signature = 'setSubnodeRecord(bytes32,bytes32,address,address,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address', 'address', 'uint64'], - [ - hashedName, - utils.sha3('label'), - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000 - ], - true - ); - - try { - await web3.eth.ens.setSubnodeRecord( - name, - 'label', - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - 10000, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - } - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - } - }); - - it('should set an approval by the given operator', async function () { - const signature = 'setApprovalForAll(address,bool)'; - - prepareProviderForSetter( - provider, - signature, - ['address', 'bool'], - [ - '0x0123456701234567012345670123456701234567', - true - ], - false - ); - - const receipt = await web3.eth.ens.setApprovalForAll( - '0x0123456701234567012345670123456701234567', - true, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should set an approval by the given operator and throw the expected error (callback)', function (done) { - const signature = 'setApprovalForAll(address,bool)'; - - prepareProviderForSetter( - provider, - signature, - ['address', 'bool'], - [ - '0x0123456701234567012345670123456701234567', - true - ], - true - ); - - web3.eth.ens.setApprovalForAll( - '0x0123456701234567012345670123456701234567', - true, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }, - function (error, result) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should set an approval by the given operator and throw the expected error (promise)', async function () { - const signature = 'setApprovalForAll(address,bool)'; - - prepareProviderForSetter( - provider, - signature, - ['address', 'bool'], - [ - '0x0123456701234567012345670123456701234567', - true - ], - true - ); - - try { - await web3.eth.ens.setApprovalForAll( - '0x0123456701234567012345670123456701234567', - true, - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - } - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - } - }); - - it('should set the owner, resolver, and TTL for an record', async function () { - const signature = 'setResolver(bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address'], - [hashedName, '0x0123456701234567012345670123456701234567'], - false - ); - - const receipt = await web3.eth.ens.setResolver( - name, - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should set the owner, resolver, and TTL for an record and throw the expected error (callback)', function (done) { - const signature = 'setResolver(bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address'], - [hashedName, '0x0123456701234567012345670123456701234567'], - true - ); - - web3.eth.ens.setResolver( - name, - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }, - function (error, result) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should set the owner, resolver, and TTL for an record and throw the expected error (promise)', async function () { - const signature = 'setResolver(bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'address'], - [hashedName, '0x0123456701234567012345670123456701234567'], - true - ); - - try { - await web3.eth.ens.setResolver( - name, - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - } - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - } - }); - - it('should set the TTL (caching time) record for a name', async function () { - const signature = 'setTTL(bytes32,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'uint64'], - [hashedName, '1'], - false - ); - - const receipt = await web3.eth.ens.setTTL( - name, - '1', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should call the TTL (caching time) record setter for a name and throw the expected error (callback)', function (done) { - const signature = 'setTTL(bytes32,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'uint64'], - [hashedName, '1'], - true - ); - - web3.eth.ens.setTTL( - name, - '1', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }, - function (error, result) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should call the TTL (caching time) record setter for a name and throw the expected error (promise)', async function () { - const signature = 'setTTL(bytes32,uint64)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'uint64'], - [hashedName, '1'], - true - ); - - try { - await web3.eth.ens.setTTL( - name, - '1', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - } - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - } - }); - - it('should create a new sub node with the specified label and owner', async function () { - const signature = 'setSubnodeOwner(bytes32,bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address'], - [hashedName, utils.sha3('label'), '0x0123456701234567012345670123456701234567'], - false - ); - - const receipt = await web3.eth.ens.setSubnodeOwner( - name, - 'label', - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should create a new sub node with the specified hashed label and owner', async function () { - const signature = 'setSubnodeOwner(bytes32,bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address'], - [hashedName, utils.sha3('label'), '0x0123456701234567012345670123456701234567'], - false - ); - - const receipt = await web3.eth.ens.setSubnodeOwner( - name, - utils.sha3('label'), - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }); - - isExpectedReceipt(receipt); - }); - - it('should create a new sub node with the specified label and owner and throw the expected error (callback)', function (done) { - const signature = 'setSubnodeOwner(bytes32,bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address'], - [hashedName, utils.sha3('label'), '0x0123456701234567012345670123456701234567'], - true - ); - - web3.eth.ens.setSubnodeOwner( - name, - 'label', - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - }, - function (error, result) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should create a new sub node with the specified label and owner and throw the expected error (promise)', async function () { - const signature = 'setSubnodeOwner(bytes32,bytes32,address)'; - - prepareProviderForSetter( - provider, - signature, - ['bytes32', 'bytes32', 'address'], - [hashedName, utils.sha3('label'), '0x0123456701234567012345670123456701234567'], - true - ); - - try { - await web3.eth.ens.setSubnodeOwner( - name, - 'label', - '0x0123456701234567012345670123456701234567', - { - from: '0x0123456701234567012345670123456701234567', - gas: 100, - gasPrice: 100, - nonce: 1 - } - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('Transaction has been reverted by the EVM')); - } - }); - }); - - describe('getters', function () { - beforeEach(function () { - provider = new FakeHttpProvider(); - web3 = new Web3(provider); - - provider.injectResult({ - timestamp: Math.floor(new Date() / 1000) - 60, - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['latest', false]); - }); - - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'net_version'); - assert.deepEqual(payload.params, []); - }); - - provider.injectResult({ - hash: '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', - blockNumber: '0x0' - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['0x0', false]); - }); - }); - - it('should call supportsInterface with the interfaceId and return "true" (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const supportsInterfaceSignature = 'supportsInterface(bytes4)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(supportsInterfaceSignature).slice(0, 10) + sha3('addr(bytes32)').slice(2, 10) + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - const owner = await web3.eth.ens.supportsInterface('foobar.eth', '0x3b3b57de'); - - assert.equal(owner, true); - }); - - it('should call supportsInterface with the interfaceId and return "true" (callback)', function (done) { - const resolverSignature = 'resolver(bytes32)'; - const supportsInterfaceSignature = 'supportsInterface(bytes4)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(supportsInterfaceSignature).slice(0, 10) + sha3('addr(bytes32)').slice(2, 10) + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - web3.eth.ens.supportsInterface('foobar.eth', '0x3b3b57de', function (error, owner) { - assert.equal(owner, true); - - done(); - }); - - }); - - it('should call supportsInterface with the signature and throw the expected error (callback)', function (done) { - const resolverSignature = 'resolver(bytes32)'; - const supportsInterfaceSignature = 'supportsInterface(bytes4)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(supportsInterfaceSignature).slice(0, 10) + sha3('addr(bytes32)').slice(2, 10) + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.supportsInterface( - 'foobar.eth', - 'addr(bytes32)', - function (error, supported) { - assert.equal(supported, null); - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - - done(); - }); - }); - - it('should call supportsInterface with the signature and throw the expected error (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const supportsInterfaceSignature = 'supportsInterface(bytes4)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(supportsInterfaceSignature).slice(0, 10) + sha3('addr(bytes32)').slice(2, 10) + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.supportsInterface('foobar.eth', 'addr(bytes32)'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call getTTL and return the expected result (promise)', async function () { - const signature = 'ttl(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - const ttl = await web3.eth.ens.getTTL('foobar.eth'); - - assert.equal(ttl, 1); - }); - - it('should call getTTL and return the expected result (callback)', function (done) { - const signature = 'ttl(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - web3.eth.ens.getTTL('foobar.eth', function (error, ttl) { - assert.equal(ttl, 1); - - done(); - }); - - }); - - it('should call getTTL and throw the expected error (callback)', function (done) { - const signature = 'ttl(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.getTTL( - 'foobar.eth', - function (error, ttl) { - assert.equal(ttl, null); - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - - done(); - }); - }); - - it('should call getTTL and throw the expected error (promise)', async function () { - const signature = 'ttl(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.getTTL('foobar.eth'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call isApprovedForAll and return the expected result (promise)', async function () { - const signature = 'isApprovedForAll(address,address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '00000000000000000000000001234567012345670123456701234567012345670000000000000000000000000123456701234567012345670123456701234567', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - const isApproved = await web3.eth.ens.isApprovedForAll( - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567' - ); - - assert.equal(isApproved, true); - }); - - it('should call isApprovedForAll and return the expected result (callback)', function (done) { - const signature = 'isApprovedForAll(address,address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '00000000000000000000000001234567012345670123456701234567012345670000000000000000000000000123456701234567012345670123456701234567', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - web3.eth.ens.isApprovedForAll( - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - function (error, isApproved) { - assert.equal(isApproved, true); - - done(); - } - ); - }); - - it('should call isApprovedForAll and throws the expected error (callback)', function (done) { - const signature = 'isApprovedForAll(address,address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '00000000000000000000000001234567012345670123456701234567012345670000000000000000000000000123456701234567012345670123456701234567', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.isApprovedForAll( - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567', - function (error, isApproved) { - assert.equal(isApproved, null); - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - - done(); - }); - }); - - it('should call isApprovedForAll and throws the expected error (promise)', async function () { - const signature = 'isApprovedForAll(address,address)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '00000000000000000000000001234567012345670123456701234567012345670000000000000000000000000123456701234567012345670', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.isApprovedForAll( - '0x0123456701234567012345670123456701234567', - '0x0123456701234567012345670123456701234567' - ); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call recordExists and return the expected result (promise)', async function () { - const signature = 'recordExists(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - const exists = await web3.eth.ens.recordExists(name); - - assert.equal(exists, true); - }); - - it('should call recordExists and return the expected result (callback)', function (done) { - const signature = 'recordExists(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - web3.eth.ens.recordExists( - name, - function (error, exists) { - assert.equal(exists, true); - - done(); - } - ); - }); - - it('should call recordExists and throws the expected error (callback)', function (done) { - const signature = 'recordExists(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.recordExists( - name, - function (error, isApproved) { - assert.equal(isApproved, null); - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - - done(); - }); - }); - - it('should call recordExists and throws the expected error (promise)', async function () { - const signature = 'recordExists(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.recordExists(name); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should return the owner record for a name (owner)', async function () { - const signature = 'owner(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - const owner = await web3.eth.ens.registry.getOwner('foobar.eth'); - - assert.equal(owner, '0x0123456701234567012345670123456701234567'); - }); - - it('should call getOwner and return the expected owner (promise)', async function () { - const signature = 'owner(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - const owner = await web3.eth.ens.getOwner('foobar.eth'); - - assert.equal(owner, '0x0123456701234567012345670123456701234567'); - }); - - it('should call getOwner and return the expected owner (callback)', function (done) { - const signature = 'owner(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - web3.eth.ens.getOwner('foobar.eth', function (error, owner) { - assert.equal(owner, '0x0123456701234567012345670123456701234567'); - assert.equal(error, '0x0123456701234567012345670123456701234567'); // For backward compatibility - done(); - }); - }); - - it('should call getOwner and throw the expected error (callback)', function (done) { - const signature = 'owner(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.getOwner('foobar.eth', function (error, owner) { - assert.equal(owner, null); - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - - done(); - }); - }); - - it('should call getOwner and throw the error on requesting of registry contract (callback)', function (done) { - const signature = 'owner(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.getOwner('foobar.eth', function (error, owner) { - assert.equal(owner, null); - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - - done(); - }); - }); - - it('should call getOwner and throw the error on requesting of registry contract (promise)', async function () { - const signature = 'owner(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.getOwner('foobar.eth'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call resolver and return the expected resolver (promise)', async function () { - const signature = 'resolver(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - const resolver = await web3.eth.ens.getResolver('foobar.eth'); - - assert.equal(resolver.options.address, '0x0123456701234567012345670123456701234567'); - }); - - it('should call resolver and return the expected resolver (callback)', function (done) { - const signature = 'resolver(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - web3.eth.ens.getResolver('foobar.eth', function (error, resolver) { - assert.equal(resolver.options.address, '0x0123456701234567012345670123456701234567'); - assert.equal(error.options.address, '0x0123456701234567012345670123456701234567'); // For backward compatibility - - done(); - }); - }); - - it('should call getResolver and return the expected resolver (promise)', async function () { - const signature = 'resolver(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - const resolver = await web3.eth.ens.getResolver('foobar.eth'); - - assert.equal(resolver.options.address, '0x0123456701234567012345670123456701234567'); - }); - - it('should call getResolver and throw the expected error (promise)', async function () { - const signature = 'resolver(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.getResolver('foobar.eth'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call getResolver and throw the expected error on the contract registry call (promise)', async function () { - const signature = 'resolver(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.getResolver('foobar.eth'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call getResolver and throw the expected error (callback)', function (done) { - const signature = 'resolver(bytes32)'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(signature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.getResolver('foobar.eth', function (error, resolver) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - assert.equal(resolver, null); - - done(); - }); - }); - - it('should call getAddress and return the expected address (promise)', async function () { - const resolverSig = 'resolver(bytes32)'; - const addrSig = 'addr(bytes32)'; - const addrInterfaceId = "3b3b57de"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + addrInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(addrSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000001234567012345670123456701234567012345670'); - - const addr = await web3.eth.ens.getAddress('foobar.eth'); - - assert.equal(addr, '0x1234567012345670123456701234567012345670'); - }); - - it('should call getAddress and return the expected address (callback)', function (done) { - const resolverSig = 'resolver(bytes32)'; - const addrSig = 'addr(bytes32)'; - const addrInterfaceId = "3b3b57de"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + addrInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(addrSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000001234567012345670123456701234567012345670'); - - web3.eth.ens.getAddress('foobar.eth', function (error, addr) { - assert.equal(error, '0x1234567012345670123456701234567012345670'); // For backward compatibility - assert.equal(addr, '0x1234567012345670123456701234567012345670'); - - done(); - }); - }); - - it('should call getAddress and throw the expected error (promise)', async function () { - const resolverSig = 'resolver(bytes32)'; - const addrSig = 'addr(bytes32)'; - const addrInterfaceId = "3b3b57de"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + addrInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(addrSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.getAddress('foobar.eth'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - - }); - - it('should call getAddress and throw the expected error (callback)', function (done) { - const resolverSig = 'resolver(bytes32)'; - const addrSig = 'addr(bytes32)'; - const addrInterfaceId = "3b3b57de"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + addrInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(addrSig).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.getAddress('foobar.eth', function (error, addr) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - assert.equal(addr, null); - - done(); - }); - }); - - it('should call getPubkey and return the expected X and Y value (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const pubkeySignature = 'pubkey(bytes32)'; - const pubkeyInterfaceId = "c8690233"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + pubkeyInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(pubkeySignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - const pubkeyCoordinateAsHex = asciiToHex('0x0000000000000000000000000000000000000000000000000000000000000000'); - provider.injectResult([ - pubkeyCoordinateAsHex, - pubkeyCoordinateAsHex - ]); - - const result = await web3.eth.ens.getPubkey('foobar.eth'); - - assert.equal(result[0][0], '0x3078303030303030303030303030303030303030303030303030303030303030'); - assert.equal(result[0][1], '0x3030303030303030303030303030303030303030303030303030303030303030'); - }); - - it('should call getPubkey and return the expected X and Y value (callback)', function (done) { - const resolverSignature = 'resolver(bytes32)'; - const pubkeySignature = 'pubkey(bytes32)'; - const pubkeyInterfaceId = "c8690233"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + pubkeyInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(pubkeySignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - const pubkeyCoordinateAsHex = asciiToHex('0x0000000000000000000000000000000000000000000000000000000000000000'); - provider.injectResult([ - pubkeyCoordinateAsHex, - pubkeyCoordinateAsHex - ]); - - web3.eth.ens.getPubkey( - 'foobar.eth', - function (error, result) { - assert.equal(result[0][0], '0x3078303030303030303030303030303030303030303030303030303030303030'); - assert.equal(result[0][1], '0x3030303030303030303030303030303030303030303030303030303030303030'); - assert.equal(error[0][0], '0x3078303030303030303030303030303030303030303030303030303030303030'); - assert.equal(error[0][1], '0x3030303030303030303030303030303030303030303030303030303030303030'); - - done(); - } - ); - - }); - - it('should call getPubkey and throw the expected error (callback)', function (done) { - const resolverSignature = 'resolver(bytes32)'; - const pubkeySignature = 'pubkey(bytes32)'; - const pubkeyInterfaceId = "c8690233"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + pubkeyInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(pubkeySignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - const pubkeyCoordinateAsHex = asciiToHex('0x0000000000000000000000000000000000000000000000000000000000000000'); - provider.injectResult([ - pubkeyCoordinateAsHex, - pubkeyCoordinateAsHex - ]); - - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.getPubkey( - 'foobar.eth', - function (error, result) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - assert.equal(result, null); - - done(); - } - ); - }); - - it('should call getPubkey and throw the expected error (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const pubkeySignature = 'pubkey(bytes32)'; - const pubkeyInterfaceId = "c8690233"; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + pubkeyInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(pubkeySignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - const pubkeyCoordinateAsHex = asciiToHex('0x0000000000000000000000000000000000000000000000000000000000000000'); - provider.injectResult([ - pubkeyCoordinateAsHex, - pubkeyCoordinateAsHex - ]); - - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.getPubkey('foobar.eth'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call getContent and return the expected content of the resolver (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'content(bytes32)'; - const contentInterfaceId = 'd8389dc5'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contentInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(contentSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000000'); - - const result = await web3.eth.ens.getContent('foobar.eth'); - - assert.equal(result, '0x0000000000000000000000000000000000000000000000000000000000000000'); - }); - - it('should call getContent and return the expected content of the resolver (callback)', function () { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'content(bytes32)'; - const contentInterfaceId = 'd8389dc5'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contentInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(contentSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000000'); - - web3.eth.ens.getContent( - 'foobar.eth', - function (error, result) { - assert.equal(result, '0x0000000000000000000000000000000000000000000000000000000000000000'); - assert.equal(error, '0x0000000000000000000000000000000000000000000000000000000000000000'); - - } - ); - }); - - it('should call getContent and throw the expected error (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'content(bytes32)'; - const contentInterfaceId = 'd8389dc5'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contentInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(contentSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - try { - await web3.eth.ens.getContent('foobar.eth'); - - assert.fail(); - } catch (error) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - } - }); - - it('should call getContent and throw the expected error (callback)', function () { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'content(bytes32)'; - const contentInterfaceId = 'd8389dc5'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contentInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000001'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(contentSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000000'); - - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - provider.error.push(null); - - provider.injectError({ - code: 1234, - message: 'ERROR' - }); - - web3.eth.ens.getContent( - 'foobar.eth', - function (error, result) { - assert.equal(error.code, 1234); - assert.equal(error.message, 'ERROR'); - assert.equal(result, null); - } - ); - }); - - it('should error if resolver ABI does not support contenthash (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'contenthash(bytes32)'; - const contenthashInterfaceId = 'bc1c58d1'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contenthashInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000000'); - - try { - await web3.eth.ens.getContenthash('foobar.eth'); - - assert.fail(); - } catch (error) { - assert(error.message.includes('does not implement requested method: "contenthash"')); - } - }); - - it('should error if resolver ABI does not support contenthash (callback)', function (done) { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'contenthash(bytes32)'; - const contenthashInterfaceId = 'bc1c58d1'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contenthashInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000000'); - - web3.eth.ens.getContenthash( - 'foobar.eth', - function (error, result) { - assert(error.message.includes('does not implement requested method: "contenthash"')); - assert.equal(result, null); - done(); - } - ); - }); - - it('should error if resolver ABI does not support setContenthash (promise)', async function () { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'setContenthash(bytes32)'; - const contenthashInterfaceId = 'bc1c58d1'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contenthashInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000000'); - - try { - await web3.eth.ens.setContenthash( - 'foobar.eth', - 'ipfs://QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn' - ); - - assert.fail(); - } catch (error) { - assert(error.message.includes('does not implement requested method: "setContenthash"')); - } - }); - - it('should error if resolver ABI does not support setContenthash (callback)', function (done) { - const resolverSignature = 'resolver(bytes32)'; - const contentSignature = 'setContenthash(bytes32)'; - const contenthashInterfaceId = 'bc1c58d1'; - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3(resolverSignature).slice(0, 10) + '1757b5941987904c18c7594de32c1726cda093fdddacb738cfbc4a7cd1ef4370', - to: '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000123456701234567012345670123456701234567'); - - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - data: sha3('supportsInterface(bytes4)').slice(0, 10) + contenthashInterfaceId + '00000000000000000000000000000000000000000000000000000000', - to: '0x0123456701234567012345670123456701234567', - }, 'latest']); - }); - provider.injectResult('0x0000000000000000000000000000000000000000000000000000000000000000'); - - web3.eth.ens.setContenthash( - 'foobar.eth', - 'ipfs://QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn', - { - from: '0x0123456701234567012345670123456701234567', - gas: 4000000, - gasPrice: 1 - }, - function (error, result) { - assert(error.message.includes('does not implement requested method: "setContenthash"')); - assert.equal(result, null); - done(); - } - ); - }); - }); - - describe('checkNetwork', function () { - it("won't resolve on an unknown network", async function () { - provider = new FakeHttpProvider(); - web3 = new Web3(provider); - - provider.injectResult({ - timestamp: Math.floor(new Date() / 1000) - 60, - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['latest', false]); - }); - - provider.injectResult(1); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'net_version'); - assert.deepEqual(payload.params, []); - }); - - provider.injectResult({ - hash: '0x0123456701234567012345670123456701234567012345670123456701234567', - blockNumber: '0x0' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['0x0', false]); - }); - - try { - await web3.eth.ens.getAddress('foobar.eth'); - assert.fail(); - } catch (err) { - assert.isTrue(err instanceof Error, 'Should throw error'); - } - }); - - it("won't resolve when out of date", async function () { - provider = new FakeHttpProvider(); - web3 = new Web3(provider); - - provider.injectResult({ - timestamp: Math.floor(new Date() / 1000) - 3660, - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['latest', false]); - }); - - try { - await web3.eth.ens.getAddress('foobar.eth'); - assert.fail(); - } catch (err) { - assert.isTrue(err instanceof Error, 'Should throw error'); - } - }); - - it('should only check if the connected node is synced if at least a hour is gone', async function () { - provider = new FakeHttpProvider(); - web3 = new Web3(provider); - web3.eth.ens._lastSyncCheck = new Date() / 1000; - - try { - await web3.eth.ens.checkNetwork(); - - assert.fail(); - } catch (error) { - return true; - } - }); - }); - - describe('custom registry address', function () { - let web3; - let provider; - const address = '0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e'; - - beforeEach(function () { - provider = new FakeHttpProvider(); - - // getBlock in checkNetwork - provider.injectResult({ - timestamp: Math.floor(new Date() / 1000) - 60, - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['latest', false]); - }); - - web3 = new Web3(provider); - web3.eth.ens.registryAddress = address; - }); - - it('should use the custom defined registry address in checkNetwork', async function () { - const currentRegistry = await web3.eth.ens.checkNetwork(); - - assert.equal(currentRegistry, formatters.inputAddressFormatter(address)); - assert.equal(web3.eth.ens.registryAddress, formatters.inputAddressFormatter(address)); - }); - - it('should keep the custom defined registry address if the provider changes', async function () { - web3.eth.setProvider(provider); - const currentRegistry = await web3.eth.ens.checkNetwork(); - - assert.equal(currentRegistry, formatters.inputAddressFormatter(address)); - assert.equal(web3.eth.ens.registryAddress, formatters.inputAddressFormatter(address)); - }); - }); -}); diff --git a/test/eth.estimateGas.js b/test/eth.estimateGas.js deleted file mode 100644 index 808f6828456..00000000000 --- a/test/eth.estimateGas.js +++ /dev/null @@ -1,24 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'estimateGas'; - -var tests = [{ - args: [{ - to: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - data: '0x23455654', - gas: 11, - gasPrice: 11 - }], - formattedArgs: [{ - to: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b', - data: '0x23455654', - gas: '0xb', - gasPrice: '0xb' - }], - result: '0x31981', - formattedResult: 203137, - call: 'eth_'+ method -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.gasPrice.js b/test/eth.gasPrice.js deleted file mode 100644 index f58a3dbd844..00000000000 --- a/test/eth.gasPrice.js +++ /dev/null @@ -1,14 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getGasPrice'; -var methodCall = 'eth_gasPrice'; - -var tests = [{ - result: '0x15f90', - formattedResult: '90000', - call: methodCall -}]; - - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getAccounts.js b/test/eth.getAccounts.js deleted file mode 100644 index 2b8e16e759e..00000000000 --- a/test/eth.getAccounts.js +++ /dev/null @@ -1,19 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getAccounts'; -var call = 'eth_accounts'; - -var tests = [{ - result: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae'], - formattedResult: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855', '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'], - call: call -}, -{ - result: ['0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'], - formattedResult: ['0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'], - call: call -}]; - - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getBalance.js b/test/eth.getBalance.js deleted file mode 100644 index 77e8cfc8f14..00000000000 --- a/test/eth.getBalance.js +++ /dev/null @@ -1,93 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var method = 'getBalance'; - -var tests = [{ - args: ['0x000000000000000000000000000000000000012d', 2], - formattedArgs: ['0x000000000000000000000000000000000000012d', '0x2'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0x000000000000000000000000000000000000012d', '0x1'], - formattedArgs: ['0x000000000000000000000000000000000000012d', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0x000000000000000000000000000000000000012d', 0x1], - formattedArgs: ['0x000000000000000000000000000000000000012d', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0x000000000000000000000000000000000000012d'], - formattedArgs: ['0x000000000000000000000000000000000000012d', eth.defaultBlock], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0XDBDBDB2CBD23B783741E8D7FCF51E459B497E4A6', 0x1], - formattedArgs: ['0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', 0x1], // checksum address - formattedArgs: ['0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, -{ - args: ['0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', 0x1], - formattedArgs: ['0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', 0x1], - formattedArgs: ['0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0x000000000000000000000000000000000000012d', 0x1], - formattedArgs: ['0x000000000000000000000000000000000000012d', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0x000000000000000000000000000000000000012d'], - formattedArgs: ['0x000000000000000000000000000000000000012d', 'latest'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['000000000000000000000000000000000000012d'], - formattedArgs: ['0x000000000000000000000000000000000000012d', 'latest'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'], // iban address - formattedArgs: ['0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', 'latest'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method -}, { - args: ['0x000000000000000000000000000000000000012d'], - formattedArgs: ['0x000000000000000000000000000000000000012d', '0x1'], - result: '0x31981', - formattedResult: '203137', - call: 'eth_' + method, - defaultOptions: [ - ['defaultBlock', 1] - ] -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getBlock.js b/test/eth.getBlock.js deleted file mode 100644 index 1fe66a346da..00000000000 --- a/test/eth.getBlock.js +++ /dev/null @@ -1,133 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getBlock'; - -var blockResult = { - "number": "0x1b4", - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4e65fda2159562a496f9f3522f89122a3088497a", - "difficulty": "0x027f07", - "totalDifficulty": "0x027f07", - "size": "0x027f07", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x9f759", - "gasUsed": "0x9f759", - "timestamp": "0x54e34e8e", - "transactions": ['0x460cfb8472af2c5fd05b5a2','0x460cfb8472af2c5fd05b5a2'], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; -var formattedBlockResult = { - "number": 436, - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4E65FDa2159562a496F9f3522f89122A3088497a", - "difficulty": '163591', - "totalDifficulty": '163591', - "size": 163591, - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": 653145, - "gasUsed": 653145, - "timestamp": 1424182926, - "transactions": ['0x460cfb8472af2c5fd05b5a2','0x460cfb8472af2c5fd05b5a2'], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; -var blockResultWithTx = { - "number": "0x1b4", - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4e65fda2159562a496f9f3522f89122a3088497a", - "difficulty": "0x027f07", - "totalDifficulty": "0x027f07", - "size": "0x027f07", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x9f759", - "gasUsed": "0x9f759", - "timestamp": "0x54e34e8e", - "transactions": [{ - "status": "mined", - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":"0x2", - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionIndex": "0x1", - "from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "to":"0x85f43d8a49eeb85d32cf465507dd71d507100c1d", - "value":"0x7f110", - "gas": "0x7f110", - "gasPrice":"0x09184e72a000", - "input":"0x603880600c6000396000f30060", - }], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; -var formattedBlockResultWithTx = { - "number": 436, - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4E65FDa2159562a496F9f3522f89122A3088497a", - "difficulty": '163591', - "totalDifficulty": '163591', - "size": 163591, - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": 653145, - "gasUsed": 653145, - "timestamp": 1424182926, - "transactions": [{ - "status": "mined", - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce": 2, - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionIndex": 1, - "from":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", - "to":"0x85F43D8a49eeB85d32Cf465507DD71d507100C1d", - "value": '520464', - "gas": 520464, - "gasPrice": '10000000000000', - "input":"0x603880600c6000396000f30060", - }], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; - -var tests = [{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', false], - result: blockResult, - formattedResult: formattedBlockResult, - call: 'eth_'+ method + 'ByHash' -},{ - args: [436], - formattedArgs: ['0x1b4', false], - result: blockResult, - formattedResult: formattedBlockResult, - call: 'eth_'+ method + 'ByNumber' -},{ - args: [436, true], - formattedArgs: ['0x1b4', true], - result: blockResultWithTx, - formattedResult: formattedBlockResultWithTx, - call: 'eth_'+ method + 'ByNumber' -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getBlockNumber.js b/test/eth.getBlockNumber.js deleted file mode 100644 index d5357dd09bd..00000000000 --- a/test/eth.getBlockNumber.js +++ /dev/null @@ -1,12 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getBlockNumber'; - -var tests = [{ - result: '0xb', - formattedResult: 11, - call: 'eth_blockNumber' -}]; - - -testMethod.runTests('eth', method, tests); diff --git a/test/eth.getBlockTransactionCount.js b/test/eth.getBlockTransactionCount.js deleted file mode 100644 index e443250d5d3..00000000000 --- a/test/eth.getBlockTransactionCount.js +++ /dev/null @@ -1,33 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getBlockTransactionCount'; - - -var tests = [{ - args: ['0x4e65fda2159562a496f9f3522f8922f89122a3088497a122a3088497a'], - formattedArgs: ['0x4e65fda2159562a496f9f3522f8922f89122a3088497a122a3088497a'], - result: '0xb', - formattedResult: 11, - call: 'eth_getBlockTransactionCountByHash' -},{ - args: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - result: '0xb', - formattedResult: 11, - call: 'eth_getBlockTransactionCountByHash' -},{ - args: [436], - formattedArgs: ['0x1b4'], - result: '0xb', - formattedResult: 11, - call: 'eth_getBlockTransactionCountByNumber' -},{ - args: ['pending'], - formattedArgs: ['pending'], - result: '0xb', - formattedResult: 11, - call: 'eth_getBlockTransactionCountByNumber' -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getBlockUncleCount.js b/test/eth.getBlockUncleCount.js deleted file mode 100644 index 9561cc53e88..00000000000 --- a/test/eth.getBlockUncleCount.js +++ /dev/null @@ -1,25 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getBlockUncleCount'; - -var tests = [{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - result: '0xb', - formattedResult: 11, - call: 'eth_getUncleCountByBlockHash' -},{ - args: [436], - formattedArgs: ['0x1b4'], - result: '0xb', - formattedResult: 11, - call: 'eth_getUncleCountByBlockNumber' -},{ - args: ['pending'], - formattedArgs: ['pending'], - result: '0xb', - formattedResult: 11, - call: 'eth_getUncleCountByBlockNumber' -}]; - -testMethod.runTests('eth', method, tests); diff --git a/test/eth.getChainId.js b/test/eth.getChainId.js deleted file mode 100644 index 42cd7adbd21..00000000000 --- a/test/eth.getChainId.js +++ /dev/null @@ -1,14 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getChainId'; -var methodCall = 'eth_chainId'; - -var tests = [{ - result: '0x01', - formattedResult: 1, - call: methodCall -}]; - - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getCode.js b/test/eth.getCode.js deleted file mode 100644 index 548ecc04ac3..00000000000 --- a/test/eth.getCode.js +++ /dev/null @@ -1,30 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var method = 'getCode'; - - -var tests = [{ - args: ['0x4E65FDa2159562a496F9f3522f89122A3088497a'], // checksum address - formattedArgs: ['0x4e65fda2159562a496f9f3522f89122a3088497a', eth.defaultBlock], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -},{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', eth.defaultBlock], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -},{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', 2], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0x2'], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getCoinbase.js b/test/eth.getCoinbase.js deleted file mode 100644 index 122e288bde3..00000000000 --- a/test/eth.getCoinbase.js +++ /dev/null @@ -1,13 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getCoinbase'; - - -var tests = [{ - result: '0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_coinbase' -}]; - - -testMethod.runTests('eth', method, tests); diff --git a/test/eth.getHashRate.js b/test/eth.getHashRate.js deleted file mode 100644 index 12f7fa90d00..00000000000 --- a/test/eth.getHashRate.js +++ /dev/null @@ -1,14 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getHashrate'; - - -var tests = [{ - result: '0x788a8', - formattedResult: 493736, - call: 'eth_hashrate' -}]; - - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getNodeVersion.js b/test/eth.getNodeVersion.js deleted file mode 100644 index 53d89ac39ad..00000000000 --- a/test/eth.getNodeVersion.js +++ /dev/null @@ -1,13 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getNodeInfo'; -var call = 'web3_clientVersion'; - -var tests = [{ - result: 'Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.8.3', - formattedResult: 'Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.8.3', - call: call -}]; - - -testMethod.runTests('eth', method, tests); diff --git a/test/eth.getPendingTransactions.js b/test/eth.getPendingTransactions.js deleted file mode 100644 index 5cccfd70c5f..00000000000 --- a/test/eth.getPendingTransactions.js +++ /dev/null @@ -1,44 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var unformattedTx = { - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":"0x5", - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionIndex": "0x1", - "from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "to":"0x85f43d8a49eeb85d32cf465507dd71d507100c1d", - "value":"0x7f110", - "gas": "0x7f110", - "gasPrice":"0x09184e72a000", - "input":"0x603880600c6000396000f30060" -}; - -var result = [unformattedTx, unformattedTx]; - -var formattedTx = { - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":5, - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionIndex": 1, - "from":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "to":"0x85F43D8a49eeB85d32Cf465507DD71d507100C1d", // checksum address - "value": '520464', - "gas": 520464, - "gasPrice": '10000000000000', - "input":"0x603880600c6000396000f30060" -}; - -var formattedResult = [formattedTx, formattedTx]; - -var tests = [{ - args: [], - formattedArgs: [], - result: result, - formattedResult: formattedResult, - call: 'eth_pendingTransactions' -}]; - -testMethod.runTests('eth', 'getPendingTransactions', tests); - diff --git a/test/eth.getProof.js b/test/eth.getProof.js deleted file mode 100644 index 412d9b27972..00000000000 --- a/test/eth.getProof.js +++ /dev/null @@ -1,96 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); -var Eth = require('../packages/web3-eth'); -var BigNumber = require('bignumber.js'); - -var eth = new Eth(); - -var method = 'getProof'; -var call = 'eth_getProof'; - -var proof = { - address: '0x4E65FDa2159562a496F9f3522f89122A3088497a', - balance: '0x1', - codeHash: '0x0', - nonce: '0x2', - storageHash: '0x0', - accountProof: ['0xf90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80'], - storageProof: [ - { - key: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', - value: '0x1', - proof: ['0x0'] - } - ] -}; - -var formattedProof = { - address: '0x4E65FDa2159562a496F9f3522f89122A3088497a', - balance: '1', - codeHash: '0x0', - nonce: '2', - storageHash: '0x0', - accountProof: ['0xf90211a090dcaf88c40c7bbc95a912cbdde67c175767b31173df9ee4b0d733bfdd511c43a0babe369f6b12092f49181ae04ca173fb68d1a5456f18d20fa32cba73954052bda0473ecf8a7e36a829e75039a3b055e51b8332cbf03324ab4af2066bbd6fbf0021a0bbda34753d7aa6c38e603f360244e8f59611921d9e1f128372fec0d586d4f9e0a04e44caecff45c9891f74f6a2156735886eedf6f1a733628ebc802ec79d844648a0a5f3f2f7542148c973977c8a1e154c4300fec92f755f7846f1b734d3ab1d90e7a0e823850f50bf72baae9d1733a36a444ab65d0a6faaba404f0583ce0ca4dad92da0f7a00cbe7d4b30b11faea3ae61b7f1f2b315b61d9f6bd68bfe587ad0eeceb721a07117ef9fc932f1a88e908eaead8565c19b5645dc9e5b1b6e841c5edbdfd71681a069eb2de283f32c11f859d7bcf93da23990d3e662935ed4d6b39ce3673ec84472a0203d26456312bbc4da5cd293b75b840fc5045e493d6f904d180823ec22bfed8ea09287b5c21f2254af4e64fca76acc5cd87399c7f1ede818db4326c98ce2dc2208a06fc2d754e304c48ce6a517753c62b1a9c1d5925b89707486d7fc08919e0a94eca07b1c54f15e299bd58bdfef9741538c7828b5d7d11a489f9c20d052b3471df475a051f9dd3739a927c89e357580a4c97b40234aa01ed3d5e0390dc982a7975880a0a089d613f26159af43616fd9455bb461f4869bfede26f2130835ed067a8b967bfb80'], - storageProof: [ - { - key: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', - value: '0x1', - proof: ['0x0'] - } - ] -}; - -var tests = [{ - args: ['0x4E65FDa2159562a496F9f3522f89122A3088497a', [2]], // checksum address - formattedArgs: ['0x4e65fda2159562a496f9f3522f89122a3088497a', ['0x2'], eth.defaultBlock], - result: proof, - formattedResult: formattedProof, - call: call -},{ - args: ['0x4E65FDa2159562a496F9f3522f89122A3088497a', [2], 0], - formattedArgs: ['0x4e65fda2159562a496f9f3522f89122a3088497a', ['0x2'], '0x0'], - result: proof, - formattedResult: formattedProof, - call: call -},{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', [0xb], 0x0], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', ['0xb'], '0x0'], - result: proof, - formattedResult: formattedProof, - call: call -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', [0xb], 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', ['0xb'], 'latest'], - result: proof, - formattedResult: formattedProof, - call: call -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', ['0xb'], 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', ['0xb'], 'latest'], - result: proof, - formattedResult: formattedProof, - call: call -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', ['11'], 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', ['0xb'], 'latest'], - result: proof, - formattedResult: formattedProof, - call: call -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', [new BigNumber('11')], 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', ['0xb'], 'latest'], - result: proof, - formattedResult: formattedProof, - call: call -} -// TODO: Fixing of test.method.js cloning of the arguments does destroy the BN object. Manually calling of utils.numberToHex with new BN('11'); does work. -// , { -// args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', [new BN('11')], 'latest'], -// formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', 'latest'], -// result: proof', -// formattedResult: formattedProof', -// call: call -// } -]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getStorageAt.js b/test/eth.getStorageAt.js deleted file mode 100644 index f8997131aaf..00000000000 --- a/test/eth.getStorageAt.js +++ /dev/null @@ -1,63 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); -var Eth = require('../packages/web3-eth'); -var BigNumber = require('bignumber.js'); - -var eth = new Eth(); - -var method = 'getStorageAt'; - -var tests = [{ - args: ['0x4E65FDa2159562a496F9f3522f89122A3088497a', 2], // checksum address - formattedArgs: ['0x4e65fda2159562a496f9f3522f89122a3088497a', '0x2', eth.defaultBlock], - result: '0x47d33b2', - formattedResult: '0x47d33b2', - call: 'eth_'+ method -},{ - args: ['0x4E65FDa2159562a496F9f3522f89122A3088497a', 2, 0], - formattedArgs: ['0x4e65fda2159562a496f9f3522f89122a3088497a', '0x2', '0x0'], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -},{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', 0xb, 0x0], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', '0x0'], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', 0xb, 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', 'latest'], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', 'latest'], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '11', 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', 'latest'], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -}, { - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', new BigNumber('11'), 'latest'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', 'latest'], - result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', - call: 'eth_'+ method -} -// TODO: Fixing of test.method.js cloning of the arguments does destroy the BN object. Manually calling of utils.numberToHex with new BN('11'); does work. -// , { -// args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', new BN('11'), 'latest'], -// formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0xb', 'latest'], -// result: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', -// formattedResult: '0x47d33b27bb249a2dbab4c0612bf9caf4747d33b27bb249a2dbab4c0612bf9cafd33b27bb249a2dbab4c0612bf9caf4c1950855', -// call: 'eth_'+ method -// } -]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getTransaction.js b/test/eth.getTransaction.js deleted file mode 100644 index d0fae0de54f..00000000000 --- a/test/eth.getTransaction.js +++ /dev/null @@ -1,41 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getTransaction'; - -var txResult = { - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":"0x5", - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionIndex": "0x1", - "from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "to":"0x85f43d8a49eeb85d32cf465507dd71d507100c1d", - "value":"0x7f110", - "gas": "0x7f110", - "gasPrice":"0x09184e72a000", - "input":"0x603880600c6000396000f30060" -}; -var formattedTxResult = { - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":5, - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionIndex": 1, - "from":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "to":"0x85F43D8a49eeB85d32Cf465507DD71d507100C1d", // checksum address - "value": '520464', - "gas": 520464, - "gasPrice": '10000000000000', - "input":"0x603880600c6000396000f30060" -}; - -var tests = [{ - args: ['0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b'], - formattedArgs: ['0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b'], - result: txResult, - formattedResult: formattedTxResult, - call: 'eth_'+ method + 'ByHash' -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getTransactionFromBlock.js b/test/eth.getTransactionFromBlock.js deleted file mode 100644 index 32260659ac2..00000000000 --- a/test/eth.getTransactionFromBlock.js +++ /dev/null @@ -1,49 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getTransactionFromBlock'; - -var txResult = { - "status": "mined", - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":"0xb", - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionIndex": "0x1", - "from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "to":"0x85f43d8a49eeb85d32cf465507dd71d507100c1d", - "value":"0x7f110", - "gas": "0x7f110", - "gasPrice":"0x09184e72a000", - "input":"0x603880600c6000396000f30060" -}; -var formattedTxResult = { - "status": "mined", - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":11, - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionIndex": 1, - "from":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "to":"0x85F43D8a49eeB85d32Cf465507DD71d507100C1d", // checksum address - "value": '520464', - "gas": 520464, - "gasPrice": '10000000000000', - "input":"0x603880600c6000396000f30060" -}; - -var tests = [{ - args: ['0x2dbab4c0612bf9caf4c195085547dc0612bf9caf4c1950855', 2], - formattedArgs: ['0x2dbab4c0612bf9caf4c195085547dc0612bf9caf4c1950855', '0x2'], - result: txResult, - formattedResult: formattedTxResult, - call: 'eth_getTransactionByBlockHashAndIndex' -},{ - args: [436, 11], - formattedArgs: ['0x1b4', '0xb'], - result: txResult, - formattedResult: formattedTxResult, - call: 'eth_getTransactionByBlockNumberAndIndex' -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getTransactionReceipt.js b/test/eth.getTransactionReceipt.js deleted file mode 100644 index dabb7f6bb64..00000000000 --- a/test/eth.getTransactionReceipt.js +++ /dev/null @@ -1,118 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getTransactionReceipt'; - -var txResult = { - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x1", - "contractAddress":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed":"0x7f110", - "gasUsed": "0x7f110", - "logs": [{ - transactionIndex: '0x3e8', - logIndex: '0x3e8', - blockNumber: '0x3e8', - transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - data: '0x7b2274657374223a2274657374227', - topics: ['0x68656c6c6f','0x6d79746f70696373'] - },{ - transactionIndex: null, - logIndex: null, - blockNumber: null, - transactionHash: null, - blockHash: null, - data: '0x7cc274657374223a2274657374227', - topics: ['0x68656c6c6f'] - }] -}; -var formattedTxResult = { - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": 1, - "contractAddress":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "cumulativeGasUsed": 520464, - "gasUsed": 520464, - "logs": [{ - id: "log_2b801386", - transactionIndex: 1000, - logIndex: 1000, - blockNumber: 1000, - transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - data: '0x7b2274657374223a2274657374227', - topics: ['0x68656c6c6f','0x6d79746f70696373'] - },{ - id: null, - transactionIndex: null, - logIndex: null, - blockNumber: null, - transactionHash: null, - blockHash: null, - data: '0x7cc274657374223a2274657374227', - topics: ['0x68656c6c6f'] - }] -}; - -var tests = [{ - args: ['0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265'], - formattedArgs: ['0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265'], - result: txResult, - formattedResult: formattedTxResult, - call: 'eth_'+ method -},{ - args: ['0xff960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265'], - formattedArgs: ['0xff960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265'], - result: { - "status": "0x1", - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x1", - "contractAddress":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed":"0x7f110", - "gasUsed": "0x7f110", - }, - formattedResult: { - "status": true, - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": 1, - "contractAddress":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "cumulativeGasUsed": 520464, - "gasUsed": 520464, - }, - call: 'eth_'+ method -},{ - args: ['0xdd960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265'], - formattedArgs: ['0xdd960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265'], - result: { - "status": "0x0", - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x10", - "contractAddress":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed":"0x7f110", - "gasUsed": "0x7f110", - }, - formattedResult: { - "status": false, - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": 16, - "contractAddress":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "cumulativeGasUsed": 520464, - "gasUsed": 520464, - }, - call: 'eth_'+ method -}]; - - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.getUncle.js b/test/eth.getUncle.js deleted file mode 100644 index 31c3a91a948..00000000000 --- a/test/eth.getUncle.js +++ /dev/null @@ -1,132 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getUncle'; - -var blockResult = { - "number": "0x1b4", - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4e65fda2159562a496f9f3522f89122a3088497a", - "difficulty": "0x027f07", - "totalDifficulty": "0x027f07", - "size": "0x027f07", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x9f759", - "gasUsed": "0x9f759", - "timestamp": "0x54e34e8e", - "transactions": ['0x460cfb8472af2c5fd05b5a2','0x460cfb8472af2c5fd05b5a2'], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; -var formattedBlockResult = { - "number": 436, - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4E65FDa2159562a496F9f3522f89122A3088497a", // checksum address - "difficulty": '163591', - "totalDifficulty": '163591', - "size": 163591, - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": 653145, - "gasUsed": 653145, - "timestamp": 1424182926, - "transactions": ['0x460cfb8472af2c5fd05b5a2','0x460cfb8472af2c5fd05b5a2'], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; -var blockResultWithTx = { - "number": "0x1b4", - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4e65fda2159562a496f9f3522f89122a3088497a", - "difficulty": "0x027f07", - "totalDifficulty": "0x027f07", - "size": "0x027f07", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x9f759", - "gasUsed": "0x9f759", - "timestamp": "0x54e34e8e", - "transactions": [{ - // "status": "mined", - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce":"0x2", - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionIndex": "0x1", - "from":"0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "to":"0x85f43d8a49eeb85d32cf465507dd71d507100c1d", - "value":"0x7f110", - "gas": "0x7f110", - "gasPrice":"0x09184e72a000", - "input":"0x603880600c6000396000f30060", - }], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; -var formattedBlockResultWithTx = { - "number": 436, - "hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5", - "nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", - "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff", - "miner": "0x4E65FDa2159562a496F9f3522f89122A3088497a", // checksum address - "difficulty": '163591', - "totalDifficulty": '163591', - "size": 163591, - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": 653145, - "gasUsed": 653145, - "timestamp": 1424182926, - "transactions": [{ - // "status": "mined", - "hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "nonce": 2, - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionIndex": 1, - "from":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "to":"0x85F43D8a49eeB85d32Cf465507DD71d507100C1d", // checksum address - "value": '520464', - "gas": 520464, - "gasPrice": '10000000000000', - "input":"0x603880600c6000396000f30060", - }], - "uncles": ["0x460cfb8472af2c5fd05b5a2", "0xd5460cfb8472af2c5fd05b5a2"] -}; - -var tests = [{ - args: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855', 2], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0x2'], - result: blockResult, - formattedResult: formattedBlockResult, - call: 'eth_getUncleByBlockHashAndIndex' -},{ - args: [436, 1], - formattedArgs: ['0x1b4', '0x1'], - result: blockResult, - formattedResult: formattedBlockResult, - call: 'eth_getUncleByBlockNumberAndIndex' -},{ - args: [436, 1, true], - formattedArgs: ['0x1b4', '0x1'], - result: blockResultWithTx, - formattedResult: formattedBlockResultWithTx, - call: 'eth_getUncleByBlockNumberAndIndex' -}]; - -testMethod.runTests('eth', method, tests); diff --git a/test/eth.getWork.js b/test/eth.getWork.js deleted file mode 100644 index 1fb8259baea..00000000000 --- a/test/eth.getWork.js +++ /dev/null @@ -1,14 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getWork'; - -var tests = [{ - args: [], - formattedArgs: [], - result: true, - formattedResult: true, - call: 'eth_'+ method -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.handleRevert.js b/test/eth.handleRevert.js deleted file mode 100644 index eae3b8db9bd..00000000000 --- a/test/eth.handleRevert.js +++ /dev/null @@ -1,26 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var setValue = true; - -describe('web3.eth', function () { - describe('handleRevert', function () { - it('should check if handleRevert is set to proper value', function () { - assert.equal(eth.handleRevert, false); - assert.equal(eth.Contract.handleRevert, false); - assert.equal(eth.getCode.method.handleRevert, false); - }); - - it('should set handleRevert for all sub packages', function () { - eth.handleRevert = setValue; - - assert.equal(eth.handleRevert, setValue); - assert.equal(eth.Contract.handleRevert, setValue); - assert.equal(eth.getCode.method.handleRevert, setValue); - }); - }); -}); - diff --git a/test/eth.isMining.js b/test/eth.isMining.js deleted file mode 100644 index 0486767e5b8..00000000000 --- a/test/eth.isMining.js +++ /dev/null @@ -1,13 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'isMining'; -var call = 'eth_mining'; - -var tests = [{ - result: true, - formattedResult: true, - call: call -}]; - - -testMethod.runTests('eth', method, tests); diff --git a/test/eth.maxListenersWarningThreshold.js b/test/eth.maxListenersWarningThreshold.js deleted file mode 100644 index 0f4bd016f8f..00000000000 --- a/test/eth.maxListenersWarningThreshold.js +++ /dev/null @@ -1,36 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); - -var setValue = 123; - -describe('web3.eth', function () { - describe('maxListenersWarningThreshold', function () { - var eth; - - beforeEach(function (){ - eth = new Eth(); - }) - it('should default to 100', function () { - assert.equal(eth.maxListenersWarningThreshold, 100); - }); - it('should set threshold to proper value', function () { - // Mock EventEmitter interface - eth.currentProvider = { - setMaxListeners: () => {} - } - eth.maxListenersWarningThreshold = setValue; - assert.equal(eth.maxListenersWarningThreshold, setValue); - }); - it('should *NOT* set threshold when there is no currentProvider', function () { - eth.maxListenersWarningThreshold = setValue; - assert.equal(eth.maxListenersWarningThreshold, 100); - }); - it('should *NOT* set threshold when currentProvider does not extend EventEmitter', function () { - eth.currentProvider = {} - eth.maxListenersWarningThreshold = setValue; - assert.equal(eth.maxListenersWarningThreshold, 100); - }); - }); -}); - diff --git a/test/eth.net.getNetworkType.js b/test/eth.net.getNetworkType.js deleted file mode 100644 index 132f44056e3..00000000000 --- a/test/eth.net.getNetworkType.js +++ /dev/null @@ -1,74 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var FakeHttpProvider = require('./helpers/FakeIpcProvider'); -var Web3 = require('../packages/web3'); - -var tests = [{ - hash: '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', - id: 1, - result: 'main' -},{ - hash: '0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303', - id: 2, - result: 'morden' -},{ - hash: '0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d', - id: 3, - result: 'ropsten' -},{ - hash: '0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177', - id: 4, - result: 'rinkeby' -},{ - hash: '0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a', - id: 5, - result: 'goerli' -},{ - hash: '0xffe56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', - id: 42, - result: 'private' -},{ - hash: '0xffe56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', - id: 1, - result: 'private' -},{ - hash: '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', - id: 42, - result: 'private' -}]; - -describe('getNetworkType', function () { - tests.forEach(function (test) { - it('should detect the '+ test.result +' net', function (done) { - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - provider.injectResult(test.id); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'net_version'); - assert.deepEqual(payload.params, []); - }); - - provider.injectResult({ - hash: test.hash, - blockNumber: '0x0' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getBlockByNumber'); - assert.deepEqual(payload.params, ['0x0', false]); - }); - - web3.eth.net.getNetworkType() - .then(function(res) { - assert.equal(res, test.result); - done(); - }) - .catch(function (err) { - throw err; - done(); - }); - }); - }); -}); diff --git a/test/eth.net.getPeerCount.js b/test/eth.net.getPeerCount.js deleted file mode 100644 index d8b00058a83..00000000000 --- a/test/eth.net.getPeerCount.js +++ /dev/null @@ -1,12 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getPeerCount'; - - -var tests = [{ - result: '0xf', - formattedResult: 15, - call: 'net_peerCount' -}]; - -testMethod.runTests(['eth','net'], method, tests); diff --git a/test/eth.net.isListening.js b/test/eth.net.isListening.js deleted file mode 100644 index e3e1beefe5f..00000000000 --- a/test/eth.net.isListening.js +++ /dev/null @@ -1,12 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'isListening'; - - -var tests = [{ - result: true, - formattedResult: true, - call: 'net_listening' -}]; - -testMethod.runTests(['eth','net'], method, tests); diff --git a/test/eth.net_methods.js b/test/eth.net_methods.js deleted file mode 100644 index b2f6663f1ee..00000000000 --- a/test/eth.net_methods.js +++ /dev/null @@ -1,14 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var u = require('./helpers/test.utils.js'); -var Eth = require('../packages/web3-eth'); -var eth = new Eth(); - -describe('web3.net', function() { - describe('methods', function() { - u.methodExists(eth.net, 'getId'); - u.methodExists(eth.net, 'getNetworkType'); - u.methodExists(eth.net, 'isListening'); - u.methodExists(eth.net, 'getPeerCount'); - }); -}); diff --git a/test/eth.protocolVersion.js b/test/eth.protocolVersion.js deleted file mode 100644 index 0aca61be569..00000000000 --- a/test/eth.protocolVersion.js +++ /dev/null @@ -1,13 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getProtocolVersion'; -var call = 'eth_protocolVersion'; - -var tests = [{ - result: '12345', - formattedResult: '12345', - call: call -}]; - - -testMethod.runTests('eth', method, tests); diff --git a/test/eth.requestAccounts.js b/test/eth.requestAccounts.js deleted file mode 100644 index ce0ba7cc572..00000000000 --- a/test/eth.requestAccounts.js +++ /dev/null @@ -1,19 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'requestAccounts'; -var call = 'eth_requestAccounts'; - -var tests = [{ - result: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae'], - formattedResult: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855', '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'], - call: call -}, -{ - result: ['0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'], - formattedResult: ['0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe'], - call: call -}]; - - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.sendTransaction.js b/test/eth.sendTransaction.js deleted file mode 100644 index 4a77bd8e791..00000000000 --- a/test/eth.sendTransaction.js +++ /dev/null @@ -1,375 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); -var chai = require('chai'); -var assert = chai.assert; -var FakeHttpProvider = require('./helpers/FakeHttpProvider'); -var Web3 = require('../packages/web3'); - -var clone = function (object) { return object ? JSON.parse(JSON.stringify(object)) : []; }; - - -var method = 'sendTransaction'; - - -var tests = [{ - args: [{ - from: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', // checksum address - to: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', // checksum address - value: '1234567654321', - gasPrice: '324234234234' - }], - formattedArgs: [{ - from: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - gasPrice: "0x4b7dddc97a" - }], - result: '0x1234567', - formattedResult: '0x1234567', - notification: { - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }, - call: 'eth_'+ method -}, -// test with gasPrice missing -{ - args: [{ - from: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', // checksum address - to: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', // checksum address - value: '1234567654321' - }], - notification: { - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }, - call: 'eth_gasPrice', - formattedArgs: [], - result: '0x1234567', - formattedResult: '0x1234567', - - call2: 'eth_'+ method, - formattedArgs2: [{ - from: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - gasPrice: "0x1234567" - }], - result2: '0x1234567' -},{ - args: [{ - from: '0XDBDBDB2CBD23B783741E8D7FCF51E459B497E4A6', - to: '0XDBDBDB2CBD23B783741E8D7FCF51E459B497E4A6', - value: '1234567654321', - data: '0x213453ffffff', - gasPrice: '324234234234' - }], - formattedArgs: [{ - from: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - data: '0x213453ffffff', - gasPrice: "0x4b7dddc97a" - }], - result: '0x12345678976543213456786543212345675432', - formattedResult: '0x12345678976543213456786543212345675432', - notification: { - method: 'eth_subscription', - params: { - subscription: '0x12345678976543213456786543212345675432', - result: { - blockNumber: '0x10' - } - } - }, - call: 'eth_'+ method -},{ - args: [{ - from: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', // iban address - to: '0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', - value: '1234567654321', - gasPrice: '324234234234' - }], - formattedArgs: [{ - from: "0x00c5496aee77c1ba1f0854206a26dda82a81d6d8", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - gasPrice: "0x4b7dddc97a" - }], - result: '0x12345678976543213456786543212345675432', - formattedResult: '0x12345678976543213456786543212345675432', - notification: { - method: 'eth_subscription', - params: { - subscription: '0x12345678976543213456786543212345675432', - result: { - blockNumber: '0x10' - } - } - }, - call: 'eth_'+ method - -// using local wallet -},{ - useLocalWallet: function (web3) { - web3.eth.accounts.wallet.add('0xd7d364e720c129acb940439a84a99185dd55af6f6d105018a8acfb7f8c008142'); - }, - walletFrom: '0x5af0838657202f865A4547b5eD28a64f799960DC', - args: [{ - from: '0x5af0838657202f865A4547b5eD28a64f799960DC', - to: '0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', - value: '1234567654321', - gasPrice: '324234234234', - gas: 500000, - chain: 'mainnet', - hardfork: 'petersburg' - }], - formattedArgs: ['0xf86b0a854b7dddc97a8307a12094dbdbdb2cbd23b783741e8d7fcf51e459b497e4a686011f71f76bb18026a0ce66ccabda889012314677073ded7bec9f763e564dfcff1135e7c6a3c5b89353a07bfa06fe1ba3f1804e4677295a5147e6c8b2224647cc2b7b62063081f6490bd3'], - result: '0x12345678976543213456786543212345675432', - formattedResult: '0x12345678976543213456786543212345675432', - notification: { - method: 'eth_subscription', - params: { - subscription: '0x12345678976543213456786543212345675432', - result: { - blockNumber: '0x10' - } - } - }, - call: 'eth_sendRawTransaction' -},{ - useLocalWallet: function (web3) { - web3.eth.accounts.wallet.add('0xf7d364e720c129acb940439a84a99185dd55af6f6d105018a8acfb7f8c008142'); - }, - walletFrom: '0xE2873A6bE9Bc50E70dE4295d968459d4aCF515C0', - args: [{ - from: 0, - to: '0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', - value: '1234567654321', - gasPrice: '324234234234', - gas: 500000, - chain: 'mainnet', - hardfork: 'petersburg' - }], - formattedArgs: ['0xf86b0a854b7dddc97a8307a12094dbdbdb2cbd23b783741e8d7fcf51e459b497e4a686011f71f76bb18026a0fe620c94cc14fdcdef494a40caf9e2860d1a5929d95730e1b7a6a2041c9c507fa01d3d22e7ab1010fa95a357322ad14a8ce1b1b631d3bb9c123922ff8042c8fc8b'], - result: '0x12345678976543213456786543212345675432', - formattedResult: '0x12345678976543213456786543212345675432', - notification: { - method: 'eth_subscription', - params: { - subscription: '0x12345678976543213456786543212345675432', - result: { - blockNumber: '0x10' - } - } - }, - call: 'eth_sendRawTransaction' -},{ - useLocalWallet: function (web3) { - web3.eth.accounts.wallet.add('0xa1d364e720c129acb940439a84a99185dd55af6f6d105018a8acfb7f8c008142'); - }, - walletFrom: '0xF65a29341Fd9F8357e060f2e21Bf3407062f2A46', - args: [{ - from: { - address: '0xF65a29341Fd9F8357e060f2e21Bf3407062f2A46', - privateKey: '0xa1d364e720c129acb940439a84a99185dd55af6f6d105018a8acfb7f8c008142' - }, - to: '0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', - value: '1234567654321', - gasPrice: '324234234234', - gas: 500000, - chain: 'mainnet', - hardfork: 'petersburg' - }], - formattedArgs: ['0xf86b0a854b7dddc97a8307a12094dbdbdb2cbd23b783741e8d7fcf51e459b497e4a686011f71f76bb18026a016a5bc4e1808e60a5d370f6b335be158673bd95c457ee7925dc8ae1bec69647fa03831c5e0a966a0aad0c67d6ddea55288f76ae1d73dfe11c6174a8682c2ec165d'], - result: '0x12345678976543213456786543212345675432', - formattedResult: '0x12345678976543213456786543212345675432', - notification: { - method: 'eth_subscription', - params: { - subscription: '0x12345678976543213456786543212345675432', - result: { - blockNumber: '0x10' - } - } - }, - call: 'eth_sendRawTransaction' -},{ - error: true, // only for testing - args: [{ - from: 'XE81ETHXREGGAVOFYORK', // iban address - to: '0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', - value: '1234567654321' - }], - call: 'eth_'+ method -}]; - -testMethod.runTests('eth', method, tests); - - -// Test HTTPProvider with interval -describe(method, function () { - tests.forEach(function (test, index) { - it('promise test: ' + index, function (done) { - - // given - var w3; - var result; - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - // skipp wallet tests - if(test.useLocalWallet) { - return done(); - } - - - provider.injectResult(clone(test.result)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedArgs || []); - }); - - if (test.call2) { - provider.injectResult(clone(test.result2)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call2); - assert.deepEqual(payload.params, test.formattedArgs2 || []); - }); - } - - provider.injectResult(null); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - - - // if notification its sendTransaction, which needs two more results, subscription and receipt - if(test.notification) { - // inject receipt - provider.injectResult({ - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash": "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x1", - "contractAddress": "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed": "0x7f110", - "gasUsed": "0x7f110" - }); - } - - var args = clone(test.args); - - if(test.error) { - - assert.throws(function(){ web3.eth[method].apply(web3, args); }); - done(); - - - } else { - - - result = web3.eth[method].apply(web3, args); - - result.then(function(result){ - if(test.notification) { - // test receipt - assert.deepEqual(result, { - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": 1, - "contractAddress":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "cumulativeGasUsed": 520464, - "gasUsed": 520464 - }); - } else { - assert.deepEqual(result, test.formattedResult); - } - - done(); - }); - } - - }); - - it('callback test: ' + index, function (done) { - - // given - var w3; - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - - // add a wallet - if(test.useLocalWallet) { - return done(); - } - - provider.injectResult(clone(test.result)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedArgs || []); - }); - - if (test.call2) { - provider.injectResult(clone(test.result2)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call2); - assert.deepEqual(payload.params, test.formattedArgs2 || []); - }); - } - - - provider.injectResult(null); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - - - // if notification its sendTransaction, which needs two more results, subscription and receipt - if(test.notification) { - // inject receipt - provider.injectResult({ - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash": "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x1", - "contractAddress": "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed": "0x7f110", - "gasUsed": "0x7f110" - }); - } - - var args = clone(test.args); - - if(test.error) { - assert.throws(function(){ web3.eth[method].apply(web3, args); }); - - done(); - - } else { - // add callback - args.push(function (err, result) { - assert.deepEqual(result, test.formattedResult); - - done(); - }); - - web3.eth[method].apply(web3, args); - } - }); - }); -}); diff --git a/test/eth.sendTransaction.revert.js b/test/eth.sendTransaction.revert.js deleted file mode 100644 index 6a352219dc9..00000000000 --- a/test/eth.sendTransaction.revert.js +++ /dev/null @@ -1,122 +0,0 @@ -var assert = require('chai').assert; -var FakeHttpProvider = require('./helpers/FakeHttpProvider'); -var Web3 = require('../packages/web3'); - -describe('sendTransaction revert:', function () { - var provider; - var web3; - - beforeEach(function () { - provider = new FakeHttpProvider(); - web3 = new Web3(provider); - web3.eth.handleRevert = true; - }); - - it('Errors without revert reason string', function (done) { - provider.injectResult('0x1234567'); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual( - payload.params, - [{ - from: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - gasPrice: "0x4b7dddc97a" - }] - ); - }); - - provider.injectResult(null); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - - - // inject receipt - provider.injectResult({ - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash": "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x1", - "contractAddress": "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed": "0x7f110", - "gasUsed": "0x7f110", - "status": "0x0" - }); - - var options = { - from: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', - to: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', - value: '1234567654321', - gasPrice: '324234234234' - }; - - web3.eth.sendTransaction(options).catch(function (error) { - assert.equal(error.receipt.status, false); - assert.equal(error.reason, undefined); - assert.equal(error.signature, undefined); - - done(); - }); - }); - - it('Errors with revert reason string', function (done) { - provider.injectResult('0x1234567'); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual( - payload.params, - [{ - from: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - gasPrice: "0x4b7dddc97a" - }] - ); - }); - - provider.injectResult(null); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - - - // inject receipt - provider.injectResult({ - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash": "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x1", - "contractAddress": "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed": "0x7f110", - "gasUsed": "0x7f110", - "status": "0x0" - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - - provider.injectResult('0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e000000000000'); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - }); - - var options = { - from: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', - to: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', - value: '1234567654321', - gasPrice: '324234234234' - }; - - web3.eth.sendTransaction(options).catch(function (error) { - assert.equal(error.receipt.status, false); - assert.equal(error.reason, 'Not enough Ether provided.'); - assert.equal(error.signature, 'Error(String)'); - - done(); - }); - }); -}); diff --git a/test/eth.sign.js b/test/eth.sign.js deleted file mode 100644 index e87d59ec0e2..00000000000 --- a/test/eth.sign.js +++ /dev/null @@ -1,42 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var method = 'sign'; - - -var tests = [{ - args: ['Hello World!$*', '0xeb014f8c8b418db6b45774c326a0e64c78914dc0'], - formattedArgs: ['0xeb014f8c8b418db6b45774c326a0e64c78914dc0', '0x48656c6c6f20576f726c6421242a'], - result: '0x5763ab346198e3e6cc4d53996ccdeca0c941cb6cb70d671d97711c421d3bf7922c77ef244ad40e5262d1721bf9638fb06bab8ed3c43bfaa80d6da0be9bbd33dc1b', - formattedResult: '0x5763ab346198e3e6cc4d53996ccdeca0c941cb6cb70d671d97711c421d3bf7922c77ef244ad40e5262d1721bf9638fb06bab8ed3c43bfaa80d6da0be9bbd33dc1b', - call: 'eth_'+ method -},{ - useLocalWallet: function (web3) { - web3.eth.accounts.wallet.add('0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728'); - }, - args: ['Hello World!$*', '0xeb014f8c8b418db6b45774c326a0e64c78914dc0'], - formattedArgs: ['0xeb014f8c8b418db6b45774c326a0e64c78914dc0', '0x48656c6c6f20576f726c6421242a'], - result: '0x5763ab346198e3e6cc4d53996ccdeca0c941cb6cb70d671d97711c421d3bf7922c77ef244ad40e5262d1721bf9638fb06bab8ed3c43bfaa80d6da0be9bbd33dc1b', - formattedResult: '0x5763ab346198e3e6cc4d53996ccdeca0c941cb6cb70d671d97711c421d3bf7922c77ef244ad40e5262d1721bf9638fb06bab8ed3c43bfaa80d6da0be9bbd33dc1b', - call: null -},{ - args: ['Hello Wolrd!$*', '0xeb014f8c8b418db6b45774c326a0e64c78914dc0'], - formattedArgs: ['0xeb014f8c8b418db6b45774c326a0e64c78914dc0', '0x48656c6c6f20576f6c726421242a'], - result: '0x680b2c019eb81d5476012ca453a1ac2248dec3d89c2ed20d78177e2e0550b72d702d42c40943f6140b3d2e9fc9981c7fdd428ff93623020969e33b6b406e26851b', - formattedResult: '0x680b2c019eb81d5476012ca453a1ac2248dec3d89c2ed20d78177e2e0550b72d702d42c40943f6140b3d2e9fc9981c7fdd428ff93623020969e33b6b406e26851b', - call: 'eth_'+ method -},{ - useLocalWallet: function (web3) { - web3.eth.accounts.wallet.add('0xbe6383dad004f233317e46ddb46ad31b16064d14447a95cc1d8c8d4bc61c3728'); - }, - args: ['Hello Wolrd!$*', '0xeb014f8c8b418db6b45774c326a0e64c78914dc0'], - formattedArgs: ['0xeb014f8c8b418db6b45774c326a0e64c78914dc0', '0x48656c6c6f20576f6c726421242a'], - result: '0x680b2c019eb81d5476012ca453a1ac2248dec3d89c2ed20d78177e2e0550b72d702d42c40943f6140b3d2e9fc9981c7fdd428ff93623020969e33b6b406e26851b', - formattedResult: '0x680b2c019eb81d5476012ca453a1ac2248dec3d89c2ed20d78177e2e0550b72d702d42c40943f6140b3d2e9fc9981c7fdd428ff93623020969e33b6b406e26851b', - call: null -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.submitWork.js b/test/eth.submitWork.js deleted file mode 100644 index 352fa109e7f..00000000000 --- a/test/eth.submitWork.js +++ /dev/null @@ -1,15 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'submitWork'; - -var tests = [ -{ - args: ['0x567890abcdef5555', '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', '0xcdef1234567890abcdef1234567890abcdef0x1234567890abcf1234567890ab'], - formattedArgs: ['0x567890abcdef5555', '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', '0xcdef1234567890abcdef1234567890abcdef0x1234567890abcf1234567890ab'], - result: true, - formattedResult: true, - call: 'eth_'+ method -}]; - -testMethod.runTests('eth', method, tests); - diff --git a/test/eth.subscribe.ganache.js b/test/eth.subscribe.ganache.js deleted file mode 100644 index a2dce67f9d0..00000000000 --- a/test/eth.subscribe.ganache.js +++ /dev/null @@ -1,319 +0,0 @@ -const assert = require('assert'); -const ganache = require('ganache-cli'); -const pify = require('pify'); -const { getWeb3, waitSeconds } = require('./helpers/test.utils'); - -describe('subscription connect/reconnect', function () { - let server; - let web3; - let accounts; - let subscription; - const port = 8545; - const Web3 = getWeb3(); - - beforeEach(async function () { - server = ganache.server({port: port, blockTime: 1}); - await pify(server.listen)(port); - web3 = new Web3('ws://localhost:' + port); - accounts = await web3.eth.getAccounts(); - }); - - afterEach(async function () { - // Might already be closed.. - try { - await pify(server.close)(); - } catch (err) { - } - }); - - it('subscribes (baseline)', function (done) { - web3.eth - .subscribe('newBlockHeaders') - .once('data', function (result) { - assert(result.parentHash); - done(); - }); - }); - - it('subscribes with a callback', function (done) { - subscription = web3.eth - .subscribe('newBlockHeaders', function (err, result) { - assert(result.parentHash); - subscription.unsubscribe(); // Stop listening.. - done(); - }); - }); - - it('subscription emits a connected event', function (done) { - subscription = web3.eth - .subscribe('newBlockHeaders') - .on('connected', function (result) { - assert(result); // First subscription - subscription.unsubscribe(); // Stop listening.. - done(); - }); - }); - - it('clearSubscriptions', async function() { - web3.eth.subscribe('newBlockHeaders'); - await waitSeconds(1); // Sub need a little time to set up - - assert.equal(1, web3.eth._requestManager.subscriptions.size); - assert.ok(web3.eth.clearSubscriptions()) - assert.equal(0, web3.eth._requestManager.subscriptions.size); - }); - - it('resubscribes to an existing subscription', function (done) { - this.timeout(5000); - - let stage = 0; - - subscription = web3.eth.subscribe('newBlockHeaders'); - - subscription.on('data', function (result) { - if (stage === 0) { - subscription.resubscribe(); - stage = 1; - return; - } - - assert(result.parentHash); - subscription.unsubscribe(); // Stop listening.. - done(); - }); - }); - - it('resubscribes after being unsubscribed', function (done) { - this.timeout(5000); - - let stage = 0; - - subscription = web3.eth - .subscribe('newBlockHeaders') - .on('data', function (result) { - assert(result.parentHash); - subscription.unsubscribe(); - stage = 1; - }); - - // Resubscribe from outside - let interval = setInterval(async function () { - if (stage === 1) { - clearInterval(interval); - subscription.resubscribe(); - subscription.on('data', function (result) { - assert(result.parentHash); - subscription.unsubscribe(); // Stop listening.. - done(); - }); - } - }, 500); - }); - - // The ganache unit tests are erroring under similar conditions - - it('does not error when client closes after disconnect', async function(){ - this.timeout(7000); - - return new Promise(async function(resolve, reject) { - web3.eth - .subscribe('newBlockHeaders') - .once("error", function (err) { - reject(new Error('Should not hear an error ')); - }); - - // Let a couple blocks mine.. - await waitSeconds(2) - web3.currentProvider.disconnect(); - - // This delay seems to be required (on Travis). - await waitSeconds(1); - - await pify(server.close)(); - - await waitSeconds(1) - resolve(); - }); - }); - - // Verify subscription cleanup on setProvider - it('does not hear old subscriptions after setting a new provider', async function(){ - this.timeout(7000); - let counter = 0; - - return new Promise(async function(resolve, reject) { - web3.eth - .subscribe('newBlockHeaders') - .on("data", function (_) { - counter++; - }); - - // Let a couple blocks mine.. - await waitSeconds(2) - assert(counter >= 1); - - // Connect to a different client; - const newServer = ganache.server({port: 8777, blockTime: 1}); - await pify(newServer.listen)(8777); - - const finalCount = counter; - web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:8777')); - - await waitSeconds(2); - assert.equal(counter, finalCount); - await pify(newServer.close)(); - resolve(); - }); - }) - - it('allows a subscription which does not exist', function () { - web3.eth.subscribe('subscription-does-not-exists'); - }); - - it('errors when zero params subscrip. is called with the wrong arguments', function () { - try { - web3.eth.subscribe('newBlockHeaders', 5); - assert.fail(); - } catch (err) { - assert(err.message.includes('Invalid number of parameters for "newHeads"')); - assert(err.message.includes('Got 1 expected 0')); - } - }); - - it('errors when the provider is not set (callback)', function (done) { - web3 = new Web3(); - - web3.eth.subscribe('newBlockHeaders', function (err, result) { - assert(err.message.includes('No provider set')); - done(); - }); - }); - - it('errors when the provider is not set (.on("error"))', function (done) { - web3 = new Web3(); - - web3.eth - .subscribe('newBlockHeaders') - .once("error", function (err) { - assert(err.message.includes('No provider set')); - done(); - }); - }); - - it('errors when the provider does not support subscriptions (callback)', function (done) { - web3 = new Web3('http://localhost:' + port); - - web3.eth.subscribe('newBlockHeaders', function (err, result) { - assert(err.message.includes("provider doesn't support subscriptions: HttpProvider")); - done(); - }); - }); - - it('errors when the provider does not support subscriptions (.on("error"))', function (done) { - web3 = new Web3('http://localhost:' + port); - - web3.eth - .subscribe('newBlockHeaders') - .once("error", function (err) { - assert(err.message.includes("provider doesn't support subscriptions: HttpProvider")); - done(); - }); - }); - - it('errors when the `eth_subscribe` request got send, the reponse isnt returned from the node, and the connection does get closed in the mean time', async function () { - await pify(server.close)(); - - return new Promise(async function (resolve) { - web3.eth - .subscribe('newBlockHeaders') - .once('error', function (err) { - assert(err.message.includes('CONNECTION ERROR: Couldn\'t connect to node on WS')); - resolve(); - }); - }); - }); - - it('errors when the subscription got established (is running) and the connection does get closed', function () { - this.timeout(5000); - let counter = 0; - - return new Promise(async function (resolve) { - web3.eth - .subscribe('newBlockHeaders') - .once('data', async function () { - await pify(server.close)(); - }) - - web3.eth.currentProvider.on('close', function (err) { - counter++; - assert(err.reason.includes('Connection dropped by remote peer.')); - assert(err.code === 1006); - }); - - // Make sure error handler doesn't fire twice - await waitSeconds(2); - assert.equal(counter, 1); - web3.eth.currentProvider.removeAllListeners(); - resolve(); - }); - }); - - it('auto reconnects and keeps the subscription running', function () { - this.timeout(6000); - - web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:' + port, {reconnect: {auto: true}})); - - return new Promise(async function (resolve) { - // Stage 0: - let stage = 0; - - web3.eth - .subscribe('newBlockHeaders') - .on('data', function (result) { - assert(result.parentHash); - - // Exit point, flag set below - if (stage === 1) { - web3.currentProvider.disconnect(); - this.removeAllListeners(); - resolve(); - } - }); - - // Stage 1: Close & re-open server - await pify(server.close)(); - server = ganache.server({port: port, blockTime: 1}); - await pify(server.listen)(port); - stage = 1; - }); - }); - - it('auto reconnects, keeps the subscription running and triggers the `connected` event listener twice', function () { - this.timeout(6000); - - web3.setProvider(new Web3.providers.WebsocketProvider('ws://localhost:' + port, {reconnect: {auto: true}})); - - return new Promise(async function (resolve) { - // Stage 0: - let stage = 0; - - web3.eth - .subscribe('newBlockHeaders') - .on('connected', function (result) { - assert(result); - - // Exit point, flag set below - if (stage === 1) { - web3.currentProvider.disconnect(); - this.removeAllListeners(); - resolve(); - } - }); - - // Stage 1: Close & re-open server - await pify(server.close)(); - server = ganache.server({port: port, blockTime: 1}); - await pify(server.listen)(port); - stage = 1; - }); - }); -}); diff --git a/test/eth.subscribe.js b/test/eth.subscribe.js deleted file mode 100644 index 4f2db3b1308..00000000000 --- a/test/eth.subscribe.js +++ /dev/null @@ -1,478 +0,0 @@ -var testSubscription = require('./helpers/test.subscription.js'); - - // NEW HEADS -var tests = [{ - protocol: 'eth', - args: ['newBlockHeaders'], - firstResult: '0x1234', - firstPayload: { - method: "eth_subscribe", - params: ['newHeads'] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - dataCount: 1, - subscriptions: [{ - subscription: '0x1234', - result: { - difficulty: "0x15d9223a23aa", - totalDifficulty: "0x15d9223a23aa", - extraData: "0xd983010305844765746887676f312e342e328777696e646f7773", - gasLimit: "0x47e7c4", - gasUsed: "0x38658", - hash: "0x950427f707bf395fda0092d4f5dcbcf32d632106fb08e397124d0726082693e6", - logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - miner: "0xf8b483dba2c3b7176a3da549ad41a48bb3121069", - nonce: "0x084149998194cc5f", - number: "0x1348c9", - size: "0x0", - parentHash: "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701", - receiptRoot: "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36", - sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - stateRoot: "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378", - timestamp: "0x56ffeff8", - transactionsRoot: "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f" - } - }], - subscriptionResults: [{ - difficulty: "24022326322090", - totalDifficulty: "24022326322090", - extraData: "0xd983010305844765746887676f312e342e328777696e646f7773", - gasLimit: 4712388, - gasUsed: 231000, - hash: "0x950427f707bf395fda0092d4f5dcbcf32d632106fb08e397124d0726082693e6", - logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - miner: "0xf8b483DbA2c3B7176a3Da549ad41A48BB3121069", // checksum address - nonce: "0x084149998194cc5f", - number: 1263817, - parentHash: "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701", - receiptRoot: "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36", - sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - stateRoot: "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378", - timestamp: 1459613688, - transactionsRoot: "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f", - size: 0 - }] -}, - // PENDING TRANSACTIONS -{ - protocol: 'eth', - args: ['pendingTransactions'], - firstResult: '0x1234', - firstPayload: { - method: "eth_subscribe", - params: ['newPendingTransactions'] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - dataCount: 1, - subscriptions: [{ - subscription: '0x1234', - result: "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b" - }], - subscriptionResults: ["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"] -}, - // LOGS -{ - protocol: 'eth', - args: ['logs',{}], - firstResult: '0x4444', - firstPayload: { - method: "eth_subscribe", - params: ['logs',{topics: []}] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - subscriptions: [{ - subscription: '0x4444', - result: { - logIndex: '0x23', - transactionHash: '0x2345fdfdf', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - }], - subscriptionResults: [{ - id: "log_d43624aa", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdf', - transactionIndex: 1, - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] -}, -{ - protocol: 'eth', - args: ['logs',{address: ['0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE','0xAaf4D0a3C12e86B4B5f39b213f7E19d048276daE']}], - firstResult: '0x4444', - firstPayload: { - method: "eth_subscribe", - params: ['logs',{address: ['0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae','0xaaf4d0a3c12e86b4b5f39b213f7e19d048276dae'], topics: []}] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - subscriptions: [{ - subscription: '0x4444', - result: { - logIndex: '0x23', - transactionHash: '0x2345fdfdf', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - }], - subscriptionResults: [{ - id: "log_d43624aa", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdf', - transactionIndex: 1, - address: '0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] -}, - { - protocol: 'eth', - args: ['logs',{address: ['0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE','0xAaf4D0a3C12e86B4B5f39b213f7E19d048276daE']}], - firstResult: '0x4444', - firstPayload: { - method: "eth_subscribe", - params: ['logs',{address: ['0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae','0xaaf4d0a3c12e86b4b5f39b213f7e19d048276dae'], topics: []}] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - subscriptions: [{ - subscription: '0x4444', - result: [{ - logIndex: '0x23', - transactionHash: '0x2345fdfdf', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - },{ - logIndex: '0x23', - transactionHash: '0x2345fdfdd', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] - }], - subscriptionResults: [{ - id: "log_d43624aa", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdf', - transactionIndex: 1, - address: '0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - },{ - id: "log_b20551f9", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdd', - transactionIndex: 1, - address: '0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] - }, -{ - protocol: 'eth', - args: ['logs',{address: ['0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE','0xAaf4D0a3C12e86B4B5f39b213f7E19d048276daE']}], - firstResult: '0x4444', - firstPayload: { - method: "eth_subscribe", - params: ['logs',{address: ['0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae','0xaaf4d0a3c12e86b4b5f39b213f7e19d048276dae'], topics: []}] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - subscriptions: [{ - subscription: '0x4444', - result: [{ - logIndex: '0x23', - transactionHash: '0x2345fdfdf', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - },{ - logIndex: '0x23', - transactionHash: '0x2345fdfdd', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0xddf4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] - }], - subscriptionResults: [{ - id: "log_d43624aa", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdf', - transactionIndex: 1, - address: '0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - },{ - id: "log_b20551f9", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdd', - transactionIndex: 1, - address: '0xDdf4d0A3c12e86b4B5f39B213f7E19d048276dAE', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] -}, -{ - protocol: 'eth', - args: ['logs',{address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', topics: ['0x23']}], // checksum address - firstResult: '0x555', - firstPayload: { - method: "eth_subscribe", - params: ['logs',{address: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', topics: ['0x23']}] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - dataCount: 1, - subscriptions: [{ - subscription: '0x555', - result: { - logIndex: '0x23', - transactionHash: '0x2345fdfdf', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - }], - subscriptionResults: [{ - id: "log_d43624aa", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdf', - transactionIndex: 1, - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] -}, -{ - protocol: 'eth', - args: ['logs',{address: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', topics: ['0x23']}], - firstResult: '0x5556666', - firstPayload: { - method: "eth_subscribe", - params: ['logs',{address: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', topics: ['0x23']}] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - dataCount: 1, - changedCount: 1, - subscriptions: [{ - subscription: '0x5556666', - result: { - logIndex: '0x23', - transactionHash: '0x2345fdfdf', - blockHash: '0x43534ffddd', - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - },{ - subscription: '0x5556666', - result: { - logIndex: '0x23', - transactionHash: '0x2345fdfdf', - blockHash: '0x43534ffddd', - removed: true, - transactionIndex: '0x1', - blockNumber: '0x3222', - address: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - } - }], - subscriptionResults: [{ - id: "log_d43624aa", - blockHash: "0x43534ffddd", - blockNumber: 12834, - logIndex: 35, - transactionHash: '0x2345fdfdf', - transactionIndex: 1, - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - },{ - id: "log_d43624aa", - blockHash: "0x43534ffddd", - blockNumber: 12834, - removed: true, - logIndex: 35, - transactionHash: '0x2345fdfdf', - transactionIndex: 1, - address: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // checksum address - topics: [ - '0x0000000000000000000000000000000000000000000000000000000005656565' - ], - data: '0x0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000008' - }] -}, - // SYNCING -{ - protocol: 'eth', - args: ['syncing'], - firstResult: '0x666666', - firstPayload: { - method: "eth_subscribe", - params: ['syncing'] - }, - secondResult: true, - secondPayload: { - method: "eth_unsubscribe" - }, - dataCount: 2, - changedCount: 2, - subscriptions: [{ - subscription: '0x666666', - result: { - startingBlock: '0xbff23', - currentBlock: '0xbff11', - highestBlock: '0xadf23', - knownStates: '0xaaa23', - pulledStates: '0x23' - } - },{ - subscription: '0x666666', - result: { - startingBlock: '0xbff23', - currentBlock: '0xbff11', - highestBlock: '0xbff11', - knownStates: '0xaaa23', - pulledStates: '0x23' - } - } - ], - subscriptionResults: [ - true, - { - startingBlock: 786211, - currentBlock: 786193, - highestBlock: 712483, - knownStates: 698915, - pulledStates: 35 - }, - { - startingBlock: 786211, - currentBlock: 786193, - highestBlock: 786193, - knownStates: 698915, - pulledStates: 35 - }, - false - ] -}]; - - -testSubscription.runTests('eth', tests); - diff --git a/test/eth.transactionBlockTimeout.js b/test/eth.transactionBlockTimeout.js deleted file mode 100644 index 901930f789e..00000000000 --- a/test/eth.transactionBlockTimeout.js +++ /dev/null @@ -1,25 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var setValue = 123; - -describe('web3.eth', function () { - describe('transactionBlockTimeout', function () { - it('should check if transactionBlockTimeout is set to proper value', function () { - assert.equal(eth.transactionBlockTimeout, 50); - assert.equal(eth.Contract.transactionBlockTimeout, 50); - assert.equal(eth.getCode.method.transactionBlockTimeout, 50); - }); - it('should set transactionBlockTimeout for all sub packages is set to proper value, if Eth package is changed', function () { - eth.transactionBlockTimeout = setValue; - - assert.equal(eth.transactionBlockTimeout, setValue); - assert.equal(eth.Contract.transactionBlockTimeout, setValue); - assert.equal(eth.getCode.method.transactionBlockTimeout, setValue); - }); - }); -}); - diff --git a/test/eth.transactionConfirmationBlocks.js b/test/eth.transactionConfirmationBlocks.js deleted file mode 100644 index abfb7065423..00000000000 --- a/test/eth.transactionConfirmationBlocks.js +++ /dev/null @@ -1,25 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var setValue = 123; - -describe('web3.eth', function () { - describe('transactionConfirmationBlocks', function () { - it('should check if transactionConfirmationBlocks is set to proper value', function () { - assert.equal(eth.transactionConfirmationBlocks, 24); - assert.equal(eth.Contract.transactionConfirmationBlocks, 24); - assert.equal(eth.getCode.method.transactionConfirmationBlocks, 24); - }); - it('should set transactionConfirmationBlocks for all sub packages is set to proper value, if Eth package is changed', function () { - eth.transactionConfirmationBlocks = setValue; - - assert.equal(eth.transactionConfirmationBlocks, setValue); - assert.equal(eth.Contract.transactionConfirmationBlocks, setValue); - assert.equal(eth.getCode.method.transactionConfirmationBlocks, setValue); - }); - }); -}); - diff --git a/test/eth.transactionPollingTimeout.js b/test/eth.transactionPollingTimeout.js deleted file mode 100644 index bb8ab5569f3..00000000000 --- a/test/eth.transactionPollingTimeout.js +++ /dev/null @@ -1,25 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); - -var eth = new Eth(); - -var setValue = 123; - -describe('web3.eth', function () { - describe('transactionPollingTimeout', function () { - it('should check if transactionPollingTimeout is set to proper value', function () { - assert.equal(eth.transactionPollingTimeout, 750); - assert.equal(eth.Contract.transactionPollingTimeout, 750); - assert.equal(eth.getCode.method.transactionPollingTimeout, 750); - }); - it('should set transactionPollingTimeout for all sub packages is set to proper value, if Eth package is changed', function () { - eth.transactionPollingTimeout = setValue; - - assert.equal(eth.transactionPollingTimeout, setValue); - assert.equal(eth.Contract.transactionPollingTimeout, setValue); - assert.equal(eth.getCode.method.transactionPollingTimeout, setValue); - }); - }); -}); - diff --git a/test/eth_methods.js b/test/eth_methods.js deleted file mode 100644 index 839984f2f5b..00000000000 --- a/test/eth_methods.js +++ /dev/null @@ -1,52 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var u = require('./helpers/test.utils.js'); - -var Eth = require('../packages/web3-eth'); -var eth = new Eth(); - -describe('eth', function() { - describe('methods', function() { - u.methodExists(eth, 'getBalance'); - u.methodExists(eth, 'getStorageAt'); - u.methodExists(eth, 'getTransactionCount'); - u.methodExists(eth, 'getCode'); - u.methodExists(eth, 'isSyncing'); - u.methodExists(eth, 'sendTransaction'); - u.methodExists(eth, 'call'); - u.methodExists(eth, 'getBlock'); - u.methodExists(eth, 'getTransaction'); - u.methodExists(eth, 'getUncle'); - u.methodExists(eth, 'getBlockTransactionCount'); - u.methodExists(eth, 'getBlockUncleCount'); - u.methodExists(eth, 'subscribe'); - u.methodExists(eth, 'Contract'); - u.methodExists(eth, 'Iban'); - u.methodExists(eth, 'getChainId') - - u.methodExists(eth, 'isMining'); - u.methodExists(eth, 'getCoinbase'); - u.methodExists(eth, 'getGasPrice'); - u.methodExists(eth, 'getHashrate'); - u.methodExists(eth, 'getAccounts'); - u.methodExists(eth, 'getBlockNumber'); - - u.methodExists(eth, 'getProtocolVersion'); - - u.methodExists(eth, 'setProvider'); - u.propertyExists(eth, 'givenProvider'); - u.propertyExists(eth, 'defaultBlock'); - u.propertyExists(eth, 'defaultAccount'); - - u.propertyExists(eth, 'net'); - u.methodExists(eth.net, 'getId'); - u.methodExists(eth.net, 'isListening'); - u.methodExists(eth.net, 'getPeerCount'); - - u.propertyExists(eth, 'personal'); - u.methodExists(eth.personal, 'sendTransaction'); - u.methodExists(eth.personal, 'newAccount'); - u.methodExists(eth.personal, 'unlockAccount'); - }); -}); - diff --git a/test/event.decode.js b/test/event.decode.js deleted file mode 100644 index 619b4ed6d64..00000000000 --- a/test/event.decode.js +++ /dev/null @@ -1,227 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth/'); - - -var name = 'event1'; -var address = '0xffddb67890123456789012345678901234567890'; -var resultAddress = '0xffdDb67890123456789012345678901234567890'; - -var tests = [{ - abi: { - name: name, - type: 'event', - inputs: [] - }, - data: { - logIndex: '0x1', - transactionIndex: '0x10', - transactionHash: '0x1234567890', - address: address, - blockHash: '0x1234567890', - blockNumber: '0x1' - }, - expected: { - event: name, - signature: null, - returnValues: {}, - logIndex: 1, - transactionIndex: 16, - transactionHash: '0x1234567890', - address: resultAddress, - blockHash: '0x1234567890', - blockNumber: 1, - id: "log_c71f2e84", - raw: { - topics: [], - data: '' - } - } -}, { - abi: { - name: name, - inputs: [{ - name: 'a', - type: 'int', - indexed: false - }] - }, - data: { - logIndex: '0x1', - transactionIndex: '0x10', - transactionHash: '0x1234567890', - address: address, - blockHash: '0x1234567890', - blockNumber: '0x1', - data: '0x0000000000000000000000000000000000000000000000000000000000000001' - }, - expected: { - event: name, - signature: null, - returnValues: { - 0: '1', - a: '1' - }, - logIndex: 1, - transactionIndex: 16, - transactionHash: '0x1234567890', - address: resultAddress, - blockHash: '0x1234567890', - blockNumber: 1, - id: "log_c71f2e84", - raw: { - data: "0x0000000000000000000000000000000000000000000000000000000000000001", - topics: [] - } - } -}, { - abi: { - name: name, - inputs: [{ - name: 'a', - type: 'int', - indexed: false - }, { - name: 'b', - type: 'int', - indexed: true - }, { - name: 'c', - type: 'int', - indexed: false - }, { - name: 'd', - type: 'int', - indexed: true - }] - }, - data: { - logIndex: '0x1', - transactionIndex: '0x10', - transactionHash: '0x1234567890', - address: address, - blockHash: '0x1234567890', - blockNumber: '0x1', - data: '0x' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000004', - topics: [ - address, - '0x000000000000000000000000000000000000000000000000000000000000000a', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] - }, - expected: { - event: name, - signature: address, - returnValues: { - 0: '1', - 1: '10', - 2: '4', - 3: '16', - a: '1', - b: '10', - c: '4', - d: '16' - }, - logIndex: 1, - transactionIndex: 16, - transactionHash: '0x1234567890', - address: resultAddress, - blockHash: '0x1234567890', - blockNumber: 1, - id: "log_c71f2e84", - raw: { - data: '0x' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000004', - topics: [ - address, - '0x000000000000000000000000000000000000000000000000000000000000000a', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] - } - } -}, { - abi: { - name: name, - anonymous: true, - inputs: [{ - name: 'a', - type: 'int', - indexed: false - }, { - name: 'b', - type: 'int', - indexed: true - }, { - name: 'c', - type: 'int', - indexed: false - }, { - name: 'd', - type: 'int', - indexed: true - }] - }, - data: { - logIndex: '0x1', - transactionIndex: '0x10', - transactionHash: '0x1234567890', - address: resultAddress, - blockHash: '0x1234567890', - blockNumber: '0x1', - data: '0x' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000004', - topics: [ - '0x000000000000000000000000000000000000000000000000000000000000000a', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] - }, - expected: { - event: name, - signature: null, - returnValues: { - 0: '1', - 1: '10', - 2: '4', - 3: '16', - a: '1', - b: '10', - c: '4', - d: '16' - }, - logIndex: 1, - transactionIndex: 16, - transactionHash: '0x1234567890', - address: resultAddress, - blockHash: '0x1234567890', - blockNumber: 1, - id: "log_c71f2e84", - raw: { - data: '0x' + - '0000000000000000000000000000000000000000000000000000000000000001' + - '0000000000000000000000000000000000000000000000000000000000000004', - topics: [ - '0x000000000000000000000000000000000000000000000000000000000000000a', - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] - } - } -}]; - -describe('lib/web3/event', function () { - describe('decode', function () { - tests.forEach(function (test, index) { - it('test no: ' + index, function () { - var eth = new Eth(); - var contract = new eth.Contract([test.abi], address); - - var result = contract._decodeEventABI.call(test.abi, test.data); - assert.deepEqual(result, test.expected); - }); - }); - }); -}); - diff --git a/test/event.encode.js b/test/event.encode.js deleted file mode 100644 index b05158750d1..00000000000 --- a/test/event.encode.js +++ /dev/null @@ -1,248 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Eth = require('../packages/web3-eth'); - - -var address = '0x1234567890123456789012345678901234567890'; -var signature = '0xffff'; - -var tests = [{ - abi: { - name: 'event1', - inputs: [], - signature: signature - }, - options: {}, - expected: { - address: address, - topics: [ - signature - ] - } -}, { - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }], - signature: signature - }, - options: { - filter: { - a: 16 - }, - }, - expected: { - address: address, - topics: [ - signature, - '0x0000000000000000000000000000000000000000000000000000000000000010' - ] - } -},{ - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }, { - type: 'int', - name: 'b', - indexed: true - }, { - type: 'int', - name: 'c', - indexed: false - }, { - type: 'int', - name: 'd', - indexed: true - }], - signature: signature - }, - options: { - filter: { - b: 4 - } - }, - expected: { - address: address, - topics: [ - signature, // signature - null, // a - '0x0000000000000000000000000000000000000000000000000000000000000004', // b - null // d - ] - } -}, { - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }, { - type: 'int', - name: 'b', - indexed: true - }], - signature: signature - }, - options: { - filter: { - a: [16, 1], - b: 2 - } - }, - expected: { - address: address, - topics: [ - signature, - ['0x0000000000000000000000000000000000000000000000000000000000000010', '0x0000000000000000000000000000000000000000000000000000000000000001'], - '0x0000000000000000000000000000000000000000000000000000000000000002' - ] - } -}, { - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }], - signature: signature - }, - options: { - filter: { - a: null - } - }, - expected: { - address: address, - topics: [ - signature, - null - ] - } -}, { - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }], - signature: signature - }, - options: { - filter: { - a: 1 - }, - fromBlock: 'latest', - toBlock: 'pending' - }, - expected: { - address: address, - fromBlock: 'latest', - toBlock: 'pending', - topics: [ - signature, - '0x0000000000000000000000000000000000000000000000000000000000000001' - ] - } -}, -{ - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }], - signature: signature - }, - options: { - filter: { - a: 1 - }, - fromBlock: 4, - toBlock: 10 - }, - expected: { - address: address, - fromBlock: '0x4', - toBlock: '0xa', - topics: [ - signature, - '0x0000000000000000000000000000000000000000000000000000000000000001' - ] - } -}, { - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }], - anonymous: true, - signature: signature - }, - options: { - filter: { - a: 1 - } - }, - expected: { - address: address, - topics: [ - '0x0000000000000000000000000000000000000000000000000000000000000001' - ] - } -}, { - abi: { - name: 'event1', - inputs: [{ - type: 'int', - name: 'a', - indexed: true - }, { - type: 'int', - name: 'b', - indexed: true - }], - anonymous: true, - signature: signature - }, - options: { - filter: { - b: 1 - } - }, - expected: { - address: address, - topics: [ - null, - '0x0000000000000000000000000000000000000000000000000000000000000001' - ] - } -}]; - -describe('lib/web3/event', function () { - describe('encode', function () { - tests.forEach(function (test, index) { - it('test no: ' + index, function () { - var eth = new Eth(); - var contract = new eth.Contract([test.abi], address); - - - var result = contract._encodeEventABI(test.abi, test.options); - assert.deepEqual(result, test.expected); - }); - }); - }); -}); - diff --git a/test/extend.js b/test/extend.js deleted file mode 100644 index af992c1e11b..00000000000 --- a/test/extend.js +++ /dev/null @@ -1,93 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var FakeHttpProvider = require('./helpers/FakeIpcProvider'); -var Web3 = require('../packages/web3'); -var web3 = new Web3(); - - -var tests = [{ - methods: [{ - name: 'getGasPrice2', - call: 'eth_gasPrice', - outputFormatter: web3.extend.formatters.outputBigNumberFormatter - },{ - name: 'getBalance', - call: 'eth_getBalance', - params: 2, - inputFormatter: [web3.utils.toChecksumAddress, web3.extend.formatters.inputDefaultBlockNumberFormatter], - outputFormatter: web3.extend.formatters.outputBigNumberFormatter - }] -},{ - property: 'admin', - methods: [{ - name: 'getGasPrice3', - call: 'eth_gasPrice', - outputFormatter: web3.extend.formatters.outputBigNumberFormatter - },{ - name: 'getBalance', - call: 'eth_getBalance', - params: 2, - inputFormatter: [web3.utils.toChecksumAddress, web3.extend.formatters.inputDefaultBlockNumberFormatter], - outputFormatter: web3.extend.formatters.outputBigNumberFormatter - }] -},{ - error: true, - methods: [{ - name: 'getGasPrice4', - outputFormatter: web3.extend.formatters.outputBigNumberFormatter - }] -},{ - error: true, - methods: [{ - call: 'eth_gasPrice', - outputFormatter: web3.extend.formatters.outputBigNumberFormatter - }] -}]; - -describe('web3', function () { - describe('extend', function () { - tests.forEach(function (test, index) { - it('test no: ' + index, function (done) { - var count = 1; - - var provider = new FakeHttpProvider(); - web3.setProvider(provider); - - if(test.error) { - assert.throws(web3.extend.bind(web3,test)); - - return done(); - - } else { - web3.extend(test); - } - - if(test.methods) { - test.methods.forEach(function(property){ - - - provider.injectResult('0x1234'); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, property.call); - - if(test.methods.length === count) - done(); - else - count++; - }); - - if(test.property) { - assert.isFunction(web3[test.property][property.name]); - web3[test.property][property.name](); - } else { - assert.isFunction(web3[property.name]); - web3[property.name](); - } - }); - } - }); - }); - }); -}); - diff --git a/test/formatters.inputAddressFormatter.js b/test/formatters.inputAddressFormatter.js deleted file mode 100644 index 1c47f91f014..00000000000 --- a/test/formatters.inputAddressFormatter.js +++ /dev/null @@ -1,51 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -var tests = [ - { input: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', result: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8' }, - { input: 'XE75JRZCTTLBSYEQBGAS7GID8DKR7QY0QA3', result: '0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b'}, - { input: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', result: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8'}, - { input: '00c5496aee77c1ba1f0854206a26dda82a81d6d8', result: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8'}, - { input: '11f4d0a3c12e86b4b5f39b213f7e19d048276dae', result: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae' }, - { input: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', result: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae' }, - { input: '0x11F4D0A3C12E86B4B5F39B213F7E19D048276DAE', result: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae' }, - { input: '0X11F4D0A3C12E86B4B5F39B213F7E19D048276DAE', result: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae' }, - { input: '11F4D0A3C12E86B4B5F39B213F7E19D048276DAE', result: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae' }, - { input: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', result: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae' } -]; - -var errorTests = [ - '0x0c5496aee77c1ba1f0854206a26dda82a81d6d8', - '0x0c5496aee77c1ba1f0854206a26dda82a81d6d8', - '00c5496aee77c1ba1f0854206a26dda82a81d6d', - 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZE', - '0x', - '0x11f4d0a3c12e86B4b5F39b213f7E19D048276DAe', - {}, - [], - '' -]; - -describe('formatters', function () { - describe('inputAddressFormatter correct addresses', function () { - tests.forEach(function(test){ - it('should return the correct value', function () { - assert.deepEqual(formatters.inputAddressFormatter(test.input), test.result); - }); - }); - }); -}); - - -describe('formatters', function () { - describe('inputAddressFormatter wrong addresses', function () { - errorTests.forEach(function(test){ - it('should throw an exception', function () { - assert.throws(function () { - formatters.inputAddressFormatter(test); - }, null, null, 'Should throw:'+ test); - }); - }); - }); -}); diff --git a/test/formatters.inputDefaultBlockFormatter.js b/test/formatters.inputDefaultBlockFormatter.js deleted file mode 100644 index 41714929204..00000000000 --- a/test/formatters.inputDefaultBlockFormatter.js +++ /dev/null @@ -1,25 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -var tests = [ - { value: 'genesis', expected: '0x0' }, - { value: 'latest', expected: 'latest' }, - { value: 'pending', expected: 'pending' }, - { value: 'earliest', expected: 'earliest' }, - { value: 1, expected: '0x1' }, - { value: '0x1', expected: '0x1' } -]; - -describe('lib/web3/formatters', function () { - describe('inputDefaultBlockNumberFormatter', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.strictEqual(formatters.inputDefaultBlockNumberFormatter(test.value), test.expected); - }); - }); - }); -}); - - - diff --git a/test/formatters.inputLogFormatter.js b/test/formatters.inputLogFormatter.js deleted file mode 100644 index eee62490e39..00000000000 --- a/test/formatters.inputLogFormatter.js +++ /dev/null @@ -1,108 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -describe('InputLogFormatterTest', function() { - - it('call inputLogFormatter with a valid log', function() { - var log = { - fromBlock: 'earliest', - toBlock: 'latest', - topics: ['0x0'], - address: '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078' - }; - - assert.deepEqual(formatters.inputLogFormatter(log), { - fromBlock: 'earliest', - toBlock: 'latest', - topics: ['0x0'], - address: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }); - }); - - it('call inputLogFormatter with numerical from/to blocks', function() { - var log = { - fromBlock: 1, - toBlock: 2, - topics: ['0x0'], - address: '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078' - }; - - assert.deepEqual(formatters.inputLogFormatter(log), { - fromBlock: '0x1', - toBlock: '0x2', - topics: ['0x0'], - address: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }); - }); - - it('call inputLogFormatter with zero valued from/to blocks', function() { - var log = { - fromBlock: 0, - toBlock: 0, - topics: ['0x0'], - address: '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078' - }; - - assert.deepEqual(formatters.inputLogFormatter(log), { - fromBlock: '0x0', - toBlock: '0x0', - topics: ['0x0'], - address: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }); - }); - - it('call inputLogFormatter with a array of addresses in the log', function() { - var log = { - fromBlock: 'earliest', - toBlock: 'latest', - topics: ['0x0'], - address: [ - '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078', - '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078' - ] - }; - - assert.deepEqual(formatters.inputLogFormatter(log), { - fromBlock: 'earliest', - toBlock: 'latest', - topics: ['0x0'], - address: [ - '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - ] - }); - }); - - it('call inputLogFormatter with an topic item of null', function() { - var log = { - fromBlock: 'earliest', - toBlock: 'latest', - topics: [null], - address: '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078' - }; - - assert.deepEqual(formatters.inputLogFormatter(log), { - fromBlock: 'earliest', - toBlock: 'latest', - topics: [null], - address: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }); - }); - - it('call inputLogFormatter with an topic item that does not start with "0x"', function() { - var log = { - fromBlock: 'earliest', - toBlock: 'latest', - topics: ['00'], - address: '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078' - }; - - assert.deepEqual(formatters.inputLogFormatter(log), { - fromBlock: 'earliest', - toBlock: 'latest', - topics: ['0x3030'], - address: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }); - }); -}); diff --git a/test/formatters.inputPostFormatter.js b/test/formatters.inputPostFormatter.js deleted file mode 100644 index 5497eb437f8..00000000000 --- a/test/formatters.inputPostFormatter.js +++ /dev/null @@ -1,31 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -describe('formatters', function () { - describe('inputPostFormatter', function () { - it('should return the correct value', function () { - - // input as strings and numbers - assert.deepEqual(formatters.inputPostFormatter({ - from: '0x00000', - to: '0x00000', - payload: '0x7b2274657374223a2274657374227d',//{test: 'test'}, - ttl: 200, - priority: 1000, - topics: ['hello','mytopics'], - "workToProve": 1 - }), { - from: '0x00000', - to: '0x00000', - payload: '0x7b2274657374223a2274657374227d', - ttl: '0xc8', - priority: '0x3e8', - topics: ['0x68656c6c6f','0x6d79746f70696373'], - workToProve: '0x1' - }); - - }); - }); -}); - diff --git a/test/formatters.inputTransactionFormatter.js b/test/formatters.inputTransactionFormatter.js deleted file mode 100644 index 47c767e7c06..00000000000 --- a/test/formatters.inputTransactionFormatter.js +++ /dev/null @@ -1,111 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -var tests = [{ - input: { - data: '0x34234bf23bf4234', - value: '100', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', // checksum address - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - nonce: 1000, - gas: 1000, - gasPrice: '1000' - }, - result: { - data: '0x34234bf23bf4234', - value: '0x64', - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - nonce: '0x3e8', - gas: '0x3e8', - gasPrice: '0x3e8' - } -},{ - input: { - data: '0x34234bf23bf4234', - value: '100', - from: '00c5496aee77c1ba1f0854206a26dda82a81d6d8', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe' // checksum address - }, - result: { - data: '0x34234bf23bf4234', - value: '0x64', - from: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae' - } -},{ - input: { - data: '0x34234bf23bf4234', - value: '100', - from: '00c5496aee77c1ba1f0854206a26dda82a81d6d8', - to: '00c5496aee77c1ba1f0854206a26dda82a81d6d8', - gas: '1000', - gasPrice: '1000' - }, - result: { - data: '0x34234bf23bf4234', - value: '0x64', - from: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - to: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - gas: '0x3e8', - gasPrice: '0x3e8' - }, -}, { - input: { - data: '0x34234bf23bf4234', - value: '100', - from: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', - to: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', - gas: '1000', - gasPrice: '1000' - }, - result: { - data: '0x34234bf23bf4234', - value: '0x64', - from: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - to: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - gas: '0x3e8', - gasPrice: '0x3e8' - }, -}, { - input: { - data: '0x34234bf23bf4234', - value: '100', - from: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', - gas: '1000', - gasPrice: '1000' - }, - result: { - data: '0x34234bf23bf4234', - value: '0x64', - from: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - gas: '0x3e8', - gasPrice: '0x3e8' - } -}, { - input: { - data: '34234bf23bf4234', - value: '100', - from: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', - gas: '1000', - gasPrice: '1000' - }, - result: { - data: '0x34234bf23bf4234', - value: '0x64', - from: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', - gas: '0x3e8', - gasPrice: '0x3e8' - } -}]; - -describe('formatters', function () { - describe('inputTransactionFormatter', function () { - tests.forEach(function(test){ - it('should return the correct value', function () { - assert.deepEqual(formatters.inputTransactionFormatter(test.input), test.result); - }); - }); - }); -}); diff --git a/test/formatters.outputBlockFormatter.js b/test/formatters.outputBlockFormatter.js deleted file mode 100644 index d6bf27563de..00000000000 --- a/test/formatters.outputBlockFormatter.js +++ /dev/null @@ -1,81 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - - -describe('formatters', function () { - describe('outputBlockFormatter', function () { - it('should return the correct value', function () { - - assert.deepEqual(formatters.outputBlockFormatter({ - hash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265', - miner: '0xdcc6960376d6c6dea93647383ffb245cfced97cf', - stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583', - sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', - bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - difficulty: '0x3e8', - totalDifficulty: '0x3e8', - number: '0x3e8', - gasLimit: '0x3e8', - gasUsed: '0x3e8', - timestamp: '0x3e8', - extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - nonce: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - size: '0x3e8' - }), { - hash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265', - miner: '0xDCc6960376d6C6dEa93647383FfB245CfCed97Cf', - stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583', - sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', - bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - difficulty: '1000', - totalDifficulty: '1000', - number: 1000, - gasLimit: 1000, - gasUsed: 1000, - timestamp: 1000, - extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - nonce: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - size: 1000 - }); - }); - it('should return the correct value, when null values are present', function () { - - assert.deepEqual(formatters.outputBlockFormatter({ - hash: null, - parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265', - miner: null, - stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583', - sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', - bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - difficulty: '0x3e8', - totalDifficulty: '0x3e8', - number: null, - gasLimit: '0x3e8', - gasUsed: '0x3e8', - timestamp: '0x3e8', - extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - nonce: null, - size: '0x3e8' - }), { - hash: null, - parentHash: '0x83ffb245cfced97ccc5c75253d6960376d6c6dea93647397a543a72fdaea5265', - miner: null, - stateRoot: '0x54dda68af07643f68739a6e9612ad157a26ae7e2ce81f77842bb5835fbcde583', - sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347', - bloom: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - difficulty: '1000', - totalDifficulty: '1000', - number: null, - gasLimit: 1000, - gasUsed: 1000, - timestamp: 1000, - extraData: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - nonce: null, - size: 1000 - }); - }); - }); -}); diff --git a/test/formatters.outputLogFormatter.js b/test/formatters.outputLogFormatter.js deleted file mode 100644 index da692001512..00000000000 --- a/test/formatters.outputLogFormatter.js +++ /dev/null @@ -1,51 +0,0 @@ -var assert = require('assert'); -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -describe('formatters', function () { - describe('outputLogFormatter', function () { - it('should return the correct value', function () { - - assert.deepEqual(formatters.outputLogFormatter({ - transactionIndex: '0x3e8', - logIndex: '0x3e8', - blockNumber: '0x3e8', - transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - data: '0x7b2274657374223a2274657374227', - address: "0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae", // lowercase address - topics: ['0x68656c6c6f','0x6d79746f70696373'] - }), { - transactionIndex: 1000, - logIndex: 1000, - blockNumber: 1000, - transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265', - data: '0x7b2274657374223a2274657374227', - topics: ['0x68656c6c6f','0x6d79746f70696373'], - address: "0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe", // checksum address - id: "log_2b801386" - }); - }); - it('should return the correct value, when null values are present', function () { - - assert.deepEqual(formatters.outputLogFormatter({ - transactionIndex: null, - logIndex: null, - blockNumber: null, - transactionHash: null, - blockHash: null, - data: '0x7b2274657374223a2274657374227', - topics: ['0x68656c6c6f','0x6d79746f70696373'] - }), { - transactionIndex: null, - logIndex: null, - blockNumber: null, - transactionHash: null, - blockHash: null, - id: null, - data: '0x7b2274657374223a2274657374227', - topics: ['0x68656c6c6f','0x6d79746f70696373'] - }); - }); - }); -}); diff --git a/test/formatters.outputPostFormatter.js b/test/formatters.outputPostFormatter.js deleted file mode 100644 index 6db807e1f0d..00000000000 --- a/test/formatters.outputPostFormatter.js +++ /dev/null @@ -1,26 +0,0 @@ -var assert = require('assert'); -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -describe('formatters', function () { - describe('outputPostFormatter', function () { - it('should return the correct value', function () { - - assert.deepEqual(formatters.outputPostFormatter({ - expiry: '0x3e8', - sent: '0x3e8', - ttl: '0x3e8', - workProved: '0x3e8', - payload: '0x7b2274657374223a2274657374227d', - topics: ['0x68656c6c6f','0x6d79746f70696373'] - }), { - expiry: 1000, - sent: 1000, - ttl: 1000, - workProved: 1000, - payload: '0x7b2274657374223a2274657374227d', //{test: 'test'}, - // payloadRaw: '0x7b2274657374223a2274657374227d', - topics: ['hello','mytopics'] - }); - }); - }); -}); diff --git a/test/formatters.outputTransactionFormatter.js b/test/formatters.outputTransactionFormatter.js deleted file mode 100644 index 38dede445de..00000000000 --- a/test/formatters.outputTransactionFormatter.js +++ /dev/null @@ -1,60 +0,0 @@ -var assert = require('assert'); -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -describe('formatters', function () { - describe('outputTransactionFormatter', function () { - it('should return the correct value', function () { - - assert.deepEqual(formatters.outputTransactionFormatter({ - input: '0x3454645634534', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - value: '0x3e8', - gas: '0x3e8', - gasPrice: '0x3e8', - nonce: '0xb', - transactionIndex: '0x1', - blockNumber: '0x3e8', - blockHash: '0xc9b9cdc2092a9d6589d96662b1fd6949611163fb3910cf8a173cd060f17702f9' - }), { - input: '0x3454645634534', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '1000', - gas: 1000, - gasPrice: '1000', - nonce: 11, - blockNumber: 1000, - blockHash: '0xc9b9cdc2092a9d6589d96662b1fd6949611163fb3910cf8a173cd060f17702f9', - transactionIndex: 1 - }); - }); - - it('should return the correct value, when null values are present', function () { - - assert.deepEqual(formatters.outputTransactionFormatter({ - input: '0x3454645634534', - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: null, - value: '0x3e8', - gas: '0x3e8', - gasPrice: '0x3e8', - nonce: '0xb', - transactionIndex: null, - blockNumber: null, - blockHash: null - }), { - input: '0x3454645634534', - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: null, - value: 1000, - gas: 1000, - gasPrice: '1000', - nonce: 11, - blockNumber: null, - blockHash: null, - transactionIndex: null - }); - }); - }); -}); diff --git a/test/formatters.outputTransactionReceiptFormatter.js b/test/formatters.outputTransactionReceiptFormatter.js deleted file mode 100644 index 7647d725d36..00000000000 --- a/test/formatters.outputTransactionReceiptFormatter.js +++ /dev/null @@ -1,122 +0,0 @@ -var assert = require('assert'); -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); - -describe('outputTransactionReceiptFormatter', function() { - - it('call outputTransactionReceiptFormatter with a valid receipt', function() { - var receipt = { - status: '0x0', - cumulativeGasUsed: '0x100', - gasUsed: '0x100', - blockNumber: '0x100', - transactionIndex: '0xa', - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }; - - assert.deepEqual(formatters.outputTransactionReceiptFormatter(receipt), { - status: false, - cumulativeGasUsed: 256, - gasUsed: 256, - blockNumber: 256, - transactionIndex: 10, - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078' - }); - }); - - it('call outputTransactionReceiptFormatter with a valid receipt and logs', function() { - var receipt = { - status: '0x0', - cumulativeGasUsed: '0x100', - gasUsed: '0x100', - blockNumber: '0x100', - transactionIndex: '0xa', - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - logs: [{}] - }; - - assert.deepEqual(formatters.outputTransactionReceiptFormatter(receipt), { - status: false, - cumulativeGasUsed: 256, - gasUsed: 256, - blockNumber: 256, - transactionIndex: 10, - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03C9A938fF7f54090d0d99e2c6f80380510Ea078', - logs: [ - { - blockNumber: undefined, - id: null, - logIndex: undefined, - transactionIndex: undefined - } - ] - }); - }); - - it('call outputTransactionReceiptFormatter when status is "0x1"', function() { - var receipt = { - status: '0x1', - cumulativeGasUsed: '0x100', - gasUsed: '0x100', - blockNumber: '0x100', - transactionIndex: '0xa', - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }; - - assert.equal(formatters.outputTransactionReceiptFormatter(receipt).status, true) - }); - - it('call outputTransactionReceiptFormatter when status is "0x01"', function() { - var receipt = { - status: '0x01', - cumulativeGasUsed: '0x100', - gasUsed: '0x100', - blockNumber: '0x100', - transactionIndex: '0xa', - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }; - - assert.equal(formatters.outputTransactionReceiptFormatter(receipt).status, true) - }); - - it('call outputTransactionReceiptFormatter when status is "undefined"', function() { - var receipt = { - status: undefined, - cumulativeGasUsed: '0x100', - gasUsed: '0x100', - blockNumber: '0x100', - transactionIndex: '0xa', - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }; - - assert.equal(formatters.outputTransactionReceiptFormatter(receipt).status, undefined) - }); - - it('call outputTransactionReceiptFormatter when status is "null"', function() { - var receipt = { - status: null, - cumulativeGasUsed: '0x100', - gasUsed: '0x100', - blockNumber: '0x100', - transactionIndex: '0xa', - to: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - from: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078', - contractAddress: '0x03c9a938ff7f54090d0d99e2c6f80380510ea078' - }; - - assert.equal(formatters.outputTransactionReceiptFormatter(receipt).status, null) - }); -}); diff --git a/test/helpers/FakeHttpProvider.js b/test/helpers/FakeHttpProvider.js deleted file mode 100644 index bda5b37a7e7..00000000000 --- a/test/helpers/FakeHttpProvider.js +++ /dev/null @@ -1,126 +0,0 @@ -var chai = require('chai'); -var assert = require('assert'); -var _ = require('lodash'); - - - - -var FakeHttpProvider = function HttpProvider() { - var _this = this; - this.countId = 1; - this.getResponseStub = function () { - return { - jsonrpc: '2.0', - id: _this.countId, - result: null - }; - }; - this.getErrorStub = function () { - return { - jsonrpc: '2.0', - id: _this.countId, - error: { - code: 1234, - message: 'Stub error' - } - }; - }; - - this.response = []; - this.error = []; - this.validation = []; -}; - - -FakeHttpProvider.prototype.send = function (payload, callback) { - var _this = this; - - // set id - if(payload.id) - this.countId = payload.id; - // else - // this.countId++; - - assert.equal(_.isArray(payload) || _.isObject(payload), true); - assert.equal(_.isFunction(callback), true); - - var validation = this.validation.shift(); - - if (validation) { - // imitate plain json object - validation(JSON.parse(JSON.stringify(payload)), callback); - } - - var response = this.getResponseOrError('response', payload); - var error = this.getResponseOrError('error', payload); - - setTimeout(function(){ - callback(error, response); - }, 1); -}; - -FakeHttpProvider.prototype.getResponseOrError = function (type, payload) { - var _this = this; - var response; - - if(type === 'error') { - response = this.error.shift(); - } else { - response = this.response.shift() || this.getResponseStub(); - } - - - if(response) { - if(_.isArray(response)) { - response = response.map(function(resp, index) { - resp.id = payload[index] ? payload[index].id : _this.countId++; - return resp; - }); - } else - response.id = payload.id; - } - - return response; -}; - - -// FakeHttpProvider.prototype.injectResponse = function (response) { -// this.response = response; -// }; - - - -FakeHttpProvider.prototype.injectBatchResults = function (results, error) { - var _this = this; - this.response.push(results.map(function (r) { - if(error) { - var response = _this.getErrorStub(); - response.error.message = r; - } else { - var response = _this.getResponseStub(); - response.result = r; - } - return response; - })); -}; - -FakeHttpProvider.prototype.injectResult = function (result) { - var response = this.getResponseStub(); - response.result = result; - - this.response.push(response); -}; - -FakeHttpProvider.prototype.injectError = function (error) { - var errorStub = this.getErrorStub(); - errorStub.error = error; // message, code - - this.error.push(errorStub); -}; - -FakeHttpProvider.prototype.injectValidation = function (callback) { - this.validation.push(callback); -}; - -module.exports = FakeHttpProvider; - diff --git a/test/helpers/FakeIpcProvider.js b/test/helpers/FakeIpcProvider.js deleted file mode 100644 index 6f52cb6c667..00000000000 --- a/test/helpers/FakeIpcProvider.js +++ /dev/null @@ -1,150 +0,0 @@ -var chai = require('chai'); -var assert = require('assert'); -var _ = require('lodash'); - - - - -var FakeIpcProvider = function IpcProvider() { - var _this = this; - this.countId = 1; - this.notificationCount = 1; - this.getResponseStub = function () { - return { - jsonrpc: '2.0', - id: _this.countId, - result: null - }; - }; - this.getErrorStub = function () { - return { - jsonrpc: '2.0', - id: _this.countId, - error: { - code: 1234, - message: 'Stub error' - } - }; - }; - - this.response = []; - this.error = []; - this.validation = []; - this.notificationCallbacks = []; - this.connected = true; -}; - - -FakeIpcProvider.prototype.send = function (payload, callback) { - var _this = this; - - // set id - if(payload.id) - this.countId = payload.id; - // else - // this.countId++; - - assert.equal(_.isArray(payload) || _.isObject(payload), true); - assert.equal(_.isFunction(callback), true); - - var validation = this.validation.shift(); - - if (validation) { - // imitate plain json object - validation(JSON.parse(JSON.stringify(payload)), callback); - } - - var response = this.getResponseOrError('response', payload); - var error = this.getResponseOrError('error', payload); - - setTimeout(function(){ - callback(error, response); - }, 1); -}; - -FakeIpcProvider.prototype.on = function (type, callback) { - if(type === 'data') { - this.notificationCallbacks.push(callback); - } -}; - -FakeIpcProvider.prototype.reset = function () { - this.notificationCallbacks = []; -}; - -FakeIpcProvider.prototype.getResponseOrError = function (type, payload) { - var _this = this; - var response; - - if(type === 'error') { - response = this.error.shift(); - } else { - response = this.response.shift() || this.getResponseStub(); - } - - - if(response) { - if(_.isArray(response)) { - response = response.map(function(resp, index) { - resp.id = payload[index] ? payload[index].id : _this.countId++; - return resp; - }); - } else - response.id = payload.id; - } - - return response; -}; - -FakeIpcProvider.prototype.injectNotification = function (notification) { - var _this = this; - setTimeout(function(){ - _this.notificationCallbacks.forEach(function(cb){ - if(notification && cb) - cb(notification); - }); - }, 100 + this.notificationCount); - - this.notificationCount += 10; -}; - -// FakeHttpProvider.prototype.injectResponse = function (response) { -// this.response = response; -// }; - - - -FakeIpcProvider.prototype.injectBatchResults = function (results, error) { - var _this = this; - this.response.push(results.map(function (r) { - if(error) { - var response = _this.getErrorStub(); - response.error.message = r; - } else { - var response = _this.getResponseStub(); - response.result = r; - } - return response; - })); -}; - -FakeIpcProvider.prototype.injectResult = function (result) { - var response = this.getResponseStub(); - response.result = result; - - this.response.push(response); -}; - -FakeIpcProvider.prototype.injectError = function (error) { - var errorStub = this.getErrorStub(); - errorStub.error = error; // message, code - - this.error.push(errorStub); -}; - -FakeIpcProvider.prototype.injectValidation = function (callback) { - this.validation.push(callback); -}; - -module.exports = FakeIpcProvider; - diff --git a/test/helpers/FakeIpcProvider2.js b/test/helpers/FakeIpcProvider2.js deleted file mode 100644 index 682f206f5ef..00000000000 --- a/test/helpers/FakeIpcProvider2.js +++ /dev/null @@ -1,37 +0,0 @@ -var FakeHttpProvider = require('./FakeIpcProvider'); - -var FakeIpcProvider2 = function () { - this.counter = 0; - this.resultList = []; -}; - -FakeIpcProvider2.prototype = new FakeHttpProvider(); -FakeIpcProvider2.prototype.constructor = FakeIpcProvider2; - -FakeIpcProvider2.prototype.injectResultList = function (list) { - this.resultList = list; -}; - -FakeIpcProvider2.prototype.getResponse = function () { - var result = this.resultList[this.counter]; - this.counter++; - - // add fallback result value - if(!result) - result = { - result: undefined - }; - - if (result.type === 'batch') { - this.injectBatchResults(result.result); - } else { - this.injectResult(result.result); - } - - this.counter = 0; - - return this.response; -}; - -module.exports = FakeIpcProvider2; - diff --git a/test/helpers/FakeIpcRequest.js b/test/helpers/FakeIpcRequest.js deleted file mode 100644 index 653e6fde55b..00000000000 --- a/test/helpers/FakeIpcRequest.js +++ /dev/null @@ -1,43 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; - -var FakeIpcRequest = function () { - var _this = this; - this._handle = {fd: {}}; - this.listenerList = []; - - return this; -}; - -FakeIpcRequest.prototype.connect = function (path) { - assert.notEqual(path, undefined); - - return this; -}; - - -FakeIpcRequest.prototype.on = function (name, callback) { - if(name === 'data'){ - this.listenerList.push(callback); - } -}; - - -FakeIpcRequest.prototype.writeSync = function (payload) { - assert.equal(typeof payload, 'string'); - return payload; -}; - -FakeIpcRequest.prototype.write = function (payload) { - assert.equal(typeof payload, 'string'); - - this.listenerList.forEach(function(cb){ - setTimeout(function(){ - cb(payload); - }, 100); - }); - -}; - -module.exports = FakeIpcRequest; - diff --git a/test/helpers/FakeXHR2.js b/test/helpers/FakeXHR2.js deleted file mode 100644 index 92e63cf59fc..00000000000 --- a/test/helpers/FakeXHR2.js +++ /dev/null @@ -1,41 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; - - -var FakeXHR2 = function () { - this.responseText = undefined; - this.readyState = 4; - this.onreadystatechange = null; - this.async = true; - this.agents = {}; - this.headers = { - 'Content-Type': 'text/plain' - }; -}; - -FakeXHR2.prototype.nodejsSet = function (agents) { - this.agents = agents; -}; - -FakeXHR2.prototype.open = function (method, host, async) { - assert.equal(method, 'POST'); - assert.notEqual(host, null); - this.async = async; -}; - -FakeXHR2.prototype.setRequestHeader = function(name, value) { - this.headers[name] = value; -}; - -FakeXHR2.prototype.send = function (payload) { - - this.responseText = payload; - - assert.equal(typeof payload, 'string'); - if (this.async) { - assert.equal(typeof this.onreadystatechange, 'function'); - this.onreadystatechange(); - } -}; - -module.exports = {XMLHttpRequest: FakeXHR2}; diff --git a/test/helpers/test.method.js b/test/helpers/test.method.js deleted file mode 100644 index 3afa2958e5c..00000000000 --- a/test/helpers/test.method.js +++ /dev/null @@ -1,268 +0,0 @@ -var _ = require('underscore'); -var chai = require('chai'); -var assert = chai.assert; -var FakeIpcProvider = require('./FakeIpcProvider'); -var Web3 = require('../../packages/web3'); - -var clone = function (object) { return object ? JSON.parse(JSON.stringify(object)) : []; }; - -var useLocalWallet = function (test, provider, web3) { - - test.useLocalWallet(web3); - - provider.injectResult("0x1"); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_chainId'); - assert.deepEqual(payload.params, []); - }); - - provider.injectResult('0xa'); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, 'eth_getTransactionCount'); - assert.deepEqual(payload.params, [test.walletFrom, "latest"]); - }); -}; - - - -var runTests = function (obj, method, tests) { - var objName; - - if(_.isArray(obj)) { - objName = obj.join('.'); - } else { - objName = obj; - } - - var testName = objName ? 'web3.' + objName : 'web3'; - - describe(testName, function () { - describe(method, function () { - tests.forEach(function (test, index) { - it('promise test: ' + index, function (done) { - - // given - var w3; - var result; - var provider = new FakeIpcProvider(); - var web3 = new Web3(provider); - - // add a wallet - if(test.useLocalWallet) { - useLocalWallet(test, provider, web3); - } - - - provider.injectResult(clone(test.result)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedArgs || []); - }); - - if (test.call2) { - provider.injectResult(clone(test.result2)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call2); - assert.deepEqual(payload.params, test.formattedArgs2 || []); - }); - } - - - // if notification its sendTransaction, which needs two more results, subscription and receipt - if(test.notification) { - provider.injectResult(null); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - - provider.injectResult(clone(test.result)); - // inject receipt - provider.injectResult({ - "blockHash": "0x6fd9e2a26ab", - "blockNumber": "0x15df", - "transactionHash": "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": "0x1", - "contractAddress": "0x407d73d8a49eeb85d32cf465507dd71d507100c1", - "cumulativeGasUsed": "0x7f110", - "gasUsed": "0x7f110" - }); - // fake newBlock - provider.injectNotification(test.notification); - } - - var args = clone(test.args); - - if(test.error) { - if (obj) { - if(_.isArray(obj)) { - w3 = web3[obj[0]][obj[1]]; - } else { - w3 = web3[obj]; - } - - if (test.defaultOptions) { - test.defaultOptions.forEach(function(option) { - w3[option[0]] = option[1]; - }); - } - - assert.throws(function(){ w3[method].apply(w3, args); }); - } else { - if (test.defaultOptions) { - test.defaultOptions.forEach(function(option) { - w3[option[0]] = option[1]; - }); - } - - assert.throws(function(){ web3[method].apply(web3, args); }); - } - - done(); - - } else { - - if (obj) { - if(_.isArray(obj)) { - w3 = web3[obj[0]][obj[1]]; - } else { - w3 = web3[obj]; - } - - if (test.defaultOptions) { - test.defaultOptions.forEach(function(option) { - w3[option[0]] = option[1]; - }); - } - - result = w3[method].apply(w3, args); - } else { - if (test.defaultOptions) { - test.defaultOptions.forEach(function(option) { - w3[option[0]] = option[1]; - }); - } - - result = web3[method].apply(web3, args); - } - - result.then(function(result){ - if(test.notification) { - // test receipt - assert.deepEqual(result, { - "blockHash": "0x6fd9e2a26ab", - "blockNumber": 5599, - "transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", - "transactionIndex": 1, - "contractAddress":"0x407D73d8a49eeb85D32Cf465507dd71d507100c1", // checksum address - "cumulativeGasUsed": 520464, - "gasUsed": 520464 - }); - } else { - assert.deepEqual(result, test.formattedResult); - } - - done(); - }); - } - - }); - - it('callback test: ' + index, function (done) { - - // given - var w3; - var provider = new FakeIpcProvider(); - var web3 = new Web3(provider); - - // add a wallet - if(test.useLocalWallet) { - useLocalWallet(test, provider, web3); - } - - provider.injectResult(clone(test.result)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call); - assert.deepEqual(payload.params, test.formattedArgs || []); - }); - - if (test.call2) { - provider.injectResult(clone(test.result2)); - provider.injectValidation(function (payload) { - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, test.call2); - assert.deepEqual(payload.params, test.formattedArgs2 || []); - }); - } - - - var args = clone(test.args); - - if(test.error) { - if (obj) { - if(_.isArray(obj)) { - w3 = web3[obj[0]][obj[1]]; - } else { - w3 = web3[obj]; - } - - if (test.defaultOptions) { - test.defaultOptions.forEach(function(option) { - w3[option[0]] = option[1]; - }); - } - - assert.throws(function(){ w3[method].apply(w3, args); }); - } else { - assert.throws(function(){ web3[method].apply(web3, args); }); - } - - done(); - - } else { - // add callback - args.push(function (err, result) { - assert.deepEqual(result, test.formattedResult); - - done(); - }); - - // when - if (obj) { - if(_.isArray(obj)) { - w3 = web3[obj[0]][obj[1]]; - } else { - w3 = web3[obj]; - } - - if (test.defaultOptions) { - test.defaultOptions.forEach(function(option) { - w3[option[0]] = option[1]; - }); - } - - w3[method].apply(w3, args); - } else { - if (test.defaultOptions) { - test.defaultOptions.forEach(function(option) { - w3[option[0]] = option[1]; - }); - } - - web3[method].apply(web3, args); - } - } - }); - }); - }); - }); - -}; - -module.exports = { - runTests: runTests -}; diff --git a/test/helpers/test.subscription.js b/test/helpers/test.subscription.js deleted file mode 100644 index 651a92586dc..00000000000 --- a/test/helpers/test.subscription.js +++ /dev/null @@ -1,85 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var FakeHttpProvider = require('./FakeIpcProvider'); -var Web3 = require('../../packages/web3'); - - -var runTests = function (protocol, tests) { - - describe('web3.shh.subscribe', function () { - tests.forEach(function (test, index) { - it('should create a subscription for "'+ test.args[0] +'"', function (done) { - - // given - var sub; - var provider = new FakeHttpProvider(); - var web3 = new Web3(provider); - var dataCount = 0; - var changedCount = 0; - - provider.injectResult(test.firstResult); - provider.injectResult(test.datadResult); - - provider.injectValidation(function (payload) { - - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, protocol + '_subscribe'); - assert.deepEqual(payload.params, test.firstPayload.params); - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, test.secondPayload.method); - - done(); - - }); - - // add callback - test.args.push(function(err, result) { - if (test.err) { - // TODO add subscription error check - - } else if(test.subscriptionResults) { - var subRes = test.subscriptionResults.shift(); - - assert.deepEqual(result, subRes); - } - - if(!test.subscriptionResults || !test.subscriptionResults.length) { - - if(isFinite(test.dataCount)) - assert.equal(dataCount, test.dataCount); - if(isFinite(test.changedCount)) - assert.equal(changedCount, test.changedCount); - - sub.unsubscribe(); - } - - }); - - // when - sub = web3[test.protocol].subscribe.apply(web3[test.protocol], test.args) - .on('data', function () { - dataCount++; - }) - .on('changed', function () { - changedCount++; - }); - - - // fire subscriptions - test.subscriptions.forEach(function (subscription) { - provider.injectNotification({ - method: protocol + '_subscription', - params: subscription - }); - }); - - }); - }); - }); -}; - -module.exports = { - runTests: runTests -} - diff --git a/test/helpers/test.utils.js b/test/helpers/test.utils.js deleted file mode 100644 index 67922e03aff..00000000000 --- a/test/helpers/test.utils.js +++ /dev/null @@ -1,67 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -//var web3 = require('../../index'); - -var FakeHttpProvider = require('./FakeIpcProvider'); - -var methodExists = function (object, method) { - it('should have method ' + method + ' implemented', function() { - //web3.setProvider(null); - assert.equal('function', typeof object[method], 'method ' + method + ' is not implemented'); - }); -}; - -var propertyExists = function (object, property) { - it('should have property ' + property + ' implemented', function() { - // set dummy providor, to prevent error - // web3.setProvider(new FakeHttpProvider()); - assert.notEqual('undefined', typeof object[property], 'property ' + property + ' is not implemented'); - }); -}; - -// Runs a noop transaction to move instamine forward -// Useful for confirmation handler testing. -var mine = async function(web3, account) { - await web3.eth.sendTransaction({ - from: account, - to: account, - gasPrice: '1', - gas: 4000000, - value: web3.utils.toWei('0', 'ether'), - }); -} - -// Extracts a receipt object from 1.x error message -var extractReceipt = function(message){ - const receiptString = message.split("the EVM:")[1].trim(); - return JSON.parse(receiptString); -} - -// Conditionally requires web3: -// loads web3.min when running headless browser tests, the unbuilt web3 otherwise. -var getWeb3 = function(){ - return (global.window) - ? require('../../packages/web3/dist/web3.min') - : require('../../packages/web3'); -} - -// Gets correct websocket port for client. Ganache uses 8545 for both -// http and ws. It's run in e2e.ganache.sh and for all the headless browser tests -var getWebsocketPort = function(){ - return ( process.env.GANACHE || global.window ) ? 8545 : 8546; -} - -// Delay -var waitSeconds = async function(seconds = 0){ - return new Promise(resolve => setTimeout(() => resolve(), seconds * 1000)) -} - -module.exports = { - methodExists: methodExists, - propertyExists: propertyExists, - mine: mine, - extractReceipt: extractReceipt, - getWeb3: getWeb3, - getWebsocketPort: getWebsocketPort, - waitSeconds: waitSeconds -}; diff --git a/test/httpprovider.js b/test/httpprovider.js deleted file mode 100644 index 105cb022666..00000000000 --- a/test/httpprovider.js +++ /dev/null @@ -1,82 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var http = require('http'); -var https = require('https'); -var SandboxedModule = require('sandboxed-module'); - -SandboxedModule.registerBuiltInSourceTransformer('istanbul'); -var HttpProvider = SandboxedModule.require('../packages/web3-providers-http', { - requires: { - 'xhr2-cookies': require('./helpers/FakeXHR2'), - // 'xmlhttprequest': require('./helpers/FakeXMLHttpRequest') - }, - singleOnly: true -}); - -describe('web3-providers-http', function () { - describe('prepareRequest', function () { - let provider; - let result; - let options; - let agent; - - it('should set request header', function () { - provider = new HttpProvider('http://localhost:8545', {headers: [{name: 'Access-Control-Allow-Origin', value: '*'}]}); - result = provider._prepareRequest(); - - assert.equal(typeof result, 'object'); - assert.equal(result.headers['Access-Control-Allow-Origin'], '*'); - }); - - it('should use the passed custom http agent', function () { - agent = new http.Agent(); - options = {agent: {http: agent}}; - provider = new HttpProvider('http://localhost:8545', options); - result = provider._prepareRequest(); - - assert.equal(typeof result, 'object'); - assert.equal(result.agents.httpAgent, agent); - assert.equal(provider.httpAgent, undefined); - assert.equal(provider.httpsAgent, undefined); - assert.equal(provider.agent, options.agent); - }); - - it('should use the passed custom https agent', function () { - agent = new https.Agent(); - options = {agent: {https: agent}}; - provider = new HttpProvider('http://localhost:8545', options); - result = provider._prepareRequest(); - - assert.equal(typeof result, 'object'); - assert.equal(result.agents.httpsAgent, agent); - assert.equal(provider.httpAgent, undefined); - assert.equal(provider.httpsAgent, undefined); - assert.equal(provider.agent, options.agent); - }); - - it('should use the passed baseUrl', function () { - agent = new https.Agent(); - options = {agent: {https: agent, baseUrl: 'base'}}; - provider = new HttpProvider('http://localhost:8545', options); - result = provider._prepareRequest(); - - assert.equal(typeof result, 'object'); - assert.equal(result.agents.httpsAgent, agent); - assert.equal(result.agents.baseUrl, 'base'); - assert.equal(provider.httpAgent, undefined); - assert.equal(provider.httpsAgent, undefined); - assert.equal(provider.agent, options.agent); - }); - }); - - describe('send', function () { - it('should send basic async request', function (done) { - var provider = new HttpProvider(); - - provider.send({}, function (err, result) { - assert.equal(typeof result, 'object'); - done(); - }); - }); - }); -}); diff --git a/test/iban.createIndirect.js b/test/iban.createIndirect.js deleted file mode 100644 index b2ad45923ba..00000000000 --- a/test/iban.createIndirect.js +++ /dev/null @@ -1,21 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Iban = require('../packages/web3-eth-iban'); - -var tests = [ - { institution: 'XREG', identifier: 'GAVOFYORK', expected: 'XE81ETHXREGGAVOFYORK'} -]; - -describe('lib/web3/iban', function () { - describe('createIndirect', function () { - tests.forEach(function (test) { - it('shoud create indirect iban: ' + test.expected, function () { - assert.deepEqual(Iban.createIndirect({ - institution: test.institution, - identifier: test.identifier - }), new Iban(test.expected)); - }); - }); - }); -}); - diff --git a/test/iban.fromAddress.js b/test/iban.fromAddress.js deleted file mode 100644 index 097a5c432d3..00000000000 --- a/test/iban.fromAddress.js +++ /dev/null @@ -1,22 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Iban = require('../packages/web3-eth-iban'); - -var tests = [ - { address: '00c5496aee77c1ba1f0854206a26dda82a81d6d8', expected: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'}, - { address: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', expected: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'}, - { address: '0x11c5496aee77c1ba1f0854206a26dda82a81d6d8', expected: 'XE1222Q908LN1QBBU6XUQSO1OHWJIOS46OO'}, - { address: '0x52dc504a422f0e2a9e7632a34a50f1a82f8224c7', expected: 'XE499OG1EH8ZZI0KXC6N83EKGT1BM97P2O7'}, - { address: '0x0000a5327eab78357cbf2ae8f3d49fd9d90c7d22', expected: 'XE0600DQK33XDTYUCRI0KYM5ELAKXDWWF6'} -]; - -describe('lib/web3/iban', function () { - describe('fromAddress', function () { - tests.forEach(function (test) { - it('shoud create indirect iban: ' + test.expected, function () { - assert.deepEqual(Iban.fromAddress(test.address), new Iban(test.expected)); - }); - }); - }); -}); - diff --git a/test/iban.isValid.js b/test/iban.isValid.js deleted file mode 100644 index 5141eab1e34..00000000000 --- a/test/iban.isValid.js +++ /dev/null @@ -1,35 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Iban = require('../packages/web3-eth-iban'); - -var tests = [ - { obj: function () {}, is: false}, - { obj: new Function(), is: false}, - { obj: 'function', is: false}, - { obj: {}, is: false}, - { obj: '[]', is: false}, - { obj: '[1, 2]', is: false}, - { obj: '{}', is: false}, - { obj: '{"a": 123, "b" :3,}', is: false}, - { obj: '{"c" : 2}', is: false}, - { obj: 'XE81ETHXREGGAVOFYORK', is: true}, - { obj: 'XE82ETHXREGGAVOFYORK', is: false}, // control number is invalid - { obj: 'XE81ETCXREGGAVOFYORK', is: false}, - { obj: 'XE81ETHXREGGAVOFYORKD', is: false}, - { obj: 'XE81ETHXREGGaVOFYORK', is: false}, - { obj: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', is: true}, - { obj: 'XE7438O073KYGTWWZN0F2WZ0R8PX5ZPPZS', is: false}, // control number is invalid - { obj: 'XD7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', is: false}, - { obj: 'XE1222Q908LN1QBBU6XUQSO1OHWJIOS46OO', is: true} -]; - -describe('lib/web3/iban', function () { - describe('isValid', function () { - tests.forEach(function (test) { - it('shoud test if value ' + test.obj + ' is iban: ' + test.is, function () { - assert.equal(Iban.isValid(test.obj), test.is); - }); - }); - }); -}); - diff --git a/test/iban.toAddress.js b/test/iban.toAddress.js deleted file mode 100644 index db7208f52c0..00000000000 --- a/test/iban.toAddress.js +++ /dev/null @@ -1,26 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Iban = require('../packages/web3-eth-iban'); - -var tests = [ - { direct: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', address: '0x00c5496aEe77C1bA1f0854206A26DdA82a81D6D8'} -]; - -describe('lib/web3/iban', function () { - describe('Iban.toAddress()', function () { - tests.forEach(function (test) { - it('shoud transform iban to address: ' + test.address, function () { - assert.deepEqual(Iban.toAddress(test.direct), test.address); - }); - }); - }); - describe('iban instance address()', function () { - tests.forEach(function (test) { - it('shoud transform iban to address: ' + test.address, function () { - var iban = new Iban(test.direct); - assert.deepEqual(iban.toAddress(), test.address); - }); - }); - }); -}); - diff --git a/test/iban.toIban.js b/test/iban.toIban.js deleted file mode 100644 index 86c432ce8c3..00000000000 --- a/test/iban.toIban.js +++ /dev/null @@ -1,22 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Iban = require('../packages/web3-eth-iban'); - -var tests = [ - { address: '00c5496aee77c1ba1f0854206a26dda82a81d6d8', expected: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'}, - { address: '0x00c5496aee77c1ba1f0854206a26dda82a81d6d8', expected: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS'}, - { address: '0x11c5496aee77c1ba1f0854206a26dda82a81d6d8', expected: 'XE1222Q908LN1QBBU6XUQSO1OHWJIOS46OO'}, - { address: '0x52dc504a422f0e2a9e7632a34a50f1a82f8224c7', expected: 'XE499OG1EH8ZZI0KXC6N83EKGT1BM97P2O7'}, - { address: '0x0000a5327eab78357cbf2ae8f3d49fd9d90c7d22', expected: 'XE0600DQK33XDTYUCRI0KYM5ELAKXDWWF6'} -]; - -describe('lib/web3/iban', function () { - describe('fromAddress', function () { - tests.forEach(function (test) { - it('shoud create indirect iban: ' + test.expected, function () { - assert.deepEqual(Iban.toIban(test.address), test.expected); - }); - }); - }); -}); - diff --git a/test/ipcprovider.js b/test/ipcprovider.js deleted file mode 100644 index 93551b6f75c..00000000000 --- a/test/ipcprovider.js +++ /dev/null @@ -1,53 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var SandboxedModule = require('sandboxed-module'); - -var FakeIpcRequest = require('./helpers/FakeIpcRequest') -var net = new FakeIpcRequest(); - -SandboxedModule.registerBuiltInSourceTransformer('istanbul'); -var IpcProvider = SandboxedModule.require('../packages/web3-providers-ipc', { - requires: { - 'bn.js': require('bn.js'), - }, - singleOnly: true -}); - -describe('web3-providers-ipc', function () { - - // oboe.js DOESNT WORK with FakeIpcProvider - // describe('send', function () { - // it('should send basic async request', function (done) { - // var provider = new IpcProvider('', net); - // provider.send({id: 1, method: 'eth_test'}, function (err, result) { - // assert.isObject(result); - // done(); - // }); - // }); - // }); - - // describe('isConnected', function () { - // it('should return a boolean', function () { - // var provider = new IpcProvider('', net); - // - // assert.isBoolean(provider.isConnected()); - // }); - // - // it('should return false', function () { - // var provider = new IpcProvider('', net); - // - // provider.connection.writable = false; - // - // assert.isFalse(provider.isConnected()); - // }); - // - // it('should return true, when a net handle is set', function () { - // var provider = new IpcProvider('', net); - // - // provider.connection.writable = true; - // - // assert.isTrue(provider.isConnected()); - // }); - // }); -}); - diff --git a/test/jsonrpc.id.js b/test/jsonrpc.id.js deleted file mode 100644 index 74399fac64e..00000000000 --- a/test/jsonrpc.id.js +++ /dev/null @@ -1,21 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Jsonrpc = require('../packages/web3-core-requestmanager/src/jsonrpc'); - -describe('lib/web3/jsonrpc', function () { - describe('id', function () { - it('should increment the id', function () { - - // given - var method = 'm'; - - // when - var p1 = Jsonrpc.toPayload(method); - var p2 = Jsonrpc.toPayload(method); - - // then - assert.equal(p2.id, p1.id + 1); - }); - }); -}); - diff --git a/test/jsonrpc.isValidResponse.js b/test/jsonrpc.isValidResponse.js deleted file mode 100644 index 713440cb92c..00000000000 --- a/test/jsonrpc.isValidResponse.js +++ /dev/null @@ -1,159 +0,0 @@ -var assert = require('assert'); -var Jsonrpc = require('../packages/web3-core-requestmanager/src/jsonrpc'); - -describe('jsonrpc', function () { - describe('isValidResponse', function () { - it('should validate basic jsonrpc response', function () { - - // given - var response = { - jsonrpc: '2.0', - id: 1, - result: [] - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, true); - }); - - it('should validate basic undefined response', function () { - - // given - var response = undefined; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, false); - }); - - it('should validate jsonrpc response without jsonrpc field', function () { - - // given - var response = { - id: 1, - result: [] - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, false); - }); - - it('should validate jsonrpc response with wrong jsonrpc version', function () { - - // given - var response = { - jsonrpc: '1.0', - id: 1, - result: [] - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, false); - }); - - it('should validate jsonrpc response without id number', function () { - - // given - var response = { - jsonrpc: '2.0', - result: [] - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, false); - }); - - it('should validate jsonrpc response with string id field', function () { - - // given - var response = { - jsonrpc: '2.0', - id: 'x', - result: [] - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, true); - }); - - it('should validate jsonrpc response with string id field but as number', function () { - - // given - var response = { - jsonrpc: '2.0', - id: '23', - result: [] - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, true); - }); - - it('should validate jsonrpc response without result field', function () { - - // given - var response = { - jsonrpc: '2.0', - id: 1 - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, false); - }); - - it('should validate jsonrpc response with result field === false', function () { - - // given - var response = { - jsonrpc: '2.0', - id: 1, - result: false - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, true); - }); - - it('should validate jsonrpc response with result field === 0', function () { - - // given - var response = { - jsonrpc: '2.0', - id: 1, - result: 0 - }; - - // when - var valid = Jsonrpc.isValidResponse(response); - - // then - assert.equal(valid, true); - }); - }); -}); diff --git a/test/jsonrpc.toBatchPayload.js b/test/jsonrpc.toBatchPayload.js deleted file mode 100644 index 04aef2003c5..00000000000 --- a/test/jsonrpc.toBatchPayload.js +++ /dev/null @@ -1,47 +0,0 @@ -var assert = require('assert'); -var Jsonrpc = require('../packages/web3-core-requestmanager/src/jsonrpc'); - -describe('jsonrpc', function () { - describe('toBatchPayload', function () { - it('should create basic batch payload', function () { - - // given - var messages = [{ - method: 'helloworld' - }, { - method: 'test2', - params: [1] - }]; - - // when - var payload = Jsonrpc.toBatchPayload(messages); - - // then - assert.equal(Array.isArray(payload), true); - assert.equal(payload.length, 2); - assert.equal(payload[0].jsonrpc, '2.0'); - assert.equal(payload[1].jsonrpc, '2.0'); - assert.equal(payload[0].method, 'helloworld'); - assert.equal(payload[1].method, 'test2'); - assert.equal(Array.isArray(payload[0].params), true); - assert.equal(payload[1].params.length, 1); - assert.equal(payload[1].params[0], 1); - assert.equal(typeof payload[0].id, 'number'); - assert.equal(typeof payload[1].id, 'number'); - assert.equal(payload[0].id + 1, payload[1].id); - }); - - it('should create batch payload for empty input array', function () { - - // given - var messages = []; - - // when - var payload = Jsonrpc.toBatchPayload(messages); - - // then - assert.equal(Array.isArray(payload), true); - assert.equal(payload.length, 0); - }); - }); -}); diff --git a/test/jsonrpc.toPayload.js b/test/jsonrpc.toPayload.js deleted file mode 100644 index cc8359ba5ad..00000000000 --- a/test/jsonrpc.toPayload.js +++ /dev/null @@ -1,41 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Jsonrpc = require('../packages/web3-core-requestmanager/src/jsonrpc'); - -describe('jsonrpc', function () { - describe('toPayload', function () { - it('should create basic payload', function () { - - // given - var method = 'helloworld'; - - // when - var payload = Jsonrpc.toPayload(method); - - // then - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, method); - assert.equal(Array.isArray(payload.params), true); - assert.equal(payload.params.length, 0); - assert.equal(typeof payload.id, 'number'); - }); - - it('should create payload with params', function () { - - // given - var method = 'helloworld1'; - var params = [123, 'test']; - - // when - var payload = Jsonrpc.toPayload(method, params); - - // then - assert.equal(payload.jsonrpc, '2.0'); - assert.equal(payload.method, method); - assert.equal(payload.params.length, 2); - assert.equal(payload.params[0], params[0]); - assert.equal(payload.params[1], params[1]); - assert.equal(typeof payload.id, 'number'); - }); - }); -}); diff --git a/test/method.buildCall.js b/test/method.buildCall.js deleted file mode 100644 index f3b769117eb..00000000000 --- a/test/method.buildCall.js +++ /dev/null @@ -1,1042 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var formatters = require('../packages/web3-core-helpers/src/formatters.js'); -var FakeHttpProvider = require('./helpers/FakeHttpProvider'); -var FakeIpcProvider = require('./helpers/FakeIpcProvider'); -var Eth = require('../packages/web3-eth'); -var Method = require('../packages/web3-core-method'); - -var address = '0x1234567890123456789012345678901234567891'; - - -describe('lib/web3/method', function () { - describe('buildCall', function () { - it('should return a promise and resolve it', function (done) { - var provider = new FakeHttpProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'call', - call: 'eth_call', - params: 2, - inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter.bind({defaultBlock: 'latest'})] - }); - method.setRequestManager(eth._requestManager); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456' - }, "latest"]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456' - }).then(function (result) { - - assert.deepEqual(result, '0x1234567453543456321456321'); - - done(); - }); - - }); - it('should return a promise and fail it', function (done) { - var provider = new FakeHttpProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'call', - call: 'eth_call', - params: 2, - inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter.bind({defaultBlock: 'latest'})] - }); - method.setRequestManager(eth._requestManager); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456' - },"latest"]); - }); - provider.injectError({ - message: 'Wrong!', - code: 1234 - }); - - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456' - }) - .catch(function (error) { - assert.deepEqual(error, { - message: 'Wrong!', - code: 1234 - }); - - done(); - }); - - }); - - it('should return an error, if the outputFormatter returns an error', function (done) { - var provider = new FakeHttpProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'call', - call: 'eth_call', - params: 2, - inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter.bind({defaultBlock: 'latest'})], - outputFormatter: function (result) { - return new Error('Error!'); - } - }); - method.setRequestManager(eth._requestManager); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456' - }, "latest"]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456' - }, function (err, result) { - - assert.isTrue(err instanceof Error); - assert.isUndefined(result); - - done(); - }); - - }); - - it('should return an error, if the outputFormatter throws', function (done) { - var provider = new FakeHttpProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'call', - call: 'eth_call', - params: 2, - inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter.bind({defaultBlock: 'latest'})], - outputFormatter: function (result) { - throw new Error('Error!'); - } - }); - method.setRequestManager(eth._requestManager); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_call'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456' - }, "latest"]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456' - }, function (err, result) { - - assert.isTrue(err instanceof Error); - assert.isUndefined(result); - - done(); - }); - - }); - - it('should fill in gasPrice if not given', function (done) { - var provider = new FakeHttpProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_gasPrice'); - assert.deepEqual(payload.params, []); - }); - provider.injectResult('0xffffdddd'); // gas price - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456', - gasPrice: '0xffffdddd' - }]); - - done(); - - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456' - }); - - }); - - var succeedOnReceipt = function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - value: '0xa', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); // subscription id - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - // receipt - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - provider.injectResult({ - contractAddress: address, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xafff', - gasUsed: '0x0' - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_unsubscribe'); - assert.deepEqual(payload.params, ['0x1234567']); - }); - provider.injectResult(true); // unsubscribe result - - return send; - }; - - it('should use promise "then" when subscribing and checking for receipt if "sendTransaction"', function (done) { - - var send = succeedOnReceipt(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '0xa', - gasPrice: '23435234234' - }).then(function (result) { - - - assert.deepEqual(result, { - contractAddress: address, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xafff', - gasUsed: 0 - }); - - done(); - }); - - }); - it('should use on("receipt", ...) when subscribing and checking for receipt if "sendTransaction"', function (done) { - - var send = succeedOnReceipt(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '0xa', - gasPrice: '23435234234' - }).on('receipt', function (result) { - - - assert.deepEqual(result, { - contractAddress: address, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xafff', - gasUsed: 0 - }); - - done(); - }); - - }); - - - var succeedwhenDeploying = function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager); // second parameter accounts - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); // subscription id - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - // receipt - provider.injectResult({ - contractAddress: address, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xafff', - gasUsed: '0x0' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getCode'); - assert.deepEqual(payload.params, [address, 'latest']); - }); - // code result - provider.injectResult('0x321'); - - return send; - }; - - it('should use promise "then" when subscribing and checking for receipt and code if "sendTransaction" deploying contract', function (done) { - - var send = succeedwhenDeploying(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).then(function (result) { - - assert.deepEqual(result, { - contractAddress: address, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xafff', - gasUsed: 0 - }); - - done(); - }); - - }); - - it('should use on("receipt", ...) when subscribing and checking for receipt and code if "sendTransaction" deploying contract', function (done) { - - var send = succeedwhenDeploying(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).on('receipt', function (result) { - - assert.deepEqual(result, { - contractAddress: address, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xafff', - gasUsed: 0 - }); - - done(); - }); - - }); - - var failOnCodeEmpty = function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); // subscription id - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - // receipt - provider.injectResult({ - contractAddress: address, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xafff', - gasUsed: '0x0' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getCode'); - assert.deepEqual(payload.params, [address, 'latest']); - }); - // code result - provider.injectResult('0x'); - - return send; - }; - - it('should fail on promise when subscribing and check for receipt and code if "sendTransaction" and deploying contract: error if code is empty', function (done) { - - var send = failOnCodeEmpty(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).catch(function (error) { - assert.instanceOf(error, Error); - done(); - }); - - }); - - it('should fail with on("error", ...) when subscribing and check for receipt and code if "sendTransaction" and deploying contract: error if code is empty', function (done) { - - var send = failOnCodeEmpty(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).on('error', function (error) { - assert.instanceOf(error, Error); - done(); - }); - - }); - - var failOnMissingAddress = function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); // subscription id - - // fake newBlock - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - // receipt - provider.injectResult({ - contractAddress: null, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xafff', - gasUsed: '0x0' - }); - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_unsubscribe'); - assert.deepEqual(payload.params, ['0x1234567']); - }); - // code result - provider.injectResult(true); - - return send; - }; - - it('should fail on promise when subscribing and check for receipt and code if "sendTransaction" and deploying contract: error if receipt has no contract address', function (done) { - var send = failOnMissingAddress(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).catch(function (error) { - assert.instanceOf(error, Error); - done(); - }); - - }); - it('should fail with on("error", ...) when subscribing and check for receipt and code if "sendTransaction" and deploying contract: error if receipt has no contract address', function (done) { - var send = failOnMissingAddress(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).on('error', function (error) { - assert.instanceOf(error, Error); - }).catch(function (error) { - // also run catch! - assert.instanceOf(error, Error); - done(); - }); - - }); - - var failOnTimeout = function () { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - data: '0xa123456', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); // subscription id - - // fire 50 fake newBlocks - for (i = 0; i < 51; i++) { - setTimeout(function () { - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - },i); - - // receipt - provider.injectResult(null); - } - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - - return send; - - }; - - it('should fail with promise when subscribing and check for receipt and code if "sendTransaction" and deploying contract: if not receipt after 50 blocks', function (done) { - var send = failOnTimeout(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).catch(function (error) { - assert.instanceOf(error, Error); - done(); - }); - }); - it('should fail with on("error", ...) when subscribing and check for receipt and code if "sendTransaction" and deploying contract: if not receipt after 50 blocks', function (done) { - var send = failOnTimeout(); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - data: '0xa123456', - gasPrice: '23435234234' - }).on('error', function (error) { - assert.instanceOf(error, Error); - done(); - }); - - }); - - it('should give confirmation receipts with on("confirmation", ...) when subscribing "sendTransaction"', function (done) { - var provider = new FakeIpcProvider(); - var eth = new Eth(provider); - var method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - var send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult('0x1234567'); // subscription id - - // fire 50 fake newBlocks - for (i = 0; i < 30; i++) { - - setTimeout(function () { - provider.injectNotification({ - method: 'eth_subscription', - params: { - subscription: '0x1234567', - result: { - blockNumber: '0x10' - } - } - }); - }, i); - - // receipt - provider.injectResult({ - contractAddress: null, - cumulativeGasUsed: '0xa', - transactionIndex: '0x3', - blockNumber: '0xa', - blockHash: '0xafff', - gasUsed: '0x0' - }); - } - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - - - var countConf = 0; - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - gasPrice: '23435234234' - }) - .on('transactionHash', function(result){ - assert.deepEqual(result, '0x1234567453543456321456321'); - }) - .on('receipt', function(result){ - - assert.deepEqual(result, { - contractAddress: null, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xafff', - gasUsed: 0 - }); - - }) - .on('confirmation', function (conf, receipt) { - - assert.deepEqual(receipt, { - contractAddress: null, - cumulativeGasUsed: 10, - transactionIndex: 3, - blockNumber: 10, - blockHash: '0xafff', - gasUsed: 0 - }); - - assert.deepEqual(conf, countConf); - - countConf++; - - if(conf === 12) { - done(); - } - }); - - }); - - it('should subscribe to new blocks if using IpcProvider', function (done) { - const provider = new FakeIpcProvider(); - const eth = new Eth(provider); - - const method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - const send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - value: '0xa', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - // here is the check. - // will be `eth_subscribe` if subscribing. - // will be `eth_getTransactionReceipt` if polling. - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - done(); - }); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '0xa', - gasPrice: '23435234234' - }) - }); - - it('should use polling if using HttpProvider', function (done) { - const provider = new FakeHttpProvider(); - const eth = new Eth(provider); - - const method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - const send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - value: '0xa', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - // here is the check. - // will be `eth_subscribe` if subscribing. - // will be `eth_getTransactionReceipt` if polling. - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - done(); - }); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '0xa', - gasPrice: '23435234234' - }) - }); - - it('should use polling if using provider with method `on` but no subscription capabilities', function (done) { - this.timeout(5000); - - const provider = new FakeHttpProvider(); - // provider with method 'on' but no subscription capabilities should use polling - provider.on = (...args) => {} - const eth = new Eth(provider); - - const method = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - method.setRequestManager(eth._requestManager, eth); - - // generate send function - const send = method.buildCall(); - - // add results - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_sendTransaction'); - assert.deepEqual(payload.params, [{ - from: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - to: '0x11f4d0a3c12e86b4b5f39b213f7e19d048276dae', - value: '0xa', - gasPrice: "0x574d94bba" - }]); - }); - provider.injectResult('0x1234567453543456321456321'); // tx hash - - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - provider.injectResult(null); - - provider.injectValidation(function (payload) { - // here is the check. - // first will try subscribing with `eth_subscribe`. - assert.equal(payload.method, 'eth_subscribe'); - assert.deepEqual(payload.params, ['newHeads']); - }); - provider.injectResult(null); - - // after failing with `eth_subscribe`, - // it should start polling with `eth_getTransactionReceipt` - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - provider.injectResult(null); - - // second poll - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - }); - provider.injectResult(null); - - // third poll - provider.injectValidation(function (payload) { - assert.equal(payload.method, 'eth_getTransactionReceipt'); - assert.deepEqual(payload.params, ['0x1234567453543456321456321']); - done(); - }); - provider.injectResult(null); - - send({ - from: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - to: '0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe', - value: '0xa', - gasPrice: '23435234234' - }) - }); - }); -}); - diff --git a/test/method.extractCallback.js b/test/method.extractCallback.js deleted file mode 100644 index e95759c3254..00000000000 --- a/test/method.extractCallback.js +++ /dev/null @@ -1,52 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Method = require('../packages/web3-core-method'); - -describe('lib/web3/method', function () { - describe('extractCallback', function () { - it('should extract callback', function () { - - // given - var method = new Method({name: 'something', call: 'eth_something'}); - var callback = function () { }; - var args = [1, callback] - - // when - var result = method.extractCallback(args); - - // then - assert.equal(args.length, 1); - assert.equal(callback, result); - }); - - it('should extract callback created using newFunction', function () { - - // given - var method = new Method({name: 'something', call: 'eth_something'}); - var callback = new Function (); - var args = [1, callback] - - // when - var result = method.extractCallback(args); - - // then - assert.equal(args.length, 1); - assert.equal(callback, result); - }); - - it('should not extract the callback', function () { - - // given - var method = new Method({name: 'something', call: 'eth_something'}); - var args = [1, 2] - - // when - var result = method.extractCallback(args); - - // then - assert.equal(args.length, 2); - assert.equal(result, null); - }); - }); -}); - diff --git a/test/method.formatInput.js b/test/method.formatInput.js deleted file mode 100644 index 2f11623d8f4..00000000000 --- a/test/method.formatInput.js +++ /dev/null @@ -1,42 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Method = require('../packages/web3-core-method'); - -describe('lib/web3/method', function () { - describe('formatInput', function () { - it('should format plain input', function () { - - // given - var star = function (arg) { - return arg + '*'; - }; - - var method = new Method({ - name: 'something', call: 'eth_something', - inputFormatter: [star, star, star] - }); - var args = ['1','2','3']; - var expectedArgs = ['1*', '2*', '3*']; - - // when - var result = method.formatInput(args); - - // then - assert.deepEqual(result, expectedArgs); - }); - - it('should do nothing if there is no formatter', function () { - - // given - var method = new Method({name: 'something', call: 'eth_something'}); - var args = [1,2,3]; - - // when - var result = method.formatInput(args); - - // then - assert.deepEqual(result, args); - }); - }); -}); - diff --git a/test/method.formatOutput.js b/test/method.formatOutput.js deleted file mode 100644 index ca55c1370f1..00000000000 --- a/test/method.formatOutput.js +++ /dev/null @@ -1,84 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Method = require('../packages/web3-core-method'); - -describe('lib/web3/method', function () { - describe('formatOutput', function () { - it('should format plain output', function () { - - // given - var formatter = function (arg) { - return arg + '*'; - }; - - var method = new Method({ - name: 'something', call: 'eth_something', - outputFormatter: formatter - }); - var args = '1'; - var expectedArgs = '1*'; - - // when - var result = method.formatOutput(args); - - // then - assert.deepEqual(result, expectedArgs); - }); - - it('should format plain output if array', function () { - - // given - var formatter = function (arg) { - return arg + '*'; - }; - - var method = new Method({ - name: 'something', call: 'eth_something', - outputFormatter: formatter - }); - var args = '1'; - var expectedArgs = ['1*', '1*']; - - // when - var result = method.formatOutput([args, args]); - - // then - assert.deepEqual(result, expectedArgs); - }); - - it('should format output arrays with the same formatter', function () { - - // given - var formatter = function (arg) { - return arg + '*'; - }; - - var method = new Method({ - name: 'something', call: 'eth_something', - outputFormatter: formatter - }); - var args = ['1','2','3']; - var expectedArgs = ['1*', '2*', '3*']; - - // when - var result = method.formatOutput(args); - - // then - assert.deepEqual(result, expectedArgs); - }); - - it('should do nothing if there is no formatter', function () { - - // given - var method = new Method({name: 'something', call: 'eth_something'}); - var args = [1,2,3]; - - // when - var result = method.formatOutput(args); - - // then - assert.deepEqual(result, args); - }); - }); -}); - diff --git a/test/method.getCall.js b/test/method.getCall.js deleted file mode 100644 index 41413bb6f69..00000000000 --- a/test/method.getCall.js +++ /dev/null @@ -1,48 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Method = require('../packages/web3-core-method'); - -describe('lib/web3/method', function () { - describe('getCall', function () { - it('should return call name', function () { - - // given - var call = 'hello_call_world'; - var method = new Method({ - name: 'something', - call: call - }); - - // when - var result = method.getCall(); - - // then - assert.equal(call, result); - }); - - it('should return call based on args', function () { - - // given - var call = function (args) { - return args ? args.length.toString() : '0'; - }; - - var method = new Method({ - name: 'something', - call: call - }); - - // when - var r0 = method.getCall(); - var r1 = method.getCall([1]); - var r2 = method.getCall([1, 2]); - - // then - assert.equal(r0, '0'); - assert.equal(r1, '1'); - assert.equal(r2, '2'); - - }); - }); -}); - diff --git a/test/method.validateArgs.js b/test/method.validateArgs.js deleted file mode 100644 index df9cfed75d3..00000000000 --- a/test/method.validateArgs.js +++ /dev/null @@ -1,49 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var Method = require('../packages/web3-core-method'); -var errors = require('../packages/web3-core-helpers/src/errors'); - -describe('lib/web3/method', function () { - describe('validateArgs', function () { - it('should pass', function () { - - // given - var method = new Method({ - name: 'something', call: 'eth_something', - params: 1 - }); - - var args = [1]; - var args2 = ['heloas']; - - // when - var test = function () { method.validateArgs(args); }; - var test2 = function () { method.validateArgs(args2); }; - - // then - assert.doesNotThrow(test); - assert.doesNotThrow(test2); - }); - - it('should return call based on args', function () { - - // given - var method = new Method({ - name: 'something', - call: 'eth_something', - params: 2 - }); - - var args = [1]; - var args2 = ['heloas', '12', 3]; - - // when - var test = function () { method.validateArgs(args); }; - var test2 = function () { method.validateArgs(args2); }; - - // then - assert.throws(test, errors.InvalidNumberOfParams(1, 2, 'something').message); - assert.throws(test2, errors.InvalidNumberOfParams(3, 2, 'something').message); - }); - }); -}); diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index ff593c4d252..00000000000 --- a/test/mocha.opts +++ /dev/null @@ -1 +0,0 @@ ---reporter dot diff --git a/test/personal.getAccounts.js b/test/personal.getAccounts.js deleted file mode 100644 index 7f342fba133..00000000000 --- a/test/personal.getAccounts.js +++ /dev/null @@ -1,12 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'getAccounts'; - - -var tests = [{ - result: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - formattedResult: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855'], // checksum address - call: 'personal_listAccounts' -}]; - -testMethod.runTests(['eth','personal'], method, tests); diff --git a/test/personal.lockAccount.js b/test/personal.lockAccount.js deleted file mode 100644 index 14b838c0f4f..00000000000 --- a/test/personal.lockAccount.js +++ /dev/null @@ -1,20 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'lockAccount'; - - -var tests = [{ - args: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855'], // checksum address - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - result: true, - formattedResult: true, - call: 'personal_'+ method -},{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - result: true, - formattedResult: true, - call: 'personal_'+ method -}]; - -testMethod.runTests(['eth','personal'], method, tests); diff --git a/test/personal.newAccount.js b/test/personal.newAccount.js deleted file mode 100644 index f7cbac3d6e4..00000000000 --- a/test/personal.newAccount.js +++ /dev/null @@ -1,15 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'newAccount'; - - -var tests = [{ - args: ['P@ssw0rd!'], - formattedArgs: ['P@ssw0rd!'], - result: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855'], - formattedResult: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855'], // checksum address - call: 'personal_newAccount' -}]; - -testMethod.runTests(['eth','personal'], method, tests); - diff --git a/test/personal.sendTransaction.js b/test/personal.sendTransaction.js deleted file mode 100644 index 7f2a3494bfe..00000000000 --- a/test/personal.sendTransaction.js +++ /dev/null @@ -1,88 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'sendTransaction'; - - -var tests = [{ - args: [{ - from: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', // checksum address - to: '0xdbdbdB2cBD23b783741e8d7fcF51e459b497e4a6', // checksum address - value: '1234567654321', - gasPrice: '324234234234' - }, 'SomePass@Word!'], - formattedArgs: [{ - from: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - gasPrice: '0x4b7dddc97a' - }, 'SomePass@Word!'], - result: '0xfff12345678976543213456786543212345675432', - formattedResult: '0xfff12345678976543213456786543212345675432', - // notification: { - // method: 'eth_subscription', - // params: { - // subscription: '0x1234567', - // result: '0x9ce59a13059e417087c02d3236a0b1cc' - // } - // }, - call: 'personal_'+ method -},{ - args: [{ - from: '0XDBDBDB2CBD23B783741E8D7FCF51E459B497E4A6', - to: '0XDBDBDB2CBD23B783741E8D7FCF51E459B497E4A6', - value: '1234567654321', - data: '0x213453ffffff', - gasPrice: '324234234234' - }, 'SomePass@Word!'], - formattedArgs: [{ - from: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - data: '0x213453ffffff', - gasPrice: '0x4b7dddc97a' - }, 'SomePass@Word!'], - result: '0x12345678976543213456786543212345675432', - formattedResult: '0x12345678976543213456786543212345675432', - // notification: { - // method: 'eth_subscription', - // params: { - // subscription: '0x1234567', - // result: '0x9ce59a13059e417087c02d3236a0b1cc' - // } - // }, - call: 'personal_'+ method -},{ - args: [{ - from: 'XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS', // iban address - to: '0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', - value: '1234567654321', - gasPrice: '324234234234' - }, 'SomePass@Word!'], - formattedArgs: [{ - from: "0x00c5496aee77c1ba1f0854206a26dda82a81d6d8", - to: "0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6", - value: "0x11f71f76bb1", - gasPrice: '0x4b7dddc97a' - }, 'SomePass@Word!'], - result: '0x12345678976543213456786543212345675432', - formattedResult: '0x12345678976543213456786543212345675432', - // notification: { - // method: 'eth_subscription', - // params: { - // subscription: '0x1234567', - // result: '0x9ce59a13059e417087c02d3236a0b1cc' - // } - // }, - call: 'personal_'+ method -},{ - error: true, // only for testing - args: [{ - from: 'XE81ETHXREGGAVOFYORK', // iban address - to: '0xdbdbdb2cbd23b783741e8d7fcf51e459b497e4a6', - value: '1234567654321' - }, 'SomePass@Word!'], - call: 'personal_'+ method -}]; - -testMethod.runTests(['eth','personal'], method, tests); - diff --git a/test/personal.unlockAccount.js b/test/personal.unlockAccount.js deleted file mode 100644 index 0bbdf85420c..00000000000 --- a/test/personal.unlockAccount.js +++ /dev/null @@ -1,20 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); - -var method = 'unlockAccount'; - - -var tests = [{ - args: ['0x47D33b27Bb249a2DBab4C0612BF9CaF4C1950855', 'P@ssw0rd!'], // checksum address - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', 'P@ssw0rd!', null], - result: true, - formattedResult: true, - call: 'personal_'+ method -},{ - args: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', 'P@ssw0rd!', 10], - formattedArgs: ['0x47d33b27bb249a2dbab4c0612bf9caf4c1950855', 'P@ssw0rd!', 10], - result: true, - formattedResult: true, - call: 'personal_'+ method -}]; - -testMethod.runTests(['eth','personal'], method, tests); diff --git a/test/personal_methods.js b/test/personal_methods.js deleted file mode 100644 index 7fb7258a5bc..00000000000 --- a/test/personal_methods.js +++ /dev/null @@ -1,20 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var u = require('./helpers/test.utils.js'); -var Personal = require('../packages/web3-eth-personal'); -var personal = new Personal(); - -describe('web3.net', function() { - describe('methods', function() { - u.methodExists(personal, 'getAccounts'); - u.methodExists(personal, 'newAccount'); - u.methodExists(personal, 'unlockAccount'); - u.methodExists(personal, 'lockAccount'); - u.methodExists(personal, 'sendTransaction'); - - u.propertyExists(personal, 'net'); - u.methodExists(personal.net, 'getId'); - u.methodExists(personal.net, 'isListening'); - u.methodExists(personal.net, 'getPeerCount'); - }); -}); diff --git a/test/provider.js b/test/provider.js deleted file mode 100644 index 4badfb4ae55..00000000000 --- a/test/provider.js +++ /dev/null @@ -1,175 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var net = require('net'); - -var Eth = require('../packages/web3-eth'); -var Shh = require('../packages/web3-shh'); -var Net = require('../packages/web3-net'); -var Web3 = require('../packages/web3'); - - -var tests = [{ - providerParams: ['http://localhost:8545'], - providerType: 'HttpProvider', - package: Web3 -},{ - providerParams: ['HTTP://localhost:8545'], - providerType: 'HttpProvider', - package: Web3 -},{ - providerParams: ['ws://localhost:8546'], - providerType: 'WebsocketProvider', - package: Web3 -},{ - providerParams: ['WS://localhost:8546'], - providerType: 'WebsocketProvider', - package: Web3 -},{ - providerParams: ['wss://user1:passw0rd@localhost:8546'], - providerType: 'WebsocketProvider', - package: Web3 -},{ - providerParams: ['/.ethereum/my/path/geth.ipc', net], - providerType: 'IpcProvider', - package: Web3 -},{ - providerParams: ['\\\\.\\pipe\\geth.ipc', net], - providerType: 'IpcProvider', - package: Web3 -},{ - providerParams: ['://hello.com:1234'], - package: Web3, - error: true -}, - - { - providerParams: ['http://localhost:8545'], - providerType: 'HttpProvider', - package: Net - },{ - providerParams: ['HTTP://localhost:8545'], - providerType: 'HttpProvider', - package: Net - },{ - providerParams: ['ws://localhost:8546'], - providerType: 'WebsocketProvider', - package: Net - },{ - providerParams: ['WS://localhost:8546'], - providerType: 'WebsocketProvider', - package: Net - },{ - providerParams: ['/.ethereum/my/path/geth.ipc', net], - providerType: 'IpcProvider', - package: Net - },{ - providerParams: ['\\\\.\\pipe\\geth.ipc', net], - providerType: 'IpcProvider', - package: Net - },{ - providerParams: ['://hello.com:1234'], - package: Net, - error: true - }, - - { - providerParams: ['http://localhost:8545'], - providerType: 'HttpProvider', - package: Shh - },{ - providerParams: ['HTTP://localhost:8545'], - providerType: 'HttpProvider', - package: Shh - },{ - providerParams: ['ws://localhost:8546'], - providerType: 'WebsocketProvider', - package: Shh - },{ - providerParams: ['WS://localhost:8546'], - providerType: 'WebsocketProvider', - package: Shh - },{ - providerParams: ['/.ethereum/my/path/geth.ipc', net], - providerType: 'IpcProvider', - package: Shh - },{ - providerParams: ['\\\\.\\pipe\\geth.ipc', net], - providerType: 'IpcProvider', - package: Shh - },{ - providerParams: ['://hello.com:1234'], - package: Shh, - error: true - }, - - { - providerParams: ['http://localhost:8545'], - providerType: 'HttpProvider', - package: Eth - },{ - providerParams: ['HTTP://localhost:8545'], - providerType: 'HttpProvider', - package: Eth - },{ - providerParams: ['ws://localhost:8546'], - providerType: 'WebsocketProvider', - package: Eth - },{ - providerParams: ['WS://localhost:8546'], - providerType: 'WebsocketProvider', - package: Eth - },{ - providerParams: ['/.ethereum/my/path/geth.ipc', net], - providerType: 'IpcProvider', - package: Eth - },{ - providerParams: ['\\\\.\\pipe\\geth.ipc', net], - providerType: 'IpcProvider', - package: Eth - },{ - providerParams: ['://hello.com:1234'], - package: Eth, - error: true - }]; - -describe('web3', function () { - describe('automatic provider selection', function () { - tests.forEach(function (test, index) { - - if(!test.error) { - it('initiates on package level', function () { - - var pkg = new test.package(test.providerParams[0], test.providerParams[1]); - assert.equal(pkg.currentProvider.constructor.name, test.providerType); - - }); - - it('initiates using setProvider', function () { - - var pkg = new test.package(); - assert.equal(pkg.currentProvider, null); - - pkg.setProvider.apply(pkg, test.providerParams); - assert.equal(pkg.currentProvider.constructor.name, test.providerType); - - }); - - } else { - it('can\'t autodetect the provider', function () { - - assert.throws(function(){ new test.package(test.providerParams[0]); }); - - - }); - it('can\'t autodetect the provider when using setProvider', function () { - - var pkg = new test.package(); - assert.throws(function(){ pkg.setProvider(test.providerParams[0]); }); - - - }); - } - }); - }); -}); - diff --git a/test/requestmanager.js b/test/requestmanager.js deleted file mode 100644 index 05f7cf95a5c..00000000000 --- a/test/requestmanager.js +++ /dev/null @@ -1,28 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var FakeHttpProvider = require('./helpers/FakeIpcProvider'); -var requestManager = require('../packages/web3-core-requestmanager'); - -// TODO: handling errors! -// TODO: validation of params! - -describe('lib/web3/requestmanager', function () { - describe('send', function () { - it('should return expected result asynchronously', function (done) { - var provider = new FakeHttpProvider(); - var manager = new requestManager.Manager(provider); - var expected = 'hello_world'; - provider.injectResult(expected); - - manager.send({ - method: 'test', - params: [1,2,3] - }, function (error, result) { - assert.equal(error, null); - assert.equal(expected, result); - done(); - }); - }); - }); -}); - diff --git a/test/setProvider.js b/test/setProvider.js deleted file mode 100644 index b238d8c190a..00000000000 --- a/test/setProvider.js +++ /dev/null @@ -1,245 +0,0 @@ -var FakeIpcProvider = require('./helpers/FakeIpcProvider'); -var FakeHttpProvider = require('./helpers/FakeHttpProvider'); - -// // set the etheeumProvider -// var provider1 = new FakeHttpProvider(); -// var provider2 = new FakeIpcProvider(); -// provider1.bzz = 'http://givenProvider:8500'; -// provider2.bzz = 'http://swarm-gateways.net'; -// -// if (typeof window !== 'undefined') { -// global.ethereumProvider = provider1; -// } -// if (typeof window !== 'undefined') { -// window.ethereumProvider = provider1; -// } - - -var chai = require('chai'); -var assert = chai.assert; -var Web3 = require('../packages/web3'); -var Eth = require('../packages/web3-eth'); -var Shh = require('../packages/web3-shh'); -var Personal = require('../packages/web3-eth-personal'); -var Accounts = require('../packages/web3-eth-accounts'); -var Contract = require('../packages/web3-eth-contract'); -var Net = require('../packages/web3-net'); -var Bzz = require('../packages/web3-bzz'); - - -var tests = [{ - Lib: Web3 -},{ - Lib: Eth -},{ - Lib: Shh -},{ - Lib: Personal -},{ - Lib: Net -},{ - Lib: Accounts -},{ - Lib: Bzz, - swarm: true -}]; - - - -describe('lib/web3/setProvider', function () { - it('Web3 submodules should set the provider using constructor', function () { - - var provider1 = new FakeHttpProvider(); - var provider2 = new FakeIpcProvider(); - provider1.bzz = 'http://localhost:8500'; - provider2.bzz = 'http://swarm-gateways.net'; - - var provider3 = new FakeHttpProvider(); - provider3.bzz = 'http://localhost2:8500'; - - var lib = new Web3(provider1); - var lib2 = new Web3(provider3); - - assert.equal(lib.eth.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.net.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.personal.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.Contract.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.accounts.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib.shh.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib.bzz.currentProvider, provider1.bzz); - - assert.equal(lib.eth._requestManager.provider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.net._requestManager.provider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.personal._requestManager.provider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.Contract._requestManager.provider.constructor.name, provider1.constructor.name); - assert.equal(lib.eth.accounts._requestManager.provider.constructor.name, provider1.constructor.name); - assert.equal(lib.shh._requestManager.provider.constructor.name, provider1.constructor.name); - - assert.equal(lib2.eth.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.net.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.personal.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.Contract.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.accounts.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.shh.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.bzz.currentProvider, provider3.bzz); - - assert.equal(lib2.eth._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.net._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.personal._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.Contract._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.accounts._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.shh._requestManager.provider.constructor.name, provider3.constructor.name); - - - lib.setProvider(provider2); - - assert.equal(lib.eth.currentProvider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.net.currentProvider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.personal.currentProvider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.Contract.currentProvider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.accounts.currentProvider.constructor.name, provider2.constructor.name); - assert.equal(lib.shh.currentProvider.constructor.name, provider2.constructor.name); - assert.equal(lib.bzz.currentProvider, provider2.bzz); - - assert.equal(lib.eth._requestManager.provider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.net._requestManager.provider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.personal._requestManager.provider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.Contract._requestManager.provider.constructor.name, provider2.constructor.name); - assert.equal(lib.eth.accounts._requestManager.provider.constructor.name, provider2.constructor.name); - assert.equal(lib.shh._requestManager.provider.constructor.name, provider2.constructor.name); - - assert.equal(lib2.eth.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.net.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.personal.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.Contract.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.accounts.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.shh.currentProvider.constructor.name, provider3.constructor.name); - assert.equal(lib2.bzz.currentProvider, provider3.bzz); - - assert.equal(lib2.eth._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.net._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.personal._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.Contract._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.eth.accounts._requestManager.provider.constructor.name, provider3.constructor.name); - assert.equal(lib2.shh._requestManager.provider.constructor.name, provider3.constructor.name); - - - }); - - it('Bzz should set automatically to ethereumProvider', function () { - - var provider1 = new FakeHttpProvider(); - provider1.bzz = 'http://localhost:8500'; - var provider2 = new FakeIpcProvider(); - provider2.bzz = 'http://focalhost:8500'; - - // was set in test/1_givenProvider-ethereumProvider.js - var lib = new Bzz(provider1); - - assert.equal(lib.currentProvider, provider1.bzz); - - - lib.setProvider(provider2); - - assert.equal(lib.currentProvider, provider2.bzz); - - - }); - - tests.forEach(function (test) { - it(test.Lib.name +' should set the provider using constructor', function () { - - var provider1 = new FakeHttpProvider(); - var lib; - - - if(test.swarm) { - - lib = new test.Lib('http://localhost:8500'); - - assert.equal(lib.currentProvider, 'http://localhost:8500'); - - } else { - - lib = new test.Lib(provider1); - - assert.equal(lib.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib._requestManager.provider.constructor.name, provider1.constructor.name); - } - - }); - it(test.Lib.name +' should set the provider using setProvider, after empty init', function () { - - var provider1 = new FakeHttpProvider(); - var lib = new test.Lib(); - - - - if(test.swarm) { - - assert.isNull(lib.currentProvider); - - lib.setProvider('http://localhost:8500'); - - assert.equal(lib.currentProvider, 'http://localhost:8500'); - - } else { - - assert.isNull(lib.currentProvider); - assert.isNull(lib._requestManager.provider); - - lib.setProvider(provider1); - - assert.equal(lib.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib._requestManager.provider.constructor.name, provider1.constructor.name); - } - - }); - it(test.Lib.name +' should set the provider using constructor, and change later using setProvider', function () { - - var provider1 = new FakeHttpProvider(); - var provider2 = new FakeIpcProvider(); - var swarmProvider1 = 'http://localhost:8500'; - var swarmProvider2 = 'http://swarm-gateways.net'; - - var lib; - - - if(test.swarm) { - - lib = new test.Lib(swarmProvider1); - - assert.equal(lib.currentProvider, swarmProvider1); - - lib.setProvider(swarmProvider2); - - assert.equal(lib.currentProvider, swarmProvider2); - - lib.setProvider(swarmProvider1); - - assert.equal(lib.currentProvider, swarmProvider1); - - } else { - - lib = new test.Lib(provider1); - - assert.equal(lib.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib._requestManager.provider.constructor.name, provider1.constructor.name); - - lib.setProvider(provider2); - - assert.equal(lib.currentProvider.constructor.name, provider2.constructor.name); - assert.equal(lib._requestManager.provider.constructor.name, provider2.constructor.name); - - lib.setProvider(provider1); - - assert.equal(lib.currentProvider.constructor.name, provider1.constructor.name); - assert.equal(lib._requestManager.provider.constructor.name, provider1.constructor.name); - } - - }); - }); - - -}); - diff --git a/test/shh.post.js b/test/shh.post.js deleted file mode 100644 index 5e270473305..00000000000 --- a/test/shh.post.js +++ /dev/null @@ -1,33 +0,0 @@ -var testMethod = require('./helpers/test.method.js'); -var utils = require('../packages/web3-utils'); - -var method = 'post'; - -var tests = [{ - args: [{ - symKeyID: '123123123ff', - sig: '44ffdd55', - topic: '0xffdd11', - payload: utils.numberToHex('12345'), - ttl: 100, - minPow: 0.5, - powTarget: 3, - padding: '0xffdd4455' - }], - formattedArgs: [{ - symKeyID: '123123123ff', - sig: '44ffdd55', - topic: '0xffdd11', - payload: utils.numberToHex('12345'), - ttl: 100, - minPow: 0.5, - powTarget: 3, - padding: '0xffdd4455' - }], - result: true, - formattedResult: true, - call: 'shh_'+ method -}]; - -testMethod.runTests('shh', method, tests); - diff --git a/test/shh.subscribe.js b/test/shh.subscribe.js deleted file mode 100644 index 507f74784df..00000000000 --- a/test/shh.subscribe.js +++ /dev/null @@ -1,59 +0,0 @@ -var testSubscription = require('./helpers/test.subscription.js'); - -// TODO discuss the whisper in and outputs with vlad! - -// NEW HEADS -var tests = [{ - protocol: 'shh', - args: ['messages', { - symKeyID: '0x234567432123423546532134536423134567865432', - minPow: 0.5, - topics: ['0x48656c6c','0x576f7264'], - allowP2P: false - }], - firstResult: '0x1234', - firstPayload: { - method: "shh_subscribe", - params: ['messages', { - symKeyID: '0x234567432123423546532134536423134567865432', - minPow: 0.5, - topics: ['0x48656c6c','0x576f7264'], - allowP2P: false - }] - }, - secondResult: true, - secondPayload: { - method: "shh_unsubscribe" - }, - subscriptions: [{ - subscription: '0x1234', - result: { - sig: "0x048229fb947363cf13bb9f9532e124f08840cd6287ecae6b537cda2947ec2b23dbdc3a07bdf7cd2bfb288c25c4d0d0461d91c719da736a22b7bebbcf912298d1e6", - ttl: 12, - timestamp: 1234567, - topic: "0x576f7264", - payload: "0x3456435243142fdf1d2312", - padding: "0xaaa3df1d231456435243142f456435243142f2", - pow: 0.4, - hash: "0xddaa3df1d231456435243142af45aa3df1d2314564352431426435243142f2", - recipientPublicKey: "0x04d1574d4eab8f3dde4d2dc7ed2c4d699d77cbbdd09167b8fffa0996" - } - }], - subscriptionResults: [{ - sig: "0x048229fb947363cf13bb9f9532e124f08840cd6287ecae6b537cda2947ec2b23dbdc3a07bdf7cd2bfb288c25c4d0d0461d91c719da736a22b7bebbcf912298d1e6", - ttl: 12, - timestamp: 1234567, - topic: "0x576f7264", - payload: "0x3456435243142fdf1d2312", - padding: "0xaaa3df1d231456435243142f456435243142f2", - pow: 0.4, - hash: "0xddaa3df1d231456435243142af45aa3df1d2314564352431426435243142f2", - recipientPublicKey: "0x04d1574d4eab8f3dde4d2dc7ed2c4d699d77cbbdd09167b8fffa0996" - }] -}]; - -testSubscription.runTests('shh', tests); - - - - diff --git a/test/shh_methods.js b/test/shh_methods.js deleted file mode 100644 index f8850459b13..00000000000 --- a/test/shh_methods.js +++ /dev/null @@ -1,32 +0,0 @@ -var u = require('./helpers/test.utils.js'); -var Shh = require('../packages/web3-shh'); -var shh = new Shh(); - -describe('shh', function() { - describe('methods', function() { - u.methodExists(shh, 'subscribe'); - - u.methodExists(shh, 'getVersion'); - u.methodExists(shh, 'getInfo'); - u.methodExists(shh, 'setMaxMessageSize'); - u.methodExists(shh, 'setMinPoW'); - u.methodExists(shh, 'markTrustedPeer'); - u.methodExists(shh, 'newKeyPair'); - u.methodExists(shh, 'addPrivateKey'); - u.methodExists(shh, 'deleteKeyPair'); - u.methodExists(shh, 'hasKeyPair'); - u.methodExists(shh, 'getPublicKey'); - u.methodExists(shh, 'getPrivateKey'); - u.methodExists(shh, 'newSymKey'); - u.methodExists(shh, 'addSymKey'); - u.methodExists(shh, 'generateSymKeyFromPassword'); - u.methodExists(shh, 'hasSymKey'); - u.methodExists(shh, 'getSymKey'); - u.methodExists(shh, 'deleteSymKey'); - u.methodExists(shh, 'newMessageFilter'); - u.methodExists(shh, 'getFilterMessages'); - u.methodExists(shh, 'deleteMessageFilter'); - u.methodExists(shh, 'post'); - }); -}); - diff --git a/test/sources/Basic.json b/test/sources/Basic.json deleted file mode 100644 index 14dcb5aa304..00000000000 --- a/test/sources/Basic.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "contractName": "Basic", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "val", - "type": "uint256" - } - ], - "name": "BasicEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "str", - "type": "string" - } - ], - "name": "IndexedStringEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "str", - "type": "string" - } - ], - "name": "StringEvent", - "type": "event" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "uint256", - "name": "val", - "type": "uint256" - } - ], - "name": "firesEvent", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "firesIllegalUtf8StringEvent", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "string", - "name": "_str", - "type": "string" - } - ], - "name": "firesIndexedStringEvent", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "string", - "name": "_str", - "type": "string" - } - ], - "name": "firesStringEvent", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getValue", - "outputs": [ - { - "internalType": "uint256", - "name": "val", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "requireWithReason", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "requireWithoutReason", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "reverts", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - } - ], - "name": "setValue", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b50610619806100206000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c806360fea5e41161006657806360fea5e4146100f8578063844d6a32146101b357806385693803146101bd578063ae012ede1461020b578063b7a8238a1461021557610093565b806320965255146100985780633aebabe6146100b65780633bccbbc9146100c057806355241077146100ca575b600080fd5b6100a06102d0565b6040518082815260200191505060405180910390f35b6100be6102d9565b005b6100c8610343565b005b6100f6600480360360208110156100e057600080fd5b81019080803590602001909291905050506103b1565b005b6101b16004803603602081101561010e57600080fd5b810190808035906020019064010000000081111561012b57600080fd5b82018360208201111561013d57600080fd5b8035906020019184600183028401116401000000008311171561015f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506103bb565b005b6101bb61045a565b005b610209600480360360408110156101d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506104d0565b005b610213610538565b005b6102ce6004803603602081101561022b57600080fd5b810190808035906020019064010000000081111561024857600080fd5b82018360208201111561025a57600080fd5b8035906020019184600183028401116401000000008311171561027c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610545565b005b60008054905090565b7f617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab6040518080602001828103825260158152602001807fefbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbd000000000000000000000081525060200191505060405180910390a1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f524556455254454420574954482052455645525400000000000000000000000081525060200191505060405180910390fd5b8060008190555050565b7f82dd7094dfd71d508c7a8ff013f3064664025068543bf228f7194a862cdfe3d7816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561041d578082015181840152602081019050610402565b50505050905090810190601f16801561044a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b60006104ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f524556455254454420574954482052455155495245000000000000000000000081525060200191505060405180910390fd5b565b807f929af6b98ce8455e51b1e90cceeeec03ce38d7c7396f1f0b0233d043c898a29c83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600061054357600080fd5b565b7f617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab816040518080602001828103825283818151815260200191508051906020019080838360005b838110156105a757808201518184015260208101905061058c565b50505050905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509250505060405180910390a15056fea265627a7a7231582069bac219e1bd2bb93a98f42a0d7aa83ba402f2168ab48df5ba385e348b9b3e8864736f6c634300050f0032", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100935760003560e01c806360fea5e41161006657806360fea5e4146100f8578063844d6a32146101b357806385693803146101bd578063ae012ede1461020b578063b7a8238a1461021557610093565b806320965255146100985780633aebabe6146100b65780633bccbbc9146100c057806355241077146100ca575b600080fd5b6100a06102d0565b6040518082815260200191505060405180910390f35b6100be6102d9565b005b6100c8610343565b005b6100f6600480360360208110156100e057600080fd5b81019080803590602001909291905050506103b1565b005b6101b16004803603602081101561010e57600080fd5b810190808035906020019064010000000081111561012b57600080fd5b82018360208201111561013d57600080fd5b8035906020019184600183028401116401000000008311171561015f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506103bb565b005b6101bb61045a565b005b610209600480360360408110156101d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506104d0565b005b610213610538565b005b6102ce6004803603602081101561022b57600080fd5b810190808035906020019064010000000081111561024857600080fd5b82018360208201111561025a57600080fd5b8035906020019184600183028401116401000000008311171561027c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610545565b005b60008054905090565b7f617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab6040518080602001828103825260158152602001807fefbfbdefbfbdefbfbdefbfbdefbfbdefbfbdefbfbd000000000000000000000081525060200191505060405180910390a1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f524556455254454420574954482052455645525400000000000000000000000081525060200191505060405180910390fd5b8060008190555050565b7f82dd7094dfd71d508c7a8ff013f3064664025068543bf228f7194a862cdfe3d7816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561041d578082015181840152602081019050610402565b50505050905090810190601f16801561044a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b60006104ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f524556455254454420574954482052455155495245000000000000000000000081525060200191505060405180910390fd5b565b807f929af6b98ce8455e51b1e90cceeeec03ce38d7c7396f1f0b0233d043c898a29c83604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600061054357600080fd5b565b7f617cf8a4400dd7963ed519ebe655a16e8da1282bb8fea36a21f634af912f54ab816040518080602001828103825283818151815260200191508051906020019080838360005b838110156105a757808201518184015260208101905061058c565b50505050905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509250505060405180910390a15056fea265627a7a7231582069bac219e1bd2bb93a98f42a0d7aa83ba402f2168ab48df5ba385e348b9b3e8864736f6c634300050f0032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/test/sources/Basic.sol b/test/sources/Basic.sol deleted file mode 100644 index 7d1871120c7..00000000000 --- a/test/sources/Basic.sol +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Source contract for Basic.json - */ -pragma solidity ^0.5.1; - -contract Basic { - - uint value; - event BasicEvent(address addr, uint indexed val); - event StringEvent(string str); - event IndexedStringEvent(string str); - - function getValue() public view returns (uint val) { - return value; - } - - function setValue(uint _value) public { - value = _value; - } - - function requireWithoutReason() public { - require(false); - } - - function requireWithReason() public { - require(false, 'REVERTED WITH REQUIRE'); - } - - function reverts() public { - revert('REVERTED WITH REVERT'); - } - - function firesEvent(address addr, uint val) public { - emit BasicEvent(addr, val); - } - - function firesStringEvent(string memory _str) public { - emit StringEvent(_str); - } - - function firesIndexedStringEvent(string memory _str) public { - emit IndexedStringEvent(_str); - } - - function firesIllegalUtf8StringEvent() public { - emit StringEvent('�������'); - } -} diff --git a/test/sources/Child.json b/test/sources/Child.json deleted file mode 100644 index b92d15b41f6..00000000000 --- a/test/sources/Child.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "contractName": "Child", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "childA", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "childB", - "type": "address" - } - ], - "name": "Identical", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_approved", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "_tokenId", - "type": "uint256" - } - ], - "name": "Similar", - "type": "event" - }, - { - "constant": false, - "inputs": [], - "name": "fireIdentical", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "fireSimilar", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b50610142806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806339eb06131461003b578063e62f414814610045575b600080fd5b61004361004f565b005b61004d6100ad565b005b600073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f9b0c381f66eebc6aa094560f95fd7139c7d4e8c57ef35970d31529af03897b8960405160405180910390a3565b6001600073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb2cae8315bd3bec790522b2d91759938a5db9279c1ffabbc6a7d3575466245d160405160405180910390a456fea265627a7a7231582033099c95ce3ccb847b6cb79edc99bc8b6b78d98245a78a0dc5ae3c32796c54bf64736f6c634300050f0032", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806339eb06131461003b578063e62f414814610045575b600080fd5b61004361004f565b005b61004d6100ad565b005b600073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f9b0c381f66eebc6aa094560f95fd7139c7d4e8c57ef35970d31529af03897b8960405160405180910390a3565b6001600073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb2cae8315bd3bec790522b2d91759938a5db9279c1ffabbc6a7d3575466245d160405160405180910390a456fea265627a7a7231582033099c95ce3ccb847b6cb79edc99bc8b6b78d98245a78a0dc5ae3c32796c54bf64736f6c634300050f0032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/test/sources/Misc.json b/test/sources/Misc.json deleted file mode 100644 index b56e47bce80..00000000000 --- a/test/sources/Misc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "contractName": "Misc", - "abi": [ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - } - ], - "bytecode": "0x6080604052348015600f57600080fd5b50603580601d6000396000f3fe6080604052600080fdfea165627a7a723058205b81906cade92d8eeda5d0627076490bd44b563a504fe790edbcd6afadbe359d0029", - "deployedBytecode": "0x6080604052600080fdfea165627a7a723058205b81906cade92d8eeda5d0627076490bd44b563a504fe790edbcd6afadbe359d0029", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/test/sources/Misc.sol b/test/sources/Misc.sol deleted file mode 100644 index 398114cee23..00000000000 --- a/test/sources/Misc.sol +++ /dev/null @@ -1,9 +0,0 @@ -pragma solidity ^0.5.1; - -contract Misc { - - string misc; - - constructor() public { - } -} diff --git a/test/sources/Parent.json b/test/sources/Parent.json deleted file mode 100644 index eddc62d2f83..00000000000 --- a/test/sources/Parent.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "contractName": "Parent", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "parentA", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "parentB", - "type": "address" - } - ], - "name": "Identical", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Similar", - "type": "event" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "a", - "type": "address" - } - ], - "name": "fireChildIdenticalEvent", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "a", - "type": "address" - } - ], - "name": "fireChildSimilarEvent", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b506101be806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806333953f3e1461003b578063cdaef7191461007f575b600080fd5b61007d6004803603602081101561005157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100c3565b005b6100c16004803603602081101561009557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610126565b005b8073ffffffffffffffffffffffffffffffffffffffff1663e62f41486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561010b57600080fd5b505af115801561011f573d6000803e3d6000fd5b5050505050565b8073ffffffffffffffffffffffffffffffffffffffff166339eb06136040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505050505056fea265627a7a723158201570ee9f18c1363a1ed9485e2163e981c47ef63669cd44ce420f350ed4949ad664736f6c634300050f0032", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806333953f3e1461003b578063cdaef7191461007f575b600080fd5b61007d6004803603602081101561005157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100c3565b005b6100c16004803603602081101561009557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610126565b005b8073ffffffffffffffffffffffffffffffffffffffff1663e62f41486040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561010b57600080fd5b505af115801561011f573d6000803e3d6000fd5b5050505050565b8073ffffffffffffffffffffffffffffffffffffffff166339eb06136040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505050505056fea265627a7a723158201570ee9f18c1363a1ed9485e2163e981c47ef63669cd44ce420f350ed4949ad664736f6c634300050f0032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/test/sources/ParentAndChild.sol b/test/sources/ParentAndChild.sol deleted file mode 100644 index f71b2796bf8..00000000000 --- a/test/sources/ParentAndChild.sol +++ /dev/null @@ -1,52 +0,0 @@ -pragma solidity ^0.5.0; - -// This contract models event signature shadowing when -// one contract calls another. Events `similar` and `identical` have -// the same signature but their arguments are processed differently -// because of indexing. - -contract Child { - // Three indexed args - event Similar( - address indexed _owner, - address indexed _approved, - uint256 indexed _tokenId - ); - - // Two indexed args - event Identical( - address indexed childA, - address indexed childB - ); - - function fireIdentical() public { - emit Identical(address(0), address(0)); - } - - function fireSimilar() public { - emit Similar(address(0), address(0), 1); - } -} - -contract Parent { - // Two (vs 3) indexed args, different names - event Similar( - address indexed owner, - address indexed spender, - uint256 value - ); - - // Two indexed args, named parent - event Identical( - address indexed parentA, - address indexed parentB - ); - - function fireChildIdenticalEvent(address a) public { - Child(a).fireIdentical(); - } - - function fireChildSimilarEvent(address a) public { - Child(a).fireSimilar(); - } -} diff --git a/test/sources/Reverts.json b/test/sources/Reverts.json deleted file mode 100644 index 1e42f067c20..00000000000 --- a/test/sources/Reverts.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "contractName": "Reverts", - "abi": [ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - } - ], - "bytecode": "0x6080604052348015600f57600080fd5b506000601a57600080fd5b603e8060276000396000f3fe6080604052600080fdfea265627a7a72315820fd31c994ac2f614e770a2ea9e63f6bc8f05f3e5aa1feb77ad79c3a778d594f4064736f6c634300050b0032", - "deployedBytecode": "0x6080604052600080fdfea265627a7a72315820fd31c994ac2f614e770a2ea9e63f6bc8f05f3e5aa1feb77ad79c3a778d594f4064736f6c634300050b0032", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/test/sources/Reverts.sol b/test/sources/Reverts.sol deleted file mode 100644 index ad79fd48cd7..00000000000 --- a/test/sources/Reverts.sol +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Source contract for Reverts.json - */ -pragma solidity ^0.5.1; - -contract Reverts { - - constructor() public { - require(false); - } -} diff --git a/test/utils.compareBlockNumbers.js b/test/utils.compareBlockNumbers.js deleted file mode 100644 index 71617da26b5..00000000000 --- a/test/utils.compareBlockNumbers.js +++ /dev/null @@ -1,58 +0,0 @@ -const chai = require('chai'); -const assert = chai.assert; -const BN = require('bn.js'); -const formatters = require('../packages/web3-utils/src/index.js'); - -const pending = "pending"; -const latest = "latest"; -const genesis = "genesis"; -const earliest = "earliest"; - -const tests = [ - // Base cases for numbers - { input: {a: 1, b: 1}, result: 0 }, - { input: {a: 1, b: 2}, result: -1 }, - { input: {a: 2, b: 1}, result: 1 }, - // Base cases for BN - { input: {a: new BN(1), b: new BN(1)}, result: 0 }, - { input: {a: new BN(1), b: new BN(2)}, result: -1 }, - { input: {a: new BN(2), b: new BN(1)}, result: 1 }, - // Base cases for numbers vs BN - { input: {a: new BN(1), b: 1}, result: 0 }, - { input: {a: new BN(1), b: 2}, result: -1 }, - { input: {a: new BN(2), b: 1}, result: 1 }, - // Base cases for strings (sanity) - { input: {a: genesis, b: earliest}, result: 0 }, - { input: {a: genesis, b: 0}, result: 0 }, - { input: {a: earliest, b: 0}, result: 0 }, - { input: {a: latest, b: latest}, result: 0 }, - { input: {a: pending, b: pending}, result: 0 }, - // Complex Strings - // Genesis - { input: {a: earliest, b: 2}, result: -1 }, - { input: {a: earliest, b: new BN(2)}, result: -1 }, - { input: {a: earliest, b: latest}, result: -1 }, - { input: {a: earliest, b: pending}, result: -1 }, - { input: {a: genesis, b: 2}, result: -1 }, - { input: {a: genesis, b: new BN(2)}, result: -1 }, - { input: {a: genesis, b: latest}, result: -1 }, - { input: {a: genesis, b: pending}, result: -1 }, - // latest - { input: {a: latest, b: 0}, result: 1 }, - { input: {a: latest, b: new BN(1)}, result: 1 }, - { input: {a: latest, b: pending}, result: -1 }, - // pending - { input: {a: pending, b: 0}, result: 1 }, - { input: {a: pending, b: new BN(1)}, result: 1 }, -]; - -describe('formatters', function () { - describe('compare blocknumbers', function () { - tests.forEach(function(test){ - it('should return the correct value', function () { - assert.deepEqual(formatters.compareBlockNumbers(test.input.a, test.input.b), test.result); - }); - }); - }); - -}); diff --git a/test/utils.encodePacked.js b/test/utils.encodePacked.js deleted file mode 100644 index a56f13d9609..00000000000 --- a/test/utils.encodePacked.js +++ /dev/null @@ -1,252 +0,0 @@ -var _ = require('underscore'); -var BN = require('bn.js'); -var BigNumber = require('bignumber.js'); -var chai = require('chai'); -var assert = chai.assert; -var utils = require('../packages/web3-utils'); - -// each "values" is one kind of parameter of the same type -var tests = [{ - values: [ - true, - {value: true, type: 'bool'}, - {v: true, t: 'bool'}, - {v: true, type: 'bool'}, - {value: true, t: 'bool'} - ], expected: '0x01' -},{ - values: [ - false, - {value: false, type: 'bool'}, - {v: false, t: 'bool'}, - {v: false, type: 'bool'}, - {value: false, t: 'bool'} - ], expected: '0x00' -},{ - values: [ - 'Hello!%', - {value: 'Hello!%', type: 'string'}, - {value: 'Hello!%', type: 'string'}, - {v: 'Hello!%', t: 'string'} - ], expected: '0x48656c6c6f2125' -},{ - values: [ - 2345676856, - '2345676856', - new BN('2345676856'), - new BigNumber('2345676856', 10), - {v: '2345676856', t: 'uint256'}, - {v: new BN('2345676856'), t: 'uint256'}, - {v: '2345676856', t: 'uint'} - ], expected: '0x000000000000000000000000000000000000000000000000000000008bd03038' -},{ - values: [ - '2342342342342342342345676856', - new BN('2342342342342342342345676856'), - new BigNumber('2342342342342342342345676856', 10), - {v: '2342342342342342342345676856', t: 'uint256'}, - {v: '2342342342342342342345676856', t: 'uint'} - ], expected: '0x000000000000000000000000000000000000000007918a48d0493ed3da6ed838' -// 5 -},{ - values: [ - {v: '56', t: 'uint8'} - ], expected: '0x38' -},{ - values: [ - {v: '256', t: 'uint16'} - ], expected: '0x0100' -},{ - values: [ - {v: '3256', t: 'uint32'} - ], expected: '0x00000cb8' -},{ - values: [ - {v: '454256', t: 'uint64'} - ], expected: '0x000000000006ee70' -},{ - values: [ - {v: '44454256', t: 'uint128'}, - {v: '44454256', t: 'int128'} // should be the same - ], expected: '0x00000000000000000000000002a65170' -},{ - values: [ - {v: '3435454256', t: 'uint160'} - ], expected: '0x00000000000000000000000000000000ccc4df30' -// 11 -},{ - values: [ - '0x2345435675432144555ffffffffdd222222222222224444556553522', - {v: '0x2345435675432144555ffffffffdd222222222222224444556553522', t: 'bytes'}, - {v: '2345435675432144555ffffffffdd222222222222224444556553522', t: 'bytes'}, - {error: true, v: '0x2345435675432144555ffffffffdd22222222222222444455655352', t: 'bytes'} - ], expected: '0x2345435675432144555ffffffffdd222222222222224444556553522' -},{ - values: [ - -3435454256, - new BN(-3435454256), - new BN('-3435454256'), - '-3435454256', - {v: '-3435454256', t: 'int'}, - {v: '-3435454256', t: 'int256'} - ], expected: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff333b20d0' -// 13 -},{ - values: [ - {v: '-36', t: 'int8'} - ], expected: '0xdc' -},{ - values: [ - {v: '0x22', t: 'bytes2'}, - {v: '22', t: 'bytes2'}, - {error: true, v: '0x222222', t: 'bytes2'} - ], expected: '0x2200' -},{ - values: [ - {v: '0x44222266', t: 'bytes4'}, - {v: '44222266', t: 'bytes4'} - ], expected: '0x44222266' -},{ - values: [ - {v: '0x44555ffffffffdd222222222222224444556553522', t: 'bytes32'}, - {v: '44555ffffffffdd222222222222224444556553522', t: 'bytes32'} - ], expected: '0x44555ffffffffdd2222222222222244445565535220000000000000000000000' -},{ - values: [ - '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - '0x407d73d8a49eeb85D32Cf465507dd71d507100c1', // invalid checksum, should work as it is interpreted as address - {v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'address'}, - {error: true, v: '0x407d73d8a49eeb85D32Cf465507dd71d507100c1', t: 'address'}, - {v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'bytes'}, - {v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'bytes20'} - ], expected: '0x407d73d8a49eeb85d32cf465507dd71d507100c1' -// 18 -},{ - values: [ - {v: '36', t: 'int8'} - ], expected: '0x24' -},{ - values: [ - {v: '36', t: 'int256'} - ], expected: '0x0000000000000000000000000000000000000000000000000000000000000024' -},{ - values: [ - {v: [-12, 243], t: 'int[]'}, - {v: [-12, 243], t: 'int256[]'}, - {v: ['-12', '243'], t: 'int256[]'}, - {v: [new BN('-12'), new BN('243')], t: 'int256[]'}, - {v: ['-12', '243'], t: 'int256[2]'} - ], expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff400000000000000000000000000000000000000000000000000000000000000f3' -},{ - values: [ - {v: [12, 243], t: 'uint[]'}, - {v: [12, 243], t: 'uint256[]'}, - {v: ['12', '243'], t: 'uint256[]'}, - {v: [new BN('12'), new BN('243')], t: 'uint256[]'}, - {v: ['12', '243'], t: 'uint256[2]'}, - {error: true, v: ['12', '243'], t: 'uint256[1]'} - ], expected: '0x000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000f3' -},{ - values: [ - {v: ['0x234656', '0x23434234234ffff456'], t: 'bytes32[]'}, - ], expected: '0x234656000000000000000000000000000000000000000000000000000000000023434234234ffff4560000000000000000000000000000000000000000000000' -},{ - values: [ - {v: '0x234656', t: 'bytes16'}, - {v: '234656', t: 'bytes16'} - ], expected: '0x23465600000000000000000000000000' -},{ - values: [ - {v: ['0x234656', '0x23434234234ffff456'], t: 'bytes16[]'}, - {v: ['234656', '23434234234ffff456'], t: 'bytes16[]'} - ], expected: '0x234656000000000000000000000000000000000000000000000000000000000023434234234ffff4560000000000000000000000000000000000000000000000' -},{ - values: [ - {v: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[]'}, - {v: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[2]'}, - {error: true, v: ['0x407d73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[]'}, - {error: true, v: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[4]'} - ], expected: '0x000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c100000000000000000000000085f43d8a49eeb85d32cf465507dd71d507100c1d' -},{ - values: [ - {v: 0, t: 'uint'} - ], expected: '0x0000000000000000000000000000000000000000000000000000000000000000' -},{ - values: [ - ['someValue'] // should error - ], expected: '' -}]; - - -describe('web3.encodePacked', function () { - tests.forEach(function (test) { - test.values.forEach(function (value) { - it('should hash "'+ JSON.stringify(value) +'" into "'+ test.expected +'"', function() { - - if(value.error || _.isArray(value)) { - assert.throws(utils.encodePacked.bind(null, value)); - } else { - assert.deepEqual(utils.encodePacked(value), test.expected); - } - - }); - }); - }); - - it('should hash mixed boolean values in any order', function() { - - assert.deepEqual(utils.encodePacked( - tests[0].values[1], // true - tests[1].values[0], // false - tests[1].values[2], // false - tests[0].values[3] // true - ), '0x01000001'); - }); - - it('should hash mixed string and number values in any order', function() { - - assert.deepEqual(utils.encodePacked( - tests[2].values[0], // 'Hello!%' - tests[3].values[2], // 2345676856 - tests[4].values[2], // '2342342342342342342345676856' - tests[2].values[3], // 'Hello!%' - tests[1].values[2] // false - ), '0x48656c6c6f2125000000000000000000000000000000000000000000000000000000008bd03038000000000000000000000000000000000000000007918a48d0493ed3da6ed83848656c6c6f212500'); - }); - - it('should hash mixed number types in any order', function() { - - assert.deepEqual(utils.encodePacked( - tests[5].values[0], // v: '56', t: 'uint8' - tests[6].values[0], // v: '256', t: 'uint16' - tests[7].values[0], // v: '3256', t: 'uint32' - tests[8].values[0], // v: '454256', t: 'uint64' - tests[9].values[0], // v: '44454256', t: 'uint128' - tests[10].values[0] // v: '3435454256', t: 'uint160' - ), '0x38010000000cb8000000000006ee7000000000000000000000000002a6517000000000000000000000000000000000ccc4df30'); - }); - - it('should hash mixed number types addresses and boolean in any order', function() { - - assert.deepEqual(utils.encodePacked( - tests[5].values[0], // v: '56', t: 'uint8' - tests[13].values[0], // v: '-36', t: 'int8' - tests[15].values[0], // v: '0x44222266', t: 'bytes4' - tests[0].values[0], // true - tests[17].values[1] // v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'address' - ), '0x38dc4422226601407d73d8a49eeb85d32cf465507dd71d507100c1'); - }); - - it('should hash mixed number arrays addresses and boolean in any order', function() { - - assert.deepEqual(utils.encodePacked( - tests[15].values[1], // v: '0x44222266', t: 'bytes4' - tests[25].values[0], // address array - tests[0].values[0], // true - tests[13].values[0], // v: '-36', t: 'int8' - tests[12].values[5], // v: '-3435454256', t: 'int256' - tests[17].values[0], // 0x407D73d8a49eeb85D32Cf465507dd71d507100c1 - tests[17].values[1] // v: 0x407D73d8a49eeb85D32Cf465507dd71d507100c1 t: address - ), '0x44222266000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c100000000000000000000000085f43d8a49eeb85d32cf465507dd71d507100c1d01dcffffffffffffffffffffffffffffffffffffffffffffffffffffffff333b20d0407d73d8a49eeb85d32cf465507dd71d507100c1407d73d8a49eeb85d32cf465507dd71d507100c1'); - }); -}); diff --git a/test/utils.fromAscii.js b/test/utils.fromAscii.js deleted file mode 100644 index 7972919a0cd..00000000000 --- a/test/utils.fromAscii.js +++ /dev/null @@ -1,21 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -var tests = [ - { value: 'myString', expected: '0x6d79537472696e67'}, - { value: 'myString\x00', expected: '0x6d79537472696e6700'}, - { value: '\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ', - expected: '0x0300000035e8c6d54c5d127c9dcebe9e1a37ab9b05321128d097590a3c100000000000006521df642ff1f5ec0c3a7aa6cea6b1e7b7f7cda2cbdf07362a85088e97f19ef94331c955c0e9321ad386428c'} -]; - -describe('lib/utils/utils', function () { - describe('asciiToHex', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.strictEqual(utils.fromAscii(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils.fromNumber.js b/test/utils.fromNumber.js deleted file mode 100644 index febbe5cc3bc..00000000000 --- a/test/utils.fromNumber.js +++ /dev/null @@ -1,45 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -var tests = [ - { value: 1, expected: '0x1' }, - {value: '21345678976543214567869765432145647586', expected: '0x100f073a3d694d13d1615dc9bc3097e2'}, - { value: '1', expected: '0x1' }, - { value: '0x1', expected: '0x1'}, - { value: '0x01', expected: '0x1'}, - { value: 15, expected: '0xf'}, - { value: '15', expected: '0xf'}, - { value: '0xf', expected: '0xf'}, - { value: '0x0f', expected: '0xf'}, - { value: -1, expected: '-0x1'}, - { value: '-1', expected: '-0x1'}, - { value: '-0x1', expected: '-0x1'}, - { value: '-0x01', expected: '-0x1'}, - { value: -15, expected: '-0xf'}, - { value: '-15', expected: '-0xf'}, - { value: '-0xf', expected: '-0xf'}, - { value: '-0x0f', expected: '-0xf'}, - { value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}, - { value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, - { value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}, - { value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, - { value: 0, expected: '0x0'}, - { value: '0', expected: '0x0'}, - { value: '0x0', expected: '0x0'}, - { value: -0, expected: '0x0'}, - { value: '-0', expected: '0x0'}, - { value: '-0x0', expected: '0x0'} -]; - -describe('lib/utils/utils', function () { - describe('numberToHex', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.equal(utils.numberToHex(test.value), test.expected); - }); - }); - }); -}); - diff --git a/test/utils.fromWei.js b/test/utils.fromWei.js deleted file mode 100644 index 13b37f9c76a..00000000000 --- a/test/utils.fromWei.js +++ /dev/null @@ -1,39 +0,0 @@ -var assert = require('assert'); -var utils = require('../packages/web3-utils'); - -describe('lib/utils/utils', function () { - describe('fromWei', function () { - it('should return the correct value', function () { - - assert.equal(utils.fromWei('1000000000000000000', 'wei'), '1000000000000000000'); - assert.equal(utils.fromWei('1000000000000000000', 'kwei'), '1000000000000000'); - assert.equal(utils.fromWei('1000000000000000000', 'mwei'), '1000000000000'); - assert.equal(utils.fromWei('1000000000000000000', 'gwei'), '1000000000'); - assert.equal(utils.fromWei('1000000000000000000', 'szabo'), '1000000'); - assert.equal(utils.fromWei('1000000000000000000', 'finney'), '1000'); - assert.equal(utils.fromWei('1000000000000000000', 'ether'), '1'); - assert.equal(utils.fromWei('1000000000000000000', 'kether'), '0.001'); - assert.equal(utils.fromWei('1000000000000000000', 'grand'), '0.001'); - assert.equal(utils.fromWei('1000000000000000000', 'mether'), '0.000001'); - assert.equal(utils.fromWei('1000000000000000000', 'gether'), '0.000000001'); - assert.equal(utils.fromWei('1000000000000000000', 'tether'), '0.000000000001'); - }); - - it('should verify "number" arg is string or BN', function () { - try { - utils.fromWei(100000000000, 'wei') - assert.fail(); - } catch (error) { - assert(error.message.includes('Please pass numbers as strings or BN objects')) - } - }) - // fromWei always returns string - it('should return the correct type', function(){ - var weiString = '100000000000000000'; - var weiBN = utils.toBN(weiString); - - assert(typeof utils.fromWei(weiString) === 'string'); - assert(typeof utils.fromWei(weiBN) === 'string'); - }) - }); -}); diff --git a/test/utils.isAddress.js b/test/utils.isAddress.js deleted file mode 100644 index d985f809340..00000000000 --- a/test/utils.isAddress.js +++ /dev/null @@ -1,28 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -var tests = [ - { value: function () {}, is: false}, - { value: new Function(), is: false}, - { value: 'function', is: false}, - { value: {}, is: false}, - { value: '0xc6d9d2cd449a754c494264e1809c50e34d64562b', is: true }, - { value: 'c6d9d2cd449a754c494264e1809c50e34d64562b', is: true }, - { value: '0xE247A45c287191d435A8a5D72A7C8dc030451E9F', is: true }, - { value: '0xE247a45c287191d435A8a5D72A7C8dc030451E9F', is: false }, - { value: '0xe247a45c287191d435a8a5d72a7c8dc030451e9f', is: true }, - { value: '0xE247A45C287191D435A8A5D72A7C8DC030451E9F', is: true }, - { value: '0XE247A45C287191D435A8A5D72A7C8DC030451E9F', is: true } -]; - -describe('lib/utils/utils', function () { - describe('isAddress', function () { - tests.forEach(function (test) { - it('shoud test if value ' + test.value + ' is address: ' + test.is, function () { - assert.equal(utils.isAddress(test.value), test.is); - }); - }); - }); -}); diff --git a/test/utils.isBN.js b/test/utils.isBN.js deleted file mode 100644 index cc94a122ad4..00000000000 --- a/test/utils.isBN.js +++ /dev/null @@ -1,28 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var BigNumber = require('bn.js'); - -var assert = chai.assert; - -var tests = [ - { value: function () {}, is: false}, - { value: new Function(), is: false}, - { value: 'function', is: false}, - { value: {}, is: false}, - { value: new String('hello'), is: false}, - { value: new BigNumber(0), is: true}, - { value: 132, is: false}, - { value: '0x12', is: false}, - -]; - -describe('lib/utils/utils', function () { - describe('isBigNumber', function () { - tests.forEach(function (test) { - it('shoud test if value ' + test.func + ' is BigNumber: ' + test.is, function () { - assert.equal(utils.isBN(test.value), test.is); - }); - }); - }); -}); diff --git a/test/utils.isChecksumAddress.js b/test/utils.isChecksumAddress.js deleted file mode 100644 index c48659763bf..00000000000 --- a/test/utils.isChecksumAddress.js +++ /dev/null @@ -1,28 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -var tests = [ - { value: '0x52908400098527886E0F7030069857D2E4169EE7', is: true }, - { value: '0x8617E340B3D01FA5F11F306F4090FD50E238070D', is: true }, - { value: '0xde709f2102306220921060314715629080e2fb77', is: true }, - { value: '0x27b1fdb04752bbc536007a920d24acb045561c26', is: true }, - { value: '0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed', is: true }, - { value: '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', is: true }, - { value: '0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB', is: true }, - { value: '0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb', is: true }, - { value: '0XD1220A0CF47C7B9BE7A2E6BA89F429762E7B9ADB', is: false }, - { value: '0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb', is: false } -]; - -describe('lib/utils/utils', function () { - describe('checkAddressChecksum', function () { - tests.forEach(function (test) { - it('shoud test if address ' + test.value + ' passes checksum: ' + test.is, function () { - assert.equal(utils.checkAddressChecksum(test.value), test.is); - }); - }); - }); -}); - diff --git a/test/utils.isHex.js b/test/utils.isHex.js deleted file mode 100644 index e5a868b9576..00000000000 --- a/test/utils.isHex.js +++ /dev/null @@ -1,34 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var BigNumber = require('bignumber.js'); -var BN = require('bn.js'); - -var assert = chai.assert; - -var tests = [ - { value: 1, expected: true }, - { value: '1', expected: true }, - { value: '0xH', expected: false}, - { value: 'H', expected: false}, - { value: [1,2,3,{test: 'data'}], expected: false}, - { value: {test: 'test'}, expected: false}, - { value: '{"test": "test"}', expected: false}, - { value: 'myString', expected: false}, - { value: 'myString 34534!', expected: false}, - { value: new BN(15), expected: false}, - { value: new BigNumber(15), expected: false}, - { value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: false}, - { value: true, expected: false}, - { value: false, expected: false} -]; - -describe('lib/utils/utils', function () { - describe('isHex', function () { - tests.forEach(function (test) { - it('should return ' + test.expected + ' for input ' + test.value, function () { - assert.strictEqual(utils.isHex(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils.isHexStrict.js b/test/utils.isHexStrict.js deleted file mode 100644 index 12c88b5f2a2..00000000000 --- a/test/utils.isHexStrict.js +++ /dev/null @@ -1,34 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var BigNumber = require('bignumber.js'); -var BN = require('bn.js'); - -var assert = chai.assert; - -var tests = [ - { value: 0x1, expected: false }, //0x1 would be tested as 1 - { value: '0x1', expected: true }, - { value: '0xH', expected: false}, - { value: 'H', expected: false}, - { value: [1,2,3,{test: 'data'}], expected: false}, - { value: {test: 'test'}, expected: false}, - { value: '{"test": "test"}', expected: false}, - { value: 'myString', expected: false}, - { value: 'myString 34534!', expected: false}, - { value: new BN(15), expected: false}, - { value: new BigNumber(15), expected: false}, - { value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: false}, - { value: true, expected: false}, - { value: false, expected: false} -]; - -describe('lib/utils/utils', function () { - describe('isHexStrict', function () { - tests.forEach(function (test) { - it('should return ' + test.expected + ' for input ' + test.value, function () { - assert.strictEqual(utils.isHexStrict(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils.randomHex.js b/test/utils.randomHex.js deleted file mode 100644 index 2eb4c7716fc..00000000000 --- a/test/utils.randomHex.js +++ /dev/null @@ -1,25 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -// Expect 2 chars per bytes plus `0x` prefix -var tests = [ - { value: 0, expected: { prefix: '0x', type: 'string', length: 2 }}, - { value: 15, expected: { prefix: '0x', type: 'string', length: 32 }}, - { value: 16, expected: { prefix: '0x', type: 'string', length: 34 }} -]; - -describe('lib/utils/utils', function () { - describe('randomHex', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - var result = utils.randomHex(test.value); - - assert.strictEqual(typeof result, test.expected.type); - assert.strictEqual(result.slice(0,2), test.expected.prefix); - assert.strictEqual(result.length, test.expected.length); - }); - }); - }); -}); diff --git a/test/utils.sha3.js b/test/utils.sha3.js deleted file mode 100644 index 66e0bb9157c..00000000000 --- a/test/utils.sha3.js +++ /dev/null @@ -1,51 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var sha3 = require('../packages/web3-utils').sha3; -var CryptoJS = require('crypto-js'); -var cjsSha3 = require('crypto-js/sha3'); - - -describe('web3.sha3', function () { - it('should return sha3 with hex prefix', function() { - test1 = sha3('test123'); - test2 = sha3('test(int)'); - assert.deepEqual(test1, '0x' + cjsSha3('test123', { - outputLength: 256 - }).toString()); - assert.deepEqual(test2, '0x' + cjsSha3('test(int)', { - outputLength: 256 - }).toString()); - }); - it('should return sha3 with hex prefix when hex input', function() { - var sha3Hex = function(value){ - if (value.length > 2 && value.substr(0, 2) === '0x') { - value = value.substr(2); - } - value = CryptoJS.enc.Hex.parse(value); - - return cjsSha3(value, { - outputLength: 256 - }).toString(); - }; - - test3 = sha3('0x80'); - test4 = sha3('0x3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1'); - assert.deepEqual(test3, '0x' + sha3Hex('0x80')); - assert.deepEqual(test4, '0x' + sha3Hex('0x3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1')); - }); - it('should return sha3 with hex prefix when hex input', function() { - - var test = function (v, e, o) { - it('should encode ' + v + ' to ' + e, function () { - assert.equal(sha3(v, o), e); - }); - }; - - test('test123', '0xf81b517a242b218999ec8eec0ea6e2ddbef2a367a14e93f4a32a39e260f686ad'); - test('test(int)', '0xf4d03772bec1e62fbe8c5691e1a9101e520e8f8b5ca612123694632bf3cb51b1'); - test('0x80', '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421'); - test('0x80', '0x6b03a5eef7706e3fb52a61c19ab1122fad7237726601ac665bd4def888f0e4a0'); - test('0x3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1', '0x82ff40c0a986c6a5cfad4ddf4c3aa6996f1a7837f9c398e17e5de5cbd5a12b28'); - - }); -}); diff --git a/test/utils.sha3Raw.js b/test/utils.sha3Raw.js deleted file mode 100644 index 097b34dc18f..00000000000 --- a/test/utils.sha3Raw.js +++ /dev/null @@ -1,22 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var cjsSha3 = require('crypto-js/sha3'); -var sha3Raw = require('../packages/web3-utils').sha3Raw; - -describe('web3.sha3Raw', function () { - it('should return the sha3 hash with hex prefix', function() { - assert.deepEqual(sha3Raw(''), '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'); - }); - - it('should return sha3 with hex prefix', function() { - assert.deepEqual( - sha3Raw('test123'), - '0x' + cjsSha3('test123', {outputLength: 256}).toString() - ); - - assert.deepEqual( - sha3Raw('test(int)'), - '0x' + cjsSha3('test(int)', {outputLength: 256}).toString() - ); - }); -}); diff --git a/test/utils.soliditySha3.js b/test/utils.soliditySha3.js deleted file mode 100644 index c40b1eb1fa0..00000000000 --- a/test/utils.soliditySha3.js +++ /dev/null @@ -1,252 +0,0 @@ -var _ = require('underscore'); -var BN = require('bn.js'); -var BigNumber = require('bignumber.js'); -var chai = require('chai'); -var assert = chai.assert; -var utils = require('../packages/web3-utils'); - -// each "values" is one kind of parameter of the same type -var tests = [{ - values: [ - true, - {value: true, type: 'bool'}, - {v: true, t: 'bool'}, - {v: true, type: 'bool'}, - {value: true, t: 'bool'} - ], expected: '0x5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2' -},{ - values: [ - false, - {value: false, type: 'bool'}, - {v: false, t: 'bool'}, - {v: false, type: 'bool'}, - {value: false, t: 'bool'} - ], expected: '0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a' -},{ - values: [ - 'Hello!%', - {value: 'Hello!%', type: 'string'}, - {value: 'Hello!%', type: 'string'}, - {v: 'Hello!%', t: 'string'} - ], expected: '0x661136a4267dba9ccdf6bfddb7c00e714de936674c4bdb065a531cf1cb15c7fc' -},{ - values: [ - 2345676856, - '2345676856', - new BN('2345676856'), - new BigNumber('2345676856', 10), - {v: '2345676856', t: 'uint256'}, - {v: new BN('2345676856'), t: 'uint256'}, - {v: '2345676856', t: 'uint'} - ], expected: '0xc0a8dac986ad882fff6b05a7792e1259f2fd8fa72d632fb48f54affea59af6fc' -},{ - values: [ - '2342342342342342342345676856', - new BN('2342342342342342342345676856'), - new BigNumber('2342342342342342342345676856', 10), - {v: '2342342342342342342345676856', t: 'uint256'}, - {v: '2342342342342342342345676856', t: 'uint'} - ], expected: '0x8ac2efaaee0058e1f1fbcb59643f6799c31c27096a347651e40f98daf1905094' -// 5 -},{ - values: [ - {v: '56', t: 'uint8'} - ], expected: '0xe4b1702d9298fee62dfeccc57d322a463ad55ca201256d01f62b45b2e1c21c10' -},{ - values: [ - {v: '256', t: 'uint16'} - ], expected: '0x628bf3596747d233f1e6533345700066bf458fa48daedaf04a7be6c392902476' -},{ - values: [ - {v: '3256', t: 'uint32'} - ], expected: '0x720e835027b41b4b3e057ee9e6d4351ffc726d767652cdb0fc874869df88001c' -},{ - values: [ - {v: '454256', t: 'uint64'} - ], expected: '0x5ce6ff175acd532fb4dcef362c829e74a0ce1fde4a43885cca0d257b33d06d07' -},{ - values: [ - {v: '44454256', t: 'uint128'}, - {v: '44454256', t: 'int128'} // should be the same - ], expected: '0x372b694bc0f2dd9229f39b3892621a6ae3ffe111c5096a0a9253c34558a92ab8' -},{ - values: [ - {v: '3435454256', t: 'uint160'} - ], expected: '0x89e0942df3602c010e0252becbbe1b4053bd4a871a021c02d8ab9878f1194b6b' -// 11 -},{ - values: [ - '0x2345435675432144555ffffffffdd222222222222224444556553522', - {v: '0x2345435675432144555ffffffffdd222222222222224444556553522', t: 'bytes'}, - {v: '2345435675432144555ffffffffdd222222222222224444556553522', t: 'bytes'}, - {error: true, v: '0x2345435675432144555ffffffffdd22222222222222444455655352', t: 'bytes'} - ], expected: '0xb7ecb0d74e96b792a62b4a9dad28f5b1795417a89679562178b1987e0767e009' -},{ - values: [ - -3435454256, - new BN(-3435454256), - new BN('-3435454256'), - '-3435454256', - {v: '-3435454256', t: 'int'}, - {v: '-3435454256', t: 'int256'} - ], expected: '0x858d68fc4ad9f80dc5ee9571c7076298f8139d1d111e0955426de9381b10a061' -// 13 -},{ - values: [ - {v: '-36', t: 'int8'} - ], expected: '0xd1023f33bbf70407fe1e7011c03159e2efe16e44fa97b4a8d50bc4acbfd6ce23' -},{ - values: [ - {v: '0x22', t: 'bytes2'}, - {v: '22', t: 'bytes2'}, - {error: true, v: '0x222222', t: 'bytes2'} - ], expected: '0xb07fb0a3471486f9ccb02aab1d525df60d82925cb2d27860f923e655d76f35fc' -},{ - values: [ - {v: '0x44222266', t: 'bytes4'}, - {v: '44222266', t: 'bytes4'} - ], expected: '0x7cdb669d75710eb06b9b34618e77206db56f0cc71698f246433ce8339ed8075b' -},{ - values: [ - {v: '0x44555ffffffffdd222222222222224444556553522', t: 'bytes32'}, - {v: '44555ffffffffdd222222222222224444556553522', t: 'bytes32'} - ], expected: '0x5aac5a7501e071c3ee062ede777be470acb4cd05a2724146438d7e4518d91677' -},{ - values: [ - '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', - '0x407d73d8a49eeb85D32Cf465507dd71d507100c1', // invalid checksum, should work as it is interpreted as address - {v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'address'}, - {error: true, v: '0x407d73d8a49eeb85D32Cf465507dd71d507100c1', t: 'address'}, - {v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'bytes'}, - {v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'bytes20'} - ], expected: '0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b' -// 18 -},{ - values: [ - {v: '36', t: 'int8'} - ], expected: '0xb104e6a8e5e1477c7a8346486401cbd4f10ab4840a4201066d9b59b747cb6f88' -},{ - values: [ - {v: '36', t: 'int256'} - ], expected: '0x7cd332d19b93bcabe3cce7ca0c18a052f57e5fd03b4758a09f30f5ddc4b22ec4' -},{ - values: [ - {v: [-12, 243], t: 'int[]'}, - {v: [-12, 243], t: 'int256[]'}, - {v: ['-12', '243'], t: 'int256[]'}, - {v: [new BN('-12'), new BN('243')], t: 'int256[]'}, - {v: ['-12', '243'], t: 'int256[2]'} - ], expected: '0xa9805b78a6ec1d71c3722498d521fde9d3913c92360e3aed06a9403db25f0351' -},{ - values: [ - {v: [12, 243], t: 'uint[]'}, - {v: [12, 243], t: 'uint256[]'}, - {v: ['12', '243'], t: 'uint256[]'}, - {v: [new BN('12'), new BN('243')], t: 'uint256[]'}, - {v: ['12', '243'], t: 'uint256[2]'}, - {error: true, v: ['12', '243'], t: 'uint256[1]'} - ], expected: '0x74282b2d1a7a1a70af6f3a43ab576cd6feeaa6ebaa5fb2033b90d5942bf48a60' -},{ - values: [ - {v: ['0x234656', '0x23434234234ffff456'], t: 'bytes32[]'}, - ], expected: '0x3f67732837541dd9e3aa29cb99d88839fceccf9486b3ec053d82d339d35c79d5' -},{ - values: [ - {v: '0x234656', t: 'bytes16'}, - {v: '234656', t: 'bytes16'} - ], expected: '0x5d0d56c5b556a2dfee96b3de4717b3bd0333b7ffa5932e208fdcc24a03bdf088' -},{ - values: [ - {v: ['0x234656', '0x23434234234ffff456'], t: 'bytes16[]'}, - {v: ['234656', '23434234234ffff456'], t: 'bytes16[]'} - ], expected: '0x3f67732837541dd9e3aa29cb99d88839fceccf9486b3ec053d82d339d35c79d5' -},{ - values: [ - {v: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[]'}, - {v: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[2]'}, - {error: true, v: ['0x407d73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[]'}, - {error: true, v: ['0x407D73d8a49eeb85D32Cf465507dd71d507100c1', '0x85F43D8a49eeB85d32Cf465507DD71d507100C1d'], t: 'address[4]'} - ], expected: '0x1dcd26e646452836052e2a57400510aa63e07aede06fa43660cb6054edacfce0' -},{ - values: [ - {v: 0, t: 'uint'} - ], expected: '0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563' -},{ - values: [ - ['someValue'] // should error - ], expected: '' -}]; - - -describe('web3.soliditySha3', function () { - tests.forEach(function (test) { - test.values.forEach(function (value) { - it('should hash "'+ JSON.stringify(value) +'" into "'+ test.expected +'"', function() { - - if(value.error || _.isArray(value)) { - assert.throws(utils.soliditySha3.bind(null, value)); - } else { - assert.deepEqual(utils.soliditySha3(value), test.expected); - } - - }); - }); - }); - - it('should hash mixed boolean values in any order', function() { - - assert.deepEqual(utils.soliditySha3( - tests[0].values[1], // true - tests[1].values[0], // false - tests[1].values[2], // false - tests[0].values[3] // true - ), '0x4ba958c4829ba5d3f9eaa61058ef208aba8bc25c0b6e33044015e0af9fb1c35d'); - }); - - it('should hash mixed string and number values in any order', function() { - - assert.deepEqual(utils.soliditySha3( - tests[2].values[0], // 'Hello!%' - tests[3].values[2], // 2345676856 - tests[4].values[2], // '2342342342342342342345676856' - tests[2].values[3], // 'Hello!%' - tests[1].values[2] // false - ), '0x7eb45eb9a0e1f6904514bc34c8b43e71c2e1f96f21b45ea284a0418cb351ec69'); - }); - - it('should hash mixed number types in any order', function() { - - assert.deepEqual(utils.soliditySha3( - tests[5].values[0], // v: '56', t: 'uint8' - tests[6].values[0], // v: '256', t: 'uint16' - tests[7].values[0], // v: '3256', t: 'uint32' - tests[8].values[0], // v: '454256', t: 'uint64' - tests[9].values[0], // v: '44454256', t: 'uint128' - tests[10].values[0] // v: '3435454256', t: 'uint160' - ), '0x31d6c48574796dfb1a652f2e5c5a261db0677e39fff5c3032449c50eade4b6b6'); - }); - - it('should hash mixed number types addresses and boolean in any order', function() { - - assert.deepEqual(utils.soliditySha3( - tests[5].values[0], // v: '56', t: 'uint8' - tests[13].values[0], // v: '-36', t: 'int8' - tests[15].values[0], // v: '0x44222266', t: 'bytes4' - tests[0].values[0], // true - tests[17].values[1] // v: '0x407D73d8a49eeb85D32Cf465507dd71d507100c1', t: 'address' - ), '0x334086a8fa05e16afb86bed41c614aa74e99ea32eefe8ce0026b4076ce217698'); - }); - - it('should hash mixed number arrays addresses and boolean in any order', function() { - - assert.deepEqual(utils.soliditySha3( - tests[15].values[1], // v: '0x44222266', t: 'bytes4' - tests[25].values[0], // address array - tests[0].values[0], // true - tests[13].values[0], // v: '-36', t: 'int8' - tests[12].values[5], // v: '-3435454256', t: 'int256' - tests[17].values[0], // 0x407D73d8a49eeb85D32Cf465507dd71d507100c1 - tests[17].values[1] // v: 0x407D73d8a49eeb85D32Cf465507dd71d507100c1 t: address - ), '0x61c62b29bbe21d8821a938f7331ac875859cc50331556b3383196b19cfc45aff'); - }); -}); diff --git a/test/utils.soliditySha3Raw.js b/test/utils.soliditySha3Raw.js deleted file mode 100644 index 6bfb7a699ce..00000000000 --- a/test/utils.soliditySha3Raw.js +++ /dev/null @@ -1,24 +0,0 @@ -var chai = require('chai'); -var assert = chai.assert; -var soliditySha3Raw = require('../packages/web3-utils').soliditySha3Raw; - -describe('web3.soliditySha3Raw', function () { - it('should return the sha3 hash of a empty string with hex prefix', function () { - assert.deepEqual( - soliditySha3Raw( - {t: 'string', v: ''} - ), - '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' - ); - }); - - it('should return the expected sha3 hash with hex prefix', function () { - assert.deepEqual(soliditySha3Raw( - 'Hello!%', - 2345676856, - '2342342342342342342345676856', - 'Hello!%', - false - ), '0x7eb45eb9a0e1f6904514bc34c8b43e71c2e1f96f21b45ea284a0418cb351ec69'); - }); -}); diff --git a/test/utils.stripHexPrefix.js b/test/utils.stripHexPrefix.js deleted file mode 100644 index 19b9e6877f4..00000000000 --- a/test/utils.stripHexPrefix.js +++ /dev/null @@ -1,54 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var BigNumber = require('bignumber.js'); -var BN = require('bn.js'); - -var assert = chai.assert; - -var tests = [ - { value: '1', expected: '1' }, - { value: '0x1', expected: '1'}, - { value: '0xf', expected: 'f'}, - { value: '-1', expected: '-1'}, - { value: '-0x1', expected: '-1'}, - { value: '-15', expected: '-15'}, - { value: '-0xf', expected: '-f'}, - { value: '0x657468657265756d', expected: '657468657265756d'}, - { value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, - { value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}, - { value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, - { value: 0, expected: 0}, - { value: '0', expected: '0'}, - { value: '0x0', expected: '0'}, - { value: -0, expected: -0}, - { value: '-0', expected: '-0'}, - { value: '-0x0', expected: '-0'}, - { value: [1,2,3,{test: 'data'}], expected: [1,2,3,{test: 'data'}]}, - { value: {test: 'test'}, expected: {test: 'test'}}, - { value: '{"test": "test"}', expected: '{"test": "test"}'}, - { value: 'myString', expected: 'myString'}, - { value: 'myString 34534!', expected: 'myString 34534!'}, - { value: new BN(15), expected: new BN(15)}, - { value: new BigNumber(15), expected: new BigNumber(15)}, - { value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/'}, - { value: true, expected: true}, - { value: false, expected: false}, - { value: 'ff\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ', - expected: 'ff\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ'}, - { value: '\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ', - expected: '\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ'}, - { value: '내가 제일 잘 나가', expected: '내가 제일 잘 나가'}, - { value: Buffer.from('100'), expected: Buffer.from('100')}, - { value: '0xfffff0x0fffffffffff0xffffff0x', expected: '0xfffff0x0fffffffffff0xffffff0x'} -]; - -describe('lib/utils/utils', function () { - describe('stripHexPrefix', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.deepEqual(utils.stripHexPrefix(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils.toAscii.js b/test/utils.toAscii.js deleted file mode 100644 index 1eb653ea98c..00000000000 --- a/test/utils.toAscii.js +++ /dev/null @@ -1,21 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -var tests = [ - { value: '0x6d79537472696e67', expected: 'myString'}, - { value: '0x6d79537472696e6700', expected: 'myString\u0000'}, - { value: "0x0300000035e8c6d54c5d127c9dcebe9e1a37ab9b05321128d097590a3c100000000000006521df642ff1f5ec0c3a7aa6cea6b1e7b7f7cda2cbdf07362a85088e97f19ef94331c955c0e9321ad386428c", - expected: '\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ'} -]; - -describe('lib/utils/utils', function () { - describe('hexToAscii', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.strictEqual(utils.toAscii(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils.toBigNumber.js b/test/utils.toBigNumber.js deleted file mode 100644 index 064a6715051..00000000000 --- a/test/utils.toBigNumber.js +++ /dev/null @@ -1,47 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var BigNumber = require('bn.js'); - -var assert = chai.assert; - -var tests = [ - { value: 1, expected: '1' }, - { value: '1', expected: '1' }, - { value: '0x1', expected: '1'}, - { value: '0x01', expected: '1'}, - { value: 15, expected: '15'}, - { value: '15', expected: '15'}, - { value: '0xf', expected: '15'}, - { value: '0x0f', expected: '15'}, - { value: new BigNumber('f', 16), expected: '15'}, - { value: -1, expected: '-1'}, - { value: '-1', expected: '-1'}, - { value: '-0x1', expected: '-1'}, - { value: '-0x01', expected: '-1'}, - { value: -15, expected: '-15'}, - { value: '-15', expected: '-15'}, - { value: '-0xf', expected: '-15'}, - { value: '-0x0f', expected: '-15'}, - { value: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639935'}, - { value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '115792089237316195423570985008687907853269984665640564039457584007913129639933'}, - { value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-115792089237316195423570985008687907853269984665640564039457584007913129639935'}, - { value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-115792089237316195423570985008687907853269984665640564039457584007913129639933'}, - { value: 0, expected: '0'}, - { value: '0', expected: '0'}, - { value: '0x0', expected: '0'}, - { value: -0, expected: '0'}, - { value: '-0', expected: '0'}, - { value: '-0x0', expected: '0'}, - { value: new BigNumber(0), expected: '0'} -]; - -describe('lib/utils/utils', function () { - describe('toBN', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.equal(utils.toBN(test.value).toString(10), test.expected); - }); - }); - }); -}); diff --git a/test/utils.toHex.js b/test/utils.toHex.js deleted file mode 100644 index 3b94f5f97df..00000000000 --- a/test/utils.toHex.js +++ /dev/null @@ -1,56 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var BigNumber = require('bignumber.js'); -var BN = require('bn.js'); - -var assert = chai.assert; - -var tests = [ - { value: 1, expected: '0x1' }, - { value: '1', expected: '0x1' }, - { value: '0x1', expected: '0x1'}, - { value: '15', expected: '0xf'}, - { value: '0xf', expected: '0xf'}, - { value: -1, expected: '-0x1'}, - { value: '-1', expected: '-0x1'}, - { value: '-0x1', expected: '-0x1'}, - { value: '-15', expected: '-0xf'}, - { value: '-0xf', expected: '-0xf'}, - { value: '0x657468657265756d', expected: '0x657468657265756d'}, - { value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, - { value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'}, - { value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'}, - { value: 0, expected: '0x0'}, - { value: '0', expected: '0x0'}, - { value: '0x0', expected: '0x0'}, - { value: -0, expected: '0x0'}, - { value: '-0', expected: '0x0'}, - { value: '-0x0', expected: '0x0'}, - { value: [1,2,3,{test: 'data'}], expected: '0x5b312c322c332c7b2274657374223a2264617461227d5d'}, - { value: {test: 'test'}, expected: '0x7b2274657374223a2274657374227d'}, - { value: '{"test": "test"}', expected: '0x7b2274657374223a202274657374227d'}, - { value: 'myString', expected: '0x6d79537472696e67'}, - { value: 'myString 34534!', expected: '0x6d79537472696e6720333435333421'}, - { value: new BN(15), expected: '0xf'}, - { value: new BigNumber(15), expected: '0xf'}, - { value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: '0x486565c3a4c3b6c3b6c3a4f09f9185443334c99dc9a33234d084cdbd2d2e2cc3a4c3bc2b232f'}, - { value: true, expected: '0x01'}, - { value: false, expected: '0x00'}, - { value: 'ff\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ', - expected: '0x66660300000035c3a8c386c3954c5d127cc29dc38ec2bec29e1a37c2abc29b05321128c390c297590a3c100000000000006521c39f642fc3b1c3b5c3ac0c3a7ac2a6c38ec2a6c2b1c3a7c2b7c3b7c38dc2a2c38bc39f07362ac28508c28ec297c3b1c29ec3b94331c38955c380c3a9321ac393c28642c28c'}, - { value: '\u0003\u0000\u0000\u00005èÆÕL]\u0012|Î¾ž\u001a7«›\u00052\u0011(ЗY\n<\u0010\u0000\u0000\u0000\u0000\u0000\u0000e!ßd/ñõì\f:z¦Î¦±ç·÷Í¢Ëß\u00076*…\bŽ—ñžùC1ÉUÀé2\u001aӆBŒ', - expected: '0x0300000035c3a8c386c3954c5d127cc29dc38ec2bec29e1a37c2abc29b05321128c390c297590a3c100000000000006521c39f642fc3b1c3b5c3ac0c3a7ac2a6c38ec2a6c2b1c3a7c2b7c3b7c38dc2a2c38bc39f07362ac28508c28ec297c3b1c29ec3b94331c38955c380c3a9321ac393c28642c28c'}, - { value: '내가 제일 잘 나가', expected:'0xeb82b4eab08020eca09cec9dbc20ec9e9820eb8298eab080'}, - { value: Buffer.from('100'), expected:'0x313030'} -]; - -describe('lib/utils/utils', function () { - describe('toHex', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.strictEqual(utils.toHex(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils.toNumber.js b/test/utils.toNumber.js deleted file mode 100644 index a1d7767557d..00000000000 --- a/test/utils.toNumber.js +++ /dev/null @@ -1,23 +0,0 @@ -var assert = require('assert'); -var utils = require('../packages/web3-utils'); - -describe('lib/utils/utils', function () { - describe('hexToNumber', function () { - it('should return the correct value', function () { - - assert.equal(utils.hexToNumber("0x3e8"), 1000); - assert.equal(utils.hexToNumber('0x1f0fe294a36'), 2134567897654); - // allow compatiblity - assert.equal(utils.hexToNumber(100000), 100000); - }); - - it('should validate hex strings', function() { - try { - utils.hexToNumber('100000'); - assert.fail(); - } catch (error){ - assert(error.message.includes('is not a valid hex string')) - } - }) - }); -}); diff --git a/test/utils.toNumberString.js b/test/utils.toNumberString.js deleted file mode 100644 index 6c4acaad9ee..00000000000 --- a/test/utils.toNumberString.js +++ /dev/null @@ -1,23 +0,0 @@ -var assert = require('assert'); -var utils = require('../packages/web3-utils'); - -describe('lib/utils/utils', function () { - describe('hexToNumberString', function () { - it('should return the correct value', function () { - - assert.equal(utils.hexToNumberString("0x3e8"), '1000'); - assert.equal(utils.hexToNumberString('0x1f0fe294a36'), '2134567897654'); - // allow compatiblity - assert.equal(utils.hexToNumberString(100000), '100000'); - }); - - it('should validate hex strings', function() { - try { - utils.hexToNumberString('100000'); - assert.fail(); - } catch (error){ - assert(error.message.includes('is not a valid hex string')) - } - }) - }); -}); diff --git a/test/utils.toTwosComplement.js b/test/utils.toTwosComplement.js deleted file mode 100644 index a00f7225f73..00000000000 --- a/test/utils.toTwosComplement.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Created by danielbruce on 2017-09-25. - */ -var chai = require('chai'); -var assert = chai.assert; -var utils = require('../packages/web3-utils/'); -var BigNumber = require('bignumber.js'); - -var tests = [ - { value: 1, expected: utils.padLeft(new BigNumber(1).integerValue().toString(16), 64) }, - { value: '1', expected: utils.padLeft(new BigNumber(1).toString(16), 64) }, - { value: '0x1', expected: utils.padLeft(new BigNumber(1).toString(16), 64) }, - { value: '15', expected: utils.padLeft(new BigNumber(15).toString(16), 64)}, - { value: '0xf', expected: utils.padLeft(new BigNumber(15).toString(16), 64)}, - { value: -1, expected: new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(new BigNumber(-1)).plus(1).toString(16)}, - { value: '-1', expected: new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(new BigNumber(-1)).plus(1).toString(16)}, - { value: '-0x1', expected: new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(new BigNumber(-1)).plus(1).toString(16)}, - { value: '-15', expected: new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(new BigNumber(-15)).plus(1).toString(16)}, - { value: '-0xf', expected: new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(new BigNumber(-15)).plus(1).toString(16)}, - { value: 0, expected: utils.padLeft(new BigNumber(0).toString(16), 64)}, - { value: '0', expected: utils.padLeft(new BigNumber(0).toString(16), 64)}, - { value: '0x0', expected: utils.padLeft(new BigNumber(0).toString(16), 64)}, - { value: -0, expected: utils.padLeft(new BigNumber(0).toString(16), 64)}, - { value: '-0', expected: utils.padLeft(new BigNumber(0).toString(16), 64)}, - { value: '-0x0', expected: utils.padLeft(new BigNumber(0).toString(16), 64)}, - { value: new BigNumber(15), expected: utils.padLeft(new BigNumber(15).toString(16), 64)} -]; - -describe('lib/utils/utils', function () { - describe('toTwosComplement', function () { - tests.forEach(function (test) { - it('printing ' + test.value, function () { - assert.equal(utils.toTwosComplement(test.value).replace('0x',''), test.expected); - }); - }); - }); -}); diff --git a/test/utils.toUtf8.js b/test/utils.toUtf8.js deleted file mode 100644 index 22914e8b052..00000000000 --- a/test/utils.toUtf8.js +++ /dev/null @@ -1,22 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -var tests = [ - { value: '0x486565c3a4c3b6c3b6c3a4f09f9185443334c99dc9a33234d084cdbd2d2e2cc3a4c3bc2b232f', expected: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/'}, - { value: '0x6d79537472696e67', expected: 'myString'}, - { value: '0x6d79537472696e6700', expected: 'myString'}, - { value: '0x65787065637465642076616c7565000000000000000000000000000000000000', expected: 'expected value'}, - { value: '0x000000000000000000000000000000000000657870656374000065642076616c7565', expected: 'expect\u0000\u0000ed value'} -]; - -describe('lib/utils/utils', function () { - describe('hexToUtf8', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.strictEqual(utils.toUtf8(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils.toWei.js b/test/utils.toWei.js deleted file mode 100644 index ab7b6ff2b01..00000000000 --- a/test/utils.toWei.js +++ /dev/null @@ -1,59 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -describe('lib/utils/utils', function () { - describe('toWei', function () { - it('should return the correct value', function () { - - assert.equal(utils.toWei('1', 'wei'), '1'); - assert.equal(utils.toWei('1', 'kwei'), '1000'); - assert.equal(utils.toWei('1', 'Kwei'), '1000'); - assert.equal(utils.toWei('1', 'babbage'), '1000'); - assert.equal(utils.toWei('1', 'mwei'), '1000000'); - assert.equal(utils.toWei('1', 'Mwei'), '1000000'); - assert.equal(utils.toWei('1', 'lovelace'), '1000000'); - assert.equal(utils.toWei('1', 'gwei'), '1000000000'); - assert.equal(utils.toWei('1', 'Gwei'), '1000000000'); - assert.equal(utils.toWei('1', 'shannon'), '1000000000'); - assert.equal(utils.toWei('1', 'szabo'), '1000000000000'); - assert.equal(utils.toWei('1', 'finney'), '1000000000000000'); - assert.equal(utils.toWei('1', 'ether'), '1000000000000000000'); - assert.equal(utils.toWei('1', 'kether'), '1000000000000000000000'); - assert.equal(utils.toWei('1', 'grand'), '1000000000000000000000'); - assert.equal(utils.toWei('1', 'mether'), '1000000000000000000000000'); - assert.equal(utils.toWei('1', 'gether'), '1000000000000000000000000000'); - assert.equal(utils.toWei('1', 'tether'), '1000000000000000000000000000000'); - - assert.equal(utils.toWei('1', 'kwei'), utils.toWei('1', 'femtoether')); - assert.equal(utils.toWei('1', 'szabo'), utils.toWei('1', 'microether')); - assert.equal(utils.toWei('1', 'finney'), utils.toWei('1', 'milliether')); - assert.equal(utils.toWei('1', 'milli'), utils.toWei('1', 'milliether')); - assert.equal(utils.toWei('1', 'milli'), utils.toWei('1000', 'micro')); - - assert.throws(function () {utils.toWei(1, 'wei1');}, Error); - }); - - - it('should verify "number" arg is string or BN', function () { - try { - utils.toWei(1, 'wei') - assert.fail(); - } catch (error) { - assert(error.message.includes('Please pass numbers as strings or BN objects')) - } - }); - - // toWei returns string when given string, BN when given BN - it('should return the correct type', function(){ - var weiString = '1'; - var weiBN = utils.toBN(weiString); - - var bn = utils.toWei(weiBN); - - assert(utils.isBN(bn)); - assert(typeof utils.toWei(weiString) === 'string'); - }) - }); -}); diff --git a/test/utils.utf8ToHex.js b/test/utils.utf8ToHex.js deleted file mode 100644 index 0b97ccd2f39..00000000000 --- a/test/utils.utf8ToHex.js +++ /dev/null @@ -1,24 +0,0 @@ -var chai = require('chai'); -var utils = require('../packages/web3-utils'); - -var assert = chai.assert; - -var tests = [ - { value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: '0x486565c3a4c3b6c3b6c3a4f09f9185443334c99dc9a33234d084cdbd2d2e2cc3a4c3bc2b232f'}, - { value: 'myString', expected: '0x6d79537472696e67'}, - { value: 'myString\x00', expected: '0x6d79537472696e67'}, - { value: 'expected value\u0000\u0000\u0000', expected: '0x65787065637465642076616c7565'}, - { value: 'expect\u0000\u0000ed value\u0000\u0000\u0000', expected: '0x657870656374000065642076616c7565'}, - { value: '我能吞下玻璃而不伤身体。', expected: '0xe68891e883bde5909ee4b88be78ebbe79283e8808ce4b88de4bca4e8baabe4bd93e38082'}, - { value: '나는 유리를 먹을 수 있어요. 그래도 아프지 않아요', expected: '0xeb8298eb8a9420ec9ca0eba6aceba5bc20eba8b9ec9d8420ec889820ec9e88ec96b4ec9a942e20eab7b8eb9e98eb8f8420ec9584ed9484eca78020ec958aec9584ec9a94' }, -]; - -describe('lib/utils/utils', function () { - describe('utf8ToHex', function () { - tests.forEach(function (test) { - it('should turn ' + test.value + ' to ' + test.expected, function () { - assert.strictEqual(utils.utf8ToHex(test.value), test.expected); - }); - }); - }); -}); diff --git a/test/utils_methods.js b/test/utils_methods.js deleted file mode 100644 index 4fb8c676c67..00000000000 --- a/test/utils_methods.js +++ /dev/null @@ -1,19 +0,0 @@ -var u = require('./helpers/test.utils.js'); -var utils = require('../packages/web3-utils'); - -describe('utils', function() { - describe('methods', function () { - u.methodExists(utils, 'sha3'); - u.methodExists(utils, 'hexToAscii'); - u.methodExists(utils, 'asciiToHex'); - u.methodExists(utils, 'hexToNumberString'); - u.methodExists(utils, 'numberToHex'); - u.methodExists(utils, 'fromWei'); - u.methodExists(utils, 'toWei'); - u.methodExists(utils, 'toBN'); - u.methodExists(utils, 'isAddress'); - u.methodExists(utils, 'soliditySha3'); - u.methodExists(utils, 'encodePacked'); - u.methodExists(utils, 'stripHexPrefix'); - }); -}); diff --git a/test/web3_methods.js b/test/web3_methods.js deleted file mode 100644 index b06cf282eae..00000000000 --- a/test/web3_methods.js +++ /dev/null @@ -1,18 +0,0 @@ -var u = require('./helpers/test.utils.js'); -var Web3 = require('../packages/web3'); -var web3 = new Web3(); - -describe('web3', function() { - describe('methods', function () { - u.methodExists(web3, 'setProvider'); - - u.propertyExists(web3, 'givenProvider'); - - u.propertyExists(web3, 'eth'); - u.propertyExists(web3, 'bzz'); - u.propertyExists(web3, 'shh'); - - u.propertyExists(web3, 'utils'); - }); -}); - diff --git a/test/websocket.ganache.js b/test/websocket.ganache.js deleted file mode 100644 index 915847a6858..00000000000 --- a/test/websocket.ganache.js +++ /dev/null @@ -1,578 +0,0 @@ -const assert = require('assert'); -const ganache = require('ganache-cli'); -const pify = require('pify'); -const utils = require('./helpers/test.utils'); -const Web3 = utils.getWeb3(); - -describe('WebsocketProvider (ganache)', function () { - let web3; - let server; - const host = 'ws://localhost:'; - const port = 8545; - - afterEach(async function () { - // Might already be closed.. - try { - await pify(server.close)(); - } catch (err) { - } - }); - - // This test's error is fired by the request queue checker in the onClose handler - it('errors when there is no connection', async function () { - web3 = new Web3(host + 8777); - - try { - await web3.eth.getBlockNumber(); - assert.fail(); - } catch (err) { - assert(err.code, 1006); - assert(err.reason, 'connection failed'); - assert(err.message.includes('connection not open on send')); - } - }); - - it('"error" handler fires if the client closes unilaterally', async function(){ - this.timeout(5000); - - server = ganache.server({port: port}); - await pify(server.listen)(port); - - // Open and verify connection - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - await web3.eth.getBlockNumber(); - - await new Promise(async function(resolve){ - web3.currentProvider.on('close', function (err) { - assert(err.reason.includes('Connection dropped by remote peer.')); - assert(err.code === 1006); - resolve(); - }); - - await pify(server.close)(); - }) - }) - - it('"error" handler fires if Web3 disconnects with error code', async function(){ - this.timeout(5000); - - server = ganache.server({port: port}); - await pify(server.listen)(port); - - // Open and verify connection - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - await web3.eth.getBlockNumber(); - - await new Promise(async function(resolve){ - web3.currentProvider.on('close', function (err) { - assert(err.reason.includes('restart')); - assert(err.code === 1012); - resolve(); - }); - - web3.currentProvider.disconnect(1012, 'restart'); - }) - }) - - it('"error" handler *DOES NOT* fire if disconnection is clean', async function(){ - this.timeout(5000); - - server = ganache.server({port: port}); - await pify(server.listen)(port); - - // Open and verify connection - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - await web3.eth.getBlockNumber(); - - await new Promise(async function(resolve, reject){ - web3.currentProvider.once('error', function(err){ - reject('Should not fire error handler') - }); - - web3.currentProvider.disconnect(1000); - await utils.waitSeconds(2) - resolve(); - }) - }) - - it('"end" handler fires with close event object if client disconnect', async function(){ - this.timeout(5000); - - server = ganache.server({port: port}); - await pify(server.listen)(port); - - // Open and verify connection - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - await web3.eth.getBlockNumber(); - - await new Promise(async function(resolve){ - web3.currentProvider.on('close', function (err) { - assert.equal(err.type, 'close'); - assert.equal(err.wasClean, false); - resolve(); - }); - - await pify(server.close)(); - }) - }) - - it('"end" handler fires with close event object if Web3 disconnects', async function(){ - this.timeout(5000); - - server = ganache.server({port: port}); - await pify(server.listen)(port); - - // Open and verify connection - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - await web3.eth.getBlockNumber(); - - await new Promise(async function(resolve){ - web3.currentProvider.on('close', function (err) { - assert.equal(err.type, 'close'); - assert.equal(err.wasClean, true); - resolve(); - }); - - web3.currentProvider.disconnect(1000); - }) - }); - - // Here, the first error (try/caught) is fired by the request queue checker in - // the onClose handler. The second error is fired by the readyState check in .send - it('errors when requests continue after socket closed', async function () { - web3 = new Web3(host + 8777); - - try { await web3.eth.getBlockNumber(); } catch (err) { - assert(err.message.includes('connection not open on send')); - assert(err.code, 1006); - assert(err.reason, 'connection failed'); - - try { - await web3.eth.getBlockNumber(); - assert.fail(); - } catch (err){ - assert(err.message.includes('connection not open on send')); - assert(typeof err.code === 'undefined'); - assert(typeof err.reason === 'undefined'); - } - } - }); - - it('errors after client has disconnected', async function () { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - - // Verify connection and disconnect - await web3.eth.getBlockNumber(); - web3.currentProvider.disconnect(); - - try { - await web3.eth.getBlockNumber(); - assert.fail(); - } catch(err){ - assert(err.message.includes('connection not open on send')); - assert(typeof err.code === 'undefined'); - assert(typeof err.reason === 'undefined'); - } - }); - - it('can connect after being disconnected', async function () { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - - // Verify connection and disconnect - await web3.eth.getBlockNumber(); - web3.currentProvider.disconnect(); - - try { await web3.eth.getBlockNumber() } catch(e){} - - web3.currentProvider.connect(); - - // This test fails unless there's a brief delay after - // connecting again... - await new Promise(resolve => { - setTimeout(async function(){ - const blockNumber = await web3.eth.getBlockNumber(); - assert(blockNumber === 0); - resolve(); - },100) - }); - }); - - it('supports subscriptions', async function () { - assert(web3.eth.currentProvider.supportsSubscriptions()); - }); - - it('times out when connection is lost mid-chunk', async function () { - this.timeout(5000); - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {timeout: 1000} - ) - ); - - await new Promise(resolve => { - web3.currentProvider.once('error', function(err){ - assert(err.message.includes('CONNECTION TIMEOUT: timeout of 1000 ms achived')); - resolve(); - }); - - web3.currentProvider._parseResponse('abc|--|dedf'); - }); - }); - - it('manually reconnecting', function () { - this.timeout(6000); - - return new Promise(async function (resolve) { - let stage = 0; - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3(new Web3.providers.WebsocketProvider(host + port)); - - web3.currentProvider.on('connect', async function () { - if (stage === 0) { - web3.currentProvider.reconnect(); - stage = 1; - } else { - await pify(server.close)(); - this.removeAllListeners(); - resolve(); - } - }); - }); - }); - - it('calling of reconnect with auto-reconnecting activated', function () { - this.timeout(6000); - - return new Promise(async function (resolve) { - let stage = 0; - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3(new Web3.providers.WebsocketProvider( - host + port, {reconnect: {auto: true}} - ) - ); - - web3.currentProvider.on('connect', async function () { - if (stage === 0) { - web3.currentProvider.reconnect(); - stage = 1; - } else { - await pify(server.close)(); - this.removeAllListeners(); - resolve(); - } - }); - }); - }); - - it('automatically connects as soon as the WS socket of the node is running', function () { - return new Promise(async function (resolve) { - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true}} - ) - ); - - web3.currentProvider.once('connect', async function () { - await pify(server.close)(); - resolve(); - }); - - server = ganache.server({port: port}); - await pify(server.listen)(port); - }); - }); - - it('reached the max. configured attempts and throws the expected error', function () { - this.timeout(6000); - - return new Promise(async function (resolve) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, maxAttempts: 1}} - ) - ); - - web3.currentProvider.once('connect', async function () { - await pify(server.close)(); - }); - - web3.currentProvider.once('error', function (error) { - assert(error.message.includes('Maximum number of reconnect attempts reached!')); - resolve(); - }); - }); - }); - - it('errors when call is made after max. configured attempts has elapsed', function () { - this.timeout(6000); - - return new Promise(async function (resolve) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, maxAttempts: 1, delay: 1000,}} - ) - ); - - web3.currentProvider.once('connect', async function () { - await pify(server.close)(); - await utils.waitSeconds(2); - - try { - await web3.eth.getBlockNumber(); - } catch (err) { - assert(err.message.includes('connection not open on send()')); - resolve(); - } - }); - }); - }); - - it('does not auto reconnect after max. configured attempts has elapsed', function () { - this.timeout(6000); - - return new Promise(async function (resolve) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, maxAttempts: 1, delay: 1000,}} - ) - ); - - web3.currentProvider.once('connect', async function () { - // Close and then re-open server after - // reconnection window has elapsed. - await pify(server.close)(); - await utils.waitSeconds(2); - await pify(server.listen)(port); - - try { - await web3.eth.getBlockNumber(); - } catch (err){ - assert(err.message.includes('connection not open on send()')); - resolve(); - } - - }); - }); - }); - - it('allows disconnection when reconnect is enabled', function () { - this.timeout(6000); - - return new Promise(async function (resolve, reject) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, maxAttempts: 1}} - ) - ); - - web3.currentProvider.once('connect', async function () { - web3.currentProvider.disconnect(); - - try { - await web3.eth.getBlockNumber(); - assert.fail(); - } catch (err) { - await pify(server.close)(); - assert(err.message.includes('connection not open on send')); - assert(typeof err.code === 'undefined'); - assert(typeof err.reason === 'undefined'); - resolve(); - } - }); - }); - }); - - // This test fails - the logic running in reconnect timeout doesn't know about the disconnect? - it.skip('allows disconnection on lost connection, when reconnect is enabled', function () { - this.timeout(6000); - let stage = 0; - - return new Promise(async function (resolve, reject) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, maxAttempts: 1}} - ) - ); - - //Shutdown server - web3.currentProvider.on('connect', async function () { - // Stay isolated, just in case; - if (stage === 0){ - await pify(server.close)(); - web3.currentProvider.disconnect(); - stage = 1; - } - }); - - web3.currentProvider.on('error', function (error) { - assert(error.message.includes('Maximum number of reconnect attempts reached!')); - reject(new Error('Could not disconnect...')); - }); - }); - }); - - it('uses the custom configured delay on re-connect', function () { - let timeout; - this.timeout(4000); - - return new Promise(async function (resolve, reject) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, delay: 3000, maxAttempts: 1}} - ) - ); - - web3.currentProvider.once('connect', async function () { - await pify(server.close)(); - timeout = setTimeout(function () { - reject(new Error('Test Failed: Configured delay is not applied!')); - }, 3100); - }); - - web3.currentProvider.once('reconnect', function () { - clearTimeout(timeout); - resolve(); - }); - }); - }); - - - it('clears pending requests on maxAttempts failed reconnection', function () { - this.timeout(6000); - - return new Promise(async function (resolve) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, maxAttempts: 1}} - ) - ); - - web3.currentProvider.once('connect', async function () { - await pify(server.close)(); - }); - - web3.currentProvider.once('reconnect', async function () { - try { - await web3.eth.getBlockNumber(); - assert.fail(); - } catch (err) { - assert(err.message.includes('Maximum number of reconnect attempts')); - resolve(); - } - }); - }); - }); - - it('queues requests made while connection is lost / executes on reconnect', function () { - this.timeout(10000); - let stage = 0; - - return new Promise(async function (resolve) { - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - {reconnect: {auto: true, delay: 2000, maxAttempts: 5}} - ) - ); - - web3.currentProvider.on('connect', async function () { - if (stage === 0){ - await pify(server.close)(); - stage = 1; - } - }); - - setTimeout(async function(){ - assert(stage === 1); - - const deferred = web3.eth.getBlockNumber(); - - server = ganache.server({port: port}); - await pify(server.listen)(port); - - const blockNumber = await deferred; - assert(blockNumber === 0); - - web3.currentProvider.removeAllListeners(); - resolve(); - },2500); - }); - }); - - it('errors when failing to reconnect after data is lost mid-chunk', async function () { - this.timeout(7000); - server = ganache.server({port: port}); - await pify(server.listen)(port); - - web3 = new Web3( - new Web3.providers.WebsocketProvider( - host + port, - { - timeout: 1000, - reconnect: { - auto: true, - delay: 2000, - maxAttempts: 1, - onTimeout: true - } - } - ) - ); - - await new Promise(async resolve => { - web3.currentProvider.once('error', function(err){ - assert(err.message.includes('Maximum number of reconnect attempts reached')); - resolve(); - }); - - await pify(server.close)(); - web3.currentProvider._parseResponse('abc|--|dedf'); - }); - }); -}); diff --git a/tools/eslint-config-base-web3/.eslintignore b/tools/eslint-config-base-web3/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/tools/eslint-config-base-web3/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/tools/eslint-config-base-web3/.eslintrc.json b/tools/eslint-config-base-web3/.eslintrc.json new file mode 100644 index 00000000000..715a12f1966 --- /dev/null +++ b/tools/eslint-config-base-web3/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "./ts.js" +} diff --git a/tools/eslint-config-base-web3/.gitignore b/tools/eslint-config-base-web3/.gitignore new file mode 100644 index 00000000000..40b878db5b1 --- /dev/null +++ b/tools/eslint-config-base-web3/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/tools/eslint-config-base-web3/.npmignore b/tools/eslint-config-base-web3/.npmignore new file mode 100644 index 00000000000..12178debbf9 --- /dev/null +++ b/tools/eslint-config-base-web3/.npmignore @@ -0,0 +1,13 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log diff --git a/tools/eslint-config-base-web3/.prettierignore b/tools/eslint-config-base-web3/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/tools/eslint-config-base-web3/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/tools/eslint-config-base-web3/CHANGELOG.md b/tools/eslint-config-base-web3/CHANGELOG.md new file mode 100644 index 00000000000..dc93264a3e0 --- /dev/null +++ b/tools/eslint-config-base-web3/CHANGELOG.md @@ -0,0 +1,36 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + diff --git a/tools/eslint-config-base-web3/package.json b/tools/eslint-config-base-web3/package.json new file mode 100644 index 00000000000..d8487f9f237 --- /dev/null +++ b/tools/eslint-config-base-web3/package.json @@ -0,0 +1,51 @@ +{ + "name": "eslint-config-base-web3", + "version": "0.1.0", + "description": "Base eslint config for Web3 project.", + "author": "ChainSafe Systems", + "private": true, + "license": "LGPL-3.0", + "keywords": [ + "eslint", + "ethereum", + "eth", + "web3", + "web3js", + "web3.js", + "blockchain" + ], + "homepage": "https://github.com/ChainSafe/web3.js#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/ChainSafe/web3.js.git" + }, + "bugs": { + "url": "https://github.com/ChainSafe/web3.js/issues" + }, + "engines": { + "node": ">=12", + "npm": ">=6.12.0" + }, + "main": "ts.js", + "scripts": { + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'" + }, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-jest": "^26.6.0", + "eslint-plugin-tsdoc": "^0.2.16", + "eslint-plugin-no-null": "^1.0.2" + }, + "devDependencies": { + "eslint-plugin-deprecation": "^1.3.2", + "eslint-plugin-header": "^3.1.1", + "typescript": "^4.7.4" + } +} diff --git a/tools/eslint-config-base-web3/ts-jest.js b/tools/eslint-config-base-web3/ts-jest.js new file mode 100644 index 00000000000..5de10d25add --- /dev/null +++ b/tools/eslint-config-base-web3/ts-jest.js @@ -0,0 +1,57 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +module.exports = { + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'jest', 'header', 'no-null'], + extends: ['./ts', 'plugin:jest/recommended', 'plugin:jest/style'], + env: { + 'jest/globals': true, + }, + rules: { + 'require-extensions/require-extensions': 'off', + 'jest/valid-title': ['error'], + 'jest/no-conditional-expect': ['error'], + 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], + 'jest/consistent-test-it': ['error'], + 'class-methods-use-this': ['error'], + '@typescript-eslint/no-magic-numbers': 'off', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/no-require-imports': ['error'], + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-call': ['error'], + '@typescript-eslint/no-unsafe-return': ['error'], + '@typescript-eslint/no-empty-function': ['error'], + '@typescript-eslint/ban-types': [ + 'error', + { + types: { + null: "Use 'undefined' instead of 'null'", + }, + }, + ], + '@typescript-eslint/require-await': ['warn'], + '@typescript-eslint/restrict-template-expressions': ['warn'], + 'dot-notation': 'off', + 'lines-between-class-members': 'off', + 'arrow-body-style': 'off', + 'no-underscore-dangle': 'off', + 'no-null/no-null': ['error'], + }, +}; diff --git a/tools/eslint-config-base-web3/ts.js b/tools/eslint-config-base-web3/ts.js new file mode 100644 index 00000000000..43584483178 --- /dev/null +++ b/tools/eslint-config-base-web3/ts.js @@ -0,0 +1,145 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const license = [ + '', + 'This file is part of web3.js.', + '', + 'web3.js is free software: you can redistribute it and/or modify', + 'it under the terms of the GNU Lesser General Public License as published by', + 'the Free Software Foundation, either version 3 of the License, or', + '(at your option) any later version.', + '', + 'web3.js 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 Lesser General Public License for more details.', + '', + 'You should have received a copy of the GNU Lesser General Public License', + 'along with web3.js. If not, see .', + '', +]; + +module.exports = { + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + 'header', + 'deprecation', + 'eslint-plugin-tsdoc', + 'no-null', + 'require-extensions', + ], + extends: [ + 'airbnb-base', + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'prettier', + 'plugin:import/errors', + 'plugin:import/warnings', + 'plugin:import/typescript', + ], + rules: { + 'require-extensions/require-extensions': 'error', + 'deprecation/deprecation': 'error', + 'header/header': [2, 'block', license, 1], + 'class-methods-use-this': ['error'], + 'no-unused-expressions': ['error'], + 'no-continue': 'off', + 'no-underscore-dangle': 'off', + 'import/prefer-default-export': 'off', + 'lines-between-class-members': 'off', + 'no-use-before-define': ['error'], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': ['error'], + 'no-console': ['error', { allow: ['error', 'info', 'warn'] }], + '@typescript-eslint/no-floating-promises': ['error'], + '@typescript-eslint/prefer-for-of': ['error'], + '@typescript-eslint/consistent-type-assertions': ['error'], + '@typescript-eslint/explicit-member-accessibility': ['error'], + '@typescript-eslint/member-delimiter-style': ['error'], + '@typescript-eslint/member-ordering': [ + 'error', + { default: ['public-static-field', 'public-instance-method'] }, + ], + '@typescript-eslint/no-extraneous-class': ['error'], + '@typescript-eslint/no-unnecessary-boolean-literal-compare': ['error'], + '@typescript-eslint/no-unnecessary-qualifier': ['error'], + '@typescript-eslint/no-unnecessary-type-arguments': ['error'], + '@typescript-eslint/prefer-function-type': ['error'], + '@typescript-eslint/prefer-includes': ['error'], + '@typescript-eslint/prefer-nullish-coalescing': ['error'], + '@typescript-eslint/prefer-optional-chain': ['error'], + '@typescript-eslint/prefer-readonly': ['error'], + '@typescript-eslint/prefer-reduce-type-parameter': ['error'], + '@typescript-eslint/prefer-string-starts-ends-with': ['error'], + '@typescript-eslint/prefer-ts-expect-error': ['error'], + '@typescript-eslint/promise-function-async': ['error'], + '@typescript-eslint/require-array-sort-compare': ['error'], + '@typescript-eslint/switch-exhaustiveness-check': ['error'], + '@typescript-eslint/type-annotation-spacing': ['error'], + // Multiple constructors are more readable + '@typescript-eslint/unified-signatures': 'off', + '@typescript-eslint/no-unused-expressions': ['error'], + '@typescript-eslint/no-useless-constructor': ['error'], + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/ban-types': [ + 'error', + { + types: { + null: "Use 'undefined' instead of 'null'", + }, + }, + ], + '@typescript-eslint/no-unused-vars': 'warn', + 'import/extensions': [ + 'error', + 'ignorePackages', + { + js: 'never', + jsx: 'never', + ts: 'never', + tsx: 'never', + }, + ], + 'no-await-in-loop': ['error'], + 'no-restricted-syntax': [ + 'error', + { + selector: 'ForInStatement', + message: + 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.', + }, + { + selector: 'LabeledStatement', + message: + 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.', + }, + { + selector: 'WithStatement', + message: + '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.', + }, + ], + 'no-null/no-null': ['error'], + 'tsdoc/syntax': 'warn', + }, + globals: { + BigInt: true, + }, +}; diff --git a/tools/web3-packagetemplate/.eslintignore b/tools/web3-packagetemplate/.eslintignore new file mode 120000 index 00000000000..94760d2888d --- /dev/null +++ b/tools/web3-packagetemplate/.eslintignore @@ -0,0 +1 @@ +../../templates/.eslintignore.tmpl \ No newline at end of file diff --git a/tools/web3-packagetemplate/.eslintrc.js b/tools/web3-packagetemplate/.eslintrc.js new file mode 100644 index 00000000000..12a507e5126 --- /dev/null +++ b/tools/web3-packagetemplate/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.esm.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/tools/web3-packagetemplate/.gitignore b/tools/web3-packagetemplate/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/web3-packagetemplate/.npmignore b/tools/web3-packagetemplate/.npmignore new file mode 120000 index 00000000000..8a0be70f3ed --- /dev/null +++ b/tools/web3-packagetemplate/.npmignore @@ -0,0 +1 @@ +../../templates/.npmignore.tmpl \ No newline at end of file diff --git a/tools/web3-packagetemplate/.npmrc b/tools/web3-packagetemplate/.npmrc new file mode 120000 index 00000000000..5cc817c4313 --- /dev/null +++ b/tools/web3-packagetemplate/.npmrc @@ -0,0 +1 @@ +../../templates/.npmrc.tmpl \ No newline at end of file diff --git a/tools/web3-packagetemplate/.prettierignore b/tools/web3-packagetemplate/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/tools/web3-packagetemplate/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/tools/web3-packagetemplate/.prettierrc.json b/tools/web3-packagetemplate/.prettierrc.json new file mode 120000 index 00000000000..00ecd510aaf --- /dev/null +++ b/tools/web3-packagetemplate/.prettierrc.json @@ -0,0 +1 @@ +../../templates/.prettierrc.json.tmpl \ No newline at end of file diff --git a/tools/web3-packagetemplate/CHANGELOG.md b/tools/web3-packagetemplate/CHANGELOG.md new file mode 100644 index 00000000000..3366ab50bbd --- /dev/null +++ b/tools/web3-packagetemplate/CHANGELOG.md @@ -0,0 +1,49 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [1.1.1-rc.1] + +### Added + +- Added source files (#5956) +- Added hybrid build (ESM and CJS) of library (#5904) + +## [1.1.1] + +- Stable release + +## [Unreleased] diff --git a/tools/web3-packagetemplate/README.md b/tools/web3-packagetemplate/README.md new file mode 100644 index 00000000000..4fe1e0036b6 --- /dev/null +++ b/tools/web3-packagetemplate/README.md @@ -0,0 +1,59 @@ +

+ web3.js +

+ +# web3.js - Package Template + +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] + +This is a sub-package of [web3.js][repo]. + +`web3-packagetemplate` contains the ideal setup for a Web3.js package. + +## Installation + +You can install the package either using [NPM](https://www.npmjs.com/package/web3-packagetemplate) or using [Yarn](https://yarnpkg.com/package/web3-packagetemplate) + +### Using NPM + +```bash +npm install web3-packagetemplate +``` + +### Using Yarn + +```bash +yarn add web3-packagetemplate +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/tools/web3-packagetemplate +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=tools%2Fweb3-packagetemplate%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-packagetemplate +[downloads-image]: https://img.shields.io/npm/dm/web3-packagetemplate?label=npm%20downloads diff --git a/tools/web3-packagetemplate/assets/logo/web3js.ai b/tools/web3-packagetemplate/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/tools/web3-packagetemplate/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/tools/web3-packagetemplate/assets/logo/web3js.jpg b/tools/web3-packagetemplate/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/tools/web3-packagetemplate/assets/logo/web3js.jpg differ diff --git a/tools/web3-packagetemplate/assets/logo/web3js.svg b/tools/web3-packagetemplate/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/tools/web3-packagetemplate/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/tools/web3-packagetemplate/package.json b/tools/web3-packagetemplate/package.json new file mode 100644 index 00000000000..a329ede3dfe --- /dev/null +++ b/tools/web3-packagetemplate/package.json @@ -0,0 +1,50 @@ +{ + "name": "web3-packagetemplate", + "version": "1.1.1", + "description": "Package template for Web3 4.x.x", + "main": "lib/index.js", + "repository": "https://github.com/ChainSafe/web3.js", + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "concurrently --kill-others-on-fail \"yarn:build:*(!check)\"", + "build:cjs": "tsc --build tsconfig.cjs.json", + "build:esm": "tsc --build tsconfig.esm.json", + "build:types": "tsc --build tsconfig.types.json", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:coverage:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js", + "test:integration": "jest --config=./test/integration/jest.config.js --passWithNoTests" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4" + } +} diff --git a/tools/web3-packagetemplate/src/errors.ts b/tools/web3-packagetemplate/src/errors.ts new file mode 100644 index 00000000000..303b68944fe --- /dev/null +++ b/tools/web3-packagetemplate/src/errors.ts @@ -0,0 +1,16 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ diff --git a/tools/web3-packagetemplate/src/index.ts b/tools/web3-packagetemplate/src/index.ts new file mode 100644 index 00000000000..303b68944fe --- /dev/null +++ b/tools/web3-packagetemplate/src/index.ts @@ -0,0 +1,16 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ diff --git a/tools/web3-packagetemplate/src/types.ts b/tools/web3-packagetemplate/src/types.ts new file mode 100644 index 00000000000..303b68944fe --- /dev/null +++ b/tools/web3-packagetemplate/src/types.ts @@ -0,0 +1,16 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ diff --git a/tools/web3-packagetemplate/test/.eslintrc.js b/tools/web3-packagetemplate/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/tools/web3-packagetemplate/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/tools/web3-packagetemplate/test/config/jest.config.js b/tools/web3-packagetemplate/test/config/jest.config.js new file mode 120000 index 00000000000..b875b48129d --- /dev/null +++ b/tools/web3-packagetemplate/test/config/jest.config.js @@ -0,0 +1 @@ +../../../../templates/jest.config.js.tmpl \ No newline at end of file diff --git a/tools/web3-packagetemplate/test/config/setup.js b/tools/web3-packagetemplate/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/tools/web3-packagetemplate/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/tools/web3-packagetemplate/test/integration/jest.config.js b/tools/web3-packagetemplate/test/integration/jest.config.js new file mode 100644 index 00000000000..1d95890206a --- /dev/null +++ b/tools/web3-packagetemplate/test/integration/jest.config.js @@ -0,0 +1,33 @@ +'use strict'; + +const base = require('../config/jest.config'); + +module.exports = { + ...base, + setupFilesAfterEnv: ['/test/integration/setup.js'], + testMatch: ['/test/integration/**/*.(spec|test).(js|ts)'], + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, + coverageDirectory: '.coverage/integration', +}; diff --git a/tools/web3-packagetemplate/test/integration/setup.js b/tools/web3-packagetemplate/test/integration/setup.js new file mode 100644 index 00000000000..5be1bccf7cc --- /dev/null +++ b/tools/web3-packagetemplate/test/integration/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('../config/setup'); + +const jestTimeout = 15000; + +jest.setTimeout(jestTimeout); diff --git a/tools/web3-packagetemplate/test/tsconfig.json b/tools/web3-packagetemplate/test/tsconfig.json new file mode 120000 index 00000000000..c73c54e77b4 --- /dev/null +++ b/tools/web3-packagetemplate/test/tsconfig.json @@ -0,0 +1 @@ +../../../templates/test/tsconfig.json.tmpl \ No newline at end of file diff --git a/tools/web3-packagetemplate/test/unit/constructor.test.ts b/tools/web3-packagetemplate/test/unit/constructor.test.ts new file mode 100644 index 00000000000..5d08d50bebc --- /dev/null +++ b/tools/web3-packagetemplate/test/unit/constructor.test.ts @@ -0,0 +1,37 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// import Web3ProviderBase from '../../src/index' +// import {ProviderOptions} from '../../types' + +describe('constructs a PLACEHOLDER instance with expected properties', () => { + // let providerOptions: ProviderOptions + + beforeEach(() => { + // providerOptions = { + // providerUrl: 'http://127.0.0.1:8545' + // } + }); + + it('should construct with expected properties', () => { + // const web3ProviderBase = new Web3ProviderBase(providerOptions) + // expect(web3ProviderBase).toMatchObject({ + // _providerUrl: providerOptions.providerUrl + // }) + expect(true).toBeTruthy(); + }); +}); diff --git a/tools/web3-packagetemplate/test/unit/jest.config.js b/tools/web3-packagetemplate/test/unit/jest.config.js new file mode 100644 index 00000000000..ceac341e332 --- /dev/null +++ b/tools/web3-packagetemplate/test/unit/jest.config.js @@ -0,0 +1,9 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '.coverage/unit', + collectCoverageFrom: ['src/**'], +}; diff --git a/tools/web3-packagetemplate/tsconfig.cjs.json b/tools/web3-packagetemplate/tsconfig.cjs.json new file mode 120000 index 00000000000..f8b17044cd5 --- /dev/null +++ b/tools/web3-packagetemplate/tsconfig.cjs.json @@ -0,0 +1 @@ +../../config/tsconfig.cjs.json \ No newline at end of file diff --git a/tools/web3-packagetemplate/tsconfig.esm.json b/tools/web3-packagetemplate/tsconfig.esm.json new file mode 120000 index 00000000000..f5fab722b38 --- /dev/null +++ b/tools/web3-packagetemplate/tsconfig.esm.json @@ -0,0 +1 @@ +../../config/tsconfig.esm.json \ No newline at end of file diff --git a/tools/web3-packagetemplate/tsconfig.types.json b/tools/web3-packagetemplate/tsconfig.types.json new file mode 120000 index 00000000000..c67a7816f18 --- /dev/null +++ b/tools/web3-packagetemplate/tsconfig.types.json @@ -0,0 +1 @@ +../../config/tsconfig.types.json \ No newline at end of file diff --git a/tools/web3-packagetemplate/tsdoc.json b/tools/web3-packagetemplate/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/tools/web3-packagetemplate/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/tools/web3-plugin-example/.eslintignore b/tools/web3-plugin-example/.eslintignore new file mode 100644 index 00000000000..a40b49b7ba2 --- /dev/null +++ b/tools/web3-plugin-example/.eslintignore @@ -0,0 +1,5 @@ +dist +lib +jest.config.js +webpack.config.js +.eslintrc.js diff --git a/tools/web3-plugin-example/.eslintrc.js b/tools/web3-plugin-example/.eslintrc.js new file mode 100644 index 00000000000..8b7fd410b8d --- /dev/null +++ b/tools/web3-plugin-example/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/tools/web3-plugin-example/.gitignore b/tools/web3-plugin-example/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/web3-plugin-example/.npmignore b/tools/web3-plugin-example/.npmignore new file mode 100644 index 00000000000..0b1a9d71c23 --- /dev/null +++ b/tools/web3-plugin-example/.npmignore @@ -0,0 +1,26 @@ +.babelrc +.eslintignore +.eslintrc.json +.eslintrc.js +.gitignore +.lintstagedrc.json +.nycrc +.prettierrc.json +.prettierignore +cypress.json +index.html +Jenkinsfile* +*.log + +.nyc_output/ +coverage/ +benchmark/ +.coverage/ +cypress/ +fixtures/ +tmp/ +logs/ +test/ +scripts/ +browsertest/ +examples/ diff --git a/tools/web3-plugin-example/.prettierignore b/tools/web3-plugin-example/.prettierignore new file mode 120000 index 00000000000..044e4a3df69 --- /dev/null +++ b/tools/web3-plugin-example/.prettierignore @@ -0,0 +1 @@ +../../templates/.prettierignore.tmpl \ No newline at end of file diff --git a/tools/web3-plugin-example/.prettierrc.json b/tools/web3-plugin-example/.prettierrc.json new file mode 100644 index 00000000000..7b23ef55098 --- /dev/null +++ b/tools/web3-plugin-example/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all", + "useTabs": true, + "arrowParens": "avoid" +} diff --git a/tools/web3-plugin-example/CHANGELOG.md b/tools/web3-plugin-example/CHANGELOG.md new file mode 100644 index 00000000000..65e4434200c --- /dev/null +++ b/tools/web3-plugin-example/CHANGELOG.md @@ -0,0 +1,91 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + + +## [0.1.0-alpha.1] + +### Added + +- Example plugin for wrapping contract methods to provide custom functionality (#5393) +- Example plugin for custom RPC methods using the `requestManager` (#5393) + +## [0.1.0-alpha.2] + +### Changed + +- Updated dependencies (#5725) + +## [1.0.0-rc.0] + +### Changed + +- Updated dependencies + +## [1.0.0-rc.1] + +### Added + +- Added source files (#5956) + +## [1.0.0] + +- Stable release + +## [1.0.1] + +### Changed + +- Dependencies updated + +## [1.0.2] + +### Changed + +- Dependencies updated + +## [1.0.4] + +### Changed + +- Dependencies updated + +## [1.0.6] + +### Changed + +- Dependencies updated + +## [Unreleased] \ No newline at end of file diff --git a/tools/web3-plugin-example/README.md b/tools/web3-plugin-example/README.md new file mode 100644 index 00000000000..f06e2d7d065 --- /dev/null +++ b/tools/web3-plugin-example/README.md @@ -0,0 +1,57 @@ +

+ web3.js +

+ +# Web3 Plugin Example + +![ES Version](https://img.shields.io/badge/ES-2020-yellow) +![Node Version](https://img.shields.io/badge/node-14.x-green) +[![NPM Package][npm-image]][npm-url] +[![Downloads][downloads-image]][npm-url] + +This is an example of a plugin implementation for [web3.js][repo]. + +## Installation + +You can install the package either using [NPM](https://www.npmjs.com/package/web3-plugin-example) or using [Yarn](https://yarnpkg.com/package/web3-plugin-example) + +### Using NPM + +```bash +npm install web3-plugin-example +``` + +### Using Yarn + +```bash +yarn add web3-plugin-example +``` + +## Getting Started + +- :writing_hand: If you have questions [submit an issue](https://github.com/ChainSafe/web3.js/issues/new) or join us on [Discord](https://discord.gg/yjyvFRP) + ![Discord](https://img.shields.io/discord/593655374469660673.svg?label=Discord&logo=discord) + +## Prerequisites + +- :gear: [NodeJS](https://nodejs.org/) (LTS/Fermium) +- :toolbox: [Yarn](https://yarnpkg.com/)/[Lerna](https://lerna.js.org/) + +## Package.json Scripts + +| Script | Description | +| ---------------- | -------------------------------------------------- | +| clean | Uses `rimraf` to remove `dist/` | +| build | Uses `tsc` to build package and dependent packages | +| lint | Uses `eslint` to lint package | +| lint:fix | Uses `eslint` to check and fix any warnings | +| format | Uses `prettier` to format the code | +| test | Uses `jest` to run unit tests | +| test:integration | Uses `jest` to run tests under `/test/integration` | +| test:unit | Uses `jest` to run tests under `/test/unit` | + +[docs]: https://docs.web3js.org/ +[repo]: https://github.com/web3/web3.js/tree/4.x/tools/web3-plugin-example +[npm-image]: https://img.shields.io/github/package-json/v/web3/web3.js/4.x?filename=tools%2Fweb3-plugin-example%2Fpackage.json +[npm-url]: https://npmjs.org/package/web3-plugin-example +[downloads-image]: https://img.shields.io/npm/dm/web3-plugin-example?label=npm%20downloads diff --git a/tools/web3-plugin-example/assets/logo/web3js.ai b/tools/web3-plugin-example/assets/logo/web3js.ai new file mode 100644 index 00000000000..669ef50e7cd --- /dev/null +++ b/tools/web3-plugin-example/assets/logo/web3js.ai @@ -0,0 +1,1516 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R 6 0 R 29 0 R 30 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Print + + + + + 2017-01-27T15:51:37Z + 2017-01-27T15:51:37Z + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7F+an5hy6Ov6F0qTjqMq VubhTvCjDYL4Ow3r2Hz2IQ8x8teevMXl+cvaXBlgdi01pMS8Tk7k0rUMfFTXCr2Xyl+Z/l/X+FvI 31DUWoPqszCjn/iuTYN8tj7YKSzDArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir5W1nUptU1a71CYkvdSvKa9gx2H0DbJIQeKtqrMwVQWZjRVG5JPYY q+ify70jzPpujKmvXrTu4BgtX+NoFp9lpDuT/k9BgKWV4FdirsVdirsVdirsVdirsVdirsVdirsV U57m2t053EqQp/NIwUfecjKQHM0yhCUjQFpZL5v8qxNxfV7OvQgTxtSnjQnKDrMI/jj83Kj2dqDy xz+RaTzl5TduK6vaV95kX8SRiNbhP8cfmk9m6gf5OXyKZ215aXSc7aeOdP5o2Vx96k5fGcZcjbiz xyhtIEe9VyTB2KuxV2KuxV2KuxV2KuxV2KuxV8lZJDsVejfkt5biv9Zn1a4TlFpoX0ARsZ3rRv8A YKCfmRgKh7fgS7FUDrOuaVotk17qVwtvbqaAtUlmP7KqKsx+WKqunanp+pWqXdhcJc27/ZkjNR8j 4H2OKonFXYq7FXYq7FXYq7FXEgCp2AxVhPmT81tA0pmgsv8AcldrsREwEKn3k3r/ALEHNVqe1seP aPqP2fN3ui7BzZd5+iPnz+X63nWr/mf5u1FmC3X1GE9IrUemR/s93/4bNLm7UzT68I8vxb0un7D0 2P8Ah4j/AEt/s5MXnuLi4kMlxK80h6vIxZj9JzAlIk2TbtYQjEUBQU8iydiq+KaaGQSQu0ci/ZdC VI+RGSEiDYRKIkKIsMq0T8z/ADXpjKslx9fgHWK6q5p7Sfb+8nM/B2pmhzPEPP8AW6jU9h6fLyHA f6P6uT07yv8AmVoGuMlu7fUb9qAW8xHFj4RvsG+Wx9s32l7Tx5dvpl3F5bXdi5sHqHqh3j9IZZmx dO7FXYq7FXYq7FXYq7FXYq+Sskh2Kvb/AMjEUeVrx6fE186k+ywxEf8AEsBUPRsCVO5uIba3luJ2 CQwo0krnoFUVY/QBir5s85ebL3zLrEl3MxW1QlbO2rtHH/zU3Vj/AApkkILQ/MOs6HdC50y5e3fb mo3RwOzofhYYq9g8pfnFpOo8LXWlXTrw7Cev+jufmd4/9lt74KW3oaOrqHQhkYAqwNQQehBwJbxV 2KuxV2Ksf8zeedB8voUupfVvKVWzio0m/Tl2UfPMPVa7Hh5m5dzsdD2Xm1H0io955fteQeaPzD17 Xy8LP9U089LSEkAj/ixur/q9s5vVdo5M23KPd+t7PQ9j4dPvXFPvP6O5i+a92rsVdiqZ2HljzFfo JLPTbiaNvsyLG3A/7Ijj+OZGPS5Z/TEn4OLl12HGalOIPvdqHlrzBpyGS9064giHWVo24D/ZAcfx wZNNkhvKJC4dbhyGoTiT70syhynYq7FXonkT8z7mxkj07W5TNYGixXbVMkPhyPVk/EZutB2oYHhy G49/c832r2HHIDPEKn3dD+17EjpIiyRsHRwGR1NQQdwQRnSg28WQQaLeFDsVdirsVdirsVdir5Ky SHYq9x/I3/lErv8A5j5P+TMOAqHomBLE/wA1LuS28i6kYzRpRHFX2eVQ33rUYQr52wodirI/I/ky 880ap9XRjDZQUe8uaV4qTsq/5TdsVfQ+k6TYaTp8On2MfpWsAoi1JO+5JJ6knIpReKuxVA6xruk6 Pam51K5S3i/ZDbsx8EUfEx+WU5s8MQuRpyNNpcmaXDAWXk/mn83NTvudtoqtYWpqDcGnrsPYjaP6 N/fOe1Xa857Y/SPt/Y9doPZ7Hj9WX1y7un7fxswB3d3LuxZ2NWYmpJPck5pybeiAAFBbgS7FU68u +UNc8wTcbCA+ippJdSfDEvzbufYVOZWm0eTMfSNu/o4Ws7Rxaces793V655W/LHQtFCT3KjUL8UP qygemh/yI9x9JqflnR6XsvHi3Pqk8br+3M2faPoh5c/iWY5s3SuIBFDuDiryb82vKGk2FtFrNii2 0kswhuIF2Ryylg6r2Pw7065zva+jhADJHbd7D2f7RyZJHFP1ACwXmOaF6l2KuxVm/lb81NT0TT4t PmtUvbaEkRFnKSKpNePKjCg7bZtdL2rPFERI4gHRa7sHHnmZiXDI/JnOkfm75XvWWO69XT5TtWVe Udf9dK/iBm2w9sYpbG4uh1Hs9qIbxqY8ufyLMrW7tbuBZ7WZJ4X3WWNgyn5EbZs4zEhYNh0k8coG pCj5quSYOxV2KuxV2KvkrJIdir3H8jf+USu/+Y+T/kzDgKh6JgSwz83v+UFvf+MkH/J1cIUvn3Ch 2Kvoj8rdGi0zydZMFpNfD61M3c+p9j7k44ClluBXYq8288fm5BplxJpuiqtxdxkrPdNvHGw2KqP2 2HfsPfIZYzMTwECXm24JYxMeICY9aeU3+q32qXLXd7cPczv1kc1NPADsPYZxusxZoz/e3fe+i9nZ tPPHWGqHTr8f1ofMRz3YqitN0vUdTultbC3e5nboiCtB4k9APc5ZixSmaiLLVmzwxR4pnhD1Pyt+ T9rb8LrX3FxKKEWUZIiH+u2xb5Db550Gk7HA3ybnueT1/tFKXpwjhH848/h3fjk9Hgggt4UggjWK GMcY40AVVA7ADYZu4xAFDYPMzmZGybJX4WLsVSDzN530Hy+hW7m9S7IqlnFRpD4V7KPdvormHqtd jw/Ud+52Oi7Lzag+kVHvPL9rxfzf5z1LzLdrJcAQ2kVfq9opJVa/tE/tMfHOX1mtlnlZ2A5B7fs7 s2GljQ3keZ/HRj+YbsXYq7FXYq7FUfpGvavo9wJ9Ount3rVgp+BvZkPwt9Iy7DqJ4zcTTj6jSY8w qcQXqvlT827C+KWmtqtldHZbla+gx/yq7x/Tt7jOh0na8Z7ZPSe/p+x5LX+z88fqxeqPd1/a9DBD AEGoO4I6UzcvNuxV2KuxV8lZJDsVe4/kb/yiV3/zHyf8mYcBUPRMCWGfm9/ygt7/AMZIP+Tq4Qpf PuFDsVfT/lD/AJRLRP8AmAtf+TK5FKbYqw780/M82heWmW1bhe37fV4XGxRaVkcfJdh7nCFfPeFD asymoNDkJ44zFSFhniyyxy4omiERBK0jrGFJkYhVCipJOwAAzQ6vsXri+X6j+t6rQe0f8Ocf5w/S P1fJ6R5W/KLUb3hc62zWNsdxbCnrsPfqE+nf2yjS9jylvk9I7urk672hhD04vVLv6fteraRomlaP ai1063S3iFOXEfExHd2O7H550OHBDGKiKeS1GqyZpcUzZR2WuO7FUDq+t6Vo9qbrUblLeL9nkfiY jsij4mPyyrNnhjFyNN+n0uTNLhgLLynzT+buo3vO20RTZWx2Ny1PXYe1Nk+jf3zntV2xKW2P0jv6 /seu0Hs9CHqy+qXd0/a8+kkkkdpJGLu5LM7GpJPUknNMTe5ejAAFBbgS7FU20Lyrr2uOV020aVFN HmNEjX5u1BX265k4NJky/SHE1Wvw4B65V5dfky+D8lNcaMGe/to3/lUO4+8hc2UexMlbyDpZe02I HaMj8kr1r8q/NOmxNPHGl/Cu7G2JZwPeNgrH/Y1zHz9lZoCx6h5OXpu3tPlNEmB8/wBf62HkEEgi hGxBzWu6awK7FWe/l3+YVxpNxFpepyGTSpCEjkY1MBPQg/yeI7dRm37O7ROMiE/o+79jz/bHY4zA 5MY/eD/Zfte1Agio3BzqXhnYq7FXyVkkOxV7j+Rv/KJXf/MfJ/yZhwFQ9EwJYZ+b3/KC3v8Axkg/ 5OrhCl8+4UOxV9P+UP8AlEtE/wCYC1/5MrkUptiryD8+nb6xoyV+EJcED3Jjr+rCEF5ThV2Kvbvy o8h2+n2EOu38YfUbpedqrD+5iYfCQP53G9ew28cBV6PgS7FVk88FvC888ixQxjlJI5CqoHck7DBK QAs7BlCBkaAsl5x5p/OC1t+droCC4lFQb2QERD/UXYt8zt880mr7YA2x7nvem0Hs7KXqzHhH80c/ j3fjk8s1LVNR1O6a6v7h7m4bq7mtB4AdFHsM5/LllkNyNl6zDghijwwHCELlba7FUVp2mahqV0tr YW73Nw3SOMVNPE9gPc5ZjxSmaiLLVmzwxR4pnhD1Hyt+T1vDwutfcTSbEWURogP+W43b5Db55v8A S9jgb5N/J5TX+0Uj6cIofzjz+AekW9vBbQpBbxrDDGKJFGAqqPAAbDN5GIiKGweYnMyNyNlUwsXY q8L/ADZXS182v9RCiX0kN8E6evU1/wBlw41/rXOT7WEPG9Pdv73vuwDk/LDj5X6fd/bbDM1bu3Yq 7FX0R5CuprnyfpcszFpPR4Fj1IjYotfoXO00EjLBEnufNu1oCOpmByv790/zMde7FXyVkkOxV7j+ Rv8AyiV3/wAx8n/JmHAVD0TAlhn5vf8AKC3v/GSD/k6uEKXz7hQ7FX0/5Q/5RLRP+YC1/wCTK5FK bYq8f/Pn/evR/wDjHP8A8STCEF5VhVHaDZpfa5p1lJ/d3V1DC/ykkCn9eKvqcAKAqigGwA6AZFLs VdirHPOfk2HzLaJGbuW2mhqYuJLRE/5cdaH5jfMLW6IZ41ZBHy+Ts+ze0jpZXwiQPz+BeK+YvKGu 6BLxv4D6JNI7qP4om+Tdj7GhzltTo8mE+obd/R7jR9o4tQPQd+7qkuYrnLkR3cIilnY0VQKkk9gB hAtBIAss/wDK35R6nfcLnWmawtTuIBT6ww9wdk+nf2zcaXsic98npH2/sed1/tDjx+nF65d/8P7f xu9X0fQtJ0a1FtptstvF1YjdmPi7H4mPzzocOCGIVEU8jqdVkzS4pmyj8ucd2KoLVta0vSLU3Wo3 KW8I6FjuxHZVHxMfYZVmzQxi5Gg36fTZM0uGAsvKvNP5vahec7bQ0NlbHY3TUM7D/J6hPxPuM5/V dsSltj9I7+v7HrtB7PQh6svql3dP2vO2ZnYsxLMxqzHcknqSc0pL0gFNYFdiqe+VfKGq+Yr1YrZC lorD6zeMPgRe/wDrNTov8My9Jo55pUOXUuBr+0cemhcj6ug7/wBnm+g7Cxt7CygsrZeMFuixxjvx UUFffOyxwEIiI5B85y5ZZJmUuZNq+Ta3Yq+UL62a1vbi2b7UEjxmvijFfbwySFHFXuP5G/8AKJXf /MfJ/wAmYcBUPRMCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2KvH/AM+f 969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxVZPBBcQvBPGssMg4yRuAy sD2IOxwSiCKO4ZQmYmwaIee+YPyc027uBPpFx9QDt+9gcGSMA9Sm4Yf6tafLNNqOxoyNwPC9HpPa OcI1kHH58j8WSeWfI2g+X0DW0XrXlKNeS0aT349lHyzO0ugx4eQuXe6zW9qZtQfUaj3Dl+1kOZjr XYqsmmhgieaZ1iiQcnkchVUDuSdhglIAWeTKMTI0BZedeafzfs7bna6Cgup+hvJAREv+ouxf8B88 0mq7YjHbHue/o9LoPZ2UvVm9I7uv7Hlep6tqWqXTXWoXD3E7ftOeg8FHRR7DNBlzSyG5Gy9Zg08M UeGAoITKm52KonT9Nv8AUbpbWxge4uH+zHGKn5nwHucsx45TNRFlqzZoY48UzQeoeVvyegj4XXmB /Vk6ixiNEH/GRxu3yX7zm+0vYwG+T5PK6/2jJ9OEV/SP6B+t6VbW1vbQJBbRJDBGKJFGoVVHgANs 3kYiIoCg8vOcpG5GyVTJMXYq7FXzl+ZumHT/ADrqSUolw4uUPj6w5sf+DLDJBDF8Ve0fkTeI+ial ZV+OG5ExHeksYUf8msBUPTcCWGfm9/ygt7/xkg/5OrhCl8+4UOxV9P8AlD/lEtE/5gLX/kyuRSm2 KvH/AM+f969H/wCMc/8AxJMIQXlWFU28of8AKW6J/wAx9r/yeXFX0/kUuxV2KuxV2KuxV2KuxViP mr8ytD0IvbRH69qK7G3jPwof+LH3A+Qqc12r7Sx4dvql3frdx2f2Ll1FSPph3/qDyHzH5x13zBLW +nItwax2kfwxL/se592qc5vU6zJmPqO3d0ez0fZ2HTj0Dfv6pJmI5zsVbVWdgqgszGiqNySegAwg KTTP/K35SapqHC51gmwtDuIf93uPkdk/2W/tm40vZE57z9I+39jzuv8AaDHj9OL1y7+n7fxu9X0b QNI0W2+r6bbLAm3Nhu7kd3Y7nOhw6eGIVEU8jqdXkzy4pm0wy5xnYq7FXYq7FXln55aC0tpZa5Et Tbn6tckfyOeUZ+Qao+nCEF47hVlH5dea18ueYUnnJ+o3K+hd0/ZUkEPT/IP4VxKvouGaKaJJoXWS KRQ0cikFWUioII6g5FLDfzfZR5GuwTQtLCFHifUB/UMIUvn7Ch2Kvp/yh/yiWif8wFr/AMmVyKU2 xV4/+fP+9ej/APGOf/iSYQgvKsKpt5Q/5S3RP+Y+1/5PLir6fyKXYqg4tXsJL2WxEoW6iNDG2xNR X4fHriqMxV2KuxV2KsR84eY5InbTbNuL0/0iVeor+wD+vChgV9ptnepSdKsNlkGzD5HMbU6PHmHq G/f1c3R9oZdObgdu7oxnUfLt5a1eL9/CP2lHxAe6/wBM5vV9l5MW49Ufx0ey0HbuLP6Zeifny+BS nNW7tk3lf8v9e18rLHH9VsD1vJgQpH+QvV/1e+Z+l7PyZtxtHvdXru18On2J4p9w/T3PX/LHkTQf L6q9vF697T4ryUAv78OyD5fTXOk0ugx4eQuXe8Zru1c2o2kaj3Dl+1kWZrrXYq7FXYq7FXYq7FUJ q+mW2q6Zc6ddCsF1G0b+Ir0Ye6ncYq+Y9c0e80bVbnTbtaTWzlSezL1Vx7Mu4ySEDirKvKf5j+YP LiC3hZbqwrX6pNUha9fTYbr+r2xpVTzv+Y2o+aYYLV7dLOyhb1PRVi5aShAZmIXoCaCmNKxHFXYq +n/KH/KJaJ/zAWv/ACZXIpTbFXj/AOfP+9ej/wDGOf8A4kmEILyrCqbeUP8AlLdE/wCY+1/5PLir 6fyKXYq8z80kjzBdkbEMtD/sBhQjtH86XtrxivK3UA25E/vFHz/a+n78aVmmn6pY6hF6lrKHH7S9 GX5r1GBKKxVbI4SNnPRQWPyAriryOeZ555JpDV5WLsfdjU4ULMKtxxvI6xxqWdyFVRuST0AxVmGj /lvokM0d/qNulxfD4vTO8QPXdejt7nMOWhwynxmIt2EO09RHH4YmeH8cjzZgAFAAFANgB0pmU4Ds VdirsVdirsVdirsVdirsVYR+ZvkMeYbAXtkoGr2in0x09aMbmM+/8v3d8IV4FJG8btHIpSRCVdGF CCNiCD3woaxV2KuxV2Kvo78tNUj1DyXprqavbR/VZV6lTD8AB+acT9ORKWT4q8f/AD5/3r0f/jHP /wASTCEF5VhVNvKH/KW6J/zH2v8AyeXFX0/kUuxV5n5q/wCO/ef6y/8AEBhQlWFWT+QP+Olcf8Yf +NhgKhnWBKje/wC8c/8Axjf/AIicVeSZJDsVZX5D01ZJ5r+QV9H93DX+ZhVj9A/XgKhm2BLsVdir sVdirsVdirsVdirsVdirsVYJ5/8AyxtPMAa/0/ja6uBVido56dnp0bwb7/Y2rw/VNK1HSrx7PULd 7a5j+1G4pt4g9CD4jChC4q7FXYqzX8svPK+XNRe2vSf0TeEesQK+lINhIB4U2b+zEq98t7iC5gSe 3kWWCUBo5UIZWU9CCOuRS8c/PW8hk1jTbRSDLBA7yAHp6rAKD/wGEILzHCqbeUP+Ut0T/mPtf+Ty 4q+n8il2KsP8zeVL24u5b+zImMlC8HRhQAfD2PTChh7o8blHUo6mjKwoQfcHCrJvIH/HSuP+MP8A xsMBUM6wJUb3/eOf/jG//ETiryTJIdirP/IoA0Vqd5nr/wACuApDIsCuxVL9V17TdMAFy5MrCqwo KuR407fTiqSf8rAtOVPqknDx5LX7v7cNItMLLzhol0QrSG3c9BMOI/4IEr95wUlOlZWUMpBU7gjc EYq3irsVdirsVdirsVdiqX615f0fW7X6tqdqlzH+wWFHQnujijKfkcVebaz+RSM7SaPqPBT9mC6W tP8Anon/ADThtFJVB+RfmUvSe+skjp9pGlc1+RjT9eNrTz/ULC70+9msruMxXNu5SWM9iP4eGFVD FU00fzT5h0YMumX8tsjbtGpqhPjwaq196Yqgb2+vL66kuryZ57mU1klkJZienU4qo4qm/k8E+bdE p/y323/J5cVfT2RS7FXYql+q6Fp2ppS4jpKBRZl2cfT3+nFUs8veXLrSdTndnEtu8XGOQbGvIGhX CrI8CqN7/vHP/wAY3/4icVeSZJDsVegeRf8Ajit/xmf9S4ClkOBVG9uktLSa5f7MKFyPGg6fTiry m7upru5kuJm5SysWY/wHywoUsKuxVMdJ1/UdMYehJyhr8UD7ofl4fRgVm+j+adN1HjGW9C5O3oue p/yW7/rwJTnFXYq7FXYq7FXYq7FXYq7FWBfmd+Xo163Op6cgGsW60KCgE6D9k/5Y/ZP0eFCCrwmW KWGV4pUaOWMlXjcFWVgaEEHcEYULcVdirsVZR+WVg17530xQKrC7TufARKWH/DADEq+jcil2KuxV 2KuxV2KqN7/vHP8A8Y3/AOInFXkmSQ7FXoHkX/jit/xmf9S4ClkOBUk85SlNAnA/3YyL/wAMD/DE K85ySHYq7FXYq7FU/wBH84ahZcYrmt1bDajH41Hs3f5HBSs103WNP1KPnayhiPtRnZ1+a4Eo3FXY q7FXYq7FXYq7FXYqw3zv+Wul+ZA11CRZ6sBtcgfDJToJVHXw5dfn0w2rxHX/ACvrmgXPoanbNFUk RzD4on90cbH5dfHChKsVdir2n8mfKU9jaTa7eIUmvVEdojChEFQxf/ZkCnsPfAVD0zAl2KsM1TzH qWleYLmMH1rUlW9F+lCin4T1XChkGk+YdN1NQIX4T03gfZvo8fowJTPFXYqo3v8AvHP/AMY3/wCI nFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVIvOiFtBlI/ZdCf8AgqfxxCvO8kh2Kpxp/lTVr61FzEES Nv7v1GILDpsAD+OBUBfabe2EvpXcLRN2J3B+RGxxVDYVdiq+GaaGRZYXaORTVXU0I+kYFZXo/nll 4w6mvIdBcIN/9ko6/RjS2zPAl2KuxV2KuxV2KuxV2KqVza2t1A0F1Ck8D7PFIodT81NRirDtS/J/ yXeyNJHDNZM25FtJRa+yyCRR9Aw2tL9H/KTybps6zmGW+kQ1T624dQf9RFRT/sgcbVmeBXYq7FWC efbYpqUNwB8M0VK/5SHf8CMIQWMqzKwZSQw3BGxBwqzXyd5gvru4axu3EoWMvHK326ggUJ77HAVZ ZgSo3v8AvHP/AMY3/wCInFXkmSQ7FXoHkX/jit/xmf8AUuApZDgVL/MFsbnRbyIbkxllHiU+Mf8A EcVeXZJDsVeraRw/RVnw+z6EdPlwGRSrXNrb3URhuI1ljbqrCoxViGseRpE5TaY3Nept3PxD/VY9 fpw2imKSxSwyNHKjRyKaMjAgg+4OKrcKuxV7DkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVIPOl gbnSDMgrJat6n+xOzf1+jEK89ySEZo2oHT9Sguuqo1JB4o2zfgcCvU4pY5Y1ljYPG4DIw6EHocCV O9/3jn/4xv8A8ROKvJMkh2KvQPIv/HFb/jM/6lwFLIcCuIBFD0xV5XrNg1hqc9sRRVasZ8Ubdfww oQWFWe+StWS40/6k7fv7avEHq0ZOx+itMBSyTArsVQWp6Np+pR8LqIFgKLKuzr8jirCdY8oahY8p YK3VsN+Sj41H+Uv8RhQkOFXsORS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWpESRGjcckcFWU9wd iMVeWazpkmm6hLbNUqDyiY/tIehwoQWFU80HzTdaYBBIvr2la+nWjLXrxP8ADAqc6v51sJdOlis1 kM8ylPjAUKGFCep3p4Y0rCsKuxV6B5F/44rf8Zn/AFLgKWQ4FdirGfO2jm5tVv4VrNbikoHUx9f+ FwhDBMKqtrdT2s6XFu5jljNVYYFZzo3nOyugsN7S2uOnM/3bH5/s/T9+NJZGCCKjcHocCuxV2KpL rHlXTtR5SKPq9yd/VQbE/wCUvf8AXiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk3mbQhq lnWMAXcNTCenId0PzxV5w6OjsjqVdSQykUII7HJIaxV2KuxV2KvQvI6FdDBPR5XYfLYfwyJSn+Ku xVxAIIIqDsQcVed+aPLz6bcGeBSbKU/Af5GP7J/hhQkWFXYqmukeZdS00hEb1bYdYHNR/sT1XArO NI8x6dqYCxv6dx3gfZv9j/NgSmmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj/mXy umog3NrRL0DcdBIB2Pv4HCrAZ4JoJWhmQxyoaMjChGKFmFXYq4AkgAVJ2AGKvVdHsvqWl21qdmjQ c/8AWPxN+JyKUZirsVdiqnc20FzA8E6CSKQUZT3xV575h8sXGmOZoqy2RO0ndPZ6frwoSTCrsVbR 2Rg6EqymqsDQgjuDirPvKvmX9IKLS6IF4g+Fv9+KO/8ArDvgSyLArsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVQOqaLp+pR8LmOrAfBKuzr8j/XFWIah5G1KFi1my3MfZahHH0Hb8cNopK/ 8O65y4/Upa9Ps7ff0xVkvlvyhLbTpe6hT1E+KKAGtG/mY9KjtTG1ZZgS7FXEgUqaV2GKuxV2KtMq spVgGUihB3BGKsW1jyRBNym05hDJ1MDfYP8Aqn9n9Xyw2imHXlld2cxhuYmikHZh19wehHyxVRwq vgnlgmSaJiksZDIw7EYFepaRqMeo6fFdJsXFJF/lcbMMCUZirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqQ+dWK6IzKSGEqEEdQa4hUh0fzrd23GK+BuYRt6n+7AP+Nvpw 0hmdhqVlfw+rayiRf2gOq+zA7jAlE4q7FULqWmWmo2zW9ynJT9lx9pT4qcVeZapps+nXslrNuU3V +zKejDChC4VZZ5CvytxPYsfhkHqxj/KXZvvH6sBUM1wJdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSHzt/xwm/4yJ+vEK88ySFW1u7m1mE1vI0Uq9GU0+g+OBWX6P55jfj Dqa8G6C4QfCf9Ze30Y0tsrililjWSJw8bCqupBBHzGBK7FWJfmBaqYLW6A+JWMTHxBHIfqOEILC8 Kph5euDb61ZydAZAh+T/AAH/AIlgV6jgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYqk/muzubvR3itozJIGVuA6kDrTFXm7KyMVYFWBoVOxBySGsVdiqN0zWtQ02TlbSEI TVom3RvmP6YFZppnnTTLlAt0fqs3cNuh+Tf1xpKUedNcsryOG0tJBKqMZJHX7NaUAB79TiEMVwqu icxypIOqMGH0GuKvX8il2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 Kpbq3l/TdTU+vHxm/ZnTZx8/H6cVYRrHlbUdNrJT17Yf7uQdB/lL2/VhQk+FXYq7FXYq7FXYq9hy KXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx/WPJ1he8pba lrcHeqj4GPuvb5jDasK1LSNQ06ThdRFQfsyDdG+TYoQeFXYq7FUVpNq11qdtbqK85F5f6oNWP3DA r1fAl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZNDDPG 0UyLJG2zIwBB+g4qxXVvIsbsZdNkEZO5gkJK/wCxbcj6cNopjN1oWsWrUmtJAP5lHNf+CWoxVRi0 3UJXCR20rMegCN/TFWbeVfLL6fW7u6fW3HFYxuEU9d/E4pf/2Q== + + + + + + uuid:394c157d-8cf0-f94e-8261-98ccb840e1bc + xmp.did:106820F817276811822ACF3CAA06C913 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + uuid:1898a391-1dba-4249-9e7f-8804d46504b0 + xmp.did:FE7F11740720681183D1839CF7E6F44E + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:FE7F11740720681183D1839CF7E6F44E + 2017-01-06T15:27:37Z + Adobe Illustrator CS6 (Macintosh) + / + + + saved + xmp.iid:106820F817276811822ACF3CAA06C913 + 2017-01-27T14:51:33Z + Adobe Illustrator CS6 (Macintosh) + / + + + + + + Document + Print + + + False + False + 1 + + 3840.000000 + 2160.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 35 + 31 + 32 + + + CMYK Red + RGB + PROCESS + 237 + 28 + 36 + + + CMYK Yellow + RGB + PROCESS + 255 + 242 + 0 + + + CMYK Green + RGB + PROCESS + 0 + 166 + 81 + + + CMYK Cyan + RGB + PROCESS + 0 + 174 + 239 + + + CMYK Blue + RGB + PROCESS + 46 + 49 + 146 + + + CMYK Magenta + RGB + PROCESS + 236 + 0 + 140 + + + C=15 M=100 Y=90 K=10 + RGB + PROCESS + 190 + 30 + 45 + + + C=0 M=90 Y=85 K=0 + RGB + PROCESS + 239 + 65 + 54 + + + C=0 M=80 Y=95 K=0 + RGB + PROCESS + 241 + 90 + 41 + + + C=0 M=50 Y=100 K=0 + RGB + PROCESS + 247 + 148 + 30 + + + C=0 M=35 Y=85 K=0 + RGB + PROCESS + 251 + 176 + 64 + + + C=5 M=0 Y=90 K=0 + RGB + PROCESS + 249 + 237 + 50 + + + C=20 M=0 Y=100 K=0 + RGB + PROCESS + 215 + 223 + 35 + + + C=50 M=0 Y=100 K=0 + RGB + PROCESS + 141 + 198 + 63 + + + C=75 M=0 Y=100 K=0 + RGB + PROCESS + 57 + 181 + 74 + + + C=85 M=10 Y=100 K=10 + RGB + PROCESS + 0 + 148 + 68 + + + C=90 M=30 Y=95 K=30 + RGB + PROCESS + 0 + 104 + 56 + + + C=75 M=0 Y=75 K=0 + RGB + PROCESS + 43 + 182 + 115 + + + C=80 M=10 Y=45 K=0 + RGB + PROCESS + 0 + 167 + 157 + + + C=70 M=15 Y=0 K=0 + RGB + PROCESS + 39 + 170 + 225 + + + C=85 M=50 Y=0 K=0 + RGB + PROCESS + 28 + 117 + 188 + + + C=100 M=95 Y=5 K=0 + RGB + PROCESS + 43 + 57 + 144 + + + C=100 M=100 Y=25 K=25 + RGB + PROCESS + 38 + 34 + 98 + + + C=75 M=100 Y=0 K=0 + RGB + PROCESS + 102 + 45 + 145 + + + C=50 M=100 Y=0 K=0 + RGB + PROCESS + 146 + 39 + 143 + + + C=35 M=100 Y=35 K=10 + RGB + PROCESS + 158 + 31 + 99 + + + C=10 M=100 Y=50 K=0 + RGB + PROCESS + 218 + 28 + 92 + + + C=0 M=95 Y=20 K=0 + RGB + PROCESS + 238 + 42 + 123 + + + C=25 M=25 Y=40 K=0 + RGB + PROCESS + 194 + 181 + 155 + + + C=40 M=45 Y=50 K=5 + RGB + PROCESS + 155 + 133 + 121 + + + C=50 M=50 Y=60 K=25 + RGB + PROCESS + 114 + 102 + 88 + + + C=55 M=60 Y=65 K=40 + RGB + PROCESS + 89 + 74 + 66 + + + C=25 M=40 Y=65 K=0 + RGB + PROCESS + 196 + 154 + 108 + + + C=30 M=50 Y=75 K=10 + RGB + PROCESS + 169 + 124 + 80 + + + C=35 M=60 Y=80 K=25 + RGB + PROCESS + 139 + 94 + 60 + + + C=40 M=65 Y=90 K=35 + RGB + PROCESS + 117 + 76 + 41 + + + C=40 M=70 Y=100 K=50 + RGB + PROCESS + 96 + 57 + 19 + + + C=50 M=70 Y=80 K=70 + RGB + PROCESS + 60 + 36 + 21 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + RGB + PROCESS + 35 + 31 + 32 + + + C=0 M=0 Y=0 K=90 + RGB + PROCESS + 65 + 64 + 66 + + + C=0 M=0 Y=0 K=80 + RGB + PROCESS + 88 + 89 + 91 + + + C=0 M=0 Y=0 K=70 + RGB + PROCESS + 109 + 110 + 113 + + + C=0 M=0 Y=0 K=60 + RGB + PROCESS + 128 + 130 + 133 + + + C=0 M=0 Y=0 K=50 + RGB + PROCESS + 147 + 149 + 152 + + + C=0 M=0 Y=0 K=40 + RGB + PROCESS + 167 + 169 + 172 + + + C=0 M=0 Y=0 K=30 + RGB + PROCESS + 188 + 190 + 192 + + + C=0 M=0 Y=0 K=20 + RGB + PROCESS + 209 + 211 + 212 + + + C=0 M=0 Y=0 K=10 + RGB + PROCESS + 230 + 231 + 232 + + + C=0 M=0 Y=0 K=5 + RGB + PROCESS + 241 + 242 + 242 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + RGB + PROCESS + 237 + 28 + 36 + + + C=0 M=75 Y=100 K=0 + RGB + PROCESS + 242 + 101 + 34 + + + C=0 M=10 Y=95 K=0 + RGB + PROCESS + 255 + 222 + 23 + + + C=85 M=10 Y=100 K=0 + RGB + PROCESS + 0 + 161 + 75 + + + C=100 M=90 Y=0 K=0 + RGB + PROCESS + 33 + 64 + 154 + + + C=60 M=90 Y=0 K=0 + RGB + PROCESS + 127 + 63 + 152 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 36 0 R/TrimBox[0.0 0.0 3840.0 2160.0]/Type/Page>> endobj 32 0 obj <>stream +HlVI9 +TK"cN(rh4P@A*n(EJ\A*z/ϑ>Lۯ-RN%7޾[+ELD}~Q_,RC)i%mR=V{uS¡,YHzeۓ Q!5nJ9P5"v[ uWvU7nێ,FP^$$5DDpɁd4ڋۙ90q|dDZ a1439<0}f0{ꖐhE#R 5Y9$ +zX]@~3ϋ̬3L>س|cΏs%sZNVuAcp~Rc阏b^Aй><\I/wP;bJ@|n[fDڍ^ -[D@Dňށ(TIfйkUE'Gx"/Þ!QLwBq:p.RZ[Yh=j{9 ACIY8w;vuu-ӹ2/;@r fdk6z1FMǯk׊x]*C1ylDTAœu&4`pv)5bǸ+ +VEC04,Tp9p)1Rِ9ֿmXѭxhPxʐke&ډAeL9Jl1|)Y|zf*ѷ.G%:o]~Ljh(eMBC#\fch\ij\mr#Jܢo;oَ?I >stream +8;Z]!gMI$9&4O4Loo+g]Y:Y;L9GQ$:@3.,T.n*;fRief@%Sif_3dV)Ok+/'6SR3bl +9q7Fhkme7N\oK:^?"i4k6BkiO2r#nub+]#^#o2T&%;/3"U%t=#DK/;5(hd<.rJl^nXukH^04p_5&"H=J0K1J +F,$ endstream endobj 37 0 obj [/Indexed/DeviceRGB 255 38 0 R] endobj 38 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 29 0 obj <> endobj 30 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 35 0 obj <> endobj 34 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 33 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.0 %%For: (Ian Meikle) () %%Title: (Web3_70.ai) %%CreationDate: 27/01/2017 15:51 %%Canvassize: 16383 %%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 682 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -2160 3840 0 %AI3_TemplateBox: 1920.5 -1080.5 1920.5 -1080.5 %AI3_TileBox: 1517 -1359.5 2300 -800.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -1717.0015 636.9985 0.3333 2078 1150 18 0 0 32 191 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 77 %%PageOrigin:1614 -1476 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 46 0 obj <>stream +%%BoundingBox: 1170 -1782 2670 -378 %%HiResBoundingBox: 1170 -1781.6396 2670 -378.3604 %AI7_Thumbnail: 128 120 8 %%BeginData: 14636 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFFFFFA87D7DFD7CFFA8FD0452A8FD79FFA87D527D527D527DA8FD %77FF7D525352525253525259FD76FF527D527D527D527D527D52A8AFFD72 %FF7D52527D5252527D52525259527DA8FD71FF7D527D527D527D527D527D %527DA8FD72FF52535252525352525253527DA8FD39FFCACAA1C3A0C2A0C2 %A0C3A1CACAFD2DFF7D527D527D527D527D527DA8FD37FFC3C3BBBBBABBB4 %BBB4BBBABB92BBBBBBC2C9CAFD2AFF527D5252527DFD04527DFD35FFA1C2 %98BA92BB92BB92BB98BB92BB98BB92BB92BA92BB99CAFD28FF7D527D527D %527D527D52FD33FFCAC9BBBA92BBBBBB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBB4C2C9FD26FF5252525352525253527DFD0CFFA87D7DFD23FFA0 %BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BA99 %CAFD24FF7D527D527D527D52537DFD0BFFA87D525352A8FD1FFFCABBBBBA %BBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBA %C9FD23FF5252527D5252527D52A8FD0AFFA852527D5252527DA8FD1BFFCA %C292BB98BB92BB98BB92BB98BB92BB98BB92BB92BB92BB98BB92BB98BB92 %BB98BB92BB92C2CAFD21FF7D527D527D527D5253A8FD0AFF7D527D527D52 %7D52537DFD19FFC2BBB4BB98BBBBBB98BBBBBB98BBBBBB98BBB4BB92BBB4 %BA92BBBBBB98BBBBBB98BBBBBB98BBB4BBCAFD20FF525352525253525252 %A8FD09FFA8525352525253FD05527DA8FD14FFC998BA92BB92BB92BB92BB %92BB92BB92BB92BA99C3C3CAA7C9A0BB92BB92BB92BB92BB92BB92BB92BB %92BBA8FD1FFF7D527D527D527D5259A8FD09FF7D7D527D527D527D527D52 %7D527DFD12FFC9C2B4BBBABBBBBBBABBBBBBBABBBBBBBABBB4C2C9FD08FF %C9BBBBBABBBBBBBABBBBBBBABBBBBBB4C2FD1FFF527D5252527D525252A8 %FD09FF7D527D5252527D5252527D527DA8FD10FFCF9ABA92BB98BB92BB98 %BB92BB98BB92BB92BA98C9FD0BFFCF99BB92BB98BB92BB98BB92BB98BB92 %C3CAFD1DFF7D527D527D527D52527DFD09FF527D527D527D527D527D527D %FD11FFC398BBBABB98BBBBBB98BBBBBB98BBBBBB92BBC2FD0EFFC9B4BB98 %BBBBBB98BBBBBB98BBBBBB92BBBBC2C3CFFD19FF525252535252525352A8 %FD08FFA85952525253525252535252A8FD0FFFA1BB92BB92BB92BB92BB92 %BB92BB92BB92BB92C2A8FD0FFFA1BA92BB92BB92BB92BB92BB92BB92BB92 %BB92BA92C2C3FD17FF7D527D527D527D52527EFD09FF527D527D527D527D %52537DFD0EFFCABBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD10FF %CFC2BABBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBABBBBC9FD15FF52 %52527D5252527D52A8FD08FFA87D5252527D5252525952FD0DFFA8C2B4BA %92BB98BB92BB98BB92BB98BB92BB92BBA0FD11FFCABB92BB98BB92BB98BB %92BB98BB92BB98BB92BB98BB92BB98BB92BBC3FD13FF7D527D527D527D52 %53A8FD09FF527D527D527D527D527DFD0CFFA87D75BBBABB98BBBBBB98BB %BBBB98BBBBBB92C3CFFD11FFC2BBBABB98BBBBBB98BBBBBB98BBBBBB98BB %BBBB98BBBBBB98BBBBBB92BBBBCAFD11FF525352525253525252A8FD08FF %A85252535252525352527DFD0BFF7D525253527698BA92BB92BB92BB92BB %92BA99CAFD11FFC999BA92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB %92BB92BB92BB92BB92BB92C2CAFD0FFF7D527D527D527D5259A8FD09FF52 %7D527D527D527D52A8FD0AFFA87D527D527D537D99BBBABBBABBBBBB92C1 %C9FD11FFCAC2B4BBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABBBBBBBABB %BBBBBABBBBBBBABBBBBB92C2CAFD0EFF527D5252527D525252A8FD08FFA8 %53527D5252527D52527DFD0AFF7D527D5252527D52535299B4BB92BA98C3 %CAFD11FFC2BA92BB98BB92BB98BB92BB98BB92BB92BA92BB92BB92BA92BB %92BB98BB92BB98BB92BB98BB92BBCAFD0DFF7D527D527D527D52527DFD09 %FF527D527D527D527D52A8FD09FFA8527D527D527D527D5259527C99BBC2 %FD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BBBBC9C9CFCACAC2C1 %B4BB98BBBBBB98BBBBBB98BBBBBB92BBCAFD0CFF525252535252525352A8 %FD08FFA85952525253FD04527DFD09FF59FD0452535252525352522E7DA8 %FD11FFA1BB92BB92BB92BB92BB92BB92BB92BB92BB92C2A7FD07FFCAC998 %BA92BB92BB92BB92BB92BB92BB92C1FD0CFF7D527D527D527D52527EFD09 %FF527D527D527D527D52A8FD09FF7D527D527D527D527D527D527DFD11FF %CFBBBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBBCAFD0BFFCFFD04BBBABB %BBBBBABBBBBBBABBB4C9FD0BFF5252527D5252527D52A8FD08FFA87D5252 %527DFD04527DFD09FF52595252527D5252527D527DFD10FFCAC292BA92BB %98BB92BB98BB92BB98BB92BB92BBA0FD0EFFC992BB98BB92BB98BB92BB98 %BB92BB99FD0BFF7D527D527D527D5253A8FD09FF527D527D527D527D52A8 %FD08FFA87D527D527D527D527D527DFD10FFC3BB92BBBBBB98BBBBBB98BB %BBBB98BBBBBB92C2CAFD0FFFC3BB98BBBBBB98BBBBBB98BBBBBB92C2FD0B %FF525352525253525252A8FD08FFA85252535252525352527DFD09FF5252 %52535252525352527DFD0EFFCA99BA92BB92BB92BB92BB92BB92BB92BB92 %BA99CAFD10FFA8BB92BB92BB92BB92BB92BB92BB92BA99FD0BFF7D527D52 %7D527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D52 %7D52FD0DFFCFC292BBBBBBBABBBBBBBABBBBBBBABBBBBB92BBC9FD11FFCA %C1BABBBABBBBBBBABBBBBBBABBBBBB92C9FD0BFF527D5252527D525252A8 %FD08FFA853527D5252527D52527DFD09FF5252527D5252527D527DFD0EFF %C2BB92BB98BB92BB98BB92BB98BB92BA92C3CAFD11FFC2BB92BB98BB92BB %98BB92BB98BB92BB92BBCAFD0BFF7D527D527D527D52527DFD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52537EFD10FFC398BBBABB98 %BBBBBB98BBBABBBCFD12FFC998BBBABB98BBBBBB98BBBBBB98BBBBBB92BB %CAFD0CFF525252535252525352A8FD08FFA85952525253FD04527DFD09FF %FD055253525252A8FD11FFCA99BA92BB92BB92BA92BBC9FD11FFA1BB92BB %92BB92BB92BB92BB92BB92BB92BB92BBA8FD0DFF7D527D527D527D52527E %FD09FF527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD13FF %C9C292FD04BBC9FD11FFCFBCBBBABBBABBBBBBBABBBBBBBABBBBBBBABBBB %CAFD0FFF5252527D5252527D52A8FD08FFA87D5252527DFD04527DFD09FF %52595252527D525252A8FD15FFC992BBC2FD11FFCAC392BA92BB98BB92BB %98BB92BB98BB92BB92BBA0FD11FF7D527D527D527D5253A8FD09FF527D52 %7D527D527D52A8FD08FFA87D527D527D527D52527DFD17FFCAFD11FFC3BB %92BBBBBB98BBBBBB98BBBBBB98BBBBBB92C2CAFD12FF7DFD045253525252 %A8FD08FFA85252535252525352527DFD09FF525252535252525352A8FD27 %FFCA99BA92BB92BB92BB92BB92BB92BB92BB92BA99CAFD14FFA8527D527D %527D5259A8FD09FF527D527D527D527D52A8FD09FF7D527D527D527D5252 %7EFD25FFCAC2B4BBBBBBBABBBBBBBABBBBBBBABBBBBBB4BBC3FD16FFA853 %5252527D525252A8FD08FFA853527D5252527D52527DFD09FF5252527D52 %52527D52A8FD24FFA0BB92BB92BB98BB92BB98BB92BB98BB92BB92C2CAFD %18FF527D527D527D52527DFD09FF527D527D527D527D52A8FD08FFA87D52 %7D527D527D5253A8FD22FFCABBBA92BBBBBB98BBBBBB98BBBBBB98BBBABB %BBCFFD1AFF7D525352525253527DA8FD07FFA85952525253FD04527DFD09 %FFFD055253525252A8FD20FFA8BB92BB92BB92BB92BB92BB92BB92BB92BB %92BBC9FD1CFFA87D527D527D527D52FD09FF527D527D527D527D52A8FD08 %FFA87D527D527D527D5259A8FD1FFFA8A8A1C2BABBBABBBBBBBABBBBBBBA %FD04BBC9FD1FFF52535252527D52527DFD07FFA87D5252527DFD04527DFD %09FF52595252527D525252A8FD1EFFA8A87DA87DA199BA92BB98BB92BB98 %BB92BBC2FD21FF7E527D527D527D5252A8FD07FF527D527D527D527D52A8 %FD08FFA87D527D527D527D52527DFD1DFFA8A87DA87EA87EA8A0BBB4BBBB %BB98BBB4C2CAFD22FFA8525253525252535252A8FD05FFA8525253525252 %5352527DFD09FF525252535252525352A8FD08FFA8A8A8FD11FFA8A87DA8 %7DA87DA87DA87DA092BB92BA99C9FD25FF7D7D527D527D527D527DA8FD04 %FFA8527D527D527D527D52A8FD09FF7D527D527D527D52527EFD09FF7EA8 %7EFD11FF7DA87DA884A87DA884A884A799BBC2FD27FFA852595252527DFD %04527DA8A8A85252527D5252527D52527DFD09FF5252527D5252527D52A8 %FD08FFA8A87DA87DA8A8FD0DFF7DA87DA87DA87DA87DA87DA87DA8CAFD29 %FF7E527D527D527D527D5259527D527D527D527D527D527D52A8FD08FFA8 %7D527D527D527D5253A8FD09FF7DA87EA87DA8A8FD0CFFA87DA87EA87DA8 %7EA87DA87DA8FD2BFFA853525352525253525252535252525352525253FD %04527DFD09FFFD055253525252A8FD08FFA8A87DA87DA87DA87DA8A8FD09 %FF7DA87DA87DA87DA87DA87DA8FD2DFFA87D527D527D527D527D527D527D %527D527D527D527D52A8FD08FFA87D527D527D527D5259A8FD09FF7DA884 %A87DA884A87DFD0AFFA87DA884A87DA884A87DA8FD2FFF7DFD04527D5252 %527D5252527D5252527DFD04527DFD09FF52595252527D525252A8FD08FF %A8A87DA87DA87DA87D84A8FD09FF7DA87DA87DA87DA87D84A8FD30FF7D53 %527D527D527D527D527D527D527D527D527D527DFD08FFA87D527D527D52 %7D52527DFD09FF7EA87DA87EA87DA87DFD09FFA8A87DA87DA87EA87DA8A8 %FD32FFFD055253525252535252525352525253525252A8FD08FF52525253 %5252525352A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7DA87DA87DA87D %A87DA8FD33FF7D52527D527D527D527D527D527D527D527D527D7DFD08FF %7D527D527D527D52527EFD09FF7EA87DA884A87DA87DFD09FFA8A87EA87D %A884A87DA8A8FD34FF7D52527D5252527D5252527D5252527DFD0452A8FD %07FF5252527D5252527D52A8FD08FFA8A87DA87DA87DA87DA8A8FD09FF7D %A87DA87DA87DA87DFD36FFA859527D527D527D527D527D527D527D527D52 %7DA8FD05FFA87D527D527D527D5253A8FD0BFF7DA87DA87EA87DFD0AFFA8 %7DA87EA87DA87EA8A8FD0DFFFD05A8A9A8FD22FFA87DFD05525352525253 %5252525352525259A8FD04FF7D525352525253525252A8FD0CFFA87E7DA8 %7D7EA8FD09FF7DA87DA87DA87DA87DA9FD0CFF7DA87D847DA87D847DA8A8 %FD21FFA85953527D527D527D527D527D527D527D52597DFFFFA8527D527D %527D527D5259A8FD0DFFA8A87DA87DFD0AFFA87DA884A87DA884A8A8FD0B %FF7DA884A87DA884A87DA87DA8A8FD22FFA87DFD0552595252527D525252 %7D5252527D5252527D5252527D525252A8FD10FF7D7DA8FD09FF7DA87DA8 %7DA87DA87DFD0BFF7E847DA87DA87DA87DA87DA87D7E7DFD24FFFD05A87D %527D527D527D527D527D527D527D527D527D527D52527DFD11FFA8FD09FF %A8A87DA87DA87EA87DA8A8FD09FFA8A87EA87DA87EA87DA87EA87DA87EA8 %7DA8A8FD26FF84FD0452535252525352525253525252535252525352A8FD %1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87DA87DA87D %A87DA8A8FD26FF7D52527D527D527D527D527D527D527D527D527D5259A8 %FD1BFFA8A87EA87DA884A87DA8A8FD09FFA8A884A87DA884A87DA884A87D %A884A87DA87EA87DFD26FF7D52527D5252527D5252527D5252527D525252 %5952A8FD1CFF7DA87DA87DA87DA87DFD0AFFA87DA87DA87DA87DA87DA87D %A87DA87DA87DA87DA87DA8A8FD24FF7D52527D527D527D527D527D527D52 %7D527D527DFD1DFFA87DA87EA87DA87EA8A8FD09FF7EA87DA87EA87DA87E %A87DA87EA87DA87EA87DA87EA87DA8A8FD24FF7D52525352525253525252 %5352525253525253FD1DFF7DA87DA87DA87DA87DA9FD08FFA8A87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8A8FD22FF7D7D527D %527D527D527D527D527D527D52A8FD0AFFA8FD12FFA87DA884A87DA884A8 %A8FD09FF7EA87DA884A87DA884A87DA884A87DA884A87DA884A87DA884A8 %7DA8A8FD22FF7D535252527D5252527D5252527D5253A8FD09FFA8847EFD %11FF7DA87DA87DA87DA87DFD09FFA8A87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA87DA87DA87DA87DA87DFD22FFA87D5253527D527D527D527D %5252A8FD0BFF84A87DAFFD0EFFA8A87DA87DA87EA87DA8A8FD09FF7DA87E %A87DA87EA87DA8A8FFA8A87DA87DA87EA87DA87EA87DA87EA87DA87DA8A8 %FD21FFA8525252535252525352527DFD0CFFA87DA87DA8A8FD0DFF7DA87D %A87DA87DA87DFD09FFA8A87DA87DA87DA87D847DFFFFFFA8A87D7E7DA87D %A87DA87DA87DA87DA87DA87DA8FD23FFA87D52595259527D7DFD0DFFA8A8 %7DA87DA8A8FD0BFFA8A87EA87DA884A87DA8A8FD09FF84A884A87DA884A8 %7DFD07FFA8A87DA87DA884A87DA884A87DA884A87DFD26FFA8A87DA8A8FD %0EFFA87DA87DA87D847DA8FD0AFF7DA87DA87DA87DA87DFD0AFFA87DA87D %A87DA87D84A8FD07FFA8A87DA87DA87DA87DA87DA87DA87DA8FD39FFA8A8 %7DA87DA87EA87DFD0AFFA87DA87EA87DA87EA8A8FD09FFA8A87DA87EA87D %A87DFD0BFFA8A87DA87EA87DA87EA87DA87EFD3AFF7DA87DA87DA87D7EA8 %FD09FF7DA87DA87DA87DA87DA9FD0AFF7DA87DA87DA87DA8A8FD0BFFA8A8 %7DA87DA87DA87DA87DA8FD3AFFA87DA87DA884A87DA8FD09FFA87DA884A8 %7DA884A8A8FD0AFFA87DA884A87DA87DA8FD0DFFA87DA87DA884A87DA884 %FD3AFFA8A87DA87DA87DA87DFD09FF7DA87DA87DA87DA87DFD0BFFA8847D %A87DA87DA87DFD0FFF7E847DA87DA87DA8FD3BFF7DA87EA87DA87EA8A8FD %07FFA8A87DA87DA87EA87DA8A8FD0BFF7DA87DA87EA87DA8A8FD0FFFA8A8 %7DA87EA87DFD3BFFA87DA87DA87DA87D7EA8FD07FF7DA87DA87DA87DA87D %FD0CFFA87DA87DA87DA87DA8A8FD10FFA87DA87DA8FD3BFFA8A87EA87DA8 %84A87DA8FD06FFA8A884A87DA884A87DA8A8FD0BFFA8A87DA884A87DA87D %A8A9FD11FFA8A87DFD3CFF7DA87DA87DA87DA87DA8A8FD04FFA87DA87DA8 %7DA87DA87DFD0DFF7E847DA87DA87DA87DA8A8FD11FFA8A8FD3DFF7DA87E %A87DA87EA87DA8A8FFA8FF7DA87DA87EA87DA87EA8A8FD0DFF7DA87DA87E %A87DA87DA8A8FD4FFFA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA9FD0DFFA87DA87DA87DA87DA87D7E7DA8FD4EFFA87DA87DA884A8 %7DA884A87DA884A87DA884A87DA884A8A8FD0EFFA87DA884A87DA884A87D %A87DA8A8FD4CFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %FD0FFFA8A87DA87DA87DA87DA87DA87D7E7DFD4CFFA8A87EA87DA87EA87D %A87EA87DA87EA87DA87EA87DA8A8FD0FFFA8A87DA87EA87DA87EA87DA87E %A87DA8FD4BFF7DA87DA87DA87DA87DA87DA87DA87DA87DA87DA87DFD11FF %A87D7DA87DA87DA87DA87DA87DA87DA8A8FD4AFFA8A87DA884A87DA884A8 %7DA884A87DA884A87DA8FD12FFA8A87EA87DA884A87DA884A87DA87EA8A8 %FD4AFFA87E7DA87DA87DA87DA87DA87DA87DA87D84A8FD13FFA8A87DA87D %A87DA87DA87DA87DA87D7E7DFD4AFFA8A87DA87EA87DA87EA87DA87EA87D %A87DFD15FFA8A87DA87DA87EA87DA87EA87DA87EA8A8FD4AFFA8A87DA87D %A87DA87DA87DA87DA87DA8FD16FFA8A87DA87DA87DA87DA87DA87DA87D7D %7EFD4BFFA87DA87DA884A87DA884A87DA8A8FD18FFA87DA884A87DA884A8 %7DA884A87DA8A8FD4CFF7E847DA87DA87DA87D7EA8FD1AFFA87DA87DA87D %A87DA87DA87DA87DA8FD4DFFA8A87DA87DA87DA8A8FD1DFFA8A87DA87DA8 %7EA87DA87EA87DA8FD4FFFA8FFA8FFA8FD1FFFA8A87DA87DA87DA87DA87D %A87DFD62FFA8FD13FF7DA884A87DA884A87DA8A8FD60FFA8847DA8A8FD11 %FF7DA87DA87DA87DA87DA8FD61FF7DA87DA8A8FD11FF7DA87EA87DA87EA8 %7DFD60FFA8A87DA87DA87DA8FD0FFFA87DA87DA87DA87D7E84FD60FF7EA8 %7DA884A87DA8FD0EFFA8A87EA87DA884A87DA8FD5FFFA8A87DA87DA87DA8 %7DA8A8FD0DFF7DA87DA87DA87DA87DFD60FF7DA87EA87DA87EA87DA87DA9 %FD0BFFA87DA87EA87DA87EA8A8FD5EFFA8A87DA87DA87DA87DA87DA87DA8 %A8FD09FFA87D7DA87DA87DA87DA8FD5FFF7DA884A87DA884A87DA884A87D %A8A8FD09FF7DA884A87DA884A8A8FD5EFFA8A87DA87DA87DA87DA87DA87D %A87DA87DA8A8FD05FFA8847DA87DA87DA87DA8FD5FFF7DA87DA87EA87DA8 %7EA87DA87EA87DA87DA8A8FFFFFFA8A87DA87DA87EA87DA884FD60FF7E7E %7DA87DA87DA87DA87DA87DA87DA87D7E7DA8A8A87DA87DA87DA87DA87DA8 %FD61FFA8A87DA87DA884A87DA884A87DA884A87DA87DA87DA884A87DA884 %A87DA884FD63FFA87D847DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8 %7DA87DA87DA8FD65FFA8A87DA87EA87DA87EA87DA87EA87DA87EA87DA87E %A87DA87EA87DFD66FFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87D %A87DA87DA8FD69FFA8A87DA884A87DA884A87DA884A87DA884A87DA884A8 %84FD6AFFA8A87DA87DA87DA87DA87DA87DA87DA87DA87DA87DA8FD6CFFA8 %7DA87EA87DA87EA87DA87EA87DA87EA87DA8A8FD6EFF7DA87DA87DA87DA8 %7DA87DA87DA87DA87DFD70FFA8A87DA884A87DA884A87DA884A87DA9FD72 %FFA87DA87DA87DA87DA87DA87DA8A8FD74FFA8A87DA87DA87DA87DA8FD77 %FFA8FFA8A87DA8A8A8FFFFFFFF %%EndData endstream endobj 47 0 obj <>stream +%AI12_CompressedDataxyu' ;i`2cEo0ʣԲ-c0hPRc6`yVY7\ 4Y~gW_wwMo^;Żw?#.? MO717~xsO'?˿y_~ojO?/~Yi77~?+ÏyÇM߽9ˆ4=~ؾq2o'z͏ݽû'|o7wz݇޽~oC;^ >7wk~[׿|u ^IaEn?-/Mv߽oxv* csw7w}Wfa MygO_$fZWC bOϽVoNdWb)S?O~ȤÇo<܆D+ݏx;\-oB^7MpǷ߾}a0M,}|MY)f_q3W-|ŧOwuzhw-?|E/>;,8"Mz[̿^5ݯ>}>_ݏI7tiywAw7_~zowqvKzi}֯~_^w|{߼*}kv49߲z=7Tzċ^}?ہ˵ ?aywWq_;~{7 7I{ } ˿ޏ߽{훭l$~+?}?G/["rW|?߿{_]}f^ǟ|WaHM_~wx_>-1n_C}oiWXWGL4h7C"kH~=CvcΞOɝ=Iow O×b2Fp8o//?~ߪ0J @eYjr%5ۺF|8N11tx-x:Χssy:392?Um}G/?{>vhhBT!gic9I|ML{LOKӔƔSJ14=f;<׭l-qfpṣ<Ӽ̇4~%/2/rXi4i?H{{a:̇p8ta F#~3yv:BՆoVʝ.|;iG=L3<Ι:a~]iO4nMyJS)Tx;iގa܏(86|mamlvVVz=UzwUgno)δ43u6ЁJt&:b{:lG:vtCtG: [:oc]^xo{oKfoSFiIU Rb#D ñWt`CpޟX i?aOt~mGD*D!K !g?0 aĨiIoTpÉ-m!C +9b)a pp +pKdb1He sm~l`"\mfܹ% iUآm [۾|qۊT3>ofyyN43g|܇TGj왧{cܘA[Ж;ZMMX|y8|O 1 g!Jl%۲yK?i弔3aժmfgҕ?uM]rd&b^NѵeO ;+=vP CGەgWVM-U;6m7'"L4Ҷii(G{38Dfg y8vtDt>\^蘡! O/H N]jq]/9%h=sI0cMhH`J7я!L)WP=C_azWsdx3D "R +oR? / 1ӵ<ߐV{q+{('iç>/qs\>O26K!>QZ>=1X0ʕ=O2H)l7_cE/?Կ{7~ILF~OHi;zWtP,#dJ!Ap!-|l?kS,쬛unvMY/n.O7PH+ٻHiތy)Sq>f7<=cs}V/:i9W@/f A5[QN'@Sس}tcQ Bs{V%L@XR") (_:fJ<P8rPcvȎn¯3i"kGzLvM!4uO'TG`@S>t4Dϑ=@s a@,YYDi"B #i!t0pg~Y}AXuL z";K=K܁od\>M7(CYM^\YZ65hoQsRb_ҢjZżVW녻\% UK6UM8rH3%FCكJG AF,$AL%2|`  ( 4"bHqf D(*`Q +T,Gf zby{@ak m;g5Y<LpbKH$mh192P (İIC 㤉:^;C +8494d[7_*b}LB+l;2} +X 8g nb.2/ c6Ik~G#_ f#F?>ڻ S^ \G6pyˌ[Ŵ%ۣ獡Xay?l-0nɒc1w Է*f]EFt&C^j_:u ?WH-ݥV- Xf-mܴjz5tCpjZ$Ԍس;_mn-+}jc,5Zav+f0?Geծ_̿͠xfoUՂ%Vb(„Yw 5U:{hae.&2l8b]WܻhQU>vWlܿ+0wj ']EYy{z{ݪq얩I>ꊐPZ8o"ն-;9R,1V͗kͩKlWR ^p .pv}c6k[ڡiǪ[:R6򶨚w3[w8򳃓#όکLJ}P>d3$c.86#fvWZ\/uNGb6sj^fsmiX(+mܪ穜נwqY>tFA=Ǭf [5Po Le|~ytJ29=-Kuj̆2Jz^eN1Dܕ3ma|&\٨mz &.\> JTq)>I "OqV+j+oqXZrk̈́wXǤ{j 1OMD Ah,Boi +-D"F`3ρћ39P+TXx̓2sjf.0v`%\PRQ*yú]4Ɗi׶ >i8^T&m`(2v0( 9(LݑjȧG#ҩ*j\4jipqe HZ.N d:H|Ҙ9-N?*l^^~W[Z߯~*YP֎^$E!"h>{өiD،j;KטCX5nG_Ա{ +^v0Ε Sթ2Nj}?ؗض%OmMۍ]nEll&/iKh$uPvv)젒VZ`VWQ+Fp$ΕS >U]?WşS >EԥԈ;37c#Dmui}uvjZ_5-l*40J{1͗ם)fq;ea|ϻ9;`c~b\lS8O^xߑ;݂g?!`I4HGfFI_ٴ7yjas -*~Im*fÜe"Ζ1[~x\0M&J81VYdkp :(s9rʩD;qHH8&Y{}f4ӌpf`VX f о ؝m728@[c>*K?BaJ R9}DѝFw69C{8sw Z +TȾ|aAP),B P uT 8y6ܺmsǹōt[n+[߅®^tʩ"+2A3\j~ %'uXYξ,DFwш١u/s2!uL1LU1v DfΣAyVf`"^,XqvX|jOy X<9uS[9h&Z''<͟l˧=gU̝W{gk4.fZ,^P +uE.dRjhmQU  u,OoSZStX,S[gqYI5$$~7qCO2; =<~褚Ѹ.%hwL*f}iƖy2ļļļļļļļļļļļļļ<_bb^bbSݽr MF +{aIw}(}a[QmNjP}4s͢)d3]Ҭ~a`S<#u<~{f`?;8f&Tl 6uz_0aYT"y*8`/lR#c^"MXxi{dwrK0*ykWf S뱊UaY Vt%_M*\GIUKEkqU8v*ylyTxSv{&YwQ3!M+'J5ह2W2ݥ_!ӷ5_ Ԅƭ- hh k˜aQ@;k8Z'k 46ߚukMxM 6 bU5uXMA64뒍`Ln$ȫ[֩imqYhSV)"0 JY(m* ;IMIcFxIč!MxǶKM#G^iZI==ko6 GNyo7\;ATnUr|,LX@u'dd>bauICͭRF:yRw^ծdu4 +{hiŊT8@COSyMDzCWBU-u+T iTkm8e< +/AMђsf=bȉDP[?Hmj[gx+z= $@4fipɚ W2isdD%m ݊{K,;%cN5L%â})W%~E' ÝYb9lXAXUg4 < (8AhugNp*IY2(>1O)pKړSfRXΜhcW681hEgOǶLDӡ#Cʨ6u\`߬<=wl%AKE/ ^$(zIP%AKE/ ^$(zʟ$(zIP%AKE/ ^$(zIP7To4[e(JQ7=X7VS箱*bfϝXYظWAƓYYI]_:gZj<6QZbx Fj^k Ԡx_X42>Mi#RhR)<雨3A1Ufz[$Hdc1N-mqVkTKU g)l.yoOH]=o„\|$1s!, C {T 4m +YSNhKfY0Кqv,ym*kkz2x[=sytmAW$xiKR$ǁQ}n4$ gp +p$k]Rٞ^pLuV`yX'*@n(BA?U0l>J _})5c Ck8WQl˥ZId&* +s\i 3ZkpsKZoÅdy=ƭQ+mWQkUW+hx]{q4{iy@sB_B;9 ,>+PB4‹l JkchEtk׽a;ָ]a^nWV]ۭ3' iu߬k*kW@+z*?WH:1n8ϙk iOo3ٺds@'ssߋ:[YuVYx8nӴͰeJu ݆X]*]5>Zg2kX%*a53kQ;ƱU{U;.VUڡb蘏+kuٵB%]\y|v.dI&%-\K=( +;SX&]?qOk7gS(;,E F1Q5S+]ccNi+vAg闌ho]_EV(\ :Ա9f>JҶβʣ5*'EFdu%l.S)쯺솵&XpawEl!!#1ZZZe6{UY^WYG,E] ^{c\w{n:|xc#'y3xšLz'6rcl:cJ:4j X.{ 6!C8$a%酬VKp>v~X*ҙ6ѷ?UnS꠹uڹn:Yesc-^iZW~v񧻼?HS ϒ/rf%&YV +z]u#N3KG0vzM^y&y/ hGFĝXȝªX6֡eM5%K^Rjv -s^c]9Q2YEQ}KOKҊ~vDtz#zn-zKMUAעn3Ukѓۇ12D۟FJ;tMhV6.^TNzU;]ŗk/mݗ?_Tu:Om3%ne|uKX݆+QV|NCUɷV|[E=8 bohQƣz^< +z\.k|l.~tW3́Jg\wC(U|\MQЭt5ƍ!PA-e5v 6bYqWA3!zYVz:aY 4.5*+ylV|nVE]d_Tm;m+%8$iݕ$(/m] Z{N:,~m@G?r~)$Z`=6 ᇎЕ!"' +a/3f8d8<}GD0Ý6_O* +qӢE"4EM4<: 6?ReRVs4^Z"@H}8~V@%B$L]+yJͼRz:y,@ +1hPI><<˶ .08k}y/iьk$t&\t'1iG8$/n0SǍOw;{d7^X>@l1E@Xkۖ=m垒X6]6jb]ݶ P;\x^U4hE9=ozjBt i97]<_V0[/º:=+۩-nUWzXWh|UΗyxu}&Oq>SE]k +u*WrKu6k~_ЯklJ:t-e%*/jmuiUl끵,'Z1 ;nbLg>V?ׯV^Ẏm2ӓruW-vYI}$X2Tm"2Xm9kFf l֌2lþXdb(;XF0H]Kć6q[Mp1ϯraY+vu.'kMh=O>Ng Mǥ=m-Zk}~^YVJJ=~ -3\fSLjvs"e5:D +i9c) 2HEd! y+\+Ss UqtW߾^U]oW?}޾T>i7&Դ./fX|CX;GqO~_tw}#`}GW/޴ 6/6Ͽ~ͧ޿Çw>|@Z/׿y_߽7_Kh2 $ +l(q)½!vUHL@DZ(9 #'t7L~Bt3;s2'bc(CeoJ -BS`rlua}F15 }<ѕ|Dm(Z؜S@_5bx>֑Pq$:4Z:AP4~>Ow8 L#$'&jؑ3:w@盤 +[UDD^GMD2н2Sh!";dE<أHfz)ou]#~Rem@O ˅viLCSDJyBI"s?ϐljM!Nȋf & }%/0yDԅg]N+e { /@#Lo t\%=1>~_dH#Qqjj~ÿ9Pfk`uf:ݞ:2.ܣS=mB[D|fkLEFle[.Sd˪qi=Y]gP:Q $Bj~iSk~-{gb/Щ씓x# jLE*21Ȯd)䱡K6Sr0'N z'٩!+o3J)wR 0,g,pC_N_Fe'aj2YHDqۧaJXǙvqLYVֆ-܏LZ +#tv !_٭_4 as3X1zcg%C54;|E𝁴F`9Ww!m4qq "F02)+cU0,AncaL0 ӘZ3YkMUWəăn4z8mżj&#Eb08e:C/] ?qq=wcJ'"j='pK0Ch45j0H++4ud\bj Ĭe J1Ft03C&2B?_ \"zN8uͨDr9`@hKk8"`Gfӓ >uCàr2:CqZP=CO򅠨)K}%MĔ$PG`Lm%͉7zO\黽H6oA#Wf;'ve*d?SwjF@|y6tp%b437lzI]./dD6,;aȖoÁiěu,6~ږwm(r{@=臝$1b=i4s='3t>C\b/ G*ȫf * h:YgLj@ F%9=&Coƶ`N,+zbl&8$K9/aPsym9?h s?ca v/pn9/yvʪҢC5ދ=Ǣ}*saGh.x+&`a1AtHx {կ7bj%" ޤ.Zqldf+k&lϠ P&[LYcE* =XɎ]0w9' ӆ-E\+R- kX&Dy;x+(.DWaҺs)̕0Rf8i bR=.̅\'cMG UF +|hܸBֵ}h$C: pEIFQLLE%Pפ0Ա7UC̓k: չV8zTSe }eF ^t4HM5ebi:k0I˕\60h$EpUs~w #%J"H p\Y]E sq+ؒjq"Ф3vF t}ʕ媏͠2~ChV0M<>_5jpMI<85TYnî|K8ĵ:s7#jfu7csk|~xas$V[G=@1Xá5)Q'U9P:Gi"k4ކ:$$Qc%-7h'QSp yDZ8(ܽbα ]w|w&`3Rgn=p]L\5a./M+FTLuU%7ƸP6FxrNϬ?.+Q-%Ʉ:74F>tˑnrY `DV2\ݐ­r.+bn|Bݞnv4} 2,A]Iqci̸It7ZJyrXnu5McWܨlf]t[wIub67k5xḳ`c*5HLEz)<8 KVkunA`2HC Dx g_Y0M\&a1mL,-CSc7 Rc$.RJO7,7 a}`Ae* ,*SVJej |7|WF|1 *mpإ^ו>+{CJ_{pThF|2+ Q^ ~ E}glr  L.٧6.ƋO|N 3̋ګIT_]ʿ!fA]5Yǯޘ.W 1N{}Kߴc0gb=gc/}f !5$NǩLG(vd/# +G_Wcȏ;\b'7MIGʨKyeM>Q_`Gqeb lAE ; 9(wI,Էi!>Yf-$O~VBV{t`+V-Yh-\.hmp1Yg9|{ sTC/axMOAzhp#$:O >(̬A x%*pvypP\^#: 1lB^ ` YsKcG܋r EyWBӾq`lGJ\l$u/tͼAvuϳ#! Zf{|3@Gl_ v!mpNz H뻼nhH yQ ya1aOU2`MI]Md2M+ l'u r~ea0\`7>촲%hv%,yNׂȺa +m"5%rҍe~lL~lvo+֦jr,Df[Bp t!^(]SmKzo6 V%(`RCW%jD7*!"?F̡C g[81JHlۤzU7U&5xpd6h.Nd!Er5P;3Ũ 6r%v n #jiL>Ǩl臄'3Yp&q`"1p +A'Na8OF2Gq` &G#H8"?8Ѵ||Ҡ%8^l6Xc`[8E~_nϰƼ^P#΍\ffY웯w,=0r-4OAdvOOgxE,&b/y?@>?$mGi4ugC9q9I9Y3~K˵vOr`,pdE~bo8pbb)~9)C$1!^]ѧ<8,z!Y0,w  ^|iJM%kZ{W ꕽj:0]a3B 2|f_-,ڃL_=pe O>bwGZ¶+itD&`LA2b}0VH]-r]l}ʬjYهaTV+o?'" ^MQӾӶXm2~ۭws'rl >]6a⇯}Ow߀,5dhqr@`ydcl1H +@W R#=v:$,Aӡ]D!eֵ J 0̆Kr i 4@OM@4; -ύ#Xf 1]y,O]yuu[{ʣ%\GI/C)pQ6x%Y!Sj=P^ͯhk }tXHWГ4N`pΓX,_O0NUf8I p[SӒ^Ri;DԩyE ,5^ȊBj\ly.oypVMjhevxj9p!5y¦\RAm-5 ~<&5':ySO<<Y-5f,ѧЛ~f9Y%恳MbxK3%#*1@ +ub0Y< {!7y~8y^tr)mT52i+S\1Y0hsdLs2^eB c&C82^V#|zhPd2ܖXl##a9E4d#xR_ /vo6PT!83k \/FWzj +#\|π<"W;]Zt$Hb d_:x>\/isuUF&1WMNJfL~K[Hdq F_G{] +%^5:i&1ҁ2=UPHVM wŗ1[xXFY[f!Z | 5"fCtAǴ@@r!.ꋙ&fh!(KQä +J4M' >fΐĽ^膏0ÙHiK3xX4dO[Ȝڨj'| bɒgC +M7:gG^PcPv}3'TQ.H]p`72{lV·26ۿfX *fZ'Z/ MJ ؒ$ $X2^:+|| +` )u0c`x3I8I*|X.D fptLe%kI'pj`i) 1R';Vˁ9BJ @ N3Lmy7١JAZflL: +-IfciD%Ь$ZP}թM'8F0d* +XVMǂ +-yمbQKS|kayqԒ Uhr|5EB e mB/u!*Kp= 6AvGB̄Pqx8F=]ayS>w]j lҬ=ő\->_l1 qQUƹt%eYBA |2vrМeIUގ9TGS۔XU-o$)P o0QE 31k3|dx,n' ^#I#v2os-|4x09©4@9JI{#!b^'Yfl5a[ShNLtb*p.A5!}I17@^=YpJhui27bF Ӆ@=_I+ ^@8%zPwWd[cmz&oG; %8RLC#-y0&`SnԣqzT7J#<ԈHItscV^YTѴ&E]B>X[4؃vN7F=ɽ PE;c/l_vnq,^-ѣz䵳&B۹qu2lTQU7񠺠BD81J^Z?FBRnﲔ廴*5&yZ\HuVdՈns-f.7Z-^p7љFw{ nt EW2z[*u홦Ԙӵ7VN]}rkXnm07ֺ\Sۨ}6S|-mѮ{Ů]\F\A01 -DG͡ہv8NS22ZW)V1x`h;,U]DCN4XB.Y|X4g%ҏA$:2: 7e )U?eR &7ק| *+mե^~% uH { Дpc$+# GNA3Z*{CM[,Eye$ [|i+ؤ)5L}$?bsy& +UFr2πqD-;Mbdu>zjo^6F%* 5$4PfRt=GoO!>%(GX&Bώe/kh(^(J`J`-CKM6w),詬5:Sn թT~VBV*X%NvQP@Yy@X_$%<榉Lpa̿ QYensX.<)4-]h9.os@CL/L2*`%aŶ$ZUI_)} R}'~Sd\gFL@ iyM"85y3x W ʬ"!j|4p,kN/?\z*Ʌ];D rywd F D$e` ޒ2$ŦҨIӭqXZ@mi`ʖL1ee|Y߅7kƷd޻ѼJϙNcu~h}`D9h& O_9 +:iv'.(抬$5#%{K +$4M$0+L$J)zb$JafNc^cFTeamvd C40])Ur>&Uh4DU ȩ2X $WFe6AK$rp>KTR. g{.9Җ4}AR֩,eBU(X_(sail nZ|(o! +Yu>/<;u|}6i[gwϘff +sf>9LIyMMw% *GUOwEl&R[ +,.X,,j~]QKzqh?"-J>q&VwSU]e]AzT0j{b +r_wHWBK+9o'#5,f3^r|dƅ#$`]C!ٙVE![4 S؃)9 G@$%b59Ұ+9p$Ufr(z/G4jD1dJLI-[աժ*DZs]qq"CM?L*y!jZ55̥fODZmtH9{vZOZL(FJVo(,QXf*Ъyo{'[ hOB+/fB- */EͩUh +.Vʼn4NbT=E}'*6םQxeJZ_*bZG{PKUav dUU_&>AJc"^>R)1g+7GT,[.ŏk25Z2FQJFJfb^ṡv^ کvYJ֋O;!NuCԽܵ +g;o?`//<΋7Ћ;BVx~0qi]\~jKw72_wYJo\hWw+7W/YzʼZ}#yQ{KxkicؤJ\dU P K,t=pu3mddmMv}=*d|'ó +:&CW@C^ `9Nӱa~;\]8eRR:L$2'!h0&((4&V#9#iNC{$AeYѤ>Hrh& 6:?i ?s2cD;`2q\Ye ec kƠ5&8tf ++oPPS1+(e-]$ĔręM4]@G#_c8/]KXBԆʇdnN:$@\\ +$ń1YDУ .&؏LMH+B ~chBqJ¿ δ%ϔ ]Ƞ$Wq\CzIY i$Ey\TPF +IU7LL%I0x(j mj5<:!n%,Xҏde)8I)U &L&x194%|L(d(hUq_LY,0%ba~ijc/~(dž >Dƕ픃l2Q4:'mLOb_g !0-Ś)$PRzQ?25p"D+ a8 ڈˡ"ɞ +}x_JrfODW23(MaQ͔*`/^:^$9M./ebeojOBڈnIu9I/rZv]Mqpθ7&jFFr㴫Zn6m̭܍pW` +Eܧ[]tK~5`Jn<\iA01VfVGztE}\:pKQ' nJZ Z0" x Q gMcE +oL,,C2d7PI җ.ϼif0N{ؒjPʴS^| Q-_Qʪ@v[W] R Nþ{'G H(8ƓK @3⦐EB> #h/zcx$:e7]jp6kYYqF NYUflCGOm~e[XڸM5|uB&-ɵ`%A ,:{AvB>|ko^vn% @r8|l;Oi5_M\x"7c['tBe`vW^'NPk..02S]YTQ,=}ߛøcN +hox" d?Z} 5XmR8nUv]3gQسhƼsD"F$B7o#kӃj30lpRagvZ9hz2xOP"P;YgV:ۀc?Q."/- +Ѧ9840., ^q0Sݕwl߈A6.8߰kS}"2׹BW }-V N֬#81-7B8,w8l b0sRqqzϞt.<\,Z)s92_yjDǨQ +!N=l%1+ڊ3Z:Ioc/&W9TzOT˶*|lItW}h^HVΙݎcTmU(@=Rjb+TN:q/DDw +=-A3/hM:c^))A(߿?b6>lY/{AٓV#9s' @L' %@ !s xoA]6z ( }Ϩ,݁Lh`_pHdT4 HR>c'gc\gSMc +9gI'qW(^=a)T4˹/}H<V$F>7[,Ilôr  $6`y#ٳ+PuLZ6rNԓ +/DQ%"g F~8vO*nۭ:&DqVDGQ|GʝC 6}RKeY\~ LN>J^P4,Wj:enbJl +>ZztMbb3ldM_@%٧VgttӨ3l4,,2XY˚_&H~ _̑ +14B(`;T(솳c3餏VLD=v)~2`eƱ[!,slyȒm)JOy7&+#XFoJ>}f%[*]Ki@ B"1]zx Bu{Dm V^:m-N6Xo>77ָNjn>Ku>;FaZ^t,<g\uΌq#ֈ_y>ȹ|suq9IY3}2ɟ9EC̀be? ~2Rѐ]HtHqRp>yR}eQE[sDN=?'hIZBJ{o׳;r> 03kǙqA HbACt2dY}x룪RKO&}"6<|bժq_O|ly??˾`7%ۨC]*~T,l83iu.EY۾Yb9j@"b!>aqQ5цi 9NŴsoi}8pܲô*' HN;lRm}ځS!vyQӮħS3YGjg$fnY4䩧{6C<_OIfrN%~~yohqȊ9of?7IZ,DC^z{IͪHQY݃J{Se_MX-ߪ5tTVD|Y +YҾr+Uu8T9w:ZDmW9ZFi+kʾ__-\KY@M +gJThg\]]VBDr&p,ɷtChĔ@mRB̘TWhϸc7ڎd + @p͗ܨk.jlb4}i_Zc#A DP'-2CMY[Ьd'?aA@BhP!_l=CCFqIڽU|6 ;Bھ$U@v?xkc*+R.4ۙK!hiM&C/N 3eAa1)`Ō$$2B M + {jNܛ + "'n%Eu  oM4O6/V2?m>5*O1+yF!e<#z<N"K]#׬|QYVX/`k;O$8EҼl8%v@֒$ !jIQMEUjLax*Vc jL\U"uq5!s5k1q)F-E^Xt6-ŬF5X&QK1ojdbگm-&} +Sk1Gحbi6K#8j,XK۬pZ!ga-L{> GZ+ukqQЄ{k1vZ*i>ŅJK+Y%(kc~3=RV3psb)|U|{Ow: (l۴ kWO~?`!aq/H1uX϶NgIJq1nĨ/Mc17-ͼ7 +b˚2/t˸#P}1VW#Ÿ"֮b1n~_Ř&6 cbD]׾_MK"d&\yOdz;+jV:K[2˱Q<1 q1|=nTF&c؉C7kZ H1cz΄l`C17R ӌ%X1ϟr+)Q9%IneTN3FTNb=.r*;rfNTu*!WQkP9˱_G199TN`$l"&ǧp1$tP"&+3&Ǘ/5H19SY\e_J<&P#(ǥѽjž|dd`z^I]mz|#0#2=p t GA 뿈w ~g߮gbcn +6 +j[}wi 2 +b^M[*zvC%!ZA~êLiwIrwZ<=mo Kd0Ry[eETRIeNyrJVT˕7',G]oń:U3\}/[ [1'No-@-))m^1ӗ7EMKM 9kIH^8Yt3Z:X,kʇ.dVuBCCNj=GTqc҄ rn,IG^\vNښ)D +;})5ޕe5 ~%U޼Dd_YX"?|@65푲PBދU?>/+.T-^ׂS }pg"!lP% Ӌ +ŧm@|iN}v9 \@l3m + +u%Ep(!P^}y-ADBU+Iq7D=$1ypٯ^m"-~7ǭ--R-}@shDtQFWWƔ%(会M'%PNzu׬*A@eXLIx^" eNЈ +XWxz;#;u%lƒ:n7͆m6FcGdVZ/X6i!-i'Cg̯5xvkM K܇U4&KTs1K(#TlrUUosĹ8YmZBE)w9u%R~ýZlfXr^4DN؄pY{=UeYWdQ;vRrʣrNp;/kgQA kY-)LfwދkkoPeA[n*|[]?ZgEⵋgz8?RY ~}{e2a*b;i1?'h\*a_I-հUiC}ٍ Qu)(SّQ23}2嫥cC )fm.Wn +I +wQ/kӭ$,7O^@V%-PP?p!:bOl+3_^{w4< +"3x[#zkb^J͝e?st3>oJjsB7r^:!5f /%ƪr}_ų!^ +MqUHvfaSty]>7nqYnl-Yؾʀ +q+ܢ<̺ +-=t{1nGַtd޷2ddPBFXX CV[zB3"`9#+8L~\TgEХgg>NA Q*5iĄ݈Q޴1mPUNcH?}gwu x}CnYHg7eєq(lRF_uٹޤPqShU?$@5~eW{r*wF_Z֯W8(>) ־w{ l@M^;w9G|m|m>[ ?Ƭz]߫`LWb&yX\{~7~q0|r0)oHoWQ0K"BN/j7}[yKgj|MqBז;>= ⵤV@o'+ +FD +8s~#JkPC|8 ՘DaG~㏳S>]\p;^`U_$>=rn[(YPZ!'f0XJ) q!pK`;|G~\lLkD] J'},JkT;-YyX|Iw),߶|+_ooލ|D0ל0礒('Y$<yy1{|ϱ?9N{DwpZ` MϏ"?B>e ye y-[ȳ-[ȳ-[ȧ~l!~l!ݲ<޿@>eyeye  Sϛug[vg+[vOoA>}S[vg[vg[vO-oB[ޢE---S[g[GA~kC^mubW#e]W]W Ⱥ*K^aiϐW[#cA5W[)ljTgemWCSؐW[OwNy5>[/hjt5>j?}G WDkȃjK}5N}ue뫭Oؙ{Aڽ+\JAΫM5E֨ -[= +>sM`o ~J=.fC`S +g/y?OWX?y6j SNe|6,'$ϫF[A'EKLŌ%bFJiFJBb*'$(%b: +StS1TNG)15MG)1QkLQטkL|5kL|5b"S|Ub>*S1uq>2S1ucϜ,ǮhT"S5{G>L4A1EjaFզiM2_?C^ +FF&#'m:ߵuBg ^)NwiP:?K~ .*NwiJ!*NwiPb^=I~J~j*23=4?$Ӣ4U?ֽ)}|½w{=|jL:>cta?Cr&;455bjhES$l99>-_z:JX*]]&+IQ7,𵧟,๵k{ BzWvb4le. ʢqv=IOnmvIߪyFxPyet^Y_ꂲF_2lEv @١ .?p=g4Sey94VO[i i}ce yth][>!,iz=!~ątUI RwMj/㹤Vd]M`%^0R%u* 7i' b쳬ϽՉ,EZ*jY_lx4 X VIKşl=&d^j&bBaQ5{qj%R^ $.>[bVͫ US {ر^ޏuODNITSb;3%niDMJq_nl2XllrF5p;V#(YTa{(=jsְ$4v\3{ֹ|]&ġ+iPWc%\ҝ+O(+/k9H _^4?䀝$wf=gh ՜Z DN0m,pwH6rMR&~ZmCYn4&|޼^4T^Eq'f*HHu1?X;_ +HR|V# YŴ`D,`*FHYNF~yٍՙ_g³܎jyMwYۉuXf@,(l;L~WnYhsVWJ͂Kشƅíj^I޾'Ǒ6Lߙּ6fW5X1B~ew)6O^}S*VKM!zk ́qϙvZDyTwnǶGO1+nd{A4̔S1;#y\% f5 ǪH(VPBeJ_TtcգbL\kVi]]=KvZ=Z?G_LKNBH|2/iM7ZғT7qu3:|wBSK*B3mVzk-I[T'ot%Dw_K2ztQ6~wE&w;p/xݺNrZ$wvZm=l{Yʰ@-R-ŶDe޼찳 uyBF ̀ǼU:њ;*J_)۶7t‡mرy;B=w&fASdQn+HepYELK*#+btrv2iT %u0lV;F}$$7n,.sTuh;7 S"12Zb@(Alg ?}XݿXm592Z|ͣhs۴x7WPZeΐc5NG_jP;`a0M}`pܳ ڼ_f?GŴȄD 7ұbn;`%H' ˆrh]P< OuǷ!o{_ fò*% +ʾXmܣmOrc,5 VpU AQ +Qro3S}sbK@*b ] G*ٯ21wtf#12jE]~ŕ޶Up+y޿0`|Y}'v~Os P}e1Vc/ +?whyhFؑ6عS74MAk*|-!vN;PU\yhg3яXGLߙּ8+=ZEtvEgw?bH Ei~OWa~za~hP4ʛa|Hc)e ֻQ{xCG/`-sι*[uFڦsᒼ#vPq?nLl+CYEy<'QIAފt3C%VC̸fS@%MJha'_4҅x j8|$ڳfK|nK 7 ヨ=ou闎HN0TmցY ot{Zo{Gj|X.YG.;&viR5/V3xo[v;& i8h#[kO`8pH>/&|bc,/,a^|Gƨ{>W?Q3zl|Ϧcw{Ro~_Wo4!uٍ<¢qп7_?W?/_uΎkjE>ᄍ'_? }ϐ_Շ?k>W|__:g_|//~87O/{4o{ }??K?>s(W/d_7tſ?_dos ^³Ȣ/~bR3ަ֟mſ?/~amtm7}њW>m>?%ӟyX3~$/n':tĖ ^g w:fJ6|{aM)1kFoݨy5M{" K"4r e3 SAd;CV+#R2:H*D=b*,Ey 0s;VDH[jkJņBgLע߸Đ4-.|WE; ^`eJm|1b/{#3+BR],JM s("J-Vןr0u BXUϺ&ҮrD wJ}uso$`K@׭ Qh`5Uݻ2AޙxVUS|T+; D2=;#$G%$^74U֕xnCtJ G-Q຺lT HztrWê6%H+fi y|ӻ[h/ld/!{U_U3vw&u8Ԝ$7 ý4.j %k= mՠ(B>Gj7,J(YnuItNJMK-4tD[LhxPL@MF3ӔiC +^قtٽ暠e@Q- 3s^,*· w䪁_-pg<SGQ4l޸k񾏋8~|T$*M#i]G/75W#3ENA /*KjF>],z[|LE%ih8:ST)H~X(uSg,|uQ^1B<)?tw̯{ ^ej!?B5JՉR_Z0"WkcKfMJ$$RG!^24lf4 v| Kn=20.QԽlOF9:0hsoev;zOd7ZΦ5P :{KVd1YZ> >XR0.T yv)"A!۝Gݶnx@SxX>\{dڝZnqBY]86<ֺ3Py\N32E0h@NWt|#'0 +VT 0ovi|dg'E4u0pboD> w˝Na^XFW4KLB %q 3.&'6ĶpIT6^[/~Jdc0]J[\檩Nm7GX|g|Wx +"U.xiN/%8nm*m}u)HaCHujj4( ŎfPlhY%@j/5|P(s4 R5pmܸԽqjNW==Q6 k d@~xY$ܗU^LKmQp,oxμ\ y(%>t1-{7eu6yϰD=@K/ƪ UBEQwZ;6j۳.+t`%5P?#j,A G,74\f/&5Uv;y ೕbWmrS̶.!ӼY,?OAKW`J-fW>"YZf,_ڣ-[nSnY$D$KDӟ>ooPucVtc{]!e>Q*|wai[д_Um͕CZ>z408.YU#"PA^F}UdM҉ʊ40(>!Ij5L6Ym2Q(EZ!R(C"6\ĖOSQDga’zENRbp=ަhR;D~ +ķJGJUQӏ"eU%CI9>kK8e 8lnޑAE4IcgRnfU, +B@ę_#L{crL;Uc= g: +pQDA̰R?Zn직I氓GH]qy\-F J>ՇzO1ڑjK-DZ6v_q+7ahȱ=u𭟄N!"]*@>W¦n:mzz$jAz`(C3[ʿJ'ihLXw-Jř)G\LH,++PF,z3Eqx֖]DX-/Z9V;S?)hшvhE"Hȶ.NOoޭ,ÔHO)\l +reGwLgqU`WI3,njUie}C"&Lue) jP 3*Ӹ|m_Y,'TXa^tAZcT2ڌ8OTJ/);Y ןPTnW8GIW2(lmv8{~VW1\g!lϼ^:`b FQ\*dLgi/,N< + $j{srSWb4.x(5$J󉥳A")ǍlŒ>u+i5)k*RmSTQך#;"> +0釯dSjU9EMzSyCY-}l̛rqlӷY,Zkų6\)πZ$R5A~EY*0?ŷv}{XӔz #eRV0IZ7(̭JL1>\cmWVUD#`KˠOAbdogUN|7AZzNe&-LPB- &Vzq.fTuZV L ,$Zj=l+X>I\$g]l9&=^)1n(RuY)`(ݽTԔ30 MR觊, x_jҶַrȈ(3\|d Q줚{P8׶FpV vl#ekÊ%e4옘/1jӌrEBTnV> 5R': +)KlFt`"Rl%lee]qB0u<t@ 3L. \fZ3^K*ద"]\J' O+*qߧӨSJC<_{x DQD$UIVb;")b\K\F;mA.y0MX܇1ժ3i4|rPI^*b_[8CmPlU/p$R&^UtK9i7Ͽ DhVT:8 W<0oaR;8rgKwZx:2P 8%BY8%3}H|+YoE*1NQ>I60ьؖ)r pɶzsgj{Ж^mN"cLD'~e U-\bXfFڷQyEq(/%&jBҢv@?lb|MRqGg)jr\Ȣ,E9byː9UCN/L²J(+it{S$A;e(R3NʣԶC><3bPӯdΰUi>67_Qh͔1hakW^V\gYi'!*(b,pZ)7}"*py +_8Sf!#@Z*T)nDe&l'T +W/ fzH4ͻqEVҽ +YZcJN\;xת2AbΕݤ ۼ/zBMA tQ 'ޢԲm^dzB( 7&G"SIç{{TV hr^gʕn^k u=Kz r)3a+źSA毾ʍ]m6‚㝹7G]e)K̝30戤f$"$U bw:luO$,XC~%9/r(VUB yWrp7ETJ3>m]BXMnio+,x#wS4nRLlL*_,iL~ OIFo(Nd!Ҙel +?Ũk5>iE[ IsZwE9WS՗/#x][զ( -yzsbJScS+Zt$ +"QI0T%c,MqYf]8W'Z/u^ r;p;NuDԪD!u6YEp~Ir;x +׎:etNk_[*>>?!tՄuD +طn7'Gaz+ڗWVӃM@ͦV! b#"Ztġ#2b^_Umd=mAY= oB"vK4vBWcCeoW%hS:f#ʔHh|S>K=; ^k{VD.n.̲ YVIKKt,;SU0RdKMdYkAќR8JbޗwCN s=i*Vng1vnKڸ `b@qԤa;Ԃ> %1hW!r&R=^QXͫ*wYqea +#]][HKfUYdk"m_ .~}[Fj*DyYt/Nk'ɑaT^0 wJSIxbc)<iKA틗ՑYQU5Eq $WJr+/ʃp ]Pur`K՜bt>,Lb^$?`U4P @J c{"mjiԮi\UIhgqYrJ%ȁJ` [Cu I2P.e }Ϩ$_/Xz6%:_k7QF U(,-JpŬխW3BGH oBqlSVå."BQ/5/hS8W6/3GOdVo-S""KqnTʪF HMpV#جSD03/QNb,CDmWiD;Vvc6f]EK!v,i 2"V)0kWKJNtaNZ.tsi|"P[ M癕kQ#&f% wKVP3B.q6Zٽ4iU",V±mF1NltXC hK/71!RXb٤4 z=Q~ԱLBw'mCT~:` 96Ke/W"oVI +?i|+MfsTę9; ˉs^~Uq.ߌKݽ +Jǽv6}"Пn')S}/sKo-+SEMÅ%CjJ;X +}Qvvks| ZLXp[0U#/FEcJ+^?5*=83H)PUPFZ8vfJ"A_Rau s̲{wz<4Ji!u)ʰiæۊ7YlNtNM+_u Yn]/(i]{H +%n*qK5zU|W,e᠈rzT~=lTz2estVđ2ߴ[u;mM968Ʃ?6YOz+ê"-MTPv;X)L+=0*4t듷ue˄QBV*Y"'Z8QXvqZڏ,^Q2F>/ +GxrZfU$Z8e;G^2iJtWgqJ{RA6)ʥZtjҐau^nC{GAq.9-LVHߢi k"V/Z{G !h%&A6%#Lu$Rc +j'U?WjVp|'/fqu[f9rFy pYbe E4Vsڼq%Ra0wew; ?Z tB 48[#J<0@/>n,YPEvuɢAFkS\ +T4sXͅm//(Sv\z I1Jh~PhT#3zԶ@0L콅H +#x3zXtpMm%@N[ +h_MCDWkct†kbTosy) S_ܣ*)]1КKE򫧯DfjԄɸQjq-Mx(딑@j68MQhC],_,S +P[w{ PdGC%Z\)ȥmjZJi]+Dd< hV€tF4̧t!!ǺFy2if~b$ +Gz~Fl.Bջ`n*D¸:7ɒR|}ZYvÍh@wA=nmWQZ%PyȰ2,{: L։@&>@VR,dȅqI'l=@Fm& w5X@@FE [2ȸ@v`%Z0d\ eayȰ2,3 'GbS3l n {y{LrpdH[GVcd<7 9A&sf#LARf2 Ȱ2+Sx"PhdU2žoYYCi&'S A& à@&X0FrBU:'Y-uFU~҉ eBU?d AeFay#jiY-AvO *sBU5ZA& eDax#Ȱ2,3 AVigdUBA#(??d'd2l Ä ''6 Ȋ;\H +Tw2 AVz12 #@a-d& OYBpDtu[ԷH*w@aDugJ. c&dz( ddis~ǀ +2=dn3LwN{"ȊZY"d@ax!J-3Xs@uÀ Kc ABFY!h="0""IAV +Ba +lX Ɍ +W{#0Nb1"겼d' AV<#ȰM2F OYQa@1L,+U,/ AF΄ C 8!$4"$0Dd:iDc2v #D;&gM2mZl q@A/{ kdidi AVQy!ȪVAVNdoM2h'/80!0"2ɧ#kFUR#, #AVًvLk@mdR&y"dd27 0!Ȫj2iB [<"lL<dm̠PQ7zܻq@/#gB W<"0"vA&"AƳd8A4d`_ʦD6L2ędd&Y=A 0!AFrBU5}2m^2&3 A֍ b2yo`$a dy6tH > d#q"u@ KcȪ6#L/D H CE TH dؓ@H c20a Ye$u{rԙ@V;FYQa&;@v{3 7I m$a A 8d d2< d=02~ +H +"R7S{"i$adfd: H +"@FE c0Ȋ:, #,I r )BD /23 L +xȰN2 LGdEm#H$Z)_2 L Odd:s$_2~D + @@ OE +WdLda Y1}$^BD 6Ⱥe$ V'(tu~Ƌ@&D 2Ȱ dXg,L D R'Y9ۛ@sp|40Ⱥ5d#]@Fu&)8dD#, [@V2o֙@e& dXg,Lgd*wp&uH *Lr iydef`IY:l}$1 dpl&O֙@&D ә/H|$ayȸ@VȠM2Ⱥ5d(|Ȉp de;2KȊGNL #"qH +KXI@VJqT-O2Ⱥ5d%OA ;_2''@&ˋ@&D gM2L #R.': dȊ-#o@V5d^Y'dX«I c9@ "M c d%fYn L #" dčf78L 7L Cv&H$q"H KH K4$Q$q$х8^$AY‰@VA qI tO263&ʚ2 3 @8ȰL2^2 d/&ah {y* #@3ȈldX'd2YG' @\ @VL @F4i =ѱ<ǪO=3Lhq13 ?eacjcܞ7va⏁|ucb3L1?F0l握=ǘf?F:xfX?u2d!2ǔc\Ą7~n?VU<ǘ1*G ?c|1KU~idaL>k?ی?<ǨcD/1?ngQ'9ǰ2T3t u,fC޼,e3̶olP?FcɞcEO?V"'17Ss)f'c%+NJH^3.?~U;~L]I@1B #~ N2w#cE~L'~̚wv1E46?VR4c$oR~EcEnjSm%~ ?=q}?6[B+%*&~?& ?uƏjF7~sƏ)?X1Y' ?8ǔMcX1?eƏዼcEX?FgQ(jc:~̌2"Ό1Y\JN|0N1 }?1Sg9}acU>M:t',OXUsEcUԙ>> c*Bxy>c9Ǫk*>FL X-˃>ƙ3}‘{*]}=(|01Ĥ:ǰ1,oX 9e}xC1oN1]D>c;cc4!>cL})gQiS2J}Hӄ3x?'%^1YG>Vb)F}I3HS~o':l&.Ez>V2V15L1R(oΜcU1>GM*`cU^HS"IBC1z6fo'1h9xǪ(#}=aYH2ǰcXGz&,O#}Z#}L O?{.L1R/XR>1M3>F^}1g^1Rr>&>&B>Fx陎1F >{0ǪFc~T3Ǩ c,/ED|j6~p2&y>/+ʹ1#𱲭3|SW>Fh)0^q$SISj\1F[8dcv>c&|+cu;gS >?x'_/k|do=#{Lu"#{ Ë=&ads14'Um{IdILqvGgu5K;WLRF1ʑ=M1I+cE'z#>JG +V&,z̊Z1Y',zLDQ23x 3z[FYGX۝1c1tF/&F'/XjQx@ucT2(yǬNqDUncce @ͺOtFc*:zdc1 oXQsD5G7zL=& =fC+Rc܍=6X`uP'ro[''Xn 0o`FOc2:Ǩ}cEoO%3zD'@ǤBIq@IqB!:ǰ1Bf'ؽ]zinF>kB =6X%'1u1 3zLz̬#zL =f?+c3zl n XQ8aD=zz4uG{/Ȅ4cuxǴwcTnfz\ی'zdFB3z=fE#z,Sz tBU 71z111yBqq3z='< e ==@'zhB):QcĀg"z,-#žzLE#z=qBac8YOnDե4 豴zL=Vq1[> +$X{@1 =5x'Q'z ۈ#zL'=c21 z =uX{@q@JsD)DQO1Ǥ;Ǫg[G#BcKr1y <<֍NSHӷ=cJ1 yL'yLƁ<cYo5LjN1 nc)`d~T5O䱪‚yL'ycFX7 4yMc$1; 1էy W"AKcǤ7cg8yLcO1<^'yȉ_qQL޵&W{ P3:-$IjyR߀$D㍖eY 2M* y%J 4?F klg +c㸧r\\e>WTVV_=x&y >'g{/_w#!:@~QG6 Ejך1=ȯfY_ zvǸ2 %q̡|?0%ı{&~I;/1=G})m.wKnHϻK|%?W]b| Lgj|V^k]G9HɎ{-нt/;7^Lg| +.fںeOE#:ދ-{-ྲྀjx/z4Y^rq:F {O$bS}+K8RQJ{m5^z{s߽l*}Y9k rKrڋ:NnOd/^m%WMB9/g2(f׻^R.VSA WL'{2MAJJ"{m5^ .]g +KTlzGKLj>SԭK&2^wE%|FzaqZw$L%BuoD/ gxc_⦁26* O BP.==!uKXYtMd^z_uQ.F eܴ.R*ch]?BtM3ZW{=[~x-Ẻ^ %= J@G K&Еi] zȃ֥{B-`к +K8u1 )='TTമF[UcwZU[8 ᵿȸ.-SNEץo,K{PRBgQI|A@]e( X``4mGKoE%%qpЅn@C(_ҹ|.s]2|C0 <:Jw;ṡs;Id.v|r\/.VXW˅73FpU .AO*2EhpH~m. "cX,\(f2_?ں7o s'=ͥ+F,\ +Ruh.'ţ1Ϧ\Vd vsɲP%/( ,m3\A(v(;24\+ɥu\sNjMd=wNKwgISE|a{d.hFggYZi߽Ptzs5RY*ЉY ΙYTe\ ,Zi/ X̨],:ERռfe1Y8YaM8&3digo"1N)Y,T,V@ ENM"[hQl=:0Y@ξ)YpkHgJqrA+k d3_dUU)׆d]*,TbB!,d2$5 d5=}T=Ion HYsv&ɢ@`dRZ,)$Ku: $ l5"';#Km7`3,)ω !1:@cd6QtFΑfdn܌,oƋ>O`m;(Y5//HC@P.,uHegː,ސ,T[$T>nd5}nHVJDT%[dᒨ`@HnE2$ [юpFi@_I,))YkM2CCMצdIKbQLU[,TҀdaE YR,!Y͌dѕ|wCgeH[xwA[tVd>stream +87#K`pȐ,^?f*R!Y($GQ[PP9J:Lɲش-ij9FGARrʲr` ͈݋ʚ1$S9d)~eQ zJ256%AҟdJEؼvAɢ)+(Y~J"MDQP,qƦdq&LR8OPqS,RdJV{"',k)YJ]XFdq&d!,ߢd{غ$(YU37%-kd))w +LYG&d=tKժEiJz[4L h"Ԫ M՜ShJ")YdƘH7>(AZ YX!Y(%1dYB1Yt90%L~ d,2ůgm]AYeNqP>NplLϜ,S)n?6ɢCX!qQe +R,s2*KYŝUW}H`&ܚ-Vs-A1yUލҜ (͸iYPY(,+٩5q=XYYZo V` *뙾bpc@%j%Ё^zgdq>Di諅" 3*Iw5Gd!~➦i΃`dQ?e0W%Y*Fq⳴O FjMYY< D[gq%D SS~-#4c,lpW39#ڌK$PYT9# Aٜ`d9G2$Knb +~ KYXVeFVg3Y[H-:# QuL`[0"V91T,͚ȒYtY԰Pk`dIĒY k!kA$rdsv|^YK(=ddu\0* k ȒY 2 @dIdY),,Y@ûE;LB=~e%"!;x'%BQ/=_1 di/J-Y̑L18! ̬8hS"dIhhքiy'hH,KɚEXZըf,8!f*%3! Q d!沈a9 Ȣcftq2K{pbҥ>w?C45D$Ṉr>wc/6XTTuޒKjౖX[|:DGzc;Ҿ!bv" 7 +& c9E#=2 : c +2NO^E\'ca]imycOj븼+XIIu [ 2mb^B[Lfca@L~hCsX[ 6|s J 8Xf)!tWL;5@pݮM1lj:fRp,6^}E2vLBm=JmִXDN  e:jͺs\@ AȢl<+yFbdMmD:Ê,X['8yy]X4:=40aYk-uP "lPb[baD3Ԟ%f -$m(ҁXn\v'@mn%94, X  XXau; LBa)QF. k#5Z: /Nai^lYv0C?4: +)W!c牺дpޛ{E^m%sܫAY"Y}^A/x +롏mJhu 1JV 9J:vؕBf3XgGLsx +4gЕJ-+ fRxgW-^qux=^ML +-V,bj+؊0?_(T-!V[`+Sd mH;Jeg`~Q.)P+2: +SsċV+Jz΃h0Xt.gu-qT"pVjhe"K8arr^読{K*%X8/VbWx6ʟUhn4UfxwF¶H!.MR{YUPǝcLCy +ŮP" kxwt + ܁cWpWyœˬdaP\4-OX"Wa}rUQh3O\Y'8J#=Wѱ= pۮj+\e,p z\_Fk \Ex]g*V[%-}pſFl4snj +[8[*AVI.U8}'Utk*Ds[Y^ԋtWOlýA3EV1[ RRX$8?FuOHP2jARI~=c0{U[GG¹UK-:^]"Uh89ʖ zŧex$W!U[ v׽TZَ6ӫSW'ZZJW-1UsѫX@VU4)0B7U-ë`Vp(\kYJWhA;S\mV, WIU[ XU^EGk Eҝc*]a1[<Į +)U[ %t'8JEF'tFJ坍wAWXy + ]#,*3%&vbw2*]! u1{aW+ibW U߉]eLN"EnBWYGzuJm2 +Q:stb,2JG1.:$ATHQ]P2:yeeU[tv) v*dC߅BP'u]瘱!e2 +#-]ڢzvJ(plذ$]utK*DN2J-uXɃU ]ZaQ<*qyTYRp\m'q[WѮ`UԼO's}[hailPwָĬp//@V=Vu(@dU)|nv):*]hUK ZXkn_XUjx帿R U}BfUMs:J +mRf\SK;&U |`aʪWEA86jno`Us"rc`O; &59jbr1+&{;1?DV:5>WM%im Mk ]%aR, `5T!g)2oLJV%ZVn9JNvC%q$U3 P[h@XLvg aCj!XoGD=F1NlMWJt|mpjGh⓺vsU\,=sXZZK)oQƒU*5RI J8IgM{>ywVl/ʙVKUg Ic Z DbrXؕcЗxm|GBKU fZ +@E k(ɚn8=OTG?~ +wTD,h^N =QN^% U#g}2UkWnf WX)=*vV27}>JEPImQ8,X廉05a Kc/f)á+j(bueՌwSXx~_2i?Zsb+ܛU-9b#XMb\:U}>Ng1nE˰%󓰐b7}/!K5*UPmцƙ|yUƾ[*[@ +N +ho~KO_硷^\q +'434Rz\բ@sFEl~Oa7:d +}ch[ifl%4AS8[SZ^hK'av#_q[{mMuL߮/BTafF\"b0嫅9DZR[XlUcʇjݽ \J)VJB?=D$aŮF~Y" +։fݡdauFw!F1]?;YS!!ZZ#e>')Rj-BQV$ +#̞,n …jC++΃([2ymRk'qWB_qNU!MFxI"aY@'fFSY{iFqID=Y(D9PXۨ0x\Up&Q*dY1B.X*ٜhۮ۩ѭpp(MyvEwqJp}@^oRӦB9XA]D;e.%IȥmǤ,VT.\[P{Sd+(R^qrDyYSe ^8"ݔz,qQ=R,t*2ч_Y-OumJQ RwMnvϴ =+܊)r46ߜdUk}IXZ iszwbv鱺#-v ]%%you‹#ҮJ<,] +}֙Y8][UG4w8JcP p[zZ>NQWm"dKnR\RFDŽۖTjAZÔo;;i'}uFO_яdq\cC5# 8-f߼{3mBeSgN9KqXMkaλr[ݛ쥙uh/ͽ ) +͜NT!;r"TWLjp|cyʝ ; {Xq ;S<><qC>2R/%[Uo֕R{ +2UsE\^2*Ÿ8_Sg,ؠ/e㖦ID..(7ʹZ P{cN^f eRWfp(EEyRk +jT)R.[wNOGZO!!m)BV\÷]y|l'"uxMQy4 T[Z)2o;7c!MȍFŰBt)f[) lU'rWlFfLJ 3iQ!Z&NFz]G}G@qELZiˣLڄ0E^PÆA"lFRO31)²ZhEwbfjSԔ5%rԴ})Bϓ&7L@~+\Қ%:[d)i Ykgx&8N~Ra |ω)KcH;a ζaazs`.RWw g4!$7.%oEH} "˜*5)_8IKk;)* 3f Im v'l +Z^L*]ߍwK [ib_WZ^O'Xi6_e +ӈGއt5;<յrWܒil.T؂Ʃkqn)8*w͙D`@zXam*JD(IU T[uyid6LT}I"@[PMݕ=*`o/mQ6lL.H50c6ZNSmCǩ;0!,;1&542-iDeo2vKవWe((6HeJBrL@BU56=I|,~k-ޘvC;^LT{ +V"RȤ2@VYpiQs+BUm'P*f[ f봤౓z~ԴϿh{+ ubR1c)7qJH ~ UKN딆)K!=1?{%3'bߘR{핂F(2`wF(@]L<l!gw(Q I6 Qiinwnp]jJ'μ6IY=ķd&\&(+pQёPP*SSB}Zo\lܑKWў}#'F%uy5/j{Tg9[kLD=gPui]cӦ%+:5AUpIܫYU(**j Cn q| PmTAIy)_E֭Z,8R$Q  ,DMO/7^30B4)C;pJS(TTj^T:Pp_YL3AA ,FCA2=5Ǎe`3]ܵ]\0k3xW: F*LC;gT:Zu5$H5XQBi7aŰY?y^7U=\VO/T<*I8u)iu0 +:.bhrza*7*xg:!4~Zl%X-j#@uou?LQXZA : ;AMA_yyHC"W5)18ޛ6lTv8BKd )QOMtb鳀t;fs8S7Se./jG\N禫 l10."k.yrs%c/ Z_~z _3q97ӈT_[ DtK++KM^ٓ|c.tX9Bch'@:=?†==H"BZB%zBDrzRRtV,_E RB{{ aOUU̓C&5Uvf΂1_$ԫې|`ؔe0 WlU bhrAݷ\K4^|8larvJ"mo0JYp + +F 9vU@RK@.z*u1VJNj_]:I[ɒnU Qs}`n9HTD<0Va;mPCM Rh,PlS3 Ħj +}z3)gjIeFǻ`K9oyCn+!'Z;/6P 籓gO Zk춙>WRdܙTP +M @6U>A`-BdvTBiBv$& k %հ5j BUx(?}4ф93 :tU(WRT=v@&i+Z}Ipڨf`* EdNž7L$2=0<vEŜav̊ydd7cQ(k;[x?hYՇ[j\&ؙУ?v\]_Exvk\6-p]7b咽,;#͗X-y NS^UYr$Xi#YӅxކaಈQ kl>;n}>m˻Ϸ6NlZ2a}UW[ k4REC+vzx?¼RNH4_n' {–sX+l; $/vv;9p5 +ڦ ֵn,-A<`+~l㻝r rT`^!o'M>Fc1Po~oFhCà^A }w/"S5$zQ| 7=Nl;zےnjETUb~ڇX f;0PmM15*S`=ƽMr2ք (v^LڝgvOJŬZ}y* %M*Lzu !Q(}#h5b5!/KAS_KEp_ojxQuJP_ oJ8]T%ƽApvB=\4UvߒO8BMXхYskBzVyCRN`ɘݻϴ]i]DA9_ 2@ r[7u?lo0gTWmv˥oT\ h[,Oe~7 $E3g>n% i4] 4QTd%g9o+}ٰyl_:pEx…O },TkQ<81כGTCęktzQ'^>cćO϶|0f޸ uUΣ_Ec[hM{@"?p]uKYZNxj^ +XN3ŵDx,g47_ b (ww!T?i$TXn9XT$\B8kf]Ji;anZcZ>F/=_aV4RK.PfiE)wq`JkNV b*cݴrӚ=he& ʶ" l^Ui + q㚷*|O1R}JKS +;Zџӎ _+ $J2'ۑ7U'ף'afPbrZ=ꍏvI5ˌ)WW m)e5{r +U!*[#=Nv_J<TȬj+41-{5NOmWT{wk>V۶0'imP{z$x|=0@.JmT3?SZET7yh/bOׇ71t]6 m(8Y*eC6dn }-űr48?yqU[6۾_.R]JavP sK]670TP4D.: +<7onIFs`[mǽ6'Sn`7x +7'8rN'\j=|cv#>;\q[饔 TlO@)af +͜3k&`uH^fFS*] Ι;Q[I.E +GX5KW3E3u:o?=yLCyƍά,7VvՀ͜#ΔjfGtN^|9vN4~v^ۣ30F!ŠE!,{gk#*  47uN9L8eeZFL!4;7M R̷ږ(scL} ֶB[U3>,L 8zGFV +qk!+ɸ&'n^ey-T͛ns=}>]DŽTk $*]؅V^e1%#tg̗6 +jyf:Vqzqj'R xs*,Ҳs gw@!y}L(f~s%7dhn5cTJj.H3"WP3/ [PeÅNۅ+ʦ_u.\#qSx6$[շ%7=Hy{ɩ;}@Cm##nvėPup]귿+x>$BeD0yMSR.ˑ>TU6I蓤(w{&{Xn* Bӽ=K]ZJF%%,`Q^E0lDZkm:c1SXxhX<|pVf|heFNZÐPr}T\mY!! {mn24v+Z^*5R-[8ubzX)-4^'Na赎,/*QibD6)7rKč40JY:TZiS( 6 + A em9P3Fz%ncxv +u&{]JQt'ceh5s+6;F:f] A'_^Z+ԁAQ."ye9+pvgV!O6wAUG=9(QJE`Ki׆%^ |(=ᅿ}x6؎̾EY"nBBr+?/bnу<o0yIaÕ="= wI=݌de@:V>U;Kd$O.e.j4.Н>YeJ/{] +l`mqHIKVڴ^s4E r +”7 5cC#Cr7Bcb^YZVS8{@z}jؖ m( (ډӾޢZqZMQ*Zz)iI}Azfv^*v_,5albւê +BEã㪻8D< \2"^xbDӂK#Ux#+rx(K/O";E$/2Cē{=KAT%!)Do"/D$"V*Hw"J?o+D#2܇J!⡌+8CēZxL&I(-D< +o+T'/T"Vu_"=ej_x[D:O/x` Ou%m[x8~xdi +4}xR+OJ% x+P>DN$4 U"wR%:_"RRJēӗ'p*D<\>DD(.DO&♝BēRxRD@~^ģأ}x )ǙD23Sa/O +2/) u̝3 @<|xR+Cb ( (M[Q:I-@< /83OTSxK@%3e &t@<\2OCJſ3/iWx_  +ijxII@G1q% jI@<)_ ɠ|xR++/x{^Ъ񶒁x[ UxM ˖O #fZx[@ GGqQWx= +3+ OC^Q\x[@OD O +%IVV nSWx 'P +3?@<{3OJU J+o+Ɋ~xz+O/BiV & +SaG42@ d ^RoSp7?@<+|xg g~x+ J/)EuIGxxZ}x8TxV%g%%@<*;O_[x[@OOSH Uc)@<)FSxjK@<\?@<L Ϭ2o+UqxXx ?+͎87F;xWx~x<t@<7 Óq/ OJU2\SldPyx}yxBg=ȗ'8,$|yxG|yx9 +oh;A(<<ť*_4< TixVK^ixLK70)E 3 Cã. + ?4<-b* O_?B|CÓzQ48< + cp/8<ݍ#,)Pqx<tYdBAGDVqxtQOߤ?%j!u&]ÓVJXT;B5_BT,_G%ZpxA p"2ѣ'9f^UuGIюã'?8<* p"9_öPT^`"CQ iiB~i4cUefgOiS(4 83\/^ᑡ8< ?8<"X2 +gF8<g^8GN)[qxTS}px:G#ZpxjZ8<;3_^>qx*>8+4< ]1ixԡ~hx* .c&/ Bc /4<&1~hxAÓOY4<) ŅlЬhx8SѻEo\ /GyS᩵ Ek~ix*64Nti^/(4<~ix6.dz.@_X}hx$ _٪u1hx>4\.4<)_*'4  GBf!|XxYxzF+ j BCa + OJe :[~YxcGKaiX4?TS ۗuBe 4?_£䥠|QxRPx|/ +O›QxXXTh;($VBP]`Ap E!JAIf  +oೠ|Qx7ƌ›Gl KjXג(<Qwk@yRnRg8Ix72XSMxD&b$<vN“&!$<w/Hxz,|$$<W^~E£C3,$<å@u1^h`($<$<ۼdueD۪I}%=2 BCL$$}\&4gBJ&m5HxZT$<,D + 6&m!$<2 oD"!M³%e" %I,$PHxfuGC³.L{-$iVvVB7 K) <GZTAx|T᭚(* $^R7V+wlAx'˄/e[Jm5@x[L c <)+ϔ_V3c) eQIEdEt(~WvZqG2rdѓGg(}%"+Iv9 J-S@vڃ]9vl#9ŎZobsyotr8O"ر7OR\FGbiॎsj=&@t{/z߅AˑNG7NN7H~ȘnM݅,Şkuޅkޙ@,F6ŬY@(ao%5ճ<ǵ tR tR|@ה0l@7mǒ@)8z6d`Z.94ʅ?»i @'\,+\fe&- @.? @װKsj??qkohInٶs͢gI=@'8tmPuV]ï!E3݉ A:!ʮ ˨ {簒 ؜9ɽ =}N>}?='aԿp4乓6{.2uwnΉ(wtnc!aD!i{P{3#nnkF9U9Q\9B z*WNlJ+Goʡƈi:83">Gd9=Nwgd9^B&K=7Z{==/{ۗ0X\`9㰱ÒRWOY>ٛLNCog嶒r[  Pž֔]k.ub?,xklbr q Um%`9bf*k*Xt0#s, jy85Mc+qi͓8Ї^S:+_-jPGБjuȝv*#9ZN -6sZr+gD +3Īt!R[ ڗmTSx?-z7'mZ.) -@5B2xgEA`5;iC r[ > q +V *1M3S0ja;J-lw4Ng~m3`9)8OMO ,X E1@Ym%s\9nӟ +|`99X+"V̙,g6AD9-JV"ˑcz ^VE,LK:od<IO,!tfEbd96YW Ʃ[><؛ue7 ,V0 5~d/T3m&5XYoDr͈fN + dPR>o t"L۪Q䚐#*RLP>"'9㸗VomUdMNCyJ3Z$ %AUT[P䶒)r[ ^dZ3Rl} +,9Dn !%g?gjP2F{J99q |)zwm[IUmPNGa̙2@Uo5qf9)kJӑI V2@nk2~ý5*Xp:Jȟ+; < SeZw{g4t^^8|+_4w߶]D8puTGm!Q8eN潑q Uq;l`+޼RIQc"VymXC+'_L`[ؠ9't? O] KLpwg%D69'fiٟkᶐpK 0xsߢ];04 Jm5p'npb pʻY=@pl*3-$-3{)ؼp:=Upڱ]{cᴹ۱]&{ީjoi8$ +@ ۪ᬚ,>j[e0ݖװ#;K}6 +kÌ qd/0k S|`8l`8]~_ +>pIMT2S#"ISep賒Jp +Z`qV2!ޮM#(?C󚷴]p N gi#P(8|TE)d8TM Gq6pVwW4'&}khxV3d[ I^ᰔEG8!c/#:/UǬ\8l}/.JͅLSps gf+n+̅#^Ow hX8 , j$ ~e‘)^aQD%p$I*o˩p.+T8T,*6c2 +Gy+YIPPT}\p7kS%.p( X8;^5p [p6N c(e(w߃YN*NM͡pn@l˒3AAeDf,(f>BX1*)Oi:9ΓGl-NaV8s_φ` 6ͦ41FQ{ߕ̦% !䴟\6 +M1fo %R F[ 1xl?Yql!9͌Q熱)`ib#m#0[N}D2 ƦĆ?c  7MgKUg[p~/RqZIتٔbkQUXlKņB5Xl +>kؤ^4(~3Y)LYl JV|5S[XlzM +FbwbkfnYPl,Ql (6)Z&V+4\XPlLMaCMF{].AJ[=Pl*rؔQûbSQlņ,6TTؤZT&hlRlcvɖW'kt Æu!|IT" AooX+I/Pu3b'5xƆop 8I M*Ecq2M"yظņ4YN՜Ŧ\e [#;b0j4^GL,6XL2{st&bkғ0~~eBM5~DGM{b1 {t'<3L5pM|ih#36͔YlbCe,6)fI1f5k7XM/}VfشYl| bk]YlT+ pvؤlHb2'2ϴI|snJ|i$WE~d DnnYϔuE=7My33gM#;=fm۵`ltoK`l +^ ~? | c3rDVal8͇5h +wpͰUal(` 06dalt=!06\<c[all + +S [YR`l [#rwckdケZ%`l=7ԲBcShc +%p +c÷,6 Ʀe hy0k:czˊj j_i?(ؤZXlT5 휷c#M:hlZ'~ p86xǦ(kc345h86}c3cScӓnQG=Sz<6Z +[`Y5&Dd֊H6- FlGe۴*dӂ&dn}^=ld/DBi3^&nt͂֠uD~oNdSBpd1-eLXK#*hլ3MoRP?HlG޼ 6W: .kDbC(6q +Y ;Ŧ woXcw{h&VPl=EF%%(6zgoWZFj ņ-Pl(/tv:ݭ20DXo8 +kƝHlzbAlf>< 5f2-9U۬ߣsؔxshU8ll m+^,58l֌?qؠ}sXa pP2ob(6z~s(Un"9XauV,F pȚw<=z O+"Q6{8cVx1> 62i s bLŸ +M*AHrDR- b-S@ljaQfJFY bCe  6ÁmsxV9sؔ!6J`8DҴ}EPt?lӯ|ZV$SV)lpK e:э9+Mo9@l +Z(@lWM6#:&Xv^6FoFԇetC9#DmWW`ۃ勫vxv뱙j[hСjy"3 T#="Q4OM||SNSBB(mYjfD'I HGn?B'h*;g4NCZSiK)4Sr ~v.P9i"E,FnT<4z{wSϫZLNSX*rǜ#̚ig4l\v~24,KT<9i[HĴ%0F^R-j2.M_pRKS h1 -M KCJ;n/kW%ѿVm洖yI[bPhpF)X_GHSQ&HP`A ocTgB;Z*Nz/uZs"ѓK4k.DE#Ԯ֬!92 ywg7.|4mY ` ; MlLˏ;rr;u-@ +0@/#!HO?"d5!MO|4y[,|4ml >ЬNI|gѤ! >;/ F_BH+ +exDenҬjHSGSTܼ"m +lѤX%%LG5TB)Пh~u^hK\hRh=FqW:D/s<sc yh]!3x4%Ҽ1TƣI5_ѤLGGbŌGC89P+)JA5D>`ゎ֘ZNlњ$+y:]|1%Ѷp4m,mg:8vqVNGjx 爴 hݖ֦T$M`=#M$ HC it{~^~ݹ93$m{a}fHJfm5i憤iL%3N2HFG}HS,zNdFBn FThJf&iCٞ#PzHj#&z9;# XfInsICEs@Hǭ-Hnd:$MWqxؗ"-EH#~0;i&U!1r}'IG#m!Җ +%wA>8x[!Ѧj'l3 )K`AI},rXMBq"/@Fa8./D2@g +F9GG- L;,kψY!t"ɩy~޶/@Pd=3!L BB~2!M4B(eDujև2k" DV2"-Hu 6i狐FU#! ƙjbGYgBYEw5FsM'"(A3i4q 8"-BH[bdcztHao0..>)O48gG qq/KhࣩviMLG1;h*~fBɯ hwv#no, sM%8m Ā ϙhӹ SE5D{e\q_~w Mu!iR.U +I#O>vL0Բ">Zo?OS "iSZ⛪yE=&ڎ䠳8n;ڤ9Bm;-茸4⌎w*{蛣6?)gFZǂ +х׽Yjj΃uenӮ>Ԛz`sZxj?smÜ,,%՚Q:QM&Bq>+л<h|\?sռ mo,Gn-ޠ +Win!gκt*cXU>J 6ΏpZGVTXq{QR +qdh++TRR`wΨ^rmSfS唵sR8kKyz"mސVLH!OW\69^B#!^dwr]pWyf4kjm_<#M ͭm(lq8_,ը-L0FzKx\6` 1R]ö o)cx11 @OC”!.F5U;F.< b~]mP:T"m5N#0L3_"mRY8Wt!鍦Y _€jQ =Oʩx2 +O"%!mo;|`)ϰ2NͳլD"}UT'CUzԙP? o_ u"t(K+gEێh>'  +x^)*XAfPy~<ޟ +A[ ?gzM?7䣼 s2jjͤCYQ*BL3g޷iACh5˜67{Px?qȤ}VH)-ף_Ri91:P8e~8enTV퍆h[P{C߇LfEYJ\ٓzm*eUDM6~,tx-"RM* T u&t)OX>vjT6Z}3ls+v#Z襤n!IgE- isc+_ 8ž{_V6M׃ŻVc` P^):?޶U%عs_i%M:%tƳq†~uUq"Y.: j$Բ|Я ͤbJKc_RXf1)cf'5WR +hK7l:Kn=[7mi4|,㬵4՛uD]6 o1|SlCA3- 4IUۚJ:g-yWԬlVs43ٺok"V+wVT*{u$\S*Q9eB_VqPX&Zh<0c5ɫNPc7N-T 3`Z[ pV,E®oSH4NK۳cI_Ÿ֒Kљh+a݅`uw)'~ =iP%Ym8P& L8@*vZ6 U"wEq{?#~H9muz,ػL#M՜ٶJfډHySbF`J*[N{tШa+l +RJQ~G0ݴZGOYukۤU(".~yy?tI x4t3`K!G}<>T"+<=^a{ZIҙIp}^0fUG/)4ڀƛt7Ѫi7eݤ oXK6QvC'ΙWGlֱ_>iϒc * AM='dSx&6_NzJ,&̟iM;C_m)vQAqOWb[iqX'y6O6۸F(6RW %2$4>yKǖB.(Zz [L7,l=%~F5FV222b8YI(%˻p"ĻT-xv zە)))jjk5W*ⷚy(yx؃qKAKo#&%ʖ2FmUn#ݒfu)tm!ݤ8ni[)Jweз~s_xXL]ؽrg+ϱ;/UI\z'fYnoL=)+q lf+*!+@h9_wkzcne=udDq){7\NLY_-T"hq`kfk|n_`>i ?}@W>g^ְj*֬yD9%2鮿P. ';maR6bvm!pv3i~6i*$lCH-ndAwg FFg<⡀Gsubz)2WG>։g{]?>kxpR͖eQ,>lKatlYQf$,(,`o+սA*7"[܏ؒr~I4o xŀ禐yUNqTCHUEI(ϹU.Du;7V m <Fd>Y,&O1û$):z7A_=zNV2Mqao![WK0M*iAʣp%じ Po;zB/7)Q"BCQz7I"/ġx2jKZG1"(xd(X +8#*9]u3xF+EN*P3o'Q>OJ'C9B$I>[tACEJ9. *Fi-T5ڈqX{,aa,;]8=P5/#Cxcz2Q|Ukc)6#K涹C( :,"!]$e*'uY3,bna443,>jٖgBe|Ի sRvU>f'I(px lTwʅn3oV>.HѺia,78eޏ +YkK!=1k^, 74Jtͻ#[iCIJԈeJhFYL8feZcR_y yN;fqP2JM=WzU|;z˻=`a_ږ4h=gU4}$ S(߾6K8"y̿Fʂi=cgQ~:TU7+X:Nv͛M4--^❳Dd'QIDыXG]7a?ӌ};9N/b7`}px021i!\@7lCEy2FZy T h"0#}>Opt?YxE;(她r9A90'!F9a^fz% ߞV'͛Z +bE,hfxL "!g8(9t(?2`ڙć=(WEӉf±Ht-YV97P,Sc~"(T98v)Z_m6^;O}=eƆ|عˬqOT&E6F)8ۤ.c!z!v>_:IqϢC.Y̨<6qD {09En3ĆΝS f9 J21〝eNƞsRy.Nn4V1"4B1荐 +|N5z,s(ݎ+YA;U-'r%څ譥݂O$n2ӗ´vLzIǦ/F\(Xs$yw^C=kU| ޤZYk|J^2Zk"3^ HSUŝ^sH2>łE5C4G" f*xt 0v``We)TfkJw<7 E\L# *fEI +R)խ$$h!QhՒMi:2rDsئ6vC$a,]c^NIa9|ˢbwHa.%(;->f2}}HG7=̈́7ܡֵAdN;;9ԎfP'Oj&MXݶ0Ya9o~6NǮvTQ=#$F|Gy序nAʛnCd߈+LS#O\D:TV9X "F])V`h6bj:/6j&TOt-۔,"au'D BZ +"L[Q <^AcC lԒK@WC/{ޤ Sf US Rj$C.2B4R&Ȇ'wB>2ѫt3rtfj^EϾ!"{?Hg{=a4\VDL|wЌAT]9h} IR 6(+@:ɞXSRROD2qz4^UxS>ئU j[E?}n HGFnA,vh8*L,8D $yu,ŘeZ^qv Go`Àظ3c- i sQeFЖ1ptJZjI[.iec|{{4 t)mngm hT[^Im3}bDrXq3TiGΆB=JF}c<)ȯ"II! X%ۣ'ŠEQIOzV飉&ڴ2$.n;\@:Xw=VP_I d0;ClϺtxCż2kwMRfImvo+14V {ѦI*eQ2c.;feYFQ@w[dXL:l A*g*Ըl(mzJ JKh|ֺJv\P:-hCMp˥CTXXFKh_@y<$eAPOddRs:\5]mN1;;tGql+/?_ؙIMBs~bj)YC%UEM*F!jB10I{ۏ YW;R=׬m!'EXB5U&lٶ}#o 9i=ZKU]2Ewex*NNrB}R10!L$ >Z,W/$It-6KsCe> 4* EkJ+:( #qEB-(o'(Y\(y<5PN#3k.fcҀVcc9ɦ`PXNٗ[ĒχM-#w)dbl͸wE@ʴh>PD-KRoƨ;[Vf6}g합h>^;"H/-Ef=L*DCgwq|72,U9g*8<=4;4mrsHv7|ԮdJlK_"(G KA*jSNl֮{Lˏ&[\agmWiF7;2L r4;<w~ޮtx]x7y]睛i`Sގ{쩼GbƎ,䝤H'+Ǎh!6N\¡9iYUG<° [S3\s48W.[igmX +}Wt=ljf'x +1m"+ɸKw=1'K5gew,lϡa&R2pz3N7F|unMjX>EB0N}(mu1hr!7pZF>gZ~9ޫ'= :EB]c[;6w[춱~$gU(mkj H)Tm g\8651Y(H# V?|a]P"A"~(%:2 g:#Xw ~WXo8+)rn.ia;1BT iuY-C%??p1758 +0-3* IsWw>Rid+vi)-7BI$ɉJ{]/֙qy=unqOe h0}Ը}@{k`萯v}mS,x #n)"Dvʅ?cz0t;ކb<(%hFtR5*eBͪaUz~ ,+Qi̴lRoB@ʢߡjnJO:˜N{)kWғ|$<ޓpB.VW pDo8yBf -ik1/cHfc|s 3m|Z0+PVUK w[UnO@|5"sMArkV-5xF,-ᅐri?n<U]Y ְ&bgvq4'xiwQ8w^8f 5Jy)<n)Y\fZBcB0;[ӊ'B /\U`N x1DoAyOfk~-w"5"ϞxR+cDN+/"pD [B jX2P Ǡ"HHςj AHHE1$3B T$s G̳ T$W$c,HExguZxKD%3e"^盈ןQxR2/xDӋe(D0aYxK)D\!"J֣Rx[ "JSESDc\pxo(2OqxR͠ 8F/ru Љ9dD<<<~7On똽+)_yx=2dq#u +2/vxnCI<<ó{.Wx:ޟ#yx]oΫ<<ݍSSx$2O7+ZxxU^?U>/I*<<75 +c.<~óyx7O_cU<+뮒ׅ+<<^o r…yz^ +ì<<+WxxX OK7O7OjuZ@gO5( B4q4eUf/FÓ)oRyx7W^gPTxxi`u:ge)S#yx][9jJ;xx OQSãH'<< +<g8MÓXhx O|1BMÓZixR + Oʛ'𸆅Ma OJ|+ cuae 4 ϔL+'.jI4<)oX7>틆wMÀZhx|Bixzf O@iة4<4<:ף$hnhx<7($yP3 OBIx6)4VFC"Xp%/jAY{/Bh{:H³c}JAq 'eZ/ǂ3 +O&7 +OMD* +r£@C-(<B)SPx +_gETf>0d_(NJ08QxG$5$QxTjQxjF+(< ZPxR* +OG]~A-( +@A :'cH/(oRha:N/rrL/Ndu ͙g)fy [GmciA7*u5-n&Ub S[ΫUk} { 1icJb5sU״~ڳXu.WF53uC.kXSQu\FIFIkF5&|NGL2kj/IuMkcMk'T!zPx׃T'窝T'疜T'ynRuSIupoR]ҹAu2 -:y6^NJ'ěIuRv&IWۤGPakgb5VwBT_MN 稠:{ks9T: 'nͣb}S͸{CNRHOeԩ-#wh5.y1Uϓ{mn+AŠkH l~%\<a,ςj 9v-'GE5!fV{#Yt4j^;JƼr8X<@'&qy]@dz +.=9.QtlTl蒒t[ ]'=uE'z%Ex@'Px+t,bŜtk#8v_J:ML( +&_[n+A@u6W_ax5bxO:ȩMb Zh̳AGé{py4Z)ȇg{νD!ΊR0B5oU` #aZ,] 蚡gEi׬frش9B*ߥ8p: C@'͆R!0?0Cpdߜ>'m$4,.=홆Ö"FWKsC=msXfΝ9d3QJkcn蜖z +sBqoN#sܼ9ͨg?7n#Sisf߬9Ijn 4C@=8s3mȘ9=f䘹&قkT\cc fQ.V^q\ma$h p}3e OPP暈G&xY)saE3'5Ze*q,U3fN?;0sz^%d3טkbD2g)M{Tnm%9m׮6EɭP6/m撒hs[ \3n[9~O5P6mN +E2b6'pPϹis(ZeڜTVЋ6/{k[KI\9>&0DN涒is[ ڜ+n56טG>NO ?_;.P"#yhqs[ɸnyDV*4Z nN͝ ܜtn + jGP{ngSqsM#&7h;m%斺psz)&ők +)>-aBZ(ZeiPFkJ99ҏ8Is\VIsR~Uۤ9sw4z&I9[9)4 NkJ ˜4Bj} =5*9>-ǫP՟FA`W2eZ2wE's.!o1w]]8kS?+aNmuQm? W/ۢfigA) d9yh>kH+'X9}CQP0;mA)L9Wq&m̀r{6%N~O]Ca8r2Fd}9oơN3B(%AN{ޜX窕V΄[Jm5r'nb rʻY\-r +666?NQef8Ell~N|Xe~+McK8 +u评 r[:AB,Yߪ<^](#fA@?KkV9+A3AY7{䤐]+EI䴷=m9]~7$*} X$r9n'#f  s}V"|Akl r +7#ύS>XBq\!(5&BN bF!׭r )v;^2A.PrJ,? υ!GBbșsj!5j[^rP-4Bп!Gaž!`@cbȩR<r9+CNu$C_D G290I ҽr>ir(7@EW>\Q}cX)ne?ǁ¸Ώ7gW~2y?\B-8+,|\jAt^5^sl|beM鼂 e=.|'oPX8 ?K`[dL/`55 +~\͏ӐHߋqrnzC N{1~:z>gi .FkOv?L8 +G6G[P2"[Ҏ\-zf֬GKEc89)q4mjAa=)}4cS*8]EkF(c"3Z^$(MqyOSVayX 8}[}/ 9>'z^8y8,V'_iE]OiuL0q#6]gVh)O85҂j!N ?DϳqZE<yÿ#>_8iZ,X $ذ8箬8}ymT4Xޯ>}̤`zjpNrQWN-"8qZOk`. NM'ʉS9݁')1)Π836(N +CQPՅޛ8O8}ӱQqbdG,>:˙@.<1*\)N}A{߁gPlNϳ~a&) qg#%#4snB]v}'>p-*N5')3o2A}XBiEs2ǩsޘ_yw$d G ;܌Eu||L8@ N&@ Ahĩ +bCip|)5l6% +N TmM@p(2yfƩ1Td$Vij#w)N#h{|YnpBDBO-bn*㙑h$&\}<(xetzFp +M\&?(sp?~SV~Sal~4[70if"Dq^sakr{57M嫟)4|lYo/MIn$o2ue,TBiߞdM#F}/rb@C3-@=J%.QQUs8A{1%ZӜÓqo{h+:M=/۝鼵 z?X1op߼:;z`e|>H_C6 9Nq SQ-)?QooooO8d2g]|76}ۜn +c4 +n ߲$Iv33ʨd6sݎauSK8+v6jW{7nC )@ay0Ώ'U+ +w.@scv9G*MDF+ʍýAnR)vB7Dt@ܔnJ!- ։wথa?nf6=rm AQgbF]ٵmjn_AYmP!8:MmS'?C"9)A"mF2ڦ!iQHM:9V ڦ3M'[5mzmԶ|R-Զu6ж.mCe hnقIcI= жS7MUSeh&9ǽm$-s5c-6T= &Q@$\@$V 631ۚ-Ge5ʷk3ۤxlɓHZlk.H8M{&kؠ!1ۨ:c3۔{\{0(6ffxv^ m }Wf[نB mIlI%,mRX5M<)6W/ 5jr6& )DEmd6."!Jm4^@)vwʏΖm6=%=hrum:ӼmkIR3A<,m*#:m}m56i@ۚ|FIԶMW?mkHMDmHYɢ27m,\&PhbAۚ +mk#oh[.Y6Yچeo-ָPF#Ma'6?~V +h\ ڦqǢqm+ mcBw@Z,h[fesۖhX WV鱉m]`6T +&c3ۤ Ɖ m@3m" aqVjl3RP(Tmdf6jS۔8#cXmt$G6OܮEmΘmQmY6FCXxPۈO j[ekچ՜0mT0Umm(683Cwچg6mXyK2gpQ@e +Gڦ̊YK23AmkDpMfQM_*Ammyj3Mٸ++m@`TqzUqYcG*xuH0#km>QE5tY1XжNgϹmRM0 FYE>چr;nQH`S6v&„mۦ7LmSnf@jL1nG n fj)NI-Ep(ëmJۂ)m%NncXݦ5Nvn#LRa鍠۴೵I4|_|Wd %ӽm ?m]j@50Ͳu ݦnSF +sg5 +imZ[e۴g۔ǣ:&4:C*l\6! f++#z6Ql ن=TlC=SRݙmz6d6$zh %&"8lCQ b1W,4 +꒝&bl۸0T@+ǫMcY2M-8٦*k 7^Ai@l󄋿m(8/#se0"&_abq f8fY>*M->w` ֩w{1:Vm=Efm%C’6gf\of[gia`ۚ نH`%f+%CaI5B0ۺb<MlS+nJF& %!۶61d l}}%%ߋͺ'` = lC-6 l!`lQ6DrL)OmGc Q)PSE/y_Dl#fg")IkElk=ɤyVb4ubƙqbTAl#zy9;TD?U6g;Zg)p=pMa_<ĶX+. l>qm[û`XT$e7BjòVc:ܰ4pHkapsS0aLx;m:m%yMv&r4mTfLZh%d257M=AЍec](fDj32p? :dޔ6b%՝kl۵ kj}k}#lI|;S/yXGWq +],KV9jKh-BV;)JV ޹jǽ{̂U9SgC$0S_֮T-NTz-2OmS# շj. 8ǦWS>>+05a 6aj،4c|VeqۉԶ_J{;7@X!RB8KMIq;IّIj+Hqiho:^'j9۬$5SG㎱Ij\aV]*Xj(22Ks-MVcԴz +RRR6z$Tn 5)'Rk($5rV9 )po% +mRSTܼ"mݳI][Ԓ@j^Z*!@j4Fw gܛN]55%.5^5IO^@#pZ4qQrY_Aq#G+dƃDGM2G:I֬LtTwƉs]hMTFMx +QF1 禨5EyhwIEM3( F FMcx?8jII IM0tZ 2K 09MM6Zd4چ!05}S=Ђݹ3Mm>m%Զ05sԴOfajr'Y0/T>ς)m; Sk Skdk;B5dVp`jRwԤX3g!05>v8M ASk@%˶hjEFSU%R[ZH)QjLz])xPj[(FZ*H8xRQj 2@gF99Agm!L=,뷅H#f .7ϯ)}>V'bC+Kg@iAB)Ȋt.FhvHAWvʯ㚻HK-)`ẙ,5R#ݮ}Buz?FD(5T;K.gD=RèD)PjII(J̒#z-n(<>RS/*L(5T<ϳSccYjK(%Ih9;zxn R3I,5@jtd4@N#9R >n] 5kXm~dǖ1jC=EPT "3Ԉ"P n7"MM2)b4TB}MO[B-1i#:1$gR .Iᕱ;GHGڿI:͍Z'WX~H՞Ll٧x I:*y5#g t[52(qy~#`ȭ/rd{B),P^2ڢ {js:f8''I㰁{O.[^;B + <ҚQ;Ѱ?6 6EP- (Q dV`Hzƹ:HQPbY:ȚM$`路d--Glĩ%OJ>QjT DF1FU(5y:j(ԁұ^`Uc¥Zn! '5d'32}lnat MW. ,΀K$tk6d/"bHʔYoB~q1AzP$VEL-2$ҙ+C`ɍJD֬}O./dRJ>i\#!3g,K'D+1J4D+qTب}2XEGE,<)udLk_L5BÅ]ekl9*~s,BdK! `BYZ-⼾P. \,w d/+FET.<Q^"zO2l ⺤6 (Eg+1Z +R֕ rFyة,D<0,L|-ēwNN/ +3>%qK} E}mCȐ \Ȭ~P +AejSo +lOd\q.x<gxz <"Dz'r+*k t z0DL&.uyԫ pr- D}z t t7V=M5 "rUm渦5OyLu6J'я7Rj'7t:K?',9Yc?7PUJ4Ԅ>hԔG'ֻo֎AC2Bu'0 a! kT< Հq?T*A#N/xׁ y&%N"󳥁JN2> Ggy"JX?]a:Vb6lѕǃln=[G (~H)D[9Vl'k ϊX$2׻0h7X(JM=&D6>1Ь_cK\-if6m]1.,'ZY2Hy z67&gE?#f0:ĝLNP,W(<=|PƯY7dCRY]Qz!r"=\FN٪s. %zKp@Y`Mr ?Ǝ=}zYCkZmSD܄j ds )5&^`Ļ:S,bvdIbNK :kGm{$Cs DG%ਉiEvz ZE]HpIĎD곾 V[u֭ٙlY57J5sˠaPbDڠ\ .ƍ[؃덿Җ &3iZqlIT[b7X:$o<H./Bٶ޲'fh$IbtVi%[L| b3lJEG9D#UÐg!!X TG>m' ..܏i}VFEU{RmSowmZZ[r)nSAC}eOKS`}qX1⠞@^:K\-e#̅2C uZĪIRèWS[/Hԗp MQOH9!9 V\蚮u0Lk/.66?A_e0vi(1BNql"9|l{35y}yړCszzه?%˭f)XƒnM695<+M?@;oB5F۾{?kBdxaKt,"dz6Xё ׈)lXʾ_x6jIBIm;f 4vAZp +(!JpznvM<Ǿv] :\)aFlz,EJ(bmt~  +Ju4fnjs#: /R?FY[MEvSR2s蔨d\ܹE#1KJɦE0= zܖk1k-VI(i; õTg~v*v.vrl7"붨(z(V!u'T! ST@hT \QcxW}K3l,(Zy&!SEC#YSVJTGAaeį^Dp1N-$X+%Ypf%AYv uXw`ny^&N1qQ6Pgf ǀ&"=7Ŏ$|#Rdj6b/3kyU* T\v&MŒx䐛Zv`]Xy}a9' ITDDKvZUĈpٖT 2SȱorTbe .)Q5"ϬT @~hP/4 vɍR}nqAvb՝:(TW]RsfY9kHmE;n# +$ 1H*% ,>ܨǛn9O1 +[uҀ7ԇ@LC(8nE>"Y3'Ņ و6J<Bk@O$lQY[Qwe:i5g.Ԣ Eͱ fm>?5",x^~:]WLQ`Q|;Vt[!6'A$ص԰1|c]< +'y ) ?g0x}VCa.ЪrwFi` Ć_ܺ5r*1N҇%R /Eڀ\PݫKFm1%+- wn)IF4B#$wi *g)|4X\u|TZhoDExaX#:CA@ڣF*xC/̚jЏ{ǃ}To t%YPdLA@t*|jNO)5aAg?"J YYb'ggpv>Kg/jҔ>Q|`qk+^!`F c{쫔m{S+6&{rf1=fOSf凅d YM2m{Kj/{ñaQ.Y1F"\) h$ BX0/Kcdfjևm}x"ǒ롭ݠ^PJThC&)3h dJEOdcu?ނ~( @#Y29t ^?!͍^ L]94%)h'88:YN23n2u℘r͕\' Vz#Rz*;ownTth2mdh_16u͑RʄrȦJQ:C+jAXjM@.XJSNw(ƔHT=c {6+2z k %6k "9J0a{aPY*,I 7W:g"$ѢShцxCE1E&"˙"D\׃чl^7DR`M*5O&KSÓ,g JrWKVJgYUI@F? jQEogAAH/StYiQS\U8pjɭ"ntEBAҲͺfʰ@h )b=A!FղDaAVG3l +RF?_u9d۫9M-b D$IkkD 9Lt2$u=G"(/-yީ͔$ED(`ْ'=(xU'u5FvQbV"݅B/vRe 1fODk!ҕB0dJC3bY<F Nj +/xoO ,&Ӝ^9 I2> +U[K6 7tr0ZΈ}rj6.b֬7M"rcm! a )XE;pYX.}Ja$8RPQ`yYg!lϖdaTU6m2q7Ф%7(ۮrڋP3;Fl[?)6[2Rva?bTRФǓޖƎQzLRANLsb ͫaU7ӝ j֧w8bԞe~}6rQn@|Vx $ކZ"+`zu:esi+4'X0nwf&ƷP=F`jb  Ύ Bf0b6hNO ~; f$BT#+xuԫš8&0O_7?1ީB-B~D(6ַJ c6w*ͶZ_iH;hbg@HNɣ΂e{ dIb{?g0ԕh?_\7O*BNARAX!sK Y.E*[`7l#ZVpb4o 7|7e cPNiԦPhpE-bfmhs_6!do w~L]&IZ-ev!gNѸǍmqmQ9lq4*HUL{E5[<85Z9ŨeH tߏxQR*,2z@̔,M*J TfEp[r^YPKɒNkyry)GB̹׶Fט &ZfB +L[}@RTLj ?j`Dg\"QYM;QBQt5qp״3wBd`B deֽn,9Dm{6kΠmQ2rM`5~G%m+-#[dlf}&s:uCrXJ<z<4a\l.m>(XZ,0 $I/-:VLE(*޲-;z9ng +%])ٴY] Nqf[EBز$,Vnn3E `Q}O't;;_Is)8M -na(n +(skk Lqo-ePMJO5`m<d qPHXC-mҋp-azmPi?8 O5ŖcL8Ks[ΛN77tq|s--#9C']nzl۳ͭ|ٷ e ߗ. [޽BbAKRV/QE3G1eLa*V*kQ~̶umH"ŒLװ`y?[2r4QV [&d~>r c–z$SEq,a"4U MP,C +۫H!xh[M+=s;.Nso;2wl~=Ǫy~Lzdt6 0C}Ze''nBg,χtrwiyq|"*|nڔ҈01DB18~Jd+Qhr|`]~i1:)5 E4ͬTb0:*.7Pc3\n5 nrf{okTV'v4V!h$=`P6*P'k?Y6%+( Ė_VXezkƏ h`}6d/fftZj"Lm!&oԻ[~s?h#g^JlWf3K`yA*?E3 ) 66mE_AV, XƩgoGoy^:̐0: ʂ'lb!QHYKe^c`20b ,8*ۮoEyIw ּ3`شl t| ԧluA6l7-+wL~¤NF3^ö&㭅F4Sk0< R -͹PLłAVj̗}4k>pp 4ػk!/g2[O C#"qLM׾If[@S]r:b'S*h! 1h)6ꍈA7zfNZc (8Y9hs$ _F`1Va5 5Cg@}ѢtF6 ZAhyY~K@5z ـIE-9;X$4h,-2'[ AS~ѥcxط[[9l1Q Ie9qpu%Dc4cϴ6.oњ_˲,2Ibʳvᶢa \g{.k|x)Ӛ\Kh/.*-`z Y)oeɀ])8~>g;R)o nQ˵;3[rH$XFq8-ܓbC'{FNO50rne4{SURE}7Ʌ1"}Fܐ '%.$\y]H9 endstream endobj 49 0 obj <>stream + ĘI/MZ"蹛8;7FrߛiɚMDeO=ii-,G%i8SK>~5[ iiJ69LUG#s%һTh1[nn=ng}dN)ɵg)~Dz?&Z`^q*ol"fk͑r +G9Z3RjY)NFt>6^-ojVh $;FXWe=K(hP;#x\ĀJ)l^nj˵ 2jc +unQݙ5?VՍ]ov+< m`y=7hOwO(Uz5`K6;(&+}z,X#f+Kb ;gov=+'PjB^30 +3ڏgj +%B,HR74kI 邋A9 sCr/PQFgKGBhU8zViy-ZM~ K}~!6xjO dowq`魾@z y^tXC;FrJD2hPhut>W8k5Rp"fQb"$ۆ)/.`>`Ճ RQ4e:vZROVVe\l)Qz?H]`5%An'CfZX6< +\w[!=ɊcE]01پm\|~_g( lc{DA(̔ E,C<ᡟXRk>"O6KJ +l --{ET ۑ5^գ*ݳSMn@d4^3CkP;;ީ8V& hQwk8Oym$֮\r?4䪺}p;?͜-l~PG:LeY0% tMQʢUI@T횗(5X .$+/63̦ +-=4"W& +м2'6".,2j8)Pnvkp 4NǣzzL%DH*сJrpݒ%4dΤnb1 ,!d47^'}+Fy]c.I"2WZq3*YN \u֐ꮥleW^ n+|U@n\Ұ䒡&j~&9lr hT:8lrDюVGһQ':YJ[zoc+ MY&Im-)k3p^zr|Yjږ֟KjA pFO/XN67vD($ro)2& $'ldkh)95Ÿh񚎨Dsb,lc+0۷<:Tj8ƮvN#'* +&P3n&Po)R>D;V<vR0]b Vܡ@nUB,QhŔt,Ze&4B#d\KG4qlds 6[z" K+0"'MP?3eA$6fSRl︣hWdQ-ؖ.]9R7GZ*J7J5H3 %Dg$u3 '03&[ܔ}] +(Q")o|jA`Jo1r1ٳ!GJ.;pf +T6(%Ch!'S5UBdV8Qo7XvMhyl轑 \¯L %kǰbj3? M[.=]uNR3*a}"Ѳ`i,-NbKŏ¬’ ]7lg:QxJLV^|Mh}0ePV8L0[fdŖ@oNL/o:HzU @]?KB(} /*3` c:)warRZvloN(N ! ZI.]G: +l0ciE:\jƖ8ž]r fj r>8člArEKLJAoSE3MҀSN!潷QuuȖFg )(-hPJjI]KT\kfnTzg jvmXs]nt: #S, Ne#vGjbhՙXIV͞ΖVidfFlVN( GDk͌li-}%AEj1g|nQ+A/XT)G9-]qd +إ} IYII:׷zq,[ ̅4 o;ʭ+aS4H14 gt h{ۢ-g Sa_6[6b%)zBGz沚g̢)~,&NRZnE +Lnfé.ECP.G0ֆlC-8-E$6 ѫy8b]²,Jlu9߸4s2eFɃv1B>^1ƭMj4 nnp?Yz8yh|UZM $姬oEP.Ys&VFn1^zl+bHQ"g?7^~ jK,vUO)R%k mNɫ)"O{|-U< +}V6 j_`NIm^>G =_=H5mXn$-46# =hVqzgD^GgznՑփ)vlum\9Xe& 2DaJ㇧ő3m {zkdqD_WQj9m ۖFwk]-Q]j;3B$Gܝs{1TP/۪wP*0X{ UXh@WE@ӿτ)2{ƼD?m} dWh2 7` ]0ώs??Z9Me"e{)Ecj :HM5*vI]^h>ۛxezc⢷v7 r ; юjCޏWW_ +Gq鳿\]f~~<_w߽ďx=W?mI.__]/{0 o.񷟻/۫J{ߞ_gz? ֮kGW_?l=${Ǵ` ~7_՛##3>/ӻwoj>{}IQV}xZѮɇw_vz-žv_`48o.‹mo^=<3w#ܿ}ˋwgwoo_/y(on/?`>k ^]w_?jN]o8֧}[5޾j`7#Yjl;!\K Cq{ʲ<1BnVOq08L\خr?tW)"KlHxl}~t qM^ye'+~r_=|}s z}\8#tؕ'Z]u?[/ɏ׏zxvyu\鐂m +;:ջnoϷ K)voA._|A>\TOP}<[sپJۏh___wߙts^:ڷRwl=^~vi{b|kވwm!>vQ=a9v|lRv=zD?ؕ@S_^]_?[tz}u{y5yG;yCߝgm>?i|^~_ҜvHo\=\}F_x~zپb<1ͻ+Uym[I1Al;Rޚ#MG=Lonl?R~;.^lfKyb2'pخlf`3ۗY?̳_m_ΦpyAnmWp槨`>pgѾGYKe^1p kl?}}{ yrVyW~D"~O!/{\ boY/ۇWS2~ki^Wbɴ'Œ^eg,R"V-փ?ȷ|;ȷovo..vnOn  ^t>Zp Dp*JxDOD姼a64;N[ezp#yy}$ŭ3pv'n+$_5in\~yu蕨S,7~B_Tvl;㚽T͝W\m_LP%˻ljlWw.~UGGyɅlvEzwJ>'\/OO4a`WdFv=qiQϝnrwj#s/$l'vc=t %lHn:ydq{" }'7kz(_Q?ZC>ğ~Z!C>ğg|;_χcc;ğgۏ3MD}'zvAv9b·dg>{Rwuy}}ݶ㻾 zv7/߽TW9.(?nWwݯ|_ݟ>g?8[:[L#7CN=ܘuI/ cg~-fJeny7l3c (AOoM5>`/>b/'~)޲+98sΜ398s6gnętΜeΜp漄|mL}>uUfQDؾŽ~ ;rw|ݵ9x~Xpr® +Wv +WO_~z~I}8Aw=TzUVЏëjo?7wO+,\uɲCR;@<"xm?;Wv]}7O&l_Wl, +KOK(PSK!i-rp쁅oR8?vI^?`=?$t0ڄwWۣ-gƾC=)RG^Vg+u(*da'N?x]&=ҏI/]9CWx_><\vp~աО0}Am?Ơm?G'珔180^GaKmoOB>ۀO+`[`xw +Zk9X{mV G;p* gn=x0f <k4Wg>aDbb>e$;o +ﻻ7_ݟo/qv^ہ:uCUݰpT=`On +7C<Ƌɴ^s{Z+fձ9z׿?O_ۻ| 4}SFܿ-xy2~ -FSP泋'( k<;}-΁=+}ksP=}p]}Sp'-oɾi< +<}9z {n=!ٞ[k<ɵ>yţ%(֯x ZJUWمOV/?Q/t݃"V?ΈۃgAyєTDBnl7:b^P/y#v ;=GӁėg#ON^yeHݧw*%:r߶~k/ʮۯ>'B~ ۈu*qR8_?x:.p ?9O}e('XIM[vGiPIi)%jdf8CRs8щKŅ|ߝTr}ޝyyfΧr$ơt7iUJR׃$9MNC (9Ncr0Vh(.xC >ߗpїܺSWrX4FL }8v$Z4vpuz~̡ΕT)ݩ˱2)9ԏf%auT c0?;c:aX:ޮ].ǘ}4%c}SV;,i.e,w.]t#a9\JJ填0@(mC-WP8D|+ C*%r$-WY]v# Kal>+)LjĒSF+ O.V:%h央Jq~3Rv[ckG/rU _ ĴL\w5cx])WAd*>zLVtk®X຃:OAkpr W;0>kKsN߫jIQJߩ֩NXקJwFW | +qLh~@ﺁSZԅq7-bf &rN5n[U_ +,2aNVIX4>-:B:H|{=]9P¾FIu+IؚSN ҔjMQ5&~g*ac*3ݾjwHUU&ͣ#-nUkWz:= +L :_=1%%Oٙ_%$N/7} k:}k=7lB4$ec Y'| +HԡX Ef`Ufj4P +9Oشi +?nVef> wX\be`(T72_-BՕ)!AbBR <$qDKNb}/*>Cupvv-CoɾvM z(GrZ"=vh{lO sbg%),; 29 lرi qن/U嬎_rtKUçKaW_Yѓ&r7 ֽ$'!u Ӊ)Zd/AzIxegʭ8Y/wpfi;6Z|7p T{B_><cby,O|{4y/>R%_86l9?7G=9#p t4>zA7+YPHGsZUeURxӦ*6įJwWT7E{I15DCJXHXu?˩)'Sㄇ"E #?vYh{_8Aje {:|_-|7$HluAz8ѩZ#:]z +W. $_`*rE#,<3_bGXbV/6Nő1Xl^msEmt3u/"bV箣I +S0h0"Y:u`: ++"Z<E"H+% _8]r&jU DW`63|{ R,PWP{BC:1lE5_3V1~?pcb("Ai!VwH3@?X<p£q_]mr,b!ʷPt6<) R24t!=4WĤϼofYZpSLJD$*B@Hs1!`y8O{qs$UhODj /z9 +vؚT.pB+V.!b{pW xF[_b #l tZZ3iGpʆ;>ZeѡB}L0xci +(|<ίۑ hONyITUSPC@@CC HOWSeA$q Z"!l3O9,-?T;%_Nm',vuC{2>xaVu,BEꂦ0ohHqttr)ӆUxe )$J ^du8C1؛A=,]Tg Yg $VK>pܧ ‹ <àpB-\@58"xqj'/pixh&eqL]\g³QPpPu4jӰEOk=&+Ug~Um@YLY;/4@ $Wł0@PaE4Ep]G ½hqT{Bja]g*J$'P-'іŘrs|T#o$uK 8X†NFqA')ϏH';5S߇+w`AܻNŪ|aMmʤ"B+^?T;wf=ItΔEhO⣔@x%&ߡ _ +20im91k\EՆYNц \N|%.Ԋ^JJS y; Zyh` Xɞ)M*${ AƳz~lxP4_.Bu?K'D=MȪheW-o;6b^( E$qq8V ltM!zb/1@HN@~{ºGK)ObSXrȢ 9l#\dhcHcdVfȅ%aWm|fxQE]̞-qS#7kWnGt.2Ⲅ3LZذ?ROsKwBTFtesA"'R`-Ub ̫a8 t6@SSc:=Ѭ߻Z.b/6d CΘNc =D Txh]X$0a˫_ +M>z -U3ѱzRpO/RQ7 ցf8(AtNi@h ?hAֹ+/08X$`3]4m棇/dяVI*{i4S0f Y(H! +}u x@TQR <ͼY,|U 0  wB;њ`9z> @ 4$M2D?zCZYN&JGi9IFw2I=g%pLrs@ +5X9,j60lT d#nG8$S4Иx@`cz A9@(9Zi@<_E-[ 0{j AsS=$N(JCY#MbghYnP(Po<>J'DV`脂`PggS΅B˘Y6'WV0knNݵ. :?EeaWwNq 5Ԧ(OO V1M}؅AMUq}#W̥kۈS1bvM84}i"@g*LIp- 2ɠP]~@;AHO\"?0NDNR =F4x*P̰fo5Df0*K,ޠzZ HMj8LMь~ɘTMGxxOn1* Je@q`ȋ: +osXyY ꉮ_/6! +)&lZ rG̓Mx27|%+5_KThOCs &9GQ,/3깣 +VARvq>5Mf4xF1sL 5ɕ %ԆB-A;GAރ/&1jlp^6zauPD!(o":;Pay>&C >?Mz-zv A.Y7C83`G :r<[LAq!UNj!!JR`iǁ2,0/ \Eݲ +rcBwPP#fD28Sf9Bd ~%J3(Fdq-Vy)?@ha$fq9[!th" 8%h ݀% 4.@4#1jhEY͠^xi[f,|[ ׂ!s]0l=Nh@`@:ͺ,uT  ADY1G@4KC >DN$Ǯ3ý '% a/6`hK xYz=uNk~[ˠ2= gJܤ !m( xr` 5 AN%P aDP! +{ +v+zl$nqXRr4iQ }E_,&vXT">KH-{:jSQ5 IUiTSxy7Und%SI#M~D AcLưA|tNGrg(p3Sqq\qrdǪ8 nAړ%h!kP݅UgƂJ+@.`rtiݜQaUo[dAzuĴBz תCӜHIp`+EhYylHP,CBXLH&*fF`4uڙHUE̜ 3މ*sQ, +q UAO$A%J|m#6վ~}(趴VaЬSZ9q 9 #ᨔ554gR&L"(Ŷ2C@@DQUEOIYɋj7]Y O1WGduèA߲gbK6Kb<1/pȤP !M^?[yXNr=aԐ1 +륝:$\˚$FM_k_Ym6m˴p$P1EUJj|bwoj IW1jWWOͩG`tD8k&ydʞqVm<۞O_ծ&{"@z:*)T\SM 9yў,Ϳݐ|!~'-CnJ](OY D[*KeWSAzb{Z~p,L> +w f.8u<ٳf{>Z~S 9WXbw'E*Ws'8e v{kXmAĕt"iֆlU{ (RPusJ=K怒/4Lij|+\;)#)4SՆo26}Oj_gzRizC^_=|sۯ.P73HԀ sӊFz(3/wzAOLQՓeQ>`iWҢM:?-*9q #%O:ˮ=9n8sfgQL,ۼY`3ӋɫFa~zmjp+6+W86c|*Z㧟u6w)0lƴQ;yNN6Mq^= 5;yc}:On/;Ir&KU@G^B2ucfX"Ba&߾C Yk^~K桖}:$ٿ'I"C#1kzh#uiE֟rǓ'>qɢ-ps46rc-wl~v4775bNq6Jtѝ隮yFWRu$izGs/8}6^<|['Mg{O> 8>%9Bj]??<\?Y//?^ 绫7rӍ?]\}{ˋj\mɶ k KzWM0R$*K4I P;1L)J8;"K"eF +[M:=1c>ӤXW-R+S8&dOq]GDN{bpG^b >>64`:lcsr~.oϞ[2^7|Dn3=ӯ7E|d:`@GȗZ9w(S jF.˺*=͇[yk˖"d 43ku=n)Y;%/n_"2CRr=Cɕj>8lZ-Hjx ŭP pPW,/ $Ylw/DLRF^Kօqh |aN OUVbRNK +R֬EFf=Z2A<{͡lP28!x+W$.W6՟Ͼ>7uK~_.G OV?}zݽ= p<|§~rqOwdӺ5Y;SQ7rT{VVE9GTP$dS\-,#KZ UyJF+@@ǁbfyKA H$=񒼨\Z[o@SoC~'ʀs$u0)Ld>jvpJD 0]ND*#nKRWF9d-Y]n#Ln#6 %,9ϺBߵ?-X;8A Ay;0}Ctu)'uԣ<$ r#o&q񰉐(I% rchIW~Ah;bRr !1Cܢ Hfc* + +X ӌhVnB v^'Cxl4^wȡ$R.y Ĕs +XX%γ TbQGA }Hl)[ 0 +0D9%bI=,08'p1 +VM e'%Rxc$KTX8,FK%6PTc$uM<ʊcJ"ꍝrPK- б0^,N&rc2|{rri/tQ$yVӖdLƱT^DM$-s5<ݑD0W/iX(⬥lKܬ21UqkO9;9qUp,xDR[̟Ex{bqBxw*$Yj %)xˀaf' ulE>#%E.FZ5`B$sO`DN xsbNTZt.K ^!˜6-2yD +ٞEMzy ܱ&^ R,Idb[NsP"f|fD .!jXAHBaINl"u`Q5sJLͫAn`LY":LvR Y)g#7ZE1ڎ|!ɝ`BBgq >} Ǣ2‚es8-,\D,%e 'UJܷKӫZ;JG]U壐cr5ԤܿGy!p!S%IcͲ-Ł{R8Qrda|trI:5k*dD/* C,ZvA4S98Ѓő !2O_Gp#a`m+;(x͔j +Q3%N2@`9 + 3ZFl$(#Q=ePͧZF)=臤 ):pn8[HfAnₚ;z#P~ofC:ۑ=;я`K7G,UXDb:xskXdU ŢgV d@I=3DQ +#cסgvv= k$ka#2:M5OK2)JH ۽AB"LtBJE٤o)Q{:JL,-CU鎽pݡ]"bl;]aQp$^ot)3&{# ٳt0+%&!/L%b O@P)GY;lȌ-IL*8;Yv/"ASp# +-dubc^ 饤 +\-zX +LK/R efpc^ +ӱ\B 䇪dvȃ(q/u`dHV=$HL!Bz TRׅ] + QWJbzu@wxraαD%mnє[Ga˝2T2Nqzi­̌i'?{_T,C8ݧ,슢"M"!INBzKuum]]8bY :,Z|2MJ9|f,:kZ!I!{FK*Md=J' $+py1g$mdp䞷fz.l TP!=`,.|ܘ i袷,{mt4 *|J",sXw}wBQCrsRg֝sqJւIz٠9{Lx=VL'f?W8՗;#?>-.䛷k_~SIq<5JZI`)t&lNU~:@? %"K|onLV^)mx|?{9<y".#f,Q8v#f0!̡NOppw<"6~tgx0'0E/Y#KPhdq<6~#kE7 +pp @lϧ<84;?!)œ( cv+<npw9sp̓ Om`DQ?7DySJHy%u7 G?Ӥ(0TK69{$)̍XH\h +M9rc< g ƗpE$ԤJMnq~YF?()V0Px΃*oI~@iL)Ih4vhD?.k|o_€^}-p`SMA_p62d$ @1oDP`f A j H1.,]qQ?Pz>CM*;mje҂J$W4N[јdwH[_>HtN( ^0e{!(CR%GZP/P-Z ʒ܂ +£=4-"PcʟbyB7 !hACHp'4?\Q.hMNMcRʟ:`TdP0_B8b&KIrI^ BO\]R~I.rƱ 1$yvK5R% A]ĞDʢ BrD,Hh]A`8|%JFmd1R+;lR@$ agZvL;# φDDJUѧ4J|Y'!dbzByƽ&muK(i `"~ߜ2]uY*HJa;;17jT4a"𜶁BSjtrg)AJbA*{xK7] +lp$T!+SLfZҠxI(q5X7;"D9 hYFGN:&}]PDzGtɝ&hlc䫧)ۓp7r8XaqtRN kԖAV~Q>yr"-=$.q AJyʖU+/+]:`L* dA+.s:IC dz];aaxg(#E,&L) 'R*@ &J0Y!F;`B~aevP4D5B] &z%҃,3 [iQNL[qMiQkL[1.lRN%ҡmnF`:];kw< 6f Mel{/![V @* (aaE+-?zQ;)*}IZt - ȂijO'7pv, Ћ2{"̇+ Dv$@O'FAj젷$BV[h]qD( +8)OcwLTW/:Պ[EjqYV鷐p1)`?IT$.E1aP},ävbuŨ Axt!U[XD 4yIPMrR)X,Y V("Ԕ %'XD +Lv''Ɋ">ҫ +B7"-B +,?^6BhNL5JVšNcU #SӺ_=ojzsܪY ($q<(gYЧ^aYe#@9s(g;;xP4ٜ#'G$ `i 䗅,9˰%B8Eg>M0cŖT$#遙vfqBTr(7PQ9j +cX+PGF,j@Y,h$Εq0{<dފ2ʄď$M +1=9Y-QA yL +Ld#DeTiBbrd\TkH@<@QLV`~pH63;(Il’kh *y4ƸADURpʋ%!(4q" +Ǎ. +,4 "`vSϮP#@tVER9hX2 pidUxÝ#؍n.UVXDJa15k _"{_QXE9,vB5J]U+=H}qnu9l6KhQNX?j]T·werN_ ƷZ&.ݭrZ +Hn Y Av5"ȟla9>JkJwVT})ub.{[@RT@Tң iIz4pYu `-!%NϦ rRv#^p)Y @%M^p$ .i{e /{ _.z(WWɂSMq;ɁC8̙{%#hK"ˁ+;. !|/-BEՕ&YSQ#K$E-.@uivOQ7** b@K +im 0R= (JQШ[##;z+i1\ .C!$MG + .5vB"[ vUn]p)~*jS1AHfIi Ω]\ii,van?qjsspi6 { K]* f] nKRkv^qQٿzHr#VI%߂qx=5Z-|e6MI4! +"yt5 Wm5?>#P 2I S'INcA)]u! V$ZUUb/a> J +`<žՅ1OYD~9uI<@I6-$ FEi $N-3<2)TG7()Jv`Of ,| ؕsddpNbi}]$|~ 2 4oHa۹ z˲6^xuJa986#{\_ܬr i7?XjR5/>H)FIv4Z$:*6Zdlԥ kYfqmְ7|HnTQ.!%PJTJWʎQAV:mE迴ـZQq! O{gr@OyD#2^DHǘ$ѱ;(ņ@t=r ?VQq6F=>ۊ5@vCe/m,$q0QU`D>c&O!Yp(-Oi3@ +3V^@(wS(HP?()epiAᭅ:_ D}NvU.E2 +W@ǜ(&F⍔\Z9k(Վ@ѰKP_Y0 Y@Qs[9OHJ_櫧26L@<!, hδyp!cv݈nf5bZrfNʣ+D*}pW+E8e{~0 -̞2 +NSK2GcQ車O\V܁1@I(2YC zSa 11ihQq;4g@P†:|Ү`gGMrc#!5Įպ6 +L?)G4ƒoʹ>HF: mQg$םZ84 Q5-* iD` )* +&:8jGcZ% J9OOI\0sb +ce恞ވ`^ѩhY +*gl?=ر#@4nLEg{Or* |S;ȷ&|dmˋO=IhwzB ]@1]>JНo6J$ڹA[Yl.1!< =X)t 0ť.d)Ι!3IYjA1ҺD8.yWI V pC3N )Q,,EhC]g>ʤ0ܘ({cD;+ i02dEʴ UaiD|֐r;̃L8 g^y18XV2# ӊ+(Sf ^Fc{a)FTF9D"+8)ԧ!9<)Kw\ (HٱlzU +A@Uht9ɺ":qnL+GB ;GJMV!b'ݙe v療C-hgs^ǘ:!"  & :7TWN/ql6O*zz +A'!1rۙEp0߇`nv_* !9I"E (C^I7() `TU$I$ $ ¿~L{쯞 +\z4pEGWdH] \z$pE1+q-\zL#+RH=&pEjJB+?Ͷ)RH=&pE+h\"H#+R \ej +FNJ#+RH=&pEGW"H#+R \Q#+R \z$pEH8WH5&pEFW,zcʸ \j$pEo9pEFW\DHH[j$pEFW \ GYQiG+RH5"U5pE1+RH5""H +詹 LH5"HTcW \HLDSh6pEFW"u5pEH="HcW \z$pE1+ҿͶ+RH=6pX8 a<Ʊ1kXK5b-U!#V/ΪVTctVtJJJ>&+=TȰl`ahJx +:Xέ썵ң$+݂B+1 &ҭ(ҫ܊Ί.n]TbjbがtX騿V:JFQ+ +$٣Gt6qzU+[J+VzbkG[a`ˬl-(#`+Ո^iHz_ye`F^YZjpA#V:8q'b+Z%[BJYX;YݭZbUt'żSΪVzܪVz Q+Bd[Ͷ +-Y9-P obte(;)z ;DT~Y§>EH$ X +r{K]SɌHH_:K]3O!y+ߔ;dĘ]cg|BtݱYॽ g@ݗZl@[j"]EȖ: Z4eHN5ny4/WRWQfc:K]s, ,Y/\)35:A35Gc}(/t'RgPQoPEn=-ƭi`ېe\!g$`N,OLd$;=Z;=ss>Q ܇gngg!.dtK[/rv:\RyriTD4O菁LڗP@P׬-u,{xgA9§(9RT r+JG PPlÈPa&0ʠ*L`t:$ AAd`\2H"3a2`aE~&\dNﳁQ3J}ng$3JeA%*`ck7h,DЬ@ O ,KF S#Eó7&Q` f!SG5(,¨Az"¤KE(@5H6A Ŗ E +i}`9s!`ԛd*v R,$H &KN'Sq0a/yAF)E)1~vt&¬`60 +VX+ +$PZœ0)s8+({AI9'=kcj9~Dși3GXg7:Sz. +7҇ BѬOvDح :P2VBH,#7i| 5j4QiB,*+X{sp>hPckŅƒwTqhOA + +Ov FM\C +./ɜq):=qf0z/| rr=0\YkdRڎ_UfAdw!4zUےGpB +)9<$p@:nPL^HN䄤iqx[&6JSNPjh י6UgD(87GNb%AD>p +&H. l wOxe_=({`a_WRHUrM(].Ti.+( Ȕ08چɗP *>sd +<_Y_.2\V9-|Gldϔ%GB& `L?. g2 ^z K#xP:t2F7gù IukO)"XwgvIaסhnDXׁ]Joxb +A#!1;uc`)mWܖ +re[yHNe0dpsYS٣(8<S\UbE(!$Ny3UDXIc xeB\uhPJ0rLIm2: '|>lLI"DA%E⑇6!1p$I1jR3C%9,/(K6R"`V{C|BW/R]%h7(CY\ dH f{hU}ZZGfрJ2Z $~^Ŧ$ɷ ՊBO8/ Ei*d!!Ial\iXcM`eJ0 @ #%&e(!Fʇr h}XM &zxspDlP| +GA!t3ߑEǺ!le;Eƺ '"+l;*cL+@gRX$F $u3E^yX A!Rœ7]%S*~k;n E4$yHS 0O kBS~ GC=+C[Fi!+岉kQyDPM=2шbd\AbPC!Vtk^E1ôƔ%& Q $EE?0ʜk9X 9Gg~r#o TgMeI)Ʀ:ԁ*~MFBVP9TGe>,#nK,|*Bl epsP: R@M`+Y`y0?xy,>A1h6 APqW 5^xxJg L ( T( L$a +-e*҇+SD`ZMboq :5xn$f2% l&zT^IFr`31ËV JΠs"3Xtxp4Dzp9>B!XլC Dc*"h8586g./ WJ\A%%9čw< XWw@pf%)?Ģ + c2rVGTg9`H,\Pd ᅙ.,-PI/~칲Q~08/(_ 9ȱxz0g =*:a 22fŏqȔ 2eCN13lU05r,YG`OҷĐL&>`N&+) @XI˚.i| NbƇmr;o2E|RI!Ls NжR45 R6{9oΨDȦX/rpM|`-utPN bzy8S/SI*G@@p\!cJq_eF{AK,S$^5$65Q!X/Xу9"3̤SPr1=!(BI/CP&\EۇLB%D +z +/TjA:AGK)T Oc='`~y=5x(b?=7mFBdMP$n0mzhxQ!f)jECo.QbFPB/懅*C10R +Gp` 䰠29P)m:'cN)>)+Q2̎jȔ)zIIϺ΄q`R2:xx.T6aw7 +2_Q9} ^y-,`  @'D[,1fFe {ZBҫ604|cabf7pct }RLЌo0 D=9jTېQNo1R1!d\r@hci$Msș4,901A/(h]UL>Kjc=(#s@-`:&Z0D2H*LaU4[ hX0P.9$R<M<y< +3SJjJz)OXA-) Xpe?fQ]PWRit=1r( R!LYcxf; !FfSiF!y0@=ӧ"/U,e{(VƯ0 7)`$Ü15)12~rJ _eX4bZ(YYJ>WC-ꠀH2j1gɒg``0ABsPRRQ0rCdW&1K1 Ff 3Vсm!ӛP&H<Z RYI2^p§pFA b-Ѧ}n19rR39?O5b!9@S3|@fC>%316h$é5 !dvԾH!GH~z9@0ߍP*fR2e2 oQfQ@n[0SA +6ު+I*Й$ٲ,8d +F?<㞂6N$ځ Asn + c`kҗ贂Жt0qMiX ~`ROubΤ +(0|p3Ʒp)'CK _a7@ LXwecʜaLDɾ0G2DoOБ(92A씂߁ [a4ø"s9AJ,$aeJ68JbF+SnF"GBׄי)cIZrT -'/m[fTMWP*VK.rCDUVlEaD*PeT.*G Τ&mH92 )@EoDFITJ] &5궀#x$\-R=Z䮣g RwЋ?T4LH)>+m]ls0Ǵ\$,x4NH}<` !YJ[X},ڂٜ[}n  +k)kR\?"ᧈ50^ wҡD mr(<*Ypw_BN;d\ Gkb+I3wN0]pA.'2|(D= دĪ)'lr€?#EFaIL:!55'r:0Iic˵-ppMWR~0ĂFBJ,'QE) +~ +=5i&A ^4iMu+YQqɄFB@em"ŔRBT.)9:7sR`T~J&i"ߕ0$.M"67;=D4XI b=t(9p8``?7p#ѓ^kGjf`g1=z$t\)-9KxH+P1KV `:uHBڢV +d&z)9nʶQL ޞw9? g[,^1!1L%f31R 2+,>(;:3|vnOLB8OiJ.AF-spsAsi.{CtVG0 $]i@3"VTfh%f^ ``뛦^''|%ߏER>yZ."M#QvB0~P6ə`=˱[pxq2Oe+6@"ƫ7<CDq#.F)@Ώn%gk'jY:x1)|B>Jpsu}@q=6Ë0͖P2*  m4LѨS`0惾5XIIC:ݕ+Hx!il*x$8l\R"*'sg^茕 +o@ߨ@9M&|R]<\tS@)=1&P1hȠ JIO,9wIisA[ӂnN/Hs^RBO=Ww`F%*砗47Kb891hئ.Aă]KNo ܁ 4TrI.}:7A r*^lz*b52'HԒ5蘞9ΐ;ΔU+])%RP; +$I?!/5hH #Q2N ]NT›?TFj茛 +xn),s4C2)62I@PxOfzɭс? z=x!~4HE@ekX`0DwJpq~4`NvRȹX}E3=sEDb[r4 JF/*fn34< xnb1OoH(*B7/^ +` |'>\H6eP$Ø^ -z8 0 KvX/ #).^ɩpAΚ:pax?鼠S C,XRx$UBJ)F[!'4Iz :Dѥ RT::(|$:ŐFA4Cb +^+dM@6R + +Hx#W D,W8H٤;.m7֞9WvLK6Pqo 1+ ~% =IsKCZq`To2Nx|a=ƚU4[+ *p \quwi`X﷤qke-Ԟw:~-[j.Qx옑UDMLfP2cfcܿVla;'?l뚊bwڤ6 WhjLyPUV \ 7X:Hpu=@Bn= ,:Zo+@~W9w)Lmt*rK9IR3s|.&2!X[W7by7k/A qJzo =|}Askgsze@J 8D~<)ݢ_~4ߛa^dΧw^z9ЎtxMNVnN|2Y@fgʇI%9=YZkuyzzφۄlu>0ȂfѤݟa}Yi[mD۫qjl?tcx=Hӡ ;{`fFdV2=2?Zꂲ8)~Y( x@",,(g;@A/t{* )ڱ$AvvK ̝b}-b&PGG'j,TPRe2 -`z5sm$VC脺Bz@2 ]Z +3)J3 +b. 9\ۑ(s-RXeaWLɄ;iЅXp+qV,T<ѥse(:(U ze[^YL1 +|P j"Vk% +R2C8rl0~ܺ b*^ir *9i̡&K) +$5^сwO!9uM iƸQ# @7>Cg^*}?}s>5(mgLkHFhv;糿&qT\߮-~U^5Iƙm~kB%(q"ѤdJ3o(!8QmzM (| +J(ȴc(甞ӥ 1dDQie1 ǕSV٣[%$}@IzȔ8FA@rhSM[+a AW;UĚ):4*^WKR"mV!g lr4mjcd斢 3ڡӮEV'FQ(*KzaSA4ڡtJMH;f:~P)v[J(FBܟq4o3J.\ЦfӮ=c~hw*XlY3# eP3Ghk+dD*9ף4 +|`7YCXT$}`9%2 P0(S7* +aF -/!.z^i,Vi2?BWXZ&Md}(`1"HEg3ֲ+Z>l 54h$+.xJpk'W +9DU gwL14:@ShB`K~unۧ'N}ܯ0 q9zxP{7GkxT+Y@Dko1?ol%~*I3\P=#<~sofS4,q:vO~,'~txsP[[y]؁6/`i. Z}}r~Jyy:j}uٖ?xa6uFl6O-c\diE\zBGd13uj\d5_rގe#|ʒ1 16C `zw'eV9qְD?A~s0h~!6j=ް.ye%-yXYwT/O~'Htbl/luJ O _Z`'_ȓDn /-\q_sFĚď s} ^ipǏIsX߯wߜ}y 8J^}¯O0jU za9|fS({ymn&Q[:vk'AKBkǝn{:M[n>l W^6x>N~51[ýn_kx.řmjM i[`6 &pn[7Atmi/YW냝mYm9AvW֖x)<";5rq n'xPl|ЬmAY4칶)|4sf\Cϡ/sꕆ9;q{G|mg}X{i9a~S=C_[!U:4ڧFzxkFD}oEݮ?_[mlax9`T9n/Zy`ϡ$<<33Z33x2ѹ J2^| KykUg}jajk0ww!JQgNw|e<zNjBÀ>Nаrw./ EJ[7hi;n ρ.d.j#[}n ; սvc./lX̥Q ,7,`6B%9)$|nD3As'N YD۰ծwyd{8+۳?+2q5 f= WWEhUSyղ1 &/6B:;HӧvQrV]g-[9>$jk[;G4>OEmTlnyq秃aȓ_RNc&?G #9$q{~oz'΅'ۿpd}1n{>7 c7ִ  J* YrmŋvYC-~"ۆ:chޗjhTɛtB3:P賺3G;4 +#&u!1kqai9]}@|>ڎU']yV cwB˄@K'x(z9uۇkQ$G6:U}hG=H|C +Dؾm5v\4:IDl >Oz|

/hq-(ڱߎ.U'l& n0둹~Fn1`_|>Y0f|N; TBma);;VƦc|es=fv^>z7[]ci|)dtSٷj- +\P[puwqc<+Qe*hj׳ݎۯz4}I3FǦSt~SZSkK6]fᦔIa9hfmxԬXذ?ڀd{B ׀ +jncX;;= #u;5s\/84uwEQZ@7jf0iǬ6Bfz]f0j ΃LoF95[i +'O>vM׍~wmd9IRlo71Eޝږ[FEܘ"ږI0IHa5ɬ{QjN/Dw;Q{\5A)X8]?r.C%8f 磖 hFw$9횵FC('vcClfE޸aP=:=[6peA=agnR3B~G 0lXAl1\ZNxhЫat^❣rؑɗ'q"7d]p8:XP(a=W9Qj' +cAO^c>^uʩ;hw o[32<ϊ.2/v(dc߰A^|9,|#+j ª.$Rݫ7__S&/r(gIH3\T4!;.qp~1,scxI_#TT75C\qIC!ær˚K;+^m$+o~y+OOnv.=\tcJ>?5{`-|sս>^65J]Nɯ>_[}7X< SӋ6/m6oJÑ6_O՛K'՗Sӫýgo-̿8{а/̟\_1}>s`j9_GÕەՆx՗ԏ`ᇮՍKsŧ_v.whS姙덵~6r>޺4^oW>__i^[F~j]_;5vW?]_=Xxy^r.5K[6/ReW;u("ñh {]=YG|n^vz^(XV/G/]q}[~2^xw'Xjj;3m<7?s7.px:Nx `}o-Ut]6gfW7k{k~FܺsMᐱyCv{u8W7>u:GKO?,?^_9xX$kdcr; 7Y~{NeSfͧfgä͗V5O7{[I#6݃֠{%g/o<ռyĜY <|zuz.̬SWdK/v7kųWSӷ'k:zk7O+Z;vW7 {suiݻ{V`Uo]_zz35p+wE$2]Y=X!g/2 4͑{ߏ#I|}ݵ;^wd)uibgzKMvW=z0~{M_a-:|ra2{֟ϼ׺_4\_m\KG/=g|iϪflyg;O&[]X:V vZ[o I}^!};l i +MMƐPXYد~zq)[up2}hkoy߅y؝{ߕdɲȮ9ù{4oFQ{zu땅;7ybygOv^?xb^Iӽd^U|sleݥRy󏖏_7ց?7aX޹vbT<lc[ RǶG7v|֣׿Rӥ̾J܁;3 $w0|7|fCt;X{_dRupiiyf;Y;o-|؉ + >w[ n-Z|^m.5?a1/O5R,R<姧kA <)e^\,|uWaWıv/Qb߾:{}[&3N6=Du".L>}>5ޯkՃՃǧKzqZc=[Q3y8}ljK>Xxbiwsa97:3tik{ևkf_ѝC1׌[G A'f/-~h?^.{y -6glObosC.|)?[n$^dwo>}xWѥq;2/u{{{@ݷb͛fV^ug+;f}߭}4lrk{fo>]ݽr)"{MR1Yl;@\^_YzoTōWgH-vrT-E.'g6APSivscשgwRc%;^}v'2eSW/RV^f(O ]i|f:lL7(.=Y}5\zZyduY._bߎtpR1OVʇսkrvtV>\|nѣ g;sk`f/vC_οY_MF==[7ﷁί>epݾqz}1~4{[t0&s䤿cxM̒qt|H>qT{ry}utOy.Q,d~ +-;W,ھs=y]i8qzoB@BB׏?I6nƔkٌh4ͭyu8-Y,-ns6H1l-R|5$I n͢bf*OQY{"Sz5d~ /c)3#SQB;++Oj#^&cؽ rV"Cg9]Q2k +c.fAFZx}wWXi_Xy3! oTcYI'=gظ>Mq彆=HOymbe3賌[^D7.z +ĜuLyEFwod<>%Ny{rԙKVcvL <F +F1k.5~i,XƌfPuVWDž(pzʌ +E).opZ15mlr8pdbyCxE0A,1gF?=m۩oGXuY*M)fHh,4t\^wx5 5{39Y?O+?i=^_i;Z "8V59W&uc8LTf/aI,C@Q +~j̸ Z2Dkڄǒq=6 yڒy1\fx׌oJcodgY̐ k)m$~K8,bX{?cv`Erh;F:>2gwdt}-O.t5ӫYLm3 ͵w{}/o okGKBPEٗef`C#I5~ndO0^ч!I;WrT#@ +i7e[Hg^dL/h2K`7 FwTRZ)`a*slk-gLYC&bE`;SïON3E&LJk?ګ=BC)HF`9;lcq4Bf·7{@~/::tX`3li˅#91c~ GLckM5/TJgfܥpcw`Os9Bϩ/BHxK!c/)d`/w|QBB\䥙yA__ħp&EPm'3 +,M*g;g\~|q Yl}˂'˧olhaX#P)W%e&}8Q*JT m3s`;~2J@be0IaVc{Jʿky|W|gyǸ=`gL&5=(Z_n||O5Q[_d ï`ʚq;l/i߁Q : 쭆 ~E 8=~6WGzٙ $t@˼,`. +k3`=sRJxcw0d + xm`jS5D,C̷̤u؂L2Eq.*b;!bϺ yO{6Bנi*A6G2O\k}HZzOߜD6xϢDڥs߻-YMǚM28vݟO8 g.3OL?aTi.hKKlRKOZ`>}gEW2@߳[#Nk%@&esV=)jM9?*`}%ZT顭@ͥ 0SH_8wSD)="Ys}0,a>aSˌ:bV$h\̌57bn޶o?|䀲1qt'mSSx웂x3Gz%]`bȉـ[1a\?a _Ukq1Jwcԩ<놘1La; }~ƶD +, +c5aAk +Kt#,mLurmW:VU41͂U6nxش^fEJb39bK#VTYlaG;bI&ZcBgԚ֖Z0IHKƠ Zɬ }m4yݝ6xk3â[~n_mm[ mt?vTF +ʓڟ& mm՟MMN[uFwtL:GݛTׯ)οtЗ.K*\JeXWܺoء,& &^7tdWcЭߓ k+/ɞۆم>Rbd0sTܡ/ַjU*ǬӀNa`;o%ddm61bH_uCvQ[ŰP9c1 ;kʈ&ni9iC`c?q`z[Ec\F{QNm{zu4xh;LcrNSō۔gj?5[(]iUʏLe, +)ί@ xhNgBshEsc]7ɧyVؖ k>&Z)1W*E,iRKչY:d2`EOj!Yƞvhν(Z3n&f>N&}gг7bHfd S[j?[&ڃ[;mGOcG쯎MϞ>d~σT)JWeۡ]7!bs#k;_Gӧ~X:%ze8s[P2ҫ9)6sοϥ-P.<)7tUG, ]@=]u8+N5uKQ| % y3تěEeĔHnu" 8IM62IKv,9}䮤3QT}Myݖ1T՗(P>Fnmk n1is_}FwkӺ;V=?xlKhl2i4]{vvk&^?1y3 Wx?w}־ XfeŎ!~cfpm)W\n/&nG$)~J b50Zz`_AO fYl;_mD#B&Nf3Tt5RRh.B ~:k,Z]|_'u1;d8bYogxۂس}$"oEk>2(яlƨÑ\F#oA-U=o'u> XlZnpSO<=~i{o"P;-O Y]b-J%d)4J;YWy; +35h/\Oto},S |L+C ZY?-oYl}TuuHneH>n曽d7,'lzc1(,ZH\a>9} T7ŭE[XI$ˍYM7{{ommOULd=+T%]5ퟪX_?*Ac}ټwG_{ޚknlֳi}XlokF5h4_Ӧk&z`5вVy)߶%Qwk W7hH ~;9^?M G?GpQ~4*m)Wp[ŸX?i8 ziiW7`_9r6QLFmlqOXD'X=USZޫik֪N>)'3wVUg g^ $}~Uڝ+F}S$ԍa-:Vrq-Z3Y~}w/ƿٲ5]uO|"k}di_s7,-Wtj}4nlXAcϮhcAk?+ ppwx=7"nVKeir8w[[ 2Y0JgCB%?kXA9%[3٢ w[tq'Z R =Q1 +d9{x»)i {ʅ1Lq[d +-̾_`[q +1{x]U@ʠq;ZGP,ύIa֛iܾ}+ĊCğ{m;3w+੏L ß5[3P-鰾J^g_*С*qNwk9l6fF\l,fDGZ:]߅~u7%5J':%+߀$S+}aKWZ%n-r3`2z扩m^o鞂MX\t_Ix&QT{KX|չJ—6¨!Yi6G6dK~DcT)iZ8m S\K Խ`*LJ=hUI2]h?X2&^_FOHV:*i zKtt%ӯJRBW)(Ytn7Jo}EV*`WgXIJ'x>nIW㦹Ej bu(Sia183MAx `VQAo m[}Ld*|Yf(Wi +/[T):5 ~oC&JNRB9ȢA[zd-[6J򢯽,*n_+-Qf&t[JU +t25j2 UvI@AeG岯],#SiߏJ~JO*jGyZ{C݆TmUARC@xҜFS锲&4JISĜ8U +jŕ60S1jOzD }hF0P yWPix +sZ/]i(:Dоu+ &RX S~LװR\T~o[D M,.IǧӒm%N+_!c^]E9ڟ3^ii9_6xP_K=\ʶ>m.Li? 9&|lOmNE&j PנIGitG:3|ܯ1߷>Mӹcy9$zjkQi*8ks]K3S/蟱>2CF1;$(`ۀ,SIoL}Y)\u0sXDG +47N7#\ePZ#땭O O-@;i۽VcE;J:IW~V +_Bdv:%SRwyu^3QURJ^h= *t_aRRdT +r:0Zj _Hs*UZ2Vl +R8B!y\= %1[yoxZs_Mn7Lw*W,cEgW;<M$s3XfGs"[l֡NuR4#@NZ d{)&iX3ũ&H7L>Wږ=s-^µ w*)XKq!@UP`zm3׃Q@<-%I5jȋod[(܁@[N5?LͼDLl4ǯ>~:VFƤzצԏ'P,b5%Q#gf7I'Wlw;%F<gPX.U0-T=\t?3mFZHn6 `v;b-ͻUr$5*:GE[5VgF4A!)WU׫yidFBA-M0@vv-; r>A:)aoޔCmw2_[,9LOF/rE jȶ'W=!&D}wÞ>=0uS| +dlI!3AfpKtw*Snp4(/j@Sj3`Fuؒ|}yx~PDzprA 'ٓ_Pj9Rb).A$YGK8 /).]RU!Q%.Yqk\"ɪ e6]kČnK(uo$qS +'|{DB*~DkGcPҭ +p庯O +d5;^UӛOV`JNbSȁ3*iؔw=cPnZmL"nZ"KYv]΋Ǯ/wxE'!AAҁ{@ih:ƌ85NΖ-t!-K*?~ +YǓ$h6e;uNx*Jy[靅aI>@iTn$ok s&NytT$G嬓os% No[D&d]B3TrDibHg|2F崪b% X vXTh4II0&{T59v޽b]h'H  Fy:k Mq<~(fǥ1HYEQAm]o <qXy}2ՐJ, y(5imjka7)YAV -1P4u:L{Y*<lE'U%Ng jJXd*9U5JD\L.fE.E<΂;|cumtLc85q DЉCwctH'?C'[)Bɢo)#hG0t:NA'@ >SF)o)#Z :l+@б;1t:d] fUSFږG]T4IӛmUʈwæ֯s@ /%ظO!@\XQv7kN18,uCk9y.zno JIR9ؗ@stMZ +: +BǏI6sWu:iT݄:$1cLmk`7O[A[kې @ +#& ".OlQΚdnY)R!7ALux}o%uckå+r6%f8ʚ](0$Ɓ]5TNboM_t<4MlJ_ \bRM:`z0%O-ϿQat:$4;CBī ǮDwhwqL%CK ٲ>m;ߥx9 KpE 1&3V9=vweSٓ# QĵQ8j5B#r6i]w2h]&{% +Yő''핂<\SG,睌Io6V.<"(axnc;0;q|Z\4hD[ y##h EPhp2__V$8&p4$<,a + sw:xdx@q Zq <2rkn\LE6 +aP$nωd] __ L޻t|"tA-x Wwse*թS +HNТ%U˳-Cw2 .<1ux']]=ZG[/+^ +* vhTez>1rT^H=ګ x/T0DλH'^P|*BnmMEpFT5n*کh\LQׂSyлgfJ;"q +R&p+hHt' q}ג)+Id'Zk@5ӯݥ@8%;OD$64}~[tRs.T N'(/餰t"tRxHGt0sVtRrF49 V> M'ҩM'k?g`Njth:);4NtMZ-{tRƩl4IDC=S.4m\4z=? MwnF)bV?M'Ed4i( h:) ܽ>MwdIh3tRg!{|6b7]$2I87Jd0߽es&)ϳ[tn%A$$d^5,T zkIjUrƒ9uSe&IRj>)]QpD QJbse-K)ix\4Is'] +2͝KNUr|2vj(zTQy8c('{8}NѶ{hPD8BEOSj50:yVҩh\GqZo"ܑu %Y]-P$KSe,u7yO%Bu%\u4 u5~Lu4 .[9龧 ? +gF_%U]"Ϙ])|ˎkK`m}[!$2F2ZF.YV6Xy5߫R H".#wr1)-KRӳ2U#bsySj7xasy'@y4[5M< n8-Vp &1 [* <g;+r1 %+[}[;%,hLdʻ'R)Q<)iNKR'ÝRW wjo5ǁg^UkfFC离X+F>zA|aY}=WzH)x2n/v<Vb\f˻.b⟊BaAP:}S cRb2(oScv#Ŏ,)hVPWܶ2hV3+ՀLw_ٹ $As'*"PN k)ܿܚtXyWSuۓ0]٫na=^ɔʛl +u+hjԳƕ(;~ 7RK"p)ݼPRQ[ތm^)[EL6E/<ȵ3 ;RNc8Z*U%L2x8<o Npϫ-9^_RmfK>S\6 W)\JдgR"IU1@s `x1kUR~K97R4W>*Ey9R\RbKtDvjĀ0OְK82QI\=>[qm1-]dkopL*مNe$`ǂNY̮NXtC"I mdF%@̂W2$Cd"3 ~KNt+44ItukX5ݜeQIQZ7Eii J$-㴘\ƊU +ӗ9SJyW__Ϻp^V{3L?r-I2.MZwzhBࣗJ'k+Na$HN27;0'ԛctbu=}eb?u'Uq.L'S#8x"iٔL7a7sk2*Z&Bjެ +ԫrR^Ki|eY:PG0Kfص,:&1VhUycW<;)<|cWı/C.,e29* Bt +Z ?Z Qj1k}7 +P * +;Lqm(@@ȱQ?cu+ +P-#߅i^IW'S푤|]x'Ied{NR>3l||j@Lnoո-X^?c"z< R+p^?e3GFn맜[~TS{}B^?~7 +Җyjy(ߥ+O[)wV):|Jw^V?{o)'}y8%AQ^?Eey,aH^ eV ;)waJOm+7Yʆy8$/pе2S:⠈| ^]ÇViJG|Z7*JP*Ut1&qo,X!12|DK}# ,+{GT;qs}nj(d"@i5;VSbsoqbɌ1˕ݻg43gѹ<{x_6z^4o]<ҷwWx/.zII7fIZ8C}~j5$bLaW7B}+>k$4[y]jM!yRy%L[r0 ee5ݎQCu$9/6tZ3Y:}-}B%lz_m$NjȖnurp Avz[th焻f0:ҚqΟ3ϊP@k؎4V$f\4Y9ܖNs.'*pWgA $JL\xLɰp~tpG3z~g+s3c,@elDe6e#NvaPAw~I;]F< +doO9GswjVdO?SUZ#>3Sк uZlEL6nDe0q1ӴFw?τF%B~gSpD'r$0g=@Sh,>h}P-LdgeʖZS+37ݵ%Ύ xttyYyYSsY_ j\ uWoq`W6nlspsg٪̱8hf=#vd$5̂eYvq,`{R CeBτS²@t]PLb5a$Z LL`*CYX OX,rBx0/OgW,v_:񱗋- 1lιΛ첫o w9xzÍ }a +fz0b^ 1_fhyג! 5=sE<7w3Fy0hރ&zN@c`}ggWmm cAd l6e1:$Aѽp=(-]0 ++$!m05'CWΰw7'+3Ւ.2V}ǡ";T;4Y4XrvTnʼnj~-_Ʌ7SIu~V493\r>]I_x8G 14N.|m_#WLCag sk Mp=vð, im9'r%< C{gktBC-7ӟ+irS|} +@<~8Rɫ1653i%۩1q5&huռes;z.Ov)TԚ--jcK}k;:4=HfffH ON` yF$];h3΁OCg$QC'َ^a?b+q'#,!Nd|O3ΔdV5c+cDBC[Όqtᅬ  KPnq`Կufo @);S +U*YY Z\SSNXK:³r-d8Gz\aBGP[mY5ڒ936@eiGSd~:G'}c9coEM\:VZ ) ҫ@T2[ƈ}c8w)hq5{"4CM4{s2>FDhE+O6ZcƭrA@s/#2QU:-=~5?޺;熟|`IT/Y;_77\MRGwBjt) Wԙk#@d:Y2 ̴N\?fP"HeݹwT6.980/L~cuOtynw!/?Ob2agr21,F_7?Ywɟs2 CC#f΀8GLL18$~@ *⦮ t,% nF3(rVA1NDǵnL^8TQ1}%pGO m6;4koOxof; f旰Id`|22=(c@1?&c%# +c$1Q3-̏Șj% Nels>2ȵ$EȘZْt&ĭBOn)JYru4yu+F-ojYnE%*kn6#."GgGb:4<Lm66P +mB%j3ŭIħ#XӖWV"> oRr˶R[~FQ\%ZkƙbASpP[ӝFi-%W= DV8vyh +`{y?BE`bO?IYCvl]Zo(&[g@goRسR[*ǀC6F0n6&#&l٧2[{yC@!rWs1h'@Y̍(1Dc!!sER%vOZrכ.)Jahs;^?*:o0v>R-[>VXUQKB5v hOp&ή6:RGm C+/vId|' Z._{cXNRh@nیdl@en LM-3nu)ߒɤ-iЋ=Yu zAm;M;j")GD1@I}~Pހ!qA TC:^KWCx}8% N +O8N9) +6Ƈ;Al%zJv7ѐ, µ祜'kfJAR/Art)J? +!|$;>/] +>{I,9 wxyN p(*>7>Ḣ6q$`p/jxCadZDYF5 5ދ.q5I?/陉f LII(n->4$&>x'5!# MN@jq l)K^o=ye@Ddđ+&Mƒ,@wӇS$K3  ^ad#\).7m#NV2BBঘ_<>Cd'f7/$d=g܀ + endstream endobj 50 0 obj <>stream +ā. 8AB&H%XJ 7` X˜W@s%x 8h򿒼Fc@A8h//Ts NISXkN pe@hA!ʅ_L|Sb-4"⨘]0&!酑_B+>]/}:ZbTy$Ey|  +Z{8~_ Cډ8m^>7/T#7VR0T'~}3כ8߂'/_` u1d4 endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 31 0 obj [30 0 R 29 0 R] endobj 51 0 obj <> endobj xref 0 52 0000000004 65535 f +0000000016 00000 n +0000000185 00000 n +0000047379 00000 n +0000000000 00000 f +0000266555 00000 n +0000266625 00000 n +0000000000 00000 f +0000047430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000266816 00000 n +0000266847 00000 n +0000266700 00000 n +0000266731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000050006 00000 n +0000050077 00000 n +0000266932 00000 n +0000047801 00000 n +0000053181 00000 n +0000050498 00000 n +0000050385 00000 n +0000048830 00000 n +0000049445 00000 n +0000049493 00000 n +0000050269 00000 n +0000050300 00000 n +0000050153 00000 n +0000050184 00000 n +0000050533 00000 n +0000053249 00000 n +0000053489 00000 n +0000054522 00000 n +0000069362 00000 n +0000134950 00000 n +0000200538 00000 n +0000266126 00000 n +0000266964 00000 n +trailer <<64A8AB8E858948269A0BCA92EF85B468>]>> startxref 267136 %%EOF \ No newline at end of file diff --git a/tools/web3-plugin-example/assets/logo/web3js.jpg b/tools/web3-plugin-example/assets/logo/web3js.jpg new file mode 100644 index 00000000000..3b4cf23de26 Binary files /dev/null and b/tools/web3-plugin-example/assets/logo/web3js.jpg differ diff --git a/tools/web3-plugin-example/assets/logo/web3js.svg b/tools/web3-plugin-example/assets/logo/web3js.svg new file mode 100644 index 00000000000..df8a2fcb868 --- /dev/null +++ b/tools/web3-plugin-example/assets/logo/web3js.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/tools/web3-plugin-example/package.json b/tools/web3-plugin-example/package.json new file mode 100644 index 00000000000..8f3a5d6a5f5 --- /dev/null +++ b/tools/web3-plugin-example/package.json @@ -0,0 +1,62 @@ +{ + "name": "web3-plugin-example", + "version": "1.0.6", + "description": "Example implementations of Web3.js' 4.x plugin system", + "repository": "https://github.com/ChainSafe/web3.js", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "author": "ChainSafe Systems", + "license": "LGPL-3.0", + "keywords": [ + "Ethereum", + "JavaScript", + "API" + ], + "files": [ + "lib/**/*", + "src/**/*" + ], + "scripts": { + "clean": "rimraf dist && rimraf lib", + "prebuild": "yarn clean", + "build": "tsc --build", + "build:check": "node -e \"require('./lib')\"", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --fix --ext .js,.ts .", + "format": "prettier --write '**/*'", + "test": "jest --config=./test/unit/jest.config.js", + "test:coverage:unit": "jest --config=./test/unit/jest.config.js --coverage=true --coverage-reporters=text", + "test:ci": "jest --coverage=true --coverage-reporters=json --verbose", + "test:watch": "npm test -- --watch", + "test:unit": "jest --config=./test/unit/jest.config.js" + }, + "devDependencies": { + "@types/jest": "^28.1.6", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.20.0", + "eslint-config-base-web3": "0.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "jest": "^29.7.0", + "jest-extended": "^3.0.1", + "prettier": "^2.7.1", + "ts-jest": "^29.1.1", + "typescript": "^4.7.4", + "web3": "^4.3.0", + "web3-core": "^4.3.2", + "web3-eth-abi": "^4.1.4", + "web3-eth-contract": "^4.1.4", + "web3-types": "^1.3.1", + "web3-utils": "^4.1.0" + }, + "peerDependencies": { + "web3-core": ">= 4.1.1 < 5", + "web3-eth-abi": ">= 4.1.1 < 5", + "web3-eth-contract": ">= 4.0.5 < 5", + "web3-types": ">= 1.1.1 < 5", + "web3-utils": ">= 4.0.5 < 5" + } +} diff --git a/tools/web3-plugin-example/src/ERC20Token.ts b/tools/web3-plugin-example/src/ERC20Token.ts new file mode 100644 index 00000000000..b13578a62d1 --- /dev/null +++ b/tools/web3-plugin-example/src/ERC20Token.ts @@ -0,0 +1,141 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +export const ERC20TokenAbi = [ + { + inputs: [{ internalType: 'uint256', name: 'initialSupply', type: 'uint256' }], + stateMutability: 'nonpayable', + type: 'constructor', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'owner', type: 'address' }, + { indexed: true, internalType: 'address', name: 'spender', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Approval', + type: 'event', + }, + { + anonymous: false, + inputs: [ + { indexed: true, internalType: 'address', name: 'from', type: 'address' }, + { indexed: true, internalType: 'address', name: 'to', type: 'address' }, + { indexed: false, internalType: 'uint256', name: 'value', type: 'uint256' }, + ], + name: 'Transfer', + type: 'event', + }, + { + inputs: [ + { internalType: 'address', name: 'owner', type: 'address' }, + { internalType: 'address', name: 'spender', type: 'address' }, + ], + name: 'allowance', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'approve', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [{ internalType: 'address', name: 'account', type: 'address' }], + name: 'balanceOf', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'decimals', + outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'subtractedValue', type: 'uint256' }, + ], + name: 'decreaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'spender', type: 'address' }, + { internalType: 'uint256', name: 'addedValue', type: 'uint256' }, + ], + name: 'increaseAllowance', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [], + name: 'name', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'symbol', + outputs: [{ internalType: 'string', name: '', type: 'string' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [], + name: 'totalSupply', + outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], + stateMutability: 'view', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transfer', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'address', name: 'from', type: 'address' }, + { internalType: 'address', name: 'to', type: 'address' }, + { internalType: 'uint256', name: 'amount', type: 'uint256' }, + ], + name: 'transferFrom', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function', + }, +] as const; +export const ERC20TokenBytecode = + '0x60806040523480156200001157600080fd5b50604051620017a8380380620017a8833981810160405281019062000037919062000362565b6040518060400160405280600481526020017f476f6c64000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474c4400000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000bb92919062000272565b508060049080519060200190620000d492919062000272565b505050620000e93382620000f060201b60201c565b5062000535565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000162576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200015990620003f5565b60405180910390fd5b62000176600083836200026860201b60201c565b80600260008282546200018a919062000446565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001e1919062000446565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002489190620004b4565b60405180910390a362000264600083836200026d60201b60201c565b5050565b505050565b505050565b828054620002809062000500565b90600052602060002090601f016020900481019282620002a45760008555620002f0565b82601f10620002bf57805160ff1916838001178555620002f0565b82800160010185558215620002f0579182015b82811115620002ef578251825591602001919060010190620002d2565b5b509050620002ff919062000303565b5090565b5b808211156200031e57600081600090555060010162000304565b5090565b600080fd5b6000819050919050565b6200033c8162000327565b81146200034857600080fd5b50565b6000815190506200035c8162000331565b92915050565b6000602082840312156200037b576200037a62000322565b5b60006200038b848285016200034b565b91505092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620003dd601f8362000394565b9150620003ea82620003a5565b602082019050919050565b600060208201905081810360008301526200041081620003ce565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004538262000327565b9150620004608362000327565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000498576200049762000417565b5b828201905092915050565b620004ae8162000327565b82525050565b6000602082019050620004cb6000830184620004a3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200051957607f821691505b6020821081036200052f576200052e620004d1565b5b50919050565b61126380620005456000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b1e565b60405180910390f35b6100e660048036038101906100e19190610bd9565b610308565b6040516100f39190610c34565b60405180910390f35b61010461032b565b6040516101119190610c5e565b60405180910390f35b610134600480360381019061012f9190610c79565b610335565b6040516101419190610c34565b60405180910390f35b610152610364565b60405161015f9190610ce8565b60405180910390f35b610182600480360381019061017d9190610bd9565b61036d565b60405161018f9190610c34565b60405180910390f35b6101b260048036038101906101ad9190610d03565b6103a4565b6040516101bf9190610c5e565b60405180910390f35b6101d06103ec565b6040516101dd9190610b1e565b60405180910390f35b61020060048036038101906101fb9190610bd9565b61047e565b60405161020d9190610c34565b60405180910390f35b610230600480360381019061022b9190610bd9565b6104f5565b60405161023d9190610c34565b60405180910390f35b610260600480360381019061025b9190610d30565b610518565b60405161026d9190610c5e565b60405180910390f35b60606003805461028590610d9f565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d9f565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610dff565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d9f565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d9f565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610ec7565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f59565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610feb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c5e565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611057565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110e9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d19061117b565b60405180910390fd5b6108e5838383610a7b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109629061120d565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109fe9190610dff565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a629190610c5e565b60405180910390a3610a75848484610a80565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abf578082015181840152602081019050610aa4565b83811115610ace576000848401525b50505050565b6000601f19601f8301169050919050565b6000610af082610a85565b610afa8185610a90565b9350610b0a818560208601610aa1565b610b1381610ad4565b840191505092915050565b60006020820190508181036000830152610b388184610ae5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b7082610b45565b9050919050565b610b8081610b65565b8114610b8b57600080fd5b50565b600081359050610b9d81610b77565b92915050565b6000819050919050565b610bb681610ba3565b8114610bc157600080fd5b50565b600081359050610bd381610bad565b92915050565b60008060408385031215610bf057610bef610b40565b5b6000610bfe85828601610b8e565b9250506020610c0f85828601610bc4565b9150509250929050565b60008115159050919050565b610c2e81610c19565b82525050565b6000602082019050610c496000830184610c25565b92915050565b610c5881610ba3565b82525050565b6000602082019050610c736000830184610c4f565b92915050565b600080600060608486031215610c9257610c91610b40565b5b6000610ca086828701610b8e565b9350506020610cb186828701610b8e565b9250506040610cc286828701610bc4565b9150509250925092565b600060ff82169050919050565b610ce281610ccc565b82525050565b6000602082019050610cfd6000830184610cd9565b92915050565b600060208284031215610d1957610d18610b40565b5b6000610d2784828501610b8e565b91505092915050565b60008060408385031215610d4757610d46610b40565b5b6000610d5585828601610b8e565b9250506020610d6685828601610b8e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610db757607f821691505b602082108103610dca57610dc9610d70565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e0a82610ba3565b9150610e1583610ba3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610e4a57610e49610dd0565b5b828201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610eb1602583610a90565b9150610ebc82610e55565b604082019050919050565b60006020820190508181036000830152610ee081610ea4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f43602483610a90565b9150610f4e82610ee7565b604082019050919050565b60006020820190508181036000830152610f7281610f36565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fd5602283610a90565b9150610fe082610f79565b604082019050919050565b6000602082019050818103600083015261100481610fc8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611041601d83610a90565b915061104c8261100b565b602082019050919050565b6000602082019050818103600083015261107081611034565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006110d3602583610a90565b91506110de82611077565b604082019050919050565b60006020820190508181036000830152611102816110c6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611165602383610a90565b915061117082611109565b604082019050919050565b6000602082019050818103600083015261119481611158565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111f7602683610a90565b91506112028261119b565b604082019050919050565b60006020820190508181036000830152611226816111ea565b905091905056fea264697066735822122039c50588d39e359807efa398bd1b3aff1b082ef738dddcfa8475048e11f9024e64736f6c634300080d0033'; diff --git a/tools/web3-plugin-example/src/contract_method_wrappers.ts b/tools/web3-plugin-example/src/contract_method_wrappers.ts new file mode 100644 index 00000000000..c9b90a112fd --- /dev/null +++ b/tools/web3-plugin-example/src/contract_method_wrappers.ts @@ -0,0 +1,97 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3PluginBase } from 'web3-core'; +import Contract from 'web3-eth-contract'; +import { Address, ContractAbi, DataFormat, DEFAULT_RETURN_FORMAT, Numbers } from 'web3-types'; +import { format, numberToHex } from 'web3-utils'; +// eslint-disable-next-line require-extensions/require-extensions +import { ERC20TokenAbi } from './ERC20Token'; +// eslint-disable-next-line require-extensions/require-extensions +import { Web3Context } from './reexported_web3_context'; + +export class ContractMethodWrappersPlugin extends Web3PluginBase { + public pluginNamespace = 'contractMethodWrappersPlugin'; + + // This should be private, but it's public so _contract.requestManager.send can + // be mocked in contract_method_wrappers.test.ts + public readonly _contract: Contract; + + public constructor(abi: ContractAbi, address: Address) { + super(); + this._contract = new Contract(abi, address); + } + + /** + * This method overrides the inherited `link` method from `Web3PluginBase` + * to add to a configured `RequestManager` to our Contract instance + * when `Web3.registerPlugin` is called. + * + * @param parentContext - The context to be added to the instance of `ChainlinkPlugin`, + * and by extension, the instance of `Contract`. + */ + public link(parentContext: Web3Context) { + super.link(parentContext); + this._contract.link(parentContext); + } + + public async getFormattedBalance( + address: Address, + returnFormat: ReturnFormat, + ) { + return format( + { format: 'unit' }, + await this._contract.methods.balanceOf(address).call(), + returnFormat, + ); + } + + public async transferAndGetBalances( + sender: Address, + recipient: Address, + amount: Numbers, + returnFormat?: ReturnFormat, + ) { + await this._contract.methods + .transfer(recipient, numberToHex(amount)) + .send({ from: sender, type: 0 }); + return { + sender: { + address: sender, + balance: await this.getFormattedBalance( + sender, + returnFormat ?? DEFAULT_RETURN_FORMAT, + ), + }, + recipient: { + address: recipient, + balance: await this.getFormattedBalance( + recipient, + returnFormat ?? DEFAULT_RETURN_FORMAT, + ), + }, + }; + } +} + +// Module Augmentation +declare module './reexported_web3_context' { + interface Web3Context { + contractMethodWrappersPlugin: ContractMethodWrappersPlugin; + } +} + +export { Web3Context }; diff --git a/tools/web3-plugin-example/src/custom_rpc_methods.ts b/tools/web3-plugin-example/src/custom_rpc_methods.ts new file mode 100644 index 00000000000..101816a9c27 --- /dev/null +++ b/tools/web3-plugin-example/src/custom_rpc_methods.ts @@ -0,0 +1,51 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3PluginBase } from 'web3-core'; +// eslint-disable-next-line require-extensions/require-extensions +import { Web3Context } from './reexported_web3_context'; + +type CustomRpcApi = { + custom_rpc_method: () => string; + custom_rpc_method_with_parameters: (parameter1: string, parameter2: number) => string; +}; + +export class CustomRpcMethodsPlugin extends Web3PluginBase { + public pluginNamespace = 'customRpcMethods'; + + public async customRpcMethod() { + return this.requestManager.send({ + method: 'custom_rpc_method', + params: [], + }); + } + + public async customRpcMethodWithParameters(parameter1: string, parameter2: number) { + return this.requestManager.send({ + method: 'custom_rpc_method_with_parameters', + params: [parameter1, parameter2], + }); + } +} + +// Module Augmentation +declare module './reexported_web3_context' { + interface Web3Context { + customRpcMethods: CustomRpcMethodsPlugin; + } +} + +export { Web3Context }; diff --git a/tools/web3-plugin-example/src/reexported_web3_context.ts b/tools/web3-plugin-example/src/reexported_web3_context.ts new file mode 100644 index 00000000000..c9d87dafcb4 --- /dev/null +++ b/tools/web3-plugin-example/src/reexported_web3_context.ts @@ -0,0 +1,19 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; + +export { Web3Context }; diff --git a/tools/web3-plugin-example/test/.eslintrc.js b/tools/web3-plugin-example/test/.eslintrc.js new file mode 100644 index 00000000000..a98dfb6d823 --- /dev/null +++ b/tools/web3-plugin-example/test/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../../.eslintrc.test.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/tools/web3-plugin-example/test/config/jest.config.js b/tools/web3-plugin-example/test/config/jest.config.js new file mode 100644 index 00000000000..7d959c45719 --- /dev/null +++ b/tools/web3-plugin-example/test/config/jest.config.js @@ -0,0 +1,40 @@ +module.exports = { + rootDir: '../..', + testMatch: ['/test/**/?(*.)+(spec|test).+(ts|tsx|js)'], + setupFilesAfterEnv: ['/test/config/setup.js'], + transform: { + '^.+\\.(ts|tsx)$': [ + 'ts-jest', + { + tsconfig: './test/tsconfig.json', + }, + ], + }, + verbose: false, + collectCoverage: false, + coverageReporters: ['json'], + coverageDirectory: '.coverage', + /** + * restoreMocks [boolean] + * + * Default: false + * + * Automatically restore mock state between every test. + * Equivalent to calling jest.restoreAllMocks() between each test. + * This will lead to any mocks having their fake implementations removed + * and restores their initial implementation. + */ + restoreMocks: true, + + /** + * resetModules [boolean] + * + * Default: false + * + * By default, each test file gets its own independent module registry. + * Enabling resetModules goes a step further and resets the module registry before running each individual test. + * This is useful to isolate modules for every test so that local module state doesn't conflict between tests. + * This can be done programmatically using jest.resetModules(). + */ + resetModules: true, +}; diff --git a/tools/web3-plugin-example/test/config/setup.js b/tools/web3-plugin-example/test/config/setup.js new file mode 100644 index 00000000000..0b6b9109ce0 --- /dev/null +++ b/tools/web3-plugin-example/test/config/setup.js @@ -0,0 +1,24 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +// Have to use `require` because of Jest issue https://jestjs.io/docs/ecmascript-modules +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('jest-extended'); + +// @todo extend jest to have "toHaveBeenCalledOnceWith" matcher. + +process.env.NODE_ENV = 'test'; diff --git a/tools/web3-plugin-example/test/tsconfig.json b/tools/web3-plugin-example/test/tsconfig.json new file mode 100644 index 00000000000..7b7b1624905 --- /dev/null +++ b/tools/web3-plugin-example/test/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig", + "compilerOptions": { + "declaration": false, + "declarationMap": false + }, + "include": ["./**/*", "../node_modules/jest-extended/types/**/*.ts"] +} diff --git a/tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts b/tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts new file mode 100644 index 00000000000..aae3ba16310 --- /dev/null +++ b/tools/web3-plugin-example/test/unit/contract_method_wrappers.test.ts @@ -0,0 +1,131 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from 'web3'; +import { DEFAULT_RETURN_FORMAT } from 'web3-types'; + +import { ContractMethodWrappersPlugin } from '../../src/contract_method_wrappers'; +import { ERC20TokenAbi } from '../../src/ERC20Token'; + +declare module '../web3_export_helper' { + interface Web3 { + contractMethodWrappersPlugin: ContractMethodWrappersPlugin; + } +} + +describe('ContractMethodWrappersPlugin', () => { + it('should register the plugin', () => { + const web3 = new Web3('http://127.0.0.1:8545'); + web3.registerPlugin( + new ContractMethodWrappersPlugin( + ERC20TokenAbi, + '0xdAC17F958D2ee523a2206206994597C13D831ec7', + ), + ); + expect(web3.contractMethodWrappersPlugin).toBeDefined(); + }); + + describe('methods', () => { + const contractAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7'; + const sender = '0x8da5e39ec14b57fb9bcd9aa2b4500e909119795d'; + const recipient = '0x4f641def1e7845caab95ac717c80416082430d0d'; + const amount = BigInt(42); + const expectedSenderBalance = + '0x0000000000000000000000000000000000000000000000000000000000000280'; + const expectedRecipientBalance = + '0x0000000000000000000000000000000000000000000000000000000000000120'; + let requestManagerSendSpy: jest.Mock; + + let web3: Web3; + + beforeAll(() => { + web3 = new Web3('http://127.0.0.1:8545'); + web3.registerPlugin(new ContractMethodWrappersPlugin(ERC20TokenAbi, contractAddress)); + }); + + beforeEach(() => { + requestManagerSendSpy = jest.fn(); + web3.contractMethodWrappersPlugin._contract.requestManager.send = requestManagerSendSpy; + }); + + it('should call `getFormattedBalance` with expected RPC object', async () => { + requestManagerSendSpy.mockResolvedValueOnce(expectedSenderBalance); + + await web3.contractMethodWrappersPlugin.getFormattedBalance( + sender, + DEFAULT_RETURN_FORMAT, + ); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'eth_call', + params: [ + expect.objectContaining({ + data: '0x70a082310000000000000000000000008da5e39ec14b57fb9bcd9aa2b4500e909119795d', + to: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + }), + 'latest', + ], + }); + }); + + it('should call `transferAndGetBalances` with expected RPC object', async () => { + const expectedGasPrice = '0x1ca14bd70'; + const expectedTransactionHash = + '0xc41b9a4f654c44552e135f770945916f57c069b80326f9a5f843e613491ab6b1'; + + requestManagerSendSpy.mockResolvedValueOnce(expectedGasPrice); + // Mocking block number for trySendTransaction call + requestManagerSendSpy.mockResolvedValueOnce('0x1'); + requestManagerSendSpy.mockResolvedValueOnce(expectedTransactionHash); + // Mocking response for getTransactionReceipt for waitForTransactionReceipt + requestManagerSendSpy.mockResolvedValueOnce({}); + // Mocking getBlockNumber for waitForTransactionReceipt + requestManagerSendSpy.mockResolvedValueOnce('0x2'); + requestManagerSendSpy.mockResolvedValueOnce(expectedSenderBalance); + requestManagerSendSpy.mockResolvedValueOnce(expectedRecipientBalance); + + const balances = await web3.contractMethodWrappersPlugin.transferAndGetBalances( + sender, + recipient, + amount, + ); + // The first call will be to `eth_gasPrice` and the second is to `eth_blockNumber`. And the third one will be to `eth_sendTransaction`: + expect(requestManagerSendSpy).toHaveBeenNthCalledWith(3, { + method: 'eth_sendTransaction', + params: [ + expect.objectContaining({ + data: '0xa9059cbb0000000000000000000000004f641def1e7845caab95ac717c80416082430d0d000000000000000000000000000000000000000000000000000000000000002a', + from: sender, + gasPrice: expectedGasPrice, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + to: contractAddress, + }), + ], + }); + + expect(balances).toStrictEqual({ + sender: { + address: sender, + balance: BigInt(expectedSenderBalance), + }, + recipient: { + address: recipient, + balance: BigInt(expectedRecipientBalance), + }, + }); + }); + }); +}); diff --git a/tools/web3-plugin-example/test/unit/custom_rpc_methods.test.ts b/tools/web3-plugin-example/test/unit/custom_rpc_methods.test.ts new file mode 100644 index 00000000000..b65a23dad70 --- /dev/null +++ b/tools/web3-plugin-example/test/unit/custom_rpc_methods.test.ts @@ -0,0 +1,60 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import { Web3Context } from 'web3-core'; + +import { CustomRpcMethodsPlugin } from '../../src/custom_rpc_methods'; + +describe('CustomRpcMethodsPlugin', () => { + it('should register the plugin', () => { + const web3Context = new Web3Context('http://127.0.0.1:8545'); + web3Context.registerPlugin(new CustomRpcMethodsPlugin()); + expect(web3Context.customRpcMethods).toBeDefined(); + }); + + describe('methods', () => { + const requestManagerSendSpy = jest.fn(); + + let web3Context: Web3Context; + + beforeAll(() => { + web3Context = new Web3Context('http://127.0.0.1:8545'); + web3Context.registerPlugin(new CustomRpcMethodsPlugin()); + web3Context.requestManager.send = requestManagerSendSpy; + }); + + it('should call `customRpcMethod` with expected RPC object', async () => { + await web3Context.customRpcMethods.customRpcMethod(); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'custom_rpc_method', + params: [], + }); + }); + + it('should call `customRpcMethodWithParameters` with expected RPC object', async () => { + const parameter1 = 'myString'; + const parameter2 = 42; + await web3Context.customRpcMethods.customRpcMethodWithParameters( + parameter1, + parameter2, + ); + expect(requestManagerSendSpy).toHaveBeenCalledWith({ + method: 'custom_rpc_method_with_parameters', + params: [parameter1, parameter2], + }); + }); + }); +}); diff --git a/tools/web3-plugin-example/test/unit/jest.config.js b/tools/web3-plugin-example/test/unit/jest.config.js new file mode 100644 index 00000000000..ceac341e332 --- /dev/null +++ b/tools/web3-plugin-example/test/unit/jest.config.js @@ -0,0 +1,9 @@ +const base = require('../config/jest.config'); + +module.exports = { + ...base, + testMatch: ['/test/unit/**/*.(spec|test).(js|ts)'], + + coverageDirectory: '.coverage/unit', + collectCoverageFrom: ['src/**'], +}; diff --git a/tools/web3-plugin-example/test/web3_export_helper.ts b/tools/web3-plugin-example/test/web3_export_helper.ts new file mode 100644 index 00000000000..848ef956ea4 --- /dev/null +++ b/tools/web3-plugin-example/test/web3_export_helper.ts @@ -0,0 +1,19 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ +import Web3 from 'web3'; + +export { Web3 }; diff --git a/tools/web3-plugin-example/tsconfig.json b/tools/web3-plugin-example/tsconfig.json new file mode 100644 index 00000000000..d0a348ec5ad --- /dev/null +++ b/tools/web3-plugin-example/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "lib", + "esModuleInterop": true, + "module": "commonjs", + "declaration": true, + "declarationMap": true + }, + "include": ["src/**/*"] +} diff --git a/tools/web3-plugin-example/tsdoc.json b/tools/web3-plugin-example/tsdoc.json new file mode 100644 index 00000000000..776fc76a3d3 --- /dev/null +++ b/tools/web3-plugin-example/tsdoc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["../../tsdoc.json"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000000..5af026dc58b --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "target": "es2016", + "moduleResolution": "node", + "newLine": "lf", + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "pretty": true, + "removeComments": false, + "sourceMap": true, + "strict": true, + "strictNullChecks": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + } +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 025fa0089c2..00000000000 --- a/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "outDir": "./lib", - "allowJs": true, - "target": "esnext", - "pretty": true, - "module": "commonjs", - } -} diff --git a/tsdoc.json b/tsdoc.json new file mode 100644 index 00000000000..9f254efbdde --- /dev/null +++ b/tsdoc.json @@ -0,0 +1,87 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "tagDefinitions": [ + { + "tagName": "@alias", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@function", + "syntaxKind": "inline", + "allowMultiple": false + }, + { + "tagName": "@doclink", + "syntaxKind": "inline", + "allowMultiple": true + }, + + // TODO: When following fix is released we can replace below configuration with `extend` + // https://github.com/TypeStrong/typedoc/issues/2015 + // "extends": ["typedoc/tsdoc.json"], + { + "tagName": "@module", + "syntaxKind": "block" + }, + { + "tagName": "@typedef", + "syntaxKind": "block" + }, + { + "tagName": "@callback", + "syntaxKind": "block" + }, + { + "tagName": "@prop", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@property", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@group", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@category", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@hidden", + "syntaxKind": "modifier" + }, + { + "tagName": "@ignore", + "syntaxKind": "modifier" + }, + { + "tagName": "@enum", + "syntaxKind": "modifier" + }, + { + "tagName": "@event", + "syntaxKind": "modifier" + }, + { + "tagName": "@template", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@linkcode", + "syntaxKind": "inline", + "allowMultiple": true + }, + { + "tagName": "@linkplain", + "syntaxKind": "block", + "allowMultiple": true + } + ] +} diff --git a/verdaccio.yml b/verdaccio.yml index a928f2956f3..42ee34b7f26 100644 --- a/verdaccio.yml +++ b/verdaccio.yml @@ -28,4 +28,4 @@ packages: logs: - {type: stdout, format: pretty, level: warn} server: - keepAliveTimeout: 600 # specified in seconds \ No newline at end of file + keepAliveTimeout: 600 # specified in seconds diff --git a/webpack.base.config.js b/webpack.base.config.js new file mode 100644 index 00000000000..833b1e74aa9 --- /dev/null +++ b/webpack.base.config.js @@ -0,0 +1,75 @@ +/* +This file is part of web3.js. + +web3.js is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +web3.js 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 Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with web3.js. If not, see . +*/ + +const webpack = require('webpack'); +const path = require('path'); + +/** + * Shared webpack configuration for all packages + */ +function getWebPackConfig(packagePath, filename, library, entry, tsconf) { + return { + mode: 'production', + entry: path.resolve(packagePath, entry), + output: { + path: path.resolve(packagePath, 'dist'), + filename: filename, + library: library, + libraryExport: 'default', + libraryTarget: 'umd', + globalObject: 'this', + }, + + module: { + rules: [ + { + test: /\.ts$/, + loader: 'ts-loader', + options: { + configFile: path.resolve(packagePath, tsconf), + }, + exclude: ['/node_modules/', '/test/'], + }, + ], + }, + resolve: { + extensions: ['.ts', '.js'], + fallback: { + stream: require.resolve('readable-stream'), + }, + extensionAlias: { + '.js': ['.js', '.ts'], + }, + }, + devtool: 'source-map', + plugins: [ + new webpack.IgnorePlugin({ + checkResource(resource) { + // "@ethereumjs/common/genesisStates" consists ~800KB static files which are no more needed + return /(.*\/genesisStates\/.*\.json)/.test(resource); + }, + }), + new webpack.ProvidePlugin({ + process: 'process/browser', + }), + ], + }; +} + +module.exports = { + getWebPackConfig, +}; diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 0fc74e82798..00000000000 --- a/webpack.config.js +++ /dev/null @@ -1,53 +0,0 @@ -const path = require("path"); -const webpack = require("webpack"); -const { CleanWebpackPlugin } = require("clean-webpack-plugin"); - -module.exports = { - mode: "production", - entry: { - web3: "./packages/web3/lib/index.js", - }, - plugins: [ - new CleanWebpackPlugin(), - new webpack.SourceMapDevToolPlugin({ - filename: "[file].map", - }), - ], - resolve: { - modules: ["node_modules"], - }, - module: { - rules: [ - { - test: /\.m?js$/, - use: { - loader: "babel-loader", - options: { - presets: [ - [ - "@babel/preset-env", - { - useBuiltIns: "entry", - corejs: 3, - targets: { - ie: 10, - }, - }, - ], - ], - plugins: [ - "@babel/plugin-transform-runtime", - "@babel/plugin-transform-modules-commonjs", - ], - }, - }, - }, - ], - }, - output: { - filename: "[name].min.js", - path: path.resolve(__dirname, "dist"), - library: "Web3", - libraryTarget: "umd", - }, -}; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000000..bc653ed8db7 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,12858 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@^1.8.8": + version "1.8.8" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.8.8.tgz#c4540c532bee6d99cd30ab73a4302e8e3be3b222" + integrity sha512-QbJczL+zOCNUBkfjCww1DfhL+KNYgC/yCBApqT3d8b9BHg7CFw4O3bTY0BOogiMhw/vGnV2FD17bstxXWn61EA== + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.10", "@babel/generator@^7.7.2": + version "7.18.12" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" + integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== + dependencies: + "@babel/types" "^7.18.10" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-define-polyfill-provider@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" + integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" + integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== + +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.5.5": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f" + integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.2" + babel-plugin-polyfill-corejs3 "^0.5.3" + babel-plugin-polyfill-regenerator "^0.4.0" + semver "^6.3.0" + +"@babel/runtime@^7.21.0": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" + integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.5.5": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" + integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@cypress/webpack-preprocessor@^5.12.0": + version "5.12.2" + resolved "https://registry.yarnpkg.com/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.12.2.tgz#9cc623a5629980d7f2619569bffc8e3f05a701ae" + integrity sha512-t29wEFvI87IMnCd8taRunwStNsFjFWg138fGF0hPQOYgSj30fbzCEwFD9cAQLYMMcjjuXcnnw8yOfkzIZBBNVQ== + dependencies: + bluebird "3.7.1" + debug "^4.3.2" + lodash "^4.17.20" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@droppedcode/typedoc-plugin-relative-includes@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@droppedcode/typedoc-plugin-relative-includes/-/typedoc-plugin-relative-includes-1.0.2.tgz#f418b7c117c8ae16a03f35022bb24768e2bf34fb" + integrity sha512-KsiQ0oC2Px4hh+DvqZu38NYJHAG+gvm19EVXBW+AWYzgPm5lLTXuW0+WArh7ngo+MUDcvo4ZYsxqKPz203/Cbw== + +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.6.4": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/tx@^3.3.0": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" + integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@humeris/boule@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@humeris/boule/-/boule-4.0.0.tgz#50eec1208f3d747585ecd6040b34641f0ba81931" + integrity sha512-kaD0eg61QZb8Qwymx/DW1bOoFwzuWiG9lW3ik3dD8//HDEvr15OSykXdJECLgQPfMrS4RuLGHU+lmJkrHk8XoA== + +"@humeris/espresso-shot@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@humeris/espresso-shot/-/espresso-shot-4.0.0.tgz#e720d2bd3d555a3118e788931a01a991308f8cfe" + integrity sha512-cVmyBfgrutiBmQcMIxfCVnTb2UBgl00dGIuwoOCjeeASOz9/rPtiXxbic9n+8RXXvTNt+mLfxssPMLf7yb7U5A== + dependencies: + "@humeris/boule" "^4.0.0" + +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/string-locale-compare@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" + integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.18": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@lerna/child-process@6.6.2": + version "6.6.2" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-6.6.2.tgz#5d803c8dee81a4e013dc428292e77b365cba876c" + integrity sha512-QyKIWEnKQFnYu2ey+SAAm1A5xjzJLJJj3bhIZd3QKyXKKjaJ0hlxam/OsWSltxTNbcyH1jRJjC6Cxv31usv0Ag== + dependencies: + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/create@6.6.2": + version "6.6.2" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-6.6.2.tgz#39a36d80cddb355340c297ed785aa76f4498177f" + integrity sha512-xQ+1Y7D+9etvUlE+unhG/TwmM6XBzGIdFBaNoW8D8kyOa9M2Jf3vdEtAxVa7mhRz66CENfhL/+I/QkVaa7pwbQ== + dependencies: + "@lerna/child-process" "6.6.2" + dedent "^0.7.0" + fs-extra "^9.1.0" + init-package-json "^3.0.2" + npm-package-arg "8.1.1" + p-reduce "^2.1.0" + pacote "15.1.1" + pify "^5.0.0" + semver "^7.3.4" + slash "^3.0.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^4.0.0" + yargs-parser "20.2.4" + +"@lerna/legacy-package-management@6.6.2": + version "6.6.2" + resolved "https://registry.yarnpkg.com/@lerna/legacy-package-management/-/legacy-package-management-6.6.2.tgz#411c395e72e563ab98f255df77e4068627a85bb0" + integrity sha512-0hZxUPKnHwehUO2xC4ldtdX9bW0W1UosxebDIQlZL2STnZnA2IFmIk2lJVUyFW+cmTPQzV93jfS0i69T9Z+teg== + dependencies: + "@npmcli/arborist" "6.2.3" + "@npmcli/run-script" "4.1.7" + "@nrwl/devkit" ">=15.5.2 < 16" + "@octokit/rest" "19.0.3" + byte-size "7.0.0" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "5.0.0" + columnify "1.6.0" + config-chain "1.1.12" + conventional-changelog-core "4.2.4" + conventional-recommended-bump "6.1.0" + cosmiconfig "7.0.0" + dedent "0.7.0" + dot-prop "6.0.1" + execa "5.0.0" + file-url "3.0.0" + find-up "5.0.0" + fs-extra "9.1.0" + get-port "5.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.10" + has-unicode "2.0.1" + inquirer "8.2.4" + is-ci "2.0.0" + is-stream "2.0.0" + libnpmpublish "7.1.4" + load-json-file "6.2.0" + make-dir "3.1.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "14.0.3" + npmlog "6.0.2" + p-map "4.0.0" + p-map-series "2.1.0" + p-queue "6.6.2" + p-waterfall "2.1.1" + pacote "15.1.1" + pify "5.0.0" + pretty-format "29.4.3" + read-cmd-shim "3.0.0" + read-package-json "5.0.1" + resolve-from "5.0.0" + semver "7.3.8" + signal-exit "3.0.7" + slash "3.0.0" + ssri "9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + tempy "1.0.0" + upath "2.0.1" + uuid "8.3.2" + write-file-atomic "4.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + +"@metamask/eth-sig-util@4.0.1", "@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@metamask/safe-event-emitter@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== + +"@microsoft/tsdoc-config@0.16.1": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz#4de11976c1202854c4618f364bf499b4be33e657" + integrity sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ== + dependencies: + "@microsoft/tsdoc" "0.14.1" + ajv "~6.12.6" + jju "~1.4.0" + resolve "~1.19.0" + +"@microsoft/tsdoc@0.14.1": + version "0.14.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz#155ef21065427901994e765da8a0ba0eaae8b8bd" + integrity sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw== + +"@noble/curves@1.0.0", "@noble/curves@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.0.0.tgz#e40be8c7daf088aaf291887cbc73f43464a92932" + integrity sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw== + dependencies: + "@noble/hashes" "1.3.0" + +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/hashes@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" + integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== + +"@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/hashes@~1.1.1": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" + integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" + integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" + integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" + integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" + integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" + integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" + integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" + integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" + integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" + integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" + integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" + integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" + +"@npmcli/arborist@6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.2.3.tgz#31f8aed2588341864d3811151d929c01308f8e71" + integrity sha512-lpGOC2ilSJXcc2zfW9QtukcCTcMbl3fVI0z4wvFB2AFIl0C+Q6Wv7ccrpdrQa8rvJ1ZVuc6qkX7HVTyKlzGqKA== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/fs" "^3.1.0" + "@npmcli/installed-package-contents" "^2.0.0" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^5.0.0" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^3.0.0" + "@npmcli/query" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + bin-links "^4.0.1" + cacache "^17.0.4" + common-ancestor-path "^1.0.1" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" + json-stringify-nice "^1.1.4" + minimatch "^6.1.6" + nopt "^7.0.0" + npm-install-checks "^6.0.0" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-registry-fetch "^14.0.3" + npmlog "^7.0.1" + pacote "^15.0.8" + parse-conflict-json "^3.0.0" + proc-log "^3.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^1.0.1" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.1" + treeverse "^3.0.0" + walk-up-path "^1.0.0" + +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.4.tgz#cdf74f21b1d440c0756fb28159d935129d9daa33" + integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + +"@npmcli/installed-package-contents@^2.0.0", "@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/map-workspaces@^3.0.2": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" + integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + +"@npmcli/metavuln-calculator@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" + integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== + dependencies: + cacache "^17.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^15.0.0" + semver "^7.3.5" + +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + +"@npmcli/node-gyp@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" + integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/package-json@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-3.1.0.tgz#d9eb34083be4275520f3844d17fc74926d47cae1" + integrity sha512-qNPy6Yf9ruFST99xcrl5EWAvrb7qFrwgVbwdzcTJlIgxbArKOq5e/bgZ6rTL1X9hDgAdPbvL8RWx/OTLSB0ToA== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.1" + +"@npmcli/promise-spawn@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" + integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/query@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.0.tgz#51a0dfb85811e04f244171f164b6bc83b36113a7" + integrity sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA== + dependencies: + postcss-selector-parser "^6.0.10" + +"@npmcli/run-script@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" + integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== + dependencies: + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/promise-spawn" "^3.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^2.0.3" + which "^2.0.2" + +"@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@nrwl/cli@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.9.4.tgz#63b600dff1cdc126f234d16978a888f72c22a00c" + integrity sha512-FoiGFCLpb/r4HXCM3KYqT0xteP+MRV6bIHjz3bdPHIDLmBNQQnRRaV2K47jtJ6zjh1eOU5UHKyDtDDYf80Idpw== + dependencies: + nx "15.9.4" + +"@nrwl/devkit@>=15.5.2 < 16": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.9.4.tgz#3f0a43a9637fcd0a46c06df2a9c36012b27f006b" + integrity sha512-mUX1kXTuPMdTzFxIzH+MsSNvdppOmstPDOEtiGFZJTuJ625ki0HhNJILO3N2mJ7MeMrLqIlAiNdvelQaObxYsQ== + dependencies: + ejs "^3.1.7" + ignore "^5.0.4" + semver "7.3.4" + tmp "~0.2.1" + tslib "^2.3.0" + +"@nrwl/nx-darwin-arm64@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.9.4.tgz#e5a2f39d42a60397a01140a251f894788f5d1fda" + integrity sha512-XnvrnT9BJsgThY/4xUcYtE077ERq/img8CkRj7MOOBNOh0/nVcR4LGbBKDHtwE3HPk0ikyS/SxRyNa9msvi3QQ== + +"@nrwl/nx-darwin-x64@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.4.tgz#97a810d4ff6b4bf395a43e4740890c0def2372da" + integrity sha512-WKSfSlpVMLchpXkax0geeUNyhvNxwO7qUz/s0/HJWBekt8fizwKDwDj1gP7fOu+YWb/tHiSscbR1km8PtdjhQw== + +"@nrwl/nx-linux-arm-gnueabihf@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.9.4.tgz#b8dd23b8c755b7e640d744945ab2dec3fd3eda65" + integrity sha512-a/b4PP7lP/Cgrh0LjC4O2YTt5pyf4DQTGtuE8qlo8o486UiofCtk4QGJX72q80s23L0ejCaKY2ULKx/3zMLjuA== + +"@nrwl/nx-linux-arm64-gnu@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.9.4.tgz#5bc150c2bdb2e0a2eaf8721b3c5fdb2eb93f8739" + integrity sha512-ibBV8fMhSfLVd/2WzcDuUm32BoZsattuKkvMmOoyU6Pzoznc3AqyDjJR4xCIoAn5Rf+Nu1oeQONr5FAtb1Ugow== + +"@nrwl/nx-linux-arm64-musl@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.9.4.tgz#df2f18f813828000dc52f1b7668339947b1a0862" + integrity sha512-iIjvVYd7+uM4jVD461+PvU5XTALgSvJOODUaMRGOoDl0KlMuTe6pQZlw0eXjl5rcTd6paKaVFWT5j6awr8kj7w== + +"@nrwl/nx-linux-x64-gnu@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.9.4.tgz#55547b07e6aeb0c36a43e05bd07c15b013f2de9f" + integrity sha512-q4OyH72mdrE4KellBWtwpr5EwfxHKNoFP9//7FAILO68ROh0rpMd7YQMlTB7T04UEUHjKEEsFGTlVXIee3Viwg== + +"@nrwl/nx-linux-x64-musl@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.9.4.tgz#29cd644736f643566d9c0e1a1171c49a62a08c09" + integrity sha512-67+/XNMR1CgLPyeGX8jqSG6l8yYD0iiwUgcu1Vaxq6N05WwnqVisIW8XzLSRUtKt4WyVQgOWk3aspImpMVOG3Q== + +"@nrwl/nx-win32-arm64-msvc@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.9.4.tgz#55a38bf5dc201e9088729fb03e505dc63caf8b3a" + integrity sha512-2rEsq3eOGVCYpYJn2tTJkOGNJm/U8rP/FmqtZXYa6VJv/00XP3Gl00IXFEDaYV6rZo7SWqLxtEPUbjK5LwPzZA== + +"@nrwl/nx-win32-x64-msvc@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.9.4.tgz#56bb859bfe47d08d14f8d5822d9a31d9098d95a9" + integrity sha512-bogVju4Z/hy1jbppqaTNbmV1R4Kg0R5fKxXAXC2LaL7FL0dup31wPumdV+mXttXBNOBDjV8V/Oz1ZqdmxpOJUw== + +"@nrwl/tao@15.9.4": + version "15.9.4" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.9.4.tgz#5e384af06d1fb68e326eda2c6a5d8f99ce1583b8" + integrity sha512-m90iz8UsXx1rgPm1dxsBQjSrCViWYZIrp8bpwjSCW24j3kifyilYSXGuKaRwZwUn7eNmH/kZcI9/8qeGIPF4Sg== + dependencies: + nx "15.9.4" + +"@octokit/auth-token@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.1.tgz#88bc2baf5d706cb258474e722a720a8365dff2ec" + integrity sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA== + dependencies: + "@octokit/types" "^7.0.0" + +"@octokit/core@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.0.5.tgz#589e68c0a35d2afdcd41dafceab072c2fbc6ab5f" + integrity sha512-4R3HeHTYVHCfzSAi0C6pbGXV8UDI5Rk+k3G7kLVNckswN9mvpOzW9oENfjfH3nEmzg8y3AmKmzs8Sg6pLCeOCA== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^7.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.1.tgz#cb0d03e62e8762f3c80e52b025179de81899a823" + integrity sha512-/wTXAJwt0HzJ2IeE4kQXO+mBScfzyCkI0hMtkIaqyXd9zg76OpOfNQfHL9FlaxAV2RsNiOXZibVWloy8EexENg== + dependencies: + "@octokit/types" "^7.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.1.tgz#a06982514ad131fb6fbb9da968653b2233fade9b" + integrity sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^7.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^12.11.0": + version "12.11.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== + +"@octokit/openapi-types@^13.1.0": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-13.1.0.tgz#30459b45e6dd388d48d72de166f2f08ee8ece5b6" + integrity sha512-Z7vzLqfTkoVQyoy/2iQla1N2I4Vav2wi4JbZK8QxIYAfBimhuflosFxmsqw5LTH7DkdNW46ZYpAcqJf0XaS8SQ== + +"@octokit/plugin-enterprise-rest@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" + integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== + +"@octokit/plugin-paginate-rest@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz#86f8be759ce2d6d7c879a31490fd2f7410b731f0" + integrity sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA== + dependencies: + "@octokit/types" "^6.41.0" + +"@octokit/plugin-request-log@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== + +"@octokit/plugin-rest-endpoint-methods@^6.0.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.3.0.tgz#81549334ce020169b84bd4a7fa2577e9d725d829" + integrity sha512-qEu2wn6E7hqluZwIEUnDxWROvKjov3zMIAi4H4d7cmKWNMeBprEXZzJe8pE5eStUYC1ysGhD0B7L6IeG1Rfb+g== + dependencies: + "@octokit/types" "^7.0.0" + deprecation "^2.3.1" + +"@octokit/request-error@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.1.tgz#3fd747913c06ab2195e52004a521889dadb4b295" + integrity sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ== + dependencies: + "@octokit/types" "^7.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^6.0.0": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.1.tgz#3ceeb22dab09a29595d96594b6720fc14495cf4e" + integrity sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ== + dependencies: + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^7.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/rest@19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" + integrity sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ== + dependencies: + "@octokit/core" "^4.0.0" + "@octokit/plugin-paginate-rest" "^3.0.0" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^6.0.0" + +"@octokit/types@^6.41.0": + version "6.41.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== + dependencies: + "@octokit/openapi-types" "^12.11.0" + +"@octokit/types@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-7.1.0.tgz#98e345dbc6eba326dad5cfa4074171d89abb9d84" + integrity sha512-+ClA0jRc9zGFj5mfQeQNfgTlelzhpAexbAueQG1t2Xn8yhgnsjkF8bgLcUUpwrpqkv296uXyiGwkqXRSU7KYzQ== + dependencies: + "@octokit/openapi-types" "^13.1.0" + +"@openzeppelin/contracts@^4.7.1": + version "4.9.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" + integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== + +"@parcel/watcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== + dependencies: + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/utils@^2.3.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.1.tgz#adf291d0357834c410ce80af16e711b56c7b1cd3" + integrity sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w== + dependencies: + cross-spawn "^7.0.3" + fast-glob "^3.2.12" + is-glob "^4.0.3" + open "^9.1.0" + picocolors "^1.0.0" + tslib "^2.5.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" + integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== + dependencies: + "@noble/hashes" "~1.1.1" + "@noble/secp256k1" "~1.6.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.0.tgz#6c8d980ef3f290987736acd0ee2e0f0d50068d87" + integrity sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q== + dependencies: + "@noble/curves" "~1.0.0" + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" + integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== + dependencies: + "@noble/hashes" "~1.1.1" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.0.tgz#a207e2ef96de354de7d0002292ba1503538fc77b" + integrity sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sigstore/protobuf-specs@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" + integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== + +"@sinclair/typebox@^0.24.1": + version "0.24.28" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794" + integrity sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@solidity-parser/parser@^0.14.3": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" + integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@truffle/hdwallet-provider@^2.0.12": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-2.0.13.tgz#b7d9660985d7f32dc35dd5672c0156e3b9b39d32" + integrity sha512-5sGsi9sScB4VkKEuD6itqkrvtpJUNVv0NhI07Nn1JAMDvkJmAAuh2GtoBElDq54y+0JCD8SI0T9BLVZ9IWj6AQ== + dependencies: + "@ethereumjs/common" "^2.4.0" + "@ethereumjs/tx" "^3.3.0" + "@metamask/eth-sig-util" "4.0.1" + ethereum-cryptography "1.1.2" + ethereum-protocol "^1.0.1" + ethereumjs-util "^7.1.5" + ethereumjs-wallet "^1.0.2" + web3-provider-engine "16.0.3" + +"@trufflesuite/bigint-buffer@1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== + dependencies: + node-gyp-build "4.4.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + +"@types/babel__core@^7.1.14": + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.0.tgz#8134fd78cb39567465be65b9fdc16d378095f41f" + integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/benchmark@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@types/benchmark/-/benchmark-2.1.5.tgz#940c1850c18fdfdaee3fd6ed29cd92ae0d445b45" + integrity sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w== + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" + integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@^4.17.18": + version "4.17.30" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz#0f2f99617fa8f9696170c46152ccf7500b34ac04" + integrity sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest-when@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@types/jest-when/-/jest-when-3.5.2.tgz#7e6225e827267d26f115dc97da6403a3b37556c5" + integrity sha512-1WP+wJDW7h4TYAVLoIebxRIVv8GPk66Qsq2nU7PkwKZ6usurnDQZgk0DfBNKAJ9gVzapCXSV53Vn/3nBHBNzAw== + dependencies: + "@types/jest" "*" + +"@types/jest@*", "@types/jest@^28.1.6": + version "28.1.7" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.7.tgz#a680c5d05b69634c2d54a63cb106d7fb1adaba16" + integrity sha512-acDN4VHD40V24tgu0iC44jchXavRNVFXQ/E6Z5XNsswgoSO/4NgsXoEYmPUGookKldlZQyIpmrEXsHI9cA3ZTA== + dependencies: + expect "^28.0.0" + pretty-format "^28.0.0" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/minimatch@*", "@types/minimatch@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/morgan@^1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.3.tgz#ae04180dff02c437312bc0cfb1e2960086b2f540" + integrity sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "18.7.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.6.tgz#31743bc5772b6ac223845e18c3fc26f042713c83" + integrity sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A== + +"@types/node@^18.11.9": + version "18.16.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" + integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== + +"@types/serve-static@*": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/tough-cookie@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" + integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== + +"@types/webpack@^5.28.0": + version "5.28.0" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03" + integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w== + dependencies: + "@types/node" "*" + tapable "^2.2.0" + webpack "^5" + +"@types/ws@8.5.3": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" + integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.30.7": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz#c0a480d05211660221eda963cc844732fe9b1714" + integrity sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ== + dependencies: + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/type-utils" "5.33.1" + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.33.1.tgz#5fa908addffb82ea8fb0e62cb47c387de1bff536" + integrity sha512-wk2o+4wojvKz/x3UCbsgjgXl0lyLPYQsfKP0MdRzj4jtsQr4bVtgWUWck6+N3GzThUTbUFyyKLduWPwePhh0xQ== + dependencies: + "@typescript-eslint/utils" "5.33.1" + +"@typescript-eslint/parser@^5.30.7": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.33.1.tgz#e4b253105b4d2a4362cfaa4e184e2d226c440ff3" + integrity sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA== + dependencies: + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/typescript-estree" "5.33.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz#8d31553e1b874210018ca069b3d192c6d23bc493" + integrity sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + +"@typescript-eslint/type-utils@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz#1a14e94650a0ae39f6e3b77478baff002cec4367" + integrity sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g== + dependencies: + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.33.1.tgz#3faef41793d527a519e19ab2747c12d6f3741ff7" + integrity sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ== + +"@typescript-eslint/typescript-estree@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz#a573bd360790afdcba80844e962d8b2031984f34" + integrity sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.33.1", "@typescript-eslint/utils@^5.10.0": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.33.1.tgz#171725f924fe1fe82bb776522bb85bc034e88575" + integrity sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/typescript-estree" "5.33.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz#0155c7571c8cd08956580b880aea327d5c34a18b" + integrity sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg== + dependencies: + "@typescript-eslint/types" "5.33.1" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +"@yarnpkg/parsers@^3.0.0-rc.18": + version "3.0.0-rc.44" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.44.tgz#43bf7943c039681da8f343cc6d73c2ab3184978b" + integrity sha512-UVAt9Icc8zfGXioeYJ8XMoSTxOYVmlal2TRNxy9Uh91taS72kQFalK7LpIslcvEBKy4XtarmfIwcFIU3ZY64lw== + dependencies: + js-yaml "^3.10.0" + tslib "^2.4.0" + +"@zkochan/js-yaml@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" + integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== + dependencies: + argparse "^2.0.1" + +Base64@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz#ba3a4230708e186705065e66babdd4c35cf60028" + integrity sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw== + +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +abitype@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.7.1.tgz#16db20abe67de80f6183cf75f3de1ff86453b745" + integrity sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-level@1.0.3, abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== + dependencies: + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +abstract-leveldown@~2.6.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== + dependencies: + xtend "~4.0.0" + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +acorn@^8.1.0, acorn@^8.8.1: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@~6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-sequence-parser@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz#3ff397dc14f08b52dd8b2a64d3cee154ab8760d2" + integrity sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw== + dependencies: + delegates "^1.0.0" + readable-stream "^4.1.0" + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-includes@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +async-eventemitter@0.2.4, async-eventemitter@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-mutex@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== + dependencies: + tslib "^2.0.0" + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axios@^1.0.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" + integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.2" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe" + integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.2" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +backoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA== + dependencies: + precond "0.2" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +before-after-hook@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e" + integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ== + +benchmark@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + integrity sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ== + dependencies: + lodash "^4.17.4" + platform "^1.3.3" + +big-integer@^1.6.44: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +bigint-crypto-utils@^3.0.23: + version "3.1.7" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.7.tgz#c4c1b537c7c1ab7aadfaecf3edfd45416bf2c651" + integrity sha512-zpCQpIE2Oy5WIQpjC9iYZf8Uh9QqoS51ZCooAcNvzv1AQ3VWdT52D0ksr1+/faeK8HVIej1bxXcP75YcqH3KPA== + dependencies: + bigint-mod-arith "^3.1.0" + +bigint-mod-arith@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" + integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== + +bin-links@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.1.tgz#afeb0549e642f61ff889b58ea2f8dca78fb9d8d3" + integrity sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bluebird@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" + integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.21.3: + version "4.21.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" + integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== + dependencies: + caniuse-lite "^1.0.30001370" + electron-to-chromium "^1.4.202" + node-releases "^2.0.6" + update-browserslist-db "^1.0.5" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== + dependencies: + node-gyp-build "^4.3.0" + +bufferutil@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + dependencies: + node-gyp-build "^4.3.0" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + +byte-size@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.0.tgz#36528cd1ca87d39bd9abd51f5715dc93b6ceb032" + integrity sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^16.1.0: + version "16.1.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.2.tgz#a519519e9fc9e5e904575dcd3b77660cbf03f749" + integrity sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^1.1.1" + +cacache@^17.0.0, cacache@^17.0.4: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001370: + version "1.0.30001378" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz#3d2159bf5a8f9ca093275b0d3ecc717b00f27b67" + integrity sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA== + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +checkpoint-store@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" + integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg== + dependencies: + functional-red-black-tree "^1.0.1" + +chokidar@3.5.3, chokidar@^3.4.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== + +ci-info@^3.6.1: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classic-level@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" + integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-webpack-plugin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz#72947d4403d452f38ed61a9ff0ada8122aacd729" + integrity sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w== + dependencies: + del "^4.1.1" + +cli-cursor@3.1.0, cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-spinners@^2.5.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@4.0.1, clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +clone@^2.0.0, clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + +cmd-shim@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" + integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== + dependencies: + mkdirp-infer-owner "^2.0.0" + +cmd-shim@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +columnify@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== + dependencies: + strip-ansi "^6.0.1" + wcwidth "^1.0.0" + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^2.20.0, commander@^2.9.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-ancestor-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +concurrently@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.0.tgz#cdc9f621a4d913366600355d68254df2c5e782f3" + integrity sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA== + dependencies: + chalk "^4.1.2" + date-fns "^2.30.0" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + spawn-command "0.0.2" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + +config-chain@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +conventional-changelog-angular@5.0.12: + version "5.0.12" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-core@4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" + integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^5.0.0" + conventional-commits-parser "^3.2.0" + dateformat "^3.0.0" + get-pkg-repo "^4.0.0" + git-raw-commits "^2.0.8" + git-remote-origin-url "^2.0.0" + git-semver-tags "^4.1.1" + lodash "^4.17.15" + normalize-package-data "^3.0.0" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + through2 "^4.0.0" + +conventional-changelog-preset-loader@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" + integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== + +conventional-changelog-writer@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" + integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== + dependencies: + conventional-commits-filter "^2.0.7" + dateformat "^3.0.0" + handlebars "^4.7.7" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^8.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^4.0.0" + +conventional-commits-filter@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" + integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" + integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +conventional-recommended-bump@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" + integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== + dependencies: + concat-stream "^2.0.0" + conventional-changelog-preset-loader "^2.3.4" + conventional-commits-filter "^2.0.7" + conventional-commits-parser "^3.2.0" + git-raw-commits "^2.0.8" + git-semver-tags "^4.1.1" + meow "^8.0.0" + q "^1.5.1" + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +core-js-compat@^3.21.0: + version "3.24.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.24.1.tgz#d1af84a17e18dfdd401ee39da9996f9a7ba887de" + integrity sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw== + dependencies: + browserslist "^4.21.3" + semver "7.0.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +crc-32@^1.2.0, crc-32@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^2.1.0: + version "2.2.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" + integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== + dependencies: + node-fetch "^2.6.7" + whatwg-fetch "^2.0.4" + +cross-fetch@^3.0.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cypress-jest-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/cypress-jest-adapter/-/cypress-jest-adapter-0.1.1.tgz#d1aa9d84393b6a5007022d1d33b3cdd3ce9672af" + integrity sha512-5dSB03utqDTBG5pi1LaAvYQD5uSMtSwurSzodpM+3XS/RdrjR/644oPnFUxPRvX4FVBaIY8avRs/f/GmIAiu8w== + dependencies: + expect "^24.5.0" + jest-get-type "^24.3.0" + jest-jquery-matchers "^2.1.0" + jquery "^3.4.0" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +declaration-bundler-webpack-plugin@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/declaration-bundler-webpack-plugin/-/declaration-bundler-webpack-plugin-1.0.3.tgz#9fb5ae393c63ed4175e7b6de4b58bafde34f097a" + integrity sha512-bgeoSOZYTOOdiNUZd/U8K6Z+6IrM/X+DgUcm3/VI1l130lzOBeL+ObetjIkKksxcj0zUJbLaFRFumFGYDOQ9fg== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + +dedent@0.7.0, dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + dependencies: + clone "^1.0.2" + +deferred-leveldown@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== + dependencies: + abstract-leveldown "~2.6.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +del@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +dot-prop@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer@^0.1.1, duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.7: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.202: + version "1.4.222" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz#2ba24bef613fc1985dbffea85df8f62f2dec6448" + integrity sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg== + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emittery@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.1.0.tgz#d50e383743c0f7a5945c47087295afc112e3cf66" + integrity sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enhanced-resolve@^5.12.0: + version "5.14.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" + integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enquirer@^2.3.0, enquirer@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.7.3, envinfo@^7.7.4: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@~0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-import-resolver-typescript@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" + integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + get-tsconfig "^4.5.0" + globby "^13.1.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + synckit "^0.8.5" + +eslint-module-utils@^2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-deprecation@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.3.2.tgz#a8125d28c56158cdfa1a685197e6be8ed86f189e" + integrity sha512-z93wbx9w7H/E3ogPw6AZMkkNJ6m51fTZRNZPNQqxQLmx+KKt7aLkMU9wN67s71i+VVHN4tLOZ3zT3QLbnlC0Mg== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + tslib "^2.3.1" + tsutils "^3.21.0" + +eslint-plugin-header@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz#6ce512432d57675265fac47292b50d1eff11acd6" + integrity sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg== + +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^26.6.0: + version "26.8.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.8.3.tgz#f5d9bb162636491c8f6f0cd2743fe67c86569338" + integrity sha512-2roWu1MkEiihQ/qEszPPoaoqVI1x2D8Jtadk5AmoXTdEeNVPMu01Dtz7jIuTOAmdW3L+tSkPZOtEtQroYJDt0A== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-no-null@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-null/-/eslint-plugin-no-null-1.0.2.tgz#1236a812391390a1877ad4007c26e745341c951f" + integrity sha512-uRDiz88zCO/2rzGfgG15DBjNsgwWtWiSo4Ezy7zzajUgpnFIqd1TjepKeRmJZHEfBGu58o2a8S0D7vglvvhkVA== + +eslint-plugin-require-extensions@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/eslint-plugin-require-extensions/-/eslint-plugin-require-extensions-0.1.3.tgz#394aeab433f996797a6ceba0a3f75640d4846bc8" + integrity sha512-T3c1PZ9PIdI3hjV8LdunfYI8gj017UQjzAnCrxuo3wAjneDbTPHdE3oNWInOjMA+z/aBkUtlW5vC0YepYMZIug== + +eslint-plugin-tsdoc@^0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.16.tgz#a3d31fb9c7955faa3c66a43dd43da7635f1c5e0d" + integrity sha512-F/RWMnyDQuGlg82vQEFHQtGyWi7++XJKdYNn0ulIbyMOFqYIjoJOUdE6olORxgwgLkpJxsCJpJbTHgxJ/ggfXw== + dependencies: + "@microsoft/tsdoc" "0.14.1" + "@microsoft/tsdoc-config" "0.16.1" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.20.0: + version "8.22.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" + integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.3" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eth-block-tracker@^4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-filters@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" + integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + async-mutex "^0.2.6" + eth-json-rpc-middleware "^6.0.0" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" + +eth-json-rpc-infura@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6" + integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow== + dependencies: + eth-json-rpc-middleware "^6.0.0" + eth-rpc-errors "^3.0.0" + json-rpc-engine "^5.3.0" + node-fetch "^2.6.0" + +eth-json-rpc-middleware@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-util "^5.1.2" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA== + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw== + dependencies: + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" + +ethereum-common@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== + +ethereum-common@^0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ== + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@1.1.2, ethereum-cryptography@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" + integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== + dependencies: + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" + "@scure/bip32" "1.1.0" + "@scure/bip39" "1.1.0" + +ethereum-cryptography@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.0.0.tgz#e052b49fa81affae29402e977b8d3a31f88612b6" + integrity sha512-g25m4EtfQGjstWgVE1aIz7XYYjf3kH5kG17ULWVB5dH6uLahsoltOhACzSxyDV+fhn4gbR4xRrOXGe6r2uh4Bg== + dependencies: + "@noble/curves" "1.0.0" + "@noble/hashes" "1.3.0" + "@scure/bip32" "1.3.0" + "@scure/bip39" "1.2.0" + +ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +ethereum-protocol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz#b7d68142f4105e0ae7b5e178cf42f8d4dc4b93cf" + integrity sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg== + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== + dependencies: + ethereumjs-util "^5.0.0" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-block@^1.2.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== + dependencies: + async "^2.0.1" + ethereum-common "0.2.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-block@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== + dependencies: + async "^2.0.1" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.1" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== + +ethereumjs-tx@^1.2.2: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== + dependencies: + ethereum-common "^0.0.18" + ethereumjs-util "^5.0.0" + +ethereumjs-tx@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== + dependencies: + ethereumjs-common "^1.5.0" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-vm@^2.3.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + ethereumjs-account "^2.0.3" + ethereumjs-block "~2.2.0" + ethereumjs-common "^1.1.0" + ethereumjs-util "^6.0.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + +ethereumjs-wallet@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz#2c000504b4c71e8f3782dabe1113d192522e99b6" + integrity sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA== + dependencies: + aes-js "^3.1.2" + bs58check "^2.1.2" + ethereum-cryptography "^0.1.3" + ethereumjs-util "^7.1.2" + randombytes "^2.1.0" + scrypt-js "^3.0.1" + utf8 "^3.0.0" + uuid "^8.3.2" + +ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.0.0, events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.5.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +expect@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + +expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +express@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fake-merkle-patricia-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" + integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA== + dependencies: + checkpoint-store "^1.1.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.11, fast-glob@^3.2.12: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figures@3.2.0, figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-url@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/file-url/-/file-url-3.0.0.tgz#247a586a746ce9f7a8ed05560290968afc262a77" + integrity sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA== + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== + +flatted@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.0.0, follow-redirects@^1.12.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@9.1.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +ganache@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.5.0.tgz#f7a36050b6ff85e5557d6511ddca470a0a40f37c" + integrity sha512-afNTJYBEaFrLPRrn7eUxH39TgnrffvHn/4T6THzQrc3rpfe4DOxw2nY2XEQxfsq1t4OqKSXtxomzyo26RZiOzw== + dependencies: + "@trufflesuite/bigint-buffer" "1.1.10" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + emittery "0.10.0" + keccak "3.0.2" + leveldown "6.1.0" + secp256k1 "4.0.3" + optionalDependencies: + bufferutil "4.0.5" + utf-8-validate "5.0.7" + +ganache@^7.7.6: + version "7.7.7" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.7.7.tgz#19939a86799f0bcb7df02e88082944466394b913" + integrity sha512-kZUuOcgDQBtbxzs4iB3chg1iAc28s2ffdOdzyTTzo4vr9sb843w4PbWd5v1hsIqtcNjurcpLaW8XRp/cw2u++g== + dependencies: + "@trufflesuite/bigint-buffer" "1.1.10" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + abstract-level "1.0.3" + abstract-leveldown "7.2.0" + async-eventemitter "0.2.4" + emittery "0.10.0" + keccak "3.0.2" + leveldown "6.1.0" + secp256k1 "4.0.3" + optionalDependencies: + bufferutil "4.0.5" + utf-8-validate "5.0.7" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gauge@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" + integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^4.0.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-pkg-repo@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" + integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== + dependencies: + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" + through2 "^2.0.0" + yargs "^16.2.0" + +get-port@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + +get-stream@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.0.tgz#e977690993a42f3e320e932427502a40f7af6d05" + integrity sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg== + dependencies: + resolve-pkg-maps "^1.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +git-raw-commits@^2.0.8: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" + integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== + dependencies: + meow "^8.0.0" + semver "^6.0.0" + +git-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" + integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== + dependencies: + is-ssh "^1.4.0" + parse-url "^8.1.0" + +git-url-parse@13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" + integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== + dependencies: + git-up "^7.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== + dependencies: + ini "^1.3.2" + +glob-parent@5.1.2, glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^10.2.2: + version "10.2.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.6.tgz#1e27edbb3bbac055cb97113e27a066c100a4e5e1" + integrity sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2" + path-scurry "^1.7.0" + +glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.1: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + dependencies: + type-fest "^0.20.2" + +globby@11.1.0, globby@^11.0.1, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.3: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@4.2.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handlebars@^4.7.7: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +hardhat@^2.19.4: + version "2.19.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.4.tgz#5112c30295d8be2e18e55d847373c50483ed1902" + integrity sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@2.0.1, has-unicode@^2.0.0, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.1.0.tgz#9786123f92ef3627f24abc3f15c20d98ec4a6594" + integrity sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q== + dependencies: + lru-cache "^7.5.1" + +hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-browserify@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/http-browserify/-/http-browserify-1.7.0.tgz#33795ade72df88acfbfd36773cefeda764735b20" + integrity sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw== + dependencies: + Base64 "~0.2.0" + inherits "~2.0.1" + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3, iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" + integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== + dependencies: + minimatch "^5.0.1" + +ignore-walk@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== + dependencies: + minimatch "^9.0.0" + +ignore@^5.0.4, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immutable@^4.0.0-rc.12: + version "4.1.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +in3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/in3/-/in3-3.3.3.tgz#df3a850665b31ee0fbe540e5384ff3e13b56462b" + integrity sha512-cFGgzJcNS/hEJ9N19zo4gdzNdSPqEEGDkfmOI6IFA5gZIY2kUV9QGaczAayMmEbEq8/msrAycqQN03eHtwLUUA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.2, ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +init-package-json@3.0.2, init-package-json@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" + integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== + dependencies: + npm-package-arg "^9.0.1" + promzard "^0.3.0" + read "^1.0.7" + read-package-json "^5.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^4.0.0" + +inquirer@8.2.4, inquirer@^8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.1.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-ssh@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== + dependencies: + protocols "^2.0.1" + +is-stream@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== + dependencies: + text-extensions "^1.0.0" + +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4: + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-diff@^28.0.0, jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-extended@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jest-extended/-/jest-extended-3.0.2.tgz#f74ae82bdf280536552752b502f57f71e7d2fcf1" + integrity sha512-LnVZvwWLRV9AL8J7f4frKu0KHuTrbIFK15IqrvSwbFCYxalkuC5l7HfcofsksePrvlEJ2WAcfYNnu1+bEGvInA== + dependencies: + jest-diff "^28.0.0" + jest-get-type "^28.0.0" + +jest-fetch-mock@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" + integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw== + dependencies: + cross-fetch "^3.0.4" + promise-polyfill "^8.1.3" + +jest-get-type@^24.3.0, jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-get-type@^28.0.0, jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-jquery-matchers@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/jest-jquery-matchers/-/jest-jquery-matchers-2.1.1.tgz#74c174b60bd0be550d285bf3ae65ffc5e19a8d30" + integrity sha512-WoYq+ZGvs2AS9PA7gD/obXn82RtjpQva2VZwq7PDLFz+6uXD5x/KMbVdMgeISeNcYWoDhuv9uTwW8qTNIrhUNQ== + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-when@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jest-when/-/jest-when-3.5.1.tgz#33ab6f923661cf878cd08fe9df64b507934603db" + integrity sha512-o+HiaIVCg1IC95sMDKHU9G5v5N5l3UHqXvJpf0PgAMThZeQo4Hf5Sgoj+wpCBRGg4/KtzSAZZZEKNiLqE0i4eQ== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +jju@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== + +jquery@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" + integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== + +js-sdsl@^4.1.4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.10.0, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-parse-even-better-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + +json-rpc-engine@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== + dependencies: + eth-rpc-errors "^3.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-engine@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + eth-rpc-errors "^4.0.2" + +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + integrity sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg== + dependencies: + jsonify "~0.0.0" + +json-stringify-nice@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" + integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.2.0, jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA== + +jsonparse@^1.2.0, jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +just-diff-apply@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.4.1.tgz#1debed059ad009863b4db0e8d8f333d743cdd83b" + integrity sha512-AAV5Jw7tsniWwih8Ly3fXxEZ06y+6p5TwQMsw0dzZ/wPKilzyDgdAnL0Ug4NNIquPUOh1vfFWEHbmXUqM5+o8g== + +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== + +keccak@3.0.2, keccak@^3.0.0, keccak@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +lerna@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.6.2.tgz#ad921f913aca4e7307123a598768b6f15ca5804f" + integrity sha512-W4qrGhcdutkRdHEaDf9eqp7u4JvI+1TwFy5woX6OI8WPe4PYBdxuILAsvhp614fUG41rKSGDKlOh+AWzdSidTg== + dependencies: + "@lerna/child-process" "6.6.2" + "@lerna/create" "6.6.2" + "@lerna/legacy-package-management" "6.6.2" + "@npmcli/arborist" "6.2.3" + "@npmcli/run-script" "4.1.7" + "@nrwl/devkit" ">=15.5.2 < 16" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.3" + byte-size "7.0.0" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "5.0.0" + columnify "1.6.0" + config-chain "1.1.12" + conventional-changelog-angular "5.0.12" + conventional-changelog-core "4.2.4" + conventional-recommended-bump "6.1.0" + cosmiconfig "7.0.0" + dedent "0.7.0" + dot-prop "6.0.1" + envinfo "^7.7.4" + execa "5.0.0" + fs-extra "9.1.0" + get-port "5.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.10" + has-unicode "2.0.1" + import-local "^3.0.2" + init-package-json "3.0.2" + inquirer "^8.2.4" + is-ci "2.0.0" + is-stream "2.0.0" + js-yaml "^4.1.0" + libnpmaccess "^6.0.3" + libnpmpublish "7.1.4" + load-json-file "6.2.0" + make-dir "3.1.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "^14.0.3" + npmlog "^6.0.2" + nx ">=15.5.2 < 16" + p-map "4.0.0" + p-map-series "2.1.0" + p-pipe "3.1.0" + p-queue "6.6.2" + p-reduce "2.1.0" + p-waterfall "2.1.1" + pacote "15.1.1" + pify "5.0.0" + read-cmd-shim "3.0.0" + read-package-json "5.0.1" + resolve-from "5.0.0" + rimraf "^4.4.1" + semver "^7.3.8" + signal-exit "3.0.7" + slash "3.0.0" + ssri "9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + typescript "^3 || ^4" + upath "^2.0.1" + uuid "8.3.2" + validate-npm-package-license "3.0.4" + validate-npm-package-name "4.0.0" + write-file-atomic "4.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" + +level-codec@~7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== + +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== + dependencies: + catering "^2.1.0" + +level-errors@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== + dependencies: + errno "~0.1.1" + +level-errors@~1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw== + dependencies: + inherits "^2.0.1" + level-errors "^1.0.3" + readable-stream "^1.0.33" + xtend "^4.0.0" + +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +level-ws@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw== + dependencies: + readable-stream "~1.0.15" + xtend "~2.1.1" + +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== + dependencies: + browser-level "^1.0.1" + classic-level "^1.2.0" + +leveldown@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== + dependencies: + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + +levelup@^1.2.1: + version "1.3.9" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== + dependencies: + deferred-leveldown "~1.2.1" + level-codec "~7.0.0" + level-errors "~1.0.3" + level-iterator-stream "~1.3.0" + prr "~1.0.1" + semver "~5.4.1" + xtend "~4.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +libnpmaccess@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded" + integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg== + dependencies: + aproba "^2.0.0" + minipass "^3.1.1" + npm-package-arg "^9.0.1" + npm-registry-fetch "^13.0.0" + +libnpmpublish@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.1.4.tgz#a0d138e00e52a0c71ffc82273acf0082fc2dfb36" + integrity sha512-mMntrhVwut5prP4rJ228eEbEyvIzLWhqFuY90j5QeXBCTT2pWSMno7Yo2S2qplPUr02zPurGH4heGLZ+wORczg== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" + semver "^7.3.7" + sigstore "^1.4.0" + ssri "^10.0.1" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lines-and-columns@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + +load-json-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.14.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.0.tgz#21be64954a4680e303a09e9468f880b98a0b3c7f" + integrity sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ== + +lru-cache@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1" + integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A== + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +make-dir@3.1.0, make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memdown@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" + integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w== + dependencies: + abstract-leveldown "~2.7.1" + functional-red-black-tree "^1.0.1" + immediate "^3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.1.1" + +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" + integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== + dependencies: + async "^1.4.2" + ethereumjs-util "^5.0.0" + level-ws "0.0.0" + levelup "^1.2.1" + memdown "^1.0.0" + readable-stream "^2.0.0" + rlp "^2.0.0" + semaphore ">=1.0.1" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^6.1.6: + version "6.2.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" + integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" + integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.1.tgz#9b39c047cf10af9bfa6f3a4d25ed88444be27a4c" + integrity sha512-/kgtXVGS10PTFET6dAbOBWQtgH+iDiI4NhRqAftojRlsOJhk0y45sVVxqCaRQC+AMFH7JkHiWpuKJKQ+mojKiA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0, minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" + integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp-infer-owner@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" + integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== + dependencies: + chownr "^2.0.0" + infer-owner "^1.0.4" + mkdirp "^1.0.3" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" + integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multimatch@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + +mute-stream@0.0.8, mute-stream@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3, negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.0, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + +node-gyp@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.1.0.tgz#c8d8e590678ea1f7b8097511dedf41fc126648f8" + integrity sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +nopt@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.1.0.tgz#91f6a3366182176e72ecab93a09c19b63b485f28" + integrity sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q== + dependencies: + abbrev "^2.0.0" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0, "normalize-package-data@~1.0.1 || ^2.0.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.1.tgz#b46b24e0616d06cadf9d5718b29b6d445a82a62c" + integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== + dependencies: + hosted-git-info "^5.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-auth-to-token@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-auth-to-token/-/npm-auth-to-token-1.0.0.tgz#2567b34316b16e449c63dc0c9188d1f1cd11cf5e" + integrity sha512-rwf5Sb1P1/jZlYzwpTqT9BdYMaXRcMJ5ExPB7TdM0addBjAK7UbmHSfMwOeE/BVnpAoW9GQ/uDAywW2thbf0SA== + dependencies: + commander "^2.9.0" + npm-registry-client "^8.3.0" + +npm-bundled@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-install-checks@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.1.1.tgz#b459b621634d06546664207fde16810815808db1" + integrity sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-normalize-package-bin@^3.0.0, npm-normalize-package-bin@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" + integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== + dependencies: + hosted-git-info "^3.0.6" + semver "^7.0.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0": + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" + integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== + dependencies: + hosted-git-info "^2.7.1" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.0.tgz#a60e9f1e7c03e4e3e4e994ea87fff8b90b522987" + integrity sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw== + dependencies: + hosted-git-info "^5.0.0" + proc-log "^2.0.1" + semver "^7.3.5" + validate-npm-package-name "^4.0.0" + +npm-packlist@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" + integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== + dependencies: + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" + npm-normalize-package-bin "^1.0.1" + +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== + dependencies: + ignore-walk "^6.0.0" + +npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-registry-client@^8.3.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" + integrity sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg== + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + safe-buffer "^5.1.1" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + ssri "^5.2.4" + optionalDependencies: + npmlog "2 || ^3.1.0 || ^4.0.0" + +npm-registry-fetch@14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz#8545e321c2b36d2c6fe6e009e77e9f0e527f547b" + integrity sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^4.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-registry-fetch@^13.0.0: + version "13.3.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz#bb078b5fa6c52774116ae501ba1af2a33166af7e" + integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== + dependencies: + make-fetch-happen "^10.0.6" + minipass "^3.1.6" + minipass-fetch "^2.0.3" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^9.0.1" + proc-log "^2.0.0" + +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +"npmlog@2 || ^3.1.0 || ^4.0.0": + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +npmlog@6.0.2, npmlog@^6.0.0, npmlog@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +npmlog@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" + integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== + dependencies: + are-we-there-yet "^4.0.0" + console-control-strings "^1.1.0" + gauge "^5.0.0" + set-blocking "^2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +nx@15.9.4, "nx@>=15.5.2 < 16": + version "15.9.4" + resolved "https://registry.yarnpkg.com/nx/-/nx-15.9.4.tgz#1075bc33fe8ee6c6546c21ec6ffcfd2e000946c6" + integrity sha512-P1G4t59UvE/lkHyruLeSOB5ZuNyh01IwU0tTUOi8f9s/NbP7+OQ8MYVwDV74JHTr6mQgjlS+n+4Eox8tVm9itA== + dependencies: + "@nrwl/cli" "15.9.4" + "@nrwl/tao" "15.9.4" + "@parcel/watcher" "2.0.4" + "@yarnpkg/lockfile" "^1.1.0" + "@yarnpkg/parsers" "^3.0.0-rc.18" + "@zkochan/js-yaml" "0.0.6" + axios "^1.0.0" + chalk "^4.1.0" + cli-cursor "3.1.0" + cli-spinners "2.6.1" + cliui "^7.0.2" + dotenv "~10.0.0" + enquirer "~2.3.6" + fast-glob "3.2.7" + figures "3.2.0" + flat "^5.0.2" + fs-extra "^11.1.0" + glob "7.1.4" + ignore "^5.0.4" + js-yaml "4.1.0" + jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" + minimatch "3.0.5" + npm-run-path "^4.0.1" + open "^8.4.0" + semver "7.3.4" + string-width "^4.2.3" + strong-log-transformer "^2.1.0" + tar-stream "~2.2.0" + tmp "~0.2.1" + tsconfig-paths "^4.1.2" + tslib "^2.3.0" + v8-compile-cache "2.3.0" + yargs "^17.6.2" + yargs-parser "21.1.1" + optionalDependencies: + "@nrwl/nx-darwin-arm64" "15.9.4" + "@nrwl/nx-darwin-x64" "15.9.4" + "@nrwl/nx-linux-arm-gnueabihf" "15.9.4" + "@nrwl/nx-linux-arm64-gnu" "15.9.4" + "@nrwl/nx-linux-arm64-musl" "15.9.4" + "@nrwl/nx-linux-x64-gnu" "15.9.4" + "@nrwl/nx-linux-x64-musl" "15.9.4" + "@nrwl/nx-win32-arm64-msvc" "15.9.4" + "@nrwl/nx-win32-x64-msvc" "15.9.4" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.2: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +open@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== + dependencies: + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map-series@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== + +p-map@4.0.0, p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-pipe@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== + +p-queue@6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +p-waterfall@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== + dependencies: + p-reduce "^2.0.0" + +pacote@15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.1.tgz#94d8c6e0605e04d427610b3aacb0357073978348" + integrity sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^4.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.0.0" + ssri "^10.0.0" + tar "^6.1.11" + +pacote@^15.0.0, pacote@^15.0.8: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== + dependencies: + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" + just-diff-apply "^5.2.0" + +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-path@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" + integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== + dependencies: + protocols "^2.0.0" + +parse-url@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" + integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== + dependencies: + parse-path "^7.0.0" + +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.6.1, path-scurry@^1.7.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" + integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg== + dependencies: + lru-cache "^9.1.1" + minipass "^5.0.0 || ^6.0.2" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@5.0.0, pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +platform@^1.3.3: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-selector-parser@^6.0.10: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-plugin-solidity@^1.0.0-beta.20: + version "1.0.0-beta.24" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-beta.24.tgz#67573ca87098c14f7ccff3639ddd8a4cab2a87eb" + integrity sha512-6JlV5BBTWzmDSq4kZ9PTXc3eLOX7DF5HpbqmmaF+kloyUwOZbJ12hIYsUaZh2fVgZdV2t0vWcvY6qhILhlzgqg== + dependencies: + "@solidity-parser/parser" "^0.14.3" + emoji-regex "^10.1.0" + escape-string-regexp "^4.0.0" + semver "^7.3.7" + solidity-comments-extractor "^0.0.7" + string-width "^4.2.3" + +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +pretty-format@29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" + integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +proc-log@^2.0.0, proc-log@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" + integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-all-reject-late@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" + integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== + +promise-call-limit@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.1.tgz#4bdee03aeb85674385ca934da7114e9bcd3c6e24" + integrity sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-polyfill@^8.1.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.3.tgz#2edc7e4b81aff781c88a0d577e5fe9da822107c6" + integrity sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +promise-to-callback@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA== + dependencies: + is-fn "^1.0.0" + set-immediate-shim "^1.0.1" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== + dependencies: + read "1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +protocols@^2.0.0, protocols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +psl@^1.1.28, psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1, raw-body@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-is@^16.8.4: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +read-cmd-shim@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155" + integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog== + +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + +read-package-json-fast@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +read-package-json@5.0.1, read-package-json@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" + integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== + dependencies: + glob "^8.0.1" + json-parse-even-better-errors "^2.3.1" + normalize-package-data "^4.0.0" + npm-normalize-package-bin "^1.0.1" + +read-package-json@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.3.tgz#726116b75e00eac2075240995f05681af4ca7122" + integrity sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +read@1, read@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== + dependencies: + mute-stream "~0.0.4" + +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^1.0.33: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.0.tgz#55ce132d60a988c460d75c631e9ccf6a7229b468" + integrity sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + +readable-stream@~1.0.15: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +request@^2.74.0, request@^2.85.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@~1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.2.8, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== + dependencies: + glob "^9.2.0" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@^7.5.5: + version "7.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" + integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== + dependencies: + tslib "^2.1.0" + +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@4.0.3, secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semaphore@>=1.0.1, semaphore@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== + +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +semver@7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@~5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shiki@^0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" + integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== + dependencies: + ansi-sequence-parser "^1.1.0" + jsonc-parser "^3.2.0" + vscode-oniguruma "^1.7.0" + vscode-textmate "^8.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +sigstore@^1.0.0, sigstore@^1.3.0, sigstore@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.5.2.tgz#8d4c2a549341211cb08c687999843edc48c1a94c" + integrity sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + make-fetch-happen "^11.0.1" + tuf-js "^1.1.3" + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@3.0.0, slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slide@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" + integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +solc@^0.8.15: + version "0.8.16" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.16.tgz#120f992357e236d99e6cf3445bf2c2dca3384f96" + integrity sha512-6oZg7FAhIouj2zYLvoR3Q4fMP/+BGPR7sY7GcrEXKIp+DRd8RmpDEFO1LUBKpClUiaYguNgmthTFmnPl4MeiMQ== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + +solidity-comments-extractor@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" + integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== + dependencies: + is-plain-obj "^1.0.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.13, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-command@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@9.0.1, ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== + dependencies: + safe-buffer "^5.1.1" + +stack-utils@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +synckit@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-stream@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@6.1.11, tar@^6.1.11, tar@^6.1.2: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-1.0.0.tgz#4f192b3ee3328a2684d0e3fc5c491425395aab65" + integrity sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w== + dependencies: + del "^6.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terser-webpack-plugin@^5.1.3: + version "5.3.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz#f7d82286031f915a4f8fb81af4bd35d2e3c011bc" + integrity sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.14.1: + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + +ts-loader@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4" + integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^2.4.0, tslib@^2.5.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tuf-js@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.6.tgz#ad3e7a20237b83b51c2a8f9d1ddf093279a10fc2" + integrity sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.0" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typedoc-monorepo-link-types@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/typedoc-monorepo-link-types/-/typedoc-monorepo-link-types-0.0.4.tgz#d2875e5802a928738493f7d7e80265d547ef1970" + integrity sha512-fAxmfoJSp6cvT+I9/pN9pS2R8EoKUHaKU095E6H7FwN4tZUXPri5CZkxi9JLRlM5SV+pQwIlYnx9b+hnVP0nHA== + +typedoc-plugin-extras@^2.2.5: + version "2.3.0" + resolved "https://registry.yarnpkg.com/typedoc-plugin-extras/-/typedoc-plugin-extras-2.3.0.tgz#f2265256d6844d74ea40fe026d0a1b3d0277e9f5" + integrity sha512-XjzutqICAkSpl1vhyloYfd35mn0U6WwOQ7BttRkwGhmBQs/qFLz2K+AU0/lj2Cx4WY6AqVr4c/PzFbqI4fACqw== + +typedoc-plugin-markdown@^3.17.0: + version "3.17.1" + resolved "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz#c33f42363c185adf842f4699166015f7fe0ed02b" + integrity sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw== + dependencies: + handlebars "^4.7.7" + +typedoc-plugin-mdn-links@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/typedoc-plugin-mdn-links/-/typedoc-plugin-mdn-links-2.0.0.tgz#b43893bc7bdbb94927091f66d465f31e8440ad6c" + integrity sha512-IGLuelXPOenGdmklr5DHgPPf/MfZj7aEYCxCMtPN8C1D0lA7w0YLahd0jhDDcOMU7zL1EPcM5pPnhZHltDhqGQ== + +typedoc-plugin-merge-modules@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/typedoc-plugin-merge-modules/-/typedoc-plugin-merge-modules-5.1.0.tgz#53ac37f4ab40caac8ee23da1e26042d3a103c4a8" + integrity sha512-jXH27L/wlxFjErgBXleh3opVgjVTXFEuBo68Yfl18S9Oh/IqxK6NV94jlEJ9hl4TXc9Zm2l7Rfk41CEkcCyvFQ== + +typedoc@^0.25.6: + version "0.25.6" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.6.tgz#1505538aecea511dd669652c71d042a2427bd4fc" + integrity sha512-1rdionQMpOkpA58qfym1J+YD+ukyA1IEIa4VZahQI2ZORez7dhOvEyUotQL/8rSoMBopdzOS+vAIsORpQO4cTA== + dependencies: + lunr "^2.3.9" + marked "^4.3.0" + minimatch "^9.0.3" + shiki "^0.14.7" + +"typescript@^3 || ^4": + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +uglify-js@^3.1.4: + version "3.17.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.0.tgz#55bd6e9d19ce5eef0d5ad17cd1f587d85b180a85" + integrity sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici@^5.14.0: + version "5.28.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" + integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== + dependencies: + "@fastify/busboy" "^2.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +upath@2.0.1, upath@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + +update-browserslist-db@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +utf-8-validate@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== + dependencies: + node-gyp-build "^4.3.0" + +utf-8-validate@^5.0.9: + version "5.0.9" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" + integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== + dependencies: + node-gyp-build "^4.3.0" + +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@8.3.2, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@4.0.0, validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== + dependencies: + builtins "^1.0.3" + +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vscode-oniguruma@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== + +vscode-textmate@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walk-up-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" + integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wcwidth@^1.0.0, wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-hardhat-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/web3-hardhat-plugin/-/web3-hardhat-plugin-1.0.0.tgz#f12862e1666fce56d9714da184d0ccc208cac80d" + integrity sha512-XEiusGIXMAAPXgNYmNJ9VhXJiiDhIubjLEAoiOwwoEu+ifNIKu+ppLZJAVlHy/lbjYk5iF7mXrDajYcZ3bSbxQ== + dependencies: + typescript "^5.3.3" + web3 "^4.3.0" + +web3-provider-engine@16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz#8ff93edf3a8da2f70d7f85c5116028c06a0d9f07" + integrity sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA== + dependencies: + "@ethereumjs/tx" "^3.3.0" + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-filters "^4.2.1" + eth-json-rpc-infura "^5.1.0" + eth-json-rpc-middleware "^6.0.0" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +webpack-bundle-analyzer@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz#33c1c485a7fcae8627c547b5c3328b46de733c66" + integrity sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-cli@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5, webpack@^5.73.0: + version "5.76.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" + integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-fetch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0, wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-file-atomic@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + +write-json-file@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" + integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.15" + make-dir "^2.1.0" + pify "^4.0.1" + sort-keys "^2.0.0" + write-file-atomic "^2.4.2" + +write-pkg@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== + dependencies: + sort-keys "^2.0.0" + type-fest "^0.4.1" + write-json-file "^3.2.0" + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@^5.1.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + +ws@^7.3.1, ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.11.0: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + +ws@^8.8.1: + version "8.8.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" + integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== + +xhr@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ== + dependencies: + object-keys "~0.4.0" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@21.1.1, yargs-parser@^21.0.0, yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.5.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yargs@^17.6.2, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.21.4: + version "3.22.3" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.3.tgz#2fbc96118b174290d94e8896371c95629e87a060" + integrity sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==